/ Hex Artifact Content
Login

Artifact f438fea899d15d13ff3e3133242b9e378c37b5a3d76add8c342c68bdd65c6819:


0000: 2f 2a 0a 2a 2a 20 32 30 31 34 20 41 75 67 75 73  /*.** 2014 Augus
0010: 74 20 33 30 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  t 30.**.** The a
0020: 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20  uthor disclaims 
0030: 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74 68 69  copyright to thi
0040: 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20  s source code.  
0050: 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61  In place of.** a
0060: 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68   legal notice, h
0070: 65 72 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e  ere is a blessin
0080: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20  g:.**.**    May 
0090: 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20  you do good and 
00a0: 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20  not evil..**    
00b0: 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72  May you find for
00c0: 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75  giveness for you
00d0: 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76  rself and forgiv
00e0: 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20  e others..**    
00f0: 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20 66 72  May you share fr
0100: 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69  eely, never taki
0110: 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75  ng more than you
0120: 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a   give..**.******
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 56 45  ***.**.**.** OVE
0180: 52 56 49 45 57 20 0a 2a 2a 0a 2a 2a 20 20 54 68  RVIEW .**.**  Th
0190: 65 20 52 42 55 20 65 78 74 65 6e 73 69 6f 6e 20  e RBU extension 
01a0: 72 65 71 75 69 72 65 73 20 74 68 61 74 20 74 68  requires that th
01b0: 65 20 52 42 55 20 75 70 64 61 74 65 20 62 65 20  e RBU update be 
01c0: 70 61 63 6b 61 67 65 64 20 61 73 20 61 6e 0a 2a  packaged as an.*
01d0: 2a 20 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  *  SQLite databa
01e0: 73 65 2e 20 54 68 65 20 74 61 62 6c 65 73 20 69  se. The tables i
01f0: 74 20 65 78 70 65 63 74 73 20 74 6f 20 66 69 6e  t expects to fin
0200: 64 20 61 72 65 20 64 65 73 63 72 69 62 65 64 20  d are described 
0210: 69 6e 0a 2a 2a 20 20 73 71 6c 69 74 65 33 72 62  in.**  sqlite3rb
0220: 75 2e 68 2e 20 20 45 73 73 65 6e 74 69 61 6c 6c  u.h.  Essentiall
0230: 79 2c 20 66 6f 72 20 65 61 63 68 20 74 61 62 6c  y, for each tabl
0240: 65 20 78 79 7a 20 69 6e 20 74 68 65 20 74 61 72  e xyz in the tar
0250: 67 65 74 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  get database.** 
0260: 20 74 68 61 74 20 74 68 65 20 75 73 65 72 20 77   that the user w
0270: 69 73 68 65 73 20 74 6f 20 77 72 69 74 65 20 74  ishes to write t
0280: 6f 2c 20 61 20 63 6f 72 72 65 73 70 6f 6e 64 69  o, a correspondi
0290: 6e 67 20 64 61 74 61 5f 78 79 7a 20 74 61 62 6c  ng data_xyz tabl
02a0: 65 20 69 73 0a 2a 2a 20 20 63 72 65 61 74 65 64  e is.**  created
02b0: 20 69 6e 20 74 68 65 20 52 42 55 20 64 61 74 61   in the RBU data
02c0: 62 61 73 65 20 61 6e 64 20 70 6f 70 75 6c 61 74  base and populat
02d0: 65 64 20 77 69 74 68 20 6f 6e 65 20 72 6f 77 20  ed with one row 
02e0: 66 6f 72 20 65 61 63 68 20 72 6f 77 20 74 6f 0a  for each row to.
02f0: 2a 2a 20 20 75 70 64 61 74 65 2c 20 69 6e 73 65  **  update, inse
0300: 72 74 20 6f 72 20 64 65 6c 65 74 65 20 66 72 6f  rt or delete fro
0310: 6d 20 74 68 65 20 74 61 72 67 65 74 20 74 61 62  m the target tab
0320: 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 20 54 68 65 20  le..** .**  The 
0330: 75 70 64 61 74 65 20 70 72 6f 63 65 65 64 73 20  update proceeds 
0340: 69 6e 20 74 68 72 65 65 20 73 74 61 67 65 73 3a  in three stages:
0350: 0a 2a 2a 20 0a 2a 2a 20 20 31 29 20 54 68 65 20  .** .**  1) The 
0360: 64 61 74 61 62 61 73 65 20 69 73 20 75 70 64 61  database is upda
0370: 74 65 64 2e 20 54 68 65 20 6d 6f 64 69 66 69 65  ted. The modifie
0380: 64 20 64 61 74 61 62 61 73 65 20 70 61 67 65 73  d database pages
0390: 20 61 72 65 20 77 72 69 74 74 65 6e 0a 2a 2a 20   are written.** 
03a0: 20 20 20 20 74 6f 20 61 20 2a 2d 6f 61 6c 20 66      to a *-oal f
03b0: 69 6c 65 2e 20 41 20 2a 2d 6f 61 6c 20 66 69 6c  ile. A *-oal fil
03c0: 65 20 69 73 20 6a 75 73 74 20 6c 69 6b 65 20 61  e is just like a
03d0: 20 2a 2d 77 61 6c 20 66 69 6c 65 2c 20 65 78 63   *-wal file, exc
03e0: 65 70 74 0a 2a 2a 20 20 20 20 20 74 68 61 74 20  ept.**     that 
03f0: 69 74 20 69 73 20 6e 61 6d 65 64 20 22 3c 64 61  it is named "<da
0400: 74 61 62 61 73 65 3e 2d 6f 61 6c 22 20 69 6e 73  tabase>-oal" ins
0410: 74 65 61 64 20 6f 66 20 22 3c 64 61 74 61 62 61  tead of "<databa
0420: 73 65 3e 2d 77 61 6c 22 2e 0a 2a 2a 20 20 20 20  se>-wal"..**    
0430: 20 42 65 63 61 75 73 65 20 72 65 67 75 6c 61 72   Because regular
0440: 20 53 51 4c 69 74 65 20 63 6c 69 65 6e 74 73 20   SQLite clients 
0450: 64 6f 20 6e 6f 74 20 6c 6f 6f 6b 20 66 6f 72 20  do not look for 
0460: 66 69 6c 65 20 6e 61 6d 65 64 0a 2a 2a 20 20 20  file named.**   
0470: 20 20 22 3c 64 61 74 61 62 61 73 65 3e 2d 6f 61    "<database>-oa
0480: 6c 22 2c 20 74 68 65 79 20 67 6f 20 6f 6e 20 75  l", they go on u
0490: 73 69 6e 67 20 74 68 65 20 6f 72 69 67 69 6e 61  sing the origina
04a0: 6c 20 64 61 74 61 62 61 73 65 20 69 6e 0a 2a 2a  l database in.**
04b0: 20 20 20 20 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f       rollback mo
04c0: 64 65 20 77 68 69 6c 65 20 74 68 65 20 2a 2d 6f  de while the *-o
04d0: 61 6c 20 66 69 6c 65 20 69 73 20 62 65 69 6e 67  al file is being
04e0: 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2a 20 0a   generated..** .
04f0: 2a 2a 20 20 20 20 20 44 75 72 69 6e 67 20 74 68  **     During th
0500: 69 73 20 73 74 61 67 65 20 52 42 55 20 64 6f 65  is stage RBU doe
0510: 73 20 6e 6f 74 20 75 70 64 61 74 65 20 74 68 65  s not update the
0520: 20 64 61 74 61 62 61 73 65 20 62 79 20 77 72 69   database by wri
0530: 74 69 6e 67 0a 2a 2a 20 20 20 20 20 64 69 72 65  ting.**     dire
0540: 63 74 6c 79 20 74 6f 20 74 68 65 20 74 61 72 67  ctly to the targ
0550: 65 74 20 74 61 62 6c 65 73 2e 20 49 6e 73 74 65  et tables. Inste
0560: 61 64 20 69 74 20 63 72 65 61 74 65 73 20 22 69  ad it creates "i
0570: 6d 70 6f 73 74 65 72 22 0a 2a 2a 20 20 20 20 20  mposter".**     
0580: 74 61 62 6c 65 73 20 75 73 69 6e 67 20 74 68 65  tables using the
0590: 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
05a0: 5f 49 4d 50 4f 53 54 45 52 20 69 6e 74 65 72 66  _IMPOSTER interf
05b0: 61 63 65 20 74 68 61 74 20 69 74 20 75 73 65 73  ace that it uses
05c0: 0a 2a 2a 20 20 20 20 20 74 6f 20 75 70 64 61 74  .**     to updat
05d0: 65 20 65 61 63 68 20 62 2d 74 72 65 65 20 69 6e  e each b-tree in
05e0: 64 69 76 69 64 75 61 6c 6c 79 2e 20 41 6c 6c 20  dividually. All 
05f0: 75 70 64 61 74 65 73 20 72 65 71 75 69 72 65 64  updates required
0600: 20 62 79 20 65 61 63 68 0a 2a 2a 20 20 20 20 20   by each.**     
0610: 62 2d 74 72 65 65 20 61 72 65 20 63 6f 6d 70 6c  b-tree are compl
0620: 65 74 65 64 20 62 65 66 6f 72 65 20 6d 6f 76 69  eted before movi
0630: 6e 67 20 6f 6e 20 74 6f 20 74 68 65 20 6e 65 78  ng on to the nex
0640: 74 2c 20 61 6e 64 20 61 6c 6c 0a 2a 2a 20 20 20  t, and all.**   
0650: 20 20 75 70 64 61 74 65 73 20 61 72 65 20 64 6f    updates are do
0660: 6e 65 20 69 6e 20 73 6f 72 74 65 64 20 6b 65 79  ne in sorted key
0670: 20 6f 72 64 65 72 2e 0a 2a 2a 20 0a 2a 2a 20 20   order..** .**  
0680: 32 29 20 54 68 65 20 22 3c 64 61 74 61 62 61 73  2) The "<databas
0690: 65 3e 2d 6f 61 6c 22 20 66 69 6c 65 20 69 73 20  e>-oal" file is 
06a0: 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 65 71 75  moved to the equ
06b0: 69 76 61 6c 65 6e 74 20 22 3c 64 61 74 61 62 61  ivalent "<databa
06c0: 73 65 3e 2d 77 61 6c 22 0a 2a 2a 20 20 20 20 20  se>-wal".**     
06d0: 6c 6f 63 61 74 69 6f 6e 20 75 73 69 6e 67 20 61  location using a
06e0: 20 63 61 6c 6c 20 74 6f 20 72 65 6e 61 6d 65 28   call to rename(
06f0: 32 29 2e 20 42 65 66 6f 72 65 20 64 6f 69 6e 67  2). Before doing
0700: 20 74 68 69 73 20 74 68 65 20 52 42 55 0a 2a 2a   this the RBU.**
0710: 20 20 20 20 20 6d 6f 64 75 6c 65 20 74 61 6b 65       module take
0720: 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  s an EXCLUSIVE l
0730: 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
0740: 61 73 65 20 66 69 6c 65 2c 20 65 6e 73 75 72 69  ase file, ensuri
0750: 6e 67 0a 2a 2a 20 20 20 20 20 74 68 61 74 20 74  ng.**     that t
0760: 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 74 68 65  here are no othe
0770: 72 20 61 63 74 69 76 65 20 72 65 61 64 65 72 73  r active readers
0780: 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 4f 6e 63  ..** .**     Onc
0790: 65 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 20  e the EXCLUSIVE 
07a0: 6c 6f 63 6b 20 69 73 20 72 65 6c 65 61 73 65 64  lock is released
07b0: 2c 20 61 6e 79 20 6f 74 68 65 72 20 64 61 74 61  , any other data
07c0: 62 61 73 65 20 72 65 61 64 65 72 73 0a 2a 2a 20  base readers.** 
07d0: 20 20 20 20 64 65 74 65 63 74 20 74 68 65 20 6e      detect the n
07e0: 65 77 20 2a 2d 77 61 6c 20 66 69 6c 65 20 61 6e  ew *-wal file an
07f0: 64 20 72 65 61 64 20 74 68 65 20 64 61 74 61 62  d read the datab
0800: 61 73 65 20 69 6e 20 77 61 6c 20 6d 6f 64 65 2e  ase in wal mode.
0810: 20 41 74 0a 2a 2a 20 20 20 20 20 74 68 69 73 20   At.**     this 
0820: 70 6f 69 6e 74 20 74 68 65 79 20 73 65 65 20 74  point they see t
0830: 68 65 20 6e 65 77 20 76 65 72 73 69 6f 6e 20 6f  he new version o
0840: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2d  f the database -
0850: 20 69 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20 20 20   including.**   
0860: 20 20 74 68 65 20 75 70 64 61 74 65 73 20 6d 61    the updates ma
0870: 64 65 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  de as part of th
0880: 65 20 52 42 55 20 75 70 64 61 74 65 2e 0a 2a 2a  e RBU update..**
0890: 20 0a 2a 2a 20 20 33 29 20 54 68 65 20 6e 65 77   .**  3) The new
08a0: 20 2a 2d 77 61 6c 20 66 69 6c 65 20 69 73 20 63   *-wal file is c
08b0: 68 65 63 6b 70 6f 69 6e 74 65 64 2e 20 54 68 69  heckpointed. Thi
08c0: 73 20 70 72 6f 63 65 65 64 73 20 69 6e 20 74 68  s proceeds in th
08d0: 65 20 73 61 6d 65 20 77 61 79 20 0a 2a 2a 20 20  e same way .**  
08e0: 20 20 20 61 73 20 61 20 72 65 67 75 6c 61 72 20     as a regular 
08f0: 64 61 74 61 62 61 73 65 20 63 68 65 63 6b 70 6f  database checkpo
0900: 69 6e 74 2c 20 65 78 63 65 70 74 20 74 68 61 74  int, except that
0910: 20 61 20 73 69 6e 67 6c 65 20 66 72 61 6d 65 20   a single frame 
0920: 69 73 0a 2a 2a 20 20 20 20 20 63 68 65 63 6b 70  is.**     checkp
0930: 6f 69 6e 74 65 64 20 65 61 63 68 20 74 69 6d 65  ointed each time
0940: 20 73 71 6c 69 74 65 33 72 62 75 5f 73 74 65 70   sqlite3rbu_step
0950: 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 20 49 66  () is called. If
0960: 20 74 68 65 20 52 42 55 0a 2a 2a 20 20 20 20 20   the RBU.**     
0970: 68 61 6e 64 6c 65 20 69 73 20 63 6c 6f 73 65 64  handle is closed
0980: 20 62 65 66 6f 72 65 20 74 68 65 20 65 6e 74 69   before the enti
0990: 72 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 69 73  re *-wal file is
09a0: 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 2c 0a 2a   checkpointed,.*
09b0: 2a 20 20 20 20 20 74 68 65 20 63 68 65 63 6b 70  *     the checkp
09c0: 6f 69 6e 74 20 70 72 6f 67 72 65 73 73 20 69 73  oint progress is
09d0: 20 73 61 76 65 64 20 69 6e 20 74 68 65 20 52 42   saved in the RB
09e0: 55 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74  U database and t
09f0: 68 65 0a 2a 2a 20 20 20 20 20 63 68 65 63 6b 70  he.**     checkp
0a00: 6f 69 6e 74 20 63 61 6e 20 62 65 20 72 65 73 75  oint can be resu
0a10: 6d 65 64 20 62 79 20 61 6e 6f 74 68 65 72 20 52  med by another R
0a20: 42 55 20 63 6c 69 65 6e 74 20 61 74 20 73 6f 6d  BU client at som
0a30: 65 20 70 6f 69 6e 74 20 69 6e 0a 2a 2a 20 20 20  e point in.**   
0a40: 20 20 74 68 65 20 66 75 74 75 72 65 2e 0a 2a 2a    the future..**
0a50: 0a 2a 2a 20 50 4f 54 45 4e 54 49 41 4c 20 50 52  .** POTENTIAL PR
0a60: 4f 42 4c 45 4d 53 0a 2a 2a 20 0a 2a 2a 20 20 54  OBLEMS.** .**  T
0a70: 68 65 20 72 65 6e 61 6d 65 28 29 20 63 61 6c 6c  he rename() call
0a80: 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 70 6f   might not be po
0a90: 72 74 61 62 6c 65 2e 20 41 6e 64 20 52 42 55 20  rtable. And RBU 
0aa0: 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  is not currently
0ab0: 0a 2a 2a 20 20 73 79 6e 63 69 6e 67 20 74 68 65  .**  syncing the
0ac0: 20 64 69 72 65 63 74 6f 72 79 20 61 66 74 65 72   directory after
0ad0: 20 72 65 6e 61 6d 69 6e 67 20 74 68 65 20 66 69   renaming the fi
0ae0: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 57 68 65 6e 20  le..**.**  When 
0af0: 73 74 61 74 65 20 69 73 20 73 61 76 65 64 2c 20  state is saved, 
0b00: 61 6e 79 20 63 6f 6d 6d 69 74 20 74 6f 20 74 68  any commit to th
0b10: 65 20 2a 2d 6f 61 6c 20 66 69 6c 65 20 61 6e 64  e *-oal file and
0b20: 20 74 68 65 20 63 6f 6d 6d 69 74 20 74 6f 0a 2a   the commit to.*
0b30: 2a 20 20 74 68 65 20 52 42 55 20 75 70 64 61 74  *  the RBU updat
0b40: 65 20 64 61 74 61 62 61 73 65 20 61 72 65 20 6e  e database are n
0b50: 6f 74 20 61 74 6f 6d 69 63 2e 20 53 6f 20 69 66  ot atomic. So if
0b60: 20 74 68 65 20 70 6f 77 65 72 20 66 61 69 6c 73   the power fails
0b70: 20 61 74 20 74 68 65 0a 2a 2a 20 20 77 72 6f 6e   at the.**  wron
0b80: 67 20 6d 6f 6d 65 6e 74 20 74 68 65 79 20 6d 69  g moment they mi
0b90: 67 68 74 20 67 65 74 20 6f 75 74 20 6f 66 20 73  ght get out of s
0ba0: 79 6e 63 2e 20 41 73 20 74 68 65 20 6d 61 69 6e  ync. As the main
0bb0: 20 64 61 74 61 62 61 73 65 20 77 69 6c 6c 20 62   database will b
0bc0: 65 0a 2a 2a 20 20 63 6f 6d 6d 69 74 74 65 64 20  e.**  committed 
0bd0: 62 65 66 6f 72 65 20 74 68 65 20 52 42 55 20 75  before the RBU u
0be0: 70 64 61 74 65 20 64 61 74 61 62 61 73 65 20 74  pdate database t
0bf0: 68 69 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20  his will likely 
0c00: 65 69 74 68 65 72 20 6a 75 73 74 0a 2a 2a 20 20  either just.**  
0c10: 70 61 73 73 20 75 6e 6e 6f 74 69 63 65 64 2c 20  pass unnoticed, 
0c20: 6f 72 20 72 65 73 75 6c 74 20 69 6e 20 53 51 4c  or result in SQL
0c30: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 65  ITE_CONSTRAINT e
0c40: 72 72 6f 72 73 20 28 64 75 65 20 74 6f 20 55 4e  rrors (due to UN
0c50: 49 51 55 45 0a 2a 2a 20 20 63 6f 6e 73 74 72 61  IQUE.**  constra
0c60: 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 73 29 2e  int violations).
0c70: 0a 2a 2a 0a 2a 2a 20 20 49 66 20 73 6f 6d 65 20  .**.**  If some 
0c80: 63 6c 69 65 6e 74 20 64 6f 65 73 20 6d 6f 64 69  client does modi
0c90: 66 79 20 74 68 65 20 74 61 72 67 65 74 20 64 61  fy the target da
0ca0: 74 61 62 61 73 65 20 6d 69 64 20 52 42 55 20 75  tabase mid RBU u
0cb0: 70 64 61 74 65 2c 20 6f 72 20 73 6f 6d 65 0a 2a  pdate, or some.*
0cc0: 2a 20 20 6f 74 68 65 72 20 65 72 72 6f 72 20 6f  *  other error o
0cd0: 63 63 75 72 73 2c 20 74 68 65 20 52 42 55 20 65  ccurs, the RBU e
0ce0: 78 74 65 6e 73 69 6f 6e 20 77 69 6c 6c 20 6b 65  xtension will ke
0cf0: 65 70 20 74 68 72 6f 77 69 6e 67 20 65 72 72 6f  ep throwing erro
0d00: 72 73 2e 20 49 74 27 73 0a 2a 2a 20 20 6e 6f 74  rs. It's.**  not
0d10: 20 72 65 61 6c 6c 79 20 63 6c 65 61 72 20 68 6f   really clear ho
0d20: 77 20 74 6f 20 67 65 74 20 6f 75 74 20 6f 66 20  w to get out of 
0d30: 74 68 69 73 20 73 74 61 74 65 2e 20 54 68 65 20  this state. The 
0d40: 73 79 73 74 65 6d 20 63 6f 75 6c 64 20 6a 75 73  system could jus
0d50: 74 0a 2a 2a 20 20 62 79 20 64 65 6c 65 74 65 20  t.**  by delete 
0d60: 74 68 65 20 52 42 55 20 75 70 64 61 74 65 20 64  the RBU update d
0d70: 61 74 61 62 61 73 65 20 61 6e 64 20 2a 2d 6f 61  atabase and *-oa
0d80: 6c 20 66 69 6c 65 20 61 6e 64 20 68 61 76 65 20  l file and have 
0d90: 74 68 65 20 64 65 76 69 63 65 0a 2a 2a 20 20 64  the device.**  d
0da0: 6f 77 6e 6c 6f 61 64 20 74 68 65 20 75 70 64 61  ownload the upda
0db0: 74 65 20 61 67 61 69 6e 20 61 6e 64 20 73 74 61  te again and sta
0dc0: 72 74 20 6f 76 65 72 2e 0a 2a 2a 0a 2a 2a 20 20  rt over..**.**  
0dd0: 41 74 20 70 72 65 73 65 6e 74 2c 20 66 6f 72 20  At present, for 
0de0: 61 6e 20 55 50 44 41 54 45 2c 20 62 6f 74 68 20  an UPDATE, both 
0df0: 74 68 65 20 6e 65 77 2e 2a 20 61 6e 64 20 6f 6c  the new.* and ol
0e00: 64 2e 2a 20 72 65 63 6f 72 64 73 20 61 72 65 0a  d.* records are.
0e10: 2a 2a 20 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e  **  collected in
0e20: 20 74 68 65 20 72 62 75 5f 78 79 7a 20 74 61 62   the rbu_xyz tab
0e30: 6c 65 2e 20 41 6e 64 20 66 6f 72 20 62 6f 74 68  le. And for both
0e40: 20 55 50 44 41 54 45 73 20 61 6e 64 20 44 45 4c   UPDATEs and DEL
0e50: 45 54 45 73 20 61 6c 6c 0a 2a 2a 20 20 66 69 65  ETEs all.**  fie
0e60: 6c 64 73 20 61 72 65 20 63 6f 6c 6c 65 63 74 65  lds are collecte
0e70: 64 2e 20 20 54 68 69 73 20 6d 65 61 6e 73 20 77  d.  This means w
0e80: 65 27 72 65 20 70 72 6f 62 61 62 6c 79 20 77 72  e're probably wr
0e90: 69 74 69 6e 67 20 61 20 6c 6f 74 20 6d 6f 72 65  iting a lot more
0ea0: 0a 2a 2a 20 20 64 61 74 61 20 74 6f 20 64 69 73  .**  data to dis
0eb0: 6b 20 77 68 65 6e 20 73 61 76 69 6e 67 20 74 68  k when saving th
0ec0: 65 20 73 74 61 74 65 20 6f 66 20 61 6e 20 6f 6e  e state of an on
0ed0: 67 6f 69 6e 67 20 75 70 64 61 74 65 20 74 6f 20  going update to 
0ee0: 74 68 65 20 52 42 55 0a 2a 2a 20 20 75 70 64 61  the RBU.**  upda
0ef0: 74 65 20 64 61 74 61 62 61 73 65 20 74 68 61 6e  te database than
0f00: 20 69 73 20 73 74 72 69 63 74 6c 79 20 6e 65 63   is strictly nec
0f10: 65 73 73 61 72 79 2e 0a 2a 2a 20 0a 2a 2f 0a 0a  essary..** .*/..
0f20: 23 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74  #include <assert
0f30: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74  .h>.#include <st
0f40: 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  ring.h>.#include
0f50: 20 3c 73 74 64 69 6f 2e 68 3e 0a 0a 23 69 6e 63   <stdio.h>..#inc
0f60: 6c 75 64 65 20 22 73 71 6c 69 74 65 33 2e 68 22  lude "sqlite3.h"
0f70: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
0f80: 51 4c 49 54 45 5f 43 4f 52 45 29 20 7c 7c 20 64  QLITE_CORE) || d
0f90: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
0fa0: 41 42 4c 45 5f 52 42 55 29 0a 23 69 6e 63 6c 75  ABLE_RBU).#inclu
0fb0: 64 65 20 22 73 71 6c 69 74 65 33 72 62 75 2e 68  de "sqlite3rbu.h
0fc0: 22 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  "..#if defined(_
0fd0: 57 49 4e 33 32 5f 57 43 45 29 0a 23 69 6e 63 6c  WIN32_WCE).#incl
0fe0: 75 64 65 20 22 77 69 6e 64 6f 77 73 2e 68 22 0a  ude "windows.h".
0ff0: 23 65 6e 64 69 66 0a 0a 2f 2a 20 4d 61 78 69 6d  #endif../* Maxim
1000: 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 70 72 65  um number of pre
1010: 70 61 72 65 64 20 55 50 44 41 54 45 20 73 74 61  pared UPDATE sta
1020: 74 65 6d 65 6e 74 73 20 68 65 6c 64 20 62 79 20  tements held by 
1030: 74 68 69 73 20 6d 6f 64 75 6c 65 20 2a 2f 0a 23  this module */.#
1040: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 52 42  define SQLITE_RB
1050: 55 5f 55 50 44 41 54 45 5f 43 41 43 48 45 53 49  U_UPDATE_CACHESI
1060: 5a 45 20 31 36 0a 0a 2f 2a 20 44 65 6c 74 61 20  ZE 16../* Delta 
1070: 63 68 65 63 6b 73 75 6d 73 20 64 69 73 61 62 6c  checksums disabl
1080: 65 64 20 62 79 20 64 65 66 61 75 6c 74 2e 20 20  ed by default.  
1090: 43 6f 6d 70 69 6c 65 20 77 69 74 68 20 2d 44 52  Compile with -DR
10a0: 42 55 5f 45 4e 41 42 4c 45 5f 44 45 4c 54 41 5f  BU_ENABLE_DELTA_
10b0: 43 4b 53 55 4d 0a 2a 2a 20 74 6f 20 65 6e 61 62  CKSUM.** to enab
10c0: 6c 65 20 63 68 65 63 6b 73 75 6d 20 76 65 72 69  le checksum veri
10d0: 66 69 63 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66  fication..*/.#if
10e0: 6e 64 65 66 20 52 42 55 5f 45 4e 41 42 4c 45 5f  ndef RBU_ENABLE_
10f0: 44 45 4c 54 41 5f 43 4b 53 55 4d 0a 23 20 64 65  DELTA_CKSUM.# de
1100: 66 69 6e 65 20 52 42 55 5f 45 4e 41 42 4c 45 5f  fine RBU_ENABLE_
1110: 44 45 4c 54 41 5f 43 4b 53 55 4d 20 30 0a 23 65  DELTA_CKSUM 0.#e
1120: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 77 61 70  ndif../*.** Swap
1130: 20 74 77 6f 20 6f 62 6a 65 63 74 73 20 6f 66 20   two objects of 
1140: 74 79 70 65 20 54 59 50 45 2e 0a 2a 2f 0a 23 69  type TYPE..*/.#i
1150: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
1160: 45 5f 41 4d 41 4c 47 41 4d 41 54 49 4f 4e 29 0a  E_AMALGAMATION).
1170: 23 20 64 65 66 69 6e 65 20 53 57 41 50 28 54 59  # define SWAP(TY
1180: 50 45 2c 41 2c 42 29 20 7b 54 59 50 45 20 74 3d  PE,A,B) {TYPE t=
1190: 41 3b 20 41 3d 42 3b 20 42 3d 74 3b 7d 0a 23 65  A; A=B; B=t;}.#e
11a0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
11b0: 72 62 75 5f 73 74 61 74 65 20 74 61 62 6c 65 20  rbu_state table 
11c0: 69 73 20 75 73 65 64 20 74 6f 20 73 61 76 65 20  is used to save 
11d0: 74 68 65 20 73 74 61 74 65 20 6f 66 20 61 20 70  the state of a p
11e0: 61 72 74 69 61 6c 6c 79 20 61 70 70 6c 69 65 64  artially applied
11f0: 0a 2a 2a 20 75 70 64 61 74 65 20 73 6f 20 74 68  .** update so th
1200: 61 74 20 69 74 20 63 61 6e 20 62 65 20 72 65 73  at it can be res
1210: 75 6d 65 64 20 6c 61 74 65 72 2e 20 54 68 65 20  umed later. The 
1220: 74 61 62 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f  table consists o
1230: 66 20 69 6e 74 65 67 65 72 0a 2a 2a 20 6b 65 79  f integer.** key
1240: 73 20 6d 61 70 70 65 64 20 74 6f 20 76 61 6c 75  s mapped to valu
1250: 65 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  es as follows:.*
1260: 2a 0a 2a 2a 20 52 42 55 5f 53 54 41 54 45 5f 53  *.** RBU_STATE_S
1270: 54 41 47 45 3a 0a 2a 2a 20 20 20 4d 61 79 20 62  TAGE:.**   May b
1280: 65 20 73 65 74 20 74 6f 20 69 6e 74 65 67 65 72  e set to integer
1290: 20 76 61 6c 75 65 73 20 31 2c 20 32 2c 20 34 20   values 1, 2, 4 
12a0: 6f 72 20 35 2e 20 41 73 20 66 6f 6c 6c 6f 77 73  or 5. As follows
12b0: 3a 0a 2a 2a 20 20 20 20 20 20 20 31 3a 20 74 68  :.**       1: th
12c0: 65 20 2a 2d 72 62 75 20 66 69 6c 65 20 69 73 20  e *-rbu file is 
12d0: 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
12e0: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a  construction..**
12f0: 20 20 20 20 20 20 20 32 3a 20 74 68 65 20 2a 2d         2: the *-
1300: 72 62 75 20 66 69 6c 65 20 68 61 73 20 62 65 65  rbu file has bee
1310: 6e 20 63 6f 6e 73 74 72 75 63 74 65 64 2c 20 62  n constructed, b
1320: 75 74 20 6e 6f 74 20 79 65 74 20 6d 6f 76 65 64  ut not yet moved
1330: 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 74 6f   .**          to
1340: 20 74 68 65 20 2a 2d 77 61 6c 20 70 61 74 68 2e   the *-wal path.
1350: 0a 2a 2a 20 20 20 20 20 20 20 34 3a 20 74 68 65  .**       4: the
1360: 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 73 20 75   checkpoint is u
1370: 6e 64 65 72 77 61 79 2e 0a 2a 2a 20 20 20 20 20  nderway..**     
1380: 20 20 35 3a 20 74 68 65 20 72 62 75 20 75 70 64    5: the rbu upd
1390: 61 74 65 20 68 61 73 20 62 65 65 6e 20 63 68 65  ate has been che
13a0: 63 6b 70 6f 69 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a  ckpointed..**.**
13b0: 20 52 42 55 5f 53 54 41 54 45 5f 54 42 4c 3a 0a   RBU_STATE_TBL:.
13c0: 2a 2a 20 20 20 4f 6e 6c 79 20 76 61 6c 69 64 20  **   Only valid 
13d0: 69 66 20 53 54 41 47 45 3d 3d 31 2e 20 54 68 65  if STAGE==1. The
13e0: 20 74 61 72 67 65 74 20 64 61 74 61 62 61 73 65   target database
13f0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
1400: 6c 65 20 0a 2a 2a 20 20 20 63 75 72 72 65 6e 74  le .**   current
1410: 6c 79 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  ly being written
1420: 2e 0a 2a 2a 0a 2a 2a 20 52 42 55 5f 53 54 41 54  ..**.** RBU_STAT
1430: 45 5f 49 44 58 3a 0a 2a 2a 20 20 20 4f 6e 6c 79  E_IDX:.**   Only
1440: 20 76 61 6c 69 64 20 69 66 20 53 54 41 47 45 3d   valid if STAGE=
1450: 3d 31 2e 20 54 68 65 20 74 61 72 67 65 74 20 64  =1. The target d
1460: 61 74 61 62 61 73 65 20 6e 61 6d 65 20 6f 66 20  atabase name of 
1470: 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20 20 20  the index .**   
1480: 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20  currently being 
1490: 77 72 69 74 74 65 6e 2c 20 6f 72 20 4e 55 4c 4c  written, or NULL
14a0: 20 69 66 20 74 68 65 20 6d 61 69 6e 20 74 61 62   if the main tab
14b0: 6c 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  le is currently 
14c0: 62 65 69 6e 67 0a 2a 2a 20 20 20 75 70 64 61 74  being.**   updat
14d0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 42 55 5f 53 54  ed..**.** RBU_ST
14e0: 41 54 45 5f 52 4f 57 3a 0a 2a 2a 20 20 20 4f 6e  ATE_ROW:.**   On
14f0: 6c 79 20 76 61 6c 69 64 20 69 66 20 53 54 41 47  ly valid if STAG
1500: 45 3d 3d 31 2e 20 4e 75 6d 62 65 72 20 6f 66 20  E==1. Number of 
1510: 72 6f 77 73 20 61 6c 72 65 61 64 79 20 70 72 6f  rows already pro
1520: 63 65 73 73 65 64 20 66 6f 72 20 74 68 65 20 63  cessed for the c
1530: 75 72 72 65 6e 74 0a 2a 2a 20 20 20 74 61 62 6c  urrent.**   tabl
1540: 65 2f 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 52  e/index..**.** R
1550: 42 55 5f 53 54 41 54 45 5f 50 52 4f 47 52 45 53  BU_STATE_PROGRES
1560: 53 3a 0a 2a 2a 20 20 20 54 72 62 75 6c 20 6e 75  S:.**   Trbul nu
1570: 6d 62 65 72 20 6f 66 20 73 71 6c 69 74 65 33 72  mber of sqlite3r
1580: 62 75 5f 73 74 65 70 28 29 20 63 61 6c 6c 73 20  bu_step() calls 
1590: 6d 61 64 65 20 73 6f 20 66 61 72 20 61 73 20 70  made so far as p
15a0: 61 72 74 20 6f 66 20 74 68 69 73 0a 2a 2a 20 20  art of this.**  
15b0: 20 72 62 75 20 75 70 64 61 74 65 2e 0a 2a 2a 0a   rbu update..**.
15c0: 2a 2a 20 52 42 55 5f 53 54 41 54 45 5f 43 4b 50  ** RBU_STATE_CKP
15d0: 54 3a 0a 2a 2a 20 20 20 56 61 6c 69 64 20 69 66  T:.**   Valid if
15e0: 20 53 54 41 47 45 3d 3d 34 2e 20 54 68 65 20 36   STAGE==4. The 6
15f0: 34 2d 62 69 74 20 63 68 65 63 6b 73 75 6d 20 61  4-bit checksum a
1600: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
1610: 68 65 20 77 61 6c 2d 69 6e 64 65 78 0a 2a 2a 20  he wal-index.** 
1620: 20 20 68 65 61 64 65 72 20 63 72 65 61 74 65 64    header created
1630: 20 62 79 20 72 65 63 6f 76 65 72 69 6e 67 20 74   by recovering t
1640: 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 2e 20 54  he *-wal file. T
1650: 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 64  his is used to d
1660: 65 74 65 63 74 0a 2a 2a 20 20 20 63 61 73 65 73  etect.**   cases
1670: 20 77 68 65 6e 20 61 6e 6f 74 68 65 72 20 63 6c   when another cl
1680: 69 65 6e 74 20 61 70 70 65 6e 64 73 20 66 72 61  ient appends fra
1690: 6d 65 73 20 74 6f 20 74 68 65 20 2a 2d 77 61 6c  mes to the *-wal
16a0: 20 66 69 6c 65 20 69 6e 20 74 68 65 0a 2a 2a 20   file in the.** 
16b0: 20 20 6d 69 64 64 6c 65 20 6f 66 20 61 6e 20 69    middle of an i
16c0: 6e 63 72 65 6d 65 6e 74 61 6c 20 63 68 65 63 6b  ncremental check
16d0: 70 6f 69 6e 74 20 28 61 6e 20 69 6e 63 72 65 6d  point (an increm
16e0: 65 6e 74 61 6c 20 63 68 65 63 6b 70 6f 69 6e 74  ental checkpoint
16f0: 20 63 61 6e 6e 6f 74 0a 2a 2a 20 20 20 62 65 20   cannot.**   be 
1700: 63 6f 6e 74 69 6e 75 65 64 20 69 66 20 74 68 69  continued if thi
1710: 73 20 68 61 70 70 65 6e 73 29 2e 0a 2a 2a 0a 2a  s happens)..**.*
1720: 2a 20 52 42 55 5f 53 54 41 54 45 5f 43 4f 4f 4b  * RBU_STATE_COOK
1730: 49 45 3a 0a 2a 2a 20 20 20 56 61 6c 69 64 20 69  IE:.**   Valid i
1740: 66 20 53 54 41 47 45 3d 3d 31 2e 20 54 68 65 20  f STAGE==1. The 
1750: 63 75 72 72 65 6e 74 20 63 68 61 6e 67 65 2d 63  current change-c
1760: 6f 75 6e 74 65 72 20 63 6f 6f 6b 69 65 20 76 61  ounter cookie va
1770: 6c 75 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 20  lue in the .**  
1780: 20 74 61 72 67 65 74 20 64 62 20 66 69 6c 65 2e   target db file.
1790: 0a 2a 2a 0a 2a 2a 20 52 42 55 5f 53 54 41 54 45  .**.** RBU_STATE
17a0: 5f 4f 41 4c 53 5a 3a 0a 2a 2a 20 20 20 56 61 6c  _OALSZ:.**   Val
17b0: 69 64 20 69 66 20 53 54 41 47 45 3d 3d 31 2e 20  id if STAGE==1. 
17c0: 54 68 65 20 73 69 7a 65 20 69 6e 20 62 79 74 65  The size in byte
17d0: 73 20 6f 66 20 74 68 65 20 2a 2d 6f 61 6c 20 66  s of the *-oal f
17e0: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 52 42 55 5f 53  ile..**.** RBU_S
17f0: 54 41 54 45 5f 44 41 54 41 54 42 4c 3a 0a 2a 2a  TATE_DATATBL:.**
1800: 20 20 20 4f 6e 6c 79 20 76 61 6c 69 64 20 69 66     Only valid if
1810: 20 53 54 41 47 45 3d 3d 31 2e 20 54 68 65 20 52   STAGE==1. The R
1820: 42 55 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  BU database name
1830: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 0a 2a   of the table .*
1840: 2a 20 20 20 63 75 72 72 65 6e 74 6c 79 20 62 65  *   currently be
1850: 69 6e 67 20 72 65 61 64 2e 0a 2a 2f 0a 23 64 65  ing read..*/.#de
1860: 66 69 6e 65 20 52 42 55 5f 53 54 41 54 45 5f 53  fine RBU_STATE_S
1870: 54 41 47 45 20 20 20 20 20 20 20 20 31 0a 23 64  TAGE        1.#d
1880: 65 66 69 6e 65 20 52 42 55 5f 53 54 41 54 45 5f  efine RBU_STATE_
1890: 54 42 4c 20 20 20 20 20 20 20 20 20 20 32 0a 23  TBL          2.#
18a0: 64 65 66 69 6e 65 20 52 42 55 5f 53 54 41 54 45  define RBU_STATE
18b0: 5f 49 44 58 20 20 20 20 20 20 20 20 20 20 33 0a  _IDX          3.
18c0: 23 64 65 66 69 6e 65 20 52 42 55 5f 53 54 41 54  #define RBU_STAT
18d0: 45 5f 52 4f 57 20 20 20 20 20 20 20 20 20 20 34  E_ROW          4
18e0: 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 53 54 41  .#define RBU_STA
18f0: 54 45 5f 50 52 4f 47 52 45 53 53 20 20 20 20 20  TE_PROGRESS     
1900: 35 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 53 54  5.#define RBU_ST
1910: 41 54 45 5f 43 4b 50 54 20 20 20 20 20 20 20 20  ATE_CKPT        
1920: 20 36 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 53   6.#define RBU_S
1930: 54 41 54 45 5f 43 4f 4f 4b 49 45 20 20 20 20 20  TATE_COOKIE     
1940: 20 20 37 0a 23 64 65 66 69 6e 65 20 52 42 55 5f    7.#define RBU_
1950: 53 54 41 54 45 5f 4f 41 4c 53 5a 20 20 20 20 20  STATE_OALSZ     
1960: 20 20 20 38 0a 23 64 65 66 69 6e 65 20 52 42 55     8.#define RBU
1970: 5f 53 54 41 54 45 5f 50 48 41 53 45 4f 4e 45 53  _STATE_PHASEONES
1980: 54 45 50 20 39 0a 23 64 65 66 69 6e 65 20 52 42  TEP 9.#define RB
1990: 55 5f 53 54 41 54 45 5f 44 41 54 41 54 42 4c 20  U_STATE_DATATBL 
19a0: 20 20 20 20 31 30 0a 0a 23 64 65 66 69 6e 65 20      10..#define 
19b0: 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20 20 20  RBU_STAGE_OAL   
19c0: 20 20 20 20 20 20 31 0a 23 64 65 66 69 6e 65 20        1.#define 
19d0: 52 42 55 5f 53 54 41 47 45 5f 4d 4f 56 45 20 20  RBU_STAGE_MOVE  
19e0: 20 20 20 20 20 20 32 0a 23 64 65 66 69 6e 65 20        2.#define 
19f0: 52 42 55 5f 53 54 41 47 45 5f 43 41 50 54 55 52  RBU_STAGE_CAPTUR
1a00: 45 20 20 20 20 20 33 0a 23 64 65 66 69 6e 65 20  E     3.#define 
1a10: 52 42 55 5f 53 54 41 47 45 5f 43 4b 50 54 20 20  RBU_STAGE_CKPT  
1a20: 20 20 20 20 20 20 34 0a 23 64 65 66 69 6e 65 20        4.#define 
1a30: 52 42 55 5f 53 54 41 47 45 5f 44 4f 4e 45 20 20  RBU_STAGE_DONE  
1a40: 20 20 20 20 20 20 35 0a 0a 0a 23 64 65 66 69 6e        5...#defin
1a50: 65 20 52 42 55 5f 43 52 45 41 54 45 5f 53 54 41  e RBU_CREATE_STA
1a60: 54 45 20 5c 0a 20 20 22 43 52 45 41 54 45 20 54  TE \.  "CREATE T
1a70: 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53  ABLE IF NOT EXIS
1a80: 54 53 20 25 73 2e 72 62 75 5f 73 74 61 74 65 28  TS %s.rbu_state(
1a90: 6b 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  k INTEGER PRIMAR
1aa0: 59 20 4b 45 59 2c 20 76 29 22 0a 0a 74 79 70 65  Y KEY, v)"..type
1ab0: 64 65 66 20 73 74 72 75 63 74 20 52 62 75 46 72  def struct RbuFr
1ac0: 61 6d 65 20 52 62 75 46 72 61 6d 65 3b 0a 74 79  ame RbuFrame;.ty
1ad0: 70 65 64 65 66 20 73 74 72 75 63 74 20 52 62 75  pedef struct Rbu
1ae0: 4f 62 6a 49 74 65 72 20 52 62 75 4f 62 6a 49 74  ObjIter RbuObjIt
1af0: 65 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  er;.typedef stru
1b00: 63 74 20 52 62 75 53 74 61 74 65 20 52 62 75 53  ct RbuState RbuS
1b10: 74 61 74 65 3b 0a 74 79 70 65 64 65 66 20 73 74  tate;.typedef st
1b20: 72 75 63 74 20 72 62 75 5f 76 66 73 20 72 62 75  ruct rbu_vfs rbu
1b30: 5f 76 66 73 3b 0a 74 79 70 65 64 65 66 20 73 74  _vfs;.typedef st
1b40: 72 75 63 74 20 72 62 75 5f 66 69 6c 65 20 72 62  ruct rbu_file rb
1b50: 75 5f 66 69 6c 65 3b 0a 74 79 70 65 64 65 66 20  u_file;.typedef 
1b60: 73 74 72 75 63 74 20 52 62 75 55 70 64 61 74 65  struct RbuUpdate
1b70: 53 74 6d 74 20 52 62 75 55 70 64 61 74 65 53 74  Stmt RbuUpdateSt
1b80: 6d 74 3b 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  mt;..#if !define
1b90: 64 28 53 51 4c 49 54 45 5f 41 4d 41 4c 47 41 4d  d(SQLITE_AMALGAM
1ba0: 41 54 49 4f 4e 29 0a 74 79 70 65 64 65 66 20 75  ATION).typedef u
1bb0: 6e 73 69 67 6e 65 64 20 69 6e 74 20 75 33 32 3b  nsigned int u32;
1bc0: 0a 74 79 70 65 64 65 66 20 75 6e 73 69 67 6e 65  .typedef unsigne
1bd0: 64 20 73 68 6f 72 74 20 75 31 36 3b 0a 74 79 70  d short u16;.typ
1be0: 65 64 65 66 20 75 6e 73 69 67 6e 65 64 20 63 68  edef unsigned ch
1bf0: 61 72 20 75 38 3b 0a 74 79 70 65 64 65 66 20 73  ar u8;.typedef s
1c00: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 36 34  qlite3_int64 i64
1c10: 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ;.#endif../*.** 
1c20: 54 68 65 73 65 20 76 61 6c 75 65 73 20 6d 75 73  These values mus
1c30: 74 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75  t match the valu
1c40: 65 73 20 64 65 66 69 6e 65 64 20 69 6e 20 77 61  es defined in wa
1c50: 6c 2e 63 20 66 6f 72 20 74 68 65 20 65 71 75 69  l.c for the equi
1c60: 76 61 6c 65 6e 74 0a 2a 2a 20 6c 6f 63 6b 73 2e  valent.** locks.
1c70: 20 54 68 65 73 65 20 61 72 65 20 6e 6f 74 20 6d   These are not m
1c80: 61 67 69 63 20 6e 75 6d 62 65 72 73 20 61 73 20  agic numbers as 
1c90: 74 68 65 79 20 61 72 65 20 70 61 72 74 20 6f 66  they are part of
1ca0: 20 74 68 65 20 53 51 4c 69 74 65 20 66 69 6c 65   the SQLite file
1cb0: 0a 2a 2a 20 66 6f 72 6d 61 74 2e 0a 2a 2f 0a 23  .** format..*/.#
1cc0: 64 65 66 69 6e 65 20 57 41 4c 5f 4c 4f 43 4b 5f  define WAL_LOCK_
1cd0: 57 52 49 54 45 20 20 30 0a 23 64 65 66 69 6e 65  WRITE  0.#define
1ce0: 20 57 41 4c 5f 4c 4f 43 4b 5f 43 4b 50 54 20 20   WAL_LOCK_CKPT  
1cf0: 20 31 0a 23 64 65 66 69 6e 65 20 57 41 4c 5f 4c   1.#define WAL_L
1d00: 4f 43 4b 5f 52 45 41 44 30 20 20 33 0a 0a 23 64  OCK_READ0  3..#d
1d10: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 46 43 4e  efine SQLITE_FCN
1d20: 54 4c 5f 52 42 55 43 4e 54 20 20 20 20 35 31 34  TL_RBUCNT    514
1d30: 39 32 31 36 0a 0a 2f 2a 0a 2a 2a 20 41 20 73 74  9216../*.** A st
1d40: 72 75 63 74 75 72 65 20 74 6f 20 73 74 6f 72 65  ructure to store
1d50: 20 76 61 6c 75 65 73 20 72 65 61 64 20 66 72 6f   values read fro
1d60: 6d 20 74 68 65 20 72 62 75 5f 73 74 61 74 65 20  m the rbu_state 
1d70: 74 61 62 6c 65 20 69 6e 20 6d 65 6d 6f 72 79 2e  table in memory.
1d80: 0a 2a 2f 0a 73 74 72 75 63 74 20 52 62 75 53 74  .*/.struct RbuSt
1d90: 61 74 65 20 7b 0a 20 20 69 6e 74 20 65 53 74 61  ate {.  int eSta
1da0: 67 65 3b 0a 20 20 63 68 61 72 20 2a 7a 54 62 6c  ge;.  char *zTbl
1db0: 3b 0a 20 20 63 68 61 72 20 2a 7a 44 61 74 61 54  ;.  char *zDataT
1dc0: 62 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 49 64 78  bl;.  char *zIdx
1dd0: 3b 0a 20 20 69 36 34 20 69 57 61 6c 43 6b 73 75  ;.  i64 iWalCksu
1de0: 6d 3b 0a 20 20 69 6e 74 20 6e 52 6f 77 3b 0a 20  m;.  int nRow;. 
1df0: 20 69 36 34 20 6e 50 72 6f 67 72 65 73 73 3b 0a   i64 nProgress;.
1e00: 20 20 75 33 32 20 69 43 6f 6f 6b 69 65 3b 0a 20    u32 iCookie;. 
1e10: 20 69 36 34 20 69 4f 61 6c 53 7a 3b 0a 20 20 69   i64 iOalSz;.  i
1e20: 36 34 20 6e 50 68 61 73 65 4f 6e 65 53 74 65 70  64 nPhaseOneStep
1e30: 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 52 62 75  ;.};..struct Rbu
1e40: 55 70 64 61 74 65 53 74 6d 74 20 7b 0a 20 20 63  UpdateStmt {.  c
1e50: 68 61 72 20 2a 7a 4d 61 73 6b 3b 20 20 20 20 20  har *zMask;     
1e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e70: 2a 20 43 6f 70 79 20 6f 66 20 75 70 64 61 74 65  * Copy of update
1e80: 20 6d 61 73 6b 20 75 73 65 64 20 77 69 74 68 20   mask used with 
1e90: 70 55 70 64 61 74 65 20 2a 2f 0a 20 20 73 71 6c  pUpdate */.  sql
1ea0: 69 74 65 33 5f 73 74 6d 74 20 2a 70 55 70 64 61  ite3_stmt *pUpda
1eb0: 74 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  te;          /* 
1ec0: 4c 61 73 74 20 75 70 64 61 74 65 20 73 74 61 74  Last update stat
1ed0: 65 6d 65 6e 74 20 28 6f 72 20 4e 55 4c 4c 29 20  ement (or NULL) 
1ee0: 2a 2f 0a 20 20 52 62 75 55 70 64 61 74 65 53 74  */.  RbuUpdateSt
1ef0: 6d 74 20 2a 70 4e 65 78 74 3b 0a 7d 3b 0a 0a 2f  mt *pNext;.};../
1f00: 2a 0a 2a 2a 20 41 6e 20 69 74 65 72 61 74 6f 72  *.** An iterator
1f10: 20 6f 66 20 74 68 69 73 20 74 79 70 65 20 69 73   of this type is
1f20: 20 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   used to iterate
1f30: 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 6f 62 6a   through all obj
1f40: 65 63 74 73 20 69 6e 0a 2a 2a 20 74 68 65 20 74  ects in.** the t
1f50: 61 72 67 65 74 20 64 61 74 61 62 61 73 65 20 74  arget database t
1f60: 68 61 74 20 72 65 71 75 69 72 65 20 75 70 64 61  hat require upda
1f70: 74 69 6e 67 2e 20 46 6f 72 20 65 61 63 68 20 73  ting. For each s
1f80: 75 63 68 20 74 61 62 6c 65 2c 20 74 68 65 0a 2a  uch table, the.*
1f90: 2a 20 69 74 65 72 61 74 6f 72 20 76 69 73 69 74  * iterator visit
1fa0: 73 2c 20 69 6e 20 6f 72 64 65 72 3a 0a 2a 2a 0a  s, in order:.**.
1fb0: 2a 2a 20 20 20 20 20 2a 20 74 68 65 20 74 61 62  **     * the tab
1fc0: 6c 65 20 69 74 73 65 6c 66 2c 20 0a 2a 2a 20 20  le itself, .**  
1fd0: 20 20 20 2a 20 65 61 63 68 20 69 6e 64 65 78 20     * each index 
1fe0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 28 7a 65  of the table (ze
1ff0: 72 6f 20 6f 72 20 6d 6f 72 65 20 70 6f 69 6e 74  ro or more point
2000: 73 20 74 6f 20 76 69 73 69 74 29 2c 20 61 6e 64  s to visit), and
2010: 0a 2a 2a 20 20 20 20 20 2a 20 61 20 73 70 65 63  .**     * a spec
2020: 69 61 6c 20 22 63 6c 65 61 6e 75 70 20 74 61 62  ial "cleanup tab
2030: 6c 65 22 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  le" state..**.**
2040: 20 61 62 49 6e 64 65 78 65 64 3a 0a 2a 2a 20 20   abIndexed:.**  
2050: 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 68 61   If the table ha
2060: 73 20 6e 6f 20 69 6e 64 65 78 65 73 20 6f 6e 20  s no indexes on 
2070: 69 74 2c 20 61 62 49 6e 64 65 78 65 64 20 69 73  it, abIndexed is
2080: 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 20 4f 74   set to NULL. Ot
2090: 68 65 72 77 69 73 65 2c 0a 2a 2a 20 20 20 69 74  herwise,.**   it
20a0: 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 61 72   points to an ar
20b0: 72 61 79 20 6f 66 20 66 6c 61 67 73 20 6e 54 62  ray of flags nTb
20c0: 6c 43 6f 6c 20 65 6c 65 6d 65 6e 74 73 20 69 6e  lCol elements in
20d0: 20 73 69 7a 65 2e 20 54 68 65 20 66 6c 61 67 20   size. The flag 
20e0: 69 73 0a 2a 2a 20 20 20 73 65 74 20 66 6f 72 20  is.**   set for 
20f0: 65 61 63 68 20 63 6f 6c 75 6d 6e 20 74 68 61 74  each column that
2100: 20 69 73 20 65 69 74 68 65 72 20 61 20 70 61 72   is either a par
2110: 74 20 6f 66 20 74 68 65 20 50 4b 20 6f 72 20 61  t of the PK or a
2120: 20 70 61 72 74 20 6f 66 20 61 6e 0a 2a 2a 20 20   part of an.**  
2130: 20 69 6e 64 65 78 2e 20 4f 72 20 63 6c 65 61 72   index. Or clear
2140: 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 20 20   otherwise..**  
2150: 20 0a 2a 2f 0a 73 74 72 75 63 74 20 52 62 75 4f   .*/.struct RbuO
2160: 62 6a 49 74 65 72 20 7b 0a 20 20 73 71 6c 69 74  bjIter {.  sqlit
2170: 65 33 5f 73 74 6d 74 20 2a 70 54 62 6c 49 74 65  e3_stmt *pTblIte
2180: 72 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74  r;         /* It
2190: 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74 61  erate through ta
21a0: 62 6c 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  bles */.  sqlite
21b0: 33 5f 73 74 6d 74 20 2a 70 49 64 78 49 74 65 72  3_stmt *pIdxIter
21c0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64  ;         /* Ind
21d0: 65 78 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20  ex iterator */. 
21e0: 20 69 6e 74 20 6e 54 62 6c 43 6f 6c 3b 20 20 20   int nTblCol;   
21f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2200: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 7a 54 62   /* Size of azTb
2210: 6c 43 6f 6c 5b 5d 20 61 72 72 61 79 20 2a 2f 0a  lCol[] array */.
2220: 20 20 63 68 61 72 20 2a 2a 61 7a 54 62 6c 43 6f    char **azTblCo
2230: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
2240: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 75 6e    /* Array of un
2250: 71 75 6f 74 65 64 20 74 61 72 67 65 74 20 63 6f  quoted target co
2260: 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20  lumn names */.  
2270: 63 68 61 72 20 2a 2a 61 7a 54 62 6c 54 79 70 65  char **azTblType
2280: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2290: 2f 2a 20 41 72 72 61 79 20 6f 66 20 74 61 72 67  /* Array of targ
22a0: 65 74 20 63 6f 6c 75 6d 6e 20 74 79 70 65 73 20  et column types 
22b0: 2a 2f 0a 20 20 69 6e 74 20 2a 61 69 53 72 63 4f  */.  int *aiSrcO
22c0: 72 64 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  rder;           
22d0: 20 20 20 20 20 2f 2a 20 73 72 63 20 74 61 62 6c       /* src tabl
22e0: 65 20 63 6f 6c 20 2d 3e 20 74 61 72 67 65 74 20  e col -> target 
22f0: 74 61 62 6c 65 20 63 6f 6c 20 2a 2f 0a 20 20 75  table col */.  u
2300: 38 20 2a 61 62 54 62 6c 50 6b 3b 20 20 20 20 20  8 *abTblPk;     
2310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2320: 2a 20 41 72 72 61 79 20 6f 66 20 66 6c 61 67 73  * Array of flags
2330: 2c 20 73 65 74 20 6f 6e 20 74 61 72 67 65 74 20  , set on target 
2340: 50 4b 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  PK columns */.  
2350: 75 38 20 2a 61 62 4e 6f 74 4e 75 6c 6c 3b 20 20  u8 *abNotNull;  
2360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2370: 2f 2a 20 41 72 72 61 79 20 6f 66 20 66 6c 61 67  /* Array of flag
2380: 73 2c 20 73 65 74 20 6f 6e 20 4e 4f 54 20 4e 55  s, set on NOT NU
2390: 4c 4c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  LL columns */.  
23a0: 75 38 20 2a 61 62 49 6e 64 65 78 65 64 3b 20 20  u8 *abIndexed;  
23b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c0: 2f 2a 20 41 72 72 61 79 20 6f 66 20 66 6c 61 67  /* Array of flag
23d0: 73 2c 20 73 65 74 20 6f 6e 20 69 6e 64 65 78 65  s, set on indexe
23e0: 64 20 26 20 50 4b 20 63 6f 6c 73 20 2a 2f 0a 20  d & PK cols */. 
23f0: 20 69 6e 74 20 65 54 79 70 65 3b 20 20 20 20 20   int eType;     
2400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2410: 20 2f 2a 20 54 61 62 6c 65 20 74 79 70 65 20 2d   /* Table type -
2420: 20 61 6e 20 52 42 55 5f 50 4b 5f 58 58 58 20 76   an RBU_PK_XXX v
2430: 61 6c 75 65 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 75  alue */..  /* Ou
2440: 74 70 75 74 20 76 61 72 69 61 62 6c 65 73 2e 20  tput variables. 
2450: 7a 54 62 6c 3d 3d 30 20 69 6d 70 6c 69 65 73 20  zTbl==0 implies 
2460: 45 4f 46 2e 20 2a 2f 0a 20 20 69 6e 74 20 62 43  EOF. */.  int bC
2470: 6c 65 61 6e 75 70 3b 20 20 20 20 20 20 20 20 20  leanup;         
2480: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2490: 65 20 69 6e 20 22 63 6c 65 61 6e 75 70 22 20 73  e in "cleanup" s
24a0: 74 61 74 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  tate */.  const 
24b0: 63 68 61 72 20 2a 7a 54 62 6c 3b 20 20 20 20 20  char *zTbl;     
24c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
24d0: 65 20 6f 66 20 74 61 72 67 65 74 20 64 62 20 74  e of target db t
24e0: 61 62 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  able */.  const 
24f0: 63 68 61 72 20 2a 7a 44 61 74 61 54 62 6c 3b 20  char *zDataTbl; 
2500: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
2510: 65 20 6f 66 20 72 62 75 20 64 62 20 74 61 62 6c  e of rbu db tabl
2520: 65 20 28 6f 72 20 6e 75 6c 6c 29 20 2a 2f 0a 20  e (or null) */. 
2530: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64   const char *zId
2540: 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
2550: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 61 72 67   /* Name of targ
2560: 65 74 20 64 62 20 69 6e 64 65 78 20 28 6f 72 20  et db index (or 
2570: 6e 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74 20 69  null) */.  int i
2580: 54 6e 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20  Tnum;           
2590: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
25a0: 6f 74 20 70 61 67 65 20 6f 66 20 63 75 72 72 65  ot page of curre
25b0: 6e 74 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  nt object */.  i
25c0: 6e 74 20 69 50 6b 54 6e 75 6d 3b 20 20 20 20 20  nt iPkTnum;     
25d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25e0: 2a 20 49 66 20 65 54 79 70 65 3d 3d 45 58 54 45  * If eType==EXTE
25f0: 52 4e 41 4c 2c 20 72 6f 6f 74 20 6f 66 20 50 4b  RNAL, root of PK
2600: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20   index */.  int 
2610: 62 55 6e 69 71 75 65 3b 20 20 20 20 20 20 20 20  bUnique;        
2620: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
2630: 75 72 72 65 6e 74 20 69 6e 64 65 78 20 69 73 20  urrent index is 
2640: 75 6e 69 71 75 65 20 2a 2f 0a 20 20 69 6e 74 20  unique */.  int 
2650: 6e 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20  nIndex;         
2660: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2670: 75 6d 62 65 72 20 6f 66 20 61 75 78 2e 20 69 6e  umber of aux. in
2680: 64 65 78 65 73 20 6f 6e 20 74 61 62 6c 65 20 7a  dexes on table z
2690: 54 62 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 53 74 61  Tbl */..  /* Sta
26a0: 74 65 6d 65 6e 74 73 20 63 72 65 61 74 65 64 20  tements created 
26b0: 62 79 20 72 62 75 4f 62 6a 49 74 65 72 50 72 65  by rbuObjIterPre
26c0: 70 61 72 65 41 6c 6c 28 29 20 2a 2f 0a 20 20 69  pareAll() */.  i
26d0: 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20  nt nCol;        
26e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26f0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
2700: 6d 6e 73 20 69 6e 20 63 75 72 72 65 6e 74 20 6f  mns in current o
2710: 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74  bject */.  sqlit
2720: 65 33 5f 73 74 6d 74 20 2a 70 53 65 6c 65 63 74  e3_stmt *pSelect
2730: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f  ;          /* So
2740: 75 72 63 65 20 64 61 74 61 20 2a 2f 0a 20 20 73  urce data */.  s
2750: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 49 6e  qlite3_stmt *pIn
2760: 73 65 72 74 3b 20 20 20 20 20 20 20 20 20 20 2f  sert;          /
2770: 2a 20 53 74 61 74 65 6d 65 6e 74 20 66 6f 72 20  * Statement for 
2780: 49 4e 53 45 52 54 20 6f 70 65 72 61 74 69 6f 6e  INSERT operation
2790: 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73  s */.  sqlite3_s
27a0: 74 6d 74 20 2a 70 44 65 6c 65 74 65 3b 20 20 20  tmt *pDelete;   
27b0: 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 65 6d         /* Statem
27c0: 65 6e 74 20 66 6f 72 20 44 45 4c 45 54 45 20 6f  ent for DELETE o
27d0: 70 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ps */.  sqlite3_
27e0: 73 74 6d 74 20 2a 70 54 6d 70 49 6e 73 65 72 74  stmt *pTmpInsert
27f0: 3b 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 65 72  ;       /* Inser
2800: 74 20 69 6e 74 6f 20 72 62 75 5f 74 6d 70 5f 24  t into rbu_tmp_$
2810: 7a 44 61 74 61 54 62 6c 20 2a 2f 0a 0a 20 20 2f  zDataTbl */..  /
2820: 2a 20 4c 61 73 74 20 55 50 44 41 54 45 20 75 73  * Last UPDATE us
2830: 65 64 20 28 66 6f 72 20 50 4b 20 62 2d 74 72 65  ed (for PK b-tre
2840: 65 20 75 70 64 61 74 65 73 20 6f 6e 6c 79 29 2c  e updates only),
2850: 20 6f 72 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 52   or NULL. */.  R
2860: 62 75 55 70 64 61 74 65 53 74 6d 74 20 2a 70 52  buUpdateStmt *pR
2870: 62 75 55 70 64 61 74 65 3b 0a 7d 3b 0a 0a 2f 2a  buUpdate;.};../*
2880: 0a 2a 2a 20 56 61 6c 75 65 73 20 66 6f 72 20 52  .** Values for R
2890: 62 75 4f 62 6a 49 74 65 72 2e 65 54 79 70 65 0a  buObjIter.eType.
28a0: 2a 2a 0a 2a 2a 20 20 20 20 20 30 3a 20 54 61 62  **.**     0: Tab
28b0: 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  le does not exis
28c0: 74 20 28 65 72 72 6f 72 29 0a 2a 2a 20 20 20 20  t (error).**    
28d0: 20 31 3a 20 54 61 62 6c 65 20 68 61 73 20 61 6e   1: Table has an
28e0: 20 69 6d 70 6c 69 63 69 74 20 72 6f 77 69 64 2e   implicit rowid.
28f0: 0a 2a 2a 20 20 20 20 20 32 3a 20 54 61 62 6c 65  .**     2: Table
2900: 20 68 61 73 20 61 6e 20 65 78 70 6c 69 63 69 74   has an explicit
2910: 20 49 50 4b 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 20   IPK column..** 
2920: 20 20 20 20 33 3a 20 54 61 62 6c 65 20 68 61 73      3: Table has
2930: 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 50 4b 20   an external PK 
2940: 69 6e 64 65 78 2e 0a 2a 2a 20 20 20 20 20 34 3a  index..**     4:
2950: 20 54 61 62 6c 65 20 69 73 20 57 49 54 48 4f 55   Table is WITHOU
2960: 54 20 52 4f 57 49 44 2e 0a 2a 2a 20 20 20 20 20  T ROWID..**     
2970: 35 3a 20 54 61 62 6c 65 20 69 73 20 61 20 76 69  5: Table is a vi
2980: 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a  rtual table..*/.
2990: 23 64 65 66 69 6e 65 20 52 42 55 5f 50 4b 5f 4e  #define RBU_PK_N
29a0: 4f 54 41 42 4c 45 20 20 20 20 20 20 20 20 30 0a  OTABLE        0.
29b0: 23 64 65 66 69 6e 65 20 52 42 55 5f 50 4b 5f 4e  #define RBU_PK_N
29c0: 4f 4e 45 20 20 20 20 20 20 20 20 20 20 20 31 0a  ONE           1.
29d0: 23 64 65 66 69 6e 65 20 52 42 55 5f 50 4b 5f 49  #define RBU_PK_I
29e0: 50 4b 20 20 20 20 20 20 20 20 20 20 20 20 32 0a  PK            2.
29f0: 23 64 65 66 69 6e 65 20 52 42 55 5f 50 4b 5f 45  #define RBU_PK_E
2a00: 58 54 45 52 4e 41 4c 20 20 20 20 20 20 20 33 0a  XTERNAL       3.
2a10: 23 64 65 66 69 6e 65 20 52 42 55 5f 50 4b 5f 57  #define RBU_PK_W
2a20: 49 54 48 4f 55 54 5f 52 4f 57 49 44 20 20 34 0a  ITHOUT_ROWID  4.
2a30: 23 64 65 66 69 6e 65 20 52 42 55 5f 50 4b 5f 56  #define RBU_PK_V
2a40: 54 41 42 20 20 20 20 20 20 20 20 20 20 20 35 0a  TAB           5.
2a50: 0a 0a 2f 2a 0a 2a 2a 20 57 69 74 68 69 6e 20 74  ../*.** Within t
2a60: 68 65 20 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c  he RBU_STAGE_OAL
2a70: 20 73 74 61 67 65 2c 20 65 61 63 68 20 63 61 6c   stage, each cal
2a80: 6c 20 74 6f 20 73 71 6c 69 74 65 33 72 62 75 5f  l to sqlite3rbu_
2a90: 73 74 65 70 28 29 20 70 65 72 66 6f 72 6d 73 0a  step() performs.
2aa0: 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f  ** one of the fo
2ab0: 6c 6c 6f 77 69 6e 67 20 6f 70 65 72 61 74 69 6f  llowing operatio
2ac0: 6e 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 52  ns..*/.#define R
2ad0: 42 55 5f 49 4e 53 45 52 54 20 20 20 20 20 31 20  BU_INSERT     1 
2ae0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 65           /* Inse
2af0: 72 74 20 6f 6e 20 61 20 6d 61 69 6e 20 74 61 62  rt on a main tab
2b00: 6c 65 20 62 2d 74 72 65 65 20 2a 2f 0a 23 64 65  le b-tree */.#de
2b10: 66 69 6e 65 20 52 42 55 5f 44 45 4c 45 54 45 20  fine RBU_DELETE 
2b20: 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20 2f      2          /
2b30: 2a 20 44 65 6c 65 74 65 20 61 20 72 6f 77 20 66  * Delete a row f
2b40: 72 6f 6d 20 61 20 6d 61 69 6e 20 74 61 62 6c 65  rom a main table
2b50: 20 62 2d 74 72 65 65 20 2a 2f 0a 23 64 65 66 69   b-tree */.#defi
2b60: 6e 65 20 52 42 55 5f 52 45 50 4c 41 43 45 20 20  ne RBU_REPLACE  
2b70: 20 20 33 20 20 20 20 20 20 20 20 20 20 2f 2a 20    3          /* 
2b80: 44 65 6c 65 74 65 20 61 6e 64 20 74 68 65 6e 20  Delete and then 
2b90: 69 6e 73 65 72 74 20 61 20 72 6f 77 20 2a 2f 0a  insert a row */.
2ba0: 23 64 65 66 69 6e 65 20 52 42 55 5f 49 44 58 5f  #define RBU_IDX_
2bb0: 44 45 4c 45 54 45 20 34 20 20 20 20 20 20 20 20  DELETE 4        
2bc0: 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 20 72 6f    /* Delete a ro
2bd0: 77 20 66 72 6f 6d 20 61 6e 20 61 75 78 2e 20 69  w from an aux. i
2be0: 6e 64 65 78 20 62 2d 74 72 65 65 20 2a 2f 0a 23  ndex b-tree */.#
2bf0: 64 65 66 69 6e 65 20 52 42 55 5f 49 44 58 5f 49  define RBU_IDX_I
2c00: 4e 53 45 52 54 20 35 20 20 20 20 20 20 20 20 20  NSERT 5         
2c10: 20 2f 2a 20 49 6e 73 65 72 74 20 6f 6e 20 61 6e   /* Insert on an
2c20: 20 61 75 78 2e 20 69 6e 64 65 78 20 62 2d 74 72   aux. index b-tr
2c30: 65 65 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 52  ee */..#define R
2c40: 42 55 5f 55 50 44 41 54 45 20 20 20 20 20 36 20  BU_UPDATE     6 
2c50: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 70 64 61           /* Upda
2c60: 74 65 20 61 20 72 6f 77 20 69 6e 20 61 20 6d 61  te a row in a ma
2c70: 69 6e 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20  in table b-tree 
2c80: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 20 73 69 6e 67  */../*.** A sing
2c90: 6c 65 20 73 74 65 70 20 6f 66 20 61 6e 20 69 6e  le step of an in
2ca0: 63 72 65 6d 65 6e 74 61 6c 20 63 68 65 63 6b 70  cremental checkp
2cb0: 6f 69 6e 74 20 2d 20 66 72 61 6d 65 20 69 57 61  oint - frame iWa
2cc0: 6c 46 72 61 6d 65 20 6f 66 20 74 68 65 20 77 61  lFrame of the wa
2cd0: 6c 0a 2a 2a 20 66 69 6c 65 20 73 68 6f 75 6c 64  l.** file should
2ce0: 20 62 65 20 63 6f 70 69 65 64 20 74 6f 20 70 61   be copied to pa
2cf0: 67 65 20 69 44 62 50 61 67 65 20 6f 66 20 74 68  ge iDbPage of th
2d00: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2d10: 0a 2a 2f 0a 73 74 72 75 63 74 20 52 62 75 46 72  .*/.struct RbuFr
2d20: 61 6d 65 20 7b 0a 20 20 75 33 32 20 69 44 62 50  ame {.  u32 iDbP
2d30: 61 67 65 3b 0a 20 20 75 33 32 20 69 57 61 6c 46  age;.  u32 iWalF
2d40: 72 61 6d 65 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  rame;.};../*.** 
2d50: 52 42 55 20 68 61 6e 64 6c 65 2e 0a 2a 2a 0a 2a  RBU handle..**.*
2d60: 2a 20 6e 50 68 61 73 65 4f 6e 65 53 74 65 70 3a  * nPhaseOneStep:
2d70: 0a 2a 2a 20 20 20 49 66 20 74 68 65 20 52 42 55  .**   If the RBU
2d80: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69   database contai
2d90: 6e 73 20 61 6e 20 72 62 75 5f 63 6f 75 6e 74 20  ns an rbu_count 
2da0: 74 61 62 6c 65 2c 20 74 68 69 73 20 76 61 6c 75  table, this valu
2db0: 65 20 69 73 20 73 65 74 20 74 6f 0a 2a 2a 20 20  e is set to.**  
2dc0: 20 61 20 72 75 6e 6e 69 6e 67 20 65 73 74 69 6d   a running estim
2dd0: 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  ate of the numbe
2de0: 72 20 6f 66 20 62 2d 74 72 65 65 20 6f 70 65 72  r of b-tree oper
2df0: 61 74 69 6f 6e 73 20 72 65 71 75 69 72 65 64 20  ations required 
2e00: 74 6f 20 0a 2a 2a 20 20 20 66 69 6e 69 73 68 20  to .**   finish 
2e10: 70 6f 70 75 6c 61 74 69 6e 67 20 74 68 65 20 2a  populating the *
2e20: 2d 6f 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20  -oal file. This 
2e30: 61 6c 6c 6f 77 73 20 74 68 65 20 73 71 6c 69 74  allows the sqlit
2e40: 65 33 5f 62 70 5f 70 72 6f 67 72 65 73 73 28 29  e3_bp_progress()
2e50: 0a 2a 2a 20 20 20 41 50 49 20 74 6f 20 63 61 6c  .**   API to cal
2e60: 63 75 6c 61 74 65 20 74 68 65 20 70 65 72 6d 79  culate the permy
2e70: 72 69 61 64 61 67 65 20 70 72 6f 67 72 65 73 73  riadage progress
2e80: 20 6f 66 20 70 6f 70 75 6c 61 74 69 6e 67 20 74   of populating t
2e90: 68 65 20 2a 2d 6f 61 6c 20 66 69 6c 65 0a 2a 2a  he *-oal file.**
2ea0: 20 20 20 75 73 69 6e 67 20 74 68 65 20 66 6f 72     using the for
2eb0: 6d 75 6c 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  mula:.**.**     
2ec0: 70 65 72 6d 79 72 69 61 64 61 67 65 20 3d 20 28  permyriadage = (
2ed0: 31 30 30 30 30 20 2a 20 6e 50 72 6f 67 72 65 73  10000 * nProgres
2ee0: 73 29 20 2f 20 6e 50 68 61 73 65 4f 6e 65 53 74  s) / nPhaseOneSt
2ef0: 65 70 0a 2a 2a 0a 2a 2a 20 20 20 6e 50 68 61 73  ep.**.**   nPhas
2f00: 65 4f 6e 65 53 74 65 70 20 69 73 20 69 6e 69 74  eOneStep is init
2f10: 69 61 6c 69 7a 65 64 20 74 6f 20 74 68 65 20 73  ialized to the s
2f20: 75 6d 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  um of:.**.**    
2f30: 20 6e 52 6f 77 20 2a 20 28 6e 49 6e 64 65 78 20   nRow * (nIndex 
2f40: 2b 20 31 29 0a 2a 2a 0a 2a 2a 20 20 20 66 6f 72  + 1).**.**   for
2f50: 20 61 6c 6c 20 73 6f 75 72 63 65 20 74 61 62 6c   all source tabl
2f60: 65 73 20 69 6e 20 74 68 65 20 52 42 55 20 64 61  es in the RBU da
2f70: 74 61 62 61 73 65 2c 20 77 68 65 72 65 20 6e 52  tabase, where nR
2f80: 6f 77 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ow is the number
2f90: 0a 2a 2a 20 20 20 6f 66 20 72 6f 77 73 20 69 6e  .**   of rows in
2fa0: 20 74 68 65 20 73 6f 75 72 63 65 20 74 61 62 6c   the source tabl
2fb0: 65 20 61 6e 64 20 6e 49 6e 64 65 78 20 74 68 65  e and nIndex the
2fc0: 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 64 65 78   number of index
2fd0: 65 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 63  es on the.**   c
2fe0: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61 72  orresponding tar
2ff0: 67 65 74 20 64 61 74 61 62 61 73 65 20 74 61 62  get database tab
3000: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73  le..**.**   This
3010: 20 65 73 74 69 6d 61 74 65 20 69 73 20 61 63 63   estimate is acc
3020: 75 72 61 74 65 20 69 66 20 74 68 65 20 52 42 55  urate if the RBU
3030: 20 75 70 64 61 74 65 20 63 6f 6e 73 69 73 74 73   update consists
3040: 20 65 6e 74 69 72 65 6c 79 20 6f 66 0a 2a 2a 20   entirely of.** 
3050: 20 20 49 4e 53 45 52 54 20 6f 70 65 72 61 74 69    INSERT operati
3060: 6f 6e 73 2e 20 48 6f 77 65 76 65 72 2c 20 69 74  ons. However, it
3070: 20 69 73 20 69 6e 61 63 63 75 72 61 74 65 20 69   is inaccurate i
3080: 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 74  f:.**.**     * t
3090: 68 65 20 52 42 55 20 75 70 64 61 74 65 20 63 6f  he RBU update co
30a0: 6e 74 61 69 6e 73 20 61 6e 79 20 55 50 44 41 54  ntains any UPDAT
30b0: 45 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 49 66  E operations. If
30c0: 20 74 68 65 20 50 4b 20 73 70 65 63 69 66 69 65   the PK specifie
30d0: 64 0a 2a 2a 20 20 20 20 20 20 20 66 6f 72 20 61  d.**       for a
30e0: 6e 20 55 50 44 41 54 45 20 6f 70 65 72 61 74 69  n UPDATE operati
30f0: 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  on does not exis
3100: 74 20 69 6e 20 74 68 65 20 74 61 72 67 65 74 20  t in the target 
3110: 74 61 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20 20  table, then.**  
3120: 20 20 20 20 20 6e 6f 20 62 2d 74 72 65 65 20 6f       no b-tree o
3130: 70 65 72 61 74 69 6f 6e 73 20 61 72 65 20 72 65  perations are re
3140: 71 75 69 72 65 64 20 6f 6e 20 69 6e 64 65 78 20  quired on index 
3150: 62 2d 74 72 65 65 73 2e 20 4f 72 20 69 66 20 74  b-trees. Or if t
3160: 68 65 20 0a 2a 2a 20 20 20 20 20 20 20 73 70 65  he .**       spe
3170: 63 69 66 69 65 64 20 50 4b 20 64 6f 65 73 20 65  cified PK does e
3180: 78 69 73 74 2c 20 74 68 65 6e 20 28 6e 49 6e 64  xist, then (nInd
3190: 65 78 2a 32 29 20 73 75 63 68 20 6f 70 65 72 61  ex*2) such opera
31a0: 74 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 20 20 20  tions are.**    
31b0: 20 20 20 72 65 71 75 69 72 65 64 20 28 6f 6e 65     required (one
31c0: 20 64 65 6c 65 74 65 20 61 6e 64 20 6f 6e 65 20   delete and one 
31d0: 69 6e 73 65 72 74 20 6f 6e 20 65 61 63 68 20 69  insert on each i
31e0: 6e 64 65 78 20 62 2d 74 72 65 65 29 2e 0a 2a 2a  ndex b-tree)..**
31f0: 0a 2a 2a 20 20 20 20 20 2a 20 74 68 65 20 52 42  .**     * the RB
3200: 55 20 75 70 64 61 74 65 20 63 6f 6e 74 61 69 6e  U update contain
3210: 73 20 61 6e 79 20 44 45 4c 45 54 45 20 6f 70 65  s any DELETE ope
3220: 72 61 74 69 6f 6e 73 20 66 6f 72 20 77 68 69 63  rations for whic
3230: 68 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a  h the specified.
3240: 2a 2a 20 20 20 20 20 20 20 50 4b 20 64 6f 65 73  **       PK does
3250: 20 6e 6f 74 20 65 78 69 73 74 2e 20 49 6e 20 74   not exist. In t
3260: 68 69 73 20 63 61 73 65 20 6e 6f 20 6f 70 65 72  his case no oper
3270: 61 74 69 6f 6e 73 20 61 72 65 20 72 65 71 75 69  ations are requi
3280: 72 65 64 20 6f 6e 20 69 6e 64 65 78 0a 2a 2a 20  red on index.** 
3290: 20 20 20 20 20 20 62 2d 74 72 65 65 73 2e 0a 2a        b-trees..*
32a0: 2a 0a 2a 2a 20 20 20 20 20 2a 20 74 68 65 20 52  *.**     * the R
32b0: 42 55 20 75 70 64 61 74 65 20 63 6f 6e 74 61 69  BU update contai
32c0: 6e 73 20 52 45 50 4c 41 43 45 20 6f 70 65 72 61  ns REPLACE opera
32d0: 74 69 6f 6e 73 2e 20 54 68 65 73 65 20 61 72 65  tions. These are
32e0: 20 73 69 6d 69 6c 61 72 20 74 6f 0a 2a 2a 20 20   similar to.**  
32f0: 20 20 20 20 20 55 50 44 41 54 45 20 6f 70 65 72       UPDATE oper
3300: 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  ations..**.**   
3310: 6e 50 68 61 73 65 4f 6e 65 53 74 65 70 20 69 73  nPhaseOneStep is
3320: 20 75 70 64 61 74 65 64 20 74 6f 20 61 63 63 6f   updated to acco
3330: 75 6e 74 20 66 6f 72 20 74 68 65 20 63 6f 6e 64  unt for the cond
3340: 69 74 69 6f 6e 73 20 61 62 6f 76 65 20 64 75 72  itions above dur
3350: 69 6e 67 20 74 68 65 0a 2a 2a 20 20 20 66 69 72  ing the.**   fir
3360: 73 74 20 70 61 73 73 20 6f 66 20 65 61 63 68 20  st pass of each 
3370: 73 6f 75 72 63 65 20 74 61 62 6c 65 2e 20 54 68  source table. Th
3380: 65 20 75 70 64 61 74 65 64 20 6e 50 68 61 73 65  e updated nPhase
3390: 4f 6e 65 53 74 65 70 20 76 61 6c 75 65 20 69 73  OneStep value is
33a0: 0a 2a 2a 20 20 20 73 74 6f 72 65 64 20 69 6e 20  .**   stored in 
33b0: 74 68 65 20 72 62 75 5f 73 74 61 74 65 20 74 61  the rbu_state ta
33c0: 62 6c 65 20 69 66 20 74 68 65 20 52 42 55 20 75  ble if the RBU u
33d0: 70 64 61 74 65 20 69 73 20 73 75 73 70 65 6e 64  pdate is suspend
33e0: 65 64 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 73 71  ed..*/.struct sq
33f0: 6c 69 74 65 33 72 62 75 20 7b 0a 20 20 69 6e 74  lite3rbu {.  int
3400: 20 65 53 74 61 67 65 3b 20 20 20 20 20 20 20 20   eStage;        
3410: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3420: 56 61 6c 75 65 20 6f 66 20 52 42 55 5f 53 54 41  Value of RBU_STA
3430: 54 45 5f 53 54 41 47 45 20 66 69 65 6c 64 20 2a  TE_STAGE field *
3440: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 4d  /.  sqlite3 *dbM
3450: 61 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  ain;            
3460: 20 20 20 20 2f 2a 20 74 61 72 67 65 74 20 64 61      /* target da
3470: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f  tabase handle */
3480: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 52 62  .  sqlite3 *dbRb
3490: 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  u;              
34a0: 20 20 20 2f 2a 20 72 62 75 20 64 61 74 61 62 61     /* rbu databa
34b0: 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63  se handle */.  c
34c0: 68 61 72 20 2a 7a 54 61 72 67 65 74 3b 20 20 20  har *zTarget;   
34d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
34e0: 2a 20 50 61 74 68 20 74 6f 20 74 61 72 67 65 74  * Path to target
34f0: 20 64 62 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a   db */.  char *z
3500: 52 62 75 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rbu;            
3510: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 74 68           /* Path
3520: 20 74 6f 20 72 62 75 20 64 62 20 2a 2f 0a 20 20   to rbu db */.  
3530: 63 68 61 72 20 2a 7a 53 74 61 74 65 3b 20 20 20  char *zState;   
3540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3550: 2f 2a 20 50 61 74 68 20 74 6f 20 73 74 61 74 65  /* Path to state
3560: 20 64 62 20 28 6f 72 20 4e 55 4c 4c 20 69 66 20   db (or NULL if 
3570: 7a 52 62 75 29 20 2a 2f 0a 20 20 63 68 61 72 20  zRbu) */.  char 
3580: 7a 53 74 61 74 65 44 62 5b 35 5d 3b 20 20 20 20  zStateDb[5];    
3590: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 62             /* Db
35a0: 20 6e 61 6d 65 20 66 6f 72 20 73 74 61 74 65 20   name for state 
35b0: 28 22 73 74 61 74 22 20 6f 72 20 22 6d 61 69 6e  ("stat" or "main
35c0: 22 29 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  ") */.  int rc; 
35d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35e0: 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
35f0: 20 72 65 74 75 72 6e 65 64 20 62 79 20 6c 61 73   returned by las
3600: 74 20 72 62 75 5f 73 74 65 70 28 29 20 63 61 6c  t rbu_step() cal
3610: 6c 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 45 72  l */.  char *zEr
3620: 72 6d 73 67 3b 20 20 20 20 20 20 20 20 20 20 20  rmsg;           
3630: 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20         /* Error 
3640: 6d 65 73 73 61 67 65 20 69 66 20 72 63 21 3d 53  message if rc!=S
3650: 51 4c 49 54 45 5f 4f 4b 20 2a 2f 0a 20 20 69 6e  QLITE_OK */.  in
3660: 74 20 6e 53 74 65 70 3b 20 20 20 20 20 20 20 20  t nStep;        
3670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3680: 20 52 6f 77 73 20 70 72 6f 63 65 73 73 65 64 20   Rows processed 
3690: 66 6f 72 20 63 75 72 72 65 6e 74 20 6f 62 6a 65  for current obje
36a0: 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 72 6f  ct */.  int nPro
36b0: 67 72 65 73 73 3b 20 20 20 20 20 20 20 20 20 20  gress;          
36c0: 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 73 20          /* Rows 
36d0: 70 72 6f 63 65 73 73 65 64 20 66 6f 72 20 61 6c  processed for al
36e0: 6c 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 52  l objects */.  R
36f0: 62 75 4f 62 6a 49 74 65 72 20 6f 62 6a 69 74 65  buObjIter objite
3700: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r;             /
3710: 2a 20 49 74 65 72 61 74 6f 72 20 66 6f 72 20 73  * Iterator for s
3720: 6b 69 70 70 69 6e 67 20 74 68 72 6f 75 67 68 20  kipping through 
3730: 74 62 6c 2f 69 64 78 20 2a 2f 0a 20 20 63 6f 6e  tbl/idx */.  con
3740: 73 74 20 63 68 61 72 20 2a 7a 56 66 73 4e 61 6d  st char *zVfsNam
3750: 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
3760: 4e 61 6d 65 20 6f 66 20 61 75 74 6f 6d 61 74 69  Name of automati
3770: 63 61 6c 6c 79 20 63 72 65 61 74 65 64 20 72 62  cally created rb
3780: 75 20 76 66 73 20 2a 2f 0a 20 20 72 62 75 5f 66  u vfs */.  rbu_f
3790: 69 6c 65 20 2a 70 54 61 72 67 65 74 46 64 3b 20  ile *pTargetFd; 
37a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
37b0: 6c 65 20 68 61 6e 64 6c 65 20 6f 70 65 6e 20 6f  le handle open o
37c0: 6e 20 74 61 72 67 65 74 20 64 62 20 2a 2f 0a 20  n target db */. 
37d0: 20 69 6e 74 20 6e 50 61 67 65 50 65 72 53 65 63   int nPagePerSec
37e0: 74 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  tor;            
37f0: 20 2f 2a 20 50 61 67 65 73 20 70 65 72 20 73 65   /* Pages per se
3800: 63 74 6f 72 20 66 6f 72 20 70 54 61 72 67 65 74  ctor for pTarget
3810: 46 64 20 2a 2f 0a 20 20 69 36 34 20 69 4f 61 6c  Fd */.  i64 iOal
3820: 53 7a 3b 0a 20 20 69 36 34 20 6e 50 68 61 73 65  Sz;.  i64 nPhase
3830: 4f 6e 65 53 74 65 70 3b 0a 0a 20 20 2f 2a 20 54  OneStep;..  /* T
3840: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 61  he following sta
3850: 74 65 20 76 61 72 69 61 62 6c 65 73 20 61 72 65  te variables are
3860: 20 75 73 65 64 20 61 73 20 70 61 72 74 20 6f 66   used as part of
3870: 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c   the incremental
3880: 0a 20 20 2a 2a 20 63 68 65 63 6b 70 6f 69 6e 74  .  ** checkpoint
3890: 20 73 74 61 67 65 20 28 65 53 74 61 67 65 3d 3d   stage (eStage==
38a0: 52 42 55 5f 53 54 41 47 45 5f 43 4b 50 54 29 2e  RBU_STAGE_CKPT).
38b0: 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 73 75   See comments su
38c0: 72 72 6f 75 6e 64 69 6e 67 0a 20 20 2a 2a 20 66  rrounding.  ** f
38d0: 75 6e 63 74 69 6f 6e 20 72 62 75 53 65 74 75 70  unction rbuSetup
38e0: 43 68 65 63 6b 70 6f 69 6e 74 28 29 20 66 6f 72  Checkpoint() for
38f0: 20 64 65 74 61 69 6c 73 2e 20 20 2a 2f 0a 20 20   details.  */.  
3900: 75 33 32 20 69 4d 61 78 46 72 61 6d 65 3b 20 20  u32 iMaxFrame;  
3910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3920: 2f 2a 20 4c 61 72 67 65 73 74 20 69 57 61 6c 46  /* Largest iWalF
3930: 72 61 6d 65 20 76 61 6c 75 65 20 69 6e 20 61 46  rame value in aF
3940: 72 61 6d 65 5b 5d 20 2a 2f 0a 20 20 75 33 32 20  rame[] */.  u32 
3950: 6d 4c 6f 63 6b 3b 0a 20 20 69 6e 74 20 6e 46 72  mLock;.  int nFr
3960: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
3970: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 74 72           /* Entr
3980: 69 65 73 20 69 6e 20 61 46 72 61 6d 65 5b 5d 20  ies in aFrame[] 
3990: 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 6e  array */.  int n
39a0: 46 72 61 6d 65 41 6c 6c 6f 63 3b 20 20 20 20 20  FrameAlloc;     
39b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
39c0: 6c 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20  located size of 
39d0: 61 46 72 61 6d 65 5b 5d 20 61 72 72 61 79 20 2a  aFrame[] array *
39e0: 2f 0a 20 20 52 62 75 46 72 61 6d 65 20 2a 61 46  /.  RbuFrame *aF
39f0: 72 61 6d 65 3b 0a 20 20 69 6e 74 20 70 67 73 7a  rame;.  int pgsz
3a00: 3b 0a 20 20 75 38 20 2a 61 42 75 66 3b 0a 20 20  ;.  u8 *aBuf;.  
3a10: 69 36 34 20 69 57 61 6c 43 6b 73 75 6d 3b 0a 20  i64 iWalCksum;. 
3a20: 20 69 36 34 20 73 7a 54 65 6d 70 3b 20 20 20 20   i64 szTemp;    
3a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a40: 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 69 7a 65   /* Current size
3a50: 20 6f 66 20 61 6c 6c 20 74 65 6d 70 20 66 69 6c   of all temp fil
3a60: 65 73 20 69 6e 20 75 73 65 20 2a 2f 0a 20 20 69  es in use */.  i
3a70: 36 34 20 73 7a 54 65 6d 70 4c 69 6d 69 74 3b 20  64 szTempLimit; 
3a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3a90: 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 6c 69 6d  * Total size lim
3aa0: 69 74 20 66 6f 72 20 74 65 6d 70 20 66 69 6c 65  it for temp file
3ab0: 73 20 2a 2f 0a 0a 20 20 2f 2a 20 55 73 65 64 20  s */..  /* Used 
3ac0: 69 6e 20 52 42 55 20 76 61 63 75 75 6d 20 6d 6f  in RBU vacuum mo
3ad0: 64 65 20 6f 6e 6c 79 20 2a 2f 0a 20 20 69 6e 74  de only */.  int
3ae0: 20 6e 52 62 75 3b 20 20 20 20 20 20 20 20 20 20   nRbu;          
3af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3b00: 4e 75 6d 62 65 72 20 6f 66 20 52 42 55 20 56 46  Number of RBU VF
3b10: 53 20 69 6e 20 74 68 65 20 73 74 61 63 6b 20 2a  S in the stack *
3b20: 2f 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 52  /.  rbu_file *pR
3b30: 62 75 46 64 3b 20 20 20 20 20 20 20 20 20 20 20  buFd;           
3b40: 20 20 20 20 2f 2a 20 46 64 20 66 6f 72 20 6d 61      /* Fd for ma
3b50: 69 6e 20 64 62 20 6f 66 20 64 62 52 62 75 20 2a  in db of dbRbu *
3b60: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 72  /.};../*.** An r
3b70: 62 75 20 56 46 53 20 69 73 20 69 6d 70 6c 65 6d  bu VFS is implem
3b80: 65 6e 74 65 64 20 75 73 69 6e 67 20 61 6e 20 69  ented using an i
3b90: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20  nstance of this 
3ba0: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a  structure..**.**
3bb0: 20 56 61 72 69 61 62 6c 65 20 70 52 62 75 20 69   Variable pRbu i
3bc0: 73 20 6f 6e 6c 79 20 6e 6f 6e 2d 4e 55 4c 4c 20  s only non-NULL 
3bd0: 66 6f 72 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  for automaticall
3be0: 79 20 63 72 65 61 74 65 64 20 52 42 55 20 56 46  y created RBU VF
3bf0: 53 20 6f 62 6a 65 63 74 73 2e 0a 2a 2a 20 49 74  S objects..** It
3c00: 20 69 73 20 4e 55 4c 4c 20 66 6f 72 20 52 42 55   is NULL for RBU
3c10: 20 56 46 53 20 6f 62 6a 65 63 74 73 20 63 72 65   VFS objects cre
3c20: 61 74 65 64 20 65 78 70 6c 69 63 69 74 6c 79 20  ated explicitly 
3c30: 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33  using.** sqlite3
3c40: 72 62 75 5f 63 72 65 61 74 65 5f 76 66 73 28 29  rbu_create_vfs()
3c50: 2e 20 49 74 20 69 73 20 75 73 65 64 20 74 6f 20  . It is used to 
3c60: 74 72 61 63 6b 20 74 68 65 20 74 6f 74 61 6c 20  track the total 
3c70: 61 6d 6f 75 6e 74 20 6f 66 20 74 65 6d 70 0a 2a  amount of temp.*
3c80: 2a 20 73 70 61 63 65 20 75 73 65 64 20 62 79 20  * space used by 
3c90: 74 68 65 20 52 42 55 20 68 61 6e 64 6c 65 2e 0a  the RBU handle..
3ca0: 2a 2f 0a 73 74 72 75 63 74 20 72 62 75 5f 76 66  */.struct rbu_vf
3cb0: 73 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  s {.  sqlite3_vf
3cc0: 73 20 62 61 73 65 3b 20 20 20 20 20 20 20 20 20  s base;         
3cd0: 20 20 20 20 20 20 2f 2a 20 72 62 75 20 56 46 53        /* rbu VFS
3ce0: 20 73 68 69 6d 20 6d 65 74 68 6f 64 73 20 2a 2f   shim methods */
3cf0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
3d00: 70 52 65 61 6c 56 66 73 3b 20 20 20 20 20 20 20  pRealVfs;       
3d10: 20 20 20 2f 2a 20 55 6e 64 65 72 6c 79 69 6e 67     /* Underlying
3d20: 20 56 46 53 20 2a 2f 0a 20 20 73 71 6c 69 74 65   VFS */.  sqlite
3d30: 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 3b 20  3_mutex *mutex; 
3d40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 74            /* Mut
3d50: 65 78 20 74 6f 20 70 72 6f 74 65 63 74 20 70 4d  ex to protect pM
3d60: 61 69 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ain */.  sqlite3
3d70: 72 62 75 20 2a 70 52 62 75 3b 20 20 20 20 20 20  rbu *pRbu;      
3d80: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 77 6e 65           /* Owne
3d90: 72 20 52 42 55 20 6f 62 6a 65 63 74 20 2a 2f 0a  r RBU object */.
3da0: 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 4d 61 69    rbu_file *pMai
3db0: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
3dc0: 20 20 2f 2a 20 4c 69 6e 6b 65 64 20 6c 69 73 74    /* Linked list
3dd0: 20 6f 66 20 6d 61 69 6e 20 64 62 20 66 69 6c 65   of main db file
3de0: 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 45  s */.};../*.** E
3df0: 61 63 68 20 66 69 6c 65 20 6f 70 65 6e 65 64 20  ach file opened 
3e00: 62 79 20 61 6e 20 72 62 75 20 56 46 53 20 69 73  by an rbu VFS is
3e10: 20 72 65 70 72 65 73 65 6e 74 65 64 20 62 79 20   represented by 
3e20: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 0a 2a  an instance of.*
3e30: 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * the following 
3e40: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a  structure..**.**
3e50: 20 49 66 20 74 68 69 73 20 69 73 20 61 20 74 65   If this is a te
3e60: 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 28 70 52  mporary file (pR
3e70: 62 75 21 3d 30 20 26 26 20 66 6c 61 67 73 26 44  bu!=0 && flags&D
3e80: 45 4c 45 54 45 5f 4f 4e 5f 43 4c 4f 53 45 29 2c  ELETE_ON_CLOSE),
3e90: 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 22 73 7a   variable.** "sz
3ea0: 22 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  " is set to the 
3eb0: 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20  current size of 
3ec0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
3ed0: 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 72 62 75  e..*/.struct rbu
3ee0: 5f 66 69 6c 65 20 7b 0a 20 20 73 71 6c 69 74 65  _file {.  sqlite
3ef0: 33 5f 66 69 6c 65 20 62 61 73 65 3b 20 20 20 20  3_file base;    
3f00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
3f10: 69 74 65 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64  ite3_file method
3f20: 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  s */.  sqlite3_f
3f30: 69 6c 65 20 2a 70 52 65 61 6c 3b 20 20 20 20 20  ile *pReal;     
3f40: 20 20 20 20 20 20 20 2f 2a 20 55 6e 64 65 72 6c         /* Underl
3f50: 79 69 6e 67 20 66 69 6c 65 20 68 61 6e 64 6c 65  ying file handle
3f60: 20 2a 2f 0a 20 20 72 62 75 5f 76 66 73 20 2a 70   */.  rbu_vfs *p
3f70: 52 62 75 56 66 73 3b 20 20 20 20 20 20 20 20 20  RbuVfs;         
3f80: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
3f90: 20 74 6f 20 74 68 65 20 72 62 75 5f 76 66 73 20   to the rbu_vfs 
3fa0: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69  object */.  sqli
3fb0: 74 65 33 72 62 75 20 2a 70 52 62 75 3b 20 20 20  te3rbu *pRbu;   
3fc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
3fd0: 6f 69 6e 74 65 72 20 74 6f 20 72 62 75 20 6f 62  ointer to rbu ob
3fe0: 6a 65 63 74 20 28 72 62 75 20 74 61 72 67 65 74  ject (rbu target
3ff0: 20 6f 6e 6c 79 29 20 2a 2f 0a 20 20 69 36 34 20   only) */.  i64 
4000: 73 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sz;             
4010: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
4020: 69 7a 65 20 6f 66 20 66 69 6c 65 20 69 6e 20 62  ize of file in b
4030: 79 74 65 73 20 28 74 65 6d 70 20 6f 6e 6c 79 29  ytes (temp only)
4040: 20 2a 2f 0a 0a 20 20 69 6e 74 20 6f 70 65 6e 46   */..  int openF
4050: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
4060: 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
4070: 74 68 69 73 20 66 69 6c 65 20 77 61 73 20 6f 70  this file was op
4080: 65 6e 65 64 20 77 69 74 68 20 2a 2f 0a 20 20 75  ened with */.  u
4090: 33 32 20 69 43 6f 6f 6b 69 65 3b 20 20 20 20 20  32 iCookie;     
40a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
40b0: 2a 20 43 6f 6f 6b 69 65 20 76 61 6c 75 65 20 66  * Cookie value f
40c0: 6f 72 20 6d 61 69 6e 20 64 62 20 66 69 6c 65 73  or main db files
40d0: 20 2a 2f 0a 20 20 75 38 20 69 57 72 69 74 65 56   */.  u8 iWriteV
40e0: 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  er;             
40f0: 20 20 20 20 20 20 2f 2a 20 22 77 72 69 74 65 2d        /* "write-
4100: 76 65 72 73 69 6f 6e 22 20 76 61 6c 75 65 20 66  version" value f
4110: 6f 72 20 6d 61 69 6e 20 64 62 20 66 69 6c 65 73  or main db files
4120: 20 2a 2f 0a 20 20 75 38 20 62 4e 6f 6c 6f 63 6b   */.  u8 bNolock
4130: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4140: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
4150: 20 66 61 69 6c 20 45 58 43 4c 55 53 49 56 45 20   fail EXCLUSIVE 
4160: 6c 6f 63 6b 73 20 2a 2f 0a 0a 20 20 69 6e 74 20  locks */..  int 
4170: 6e 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20  nShm;           
4180: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
4190: 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
41a0: 20 69 6e 20 61 70 53 68 6d 5b 5d 20 61 72 72 61   in apShm[] arra
41b0: 79 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 70  y */.  char **ap
41c0: 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Shm;            
41d0: 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
41e0: 6f 66 20 6d 6d 61 70 27 64 20 2a 2d 73 68 6d 20  of mmap'd *-shm 
41f0: 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 63 68 61  regions */.  cha
4200: 72 20 2a 7a 44 65 6c 3b 20 20 20 20 20 20 20 20  r *zDel;        
4210: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4220: 44 65 6c 65 74 65 20 74 68 69 73 20 77 68 65 6e  Delete this when
4230: 20 63 6c 6f 73 69 6e 67 20 66 69 6c 65 20 2a 2f   closing file */
4240: 0a 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ..  const char *
4250: 7a 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  zWal;           
4260: 20 20 20 20 2f 2a 20 57 61 6c 20 66 69 6c 65 6e      /* Wal filen
4270: 61 6d 65 20 66 6f 72 20 74 68 69 73 20 6d 61 69  ame for this mai
4280: 6e 20 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20 72  n db file */.  r
4290: 62 75 5f 66 69 6c 65 20 2a 70 57 61 6c 46 64 3b  bu_file *pWalFd;
42a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
42b0: 2a 20 57 61 6c 20 66 69 6c 65 20 64 65 73 63 72  * Wal file descr
42c0: 69 70 74 6f 72 20 66 6f 72 20 74 68 69 73 20 6d  iptor for this m
42d0: 61 69 6e 20 64 62 20 2a 2f 0a 20 20 72 62 75 5f  ain db */.  rbu_
42e0: 66 69 6c 65 20 2a 70 4d 61 69 6e 4e 65 78 74 3b  file *pMainNext;
42f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
4300: 65 78 74 20 4d 41 49 4e 5f 44 42 20 66 69 6c 65  ext MAIN_DB file
4310: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 72   */.};../*.** Tr
4320: 75 65 20 66 6f 72 20 61 6e 20 52 42 55 20 76 61  ue for an RBU va
4330: 63 75 75 6d 20 68 61 6e 64 6c 65 2c 20 6f 72 20  cuum handle, or 
4340: 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e  false otherwise.
4350: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 72 62 75 49  .*/.#define rbuI
4360: 73 56 61 63 75 75 6d 28 70 29 20 28 28 70 29 2d  sVacuum(p) ((p)-
4370: 3e 7a 54 61 72 67 65 74 3d 3d 30 29 0a 0a 0a 2f  >zTarget==0).../
4380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4390: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
43a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
43b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
43c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65  *********.** The
43d0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 72 65 65   following three
43e0: 20 66 75 6e 63 74 69 6f 6e 73 2c 20 66 6f 75 6e   functions, foun
43f0: 64 20 62 65 6c 6f 77 3a 0a 2a 2a 0a 2a 2a 20 20  d below:.**.**  
4400: 20 72 62 75 44 65 6c 74 61 47 65 74 49 6e 74 28   rbuDeltaGetInt(
4410: 29 0a 2a 2a 20 20 20 72 62 75 44 65 6c 74 61 43  ).**   rbuDeltaC
4420: 68 65 63 6b 73 75 6d 28 29 0a 2a 2a 20 20 20 72  hecksum().**   r
4430: 62 75 44 65 6c 74 61 41 70 70 6c 79 28 29 0a 2a  buDeltaApply().*
4440: 2a 0a 2a 2a 20 61 72 65 20 6c 69 66 74 65 64 20  *.** are lifted 
4450: 66 72 6f 6d 20 74 68 65 20 66 6f 73 73 69 6c 20  from the fossil 
4460: 73 6f 75 72 63 65 20 63 6f 64 65 20 28 68 74 74  source code (htt
4470: 70 3a 2f 2f 66 6f 73 73 69 6c 2d 73 63 6d 2e 6f  p://fossil-scm.o
4480: 72 67 29 2e 20 54 68 65 79 0a 2a 2a 20 61 72 65  rg). They.** are
4490: 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
44a0: 6e 74 20 74 68 65 20 73 63 61 6c 61 72 20 53 51  nt the scalar SQ
44b0: 4c 20 66 75 6e 63 74 69 6f 6e 20 72 62 75 5f 66  L function rbu_f
44c0: 6f 73 73 69 6c 5f 64 65 6c 74 61 28 29 2e 0a 2a  ossil_delta()..*
44d0: 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 62 79  /../*.** Read by
44e0: 74 65 73 20 66 72 6f 6d 20 2a 70 7a 20 61 6e 64  tes from *pz and
44f0: 20 63 6f 6e 76 65 72 74 20 74 68 65 6d 20 69 6e   convert them in
4500: 74 6f 20 61 20 70 6f 73 69 74 69 76 65 20 69 6e  to a positive in
4510: 74 65 67 65 72 2e 20 20 57 68 65 6e 0a 2a 2a 20  teger.  When.** 
4520: 66 69 6e 69 73 68 65 64 2c 20 6c 65 61 76 65 20  finished, leave 
4530: 2a 70 7a 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  *pz pointing to 
4540: 74 68 65 20 66 69 72 73 74 20 63 68 61 72 61 63  the first charac
4550: 74 65 72 20 70 61 73 74 20 74 68 65 20 65 6e 64  ter past the end
4560: 20 6f 66 0a 2a 2a 20 74 68 65 20 69 6e 74 65 67   of.** the integ
4570: 65 72 2e 20 20 54 68 65 20 2a 70 4c 65 6e 20 70  er.  The *pLen p
4580: 61 72 61 6d 65 74 65 72 20 68 6f 6c 64 73 20 74  arameter holds t
4590: 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65  he length of the
45a0: 20 73 74 72 69 6e 67 0a 2a 2a 20 69 6e 20 2a 70   string.** in *p
45b0: 7a 20 61 6e 64 20 69 73 20 64 65 63 72 65 6d 65  z and is decreme
45c0: 6e 74 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61  nted once for ea
45d0: 63 68 20 63 68 61 72 61 63 74 65 72 20 69 6e 20  ch character in 
45e0: 74 68 65 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a  the integer..*/.
45f0: 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20  static unsigned 
4600: 69 6e 74 20 72 62 75 44 65 6c 74 61 47 65 74 49  int rbuDeltaGetI
4610: 6e 74 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a  nt(const char **
4620: 70 7a 2c 20 69 6e 74 20 2a 70 4c 65 6e 29 7b 0a  pz, int *pLen){.
4630: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
4640: 69 67 6e 65 64 20 63 68 61 72 20 7a 56 61 6c 75  igned char zValu
4650: 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 2d 31 2c 20  e[] = {.    -1, 
4660: 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20  -1, -1, -1, -1, 
4670: 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 20 20 2d 31  -1, -1, -1,   -1
4680: 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31  , -1, -1, -1, -1
4690: 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 0a 20 20  , -1, -1, -1,.  
46a0: 20 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31    -1, -1, -1, -1
46b0: 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31  , -1, -1, -1, -1
46c0: 2c 20 20 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20  ,   -1, -1, -1, 
46d0: 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20  -1, -1, -1, -1, 
46e0: 2d 31 2c 0a 20 20 20 20 2d 31 2c 20 2d 31 2c 20  -1,.    -1, -1, 
46f0: 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20  -1, -1, -1, -1, 
4700: 2d 31 2c 20 2d 31 2c 20 20 20 2d 31 2c 20 2d 31  -1, -1,   -1, -1
4710: 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31  , -1, -1, -1, -1
4720: 2c 20 2d 31 2c 20 2d 31 2c 0a 20 20 20 20 20 30  , -1, -1,.     0
4730: 2c 20 20 31 2c 20 20 32 2c 20 20 33 2c 20 20 34  ,  1,  2,  3,  4
4740: 2c 20 20 35 2c 20 20 36 2c 20 20 37 2c 20 20 20  ,  5,  6,  7,   
4750: 20 38 2c 20 20 39 2c 20 2d 31 2c 20 2d 31 2c 20   8,  9, -1, -1, 
4760: 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 0a  -1, -1, -1, -1,.
4770: 20 20 20 20 2d 31 2c 20 31 30 2c 20 31 31 2c 20      -1, 10, 11, 
4780: 31 32 2c 20 31 33 2c 20 31 34 2c 20 31 35 2c 20  12, 13, 14, 15, 
4790: 31 36 2c 20 20 20 31 37 2c 20 31 38 2c 20 31 39  16,   17, 18, 19
47a0: 2c 20 32 30 2c 20 32 31 2c 20 32 32 2c 20 32 33  , 20, 21, 22, 23
47b0: 2c 20 32 34 2c 0a 20 20 20 20 32 35 2c 20 32 36  , 24,.    25, 26
47c0: 2c 20 32 37 2c 20 32 38 2c 20 32 39 2c 20 33 30  , 27, 28, 29, 30
47d0: 2c 20 33 31 2c 20 33 32 2c 20 20 20 33 33 2c 20  , 31, 32,   33, 
47e0: 33 34 2c 20 33 35 2c 20 2d 31 2c 20 2d 31 2c 20  34, 35, -1, -1, 
47f0: 2d 31 2c 20 2d 31 2c 20 33 36 2c 0a 20 20 20 20  -1, -1, 36,.    
4800: 2d 31 2c 20 33 37 2c 20 33 38 2c 20 33 39 2c 20  -1, 37, 38, 39, 
4810: 34 30 2c 20 34 31 2c 20 34 32 2c 20 34 33 2c 20  40, 41, 42, 43, 
4820: 20 20 34 34 2c 20 34 35 2c 20 34 36 2c 20 34 37    44, 45, 46, 47
4830: 2c 20 34 38 2c 20 34 39 2c 20 35 30 2c 20 35 31  , 48, 49, 50, 51
4840: 2c 0a 20 20 20 20 35 32 2c 20 35 33 2c 20 35 34  ,.    52, 53, 54
4850: 2c 20 35 35 2c 20 35 36 2c 20 35 37 2c 20 35 38  , 55, 56, 57, 58
4860: 2c 20 35 39 2c 20 20 20 36 30 2c 20 36 31 2c 20  , 59,   60, 61, 
4870: 36 32 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20  62, -1, -1, -1, 
4880: 36 33 2c 20 2d 31 2c 0a 20 20 7d 3b 0a 20 20 75  63, -1,.  };.  u
4890: 6e 73 69 67 6e 65 64 20 69 6e 74 20 76 20 3d 20  nsigned int v = 
48a0: 30 3b 0a 20 20 69 6e 74 20 63 3b 0a 20 20 75 6e  0;.  int c;.  un
48b0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 20 3d  signed char *z =
48c0: 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a   (unsigned char*
48d0: 29 2a 70 7a 3b 0a 20 20 75 6e 73 69 67 6e 65 64  )*pz;.  unsigned
48e0: 20 63 68 61 72 20 2a 7a 53 74 61 72 74 20 3d 20   char *zStart = 
48f0: 7a 3b 0a 20 20 77 68 69 6c 65 28 20 28 63 20 3d  z;.  while( (c =
4900: 20 7a 56 61 6c 75 65 5b 30 78 37 66 26 2a 28 7a   zValue[0x7f&*(z
4910: 2b 2b 29 5d 29 3e 3d 30 20 29 7b 0a 20 20 20 20  ++)])>=0 ){.    
4920: 20 76 20 3d 20 28 76 3c 3c 36 29 20 2b 20 63 3b   v = (v<<6) + c;
4930: 0a 20 20 7d 0a 20 20 7a 2d 2d 3b 0a 20 20 2a 70  .  }.  z--;.  *p
4940: 4c 65 6e 20 2d 3d 20 7a 20 2d 20 7a 53 74 61 72  Len -= z - zStar
4950: 74 3b 0a 20 20 2a 70 7a 20 3d 20 28 63 68 61 72  t;.  *pz = (char
4960: 2a 29 7a 3b 0a 20 20 72 65 74 75 72 6e 20 76 3b  *)z;.  return v;
4970: 0a 7d 0a 0a 23 69 66 20 52 42 55 5f 45 4e 41 42  .}..#if RBU_ENAB
4980: 4c 45 5f 44 45 4c 54 41 5f 43 4b 53 55 4d 0a 2f  LE_DELTA_CKSUM./
4990: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 33  *.** Compute a 3
49a0: 32 2d 62 69 74 20 63 68 65 63 6b 73 75 6d 20 6f  2-bit checksum o
49b0: 6e 20 74 68 65 20 4e 2d 62 79 74 65 20 62 75 66  n the N-byte buf
49c0: 66 65 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65  fer.  Return the
49d0: 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74   result..*/.stat
49e0: 69 63 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  ic unsigned int 
49f0: 72 62 75 44 65 6c 74 61 43 68 65 63 6b 73 75 6d  rbuDeltaChecksum
4a00: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e  (const char *zIn
4a10: 2c 20 73 69 7a 65 5f 74 20 4e 29 7b 0a 20 20 63  , size_t N){.  c
4a20: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
4a30: 61 72 20 2a 7a 20 3d 20 28 63 6f 6e 73 74 20 75  ar *z = (const u
4a40: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 7a  nsigned char *)z
4a50: 49 6e 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 73  In;.  unsigned s
4a60: 75 6d 30 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67  um0 = 0;.  unsig
4a70: 6e 65 64 20 73 75 6d 31 20 3d 20 30 3b 0a 20 20  ned sum1 = 0;.  
4a80: 75 6e 73 69 67 6e 65 64 20 73 75 6d 32 20 3d 20  unsigned sum2 = 
4a90: 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 73 75  0;.  unsigned su
4aa0: 6d 33 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28  m3 = 0;.  while(
4ab0: 4e 20 3e 3d 20 31 36 29 7b 0a 20 20 20 20 73 75  N >= 16){.    su
4ac0: 6d 30 20 2b 3d 20 28 28 75 6e 73 69 67 6e 65 64  m0 += ((unsigned
4ad0: 29 7a 5b 30 5d 20 2b 20 7a 5b 34 5d 20 2b 20 7a  )z[0] + z[4] + z
4ae0: 5b 38 5d 20 2b 20 7a 5b 31 32 5d 29 3b 0a 20 20  [8] + z[12]);.  
4af0: 20 20 73 75 6d 31 20 2b 3d 20 28 28 75 6e 73 69    sum1 += ((unsi
4b00: 67 6e 65 64 29 7a 5b 31 5d 20 2b 20 7a 5b 35 5d  gned)z[1] + z[5]
4b10: 20 2b 20 7a 5b 39 5d 20 2b 20 7a 5b 31 33 5d 29   + z[9] + z[13])
4b20: 3b 0a 20 20 20 20 73 75 6d 32 20 2b 3d 20 28 28  ;.    sum2 += ((
4b30: 75 6e 73 69 67 6e 65 64 29 7a 5b 32 5d 20 2b 20  unsigned)z[2] + 
4b40: 7a 5b 36 5d 20 2b 20 7a 5b 31 30 5d 2b 20 7a 5b  z[6] + z[10]+ z[
4b50: 31 34 5d 29 3b 0a 20 20 20 20 73 75 6d 33 20 2b  14]);.    sum3 +
4b60: 3d 20 28 28 75 6e 73 69 67 6e 65 64 29 7a 5b 33  = ((unsigned)z[3
4b70: 5d 20 2b 20 7a 5b 37 5d 20 2b 20 7a 5b 31 31 5d  ] + z[7] + z[11]
4b80: 2b 20 7a 5b 31 35 5d 29 3b 0a 20 20 20 20 7a 20  + z[15]);.    z 
4b90: 2b 3d 20 31 36 3b 0a 20 20 20 20 4e 20 2d 3d 20  += 16;.    N -= 
4ba0: 31 36 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28  16;.  }.  while(
4bb0: 4e 20 3e 3d 20 34 29 7b 0a 20 20 20 20 73 75 6d  N >= 4){.    sum
4bc0: 30 20 2b 3d 20 7a 5b 30 5d 3b 0a 20 20 20 20 73  0 += z[0];.    s
4bd0: 75 6d 31 20 2b 3d 20 7a 5b 31 5d 3b 0a 20 20 20  um1 += z[1];.   
4be0: 20 73 75 6d 32 20 2b 3d 20 7a 5b 32 5d 3b 0a 20   sum2 += z[2];. 
4bf0: 20 20 20 73 75 6d 33 20 2b 3d 20 7a 5b 33 5d 3b     sum3 += z[3];
4c00: 0a 20 20 20 20 7a 20 2b 3d 20 34 3b 0a 20 20 20  .    z += 4;.   
4c10: 20 4e 20 2d 3d 20 34 3b 0a 20 20 7d 0a 20 20 73   N -= 4;.  }.  s
4c20: 75 6d 33 20 2b 3d 20 28 73 75 6d 32 20 3c 3c 20  um3 += (sum2 << 
4c30: 38 29 20 2b 20 28 73 75 6d 31 20 3c 3c 20 31 36  8) + (sum1 << 16
4c40: 29 20 2b 20 28 73 75 6d 30 20 3c 3c 20 32 34 29  ) + (sum0 << 24)
4c50: 3b 0a 20 20 73 77 69 74 63 68 28 4e 29 7b 0a 20  ;.  switch(N){. 
4c60: 20 20 20 63 61 73 65 20 33 3a 20 20 20 73 75 6d     case 3:   sum
4c70: 33 20 2b 3d 20 28 7a 5b 32 5d 20 3c 3c 20 38 29  3 += (z[2] << 8)
4c80: 3b 0a 20 20 20 20 63 61 73 65 20 32 3a 20 20 20  ;.    case 2:   
4c90: 73 75 6d 33 20 2b 3d 20 28 7a 5b 31 5d 20 3c 3c  sum3 += (z[1] <<
4ca0: 20 31 36 29 3b 0a 20 20 20 20 63 61 73 65 20 31   16);.    case 1
4cb0: 3a 20 20 20 73 75 6d 33 20 2b 3d 20 28 7a 5b 30  :   sum3 += (z[0
4cc0: 5d 20 3c 3c 20 32 34 29 3b 0a 20 20 20 20 64 65  ] << 24);.    de
4cd0: 66 61 75 6c 74 3a 20 20 3b 0a 20 20 7d 0a 20 20  fault:  ;.  }.  
4ce0: 72 65 74 75 72 6e 20 73 75 6d 33 3b 0a 7d 0a 23  return sum3;.}.#
4cf0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 70 70  endif../*.** App
4d00: 6c 79 20 61 20 64 65 6c 74 61 2e 0a 2a 2a 0a 2a  ly a delta..**.*
4d10: 2a 20 54 68 65 20 6f 75 74 70 75 74 20 62 75 66  * The output buf
4d20: 66 65 72 20 73 68 6f 75 6c 64 20 62 65 20 62 69  fer should be bi
4d30: 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64  g enough to hold
4d40: 20 74 68 65 20 77 68 6f 6c 65 20 6f 75 74 70 75   the whole outpu
4d50: 74 0a 2a 2a 20 66 69 6c 65 20 61 6e 64 20 61 20  t.** file and a 
4d60: 4e 55 4c 20 74 65 72 6d 69 6e 61 74 6f 72 20 61  NUL terminator a
4d70: 74 20 74 68 65 20 65 6e 64 2e 20 20 54 68 65 20  t the end.  The 
4d80: 64 65 6c 74 61 5f 6f 75 74 70 75 74 5f 73 69 7a  delta_output_siz
4d90: 65 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77  e().** routine w
4da0: 69 6c 6c 20 64 65 74 65 72 6d 69 6e 65 20 74 68  ill determine th
4db0: 69 73 20 73 69 7a 65 20 66 6f 72 20 79 6f 75 2e  is size for you.
4dc0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 6c 74 61  .**.** The delta
4dd0: 20 73 74 72 69 6e 67 20 73 68 6f 75 6c 64 20 62   string should b
4de0: 65 20 6e 75 6c 6c 2d 74 65 72 6d 69 6e 61 74 65  e null-terminate
4df0: 64 2e 20 20 42 75 74 20 74 68 65 20 64 65 6c 74  d.  But the delt
4e00: 61 20 73 74 72 69 6e 67 0a 2a 2a 20 6d 61 79 20  a string.** may 
4e10: 63 6f 6e 74 61 69 6e 20 65 6d 62 65 64 64 65 64  contain embedded
4e20: 20 4e 55 4c 20 63 68 61 72 61 63 74 65 72 73 20   NUL characters 
4e30: 28 69 66 20 74 68 65 20 69 6e 70 75 74 20 61 6e  (if the input an
4e40: 64 20 6f 75 74 70 75 74 20 61 72 65 0a 2a 2a 20  d output are.** 
4e50: 62 69 6e 61 72 79 20 66 69 6c 65 73 29 20 73 6f  binary files) so
4e60: 20 77 65 20 61 6c 73 6f 20 68 61 76 65 20 74 6f   we also have to
4e70: 20 70 61 73 73 20 69 6e 20 74 68 65 20 6c 65 6e   pass in the len
4e80: 67 74 68 20 6f 66 20 74 68 65 20 64 65 6c 74 61  gth of the delta
4e90: 20 69 6e 0a 2a 2a 20 74 68 65 20 6c 65 6e 44 65   in.** the lenDe
4ea0: 6c 74 61 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a  lta parameter..*
4eb0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
4ec0: 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 73  on returns the s
4ed0: 69 7a 65 20 6f 66 20 74 68 65 20 6f 75 74 70 75  ize of the outpu
4ee0: 74 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20  t file in bytes 
4ef0: 28 65 78 63 6c 75 64 69 6e 67 0a 2a 2a 20 74 68  (excluding.** th
4f00: 65 20 66 69 6e 61 6c 20 4e 55 4c 20 74 65 72 6d  e final NUL term
4f10: 69 6e 61 74 6f 72 20 63 68 61 72 61 63 74 65 72  inator character
4f20: 29 2e 20 20 45 78 63 65 70 74 2c 20 69 66 20 74  ).  Except, if t
4f30: 68 65 20 64 65 6c 74 61 20 73 74 72 69 6e 67 20  he delta string 
4f40: 69 73 0a 2a 2a 20 6d 61 6c 66 6f 72 6d 65 64 20  is.** malformed 
4f50: 6f 72 20 69 6e 74 65 6e 64 65 64 20 66 6f 72 20  or intended for 
4f60: 75 73 65 20 77 69 74 68 20 61 20 73 6f 75 72 63  use with a sourc
4f70: 65 20 66 69 6c 65 20 6f 74 68 65 72 20 74 68 61  e file other tha
4f80: 6e 20 7a 53 72 63 2c 0a 2a 2a 20 74 68 65 6e 20  n zSrc,.** then 
4f90: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
4fa0: 75 72 6e 73 20 2d 31 2e 0a 2a 2a 0a 2a 2a 20 52  urns -1..**.** R
4fb0: 65 66 65 72 20 74 6f 20 74 68 65 20 64 65 6c 74  efer to the delt
4fc0: 61 5f 63 72 65 61 74 65 28 29 20 64 6f 63 75 6d  a_create() docum
4fd0: 65 6e 74 61 74 69 6f 6e 20 61 62 6f 76 65 20 66  entation above f
4fe0: 6f 72 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e  or a description
4ff0: 0a 2a 2a 20 6f 66 20 74 68 65 20 64 65 6c 74 61  .** of the delta
5000: 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 2a 2f   file format..*/
5010: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 44  .static int rbuD
5020: 65 6c 74 61 41 70 70 6c 79 28 0a 20 20 63 6f 6e  eltaApply(.  con
5030: 73 74 20 63 68 61 72 20 2a 7a 53 72 63 2c 20 20  st char *zSrc,  
5040: 20 20 20 20 2f 2a 20 54 68 65 20 73 6f 75 72 63      /* The sourc
5050: 65 20 6f 72 20 70 61 74 74 65 72 6e 20 66 69 6c  e or pattern fil
5060: 65 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 6e 53 72  e */.  int lenSr
5070: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  c,            /*
5080: 20 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 73   Length of the s
5090: 6f 75 72 63 65 20 66 69 6c 65 20 2a 2f 0a 20 20  ource file */.  
50a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 65 6c  const char *zDel
50b0: 74 61 2c 20 20 20 20 2f 2a 20 44 65 6c 74 61 20  ta,    /* Delta 
50c0: 74 6f 20 61 70 70 6c 79 20 74 6f 20 74 68 65 20  to apply to the 
50d0: 70 61 74 74 65 72 6e 20 2a 2f 0a 20 20 69 6e 74  pattern */.  int
50e0: 20 6c 65 6e 44 65 6c 74 61 2c 20 20 20 20 20 20   lenDelta,      
50f0: 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66      /* Length of
5100: 20 74 68 65 20 64 65 6c 74 61 20 2a 2f 0a 20 20   the delta */.  
5110: 63 68 61 72 20 2a 7a 4f 75 74 20 20 20 20 20 20  char *zOut      
5120: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
5130: 74 68 65 20 6f 75 74 70 75 74 20 69 6e 74 6f 20  the output into 
5140: 74 68 69 73 20 70 72 65 61 6c 6c 6f 63 61 74 65  this preallocate
5150: 64 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b 0a 20  d buffer */.){. 
5160: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6c 69   unsigned int li
5170: 6d 69 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  mit;.  unsigned 
5180: 69 6e 74 20 74 6f 74 61 6c 20 3d 20 30 3b 0a 23  int total = 0;.#
5190: 69 66 20 52 42 55 5f 45 4e 41 42 4c 45 5f 44 45  if RBU_ENABLE_DE
51a0: 4c 54 41 5f 43 4b 53 55 4d 0a 20 20 63 68 61 72  LTA_CKSUM.  char
51b0: 20 2a 7a 4f 72 69 67 4f 75 74 20 3d 20 7a 4f 75   *zOrigOut = zOu
51c0: 74 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 6c 69 6d  t;.#endif..  lim
51d0: 69 74 20 3d 20 72 62 75 44 65 6c 74 61 47 65 74  it = rbuDeltaGet
51e0: 49 6e 74 28 26 7a 44 65 6c 74 61 2c 20 26 6c 65  Int(&zDelta, &le
51f0: 6e 44 65 6c 74 61 29 3b 0a 20 20 69 66 28 20 2a  nDelta);.  if( *
5200: 7a 44 65 6c 74 61 21 3d 27 5c 6e 27 20 29 7b 0a  zDelta!='\n' ){.
5210: 20 20 20 20 2f 2a 20 45 52 52 4f 52 3a 20 73 69      /* ERROR: si
5220: 7a 65 20 69 6e 74 65 67 65 72 20 6e 6f 74 20 74  ze integer not t
5230: 65 72 6d 69 6e 61 74 65 64 20 62 79 20 22 5c 6e  erminated by "\n
5240: 22 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  " */.    return 
5250: 2d 31 3b 0a 20 20 7d 0a 20 20 7a 44 65 6c 74 61  -1;.  }.  zDelta
5260: 2b 2b 3b 20 6c 65 6e 44 65 6c 74 61 2d 2d 3b 0a  ++; lenDelta--;.
5270: 20 20 77 68 69 6c 65 28 20 2a 7a 44 65 6c 74 61    while( *zDelta
5280: 20 26 26 20 6c 65 6e 44 65 6c 74 61 3e 30 20 29   && lenDelta>0 )
5290: 7b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69  {.    unsigned i
52a0: 6e 74 20 63 6e 74 2c 20 6f 66 73 74 3b 0a 20 20  nt cnt, ofst;.  
52b0: 20 20 63 6e 74 20 3d 20 72 62 75 44 65 6c 74 61    cnt = rbuDelta
52c0: 47 65 74 49 6e 74 28 26 7a 44 65 6c 74 61 2c 20  GetInt(&zDelta, 
52d0: 26 6c 65 6e 44 65 6c 74 61 29 3b 0a 20 20 20 20  &lenDelta);.    
52e0: 73 77 69 74 63 68 28 20 7a 44 65 6c 74 61 5b 30  switch( zDelta[0
52f0: 5d 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20  ] ){.      case 
5300: 27 40 27 3a 20 7b 0a 20 20 20 20 20 20 20 20 7a  '@': {.        z
5310: 44 65 6c 74 61 2b 2b 3b 20 6c 65 6e 44 65 6c 74  Delta++; lenDelt
5320: 61 2d 2d 3b 0a 20 20 20 20 20 20 20 20 6f 66 73  a--;.        ofs
5330: 74 20 3d 20 72 62 75 44 65 6c 74 61 47 65 74 49  t = rbuDeltaGetI
5340: 6e 74 28 26 7a 44 65 6c 74 61 2c 20 26 6c 65 6e  nt(&zDelta, &len
5350: 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20 20 20  Delta);.        
5360: 69 66 28 20 6c 65 6e 44 65 6c 74 61 3e 30 20 26  if( lenDelta>0 &
5370: 26 20 7a 44 65 6c 74 61 5b 30 5d 21 3d 27 2c 27  & zDelta[0]!=','
5380: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
5390: 20 45 52 52 4f 52 3a 20 63 6f 70 79 20 63 6f 6d   ERROR: copy com
53a0: 6d 61 6e 64 20 6e 6f 74 20 74 65 72 6d 69 6e 61  mand not termina
53b0: 74 65 64 20 62 79 20 27 2c 27 20 2a 2f 0a 20 20  ted by ',' */.  
53c0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d          return -
53d0: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
53e0: 20 20 20 20 20 7a 44 65 6c 74 61 2b 2b 3b 20 6c       zDelta++; l
53f0: 65 6e 44 65 6c 74 61 2d 2d 3b 0a 20 20 20 20 20  enDelta--;.     
5400: 20 20 20 74 6f 74 61 6c 20 2b 3d 20 63 6e 74 3b     total += cnt;
5410: 0a 20 20 20 20 20 20 20 20 69 66 28 20 74 6f 74  .        if( tot
5420: 61 6c 3e 6c 69 6d 69 74 20 29 7b 0a 20 20 20 20  al>limit ){.    
5430: 20 20 20 20 20 20 2f 2a 20 45 52 52 4f 52 3a 20        /* ERROR: 
5440: 63 6f 70 79 20 65 78 63 65 65 64 73 20 6f 75 74  copy exceeds out
5450: 70 75 74 20 66 69 6c 65 20 73 69 7a 65 20 2a 2f  put file size */
5460: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
5470: 6e 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n -1;.        }.
5480: 20 20 20 20 20 20 20 20 69 66 28 20 28 69 6e 74          if( (int
5490: 29 28 6f 66 73 74 2b 63 6e 74 29 20 3e 20 6c 65  )(ofst+cnt) > le
54a0: 6e 53 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  nSrc ){.        
54b0: 20 20 2f 2a 20 45 52 52 4f 52 3a 20 63 6f 70 79    /* ERROR: copy
54c0: 20 65 78 74 65 6e 64 73 20 70 61 73 74 20 65 6e   extends past en
54d0: 64 20 6f 66 20 69 6e 70 75 74 20 2a 2f 0a 20 20  d of input */.  
54e0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d          return -
54f0: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
5500: 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 4f 75 74       memcpy(zOut
5510: 2c 20 26 7a 53 72 63 5b 6f 66 73 74 5d 2c 20 63  , &zSrc[ofst], c
5520: 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 7a 4f 75  nt);.        zOu
5530: 74 20 2b 3d 20 63 6e 74 3b 0a 20 20 20 20 20 20  t += cnt;.      
5540: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
5550: 0a 20 20 20 20 20 20 63 61 73 65 20 27 3a 27 3a  .      case ':':
5560: 20 7b 0a 20 20 20 20 20 20 20 20 7a 44 65 6c 74   {.        zDelt
5570: 61 2b 2b 3b 20 6c 65 6e 44 65 6c 74 61 2d 2d 3b  a++; lenDelta--;
5580: 0a 20 20 20 20 20 20 20 20 74 6f 74 61 6c 20 2b  .        total +
5590: 3d 20 63 6e 74 3b 0a 20 20 20 20 20 20 20 20 69  = cnt;.        i
55a0: 66 28 20 74 6f 74 61 6c 3e 6c 69 6d 69 74 20 29  f( total>limit )
55b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45  {.          /* E
55c0: 52 52 4f 52 3a 20 20 69 6e 73 65 72 74 20 63 6f  RROR:  insert co
55d0: 6d 6d 61 6e 64 20 67 69 76 65 73 20 61 6e 20 6f  mmand gives an o
55e0: 75 74 70 75 74 20 6c 61 72 67 65 72 20 74 68 61  utput larger tha
55f0: 6e 20 70 72 65 64 69 63 74 65 64 20 2a 2f 0a 20  n predicted */. 
5600: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
5610: 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  -1;.        }.  
5620: 20 20 20 20 20 20 69 66 28 20 28 69 6e 74 29 63        if( (int)c
5630: 6e 74 3e 6c 65 6e 44 65 6c 74 61 20 29 7b 0a 20  nt>lenDelta ){. 
5640: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 52 52 4f           /* ERRO
5650: 52 3a 20 69 6e 73 65 72 74 20 63 6f 75 6e 74 20  R: insert count 
5660: 65 78 63 65 65 64 73 20 73 69 7a 65 20 6f 66 20  exceeds size of 
5670: 64 65 6c 74 61 20 2a 2f 0a 20 20 20 20 20 20 20  delta */.       
5680: 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
5690: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
56a0: 6d 65 6d 63 70 79 28 7a 4f 75 74 2c 20 7a 44 65  memcpy(zOut, zDe
56b0: 6c 74 61 2c 20 63 6e 74 29 3b 0a 20 20 20 20 20  lta, cnt);.     
56c0: 20 20 20 7a 4f 75 74 20 2b 3d 20 63 6e 74 3b 0a     zOut += cnt;.
56d0: 20 20 20 20 20 20 20 20 7a 44 65 6c 74 61 20 2b          zDelta +
56e0: 3d 20 63 6e 74 3b 0a 20 20 20 20 20 20 20 20 6c  = cnt;.        l
56f0: 65 6e 44 65 6c 74 61 20 2d 3d 20 63 6e 74 3b 0a  enDelta -= cnt;.
5700: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
5710: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73       }.      cas
5720: 65 20 27 3b 27 3a 20 7b 0a 20 20 20 20 20 20 20  e ';': {.       
5730: 20 7a 44 65 6c 74 61 2b 2b 3b 20 6c 65 6e 44 65   zDelta++; lenDe
5740: 6c 74 61 2d 2d 3b 0a 20 20 20 20 20 20 20 20 7a  lta--;.        z
5750: 4f 75 74 5b 30 5d 20 3d 20 30 3b 0a 23 69 66 20  Out[0] = 0;.#if 
5760: 52 42 55 5f 45 4e 41 42 4c 45 5f 44 45 4c 54 41  RBU_ENABLE_DELTA
5770: 5f 43 4b 53 55 4d 0a 20 20 20 20 20 20 20 20 69  _CKSUM.        i
5780: 66 28 20 63 6e 74 21 3d 72 62 75 44 65 6c 74 61  f( cnt!=rbuDelta
5790: 43 68 65 63 6b 73 75 6d 28 7a 4f 72 69 67 4f 75  Checksum(zOrigOu
57a0: 74 2c 20 74 6f 74 61 6c 29 20 29 7b 0a 20 20 20  t, total) ){.   
57b0: 20 20 20 20 20 20 20 2f 2a 20 45 52 52 4f 52 3a         /* ERROR:
57c0: 20 20 62 61 64 20 63 68 65 63 6b 73 75 6d 20 2a    bad checksum *
57d0: 2f 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  /.          retu
57e0: 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d  rn -1;.        }
57f0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
5800: 69 66 28 20 74 6f 74 61 6c 21 3d 6c 69 6d 69 74  if( total!=limit
5810: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
5820: 20 45 52 52 4f 52 3a 20 67 65 6e 65 72 61 74 65   ERROR: generate
5830: 64 20 73 69 7a 65 20 64 6f 65 73 20 6e 6f 74 20  d size does not 
5840: 6d 61 74 63 68 20 70 72 65 64 69 63 74 65 64 20  match predicted 
5850: 73 69 7a 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  size */.        
5860: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20    return -1;.   
5870: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
5880: 65 74 75 72 6e 20 74 6f 74 61 6c 3b 0a 20 20 20  eturn total;.   
5890: 20 20 20 7d 0a 20 20 20 20 20 20 64 65 66 61 75     }.      defau
58a0: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a  lt: {.        /*
58b0: 20 45 52 52 4f 52 3a 20 75 6e 6b 6e 6f 77 6e 20   ERROR: unknown 
58c0: 64 65 6c 74 61 20 6f 70 65 72 61 74 6f 72 20 2a  delta operator *
58d0: 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  /.        return
58e0: 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   -1;.      }.   
58f0: 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 45 52 52 4f   }.  }.  /* ERRO
5900: 52 3a 20 75 6e 74 65 72 6d 69 6e 61 74 65 64 20  R: unterminated 
5910: 64 65 6c 74 61 20 2a 2f 0a 20 20 72 65 74 75 72  delta */.  retur
5920: 6e 20 2d 31 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  n -1;.}..static 
5930: 69 6e 74 20 72 62 75 44 65 6c 74 61 4f 75 74 70  int rbuDeltaOutp
5940: 75 74 53 69 7a 65 28 63 6f 6e 73 74 20 63 68 61  utSize(const cha
5950: 72 20 2a 7a 44 65 6c 74 61 2c 20 69 6e 74 20 6c  r *zDelta, int l
5960: 65 6e 44 65 6c 74 61 29 7b 0a 20 20 69 6e 74 20  enDelta){.  int 
5970: 73 69 7a 65 3b 0a 20 20 73 69 7a 65 20 3d 20 72  size;.  size = r
5980: 62 75 44 65 6c 74 61 47 65 74 49 6e 74 28 26 7a  buDeltaGetInt(&z
5990: 44 65 6c 74 61 2c 20 26 6c 65 6e 44 65 6c 74 61  Delta, &lenDelta
59a0: 29 3b 0a 20 20 69 66 28 20 2a 7a 44 65 6c 74 61  );.  if( *zDelta
59b0: 21 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 2f 2a  !='\n' ){.    /*
59c0: 20 45 52 52 4f 52 3a 20 73 69 7a 65 20 69 6e 74   ERROR: size int
59d0: 65 67 65 72 20 6e 6f 74 20 74 65 72 6d 69 6e 61  eger not termina
59e0: 74 65 64 20 62 79 20 22 5c 6e 22 20 2a 2f 0a 20  ted by "\n" */. 
59f0: 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
5a00: 7d 0a 20 20 72 65 74 75 72 6e 20 73 69 7a 65 3b  }.  return size;
5a10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 64 20 6f 66  .}../*.** End of
5a20: 20 63 6f 64 65 20 74 61 6b 65 6e 20 66 72 6f 6d   code taken from
5a30: 20 66 6f 73 73 69 6c 2e 0a 2a 2a 2a 2a 2a 2a 2a   fossil..*******
5a40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5a50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5a60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5a70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5a80: 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  **/../*.** Imple
5a90: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 53 51 4c  mentation of SQL
5aa0: 20 73 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e   scalar function
5ab0: 20 72 62 75 5f 66 6f 73 73 69 6c 5f 64 65 6c 74   rbu_fossil_delt
5ac0: 61 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  a()..**.** This 
5ad0: 66 75 6e 63 74 69 6f 6e 20 61 70 70 6c 69 65 73  function applies
5ae0: 20 61 20 66 6f 73 73 69 6c 20 64 65 6c 74 61 20   a fossil delta 
5af0: 70 61 74 63 68 20 74 6f 20 61 20 62 6c 6f 62 2e  patch to a blob.
5b00: 20 45 78 61 63 74 6c 79 20 74 77 6f 0a 2a 2a 20   Exactly two.** 
5b10: 61 72 67 75 6d 65 6e 74 73 20 6d 75 73 74 20 62  arguments must b
5b20: 65 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73  e passed to this
5b30: 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20 66   function. The f
5b40: 69 72 73 74 20 69 73 20 74 68 65 20 62 6c 6f 62  irst is the blob
5b50: 20 74 6f 0a 2a 2a 20 70 61 74 63 68 20 61 6e 64   to.** patch and
5b60: 20 74 68 65 20 73 65 63 6f 6e 64 20 74 68 65 20   the second the 
5b70: 70 61 74 63 68 20 74 6f 20 61 70 70 6c 79 2e 20  patch to apply. 
5b80: 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  If no error occu
5b90: 72 73 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63  rs, this.** func
5ba0: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65  tion returns the
5bb0: 20 70 61 74 63 68 65 64 20 62 6c 6f 62 2e 0a 2a   patched blob..*
5bc0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62  /.static void rb
5bd0: 75 46 6f 73 73 69 6c 44 65 6c 74 61 46 75 6e 63  uFossilDeltaFunc
5be0: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
5bf0: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20  ext *context,.  
5c00: 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69  int argc,.  sqli
5c10: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
5c20: 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  .){.  const char
5c30: 20 2a 61 44 65 6c 74 61 3b 0a 20 20 69 6e 74 20   *aDelta;.  int 
5c40: 6e 44 65 6c 74 61 3b 0a 20 20 63 6f 6e 73 74 20  nDelta;.  const 
5c50: 63 68 61 72 20 2a 61 4f 72 69 67 3b 0a 20 20 69  char *aOrig;.  i
5c60: 6e 74 20 6e 4f 72 69 67 3b 0a 0a 20 20 69 6e 74  nt nOrig;..  int
5c70: 20 6e 4f 75 74 3b 0a 20 20 69 6e 74 20 6e 4f 75   nOut;.  int nOu
5c80: 74 32 3b 0a 20 20 63 68 61 72 20 2a 61 4f 75 74  t2;.  char *aOut
5c90: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 61 72 67  ;..  assert( arg
5ca0: 63 3d 3d 32 20 29 3b 0a 0a 20 20 6e 4f 72 69 67  c==2 );..  nOrig
5cb0: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
5cc0: 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b  _bytes(argv[0]);
5cd0: 0a 20 20 61 4f 72 69 67 20 3d 20 28 63 6f 6e 73  .  aOrig = (cons
5ce0: 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
5cf0: 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b  value_blob(argv[
5d00: 30 5d 29 3b 0a 20 20 6e 44 65 6c 74 61 20 3d 20  0]);.  nDelta = 
5d10: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
5d20: 74 65 73 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20  tes(argv[1]);.  
5d30: 61 44 65 6c 74 61 20 3d 20 28 63 6f 6e 73 74 20  aDelta = (const 
5d40: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
5d50: 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b 31 5d  lue_blob(argv[1]
5d60: 29 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20  );..  /* Figure 
5d70: 6f 75 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20  out the size of 
5d80: 74 68 65 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20  the output */.  
5d90: 6e 4f 75 74 20 3d 20 72 62 75 44 65 6c 74 61 4f  nOut = rbuDeltaO
5da0: 75 74 70 75 74 53 69 7a 65 28 61 44 65 6c 74 61  utputSize(aDelta
5db0: 2c 20 6e 44 65 6c 74 61 29 3b 0a 20 20 69 66 28  , nDelta);.  if(
5dc0: 20 6e 4f 75 74 3c 30 20 29 7b 0a 20 20 20 20 73   nOut<0 ){.    s
5dd0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
5de0: 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 22 63 6f  ror(context, "co
5df0: 72 72 75 70 74 20 66 6f 73 73 69 6c 20 64 65 6c  rrupt fossil del
5e00: 74 61 22 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65  ta", -1);.    re
5e10: 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 61 4f 75  turn;.  }..  aOu
5e20: 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  t = sqlite3_mall
5e30: 6f 63 28 6e 4f 75 74 2b 31 29 3b 0a 20 20 69 66  oc(nOut+1);.  if
5e40: 28 20 61 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20  ( aOut==0 ){.   
5e50: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
5e60: 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74  error_nomem(cont
5e70: 65 78 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ext);.  }else{. 
5e80: 20 20 20 6e 4f 75 74 32 20 3d 20 72 62 75 44 65     nOut2 = rbuDe
5e90: 6c 74 61 41 70 70 6c 79 28 61 4f 72 69 67 2c 20  ltaApply(aOrig, 
5ea0: 6e 4f 72 69 67 2c 20 61 44 65 6c 74 61 2c 20 6e  nOrig, aDelta, n
5eb0: 44 65 6c 74 61 2c 20 61 4f 75 74 29 3b 0a 20 20  Delta, aOut);.  
5ec0: 20 20 69 66 28 20 6e 4f 75 74 32 21 3d 6e 4f 75    if( nOut2!=nOu
5ed0: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
5ee0: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28  e3_result_error(
5ef0: 63 6f 6e 74 65 78 74 2c 20 22 63 6f 72 72 75 70  context, "corrup
5f00: 74 20 66 6f 73 73 69 6c 20 64 65 6c 74 61 22 2c  t fossil delta",
5f10: 20 2d 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   -1);.    }else{
5f20: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
5f30: 65 73 75 6c 74 5f 62 6c 6f 62 28 63 6f 6e 74 65  esult_blob(conte
5f40: 78 74 2c 20 61 4f 75 74 2c 20 6e 4f 75 74 2c 20  xt, aOut, nOut, 
5f50: 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 20  sqlite3_free);. 
5f60: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a     }.  }.}.../*.
5f70: 2a 2a 20 50 72 65 70 61 72 65 20 74 68 65 20 53  ** Prepare the S
5f80: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20  QL statement in 
5f90: 62 75 66 66 65 72 20 7a 53 71 6c 20 61 67 61 69  buffer zSql agai
5fa0: 6e 73 74 20 64 61 74 61 62 61 73 65 20 68 61 6e  nst database han
5fb0: 64 6c 65 20 64 62 2e 0a 2a 2a 20 49 66 20 73 75  dle db..** If su
5fc0: 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20 2a 70  ccessful, set *p
5fd0: 70 53 74 6d 74 20 74 6f 20 70 6f 69 6e 74 20 74  pStmt to point t
5fe0: 6f 20 74 68 65 20 6e 65 77 20 73 74 61 74 65 6d  o the new statem
5ff0: 65 6e 74 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a  ent and return.*
6000: 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a  * SQLITE_OK. .**
6010: 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
6020: 66 20 61 6e 20 65 72 72 6f 72 20 64 6f 65 73 20  f an error does 
6030: 6f 63 63 75 72 2c 20 73 65 74 20 2a 70 70 53 74  occur, set *ppSt
6040: 6d 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 72  mt to NULL and r
6050: 65 74 75 72 6e 0a 2a 2a 20 61 6e 20 53 51 4c 69  eturn.** an SQLi
6060: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 41  te error code. A
6070: 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 73 65 74  dditionally, set
6080: 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65   output variable
6090: 20 2a 70 7a 45 72 72 6d 73 67 20 74 6f 0a 2a 2a   *pzErrmsg to.**
60a0: 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66   point to a buff
60b0: 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6e  er containing an
60c0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 20   error message. 
60d0: 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e  It is the respon
60e0: 73 69 62 69 6c 69 74 79 0a 2a 2a 20 6f 66 20 74  sibility.** of t
60f0: 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 28 65 76  he caller to (ev
6100: 65 6e 74 75 61 6c 6c 79 29 20 66 72 65 65 20 74  entually) free t
6110: 68 69 73 20 62 75 66 66 65 72 20 75 73 69 6e 67  his buffer using
6120: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e   sqlite3_free().
6130: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
6140: 72 65 70 61 72 65 41 6e 64 43 6f 6c 6c 65 63 74  repareAndCollect
6150: 45 72 72 6f 72 28 0a 20 20 73 71 6c 69 74 65 33  Error(.  sqlite3
6160: 20 2a 64 62 2c 20 0a 20 20 73 71 6c 69 74 65 33   *db, .  sqlite3
6170: 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 2c 0a  _stmt **ppStmt,.
6180: 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 6d 73    char **pzErrms
6190: 67 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  g,.  const char 
61a0: 2a 7a 53 71 6c 0a 29 7b 0a 20 20 69 6e 74 20 72  *zSql.){.  int r
61b0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
61c0: 61 72 65 5f 76 32 28 64 62 2c 20 7a 53 71 6c 2c  are_v2(db, zSql,
61d0: 20 2d 31 2c 20 70 70 53 74 6d 74 2c 20 30 29 3b   -1, ppStmt, 0);
61e0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
61f0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 7a 45  E_OK ){.    *pzE
6200: 72 72 6d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f  rrmsg = sqlite3_
6210: 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 73 71  mprintf("%s", sq
6220: 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29  lite3_errmsg(db)
6230: 29 3b 0a 20 20 20 20 2a 70 70 53 74 6d 74 20 3d  );.    *ppStmt =
6240: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
6250: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
6260: 73 65 74 20 74 68 65 20 53 51 4c 20 73 74 61 74  set the SQL stat
6270: 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61 73 20  ement passed as 
6280: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
6290: 6e 74 2e 20 52 65 74 75 72 6e 20 61 20 63 6f 70  nt. Return a cop
62a0: 79 0a 2a 2a 20 6f 66 20 74 68 65 20 76 61 6c 75  y.** of the valu
62b0: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71  e returned by sq
62c0: 6c 69 74 65 33 5f 72 65 73 65 74 28 29 2e 0a 2a  lite3_reset()..*
62d0: 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
62e0: 20 68 61 73 20 6f 63 63 75 72 72 65 64 2c 20 74   has occurred, t
62f0: 68 65 6e 20 73 65 74 20 2a 70 7a 45 72 72 6d 73  hen set *pzErrms
6300: 67 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20  g to point to a 
6310: 62 75 66 66 65 72 0a 2a 2a 20 63 6f 6e 74 61 69  buffer.** contai
6320: 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 6d 65  ning an error me
6330: 73 73 61 67 65 2e 20 49 74 20 69 73 20 74 68 65  ssage. It is the
6340: 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
6350: 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 0a 2a 2a  of the caller.**
6360: 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 66   to eventually f
6370: 72 65 65 20 74 68 69 73 20 62 75 66 66 65 72 20  ree this buffer 
6380: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 72  using sqlite3_fr
6390: 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ee()..*/.static 
63a0: 69 6e 74 20 72 65 73 65 74 41 6e 64 43 6f 6c 6c  int resetAndColl
63b0: 65 63 74 45 72 72 6f 72 28 73 71 6c 69 74 65 33  ectError(sqlite3
63c0: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 2c 20 63 68  _stmt *pStmt, ch
63d0: 61 72 20 2a 2a 70 7a 45 72 72 6d 73 67 29 7b 0a  ar **pzErrmsg){.
63e0: 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
63f0: 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b  e3_reset(pStmt);
6400: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
6410: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 7a 45  E_OK ){.    *pzE
6420: 72 72 6d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f  rrmsg = sqlite3_
6430: 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 73 71  mprintf("%s", sq
6440: 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 73 71 6c  lite3_errmsg(sql
6450: 69 74 65 33 5f 64 62 5f 68 61 6e 64 6c 65 28 70  ite3_db_handle(p
6460: 53 74 6d 74 29 29 29 3b 0a 20 20 7d 0a 20 20 72  Stmt)));.  }.  r
6470: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
6480: 2a 2a 20 55 6e 6c 65 73 73 20 69 74 20 69 73 20  ** Unless it is 
6490: 4e 55 4c 4c 2c 20 61 72 67 75 6d 65 6e 74 20 7a  NULL, argument z
64a0: 53 71 6c 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  Sql points to a 
64b0: 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64  buffer allocated
64c0: 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65   using.** sqlite
64d0: 33 5f 6d 61 6c 6c 6f 63 20 63 6f 6e 74 61 69 6e  3_malloc contain
64e0: 69 6e 67 20 61 6e 20 53 51 4c 20 73 74 61 74 65  ing an SQL state
64f0: 6d 65 6e 74 2e 20 54 68 69 73 20 66 75 6e 63 74  ment. This funct
6500: 69 6f 6e 20 70 72 65 70 61 72 65 73 20 74 68 65  ion prepares the
6510: 20 53 51 4c 0a 2a 2a 20 73 74 61 74 65 6d 65 6e   SQL.** statemen
6520: 74 20 61 67 61 69 6e 73 74 20 64 61 74 61 62 61  t against databa
6530: 73 65 20 64 62 20 61 6e 64 20 66 72 65 65 73 20  se db and frees 
6540: 74 68 65 20 62 75 66 66 65 72 2e 20 49 66 20 73  the buffer. If s
6550: 74 61 74 65 6d 65 6e 74 20 0a 2a 2a 20 63 6f 6d  tatement .** com
6560: 70 69 6c 61 74 69 6f 6e 20 69 73 20 73 75 63 63  pilation is succ
6570: 65 73 73 66 75 6c 2c 20 2a 70 70 53 74 6d 74 20  essful, *ppStmt 
6580: 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  is set to point 
6590: 74 6f 20 74 68 65 20 6e 65 77 20 73 74 61 74 65  to the new state
65a0: 6d 65 6e 74 20 0a 2a 2a 20 68 61 6e 64 6c 65 20  ment .** handle 
65b0: 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  and SQLITE_OK is
65c0: 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 0a 2a   returned. .**.*
65d0: 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
65e0: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
65f0: 20 2a 70 70 53 74 6d 74 20 69 73 20 73 65 74 20   *ppStmt is set 
6600: 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 61 6e 20 65  to NULL and an e
6610: 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 72 65 74  rror code.** ret
6620: 75 72 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63  urned. In this c
6630: 61 73 65 2c 20 2a 70 7a 45 72 72 6d 73 67 20 6d  ase, *pzErrmsg m
6640: 61 79 20 61 6c 73 6f 20 62 65 20 73 65 74 20 74  ay also be set t
6650: 6f 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 65 72  o point to an er
6660: 72 6f 72 0a 2a 2a 20 6d 65 73 73 61 67 65 2e 20  ror.** message. 
6670: 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e  It is the respon
6680: 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
6690: 63 61 6c 6c 65 72 20 74 6f 20 66 72 65 65 20 74  caller to free t
66a0: 68 69 73 20 65 72 72 6f 72 20 6d 65 73 73 61 67  his error messag
66b0: 65 0a 2a 2a 20 62 75 66 66 65 72 20 75 73 69 6e  e.** buffer usin
66c0: 67 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29  g sqlite3_free()
66d0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d  ..**.** If argum
66e0: 65 6e 74 20 7a 53 71 6c 20 69 73 20 4e 55 4c 4c  ent zSql is NULL
66f0: 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
6700: 61 73 73 75 6d 65 73 20 74 68 61 74 20 61 6e 20  assumes that an 
6710: 4f 4f 4d 20 68 61 73 20 6f 63 63 75 72 72 65 64  OOM has occurred
6720: 2e 0a 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73  ..** In this cas
6730: 65 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  e SQLITE_NOMEM i
6740: 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
6750: 70 70 53 74 6d 74 20 73 65 74 20 74 6f 20 4e 55  ppStmt set to NU
6760: 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  LL..*/.static in
6770: 74 20 70 72 65 70 61 72 65 46 72 65 65 41 6e 64  t prepareFreeAnd
6780: 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 0a 20 20  CollectError(.  
6790: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20  sqlite3 *db, .  
67a0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70  sqlite3_stmt **p
67b0: 70 53 74 6d 74 2c 0a 20 20 63 68 61 72 20 2a 2a  pStmt,.  char **
67c0: 70 7a 45 72 72 6d 73 67 2c 0a 20 20 63 68 61 72  pzErrmsg,.  char
67d0: 20 2a 7a 53 71 6c 0a 29 7b 0a 20 20 69 6e 74 20   *zSql.){.  int 
67e0: 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 2a 70  rc;.  assert( *p
67f0: 7a 45 72 72 6d 73 67 3d 3d 30 20 29 3b 0a 20 20  zErrmsg==0 );.  
6800: 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20  if( zSql==0 ){. 
6810: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
6820: 4f 4d 45 4d 3b 0a 20 20 20 20 2a 70 70 53 74 6d  OMEM;.    *ppStm
6830: 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  t = 0;.  }else{.
6840: 20 20 20 20 72 63 20 3d 20 70 72 65 70 61 72 65      rc = prepare
6850: 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28  AndCollectError(
6860: 64 62 2c 20 70 70 53 74 6d 74 2c 20 70 7a 45 72  db, ppStmt, pzEr
6870: 72 6d 73 67 2c 20 7a 53 71 6c 29 3b 0a 20 20 20  rmsg, zSql);.   
6880: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53   sqlite3_free(zS
6890: 71 6c 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ql);.  }.  retur
68a0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  n rc;.}../*.** F
68b0: 72 65 65 20 74 68 65 20 52 62 75 4f 62 6a 49 74  ree the RbuObjIt
68c0: 65 72 2e 61 7a 54 62 6c 43 6f 6c 5b 5d 20 61 6e  er.azTblCol[] an
68d0: 64 20 52 62 75 4f 62 6a 49 74 65 72 2e 61 62 54  d RbuObjIter.abT
68e0: 62 6c 50 6b 5b 5d 20 61 72 72 61 79 73 20 61 6c  blPk[] arrays al
68f0: 6c 6f 63 61 74 65 64 0a 2a 2a 20 62 79 20 61 6e  located.** by an
6900: 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f   earlier call to
6910: 20 72 62 75 4f 62 6a 49 74 65 72 43 61 63 68 65   rbuObjIterCache
6920: 54 61 62 6c 65 49 6e 66 6f 28 29 2e 0a 2a 2f 0a  TableInfo()..*/.
6930: 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75 4f  static void rbuO
6940: 62 6a 49 74 65 72 46 72 65 65 43 6f 6c 73 28 52  bjIterFreeCols(R
6950: 62 75 4f 62 6a 49 74 65 72 20 2a 70 49 74 65 72  buObjIter *pIter
6960: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
6970: 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e  r(i=0; i<pIter->
6980: 6e 54 62 6c 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  nTblCol; i++){. 
6990: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
69a0: 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b  pIter->azTblCol[
69b0: 69 5d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  i]);.    sqlite3
69c0: 5f 66 72 65 65 28 70 49 74 65 72 2d 3e 61 7a 54  _free(pIter->azT
69d0: 62 6c 54 79 70 65 5b 69 5d 29 3b 0a 20 20 7d 0a  blType[i]);.  }.
69e0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
69f0: 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 29 3b  Iter->azTblCol);
6a00: 0a 20 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43  .  pIter->azTblC
6a10: 6f 6c 20 3d 20 30 3b 0a 20 20 70 49 74 65 72 2d  ol = 0;.  pIter-
6a20: 3e 61 7a 54 62 6c 54 79 70 65 20 3d 20 30 3b 0a  >azTblType = 0;.
6a30: 20 20 70 49 74 65 72 2d 3e 61 69 53 72 63 4f 72    pIter->aiSrcOr
6a40: 64 65 72 20 3d 20 30 3b 0a 20 20 70 49 74 65 72  der = 0;.  pIter
6a50: 2d 3e 61 62 54 62 6c 50 6b 20 3d 20 30 3b 0a 20  ->abTblPk = 0;. 
6a60: 20 70 49 74 65 72 2d 3e 61 62 4e 6f 74 4e 75 6c   pIter->abNotNul
6a70: 6c 20 3d 20 30 3b 0a 20 20 70 49 74 65 72 2d 3e  l = 0;.  pIter->
6a80: 6e 54 62 6c 43 6f 6c 20 3d 20 30 3b 0a 20 20 70  nTblCol = 0;.  p
6a90: 49 74 65 72 2d 3e 65 54 79 70 65 20 3d 20 30 3b  Iter->eType = 0;
6aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6ab0: 2a 20 49 6e 76 61 6c 69 64 20 76 61 6c 75 65 20  * Invalid value 
6ac0: 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 61  */.}../*.** Fina
6ad0: 6c 69 7a 65 20 61 6c 6c 20 73 74 61 74 65 6d 65  lize all stateme
6ae0: 6e 74 73 20 61 6e 64 20 66 72 65 65 20 61 6c 6c  nts and free all
6af0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 74 68 61   allocations tha
6b00: 74 20 61 72 65 20 73 70 65 63 69 66 69 63 20 74  t are specific t
6b10: 6f 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74  o.** the current
6b20: 20 6f 62 6a 65 63 74 20 28 74 61 62 6c 65 2f 69   object (table/i
6b30: 6e 64 65 78 20 70 61 69 72 29 2e 0a 2a 2f 0a 73  ndex pair)..*/.s
6b40: 74 61 74 69 63 20 76 6f 69 64 20 72 62 75 4f 62  tatic void rbuOb
6b50: 6a 49 74 65 72 43 6c 65 61 72 53 74 61 74 65 6d  jIterClearStatem
6b60: 65 6e 74 73 28 52 62 75 4f 62 6a 49 74 65 72 20  ents(RbuObjIter 
6b70: 2a 70 49 74 65 72 29 7b 0a 20 20 52 62 75 55 70  *pIter){.  RbuUp
6b80: 64 61 74 65 53 74 6d 74 20 2a 70 55 70 3b 0a 0a  dateStmt *pUp;..
6b90: 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
6ba0: 7a 65 28 70 49 74 65 72 2d 3e 70 53 65 6c 65 63  ze(pIter->pSelec
6bb0: 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  t);.  sqlite3_fi
6bc0: 6e 61 6c 69 7a 65 28 70 49 74 65 72 2d 3e 70 49  nalize(pIter->pI
6bd0: 6e 73 65 72 74 29 3b 0a 20 20 73 71 6c 69 74 65  nsert);.  sqlite
6be0: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 49 74 65 72  3_finalize(pIter
6bf0: 2d 3e 70 44 65 6c 65 74 65 29 3b 0a 20 20 73 71  ->pDelete);.  sq
6c00: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
6c10: 49 74 65 72 2d 3e 70 54 6d 70 49 6e 73 65 72 74  Iter->pTmpInsert
6c20: 29 3b 0a 20 20 70 55 70 20 3d 20 70 49 74 65 72  );.  pUp = pIter
6c30: 2d 3e 70 52 62 75 55 70 64 61 74 65 3b 0a 20 20  ->pRbuUpdate;.  
6c40: 77 68 69 6c 65 28 20 70 55 70 20 29 7b 0a 20 20  while( pUp ){.  
6c50: 20 20 52 62 75 55 70 64 61 74 65 53 74 6d 74 20    RbuUpdateStmt 
6c60: 2a 70 54 6d 70 20 3d 20 70 55 70 2d 3e 70 4e 65  *pTmp = pUp->pNe
6c70: 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  xt;.    sqlite3_
6c80: 66 69 6e 61 6c 69 7a 65 28 70 55 70 2d 3e 70 55  finalize(pUp->pU
6c90: 70 64 61 74 65 29 3b 0a 20 20 20 20 73 71 6c 69  pdate);.    sqli
6ca0: 74 65 33 5f 66 72 65 65 28 70 55 70 29 3b 0a 20  te3_free(pUp);. 
6cb0: 20 20 20 70 55 70 20 3d 20 70 54 6d 70 3b 0a 20     pUp = pTmp;. 
6cc0: 20 7d 0a 20 20 0a 20 20 70 49 74 65 72 2d 3e 70   }.  .  pIter->p
6cd0: 53 65 6c 65 63 74 20 3d 20 30 3b 0a 20 20 70 49  Select = 0;.  pI
6ce0: 74 65 72 2d 3e 70 49 6e 73 65 72 74 20 3d 20 30  ter->pInsert = 0
6cf0: 3b 0a 20 20 70 49 74 65 72 2d 3e 70 44 65 6c 65  ;.  pIter->pDele
6d00: 74 65 20 3d 20 30 3b 0a 20 20 70 49 74 65 72 2d  te = 0;.  pIter-
6d10: 3e 70 52 62 75 55 70 64 61 74 65 20 3d 20 30 3b  >pRbuUpdate = 0;
6d20: 0a 20 20 70 49 74 65 72 2d 3e 70 54 6d 70 49 6e  .  pIter->pTmpIn
6d30: 73 65 72 74 20 3d 20 30 3b 0a 20 20 70 49 74 65  sert = 0;.  pIte
6d40: 72 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 7d 0a 0a  r->nCol = 0;.}..
6d50: 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61  /*.** Clean up a
6d60: 6e 79 20 72 65 73 6f 75 72 63 65 73 20 61 6c 6c  ny resources all
6d70: 6f 63 61 74 65 64 20 61 73 20 70 61 72 74 20 6f  ocated as part o
6d80: 66 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 6f  f the iterator o
6d90: 62 6a 65 63 74 20 70 61 73 73 65 64 0a 2a 2a 20  bject passed.** 
6da0: 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75  as the only argu
6db0: 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
6dc0: 76 6f 69 64 20 72 62 75 4f 62 6a 49 74 65 72 46  void rbuObjIterF
6dd0: 69 6e 61 6c 69 7a 65 28 52 62 75 4f 62 6a 49 74  inalize(RbuObjIt
6de0: 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 72 62  er *pIter){.  rb
6df0: 75 4f 62 6a 49 74 65 72 43 6c 65 61 72 53 74 61  uObjIterClearSta
6e00: 74 65 6d 65 6e 74 73 28 70 49 74 65 72 29 3b 0a  tements(pIter);.
6e10: 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
6e20: 7a 65 28 70 49 74 65 72 2d 3e 70 54 62 6c 49 74  ze(pIter->pTblIt
6e30: 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  er);.  sqlite3_f
6e40: 69 6e 61 6c 69 7a 65 28 70 49 74 65 72 2d 3e 70  inalize(pIter->p
6e50: 49 64 78 49 74 65 72 29 3b 0a 20 20 72 62 75 4f  IdxIter);.  rbuO
6e60: 62 6a 49 74 65 72 46 72 65 65 43 6f 6c 73 28 70  bjIterFreeCols(p
6e70: 49 74 65 72 29 3b 0a 20 20 6d 65 6d 73 65 74 28  Iter);.  memset(
6e80: 70 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66  pIter, 0, sizeof
6e90: 28 52 62 75 4f 62 6a 49 74 65 72 29 29 3b 0a 7d  (RbuObjIter));.}
6ea0: 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20  ../*.** Advance 
6eb0: 74 68 65 20 69 74 65 72 61 74 6f 72 20 74 6f 20  the iterator to 
6ec0: 74 68 65 20 6e 65 78 74 20 70 6f 73 69 74 69 6f  the next positio
6ed0: 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 65  n..**.** If no e
6ee0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 53 51 4c  rror occurs, SQL
6ef0: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
6f00: 65 64 20 61 6e 64 20 74 68 65 20 69 74 65 72 61  ed and the itera
6f10: 74 6f 72 20 69 73 20 6c 65 66 74 20 0a 2a 2a 20  tor is left .** 
6f20: 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
6f30: 6e 65 78 74 20 65 6e 74 72 79 2e 20 4f 74 68 65  next entry. Othe
6f40: 72 77 69 73 65 2c 20 61 6e 20 65 72 72 6f 72 20  rwise, an error 
6f50: 63 6f 64 65 20 61 6e 64 20 6d 65 73 73 61 67 65  code and message
6f60: 20 69 73 20 0a 2a 2a 20 6c 65 66 74 20 69 6e 20   is .** left in 
6f70: 74 68 65 20 52 42 55 20 68 61 6e 64 6c 65 20 70  the RBU handle p
6f80: 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
6f90: 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 41 20 63  st argument. A c
6fa0: 6f 70 79 20 6f 66 20 74 68 65 20 0a 2a 2a 20 65  opy of the .** e
6fb0: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
6fc0: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
6fd0: 20 69 6e 74 20 72 62 75 4f 62 6a 49 74 65 72 4e   int rbuObjIterN
6fe0: 65 78 74 28 73 71 6c 69 74 65 33 72 62 75 20 2a  ext(sqlite3rbu *
6ff0: 70 2c 20 52 62 75 4f 62 6a 49 74 65 72 20 2a 70  p, RbuObjIter *p
7000: 49 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  Iter){.  int rc 
7010: 3d 20 70 2d 3e 72 63 3b 0a 20 20 69 66 28 20 72  = p->rc;.  if( r
7020: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
7030: 0a 20 20 20 20 2f 2a 20 46 72 65 65 20 61 6e 79  .    /* Free any
7040: 20 53 51 4c 69 74 65 20 73 74 61 74 65 6d 65 6e   SQLite statemen
7050: 74 73 20 75 73 65 64 20 77 68 69 6c 65 20 70 72  ts used while pr
7060: 6f 63 65 73 73 69 6e 67 20 74 68 65 20 70 72 65  ocessing the pre
7070: 76 69 6f 75 73 20 6f 62 6a 65 63 74 20 2a 2f 20  vious object */ 
7080: 0a 20 20 20 20 72 62 75 4f 62 6a 49 74 65 72 43  .    rbuObjIterC
7090: 6c 65 61 72 53 74 61 74 65 6d 65 6e 74 73 28 70  learStatements(p
70a0: 49 74 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70  Iter);.    if( p
70b0: 49 74 65 72 2d 3e 7a 49 64 78 3d 3d 30 20 29 7b  Iter->zIdx==0 ){
70c0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
70d0: 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 4d 61  te3_exec(p->dbMa
70e0: 69 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 22 44  in,.          "D
70f0: 52 4f 50 20 54 52 49 47 47 45 52 20 49 46 20 45  ROP TRIGGER IF E
7100: 58 49 53 54 53 20 74 65 6d 70 2e 72 62 75 5f 69  XISTS temp.rbu_i
7110: 6e 73 65 72 74 5f 74 72 3b 22 0a 20 20 20 20 20  nsert_tr;".     
7120: 20 20 20 20 20 22 44 52 4f 50 20 54 52 49 47 47       "DROP TRIGG
7130: 45 52 20 49 46 20 45 58 49 53 54 53 20 74 65 6d  ER IF EXISTS tem
7140: 70 2e 72 62 75 5f 75 70 64 61 74 65 31 5f 74 72  p.rbu_update1_tr
7150: 3b 22 0a 20 20 20 20 20 20 20 20 20 20 22 44 52  ;".          "DR
7160: 4f 50 20 54 52 49 47 47 45 52 20 49 46 20 45 58  OP TRIGGER IF EX
7170: 49 53 54 53 20 74 65 6d 70 2e 72 62 75 5f 75 70  ISTS temp.rbu_up
7180: 64 61 74 65 32 5f 74 72 3b 22 0a 20 20 20 20 20  date2_tr;".     
7190: 20 20 20 20 20 22 44 52 4f 50 20 54 52 49 47 47       "DROP TRIGG
71a0: 45 52 20 49 46 20 45 58 49 53 54 53 20 74 65 6d  ER IF EXISTS tem
71b0: 70 2e 72 62 75 5f 64 65 6c 65 74 65 5f 74 72 3b  p.rbu_delete_tr;
71c0: 22 0a 20 20 20 20 20 20 20 20 20 20 2c 20 30 2c  ".          , 0,
71d0: 20 30 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 0a   0, &p->zErrmsg.
71e0: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a        );.    }..
71f0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
7200: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
7210: 66 28 20 70 49 74 65 72 2d 3e 62 43 6c 65 61 6e  f( pIter->bClean
7220: 75 70 20 29 7b 0a 20 20 20 20 20 20 20 20 72 62  up ){.        rb
7230: 75 4f 62 6a 49 74 65 72 46 72 65 65 43 6f 6c 73  uObjIterFreeCols
7240: 28 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 20  (pIter);.       
7250: 20 70 49 74 65 72 2d 3e 62 43 6c 65 61 6e 75 70   pIter->bCleanup
7260: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63   = 0;.        rc
7270: 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28   = sqlite3_step(
7280: 70 49 74 65 72 2d 3e 70 54 62 6c 49 74 65 72 29  pIter->pTblIter)
7290: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
72a0: 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  !=SQLITE_ROW ){.
72b0: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 72            rc = r
72c0: 65 73 65 74 41 6e 64 43 6f 6c 6c 65 63 74 45 72  esetAndCollectEr
72d0: 72 6f 72 28 70 49 74 65 72 2d 3e 70 54 62 6c 49  ror(pIter->pTblI
72e0: 74 65 72 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67  ter, &p->zErrmsg
72f0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74  );.          pIt
7300: 65 72 2d 3e 7a 54 62 6c 20 3d 20 30 3b 0a 20 20  er->zTbl = 0;.  
7310: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
7320: 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 7a 54         pIter->zT
7330: 62 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  bl = (const char
7340: 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
7350: 5f 74 65 78 74 28 70 49 74 65 72 2d 3e 70 54 62  _text(pIter->pTb
7360: 6c 49 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20  lIter, 0);.     
7370: 20 20 20 20 20 70 49 74 65 72 2d 3e 7a 44 61 74       pIter->zDat
7380: 61 54 62 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68  aTbl = (const ch
7390: 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
73a0: 6d 6e 5f 74 65 78 74 28 70 49 74 65 72 2d 3e 70  mn_text(pIter->p
73b0: 54 62 6c 49 74 65 72 2c 31 29 3b 0a 20 20 20 20  TblIter,1);.    
73c0: 20 20 20 20 20 20 72 63 20 3d 20 28 70 49 74 65        rc = (pIte
73d0: 72 2d 3e 7a 44 61 74 61 54 62 6c 20 26 26 20 70  r->zDataTbl && p
73e0: 49 74 65 72 2d 3e 7a 54 62 6c 29 20 3f 20 53 51  Iter->zTbl) ? SQ
73f0: 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49 54 45  LITE_OK : SQLITE
7400: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
7410: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
7420: 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72         if( pIter
7430: 2d 3e 7a 49 64 78 3d 3d 30 20 29 7b 0a 20 20 20  ->zIdx==0 ){.   
7440: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
7450: 74 6d 74 20 2a 70 49 64 78 20 3d 20 70 49 74 65  tmt *pIdx = pIte
7460: 72 2d 3e 70 49 64 78 49 74 65 72 3b 0a 20 20 20  r->pIdxIter;.   
7470: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
7480: 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 49  te3_bind_text(pI
7490: 64 78 2c 20 31 2c 20 70 49 74 65 72 2d 3e 7a 54  dx, 1, pIter->zT
74a0: 62 6c 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53  bl, -1, SQLITE_S
74b0: 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20  TATIC);.        
74c0: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  }.        if( rc
74d0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
74e0: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
74f0: 6c 69 74 65 33 5f 73 74 65 70 28 70 49 74 65 72  lite3_step(pIter
7500: 2d 3e 70 49 64 78 49 74 65 72 29 3b 0a 20 20 20  ->pIdxIter);.   
7510: 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
7520: 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20  QLITE_ROW ){.   
7530: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 65           rc = re
7540: 73 65 74 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72  setAndCollectErr
7550: 6f 72 28 70 49 74 65 72 2d 3e 70 49 64 78 49 74  or(pIter->pIdxIt
7560: 65 72 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 29  er, &p->zErrmsg)
7570: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49  ;.            pI
7580: 74 65 72 2d 3e 62 43 6c 65 61 6e 75 70 20 3d 20  ter->bCleanup = 
7590: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  1;.            p
75a0: 49 74 65 72 2d 3e 7a 49 64 78 20 3d 20 30 3b 0a  Iter->zIdx = 0;.
75b0: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
75c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74  .            pIt
75d0: 65 72 2d 3e 7a 49 64 78 20 3d 20 28 63 6f 6e 73  er->zIdx = (cons
75e0: 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
75f0: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 49 74 65  column_text(pIte
7600: 72 2d 3e 70 49 64 78 49 74 65 72 2c 20 30 29 3b  r->pIdxIter, 0);
7610: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74  .            pIt
7620: 65 72 2d 3e 69 54 6e 75 6d 20 3d 20 73 71 6c 69  er->iTnum = sqli
7630: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
7640: 49 74 65 72 2d 3e 70 49 64 78 49 74 65 72 2c 20  Iter->pIdxIter, 
7650: 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1);.            
7660: 70 49 74 65 72 2d 3e 62 55 6e 69 71 75 65 20 3d  pIter->bUnique =
7670: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
7680: 69 6e 74 28 70 49 74 65 72 2d 3e 70 49 64 78 49  int(pIter->pIdxI
7690: 74 65 72 2c 20 32 29 3b 0a 20 20 20 20 20 20 20  ter, 2);.       
76a0: 20 20 20 20 20 72 63 20 3d 20 70 49 74 65 72 2d       rc = pIter-
76b0: 3e 7a 49 64 78 20 3f 20 53 51 4c 49 54 45 5f 4f  >zIdx ? SQLITE_O
76c0: 4b 20 3a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  K : SQLITE_NOMEM
76d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
76e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
76f0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
7700: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
7710: 7b 0a 20 20 20 20 72 62 75 4f 62 6a 49 74 65 72  {.    rbuObjIter
7720: 46 69 6e 61 6c 69 7a 65 28 70 49 74 65 72 29 3b  Finalize(pIter);
7730: 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b  .    p->rc = rc;
7740: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
7750: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ;.}.../*.** The 
7760: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
7770: 66 20 74 68 65 20 72 62 75 5f 74 61 72 67 65 74  f the rbu_target
7780: 5f 6e 61 6d 65 28 29 20 53 51 4c 20 66 75 6e 63  _name() SQL func
7790: 74 69 6f 6e 2e 20 54 68 69 73 20 66 75 6e 63 74  tion. This funct
77a0: 69 6f 6e 0a 2a 2a 20 61 63 63 65 70 74 73 20 6f  ion.** accepts o
77b0: 6e 65 20 6f 72 20 74 77 6f 20 61 72 67 75 6d 65  ne or two argume
77c0: 6e 74 73 2e 20 54 68 65 20 66 69 72 73 74 20 61  nts. The first a
77d0: 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 6e  rgument is the n
77e0: 61 6d 65 20 6f 66 20 61 20 74 61 62 6c 65 20 2d  ame of a table -
77f0: 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  .** the name of 
7800: 61 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 52  a table in the R
7810: 42 55 20 64 61 74 61 62 61 73 65 2e 20 20 54 68  BU database.  Th
7820: 65 20 73 65 63 6f 6e 64 2c 20 69 66 20 69 74 20  e second, if it 
7830: 69 73 20 70 72 65 73 65 6e 74 2c 20 69 73 20 31  is present, is 1
7840: 0a 2a 2a 20 66 6f 72 20 61 20 76 69 65 77 20 6f  .** for a view o
7850: 72 20 30 20 66 6f 72 20 61 20 74 61 62 6c 65 2e  r 0 for a table.
7860: 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 6e 6f   .**.** For a no
7870: 6e 2d 76 61 63 75 75 6d 20 52 42 55 20 68 61 6e  n-vacuum RBU han
7880: 64 6c 65 2c 20 69 66 20 74 68 65 20 74 61 62 6c  dle, if the tabl
7890: 65 20 6e 61 6d 65 20 6d 61 74 63 68 65 73 20 74  e name matches t
78a0: 68 65 20 70 61 74 74 65 72 6e 3a 0a 2a 2a 0a 2a  he pattern:.**.*
78b0: 2a 20 20 20 20 20 64 61 74 61 5b 30 2d 39 5d 5f  *     data[0-9]_
78c0: 3c 6e 61 6d 65 3e 0a 2a 2a 0a 2a 2a 20 77 68 65  <name>.**.** whe
78d0: 72 65 20 3c 6e 61 6d 65 3e 20 69 73 20 61 6e 79  re <name> is any
78e0: 20 73 65 71 75 65 6e 63 65 20 6f 66 20 31 20 6f   sequence of 1 o
78f0: 72 20 6d 6f 72 65 20 63 68 61 72 61 63 74 65 72  r more character
7900: 73 2c 20 3c 6e 61 6d 65 3e 20 69 73 20 72 65 74  s, <name> is ret
7910: 75 72 6e 65 64 2e 0a 2a 2a 20 4f 74 68 65 72 77  urned..** Otherw
7920: 69 73 65 2c 20 69 66 20 74 68 65 20 6f 6e 6c 79  ise, if the only
7930: 20 61 72 67 75 6d 65 6e 74 20 64 6f 65 73 20 6e   argument does n
7940: 6f 74 20 6d 61 74 63 68 20 74 68 65 20 61 62 6f  ot match the abo
7950: 76 65 20 70 61 74 74 65 72 6e 2c 20 61 6e 20 53  ve pattern, an S
7960: 51 4c 0a 2a 2a 20 4e 55 4c 4c 20 69 73 20 72 65  QL.** NULL is re
7970: 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20  turned..**.**   
7980: 20 20 22 64 61 74 61 5f 74 31 22 20 20 20 20 20    "data_t1"     
7990: 2d 3e 20 22 74 31 22 0a 2a 2a 20 20 20 20 20 22  -> "t1".**     "
79a0: 64 61 74 61 30 31 32 33 5f 74 32 22 20 2d 3e 20  data0123_t2" -> 
79b0: 22 74 32 22 0a 2a 2a 20 20 20 20 20 22 64 61 74  "t2".**     "dat
79c0: 61 41 42 5f 74 33 22 20 20 20 2d 3e 20 4e 55 4c  aAB_t3"   -> NUL
79d0: 4c 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 72  L.**.** For an r
79e0: 62 75 20 76 61 63 75 75 6d 20 68 61 6e 64 6c 65  bu vacuum handle
79f0: 2c 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  , a copy of the 
7a00: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
7a10: 73 20 72 65 74 75 72 6e 65 64 20 69 66 0a 2a 2a  s returned if.**
7a20: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
7a30: 6d 65 6e 74 20 69 73 20 65 69 74 68 65 72 20 6d  ment is either m
7a40: 69 73 73 69 6e 67 20 6f 72 20 30 20 28 6e 6f 74  issing or 0 (not
7a50: 20 61 20 76 69 65 77 29 2e 0a 2a 2f 0a 73 74 61   a view)..*/.sta
7a60: 74 69 63 20 76 6f 69 64 20 72 62 75 54 61 72 67  tic void rbuTarg
7a70: 65 74 4e 61 6d 65 46 75 6e 63 28 0a 20 20 73 71  etNameFunc(.  sq
7a80: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70  lite3_context *p
7a90: 43 74 78 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  Ctx,.  int argc,
7aa0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
7ab0: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 73 71 6c   **argv.){.  sql
7ac0: 69 74 65 33 72 62 75 20 2a 70 20 3d 20 73 71 6c  ite3rbu *p = sql
7ad0: 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28 70  ite3_user_data(p
7ae0: 43 74 78 29 3b 0a 20 20 63 6f 6e 73 74 20 63 68  Ctx);.  const ch
7af0: 61 72 20 2a 7a 49 6e 3b 0a 20 20 61 73 73 65 72  ar *zIn;.  asser
7b00: 74 28 20 61 72 67 63 3d 3d 31 20 7c 7c 20 61 72  t( argc==1 || ar
7b10: 67 63 3d 3d 32 20 29 3b 0a 0a 20 20 7a 49 6e 20  gc==2 );..  zIn 
7b20: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
7b30: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
7b40: 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66  t(argv[0]);.  if
7b50: 28 20 7a 49 6e 20 29 7b 0a 20 20 20 20 69 66 28  ( zIn ){.    if(
7b60: 20 72 62 75 49 73 56 61 63 75 75 6d 28 70 29 20   rbuIsVacuum(p) 
7b70: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 72 67  ){.      if( arg
7b80: 63 3d 3d 31 20 7c 7c 20 30 3d 3d 73 71 6c 69 74  c==1 || 0==sqlit
7b90: 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67  e3_value_int(arg
7ba0: 76 5b 31 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  v[1]) ){.       
7bb0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
7bc0: 74 65 78 74 28 70 43 74 78 2c 20 7a 49 6e 2c 20  text(pCtx, zIn, 
7bd0: 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  -1, SQLITE_STATI
7be0: 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  C);.      }.    
7bf0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28  }else{.      if(
7c00: 20 73 74 72 6c 65 6e 28 7a 49 6e 29 3e 34 20 26   strlen(zIn)>4 &
7c10: 26 20 6d 65 6d 63 6d 70 28 22 64 61 74 61 22 2c  & memcmp("data",
7c20: 20 7a 49 6e 2c 20 34 29 3d 3d 30 20 29 7b 0a 20   zIn, 4)==0 ){. 
7c30: 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20         int i;.  
7c40: 20 20 20 20 20 20 66 6f 72 28 69 3d 34 3b 20 7a        for(i=4; z
7c50: 49 6e 5b 69 5d 3e 3d 27 30 27 20 26 26 20 7a 49  In[i]>='0' && zI
7c60: 6e 5b 69 5d 3c 3d 27 39 27 3b 20 69 2b 2b 29 3b  n[i]<='9'; i++);
7c70: 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 49 6e  .        if( zIn
7c80: 5b 69 5d 3d 3d 27 5f 27 20 26 26 20 7a 49 6e 5b  [i]=='_' && zIn[
7c90: 69 2b 31 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  i+1] ){.        
7ca0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
7cb0: 5f 74 65 78 74 28 70 43 74 78 2c 20 26 7a 49 6e  _text(pCtx, &zIn
7cc0: 5b 69 2b 31 5d 2c 20 2d 31 2c 20 53 51 4c 49 54  [i+1], -1, SQLIT
7cd0: 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  E_STATIC);.     
7ce0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
7cf0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
7d00: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 69  Initialize the i
7d10: 74 65 72 61 74 6f 72 20 73 74 72 75 63 74 75 72  terator structur
7d20: 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
7d30: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e  second argument.
7d40: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 65 72 72  .**.** If no err
7d50: 6f 72 20 6f 63 63 75 72 73 2c 20 53 51 4c 49 54  or occurs, SQLIT
7d60: 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
7d70: 20 61 6e 64 20 74 68 65 20 69 74 65 72 61 74 6f   and the iterato
7d80: 72 20 69 73 20 6c 65 66 74 20 0a 2a 2a 20 70 6f  r is left .** po
7d90: 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 66 69  inting to the fi
7da0: 72 73 74 20 65 6e 74 72 79 2e 20 4f 74 68 65 72  rst entry. Other
7db0: 77 69 73 65 2c 20 61 6e 20 65 72 72 6f 72 20 63  wise, an error c
7dc0: 6f 64 65 20 61 6e 64 20 6d 65 73 73 61 67 65 20  ode and message 
7dd0: 69 73 20 0a 2a 2a 20 6c 65 66 74 20 69 6e 20 74  is .** left in t
7de0: 68 65 20 52 42 55 20 68 61 6e 64 6c 65 20 70 61  he RBU handle pa
7df0: 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
7e00: 74 20 61 72 67 75 6d 65 6e 74 2e 20 41 20 63 6f  t argument. A co
7e10: 70 79 20 6f 66 20 74 68 65 20 0a 2a 2a 20 65 72  py of the .** er
7e20: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
7e30: 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
7e40: 69 6e 74 20 72 62 75 4f 62 6a 49 74 65 72 46 69  int rbuObjIterFi
7e50: 72 73 74 28 73 71 6c 69 74 65 33 72 62 75 20 2a  rst(sqlite3rbu *
7e60: 70 2c 20 52 62 75 4f 62 6a 49 74 65 72 20 2a 70  p, RbuObjIter *p
7e70: 49 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Iter){.  int rc;
7e80: 0a 20 20 6d 65 6d 73 65 74 28 70 49 74 65 72 2c  .  memset(pIter,
7e90: 20 30 2c 20 73 69 7a 65 6f 66 28 52 62 75 4f 62   0, sizeof(RbuOb
7ea0: 6a 49 74 65 72 29 29 3b 0a 0a 20 20 72 63 20 3d  jIter));..  rc =
7eb0: 20 70 72 65 70 61 72 65 46 72 65 65 41 6e 64 43   prepareFreeAndC
7ec0: 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64  ollectError(p->d
7ed0: 62 52 62 75 2c 20 26 70 49 74 65 72 2d 3e 70 54  bRbu, &pIter->pT
7ee0: 62 6c 49 74 65 72 2c 20 26 70 2d 3e 7a 45 72 72  blIter, &p->zErr
7ef0: 6d 73 67 2c 20 0a 20 20 20 20 73 71 6c 69 74 65  msg, .    sqlite
7f00: 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20  3_mprintf(.     
7f10: 20 22 53 45 4c 45 43 54 20 72 62 75 5f 74 61 72   "SELECT rbu_tar
7f20: 67 65 74 5f 6e 61 6d 65 28 6e 61 6d 65 2c 20 74  get_name(name, t
7f30: 79 70 65 3d 27 76 69 65 77 27 29 20 41 53 20 74  ype='view') AS t
7f40: 61 72 67 65 74 2c 20 6e 61 6d 65 20 22 0a 20 20  arget, name ".  
7f50: 20 20 20 20 22 46 52 4f 4d 20 73 71 6c 69 74 65      "FROM sqlite
7f60: 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20 20 20  _master ".      
7f70: 22 57 48 45 52 45 20 74 79 70 65 20 49 4e 20 28  "WHERE type IN (
7f80: 27 74 61 62 6c 65 27 2c 20 27 76 69 65 77 27 29  'table', 'view')
7f90: 20 41 4e 44 20 74 61 72 67 65 74 20 49 53 20 4e   AND target IS N
7fa0: 4f 54 20 4e 55 4c 4c 20 22 0a 20 20 20 20 20 20  OT NULL ".      
7fb0: 22 20 25 73 20 22 0a 20 20 20 20 20 20 22 4f 52  " %s ".      "OR
7fc0: 44 45 52 20 42 59 20 6e 61 6d 65 22 0a 20 20 2c  DER BY name".  ,
7fd0: 20 72 62 75 49 73 56 61 63 75 75 6d 28 70 29 20   rbuIsVacuum(p) 
7fe0: 3f 20 22 41 4e 44 20 72 6f 6f 74 70 61 67 65 21  ? "AND rootpage!
7ff0: 3d 30 20 41 4e 44 20 72 6f 6f 74 70 61 67 65 20  =0 AND rootpage 
8000: 49 53 20 4e 4f 54 20 4e 55 4c 4c 22 20 3a 20 22  IS NOT NULL" : "
8010: 22 29 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d  "));..  if( rc==
8020: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
8030: 20 72 63 20 3d 20 70 72 65 70 61 72 65 41 6e 64   rc = prepareAnd
8040: 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e  CollectError(p->
8050: 64 62 4d 61 69 6e 2c 20 26 70 49 74 65 72 2d 3e  dbMain, &pIter->
8060: 70 49 64 78 49 74 65 72 2c 20 26 70 2d 3e 7a 45  pIdxIter, &p->zE
8070: 72 72 6d 73 67 2c 0a 20 20 20 20 20 20 20 20 22  rrmsg,.        "
8080: 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 72 6f 6f  SELECT name, roo
8090: 74 70 61 67 65 2c 20 73 71 6c 20 49 53 20 4e 55  tpage, sql IS NU
80a0: 4c 4c 20 4f 52 20 73 75 62 73 74 72 28 38 2c 20  LL OR substr(8, 
80b0: 36 29 3d 3d 27 55 4e 49 51 55 45 27 20 22 0a 20  6)=='UNIQUE' ". 
80c0: 20 20 20 20 20 20 20 22 20 20 46 52 4f 4d 20 6d         "  FROM m
80d0: 61 69 6e 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65  ain.sqlite_maste
80e0: 72 20 22 0a 20 20 20 20 20 20 20 20 22 20 20 57  r ".        "  W
80f0: 48 45 52 45 20 74 79 70 65 3d 27 69 6e 64 65 78  HERE type='index
8100: 27 20 41 4e 44 20 74 62 6c 5f 6e 61 6d 65 20 3d  ' AND tbl_name =
8110: 20 3f 22 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a   ?".    );.  }..
8120: 20 20 70 49 74 65 72 2d 3e 62 43 6c 65 61 6e 75    pIter->bCleanu
8130: 70 20 3d 20 31 3b 0a 20 20 70 2d 3e 72 63 20 3d  p = 1;.  p->rc =
8140: 20 72 63 3b 0a 20 20 72 65 74 75 72 6e 20 72 62   rc;.  return rb
8150: 75 4f 62 6a 49 74 65 72 4e 65 78 74 28 70 2c 20  uObjIterNext(p, 
8160: 70 49 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pIter);.}../*.**
8170: 20 54 68 69 73 20 69 73 20 61 20 77 72 61 70 70   This is a wrapp
8180: 65 72 20 61 72 6f 75 6e 64 20 22 73 71 6c 69 74  er around "sqlit
8190: 65 33 5f 6d 70 72 69 6e 74 66 28 7a 46 6d 74 2c  e3_mprintf(zFmt,
81a0: 20 2e 2e 2e 29 22 2e 20 49 66 20 61 6e 20 4f 4f   ...)". If an OO
81b0: 4d 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 61 6e 20  M occurs,.** an 
81c0: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 74  error code is st
81d0: 6f 72 65 64 20 69 6e 20 74 68 65 20 52 42 55 20  ored in the RBU 
81e0: 68 61 6e 64 6c 65 20 70 61 73 73 65 64 20 61 73  handle passed as
81f0: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
8200: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ent..**.** If an
8210: 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61   error has alrea
8220: 64 79 20 6f 63 63 75 72 72 65 64 20 28 70 2d 3e  dy occurred (p->
8230: 72 63 20 69 73 20 61 6c 72 65 61 64 79 20 73 65  rc is already se
8240: 74 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 20 6f  t to something o
8250: 74 68 65 72 0a 2a 2a 20 74 68 61 6e 20 53 51 4c  ther.** than SQL
8260: 49 54 45 5f 4f 4b 29 2c 20 74 68 65 6e 20 74 68  ITE_OK), then th
8270: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
8280: 72 6e 73 20 4e 55 4c 4c 20 77 69 74 68 6f 75 74  rns NULL without
8290: 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 0a 2a   modifying the.*
82a0: 2a 20 73 74 6f 72 65 64 20 65 72 72 6f 72 20 63  * stored error c
82b0: 6f 64 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ode. In this cas
82c0: 65 20 69 74 20 73 74 69 6c 6c 20 63 61 6c 6c 73  e it still calls
82d0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 20   sqlite3_free() 
82e0: 6f 6e 20 61 6e 79 20 0a 2a 2a 20 70 72 69 6e 74  on any .** print
82f0: 66 28 29 20 70 61 72 61 6d 65 74 65 72 73 20 61  f() parameters a
8300: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 25  ssociated with %
8310: 7a 20 63 6f 6e 76 65 72 73 69 6f 6e 73 2e 0a 2a  z conversions..*
8320: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 72  /.static char *r
8330: 62 75 4d 50 72 69 6e 74 66 28 73 71 6c 69 74 65  buMPrintf(sqlite
8340: 33 72 62 75 20 2a 70 2c 20 63 6f 6e 73 74 20 63  3rbu *p, const c
8350: 68 61 72 20 2a 7a 46 6d 74 2c 20 2e 2e 2e 29 7b  har *zFmt, ...){
8360: 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20  .  char *zSql = 
8370: 30 3b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b  0;.  va_list ap;
8380: 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20  .  va_start(ap, 
8390: 7a 46 6d 74 29 3b 0a 20 20 7a 53 71 6c 20 3d 20  zFmt);.  zSql = 
83a0: 73 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74 66  sqlite3_vmprintf
83b0: 28 7a 46 6d 74 2c 20 61 70 29 3b 0a 20 20 69 66  (zFmt, ap);.  if
83c0: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
83d0: 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 7a 53  OK ){.    if( zS
83e0: 71 6c 3d 3d 30 20 29 20 70 2d 3e 72 63 20 3d 20  ql==0 ) p->rc = 
83f0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
8400: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
8410: 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20  e3_free(zSql);. 
8420: 20 20 20 7a 53 71 6c 20 3d 20 30 3b 0a 20 20 7d     zSql = 0;.  }
8430: 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20  .  va_end(ap);. 
8440: 20 72 65 74 75 72 6e 20 7a 53 71 6c 3b 0a 7d 0a   return zSql;.}.
8450: 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  ./*.** Argument 
8460: 7a 46 6d 74 20 69 73 20 61 20 73 71 6c 69 74 65  zFmt is a sqlite
8470: 33 5f 6d 70 72 69 6e 74 66 28 29 20 73 74 79 6c  3_mprintf() styl
8480: 65 20 66 6f 72 6d 61 74 20 73 74 72 69 6e 67 2e  e format string.
8490: 20 54 68 65 20 74 72 61 69 6c 69 6e 67 0a 2a 2a   The trailing.**
84a0: 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 74   arguments are t
84b0: 68 65 20 75 73 75 61 6c 20 73 75 62 73 69 74 75  he usual subsitu
84c0: 74 69 6f 6e 20 76 61 6c 75 65 73 2e 20 54 68 69  tion values. Thi
84d0: 73 20 66 75 6e 63 74 69 6f 6e 20 70 65 72 66 6f  s function perfo
84e0: 72 6d 73 0a 2a 2a 20 74 68 65 20 70 72 69 6e 74  rms.** the print
84f0: 66 28 29 20 73 74 79 6c 65 20 73 75 62 73 74 69  f() style substi
8500: 74 75 74 69 6f 6e 73 20 61 6e 64 20 65 78 65 63  tutions and exec
8510: 75 74 65 73 20 74 68 65 20 72 65 73 75 6c 74 20  utes the result 
8520: 61 73 20 61 6e 20 53 51 4c 0a 2a 2a 20 73 74 61  as an SQL.** sta
8530: 74 65 6d 65 6e 74 20 6f 6e 20 74 68 65 20 52 42  tement on the RB
8540: 55 20 68 61 6e 64 6c 65 73 20 64 61 74 61 62 61  U handles databa
8550: 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  se..**.** If an 
8560: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e  error occurs, an
8570: 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20   error code and 
8580: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73  error message is
8590: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 0a 2a   stored in the.*
85a0: 2a 20 52 42 55 20 68 61 6e 64 6c 65 2e 20 49 66  * RBU handle. If
85b0: 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61 6c   an error has al
85c0: 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 20 77  ready occurred w
85d0: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
85e0: 6e 20 69 73 0a 2a 2a 20 63 61 6c 6c 65 64 2c 20  n is.** called, 
85f0: 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  it is a no-op..*
8600: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62 75  /.static int rbu
8610: 4d 50 72 69 6e 74 66 45 78 65 63 28 73 71 6c 69  MPrintfExec(sqli
8620: 74 65 33 72 62 75 20 2a 70 2c 20 73 71 6c 69 74  te3rbu *p, sqlit
8630: 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68  e3 *db, const ch
8640: 61 72 20 2a 7a 46 6d 74 2c 20 2e 2e 2e 29 7b 0a  ar *zFmt, ...){.
8650: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
8660: 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 76 61  char *zSql;.  va
8670: 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6d 74 29  _start(ap, zFmt)
8680: 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74  ;.  zSql = sqlit
8690: 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6d 74  e3_vmprintf(zFmt
86a0: 2c 20 61 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e  , ap);.  if( p->
86b0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
86c0: 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30  .    if( zSql==0
86d0: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20   ){.      p->rc 
86e0: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
86f0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8700: 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33   p->rc = sqlite3
8710: 5f 65 78 65 63 28 64 62 2c 20 7a 53 71 6c 2c 20  _exec(db, zSql, 
8720: 30 2c 20 30 2c 20 26 70 2d 3e 7a 45 72 72 6d 73  0, 0, &p->zErrms
8730: 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  g);.    }.  }.  
8740: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71  sqlite3_free(zSq
8750: 6c 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29  l);.  va_end(ap)
8760: 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63  ;.  return p->rc
8770: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d  ;.}../*.** Attem
8780: 70 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61  pt to allocate a
8790: 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  nd return a poin
87a0: 74 65 72 20 74 6f 20 61 20 7a 65 72 6f 65 64 20  ter to a zeroed 
87b0: 62 6c 6f 63 6b 20 6f 66 20 6e 42 79 74 65 20 0a  block of nByte .
87c0: 2a 2a 20 62 79 74 65 73 2e 20 0a 2a 2a 0a 2a 2a  ** bytes. .**.**
87d0: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 28 69 2e   If an error (i.
87e0: 65 2e 20 61 6e 20 4f 4f 4d 20 63 6f 6e 64 69 74  e. an OOM condit
87f0: 69 6f 6e 29 20 6f 63 63 75 72 73 2c 20 72 65 74  ion) occurs, ret
8800: 75 72 6e 20 4e 55 4c 4c 20 61 6e 64 20 6c 65 61  urn NULL and lea
8810: 76 65 20 61 6e 20 0a 2a 2a 20 65 72 72 6f 72 20  ve an .** error 
8820: 63 6f 64 65 20 69 6e 20 74 68 65 20 72 62 75 20  code in the rbu 
8830: 68 61 6e 64 6c 65 20 70 61 73 73 65 64 20 61 73  handle passed as
8840: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
8850: 65 6e 74 2e 20 4f 72 2c 20 69 66 20 61 6e 20 0a  ent. Or, if an .
8860: 2a 2a 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72  ** error has alr
8870: 65 61 64 79 20 6f 63 63 75 72 72 65 64 20 77 68  eady occurred wh
8880: 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
8890: 20 69 73 20 63 61 6c 6c 65 64 2c 20 72 65 74 75   is called, retu
88a0: 72 6e 20 4e 55 4c 4c 20 0a 2a 2a 20 69 6d 6d 65  rn NULL .** imme
88b0: 64 69 61 74 65 6c 79 20 77 69 74 68 6f 75 74 20  diately without 
88c0: 61 74 74 65 6d 70 74 69 6e 67 20 74 68 65 20 61  attempting the a
88d0: 6c 6c 6f 63 61 74 69 6f 6e 20 6f 72 20 6d 6f 64  llocation or mod
88e0: 69 66 79 69 6e 67 20 74 68 65 20 73 74 6f 72 65  ifying the store
88f0: 64 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 2e  d.** error code.
8900: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
8910: 2a 72 62 75 4d 61 6c 6c 6f 63 28 73 71 6c 69 74  *rbuMalloc(sqlit
8920: 65 33 72 62 75 20 2a 70 2c 20 69 6e 74 20 6e 42  e3rbu *p, int nB
8930: 79 74 65 29 7b 0a 20 20 76 6f 69 64 20 2a 70 52  yte){.  void *pR
8940: 65 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d  et = 0;.  if( p-
8950: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
8960: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 42  {.    assert( nB
8970: 79 74 65 3e 30 20 29 3b 0a 20 20 20 20 70 52 65  yte>0 );.    pRe
8980: 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  t = sqlite3_mall
8990: 6f 63 36 34 28 6e 42 79 74 65 29 3b 0a 20 20 20  oc64(nByte);.   
89a0: 20 69 66 28 20 70 52 65 74 3d 3d 30 20 29 7b 0a   if( pRet==0 ){.
89b0: 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51        p->rc = SQ
89c0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
89d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d  }else{.      mem
89e0: 73 65 74 28 70 52 65 74 2c 20 30 2c 20 6e 42 79  set(pRet, 0, nBy
89f0: 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  te);.    }.  }. 
8a00: 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
8a10: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
8a20: 20 61 6e 64 20 7a 65 72 6f 20 74 68 65 20 70 49   and zero the pI
8a30: 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 5d 20  ter->azTblCol[] 
8a40: 61 6e 64 20 61 62 54 62 6c 50 6b 5b 5d 20 61 72  and abTblPk[] ar
8a50: 72 61 79 73 20 73 6f 20 74 68 61 74 0a 2a 2a 20  rays so that.** 
8a60: 74 68 65 72 65 20 69 73 20 72 6f 6f 6d 20 66 6f  there is room fo
8a70: 72 20 61 74 20 6c 65 61 73 74 20 6e 43 6f 6c 20  r at least nCol 
8a80: 65 6c 65 6d 65 6e 74 73 2e 20 49 66 20 61 6e 20  elements. If an 
8a90: 4f 4f 4d 20 6f 63 63 75 72 73 2c 20 73 74 6f 72  OOM occurs, stor
8aa0: 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f  e an.** error co
8ab0: 64 65 20 69 6e 20 74 68 65 20 52 42 55 20 68 61  de in the RBU ha
8ac0: 6e 64 6c 65 20 70 61 73 73 65 64 20 61 73 20 74  ndle passed as t
8ad0: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
8ae0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
8af0: 64 20 72 62 75 41 6c 6c 6f 63 61 74 65 49 74 65  d rbuAllocateIte
8b00: 72 41 72 72 61 79 73 28 73 71 6c 69 74 65 33 72  rArrays(sqlite3r
8b10: 62 75 20 2a 70 2c 20 52 62 75 4f 62 6a 49 74 65  bu *p, RbuObjIte
8b20: 72 20 2a 70 49 74 65 72 2c 20 69 6e 74 20 6e 43  r *pIter, int nC
8b30: 6f 6c 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65  ol){.  int nByte
8b40: 20 3d 20 28 32 2a 73 69 7a 65 6f 66 28 63 68 61   = (2*sizeof(cha
8b50: 72 2a 29 20 2b 20 73 69 7a 65 6f 66 28 69 6e 74  r*) + sizeof(int
8b60: 29 20 2b 20 33 2a 73 69 7a 65 6f 66 28 75 38 29  ) + 3*sizeof(u8)
8b70: 29 20 2a 20 6e 43 6f 6c 3b 0a 20 20 63 68 61 72  ) * nCol;.  char
8b80: 20 2a 2a 61 7a 4e 65 77 3b 0a 0a 20 20 61 7a 4e   **azNew;..  azN
8b90: 65 77 20 3d 20 28 63 68 61 72 2a 2a 29 72 62 75  ew = (char**)rbu
8ba0: 4d 61 6c 6c 6f 63 28 70 2c 20 6e 42 79 74 65 29  Malloc(p, nByte)
8bb0: 3b 0a 20 20 69 66 28 20 61 7a 4e 65 77 20 29 7b  ;.  if( azNew ){
8bc0: 0a 20 20 20 20 70 49 74 65 72 2d 3e 61 7a 54 62  .    pIter->azTb
8bd0: 6c 43 6f 6c 20 3d 20 61 7a 4e 65 77 3b 0a 20 20  lCol = azNew;.  
8be0: 20 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 54 79    pIter->azTblTy
8bf0: 70 65 20 3d 20 26 61 7a 4e 65 77 5b 6e 43 6f 6c  pe = &azNew[nCol
8c00: 5d 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 61 69  ];.    pIter->ai
8c10: 53 72 63 4f 72 64 65 72 20 3d 20 28 69 6e 74 2a  SrcOrder = (int*
8c20: 29 26 70 49 74 65 72 2d 3e 61 7a 54 62 6c 54 79  )&pIter->azTblTy
8c30: 70 65 5b 6e 43 6f 6c 5d 3b 0a 20 20 20 20 70 49  pe[nCol];.    pI
8c40: 74 65 72 2d 3e 61 62 54 62 6c 50 6b 20 3d 20 28  ter->abTblPk = (
8c50: 75 38 2a 29 26 70 49 74 65 72 2d 3e 61 69 53 72  u8*)&pIter->aiSr
8c60: 63 4f 72 64 65 72 5b 6e 43 6f 6c 5d 3b 0a 20 20  cOrder[nCol];.  
8c70: 20 20 70 49 74 65 72 2d 3e 61 62 4e 6f 74 4e 75    pIter->abNotNu
8c80: 6c 6c 20 3d 20 28 75 38 2a 29 26 70 49 74 65 72  ll = (u8*)&pIter
8c90: 2d 3e 61 62 54 62 6c 50 6b 5b 6e 43 6f 6c 5d 3b  ->abTblPk[nCol];
8ca0: 0a 20 20 20 20 70 49 74 65 72 2d 3e 61 62 49 6e  .    pIter->abIn
8cb0: 64 65 78 65 64 20 3d 20 28 75 38 2a 29 26 70 49  dexed = (u8*)&pI
8cc0: 74 65 72 2d 3e 61 62 4e 6f 74 4e 75 6c 6c 5b 6e  ter->abNotNull[n
8cd0: 43 6f 6c 5d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  Col];.  }.}../*.
8ce0: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67  ** The first arg
8cf0: 75 6d 65 6e 74 20 6d 75 73 74 20 62 65 20 61 20  ument must be a 
8d00: 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73  nul-terminated s
8d10: 74 72 69 6e 67 2e 20 54 68 69 73 20 66 75 6e 63  tring. This func
8d20: 74 69 6f 6e 0a 2a 2a 20 72 65 74 75 72 6e 73 20  tion.** returns 
8d30: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 74  a copy of the st
8d40: 72 69 6e 67 20 69 6e 20 6d 65 6d 6f 72 79 20 6f  ring in memory o
8d50: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
8d60: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a  ite3_malloc()..*
8d70: 2a 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70  * It is the resp
8d80: 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
8d90: 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e  e caller to even
8da0: 74 75 61 6c 6c 79 20 66 72 65 65 20 74 68 69 73  tually free this
8db0: 20 6d 65 6d 6f 72 79 0a 2a 2a 20 75 73 69 6e 67   memory.** using
8dc0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e   sqlite3_free().
8dd0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d  .**.** If an OOM
8de0: 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 65 6e   condition is en
8df0: 63 6f 75 6e 74 65 72 65 64 20 77 68 65 6e 20 61  countered when a
8e00: 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 61 6c 6c  ttempting to all
8e10: 6f 63 61 74 65 20 6d 65 6d 6f 72 79 2c 0a 2a 2a  ocate memory,.**
8e20: 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65   output variable
8e30: 20 28 2a 70 52 63 29 20 69 73 20 73 65 74 20 74   (*pRc) is set t
8e40: 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 62  o SQLITE_NOMEM b
8e50: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
8e60: 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 69   Otherwise,.** i
8e70: 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  f the allocation
8e80: 20 73 75 63 63 65 65 64 73 2c 20 28 2a 70 52 63   succeeds, (*pRc
8e90: 29 20 69 73 20 6c 65 66 74 20 75 6e 63 68 61 6e  ) is left unchan
8ea0: 67 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ged..*/.static c
8eb0: 68 61 72 20 2a 72 62 75 53 74 72 6e 64 75 70 28  har *rbuStrndup(
8ec0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 72  const char *zStr
8ed0: 2c 20 69 6e 74 20 2a 70 52 63 29 7b 0a 20 20 63  , int *pRc){.  c
8ee0: 68 61 72 20 2a 7a 52 65 74 20 3d 20 30 3b 0a 0a  har *zRet = 0;..
8ef0: 20 20 61 73 73 65 72 74 28 20 2a 70 52 63 3d 3d    assert( *pRc==
8f00: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69  SQLITE_OK );.  i
8f10: 66 28 20 7a 53 74 72 20 29 7b 0a 20 20 20 20 73  f( zStr ){.    s
8f20: 69 7a 65 5f 74 20 6e 43 6f 70 79 20 3d 20 73 74  ize_t nCopy = st
8f30: 72 6c 65 6e 28 7a 53 74 72 29 20 2b 20 31 3b 0a  rlen(zStr) + 1;.
8f40: 20 20 20 20 7a 52 65 74 20 3d 20 28 63 68 61 72      zRet = (char
8f50: 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  *)sqlite3_malloc
8f60: 36 34 28 6e 43 6f 70 79 29 3b 0a 20 20 20 20 69  64(nCopy);.    i
8f70: 66 28 20 7a 52 65 74 20 29 7b 0a 20 20 20 20 20  f( zRet ){.     
8f80: 20 6d 65 6d 63 70 79 28 7a 52 65 74 2c 20 7a 53   memcpy(zRet, zS
8f90: 74 72 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20  tr, nCopy);.    
8fa0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 52  }else{.      *pR
8fb0: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
8fc0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
8fd0: 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 0a 2f  eturn zRet;.}../
8fe0: 2a 0a 2a 2a 20 46 69 6e 61 6c 69 7a 65 20 74 68  *.** Finalize th
8ff0: 65 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73  e statement pass
9000: 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
9010: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a   argument..**.**
9020: 20 49 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f   If the sqlite3_
9030: 66 69 6e 61 6c 69 7a 65 28 29 20 63 61 6c 6c 20  finalize() call 
9040: 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 61  indicates that a
9050: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
9060: 61 6e 64 20 74 68 65 0a 2a 2a 20 72 62 75 20 68  and the.** rbu h
9070: 61 6e 64 6c 65 20 65 72 72 6f 72 20 63 6f 64 65  andle error code
9080: 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
9090: 73 65 74 2c 20 73 65 74 20 74 68 65 20 65 72 72  set, set the err
90a0: 6f 72 20 63 6f 64 65 20 61 6e 64 20 65 72 72 6f  or code and erro
90b0: 72 0a 2a 2a 20 6d 65 73 73 61 67 65 20 61 63 63  r.** message acc
90c0: 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 73 74 61  ordingly..*/.sta
90d0: 74 69 63 20 76 6f 69 64 20 72 62 75 46 69 6e 61  tic void rbuFina
90e0: 6c 69 7a 65 28 73 71 6c 69 74 65 33 72 62 75 20  lize(sqlite3rbu 
90f0: 2a 70 2c 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  *p, sqlite3_stmt
9100: 20 2a 70 53 74 6d 74 29 7b 0a 20 20 73 71 6c 69   *pStmt){.  sqli
9110: 74 65 33 20 2a 64 62 20 3d 20 73 71 6c 69 74 65  te3 *db = sqlite
9120: 33 5f 64 62 5f 68 61 6e 64 6c 65 28 70 53 74 6d  3_db_handle(pStm
9130: 74 29 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73  t);.  int rc = s
9140: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
9150: 70 53 74 6d 74 29 3b 0a 20 20 69 66 28 20 70 2d  pStmt);.  if( p-
9160: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
9170: 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc!=SQLITE_OK 
9180: 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 72  ){.    p->rc = r
9190: 63 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72 6d 73  c;.    p->zErrms
91a0: 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  g = sqlite3_mpri
91b0: 6e 74 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65  ntf("%s", sqlite
91c0: 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20  3_errmsg(db));. 
91d0: 20 7d 0a 7d 0a 0a 2f 2a 20 44 65 74 65 72 6d 69   }.}../* Determi
91e0: 6e 65 20 74 68 65 20 74 79 70 65 20 6f 66 20 61  ne the type of a
91f0: 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20   table..**.**   
9200: 70 65 54 79 70 65 20 69 73 20 6f 66 20 74 79 70  peType is of typ
9210: 65 20 28 69 6e 74 2a 29 2c 20 61 20 70 6f 69 6e  e (int*), a poin
9220: 74 65 72 20 74 6f 20 61 6e 20 6f 75 74 70 75 74  ter to an output
9230: 20 70 61 72 61 6d 65 74 65 72 20 6f 66 20 74 79   parameter of ty
9240: 70 65 0a 2a 2a 20 20 20 28 69 6e 74 29 2e 20 54  pe.**   (int). T
9250: 68 69 73 20 63 61 6c 6c 20 73 65 74 73 20 74 68  his call sets th
9260: 65 20 6f 75 74 70 75 74 20 70 61 72 61 6d 65 74  e output paramet
9270: 65 72 20 61 73 20 66 6f 6c 6c 6f 77 73 2c 20 64  er as follows, d
9280: 65 70 65 6e 64 69 6e 67 0a 2a 2a 20 20 20 6f 6e  epending.**   on
9290: 20 74 68 65 20 74 79 70 65 20 6f 66 20 74 68 65   the type of the
92a0: 20 74 61 62 6c 65 20 73 70 65 63 69 66 69 65 64   table specified
92b0: 20 62 79 20 70 61 72 61 6d 65 74 65 72 73 20 64   by parameters d
92c0: 62 4e 61 6d 65 20 61 6e 64 20 7a 54 62 6c 2e 0a  bName and zTbl..
92d0: 2a 2a 0a 2a 2a 20 20 20 20 20 52 42 55 5f 50 4b  **.**     RBU_PK
92e0: 5f 4e 4f 54 41 42 4c 45 3a 20 20 20 20 20 20 20  _NOTABLE:       
92f0: 4e 6f 20 73 75 63 68 20 74 61 62 6c 65 2e 0a 2a  No such table..*
9300: 2a 20 20 20 20 20 52 42 55 5f 50 4b 5f 4e 4f 4e  *     RBU_PK_NON
9310: 45 3a 20 20 20 20 20 20 20 20 20 20 54 61 62 6c  E:          Tabl
9320: 65 20 68 61 73 20 61 6e 20 69 6d 70 6c 69 63 69  e has an implici
9330: 74 20 72 6f 77 69 64 2e 0a 2a 2a 20 20 20 20 20  t rowid..**     
9340: 52 42 55 5f 50 4b 5f 49 50 4b 3a 20 20 20 20 20  RBU_PK_IPK:     
9350: 20 20 20 20 20 20 54 61 62 6c 65 20 68 61 73 20        Table has 
9360: 61 6e 20 65 78 70 6c 69 63 69 74 20 49 50 4b 20  an explicit IPK 
9370: 63 6f 6c 75 6d 6e 2e 0a 2a 2a 20 20 20 20 20 52  column..**     R
9380: 42 55 5f 50 4b 5f 45 58 54 45 52 4e 41 4c 3a 20  BU_PK_EXTERNAL: 
9390: 20 20 20 20 20 54 61 62 6c 65 20 68 61 73 20 61       Table has a
93a0: 6e 20 65 78 74 65 72 6e 61 6c 20 50 4b 20 69 6e  n external PK in
93b0: 64 65 78 2e 0a 2a 2a 20 20 20 20 20 52 42 55 5f  dex..**     RBU_
93c0: 50 4b 5f 57 49 54 48 4f 55 54 5f 52 4f 57 49 44  PK_WITHOUT_ROWID
93d0: 3a 20 54 61 62 6c 65 20 69 73 20 57 49 54 48 4f  : Table is WITHO
93e0: 55 54 20 52 4f 57 49 44 2e 0a 2a 2a 20 20 20 20  UT ROWID..**    
93f0: 20 52 42 55 5f 50 4b 5f 56 54 41 42 3a 20 20 20   RBU_PK_VTAB:   
9400: 20 20 20 20 20 20 20 54 61 62 6c 65 20 69 73 20         Table is 
9410: 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  a virtual table.
9420: 0a 2a 2a 0a 2a 2a 20 20 20 41 72 67 75 6d 65 6e  .**.**   Argumen
9430: 74 20 2a 70 69 50 6b 20 69 73 20 61 6c 73 6f 20  t *piPk is also 
9440: 6f 66 20 74 79 70 65 20 28 69 6e 74 2a 29 2c 20  of type (int*), 
9450: 61 6e 64 20 61 6c 73 6f 20 70 6f 69 6e 74 73 20  and also points 
9460: 74 6f 20 61 6e 20 6f 75 74 70 75 74 0a 2a 2a 20  to an output.** 
9470: 20 20 70 61 72 61 6d 65 74 65 72 2e 20 55 6e 6c    parameter. Unl
9480: 65 73 73 20 74 68 65 20 74 61 62 6c 65 20 68 61  ess the table ha
9490: 73 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 70 72  s an external pr
94a0: 69 6d 61 72 79 20 6b 65 79 20 69 6e 64 65 78 20  imary key index 
94b0: 0a 2a 2a 20 20 20 28 69 2e 65 2e 20 75 6e 6c 65  .**   (i.e. unle
94c0: 73 73 20 2a 70 65 54 79 70 65 20 69 73 20 73 65  ss *peType is se
94d0: 74 20 74 6f 20 33 29 2c 20 74 68 65 6e 20 2a 70  t to 3), then *p
94e0: 69 50 6b 20 69 73 20 73 65 74 20 74 6f 20 7a 65  iPk is set to ze
94f0: 72 6f 2e 20 4f 72 2c 0a 2a 2a 20 20 20 69 66 20  ro. Or,.**   if 
9500: 74 68 65 20 74 61 62 6c 65 20 64 6f 65 73 20 68  the table does h
9510: 61 76 65 20 61 6e 20 65 78 74 65 72 6e 61 6c 20  ave an external 
9520: 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e 64 65  primary key inde
9530: 78 2c 20 74 68 65 6e 20 2a 70 69 50 6b 0a 2a 2a  x, then *piPk.**
9540: 20 20 20 69 73 20 73 65 74 20 74 6f 20 74 68 65     is set to the
9550: 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65   root page numbe
9560: 72 20 6f 66 20 74 68 65 20 70 72 69 6d 61 72 79  r of the primary
9570: 20 6b 65 79 20 69 6e 64 65 78 20 62 65 66 6f 72   key index befor
9580: 65 0a 2a 2a 20 20 20 72 65 74 75 72 6e 69 6e 67  e.**   returning
9590: 2e 0a 2a 2a 0a 2a 2a 20 41 4c 47 4f 52 49 54 48  ..**.** ALGORITH
95a0: 4d 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 6e  M:.**.**   if( n
95b0: 6f 20 65 6e 74 72 79 20 65 78 69 73 74 73 20 69  o entry exists i
95c0: 6e 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  n sqlite_master 
95d0: 29 7b 0a 2a 2a 20 20 20 20 20 72 65 74 75 72 6e  ){.**     return
95e0: 20 52 42 55 5f 50 4b 5f 4e 4f 54 41 42 4c 45 0a   RBU_PK_NOTABLE.
95f0: 2a 2a 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  **   }else if( s
9600: 71 6c 20 66 6f 72 20 74 68 65 20 65 6e 74 72 79  ql for the entry
9610: 20 73 74 61 72 74 73 20 77 69 74 68 20 22 43 52   starts with "CR
9620: 45 41 54 45 20 56 49 52 54 55 41 4c 22 20 29 7b  EATE VIRTUAL" ){
9630: 0a 2a 2a 20 20 20 20 20 72 65 74 75 72 6e 20 52  .**     return R
9640: 42 55 5f 50 4b 5f 56 54 41 42 0a 2a 2a 20 20 20  BU_PK_VTAB.**   
9650: 7d 65 6c 73 65 20 69 66 28 20 22 50 52 41 47 4d  }else if( "PRAGM
9660: 41 20 69 6e 64 65 78 5f 6c 69 73 74 28 29 22 20  A index_list()" 
9670: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 63 6f  for the table co
9680: 6e 74 61 69 6e 73 20 61 20 22 70 6b 22 20 69 6e  ntains a "pk" in
9690: 64 65 78 20 29 7b 0a 2a 2a 20 20 20 20 20 69 66  dex ){.**     if
96a0: 28 20 74 68 65 20 69 6e 64 65 78 20 74 68 61 74  ( the index that
96b0: 20 69 73 20 74 68 65 20 70 6b 20 65 78 69 73 74   is the pk exist
96c0: 73 20 69 6e 20 73 71 6c 69 74 65 5f 6d 61 73 74  s in sqlite_mast
96d0: 65 72 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 2a  er ){.**       *
96e0: 70 69 50 4b 20 3d 20 72 6f 6f 74 70 61 67 65 20  piPK = rootpage 
96f0: 6f 66 20 74 68 61 74 20 69 6e 64 65 78 2e 0a 2a  of that index..*
9700: 2a 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 52  *       return R
9710: 42 55 5f 50 4b 5f 45 58 54 45 52 4e 41 4c 0a 2a  BU_PK_EXTERNAL.*
9720: 2a 20 20 20 20 20 7d 65 6c 73 65 7b 0a 2a 2a 20  *     }else{.** 
9730: 20 20 20 20 20 20 72 65 74 75 72 6e 20 52 42 55        return RBU
9740: 5f 50 4b 5f 57 49 54 48 4f 55 54 5f 52 4f 57 49  _PK_WITHOUT_ROWI
9750: 44 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20  D.**     }.**   
9760: 7d 65 6c 73 65 20 69 66 28 20 22 50 52 41 47 4d  }else if( "PRAGM
9770: 41 20 74 61 62 6c 65 5f 69 6e 66 6f 28 29 22 20  A table_info()" 
9780: 6c 69 73 74 73 20 6f 6e 65 20 6f 72 20 6d 6f 72  lists one or mor
9790: 65 20 22 70 6b 22 20 63 6f 6c 75 6d 6e 73 20 29  e "pk" columns )
97a0: 7b 0a 2a 2a 20 20 20 20 20 72 65 74 75 72 6e 20  {.**     return 
97b0: 52 42 55 5f 50 4b 5f 49 50 4b 0a 2a 2a 20 20 20  RBU_PK_IPK.**   
97c0: 7d 65 6c 73 65 7b 0a 2a 2a 20 20 20 20 20 72 65  }else{.**     re
97d0: 74 75 72 6e 20 52 42 55 5f 50 4b 5f 4e 4f 4e 45  turn RBU_PK_NONE
97e0: 0a 2a 2a 20 20 20 7d 0a 2a 2f 0a 73 74 61 74 69  .**   }.*/.stati
97f0: 63 20 76 6f 69 64 20 72 62 75 54 61 62 6c 65 54  c void rbuTableT
9800: 79 70 65 28 0a 20 20 73 71 6c 69 74 65 33 72 62  ype(.  sqlite3rb
9810: 75 20 2a 70 2c 0a 20 20 63 6f 6e 73 74 20 63 68  u *p,.  const ch
9820: 61 72 20 2a 7a 54 61 62 2c 0a 20 20 69 6e 74 20  ar *zTab,.  int 
9830: 2a 70 65 54 79 70 65 2c 0a 20 20 69 6e 74 20 2a  *peType,.  int *
9840: 70 69 54 6e 75 6d 2c 0a 20 20 69 6e 74 20 2a 70  piTnum,.  int *p
9850: 69 50 6b 0a 29 7b 0a 20 20 2f 2a 0a 20 20 2a 2a  iPk.){.  /*.  **
9860: 20 30 29 20 53 45 4c 45 43 54 20 63 6f 75 6e 74   0) SELECT count
9870: 28 2a 29 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  (*) FROM sqlite_
9880: 6d 61 73 74 65 72 20 77 68 65 72 65 20 6e 61 6d  master where nam
9890: 65 3d 25 51 20 41 4e 44 20 49 73 56 69 72 74 75  e=%Q AND IsVirtu
98a0: 61 6c 28 25 51 29 0a 20 20 2a 2a 20 31 29 20 50  al(%Q).  ** 1) P
98b0: 52 41 47 4d 41 20 69 6e 64 65 78 5f 6c 69 73 74  RAGMA index_list
98c0: 20 3d 20 3f 0a 20 20 2a 2a 20 32 29 20 53 45 4c   = ?.  ** 2) SEL
98d0: 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
98e0: 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  M sqlite_master 
98f0: 77 68 65 72 65 20 6e 61 6d 65 3d 25 51 20 0a 20  where name=%Q . 
9900: 20 2a 2a 20 33 29 20 50 52 41 47 4d 41 20 74 61   ** 3) PRAGMA ta
9910: 62 6c 65 5f 69 6e 66 6f 20 3d 20 3f 0a 20 20 2a  ble_info = ?.  *
9920: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  /.  sqlite3_stmt
9930: 20 2a 61 53 74 6d 74 5b 34 5d 20 3d 20 7b 30 2c   *aStmt[4] = {0,
9940: 20 30 2c 20 30 2c 20 30 7d 3b 0a 0a 20 20 2a 70   0, 0, 0};..  *p
9950: 65 54 79 70 65 20 3d 20 52 42 55 5f 50 4b 5f 4e  eType = RBU_PK_N
9960: 4f 54 41 42 4c 45 3b 0a 20 20 2a 70 69 50 6b 20  OTABLE;.  *piPk 
9970: 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
9980: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
9990: 20 29 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 70 72   );.  p->rc = pr
99a0: 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c  epareFreeAndColl
99b0: 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 4d 61  ectError(p->dbMa
99c0: 69 6e 2c 20 26 61 53 74 6d 74 5b 30 5d 2c 20 26  in, &aStmt[0], &
99d0: 70 2d 3e 7a 45 72 72 6d 73 67 2c 20 0a 20 20 20  p->zErrmsg, .   
99e0: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
99f0: 28 0a 20 20 20 20 20 20 20 20 20 20 22 53 45 4c  (.          "SEL
9a00: 45 43 54 20 28 73 71 6c 20 4c 49 4b 45 20 27 63  ECT (sql LIKE 'c
9a10: 72 65 61 74 65 20 76 69 72 74 75 61 6c 25 25 27  reate virtual%%'
9a20: 29 2c 20 72 6f 6f 74 70 61 67 65 22 0a 20 20 20  ), rootpage".   
9a30: 20 20 20 20 20 20 20 22 20 20 46 52 4f 4d 20 73         "  FROM s
9a40: 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 0a 20 20  qlite_master".  
9a50: 20 20 20 20 20 20 20 20 22 20 57 48 45 52 45 20          " WHERE 
9a60: 6e 61 6d 65 3d 25 51 22 2c 20 7a 54 61 62 0a 20  name=%Q", zTab. 
9a70: 20 29 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63   ));.  if( p->rc
9a80: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73  !=SQLITE_OK || s
9a90: 71 6c 69 74 65 33 5f 73 74 65 70 28 61 53 74 6d  qlite3_step(aStm
9aa0: 74 5b 30 5d 29 21 3d 53 51 4c 49 54 45 5f 52 4f  t[0])!=SQLITE_RO
9ab0: 57 20 29 7b 0a 20 20 20 20 2f 2a 20 45 69 74 68  W ){.    /* Eith
9ac0: 65 72 20 61 6e 20 65 72 72 6f 72 2c 20 6f 72 20  er an error, or 
9ad0: 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 2e 20 2a  no such table. *
9ae0: 2f 0a 20 20 20 20 67 6f 74 6f 20 72 62 75 54 61  /.    goto rbuTa
9af0: 62 6c 65 54 79 70 65 5f 65 6e 64 3b 0a 20 20 7d  bleType_end;.  }
9b00: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63  .  if( sqlite3_c
9b10: 6f 6c 75 6d 6e 5f 69 6e 74 28 61 53 74 6d 74 5b  olumn_int(aStmt[
9b20: 30 5d 2c 20 30 29 20 29 7b 0a 20 20 20 20 2a 70  0], 0) ){.    *p
9b30: 65 54 79 70 65 20 3d 20 52 42 55 5f 50 4b 5f 56  eType = RBU_PK_V
9b40: 54 41 42 3b 20 20 20 20 20 20 20 20 20 20 20 20  TAB;            
9b50: 20 20 20 20 20 20 20 20 20 2f 2a 20 76 69 72 74           /* virt
9b60: 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  ual table */.   
9b70: 20 67 6f 74 6f 20 72 62 75 54 61 62 6c 65 54 79   goto rbuTableTy
9b80: 70 65 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 2a 70  pe_end;.  }.  *p
9b90: 69 54 6e 75 6d 20 3d 20 73 71 6c 69 74 65 33 5f  iTnum = sqlite3_
9ba0: 63 6f 6c 75 6d 6e 5f 69 6e 74 28 61 53 74 6d 74  column_int(aStmt
9bb0: 5b 30 5d 2c 20 31 29 3b 0a 0a 20 20 70 2d 3e 72  [0], 1);..  p->r
9bc0: 63 20 3d 20 70 72 65 70 61 72 65 46 72 65 65 41  c = prepareFreeA
9bd0: 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70  ndCollectError(p
9be0: 2d 3e 64 62 4d 61 69 6e 2c 20 26 61 53 74 6d 74  ->dbMain, &aStmt
9bf0: 5b 31 5d 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67  [1], &p->zErrmsg
9c00: 2c 20 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  , .    sqlite3_m
9c10: 70 72 69 6e 74 66 28 22 50 52 41 47 4d 41 20 69  printf("PRAGMA i
9c20: 6e 64 65 78 5f 6c 69 73 74 3d 25 51 22 2c 7a 54  ndex_list=%Q",zT
9c30: 61 62 29 0a 20 20 29 3b 0a 20 20 69 66 28 20 70  ab).  );.  if( p
9c40: 2d 3e 72 63 20 29 20 67 6f 74 6f 20 72 62 75 54  ->rc ) goto rbuT
9c50: 61 62 6c 65 54 79 70 65 5f 65 6e 64 3b 0a 20 20  ableType_end;.  
9c60: 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33 5f 73  while( sqlite3_s
9c70: 74 65 70 28 61 53 74 6d 74 5b 31 5d 29 3d 3d 53  tep(aStmt[1])==S
9c80: 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20  QLITE_ROW ){.   
9c90: 20 63 6f 6e 73 74 20 75 38 20 2a 7a 4f 72 69 67   const u8 *zOrig
9ca0: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
9cb0: 6e 5f 74 65 78 74 28 61 53 74 6d 74 5b 31 5d 2c  n_text(aStmt[1],
9cc0: 20 33 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75   3);.    const u
9cd0: 38 20 2a 7a 49 64 78 20 3d 20 73 71 6c 69 74 65  8 *zIdx = sqlite
9ce0: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 61 53  3_column_text(aS
9cf0: 74 6d 74 5b 31 5d 2c 20 31 29 3b 0a 20 20 20 20  tmt[1], 1);.    
9d00: 69 66 28 20 7a 4f 72 69 67 20 26 26 20 7a 49 64  if( zOrig && zId
9d10: 78 20 26 26 20 7a 4f 72 69 67 5b 30 5d 3d 3d 27  x && zOrig[0]=='
9d20: 70 27 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72  p' ){.      p->r
9d30: 63 20 3d 20 70 72 65 70 61 72 65 46 72 65 65 41  c = prepareFreeA
9d40: 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70  ndCollectError(p
9d50: 2d 3e 64 62 4d 61 69 6e 2c 20 26 61 53 74 6d 74  ->dbMain, &aStmt
9d60: 5b 32 5d 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67  [2], &p->zErrmsg
9d70: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  , .          sql
9d80: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20  ite3_mprintf(.  
9d90: 20 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43            "SELEC
9da0: 54 20 72 6f 6f 74 70 61 67 65 20 46 52 4f 4d 20  T rootpage FROM 
9db0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 57 48  sqlite_master WH
9dc0: 45 52 45 20 6e 61 6d 65 20 3d 20 25 51 22 2c 20  ERE name = %Q", 
9dd0: 7a 49 64 78 0a 20 20 20 20 20 20 29 29 3b 0a 20  zIdx.      ));. 
9de0: 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
9df0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
9e00: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
9e10: 5f 73 74 65 70 28 61 53 74 6d 74 5b 32 5d 29 3d  _step(aStmt[2])=
9e20: 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
9e30: 20 20 20 20 20 20 20 20 20 2a 70 69 50 6b 20 3d           *piPk =
9e40: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
9e50: 69 6e 74 28 61 53 74 6d 74 5b 32 5d 2c 20 30 29  int(aStmt[2], 0)
9e60: 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 65 54  ;.          *peT
9e70: 79 70 65 20 3d 20 52 42 55 5f 50 4b 5f 45 58 54  ype = RBU_PK_EXT
9e80: 45 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 7d  ERNAL;.        }
9e90: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
9ea0: 2a 70 65 54 79 70 65 20 3d 20 52 42 55 5f 50 4b  *peType = RBU_PK
9eb0: 5f 57 49 54 48 4f 55 54 5f 52 4f 57 49 44 3b 0a  _WITHOUT_ROWID;.
9ec0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9ed0: 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 72 62 75  }.      goto rbu
9ee0: 54 61 62 6c 65 54 79 70 65 5f 65 6e 64 3b 0a 20  TableType_end;. 
9ef0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 2d 3e 72     }.  }..  p->r
9f00: 63 20 3d 20 70 72 65 70 61 72 65 46 72 65 65 41  c = prepareFreeA
9f10: 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70  ndCollectError(p
9f20: 2d 3e 64 62 4d 61 69 6e 2c 20 26 61 53 74 6d 74  ->dbMain, &aStmt
9f30: 5b 33 5d 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67  [3], &p->zErrmsg
9f40: 2c 20 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  , .    sqlite3_m
9f50: 70 72 69 6e 74 66 28 22 50 52 41 47 4d 41 20 74  printf("PRAGMA t
9f60: 61 62 6c 65 5f 69 6e 66 6f 3d 25 51 22 2c 7a 54  able_info=%Q",zT
9f70: 61 62 29 0a 20 20 29 3b 0a 20 20 69 66 28 20 70  ab).  );.  if( p
9f80: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
9f90: 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 73 71  ){.    while( sq
9fa0: 6c 69 74 65 33 5f 73 74 65 70 28 61 53 74 6d 74  lite3_step(aStmt
9fb0: 5b 33 5d 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  [3])==SQLITE_ROW
9fc0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71   ){.      if( sq
9fd0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
9fe0: 28 61 53 74 6d 74 5b 33 5d 2c 35 29 3e 30 20 29  (aStmt[3],5)>0 )
9ff0: 7b 0a 20 20 20 20 20 20 20 20 2a 70 65 54 79 70  {.        *peTyp
a000: 65 20 3d 20 52 42 55 5f 50 4b 5f 49 50 4b 3b 20  e = RBU_PK_IPK; 
a010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a020: 2a 20 65 78 70 6c 69 63 69 74 20 49 50 4b 20 63  * explicit IPK c
a030: 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 20 20 20 20 20  olumn */.       
a040: 20 67 6f 74 6f 20 72 62 75 54 61 62 6c 65 54 79   goto rbuTableTy
a050: 70 65 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  pe_end;.      }.
a060: 20 20 20 20 7d 0a 20 20 20 20 2a 70 65 54 79 70      }.    *peTyp
a070: 65 20 3d 20 52 42 55 5f 50 4b 5f 4e 4f 4e 45 3b  e = RBU_PK_NONE;
a080: 0a 20 20 7d 0a 0a 72 62 75 54 61 62 6c 65 54 79  .  }..rbuTableTy
a090: 70 65 5f 65 6e 64 3a 20 7b 0a 20 20 20 20 75 6e  pe_end: {.    un
a0a0: 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20  signed int i;.  
a0b0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
a0c0: 65 6f 66 28 61 53 74 6d 74 29 2f 73 69 7a 65 6f  eof(aStmt)/sizeo
a0d0: 66 28 61 53 74 6d 74 5b 30 5d 29 3b 20 69 2b 2b  f(aStmt[0]); i++
a0e0: 29 7b 0a 20 20 20 20 20 20 72 62 75 46 69 6e 61  ){.      rbuFina
a0f0: 6c 69 7a 65 28 70 2c 20 61 53 74 6d 74 5b 69 5d  lize(p, aStmt[i]
a100: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
a110: 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  /*.** This is a 
a120: 68 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 20  helper function 
a130: 66 6f 72 20 72 62 75 4f 62 6a 49 74 65 72 43 61  for rbuObjIterCa
a140: 63 68 65 54 61 62 6c 65 49 6e 66 6f 28 29 2e 20  cheTableInfo(). 
a150: 49 74 20 70 6f 70 75 6c 61 74 65 73 0a 2a 2a 20  It populates.** 
a160: 74 68 65 20 70 49 74 65 72 2d 3e 61 62 49 6e 64  the pIter->abInd
a170: 65 78 65 64 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f  exed[] array..*/
a180: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75  .static void rbu
a190: 4f 62 6a 49 74 65 72 43 61 63 68 65 49 6e 64 65  ObjIterCacheInde
a1a0: 78 65 64 43 6f 6c 73 28 73 71 6c 69 74 65 33 72  xedCols(sqlite3r
a1b0: 62 75 20 2a 70 2c 20 52 62 75 4f 62 6a 49 74 65  bu *p, RbuObjIte
a1c0: 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 73 71 6c  r *pIter){.  sql
a1d0: 69 74 65 33 5f 73 74 6d 74 20 2a 70 4c 69 73 74  ite3_stmt *pList
a1e0: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 62 49 6e 64   = 0;.  int bInd
a1f0: 65 78 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70  ex = 0;..  if( p
a200: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
a210: 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 49  ){.    memcpy(pI
a220: 74 65 72 2d 3e 61 62 49 6e 64 65 78 65 64 2c 20  ter->abIndexed, 
a230: 70 49 74 65 72 2d 3e 61 62 54 62 6c 50 6b 2c 20  pIter->abTblPk, 
a240: 73 69 7a 65 6f 66 28 75 38 29 2a 70 49 74 65 72  sizeof(u8)*pIter
a250: 2d 3e 6e 54 62 6c 43 6f 6c 29 3b 0a 20 20 20 20  ->nTblCol);.    
a260: 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65 46  p->rc = prepareF
a270: 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72  reeAndCollectErr
a280: 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 70  or(p->dbMain, &p
a290: 4c 69 73 74 2c 20 26 70 2d 3e 7a 45 72 72 6d 73  List, &p->zErrms
a2a0: 67 2c 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  g,.        sqlit
a2b0: 65 33 5f 6d 70 72 69 6e 74 66 28 22 50 52 41 47  e3_mprintf("PRAG
a2c0: 4d 41 20 6d 61 69 6e 2e 69 6e 64 65 78 5f 6c 69  MA main.index_li
a2d0: 73 74 20 3d 20 25 51 22 2c 20 70 49 74 65 72 2d  st = %Q", pIter-
a2e0: 3e 7a 54 62 6c 29 0a 20 20 20 20 29 3b 0a 20 20  >zTbl).    );.  
a2f0: 7d 0a 0a 20 20 70 49 74 65 72 2d 3e 6e 49 6e 64  }..  pIter->nInd
a300: 65 78 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28  ex = 0;.  while(
a310: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
a320: 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d  K && SQLITE_ROW=
a330: 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 4c  =sqlite3_step(pL
a340: 69 73 74 29 20 29 7b 0a 20 20 20 20 63 6f 6e 73  ist) ){.    cons
a350: 74 20 63 68 61 72 20 2a 7a 49 64 78 20 3d 20 28  t char *zIdx = (
a360: 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
a370: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
a380: 70 4c 69 73 74 2c 20 31 29 3b 0a 20 20 20 20 73  pList, 1);.    s
a390: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 58 49  qlite3_stmt *pXI
a3a0: 6e 66 6f 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  nfo = 0;.    if(
a3b0: 20 7a 49 64 78 3d 3d 30 20 29 20 62 72 65 61 6b   zIdx==0 ) break
a3c0: 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 72  ;.    p->rc = pr
a3d0: 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c  epareFreeAndColl
a3e0: 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 4d 61  ectError(p->dbMa
a3f0: 69 6e 2c 20 26 70 58 49 6e 66 6f 2c 20 26 70 2d  in, &pXInfo, &p-
a400: 3e 7a 45 72 72 6d 73 67 2c 0a 20 20 20 20 20 20  >zErrmsg,.      
a410: 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74    sqlite3_mprint
a420: 66 28 22 50 52 41 47 4d 41 20 6d 61 69 6e 2e 69  f("PRAGMA main.i
a430: 6e 64 65 78 5f 78 69 6e 66 6f 20 3d 20 25 51 22  ndex_xinfo = %Q"
a440: 2c 20 7a 49 64 78 29 0a 20 20 20 20 29 3b 0a 20  , zIdx).    );. 
a450: 20 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d     while( p->rc=
a460: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51  =SQLITE_OK && SQ
a470: 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65  LITE_ROW==sqlite
a480: 33 5f 73 74 65 70 28 70 58 49 6e 66 6f 29 20 29  3_step(pXInfo) )
a490: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 69 64  {.      int iCid
a4a0: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
a4b0: 6e 5f 69 6e 74 28 70 58 49 6e 66 6f 2c 20 31 29  n_int(pXInfo, 1)
a4c0: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 69 64  ;.      if( iCid
a4d0: 3e 3d 30 20 29 20 70 49 74 65 72 2d 3e 61 62 49  >=0 ) pIter->abI
a4e0: 6e 64 65 78 65 64 5b 69 43 69 64 5d 20 3d 20 31  ndexed[iCid] = 1
a4f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 62 75 46  ;.    }.    rbuF
a500: 69 6e 61 6c 69 7a 65 28 70 2c 20 70 58 49 6e 66  inalize(p, pXInf
a510: 6f 29 3b 0a 20 20 20 20 62 49 6e 64 65 78 20 3d  o);.    bIndex =
a520: 20 31 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 6e   1;.    pIter->n
a530: 49 6e 64 65 78 2b 2b 3b 0a 20 20 7d 0a 0a 20 20  Index++;.  }..  
a540: 69 66 28 20 70 49 74 65 72 2d 3e 65 54 79 70 65  if( pIter->eType
a550: 3d 3d 52 42 55 5f 50 4b 5f 57 49 54 48 4f 55 54  ==RBU_PK_WITHOUT
a560: 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 2f 2a  _ROWID ){.    /*
a570: 20 22 50 52 41 47 4d 41 20 69 6e 64 65 78 5f 6c   "PRAGMA index_l
a580: 69 73 74 22 20 69 6e 63 6c 75 64 65 73 20 74 68  ist" includes th
a590: 65 20 6d 61 69 6e 20 50 4b 20 62 2d 74 72 65 65  e main PK b-tree
a5a0: 20 2a 2f 0a 20 20 20 20 70 49 74 65 72 2d 3e 6e   */.    pIter->n
a5b0: 49 6e 64 65 78 2d 2d 3b 0a 20 20 7d 0a 0a 20 20  Index--;.  }..  
a5c0: 72 62 75 46 69 6e 61 6c 69 7a 65 28 70 2c 20 70  rbuFinalize(p, p
a5d0: 4c 69 73 74 29 3b 0a 20 20 69 66 28 20 62 49 6e  List);.  if( bIn
a5e0: 64 65 78 3d 3d 30 20 29 20 70 49 74 65 72 2d 3e  dex==0 ) pIter->
a5f0: 61 62 49 6e 64 65 78 65 64 20 3d 20 30 3b 0a 7d  abIndexed = 0;.}
a600: 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 79  .../*.** If they
a610: 20 61 72 65 20 6e 6f 74 20 61 6c 72 65 61 64 79   are not already
a620: 20 70 6f 70 75 6c 61 74 65 64 2c 20 70 6f 70 75   populated, popu
a630: 6c 61 74 65 20 74 68 65 20 70 49 74 65 72 2d 3e  late the pIter->
a640: 61 7a 54 62 6c 43 6f 6c 5b 5d 2c 0a 2a 2a 20 70  azTblCol[],.** p
a650: 49 74 65 72 2d 3e 61 62 54 62 6c 50 6b 5b 5d 2c  Iter->abTblPk[],
a660: 20 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 20   pIter->nTblCol 
a670: 61 6e 64 20 70 49 74 65 72 2d 3e 62 52 6f 77 69  and pIter->bRowi
a680: 64 20 76 61 72 69 61 62 6c 65 73 20 61 63 63 6f  d variables acco
a690: 72 64 69 6e 67 20 74 6f 0a 2a 2a 20 74 68 65 20  rding to.** the 
a6a0: 74 61 62 6c 65 20 28 6e 6f 74 20 69 6e 64 65 78  table (not index
a6b0: 29 20 74 68 61 74 20 74 68 65 20 69 74 65 72 61  ) that the itera
a6c0: 74 6f 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  tor currently po
a6d0: 69 6e 74 73 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 52  ints to..**.** R
a6e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
a6f0: 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f  if successful, o
a700: 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  r an SQLite erro
a710: 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65  r code otherwise
a720: 2e 20 49 66 0a 2a 2a 20 61 6e 20 65 72 72 6f 72  . If.** an error
a730: 20 64 6f 65 73 20 6f 63 63 75 72 2c 20 61 6e 20   does occur, an 
a740: 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 65  error code and e
a750: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 61 72 65  rror message are
a760: 20 61 6c 73 6f 20 6c 65 66 74 20 69 6e 20 0a 2a   also left in .*
a770: 2a 20 74 68 65 20 52 42 55 20 68 61 6e 64 6c 65  * the RBU handle
a780: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
a790: 72 62 75 4f 62 6a 49 74 65 72 43 61 63 68 65 54  rbuObjIterCacheT
a7a0: 61 62 6c 65 49 6e 66 6f 28 73 71 6c 69 74 65 33  ableInfo(sqlite3
a7b0: 72 62 75 20 2a 70 2c 20 52 62 75 4f 62 6a 49 74  rbu *p, RbuObjIt
a7c0: 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66  er *pIter){.  if
a7d0: 28 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f  ( pIter->azTblCo
a7e0: 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  l==0 ){.    sqli
a7f0: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20  te3_stmt *pStmt 
a800: 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f  = 0;.    int nCo
a810: 6c 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69  l = 0;.    int i
a820: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a830: 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6f 72 28           /* for(
a840: 29 20 6c 6f 6f 70 20 69 74 65 72 61 74 6f 72 20  ) loop iterator 
a850: 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20  variable */.    
a860: 69 6e 74 20 62 52 62 75 52 6f 77 69 64 20 3d 20  int bRbuRowid = 
a870: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  0;            /*
a880: 20 49 66 20 69 6e 70 75 74 20 74 61 62 6c 65 20   If input table 
a890: 68 61 73 20 63 6f 6c 75 6d 6e 20 22 72 62 75 5f  has column "rbu_
a8a0: 72 6f 77 69 64 22 20 2a 2f 0a 20 20 20 20 69 6e  rowid" */.    in
a8b0: 74 20 69 4f 72 64 65 72 20 3d 20 30 3b 0a 20 20  t iOrder = 0;.  
a8c0: 20 20 69 6e 74 20 69 54 6e 75 6d 20 3d 20 30 3b    int iTnum = 0;
a8d0: 0a 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20  ..    /* Figure 
a8e0: 6f 75 74 20 74 68 65 20 74 79 70 65 20 6f 66 20  out the type of 
a8f0: 74 61 62 6c 65 20 74 68 69 73 20 73 74 65 70 20  table this step 
a900: 77 69 6c 6c 20 64 65 61 6c 20 77 69 74 68 2e 20  will deal with. 
a910: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
a920: 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 30 20 29  Iter->eType==0 )
a930: 3b 0a 20 20 20 20 72 62 75 54 61 62 6c 65 54 79  ;.    rbuTableTy
a940: 70 65 28 70 2c 20 70 49 74 65 72 2d 3e 7a 54 62  pe(p, pIter->zTb
a950: 6c 2c 20 26 70 49 74 65 72 2d 3e 65 54 79 70 65  l, &pIter->eType
a960: 2c 20 26 69 54 6e 75 6d 2c 20 26 70 49 74 65 72  , &iTnum, &pIter
a970: 2d 3e 69 50 6b 54 6e 75 6d 29 3b 0a 20 20 20 20  ->iPkTnum);.    
a980: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
a990: 45 5f 4f 4b 20 26 26 20 70 49 74 65 72 2d 3e 65  E_OK && pIter->e
a9a0: 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 4e 4f 54  Type==RBU_PK_NOT
a9b0: 41 42 4c 45 20 29 7b 0a 20 20 20 20 20 20 70 2d  ABLE ){.      p-
a9c0: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52  >rc = SQLITE_ERR
a9d0: 4f 52 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 45 72  OR;.      p->zEr
a9e0: 72 6d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  rmsg = sqlite3_m
a9f0: 70 72 69 6e 74 66 28 22 6e 6f 20 73 75 63 68 20  printf("no such 
aa00: 74 61 62 6c 65 3a 20 25 73 22 2c 20 70 49 74 65  table: %s", pIte
aa10: 72 2d 3e 7a 54 62 6c 29 3b 0a 20 20 20 20 7d 0a  r->zTbl);.    }.
aa20: 20 20 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20      if( p->rc ) 
aa30: 72 65 74 75 72 6e 20 70 2d 3e 72 63 3b 0a 20 20  return p->rc;.  
aa40: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 7a 49 64    if( pIter->zId
aa50: 78 3d 3d 30 20 29 20 70 49 74 65 72 2d 3e 69 54  x==0 ) pIter->iT
aa60: 6e 75 6d 20 3d 20 69 54 6e 75 6d 3b 0a 0a 20 20  num = iTnum;..  
aa70: 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
aa80: 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 4e  >eType==RBU_PK_N
aa90: 4f 4e 45 20 7c 7c 20 70 49 74 65 72 2d 3e 65 54  ONE || pIter->eT
aaa0: 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 49 50 4b 20  ype==RBU_PK_IPK 
aab0: 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 49 74  .         || pIt
aac0: 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50  er->eType==RBU_P
aad0: 4b 5f 45 58 54 45 52 4e 41 4c 20 7c 7c 20 70 49  K_EXTERNAL || pI
aae0: 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f  ter->eType==RBU_
aaf0: 50 4b 5f 57 49 54 48 4f 55 54 5f 52 4f 57 49 44  PK_WITHOUT_ROWID
ab00: 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 49 74  .         || pIt
ab10: 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50  er->eType==RBU_P
ab20: 4b 5f 56 54 41 42 0a 20 20 20 20 29 3b 0a 0a 20  K_VTAB.    );.. 
ab30: 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74     /* Populate t
ab40: 68 65 20 61 7a 54 62 6c 43 6f 6c 5b 5d 20 61 6e  he azTblCol[] an
ab50: 64 20 6e 54 62 6c 43 6f 6c 20 76 61 72 69 61 62  d nTblCol variab
ab60: 6c 65 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65  les based on the
ab70: 20 63 6f 6c 75 6d 6e 73 0a 20 20 20 20 2a 2a 20   columns.    ** 
ab80: 6f 66 20 74 68 65 20 69 6e 70 75 74 20 74 61 62  of the input tab
ab90: 6c 65 2e 20 49 67 6e 6f 72 65 20 61 6e 79 20 69  le. Ignore any i
aba0: 6e 70 75 74 20 74 61 62 6c 65 20 63 6f 6c 75 6d  nput table colum
abb0: 6e 73 20 74 68 61 74 20 62 65 67 69 6e 20 77 69  ns that begin wi
abc0: 74 68 0a 20 20 20 20 2a 2a 20 22 72 62 75 5f 22  th.    ** "rbu_"
abd0: 2e 20 20 2a 2f 0a 20 20 20 20 70 2d 3e 72 63 20  .  */.    p->rc 
abe0: 3d 20 70 72 65 70 61 72 65 46 72 65 65 41 6e 64  = prepareFreeAnd
abf0: 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e  CollectError(p->
ac00: 64 62 52 62 75 2c 20 26 70 53 74 6d 74 2c 20 26  dbRbu, &pStmt, &
ac10: 70 2d 3e 7a 45 72 72 6d 73 67 2c 20 0a 20 20 20  p->zErrmsg, .   
ac20: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72       sqlite3_mpr
ac30: 69 6e 74 66 28 22 53 45 4c 45 43 54 20 2a 20 46  intf("SELECT * F
ac40: 52 4f 4d 20 27 25 71 27 22 2c 20 70 49 74 65 72  ROM '%q'", pIter
ac50: 2d 3e 7a 44 61 74 61 54 62 6c 29 0a 20 20 20 20  ->zDataTbl).    
ac60: 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  );.    if( p->rc
ac70: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
ac80: 20 20 20 20 20 6e 43 6f 6c 20 3d 20 73 71 6c 69       nCol = sqli
ac90: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74  te3_column_count
aca0: 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 72  (pStmt);.      r
acb0: 62 75 41 6c 6c 6f 63 61 74 65 49 74 65 72 41 72  buAllocateIterAr
acc0: 72 61 79 73 28 70 2c 20 70 49 74 65 72 2c 20 6e  rays(p, pIter, n
acd0: 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Col);.    }.    
ace0: 66 6f 72 28 69 3d 30 3b 20 70 2d 3e 72 63 3d 3d  for(i=0; p->rc==
acf0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 6e  SQLITE_OK && i<n
ad00: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
ad10: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
ad20: 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  me = (const char
ad30: 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
ad40: 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 20 69 29 3b  _name(pStmt, i);
ad50: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
ad60: 65 33 5f 73 74 72 6e 69 63 6d 70 28 22 72 62 75  e3_strnicmp("rbu
ad70: 5f 22 2c 20 7a 4e 61 6d 65 2c 20 34 29 20 29 7b  _", zName, 4) ){
ad80: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
ad90: 43 6f 70 79 20 3d 20 72 62 75 53 74 72 6e 64 75  Copy = rbuStrndu
ada0: 70 28 7a 4e 61 6d 65 2c 20 26 70 2d 3e 72 63 29  p(zName, &p->rc)
adb0: 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d  ;.        pIter-
adc0: 3e 61 69 53 72 63 4f 72 64 65 72 5b 70 49 74 65  >aiSrcOrder[pIte
add0: 72 2d 3e 6e 54 62 6c 43 6f 6c 5d 20 3d 20 70 49  r->nTblCol] = pI
ade0: 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 3b 0a 20 20  ter->nTblCol;.  
adf0: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 61 7a 54        pIter->azT
ae00: 62 6c 43 6f 6c 5b 70 49 74 65 72 2d 3e 6e 54 62  blCol[pIter->nTb
ae10: 6c 43 6f 6c 2b 2b 5d 20 3d 20 7a 43 6f 70 79 3b  lCol++] = zCopy;
ae20: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65  .      }.      e
ae30: 6c 73 65 20 69 66 28 20 30 3d 3d 73 71 6c 69 74  lse if( 0==sqlit
ae40: 65 33 5f 73 74 72 69 63 6d 70 28 22 72 62 75 5f  e3_stricmp("rbu_
ae50: 72 6f 77 69 64 22 2c 20 7a 4e 61 6d 65 29 20 29  rowid", zName) )
ae60: 7b 0a 20 20 20 20 20 20 20 20 62 52 62 75 52 6f  {.        bRbuRo
ae70: 77 69 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  wid = 1;.      }
ae80: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
ae90: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
aea0: 74 29 3b 0a 20 20 20 20 70 53 74 6d 74 20 3d 20  t);.    pStmt = 
aeb0: 30 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 72  0;..    if( p->r
aec0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20  c==SQLITE_OK.   
aed0: 20 20 26 26 20 72 62 75 49 73 56 61 63 75 75 6d    && rbuIsVacuum
aee0: 28 70 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 62  (p)==0.     && b
aef0: 52 62 75 52 6f 77 69 64 21 3d 28 70 49 74 65 72  RbuRowid!=(pIter
af00: 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f  ->eType==RBU_PK_
af10: 56 54 41 42 20 7c 7c 20 70 49 74 65 72 2d 3e 65  VTAB || pIter->e
af20: 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 4e 4f 4e  Type==RBU_PK_NON
af30: 45 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  E).    ){.      
af40: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45  p->rc = SQLITE_E
af50: 52 52 4f 52 3b 0a 20 20 20 20 20 20 70 2d 3e 7a  RROR;.      p->z
af60: 45 72 72 6d 73 67 20 3d 20 73 71 6c 69 74 65 33  Errmsg = sqlite3
af70: 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20  _mprintf(.      
af80: 20 20 20 20 22 74 61 62 6c 65 20 25 71 20 25 73      "table %q %s
af90: 20 72 62 75 5f 72 6f 77 69 64 20 63 6f 6c 75 6d   rbu_rowid colum
afa0: 6e 22 2c 20 70 49 74 65 72 2d 3e 7a 44 61 74 61  n", pIter->zData
afb0: 54 62 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 28  Tbl,.          (
afc0: 62 52 62 75 52 6f 77 69 64 20 3f 20 22 6d 61 79  bRbuRowid ? "may
afd0: 20 6e 6f 74 20 68 61 76 65 22 20 3a 20 22 72 65   not have" : "re
afe0: 71 75 69 72 65 73 22 29 0a 20 20 20 20 20 20 29  quires").      )
aff0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
b000: 43 68 65 63 6b 20 74 68 61 74 20 61 6c 6c 20 6e  Check that all n
b010: 6f 6e 2d 48 49 44 44 45 4e 20 63 6f 6c 75 6d 6e  on-HIDDEN column
b020: 73 20 69 6e 20 74 68 65 20 64 65 73 74 69 6e 61  s in the destina
b030: 74 69 6f 6e 20 74 61 62 6c 65 20 61 72 65 20 61  tion table are a
b040: 6c 73 6f 0a 20 20 20 20 2a 2a 20 70 72 65 73 65  lso.    ** prese
b050: 6e 74 20 69 6e 20 74 68 65 20 69 6e 70 75 74 20  nt in the input 
b060: 74 61 62 6c 65 2e 20 50 6f 70 75 6c 61 74 65 20  table. Populate 
b070: 74 68 65 20 61 62 54 62 6c 50 6b 5b 5d 2c 20 61  the abTblPk[], a
b080: 7a 54 62 6c 54 79 70 65 5b 5d 20 61 6e 64 0a 20  zTblType[] and. 
b090: 20 20 20 2a 2a 20 61 69 54 62 6c 4f 72 64 65 72     ** aiTblOrder
b0a0: 5b 5d 20 61 72 72 61 79 73 20 61 74 20 74 68 65  [] arrays at the
b0b0: 20 73 61 6d 65 20 74 69 6d 65 2e 20 20 2a 2f 0a   same time.  */.
b0c0: 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
b0d0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
b0e0: 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72    p->rc = prepar
b0f0: 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45  eFreeAndCollectE
b100: 72 72 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20  rror(p->dbMain, 
b110: 26 70 53 74 6d 74 2c 20 26 70 2d 3e 7a 45 72 72  &pStmt, &p->zErr
b120: 6d 73 67 2c 20 0a 20 20 20 20 20 20 20 20 20 20  msg, .          
b130: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
b140: 22 50 52 41 47 4d 41 20 74 61 62 6c 65 5f 69 6e  "PRAGMA table_in
b150: 66 6f 28 25 51 29 22 2c 20 70 49 74 65 72 2d 3e  fo(%Q)", pIter->
b160: 7a 54 62 6c 29 0a 20 20 20 20 20 20 29 3b 0a 20  zTbl).      );. 
b170: 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20     }.    while( 
b180: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
b190: 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d   && SQLITE_ROW==
b1a0: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
b1b0: 6d 74 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  mt) ){.      con
b1c0: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d  st char *zName =
b1d0: 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
b1e0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
b1f0: 74 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20  t(pStmt, 1);.   
b200: 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20     if( zName==0 
b210: 29 20 62 72 65 61 6b 3b 20 20 2f 2a 20 41 6e 20  ) break;  /* An 
b220: 4f 4f 4d 20 2d 20 66 69 6e 61 6c 69 7a 65 28 29  OOM - finalize()
b230: 20 62 65 6c 6f 77 20 72 65 74 75 72 6e 73 20 53   below returns S
b240: 5f 4e 4f 4d 45 4d 20 2a 2f 0a 20 20 20 20 20 20  _NOMEM */.      
b250: 66 6f 72 28 69 3d 69 4f 72 64 65 72 3b 20 69 3c  for(i=iOrder; i<
b260: 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 3b 20  pIter->nTblCol; 
b270: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
b280: 28 20 30 3d 3d 73 74 72 63 6d 70 28 7a 4e 61 6d  ( 0==strcmp(zNam
b290: 65 2c 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43  e, pIter->azTblC
b2a0: 6f 6c 5b 69 5d 29 20 29 20 62 72 65 61 6b 3b 0a  ol[i]) ) break;.
b2b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
b2c0: 28 20 69 3d 3d 70 49 74 65 72 2d 3e 6e 54 62 6c  ( i==pIter->nTbl
b2d0: 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70  Col ){.        p
b2e0: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52  ->rc = SQLITE_ER
b2f0: 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  ROR;.        p->
b300: 7a 45 72 72 6d 73 67 20 3d 20 73 71 6c 69 74 65  zErrmsg = sqlite
b310: 33 5f 6d 70 72 69 6e 74 66 28 22 63 6f 6c 75 6d  3_mprintf("colum
b320: 6e 20 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20 25  n missing from %
b330: 71 3a 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20  q: %s",.        
b340: 20 20 20 20 70 49 74 65 72 2d 3e 7a 44 61 74 61      pIter->zData
b350: 54 62 6c 2c 20 7a 4e 61 6d 65 0a 20 20 20 20 20  Tbl, zName.     
b360: 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73     );.      }els
b370: 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  e{.        int i
b380: 50 6b 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  Pk = sqlite3_col
b390: 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 35  umn_int(pStmt, 5
b3a0: 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 62  );.        int b
b3b0: 4e 6f 74 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65  NotNull = sqlite
b3c0: 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74  3_column_int(pSt
b3d0: 6d 74 2c 20 33 29 3b 0a 20 20 20 20 20 20 20 20  mt, 3);.        
b3e0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70  const char *zTyp
b3f0: 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  e = (const char*
b400: 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
b410: 74 65 78 74 28 70 53 74 6d 74 2c 20 32 29 3b 0a  text(pStmt, 2);.
b420: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 21 3d  .        if( i!=
b430: 69 4f 72 64 65 72 20 29 7b 0a 20 20 20 20 20 20  iOrder ){.      
b440: 20 20 20 20 53 57 41 50 28 69 6e 74 2c 20 70 49      SWAP(int, pI
b450: 74 65 72 2d 3e 61 69 53 72 63 4f 72 64 65 72 5b  ter->aiSrcOrder[
b460: 69 5d 2c 20 70 49 74 65 72 2d 3e 61 69 53 72 63  i], pIter->aiSrc
b470: 4f 72 64 65 72 5b 69 4f 72 64 65 72 5d 29 3b 0a  Order[iOrder]);.
b480: 20 20 20 20 20 20 20 20 20 20 53 57 41 50 28 63            SWAP(c
b490: 68 61 72 2a 2c 20 70 49 74 65 72 2d 3e 61 7a 54  har*, pIter->azT
b4a0: 62 6c 43 6f 6c 5b 69 5d 2c 20 70 49 74 65 72 2d  blCol[i], pIter-
b4b0: 3e 61 7a 54 62 6c 43 6f 6c 5b 69 4f 72 64 65 72  >azTblCol[iOrder
b4c0: 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  ]);.        }.. 
b4d0: 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 61 7a         pIter->az
b4e0: 54 62 6c 54 79 70 65 5b 69 4f 72 64 65 72 5d 20  TblType[iOrder] 
b4f0: 3d 20 72 62 75 53 74 72 6e 64 75 70 28 7a 54 79  = rbuStrndup(zTy
b500: 70 65 2c 20 26 70 2d 3e 72 63 29 3b 0a 20 20 20  pe, &p->rc);.   
b510: 20 20 20 20 20 70 49 74 65 72 2d 3e 61 62 54 62       pIter->abTb
b520: 6c 50 6b 5b 69 4f 72 64 65 72 5d 20 3d 20 28 69  lPk[iOrder] = (i
b530: 50 6b 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20  Pk!=0);.        
b540: 70 49 74 65 72 2d 3e 61 62 4e 6f 74 4e 75 6c 6c  pIter->abNotNull
b550: 5b 69 4f 72 64 65 72 5d 20 3d 20 28 75 38 29 62  [iOrder] = (u8)b
b560: 4e 6f 74 4e 75 6c 6c 20 7c 7c 20 28 69 50 6b 21  NotNull || (iPk!
b570: 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 69 4f 72  =0);.        iOr
b580: 64 65 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  der++;.      }. 
b590: 20 20 20 7d 0a 0a 20 20 20 20 72 62 75 46 69 6e     }..    rbuFin
b5a0: 61 6c 69 7a 65 28 70 2c 20 70 53 74 6d 74 29 3b  alize(p, pStmt);
b5b0: 0a 20 20 20 20 72 62 75 4f 62 6a 49 74 65 72 43  .    rbuObjIterC
b5c0: 61 63 68 65 49 6e 64 65 78 65 64 43 6f 6c 73 28  acheIndexedCols(
b5d0: 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 61  p, pIter);.    a
b5e0: 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 65 54  ssert( pIter->eT
b5f0: 79 70 65 21 3d 52 42 55 5f 50 4b 5f 56 54 41 42  ype!=RBU_PK_VTAB
b600: 20 7c 7c 20 70 49 74 65 72 2d 3e 61 62 49 6e 64   || pIter->abInd
b610: 65 78 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61  exed==0 );.    a
b620: 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 65 54  ssert( pIter->eT
b630: 79 70 65 21 3d 52 42 55 5f 50 4b 5f 56 54 41 42  ype!=RBU_PK_VTAB
b640: 20 7c 7c 20 70 49 74 65 72 2d 3e 6e 49 6e 64 65   || pIter->nInde
b650: 78 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 72  x==0 );.  }..  r
b660: 65 74 75 72 6e 20 70 2d 3e 72 63 3b 0a 7d 0a 0a  eturn p->rc;.}..
b670: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
b680: 69 6f 6e 20 63 6f 6e 73 74 72 75 63 74 73 20 61  ion constructs a
b690: 6e 64 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69  nd returns a poi
b6a0: 6e 74 65 72 20 74 6f 20 61 20 6e 75 6c 2d 74 65  nter to a nul-te
b6b0: 72 6d 69 6e 61 74 65 64 20 0a 2a 2a 20 73 74 72  rminated .** str
b6c0: 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 73  ing containing s
b6d0: 6f 6d 65 20 53 51 4c 20 63 6c 61 75 73 65 20 6f  ome SQL clause o
b6e0: 72 20 6c 69 73 74 20 62 61 73 65 64 20 6f 6e 20  r list based on 
b6f0: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74  one or more of t
b700: 68 65 20 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6e 61  he .** column na
b710: 6d 65 73 20 63 75 72 72 65 6e 74 6c 79 20 73 74  mes currently st
b720: 6f 72 65 64 20 69 6e 20 74 68 65 20 70 49 74 65  ored in the pIte
b730: 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 5d 20 61 72  r->azTblCol[] ar
b740: 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ray..*/.static c
b750: 68 61 72 20 2a 72 62 75 4f 62 6a 49 74 65 72 47  har *rbuObjIterG
b760: 65 74 43 6f 6c 6c 69 73 74 28 0a 20 20 73 71 6c  etCollist(.  sql
b770: 69 74 65 33 72 62 75 20 2a 70 2c 20 20 20 20 20  ite3rbu *p,     
b780: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b790: 52 42 55 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  RBU object */.  
b7a0: 52 62 75 4f 62 6a 49 74 65 72 20 2a 70 49 74 65  RbuObjIter *pIte
b7b0: 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r               
b7c0: 2f 2a 20 4f 62 6a 65 63 74 20 69 74 65 72 61 74  /* Object iterat
b7d0: 6f 72 20 66 6f 72 20 63 6f 6c 75 6d 6e 20 6e 61  or for column na
b7e0: 6d 65 73 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72  mes */.){.  char
b7f0: 20 2a 7a 4c 69 73 74 20 3d 20 30 3b 0a 20 20 63   *zList = 0;.  c
b800: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 65 70 20  onst char *zSep 
b810: 3d 20 22 22 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  = "";.  int i;. 
b820: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65   for(i=0; i<pIte
b830: 72 2d 3e 6e 54 62 6c 43 6f 6c 3b 20 69 2b 2b 29  r->nTblCol; i++)
b840: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
b850: 20 2a 7a 20 3d 20 70 49 74 65 72 2d 3e 61 7a 54   *z = pIter->azT
b860: 62 6c 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 7a 4c  blCol[i];.    zL
b870: 69 73 74 20 3d 20 72 62 75 4d 50 72 69 6e 74 66  ist = rbuMPrintf
b880: 28 70 2c 20 22 25 7a 25 73 5c 22 25 77 5c 22 22  (p, "%z%s\"%w\""
b890: 2c 20 7a 4c 69 73 74 2c 20 7a 53 65 70 2c 20 7a  , zList, zSep, z
b8a0: 29 3b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 2c  );.    zSep = ",
b8b0: 20 22 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   ";.  }.  return
b8c0: 20 7a 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   zList;.}../*.**
b8d0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
b8e0: 73 20 75 73 65 64 20 74 6f 20 63 72 65 61 74 65  s used to create
b8f0: 20 61 20 53 45 4c 45 43 54 20 6c 69 73 74 20 28   a SELECT list (
b900: 74 68 65 20 6c 69 73 74 20 6f 66 20 53 51 4c 20  the list of SQL 
b910: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20  .** expressions 
b920: 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 61 20 53  that follows a S
b930: 45 4c 45 43 54 20 6b 65 79 77 6f 72 64 29 20 66  ELECT keyword) f
b940: 6f 72 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  or a SELECT stat
b950: 65 6d 65 6e 74 20 0a 2a 2a 20 75 73 65 64 20 74  ement .** used t
b960: 6f 20 72 65 61 64 20 66 72 6f 6d 20 61 6e 20 64  o read from an d
b970: 61 74 61 5f 78 78 78 20 6f 72 20 72 62 75 5f 74  ata_xxx or rbu_t
b980: 6d 70 5f 78 78 78 20 74 61 62 6c 65 20 77 68 69  mp_xxx table whi
b990: 6c 65 20 75 70 64 61 74 69 6e 67 20 74 68 65 20  le updating the 
b9a0: 0a 2a 2a 20 69 6e 64 65 78 20 6f 62 6a 65 63 74  .** index object
b9b0: 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 64 69 63   currently indic
b9c0: 61 74 65 64 20 62 79 20 74 68 65 20 69 74 65 72  ated by the iter
b9d0: 61 74 6f 72 20 6f 62 6a 65 63 74 20 70 61 73 73  ator object pass
b9e0: 65 64 20 61 73 20 74 68 65 20 0a 2a 2a 20 73 65  ed as the .** se
b9f0: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 20 41  cond argument. A
ba00: 20 22 50 52 41 47 4d 41 20 69 6e 64 65 78 5f 78   "PRAGMA index_x
ba10: 69 6e 66 6f 20 3d 20 3c 69 64 78 6e 61 6d 65 3e  info = <idxname>
ba20: 22 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 75  " statement is u
ba30: 73 65 64 20 0a 2a 2a 20 74 6f 20 6f 62 74 61 69  sed .** to obtai
ba40: 6e 20 74 68 65 20 72 65 71 75 69 72 65 64 20 69  n the required i
ba50: 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a  nformation..**.*
ba60: 2a 20 49 66 20 74 68 65 20 69 6e 64 65 78 20 69  * If the index i
ba70: 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  s of the followi
ba80: 6e 67 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20  ng form:.**.**  
ba90: 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31   CREATE INDEX i1
baa0: 20 4f 4e 20 74 31 28 63 2c 20 62 20 43 4f 4c 4c   ON t1(c, b COLL
bab0: 41 54 45 20 6e 6f 63 61 73 65 29 3b 0a 2a 2a 0a  ATE nocase);.**.
bac0: 2a 2a 20 61 6e 64 20 22 74 31 22 20 69 73 20 61  ** and "t1" is a
bad0: 20 74 61 62 6c 65 20 77 69 74 68 20 61 6e 20 65   table with an e
bae0: 78 70 6c 69 63 69 74 20 49 4e 54 45 47 45 52 20  xplicit INTEGER 
baf0: 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75  PRIMARY KEY colu
bb00: 6d 6e 20 0a 2a 2a 20 22 69 70 6b 22 2c 20 74 68  mn .** "ipk", th
bb10: 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e  e returned strin
bb20: 67 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 60  g is:.**.**   "`
bb30: 63 60 20 43 4f 4c 4c 41 54 45 20 27 42 49 4e 41  c` COLLATE 'BINA
bb40: 52 59 27 2c 20 60 62 60 20 43 4f 4c 4c 41 54 45  RY', `b` COLLATE
bb50: 20 27 4e 4f 43 41 53 45 27 2c 20 60 69 70 6b 60   'NOCASE', `ipk`
bb60: 20 43 4f 4c 4c 41 54 45 20 27 42 49 4e 41 52 59   COLLATE 'BINARY
bb70: 27 22 0a 2a 2a 0a 2a 2a 20 41 73 20 77 65 6c 6c  '".**.** As well
bb80: 20 61 73 20 74 68 65 20 72 65 74 75 72 6e 65 64   as the returned
bb90: 20 73 74 72 69 6e 67 2c 20 74 68 72 65 65 20 6f   string, three o
bba0: 74 68 65 72 20 6d 61 6c 6c 6f 63 27 64 20 73 74  ther malloc'd st
bbb0: 72 69 6e 67 73 20 61 72 65 20 0a 2a 2a 20 72 65  rings are .** re
bbc0: 74 75 72 6e 65 64 20 76 69 61 20 6f 75 74 70 75  turned via outpu
bbd0: 74 20 70 61 72 61 6d 65 74 65 72 73 2e 20 41 73  t parameters. As
bbe0: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
bbf0: 20 20 70 7a 49 6d 70 6f 73 74 65 72 43 6f 6c 73    pzImposterCols
bc00: 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 70 7a 49 6d 70  : ....**   pzImp
bc10: 6f 73 74 65 72 50 6b 3a 20 2e 2e 2e 0a 2a 2a 20  osterPk: ....** 
bc20: 20 20 70 7a 57 68 65 72 65 3a 20 2e 2e 2e 0a 2a    pzWhere: ....*
bc30: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 72  /.static char *r
bc40: 62 75 4f 62 6a 49 74 65 72 47 65 74 49 6e 64 65  buObjIterGetInde
bc50: 78 43 6f 6c 73 28 0a 20 20 73 71 6c 69 74 65 33  xCols(.  sqlite3
bc60: 72 62 75 20 2a 70 2c 20 20 20 20 20 20 20 20 20  rbu *p,         
bc70: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 42 55 20           /* RBU 
bc80: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 52 62 75 4f  object */.  RbuO
bc90: 62 6a 49 74 65 72 20 2a 70 49 74 65 72 2c 20 20  bjIter *pIter,  
bca0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
bcb0: 62 6a 65 63 74 20 69 74 65 72 61 74 6f 72 20 66  bject iterator f
bcc0: 6f 72 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  or column names 
bcd0: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 49 6d  */.  char **pzIm
bce0: 70 6f 73 74 65 72 43 6f 6c 73 2c 20 20 20 20 20  posterCols,     
bcf0: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 43 6f 6c       /* OUT: Col
bd00: 75 6d 6e 73 20 66 6f 72 20 69 6d 70 6f 73 74 65  umns for imposte
bd10: 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63 68 61  r table */.  cha
bd20: 72 20 2a 2a 70 7a 49 6d 70 6f 73 74 65 72 50 6b  r **pzImposterPk
bd30: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
bd40: 4f 55 54 3a 20 49 6d 70 6f 73 74 65 72 20 50 4b  OUT: Imposter PK
bd50: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 63 68 61   clause */.  cha
bd60: 72 20 2a 2a 70 7a 57 68 65 72 65 2c 20 20 20 20  r **pzWhere,    
bd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
bd80: 4f 55 54 3a 20 57 48 45 52 45 20 63 6c 61 75 73  OUT: WHERE claus
bd90: 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 42 69  e */.  int *pnBi
bda0: 6e 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20  nd              
bdb0: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54         /* OUT: T
bdc0: 72 62 75 6c 20 6e 75 6d 62 65 72 20 6f 66 20 63  rbul number of c
bdd0: 6f 6c 75 6d 6e 73 20 2a 2f 0a 29 7b 0a 20 20 69  olumns */.){.  i
bde0: 6e 74 20 72 63 20 3d 20 70 2d 3e 72 63 3b 20 20  nt rc = p->rc;  
bdf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
be00: 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a  * Error code */.
be10: 20 20 69 6e 74 20 72 63 32 3b 20 20 20 20 20 20    int rc2;      
be20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be30: 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 66 69 6e    /* sqlite3_fin
be40: 61 6c 69 7a 65 28 29 20 72 65 74 75 72 6e 20 63  alize() return c
be50: 6f 64 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ode */.  char *z
be60: 52 65 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Ret = 0;        
be70: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 72 69           /* Stri
be80: 6e 67 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  ng to return */.
be90: 20 20 63 68 61 72 20 2a 7a 49 6d 70 43 6f 6c 73    char *zImpCols
bea0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
beb0: 20 20 2f 2a 20 53 74 72 69 6e 67 20 74 6f 20 72    /* String to r
bec0: 65 74 75 72 6e 20 76 69 61 20 2a 70 7a 49 6d 70  eturn via *pzImp
bed0: 6f 73 74 65 72 43 6f 6c 73 20 2a 2f 0a 20 20 63  osterCols */.  c
bee0: 68 61 72 20 2a 7a 49 6d 70 50 4b 20 3d 20 30 3b  har *zImpPK = 0;
bef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bf00: 2a 20 53 74 72 69 6e 67 20 74 6f 20 72 65 74 75  * String to retu
bf10: 72 6e 20 76 69 61 20 2a 70 7a 49 6d 70 6f 73 74  rn via *pzImpost
bf20: 65 72 50 4b 20 2a 2f 0a 20 20 63 68 61 72 20 2a  erPK */.  char *
bf30: 7a 57 68 65 72 65 20 3d 20 30 3b 20 20 20 20 20  zWhere = 0;     
bf40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 72            /* Str
bf50: 69 6e 67 20 74 6f 20 72 65 74 75 72 6e 20 76 69  ing to return vi
bf60: 61 20 2a 70 7a 57 68 65 72 65 20 2a 2f 0a 20 20  a *pzWhere */.  
bf70: 69 6e 74 20 6e 42 69 6e 64 20 3d 20 30 3b 20 20  int nBind = 0;  
bf80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf90: 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75  /* Value to retu
bfa0: 72 6e 20 76 69 61 20 2a 70 6e 42 69 6e 64 20 2a  rn via *pnBind *
bfb0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
bfc0: 7a 43 6f 6d 20 3d 20 22 22 3b 20 20 20 20 20 20  zCom = "";      
bfd0: 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 22 2c      /* Set to ",
bfe0: 20 22 20 6c 61 74 65 72 20 6f 6e 20 2a 2f 0a 20   " later on */. 
bff0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 6e   const char *zAn
c000: 64 20 3d 20 22 22 3b 20 20 20 20 20 20 20 20 20  d = "";         
c010: 20 2f 2a 20 53 65 74 20 74 6f 20 22 20 41 4e 44   /* Set to " AND
c020: 20 22 20 6c 61 74 65 72 20 6f 6e 20 2a 2f 0a 20   " later on */. 
c030: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
c040: 58 49 6e 66 6f 20 3d 20 30 3b 20 20 20 20 20 20  XInfo = 0;      
c050: 20 2f 2a 20 50 52 41 47 4d 41 20 69 6e 64 65 78   /* PRAGMA index
c060: 5f 78 69 6e 66 6f 20 3d 20 3f 20 2a 2f 0a 0a 20  _xinfo = ? */.. 
c070: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
c080: 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  OK ){.    assert
c090: 28 20 70 2d 3e 7a 45 72 72 6d 73 67 3d 3d 30 20  ( p->zErrmsg==0 
c0a0: 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 72 65 70  );.    rc = prep
c0b0: 61 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63  areFreeAndCollec
c0c0: 74 45 72 72 6f 72 28 70 2d 3e 64 62 4d 61 69 6e  tError(p->dbMain
c0d0: 2c 20 26 70 58 49 6e 66 6f 2c 20 26 70 2d 3e 7a  , &pXInfo, &p->z
c0e0: 45 72 72 6d 73 67 2c 0a 20 20 20 20 20 20 20 20  Errmsg,.        
c0f0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
c100: 22 50 52 41 47 4d 41 20 6d 61 69 6e 2e 69 6e 64  "PRAGMA main.ind
c110: 65 78 5f 78 69 6e 66 6f 20 3d 20 25 51 22 2c 20  ex_xinfo = %Q", 
c120: 70 49 74 65 72 2d 3e 7a 49 64 78 29 0a 20 20 20  pIter->zIdx).   
c130: 20 29 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65   );.  }..  while
c140: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
c150: 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  && SQLITE_ROW==s
c160: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 58 49 6e  qlite3_step(pXIn
c170: 66 6f 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  fo) ){.    int i
c180: 43 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  Cid = sqlite3_co
c190: 6c 75 6d 6e 5f 69 6e 74 28 70 58 49 6e 66 6f 2c  lumn_int(pXInfo,
c1a0: 20 31 29 3b 0a 20 20 20 20 69 6e 74 20 62 44 65   1);.    int bDe
c1b0: 73 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  sc = sqlite3_col
c1c0: 75 6d 6e 5f 69 6e 74 28 70 58 49 6e 66 6f 2c 20  umn_int(pXInfo, 
c1d0: 33 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  3);.    const ch
c1e0: 61 72 20 2a 7a 43 6f 6c 6c 61 74 65 20 3d 20 28  ar *zCollate = (
c1f0: 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
c200: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
c210: 70 58 49 6e 66 6f 2c 20 34 29 3b 0a 20 20 20 20  pXInfo, 4);.    
c220: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
c230: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
c240: 20 2a 7a 54 79 70 65 3b 0a 0a 20 20 20 20 69 66   *zType;..    if
c250: 28 20 69 43 69 64 3c 30 20 29 7b 0a 20 20 20 20  ( iCid<0 ){.    
c260: 20 20 2f 2a 20 41 6e 20 69 6e 74 65 67 65 72 20    /* An integer 
c270: 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 49 66 20  primary key. If 
c280: 74 68 65 20 74 61 62 6c 65 20 68 61 73 20 61 6e  the table has an
c290: 20 65 78 70 6c 69 63 69 74 20 49 50 4b 2c 20 75   explicit IPK, u
c2a0: 73 65 0a 20 20 20 20 20 20 2a 2a 20 69 74 73 20  se.      ** its 
c2b0: 6e 61 6d 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  name. Otherwise,
c2c0: 20 75 73 65 20 22 72 62 75 5f 72 6f 77 69 64 22   use "rbu_rowid"
c2d0: 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  .  */.      if( 
c2e0: 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42  pIter->eType==RB
c2f0: 55 5f 50 4b 5f 49 50 4b 20 29 7b 0a 20 20 20 20  U_PK_IPK ){.    
c300: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
c310: 20 20 20 66 6f 72 28 69 3d 30 3b 20 70 49 74 65     for(i=0; pIte
c320: 72 2d 3e 61 62 54 62 6c 50 6b 5b 69 5d 3d 3d 30  r->abTblPk[i]==0
c330: 3b 20 69 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20  ; i++);.        
c340: 61 73 73 65 72 74 28 20 69 3c 70 49 74 65 72 2d  assert( i<pIter-
c350: 3e 6e 54 62 6c 43 6f 6c 20 29 3b 0a 20 20 20 20  >nTblCol );.    
c360: 20 20 20 20 7a 43 6f 6c 20 3d 20 70 49 74 65 72      zCol = pIter
c370: 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69 5d 3b 0a 20  ->azTblCol[i];. 
c380: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72       }else if( r
c390: 62 75 49 73 56 61 63 75 75 6d 28 70 29 20 29 7b  buIsVacuum(p) ){
c3a0: 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20  .        zCol = 
c3b0: 22 5f 72 6f 77 69 64 5f 22 3b 0a 20 20 20 20 20  "_rowid_";.     
c3c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
c3d0: 7a 43 6f 6c 20 3d 20 22 72 62 75 5f 72 6f 77 69  zCol = "rbu_rowi
c3e0: 64 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  d";.      }.    
c3f0: 20 20 7a 54 79 70 65 20 3d 20 22 49 4e 54 45 47    zType = "INTEG
c400: 45 52 22 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ER";.    }else{.
c410: 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 70 49 74        zCol = pIt
c420: 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69 43 69  er->azTblCol[iCi
c430: 64 5d 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 20  d];.      zType 
c440: 3d 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 54 79  = pIter->azTblTy
c450: 70 65 5b 69 43 69 64 5d 3b 0a 20 20 20 20 7d 0a  pe[iCid];.    }.
c460: 0a 20 20 20 20 7a 52 65 74 20 3d 20 73 71 6c 69  .    zRet = sqli
c470: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a 25  te3_mprintf("%z%
c480: 73 5c 22 25 77 5c 22 20 43 4f 4c 4c 41 54 45 20  s\"%w\" COLLATE 
c490: 25 51 22 2c 20 7a 52 65 74 2c 20 7a 43 6f 6d 2c  %Q", zRet, zCom,
c4a0: 20 7a 43 6f 6c 2c 20 7a 43 6f 6c 6c 61 74 65 29   zCol, zCollate)
c4b0: 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  ;.    if( pIter-
c4c0: 3e 62 55 6e 69 71 75 65 3d 3d 30 20 7c 7c 20 73  >bUnique==0 || s
c4d0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
c4e0: 74 28 70 58 49 6e 66 6f 2c 20 35 29 20 29 7b 0a  t(pXInfo, 5) ){.
c4f0: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
c500: 20 2a 7a 4f 72 64 65 72 20 3d 20 28 62 44 65 73   *zOrder = (bDes
c510: 63 20 3f 20 22 20 44 45 53 43 22 20 3a 20 22 22  c ? " DESC" : ""
c520: 29 3b 0a 20 20 20 20 20 20 7a 49 6d 70 50 4b 20  );.      zImpPK 
c530: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
c540: 66 28 22 25 7a 25 73 5c 22 72 62 75 5f 69 6d 70  f("%z%s\"rbu_imp
c550: 5f 25 64 25 77 5c 22 25 73 22 2c 20 0a 20 20 20  _%d%w\"%s", .   
c560: 20 20 20 20 20 20 20 7a 49 6d 70 50 4b 2c 20 7a         zImpPK, z
c570: 43 6f 6d 2c 20 6e 42 69 6e 64 2c 20 7a 43 6f 6c  Com, nBind, zCol
c580: 2c 20 7a 4f 72 64 65 72 0a 20 20 20 20 20 20 29  , zOrder.      )
c590: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 49 6d 70  ;.    }.    zImp
c5a0: 43 6f 6c 73 20 3d 20 73 71 6c 69 74 65 33 5f 6d  Cols = sqlite3_m
c5b0: 70 72 69 6e 74 66 28 22 25 7a 25 73 5c 22 72 62  printf("%z%s\"rb
c5c0: 75 5f 69 6d 70 5f 25 64 25 77 5c 22 20 25 73 20  u_imp_%d%w\" %s 
c5d0: 43 4f 4c 4c 41 54 45 20 25 51 22 2c 20 0a 20 20  COLLATE %Q", .  
c5e0: 20 20 20 20 20 20 7a 49 6d 70 43 6f 6c 73 2c 20        zImpCols, 
c5f0: 7a 43 6f 6d 2c 20 6e 42 69 6e 64 2c 20 7a 43 6f  zCom, nBind, zCo
c600: 6c 2c 20 7a 54 79 70 65 2c 20 7a 43 6f 6c 6c 61  l, zType, zColla
c610: 74 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 7a 57  te.    );.    zW
c620: 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d  here = sqlite3_m
c630: 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  printf(.        
c640: 22 25 7a 25 73 5c 22 72 62 75 5f 69 6d 70 5f 25  "%z%s\"rbu_imp_%
c650: 64 25 77 5c 22 20 49 53 20 3f 22 2c 20 7a 57 68  d%w\" IS ?", zWh
c660: 65 72 65 2c 20 7a 41 6e 64 2c 20 6e 42 69 6e 64  ere, zAnd, nBind
c670: 2c 20 7a 43 6f 6c 0a 20 20 20 20 29 3b 0a 20 20  , zCol.    );.  
c680: 20 20 69 66 28 20 7a 52 65 74 3d 3d 30 20 7c 7c    if( zRet==0 ||
c690: 20 7a 49 6d 70 50 4b 3d 3d 30 20 7c 7c 20 7a 49   zImpPK==0 || zI
c6a0: 6d 70 43 6f 6c 73 3d 3d 30 20 7c 7c 20 7a 57 68  mpCols==0 || zWh
c6b0: 65 72 65 3d 3d 30 20 29 20 72 63 20 3d 20 53 51  ere==0 ) rc = SQ
c6c0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
c6d0: 7a 43 6f 6d 20 3d 20 22 2c 20 22 3b 0a 20 20 20  zCom = ", ";.   
c6e0: 20 7a 41 6e 64 20 3d 20 22 20 41 4e 44 20 22 3b   zAnd = " AND ";
c6f0: 0a 20 20 20 20 6e 42 69 6e 64 2b 2b 3b 0a 20 20  .    nBind++;.  
c700: 7d 0a 0a 20 20 72 63 32 20 3d 20 73 71 6c 69 74  }..  rc2 = sqlit
c710: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 58 49 6e  e3_finalize(pXIn
c720: 66 6f 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  fo);.  if( rc==S
c730: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20  QLITE_OK ) rc = 
c740: 72 63 32 3b 0a 0a 20 20 69 66 28 20 72 63 21 3d  rc2;..  if( rc!=
c750: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
c760: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 52   sqlite3_free(zR
c770: 65 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  et);.    sqlite3
c780: 5f 66 72 65 65 28 7a 49 6d 70 43 6f 6c 73 29 3b  _free(zImpCols);
c790: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
c7a0: 65 28 7a 49 6d 70 50 4b 29 3b 0a 20 20 20 20 73  e(zImpPK);.    s
c7b0: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 57 68 65  qlite3_free(zWhe
c7c0: 72 65 29 3b 0a 20 20 20 20 7a 52 65 74 20 3d 20  re);.    zRet = 
c7d0: 30 3b 0a 20 20 20 20 7a 49 6d 70 43 6f 6c 73 20  0;.    zImpCols 
c7e0: 3d 20 30 3b 0a 20 20 20 20 7a 49 6d 70 50 4b 20  = 0;.    zImpPK 
c7f0: 3d 20 30 3b 0a 20 20 20 20 7a 57 68 65 72 65 20  = 0;.    zWhere 
c800: 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  = 0;.    p->rc =
c810: 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2a 70 7a 49   rc;.  }..  *pzI
c820: 6d 70 6f 73 74 65 72 43 6f 6c 73 20 3d 20 7a 49  mposterCols = zI
c830: 6d 70 43 6f 6c 73 3b 0a 20 20 2a 70 7a 49 6d 70  mpCols;.  *pzImp
c840: 6f 73 74 65 72 50 6b 20 3d 20 7a 49 6d 70 50 4b  osterPk = zImpPK
c850: 3b 0a 20 20 2a 70 7a 57 68 65 72 65 20 3d 20 7a  ;.  *pzWhere = z
c860: 57 68 65 72 65 3b 0a 20 20 2a 70 6e 42 69 6e 64  Where;.  *pnBind
c870: 20 3d 20 6e 42 69 6e 64 3b 0a 20 20 72 65 74 75   = nBind;.  retu
c880: 72 6e 20 7a 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn zRet;.}../*.*
c890: 2a 20 41 73 73 75 6d 69 6e 67 20 74 68 65 20 63  * Assuming the c
c8a0: 75 72 72 65 6e 74 20 74 61 62 6c 65 20 63 6f 6c  urrent table col
c8b0: 75 6d 6e 73 20 61 72 65 20 22 61 22 2c 20 22 62  umns are "a", "b
c8c0: 22 20 61 6e 64 20 22 63 22 2c 20 61 6e 64 20 74  " and "c", and t
c8d0: 68 65 20 7a 4f 62 6a 0a 2a 2a 20 70 61 72 61 6d  he zObj.** param
c8e0: 74 65 72 20 69 73 20 70 61 73 73 65 64 20 22 6f  ter is passed "o
c8f0: 6c 64 22 2c 20 72 65 74 75 72 6e 20 61 20 73 74  ld", return a st
c900: 72 69 6e 67 20 6f 66 20 74 68 65 20 66 6f 72 6d  ring of the form
c910: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 22 6f 6c 64  :.**.**     "old
c920: 2e 61 2c 20 6f 6c 64 2e 62 2c 20 6f 6c 64 2e 62  .a, old.b, old.b
c930: 22 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 74 68 65  ".**.** With the
c940: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 65 73   column names es
c950: 63 61 70 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  caped..**.** For
c960: 20 74 61 62 6c 65 73 20 77 69 74 68 20 69 6d 70   tables with imp
c970: 6c 69 63 69 74 20 72 6f 77 69 64 73 20 2d 20 52  licit rowids - R
c980: 42 55 5f 50 4b 5f 45 58 54 45 52 4e 41 4c 20 61  BU_PK_EXTERNAL a
c990: 6e 64 20 52 42 55 5f 50 4b 5f 4e 4f 4e 45 2c 20  nd RBU_PK_NONE, 
c9a0: 61 70 70 65 6e 64 0a 2a 2a 20 74 68 65 20 74 65  append.** the te
c9b0: 78 74 20 22 2c 20 6f 6c 64 2e 5f 72 6f 77 69 64  xt ", old._rowid
c9c0: 5f 22 20 74 6f 20 74 68 65 20 72 65 74 75 72 6e  _" to the return
c9d0: 65 64 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61  ed value..*/.sta
c9e0: 74 69 63 20 63 68 61 72 20 2a 72 62 75 4f 62 6a  tic char *rbuObj
c9f0: 49 74 65 72 47 65 74 4f 6c 64 6c 69 73 74 28 0a  IterGetOldlist(.
ca00: 20 20 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c    sqlite3rbu *p,
ca10: 20 0a 20 20 52 62 75 4f 62 6a 49 74 65 72 20 2a   .  RbuObjIter *
ca20: 70 49 74 65 72 2c 0a 20 20 63 6f 6e 73 74 20 63  pIter,.  const c
ca30: 68 61 72 20 2a 7a 4f 62 6a 0a 29 7b 0a 20 20 63  har *zObj.){.  c
ca40: 68 61 72 20 2a 7a 4c 69 73 74 20 3d 20 30 3b 0a  har *zList = 0;.
ca50: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
ca60: 49 54 45 5f 4f 4b 20 26 26 20 70 49 74 65 72 2d  ITE_OK && pIter-
ca70: 3e 61 62 49 6e 64 65 78 65 64 20 29 7b 0a 20 20  >abIndexed ){.  
ca80: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
ca90: 20 3d 20 22 22 3b 0a 20 20 20 20 69 6e 74 20 69   = "";.    int i
caa0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
cab0: 3c 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 3b  <pIter->nTblCol;
cac0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
cad0: 20 70 49 74 65 72 2d 3e 61 62 49 6e 64 65 78 65   pIter->abIndexe
cae0: 64 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  d[i] ){.        
caf0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
cb00: 20 3d 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43   = pIter->azTblC
cb10: 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 7a  ol[i];.        z
cb20: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d  List = sqlite3_m
cb30: 70 72 69 6e 74 66 28 22 25 7a 25 73 25 73 2e 5c  printf("%z%s%s.\
cb40: 22 25 77 5c 22 22 2c 20 7a 4c 69 73 74 2c 20 7a  "%w\"", zList, z
cb50: 53 2c 20 7a 4f 62 6a 2c 20 7a 43 6f 6c 29 3b 0a  S, zObj, zCol);.
cb60: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
cb70: 20 20 20 20 20 7a 4c 69 73 74 20 3d 20 73 71 6c       zList = sql
cb80: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a  ite3_mprintf("%z
cb90: 25 73 4e 55 4c 4c 22 2c 20 7a 4c 69 73 74 2c 20  %sNULL", zList, 
cba0: 7a 53 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  zS);.      }.   
cbb0: 20 20 20 7a 53 20 3d 20 22 2c 20 22 3b 0a 20 20     zS = ", ";.  
cbc0: 20 20 20 20 69 66 28 20 7a 4c 69 73 74 3d 3d 30      if( zList==0
cbd0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72   ){.        p->r
cbe0: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
cbf0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
cc00: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
cc10: 20 20 20 20 2f 2a 20 46 6f 72 20 61 20 74 61 62      /* For a tab
cc20: 6c 65 20 77 69 74 68 20 69 6d 70 6c 69 63 69 74  le with implicit
cc30: 20 72 6f 77 69 64 73 2c 20 61 70 70 65 6e 64 20   rowids, append 
cc40: 22 6f 6c 64 2e 5f 72 6f 77 69 64 5f 22 20 74 6f  "old._rowid_" to
cc50: 20 74 68 65 20 6c 69 73 74 2e 20 2a 2f 0a 20 20   the list. */.  
cc60: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 65 54 79    if( pIter->eTy
cc70: 70 65 3d 3d 52 42 55 5f 50 4b 5f 45 58 54 45 52  pe==RBU_PK_EXTER
cc80: 4e 41 4c 20 7c 7c 20 70 49 74 65 72 2d 3e 65 54  NAL || pIter->eT
cc90: 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 4e 4f 4e 45  ype==RBU_PK_NONE
cca0: 20 29 7b 0a 20 20 20 20 20 20 7a 4c 69 73 74 20   ){.      zList 
ccb0: 3d 20 72 62 75 4d 50 72 69 6e 74 66 28 70 2c 20  = rbuMPrintf(p, 
ccc0: 22 25 7a 2c 20 25 73 2e 5f 72 6f 77 69 64 5f 22  "%z, %s._rowid_"
ccd0: 2c 20 7a 4c 69 73 74 2c 20 7a 4f 62 6a 29 3b 0a  , zList, zObj);.
cce0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
ccf0: 72 6e 20 7a 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a  rn zList;.}../*.
cd00: 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 65 78 70  ** Return an exp
cd10: 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63 61 6e  ression that can
cd20: 20 62 65 20 75 73 65 64 20 69 6e 20 61 20 57 48   be used in a WH
cd30: 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 6d 61  ERE clause to ma
cd40: 74 63 68 20 74 68 65 0a 2a 2a 20 70 72 69 6d 61  tch the.** prima
cd50: 72 79 20 6b 65 79 20 6f 66 20 74 68 65 20 63 75  ry key of the cu
cd60: 72 72 65 6e 74 20 74 61 62 6c 65 2e 20 46 6f 72  rrent table. For
cd70: 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65   example, if the
cd80: 20 74 61 62 6c 65 20 69 73 3a 0a 2a 2a 0a 2a 2a   table is:.**.**
cd90: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
cda0: 74 31 28 61 2c 20 62 2c 20 63 2c 20 50 52 49 4d  t1(a, b, c, PRIM
cdb0: 41 52 59 20 4b 45 59 28 62 2c 20 63 29 29 3b 0a  ARY KEY(b, c));.
cdc0: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
cdd0: 20 73 74 72 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20   string:.**.**  
cde0: 20 22 62 20 3d 20 3f 31 20 41 4e 44 20 63 20 3d   "b = ?1 AND c =
cdf0: 20 3f 32 22 0a 2a 2f 0a 73 74 61 74 69 63 20 63   ?2".*/.static c
ce00: 68 61 72 20 2a 72 62 75 4f 62 6a 49 74 65 72 47  har *rbuObjIterG
ce10: 65 74 57 68 65 72 65 28 0a 20 20 73 71 6c 69 74  etWhere(.  sqlit
ce20: 65 33 72 62 75 20 2a 70 2c 20 0a 20 20 52 62 75  e3rbu *p, .  Rbu
ce30: 4f 62 6a 49 74 65 72 20 2a 70 49 74 65 72 0a 29  ObjIter *pIter.)
ce40: 7b 0a 20 20 63 68 61 72 20 2a 7a 4c 69 73 74 20  {.  char *zList 
ce50: 3d 20 30 3b 0a 20 20 69 66 28 20 70 49 74 65 72  = 0;.  if( pIter
ce60: 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f  ->eType==RBU_PK_
ce70: 56 54 41 42 20 7c 7c 20 70 49 74 65 72 2d 3e 65  VTAB || pIter->e
ce80: 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 4e 4f 4e  Type==RBU_PK_NON
ce90: 45 20 29 7b 0a 20 20 20 20 7a 4c 69 73 74 20 3d  E ){.    zList =
cea0: 20 72 62 75 4d 50 72 69 6e 74 66 28 70 2c 20 22   rbuMPrintf(p, "
ceb0: 5f 72 6f 77 69 64 5f 20 3d 20 3f 25 64 22 2c 20  _rowid_ = ?%d", 
cec0: 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 2b 31  pIter->nTblCol+1
ced0: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  );.  }else if( p
cee0: 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55  Iter->eType==RBU
cef0: 5f 50 4b 5f 45 58 54 45 52 4e 41 4c 20 29 7b 0a  _PK_EXTERNAL ){.
cf00: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
cf10: 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20 20 20 69  zSep = "";.    i
cf20: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
cf30: 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 54 62 6c  0; i<pIter->nTbl
cf40: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
cf50: 20 69 66 28 20 70 49 74 65 72 2d 3e 61 62 54 62   if( pIter->abTb
cf60: 6c 50 6b 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20  lPk[i] ){.      
cf70: 20 20 7a 4c 69 73 74 20 3d 20 72 62 75 4d 50 72    zList = rbuMPr
cf80: 69 6e 74 66 28 70 2c 20 22 25 7a 25 73 63 25 64  intf(p, "%z%sc%d
cf90: 3d 3f 25 64 22 2c 20 7a 4c 69 73 74 2c 20 7a 53  =?%d", zList, zS
cfa0: 65 70 2c 20 69 2c 20 69 2b 31 29 3b 0a 20 20 20  ep, i, i+1);.   
cfb0: 20 20 20 20 20 7a 53 65 70 20 3d 20 22 20 41 4e       zSep = " AN
cfc0: 44 20 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  D ";.      }.   
cfd0: 20 7d 0a 20 20 20 20 7a 4c 69 73 74 20 3d 20 72   }.    zList = r
cfe0: 62 75 4d 50 72 69 6e 74 66 28 70 2c 20 0a 20 20  buMPrintf(p, .  
cff0: 20 20 20 20 20 20 22 5f 72 6f 77 69 64 5f 20 3d        "_rowid_ =
d000: 20 28 53 45 4c 45 43 54 20 69 64 20 46 52 4f 4d   (SELECT id FROM
d010: 20 72 62 75 5f 69 6d 70 6f 73 74 65 72 32 20 57   rbu_imposter2 W
d020: 48 45 52 45 20 25 7a 29 22 2c 20 7a 4c 69 73 74  HERE %z)", zList
d030: 0a 20 20 20 20 29 3b 0a 0a 20 20 7d 65 6c 73 65  .    );..  }else
d040: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
d050: 20 2a 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20 20   *zSep = "";.   
d060: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
d070: 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 54  i=0; i<pIter->nT
d080: 62 6c 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  blCol; i++){.   
d090: 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 61 62     if( pIter->ab
d0a0: 54 62 6c 50 6b 5b 69 5d 20 29 7b 0a 20 20 20 20  TblPk[i] ){.    
d0b0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
d0c0: 7a 43 6f 6c 20 3d 20 70 49 74 65 72 2d 3e 61 7a  zCol = pIter->az
d0d0: 54 62 6c 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20  TblCol[i];.     
d0e0: 20 20 20 7a 4c 69 73 74 20 3d 20 72 62 75 4d 50     zList = rbuMP
d0f0: 72 69 6e 74 66 28 70 2c 20 22 25 7a 25 73 5c 22  rintf(p, "%z%s\"
d100: 25 77 5c 22 3d 3f 25 64 22 2c 20 7a 4c 69 73 74  %w\"=?%d", zList
d110: 2c 20 7a 53 65 70 2c 20 7a 43 6f 6c 2c 20 69 2b  , zSep, zCol, i+
d120: 31 29 3b 0a 20 20 20 20 20 20 20 20 7a 53 65 70  1);.        zSep
d130: 20 3d 20 22 20 41 4e 44 20 22 3b 0a 20 20 20 20   = " AND ";.    
d140: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
d150: 72 65 74 75 72 6e 20 7a 4c 69 73 74 3b 0a 7d 0a  return zList;.}.
d160: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 53 45 4c 45 43  ./*.** The SELEC
d170: 54 20 73 74 61 74 65 6d 65 6e 74 20 69 74 65 72  T statement iter
d180: 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20 74 68  ating through th
d190: 65 20 6b 65 79 73 20 66 6f 72 20 74 68 65 20 63  e keys for the c
d1a0: 75 72 72 65 6e 74 20 6f 62 6a 65 63 74 0a 2a 2a  urrent object.**
d1b0: 20 28 70 2d 3e 6f 62 6a 69 74 65 72 2e 70 53 65   (p->objiter.pSe
d1c0: 6c 65 63 74 29 20 63 75 72 72 65 6e 74 6c 79 20  lect) currently 
d1d0: 70 6f 69 6e 74 73 20 74 6f 20 61 20 76 61 6c 69  points to a vali
d1e0: 64 20 72 6f 77 2e 20 48 6f 77 65 76 65 72 2c 20  d row. However, 
d1f0: 74 68 65 72 65 0a 2a 2a 20 69 73 20 73 6f 6d 65  there.** is some
d200: 74 68 69 6e 67 20 77 72 6f 6e 67 20 77 69 74 68  thing wrong with
d210: 20 74 68 65 20 72 62 75 5f 63 6f 6e 74 72 6f 6c   the rbu_control
d220: 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 72 62   value in the rb
d230: 75 5f 63 6f 6e 74 72 6f 6c 20 76 61 6c 75 65 0a  u_control value.
d240: 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ** stored in the
d250: 20 28 70 2d 3e 6e 43 6f 6c 2b 31 29 27 74 68 20   (p->nCol+1)'th 
d260: 63 6f 6c 75 6d 6e 2e 20 53 65 74 20 74 68 65 20  column. Set the 
d270: 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 65  error code and e
d280: 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20  rror message.** 
d290: 6f 66 20 74 68 65 20 52 42 55 20 68 61 6e 64 6c  of the RBU handl
d2a0: 65 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 20 72  e to something r
d2b0: 65 66 6c 65 63 74 69 6e 67 20 74 68 69 73 2e 0a  eflecting this..
d2c0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
d2d0: 62 75 42 61 64 43 6f 6e 74 72 6f 6c 45 72 72 6f  buBadControlErro
d2e0: 72 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 29  r(sqlite3rbu *p)
d2f0: 7b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49  {.  p->rc = SQLI
d300: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 70 2d 3e 7a  TE_ERROR;.  p->z
d310: 45 72 72 6d 73 67 20 3d 20 73 71 6c 69 74 65 33  Errmsg = sqlite3
d320: 5f 6d 70 72 69 6e 74 66 28 22 69 6e 76 61 6c 69  _mprintf("invali
d330: 64 20 72 62 75 5f 63 6f 6e 74 72 6f 6c 20 76 61  d rbu_control va
d340: 6c 75 65 22 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  lue");.}.../*.**
d350: 20 52 65 74 75 72 6e 20 61 20 6e 75 6c 2d 74 65   Return a nul-te
d360: 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20  rminated string 
d370: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  containing the c
d380: 6f 6d 6d 61 20 73 65 70 61 72 61 74 65 64 20 6c  omma separated l
d390: 69 73 74 20 6f 66 0a 2a 2a 20 61 73 73 69 67 6e  ist of.** assign
d3a0: 6d 65 6e 74 73 20 74 68 61 74 20 73 68 6f 75 6c  ments that shoul
d3b0: 64 20 62 65 20 69 6e 63 6c 75 64 65 64 20 66 6f  d be included fo
d3c0: 6c 6c 6f 77 69 6e 67 20 74 68 65 20 22 53 45 54  llowing the "SET
d3d0: 22 20 6b 65 79 77 6f 72 64 20 6f 66 0a 2a 2a 20  " keyword of.** 
d3e0: 61 6e 20 55 50 44 41 54 45 20 73 74 61 74 65 6d  an UPDATE statem
d3f0: 65 6e 74 20 75 73 65 64 20 74 6f 20 75 70 64 61  ent used to upda
d400: 74 65 20 74 68 65 20 74 61 62 6c 65 20 6f 62 6a  te the table obj
d410: 65 63 74 20 74 68 61 74 20 74 68 65 20 69 74 65  ect that the ite
d420: 72 61 74 6f 72 0a 2a 2a 20 70 61 73 73 65 64 20  rator.** passed 
d430: 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
d440: 67 75 6d 65 6e 74 20 63 75 72 72 65 6e 74 6c 79  gument currently
d450: 20 70 6f 69 6e 74 73 20 74 6f 20 69 66 20 74 68   points to if th
d460: 65 20 72 62 75 5f 63 6f 6e 74 72 6f 6c 0a 2a 2a  e rbu_control.**
d470: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 64   column of the d
d480: 61 74 61 5f 78 78 78 20 74 61 62 6c 65 20 65 6e  ata_xxx table en
d490: 74 72 79 20 69 73 20 73 65 74 20 74 6f 20 7a 4d  try is set to zM
d4a0: 61 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  ask..**.** The m
d4b0: 65 6d 6f 72 79 20 66 6f 72 20 74 68 65 20 72 65  emory for the re
d4c0: 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73  turned string is
d4d0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
d4e0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e  qlite3_malloc().
d4f0: 0a 2a 2a 20 49 74 20 69 73 20 74 68 65 20 72 65  .** It is the re
d500: 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
d510: 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76  the caller to ev
d520: 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 20 69 74  entually free it
d530: 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65   using.** sqlite
d540: 33 5f 66 72 65 65 28 29 2e 20 0a 2a 2a 0a 2a 2a  3_free(). .**.**
d550: 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72   If an OOM error
d560: 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   is encountered 
d570: 77 68 65 6e 20 61 6c 6c 6f 63 61 74 69 6e 67 20  when allocating 
d580: 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 6e 65  space for the ne
d590: 77 0a 2a 2a 20 73 74 72 69 6e 67 2c 20 61 6e 20  w.** string, an 
d5a0: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 6c 65  error code is le
d5b0: 66 74 20 69 6e 20 74 68 65 20 72 62 75 20 68 61  ft in the rbu ha
d5c0: 6e 64 6c 65 20 70 61 73 73 65 64 20 61 73 20 74  ndle passed as t
d5d0: 68 65 20 66 69 72 73 74 0a 2a 2a 20 61 72 67 75  he first.** argu
d5e0: 6d 65 6e 74 20 61 6e 64 20 4e 55 4c 4c 20 69 73  ment and NULL is
d5f0: 20 72 65 74 75 72 6e 65 64 2e 20 4f 72 2c 20 69   returned. Or, i
d600: 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61  f an error has a
d610: 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 0a  lready occurred.
d620: 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ** when this fun
d630: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
d640: 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
d650: 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2c 20 77  d immediately, w
d660: 69 74 68 6f 75 74 0a 2a 2a 20 61 74 74 65 6d 70  ithout.** attemp
d670: 74 69 6e 67 20 74 68 65 20 61 6c 6c 6f 63 61 74  ting the allocat
d680: 69 6f 6e 20 6f 72 20 6d 6f 64 69 66 79 69 6e 67  ion or modifying
d690: 20 74 68 65 20 73 74 6f 72 65 64 20 65 72 72 6f   the stored erro
d6a0: 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  r code..*/.stati
d6b0: 63 20 63 68 61 72 20 2a 72 62 75 4f 62 6a 49 74  c char *rbuObjIt
d6c0: 65 72 47 65 74 53 65 74 6c 69 73 74 28 0a 20 20  erGetSetlist(.  
d6d0: 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 0a 20  sqlite3rbu *p,. 
d6e0: 20 52 62 75 4f 62 6a 49 74 65 72 20 2a 70 49 74   RbuObjIter *pIt
d6f0: 65 72 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  er,.  const char
d700: 20 2a 7a 4d 61 73 6b 0a 29 7b 0a 20 20 63 68 61   *zMask.){.  cha
d710: 72 20 2a 7a 4c 69 73 74 20 3d 20 30 3b 0a 20 20  r *zList = 0;.  
d720: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
d730: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20  E_OK ){.    int 
d740: 69 3b 0a 0a 20 20 20 20 69 66 28 20 28 69 6e 74  i;..    if( (int
d750: 29 73 74 72 6c 65 6e 28 7a 4d 61 73 6b 29 21 3d  )strlen(zMask)!=
d760: 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 20 29  pIter->nTblCol )
d770: 7b 0a 20 20 20 20 20 20 72 62 75 42 61 64 43 6f  {.      rbuBadCo
d780: 6e 74 72 6f 6c 45 72 72 6f 72 28 70 29 3b 0a 20  ntrolError(p);. 
d790: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d7a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 65 70  const char *zSep
d7b0: 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 66 6f 72   = "";.      for
d7c0: 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e  (i=0; i<pIter->n
d7d0: 54 62 6c 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  TblCol; i++){.  
d7e0: 20 20 20 20 20 20 63 68 61 72 20 63 20 3d 20 7a        char c = z
d7f0: 4d 61 73 6b 5b 70 49 74 65 72 2d 3e 61 69 53 72  Mask[pIter->aiSr
d800: 63 4f 72 64 65 72 5b 69 5d 5d 3b 0a 20 20 20 20  cOrder[i]];.    
d810: 20 20 20 20 69 66 28 20 63 3d 3d 27 78 27 20 29      if( c=='x' )
d820: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 4c 69 73  {.          zLis
d830: 74 20 3d 20 72 62 75 4d 50 72 69 6e 74 66 28 70  t = rbuMPrintf(p
d840: 2c 20 22 25 7a 25 73 5c 22 25 77 5c 22 3d 3f 25  , "%z%s\"%w\"=?%
d850: 64 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  d", .           
d860: 20 20 20 7a 4c 69 73 74 2c 20 7a 53 65 70 2c 20     zList, zSep, 
d870: 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b  pIter->azTblCol[
d880: 69 5d 2c 20 69 2b 31 0a 20 20 20 20 20 20 20 20  i], i+1.        
d890: 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a    );.          z
d8a0: 53 65 70 20 3d 20 22 2c 20 22 3b 0a 20 20 20 20  Sep = ", ";.    
d8b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 65 6c      }.        el
d8c0: 73 65 20 69 66 28 20 63 3d 3d 27 64 27 20 29 7b  se if( c=='d' ){
d8d0: 0a 20 20 20 20 20 20 20 20 20 20 7a 4c 69 73 74  .          zList
d8e0: 20 3d 20 72 62 75 4d 50 72 69 6e 74 66 28 70 2c   = rbuMPrintf(p,
d8f0: 20 22 25 7a 25 73 5c 22 25 77 5c 22 3d 72 62 75   "%z%s\"%w\"=rbu
d900: 5f 64 65 6c 74 61 28 5c 22 25 77 5c 22 2c 20 3f  _delta(\"%w\", ?
d910: 25 64 29 22 2c 20 0a 20 20 20 20 20 20 20 20 20  %d)", .         
d920: 20 20 20 20 20 7a 4c 69 73 74 2c 20 7a 53 65 70       zList, zSep
d930: 2c 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f  , pIter->azTblCo
d940: 6c 5b 69 5d 2c 20 70 49 74 65 72 2d 3e 61 7a 54  l[i], pIter->azT
d950: 62 6c 43 6f 6c 5b 69 5d 2c 20 69 2b 31 0a 20 20  blCol[i], i+1.  
d960: 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
d970: 20 20 20 20 20 7a 53 65 70 20 3d 20 22 2c 20 22       zSep = ", "
d980: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
d990: 20 20 20 20 65 6c 73 65 20 69 66 28 20 63 3d 3d      else if( c==
d9a0: 27 66 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20  'f' ){.         
d9b0: 20 7a 4c 69 73 74 20 3d 20 72 62 75 4d 50 72 69   zList = rbuMPri
d9c0: 6e 74 66 28 70 2c 20 22 25 7a 25 73 5c 22 25 77  ntf(p, "%z%s\"%w
d9d0: 5c 22 3d 72 62 75 5f 66 6f 73 73 69 6c 5f 64 65  \"=rbu_fossil_de
d9e0: 6c 74 61 28 5c 22 25 77 5c 22 2c 20 3f 25 64 29  lta(\"%w\", ?%d)
d9f0: 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ", .            
da00: 20 20 7a 4c 69 73 74 2c 20 7a 53 65 70 2c 20 70    zList, zSep, p
da10: 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69  Iter->azTblCol[i
da20: 5d 2c 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43  ], pIter->azTblC
da30: 6f 6c 5b 69 5d 2c 20 69 2b 31 0a 20 20 20 20 20  ol[i], i+1.     
da40: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
da50: 20 20 7a 53 65 70 20 3d 20 22 2c 20 22 3b 0a 20    zSep = ", ";. 
da60: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
da70: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
da80: 75 72 6e 20 7a 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a  urn zList;.}../*
da90: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 6e 75 6c  .** Return a nul
daa0: 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69  -terminated stri
dab0: 6e 67 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66  ng consisting of
dac0: 20 6e 42 79 74 65 20 63 6f 6d 6d 61 20 73 65 70   nByte comma sep
dad0: 61 72 61 74 65 64 0a 2a 2a 20 22 3f 22 20 65 78  arated.** "?" ex
dae0: 70 72 65 73 73 69 6f 6e 73 2e 20 46 6f 72 20 65  pressions. For e
daf0: 78 61 6d 70 6c 65 2c 20 69 66 20 6e 42 79 74 65  xample, if nByte
db00: 20 69 73 20 33 2c 20 72 65 74 75 72 6e 20 61 20   is 3, return a 
db10: 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 61 20  pointer to.** a 
db20: 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
db30: 67 20 74 68 65 20 73 74 72 69 6e 67 20 22 3f 2c  g the string "?,
db40: 3f 2c 3f 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ?,?"..**.** The 
db50: 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68 65 20 72  memory for the r
db60: 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69  eturned string i
db70: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
db80: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
db90: 2e 0a 2a 2a 20 49 74 20 69 73 20 74 68 65 20 72  ..** It is the r
dba0: 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
dbb0: 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65   the caller to e
dbc0: 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 20 69  ventually free i
dbd0: 74 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74  t using.** sqlit
dbe0: 65 33 5f 66 72 65 65 28 29 2e 20 0a 2a 2a 0a 2a  e3_free(). .**.*
dbf0: 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f  * If an OOM erro
dc00: 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
dc10: 20 77 68 65 6e 20 61 6c 6c 6f 63 61 74 69 6e 67   when allocating
dc20: 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 6e   space for the n
dc30: 65 77 0a 2a 2a 20 73 74 72 69 6e 67 2c 20 61 6e  ew.** string, an
dc40: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 6c   error code is l
dc50: 65 66 74 20 69 6e 20 74 68 65 20 72 62 75 20 68  eft in the rbu h
dc60: 61 6e 64 6c 65 20 70 61 73 73 65 64 20 61 73 20  andle passed as 
dc70: 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 61 72 67  the first.** arg
dc80: 75 6d 65 6e 74 20 61 6e 64 20 4e 55 4c 4c 20 69  ument and NULL i
dc90: 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 72 2c 20  s returned. Or, 
dca0: 69 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20  if an error has 
dcb0: 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64  already occurred
dcc0: 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 66 75  .** when this fu
dcd0: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
dce0: 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  , NULL is return
dcf0: 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2c 20  ed immediately, 
dd00: 77 69 74 68 6f 75 74 0a 2a 2a 20 61 74 74 65 6d  without.** attem
dd10: 70 74 69 6e 67 20 74 68 65 20 61 6c 6c 6f 63 61  pting the alloca
dd20: 74 69 6f 6e 20 6f 72 20 6d 6f 64 69 66 79 69 6e  tion or modifyin
dd30: 67 20 74 68 65 20 73 74 6f 72 65 64 20 65 72 72  g the stored err
dd40: 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  or code..*/.stat
dd50: 69 63 20 63 68 61 72 20 2a 72 62 75 4f 62 6a 49  ic char *rbuObjI
dd60: 74 65 72 47 65 74 42 69 6e 64 6c 69 73 74 28 73  terGetBindlist(s
dd70: 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 69 6e  qlite3rbu *p, in
dd80: 74 20 6e 42 69 6e 64 29 7b 0a 20 20 63 68 61 72  t nBind){.  char
dd90: 20 2a 7a 52 65 74 20 3d 20 30 3b 0a 20 20 69 6e   *zRet = 0;.  in
dda0: 74 20 6e 42 79 74 65 20 3d 20 6e 42 69 6e 64 2a  t nByte = nBind*
ddb0: 32 20 2b 20 31 3b 0a 0a 20 20 7a 52 65 74 20 3d  2 + 1;..  zRet =
ddc0: 20 28 63 68 61 72 2a 29 72 62 75 4d 61 6c 6c 6f   (char*)rbuMallo
ddd0: 63 28 70 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69  c(p, nByte);.  i
dde0: 66 28 20 7a 52 65 74 20 29 7b 0a 20 20 20 20 69  f( zRet ){.    i
ddf0: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
de00: 30 3b 20 69 3c 6e 42 69 6e 64 3b 20 69 2b 2b 29  0; i<nBind; i++)
de10: 7b 0a 20 20 20 20 20 20 7a 52 65 74 5b 69 2a 32  {.      zRet[i*2
de20: 5d 20 3d 20 27 3f 27 3b 0a 20 20 20 20 20 20 7a  ] = '?';.      z
de30: 52 65 74 5b 69 2a 32 2b 31 5d 20 3d 20 28 69 2b  Ret[i*2+1] = (i+
de40: 31 3d 3d 6e 42 69 6e 64 29 20 3f 20 27 5c 30 27  1==nBind) ? '\0'
de50: 20 3a 20 27 2c 27 3b 0a 20 20 20 20 7d 0a 20 20   : ',';.    }.  
de60: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 52 65 74 3b  }.  return zRet;
de70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 74  .}../*.** The it
de80: 65 72 61 74 6f 72 20 63 75 72 72 65 6e 74 6c 79  erator currently
de90: 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 74 61 62   points to a tab
dea0: 6c 65 20 28 6e 6f 74 20 69 6e 64 65 78 29 20 6f  le (not index) o
deb0: 66 20 74 79 70 65 20 0a 2a 2a 20 52 42 55 5f 50  f type .** RBU_P
dec0: 4b 5f 57 49 54 48 4f 55 54 5f 52 4f 57 49 44 2e  K_WITHOUT_ROWID.
ded0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
dee0: 72 65 61 74 65 73 20 74 68 65 20 50 52 49 4d 41  reates the PRIMA
def0: 52 59 20 4b 45 59 20 0a 2a 2a 20 64 65 63 6c 61  RY KEY .** decla
df00: 72 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 63  ration for the c
df10: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 69 6d 70  orresponding imp
df20: 6f 73 74 65 72 20 74 61 62 6c 65 2e 20 46 6f 72  oster table. For
df30: 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20 69 66 20   example,.** if 
df40: 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 6f 69  the iterator poi
df50: 6e 74 73 20 74 6f 20 61 20 74 61 62 6c 65 20 63  nts to a table c
df60: 72 65 61 74 65 64 20 61 73 3a 0a 2a 2a 0a 2a 2a  reated as:.**.**
df70: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
df80: 74 31 28 61 2c 20 62 2c 20 63 2c 20 50 52 49 4d  t1(a, b, c, PRIM
df90: 41 52 59 20 4b 45 59 28 62 2c 20 61 20 44 45 53  ARY KEY(b, a DES
dfa0: 43 29 29 20 57 49 54 48 4f 55 54 20 52 4f 57 49  C)) WITHOUT ROWI
dfb0: 44 0a 2a 2a 0a 2a 2a 20 74 68 69 73 20 66 75 6e  D.**.** this fun
dfc0: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 3a 0a 2a  ction returns:.*
dfd0: 2a 0a 2a 2a 20 20 20 50 52 49 4d 41 52 59 20 4b  *.**   PRIMARY K
dfe0: 45 59 28 22 62 22 2c 20 22 61 22 20 44 45 53 43  EY("b", "a" DESC
dff0: 29 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ).*/.static char
e000: 20 2a 72 62 75 57 69 74 68 6f 75 74 52 6f 77 69   *rbuWithoutRowi
e010: 64 50 4b 28 73 71 6c 69 74 65 33 72 62 75 20 2a  dPK(sqlite3rbu *
e020: 70 2c 20 52 62 75 4f 62 6a 49 74 65 72 20 2a 70  p, RbuObjIter *p
e030: 49 74 65 72 29 7b 0a 20 20 63 68 61 72 20 2a 7a  Iter){.  char *z
e040: 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
e050: 70 49 74 65 72 2d 3e 7a 49 64 78 3d 3d 30 20 29  pIter->zIdx==0 )
e060: 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ;.  if( p->rc==S
e070: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
e080: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 65 70  const char *zSep
e090: 20 3d 20 22 50 52 49 4d 41 52 59 20 4b 45 59 28   = "PRIMARY KEY(
e0a0: 22 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ";.    sqlite3_s
e0b0: 74 6d 74 20 2a 70 58 4c 69 73 74 20 3d 20 30 3b  tmt *pXList = 0;
e0c0: 20 20 20 20 20 2f 2a 20 50 52 41 47 4d 41 20 69       /* PRAGMA i
e0d0: 6e 64 65 78 5f 6c 69 73 74 20 3d 20 28 70 49 74  ndex_list = (pIt
e0e0: 65 72 2d 3e 7a 54 62 6c 29 20 2a 2f 0a 20 20 20  er->zTbl) */.   
e0f0: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
e100: 58 49 6e 66 6f 20 3d 20 30 3b 20 20 20 20 20 2f  XInfo = 0;     /
e110: 2a 20 50 52 41 47 4d 41 20 69 6e 64 65 78 5f 78  * PRAGMA index_x
e120: 69 6e 66 6f 20 3d 20 3c 70 6b 2d 69 6e 64 65 78  info = <pk-index
e130: 3e 20 2a 2f 0a 20 20 20 0a 20 20 20 20 70 2d 3e  > */.   .    p->
e140: 72 63 20 3d 20 70 72 65 70 61 72 65 46 72 65 65  rc = prepareFree
e150: 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28  AndCollectError(
e160: 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 70 58 4c 69  p->dbMain, &pXLi
e170: 73 74 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c  st, &p->zErrmsg,
e180: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
e190: 5f 6d 70 72 69 6e 74 66 28 22 50 52 41 47 4d 41  _mprintf("PRAGMA
e1a0: 20 6d 61 69 6e 2e 69 6e 64 65 78 5f 6c 69 73 74   main.index_list
e1b0: 20 3d 20 25 51 22 2c 20 70 49 74 65 72 2d 3e 7a   = %Q", pIter->z
e1c0: 54 62 6c 29 0a 20 20 20 20 29 3b 0a 20 20 20 20  Tbl).    );.    
e1d0: 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51  while( p->rc==SQ
e1e0: 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54  LITE_OK && SQLIT
e1f0: 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73  E_ROW==sqlite3_s
e200: 74 65 70 28 70 58 4c 69 73 74 29 20 29 7b 0a 20  tep(pXList) ){. 
e210: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
e220: 2a 7a 4f 72 69 67 20 3d 20 28 63 6f 6e 73 74 20  *zOrig = (const 
e230: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
e240: 6c 75 6d 6e 5f 74 65 78 74 28 70 58 4c 69 73 74  lumn_text(pXList
e250: 2c 33 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  ,3);.      if( z
e260: 4f 72 69 67 20 26 26 20 73 74 72 63 6d 70 28 7a  Orig && strcmp(z
e270: 4f 72 69 67 2c 20 22 70 6b 22 29 3d 3d 30 20 29  Orig, "pk")==0 )
e280: 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
e290: 63 68 61 72 20 2a 7a 49 64 78 20 3d 20 28 63 6f  char *zIdx = (co
e2a0: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
e2b0: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 58  3_column_text(pX
e2c0: 4c 69 73 74 2c 31 29 3b 0a 20 20 20 20 20 20 20  List,1);.       
e2d0: 20 69 66 28 20 7a 49 64 78 20 29 7b 0a 20 20 20   if( zIdx ){.   
e2e0: 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 70         p->rc = p
e2f0: 72 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f 6c  repareFreeAndCol
e300: 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 4d  lectError(p->dbM
e310: 61 69 6e 2c 20 26 70 58 49 6e 66 6f 2c 20 26 70  ain, &pXInfo, &p
e320: 2d 3e 7a 45 72 72 6d 73 67 2c 0a 20 20 20 20 20  ->zErrmsg,.     
e330: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
e340: 5f 6d 70 72 69 6e 74 66 28 22 50 52 41 47 4d 41  _mprintf("PRAGMA
e350: 20 6d 61 69 6e 2e 69 6e 64 65 78 5f 78 69 6e 66   main.index_xinf
e360: 6f 20 3d 20 25 51 22 2c 20 7a 49 64 78 29 0a 20  o = %Q", zIdx). 
e370: 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
e380: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72      }.        br
e390: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
e3a0: 20 7d 0a 20 20 20 20 72 62 75 46 69 6e 61 6c 69   }.    rbuFinali
e3b0: 7a 65 28 70 2c 20 70 58 4c 69 73 74 29 3b 0a 0a  ze(p, pXList);..
e3c0: 20 20 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63      while( p->rc
e3d0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53  ==SQLITE_OK && S
e3e0: 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74  QLITE_ROW==sqlit
e3f0: 65 33 5f 73 74 65 70 28 70 58 49 6e 66 6f 29 20  e3_step(pXInfo) 
e400: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
e410: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
e420: 70 58 49 6e 66 6f 2c 20 35 29 20 29 7b 0a 20 20  pXInfo, 5) ){.  
e430: 20 20 20 20 20 20 2f 2a 20 69 6e 74 20 69 43 69        /* int iCi
e440: 64 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  d = sqlite3_colu
e450: 6d 6e 5f 69 6e 74 28 70 58 49 6e 66 6f 2c 20 30  mn_int(pXInfo, 0
e460: 29 3b 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f  ); */.        co
e470: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 20 3d  nst char *zCol =
e480: 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
e490: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
e4a0: 74 28 70 58 49 6e 66 6f 2c 20 32 29 3b 0a 20 20  t(pXInfo, 2);.  
e4b0: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
e4c0: 20 2a 7a 44 65 73 63 20 3d 20 73 71 6c 69 74 65   *zDesc = sqlite
e4d0: 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 58 49  3_column_int(pXI
e4e0: 6e 66 6f 2c 20 33 29 20 3f 20 22 20 44 45 53 43  nfo, 3) ? " DESC
e4f0: 22 20 3a 20 22 22 3b 0a 20 20 20 20 20 20 20 20  " : "";.        
e500: 7a 20 3d 20 72 62 75 4d 50 72 69 6e 74 66 28 70  z = rbuMPrintf(p
e510: 2c 20 22 25 7a 25 73 5c 22 25 77 5c 22 25 73 22  , "%z%s\"%w\"%s"
e520: 2c 20 7a 2c 20 7a 53 65 70 2c 20 7a 43 6f 6c 2c  , z, zSep, zCol,
e530: 20 7a 44 65 73 63 29 3b 0a 20 20 20 20 20 20 20   zDesc);.       
e540: 20 7a 53 65 70 20 3d 20 22 2c 20 22 3b 0a 20 20   zSep = ", ";.  
e550: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
e560: 7a 20 3d 20 72 62 75 4d 50 72 69 6e 74 66 28 70  z = rbuMPrintf(p
e570: 2c 20 22 25 7a 29 22 2c 20 7a 29 3b 0a 20 20 20  , "%z)", z);.   
e580: 20 72 62 75 46 69 6e 61 6c 69 7a 65 28 70 2c 20   rbuFinalize(p, 
e590: 70 58 49 6e 66 6f 29 3b 0a 20 20 7d 0a 20 20 72  pXInfo);.  }.  r
e5a0: 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn z;.}../*.*
e5b0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
e5c0: 63 72 65 61 74 65 73 20 74 68 65 20 73 65 63 6f  creates the seco
e5d0: 6e 64 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c  nd imposter tabl
e5e0: 65 20 75 73 65 64 20 77 68 65 6e 20 77 72 69 74  e used when writ
e5f0: 69 6e 67 20 74 6f 0a 2a 2a 20 61 20 74 61 62 6c  ing to.** a tabl
e600: 65 20 62 2d 74 72 65 65 20 77 68 65 72 65 20 74  e b-tree where t
e610: 68 65 20 74 61 62 6c 65 20 68 61 73 20 61 6e 20  he table has an 
e620: 65 78 74 65 72 6e 61 6c 20 70 72 69 6d 61 72 79  external primary
e630: 20 6b 65 79 2e 20 49 66 20 74 68 65 0a 2a 2a 20   key. If the.** 
e640: 69 74 65 72 61 74 6f 72 20 70 61 73 73 65 64 20  iterator passed 
e650: 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
e660: 67 75 6d 65 6e 74 20 64 6f 65 73 20 6e 6f 74 20  gument does not 
e670: 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 20  currently point 
e680: 74 6f 0a 2a 2a 20 61 20 74 61 62 6c 65 20 28 6e  to.** a table (n
e690: 6f 74 20 69 6e 64 65 78 29 20 77 69 74 68 20 61  ot index) with a
e6a0: 6e 20 65 78 74 65 72 6e 61 6c 20 70 72 69 6d 61  n external prima
e6b0: 72 79 20 6b 65 79 2c 20 74 68 69 73 20 66 75 6e  ry key, this fun
e6c0: 63 74 69 6f 6e 20 69 73 20 61 0a 2a 2a 20 6e 6f  ction is a.** no
e6d0: 2d 6f 70 2e 20 0a 2a 2a 0a 2a 2a 20 41 73 73 75  -op. .**.** Assu
e6e0: 6d 69 6e 67 20 74 68 65 20 69 74 65 72 61 74 6f  ming the iterato
e6f0: 72 20 64 6f 65 73 20 70 6f 69 6e 74 20 74 6f 20  r does point to 
e700: 61 20 74 61 62 6c 65 20 77 69 74 68 20 61 6e 20  a table with an 
e710: 65 78 74 65 72 6e 61 6c 20 50 4b 2c 20 74 68 69  external PK, thi
e720: 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 63 72  s.** function cr
e730: 65 61 74 65 73 20 61 20 57 49 54 48 4f 55 54 20  eates a WITHOUT 
e740: 52 4f 57 49 44 20 69 6d 70 6f 73 74 65 72 20 74  ROWID imposter t
e750: 61 62 6c 65 20 6e 61 6d 65 64 20 22 72 62 75 5f  able named "rbu_
e760: 69 6d 70 6f 73 74 65 72 32 22 0a 2a 2a 20 75 73  imposter2".** us
e770: 65 64 20 74 6f 20 61 63 63 65 73 73 20 74 68 61  ed to access tha
e780: 74 20 50 4b 20 69 6e 64 65 78 2e 20 46 6f 72 20  t PK index. For 
e790: 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20  example, if the 
e7a0: 74 61 72 67 65 74 20 74 61 62 6c 65 20 69 73 0a  target table is.
e7b0: 2a 2a 20 64 65 63 6c 61 72 65 64 20 61 73 20 66  ** declared as f
e7c0: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
e7d0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
e7e0: 61 2c 20 62 20 54 45 58 54 2c 20 63 20 52 45 41  a, b TEXT, c REA
e7f0: 4c 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28 62  L, PRIMARY KEY(b
e800: 2c 20 63 29 29 3b 0a 2a 2a 0a 2a 2a 20 74 68 65  , c));.**.** the
e810: 6e 20 74 68 65 20 69 6d 70 6f 73 74 65 72 20 74  n the imposter t
e820: 61 62 6c 65 20 73 63 68 65 6d 61 20 69 73 3a 0a  able schema is:.
e830: 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 54  **.**   CREATE T
e840: 41 42 4c 45 20 72 62 75 5f 69 6d 70 6f 73 74 65  ABLE rbu_imposte
e850: 72 32 28 63 31 20 54 45 58 54 2c 20 63 32 20 52  r2(c1 TEXT, c2 R
e860: 45 41 4c 2c 20 69 64 20 49 4e 54 45 47 45 52 29  EAL, id INTEGER)
e870: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 3b 0a   WITHOUT ROWID;.
e880: 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  **.*/.static voi
e890: 64 20 72 62 75 43 72 65 61 74 65 49 6d 70 6f 73  d rbuCreateImpos
e8a0: 74 65 72 54 61 62 6c 65 32 28 73 71 6c 69 74 65  terTable2(sqlite
e8b0: 33 72 62 75 20 2a 70 2c 20 52 62 75 4f 62 6a 49  3rbu *p, RbuObjI
e8c0: 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69  ter *pIter){.  i
e8d0: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
e8e0: 5f 4f 4b 20 26 26 20 70 49 74 65 72 2d 3e 65 54  _OK && pIter->eT
e8f0: 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 45 58 54 45  ype==RBU_PK_EXTE
e900: 52 4e 41 4c 20 29 7b 0a 20 20 20 20 69 6e 74 20  RNAL ){.    int 
e910: 74 6e 75 6d 20 3d 20 70 49 74 65 72 2d 3e 69 50  tnum = pIter->iP
e920: 6b 54 6e 75 6d 3b 20 20 20 20 2f 2a 20 52 6f 6f  kTnum;    /* Roo
e930: 74 20 70 61 67 65 20 6f 66 20 50 4b 20 69 6e 64  t page of PK ind
e940: 65 78 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  ex */.    sqlite
e950: 33 5f 73 74 6d 74 20 2a 70 51 75 65 72 79 20 3d  3_stmt *pQuery =
e960: 20 30 3b 20 20 20 20 20 2f 2a 20 53 45 4c 45 43   0;     /* SELEC
e970: 54 20 6e 61 6d 65 20 2e 2e 2e 20 57 48 45 52 45  T name ... WHERE
e980: 20 72 6f 6f 74 70 61 67 65 20 3d 20 24 74 6e 75   rootpage = $tnu
e990: 6d 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63  m */.    const c
e9a0: 68 61 72 20 2a 7a 49 64 78 20 3d 20 30 3b 20 20  har *zIdx = 0;  
e9b0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
e9c0: 66 20 50 4b 20 69 6e 64 65 78 20 2a 2f 0a 20 20  f PK index */.  
e9d0: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
e9e0: 70 58 49 6e 66 6f 20 3d 20 30 3b 20 20 20 20 20  pXInfo = 0;     
e9f0: 2f 2a 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e 69  /* PRAGMA main.i
ea00: 6e 64 65 78 5f 78 69 6e 66 6f 20 3d 20 24 7a 49  ndex_xinfo = $zI
ea10: 64 78 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20  dx */.    const 
ea20: 63 68 61 72 20 2a 7a 43 6f 6d 6d 61 20 3d 20 22  char *zComma = "
ea30: 22 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f  ";.    char *zCo
ea40: 6c 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ls = 0;         
ea50: 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
ea60: 62 75 69 6c 64 20 75 70 20 6c 69 73 74 20 6f 66  build up list of
ea70: 20 74 61 62 6c 65 20 63 6f 6c 73 20 2a 2f 0a 20   table cols */. 
ea80: 20 20 20 63 68 61 72 20 2a 7a 50 6b 20 3d 20 30     char *zPk = 0
ea90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
eaa0: 20 2f 2a 20 55 73 65 64 20 74 6f 20 62 75 69 6c   /* Used to buil
eab0: 64 20 75 70 20 74 61 62 6c 65 20 50 4b 20 64 65  d up table PK de
eac0: 63 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20  claration */..  
ead0: 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
eae0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
eaf0: 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e 64 65  primary key inde
eb00: 78 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  x for the curren
eb10: 74 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20  t table..    ** 
eb20: 54 68 69 73 20 69 73 20 6e 65 65 64 65 64 20 66  This is needed f
eb30: 6f 72 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  or the argument 
eb40: 74 6f 20 22 50 52 41 47 4d 41 20 69 6e 64 65 78  to "PRAGMA index
eb50: 5f 78 69 6e 66 6f 22 2e 20 53 65 74 0a 20 20 20  _xinfo". Set.   
eb60: 20 2a 2a 20 7a 49 64 78 20 74 6f 20 70 6f 69 6e   ** zIdx to poin
eb70: 74 20 74 6f 20 61 20 6e 75 6c 2d 74 65 72 6d 69  t to a nul-termi
eb80: 6e 61 74 65 64 20 73 74 72 69 6e 67 20 63 6f 6e  nated string con
eb90: 74 61 69 6e 69 6e 67 20 74 68 69 73 20 6e 61 6d  taining this nam
eba0: 65 2e 20 2a 2f 0a 20 20 20 20 70 2d 3e 72 63 20  e. */.    p->rc 
ebb0: 3d 20 70 72 65 70 61 72 65 41 6e 64 43 6f 6c 6c  = prepareAndColl
ebc0: 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 4d 61  ectError(p->dbMa
ebd0: 69 6e 2c 20 26 70 51 75 65 72 79 2c 20 26 70 2d  in, &pQuery, &p-
ebe0: 3e 7a 45 72 72 6d 73 67 2c 20 0a 20 20 20 20 20  >zErrmsg, .     
ebf0: 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 20     "SELECT name 
ec00: 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
ec10: 65 72 20 57 48 45 52 45 20 72 6f 6f 74 70 61 67  er WHERE rootpag
ec20: 65 20 3d 20 3f 22 0a 20 20 20 20 29 3b 0a 20 20  e = ?".    );.  
ec30: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
ec40: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
ec50: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
ec60: 28 70 51 75 65 72 79 2c 20 31 2c 20 74 6e 75 6d  (pQuery, 1, tnum
ec70: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c  );.      if( SQL
ec80: 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
ec90: 5f 73 74 65 70 28 70 51 75 65 72 79 29 20 29 7b  _step(pQuery) ){
eca0: 0a 20 20 20 20 20 20 20 20 7a 49 64 78 20 3d 20  .        zIdx = 
ecb0: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
ecc0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
ecd0: 28 70 51 75 65 72 79 2c 20 30 29 3b 0a 20 20 20  (pQuery, 0);.   
ece0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
ecf0: 66 28 20 7a 49 64 78 20 29 7b 0a 20 20 20 20 20  f( zIdx ){.     
ed00: 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65   p->rc = prepare
ed10: 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72  FreeAndCollectEr
ed20: 72 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 26  ror(p->dbMain, &
ed30: 70 58 49 6e 66 6f 2c 20 26 70 2d 3e 7a 45 72 72  pXInfo, &p->zErr
ed40: 6d 73 67 2c 0a 20 20 20 20 20 20 20 20 20 20 73  msg,.          s
ed50: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
ed60: 50 52 41 47 4d 41 20 6d 61 69 6e 2e 69 6e 64 65  PRAGMA main.inde
ed70: 78 5f 78 69 6e 66 6f 20 3d 20 25 51 22 2c 20 7a  x_xinfo = %Q", z
ed80: 49 64 78 29 0a 20 20 20 20 20 20 29 3b 0a 20 20  Idx).      );.  
ed90: 20 20 7d 0a 20 20 20 20 72 62 75 46 69 6e 61 6c    }.    rbuFinal
eda0: 69 7a 65 28 70 2c 20 70 51 75 65 72 79 29 3b 0a  ize(p, pQuery);.
edb0: 0a 20 20 20 20 77 68 69 6c 65 28 20 70 2d 3e 72  .    while( p->r
edc0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
edd0: 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69  SQLITE_ROW==sqli
ede0: 74 65 33 5f 73 74 65 70 28 70 58 49 6e 66 6f 29  te3_step(pXInfo)
edf0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 4b   ){.      int bK
ee00: 65 79 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ey = sqlite3_col
ee10: 75 6d 6e 5f 69 6e 74 28 70 58 49 6e 66 6f 2c 20  umn_int(pXInfo, 
ee20: 35 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62 4b  5);.      if( bK
ee30: 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  ey ){.        in
ee40: 74 20 69 43 69 64 20 3d 20 73 71 6c 69 74 65 33  t iCid = sqlite3
ee50: 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 58 49 6e  _column_int(pXIn
ee60: 66 6f 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  fo, 1);.        
ee70: 69 6e 74 20 62 44 65 73 63 20 3d 20 73 71 6c 69  int bDesc = sqli
ee80: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
ee90: 58 49 6e 66 6f 2c 20 33 29 3b 0a 20 20 20 20 20  XInfo, 3);.     
eea0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
eeb0: 43 6f 6c 6c 61 74 65 20 3d 20 28 63 6f 6e 73 74  Collate = (const
eec0: 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63   char*)sqlite3_c
eed0: 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 58 49 6e 66  olumn_text(pXInf
eee0: 6f 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 7a  o, 4);.        z
eef0: 43 6f 6c 73 20 3d 20 72 62 75 4d 50 72 69 6e 74  Cols = rbuMPrint
ef00: 66 28 70 2c 20 22 25 7a 25 73 63 25 64 20 25 73  f(p, "%z%sc%d %s
ef10: 20 43 4f 4c 4c 41 54 45 20 25 51 22 2c 20 7a 43   COLLATE %Q", zC
ef20: 6f 6c 73 2c 20 7a 43 6f 6d 6d 61 2c 20 0a 20 20  ols, zComma, .  
ef30: 20 20 20 20 20 20 20 20 20 20 69 43 69 64 2c 20            iCid, 
ef40: 70 49 74 65 72 2d 3e 61 7a 54 62 6c 54 79 70 65  pIter->azTblType
ef50: 5b 69 43 69 64 5d 2c 20 7a 43 6f 6c 6c 61 74 65  [iCid], zCollate
ef60: 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
ef70: 20 20 20 20 7a 50 6b 20 3d 20 72 62 75 4d 50 72      zPk = rbuMPr
ef80: 69 6e 74 66 28 70 2c 20 22 25 7a 25 73 63 25 64  intf(p, "%z%sc%d
ef90: 25 73 22 2c 20 7a 50 6b 2c 20 7a 43 6f 6d 6d 61  %s", zPk, zComma
efa0: 2c 20 69 43 69 64 2c 20 62 44 65 73 63 3f 22 20  , iCid, bDesc?" 
efb0: 44 45 53 43 22 3a 22 22 29 3b 0a 20 20 20 20 20  DESC":"");.     
efc0: 20 20 20 7a 43 6f 6d 6d 61 20 3d 20 22 2c 20 22     zComma = ", "
efd0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
efe0: 20 20 20 20 7a 43 6f 6c 73 20 3d 20 72 62 75 4d      zCols = rbuM
eff0: 50 72 69 6e 74 66 28 70 2c 20 22 25 7a 2c 20 69  Printf(p, "%z, i
f000: 64 20 49 4e 54 45 47 45 52 22 2c 20 7a 43 6f 6c  d INTEGER", zCol
f010: 73 29 3b 0a 20 20 20 20 72 62 75 46 69 6e 61 6c  s);.    rbuFinal
f020: 69 7a 65 28 70 2c 20 70 58 49 6e 66 6f 29 3b 0a  ize(p, pXInfo);.
f030: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73  .    sqlite3_tes
f040: 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
f050: 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54  _TESTCTRL_IMPOST
f060: 45 52 2c 20 70 2d 3e 64 62 4d 61 69 6e 2c 20 22  ER, p->dbMain, "
f070: 6d 61 69 6e 22 2c 20 31 2c 20 74 6e 75 6d 29 3b  main", 1, tnum);
f080: 0a 20 20 20 20 72 62 75 4d 50 72 69 6e 74 66 45  .    rbuMPrintfE
f090: 78 65 63 28 70 2c 20 70 2d 3e 64 62 4d 61 69 6e  xec(p, p->dbMain
f0a0: 2c 0a 20 20 20 20 20 20 20 20 22 43 52 45 41 54  ,.        "CREAT
f0b0: 45 20 54 41 42 4c 45 20 72 62 75 5f 69 6d 70 6f  E TABLE rbu_impo
f0c0: 73 74 65 72 32 28 25 7a 2c 20 50 52 49 4d 41 52  ster2(%z, PRIMAR
f0d0: 59 20 4b 45 59 28 25 7a 29 29 20 57 49 54 48 4f  Y KEY(%z)) WITHO
f0e0: 55 54 20 52 4f 57 49 44 22 2c 20 0a 20 20 20 20  UT ROWID", .    
f0f0: 20 20 20 20 7a 43 6f 6c 73 2c 20 7a 50 6b 0a 20      zCols, zPk. 
f100: 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65     );.    sqlite
f110: 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
f120: 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49  QLITE_TESTCTRL_I
f130: 4d 50 4f 53 54 45 52 2c 20 70 2d 3e 64 62 4d 61  MPOSTER, p->dbMa
f140: 69 6e 2c 20 22 6d 61 69 6e 22 2c 20 30 2c 20 30  in, "main", 0, 0
f150: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
f160: 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20  If an error has 
f170: 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64  already occurred
f180: 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
f190: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69  ion is called, i
f1a0: 74 20 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c  t .** immediatel
f1b0: 79 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 20 28  y returns zero (
f1c0: 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e  without doing an
f1d0: 79 20 77 6f 72 6b 29 2e 20 4f 72 2c 20 69 66 20  y work). Or, if 
f1e0: 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75  an error.** occu
f1f0: 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 65 78  rs during the ex
f200: 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 69 73 20  ecution of this 
f210: 66 75 6e 63 74 69 6f 6e 2c 20 69 74 20 73 65 74  function, it set
f220: 73 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  s the error code
f230: 0a 2a 2a 20 69 6e 20 74 68 65 20 73 71 6c 69 74  .** in the sqlit
f240: 65 33 72 62 75 20 6f 62 6a 65 63 74 20 69 6e 64  e3rbu object ind
f250: 69 63 61 74 65 64 20 62 79 20 74 68 65 20 66 69  icated by the fi
f260: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 61 6e 64  rst argument and
f270: 20 72 65 74 75 72 6e 73 0a 2a 2a 20 7a 65 72 6f   returns.** zero
f280: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 74 65 72  ..**.** The iter
f290: 61 74 6f 72 20 70 61 73 73 65 64 20 61 73 20 74  ator passed as t
f2a0: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
f2b0: 6e 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  nt is guaranteed
f2c0: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20   to point to.** 
f2d0: 61 20 74 61 62 6c 65 20 28 6e 6f 74 20 61 6e 20  a table (not an 
f2e0: 69 6e 64 65 78 29 20 77 68 65 6e 20 74 68 69 73  index) when this
f2f0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
f300: 6c 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69  led. This functi
f310: 6f 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74  on.** attempts t
f320: 6f 20 63 72 65 61 74 65 20 61 6e 79 20 69 6d 70  o create any imp
f330: 6f 73 74 65 72 20 74 61 62 6c 65 20 72 65 71 75  oster table requ
f340: 69 72 65 64 20 74 6f 20 77 72 69 74 65 20 74 6f  ired to write to
f350: 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 74 61 62   the main.** tab
f360: 6c 65 20 62 2d 74 72 65 65 20 6f 66 20 74 68 65  le b-tree of the
f370: 20 74 61 62 6c 65 20 62 65 66 6f 72 65 20 72 65   table before re
f380: 74 75 72 6e 69 6e 67 2e 20 4e 6f 6e 2d 7a 65 72  turning. Non-zer
f390: 6f 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  o is returned if
f3a0: 0a 2a 2a 20 61 6e 20 69 6d 70 6f 73 74 65 72 20  .** an imposter 
f3b0: 74 61 62 6c 65 20 61 72 65 20 63 72 65 61 74 65  table are create
f3c0: 64 2c 20 6f 72 20 7a 65 72 6f 20 6f 74 68 65 72  d, or zero other
f3d0: 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69  wise..**.** An i
f3e0: 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 20 69 73  mposter table is
f3f0: 20 72 65 71 75 69 72 65 64 20 69 6e 20 61 6c 6c   required in all
f400: 20 63 61 73 65 73 20 65 78 63 65 70 74 20 52 42   cases except RB
f410: 55 5f 50 4b 5f 56 54 41 42 2e 20 4f 6e 6c 79 0a  U_PK_VTAB. Only.
f420: 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ** virtual table
f430: 73 20 61 72 65 20 77 72 69 74 74 65 6e 20 74 6f  s are written to
f440: 20 64 69 72 65 63 74 6c 79 2e 20 54 68 65 20 69   directly. The i
f450: 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 20 68 61  mposter table ha
f460: 73 20 74 68 65 20 0a 2a 2a 20 73 61 6d 65 20 73  s the .** same s
f470: 63 68 65 6d 61 20 61 73 20 74 68 65 20 61 63 74  chema as the act
f480: 75 61 6c 20 74 61 72 67 65 74 20 74 61 62 6c 65  ual target table
f490: 20 28 6c 65 73 73 20 61 6e 79 20 55 4e 49 51 55   (less any UNIQU
f4a0: 45 20 63 6f 6e 73 74 72 61 69 6e 74 73 29 2e 20  E constraints). 
f4b0: 0a 2a 2a 20 4d 6f 72 65 20 70 72 65 63 69 73 65  .** More precise
f4c0: 6c 79 2c 20 74 68 65 20 22 73 61 6d 65 20 73 63  ly, the "same sc
f4d0: 68 65 6d 61 22 20 6d 65 61 6e 73 20 74 68 65 20  hema" means the 
f4e0: 73 61 6d 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 79  same columns, ty
f4f0: 70 65 73 2c 20 0a 2a 2a 20 63 6f 6c 6c 61 74 69  pes, .** collati
f500: 6f 6e 20 73 65 71 75 65 6e 63 65 73 2e 20 46 6f  on sequences. Fo
f510: 72 20 74 61 62 6c 65 73 20 74 68 61 74 20 64 6f  r tables that do
f520: 20 6e 6f 74 20 68 61 76 65 20 61 6e 20 65 78 74   not have an ext
f530: 65 72 6e 61 6c 20 50 52 49 4d 41 52 59 0a 2a 2a  ernal PRIMARY.**
f540: 20 4b 45 59 2c 20 69 74 20 61 6c 73 6f 20 6d 65   KEY, it also me
f550: 61 6e 73 20 74 68 65 20 73 61 6d 65 20 50 52 49  ans the same PRI
f560: 4d 41 52 59 20 4b 45 59 20 64 65 63 6c 61 72 61  MARY KEY declara
f570: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
f580: 76 6f 69 64 20 72 62 75 43 72 65 61 74 65 49 6d  void rbuCreateIm
f590: 70 6f 73 74 65 72 54 61 62 6c 65 28 73 71 6c 69  posterTable(sqli
f5a0: 74 65 33 72 62 75 20 2a 70 2c 20 52 62 75 4f 62  te3rbu *p, RbuOb
f5b0: 6a 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  jIter *pIter){. 
f5c0: 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
f5d0: 54 45 5f 4f 4b 20 26 26 20 70 49 74 65 72 2d 3e  TE_OK && pIter->
f5e0: 65 54 79 70 65 21 3d 52 42 55 5f 50 4b 5f 56 54  eType!=RBU_PK_VT
f5f0: 41 42 20 29 7b 0a 20 20 20 20 69 6e 74 20 74 6e  AB ){.    int tn
f600: 75 6d 20 3d 20 70 49 74 65 72 2d 3e 69 54 6e 75  um = pIter->iTnu
f610: 6d 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  m;.    const cha
f620: 72 20 2a 7a 43 6f 6d 6d 61 20 3d 20 22 22 3b 0a  r *zComma = "";.
f630: 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d      char *zSql =
f640: 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c   0;.    int iCol
f650: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 74 65  ;.    sqlite3_te
f660: 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
f670: 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53  E_TESTCTRL_IMPOS
f680: 54 45 52 2c 20 70 2d 3e 64 62 4d 61 69 6e 2c 20  TER, p->dbMain, 
f690: 22 6d 61 69 6e 22 2c 20 30 2c 20 31 29 3b 0a 0a  "main", 0, 1);..
f6a0: 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20      for(iCol=0; 
f6b0: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
f6c0: 20 26 26 20 69 43 6f 6c 3c 70 49 74 65 72 2d 3e   && iCol<pIter->
f6d0: 6e 54 62 6c 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29  nTblCol; iCol++)
f6e0: 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
f6f0: 61 72 20 2a 7a 50 6b 20 3d 20 22 22 3b 0a 20 20  ar *zPk = "";.  
f700: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
f710: 7a 43 6f 6c 20 3d 20 70 49 74 65 72 2d 3e 61 7a  zCol = pIter->az
f720: 54 62 6c 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20  TblCol[iCol];.  
f730: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
f740: 7a 43 6f 6c 6c 20 3d 20 30 3b 0a 0a 20 20 20 20  zColl = 0;..    
f750: 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65    p->rc = sqlite
f760: 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d  3_table_column_m
f770: 65 74 61 64 61 74 61 28 0a 20 20 20 20 20 20 20  etadata(.       
f780: 20 20 20 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 6d     p->dbMain, "m
f790: 61 69 6e 22 2c 20 70 49 74 65 72 2d 3e 7a 54 62  ain", pIter->zTb
f7a0: 6c 2c 20 7a 43 6f 6c 2c 20 30 2c 20 26 7a 43 6f  l, zCol, 0, &zCo
f7b0: 6c 6c 2c 20 30 2c 20 30 2c 20 30 0a 20 20 20 20  ll, 0, 0, 0.    
f7c0: 20 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20    );..      if( 
f7d0: 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42  pIter->eType==RB
f7e0: 55 5f 50 4b 5f 49 50 4b 20 26 26 20 70 49 74 65  U_PK_IPK && pIte
f7f0: 72 2d 3e 61 62 54 62 6c 50 6b 5b 69 43 6f 6c 5d  r->abTblPk[iCol]
f800: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
f810: 66 20 74 68 65 20 74 61 72 67 65 74 20 74 61 62  f the target tab
f820: 6c 65 20 63 6f 6c 75 6d 6e 20 69 73 20 61 6e 20  le column is an 
f830: 22 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59  "INTEGER PRIMARY
f840: 20 4b 45 59 22 2c 20 61 64 64 0a 20 20 20 20 20   KEY", add.     
f850: 20 20 20 2a 2a 20 22 50 52 49 4d 41 52 59 20 4b     ** "PRIMARY K
f860: 45 59 22 20 74 6f 20 74 68 65 20 69 6d 70 6f 73  EY" to the impos
f870: 74 65 72 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  ter table column
f880: 20 64 65 63 6c 61 72 61 74 69 6f 6e 2e 20 2a 2f   declaration. */
f890: 0a 20 20 20 20 20 20 20 20 7a 50 6b 20 3d 20 22  .        zPk = "
f8a0: 50 52 49 4d 41 52 59 20 4b 45 59 20 22 3b 0a 20  PRIMARY KEY ";. 
f8b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 53 71       }.      zSq
f8c0: 6c 20 3d 20 72 62 75 4d 50 72 69 6e 74 66 28 70  l = rbuMPrintf(p
f8d0: 2c 20 22 25 7a 25 73 5c 22 25 77 5c 22 20 25 73  , "%z%s\"%w\" %s
f8e0: 20 25 73 43 4f 4c 4c 41 54 45 20 25 51 25 73 22   %sCOLLATE %Q%s"
f8f0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 7a 53 71  , .          zSq
f900: 6c 2c 20 7a 43 6f 6d 6d 61 2c 20 7a 43 6f 6c 2c  l, zComma, zCol,
f910: 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 54 79 70   pIter->azTblTyp
f920: 65 5b 69 43 6f 6c 5d 2c 20 7a 50 6b 2c 20 7a 43  e[iCol], zPk, zC
f930: 6f 6c 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 28  oll,.          (
f940: 70 49 74 65 72 2d 3e 61 62 4e 6f 74 4e 75 6c 6c  pIter->abNotNull
f950: 5b 69 43 6f 6c 5d 20 3f 20 22 20 4e 4f 54 20 4e  [iCol] ? " NOT N
f960: 55 4c 4c 22 20 3a 20 22 22 29 0a 20 20 20 20 20  ULL" : "").     
f970: 20 29 3b 0a 20 20 20 20 20 20 7a 43 6f 6d 6d 61   );.      zComma
f980: 20 3d 20 22 2c 20 22 3b 0a 20 20 20 20 7d 0a 0a   = ", ";.    }..
f990: 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 65      if( pIter->e
f9a0: 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 57 49 54  Type==RBU_PK_WIT
f9b0: 48 4f 55 54 5f 52 4f 57 49 44 20 29 7b 0a 20 20  HOUT_ROWID ){.  
f9c0: 20 20 20 20 63 68 61 72 20 2a 7a 50 6b 20 3d 20      char *zPk = 
f9d0: 72 62 75 57 69 74 68 6f 75 74 52 6f 77 69 64 50  rbuWithoutRowidP
f9e0: 4b 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20  K(p, pIter);.   
f9f0: 20 20 20 69 66 28 20 7a 50 6b 20 29 7b 0a 20 20     if( zPk ){.  
fa00: 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 72 62 75        zSql = rbu
fa10: 4d 50 72 69 6e 74 66 28 70 2c 20 22 25 7a 2c 20  MPrintf(p, "%z, 
fa20: 25 7a 22 2c 20 7a 53 71 6c 2c 20 7a 50 6b 29 3b  %z", zSql, zPk);
fa30: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
fa40: 20 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74      sqlite3_test
fa50: 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
fa60: 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45  TESTCTRL_IMPOSTE
fa70: 52 2c 20 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 6d  R, p->dbMain, "m
fa80: 61 69 6e 22 2c 20 31 2c 20 74 6e 75 6d 29 3b 0a  ain", 1, tnum);.
fa90: 20 20 20 20 72 62 75 4d 50 72 69 6e 74 66 45 78      rbuMPrintfEx
faa0: 65 63 28 70 2c 20 70 2d 3e 64 62 4d 61 69 6e 2c  ec(p, p->dbMain,
fab0: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 5c   "CREATE TABLE \
fac0: 22 72 62 75 5f 69 6d 70 5f 25 77 5c 22 28 25 7a  "rbu_imp_%w\"(%z
fad0: 29 25 73 22 2c 20 0a 20 20 20 20 20 20 20 20 70  )%s", .        p
fae0: 49 74 65 72 2d 3e 7a 54 62 6c 2c 20 7a 53 71 6c  Iter->zTbl, zSql
faf0: 2c 20 0a 20 20 20 20 20 20 20 20 28 70 49 74 65  , .        (pIte
fb00: 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b  r->eType==RBU_PK
fb10: 5f 57 49 54 48 4f 55 54 5f 52 4f 57 49 44 20 3f  _WITHOUT_ROWID ?
fb20: 20 22 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44   " WITHOUT ROWID
fb30: 22 20 3a 20 22 22 29 0a 20 20 20 20 29 3b 0a 20  " : "").    );. 
fb40: 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f     sqlite3_test_
fb50: 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
fb60: 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52  ESTCTRL_IMPOSTER
fb70: 2c 20 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 6d 61  , p->dbMain, "ma
fb80: 69 6e 22 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  in", 0, 0);.  }.
fb90: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65  }../*.** Prepare
fba0: 20 61 20 73 74 61 74 65 6d 65 6e 74 20 75 73 65   a statement use
fbb0: 64 20 74 6f 20 69 6e 73 65 72 74 20 72 6f 77 73  d to insert rows
fbc0: 20 69 6e 74 6f 20 74 68 65 20 22 72 62 75 5f 74   into the "rbu_t
fbd0: 6d 70 5f 78 78 78 22 20 74 61 62 6c 65 2e 0a 2a  mp_xxx" table..*
fbe0: 2a 20 53 70 65 63 69 66 69 63 61 6c 6c 79 20 61  * Specifically a
fbf0: 20 73 74 61 74 65 6d 65 6e 74 20 6f 66 20 74 68   statement of th
fc00: 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20  e form:.**.**   
fc10: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 72 62    INSERT INTO rb
fc20: 75 5f 74 6d 70 5f 78 78 78 20 56 41 4c 55 45 53  u_tmp_xxx VALUES
fc30: 28 3f 2c 20 3f 2c 20 3f 20 2e 2e 2e 29 3b 0a 2a  (?, ?, ? ...);.*
fc40: 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20  *.** The number 
fc50: 6f 66 20 62 6f 75 6e 64 20 76 61 72 69 61 62 6c  of bound variabl
fc60: 65 73 20 69 73 20 65 71 75 61 6c 20 74 6f 20 74  es is equal to t
fc70: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
fc80: 75 6d 6e 73 20 69 6e 0a 2a 2a 20 74 68 65 20 74  umns in.** the t
fc90: 61 72 67 65 74 20 74 61 62 6c 65 2c 20 70 6c 75  arget table, plu
fca0: 73 20 6f 6e 65 20 28 66 6f 72 20 74 68 65 20 72  s one (for the r
fcb0: 62 75 5f 63 6f 6e 74 72 6f 6c 20 63 6f 6c 75 6d  bu_control colum
fcc0: 6e 29 2c 20 70 6c 75 73 20 6f 6e 65 20 6d 6f 72  n), plus one mor
fcd0: 65 20 0a 2a 2a 20 28 66 6f 72 20 74 68 65 20 72  e .** (for the r
fce0: 62 75 5f 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 29  bu_rowid column)
fcf0: 20 69 66 20 74 68 65 20 74 61 72 67 65 74 20 74   if the target t
fd00: 61 62 6c 65 20 69 73 20 61 6e 20 69 6d 70 6c 69  able is an impli
fd10: 63 69 74 20 49 50 4b 20 6f 72 20 0a 2a 2a 20 76  cit IPK or .** v
fd20: 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f  irtual table..*/
fd30: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75  .static void rbu
fd40: 4f 62 6a 49 74 65 72 50 72 65 70 61 72 65 54 6d  ObjIterPrepareTm
fd50: 70 49 6e 73 65 72 74 28 0a 20 20 73 71 6c 69 74  pInsert(.  sqlit
fd60: 65 33 72 62 75 20 2a 70 2c 20 0a 20 20 52 62 75  e3rbu *p, .  Rbu
fd70: 4f 62 6a 49 74 65 72 20 2a 70 49 74 65 72 2c 0a  ObjIter *pIter,.
fd80: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
fd90: 6f 6c 6c 69 73 74 2c 0a 20 20 63 6f 6e 73 74 20  ollist,.  const 
fda0: 63 68 61 72 20 2a 7a 52 62 75 52 6f 77 69 64 0a  char *zRbuRowid.
fdb0: 29 7b 0a 20 20 69 6e 74 20 62 52 62 75 52 6f 77  ){.  int bRbuRow
fdc0: 69 64 20 3d 20 28 70 49 74 65 72 2d 3e 65 54 79  id = (pIter->eTy
fdd0: 70 65 3d 3d 52 42 55 5f 50 4b 5f 45 58 54 45 52  pe==RBU_PK_EXTER
fde0: 4e 41 4c 20 7c 7c 20 70 49 74 65 72 2d 3e 65 54  NAL || pIter->eT
fdf0: 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 4e 4f 4e 45  ype==RBU_PK_NONE
fe00: 29 3b 0a 20 20 63 68 61 72 20 2a 7a 42 69 6e 64  );.  char *zBind
fe10: 20 3d 20 72 62 75 4f 62 6a 49 74 65 72 47 65 74   = rbuObjIterGet
fe20: 42 69 6e 64 6c 69 73 74 28 70 2c 20 70 49 74 65  Bindlist(p, pIte
fe30: 72 2d 3e 6e 54 62 6c 43 6f 6c 20 2b 20 31 20 2b  r->nTblCol + 1 +
fe40: 20 62 52 62 75 52 6f 77 69 64 29 3b 0a 20 20 69   bRbuRowid);.  i
fe50: 66 28 20 7a 42 69 6e 64 20 29 7b 0a 20 20 20 20  f( zBind ){.    
fe60: 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70  assert( pIter->p
fe70: 54 6d 70 49 6e 73 65 72 74 3d 3d 30 20 29 3b 0a  TmpInsert==0 );.
fe80: 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70      p->rc = prep
fe90: 61 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63  areFreeAndCollec
fea0: 74 45 72 72 6f 72 28 0a 20 20 20 20 20 20 20 20  tError(.        
feb0: 70 2d 3e 64 62 52 62 75 2c 20 26 70 49 74 65 72  p->dbRbu, &pIter
fec0: 2d 3e 70 54 6d 70 49 6e 73 65 72 74 2c 20 26 70  ->pTmpInsert, &p
fed0: 2d 3e 7a 45 72 72 6d 73 67 2c 20 73 71 6c 69 74  ->zErrmsg, sqlit
fee0: 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20  e3_mprintf(.    
fef0: 20 20 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e        "INSERT IN
ff00: 54 4f 20 25 73 2e 27 72 62 75 5f 74 6d 70 5f 25  TO %s.'rbu_tmp_%
ff10: 71 27 28 72 62 75 5f 63 6f 6e 74 72 6f 6c 2c 25  q'(rbu_control,%
ff20: 73 25 73 29 20 56 41 4c 55 45 53 28 25 7a 29 22  s%s) VALUES(%z)"
ff30: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  , .          p->
ff40: 7a 53 74 61 74 65 44 62 2c 20 70 49 74 65 72 2d  zStateDb, pIter-
ff50: 3e 7a 44 61 74 61 54 62 6c 2c 20 7a 43 6f 6c 6c  >zDataTbl, zColl
ff60: 69 73 74 2c 20 7a 52 62 75 52 6f 77 69 64 2c 20  ist, zRbuRowid, 
ff70: 7a 42 69 6e 64 0a 20 20 20 20 29 29 3b 0a 20 20  zBind.    ));.  
ff80: 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  }.}..static void
ff90: 20 72 62 75 54 6d 70 49 6e 73 65 72 74 46 75 6e   rbuTmpInsertFun
ffa0: 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  c(.  sqlite3_con
ffb0: 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20 69  text *pCtx, .  i
ffc0: 6e 74 20 6e 56 61 6c 2c 0a 20 20 73 71 6c 69 74  nt nVal,.  sqlit
ffd0: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c  e3_value **apVal
ffe0: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 72 62 75  .){.  sqlite3rbu
fff0: 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 5f 75 73   *p = sqlite3_us
10000 65 72 5f 64 61 74 61 28 70 43 74 78 29 3b 0a 20  er_data(pCtx);. 
10010 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
10020 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20  _OK;.  int i;.. 
10030 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
10040 5f 76 61 6c 75 65 5f 69 6e 74 28 61 70 56 61 6c  _value_int(apVal
10050 5b 30 5d 29 21 3d 30 0a 20 20 20 20 20 20 7c 7c  [0])!=0.      ||
10060 20 70 2d 3e 6f 62 6a 69 74 65 72 2e 65 54 79 70   p->objiter.eTyp
10070 65 3d 3d 52 42 55 5f 50 4b 5f 45 58 54 45 52 4e  e==RBU_PK_EXTERN
10080 41 4c 20 0a 20 20 20 20 20 20 7c 7c 20 70 2d 3e  AL .      || p->
10090 6f 62 6a 69 74 65 72 2e 65 54 79 70 65 3d 3d 52  objiter.eType==R
100a0 42 55 5f 50 4b 5f 4e 4f 4e 45 20 0a 20 20 29 3b  BU_PK_NONE .  );
100b0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76  .  if( sqlite3_v
100c0 61 6c 75 65 5f 69 6e 74 28 61 70 56 61 6c 5b 30  alue_int(apVal[0
100d0 5d 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e  ])!=0 ){.    p->
100e0 6e 50 68 61 73 65 4f 6e 65 53 74 65 70 20 2b 3d  nPhaseOneStep +=
100f0 20 70 2d 3e 6f 62 6a 69 74 65 72 2e 6e 49 6e 64   p->objiter.nInd
10100 65 78 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69  ex;.  }..  for(i
10110 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
10120 4b 20 26 26 20 69 3c 6e 56 61 6c 3b 20 69 2b 2b  K && i<nVal; i++
10130 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
10140 74 65 33 5f 62 69 6e 64 5f 76 61 6c 75 65 28 70  te3_bind_value(p
10150 2d 3e 6f 62 6a 69 74 65 72 2e 70 54 6d 70 49 6e  ->objiter.pTmpIn
10160 73 65 72 74 2c 20 69 2b 31 2c 20 61 70 56 61 6c  sert, i+1, apVal
10170 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  [i]);.  }.  if( 
10180 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
10190 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65  .    sqlite3_ste
101a0 70 28 70 2d 3e 6f 62 6a 69 74 65 72 2e 70 54 6d  p(p->objiter.pTm
101b0 70 49 6e 73 65 72 74 29 3b 0a 20 20 20 20 72 63  pInsert);.    rc
101c0 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
101d0 28 70 2d 3e 6f 62 6a 69 74 65 72 2e 70 54 6d 70  (p->objiter.pTmp
101e0 49 6e 73 65 72 74 29 3b 0a 20 20 7d 0a 0a 20 20  Insert);.  }..  
101f0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
10200 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
10210 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 63 6f  _result_error_co
10220 64 65 28 70 43 74 78 2c 20 72 63 29 3b 0a 20 20  de(pCtx, rc);.  
10230 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 73 75 72  }.}../*.** Ensur
10240 65 20 74 68 61 74 20 74 68 65 20 53 51 4c 69 74  e that the SQLit
10250 65 20 73 74 61 74 65 6d 65 6e 74 20 68 61 6e 64  e statement hand
10260 6c 65 73 20 72 65 71 75 69 72 65 64 20 74 6f 20  les required to 
10270 75 70 64 61 74 65 20 74 68 65 20 0a 2a 2a 20 74  update the .** t
10280 61 72 67 65 74 20 64 61 74 61 62 61 73 65 20 6f  arget database o
10290 62 6a 65 63 74 20 63 75 72 72 65 6e 74 6c 79 20  bject currently 
102a0 69 6e 64 69 63 61 74 65 64 20 62 79 20 74 68 65  indicated by the
102b0 20 69 74 65 72 61 74 6f 72 20 70 61 73 73 65 64   iterator passed
102c0 20 0a 2a 2a 20 61 73 20 74 68 65 20 73 65 63 6f   .** as the seco
102d0 6e 64 20 61 72 67 75 6d 65 6e 74 20 61 72 65 20  nd argument are 
102e0 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2f 0a 73 74  available..*/.st
102f0 61 74 69 63 20 69 6e 74 20 72 62 75 4f 62 6a 49  atic int rbuObjI
10300 74 65 72 50 72 65 70 61 72 65 41 6c 6c 28 0a 20  terPrepareAll(. 
10310 20 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20   sqlite3rbu *p, 
10320 0a 20 20 52 62 75 4f 62 6a 49 74 65 72 20 2a 70  .  RbuObjIter *p
10330 49 74 65 72 2c 0a 20 20 69 6e 74 20 6e 4f 66 66  Iter,.  int nOff
10340 73 65 74 20 20 20 20 20 20 20 20 20 20 20 20 20  set             
10350 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 22          /* Add "
10360 4c 49 4d 49 54 20 2d 31 20 4f 46 46 53 45 54 20  LIMIT -1 OFFSET 
10370 24 6e 4f 66 66 73 65 74 22 20 74 6f 20 53 45 4c  $nOffset" to SEL
10380 45 43 54 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65  ECT */.){.  asse
10390 72 74 28 20 70 49 74 65 72 2d 3e 62 43 6c 65 61  rt( pIter->bClea
103a0 6e 75 70 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  nup==0 );.  if( 
103b0 70 49 74 65 72 2d 3e 70 53 65 6c 65 63 74 3d 3d  pIter->pSelect==
103c0 30 20 26 26 20 72 62 75 4f 62 6a 49 74 65 72 43  0 && rbuObjIterC
103d0 61 63 68 65 54 61 62 6c 65 49 6e 66 6f 28 70 2c  acheTableInfo(p,
103e0 20 70 49 74 65 72 29 3d 3d 53 51 4c 49 54 45 5f   pIter)==SQLITE_
103f0 4f 4b 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  OK ){.    const 
10400 69 6e 74 20 74 6e 75 6d 20 3d 20 70 49 74 65 72  int tnum = pIter
10410 2d 3e 69 54 6e 75 6d 3b 0a 20 20 20 20 63 68 61  ->iTnum;.    cha
10420 72 20 2a 7a 43 6f 6c 6c 69 73 74 20 3d 20 30 3b  r *zCollist = 0;
10430 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
10440 73 74 20 6f 66 20 69 6e 64 65 78 65 64 20 63 6f  st of indexed co
10450 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 63 68 61  lumns */.    cha
10460 72 20 2a 2a 70 7a 20 3d 20 26 70 2d 3e 7a 45 72  r **pz = &p->zEr
10470 72 6d 73 67 3b 0a 20 20 20 20 63 6f 6e 73 74 20  rmsg;.    const 
10480 63 68 61 72 20 2a 7a 49 64 78 20 3d 20 70 49 74  char *zIdx = pIt
10490 65 72 2d 3e 7a 49 64 78 3b 0a 20 20 20 20 63 68  er->zIdx;.    ch
104a0 61 72 20 2a 7a 4c 69 6d 69 74 20 3d 20 30 3b 0a  ar *zLimit = 0;.
104b0 0a 20 20 20 20 69 66 28 20 6e 4f 66 66 73 65 74  .    if( nOffset
104c0 20 29 7b 0a 20 20 20 20 20 20 7a 4c 69 6d 69 74   ){.      zLimit
104d0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
104e0 74 66 28 22 20 4c 49 4d 49 54 20 2d 31 20 4f 46  tf(" LIMIT -1 OF
104f0 46 53 45 54 20 25 64 22 2c 20 6e 4f 66 66 73 65  FSET %d", nOffse
10500 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a  t);.      if( !z
10510 4c 69 6d 69 74 20 29 20 70 2d 3e 72 63 20 3d 20  Limit ) p->rc = 
10520 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
10530 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 7a 49 64    }..    if( zId
10540 78 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  x ){.      const
10550 20 63 68 61 72 20 2a 7a 54 62 6c 20 3d 20 70 49   char *zTbl = pI
10560 74 65 72 2d 3e 7a 54 62 6c 3b 0a 20 20 20 20 20  ter->zTbl;.     
10570 20 63 68 61 72 20 2a 7a 49 6d 70 6f 73 74 65 72   char *zImposter
10580 43 6f 6c 73 20 3d 20 30 3b 20 20 20 20 2f 2a 20  Cols = 0;    /* 
10590 43 6f 6c 75 6d 6e 73 20 66 6f 72 20 69 6d 70 6f  Columns for impo
105a0 73 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ster table */.  
105b0 20 20 20 20 63 68 61 72 20 2a 7a 49 6d 70 6f 73      char *zImpos
105c0 74 65 72 50 4b 20 3d 20 30 3b 20 20 20 20 20 20  terPK = 0;      
105d0 2f 2a 20 50 72 69 6d 61 72 79 20 6b 65 79 20 64  /* Primary key d
105e0 65 63 6c 61 72 61 74 69 6f 6e 20 66 6f 72 20 69  eclaration for i
105f0 6d 70 6f 73 74 65 72 20 2a 2f 0a 20 20 20 20 20  mposter */.     
10600 20 63 68 61 72 20 2a 7a 57 68 65 72 65 20 3d 20   char *zWhere = 
10610 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
10620 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 6e 20  WHERE clause on 
10630 50 4b 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  PK columns */.  
10640 20 20 20 20 63 68 61 72 20 2a 7a 42 69 6e 64 20      char *zBind 
10650 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  = 0;.      int n
10660 42 69 6e 64 20 3d 20 30 3b 0a 0a 20 20 20 20 20  Bind = 0;..     
10670 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
10680 65 54 79 70 65 21 3d 52 42 55 5f 50 4b 5f 56 54  eType!=RBU_PK_VT
10690 41 42 20 29 3b 0a 20 20 20 20 20 20 7a 43 6f 6c  AB );.      zCol
106a0 6c 69 73 74 20 3d 20 72 62 75 4f 62 6a 49 74 65  list = rbuObjIte
106b0 72 47 65 74 49 6e 64 65 78 43 6f 6c 73 28 0a 20  rGetIndexCols(. 
106c0 20 20 20 20 20 20 20 20 20 70 2c 20 70 49 74 65           p, pIte
106d0 72 2c 20 26 7a 49 6d 70 6f 73 74 65 72 43 6f 6c  r, &zImposterCol
106e0 73 2c 20 26 7a 49 6d 70 6f 73 74 65 72 50 4b 2c  s, &zImposterPK,
106f0 20 26 7a 57 68 65 72 65 2c 20 26 6e 42 69 6e 64   &zWhere, &nBind
10700 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
10710 7a 42 69 6e 64 20 3d 20 72 62 75 4f 62 6a 49 74  zBind = rbuObjIt
10720 65 72 47 65 74 42 69 6e 64 6c 69 73 74 28 70 2c  erGetBindlist(p,
10730 20 6e 42 69 6e 64 29 3b 0a 0a 20 20 20 20 20 20   nBind);..      
10740 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 69 6d  /* Create the im
10750 70 6f 73 74 65 72 20 74 61 62 6c 65 20 75 73 65  poster table use
10760 64 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68  d to write to th
10770 69 73 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20 20  is index. */.   
10780 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f     sqlite3_test_
10790 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
107a0 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52  ESTCTRL_IMPOSTER
107b0 2c 20 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 6d 61  , p->dbMain, "ma
107c0 69 6e 22 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20  in", 0, 1);.    
107d0 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
107e0 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
107f0 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52 2c  STCTRL_IMPOSTER,
10800 20 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 6d 61 69   p->dbMain, "mai
10810 6e 22 2c 20 31 2c 74 6e 75 6d 29 3b 0a 20 20 20  n", 1,tnum);.   
10820 20 20 20 72 62 75 4d 50 72 69 6e 74 66 45 78 65     rbuMPrintfExe
10830 63 28 70 2c 20 70 2d 3e 64 62 4d 61 69 6e 2c 0a  c(p, p->dbMain,.
10840 20 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54            "CREAT
10850 45 20 54 41 42 4c 45 20 5c 22 72 62 75 5f 69 6d  E TABLE \"rbu_im
10860 70 5f 25 77 5c 22 28 20 25 73 2c 20 50 52 49 4d  p_%w\"( %s, PRIM
10870 41 52 59 20 4b 45 59 28 20 25 73 20 29 20 29 20  ARY KEY( %s ) ) 
10880 57 49 54 48 4f 55 54 20 52 4f 57 49 44 22 2c 0a  WITHOUT ROWID",.
10890 20 20 20 20 20 20 20 20 20 20 7a 54 62 6c 2c 20            zTbl, 
108a0 7a 49 6d 70 6f 73 74 65 72 43 6f 6c 73 2c 20 7a  zImposterCols, z
108b0 49 6d 70 6f 73 74 65 72 50 4b 0a 20 20 20 20 20  ImposterPK.     
108c0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
108d0 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
108e0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49  QLITE_TESTCTRL_I
108f0 4d 50 4f 53 54 45 52 2c 20 70 2d 3e 64 62 4d 61  MPOSTER, p->dbMa
10900 69 6e 2c 20 22 6d 61 69 6e 22 2c 20 30 2c 20 30  in, "main", 0, 0
10910 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 72 65  );..      /* Cre
10920 61 74 65 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ate the statemen
10930 74 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 64 65  t to insert inde
10940 78 20 65 6e 74 72 69 65 73 20 2a 2f 0a 20 20 20  x entries */.   
10950 20 20 20 70 49 74 65 72 2d 3e 6e 43 6f 6c 20 3d     pIter->nCol =
10960 20 6e 42 69 6e 64 3b 0a 20 20 20 20 20 20 69 66   nBind;.      if
10970 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
10980 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  OK ){.        p-
10990 3e 72 63 20 3d 20 70 72 65 70 61 72 65 46 72 65  >rc = prepareFre
109a0 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72  eAndCollectError
109b0 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d  (.            p-
109c0 3e 64 62 4d 61 69 6e 2c 20 26 70 49 74 65 72 2d  >dbMain, &pIter-
109d0 3e 70 49 6e 73 65 72 74 2c 20 26 70 2d 3e 7a 45  >pInsert, &p->zE
109e0 72 72 6d 73 67 2c 0a 20 20 20 20 20 20 20 20 20  rrmsg,.         
109f0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
10a00 28 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 5c 22  ("INSERT INTO \"
10a10 72 62 75 5f 69 6d 70 5f 25 77 5c 22 20 56 41 4c  rbu_imp_%w\" VAL
10a20 55 45 53 28 25 73 29 22 2c 20 7a 54 62 6c 2c 20  UES(%s)", zTbl, 
10a30 7a 42 69 6e 64 29 0a 20 20 20 20 20 20 20 20 29  zBind).        )
10a40 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
10a50 20 2f 2a 20 41 6e 64 20 74 6f 20 64 65 6c 65 74   /* And to delet
10a60 65 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20  e index entries 
10a70 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 72 62 75  */.      if( rbu
10a80 49 73 56 61 63 75 75 6d 28 70 29 3d 3d 30 20 26  IsVacuum(p)==0 &
10a90 26 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  & p->rc==SQLITE_
10aa0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  OK ){.        p-
10ab0 3e 72 63 20 3d 20 70 72 65 70 61 72 65 46 72 65  >rc = prepareFre
10ac0 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72  eAndCollectError
10ad0 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d  (.            p-
10ae0 3e 64 62 4d 61 69 6e 2c 20 26 70 49 74 65 72 2d  >dbMain, &pIter-
10af0 3e 70 44 65 6c 65 74 65 2c 20 26 70 2d 3e 7a 45  >pDelete, &p->zE
10b00 72 72 6d 73 67 2c 0a 20 20 20 20 20 20 20 20 20  rrmsg,.         
10b10 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
10b20 28 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 5c 22  ("DELETE FROM \"
10b30 72 62 75 5f 69 6d 70 5f 25 77 5c 22 20 57 48 45  rbu_imp_%w\" WHE
10b40 52 45 20 25 73 22 2c 20 7a 54 62 6c 2c 20 7a 57  RE %s", zTbl, zW
10b50 68 65 72 65 29 0a 20 20 20 20 20 20 20 20 29 3b  here).        );
10b60 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
10b70 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 53 45  /* Create the SE
10b80 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74  LECT statement t
10b90 6f 20 72 65 61 64 20 6b 65 79 73 20 69 6e 20 73  o read keys in s
10ba0 6f 72 74 65 64 20 6f 72 64 65 72 20 2a 2f 0a 20  orted order */. 
10bb0 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
10bc0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
10bd0 20 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b       char *zSql;
10be0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 62 75  .        if( rbu
10bf0 49 73 56 61 63 75 75 6d 28 70 29 20 29 7b 0a 20  IsVacuum(p) ){. 
10c00 20 20 20 20 20 20 20 20 20 7a 53 71 6c 20 3d 20           zSql = 
10c10 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
10c20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
10c30 53 45 4c 45 43 54 20 25 73 2c 20 30 20 41 53 20  SELECT %s, 0 AS 
10c40 72 62 75 5f 63 6f 6e 74 72 6f 6c 20 46 52 4f 4d  rbu_control FROM
10c50 20 27 25 71 27 20 4f 52 44 45 52 20 42 59 20 25   '%q' ORDER BY %
10c60 73 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s%s",.          
10c70 20 20 20 20 7a 43 6f 6c 6c 69 73 74 2c 20 0a 20      zCollist, . 
10c80 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74               pIt
10c90 65 72 2d 3e 7a 44 61 74 61 54 62 6c 2c 0a 20 20  er->zDataTbl,.  
10ca0 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c              zCol
10cb0 6c 69 73 74 2c 20 7a 4c 69 6d 69 74 0a 20 20 20  list, zLimit.   
10cc0 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
10cd0 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20 20 20 20    }else..       
10ce0 20 69 66 28 20 70 49 74 65 72 2d 3e 65 54 79 70   if( pIter->eTyp
10cf0 65 3d 3d 52 42 55 5f 50 4b 5f 45 58 54 45 52 4e  e==RBU_PK_EXTERN
10d00 41 4c 20 7c 7c 20 70 49 74 65 72 2d 3e 65 54 79  AL || pIter->eTy
10d10 70 65 3d 3d 52 42 55 5f 50 4b 5f 4e 4f 4e 45 20  pe==RBU_PK_NONE 
10d20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 53 71  ){.          zSq
10d30 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  l = sqlite3_mpri
10d40 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 20  ntf(.           
10d50 20 20 20 22 53 45 4c 45 43 54 20 25 73 2c 20 72     "SELECT %s, r
10d60 62 75 5f 63 6f 6e 74 72 6f 6c 20 46 52 4f 4d 20  bu_control FROM 
10d70 25 73 2e 27 72 62 75 5f 74 6d 70 5f 25 71 27 20  %s.'rbu_tmp_%q' 
10d80 4f 52 44 45 52 20 42 59 20 25 73 25 73 22 2c 0a  ORDER BY %s%s",.
10d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 43                zC
10da0 6f 6c 6c 69 73 74 2c 20 70 2d 3e 7a 53 74 61 74  ollist, p->zStat
10db0 65 44 62 2c 20 70 49 74 65 72 2d 3e 7a 44 61 74  eDb, pIter->zDat
10dc0 61 54 62 6c 2c 0a 20 20 20 20 20 20 20 20 20 20  aTbl,.          
10dd0 20 20 20 20 7a 43 6f 6c 6c 69 73 74 2c 20 7a 4c      zCollist, zL
10de0 69 6d 69 74 0a 20 20 20 20 20 20 20 20 20 20 29  imit.          )
10df0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
10e00 0a 20 20 20 20 20 20 20 20 20 20 7a 53 71 6c 20  .          zSql 
10e10 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
10e20 66 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  f(.             
10e30 20 22 53 45 4c 45 43 54 20 25 73 2c 20 72 62 75   "SELECT %s, rbu
10e40 5f 63 6f 6e 74 72 6f 6c 20 46 52 4f 4d 20 25 73  _control FROM %s
10e50 2e 27 72 62 75 5f 74 6d 70 5f 25 71 27 20 22 0a  .'rbu_tmp_%q' ".
10e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 55                "U
10e70 4e 49 4f 4e 20 41 4c 4c 20 22 0a 20 20 20 20 20  NION ALL ".     
10e80 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54           "SELECT
10e90 20 25 73 2c 20 72 62 75 5f 63 6f 6e 74 72 6f 6c   %s, rbu_control
10ea0 20 46 52 4f 4d 20 27 25 71 27 20 22 0a 20 20 20   FROM '%q' ".   
10eb0 20 20 20 20 20 20 20 20 20 20 20 22 57 48 45 52             "WHER
10ec0 45 20 74 79 70 65 6f 66 28 72 62 75 5f 63 6f 6e  E typeof(rbu_con
10ed0 74 72 6f 6c 29 3d 27 69 6e 74 65 67 65 72 27 20  trol)='integer' 
10ee0 41 4e 44 20 72 62 75 5f 63 6f 6e 74 72 6f 6c 21  AND rbu_control!
10ef0 3d 31 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  =1 ".           
10f00 20 20 20 22 4f 52 44 45 52 20 42 59 20 25 73 25     "ORDER BY %s%
10f10 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s",.            
10f20 20 20 7a 43 6f 6c 6c 69 73 74 2c 20 70 2d 3e 7a    zCollist, p->z
10f30 53 74 61 74 65 44 62 2c 20 70 49 74 65 72 2d 3e  StateDb, pIter->
10f40 7a 44 61 74 61 54 62 6c 2c 20 0a 20 20 20 20 20  zDataTbl, .     
10f50 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 6c 69 73           zCollis
10f60 74 2c 20 70 49 74 65 72 2d 3e 7a 44 61 74 61 54  t, pIter->zDataT
10f70 62 6c 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  bl, .           
10f80 20 20 20 7a 43 6f 6c 6c 69 73 74 2c 20 7a 4c 69     zCollist, zLi
10f90 6d 69 74 0a 20 20 20 20 20 20 20 20 20 20 29 3b  mit.          );
10fa0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
10fb0 20 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61     p->rc = prepa
10fc0 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74  reFreeAndCollect
10fd0 45 72 72 6f 72 28 70 2d 3e 64 62 52 62 75 2c 20  Error(p->dbRbu, 
10fe0 26 70 49 74 65 72 2d 3e 70 53 65 6c 65 63 74 2c  &pIter->pSelect,
10ff0 20 70 7a 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20   pz, zSql);.    
11000 20 20 7d 0a 0a 20 20 20 20 20 20 73 71 6c 69 74    }..      sqlit
11010 65 33 5f 66 72 65 65 28 7a 49 6d 70 6f 73 74 65  e3_free(zImposte
11020 72 43 6f 6c 73 29 3b 0a 20 20 20 20 20 20 73 71  rCols);.      sq
11030 6c 69 74 65 33 5f 66 72 65 65 28 7a 49 6d 70 6f  lite3_free(zImpo
11040 73 74 65 72 50 4b 29 3b 0a 20 20 20 20 20 20 73  sterPK);.      s
11050 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 57 68 65  qlite3_free(zWhe
11060 72 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  re);.      sqlit
11070 65 33 5f 66 72 65 65 28 7a 42 69 6e 64 29 3b 0a  e3_free(zBind);.
11080 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11090 20 69 6e 74 20 62 52 62 75 52 6f 77 69 64 20 3d   int bRbuRowid =
110a0 20 28 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d   (pIter->eType==
110b0 52 42 55 5f 50 4b 5f 56 54 41 42 29 0a 20 20 20  RBU_PK_VTAB).   
110c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
110d0 20 7c 7c 28 70 49 74 65 72 2d 3e 65 54 79 70 65   ||(pIter->eType
110e0 3d 3d 52 42 55 5f 50 4b 5f 4e 4f 4e 45 29 0a 20  ==RBU_PK_NONE). 
110f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11100 20 20 20 7c 7c 28 70 49 74 65 72 2d 3e 65 54 79     ||(pIter->eTy
11110 70 65 3d 3d 52 42 55 5f 50 4b 5f 45 58 54 45 52  pe==RBU_PK_EXTER
11120 4e 41 4c 20 26 26 20 72 62 75 49 73 56 61 63 75  NAL && rbuIsVacu
11130 75 6d 28 70 29 29 3b 0a 20 20 20 20 20 20 63 6f  um(p));.      co
11140 6e 73 74 20 63 68 61 72 20 2a 7a 54 62 6c 20 3d  nst char *zTbl =
11150 20 70 49 74 65 72 2d 3e 7a 54 62 6c 3b 20 20 20   pIter->zTbl;   
11160 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 68 69      /* Table thi
11170 73 20 73 74 65 70 20 61 70 70 6c 69 65 73 20 74  s step applies t
11180 6f 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74  o */.      const
11190 20 63 68 61 72 20 2a 7a 57 72 69 74 65 3b 20 20   char *zWrite;  
111a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
111b0 20 2f 2a 20 49 6d 70 6f 73 74 65 72 20 74 61 62   /* Imposter tab
111c0 6c 65 20 6e 61 6d 65 20 2a 2f 0a 0a 20 20 20 20  le name */..    
111d0 20 20 63 68 61 72 20 2a 7a 42 69 6e 64 69 6e 67    char *zBinding
111e0 73 20 3d 20 72 62 75 4f 62 6a 49 74 65 72 47 65  s = rbuObjIterGe
111f0 74 42 69 6e 64 6c 69 73 74 28 70 2c 20 70 49 74  tBindlist(p, pIt
11200 65 72 2d 3e 6e 54 62 6c 43 6f 6c 20 2b 20 62 52  er->nTblCol + bR
11210 62 75 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  buRowid);.      
11220 63 68 61 72 20 2a 7a 57 68 65 72 65 20 3d 20 72  char *zWhere = r
11230 62 75 4f 62 6a 49 74 65 72 47 65 74 57 68 65 72  buObjIterGetWher
11240 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20  e(p, pIter);.   
11250 20 20 20 63 68 61 72 20 2a 7a 4f 6c 64 6c 69 73     char *zOldlis
11260 74 20 3d 20 72 62 75 4f 62 6a 49 74 65 72 47 65  t = rbuObjIterGe
11270 74 4f 6c 64 6c 69 73 74 28 70 2c 20 70 49 74 65  tOldlist(p, pIte
11280 72 2c 20 22 6f 6c 64 22 29 3b 0a 20 20 20 20 20  r, "old");.     
11290 20 63 68 61 72 20 2a 7a 4e 65 77 6c 69 73 74 20   char *zNewlist 
112a0 3d 20 72 62 75 4f 62 6a 49 74 65 72 47 65 74 4f  = rbuObjIterGetO
112b0 6c 64 6c 69 73 74 28 70 2c 20 70 49 74 65 72 2c  ldlist(p, pIter,
112c0 20 22 6e 65 77 22 29 3b 0a 0a 20 20 20 20 20 20   "new");..      
112d0 7a 43 6f 6c 6c 69 73 74 20 3d 20 72 62 75 4f 62  zCollist = rbuOb
112e0 6a 49 74 65 72 47 65 74 43 6f 6c 6c 69 73 74 28  jIterGetCollist(
112f0 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20  p, pIter);.     
11300 20 70 49 74 65 72 2d 3e 6e 43 6f 6c 20 3d 20 70   pIter->nCol = p
11310 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 3b 0a 0a  Iter->nTblCol;..
11320 20 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20        /* Create 
11330 74 68 65 20 69 6d 70 6f 73 74 65 72 20 74 61 62  the imposter tab
11340 6c 65 20 6f 72 20 74 61 62 6c 65 73 20 28 69 66  le or tables (if
11350 20 72 65 71 75 69 72 65 64 29 2e 20 2a 2f 0a 20   required). */. 
11360 20 20 20 20 20 72 62 75 43 72 65 61 74 65 49 6d       rbuCreateIm
11370 70 6f 73 74 65 72 54 61 62 6c 65 28 70 2c 20 70  posterTable(p, p
11380 49 74 65 72 29 3b 0a 20 20 20 20 20 20 72 62 75  Iter);.      rbu
11390 43 72 65 61 74 65 49 6d 70 6f 73 74 65 72 54 61  CreateImposterTa
113a0 62 6c 65 32 28 70 2c 20 70 49 74 65 72 29 3b 0a  ble2(p, pIter);.
113b0 20 20 20 20 20 20 7a 57 72 69 74 65 20 3d 20 28        zWrite = (
113c0 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42  pIter->eType==RB
113d0 55 5f 50 4b 5f 56 54 41 42 20 3f 20 22 22 20 3a  U_PK_VTAB ? "" :
113e0 20 22 72 62 75 5f 69 6d 70 5f 22 29 3b 0a 0a 20   "rbu_imp_");.. 
113f0 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74       /* Create t
11400 68 65 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d  he INSERT statem
11410 65 6e 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20  ent to write to 
11420 74 68 65 20 74 61 72 67 65 74 20 50 4b 20 62 2d  the target PK b-
11430 74 72 65 65 20 2a 2f 0a 20 20 20 20 20 20 69 66  tree */.      if
11440 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
11450 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  OK ){.        p-
11460 3e 72 63 20 3d 20 70 72 65 70 61 72 65 46 72 65  >rc = prepareFre
11470 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72  eAndCollectError
11480 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 70 49 74  (p->dbMain, &pIt
11490 65 72 2d 3e 70 49 6e 73 65 72 74 2c 20 70 7a 2c  er->pInsert, pz,
114a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
114b0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20  ite3_mprintf(.  
114c0 20 20 20 20 20 20 20 20 20 20 20 20 22 49 4e 53              "INS
114d0 45 52 54 20 49 4e 54 4f 20 5c 22 25 73 25 77 5c  ERT INTO \"%s%w\
114e0 22 28 25 73 25 73 29 20 56 41 4c 55 45 53 28 25  "(%s%s) VALUES(%
114f0 73 29 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  s)", .          
11500 20 20 20 20 7a 57 72 69 74 65 2c 20 7a 54 62 6c      zWrite, zTbl
11510 2c 20 7a 43 6f 6c 6c 69 73 74 2c 20 28 62 52 62  , zCollist, (bRb
11520 75 52 6f 77 69 64 20 3f 20 22 2c 20 5f 72 6f 77  uRowid ? ", _row
11530 69 64 5f 22 20 3a 20 22 22 29 2c 20 7a 42 69 6e  id_" : ""), zBin
11540 64 69 6e 67 73 0a 20 20 20 20 20 20 20 20 20 20  dings.          
11550 20 20 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20    ).        );. 
11560 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
11570 20 43 72 65 61 74 65 20 74 68 65 20 44 45 4c 45   Create the DELE
11580 54 45 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20  TE statement to 
11590 77 72 69 74 65 20 74 6f 20 74 68 65 20 74 61 72  write to the tar
115a0 67 65 74 20 50 4b 20 62 2d 74 72 65 65 2e 0a 20  get PK b-tree.. 
115b0 20 20 20 20 20 2a 2a 20 42 65 63 61 75 73 65 20       ** Because 
115c0 69 74 20 6f 6e 6c 79 20 70 65 72 66 6f 72 6d 73  it only performs
115d0 20 49 4e 53 45 52 54 20 6f 70 65 72 61 74 69 6f   INSERT operatio
115e0 6e 73 2c 20 74 68 69 73 20 69 73 20 6e 6f 74 20  ns, this is not 
115f0 72 65 71 75 69 72 65 64 20 66 6f 72 0a 20 20 20  required for.   
11600 20 20 20 2a 2a 20 61 6e 20 72 62 75 20 76 61 63     ** an rbu vac
11610 75 75 6d 20 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a  uum handle.  */.
11620 20 20 20 20 20 20 69 66 28 20 72 62 75 49 73 56        if( rbuIsV
11630 61 63 75 75 6d 28 70 29 3d 3d 30 20 26 26 20 70  acuum(p)==0 && p
11640 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
11650 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63  ){.        p->rc
11660 20 3d 20 70 72 65 70 61 72 65 46 72 65 65 41 6e   = prepareFreeAn
11670 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d  dCollectError(p-
11680 3e 64 62 4d 61 69 6e 2c 20 26 70 49 74 65 72 2d  >dbMain, &pIter-
11690 3e 70 44 65 6c 65 74 65 2c 20 70 7a 2c 0a 20 20  >pDelete, pz,.  
116a0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
116b0 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20  3_mprintf(.     
116c0 20 20 20 20 20 20 20 20 20 22 44 45 4c 45 54 45           "DELETE
116d0 20 46 52 4f 4d 20 5c 22 25 73 25 77 5c 22 20 57   FROM \"%s%w\" W
116e0 48 45 52 45 20 25 73 22 2c 20 7a 57 72 69 74 65  HERE %s", zWrite
116f0 2c 20 7a 54 62 6c 2c 20 7a 57 68 65 72 65 0a 20  , zTbl, zWhere. 
11700 20 20 20 20 20 20 20 20 20 20 20 29 0a 20 20 20             ).   
11710 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a       );.      }.
11720 0a 20 20 20 20 20 20 69 66 28 20 72 62 75 49 73  .      if( rbuIs
11730 56 61 63 75 75 6d 28 70 29 3d 3d 30 20 26 26 20  Vacuum(p)==0 && 
11740 70 49 74 65 72 2d 3e 61 62 49 6e 64 65 78 65 64  pIter->abIndexed
11750 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73   ){.        cons
11760 74 20 63 68 61 72 20 2a 7a 52 62 75 52 6f 77 69  t char *zRbuRowi
11770 64 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 20 20  d = "";.        
11780 69 66 28 20 70 49 74 65 72 2d 3e 65 54 79 70 65  if( pIter->eType
11790 3d 3d 52 42 55 5f 50 4b 5f 45 58 54 45 52 4e 41  ==RBU_PK_EXTERNA
117a0 4c 20 7c 7c 20 70 49 74 65 72 2d 3e 65 54 79 70  L || pIter->eTyp
117b0 65 3d 3d 52 42 55 5f 50 4b 5f 4e 4f 4e 45 20 29  e==RBU_PK_NONE )
117c0 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 52 62 75  {.          zRbu
117d0 52 6f 77 69 64 20 3d 20 22 2c 20 72 62 75 5f 72  Rowid = ", rbu_r
117e0 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 20 20 7d  owid";.        }
117f0 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 72 65  ..        /* Cre
11800 61 74 65 20 74 68 65 20 72 62 75 5f 74 6d 70 5f  ate the rbu_tmp_
11810 78 78 78 20 74 61 62 6c 65 20 61 6e 64 20 74 68  xxx table and th
11820 65 20 74 72 69 67 67 65 72 73 20 74 6f 20 70 6f  e triggers to po
11830 70 75 6c 61 74 65 20 69 74 2e 20 2a 2f 0a 20 20  pulate it. */.  
11840 20 20 20 20 20 20 72 62 75 4d 50 72 69 6e 74 66        rbuMPrintf
11850 45 78 65 63 28 70 2c 20 70 2d 3e 64 62 52 62 75  Exec(p, p->dbRbu
11860 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 43  ,.            "C
11870 52 45 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e  REATE TABLE IF N
11880 4f 54 20 45 58 49 53 54 53 20 25 73 2e 27 72 62  OT EXISTS %s.'rb
11890 75 5f 74 6d 70 5f 25 71 27 20 41 53 20 22 0a 20  u_tmp_%q' AS ". 
118a0 20 20 20 20 20 20 20 20 20 20 20 22 53 45 4c 45             "SELE
118b0 43 54 20 2a 25 73 20 46 52 4f 4d 20 27 25 71 27  CT *%s FROM '%q'
118c0 20 57 48 45 52 45 20 30 3b 22 0a 20 20 20 20 20   WHERE 0;".     
118d0 20 20 20 20 20 20 20 2c 20 70 2d 3e 7a 53 74 61         , p->zSta
118e0 74 65 44 62 2c 20 70 49 74 65 72 2d 3e 7a 44 61  teDb, pIter->zDa
118f0 74 61 54 62 6c 0a 20 20 20 20 20 20 20 20 20 20  taTbl.          
11900 20 20 2c 20 28 70 49 74 65 72 2d 3e 65 54 79 70    , (pIter->eTyp
11910 65 3d 3d 52 42 55 5f 50 4b 5f 45 58 54 45 52 4e  e==RBU_PK_EXTERN
11920 41 4c 20 3f 20 22 2c 20 30 20 41 53 20 72 62 75  AL ? ", 0 AS rbu
11930 5f 72 6f 77 69 64 22 20 3a 20 22 22 29 0a 20 20  _rowid" : "").  
11940 20 20 20 20 20 20 20 20 20 20 2c 20 70 49 74 65            , pIte
11950 72 2d 3e 7a 44 61 74 61 54 62 6c 0a 20 20 20 20  r->zDataTbl.    
11960 20 20 20 20 29 3b 0a 0a 20 20 20 20 20 20 20 20      );..        
11970 72 62 75 4d 50 72 69 6e 74 66 45 78 65 63 28 70  rbuMPrintfExec(p
11980 2c 20 70 2d 3e 64 62 4d 61 69 6e 2c 0a 20 20 20  , p->dbMain,.   
11990 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45           "CREATE
119a0 20 54 45 4d 50 20 54 52 49 47 47 45 52 20 72 62   TEMP TRIGGER rb
119b0 75 5f 64 65 6c 65 74 65 5f 74 72 20 42 45 46 4f  u_delete_tr BEFO
119c0 52 45 20 44 45 4c 45 54 45 20 4f 4e 20 5c 22 25  RE DELETE ON \"%
119d0 73 25 77 5c 22 20 22 0a 20 20 20 20 20 20 20 20  s%w\" ".        
119e0 20 20 20 20 22 42 45 47 49 4e 20 22 0a 20 20 20      "BEGIN ".   
119f0 20 20 20 20 20 20 20 20 20 22 20 20 53 45 4c 45           "  SELE
11a00 43 54 20 72 62 75 5f 74 6d 70 5f 69 6e 73 65 72  CT rbu_tmp_inser
11a10 74 28 33 2c 20 25 73 29 3b 22 0a 20 20 20 20 20  t(3, %s);".     
11a20 20 20 20 20 20 20 20 22 45 4e 44 3b 22 0a 0a 20         "END;".. 
11a30 20 20 20 20 20 20 20 20 20 20 20 22 43 52 45 41             "CREA
11a40 54 45 20 54 45 4d 50 20 54 52 49 47 47 45 52 20  TE TEMP TRIGGER 
11a50 72 62 75 5f 75 70 64 61 74 65 31 5f 74 72 20 42  rbu_update1_tr B
11a60 45 46 4f 52 45 20 55 50 44 41 54 45 20 4f 4e 20  EFORE UPDATE ON 
11a70 5c 22 25 73 25 77 5c 22 20 22 0a 20 20 20 20 20  \"%s%w\" ".     
11a80 20 20 20 20 20 20 20 22 42 45 47 49 4e 20 22 0a         "BEGIN ".
11a90 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20 53              "  S
11aa0 45 4c 45 43 54 20 72 62 75 5f 74 6d 70 5f 69 6e  ELECT rbu_tmp_in
11ab0 73 65 72 74 28 33 2c 20 25 73 29 3b 22 0a 20 20  sert(3, %s);".  
11ac0 20 20 20 20 20 20 20 20 20 20 22 45 4e 44 3b 22            "END;"
11ad0 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 43  ..            "C
11ae0 52 45 41 54 45 20 54 45 4d 50 20 54 52 49 47 47  REATE TEMP TRIGG
11af0 45 52 20 72 62 75 5f 75 70 64 61 74 65 32 5f 74  ER rbu_update2_t
11b00 72 20 41 46 54 45 52 20 55 50 44 41 54 45 20 4f  r AFTER UPDATE O
11b10 4e 20 5c 22 25 73 25 77 5c 22 20 22 0a 20 20 20  N \"%s%w\" ".   
11b20 20 20 20 20 20 20 20 20 20 22 42 45 47 49 4e 20           "BEGIN 
11b30 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 20  ".            " 
11b40 20 53 45 4c 45 43 54 20 72 62 75 5f 74 6d 70 5f   SELECT rbu_tmp_
11b50 69 6e 73 65 72 74 28 34 2c 20 25 73 29 3b 22 0a  insert(4, %s);".
11b60 20 20 20 20 20 20 20 20 20 20 20 20 22 45 4e 44              "END
11b70 3b 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ;",.            
11b80 7a 57 72 69 74 65 2c 20 7a 54 62 6c 2c 20 7a 4f  zWrite, zTbl, zO
11b90 6c 64 6c 69 73 74 2c 0a 20 20 20 20 20 20 20 20  ldlist,.        
11ba0 20 20 20 20 7a 57 72 69 74 65 2c 20 7a 54 62 6c      zWrite, zTbl
11bb0 2c 20 7a 4f 6c 64 6c 69 73 74 2c 0a 20 20 20 20  , zOldlist,.    
11bc0 20 20 20 20 20 20 20 20 7a 57 72 69 74 65 2c 20          zWrite, 
11bd0 7a 54 62 6c 2c 20 7a 4e 65 77 6c 69 73 74 0a 20  zTbl, zNewlist. 
11be0 20 20 20 20 20 20 20 29 3b 0a 0a 20 20 20 20 20         );..     
11bf0 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 65 54     if( pIter->eT
11c00 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 45 58 54 45  ype==RBU_PK_EXTE
11c10 52 4e 41 4c 20 7c 7c 20 70 49 74 65 72 2d 3e 65  RNAL || pIter->e
11c20 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 4e 4f 4e  Type==RBU_PK_NON
11c30 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  E ){.          r
11c40 62 75 4d 50 72 69 6e 74 66 45 78 65 63 28 70 2c  buMPrintfExec(p,
11c50 20 70 2d 3e 64 62 4d 61 69 6e 2c 0a 20 20 20 20   p->dbMain,.    
11c60 20 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54            "CREAT
11c70 45 20 54 45 4d 50 20 54 52 49 47 47 45 52 20 72  E TEMP TRIGGER r
11c80 62 75 5f 69 6e 73 65 72 74 5f 74 72 20 41 46 54  bu_insert_tr AFT
11c90 45 52 20 49 4e 53 45 52 54 20 4f 4e 20 5c 22 25  ER INSERT ON \"%
11ca0 73 25 77 5c 22 20 22 0a 20 20 20 20 20 20 20 20  s%w\" ".        
11cb0 20 20 20 20 20 20 22 42 45 47 49 4e 20 22 0a 20        "BEGIN ". 
11cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20               "  
11cd0 53 45 4c 45 43 54 20 72 62 75 5f 74 6d 70 5f 69  SELECT rbu_tmp_i
11ce0 6e 73 65 72 74 28 30 2c 20 25 73 29 3b 22 0a 20  nsert(0, %s);". 
11cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 45 4e               "EN
11d00 44 3b 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  D;",.           
11d10 20 20 20 7a 57 72 69 74 65 2c 20 7a 54 62 6c 2c     zWrite, zTbl,
11d20 20 7a 4e 65 77 6c 69 73 74 0a 20 20 20 20 20 20   zNewlist.      
11d30 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7d      );.        }
11d40 0a 0a 20 20 20 20 20 20 20 20 72 62 75 4f 62 6a  ..        rbuObj
11d50 49 74 65 72 50 72 65 70 61 72 65 54 6d 70 49 6e  IterPrepareTmpIn
11d60 73 65 72 74 28 70 2c 20 70 49 74 65 72 2c 20 7a  sert(p, pIter, z
11d70 43 6f 6c 6c 69 73 74 2c 20 7a 52 62 75 52 6f 77  Collist, zRbuRow
11d80 69 64 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  id);.      }..  
11d90 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68      /* Create th
11da0 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
11db0 6e 74 20 74 6f 20 72 65 61 64 20 6b 65 79 73 20  nt to read keys 
11dc0 66 72 6f 6d 20 64 61 74 61 5f 78 78 78 20 2a 2f  from data_xxx */
11dd0 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63  .      if( p->rc
11de0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
11df0 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
11e00 72 20 2a 7a 52 62 75 52 6f 77 69 64 20 3d 20 22  r *zRbuRowid = "
11e10 22 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 62  ";.        if( b
11e20 52 62 75 52 6f 77 69 64 20 29 7b 0a 20 20 20 20  RbuRowid ){.    
11e30 20 20 20 20 20 20 7a 52 62 75 52 6f 77 69 64 20        zRbuRowid 
11e40 3d 20 72 62 75 49 73 56 61 63 75 75 6d 28 70 29  = rbuIsVacuum(p)
11e50 20 3f 20 22 2c 5f 72 6f 77 69 64 5f 20 22 20 3a   ? ",_rowid_ " :
11e60 20 22 2c 72 62 75 5f 72 6f 77 69 64 22 3b 0a 20   ",rbu_rowid";. 
11e70 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
11e80 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65   p->rc = prepare
11e90 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72  FreeAndCollectEr
11ea0 72 6f 72 28 70 2d 3e 64 62 52 62 75 2c 20 26 70  ror(p->dbRbu, &p
11eb0 49 74 65 72 2d 3e 70 53 65 6c 65 63 74 2c 20 70  Iter->pSelect, p
11ec0 7a 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  z,.            s
11ed0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a  qlite3_mprintf(.
11ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 53                "S
11ef0 45 4c 45 43 54 20 25 73 2c 25 73 20 72 62 75 5f  ELECT %s,%s rbu_
11f00 63 6f 6e 74 72 6f 6c 25 73 20 46 52 4f 4d 20 27  control%s FROM '
11f10 25 71 27 25 73 22 2c 20 0a 20 20 20 20 20 20 20  %q'%s", .       
11f20 20 20 20 20 20 20 20 7a 43 6f 6c 6c 69 73 74 2c         zCollist,
11f30 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
11f40 28 72 62 75 49 73 56 61 63 75 75 6d 28 70 29 20  (rbuIsVacuum(p) 
11f50 3f 20 22 30 20 41 53 20 22 20 3a 20 22 22 29 2c  ? "0 AS " : ""),
11f60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  .              z
11f70 52 62 75 52 6f 77 69 64 2c 0a 20 20 20 20 20 20  RbuRowid,.      
11f80 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 7a          pIter->z
11f90 44 61 74 61 54 62 6c 2c 20 7a 4c 69 6d 69 74 0a  DataTbl, zLimit.
11fa0 20 20 20 20 20 20 20 20 20 20 20 20 29 0a 20 20              ).  
11fb0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d        );.      }
11fc0 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ..      sqlite3_
11fd0 66 72 65 65 28 7a 57 68 65 72 65 29 3b 0a 20 20  free(zWhere);.  
11fe0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
11ff0 28 7a 4f 6c 64 6c 69 73 74 29 3b 0a 20 20 20 20  (zOldlist);.    
12000 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
12010 4e 65 77 6c 69 73 74 29 3b 0a 20 20 20 20 20 20  Newlist);.      
12020 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 69  sqlite3_free(zBi
12030 6e 64 69 6e 67 73 29 3b 0a 20 20 20 20 7d 0a 20  ndings);.    }. 
12040 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
12050 7a 43 6f 6c 6c 69 73 74 29 3b 0a 20 20 20 20 73  zCollist);.    s
12060 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4c 69 6d  qlite3_free(zLim
12070 69 74 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 72 65  it);.  }.  .  re
12080 74 75 72 6e 20 70 2d 3e 72 63 3b 0a 7d 0a 0a 2f  turn p->rc;.}../
12090 2a 0a 2a 2a 20 53 65 74 20 6f 75 74 70 75 74 20  *.** Set output 
120a0 76 61 72 69 61 62 6c 65 20 2a 70 70 53 74 6d 74  variable *ppStmt
120b0 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20   to point to an 
120c0 55 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74  UPDATE statement
120d0 20 74 68 61 74 20 6d 61 79 0a 2a 2a 20 62 65 20   that may.** be 
120e0 75 73 65 64 20 74 6f 20 75 70 64 61 74 65 20 74  used to update t
120f0 68 65 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c  he imposter tabl
12100 65 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 74  e for the main t
12110 61 62 6c 65 20 62 2d 74 72 65 65 20 6f 66 20 74  able b-tree of t
12120 68 65 0a 2a 2a 20 74 61 62 6c 65 20 6f 62 6a 65  he.** table obje
12130 63 74 20 74 68 61 74 20 70 49 74 65 72 20 63 75  ct that pIter cu
12140 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74  rrently points t
12150 6f 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74  o, assuming that
12160 20 74 68 65 20 0a 2a 2a 20 72 62 75 5f 63 6f 6e   the .** rbu_con
12170 74 72 6f 6c 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  trol column of t
12180 68 65 20 64 61 74 61 5f 78 79 7a 20 74 61 62 6c  he data_xyz tabl
12190 65 20 63 6f 6e 74 61 69 6e 73 20 7a 4d 61 73 6b  e contains zMask
121a0 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20  ..** .** If the 
121b0 7a 4d 61 73 6b 20 73 74 72 69 6e 67 20 64 6f 65  zMask string doe
121c0 73 20 6e 6f 74 20 73 70 65 63 69 66 79 20 61 6e  s not specify an
121d0 79 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 75 70 64  y columns to upd
121e0 61 74 65 2c 20 74 68 65 6e 20 74 68 69 73 0a 2a  ate, then this.*
121f0 2a 20 69 73 20 6e 6f 74 20 61 6e 20 65 72 72 6f  * is not an erro
12200 72 2e 20 4f 75 74 70 75 74 20 76 61 72 69 61 62  r. Output variab
12210 6c 65 20 2a 70 70 53 74 6d 74 20 69 73 20 73 65  le *ppStmt is se
12220 74 20 74 6f 20 4e 55 4c 4c 20 69 6e 20 74 68 69  t to NULL in thi
12230 73 20 63 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  s case..*/.stati
12240 63 20 69 6e 74 20 72 62 75 47 65 74 55 70 64 61  c int rbuGetUpda
12250 74 65 53 74 6d 74 28 0a 20 20 73 71 6c 69 74 65  teStmt(.  sqlite
12260 33 72 62 75 20 2a 70 2c 20 20 20 20 20 20 20 20  3rbu *p,        
12270 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 42 55            /* RBU
12280 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 52 62 75   handle */.  Rbu
12290 4f 62 6a 49 74 65 72 20 2a 70 49 74 65 72 2c 20  ObjIter *pIter, 
122a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
122b0 4f 62 6a 65 63 74 20 69 74 65 72 61 74 6f 72 20  Object iterator 
122c0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
122d0 2a 7a 4d 61 73 6b 2c 20 20 20 20 20 20 20 20 20  *zMask,         
122e0 20 20 20 20 20 2f 2a 20 72 62 75 5f 63 6f 6e 74       /* rbu_cont
122f0 72 6f 6c 20 76 61 6c 75 65 20 28 27 78 2e 78 2e  rol value ('x.x.
12300 27 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ') */.  sqlite3_
12310 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 20 20 20  stmt **ppStmt   
12320 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
12330 55 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74  UPDATE statement
12340 20 68 61 6e 64 6c 65 20 2a 2f 0a 29 7b 0a 20 20   handle */.){.  
12350 52 62 75 55 70 64 61 74 65 53 74 6d 74 20 2a 2a  RbuUpdateStmt **
12360 70 70 3b 0a 20 20 52 62 75 55 70 64 61 74 65 53  pp;.  RbuUpdateS
12370 74 6d 74 20 2a 70 55 70 20 3d 20 30 3b 0a 20 20  tmt *pUp = 0;.  
12380 69 6e 74 20 6e 55 70 20 3d 20 30 3b 0a 0a 20 20  int nUp = 0;..  
12390 2f 2a 20 49 6e 20 63 61 73 65 20 61 6e 20 65 72  /* In case an er
123a0 72 6f 72 20 6f 63 63 75 72 73 20 2a 2f 0a 20 20  ror occurs */.  
123b0 2a 70 70 53 74 6d 74 20 3d 20 30 3b 0a 0a 20 20  *ppStmt = 0;..  
123c0 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 6e  /* Search for an
123d0 20 65 78 69 73 74 69 6e 67 20 73 74 61 74 65 6d   existing statem
123e0 65 6e 74 2e 20 49 66 20 6f 6e 65 20 69 73 20 66  ent. If one is f
123f0 6f 75 6e 64 2c 20 73 68 69 66 74 20 69 74 20 74  ound, shift it t
12400 6f 20 74 68 65 20 66 72 6f 6e 74 0a 20 20 2a 2a  o the front.  **
12410 20 6f 66 20 74 68 65 20 4c 52 55 20 71 75 65 75   of the LRU queu
12420 65 20 61 6e 64 20 72 65 74 75 72 6e 20 69 6d 6d  e and return imm
12430 65 64 69 61 74 65 6c 79 2e 20 4f 74 68 65 72 77  ediately. Otherw
12440 69 73 65 2c 20 6c 65 61 76 65 20 6e 55 70 20 70  ise, leave nUp p
12450 6f 69 6e 74 69 6e 67 0a 20 20 2a 2a 20 74 6f 20  ointing.  ** to 
12460 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 74  the number of st
12470 61 74 65 6d 65 6e 74 73 20 63 75 72 72 65 6e 74  atements current
12480 6c 79 20 69 6e 20 74 68 65 20 63 61 63 68 65 20  ly in the cache 
12490 61 6e 64 20 70 55 70 20 74 6f 20 74 68 65 0a 20  and pUp to the. 
124a0 20 2a 2a 20 6c 61 73 74 20 6f 62 6a 65 63 74 20   ** last object 
124b0 69 6e 20 74 68 65 20 6c 69 73 74 2e 20 20 2a 2f  in the list.  */
124c0 0a 20 20 66 6f 72 28 70 70 3d 26 70 49 74 65 72  .  for(pp=&pIter
124d0 2d 3e 70 52 62 75 55 70 64 61 74 65 3b 20 2a 70  ->pRbuUpdate; *p
124e0 70 3b 20 70 70 3d 26 28 28 2a 70 70 29 2d 3e 70  p; pp=&((*pp)->p
124f0 4e 65 78 74 29 29 7b 0a 20 20 20 20 70 55 70 20  Next)){.    pUp 
12500 3d 20 2a 70 70 3b 0a 20 20 20 20 69 66 28 20 73  = *pp;.    if( s
12510 74 72 63 6d 70 28 70 55 70 2d 3e 7a 4d 61 73 6b  trcmp(pUp->zMask
12520 2c 20 7a 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20  , zMask)==0 ){. 
12530 20 20 20 20 20 2a 70 70 20 3d 20 70 55 70 2d 3e       *pp = pUp->
12540 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 70 55 70  pNext;.      pUp
12550 2d 3e 70 4e 65 78 74 20 3d 20 70 49 74 65 72 2d  ->pNext = pIter-
12560 3e 70 52 62 75 55 70 64 61 74 65 3b 0a 20 20 20  >pRbuUpdate;.   
12570 20 20 20 70 49 74 65 72 2d 3e 70 52 62 75 55 70     pIter->pRbuUp
12580 64 61 74 65 20 3d 20 70 55 70 3b 0a 20 20 20 20  date = pUp;.    
12590 20 20 2a 70 70 53 74 6d 74 20 3d 20 70 55 70 2d    *ppStmt = pUp-
125a0 3e 70 55 70 64 61 74 65 3b 20 0a 20 20 20 20 20  >pUpdate; .     
125b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
125c0 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 55 70  K;.    }.    nUp
125d0 2b 2b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ++;.  }.  assert
125e0 28 20 70 55 70 3d 3d 30 20 7c 7c 20 70 55 70 2d  ( pUp==0 || pUp-
125f0 3e 70 4e 65 78 74 3d 3d 30 20 29 3b 0a 0a 20 20  >pNext==0 );..  
12600 69 66 28 20 6e 55 70 3e 3d 53 51 4c 49 54 45 5f  if( nUp>=SQLITE_
12610 52 42 55 5f 55 50 44 41 54 45 5f 43 41 43 48 45  RBU_UPDATE_CACHE
12620 53 49 5a 45 20 29 7b 0a 20 20 20 20 66 6f 72 28  SIZE ){.    for(
12630 70 70 3d 26 70 49 74 65 72 2d 3e 70 52 62 75 55  pp=&pIter->pRbuU
12640 70 64 61 74 65 3b 20 2a 70 70 21 3d 70 55 70 3b  pdate; *pp!=pUp;
12650 20 70 70 3d 26 28 28 2a 70 70 29 2d 3e 70 4e 65   pp=&((*pp)->pNe
12660 78 74 29 29 3b 0a 20 20 20 20 2a 70 70 20 3d 20  xt));.    *pp = 
12670 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  0;.    sqlite3_f
12680 69 6e 61 6c 69 7a 65 28 70 55 70 2d 3e 70 55 70  inalize(pUp->pUp
12690 64 61 74 65 29 3b 0a 20 20 20 20 70 55 70 2d 3e  date);.    pUp->
126a0 70 55 70 64 61 74 65 20 3d 20 30 3b 0a 20 20 7d  pUpdate = 0;.  }
126b0 65 6c 73 65 7b 0a 20 20 20 20 70 55 70 20 3d 20  else{.    pUp = 
126c0 28 52 62 75 55 70 64 61 74 65 53 74 6d 74 2a 29  (RbuUpdateStmt*)
126d0 72 62 75 4d 61 6c 6c 6f 63 28 70 2c 20 73 69 7a  rbuMalloc(p, siz
126e0 65 6f 66 28 52 62 75 55 70 64 61 74 65 53 74 6d  eof(RbuUpdateStm
126f0 74 29 2b 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f  t)+pIter->nTblCo
12700 6c 2b 31 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  l+1);.  }..  if(
12710 20 70 55 70 20 29 7b 0a 20 20 20 20 63 68 61 72   pUp ){.    char
12720 20 2a 7a 57 68 65 72 65 20 3d 20 72 62 75 4f 62   *zWhere = rbuOb
12730 6a 49 74 65 72 47 65 74 57 68 65 72 65 28 70 2c  jIterGetWhere(p,
12740 20 70 49 74 65 72 29 3b 0a 20 20 20 20 63 68 61   pIter);.    cha
12750 72 20 2a 7a 53 65 74 20 3d 20 72 62 75 4f 62 6a  r *zSet = rbuObj
12760 49 74 65 72 47 65 74 53 65 74 6c 69 73 74 28 70  IterGetSetlist(p
12770 2c 20 70 49 74 65 72 2c 20 7a 4d 61 73 6b 29 3b  , pIter, zMask);
12780 0a 20 20 20 20 63 68 61 72 20 2a 7a 55 70 64 61  .    char *zUpda
12790 74 65 20 3d 20 30 3b 0a 0a 20 20 20 20 70 55 70  te = 0;..    pUp
127a0 2d 3e 7a 4d 61 73 6b 20 3d 20 28 63 68 61 72 2a  ->zMask = (char*
127b0 29 26 70 55 70 5b 31 5d 3b 0a 20 20 20 20 6d 65  )&pUp[1];.    me
127c0 6d 63 70 79 28 70 55 70 2d 3e 7a 4d 61 73 6b 2c  mcpy(pUp->zMask,
127d0 20 7a 4d 61 73 6b 2c 20 70 49 74 65 72 2d 3e 6e   zMask, pIter->n
127e0 54 62 6c 43 6f 6c 29 3b 0a 20 20 20 20 70 55 70  TblCol);.    pUp
127f0 2d 3e 70 4e 65 78 74 20 3d 20 70 49 74 65 72 2d  ->pNext = pIter-
12800 3e 70 52 62 75 55 70 64 61 74 65 3b 0a 20 20 20  >pRbuUpdate;.   
12810 20 70 49 74 65 72 2d 3e 70 52 62 75 55 70 64 61   pIter->pRbuUpda
12820 74 65 20 3d 20 70 55 70 3b 0a 0a 20 20 20 20 69  te = pUp;..    i
12830 66 28 20 7a 53 65 74 20 29 7b 0a 20 20 20 20 20  f( zSet ){.     
12840 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 72   const char *zPr
12850 65 66 69 78 20 3d 20 22 22 3b 0a 0a 20 20 20 20  efix = "";..    
12860 20 20 69 66 28 20 70 49 74 65 72 2d 3e 65 54 79    if( pIter->eTy
12870 70 65 21 3d 52 42 55 5f 50 4b 5f 56 54 41 42 20  pe!=RBU_PK_VTAB 
12880 29 20 7a 50 72 65 66 69 78 20 3d 20 22 72 62 75  ) zPrefix = "rbu
12890 5f 69 6d 70 5f 22 3b 0a 20 20 20 20 20 20 7a 55  _imp_";.      zU
128a0 70 64 61 74 65 20 3d 20 73 71 6c 69 74 65 33 5f  pdate = sqlite3_
128b0 6d 70 72 69 6e 74 66 28 22 55 50 44 41 54 45 20  mprintf("UPDATE 
128c0 5c 22 25 73 25 77 5c 22 20 53 45 54 20 25 73 20  \"%s%w\" SET %s 
128d0 57 48 45 52 45 20 25 73 22 2c 20 0a 20 20 20 20  WHERE %s", .    
128e0 20 20 20 20 20 20 7a 50 72 65 66 69 78 2c 20 70        zPrefix, p
128f0 49 74 65 72 2d 3e 7a 54 62 6c 2c 20 7a 53 65 74  Iter->zTbl, zSet
12900 2c 20 7a 57 68 65 72 65 0a 20 20 20 20 20 20 29  , zWhere.      )
12910 3b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20  ;.      p->rc = 
12920 70 72 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f  prepareFreeAndCo
12930 6c 6c 65 63 74 45 72 72 6f 72 28 0a 20 20 20 20  llectError(.    
12940 20 20 20 20 20 20 70 2d 3e 64 62 4d 61 69 6e 2c        p->dbMain,
12950 20 26 70 55 70 2d 3e 70 55 70 64 61 74 65 2c 20   &pUp->pUpdate, 
12960 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 20 7a 55 70  &p->zErrmsg, zUp
12970 64 61 74 65 0a 20 20 20 20 20 20 29 3b 0a 20 20  date.      );.  
12980 20 20 20 20 2a 70 70 53 74 6d 74 20 3d 20 70 55      *ppStmt = pU
12990 70 2d 3e 70 55 70 64 61 74 65 3b 0a 20 20 20 20  p->pUpdate;.    
129a0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  }.    sqlite3_fr
129b0 65 65 28 7a 57 68 65 72 65 29 3b 0a 20 20 20 20  ee(zWhere);.    
129c0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 65  sqlite3_free(zSe
129d0 74 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  t);.  }..  retur
129e0 6e 20 70 2d 3e 72 63 3b 0a 7d 0a 0a 73 74 61 74  n p->rc;.}..stat
129f0 69 63 20 73 71 6c 69 74 65 33 20 2a 72 62 75 4f  ic sqlite3 *rbuO
12a00 70 65 6e 44 62 68 61 6e 64 6c 65 28 0a 20 20 73  penDbhandle(.  s
12a10 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 0a 20  qlite3rbu *p, . 
12a20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
12a30 6d 65 2c 20 0a 20 20 69 6e 74 20 62 55 73 65 56  me, .  int bUseV
12a40 66 73 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  fs.){.  sqlite3 
12a50 2a 64 62 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  *db = 0;.  if( p
12a60 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
12a70 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  ){.    const int
12a80 20 66 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f   flags = SQLITE_
12a90 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53  OPEN_READWRITE|S
12aa0 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
12ab0 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52  E|SQLITE_OPEN_UR
12ac0 49 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73  I;.    p->rc = s
12ad0 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 7a  qlite3_open_v2(z
12ae0 4e 61 6d 65 2c 20 26 64 62 2c 20 66 6c 61 67 73  Name, &db, flags
12af0 2c 20 62 55 73 65 56 66 73 20 3f 20 70 2d 3e 7a  , bUseVfs ? p->z
12b00 56 66 73 4e 61 6d 65 20 3a 20 30 29 3b 0a 20 20  VfsName : 0);.  
12b10 20 20 69 66 28 20 70 2d 3e 72 63 20 29 7b 0a 20    if( p->rc ){. 
12b20 20 20 20 20 20 70 2d 3e 7a 45 72 72 6d 73 67 20       p->zErrmsg 
12b30 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
12b40 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f  f("%s", sqlite3_
12b50 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 20  errmsg(db));.   
12b60 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65     sqlite3_close
12b70 28 64 62 29 3b 0a 20 20 20 20 20 20 64 62 20 3d  (db);.      db =
12b80 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
12b90 72 65 74 75 72 6e 20 64 62 3b 0a 7d 0a 0a 2f 2a  return db;.}../*
12ba0 0a 2a 2a 20 46 72 65 65 20 61 6e 20 52 62 75 53  .** Free an RbuS
12bb0 74 61 74 65 20 6f 62 6a 65 63 74 20 61 6c 6c 6f  tate object allo
12bc0 63 61 74 65 64 20 62 79 20 72 62 75 4c 6f 61 64  cated by rbuLoad
12bd0 53 74 61 74 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  State()..*/.stat
12be0 69 63 20 76 6f 69 64 20 72 62 75 46 72 65 65 53  ic void rbuFreeS
12bf0 74 61 74 65 28 52 62 75 53 74 61 74 65 20 2a 70  tate(RbuState *p
12c00 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
12c10 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
12c20 2d 3e 7a 54 62 6c 29 3b 0a 20 20 20 20 73 71 6c  ->zTbl);.    sql
12c30 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 44 61  ite3_free(p->zDa
12c40 74 61 54 62 6c 29 3b 0a 20 20 20 20 73 71 6c 69  taTbl);.    sqli
12c50 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 49 64 78  te3_free(p->zIdx
12c60 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
12c70 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ree(p);.  }.}../
12c80 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e  *.** Allocate an
12c90 20 52 62 75 53 74 61 74 65 20 6f 62 6a 65 63 74   RbuState object
12ca0 20 61 6e 64 20 6c 6f 61 64 20 74 68 65 20 63 6f   and load the co
12cb0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 72 62  ntents of the rb
12cc0 75 5f 73 74 61 74 65 20 0a 2a 2a 20 74 61 62 6c  u_state .** tabl
12cd0 65 20 69 6e 74 6f 20 69 74 2e 20 52 65 74 75 72  e into it. Retur
12ce0 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
12cf0 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 2e 20 49  he new object. I
12d00 74 20 69 73 20 74 68 65 20 0a 2a 2a 20 72 65 73  t is the .** res
12d10 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
12d20 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65  he caller to eve
12d30 6e 74 75 61 6c 6c 79 20 66 72 65 65 20 74 68 65  ntually free the
12d40 20 6f 62 6a 65 63 74 20 75 73 69 6e 67 0a 2a 2a   object using.**
12d50 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e   sqlite3_free().
12d60 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
12d70 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65  or occurs, leave
12d80 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 61   an error code a
12d90 6e 64 20 6d 65 73 73 61 67 65 20 69 6e 20 74 68  nd message in th
12da0 65 20 72 62 75 20 68 61 6e 64 6c 65 0a 2a 2a 20  e rbu handle.** 
12db0 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  and return NULL.
12dc0 0a 2a 2f 0a 73 74 61 74 69 63 20 52 62 75 53 74  .*/.static RbuSt
12dd0 61 74 65 20 2a 72 62 75 4c 6f 61 64 53 74 61 74  ate *rbuLoadStat
12de0 65 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 29  e(sqlite3rbu *p)
12df0 7b 0a 20 20 52 62 75 53 74 61 74 65 20 2a 70 52  {.  RbuState *pR
12e00 65 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  et = 0;.  sqlite
12e10 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
12e20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  0;.  int rc;.  i
12e30 6e 74 20 72 63 32 3b 0a 0a 20 20 70 52 65 74 20  nt rc2;..  pRet 
12e40 3d 20 28 52 62 75 53 74 61 74 65 2a 29 72 62 75  = (RbuState*)rbu
12e50 4d 61 6c 6c 6f 63 28 70 2c 20 73 69 7a 65 6f 66  Malloc(p, sizeof
12e60 28 52 62 75 53 74 61 74 65 29 29 3b 0a 20 20 69  (RbuState));.  i
12e70 66 28 20 70 52 65 74 3d 3d 30 20 29 20 72 65 74  f( pRet==0 ) ret
12e80 75 72 6e 20 30 3b 0a 0a 20 20 72 63 20 3d 20 70  urn 0;..  rc = p
12e90 72 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f 6c  repareFreeAndCol
12ea0 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 52  lectError(p->dbR
12eb0 62 75 2c 20 26 70 53 74 6d 74 2c 20 26 70 2d 3e  bu, &pStmt, &p->
12ec0 7a 45 72 72 6d 73 67 2c 20 0a 20 20 20 20 20 20  zErrmsg, .      
12ed0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
12ee0 22 53 45 4c 45 43 54 20 6b 2c 20 76 20 46 52 4f  "SELECT k, v FRO
12ef0 4d 20 25 73 2e 72 62 75 5f 73 74 61 74 65 22 2c  M %s.rbu_state",
12f00 20 70 2d 3e 7a 53 74 61 74 65 44 62 29 0a 20 20   p->zStateDb).  
12f10 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  );.  while( rc==
12f20 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c  SQLITE_OK && SQL
12f30 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
12f40 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a  _step(pStmt) ){.
12f50 20 20 20 20 73 77 69 74 63 68 28 20 73 71 6c 69      switch( sqli
12f60 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
12f70 53 74 6d 74 2c 20 30 29 20 29 7b 0a 20 20 20 20  Stmt, 0) ){.    
12f80 20 20 63 61 73 65 20 52 42 55 5f 53 54 41 54 45    case RBU_STATE
12f90 5f 53 54 41 47 45 3a 0a 20 20 20 20 20 20 20 20  _STAGE:.        
12fa0 70 52 65 74 2d 3e 65 53 74 61 67 65 20 3d 20 73  pRet->eStage = s
12fb0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
12fc0 74 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20  t(pStmt, 1);.   
12fd0 20 20 20 20 20 69 66 28 20 70 52 65 74 2d 3e 65       if( pRet->e
12fe0 53 74 61 67 65 21 3d 52 42 55 5f 53 54 41 47 45  Stage!=RBU_STAGE
12ff0 5f 4f 41 4c 0a 20 20 20 20 20 20 20 20 20 26 26  _OAL.         &&
13000 20 70 52 65 74 2d 3e 65 53 74 61 67 65 21 3d 52   pRet->eStage!=R
13010 42 55 5f 53 54 41 47 45 5f 4d 4f 56 45 0a 20 20  BU_STAGE_MOVE.  
13020 20 20 20 20 20 20 20 26 26 20 70 52 65 74 2d 3e         && pRet->
13030 65 53 74 61 67 65 21 3d 52 42 55 5f 53 54 41 47  eStage!=RBU_STAG
13040 45 5f 43 4b 50 54 0a 20 20 20 20 20 20 20 20 29  E_CKPT.        )
13050 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72  {.          p->r
13060 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
13070 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  PT;.        }.  
13080 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
13090 20 20 20 20 63 61 73 65 20 52 42 55 5f 53 54 41      case RBU_STA
130a0 54 45 5f 54 42 4c 3a 0a 20 20 20 20 20 20 20 20  TE_TBL:.        
130b0 70 52 65 74 2d 3e 7a 54 62 6c 20 3d 20 72 62 75  pRet->zTbl = rbu
130c0 53 74 72 6e 64 75 70 28 28 63 68 61 72 2a 29 73  Strndup((char*)s
130d0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
130e0 78 74 28 70 53 74 6d 74 2c 20 31 29 2c 20 26 72  xt(pStmt, 1), &r
130f0 63 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  c);.        brea
13100 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20 52  k;..      case R
13110 42 55 5f 53 54 41 54 45 5f 49 44 58 3a 0a 20 20  BU_STATE_IDX:.  
13120 20 20 20 20 20 20 70 52 65 74 2d 3e 7a 49 64 78        pRet->zIdx
13130 20 3d 20 72 62 75 53 74 72 6e 64 75 70 28 28 63   = rbuStrndup((c
13140 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
13150 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  umn_text(pStmt, 
13160 31 29 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20  1), &rc);.      
13170 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20    break;..      
13180 63 61 73 65 20 52 42 55 5f 53 54 41 54 45 5f 52  case RBU_STATE_R
13190 4f 57 3a 0a 20 20 20 20 20 20 20 20 70 52 65 74  OW:.        pRet
131a0 2d 3e 6e 52 6f 77 20 3d 20 73 71 6c 69 74 65 33  ->nRow = sqlite3
131b0 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d  _column_int(pStm
131c0 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 62  t, 1);.        b
131d0 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73  reak;..      cas
131e0 65 20 52 42 55 5f 53 54 41 54 45 5f 50 52 4f 47  e RBU_STATE_PROG
131f0 52 45 53 53 3a 0a 20 20 20 20 20 20 20 20 70 52  RESS:.        pR
13200 65 74 2d 3e 6e 50 72 6f 67 72 65 73 73 20 3d 20  et->nProgress = 
13210 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
13220 6e 74 36 34 28 70 53 74 6d 74 2c 20 31 29 3b 0a  nt64(pStmt, 1);.
13230 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a          break;..
13240 20 20 20 20 20 20 63 61 73 65 20 52 42 55 5f 53        case RBU_S
13250 54 41 54 45 5f 43 4b 50 54 3a 0a 20 20 20 20 20  TATE_CKPT:.     
13260 20 20 20 70 52 65 74 2d 3e 69 57 61 6c 43 6b 73     pRet->iWalCks
13270 75 6d 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  um = sqlite3_col
13280 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c  umn_int64(pStmt,
13290 20 31 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65   1);.        bre
132a0 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20  ak;..      case 
132b0 52 42 55 5f 53 54 41 54 45 5f 43 4f 4f 4b 49 45  RBU_STATE_COOKIE
132c0 3a 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e  :.        pRet->
132d0 69 43 6f 6f 6b 69 65 20 3d 20 28 75 33 32 29 73  iCookie = (u32)s
132e0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
132f0 74 36 34 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20  t64(pStmt, 1);. 
13300 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20         break;.. 
13310 20 20 20 20 20 63 61 73 65 20 52 42 55 5f 53 54       case RBU_ST
13320 41 54 45 5f 4f 41 4c 53 5a 3a 0a 20 20 20 20 20  ATE_OALSZ:.     
13330 20 20 20 70 52 65 74 2d 3e 69 4f 61 6c 53 7a 20     pRet->iOalSz 
13340 3d 20 28 75 33 32 29 73 71 6c 69 74 65 33 5f 63  = (u32)sqlite3_c
13350 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d  olumn_int64(pStm
13360 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 62  t, 1);.        b
13370 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73  reak;..      cas
13380 65 20 52 42 55 5f 53 54 41 54 45 5f 50 48 41 53  e RBU_STATE_PHAS
13390 45 4f 4e 45 53 54 45 50 3a 0a 20 20 20 20 20 20  EONESTEP:.      
133a0 20 20 70 52 65 74 2d 3e 6e 50 68 61 73 65 4f 6e    pRet->nPhaseOn
133b0 65 53 74 65 70 20 3d 20 73 71 6c 69 74 65 33 5f  eStep = sqlite3_
133c0 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74  column_int64(pSt
133d0 6d 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  mt, 1);.        
133e0 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61  break;..      ca
133f0 73 65 20 52 42 55 5f 53 54 41 54 45 5f 44 41 54  se RBU_STATE_DAT
13400 41 54 42 4c 3a 0a 20 20 20 20 20 20 20 20 70 52  ATBL:.        pR
13410 65 74 2d 3e 7a 44 61 74 61 54 62 6c 20 3d 20 72  et->zDataTbl = r
13420 62 75 53 74 72 6e 64 75 70 28 28 63 68 61 72 2a  buStrndup((char*
13430 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
13440 74 65 78 74 28 70 53 74 6d 74 2c 20 31 29 2c 20  text(pStmt, 1), 
13450 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20 62 72  &rc);.        br
13460 65 61 6b 3b 0a 0a 20 20 20 20 20 20 64 65 66 61  eak;..      defa
13470 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 72 63 20  ult:.        rc 
13480 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
13490 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
134a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 63 32  .    }.  }.  rc2
134b0 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c   = sqlite3_final
134c0 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 69 66  ize(pStmt);.  if
134d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
134e0 29 20 72 63 20 3d 20 72 63 32 3b 0a 0a 20 20 70  ) rc = rc2;..  p
134f0 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 72 65 74  ->rc = rc;.  ret
13500 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 0a 2f 2a  urn pRet;.}.../*
13510 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 64 61 74  .** Open the dat
13520 61 62 61 73 65 20 68 61 6e 64 6c 65 20 61 6e 64  abase handle and
13530 20 61 74 74 61 63 68 20 74 68 65 20 52 42 55 20   attach the RBU 
13540 64 61 74 61 62 61 73 65 20 61 73 20 22 72 62 75  database as "rbu
13550 22 2e 20 49 66 20 61 6e 0a 2a 2a 20 65 72 72 6f  ". If an.** erro
13560 72 20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65 20  r occurs, leave 
13570 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e  an error code an
13580 64 20 6d 65 73 73 61 67 65 20 69 6e 20 74 68 65  d message in the
13590 20 52 42 55 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a   RBU handle..*/.
135a0 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75 4f  static void rbuO
135b0 70 65 6e 44 61 74 61 62 61 73 65 28 73 71 6c 69  penDatabase(sqli
135c0 74 65 33 72 62 75 20 2a 70 2c 20 69 6e 74 20 2a  te3rbu *p, int *
135d0 70 62 52 65 74 72 79 29 7b 0a 20 20 61 73 73 65  pbRetry){.  asse
135e0 72 74 28 20 70 2d 3e 72 63 20 7c 7c 20 28 70 2d  rt( p->rc || (p-
135f0 3e 64 62 4d 61 69 6e 3d 3d 30 20 26 26 20 70 2d  >dbMain==0 && p-
13600 3e 64 62 52 62 75 3d 3d 30 29 20 29 3b 0a 20 20  >dbRbu==0) );.  
13610 61 73 73 65 72 74 28 20 70 2d 3e 72 63 20 7c 7c  assert( p->rc ||
13620 20 72 62 75 49 73 56 61 63 75 75 6d 28 70 29 20   rbuIsVacuum(p) 
13630 7c 7c 20 70 2d 3e 7a 54 61 72 67 65 74 21 3d 30  || p->zTarget!=0
13640 20 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74   );..  /* Open t
13650 68 65 20 52 42 55 20 64 61 74 61 62 61 73 65 20  he RBU database 
13660 2a 2f 0a 20 20 70 2d 3e 64 62 52 62 75 20 3d 20  */.  p->dbRbu = 
13670 72 62 75 4f 70 65 6e 44 62 68 61 6e 64 6c 65 28  rbuOpenDbhandle(
13680 70 2c 20 70 2d 3e 7a 52 62 75 2c 20 31 29 3b 0a  p, p->zRbu, 1);.
13690 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
136a0 4c 49 54 45 5f 4f 4b 20 26 26 20 72 62 75 49 73  LITE_OK && rbuIs
136b0 56 61 63 75 75 6d 28 70 29 20 29 7b 0a 20 20 20  Vacuum(p) ){.   
136c0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
136d0 6e 74 72 6f 6c 28 70 2d 3e 64 62 52 62 75 2c 20  ntrol(p->dbRbu, 
136e0 22 6d 61 69 6e 22 2c 20 53 51 4c 49 54 45 5f 46  "main", SQLITE_F
136f0 43 4e 54 4c 5f 52 42 55 43 4e 54 2c 20 28 76 6f  CNTL_RBUCNT, (vo
13700 69 64 2a 29 70 29 3b 0a 20 20 20 20 69 66 28 20  id*)p);.    if( 
13710 70 2d 3e 7a 53 74 61 74 65 3d 3d 30 20 29 7b 0a  p->zState==0 ){.
13720 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
13730 20 2a 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65   *zFile = sqlite
13740 33 5f 64 62 5f 66 69 6c 65 6e 61 6d 65 28 70 2d  3_db_filename(p-
13750 3e 64 62 52 62 75 2c 20 22 6d 61 69 6e 22 29 3b  >dbRbu, "main");
13760 0a 20 20 20 20 20 20 70 2d 3e 7a 53 74 61 74 65  .      p->zState
13770 20 3d 20 72 62 75 4d 50 72 69 6e 74 66 28 70 2c   = rbuMPrintf(p,
13780 20 22 66 69 6c 65 3a 2f 2f 25 73 2d 76 61 63 75   "file://%s-vacu
13790 75 6d 3f 6d 6f 64 65 6f 66 3d 25 73 22 2c 20 7a  um?modeof=%s", z
137a0 46 69 6c 65 2c 20 7a 46 69 6c 65 29 3b 0a 20 20  File, zFile);.  
137b0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
137c0 20 75 73 69 6e 67 20 73 65 70 61 72 61 74 65 20   using separate 
137d0 52 42 55 20 61 6e 64 20 73 74 61 74 65 20 64 61  RBU and state da
137e0 74 61 62 61 73 65 73 2c 20 61 74 74 61 63 68 20  tabases, attach 
137f0 74 68 65 20 73 74 61 74 65 20 64 61 74 61 62 61  the state databa
13800 73 65 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 52  se to.  ** the R
13810 42 55 20 64 62 20 68 61 6e 64 6c 65 20 6e 6f 77  BU db handle now
13820 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 7a  .  */.  if( p->z
13830 53 74 61 74 65 20 29 7b 0a 20 20 20 20 72 62 75  State ){.    rbu
13840 4d 50 72 69 6e 74 66 45 78 65 63 28 70 2c 20 70  MPrintfExec(p, p
13850 2d 3e 64 62 52 62 75 2c 20 22 41 54 54 41 43 48  ->dbRbu, "ATTACH
13860 20 25 51 20 41 53 20 73 74 61 74 22 2c 20 70 2d   %Q AS stat", p-
13870 3e 7a 53 74 61 74 65 29 3b 0a 20 20 20 20 6d 65  >zState);.    me
13880 6d 63 70 79 28 70 2d 3e 7a 53 74 61 74 65 44 62  mcpy(p->zStateDb
13890 2c 20 22 73 74 61 74 22 2c 20 34 29 3b 0a 20 20  , "stat", 4);.  
138a0 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 63 70  }else{.    memcp
138b0 79 28 70 2d 3e 7a 53 74 61 74 65 44 62 2c 20 22  y(p->zStateDb, "
138c0 6d 61 69 6e 22 2c 20 34 29 3b 0a 20 20 7d 0a 0a  main", 4);.  }..
138d0 23 69 66 20 30 0a 20 20 69 66 28 20 70 2d 3e 72  #if 0.  if( p->r
138e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
138f0 72 62 75 49 73 56 61 63 75 75 6d 28 70 29 20 29  rbuIsVacuum(p) )
13900 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71  {.    p->rc = sq
13910 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62  lite3_exec(p->db
13920 52 62 75 2c 20 22 42 45 47 49 4e 22 2c 20 30 2c  Rbu, "BEGIN", 0,
13930 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64   0, 0);.  }.#end
13940 69 66 0a 0a 20 20 2f 2a 20 49 66 20 69 74 20 68  if..  /* If it h
13950 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 62  as not already b
13960 65 65 6e 20 63 72 65 61 74 65 64 2c 20 63 72 65  een created, cre
13970 61 74 65 20 74 68 65 20 72 62 75 5f 73 74 61 74  ate the rbu_stat
13980 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 72 62 75  e table */.  rbu
13990 4d 50 72 69 6e 74 66 45 78 65 63 28 70 2c 20 70  MPrintfExec(p, p
139a0 2d 3e 64 62 52 62 75 2c 20 52 42 55 5f 43 52 45  ->dbRbu, RBU_CRE
139b0 41 54 45 5f 53 54 41 54 45 2c 20 70 2d 3e 7a 53  ATE_STATE, p->zS
139c0 74 61 74 65 44 62 29 3b 0a 0a 23 69 66 20 30 0a  tateDb);..#if 0.
139d0 20 20 69 66 28 20 72 62 75 49 73 56 61 63 75 75    if( rbuIsVacuu
139e0 6d 28 70 29 20 29 7b 0a 20 20 20 20 69 66 28 20  m(p) ){.    if( 
139f0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
13a00 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63   ){.      int rc
13a10 32 3b 0a 20 20 20 20 20 20 69 6e 74 20 62 4f 6b  2;.      int bOk
13a20 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 0;.      sqli
13a30 74 65 33 5f 73 74 6d 74 20 2a 70 43 6e 74 20 3d  te3_stmt *pCnt =
13a40 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20   0;.      p->rc 
13a50 3d 20 70 72 65 70 61 72 65 41 6e 64 43 6f 6c 6c  = prepareAndColl
13a60 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 52 62  ectError(p->dbRb
13a70 75 2c 20 26 70 43 6e 74 2c 20 26 70 2d 3e 7a 45  u, &pCnt, &p->zE
13a80 72 72 6d 73 67 2c 0a 20 20 20 20 20 20 20 20 20  rrmsg,.         
13a90 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a   "SELECT count(*
13aa0 29 20 46 52 4f 4d 20 73 74 61 74 2e 73 71 6c 69  ) FROM stat.sqli
13ab0 74 65 5f 6d 61 73 74 65 72 22 0a 20 20 20 20 20  te_master".     
13ac0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   );.      if( p-
13ad0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a  >rc==SQLITE_OK .
13ae0 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
13af0 33 5f 73 74 65 70 28 70 43 6e 74 29 3d 3d 53 51  3_step(pCnt)==SQ
13b00 4c 49 54 45 5f 52 4f 57 0a 20 20 20 20 20 20 20  LITE_ROW.       
13b10 26 26 20 31 3d 3d 73 71 6c 69 74 65 33 5f 63 6f  && 1==sqlite3_co
13b20 6c 75 6d 6e 5f 69 6e 74 28 70 43 6e 74 2c 20 30  lumn_int(pCnt, 0
13b30 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  ).      ){.     
13b40 20 20 20 62 4f 6b 20 3d 20 31 3b 0a 20 20 20 20     bOk = 1;.    
13b50 20 20 7d 0a 20 20 20 20 20 20 72 63 32 20 3d 20    }.      rc2 = 
13b60 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
13b70 28 70 43 6e 74 29 3b 0a 20 20 20 20 20 20 69 66  (pCnt);.      if
13b80 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
13b90 4f 4b 20 29 20 70 2d 3e 72 63 20 3d 20 72 63 32  OK ) p->rc = rc2
13ba0 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ;..      if( p->
13bb0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
13bc0 20 62 4f 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20   bOk==0 ){.     
13bd0 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
13be0 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  E_ERROR;.       
13bf0 20 70 2d 3e 7a 45 72 72 6d 73 67 20 3d 20 73 71   p->zErrmsg = sq
13c00 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 69  lite3_mprintf("i
13c10 6e 76 61 6c 69 64 20 73 74 61 74 65 20 64 61 74  nvalid state dat
13c20 61 62 61 73 65 22 29 3b 0a 20 20 20 20 20 20 7d  abase");.      }
13c30 0a 20 20 20 20 0a 20 20 20 20 20 20 69 66 28 20  .    .      if( 
13c40 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
13c50 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72   ){.        p->r
13c60 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  c = sqlite3_exec
13c70 28 70 2d 3e 64 62 52 62 75 2c 20 22 43 4f 4d 4d  (p->dbRbu, "COMM
13c80 49 54 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  IT", 0, 0, 0);. 
13c90 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
13ca0 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70  .#endif..  if( p
13cb0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
13cc0 26 26 20 72 62 75 49 73 56 61 63 75 75 6d 28 70  && rbuIsVacuum(p
13cd0 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 4f 70  ) ){.    int bOp
13ce0 65 6e 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  en = 0;.    int 
13cf0 72 63 3b 0a 20 20 20 20 70 2d 3e 6e 52 62 75 20  rc;.    p->nRbu 
13d00 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 52 62 75  = 0;.    p->pRbu
13d10 46 64 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d  Fd = 0;.    rc =
13d20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
13d30 6e 74 72 6f 6c 28 70 2d 3e 64 62 52 62 75 2c 20  ntrol(p->dbRbu, 
13d40 22 6d 61 69 6e 22 2c 20 53 51 4c 49 54 45 5f 46  "main", SQLITE_F
13d50 43 4e 54 4c 5f 52 42 55 43 4e 54 2c 20 28 76 6f  CNTL_RBUCNT, (vo
13d60 69 64 2a 29 70 29 3b 0a 20 20 20 20 69 66 28 20  id*)p);.    if( 
13d70 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f  rc!=SQLITE_NOTFO
13d80 55 4e 44 20 29 20 70 2d 3e 72 63 20 3d 20 72 63  UND ) p->rc = rc
13d90 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74  ;.    if( p->eSt
13da0 61 67 65 3e 3d 52 42 55 5f 53 54 41 47 45 5f 4d  age>=RBU_STAGE_M
13db0 4f 56 45 20 29 7b 0a 20 20 20 20 20 20 62 4f 70  OVE ){.      bOp
13dc0 65 6e 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  en = 1;.    }els
13dd0 65 7b 0a 20 20 20 20 20 20 52 62 75 53 74 61 74  e{.      RbuStat
13de0 65 20 2a 70 53 74 61 74 65 20 3d 20 72 62 75 4c  e *pState = rbuL
13df0 6f 61 64 53 74 61 74 65 28 70 29 3b 0a 20 20 20  oadState(p);.   
13e00 20 20 20 69 66 28 20 70 53 74 61 74 65 20 29 7b     if( pState ){
13e10 0a 20 20 20 20 20 20 20 20 62 4f 70 65 6e 20 3d  .        bOpen =
13e20 20 28 70 53 74 61 74 65 2d 3e 65 53 74 61 67 65   (pState->eStage
13e30 3e 3d 52 42 55 5f 53 54 41 47 45 5f 4d 4f 56 45  >=RBU_STAGE_MOVE
13e40 29 3b 0a 20 20 20 20 20 20 20 20 72 62 75 46 72  );.        rbuFr
13e50 65 65 53 74 61 74 65 28 70 53 74 61 74 65 29 3b  eeState(pState);
13e60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
13e70 20 20 20 69 66 28 20 62 4f 70 65 6e 20 29 20 70     if( bOpen ) p
13e80 2d 3e 64 62 4d 61 69 6e 20 3d 20 72 62 75 4f 70  ->dbMain = rbuOp
13e90 65 6e 44 62 68 61 6e 64 6c 65 28 70 2c 20 70 2d  enDbhandle(p, p-
13ea0 3e 7a 52 62 75 2c 20 70 2d 3e 6e 52 62 75 3c 3d  >zRbu, p->nRbu<=
13eb0 31 29 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e 65 53  1);.  }..  p->eS
13ec0 74 61 67 65 20 3d 20 30 3b 0a 20 20 69 66 28 20  tage = 0;.  if( 
13ed0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
13ee0 20 26 26 20 70 2d 3e 64 62 4d 61 69 6e 3d 3d 30   && p->dbMain==0
13ef0 20 29 7b 0a 20 20 20 20 69 66 28 20 21 72 62 75   ){.    if( !rbu
13f00 49 73 56 61 63 75 75 6d 28 70 29 20 29 7b 0a 20  IsVacuum(p) ){. 
13f10 20 20 20 20 20 70 2d 3e 64 62 4d 61 69 6e 20 3d       p->dbMain =
13f20 20 72 62 75 4f 70 65 6e 44 62 68 61 6e 64 6c 65   rbuOpenDbhandle
13f30 28 70 2c 20 70 2d 3e 7a 54 61 72 67 65 74 2c 20  (p, p->zTarget, 
13f40 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  1);.    }else if
13f50 28 20 70 2d 3e 70 52 62 75 46 64 2d 3e 70 57 61  ( p->pRbuFd->pWa
13f60 6c 46 64 20 29 7b 0a 20 20 20 20 20 20 69 66 28  lFd ){.      if(
13f70 20 70 62 52 65 74 72 79 20 29 7b 0a 20 20 20 20   pbRetry ){.    
13f80 20 20 20 20 70 2d 3e 70 52 62 75 46 64 2d 3e 62      p->pRbuFd->b
13f90 4e 6f 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20  Nolock = 0;.    
13fa0 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73      sqlite3_clos
13fb0 65 28 70 2d 3e 64 62 52 62 75 29 3b 0a 20 20 20  e(p->dbRbu);.   
13fc0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f       sqlite3_clo
13fd0 73 65 28 70 2d 3e 64 62 4d 61 69 6e 29 3b 0a 20  se(p->dbMain);. 
13fe0 20 20 20 20 20 20 20 70 2d 3e 64 62 4d 61 69 6e         p->dbMain
13ff0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 2d   = 0;.        p-
14000 3e 64 62 52 62 75 20 3d 20 30 3b 0a 20 20 20 20  >dbRbu = 0;.    
14010 20 20 20 20 2a 70 62 52 65 74 72 79 20 3d 20 31      *pbRetry = 1
14020 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
14030 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
14040 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45  p->rc = SQLITE_E
14050 52 52 4f 52 3b 0a 20 20 20 20 20 20 70 2d 3e 7a  RROR;.      p->z
14060 45 72 72 6d 73 67 20 3d 20 73 71 6c 69 74 65 33  Errmsg = sqlite3
14070 5f 6d 70 72 69 6e 74 66 28 22 63 61 6e 6e 6f 74  _mprintf("cannot
14080 20 76 61 63 75 75 6d 20 77 61 6c 20 6d 6f 64 65   vacuum wal mode
14090 20 64 61 74 61 62 61 73 65 22 29 3b 0a 20 20 20   database");.   
140a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68   }else{.      ch
140b0 61 72 20 2a 7a 54 61 72 67 65 74 3b 0a 20 20 20  ar *zTarget;.   
140c0 20 20 20 63 68 61 72 20 2a 7a 45 78 74 72 61 20     char *zExtra 
140d0 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 73  = 0;.      if( s
140e0 74 72 6c 65 6e 28 70 2d 3e 7a 52 62 75 29 3e 3d  trlen(p->zRbu)>=
140f0 35 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 22  5 && 0==memcmp("
14100 66 69 6c 65 3a 22 2c 20 70 2d 3e 7a 52 62 75 2c  file:", p->zRbu,
14110 20 35 29 20 29 7b 0a 20 20 20 20 20 20 20 20 7a   5) ){.        z
14120 45 78 74 72 61 20 3d 20 26 70 2d 3e 7a 52 62 75  Extra = &p->zRbu
14130 5b 35 5d 3b 0a 20 20 20 20 20 20 20 20 77 68 69  [5];.        whi
14140 6c 65 28 20 2a 7a 45 78 74 72 61 20 29 7b 0a 20  le( *zExtra ){. 
14150 20 20 20 20 20 20 20 20 20 69 66 28 20 2a 7a 45           if( *zE
14160 78 74 72 61 2b 2b 3d 3d 27 3f 27 20 29 20 62 72  xtra++=='?' ) br
14170 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
14180 20 20 20 20 20 20 20 69 66 28 20 2a 7a 45 78 74         if( *zExt
14190 72 61 3d 3d 27 5c 30 27 20 29 20 7a 45 78 74 72  ra=='\0' ) zExtr
141a0 61 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a  a = 0;.      }..
141b0 20 20 20 20 20 20 7a 54 61 72 67 65 74 20 3d 20        zTarget = 
141c0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
141d0 22 66 69 6c 65 3a 25 73 2d 76 61 63 75 75 6d 3f  "file:%s-vacuum?
141e0 72 62 75 5f 6d 65 6d 6f 72 79 3d 31 25 73 25 73  rbu_memory=1%s%s
141f0 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73 71  ", .          sq
14200 6c 69 74 65 33 5f 64 62 5f 66 69 6c 65 6e 61 6d  lite3_db_filenam
14210 65 28 70 2d 3e 64 62 52 62 75 2c 20 22 6d 61 69  e(p->dbRbu, "mai
14220 6e 22 29 2c 0a 20 20 20 20 20 20 20 20 20 20 28  n"),.          (
14230 7a 45 78 74 72 61 3d 3d 30 20 3f 20 22 22 20 3a  zExtra==0 ? "" :
14240 20 22 26 22 29 2c 20 28 7a 45 78 74 72 61 3d 3d   "&"), (zExtra==
14250 30 20 3f 20 22 22 20 3a 20 7a 45 78 74 72 61 29  0 ? "" : zExtra)
14260 0a 20 20 20 20 20 20 29 3b 0a 0a 20 20 20 20 20  .      );..     
14270 20 69 66 28 20 7a 54 61 72 67 65 74 3d 3d 30 20   if( zTarget==0 
14280 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63  ){.        p->rc
14290 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
142a0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b  .        return;
142b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
142c0 2d 3e 64 62 4d 61 69 6e 20 3d 20 72 62 75 4f 70  ->dbMain = rbuOp
142d0 65 6e 44 62 68 61 6e 64 6c 65 28 70 2c 20 7a 54  enDbhandle(p, zT
142e0 61 72 67 65 74 2c 20 70 2d 3e 6e 52 62 75 3c 3d  arget, p->nRbu<=
142f0 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
14300 33 5f 66 72 65 65 28 7a 54 61 72 67 65 74 29 3b  3_free(zTarget);
14310 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
14320 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
14330 4f 4b 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  OK ){.    p->rc 
14340 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
14350 5f 66 75 6e 63 74 69 6f 6e 28 70 2d 3e 64 62 4d  _function(p->dbM
14360 61 69 6e 2c 20 0a 20 20 20 20 20 20 20 20 22 72  ain, .        "r
14370 62 75 5f 74 6d 70 5f 69 6e 73 65 72 74 22 2c 20  bu_tmp_insert", 
14380 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  -1, SQLITE_UTF8,
14390 20 28 76 6f 69 64 2a 29 70 2c 20 72 62 75 54 6d   (void*)p, rbuTm
143a0 70 49 6e 73 65 72 74 46 75 6e 63 2c 20 30 2c 20  pInsertFunc, 0, 
143b0 30 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20  0.    );.  }..  
143c0 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
143d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d 3e 72  E_OK ){.    p->r
143e0 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
143f0 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70 2d 3e 64  te_function(p->d
14400 62 4d 61 69 6e 2c 20 0a 20 20 20 20 20 20 20 20  bMain, .        
14410 22 72 62 75 5f 66 6f 73 73 69 6c 5f 64 65 6c 74  "rbu_fossil_delt
14420 61 22 2c 20 32 2c 20 53 51 4c 49 54 45 5f 55 54  a", 2, SQLITE_UT
14430 46 38 2c 20 30 2c 20 72 62 75 46 6f 73 73 69 6c  F8, 0, rbuFossil
14440 44 65 6c 74 61 46 75 6e 63 2c 20 30 2c 20 30 0a  DeltaFunc, 0, 0.
14450 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 69 66      );.  }..  if
14460 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
14470 4f 4b 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  OK ){.    p->rc 
14480 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
14490 5f 66 75 6e 63 74 69 6f 6e 28 70 2d 3e 64 62 52  _function(p->dbR
144a0 62 75 2c 20 0a 20 20 20 20 20 20 20 20 22 72 62  bu, .        "rb
144b0 75 5f 74 61 72 67 65 74 5f 6e 61 6d 65 22 2c 20  u_target_name", 
144c0 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  -1, SQLITE_UTF8,
144d0 20 28 76 6f 69 64 2a 29 70 2c 20 72 62 75 54 61   (void*)p, rbuTa
144e0 72 67 65 74 4e 61 6d 65 46 75 6e 63 2c 20 30 2c  rgetNameFunc, 0,
144f0 20 30 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20   0.    );.  }.. 
14500 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
14510 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d 3e  TE_OK ){.    p->
14520 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c  rc = sqlite3_fil
14530 65 5f 63 6f 6e 74 72 6f 6c 28 70 2d 3e 64 62 4d  e_control(p->dbM
14540 61 69 6e 2c 20 22 6d 61 69 6e 22 2c 20 53 51 4c  ain, "main", SQL
14550 49 54 45 5f 46 43 4e 54 4c 5f 52 42 55 2c 20 28  ITE_FCNTL_RBU, (
14560 76 6f 69 64 2a 29 70 29 3b 0a 20 20 7d 0a 20 20  void*)p);.  }.  
14570 72 62 75 4d 50 72 69 6e 74 66 45 78 65 63 28 70  rbuMPrintfExec(p
14580 2c 20 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 53 45  , p->dbMain, "SE
14590 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69  LECT * FROM sqli
145a0 74 65 5f 6d 61 73 74 65 72 22 29 3b 0a 0a 20 20  te_master");..  
145b0 2f 2a 20 4d 61 72 6b 20 74 68 65 20 64 61 74 61  /* Mark the data
145c0 62 61 73 65 20 66 69 6c 65 20 6a 75 73 74 20 6f  base file just o
145d0 70 65 6e 65 64 20 61 73 20 61 6e 20 52 42 55 20  pened as an RBU 
145e0 74 61 72 67 65 74 20 64 61 74 61 62 61 73 65 2e  target database.
145f0 20 49 66 20 0a 20 20 2a 2a 20 74 68 69 73 20 63   If .  ** this c
14600 61 6c 6c 20 72 65 74 75 72 6e 73 20 53 51 4c 49  all returns SQLI
14610 54 45 5f 4e 4f 54 46 4f 55 4e 44 2c 20 74 68 65  TE_NOTFOUND, the
14620 6e 20 74 68 65 20 52 42 55 20 76 66 73 20 69 73  n the RBU vfs is
14630 20 6e 6f 74 20 69 6e 20 75 73 65 2e 0a 20 20 2a   not in use..  *
14640 2a 20 54 68 69 73 20 69 73 20 61 6e 20 65 72 72  * This is an err
14650 6f 72 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  or.  */.  if( p-
14660 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
14670 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71  {.    p->rc = sq
14680 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
14690 6f 6c 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 6d  ol(p->dbMain, "m
146a0 61 69 6e 22 2c 20 53 51 4c 49 54 45 5f 46 43 4e  ain", SQLITE_FCN
146b0 54 4c 5f 52 42 55 2c 20 28 76 6f 69 64 2a 29 70  TL_RBU, (void*)p
146c0 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d  );.  }..  if( p-
146d0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46  >rc==SQLITE_NOTF
146e0 4f 55 4e 44 20 29 7b 0a 20 20 20 20 70 2d 3e 72  OUND ){.    p->r
146f0 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
14700 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72 6d 73 67  ;.    p->zErrmsg
14710 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
14720 74 66 28 22 72 62 75 20 76 66 73 20 6e 6f 74 20  tf("rbu vfs not 
14730 66 6f 75 6e 64 22 29 3b 0a 20 20 7d 0a 7d 0a 0a  found");.  }.}..
14740 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
14750 6e 65 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20  ne is a copy of 
14760 74 68 65 20 73 71 6c 69 74 65 33 46 69 6c 65 53  the sqlite3FileS
14770 75 66 66 69 78 33 28 29 20 72 6f 75 74 69 6e 65  uffix3() routine
14780 20 66 72 6f 6d 20 74 68 65 20 63 6f 72 65 2e 0a   from the core..
14790 2a 2a 20 49 74 20 69 73 20 61 20 6e 6f 2d 6f 70  ** It is a no-op
147a0 20 75 6e 6c 65 73 73 20 53 51 4c 49 54 45 5f 45   unless SQLITE_E
147b0 4e 41 42 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53 20  NABLE_8_3_NAMES 
147c0 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a  is defined..**.*
147d0 2a 20 49 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  * If SQLITE_ENAB
147e0 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53 20 69 73 20  LE_8_3_NAMES is 
147f0 73 65 74 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74  set at compile-t
14800 69 6d 65 20 61 6e 64 20 69 66 20 74 68 65 20 64  ime and if the d
14810 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 6e  atabase.** filen
14820 61 6d 65 20 69 6e 20 7a 42 61 73 65 46 69 6c 65  ame in zBaseFile
14830 6e 61 6d 65 20 69 73 20 61 20 55 52 49 20 77 69  name is a URI wi
14840 74 68 20 74 68 65 20 22 38 5f 33 5f 6e 61 6d 65  th the "8_3_name
14850 73 3d 31 22 20 70 61 72 61 6d 65 74 65 72 20 61  s=1" parameter a
14860 6e 64 0a 2a 2a 20 69 66 20 66 69 6c 65 6e 61 6d  nd.** if filenam
14870 65 20 69 6e 20 7a 5b 5d 20 68 61 73 20 61 20 73  e in z[] has a s
14880 75 66 66 69 78 20 28 61 2e 6b 2e 61 2e 20 22 65  uffix (a.k.a. "e
14890 78 74 65 6e 73 69 6f 6e 22 29 20 74 68 61 74 20  xtension") that 
148a0 69 73 20 6c 6f 6e 67 65 72 20 74 68 61 6e 0a 2a  is longer than.*
148b0 2a 20 74 68 72 65 65 20 63 68 61 72 61 63 74 65  * three characte
148c0 72 73 2c 20 74 68 65 6e 20 73 68 6f 72 74 65 6e  rs, then shorten
148d0 20 74 68 65 20 73 75 66 66 69 78 20 6f 6e 20 7a   the suffix on z
148e0 5b 5d 20 74 6f 20 62 65 20 74 68 65 20 6c 61 73  [] to be the las
148f0 74 20 74 68 72 65 65 0a 2a 2a 20 63 68 61 72 61  t three.** chara
14900 63 74 65 72 73 20 6f 66 20 74 68 65 20 6f 72 69  cters of the ori
14910 67 69 6e 61 6c 20 73 75 66 66 69 78 2e 0a 2a 2a  ginal suffix..**
14920 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 45 4e  .** If SQLITE_EN
14930 41 42 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53 20 69  ABLE_8_3_NAMES i
14940 73 20 73 65 74 20 74 6f 20 32 20 61 74 20 63 6f  s set to 2 at co
14950 6d 70 69 6c 65 2d 74 69 6d 65 2c 20 74 68 65 6e  mpile-time, then
14960 20 61 6c 77 61 79 73 0a 2a 2a 20 64 6f 20 74 68   always.** do th
14970 65 20 73 75 66 66 69 78 20 73 68 6f 72 74 65 6e  e suffix shorten
14980 69 6e 67 20 72 65 67 61 72 64 6c 65 73 73 20 6f  ing regardless o
14990 66 20 55 52 49 20 70 61 72 61 6d 65 74 65 72 2e  f URI parameter.
149a0 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 73 3a  .**.** Examples:
149b0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 74 65 73 74 2e  .**.**     test.
149c0 64 62 2d 6a 6f 75 72 6e 61 6c 20 20 20 20 3d 3e  db-journal    =>
149d0 20 20 20 74 65 73 74 2e 6e 61 6c 0a 2a 2a 20 20     test.nal.**  
149e0 20 20 20 74 65 73 74 2e 64 62 2d 77 61 6c 20 20     test.db-wal  
149f0 20 20 20 20 20 20 3d 3e 20 20 20 74 65 73 74 2e        =>   test.
14a00 77 61 6c 0a 2a 2a 20 20 20 20 20 74 65 73 74 2e  wal.**     test.
14a10 64 62 2d 73 68 6d 20 20 20 20 20 20 20 20 3d 3e  db-shm        =>
14a20 20 20 20 74 65 73 74 2e 73 68 6d 0a 2a 2a 20 20     test.shm.**  
14a30 20 20 20 74 65 73 74 2e 64 62 2d 6d 6a 37 66 33     test.db-mj7f3
14a40 33 31 39 66 61 20 3d 3e 20 20 20 74 65 73 74 2e  319fa =>   test.
14a50 39 66 61 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  9fa.*/.static vo
14a60 69 64 20 72 62 75 46 69 6c 65 53 75 66 66 69 78  id rbuFileSuffix
14a70 33 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42  3(const char *zB
14a80 61 73 65 2c 20 63 68 61 72 20 2a 7a 29 7b 0a 23  ase, char *z){.#
14a90 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
14aa0 42 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53 0a 23 69  BLE_8_3_NAMES.#i
14ab0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
14ac0 38 5f 33 5f 4e 41 4d 45 53 3c 32 0a 20 20 69 66  8_3_NAMES<2.  if
14ad0 28 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f  ( sqlite3_uri_bo
14ae0 6f 6c 65 61 6e 28 7a 42 61 73 65 2c 20 22 38 5f  olean(zBase, "8_
14af0 33 5f 6e 61 6d 65 73 22 2c 20 30 29 20 29 0a 23  3_names", 0) ).#
14b00 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 69 6e  endif.  {.    in
14b10 74 20 69 2c 20 73 7a 3b 0a 20 20 20 20 73 7a 20  t i, sz;.    sz 
14b20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 29  = (int)strlen(z)
14b30 26 30 78 66 66 66 66 66 66 3b 0a 20 20 20 20 66  &0xffffff;.    f
14b40 6f 72 28 69 3d 73 7a 2d 31 3b 20 69 3e 30 20 26  or(i=sz-1; i>0 &
14b50 26 20 7a 5b 69 5d 21 3d 27 2f 27 20 26 26 20 7a  & z[i]!='/' && z
14b60 5b 69 5d 21 3d 27 2e 27 3b 20 69 2d 2d 29 7b 7d  [i]!='.'; i--){}
14b70 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27  .    if( z[i]=='
14b80 2e 27 20 26 26 20 73 7a 3e 69 2b 34 20 29 20 6d  .' && sz>i+4 ) m
14b90 65 6d 6d 6f 76 65 28 26 7a 5b 69 2b 31 5d 2c 20  emmove(&z[i+1], 
14ba0 26 7a 5b 73 7a 2d 33 5d 2c 20 34 29 3b 0a 20 20  &z[sz-3], 4);.  
14bb0 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  }.#endif.}../*.*
14bc0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72  * Return the cur
14bd0 72 65 6e 74 20 77 61 6c 2d 69 6e 64 65 78 20 68  rent wal-index h
14be0 65 61 64 65 72 20 63 68 65 63 6b 73 75 6d 20 66  eader checksum f
14bf0 6f 72 20 74 68 65 20 74 61 72 67 65 74 20 64 61  or the target da
14c00 74 61 62 61 73 65 20 0a 2a 2a 20 61 73 20 61 20  tabase .** as a 
14c10 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 2e 0a  64-bit integer..
14c20 2a 2a 0a 2a 2a 20 54 68 65 20 63 68 65 63 6b 73  **.** The checks
14c30 75 6d 20 69 73 20 73 74 6f 72 65 20 69 6e 20 74  um is store in t
14c40 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
14c50 20 78 53 68 6d 4d 61 70 20 6d 65 6d 6f 72 79 20   xShmMap memory 
14c60 61 73 20 61 6e 20 38 2d 62 79 74 65 20 0a 2a 2a  as an 8-byte .**
14c70 20 62 6c 6f 62 20 73 74 61 72 74 69 6e 67 20 61   blob starting a
14c80 74 20 62 79 74 65 20 6f 66 66 73 65 74 20 34 30  t byte offset 40
14c90 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36 34 20  ..*/.static i64 
14ca0 72 62 75 53 68 6d 43 68 65 63 6b 73 75 6d 28 73  rbuShmChecksum(s
14cb0 71 6c 69 74 65 33 72 62 75 20 2a 70 29 7b 0a 20  qlite3rbu *p){. 
14cc0 20 69 36 34 20 69 52 65 74 20 3d 20 30 3b 0a 20   i64 iRet = 0;. 
14cd0 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
14ce0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
14cf0 69 74 65 33 5f 66 69 6c 65 20 2a 70 44 62 20 3d  ite3_file *pDb =
14d00 20 70 2d 3e 70 54 61 72 67 65 74 46 64 2d 3e 70   p->pTargetFd->p
14d10 52 65 61 6c 3b 0a 20 20 20 20 75 33 32 20 76 6f  Real;.    u32 vo
14d20 6c 61 74 69 6c 65 20 2a 70 74 72 3b 0a 20 20 20  latile *ptr;.   
14d30 20 70 2d 3e 72 63 20 3d 20 70 44 62 2d 3e 70 4d   p->rc = pDb->pM
14d40 65 74 68 6f 64 73 2d 3e 78 53 68 6d 4d 61 70 28  ethods->xShmMap(
14d50 70 44 62 2c 20 30 2c 20 33 32 2a 31 30 32 34 2c  pDb, 0, 32*1024,
14d60 20 30 2c 20 28 76 6f 69 64 20 76 6f 6c 61 74 69   0, (void volati
14d70 6c 65 2a 2a 29 26 70 74 72 29 3b 0a 20 20 20 20  le**)&ptr);.    
14d80 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
14d90 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 52  E_OK ){.      iR
14da0 65 74 20 3d 20 28 28 69 36 34 29 70 74 72 5b 31  et = ((i64)ptr[1
14db0 30 5d 20 3c 3c 20 33 32 29 20 2b 20 70 74 72 5b  0] << 32) + ptr[
14dc0 31 31 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  11];.    }.  }. 
14dd0 20 72 65 74 75 72 6e 20 69 52 65 74 3b 0a 7d 0a   return iRet;.}.
14de0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
14df0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61  tion is called a
14e00 73 20 70 61 72 74 20 6f 66 20 69 6e 69 74 69 61  s part of initia
14e10 6c 69 7a 69 6e 67 20 6f 72 20 72 65 69 6e 69 74  lizing or reinit
14e20 69 61 6c 69 7a 69 6e 67 20 61 6e 0a 2a 2a 20 69  ializing an.** i
14e30 6e 63 72 65 6d 65 6e 74 61 6c 20 63 68 65 63 6b  ncremental check
14e40 70 6f 69 6e 74 2e 20 0a 2a 2a 0a 2a 2a 20 49 74  point. .**.** It
14e50 20 70 6f 70 75 6c 61 74 65 73 20 74 68 65 20 73   populates the s
14e60 71 6c 69 74 65 33 72 62 75 2e 61 46 72 61 6d 65  qlite3rbu.aFrame
14e70 5b 5d 20 61 72 72 61 79 20 77 69 74 68 20 74 68  [] array with th
14e80 65 20 73 65 74 20 6f 66 20 0a 2a 2a 20 28 77 61  e set of .** (wa
14e90 6c 20 66 72 61 6d 65 20 2d 3e 20 64 62 20 70 61  l frame -> db pa
14ea0 67 65 29 20 63 6f 70 79 20 6f 70 65 72 61 74 69  ge) copy operati
14eb0 6f 6e 73 20 72 65 71 75 69 72 65 64 20 74 6f 20  ons required to 
14ec0 63 68 65 63 6b 70 6f 69 6e 74 20 74 68 65 20 0a  checkpoint the .
14ed0 2a 2a 20 63 75 72 72 65 6e 74 20 77 61 6c 20 66  ** current wal f
14ee0 69 6c 65 2c 20 61 6e 64 20 6f 62 74 61 69 6e 73  ile, and obtains
14ef0 20 74 68 65 20 73 65 74 20 6f 66 20 73 68 6d 20   the set of shm 
14f00 6c 6f 63 6b 73 20 72 65 71 75 69 72 65 64 20 74  locks required t
14f10 6f 20 73 61 66 65 6c 79 20 0a 2a 2a 20 70 65 72  o safely .** per
14f20 66 6f 72 6d 20 74 68 65 20 63 6f 70 79 20 6f 70  form the copy op
14f30 65 72 61 74 69 6f 6e 73 20 64 69 72 65 63 74 6c  erations directl
14f40 79 20 6f 6e 20 74 68 65 20 66 69 6c 65 2d 73 79  y on the file-sy
14f50 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  stem..**.** If a
14f60 72 67 75 6d 65 6e 74 20 70 53 74 61 74 65 20 69  rgument pState i
14f70 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e  s not NULL, then
14f80 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c   the incremental
14f90 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 73 0a 2a   checkpoint is.*
14fa0 2a 20 62 65 69 6e 67 20 72 65 73 75 6d 65 64 2e  * being resumed.
14fb0 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 69   In this case, i
14fc0 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6f  f the checksum o
14fd0 66 20 74 68 65 20 77 61 6c 2d 69 6e 64 65 78 2d  f the wal-index-
14fe0 68 65 61 64 65 72 0a 2a 2a 20 66 6f 6c 6c 6f 77  header.** follow
14ff0 69 6e 67 20 72 65 63 6f 76 65 72 79 20 69 73 20  ing recovery is 
15000 6e 6f 74 20 74 68 65 20 73 61 6d 65 20 61 73 20  not the same as 
15010 74 68 65 20 63 68 65 63 6b 73 75 6d 20 73 61 76  the checksum sav
15020 65 64 20 69 6e 20 74 68 65 20 52 62 75 53 74 61  ed in the RbuSta
15030 74 65 0a 2a 2a 20 6f 62 6a 65 63 74 2c 20 74 68  te.** object, th
15040 65 6e 20 74 68 65 20 72 62 75 20 68 61 6e 64 6c  en the rbu handl
15050 65 20 69 73 20 73 65 74 20 74 6f 20 44 4f 4e 45  e is set to DONE
15060 20 73 74 61 74 65 2e 20 54 68 69 73 20 6f 63 63   state. This occ
15070 75 72 73 20 69 66 20 73 6f 6d 65 0a 2a 2a 20 6f  urs if some.** o
15080 74 68 65 72 20 63 6c 69 65 6e 74 20 61 70 70 65  ther client appe
15090 6e 64 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f  nds a transactio
150a0 6e 20 74 6f 20 74 68 65 20 77 61 6c 20 66 69 6c  n to the wal fil
150b0 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20  e in the middle 
150c0 6f 66 0a 2a 2a 20 61 6e 20 69 6e 63 72 65 6d 65  of.** an increme
150d0 6e 74 61 6c 20 63 68 65 63 6b 70 6f 69 6e 74 2e  ntal checkpoint.
150e0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
150f0 72 62 75 53 65 74 75 70 43 68 65 63 6b 70 6f 69  rbuSetupCheckpoi
15100 6e 74 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70  nt(sqlite3rbu *p
15110 2c 20 52 62 75 53 74 61 74 65 20 2a 70 53 74 61  , RbuState *pSta
15120 74 65 29 7b 0a 0a 20 20 2f 2a 20 49 66 20 70 53  te){..  /* If pS
15130 74 61 74 65 20 69 73 20 4e 55 4c 4c 2c 20 74 68  tate is NULL, th
15140 65 6e 20 74 68 65 20 77 61 6c 20 66 69 6c 65 20  en the wal file 
15150 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 62 65 65  may not have bee
15160 6e 20 6f 70 65 6e 65 64 20 61 6e 64 0a 20 20 2a  n opened and.  *
15170 2a 20 72 65 63 6f 76 65 72 65 64 2e 20 52 75 6e  * recovered. Run
15180 6e 69 6e 67 20 61 20 72 65 61 64 2d 73 74 61 74  ning a read-stat
15190 65 6d 65 6e 74 20 68 65 72 65 20 74 6f 20 65 6e  ement here to en
151a0 73 75 72 65 20 74 68 61 74 20 64 6f 69 6e 67 20  sure that doing 
151b0 73 6f 0a 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74  so.  ** does not
151c0 20 69 6e 74 65 72 66 65 72 65 20 77 69 74 68 20   interfere with 
151d0 74 68 65 20 22 63 61 70 74 75 72 65 22 20 70 72  the "capture" pr
151e0 6f 63 65 73 73 20 62 65 6c 6f 77 2e 20 20 2a 2f  ocess below.  */
151f0 0a 20 20 69 66 28 20 70 53 74 61 74 65 3d 3d 30  .  if( pState==0
15200 20 29 7b 0a 20 20 20 20 70 2d 3e 65 53 74 61 67   ){.    p->eStag
15210 65 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70  e = 0;.    if( p
15220 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
15230 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  ){.      p->rc =
15240 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d   sqlite3_exec(p-
15250 3e 64 62 4d 61 69 6e 2c 20 22 53 45 4c 45 43 54  >dbMain, "SELECT
15260 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d   * FROM sqlite_m
15270 61 73 74 65 72 22 2c 20 30 2c 20 30 2c 20 30 29  aster", 0, 0, 0)
15280 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
15290 2a 20 41 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72  * Assuming no er
152a0 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64  ror has occurred
152b0 2c 20 72 75 6e 20 61 20 22 72 65 73 74 61 72 74  , run a "restart
152c0 22 20 63 68 65 63 6b 70 6f 69 6e 74 20 77 69 74  " checkpoint wit
152d0 68 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74  h the.  ** sqlit
152e0 65 33 72 62 75 2e 65 53 74 61 67 65 20 76 61 72  e3rbu.eStage var
152f0 69 61 62 6c 65 20 73 65 74 20 74 6f 20 43 41 50  iable set to CAP
15300 54 55 52 45 2e 20 54 68 69 73 20 74 75 72 6e 73  TURE. This turns
15310 20 6f 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   on the followin
15320 67 0a 20 20 2a 2a 20 73 70 65 63 69 61 6c 20 62  g.  ** special b
15330 65 68 61 76 69 6f 75 72 20 69 6e 20 74 68 65 20  ehaviour in the 
15340 72 62 75 20 56 46 53 3a 0a 20 20 2a 2a 0a 20 20  rbu VFS:.  **.  
15350 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 65 78  **   * If the ex
15360 63 6c 75 73 69 76 65 20 73 68 6d 20 57 52 49 54  clusive shm WRIT
15370 45 52 20 6f 72 20 52 45 41 44 30 20 6c 6f 63 6b  ER or READ0 lock
15380 20 63 61 6e 6e 6f 74 20 62 65 20 6f 62 74 61 69   cannot be obtai
15390 6e 65 64 2c 0a 20 20 2a 2a 20 20 20 20 20 74 68  ned,.  **     th
153a0 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 66 61 69  e checkpoint fai
153b0 6c 73 20 77 69 74 68 20 53 51 4c 49 54 45 5f 42  ls with SQLITE_B
153c0 55 53 59 20 28 6e 6f 72 6d 61 6c 6c 79 20 53 51  USY (normally SQ
153d0 4c 69 74 65 20 77 6f 75 6c 64 0a 20 20 2a 2a 20  Lite would.  ** 
153e0 20 20 20 20 70 72 6f 63 65 65 64 20 77 69 74 68      proceed with
153f0 20 72 75 6e 6e 69 6e 67 20 61 20 70 61 73 73 69   running a passi
15400 76 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 6e  ve checkpoint in
15410 73 74 65 61 64 20 6f 66 20 66 61 69 6c 69 6e 67  stead of failing
15420 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a  )..  **.  **   *
15430 20 41 74 74 65 6d 70 74 73 20 74 6f 20 72 65 61   Attempts to rea
15440 64 20 66 72 6f 6d 20 74 68 65 20 2a 2d 77 61 6c  d from the *-wal
15450 20 66 69 6c 65 20 6f 72 20 77 72 69 74 65 20 74   file or write t
15460 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
15470 69 6c 65 0a 20 20 2a 2a 20 20 20 20 20 64 6f 20  ile.  **     do 
15480 6e 6f 74 20 70 65 72 66 6f 72 6d 20 61 6e 79 20  not perform any 
15490 49 4f 2e 20 49 6e 73 74 65 61 64 2c 20 74 68 65  IO. Instead, the
154a0 20 66 72 61 6d 65 2f 70 61 67 65 20 63 6f 6d 62   frame/page comb
154b0 69 6e 61 74 69 6f 6e 73 20 74 68 61 74 0a 20 20  inations that.  
154c0 2a 2a 20 20 20 20 20 77 6f 75 6c 64 20 62 65 20  **     would be 
154d0 72 65 61 64 2f 77 72 69 74 74 65 6e 20 61 72 65  read/written are
154e0 20 72 65 63 6f 72 64 65 64 20 69 6e 20 74 68 65   recorded in the
154f0 20 73 71 6c 69 74 65 33 72 62 75 2e 61 46 72 61   sqlite3rbu.aFra
15500 6d 65 5b 5d 0a 20 20 2a 2a 20 20 20 20 20 61 72  me[].  **     ar
15510 72 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ray..  **.  **  
15520 20 2a 20 43 61 6c 6c 73 20 74 6f 20 78 53 68 6d   * Calls to xShm
15530 4c 6f 63 6b 28 55 4e 4c 4f 43 4b 29 20 74 6f 20  Lock(UNLOCK) to 
15540 72 65 6c 65 61 73 65 20 74 68 65 20 65 78 63 6c  release the excl
15550 75 73 69 76 65 20 73 68 6d 20 57 52 49 54 45 52  usive shm WRITER
15560 2c 20 0a 20 20 2a 2a 20 20 20 20 20 52 45 41 44  , .  **     READ
15570 30 20 61 6e 64 20 43 48 45 43 4b 50 4f 49 4e 54  0 and CHECKPOINT
15580 20 6c 6f 63 6b 73 20 74 61 6b 65 6e 20 61 73 20   locks taken as 
15590 70 61 72 74 20 6f 66 20 74 68 65 20 63 68 65 63  part of the chec
155a0 6b 70 6f 69 6e 74 20 61 72 65 0a 20 20 2a 2a 20  kpoint are.  ** 
155b0 20 20 20 20 6e 6f 2d 6f 70 73 2e 20 54 68 65 73      no-ops. Thes
155c0 65 20 6c 6f 63 6b 73 20 77 69 6c 6c 20 6e 6f 74  e locks will not
155d0 20 62 65 20 72 65 6c 65 61 73 65 64 20 75 6e 74   be released unt
155e0 69 6c 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  il the connectio
155f0 6e 0a 20 20 2a 2a 20 20 20 20 20 69 73 20 63 6c  n.  **     is cl
15600 6f 73 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  osed..  **.  ** 
15610 20 20 2a 20 41 74 74 65 6d 70 74 69 6e 67 20 74    * Attempting t
15620 6f 20 78 53 79 6e 63 28 29 20 74 68 65 20 64 61  o xSync() the da
15630 74 61 62 61 73 65 20 66 69 6c 65 20 63 61 75 73  tabase file caus
15640 65 73 20 61 6e 20 53 51 4c 49 54 45 5f 49 4e 54  es an SQLITE_INT
15650 45 52 4e 41 4c 20 0a 20 20 2a 2a 20 20 20 20 20  ERNAL .  **     
15660 65 72 72 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  error..  **.  **
15670 20 41 73 20 61 20 72 65 73 75 6c 74 2c 20 75 6e   As a result, un
15680 6c 65 73 73 20 61 6e 20 65 72 72 6f 72 20 28 69  less an error (i
15690 2e 65 2e 20 4f 4f 4d 20 6f 72 20 53 51 4c 49 54  .e. OOM or SQLIT
156a0 45 5f 42 55 53 59 29 20 6f 63 63 75 72 73 2c 20  E_BUSY) occurs, 
156b0 74 68 65 0a 20 20 2a 2a 20 63 68 65 63 6b 70 6f  the.  ** checkpo
156c0 69 6e 74 20 62 65 6c 6f 77 20 66 61 69 6c 73 20  int below fails 
156d0 77 69 74 68 20 53 51 4c 49 54 45 5f 49 4e 54 45  with SQLITE_INTE
156e0 52 4e 41 4c 2c 20 61 6e 64 20 6c 65 61 76 65 73  RNAL, and leaves
156f0 20 74 68 65 20 61 46 72 61 6d 65 5b 5d 0a 20 20   the aFrame[].  
15700 2a 2a 20 61 72 72 61 79 20 70 6f 70 75 6c 61 74  ** array populat
15710 65 64 20 77 69 74 68 20 61 20 73 65 74 20 6f 66  ed with a set of
15720 20 28 66 72 61 6d 65 20 2d 3e 20 70 61 67 65 29   (frame -> page)
15730 20 6d 61 70 70 69 6e 67 73 2e 20 42 65 63 61 75   mappings. Becau
15740 73 65 20 74 68 65 20 0a 20 20 2a 2a 20 57 52 49  se the .  ** WRI
15750 54 45 52 2c 20 43 48 45 43 4b 50 4f 49 4e 54 20  TER, CHECKPOINT 
15760 61 6e 64 20 52 45 41 44 30 20 6c 6f 63 6b 73 20  and READ0 locks 
15770 61 72 65 20 73 74 69 6c 6c 20 68 65 6c 64 2c 20  are still held, 
15780 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 63 6f  it is safe to co
15790 70 79 20 0a 20 20 2a 2a 20 64 61 74 61 20 66 72  py .  ** data fr
157a0 6f 6d 20 74 68 65 20 77 61 6c 20 66 69 6c 65 20  om the wal file 
157b0 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
157c0 65 20 66 69 6c 65 20 61 63 63 6f 72 64 69 6e 67  e file according
157d0 20 74 6f 20 74 68 65 20 0a 20 20 2a 2a 20 63 6f   to the .  ** co
157e0 6e 74 65 6e 74 73 20 6f 66 20 61 46 72 61 6d 65  ntents of aFrame
157f0 5b 5d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  []..  */.  if( p
15800 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
15810 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a  ){.    int rc2;.
15820 20 20 20 20 70 2d 3e 65 53 74 61 67 65 20 3d 20      p->eStage = 
15830 52 42 55 5f 53 54 41 47 45 5f 43 41 50 54 55 52  RBU_STAGE_CAPTUR
15840 45 3b 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c  E;.    rc2 = sql
15850 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 4d  ite3_exec(p->dbM
15860 61 69 6e 2c 20 22 50 52 41 47 4d 41 20 6d 61 69  ain, "PRAGMA mai
15870 6e 2e 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  n.wal_checkpoint
15880 3d 72 65 73 74 61 72 74 22 2c 20 30 2c 20 30 2c  =restart", 0, 0,
15890 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 32 21  0);.    if( rc2!
158a0 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c  =SQLITE_INTERNAL
158b0 20 29 20 70 2d 3e 72 63 20 3d 20 72 63 32 3b 0a   ) p->rc = rc2;.
158c0 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63    }..  if( p->rc
158d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
158e0 2d 3e 6e 46 72 61 6d 65 3e 30 20 29 7b 0a 20 20  ->nFrame>0 ){.  
158f0 20 20 70 2d 3e 65 53 74 61 67 65 20 3d 20 52 42    p->eStage = RB
15900 55 5f 53 54 41 47 45 5f 43 4b 50 54 3b 0a 20 20  U_STAGE_CKPT;.  
15910 20 20 70 2d 3e 6e 53 74 65 70 20 3d 20 28 70 53    p->nStep = (pS
15920 74 61 74 65 20 3f 20 70 53 74 61 74 65 2d 3e 6e  tate ? pState->n
15930 52 6f 77 20 3a 20 30 29 3b 0a 20 20 20 20 70 2d  Row : 0);.    p-
15940 3e 61 42 75 66 20 3d 20 72 62 75 4d 61 6c 6c 6f  >aBuf = rbuMallo
15950 63 28 70 2c 20 70 2d 3e 70 67 73 7a 29 3b 0a 20  c(p, p->pgsz);. 
15960 20 20 20 70 2d 3e 69 57 61 6c 43 6b 73 75 6d 20     p->iWalCksum 
15970 3d 20 72 62 75 53 68 6d 43 68 65 63 6b 73 75 6d  = rbuShmChecksum
15980 28 70 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  (p);.  }..  if( 
15990 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
159a0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e   ){.    if( p->n
159b0 46 72 61 6d 65 3d 3d 30 20 7c 7c 20 28 70 53 74  Frame==0 || (pSt
159c0 61 74 65 20 26 26 20 70 53 74 61 74 65 2d 3e 69  ate && pState->i
159d0 57 61 6c 43 6b 73 75 6d 21 3d 70 2d 3e 69 57 61  WalCksum!=p->iWa
159e0 6c 43 6b 73 75 6d 29 20 29 7b 0a 20 20 20 20 20  lCksum) ){.     
159f0 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
15a00 44 4f 4e 45 3b 0a 20 20 20 20 20 20 70 2d 3e 65  DONE;.      p->e
15a10 53 74 61 67 65 20 3d 20 52 42 55 5f 53 54 41 47  Stage = RBU_STAG
15a20 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 65 6c 73  E_DONE;.    }els
15a30 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 53 65  e{.      int nSe
15a40 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20 20 20  ctorSize;.      
15a50 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 44  sqlite3_file *pD
15a60 62 20 3d 20 70 2d 3e 70 54 61 72 67 65 74 46 64  b = p->pTargetFd
15a70 2d 3e 70 52 65 61 6c 3b 0a 20 20 20 20 20 20 73  ->pReal;.      s
15a80 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 57 61  qlite3_file *pWa
15a90 6c 20 3d 20 70 2d 3e 70 54 61 72 67 65 74 46 64  l = p->pTargetFd
15aa0 2d 3e 70 57 61 6c 46 64 2d 3e 70 52 65 61 6c 3b  ->pWalFd->pReal;
15ab0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
15ac0 2d 3e 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72  ->nPagePerSector
15ad0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e 53 65  ==0 );.      nSe
15ae0 63 74 6f 72 53 69 7a 65 20 3d 20 70 44 62 2d 3e  ctorSize = pDb->
15af0 70 4d 65 74 68 6f 64 73 2d 3e 78 53 65 63 74 6f  pMethods->xSecto
15b00 72 53 69 7a 65 28 70 44 62 29 3b 0a 20 20 20 20  rSize(pDb);.    
15b10 20 20 69 66 28 20 6e 53 65 63 74 6f 72 53 69 7a    if( nSectorSiz
15b20 65 3e 70 2d 3e 70 67 73 7a 20 29 7b 0a 20 20 20  e>p->pgsz ){.   
15b30 20 20 20 20 20 70 2d 3e 6e 50 61 67 65 50 65 72       p->nPagePer
15b40 53 65 63 74 6f 72 20 3d 20 6e 53 65 63 74 6f 72  Sector = nSector
15b50 53 69 7a 65 20 2f 20 70 2d 3e 70 67 73 7a 3b 0a  Size / p->pgsz;.
15b60 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
15b70 20 20 20 20 20 70 2d 3e 6e 50 61 67 65 50 65 72       p->nPagePer
15b80 53 65 63 74 6f 72 20 3d 20 31 3b 0a 20 20 20 20  Sector = 1;.    
15b90 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 61    }..      /* Ca
15ba0 6c 6c 20 78 53 79 6e 63 28 29 20 6f 6e 20 74 68  ll xSync() on th
15bb0 65 20 77 61 6c 20 66 69 6c 65 2e 20 54 68 69 73  e wal file. This
15bc0 20 63 61 75 73 65 73 20 53 51 4c 69 74 65 20 74   causes SQLite t
15bd0 6f 20 73 79 6e 63 20 74 68 65 20 0a 20 20 20 20  o sync the .    
15be0 20 20 2a 2a 20 64 69 72 65 63 74 6f 72 79 20 69    ** directory i
15bf0 6e 20 77 68 69 63 68 20 74 68 65 20 74 61 72 67  n which the targ
15c00 65 74 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  et database and 
15c10 74 68 65 20 77 61 6c 20 66 69 6c 65 20 72 65 73  the wal file res
15c20 69 64 65 2c 20 69 6e 20 0a 20 20 20 20 20 20 2a  ide, in .      *
15c30 2a 20 63 61 73 65 20 69 74 20 68 61 73 20 6e 6f  * case it has no
15c40 74 20 62 65 65 6e 20 73 79 6e 63 65 64 20 73 69  t been synced si
15c50 6e 63 65 20 74 68 65 20 72 65 6e 61 6d 65 28 29  nce the rename()
15c60 20 63 61 6c 6c 20 69 6e 20 0a 20 20 20 20 20 20   call in .      
15c70 2a 2a 20 72 62 75 4d 6f 76 65 4f 61 6c 46 69 6c  ** rbuMoveOalFil
15c80 65 28 29 2e 20 2a 2f 0a 20 20 20 20 20 20 70 2d  e(). */.      p-
15c90 3e 72 63 20 3d 20 70 57 61 6c 2d 3e 70 4d 65 74  >rc = pWal->pMet
15ca0 68 6f 64 73 2d 3e 78 53 79 6e 63 28 70 57 61 6c  hods->xSync(pWal
15cb0 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  , SQLITE_SYNC_NO
15cc0 52 4d 41 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  RMAL);.    }.  }
15cd0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 65 64  .}../*.** Called
15ce0 20 77 68 65 6e 20 69 41 6d 74 20 62 79 74 65 73   when iAmt bytes
15cf0 20 61 72 65 20 72 65 61 64 20 66 72 6f 6d 20 6f   are read from o
15d00 66 66 73 65 74 20 69 4f 66 66 20 6f 66 20 74 68  ffset iOff of th
15d10 65 20 77 61 6c 20 66 69 6c 65 20 77 68 69 6c 65  e wal file while
15d20 0a 2a 2a 20 74 68 65 20 72 62 75 20 6f 62 6a 65  .** the rbu obje
15d30 63 74 20 69 73 20 69 6e 20 63 61 70 74 75 72 65  ct is in capture
15d40 20 6d 6f 64 65 2e 20 52 65 63 6f 72 64 20 74 68   mode. Record th
15d50 65 20 66 72 61 6d 65 20 6e 75 6d 62 65 72 20 6f  e frame number o
15d60 66 20 74 68 65 20 66 72 61 6d 65 0a 2a 2a 20 62  f the frame.** b
15d70 65 69 6e 67 20 72 65 61 64 20 69 6e 20 74 68 65  eing read in the
15d80 20 61 46 72 61 6d 65 5b 5d 20 61 72 72 61 79 2e   aFrame[] array.
15d90 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
15da0 62 75 43 61 70 74 75 72 65 57 61 6c 52 65 61 64  buCaptureWalRead
15db0 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 52 62  (sqlite3rbu *pRb
15dc0 75 2c 20 69 36 34 20 69 4f 66 66 2c 20 69 6e 74  u, i64 iOff, int
15dd0 20 69 41 6d 74 29 7b 0a 20 20 63 6f 6e 73 74 20   iAmt){.  const 
15de0 75 33 32 20 6d 52 65 71 20 3d 20 28 31 3c 3c 57  u32 mReq = (1<<W
15df0 41 4c 5f 4c 4f 43 4b 5f 57 52 49 54 45 29 7c 28  AL_LOCK_WRITE)|(
15e00 31 3c 3c 57 41 4c 5f 4c 4f 43 4b 5f 43 4b 50 54  1<<WAL_LOCK_CKPT
15e10 29 7c 28 31 3c 3c 57 41 4c 5f 4c 4f 43 4b 5f 52  )|(1<<WAL_LOCK_R
15e20 45 41 44 30 29 3b 0a 20 20 75 33 32 20 69 46 72  EAD0);.  u32 iFr
15e30 61 6d 65 3b 0a 0a 20 20 69 66 28 20 70 52 62 75  ame;..  if( pRbu
15e40 2d 3e 6d 4c 6f 63 6b 21 3d 6d 52 65 71 20 29 7b  ->mLock!=mReq ){
15e50 0a 20 20 20 20 70 52 62 75 2d 3e 72 63 20 3d 20  .    pRbu->rc = 
15e60 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
15e70 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
15e80 4e 54 45 52 4e 41 4c 3b 0a 20 20 7d 0a 0a 20 20  NTERNAL;.  }..  
15e90 70 52 62 75 2d 3e 70 67 73 7a 20 3d 20 69 41 6d  pRbu->pgsz = iAm
15ea0 74 3b 0a 20 20 69 66 28 20 70 52 62 75 2d 3e 6e  t;.  if( pRbu->n
15eb0 46 72 61 6d 65 3d 3d 70 52 62 75 2d 3e 6e 46 72  Frame==pRbu->nFr
15ec0 61 6d 65 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  ameAlloc ){.    
15ed0 69 6e 74 20 6e 4e 65 77 20 3d 20 28 70 52 62 75  int nNew = (pRbu
15ee0 2d 3e 6e 46 72 61 6d 65 41 6c 6c 6f 63 20 3f 20  ->nFrameAlloc ? 
15ef0 70 52 62 75 2d 3e 6e 46 72 61 6d 65 41 6c 6c 6f  pRbu->nFrameAllo
15f00 63 20 3a 20 36 34 29 20 2a 20 32 3b 0a 20 20 20  c : 64) * 2;.   
15f10 20 52 62 75 46 72 61 6d 65 20 2a 61 4e 65 77 3b   RbuFrame *aNew;
15f20 0a 20 20 20 20 61 4e 65 77 20 3d 20 28 52 62 75  .    aNew = (Rbu
15f30 46 72 61 6d 65 2a 29 73 71 6c 69 74 65 33 5f 72  Frame*)sqlite3_r
15f40 65 61 6c 6c 6f 63 36 34 28 70 52 62 75 2d 3e 61  ealloc64(pRbu->a
15f50 46 72 61 6d 65 2c 20 6e 4e 65 77 20 2a 20 73 69  Frame, nNew * si
15f60 7a 65 6f 66 28 52 62 75 46 72 61 6d 65 29 29 3b  zeof(RbuFrame));
15f70 0a 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30  .    if( aNew==0
15f80 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
15f90 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 70 52 62 75  _NOMEM;.    pRbu
15fa0 2d 3e 61 46 72 61 6d 65 20 3d 20 61 4e 65 77 3b  ->aFrame = aNew;
15fb0 0a 20 20 20 20 70 52 62 75 2d 3e 6e 46 72 61 6d  .    pRbu->nFram
15fc0 65 41 6c 6c 6f 63 20 3d 20 6e 4e 65 77 3b 0a 20  eAlloc = nNew;. 
15fd0 20 7d 0a 0a 20 20 69 46 72 61 6d 65 20 3d 20 28   }..  iFrame = (
15fe0 75 33 32 29 28 28 69 4f 66 66 2d 33 32 29 20 2f  u32)((iOff-32) /
15ff0 20 28 69 36 34 29 28 69 41 6d 74 2b 32 34 29 29   (i64)(iAmt+24))
16000 20 2b 20 31 3b 0a 20 20 69 66 28 20 70 52 62 75   + 1;.  if( pRbu
16010 2d 3e 69 4d 61 78 46 72 61 6d 65 3c 69 46 72 61  ->iMaxFrame<iFra
16020 6d 65 20 29 20 70 52 62 75 2d 3e 69 4d 61 78 46  me ) pRbu->iMaxF
16030 72 61 6d 65 20 3d 20 69 46 72 61 6d 65 3b 0a 20  rame = iFrame;. 
16040 20 70 52 62 75 2d 3e 61 46 72 61 6d 65 5b 70 52   pRbu->aFrame[pR
16050 62 75 2d 3e 6e 46 72 61 6d 65 5d 2e 69 57 61 6c  bu->nFrame].iWal
16060 46 72 61 6d 65 20 3d 20 69 46 72 61 6d 65 3b 0a  Frame = iFrame;.
16070 20 20 70 52 62 75 2d 3e 61 46 72 61 6d 65 5b 70    pRbu->aFrame[p
16080 52 62 75 2d 3e 6e 46 72 61 6d 65 5d 2e 69 44 62  Rbu->nFrame].iDb
16090 50 61 67 65 20 3d 20 30 3b 0a 20 20 70 52 62 75  Page = 0;.  pRbu
160a0 2d 3e 6e 46 72 61 6d 65 2b 2b 3b 0a 20 20 72 65  ->nFrame++;.  re
160b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
160c0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 65 64 20  }../*.** Called 
160d0 77 68 65 6e 20 61 20 70 61 67 65 20 6f 66 20 64  when a page of d
160e0 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 74  ata is written t
160f0 6f 20 6f 66 66 73 65 74 20 69 4f 66 66 20 6f 66  o offset iOff of
16100 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
16110 20 66 69 6c 65 20 77 68 69 6c 65 20 74 68 65 20   file while the 
16120 72 62 75 20 68 61 6e 64 6c 65 20 69 73 20 69 6e  rbu handle is in
16130 20 63 61 70 74 75 72 65 20 6d 6f 64 65 2e 20 52   capture mode. R
16140 65 63 6f 72 64 20 74 68 65 20 70 61 67 65 20 6e  ecord the page n
16150 75 6d 62 65 72 20 0a 2a 2a 20 6f 66 20 74 68 65  umber .** of the
16160 20 70 61 67 65 20 62 65 69 6e 67 20 77 72 69 74   page being writ
16170 74 65 6e 20 69 6e 20 74 68 65 20 61 46 72 61 6d  ten in the aFram
16180 65 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74  e[] array..*/.st
16190 61 74 69 63 20 69 6e 74 20 72 62 75 43 61 70 74  atic int rbuCapt
161a0 75 72 65 44 62 57 72 69 74 65 28 73 71 6c 69 74  ureDbWrite(sqlit
161b0 65 33 72 62 75 20 2a 70 52 62 75 2c 20 69 36 34  e3rbu *pRbu, i64
161c0 20 69 4f 66 66 29 7b 0a 20 20 70 52 62 75 2d 3e   iOff){.  pRbu->
161d0 61 46 72 61 6d 65 5b 70 52 62 75 2d 3e 6e 46 72  aFrame[pRbu->nFr
161e0 61 6d 65 2d 31 5d 2e 69 44 62 50 61 67 65 20 3d  ame-1].iDbPage =
161f0 20 28 75 33 32 29 28 69 4f 66 66 20 2f 20 70 52   (u32)(iOff / pR
16200 62 75 2d 3e 70 67 73 7a 29 20 2b 20 31 3b 0a 20  bu->pgsz) + 1;. 
16210 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
16220 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  K;.}../*.** This
16230 20 69 73 20 63 61 6c 6c 65 64 20 61 73 20 70 61   is called as pa
16240 72 74 20 6f 66 20 61 6e 20 69 6e 63 72 65 6d 65  rt of an increme
16250 6e 74 61 6c 20 63 68 65 63 6b 70 6f 69 6e 74 20  ntal checkpoint 
16260 6f 70 65 72 61 74 69 6f 6e 2e 20 43 6f 70 79 0a  operation. Copy.
16270 2a 2a 20 61 20 73 69 6e 67 6c 65 20 66 72 61 6d  ** a single fram
16280 65 20 6f 66 20 64 61 74 61 20 66 72 6f 6d 20 74  e of data from t
16290 68 65 20 77 61 6c 20 66 69 6c 65 20 69 6e 74 6f  he wal file into
162a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
162b0 6c 65 2c 20 61 73 0a 2a 2a 20 69 6e 64 69 63 61  le, as.** indica
162c0 74 65 64 20 62 79 20 74 68 65 20 52 62 75 46 72  ted by the RbuFr
162d0 61 6d 65 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73  ame object..*/.s
162e0 74 61 74 69 63 20 76 6f 69 64 20 72 62 75 43 68  tatic void rbuCh
162f0 65 63 6b 70 6f 69 6e 74 46 72 61 6d 65 28 73 71  eckpointFrame(sq
16300 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 52 62 75  lite3rbu *p, Rbu
16310 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 29 7b 0a  Frame *pFrame){.
16320 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
16330 70 57 61 6c 20 3d 20 70 2d 3e 70 54 61 72 67 65  pWal = p->pTarge
16340 74 46 64 2d 3e 70 57 61 6c 46 64 2d 3e 70 52 65  tFd->pWalFd->pRe
16350 61 6c 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  al;.  sqlite3_fi
16360 6c 65 20 2a 70 44 62 20 3d 20 70 2d 3e 70 54 61  le *pDb = p->pTa
16370 72 67 65 74 46 64 2d 3e 70 52 65 61 6c 3b 0a 20  rgetFd->pReal;. 
16380 20 69 36 34 20 69 4f 66 66 3b 0a 0a 20 20 61 73   i64 iOff;..  as
16390 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  sert( p->rc==SQL
163a0 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 4f 66 66  ITE_OK );.  iOff
163b0 20 3d 20 28 69 36 34 29 28 70 46 72 61 6d 65 2d   = (i64)(pFrame-
163c0 3e 69 57 61 6c 46 72 61 6d 65 2d 31 29 20 2a 20  >iWalFrame-1) * 
163d0 28 70 2d 3e 70 67 73 7a 20 2b 20 32 34 29 20 2b  (p->pgsz + 24) +
163e0 20 33 32 20 2b 20 32 34 3b 0a 20 20 70 2d 3e 72   32 + 24;.  p->r
163f0 63 20 3d 20 70 57 61 6c 2d 3e 70 4d 65 74 68 6f  c = pWal->pMetho
16400 64 73 2d 3e 78 52 65 61 64 28 70 57 61 6c 2c 20  ds->xRead(pWal, 
16410 70 2d 3e 61 42 75 66 2c 20 70 2d 3e 70 67 73 7a  p->aBuf, p->pgsz
16420 2c 20 69 4f 66 66 29 3b 0a 20 20 69 66 28 20 70  , iOff);.  if( p
16430 2d 3e 72 63 20 29 20 72 65 74 75 72 6e 3b 0a 0a  ->rc ) return;..
16440 20 20 69 4f 66 66 20 3d 20 28 69 36 34 29 28 70    iOff = (i64)(p
16450 46 72 61 6d 65 2d 3e 69 44 62 50 61 67 65 2d 31  Frame->iDbPage-1
16460 29 20 2a 20 70 2d 3e 70 67 73 7a 3b 0a 20 20 70  ) * p->pgsz;.  p
16470 2d 3e 72 63 20 3d 20 70 44 62 2d 3e 70 4d 65 74  ->rc = pDb->pMet
16480 68 6f 64 73 2d 3e 78 57 72 69 74 65 28 70 44 62  hods->xWrite(pDb
16490 2c 20 70 2d 3e 61 42 75 66 2c 20 70 2d 3e 70 67  , p->aBuf, p->pg
164a0 73 7a 2c 20 69 4f 66 66 29 3b 0a 7d 0a 0a 0a 2f  sz, iOff);.}.../
164b0 2a 0a 2a 2a 20 54 61 6b 65 20 61 6e 20 45 58 43  *.** Take an EXC
164c0 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
164d0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
164e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
164f0 20 72 62 75 4c 6f 63 6b 44 61 74 61 62 61 73 65   rbuLockDatabase
16500 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 29 7b  (sqlite3rbu *p){
16510 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
16520 2a 70 52 65 61 6c 20 3d 20 70 2d 3e 70 54 61 72  *pReal = p->pTar
16530 67 65 74 46 64 2d 3e 70 52 65 61 6c 3b 0a 20 20  getFd->pReal;.  
16540 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53  assert( p->rc==S
16550 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 70 2d  QLITE_OK );.  p-
16560 3e 72 63 20 3d 20 70 52 65 61 6c 2d 3e 70 4d 65  >rc = pReal->pMe
16570 74 68 6f 64 73 2d 3e 78 4c 6f 63 6b 28 70 52 65  thods->xLock(pRe
16580 61 6c 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f  al, SQLITE_LOCK_
16590 53 48 41 52 45 44 29 3b 0a 20 20 69 66 28 20 70  SHARED);.  if( p
165a0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
165b0 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 70  ){.    p->rc = p
165c0 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e  Real->pMethods->
165d0 78 4c 6f 63 6b 28 70 52 65 61 6c 2c 20 53 51 4c  xLock(pReal, SQL
165e0 49 54 45 5f 4c 4f 43 4b 5f 45 58 43 4c 55 53 49  ITE_LOCK_EXCLUSI
165f0 56 45 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20  VE);.  }.}..#if 
16600 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 5f 57  defined(_WIN32_W
16610 43 45 29 0a 73 74 61 74 69 63 20 4c 50 57 53 54  CE).static LPWST
16620 52 20 72 62 75 57 69 6e 55 74 66 38 54 6f 55 6e  R rbuWinUtf8ToUn
16630 69 63 6f 64 65 28 63 6f 6e 73 74 20 63 68 61 72  icode(const char
16640 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20   *zFilename){.  
16650 69 6e 74 20 6e 43 68 61 72 3b 0a 20 20 4c 50 57  int nChar;.  LPW
16660 53 54 52 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d  STR zWideFilenam
16670 65 3b 0a 0a 20 20 6e 43 68 61 72 20 3d 20 4d 75  e;..  nChar = Mu
16680 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 61  ltiByteToWideCha
16690 72 28 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 46  r(CP_UTF8, 0, zF
166a0 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 4e 55 4c  ilename, -1, NUL
166b0 4c 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e 43 68  L, 0);.  if( nCh
166c0 61 72 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ar==0 ){.    ret
166d0 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 57 69  urn 0;.  }.  zWi
166e0 64 65 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c  deFilename = sql
166f0 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 6e  ite3_malloc64( n
16700 43 68 61 72 2a 73 69 7a 65 6f 66 28 7a 57 69 64  Char*sizeof(zWid
16710 65 46 69 6c 65 6e 61 6d 65 5b 30 5d 29 20 29 3b  eFilename[0]) );
16720 0a 20 20 69 66 28 20 7a 57 69 64 65 46 69 6c 65  .  if( zWideFile
16730 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72  name==0 ){.    r
16740 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6d  eturn 0;.  }.  m
16750 65 6d 73 65 74 28 7a 57 69 64 65 46 69 6c 65 6e  emset(zWideFilen
16760 61 6d 65 2c 20 30 2c 20 6e 43 68 61 72 2a 73 69  ame, 0, nChar*si
16770 7a 65 6f 66 28 7a 57 69 64 65 46 69 6c 65 6e 61  zeof(zWideFilena
16780 6d 65 5b 30 5d 29 29 3b 0a 20 20 6e 43 68 61 72  me[0]));.  nChar
16790 20 3d 20 4d 75 6c 74 69 42 79 74 65 54 6f 57 69   = MultiByteToWi
167a0 64 65 43 68 61 72 28 43 50 5f 55 54 46 38 2c 20  deChar(CP_UTF8, 
167b0 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31  0, zFilename, -1
167c0 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c  , zWideFilename,
167d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
167e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
167f0 20 6e 43 68 61 72 29 3b 0a 20 20 69 66 28 20 6e   nChar);.  if( n
16800 43 68 61 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73  Char==0 ){.    s
16810 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 57 69 64  qlite3_free(zWid
16820 65 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  eFilename);.    
16830 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 20 3d 20  zWideFilename = 
16840 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
16850 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 3b 0a 7d  zWideFilename;.}
16860 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
16870 68 65 20 52 42 55 20 68 61 6e 64 6c 65 20 69 73  he RBU handle is
16880 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 52 42   currently in RB
16890 55 5f 53 54 41 47 45 5f 4f 41 4c 20 73 74 61 74  U_STAGE_OAL stat
168a0 65 2c 20 77 69 74 68 20 61 20 53 48 41 52 45 44  e, with a SHARED
168b0 20 6c 6f 63 6b 0a 2a 2a 20 6f 6e 20 74 68 65 20   lock.** on the 
168c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54  database file. T
168d0 68 69 73 20 70 72 6f 63 20 6d 6f 76 65 73 20 74  his proc moves t
168e0 68 65 20 2a 2d 6f 61 6c 20 66 69 6c 65 20 74 6f  he *-oal file to
168f0 20 74 68 65 20 2a 2d 77 61 6c 20 70 61 74 68 2c   the *-wal path,
16900 0a 2a 2a 20 74 68 65 6e 20 72 65 6f 70 65 6e 73  .** then reopens
16910 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
16920 6c 65 20 28 74 68 69 73 20 74 69 6d 65 20 69 6e  le (this time in
16930 20 76 61 6e 69 6c 6c 61 2c 20 6e 6f 6e 2d 6f 61   vanilla, non-oa
16940 6c 2c 20 57 41 4c 20 6d 6f 64 65 29 2e 0a 2a 2a  l, WAL mode)..**
16950 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
16960 75 72 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72  urs, leave an er
16970 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 65 72 72  ror code and err
16980 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 74 68  or message in th
16990 65 20 72 62 75 20 0a 2a 2a 20 68 61 6e 64 6c 65  e rbu .** handle
169a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
169b0 20 72 62 75 4d 6f 76 65 4f 61 6c 46 69 6c 65 28   rbuMoveOalFile(
169c0 73 71 6c 69 74 65 33 72 62 75 20 2a 70 29 7b 0a  sqlite3rbu *p){.
169d0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42    const char *zB
169e0 61 73 65 20 3d 20 73 71 6c 69 74 65 33 5f 64 62  ase = sqlite3_db
169f0 5f 66 69 6c 65 6e 61 6d 65 28 70 2d 3e 64 62 4d  _filename(p->dbM
16a00 61 69 6e 2c 20 22 6d 61 69 6e 22 29 3b 0a 20 20  ain, "main");.  
16a10 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 6f 76  const char *zMov
16a20 65 20 3d 20 7a 42 61 73 65 3b 0a 20 20 63 68 61  e = zBase;.  cha
16a30 72 20 2a 7a 4f 61 6c 3b 0a 20 20 63 68 61 72 20  r *zOal;.  char 
16a40 2a 7a 57 61 6c 3b 0a 0a 20 20 69 66 28 20 72 62  *zWal;..  if( rb
16a50 75 49 73 56 61 63 75 75 6d 28 70 29 20 29 7b 0a  uIsVacuum(p) ){.
16a60 20 20 20 20 7a 4d 6f 76 65 20 3d 20 73 71 6c 69      zMove = sqli
16a70 74 65 33 5f 64 62 5f 66 69 6c 65 6e 61 6d 65 28  te3_db_filename(
16a80 70 2d 3e 64 62 52 62 75 2c 20 22 6d 61 69 6e 22  p->dbRbu, "main"
16a90 29 3b 0a 20 20 7d 0a 20 20 7a 4f 61 6c 20 3d 20  );.  }.  zOal = 
16aa0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
16ab0 22 25 73 2d 6f 61 6c 22 2c 20 7a 4d 6f 76 65 29  "%s-oal", zMove)
16ac0 3b 0a 20 20 7a 57 61 6c 20 3d 20 73 71 6c 69 74  ;.  zWal = sqlit
16ad0 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 2d 77  e3_mprintf("%s-w
16ae0 61 6c 22 2c 20 7a 4d 6f 76 65 29 3b 0a 0a 20 20  al", zMove);..  
16af0 61 73 73 65 72 74 28 20 70 2d 3e 65 53 74 61 67  assert( p->eStag
16b00 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4d 4f 56  e==RBU_STAGE_MOV
16b10 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  E );.  assert( p
16b20 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
16b30 26 26 20 70 2d 3e 7a 45 72 72 6d 73 67 3d 3d 30  && p->zErrmsg==0
16b40 20 29 3b 0a 20 20 69 66 28 20 7a 57 61 6c 3d 3d   );.  if( zWal==
16b50 30 20 7c 7c 20 7a 4f 61 6c 3d 3d 30 20 29 7b 0a  0 || zOal==0 ){.
16b60 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
16b70 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73  TE_NOMEM;.  }els
16b80 65 7b 0a 20 20 20 20 2f 2a 20 4d 6f 76 65 20 74  e{.    /* Move t
16b90 68 65 20 2a 2d 6f 61 6c 20 66 69 6c 65 20 74 6f  he *-oal file to
16ba0 20 2a 2d 77 61 6c 2e 20 41 74 20 74 68 69 73 20   *-wal. At this 
16bb0 70 6f 69 6e 74 20 63 6f 6e 6e 65 63 74 69 6f 6e  point connection
16bc0 20 70 2d 3e 64 62 20 69 73 0a 20 20 20 20 2a 2a   p->db is.    **
16bd0 20 68 6f 6c 64 69 6e 67 20 61 20 53 48 41 52 45   holding a SHARE
16be0 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61  D lock on the ta
16bf0 72 67 65 74 20 64 61 74 61 62 61 73 65 20 66 69  rget database fi
16c00 6c 65 20 28 62 65 63 61 75 73 65 20 69 74 20 69  le (because it i
16c10 73 0a 20 20 20 20 2a 2a 20 69 6e 20 57 41 4c 20  s.    ** in WAL 
16c20 6d 6f 64 65 29 2e 20 53 6f 20 6e 6f 20 6f 74 68  mode). So no oth
16c30 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61  er connection ma
16c40 79 20 62 65 20 77 72 69 74 69 6e 67 20 74 68 65  y be writing the
16c50 20 64 62 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20   db. .    **.   
16c60 20 2a 2a 20 49 6e 20 6f 72 64 65 72 20 74 6f 20   ** In order to 
16c70 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 72  ensure that ther
16c80 65 20 61 72 65 20 6e 6f 20 64 61 74 61 62 61 73  e are no databas
16c90 65 20 72 65 61 64 65 72 73 2c 20 61 6e 20 45 58  e readers, an EX
16ca0 43 4c 55 53 49 56 45 0a 20 20 20 20 2a 2a 20 6c  CLUSIVE.    ** l
16cb0 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ock is obtained 
16cc0 68 65 72 65 20 62 65 66 6f 72 65 20 74 68 65 20  here before the 
16cd0 2a 2d 6f 61 6c 20 69 73 20 6d 6f 76 65 64 20 74  *-oal is moved t
16ce0 6f 20 2a 2d 77 61 6c 2e 0a 20 20 20 20 2a 2f 0a  o *-wal..    */.
16cf0 20 20 20 20 72 62 75 4c 6f 63 6b 44 61 74 61 62      rbuLockDatab
16d00 61 73 65 28 70 29 3b 0a 20 20 20 20 69 66 28 20  ase(p);.    if( 
16d10 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
16d20 20 29 7b 0a 20 20 20 20 20 20 72 62 75 46 69 6c   ){.      rbuFil
16d30 65 53 75 66 66 69 78 33 28 7a 42 61 73 65 2c 20  eSuffix3(zBase, 
16d40 7a 57 61 6c 29 3b 0a 20 20 20 20 20 20 72 62 75  zWal);.      rbu
16d50 46 69 6c 65 53 75 66 66 69 78 33 28 7a 42 61 73  FileSuffix3(zBas
16d60 65 2c 20 7a 4f 61 6c 29 3b 0a 0a 20 20 20 20 20  e, zOal);..     
16d70 20 2f 2a 20 52 65 2d 6f 70 65 6e 20 74 68 65 20   /* Re-open the 
16d80 64 61 74 61 62 61 73 65 73 2e 20 2a 2f 0a 20 20  databases. */.  
16d90 20 20 20 20 72 62 75 4f 62 6a 49 74 65 72 46 69      rbuObjIterFi
16da0 6e 61 6c 69 7a 65 28 26 70 2d 3e 6f 62 6a 69 74  nalize(&p->objit
16db0 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  er);.      sqlit
16dc0 65 33 5f 63 6c 6f 73 65 28 70 2d 3e 64 62 52 62  e3_close(p->dbRb
16dd0 75 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  u);.      sqlite
16de0 33 5f 63 6c 6f 73 65 28 70 2d 3e 64 62 4d 61 69  3_close(p->dbMai
16df0 6e 29 3b 0a 20 20 20 20 20 20 70 2d 3e 64 62 4d  n);.      p->dbM
16e00 61 69 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ain = 0;.      p
16e10 2d 3e 64 62 52 62 75 20 3d 20 30 3b 0a 0a 23 69  ->dbRbu = 0;..#i
16e20 66 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32  f defined(_WIN32
16e30 5f 57 43 45 29 0a 20 20 20 20 20 20 7b 0a 20 20  _WCE).      {.  
16e40 20 20 20 20 20 20 4c 50 57 53 54 52 20 7a 57 69        LPWSTR zWi
16e50 64 65 4f 61 6c 3b 0a 20 20 20 20 20 20 20 20 4c  deOal;.        L
16e60 50 57 53 54 52 20 7a 57 69 64 65 57 61 6c 3b 0a  PWSTR zWideWal;.
16e70 0a 20 20 20 20 20 20 20 20 7a 57 69 64 65 4f 61  .        zWideOa
16e80 6c 20 3d 20 72 62 75 57 69 6e 55 74 66 38 54 6f  l = rbuWinUtf8To
16e90 55 6e 69 63 6f 64 65 28 7a 4f 61 6c 29 3b 0a 20  Unicode(zOal);. 
16ea0 20 20 20 20 20 20 20 69 66 28 20 7a 57 69 64 65         if( zWide
16eb0 4f 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Oal ){.         
16ec0 20 7a 57 69 64 65 57 61 6c 20 3d 20 72 62 75 57   zWideWal = rbuW
16ed0 69 6e 55 74 66 38 54 6f 55 6e 69 63 6f 64 65 28  inUtf8ToUnicode(
16ee0 7a 57 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 20  zWal);.         
16ef0 20 69 66 28 20 7a 57 69 64 65 57 61 6c 20 29 7b   if( zWideWal ){
16f00 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
16f10 20 4d 6f 76 65 46 69 6c 65 57 28 7a 57 69 64 65   MoveFileW(zWide
16f20 4f 61 6c 2c 20 7a 57 69 64 65 57 61 6c 29 20 29  Oal, zWideWal) )
16f30 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
16f40 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  p->rc = SQLITE_O
16f50 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  K;.            }
16f60 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
16f70 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
16f80 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 20 20  TE_IOERR;.      
16f90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
16fa0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
16fb0 28 7a 57 69 64 65 57 61 6c 29 3b 0a 20 20 20 20  (zWideWal);.    
16fc0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
16fd0 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d           p->rc =
16fe0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
16ff0 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  MEM;.          }
17000 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
17010 65 33 5f 66 72 65 65 28 7a 57 69 64 65 4f 61 6c  e3_free(zWideOal
17020 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
17030 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72  {.          p->r
17040 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
17050 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
17060 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6c 73 65 0a  }.      }.#else.
17070 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 65        p->rc = re
17080 6e 61 6d 65 28 7a 4f 61 6c 2c 20 7a 57 61 6c 29  name(zOal, zWal)
17090 20 3f 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20   ? SQLITE_IOERR 
170a0 3a 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e  : SQLITE_OK;.#en
170b0 64 69 66 0a 0a 20 20 20 20 20 20 69 66 28 20 70  dif..      if( p
170c0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
170d0 29 7b 0a 20 20 20 20 20 20 20 20 72 62 75 4f 70  ){.        rbuOp
170e0 65 6e 44 61 74 61 62 61 73 65 28 70 2c 20 30 29  enDatabase(p, 0)
170f0 3b 0a 20 20 20 20 20 20 20 20 72 62 75 53 65 74  ;.        rbuSet
17100 75 70 43 68 65 63 6b 70 6f 69 6e 74 28 70 2c 20  upCheckpoint(p, 
17110 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
17120 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  }.  }..  sqlite3
17130 5f 66 72 65 65 28 7a 57 61 6c 29 3b 0a 20 20 73  _free(zWal);.  s
17140 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 61 6c  qlite3_free(zOal
17150 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  );.}../*.** The 
17160 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
17170 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75   iterating throu
17180 67 68 20 74 68 65 20 6b 65 79 73 20 66 6f 72 20  gh the keys for 
17190 74 68 65 20 63 75 72 72 65 6e 74 20 6f 62 6a 65  the current obje
171a0 63 74 0a 2a 2a 20 28 70 2d 3e 6f 62 6a 69 74 65  ct.** (p->objite
171b0 72 2e 70 53 65 6c 65 63 74 29 20 63 75 72 72 65  r.pSelect) curre
171c0 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 61  ntly points to a
171d0 20 76 61 6c 69 64 20 72 6f 77 2e 20 54 68 69 73   valid row. This
171e0 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 64 65 74   function.** det
171f0 65 72 6d 69 6e 65 73 20 74 68 65 20 74 79 70 65  ermines the type
17200 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 20 72 65   of operation re
17210 71 75 65 73 74 65 64 20 62 79 20 74 68 69 73 20  quested by this 
17220 72 6f 77 20 61 6e 64 20 72 65 74 75 72 6e 73 0a  row and returns.
17230 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f  ** one of the fo
17240 6c 6c 6f 77 69 6e 67 20 76 61 6c 75 65 73 20 74  llowing values t
17250 6f 20 69 6e 64 69 63 61 74 65 20 74 68 65 20 72  o indicate the r
17260 65 73 75 6c 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  esult:.**.**    
17270 20 2a 20 52 42 55 5f 49 4e 53 45 52 54 0a 2a 2a   * RBU_INSERT.**
17280 20 20 20 20 20 2a 20 52 42 55 5f 44 45 4c 45 54       * RBU_DELET
17290 45 0a 2a 2a 20 20 20 20 20 2a 20 52 42 55 5f 49  E.**     * RBU_I
172a0 44 58 5f 44 45 4c 45 54 45 0a 2a 2a 20 20 20 20  DX_DELETE.**    
172b0 20 2a 20 52 42 55 5f 55 50 44 41 54 45 0a 2a 2a   * RBU_UPDATE.**
172c0 0a 2a 2a 20 49 66 20 52 42 55 5f 55 50 44 41 54  .** If RBU_UPDAT
172d0 45 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74  E is returned, t
172e0 68 65 6e 20 6f 75 74 70 75 74 20 76 61 72 69 61  hen output varia
172f0 62 6c 65 20 2a 70 7a 4d 61 73 6b 20 69 73 20 73  ble *pzMask is s
17300 65 74 20 74 6f 0a 2a 2a 20 70 6f 69 6e 74 20 74  et to.** point t
17310 6f 20 74 68 65 20 74 65 78 74 20 76 61 6c 75 65  o the text value
17320 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 65 20   indicating the 
17330 63 6f 6c 75 6d 6e 73 20 74 6f 20 75 70 64 61 74  columns to updat
17340 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
17350 72 62 75 5f 63 6f 6e 74 72 6f 6c 20 66 69 65 6c  rbu_control fiel
17360 64 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6e  d contains an in
17370 76 61 6c 69 64 20 76 61 6c 75 65 2c 20 61 6e 20  valid value, an 
17380 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 0a 2a  error code and.*
17390 2a 20 6d 65 73 73 61 67 65 20 61 72 65 20 6c 65  * message are le
173a0 66 74 20 69 6e 20 74 68 65 20 52 42 55 20 68 61  ft in the RBU ha
173b0 6e 64 6c 65 20 61 6e 64 20 7a 65 72 6f 20 72 65  ndle and zero re
173c0 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
173d0 63 20 69 6e 74 20 72 62 75 53 74 65 70 54 79 70  c int rbuStepTyp
173e0 65 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c  e(sqlite3rbu *p,
173f0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a   const char **pz
17400 4d 61 73 6b 29 7b 0a 20 20 69 6e 74 20 69 43 6f  Mask){.  int iCo
17410 6c 20 3d 20 70 2d 3e 6f 62 6a 69 74 65 72 2e 6e  l = p->objiter.n
17420 43 6f 6c 3b 20 20 20 20 20 2f 2a 20 49 6e 64 65  Col;     /* Inde
17430 78 20 6f 66 20 72 62 75 5f 63 6f 6e 74 72 6f 6c  x of rbu_control
17440 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74   column */.  int
17450 20 72 65 73 20 3d 20 30 3b 20 20 20 20 20 20 20   res = 0;       
17460 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17470 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a  Return value */.
17480 0a 20 20 73 77 69 74 63 68 28 20 73 71 6c 69 74  .  switch( sqlit
17490 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70  e3_column_type(p
174a0 2d 3e 6f 62 6a 69 74 65 72 2e 70 53 65 6c 65 63  ->objiter.pSelec
174b0 74 2c 20 69 43 6f 6c 29 20 29 7b 0a 20 20 20 20  t, iCol) ){.    
174c0 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45  case SQLITE_INTE
174d0 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  GER: {.      int
174e0 20 69 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f   iVal = sqlite3_
174f0 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 2d 3e 6f 62  column_int(p->ob
17500 6a 69 74 65 72 2e 70 53 65 6c 65 63 74 2c 20 69  jiter.pSelect, i
17510 43 6f 6c 29 3b 0a 20 20 20 20 20 20 73 77 69 74  Col);.      swit
17520 63 68 28 20 69 56 61 6c 20 29 7b 0a 20 20 20 20  ch( iVal ){.    
17530 20 20 20 20 63 61 73 65 20 30 3a 20 72 65 73 20      case 0: res 
17540 3d 20 52 42 55 5f 49 4e 53 45 52 54 3b 20 20 20  = RBU_INSERT;   
17550 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
17560 20 63 61 73 65 20 31 3a 20 72 65 73 20 3d 20 52   case 1: res = R
17570 42 55 5f 44 45 4c 45 54 45 3b 20 20 20 20 20 62  BU_DELETE;     b
17580 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61  reak;.        ca
17590 73 65 20 32 3a 20 72 65 73 20 3d 20 52 42 55 5f  se 2: res = RBU_
175a0 52 45 50 4c 41 43 45 3b 20 20 20 20 62 72 65 61  REPLACE;    brea
175b0 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  k;.        case 
175c0 33 3a 20 72 65 73 20 3d 20 52 42 55 5f 49 44 58  3: res = RBU_IDX
175d0 5f 44 45 4c 45 54 45 3b 20 62 72 65 61 6b 3b 0a  _DELETE; break;.
175e0 20 20 20 20 20 20 20 20 63 61 73 65 20 34 3a 20          case 4: 
175f0 72 65 73 20 3d 20 52 42 55 5f 49 44 58 5f 49 4e  res = RBU_IDX_IN
17600 53 45 52 54 3b 20 62 72 65 61 6b 3b 0a 20 20 20  SERT; break;.   
17610 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
17620 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73  ;.    }..    cas
17630 65 20 53 51 4c 49 54 45 5f 54 45 58 54 3a 20 7b  e SQLITE_TEXT: {
17640 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75 6e 73  .      const uns
17650 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 20 3d 20  igned char *z = 
17660 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
17670 65 78 74 28 70 2d 3e 6f 62 6a 69 74 65 72 2e 70  ext(p->objiter.p
17680 53 65 6c 65 63 74 2c 20 69 43 6f 6c 29 3b 0a 20  Select, iCol);. 
17690 20 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b       if( z==0 ){
176a0 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  .        p->rc =
176b0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
176c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
176d0 20 20 20 20 2a 70 7a 4d 61 73 6b 20 3d 20 28 63      *pzMask = (c
176e0 6f 6e 73 74 20 63 68 61 72 2a 29 7a 3b 0a 20 20  onst char*)z;.  
176f0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 73 20      }.      res 
17700 3d 20 52 42 55 5f 55 50 44 41 54 45 3b 0a 0a 20  = RBU_UPDATE;.. 
17710 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
17720 7d 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  }..    default:.
17730 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d        break;.  }
17740 0a 0a 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29  ..  if( res==0 )
17750 7b 0a 20 20 20 20 72 62 75 42 61 64 43 6f 6e 74  {.    rbuBadCont
17760 72 6f 6c 45 72 72 6f 72 28 70 29 3b 0a 20 20 7d  rolError(p);.  }
17770 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d  .  return res;.}
17780 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
17790 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 41 73 73 65  DEBUG./*.** Asse
177a0 72 74 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 69  rt that column i
177b0 43 6f 6c 20 6f 66 20 73 74 61 74 65 6d 65 6e 74  Col of statement
177c0 20 70 53 74 6d 74 20 69 73 20 6e 61 6d 65 64 20   pStmt is named 
177d0 7a 4e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  zName..*/.static
177e0 20 76 6f 69 64 20 61 73 73 65 72 74 43 6f 6c 75   void assertColu
177f0 6d 6e 4e 61 6d 65 28 73 71 6c 69 74 65 33 5f 73  mnName(sqlite3_s
17800 74 6d 74 20 2a 70 53 74 6d 74 2c 20 69 6e 74 20  tmt *pStmt, int 
17810 69 43 6f 6c 2c 20 63 6f 6e 73 74 20 63 68 61 72  iCol, const char
17820 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 63 6f 6e 73   *zName){.  cons
17830 74 20 63 68 61 72 20 2a 7a 43 6f 6c 20 3d 20 73  t char *zCol = s
17840 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61  qlite3_column_na
17850 6d 65 28 70 53 74 6d 74 2c 20 69 43 6f 6c 29 3b  me(pStmt, iCol);
17860 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 73 71  .  assert( 0==sq
17870 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 4e  lite3_stricmp(zN
17880 61 6d 65 2c 20 7a 43 6f 6c 29 20 29 3b 0a 7d 0a  ame, zCol) );.}.
17890 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 61  #else.# define a
178a0 73 73 65 72 74 43 6f 6c 75 6d 6e 4e 61 6d 65 28  ssertColumnName(
178b0 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 2f  x,y,z).#endif../
178c0 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 65 54  *.** Argument eT
178d0 79 70 65 20 6d 75 73 74 20 62 65 20 6f 6e 65 20  ype must be one 
178e0 6f 66 20 52 42 55 5f 49 4e 53 45 52 54 2c 20 52  of RBU_INSERT, R
178f0 42 55 5f 44 45 4c 45 54 45 2c 20 52 42 55 5f 49  BU_DELETE, RBU_I
17900 44 58 5f 49 4e 53 45 52 54 20 6f 72 0a 2a 2a 20  DX_INSERT or.** 
17910 52 42 55 5f 49 44 58 5f 44 45 4c 45 54 45 2e 20  RBU_IDX_DELETE. 
17920 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 70 65  This function pe
17930 72 66 6f 72 6d 73 20 74 68 65 20 77 6f 72 6b 20  rforms the work 
17940 6f 66 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 73  of a single.** s
17950 71 6c 69 74 65 33 72 62 75 5f 73 74 65 70 28 29  qlite3rbu_step()
17960 20 63 61 6c 6c 20 66 6f 72 20 74 68 65 20 74 79   call for the ty
17970 70 65 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 20  pe of operation 
17980 73 70 65 63 69 66 69 65 64 20 62 79 20 65 54 79  specified by eTy
17990 70 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  pe..*/.static vo
179a0 69 64 20 72 62 75 53 74 65 70 4f 6e 65 4f 70 28  id rbuStepOneOp(
179b0 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 69  sqlite3rbu *p, i
179c0 6e 74 20 65 54 79 70 65 29 7b 0a 20 20 52 62 75  nt eType){.  Rbu
179d0 4f 62 6a 49 74 65 72 20 2a 70 49 74 65 72 20 3d  ObjIter *pIter =
179e0 20 26 70 2d 3e 6f 62 6a 69 74 65 72 3b 0a 20 20   &p->objiter;.  
179f0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
17a00 56 61 6c 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  Val;.  sqlite3_s
17a10 74 6d 74 20 2a 70 57 72 69 74 65 72 3b 0a 20 20  tmt *pWriter;.  
17a20 69 6e 74 20 69 3b 0a 0a 20 20 61 73 73 65 72 74  int i;..  assert
17a30 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
17a40 4f 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  OK );.  assert( 
17a50 65 54 79 70 65 21 3d 52 42 55 5f 44 45 4c 45 54  eType!=RBU_DELET
17a60 45 20 7c 7c 20 70 49 74 65 72 2d 3e 7a 49 64 78  E || pIter->zIdx
17a70 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
17a80 20 65 54 79 70 65 3d 3d 52 42 55 5f 44 45 4c 45   eType==RBU_DELE
17a90 54 45 20 7c 7c 20 65 54 79 70 65 3d 3d 52 42 55  TE || eType==RBU
17aa0 5f 49 44 58 5f 44 45 4c 45 54 45 0a 20 20 20 20  _IDX_DELETE.    
17ab0 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 52 42 55     || eType==RBU
17ac0 5f 49 4e 53 45 52 54 20 7c 7c 20 65 54 79 70 65  _INSERT || eType
17ad0 3d 3d 52 42 55 5f 49 44 58 5f 49 4e 53 45 52 54  ==RBU_IDX_INSERT
17ae0 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  .  );..  /* If t
17af0 68 69 73 20 69 73 20 61 20 64 65 6c 65 74 65 2c  his is a delete,
17b00 20 64 65 63 72 65 6d 65 6e 74 20 6e 50 68 61 73   decrement nPhas
17b10 65 4f 6e 65 53 74 65 70 20 62 79 20 6e 49 6e 64  eOneStep by nInd
17b20 65 78 2e 20 49 66 20 74 68 65 20 44 45 4c 45 54  ex. If the DELET
17b30 45 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74  E.  ** statement
17b40 20 62 65 6c 6f 77 20 64 6f 65 73 20 61 63 74 75   below does actu
17b50 61 6c 6c 79 20 64 65 6c 65 74 65 20 61 20 72 6f  ally delete a ro
17b60 77 2c 20 6e 50 68 61 73 65 4f 6e 65 53 74 65 70  w, nPhaseOneStep
17b70 20 77 69 6c 6c 20 62 65 0a 20 20 2a 2a 20 69 6e   will be.  ** in
17b80 63 72 65 6d 65 6e 74 65 64 20 62 79 20 74 68 65  cremented by the
17b90 20 73 61 6d 65 20 61 6d 6f 75 6e 74 20 77 68 65   same amount whe
17ba0 6e 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 72  n SQL function r
17bb0 62 75 5f 74 6d 70 5f 69 6e 73 65 72 74 28 29 0a  bu_tmp_insert().
17bc0 20 20 2a 2a 20 69 73 20 69 6e 76 6f 6b 65 64 20    ** is invoked 
17bd0 62 79 20 74 68 65 20 74 72 69 67 67 65 72 2e 20  by the trigger. 
17be0 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d   */.  if( eType=
17bf0 3d 52 42 55 5f 44 45 4c 45 54 45 20 29 7b 0a 20  =RBU_DELETE ){. 
17c00 20 20 20 70 2d 3e 6e 50 68 61 73 65 4f 6e 65 53     p->nPhaseOneS
17c10 74 65 70 20 2d 3d 20 70 2d 3e 6f 62 6a 69 74 65  tep -= p->objite
17c20 72 2e 6e 49 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20  r.nIndex;.  }.. 
17c30 20 69 66 28 20 65 54 79 70 65 3d 3d 52 42 55 5f   if( eType==RBU_
17c40 49 44 58 5f 44 45 4c 45 54 45 20 7c 7c 20 65 54  IDX_DELETE || eT
17c50 79 70 65 3d 3d 52 42 55 5f 44 45 4c 45 54 45 20  ype==RBU_DELETE 
17c60 29 7b 0a 20 20 20 20 70 57 72 69 74 65 72 20 3d  ){.    pWriter =
17c70 20 70 49 74 65 72 2d 3e 70 44 65 6c 65 74 65 3b   pIter->pDelete;
17c80 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 57  .  }else{.    pW
17c90 72 69 74 65 72 20 3d 20 70 49 74 65 72 2d 3e 70  riter = pIter->p
17ca0 49 6e 73 65 72 74 3b 0a 20 20 7d 0a 0a 20 20 66  Insert;.  }..  f
17cb0 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d  or(i=0; i<pIter-
17cc0 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCol; i++){.   
17cd0 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
17ce0 6e 20 49 4e 53 45 52 54 20 69 6e 74 6f 20 61 20  n INSERT into a 
17cf0 74 61 62 6c 65 20 62 2d 74 72 65 65 20 61 6e 64  table b-tree and
17d00 20 74 68 65 20 74 61 62 6c 65 20 68 61 73 20 61   the table has a
17d10 6e 0a 20 20 20 20 2a 2a 20 65 78 70 6c 69 63 69  n.    ** explici
17d20 74 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  t INTEGER PRIMAR
17d30 59 20 4b 45 59 2c 20 63 68 65 63 6b 20 74 68 61  Y KEY, check tha
17d40 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 6e  t this is not an
17d50 20 61 74 74 65 6d 70 74 0a 20 20 20 20 2a 2a 20   attempt.    ** 
17d60 74 6f 20 77 72 69 74 65 20 61 20 4e 55 4c 4c 20  to write a NULL 
17d70 69 6e 74 6f 20 74 68 65 20 49 50 4b 20 63 6f 6c  into the IPK col
17d80 75 6d 6e 2e 20 54 68 61 74 20 69 73 20 6e 6f 74  umn. That is not
17d90 20 70 65 72 6d 69 74 74 65 64 2e 20 20 2a 2f 0a   permitted.  */.
17da0 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 52      if( eType==R
17db0 42 55 5f 49 4e 53 45 52 54 20 0a 20 20 20 20 20  BU_INSERT .     
17dc0 26 26 20 70 49 74 65 72 2d 3e 7a 49 64 78 3d 3d  && pIter->zIdx==
17dd0 30 20 26 26 20 70 49 74 65 72 2d 3e 65 54 79 70  0 && pIter->eTyp
17de0 65 3d 3d 52 42 55 5f 50 4b 5f 49 50 4b 20 26 26  e==RBU_PK_IPK &&
17df0 20 70 49 74 65 72 2d 3e 61 62 54 62 6c 50 6b 5b   pIter->abTblPk[
17e00 69 5d 20 0a 20 20 20 20 20 26 26 20 73 71 6c 69  i] .     && sqli
17e10 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28  te3_column_type(
17e20 70 49 74 65 72 2d 3e 70 53 65 6c 65 63 74 2c 20  pIter->pSelect, 
17e30 69 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 0a  i)==SQLITE_NULL.
17e40 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e      ){.      p->
17e50 72 63 20 3d 20 53 51 4c 49 54 45 5f 4d 49 53 4d  rc = SQLITE_MISM
17e60 41 54 43 48 3b 0a 20 20 20 20 20 20 70 2d 3e 7a  ATCH;.      p->z
17e70 45 72 72 6d 73 67 20 3d 20 73 71 6c 69 74 65 33  Errmsg = sqlite3
17e80 5f 6d 70 72 69 6e 74 66 28 22 64 61 74 61 74 79  _mprintf("dataty
17e90 70 65 20 6d 69 73 6d 61 74 63 68 22 29 3b 0a 20  pe mismatch");. 
17ea0 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
17eb0 20 7d 0a 0a 20 20 20 20 69 66 28 20 65 54 79 70   }..    if( eTyp
17ec0 65 3d 3d 52 42 55 5f 44 45 4c 45 54 45 20 26 26  e==RBU_DELETE &&
17ed0 20 70 49 74 65 72 2d 3e 61 62 54 62 6c 50 6b 5b   pIter->abTblPk[
17ee0 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63  i]==0 ){.      c
17ef0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a  ontinue;.    }..
17f00 20 20 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74      pVal = sqlit
17f10 65 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28  e3_column_value(
17f20 70 49 74 65 72 2d 3e 70 53 65 6c 65 63 74 2c 20  pIter->pSelect, 
17f30 69 29 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20  i);.    p->rc = 
17f40 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 76 61 6c  sqlite3_bind_val
17f50 75 65 28 70 57 72 69 74 65 72 2c 20 69 2b 31 2c  ue(pWriter, i+1,
17f60 20 70 56 61 6c 29 3b 0a 20 20 20 20 69 66 28 20   pVal);.    if( 
17f70 70 2d 3e 72 63 20 29 20 72 65 74 75 72 6e 3b 0a  p->rc ) return;.
17f80 20 20 7d 0a 20 20 69 66 28 20 70 49 74 65 72 2d    }.  if( pIter-
17f90 3e 7a 49 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20  >zIdx==0 ){.    
17fa0 69 66 28 20 70 49 74 65 72 2d 3e 65 54 79 70 65  if( pIter->eType
17fb0 3d 3d 52 42 55 5f 50 4b 5f 56 54 41 42 20 0a 20  ==RBU_PK_VTAB . 
17fc0 20 20 20 20 7c 7c 20 70 49 74 65 72 2d 3e 65 54      || pIter->eT
17fd0 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 4e 4f 4e 45  ype==RBU_PK_NONE
17fe0 20 0a 20 20 20 20 20 7c 7c 20 28 70 49 74 65 72   .     || (pIter
17ff0 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f  ->eType==RBU_PK_
18000 45 58 54 45 52 4e 41 4c 20 26 26 20 72 62 75 49  EXTERNAL && rbuI
18010 73 56 61 63 75 75 6d 28 70 29 29 20 0a 20 20 20  sVacuum(p)) .   
18020 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72   ){.      /* For
18030 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
18040 2c 20 6f 72 20 61 20 74 61 62 6c 65 20 77 69 74  , or a table wit
18050 68 20 6e 6f 20 70 72 69 6d 61 72 79 20 6b 65 79  h no primary key
18060 2c 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  , the .      ** 
18070 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
18080 20 69 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20   is:.      **.  
18090 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20      **   SELECT 
180a0 3c 63 6f 6c 73 3e 2c 20 72 62 75 5f 63 6f 6e 74  <cols>, rbu_cont
180b0 72 6f 6c 2c 20 72 62 75 5f 72 6f 77 69 64 20 46  rol, rbu_rowid F
180c0 52 4f 4d 20 2e 2e 2e 2e 0a 20 20 20 20 20 20 2a  ROM .....      *
180d0 2a 0a 20 20 20 20 20 20 2a 2a 20 48 65 6e 63 65  *.      ** Hence
180e0 20 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28 70 49   column_value(pI
180f0 74 65 72 2d 3e 6e 43 6f 6c 2b 31 29 2e 0a 20 20  ter->nCol+1)..  
18100 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73      */.      ass
18110 65 72 74 43 6f 6c 75 6d 6e 4e 61 6d 65 28 70 49  ertColumnName(pI
18120 74 65 72 2d 3e 70 53 65 6c 65 63 74 2c 20 70 49  ter->pSelect, pI
18130 74 65 72 2d 3e 6e 43 6f 6c 2b 31 2c 20 0a 20 20  ter->nCol+1, .  
18140 20 20 20 20 20 20 20 20 72 62 75 49 73 56 61 63          rbuIsVac
18150 75 75 6d 28 70 29 20 3f 20 22 72 6f 77 69 64 22  uum(p) ? "rowid"
18160 20 3a 20 22 72 62 75 5f 72 6f 77 69 64 22 0a 20   : "rbu_rowid". 
18170 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 70 56       );.      pV
18180 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  al = sqlite3_col
18190 75 6d 6e 5f 76 61 6c 75 65 28 70 49 74 65 72 2d  umn_value(pIter-
181a0 3e 70 53 65 6c 65 63 74 2c 20 70 49 74 65 72 2d  >pSelect, pIter-
181b0 3e 6e 43 6f 6c 2b 31 29 3b 0a 20 20 20 20 20 20  >nCol+1);.      
181c0 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  p->rc = sqlite3_
181d0 62 69 6e 64 5f 76 61 6c 75 65 28 70 57 72 69 74  bind_value(pWrit
181e0 65 72 2c 20 70 49 74 65 72 2d 3e 6e 43 6f 6c 2b  er, pIter->nCol+
181f0 31 2c 20 70 56 61 6c 29 3b 0a 20 20 20 20 7d 0a  1, pVal);.    }.
18200 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d    }.  if( p->rc=
18210 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18220 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70    sqlite3_step(p
18230 57 72 69 74 65 72 29 3b 0a 20 20 20 20 70 2d 3e  Writer);.    p->
18240 72 63 20 3d 20 72 65 73 65 74 41 6e 64 43 6f 6c  rc = resetAndCol
18250 6c 65 63 74 45 72 72 6f 72 28 70 57 72 69 74 65  lectError(pWrite
18260 72 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 29 3b  r, &p->zErrmsg);
18270 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
18280 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73  is function does
18290 20 74 68 65 20 77 6f 72 6b 20 66 6f 72 20 61 6e   the work for an
182a0 20 73 71 6c 69 74 65 33 72 62 75 5f 73 74 65 70   sqlite3rbu_step
182b0 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 54  () call..**.** T
182c0 68 65 20 6f 62 6a 65 63 74 2d 69 74 65 72 61 74  he object-iterat
182d0 6f 72 20 28 70 2d 3e 6f 62 6a 69 74 65 72 29 20  or (p->objiter) 
182e0 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73  currently points
182f0 20 74 6f 20 61 20 76 61 6c 69 64 20 6f 62 6a 65   to a valid obje
18300 63 74 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20 69  ct,.** and the i
18310 6e 70 75 74 20 63 75 72 73 6f 72 20 28 70 2d 3e  nput cursor (p->
18320 6f 62 6a 69 74 65 72 2e 70 53 65 6c 65 63 74 29  objiter.pSelect)
18330 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
18340 73 20 74 6f 20 61 20 76 61 6c 69 64 0a 2a 2a 20  s to a valid.** 
18350 69 6e 70 75 74 20 72 6f 77 2e 20 50 65 72 66 6f  input row. Perfo
18360 72 6d 20 77 68 61 74 65 76 65 72 20 70 72 6f 63  rm whatever proc
18370 65 73 73 69 6e 67 20 69 73 20 72 65 71 75 69 72  essing is requir
18380 65 64 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 2a  ed and return..*
18390 2a 0a 2a 2a 20 49 66 20 6e 6f 20 20 65 72 72 6f  *.** If no  erro
183a0 72 20 6f 63 63 75 72 73 2c 20 53 51 4c 49 54 45  r occurs, SQLITE
183b0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
183c0 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20 65   Otherwise, an e
183d0 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 61 6e 64  rror code.** and
183e0 20 6d 65 73 73 61 67 65 20 69 73 20 6c 65 66 74   message is left
183f0 20 69 6e 20 74 68 65 20 52 42 55 20 68 61 6e 64   in the RBU hand
18400 6c 65 20 61 6e 64 20 61 20 63 6f 70 79 20 6f 66  le and a copy of
18410 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a   the error code.
18420 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  ** returned..*/.
18430 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 53 74  static int rbuSt
18440 65 70 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70  ep(sqlite3rbu *p
18450 29 7b 0a 20 20 52 62 75 4f 62 6a 49 74 65 72 20  ){.  RbuObjIter 
18460 2a 70 49 74 65 72 20 3d 20 26 70 2d 3e 6f 62 6a  *pIter = &p->obj
18470 69 74 65 72 3b 0a 20 20 63 6f 6e 73 74 20 63 68  iter;.  const ch
18480 61 72 20 2a 7a 4d 61 73 6b 20 3d 20 30 3b 0a 20  ar *zMask = 0;. 
18490 20 69 6e 74 20 65 54 79 70 65 20 3d 20 72 62 75   int eType = rbu
184a0 53 74 65 70 54 79 70 65 28 70 2c 20 26 7a 4d 61  StepType(p, &zMa
184b0 73 6b 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70  sk);..  if( eTyp
184c0 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  e ){.    assert(
184d0 20 65 54 79 70 65 3d 3d 52 42 55 5f 49 4e 53 45   eType==RBU_INSE
184e0 52 54 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d  RT     || eType=
184f0 3d 52 42 55 5f 44 45 4c 45 54 45 0a 20 20 20 20  =RBU_DELETE.    
18500 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 52       || eType==R
18510 42 55 5f 52 45 50 4c 41 43 45 20 20 20 20 7c 7c  BU_REPLACE    ||
18520 20 65 54 79 70 65 3d 3d 52 42 55 5f 49 44 58 5f   eType==RBU_IDX_
18530 44 45 4c 45 54 45 0a 20 20 20 20 20 20 20 20 20  DELETE.         
18540 7c 7c 20 65 54 79 70 65 3d 3d 52 42 55 5f 49 44  || eType==RBU_ID
18550 58 5f 49 4e 53 45 52 54 20 7c 7c 20 65 54 79 70  X_INSERT || eTyp
18560 65 3d 3d 52 42 55 5f 55 50 44 41 54 45 0a 20 20  e==RBU_UPDATE.  
18570 20 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28    );.    assert(
18580 20 65 54 79 70 65 21 3d 52 42 55 5f 55 50 44 41   eType!=RBU_UPDA
18590 54 45 20 7c 7c 20 70 49 74 65 72 2d 3e 7a 49 64  TE || pIter->zId
185a0 78 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 69 66 28  x==0 );..    if(
185b0 20 70 49 74 65 72 2d 3e 7a 49 64 78 3d 3d 30 20   pIter->zIdx==0 
185c0 26 26 20 28 65 54 79 70 65 3d 3d 52 42 55 5f 49  && (eType==RBU_I
185d0 44 58 5f 44 45 4c 45 54 45 20 7c 7c 20 65 54 79  DX_DELETE || eTy
185e0 70 65 3d 3d 52 42 55 5f 49 44 58 5f 49 4e 53 45  pe==RBU_IDX_INSE
185f0 52 54 29 20 29 7b 0a 20 20 20 20 20 20 72 62 75  RT) ){.      rbu
18600 42 61 64 43 6f 6e 74 72 6f 6c 45 72 72 6f 72 28  BadControlError(
18610 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c  p);.    }.    el
18620 73 65 20 69 66 28 20 65 54 79 70 65 3d 3d 52 42  se if( eType==RB
18630 55 5f 52 45 50 4c 41 43 45 20 29 7b 0a 20 20 20  U_REPLACE ){.   
18640 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 7a 49     if( pIter->zI
18650 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  dx==0 ){.       
18660 20 70 2d 3e 6e 50 68 61 73 65 4f 6e 65 53 74 65   p->nPhaseOneSte
18670 70 20 2b 3d 20 70 2d 3e 6f 62 6a 69 74 65 72 2e  p += p->objiter.
18680 6e 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 20 20  nIndex;.        
18690 72 62 75 53 74 65 70 4f 6e 65 4f 70 28 70 2c 20  rbuStepOneOp(p, 
186a0 52 42 55 5f 44 45 4c 45 54 45 29 3b 0a 20 20 20  RBU_DELETE);.   
186b0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
186c0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
186d0 29 20 72 62 75 53 74 65 70 4f 6e 65 4f 70 28 70  ) rbuStepOneOp(p
186e0 2c 20 52 42 55 5f 49 4e 53 45 52 54 29 3b 0a 20  , RBU_INSERT);. 
186f0 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69 66     }.    else if
18700 28 20 65 54 79 70 65 21 3d 52 42 55 5f 55 50 44  ( eType!=RBU_UPD
18710 41 54 45 20 29 7b 0a 20 20 20 20 20 20 72 62 75  ATE ){.      rbu
18720 53 74 65 70 4f 6e 65 4f 70 28 70 2c 20 65 54 79  StepOneOp(p, eTy
18730 70 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65  pe);.    }.    e
18740 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
18750 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a  e3_value *pVal;.
18760 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
18770 6d 74 20 2a 70 55 70 64 61 74 65 20 3d 20 30 3b  mt *pUpdate = 0;
18780 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
18790 54 79 70 65 3d 3d 52 42 55 5f 55 50 44 41 54 45  Type==RBU_UPDATE
187a0 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 50 68   );.      p->nPh
187b0 61 73 65 4f 6e 65 53 74 65 70 20 2d 3d 20 70 2d  aseOneStep -= p-
187c0 3e 6f 62 6a 69 74 65 72 2e 6e 49 6e 64 65 78 3b  >objiter.nIndex;
187d0 0a 20 20 20 20 20 20 72 62 75 47 65 74 55 70 64  .      rbuGetUpd
187e0 61 74 65 53 74 6d 74 28 70 2c 20 70 49 74 65 72  ateStmt(p, pIter
187f0 2c 20 7a 4d 61 73 6b 2c 20 26 70 55 70 64 61 74  , zMask, &pUpdat
18800 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 55  e);.      if( pU
18810 70 64 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20  pdate ){.       
18820 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20   int i;.        
18830 66 6f 72 28 69 3d 30 3b 20 70 2d 3e 72 63 3d 3d  for(i=0; p->rc==
18840 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70  SQLITE_OK && i<p
18850 49 74 65 72 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29  Iter->nCol; i++)
18860 7b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72  {.          char
18870 20 63 20 3d 20 7a 4d 61 73 6b 5b 70 49 74 65 72   c = zMask[pIter
18880 2d 3e 61 69 53 72 63 4f 72 64 65 72 5b 69 5d 5d  ->aiSrcOrder[i]]
18890 3b 0a 20 20 20 20 20 20 20 20 20 20 70 56 61 6c  ;.          pVal
188a0 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
188b0 6e 5f 76 61 6c 75 65 28 70 49 74 65 72 2d 3e 70  n_value(pIter->p
188c0 53 65 6c 65 63 74 2c 20 69 29 3b 0a 20 20 20 20  Select, i);.    
188d0 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d        if( pIter-
188e0 3e 61 62 54 62 6c 50 6b 5b 69 5d 20 7c 7c 20 63  >abTblPk[i] || c
188f0 21 3d 27 2e 27 20 29 7b 0a 20 20 20 20 20 20 20  !='.' ){.       
18900 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c       p->rc = sql
18910 69 74 65 33 5f 62 69 6e 64 5f 76 61 6c 75 65 28  ite3_bind_value(
18920 70 55 70 64 61 74 65 2c 20 69 2b 31 2c 20 70 56  pUpdate, i+1, pV
18930 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  al);.          }
18940 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
18950 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
18960 4c 49 54 45 5f 4f 4b 20 0a 20 20 20 20 20 20 20  LITE_OK .       
18970 20 20 26 26 20 28 70 49 74 65 72 2d 3e 65 54 79    && (pIter->eTy
18980 70 65 3d 3d 52 42 55 5f 50 4b 5f 56 54 41 42 20  pe==RBU_PK_VTAB 
18990 7c 7c 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d  || pIter->eType=
189a0 3d 52 42 55 5f 50 4b 5f 4e 4f 4e 45 29 20 0a 20  =RBU_PK_NONE) . 
189b0 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
189c0 20 20 20 20 2f 2a 20 42 69 6e 64 20 74 68 65 20      /* Bind the 
189d0 72 62 75 5f 72 6f 77 69 64 20 76 61 6c 75 65 20  rbu_rowid value 
189e0 74 6f 20 63 6f 6c 75 6d 6e 20 5f 72 6f 77 69 64  to column _rowid
189f0 5f 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61  _ */.          a
18a00 73 73 65 72 74 43 6f 6c 75 6d 6e 4e 61 6d 65 28  ssertColumnName(
18a10 70 49 74 65 72 2d 3e 70 53 65 6c 65 63 74 2c 20  pIter->pSelect, 
18a20 70 49 74 65 72 2d 3e 6e 43 6f 6c 2b 31 2c 20 22  pIter->nCol+1, "
18a30 72 62 75 5f 72 6f 77 69 64 22 29 3b 0a 20 20 20  rbu_rowid");.   
18a40 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20 73 71         pVal = sq
18a50 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c  lite3_column_val
18a60 75 65 28 70 49 74 65 72 2d 3e 70 53 65 6c 65 63  ue(pIter->pSelec
18a70 74 2c 20 70 49 74 65 72 2d 3e 6e 43 6f 6c 2b 31  t, pIter->nCol+1
18a80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  );.          p->
18a90 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e  rc = sqlite3_bin
18aa0 64 5f 76 61 6c 75 65 28 70 55 70 64 61 74 65 2c  d_value(pUpdate,
18ab0 20 70 49 74 65 72 2d 3e 6e 43 6f 6c 2b 31 2c 20   pIter->nCol+1, 
18ac0 70 56 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d  pVal);.        }
18ad0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
18ae0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
18af0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
18b00 65 33 5f 73 74 65 70 28 70 55 70 64 61 74 65 29  e3_step(pUpdate)
18b10 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72  ;.          p->r
18b20 63 20 3d 20 72 65 73 65 74 41 6e 64 43 6f 6c 6c  c = resetAndColl
18b30 65 63 74 45 72 72 6f 72 28 70 55 70 64 61 74 65  ectError(pUpdate
18b40 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a  , &p->zErrmsg);.
18b50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
18b60 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
18b70 74 75 72 6e 20 70 2d 3e 72 63 3b 0a 7d 0a 0a 2f  turn p->rc;.}../
18b80 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74  *.** Increment t
18b90 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65  he schema cookie
18ba0 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74   of the main dat
18bb0 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62 79 20  abase opened by 
18bc0 70 2d 3e 64 62 4d 61 69 6e 2e 0a 2a 2a 0a 2a 2a  p->dbMain..**.**
18bd0 20 4f 72 2c 20 69 66 20 74 68 69 73 20 69 73 20   Or, if this is 
18be0 61 6e 20 52 42 55 20 76 61 63 75 75 6d 2c 20 73  an RBU vacuum, s
18bf0 65 74 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f  et the schema co
18c00 6f 6b 69 65 20 6f 66 20 74 68 65 20 6d 61 69 6e  okie of the main
18c10 20 64 62 0a 2a 2a 20 6f 70 65 6e 65 64 20 62 79   db.** opened by
18c20 20 70 2d 3e 64 62 4d 61 69 6e 20 74 6f 20 6f 6e   p->dbMain to on
18c30 65 20 6d 6f 72 65 20 74 68 61 6e 20 74 68 65 20  e more than the 
18c40 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 6f 66  schema cookie of
18c50 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 64 62 20   the main.** db 
18c60 6f 70 65 6e 65 64 20 62 79 20 70 2d 3e 64 62 52  opened by p->dbR
18c70 62 75 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  bu..*/.static vo
18c80 69 64 20 72 62 75 49 6e 63 72 53 63 68 65 6d 61  id rbuIncrSchema
18c90 43 6f 6f 6b 69 65 28 73 71 6c 69 74 65 33 72 62  Cookie(sqlite3rb
18ca0 75 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  u *p){.  if( p->
18cb0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
18cc0 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62  .    sqlite3 *db
18cd0 72 65 61 64 20 3d 20 28 72 62 75 49 73 56 61 63  read = (rbuIsVac
18ce0 75 75 6d 28 70 29 20 3f 20 70 2d 3e 64 62 52 62  uum(p) ? p->dbRb
18cf0 75 20 3a 20 70 2d 3e 64 62 4d 61 69 6e 29 3b 0a  u : p->dbMain);.
18d00 20 20 20 20 69 6e 74 20 69 43 6f 6f 6b 69 65 20      int iCookie 
18d10 3d 20 31 30 30 30 30 30 30 3b 0a 20 20 20 20 73  = 1000000;.    s
18d20 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
18d30 6d 74 3b 0a 0a 20 20 20 20 70 2d 3e 72 63 20 3d  mt;..    p->rc =
18d40 20 70 72 65 70 61 72 65 41 6e 64 43 6f 6c 6c 65   prepareAndColle
18d50 63 74 45 72 72 6f 72 28 64 62 72 65 61 64 2c 20  ctError(dbread, 
18d60 26 70 53 74 6d 74 2c 20 26 70 2d 3e 7a 45 72 72  &pStmt, &p->zErr
18d70 6d 73 67 2c 20 0a 20 20 20 20 20 20 20 20 22 50  msg, .        "P
18d80 52 41 47 4d 41 20 73 63 68 65 6d 61 5f 76 65 72  RAGMA schema_ver
18d90 73 69 6f 6e 22 0a 20 20 20 20 29 3b 0a 20 20 20  sion".    );.   
18da0 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
18db0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f  TE_OK ){.      /
18dc0 2a 20 43 6f 76 65 72 61 67 65 3a 20 69 74 20 6d  * Coverage: it m
18dd0 61 79 20 62 65 20 74 68 61 74 20 74 68 69 73 20  ay be that this 
18de0 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 63  sqlite3_step() c
18df0 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 54 68 65 72  annot fail. Ther
18e00 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 61 6c  e.      ** is al
18e10 72 65 61 64 79 20 61 20 74 72 61 6e 73 61 63 74  ready a transact
18e20 69 6f 6e 20 6f 70 65 6e 2c 20 73 6f 20 74 68 65  ion open, so the
18e30 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
18e40 65 6e 74 20 63 61 6e 6e 6f 74 0a 20 20 20 20 20  ent cannot.     
18e50 20 2a 2a 20 74 68 72 6f 77 20 61 6e 20 53 51 4c   ** throw an SQL
18e60 49 54 45 5f 53 43 48 45 4d 41 20 65 78 63 65 70  ITE_SCHEMA excep
18e70 74 69 6f 6e 2e 20 54 68 65 20 6f 6e 6c 79 20 64  tion. The only d
18e80 61 74 61 62 61 73 65 20 70 61 67 65 20 74 68 65  atabase page the
18e90 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d  .      ** statem
18ea0 65 6e 74 20 72 65 61 64 73 20 69 73 20 70 61 67  ent reads is pag
18eb0 65 20 31 2c 20 77 68 69 63 68 20 69 73 20 67 75  e 1, which is gu
18ec0 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 69  aranteed to be i
18ed0 6e 20 74 68 65 20 63 61 63 68 65 2e 0a 20 20 20  n the cache..   
18ee0 20 20 20 2a 2a 20 41 6e 64 20 6e 6f 20 6d 65 6d     ** And no mem
18ef0 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20  ory allocations 
18f00 61 72 65 20 72 65 71 75 69 72 65 64 2e 20 20 2a  are required.  *
18f10 2f 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49  /.      if( SQLI
18f20 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
18f30 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20  step(pStmt) ){. 
18f40 20 20 20 20 20 20 20 69 43 6f 6f 6b 69 65 20 3d         iCookie =
18f50 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
18f60 69 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20  int(pStmt, 0);. 
18f70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 62 75       }.      rbu
18f80 46 69 6e 61 6c 69 7a 65 28 70 2c 20 70 53 74 6d  Finalize(p, pStm
18f90 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  t);.    }.    if
18fa0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
18fb0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 62 75 4d  OK ){.      rbuM
18fc0 50 72 69 6e 74 66 45 78 65 63 28 70 2c 20 70 2d  PrintfExec(p, p-
18fd0 3e 64 62 4d 61 69 6e 2c 20 22 50 52 41 47 4d 41  >dbMain, "PRAGMA
18fe0 20 73 63 68 65 6d 61 5f 76 65 72 73 69 6f 6e 20   schema_version 
18ff0 3d 20 25 64 22 2c 20 69 43 6f 6f 6b 69 65 2b 31  = %d", iCookie+1
19000 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
19010 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74 68 65  /*.** Update the
19020 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
19030 20 72 62 75 5f 73 74 61 74 65 20 74 61 62 6c 65   rbu_state table
19040 20 77 69 74 68 69 6e 20 74 68 65 20 72 62 75 20   within the rbu 
19050 64 61 74 61 62 61 73 65 2e 20 54 68 65 0a 2a 2a  database. The.**
19060 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e   value stored in
19070 20 74 68 65 20 52 42 55 5f 53 54 41 54 45 5f 53   the RBU_STATE_S
19080 54 41 47 45 20 63 6f 6c 75 6d 6e 20 69 73 20 65  TAGE column is e
19090 53 74 61 67 65 2e 20 41 6c 6c 20 6f 74 68 65 72  Stage. All other
190a0 20 76 61 6c 75 65 73 0a 2a 2a 20 61 72 65 20 64   values.** are d
190b0 65 74 65 72 6d 69 6e 65 64 20 62 79 20 69 6e 73  etermined by ins
190c0 70 65 63 74 69 6e 67 20 74 68 65 20 72 62 75 20  pecting the rbu 
190d0 68 61 6e 64 6c 65 20 70 61 73 73 65 64 20 61 73  handle passed as
190e0 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
190f0 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ent..*/.static v
19100 6f 69 64 20 72 62 75 53 61 76 65 53 74 61 74 65  oid rbuSaveState
19110 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20  (sqlite3rbu *p, 
19120 69 6e 74 20 65 53 74 61 67 65 29 7b 0a 20 20 69  int eStage){.  i
19130 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
19140 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51  _OK || p->rc==SQ
19150 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20  LITE_DONE ){.   
19160 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
19170 49 6e 73 65 72 74 20 3d 20 30 3b 0a 20 20 20 20  Insert = 0;.    
19180 72 62 75 5f 66 69 6c 65 20 2a 70 46 64 20 3d 20  rbu_file *pFd = 
19190 28 72 62 75 49 73 56 61 63 75 75 6d 28 70 29 20  (rbuIsVacuum(p) 
191a0 3f 20 70 2d 3e 70 52 62 75 46 64 20 3a 20 70 2d  ? p->pRbuFd : p-
191b0 3e 70 54 61 72 67 65 74 46 64 29 3b 0a 20 20 20  >pTargetFd);.   
191c0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 20 20 61 73   int rc;..    as
191d0 73 65 72 74 28 20 70 2d 3e 7a 45 72 72 6d 73 67  sert( p->zErrmsg
191e0 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ==0 );.    rc = 
191f0 70 72 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f  prepareFreeAndCo
19200 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62  llectError(p->db
19210 52 62 75 2c 20 26 70 49 6e 73 65 72 74 2c 20 26  Rbu, &pInsert, &
19220 70 2d 3e 7a 45 72 72 6d 73 67 2c 20 0a 20 20 20  p->zErrmsg, .   
19230 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72       sqlite3_mpr
19240 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20  intf(.          
19250 22 49 4e 53 45 52 54 20 4f 52 20 52 45 50 4c 41  "INSERT OR REPLA
19260 43 45 20 49 4e 54 4f 20 25 73 2e 72 62 75 5f 73  CE INTO %s.rbu_s
19270 74 61 74 65 28 6b 2c 20 76 29 20 56 41 4c 55 45  tate(k, v) VALUE
19280 53 20 22 0a 20 20 20 20 20 20 20 20 20 20 22 28  S ".          "(
19290 25 64 2c 20 25 64 29 2c 20 22 0a 20 20 20 20 20  %d, %d), ".     
192a0 20 20 20 20 20 22 28 25 64 2c 20 25 51 29 2c 20       "(%d, %Q), 
192b0 22 0a 20 20 20 20 20 20 20 20 20 20 22 28 25 64  ".          "(%d
192c0 2c 20 25 51 29 2c 20 22 0a 20 20 20 20 20 20 20  , %Q), ".       
192d0 20 20 20 22 28 25 64 2c 20 25 64 29 2c 20 22 0a     "(%d, %d), ".
192e0 20 20 20 20 20 20 20 20 20 20 22 28 25 64 2c 20            "(%d, 
192f0 25 64 29 2c 20 22 0a 20 20 20 20 20 20 20 20 20  %d), ".         
19300 20 22 28 25 64 2c 20 25 6c 6c 64 29 2c 20 22 0a   "(%d, %lld), ".
19310 20 20 20 20 20 20 20 20 20 20 22 28 25 64 2c 20            "(%d, 
19320 25 6c 6c 64 29 2c 20 22 0a 20 20 20 20 20 20 20  %lld), ".       
19330 20 20 20 22 28 25 64 2c 20 25 6c 6c 64 29 2c 20     "(%d, %lld), 
19340 22 0a 20 20 20 20 20 20 20 20 20 20 22 28 25 64  ".          "(%d
19350 2c 20 25 6c 6c 64 29 2c 20 22 0a 20 20 20 20 20  , %lld), ".     
19360 20 20 20 20 20 22 28 25 64 2c 20 25 51 29 20 20       "(%d, %Q)  
19370 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ",.          p->
19380 7a 53 74 61 74 65 44 62 2c 0a 20 20 20 20 20 20  zStateDb,.      
19390 20 20 20 20 52 42 55 5f 53 54 41 54 45 5f 53 54      RBU_STATE_ST
193a0 41 47 45 2c 20 65 53 74 61 67 65 2c 0a 20 20 20  AGE, eStage,.   
193b0 20 20 20 20 20 20 20 52 42 55 5f 53 54 41 54 45         RBU_STATE
193c0 5f 54 42 4c 2c 20 70 2d 3e 6f 62 6a 69 74 65 72  _TBL, p->objiter
193d0 2e 7a 54 62 6c 2c 20 0a 20 20 20 20 20 20 20 20  .zTbl, .        
193e0 20 20 52 42 55 5f 53 54 41 54 45 5f 49 44 58 2c    RBU_STATE_IDX,
193f0 20 70 2d 3e 6f 62 6a 69 74 65 72 2e 7a 49 64 78   p->objiter.zIdx
19400 2c 20 0a 20 20 20 20 20 20 20 20 20 20 52 42 55  , .          RBU
19410 5f 53 54 41 54 45 5f 52 4f 57 2c 20 70 2d 3e 6e  _STATE_ROW, p->n
19420 53 74 65 70 2c 20 0a 20 20 20 20 20 20 20 20 20  Step, .         
19430 20 52 42 55 5f 53 54 41 54 45 5f 50 52 4f 47 52   RBU_STATE_PROGR
19440 45 53 53 2c 20 70 2d 3e 6e 50 72 6f 67 72 65 73  ESS, p->nProgres
19450 73 2c 0a 20 20 20 20 20 20 20 20 20 20 52 42 55  s,.          RBU
19460 5f 53 54 41 54 45 5f 43 4b 50 54 2c 20 70 2d 3e  _STATE_CKPT, p->
19470 69 57 61 6c 43 6b 73 75 6d 2c 0a 20 20 20 20 20  iWalCksum,.     
19480 20 20 20 20 20 52 42 55 5f 53 54 41 54 45 5f 43       RBU_STATE_C
19490 4f 4f 4b 49 45 2c 20 28 69 36 34 29 70 46 64 2d  OOKIE, (i64)pFd-
194a0 3e 69 43 6f 6f 6b 69 65 2c 0a 20 20 20 20 20 20  >iCookie,.      
194b0 20 20 20 20 52 42 55 5f 53 54 41 54 45 5f 4f 41      RBU_STATE_OA
194c0 4c 53 5a 2c 20 70 2d 3e 69 4f 61 6c 53 7a 2c 0a  LSZ, p->iOalSz,.
194d0 20 20 20 20 20 20 20 20 20 20 52 42 55 5f 53 54            RBU_ST
194e0 41 54 45 5f 50 48 41 53 45 4f 4e 45 53 54 45 50  ATE_PHASEONESTEP
194f0 2c 20 70 2d 3e 6e 50 68 61 73 65 4f 6e 65 53 74  , p->nPhaseOneSt
19500 65 70 2c 0a 20 20 20 20 20 20 20 20 20 20 52 42  ep,.          RB
19510 55 5f 53 54 41 54 45 5f 44 41 54 41 54 42 4c 2c  U_STATE_DATATBL,
19520 20 70 2d 3e 6f 62 6a 69 74 65 72 2e 7a 44 61 74   p->objiter.zDat
19530 61 54 62 6c 0a 20 20 20 20 20 20 29 0a 20 20 20  aTbl.      ).   
19540 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
19550 70 49 6e 73 65 72 74 3d 3d 30 20 7c 7c 20 72 63  pInsert==0 || rc
19560 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a  ==SQLITE_OK );..
19570 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
19580 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
19590 71 6c 69 74 65 33 5f 73 74 65 70 28 70 49 6e 73  qlite3_step(pIns
195a0 65 72 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ert);.      rc =
195b0 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
195c0 65 28 70 49 6e 73 65 72 74 29 3b 0a 20 20 20 20  e(pInsert);.    
195d0 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
195e0 4c 49 54 45 5f 4f 4b 20 29 20 70 2d 3e 72 63 20  LITE_OK ) p->rc 
195f0 3d 20 72 63 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a  = rc;.  }.}.../*
19600 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61  .** The second a
19610 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74  rgument passed t
19620 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  o this function 
19630 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  is the name of a
19640 20 50 52 41 47 4d 41 20 0a 2a 2a 20 73 65 74 74   PRAGMA .** sett
19650 69 6e 67 20 2d 20 22 70 61 67 65 5f 73 69 7a 65  ing - "page_size
19660 22 2c 20 22 61 75 74 6f 5f 76 61 63 75 75 6d 22  ", "auto_vacuum"
19670 2c 20 22 75 73 65 72 5f 76 65 72 73 69 6f 6e 22  , "user_version"
19680 20 6f 72 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   or "application
19690 5f 69 64 22 2e 0a 2a 2a 20 54 68 69 73 20 66 75  _id"..** This fu
196a0 6e 63 74 69 6f 6e 20 65 78 65 63 75 74 65 73 20  nction executes 
196b0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 6e  the following on
196c0 20 73 71 6c 69 74 65 33 72 62 75 2e 64 62 52 62   sqlite3rbu.dbRb
196d0 75 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 50 52 41 47  u:.**.**   "PRAG
196e0 4d 41 20 6d 61 69 6e 2e 24 7a 50 72 61 67 6d 61  MA main.$zPragma
196f0 22 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 24 7a  ".**.** where $z
19700 50 72 61 67 6d 61 20 69 73 20 74 68 65 20 73 74  Pragma is the st
19710 72 69 6e 67 20 70 61 73 73 65 64 20 61 73 20 74  ring passed as t
19720 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
19730 6e 74 2c 20 74 68 65 6e 0a 2a 2a 20 6f 6e 20 73  nt, then.** on s
19740 71 6c 69 74 65 33 72 62 75 2e 64 62 4d 61 69 6e  qlite3rbu.dbMain
19750 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 50 52 41 47 4d  :.**.**   "PRAGM
19760 41 20 6d 61 69 6e 2e 24 7a 50 72 61 67 6d 61 20  A main.$zPragma 
19770 3d 20 24 76 61 6c 22 0a 2a 2a 0a 2a 2a 20 77 68  = $val".**.** wh
19780 65 72 65 20 24 76 61 6c 20 69 73 20 74 68 65 20  ere $val is the 
19790 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
197a0 79 20 74 68 65 20 66 69 72 73 74 20 50 52 41 47  y the first PRAG
197b0 4d 41 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 0a 2a  MA invocation..*
197c0 2a 0a 2a 2a 20 49 6e 20 73 68 6f 72 74 2c 20 69  *.** In short, i
197d0 74 20 63 6f 70 69 65 73 20 74 68 65 20 76 61 6c  t copies the val
197e0 75 65 20 20 6f 66 20 74 68 65 20 73 70 65 63 69  ue  of the speci
197f0 66 69 65 64 20 50 52 41 47 4d 41 20 73 65 74 74  fied PRAGMA sett
19800 69 6e 67 20 66 72 6f 6d 0a 2a 2a 20 64 62 52 62  ing from.** dbRb
19810 75 20 74 6f 20 64 62 4d 61 69 6e 2e 0a 2a 2f 0a  u to dbMain..*/.
19820 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75 43  static void rbuC
19830 6f 70 79 50 72 61 67 6d 61 28 73 71 6c 69 74 65  opyPragma(sqlite
19840 33 72 62 75 20 2a 70 2c 20 63 6f 6e 73 74 20 63  3rbu *p, const c
19850 68 61 72 20 2a 7a 50 72 61 67 6d 61 29 7b 0a 20  har *zPragma){. 
19860 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
19870 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
19880 69 74 65 33 5f 73 74 6d 74 20 2a 70 50 72 61 67  ite3_stmt *pPrag
19890 6d 61 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 72  ma = 0;.    p->r
198a0 63 20 3d 20 70 72 65 70 61 72 65 46 72 65 65 41  c = prepareFreeA
198b0 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70  ndCollectError(p
198c0 2d 3e 64 62 52 62 75 2c 20 26 70 50 72 61 67 6d  ->dbRbu, &pPragm
198d0 61 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 20  a, &p->zErrmsg, 
198e0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
198f0 5f 6d 70 72 69 6e 74 66 28 22 50 52 41 47 4d 41  _mprintf("PRAGMA
19900 20 6d 61 69 6e 2e 25 73 22 2c 20 7a 50 72 61 67   main.%s", zPrag
19910 6d 61 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  ma).    );.    i
19920 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
19930 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f  _OK && SQLITE_RO
19940 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28  W==sqlite3_step(
19950 70 50 72 61 67 6d 61 29 20 29 7b 0a 20 20 20 20  pPragma) ){.    
19960 20 20 70 2d 3e 72 63 20 3d 20 72 62 75 4d 50 72    p->rc = rbuMPr
19970 69 6e 74 66 45 78 65 63 28 70 2c 20 70 2d 3e 64  intfExec(p, p->d
19980 62 4d 61 69 6e 2c 20 22 50 52 41 47 4d 41 20 6d  bMain, "PRAGMA m
19990 61 69 6e 2e 25 73 20 3d 20 25 64 22 2c 0a 20 20  ain.%s = %d",.  
199a0 20 20 20 20 20 20 20 20 7a 50 72 61 67 6d 61 2c          zPragma,
199b0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
199c0 69 6e 74 28 70 50 72 61 67 6d 61 2c 20 30 29 0a  int(pPragma, 0).
199d0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
199e0 20 20 20 72 62 75 46 69 6e 61 6c 69 7a 65 28 70     rbuFinalize(p
199f0 2c 20 70 50 72 61 67 6d 61 29 3b 0a 20 20 7d 0a  , pPragma);.  }.
19a00 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 52 42 55  }../*.** The RBU
19a10 20 68 61 6e 64 6c 65 20 70 61 73 73 65 64 20 61   handle passed a
19a20 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d  s the only argum
19a30 65 6e 74 20 68 61 73 20 6a 75 73 74 20 62 65 65  ent has just bee
19a40 6e 20 6f 70 65 6e 65 64 20 61 6e 64 20 0a 2a 2a  n opened and .**
19a50 20 74 68 65 20 73 74 61 74 65 20 64 61 74 61 62   the state datab
19a60 61 73 65 20 69 73 20 65 6d 70 74 79 2e 20 49 66  ase is empty. If
19a70 20 74 68 69 73 20 52 42 55 20 68 61 6e 64 6c 65   this RBU handle
19a80 20 77 61 73 20 6f 70 65 6e 65 64 20 66 6f 72 20   was opened for 
19a90 61 6e 0a 2a 2a 20 52 42 55 20 76 61 63 75 75 6d  an.** RBU vacuum
19aa0 20 6f 70 65 72 61 74 69 6f 6e 2c 20 63 72 65 61   operation, crea
19ab0 74 65 20 74 68 65 20 73 63 68 65 6d 61 20 69 6e  te the schema in
19ac0 20 74 68 65 20 74 61 72 67 65 74 20 64 62 2e 0a   the target db..
19ad0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
19ae0 62 75 43 72 65 61 74 65 54 61 72 67 65 74 53 63  buCreateTargetSc
19af0 68 65 6d 61 28 73 71 6c 69 74 65 33 72 62 75 20  hema(sqlite3rbu 
19b00 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  *p){.  sqlite3_s
19b10 74 6d 74 20 2a 70 53 71 6c 20 3d 20 30 3b 0a 20  tmt *pSql = 0;. 
19b20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
19b30 49 6e 73 65 72 74 20 3d 20 30 3b 0a 0a 20 20 61  Insert = 0;..  a
19b40 73 73 65 72 74 28 20 72 62 75 49 73 56 61 63 75  ssert( rbuIsVacu
19b50 75 6d 28 70 29 20 29 3b 0a 20 20 70 2d 3e 72 63  um(p) );.  p->rc
19b60 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28   = sqlite3_exec(
19b70 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 50 52 41 47  p->dbMain, "PRAG
19b80 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65  MA writable_sche
19b90 6d 61 3d 31 22 2c 20 30 2c 30 2c 20 26 70 2d 3e  ma=1", 0,0, &p->
19ba0 7a 45 72 72 6d 73 67 29 3b 0a 20 20 69 66 28 20  zErrmsg);.  if( 
19bb0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
19bc0 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
19bd0 70 72 65 70 61 72 65 41 6e 64 43 6f 6c 6c 65 63  prepareAndCollec
19be0 74 45 72 72 6f 72 28 70 2d 3e 64 62 52 62 75 2c  tError(p->dbRbu,
19bf0 20 26 70 53 71 6c 2c 20 26 70 2d 3e 7a 45 72 72   &pSql, &p->zErr
19c00 6d 73 67 2c 20 0a 20 20 20 20 20 20 22 53 45 4c  msg, .      "SEL
19c10 45 43 54 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c  ECT sql FROM sql
19c20 69 74 65 5f 6d 61 73 74 65 72 20 57 48 45 52 45  ite_master WHERE
19c30 20 73 71 6c 21 3d 27 27 20 41 4e 44 20 72 6f 6f   sql!='' AND roo
19c40 74 70 61 67 65 21 3d 30 22 0a 20 20 20 20 20 20  tpage!=0".      
19c50 22 20 41 4e 44 20 6e 61 6d 65 21 3d 27 73 71 6c  " AND name!='sql
19c60 69 74 65 5f 73 65 71 75 65 6e 63 65 27 20 22 0a  ite_sequence' ".
19c70 20 20 20 20 20 20 22 20 4f 52 44 45 52 20 42 59        " ORDER BY
19c80 20 74 79 70 65 20 44 45 53 43 22 0a 20 20 20 20   type DESC".    
19c90 29 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28  );.  }..  while(
19ca0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
19cb0 4b 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74 65  K && sqlite3_ste
19cc0 70 28 70 53 71 6c 29 3d 3d 53 51 4c 49 54 45 5f  p(pSql)==SQLITE_
19cd0 52 4f 57 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  ROW ){.    const
19ce0 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 28 63   char *zSql = (c
19cf0 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
19d00 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
19d10 53 71 6c 2c 20 30 29 3b 0a 20 20 20 20 70 2d 3e  Sql, 0);.    p->
19d20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65  rc = sqlite3_exe
19d30 63 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 7a 53 71  c(p->dbMain, zSq
19d40 6c 2c 20 30 2c 20 30 2c 20 26 70 2d 3e 7a 45 72  l, 0, 0, &p->zEr
19d50 72 6d 73 67 29 3b 0a 20 20 7d 0a 20 20 72 62 75  rmsg);.  }.  rbu
19d60 46 69 6e 61 6c 69 7a 65 28 70 2c 20 70 53 71 6c  Finalize(p, pSql
19d70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 21 3d  );.  if( p->rc!=
19d80 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
19d90 72 6e 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63  rn;..  if( p->rc
19da0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
19db0 20 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61     p->rc = prepa
19dc0 72 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f  reAndCollectErro
19dd0 72 28 70 2d 3e 64 62 52 62 75 2c 20 26 70 53 71  r(p->dbRbu, &pSq
19de0 6c 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 20  l, &p->zErrmsg, 
19df0 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54  .        "SELECT
19e00 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d   * FROM sqlite_m
19e10 61 73 74 65 72 20 57 48 45 52 45 20 72 6f 6f 74  aster WHERE root
19e20 70 61 67 65 3d 30 20 4f 52 20 72 6f 6f 74 70 61  page=0 OR rootpa
19e30 67 65 20 49 53 20 4e 55 4c 4c 22 20 0a 20 20 20  ge IS NULL" .   
19e40 20 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70   );.  }..  if( p
19e50 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
19e60 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 70  ){.    p->rc = p
19e70 72 65 70 61 72 65 41 6e 64 43 6f 6c 6c 65 63 74  repareAndCollect
19e80 45 72 72 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c  Error(p->dbMain,
19e90 20 26 70 49 6e 73 65 72 74 2c 20 26 70 2d 3e 7a   &pInsert, &p->z
19ea0 45 72 72 6d 73 67 2c 20 0a 20 20 20 20 20 20 20  Errmsg, .       
19eb0 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 73 71   "INSERT INTO sq
19ec0 6c 69 74 65 5f 6d 61 73 74 65 72 20 56 41 4c 55  lite_master VALU
19ed0 45 53 28 3f 2c 3f 2c 3f 2c 3f 2c 3f 29 22 0a 20  ES(?,?,?,?,?)". 
19ee0 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 77 68 69     );.  }..  whi
19ef0 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  le( p->rc==SQLIT
19f00 45 5f 4f 4b 20 26 26 20 73 71 6c 69 74 65 33 5f  E_OK && sqlite3_
19f10 73 74 65 70 28 70 53 71 6c 29 3d 3d 53 51 4c 49  step(pSql)==SQLI
19f20 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 69 6e  TE_ROW ){.    in
19f30 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
19f40 3b 20 69 3c 35 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<5; i++){.   
19f50 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
19f60 76 61 6c 75 65 28 70 49 6e 73 65 72 74 2c 20 69  value(pInsert, i
19f70 2b 31 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  +1, sqlite3_colu
19f80 6d 6e 5f 76 61 6c 75 65 28 70 53 71 6c 2c 20 69  mn_value(pSql, i
19f90 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  ));.    }.    sq
19fa0 6c 69 74 65 33 5f 73 74 65 70 28 70 49 6e 73 65  lite3_step(pInse
19fb0 72 74 29 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  rt);.    p->rc =
19fc0 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
19fd0 49 6e 73 65 72 74 29 3b 0a 20 20 7d 0a 20 20 69  Insert);.  }.  i
19fe0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
19ff0 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63  _OK ){.    p->rc
1a000 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28   = sqlite3_exec(
1a010 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 50 52 41 47  p->dbMain, "PRAG
1a020 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65  MA writable_sche
1a030 6d 61 3d 30 22 2c 30 2c 30 2c 26 70 2d 3e 7a 45  ma=0",0,0,&p->zE
1a040 72 72 6d 73 67 29 3b 0a 20 20 7d 0a 0a 20 20 72  rrmsg);.  }..  r
1a050 62 75 46 69 6e 61 6c 69 7a 65 28 70 2c 20 70 53  buFinalize(p, pS
1a060 71 6c 29 3b 0a 20 20 72 62 75 46 69 6e 61 6c 69  ql);.  rbuFinali
1a070 7a 65 28 70 2c 20 70 49 6e 73 65 72 74 29 3b 0a  ze(p, pInsert);.
1a080 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74 68  }../*.** Step th
1a090 65 20 52 42 55 20 6f 62 6a 65 63 74 2e 0a 2a 2f  e RBU object..*/
1a0a0 0a 69 6e 74 20 73 71 6c 69 74 65 33 72 62 75 5f  .int sqlite3rbu_
1a0b0 73 74 65 70 28 73 71 6c 69 74 65 33 72 62 75 20  step(sqlite3rbu 
1a0c0 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a  *p){.  if( p ){.
1a0d0 20 20 20 20 73 77 69 74 63 68 28 20 70 2d 3e 65      switch( p->e
1a0e0 53 74 61 67 65 20 29 7b 0a 20 20 20 20 20 20 63  Stage ){.      c
1a0f0 61 73 65 20 52 42 55 5f 53 54 41 47 45 5f 4f 41  ase RBU_STAGE_OA
1a100 4c 3a 20 7b 0a 20 20 20 20 20 20 20 20 52 62 75  L: {.        Rbu
1a110 4f 62 6a 49 74 65 72 20 2a 70 49 74 65 72 20 3d  ObjIter *pIter =
1a120 20 26 70 2d 3e 6f 62 6a 69 74 65 72 3b 0a 0a 20   &p->objiter;.. 
1a130 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69         /* If thi
1a140 73 20 69 73 20 61 6e 20 52 42 55 20 76 61 63 75  s is an RBU vacu
1a150 75 6d 20 6f 70 65 72 61 74 69 6f 6e 20 61 6e 64  um operation and
1a160 20 74 68 65 20 73 74 61 74 65 20 74 61 62 6c 65   the state table
1a170 20 77 61 73 20 65 6d 70 74 79 0a 20 20 20 20 20   was empty.     
1a180 20 20 20 2a 2a 20 77 68 65 6e 20 74 68 69 73 20     ** when this 
1a190 68 61 6e 64 6c 65 20 77 61 73 20 6f 70 65 6e 65  handle was opene
1a1a0 64 2c 20 63 72 65 61 74 65 20 74 68 65 20 74 61  d, create the ta
1a1b0 72 67 65 74 20 64 61 74 61 62 61 73 65 20 73 63  rget database sc
1a1c0 68 65 6d 61 2e 20 2a 2f 0a 20 20 20 20 20 20 20  hema. */.       
1a1d0 20 69 66 28 20 72 62 75 49 73 56 61 63 75 75 6d   if( rbuIsVacuum
1a1e0 28 70 29 20 26 26 20 70 2d 3e 6e 50 72 6f 67 72  (p) && p->nProgr
1a1f0 65 73 73 3d 3d 30 20 26 26 20 70 2d 3e 72 63 3d  ess==0 && p->rc=
1a200 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1a210 20 20 20 20 20 20 20 20 72 62 75 43 72 65 61 74          rbuCreat
1a220 65 54 61 72 67 65 74 53 63 68 65 6d 61 28 70 29  eTargetSchema(p)
1a230 3b 0a 20 20 20 20 20 20 20 20 20 20 72 62 75 43  ;.          rbuC
1a240 6f 70 79 50 72 61 67 6d 61 28 70 2c 20 22 75 73  opyPragma(p, "us
1a250 65 72 5f 76 65 72 73 69 6f 6e 22 29 3b 0a 20 20  er_version");.  
1a260 20 20 20 20 20 20 20 20 72 62 75 43 6f 70 79 50          rbuCopyP
1a270 72 61 67 6d 61 28 70 2c 20 22 61 70 70 6c 69 63  ragma(p, "applic
1a280 61 74 69 6f 6e 5f 69 64 22 29 3b 0a 20 20 20 20  ation_id");.    
1a290 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 77      }..        w
1a2a0 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  hile( p->rc==SQL
1a2b0 49 54 45 5f 4f 4b 20 26 26 20 70 49 74 65 72 2d  ITE_OK && pIter-
1a2c0 3e 7a 54 62 6c 20 29 7b 0a 0a 20 20 20 20 20 20  >zTbl ){..      
1a2d0 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 62      if( pIter->b
1a2e0 43 6c 65 61 6e 75 70 20 29 7b 0a 20 20 20 20 20  Cleanup ){.     
1a2f0 20 20 20 20 20 20 20 2f 2a 20 43 6c 65 61 6e 20         /* Clean 
1a300 75 70 20 74 68 65 20 72 62 75 5f 74 6d 70 5f 78  up the rbu_tmp_x
1a310 78 78 20 74 61 62 6c 65 20 66 6f 72 20 74 68 65  xx table for the
1a320 20 70 72 65 76 69 6f 75 73 20 74 61 62 6c 65 2e   previous table.
1a330 20 49 74 20 0a 20 20 20 20 20 20 20 20 20 20 20   It .           
1a340 20 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 64 72   ** cannot be dr
1a350 6f 70 70 65 64 20 61 73 20 74 68 65 72 65 20 61  opped as there a
1a360 72 65 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74  re currently act
1a370 69 76 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  ive SQL statemen
1a380 74 73 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ts..            
1a390 2a 2a 20 42 75 74 20 74 68 65 20 63 6f 6e 74 65  ** But the conte
1a3a0 6e 74 73 20 63 61 6e 20 62 65 20 64 65 6c 65 74  nts can be delet
1a3b0 65 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ed.  */.        
1a3c0 20 20 20 20 69 66 28 20 72 62 75 49 73 56 61 63      if( rbuIsVac
1a3d0 75 75 6d 28 70 29 3d 3d 30 20 26 26 20 70 49 74  uum(p)==0 && pIt
1a3e0 65 72 2d 3e 61 62 49 6e 64 65 78 65 64 20 29 7b  er->abIndexed ){
1a3f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
1a400 62 75 4d 50 72 69 6e 74 66 45 78 65 63 28 70 2c  buMPrintfExec(p,
1a410 20 70 2d 3e 64 62 52 62 75 2c 20 0a 20 20 20 20   p->dbRbu, .    
1a420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 44                "D
1a430 45 4c 45 54 45 20 46 52 4f 4d 20 25 73 2e 27 72  ELETE FROM %s.'r
1a440 62 75 5f 74 6d 70 5f 25 71 27 22 2c 20 70 2d 3e  bu_tmp_%q'", p->
1a450 7a 53 74 61 74 65 44 62 2c 20 70 49 74 65 72 2d  zStateDb, pIter-
1a460 3e 7a 44 61 74 61 54 62 6c 0a 20 20 20 20 20 20  >zDataTbl.      
1a470 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
1a480 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1a490 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1a4a0 20 20 20 20 20 20 72 62 75 4f 62 6a 49 74 65 72        rbuObjIter
1a4b0 50 72 65 70 61 72 65 41 6c 6c 28 70 2c 20 70 49  PrepareAll(p, pI
1a4c0 74 65 72 2c 20 30 29 3b 0a 0a 20 20 20 20 20 20  ter, 0);..      
1a4d0 20 20 20 20 20 20 2f 2a 20 41 64 76 61 6e 63 65        /* Advance
1a4e0 20 74 6f 20 74 68 65 20 6e 65 78 74 20 72 6f 77   to the next row
1a4f0 20 74 6f 20 70 72 6f 63 65 73 73 2e 20 2a 2f 0a   to process. */.
1a500 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1a510 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
1a520 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1a530 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
1a540 65 33 5f 73 74 65 70 28 70 49 74 65 72 2d 3e 70  e3_step(pIter->p
1a550 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20  Select);.       
1a560 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
1a570 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20  QLITE_ROW ){.   
1a580 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
1a590 6e 50 72 6f 67 72 65 73 73 2b 2b 3b 0a 20 20 20  nProgress++;.   
1a5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
1a5b0 6e 53 74 65 70 2b 2b 3b 0a 20 20 20 20 20 20 20  nStep++;.       
1a5c0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1a5d0 72 62 75 53 74 65 70 28 70 29 3b 0a 20 20 20 20  rbuStep(p);.    
1a5e0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1a5f0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20            p->rc 
1a600 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
1a610 70 49 74 65 72 2d 3e 70 53 65 6c 65 63 74 29 3b  pIter->pSelect);
1a620 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
1a630 2d 3e 6e 53 74 65 70 20 3d 20 30 3b 0a 20 20 20  ->nStep = 0;.   
1a640 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1a650 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
1a660 20 20 72 62 75 4f 62 6a 49 74 65 72 4e 65 78 74    rbuObjIterNext
1a670 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  (p, pIter);.    
1a680 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69      }..        i
1a690 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
1a6a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1a6b0 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
1a6c0 7a 54 62 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  zTbl==0 );.     
1a6d0 20 20 20 20 20 72 62 75 53 61 76 65 53 74 61 74       rbuSaveStat
1a6e0 65 28 70 2c 20 52 42 55 5f 53 54 41 47 45 5f 4d  e(p, RBU_STAGE_M
1a6f0 4f 56 45 29 3b 0a 20 20 20 20 20 20 20 20 20 20  OVE);.          
1a700 72 62 75 49 6e 63 72 53 63 68 65 6d 61 43 6f 6f  rbuIncrSchemaCoo
1a710 6b 69 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20  kie(p);.        
1a720 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
1a730 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1a740 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71        p->rc = sq
1a750 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62  lite3_exec(p->db
1a760 4d 61 69 6e 2c 20 22 43 4f 4d 4d 49 54 22 2c 20  Main, "COMMIT", 
1a770 30 2c 20 30 2c 20 26 70 2d 3e 7a 45 72 72 6d 73  0, 0, &p->zErrms
1a780 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  g);.          }.
1a790 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d            if( p-
1a7a0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
1a7b0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d  {.            p-
1a7c0 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78  >rc = sqlite3_ex
1a7d0 65 63 28 70 2d 3e 64 62 52 62 75 2c 20 22 43 4f  ec(p->dbRbu, "CO
1a7e0 4d 4d 49 54 22 2c 20 30 2c 20 30 2c 20 26 70 2d  MMIT", 0, 0, &p-
1a7f0 3e 7a 45 72 72 6d 73 67 29 3b 0a 20 20 20 20 20  >zErrmsg);.     
1a800 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1a810 20 70 2d 3e 65 53 74 61 67 65 20 3d 20 52 42 55   p->eStage = RBU
1a820 5f 53 54 41 47 45 5f 4d 4f 56 45 3b 0a 20 20 20  _STAGE_MOVE;.   
1a830 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62       }.        b
1a840 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  reak;.      }.. 
1a850 20 20 20 20 20 63 61 73 65 20 52 42 55 5f 53 54       case RBU_ST
1a860 41 47 45 5f 4d 4f 56 45 3a 20 7b 0a 20 20 20 20  AGE_MOVE: {.    
1a870 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
1a880 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1a890 20 20 20 20 20 20 72 62 75 4d 6f 76 65 4f 61 6c        rbuMoveOal
1a8a0 46 69 6c 65 28 70 29 3b 0a 20 20 20 20 20 20 20  File(p);.       
1a8b0 20 20 20 70 2d 3e 6e 50 72 6f 67 72 65 73 73 2b     p->nProgress+
1a8c0 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  +;.        }.   
1a8d0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1a8e0 20 20 7d 0a 0a 20 20 20 20 20 20 63 61 73 65 20    }..      case 
1a8f0 52 42 55 5f 53 54 41 47 45 5f 43 4b 50 54 3a 20  RBU_STAGE_CKPT: 
1a900 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  {.        if( p-
1a910 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
1a920 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
1a930 70 2d 3e 6e 53 74 65 70 3e 3d 70 2d 3e 6e 46 72  p->nStep>=p->nFr
1a940 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ame ){.         
1a950 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20     sqlite3_file 
1a960 2a 70 44 62 20 3d 20 70 2d 3e 70 54 61 72 67 65  *pDb = p->pTarge
1a970 74 46 64 2d 3e 70 52 65 61 6c 3b 0a 20 20 0a 20  tFd->pReal;.  . 
1a980 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 79             /* Sy
1a990 6e 63 20 74 68 65 20 64 62 20 66 69 6c 65 20 2a  nc the db file *
1a9a0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d  /.            p-
1a9b0 3e 72 63 20 3d 20 70 44 62 2d 3e 70 4d 65 74 68  >rc = pDb->pMeth
1a9c0 6f 64 73 2d 3e 78 53 79 6e 63 28 70 44 62 2c 20  ods->xSync(pDb, 
1a9d0 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
1a9e0 41 4c 29 3b 0a 20 20 0a 20 20 20 20 20 20 20 20  AL);.  .        
1a9f0 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 6e 42      /* Update nB
1aa00 61 63 6b 66 69 6c 6c 20 2a 2f 0a 20 20 20 20 20  ackfill */.     
1aa10 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63         if( p->rc
1aa20 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1aa30 20 20 20 20 20 20 20 20 20 20 20 20 20 76 6f 69               voi
1aa40 64 20 76 6f 6c 61 74 69 6c 65 20 2a 70 74 72 3b  d volatile *ptr;
1aa50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
1aa60 2d 3e 72 63 20 3d 20 70 44 62 2d 3e 70 4d 65 74  ->rc = pDb->pMet
1aa70 68 6f 64 73 2d 3e 78 53 68 6d 4d 61 70 28 70 44  hods->xShmMap(pD
1aa80 62 2c 20 30 2c 20 33 32 2a 31 30 32 34 2c 20 30  b, 0, 32*1024, 0
1aa90 2c 20 26 70 74 72 29 3b 0a 20 20 20 20 20 20 20  , &ptr);.       
1aaa0 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63         if( p->rc
1aab0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1aac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1aad0 28 75 33 32 20 76 6f 6c 61 74 69 6c 65 2a 29 70  (u32 volatile*)p
1aae0 74 72 29 5b 32 34 5d 20 3d 20 70 2d 3e 69 4d 61  tr)[24] = p->iMa
1aaf0 78 46 72 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  xFrame;.        
1ab00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1ab10 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 20      }.  .       
1ab20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
1ab30 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1ab40 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 65 53             p->eS
1ab50 74 61 67 65 20 3d 20 52 42 55 5f 53 54 41 47 45  tage = RBU_STAGE
1ab60 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 20  _DONE;.         
1ab70 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c       p->rc = SQL
1ab80 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20  ITE_DONE;.      
1ab90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1aba0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1abb0 20 20 20 20 20 2f 2a 20 41 74 20 6f 6e 65 20 70       /* At one p
1abc0 6f 69 6e 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69  oint the followi
1abd0 6e 67 20 62 6c 6f 63 6b 20 63 6f 70 69 65 64 20  ng block copied 
1abe0 61 20 73 69 6e 67 6c 65 20 66 72 61 6d 65 20 66  a single frame f
1abf0 72 6f 6d 20 74 68 65 0a 20 20 20 20 20 20 20 20  rom the.        
1ac00 20 20 20 20 2a 2a 20 77 61 6c 20 66 69 6c 65 20      ** wal file 
1ac10 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
1ac20 66 69 6c 65 2e 20 53 6f 20 74 68 61 74 20 6f 6e  file. So that on
1ac30 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
1ac40 33 72 62 75 5f 73 74 65 70 28 29 0a 20 20 20 20  3rbu_step().    
1ac50 20 20 20 20 20 20 20 20 2a 2a 20 63 68 65 63 6b          ** check
1ac60 70 6f 69 6e 74 65 64 20 61 20 73 69 6e 67 6c 65  pointed a single
1ac70 20 66 72 61 6d 65 2e 20 0a 20 20 20 20 20 20 20   frame. .       
1ac80 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
1ac90 20 20 20 20 2a 2a 20 48 6f 77 65 76 65 72 2c 20      ** However, 
1aca0 69 66 20 74 68 65 20 73 65 63 74 6f 72 2d 73 69  if the sector-si
1acb0 7a 65 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  ze is larger tha
1acc0 6e 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 2c  n the page-size,
1acd0 20 61 6e 64 20 74 68 65 0a 20 20 20 20 20 20 20   and the.       
1ace0 20 20 20 20 20 2a 2a 20 61 70 70 6c 69 63 61 74       ** applicat
1acf0 69 6f 6e 20 63 61 6c 6c 73 20 73 71 6c 69 74 65  ion calls sqlite
1ad00 33 72 62 75 5f 73 61 76 65 73 74 61 74 65 28 29  3rbu_savestate()
1ad10 20 6f 72 20 63 6c 6f 73 65 28 29 20 69 6d 6d 65   or close() imme
1ad20 64 69 61 74 65 6c 79 0a 20 20 20 20 20 20 20 20  diately.        
1ad30 20 20 20 20 2a 2a 20 61 66 74 65 72 20 74 68 69      ** after thi
1ad40 73 20 73 74 65 70 2c 20 74 68 65 6e 20 72 62 75  s step, then rbu
1ad50 5f 73 74 65 70 28 29 20 61 67 61 69 6e 2c 20 74  _step() again, t
1ad60 68 65 6e 20 61 20 70 6f 77 65 72 20 66 61 69 6c  hen a power fail
1ad70 75 72 65 20 6f 63 63 75 72 73 2c 0a 20 20 20 20  ure occurs,.    
1ad80 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20          ** then 
1ad90 74 68 65 20 64 61 74 61 62 61 73 65 20 70 61 67  the database pag
1ada0 65 20 77 72 69 74 74 65 6e 20 68 65 72 65 20 6d  e written here m
1adb0 61 79 20 62 65 20 64 61 6d 61 67 65 64 2e 20 57  ay be damaged. W
1adc0 6f 72 6b 20 61 72 6f 75 6e 64 0a 20 20 20 20 20  ork around.     
1add0 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 62         ** this b
1ade0 79 20 63 68 65 63 6b 70 6f 69 6e 74 69 6e 67 20  y checkpointing 
1adf0 66 72 61 6d 65 73 20 75 6e 74 69 6c 20 74 68 65  frames until the
1ae00 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68   next page in th
1ae10 65 20 61 46 72 61 6d 65 5b 5d 0a 20 20 20 20 20  e aFrame[].     
1ae20 20 20 20 20 20 20 20 2a 2a 20 6c 69 65 73 20 6f         ** lies o
1ae30 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 64 69  n a different di
1ae40 73 6b 20 73 65 63 74 6f 72 20 74 6f 20 74 68 65  sk sector to the
1ae50 20 63 75 72 72 65 6e 74 20 6f 6e 65 2e 20 2a 2f   current one. */
1ae60 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 33 32  .            u32
1ae70 20 69 53 65 63 74 6f 72 3b 0a 20 20 20 20 20 20   iSector;.      
1ae80 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20        do{.      
1ae90 20 20 20 20 20 20 20 20 52 62 75 46 72 61 6d 65          RbuFrame
1aea0 20 2a 70 46 72 61 6d 65 20 3d 20 26 70 2d 3e 61   *pFrame = &p->a
1aeb0 46 72 61 6d 65 5b 70 2d 3e 6e 53 74 65 70 5d 3b  Frame[p->nStep];
1aec0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
1aed0 53 65 63 74 6f 72 20 3d 20 28 70 46 72 61 6d 65  Sector = (pFrame
1aee0 2d 3e 69 44 62 50 61 67 65 2d 31 29 20 2f 20 70  ->iDbPage-1) / p
1aef0 2d 3e 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72  ->nPagePerSector
1af00 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1af10 72 62 75 43 68 65 63 6b 70 6f 69 6e 74 46 72 61  rbuCheckpointFra
1af20 6d 65 28 70 2c 20 70 46 72 61 6d 65 29 3b 0a 20  me(p, pFrame);. 
1af30 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
1af40 6e 53 74 65 70 2b 2b 3b 0a 20 20 20 20 20 20 20  nStep++;.       
1af50 20 20 20 20 20 7d 77 68 69 6c 65 28 20 70 2d 3e       }while( p->
1af60 6e 53 74 65 70 3c 70 2d 3e 6e 46 72 61 6d 65 20  nStep<p->nFrame 
1af70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1af80 20 20 26 26 20 69 53 65 63 74 6f 72 3d 3d 28 28    && iSector==((
1af90 70 2d 3e 61 46 72 61 6d 65 5b 70 2d 3e 6e 53 74  p->aFrame[p->nSt
1afa0 65 70 5d 2e 69 44 62 50 61 67 65 2d 31 29 20 2f  ep].iDbPage-1) /
1afb0 20 70 2d 3e 6e 50 61 67 65 50 65 72 53 65 63 74   p->nPagePerSect
1afc0 6f 72 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  or).            
1afd0 20 20 20 20 20 26 26 20 70 2d 3e 72 63 3d 3d 53       && p->rc==S
1afe0 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20 20  QLITE_OK.       
1aff0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
1b000 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d    }.          p-
1b010 3e 6e 50 72 6f 67 72 65 73 73 2b 2b 3b 0a 20 20  >nProgress++;.  
1b020 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1b030 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a  break;.      }..
1b040 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20        default:. 
1b050 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1b060 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 70    }.    return p
1b070 2d 3e 72 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ->rc;.  }else{. 
1b080 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1b090 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 7d 0a 0a 2f  _NOMEM;.  }.}../
1b0a0 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 73 74 72  *.** Compare str
1b0b0 69 6e 67 73 20 7a 31 20 61 6e 64 20 7a 32 2c 20  ings z1 and z2, 
1b0c0 72 65 74 75 72 6e 69 6e 67 20 30 20 69 66 20 74  returning 0 if t
1b0d0 68 65 79 20 61 72 65 20 69 64 65 6e 74 69 63 61  hey are identica
1b0e0 6c 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a  l, or non-zero.*
1b0f0 2a 20 6f 74 68 65 72 77 69 73 65 2e 20 45 69 74  * otherwise. Eit
1b100 68 65 72 20 6f 72 20 62 6f 74 68 20 61 72 67 75  her or both argu
1b110 6d 65 6e 74 20 6d 61 79 20 62 65 20 4e 55 4c 4c  ment may be NULL
1b120 2e 20 54 77 6f 20 4e 55 4c 4c 20 76 61 6c 75 65  . Two NULL value
1b130 73 20 61 72 65 0a 2a 2a 20 63 6f 6e 73 69 64 65  s are.** conside
1b140 72 65 64 20 65 71 75 61 6c 2c 20 61 6e 64 20 4e  red equal, and N
1b150 55 4c 4c 20 69 73 20 63 6f 6e 73 69 64 65 72 65  ULL is considere
1b160 64 20 64 69 73 74 69 6e 63 74 20 66 72 6f 6d 20  d distinct from 
1b170 61 6c 6c 20 6f 74 68 65 72 20 76 61 6c 75 65 73  all other values
1b180 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1b190 72 62 75 53 74 72 43 6f 6d 70 61 72 65 28 63 6f  rbuStrCompare(co
1b1a0 6e 73 74 20 63 68 61 72 20 2a 7a 31 2c 20 63 6f  nst char *z1, co
1b1b0 6e 73 74 20 63 68 61 72 20 2a 7a 32 29 7b 0a 20  nst char *z2){. 
1b1c0 20 69 66 28 20 7a 31 3d 3d 30 20 26 26 20 7a 32   if( z1==0 && z2
1b1d0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
1b1e0 20 20 69 66 28 20 7a 31 3d 3d 30 20 7c 7c 20 7a    if( z1==0 || z
1b1f0 32 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  2==0 ) return 1;
1b200 0a 20 20 72 65 74 75 72 6e 20 28 73 71 6c 69 74  .  return (sqlit
1b210 65 33 5f 73 74 72 69 63 6d 70 28 7a 31 2c 20 7a  e3_stricmp(z1, z
1b220 32 29 21 3d 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  2)!=0);.}../*.**
1b230 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1b240 73 20 63 61 6c 6c 65 64 20 61 73 20 70 61 72 74  s called as part
1b250 20 6f 66 20 73 71 6c 69 74 65 33 72 62 75 5f 6f   of sqlite3rbu_o
1b260 70 65 6e 28 29 20 77 68 65 6e 20 69 6e 69 74 69  pen() when initi
1b270 61 6c 69 7a 69 6e 67 0a 2a 2a 20 61 6e 20 72 62  alizing.** an rb
1b280 75 20 68 61 6e 64 6c 65 20 69 6e 20 4f 41 4c 20  u handle in OAL 
1b290 73 74 61 67 65 2e 20 49 66 20 74 68 65 20 72 62  stage. If the rb
1b2a0 75 20 75 70 64 61 74 65 20 68 61 73 20 6e 6f 74  u update has not
1b2b0 20 73 74 61 72 74 65 64 20 28 69 2e 65 2e 0a 2a   started (i.e..*
1b2c0 2a 20 74 68 65 20 72 62 75 5f 73 74 61 74 65 20  * the rbu_state 
1b2d0 74 61 62 6c 65 20 77 61 73 20 65 6d 70 74 79 29  table was empty)
1b2e0 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20   it is a no-op. 
1b2f0 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 61 72  Otherwise, it ar
1b300 72 61 6e 67 65 73 0a 2a 2a 20 74 68 69 6e 67 73  ranges.** things
1b310 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65 78   so that the nex
1b320 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  t call to sqlite
1b330 33 72 62 75 5f 73 74 65 70 28 29 20 63 6f 6e 74  3rbu_step() cont
1b340 69 6e 75 65 73 20 6f 6e 20 66 72 6f 6d 0a 2a 2a  inues on from.**
1b350 20 77 68 65 72 65 20 74 68 65 20 70 72 65 76 69   where the previ
1b360 6f 75 73 20 72 62 75 20 68 61 6e 64 6c 65 20 6c  ous rbu handle l
1b370 65 66 74 20 6f 66 66 2e 0a 2a 2a 0a 2a 2a 20 49  eft off..**.** I
1b380 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
1b390 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  s, an error code
1b3a0 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61   and error messa
1b3b0 67 65 20 61 72 65 20 6c 65 66 74 20 69 6e 20 74  ge are left in t
1b3c0 68 65 0a 2a 2a 20 72 62 75 20 68 61 6e 64 6c 65  he.** rbu handle
1b3d0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
1b3e0 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  irst argument..*
1b3f0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62  /.static void rb
1b400 75 53 65 74 75 70 4f 61 6c 28 73 71 6c 69 74 65  uSetupOal(sqlite
1b410 33 72 62 75 20 2a 70 2c 20 52 62 75 53 74 61 74  3rbu *p, RbuStat
1b420 65 20 2a 70 53 74 61 74 65 29 7b 0a 20 20 61 73  e *pState){.  as
1b430 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  sert( p->rc==SQL
1b440 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20  ITE_OK );.  if( 
1b450 70 53 74 61 74 65 2d 3e 7a 54 62 6c 20 29 7b 0a  pState->zTbl ){.
1b460 20 20 20 20 52 62 75 4f 62 6a 49 74 65 72 20 2a      RbuObjIter *
1b470 70 49 74 65 72 20 3d 20 26 70 2d 3e 6f 62 6a 69  pIter = &p->obji
1b480 74 65 72 3b 0a 20 20 20 20 69 6e 74 20 72 63 20  ter;.    int rc 
1b490 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
1b4a0 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
1b4b0 49 54 45 5f 4f 4b 20 26 26 20 70 49 74 65 72 2d  ITE_OK && pIter-
1b4c0 3e 7a 54 62 6c 20 26 26 20 28 70 49 74 65 72 2d  >zTbl && (pIter-
1b4d0 3e 62 43 6c 65 61 6e 75 70 20 0a 20 20 20 20 20  >bCleanup .     
1b4e0 20 20 7c 7c 20 72 62 75 53 74 72 43 6f 6d 70 61    || rbuStrCompa
1b4f0 72 65 28 70 49 74 65 72 2d 3e 7a 49 64 78 2c 20  re(pIter->zIdx, 
1b500 70 53 74 61 74 65 2d 3e 7a 49 64 78 29 0a 20 20  pState->zIdx).  
1b510 20 20 20 20 20 7c 7c 20 28 70 53 74 61 74 65 2d       || (pState-
1b520 3e 7a 44 61 74 61 54 62 6c 3d 3d 30 20 26 26 20  >zDataTbl==0 && 
1b530 72 62 75 53 74 72 43 6f 6d 70 61 72 65 28 70 49  rbuStrCompare(pI
1b540 74 65 72 2d 3e 7a 54 62 6c 2c 20 70 53 74 61 74  ter->zTbl, pStat
1b550 65 2d 3e 7a 54 62 6c 29 29 0a 20 20 20 20 20 20  e->zTbl)).      
1b560 20 7c 7c 20 28 70 53 74 61 74 65 2d 3e 7a 44 61   || (pState->zDa
1b570 74 61 54 62 6c 20 26 26 20 72 62 75 53 74 72 43  taTbl && rbuStrC
1b580 6f 6d 70 61 72 65 28 70 49 74 65 72 2d 3e 7a 44  ompare(pIter->zD
1b590 61 74 61 54 62 6c 2c 20 70 53 74 61 74 65 2d 3e  ataTbl, pState->
1b5a0 7a 44 61 74 61 54 62 6c 29 29 0a 20 20 20 20 29  zDataTbl)).    )
1b5b0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 62  ){.      rc = rb
1b5c0 75 4f 62 6a 49 74 65 72 4e 65 78 74 28 70 2c 20  uObjIterNext(p, 
1b5d0 70 49 74 65 72 29 3b 0a 20 20 20 20 7d 0a 0a 20  pIter);.    }.. 
1b5e0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1b5f0 45 5f 4f 4b 20 26 26 20 21 70 49 74 65 72 2d 3e  E_OK && !pIter->
1b600 7a 54 62 6c 20 29 7b 0a 20 20 20 20 20 20 72 63  zTbl ){.      rc
1b610 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
1b620 0a 20 20 20 20 20 20 70 2d 3e 7a 45 72 72 6d 73  .      p->zErrms
1b630 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  g = sqlite3_mpri
1b640 6e 74 66 28 22 72 62 75 5f 73 74 61 74 65 20 6d  ntf("rbu_state m
1b650 69 73 6d 61 74 63 68 20 65 72 72 6f 72 22 29 3b  ismatch error");
1b660 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
1b670 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1b680 0a 20 20 20 20 20 20 70 2d 3e 6e 53 74 65 70 20  .      p->nStep 
1b690 3d 20 70 53 74 61 74 65 2d 3e 6e 52 6f 77 3b 0a  = pState->nRow;.
1b6a0 20 20 20 20 20 20 72 63 20 3d 20 72 62 75 4f 62        rc = rbuOb
1b6b0 6a 49 74 65 72 50 72 65 70 61 72 65 41 6c 6c 28  jIterPrepareAll(
1b6c0 70 2c 20 26 70 2d 3e 6f 62 6a 69 74 65 72 2c 20  p, &p->objiter, 
1b6d0 70 2d 3e 6e 53 74 65 70 29 3b 0a 20 20 20 20 7d  p->nStep);.    }
1b6e0 0a 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63  ..    p->rc = rc
1b6f0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
1b700 66 20 74 68 65 72 65 20 69 73 20 61 20 22 2a 2d  f there is a "*-
1b710 6f 61 6c 22 20 66 69 6c 65 20 69 6e 20 74 68 65  oal" file in the
1b720 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 63 6f 72   file-system cor
1b730 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68  responding to th
1b740 65 0a 2a 2a 20 74 61 72 67 65 74 20 64 61 74 61  e.** target data
1b750 62 61 73 65 20 69 6e 20 74 68 65 20 66 69 6c 65  base in the file
1b760 2d 73 79 73 74 65 6d 2c 20 64 65 6c 65 74 65 20  -system, delete 
1b770 69 74 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  it. If an error 
1b780 6f 63 63 75 72 73 2c 0a 2a 2a 20 6c 65 61 76 65  occurs,.** leave
1b790 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 61   an error code a
1b7a0 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  nd error message
1b7b0 20 69 6e 20 74 68 65 20 72 62 75 20 68 61 6e 64   in the rbu hand
1b7c0 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  le..*/.static vo
1b7d0 69 64 20 72 62 75 44 65 6c 65 74 65 4f 61 6c 46  id rbuDeleteOalF
1b7e0 69 6c 65 28 73 71 6c 69 74 65 33 72 62 75 20 2a  ile(sqlite3rbu *
1b7f0 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4f 61 6c  p){.  char *zOal
1b800 20 3d 20 72 62 75 4d 50 72 69 6e 74 66 28 70 2c   = rbuMPrintf(p,
1b810 20 22 25 73 2d 6f 61 6c 22 2c 20 70 2d 3e 7a 54   "%s-oal", p->zT
1b820 61 72 67 65 74 29 3b 0a 20 20 69 66 28 20 7a 4f  arget);.  if( zO
1b830 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  al ){.    sqlite
1b840 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 73 71  3_vfs *pVfs = sq
1b850 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30  lite3_vfs_find(0
1b860 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1b870 56 66 73 20 26 26 20 70 2d 3e 72 63 3d 3d 53 51  Vfs && p->rc==SQ
1b880 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 7a 45  LITE_OK && p->zE
1b890 72 72 6d 73 67 3d 3d 30 20 29 3b 0a 20 20 20 20  rrmsg==0 );.    
1b8a0 70 56 66 73 2d 3e 78 44 65 6c 65 74 65 28 70 56  pVfs->xDelete(pV
1b8b0 66 73 2c 20 7a 4f 61 6c 2c 20 30 29 3b 0a 20 20  fs, zOal, 0);.  
1b8c0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
1b8d0 4f 61 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  Oal);.  }.}../*.
1b8e0 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 70 72  ** Allocate a pr
1b8f0 69 76 61 74 65 20 72 62 75 20 56 46 53 20 66 6f  ivate rbu VFS fo
1b900 72 20 74 68 65 20 72 62 75 20 68 61 6e 64 6c 65  r the rbu handle
1b910 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 6f   passed as the o
1b920 6e 6c 79 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e  nly.** argument.
1b930 20 54 68 69 73 20 56 46 53 20 77 69 6c 6c 20 62   This VFS will b
1b940 65 20 75 73 65 64 20 75 6e 6c 65 73 73 20 74 68  e used unless th
1b950 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
1b960 33 72 62 75 5f 6f 70 65 6e 28 29 0a 2a 2a 20 73  3rbu_open().** s
1b970 70 65 63 69 66 69 65 64 20 61 20 55 52 49 20 77  pecified a URI w
1b980 69 74 68 20 61 20 76 66 73 3d 3f 20 6f 70 74 69  ith a vfs=? opti
1b990 6f 6e 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 61  on in place of a
1b9a0 20 74 61 72 67 65 74 20 64 61 74 61 62 61 73 65   target database
1b9b0 0a 2a 2a 20 66 69 6c 65 20 6e 61 6d 65 2e 0a 2a  .** file name..*
1b9c0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62  /.static void rb
1b9d0 75 43 72 65 61 74 65 56 66 73 28 73 71 6c 69 74  uCreateVfs(sqlit
1b9e0 65 33 72 62 75 20 2a 70 29 7b 0a 20 20 69 6e 74  e3rbu *p){.  int
1b9f0 20 72 6e 64 3b 0a 20 20 63 68 61 72 20 7a 52 6e   rnd;.  char zRn
1ba00 64 5b 36 34 5d 3b 0a 0a 20 20 61 73 73 65 72 74  d[64];..  assert
1ba10 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
1ba20 4f 4b 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  OK );.  sqlite3_
1ba30 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f  randomness(sizeo
1ba40 66 28 69 6e 74 29 2c 20 28 76 6f 69 64 2a 29 26  f(int), (void*)&
1ba50 72 6e 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  rnd);.  sqlite3_
1ba60 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
1ba70 7a 52 6e 64 29 2c 20 7a 52 6e 64 2c 20 22 72 62  zRnd), zRnd, "rb
1ba80 75 5f 76 66 73 5f 25 64 22 2c 20 72 6e 64 29 3b  u_vfs_%d", rnd);
1ba90 0a 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74  .  p->rc = sqlit
1baa0 65 33 72 62 75 5f 63 72 65 61 74 65 5f 76 66 73  e3rbu_create_vfs
1bab0 28 7a 52 6e 64 2c 20 30 29 3b 0a 20 20 69 66 28  (zRnd, 0);.  if(
1bac0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1bad0 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
1bae0 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 73 71 6c  _vfs *pVfs = sql
1baf0 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 7a 52  ite3_vfs_find(zR
1bb00 6e 64 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  nd);.    assert(
1bb10 20 70 56 66 73 20 29 3b 0a 20 20 20 20 70 2d 3e   pVfs );.    p->
1bb20 7a 56 66 73 4e 61 6d 65 20 3d 20 70 56 66 73 2d  zVfsName = pVfs-
1bb30 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 28 28 72 62  >zName;.    ((rb
1bb40 75 5f 76 66 73 2a 29 70 56 66 73 29 2d 3e 70 52  u_vfs*)pVfs)->pR
1bb50 62 75 20 3d 20 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f  bu = p;.  }.}../
1bb60 2a 0a 2a 2a 20 44 65 73 74 72 6f 79 20 74 68 65  *.** Destroy the
1bb70 20 70 72 69 76 61 74 65 20 56 46 53 20 63 72 65   private VFS cre
1bb80 61 74 65 64 20 66 6f 72 20 74 68 65 20 72 62 75  ated for the rbu
1bb90 20 68 61 6e 64 6c 65 20 70 61 73 73 65 64 20 61   handle passed a
1bba0 73 20 74 68 65 20 6f 6e 6c 79 0a 2a 2a 20 61 72  s the only.** ar
1bbb0 67 75 6d 65 6e 74 20 62 79 20 61 6e 20 65 61 72  gument by an ear
1bbc0 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20 72 62 75  lier call to rbu
1bbd0 43 72 65 61 74 65 56 66 73 28 29 2e 0a 2a 2f 0a  CreateVfs()..*/.
1bbe0 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75 44  static void rbuD
1bbf0 65 6c 65 74 65 56 66 73 28 73 71 6c 69 74 65 33  eleteVfs(sqlite3
1bc00 72 62 75 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  rbu *p){.  if( p
1bc10 2d 3e 7a 56 66 73 4e 61 6d 65 20 29 7b 0a 20 20  ->zVfsName ){.  
1bc20 20 20 73 71 6c 69 74 65 33 72 62 75 5f 64 65 73    sqlite3rbu_des
1bc30 74 72 6f 79 5f 76 66 73 28 70 2d 3e 7a 56 66 73  troy_vfs(p->zVfs
1bc40 4e 61 6d 65 29 3b 0a 20 20 20 20 70 2d 3e 7a 56  Name);.    p->zV
1bc50 66 73 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a  fsName = 0;.  }.
1bc60 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 75 73  }../*.** This us
1bc70 65 72 2d 64 65 66 69 6e 65 64 20 53 51 4c 20 66  er-defined SQL f
1bc80 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b  unction is invok
1bc90 65 64 20 77 69 74 68 20 61 20 73 69 6e 67 6c 65  ed with a single
1bca0 20 61 72 67 75 6d 65 6e 74 20 2d 20 74 68 65 0a   argument - the.
1bcb0 2a 2a 20 6e 61 6d 65 20 6f 66 20 61 20 74 61 62  ** name of a tab
1bcc0 6c 65 20 65 78 70 65 63 74 65 64 20 74 6f 20 61  le expected to a
1bcd0 70 70 65 61 72 20 69 6e 20 74 68 65 20 74 61 72  ppear in the tar
1bce0 67 65 74 20 64 61 74 61 62 61 73 65 2e 20 49 74  get database. It
1bcf0 20 72 65 74 75 72 6e 73 0a 2a 2a 20 74 68 65 20   returns.** the 
1bd00 6e 75 6d 62 65 72 20 6f 66 20 61 75 78 69 6c 6c  number of auxill
1bd10 69 61 72 79 20 69 6e 64 65 78 65 73 20 6f 6e 20  iary indexes on 
1bd20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  the table..*/.st
1bd30 61 74 69 63 20 76 6f 69 64 20 72 62 75 49 6e 64  atic void rbuInd
1bd40 65 78 43 6e 74 46 75 6e 63 28 0a 20 20 73 71 6c  exCntFunc(.  sql
1bd50 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43  ite3_context *pC
1bd60 74 78 2c 20 0a 20 20 69 6e 74 20 6e 56 61 6c 2c  tx, .  int nVal,
1bd70 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
1bd80 20 2a 2a 61 70 56 61 6c 0a 29 7b 0a 20 20 73 71   **apVal.){.  sq
1bd90 6c 69 74 65 33 72 62 75 20 2a 70 20 3d 20 28 73  lite3rbu *p = (s
1bda0 71 6c 69 74 65 33 72 62 75 2a 29 73 71 6c 69 74  qlite3rbu*)sqlit
1bdb0 65 33 5f 75 73 65 72 5f 64 61 74 61 28 70 43 74  e3_user_data(pCt
1bdc0 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  x);.  sqlite3_st
1bdd0 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20  mt *pStmt = 0;. 
1bde0 20 63 68 61 72 20 2a 7a 45 72 72 6d 73 67 20 3d   char *zErrmsg =
1bdf0 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   0;.  int rc;.. 
1be00 20 61 73 73 65 72 74 28 20 6e 56 61 6c 3d 3d 31   assert( nVal==1
1be10 20 29 3b 0a 20 20 0a 20 20 72 63 20 3d 20 70 72   );.  .  rc = pr
1be20 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c  epareFreeAndColl
1be30 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 4d 61  ectError(p->dbMa
1be40 69 6e 2c 20 26 70 53 74 6d 74 2c 20 26 7a 45 72  in, &pStmt, &zEr
1be50 72 6d 73 67 2c 20 0a 20 20 20 20 20 20 73 71 6c  rmsg, .      sql
1be60 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45  ite3_mprintf("SE
1be70 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
1be80 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  OM sqlite_master
1be90 20 22 0a 20 20 20 20 20 20 20 20 22 57 48 45 52   ".        "WHER
1bea0 45 20 74 79 70 65 3d 27 69 6e 64 65 78 27 20 41  E type='index' A
1beb0 4e 44 20 74 62 6c 5f 6e 61 6d 65 20 3d 20 25 51  ND tbl_name = %Q
1bec0 22 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  ", sqlite3_value
1bed0 5f 74 65 78 74 28 61 70 56 61 6c 5b 30 5d 29 29  _text(apVal[0]))
1bee0 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  .  );.  if( rc!=
1bef0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1bf00 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
1bf10 65 72 72 6f 72 28 70 43 74 78 2c 20 7a 45 72 72  error(pCtx, zErr
1bf20 6d 73 67 2c 20 2d 31 29 3b 0a 20 20 7d 65 6c 73  msg, -1);.  }els
1bf30 65 7b 0a 20 20 20 20 69 6e 74 20 6e 49 6e 64 65  e{.    int nInde
1bf40 78 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 53  x = 0;.    if( S
1bf50 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74  QLITE_ROW==sqlit
1bf60 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29  e3_step(pStmt) )
1bf70 7b 0a 20 20 20 20 20 20 6e 49 6e 64 65 78 20 3d  {.      nIndex =
1bf80 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
1bf90 69 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20  int(pStmt, 0);. 
1bfa0 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71     }.    rc = sq
1bfb0 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
1bfc0 53 74 6d 74 29 3b 0a 20 20 20 20 69 66 28 20 72  Stmt);.    if( r
1bfd0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1bfe0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
1bff0 73 75 6c 74 5f 69 6e 74 28 70 43 74 78 2c 20 6e  sult_int(pCtx, n
1c000 49 6e 64 65 78 29 3b 0a 20 20 20 20 7d 65 6c 73  Index);.    }els
1c010 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
1c020 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 70 43  _result_error(pC
1c030 74 78 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  tx, sqlite3_errm
1c040 73 67 28 70 2d 3e 64 62 4d 61 69 6e 29 2c 20 2d  sg(p->dbMain), -
1c050 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  1);.    }.  }.. 
1c060 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45   sqlite3_free(zE
1c070 72 72 6d 73 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rrmsg);.}../*.**
1c080 20 49 66 20 74 68 65 20 52 42 55 20 64 61 74 61   If the RBU data
1c090 62 61 73 65 20 63 6f 6e 74 61 69 6e 73 20 74 68  base contains th
1c0a0 65 20 72 62 75 5f 63 6f 75 6e 74 20 74 61 62 6c  e rbu_count tabl
1c0b0 65 2c 20 75 73 65 20 69 74 20 74 6f 20 69 6e 69  e, use it to ini
1c0c0 74 69 61 6c 69 7a 65 0a 2a 2a 20 74 68 65 20 73  tialize.** the s
1c0d0 71 6c 69 74 65 33 72 62 75 2e 6e 50 68 61 73 65  qlite3rbu.nPhase
1c0e0 4f 6e 65 53 74 65 70 20 76 61 72 69 61 62 6c 65  OneStep variable
1c0f0 2e 20 54 68 65 20 73 63 68 65 6d 61 20 6f 66 20  . The schema of 
1c100 74 68 65 20 72 62 75 5f 63 6f 75 6e 74 20 74 61  the rbu_count ta
1c110 62 6c 65 0a 2a 2a 20 69 73 20 61 73 73 75 6d 65  ble.** is assume
1c120 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65  d to contain the
1c130 20 73 61 6d 65 20 63 6f 6c 75 6d 6e 73 20 61 73   same columns as
1c140 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45  :.**.**   CREATE
1c150 20 54 41 42 4c 45 20 72 62 75 5f 63 6f 75 6e 74   TABLE rbu_count
1c160 28 74 62 6c 20 54 45 58 54 20 50 52 49 4d 41 52  (tbl TEXT PRIMAR
1c170 59 20 4b 45 59 2c 20 63 6e 74 20 49 4e 54 45 47  Y KEY, cnt INTEG
1c180 45 52 29 20 57 49 54 48 4f 55 54 20 52 4f 57 49  ER) WITHOUT ROWI
1c190 44 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 73  D;.**.** There s
1c1a0 68 6f 75 6c 64 20 62 65 20 6f 6e 65 20 72 6f 77  hould be one row
1c1b0 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 66 6f   in the table fo
1c1c0 72 20 65 61 63 68 20 64 61 74 61 5f 78 78 78 20  r each data_xxx 
1c1d0 74 61 62 6c 65 20 69 6e 20 74 68 65 0a 2a 2a 20  table in the.** 
1c1e0 64 61 74 61 62 61 73 65 2e 20 54 68 65 20 27 74  database. The 't
1c1f0 62 6c 27 20 63 6f 6c 75 6d 6e 20 73 68 6f 75 6c  bl' column shoul
1c200 64 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 61  d contain the na
1c210 6d 65 20 6f 66 20 61 20 64 61 74 61 5f 78 78 78  me of a data_xxx
1c220 20 74 61 62 6c 65 2c 0a 2a 2a 20 61 6e 64 20 74   table,.** and t
1c230 68 65 20 63 6e 74 20 63 6f 6c 75 6d 6e 20 74 68  he cnt column th
1c240 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
1c250 20 69 74 20 63 6f 6e 74 61 69 6e 73 2e 0a 2a 2a   it contains..**
1c260 0a 2a 2a 20 73 71 6c 69 74 65 33 72 62 75 2e 6e  .** sqlite3rbu.n
1c270 50 68 61 73 65 4f 6e 65 53 74 65 70 20 69 73 20  PhaseOneStep is 
1c280 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 74  initialized to t
1c290 68 65 20 73 75 6d 20 6f 66 20 28 31 20 2b 20 6e  he sum of (1 + n
1c2a0 49 6e 64 65 78 29 20 2a 20 63 6e 74 0a 2a 2a 20  Index) * cnt.** 
1c2b0 66 6f 72 20 61 6c 6c 20 72 6f 77 73 20 69 6e 20  for all rows in 
1c2c0 74 68 65 20 72 62 75 5f 63 6f 75 6e 74 20 74 61  the rbu_count ta
1c2d0 62 6c 65 2c 20 77 68 65 72 65 20 6e 49 6e 64 65  ble, where nInde
1c2e0 78 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  x is the number 
1c2f0 6f 66 20 0a 2a 2a 20 69 6e 64 65 78 65 73 20 6f  of .** indexes o
1c300 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  n the correspond
1c310 69 6e 67 20 74 61 72 67 65 74 20 64 61 74 61 62  ing target datab
1c320 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  ase table..*/.st
1c330 61 74 69 63 20 76 6f 69 64 20 72 62 75 49 6e 69  atic void rbuIni
1c340 74 50 68 61 73 65 4f 6e 65 53 74 65 70 73 28 73  tPhaseOneSteps(s
1c350 71 6c 69 74 65 33 72 62 75 20 2a 70 29 7b 0a 20  qlite3rbu *p){. 
1c360 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
1c370 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
1c380 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
1c390 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 62 45   = 0;.    int bE
1c3a0 78 69 73 74 73 20 3d 20 30 3b 20 20 20 20 20 20  xists = 0;      
1c3b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1c3c0 65 20 69 66 20 72 62 75 5f 63 6f 75 6e 74 20 65  e if rbu_count e
1c3d0 78 69 73 74 73 20 2a 2f 0a 0a 20 20 20 20 70 2d  xists */..    p-
1c3e0 3e 6e 50 68 61 73 65 4f 6e 65 53 74 65 70 20 3d  >nPhaseOneStep =
1c3f0 20 2d 31 3b 0a 0a 20 20 20 20 70 2d 3e 72 63 20   -1;..    p->rc 
1c400 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
1c410 5f 66 75 6e 63 74 69 6f 6e 28 70 2d 3e 64 62 52  _function(p->dbR
1c420 62 75 2c 20 0a 20 20 20 20 20 20 20 20 22 72 62  bu, .        "rb
1c430 75 5f 69 6e 64 65 78 5f 63 6e 74 22 2c 20 31 2c  u_index_cnt", 1,
1c440 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 28 76   SQLITE_UTF8, (v
1c450 6f 69 64 2a 29 70 2c 20 72 62 75 49 6e 64 65 78  oid*)p, rbuIndex
1c460 43 6e 74 46 75 6e 63 2c 20 30 2c 20 30 0a 20 20  CntFunc, 0, 0.  
1c470 20 20 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 43    );.  .    /* C
1c480 68 65 63 6b 20 66 6f 72 20 74 68 65 20 72 62 75  heck for the rbu
1c490 5f 63 6f 75 6e 74 20 74 61 62 6c 65 2e 20 49 66  _count table. If
1c4a0 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69   it does not exi
1c4b0 73 74 2c 20 6f 72 20 69 66 20 61 6e 20 65 72 72  st, or if an err
1c4c0 6f 72 0a 20 20 20 20 2a 2a 20 6f 63 63 75 72 73  or.    ** occurs
1c4d0 2c 20 6e 50 68 61 73 65 4f 6e 65 53 74 65 70 20  , nPhaseOneStep 
1c4e0 77 69 6c 6c 20 62 65 20 6c 65 66 74 20 73 65 74  will be left set
1c4f0 20 74 6f 20 2d 31 2e 20 2a 2f 0a 20 20 20 20 69   to -1. */.    i
1c500 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
1c510 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  _OK ){.      p->
1c520 72 63 20 3d 20 70 72 65 70 61 72 65 41 6e 64 43  rc = prepareAndC
1c530 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64  ollectError(p->d
1c540 62 52 62 75 2c 20 26 70 53 74 6d 74 2c 20 26 70  bRbu, &pStmt, &p
1c550 2d 3e 7a 45 72 72 6d 73 67 2c 0a 20 20 20 20 20  ->zErrmsg,.     
1c560 20 20 20 20 20 22 53 45 4c 45 43 54 20 31 20 46       "SELECT 1 F
1c570 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
1c580 72 20 57 48 45 52 45 20 74 62 6c 5f 6e 61 6d 65  r WHERE tbl_name
1c590 20 3d 20 27 72 62 75 5f 63 6f 75 6e 74 27 22 0a   = 'rbu_count'".
1c5a0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
1c5b0 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
1c5c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1c5d0 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d   if( SQLITE_ROW=
1c5e0 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53  =sqlite3_step(pS
1c5f0 74 6d 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  tmt) ){.        
1c600 62 45 78 69 73 74 73 20 3d 20 31 3b 0a 20 20 20  bExists = 1;.   
1c610 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 72 63     }.      p->rc
1c620 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c   = sqlite3_final
1c630 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
1c640 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 70 2d 3e  }.  .    if( p->
1c650 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1c660 20 62 45 78 69 73 74 73 20 29 7b 0a 20 20 20 20   bExists ){.    
1c670 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72    p->rc = prepar
1c680 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72  eAndCollectError
1c690 28 70 2d 3e 64 62 52 62 75 2c 20 26 70 53 74 6d  (p->dbRbu, &pStm
1c6a0 74 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 0a  t, &p->zErrmsg,.
1c6b0 20 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43            "SELEC
1c6c0 54 20 73 75 6d 28 63 6e 74 20 2a 20 28 31 20 2b  T sum(cnt * (1 +
1c6d0 20 72 62 75 5f 69 6e 64 65 78 5f 63 6e 74 28 72   rbu_index_cnt(r
1c6e0 62 75 5f 74 61 72 67 65 74 5f 6e 61 6d 65 28 74  bu_target_name(t
1c6f0 62 6c 29 29 29 29 22 0a 20 20 20 20 20 20 20 20  bl))))".        
1c700 20 20 22 46 52 4f 4d 20 72 62 75 5f 63 6f 75 6e    "FROM rbu_coun
1c710 74 22 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  t".      );.    
1c720 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
1c730 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1c740 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57    if( SQLITE_ROW
1c750 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ==sqlite3_step(p
1c760 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20 20 20  Stmt) ){.       
1c770 20 20 20 70 2d 3e 6e 50 68 61 73 65 4f 6e 65 53     p->nPhaseOneS
1c780 74 65 70 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  tep = sqlite3_co
1c790 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74  lumn_int64(pStmt
1c7a0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , 0);.        }.
1c7b0 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
1c7c0 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
1c7d0 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 7d  (pStmt);.      }
1c7e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 73  .    }.  }.}...s
1c7f0 74 61 74 69 63 20 73 71 6c 69 74 65 33 72 62 75  tatic sqlite3rbu
1c800 20 2a 6f 70 65 6e 52 62 75 48 61 6e 64 6c 65 28   *openRbuHandle(
1c810 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1c820 54 61 72 67 65 74 2c 20 0a 20 20 63 6f 6e 73 74  Target, .  const
1c830 20 63 68 61 72 20 2a 7a 52 62 75 2c 0a 20 20 63   char *zRbu,.  c
1c840 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 61 74  onst char *zStat
1c850 65 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 72 62  e.){.  sqlite3rb
1c860 75 20 2a 70 3b 0a 20 20 73 69 7a 65 5f 74 20 6e  u *p;.  size_t n
1c870 54 61 72 67 65 74 20 3d 20 7a 54 61 72 67 65 74  Target = zTarget
1c880 20 3f 20 73 74 72 6c 65 6e 28 7a 54 61 72 67 65   ? strlen(zTarge
1c890 74 29 20 3a 20 30 3b 0a 20 20 73 69 7a 65 5f 74  t) : 0;.  size_t
1c8a0 20 6e 52 62 75 20 3d 20 73 74 72 6c 65 6e 28 7a   nRbu = strlen(z
1c8b0 52 62 75 29 3b 0a 20 20 73 69 7a 65 5f 74 20 6e  Rbu);.  size_t n
1c8c0 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 73 71  Byte = sizeof(sq
1c8d0 6c 69 74 65 33 72 62 75 29 20 2b 20 6e 54 61 72  lite3rbu) + nTar
1c8e0 67 65 74 2b 31 20 2b 20 6e 52 62 75 2b 31 3b 0a  get+1 + nRbu+1;.
1c8f0 0a 20 20 70 20 3d 20 28 73 71 6c 69 74 65 33 72  .  p = (sqlite3r
1c900 62 75 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  bu*)sqlite3_mall
1c910 6f 63 36 34 28 6e 42 79 74 65 29 3b 0a 20 20 69  oc64(nByte);.  i
1c920 66 28 20 70 20 29 7b 0a 20 20 20 20 52 62 75 53  f( p ){.    RbuS
1c930 74 61 74 65 20 2a 70 53 74 61 74 65 20 3d 20 30  tate *pState = 0
1c940 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65  ;..    /* Create
1c950 20 74 68 65 20 63 75 73 74 6f 6d 20 56 46 53 2e   the custom VFS.
1c960 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 70   */.    memset(p
1c970 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 71 6c 69  , 0, sizeof(sqli
1c980 74 65 33 72 62 75 29 29 3b 0a 20 20 20 20 72 62  te3rbu));.    rb
1c990 75 43 72 65 61 74 65 56 66 73 28 70 29 3b 0a 0a  uCreateVfs(p);..
1c9a0 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20      /* Open the 
1c9b0 74 61 72 67 65 74 2c 20 52 42 55 20 61 6e 64 20  target, RBU and 
1c9c0 73 74 61 74 65 20 64 61 74 61 62 61 73 65 73 20  state databases 
1c9d0 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  */.    if( p->rc
1c9e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1c9f0 20 20 20 20 20 63 68 61 72 20 2a 70 43 73 72 20       char *pCsr 
1ca00 3d 20 28 63 68 61 72 2a 29 26 70 5b 31 5d 3b 0a  = (char*)&p[1];.
1ca10 20 20 20 20 20 20 69 6e 74 20 62 52 65 74 72 79        int bRetry
1ca20 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
1ca30 7a 54 61 72 67 65 74 20 29 7b 0a 20 20 20 20 20  zTarget ){.     
1ca40 20 20 20 70 2d 3e 7a 54 61 72 67 65 74 20 3d 20     p->zTarget = 
1ca50 70 43 73 72 3b 0a 20 20 20 20 20 20 20 20 6d 65  pCsr;.        me
1ca60 6d 63 70 79 28 70 2d 3e 7a 54 61 72 67 65 74 2c  mcpy(p->zTarget,
1ca70 20 7a 54 61 72 67 65 74 2c 20 6e 54 61 72 67 65   zTarget, nTarge
1ca80 74 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 70 43  t+1);.        pC
1ca90 73 72 20 2b 3d 20 6e 54 61 72 67 65 74 2b 31 3b  sr += nTarget+1;
1caa0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
1cab0 2d 3e 7a 52 62 75 20 3d 20 70 43 73 72 3b 0a 20  ->zRbu = pCsr;. 
1cac0 20 20 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e 7a       memcpy(p->z
1cad0 52 62 75 2c 20 7a 52 62 75 2c 20 6e 52 62 75 2b  Rbu, zRbu, nRbu+
1cae0 31 29 3b 0a 20 20 20 20 20 20 70 43 73 72 20 2b  1);.      pCsr +
1caf0 3d 20 6e 52 62 75 2b 31 3b 0a 20 20 20 20 20 20  = nRbu+1;.      
1cb00 69 66 28 20 7a 53 74 61 74 65 20 29 7b 0a 20 20  if( zState ){.  
1cb10 20 20 20 20 20 20 70 2d 3e 7a 53 74 61 74 65 20        p->zState 
1cb20 3d 20 72 62 75 4d 50 72 69 6e 74 66 28 70 2c 20  = rbuMPrintf(p, 
1cb30 22 25 73 22 2c 20 7a 53 74 61 74 65 29 3b 0a 20  "%s", zState);. 
1cb40 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
1cb50 20 49 66 20 74 68 65 20 66 69 72 73 74 20 61 74   If the first at
1cb60 74 65 6d 70 74 20 74 6f 20 6f 70 65 6e 20 74 68  tempt to open th
1cb70 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1cb80 66 61 69 6c 73 20 61 6e 64 20 74 68 65 20 62 52  fails and the bR
1cb90 65 74 72 79 0a 20 20 20 20 20 20 2a 2a 20 66 6c  etry.      ** fl
1cba0 61 67 20 69 74 20 73 65 74 2c 20 74 68 69 73 20  ag it set, this 
1cbb0 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 64  means that the d
1cbc0 62 20 77 61 73 20 6e 6f 74 20 6f 70 65 6e 65 64  b was not opened
1cbd0 20 62 65 63 61 75 73 65 20 69 74 20 73 65 65 6d   because it seem
1cbe0 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 62  ed.      ** to b
1cbf0 65 20 61 20 77 61 6c 2d 6d 6f 64 65 20 64 62 2e  e a wal-mode db.
1cc00 20 42 75 74 2c 20 74 68 69 73 20 6d 61 79 20 68   But, this may h
1cc10 61 76 65 20 68 61 70 70 65 6e 65 64 20 64 75 65  ave happened due
1cc20 20 74 6f 20 61 6e 20 65 61 72 6c 69 65 72 0a 20   to an earlier. 
1cc30 20 20 20 20 20 2a 2a 20 52 42 55 20 76 61 63 75       ** RBU vacu
1cc40 75 6d 20 6f 70 65 72 61 74 69 6f 6e 20 6c 65 61  um operation lea
1cc50 76 69 6e 67 20 61 6e 20 6f 6c 64 20 77 61 6c 20  ving an old wal 
1cc60 66 69 6c 65 20 69 6e 20 74 68 65 20 64 69 72 65  file in the dire
1cc70 63 74 6f 72 79 2e 0a 20 20 20 20 20 20 2a 2a 20  ctory..      ** 
1cc80 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63  If this is the c
1cc90 61 73 65 2c 20 69 74 20 77 69 6c 6c 20 68 61 76  ase, it will hav
1cca0 65 20 62 65 65 6e 20 63 68 65 63 6b 70 6f 69 6e  e been checkpoin
1ccb0 74 65 64 20 61 6e 64 20 64 65 6c 65 74 65 64 0a  ted and deleted.
1ccc0 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 74 68        ** when th
1ccd0 65 20 68 61 6e 64 6c 65 20 77 61 73 20 63 6c 6f  e handle was clo
1cce0 73 65 64 20 61 6e 64 20 61 20 73 65 63 6f 6e 64  sed and a second
1ccf0 20 61 74 74 65 6d 70 74 20 74 6f 20 6f 70 65 6e   attempt to open
1cd00 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 64   the .      ** d
1cd10 61 74 61 62 61 73 65 20 6d 61 79 20 73 75 63 63  atabase may succ
1cd20 65 65 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 72  eed.  */.      r
1cd30 62 75 4f 70 65 6e 44 61 74 61 62 61 73 65 28 70  buOpenDatabase(p
1cd40 2c 20 26 62 52 65 74 72 79 29 3b 0a 20 20 20 20  , &bRetry);.    
1cd50 20 20 69 66 28 20 62 52 65 74 72 79 20 29 7b 0a    if( bRetry ){.
1cd60 20 20 20 20 20 20 20 20 72 62 75 4f 70 65 6e 44          rbuOpenD
1cd70 61 74 61 62 61 73 65 28 70 2c 20 30 29 3b 0a 20  atabase(p, 0);. 
1cd80 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1cd90 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
1cda0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1cdb0 70 53 74 61 74 65 20 3d 20 72 62 75 4c 6f 61 64  pState = rbuLoad
1cdc0 53 74 61 74 65 28 70 29 3b 0a 20 20 20 20 20 20  State(p);.      
1cdd0 61 73 73 65 72 74 28 20 70 53 74 61 74 65 20 7c  assert( pState |
1cde0 7c 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f  | p->rc!=SQLITE_
1cdf0 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OK );.      if( 
1ce00 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
1ce10 20 29 7b 0a 0a 20 20 20 20 20 20 20 20 69 66 28   ){..        if(
1ce20 20 70 53 74 61 74 65 2d 3e 65 53 74 61 67 65 3d   pState->eStage=
1ce30 3d 30 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20  =0 ){ .         
1ce40 20 72 62 75 44 65 6c 65 74 65 4f 61 6c 46 69 6c   rbuDeleteOalFil
1ce50 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(p);.          
1ce60 72 62 75 49 6e 69 74 50 68 61 73 65 4f 6e 65 53  rbuInitPhaseOneS
1ce70 74 65 70 73 28 70 29 3b 0a 20 20 20 20 20 20 20  teps(p);.       
1ce80 20 20 20 70 2d 3e 65 53 74 61 67 65 20 3d 20 52     p->eStage = R
1ce90 42 55 5f 53 54 41 47 45 5f 4f 41 4c 3b 0a 20 20  BU_STAGE_OAL;.  
1cea0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1ceb0 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 67 65         p->eStage
1cec0 20 3d 20 70 53 74 61 74 65 2d 3e 65 53 74 61 67   = pState->eStag
1ced0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  e;.          p->
1cee0 6e 50 68 61 73 65 4f 6e 65 53 74 65 70 20 3d 20  nPhaseOneStep = 
1cef0 70 53 74 61 74 65 2d 3e 6e 50 68 61 73 65 4f 6e  pState->nPhaseOn
1cf00 65 53 74 65 70 3b 0a 20 20 20 20 20 20 20 20 7d  eStep;.        }
1cf10 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 50 72 6f  .        p->nPro
1cf20 67 72 65 73 73 20 3d 20 70 53 74 61 74 65 2d 3e  gress = pState->
1cf30 6e 50 72 6f 67 72 65 73 73 3b 0a 20 20 20 20 20  nProgress;.     
1cf40 20 20 20 70 2d 3e 69 4f 61 6c 53 7a 20 3d 20 70     p->iOalSz = p
1cf50 53 74 61 74 65 2d 3e 69 4f 61 6c 53 7a 3b 0a 20  State->iOalSz;. 
1cf60 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1cf70 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 21 3d   assert( p->rc!=
1cf80 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e  SQLITE_OK || p->
1cf90 65 53 74 61 67 65 21 3d 30 20 29 3b 0a 0a 20 20  eStage!=0 );..  
1cfa0 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
1cfb0 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 70 54 61  ITE_OK && p->pTa
1cfc0 72 67 65 74 46 64 2d 3e 70 57 61 6c 46 64 20 29  rgetFd->pWalFd )
1cfd0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65  {.      if( p->e
1cfe0 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45  Stage==RBU_STAGE
1cff0 5f 4f 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  _OAL ){.        
1d000 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45  p->rc = SQLITE_E
1d010 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 70 2d  RROR;.        p-
1d020 3e 7a 45 72 72 6d 73 67 20 3d 20 73 71 6c 69 74  >zErrmsg = sqlit
1d030 65 33 5f 6d 70 72 69 6e 74 66 28 22 63 61 6e 6e  e3_mprintf("cann
1d040 6f 74 20 75 70 64 61 74 65 20 77 61 6c 20 6d 6f  ot update wal mo
1d050 64 65 20 64 61 74 61 62 61 73 65 22 29 3b 0a 20  de database");. 
1d060 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
1d070 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54  ->eStage==RBU_ST
1d080 41 47 45 5f 4d 4f 56 45 20 29 7b 0a 20 20 20 20  AGE_MOVE ){.    
1d090 20 20 20 20 70 2d 3e 65 53 74 61 67 65 20 3d 20      p->eStage = 
1d0a0 52 42 55 5f 53 54 41 47 45 5f 43 4b 50 54 3b 0a  RBU_STAGE_CKPT;.
1d0b0 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 74 65 70          p->nStep
1d0c0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
1d0d0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e    }..    if( p->
1d0e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a 20  rc==SQLITE_OK . 
1d0f0 20 20 20 20 26 26 20 28 70 2d 3e 65 53 74 61 67      && (p->eStag
1d100 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c  e==RBU_STAGE_OAL
1d110 20 7c 7c 20 70 2d 3e 65 53 74 61 67 65 3d 3d 52   || p->eStage==R
1d120 42 55 5f 53 54 41 47 45 5f 4d 4f 56 45 29 0a 20  BU_STAGE_MOVE). 
1d130 20 20 20 20 26 26 20 70 53 74 61 74 65 2d 3e 65      && pState->e
1d140 53 74 61 67 65 21 3d 30 0a 20 20 20 20 29 7b 0a  Stage!=0.    ){.
1d150 20 20 20 20 20 20 72 62 75 5f 66 69 6c 65 20 2a        rbu_file *
1d160 70 46 64 20 3d 20 28 72 62 75 49 73 56 61 63 75  pFd = (rbuIsVacu
1d170 75 6d 28 70 29 20 3f 20 70 2d 3e 70 52 62 75 46  um(p) ? p->pRbuF
1d180 64 20 3a 20 70 2d 3e 70 54 61 72 67 65 74 46 64  d : p->pTargetFd
1d190 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 46 64  );.      if( pFd
1d1a0 2d 3e 69 43 6f 6f 6b 69 65 21 3d 70 53 74 61 74  ->iCookie!=pStat
1d1b0 65 2d 3e 69 43 6f 6f 6b 69 65 20 29 7b 20 20 20  e->iCookie ){   
1d1c0 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20 74  .        /* At t
1d1d0 68 69 73 20 70 6f 69 6e 74 20 28 70 54 61 72 67  his point (pTarg
1d1e0 65 74 46 64 2d 3e 69 43 6f 6f 6b 69 65 29 20 63  etFd->iCookie) c
1d1f0 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75  ontains the valu
1d200 65 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20  e of the.       
1d210 20 2a 2a 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74   ** change-count
1d220 65 72 20 63 6f 6f 6b 69 65 20 28 74 68 65 20 74  er cookie (the t
1d230 68 69 6e 67 20 74 68 61 74 20 67 65 74 73 20 69  hing that gets i
1d240 6e 63 72 65 6d 65 6e 74 65 64 20 77 68 65 6e 20  ncremented when 
1d250 61 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72  a .        ** tr
1d260 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d  ansaction is com
1d270 6d 69 74 74 65 64 20 69 6e 20 72 6f 6c 6c 62 61  mitted in rollba
1d280 63 6b 20 6d 6f 64 65 29 20 63 75 72 72 65 6e 74  ck mode) current
1d290 6c 79 20 73 74 6f 72 65 64 20 6f 6e 20 0a 20 20  ly stored on .  
1d2a0 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 31 20        ** page 1 
1d2b0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1d2c0 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  file. */.       
1d2d0 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
1d2e0 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 70 2d  BUSY;.        p-
1d2f0 3e 7a 45 72 72 6d 73 67 20 3d 20 73 71 6c 69 74  >zErrmsg = sqlit
1d300 65 33 5f 6d 70 72 69 6e 74 66 28 22 64 61 74 61  e3_mprintf("data
1d310 62 61 73 65 20 6d 6f 64 69 66 69 65 64 20 64 75  base modified du
1d320 72 69 6e 67 20 72 62 75 20 25 73 22 2c 0a 20 20  ring rbu %s",.  
1d330 20 20 20 20 20 20 20 20 20 20 28 72 62 75 49 73            (rbuIs
1d340 56 61 63 75 75 6d 28 70 29 20 3f 20 22 76 61 63  Vacuum(p) ? "vac
1d350 75 75 6d 22 20 3a 20 22 75 70 64 61 74 65 22 29  uum" : "update")
1d360 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
1d370 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69    }.    }..    i
1d380 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
1d390 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  _OK ){.      if(
1d3a0 20 70 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f   p->eStage==RBU_
1d3b0 53 54 41 47 45 5f 4f 41 4c 20 29 7b 0a 20 20 20  STAGE_OAL ){.   
1d3c0 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62       sqlite3 *db
1d3d0 20 3d 20 70 2d 3e 64 62 4d 61 69 6e 3b 0a 20 20   = p->dbMain;.  
1d3e0 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71        p->rc = sq
1d3f0 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62  lite3_exec(p->db
1d400 52 62 75 2c 20 22 42 45 47 49 4e 22 2c 20 30 2c  Rbu, "BEGIN", 0,
1d410 20 30 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 29   0, &p->zErrmsg)
1d420 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 50 6f  ;..        /* Po
1d430 69 6e 74 20 74 68 65 20 6f 62 6a 65 63 74 20 69  int the object i
1d440 74 65 72 61 74 6f 72 20 61 74 20 74 68 65 20 66  terator at the f
1d450 69 72 73 74 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  irst object */. 
1d460 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63         if( p->rc
1d470 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1d480 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d           p->rc =
1d490 20 72 62 75 4f 62 6a 49 74 65 72 46 69 72 73 74   rbuObjIterFirst
1d4a0 28 70 2c 20 26 70 2d 3e 6f 62 6a 69 74 65 72 29  (p, &p->objiter)
1d4b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
1d4c0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 52       /* If the R
1d4d0 42 55 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  BU database cont
1d4e0 61 69 6e 73 20 6e 6f 20 64 61 74 61 5f 78 78 78  ains no data_xxx
1d4f0 20 74 61 62 6c 65 73 2c 20 64 65 63 6c 61 72 65   tables, declare
1d500 20 74 68 65 20 52 42 55 0a 20 20 20 20 20 20 20   the RBU.       
1d510 20 2a 2a 20 75 70 64 61 74 65 20 66 69 6e 69 73   ** update finis
1d520 68 65 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  hed.  */.       
1d530 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
1d540 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 6f 62 6a 69  TE_OK && p->obji
1d550 74 65 72 2e 7a 54 62 6c 3d 3d 30 20 29 7b 0a 20  ter.zTbl==0 ){. 
1d560 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d           p->rc =
1d570 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
1d580 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 67          p->eStag
1d590 65 20 3d 20 52 42 55 5f 53 54 41 47 45 5f 44 4f  e = RBU_STAGE_DO
1d5a0 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  NE;.        }els
1d5b0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  e{.          if(
1d5c0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1d5d0 4b 20 26 26 20 70 53 74 61 74 65 2d 3e 65 53 74  K && pState->eSt
1d5e0 61 67 65 3d 3d 30 20 26 26 20 72 62 75 49 73 56  age==0 && rbuIsV
1d5f0 61 63 75 75 6d 28 70 29 20 29 7b 0a 20 20 20 20  acuum(p) ){.    
1d600 20 20 20 20 20 20 20 20 72 62 75 43 6f 70 79 50          rbuCopyP
1d610 72 61 67 6d 61 28 70 2c 20 22 70 61 67 65 5f 73  ragma(p, "page_s
1d620 69 7a 65 22 29 3b 0a 20 20 20 20 20 20 20 20 20  ize");.         
1d630 20 20 20 72 62 75 43 6f 70 79 50 72 61 67 6d 61     rbuCopyPragma
1d640 28 70 2c 20 22 61 75 74 6f 5f 76 61 63 75 75 6d  (p, "auto_vacuum
1d650 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ");.          }.
1d660 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70  .          /* Op
1d670 65 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  en transactions 
1d680 62 6f 74 68 20 64 61 74 61 62 61 73 65 73 2e 20  both databases. 
1d690 54 68 65 20 2a 2d 6f 61 6c 20 66 69 6c 65 20 69  The *-oal file i
1d6a0 73 20 6f 70 65 6e 65 64 20 6f 72 0a 20 20 20 20  s opened or.    
1d6b0 20 20 20 20 20 20 2a 2a 20 63 72 65 61 74 65 64        ** created
1d6c0 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2e 20   at this point. 
1d6d0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
1d6e0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1d6f0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
1d700 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33   p->rc = sqlite3
1d710 5f 65 78 65 63 28 64 62 2c 20 22 42 45 47 49 4e  _exec(db, "BEGIN
1d720 20 49 4d 4d 45 44 49 41 54 45 22 2c 20 30 2c 20   IMMEDIATE", 0, 
1d730 30 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 29 3b  0, &p->zErrmsg);
1d740 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  .          }..  
1d750 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
1d760 20 69 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74   if the main dat
1d770 61 62 61 73 65 20 69 73 20 61 20 7a 69 70 76 66  abase is a zipvf
1d780 73 20 64 62 2e 20 49 66 20 69 74 20 69 73 2c 20  s db. If it is, 
1d790 73 65 74 20 74 68 65 20 75 70 70 65 72 0a 20 20  set the upper.  
1d7a0 20 20 20 20 20 20 20 20 2a 2a 20 6c 65 76 65 6c          ** level
1d7b0 20 70 61 67 65 72 20 74 6f 20 75 73 65 20 22 6a   pager to use "j
1d7c0 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6f 66 66 22  ournal_mode=off"
1d7d0 2e 20 54 68 69 73 20 70 72 65 76 65 6e 74 73 20  . This prevents 
1d7e0 69 74 20 66 72 6f 6d 20 0a 20 20 20 20 20 20 20  it from .       
1d7f0 20 20 20 2a 2a 20 67 65 6e 65 72 61 74 69 6e 67     ** generating
1d800 20 61 20 6c 61 72 67 65 20 6a 6f 75 72 6e 61 6c   a large journal
1d810 20 75 73 69 6e 67 20 61 20 74 65 6d 70 20 66 69   using a temp fi
1d820 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  le.  */.        
1d830 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
1d840 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1d850 20 20 20 20 20 20 69 6e 74 20 66 72 63 20 3d 20        int frc = 
1d860 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
1d870 74 72 6f 6c 28 64 62 2c 20 22 6d 61 69 6e 22 2c  trol(db, "main",
1d880 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 5a 49   SQLITE_FCNTL_ZI
1d890 50 56 46 53 2c 20 30 29 3b 0a 20 20 20 20 20 20  PVFS, 0);.      
1d8a0 20 20 20 20 20 20 69 66 28 20 66 72 63 3d 3d 53        if( frc==S
1d8b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d8c0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20            p->rc 
1d8d0 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 0a  = sqlite3_exec(.
1d8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d8f0 64 62 2c 20 22 50 52 41 47 4d 41 20 6a 6f 75 72  db, "PRAGMA jour
1d900 6e 61 6c 5f 6d 6f 64 65 3d 6f 66 66 22 2c 30 2c  nal_mode=off",0,
1d910 30 2c 26 70 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a  0,&p->zErrmsg);.
1d920 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1d930 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
1d940 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
1d950 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1d960 20 20 20 20 20 20 20 20 20 72 62 75 53 65 74 75           rbuSetu
1d970 70 4f 61 6c 28 70 2c 20 70 53 74 61 74 65 29 3b  pOal(p, pState);
1d980 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1d990 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
1d9a0 73 65 20 69 66 28 20 70 2d 3e 65 53 74 61 67 65  se if( p->eStage
1d9b0 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4d 4f 56 45  ==RBU_STAGE_MOVE
1d9c0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6e   ){.        /* n
1d9d0 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20 20 7d 65  o-op */.      }e
1d9e0 6c 73 65 20 69 66 28 20 70 2d 3e 65 53 74 61 67  lse if( p->eStag
1d9f0 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 43 4b 50  e==RBU_STAGE_CKP
1da00 54 20 29 7b 0a 20 20 20 20 20 20 20 20 72 62 75  T ){.        rbu
1da10 53 65 74 75 70 43 68 65 63 6b 70 6f 69 6e 74 28  SetupCheckpoint(
1da20 70 2c 20 70 53 74 61 74 65 29 3b 0a 20 20 20 20  p, pState);.    
1da30 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 65    }else if( p->e
1da40 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45  Stage==RBU_STAGE
1da50 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20  _DONE ){.       
1da60 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
1da70 44 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73  DONE;.      }els
1da80 65 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63  e{.        p->rc
1da90 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
1daa0 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  T;.      }.    }
1dab0 0a 0a 20 20 20 20 72 62 75 46 72 65 65 53 74 61  ..    rbuFreeSta
1dac0 74 65 28 70 53 74 61 74 65 29 3b 0a 20 20 7d 0a  te(pState);.  }.
1dad0 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
1dae0 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
1daf0 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 52 42 55  nd return an RBU
1db00 20 68 61 6e 64 6c 65 20 77 69 74 68 20 61 6c 6c   handle with all
1db10 20 66 69 65 6c 64 73 20 7a 65 72 6f 65 64 20 65   fields zeroed e
1db20 78 63 65 70 74 20 66 6f 72 20 74 68 65 0a 2a 2a  xcept for the.**
1db30 20 65 72 72 6f 72 20 63 6f 64 65 2c 20 77 68 69   error code, whi
1db40 63 68 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c  ch is set to SQL
1db50 49 54 45 5f 4d 49 53 55 53 45 2e 0a 2a 2f 0a 73  ITE_MISUSE..*/.s
1db60 74 61 74 69 63 20 73 71 6c 69 74 65 33 72 62 75  tatic sqlite3rbu
1db70 20 2a 72 62 75 4d 69 73 75 73 65 45 72 72 6f 72   *rbuMisuseError
1db80 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65  (void){.  sqlite
1db90 33 72 62 75 20 2a 70 52 65 74 3b 0a 20 20 70 52  3rbu *pRet;.  pR
1dba0 65 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  et = sqlite3_mal
1dbb0 6c 6f 63 36 34 28 73 69 7a 65 6f 66 28 73 71 6c  loc64(sizeof(sql
1dbc0 69 74 65 33 72 62 75 29 29 3b 0a 20 20 69 66 28  ite3rbu));.  if(
1dbd0 20 70 52 65 74 20 29 7b 0a 20 20 20 20 6d 65 6d   pRet ){.    mem
1dbe0 73 65 74 28 70 52 65 74 2c 20 30 2c 20 73 69 7a  set(pRet, 0, siz
1dbf0 65 6f 66 28 73 71 6c 69 74 65 33 72 62 75 29 29  eof(sqlite3rbu))
1dc00 3b 0a 20 20 20 20 70 52 65 74 2d 3e 72 63 20 3d  ;.    pRet->rc =
1dc10 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a   SQLITE_MISUSE;.
1dc20 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65    }.  return pRe
1dc30 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  t;.}../*.** Open
1dc40 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 6e 65   and return a ne
1dc50 77 20 52 42 55 20 68 61 6e 64 6c 65 2e 20 0a 2a  w RBU handle. .*
1dc60 2f 0a 73 71 6c 69 74 65 33 72 62 75 20 2a 73 71  /.sqlite3rbu *sq
1dc70 6c 69 74 65 33 72 62 75 5f 6f 70 65 6e 28 0a 20  lite3rbu_open(. 
1dc80 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
1dc90 72 67 65 74 2c 20 0a 20 20 63 6f 6e 73 74 20 63  rget, .  const c
1dca0 68 61 72 20 2a 7a 52 62 75 2c 0a 20 20 63 6f 6e  har *zRbu,.  con
1dcb0 73 74 20 63 68 61 72 20 2a 7a 53 74 61 74 65 0a  st char *zState.
1dcc0 29 7b 0a 20 20 69 66 28 20 7a 54 61 72 67 65 74  ){.  if( zTarget
1dcd0 3d 3d 30 20 7c 7c 20 7a 52 62 75 3d 3d 30 20 29  ==0 || zRbu==0 )
1dce0 7b 20 72 65 74 75 72 6e 20 72 62 75 4d 69 73 75  { return rbuMisu
1dcf0 73 65 45 72 72 6f 72 28 29 3b 20 7d 0a 20 20 2f  seError(); }.  /
1dd00 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20 74 68  * TODO: Check th
1dd10 61 74 20 7a 54 61 72 67 65 74 20 61 6e 64 20 7a  at zTarget and z
1dd20 52 62 75 20 61 72 65 20 6e 6f 6e 2d 4e 55 4c 4c  Rbu are non-NULL
1dd30 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 6f 70 65   */.  return ope
1dd40 6e 52 62 75 48 61 6e 64 6c 65 28 7a 54 61 72 67  nRbuHandle(zTarg
1dd50 65 74 2c 20 7a 52 62 75 2c 20 7a 53 74 61 74 65  et, zRbu, zState
1dd60 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  );.}../*.** Open
1dd70 20 61 20 68 61 6e 64 6c 65 20 74 6f 20 62 65 67   a handle to beg
1dd80 69 6e 20 6f 72 20 72 65 73 75 6d 65 20 61 6e 20  in or resume an 
1dd90 52 42 55 20 56 41 43 55 55 4d 20 6f 70 65 72 61  RBU VACUUM opera
1dda0 74 69 6f 6e 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33  tion..*/.sqlite3
1ddb0 72 62 75 20 2a 73 71 6c 69 74 65 33 72 62 75 5f  rbu *sqlite3rbu_
1ddc0 76 61 63 75 75 6d 28 0a 20 20 63 6f 6e 73 74 20  vacuum(.  const 
1ddd0 63 68 61 72 20 2a 7a 54 61 72 67 65 74 2c 20 0a  char *zTarget, .
1dde0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
1ddf0 74 61 74 65 0a 29 7b 0a 20 20 69 66 28 20 7a 54  tate.){.  if( zT
1de00 61 72 67 65 74 3d 3d 30 20 29 7b 20 72 65 74 75  arget==0 ){ retu
1de10 72 6e 20 72 62 75 4d 69 73 75 73 65 45 72 72 6f  rn rbuMisuseErro
1de20 72 28 29 3b 20 7d 0a 20 20 2f 2a 20 54 4f 44 4f  r(); }.  /* TODO
1de30 3a 20 43 68 65 63 6b 20 74 68 61 74 20 62 6f 74  : Check that bot
1de40 68 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20  h arguments are 
1de50 6e 6f 6e 2d 4e 55 4c 4c 20 2a 2f 0a 20 20 72 65  non-NULL */.  re
1de60 74 75 72 6e 20 6f 70 65 6e 52 62 75 48 61 6e 64  turn openRbuHand
1de70 6c 65 28 30 2c 20 7a 54 61 72 67 65 74 2c 20 7a  le(0, zTarget, z
1de80 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  State);.}../*.**
1de90 20 52 65 74 75 72 6e 20 74 68 65 20 64 61 74 61   Return the data
1dea0 62 61 73 65 20 68 61 6e 64 6c 65 20 75 73 65 64  base handle used
1deb0 20 62 79 20 70 52 62 75 2e 0a 2a 2f 0a 73 71 6c   by pRbu..*/.sql
1dec0 69 74 65 33 20 2a 73 71 6c 69 74 65 33 72 62 75  ite3 *sqlite3rbu
1ded0 5f 64 62 28 73 71 6c 69 74 65 33 72 62 75 20 2a  _db(sqlite3rbu *
1dee0 70 52 62 75 2c 20 69 6e 74 20 62 52 62 75 29 7b  pRbu, int bRbu){
1def0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
1df00 20 30 3b 0a 20 20 69 66 28 20 70 52 62 75 20 29   0;.  if( pRbu )
1df10 7b 0a 20 20 20 20 64 62 20 3d 20 28 62 52 62 75  {.    db = (bRbu
1df20 20 3f 20 70 52 62 75 2d 3e 64 62 52 62 75 20 3a   ? pRbu->dbRbu :
1df30 20 70 52 62 75 2d 3e 64 62 4d 61 69 6e 29 3b 0a   pRbu->dbMain);.
1df40 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 64 62 3b    }.  return db;
1df50 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  .}.../*.** If th
1df60 65 20 65 72 72 6f 72 20 63 6f 64 65 20 63 75 72  e error code cur
1df70 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e  rently stored in
1df80 20 74 68 65 20 52 42 55 20 68 61 6e 64 6c 65 20   the RBU handle 
1df90 69 73 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  is SQLITE_CONSTR
1dfa0 41 49 4e 54 2c 0a 2a 2a 20 74 68 65 6e 20 65 64  AINT,.** then ed
1dfb0 69 74 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73  it any error mes
1dfc0 73 61 67 65 20 73 74 72 69 6e 67 20 73 6f 20 61  sage string so a
1dfd0 73 20 74 6f 20 72 65 6d 6f 76 65 20 61 6c 6c 20  s to remove all 
1dfe0 6f 63 63 75 72 72 65 6e 63 65 73 20 6f 66 0a 2a  occurrences of.*
1dff0 2a 20 74 68 65 20 70 61 74 74 65 72 6e 20 22 72  * the pattern "r
1e000 62 75 5f 69 6d 70 5f 5b 30 2d 39 5d 2a 22 2e 0a  bu_imp_[0-9]*"..
1e010 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
1e020 62 75 45 64 69 74 45 72 72 6d 73 67 28 73 71 6c  buEditErrmsg(sql
1e030 69 74 65 33 72 62 75 20 2a 70 29 7b 0a 20 20 69  ite3rbu *p){.  i
1e040 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
1e050 5f 43 4f 4e 53 54 52 41 49 4e 54 20 26 26 20 70  _CONSTRAINT && p
1e060 2d 3e 7a 45 72 72 6d 73 67 20 29 7b 0a 20 20 20  ->zErrmsg ){.   
1e070 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b   unsigned int i;
1e080 0a 20 20 20 20 73 69 7a 65 5f 74 20 6e 45 72 72  .    size_t nErr
1e090 6d 73 67 20 3d 20 73 74 72 6c 65 6e 28 70 2d 3e  msg = strlen(p->
1e0a0 7a 45 72 72 6d 73 67 29 3b 0a 20 20 20 20 66 6f  zErrmsg);.    fo
1e0b0 72 28 69 3d 30 3b 20 69 3c 28 6e 45 72 72 6d 73  r(i=0; i<(nErrms
1e0c0 67 2d 38 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  g-8); i++){.    
1e0d0 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 26 70 2d    if( memcmp(&p-
1e0e0 3e 7a 45 72 72 6d 73 67 5b 69 5d 2c 20 22 72 62  >zErrmsg[i], "rb
1e0f0 75 5f 69 6d 70 5f 22 2c 20 38 29 3d 3d 30 20 29  u_imp_", 8)==0 )
1e100 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 44  {.        int nD
1e110 65 6c 20 3d 20 38 3b 0a 20 20 20 20 20 20 20 20  el = 8;.        
1e120 77 68 69 6c 65 28 20 70 2d 3e 7a 45 72 72 6d 73  while( p->zErrms
1e130 67 5b 69 2b 6e 44 65 6c 5d 3e 3d 27 30 27 20 26  g[i+nDel]>='0' &
1e140 26 20 70 2d 3e 7a 45 72 72 6d 73 67 5b 69 2b 6e  & p->zErrmsg[i+n
1e150 44 65 6c 5d 3c 3d 27 39 27 20 29 20 6e 44 65 6c  Del]<='9' ) nDel
1e160 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 6d  ++;.        memm
1e170 6f 76 65 28 26 70 2d 3e 7a 45 72 72 6d 73 67 5b  ove(&p->zErrmsg[
1e180 69 5d 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 5b  i], &p->zErrmsg[
1e190 69 2b 6e 44 65 6c 5d 2c 20 6e 45 72 72 6d 73 67  i+nDel], nErrmsg
1e1a0 20 2b 20 31 20 2d 20 69 20 2d 20 6e 44 65 6c 29   + 1 - i - nDel)
1e1b0 3b 0a 20 20 20 20 20 20 20 20 6e 45 72 72 6d 73  ;.        nErrms
1e1c0 67 20 2d 3d 20 6e 44 65 6c 3b 0a 20 20 20 20 20  g -= nDel;.     
1e1d0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
1e1e0 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20  /*.** Close the 
1e1f0 52 42 55 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69  RBU handle..*/.i
1e200 6e 74 20 73 71 6c 69 74 65 33 72 62 75 5f 63 6c  nt sqlite3rbu_cl
1e210 6f 73 65 28 73 71 6c 69 74 65 33 72 62 75 20 2a  ose(sqlite3rbu *
1e220 70 2c 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 6d  p, char **pzErrm
1e230 73 67 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  sg){.  int rc;. 
1e240 20 69 66 28 20 70 20 29 7b 0a 0a 20 20 20 20 2f   if( p ){..    /
1e250 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20 74 72 61  * Commit the tra
1e260 6e 73 61 63 74 69 6f 6e 20 74 6f 20 74 68 65 20  nsaction to the 
1e270 2a 2d 6f 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20  *-oal file. */. 
1e280 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
1e290 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 65 53  LITE_OK && p->eS
1e2a0 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f  tage==RBU_STAGE_
1e2b0 4f 41 4c 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  OAL ){.      p->
1e2c0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65  rc = sqlite3_exe
1e2d0 63 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 43 4f  c(p->dbMain, "CO
1e2e0 4d 4d 49 54 22 2c 20 30 2c 20 30 2c 20 26 70 2d  MMIT", 0, 0, &p-
1e2f0 3e 7a 45 72 72 6d 73 67 29 3b 0a 20 20 20 20 7d  >zErrmsg);.    }
1e300 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68  ..    /* Sync th
1e310 65 20 64 62 20 66 69 6c 65 20 69 66 20 63 75 72  e db file if cur
1e320 72 65 6e 74 6c 79 20 64 6f 69 6e 67 20 61 6e 20  rently doing an 
1e330 69 6e 63 72 65 6d 65 6e 74 61 6c 20 63 68 65 63  incremental chec
1e340 6b 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 69 66  kpoint */.    if
1e350 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
1e360 4f 4b 20 26 26 20 70 2d 3e 65 53 74 61 67 65 3d  OK && p->eStage=
1e370 3d 52 42 55 5f 53 54 41 47 45 5f 43 4b 50 54 20  =RBU_STAGE_CKPT 
1e380 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1e390 5f 66 69 6c 65 20 2a 70 44 62 20 3d 20 70 2d 3e  _file *pDb = p->
1e3a0 70 54 61 72 67 65 74 46 64 2d 3e 70 52 65 61 6c  pTargetFd->pReal
1e3b0 3b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20  ;.      p->rc = 
1e3c0 70 44 62 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78  pDb->pMethods->x
1e3d0 53 79 6e 63 28 70 44 62 2c 20 53 51 4c 49 54 45  Sync(pDb, SQLITE
1e3e0 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20  _SYNC_NORMAL);. 
1e3f0 20 20 20 7d 0a 0a 20 20 20 20 72 62 75 53 61 76     }..    rbuSav
1e400 65 53 74 61 74 65 28 70 2c 20 70 2d 3e 65 53 74  eState(p, p->eSt
1e410 61 67 65 29 3b 0a 0a 20 20 20 20 69 66 28 20 70  age);..    if( p
1e420 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
1e430 26 26 20 70 2d 3e 65 53 74 61 67 65 3d 3d 52 42  && p->eStage==RB
1e440 55 5f 53 54 41 47 45 5f 4f 41 4c 20 29 7b 0a 20  U_STAGE_OAL ){. 
1e450 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c       p->rc = sql
1e460 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 52  ite3_exec(p->dbR
1e470 62 75 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c  bu, "COMMIT", 0,
1e480 20 30 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 29   0, &p->zErrmsg)
1e490 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1e4a0 43 6c 6f 73 65 20 61 6e 79 20 6f 70 65 6e 20 73  Close any open s
1e4b0 74 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65 73  tatement handles
1e4c0 2e 20 2a 2f 0a 20 20 20 20 72 62 75 4f 62 6a 49  . */.    rbuObjI
1e4d0 74 65 72 46 69 6e 61 6c 69 7a 65 28 26 70 2d 3e  terFinalize(&p->
1e4e0 6f 62 6a 69 74 65 72 29 3b 0a 0a 20 20 20 20 2f  objiter);..    /
1e4f0 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
1e500 52 42 55 20 76 61 63 75 75 6d 20 68 61 6e 64 6c  RBU vacuum handl
1e510 65 20 61 6e 64 20 74 68 65 20 76 61 63 75 75 6d  e and the vacuum
1e520 20 68 61 73 20 65 69 74 68 65 72 20 66 69 6e 69   has either fini
1e530 73 68 65 64 0a 20 20 20 20 2a 2a 20 73 75 63 63  shed.    ** succ
1e540 65 73 73 66 75 6c 6c 79 20 6f 72 20 65 6e 63 6f  essfully or enco
1e550 75 6e 74 65 72 65 64 20 61 6e 20 65 72 72 6f 72  untered an error
1e560 2c 20 64 65 6c 65 74 65 20 74 68 65 20 63 6f 6e  , delete the con
1e570 74 65 6e 74 73 20 6f 66 20 74 68 65 20 0a 20 20  tents of the .  
1e580 20 20 2a 2a 20 73 74 61 74 65 20 74 61 62 6c 65    ** state table
1e590 2e 20 54 68 69 73 20 63 61 75 73 65 73 20 74 68  . This causes th
1e5a0 65 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20 73  e next call to s
1e5b0 71 6c 69 74 65 33 72 62 75 5f 76 61 63 75 75 6d  qlite3rbu_vacuum
1e5c0 28 29 20 0a 20 20 20 20 2a 2a 20 73 70 65 63 69  () .    ** speci
1e5d0 66 79 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e  fying the curren
1e5e0 74 20 74 61 72 67 65 74 20 61 6e 64 20 73 74 61  t target and sta
1e5f0 74 65 20 64 61 74 61 62 61 73 65 73 20 74 6f 20  te databases to 
1e600 73 74 61 72 74 20 61 20 6e 65 77 0a 20 20 20 20  start a new.    
1e610 2a 2a 20 76 61 63 75 75 6d 20 66 72 6f 6d 20 73  ** vacuum from s
1e620 63 72 61 74 63 68 2e 20 20 2a 2f 0a 20 20 20 20  cratch.  */.    
1e630 69 66 28 20 72 62 75 49 73 56 61 63 75 75 6d 28  if( rbuIsVacuum(
1e640 70 29 20 26 26 20 70 2d 3e 72 63 21 3d 53 51 4c  p) && p->rc!=SQL
1e650 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 64 62 52  ITE_OK && p->dbR
1e660 62 75 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  bu ){.      int 
1e670 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 65 78  rc2 = sqlite3_ex
1e680 65 63 28 70 2d 3e 64 62 52 62 75 2c 20 22 44 45  ec(p->dbRbu, "DE
1e690 4c 45 54 45 20 46 52 4f 4d 20 73 74 61 74 2e 72  LETE FROM stat.r
1e6a0 62 75 5f 73 74 61 74 65 22 2c 20 30 2c 20 30 2c  bu_state", 0, 0,
1e6b0 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   0);.      if( p
1e6c0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  ->rc==SQLITE_DON
1e6d0 45 20 26 26 20 72 63 32 21 3d 53 51 4c 49 54 45  E && rc2!=SQLITE
1e6e0 5f 4f 4b 20 29 20 70 2d 3e 72 63 20 3d 20 72 63  _OK ) p->rc = rc
1e6f0 32 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  2;.    }..    /*
1e700 20 43 6c 6f 73 65 20 74 68 65 20 6f 70 65 6e 20   Close the open 
1e710 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
1e720 61 6e 64 20 56 46 53 20 6f 62 6a 65 63 74 2e 20  and VFS object. 
1e730 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  */.    sqlite3_c
1e740 6c 6f 73 65 28 70 2d 3e 64 62 52 62 75 29 3b 0a  lose(p->dbRbu);.
1e750 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73      sqlite3_clos
1e760 65 28 70 2d 3e 64 62 4d 61 69 6e 29 3b 0a 20 20  e(p->dbMain);.  
1e770 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 7a 54    assert( p->szT
1e780 65 6d 70 3d 3d 30 20 29 3b 0a 20 20 20 20 72 62  emp==0 );.    rb
1e790 75 44 65 6c 65 74 65 56 66 73 28 70 29 3b 0a 20  uDeleteVfs(p);. 
1e7a0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1e7b0 70 2d 3e 61 42 75 66 29 3b 0a 20 20 20 20 73 71  p->aBuf);.    sq
1e7c0 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 46  lite3_free(p->aF
1e7d0 72 61 6d 65 29 3b 0a 0a 20 20 20 20 72 62 75 45  rame);..    rbuE
1e7e0 64 69 74 45 72 72 6d 73 67 28 70 29 3b 0a 20 20  ditErrmsg(p);.  
1e7f0 20 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 20 20    rc = p->rc;.  
1e800 20 20 69 66 28 20 70 7a 45 72 72 6d 73 67 20 29    if( pzErrmsg )
1e810 7b 0a 20 20 20 20 20 20 2a 70 7a 45 72 72 6d 73  {.      *pzErrms
1e820 67 20 3d 20 70 2d 3e 7a 45 72 72 6d 73 67 3b 0a  g = p->zErrmsg;.
1e830 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1e840 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
1e850 3e 7a 45 72 72 6d 73 67 29 3b 0a 20 20 20 20 7d  >zErrmsg);.    }
1e860 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
1e870 65 28 70 2d 3e 7a 53 74 61 74 65 29 3b 0a 20 20  e(p->zState);.  
1e880 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1e890 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1e8a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
1e8b0 4d 3b 0a 20 20 20 20 2a 70 7a 45 72 72 6d 73 67  M;.    *pzErrmsg
1e8c0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
1e8d0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1e8e0 52 65 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c  Return the total
1e8f0 20 6e 75 6d 62 65 72 20 6f 66 20 6b 65 79 2d 76   number of key-v
1e900 61 6c 75 65 20 6f 70 65 72 61 74 69 6f 6e 73 20  alue operations 
1e910 28 69 6e 73 65 72 74 73 2c 20 64 65 6c 65 74 65  (inserts, delete
1e920 73 20 6f 72 20 0a 2a 2a 20 75 70 64 61 74 65 73  s or .** updates
1e930 29 20 74 68 61 74 20 68 61 76 65 20 62 65 65 6e  ) that have been
1e940 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e 20 74 68   performed on th
1e950 65 20 74 61 72 67 65 74 20 64 61 74 61 62 61 73  e target databas
1e960 65 20 73 69 6e 63 65 20 74 68 65 0a 2a 2a 20 63  e since the.** c
1e970 75 72 72 65 6e 74 20 52 42 55 20 75 70 64 61 74  urrent RBU updat
1e980 65 20 77 61 73 20 73 74 61 72 74 65 64 2e 0a 2a  e was started..*
1e990 2f 0a 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  /.sqlite3_int64 
1e9a0 73 71 6c 69 74 65 33 72 62 75 5f 70 72 6f 67 72  sqlite3rbu_progr
1e9b0 65 73 73 28 73 71 6c 69 74 65 33 72 62 75 20 2a  ess(sqlite3rbu *
1e9c0 70 52 62 75 29 7b 0a 20 20 72 65 74 75 72 6e 20  pRbu){.  return 
1e9d0 70 52 62 75 2d 3e 6e 50 72 6f 67 72 65 73 73 3b  pRbu->nProgress;
1e9e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1e9f0 20 70 65 72 6d 79 72 69 61 64 61 67 65 20 70 72   permyriadage pr
1ea00 6f 67 72 65 73 73 20 69 6e 64 69 63 61 74 69 6f  ogress indicatio
1ea10 6e 73 20 66 6f 72 20 74 68 65 20 74 77 6f 20 6d  ns for the two m
1ea20 61 69 6e 20 73 74 61 67 65 73 20 6f 66 0a 2a 2a  ain stages of.**
1ea30 20 61 6e 20 52 42 55 20 75 70 64 61 74 65 2e 0a   an RBU update..
1ea40 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 72  */.void sqlite3r
1ea50 62 75 5f 62 70 5f 70 72 6f 67 72 65 73 73 28 73  bu_bp_progress(s
1ea60 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 69 6e  qlite3rbu *p, in
1ea70 74 20 2a 70 6e 4f 6e 65 2c 20 69 6e 74 20 2a 70  t *pnOne, int *p
1ea80 6e 54 77 6f 29 7b 0a 20 20 63 6f 6e 73 74 20 69  nTwo){.  const i
1ea90 6e 74 20 4d 41 58 5f 50 52 4f 47 52 45 53 53 20  nt MAX_PROGRESS 
1eaa0 3d 20 31 30 30 30 30 3b 0a 20 20 73 77 69 74 63  = 10000;.  switc
1eab0 68 28 20 70 2d 3e 65 53 74 61 67 65 20 29 7b 0a  h( p->eStage ){.
1eac0 20 20 20 20 63 61 73 65 20 52 42 55 5f 53 54 41      case RBU_STA
1ead0 47 45 5f 4f 41 4c 3a 0a 20 20 20 20 20 20 69 66  GE_OAL:.      if
1eae0 28 20 70 2d 3e 6e 50 68 61 73 65 4f 6e 65 53 74  ( p->nPhaseOneSt
1eaf0 65 70 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ep>0 ){.        
1eb00 2a 70 6e 4f 6e 65 20 3d 20 28 69 6e 74 29 28 4d  *pnOne = (int)(M
1eb10 41 58 5f 50 52 4f 47 52 45 53 53 20 2a 20 28 69  AX_PROGRESS * (i
1eb20 36 34 29 70 2d 3e 6e 50 72 6f 67 72 65 73 73 2f  64)p->nProgress/
1eb30 28 69 36 34 29 70 2d 3e 6e 50 68 61 73 65 4f 6e  (i64)p->nPhaseOn
1eb40 65 53 74 65 70 29 3b 0a 20 20 20 20 20 20 7d 65  eStep);.      }e
1eb50 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2a 70 6e  lse{.        *pn
1eb60 4f 6e 65 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  One = -1;.      
1eb70 7d 0a 20 20 20 20 20 20 2a 70 6e 54 77 6f 20 3d  }.      *pnTwo =
1eb80 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   0;.      break;
1eb90 0a 0a 20 20 20 20 63 61 73 65 20 52 42 55 5f 53  ..    case RBU_S
1eba0 54 41 47 45 5f 4d 4f 56 45 3a 0a 20 20 20 20 20  TAGE_MOVE:.     
1ebb0 20 2a 70 6e 4f 6e 65 20 3d 20 4d 41 58 5f 50 52   *pnOne = MAX_PR
1ebc0 4f 47 52 45 53 53 3b 0a 20 20 20 20 20 20 2a 70  OGRESS;.      *p
1ebd0 6e 54 77 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20  nTwo = 0;.      
1ebe0 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
1ebf0 20 52 42 55 5f 53 54 41 47 45 5f 43 4b 50 54 3a   RBU_STAGE_CKPT:
1ec00 0a 20 20 20 20 20 20 2a 70 6e 4f 6e 65 20 3d 20  .      *pnOne = 
1ec10 4d 41 58 5f 50 52 4f 47 52 45 53 53 3b 0a 20 20  MAX_PROGRESS;.  
1ec20 20 20 20 20 2a 70 6e 54 77 6f 20 3d 20 28 69 6e      *pnTwo = (in
1ec30 74 29 28 4d 41 58 5f 50 52 4f 47 52 45 53 53 20  t)(MAX_PROGRESS 
1ec40 2a 20 28 69 36 34 29 70 2d 3e 6e 53 74 65 70 20  * (i64)p->nStep 
1ec50 2f 20 28 69 36 34 29 70 2d 3e 6e 46 72 61 6d 65  / (i64)p->nFrame
1ec60 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1ec70 0a 20 20 20 20 63 61 73 65 20 52 42 55 5f 53 54  .    case RBU_ST
1ec80 41 47 45 5f 44 4f 4e 45 3a 0a 20 20 20 20 20 20  AGE_DONE:.      
1ec90 2a 70 6e 4f 6e 65 20 3d 20 4d 41 58 5f 50 52 4f  *pnOne = MAX_PRO
1eca0 47 52 45 53 53 3b 0a 20 20 20 20 20 20 2a 70 6e  GRESS;.      *pn
1ecb0 54 77 6f 20 3d 20 4d 41 58 5f 50 52 4f 47 52 45  Two = MAX_PROGRE
1ecc0 53 53 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  SS;.      break;
1ecd0 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20  ..    default:. 
1ece0 20 20 20 20 20 61 73 73 65 72 74 28 20 30 20 29       assert( 0 )
1ecf0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
1ed00 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e  eturn the curren
1ed10 74 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 52  t state of the R
1ed20 42 55 20 76 61 63 75 75 6d 20 6f 72 20 75 70 64  BU vacuum or upd
1ed30 61 74 65 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a  ate operation..*
1ed40 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 72 62 75  /.int sqlite3rbu
1ed50 5f 73 74 61 74 65 28 73 71 6c 69 74 65 33 72 62  _state(sqlite3rb
1ed60 75 20 2a 70 29 7b 0a 20 20 69 6e 74 20 61 52 65  u *p){.  int aRe
1ed70 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 30 2c 20 53  s[] = {.    0, S
1ed80 51 4c 49 54 45 5f 52 42 55 5f 53 54 41 54 45 5f  QLITE_RBU_STATE_
1ed90 4f 41 4c 2c 20 53 51 4c 49 54 45 5f 52 42 55 5f  OAL, SQLITE_RBU_
1eda0 53 54 41 54 45 5f 4d 4f 56 45 2c 0a 20 20 20 20  STATE_MOVE,.    
1edb0 30 2c 20 53 51 4c 49 54 45 5f 52 42 55 5f 53 54  0, SQLITE_RBU_ST
1edc0 41 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 2c 20  ATE_CHECKPOINT, 
1edd0 53 51 4c 49 54 45 5f 52 42 55 5f 53 54 41 54 45  SQLITE_RBU_STATE
1ede0 5f 44 4f 4e 45 0a 20 20 7d 3b 0a 0a 20 20 61 73  _DONE.  };..  as
1edf0 73 65 72 74 28 20 52 42 55 5f 53 54 41 47 45 5f  sert( RBU_STAGE_
1ee00 4f 41 4c 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65  OAL==1 );.  asse
1ee10 72 74 28 20 52 42 55 5f 53 54 41 47 45 5f 4d 4f  rt( RBU_STAGE_MO
1ee20 56 45 3d 3d 32 20 29 3b 0a 20 20 61 73 73 65 72  VE==2 );.  asser
1ee30 74 28 20 52 42 55 5f 53 54 41 47 45 5f 43 4b 50  t( RBU_STAGE_CKP
1ee40 54 3d 3d 34 20 29 3b 0a 20 20 61 73 73 65 72 74  T==4 );.  assert
1ee50 28 20 52 42 55 5f 53 54 41 47 45 5f 44 4f 4e 45  ( RBU_STAGE_DONE
1ee60 3d 3d 35 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==5 );.  assert(
1ee70 20 61 52 65 73 5b 52 42 55 5f 53 54 41 47 45 5f   aRes[RBU_STAGE_
1ee80 4f 41 4c 5d 3d 3d 53 51 4c 49 54 45 5f 52 42 55  OAL]==SQLITE_RBU
1ee90 5f 53 54 41 54 45 5f 4f 41 4c 20 29 3b 0a 20 20  _STATE_OAL );.  
1eea0 61 73 73 65 72 74 28 20 61 52 65 73 5b 52 42 55  assert( aRes[RBU
1eeb0 5f 53 54 41 47 45 5f 4d 4f 56 45 5d 3d 3d 53 51  _STAGE_MOVE]==SQ
1eec0 4c 49 54 45 5f 52 42 55 5f 53 54 41 54 45 5f 4d  LITE_RBU_STATE_M
1eed0 4f 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OVE );.  assert(
1eee0 20 61 52 65 73 5b 52 42 55 5f 53 54 41 47 45 5f   aRes[RBU_STAGE_
1eef0 43 4b 50 54 5d 3d 3d 53 51 4c 49 54 45 5f 52 42  CKPT]==SQLITE_RB
1ef00 55 5f 53 54 41 54 45 5f 43 48 45 43 4b 50 4f 49  U_STATE_CHECKPOI
1ef10 4e 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  NT );.  assert( 
1ef20 61 52 65 73 5b 52 42 55 5f 53 54 41 47 45 5f 44  aRes[RBU_STAGE_D
1ef30 4f 4e 45 5d 3d 3d 53 51 4c 49 54 45 5f 52 42 55  ONE]==SQLITE_RBU
1ef40 5f 53 54 41 54 45 5f 44 4f 4e 45 20 29 3b 0a 0a  _STATE_DONE );..
1ef50 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c    if( p->rc!=SQL
1ef60 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 72 63 21  ITE_OK && p->rc!
1ef70 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a  =SQLITE_DONE ){.
1ef80 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1ef90 45 5f 52 42 55 5f 53 54 41 54 45 5f 45 52 52 4f  E_RBU_STATE_ERRO
1efa0 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  R;.  }else{.    
1efb0 61 73 73 65 72 74 28 20 70 2d 3e 72 63 21 3d 53  assert( p->rc!=S
1efc0 51 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c 20 70 2d  QLITE_DONE || p-
1efd0 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41  >eStage==RBU_STA
1efe0 47 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 61  GE_DONE );.    a
1eff0 73 73 65 72 74 28 20 70 2d 3e 65 53 74 61 67 65  ssert( p->eStage
1f000 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 0a  ==RBU_STAGE_OAL.
1f010 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65           || p->e
1f020 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45  Stage==RBU_STAGE
1f030 5f 4d 4f 56 45 0a 20 20 20 20 20 20 20 20 20 7c  _MOVE.         |
1f040 7c 20 70 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55  | p->eStage==RBU
1f050 5f 53 54 41 47 45 5f 43 4b 50 54 0a 20 20 20 20  _STAGE_CKPT.    
1f060 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 67       || p->eStag
1f070 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 44 4f 4e  e==RBU_STAGE_DON
1f080 45 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 65 74  E.    );.    ret
1f090 75 72 6e 20 61 52 65 73 5b 70 2d 3e 65 53 74 61  urn aRes[p->eSta
1f0a0 67 65 5d 3b 0a 20 20 7d 0a 7d 0a 0a 69 6e 74 20  ge];.  }.}..int 
1f0b0 73 71 6c 69 74 65 33 72 62 75 5f 73 61 76 65 73  sqlite3rbu_saves
1f0c0 74 61 74 65 28 73 71 6c 69 74 65 33 72 62 75 20  tate(sqlite3rbu 
1f0d0 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  *p){.  int rc = 
1f0e0 70 2d 3e 72 63 3b 0a 20 20 69 66 28 20 72 63 3d  p->rc;.  if( rc=
1f0f0 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 20 72  =SQLITE_DONE ) r
1f100 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1f110 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65  ..  assert( p->e
1f120 53 74 61 67 65 3e 3d 52 42 55 5f 53 54 41 47 45  Stage>=RBU_STAGE
1f130 5f 4f 41 4c 20 26 26 20 70 2d 3e 65 53 74 61 67  _OAL && p->eStag
1f140 65 3c 3d 52 42 55 5f 53 54 41 47 45 5f 44 4f 4e  e<=RBU_STAGE_DON
1f150 45 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 65 53  E );.  if( p->eS
1f160 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f  tage==RBU_STAGE_
1f170 4f 41 4c 20 29 7b 0a 20 20 20 20 61 73 73 65 72  OAL ){.    asser
1f180 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  t( rc!=SQLITE_DO
1f190 4e 45 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  NE );.    if( rc
1f1a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63  ==SQLITE_OK ) rc
1f1b0 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28   = sqlite3_exec(
1f1c0 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 43 4f 4d 4d  p->dbMain, "COMM
1f1d0 49 54 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  IT", 0, 0, 0);. 
1f1e0 20 7d 0a 0a 20 20 2f 2a 20 53 79 6e 63 20 74 68   }..  /* Sync th
1f1f0 65 20 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20 69  e db file */.  i
1f200 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1f210 20 26 26 20 70 2d 3e 65 53 74 61 67 65 3d 3d 52   && p->eStage==R
1f220 42 55 5f 53 54 41 47 45 5f 43 4b 50 54 20 29 7b  BU_STAGE_CKPT ){
1f230 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  .    sqlite3_fil
1f240 65 20 2a 70 44 62 20 3d 20 70 2d 3e 70 54 61 72  e *pDb = p->pTar
1f250 67 65 74 46 64 2d 3e 70 52 65 61 6c 3b 0a 20 20  getFd->pReal;.  
1f260 20 20 72 63 20 3d 20 70 44 62 2d 3e 70 4d 65 74    rc = pDb->pMet
1f270 68 6f 64 73 2d 3e 78 53 79 6e 63 28 70 44 62 2c  hods->xSync(pDb,
1f280 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
1f290 4d 41 4c 29 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e  MAL);.  }..  p->
1f2a0 72 63 20 3d 20 72 63 3b 0a 20 20 72 62 75 53 61  rc = rc;.  rbuSa
1f2b0 76 65 53 74 61 74 65 28 70 2c 20 70 2d 3e 65 53  veState(p, p->eS
1f2c0 74 61 67 65 29 3b 0a 20 20 72 63 20 3d 20 70 2d  tage);.  rc = p-
1f2d0 3e 72 63 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 65  >rc;..  if( p->e
1f2e0 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45  Stage==RBU_STAGE
1f2f0 5f 4f 41 4c 20 29 7b 0a 20 20 20 20 61 73 73 65  _OAL ){.    asse
1f300 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
1f310 4f 4e 45 20 29 3b 0a 20 20 20 20 69 66 28 20 72  ONE );.    if( r
1f320 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c==SQLITE_OK ) r
1f330 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  c = sqlite3_exec
1f340 28 70 2d 3e 64 62 52 62 75 2c 20 22 43 4f 4d 4d  (p->dbRbu, "COMM
1f350 49 54 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  IT", 0, 0, 0);. 
1f360 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1f370 45 5f 4f 4b 20 29 20 72 63 20 3d 20 73 71 6c 69  E_OK ) rc = sqli
1f380 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 52 62  te3_exec(p->dbRb
1f390 75 2c 20 22 42 45 47 49 4e 20 49 4d 4d 45 44 49  u, "BEGIN IMMEDI
1f3a0 41 54 45 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  ATE", 0, 0, 0);.
1f3b0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1f3c0 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 73 71 6c  TE_OK ) rc = sql
1f3d0 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 4d  ite3_exec(p->dbM
1f3e0 61 69 6e 2c 20 22 42 45 47 49 4e 20 49 4d 4d 45  ain, "BEGIN IMME
1f3f0 44 49 41 54 45 22 2c 20 30 2c 20 30 2c 30 29 3b  DIATE", 0, 0,0);
1f400 0a 20 20 7d 0a 0a 20 20 70 2d 3e 72 63 20 3d 20  .  }..  p->rc = 
1f410 72 63 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  rc;.  return rc;
1f420 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}../***********
1f430 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f440 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f450 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f460 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
1f470 2a 2a 20 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20  ** Beginning of 
1f480 52 42 55 20 56 46 53 20 73 68 69 6d 20 6d 65 74  RBU VFS shim met
1f490 68 6f 64 73 2e 20 54 68 65 20 56 46 53 20 73 68  hods. The VFS sh
1f4a0 69 6d 20 6d 6f 64 69 66 69 65 73 20 74 68 65 20  im modifies the 
1f4b0 62 65 68 61 76 69 6f 75 72 0a 2a 2a 20 6f 66 20  behaviour.** of 
1f4c0 61 20 73 74 61 6e 64 61 72 64 20 56 46 53 20 69  a standard VFS i
1f4d0 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
1f4e0 77 61 79 73 3a 0a 2a 2a 0a 2a 2a 20 31 2e 20 57  ways:.**.** 1. W
1f4f0 68 65 6e 65 76 65 72 20 74 68 65 20 66 69 72 73  henever the firs
1f500 74 20 70 61 67 65 20 6f 66 20 61 20 6d 61 69 6e  t page of a main
1f510 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
1f520 73 20 72 65 61 64 20 6f 72 20 0a 2a 2a 20 20 20  s read or .**   
1f530 20 77 72 69 74 74 65 6e 2c 20 74 68 65 20 76 61   written, the va
1f540 6c 75 65 20 6f 66 20 74 68 65 20 63 68 61 6e 67  lue of the chang
1f550 65 2d 63 6f 75 6e 74 65 72 20 63 6f 6f 6b 69 65  e-counter cookie
1f560 20 69 73 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a   is stored in.**
1f570 20 20 20 20 72 62 75 5f 66 69 6c 65 2e 69 43 6f      rbu_file.iCo
1f580 6f 6b 69 65 2e 20 53 69 6d 69 6c 61 72 6c 79 2c  okie. Similarly,
1f590 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
1f5a0 65 20 22 77 72 69 74 65 2d 76 65 72 73 69 6f 6e  e "write-version
1f5b0 22 0a 2a 2a 20 20 20 20 64 61 74 61 62 61 73 65  ".**    database
1f5c0 20 68 65 61 64 65 72 20 66 69 65 6c 64 20 69 73   header field is
1f5d0 20 73 74 6f 72 65 64 20 69 6e 20 72 62 75 5f 66   stored in rbu_f
1f5e0 69 6c 65 2e 69 57 72 69 74 65 56 65 72 2e 20 54  ile.iWriteVer. T
1f5f0 68 69 73 20 65 6e 73 75 72 65 73 0a 2a 2a 20 20  his ensures.**  
1f600 20 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65    that the value
1f610 73 20 61 72 65 20 61 6c 77 61 79 73 20 74 72 75  s are always tru
1f620 73 74 77 6f 72 74 68 79 20 77 69 74 68 69 6e 20  stworthy within 
1f630 61 6e 20 6f 70 65 6e 20 74 72 61 6e 73 61 63 74  an open transact
1f640 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 32 2e 20 57 68  ion..**.** 2. Wh
1f650 65 6e 65 76 65 72 20 61 6e 20 53 51 4c 49 54 45  enever an SQLITE
1f660 5f 4f 50 45 4e 5f 57 41 4c 20 66 69 6c 65 20 69  _OPEN_WAL file i
1f670 73 20 6f 70 65 6e 65 64 2c 20 74 68 65 20 28 72  s opened, the (r
1f680 62 75 5f 66 69 6c 65 2e 70 57 61 6c 46 64 29 0a  bu_file.pWalFd).
1f690 2a 2a 20 20 20 20 6d 65 6d 62 65 72 20 76 61 72  **    member var
1f6a0 69 61 62 6c 65 20 6f 66 20 74 68 65 20 61 73 73  iable of the ass
1f6b0 6f 63 69 61 74 65 64 20 64 61 74 61 62 61 73 65  ociated database
1f6c0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
1f6d0 20 69 73 20 73 65 74 0a 2a 2a 20 20 20 20 74 6f   is set.**    to
1f6e0 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65   point to the ne
1f6f0 77 20 66 69 6c 65 2e 20 41 20 6d 75 74 65 78 20  w file. A mutex 
1f700 70 72 6f 74 65 63 74 65 64 20 6c 69 6e 6b 65 64  protected linked
1f710 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 6d 61 69   list of all mai
1f720 6e 20 0a 2a 2a 20 20 20 20 64 62 20 66 64 73 20  n .**    db fds 
1f730 6f 70 65 6e 65 64 20 75 73 69 6e 67 20 61 20 70  opened using a p
1f740 61 72 74 69 63 75 6c 61 72 20 52 42 55 20 56 46  articular RBU VF
1f750 53 20 69 73 20 6d 61 69 6e 74 61 69 6e 65 64 20  S is maintained 
1f760 61 74 20 0a 2a 2a 20 20 20 20 72 62 75 5f 76 66  at .**    rbu_vf
1f770 73 2e 70 4d 61 69 6e 20 74 6f 20 66 61 63 69 6c  s.pMain to facil
1f780 69 74 61 74 65 20 74 68 69 73 2e 0a 2a 2a 0a 2a  itate this..**.*
1f790 2a 20 33 2e 20 55 73 69 6e 67 20 61 20 6e 65 77  * 3. Using a new
1f7a0 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 22 53   file-control "S
1f7b0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 52 42 55 22  QLITE_FCNTL_RBU"
1f7c0 2c 20 61 20 6d 61 69 6e 20 64 62 20 72 62 75 5f  , a main db rbu_
1f7d0 66 69 6c 65 20 0a 2a 2a 20 20 20 20 6f 62 6a 65  file .**    obje
1f7e0 63 74 20 63 61 6e 20 62 65 20 6d 61 72 6b 65 64  ct can be marked
1f7f0 20 61 73 20 74 68 65 20 74 61 72 67 65 74 20 64   as the target d
1f800 61 74 61 62 61 73 65 20 6f 66 20 61 6e 20 52 42  atabase of an RB
1f810 55 20 75 70 64 61 74 65 2e 20 54 68 69 73 0a 2a  U update. This.*
1f820 2a 20 20 20 20 74 75 72 6e 73 20 6f 6e 20 74 68  *    turns on th
1f830 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 78 74 72  e following extr
1f840 61 20 73 70 65 63 69 61 6c 20 62 65 68 61 76 69  a special behavi
1f850 6f 75 72 3a 0a 2a 2a 0a 2a 2a 20 33 61 2e 20 49  our:.**.** 3a. I
1f860 66 20 78 41 63 63 65 73 73 28 29 20 69 73 20 63  f xAccess() is c
1f870 61 6c 6c 65 64 20 74 6f 20 63 68 65 63 6b 20 69  alled to check i
1f880 66 20 74 68 65 72 65 20 65 78 69 73 74 73 20 61  f there exists a
1f890 20 2a 2d 77 61 6c 20 66 69 6c 65 20 0a 2a 2a 20   *-wal file .** 
1f8a0 20 20 20 20 61 73 73 6f 63 69 61 74 65 64 20 77      associated w
1f8b0 69 74 68 20 61 6e 20 52 42 55 20 74 61 72 67 65  ith an RBU targe
1f8c0 74 20 64 61 74 61 62 61 73 65 20 63 75 72 72 65  t database curre
1f8d0 6e 74 6c 79 20 69 6e 20 52 42 55 5f 53 54 41 47  ntly in RBU_STAG
1f8e0 45 5f 4f 41 4c 0a 2a 2a 20 20 20 20 20 73 74 61  E_OAL.**     sta
1f8f0 67 65 20 28 70 72 65 70 61 72 69 6e 67 20 74 68  ge (preparing th
1f900 65 20 2a 2d 6f 61 6c 20 66 69 6c 65 29 2c 20 74  e *-oal file), t
1f910 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 70 65  he following spe
1f920 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67 0a 2a 2a  cial handling.**
1f930 20 20 20 20 20 61 70 70 6c 69 65 73 3a 0a 2a 2a       applies:.**
1f940 0a 2a 2a 20 20 20 20 20 20 2a 20 69 66 20 74 68  .**      * if th
1f950 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 64 6f 65  e *-wal file doe
1f960 73 20 65 78 69 73 74 2c 20 72 65 74 75 72 6e 20  s exist, return 
1f970 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2e  SQLITE_CANTOPEN.
1f980 20 41 6e 20 52 42 55 0a 2a 2a 20 20 20 20 20 20   An RBU.**      
1f990 20 20 74 61 72 67 65 74 20 64 61 74 61 62 61 73    target databas
1f9a0 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 20  e may not be in 
1f9b0 77 61 6c 20 6d 6f 64 65 20 61 6c 72 65 61 64 79  wal mode already
1f9c0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 2a 20 69  ..**.**      * i
1f9d0 66 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65  f the *-wal file
1f9e0 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c   does not exist,
1f9f0 20 73 65 74 20 74 68 65 20 6f 75 74 70 75 74 20   set the output 
1fa00 70 61 72 61 6d 65 74 65 72 20 74 6f 0a 2a 2a 20  parameter to.** 
1fa10 20 20 20 20 20 20 20 6e 6f 6e 2d 7a 65 72 6f 20         non-zero 
1fa20 28 74 6f 20 74 65 6c 6c 20 53 51 4c 69 74 65 20  (to tell SQLite 
1fa30 74 68 61 74 20 69 74 20 64 6f 65 73 20 65 78 69  that it does exi
1fa40 73 74 29 20 61 6e 79 77 61 79 2e 0a 2a 2a 0a 2a  st) anyway..**.*
1fa50 2a 20 20 20 20 20 54 68 65 6e 2c 20 77 68 65 6e  *     Then, when
1fa60 20 78 4f 70 65 6e 28 29 20 69 73 20 63 61 6c 6c   xOpen() is call
1fa70 65 64 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 2a  ed to open the *
1fa80 2d 77 61 6c 20 66 69 6c 65 20 61 73 73 6f 63 69  -wal file associ
1fa90 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 20 20 20  ated with.**    
1faa0 20 74 68 65 20 52 42 55 20 74 61 72 67 65 74 20   the RBU target 
1fab0 69 6e 20 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c  in RBU_STAGE_OAL
1fac0 20 73 74 61 67 65 2c 20 69 6e 73 74 65 61 64 20   stage, instead 
1fad0 6f 66 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 2a  of opening the *
1fae0 2d 77 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65  -wal.**     file
1faf0 2c 20 74 68 65 20 72 62 75 20 76 66 73 20 6f 70  , the rbu vfs op
1fb00 65 6e 73 20 74 68 65 20 63 6f 72 72 65 73 70 6f  ens the correspo
1fb10 6e 64 69 6e 67 20 2a 2d 6f 61 6c 20 66 69 6c 65  nding *-oal file
1fb20 20 69 6e 73 74 65 61 64 2e 20 0a 2a 2a 0a 2a 2a   instead. .**.**
1fb30 20 33 62 2e 20 54 68 65 20 2a 2d 73 68 6d 20 70   3b. The *-shm p
1fb40 61 67 65 73 20 72 65 74 75 72 6e 65 64 20 62 79  ages returned by
1fb50 20 78 53 68 6d 4d 61 70 28 29 20 66 6f 72 20 61   xShmMap() for a
1fb60 20 74 61 72 67 65 74 20 64 62 20 66 69 6c 65 20   target db file 
1fb70 69 6e 0a 2a 2a 20 20 20 20 20 52 42 55 5f 53 54  in.**     RBU_ST
1fb80 41 47 45 5f 4f 41 4c 20 6d 6f 64 65 20 61 72 65  AGE_OAL mode are
1fb90 20 61 63 74 75 61 6c 6c 79 20 73 74 6f 72 65 64   actually stored
1fba0 20 69 6e 20 68 65 61 70 20 6d 65 6d 6f 72 79 2e   in heap memory.
1fbb0 20 54 68 69 73 20 69 73 20 74 6f 0a 2a 2a 20 20   This is to.**  
1fbc0 20 20 20 61 76 6f 69 64 20 63 72 65 61 74 69 6e     avoid creatin
1fbd0 67 20 61 20 2a 2d 73 68 6d 20 66 69 6c 65 20 6f  g a *-shm file o
1fbe0 6e 20 64 69 73 6b 2e 20 41 64 64 69 74 69 6f 6e  n disk. Addition
1fbf0 61 6c 6c 79 2c 20 78 53 68 6d 4c 6f 63 6b 28 29  ally, xShmLock()
1fc00 20 63 61 6c 6c 73 0a 2a 2a 20 20 20 20 20 61 72   calls.**     ar
1fc10 65 20 6e 6f 2d 6f 70 73 20 6f 6e 20 74 61 72 67  e no-ops on targ
1fc20 65 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  et database file
1fc30 73 20 69 6e 20 52 42 55 5f 53 54 41 47 45 5f 4f  s in RBU_STAGE_O
1fc40 41 4c 20 6d 6f 64 65 2e 20 54 68 69 73 20 69 73  AL mode. This is
1fc50 0a 2a 2a 20 20 20 20 20 62 65 63 61 75 73 65 20  .**     because 
1fc60 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
1fc70 6e 74 73 20 69 6e 20 73 6f 6d 65 20 56 46 53 20  nts in some VFS 
1fc80 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20  implementations 
1fc90 66 61 69 6c 20 69 66 20 0a 2a 2a 20 20 20 20 20  fail if .**     
1fca0 78 53 68 6d 4c 6f 63 6b 28 29 20 69 73 20 63 61  xShmLock() is ca
1fcb0 6c 6c 65 64 20 62 65 66 6f 72 65 20 78 53 68 6d  lled before xShm
1fcc0 4d 61 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 33 63 2e  Map()..**.** 3c.
1fcd0 20 49 66 20 61 6e 20 45 58 43 4c 55 53 49 56 45   If an EXCLUSIVE
1fce0 20 6c 6f 63 6b 20 69 73 20 61 74 74 65 6d 70 74   lock is attempt
1fcf0 65 64 20 6f 6e 20 61 20 74 61 72 67 65 74 20 64  ed on a target d
1fd00 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20  atabase file in 
1fd10 61 6e 79 0a 2a 2a 20 20 20 20 20 6d 6f 64 65 20  any.**     mode 
1fd20 65 78 63 65 70 74 20 52 42 55 5f 53 54 41 47 45  except RBU_STAGE
1fd30 5f 44 4f 4e 45 20 28 61 6c 6c 20 77 6f 72 6b 20  _DONE (all work 
1fd40 63 6f 6d 70 6c 65 74 65 64 20 61 6e 64 20 63 68  completed and ch
1fd50 65 63 6b 70 6f 69 6e 74 65 64 29 2c 20 69 74 20  eckpointed), it 
1fd60 0a 2a 2a 20 20 20 20 20 66 61 69 6c 73 20 77 69  .**     fails wi
1fd70 74 68 20 61 6e 20 53 51 4c 49 54 45 5f 42 55 53  th an SQLITE_BUS
1fd80 59 20 65 72 72 6f 72 2e 20 54 68 69 73 20 69 73  Y error. This is
1fd90 20 74 6f 20 73 74 6f 70 20 52 42 55 20 63 6f 6e   to stop RBU con
1fda0 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20 20 20 20 20  nections.**     
1fdb0 66 72 6f 6d 20 61 75 74 6f 6d 61 74 69 63 61 6c  from automatical
1fdc0 6c 79 20 63 68 65 63 6b 70 6f 69 6e 74 69 6e 67  ly checkpointing
1fdd0 20 61 20 2a 2d 77 61 6c 20 28 6f 72 20 2a 2d 6f   a *-wal (or *-o
1fde0 61 6c 29 20 66 69 6c 65 20 66 72 6f 6d 20 77 69  al) file from wi
1fdf0 74 68 69 6e 0a 2a 2a 20 20 20 20 20 73 71 6c 69  thin.**     sqli
1fe00 74 65 33 5f 63 6c 6f 73 65 28 29 2e 0a 2a 2a 0a  te3_close()..**.
1fe10 2a 2a 20 33 64 2e 20 49 6e 20 52 42 55 5f 53 54  ** 3d. In RBU_ST
1fe20 41 47 45 5f 43 41 50 54 55 52 45 20 6d 6f 64 65  AGE_CAPTURE mode
1fe30 2c 20 61 6c 6c 20 78 52 65 61 64 28 29 20 63 61  , all xRead() ca
1fe40 6c 6c 73 20 6f 6e 20 74 68 65 20 77 61 6c 20 66  lls on the wal f
1fe50 69 6c 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 20  ile, and.**     
1fe60 61 6c 6c 20 78 57 72 69 74 65 28 29 20 63 61 6c  all xWrite() cal
1fe70 6c 73 20 6f 6e 20 74 68 65 20 74 61 72 67 65 74  ls on the target
1fe80 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 70   database file p
1fe90 65 72 66 6f 72 6d 20 6e 6f 20 49 4f 2e 20 0a 2a  erform no IO. .*
1fea0 2a 20 20 20 20 20 49 6e 73 74 65 61 64 20 74 68  *     Instead th
1feb0 65 20 66 72 61 6d 65 20 61 6e 64 20 70 61 67 65  e frame and page
1fec0 20 6e 75 6d 62 65 72 73 20 74 68 61 74 20 77 6f   numbers that wo
1fed0 75 6c 64 20 62 65 20 72 65 61 64 20 61 6e 64 20  uld be read and 
1fee0 77 72 69 74 74 65 6e 0a 2a 2a 20 20 20 20 20 61  written.**     a
1fef0 72 65 20 72 65 63 6f 72 64 65 64 2e 20 41 64 64  re recorded. Add
1ff00 69 74 69 6f 6e 61 6c 6c 79 2c 20 73 75 63 63 65  itionally, succe
1ff10 73 73 66 75 6c 20 61 74 74 65 6d 70 74 73 20 74  ssful attempts t
1ff20 6f 20 6f 62 74 61 69 6e 20 65 78 63 6c 75 73 69  o obtain exclusi
1ff30 76 65 0a 2a 2a 20 20 20 20 20 78 53 68 6d 4c 6f  ve.**     xShmLo
1ff40 63 6b 28 29 20 57 52 49 54 45 52 2c 20 43 48 45  ck() WRITER, CHE
1ff50 43 4b 50 4f 49 4e 54 45 52 20 61 6e 64 20 52 45  CKPOINTER and RE
1ff60 41 44 30 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65  AD0 locks on the
1ff70 20 74 61 72 67 65 74 20 0a 2a 2a 20 20 20 20 20   target .**     
1ff80 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 72  database file ar
1ff90 65 20 72 65 63 6f 72 64 65 64 2e 20 78 53 68 6d  e recorded. xShm
1ffa0 4c 6f 63 6b 28 29 20 63 61 6c 6c 73 20 74 6f 20  Lock() calls to 
1ffb0 75 6e 6c 6f 63 6b 20 74 68 65 20 73 61 6d 65 0a  unlock the same.
1ffc0 2a 2a 20 20 20 20 20 6c 6f 63 6b 73 20 61 72 65  **     locks are
1ffd0 20 6e 6f 2d 6f 70 73 20 28 73 6f 20 74 68 61 74   no-ops (so that
1ffe0 20 6f 6e 63 65 20 6f 62 74 61 69 6e 65 64 2c 20   once obtained, 
1fff0 74 68 65 73 65 20 6c 6f 63 6b 73 20 61 72 65 20  these locks are 
20000 6e 65 76 65 72 0a 2a 2a 20 20 20 20 20 72 65 6c  never.**     rel
20010 69 6e 71 75 69 73 68 65 64 29 2e 20 46 69 6e 61  inquished). Fina
20020 6c 6c 79 2c 20 63 61 6c 6c 73 20 74 6f 20 78 53  lly, calls to xS
20030 79 6e 63 28 29 20 6f 6e 20 74 68 65 20 74 61 72  ync() on the tar
20040 67 65 74 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  get database.** 
20050 20 20 20 20 66 69 6c 65 20 66 61 69 6c 20 77 69      file fail wi
20060 74 68 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e  th SQLITE_INTERN
20070 41 4c 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 0a 73  AL errors..*/..s
20080 74 61 74 69 63 20 76 6f 69 64 20 72 62 75 55 6e  tatic void rbuUn
20090 6c 6f 63 6b 53 68 6d 28 72 62 75 5f 66 69 6c 65  lockShm(rbu_file
200a0 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
200b0 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20 53  p->openFlags & S
200c0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
200d0 44 42 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70  DB );.  if( p->p
200e0 52 62 75 20 29 7b 0a 20 20 20 20 69 6e 74 20 28  Rbu ){.    int (
200f0 2a 78 53 68 6d 4c 6f 63 6b 29 28 73 71 6c 69 74  *xShmLock)(sqlit
20100 65 33 5f 66 69 6c 65 2a 2c 69 6e 74 2c 69 6e 74  e3_file*,int,int
20110 2c 69 6e 74 29 20 3d 20 70 2d 3e 70 52 65 61 6c  ,int) = p->pReal
20120 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53 68 6d  ->pMethods->xShm
20130 4c 6f 63 6b 3b 0a 20 20 20 20 69 6e 74 20 69 3b  Lock;.    int i;
20140 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
20150 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b  SQLITE_SHM_NLOCK
20160 3b 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  ;i++){.      if(
20170 20 28 31 3c 3c 69 29 20 26 20 70 2d 3e 70 52 62   (1<<i) & p->pRb
20180 75 2d 3e 6d 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  u->mLock ){.    
20190 20 20 20 20 78 53 68 6d 4c 6f 63 6b 28 70 2d 3e      xShmLock(p->
201a0 70 52 65 61 6c 2c 20 69 2c 20 31 2c 20 53 51 4c  pReal, i, 1, SQL
201b0 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 7c 53  ITE_SHM_UNLOCK|S
201c0 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53  QLITE_SHM_EXCLUS
201d0 49 56 45 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  IVE);.      }.  
201e0 20 20 7d 0a 20 20 20 20 70 2d 3e 70 52 62 75 2d    }.    p->pRbu-
201f0 3e 6d 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 7d 0a  >mLock = 0;.  }.
20200 7d 0a 0a 2f 2a 0a 2a 2f 0a 73 74 61 74 69 63 20  }../*.*/.static 
20210 69 6e 74 20 72 62 75 55 70 64 61 74 65 54 65 6d  int rbuUpdateTem
20220 70 53 69 7a 65 28 72 62 75 5f 66 69 6c 65 20 2a  pSize(rbu_file *
20230 70 46 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74  pFd, sqlite3_int
20240 36 34 20 6e 4e 65 77 29 7b 0a 20 20 73 71 6c 69  64 nNew){.  sqli
20250 74 65 33 72 62 75 20 2a 70 52 62 75 20 3d 20 70  te3rbu *pRbu = p
20260 46 64 2d 3e 70 52 62 75 3b 0a 20 20 69 36 34 20  Fd->pRbu;.  i64 
20270 6e 44 69 66 66 20 3d 20 6e 4e 65 77 20 2d 20 70  nDiff = nNew - p
20280 46 64 2d 3e 73 7a 3b 0a 20 20 70 52 62 75 2d 3e  Fd->sz;.  pRbu->
20290 73 7a 54 65 6d 70 20 2b 3d 20 6e 44 69 66 66 3b  szTemp += nDiff;
202a0 0a 20 20 70 46 64 2d 3e 73 7a 20 3d 20 6e 4e 65  .  pFd->sz = nNe
202b0 77 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 62  w;.  assert( pRb
202c0 75 2d 3e 73 7a 54 65 6d 70 3e 3d 30 20 29 3b 0a  u->szTemp>=0 );.
202d0 20 20 69 66 28 20 70 52 62 75 2d 3e 73 7a 54 65    if( pRbu->szTe
202e0 6d 70 4c 69 6d 69 74 20 26 26 20 70 52 62 75 2d  mpLimit && pRbu-
202f0 3e 73 7a 54 65 6d 70 3e 70 52 62 75 2d 3e 73 7a  >szTemp>pRbu->sz
20300 54 65 6d 70 4c 69 6d 69 74 20 29 20 72 65 74 75  TempLimit ) retu
20310 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a  rn SQLITE_FULL;.
20320 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
20330 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  OK;.}../*.** Clo
20340 73 65 20 61 6e 20 72 62 75 20 66 69 6c 65 2e 0a  se an rbu file..
20350 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62  */.static int rb
20360 75 56 66 73 43 6c 6f 73 65 28 73 71 6c 69 74 65  uVfsClose(sqlite
20370 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  3_file *pFile){.
20380 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 20 3d 20    rbu_file *p = 
20390 28 72 62 75 5f 66 69 6c 65 2a 29 70 46 69 6c 65  (rbu_file*)pFile
203a0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  ;.  int rc;.  in
203b0 74 20 69 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20  t i;..  /* Free 
203c0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
203d0 74 68 65 20 61 70 53 68 6d 5b 5d 20 61 72 72 61  the apShm[] arra
203e0 79 2e 20 41 6e 64 20 74 68 65 20 61 72 72 61 79  y. And the array
203f0 20 69 74 73 65 6c 66 2e 20 2a 2f 0a 20 20 66 6f   itself. */.  fo
20400 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 68 6d  r(i=0; i<p->nShm
20410 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
20420 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 70 53 68  te3_free(p->apSh
20430 6d 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  m[i]);.  }.  sql
20440 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 70 53  ite3_free(p->apS
20450 68 6d 29 3b 0a 20 20 70 2d 3e 61 70 53 68 6d 20  hm);.  p->apShm 
20460 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  = 0;.  sqlite3_f
20470 72 65 65 28 70 2d 3e 7a 44 65 6c 29 3b 0a 0a 20  ree(p->zDel);.. 
20480 20 69 66 28 20 70 2d 3e 6f 70 65 6e 46 6c 61 67   if( p->openFlag
20490 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
204a0 4d 41 49 4e 5f 44 42 20 29 7b 0a 20 20 20 20 72  MAIN_DB ){.    r
204b0 62 75 5f 66 69 6c 65 20 2a 2a 70 70 3b 0a 20 20  bu_file **pp;.  
204c0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
204d0 65 6e 74 65 72 28 70 2d 3e 70 52 62 75 56 66 73  enter(p->pRbuVfs
204e0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 66 6f  ->mutex);.    fo
204f0 72 28 70 70 3d 26 70 2d 3e 70 52 62 75 56 66 73  r(pp=&p->pRbuVfs
20500 2d 3e 70 4d 61 69 6e 3b 20 2a 70 70 21 3d 70 3b  ->pMain; *pp!=p;
20510 20 70 70 3d 26 28 28 2a 70 70 29 2d 3e 70 4d 61   pp=&((*pp)->pMa
20520 69 6e 4e 65 78 74 29 29 3b 0a 20 20 20 20 2a 70  inNext));.    *p
20530 70 20 3d 20 70 2d 3e 70 4d 61 69 6e 4e 65 78 74  p = p->pMainNext
20540 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  ;.    sqlite3_mu
20550 74 65 78 5f 6c 65 61 76 65 28 70 2d 3e 70 52 62  tex_leave(p->pRb
20560 75 56 66 73 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  uVfs->mutex);.  
20570 20 20 72 62 75 55 6e 6c 6f 63 6b 53 68 6d 28 70    rbuUnlockShm(p
20580 29 3b 0a 20 20 20 20 70 2d 3e 70 52 65 61 6c 2d  );.    p->pReal-
20590 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53 68 6d 55  >pMethods->xShmU
205a0 6e 6d 61 70 28 70 2d 3e 70 52 65 61 6c 2c 20 30  nmap(p->pReal, 0
205b0 29 3b 0a 20 20 7d 0a 20 20 65 6c 73 65 20 69 66  );.  }.  else if
205c0 28 20 28 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20  ( (p->openFlags 
205d0 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45  & SQLITE_OPEN_DE
205e0 4c 45 54 45 4f 4e 43 4c 4f 53 45 29 20 26 26 20  LETEONCLOSE) && 
205f0 70 2d 3e 70 52 62 75 20 29 7b 0a 20 20 20 20 72  p->pRbu ){.    r
20600 62 75 55 70 64 61 74 65 54 65 6d 70 53 69 7a 65  buUpdateTempSize
20610 28 70 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f  (p, 0);.  }..  /
20620 2a 20 43 6c 6f 73 65 20 74 68 65 20 75 6e 64 65  * Close the unde
20630 72 6c 79 69 6e 67 20 66 69 6c 65 20 68 61 6e 64  rlying file hand
20640 6c 65 20 2a 2f 0a 20 20 72 63 20 3d 20 70 2d 3e  le */.  rc = p->
20650 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d  pReal->pMethods-
20660 3e 78 43 6c 6f 73 65 28 70 2d 3e 70 52 65 61 6c  >xClose(p->pReal
20670 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
20680 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61  }.../*.** Read a
20690 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 75 6e 73  nd return an uns
206a0 69 67 6e 65 64 20 33 32 2d 62 69 74 20 62 69 67  igned 32-bit big
206b0 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
206c0 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20  from the buffer 
206d0 0a 2a 2a 20 70 61 73 73 65 64 20 61 73 20 74 68  .** passed as th
206e0 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e  e only argument.
206f0 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 72  .*/.static u32 r
20700 62 75 47 65 74 55 33 32 28 75 38 20 2a 61 42 75  buGetU32(u8 *aBu
20710 66 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 28 75  f){.  return ((u
20720 33 32 29 61 42 75 66 5b 30 5d 20 3c 3c 20 32 34  32)aBuf[0] << 24
20730 29 0a 20 20 20 20 20 20 20 2b 20 28 28 75 33 32  ).       + ((u32
20740 29 61 42 75 66 5b 31 5d 20 3c 3c 20 31 36 29 0a  )aBuf[1] << 16).
20750 20 20 20 20 20 20 20 2b 20 28 28 75 33 32 29 61         + ((u32)a
20760 42 75 66 5b 32 5d 20 3c 3c 20 20 38 29 0a 20 20  Buf[2] <<  8).  
20770 20 20 20 20 20 2b 20 28 28 75 33 32 29 61 42 75       + ((u32)aBu
20780 66 5b 33 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  f[3]);.}../*.** 
20790 57 72 69 74 65 20 61 6e 20 75 6e 73 69 67 6e 65  Write an unsigne
207a0 64 20 33 32 2d 62 69 74 20 76 61 6c 75 65 20 69  d 32-bit value i
207b0 6e 20 62 69 67 2d 65 6e 64 69 61 6e 20 66 6f 72  n big-endian for
207c0 6d 61 74 20 74 6f 20 74 68 65 20 73 75 70 70 6c  mat to the suppl
207d0 69 65 64 0a 2a 2a 20 62 75 66 66 65 72 2e 0a 2a  ied.** buffer..*
207e0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62  /.static void rb
207f0 75 50 75 74 55 33 32 28 75 38 20 2a 61 42 75 66  uPutU32(u8 *aBuf
20800 2c 20 75 33 32 20 69 56 61 6c 29 7b 0a 20 20 61  , u32 iVal){.  a
20810 42 75 66 5b 30 5d 20 3d 20 28 69 56 61 6c 20 3e  Buf[0] = (iVal >
20820 3e 20 32 34 29 20 26 20 30 78 46 46 3b 0a 20 20  > 24) & 0xFF;.  
20830 61 42 75 66 5b 31 5d 20 3d 20 28 69 56 61 6c 20  aBuf[1] = (iVal 
20840 3e 3e 20 31 36 29 20 26 20 30 78 46 46 3b 0a 20  >> 16) & 0xFF;. 
20850 20 61 42 75 66 5b 32 5d 20 3d 20 28 69 56 61 6c   aBuf[2] = (iVal
20860 20 3e 3e 20 20 38 29 20 26 20 30 78 46 46 3b 0a   >>  8) & 0xFF;.
20870 20 20 61 42 75 66 5b 33 5d 20 3d 20 28 69 56 61    aBuf[3] = (iVa
20880 6c 20 3e 3e 20 20 30 29 20 26 20 30 78 46 46 3b  l >>  0) & 0xFF;
20890 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
208a0 72 62 75 50 75 74 55 31 36 28 75 38 20 2a 61 42  rbuPutU16(u8 *aB
208b0 75 66 2c 20 75 31 36 20 69 56 61 6c 29 7b 0a 20  uf, u16 iVal){. 
208c0 20 61 42 75 66 5b 30 5d 20 3d 20 28 69 56 61 6c   aBuf[0] = (iVal
208d0 20 3e 3e 20 20 38 29 20 26 20 30 78 46 46 3b 0a   >>  8) & 0xFF;.
208e0 20 20 61 42 75 66 5b 31 5d 20 3d 20 28 69 56 61    aBuf[1] = (iVa
208f0 6c 20 3e 3e 20 20 30 29 20 26 20 30 78 46 46 3b  l >>  0) & 0xFF;
20900 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64  .}../*.** Read d
20910 61 74 61 20 66 72 6f 6d 20 61 6e 20 72 62 75 56  ata from an rbuV
20920 66 73 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  fs-file..*/.stat
20930 69 63 20 69 6e 74 20 72 62 75 56 66 73 52 65 61  ic int rbuVfsRea
20940 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  d(.  sqlite3_fil
20950 65 20 2a 70 46 69 6c 65 2c 20 0a 20 20 76 6f 69  e *pFile, .  voi
20960 64 20 2a 7a 42 75 66 2c 20 0a 20 20 69 6e 74 20  d *zBuf, .  int 
20970 69 41 6d 74 2c 20 0a 20 20 73 71 6c 69 74 65 5f  iAmt, .  sqlite_
20980 69 6e 74 36 34 20 69 4f 66 73 74 0a 29 7b 0a 20  int64 iOfst.){. 
20990 20 72 62 75 5f 66 69 6c 65 20 2a 70 20 3d 20 28   rbu_file *p = (
209a0 72 62 75 5f 66 69 6c 65 2a 29 70 46 69 6c 65 3b  rbu_file*)pFile;
209b0 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20 2a 70  .  sqlite3rbu *p
209c0 52 62 75 20 3d 20 70 2d 3e 70 52 62 75 3b 0a 20  Rbu = p->pRbu;. 
209d0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
209e0 70 52 62 75 20 26 26 20 70 52 62 75 2d 3e 65 53  pRbu && pRbu->eS
209f0 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f  tage==RBU_STAGE_
20a00 43 41 50 54 55 52 45 20 29 7b 0a 20 20 20 20 61  CAPTURE ){.    a
20a10 73 73 65 72 74 28 20 70 2d 3e 6f 70 65 6e 46 6c  ssert( p->openFl
20a20 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
20a30 4e 5f 57 41 4c 20 29 3b 0a 20 20 20 20 72 63 20  N_WAL );.    rc 
20a40 3d 20 72 62 75 43 61 70 74 75 72 65 57 61 6c 52  = rbuCaptureWalR
20a50 65 61 64 28 70 2d 3e 70 52 62 75 2c 20 69 4f 66  ead(p->pRbu, iOf
20a60 73 74 2c 20 69 41 6d 74 29 3b 0a 20 20 7d 65 6c  st, iAmt);.  }el
20a70 73 65 7b 0a 20 20 20 20 69 66 28 20 70 52 62 75  se{.    if( pRbu
20a80 20 26 26 20 70 52 62 75 2d 3e 65 53 74 61 67 65   && pRbu->eStage
20a90 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20  ==RBU_STAGE_OAL 
20aa0 0a 20 20 20 20 20 26 26 20 28 70 2d 3e 6f 70 65  .     && (p->ope
20ab0 6e 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  nFlags & SQLITE_
20ac0 4f 50 45 4e 5f 57 41 4c 29 20 0a 20 20 20 20 20  OPEN_WAL) .     
20ad0 26 26 20 69 4f 66 73 74 3e 3d 70 52 62 75 2d 3e  && iOfst>=pRbu->
20ae0 69 4f 61 6c 53 7a 20 0a 20 20 20 20 29 7b 0a 20  iOalSz .    ){. 
20af0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
20b00 5f 4f 4b 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65  _OK;.      memse
20b10 74 28 7a 42 75 66 2c 20 30 2c 20 69 41 6d 74 29  t(zBuf, 0, iAmt)
20b20 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
20b30 20 20 20 72 63 20 3d 20 70 2d 3e 70 52 65 61 6c     rc = p->pReal
20b40 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 52 65 61  ->pMethods->xRea
20b50 64 28 70 2d 3e 70 52 65 61 6c 2c 20 7a 42 75 66  d(p->pReal, zBuf
20b60 2c 20 69 41 6d 74 2c 20 69 4f 66 73 74 29 3b 0a  , iAmt, iOfst);.
20b70 23 69 66 20 31 0a 20 20 20 20 20 20 2f 2a 20 49  #if 1.      /* I
20b80 66 20 74 68 69 73 20 69 73 20 62 65 69 6e 67 20  f this is being 
20b90 63 61 6c 6c 65 64 20 74 6f 20 72 65 61 64 20 74  called to read t
20ba0 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
20bb0 20 74 68 65 20 74 61 72 67 65 74 20 0a 20 20 20   the target .   
20bc0 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61     ** database a
20bd0 73 20 70 61 72 74 20 6f 66 20 61 6e 20 72 62 75  s part of an rbu
20be0 20 76 61 63 75 75 6d 20 6f 70 65 72 61 74 69 6f   vacuum operatio
20bf0 6e 2c 20 73 79 6e 74 68 65 73 69 7a 65 20 74 68  n, synthesize th
20c00 65 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74  e .      ** cont
20c10 65 6e 74 73 20 6f 66 20 74 68 65 20 66 69 72 73  ents of the firs
20c20 74 20 70 61 67 65 20 69 66 20 69 74 20 64 6f 65  t page if it doe
20c30 73 20 6e 6f 74 20 79 65 74 20 65 78 69 73 74 2e  s not yet exist.
20c40 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20 20 20   Otherwise,.    
20c50 20 20 2a 2a 20 53 51 4c 69 74 65 20 77 69 6c 6c    ** SQLite will
20c60 20 6e 6f 74 20 63 68 65 63 6b 20 66 6f 72 20 61   not check for a
20c70 20 2a 2d 77 61 6c 20 66 69 6c 65 2e 20 20 2a 2f   *-wal file.  */
20c80 0a 20 20 20 20 20 20 69 66 28 20 70 52 62 75 20  .      if( pRbu 
20c90 26 26 20 72 62 75 49 73 56 61 63 75 75 6d 28 70  && rbuIsVacuum(p
20ca0 52 62 75 29 20 0a 20 20 20 20 20 20 20 20 20 20  Rbu) .          
20cb0 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  && rc==SQLITE_IO
20cc0 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 26  ERR_SHORT_READ &
20cd0 26 20 69 4f 66 73 74 3d 3d 30 0a 20 20 20 20 20  & iOfst==0.     
20ce0 20 20 20 20 20 26 26 20 28 70 2d 3e 6f 70 65 6e       && (p->open
20cf0 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  Flags & SQLITE_O
20d00 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 0a 20 20 20  PEN_MAIN_DB).   
20d10 20 20 20 20 20 20 20 26 26 20 70 52 62 75 2d 3e         && pRbu->
20d20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  rc==SQLITE_OK.  
20d30 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73      ){.        s
20d40 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 64  qlite3_file *pFd
20d50 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65   = (sqlite3_file
20d60 2a 29 70 52 62 75 2d 3e 70 52 62 75 46 64 3b 0a  *)pRbu->pRbuFd;.
20d70 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 46 64          rc = pFd
20d80 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 52 65 61  ->pMethods->xRea
20d90 64 28 70 46 64 2c 20 7a 42 75 66 2c 20 69 41 6d  d(pFd, zBuf, iAm
20da0 74 2c 20 69 4f 66 73 74 29 3b 0a 20 20 20 20 20  t, iOfst);.     
20db0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
20dc0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
20dd0 20 20 75 38 20 2a 61 42 75 66 20 3d 20 28 75 38    u8 *aBuf = (u8
20de0 2a 29 7a 42 75 66 3b 0a 20 20 20 20 20 20 20 20  *)zBuf;.        
20df0 20 20 75 33 32 20 69 52 6f 6f 74 20 3d 20 72 62    u32 iRoot = rb
20e00 75 47 65 74 55 33 32 28 26 61 42 75 66 5b 35 32  uGetU32(&aBuf[52
20e10 5d 29 20 3f 20 31 20 3a 20 30 3b 0a 20 20 20 20  ]) ? 1 : 0;.    
20e20 20 20 20 20 20 20 72 62 75 50 75 74 55 33 32 28        rbuPutU32(
20e30 26 61 42 75 66 5b 35 32 5d 2c 20 69 52 6f 6f 74  &aBuf[52], iRoot
20e40 29 3b 20 20 20 20 20 20 2f 2a 20 6c 61 72 67 65  );      /* large
20e50 73 74 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d  st root page num
20e60 62 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ber */.         
20e70 20 72 62 75 50 75 74 55 33 32 28 26 61 42 75 66   rbuPutU32(&aBuf
20e80 5b 33 36 5d 2c 20 30 29 3b 20 20 20 20 20 20 20  [36], 0);       
20e90 20 20 20 2f 2a 20 6e 75 6d 62 65 72 20 6f 66 20     /* number of 
20ea0 66 72 65 65 20 70 61 67 65 73 20 2a 2f 0a 20 20  free pages */.  
20eb0 20 20 20 20 20 20 20 20 72 62 75 50 75 74 55 33          rbuPutU3
20ec0 32 28 26 61 42 75 66 5b 33 32 5d 2c 20 30 29 3b  2(&aBuf[32], 0);
20ed0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69 72            /* fir
20ee0 73 74 20 70 61 67 65 20 6f 6e 20 66 72 65 65 20  st page on free 
20ef0 6c 69 73 74 20 74 72 75 6e 6b 20 2a 2f 0a 20 20  list trunk */.  
20f00 20 20 20 20 20 20 20 20 72 62 75 50 75 74 55 33          rbuPutU3
20f10 32 28 26 61 42 75 66 5b 32 38 5d 2c 20 31 29 3b  2(&aBuf[28], 1);
20f20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 69 7a            /* siz
20f30 65 20 6f 66 20 64 62 20 66 69 6c 65 20 69 6e 20  e of db file in 
20f40 70 61 67 65 73 20 2a 2f 0a 20 20 20 20 20 20 20  pages */.       
20f50 20 20 20 72 62 75 50 75 74 55 33 32 28 26 61 42     rbuPutU32(&aB
20f60 75 66 5b 32 34 5d 2c 20 70 52 62 75 2d 3e 70 52  uf[24], pRbu->pR
20f70 62 75 46 64 2d 3e 69 43 6f 6f 6b 69 65 2b 31 29  buFd->iCookie+1)
20f80 3b 20 20 2f 2a 20 43 68 61 6e 67 65 20 63 6f 75  ;  /* Change cou
20f90 6e 74 65 72 20 2a 2f 0a 0a 20 20 20 20 20 20 20  nter */..       
20fa0 20 20 20 69 66 28 20 69 41 6d 74 3e 31 30 30 20     if( iAmt>100 
20fb0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d  ){.            m
20fc0 65 6d 73 65 74 28 26 61 42 75 66 5b 31 30 30 5d  emset(&aBuf[100]
20fd0 2c 20 30 2c 20 69 41 6d 74 2d 31 30 30 29 3b 0a  , 0, iAmt-100);.
20fe0 20 20 20 20 20 20 20 20 20 20 20 20 72 62 75 50              rbuP
20ff0 75 74 55 31 36 28 26 61 42 75 66 5b 31 30 35 5d  utU16(&aBuf[105]
21000 2c 20 69 41 6d 74 20 26 20 30 78 46 46 46 46 29  , iAmt & 0xFFFF)
21010 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 42  ;.            aB
21020 75 66 5b 31 30 30 5d 20 3d 20 30 78 30 44 3b 0a  uf[100] = 0x0D;.
21030 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
21040 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65      }.      }.#e
21050 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 69  ndif.    }.    i
21060 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
21070 20 26 26 20 69 4f 66 73 74 3d 3d 30 20 26 26 20   && iOfst==0 && 
21080 28 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20  (p->openFlags & 
21090 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
210a0 5f 44 42 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  _DB) ){.      /*
210b0 20 54 68 65 73 65 20 6c 6f 6f 6b 20 6c 69 6b 65   These look like
210c0 20 6d 61 67 69 63 20 6e 75 6d 62 65 72 73 2e 20   magic numbers. 
210d0 42 75 74 20 74 68 65 79 20 61 72 65 20 73 74 61  But they are sta
210e0 62 6c 65 2c 20 61 73 20 74 68 65 79 20 61 72 65  ble, as they are
210f0 20 70 61 72 74 0a 20 20 20 20 20 20 20 2a 2a 20   part.       ** 
21100 6f 66 20 74 68 65 20 64 65 66 69 6e 69 74 69 6f  of the definitio
21110 6e 20 6f 66 20 74 68 65 20 53 51 4c 69 74 65 20  n of the SQLite 
21120 66 69 6c 65 20 66 6f 72 6d 61 74 2c 20 77 68 69  file format, whi
21130 63 68 20 6d 61 79 20 6e 6f 74 20 63 68 61 6e 67  ch may not chang
21140 65 2e 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 2a  e. */.      u8 *
21150 70 42 75 66 20 3d 20 28 75 38 2a 29 7a 42 75 66  pBuf = (u8*)zBuf
21160 3b 0a 20 20 20 20 20 20 70 2d 3e 69 43 6f 6f 6b  ;.      p->iCook
21170 69 65 20 3d 20 72 62 75 47 65 74 55 33 32 28 26  ie = rbuGetU32(&
21180 70 42 75 66 5b 32 34 5d 29 3b 0a 20 20 20 20 20  pBuf[24]);.     
21190 20 70 2d 3e 69 57 72 69 74 65 56 65 72 20 3d 20   p->iWriteVer = 
211a0 70 42 75 66 5b 31 39 5d 3b 0a 20 20 20 20 7d 0a  pBuf[19];.    }.
211b0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
211c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
211d0 64 61 74 61 20 74 6f 20 61 6e 20 72 62 75 56 66  data to an rbuVf
211e0 73 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  s-file..*/.stati
211f0 63 20 69 6e 74 20 72 62 75 56 66 73 57 72 69 74  c int rbuVfsWrit
21200 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  e(.  sqlite3_fil
21210 65 20 2a 70 46 69 6c 65 2c 20 0a 20 20 63 6f 6e  e *pFile, .  con
21220 73 74 20 76 6f 69 64 20 2a 7a 42 75 66 2c 20 0a  st void *zBuf, .
21230 20 20 69 6e 74 20 69 41 6d 74 2c 20 0a 20 20 73    int iAmt, .  s
21240 71 6c 69 74 65 5f 69 6e 74 36 34 20 69 4f 66 73  qlite_int64 iOfs
21250 74 0a 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20  t.){.  rbu_file 
21260 2a 70 20 3d 20 28 72 62 75 5f 66 69 6c 65 2a 29  *p = (rbu_file*)
21270 70 46 69 6c 65 3b 0a 20 20 73 71 6c 69 74 65 33  pFile;.  sqlite3
21280 72 62 75 20 2a 70 52 62 75 20 3d 20 70 2d 3e 70  rbu *pRbu = p->p
21290 52 62 75 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  Rbu;.  int rc;..
212a0 20 20 69 66 28 20 70 52 62 75 20 26 26 20 70 52    if( pRbu && pR
212b0 62 75 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f  bu->eStage==RBU_
212c0 53 54 41 47 45 5f 43 41 50 54 55 52 45 20 29 7b  STAGE_CAPTURE ){
212d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
212e0 6f 70 65 6e 46 6c 61 67 73 20 26 20 53 51 4c 49  openFlags & SQLI
212f0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20  TE_OPEN_MAIN_DB 
21300 29 3b 0a 20 20 20 20 72 63 20 3d 20 72 62 75 43  );.    rc = rbuC
21310 61 70 74 75 72 65 44 62 57 72 69 74 65 28 70 2d  aptureDbWrite(p-
21320 3e 70 52 62 75 2c 20 69 4f 66 73 74 29 3b 0a 20  >pRbu, iOfst);. 
21330 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
21340 70 52 62 75 20 29 7b 0a 20 20 20 20 20 20 69 66  pRbu ){.      if
21350 28 20 70 52 62 75 2d 3e 65 53 74 61 67 65 3d 3d  ( pRbu->eStage==
21360 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20 0a 20  RBU_STAGE_OAL . 
21370 20 20 20 20 20 20 26 26 20 28 70 2d 3e 6f 70 65        && (p->ope
21380 6e 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  nFlags & SQLITE_
21390 4f 50 45 4e 5f 57 41 4c 29 20 0a 20 20 20 20 20  OPEN_WAL) .     
213a0 20 20 26 26 20 69 4f 66 73 74 3e 3d 70 52 62 75    && iOfst>=pRbu
213b0 2d 3e 69 4f 61 6c 53 7a 0a 20 20 20 20 20 20 29  ->iOalSz.      )
213c0 7b 0a 20 20 20 20 20 20 20 20 70 52 62 75 2d 3e  {.        pRbu->
213d0 69 4f 61 6c 53 7a 20 3d 20 69 41 6d 74 20 2b 20  iOalSz = iAmt + 
213e0 69 4f 66 73 74 3b 0a 20 20 20 20 20 20 7d 65 6c  iOfst;.      }el
213f0 73 65 20 69 66 28 20 70 2d 3e 6f 70 65 6e 46 6c  se if( p->openFl
21400 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
21410 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20  N_DELETEONCLOSE 
21420 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20 73  ){.        i64 s
21430 7a 4e 65 77 20 3d 20 69 41 6d 74 2b 69 4f 66 73  zNew = iAmt+iOfs
21440 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  t;.        if( s
21450 7a 4e 65 77 3e 70 2d 3e 73 7a 20 29 7b 0a 20 20  zNew>p->sz ){.  
21460 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 62 75          rc = rbu
21470 55 70 64 61 74 65 54 65 6d 70 53 69 7a 65 28 70  UpdateTempSize(p
21480 2c 20 73 7a 4e 65 77 29 3b 0a 20 20 20 20 20 20  , szNew);.      
21490 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
214a0 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
214b0 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
214c0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72     }.    }.    r
214d0 63 20 3d 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d  c = p->pReal->pM
214e0 65 74 68 6f 64 73 2d 3e 78 57 72 69 74 65 28 70  ethods->xWrite(p
214f0 2d 3e 70 52 65 61 6c 2c 20 7a 42 75 66 2c 20 69  ->pReal, zBuf, i
21500 41 6d 74 2c 20 69 4f 66 73 74 29 3b 0a 20 20 20  Amt, iOfst);.   
21510 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
21520 4f 4b 20 26 26 20 69 4f 66 73 74 3d 3d 30 20 26  OK && iOfst==0 &
21530 26 20 28 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20  & (p->openFlags 
21540 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  & SQLITE_OPEN_MA
21550 49 4e 5f 44 42 29 20 29 7b 0a 20 20 20 20 20 20  IN_DB) ){.      
21560 2f 2a 20 54 68 65 73 65 20 6c 6f 6f 6b 20 6c 69  /* These look li
21570 6b 65 20 6d 61 67 69 63 20 6e 75 6d 62 65 72 73  ke magic numbers
21580 2e 20 42 75 74 20 74 68 65 79 20 61 72 65 20 73  . But they are s
21590 74 61 62 6c 65 2c 20 61 73 20 74 68 65 79 20 61  table, as they a
215a0 72 65 20 70 61 72 74 0a 20 20 20 20 20 20 2a 2a  re part.      **
215b0 20 6f 66 20 74 68 65 20 64 65 66 69 6e 69 74 69   of the definiti
215c0 6f 6e 20 6f 66 20 74 68 65 20 53 51 4c 69 74 65  on of the SQLite
215d0 20 66 69 6c 65 20 66 6f 72 6d 61 74 2c 20 77 68   file format, wh
215e0 69 63 68 20 6d 61 79 20 6e 6f 74 20 63 68 61 6e  ich may not chan
215f0 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 75 38 20  ge. */.      u8 
21600 2a 70 42 75 66 20 3d 20 28 75 38 2a 29 7a 42 75  *pBuf = (u8*)zBu
21610 66 3b 0a 20 20 20 20 20 20 70 2d 3e 69 43 6f 6f  f;.      p->iCoo
21620 6b 69 65 20 3d 20 72 62 75 47 65 74 55 33 32 28  kie = rbuGetU32(
21630 26 70 42 75 66 5b 32 34 5d 29 3b 0a 20 20 20 20  &pBuf[24]);.    
21640 20 20 70 2d 3e 69 57 72 69 74 65 56 65 72 20 3d    p->iWriteVer =
21650 20 70 42 75 66 5b 31 39 5d 3b 0a 20 20 20 20 7d   pBuf[19];.    }
21660 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
21670 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63  ;.}../*.** Trunc
21680 61 74 65 20 61 6e 20 72 62 75 56 66 73 2d 66 69  ate an rbuVfs-fi
21690 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
216a0 74 20 72 62 75 56 66 73 54 72 75 6e 63 61 74 65  t rbuVfsTruncate
216b0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70  (sqlite3_file *p
216c0 46 69 6c 65 2c 20 73 71 6c 69 74 65 5f 69 6e 74  File, sqlite_int
216d0 36 34 20 73 69 7a 65 29 7b 0a 20 20 72 62 75 5f  64 size){.  rbu_
216e0 66 69 6c 65 20 2a 70 20 3d 20 28 72 62 75 5f 66  file *p = (rbu_f
216f0 69 6c 65 2a 29 70 46 69 6c 65 3b 0a 20 20 69 66  ile*)pFile;.  if
21700 28 20 28 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20  ( (p->openFlags 
21710 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45  & SQLITE_OPEN_DE
21720 4c 45 54 45 4f 4e 43 4c 4f 53 45 29 20 26 26 20  LETEONCLOSE) && 
21730 70 2d 3e 70 52 62 75 20 29 7b 0a 20 20 20 20 69  p->pRbu ){.    i
21740 6e 74 20 72 63 20 3d 20 72 62 75 55 70 64 61 74  nt rc = rbuUpdat
21750 65 54 65 6d 70 53 69 7a 65 28 70 2c 20 73 69 7a  eTempSize(p, siz
21760 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
21770 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
21780 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 72 65 74  rn rc;.  }.  ret
21790 75 72 6e 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d  urn p->pReal->pM
217a0 65 74 68 6f 64 73 2d 3e 78 54 72 75 6e 63 61 74  ethods->xTruncat
217b0 65 28 70 2d 3e 70 52 65 61 6c 2c 20 73 69 7a 65  e(p->pReal, size
217c0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63  );.}../*.** Sync
217d0 20 61 6e 20 72 62 75 56 66 73 2d 66 69 6c 65 2e   an rbuVfs-file.
217e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
217f0 62 75 56 66 73 53 79 6e 63 28 73 71 6c 69 74 65  buVfsSync(sqlite
21800 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69  3_file *pFile, i
21810 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 72 62 75  nt flags){.  rbu
21820 5f 66 69 6c 65 20 2a 70 20 3d 20 28 72 62 75 5f  _file *p = (rbu_
21830 66 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20  file *)pFile;.  
21840 69 66 28 20 70 2d 3e 70 52 62 75 20 26 26 20 70  if( p->pRbu && p
21850 2d 3e 70 52 62 75 2d 3e 65 53 74 61 67 65 3d 3d  ->pRbu->eStage==
21860 52 42 55 5f 53 54 41 47 45 5f 43 41 50 54 55 52  RBU_STAGE_CAPTUR
21870 45 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  E ){.    if( p->
21880 6f 70 65 6e 46 6c 61 67 73 20 26 20 53 51 4c 49  openFlags & SQLI
21890 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20  TE_OPEN_MAIN_DB 
218a0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
218b0 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c 3b  SQLITE_INTERNAL;
218c0 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
218d0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
218e0 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 52 65  .  return p->pRe
218f0 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53  al->pMethods->xS
21900 79 6e 63 28 70 2d 3e 70 52 65 61 6c 2c 20 66 6c  ync(p->pReal, fl
21910 61 67 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ags);.}../*.** R
21920 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e  eturn the curren
21930 74 20 66 69 6c 65 2d 73 69 7a 65 20 6f 66 20 61  t file-size of a
21940 6e 20 72 62 75 56 66 73 2d 66 69 6c 65 2e 0a 2a  n rbuVfs-file..*
21950 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62 75  /.static int rbu
21960 56 66 73 46 69 6c 65 53 69 7a 65 28 73 71 6c 69  VfsFileSize(sqli
21970 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c  te3_file *pFile,
21980 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 2a 70   sqlite_int64 *p
21990 53 69 7a 65 29 7b 0a 20 20 72 62 75 5f 66 69 6c  Size){.  rbu_fil
219a0 65 20 2a 70 20 3d 20 28 72 62 75 5f 66 69 6c 65  e *p = (rbu_file
219b0 20 2a 29 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20   *)pFile;.  int 
219c0 72 63 3b 0a 20 20 72 63 20 3d 20 70 2d 3e 70 52  rc;.  rc = p->pR
219d0 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78  eal->pMethods->x
219e0 46 69 6c 65 53 69 7a 65 28 70 2d 3e 70 52 65 61  FileSize(p->pRea
219f0 6c 2c 20 70 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a  l, pSize);..  /*
21a00 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 52   If this is an R
21a10 42 55 20 76 61 63 75 75 6d 20 6f 70 65 72 61 74  BU vacuum operat
21a20 69 6f 6e 20 61 6e 64 20 74 68 69 73 20 69 73 20  ion and this is 
21a30 74 68 65 20 74 61 72 67 65 74 20 64 61 74 61 62  the target datab
21a40 61 73 65 2c 0a 20 20 2a 2a 20 70 72 65 74 65 6e  ase,.  ** preten
21a50 64 20 74 68 61 74 20 69 74 20 68 61 73 20 61 74  d that it has at
21a60 20 6c 65 61 73 74 20 6f 6e 65 20 70 61 67 65 2e   least one page.
21a70 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 69   Otherwise, SQLi
21a80 74 65 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 2a 2a  te will not.  **
21a90 20 63 68 65 63 6b 20 66 6f 72 20 74 68 65 20 65   check for the e
21aa0 78 69 73 74 61 6e 63 65 20 6f 66 20 61 20 2a 2d  xistance of a *-
21ab0 77 61 6c 20 66 69 6c 65 2e 20 72 62 75 56 66 73  wal file. rbuVfs
21ac0 52 65 61 64 28 29 20 63 6f 6e 74 61 69 6e 73 20  Read() contains 
21ad0 0a 20 20 2a 2a 20 73 69 6d 69 6c 61 72 20 6c 6f  .  ** similar lo
21ae0 67 69 63 2e 20 20 2a 2f 0a 20 20 69 66 28 20 72  gic.  */.  if( r
21af0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
21b00 2a 70 53 69 7a 65 3d 3d 30 20 0a 20 20 20 26 26  *pSize==0 .   &&
21b10 20 70 2d 3e 70 52 62 75 20 26 26 20 72 62 75 49   p->pRbu && rbuI
21b20 73 56 61 63 75 75 6d 28 70 2d 3e 70 52 62 75 29  sVacuum(p->pRbu)
21b30 20 0a 20 20 20 26 26 20 28 70 2d 3e 6f 70 65 6e   .   && (p->open
21b40 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  Flags & SQLITE_O
21b50 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 0a 20 20 29  PEN_MAIN_DB).  )
21b60 7b 0a 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 31  {.    *pSize = 1
21b70 30 32 34 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  024;.  }.  retur
21b80 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
21b90 6f 63 6b 20 61 6e 20 72 62 75 56 66 73 2d 66 69  ock an rbuVfs-fi
21ba0 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
21bb0 74 20 72 62 75 56 66 73 4c 6f 63 6b 28 73 71 6c  t rbuVfsLock(sql
21bc0 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65  ite3_file *pFile
21bd0 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20  , int eLock){.  
21be0 72 62 75 5f 66 69 6c 65 20 2a 70 20 3d 20 28 72  rbu_file *p = (r
21bf0 62 75 5f 66 69 6c 65 2a 29 70 46 69 6c 65 3b 0a  bu_file*)pFile;.
21c00 20 20 73 71 6c 69 74 65 33 72 62 75 20 2a 70 52    sqlite3rbu *pR
21c10 62 75 20 3d 20 70 2d 3e 70 52 62 75 3b 0a 20 20  bu = p->pRbu;.  
21c20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
21c30 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  OK;..  assert( p
21c40 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20 28 53  ->openFlags & (S
21c50 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
21c60 44 42 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54  DB|SQLITE_OPEN_T
21c70 45 4d 50 5f 44 42 29 20 29 3b 0a 20 20 69 66 28  EMP_DB) );.  if(
21c80 20 65 4c 6f 63 6b 3d 3d 53 51 4c 49 54 45 5f 4c   eLock==SQLITE_L
21c90 4f 43 4b 5f 45 58 43 4c 55 53 49 56 45 20 0a 20  OCK_EXCLUSIVE . 
21ca0 20 20 26 26 20 28 70 2d 3e 62 4e 6f 6c 6f 63 6b    && (p->bNolock
21cb0 20 7c 7c 20 28 70 52 62 75 20 26 26 20 70 52 62   || (pRbu && pRb
21cc0 75 2d 3e 65 53 74 61 67 65 21 3d 52 42 55 5f 53  u->eStage!=RBU_S
21cd0 54 41 47 45 5f 44 4f 4e 45 29 29 0a 20 20 29 7b  TAGE_DONE)).  ){
21ce0 0a 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61  .    /* Do not a
21cf0 6c 6c 6f 77 20 45 58 43 4c 55 53 49 56 45 20 6c  llow EXCLUSIVE l
21d00 6f 63 6b 73 2e 20 50 72 65 76 65 6e 74 69 6e 67  ocks. Preventing
21d10 20 53 51 4c 69 74 65 20 66 72 6f 6d 20 74 61 6b   SQLite from tak
21d20 69 6e 67 20 74 68 69 73 20 0a 20 20 20 20 2a 2a  ing this .    **
21d30 20 70 72 65 76 65 6e 74 73 20 69 74 20 66 72 6f   prevents it fro
21d40 6d 20 63 68 65 63 6b 70 6f 69 6e 74 69 6e 67 20  m checkpointing 
21d50 74 68 65 20 64 61 74 61 62 61 73 65 20 66 72 6f  the database fro
21d60 6d 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28  m sqlite3_close(
21d70 29 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53  ). */.    rc = S
21d80 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65  QLITE_BUSY;.  }e
21d90 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 70 2d  lse{.    rc = p-
21da0 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73  >pReal->pMethods
21db0 2d 3e 78 4c 6f 63 6b 28 70 2d 3e 70 52 65 61 6c  ->xLock(p->pReal
21dc0 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20 7d 0a 0a 20  , eLock);.  }.. 
21dd0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
21de0 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 61 6e 20 72  *.** Unlock an r
21df0 62 75 56 66 73 2d 66 69 6c 65 2e 0a 2a 2f 0a 73  buVfs-file..*/.s
21e00 74 61 74 69 63 20 69 6e 74 20 72 62 75 56 66 73  tatic int rbuVfs
21e10 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
21e20 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20  ile *pFile, int 
21e30 65 4c 6f 63 6b 29 7b 0a 20 20 72 62 75 5f 66 69  eLock){.  rbu_fi
21e40 6c 65 20 2a 70 20 3d 20 28 72 62 75 5f 66 69 6c  le *p = (rbu_fil
21e50 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 72 65 74  e *)pFile;.  ret
21e60 75 72 6e 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d  urn p->pReal->pM
21e70 65 74 68 6f 64 73 2d 3e 78 55 6e 6c 6f 63 6b 28  ethods->xUnlock(
21e80 70 2d 3e 70 52 65 61 6c 2c 20 65 4c 6f 63 6b 29  p->pReal, eLock)
21e90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  ;.}../*.** Check
21ea0 20 69 66 20 61 6e 6f 74 68 65 72 20 66 69 6c 65   if another file
21eb0 2d 68 61 6e 64 6c 65 20 68 6f 6c 64 73 20 61 20  -handle holds a 
21ec0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e  RESERVED lock on
21ed0 20 61 6e 20 72 62 75 56 66 73 2d 66 69 6c 65 2e   an rbuVfs-file.
21ee0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
21ef0 62 75 56 66 73 43 68 65 63 6b 52 65 73 65 72 76  buVfsCheckReserv
21f00 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  edLock(sqlite3_f
21f10 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20  ile *pFile, int 
21f20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 72 62 75  *pResOut){.  rbu
21f30 5f 66 69 6c 65 20 2a 70 20 3d 20 28 72 62 75 5f  _file *p = (rbu_
21f40 66 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20  file *)pFile;.  
21f50 72 65 74 75 72 6e 20 70 2d 3e 70 52 65 61 6c 2d  return p->pReal-
21f60 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 43 68 65 63  >pMethods->xChec
21f70 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 70 2d  kReservedLock(p-
21f80 3e 70 52 65 61 6c 2c 20 70 52 65 73 4f 75 74 29  >pReal, pResOut)
21f90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c 65 20  ;.}../*.** File 
21fa0 63 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64 2e 20  control method. 
21fb0 46 6f 72 20 63 75 73 74 6f 6d 20 6f 70 65 72 61  For custom opera
21fc0 74 69 6f 6e 73 20 6f 6e 20 61 6e 20 72 62 75 56  tions on an rbuV
21fd0 66 73 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  fs-file..*/.stat
21fe0 69 63 20 69 6e 74 20 72 62 75 56 66 73 46 69 6c  ic int rbuVfsFil
21ff0 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33  eControl(sqlite3
22000 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e  _file *pFile, in
22010 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 67  t op, void *pArg
22020 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a 70  ){.  rbu_file *p
22030 20 3d 20 28 72 62 75 5f 66 69 6c 65 20 2a 29 70   = (rbu_file *)p
22040 46 69 6c 65 3b 0a 20 20 69 6e 74 20 28 2a 78 43  File;.  int (*xC
22050 6f 6e 74 72 6f 6c 29 28 73 71 6c 69 74 65 33 5f  ontrol)(sqlite3_
22060 66 69 6c 65 2a 2c 69 6e 74 2c 76 6f 69 64 2a 29  file*,int,void*)
22070 20 3d 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65   = p->pReal->pMe
22080 74 68 6f 64 73 2d 3e 78 46 69 6c 65 43 6f 6e 74  thods->xFileCont
22090 72 6f 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  rol;.  int rc;..
220a0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 65    assert( p->ope
220b0 6e 46 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45  nFlags & (SQLITE
220c0 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 7c 53 51  _OPEN_MAIN_DB|SQ
220d0 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44  LITE_OPEN_TEMP_D
220e0 42 29 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e  B).       || p->
220f0 6f 70 65 6e 46 6c 61 67 73 20 26 20 28 53 51 4c  openFlags & (SQL
22100 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45  ITE_OPEN_TRANSIE
22110 4e 54 5f 44 42 7c 53 51 4c 49 54 45 5f 4f 50 45  NT_DB|SQLITE_OPE
22120 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 29 0a  N_TEMP_JOURNAL).
22130 20 20 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 53    );.  if( op==S
22140 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 52 42 55 20  QLITE_FCNTL_RBU 
22150 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 72 62  ){.    sqlite3rb
22160 75 20 2a 70 52 62 75 20 3d 20 28 73 71 6c 69 74  u *pRbu = (sqlit
22170 65 33 72 62 75 2a 29 70 41 72 67 3b 0a 0a 20 20  e3rbu*)pArg;..  
22180 20 20 2f 2a 20 46 69 72 73 74 20 74 72 79 20 74    /* First try t
22190 6f 20 66 69 6e 64 20 61 6e 6f 74 68 65 72 20 52  o find another R
221a0 42 55 20 76 66 73 20 6c 6f 77 65 72 20 64 6f 77  BU vfs lower dow
221b0 6e 20 69 6e 20 74 68 65 20 76 66 73 20 73 74 61  n in the vfs sta
221c0 63 6b 2e 20 49 66 0a 20 20 20 20 2a 2a 20 6f 6e  ck. If.    ** on
221d0 65 20 69 73 20 66 6f 75 6e 64 2c 20 74 68 69 73  e is found, this
221e0 20 76 66 73 20 77 69 6c 6c 20 6f 70 65 72 61 74   vfs will operat
221f0 65 20 69 6e 20 70 61 73 73 2d 74 68 72 6f 75 67  e in pass-throug
22200 68 20 6d 6f 64 65 2e 20 54 68 65 20 6c 6f 77 65  h mode. The lowe
22210 72 0a 20 20 20 20 2a 2a 20 6c 65 76 65 6c 20 76  r.    ** level v
22220 66 73 20 77 69 6c 6c 20 64 6f 20 74 68 65 20 73  fs will do the s
22230 70 65 63 69 61 6c 20 52 42 55 20 68 61 6e 64 6c  pecial RBU handl
22240 69 6e 67 2e 20 20 2a 2f 0a 20 20 20 20 72 63 20  ing.  */.    rc 
22250 3d 20 78 43 6f 6e 74 72 6f 6c 28 70 2d 3e 70 52  = xControl(p->pR
22260 65 61 6c 2c 20 6f 70 2c 20 70 41 72 67 29 3b 0a  eal, op, pArg);.
22270 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
22280 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 7b 0a  ITE_NOTFOUND ){.
22290 20 20 20 20 20 20 2f 2a 20 4e 6f 77 20 73 65 61        /* Now sea
222a0 72 63 68 20 66 6f 72 20 61 20 7a 69 70 76 66 73  rch for a zipvfs
222b0 20 69 6e 73 74 61 6e 63 65 20 6c 6f 77 65 72 20   instance lower 
222c0 64 6f 77 6e 20 69 6e 20 74 68 65 20 56 46 53 20  down in the VFS 
222d0 73 74 61 63 6b 2e 20 49 66 0a 20 20 20 20 20 20  stack. If.      
222e0 2a 2a 20 6f 6e 65 20 69 73 20 66 6f 75 6e 64 2c  ** one is found,
222f0 20 74 68 69 73 20 69 73 20 61 6e 20 65 72 72 6f   this is an erro
22300 72 2e 20 20 2a 2f 0a 20 20 20 20 20 20 76 6f 69  r.  */.      voi
22310 64 20 2a 64 75 6d 6d 79 20 3d 20 30 3b 0a 20 20  d *dummy = 0;.  
22320 20 20 20 20 72 63 20 3d 20 78 43 6f 6e 74 72 6f      rc = xContro
22330 6c 28 70 2d 3e 70 52 65 61 6c 2c 20 53 51 4c 49  l(p->pReal, SQLI
22340 54 45 5f 46 43 4e 54 4c 5f 5a 49 50 56 46 53 2c  TE_FCNTL_ZIPVFS,
22350 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20   &dummy);.      
22360 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
22370 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
22380 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
22390 20 20 20 20 20 20 20 20 70 52 62 75 2d 3e 7a 45          pRbu->zE
223a0 72 72 6d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f  rrmsg = sqlite3_
223b0 6d 70 72 69 6e 74 66 28 22 72 62 75 2f 7a 69 70  mprintf("rbu/zip
223c0 76 66 73 20 73 65 74 75 70 20 65 72 72 6f 72 22  vfs setup error"
223d0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
223e0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  f( rc==SQLITE_NO
223f0 54 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20 20  TFOUND ){.      
22400 20 20 70 52 62 75 2d 3e 70 54 61 72 67 65 74 46    pRbu->pTargetF
22410 64 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 70  d = p;.        p
22420 2d 3e 70 52 62 75 20 3d 20 70 52 62 75 3b 0a 20  ->pRbu = pRbu;. 
22430 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 57         if( p->pW
22440 61 6c 46 64 20 29 20 70 2d 3e 70 57 61 6c 46 64  alFd ) p->pWalFd
22450 2d 3e 70 52 62 75 20 3d 20 70 52 62 75 3b 0a 20  ->pRbu = pRbu;. 
22460 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
22470 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
22480 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
22490 72 63 3b 0a 20 20 7d 0a 20 20 65 6c 73 65 20 69  rc;.  }.  else i
224a0 66 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 46 43  f( op==SQLITE_FC
224b0 4e 54 4c 5f 52 42 55 43 4e 54 20 29 7b 0a 20 20  NTL_RBUCNT ){.  
224c0 20 20 73 71 6c 69 74 65 33 72 62 75 20 2a 70 52    sqlite3rbu *pR
224d0 62 75 20 3d 20 28 73 71 6c 69 74 65 33 72 62 75  bu = (sqlite3rbu
224e0 2a 29 70 41 72 67 3b 0a 20 20 20 20 70 52 62 75  *)pArg;.    pRbu
224f0 2d 3e 6e 52 62 75 2b 2b 3b 0a 20 20 20 20 70 52  ->nRbu++;.    pR
22500 62 75 2d 3e 70 52 62 75 46 64 20 3d 20 70 3b 0a  bu->pRbuFd = p;.
22510 20 20 20 20 70 2d 3e 62 4e 6f 6c 6f 63 6b 20 3d      p->bNolock =
22520 20 31 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20   1;.  }..  rc = 
22530 78 43 6f 6e 74 72 6f 6c 28 70 2d 3e 70 52 65 61  xControl(p->pRea
22540 6c 2c 20 6f 70 2c 20 70 41 72 67 29 3b 0a 20 20  l, op, pArg);.  
22550 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
22560 4b 20 26 26 20 6f 70 3d 3d 53 51 4c 49 54 45 5f  K && op==SQLITE_
22570 46 43 4e 54 4c 5f 56 46 53 4e 41 4d 45 20 29 7b  FCNTL_VFSNAME ){
22580 0a 20 20 20 20 72 62 75 5f 76 66 73 20 2a 70 52  .    rbu_vfs *pR
22590 62 75 56 66 73 20 3d 20 70 2d 3e 70 52 62 75 56  buVfs = p->pRbuV
225a0 66 73 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 49  fs;.    char *zI
225b0 6e 20 3d 20 2a 28 63 68 61 72 2a 2a 29 70 41 72  n = *(char**)pAr
225c0 67 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4f 75  g;.    char *zOu
225d0 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  t = sqlite3_mpri
225e0 6e 74 66 28 22 72 62 75 28 25 73 29 2f 25 7a 22  ntf("rbu(%s)/%z"
225f0 2c 20 70 52 62 75 56 66 73 2d 3e 62 61 73 65 2e  , pRbuVfs->base.
22600 7a 4e 61 6d 65 2c 20 7a 49 6e 29 3b 0a 20 20 20  zName, zIn);.   
22610 20 2a 28 63 68 61 72 2a 2a 29 70 41 72 67 20 3d   *(char**)pArg =
22620 20 7a 4f 75 74 3b 0a 20 20 20 20 69 66 28 20 7a   zOut;.    if( z
22630 4f 75 74 3d 3d 30 20 29 20 72 63 20 3d 20 53 51  Out==0 ) rc = SQ
22640 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
22650 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
22660 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
22670 65 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 69 6e  e sector-size in
22680 20 62 79 74 65 73 20 66 6f 72 20 61 6e 20 72 62   bytes for an rb
22690 75 56 66 73 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74  uVfs-file..*/.st
226a0 61 74 69 63 20 69 6e 74 20 72 62 75 56 66 73 53  atic int rbuVfsS
226b0 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65  ectorSize(sqlite
226c0 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  3_file *pFile){.
226d0 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 20 3d 20    rbu_file *p = 
226e0 28 72 62 75 5f 66 69 6c 65 20 2a 29 70 46 69 6c  (rbu_file *)pFil
226f0 65 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70  e;.  return p->p
22700 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e  Real->pMethods->
22710 78 53 65 63 74 6f 72 53 69 7a 65 28 70 2d 3e 70  xSectorSize(p->p
22720 52 65 61 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Real);.}../*.** 
22730 52 65 74 75 72 6e 20 74 68 65 20 64 65 76 69 63  Return the devic
22740 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63  e characteristic
22750 20 66 6c 61 67 73 20 73 75 70 70 6f 72 74 65 64   flags supported
22760 20 62 79 20 61 6e 20 72 62 75 56 66 73 2d 66 69   by an rbuVfs-fi
22770 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
22780 74 20 72 62 75 56 66 73 44 65 76 69 63 65 43 68  t rbuVfsDeviceCh
22790 61 72 61 63 74 65 72 69 73 74 69 63 73 28 73 71  aracteristics(sq
227a0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
227b0 65 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a  e){.  rbu_file *
227c0 70 20 3d 20 28 72 62 75 5f 66 69 6c 65 20 2a 29  p = (rbu_file *)
227d0 70 46 69 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20  pFile;.  return 
227e0 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f  p->pReal->pMetho
227f0 64 73 2d 3e 78 44 65 76 69 63 65 43 68 61 72 61  ds->xDeviceChara
22800 63 74 65 72 69 73 74 69 63 73 28 70 2d 3e 70 52  cteristics(p->pR
22810 65 61 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  eal);.}../*.** T
22820 61 6b 65 20 6f 72 20 72 65 6c 65 61 73 65 20 61  ake or release a
22830 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6c   shared-memory l
22840 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ock..*/.static i
22850 6e 74 20 72 62 75 56 66 73 53 68 6d 4c 6f 63 6b  nt rbuVfsShmLock
22860 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70  (sqlite3_file *p
22870 46 69 6c 65 2c 20 69 6e 74 20 6f 66 73 74 2c 20  File, int ofst, 
22880 69 6e 74 20 6e 2c 20 69 6e 74 20 66 6c 61 67 73  int n, int flags
22890 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a 70  ){.  rbu_file *p
228a0 20 3d 20 28 72 62 75 5f 66 69 6c 65 2a 29 70 46   = (rbu_file*)pF
228b0 69 6c 65 3b 0a 20 20 73 71 6c 69 74 65 33 72 62  ile;.  sqlite3rb
228c0 75 20 2a 70 52 62 75 20 3d 20 70 2d 3e 70 52 62  u *pRbu = p->pRb
228d0 75 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  u;.  int rc = SQ
228e0 4c 49 54 45 5f 4f 4b 3b 0a 0a 23 69 66 64 65 66  LITE_OK;..#ifdef
228f0 20 53 51 4c 49 54 45 5f 41 4d 41 4c 47 41 4d 41   SQLITE_AMALGAMA
22900 54 49 4f 4e 0a 20 20 20 20 61 73 73 65 72 74 28  TION.    assert(
22910 20 57 41 4c 5f 43 4b 50 54 5f 4c 4f 43 4b 3d 3d   WAL_CKPT_LOCK==
22920 31 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61  1 );.#endif..  a
22930 73 73 65 72 74 28 20 70 2d 3e 6f 70 65 6e 46 6c  ssert( p->openFl
22940 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f 4f 50  ags & (SQLITE_OP
22950 45 4e 5f 4d 41 49 4e 5f 44 42 7c 53 51 4c 49 54  EN_MAIN_DB|SQLIT
22960 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 29 20  E_OPEN_TEMP_DB) 
22970 29 3b 0a 20 20 69 66 28 20 70 52 62 75 20 26 26  );.  if( pRbu &&
22980 20 28 70 52 62 75 2d 3e 65 53 74 61 67 65 3d 3d   (pRbu->eStage==
22990 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20 7c 7c  RBU_STAGE_OAL ||
229a0 20 70 52 62 75 2d 3e 65 53 74 61 67 65 3d 3d 52   pRbu->eStage==R
229b0 42 55 5f 53 54 41 47 45 5f 4d 4f 56 45 29 20 29  BU_STAGE_MOVE) )
229c0 7b 0a 20 20 20 20 2f 2a 20 4d 61 67 69 63 20 6e  {.    /* Magic n
229d0 75 6d 62 65 72 20 31 20 69 73 20 74 68 65 20 57  umber 1 is the W
229e0 41 4c 5f 43 4b 50 54 5f 4c 4f 43 4b 20 6c 6f 63  AL_CKPT_LOCK loc
229f0 6b 2e 20 50 72 65 76 65 6e 74 69 6e 67 20 53 51  k. Preventing SQ
22a00 4c 69 74 65 20 66 72 6f 6d 0a 20 20 20 20 2a 2a  Lite from.    **
22a10 20 74 61 6b 69 6e 67 20 74 68 69 73 20 6c 6f 63   taking this loc
22a20 6b 20 61 6c 73 6f 20 70 72 65 76 65 6e 74 73 20  k also prevents 
22a30 61 6e 79 20 63 68 65 63 6b 70 6f 69 6e 74 73 20  any checkpoints 
22a40 66 72 6f 6d 20 6f 63 63 75 72 72 69 6e 67 2e 20  from occurring. 
22a50 0a 20 20 20 20 2a 2a 20 74 6f 64 6f 3a 20 72 65  .    ** todo: re
22a60 61 6c 6c 79 2c 20 69 74 27 73 20 6e 6f 74 20 63  ally, it's not c
22a70 6c 65 61 72 20 77 68 79 20 74 68 69 73 20 6d 69  lear why this mi
22a80 67 68 74 20 6f 63 63 75 72 2c 20 61 73 20 0a 20  ght occur, as . 
22a90 20 20 20 2a 2a 20 77 61 6c 5f 61 75 74 6f 63 68     ** wal_autoch
22aa0 65 63 6b 70 6f 69 6e 74 20 6f 75 67 68 74 20 74  eckpoint ought t
22ab0 6f 20 62 65 20 74 75 72 6e 65 64 20 6f 66 66 2e  o be turned off.
22ac0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 66 73    */.    if( ofs
22ad0 74 3d 3d 57 41 4c 5f 4c 4f 43 4b 5f 43 4b 50 54  t==WAL_LOCK_CKPT
22ae0 20 26 26 20 6e 3d 3d 31 20 29 20 72 63 20 3d 20   && n==1 ) rc = 
22af0 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
22b00 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 62 43  else{.    int bC
22b10 61 70 74 75 72 65 20 3d 20 30 3b 0a 20 20 20 20  apture = 0;.    
22b20 69 66 28 20 6e 3d 3d 31 20 26 26 20 28 66 6c 61  if( n==1 && (fla
22b30 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f  gs & SQLITE_SHM_
22b40 45 58 43 4c 55 53 49 56 45 29 0a 20 20 20 20 20  EXCLUSIVE).     
22b50 26 26 20 70 52 62 75 20 26 26 20 70 52 62 75 2d  && pRbu && pRbu-
22b60 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41  >eStage==RBU_STA
22b70 47 45 5f 43 41 50 54 55 52 45 0a 20 20 20 20 20  GE_CAPTURE.     
22b80 26 26 20 28 6f 66 73 74 3d 3d 57 41 4c 5f 4c 4f  && (ofst==WAL_LO
22b90 43 4b 5f 57 52 49 54 45 20 7c 7c 20 6f 66 73 74  CK_WRITE || ofst
22ba0 3d 3d 57 41 4c 5f 4c 4f 43 4b 5f 43 4b 50 54 20  ==WAL_LOCK_CKPT 
22bb0 7c 7c 20 6f 66 73 74 3d 3d 57 41 4c 5f 4c 4f 43  || ofst==WAL_LOC
22bc0 4b 5f 52 45 41 44 30 29 0a 20 20 20 20 29 7b 0a  K_READ0).    ){.
22bd0 20 20 20 20 20 20 62 43 61 70 74 75 72 65 20 3d        bCapture =
22be0 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69   1;.    }..    i
22bf0 66 28 20 62 43 61 70 74 75 72 65 3d 3d 30 20 7c  f( bCapture==0 |
22c00 7c 20 30 3d 3d 28 66 6c 61 67 73 20 26 20 53 51  | 0==(flags & SQ
22c10 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 29  LITE_SHM_UNLOCK)
22c20 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
22c30 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64  ->pReal->pMethod
22c40 73 2d 3e 78 53 68 6d 4c 6f 63 6b 28 70 2d 3e 70  s->xShmLock(p->p
22c50 52 65 61 6c 2c 20 6f 66 73 74 2c 20 6e 2c 20 66  Real, ofst, n, f
22c60 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 69 66 28  lags);.      if(
22c70 20 62 43 61 70 74 75 72 65 20 26 26 20 72 63 3d   bCapture && rc=
22c80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
22c90 20 20 20 20 20 20 70 52 62 75 2d 3e 6d 4c 6f 63        pRbu->mLoc
22ca0 6b 20 7c 3d 20 28 31 20 3c 3c 20 6f 66 73 74 29  k |= (1 << ofst)
22cb0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
22cc0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
22cd0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 62 74 61 69  ;.}../*.** Obtai
22ce0 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
22cf0 20 6d 61 70 70 69 6e 67 20 6f 66 20 61 20 73 69   mapping of a si
22d00 6e 67 6c 65 20 33 32 4b 69 42 20 70 61 67 65 20  ngle 32KiB page 
22d10 6f 66 20 74 68 65 20 2a 2d 73 68 6d 20 66 69 6c  of the *-shm fil
22d20 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
22d30 20 72 62 75 56 66 73 53 68 6d 4d 61 70 28 0a 20   rbuVfsShmMap(. 
22d40 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
22d50 46 69 6c 65 2c 20 0a 20 20 69 6e 74 20 69 52 65  File, .  int iRe
22d60 67 69 6f 6e 2c 20 0a 20 20 69 6e 74 20 73 7a 52  gion, .  int szR
22d70 65 67 69 6f 6e 2c 20 0a 20 20 69 6e 74 20 69 73  egion, .  int is
22d80 57 72 69 74 65 2c 20 0a 20 20 76 6f 69 64 20 76  Write, .  void v
22d90 6f 6c 61 74 69 6c 65 20 2a 2a 70 70 0a 29 7b 0a  olatile **pp.){.
22da0 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 20 3d 20    rbu_file *p = 
22db0 28 72 62 75 5f 66 69 6c 65 2a 29 70 46 69 6c 65  (rbu_file*)pFile
22dc0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
22dd0 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 65 53  ITE_OK;.  int eS
22de0 74 61 67 65 20 3d 20 28 70 2d 3e 70 52 62 75 20  tage = (p->pRbu 
22df0 3f 20 70 2d 3e 70 52 62 75 2d 3e 65 53 74 61 67  ? p->pRbu->eStag
22e00 65 20 3a 20 30 29 3b 0a 0a 20 20 2f 2a 20 49 66  e : 0);..  /* If
22e10 20 6e 6f 74 20 69 6e 20 52 42 55 5f 53 54 41 47   not in RBU_STAG
22e20 45 5f 4f 41 4c 2c 20 61 6c 6c 6f 77 20 74 68 69  E_OAL, allow thi
22e30 73 20 63 61 6c 6c 20 74 6f 20 70 61 73 73 20 74  s call to pass t
22e40 68 72 6f 75 67 68 2e 20 4f 72 2c 20 69 66 20 74  hrough. Or, if t
22e50 68 69 73 0a 20 20 2a 2a 20 72 62 75 20 69 73 20  his.  ** rbu is 
22e60 69 6e 20 74 68 65 20 52 42 55 5f 53 54 41 47 45  in the RBU_STAGE
22e70 5f 4f 41 4c 20 73 74 61 74 65 2c 20 75 73 65 20  _OAL state, use 
22e80 68 65 61 70 20 6d 65 6d 6f 72 79 20 66 6f 72 20  heap memory for 
22e90 2a 2d 73 68 6d 20 73 70 61 63 65 20 0a 20 20 2a  *-shm space .  *
22ea0 2a 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20 66  * instead of a f
22eb0 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 20 2a 2f  ile on disk.  */
22ec0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70  .  assert( p->op
22ed0 65 6e 46 6c 61 67 73 20 26 20 28 53 51 4c 49 54  enFlags & (SQLIT
22ee0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 7c 53  E_OPEN_MAIN_DB|S
22ef0 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
22f00 44 42 29 20 29 3b 0a 20 20 69 66 28 20 65 53 74  DB) );.  if( eSt
22f10 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4f  age==RBU_STAGE_O
22f20 41 4c 20 7c 7c 20 65 53 74 61 67 65 3d 3d 52 42  AL || eStage==RB
22f30 55 5f 53 54 41 47 45 5f 4d 4f 56 45 20 29 7b 0a  U_STAGE_MOVE ){.
22f40 20 20 20 20 69 66 28 20 69 52 65 67 69 6f 6e 3c      if( iRegion<
22f50 3d 70 2d 3e 6e 53 68 6d 20 29 7b 0a 20 20 20 20  =p->nShm ){.    
22f60 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 69    int nByte = (i
22f70 52 65 67 69 6f 6e 2b 31 29 20 2a 20 73 69 7a 65  Region+1) * size
22f80 6f 66 28 63 68 61 72 2a 29 3b 0a 20 20 20 20 20  of(char*);.     
22f90 20 63 68 61 72 20 2a 2a 61 70 4e 65 77 20 3d 20   char **apNew = 
22fa0 28 63 68 61 72 2a 2a 29 73 71 6c 69 74 65 33 5f  (char**)sqlite3_
22fb0 72 65 61 6c 6c 6f 63 36 34 28 70 2d 3e 61 70 53  realloc64(p->apS
22fc0 68 6d 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20  hm, nByte);.    
22fd0 20 20 69 66 28 20 61 70 4e 65 77 3d 3d 30 20 29    if( apNew==0 )
22fe0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
22ff0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
23000 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
23010 20 20 6d 65 6d 73 65 74 28 26 61 70 4e 65 77 5b    memset(&apNew[
23020 70 2d 3e 6e 53 68 6d 5d 2c 20 30 2c 20 73 69 7a  p->nShm], 0, siz
23030 65 6f 66 28 63 68 61 72 2a 29 20 2a 20 28 31 20  eof(char*) * (1 
23040 2b 20 69 52 65 67 69 6f 6e 20 2d 20 70 2d 3e 6e  + iRegion - p->n
23050 53 68 6d 29 29 3b 0a 20 20 20 20 20 20 20 20 70  Shm));.        p
23060 2d 3e 61 70 53 68 6d 20 3d 20 61 70 4e 65 77 3b  ->apShm = apNew;
23070 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 68 6d  .        p->nShm
23080 20 3d 20 69 52 65 67 69 6f 6e 2b 31 3b 0a 20 20   = iRegion+1;.  
23090 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
230a0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
230b0 4f 4b 20 26 26 20 70 2d 3e 61 70 53 68 6d 5b 69  OK && p->apShm[i
230c0 52 65 67 69 6f 6e 5d 3d 3d 30 20 29 7b 0a 20 20  Region]==0 ){.  
230d0 20 20 20 20 63 68 61 72 20 2a 70 4e 65 77 20 3d      char *pNew =
230e0 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f   (char*)sqlite3_
230f0 6d 61 6c 6c 6f 63 36 34 28 73 7a 52 65 67 69 6f  malloc64(szRegio
23100 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e  n);.      if( pN
23110 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ew==0 ){.       
23120 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
23130 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  EM;.      }else{
23140 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28  .        memset(
23150 70 4e 65 77 2c 20 30 2c 20 73 7a 52 65 67 69 6f  pNew, 0, szRegio
23160 6e 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61  n);.        p->a
23170 70 53 68 6d 5b 69 52 65 67 69 6f 6e 5d 20 3d 20  pShm[iRegion] = 
23180 70 4e 65 77 3b 0a 20 20 20 20 20 20 7d 0a 20 20  pNew;.      }.  
23190 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d    }..    if( rc=
231a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
231b0 20 20 20 20 2a 70 70 20 3d 20 70 2d 3e 61 70 53      *pp = p->apS
231c0 68 6d 5b 69 52 65 67 69 6f 6e 5d 3b 0a 20 20 20  hm[iRegion];.   
231d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70   }else{.      *p
231e0 70 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  p = 0;.    }.  }
231f0 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
23200 28 20 70 2d 3e 61 70 53 68 6d 3d 3d 30 20 29 3b  ( p->apShm==0 );
23210 0a 20 20 20 20 72 63 20 3d 20 70 2d 3e 70 52 65  .    rc = p->pRe
23220 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53  al->pMethods->xS
23230 68 6d 4d 61 70 28 70 2d 3e 70 52 65 61 6c 2c 20  hmMap(p->pReal, 
23240 69 52 65 67 69 6f 6e 2c 20 73 7a 52 65 67 69 6f  iRegion, szRegio
23250 6e 2c 20 69 73 57 72 69 74 65 2c 20 70 70 29 3b  n, isWrite, pp);
23260 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
23270 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 6d 6f  c;.}../*.** Memo
23280 72 79 20 62 61 72 72 69 65 72 2e 0a 2a 2f 0a 73  ry barrier..*/.s
23290 74 61 74 69 63 20 76 6f 69 64 20 72 62 75 56 66  tatic void rbuVf
232a0 73 53 68 6d 42 61 72 72 69 65 72 28 73 71 6c 69  sShmBarrier(sqli
232b0 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 29  te3_file *pFile)
232c0 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 20  {.  rbu_file *p 
232d0 3d 20 28 72 62 75 5f 66 69 6c 65 20 2a 29 70 46  = (rbu_file *)pF
232e0 69 6c 65 3b 0a 20 20 70 2d 3e 70 52 65 61 6c 2d  ile;.  p->pReal-
232f0 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53 68 6d 42  >pMethods->xShmB
23300 61 72 72 69 65 72 28 70 2d 3e 70 52 65 61 6c 29  arrier(p->pReal)
23310 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 78  ;.}../*.** The x
23320 53 68 6d 55 6e 6d 61 70 20 6d 65 74 68 6f 64 2e  ShmUnmap method.
23330 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
23340 62 75 56 66 73 53 68 6d 55 6e 6d 61 70 28 73 71  buVfsShmUnmap(sq
23350 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
23360 65 2c 20 69 6e 74 20 64 65 6c 46 6c 61 67 29 7b  e, int delFlag){
23370 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 20 3d  .  rbu_file *p =
23380 20 28 72 62 75 5f 66 69 6c 65 2a 29 70 46 69 6c   (rbu_file*)pFil
23390 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  e;.  int rc = SQ
233a0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 65  LITE_OK;.  int e
233b0 53 74 61 67 65 20 3d 20 28 70 2d 3e 70 52 62 75  Stage = (p->pRbu
233c0 20 3f 20 70 2d 3e 70 52 62 75 2d 3e 65 53 74 61   ? p->pRbu->eSta
233d0 67 65 20 3a 20 30 29 3b 0a 0a 20 20 61 73 73 65  ge : 0);..  asse
233e0 72 74 28 20 70 2d 3e 6f 70 65 6e 46 6c 61 67 73  rt( p->openFlags
233f0 20 26 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   & (SQLITE_OPEN_
23400 4d 41 49 4e 5f 44 42 7c 53 51 4c 49 54 45 5f 4f  MAIN_DB|SQLITE_O
23410 50 45 4e 5f 54 45 4d 50 5f 44 42 29 20 29 3b 0a  PEN_TEMP_DB) );.
23420 20 20 69 66 28 20 65 53 74 61 67 65 3d 3d 52 42    if( eStage==RB
23430 55 5f 53 54 41 47 45 5f 4f 41 4c 20 7c 7c 20 65  U_STAGE_OAL || e
23440 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45  Stage==RBU_STAGE
23450 5f 4d 4f 56 45 20 29 7b 0a 20 20 20 20 2f 2a 20  _MOVE ){.    /* 
23460 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 7d 65 6c 73 65  no-op */.  }else
23470 7b 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65  {.    /* Release
23480 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 65   the checkpointe
23490 72 20 61 6e 64 20 77 72 69 74 65 72 20 6c 6f 63  r and writer loc
234a0 6b 73 20 2a 2f 0a 20 20 20 20 72 62 75 55 6e 6c  ks */.    rbuUnl
234b0 6f 63 6b 53 68 6d 28 70 29 3b 0a 20 20 20 20 72  ockShm(p);.    r
234c0 63 20 3d 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d  c = p->pReal->pM
234d0 65 74 68 6f 64 73 2d 3e 78 53 68 6d 55 6e 6d 61  ethods->xShmUnma
234e0 70 28 70 2d 3e 70 52 65 61 6c 2c 20 64 65 6c 46  p(p->pReal, delF
234f0 6c 61 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  lag);.  }.  retu
23500 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
23510 47 69 76 65 6e 20 74 68 61 74 20 7a 57 61 6c 20  Given that zWal 
23520 70 6f 69 6e 74 73 20 74 6f 20 61 20 62 75 66 66  points to a buff
23530 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20  er containing a 
23540 77 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 70 61  wal file name pa
23550 73 73 65 64 20 74 6f 20 0a 2a 2a 20 65 69 74 68  ssed to .** eith
23560 65 72 20 74 68 65 20 78 4f 70 65 6e 28 29 20 6f  er the xOpen() o
23570 72 20 78 41 63 63 65 73 73 28 29 20 56 46 53 20  r xAccess() VFS 
23580 6d 65 74 68 6f 64 2c 20 72 65 74 75 72 6e 20 61  method, return a
23590 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0a   pointer to the.
235a0 2a 2a 20 66 69 6c 65 2d 68 61 6e 64 6c 65 20 6f  ** file-handle o
235b0 70 65 6e 65 64 20 62 79 20 74 68 65 20 73 61 6d  pened by the sam
235c0 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
235d0 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 63 6f 72  ction on the cor
235e0 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 64 61  responding.** da
235f0 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a  tabase file..*/.
23600 73 74 61 74 69 63 20 72 62 75 5f 66 69 6c 65 20  static rbu_file 
23610 2a 72 62 75 46 69 6e 64 4d 61 69 6e 64 62 28 72  *rbuFindMaindb(r
23620 62 75 5f 76 66 73 20 2a 70 52 62 75 56 66 73 2c  bu_vfs *pRbuVfs,
23630 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 57 61   const char *zWa
23640 6c 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a  l){.  rbu_file *
23650 70 44 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  pDb;.  sqlite3_m
23660 75 74 65 78 5f 65 6e 74 65 72 28 70 52 62 75 56  utex_enter(pRbuV
23670 66 73 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 66 6f  fs->mutex);.  fo
23680 72 28 70 44 62 3d 70 52 62 75 56 66 73 2d 3e 70  r(pDb=pRbuVfs->p
23690 4d 61 69 6e 3b 20 70 44 62 20 26 26 20 70 44 62  Main; pDb && pDb
236a0 2d 3e 7a 57 61 6c 21 3d 7a 57 61 6c 3b 20 70 44  ->zWal!=zWal; pD
236b0 62 3d 70 44 62 2d 3e 70 4d 61 69 6e 4e 65 78 74  b=pDb->pMainNext
236c0 29 7b 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  ){}.  sqlite3_mu
236d0 74 65 78 5f 6c 65 61 76 65 28 70 52 62 75 56 66  tex_leave(pRbuVf
236e0 73 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  s->mutex);.  ret
236f0 75 72 6e 20 70 44 62 3b 0a 7d 0a 0a 2f 2a 20 0a  urn pDb;.}../* .
23700 2a 2a 20 41 20 6d 61 69 6e 20 64 61 74 61 62 61  ** A main databa
23710 73 65 20 6e 61 6d 65 64 20 7a 4e 61 6d 65 20 68  se named zName h
23720 61 73 20 6a 75 73 74 20 62 65 65 6e 20 6f 70 65  as just been ope
23730 6e 65 64 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ned. The followi
23740 6e 67 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  ng .** function 
23750 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65  returns a pointe
23760 72 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f 77  r to a buffer ow
23770 6e 65 64 20 62 79 20 53 51 4c 69 74 65 20 74 68  ned by SQLite th
23780 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74  at contains.** t
23790 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 2a  he name of the *
237a0 2d 77 61 6c 20 66 69 6c 65 20 74 68 69 73 20 64  -wal file this d
237b0 62 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 6c  b connection wil
237c0 6c 20 75 73 65 2e 20 53 51 4c 69 74 65 0a 2a 2a  l use. SQLite.**
237d0 20 68 61 70 70 65 6e 73 20 74 6f 20 70 61 73 73   happens to pass
237e0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
237f0 69 73 20 62 75 66 66 65 72 20 77 68 65 6e 20 75  is buffer when u
23800 73 69 6e 67 20 78 41 63 63 65 73 73 28 29 0a 2a  sing xAccess().*
23810 2a 20 6f 72 20 78 4f 70 65 6e 28 29 20 74 6f 20  * or xOpen() to 
23820 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 2a  operate on the *
23830 2d 77 61 6c 20 66 69 6c 65 2e 20 20 0a 2a 2f 0a  -wal file.  .*/.
23840 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
23850 72 20 2a 72 62 75 4d 61 69 6e 54 6f 57 61 6c 28  r *rbuMainToWal(
23860 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
23870 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  e, int flags){. 
23880 20 69 6e 74 20 6e 20 3d 20 28 69 6e 74 29 73 74   int n = (int)st
23890 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 63  rlen(zName);.  c
238a0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 26  onst char *z = &
238b0 7a 4e 61 6d 65 5b 6e 5d 3b 0a 20 20 69 66 28 20  zName[n];.  if( 
238c0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
238d0 50 45 4e 5f 55 52 49 20 29 7b 0a 20 20 20 20 69  PEN_URI ){.    i
238e0 6e 74 20 6f 64 64 20 3d 20 30 3b 0a 20 20 20 20  nt odd = 0;.    
238f0 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20  while( 1 ){.    
23900 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 30 20 29 7b    if( z[0]==0 ){
23910 0a 20 20 20 20 20 20 20 20 6f 64 64 20 3d 20 31  .        odd = 1
23920 20 2d 20 6f 64 64 3b 0a 20 20 20 20 20 20 20 20   - odd;.        
23930 69 66 28 20 6f 64 64 20 26 26 20 7a 5b 31 5d 3d  if( odd && z[1]=
23940 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
23950 20 20 7d 0a 20 20 20 20 20 20 7a 2b 2b 3b 0a 20    }.      z++;. 
23960 20 20 20 7d 0a 20 20 20 20 7a 20 2b 3d 20 32 3b     }.    z += 2;
23970 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68  .  }else{.    wh
23980 69 6c 65 28 20 2a 7a 3d 3d 30 20 29 20 7a 2b 2b  ile( *z==0 ) z++
23990 3b 0a 20 20 7d 0a 20 20 7a 20 2b 3d 20 28 6e 20  ;.  }.  z += (n 
239a0 2b 20 38 20 2b 20 31 29 3b 0a 20 20 72 65 74 75  + 8 + 1);.  retu
239b0 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  rn z;.}../*.** O
239c0 70 65 6e 20 61 6e 20 72 62 75 20 66 69 6c 65 20  pen an rbu file 
239d0 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  handle..*/.stati
239e0 63 20 69 6e 74 20 72 62 75 56 66 73 4f 70 65 6e  c int rbuVfsOpen
239f0 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
23a00 2a 70 56 66 73 2c 0a 20 20 63 6f 6e 73 74 20 63  *pVfs,.  const c
23a10 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20 73 71  har *zName,.  sq
23a20 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
23a30 65 2c 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 0a  e,.  int flags,.
23a40 20 20 69 6e 74 20 2a 70 4f 75 74 46 6c 61 67 73    int *pOutFlags
23a50 0a 29 7b 0a 20 20 73 74 61 74 69 63 20 73 71 6c  .){.  static sql
23a60 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
23a70 72 62 75 76 66 73 5f 69 6f 5f 6d 65 74 68 6f 64  rbuvfs_io_method
23a80 73 20 3d 20 7b 0a 20 20 20 20 32 2c 20 20 20 20  s = {.    2,    
23a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23aa0 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73          /* iVers
23ab0 69 6f 6e 20 2a 2f 0a 20 20 20 20 72 62 75 56 66  ion */.    rbuVf
23ac0 73 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  sClose,         
23ad0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
23ae0 73 65 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73  se */.    rbuVfs
23af0 52 65 61 64 2c 20 20 20 20 20 20 20 20 20 20 20  Read,           
23b00 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65 61 64          /* xRead
23b10 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 57 72   */.    rbuVfsWr
23b20 69 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ite,            
23b30 20 20 20 20 20 20 2f 2a 20 78 57 72 69 74 65 20        /* xWrite 
23b40 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 54 72 75  */.    rbuVfsTru
23b50 6e 63 61 74 65 2c 20 20 20 20 20 20 20 20 20 20  ncate,          
23b60 20 20 20 20 20 2f 2a 20 78 54 72 75 6e 63 61 74       /* xTruncat
23b70 65 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 53  e */.    rbuVfsS
23b80 79 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  ync,            
23b90 20 20 20 20 20 20 20 2f 2a 20 78 53 79 6e 63 20         /* xSync 
23ba0 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 46 69 6c  */.    rbuVfsFil
23bb0 65 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20  eSize,          
23bc0 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 53 69 7a       /* xFileSiz
23bd0 65 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 4c  e */.    rbuVfsL
23be0 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
23bf0 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
23c00 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 55 6e 6c  */.    rbuVfsUnl
23c10 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
23c20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20       /* xUnlock 
23c30 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 43 68 65  */.    rbuVfsChe
23c40 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20  ckReservedLock, 
23c50 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65       /* xCheckRe
23c60 73 65 72 76 65 64 4c 6f 63 6b 20 2a 2f 0a 20 20  servedLock */.  
23c70 20 20 72 62 75 56 66 73 46 69 6c 65 43 6f 6e 74    rbuVfsFileCont
23c80 72 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  rol,            
23c90 2f 2a 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20  /* xFileControl 
23ca0 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 53 65 63  */.    rbuVfsSec
23cb0 74 6f 72 53 69 7a 65 2c 20 20 20 20 20 20 20 20  torSize,        
23cc0 20 20 20 20 20 2f 2a 20 78 53 65 63 74 6f 72 53       /* xSectorS
23cd0 69 7a 65 20 2a 2f 0a 20 20 20 20 72 62 75 56 66  ize */.    rbuVf
23ce0 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
23cf0 69 73 74 69 63 73 2c 20 20 2f 2a 20 78 44 65 76  istics,  /* xDev
23d00 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
23d10 63 73 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73  cs */.    rbuVfs
23d20 53 68 6d 4d 61 70 2c 20 20 20 20 20 20 20 20 20  ShmMap,         
23d30 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d          /* xShmM
23d40 61 70 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73  ap */.    rbuVfs
23d50 53 68 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  ShmLock,        
23d60 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4c          /* xShmL
23d70 6f 63 6b 20 2a 2f 0a 20 20 20 20 72 62 75 56 66  ock */.    rbuVf
23d80 73 53 68 6d 42 61 72 72 69 65 72 2c 20 20 20 20  sShmBarrier,    
23d90 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
23da0 42 61 72 72 69 65 72 20 2a 2f 0a 20 20 20 20 72  Barrier */.    r
23db0 62 75 56 66 73 53 68 6d 55 6e 6d 61 70 2c 20 20  buVfsShmUnmap,  
23dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23dd0 78 53 68 6d 55 6e 6d 61 70 20 2a 2f 0a 20 20 20  xShmUnmap */.   
23de0 20 30 2c 20 30 20 20 20 20 20 20 20 20 20 20 20   0, 0           
23df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23e00 2a 20 78 46 65 74 63 68 2c 20 78 55 6e 66 65 74  * xFetch, xUnfet
23e10 63 68 20 2a 2f 0a 20 20 7d 3b 0a 20 20 72 62 75  ch */.  };.  rbu
23e20 5f 76 66 73 20 2a 70 52 62 75 56 66 73 20 3d 20  _vfs *pRbuVfs = 
23e30 28 72 62 75 5f 76 66 73 2a 29 70 56 66 73 3b 0a  (rbu_vfs*)pVfs;.
23e40 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
23e50 52 65 61 6c 56 66 73 20 3d 20 70 52 62 75 56 66  RealVfs = pRbuVf
23e60 73 2d 3e 70 52 65 61 6c 56 66 73 3b 0a 20 20 72  s->pRealVfs;.  r
23e70 62 75 5f 66 69 6c 65 20 2a 70 46 64 20 3d 20 28  bu_file *pFd = (
23e80 72 62 75 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65  rbu_file *)pFile
23e90 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
23ea0 49 54 45 5f 4f 4b 3b 0a 20 20 63 6f 6e 73 74 20  ITE_OK;.  const 
23eb0 63 68 61 72 20 2a 7a 4f 70 65 6e 20 3d 20 7a 4e  char *zOpen = zN
23ec0 61 6d 65 3b 0a 20 20 69 6e 74 20 6f 66 6c 61 67  ame;.  int oflag
23ed0 73 20 3d 20 66 6c 61 67 73 3b 0a 0a 20 20 6d 65  s = flags;..  me
23ee0 6d 73 65 74 28 70 46 64 2c 20 30 2c 20 73 69 7a  mset(pFd, 0, siz
23ef0 65 6f 66 28 72 62 75 5f 66 69 6c 65 29 29 3b 0a  eof(rbu_file));.
23f00 20 20 70 46 64 2d 3e 70 52 65 61 6c 20 3d 20 28    pFd->pReal = (
23f10 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 26 70  sqlite3_file*)&p
23f20 46 64 5b 31 5d 3b 0a 20 20 70 46 64 2d 3e 70 52  Fd[1];.  pFd->pR
23f30 62 75 56 66 73 20 3d 20 70 52 62 75 56 66 73 3b  buVfs = pRbuVfs;
23f40 0a 20 20 70 46 64 2d 3e 6f 70 65 6e 46 6c 61 67  .  pFd->openFlag
23f50 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 69 66 28  s = flags;.  if(
23f60 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 69 66   zName ){.    if
23f70 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ( flags & SQLITE
23f80 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 7b  _OPEN_MAIN_DB ){
23f90 0a 20 20 20 20 20 20 2f 2a 20 41 20 6d 61 69 6e  .      /* A main
23fa0 20 64 61 74 61 62 61 73 65 20 68 61 73 20 6a 75   database has ju
23fb0 73 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e 20  st been opened. 
23fc0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c  The following bl
23fd0 6f 63 6b 20 73 65 74 73 0a 20 20 20 20 20 20 2a  ock sets.      *
23fe0 2a 20 28 70 46 64 2d 3e 7a 57 61 6c 29 20 74 6f  * (pFd->zWal) to
23ff0 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66   point to a buff
24000 65 72 20 6f 77 6e 65 64 20 62 79 20 53 51 4c 69  er owned by SQLi
24010 74 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  te that contains
24020 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6e 61  .      ** the na
24030 6d 65 20 6f 66 20 74 68 65 20 2a 2d 77 61 6c 20  me of the *-wal 
24040 66 69 6c 65 20 74 68 69 73 20 64 62 20 63 6f 6e  file this db con
24050 6e 65 63 74 69 6f 6e 20 77 69 6c 6c 20 75 73 65  nection will use
24060 2e 20 53 51 4c 69 74 65 0a 20 20 20 20 20 20 2a  . SQLite.      *
24070 2a 20 68 61 70 70 65 6e 73 20 74 6f 20 70 61 73  * happens to pas
24080 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
24090 68 69 73 20 62 75 66 66 65 72 20 77 68 65 6e 20  his buffer when 
240a0 75 73 69 6e 67 20 78 41 63 63 65 73 73 28 29 0a  using xAccess().
240b0 20 20 20 20 20 20 2a 2a 20 6f 72 20 78 4f 70 65        ** or xOpe
240c0 6e 28 29 20 74 6f 20 6f 70 65 72 61 74 65 20 6f  n() to operate o
240d0 6e 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65  n the *-wal file
240e0 2e 20 20 2a 2f 0a 20 20 20 20 20 20 70 46 64 2d  .  */.      pFd-
240f0 3e 7a 57 61 6c 20 3d 20 72 62 75 4d 61 69 6e 54  >zWal = rbuMainT
24100 6f 57 61 6c 28 7a 4e 61 6d 65 2c 20 66 6c 61 67  oWal(zName, flag
24110 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c  s);.    }.    el
24120 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 53  se if( flags & S
24130 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 29  QLITE_OPEN_WAL )
24140 7b 0a 20 20 20 20 20 20 72 62 75 5f 66 69 6c 65  {.      rbu_file
24150 20 2a 70 44 62 20 3d 20 72 62 75 46 69 6e 64 4d   *pDb = rbuFindM
24160 61 69 6e 64 62 28 70 52 62 75 56 66 73 2c 20 7a  aindb(pRbuVfs, z
24170 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Name);.      if(
24180 20 70 44 62 20 29 7b 0a 20 20 20 20 20 20 20 20   pDb ){.        
24190 69 66 28 20 70 44 62 2d 3e 70 52 62 75 20 26 26  if( pDb->pRbu &&
241a0 20 70 44 62 2d 3e 70 52 62 75 2d 3e 65 53 74 61   pDb->pRbu->eSta
241b0 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4f 41  ge==RBU_STAGE_OA
241c0 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  L ){.          /
241d0 2a 20 54 68 69 73 20 63 61 6c 6c 20 69 73 20 74  * This call is t
241e0 6f 20 6f 70 65 6e 20 61 20 2a 2d 77 61 6c 20 66  o open a *-wal f
241f0 69 6c 65 2e 20 49 6e 74 65 61 64 2c 20 6f 70 65  ile. Intead, ope
24200 6e 20 74 68 65 20 2a 2d 6f 61 6c 2e 20 54 68 69  n the *-oal. Thi
24210 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  s.          ** c
24220 6f 64 65 20 65 6e 73 75 72 65 73 20 74 68 61 74  ode ensures that
24230 20 74 68 65 20 73 74 72 69 6e 67 20 70 61 73 73   the string pass
24240 65 64 20 74 6f 20 78 4f 70 65 6e 28 29 20 69 73  ed to xOpen() is
24250 20 74 65 72 6d 69 6e 61 74 65 64 20 62 79 20 61   terminated by a
24260 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61  .          ** pa
24270 69 72 20 6f 66 20 27 5c 30 27 20 62 79 74 65 73  ir of '\0' bytes
24280 20 69 6e 20 63 61 73 65 20 74 68 65 20 56 46 53   in case the VFS
24290 20 61 74 74 65 6d 70 74 73 20 74 6f 20 65 78 74   attempts to ext
242a0 72 61 63 74 20 61 20 55 52 49 20 0a 20 20 20 20  ract a URI .    
242b0 20 20 20 20 20 20 2a 2a 20 70 61 72 61 6d 65 74        ** paramet
242c0 65 72 20 66 72 6f 6d 20 69 74 2e 20 20 2a 2f 0a  er from it.  */.
242d0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20            const 
242e0 63 68 61 72 20 2a 7a 42 61 73 65 20 3d 20 7a 4e  char *zBase = zN
242f0 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 73  ame;.          s
24300 69 7a 65 5f 74 20 6e 43 6f 70 79 3b 0a 20 20 20  ize_t nCopy;.   
24310 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f         char *zCo
24320 70 79 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  py;.          if
24330 28 20 72 62 75 49 73 56 61 63 75 75 6d 28 70 44  ( rbuIsVacuum(pD
24340 62 2d 3e 70 52 62 75 29 20 29 7b 0a 20 20 20 20  b->pRbu) ){.    
24350 20 20 20 20 20 20 20 20 7a 42 61 73 65 20 3d 20          zBase = 
24360 73 71 6c 69 74 65 33 5f 64 62 5f 66 69 6c 65 6e  sqlite3_db_filen
24370 61 6d 65 28 70 44 62 2d 3e 70 52 62 75 2d 3e 64  ame(pDb->pRbu->d
24380 62 52 62 75 2c 20 22 6d 61 69 6e 22 29 3b 0a 20  bRbu, "main");. 
24390 20 20 20 20 20 20 20 20 20 20 20 7a 42 61 73 65             zBase
243a0 20 3d 20 72 62 75 4d 61 69 6e 54 6f 57 61 6c 28   = rbuMainToWal(
243b0 7a 42 61 73 65 2c 20 53 51 4c 49 54 45 5f 4f 50  zBase, SQLITE_OP
243c0 45 4e 5f 55 52 49 29 3b 0a 20 20 20 20 20 20 20  EN_URI);.       
243d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6e     }.          n
243e0 43 6f 70 79 20 3d 20 73 74 72 6c 65 6e 28 7a 42  Copy = strlen(zB
243f0 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ase);.          
24400 7a 43 6f 70 79 20 3d 20 73 71 6c 69 74 65 33 5f  zCopy = sqlite3_
24410 6d 61 6c 6c 6f 63 36 34 28 6e 43 6f 70 79 2b 32  malloc64(nCopy+2
24420 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
24430 20 7a 43 6f 70 79 20 29 7b 0a 20 20 20 20 20 20   zCopy ){.      
24440 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 43 6f        memcpy(zCo
24450 70 79 2c 20 7a 42 61 73 65 2c 20 6e 43 6f 70 79  py, zBase, nCopy
24460 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  );.            z
24470 43 6f 70 79 5b 6e 43 6f 70 79 2d 33 5d 20 3d 20  Copy[nCopy-3] = 
24480 27 6f 27 3b 0a 20 20 20 20 20 20 20 20 20 20 20  'o';.           
24490 20 7a 43 6f 70 79 5b 6e 43 6f 70 79 5d 20 3d 20   zCopy[nCopy] = 
244a0 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20 20 20  '\0';.          
244b0 20 20 7a 43 6f 70 79 5b 6e 43 6f 70 79 2b 31 5d    zCopy[nCopy+1]
244c0 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 20   = '\0';.       
244d0 20 20 20 20 20 7a 4f 70 65 6e 20 3d 20 28 63 6f       zOpen = (co
244e0 6e 73 74 20 63 68 61 72 2a 29 28 70 46 64 2d 3e  nst char*)(pFd->
244f0 7a 44 65 6c 20 3d 20 7a 43 6f 70 79 29 3b 0a 20  zDel = zCopy);. 
24500 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
24510 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
24520 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
24530 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
24540 20 20 20 20 20 70 46 64 2d 3e 70 52 62 75 20 3d       pFd->pRbu =
24550 20 70 44 62 2d 3e 70 52 62 75 3b 0a 20 20 20 20   pDb->pRbu;.    
24560 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 44      }.        pD
24570 62 2d 3e 70 57 61 6c 46 64 20 3d 20 70 46 64 3b  b->pWalFd = pFd;
24580 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
24590 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 64 2d   }else{.    pFd-
245a0 3e 70 52 62 75 20 3d 20 70 52 62 75 56 66 73 2d  >pRbu = pRbuVfs-
245b0 3e 70 52 62 75 3b 0a 20 20 7d 0a 0a 20 20 69 66  >pRbu;.  }..  if
245c0 28 20 6f 66 6c 61 67 73 20 26 20 53 51 4c 49 54  ( oflags & SQLIT
245d0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 0a  E_OPEN_MAIN_DB .
245e0 20 20 20 26 26 20 73 71 6c 69 74 65 33 5f 75 72     && sqlite3_ur
245f0 69 5f 62 6f 6f 6c 65 61 6e 28 7a 4e 61 6d 65 2c  i_boolean(zName,
24600 20 22 72 62 75 5f 6d 65 6d 6f 72 79 22 2c 20 30   "rbu_memory", 0
24610 29 20 0a 20 20 29 7b 0a 20 20 20 20 61 73 73 65  ) .  ){.    asse
24620 72 74 28 20 6f 66 6c 61 67 73 20 26 20 53 51 4c  rt( oflags & SQL
24630 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
24640 20 29 3b 0a 20 20 20 20 6f 66 6c 61 67 73 20 3d   );.    oflags =
24650 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45    SQLITE_OPEN_TE
24660 4d 50 5f 44 42 20 7c 20 53 51 4c 49 54 45 5f 4f  MP_DB | SQLITE_O
24670 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20  PEN_READWRITE | 
24680 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
24690 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  TE |.           
246a0 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45     SQLITE_OPEN_E
246b0 58 43 4c 55 53 49 56 45 20 7c 20 53 51 4c 49 54  XCLUSIVE | SQLIT
246c0 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43  E_OPEN_DELETEONC
246d0 4c 4f 53 45 3b 0a 20 20 20 20 7a 4f 70 65 6e 20  LOSE;.    zOpen 
246e0 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  = 0;.  }..  if( 
246f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
24700 0a 20 20 20 20 72 63 20 3d 20 70 52 65 61 6c 56  .    rc = pRealV
24710 66 73 2d 3e 78 4f 70 65 6e 28 70 52 65 61 6c 56  fs->xOpen(pRealV
24720 66 73 2c 20 7a 4f 70 65 6e 2c 20 70 46 64 2d 3e  fs, zOpen, pFd->
24730 70 52 65 61 6c 2c 20 6f 66 6c 61 67 73 2c 20 70  pReal, oflags, p
24740 4f 75 74 46 6c 61 67 73 29 3b 0a 20 20 7d 0a 20  OutFlags);.  }. 
24750 20 69 66 28 20 70 46 64 2d 3e 70 52 65 61 6c 2d   if( pFd->pReal-
24760 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  >pMethods ){.   
24770 20 2f 2a 20 54 68 65 20 78 4f 70 65 6e 28 29 20   /* The xOpen() 
24780 6f 70 65 72 61 74 69 6f 6e 20 68 61 73 20 73 75  operation has su
24790 63 63 65 65 64 65 64 2e 20 53 65 74 20 74 68 65  cceeded. Set the
247a0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 2e 70 4d   sqlite3_file.pM
247b0 65 74 68 6f 64 73 0a 20 20 20 20 2a 2a 20 70 6f  ethods.    ** po
247c0 69 6e 74 65 72 20 61 6e 64 2c 20 69 66 20 74 68  inter and, if th
247d0 65 20 66 69 6c 65 20 69 73 20 61 20 6d 61 69 6e  e file is a main
247e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
247f0 6c 69 6e 6b 20 69 74 20 69 6e 74 6f 20 74 68 65  link it into the
24800 0a 20 20 20 20 2a 2a 20 6d 75 74 65 78 20 70 72  .    ** mutex pr
24810 6f 74 65 63 74 65 64 20 6c 69 6e 6b 65 64 20 6c  otected linked l
24820 69 73 74 20 6f 66 20 61 6c 6c 20 73 75 63 68 20  ist of all such 
24830 66 69 6c 65 73 2e 20 20 2a 2f 0a 20 20 20 20 70  files.  */.    p
24840 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 20 3d  File->pMethods =
24850 20 26 72 62 75 76 66 73 5f 69 6f 5f 6d 65 74 68   &rbuvfs_io_meth
24860 6f 64 73 3b 0a 20 20 20 20 69 66 28 20 66 6c 61  ods;.    if( fla
24870 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
24880 5f 4d 41 49 4e 5f 44 42 20 29 7b 0a 20 20 20 20  _MAIN_DB ){.    
24890 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
248a0 65 6e 74 65 72 28 70 52 62 75 56 66 73 2d 3e 6d  enter(pRbuVfs->m
248b0 75 74 65 78 29 3b 0a 20 20 20 20 20 20 70 46 64  utex);.      pFd
248c0 2d 3e 70 4d 61 69 6e 4e 65 78 74 20 3d 20 70 52  ->pMainNext = pR
248d0 62 75 56 66 73 2d 3e 70 4d 61 69 6e 3b 0a 20 20  buVfs->pMain;.  
248e0 20 20 20 20 70 52 62 75 56 66 73 2d 3e 70 4d 61      pRbuVfs->pMa
248f0 69 6e 20 3d 20 70 46 64 3b 0a 20 20 20 20 20 20  in = pFd;.      
24900 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
24910 61 76 65 28 70 52 62 75 56 66 73 2d 3e 6d 75 74  ave(pRbuVfs->mut
24920 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ex);.    }.  }el
24930 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  se{.    sqlite3_
24940 66 72 65 65 28 70 46 64 2d 3e 7a 44 65 6c 29 3b  free(pFd->zDel);
24950 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
24960 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  c;.}../*.** Dele
24970 74 65 20 74 68 65 20 66 69 6c 65 20 6c 6f 63 61  te the file loca
24980 74 65 64 20 61 74 20 7a 50 61 74 68 2e 0a 2a 2f  ted at zPath..*/
24990 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 56  .static int rbuV
249a0 66 73 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33  fsDelete(sqlite3
249b0 5f 76 66 73 20 2a 70 56 66 73 2c 20 63 6f 6e 73  _vfs *pVfs, cons
249c0 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 69  t char *zPath, i
249d0 6e 74 20 64 69 72 53 79 6e 63 29 7b 0a 20 20 73  nt dirSync){.  s
249e0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 52 65 61  qlite3_vfs *pRea
249f0 6c 56 66 73 20 3d 20 28 28 72 62 75 5f 76 66 73  lVfs = ((rbu_vfs
24a00 2a 29 70 56 66 73 29 2d 3e 70 52 65 61 6c 56 66  *)pVfs)->pRealVf
24a10 73 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65 61  s;.  return pRea
24a20 6c 56 66 73 2d 3e 78 44 65 6c 65 74 65 28 70 52  lVfs->xDelete(pR
24a30 65 61 6c 56 66 73 2c 20 7a 50 61 74 68 2c 20 64  ealVfs, zPath, d
24a40 69 72 53 79 6e 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  irSync);.}../*.*
24a50 2a 20 54 65 73 74 20 66 6f 72 20 61 63 63 65 73  * Test for acces
24a60 73 20 70 65 72 6d 69 73 73 69 6f 6e 73 2e 20 52  s permissions. R
24a70 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
24a80 65 20 72 65 71 75 65 73 74 65 64 20 70 65 72 6d  e requested perm
24a90 69 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 61 76 61  ission.** is ava
24aa0 69 6c 61 62 6c 65 2c 20 6f 72 20 66 61 6c 73 65  ilable, or false
24ab0 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73   otherwise..*/.s
24ac0 74 61 74 69 63 20 69 6e 74 20 72 62 75 56 66 73  tatic int rbuVfs
24ad0 41 63 63 65 73 73 28 0a 20 20 73 71 6c 69 74 65  Access(.  sqlite
24ae0 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 0a 20 20  3_vfs *pVfs, .  
24af0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
24b00 68 2c 20 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c  h, .  int flags,
24b10 20 0a 20 20 69 6e 74 20 2a 70 52 65 73 4f 75 74   .  int *pResOut
24b20 0a 29 7b 0a 20 20 72 62 75 5f 76 66 73 20 2a 70  .){.  rbu_vfs *p
24b30 52 62 75 56 66 73 20 3d 20 28 72 62 75 5f 76 66  RbuVfs = (rbu_vf
24b40 73 2a 29 70 56 66 73 3b 0a 20 20 73 71 6c 69 74  s*)pVfs;.  sqlit
24b50 65 33 5f 76 66 73 20 2a 70 52 65 61 6c 56 66 73  e3_vfs *pRealVfs
24b60 20 3d 20 70 52 62 75 56 66 73 2d 3e 70 52 65 61   = pRbuVfs->pRea
24b70 6c 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  lVfs;.  int rc;.
24b80 0a 20 20 72 63 20 3d 20 70 52 65 61 6c 56 66 73  .  rc = pRealVfs
24b90 2d 3e 78 41 63 63 65 73 73 28 70 52 65 61 6c 56  ->xAccess(pRealV
24ba0 66 73 2c 20 7a 50 61 74 68 2c 20 66 6c 61 67 73  fs, zPath, flags
24bb0 2c 20 70 52 65 73 4f 75 74 29 3b 0a 0a 20 20 2f  , pResOut);..  /
24bc0 2a 20 49 66 20 74 68 69 73 20 63 61 6c 6c 20 69  * If this call i
24bd0 73 20 74 6f 20 63 68 65 63 6b 20 69 66 20 61 20  s to check if a 
24be0 2a 2d 77 61 6c 20 66 69 6c 65 20 61 73 73 6f 63  *-wal file assoc
24bf0 69 61 74 65 64 20 77 69 74 68 20 61 6e 20 52 42  iated with an RB
24c00 55 20 74 61 72 67 65 74 0a 20 20 2a 2a 20 64 61  U target.  ** da
24c10 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
24c20 6e 20 65 78 69 73 74 73 2c 20 61 6e 64 20 74 68  n exists, and th
24c30 65 20 52 42 55 20 75 70 64 61 74 65 20 69 73 20  e RBU update is 
24c40 69 6e 20 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c  in RBU_STAGE_OAL
24c50 2c 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f  ,.  ** the follo
24c60 77 69 6e 67 20 73 70 65 63 69 61 6c 20 68 61 6e  wing special han
24c70 64 6c 69 6e 67 20 69 73 20 61 63 74 69 76 61 74  dling is activat
24c80 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ed:.  **.  **   
24c90 61 29 20 69 66 20 74 68 65 20 2a 2d 77 61 6c 20  a) if the *-wal 
24ca0 66 69 6c 65 20 64 6f 65 73 20 65 78 69 73 74 2c  file does exist,
24cb0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
24cc0 41 4e 54 4f 50 45 4e 2e 20 54 68 69 73 0a 20 20  ANTOPEN. This.  
24cd0 2a 2a 20 20 20 20 20 20 65 6e 73 75 72 65 73 20  **      ensures 
24ce0 74 68 61 74 20 74 68 65 20 52 42 55 20 65 78 74  that the RBU ext
24cf0 65 6e 73 69 6f 6e 20 6e 65 76 65 72 20 74 72 69  ension never tri
24d00 65 73 20 74 6f 20 75 70 64 61 74 65 20 61 20 64  es to update a d
24d10 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 20 20 20  atabase.  **    
24d20 20 20 69 6e 20 77 61 6c 20 6d 6f 64 65 2c 20 65    in wal mode, e
24d30 76 65 6e 20 69 66 20 74 68 65 20 66 69 72 73 74  ven if the first
24d40 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
24d50 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 0a 20  abase file has. 
24d60 20 2a 2a 20 20 20 20 20 20 62 65 65 6e 20 64 61   **      been da
24d70 6d 61 67 65 64 2e 20 0a 20 20 2a 2a 0a 20 20 2a  maged. .  **.  *
24d80 2a 20 20 20 62 29 20 69 66 20 74 68 65 20 2a 2d  *   b) if the *-
24d90 77 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  wal file does no
24da0 74 20 65 78 69 73 74 2c 20 63 6c 61 69 6d 20 74  t exist, claim t
24db0 68 61 74 20 69 74 20 64 6f 65 73 20 61 6e 79 77  hat it does anyw
24dc0 61 79 2c 0a 20 20 2a 2a 20 20 20 20 20 20 63 61  ay,.  **      ca
24dd0 75 73 69 6e 67 20 53 51 4c 69 74 65 20 74 6f 20  using SQLite to 
24de0 63 61 6c 6c 20 78 4f 70 65 6e 28 29 20 74 6f 20  call xOpen() to 
24df0 6f 70 65 6e 20 69 74 2e 20 54 68 69 73 20 63 61  open it. This ca
24e00 6c 6c 20 77 69 6c 6c 20 61 6c 73 6f 0a 20 20 2a  ll will also.  *
24e10 2a 20 20 20 20 20 20 62 65 20 69 6e 74 65 72 63  *      be interc
24e20 65 70 74 65 64 20 28 73 65 65 20 74 68 65 20 72  epted (see the r
24e30 62 75 56 66 73 4f 70 65 6e 28 29 20 66 75 6e 63  buVfsOpen() func
24e40 74 69 6f 6e 29 20 61 6e 64 20 74 68 65 20 2a 2d  tion) and the *-
24e50 6f 61 6c 0a 20 20 2a 2a 20 20 20 20 20 20 66 69  oal.  **      fi
24e60 6c 65 20 6f 70 65 6e 65 64 20 69 6e 73 74 65 61  le opened instea
24e70 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  d..  */.  if( rc
24e80 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 66  ==SQLITE_OK && f
24e90 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 41 43 43  lags==SQLITE_ACC
24ea0 45 53 53 5f 45 58 49 53 54 53 20 29 7b 0a 20 20  ESS_EXISTS ){.  
24eb0 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 44 62 20    rbu_file *pDb 
24ec0 3d 20 72 62 75 46 69 6e 64 4d 61 69 6e 64 62 28  = rbuFindMaindb(
24ed0 70 52 62 75 56 66 73 2c 20 7a 50 61 74 68 29 3b  pRbuVfs, zPath);
24ee0 0a 20 20 20 20 69 66 28 20 70 44 62 20 26 26 20  .    if( pDb && 
24ef0 70 44 62 2d 3e 70 52 62 75 20 26 26 20 70 44 62  pDb->pRbu && pDb
24f00 2d 3e 70 52 62 75 2d 3e 65 53 74 61 67 65 3d 3d  ->pRbu->eStage==
24f10 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20 29 7b  RBU_STAGE_OAL ){
24f20 0a 20 20 20 20 20 20 69 66 28 20 2a 70 52 65 73  .      if( *pRes
24f30 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72  Out ){.        r
24f40 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  c = SQLITE_CANTO
24f50 50 45 4e 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  PEN;.      }else
24f60 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
24f70 33 5f 69 6e 74 36 34 20 73 7a 20 3d 20 30 3b 0a  3_int64 sz = 0;.
24f80 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 62 75          rc = rbu
24f90 56 66 73 46 69 6c 65 53 69 7a 65 28 26 70 44 62  VfsFileSize(&pDb
24fa0 2d 3e 62 61 73 65 2c 20 26 73 7a 29 3b 0a 20 20  ->base, &sz);.  
24fb0 20 20 20 20 20 20 2a 70 52 65 73 4f 75 74 20 3d        *pResOut =
24fc0 20 28 73 7a 3e 30 29 3b 0a 20 20 20 20 20 20 7d   (sz>0);.      }
24fd0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
24fe0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
24ff0 2a 20 50 6f 70 75 6c 61 74 65 20 62 75 66 66 65  * Populate buffe
25000 72 20 7a 4f 75 74 20 77 69 74 68 20 74 68 65 20  r zOut with the 
25010 66 75 6c 6c 20 63 61 6e 6f 6e 69 63 61 6c 20 70  full canonical p
25020 61 74 68 6e 61 6d 65 20 63 6f 72 72 65 73 70 6f  athname correspo
25030 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 74 68 65 20  nding.** to the 
25040 70 61 74 68 6e 61 6d 65 20 69 6e 20 7a 50 61 74  pathname in zPat
25050 68 2e 20 7a 4f 75 74 20 69 73 20 67 75 61 72 61  h. zOut is guara
25060 6e 74 65 65 64 20 74 6f 20 70 6f 69 6e 74 20 74  nteed to point t
25070 6f 20 61 20 62 75 66 66 65 72 0a 2a 2a 20 6f 66  o a buffer.** of
25080 20 61 74 20 6c 65 61 73 74 20 28 44 45 56 53 59   at least (DEVSY
25090 4d 5f 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31  M_MAX_PATHNAME+1
250a0 29 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74  ) bytes..*/.stat
250b0 69 63 20 69 6e 74 20 72 62 75 56 66 73 46 75 6c  ic int rbuVfsFul
250c0 6c 50 61 74 68 6e 61 6d 65 28 0a 20 20 73 71 6c  lPathname(.  sql
250d0 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
250e0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
250f0 50 61 74 68 2c 20 0a 20 20 69 6e 74 20 6e 4f 75  Path, .  int nOu
25100 74 2c 20 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74  t, .  char *zOut
25110 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  .){.  sqlite3_vf
25120 73 20 2a 70 52 65 61 6c 56 66 73 20 3d 20 28 28  s *pRealVfs = ((
25130 72 62 75 5f 76 66 73 2a 29 70 56 66 73 29 2d 3e  rbu_vfs*)pVfs)->
25140 70 52 65 61 6c 56 66 73 3b 0a 20 20 72 65 74 75  pRealVfs;.  retu
25150 72 6e 20 70 52 65 61 6c 56 66 73 2d 3e 78 46 75  rn pRealVfs->xFu
25160 6c 6c 50 61 74 68 6e 61 6d 65 28 70 52 65 61 6c  llPathname(pReal
25170 56 66 73 2c 20 7a 50 61 74 68 2c 20 6e 4f 75 74  Vfs, zPath, nOut
25180 2c 20 7a 4f 75 74 29 3b 0a 7d 0a 0a 23 69 66 6e  , zOut);.}..#ifn
25190 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
251a0 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 2f  LOAD_EXTENSION./
251b0 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 64 79  *.** Open the dy
251c0 6e 61 6d 69 63 20 6c 69 62 72 61 72 79 20 6c 6f  namic library lo
251d0 63 61 74 65 64 20 61 74 20 7a 50 61 74 68 20 61  cated at zPath a
251e0 6e 64 20 72 65 74 75 72 6e 20 61 20 68 61 6e 64  nd return a hand
251f0 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  le..*/.static vo
25200 69 64 20 2a 72 62 75 56 66 73 44 6c 4f 70 65 6e  id *rbuVfsDlOpen
25210 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
25220 66 73 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  fs, const char *
25230 7a 50 61 74 68 29 7b 0a 20 20 73 71 6c 69 74 65  zPath){.  sqlite
25240 33 5f 76 66 73 20 2a 70 52 65 61 6c 56 66 73 20  3_vfs *pRealVfs 
25250 3d 20 28 28 72 62 75 5f 76 66 73 2a 29 70 56 66  = ((rbu_vfs*)pVf
25260 73 29 2d 3e 70 52 65 61 6c 56 66 73 3b 0a 20 20  s)->pRealVfs;.  
25270 72 65 74 75 72 6e 20 70 52 65 61 6c 56 66 73 2d  return pRealVfs-
25280 3e 78 44 6c 4f 70 65 6e 28 70 52 65 61 6c 56 66  >xDlOpen(pRealVf
25290 73 2c 20 7a 50 61 74 68 29 3b 0a 7d 0a 0a 2f 2a  s, zPath);.}../*
252a0 0a 2a 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65  .** Populate the
252b0 20 62 75 66 66 65 72 20 7a 45 72 72 4d 73 67 20   buffer zErrMsg 
252c0 28 73 69 7a 65 20 6e 42 79 74 65 20 62 79 74 65  (size nByte byte
252d0 73 29 20 77 69 74 68 20 61 20 68 75 6d 61 6e 20  s) with a human 
252e0 72 65 61 64 61 62 6c 65 0a 2a 2a 20 75 74 66 2d  readable.** utf-
252f0 38 20 73 74 72 69 6e 67 20 64 65 73 63 72 69 62  8 string describ
25300 69 6e 67 20 74 68 65 20 6d 6f 73 74 20 72 65 63  ing the most rec
25310 65 6e 74 20 65 72 72 6f 72 20 65 6e 63 6f 75 6e  ent error encoun
25320 74 65 72 65 64 20 61 73 73 6f 63 69 61 74 65 64  tered associated
25330 20 0a 2a 2a 20 77 69 74 68 20 64 79 6e 61 6d 69   .** with dynami
25340 63 20 6c 69 62 72 61 72 69 65 73 2e 0a 2a 2f 0a  c libraries..*/.
25350 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75 56  static void rbuV
25360 66 73 44 6c 45 72 72 6f 72 28 73 71 6c 69 74 65  fsDlError(sqlite
25370 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74  3_vfs *pVfs, int
25380 20 6e 42 79 74 65 2c 20 63 68 61 72 20 2a 7a 45   nByte, char *zE
25390 72 72 4d 73 67 29 7b 0a 20 20 73 71 6c 69 74 65  rrMsg){.  sqlite
253a0 33 5f 76 66 73 20 2a 70 52 65 61 6c 56 66 73 20  3_vfs *pRealVfs 
253b0 3d 20 28 28 72 62 75 5f 76 66 73 2a 29 70 56 66  = ((rbu_vfs*)pVf
253c0 73 29 2d 3e 70 52 65 61 6c 56 66 73 3b 0a 20 20  s)->pRealVfs;.  
253d0 70 52 65 61 6c 56 66 73 2d 3e 78 44 6c 45 72 72  pRealVfs->xDlErr
253e0 6f 72 28 70 52 65 61 6c 56 66 73 2c 20 6e 42 79  or(pRealVfs, nBy
253f0 74 65 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 7d 0a  te, zErrMsg);.}.
25400 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
25410 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73  pointer to the s
25420 79 6d 62 6f 6c 20 7a 53 79 6d 62 6f 6c 20 69 6e  ymbol zSymbol in
25430 20 74 68 65 20 64 79 6e 61 6d 69 63 20 6c 69 62   the dynamic lib
25440 72 61 72 79 20 70 48 61 6e 64 6c 65 2e 0a 2a 2f  rary pHandle..*/
25450 0a 73 74 61 74 69 63 20 76 6f 69 64 20 28 2a 72  .static void (*r
25460 62 75 56 66 73 44 6c 53 79 6d 28 0a 20 20 73 71  buVfsDlSym(.  sq
25470 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
25480 20 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 2c 20   .  void *pArg, 
25490 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
254a0 53 79 6d 0a 29 29 28 76 6f 69 64 29 7b 0a 20 20  Sym.))(void){.  
254b0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 52 65  sqlite3_vfs *pRe
254c0 61 6c 56 66 73 20 3d 20 28 28 72 62 75 5f 76 66  alVfs = ((rbu_vf
254d0 73 2a 29 70 56 66 73 29 2d 3e 70 52 65 61 6c 56  s*)pVfs)->pRealV
254e0 66 73 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65  fs;.  return pRe
254f0 61 6c 56 66 73 2d 3e 78 44 6c 53 79 6d 28 70 52  alVfs->xDlSym(pR
25500 65 61 6c 56 66 73 2c 20 70 41 72 67 2c 20 7a 53  ealVfs, pArg, zS
25510 79 6d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  ym);.}../*.** Cl
25520 6f 73 65 20 74 68 65 20 64 79 6e 61 6d 69 63 20  ose the dynamic 
25530 6c 69 62 72 61 72 79 20 68 61 6e 64 6c 65 20 70  library handle p
25540 48 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  Handle..*/.stati
25550 63 20 76 6f 69 64 20 72 62 75 56 66 73 44 6c 43  c void rbuVfsDlC
25560 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 76 66 73  lose(sqlite3_vfs
25570 20 2a 70 56 66 73 2c 20 76 6f 69 64 20 2a 70 48   *pVfs, void *pH
25580 61 6e 64 6c 65 29 7b 0a 20 20 73 71 6c 69 74 65  andle){.  sqlite
25590 33 5f 76 66 73 20 2a 70 52 65 61 6c 56 66 73 20  3_vfs *pRealVfs 
255a0 3d 20 28 28 72 62 75 5f 76 66 73 2a 29 70 56 66  = ((rbu_vfs*)pVf
255b0 73 29 2d 3e 70 52 65 61 6c 56 66 73 3b 0a 20 20  s)->pRealVfs;.  
255c0 70 52 65 61 6c 56 66 73 2d 3e 78 44 6c 43 6c 6f  pRealVfs->xDlClo
255d0 73 65 28 70 52 65 61 6c 56 66 73 2c 20 70 48 61  se(pRealVfs, pHa
255e0 6e 64 6c 65 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  ndle);.}.#endif 
255f0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  /* SQLITE_OMIT_L
25600 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 20 2a 2f  OAD_EXTENSION */
25610 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 75 6c 61 74 65  ../*.** Populate
25620 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e   the buffer poin
25630 74 65 64 20 74 6f 20 62 79 20 7a 42 75 66 4f 75  ted to by zBufOu
25640 74 20 77 69 74 68 20 6e 42 79 74 65 20 62 79 74  t with nByte byt
25650 65 73 20 6f 66 20 0a 2a 2a 20 72 61 6e 64 6f 6d  es of .** random
25660 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63   data..*/.static
25670 20 69 6e 74 20 72 62 75 56 66 73 52 61 6e 64 6f   int rbuVfsRando
25680 6d 6e 65 73 73 28 73 71 6c 69 74 65 33 5f 76 66  mness(sqlite3_vf
25690 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 79  s *pVfs, int nBy
256a0 74 65 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f 75  te, char *zBufOu
256b0 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  t){.  sqlite3_vf
256c0 73 20 2a 70 52 65 61 6c 56 66 73 20 3d 20 28 28  s *pRealVfs = ((
256d0 72 62 75 5f 76 66 73 2a 29 70 56 66 73 29 2d 3e  rbu_vfs*)pVfs)->
256e0 70 52 65 61 6c 56 66 73 3b 0a 20 20 72 65 74 75  pRealVfs;.  retu
256f0 72 6e 20 70 52 65 61 6c 56 66 73 2d 3e 78 52 61  rn pRealVfs->xRa
25700 6e 64 6f 6d 6e 65 73 73 28 70 52 65 61 6c 56 66  ndomness(pRealVf
25710 73 2c 20 6e 42 79 74 65 2c 20 7a 42 75 66 4f 75  s, nByte, zBufOu
25720 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65  t);.}../*.** Sle
25730 65 70 20 66 6f 72 20 6e 4d 69 63 72 6f 20 6d 69  ep for nMicro mi
25740 63 72 6f 73 65 63 6f 6e 64 73 2e 20 52 65 74 75  croseconds. Retu
25750 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
25760 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 0a 2a   microseconds .*
25770 2a 20 61 63 74 75 61 6c 6c 79 20 73 6c 65 70 74  * actually slept
25780 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
25790 72 62 75 56 66 73 53 6c 65 65 70 28 73 71 6c 69  rbuVfsSleep(sqli
257a0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69  te3_vfs *pVfs, i
257b0 6e 74 20 6e 4d 69 63 72 6f 29 7b 0a 20 20 73 71  nt nMicro){.  sq
257c0 6c 69 74 65 33 5f 76 66 73 20 2a 70 52 65 61 6c  lite3_vfs *pReal
257d0 56 66 73 20 3d 20 28 28 72 62 75 5f 76 66 73 2a  Vfs = ((rbu_vfs*
257e0 29 70 56 66 73 29 2d 3e 70 52 65 61 6c 56 66 73  )pVfs)->pRealVfs
257f0 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65 61 6c  ;.  return pReal
25800 56 66 73 2d 3e 78 53 6c 65 65 70 28 70 52 65 61  Vfs->xSleep(pRea
25810 6c 56 66 73 2c 20 6e 4d 69 63 72 6f 29 3b 0a 7d  lVfs, nMicro);.}
25820 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
25830 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20  he current time 
25840 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20  as a Julian Day 
25850 6e 75 6d 62 65 72 20 69 6e 20 2a 70 54 69 6d 65  number in *pTime
25860 4f 75 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  Out..*/.static i
25870 6e 74 20 72 62 75 56 66 73 43 75 72 72 65 6e 74  nt rbuVfsCurrent
25880 54 69 6d 65 28 73 71 6c 69 74 65 33 5f 76 66 73  Time(sqlite3_vfs
25890 20 2a 70 56 66 73 2c 20 64 6f 75 62 6c 65 20 2a   *pVfs, double *
258a0 70 54 69 6d 65 4f 75 74 29 7b 0a 20 20 73 71 6c  pTimeOut){.  sql
258b0 69 74 65 33 5f 76 66 73 20 2a 70 52 65 61 6c 56  ite3_vfs *pRealV
258c0 66 73 20 3d 20 28 28 72 62 75 5f 76 66 73 2a 29  fs = ((rbu_vfs*)
258d0 70 56 66 73 29 2d 3e 70 52 65 61 6c 56 66 73 3b  pVfs)->pRealVfs;
258e0 0a 20 20 72 65 74 75 72 6e 20 70 52 65 61 6c 56  .  return pRealV
258f0 66 73 2d 3e 78 43 75 72 72 65 6e 74 54 69 6d 65  fs->xCurrentTime
25900 28 70 52 65 61 6c 56 66 73 2c 20 70 54 69 6d 65  (pRealVfs, pTime
25910 4f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e  Out);.}../*.** N
25920 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
25930 69 6e 74 20 72 62 75 56 66 73 47 65 74 4c 61 73  int rbuVfsGetLas
25940 74 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76  tError(sqlite3_v
25950 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 61 2c  fs *pVfs, int a,
25960 20 63 68 61 72 20 2a 62 29 7b 0a 20 20 72 65 74   char *b){.  ret
25970 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
25980 44 65 72 65 67 69 73 74 65 72 20 61 6e 64 20 64  Deregister and d
25990 65 73 74 72 6f 79 20 61 6e 20 52 42 55 20 76 66  estroy an RBU vf
259a0 73 20 63 72 65 61 74 65 64 20 62 79 20 61 6e 20  s created by an 
259b0 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 0a  earlier call to.
259c0 2a 2a 20 73 71 6c 69 74 65 33 72 62 75 5f 63 72  ** sqlite3rbu_cr
259d0 65 61 74 65 5f 76 66 73 28 29 2e 0a 2a 2f 0a 76  eate_vfs()..*/.v
259e0 6f 69 64 20 73 71 6c 69 74 65 33 72 62 75 5f 64  oid sqlite3rbu_d
259f0 65 73 74 72 6f 79 5f 76 66 73 28 63 6f 6e 73 74  estroy_vfs(const
25a00 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20   char *zName){. 
25a10 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
25a20 66 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73  fs = sqlite3_vfs
25a30 5f 66 69 6e 64 28 7a 4e 61 6d 65 29 3b 0a 20 20  _find(zName);.  
25a40 69 66 28 20 70 56 66 73 20 26 26 20 70 56 66 73  if( pVfs && pVfs
25a50 2d 3e 78 4f 70 65 6e 3d 3d 72 62 75 56 66 73 4f  ->xOpen==rbuVfsO
25a60 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  pen ){.    sqlit
25a70 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 28 28  e3_mutex_free(((
25a80 72 62 75 5f 76 66 73 2a 29 70 56 66 73 29 2d 3e  rbu_vfs*)pVfs)->
25a90 6d 75 74 65 78 29 3b 0a 20 20 20 20 73 71 6c 69  mutex);.    sqli
25aa0 74 65 33 5f 76 66 73 5f 75 6e 72 65 67 69 73 74  te3_vfs_unregist
25ab0 65 72 28 70 56 66 73 29 3b 0a 20 20 20 20 73 71  er(pVfs);.    sq
25ac0 6c 69 74 65 33 5f 66 72 65 65 28 70 56 66 73 29  lite3_free(pVfs)
25ad0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
25ae0 72 65 61 74 65 20 61 6e 20 52 42 55 20 56 46 53  reate an RBU VFS
25af0 20 6e 61 6d 65 64 20 7a 4e 61 6d 65 20 74 68 61   named zName tha
25b00 74 20 61 63 63 65 73 73 65 73 20 74 68 65 20 75  t accesses the u
25b10 6e 64 65 72 6c 79 69 6e 67 20 66 69 6c 65 2d 73  nderlying file-s
25b20 79 73 74 65 6d 0a 2a 2a 20 76 69 61 20 65 78 69  ystem.** via exi
25b30 73 74 69 6e 67 20 56 46 53 20 7a 50 61 72 65 6e  sting VFS zParen
25b40 74 2e 20 54 68 65 20 6e 65 77 20 6f 62 6a 65 63  t. The new objec
25b50 74 20 69 73 20 72 65 67 69 73 74 65 72 65 64 20  t is registered 
25b60 61 73 20 61 20 6e 6f 6e 2d 64 65 66 61 75 6c 74  as a non-default
25b70 0a 2a 2a 20 56 46 53 20 77 69 74 68 20 53 51 4c  .** VFS with SQL
25b80 69 74 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  ite before retur
25b90 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ning..*/.int sql
25ba0 69 74 65 33 72 62 75 5f 63 72 65 61 74 65 5f 76  ite3rbu_create_v
25bb0 66 73 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  fs(const char *z
25bc0 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  Name, const char
25bd0 20 2a 7a 50 61 72 65 6e 74 29 7b 0a 0a 20 20 2f   *zParent){..  /
25be0 2a 20 54 65 6d 70 6c 61 74 65 20 66 6f 72 20 56  * Template for V
25bf0 46 53 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 73  FS */.  static s
25c00 71 6c 69 74 65 33 5f 76 66 73 20 76 66 73 5f 74  qlite3_vfs vfs_t
25c10 65 6d 70 6c 61 74 65 20 3d 20 7b 0a 20 20 20 20  emplate = {.    
25c20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1,              
25c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25c40 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 20   iVersion */.   
25c50 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
25c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25c70 2a 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 0a 20 20  * szOsFile */.  
25c80 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
25c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25ca0 2f 2a 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a 2f  /* mxPathname */
25cb0 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20  .    0,         
25cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25cd0 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a 20     /* pNext */. 
25ce0 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20     0,           
25cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25d00 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 20   /* zName */.   
25d10 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
25d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25d30 2a 20 70 41 70 70 44 61 74 61 20 2a 2f 0a 20 20  * pAppData */.  
25d40 20 20 72 62 75 56 66 73 4f 70 65 6e 2c 20 20 20    rbuVfsOpen,   
25d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25d60 2f 2a 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 20 20  /* xOpen */.    
25d70 72 62 75 56 66 73 44 65 6c 65 74 65 2c 20 20 20  rbuVfsDelete,   
25d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25d90 20 78 44 65 6c 65 74 65 20 2a 2f 0a 20 20 20 20   xDelete */.    
25da0 72 62 75 56 66 73 41 63 63 65 73 73 2c 20 20 20  rbuVfsAccess,   
25db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25dc0 20 78 41 63 63 65 73 73 20 2a 2f 0a 20 20 20 20   xAccess */.    
25dd0 72 62 75 56 66 73 46 75 6c 6c 50 61 74 68 6e 61  rbuVfsFullPathna
25de0 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  me,           /*
25df0 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 2a   xFullPathname *
25e00 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
25e10 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45  E_OMIT_LOAD_EXTE
25e20 4e 53 49 4f 4e 0a 20 20 20 20 72 62 75 56 66 73  NSION.    rbuVfs
25e30 44 6c 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20  DlOpen,         
25e40 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 4f 70          /* xDlOp
25e50 65 6e 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73  en */.    rbuVfs
25e60 44 6c 45 72 72 6f 72 2c 20 20 20 20 20 20 20 20  DlError,        
25e70 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 45 72          /* xDlEr
25e80 72 6f 72 20 2a 2f 0a 20 20 20 20 72 62 75 56 66  ror */.    rbuVf
25e90 73 44 6c 53 79 6d 2c 20 20 20 20 20 20 20 20 20  sDlSym,         
25ea0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 53           /* xDlS
25eb0 79 6d 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73  ym */.    rbuVfs
25ec0 44 6c 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  DlClose,        
25ed0 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c          /* xDlCl
25ee0 6f 73 65 20 2a 2f 0a 23 65 6c 73 65 0a 20 20 20  ose */.#else.   
25ef0 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 23 65 6e   0, 0, 0, 0,.#en
25f00 64 69 66 0a 0a 20 20 20 20 72 62 75 56 66 73 52  dif..    rbuVfsR
25f10 61 6e 64 6f 6d 6e 65 73 73 2c 20 20 20 20 20 20  andomness,      
25f20 20 20 20 20 20 20 20 2f 2a 20 78 52 61 6e 64 6f         /* xRando
25f30 6d 6e 65 73 73 20 2a 2f 0a 20 20 20 20 72 62 75  mness */.    rbu
25f40 56 66 73 53 6c 65 65 70 2c 20 20 20 20 20 20 20  VfsSleep,       
25f50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
25f60 6c 65 65 70 20 2a 2f 0a 20 20 20 20 72 62 75 56  leep */.    rbuV
25f70 66 73 43 75 72 72 65 6e 74 54 69 6d 65 2c 20 20  fsCurrentTime,  
25f80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 75            /* xCu
25f90 72 72 65 6e 74 54 69 6d 65 20 2a 2f 0a 20 20 20  rrentTime */.   
25fa0 20 72 62 75 56 66 73 47 65 74 4c 61 73 74 45 72   rbuVfsGetLastEr
25fb0 72 6f 72 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ror,           /
25fc0 2a 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 20  * xGetLastError 
25fd0 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20  */.    0,       
25fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25ff0 20 20 20 20 20 2f 2a 20 78 43 75 72 72 65 6e 74       /* xCurrent
26000 54 69 6d 65 49 6e 74 36 34 20 28 76 65 72 73 69  TimeInt64 (versi
26010 6f 6e 20 32 29 20 2a 2f 0a 20 20 20 20 30 2c 20  on 2) */.    0, 
26020 30 2c 20 30 20 20 20 20 20 20 20 20 20 20 20 20  0, 0            
26030 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e             /* Un
26040 69 6d 70 6c 65 6d 65 6e 74 65 64 20 76 65 72 73  implemented vers
26050 69 6f 6e 20 33 20 6d 65 74 68 6f 64 73 20 2a 2f  ion 3 methods */
26060 0a 20 20 7d 3b 0a 0a 20 20 72 62 75 5f 76 66 73  .  };..  rbu_vfs
26070 20 2a 70 4e 65 77 20 3d 20 30 3b 20 20 20 20 20   *pNew = 0;     
26080 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 6c           /* Newl
26090 79 20 61 6c 6c 6f 63 61 74 65 64 20 56 46 53 20  y allocated VFS 
260a0 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
260b0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 69 7a 65 5f  LITE_OK;.  size_
260c0 74 20 6e 4e 61 6d 65 3b 0a 20 20 73 69 7a 65 5f  t nName;.  size_
260d0 74 20 6e 42 79 74 65 3b 0a 0a 20 20 6e 4e 61 6d  t nByte;..  nNam
260e0 65 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65  e = strlen(zName
260f0 29 3b 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a  );.  nByte = siz
26100 65 6f 66 28 72 62 75 5f 76 66 73 29 20 2b 20 6e  eof(rbu_vfs) + n
26110 4e 61 6d 65 20 2b 20 31 3b 0a 20 20 70 4e 65 77  Name + 1;.  pNew
26120 20 3d 20 28 72 62 75 5f 76 66 73 2a 29 73 71 6c   = (rbu_vfs*)sql
26130 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 42  ite3_malloc64(nB
26140 79 74 65 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  yte);.  if( pNew
26150 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
26160 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
26170 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
26180 65 33 5f 76 66 73 20 2a 70 50 61 72 65 6e 74 3b  e3_vfs *pParent;
26190 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
261a0 72 65 6e 74 20 56 46 53 20 2a 2f 0a 20 20 20 20  rent VFS */.    
261b0 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20  memset(pNew, 0, 
261c0 6e 42 79 74 65 29 3b 0a 20 20 20 20 70 50 61 72  nByte);.    pPar
261d0 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f 76 66  ent = sqlite3_vf
261e0 73 5f 66 69 6e 64 28 7a 50 61 72 65 6e 74 29 3b  s_find(zParent);
261f0 0a 20 20 20 20 69 66 28 20 70 50 61 72 65 6e 74  .    if( pParent
26200 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
26210 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  = SQLITE_NOTFOUN
26220 44 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  D;.    }else{.  
26230 20 20 20 20 63 68 61 72 20 2a 7a 53 70 61 63 65      char *zSpace
26240 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  ;.      memcpy(&
26250 70 4e 65 77 2d 3e 62 61 73 65 2c 20 26 76 66 73  pNew->base, &vfs
26260 5f 74 65 6d 70 6c 61 74 65 2c 20 73 69 7a 65 6f  _template, sizeo
26270 66 28 73 71 6c 69 74 65 33 5f 76 66 73 29 29 3b  f(sqlite3_vfs));
26280 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 62 61 73  .      pNew->bas
26290 65 2e 6d 78 50 61 74 68 6e 61 6d 65 20 3d 20 70  e.mxPathname = p
262a0 50 61 72 65 6e 74 2d 3e 6d 78 50 61 74 68 6e 61  Parent->mxPathna
262b0 6d 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  me;.      pNew->
262c0 62 61 73 65 2e 73 7a 4f 73 46 69 6c 65 20 3d 20  base.szOsFile = 
262d0 73 69 7a 65 6f 66 28 72 62 75 5f 66 69 6c 65 29  sizeof(rbu_file)
262e0 20 2b 20 70 50 61 72 65 6e 74 2d 3e 73 7a 4f 73   + pParent->szOs
262f0 46 69 6c 65 3b 0a 20 20 20 20 20 20 70 4e 65 77  File;.      pNew
26300 2d 3e 70 52 65 61 6c 56 66 73 20 3d 20 70 50 61  ->pRealVfs = pPa
26310 72 65 6e 74 3b 0a 20 20 20 20 20 20 70 4e 65 77  rent;.      pNew
26320 2d 3e 62 61 73 65 2e 7a 4e 61 6d 65 20 3d 20 28  ->base.zName = (
26330 63 6f 6e 73 74 20 63 68 61 72 2a 29 28 7a 53 70  const char*)(zSp
26340 61 63 65 20 3d 20 28 63 68 61 72 2a 29 26 70 4e  ace = (char*)&pN
26350 65 77 5b 31 5d 29 3b 0a 20 20 20 20 20 20 6d 65  ew[1]);.      me
26360 6d 63 70 79 28 7a 53 70 61 63 65 2c 20 7a 4e 61  mcpy(zSpace, zNa
26370 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 0a 20 20 20  me, nName);..   
26380 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74     /* Allocate t
26390 68 65 20 6d 75 74 65 78 20 61 6e 64 20 72 65 67  he mutex and reg
263a0 69 73 74 65 72 20 74 68 65 20 6e 65 77 20 56 46  ister the new VF
263b0 53 20 28 6e 6f 74 20 61 73 20 74 68 65 20 64 65  S (not as the de
263c0 66 61 75 6c 74 29 20 2a 2f 0a 20 20 20 20 20 20  fault) */.      
263d0 70 4e 65 77 2d 3e 6d 75 74 65 78 20 3d 20 73 71  pNew->mutex = sq
263e0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f  lite3_mutex_allo
263f0 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 52  c(SQLITE_MUTEX_R
26400 45 43 55 52 53 49 56 45 29 3b 0a 20 20 20 20 20  ECURSIVE);.     
26410 20 69 66 28 20 70 4e 65 77 2d 3e 6d 75 74 65 78   if( pNew->mutex
26420 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
26430 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
26440 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
26450 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
26460 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72  te3_vfs_register
26470 28 26 70 4e 65 77 2d 3e 62 61 73 65 2c 20 30 29  (&pNew->base, 0)
26480 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
26490 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
264a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
264b0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72  sqlite3_mutex_fr
264c0 65 65 28 70 4e 65 77 2d 3e 6d 75 74 65 78 29 3b  ee(pNew->mutex);
264d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
264e0 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 7d  ree(pNew);.    }
264f0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
26500 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66  c;.}../*.** Conf
26510 69 67 75 72 65 20 74 68 65 20 61 67 67 72 65 67  igure the aggreg
26520 61 74 65 20 74 65 6d 70 20 66 69 6c 65 20 73 69  ate temp file si
26530 7a 65 20 6c 69 6d 69 74 20 66 6f 72 20 74 68 69  ze limit for thi
26540 73 20 52 42 55 20 68 61 6e 64 6c 65 2e 0a 2a 2f  s RBU handle..*/
26550 0a 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73  .sqlite3_int64 s
26560 71 6c 69 74 65 33 72 62 75 5f 74 65 6d 70 5f 73  qlite3rbu_temp_s
26570 69 7a 65 5f 6c 69 6d 69 74 28 73 71 6c 69 74 65  ize_limit(sqlite
26580 33 72 62 75 20 2a 70 52 62 75 2c 20 73 71 6c 69  3rbu *pRbu, sqli
26590 74 65 33 5f 69 6e 74 36 34 20 6e 29 7b 0a 20 20  te3_int64 n){.  
265a0 69 66 28 20 6e 3e 3d 30 20 29 7b 0a 20 20 20 20  if( n>=0 ){.    
265b0 70 52 62 75 2d 3e 73 7a 54 65 6d 70 4c 69 6d 69  pRbu->szTempLimi
265c0 74 20 3d 20 6e 3b 0a 20 20 7d 0a 20 20 72 65 74  t = n;.  }.  ret
265d0 75 72 6e 20 70 52 62 75 2d 3e 73 7a 54 65 6d 70  urn pRbu->szTemp
265e0 4c 69 6d 69 74 3b 0a 7d 0a 0a 73 71 6c 69 74 65  Limit;.}..sqlite
265f0 33 5f 69 6e 74 36 34 20 73 71 6c 69 74 65 33 72  3_int64 sqlite3r
26600 62 75 5f 74 65 6d 70 5f 73 69 7a 65 28 73 71 6c  bu_temp_size(sql
26610 69 74 65 33 72 62 75 20 2a 70 52 62 75 29 7b 0a  ite3rbu *pRbu){.
26620 20 20 72 65 74 75 72 6e 20 70 52 62 75 2d 3e 73    return pRbu->s
26630 7a 54 65 6d 70 3b 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a  zTemp;.}.../****
26640 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26650 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26660 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26670 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26680 2a 2a 2a 2a 2a 2a 2f 0a 0a 23 65 6e 64 69 66 20  ******/..#endif 
26690 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
266a0 54 45 5f 43 4f 52 45 29 20 7c 7c 20 64 65 66 69  TE_CORE) || defi
266b0 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
266c0 45 5f 52 42 55 29 20 2a 2f 0a                    E_RBU) */.