/ Hex Artifact Content
Login

Artifact d643661c7c85e79f4d0bc56c73f6f2dd55c35732dd41f378b0fd3b182a33242d:


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 73 74 20 6f 66 20 6d 61 69    /* List of mai
3dd0: 6e 20 64 62 20 66 69 6c 65 73 20 2a 2f 0a 20 20  n db files */.  
3de0: 72 62 75 5f 66 69 6c 65 20 2a 70 4d 61 69 6e 52  rbu_file *pMainR
3df0: 62 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  bu;             
3e00: 2f 2a 20 4c 69 73 74 20 6f 66 20 6d 61 69 6e 20  /* List of main 
3e10: 64 62 20 66 69 6c 65 73 20 77 69 74 68 20 70 52  db files with pR
3e20: 62 75 21 3d 30 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  bu!=0 */.};../*.
3e30: 2a 2a 20 45 61 63 68 20 66 69 6c 65 20 6f 70 65  ** Each file ope
3e40: 6e 65 64 20 62 79 20 61 6e 20 72 62 75 20 56 46  ned by an rbu VF
3e50: 53 20 69 73 20 72 65 70 72 65 73 65 6e 74 65 64  S is represented
3e60: 20 62 79 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   by an instance 
3e70: 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77  of.** the follow
3e80: 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  ing structure..*
3e90: 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20  *.** If this is 
3ea0: 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
3eb0: 20 28 70 52 62 75 21 3d 30 20 26 26 20 66 6c 61   (pRbu!=0 && fla
3ec0: 67 73 26 44 45 4c 45 54 45 5f 4f 4e 5f 43 4c 4f  gs&DELETE_ON_CLO
3ed0: 53 45 29 2c 20 76 61 72 69 61 62 6c 65 0a 2a 2a  SE), variable.**
3ee0: 20 22 73 7a 22 20 69 73 20 73 65 74 20 74 6f 20   "sz" is set to 
3ef0: 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65  the current size
3f00: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
3f10: 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 72 75 63 74   file..*/.struct
3f20: 20 72 62 75 5f 66 69 6c 65 20 7b 0a 20 20 73 71   rbu_file {.  sq
3f30: 6c 69 74 65 33 5f 66 69 6c 65 20 62 61 73 65 3b  lite3_file base;
3f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3f50: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65   sqlite3_file me
3f60: 74 68 6f 64 73 20 2a 2f 0a 20 20 73 71 6c 69 74  thods */.  sqlit
3f70: 65 33 5f 66 69 6c 65 20 2a 70 52 65 61 6c 3b 20  e3_file *pReal; 
3f80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e             /* Un
3f90: 64 65 72 6c 79 69 6e 67 20 66 69 6c 65 20 68 61  derlying file ha
3fa0: 6e 64 6c 65 20 2a 2f 0a 20 20 72 62 75 5f 76 66  ndle */.  rbu_vf
3fb0: 73 20 2a 70 52 62 75 56 66 73 3b 20 20 20 20 20  s *pRbuVfs;     
3fc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
3fd0: 6e 74 65 72 20 74 6f 20 74 68 65 20 72 62 75 5f  nter to the rbu_
3fe0: 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  vfs object */.  
3ff0: 73 71 6c 69 74 65 33 72 62 75 20 2a 70 52 62 75  sqlite3rbu *pRbu
4000: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4010: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 72 62  /* Pointer to rb
4020: 75 20 6f 62 6a 65 63 74 20 28 72 62 75 20 74 61  u object (rbu ta
4030: 72 67 65 74 20 6f 6e 6c 79 29 20 2a 2f 0a 20 20  rget only) */.  
4040: 69 36 34 20 73 7a 3b 20 20 20 20 20 20 20 20 20  i64 sz;         
4050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4060: 2f 2a 20 53 69 7a 65 20 6f 66 20 66 69 6c 65 20  /* Size of file 
4070: 69 6e 20 62 79 74 65 73 20 28 74 65 6d 70 20 6f  in bytes (temp o
4080: 6e 6c 79 29 20 2a 2f 0a 0a 20 20 69 6e 74 20 6f  nly) */..  int o
4090: 70 65 6e 46 6c 61 67 73 3b 20 20 20 20 20 20 20  penFlags;       
40a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
40b0: 61 67 73 20 74 68 69 73 20 66 69 6c 65 20 77 61  ags this file wa
40c0: 73 20 6f 70 65 6e 65 64 20 77 69 74 68 20 2a 2f  s opened with */
40d0: 0a 20 20 75 33 32 20 69 43 6f 6f 6b 69 65 3b 20  .  u32 iCookie; 
40e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
40f0: 20 20 20 2f 2a 20 43 6f 6f 6b 69 65 20 76 61 6c     /* Cookie val
4100: 75 65 20 66 6f 72 20 6d 61 69 6e 20 64 62 20 66  ue for main db f
4110: 69 6c 65 73 20 2a 2f 0a 20 20 75 38 20 69 57 72  iles */.  u8 iWr
4120: 69 74 65 56 65 72 3b 20 20 20 20 20 20 20 20 20  iteVer;         
4130: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 22 77 72            /* "wr
4140: 69 74 65 2d 76 65 72 73 69 6f 6e 22 20 76 61 6c  ite-version" val
4150: 75 65 20 66 6f 72 20 6d 61 69 6e 20 64 62 20 66  ue for main db f
4160: 69 6c 65 73 20 2a 2f 0a 20 20 75 38 20 62 4e 6f  iles */.  u8 bNo
4170: 6c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20  lock;           
4180: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
4190: 65 20 74 6f 20 66 61 69 6c 20 45 58 43 4c 55 53  e to fail EXCLUS
41a0: 49 56 45 20 6c 6f 63 6b 73 20 2a 2f 0a 0a 20 20  IVE locks */..  
41b0: 69 6e 74 20 6e 53 68 6d 3b 20 20 20 20 20 20 20  int nShm;       
41c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
41d0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74  /* Number of ent
41e0: 72 69 65 73 20 69 6e 20 61 70 53 68 6d 5b 5d 20  ries in apShm[] 
41f0: 61 72 72 61 79 20 2a 2f 0a 20 20 63 68 61 72 20  array */.  char 
4200: 2a 2a 61 70 53 68 6d 3b 20 20 20 20 20 20 20 20  **apShm;        
4210: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
4220: 72 61 79 20 6f 66 20 6d 6d 61 70 27 64 20 2a 2d  ray of mmap'd *-
4230: 73 68 6d 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20  shm regions */. 
4240: 20 63 68 61 72 20 2a 7a 44 65 6c 3b 20 20 20 20   char *zDel;    
4250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4260: 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 69 73 20   /* Delete this 
4270: 77 68 65 6e 20 63 6c 6f 73 69 6e 67 20 66 69 6c  when closing fil
4280: 65 20 2a 2f 0a 0a 20 20 63 6f 6e 73 74 20 63 68  e */..  const ch
4290: 61 72 20 2a 7a 57 61 6c 3b 20 20 20 20 20 20 20  ar *zWal;       
42a0: 20 20 20 20 20 20 20 20 2f 2a 20 57 61 6c 20 66          /* Wal f
42b0: 69 6c 65 6e 61 6d 65 20 66 6f 72 20 74 68 69 73  ilename for this
42c0: 20 6d 61 69 6e 20 64 62 20 66 69 6c 65 20 2a 2f   main db file */
42d0: 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 57 61  .  rbu_file *pWa
42e0: 6c 46 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  lFd;            
42f0: 20 20 20 2f 2a 20 57 61 6c 20 66 69 6c 65 20 64     /* Wal file d
4300: 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68  escriptor for th
4310: 69 73 20 6d 61 69 6e 20 64 62 20 2a 2f 0a 20 20  is main db */.  
4320: 72 62 75 5f 66 69 6c 65 20 2a 70 4d 61 69 6e 4e  rbu_file *pMainN
4330: 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ext;            
4340: 2f 2a 20 4e 65 78 74 20 4d 41 49 4e 5f 44 42 20  /* Next MAIN_DB 
4350: 66 69 6c 65 20 2a 2f 0a 20 20 72 62 75 5f 66 69  file */.  rbu_fi
4360: 6c 65 20 2a 70 4d 61 69 6e 52 62 75 4e 65 78 74  le *pMainRbuNext
4370: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78  ;         /* Nex
4380: 74 20 4d 41 49 4e 5f 44 42 20 66 69 6c 65 20 77  t MAIN_DB file w
4390: 69 74 68 20 70 52 62 75 21 3d 30 20 2a 2f 0a 7d  ith pRbu!=0 */.}
43a0: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 65 20 66 6f  ;../*.** True fo
43b0: 72 20 61 6e 20 52 42 55 20 76 61 63 75 75 6d 20  r an RBU vacuum 
43c0: 68 61 6e 64 6c 65 2c 20 6f 72 20 66 61 6c 73 65  handle, or false
43d0: 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 23   otherwise..*/.#
43e0: 64 65 66 69 6e 65 20 72 62 75 49 73 56 61 63 75  define rbuIsVacu
43f0: 75 6d 28 70 29 20 28 28 70 29 2d 3e 7a 54 61 72  um(p) ((p)->zTar
4400: 67 65 74 3d 3d 30 29 0a 0a 0a 2f 2a 2a 2a 2a 2a  get==0).../*****
4410: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4420: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4430: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4440: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4450: 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ****.** The foll
4460: 6f 77 69 6e 67 20 74 68 72 65 65 20 66 75 6e 63  owing three func
4470: 74 69 6f 6e 73 2c 20 66 6f 75 6e 64 20 62 65 6c  tions, found bel
4480: 6f 77 3a 0a 2a 2a 0a 2a 2a 20 20 20 72 62 75 44  ow:.**.**   rbuD
4490: 65 6c 74 61 47 65 74 49 6e 74 28 29 0a 2a 2a 20  eltaGetInt().** 
44a0: 20 20 72 62 75 44 65 6c 74 61 43 68 65 63 6b 73    rbuDeltaChecks
44b0: 75 6d 28 29 0a 2a 2a 20 20 20 72 62 75 44 65 6c  um().**   rbuDel
44c0: 74 61 41 70 70 6c 79 28 29 0a 2a 2a 0a 2a 2a 20  taApply().**.** 
44d0: 61 72 65 20 6c 69 66 74 65 64 20 66 72 6f 6d 20  are lifted from 
44e0: 74 68 65 20 66 6f 73 73 69 6c 20 73 6f 75 72 63  the fossil sourc
44f0: 65 20 63 6f 64 65 20 28 68 74 74 70 3a 2f 2f 66  e code (http://f
4500: 6f 73 73 69 6c 2d 73 63 6d 2e 6f 72 67 29 2e 20  ossil-scm.org). 
4510: 54 68 65 79 0a 2a 2a 20 61 72 65 20 75 73 65 64  They.** are used
4520: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68   to implement th
4530: 65 20 73 63 61 6c 61 72 20 53 51 4c 20 66 75 6e  e scalar SQL fun
4540: 63 74 69 6f 6e 20 72 62 75 5f 66 6f 73 73 69 6c  ction rbu_fossil
4550: 5f 64 65 6c 74 61 28 29 2e 0a 2a 2f 0a 0a 2f 2a  _delta()..*/../*
4560: 0a 2a 2a 20 52 65 61 64 20 62 79 74 65 73 20 66  .** Read bytes f
4570: 72 6f 6d 20 2a 70 7a 20 61 6e 64 20 63 6f 6e 76  rom *pz and conv
4580: 65 72 74 20 74 68 65 6d 20 69 6e 74 6f 20 61 20  ert them into a 
4590: 70 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65 72  positive integer
45a0: 2e 20 20 57 68 65 6e 0a 2a 2a 20 66 69 6e 69 73  .  When.** finis
45b0: 68 65 64 2c 20 6c 65 61 76 65 20 2a 70 7a 20 70  hed, leave *pz p
45c0: 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 66  ointing to the f
45d0: 69 72 73 74 20 63 68 61 72 61 63 74 65 72 20 70  irst character p
45e0: 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 0a 2a  ast the end of.*
45f0: 2a 20 74 68 65 20 69 6e 74 65 67 65 72 2e 20 20  * the integer.  
4600: 54 68 65 20 2a 70 4c 65 6e 20 70 61 72 61 6d 65  The *pLen parame
4610: 74 65 72 20 68 6f 6c 64 73 20 74 68 65 20 6c 65  ter holds the le
4620: 6e 67 74 68 20 6f 66 20 74 68 65 20 73 74 72 69  ngth of the stri
4630: 6e 67 0a 2a 2a 20 69 6e 20 2a 70 7a 20 61 6e 64  ng.** in *pz and
4640: 20 69 73 20 64 65 63 72 65 6d 65 6e 74 65 64 20   is decremented 
4650: 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 63 68  once for each ch
4660: 61 72 61 63 74 65 72 20 69 6e 20 74 68 65 20 69  aracter in the i
4670: 6e 74 65 67 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  nteger..*/.stati
4680: 63 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 72  c unsigned int r
4690: 62 75 44 65 6c 74 61 47 65 74 49 6e 74 28 63 6f  buDeltaGetInt(co
46a0: 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 2c 20 69  nst char **pz, i
46b0: 6e 74 20 2a 70 4c 65 6e 29 7b 0a 20 20 73 74 61  nt *pLen){.  sta
46c0: 74 69 63 20 63 6f 6e 73 74 20 73 69 67 6e 65 64  tic const signed
46d0: 20 63 68 61 72 20 7a 56 61 6c 75 65 5b 5d 20 3d   char zValue[] =
46e0: 20 7b 0a 20 20 20 20 2d 31 2c 20 2d 31 2c 20 2d   {.    -1, -1, -
46f0: 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d  1, -1, -1, -1, -
4700: 31 2c 20 2d 31 2c 20 20 20 2d 31 2c 20 2d 31 2c  1, -1,   -1, -1,
4710: 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c   -1, -1, -1, -1,
4720: 20 2d 31 2c 20 2d 31 2c 0a 20 20 20 20 2d 31 2c   -1, -1,.    -1,
4730: 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c   -1, -1, -1, -1,
4740: 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 20 20 2d   -1, -1, -1,   -
4750: 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d  1, -1, -1, -1, -
4760: 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 0a 20  1, -1, -1, -1,. 
4770: 20 20 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d     -1, -1, -1, -
4780: 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d  1, -1, -1, -1, -
4790: 31 2c 20 20 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c  1,   -1, -1, -1,
47a0: 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c   -1, -1, -1, -1,
47b0: 20 2d 31 2c 0a 20 20 20 20 20 30 2c 20 20 31 2c   -1,.     0,  1,
47c0: 20 20 32 2c 20 20 33 2c 20 20 34 2c 20 20 35 2c    2,  3,  4,  5,
47d0: 20 20 36 2c 20 20 37 2c 20 20 20 20 38 2c 20 20    6,  7,    8,  
47e0: 39 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d  9, -1, -1, -1, -
47f0: 31 2c 20 2d 31 2c 20 2d 31 2c 0a 20 20 20 20 2d  1, -1, -1,.    -
4800: 31 2c 20 31 30 2c 20 31 31 2c 20 31 32 2c 20 31  1, 10, 11, 12, 1
4810: 33 2c 20 31 34 2c 20 31 35 2c 20 31 36 2c 20 20  3, 14, 15, 16,  
4820: 20 31 37 2c 20 31 38 2c 20 31 39 2c 20 32 30 2c   17, 18, 19, 20,
4830: 20 32 31 2c 20 32 32 2c 20 32 33 2c 20 32 34 2c   21, 22, 23, 24,
4840: 0a 20 20 20 20 32 35 2c 20 32 36 2c 20 32 37 2c  .    25, 26, 27,
4850: 20 32 38 2c 20 32 39 2c 20 33 30 2c 20 33 31 2c   28, 29, 30, 31,
4860: 20 33 32 2c 20 20 20 33 33 2c 20 33 34 2c 20 33   32,   33, 34, 3
4870: 35 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d  5, -1, -1, -1, -
4880: 31 2c 20 33 36 2c 0a 20 20 20 20 2d 31 2c 20 33  1, 36,.    -1, 3
4890: 37 2c 20 33 38 2c 20 33 39 2c 20 34 30 2c 20 34  7, 38, 39, 40, 4
48a0: 31 2c 20 34 32 2c 20 34 33 2c 20 20 20 34 34 2c  1, 42, 43,   44,
48b0: 20 34 35 2c 20 34 36 2c 20 34 37 2c 20 34 38 2c   45, 46, 47, 48,
48c0: 20 34 39 2c 20 35 30 2c 20 35 31 2c 0a 20 20 20   49, 50, 51,.   
48d0: 20 35 32 2c 20 35 33 2c 20 35 34 2c 20 35 35 2c   52, 53, 54, 55,
48e0: 20 35 36 2c 20 35 37 2c 20 35 38 2c 20 35 39 2c   56, 57, 58, 59,
48f0: 20 20 20 36 30 2c 20 36 31 2c 20 36 32 2c 20 2d     60, 61, 62, -
4900: 31 2c 20 2d 31 2c 20 2d 31 2c 20 36 33 2c 20 2d  1, -1, -1, 63, -
4910: 31 2c 0a 20 20 7d 3b 0a 20 20 75 6e 73 69 67 6e  1,.  };.  unsign
4920: 65 64 20 69 6e 74 20 76 20 3d 20 30 3b 0a 20 20  ed int v = 0;.  
4930: 69 6e 74 20 63 3b 0a 20 20 75 6e 73 69 67 6e 65  int c;.  unsigne
4940: 64 20 63 68 61 72 20 2a 7a 20 3d 20 28 75 6e 73  d char *z = (uns
4950: 69 67 6e 65 64 20 63 68 61 72 2a 29 2a 70 7a 3b  igned char*)*pz;
4960: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
4970: 20 2a 7a 53 74 61 72 74 20 3d 20 7a 3b 0a 20 20   *zStart = z;.  
4980: 77 68 69 6c 65 28 20 28 63 20 3d 20 7a 56 61 6c  while( (c = zVal
4990: 75 65 5b 30 78 37 66 26 2a 28 7a 2b 2b 29 5d 29  ue[0x7f&*(z++)])
49a0: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 76 20 3d 20  >=0 ){.     v = 
49b0: 28 76 3c 3c 36 29 20 2b 20 63 3b 0a 20 20 7d 0a  (v<<6) + c;.  }.
49c0: 20 20 7a 2d 2d 3b 0a 20 20 2a 70 4c 65 6e 20 2d    z--;.  *pLen -
49d0: 3d 20 7a 20 2d 20 7a 53 74 61 72 74 3b 0a 20 20  = z - zStart;.  
49e0: 2a 70 7a 20 3d 20 28 63 68 61 72 2a 29 7a 3b 0a  *pz = (char*)z;.
49f0: 20 20 72 65 74 75 72 6e 20 76 3b 0a 7d 0a 0a 23    return v;.}..#
4a00: 69 66 20 52 42 55 5f 45 4e 41 42 4c 45 5f 44 45  if RBU_ENABLE_DE
4a10: 4c 54 41 5f 43 4b 53 55 4d 0a 2f 2a 0a 2a 2a 20  LTA_CKSUM./*.** 
4a20: 43 6f 6d 70 75 74 65 20 61 20 33 32 2d 62 69 74  Compute a 32-bit
4a30: 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20 74 68 65   checksum on the
4a40: 20 4e 2d 62 79 74 65 20 62 75 66 66 65 72 2e 20   N-byte buffer. 
4a50: 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75   Return the resu
4a60: 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 6e  lt..*/.static un
4a70: 73 69 67 6e 65 64 20 69 6e 74 20 72 62 75 44 65  signed int rbuDe
4a80: 6c 74 61 43 68 65 63 6b 73 75 6d 28 63 6f 6e 73  ltaChecksum(cons
4a90: 74 20 63 68 61 72 20 2a 7a 49 6e 2c 20 73 69 7a  t char *zIn, siz
4aa0: 65 5f 74 20 4e 29 7b 0a 20 20 63 6f 6e 73 74 20  e_t N){.  const 
4ab0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
4ac0: 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e   = (const unsign
4ad0: 65 64 20 63 68 61 72 20 2a 29 7a 49 6e 3b 0a 20  ed char *)zIn;. 
4ae0: 20 75 6e 73 69 67 6e 65 64 20 73 75 6d 30 20 3d   unsigned sum0 =
4af0: 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 73   0;.  unsigned s
4b00: 75 6d 31 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67  um1 = 0;.  unsig
4b10: 6e 65 64 20 73 75 6d 32 20 3d 20 30 3b 0a 20 20  ned sum2 = 0;.  
4b20: 75 6e 73 69 67 6e 65 64 20 73 75 6d 33 20 3d 20  unsigned sum3 = 
4b30: 30 3b 0a 20 20 77 68 69 6c 65 28 4e 20 3e 3d 20  0;.  while(N >= 
4b40: 31 36 29 7b 0a 20 20 20 20 73 75 6d 30 20 2b 3d  16){.    sum0 +=
4b50: 20 28 28 75 6e 73 69 67 6e 65 64 29 7a 5b 30 5d   ((unsigned)z[0]
4b60: 20 2b 20 7a 5b 34 5d 20 2b 20 7a 5b 38 5d 20 2b   + z[4] + z[8] +
4b70: 20 7a 5b 31 32 5d 29 3b 0a 20 20 20 20 73 75 6d   z[12]);.    sum
4b80: 31 20 2b 3d 20 28 28 75 6e 73 69 67 6e 65 64 29  1 += ((unsigned)
4b90: 7a 5b 31 5d 20 2b 20 7a 5b 35 5d 20 2b 20 7a 5b  z[1] + z[5] + z[
4ba0: 39 5d 20 2b 20 7a 5b 31 33 5d 29 3b 0a 20 20 20  9] + z[13]);.   
4bb0: 20 73 75 6d 32 20 2b 3d 20 28 28 75 6e 73 69 67   sum2 += ((unsig
4bc0: 6e 65 64 29 7a 5b 32 5d 20 2b 20 7a 5b 36 5d 20  ned)z[2] + z[6] 
4bd0: 2b 20 7a 5b 31 30 5d 2b 20 7a 5b 31 34 5d 29 3b  + z[10]+ z[14]);
4be0: 0a 20 20 20 20 73 75 6d 33 20 2b 3d 20 28 28 75  .    sum3 += ((u
4bf0: 6e 73 69 67 6e 65 64 29 7a 5b 33 5d 20 2b 20 7a  nsigned)z[3] + z
4c00: 5b 37 5d 20 2b 20 7a 5b 31 31 5d 2b 20 7a 5b 31  [7] + z[11]+ z[1
4c10: 35 5d 29 3b 0a 20 20 20 20 7a 20 2b 3d 20 31 36  5]);.    z += 16
4c20: 3b 0a 20 20 20 20 4e 20 2d 3d 20 31 36 3b 0a 20  ;.    N -= 16;. 
4c30: 20 7d 0a 20 20 77 68 69 6c 65 28 4e 20 3e 3d 20   }.  while(N >= 
4c40: 34 29 7b 0a 20 20 20 20 73 75 6d 30 20 2b 3d 20  4){.    sum0 += 
4c50: 7a 5b 30 5d 3b 0a 20 20 20 20 73 75 6d 31 20 2b  z[0];.    sum1 +
4c60: 3d 20 7a 5b 31 5d 3b 0a 20 20 20 20 73 75 6d 32  = z[1];.    sum2
4c70: 20 2b 3d 20 7a 5b 32 5d 3b 0a 20 20 20 20 73 75   += z[2];.    su
4c80: 6d 33 20 2b 3d 20 7a 5b 33 5d 3b 0a 20 20 20 20  m3 += z[3];.    
4c90: 7a 20 2b 3d 20 34 3b 0a 20 20 20 20 4e 20 2d 3d  z += 4;.    N -=
4ca0: 20 34 3b 0a 20 20 7d 0a 20 20 73 75 6d 33 20 2b   4;.  }.  sum3 +
4cb0: 3d 20 28 73 75 6d 32 20 3c 3c 20 38 29 20 2b 20  = (sum2 << 8) + 
4cc0: 28 73 75 6d 31 20 3c 3c 20 31 36 29 20 2b 20 28  (sum1 << 16) + (
4cd0: 73 75 6d 30 20 3c 3c 20 32 34 29 3b 0a 20 20 73  sum0 << 24);.  s
4ce0: 77 69 74 63 68 28 4e 29 7b 0a 20 20 20 20 63 61  witch(N){.    ca
4cf0: 73 65 20 33 3a 20 20 20 73 75 6d 33 20 2b 3d 20  se 3:   sum3 += 
4d00: 28 7a 5b 32 5d 20 3c 3c 20 38 29 3b 0a 20 20 20  (z[2] << 8);.   
4d10: 20 63 61 73 65 20 32 3a 20 20 20 73 75 6d 33 20   case 2:   sum3 
4d20: 2b 3d 20 28 7a 5b 31 5d 20 3c 3c 20 31 36 29 3b  += (z[1] << 16);
4d30: 0a 20 20 20 20 63 61 73 65 20 31 3a 20 20 20 73  .    case 1:   s
4d40: 75 6d 33 20 2b 3d 20 28 7a 5b 30 5d 20 3c 3c 20  um3 += (z[0] << 
4d50: 32 34 29 3b 0a 20 20 20 20 64 65 66 61 75 6c 74  24);.    default
4d60: 3a 20 20 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  :  ;.  }.  retur
4d70: 6e 20 73 75 6d 33 3b 0a 7d 0a 23 65 6e 64 69 66  n sum3;.}.#endif
4d80: 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 6c 79 20 61 20  ../*.** Apply a 
4d90: 64 65 6c 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  delta..**.** The
4da0: 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 73   output buffer s
4db0: 68 6f 75 6c 64 20 62 65 20 62 69 67 20 65 6e 6f  hould be big eno
4dc0: 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ugh to hold the 
4dd0: 77 68 6f 6c 65 20 6f 75 74 70 75 74 0a 2a 2a 20  whole output.** 
4de0: 66 69 6c 65 20 61 6e 64 20 61 20 4e 55 4c 20 74  file and a NUL t
4df0: 65 72 6d 69 6e 61 74 6f 72 20 61 74 20 74 68 65  erminator at the
4e00: 20 65 6e 64 2e 20 20 54 68 65 20 64 65 6c 74 61   end.  The delta
4e10: 5f 6f 75 74 70 75 74 5f 73 69 7a 65 28 29 0a 2a  _output_size().*
4e20: 2a 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64  * routine will d
4e30: 65 74 65 72 6d 69 6e 65 20 74 68 69 73 20 73 69  etermine this si
4e40: 7a 65 20 66 6f 72 20 79 6f 75 2e 0a 2a 2a 0a 2a  ze for you..**.*
4e50: 2a 20 54 68 65 20 64 65 6c 74 61 20 73 74 72 69  * The delta stri
4e60: 6e 67 20 73 68 6f 75 6c 64 20 62 65 20 6e 75 6c  ng should be nul
4e70: 6c 2d 74 65 72 6d 69 6e 61 74 65 64 2e 20 20 42  l-terminated.  B
4e80: 75 74 20 74 68 65 20 64 65 6c 74 61 20 73 74 72  ut the delta str
4e90: 69 6e 67 0a 2a 2a 20 6d 61 79 20 63 6f 6e 74 61  ing.** may conta
4ea0: 69 6e 20 65 6d 62 65 64 64 65 64 20 4e 55 4c 20  in embedded NUL 
4eb0: 63 68 61 72 61 63 74 65 72 73 20 28 69 66 20 74  characters (if t
4ec0: 68 65 20 69 6e 70 75 74 20 61 6e 64 20 6f 75 74  he input and out
4ed0: 70 75 74 20 61 72 65 0a 2a 2a 20 62 69 6e 61 72  put are.** binar
4ee0: 79 20 66 69 6c 65 73 29 20 73 6f 20 77 65 20 61  y files) so we a
4ef0: 6c 73 6f 20 68 61 76 65 20 74 6f 20 70 61 73 73  lso have to pass
4f00: 20 69 6e 20 74 68 65 20 6c 65 6e 67 74 68 20 6f   in the length o
4f10: 66 20 74 68 65 20 64 65 6c 74 61 20 69 6e 0a 2a  f the delta in.*
4f20: 2a 20 74 68 65 20 6c 65 6e 44 65 6c 74 61 20 70  * the lenDelta p
4f30: 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  arameter..**.** 
4f40: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
4f50: 74 75 72 6e 73 20 74 68 65 20 73 69 7a 65 20 6f  turns the size o
4f60: 66 20 74 68 65 20 6f 75 74 70 75 74 20 66 69 6c  f the output fil
4f70: 65 20 69 6e 20 62 79 74 65 73 20 28 65 78 63 6c  e in bytes (excl
4f80: 75 64 69 6e 67 0a 2a 2a 20 74 68 65 20 66 69 6e  uding.** the fin
4f90: 61 6c 20 4e 55 4c 20 74 65 72 6d 69 6e 61 74 6f  al NUL terminato
4fa0: 72 20 63 68 61 72 61 63 74 65 72 29 2e 20 20 45  r character).  E
4fb0: 78 63 65 70 74 2c 20 69 66 20 74 68 65 20 64 65  xcept, if the de
4fc0: 6c 74 61 20 73 74 72 69 6e 67 20 69 73 0a 2a 2a  lta string is.**
4fd0: 20 6d 61 6c 66 6f 72 6d 65 64 20 6f 72 20 69 6e   malformed or in
4fe0: 74 65 6e 64 65 64 20 66 6f 72 20 75 73 65 20 77  tended for use w
4ff0: 69 74 68 20 61 20 73 6f 75 72 63 65 20 66 69 6c  ith a source fil
5000: 65 20 6f 74 68 65 72 20 74 68 61 6e 20 7a 53 72  e other than zSr
5010: 63 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73 20  c,.** then this 
5020: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
5030: 2d 31 2e 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72 20  -1..**.** Refer 
5040: 74 6f 20 74 68 65 20 64 65 6c 74 61 5f 63 72 65  to the delta_cre
5050: 61 74 65 28 29 20 64 6f 63 75 6d 65 6e 74 61 74  ate() documentat
5060: 69 6f 6e 20 61 62 6f 76 65 20 66 6f 72 20 61 20  ion above for a 
5070: 64 65 73 63 72 69 70 74 69 6f 6e 0a 2a 2a 20 6f  description.** o
5080: 66 20 74 68 65 20 64 65 6c 74 61 20 66 69 6c 65  f the delta file
5090: 20 66 6f 72 6d 61 74 2e 0a 2a 2f 0a 73 74 61 74   format..*/.stat
50a0: 69 63 20 69 6e 74 20 72 62 75 44 65 6c 74 61 41  ic int rbuDeltaA
50b0: 70 70 6c 79 28 0a 20 20 63 6f 6e 73 74 20 63 68  pply(.  const ch
50c0: 61 72 20 2a 7a 53 72 63 2c 20 20 20 20 20 20 2f  ar *zSrc,      /
50d0: 2a 20 54 68 65 20 73 6f 75 72 63 65 20 6f 72 20  * The source or 
50e0: 70 61 74 74 65 72 6e 20 66 69 6c 65 20 2a 2f 0a  pattern file */.
50f0: 20 20 69 6e 74 20 6c 65 6e 53 72 63 2c 20 20 20    int lenSrc,   
5100: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67           /* Leng
5110: 74 68 20 6f 66 20 74 68 65 20 73 6f 75 72 63 65  th of the source
5120: 20 66 69 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74   file */.  const
5130: 20 63 68 61 72 20 2a 7a 44 65 6c 74 61 2c 20 20   char *zDelta,  
5140: 20 20 2f 2a 20 44 65 6c 74 61 20 74 6f 20 61 70    /* Delta to ap
5150: 70 6c 79 20 74 6f 20 74 68 65 20 70 61 74 74 65  ply to the patte
5160: 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 6e 44  rn */.  int lenD
5170: 65 6c 74 61 2c 20 20 20 20 20 20 20 20 20 20 2f  elta,          /
5180: 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20  * Length of the 
5190: 64 65 6c 74 61 20 2a 2f 0a 20 20 63 68 61 72 20  delta */.  char 
51a0: 2a 7a 4f 75 74 20 20 20 20 20 20 20 20 20 20 20  *zOut           
51b0: 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6f    /* Write the o
51c0: 75 74 70 75 74 20 69 6e 74 6f 20 74 68 69 73 20  utput into this 
51d0: 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 62 75 66  preallocated buf
51e0: 66 65 72 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69  fer */.){.  unsi
51f0: 67 6e 65 64 20 69 6e 74 20 6c 69 6d 69 74 3b 0a  gned int limit;.
5200: 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 74    unsigned int t
5210: 6f 74 61 6c 20 3d 20 30 3b 0a 23 69 66 20 52 42  otal = 0;.#if RB
5220: 55 5f 45 4e 41 42 4c 45 5f 44 45 4c 54 41 5f 43  U_ENABLE_DELTA_C
5230: 4b 53 55 4d 0a 20 20 63 68 61 72 20 2a 7a 4f 72  KSUM.  char *zOr
5240: 69 67 4f 75 74 20 3d 20 7a 4f 75 74 3b 0a 23 65  igOut = zOut;.#e
5250: 6e 64 69 66 0a 0a 20 20 6c 69 6d 69 74 20 3d 20  ndif..  limit = 
5260: 72 62 75 44 65 6c 74 61 47 65 74 49 6e 74 28 26  rbuDeltaGetInt(&
5270: 7a 44 65 6c 74 61 2c 20 26 6c 65 6e 44 65 6c 74  zDelta, &lenDelt
5280: 61 29 3b 0a 20 20 69 66 28 20 2a 7a 44 65 6c 74  a);.  if( *zDelt
5290: 61 21 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 2f  a!='\n' ){.    /
52a0: 2a 20 45 52 52 4f 52 3a 20 73 69 7a 65 20 69 6e  * ERROR: size in
52b0: 74 65 67 65 72 20 6e 6f 74 20 74 65 72 6d 69 6e  teger not termin
52c0: 61 74 65 64 20 62 79 20 22 5c 6e 22 20 2a 2f 0a  ated by "\n" */.
52d0: 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
52e0: 20 7d 0a 20 20 7a 44 65 6c 74 61 2b 2b 3b 20 6c   }.  zDelta++; l
52f0: 65 6e 44 65 6c 74 61 2d 2d 3b 0a 20 20 77 68 69  enDelta--;.  whi
5300: 6c 65 28 20 2a 7a 44 65 6c 74 61 20 26 26 20 6c  le( *zDelta && l
5310: 65 6e 44 65 6c 74 61 3e 30 20 29 7b 0a 20 20 20  enDelta>0 ){.   
5320: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 63 6e   unsigned int cn
5330: 74 2c 20 6f 66 73 74 3b 0a 20 20 20 20 63 6e 74  t, ofst;.    cnt
5340: 20 3d 20 72 62 75 44 65 6c 74 61 47 65 74 49 6e   = rbuDeltaGetIn
5350: 74 28 26 7a 44 65 6c 74 61 2c 20 26 6c 65 6e 44  t(&zDelta, &lenD
5360: 65 6c 74 61 29 3b 0a 20 20 20 20 73 77 69 74 63  elta);.    switc
5370: 68 28 20 7a 44 65 6c 74 61 5b 30 5d 20 29 7b 0a  h( zDelta[0] ){.
5380: 20 20 20 20 20 20 63 61 73 65 20 27 40 27 3a 20        case '@': 
5390: 7b 0a 20 20 20 20 20 20 20 20 7a 44 65 6c 74 61  {.        zDelta
53a0: 2b 2b 3b 20 6c 65 6e 44 65 6c 74 61 2d 2d 3b 0a  ++; lenDelta--;.
53b0: 20 20 20 20 20 20 20 20 6f 66 73 74 20 3d 20 72          ofst = r
53c0: 62 75 44 65 6c 74 61 47 65 74 49 6e 74 28 26 7a  buDeltaGetInt(&z
53d0: 44 65 6c 74 61 2c 20 26 6c 65 6e 44 65 6c 74 61  Delta, &lenDelta
53e0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c  );.        if( l
53f0: 65 6e 44 65 6c 74 61 3e 30 20 26 26 20 7a 44 65  enDelta>0 && zDe
5400: 6c 74 61 5b 30 5d 21 3d 27 2c 27 20 29 7b 0a 20  lta[0]!=',' ){. 
5410: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 52 52 4f           /* ERRO
5420: 52 3a 20 63 6f 70 79 20 63 6f 6d 6d 61 6e 64 20  R: copy command 
5430: 6e 6f 74 20 74 65 72 6d 69 6e 61 74 65 64 20 62  not terminated b
5440: 79 20 27 2c 27 20 2a 2f 0a 20 20 20 20 20 20 20  y ',' */.       
5450: 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
5460: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
5470: 7a 44 65 6c 74 61 2b 2b 3b 20 6c 65 6e 44 65 6c  zDelta++; lenDel
5480: 74 61 2d 2d 3b 0a 20 20 20 20 20 20 20 20 74 6f  ta--;.        to
5490: 74 61 6c 20 2b 3d 20 63 6e 74 3b 0a 20 20 20 20  tal += cnt;.    
54a0: 20 20 20 20 69 66 28 20 74 6f 74 61 6c 3e 6c 69      if( total>li
54b0: 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  mit ){.         
54c0: 20 2f 2a 20 45 52 52 4f 52 3a 20 63 6f 70 79 20   /* ERROR: copy 
54d0: 65 78 63 65 65 64 73 20 6f 75 74 70 75 74 20 66  exceeds output f
54e0: 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20  ile size */.    
54f0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b        return -1;
5500: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5510: 20 20 20 69 66 28 20 28 69 6e 74 29 28 6f 66 73     if( (int)(ofs
5520: 74 2b 63 6e 74 29 20 3e 20 6c 65 6e 53 72 63 20  t+cnt) > lenSrc 
5530: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
5540: 45 52 52 4f 52 3a 20 63 6f 70 79 20 65 78 74 65  ERROR: copy exte
5550: 6e 64 73 20 70 61 73 74 20 65 6e 64 20 6f 66 20  nds past end of 
5560: 69 6e 70 75 74 20 2a 2f 0a 20 20 20 20 20 20 20  input */.       
5570: 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
5580: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
5590: 6d 65 6d 63 70 79 28 7a 4f 75 74 2c 20 26 7a 53  memcpy(zOut, &zS
55a0: 72 63 5b 6f 66 73 74 5d 2c 20 63 6e 74 29 3b 0a  rc[ofst], cnt);.
55b0: 20 20 20 20 20 20 20 20 7a 4f 75 74 20 2b 3d 20          zOut += 
55c0: 63 6e 74 3b 0a 20 20 20 20 20 20 20 20 62 72 65  cnt;.        bre
55d0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
55e0: 20 20 63 61 73 65 20 27 3a 27 3a 20 7b 0a 20 20    case ':': {.  
55f0: 20 20 20 20 20 20 7a 44 65 6c 74 61 2b 2b 3b 20        zDelta++; 
5600: 6c 65 6e 44 65 6c 74 61 2d 2d 3b 0a 20 20 20 20  lenDelta--;.    
5610: 20 20 20 20 74 6f 74 61 6c 20 2b 3d 20 63 6e 74      total += cnt
5620: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 74 6f  ;.        if( to
5630: 74 61 6c 3e 6c 69 6d 69 74 20 29 7b 0a 20 20 20  tal>limit ){.   
5640: 20 20 20 20 20 20 20 2f 2a 20 45 52 52 4f 52 3a         /* ERROR:
5650: 20 20 69 6e 73 65 72 74 20 63 6f 6d 6d 61 6e 64    insert command
5660: 20 67 69 76 65 73 20 61 6e 20 6f 75 74 70 75 74   gives an output
5670: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 70 72 65   larger than pre
5680: 64 69 63 74 65 64 20 2a 2f 0a 20 20 20 20 20 20  dicted */.      
5690: 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
56a0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
56b0: 20 69 66 28 20 28 69 6e 74 29 63 6e 74 3e 6c 65   if( (int)cnt>le
56c0: 6e 44 65 6c 74 61 20 29 7b 0a 20 20 20 20 20 20  nDelta ){.      
56d0: 20 20 20 20 2f 2a 20 45 52 52 4f 52 3a 20 69 6e      /* ERROR: in
56e0: 73 65 72 74 20 63 6f 75 6e 74 20 65 78 63 65 65  sert count excee
56f0: 64 73 20 73 69 7a 65 20 6f 66 20 64 65 6c 74 61  ds size of delta
5700: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 65   */.          re
5710: 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 20  turn -1;.       
5720: 20 7d 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70   }.        memcp
5730: 79 28 7a 4f 75 74 2c 20 7a 44 65 6c 74 61 2c 20  y(zOut, zDelta, 
5740: 63 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 7a 4f  cnt);.        zO
5750: 75 74 20 2b 3d 20 63 6e 74 3b 0a 20 20 20 20 20  ut += cnt;.     
5760: 20 20 20 7a 44 65 6c 74 61 20 2b 3d 20 63 6e 74     zDelta += cnt
5770: 3b 0a 20 20 20 20 20 20 20 20 6c 65 6e 44 65 6c  ;.        lenDel
5780: 74 61 20 2d 3d 20 63 6e 74 3b 0a 20 20 20 20 20  ta -= cnt;.     
5790: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
57a0: 7d 0a 20 20 20 20 20 20 63 61 73 65 20 27 3b 27  }.      case ';'
57b0: 3a 20 7b 0a 20 20 20 20 20 20 20 20 7a 44 65 6c  : {.        zDel
57c0: 74 61 2b 2b 3b 20 6c 65 6e 44 65 6c 74 61 2d 2d  ta++; lenDelta--
57d0: 3b 0a 20 20 20 20 20 20 20 20 7a 4f 75 74 5b 30  ;.        zOut[0
57e0: 5d 20 3d 20 30 3b 0a 23 69 66 20 52 42 55 5f 45  ] = 0;.#if RBU_E
57f0: 4e 41 42 4c 45 5f 44 45 4c 54 41 5f 43 4b 53 55  NABLE_DELTA_CKSU
5800: 4d 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 6e  M.        if( cn
5810: 74 21 3d 72 62 75 44 65 6c 74 61 43 68 65 63 6b  t!=rbuDeltaCheck
5820: 73 75 6d 28 7a 4f 72 69 67 4f 75 74 2c 20 74 6f  sum(zOrigOut, to
5830: 74 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  tal) ){.        
5840: 20 20 2f 2a 20 45 52 52 4f 52 3a 20 20 62 61 64    /* ERROR:  bad
5850: 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 20   checksum */.   
5860: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31         return -1
5870: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64  ;.        }.#end
5880: 69 66 0a 20 20 20 20 20 20 20 20 69 66 28 20 74  if.        if( t
5890: 6f 74 61 6c 21 3d 6c 69 6d 69 74 20 29 7b 0a 20  otal!=limit ){. 
58a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 52 52 4f           /* ERRO
58b0: 52 3a 20 67 65 6e 65 72 61 74 65 64 20 73 69 7a  R: generated siz
58c0: 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  e does not match
58d0: 20 70 72 65 64 69 63 74 65 64 20 73 69 7a 65 20   predicted size 
58e0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  */.          ret
58f0: 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  urn -1;.        
5900: 7d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  }.        return
5910: 20 74 6f 74 61 6c 3b 0a 20 20 20 20 20 20 7d 0a   total;.      }.
5920: 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b        default: {
5930: 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 52 52 4f  .        /* ERRO
5940: 52 3a 20 75 6e 6b 6e 6f 77 6e 20 64 65 6c 74 61  R: unknown delta
5950: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20   operator */.   
5960: 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a       return -1;.
5970: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
5980: 7d 0a 20 20 2f 2a 20 45 52 52 4f 52 3a 20 75 6e  }.  /* ERROR: un
5990: 74 65 72 6d 69 6e 61 74 65 64 20 64 65 6c 74 61  terminated delta
59a0: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b   */.  return -1;
59b0: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .}..static int r
59c0: 62 75 44 65 6c 74 61 4f 75 74 70 75 74 53 69 7a  buDeltaOutputSiz
59d0: 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44  e(const char *zD
59e0: 65 6c 74 61 2c 20 69 6e 74 20 6c 65 6e 44 65 6c  elta, int lenDel
59f0: 74 61 29 7b 0a 20 20 69 6e 74 20 73 69 7a 65 3b  ta){.  int size;
5a00: 0a 20 20 73 69 7a 65 20 3d 20 72 62 75 44 65 6c  .  size = rbuDel
5a10: 74 61 47 65 74 49 6e 74 28 26 7a 44 65 6c 74 61  taGetInt(&zDelta
5a20: 2c 20 26 6c 65 6e 44 65 6c 74 61 29 3b 0a 20 20  , &lenDelta);.  
5a30: 69 66 28 20 2a 7a 44 65 6c 74 61 21 3d 27 5c 6e  if( *zDelta!='\n
5a40: 27 20 29 7b 0a 20 20 20 20 2f 2a 20 45 52 52 4f  ' ){.    /* ERRO
5a50: 52 3a 20 73 69 7a 65 20 69 6e 74 65 67 65 72 20  R: size integer 
5a60: 6e 6f 74 20 74 65 72 6d 69 6e 61 74 65 64 20 62  not terminated b
5a70: 79 20 22 5c 6e 22 20 2a 2f 0a 20 20 20 20 72 65  y "\n" */.    re
5a80: 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 72  turn -1;.  }.  r
5a90: 65 74 75 72 6e 20 73 69 7a 65 3b 0a 7d 0a 0a 2f  eturn size;.}../
5aa0: 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20 63 6f 64 65  *.** End of code
5ab0: 20 74 61 6b 65 6e 20 66 72 6f 6d 20 66 6f 73 73   taken from foss
5ac0: 69 6c 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  il..************
5ad0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5ae0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5af0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5b00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
5b10: 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
5b20: 74 69 6f 6e 20 6f 66 20 53 51 4c 20 73 63 61 6c  tion of SQL scal
5b30: 61 72 20 66 75 6e 63 74 69 6f 6e 20 72 62 75 5f  ar function rbu_
5b40: 66 6f 73 73 69 6c 5f 64 65 6c 74 61 28 29 2e 0a  fossil_delta()..
5b50: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
5b60: 69 6f 6e 20 61 70 70 6c 69 65 73 20 61 20 66 6f  ion applies a fo
5b70: 73 73 69 6c 20 64 65 6c 74 61 20 70 61 74 63 68  ssil delta patch
5b80: 20 74 6f 20 61 20 62 6c 6f 62 2e 20 45 78 61 63   to a blob. Exac
5b90: 74 6c 79 20 74 77 6f 0a 2a 2a 20 61 72 67 75 6d  tly two.** argum
5ba0: 65 6e 74 73 20 6d 75 73 74 20 62 65 20 70 61 73  ents must be pas
5bb0: 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63  sed to this func
5bc0: 74 69 6f 6e 2e 20 54 68 65 20 66 69 72 73 74 20  tion. The first 
5bd0: 69 73 20 74 68 65 20 62 6c 6f 62 20 74 6f 0a 2a  is the blob to.*
5be0: 2a 20 70 61 74 63 68 20 61 6e 64 20 74 68 65 20  * patch and the 
5bf0: 73 65 63 6f 6e 64 20 74 68 65 20 70 61 74 63 68  second the patch
5c00: 20 74 6f 20 61 70 70 6c 79 2e 20 49 66 20 6e 6f   to apply. If no
5c10: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
5c20: 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
5c30: 72 65 74 75 72 6e 73 20 74 68 65 20 70 61 74 63  returns the patc
5c40: 68 65 64 20 62 6c 6f 62 2e 0a 2a 2f 0a 73 74 61  hed blob..*/.sta
5c50: 74 69 63 20 76 6f 69 64 20 72 62 75 46 6f 73 73  tic void rbuFoss
5c60: 69 6c 44 65 6c 74 61 46 75 6e 63 28 0a 20 20 73  ilDeltaFunc(.  s
5c70: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
5c80: 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61  context,.  int a
5c90: 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  rgc,.  sqlite3_v
5ca0: 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
5cb0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 44 65   const char *aDe
5cc0: 6c 74 61 3b 0a 20 20 69 6e 74 20 6e 44 65 6c 74  lta;.  int nDelt
5cd0: 61 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  a;.  const char 
5ce0: 2a 61 4f 72 69 67 3b 0a 20 20 69 6e 74 20 6e 4f  *aOrig;.  int nO
5cf0: 72 69 67 3b 0a 0a 20 20 69 6e 74 20 6e 4f 75 74  rig;..  int nOut
5d00: 3b 0a 20 20 69 6e 74 20 6e 4f 75 74 32 3b 0a 20  ;.  int nOut2;. 
5d10: 20 63 68 61 72 20 2a 61 4f 75 74 3b 0a 0a 20 20   char *aOut;..  
5d20: 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d 32 20  assert( argc==2 
5d30: 29 3b 0a 0a 20 20 6e 4f 72 69 67 20 3d 20 73 71  );..  nOrig = sq
5d40: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
5d50: 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 61 4f  s(argv[0]);.  aO
5d60: 72 69 67 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  rig = (const cha
5d70: 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
5d80: 5f 62 6c 6f 62 28 61 72 67 76 5b 30 5d 29 3b 0a  _blob(argv[0]);.
5d90: 20 20 6e 44 65 6c 74 61 20 3d 20 73 71 6c 69 74    nDelta = sqlit
5da0: 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61  e3_value_bytes(a
5db0: 72 67 76 5b 31 5d 29 3b 0a 20 20 61 44 65 6c 74  rgv[1]);.  aDelt
5dc0: 61 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  a = (const char*
5dd0: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62  )sqlite3_value_b
5de0: 6c 6f 62 28 61 72 67 76 5b 31 5d 29 3b 0a 0a 20  lob(argv[1]);.. 
5df0: 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74   /* Figure out t
5e00: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6f  he size of the o
5e10: 75 74 70 75 74 20 2a 2f 0a 20 20 6e 4f 75 74 20  utput */.  nOut 
5e20: 3d 20 72 62 75 44 65 6c 74 61 4f 75 74 70 75 74  = rbuDeltaOutput
5e30: 53 69 7a 65 28 61 44 65 6c 74 61 2c 20 6e 44 65  Size(aDelta, nDe
5e40: 6c 74 61 29 3b 0a 20 20 69 66 28 20 6e 4f 75 74  lta);.  if( nOut
5e50: 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  <0 ){.    sqlite
5e60: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63  3_result_error(c
5e70: 6f 6e 74 65 78 74 2c 20 22 63 6f 72 72 75 70 74  ontext, "corrupt
5e80: 20 66 6f 73 73 69 6c 20 64 65 6c 74 61 22 2c 20   fossil delta", 
5e90: 2d 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  -1);.    return;
5ea0: 0a 20 20 7d 0a 0a 20 20 61 4f 75 74 20 3d 20 73  .  }..  aOut = s
5eb0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 4f  qlite3_malloc(nO
5ec0: 75 74 2b 31 29 3b 0a 20 20 69 66 28 20 61 4f 75  ut+1);.  if( aOu
5ed0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  t==0 ){.    sqli
5ee0: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
5ef0: 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b  _nomem(context);
5f00: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4f  .  }else{.    nO
5f10: 75 74 32 20 3d 20 72 62 75 44 65 6c 74 61 41 70  ut2 = rbuDeltaAp
5f20: 70 6c 79 28 61 4f 72 69 67 2c 20 6e 4f 72 69 67  ply(aOrig, nOrig
5f30: 2c 20 61 44 65 6c 74 61 2c 20 6e 44 65 6c 74 61  , aDelta, nDelta
5f40: 2c 20 61 4f 75 74 29 3b 0a 20 20 20 20 69 66 28  , aOut);.    if(
5f50: 20 6e 4f 75 74 32 21 3d 6e 4f 75 74 20 29 7b 0a   nOut2!=nOut ){.
5f60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
5f70: 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65  sult_error(conte
5f80: 78 74 2c 20 22 63 6f 72 72 75 70 74 20 66 6f 73  xt, "corrupt fos
5f90: 73 69 6c 20 64 65 6c 74 61 22 2c 20 2d 31 29 3b  sil delta", -1);
5fa0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
5fb0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
5fc0: 5f 62 6c 6f 62 28 63 6f 6e 74 65 78 74 2c 20 61  _blob(context, a
5fd0: 4f 75 74 2c 20 6e 4f 75 74 2c 20 73 71 6c 69 74  Out, nOut, sqlit
5fe0: 65 33 5f 66 72 65 65 29 3b 0a 20 20 20 20 7d 0a  e3_free);.    }.
5ff0: 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 50 72    }.}.../*.** Pr
6000: 65 70 61 72 65 20 74 68 65 20 53 51 4c 20 73 74  epare the SQL st
6010: 61 74 65 6d 65 6e 74 20 69 6e 20 62 75 66 66 65  atement in buffe
6020: 72 20 7a 53 71 6c 20 61 67 61 69 6e 73 74 20 64  r zSql against d
6030: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64  atabase handle d
6040: 62 2e 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  b..** If success
6050: 66 75 6c 2c 20 73 65 74 20 2a 70 70 53 74 6d 74  ful, set *ppStmt
6060: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
6070: 20 6e 65 77 20 73 74 61 74 65 6d 65 6e 74 20 61   new statement a
6080: 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c  nd return.** SQL
6090: 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 0a 2a 2a 20 4f  ITE_OK. .**.** O
60a0: 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 6e 20  therwise, if an 
60b0: 65 72 72 6f 72 20 64 6f 65 73 20 6f 63 63 75 72  error does occur
60c0: 2c 20 73 65 74 20 2a 70 70 53 74 6d 74 20 74 6f  , set *ppStmt to
60d0: 20 4e 55 4c 4c 20 61 6e 64 20 72 65 74 75 72 6e   NULL and return
60e0: 0a 2a 2a 20 61 6e 20 53 51 4c 69 74 65 20 65 72  .** an SQLite er
60f0: 72 6f 72 20 63 6f 64 65 2e 20 41 64 64 69 74 69  ror code. Additi
6100: 6f 6e 61 6c 6c 79 2c 20 73 65 74 20 6f 75 74 70  onally, set outp
6110: 75 74 20 76 61 72 69 61 62 6c 65 20 2a 70 7a 45  ut variable *pzE
6120: 72 72 6d 73 67 20 74 6f 0a 2a 2a 20 70 6f 69 6e  rrmsg to.** poin
6130: 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f  t to a buffer co
6140: 6e 74 61 69 6e 69 6e 67 20 61 6e 20 65 72 72 6f  ntaining an erro
6150: 72 20 6d 65 73 73 61 67 65 2e 20 49 74 20 69 73  r message. It is
6160: 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
6170: 69 74 79 0a 2a 2a 20 6f 66 20 74 68 65 20 63 61  ity.** of the ca
6180: 6c 6c 65 72 20 74 6f 20 28 65 76 65 6e 74 75 61  ller to (eventua
6190: 6c 6c 79 29 20 66 72 65 65 20 74 68 69 73 20 62  lly) free this b
61a0: 75 66 66 65 72 20 75 73 69 6e 67 20 73 71 6c 69  uffer using sqli
61b0: 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 73  te3_free()..*/.s
61c0: 74 61 74 69 63 20 69 6e 74 20 70 72 65 70 61 72  tatic int prepar
61d0: 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72  eAndCollectError
61e0: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
61f0: 20 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74   .  sqlite3_stmt
6200: 20 2a 2a 70 70 53 74 6d 74 2c 0a 20 20 63 68 61   **ppStmt,.  cha
6210: 72 20 2a 2a 70 7a 45 72 72 6d 73 67 2c 0a 20 20  r **pzErrmsg,.  
6220: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
6230: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73  .){.  int rc = s
6240: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
6250: 32 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20  2(db, zSql, -1, 
6260: 70 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66  ppStmt, 0);.  if
6270: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
6280: 29 7b 0a 20 20 20 20 2a 70 7a 45 72 72 6d 73 67  ){.    *pzErrmsg
6290: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
62a0: 74 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65 33  tf("%s", sqlite3
62b0: 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20  _errmsg(db));.  
62c0: 20 20 2a 70 70 53 74 6d 74 20 3d 20 30 3b 0a 20    *ppStmt = 0;. 
62d0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
62e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74 20 74  }../*.** Reset t
62f0: 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
6300: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
6310: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 52  irst argument. R
6320: 65 74 75 72 6e 20 61 20 63 6f 70 79 0a 2a 2a 20  eturn a copy.** 
6330: 6f 66 20 74 68 65 20 76 61 6c 75 65 20 72 65 74  of the value ret
6340: 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33  urned by sqlite3
6350: 5f 72 65 73 65 74 28 29 2e 0a 2a 2a 0a 2a 2a 20  _reset()..**.** 
6360: 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20  If an error has 
6370: 6f 63 63 75 72 72 65 64 2c 20 74 68 65 6e 20 73  occurred, then s
6380: 65 74 20 2a 70 7a 45 72 72 6d 73 67 20 74 6f 20  et *pzErrmsg to 
6390: 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65  point to a buffe
63a0: 72 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20  r.** containing 
63b0: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
63c0: 2e 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70  . It is the resp
63d0: 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
63e0: 65 20 63 61 6c 6c 65 72 0a 2a 2a 20 74 6f 20 65  e caller.** to e
63f0: 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 20 74  ventually free t
6400: 68 69 73 20 62 75 66 66 65 72 20 75 73 69 6e 67  his buffer using
6410: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e   sqlite3_free().
6420: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
6430: 65 73 65 74 41 6e 64 43 6f 6c 6c 65 63 74 45 72  esetAndCollectEr
6440: 72 6f 72 28 73 71 6c 69 74 65 33 5f 73 74 6d 74  ror(sqlite3_stmt
6450: 20 2a 70 53 74 6d 74 2c 20 63 68 61 72 20 2a 2a   *pStmt, char **
6460: 70 7a 45 72 72 6d 73 67 29 7b 0a 20 20 69 6e 74  pzErrmsg){.  int
6470: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65   rc = sqlite3_re
6480: 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 69 66  set(pStmt);.  if
6490: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
64a0: 29 7b 0a 20 20 20 20 2a 70 7a 45 72 72 6d 73 67  ){.    *pzErrmsg
64b0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
64c0: 74 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65 33  tf("%s", sqlite3
64d0: 5f 65 72 72 6d 73 67 28 73 71 6c 69 74 65 33 5f  _errmsg(sqlite3_
64e0: 64 62 5f 68 61 6e 64 6c 65 28 70 53 74 6d 74 29  db_handle(pStmt)
64f0: 29 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ));.  }.  return
6500: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e   rc;.}../*.** Un
6510: 6c 65 73 73 20 69 74 20 69 73 20 4e 55 4c 4c 2c  less it is NULL,
6520: 20 61 72 67 75 6d 65 6e 74 20 7a 53 71 6c 20 70   argument zSql p
6530: 6f 69 6e 74 73 20 74 6f 20 61 20 62 75 66 66 65  oints to a buffe
6540: 72 20 61 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e  r allocated usin
6550: 67 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c  g.** sqlite3_mal
6560: 6c 6f 63 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61  loc containing a
6570: 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e  n SQL statement.
6580: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 70   This function p
6590: 72 65 70 61 72 65 73 20 74 68 65 20 53 51 4c 0a  repares the SQL.
65a0: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 61 67 61  ** statement aga
65b0: 69 6e 73 74 20 64 61 74 61 62 61 73 65 20 64 62  inst database db
65c0: 20 61 6e 64 20 66 72 65 65 73 20 74 68 65 20 62   and frees the b
65d0: 75 66 66 65 72 2e 20 49 66 20 73 74 61 74 65 6d  uffer. If statem
65e0: 65 6e 74 20 0a 2a 2a 20 63 6f 6d 70 69 6c 61 74  ent .** compilat
65f0: 69 6f 6e 20 69 73 20 73 75 63 63 65 73 73 66 75  ion is successfu
6600: 6c 2c 20 2a 70 70 53 74 6d 74 20 69 73 20 73 65  l, *ppStmt is se
6610: 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  t to point to th
6620: 65 20 6e 65 77 20 73 74 61 74 65 6d 65 6e 74 20  e new statement 
6630: 0a 2a 2a 20 68 61 6e 64 6c 65 20 61 6e 64 20 53  .** handle and S
6640: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
6650: 72 6e 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 4f 74 68  rned. .**.** Oth
6660: 65 72 77 69 73 65 2c 20 69 66 20 61 6e 20 65 72  erwise, if an er
6670: 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70 70 53  ror occurs, *ppS
6680: 74 6d 74 20 69 73 20 73 65 74 20 74 6f 20 4e 55  tmt is set to NU
6690: 4c 4c 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20  LL and an error 
66a0: 63 6f 64 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64  code.** returned
66b0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
66c0: 2a 70 7a 45 72 72 6d 73 67 20 6d 61 79 20 61 6c  *pzErrmsg may al
66d0: 73 6f 20 62 65 20 73 65 74 20 74 6f 20 70 6f 69  so be set to poi
66e0: 6e 74 20 74 6f 20 61 6e 20 65 72 72 6f 72 0a 2a  nt to an error.*
66f0: 2a 20 6d 65 73 73 61 67 65 2e 20 49 74 20 69 73  * message. It is
6700: 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
6710: 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  ity of the calle
6720: 72 20 74 6f 20 66 72 65 65 20 74 68 69 73 20 65  r to free this e
6730: 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20  rror message.** 
6740: 62 75 66 66 65 72 20 75 73 69 6e 67 20 73 71 6c  buffer using sql
6750: 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2a 0a  ite3_free()..**.
6760: 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 7a  ** If argument z
6770: 53 71 6c 20 69 73 20 4e 55 4c 4c 2c 20 74 68 69  Sql is NULL, thi
6780: 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d  s function assum
6790: 65 73 20 74 68 61 74 20 61 6e 20 4f 4f 4d 20 68  es that an OOM h
67a0: 61 73 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 20  as occurred..** 
67b0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 53 51 4c  In this case SQL
67c0: 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74  ITE_NOMEM is ret
67d0: 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 53 74 6d  urned and *ppStm
67e0: 74 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a  t set to NULL..*
67f0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 65  /.static int pre
6800: 70 61 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65  pareFreeAndColle
6810: 63 74 45 72 72 6f 72 28 0a 20 20 73 71 6c 69 74  ctError(.  sqlit
6820: 65 33 20 2a 64 62 2c 20 0a 20 20 73 71 6c 69 74  e3 *db, .  sqlit
6830: 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74  e3_stmt **ppStmt
6840: 2c 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72  ,.  char **pzErr
6850: 6d 73 67 2c 0a 20 20 63 68 61 72 20 2a 7a 53 71  msg,.  char *zSq
6860: 6c 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  l.){.  int rc;. 
6870: 20 61 73 73 65 72 74 28 20 2a 70 7a 45 72 72 6d   assert( *pzErrm
6880: 73 67 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 7a  sg==0 );.  if( z
6890: 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  Sql==0 ){.    rc
68a0: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
68b0: 0a 20 20 20 20 2a 70 70 53 74 6d 74 20 3d 20 30  .    *ppStmt = 0
68c0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
68d0: 63 20 3d 20 70 72 65 70 61 72 65 41 6e 64 43 6f  c = prepareAndCo
68e0: 6c 6c 65 63 74 45 72 72 6f 72 28 64 62 2c 20 70  llectError(db, p
68f0: 70 53 74 6d 74 2c 20 70 7a 45 72 72 6d 73 67 2c  pStmt, pzErrmsg,
6900: 20 7a 53 71 6c 29 3b 0a 20 20 20 20 73 71 6c 69   zSql);.    sqli
6910: 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a  te3_free(zSql);.
6920: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
6930: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74  .}../*.** Free t
6940: 68 65 20 52 62 75 4f 62 6a 49 74 65 72 2e 61 7a  he RbuObjIter.az
6950: 54 62 6c 43 6f 6c 5b 5d 20 61 6e 64 20 52 62 75  TblCol[] and Rbu
6960: 4f 62 6a 49 74 65 72 2e 61 62 54 62 6c 50 6b 5b  ObjIter.abTblPk[
6970: 5d 20 61 72 72 61 79 73 20 61 6c 6c 6f 63 61 74  ] arrays allocat
6980: 65 64 0a 2a 2a 20 62 79 20 61 6e 20 65 61 72 6c  ed.** by an earl
6990: 69 65 72 20 63 61 6c 6c 20 74 6f 20 72 62 75 4f  ier call to rbuO
69a0: 62 6a 49 74 65 72 43 61 63 68 65 54 61 62 6c 65  bjIterCacheTable
69b0: 49 6e 66 6f 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  Info()..*/.stati
69c0: 63 20 76 6f 69 64 20 72 62 75 4f 62 6a 49 74 65  c void rbuObjIte
69d0: 72 46 72 65 65 43 6f 6c 73 28 52 62 75 4f 62 6a  rFreeCols(RbuObj
69e0: 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
69f0: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
6a00: 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 54 62 6c 43  ; i<pIter->nTblC
6a10: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  ol; i++){.    sq
6a20: 6c 69 74 65 33 5f 66 72 65 65 28 70 49 74 65 72  lite3_free(pIter
6a30: 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69 5d 29 3b 0a  ->azTblCol[i]);.
6a40: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
6a50: 28 70 49 74 65 72 2d 3e 61 7a 54 62 6c 54 79 70  (pIter->azTblTyp
6a60: 65 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  e[i]);.  }.  sql
6a70: 69 74 65 33 5f 66 72 65 65 28 70 49 74 65 72 2d  ite3_free(pIter-
6a80: 3e 61 7a 54 62 6c 43 6f 6c 29 3b 0a 20 20 70 49  >azTblCol);.  pI
6a90: 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 20 3d 20  ter->azTblCol = 
6aa0: 30 3b 0a 20 20 70 49 74 65 72 2d 3e 61 7a 54 62  0;.  pIter->azTb
6ab0: 6c 54 79 70 65 20 3d 20 30 3b 0a 20 20 70 49 74  lType = 0;.  pIt
6ac0: 65 72 2d 3e 61 69 53 72 63 4f 72 64 65 72 20 3d  er->aiSrcOrder =
6ad0: 20 30 3b 0a 20 20 70 49 74 65 72 2d 3e 61 62 54   0;.  pIter->abT
6ae0: 62 6c 50 6b 20 3d 20 30 3b 0a 20 20 70 49 74 65  blPk = 0;.  pIte
6af0: 72 2d 3e 61 62 4e 6f 74 4e 75 6c 6c 20 3d 20 30  r->abNotNull = 0
6b00: 3b 0a 20 20 70 49 74 65 72 2d 3e 6e 54 62 6c 43  ;.  pIter->nTblC
6b10: 6f 6c 20 3d 20 30 3b 0a 20 20 70 49 74 65 72 2d  ol = 0;.  pIter-
6b20: 3e 65 54 79 70 65 20 3d 20 30 3b 20 20 20 20 20  >eType = 0;     
6b30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 76            /* Inv
6b40: 61 6c 69 64 20 76 61 6c 75 65 20 2a 2f 0a 7d 0a  alid value */.}.
6b50: 0a 2f 2a 0a 2a 2a 20 46 69 6e 61 6c 69 7a 65 20  ./*.** Finalize 
6b60: 61 6c 6c 20 73 74 61 74 65 6d 65 6e 74 73 20 61  all statements a
6b70: 6e 64 20 66 72 65 65 20 61 6c 6c 20 61 6c 6c 6f  nd free all allo
6b80: 63 61 74 69 6f 6e 73 20 74 68 61 74 20 61 72 65  cations that are
6b90: 20 73 70 65 63 69 66 69 63 20 74 6f 0a 2a 2a 20   specific to.** 
6ba0: 74 68 65 20 63 75 72 72 65 6e 74 20 6f 62 6a 65  the current obje
6bb0: 63 74 20 28 74 61 62 6c 65 2f 69 6e 64 65 78 20  ct (table/index 
6bc0: 70 61 69 72 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  pair)..*/.static
6bd0: 20 76 6f 69 64 20 72 62 75 4f 62 6a 49 74 65 72   void rbuObjIter
6be0: 43 6c 65 61 72 53 74 61 74 65 6d 65 6e 74 73 28  ClearStatements(
6bf0: 52 62 75 4f 62 6a 49 74 65 72 20 2a 70 49 74 65  RbuObjIter *pIte
6c00: 72 29 7b 0a 20 20 52 62 75 55 70 64 61 74 65 53  r){.  RbuUpdateS
6c10: 74 6d 74 20 2a 70 55 70 3b 0a 0a 20 20 73 71 6c  tmt *pUp;..  sql
6c20: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 49  ite3_finalize(pI
6c30: 74 65 72 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20  ter->pSelect);. 
6c40: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
6c50: 65 28 70 49 74 65 72 2d 3e 70 49 6e 73 65 72 74  e(pIter->pInsert
6c60: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  );.  sqlite3_fin
6c70: 61 6c 69 7a 65 28 70 49 74 65 72 2d 3e 70 44 65  alize(pIter->pDe
6c80: 6c 65 74 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  lete);.  sqlite3
6c90: 5f 66 69 6e 61 6c 69 7a 65 28 70 49 74 65 72 2d  _finalize(pIter-
6ca0: 3e 70 54 6d 70 49 6e 73 65 72 74 29 3b 0a 20 20  >pTmpInsert);.  
6cb0: 70 55 70 20 3d 20 70 49 74 65 72 2d 3e 70 52 62  pUp = pIter->pRb
6cc0: 75 55 70 64 61 74 65 3b 0a 20 20 77 68 69 6c 65  uUpdate;.  while
6cd0: 28 20 70 55 70 20 29 7b 0a 20 20 20 20 52 62 75  ( pUp ){.    Rbu
6ce0: 55 70 64 61 74 65 53 74 6d 74 20 2a 70 54 6d 70  UpdateStmt *pTmp
6cf0: 20 3d 20 70 55 70 2d 3e 70 4e 65 78 74 3b 0a 20   = pUp->pNext;. 
6d00: 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
6d10: 69 7a 65 28 70 55 70 2d 3e 70 55 70 64 61 74 65  ize(pUp->pUpdate
6d20: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
6d30: 72 65 65 28 70 55 70 29 3b 0a 20 20 20 20 70 55  ree(pUp);.    pU
6d40: 70 20 3d 20 70 54 6d 70 3b 0a 20 20 7d 0a 20 20  p = pTmp;.  }.  
6d50: 0a 20 20 70 49 74 65 72 2d 3e 70 53 65 6c 65 63  .  pIter->pSelec
6d60: 74 20 3d 20 30 3b 0a 20 20 70 49 74 65 72 2d 3e  t = 0;.  pIter->
6d70: 70 49 6e 73 65 72 74 20 3d 20 30 3b 0a 20 20 70  pInsert = 0;.  p
6d80: 49 74 65 72 2d 3e 70 44 65 6c 65 74 65 20 3d 20  Iter->pDelete = 
6d90: 30 3b 0a 20 20 70 49 74 65 72 2d 3e 70 52 62 75  0;.  pIter->pRbu
6da0: 55 70 64 61 74 65 20 3d 20 30 3b 0a 20 20 70 49  Update = 0;.  pI
6db0: 74 65 72 2d 3e 70 54 6d 70 49 6e 73 65 72 74 20  ter->pTmpInsert 
6dc0: 3d 20 30 3b 0a 20 20 70 49 74 65 72 2d 3e 6e 43  = 0;.  pIter->nC
6dd0: 6f 6c 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ol = 0;.}../*.**
6de0: 20 43 6c 65 61 6e 20 75 70 20 61 6e 79 20 72 65   Clean up any re
6df0: 73 6f 75 72 63 65 73 20 61 6c 6c 6f 63 61 74 65  sources allocate
6e00: 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  d as part of the
6e10: 20 69 74 65 72 61 74 6f 72 20 6f 62 6a 65 63 74   iterator object
6e20: 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68   passed.** as th
6e30: 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e  e only argument.
6e40: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6e50: 72 62 75 4f 62 6a 49 74 65 72 46 69 6e 61 6c 69  rbuObjIterFinali
6e60: 7a 65 28 52 62 75 4f 62 6a 49 74 65 72 20 2a 70  ze(RbuObjIter *p
6e70: 49 74 65 72 29 7b 0a 20 20 72 62 75 4f 62 6a 49  Iter){.  rbuObjI
6e80: 74 65 72 43 6c 65 61 72 53 74 61 74 65 6d 65 6e  terClearStatemen
6e90: 74 73 28 70 49 74 65 72 29 3b 0a 20 20 73 71 6c  ts(pIter);.  sql
6ea0: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 49  ite3_finalize(pI
6eb0: 74 65 72 2d 3e 70 54 62 6c 49 74 65 72 29 3b 0a  ter->pTblIter);.
6ec0: 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
6ed0: 7a 65 28 70 49 74 65 72 2d 3e 70 49 64 78 49 74  ze(pIter->pIdxIt
6ee0: 65 72 29 3b 0a 20 20 72 62 75 4f 62 6a 49 74 65  er);.  rbuObjIte
6ef0: 72 46 72 65 65 43 6f 6c 73 28 70 49 74 65 72 29  rFreeCols(pIter)
6f00: 3b 0a 20 20 6d 65 6d 73 65 74 28 70 49 74 65 72  ;.  memset(pIter
6f10: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 52 62 75 4f  , 0, sizeof(RbuO
6f20: 62 6a 49 74 65 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a  bjIter));.}../*.
6f30: 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 69  ** Advance the i
6f40: 74 65 72 61 74 6f 72 20 74 6f 20 74 68 65 20 6e  terator to the n
6f50: 65 78 74 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2a  ext position..**
6f60: 0a 2a 2a 20 49 66 20 6e 6f 20 65 72 72 6f 72 20  .** If no error 
6f70: 6f 63 63 75 72 73 2c 20 53 51 4c 49 54 45 5f 4f  occurs, SQLITE_O
6f80: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  K is returned an
6f90: 64 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 69  d the iterator i
6fa0: 73 20 6c 65 66 74 20 0a 2a 2a 20 70 6f 69 6e 74  s left .** point
6fb0: 69 6e 67 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ing to the next 
6fc0: 65 6e 74 72 79 2e 20 4f 74 68 65 72 77 69 73 65  entry. Otherwise
6fd0: 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  , an error code 
6fe0: 61 6e 64 20 6d 65 73 73 61 67 65 20 69 73 20 0a  and message is .
6ff0: 2a 2a 20 6c 65 66 74 20 69 6e 20 74 68 65 20 52  ** left in the R
7000: 42 55 20 68 61 6e 64 6c 65 20 70 61 73 73 65 64  BU handle passed
7010: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
7020: 67 75 6d 65 6e 74 2e 20 41 20 63 6f 70 79 20 6f  gument. A copy o
7030: 66 20 74 68 65 20 0a 2a 2a 20 65 72 72 6f 72 20  f the .** error 
7040: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
7050: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
7060: 72 62 75 4f 62 6a 49 74 65 72 4e 65 78 74 28 73  rbuObjIterNext(s
7070: 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 52 62  qlite3rbu *p, Rb
7080: 75 4f 62 6a 49 74 65 72 20 2a 70 49 74 65 72 29  uObjIter *pIter)
7090: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 2d 3e  {.  int rc = p->
70a0: 72 63 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  rc;.  if( rc==SQ
70b0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 0a 20 20 20 20  LITE_OK ){..    
70c0: 2f 2a 20 46 72 65 65 20 61 6e 79 20 53 51 4c 69  /* Free any SQLi
70d0: 74 65 20 73 74 61 74 65 6d 65 6e 74 73 20 75 73  te statements us
70e0: 65 64 20 77 68 69 6c 65 20 70 72 6f 63 65 73 73  ed while process
70f0: 69 6e 67 20 74 68 65 20 70 72 65 76 69 6f 75 73  ing the previous
7100: 20 6f 62 6a 65 63 74 20 2a 2f 20 0a 20 20 20 20   object */ .    
7110: 72 62 75 4f 62 6a 49 74 65 72 43 6c 65 61 72 53  rbuObjIterClearS
7120: 74 61 74 65 6d 65 6e 74 73 28 70 49 74 65 72 29  tatements(pIter)
7130: 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  ;.    if( pIter-
7140: 3e 7a 49 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20  >zIdx==0 ){.    
7150: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
7160: 78 65 63 28 70 2d 3e 64 62 4d 61 69 6e 2c 0a 20  xec(p->dbMain,. 
7170: 20 20 20 20 20 20 20 20 20 22 44 52 4f 50 20 54           "DROP T
7180: 52 49 47 47 45 52 20 49 46 20 45 58 49 53 54 53  RIGGER IF EXISTS
7190: 20 74 65 6d 70 2e 72 62 75 5f 69 6e 73 65 72 74   temp.rbu_insert
71a0: 5f 74 72 3b 22 0a 20 20 20 20 20 20 20 20 20 20  _tr;".          
71b0: 22 44 52 4f 50 20 54 52 49 47 47 45 52 20 49 46  "DROP TRIGGER IF
71c0: 20 45 58 49 53 54 53 20 74 65 6d 70 2e 72 62 75   EXISTS temp.rbu
71d0: 5f 75 70 64 61 74 65 31 5f 74 72 3b 22 0a 20 20  _update1_tr;".  
71e0: 20 20 20 20 20 20 20 20 22 44 52 4f 50 20 54 52          "DROP TR
71f0: 49 47 47 45 52 20 49 46 20 45 58 49 53 54 53 20  IGGER IF EXISTS 
7200: 74 65 6d 70 2e 72 62 75 5f 75 70 64 61 74 65 32  temp.rbu_update2
7210: 5f 74 72 3b 22 0a 20 20 20 20 20 20 20 20 20 20  _tr;".          
7220: 22 44 52 4f 50 20 54 52 49 47 47 45 52 20 49 46  "DROP TRIGGER IF
7230: 20 45 58 49 53 54 53 20 74 65 6d 70 2e 72 62 75   EXISTS temp.rbu
7240: 5f 64 65 6c 65 74 65 5f 74 72 3b 22 0a 20 20 20  _delete_tr;".   
7250: 20 20 20 20 20 20 20 2c 20 30 2c 20 30 2c 20 26         , 0, 0, &
7260: 70 2d 3e 7a 45 72 72 6d 73 67 0a 20 20 20 20 20  p->zErrmsg.     
7270: 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69   );.    }..    i
7280: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
7290: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49   ){.      if( pI
72a0: 74 65 72 2d 3e 62 43 6c 65 61 6e 75 70 20 29 7b  ter->bCleanup ){
72b0: 0a 20 20 20 20 20 20 20 20 72 62 75 4f 62 6a 49  .        rbuObjI
72c0: 74 65 72 46 72 65 65 43 6f 6c 73 28 70 49 74 65  terFreeCols(pIte
72d0: 72 29 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65  r);.        pIte
72e0: 72 2d 3e 62 43 6c 65 61 6e 75 70 20 3d 20 30 3b  r->bCleanup = 0;
72f0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
7300: 6c 69 74 65 33 5f 73 74 65 70 28 70 49 74 65 72  lite3_step(pIter
7310: 2d 3e 70 54 62 6c 49 74 65 72 29 3b 0a 20 20 20  ->pTblIter);.   
7320: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
7330: 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20  ITE_ROW ){.     
7340: 20 20 20 20 20 72 63 20 3d 20 72 65 73 65 74 41       rc = resetA
7350: 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70  ndCollectError(p
7360: 49 74 65 72 2d 3e 70 54 62 6c 49 74 65 72 2c 20  Iter->pTblIter, 
7370: 26 70 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a 20 20  &p->zErrmsg);.  
7380: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 7a          pIter->z
7390: 54 62 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Tbl = 0;.       
73a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
73b0: 20 20 70 49 74 65 72 2d 3e 7a 54 62 6c 20 3d 20    pIter->zTbl = 
73c0: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
73d0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
73e0: 28 70 49 74 65 72 2d 3e 70 54 62 6c 49 74 65 72  (pIter->pTblIter
73f0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
7400: 70 49 74 65 72 2d 3e 7a 44 61 74 61 54 62 6c 20  pIter->zDataTbl 
7410: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
7420: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
7430: 78 74 28 70 49 74 65 72 2d 3e 70 54 62 6c 49 74  xt(pIter->pTblIt
7440: 65 72 2c 31 29 3b 0a 20 20 20 20 20 20 20 20 20  er,1);.         
7450: 20 72 63 20 3d 20 28 70 49 74 65 72 2d 3e 7a 44   rc = (pIter->zD
7460: 61 74 61 54 62 6c 20 26 26 20 70 49 74 65 72 2d  ataTbl && pIter-
7470: 3e 7a 54 62 6c 29 20 3f 20 53 51 4c 49 54 45 5f  >zTbl) ? SQLITE_
7480: 4f 4b 20 3a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  OK : SQLITE_NOME
7490: 4d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  M;.        }.   
74a0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
74b0: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 7a 49 64    if( pIter->zId
74c0: 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  x==0 ){.        
74d0: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
74e0: 70 49 64 78 20 3d 20 70 49 74 65 72 2d 3e 70 49  pIdx = pIter->pI
74f0: 64 78 49 74 65 72 3b 0a 20 20 20 20 20 20 20 20  dxIter;.        
7500: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
7510: 69 6e 64 5f 74 65 78 74 28 70 49 64 78 2c 20 31  ind_text(pIdx, 1
7520: 2c 20 70 49 74 65 72 2d 3e 7a 54 62 6c 2c 20 2d  , pIter->zTbl, -
7530: 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  1, SQLITE_STATIC
7540: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
7550: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
7560: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
7570: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
7580: 5f 73 74 65 70 28 70 49 74 65 72 2d 3e 70 49 64  _step(pIter->pId
7590: 78 49 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20  xIter);.        
75a0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
75b0: 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 20 20  _ROW ){.        
75c0: 20 20 20 20 72 63 20 3d 20 72 65 73 65 74 41 6e      rc = resetAn
75d0: 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 49  dCollectError(pI
75e0: 74 65 72 2d 3e 70 49 64 78 49 74 65 72 2c 20 26  ter->pIdxIter, &
75f0: 70 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a 20 20 20  p->zErrmsg);.   
7600: 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e           pIter->
7610: 62 43 6c 65 61 6e 75 70 20 3d 20 31 3b 0a 20 20  bCleanup = 1;.  
7620: 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d            pIter-
7630: 3e 7a 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 20  >zIdx = 0;.     
7640: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
7650: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 7a          pIter->z
7660: 49 64 78 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  Idx = (const cha
7670: 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
7680: 6e 5f 74 65 78 74 28 70 49 74 65 72 2d 3e 70 49  n_text(pIter->pI
7690: 64 78 49 74 65 72 2c 20 30 29 3b 0a 20 20 20 20  dxIter, 0);.    
76a0: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69          pIter->i
76b0: 54 6e 75 6d 20 3d 20 73 71 6c 69 74 65 33 5f 63  Tnum = sqlite3_c
76c0: 6f 6c 75 6d 6e 5f 69 6e 74 28 70 49 74 65 72 2d  olumn_int(pIter-
76d0: 3e 70 49 64 78 49 74 65 72 2c 20 31 29 3b 0a 20  >pIdxIter, 1);. 
76e0: 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72             pIter
76f0: 2d 3e 62 55 6e 69 71 75 65 20 3d 20 73 71 6c 69  ->bUnique = sqli
7700: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
7710: 49 74 65 72 2d 3e 70 49 64 78 49 74 65 72 2c 20  Iter->pIdxIter, 
7720: 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  2);.            
7730: 72 63 20 3d 20 70 49 74 65 72 2d 3e 7a 49 64 78  rc = pIter->zIdx
7740: 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53   ? SQLITE_OK : S
7750: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
7760: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7770: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
7780: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d  .  }..  if( rc!=
7790: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
77a0: 20 72 62 75 4f 62 6a 49 74 65 72 46 69 6e 61 6c   rbuObjIterFinal
77b0: 69 7a 65 28 70 49 74 65 72 29 3b 0a 20 20 20 20  ize(pIter);.    
77c0: 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 7d 0a  p->rc = rc;.  }.
77d0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
77e0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65  ./*.** The imple
77f0: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
7800: 20 72 62 75 5f 74 61 72 67 65 74 5f 6e 61 6d 65   rbu_target_name
7810: 28 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2e  () SQL function.
7820: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   This function.*
7830: 2a 20 61 63 63 65 70 74 73 20 6f 6e 65 20 6f 72  * accepts one or
7840: 20 74 77 6f 20 61 72 67 75 6d 65 6e 74 73 2e 20   two arguments. 
7850: 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  The first argume
7860: 6e 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  nt is the name o
7870: 66 20 61 20 74 61 62 6c 65 20 2d 0a 2a 2a 20 74  f a table -.** t
7880: 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 74 61 62  he name of a tab
7890: 6c 65 20 69 6e 20 74 68 65 20 52 42 55 20 64 61  le in the RBU da
78a0: 74 61 62 61 73 65 2e 20 20 54 68 65 20 73 65 63  tabase.  The sec
78b0: 6f 6e 64 2c 20 69 66 20 69 74 20 69 73 20 70 72  ond, if it is pr
78c0: 65 73 65 6e 74 2c 20 69 73 20 31 0a 2a 2a 20 66  esent, is 1.** f
78d0: 6f 72 20 61 20 76 69 65 77 20 6f 72 20 30 20 66  or a view or 0 f
78e0: 6f 72 20 61 20 74 61 62 6c 65 2e 20 0a 2a 2a 0a  or a table. .**.
78f0: 2a 2a 20 46 6f 72 20 61 20 6e 6f 6e 2d 76 61 63  ** For a non-vac
7900: 75 75 6d 20 52 42 55 20 68 61 6e 64 6c 65 2c 20  uum RBU handle, 
7910: 69 66 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  if the table nam
7920: 65 20 6d 61 74 63 68 65 73 20 74 68 65 20 70 61  e matches the pa
7930: 74 74 65 72 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ttern:.**.**    
7940: 20 64 61 74 61 5b 30 2d 39 5d 5f 3c 6e 61 6d 65   data[0-9]_<name
7950: 3e 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 3c 6e  >.**.** where <n
7960: 61 6d 65 3e 20 69 73 20 61 6e 79 20 73 65 71 75  ame> is any sequ
7970: 65 6e 63 65 20 6f 66 20 31 20 6f 72 20 6d 6f 72  ence of 1 or mor
7980: 65 20 63 68 61 72 61 63 74 65 72 73 2c 20 3c 6e  e characters, <n
7990: 61 6d 65 3e 20 69 73 20 72 65 74 75 72 6e 65 64  ame> is returned
79a0: 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
79b0: 69 66 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75  if the only argu
79c0: 6d 65 6e 74 20 64 6f 65 73 20 6e 6f 74 20 6d 61  ment does not ma
79d0: 74 63 68 20 74 68 65 20 61 62 6f 76 65 20 70 61  tch the above pa
79e0: 74 74 65 72 6e 2c 20 61 6e 20 53 51 4c 0a 2a 2a  ttern, an SQL.**
79f0: 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
7a00: 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 22 64 61  d..**.**     "da
7a10: 74 61 5f 74 31 22 20 20 20 20 20 2d 3e 20 22 74  ta_t1"     -> "t
7a20: 31 22 0a 2a 2a 20 20 20 20 20 22 64 61 74 61 30  1".**     "data0
7a30: 31 32 33 5f 74 32 22 20 2d 3e 20 22 74 32 22 0a  123_t2" -> "t2".
7a40: 2a 2a 20 20 20 20 20 22 64 61 74 61 41 42 5f 74  **     "dataAB_t
7a50: 33 22 20 20 20 2d 3e 20 4e 55 4c 4c 0a 2a 2a 0a  3"   -> NULL.**.
7a60: 2a 2a 20 46 6f 72 20 61 6e 20 72 62 75 20 76 61  ** For an rbu va
7a70: 63 75 75 6d 20 68 61 6e 64 6c 65 2c 20 61 20 63  cuum handle, a c
7a80: 6f 70 79 20 6f 66 20 74 68 65 20 66 69 72 73 74  opy of the first
7a90: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 72 65 74   argument is ret
7aa0: 75 72 6e 65 64 20 69 66 0a 2a 2a 20 74 68 65 20  urned if.** the 
7ab0: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
7ac0: 69 73 20 65 69 74 68 65 72 20 6d 69 73 73 69 6e  is either missin
7ad0: 67 20 6f 72 20 30 20 28 6e 6f 74 20 61 20 76 69  g or 0 (not a vi
7ae0: 65 77 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ew)..*/.static v
7af0: 6f 69 64 20 72 62 75 54 61 72 67 65 74 4e 61 6d  oid rbuTargetNam
7b00: 65 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33  eFunc(.  sqlite3
7b10: 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 0a  _context *pCtx,.
7b20: 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71    int argc,.  sq
7b30: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
7b40: 67 76 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 72  gv.){.  sqlite3r
7b50: 62 75 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 5f  bu *p = sqlite3_
7b60: 75 73 65 72 5f 64 61 74 61 28 70 43 74 78 29 3b  user_data(pCtx);
7b70: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
7b80: 49 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 61 72  In;.  assert( ar
7b90: 67 63 3d 3d 31 20 7c 7c 20 61 72 67 63 3d 3d 32  gc==1 || argc==2
7ba0: 20 29 3b 0a 0a 20 20 7a 49 6e 20 3d 20 28 63 6f   );..  zIn = (co
7bb0: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
7bc0: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
7bd0: 76 5b 30 5d 29 3b 0a 20 20 69 66 28 20 7a 49 6e  v[0]);.  if( zIn
7be0: 20 29 7b 0a 20 20 20 20 69 66 28 20 72 62 75 49   ){.    if( rbuI
7bf0: 73 56 61 63 75 75 6d 28 70 29 20 29 7b 0a 20 20  sVacuum(p) ){.  
7c00: 20 20 20 20 69 66 28 20 61 72 67 63 3d 3d 31 20      if( argc==1 
7c10: 7c 7c 20 30 3d 3d 73 71 6c 69 74 65 33 5f 76 61  || 0==sqlite3_va
7c20: 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b 31 5d 29  lue_int(argv[1])
7c30: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
7c40: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
7c50: 70 43 74 78 2c 20 7a 49 6e 2c 20 2d 31 2c 20 53  pCtx, zIn, -1, S
7c60: 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
7c70: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
7c80: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 6c  {.      if( strl
7c90: 65 6e 28 7a 49 6e 29 3e 34 20 26 26 20 6d 65 6d  en(zIn)>4 && mem
7ca0: 63 6d 70 28 22 64 61 74 61 22 2c 20 7a 49 6e 2c  cmp("data", zIn,
7cb0: 20 34 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   4)==0 ){.      
7cc0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20    int i;.       
7cd0: 20 66 6f 72 28 69 3d 34 3b 20 7a 49 6e 5b 69 5d   for(i=4; zIn[i]
7ce0: 3e 3d 27 30 27 20 26 26 20 7a 49 6e 5b 69 5d 3c  >='0' && zIn[i]<
7cf0: 3d 27 39 27 3b 20 69 2b 2b 29 3b 0a 20 20 20 20  ='9'; i++);.    
7d00: 20 20 20 20 69 66 28 20 7a 49 6e 5b 69 5d 3d 3d      if( zIn[i]==
7d10: 27 5f 27 20 26 26 20 7a 49 6e 5b 69 2b 31 5d 20  '_' && zIn[i+1] 
7d20: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
7d30: 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
7d40: 28 70 43 74 78 2c 20 26 7a 49 6e 5b 69 2b 31 5d  (pCtx, &zIn[i+1]
7d50: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41  , -1, SQLITE_STA
7d60: 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  TIC);.        }.
7d70: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
7d80: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  }.}../*.** Initi
7d90: 61 6c 69 7a 65 20 74 68 65 20 69 74 65 72 61 74  alize the iterat
7da0: 6f 72 20 73 74 72 75 63 74 75 72 65 20 70 61 73  or structure pas
7db0: 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
7dc0: 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a  d argument..**.*
7dd0: 2a 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63  * If no error oc
7de0: 63 75 72 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  curs, SQLITE_OK 
7df0: 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
7e00: 74 68 65 20 69 74 65 72 61 74 6f 72 20 69 73 20  the iterator is 
7e10: 6c 65 66 74 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e  left .** pointin
7e20: 67 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65  g to the first e
7e30: 6e 74 72 79 2e 20 4f 74 68 65 72 77 69 73 65 2c  ntry. Otherwise,
7e40: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 61   an error code a
7e50: 6e 64 20 6d 65 73 73 61 67 65 20 69 73 20 0a 2a  nd message is .*
7e60: 2a 20 6c 65 66 74 20 69 6e 20 74 68 65 20 52 42  * left in the RB
7e70: 55 20 68 61 6e 64 6c 65 20 70 61 73 73 65 64 20  U handle passed 
7e80: 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
7e90: 75 6d 65 6e 74 2e 20 41 20 63 6f 70 79 20 6f 66  ument. A copy of
7ea0: 20 74 68 65 20 0a 2a 2a 20 65 72 72 6f 72 20 63   the .** error c
7eb0: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
7ec0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
7ed0: 62 75 4f 62 6a 49 74 65 72 46 69 72 73 74 28 73  buObjIterFirst(s
7ee0: 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 52 62  qlite3rbu *p, Rb
7ef0: 75 4f 62 6a 49 74 65 72 20 2a 70 49 74 65 72 29  uObjIter *pIter)
7f00: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 6d 65  {.  int rc;.  me
7f10: 6d 73 65 74 28 70 49 74 65 72 2c 20 30 2c 20 73  mset(pIter, 0, s
7f20: 69 7a 65 6f 66 28 52 62 75 4f 62 6a 49 74 65 72  izeof(RbuObjIter
7f30: 29 29 3b 0a 0a 20 20 72 63 20 3d 20 70 72 65 70  ));..  rc = prep
7f40: 61 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63  areFreeAndCollec
7f50: 74 45 72 72 6f 72 28 70 2d 3e 64 62 52 62 75 2c  tError(p->dbRbu,
7f60: 20 26 70 49 74 65 72 2d 3e 70 54 62 6c 49 74 65   &pIter->pTblIte
7f70: 72 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 20  r, &p->zErrmsg, 
7f80: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72  .    sqlite3_mpr
7f90: 69 6e 74 66 28 0a 20 20 20 20 20 20 22 53 45 4c  intf(.      "SEL
7fa0: 45 43 54 20 72 62 75 5f 74 61 72 67 65 74 5f 6e  ECT rbu_target_n
7fb0: 61 6d 65 28 6e 61 6d 65 2c 20 74 79 70 65 3d 27  ame(name, type='
7fc0: 76 69 65 77 27 29 20 41 53 20 74 61 72 67 65 74  view') AS target
7fd0: 2c 20 6e 61 6d 65 20 22 0a 20 20 20 20 20 20 22  , name ".      "
7fe0: 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
7ff0: 65 72 20 22 0a 20 20 20 20 20 20 22 57 48 45 52  er ".      "WHER
8000: 45 20 74 79 70 65 20 49 4e 20 28 27 74 61 62 6c  E type IN ('tabl
8010: 65 27 2c 20 27 76 69 65 77 27 29 20 41 4e 44 20  e', 'view') AND 
8020: 74 61 72 67 65 74 20 49 53 20 4e 4f 54 20 4e 55  target IS NOT NU
8030: 4c 4c 20 22 0a 20 20 20 20 20 20 22 20 25 73 20  LL ".      " %s 
8040: 22 0a 20 20 20 20 20 20 22 4f 52 44 45 52 20 42  ".      "ORDER B
8050: 59 20 6e 61 6d 65 22 0a 20 20 2c 20 72 62 75 49  Y name".  , rbuI
8060: 73 56 61 63 75 75 6d 28 70 29 20 3f 20 22 41 4e  sVacuum(p) ? "AN
8070: 44 20 72 6f 6f 74 70 61 67 65 21 3d 30 20 41 4e  D rootpage!=0 AN
8080: 44 20 72 6f 6f 74 70 61 67 65 20 49 53 20 4e 4f  D rootpage IS NO
8090: 54 20 4e 55 4c 4c 22 20 3a 20 22 22 29 29 3b 0a  T NULL" : ""));.
80a0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
80b0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
80c0: 20 70 72 65 70 61 72 65 41 6e 64 43 6f 6c 6c 65   prepareAndColle
80d0: 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 4d 61 69  ctError(p->dbMai
80e0: 6e 2c 20 26 70 49 74 65 72 2d 3e 70 49 64 78 49  n, &pIter->pIdxI
80f0: 74 65 72 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67  ter, &p->zErrmsg
8100: 2c 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45 43  ,.        "SELEC
8110: 54 20 6e 61 6d 65 2c 20 72 6f 6f 74 70 61 67 65  T name, rootpage
8120: 2c 20 73 71 6c 20 49 53 20 4e 55 4c 4c 20 4f 52  , sql IS NULL OR
8130: 20 73 75 62 73 74 72 28 38 2c 20 36 29 3d 3d 27   substr(8, 6)=='
8140: 55 4e 49 51 55 45 27 20 22 0a 20 20 20 20 20 20  UNIQUE' ".      
8150: 20 20 22 20 20 46 52 4f 4d 20 6d 61 69 6e 2e 73    "  FROM main.s
8160: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 22 0a 20  qlite_master ". 
8170: 20 20 20 20 20 20 20 22 20 20 57 48 45 52 45 20         "  WHERE 
8180: 74 79 70 65 3d 27 69 6e 64 65 78 27 20 41 4e 44  type='index' AND
8190: 20 74 62 6c 5f 6e 61 6d 65 20 3d 20 3f 22 0a 20   tbl_name = ?". 
81a0: 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 70 49 74     );.  }..  pIt
81b0: 65 72 2d 3e 62 43 6c 65 61 6e 75 70 20 3d 20 31  er->bCleanup = 1
81c0: 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a  ;.  p->rc = rc;.
81d0: 20 20 72 65 74 75 72 6e 20 72 62 75 4f 62 6a 49    return rbuObjI
81e0: 74 65 72 4e 65 78 74 28 70 2c 20 70 49 74 65 72  terNext(p, pIter
81f0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
8200: 20 69 73 20 61 20 77 72 61 70 70 65 72 20 61 72   is a wrapper ar
8210: 6f 75 6e 64 20 22 73 71 6c 69 74 65 33 5f 6d 70  ound "sqlite3_mp
8220: 72 69 6e 74 66 28 7a 46 6d 74 2c 20 2e 2e 2e 29  rintf(zFmt, ...)
8230: 22 2e 20 49 66 20 61 6e 20 4f 4f 4d 20 6f 63 63  ". If an OOM occ
8240: 75 72 73 2c 0a 2a 2a 20 61 6e 20 65 72 72 6f 72  urs,.** an error
8250: 20 63 6f 64 65 20 69 73 20 73 74 6f 72 65 64 20   code is stored 
8260: 69 6e 20 74 68 65 20 52 42 55 20 68 61 6e 64 6c  in the RBU handl
8270: 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
8280: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a  first argument..
8290: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
82a0: 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63  r has already oc
82b0: 63 75 72 72 65 64 20 28 70 2d 3e 72 63 20 69 73  curred (p->rc is
82c0: 20 61 6c 72 65 61 64 79 20 73 65 74 20 74 6f 20   already set to 
82d0: 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 0a  something other.
82e0: 2a 2a 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f  ** than SQLITE_O
82f0: 4b 29 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75  K), then this fu
8300: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 4e  nction returns N
8310: 55 4c 4c 20 77 69 74 68 6f 75 74 20 6d 6f 64 69  ULL without modi
8320: 66 79 69 6e 67 20 74 68 65 0a 2a 2a 20 73 74 6f  fying the.** sto
8330: 72 65 64 20 65 72 72 6f 72 20 63 6f 64 65 2e 20  red error code. 
8340: 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 20  In this case it 
8350: 73 74 69 6c 6c 20 63 61 6c 6c 73 20 73 71 6c 69  still calls sqli
8360: 74 65 33 5f 66 72 65 65 28 29 20 6f 6e 20 61 6e  te3_free() on an
8370: 79 20 0a 2a 2a 20 70 72 69 6e 74 66 28 29 20 70  y .** printf() p
8380: 61 72 61 6d 65 74 65 72 73 20 61 73 73 6f 63 69  arameters associ
8390: 61 74 65 64 20 77 69 74 68 20 25 7a 20 63 6f 6e  ated with %z con
83a0: 76 65 72 73 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61  versions..*/.sta
83b0: 74 69 63 20 63 68 61 72 20 2a 72 62 75 4d 50 72  tic char *rbuMPr
83c0: 69 6e 74 66 28 73 71 6c 69 74 65 33 72 62 75 20  intf(sqlite3rbu 
83d0: 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
83e0: 7a 46 6d 74 2c 20 2e 2e 2e 29 7b 0a 20 20 63 68  zFmt, ...){.  ch
83f0: 61 72 20 2a 7a 53 71 6c 20 3d 20 30 3b 0a 20 20  ar *zSql = 0;.  
8400: 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 76 61  va_list ap;.  va
8410: 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6d 74 29  _start(ap, zFmt)
8420: 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74  ;.  zSql = sqlit
8430: 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6d 74  e3_vmprintf(zFmt
8440: 2c 20 61 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e  , ap);.  if( p->
8450: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
8460: 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30  .    if( zSql==0
8470: 20 29 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54   ) p->rc = SQLIT
8480: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65  E_NOMEM;.  }else
8490: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
84a0: 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 7a 53  ee(zSql);.    zS
84b0: 71 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 76 61  ql = 0;.  }.  va
84c0: 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72 65 74 75  _end(ap);.  retu
84d0: 72 6e 20 7a 53 71 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn zSql;.}../*.*
84e0: 2a 20 41 72 67 75 6d 65 6e 74 20 7a 46 6d 74 20  * Argument zFmt 
84f0: 69 73 20 61 20 73 71 6c 69 74 65 33 5f 6d 70 72  is a sqlite3_mpr
8500: 69 6e 74 66 28 29 20 73 74 79 6c 65 20 66 6f 72  intf() style for
8510: 6d 61 74 20 73 74 72 69 6e 67 2e 20 54 68 65 20  mat string. The 
8520: 74 72 61 69 6c 69 6e 67 0a 2a 2a 20 61 72 67 75  trailing.** argu
8530: 6d 65 6e 74 73 20 61 72 65 20 74 68 65 20 75 73  ments are the us
8540: 75 61 6c 20 73 75 62 73 69 74 75 74 69 6f 6e 20  ual subsitution 
8550: 76 61 6c 75 65 73 2e 20 54 68 69 73 20 66 75 6e  values. This fun
8560: 63 74 69 6f 6e 20 70 65 72 66 6f 72 6d 73 0a 2a  ction performs.*
8570: 2a 20 74 68 65 20 70 72 69 6e 74 66 28 29 20 73  * the printf() s
8580: 74 79 6c 65 20 73 75 62 73 74 69 74 75 74 69 6f  tyle substitutio
8590: 6e 73 20 61 6e 64 20 65 78 65 63 75 74 65 73 20  ns and executes 
85a0: 74 68 65 20 72 65 73 75 6c 74 20 61 73 20 61 6e  the result as an
85b0: 20 53 51 4c 0a 2a 2a 20 73 74 61 74 65 6d 65 6e   SQL.** statemen
85c0: 74 20 6f 6e 20 74 68 65 20 52 42 55 20 68 61 6e  t on the RBU han
85d0: 64 6c 65 73 20 64 61 74 61 62 61 73 65 2e 0a 2a  dles database..*
85e0: 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
85f0: 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f   occurs, an erro
8600: 72 20 63 6f 64 65 20 61 6e 64 20 65 72 72 6f 72  r code and error
8610: 20 6d 65 73 73 61 67 65 20 69 73 20 73 74 6f 72   message is stor
8620: 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 52 42 55  ed in the.** RBU
8630: 20 68 61 6e 64 6c 65 2e 20 49 66 20 61 6e 20 65   handle. If an e
8640: 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79  rror has already
8650: 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e 20 74   occurred when t
8660: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a  his function is.
8670: 2a 2a 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73  ** called, it is
8680: 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
8690: 74 69 63 20 69 6e 74 20 72 62 75 4d 50 72 69 6e  tic int rbuMPrin
86a0: 74 66 45 78 65 63 28 73 71 6c 69 74 65 33 72 62  tfExec(sqlite3rb
86b0: 75 20 2a 70 2c 20 73 71 6c 69 74 65 33 20 2a 64  u *p, sqlite3 *d
86c0: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
86d0: 46 6d 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f  Fmt, ...){.  va_
86e0: 6c 69 73 74 20 61 70 3b 0a 20 20 63 68 61 72 20  list ap;.  char 
86f0: 2a 7a 53 71 6c 3b 0a 20 20 76 61 5f 73 74 61 72  *zSql;.  va_star
8700: 74 28 61 70 2c 20 7a 46 6d 74 29 3b 0a 20 20 7a  t(ap, zFmt);.  z
8710: 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 6d  Sql = sqlite3_vm
8720: 70 72 69 6e 74 66 28 7a 46 6d 74 2c 20 61 70 29  printf(zFmt, ap)
8730: 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ;.  if( p->rc==S
8740: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
8750: 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20  if( zSql==0 ){. 
8760: 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c       p->rc = SQL
8770: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
8780: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 72  else{.      p->r
8790: 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  c = sqlite3_exec
87a0: 28 64 62 2c 20 7a 53 71 6c 2c 20 30 2c 20 30 2c  (db, zSql, 0, 0,
87b0: 20 26 70 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a 20   &p->zErrmsg);. 
87c0: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
87d0: 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20  e3_free(zSql);. 
87e0: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72   va_end(ap);.  r
87f0: 65 74 75 72 6e 20 70 2d 3e 72 63 3b 0a 7d 0a 0a  eturn p->rc;.}..
8800: 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f  /*.** Attempt to
8810: 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72 65   allocate and re
8820: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
8830: 6f 20 61 20 7a 65 72 6f 65 64 20 62 6c 6f 63 6b  o a zeroed block
8840: 20 6f 66 20 6e 42 79 74 65 20 0a 2a 2a 20 62 79   of nByte .** by
8850: 74 65 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61  tes. .**.** If a
8860: 6e 20 65 72 72 6f 72 20 28 69 2e 65 2e 20 61 6e  n error (i.e. an
8870: 20 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e 29 20   OOM condition) 
8880: 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 4e  occurs, return N
8890: 55 4c 4c 20 61 6e 64 20 6c 65 61 76 65 20 61 6e  ULL and leave an
88a0: 20 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20   .** error code 
88b0: 69 6e 20 74 68 65 20 72 62 75 20 68 61 6e 64 6c  in the rbu handl
88c0: 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
88d0: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20  first argument. 
88e0: 4f 72 2c 20 69 66 20 61 6e 20 0a 2a 2a 20 65 72  Or, if an .** er
88f0: 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79 20  ror has already 
8900: 6f 63 63 75 72 72 65 64 20 77 68 65 6e 20 74 68  occurred when th
8910: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
8920: 61 6c 6c 65 64 2c 20 72 65 74 75 72 6e 20 4e 55  alled, return NU
8930: 4c 4c 20 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65  LL .** immediate
8940: 6c 79 20 77 69 74 68 6f 75 74 20 61 74 74 65 6d  ly without attem
8950: 70 74 69 6e 67 20 74 68 65 20 61 6c 6c 6f 63 61  pting the alloca
8960: 74 69 6f 6e 20 6f 72 20 6d 6f 64 69 66 79 69 6e  tion or modifyin
8970: 67 20 74 68 65 20 73 74 6f 72 65 64 0a 2a 2a 20  g the stored.** 
8980: 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73  error code..*/.s
8990: 74 61 74 69 63 20 76 6f 69 64 20 2a 72 62 75 4d  tatic void *rbuM
89a0: 61 6c 6c 6f 63 28 73 71 6c 69 74 65 33 72 62 75  alloc(sqlite3rbu
89b0: 20 2a 70 2c 20 69 6e 74 20 6e 42 79 74 65 29 7b   *p, int nByte){
89c0: 0a 20 20 76 6f 69 64 20 2a 70 52 65 74 20 3d 20  .  void *pRet = 
89d0: 30 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  0;.  if( p->rc==
89e0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
89f0: 20 61 73 73 65 72 74 28 20 6e 42 79 74 65 3e 30   assert( nByte>0
8a00: 20 29 3b 0a 20 20 20 20 70 52 65 74 20 3d 20 73   );.    pRet = s
8a10: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28  qlite3_malloc64(
8a20: 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20  nByte);.    if( 
8a30: 70 52 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pRet==0 ){.     
8a40: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
8a50: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65  NOMEM;.    }else
8a60: 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70  {.      memset(p
8a70: 52 65 74 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a  Ret, 0, nByte);.
8a80: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
8a90: 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 0a 2f 2a 0a  rn pRet;.}.../*.
8aa0: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20  ** Allocate and 
8ab0: 7a 65 72 6f 20 74 68 65 20 70 49 74 65 72 2d 3e  zero the pIter->
8ac0: 61 7a 54 62 6c 43 6f 6c 5b 5d 20 61 6e 64 20 61  azTblCol[] and a
8ad0: 62 54 62 6c 50 6b 5b 5d 20 61 72 72 61 79 73 20  bTblPk[] arrays 
8ae0: 73 6f 20 74 68 61 74 0a 2a 2a 20 74 68 65 72 65  so that.** there
8af0: 20 69 73 20 72 6f 6f 6d 20 66 6f 72 20 61 74 20   is room for at 
8b00: 6c 65 61 73 74 20 6e 43 6f 6c 20 65 6c 65 6d 65  least nCol eleme
8b10: 6e 74 73 2e 20 49 66 20 61 6e 20 4f 4f 4d 20 6f  nts. If an OOM o
8b20: 63 63 75 72 73 2c 20 73 74 6f 72 65 20 61 6e 0a  ccurs, store an.
8b30: 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 6e  ** error code in
8b40: 20 74 68 65 20 52 42 55 20 68 61 6e 64 6c 65 20   the RBU handle 
8b50: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
8b60: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  rst argument..*/
8b70: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75  .static void rbu
8b80: 41 6c 6c 6f 63 61 74 65 49 74 65 72 41 72 72 61  AllocateIterArra
8b90: 79 73 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70  ys(sqlite3rbu *p
8ba0: 2c 20 52 62 75 4f 62 6a 49 74 65 72 20 2a 70 49  , RbuObjIter *pI
8bb0: 74 65 72 2c 20 69 6e 74 20 6e 43 6f 6c 29 7b 0a  ter, int nCol){.
8bc0: 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 32    int nByte = (2
8bd0: 2a 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 20 2b  *sizeof(char*) +
8be0: 20 73 69 7a 65 6f 66 28 69 6e 74 29 20 2b 20 33   sizeof(int) + 3
8bf0: 2a 73 69 7a 65 6f 66 28 75 38 29 29 20 2a 20 6e  *sizeof(u8)) * n
8c00: 43 6f 6c 3b 0a 20 20 63 68 61 72 20 2a 2a 61 7a  Col;.  char **az
8c10: 4e 65 77 3b 0a 0a 20 20 61 7a 4e 65 77 20 3d 20  New;..  azNew = 
8c20: 28 63 68 61 72 2a 2a 29 72 62 75 4d 61 6c 6c 6f  (char**)rbuMallo
8c30: 63 28 70 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69  c(p, nByte);.  i
8c40: 66 28 20 61 7a 4e 65 77 20 29 7b 0a 20 20 20 20  f( azNew ){.    
8c50: 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 20  pIter->azTblCol 
8c60: 3d 20 61 7a 4e 65 77 3b 0a 20 20 20 20 70 49 74  = azNew;.    pIt
8c70: 65 72 2d 3e 61 7a 54 62 6c 54 79 70 65 20 3d 20  er->azTblType = 
8c80: 26 61 7a 4e 65 77 5b 6e 43 6f 6c 5d 3b 0a 20 20  &azNew[nCol];.  
8c90: 20 20 70 49 74 65 72 2d 3e 61 69 53 72 63 4f 72    pIter->aiSrcOr
8ca0: 64 65 72 20 3d 20 28 69 6e 74 2a 29 26 70 49 74  der = (int*)&pIt
8cb0: 65 72 2d 3e 61 7a 54 62 6c 54 79 70 65 5b 6e 43  er->azTblType[nC
8cc0: 6f 6c 5d 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  ol];.    pIter->
8cd0: 61 62 54 62 6c 50 6b 20 3d 20 28 75 38 2a 29 26  abTblPk = (u8*)&
8ce0: 70 49 74 65 72 2d 3e 61 69 53 72 63 4f 72 64 65  pIter->aiSrcOrde
8cf0: 72 5b 6e 43 6f 6c 5d 3b 0a 20 20 20 20 70 49 74  r[nCol];.    pIt
8d00: 65 72 2d 3e 61 62 4e 6f 74 4e 75 6c 6c 20 3d 20  er->abNotNull = 
8d10: 28 75 38 2a 29 26 70 49 74 65 72 2d 3e 61 62 54  (u8*)&pIter->abT
8d20: 62 6c 50 6b 5b 6e 43 6f 6c 5d 3b 0a 20 20 20 20  blPk[nCol];.    
8d30: 70 49 74 65 72 2d 3e 61 62 49 6e 64 65 78 65 64  pIter->abIndexed
8d40: 20 3d 20 28 75 38 2a 29 26 70 49 74 65 72 2d 3e   = (u8*)&pIter->
8d50: 61 62 4e 6f 74 4e 75 6c 6c 5b 6e 43 6f 6c 5d 3b  abNotNull[nCol];
8d60: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
8d70: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
8d80: 20 6d 75 73 74 20 62 65 20 61 20 6e 75 6c 2d 74   must be a nul-t
8d90: 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67  erminated string
8da0: 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  . This function.
8db0: 2a 2a 20 72 65 74 75 72 6e 73 20 61 20 63 6f 70  ** returns a cop
8dc0: 79 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67 20  y of the string 
8dd0: 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  in memory obtain
8de0: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ed from sqlite3_
8df0: 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 49 74 20  malloc()..** It 
8e00: 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62  is the responsib
8e10: 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c  ility of the cal
8e20: 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c  ler to eventuall
8e30: 79 20 66 72 65 65 20 74 68 69 73 20 6d 65 6d 6f  y free this memo
8e40: 72 79 0a 2a 2a 20 75 73 69 6e 67 20 73 71 6c 69  ry.** using sqli
8e50: 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2a 0a 2a  te3_free()..**.*
8e60: 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 63 6f 6e 64  * If an OOM cond
8e70: 69 74 69 6f 6e 20 69 73 20 65 6e 63 6f 75 6e 74  ition is encount
8e80: 65 72 65 64 20 77 68 65 6e 20 61 74 74 65 6d 70  ered when attemp
8e90: 74 69 6e 67 20 74 6f 20 61 6c 6c 6f 63 61 74 65  ting to allocate
8ea0: 20 6d 65 6d 6f 72 79 2c 0a 2a 2a 20 6f 75 74 70   memory,.** outp
8eb0: 75 74 20 76 61 72 69 61 62 6c 65 20 28 2a 70 52  ut variable (*pR
8ec0: 63 29 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c  c) is set to SQL
8ed0: 49 54 45 5f 4e 4f 4d 45 4d 20 62 65 66 6f 72 65  ITE_NOMEM before
8ee0: 20 72 65 74 75 72 6e 69 6e 67 2e 20 4f 74 68 65   returning. Othe
8ef0: 72 77 69 73 65 2c 0a 2a 2a 20 69 66 20 74 68 65  rwise,.** if the
8f00: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 75 63 63   allocation succ
8f10: 65 65 64 73 2c 20 28 2a 70 52 63 29 20 69 73 20  eeds, (*pRc) is 
8f20: 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a  left unchanged..
8f30: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
8f40: 72 62 75 53 74 72 6e 64 75 70 28 63 6f 6e 73 74  rbuStrndup(const
8f50: 20 63 68 61 72 20 2a 7a 53 74 72 2c 20 69 6e 74   char *zStr, int
8f60: 20 2a 70 52 63 29 7b 0a 20 20 63 68 61 72 20 2a   *pRc){.  char *
8f70: 7a 52 65 74 20 3d 20 30 3b 0a 0a 20 20 61 73 73  zRet = 0;..  ass
8f80: 65 72 74 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54  ert( *pRc==SQLIT
8f90: 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 7a 53  E_OK );.  if( zS
8fa0: 74 72 20 29 7b 0a 20 20 20 20 73 69 7a 65 5f 74  tr ){.    size_t
8fb0: 20 6e 43 6f 70 79 20 3d 20 73 74 72 6c 65 6e 28   nCopy = strlen(
8fc0: 7a 53 74 72 29 20 2b 20 31 3b 0a 20 20 20 20 7a  zStr) + 1;.    z
8fd0: 52 65 74 20 3d 20 28 63 68 61 72 2a 29 73 71 6c  Ret = (char*)sql
8fe0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 43  ite3_malloc64(nC
8ff0: 6f 70 79 29 3b 0a 20 20 20 20 69 66 28 20 7a 52  opy);.    if( zR
9000: 65 74 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  et ){.      memc
9010: 70 79 28 7a 52 65 74 2c 20 7a 53 74 72 2c 20 6e  py(zRet, zStr, n
9020: 43 6f 70 79 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Copy);.    }else
9030: 7b 0a 20 20 20 20 20 20 2a 70 52 63 20 3d 20 53  {.      *pRc = S
9040: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
9050: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
9060: 20 7a 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   zRet;.}../*.** 
9070: 46 69 6e 61 6c 69 7a 65 20 74 68 65 20 73 74 61  Finalize the sta
9080: 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61 73  tement passed as
9090: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
90a0: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ment..**.** If t
90b0: 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c  he sqlite3_final
90c0: 69 7a 65 28 29 20 63 61 6c 6c 20 69 6e 64 69 63  ize() call indic
90d0: 61 74 65 73 20 74 68 61 74 20 61 6e 20 65 72 72  ates that an err
90e0: 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 64 20 74  or occurs, and t
90f0: 68 65 0a 2a 2a 20 72 62 75 20 68 61 6e 64 6c 65  he.** rbu handle
9100: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 6e   error code is n
9110: 6f 74 20 61 6c 72 65 61 64 79 20 73 65 74 2c 20  ot already set, 
9120: 73 65 74 20 74 68 65 20 65 72 72 6f 72 20 63 6f  set the error co
9130: 64 65 20 61 6e 64 20 65 72 72 6f 72 0a 2a 2a 20  de and error.** 
9140: 6d 65 73 73 61 67 65 20 61 63 63 6f 72 64 69 6e  message accordin
9150: 67 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  gly..*/.static v
9160: 6f 69 64 20 72 62 75 46 69 6e 61 6c 69 7a 65 28  oid rbuFinalize(
9170: 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 73  sqlite3rbu *p, s
9180: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
9190: 6d 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  mt){.  sqlite3 *
91a0: 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 64 62 5f  db = sqlite3_db_
91b0: 68 61 6e 64 6c 65 28 70 53 74 6d 74 29 3b 0a 20  handle(pStmt);. 
91c0: 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
91d0: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
91e0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  );.  if( p->rc==
91f0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21  SQLITE_OK && rc!
9200: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
9210: 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20    p->rc = rc;.  
9220: 20 20 70 2d 3e 7a 45 72 72 6d 73 67 20 3d 20 73    p->zErrmsg = s
9230: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
9240: 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  %s", sqlite3_err
9250: 6d 73 67 28 64 62 29 29 3b 0a 20 20 7d 0a 7d 0a  msg(db));.  }.}.
9260: 0a 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68  ./* Determine th
9270: 65 20 74 79 70 65 20 6f 66 20 61 20 74 61 62 6c  e type of a tabl
9280: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 70 65 54 79 70  e..**.**   peTyp
9290: 65 20 69 73 20 6f 66 20 74 79 70 65 20 28 69 6e  e is of type (in
92a0: 74 2a 29 2c 20 61 20 70 6f 69 6e 74 65 72 20 74  t*), a pointer t
92b0: 6f 20 61 6e 20 6f 75 74 70 75 74 20 70 61 72 61  o an output para
92c0: 6d 65 74 65 72 20 6f 66 20 74 79 70 65 0a 2a 2a  meter of type.**
92d0: 20 20 20 28 69 6e 74 29 2e 20 54 68 69 73 20 63     (int). This c
92e0: 61 6c 6c 20 73 65 74 73 20 74 68 65 20 6f 75 74  all sets the out
92f0: 70 75 74 20 70 61 72 61 6d 65 74 65 72 20 61 73  put parameter as
9300: 20 66 6f 6c 6c 6f 77 73 2c 20 64 65 70 65 6e 64   follows, depend
9310: 69 6e 67 0a 2a 2a 20 20 20 6f 6e 20 74 68 65 20  ing.**   on the 
9320: 74 79 70 65 20 6f 66 20 74 68 65 20 74 61 62 6c  type of the tabl
9330: 65 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70  e specified by p
9340: 61 72 61 6d 65 74 65 72 73 20 64 62 4e 61 6d 65  arameters dbName
9350: 20 61 6e 64 20 7a 54 62 6c 2e 0a 2a 2a 0a 2a 2a   and zTbl..**.**
9360: 20 20 20 20 20 52 42 55 5f 50 4b 5f 4e 4f 54 41       RBU_PK_NOTA
9370: 42 4c 45 3a 20 20 20 20 20 20 20 4e 6f 20 73 75  BLE:       No su
9380: 63 68 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20  ch table..**    
9390: 20 52 42 55 5f 50 4b 5f 4e 4f 4e 45 3a 20 20 20   RBU_PK_NONE:   
93a0: 20 20 20 20 20 20 20 54 61 62 6c 65 20 68 61 73         Table has
93b0: 20 61 6e 20 69 6d 70 6c 69 63 69 74 20 72 6f 77   an implicit row
93c0: 69 64 2e 0a 2a 2a 20 20 20 20 20 52 42 55 5f 50  id..**     RBU_P
93d0: 4b 5f 49 50 4b 3a 20 20 20 20 20 20 20 20 20 20  K_IPK:          
93e0: 20 54 61 62 6c 65 20 68 61 73 20 61 6e 20 65 78   Table has an ex
93f0: 70 6c 69 63 69 74 20 49 50 4b 20 63 6f 6c 75 6d  plicit IPK colum
9400: 6e 2e 0a 2a 2a 20 20 20 20 20 52 42 55 5f 50 4b  n..**     RBU_PK
9410: 5f 45 58 54 45 52 4e 41 4c 3a 20 20 20 20 20 20  _EXTERNAL:      
9420: 54 61 62 6c 65 20 68 61 73 20 61 6e 20 65 78 74  Table has an ext
9430: 65 72 6e 61 6c 20 50 4b 20 69 6e 64 65 78 2e 0a  ernal PK index..
9440: 2a 2a 20 20 20 20 20 52 42 55 5f 50 4b 5f 57 49  **     RBU_PK_WI
9450: 54 48 4f 55 54 5f 52 4f 57 49 44 3a 20 54 61 62  THOUT_ROWID: Tab
9460: 6c 65 20 69 73 20 57 49 54 48 4f 55 54 20 52 4f  le is WITHOUT RO
9470: 57 49 44 2e 0a 2a 2a 20 20 20 20 20 52 42 55 5f  WID..**     RBU_
9480: 50 4b 5f 56 54 41 42 3a 20 20 20 20 20 20 20 20  PK_VTAB:        
9490: 20 20 54 61 62 6c 65 20 69 73 20 61 20 76 69 72    Table is a vir
94a0: 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a  tual table..**.*
94b0: 2a 20 20 20 41 72 67 75 6d 65 6e 74 20 2a 70 69  *   Argument *pi
94c0: 50 6b 20 69 73 20 61 6c 73 6f 20 6f 66 20 74 79  Pk is also of ty
94d0: 70 65 20 28 69 6e 74 2a 29 2c 20 61 6e 64 20 61  pe (int*), and a
94e0: 6c 73 6f 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e  lso points to an
94f0: 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20 70 61 72   output.**   par
9500: 61 6d 65 74 65 72 2e 20 55 6e 6c 65 73 73 20 74  ameter. Unless t
9510: 68 65 20 74 61 62 6c 65 20 68 61 73 20 61 6e 20  he table has an 
9520: 65 78 74 65 72 6e 61 6c 20 70 72 69 6d 61 72 79  external primary
9530: 20 6b 65 79 20 69 6e 64 65 78 20 0a 2a 2a 20 20   key index .**  
9540: 20 28 69 2e 65 2e 20 75 6e 6c 65 73 73 20 2a 70   (i.e. unless *p
9550: 65 54 79 70 65 20 69 73 20 73 65 74 20 74 6f 20  eType is set to 
9560: 33 29 2c 20 74 68 65 6e 20 2a 70 69 50 6b 20 69  3), then *piPk i
9570: 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 4f  s set to zero. O
9580: 72 2c 0a 2a 2a 20 20 20 69 66 20 74 68 65 20 74  r,.**   if the t
9590: 61 62 6c 65 20 64 6f 65 73 20 68 61 76 65 20 61  able does have a
95a0: 6e 20 65 78 74 65 72 6e 61 6c 20 70 72 69 6d 61  n external prima
95b0: 72 79 20 6b 65 79 20 69 6e 64 65 78 2c 20 74 68  ry key index, th
95c0: 65 6e 20 2a 70 69 50 6b 0a 2a 2a 20 20 20 69 73  en *piPk.**   is
95d0: 20 73 65 74 20 74 6f 20 74 68 65 20 72 6f 6f 74   set to the root
95e0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
95f0: 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20  the primary key 
9600: 69 6e 64 65 78 20 62 65 66 6f 72 65 0a 2a 2a 20  index before.** 
9610: 20 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a    returning..**.
9620: 2a 2a 20 41 4c 47 4f 52 49 54 48 4d 3a 0a 2a 2a  ** ALGORITHM:.**
9630: 0a 2a 2a 20 20 20 69 66 28 20 6e 6f 20 65 6e 74  .**   if( no ent
9640: 72 79 20 65 78 69 73 74 73 20 69 6e 20 73 71 6c  ry exists in sql
9650: 69 74 65 5f 6d 61 73 74 65 72 20 29 7b 0a 2a 2a  ite_master ){.**
9660: 20 20 20 20 20 72 65 74 75 72 6e 20 52 42 55 5f       return RBU_
9670: 50 4b 5f 4e 4f 54 41 42 4c 45 0a 2a 2a 20 20 20  PK_NOTABLE.**   
9680: 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 20 66 6f  }else if( sql fo
9690: 72 20 74 68 65 20 65 6e 74 72 79 20 73 74 61 72  r the entry star
96a0: 74 73 20 77 69 74 68 20 22 43 52 45 41 54 45 20  ts with "CREATE 
96b0: 56 49 52 54 55 41 4c 22 20 29 7b 0a 2a 2a 20 20  VIRTUAL" ){.**  
96c0: 20 20 20 72 65 74 75 72 6e 20 52 42 55 5f 50 4b     return RBU_PK
96d0: 5f 56 54 41 42 0a 2a 2a 20 20 20 7d 65 6c 73 65  _VTAB.**   }else
96e0: 20 69 66 28 20 22 50 52 41 47 4d 41 20 69 6e 64   if( "PRAGMA ind
96f0: 65 78 5f 6c 69 73 74 28 29 22 20 66 6f 72 20 74  ex_list()" for t
9700: 68 65 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e  he table contain
9710: 73 20 61 20 22 70 6b 22 20 69 6e 64 65 78 20 29  s a "pk" index )
9720: 7b 0a 2a 2a 20 20 20 20 20 69 66 28 20 74 68 65  {.**     if( the
9730: 20 69 6e 64 65 78 20 74 68 61 74 20 69 73 20 74   index that is t
9740: 68 65 20 70 6b 20 65 78 69 73 74 73 20 69 6e 20  he pk exists in 
9750: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 29 7b  sqlite_master ){
9760: 0a 2a 2a 20 20 20 20 20 20 20 2a 70 69 50 4b 20  .**       *piPK 
9770: 3d 20 72 6f 6f 74 70 61 67 65 20 6f 66 20 74 68  = rootpage of th
9780: 61 74 20 69 6e 64 65 78 2e 0a 2a 2a 20 20 20 20  at index..**    
9790: 20 20 20 72 65 74 75 72 6e 20 52 42 55 5f 50 4b     return RBU_PK
97a0: 5f 45 58 54 45 52 4e 41 4c 0a 2a 2a 20 20 20 20  _EXTERNAL.**    
97b0: 20 7d 65 6c 73 65 7b 0a 2a 2a 20 20 20 20 20 20   }else{.**      
97c0: 20 72 65 74 75 72 6e 20 52 42 55 5f 50 4b 5f 57   return RBU_PK_W
97d0: 49 54 48 4f 55 54 5f 52 4f 57 49 44 0a 2a 2a 20  ITHOUT_ROWID.** 
97e0: 20 20 20 20 7d 0a 2a 2a 20 20 20 7d 65 6c 73 65      }.**   }else
97f0: 20 69 66 28 20 22 50 52 41 47 4d 41 20 74 61 62   if( "PRAGMA tab
9800: 6c 65 5f 69 6e 66 6f 28 29 22 20 6c 69 73 74 73  le_info()" lists
9810: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 22 70 6b   one or more "pk
9820: 22 20 63 6f 6c 75 6d 6e 73 20 29 7b 0a 2a 2a 20  " columns ){.** 
9830: 20 20 20 20 72 65 74 75 72 6e 20 52 42 55 5f 50      return RBU_P
9840: 4b 5f 49 50 4b 0a 2a 2a 20 20 20 7d 65 6c 73 65  K_IPK.**   }else
9850: 7b 0a 2a 2a 20 20 20 20 20 72 65 74 75 72 6e 20  {.**     return 
9860: 52 42 55 5f 50 4b 5f 4e 4f 4e 45 0a 2a 2a 20 20  RBU_PK_NONE.**  
9870: 20 7d 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69   }.*/.static voi
9880: 64 20 72 62 75 54 61 62 6c 65 54 79 70 65 28 0a  d rbuTableType(.
9890: 20 20 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c    sqlite3rbu *p,
98a0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
98b0: 54 61 62 2c 0a 20 20 69 6e 74 20 2a 70 65 54 79  Tab,.  int *peTy
98c0: 70 65 2c 0a 20 20 69 6e 74 20 2a 70 69 54 6e 75  pe,.  int *piTnu
98d0: 6d 2c 0a 20 20 69 6e 74 20 2a 70 69 50 6b 0a 29  m,.  int *piPk.)
98e0: 7b 0a 20 20 2f 2a 0a 20 20 2a 2a 20 30 29 20 53  {.  /*.  ** 0) S
98f0: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
9900: 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
9910: 72 20 77 68 65 72 65 20 6e 61 6d 65 3d 25 51 20  r where name=%Q 
9920: 41 4e 44 20 49 73 56 69 72 74 75 61 6c 28 25 51  AND IsVirtual(%Q
9930: 29 0a 20 20 2a 2a 20 31 29 20 50 52 41 47 4d 41  ).  ** 1) PRAGMA
9940: 20 69 6e 64 65 78 5f 6c 69 73 74 20 3d 20 3f 0a   index_list = ?.
9950: 20 20 2a 2a 20 32 29 20 53 45 4c 45 43 54 20 63    ** 2) SELECT c
9960: 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 73 71 6c  ount(*) FROM sql
9970: 69 74 65 5f 6d 61 73 74 65 72 20 77 68 65 72 65  ite_master where
9980: 20 6e 61 6d 65 3d 25 51 20 0a 20 20 2a 2a 20 33   name=%Q .  ** 3
9990: 29 20 50 52 41 47 4d 41 20 74 61 62 6c 65 5f 69  ) PRAGMA table_i
99a0: 6e 66 6f 20 3d 20 3f 0a 20 20 2a 2f 0a 20 20 73  nfo = ?.  */.  s
99b0: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 61 53 74  qlite3_stmt *aSt
99c0: 6d 74 5b 34 5d 20 3d 20 7b 30 2c 20 30 2c 20 30  mt[4] = {0, 0, 0
99d0: 2c 20 30 7d 3b 0a 0a 20 20 2a 70 65 54 79 70 65  , 0};..  *peType
99e0: 20 3d 20 52 42 55 5f 50 4b 5f 4e 4f 54 41 42 4c   = RBU_PK_NOTABL
99f0: 45 3b 0a 20 20 2a 70 69 50 6b 20 3d 20 30 3b 0a  E;.  *piPk = 0;.
9a00: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63  .  assert( p->rc
9a10: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
9a20: 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65   p->rc = prepare
9a30: 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72  FreeAndCollectEr
9a40: 72 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 26  ror(p->dbMain, &
9a50: 61 53 74 6d 74 5b 30 5d 2c 20 26 70 2d 3e 7a 45  aStmt[0], &p->zE
9a60: 72 72 6d 73 67 2c 20 0a 20 20 20 20 73 71 6c 69  rrmsg, .    sqli
9a70: 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20  te3_mprintf(.   
9a80: 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 28         "SELECT (
9a90: 73 71 6c 20 4c 49 4b 45 20 27 63 72 65 61 74 65  sql LIKE 'create
9aa0: 20 76 69 72 74 75 61 6c 25 25 27 29 2c 20 72 6f   virtual%%'), ro
9ab0: 6f 74 70 61 67 65 22 0a 20 20 20 20 20 20 20 20  otpage".        
9ac0: 20 20 22 20 20 46 52 4f 4d 20 73 71 6c 69 74 65    "  FROM sqlite
9ad0: 5f 6d 61 73 74 65 72 22 0a 20 20 20 20 20 20 20  _master".       
9ae0: 20 20 20 22 20 57 48 45 52 45 20 6e 61 6d 65 3d     " WHERE name=
9af0: 25 51 22 2c 20 7a 54 61 62 0a 20 20 29 29 3b 0a  %Q", zTab.  ));.
9b00: 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c    if( p->rc!=SQL
9b10: 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74 65  ITE_OK || sqlite
9b20: 33 5f 73 74 65 70 28 61 53 74 6d 74 5b 30 5d 29  3_step(aStmt[0])
9b30: 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  !=SQLITE_ROW ){.
9b40: 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20 61 6e      /* Either an
9b50: 20 65 72 72 6f 72 2c 20 6f 72 20 6e 6f 20 73 75   error, or no su
9b60: 63 68 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20  ch 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 69 66  pe_end;.  }.  if
9b90: 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  ( sqlite3_column
9ba0: 5f 69 6e 74 28 61 53 74 6d 74 5b 30 5d 2c 20 30  _int(aStmt[0], 0
9bb0: 29 20 29 7b 0a 20 20 20 20 2a 70 65 54 79 70 65  ) ){.    *peType
9bc0: 20 3d 20 52 42 55 5f 50 4b 5f 56 54 41 42 3b 20   = RBU_PK_VTAB; 
9bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9be0: 20 20 20 20 2f 2a 20 76 69 72 74 75 61 6c 20 74      /* virtual t
9bf0: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 67 6f 74 6f  able */.    goto
9c00: 20 72 62 75 54 61 62 6c 65 54 79 70 65 5f 65 6e   rbuTableType_en
9c10: 64 3b 0a 20 20 7d 0a 20 20 2a 70 69 54 6e 75 6d  d;.  }.  *piTnum
9c20: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
9c30: 6e 5f 69 6e 74 28 61 53 74 6d 74 5b 30 5d 2c 20  n_int(aStmt[0], 
9c40: 31 29 3b 0a 0a 20 20 70 2d 3e 72 63 20 3d 20 70  1);..  p->rc = p
9c50: 72 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f 6c  repareFreeAndCol
9c60: 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 4d  lectError(p->dbM
9c70: 61 69 6e 2c 20 26 61 53 74 6d 74 5b 31 5d 2c 20  ain, &aStmt[1], 
9c80: 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 20 0a 20 20  &p->zErrmsg, .  
9c90: 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74    sqlite3_mprint
9ca0: 66 28 22 50 52 41 47 4d 41 20 69 6e 64 65 78 5f  f("PRAGMA index_
9cb0: 6c 69 73 74 3d 25 51 22 2c 7a 54 61 62 29 0a 20  list=%Q",zTab). 
9cc0: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 20   );.  if( p->rc 
9cd0: 29 20 67 6f 74 6f 20 72 62 75 54 61 62 6c 65 54  ) goto rbuTableT
9ce0: 79 70 65 5f 65 6e 64 3b 0a 20 20 77 68 69 6c 65  ype_end;.  while
9cf0: 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 61  ( sqlite3_step(a
9d00: 53 74 6d 74 5b 31 5d 29 3d 3d 53 51 4c 49 54 45  Stmt[1])==SQLITE
9d10: 5f 52 4f 57 20 29 7b 0a 20 20 20 20 63 6f 6e 73  _ROW ){.    cons
9d20: 74 20 75 38 20 2a 7a 4f 72 69 67 20 3d 20 73 71  t u8 *zOrig = sq
9d30: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
9d40: 74 28 61 53 74 6d 74 5b 31 5d 2c 20 33 29 3b 0a  t(aStmt[1], 3);.
9d50: 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 7a 49      const u8 *zI
9d60: 64 78 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  dx = sqlite3_col
9d70: 75 6d 6e 5f 74 65 78 74 28 61 53 74 6d 74 5b 31  umn_text(aStmt[1
9d80: 5d 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 7a  ], 1);.    if( z
9d90: 4f 72 69 67 20 26 26 20 7a 49 64 78 20 26 26 20  Orig && zIdx && 
9da0: 7a 4f 72 69 67 5b 30 5d 3d 3d 27 70 27 20 29 7b  zOrig[0]=='p' ){
9db0: 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 70  .      p->rc = p
9dc0: 72 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f 6c  repareFreeAndCol
9dd0: 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 4d  lectError(p->dbM
9de0: 61 69 6e 2c 20 26 61 53 74 6d 74 5b 32 5d 2c 20  ain, &aStmt[2], 
9df0: 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 20 0a 20 20  &p->zErrmsg, .  
9e00: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
9e10: 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20  mprintf(.       
9e20: 20 20 20 20 20 22 53 45 4c 45 43 54 20 72 6f 6f       "SELECT roo
9e30: 74 70 61 67 65 20 46 52 4f 4d 20 73 71 6c 69 74  tpage FROM sqlit
9e40: 65 5f 6d 61 73 74 65 72 20 57 48 45 52 45 20 6e  e_master WHERE n
9e50: 61 6d 65 20 3d 20 25 51 22 2c 20 7a 49 64 78 0a  ame = %Q", zIdx.
9e60: 20 20 20 20 20 20 29 29 3b 0a 20 20 20 20 20 20        ));.      
9e70: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
9e80: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
9e90: 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70  if( sqlite3_step
9ea0: 28 61 53 74 6d 74 5b 32 5d 29 3d 3d 53 51 4c 49  (aStmt[2])==SQLI
9eb0: 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20  TE_ROW ){.      
9ec0: 20 20 20 20 2a 70 69 50 6b 20 3d 20 73 71 6c 69      *piPk = sqli
9ed0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 61  te3_column_int(a
9ee0: 53 74 6d 74 5b 32 5d 2c 20 30 29 3b 0a 20 20 20  Stmt[2], 0);.   
9ef0: 20 20 20 20 20 20 20 2a 70 65 54 79 70 65 20 3d         *peType =
9f00: 20 52 42 55 5f 50 4b 5f 45 58 54 45 52 4e 41 4c   RBU_PK_EXTERNAL
9f10: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
9f20: 0a 20 20 20 20 20 20 20 20 20 20 2a 70 65 54 79  .          *peTy
9f30: 70 65 20 3d 20 52 42 55 5f 50 4b 5f 57 49 54 48  pe = RBU_PK_WITH
9f40: 4f 55 54 5f 52 4f 57 49 44 3b 0a 20 20 20 20 20  OUT_ROWID;.     
9f50: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
9f60: 20 20 20 67 6f 74 6f 20 72 62 75 54 61 62 6c 65     goto rbuTable
9f70: 54 79 70 65 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  Type_end;.    }.
9f80: 20 20 7d 0a 0a 20 20 70 2d 3e 72 63 20 3d 20 70    }..  p->rc = p
9f90: 72 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f 6c  repareFreeAndCol
9fa0: 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 4d  lectError(p->dbM
9fb0: 61 69 6e 2c 20 26 61 53 74 6d 74 5b 33 5d 2c 20  ain, &aStmt[3], 
9fc0: 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 20 0a 20 20  &p->zErrmsg, .  
9fd0: 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74    sqlite3_mprint
9fe0: 66 28 22 50 52 41 47 4d 41 20 74 61 62 6c 65 5f  f("PRAGMA table_
9ff0: 69 6e 66 6f 3d 25 51 22 2c 7a 54 61 62 29 0a 20  info=%Q",zTab). 
a000: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d   );.  if( p->rc=
a010: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
a020: 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33    while( sqlite3
a030: 5f 73 74 65 70 28 61 53 74 6d 74 5b 33 5d 29 3d  _step(aStmt[3])=
a040: 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
a050: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
a060: 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 61 53 74 6d  _column_int(aStm
a070: 74 5b 33 5d 2c 35 29 3e 30 20 29 7b 0a 20 20 20  t[3],5)>0 ){.   
a080: 20 20 20 20 20 2a 70 65 54 79 70 65 20 3d 20 52       *peType = R
a090: 42 55 5f 50 4b 5f 49 50 4b 3b 20 20 20 20 20 20  BU_PK_IPK;      
a0a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 65 78 70            /* exp
a0b0: 6c 69 63 69 74 20 49 50 4b 20 63 6f 6c 75 6d 6e  licit IPK column
a0c0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   */.        goto
a0d0: 20 72 62 75 54 61 62 6c 65 54 79 70 65 5f 65 6e   rbuTableType_en
a0e0: 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  d;.      }.    }
a0f0: 0a 20 20 20 20 2a 70 65 54 79 70 65 20 3d 20 52  .    *peType = R
a100: 42 55 5f 50 4b 5f 4e 4f 4e 45 3b 0a 20 20 7d 0a  BU_PK_NONE;.  }.
a110: 0a 72 62 75 54 61 62 6c 65 54 79 70 65 5f 65 6e  .rbuTableType_en
a120: 64 3a 20 7b 0a 20 20 20 20 75 6e 73 69 67 6e 65  d: {.    unsigne
a130: 64 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72  d int i;.    for
a140: 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61  (i=0; i<sizeof(a
a150: 53 74 6d 74 29 2f 73 69 7a 65 6f 66 28 61 53 74  Stmt)/sizeof(aSt
a160: 6d 74 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20  mt[0]); i++){.  
a170: 20 20 20 20 72 62 75 46 69 6e 61 6c 69 7a 65 28      rbuFinalize(
a180: 70 2c 20 61 53 74 6d 74 5b 69 5d 29 3b 0a 20 20  p, aStmt[i]);.  
a190: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
a1a0: 20 54 68 69 73 20 69 73 20 61 20 68 65 6c 70 65   This is a helpe
a1b0: 72 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 72  r function for r
a1c0: 62 75 4f 62 6a 49 74 65 72 43 61 63 68 65 54 61  buObjIterCacheTa
a1d0: 62 6c 65 49 6e 66 6f 28 29 2e 20 49 74 20 70 6f  bleInfo(). It po
a1e0: 70 75 6c 61 74 65 73 0a 2a 2a 20 74 68 65 20 70  pulates.** the p
a1f0: 49 74 65 72 2d 3e 61 62 49 6e 64 65 78 65 64 5b  Iter->abIndexed[
a200: 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74  ] array..*/.stat
a210: 69 63 20 76 6f 69 64 20 72 62 75 4f 62 6a 49 74  ic void rbuObjIt
a220: 65 72 43 61 63 68 65 49 6e 64 65 78 65 64 43 6f  erCacheIndexedCo
a230: 6c 73 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70  ls(sqlite3rbu *p
a240: 2c 20 52 62 75 4f 62 6a 49 74 65 72 20 2a 70 49  , RbuObjIter *pI
a250: 74 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  ter){.  sqlite3_
a260: 73 74 6d 74 20 2a 70 4c 69 73 74 20 3d 20 30 3b  stmt *pList = 0;
a270: 0a 20 20 69 6e 74 20 62 49 6e 64 65 78 20 3d 20  .  int bIndex = 
a280: 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  0;..  if( p->rc=
a290: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
a2a0: 20 20 6d 65 6d 63 70 79 28 70 49 74 65 72 2d 3e    memcpy(pIter->
a2b0: 61 62 49 6e 64 65 78 65 64 2c 20 70 49 74 65 72  abIndexed, pIter
a2c0: 2d 3e 61 62 54 62 6c 50 6b 2c 20 73 69 7a 65 6f  ->abTblPk, sizeo
a2d0: 66 28 75 38 29 2a 70 49 74 65 72 2d 3e 6e 54 62  f(u8)*pIter->nTb
a2e0: 6c 43 6f 6c 29 3b 0a 20 20 20 20 70 2d 3e 72 63  lCol);.    p->rc
a2f0: 20 3d 20 70 72 65 70 61 72 65 46 72 65 65 41 6e   = prepareFreeAn
a300: 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d  dCollectError(p-
a310: 3e 64 62 4d 61 69 6e 2c 20 26 70 4c 69 73 74 2c  >dbMain, &pList,
a320: 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 0a 20 20   &p->zErrmsg,.  
a330: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70        sqlite3_mp
a340: 72 69 6e 74 66 28 22 50 52 41 47 4d 41 20 6d 61  rintf("PRAGMA ma
a350: 69 6e 2e 69 6e 64 65 78 5f 6c 69 73 74 20 3d 20  in.index_list = 
a360: 25 51 22 2c 20 70 49 74 65 72 2d 3e 7a 54 62 6c  %Q", pIter->zTbl
a370: 29 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20  ).    );.  }..  
a380: 70 49 74 65 72 2d 3e 6e 49 6e 64 65 78 20 3d 20  pIter->nIndex = 
a390: 30 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 72  0;.  while( p->r
a3a0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
a3b0: 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69  SQLITE_ROW==sqli
a3c0: 74 65 33 5f 73 74 65 70 28 70 4c 69 73 74 29 20  te3_step(pList) 
a3d0: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
a3e0: 72 20 2a 7a 49 64 78 20 3d 20 28 63 6f 6e 73 74  r *zIdx = (const
a3f0: 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63   char*)sqlite3_c
a400: 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 4c 69 73 74  olumn_text(pList
a410: 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 1);.    sqlite
a420: 33 5f 73 74 6d 74 20 2a 70 58 49 6e 66 6f 20 3d  3_stmt *pXInfo =
a430: 20 30 3b 0a 20 20 20 20 69 66 28 20 7a 49 64 78   0;.    if( zIdx
a440: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
a450: 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65   p->rc = prepare
a460: 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72  FreeAndCollectEr
a470: 72 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 26  ror(p->dbMain, &
a480: 70 58 49 6e 66 6f 2c 20 26 70 2d 3e 7a 45 72 72  pXInfo, &p->zErr
a490: 6d 73 67 2c 0a 20 20 20 20 20 20 20 20 73 71 6c  msg,.        sql
a4a0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 50 52  ite3_mprintf("PR
a4b0: 41 47 4d 41 20 6d 61 69 6e 2e 69 6e 64 65 78 5f  AGMA main.index_
a4c0: 78 69 6e 66 6f 20 3d 20 25 51 22 2c 20 7a 49 64  xinfo = %Q", zId
a4d0: 78 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 77 68  x).    );.    wh
a4e0: 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ile( p->rc==SQLI
a4f0: 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f  TE_OK && SQLITE_
a500: 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW==sqlite3_ste
a510: 70 28 70 58 49 6e 66 6f 29 20 29 7b 0a 20 20 20  p(pXInfo) ){.   
a520: 20 20 20 69 6e 74 20 69 43 69 64 20 3d 20 73 71     int iCid = sq
a530: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
a540: 28 70 58 49 6e 66 6f 2c 20 31 29 3b 0a 20 20 20  (pXInfo, 1);.   
a550: 20 20 20 69 66 28 20 69 43 69 64 3e 3d 30 20 29     if( iCid>=0 )
a560: 20 70 49 74 65 72 2d 3e 61 62 49 6e 64 65 78 65   pIter->abIndexe
a570: 64 5b 69 43 69 64 5d 20 3d 20 31 3b 0a 20 20 20  d[iCid] = 1;.   
a580: 20 7d 0a 20 20 20 20 72 62 75 46 69 6e 61 6c 69   }.    rbuFinali
a590: 7a 65 28 70 2c 20 70 58 49 6e 66 6f 29 3b 0a 20  ze(p, pXInfo);. 
a5a0: 20 20 20 62 49 6e 64 65 78 20 3d 20 31 3b 0a 20     bIndex = 1;. 
a5b0: 20 20 20 70 49 74 65 72 2d 3e 6e 49 6e 64 65 78     pIter->nIndex
a5c0: 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  ++;.  }..  if( p
a5d0: 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55  Iter->eType==RBU
a5e0: 5f 50 4b 5f 57 49 54 48 4f 55 54 5f 52 4f 57 49  _PK_WITHOUT_ROWI
a5f0: 44 20 29 7b 0a 20 20 20 20 2f 2a 20 22 50 52 41  D ){.    /* "PRA
a600: 47 4d 41 20 69 6e 64 65 78 5f 6c 69 73 74 22 20  GMA index_list" 
a610: 69 6e 63 6c 75 64 65 73 20 74 68 65 20 6d 61 69  includes the mai
a620: 6e 20 50 4b 20 62 2d 74 72 65 65 20 2a 2f 0a 20  n PK b-tree */. 
a630: 20 20 20 70 49 74 65 72 2d 3e 6e 49 6e 64 65 78     pIter->nIndex
a640: 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 72 62 75 46 69  --;.  }..  rbuFi
a650: 6e 61 6c 69 7a 65 28 70 2c 20 70 4c 69 73 74 29  nalize(p, pList)
a660: 3b 0a 20 20 69 66 28 20 62 49 6e 64 65 78 3d 3d  ;.  if( bIndex==
a670: 30 20 29 20 70 49 74 65 72 2d 3e 61 62 49 6e 64  0 ) pIter->abInd
a680: 65 78 65 64 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a  exed = 0;.}.../*
a690: 0a 2a 2a 20 49 66 20 74 68 65 79 20 61 72 65 20  .** If they are 
a6a0: 6e 6f 74 20 61 6c 72 65 61 64 79 20 70 6f 70 75  not already popu
a6b0: 6c 61 74 65 64 2c 20 70 6f 70 75 6c 61 74 65 20  lated, populate 
a6c0: 74 68 65 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c  the pIter->azTbl
a6d0: 43 6f 6c 5b 5d 2c 0a 2a 2a 20 70 49 74 65 72 2d  Col[],.** pIter-
a6e0: 3e 61 62 54 62 6c 50 6b 5b 5d 2c 20 70 49 74 65  >abTblPk[], pIte
a6f0: 72 2d 3e 6e 54 62 6c 43 6f 6c 20 61 6e 64 20 70  r->nTblCol and p
a700: 49 74 65 72 2d 3e 62 52 6f 77 69 64 20 76 61 72  Iter->bRowid var
a710: 69 61 62 6c 65 73 20 61 63 63 6f 72 64 69 6e 67  iables according
a720: 20 74 6f 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   to.** the table
a730: 20 28 6e 6f 74 20 69 6e 64 65 78 29 20 74 68 61   (not index) tha
a740: 74 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 63  t the iterator c
a750: 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20  urrently points 
a760: 74 6f 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  to..**.** Return
a770: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75   SQLITE_OK if su
a780: 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20  ccessful, or an 
a790: 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
a7a0: 65 20 6f 74 68 65 72 77 69 73 65 2e 20 49 66 0a  e otherwise. If.
a7b0: 2a 2a 20 61 6e 20 65 72 72 6f 72 20 64 6f 65 73  ** an error does
a7c0: 20 6f 63 63 75 72 2c 20 61 6e 20 65 72 72 6f 72   occur, an error
a7d0: 20 63 6f 64 65 20 61 6e 64 20 65 72 72 6f 72 20   code and error 
a7e0: 6d 65 73 73 61 67 65 20 61 72 65 20 61 6c 73 6f  message are also
a7f0: 20 6c 65 66 74 20 69 6e 20 0a 2a 2a 20 74 68 65   left in .** the
a800: 20 52 42 55 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a   RBU handle..*/.
a810: 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 4f 62  static int rbuOb
a820: 6a 49 74 65 72 43 61 63 68 65 54 61 62 6c 65 49  jIterCacheTableI
a830: 6e 66 6f 28 73 71 6c 69 74 65 33 72 62 75 20 2a  nfo(sqlite3rbu *
a840: 70 2c 20 52 62 75 4f 62 6a 49 74 65 72 20 2a 70  p, RbuObjIter *p
a850: 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70 49 74  Iter){.  if( pIt
a860: 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 3d 3d 30 20  er->azTblCol==0 
a870: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
a880: 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a  tmt *pStmt = 0;.
a890: 20 20 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 30      int nCol = 0
a8a0: 3b 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20  ;.    int i;    
a8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a8c0: 20 20 20 20 2f 2a 20 66 6f 72 28 29 20 6c 6f 6f      /* for() loo
a8d0: 70 20 69 74 65 72 61 74 6f 72 20 76 61 72 69 61  p iterator varia
a8e0: 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62  ble */.    int b
a8f0: 52 62 75 52 6f 77 69 64 20 3d 20 30 3b 20 20 20  RbuRowid = 0;   
a900: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69           /* If i
a910: 6e 70 75 74 20 74 61 62 6c 65 20 68 61 73 20 63  nput table has c
a920: 6f 6c 75 6d 6e 20 22 72 62 75 5f 72 6f 77 69 64  olumn "rbu_rowid
a930: 22 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4f 72  " */.    int iOr
a940: 64 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  der = 0;.    int
a950: 20 69 54 6e 75 6d 20 3d 20 30 3b 0a 0a 20 20 20   iTnum = 0;..   
a960: 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74   /* Figure out t
a970: 68 65 20 74 79 70 65 20 6f 66 20 74 61 62 6c 65  he type of table
a980: 20 74 68 69 73 20 73 74 65 70 20 77 69 6c 6c 20   this step will 
a990: 64 65 61 6c 20 77 69 74 68 2e 20 2a 2f 0a 20 20  deal with. */.  
a9a0: 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
a9b0: 3e 65 54 79 70 65 3d 3d 30 20 29 3b 0a 20 20 20  >eType==0 );.   
a9c0: 20 72 62 75 54 61 62 6c 65 54 79 70 65 28 70 2c   rbuTableType(p,
a9d0: 20 70 49 74 65 72 2d 3e 7a 54 62 6c 2c 20 26 70   pIter->zTbl, &p
a9e0: 49 74 65 72 2d 3e 65 54 79 70 65 2c 20 26 69 54  Iter->eType, &iT
a9f0: 6e 75 6d 2c 20 26 70 49 74 65 72 2d 3e 69 50 6b  num, &pIter->iPk
aa00: 54 6e 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 70  Tnum);.    if( p
aa10: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
aa20: 26 26 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d  && pIter->eType=
aa30: 3d 52 42 55 5f 50 4b 5f 4e 4f 54 41 42 4c 45 20  =RBU_PK_NOTABLE 
aa40: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  ){.      p->rc =
aa50: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
aa60: 20 20 20 20 20 70 2d 3e 7a 45 72 72 6d 73 67 20       p->zErrmsg 
aa70: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
aa80: 66 28 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65  f("no such table
aa90: 3a 20 25 73 22 2c 20 70 49 74 65 72 2d 3e 7a 54  : %s", pIter->zT
aaa0: 62 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  bl);.    }.    i
aab0: 66 28 20 70 2d 3e 72 63 20 29 20 72 65 74 75 72  f( p->rc ) retur
aac0: 6e 20 70 2d 3e 72 63 3b 0a 20 20 20 20 69 66 28  n p->rc;.    if(
aad0: 20 70 49 74 65 72 2d 3e 7a 49 64 78 3d 3d 30 20   pIter->zIdx==0 
aae0: 29 20 70 49 74 65 72 2d 3e 69 54 6e 75 6d 20 3d  ) pIter->iTnum =
aaf0: 20 69 54 6e 75 6d 3b 0a 0a 20 20 20 20 61 73 73   iTnum;..    ass
ab00: 65 72 74 28 20 70 49 74 65 72 2d 3e 65 54 79 70  ert( pIter->eTyp
ab10: 65 3d 3d 52 42 55 5f 50 4b 5f 4e 4f 4e 45 20 7c  e==RBU_PK_NONE |
ab20: 7c 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d  | pIter->eType==
ab30: 52 42 55 5f 50 4b 5f 49 50 4b 20 0a 20 20 20 20  RBU_PK_IPK .    
ab40: 20 20 20 20 20 7c 7c 20 70 49 74 65 72 2d 3e 65       || pIter->e
ab50: 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 45 58 54  Type==RBU_PK_EXT
ab60: 45 52 4e 41 4c 20 7c 7c 20 70 49 74 65 72 2d 3e  ERNAL || pIter->
ab70: 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 57 49  eType==RBU_PK_WI
ab80: 54 48 4f 55 54 5f 52 4f 57 49 44 0a 20 20 20 20  THOUT_ROWID.    
ab90: 20 20 20 20 20 7c 7c 20 70 49 74 65 72 2d 3e 65       || pIter->e
aba0: 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 56 54 41  Type==RBU_PK_VTA
abb0: 42 0a 20 20 20 20 29 3b 0a 0a 20 20 20 20 2f 2a  B.    );..    /*
abc0: 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 61 7a   Populate the az
abd0: 54 62 6c 43 6f 6c 5b 5d 20 61 6e 64 20 6e 54 62  TblCol[] and nTb
abe0: 6c 43 6f 6c 20 76 61 72 69 61 62 6c 65 73 20 62  lCol variables b
abf0: 61 73 65 64 20 6f 6e 20 74 68 65 20 63 6f 6c 75  ased on the colu
ac00: 6d 6e 73 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  mns.    ** of th
ac10: 65 20 69 6e 70 75 74 20 74 61 62 6c 65 2e 20 49  e input table. I
ac20: 67 6e 6f 72 65 20 61 6e 79 20 69 6e 70 75 74 20  gnore any input 
ac30: 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20 74 68  table columns th
ac40: 61 74 20 62 65 67 69 6e 20 77 69 74 68 0a 20 20  at begin with.  
ac50: 20 20 2a 2a 20 22 72 62 75 5f 22 2e 20 20 2a 2f    ** "rbu_".  */
ac60: 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 72 65  .    p->rc = pre
ac70: 70 61 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65  pareFreeAndColle
ac80: 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 52 62 75  ctError(p->dbRbu
ac90: 2c 20 26 70 53 74 6d 74 2c 20 26 70 2d 3e 7a 45  , &pStmt, &p->zE
aca0: 72 72 6d 73 67 2c 20 0a 20 20 20 20 20 20 20 20  rrmsg, .        
acb0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
acc0: 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 27  "SELECT * FROM '
acd0: 25 71 27 22 2c 20 70 49 74 65 72 2d 3e 7a 44 61  %q'", pIter->zDa
ace0: 74 61 54 62 6c 29 0a 20 20 20 20 29 3b 0a 20 20  taTbl).    );.  
acf0: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
ad00: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
ad10: 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63  nCol = sqlite3_c
ad20: 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d  olumn_count(pStm
ad30: 74 29 3b 0a 20 20 20 20 20 20 72 62 75 41 6c 6c  t);.      rbuAll
ad40: 6f 63 61 74 65 49 74 65 72 41 72 72 61 79 73 28  ocateIterArrays(
ad50: 70 2c 20 70 49 74 65 72 2c 20 6e 43 6f 6c 29 3b  p, pIter, nCol);
ad60: 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
ad70: 3d 30 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  =0; p->rc==SQLIT
ad80: 45 5f 4f 4b 20 26 26 20 69 3c 6e 43 6f 6c 3b 20  E_OK && i<nCol; 
ad90: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  i++){.      cons
ada0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20  t char *zName = 
adb0: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
adc0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65  ite3_column_name
add0: 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20  (pStmt, i);.    
ade0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
adf0: 72 6e 69 63 6d 70 28 22 72 62 75 5f 22 2c 20 7a  rnicmp("rbu_", z
ae00: 4e 61 6d 65 2c 20 34 29 20 29 7b 0a 20 20 20 20  Name, 4) ){.    
ae10: 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 70 79 20      char *zCopy 
ae20: 3d 20 72 62 75 53 74 72 6e 64 75 70 28 7a 4e 61  = rbuStrndup(zNa
ae30: 6d 65 2c 20 26 70 2d 3e 72 63 29 3b 0a 20 20 20  me, &p->rc);.   
ae40: 20 20 20 20 20 70 49 74 65 72 2d 3e 61 69 53 72       pIter->aiSr
ae50: 63 4f 72 64 65 72 5b 70 49 74 65 72 2d 3e 6e 54  cOrder[pIter->nT
ae60: 62 6c 43 6f 6c 5d 20 3d 20 70 49 74 65 72 2d 3e  blCol] = pIter->
ae70: 6e 54 62 6c 43 6f 6c 3b 0a 20 20 20 20 20 20 20  nTblCol;.       
ae80: 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c   pIter->azTblCol
ae90: 5b 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 2b  [pIter->nTblCol+
aea0: 2b 5d 20 3d 20 7a 43 6f 70 79 3b 0a 20 20 20 20  +] = zCopy;.    
aeb0: 20 20 7d 0a 20 20 20 20 20 20 65 6c 73 65 20 69    }.      else i
aec0: 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74  f( 0==sqlite3_st
aed0: 72 69 63 6d 70 28 22 72 62 75 5f 72 6f 77 69 64  ricmp("rbu_rowid
aee0: 22 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20  ", zName) ){.   
aef0: 20 20 20 20 20 62 52 62 75 52 6f 77 69 64 20 3d       bRbuRowid =
af00: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
af10: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  }.    sqlite3_fi
af20: 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
af30: 20 20 20 70 53 74 6d 74 20 3d 20 30 3b 0a 0a 20     pStmt = 0;.. 
af40: 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
af50: 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20 26 26 20  LITE_OK.     && 
af60: 72 62 75 49 73 56 61 63 75 75 6d 28 70 29 3d 3d  rbuIsVacuum(p)==
af70: 30 0a 20 20 20 20 20 26 26 20 62 52 62 75 52 6f  0.     && bRbuRo
af80: 77 69 64 21 3d 28 70 49 74 65 72 2d 3e 65 54 79  wid!=(pIter->eTy
af90: 70 65 3d 3d 52 42 55 5f 50 4b 5f 56 54 41 42 20  pe==RBU_PK_VTAB 
afa0: 7c 7c 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d  || pIter->eType=
afb0: 3d 52 42 55 5f 50 4b 5f 4e 4f 4e 45 29 0a 20 20  =RBU_PK_NONE).  
afc0: 20 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63    ){.      p->rc
afd0: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
afe0: 0a 20 20 20 20 20 20 70 2d 3e 7a 45 72 72 6d 73  .      p->zErrms
aff0: 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  g = sqlite3_mpri
b000: 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 22  ntf(.          "
b010: 74 61 62 6c 65 20 25 71 20 25 73 20 72 62 75 5f  table %q %s rbu_
b020: 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 22 2c 20 70  rowid column", p
b030: 49 74 65 72 2d 3e 7a 44 61 74 61 54 62 6c 2c 0a  Iter->zDataTbl,.
b040: 20 20 20 20 20 20 20 20 20 20 28 62 52 62 75 52            (bRbuR
b050: 6f 77 69 64 20 3f 20 22 6d 61 79 20 6e 6f 74 20  owid ? "may not 
b060: 68 61 76 65 22 20 3a 20 22 72 65 71 75 69 72 65  have" : "require
b070: 73 22 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  s").      );.   
b080: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b   }..    /* Check
b090: 20 74 68 61 74 20 61 6c 6c 20 6e 6f 6e 2d 48 49   that all non-HI
b0a0: 44 44 45 4e 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  DDEN columns in 
b0b0: 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  the destination 
b0c0: 74 61 62 6c 65 20 61 72 65 20 61 6c 73 6f 0a 20  table are also. 
b0d0: 20 20 20 2a 2a 20 70 72 65 73 65 6e 74 20 69 6e     ** present in
b0e0: 20 74 68 65 20 69 6e 70 75 74 20 74 61 62 6c 65   the input table
b0f0: 2e 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 61  . Populate the a
b100: 62 54 62 6c 50 6b 5b 5d 2c 20 61 7a 54 62 6c 54  bTblPk[], azTblT
b110: 79 70 65 5b 5d 20 61 6e 64 0a 20 20 20 20 2a 2a  ype[] and.    **
b120: 20 61 69 54 62 6c 4f 72 64 65 72 5b 5d 20 61 72   aiTblOrder[] ar
b130: 72 61 79 73 20 61 74 20 74 68 65 20 73 61 6d 65  rays at the same
b140: 20 74 69 6d 65 2e 20 20 2a 2f 0a 20 20 20 20 69   time.  */.    i
b150: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
b160: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  _OK ){.      p->
b170: 72 63 20 3d 20 70 72 65 70 61 72 65 46 72 65 65  rc = prepareFree
b180: 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28  AndCollectError(
b190: 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 70 53 74 6d  p->dbMain, &pStm
b1a0: 74 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 20  t, &p->zErrmsg, 
b1b0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
b1c0: 65 33 5f 6d 70 72 69 6e 74 66 28 22 50 52 41 47  e3_mprintf("PRAG
b1d0: 4d 41 20 74 61 62 6c 65 5f 69 6e 66 6f 28 25 51  MA table_info(%Q
b1e0: 29 22 2c 20 70 49 74 65 72 2d 3e 7a 54 62 6c 29  )", pIter->zTbl)
b1f0: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
b200: 20 20 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63      while( p->rc
b210: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53  ==SQLITE_OK && S
b220: 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74  QLITE_ROW==sqlit
b230: 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29  e3_step(pStmt) )
b240: 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
b250: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e  ar *zName = (con
b260: 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
b270: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74  _column_text(pSt
b280: 6d 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66  mt, 1);.      if
b290: 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 62 72 65  ( zName==0 ) bre
b2a0: 61 6b 3b 20 20 2f 2a 20 41 6e 20 4f 4f 4d 20 2d  ak;  /* An OOM -
b2b0: 20 66 69 6e 61 6c 69 7a 65 28 29 20 62 65 6c 6f   finalize() belo
b2c0: 77 20 72 65 74 75 72 6e 73 20 53 5f 4e 4f 4d 45  w returns S_NOME
b2d0: 4d 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 69  M */.      for(i
b2e0: 3d 69 4f 72 64 65 72 3b 20 69 3c 70 49 74 65 72  =iOrder; i<pIter
b2f0: 2d 3e 6e 54 62 6c 43 6f 6c 3b 20 69 2b 2b 29 7b  ->nTblCol; i++){
b300: 0a 20 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d  .        if( 0==
b310: 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 70 49  strcmp(zName, pI
b320: 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69 5d  ter->azTblCol[i]
b330: 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ) ) break;.     
b340: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d   }.      if( i==
b350: 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 20 29  pIter->nTblCol )
b360: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20  {.        p->rc 
b370: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
b380: 20 20 20 20 20 20 20 20 70 2d 3e 7a 45 72 72 6d          p->zErrm
b390: 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  sg = sqlite3_mpr
b3a0: 69 6e 74 66 28 22 63 6f 6c 75 6d 6e 20 6d 69 73  intf("column mis
b3b0: 73 69 6e 67 20 66 72 6f 6d 20 25 71 3a 20 25 73  sing from %q: %s
b3c0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ",.            p
b3d0: 49 74 65 72 2d 3e 7a 44 61 74 61 54 62 6c 2c 20  Iter->zDataTbl, 
b3e0: 7a 4e 61 6d 65 0a 20 20 20 20 20 20 20 20 29 3b  zName.        );
b3f0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
b400: 20 20 20 20 20 20 69 6e 74 20 69 50 6b 20 3d 20        int iPk = 
b410: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
b420: 6e 74 28 70 53 74 6d 74 2c 20 35 29 3b 0a 20 20  nt(pStmt, 5);.  
b430: 20 20 20 20 20 20 69 6e 74 20 62 4e 6f 74 4e 75        int bNotNu
b440: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ll = sqlite3_col
b450: 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 33  umn_int(pStmt, 3
b460: 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  );.        const
b470: 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 28   char *zType = (
b480: 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
b490: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
b4a0: 70 53 74 6d 74 2c 20 32 29 3b 0a 0a 20 20 20 20  pStmt, 2);..    
b4b0: 20 20 20 20 69 66 28 20 69 21 3d 69 4f 72 64 65      if( i!=iOrde
b4c0: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 53  r ){.          S
b4d0: 57 41 50 28 69 6e 74 2c 20 70 49 74 65 72 2d 3e  WAP(int, pIter->
b4e0: 61 69 53 72 63 4f 72 64 65 72 5b 69 5d 2c 20 70  aiSrcOrder[i], p
b4f0: 49 74 65 72 2d 3e 61 69 53 72 63 4f 72 64 65 72  Iter->aiSrcOrder
b500: 5b 69 4f 72 64 65 72 5d 29 3b 0a 20 20 20 20 20  [iOrder]);.     
b510: 20 20 20 20 20 53 57 41 50 28 63 68 61 72 2a 2c       SWAP(char*,
b520: 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c   pIter->azTblCol
b530: 5b 69 5d 2c 20 70 49 74 65 72 2d 3e 61 7a 54 62  [i], pIter->azTb
b540: 6c 43 6f 6c 5b 69 4f 72 64 65 72 5d 29 3b 0a 20  lCol[iOrder]);. 
b550: 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
b560: 20 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 54 79    pIter->azTblTy
b570: 70 65 5b 69 4f 72 64 65 72 5d 20 3d 20 72 62 75  pe[iOrder] = rbu
b580: 53 74 72 6e 64 75 70 28 7a 54 79 70 65 2c 20 26  Strndup(zType, &
b590: 70 2d 3e 72 63 29 3b 0a 20 20 20 20 20 20 20 20  p->rc);.        
b5a0: 70 49 74 65 72 2d 3e 61 62 54 62 6c 50 6b 5b 69  pIter->abTblPk[i
b5b0: 4f 72 64 65 72 5d 20 3d 20 28 69 50 6b 21 3d 30  Order] = (iPk!=0
b5c0: 29 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65 72  );.        pIter
b5d0: 2d 3e 61 62 4e 6f 74 4e 75 6c 6c 5b 69 4f 72 64  ->abNotNull[iOrd
b5e0: 65 72 5d 20 3d 20 28 75 38 29 62 4e 6f 74 4e 75  er] = (u8)bNotNu
b5f0: 6c 6c 20 7c 7c 20 28 69 50 6b 21 3d 30 29 3b 0a  ll || (iPk!=0);.
b600: 20 20 20 20 20 20 20 20 69 4f 72 64 65 72 2b 2b          iOrder++
b610: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
b620: 0a 20 20 20 20 72 62 75 46 69 6e 61 6c 69 7a 65  .    rbuFinalize
b630: 28 70 2c 20 70 53 74 6d 74 29 3b 0a 20 20 20 20  (p, pStmt);.    
b640: 72 62 75 4f 62 6a 49 74 65 72 43 61 63 68 65 49  rbuObjIterCacheI
b650: 6e 64 65 78 65 64 43 6f 6c 73 28 70 2c 20 70 49  ndexedCols(p, pI
b660: 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ter);.    assert
b670: 28 20 70 49 74 65 72 2d 3e 65 54 79 70 65 21 3d  ( pIter->eType!=
b680: 52 42 55 5f 50 4b 5f 56 54 41 42 20 7c 7c 20 70  RBU_PK_VTAB || p
b690: 49 74 65 72 2d 3e 61 62 49 6e 64 65 78 65 64 3d  Iter->abIndexed=
b6a0: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
b6b0: 28 20 70 49 74 65 72 2d 3e 65 54 79 70 65 21 3d  ( pIter->eType!=
b6c0: 52 42 55 5f 50 4b 5f 56 54 41 42 20 7c 7c 20 70  RBU_PK_VTAB || p
b6d0: 49 74 65 72 2d 3e 6e 49 6e 64 65 78 3d 3d 30 20  Iter->nIndex==0 
b6e0: 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
b6f0: 20 70 2d 3e 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   p->rc;.}../*.**
b700: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
b710: 6f 6e 73 74 72 75 63 74 73 20 61 6e 64 20 72 65  onstructs and re
b720: 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  turns a pointer 
b730: 74 6f 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  to a nul-termina
b740: 74 65 64 20 0a 2a 2a 20 73 74 72 69 6e 67 20 63  ted .** string c
b750: 6f 6e 74 61 69 6e 69 6e 67 20 73 6f 6d 65 20 53  ontaining some S
b760: 51 4c 20 63 6c 61 75 73 65 20 6f 72 20 6c 69 73  QL clause or lis
b770: 74 20 62 61 73 65 64 20 6f 6e 20 6f 6e 65 20 6f  t based on one o
b780: 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 0a 2a  r more of the .*
b790: 2a 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 63  * column names c
b7a0: 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20  urrently stored 
b7b0: 69 6e 20 74 68 65 20 70 49 74 65 72 2d 3e 61 7a  in the pIter->az
b7c0: 54 62 6c 43 6f 6c 5b 5d 20 61 72 72 61 79 2e 0a  TblCol[] array..
b7d0: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
b7e0: 72 62 75 4f 62 6a 49 74 65 72 47 65 74 43 6f 6c  rbuObjIterGetCol
b7f0: 6c 69 73 74 28 0a 20 20 73 71 6c 69 74 65 33 72  list(.  sqlite3r
b800: 62 75 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  bu *p,          
b810: 20 20 20 20 20 20 20 20 2f 2a 20 52 42 55 20 6f          /* RBU o
b820: 62 6a 65 63 74 20 2a 2f 0a 20 20 52 62 75 4f 62  bject */.  RbuOb
b830: 6a 49 74 65 72 20 2a 70 49 74 65 72 20 20 20 20  jIter *pIter    
b840: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62             /* Ob
b850: 6a 65 63 74 20 69 74 65 72 61 74 6f 72 20 66 6f  ject iterator fo
b860: 72 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a  r column names *
b870: 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4c 69  /.){.  char *zLi
b880: 73 74 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20  st = 0;.  const 
b890: 63 68 61 72 20 2a 7a 53 65 70 20 3d 20 22 22 3b  char *zSep = "";
b8a0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
b8b0: 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 54  i=0; i<pIter->nT
b8c0: 62 6c 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  blCol; i++){.   
b8d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
b8e0: 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c   pIter->azTblCol
b8f0: 5b 69 5d 3b 0a 20 20 20 20 7a 4c 69 73 74 20 3d  [i];.    zList =
b900: 20 72 62 75 4d 50 72 69 6e 74 66 28 70 2c 20 22   rbuMPrintf(p, "
b910: 25 7a 25 73 5c 22 25 77 5c 22 22 2c 20 7a 4c 69  %z%s\"%w\"", zLi
b920: 73 74 2c 20 7a 53 65 70 2c 20 7a 29 3b 0a 20 20  st, zSep, z);.  
b930: 20 20 7a 53 65 70 20 3d 20 22 2c 20 22 3b 0a 20    zSep = ", ";. 
b940: 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4c 69 73   }.  return zLis
b950: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  t;.}../*.** This
b960: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
b970: 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 53 45  d to create a SE
b980: 4c 45 43 54 20 6c 69 73 74 20 28 74 68 65 20 6c  LECT list (the l
b990: 69 73 74 20 6f 66 20 53 51 4c 20 0a 2a 2a 20 65  ist of SQL .** e
b9a0: 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20  xpressions that 
b9b0: 66 6f 6c 6c 6f 77 73 20 61 20 53 45 4c 45 43 54  follows a SELECT
b9c0: 20 6b 65 79 77 6f 72 64 29 20 66 6f 72 20 61 20   keyword) for a 
b9d0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
b9e0: 20 0a 2a 2a 20 75 73 65 64 20 74 6f 20 72 65 61   .** used to rea
b9f0: 64 20 66 72 6f 6d 20 61 6e 20 64 61 74 61 5f 78  d from an data_x
ba00: 78 78 20 6f 72 20 72 62 75 5f 74 6d 70 5f 78 78  xx or rbu_tmp_xx
ba10: 78 20 74 61 62 6c 65 20 77 68 69 6c 65 20 75 70  x table while up
ba20: 64 61 74 69 6e 67 20 74 68 65 20 0a 2a 2a 20 69  dating the .** i
ba30: 6e 64 65 78 20 6f 62 6a 65 63 74 20 63 75 72 72  ndex object curr
ba40: 65 6e 74 6c 79 20 69 6e 64 69 63 61 74 65 64 20  ently indicated 
ba50: 62 79 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  by the iterator 
ba60: 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73  object passed as
ba70: 20 74 68 65 20 0a 2a 2a 20 73 65 63 6f 6e 64 20   the .** second 
ba80: 61 72 67 75 6d 65 6e 74 2e 20 41 20 22 50 52 41  argument. A "PRA
ba90: 47 4d 41 20 69 6e 64 65 78 5f 78 69 6e 66 6f 20  GMA index_xinfo 
baa0: 3d 20 3c 69 64 78 6e 61 6d 65 3e 22 20 73 74 61  = <idxname>" sta
bab0: 74 65 6d 65 6e 74 20 69 73 20 75 73 65 64 20 0a  tement is used .
bac0: 2a 2a 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65  ** to obtain the
bad0: 20 72 65 71 75 69 72 65 64 20 69 6e 66 6f 72 6d   required inform
bae0: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ation..**.** If 
baf0: 74 68 65 20 69 6e 64 65 78 20 69 73 20 6f 66 20  the index is of 
bb00: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f  the following fo
bb10: 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41  rm:.**.**   CREA
bb20: 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74  TE INDEX i1 ON t
bb30: 31 28 63 2c 20 62 20 43 4f 4c 4c 41 54 45 20 6e  1(c, b COLLATE n
bb40: 6f 63 61 73 65 29 3b 0a 2a 2a 0a 2a 2a 20 61 6e  ocase);.**.** an
bb50: 64 20 22 74 31 22 20 69 73 20 61 20 74 61 62 6c  d "t1" is a tabl
bb60: 65 20 77 69 74 68 20 61 6e 20 65 78 70 6c 69 63  e with an explic
bb70: 69 74 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  it INTEGER PRIMA
bb80: 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 0a 2a  RY KEY column .*
bb90: 2a 20 22 69 70 6b 22 2c 20 74 68 65 20 72 65 74  * "ipk", the ret
bba0: 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73 3a  urned string is:
bbb0: 0a 2a 2a 0a 2a 2a 20 20 20 22 60 63 60 20 43 4f  .**.**   "`c` CO
bbc0: 4c 4c 41 54 45 20 27 42 49 4e 41 52 59 27 2c 20  LLATE 'BINARY', 
bbd0: 60 62 60 20 43 4f 4c 4c 41 54 45 20 27 4e 4f 43  `b` COLLATE 'NOC
bbe0: 41 53 45 27 2c 20 60 69 70 6b 60 20 43 4f 4c 4c  ASE', `ipk` COLL
bbf0: 41 54 45 20 27 42 49 4e 41 52 59 27 22 0a 2a 2a  ATE 'BINARY'".**
bc00: 0a 2a 2a 20 41 73 20 77 65 6c 6c 20 61 73 20 74  .** As well as t
bc10: 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69  he returned stri
bc20: 6e 67 2c 20 74 68 72 65 65 20 6f 74 68 65 72 20  ng, three other 
bc30: 6d 61 6c 6c 6f 63 27 64 20 73 74 72 69 6e 67 73  malloc'd strings
bc40: 20 61 72 65 20 0a 2a 2a 20 72 65 74 75 72 6e 65   are .** returne
bc50: 64 20 76 69 61 20 6f 75 74 70 75 74 20 70 61 72  d via output par
bc60: 61 6d 65 74 65 72 73 2e 20 41 73 20 66 6f 6c 6c  ameters. As foll
bc70: 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 70 7a 49  ows:.**.**   pzI
bc80: 6d 70 6f 73 74 65 72 43 6f 6c 73 3a 20 2e 2e 2e  mposterCols: ...
bc90: 0a 2a 2a 20 20 20 70 7a 49 6d 70 6f 73 74 65 72  .**   pzImposter
bca0: 50 6b 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 70 7a 57  Pk: ....**   pzW
bcb0: 68 65 72 65 3a 20 2e 2e 2e 0a 2a 2f 0a 73 74 61  here: ....*/.sta
bcc0: 74 69 63 20 63 68 61 72 20 2a 72 62 75 4f 62 6a  tic char *rbuObj
bcd0: 49 74 65 72 47 65 74 49 6e 64 65 78 43 6f 6c 73  IterGetIndexCols
bce0: 28 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20 2a  (.  sqlite3rbu *
bcf0: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
bd00: 20 20 20 20 2f 2a 20 52 42 55 20 6f 62 6a 65 63      /* RBU objec
bd10: 74 20 2a 2f 0a 20 20 52 62 75 4f 62 6a 49 74 65  t */.  RbuObjIte
bd20: 72 20 2a 70 49 74 65 72 2c 20 20 20 20 20 20 20  r *pIter,       
bd30: 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74         /* Object
bd40: 20 69 74 65 72 61 74 6f 72 20 66 6f 72 20 63 6f   iterator for co
bd50: 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20  lumn names */.  
bd60: 63 68 61 72 20 2a 2a 70 7a 49 6d 70 6f 73 74 65  char **pzImposte
bd70: 72 43 6f 6c 73 2c 20 20 20 20 20 20 20 20 20 20  rCols,          
bd80: 2f 2a 20 4f 55 54 3a 20 43 6f 6c 75 6d 6e 73 20  /* OUT: Columns 
bd90: 66 6f 72 20 69 6d 70 6f 73 74 65 72 20 74 61 62  for imposter tab
bda0: 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70  le */.  char **p
bdb0: 7a 49 6d 70 6f 73 74 65 72 50 6b 2c 20 20 20 20  zImposterPk,    
bdc0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
bdd0: 49 6d 70 6f 73 74 65 72 20 50 4b 20 63 6c 61 75  Imposter PK clau
bde0: 73 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70  se */.  char **p
bdf0: 7a 57 68 65 72 65 2c 20 20 20 20 20 20 20 20 20  zWhere,         
be00: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
be10: 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
be20: 20 20 69 6e 74 20 2a 70 6e 42 69 6e 64 20 20 20    int *pnBind   
be30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be40: 20 20 2f 2a 20 4f 55 54 3a 20 54 72 62 75 6c 20    /* OUT: Trbul 
be50: 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
be60: 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  s */.){.  int rc
be70: 20 3d 20 70 2d 3e 72 63 3b 20 20 20 20 20 20 20   = p->rc;       
be80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72            /* Err
be90: 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  or code */.  int
bea0: 20 72 63 32 3b 20 20 20 20 20 20 20 20 20 20 20   rc2;           
beb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
bec0: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
bed0: 28 29 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  () return code *
bee0: 2f 0a 20 20 63 68 61 72 20 2a 7a 52 65 74 20 3d  /.  char *zRet =
bef0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
bf00: 20 20 20 20 2f 2a 20 53 74 72 69 6e 67 20 74 6f      /* String to
bf10: 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 63 68 61   return */.  cha
bf20: 72 20 2a 7a 49 6d 70 43 6f 6c 73 20 3d 20 30 3b  r *zImpCols = 0;
bf30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
bf40: 53 74 72 69 6e 67 20 74 6f 20 72 65 74 75 72 6e  String to return
bf50: 20 76 69 61 20 2a 70 7a 49 6d 70 6f 73 74 65 72   via *pzImposter
bf60: 43 6f 6c 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  Cols */.  char *
bf70: 7a 49 6d 70 50 4b 20 3d 20 30 3b 20 20 20 20 20  zImpPK = 0;     
bf80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 72            /* Str
bf90: 69 6e 67 20 74 6f 20 72 65 74 75 72 6e 20 76 69  ing to return vi
bfa0: 61 20 2a 70 7a 49 6d 70 6f 73 74 65 72 50 4b 20  a *pzImposterPK 
bfb0: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 57 68 65 72  */.  char *zWher
bfc0: 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
bfd0: 20 20 20 20 20 2f 2a 20 53 74 72 69 6e 67 20 74       /* String t
bfe0: 6f 20 72 65 74 75 72 6e 20 76 69 61 20 2a 70 7a  o return via *pz
bff0: 57 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  Where */.  int n
c000: 42 69 6e 64 20 3d 20 30 3b 20 20 20 20 20 20 20  Bind = 0;       
c010: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
c020: 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 76 69  lue to return vi
c030: 61 20 2a 70 6e 42 69 6e 64 20 2a 2f 0a 20 20 63  a *pnBind */.  c
c040: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6d 20  onst char *zCom 
c050: 3d 20 22 22 3b 20 20 20 20 20 20 20 20 20 20 2f  = "";          /
c060: 2a 20 53 65 74 20 74 6f 20 22 2c 20 22 20 6c 61  * Set to ", " la
c070: 74 65 72 20 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73  ter on */.  cons
c080: 74 20 63 68 61 72 20 2a 7a 41 6e 64 20 3d 20 22  t char *zAnd = "
c090: 22 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ";          /* S
c0a0: 65 74 20 74 6f 20 22 20 41 4e 44 20 22 20 6c 61  et to " AND " la
c0b0: 74 65 72 20 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69  ter on */.  sqli
c0c0: 74 65 33 5f 73 74 6d 74 20 2a 70 58 49 6e 66 6f  te3_stmt *pXInfo
c0d0: 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 50   = 0;       /* P
c0e0: 52 41 47 4d 41 20 69 6e 64 65 78 5f 78 69 6e 66  RAGMA index_xinf
c0f0: 6f 20 3d 20 3f 20 2a 2f 0a 0a 20 20 69 66 28 20  o = ? */..  if( 
c100: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
c110: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
c120: 7a 45 72 72 6d 73 67 3d 3d 30 20 29 3b 0a 20 20  zErrmsg==0 );.  
c130: 20 20 72 63 20 3d 20 70 72 65 70 61 72 65 46 72    rc = prepareFr
c140: 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f  eeAndCollectErro
c150: 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 70 58  r(p->dbMain, &pX
c160: 49 6e 66 6f 2c 20 26 70 2d 3e 7a 45 72 72 6d 73  Info, &p->zErrms
c170: 67 2c 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  g,.        sqlit
c180: 65 33 5f 6d 70 72 69 6e 74 66 28 22 50 52 41 47  e3_mprintf("PRAG
c190: 4d 41 20 6d 61 69 6e 2e 69 6e 64 65 78 5f 78 69  MA main.index_xi
c1a0: 6e 66 6f 20 3d 20 25 51 22 2c 20 70 49 74 65 72  nfo = %Q", pIter
c1b0: 2d 3e 7a 49 64 78 29 0a 20 20 20 20 29 3b 0a 20  ->zIdx).    );. 
c1c0: 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 72 63 3d   }..  while( rc=
c1d0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51  =SQLITE_OK && SQ
c1e0: 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65  LITE_ROW==sqlite
c1f0: 33 5f 73 74 65 70 28 70 58 49 6e 66 6f 29 20 29  3_step(pXInfo) )
c200: 7b 0a 20 20 20 20 69 6e 74 20 69 43 69 64 20 3d  {.    int iCid =
c210: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
c220: 69 6e 74 28 70 58 49 6e 66 6f 2c 20 31 29 3b 0a  int(pXInfo, 1);.
c230: 20 20 20 20 69 6e 74 20 62 44 65 73 63 20 3d 20      int bDesc = 
c240: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
c250: 6e 74 28 70 58 49 6e 66 6f 2c 20 33 29 3b 0a 20  nt(pXInfo, 3);. 
c260: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
c270: 43 6f 6c 6c 61 74 65 20 3d 20 28 63 6f 6e 73 74  Collate = (const
c280: 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63   char*)sqlite3_c
c290: 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 58 49 6e 66  olumn_text(pXInf
c2a0: 6f 2c 20 34 29 3b 0a 20 20 20 20 63 6f 6e 73 74  o, 4);.    const
c2b0: 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20   char *zCol;.   
c2c0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79   const char *zTy
c2d0: 70 65 3b 0a 0a 20 20 20 20 69 66 28 20 69 43 69  pe;..    if( iCi
c2e0: 64 3c 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  d<0 ){.      /* 
c2f0: 41 6e 20 69 6e 74 65 67 65 72 20 70 72 69 6d 61  An integer prima
c300: 72 79 20 6b 65 79 2e 20 49 66 20 74 68 65 20 74  ry key. If the t
c310: 61 62 6c 65 20 68 61 73 20 61 6e 20 65 78 70 6c  able has an expl
c320: 69 63 69 74 20 49 50 4b 2c 20 75 73 65 0a 20 20  icit IPK, use.  
c330: 20 20 20 20 2a 2a 20 69 74 73 20 6e 61 6d 65 2e      ** its name.
c340: 20 4f 74 68 65 72 77 69 73 65 2c 20 75 73 65 20   Otherwise, use 
c350: 22 72 62 75 5f 72 6f 77 69 64 22 2e 20 20 2a 2f  "rbu_rowid".  */
c360: 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72  .      if( pIter
c370: 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f  ->eType==RBU_PK_
c380: 49 50 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  IPK ){.        i
c390: 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 66 6f  nt i;.        fo
c3a0: 72 28 69 3d 30 3b 20 70 49 74 65 72 2d 3e 61 62  r(i=0; pIter->ab
c3b0: 54 62 6c 50 6b 5b 69 5d 3d 3d 30 3b 20 69 2b 2b  TblPk[i]==0; i++
c3c0: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
c3d0: 74 28 20 69 3c 70 49 74 65 72 2d 3e 6e 54 62 6c  t( i<pIter->nTbl
c3e0: 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 7a  Col );.        z
c3f0: 43 6f 6c 20 3d 20 70 49 74 65 72 2d 3e 61 7a 54  Col = pIter->azT
c400: 62 6c 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20 20  blCol[i];.      
c410: 7d 65 6c 73 65 20 69 66 28 20 72 62 75 49 73 56  }else if( rbuIsV
c420: 61 63 75 75 6d 28 70 29 20 29 7b 0a 20 20 20 20  acuum(p) ){.    
c430: 20 20 20 20 7a 43 6f 6c 20 3d 20 22 5f 72 6f 77      zCol = "_row
c440: 69 64 5f 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73  id_";.      }els
c450: 65 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20  e{.        zCol 
c460: 3d 20 22 72 62 75 5f 72 6f 77 69 64 22 3b 0a 20  = "rbu_rowid";. 
c470: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 54 79       }.      zTy
c480: 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a  pe = "INTEGER";.
c490: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c4a0: 20 7a 43 6f 6c 20 3d 20 70 49 74 65 72 2d 3e 61   zCol = pIter->a
c4b0: 7a 54 62 6c 43 6f 6c 5b 69 43 69 64 5d 3b 0a 20  zTblCol[iCid];. 
c4c0: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 70 49 74       zType = pIt
c4d0: 65 72 2d 3e 61 7a 54 62 6c 54 79 70 65 5b 69 43  er->azTblType[iC
c4e0: 69 64 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  id];.    }..    
c4f0: 7a 52 65 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zRet = sqlite3_m
c500: 70 72 69 6e 74 66 28 22 25 7a 25 73 5c 22 25 77  printf("%z%s\"%w
c510: 5c 22 20 43 4f 4c 4c 41 54 45 20 25 51 22 2c 20  \" COLLATE %Q", 
c520: 7a 52 65 74 2c 20 7a 43 6f 6d 2c 20 7a 43 6f 6c  zRet, zCom, zCol
c530: 2c 20 7a 43 6f 6c 6c 61 74 65 29 3b 0a 20 20 20  , zCollate);.   
c540: 20 69 66 28 20 70 49 74 65 72 2d 3e 62 55 6e 69   if( pIter->bUni
c550: 71 75 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  que==0 || sqlite
c560: 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 58 49  3_column_int(pXI
c570: 6e 66 6f 2c 20 35 29 20 29 7b 0a 20 20 20 20 20  nfo, 5) ){.     
c580: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72   const char *zOr
c590: 64 65 72 20 3d 20 28 62 44 65 73 63 20 3f 20 22  der = (bDesc ? "
c5a0: 20 44 45 53 43 22 20 3a 20 22 22 29 3b 0a 20 20   DESC" : "");.  
c5b0: 20 20 20 20 7a 49 6d 70 50 4b 20 3d 20 73 71 6c      zImpPK = sql
c5c0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a  ite3_mprintf("%z
c5d0: 25 73 5c 22 72 62 75 5f 69 6d 70 5f 25 64 25 77  %s\"rbu_imp_%d%w
c5e0: 5c 22 25 73 22 2c 20 0a 20 20 20 20 20 20 20 20  \"%s", .        
c5f0: 20 20 7a 49 6d 70 50 4b 2c 20 7a 43 6f 6d 2c 20    zImpPK, zCom, 
c600: 6e 42 69 6e 64 2c 20 7a 43 6f 6c 2c 20 7a 4f 72  nBind, zCol, zOr
c610: 64 65 72 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  der.      );.   
c620: 20 7d 0a 20 20 20 20 7a 49 6d 70 43 6f 6c 73 20   }.    zImpCols 
c630: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
c640: 66 28 22 25 7a 25 73 5c 22 72 62 75 5f 69 6d 70  f("%z%s\"rbu_imp
c650: 5f 25 64 25 77 5c 22 20 25 73 20 43 4f 4c 4c 41  _%d%w\" %s COLLA
c660: 54 45 20 25 51 22 2c 20 0a 20 20 20 20 20 20 20  TE %Q", .       
c670: 20 7a 49 6d 70 43 6f 6c 73 2c 20 7a 43 6f 6d 2c   zImpCols, zCom,
c680: 20 6e 42 69 6e 64 2c 20 7a 43 6f 6c 2c 20 7a 54   nBind, zCol, zT
c690: 79 70 65 2c 20 7a 43 6f 6c 6c 61 74 65 0a 20 20  ype, zCollate.  
c6a0: 20 20 29 3b 0a 20 20 20 20 7a 57 68 65 72 65 20    );.    zWhere 
c6b0: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
c6c0: 66 28 0a 20 20 20 20 20 20 20 20 22 25 7a 25 73  f(.        "%z%s
c6d0: 5c 22 72 62 75 5f 69 6d 70 5f 25 64 25 77 5c 22  \"rbu_imp_%d%w\"
c6e0: 20 49 53 20 3f 22 2c 20 7a 57 68 65 72 65 2c 20   IS ?", zWhere, 
c6f0: 7a 41 6e 64 2c 20 6e 42 69 6e 64 2c 20 7a 43 6f  zAnd, nBind, zCo
c700: 6c 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  l.    );.    if(
c710: 20 7a 52 65 74 3d 3d 30 20 7c 7c 20 7a 49 6d 70   zRet==0 || zImp
c720: 50 4b 3d 3d 30 20 7c 7c 20 7a 49 6d 70 43 6f 6c  PK==0 || zImpCol
c730: 73 3d 3d 30 20 7c 7c 20 7a 57 68 65 72 65 3d 3d  s==0 || zWhere==
c740: 30 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  0 ) rc = SQLITE_
c750: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7a 43 6f 6d 20  NOMEM;.    zCom 
c760: 3d 20 22 2c 20 22 3b 0a 20 20 20 20 7a 41 6e 64  = ", ";.    zAnd
c770: 20 3d 20 22 20 41 4e 44 20 22 3b 0a 20 20 20 20   = " AND ";.    
c780: 6e 42 69 6e 64 2b 2b 3b 0a 20 20 7d 0a 0a 20 20  nBind++;.  }..  
c790: 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 66 69  rc2 = sqlite3_fi
c7a0: 6e 61 6c 69 7a 65 28 70 58 49 6e 66 6f 29 3b 0a  nalize(pXInfo);.
c7b0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
c7c0: 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63 32 3b 0a  _OK ) rc = rc2;.
c7d0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
c7e0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
c7f0: 74 65 33 5f 66 72 65 65 28 7a 52 65 74 29 3b 0a  te3_free(zRet);.
c800: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
c810: 28 7a 49 6d 70 43 6f 6c 73 29 3b 0a 20 20 20 20  (zImpCols);.    
c820: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 49 6d  sqlite3_free(zIm
c830: 70 50 4b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pPK);.    sqlite
c840: 33 5f 66 72 65 65 28 7a 57 68 65 72 65 29 3b 0a  3_free(zWhere);.
c850: 20 20 20 20 7a 52 65 74 20 3d 20 30 3b 0a 20 20      zRet = 0;.  
c860: 20 20 7a 49 6d 70 43 6f 6c 73 20 3d 20 30 3b 0a    zImpCols = 0;.
c870: 20 20 20 20 7a 49 6d 70 50 4b 20 3d 20 30 3b 0a      zImpPK = 0;.
c880: 20 20 20 20 7a 57 68 65 72 65 20 3d 20 30 3b 0a      zWhere = 0;.
c890: 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a      p->rc = rc;.
c8a0: 20 20 7d 0a 0a 20 20 2a 70 7a 49 6d 70 6f 73 74    }..  *pzImpost
c8b0: 65 72 43 6f 6c 73 20 3d 20 7a 49 6d 70 43 6f 6c  erCols = zImpCol
c8c0: 73 3b 0a 20 20 2a 70 7a 49 6d 70 6f 73 74 65 72  s;.  *pzImposter
c8d0: 50 6b 20 3d 20 7a 49 6d 70 50 4b 3b 0a 20 20 2a  Pk = zImpPK;.  *
c8e0: 70 7a 57 68 65 72 65 20 3d 20 7a 57 68 65 72 65  pzWhere = zWhere
c8f0: 3b 0a 20 20 2a 70 6e 42 69 6e 64 20 3d 20 6e 42  ;.  *pnBind = nB
c900: 69 6e 64 3b 0a 20 20 72 65 74 75 72 6e 20 7a 52  ind;.  return zR
c910: 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73  et;.}../*.** Ass
c920: 75 6d 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e  uming the curren
c930: 74 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20  t table columns 
c940: 61 72 65 20 22 61 22 2c 20 22 62 22 20 61 6e 64  are "a", "b" and
c950: 20 22 63 22 2c 20 61 6e 64 20 74 68 65 20 7a 4f   "c", and the zO
c960: 62 6a 0a 2a 2a 20 70 61 72 61 6d 74 65 72 20 69  bj.** paramter i
c970: 73 20 70 61 73 73 65 64 20 22 6f 6c 64 22 2c 20  s passed "old", 
c980: 72 65 74 75 72 6e 20 61 20 73 74 72 69 6e 67 20  return a string 
c990: 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a  of the form:.**.
c9a0: 2a 2a 20 20 20 20 20 22 6f 6c 64 2e 61 2c 20 6f  **     "old.a, o
c9b0: 6c 64 2e 62 2c 20 6f 6c 64 2e 62 22 0a 2a 2a 0a  ld.b, old.b".**.
c9c0: 2a 2a 20 57 69 74 68 20 74 68 65 20 63 6f 6c 75  ** With the colu
c9d0: 6d 6e 20 6e 61 6d 65 73 20 65 73 63 61 70 65 64  mn names escaped
c9e0: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 61 62 6c  ..**.** For tabl
c9f0: 65 73 20 77 69 74 68 20 69 6d 70 6c 69 63 69 74  es with implicit
ca00: 20 72 6f 77 69 64 73 20 2d 20 52 42 55 5f 50 4b   rowids - RBU_PK
ca10: 5f 45 58 54 45 52 4e 41 4c 20 61 6e 64 20 52 42  _EXTERNAL and RB
ca20: 55 5f 50 4b 5f 4e 4f 4e 45 2c 20 61 70 70 65 6e  U_PK_NONE, appen
ca30: 64 0a 2a 2a 20 74 68 65 20 74 65 78 74 20 22 2c  d.** the text ",
ca40: 20 6f 6c 64 2e 5f 72 6f 77 69 64 5f 22 20 74 6f   old._rowid_" to
ca50: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 76 61   the returned va
ca60: 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  lue..*/.static c
ca70: 68 61 72 20 2a 72 62 75 4f 62 6a 49 74 65 72 47  har *rbuObjIterG
ca80: 65 74 4f 6c 64 6c 69 73 74 28 0a 20 20 73 71 6c  etOldlist(.  sql
ca90: 69 74 65 33 72 62 75 20 2a 70 2c 20 0a 20 20 52  ite3rbu *p, .  R
caa0: 62 75 4f 62 6a 49 74 65 72 20 2a 70 49 74 65 72  buObjIter *pIter
cab0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
cac0: 7a 4f 62 6a 0a 29 7b 0a 20 20 63 68 61 72 20 2a  zObj.){.  char *
cad0: 7a 4c 69 73 74 20 3d 20 30 3b 0a 20 20 69 66 28  zList = 0;.  if(
cae0: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
caf0: 4b 20 26 26 20 70 49 74 65 72 2d 3e 61 62 49 6e  K && pIter->abIn
cb00: 64 65 78 65 64 20 29 7b 0a 20 20 20 20 63 6f 6e  dexed ){.    con
cb10: 73 74 20 63 68 61 72 20 2a 7a 53 20 3d 20 22 22  st char *zS = ""
cb20: 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
cb30: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65   for(i=0; i<pIte
cb40: 72 2d 3e 6e 54 62 6c 43 6f 6c 3b 20 69 2b 2b 29  r->nTblCol; i++)
cb50: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  {.      if( pIte
cb60: 72 2d 3e 61 62 49 6e 64 65 78 65 64 5b 69 5d 20  r->abIndexed[i] 
cb70: 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
cb80: 20 63 68 61 72 20 2a 7a 43 6f 6c 20 3d 20 70 49   char *zCol = pI
cb90: 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69 5d  ter->azTblCol[i]
cba0: 3b 0a 20 20 20 20 20 20 20 20 7a 4c 69 73 74 20  ;.        zList 
cbb0: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
cbc0: 66 28 22 25 7a 25 73 25 73 2e 5c 22 25 77 5c 22  f("%z%s%s.\"%w\"
cbd0: 22 2c 20 7a 4c 69 73 74 2c 20 7a 53 2c 20 7a 4f  ", zList, zS, zO
cbe0: 62 6a 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 20  bj, zCol);.     
cbf0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
cc00: 7a 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 5f  zList = sqlite3_
cc10: 6d 70 72 69 6e 74 66 28 22 25 7a 25 73 4e 55 4c  mprintf("%z%sNUL
cc20: 4c 22 2c 20 7a 4c 69 73 74 2c 20 7a 53 29 3b 0a  L", zList, zS);.
cc30: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 53        }.      zS
cc40: 20 3d 20 22 2c 20 22 3b 0a 20 20 20 20 20 20 69   = ", ";.      i
cc50: 66 28 20 7a 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( zList==0 ){. 
cc60: 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53         p->rc = S
cc70: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
cc80: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
cc90: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
cca0: 2a 20 46 6f 72 20 61 20 74 61 62 6c 65 20 77 69  * For a table wi
ccb0: 74 68 20 69 6d 70 6c 69 63 69 74 20 72 6f 77 69  th implicit rowi
ccc0: 64 73 2c 20 61 70 70 65 6e 64 20 22 6f 6c 64 2e  ds, append "old.
ccd0: 5f 72 6f 77 69 64 5f 22 20 74 6f 20 74 68 65 20  _rowid_" to the 
cce0: 6c 69 73 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28  list. */.    if(
ccf0: 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52   pIter->eType==R
cd00: 42 55 5f 50 4b 5f 45 58 54 45 52 4e 41 4c 20 7c  BU_PK_EXTERNAL |
cd10: 7c 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d  | pIter->eType==
cd20: 52 42 55 5f 50 4b 5f 4e 4f 4e 45 20 29 7b 0a 20  RBU_PK_NONE ){. 
cd30: 20 20 20 20 20 7a 4c 69 73 74 20 3d 20 72 62 75       zList = rbu
cd40: 4d 50 72 69 6e 74 66 28 70 2c 20 22 25 7a 2c 20  MPrintf(p, "%z, 
cd50: 25 73 2e 5f 72 6f 77 69 64 5f 22 2c 20 7a 4c 69  %s._rowid_", zLi
cd60: 73 74 2c 20 7a 4f 62 6a 29 3b 0a 20 20 20 20 7d  st, zObj);.    }
cd70: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4c  .  }.  return zL
cd80: 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ist;.}../*.** Re
cd90: 74 75 72 6e 20 61 6e 20 65 78 70 72 65 73 73 69  turn an expressi
cda0: 6f 6e 20 74 68 61 74 20 63 61 6e 20 62 65 20 75  on that can be u
cdb0: 73 65 64 20 69 6e 20 61 20 57 48 45 52 45 20 63  sed in a WHERE c
cdc0: 6c 61 75 73 65 20 74 6f 20 6d 61 74 63 68 20 74  lause to match t
cdd0: 68 65 0a 2a 2a 20 70 72 69 6d 61 72 79 20 6b 65  he.** primary ke
cde0: 79 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  y of the current
cdf0: 20 74 61 62 6c 65 2e 20 46 6f 72 20 65 78 61 6d   table. For exam
ce00: 70 6c 65 2c 20 69 66 20 74 68 65 20 74 61 62 6c  ple, if the tabl
ce10: 65 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52  e is:.**.**   CR
ce20: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
ce30: 20 62 2c 20 63 2c 20 50 52 49 4d 41 52 59 20 4b   b, c, PRIMARY K
ce40: 45 59 28 62 2c 20 63 29 29 3b 0a 2a 2a 0a 2a 2a  EY(b, c));.**.**
ce50: 20 52 65 74 75 72 6e 20 74 68 65 20 73 74 72 69   Return the stri
ce60: 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 62 20 3d  ng:.**.**   "b =
ce70: 20 3f 31 20 41 4e 44 20 63 20 3d 20 3f 32 22 0a   ?1 AND c = ?2".
ce80: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
ce90: 72 62 75 4f 62 6a 49 74 65 72 47 65 74 57 68 65  rbuObjIterGetWhe
cea0: 72 65 28 0a 20 20 73 71 6c 69 74 65 33 72 62 75  re(.  sqlite3rbu
ceb0: 20 2a 70 2c 20 0a 20 20 52 62 75 4f 62 6a 49 74   *p, .  RbuObjIt
cec0: 65 72 20 2a 70 49 74 65 72 0a 29 7b 0a 20 20 63  er *pIter.){.  c
ced0: 68 61 72 20 2a 7a 4c 69 73 74 20 3d 20 30 3b 0a  har *zList = 0;.
cee0: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 65 54 79    if( pIter->eTy
cef0: 70 65 3d 3d 52 42 55 5f 50 4b 5f 56 54 41 42 20  pe==RBU_PK_VTAB 
cf00: 7c 7c 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d  || pIter->eType=
cf10: 3d 52 42 55 5f 50 4b 5f 4e 4f 4e 45 20 29 7b 0a  =RBU_PK_NONE ){.
cf20: 20 20 20 20 7a 4c 69 73 74 20 3d 20 72 62 75 4d      zList = rbuM
cf30: 50 72 69 6e 74 66 28 70 2c 20 22 5f 72 6f 77 69  Printf(p, "_rowi
cf40: 64 5f 20 3d 20 3f 25 64 22 2c 20 70 49 74 65 72  d_ = ?%d", pIter
cf50: 2d 3e 6e 54 62 6c 43 6f 6c 2b 31 29 3b 0a 20 20  ->nTblCol+1);.  
cf60: 7d 65 6c 73 65 20 69 66 28 20 70 49 74 65 72 2d  }else if( pIter-
cf70: 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 45  >eType==RBU_PK_E
cf80: 58 54 45 52 4e 41 4c 20 29 7b 0a 20 20 20 20 63  XTERNAL ){.    c
cf90: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 65 70 20  onst char *zSep 
cfa0: 3d 20 22 22 3b 0a 20 20 20 20 69 6e 74 20 69 3b  = "";.    int i;
cfb0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
cfc0: 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 3b 20  pIter->nTblCol; 
cfd0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
cfe0: 70 49 74 65 72 2d 3e 61 62 54 62 6c 50 6b 5b 69  pIter->abTblPk[i
cff0: 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4c 69  ] ){.        zLi
d000: 73 74 20 3d 20 72 62 75 4d 50 72 69 6e 74 66 28  st = rbuMPrintf(
d010: 70 2c 20 22 25 7a 25 73 63 25 64 3d 3f 25 64 22  p, "%z%sc%d=?%d"
d020: 2c 20 7a 4c 69 73 74 2c 20 7a 53 65 70 2c 20 69  , zList, zSep, i
d030: 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  , i+1);.        
d040: 7a 53 65 70 20 3d 20 22 20 41 4e 44 20 22 3b 0a  zSep = " AND ";.
d050: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
d060: 20 20 7a 4c 69 73 74 20 3d 20 72 62 75 4d 50 72    zList = rbuMPr
d070: 69 6e 74 66 28 70 2c 20 0a 20 20 20 20 20 20 20  intf(p, .       
d080: 20 22 5f 72 6f 77 69 64 5f 20 3d 20 28 53 45 4c   "_rowid_ = (SEL
d090: 45 43 54 20 69 64 20 46 52 4f 4d 20 72 62 75 5f  ECT id FROM rbu_
d0a0: 69 6d 70 6f 73 74 65 72 32 20 57 48 45 52 45 20  imposter2 WHERE 
d0b0: 25 7a 29 22 2c 20 7a 4c 69 73 74 0a 20 20 20 20  %z)", zList.    
d0c0: 29 3b 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  );..  }else{.   
d0d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 65   const char *zSe
d0e0: 70 20 3d 20 22 22 3b 0a 20 20 20 20 69 6e 74 20  p = "";.    int 
d0f0: 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
d100: 69 3c 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c  i<pIter->nTblCol
d110: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
d120: 28 20 70 49 74 65 72 2d 3e 61 62 54 62 6c 50 6b  ( pIter->abTblPk
d130: 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 63  [i] ){.        c
d140: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 20  onst char *zCol 
d150: 3d 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f  = pIter->azTblCo
d160: 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 7a 4c  l[i];.        zL
d170: 69 73 74 20 3d 20 72 62 75 4d 50 72 69 6e 74 66  ist = rbuMPrintf
d180: 28 70 2c 20 22 25 7a 25 73 5c 22 25 77 5c 22 3d  (p, "%z%s\"%w\"=
d190: 3f 25 64 22 2c 20 7a 4c 69 73 74 2c 20 7a 53 65  ?%d", zList, zSe
d1a0: 70 2c 20 7a 43 6f 6c 2c 20 69 2b 31 29 3b 0a 20  p, zCol, i+1);. 
d1b0: 20 20 20 20 20 20 20 7a 53 65 70 20 3d 20 22 20         zSep = " 
d1c0: 41 4e 44 20 22 3b 0a 20 20 20 20 20 20 7d 0a 20  AND ";.      }. 
d1d0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
d1e0: 6e 20 7a 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  n zList;.}../*.*
d1f0: 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61  * The SELECT sta
d200: 74 65 6d 65 6e 74 20 69 74 65 72 61 74 69 6e 67  tement iterating
d210: 20 74 68 72 6f 75 67 68 20 74 68 65 20 6b 65 79   through the key
d220: 73 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  s for the curren
d230: 74 20 6f 62 6a 65 63 74 0a 2a 2a 20 28 70 2d 3e  t object.** (p->
d240: 6f 62 6a 69 74 65 72 2e 70 53 65 6c 65 63 74 29  objiter.pSelect)
d250: 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
d260: 73 20 74 6f 20 61 20 76 61 6c 69 64 20 72 6f 77  s to a valid row
d270: 2e 20 48 6f 77 65 76 65 72 2c 20 74 68 65 72 65  . However, there
d280: 0a 2a 2a 20 69 73 20 73 6f 6d 65 74 68 69 6e 67  .** is something
d290: 20 77 72 6f 6e 67 20 77 69 74 68 20 74 68 65 20   wrong with the 
d2a0: 72 62 75 5f 63 6f 6e 74 72 6f 6c 20 76 61 6c 75  rbu_control valu
d2b0: 65 20 69 6e 20 74 68 65 20 72 62 75 5f 63 6f 6e  e in the rbu_con
d2c0: 74 72 6f 6c 20 76 61 6c 75 65 0a 2a 2a 20 73 74  trol value.** st
d2d0: 6f 72 65 64 20 69 6e 20 74 68 65 20 28 70 2d 3e  ored in the (p->
d2e0: 6e 43 6f 6c 2b 31 29 27 74 68 20 63 6f 6c 75 6d  nCol+1)'th colum
d2f0: 6e 2e 20 53 65 74 20 74 68 65 20 65 72 72 6f 72  n. Set the error
d300: 20 63 6f 64 65 20 61 6e 64 20 65 72 72 6f 72 20   code and error 
d310: 6d 65 73 73 61 67 65 0a 2a 2a 20 6f 66 20 74 68  message.** of th
d320: 65 20 52 42 55 20 68 61 6e 64 6c 65 20 74 6f 20  e RBU handle to 
d330: 73 6f 6d 65 74 68 69 6e 67 20 72 65 66 6c 65 63  something reflec
d340: 74 69 6e 67 20 74 68 69 73 2e 0a 2a 2f 0a 73 74  ting this..*/.st
d350: 61 74 69 63 20 76 6f 69 64 20 72 62 75 42 61 64  atic void rbuBad
d360: 43 6f 6e 74 72 6f 6c 45 72 72 6f 72 28 73 71 6c  ControlError(sql
d370: 69 74 65 33 72 62 75 20 2a 70 29 7b 0a 20 20 70  ite3rbu *p){.  p
d380: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52  ->rc = SQLITE_ER
d390: 52 4f 52 3b 0a 20 20 70 2d 3e 7a 45 72 72 6d 73  ROR;.  p->zErrms
d3a0: 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  g = sqlite3_mpri
d3b0: 6e 74 66 28 22 69 6e 76 61 6c 69 64 20 72 62 75  ntf("invalid rbu
d3c0: 5f 63 6f 6e 74 72 6f 6c 20 76 61 6c 75 65 22 29  _control value")
d3d0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ;.}.../*.** Retu
d3e0: 72 6e 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  rn a nul-termina
d3f0: 74 65 64 20 73 74 72 69 6e 67 20 63 6f 6e 74 61  ted string conta
d400: 69 6e 69 6e 67 20 74 68 65 20 63 6f 6d 6d 61 20  ining the comma 
d410: 73 65 70 61 72 61 74 65 64 20 6c 69 73 74 20 6f  separated list o
d420: 66 0a 2a 2a 20 61 73 73 69 67 6e 6d 65 6e 74 73  f.** assignments
d430: 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
d440: 69 6e 63 6c 75 64 65 64 20 66 6f 6c 6c 6f 77 69  included followi
d450: 6e 67 20 74 68 65 20 22 53 45 54 22 20 6b 65 79  ng the "SET" key
d460: 77 6f 72 64 20 6f 66 0a 2a 2a 20 61 6e 20 55 50  word of.** an UP
d470: 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20 75  DATE statement u
d480: 73 65 64 20 74 6f 20 75 70 64 61 74 65 20 74 68  sed to update th
d490: 65 20 74 61 62 6c 65 20 6f 62 6a 65 63 74 20 74  e table object t
d4a0: 68 61 74 20 74 68 65 20 69 74 65 72 61 74 6f 72  hat the iterator
d4b0: 0a 2a 2a 20 70 61 73 73 65 64 20 61 73 20 74 68  .** passed as th
d4c0: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
d4d0: 74 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  t currently poin
d4e0: 74 73 20 74 6f 20 69 66 20 74 68 65 20 72 62 75  ts to if the rbu
d4f0: 5f 63 6f 6e 74 72 6f 6c 0a 2a 2a 20 63 6f 6c 75  _control.** colu
d500: 6d 6e 20 6f 66 20 74 68 65 20 64 61 74 61 5f 78  mn of the data_x
d510: 78 78 20 74 61 62 6c 65 20 65 6e 74 72 79 20 69  xx table entry i
d520: 73 20 73 65 74 20 74 6f 20 7a 4d 61 73 6b 2e 0a  s set to zMask..
d530: 2a 2a 0a 2a 2a 20 54 68 65 20 6d 65 6d 6f 72 79  **.** The memory
d540: 20 66 6f 72 20 74 68 65 20 72 65 74 75 72 6e 65   for the returne
d550: 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61  d string is obta
d560: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
d570: 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 49  3_malloc()..** I
d580: 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73  t is the respons
d590: 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
d5a0: 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61  aller to eventua
d5b0: 6c 6c 79 20 66 72 65 65 20 69 74 20 75 73 69 6e  lly free it usin
d5c0: 67 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66 72 65  g.** sqlite3_fre
d5d0: 65 28 29 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61  e(). .**.** If a
d5e0: 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 69 73 20 65  n OOM error is e
d5f0: 6e 63 6f 75 6e 74 65 72 65 64 20 77 68 65 6e 20  ncountered when 
d600: 61 6c 6c 6f 63 61 74 69 6e 67 20 73 70 61 63 65  allocating space
d610: 20 66 6f 72 20 74 68 65 20 6e 65 77 0a 2a 2a 20   for the new.** 
d620: 73 74 72 69 6e 67 2c 20 61 6e 20 65 72 72 6f 72  string, an error
d630: 20 63 6f 64 65 20 69 73 20 6c 65 66 74 20 69 6e   code is left in
d640: 20 74 68 65 20 72 62 75 20 68 61 6e 64 6c 65 20   the rbu handle 
d650: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
d660: 72 73 74 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20  rst.** argument 
d670: 61 6e 64 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  and NULL is retu
d680: 72 6e 65 64 2e 20 4f 72 2c 20 69 66 20 61 6e 20  rned. Or, if an 
d690: 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64  error has alread
d6a0: 79 20 6f 63 63 75 72 72 65 64 0a 2a 2a 20 77 68  y occurred.** wh
d6b0: 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
d6c0: 20 69 73 20 63 61 6c 6c 65 64 2c 20 4e 55 4c 4c   is called, NULL
d6d0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 6d 6d   is returned imm
d6e0: 65 64 69 61 74 65 6c 79 2c 20 77 69 74 68 6f 75  ediately, withou
d6f0: 74 0a 2a 2a 20 61 74 74 65 6d 70 74 69 6e 67 20  t.** attempting 
d700: 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f  the allocation o
d710: 72 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20  r modifying the 
d720: 73 74 6f 72 65 64 20 65 72 72 6f 72 20 63 6f 64  stored error cod
d730: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  e..*/.static cha
d740: 72 20 2a 72 62 75 4f 62 6a 49 74 65 72 47 65 74  r *rbuObjIterGet
d750: 53 65 74 6c 69 73 74 28 0a 20 20 73 71 6c 69 74  Setlist(.  sqlit
d760: 65 33 72 62 75 20 2a 70 2c 0a 20 20 52 62 75 4f  e3rbu *p,.  RbuO
d770: 62 6a 49 74 65 72 20 2a 70 49 74 65 72 2c 0a 20  bjIter *pIter,. 
d780: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61   const char *zMa
d790: 73 6b 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4c  sk.){.  char *zL
d7a0: 69 73 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  ist = 0;.  if( p
d7b0: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
d7c0: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20  ){.    int i;.. 
d7d0: 20 20 20 69 66 28 20 28 69 6e 74 29 73 74 72 6c     if( (int)strl
d7e0: 65 6e 28 7a 4d 61 73 6b 29 21 3d 70 49 74 65 72  en(zMask)!=pIter
d7f0: 2d 3e 6e 54 62 6c 43 6f 6c 20 29 7b 0a 20 20 20  ->nTblCol ){.   
d800: 20 20 20 72 62 75 42 61 64 43 6f 6e 74 72 6f 6c     rbuBadControl
d810: 45 72 72 6f 72 28 70 29 3b 0a 20 20 20 20 7d 65  Error(p);.    }e
d820: 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  lse{.      const
d830: 20 63 68 61 72 20 2a 7a 53 65 70 20 3d 20 22 22   char *zSep = ""
d840: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
d850: 20 69 3c 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f   i<pIter->nTblCo
d860: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; i++){.       
d870: 20 63 68 61 72 20 63 20 3d 20 7a 4d 61 73 6b 5b   char c = zMask[
d880: 70 49 74 65 72 2d 3e 61 69 53 72 63 4f 72 64 65  pIter->aiSrcOrde
d890: 72 5b 69 5d 5d 3b 0a 20 20 20 20 20 20 20 20 69  r[i]];.        i
d8a0: 66 28 20 63 3d 3d 27 78 27 20 29 7b 0a 20 20 20  f( c=='x' ){.   
d8b0: 20 20 20 20 20 20 20 7a 4c 69 73 74 20 3d 20 72         zList = r
d8c0: 62 75 4d 50 72 69 6e 74 66 28 70 2c 20 22 25 7a  buMPrintf(p, "%z
d8d0: 25 73 5c 22 25 77 5c 22 3d 3f 25 64 22 2c 20 0a  %s\"%w\"=?%d", .
d8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4c                zL
d8f0: 69 73 74 2c 20 7a 53 65 70 2c 20 70 49 74 65 72  ist, zSep, pIter
d900: 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69 5d 2c 20 69  ->azTblCol[i], i
d910: 2b 31 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a  +1.          );.
d920: 20 20 20 20 20 20 20 20 20 20 7a 53 65 70 20 3d            zSep =
d930: 20 22 2c 20 22 3b 0a 20 20 20 20 20 20 20 20 7d   ", ";.        }
d940: 0a 20 20 20 20 20 20 20 20 65 6c 73 65 20 69 66  .        else if
d950: 28 20 63 3d 3d 27 64 27 20 29 7b 0a 20 20 20 20  ( c=='d' ){.    
d960: 20 20 20 20 20 20 7a 4c 69 73 74 20 3d 20 72 62        zList = rb
d970: 75 4d 50 72 69 6e 74 66 28 70 2c 20 22 25 7a 25  uMPrintf(p, "%z%
d980: 73 5c 22 25 77 5c 22 3d 72 62 75 5f 64 65 6c 74  s\"%w\"=rbu_delt
d990: 61 28 5c 22 25 77 5c 22 2c 20 3f 25 64 29 22 2c  a(\"%w\", ?%d)",
d9a0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
d9b0: 7a 4c 69 73 74 2c 20 7a 53 65 70 2c 20 70 49 74  zList, zSep, pIt
d9c0: 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69 5d 2c  er->azTblCol[i],
d9d0: 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c   pIter->azTblCol
d9e0: 5b 69 5d 2c 20 69 2b 31 0a 20 20 20 20 20 20 20  [i], i+1.       
d9f0: 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20     );.          
da00: 7a 53 65 70 20 3d 20 22 2c 20 22 3b 0a 20 20 20  zSep = ", ";.   
da10: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 65       }.        e
da20: 6c 73 65 20 69 66 28 20 63 3d 3d 27 66 27 20 29  lse if( c=='f' )
da30: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 4c 69 73  {.          zLis
da40: 74 20 3d 20 72 62 75 4d 50 72 69 6e 74 66 28 70  t = rbuMPrintf(p
da50: 2c 20 22 25 7a 25 73 5c 22 25 77 5c 22 3d 72 62  , "%z%s\"%w\"=rb
da60: 75 5f 66 6f 73 73 69 6c 5f 64 65 6c 74 61 28 5c  u_fossil_delta(\
da70: 22 25 77 5c 22 2c 20 3f 25 64 29 22 2c 20 0a 20  "%w\", ?%d)", . 
da80: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4c 69               zLi
da90: 73 74 2c 20 7a 53 65 70 2c 20 70 49 74 65 72 2d  st, zSep, pIter-
daa0: 3e 61 7a 54 62 6c 43 6f 6c 5b 69 5d 2c 20 70 49  >azTblCol[i], pI
dab0: 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69 5d  ter->azTblCol[i]
dac0: 2c 20 69 2b 31 0a 20 20 20 20 20 20 20 20 20 20  , i+1.          
dad0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 53 65  );.          zSe
dae0: 70 20 3d 20 22 2c 20 22 3b 0a 20 20 20 20 20 20  p = ", ";.      
daf0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
db00: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  }.  }.  return z
db10: 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  List;.}../*.** R
db20: 65 74 75 72 6e 20 61 20 6e 75 6c 2d 74 65 72 6d  eturn a nul-term
db30: 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20 63 6f  inated string co
db40: 6e 73 69 73 74 69 6e 67 20 6f 66 20 6e 42 79 74  nsisting of nByt
db50: 65 20 63 6f 6d 6d 61 20 73 65 70 61 72 61 74 65  e comma separate
db60: 64 0a 2a 2a 20 22 3f 22 20 65 78 70 72 65 73 73  d.** "?" express
db70: 69 6f 6e 73 2e 20 46 6f 72 20 65 78 61 6d 70 6c  ions. For exampl
db80: 65 2c 20 69 66 20 6e 42 79 74 65 20 69 73 20 33  e, if nByte is 3
db90: 2c 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  , return a point
dba0: 65 72 20 74 6f 0a 2a 2a 20 61 20 62 75 66 66 65  er to.** a buffe
dbb0: 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  r containing the
dbc0: 20 73 74 72 69 6e 67 20 22 3f 2c 3f 2c 3f 22 2e   string "?,?,?".
dbd0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 65 6d 6f 72  .**.** The memor
dbe0: 79 20 66 6f 72 20 74 68 65 20 72 65 74 75 72 6e  y for the return
dbf0: 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74  ed string is obt
dc00: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
dc10: 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20  e3_malloc()..** 
dc20: 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e  It is the respon
dc30: 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
dc40: 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75  caller to eventu
dc50: 61 6c 6c 79 20 66 72 65 65 20 69 74 20 75 73 69  ally free it usi
dc60: 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66 72  ng.** sqlite3_fr
dc70: 65 65 28 29 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  ee(). .**.** If 
dc80: 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 69 73 20  an OOM error is 
dc90: 65 6e 63 6f 75 6e 74 65 72 65 64 20 77 68 65 6e  encountered when
dca0: 20 61 6c 6c 6f 63 61 74 69 6e 67 20 73 70 61 63   allocating spac
dcb0: 65 20 66 6f 72 20 74 68 65 20 6e 65 77 0a 2a 2a  e for the new.**
dcc0: 20 73 74 72 69 6e 67 2c 20 61 6e 20 65 72 72 6f   string, an erro
dcd0: 72 20 63 6f 64 65 20 69 73 20 6c 65 66 74 20 69  r code is left i
dce0: 6e 20 74 68 65 20 72 62 75 20 68 61 6e 64 6c 65  n the rbu handle
dcf0: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
dd00: 69 72 73 74 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  irst.** argument
dd10: 20 61 6e 64 20 4e 55 4c 4c 20 69 73 20 72 65 74   and NULL is ret
dd20: 75 72 6e 65 64 2e 20 4f 72 2c 20 69 66 20 61 6e  urned. Or, if an
dd30: 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61   error has alrea
dd40: 64 79 20 6f 63 63 75 72 72 65 64 0a 2a 2a 20 77  dy occurred.** w
dd50: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
dd60: 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 4e 55 4c  n is called, NUL
dd70: 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 6d  L is returned im
dd80: 6d 65 64 69 61 74 65 6c 79 2c 20 77 69 74 68 6f  mediately, witho
dd90: 75 74 0a 2a 2a 20 61 74 74 65 6d 70 74 69 6e 67  ut.** attempting
dda0: 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20   the allocation 
ddb0: 6f 72 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65  or modifying the
ddc0: 20 73 74 6f 72 65 64 20 65 72 72 6f 72 20 63 6f   stored error co
ddd0: 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  de..*/.static ch
dde0: 61 72 20 2a 72 62 75 4f 62 6a 49 74 65 72 47 65  ar *rbuObjIterGe
ddf0: 74 42 69 6e 64 6c 69 73 74 28 73 71 6c 69 74 65  tBindlist(sqlite
de00: 33 72 62 75 20 2a 70 2c 20 69 6e 74 20 6e 42 69  3rbu *p, int nBi
de10: 6e 64 29 7b 0a 20 20 63 68 61 72 20 2a 7a 52 65  nd){.  char *zRe
de20: 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 42 79  t = 0;.  int nBy
de30: 74 65 20 3d 20 6e 42 69 6e 64 2a 32 20 2b 20 31  te = nBind*2 + 1
de40: 3b 0a 0a 20 20 7a 52 65 74 20 3d 20 28 63 68 61  ;..  zRet = (cha
de50: 72 2a 29 72 62 75 4d 61 6c 6c 6f 63 28 70 2c 20  r*)rbuMalloc(p, 
de60: 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 7a 52  nByte);.  if( zR
de70: 65 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  et ){.    int i;
de80: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
de90: 6e 42 69 6e 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  nBind; i++){.   
dea0: 20 20 20 7a 52 65 74 5b 69 2a 32 5d 20 3d 20 27     zRet[i*2] = '
deb0: 3f 27 3b 0a 20 20 20 20 20 20 7a 52 65 74 5b 69  ?';.      zRet[i
dec0: 2a 32 2b 31 5d 20 3d 20 28 69 2b 31 3d 3d 6e 42  *2+1] = (i+1==nB
ded0: 69 6e 64 29 20 3f 20 27 5c 30 27 20 3a 20 27 2c  ind) ? '\0' : ',
dee0: 27 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  ';.    }.  }.  r
def0: 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 0a 2f  eturn zRet;.}../
df00: 2a 0a 2a 2a 20 54 68 65 20 69 74 65 72 61 74 6f  *.** The iterato
df10: 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  r currently poin
df20: 74 73 20 74 6f 20 61 20 74 61 62 6c 65 20 28 6e  ts to a table (n
df30: 6f 74 20 69 6e 64 65 78 29 20 6f 66 20 74 79 70  ot index) of typ
df40: 65 20 0a 2a 2a 20 52 42 55 5f 50 4b 5f 57 49 54  e .** RBU_PK_WIT
df50: 48 4f 55 54 5f 52 4f 57 49 44 2e 20 54 68 69 73  HOUT_ROWID. This
df60: 20 66 75 6e 63 74 69 6f 6e 20 63 72 65 61 74 65   function create
df70: 73 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  s the PRIMARY KE
df80: 59 20 0a 2a 2a 20 64 65 63 6c 61 72 61 74 69 6f  Y .** declaratio
df90: 6e 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65 73  n for the corres
dfa0: 70 6f 6e 64 69 6e 67 20 69 6d 70 6f 73 74 65 72  ponding imposter
dfb0: 20 74 61 62 6c 65 2e 20 46 6f 72 20 65 78 61 6d   table. For exam
dfc0: 70 6c 65 2c 0a 2a 2a 20 69 66 20 74 68 65 20 69  ple,.** if the i
dfd0: 74 65 72 61 74 6f 72 20 70 6f 69 6e 74 73 20 74  terator points t
dfe0: 6f 20 61 20 74 61 62 6c 65 20 63 72 65 61 74 65  o a table create
dff0: 64 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52  d as:.**.**   CR
e000: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
e010: 20 62 2c 20 63 2c 20 50 52 49 4d 41 52 59 20 4b   b, c, PRIMARY K
e020: 45 59 28 62 2c 20 61 20 44 45 53 43 29 29 20 57  EY(b, a DESC)) W
e030: 49 54 48 4f 55 54 20 52 4f 57 49 44 0a 2a 2a 0a  ITHOUT ROWID.**.
e040: 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
e050: 20 72 65 74 75 72 6e 73 3a 0a 2a 2a 0a 2a 2a 20   returns:.**.** 
e060: 20 20 50 52 49 4d 41 52 59 20 4b 45 59 28 22 62    PRIMARY KEY("b
e070: 22 2c 20 22 61 22 20 44 45 53 43 29 0a 2a 2f 0a  ", "a" DESC).*/.
e080: 73 74 61 74 69 63 20 63 68 61 72 20 2a 72 62 75  static char *rbu
e090: 57 69 74 68 6f 75 74 52 6f 77 69 64 50 4b 28 73  WithoutRowidPK(s
e0a0: 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 52 62  qlite3rbu *p, Rb
e0b0: 75 4f 62 6a 49 74 65 72 20 2a 70 49 74 65 72 29  uObjIter *pIter)
e0c0: 7b 0a 20 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b  {.  char *z = 0;
e0d0: 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72  .  assert( pIter
e0e0: 2d 3e 7a 49 64 78 3d 3d 30 20 29 3b 0a 20 20 69  ->zIdx==0 );.  i
e0f0: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
e100: 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  _OK ){.    const
e110: 20 63 68 61 72 20 2a 7a 53 65 70 20 3d 20 22 50   char *zSep = "P
e120: 52 49 4d 41 52 59 20 4b 45 59 28 22 3b 0a 20 20  RIMARY KEY(";.  
e130: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
e140: 70 58 4c 69 73 74 20 3d 20 30 3b 20 20 20 20 20  pXList = 0;     
e150: 2f 2a 20 50 52 41 47 4d 41 20 69 6e 64 65 78 5f  /* PRAGMA index_
e160: 6c 69 73 74 20 3d 20 28 70 49 74 65 72 2d 3e 7a  list = (pIter->z
e170: 54 62 6c 29 20 2a 2f 0a 20 20 20 20 73 71 6c 69  Tbl) */.    sqli
e180: 74 65 33 5f 73 74 6d 74 20 2a 70 58 49 6e 66 6f  te3_stmt *pXInfo
e190: 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 50 52 41   = 0;     /* PRA
e1a0: 47 4d 41 20 69 6e 64 65 78 5f 78 69 6e 66 6f 20  GMA index_xinfo 
e1b0: 3d 20 3c 70 6b 2d 69 6e 64 65 78 3e 20 2a 2f 0a  = <pk-index> */.
e1c0: 20 20 20 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20     .    p->rc = 
e1d0: 70 72 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f  prepareFreeAndCo
e1e0: 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62  llectError(p->db
e1f0: 4d 61 69 6e 2c 20 26 70 58 4c 69 73 74 2c 20 26  Main, &pXList, &
e200: 70 2d 3e 7a 45 72 72 6d 73 67 2c 0a 20 20 20 20  p->zErrmsg,.    
e210: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69      sqlite3_mpri
e220: 6e 74 66 28 22 50 52 41 47 4d 41 20 6d 61 69 6e  ntf("PRAGMA main
e230: 2e 69 6e 64 65 78 5f 6c 69 73 74 20 3d 20 25 51  .index_list = %Q
e240: 22 2c 20 70 49 74 65 72 2d 3e 7a 54 62 6c 29 0a  ", pIter->zTbl).
e250: 20 20 20 20 29 3b 0a 20 20 20 20 77 68 69 6c 65      );.    while
e260: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
e270: 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57  OK && SQLITE_ROW
e280: 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ==sqlite3_step(p
e290: 58 4c 69 73 74 29 20 29 7b 0a 20 20 20 20 20 20  XList) ){.      
e2a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69  const char *zOri
e2b0: 67 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  g = (const char*
e2c0: 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
e2d0: 74 65 78 74 28 70 58 4c 69 73 74 2c 33 29 3b 0a  text(pXList,3);.
e2e0: 20 20 20 20 20 20 69 66 28 20 7a 4f 72 69 67 20        if( zOrig 
e2f0: 26 26 20 73 74 72 63 6d 70 28 7a 4f 72 69 67 2c  && strcmp(zOrig,
e300: 20 22 70 6b 22 29 3d 3d 30 20 29 7b 0a 20 20 20   "pk")==0 ){.   
e310: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
e320: 2a 7a 49 64 78 20 3d 20 28 63 6f 6e 73 74 20 63  *zIdx = (const c
e330: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
e340: 75 6d 6e 5f 74 65 78 74 28 70 58 4c 69 73 74 2c  umn_text(pXList,
e350: 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
e360: 7a 49 64 78 20 29 7b 0a 20 20 20 20 20 20 20 20  zIdx ){.        
e370: 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72    p->rc = prepar
e380: 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45  eFreeAndCollectE
e390: 72 72 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20  rror(p->dbMain, 
e3a0: 26 70 58 49 6e 66 6f 2c 20 26 70 2d 3e 7a 45 72  &pXInfo, &p->zEr
e3b0: 72 6d 73 67 2c 0a 20 20 20 20 20 20 20 20 20 20  rmsg,.          
e3c0: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69      sqlite3_mpri
e3d0: 6e 74 66 28 22 50 52 41 47 4d 41 20 6d 61 69 6e  ntf("PRAGMA main
e3e0: 2e 69 6e 64 65 78 5f 78 69 6e 66 6f 20 3d 20 25  .index_xinfo = %
e3f0: 51 22 2c 20 7a 49 64 78 29 0a 20 20 20 20 20 20  Q", zIdx).      
e400: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7d      );.        }
e410: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
e420: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
e430: 20 20 72 62 75 46 69 6e 61 6c 69 7a 65 28 70 2c    rbuFinalize(p,
e440: 20 70 58 4c 69 73 74 29 3b 0a 0a 20 20 20 20 77   pXList);..    w
e450: 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  hile( p->rc==SQL
e460: 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45  ITE_OK && SQLITE
e470: 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74  _ROW==sqlite3_st
e480: 65 70 28 70 58 49 6e 66 6f 29 20 29 7b 0a 20 20  ep(pXInfo) ){.  
e490: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
e4a0: 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 58 49 6e 66  column_int(pXInf
e4b0: 6f 2c 20 35 29 20 29 7b 0a 20 20 20 20 20 20 20  o, 5) ){.       
e4c0: 20 2f 2a 20 69 6e 74 20 69 43 69 64 20 3d 20 73   /* int iCid = s
e4d0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
e4e0: 74 28 70 58 49 6e 66 6f 2c 20 30 29 3b 20 2a 2f  t(pXInfo, 0); */
e4f0: 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
e500: 68 61 72 20 2a 7a 43 6f 6c 20 3d 20 28 63 6f 6e  har *zCol = (con
e510: 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
e520: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 58 49  _column_text(pXI
e530: 6e 66 6f 2c 20 32 29 3b 0a 20 20 20 20 20 20 20  nfo, 2);.       
e540: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 65   const char *zDe
e550: 73 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  sc = sqlite3_col
e560: 75 6d 6e 5f 69 6e 74 28 70 58 49 6e 66 6f 2c 20  umn_int(pXInfo, 
e570: 33 29 20 3f 20 22 20 44 45 53 43 22 20 3a 20 22  3) ? " DESC" : "
e580: 22 3b 0a 20 20 20 20 20 20 20 20 7a 20 3d 20 72  ";.        z = r
e590: 62 75 4d 50 72 69 6e 74 66 28 70 2c 20 22 25 7a  buMPrintf(p, "%z
e5a0: 25 73 5c 22 25 77 5c 22 25 73 22 2c 20 7a 2c 20  %s\"%w\"%s", z, 
e5b0: 7a 53 65 70 2c 20 7a 43 6f 6c 2c 20 7a 44 65 73  zSep, zCol, zDes
e5c0: 63 29 3b 0a 20 20 20 20 20 20 20 20 7a 53 65 70  c);.        zSep
e5d0: 20 3d 20 22 2c 20 22 3b 0a 20 20 20 20 20 20 7d   = ", ";.      }
e5e0: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 20 3d 20 72  .    }.    z = r
e5f0: 62 75 4d 50 72 69 6e 74 66 28 70 2c 20 22 25 7a  buMPrintf(p, "%z
e600: 29 22 2c 20 7a 29 3b 0a 20 20 20 20 72 62 75 46  )", z);.    rbuF
e610: 69 6e 61 6c 69 7a 65 28 70 2c 20 70 58 49 6e 66  inalize(p, pXInf
e620: 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  o);.  }.  return
e630: 20 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   z;.}../*.** Thi
e640: 73 20 66 75 6e 63 74 69 6f 6e 20 63 72 65 61 74  s function creat
e650: 65 73 20 74 68 65 20 73 65 63 6f 6e 64 20 69 6d  es the second im
e660: 70 6f 73 74 65 72 20 74 61 62 6c 65 20 75 73 65  poster table use
e670: 64 20 77 68 65 6e 20 77 72 69 74 69 6e 67 20 74  d when writing t
e680: 6f 0a 2a 2a 20 61 20 74 61 62 6c 65 20 62 2d 74  o.** a table b-t
e690: 72 65 65 20 77 68 65 72 65 20 74 68 65 20 74 61  ree where the ta
e6a0: 62 6c 65 20 68 61 73 20 61 6e 20 65 78 74 65 72  ble has an exter
e6b0: 6e 61 6c 20 70 72 69 6d 61 72 79 20 6b 65 79 2e  nal primary key.
e6c0: 20 49 66 20 74 68 65 0a 2a 2a 20 69 74 65 72 61   If the.** itera
e6d0: 74 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68  tor passed as th
e6e0: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
e6f0: 74 20 64 6f 65 73 20 6e 6f 74 20 63 75 72 72 65  t does not curre
e700: 6e 74 6c 79 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a  ntly point to.**
e710: 20 61 20 74 61 62 6c 65 20 28 6e 6f 74 20 69 6e   a table (not in
e720: 64 65 78 29 20 77 69 74 68 20 61 6e 20 65 78 74  dex) with an ext
e730: 65 72 6e 61 6c 20 70 72 69 6d 61 72 79 20 6b 65  ernal primary ke
e740: 79 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  y, this function
e750: 20 69 73 20 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20   is a.** no-op. 
e760: 0a 2a 2a 0a 2a 2a 20 41 73 73 75 6d 69 6e 67 20  .**.** Assuming 
e770: 74 68 65 20 69 74 65 72 61 74 6f 72 20 64 6f 65  the iterator doe
e780: 73 20 70 6f 69 6e 74 20 74 6f 20 61 20 74 61 62  s point to a tab
e790: 6c 65 20 77 69 74 68 20 61 6e 20 65 78 74 65 72  le with an exter
e7a0: 6e 61 6c 20 50 4b 2c 20 74 68 69 73 0a 2a 2a 20  nal PK, this.** 
e7b0: 66 75 6e 63 74 69 6f 6e 20 63 72 65 61 74 65 73  function creates
e7c0: 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44   a WITHOUT ROWID
e7d0: 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 20   imposter table 
e7e0: 6e 61 6d 65 64 20 22 72 62 75 5f 69 6d 70 6f 73  named "rbu_impos
e7f0: 74 65 72 32 22 0a 2a 2a 20 75 73 65 64 20 74 6f  ter2".** used to
e800: 20 61 63 63 65 73 73 20 74 68 61 74 20 50 4b 20   access that PK 
e810: 69 6e 64 65 78 2e 20 46 6f 72 20 65 78 61 6d 70  index. For examp
e820: 6c 65 2c 20 69 66 20 74 68 65 20 74 61 72 67 65  le, if the targe
e830: 74 20 74 61 62 6c 65 20 69 73 0a 2a 2a 20 64 65  t table is.** de
e840: 63 6c 61 72 65 64 20 61 73 20 66 6f 6c 6c 6f 77  clared as follow
e850: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54  s:.**.**   CREAT
e860: 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 20  E TABLE t1(a, b 
e870: 54 45 58 54 2c 20 63 20 52 45 41 4c 2c 20 50 52  TEXT, c REAL, PR
e880: 49 4d 41 52 59 20 4b 45 59 28 62 2c 20 63 29 29  IMARY KEY(b, c))
e890: 3b 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 74 68 65  ;.**.** then the
e8a0: 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 20   imposter table 
e8b0: 73 63 68 65 6d 61 20 69 73 3a 0a 2a 2a 0a 2a 2a  schema is:.**.**
e8c0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
e8d0: 72 62 75 5f 69 6d 70 6f 73 74 65 72 32 28 63 31  rbu_imposter2(c1
e8e0: 20 54 45 58 54 2c 20 63 32 20 52 45 41 4c 2c 20   TEXT, c2 REAL, 
e8f0: 69 64 20 49 4e 54 45 47 45 52 29 20 57 49 54 48  id INTEGER) WITH
e900: 4f 55 54 20 52 4f 57 49 44 3b 0a 2a 2a 0a 2a 2f  OUT ROWID;.**.*/
e910: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75  .static void rbu
e920: 43 72 65 61 74 65 49 6d 70 6f 73 74 65 72 54 61  CreateImposterTa
e930: 62 6c 65 32 28 73 71 6c 69 74 65 33 72 62 75 20  ble2(sqlite3rbu 
e940: 2a 70 2c 20 52 62 75 4f 62 6a 49 74 65 72 20 2a  *p, RbuObjIter *
e950: 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70 2d  pIter){.  if( p-
e960: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
e970: 26 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d  & pIter->eType==
e980: 52 42 55 5f 50 4b 5f 45 58 54 45 52 4e 41 4c 20  RBU_PK_EXTERNAL 
e990: 29 7b 0a 20 20 20 20 69 6e 74 20 74 6e 75 6d 20  ){.    int tnum 
e9a0: 3d 20 70 49 74 65 72 2d 3e 69 50 6b 54 6e 75 6d  = pIter->iPkTnum
e9b0: 3b 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67  ;    /* Root pag
e9c0: 65 20 6f 66 20 50 4b 20 69 6e 64 65 78 20 2a 2f  e of PK index */
e9d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  .    sqlite3_stm
e9e0: 74 20 2a 70 51 75 65 72 79 20 3d 20 30 3b 20 20  t *pQuery = 0;  
e9f0: 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 6e 61 6d     /* SELECT nam
ea00: 65 20 2e 2e 2e 20 57 48 45 52 45 20 72 6f 6f 74  e ... WHERE root
ea10: 70 61 67 65 20 3d 20 24 74 6e 75 6d 20 2a 2f 0a  page = $tnum */.
ea20: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
ea30: 7a 49 64 78 20 3d 20 30 3b 20 20 20 20 20 20 20  zIdx = 0;       
ea40: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 50 4b 20    /* Name of PK 
ea50: 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 73 71 6c  index */.    sql
ea60: 69 74 65 33 5f 73 74 6d 74 20 2a 70 58 49 6e 66  ite3_stmt *pXInf
ea70: 6f 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 50 52  o = 0;     /* PR
ea80: 41 47 4d 41 20 6d 61 69 6e 2e 69 6e 64 65 78 5f  AGMA main.index_
ea90: 78 69 6e 66 6f 20 3d 20 24 7a 49 64 78 20 2a 2f  xinfo = $zIdx */
eaa0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
eab0: 2a 7a 43 6f 6d 6d 61 20 3d 20 22 22 3b 0a 20 20  *zComma = "";.  
eac0: 20 20 63 68 61 72 20 2a 7a 43 6f 6c 73 20 3d 20    char *zCols = 
ead0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
eae0: 2f 2a 20 55 73 65 64 20 74 6f 20 62 75 69 6c 64  /* Used to build
eaf0: 20 75 70 20 6c 69 73 74 20 6f 66 20 74 61 62 6c   up list of tabl
eb00: 65 20 63 6f 6c 73 20 2a 2f 0a 20 20 20 20 63 68  e cols */.    ch
eb10: 61 72 20 2a 7a 50 6b 20 3d 20 30 3b 20 20 20 20  ar *zPk = 0;    
eb20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
eb30: 73 65 64 20 74 6f 20 62 75 69 6c 64 20 75 70 20  sed to build up 
eb40: 74 61 62 6c 65 20 50 4b 20 64 65 63 6c 61 72 61  table PK declara
eb50: 74 69 6f 6e 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  tion */..    /* 
eb60: 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 6e  Figure out the n
eb70: 61 6d 65 20 6f 66 20 74 68 65 20 70 72 69 6d 61  ame of the prima
eb80: 72 79 20 6b 65 79 20 69 6e 64 65 78 20 66 6f 72  ry key index for
eb90: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62   the current tab
eba0: 6c 65 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20  le..    ** This 
ebb0: 69 73 20 6e 65 65 64 65 64 20 66 6f 72 20 74 68  is needed for th
ebc0: 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 22 50  e argument to "P
ebd0: 52 41 47 4d 41 20 69 6e 64 65 78 5f 78 69 6e 66  RAGMA index_xinf
ebe0: 6f 22 2e 20 53 65 74 0a 20 20 20 20 2a 2a 20 7a  o". Set.    ** z
ebf0: 49 64 78 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  Idx to point to 
ec00: 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64  a nul-terminated
ec10: 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69   string containi
ec20: 6e 67 20 74 68 69 73 20 6e 61 6d 65 2e 20 2a 2f  ng this name. */
ec30: 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 72 65  .    p->rc = pre
ec40: 70 61 72 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72  pareAndCollectEr
ec50: 72 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 26  ror(p->dbMain, &
ec60: 70 51 75 65 72 79 2c 20 26 70 2d 3e 7a 45 72 72  pQuery, &p->zErr
ec70: 6d 73 67 2c 20 0a 20 20 20 20 20 20 20 20 22 53  msg, .        "S
ec80: 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20  ELECT name FROM 
ec90: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 57 48  sqlite_master WH
eca0: 45 52 45 20 72 6f 6f 74 70 61 67 65 20 3d 20 3f  ERE rootpage = ?
ecb0: 22 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  ".    );.    if(
ecc0: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
ecd0: 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
ece0: 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 51 75 65  e3_bind_int(pQue
ecf0: 72 79 2c 20 31 2c 20 74 6e 75 6d 29 3b 0a 20 20  ry, 1, tnum);.  
ed00: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52      if( SQLITE_R
ed10: 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
ed20: 28 70 51 75 65 72 79 29 20 29 7b 0a 20 20 20 20  (pQuery) ){.    
ed30: 20 20 20 20 7a 49 64 78 20 3d 20 28 63 6f 6e 73      zIdx = (cons
ed40: 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
ed50: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 51 75 65  column_text(pQue
ed60: 72 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ry, 0);.      }.
ed70: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 49      }.    if( zI
ed80: 64 78 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72  dx ){.      p->r
ed90: 63 20 3d 20 70 72 65 70 61 72 65 46 72 65 65 41  c = prepareFreeA
eda0: 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70  ndCollectError(p
edb0: 2d 3e 64 62 4d 61 69 6e 2c 20 26 70 58 49 6e 66  ->dbMain, &pXInf
edc0: 6f 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 0a  o, &p->zErrmsg,.
edd0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
ede0: 33 5f 6d 70 72 69 6e 74 66 28 22 50 52 41 47 4d  3_mprintf("PRAGM
edf0: 41 20 6d 61 69 6e 2e 69 6e 64 65 78 5f 78 69 6e  A main.index_xin
ee00: 66 6f 20 3d 20 25 51 22 2c 20 7a 49 64 78 29 0a  fo = %Q", zIdx).
ee10: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
ee20: 20 20 20 72 62 75 46 69 6e 61 6c 69 7a 65 28 70     rbuFinalize(p
ee30: 2c 20 70 51 75 65 72 79 29 3b 0a 0a 20 20 20 20  , pQuery);..    
ee40: 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51  while( p->rc==SQ
ee50: 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54  LITE_OK && SQLIT
ee60: 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73  E_ROW==sqlite3_s
ee70: 74 65 70 28 70 58 49 6e 66 6f 29 20 29 7b 0a 20  tep(pXInfo) ){. 
ee80: 20 20 20 20 20 69 6e 74 20 62 4b 65 79 20 3d 20       int bKey = 
ee90: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
eea0: 6e 74 28 70 58 49 6e 66 6f 2c 20 35 29 3b 0a 20  nt(pXInfo, 5);. 
eeb0: 20 20 20 20 20 69 66 28 20 62 4b 65 79 20 29 7b       if( bKey ){
eec0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 69  .        int iCi
eed0: 64 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  d = sqlite3_colu
eee0: 6d 6e 5f 69 6e 74 28 70 58 49 6e 66 6f 2c 20 31  mn_int(pXInfo, 1
eef0: 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 62  );.        int b
ef00: 44 65 73 63 20 3d 20 73 71 6c 69 74 65 33 5f 63  Desc = sqlite3_c
ef10: 6f 6c 75 6d 6e 5f 69 6e 74 28 70 58 49 6e 66 6f  olumn_int(pXInfo
ef20: 2c 20 33 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  , 3);.        co
ef30: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 61  nst char *zColla
ef40: 74 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  te = (const char
ef50: 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
ef60: 5f 74 65 78 74 28 70 58 49 6e 66 6f 2c 20 34 29  _text(pXInfo, 4)
ef70: 3b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 73 20  ;.        zCols 
ef80: 3d 20 72 62 75 4d 50 72 69 6e 74 66 28 70 2c 20  = rbuMPrintf(p, 
ef90: 22 25 7a 25 73 63 25 64 20 25 73 20 43 4f 4c 4c  "%z%sc%d %s COLL
efa0: 41 54 45 20 25 51 22 2c 20 7a 43 6f 6c 73 2c 20  ATE %Q", zCols, 
efb0: 7a 43 6f 6d 6d 61 2c 20 0a 20 20 20 20 20 20 20  zComma, .       
efc0: 20 20 20 20 20 69 43 69 64 2c 20 70 49 74 65 72       iCid, pIter
efd0: 2d 3e 61 7a 54 62 6c 54 79 70 65 5b 69 43 69 64  ->azTblType[iCid
efe0: 5d 2c 20 7a 43 6f 6c 6c 61 74 65 0a 20 20 20 20  ], zCollate.    
eff0: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7a      );.        z
f000: 50 6b 20 3d 20 72 62 75 4d 50 72 69 6e 74 66 28  Pk = rbuMPrintf(
f010: 70 2c 20 22 25 7a 25 73 63 25 64 25 73 22 2c 20  p, "%z%sc%d%s", 
f020: 7a 50 6b 2c 20 7a 43 6f 6d 6d 61 2c 20 69 43 69  zPk, zComma, iCi
f030: 64 2c 20 62 44 65 73 63 3f 22 20 44 45 53 43 22  d, bDesc?" DESC"
f040: 3a 22 22 29 3b 0a 20 20 20 20 20 20 20 20 7a 43  :"");.        zC
f050: 6f 6d 6d 61 20 3d 20 22 2c 20 22 3b 0a 20 20 20  omma = ", ";.   
f060: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a     }.    }.    z
f070: 43 6f 6c 73 20 3d 20 72 62 75 4d 50 72 69 6e 74  Cols = rbuMPrint
f080: 66 28 70 2c 20 22 25 7a 2c 20 69 64 20 49 4e 54  f(p, "%z, id INT
f090: 45 47 45 52 22 2c 20 7a 43 6f 6c 73 29 3b 0a 20  EGER", zCols);. 
f0a0: 20 20 20 72 62 75 46 69 6e 61 6c 69 7a 65 28 70     rbuFinalize(p
f0b0: 2c 20 70 58 49 6e 66 6f 29 3b 0a 0a 20 20 20 20  , pXInfo);..    
f0c0: 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
f0d0: 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
f0e0: 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52 2c 20 70  CTRL_IMPOSTER, p
f0f0: 2d 3e 64 62 4d 61 69 6e 2c 20 22 6d 61 69 6e 22  ->dbMain, "main"
f100: 2c 20 31 2c 20 74 6e 75 6d 29 3b 0a 20 20 20 20  , 1, tnum);.    
f110: 72 62 75 4d 50 72 69 6e 74 66 45 78 65 63 28 70  rbuMPrintfExec(p
f120: 2c 20 70 2d 3e 64 62 4d 61 69 6e 2c 0a 20 20 20  , p->dbMain,.   
f130: 20 20 20 20 20 22 43 52 45 41 54 45 20 54 41 42       "CREATE TAB
f140: 4c 45 20 72 62 75 5f 69 6d 70 6f 73 74 65 72 32  LE rbu_imposter2
f150: 28 25 7a 2c 20 50 52 49 4d 41 52 59 20 4b 45 59  (%z, PRIMARY KEY
f160: 28 25 7a 29 29 20 57 49 54 48 4f 55 54 20 52 4f  (%z)) WITHOUT RO
f170: 57 49 44 22 2c 20 0a 20 20 20 20 20 20 20 20 7a  WID", .        z
f180: 43 6f 6c 73 2c 20 7a 50 6b 0a 20 20 20 20 29 3b  Cols, zPk.    );
f190: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73  .    sqlite3_tes
f1a0: 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
f1b0: 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54  _TESTCTRL_IMPOST
f1c0: 45 52 2c 20 70 2d 3e 64 62 4d 61 69 6e 2c 20 22  ER, p->dbMain, "
f1d0: 6d 61 69 6e 22 2c 20 30 2c 20 30 29 3b 0a 20 20  main", 0, 0);.  
f1e0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 6e  }.}../*.** If an
f1f0: 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61   error has alrea
f200: 64 79 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e  dy occurred when
f210: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
f220: 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 0a 2a 2a  s called, it .**
f230: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 74   immediately ret
f240: 75 72 6e 73 20 7a 65 72 6f 20 28 77 69 74 68 6f  urns zero (witho
f250: 75 74 20 64 6f 69 6e 67 20 61 6e 79 20 77 6f 72  ut doing any wor
f260: 6b 29 2e 20 4f 72 2c 20 69 66 20 61 6e 20 65 72  k). Or, if an er
f270: 72 6f 72 0a 2a 2a 20 6f 63 63 75 72 73 20 64 75  ror.** occurs du
f280: 72 69 6e 67 20 74 68 65 20 65 78 65 63 75 74 69  ring the executi
f290: 6f 6e 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  on of this funct
f2a0: 69 6f 6e 2c 20 69 74 20 73 65 74 73 20 74 68 65  ion, it sets the
f2b0: 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 69   error code.** i
f2c0: 6e 20 74 68 65 20 73 71 6c 69 74 65 33 72 62 75  n the sqlite3rbu
f2d0: 20 6f 62 6a 65 63 74 20 69 6e 64 69 63 61 74 65   object indicate
f2e0: 64 20 62 79 20 74 68 65 20 66 69 72 73 74 20 61  d by the first a
f2f0: 72 67 75 6d 65 6e 74 20 61 6e 64 20 72 65 74 75  rgument and retu
f300: 72 6e 73 0a 2a 2a 20 7a 65 72 6f 2e 0a 2a 2a 0a  rns.** zero..**.
f310: 2a 2a 20 54 68 65 20 69 74 65 72 61 74 6f 72 20  ** The iterator 
f320: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
f330: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
f340: 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 70   guaranteed to p
f350: 6f 69 6e 74 20 74 6f 0a 2a 2a 20 61 20 74 61 62  oint to.** a tab
f360: 6c 65 20 28 6e 6f 74 20 61 6e 20 69 6e 64 65 78  le (not an index
f370: 29 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  ) when this func
f380: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 20  tion is called. 
f390: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  This function.**
f3a0: 20 61 74 74 65 6d 70 74 73 20 74 6f 20 63 72 65   attempts to cre
f3b0: 61 74 65 20 61 6e 79 20 69 6d 70 6f 73 74 65 72  ate any imposter
f3c0: 20 74 61 62 6c 65 20 72 65 71 75 69 72 65 64 20   table required 
f3d0: 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  to write to the 
f3e0: 6d 61 69 6e 0a 2a 2a 20 74 61 62 6c 65 20 62 2d  main.** table b-
f3f0: 74 72 65 65 20 6f 66 20 74 68 65 20 74 61 62 6c  tree of the tabl
f400: 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  e before returni
f410: 6e 67 2e 20 4e 6f 6e 2d 7a 65 72 6f 20 69 73 20  ng. Non-zero is 
f420: 72 65 74 75 72 6e 65 64 20 69 66 0a 2a 2a 20 61  returned if.** a
f430: 6e 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65  n imposter table
f440: 20 61 72 65 20 63 72 65 61 74 65 64 2c 20 6f 72   are created, or
f450: 20 7a 65 72 6f 20 6f 74 68 65 72 77 69 73 65 2e   zero otherwise.
f460: 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6d 70 6f 73 74  .**.** An impost
f470: 65 72 20 74 61 62 6c 65 20 69 73 20 72 65 71 75  er table is requ
f480: 69 72 65 64 20 69 6e 20 61 6c 6c 20 63 61 73 65  ired in all case
f490: 73 20 65 78 63 65 70 74 20 52 42 55 5f 50 4b 5f  s except RBU_PK_
f4a0: 56 54 41 42 2e 20 4f 6e 6c 79 0a 2a 2a 20 76 69  VTAB. Only.** vi
f4b0: 72 74 75 61 6c 20 74 61 62 6c 65 73 20 61 72 65  rtual tables are
f4c0: 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 72 65   written to dire
f4d0: 63 74 6c 79 2e 20 54 68 65 20 69 6d 70 6f 73 74  ctly. The impost
f4e0: 65 72 20 74 61 62 6c 65 20 68 61 73 20 74 68 65  er table has the
f4f0: 20 0a 2a 2a 20 73 61 6d 65 20 73 63 68 65 6d 61   .** same schema
f500: 20 61 73 20 74 68 65 20 61 63 74 75 61 6c 20 74   as the actual t
f510: 61 72 67 65 74 20 74 61 62 6c 65 20 28 6c 65 73  arget table (les
f520: 73 20 61 6e 79 20 55 4e 49 51 55 45 20 63 6f 6e  s any UNIQUE con
f530: 73 74 72 61 69 6e 74 73 29 2e 20 0a 2a 2a 20 4d  straints). .** M
f540: 6f 72 65 20 70 72 65 63 69 73 65 6c 79 2c 20 74  ore precisely, t
f550: 68 65 20 22 73 61 6d 65 20 73 63 68 65 6d 61 22  he "same schema"
f560: 20 6d 65 61 6e 73 20 74 68 65 20 73 61 6d 65 20   means the same 
f570: 63 6f 6c 75 6d 6e 73 2c 20 74 79 70 65 73 2c 20  columns, types, 
f580: 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  .** collation se
f590: 71 75 65 6e 63 65 73 2e 20 46 6f 72 20 74 61 62  quences. For tab
f5a0: 6c 65 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20  les that do not 
f5b0: 68 61 76 65 20 61 6e 20 65 78 74 65 72 6e 61 6c  have an external
f5c0: 20 50 52 49 4d 41 52 59 0a 2a 2a 20 4b 45 59 2c   PRIMARY.** KEY,
f5d0: 20 69 74 20 61 6c 73 6f 20 6d 65 61 6e 73 20 74   it also means t
f5e0: 68 65 20 73 61 6d 65 20 50 52 49 4d 41 52 59 20  he same PRIMARY 
f5f0: 4b 45 59 20 64 65 63 6c 61 72 61 74 69 6f 6e 2e  KEY declaration.
f600: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
f610: 72 62 75 43 72 65 61 74 65 49 6d 70 6f 73 74 65  rbuCreateImposte
f620: 72 54 61 62 6c 65 28 73 71 6c 69 74 65 33 72 62  rTable(sqlite3rb
f630: 75 20 2a 70 2c 20 52 62 75 4f 62 6a 49 74 65 72  u *p, RbuObjIter
f640: 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20   *pIter){.  if( 
f650: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
f660: 20 26 26 20 70 49 74 65 72 2d 3e 65 54 79 70 65   && pIter->eType
f670: 21 3d 52 42 55 5f 50 4b 5f 56 54 41 42 20 29 7b  !=RBU_PK_VTAB ){
f680: 0a 20 20 20 20 69 6e 74 20 74 6e 75 6d 20 3d 20  .    int tnum = 
f690: 70 49 74 65 72 2d 3e 69 54 6e 75 6d 3b 0a 20 20  pIter->iTnum;.  
f6a0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
f6b0: 6f 6d 6d 61 20 3d 20 22 22 3b 0a 20 20 20 20 63  omma = "";.    c
f6c0: 68 61 72 20 2a 7a 53 71 6c 20 3d 20 30 3b 0a 20  har *zSql = 0;. 
f6d0: 20 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20     int iCol;.   
f6e0: 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
f6f0: 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
f700: 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52 2c 20  TCTRL_IMPOSTER, 
f710: 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 6d 61 69 6e  p->dbMain, "main
f720: 22 2c 20 30 2c 20 31 29 3b 0a 0a 20 20 20 20 66  ", 0, 1);..    f
f730: 6f 72 28 69 43 6f 6c 3d 30 3b 20 70 2d 3e 72 63  or(iCol=0; p->rc
f740: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
f750: 43 6f 6c 3c 70 49 74 65 72 2d 3e 6e 54 62 6c 43  Col<pIter->nTblC
f760: 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ol; iCol++){.   
f770: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
f780: 50 6b 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 63  Pk = "";.      c
f790: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 20  onst char *zCol 
f7a0: 3d 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f  = pIter->azTblCo
f7b0: 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 20 20 63  l[iCol];.      c
f7c0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  onst char *zColl
f7d0: 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 70 2d 3e   = 0;..      p->
f7e0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 74 61 62  rc = sqlite3_tab
f7f0: 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61  le_column_metada
f800: 74 61 28 0a 20 20 20 20 20 20 20 20 20 20 70 2d  ta(.          p-
f810: 3e 64 62 4d 61 69 6e 2c 20 22 6d 61 69 6e 22 2c  >dbMain, "main",
f820: 20 70 49 74 65 72 2d 3e 7a 54 62 6c 2c 20 7a 43   pIter->zTbl, zC
f830: 6f 6c 2c 20 30 2c 20 26 7a 43 6f 6c 6c 2c 20 30  ol, 0, &zColl, 0
f840: 2c 20 30 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a  , 0, 0.      );.
f850: 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72  .      if( pIter
f860: 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f  ->eType==RBU_PK_
f870: 49 50 4b 20 26 26 20 70 49 74 65 72 2d 3e 61 62  IPK && pIter->ab
f880: 54 62 6c 50 6b 5b 69 43 6f 6c 5d 20 29 7b 0a 20  TblPk[iCol] ){. 
f890: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
f8a0: 20 74 61 72 67 65 74 20 74 61 62 6c 65 20 63 6f   target table co
f8b0: 6c 75 6d 6e 20 69 73 20 61 6e 20 22 49 4e 54 45  lumn is an "INTE
f8c0: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 22  GER PRIMARY KEY"
f8d0: 2c 20 61 64 64 0a 20 20 20 20 20 20 20 20 2a 2a  , add.        **
f8e0: 20 22 50 52 49 4d 41 52 59 20 4b 45 59 22 20 74   "PRIMARY KEY" t
f8f0: 6f 20 74 68 65 20 69 6d 70 6f 73 74 65 72 20 74  o the imposter t
f900: 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 64 65 63 6c  able column decl
f910: 61 72 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20  aration. */.    
f920: 20 20 20 20 7a 50 6b 20 3d 20 22 50 52 49 4d 41      zPk = "PRIMA
f930: 52 59 20 4b 45 59 20 22 3b 0a 20 20 20 20 20 20  RY KEY ";.      
f940: 7d 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 72  }.      zSql = r
f950: 62 75 4d 50 72 69 6e 74 66 28 70 2c 20 22 25 7a  buMPrintf(p, "%z
f960: 25 73 5c 22 25 77 5c 22 20 25 73 20 25 73 43 4f  %s\"%w\" %s %sCO
f970: 4c 4c 41 54 45 20 25 51 25 73 22 2c 20 0a 20 20  LLATE %Q%s", .  
f980: 20 20 20 20 20 20 20 20 7a 53 71 6c 2c 20 7a 43          zSql, zC
f990: 6f 6d 6d 61 2c 20 7a 43 6f 6c 2c 20 70 49 74 65  omma, zCol, pIte
f9a0: 72 2d 3e 61 7a 54 62 6c 54 79 70 65 5b 69 43 6f  r->azTblType[iCo
f9b0: 6c 5d 2c 20 7a 50 6b 2c 20 7a 43 6f 6c 6c 2c 0a  l], zPk, zColl,.
f9c0: 20 20 20 20 20 20 20 20 20 20 28 70 49 74 65 72            (pIter
f9d0: 2d 3e 61 62 4e 6f 74 4e 75 6c 6c 5b 69 43 6f 6c  ->abNotNull[iCol
f9e0: 5d 20 3f 20 22 20 4e 4f 54 20 4e 55 4c 4c 22 20  ] ? " NOT NULL" 
f9f0: 3a 20 22 22 29 0a 20 20 20 20 20 20 29 3b 0a 20  : "").      );. 
fa00: 20 20 20 20 20 7a 43 6f 6d 6d 61 20 3d 20 22 2c       zComma = ",
fa10: 20 22 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69   ";.    }..    i
fa20: 66 28 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d  f( pIter->eType=
fa30: 3d 52 42 55 5f 50 4b 5f 57 49 54 48 4f 55 54 5f  =RBU_PK_WITHOUT_
fa40: 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 20 20 63  ROWID ){.      c
fa50: 68 61 72 20 2a 7a 50 6b 20 3d 20 72 62 75 57 69  har *zPk = rbuWi
fa60: 74 68 6f 75 74 52 6f 77 69 64 50 4b 28 70 2c 20  thoutRowidPK(p, 
fa70: 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 69 66  pIter);.      if
fa80: 28 20 7a 50 6b 20 29 7b 0a 20 20 20 20 20 20 20  ( zPk ){.       
fa90: 20 7a 53 71 6c 20 3d 20 72 62 75 4d 50 72 69 6e   zSql = rbuMPrin
faa0: 74 66 28 70 2c 20 22 25 7a 2c 20 25 7a 22 2c 20  tf(p, "%z, %z", 
fab0: 7a 53 71 6c 2c 20 7a 50 6b 29 3b 0a 20 20 20 20  zSql, zPk);.    
fac0: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73    }.    }..    s
fad0: 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
fae0: 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
faf0: 54 52 4c 5f 49 4d 50 4f 53 54 45 52 2c 20 70 2d  TRL_IMPOSTER, p-
fb00: 3e 64 62 4d 61 69 6e 2c 20 22 6d 61 69 6e 22 2c  >dbMain, "main",
fb10: 20 31 2c 20 74 6e 75 6d 29 3b 0a 20 20 20 20 72   1, tnum);.    r
fb20: 62 75 4d 50 72 69 6e 74 66 45 78 65 63 28 70 2c  buMPrintfExec(p,
fb30: 20 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 43 52 45   p->dbMain, "CRE
fb40: 41 54 45 20 54 41 42 4c 45 20 5c 22 72 62 75 5f  ATE TABLE \"rbu_
fb50: 69 6d 70 5f 25 77 5c 22 28 25 7a 29 25 73 22 2c  imp_%w\"(%z)%s",
fb60: 20 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d   .        pIter-
fb70: 3e 7a 54 62 6c 2c 20 7a 53 71 6c 2c 20 0a 20 20  >zTbl, zSql, .  
fb80: 20 20 20 20 20 20 28 70 49 74 65 72 2d 3e 65 54        (pIter->eT
fb90: 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 57 49 54 48  ype==RBU_PK_WITH
fba0: 4f 55 54 5f 52 4f 57 49 44 20 3f 20 22 20 57 49  OUT_ROWID ? " WI
fbb0: 54 48 4f 55 54 20 52 4f 57 49 44 22 20 3a 20 22  THOUT ROWID" : "
fbc0: 22 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71  ").    );.    sq
fbd0: 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
fbe0: 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
fbf0: 52 4c 5f 49 4d 50 4f 53 54 45 52 2c 20 70 2d 3e  RL_IMPOSTER, p->
fc00: 64 62 4d 61 69 6e 2c 20 22 6d 61 69 6e 22 2c 20  dbMain, "main", 
fc10: 30 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  0, 0);.  }.}../*
fc20: 0a 2a 2a 20 50 72 65 70 61 72 65 20 61 20 73 74  .** Prepare a st
fc30: 61 74 65 6d 65 6e 74 20 75 73 65 64 20 74 6f 20  atement used to 
fc40: 69 6e 73 65 72 74 20 72 6f 77 73 20 69 6e 74 6f  insert rows into
fc50: 20 74 68 65 20 22 72 62 75 5f 74 6d 70 5f 78 78   the "rbu_tmp_xx
fc60: 78 22 20 74 61 62 6c 65 2e 0a 2a 2a 20 53 70 65  x" table..** Spe
fc70: 63 69 66 69 63 61 6c 6c 79 20 61 20 73 74 61 74  cifically a stat
fc80: 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 66 6f 72  ement of the for
fc90: 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 49 4e 53  m:.**.**     INS
fca0: 45 52 54 20 49 4e 54 4f 20 72 62 75 5f 74 6d 70  ERT INTO rbu_tmp
fcb0: 5f 78 78 78 20 56 41 4c 55 45 53 28 3f 2c 20 3f  _xxx VALUES(?, ?
fcc0: 2c 20 3f 20 2e 2e 2e 29 3b 0a 2a 2a 0a 2a 2a 20  , ? ...);.**.** 
fcd0: 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 6f  The number of bo
fce0: 75 6e 64 20 76 61 72 69 61 62 6c 65 73 20 69 73  und variables is
fcf0: 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6e 75   equal to the nu
fd00: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
fd10: 69 6e 0a 2a 2a 20 74 68 65 20 74 61 72 67 65 74  in.** the target
fd20: 20 74 61 62 6c 65 2c 20 70 6c 75 73 20 6f 6e 65   table, plus one
fd30: 20 28 66 6f 72 20 74 68 65 20 72 62 75 5f 63 6f   (for the rbu_co
fd40: 6e 74 72 6f 6c 20 63 6f 6c 75 6d 6e 29 2c 20 70  ntrol column), p
fd50: 6c 75 73 20 6f 6e 65 20 6d 6f 72 65 20 0a 2a 2a  lus one more .**
fd60: 20 28 66 6f 72 20 74 68 65 20 72 62 75 5f 72 6f   (for the rbu_ro
fd70: 77 69 64 20 63 6f 6c 75 6d 6e 29 20 69 66 20 74  wid column) if t
fd80: 68 65 20 74 61 72 67 65 74 20 74 61 62 6c 65 20  he target table 
fd90: 69 73 20 61 6e 20 69 6d 70 6c 69 63 69 74 20 49  is an implicit I
fda0: 50 4b 20 6f 72 20 0a 2a 2a 20 76 69 72 74 75 61  PK or .** virtua
fdb0: 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  l table..*/.stat
fdc0: 69 63 20 76 6f 69 64 20 72 62 75 4f 62 6a 49 74  ic void rbuObjIt
fdd0: 65 72 50 72 65 70 61 72 65 54 6d 70 49 6e 73 65  erPrepareTmpInse
fde0: 72 74 28 0a 20 20 73 71 6c 69 74 65 33 72 62 75  rt(.  sqlite3rbu
fdf0: 20 2a 70 2c 20 0a 20 20 52 62 75 4f 62 6a 49 74   *p, .  RbuObjIt
fe00: 65 72 20 2a 70 49 74 65 72 2c 0a 20 20 63 6f 6e  er *pIter,.  con
fe10: 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 69 73  st char *zCollis
fe20: 74 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  t,.  const char 
fe30: 2a 7a 52 62 75 52 6f 77 69 64 0a 29 7b 0a 20 20  *zRbuRowid.){.  
fe40: 69 6e 74 20 62 52 62 75 52 6f 77 69 64 20 3d 20  int bRbuRowid = 
fe50: 28 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52  (pIter->eType==R
fe60: 42 55 5f 50 4b 5f 45 58 54 45 52 4e 41 4c 20 7c  BU_PK_EXTERNAL |
fe70: 7c 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d  | pIter->eType==
fe80: 52 42 55 5f 50 4b 5f 4e 4f 4e 45 29 3b 0a 20 20  RBU_PK_NONE);.  
fe90: 63 68 61 72 20 2a 7a 42 69 6e 64 20 3d 20 72 62  char *zBind = rb
fea0: 75 4f 62 6a 49 74 65 72 47 65 74 42 69 6e 64 6c  uObjIterGetBindl
feb0: 69 73 74 28 70 2c 20 70 49 74 65 72 2d 3e 6e 54  ist(p, pIter->nT
fec0: 62 6c 43 6f 6c 20 2b 20 31 20 2b 20 62 52 62 75  blCol + 1 + bRbu
fed0: 52 6f 77 69 64 29 3b 0a 20 20 69 66 28 20 7a 42  Rowid);.  if( zB
fee0: 69 6e 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ind ){.    asser
fef0: 74 28 20 70 49 74 65 72 2d 3e 70 54 6d 70 49 6e  t( pIter->pTmpIn
ff00: 73 65 72 74 3d 3d 30 20 29 3b 0a 20 20 20 20 70  sert==0 );.    p
ff10: 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65 46 72  ->rc = prepareFr
ff20: 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f  eeAndCollectErro
ff30: 72 28 0a 20 20 20 20 20 20 20 20 70 2d 3e 64 62  r(.        p->db
ff40: 52 62 75 2c 20 26 70 49 74 65 72 2d 3e 70 54 6d  Rbu, &pIter->pTm
ff50: 70 49 6e 73 65 72 74 2c 20 26 70 2d 3e 7a 45 72  pInsert, &p->zEr
ff60: 72 6d 73 67 2c 20 73 71 6c 69 74 65 33 5f 6d 70  rmsg, sqlite3_mp
ff70: 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20  rintf(.         
ff80: 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 25 73   "INSERT INTO %s
ff90: 2e 27 72 62 75 5f 74 6d 70 5f 25 71 27 28 72 62  .'rbu_tmp_%q'(rb
ffa0: 75 5f 63 6f 6e 74 72 6f 6c 2c 25 73 25 73 29 20  u_control,%s%s) 
ffb0: 56 41 4c 55 45 53 28 25 7a 29 22 2c 20 0a 20 20  VALUES(%z)", .  
ffc0: 20 20 20 20 20 20 20 20 70 2d 3e 7a 53 74 61 74          p->zStat
ffd0: 65 44 62 2c 20 70 49 74 65 72 2d 3e 7a 44 61 74  eDb, pIter->zDat
ffe0: 61 54 62 6c 2c 20 7a 43 6f 6c 6c 69 73 74 2c 20  aTbl, zCollist, 
fff0: 7a 52 62 75 52 6f 77 69 64 2c 20 7a 42 69 6e 64  zRbuRowid, zBind
10000 0a 20 20 20 20 29 29 3b 0a 20 20 7d 0a 7d 0a 0a  .    ));.  }.}..
10010 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75 54  static void rbuT
10020 6d 70 49 6e 73 65 72 74 46 75 6e 63 28 0a 20 20  mpInsertFunc(.  
10030 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
10040 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 56  *pCtx, .  int nV
10050 61 6c 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  al,.  sqlite3_va
10060 6c 75 65 20 2a 2a 61 70 56 61 6c 0a 29 7b 0a 20  lue **apVal.){. 
10070 20 73 71 6c 69 74 65 33 72 62 75 20 2a 70 20 3d   sqlite3rbu *p =
10080 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61   sqlite3_user_da
10090 74 61 28 70 43 74 78 29 3b 0a 20 20 69 6e 74 20  ta(pCtx);.  int 
100a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
100b0 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61 73 73 65    int i;..  asse
100c0 72 74 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  rt( sqlite3_valu
100d0 65 5f 69 6e 74 28 61 70 56 61 6c 5b 30 5d 29 21  e_int(apVal[0])!
100e0 3d 30 0a 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6f  =0.      || p->o
100f0 62 6a 69 74 65 72 2e 65 54 79 70 65 3d 3d 52 42  bjiter.eType==RB
10100 55 5f 50 4b 5f 45 58 54 45 52 4e 41 4c 20 0a 20  U_PK_EXTERNAL . 
10110 20 20 20 20 20 7c 7c 20 70 2d 3e 6f 62 6a 69 74       || p->objit
10120 65 72 2e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b  er.eType==RBU_PK
10130 5f 4e 4f 4e 45 20 0a 20 20 29 3b 0a 20 20 69 66  _NONE .  );.  if
10140 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ( sqlite3_value_
10150 69 6e 74 28 61 70 56 61 6c 5b 30 5d 29 21 3d 30  int(apVal[0])!=0
10160 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 50 68 61 73   ){.    p->nPhas
10170 65 4f 6e 65 53 74 65 70 20 2b 3d 20 70 2d 3e 6f  eOneStep += p->o
10180 62 6a 69 74 65 72 2e 6e 49 6e 64 65 78 3b 0a 20  bjiter.nIndex;. 
10190 20 7d 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72   }..  for(i=0; r
101a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
101b0 69 3c 6e 56 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nVal; i++){.  
101c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
101d0 69 6e 64 5f 76 61 6c 75 65 28 70 2d 3e 6f 62 6a  ind_value(p->obj
101e0 69 74 65 72 2e 70 54 6d 70 49 6e 73 65 72 74 2c  iter.pTmpInsert,
101f0 20 69 2b 31 2c 20 61 70 56 61 6c 5b 69 5d 29 3b   i+1, apVal[i]);
10200 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
10210 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
10220 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 2d 3e  sqlite3_step(p->
10230 6f 62 6a 69 74 65 72 2e 70 54 6d 70 49 6e 73 65  objiter.pTmpInse
10240 72 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  rt);.    rc = sq
10250 6c 69 74 65 33 5f 72 65 73 65 74 28 70 2d 3e 6f  lite3_reset(p->o
10260 62 6a 69 74 65 72 2e 70 54 6d 70 49 6e 73 65 72  bjiter.pTmpInser
10270 74 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72  t);.  }..  if( r
10280 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
10290 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
102a0 6c 74 5f 65 72 72 6f 72 5f 63 6f 64 65 28 70 43  lt_error_code(pC
102b0 74 78 2c 20 72 63 29 3b 0a 20 20 7d 0a 7d 0a 0a  tx, rc);.  }.}..
102c0 2f 2a 0a 2a 2a 20 45 6e 73 75 72 65 20 74 68 61  /*.** Ensure tha
102d0 74 20 74 68 65 20 53 51 4c 69 74 65 20 73 74 61  t the SQLite sta
102e0 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65 73 20 72  tement handles r
102f0 65 71 75 69 72 65 64 20 74 6f 20 75 70 64 61 74  equired to updat
10300 65 20 74 68 65 20 0a 2a 2a 20 74 61 72 67 65 74  e the .** target
10310 20 64 61 74 61 62 61 73 65 20 6f 62 6a 65 63 74   database object
10320 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 64 69 63   currently indic
10330 61 74 65 64 20 62 79 20 74 68 65 20 69 74 65 72  ated by the iter
10340 61 74 6f 72 20 70 61 73 73 65 64 20 0a 2a 2a 20  ator passed .** 
10350 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
10360 67 75 6d 65 6e 74 20 61 72 65 20 61 76 61 69 6c  gument are avail
10370 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
10380 69 6e 74 20 72 62 75 4f 62 6a 49 74 65 72 50 72  int rbuObjIterPr
10390 65 70 61 72 65 41 6c 6c 28 0a 20 20 73 71 6c 69  epareAll(.  sqli
103a0 74 65 33 72 62 75 20 2a 70 2c 20 0a 20 20 52 62  te3rbu *p, .  Rb
103b0 75 4f 62 6a 49 74 65 72 20 2a 70 49 74 65 72 2c  uObjIter *pIter,
103c0 0a 20 20 69 6e 74 20 6e 4f 66 66 73 65 74 20 20  .  int nOffset  
103d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
103e0 20 20 20 2f 2a 20 41 64 64 20 22 4c 49 4d 49 54     /* Add "LIMIT
103f0 20 2d 31 20 4f 46 46 53 45 54 20 24 6e 4f 66 66   -1 OFFSET $nOff
10400 73 65 74 22 20 74 6f 20 53 45 4c 45 43 54 20 2a  set" to SELECT *
10410 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  /.){.  assert( p
10420 49 74 65 72 2d 3e 62 43 6c 65 61 6e 75 70 3d 3d  Iter->bCleanup==
10430 30 20 29 3b 0a 20 20 69 66 28 20 70 49 74 65 72  0 );.  if( pIter
10440 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 26 26 20  ->pSelect==0 && 
10450 72 62 75 4f 62 6a 49 74 65 72 43 61 63 68 65 54  rbuObjIterCacheT
10460 61 62 6c 65 49 6e 66 6f 28 70 2c 20 70 49 74 65  ableInfo(p, pIte
10470 72 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  r)==SQLITE_OK ){
10480 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 74  .    const int t
10490 6e 75 6d 20 3d 20 70 49 74 65 72 2d 3e 69 54 6e  num = pIter->iTn
104a0 75 6d 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43  um;.    char *zC
104b0 6f 6c 6c 69 73 74 20 3d 20 30 3b 20 20 20 20 20  ollist = 0;     
104c0 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
104d0 20 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 73   indexed columns
104e0 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 2a 70   */.    char **p
104f0 7a 20 3d 20 26 70 2d 3e 7a 45 72 72 6d 73 67 3b  z = &p->zErrmsg;
10500 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
10510 2a 7a 49 64 78 20 3d 20 70 49 74 65 72 2d 3e 7a  *zIdx = pIter->z
10520 49 64 78 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  Idx;.    char *z
10530 4c 69 6d 69 74 20 3d 20 30 3b 0a 0a 20 20 20 20  Limit = 0;..    
10540 69 66 28 20 6e 4f 66 66 73 65 74 20 29 7b 0a 20  if( nOffset ){. 
10550 20 20 20 20 20 7a 4c 69 6d 69 74 20 3d 20 73 71       zLimit = sq
10560 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 20  lite3_mprintf(" 
10570 4c 49 4d 49 54 20 2d 31 20 4f 46 46 53 45 54 20  LIMIT -1 OFFSET 
10580 25 64 22 2c 20 6e 4f 66 66 73 65 74 29 3b 0a 20  %d", nOffset);. 
10590 20 20 20 20 20 69 66 28 20 21 7a 4c 69 6d 69 74       if( !zLimit
105a0 20 29 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54   ) p->rc = SQLIT
105b0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 0a  E_NOMEM;.    }..
105c0 20 20 20 20 69 66 28 20 7a 49 64 78 20 29 7b 0a      if( zIdx ){.
105d0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
105e0 20 2a 7a 54 62 6c 20 3d 20 70 49 74 65 72 2d 3e   *zTbl = pIter->
105f0 7a 54 62 6c 3b 0a 20 20 20 20 20 20 63 68 61 72  zTbl;.      char
10600 20 2a 7a 49 6d 70 6f 73 74 65 72 43 6f 6c 73 20   *zImposterCols 
10610 3d 20 30 3b 20 20 20 20 2f 2a 20 43 6f 6c 75 6d  = 0;    /* Colum
10620 6e 73 20 66 6f 72 20 69 6d 70 6f 73 74 65 72 20  ns for imposter 
10630 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 63  table */.      c
10640 68 61 72 20 2a 7a 49 6d 70 6f 73 74 65 72 50 4b  har *zImposterPK
10650 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 50 72   = 0;      /* Pr
10660 69 6d 61 72 79 20 6b 65 79 20 64 65 63 6c 61 72  imary key declar
10670 61 74 69 6f 6e 20 66 6f 72 20 69 6d 70 6f 73 74  ation for impost
10680 65 72 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72  er */.      char
10690 20 2a 7a 57 68 65 72 65 20 3d 20 30 3b 20 20 20   *zWhere = 0;   
106a0 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45          /* WHERE
106b0 20 63 6c 61 75 73 65 20 6f 6e 20 50 4b 20 63 6f   clause on PK co
106c0 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 20 20 63  lumns */.      c
106d0 68 61 72 20 2a 7a 42 69 6e 64 20 3d 20 30 3b 0a  har *zBind = 0;.
106e0 20 20 20 20 20 20 69 6e 74 20 6e 42 69 6e 64 20        int nBind 
106f0 3d 20 30 3b 0a 0a 20 20 20 20 20 20 61 73 73 65  = 0;..      asse
10700 72 74 28 20 70 49 74 65 72 2d 3e 65 54 79 70 65  rt( pIter->eType
10710 21 3d 52 42 55 5f 50 4b 5f 56 54 41 42 20 29 3b  !=RBU_PK_VTAB );
10720 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 69 73 74 20  .      zCollist 
10730 3d 20 72 62 75 4f 62 6a 49 74 65 72 47 65 74 49  = rbuObjIterGetI
10740 6e 64 65 78 43 6f 6c 73 28 0a 20 20 20 20 20 20  ndexCols(.      
10750 20 20 20 20 70 2c 20 70 49 74 65 72 2c 20 26 7a      p, pIter, &z
10760 49 6d 70 6f 73 74 65 72 43 6f 6c 73 2c 20 26 7a  ImposterCols, &z
10770 49 6d 70 6f 73 74 65 72 50 4b 2c 20 26 7a 57 68  ImposterPK, &zWh
10780 65 72 65 2c 20 26 6e 42 69 6e 64 0a 20 20 20 20  ere, &nBind.    
10790 20 20 29 3b 0a 20 20 20 20 20 20 7a 42 69 6e 64    );.      zBind
107a0 20 3d 20 72 62 75 4f 62 6a 49 74 65 72 47 65 74   = rbuObjIterGet
107b0 42 69 6e 64 6c 69 73 74 28 70 2c 20 6e 42 69 6e  Bindlist(p, nBin
107c0 64 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 72  d);..      /* Cr
107d0 65 61 74 65 20 74 68 65 20 69 6d 70 6f 73 74 65  eate the imposte
107e0 72 20 74 61 62 6c 65 20 75 73 65 64 20 74 6f 20  r table used to 
107f0 77 72 69 74 65 20 74 6f 20 74 68 69 73 20 69 6e  write to this in
10800 64 65 78 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71  dex. */.      sq
10810 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
10820 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
10830 52 4c 5f 49 4d 50 4f 53 54 45 52 2c 20 70 2d 3e  RL_IMPOSTER, p->
10840 64 62 4d 61 69 6e 2c 20 22 6d 61 69 6e 22 2c 20  dbMain, "main", 
10850 30 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 1);.      sql
10860 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
10870 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
10880 4c 5f 49 4d 50 4f 53 54 45 52 2c 20 70 2d 3e 64  L_IMPOSTER, p->d
10890 62 4d 61 69 6e 2c 20 22 6d 61 69 6e 22 2c 20 31  bMain, "main", 1
108a0 2c 74 6e 75 6d 29 3b 0a 20 20 20 20 20 20 72 62  ,tnum);.      rb
108b0 75 4d 50 72 69 6e 74 66 45 78 65 63 28 70 2c 20  uMPrintfExec(p, 
108c0 70 2d 3e 64 62 4d 61 69 6e 2c 0a 20 20 20 20 20  p->dbMain,.     
108d0 20 20 20 20 20 22 43 52 45 41 54 45 20 54 41 42       "CREATE TAB
108e0 4c 45 20 5c 22 72 62 75 5f 69 6d 70 5f 25 77 5c  LE \"rbu_imp_%w\
108f0 22 28 20 25 73 2c 20 50 52 49 4d 41 52 59 20 4b  "( %s, PRIMARY K
10900 45 59 28 20 25 73 20 29 20 29 20 57 49 54 48 4f  EY( %s ) ) WITHO
10910 55 54 20 52 4f 57 49 44 22 2c 0a 20 20 20 20 20  UT ROWID",.     
10920 20 20 20 20 20 7a 54 62 6c 2c 20 7a 49 6d 70 6f       zTbl, zImpo
10930 73 74 65 72 43 6f 6c 73 2c 20 7a 49 6d 70 6f 73  sterCols, zImpos
10940 74 65 72 50 4b 0a 20 20 20 20 20 20 29 3b 0a 20  terPK.      );. 
10950 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73       sqlite3_tes
10960 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
10970 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54  _TESTCTRL_IMPOST
10980 45 52 2c 20 70 2d 3e 64 62 4d 61 69 6e 2c 20 22  ER, p->dbMain, "
10990 6d 61 69 6e 22 2c 20 30 2c 20 30 29 3b 0a 0a 20  main", 0, 0);.. 
109a0 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74       /* Create t
109b0 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20  he statement to 
109c0 69 6e 73 65 72 74 20 69 6e 64 65 78 20 65 6e 74  insert index ent
109d0 72 69 65 73 20 2a 2f 0a 20 20 20 20 20 20 70 49  ries */.      pI
109e0 74 65 72 2d 3e 6e 43 6f 6c 20 3d 20 6e 42 69 6e  ter->nCol = nBin
109f0 64 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  d;.      if( p->
10a00 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
10a10 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  .        p->rc =
10a20 20 70 72 65 70 61 72 65 46 72 65 65 41 6e 64 43   prepareFreeAndC
10a30 6f 6c 6c 65 63 74 45 72 72 6f 72 28 0a 20 20 20  ollectError(.   
10a40 20 20 20 20 20 20 20 20 20 70 2d 3e 64 62 4d 61           p->dbMa
10a50 69 6e 2c 20 26 70 49 74 65 72 2d 3e 70 49 6e 73  in, &pIter->pIns
10a60 65 72 74 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67  ert, &p->zErrmsg
10a70 2c 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ,.          sqli
10a80 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 49 4e 53  te3_mprintf("INS
10a90 45 52 54 20 49 4e 54 4f 20 5c 22 72 62 75 5f 69  ERT INTO \"rbu_i
10aa0 6d 70 5f 25 77 5c 22 20 56 41 4c 55 45 53 28 25  mp_%w\" VALUES(%
10ab0 73 29 22 2c 20 7a 54 62 6c 2c 20 7a 42 69 6e 64  s)", zTbl, zBind
10ac0 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  ).        );.   
10ad0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 41     }..      /* A
10ae0 6e 64 20 74 6f 20 64 65 6c 65 74 65 20 69 6e 64  nd to delete ind
10af0 65 78 20 65 6e 74 72 69 65 73 20 2a 2f 0a 20 20  ex entries */.  
10b00 20 20 20 20 69 66 28 20 72 62 75 49 73 56 61 63      if( rbuIsVac
10b10 75 75 6d 28 70 29 3d 3d 30 20 26 26 20 70 2d 3e  uum(p)==0 && p->
10b20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
10b30 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  .        p->rc =
10b40 20 70 72 65 70 61 72 65 46 72 65 65 41 6e 64 43   prepareFreeAndC
10b50 6f 6c 6c 65 63 74 45 72 72 6f 72 28 0a 20 20 20  ollectError(.   
10b60 20 20 20 20 20 20 20 20 20 70 2d 3e 64 62 4d 61           p->dbMa
10b70 69 6e 2c 20 26 70 49 74 65 72 2d 3e 70 44 65 6c  in, &pIter->pDel
10b80 65 74 65 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67  ete, &p->zErrmsg
10b90 2c 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ,.          sqli
10ba0 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 44 45 4c  te3_mprintf("DEL
10bb0 45 54 45 20 46 52 4f 4d 20 5c 22 72 62 75 5f 69  ETE FROM \"rbu_i
10bc0 6d 70 5f 25 77 5c 22 20 57 48 45 52 45 20 25 73  mp_%w\" WHERE %s
10bd0 22 2c 20 7a 54 62 6c 2c 20 7a 57 68 65 72 65 29  ", zTbl, zWhere)
10be0 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
10bf0 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 72    }..      /* Cr
10c00 65 61 74 65 20 74 68 65 20 53 45 4c 45 43 54 20  eate the SELECT 
10c10 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 72 65 61  statement to rea
10c20 64 20 6b 65 79 73 20 69 6e 20 73 6f 72 74 65 64  d keys in sorted
10c30 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 20 20   order */.      
10c40 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
10c50 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
10c60 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 20 20  char *zSql;.    
10c70 20 20 20 20 69 66 28 20 72 62 75 49 73 56 61 63      if( rbuIsVac
10c80 75 75 6d 28 70 29 20 29 7b 0a 20 20 20 20 20 20  uum(p) ){.      
10c90 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74      zSql = sqlit
10ca0 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20  e3_mprintf(.    
10cb0 20 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43            "SELEC
10cc0 54 20 25 73 2c 20 30 20 41 53 20 72 62 75 5f 63  T %s, 0 AS rbu_c
10cd0 6f 6e 74 72 6f 6c 20 46 52 4f 4d 20 27 25 71 27  ontrol FROM '%q'
10ce0 20 4f 52 44 45 52 20 42 59 20 25 73 25 73 22 2c   ORDER BY %s%s",
10cf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  .              z
10d00 43 6f 6c 6c 69 73 74 2c 20 0a 20 20 20 20 20 20  Collist, .      
10d10 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 7a          pIter->z
10d20 44 61 74 61 54 62 6c 2c 0a 20 20 20 20 20 20 20  DataTbl,.       
10d30 20 20 20 20 20 20 20 7a 43 6f 6c 6c 69 73 74 2c         zCollist,
10d40 20 7a 4c 69 6d 69 74 0a 20 20 20 20 20 20 20 20   zLimit.        
10d50 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c    );.        }el
10d60 73 65 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20  se..        if( 
10d70 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42  pIter->eType==RB
10d80 55 5f 50 4b 5f 45 58 54 45 52 4e 41 4c 20 7c 7c  U_PK_EXTERNAL ||
10d90 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52   pIter->eType==R
10da0 42 55 5f 50 4b 5f 4e 4f 4e 45 20 29 7b 0a 20 20  BU_PK_NONE ){.  
10db0 20 20 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73          zSql = s
10dc0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a  qlite3_mprintf(.
10dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 53                "S
10de0 45 4c 45 43 54 20 25 73 2c 20 72 62 75 5f 63 6f  ELECT %s, rbu_co
10df0 6e 74 72 6f 6c 20 46 52 4f 4d 20 25 73 2e 27 72  ntrol FROM %s.'r
10e00 62 75 5f 74 6d 70 5f 25 71 27 20 4f 52 44 45 52  bu_tmp_%q' ORDER
10e10 20 42 59 20 25 73 25 73 22 2c 0a 20 20 20 20 20   BY %s%s",.     
10e20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 6c 69 73           zCollis
10e30 74 2c 20 70 2d 3e 7a 53 74 61 74 65 44 62 2c 20  t, p->zStateDb, 
10e40 70 49 74 65 72 2d 3e 7a 44 61 74 61 54 62 6c 2c  pIter->zDataTbl,
10e50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  .              z
10e60 43 6f 6c 6c 69 73 74 2c 20 7a 4c 69 6d 69 74 0a  Collist, zLimit.
10e70 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20            );.   
10e80 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
10e90 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c        zSql = sql
10ea0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20  ite3_mprintf(.  
10eb0 20 20 20 20 20 20 20 20 20 20 20 20 22 53 45 4c              "SEL
10ec0 45 43 54 20 25 73 2c 20 72 62 75 5f 63 6f 6e 74  ECT %s, rbu_cont
10ed0 72 6f 6c 20 46 52 4f 4d 20 25 73 2e 27 72 62 75  rol FROM %s.'rbu
10ee0 5f 74 6d 70 5f 25 71 27 20 22 0a 20 20 20 20 20  _tmp_%q' ".     
10ef0 20 20 20 20 20 20 20 20 20 22 55 4e 49 4f 4e 20           "UNION 
10f00 41 4c 4c 20 22 0a 20 20 20 20 20 20 20 20 20 20  ALL ".          
10f10 20 20 20 20 22 53 45 4c 45 43 54 20 25 73 2c 20      "SELECT %s, 
10f20 72 62 75 5f 63 6f 6e 74 72 6f 6c 20 46 52 4f 4d  rbu_control FROM
10f30 20 27 25 71 27 20 22 0a 20 20 20 20 20 20 20 20   '%q' ".        
10f40 20 20 20 20 20 20 22 57 48 45 52 45 20 74 79 70        "WHERE typ
10f50 65 6f 66 28 72 62 75 5f 63 6f 6e 74 72 6f 6c 29  eof(rbu_control)
10f60 3d 27 69 6e 74 65 67 65 72 27 20 41 4e 44 20 72  ='integer' AND r
10f70 62 75 5f 63 6f 6e 74 72 6f 6c 21 3d 31 20 22 0a  bu_control!=1 ".
10f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 4f                "O
10f90 52 44 45 52 20 42 59 20 25 73 25 73 22 2c 0a 20  RDER BY %s%s",. 
10fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f               zCo
10fb0 6c 6c 69 73 74 2c 20 70 2d 3e 7a 53 74 61 74 65  llist, p->zState
10fc0 44 62 2c 20 70 49 74 65 72 2d 3e 7a 44 61 74 61  Db, pIter->zData
10fd0 54 62 6c 2c 20 0a 20 20 20 20 20 20 20 20 20 20  Tbl, .          
10fe0 20 20 20 20 7a 43 6f 6c 6c 69 73 74 2c 20 70 49      zCollist, pI
10ff0 74 65 72 2d 3e 7a 44 61 74 61 54 62 6c 2c 20 0a  ter->zDataTbl, .
11000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 43                zC
11010 6f 6c 6c 69 73 74 2c 20 7a 4c 69 6d 69 74 0a 20  ollist, zLimit. 
11020 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
11030 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 2d      }.        p-
11040 3e 72 63 20 3d 20 70 72 65 70 61 72 65 46 72 65  >rc = prepareFre
11050 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72  eAndCollectError
11060 28 70 2d 3e 64 62 52 62 75 2c 20 26 70 49 74 65  (p->dbRbu, &pIte
11070 72 2d 3e 70 53 65 6c 65 63 74 2c 20 70 7a 2c 20  r->pSelect, pz, 
11080 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  zSql);.      }..
11090 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
110a0 65 65 28 7a 49 6d 70 6f 73 74 65 72 43 6f 6c 73  ee(zImposterCols
110b0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
110c0 5f 66 72 65 65 28 7a 49 6d 70 6f 73 74 65 72 50  _free(zImposterP
110d0 4b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  K);.      sqlite
110e0 33 5f 66 72 65 65 28 7a 57 68 65 72 65 29 3b 0a  3_free(zWhere);.
110f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
11100 65 65 28 7a 42 69 6e 64 29 3b 0a 20 20 20 20 7d  ee(zBind);.    }
11110 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
11120 62 52 62 75 52 6f 77 69 64 20 3d 20 28 70 49 74  bRbuRowid = (pIt
11130 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50  er->eType==RBU_P
11140 4b 5f 56 54 41 42 29 0a 20 20 20 20 20 20 20 20  K_VTAB).        
11150 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 28 70              ||(p
11160 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55  Iter->eType==RBU
11170 5f 50 4b 5f 4e 4f 4e 45 29 0a 20 20 20 20 20 20  _PK_NONE).      
11180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
11190 28 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52  (pIter->eType==R
111a0 42 55 5f 50 4b 5f 45 58 54 45 52 4e 41 4c 20 26  BU_PK_EXTERNAL &
111b0 26 20 72 62 75 49 73 56 61 63 75 75 6d 28 70 29  & rbuIsVacuum(p)
111c0 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  );.      const c
111d0 68 61 72 20 2a 7a 54 62 6c 20 3d 20 70 49 74 65  har *zTbl = pIte
111e0 72 2d 3e 7a 54 62 6c 3b 20 20 20 20 20 20 20 2f  r->zTbl;       /
111f0 2a 20 54 61 62 6c 65 20 74 68 69 73 20 73 74 65  * Table this ste
11200 70 20 61 70 70 6c 69 65 73 20 74 6f 20 2a 2f 0a  p applies to */.
11210 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
11220 20 2a 7a 57 72 69 74 65 3b 20 20 20 20 20 20 20   *zWrite;       
11230 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
11240 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 20 6e 61  mposter table na
11250 6d 65 20 2a 2f 0a 0a 20 20 20 20 20 20 63 68 61  me */..      cha
11260 72 20 2a 7a 42 69 6e 64 69 6e 67 73 20 3d 20 72  r *zBindings = r
11270 62 75 4f 62 6a 49 74 65 72 47 65 74 42 69 6e 64  buObjIterGetBind
11280 6c 69 73 74 28 70 2c 20 70 49 74 65 72 2d 3e 6e  list(p, pIter->n
11290 54 62 6c 43 6f 6c 20 2b 20 62 52 62 75 52 6f 77  TblCol + bRbuRow
112a0 69 64 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20  id);.      char 
112b0 2a 7a 57 68 65 72 65 20 3d 20 72 62 75 4f 62 6a  *zWhere = rbuObj
112c0 49 74 65 72 47 65 74 57 68 65 72 65 28 70 2c 20  IterGetWhere(p, 
112d0 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 63 68  pIter);.      ch
112e0 61 72 20 2a 7a 4f 6c 64 6c 69 73 74 20 3d 20 72  ar *zOldlist = r
112f0 62 75 4f 62 6a 49 74 65 72 47 65 74 4f 6c 64 6c  buObjIterGetOldl
11300 69 73 74 28 70 2c 20 70 49 74 65 72 2c 20 22 6f  ist(p, pIter, "o
11310 6c 64 22 29 3b 0a 20 20 20 20 20 20 63 68 61 72  ld");.      char
11320 20 2a 7a 4e 65 77 6c 69 73 74 20 3d 20 72 62 75   *zNewlist = rbu
11330 4f 62 6a 49 74 65 72 47 65 74 4f 6c 64 6c 69 73  ObjIterGetOldlis
11340 74 28 70 2c 20 70 49 74 65 72 2c 20 22 6e 65 77  t(p, pIter, "new
11350 22 29 3b 0a 0a 20 20 20 20 20 20 7a 43 6f 6c 6c  ");..      zColl
11360 69 73 74 20 3d 20 72 62 75 4f 62 6a 49 74 65 72  ist = rbuObjIter
11370 47 65 74 43 6f 6c 6c 69 73 74 28 70 2c 20 70 49  GetCollist(p, pI
11380 74 65 72 29 3b 0a 20 20 20 20 20 20 70 49 74 65  ter);.      pIte
11390 72 2d 3e 6e 43 6f 6c 20 3d 20 70 49 74 65 72 2d  r->nCol = pIter-
113a0 3e 6e 54 62 6c 43 6f 6c 3b 0a 0a 20 20 20 20 20  >nTblCol;..     
113b0 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 69   /* Create the i
113c0 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 20 6f 72  mposter table or
113d0 20 74 61 62 6c 65 73 20 28 69 66 20 72 65 71 75   tables (if requ
113e0 69 72 65 64 29 2e 20 2a 2f 0a 20 20 20 20 20 20  ired). */.      
113f0 72 62 75 43 72 65 61 74 65 49 6d 70 6f 73 74 65  rbuCreateImposte
11400 72 54 61 62 6c 65 28 70 2c 20 70 49 74 65 72 29  rTable(p, pIter)
11410 3b 0a 20 20 20 20 20 20 72 62 75 43 72 65 61 74  ;.      rbuCreat
11420 65 49 6d 70 6f 73 74 65 72 54 61 62 6c 65 32 28  eImposterTable2(
11430 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20  p, pIter);.     
11440 20 7a 57 72 69 74 65 20 3d 20 28 70 49 74 65 72   zWrite = (pIter
11450 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f  ->eType==RBU_PK_
11460 56 54 41 42 20 3f 20 22 22 20 3a 20 22 72 62 75  VTAB ? "" : "rbu
11470 5f 69 6d 70 5f 22 29 3b 0a 0a 20 20 20 20 20 20  _imp_");..      
11480 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 49 4e  /* Create the IN
11490 53 45 52 54 20 73 74 61 74 65 6d 65 6e 74 20 74  SERT statement t
114a0 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 74  o write to the t
114b0 61 72 67 65 74 20 50 4b 20 62 2d 74 72 65 65 20  arget PK b-tree 
114c0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  */.      if( p->
114d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
114e0 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  .        p->rc =
114f0 20 70 72 65 70 61 72 65 46 72 65 65 41 6e 64 43   prepareFreeAndC
11500 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64  ollectError(p->d
11510 62 4d 61 69 6e 2c 20 26 70 49 74 65 72 2d 3e 70  bMain, &pIter->p
11520 49 6e 73 65 72 74 2c 20 70 7a 2c 0a 20 20 20 20  Insert, pz,.    
11530 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
11540 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20  mprintf(.       
11550 20 20 20 20 20 20 20 22 49 4e 53 45 52 54 20 49         "INSERT I
11560 4e 54 4f 20 5c 22 25 73 25 77 5c 22 28 25 73 25  NTO \"%s%w\"(%s%
11570 73 29 20 56 41 4c 55 45 53 28 25 73 29 22 2c 20  s) VALUES(%s)", 
11580 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  .              z
11590 57 72 69 74 65 2c 20 7a 54 62 6c 2c 20 7a 43 6f  Write, zTbl, zCo
115a0 6c 6c 69 73 74 2c 20 28 62 52 62 75 52 6f 77 69  llist, (bRbuRowi
115b0 64 20 3f 20 22 2c 20 5f 72 6f 77 69 64 5f 22 20  d ? ", _rowid_" 
115c0 3a 20 22 22 29 2c 20 7a 42 69 6e 64 69 6e 67 73  : ""), zBindings
115d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 0a 20  .            ). 
115e0 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
115f0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 72 65 61  }..      /* Crea
11600 74 65 20 74 68 65 20 44 45 4c 45 54 45 20 73 74  te the DELETE st
11610 61 74 65 6d 65 6e 74 20 74 6f 20 77 72 69 74 65  atement to write
11620 20 74 6f 20 74 68 65 20 74 61 72 67 65 74 20 50   to the target P
11630 4b 20 62 2d 74 72 65 65 2e 0a 20 20 20 20 20 20  K b-tree..      
11640 2a 2a 20 42 65 63 61 75 73 65 20 69 74 20 6f 6e  ** Because it on
11650 6c 79 20 70 65 72 66 6f 72 6d 73 20 49 4e 53 45  ly performs INSE
11660 52 54 20 6f 70 65 72 61 74 69 6f 6e 73 2c 20 74  RT operations, t
11670 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69  his is not requi
11680 72 65 64 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a  red for.      **
11690 20 61 6e 20 72 62 75 20 76 61 63 75 75 6d 20 68   an rbu vacuum h
116a0 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 20  andle.  */.     
116b0 20 69 66 28 20 72 62 75 49 73 56 61 63 75 75 6d   if( rbuIsVacuum
116c0 28 70 29 3d 3d 30 20 26 26 20 70 2d 3e 72 63 3d  (p)==0 && p->rc=
116d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
116e0 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 72        p->rc = pr
116f0 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c  epareFreeAndColl
11700 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 4d 61  ectError(p->dbMa
11710 69 6e 2c 20 26 70 49 74 65 72 2d 3e 70 44 65 6c  in, &pIter->pDel
11720 65 74 65 2c 20 70 7a 2c 0a 20 20 20 20 20 20 20  ete, pz,.       
11730 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72       sqlite3_mpr
11740 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20  intf(.          
11750 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d      "DELETE FROM
11760 20 5c 22 25 73 25 77 5c 22 20 57 48 45 52 45 20   \"%s%w\" WHERE 
11770 25 73 22 2c 20 7a 57 72 69 74 65 2c 20 7a 54 62  %s", zWrite, zTb
11780 6c 2c 20 7a 57 68 65 72 65 0a 20 20 20 20 20 20  l, zWhere.      
11790 20 20 20 20 20 20 29 0a 20 20 20 20 20 20 20 20        ).        
117a0 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
117b0 20 20 69 66 28 20 72 62 75 49 73 56 61 63 75 75    if( rbuIsVacuu
117c0 6d 28 70 29 3d 3d 30 20 26 26 20 70 49 74 65 72  m(p)==0 && pIter
117d0 2d 3e 61 62 49 6e 64 65 78 65 64 20 29 7b 0a 20  ->abIndexed ){. 
117e0 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
117f0 72 20 2a 7a 52 62 75 52 6f 77 69 64 20 3d 20 22  r *zRbuRowid = "
11800 22 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ";.        if( p
11810 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55  Iter->eType==RBU
11820 5f 50 4b 5f 45 58 54 45 52 4e 41 4c 20 7c 7c 20  _PK_EXTERNAL || 
11830 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42  pIter->eType==RB
11840 55 5f 50 4b 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  U_PK_NONE ){.   
11850 20 20 20 20 20 20 20 7a 52 62 75 52 6f 77 69 64         zRbuRowid
11860 20 3d 20 22 2c 20 72 62 75 5f 72 6f 77 69 64 22   = ", rbu_rowid"
11870 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
11880 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74       /* Create t
11890 68 65 20 72 62 75 5f 74 6d 70 5f 78 78 78 20 74  he rbu_tmp_xxx t
118a0 61 62 6c 65 20 61 6e 64 20 74 68 65 20 74 72 69  able and the tri
118b0 67 67 65 72 73 20 74 6f 20 70 6f 70 75 6c 61 74  ggers to populat
118c0 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20  e it. */.       
118d0 20 72 62 75 4d 50 72 69 6e 74 66 45 78 65 63 28   rbuMPrintfExec(
118e0 70 2c 20 70 2d 3e 64 62 52 62 75 2c 0a 20 20 20  p, p->dbRbu,.   
118f0 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45           "CREATE
11900 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58   TABLE IF NOT EX
11910 49 53 54 53 20 25 73 2e 27 72 62 75 5f 74 6d 70  ISTS %s.'rbu_tmp
11920 5f 25 71 27 20 41 53 20 22 0a 20 20 20 20 20 20  _%q' AS ".      
11930 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 2a 25        "SELECT *%
11940 73 20 46 52 4f 4d 20 27 25 71 27 20 57 48 45 52  s FROM '%q' WHER
11950 45 20 30 3b 22 0a 20 20 20 20 20 20 20 20 20 20  E 0;".          
11960 20 20 2c 20 70 2d 3e 7a 53 74 61 74 65 44 62 2c    , p->zStateDb,
11970 20 70 49 74 65 72 2d 3e 7a 44 61 74 61 54 62 6c   pIter->zDataTbl
11980 0a 20 20 20 20 20 20 20 20 20 20 20 20 2c 20 28  .            , (
11990 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42  pIter->eType==RB
119a0 55 5f 50 4b 5f 45 58 54 45 52 4e 41 4c 20 3f 20  U_PK_EXTERNAL ? 
119b0 22 2c 20 30 20 41 53 20 72 62 75 5f 72 6f 77 69  ", 0 AS rbu_rowi
119c0 64 22 20 3a 20 22 22 29 0a 20 20 20 20 20 20 20  d" : "").       
119d0 20 20 20 20 20 2c 20 70 49 74 65 72 2d 3e 7a 44       , pIter->zD
119e0 61 74 61 54 62 6c 0a 20 20 20 20 20 20 20 20 29  ataTbl.        )
119f0 3b 0a 0a 20 20 20 20 20 20 20 20 72 62 75 4d 50  ;..        rbuMP
11a00 72 69 6e 74 66 45 78 65 63 28 70 2c 20 70 2d 3e  rintfExec(p, p->
11a10 64 62 4d 61 69 6e 2c 0a 20 20 20 20 20 20 20 20  dbMain,.        
11a20 20 20 20 20 22 43 52 45 41 54 45 20 54 45 4d 50      "CREATE TEMP
11a30 20 54 52 49 47 47 45 52 20 72 62 75 5f 64 65 6c   TRIGGER rbu_del
11a40 65 74 65 5f 74 72 20 42 45 46 4f 52 45 20 44 45  ete_tr BEFORE DE
11a50 4c 45 54 45 20 4f 4e 20 5c 22 25 73 25 77 5c 22  LETE ON \"%s%w\"
11a60 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22   ".            "
11a70 42 45 47 49 4e 20 22 0a 20 20 20 20 20 20 20 20  BEGIN ".        
11a80 20 20 20 20 22 20 20 53 45 4c 45 43 54 20 72 62      "  SELECT rb
11a90 75 5f 74 6d 70 5f 69 6e 73 65 72 74 28 33 2c 20  u_tmp_insert(3, 
11aa0 25 73 29 3b 22 0a 20 20 20 20 20 20 20 20 20 20  %s);".          
11ab0 20 20 22 45 4e 44 3b 22 0a 0a 20 20 20 20 20 20    "END;"..      
11ac0 20 20 20 20 20 20 22 43 52 45 41 54 45 20 54 45        "CREATE TE
11ad0 4d 50 20 54 52 49 47 47 45 52 20 72 62 75 5f 75  MP TRIGGER rbu_u
11ae0 70 64 61 74 65 31 5f 74 72 20 42 45 46 4f 52 45  pdate1_tr BEFORE
11af0 20 55 50 44 41 54 45 20 4f 4e 20 5c 22 25 73 25   UPDATE ON \"%s%
11b00 77 5c 22 20 22 0a 20 20 20 20 20 20 20 20 20 20  w\" ".          
11b10 20 20 22 42 45 47 49 4e 20 22 0a 20 20 20 20 20    "BEGIN ".     
11b20 20 20 20 20 20 20 20 22 20 20 53 45 4c 45 43 54         "  SELECT
11b30 20 72 62 75 5f 74 6d 70 5f 69 6e 73 65 72 74 28   rbu_tmp_insert(
11b40 33 2c 20 25 73 29 3b 22 0a 20 20 20 20 20 20 20  3, %s);".       
11b50 20 20 20 20 20 22 45 4e 44 3b 22 0a 0a 20 20 20       "END;"..   
11b60 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45           "CREATE
11b70 20 54 45 4d 50 20 54 52 49 47 47 45 52 20 72 62   TEMP TRIGGER rb
11b80 75 5f 75 70 64 61 74 65 32 5f 74 72 20 41 46 54  u_update2_tr AFT
11b90 45 52 20 55 50 44 41 54 45 20 4f 4e 20 5c 22 25  ER UPDATE ON \"%
11ba0 73 25 77 5c 22 20 22 0a 20 20 20 20 20 20 20 20  s%w\" ".        
11bb0 20 20 20 20 22 42 45 47 49 4e 20 22 0a 20 20 20      "BEGIN ".   
11bc0 20 20 20 20 20 20 20 20 20 22 20 20 53 45 4c 45           "  SELE
11bd0 43 54 20 72 62 75 5f 74 6d 70 5f 69 6e 73 65 72  CT rbu_tmp_inser
11be0 74 28 34 2c 20 25 73 29 3b 22 0a 20 20 20 20 20  t(4, %s);".     
11bf0 20 20 20 20 20 20 20 22 45 4e 44 3b 22 2c 0a 20         "END;",. 
11c00 20 20 20 20 20 20 20 20 20 20 20 7a 57 72 69 74             zWrit
11c10 65 2c 20 7a 54 62 6c 2c 20 7a 4f 6c 64 6c 69 73  e, zTbl, zOldlis
11c20 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  t,.            z
11c30 57 72 69 74 65 2c 20 7a 54 62 6c 2c 20 7a 4f 6c  Write, zTbl, zOl
11c40 64 6c 69 73 74 2c 0a 20 20 20 20 20 20 20 20 20  dlist,.         
11c50 20 20 20 7a 57 72 69 74 65 2c 20 7a 54 62 6c 2c     zWrite, zTbl,
11c60 20 7a 4e 65 77 6c 69 73 74 0a 20 20 20 20 20 20   zNewlist.      
11c70 20 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 66    );..        if
11c80 28 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d  ( pIter->eType==
11c90 52 42 55 5f 50 4b 5f 45 58 54 45 52 4e 41 4c 20  RBU_PK_EXTERNAL 
11ca0 7c 7c 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d  || pIter->eType=
11cb0 3d 52 42 55 5f 50 4b 5f 4e 4f 4e 45 20 29 7b 0a  =RBU_PK_NONE ){.
11cc0 20 20 20 20 20 20 20 20 20 20 72 62 75 4d 50 72            rbuMPr
11cd0 69 6e 74 66 45 78 65 63 28 70 2c 20 70 2d 3e 64  intfExec(p, p->d
11ce0 62 4d 61 69 6e 2c 0a 20 20 20 20 20 20 20 20 20  bMain,.         
11cf0 20 20 20 20 20 22 43 52 45 41 54 45 20 54 45 4d       "CREATE TEM
11d00 50 20 54 52 49 47 47 45 52 20 72 62 75 5f 69 6e  P TRIGGER rbu_in
11d10 73 65 72 74 5f 74 72 20 41 46 54 45 52 20 49 4e  sert_tr AFTER IN
11d20 53 45 52 54 20 4f 4e 20 5c 22 25 73 25 77 5c 22  SERT ON \"%s%w\"
11d30 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ".             
11d40 20 22 42 45 47 49 4e 20 22 0a 20 20 20 20 20 20   "BEGIN ".      
11d50 20 20 20 20 20 20 20 20 22 20 20 53 45 4c 45 43          "  SELEC
11d60 54 20 72 62 75 5f 74 6d 70 5f 69 6e 73 65 72 74  T rbu_tmp_insert
11d70 28 30 2c 20 25 73 29 3b 22 0a 20 20 20 20 20 20  (0, %s);".      
11d80 20 20 20 20 20 20 20 20 22 45 4e 44 3b 22 2c 0a          "END;",.
11d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 57                zW
11da0 72 69 74 65 2c 20 7a 54 62 6c 2c 20 7a 4e 65 77  rite, zTbl, zNew
11db0 6c 69 73 74 0a 20 20 20 20 20 20 20 20 20 20 29  list.          )
11dc0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
11dd0 20 20 20 20 20 72 62 75 4f 62 6a 49 74 65 72 50       rbuObjIterP
11de0 72 65 70 61 72 65 54 6d 70 49 6e 73 65 72 74 28  repareTmpInsert(
11df0 70 2c 20 70 49 74 65 72 2c 20 7a 43 6f 6c 6c 69  p, pIter, zColli
11e00 73 74 2c 20 7a 52 62 75 52 6f 77 69 64 29 3b 0a  st, zRbuRowid);.
11e10 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
11e20 2a 20 43 72 65 61 74 65 20 74 68 65 20 53 45 4c  * Create the SEL
11e30 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 6f  ECT statement to
11e40 20 72 65 61 64 20 6b 65 79 73 20 66 72 6f 6d 20   read keys from 
11e50 64 61 74 61 5f 78 78 78 20 2a 2f 0a 20 20 20 20  data_xxx */.    
11e60 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
11e70 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
11e80 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52    const char *zR
11e90 62 75 52 6f 77 69 64 20 3d 20 22 22 3b 0a 20 20  buRowid = "";.  
11ea0 20 20 20 20 20 20 69 66 28 20 62 52 62 75 52 6f        if( bRbuRo
11eb0 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  wid ){.         
11ec0 20 7a 52 62 75 52 6f 77 69 64 20 3d 20 72 62 75   zRbuRowid = rbu
11ed0 49 73 56 61 63 75 75 6d 28 70 29 20 3f 20 22 2c  IsVacuum(p) ? ",
11ee0 5f 72 6f 77 69 64 5f 20 22 20 3a 20 22 2c 72 62  _rowid_ " : ",rb
11ef0 75 5f 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20  u_rowid";.      
11f00 20 20 7d 0a 20 20 20 20 20 20 20 20 70 2d 3e 72    }.        p->r
11f10 63 20 3d 20 70 72 65 70 61 72 65 46 72 65 65 41  c = prepareFreeA
11f20 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70  ndCollectError(p
11f30 2d 3e 64 62 52 62 75 2c 20 26 70 49 74 65 72 2d  ->dbRbu, &pIter-
11f40 3e 70 53 65 6c 65 63 74 2c 20 70 7a 2c 0a 20 20  >pSelect, pz,.  
11f50 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
11f60 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20  3_mprintf(.     
11f70 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54           "SELECT
11f80 20 25 73 2c 25 73 20 72 62 75 5f 63 6f 6e 74 72   %s,%s rbu_contr
11f90 6f 6c 25 73 20 46 52 4f 4d 20 27 25 71 27 25 73  ol%s FROM '%q'%s
11fa0 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ", .            
11fb0 20 20 7a 43 6f 6c 6c 69 73 74 2c 20 0a 20 20 20    zCollist, .   
11fc0 20 20 20 20 20 20 20 20 20 20 20 28 72 62 75 49             (rbuI
11fd0 73 56 61 63 75 75 6d 28 70 29 20 3f 20 22 30 20  sVacuum(p) ? "0 
11fe0 41 53 20 22 20 3a 20 22 22 29 2c 0a 20 20 20 20  AS " : ""),.    
11ff0 20 20 20 20 20 20 20 20 20 20 7a 52 62 75 52 6f            zRbuRo
12000 77 69 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  wid,.           
12010 20 20 20 70 49 74 65 72 2d 3e 7a 44 61 74 61 54     pIter->zDataT
12020 62 6c 2c 20 7a 4c 69 6d 69 74 0a 20 20 20 20 20  bl, zLimit.     
12030 20 20 20 20 20 20 20 29 0a 20 20 20 20 20 20 20         ).       
12040 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20   );.      }..   
12050 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
12060 7a 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20 73  zWhere);.      s
12070 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 6c 64  qlite3_free(zOld
12080 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  list);.      sql
12090 69 74 65 33 5f 66 72 65 65 28 7a 4e 65 77 6c 69  ite3_free(zNewli
120a0 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  st);.      sqlit
120b0 65 33 5f 66 72 65 65 28 7a 42 69 6e 64 69 6e 67  e3_free(zBinding
120c0 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  s);.    }.    sq
120d0 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6c 6c  lite3_free(zColl
120e0 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ist);.    sqlite
120f0 33 5f 66 72 65 65 28 7a 4c 69 6d 69 74 29 3b 0a  3_free(zLimit);.
12100 20 20 7d 0a 20 20 0a 20 20 72 65 74 75 72 6e 20    }.  .  return 
12110 70 2d 3e 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  p->rc;.}../*.** 
12120 53 65 74 20 6f 75 74 70 75 74 20 76 61 72 69 61  Set output varia
12130 62 6c 65 20 2a 70 70 53 74 6d 74 20 74 6f 20 70  ble *ppStmt to p
12140 6f 69 6e 74 20 74 6f 20 61 6e 20 55 50 44 41 54  oint to an UPDAT
12150 45 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  E statement that
12160 20 6d 61 79 0a 2a 2a 20 62 65 20 75 73 65 64 20   may.** be used 
12170 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 69 6d  to update the im
12180 70 6f 73 74 65 72 20 74 61 62 6c 65 20 66 6f 72  poster table for
12190 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 20   the main table 
121a0 62 2d 74 72 65 65 20 6f 66 20 74 68 65 0a 2a 2a  b-tree of the.**
121b0 20 74 61 62 6c 65 20 6f 62 6a 65 63 74 20 74 68   table object th
121c0 61 74 20 70 49 74 65 72 20 63 75 72 72 65 6e 74  at pIter current
121d0 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2c 20 61 73  ly points to, as
121e0 73 75 6d 69 6e 67 20 74 68 61 74 20 74 68 65 20  suming that the 
121f0 0a 2a 2a 20 72 62 75 5f 63 6f 6e 74 72 6f 6c 20  .** rbu_control 
12200 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 64 61  column of the da
12210 74 61 5f 78 79 7a 20 74 61 62 6c 65 20 63 6f 6e  ta_xyz table con
12220 74 61 69 6e 73 20 7a 4d 61 73 6b 2e 0a 2a 2a 20  tains zMask..** 
12230 0a 2a 2a 20 49 66 20 74 68 65 20 7a 4d 61 73 6b  .** If the zMask
12240 20 73 74 72 69 6e 67 20 64 6f 65 73 20 6e 6f 74   string does not
12250 20 73 70 65 63 69 66 79 20 61 6e 79 20 63 6f 6c   specify any col
12260 75 6d 6e 73 20 74 6f 20 75 70 64 61 74 65 2c 20  umns to update, 
12270 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20 69 73 20  then this.** is 
12280 6e 6f 74 20 61 6e 20 65 72 72 6f 72 2e 20 4f 75  not an error. Ou
12290 74 70 75 74 20 76 61 72 69 61 62 6c 65 20 2a 70  tput variable *p
122a0 70 53 74 6d 74 20 69 73 20 73 65 74 20 74 6f 20  pStmt is set to 
122b0 4e 55 4c 4c 20 69 6e 20 74 68 69 73 20 63 61 73  NULL in this cas
122c0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
122d0 20 72 62 75 47 65 74 55 70 64 61 74 65 53 74 6d   rbuGetUpdateStm
122e0 74 28 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20  t(.  sqlite3rbu 
122f0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
12300 20 20 20 20 20 2f 2a 20 52 42 55 20 68 61 6e 64       /* RBU hand
12310 6c 65 20 2a 2f 0a 20 20 52 62 75 4f 62 6a 49 74  le */.  RbuObjIt
12320 65 72 20 2a 70 49 74 65 72 2c 20 20 20 20 20 20  er *pIter,      
12330 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63          /* Objec
12340 74 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20  t iterator */.  
12350 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73  const char *zMas
12360 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
12370 2f 2a 20 72 62 75 5f 63 6f 6e 74 72 6f 6c 20 76  /* rbu_control v
12380 61 6c 75 65 20 28 27 78 2e 78 2e 27 29 20 2a 2f  alue ('x.x.') */
12390 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
123a0 2a 2a 70 70 53 74 6d 74 20 20 20 20 20 20 20 20  **ppStmt        
123b0 20 20 20 2f 2a 20 4f 55 54 3a 20 55 50 44 41 54     /* OUT: UPDAT
123c0 45 20 73 74 61 74 65 6d 65 6e 74 20 68 61 6e 64  E statement hand
123d0 6c 65 20 2a 2f 0a 29 7b 0a 20 20 52 62 75 55 70  le */.){.  RbuUp
123e0 64 61 74 65 53 74 6d 74 20 2a 2a 70 70 3b 0a 20  dateStmt **pp;. 
123f0 20 52 62 75 55 70 64 61 74 65 53 74 6d 74 20 2a   RbuUpdateStmt *
12400 70 55 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  pUp = 0;.  int n
12410 55 70 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 6e  Up = 0;..  /* In
12420 20 63 61 73 65 20 61 6e 20 65 72 72 6f 72 20 6f   case an error o
12430 63 63 75 72 73 20 2a 2f 0a 20 20 2a 70 70 53 74  ccurs */.  *ppSt
12440 6d 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 53 65  mt = 0;..  /* Se
12450 61 72 63 68 20 66 6f 72 20 61 6e 20 65 78 69 73  arch for an exis
12460 74 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 2e 20  ting statement. 
12470 49 66 20 6f 6e 65 20 69 73 20 66 6f 75 6e 64 2c  If one is found,
12480 20 73 68 69 66 74 20 69 74 20 74 6f 20 74 68 65   shift it to the
12490 20 66 72 6f 6e 74 0a 20 20 2a 2a 20 6f 66 20 74   front.  ** of t
124a0 68 65 20 4c 52 55 20 71 75 65 75 65 20 61 6e 64  he LRU queue and
124b0 20 72 65 74 75 72 6e 20 69 6d 6d 65 64 69 61 74   return immediat
124c0 65 6c 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ely. Otherwise, 
124d0 6c 65 61 76 65 20 6e 55 70 20 70 6f 69 6e 74 69  leave nUp pointi
124e0 6e 67 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 6e  ng.  ** to the n
124f0 75 6d 62 65 72 20 6f 66 20 73 74 61 74 65 6d 65  umber of stateme
12500 6e 74 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  nts currently in
12510 20 74 68 65 20 63 61 63 68 65 20 61 6e 64 20 70   the cache and p
12520 55 70 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6c  Up to the.  ** l
12530 61 73 74 20 6f 62 6a 65 63 74 20 69 6e 20 74 68  ast object in th
12540 65 20 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 66 6f  e list.  */.  fo
12550 72 28 70 70 3d 26 70 49 74 65 72 2d 3e 70 52 62  r(pp=&pIter->pRb
12560 75 55 70 64 61 74 65 3b 20 2a 70 70 3b 20 70 70  uUpdate; *pp; pp
12570 3d 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29  =&((*pp)->pNext)
12580 29 7b 0a 20 20 20 20 70 55 70 20 3d 20 2a 70 70  ){.    pUp = *pp
12590 3b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  ;.    if( strcmp
125a0 28 70 55 70 2d 3e 7a 4d 61 73 6b 2c 20 7a 4d 61  (pUp->zMask, zMa
125b0 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)==0 ){.      
125c0 2a 70 70 20 3d 20 70 55 70 2d 3e 70 4e 65 78 74  *pp = pUp->pNext
125d0 3b 0a 20 20 20 20 20 20 70 55 70 2d 3e 70 4e 65  ;.      pUp->pNe
125e0 78 74 20 3d 20 70 49 74 65 72 2d 3e 70 52 62 75  xt = pIter->pRbu
125f0 55 70 64 61 74 65 3b 0a 20 20 20 20 20 20 70 49  Update;.      pI
12600 74 65 72 2d 3e 70 52 62 75 55 70 64 61 74 65 20  ter->pRbuUpdate 
12610 3d 20 70 55 70 3b 0a 20 20 20 20 20 20 2a 70 70  = pUp;.      *pp
12620 53 74 6d 74 20 3d 20 70 55 70 2d 3e 70 55 70 64  Stmt = pUp->pUpd
12630 61 74 65 3b 20 0a 20 20 20 20 20 20 72 65 74 75  ate; .      retu
12640 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
12650 20 20 7d 0a 20 20 20 20 6e 55 70 2b 2b 3b 0a 20    }.    nUp++;. 
12660 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 55 70   }.  assert( pUp
12670 3d 3d 30 20 7c 7c 20 70 55 70 2d 3e 70 4e 65 78  ==0 || pUp->pNex
12680 74 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 6e  t==0 );..  if( n
12690 55 70 3e 3d 53 51 4c 49 54 45 5f 52 42 55 5f 55  Up>=SQLITE_RBU_U
126a0 50 44 41 54 45 5f 43 41 43 48 45 53 49 5a 45 20  PDATE_CACHESIZE 
126b0 29 7b 0a 20 20 20 20 66 6f 72 28 70 70 3d 26 70  ){.    for(pp=&p
126c0 49 74 65 72 2d 3e 70 52 62 75 55 70 64 61 74 65  Iter->pRbuUpdate
126d0 3b 20 2a 70 70 21 3d 70 55 70 3b 20 70 70 3d 26  ; *pp!=pUp; pp=&
126e0 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 29 3b  ((*pp)->pNext));
126f0 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20  .    *pp = 0;.  
12700 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
12710 7a 65 28 70 55 70 2d 3e 70 55 70 64 61 74 65 29  ze(pUp->pUpdate)
12720 3b 0a 20 20 20 20 70 55 70 2d 3e 70 55 70 64 61  ;.    pUp->pUpda
12730 74 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  te = 0;.  }else{
12740 0a 20 20 20 20 70 55 70 20 3d 20 28 52 62 75 55  .    pUp = (RbuU
12750 70 64 61 74 65 53 74 6d 74 2a 29 72 62 75 4d 61  pdateStmt*)rbuMa
12760 6c 6c 6f 63 28 70 2c 20 73 69 7a 65 6f 66 28 52  lloc(p, sizeof(R
12770 62 75 55 70 64 61 74 65 53 74 6d 74 29 2b 70 49  buUpdateStmt)+pI
12780 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 2b 31 29 3b  ter->nTblCol+1);
12790 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 55 70 20  .  }..  if( pUp 
127a0 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 57 68  ){.    char *zWh
127b0 65 72 65 20 3d 20 72 62 75 4f 62 6a 49 74 65 72  ere = rbuObjIter
127c0 47 65 74 57 68 65 72 65 28 70 2c 20 70 49 74 65  GetWhere(p, pIte
127d0 72 29 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53  r);.    char *zS
127e0 65 74 20 3d 20 72 62 75 4f 62 6a 49 74 65 72 47  et = rbuObjIterG
127f0 65 74 53 65 74 6c 69 73 74 28 70 2c 20 70 49 74  etSetlist(p, pIt
12800 65 72 2c 20 7a 4d 61 73 6b 29 3b 0a 20 20 20 20  er, zMask);.    
12810 63 68 61 72 20 2a 7a 55 70 64 61 74 65 20 3d 20  char *zUpdate = 
12820 30 3b 0a 0a 20 20 20 20 70 55 70 2d 3e 7a 4d 61  0;..    pUp->zMa
12830 73 6b 20 3d 20 28 63 68 61 72 2a 29 26 70 55 70  sk = (char*)&pUp
12840 5b 31 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  [1];.    memcpy(
12850 70 55 70 2d 3e 7a 4d 61 73 6b 2c 20 7a 4d 61 73  pUp->zMask, zMas
12860 6b 2c 20 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f  k, pIter->nTblCo
12870 6c 29 3b 0a 20 20 20 20 70 55 70 2d 3e 70 4e 65  l);.    pUp->pNe
12880 78 74 20 3d 20 70 49 74 65 72 2d 3e 70 52 62 75  xt = pIter->pRbu
12890 55 70 64 61 74 65 3b 0a 20 20 20 20 70 49 74 65  Update;.    pIte
128a0 72 2d 3e 70 52 62 75 55 70 64 61 74 65 20 3d 20  r->pRbuUpdate = 
128b0 70 55 70 3b 0a 0a 20 20 20 20 69 66 28 20 7a 53  pUp;..    if( zS
128c0 65 74 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  et ){.      cons
128d0 74 20 63 68 61 72 20 2a 7a 50 72 65 66 69 78 20  t char *zPrefix 
128e0 3d 20 22 22 3b 0a 0a 20 20 20 20 20 20 69 66 28  = "";..      if(
128f0 20 70 49 74 65 72 2d 3e 65 54 79 70 65 21 3d 52   pIter->eType!=R
12900 42 55 5f 50 4b 5f 56 54 41 42 20 29 20 7a 50 72  BU_PK_VTAB ) zPr
12910 65 66 69 78 20 3d 20 22 72 62 75 5f 69 6d 70 5f  efix = "rbu_imp_
12920 22 3b 0a 20 20 20 20 20 20 7a 55 70 64 61 74 65  ";.      zUpdate
12930 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
12940 74 66 28 22 55 50 44 41 54 45 20 5c 22 25 73 25  tf("UPDATE \"%s%
12950 77 5c 22 20 53 45 54 20 25 73 20 57 48 45 52 45  w\" SET %s WHERE
12960 20 25 73 22 2c 20 0a 20 20 20 20 20 20 20 20 20   %s", .         
12970 20 7a 50 72 65 66 69 78 2c 20 70 49 74 65 72 2d   zPrefix, pIter-
12980 3e 7a 54 62 6c 2c 20 7a 53 65 74 2c 20 7a 57 68  >zTbl, zSet, zWh
12990 65 72 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  ere.      );.   
129a0 20 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61     p->rc = prepa
129b0 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74  reFreeAndCollect
129c0 45 72 72 6f 72 28 0a 20 20 20 20 20 20 20 20 20  Error(.         
129d0 20 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 70 55 70   p->dbMain, &pUp
129e0 2d 3e 70 55 70 64 61 74 65 2c 20 26 70 2d 3e 7a  ->pUpdate, &p->z
129f0 45 72 72 6d 73 67 2c 20 7a 55 70 64 61 74 65 0a  Errmsg, zUpdate.
12a00 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 2a        );.      *
12a10 70 70 53 74 6d 74 20 3d 20 70 55 70 2d 3e 70 55  ppStmt = pUp->pU
12a20 70 64 61 74 65 3b 0a 20 20 20 20 7d 0a 20 20 20  pdate;.    }.   
12a30 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 57   sqlite3_free(zW
12a40 68 65 72 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  here);.    sqlit
12a50 65 33 5f 66 72 65 65 28 7a 53 65 74 29 3b 0a 20  e3_free(zSet);. 
12a60 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e   }..  return p->
12a70 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 73 71  rc;.}..static sq
12a80 6c 69 74 65 33 20 2a 72 62 75 4f 70 65 6e 44 62  lite3 *rbuOpenDb
12a90 68 61 6e 64 6c 65 28 0a 20 20 73 71 6c 69 74 65  handle(.  sqlite
12aa0 33 72 62 75 20 2a 70 2c 20 0a 20 20 63 6f 6e 73  3rbu *p, .  cons
12ab0 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a  t char *zName, .
12ac0 20 20 69 6e 74 20 62 55 73 65 56 66 73 0a 29 7b    int bUseVfs.){
12ad0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
12ae0 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d   0;.  if( p->rc=
12af0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
12b00 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67    const int flag
12b10 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s = SQLITE_OPEN_
12b20 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45  READWRITE|SQLITE
12b30 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 53 51 4c  _OPEN_CREATE|SQL
12b40 49 54 45 5f 4f 50 45 4e 5f 55 52 49 3b 0a 20 20  ITE_OPEN_URI;.  
12b50 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65    p->rc = sqlite
12b60 33 5f 6f 70 65 6e 5f 76 32 28 7a 4e 61 6d 65 2c  3_open_v2(zName,
12b70 20 26 64 62 2c 20 66 6c 61 67 73 2c 20 62 55 73   &db, flags, bUs
12b80 65 56 66 73 20 3f 20 70 2d 3e 7a 56 66 73 4e 61  eVfs ? p->zVfsNa
12b90 6d 65 20 3a 20 30 29 3b 0a 20 20 20 20 69 66 28  me : 0);.    if(
12ba0 20 70 2d 3e 72 63 20 29 7b 0a 20 20 20 20 20 20   p->rc ){.      
12bb0 70 2d 3e 7a 45 72 72 6d 73 67 20 3d 20 73 71 6c  p->zErrmsg = sql
12bc0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
12bd0 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ", sqlite3_errms
12be0 67 28 64 62 29 29 3b 0a 20 20 20 20 20 20 73 71  g(db));.      sq
12bf0 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 62 29 3b  lite3_close(db);
12c00 0a 20 20 20 20 20 20 64 62 20 3d 20 30 3b 0a 20  .      db = 0;. 
12c10 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
12c20 6e 20 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  n db;.}../*.** F
12c30 72 65 65 20 61 6e 20 52 62 75 53 74 61 74 65 20  ree an RbuState 
12c40 6f 62 6a 65 63 74 20 61 6c 6c 6f 63 61 74 65 64  object allocated
12c50 20 62 79 20 72 62 75 4c 6f 61 64 53 74 61 74 65   by rbuLoadState
12c60 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ()..*/.static vo
12c70 69 64 20 72 62 75 46 72 65 65 53 74 61 74 65 28  id rbuFreeState(
12c80 52 62 75 53 74 61 74 65 20 2a 70 29 7b 0a 20 20  RbuState *p){.  
12c90 69 66 28 20 70 20 29 7b 0a 20 20 20 20 73 71 6c  if( p ){.    sql
12ca0 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 54 62  ite3_free(p->zTb
12cb0 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  l);.    sqlite3_
12cc0 66 72 65 65 28 70 2d 3e 7a 44 61 74 61 54 62 6c  free(p->zDataTbl
12cd0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
12ce0 72 65 65 28 70 2d 3e 7a 49 64 78 29 3b 0a 20 20  ree(p->zIdx);.  
12cf0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
12d00 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
12d10 41 6c 6c 6f 63 61 74 65 20 61 6e 20 52 62 75 53  Allocate an RbuS
12d20 74 61 74 65 20 6f 62 6a 65 63 74 20 61 6e 64 20  tate object and 
12d30 6c 6f 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74  load the content
12d40 73 20 6f 66 20 74 68 65 20 72 62 75 5f 73 74 61  s of the rbu_sta
12d50 74 65 20 0a 2a 2a 20 74 61 62 6c 65 20 69 6e 74  te .** table int
12d60 6f 20 69 74 2e 20 52 65 74 75 72 6e 20 61 20 70  o it. Return a p
12d70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 65  ointer to the ne
12d80 77 20 6f 62 6a 65 63 74 2e 20 49 74 20 69 73 20  w object. It is 
12d90 74 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 69  the .** responsi
12da0 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
12db0 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c  ller to eventual
12dc0 6c 79 20 66 72 65 65 20 74 68 65 20 6f 62 6a 65  ly free the obje
12dd0 63 74 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69  ct using.** sqli
12de0 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2a 0a 2a  te3_free()..**.*
12df0 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
12e00 63 75 72 73 2c 20 6c 65 61 76 65 20 61 6e 20 65  curs, leave an e
12e10 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 6d 65  rror code and me
12e20 73 73 61 67 65 20 69 6e 20 74 68 65 20 72 62 75  ssage in the rbu
12e30 20 68 61 6e 64 6c 65 0a 2a 2a 20 61 6e 64 20 72   handle.** and r
12e40 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73  eturn NULL..*/.s
12e50 74 61 74 69 63 20 52 62 75 53 74 61 74 65 20 2a  tatic RbuState *
12e60 72 62 75 4c 6f 61 64 53 74 61 74 65 28 73 71 6c  rbuLoadState(sql
12e70 69 74 65 33 72 62 75 20 2a 70 29 7b 0a 20 20 52  ite3rbu *p){.  R
12e80 62 75 53 74 61 74 65 20 2a 70 52 65 74 20 3d 20  buState *pRet = 
12e90 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  0;.  sqlite3_stm
12ea0 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  t *pStmt = 0;.  
12eb0 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 72 63  int rc;.  int rc
12ec0 32 3b 0a 0a 20 20 70 52 65 74 20 3d 20 28 52 62  2;..  pRet = (Rb
12ed0 75 53 74 61 74 65 2a 29 72 62 75 4d 61 6c 6c 6f  uState*)rbuMallo
12ee0 63 28 70 2c 20 73 69 7a 65 6f 66 28 52 62 75 53  c(p, sizeof(RbuS
12ef0 74 61 74 65 29 29 3b 0a 20 20 69 66 28 20 70 52  tate));.  if( pR
12f00 65 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  et==0 ) return 0
12f10 3b 0a 0a 20 20 72 63 20 3d 20 70 72 65 70 61 72  ;..  rc = prepar
12f20 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45  eFreeAndCollectE
12f30 72 72 6f 72 28 70 2d 3e 64 62 52 62 75 2c 20 26  rror(p->dbRbu, &
12f40 70 53 74 6d 74 2c 20 26 70 2d 3e 7a 45 72 72 6d  pStmt, &p->zErrm
12f50 73 67 2c 20 0a 20 20 20 20 20 20 73 71 6c 69 74  sg, .      sqlit
12f60 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45  e3_mprintf("SELE
12f70 43 54 20 6b 2c 20 76 20 46 52 4f 4d 20 25 73 2e  CT k, v FROM %s.
12f80 72 62 75 5f 73 74 61 74 65 22 2c 20 70 2d 3e 7a  rbu_state", p->z
12f90 53 74 61 74 65 44 62 29 0a 20 20 29 3b 0a 20 20  StateDb).  );.  
12fa0 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
12fb0 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52  E_OK && SQLITE_R
12fc0 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
12fd0 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 73  (pStmt) ){.    s
12fe0 77 69 74 63 68 28 20 73 71 6c 69 74 65 33 5f 63  witch( sqlite3_c
12ff0 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c  olumn_int(pStmt,
13000 20 30 29 20 29 7b 0a 20 20 20 20 20 20 63 61 73   0) ){.      cas
13010 65 20 52 42 55 5f 53 54 41 54 45 5f 53 54 41 47  e RBU_STATE_STAG
13020 45 3a 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d  E:.        pRet-
13030 3e 65 53 74 61 67 65 20 3d 20 73 71 6c 69 74 65  >eStage = sqlite
13040 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74  3_column_int(pSt
13050 6d 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  mt, 1);.        
13060 69 66 28 20 70 52 65 74 2d 3e 65 53 74 61 67 65  if( pRet->eStage
13070 21 3d 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 0a  !=RBU_STAGE_OAL.
13080 20 20 20 20 20 20 20 20 20 26 26 20 70 52 65 74           && pRet
13090 2d 3e 65 53 74 61 67 65 21 3d 52 42 55 5f 53 54  ->eStage!=RBU_ST
130a0 41 47 45 5f 4d 4f 56 45 0a 20 20 20 20 20 20 20  AGE_MOVE.       
130b0 20 20 26 26 20 70 52 65 74 2d 3e 65 53 74 61 67    && pRet->eStag
130c0 65 21 3d 52 42 55 5f 53 54 41 47 45 5f 43 4b 50  e!=RBU_STAGE_CKP
130d0 54 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  T.        ){.   
130e0 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53         p->rc = S
130f0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20  QLITE_CORRUPT;. 
13100 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
13110 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 63   break;..      c
13120 61 73 65 20 52 42 55 5f 53 54 41 54 45 5f 54 42  ase RBU_STATE_TB
13130 4c 3a 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d  L:.        pRet-
13140 3e 7a 54 62 6c 20 3d 20 72 62 75 53 74 72 6e 64  >zTbl = rbuStrnd
13150 75 70 28 28 63 68 61 72 2a 29 73 71 6c 69 74 65  up((char*)sqlite
13160 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
13170 74 6d 74 2c 20 31 29 2c 20 26 72 63 29 3b 0a 20  tmt, 1), &rc);. 
13180 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20         break;.. 
13190 20 20 20 20 20 63 61 73 65 20 52 42 55 5f 53 54       case RBU_ST
131a0 41 54 45 5f 49 44 58 3a 0a 20 20 20 20 20 20 20  ATE_IDX:.       
131b0 20 70 52 65 74 2d 3e 7a 49 64 78 20 3d 20 72 62   pRet->zIdx = rb
131c0 75 53 74 72 6e 64 75 70 28 28 63 68 61 72 2a 29  uStrndup((char*)
131d0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
131e0 65 78 74 28 70 53 74 6d 74 2c 20 31 29 2c 20 26  ext(pStmt, 1), &
131f0 72 63 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  rc);.        bre
13200 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20  ak;..      case 
13210 52 42 55 5f 53 54 41 54 45 5f 52 4f 57 3a 0a 20  RBU_STATE_ROW:. 
13220 20 20 20 20 20 20 20 70 52 65 74 2d 3e 6e 52 6f         pRet->nRo
13230 77 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  w = sqlite3_colu
13240 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 31 29  mn_int(pStmt, 1)
13250 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
13260 0a 0a 20 20 20 20 20 20 63 61 73 65 20 52 42 55  ..      case RBU
13270 5f 53 54 41 54 45 5f 50 52 4f 47 52 45 53 53 3a  _STATE_PROGRESS:
13280 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e 6e  .        pRet->n
13290 50 72 6f 67 72 65 73 73 20 3d 20 73 71 6c 69 74  Progress = sqlit
132a0 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28  e3_column_int64(
132b0 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20 20  pStmt, 1);.     
132c0 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20     break;..     
132d0 20 63 61 73 65 20 52 42 55 5f 53 54 41 54 45 5f   case RBU_STATE_
132e0 43 4b 50 54 3a 0a 20 20 20 20 20 20 20 20 70 52  CKPT:.        pR
132f0 65 74 2d 3e 69 57 61 6c 43 6b 73 75 6d 20 3d 20  et->iWalCksum = 
13300 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
13310 6e 74 36 34 28 70 53 74 6d 74 2c 20 31 29 3b 0a  nt64(pStmt, 1);.
13320 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a          break;..
13330 20 20 20 20 20 20 63 61 73 65 20 52 42 55 5f 53        case RBU_S
13340 54 41 54 45 5f 43 4f 4f 4b 49 45 3a 0a 20 20 20  TATE_COOKIE:.   
13350 20 20 20 20 20 70 52 65 74 2d 3e 69 43 6f 6f 6b       pRet->iCook
13360 69 65 20 3d 20 28 75 33 32 29 73 71 6c 69 74 65  ie = (u32)sqlite
13370 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70  3_column_int64(p
13380 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  Stmt, 1);.      
13390 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20    break;..      
133a0 63 61 73 65 20 52 42 55 5f 53 54 41 54 45 5f 4f  case RBU_STATE_O
133b0 41 4c 53 5a 3a 0a 20 20 20 20 20 20 20 20 70 52  ALSZ:.        pR
133c0 65 74 2d 3e 69 4f 61 6c 53 7a 20 3d 20 28 75 33  et->iOalSz = (u3
133d0 32 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  2)sqlite3_column
133e0 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 31 29  _int64(pStmt, 1)
133f0 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
13400 0a 0a 20 20 20 20 20 20 63 61 73 65 20 52 42 55  ..      case RBU
13410 5f 53 54 41 54 45 5f 50 48 41 53 45 4f 4e 45 53  _STATE_PHASEONES
13420 54 45 50 3a 0a 20 20 20 20 20 20 20 20 70 52 65  TEP:.        pRe
13430 74 2d 3e 6e 50 68 61 73 65 4f 6e 65 53 74 65 70  t->nPhaseOneStep
13440 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
13450 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 31  n_int64(pStmt, 1
13460 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
13470 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20 52 42  ;..      case RB
13480 55 5f 53 54 41 54 45 5f 44 41 54 41 54 42 4c 3a  U_STATE_DATATBL:
13490 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e 7a  .        pRet->z
134a0 44 61 74 61 54 62 6c 20 3d 20 72 62 75 53 74 72  DataTbl = rbuStr
134b0 6e 64 75 70 28 28 63 68 61 72 2a 29 73 71 6c 69  ndup((char*)sqli
134c0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
134d0 70 53 74 6d 74 2c 20 31 29 2c 20 26 72 63 29 3b  pStmt, 1), &rc);
134e0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
134f0 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  .      default:.
13500 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
13510 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  ITE_CORRUPT;.   
13520 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
13530 7d 0a 20 20 7d 0a 20 20 72 63 32 20 3d 20 73 71  }.  }.  rc2 = sq
13540 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
13550 53 74 6d 74 29 3b 0a 20 20 69 66 28 20 72 63 3d  Stmt);.  if( rc=
13560 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20  =SQLITE_OK ) rc 
13570 3d 20 72 63 32 3b 0a 0a 20 20 70 2d 3e 72 63 20  = rc2;..  p->rc 
13580 3d 20 72 63 3b 0a 20 20 72 65 74 75 72 6e 20 70  = rc;.  return p
13590 52 65 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4f  Ret;.}.../*.** O
135a0 70 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  pen the database
135b0 20 68 61 6e 64 6c 65 20 61 6e 64 20 61 74 74 61   handle and atta
135c0 63 68 20 74 68 65 20 52 42 55 20 64 61 74 61 62  ch the RBU datab
135d0 61 73 65 20 61 73 20 22 72 62 75 22 2e 20 49 66  ase as "rbu". If
135e0 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63   an.** error occ
135f0 75 72 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72  urs, leave an er
13600 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 6d 65 73  ror code and mes
13610 73 61 67 65 20 69 6e 20 74 68 65 20 52 42 55 20  sage in the RBU 
13620 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  handle..*/.stati
13630 63 20 76 6f 69 64 20 72 62 75 4f 70 65 6e 44 61  c void rbuOpenDa
13640 74 61 62 61 73 65 28 73 71 6c 69 74 65 33 72 62  tabase(sqlite3rb
13650 75 20 2a 70 2c 20 69 6e 74 20 2a 70 62 52 65 74  u *p, int *pbRet
13660 72 79 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  ry){.  assert( p
13670 2d 3e 72 63 20 7c 7c 20 28 70 2d 3e 64 62 4d 61  ->rc || (p->dbMa
13680 69 6e 3d 3d 30 20 26 26 20 70 2d 3e 64 62 52 62  in==0 && p->dbRb
13690 75 3d 3d 30 29 20 29 3b 0a 20 20 61 73 73 65 72  u==0) );.  asser
136a0 74 28 20 70 2d 3e 72 63 20 7c 7c 20 72 62 75 49  t( p->rc || rbuI
136b0 73 56 61 63 75 75 6d 28 70 29 20 7c 7c 20 70 2d  sVacuum(p) || p-
136c0 3e 7a 54 61 72 67 65 74 21 3d 30 20 29 3b 0a 0a  >zTarget!=0 );..
136d0 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 52 42    /* Open the RB
136e0 55 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  U database */.  
136f0 70 2d 3e 64 62 52 62 75 20 3d 20 72 62 75 4f 70  p->dbRbu = rbuOp
13700 65 6e 44 62 68 61 6e 64 6c 65 28 70 2c 20 70 2d  enDbhandle(p, p-
13710 3e 7a 52 62 75 2c 20 31 29 3b 0a 0a 20 20 69 66  >zRbu, 1);..  if
13720 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
13730 4f 4b 20 26 26 20 72 62 75 49 73 56 61 63 75 75  OK && rbuIsVacuu
13740 6d 28 70 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  m(p) ){.    sqli
13750 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
13760 28 70 2d 3e 64 62 52 62 75 2c 20 22 6d 61 69 6e  (p->dbRbu, "main
13770 22 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  ", SQLITE_FCNTL_
13780 52 42 55 43 4e 54 2c 20 28 76 6f 69 64 2a 29 70  RBUCNT, (void*)p
13790 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 7a 53  );.    if( p->zS
137a0 74 61 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  tate==0 ){.     
137b0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
137c0 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 64 62 5f  le = sqlite3_db_
137d0 66 69 6c 65 6e 61 6d 65 28 70 2d 3e 64 62 52 62  filename(p->dbRb
137e0 75 2c 20 22 6d 61 69 6e 22 29 3b 0a 20 20 20 20  u, "main");.    
137f0 20 20 70 2d 3e 7a 53 74 61 74 65 20 3d 20 72 62    p->zState = rb
13800 75 4d 50 72 69 6e 74 66 28 70 2c 20 22 66 69 6c  uMPrintf(p, "fil
13810 65 3a 2f 2f 25 73 2d 76 61 63 75 75 6d 3f 6d 6f  e://%s-vacuum?mo
13820 64 65 6f 66 3d 25 73 22 2c 20 7a 46 69 6c 65 2c  deof=%s", zFile,
13830 20 7a 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20   zFile);.    }. 
13840 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 75 73 69 6e   }..  /* If usin
13850 67 20 73 65 70 61 72 61 74 65 20 52 42 55 20 61  g separate RBU a
13860 6e 64 20 73 74 61 74 65 20 64 61 74 61 62 61 73  nd state databas
13870 65 73 2c 20 61 74 74 61 63 68 20 74 68 65 20 73  es, attach the s
13880 74 61 74 65 20 64 61 74 61 62 61 73 65 20 74 6f  tate database to
13890 0a 20 20 2a 2a 20 74 68 65 20 52 42 55 20 64 62  .  ** the RBU db
138a0 20 68 61 6e 64 6c 65 20 6e 6f 77 2e 20 20 2a 2f   handle now.  */
138b0 0a 20 20 69 66 28 20 70 2d 3e 7a 53 74 61 74 65  .  if( p->zState
138c0 20 29 7b 0a 20 20 20 20 72 62 75 4d 50 72 69 6e   ){.    rbuMPrin
138d0 74 66 45 78 65 63 28 70 2c 20 70 2d 3e 64 62 52  tfExec(p, p->dbR
138e0 62 75 2c 20 22 41 54 54 41 43 48 20 25 51 20 41  bu, "ATTACH %Q A
138f0 53 20 73 74 61 74 22 2c 20 70 2d 3e 7a 53 74 61  S stat", p->zSta
13900 74 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  te);.    memcpy(
13910 70 2d 3e 7a 53 74 61 74 65 44 62 2c 20 22 73 74  p->zStateDb, "st
13920 61 74 22 2c 20 34 29 3b 0a 20 20 7d 65 6c 73 65  at", 4);.  }else
13930 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e  {.    memcpy(p->
13940 7a 53 74 61 74 65 44 62 2c 20 22 6d 61 69 6e 22  zStateDb, "main"
13950 2c 20 34 29 3b 0a 20 20 7d 0a 0a 23 69 66 20 30  , 4);.  }..#if 0
13960 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
13970 4c 49 54 45 5f 4f 4b 20 26 26 20 72 62 75 49 73  LITE_OK && rbuIs
13980 56 61 63 75 75 6d 28 70 29 20 29 7b 0a 20 20 20  Vacuum(p) ){.   
13990 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33   p->rc = sqlite3
139a0 5f 65 78 65 63 28 70 2d 3e 64 62 52 62 75 2c 20  _exec(p->dbRbu, 
139b0 22 42 45 47 49 4e 22 2c 20 30 2c 20 30 2c 20 30  "BEGIN", 0, 0, 0
139c0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
139d0 20 2f 2a 20 49 66 20 69 74 20 68 61 73 20 6e 6f   /* If it has no
139e0 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63  t already been c
139f0 72 65 61 74 65 64 2c 20 63 72 65 61 74 65 20 74  reated, create t
13a00 68 65 20 72 62 75 5f 73 74 61 74 65 20 74 61 62  he rbu_state tab
13a10 6c 65 20 2a 2f 0a 20 20 72 62 75 4d 50 72 69 6e  le */.  rbuMPrin
13a20 74 66 45 78 65 63 28 70 2c 20 70 2d 3e 64 62 52  tfExec(p, p->dbR
13a30 62 75 2c 20 52 42 55 5f 43 52 45 41 54 45 5f 53  bu, RBU_CREATE_S
13a40 54 41 54 45 2c 20 70 2d 3e 7a 53 74 61 74 65 44  TATE, p->zStateD
13a50 62 29 3b 0a 0a 23 69 66 20 30 0a 20 20 69 66 28  b);..#if 0.  if(
13a60 20 72 62 75 49 73 56 61 63 75 75 6d 28 70 29 20   rbuIsVacuum(p) 
13a70 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  ){.    if( p->rc
13a80 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
13a90 20 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 20 20       int rc2;.  
13aa0 20 20 20 20 69 6e 74 20 62 4f 6b 20 3d 20 30 3b      int bOk = 0;
13ab0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
13ac0 74 6d 74 20 2a 70 43 6e 74 20 3d 20 30 3b 0a 20  tmt *pCnt = 0;. 
13ad0 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 72 65       p->rc = pre
13ae0 70 61 72 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72  pareAndCollectEr
13af0 72 6f 72 28 70 2d 3e 64 62 52 62 75 2c 20 26 70  ror(p->dbRbu, &p
13b00 43 6e 74 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67  Cnt, &p->zErrmsg
13b10 2c 0a 20 20 20 20 20 20 20 20 20 20 22 53 45 4c  ,.          "SEL
13b20 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
13b30 4d 20 73 74 61 74 2e 73 71 6c 69 74 65 5f 6d 61  M stat.sqlite_ma
13b40 73 74 65 72 22 0a 20 20 20 20 20 20 29 3b 0a 20  ster".      );. 
13b50 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
13b60 53 51 4c 49 54 45 5f 4f 4b 20 0a 20 20 20 20 20  SQLITE_OK .     
13b70 20 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74 65    && sqlite3_ste
13b80 70 28 70 43 6e 74 29 3d 3d 53 51 4c 49 54 45 5f  p(pCnt)==SQLITE_
13b90 52 4f 57 0a 20 20 20 20 20 20 20 26 26 20 31 3d  ROW.       && 1=
13ba0 3d 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  =sqlite3_column_
13bb0 69 6e 74 28 70 43 6e 74 2c 20 30 29 0a 20 20 20  int(pCnt, 0).   
13bc0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 62 4f     ){.        bO
13bd0 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  k = 1;.      }. 
13be0 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74       rc2 = sqlit
13bf0 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 43 6e 74  e3_finalize(pCnt
13c00 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  );.      if( p->
13c10 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
13c20 70 2d 3e 72 63 20 3d 20 72 63 32 3b 0a 0a 20 20  p->rc = rc2;..  
13c30 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
13c40 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 4f 6b 3d  QLITE_OK && bOk=
13c50 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  =0 ){.        p-
13c60 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52  >rc = SQLITE_ERR
13c70 4f 52 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 7a  OR;.        p->z
13c80 45 72 72 6d 73 67 20 3d 20 73 71 6c 69 74 65 33  Errmsg = sqlite3
13c90 5f 6d 70 72 69 6e 74 66 28 22 69 6e 76 61 6c 69  _mprintf("invali
13ca0 64 20 73 74 61 74 65 20 64 61 74 61 62 61 73 65  d state database
13cb0 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ");.      }.    
13cc0 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63  .      if( p->rc
13cd0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
13ce0 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73         p->rc = s
13cf0 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
13d00 62 52 62 75 2c 20 22 43 4f 4d 4d 49 54 22 2c 20  bRbu, "COMMIT", 
13d10 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
13d20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  }.    }.  }.#end
13d30 69 66 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  if..  if( p->rc=
13d40 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 62  =SQLITE_OK && rb
13d50 75 49 73 56 61 63 75 75 6d 28 70 29 20 29 7b 0a  uIsVacuum(p) ){.
13d60 20 20 20 20 69 6e 74 20 62 4f 70 65 6e 20 3d 20      int bOpen = 
13d70 30 3b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  0;.    int rc;. 
13d80 20 20 20 70 2d 3e 6e 52 62 75 20 3d 20 30 3b 0a     p->nRbu = 0;.
13d90 20 20 20 20 70 2d 3e 70 52 62 75 46 64 20 3d 20      p->pRbuFd = 
13da0 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  0;.    rc = sqli
13db0 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
13dc0 28 70 2d 3e 64 62 52 62 75 2c 20 22 6d 61 69 6e  (p->dbRbu, "main
13dd0 22 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  ", SQLITE_FCNTL_
13de0 52 42 55 43 4e 54 2c 20 28 76 6f 69 64 2a 29 70  RBUCNT, (void*)p
13df0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
13e00 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29  QLITE_NOTFOUND )
13e10 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20   p->rc = rc;.   
13e20 20 69 66 28 20 70 2d 3e 65 53 74 61 67 65 3e 3d   if( p->eStage>=
13e30 52 42 55 5f 53 54 41 47 45 5f 4d 4f 56 45 20 29  RBU_STAGE_MOVE )
13e40 7b 0a 20 20 20 20 20 20 62 4f 70 65 6e 20 3d 20  {.      bOpen = 
13e50 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
13e60 20 20 20 20 52 62 75 53 74 61 74 65 20 2a 70 53      RbuState *pS
13e70 74 61 74 65 20 3d 20 72 62 75 4c 6f 61 64 53 74  tate = rbuLoadSt
13e80 61 74 65 28 70 29 3b 0a 20 20 20 20 20 20 69 66  ate(p);.      if
13e90 28 20 70 53 74 61 74 65 20 29 7b 0a 20 20 20 20  ( pState ){.    
13ea0 20 20 20 20 62 4f 70 65 6e 20 3d 20 28 70 53 74      bOpen = (pSt
13eb0 61 74 65 2d 3e 65 53 74 61 67 65 3e 3d 52 42 55  ate->eStage>=RBU
13ec0 5f 53 54 41 47 45 5f 4d 4f 56 45 29 3b 0a 20 20  _STAGE_MOVE);.  
13ed0 20 20 20 20 20 20 72 62 75 46 72 65 65 53 74 61        rbuFreeSta
13ee0 74 65 28 70 53 74 61 74 65 29 3b 0a 20 20 20 20  te(pState);.    
13ef0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
13f00 28 20 62 4f 70 65 6e 20 29 20 70 2d 3e 64 62 4d  ( bOpen ) p->dbM
13f10 61 69 6e 20 3d 20 72 62 75 4f 70 65 6e 44 62 68  ain = rbuOpenDbh
13f20 61 6e 64 6c 65 28 70 2c 20 70 2d 3e 7a 52 62 75  andle(p, p->zRbu
13f30 2c 20 70 2d 3e 6e 52 62 75 3c 3d 31 29 3b 0a 20  , p->nRbu<=1);. 
13f40 20 7d 0a 0a 20 20 70 2d 3e 65 53 74 61 67 65 20   }..  p->eStage 
13f50 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63  = 0;.  if( p->rc
13f60 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
13f70 2d 3e 64 62 4d 61 69 6e 3d 3d 30 20 29 7b 0a 20  ->dbMain==0 ){. 
13f80 20 20 20 69 66 28 20 21 72 62 75 49 73 56 61 63     if( !rbuIsVac
13f90 75 75 6d 28 70 29 20 29 7b 0a 20 20 20 20 20 20  uum(p) ){.      
13fa0 70 2d 3e 64 62 4d 61 69 6e 20 3d 20 72 62 75 4f  p->dbMain = rbuO
13fb0 70 65 6e 44 62 68 61 6e 64 6c 65 28 70 2c 20 70  penDbhandle(p, p
13fc0 2d 3e 7a 54 61 72 67 65 74 2c 20 31 29 3b 0a 20  ->zTarget, 1);. 
13fd0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e     }else if( p->
13fe0 70 52 62 75 46 64 2d 3e 70 57 61 6c 46 64 20 29  pRbuFd->pWalFd )
13ff0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 62 52 65  {.      if( pbRe
14000 74 72 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70  try ){.        p
14010 2d 3e 70 52 62 75 46 64 2d 3e 62 4e 6f 6c 6f 63  ->pRbuFd->bNoloc
14020 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73  k = 0;.        s
14030 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 2d 3e  qlite3_close(p->
14040 64 62 52 62 75 29 3b 0a 20 20 20 20 20 20 20 20  dbRbu);.        
14050 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 2d  sqlite3_close(p-
14060 3e 64 62 4d 61 69 6e 29 3b 0a 20 20 20 20 20 20  >dbMain);.      
14070 20 20 70 2d 3e 64 62 4d 61 69 6e 20 3d 20 30 3b    p->dbMain = 0;
14080 0a 20 20 20 20 20 20 20 20 70 2d 3e 64 62 52 62  .        p->dbRb
14090 75 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 2a  u = 0;.        *
140a0 70 62 52 65 74 72 79 20 3d 20 31 3b 0a 20 20 20  pbRetry = 1;.   
140b0 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
140c0 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 72 63     }.      p->rc
140d0 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
140e0 0a 20 20 20 20 20 20 70 2d 3e 7a 45 72 72 6d 73  .      p->zErrms
140f0 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  g = sqlite3_mpri
14100 6e 74 66 28 22 63 61 6e 6e 6f 74 20 76 61 63 75  ntf("cannot vacu
14110 75 6d 20 77 61 6c 20 6d 6f 64 65 20 64 61 74 61  um wal mode data
14120 62 61 73 65 22 29 3b 0a 20 20 20 20 7d 65 6c 73  base");.    }els
14130 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  e{.      char *z
14140 54 61 72 67 65 74 3b 0a 20 20 20 20 20 20 63 68  Target;.      ch
14150 61 72 20 2a 7a 45 78 74 72 61 20 3d 20 30 3b 0a  ar *zExtra = 0;.
14160 20 20 20 20 20 20 69 66 28 20 73 74 72 6c 65 6e        if( strlen
14170 28 70 2d 3e 7a 52 62 75 29 3e 3d 35 20 26 26 20  (p->zRbu)>=5 && 
14180 30 3d 3d 6d 65 6d 63 6d 70 28 22 66 69 6c 65 3a  0==memcmp("file:
14190 22 2c 20 70 2d 3e 7a 52 62 75 2c 20 35 29 20 29  ", p->zRbu, 5) )
141a0 7b 0a 20 20 20 20 20 20 20 20 7a 45 78 74 72 61  {.        zExtra
141b0 20 3d 20 26 70 2d 3e 7a 52 62 75 5b 35 5d 3b 0a   = &p->zRbu[5];.
141c0 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 2a          while( *
141d0 7a 45 78 74 72 61 20 29 7b 0a 20 20 20 20 20 20  zExtra ){.      
141e0 20 20 20 20 69 66 28 20 2a 7a 45 78 74 72 61 2b      if( *zExtra+
141f0 2b 3d 3d 27 3f 27 20 29 20 62 72 65 61 6b 3b 0a  +=='?' ) break;.
14200 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
14210 20 20 69 66 28 20 2a 7a 45 78 74 72 61 3d 3d 27    if( *zExtra=='
14220 5c 30 27 20 29 20 7a 45 78 74 72 61 20 3d 20 30  \0' ) zExtra = 0
14230 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
14240 20 7a 54 61 72 67 65 74 20 3d 20 73 71 6c 69 74   zTarget = sqlit
14250 65 33 5f 6d 70 72 69 6e 74 66 28 22 66 69 6c 65  e3_mprintf("file
14260 3a 25 73 2d 76 61 63 74 6d 70 3f 72 62 75 5f 6d  :%s-vactmp?rbu_m
14270 65 6d 6f 72 79 3d 31 25 73 25 73 22 2c 20 0a 20  emory=1%s%s", . 
14280 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
14290 5f 64 62 5f 66 69 6c 65 6e 61 6d 65 28 70 2d 3e  _db_filename(p->
142a0 64 62 52 62 75 2c 20 22 6d 61 69 6e 22 29 2c 0a  dbRbu, "main"),.
142b0 20 20 20 20 20 20 20 20 20 20 28 7a 45 78 74 72            (zExtr
142c0 61 3d 3d 30 20 3f 20 22 22 20 3a 20 22 26 22 29  a==0 ? "" : "&")
142d0 2c 20 28 7a 45 78 74 72 61 3d 3d 30 20 3f 20 22  , (zExtra==0 ? "
142e0 22 20 3a 20 7a 45 78 74 72 61 29 0a 20 20 20 20  " : zExtra).    
142f0 20 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20    );..      if( 
14300 7a 54 61 72 67 65 74 3d 3d 30 20 29 7b 0a 20 20  zTarget==0 ){.  
14310 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51        p->rc = SQ
14320 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
14330 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
14340 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 64 62 4d    }.      p->dbM
14350 61 69 6e 20 3d 20 72 62 75 4f 70 65 6e 44 62 68  ain = rbuOpenDbh
14360 61 6e 64 6c 65 28 70 2c 20 7a 54 61 72 67 65 74  andle(p, zTarget
14370 2c 20 70 2d 3e 6e 52 62 75 3c 3d 31 29 3b 0a 20  , p->nRbu<=1);. 
14380 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
14390 65 28 7a 54 61 72 67 65 74 29 3b 0a 20 20 20 20  e(zTarget);.    
143a0 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e  }.  }..  if( p->
143b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
143c0 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c  .    p->rc = sql
143d0 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
143e0 74 69 6f 6e 28 70 2d 3e 64 62 4d 61 69 6e 2c 20  tion(p->dbMain, 
143f0 0a 20 20 20 20 20 20 20 20 22 72 62 75 5f 74 6d  .        "rbu_tm
14400 70 5f 69 6e 73 65 72 74 22 2c 20 2d 31 2c 20 53  p_insert", -1, S
14410 51 4c 49 54 45 5f 55 54 46 38 2c 20 28 76 6f 69  QLITE_UTF8, (voi
14420 64 2a 29 70 2c 20 72 62 75 54 6d 70 49 6e 73 65  d*)p, rbuTmpInse
14430 72 74 46 75 6e 63 2c 20 30 2c 20 30 0a 20 20 20  rtFunc, 0, 0.   
14440 20 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70   );.  }..  if( p
14450 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
14460 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73  ){.    p->rc = s
14470 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
14480 6e 63 74 69 6f 6e 28 70 2d 3e 64 62 4d 61 69 6e  nction(p->dbMain
14490 2c 20 0a 20 20 20 20 20 20 20 20 22 72 62 75 5f  , .        "rbu_
144a0 66 6f 73 73 69 6c 5f 64 65 6c 74 61 22 2c 20 32  fossil_delta", 2
144b0 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
144c0 2c 20 72 62 75 46 6f 73 73 69 6c 44 65 6c 74 61  , rbuFossilDelta
144d0 46 75 6e 63 2c 20 30 2c 20 30 0a 20 20 20 20 29  Func, 0, 0.    )
144e0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e  ;.  }..  if( p->
144f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
14500 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c  .    p->rc = sql
14510 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
14520 74 69 6f 6e 28 70 2d 3e 64 62 52 62 75 2c 20 0a  tion(p->dbRbu, .
14530 20 20 20 20 20 20 20 20 22 72 62 75 5f 74 61 72          "rbu_tar
14540 67 65 74 5f 6e 61 6d 65 22 2c 20 2d 31 2c 20 53  get_name", -1, S
14550 51 4c 49 54 45 5f 55 54 46 38 2c 20 28 76 6f 69  QLITE_UTF8, (voi
14560 64 2a 29 70 2c 20 72 62 75 54 61 72 67 65 74 4e  d*)p, rbuTargetN
14570 61 6d 65 46 75 6e 63 2c 20 30 2c 20 30 0a 20 20  ameFunc, 0, 0.  
14580 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20    );.  }..  if( 
14590 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
145a0 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
145b0 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
145c0 74 72 6f 6c 28 70 2d 3e 64 62 4d 61 69 6e 2c 20  trol(p->dbMain, 
145d0 22 6d 61 69 6e 22 2c 20 53 51 4c 49 54 45 5f 46  "main", SQLITE_F
145e0 43 4e 54 4c 5f 52 42 55 2c 20 28 76 6f 69 64 2a  CNTL_RBU, (void*
145f0 29 70 29 3b 0a 20 20 7d 0a 20 20 72 62 75 4d 50  )p);.  }.  rbuMP
14600 72 69 6e 74 66 45 78 65 63 28 70 2c 20 70 2d 3e  rintfExec(p, p->
14610 64 62 4d 61 69 6e 2c 20 22 53 45 4c 45 43 54 20  dbMain, "SELECT 
14620 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  * FROM sqlite_ma
14630 73 74 65 72 22 29 3b 0a 0a 20 20 2f 2a 20 4d 61  ster");..  /* Ma
14640 72 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 20  rk the database 
14650 66 69 6c 65 20 6a 75 73 74 20 6f 70 65 6e 65 64  file just opened
14660 20 61 73 20 61 6e 20 52 42 55 20 74 61 72 67 65   as an RBU targe
14670 74 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 0a  t database. If .
14680 20 20 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 72    ** this call r
14690 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4e 4f  eturns SQLITE_NO
146a0 54 46 4f 55 4e 44 2c 20 74 68 65 6e 20 74 68 65  TFOUND, then the
146b0 20 52 42 55 20 76 66 73 20 69 73 20 6e 6f 74 20   RBU vfs is not 
146c0 69 6e 20 75 73 65 2e 0a 20 20 2a 2a 20 54 68 69  in use..  ** Thi
146d0 73 20 69 73 20 61 6e 20 65 72 72 6f 72 2e 20 20  s is an error.  
146e0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  */.  if( p->rc==
146f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
14700 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33   p->rc = sqlite3
14710 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 70 2d  _file_control(p-
14720 3e 64 62 4d 61 69 6e 2c 20 22 6d 61 69 6e 22 2c  >dbMain, "main",
14730 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 52 42   SQLITE_FCNTL_RB
14740 55 2c 20 28 76 6f 69 64 2a 29 70 29 3b 0a 20 20  U, (void*)p);.  
14750 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  }..  if( p->rc==
14760 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20  SQLITE_NOTFOUND 
14770 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  ){.    p->rc = S
14780 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
14790 20 70 2d 3e 7a 45 72 72 6d 73 67 20 3d 20 73 71   p->zErrmsg = sq
147a0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 72  lite3_mprintf("r
147b0 62 75 20 76 66 73 20 6e 6f 74 20 66 6f 75 6e 64  bu vfs not found
147c0 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ");.  }.}../*.**
147d0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
147e0 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73   a copy of the s
147f0 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69 78  qlite3FileSuffix
14800 33 28 29 20 72 6f 75 74 69 6e 65 20 66 72 6f 6d  3() routine from
14810 20 74 68 65 20 63 6f 72 65 2e 0a 2a 2a 20 49 74   the core..** It
14820 20 69 73 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65   is a no-op unle
14830 73 73 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ss SQLITE_ENABLE
14840 5f 38 5f 33 5f 4e 41 4d 45 53 20 69 73 20 64 65  _8_3_NAMES is de
14850 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  fined..**.** If 
14860 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 38 5f  SQLITE_ENABLE_8_
14870 33 5f 4e 41 4d 45 53 20 69 73 20 73 65 74 20 61  3_NAMES is set a
14880 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 61  t compile-time a
14890 6e 64 20 69 66 20 74 68 65 20 64 61 74 61 62 61  nd if the databa
148a0 73 65 0a 2a 2a 20 66 69 6c 65 6e 61 6d 65 20 69  se.** filename i
148b0 6e 20 7a 42 61 73 65 46 69 6c 65 6e 61 6d 65 20  n zBaseFilename 
148c0 69 73 20 61 20 55 52 49 20 77 69 74 68 20 74 68  is a URI with th
148d0 65 20 22 38 5f 33 5f 6e 61 6d 65 73 3d 31 22 20  e "8_3_names=1" 
148e0 70 61 72 61 6d 65 74 65 72 20 61 6e 64 0a 2a 2a  parameter and.**
148f0 20 69 66 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20   if filename in 
14900 7a 5b 5d 20 68 61 73 20 61 20 73 75 66 66 69 78  z[] has a suffix
14910 20 28 61 2e 6b 2e 61 2e 20 22 65 78 74 65 6e 73   (a.k.a. "extens
14920 69 6f 6e 22 29 20 74 68 61 74 20 69 73 20 6c 6f  ion") that is lo
14930 6e 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 72  nger than.** thr
14940 65 65 20 63 68 61 72 61 63 74 65 72 73 2c 20 74  ee characters, t
14950 68 65 6e 20 73 68 6f 72 74 65 6e 20 74 68 65 20  hen shorten the 
14960 73 75 66 66 69 78 20 6f 6e 20 7a 5b 5d 20 74 6f  suffix on z[] to
14970 20 62 65 20 74 68 65 20 6c 61 73 74 20 74 68 72   be the last thr
14980 65 65 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 73  ee.** characters
14990 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   of the original
149a0 20 73 75 66 66 69 78 2e 0a 2a 2a 0a 2a 2a 20 49   suffix..**.** I
149b0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
149c0 38 5f 33 5f 4e 41 4d 45 53 20 69 73 20 73 65 74  8_3_NAMES is set
149d0 20 74 6f 20 32 20 61 74 20 63 6f 6d 70 69 6c 65   to 2 at compile
149e0 2d 74 69 6d 65 2c 20 74 68 65 6e 20 61 6c 77 61  -time, then alwa
149f0 79 73 0a 2a 2a 20 64 6f 20 74 68 65 20 73 75 66  ys.** do the suf
14a00 66 69 78 20 73 68 6f 72 74 65 6e 69 6e 67 20 72  fix shortening r
14a10 65 67 61 72 64 6c 65 73 73 20 6f 66 20 55 52 49  egardless of URI
14a20 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a   parameter..**.*
14a30 2a 20 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a  * Examples:.**.*
14a40 2a 20 20 20 20 20 74 65 73 74 2e 64 62 2d 6a 6f  *     test.db-jo
14a50 75 72 6e 61 6c 20 20 20 20 3d 3e 20 20 20 74 65  urnal    =>   te
14a60 73 74 2e 6e 61 6c 0a 2a 2a 20 20 20 20 20 74 65  st.nal.**     te
14a70 73 74 2e 64 62 2d 77 61 6c 20 20 20 20 20 20 20  st.db-wal       
14a80 20 3d 3e 20 20 20 74 65 73 74 2e 77 61 6c 0a 2a   =>   test.wal.*
14a90 2a 20 20 20 20 20 74 65 73 74 2e 64 62 2d 73 68  *     test.db-sh
14aa0 6d 20 20 20 20 20 20 20 20 3d 3e 20 20 20 74 65  m        =>   te
14ab0 73 74 2e 73 68 6d 0a 2a 2a 20 20 20 20 20 74 65  st.shm.**     te
14ac0 73 74 2e 64 62 2d 6d 6a 37 66 33 33 31 39 66 61  st.db-mj7f3319fa
14ad0 20 3d 3e 20 20 20 74 65 73 74 2e 39 66 61 0a 2a   =>   test.9fa.*
14ae0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62  /.static void rb
14af0 75 46 69 6c 65 53 75 66 66 69 78 33 28 63 6f 6e  uFileSuffix3(con
14b00 73 74 20 63 68 61 72 20 2a 7a 42 61 73 65 2c 20  st char *zBase, 
14b10 63 68 61 72 20 2a 7a 29 7b 0a 23 69 66 64 65 66  char *z){.#ifdef
14b20 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 38   SQLITE_ENABLE_8
14b30 5f 33 5f 4e 41 4d 45 53 0a 23 69 66 20 53 51 4c  _3_NAMES.#if SQL
14b40 49 54 45 5f 45 4e 41 42 4c 45 5f 38 5f 33 5f 4e  ITE_ENABLE_8_3_N
14b50 41 4d 45 53 3c 32 0a 20 20 69 66 28 20 73 71 6c  AMES<2.  if( sql
14b60 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e  ite3_uri_boolean
14b70 28 7a 42 61 73 65 2c 20 22 38 5f 33 5f 6e 61 6d  (zBase, "8_3_nam
14b80 65 73 22 2c 20 30 29 20 29 0a 23 65 6e 64 69 66  es", 0) ).#endif
14b90 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20  .  {.    int i, 
14ba0 73 7a 3b 0a 20 20 20 20 73 7a 20 3d 20 28 69 6e  sz;.    sz = (in
14bb0 74 29 73 74 72 6c 65 6e 28 7a 29 26 30 78 66 66  t)strlen(z)&0xff
14bc0 66 66 66 66 3b 0a 20 20 20 20 66 6f 72 28 69 3d  ffff;.    for(i=
14bd0 73 7a 2d 31 3b 20 69 3e 30 20 26 26 20 7a 5b 69  sz-1; i>0 && z[i
14be0 5d 21 3d 27 2f 27 20 26 26 20 7a 5b 69 5d 21 3d  ]!='/' && z[i]!=
14bf0 27 2e 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20 20 20  '.'; i--){}.    
14c00 69 66 28 20 7a 5b 69 5d 3d 3d 27 2e 27 20 26 26  if( z[i]=='.' &&
14c10 20 73 7a 3e 69 2b 34 20 29 20 6d 65 6d 6d 6f 76   sz>i+4 ) memmov
14c20 65 28 26 7a 5b 69 2b 31 5d 2c 20 26 7a 5b 73 7a  e(&z[i+1], &z[sz
14c30 2d 33 5d 2c 20 34 29 3b 0a 20 20 7d 0a 23 65 6e  -3], 4);.  }.#en
14c40 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  dif.}../*.** Ret
14c50 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  urn the current 
14c60 77 61 6c 2d 69 6e 64 65 78 20 68 65 61 64 65 72  wal-index header
14c70 20 63 68 65 63 6b 73 75 6d 20 66 6f 72 20 74 68   checksum for th
14c80 65 20 74 61 72 67 65 74 20 64 61 74 61 62 61 73  e target databas
14c90 65 20 0a 2a 2a 20 61 73 20 61 20 36 34 2d 62 69  e .** as a 64-bi
14ca0 74 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a  t integer..**.**
14cb0 20 54 68 65 20 63 68 65 63 6b 73 75 6d 20 69 73   The checksum is
14cc0 20 73 74 6f 72 65 20 69 6e 20 74 68 65 20 66 69   store in the fi
14cd0 72 73 74 20 70 61 67 65 20 6f 66 20 78 53 68 6d  rst page of xShm
14ce0 4d 61 70 20 6d 65 6d 6f 72 79 20 61 73 20 61 6e  Map memory as an
14cf0 20 38 2d 62 79 74 65 20 0a 2a 2a 20 62 6c 6f 62   8-byte .** blob
14d00 20 73 74 61 72 74 69 6e 67 20 61 74 20 62 79 74   starting at byt
14d10 65 20 6f 66 66 73 65 74 20 34 30 2e 0a 2a 2f 0a  e offset 40..*/.
14d20 73 74 61 74 69 63 20 69 36 34 20 72 62 75 53 68  static i64 rbuSh
14d30 6d 43 68 65 63 6b 73 75 6d 28 73 71 6c 69 74 65  mChecksum(sqlite
14d40 33 72 62 75 20 2a 70 29 7b 0a 20 20 69 36 34 20  3rbu *p){.  i64 
14d50 69 52 65 74 20 3d 20 30 3b 0a 20 20 69 66 28 20  iRet = 0;.  if( 
14d60 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
14d70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
14d80 66 69 6c 65 20 2a 70 44 62 20 3d 20 70 2d 3e 70  file *pDb = p->p
14d90 54 61 72 67 65 74 46 64 2d 3e 70 52 65 61 6c 3b  TargetFd->pReal;
14da0 0a 20 20 20 20 75 33 32 20 76 6f 6c 61 74 69 6c  .    u32 volatil
14db0 65 20 2a 70 74 72 3b 0a 20 20 20 20 70 2d 3e 72  e *ptr;.    p->r
14dc0 63 20 3d 20 70 44 62 2d 3e 70 4d 65 74 68 6f 64  c = pDb->pMethod
14dd0 73 2d 3e 78 53 68 6d 4d 61 70 28 70 44 62 2c 20  s->xShmMap(pDb, 
14de0 30 2c 20 33 32 2a 31 30 32 34 2c 20 30 2c 20 28  0, 32*1024, 0, (
14df0 76 6f 69 64 20 76 6f 6c 61 74 69 6c 65 2a 2a 29  void volatile**)
14e00 26 70 74 72 29 3b 0a 20 20 20 20 69 66 28 20 70  &ptr);.    if( p
14e10 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
14e20 29 7b 0a 20 20 20 20 20 20 69 52 65 74 20 3d 20  ){.      iRet = 
14e30 28 28 69 36 34 29 70 74 72 5b 31 30 5d 20 3c 3c  ((i64)ptr[10] <<
14e40 20 33 32 29 20 2b 20 70 74 72 5b 31 31 5d 3b 0a   32) + ptr[11];.
14e50 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
14e60 72 6e 20 69 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn iRet;.}../*.*
14e70 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
14e80 69 73 20 63 61 6c 6c 65 64 20 61 73 20 70 61 72  is called as par
14e90 74 20 6f 66 20 69 6e 69 74 69 61 6c 69 7a 69 6e  t of initializin
14ea0 67 20 6f 72 20 72 65 69 6e 69 74 69 61 6c 69 7a  g or reinitializ
14eb0 69 6e 67 20 61 6e 0a 2a 2a 20 69 6e 63 72 65 6d  ing an.** increm
14ec0 65 6e 74 61 6c 20 63 68 65 63 6b 70 6f 69 6e 74  ental checkpoint
14ed0 2e 20 0a 2a 2a 0a 2a 2a 20 49 74 20 70 6f 70 75  . .**.** It popu
14ee0 6c 61 74 65 73 20 74 68 65 20 73 71 6c 69 74 65  lates the sqlite
14ef0 33 72 62 75 2e 61 46 72 61 6d 65 5b 5d 20 61 72  3rbu.aFrame[] ar
14f00 72 61 79 20 77 69 74 68 20 74 68 65 20 73 65 74  ray with the set
14f10 20 6f 66 20 0a 2a 2a 20 28 77 61 6c 20 66 72 61   of .** (wal fra
14f20 6d 65 20 2d 3e 20 64 62 20 70 61 67 65 29 20 63  me -> db page) c
14f30 6f 70 79 20 6f 70 65 72 61 74 69 6f 6e 73 20 72  opy operations r
14f40 65 71 75 69 72 65 64 20 74 6f 20 63 68 65 63 6b  equired to check
14f50 70 6f 69 6e 74 20 74 68 65 20 0a 2a 2a 20 63 75  point the .** cu
14f60 72 72 65 6e 74 20 77 61 6c 20 66 69 6c 65 2c 20  rrent wal file, 
14f70 61 6e 64 20 6f 62 74 61 69 6e 73 20 74 68 65 20  and obtains the 
14f80 73 65 74 20 6f 66 20 73 68 6d 20 6c 6f 63 6b 73  set of shm locks
14f90 20 72 65 71 75 69 72 65 64 20 74 6f 20 73 61 66   required to saf
14fa0 65 6c 79 20 0a 2a 2a 20 70 65 72 66 6f 72 6d 20  ely .** perform 
14fb0 74 68 65 20 63 6f 70 79 20 6f 70 65 72 61 74 69  the copy operati
14fc0 6f 6e 73 20 64 69 72 65 63 74 6c 79 20 6f 6e 20  ons directly on 
14fd0 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e  the file-system.
14fe0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65  .**.** If argume
14ff0 6e 74 20 70 53 74 61 74 65 20 69 73 20 6e 6f 74  nt pState is not
15000 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20   NULL, then the 
15010 69 6e 63 72 65 6d 65 6e 74 61 6c 20 63 68 65 63  incremental chec
15020 6b 70 6f 69 6e 74 20 69 73 0a 2a 2a 20 62 65 69  kpoint is.** bei
15030 6e 67 20 72 65 73 75 6d 65 64 2e 20 49 6e 20 74  ng resumed. In t
15040 68 69 73 20 63 61 73 65 2c 20 69 66 20 74 68 65  his case, if the
15050 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 74 68 65   checksum of the
15060 20 77 61 6c 2d 69 6e 64 65 78 2d 68 65 61 64 65   wal-index-heade
15070 72 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 72  r.** following r
15080 65 63 6f 76 65 72 79 20 69 73 20 6e 6f 74 20 74  ecovery is not t
15090 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 63  he same as the c
150a0 68 65 63 6b 73 75 6d 20 73 61 76 65 64 20 69 6e  hecksum saved in
150b0 20 74 68 65 20 52 62 75 53 74 61 74 65 0a 2a 2a   the RbuState.**
150c0 20 6f 62 6a 65 63 74 2c 20 74 68 65 6e 20 74 68   object, then th
150d0 65 20 72 62 75 20 68 61 6e 64 6c 65 20 69 73 20  e rbu handle is 
150e0 73 65 74 20 74 6f 20 44 4f 4e 45 20 73 74 61 74  set to DONE stat
150f0 65 2e 20 54 68 69 73 20 6f 63 63 75 72 73 20 69  e. This occurs i
15100 66 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20  f some.** other 
15110 63 6c 69 65 6e 74 20 61 70 70 65 6e 64 73 20 61  client appends a
15120 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20   transaction to 
15130 74 68 65 20 77 61 6c 20 66 69 6c 65 20 69 6e 20  the wal file in 
15140 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a  the middle of.**
15150 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   an incremental 
15160 63 68 65 63 6b 70 6f 69 6e 74 2e 0a 2a 2f 0a 73  checkpoint..*/.s
15170 74 61 74 69 63 20 76 6f 69 64 20 72 62 75 53 65  tatic void rbuSe
15180 74 75 70 43 68 65 63 6b 70 6f 69 6e 74 28 73 71  tupCheckpoint(sq
15190 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 52 62 75  lite3rbu *p, Rbu
151a0 53 74 61 74 65 20 2a 70 53 74 61 74 65 29 7b 0a  State *pState){.
151b0 0a 20 20 2f 2a 20 49 66 20 70 53 74 61 74 65 20  .  /* If pState 
151c0 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  is NULL, then th
151d0 65 20 77 61 6c 20 66 69 6c 65 20 6d 61 79 20 6e  e wal file may n
151e0 6f 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65  ot have been ope
151f0 6e 65 64 20 61 6e 64 0a 20 20 2a 2a 20 72 65 63  ned and.  ** rec
15200 6f 76 65 72 65 64 2e 20 52 75 6e 6e 69 6e 67 20  overed. Running 
15210 61 20 72 65 61 64 2d 73 74 61 74 65 6d 65 6e 74  a read-statement
15220 20 68 65 72 65 20 74 6f 20 65 6e 73 75 72 65 20   here to ensure 
15230 74 68 61 74 20 64 6f 69 6e 67 20 73 6f 0a 20 20  that doing so.  
15240 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 69 6e 74 65  ** does not inte
15250 72 66 65 72 65 20 77 69 74 68 20 74 68 65 20 22  rfere with the "
15260 63 61 70 74 75 72 65 22 20 70 72 6f 63 65 73 73  capture" process
15270 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20 69 66   below.  */.  if
15280 28 20 70 53 74 61 74 65 3d 3d 30 20 29 7b 0a 20  ( pState==0 ){. 
15290 20 20 20 70 2d 3e 65 53 74 61 67 65 20 3d 20 30     p->eStage = 0
152a0 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d  ;.    if( p->rc=
152b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
152c0 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69      p->rc = sqli
152d0 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 4d 61  te3_exec(p->dbMa
152e0 69 6e 2c 20 22 53 45 4c 45 43 54 20 2a 20 46 52  in, "SELECT * FR
152f0 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  OM sqlite_master
15300 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ", 0, 0, 0);.   
15310 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 73 73   }.  }..  /* Ass
15320 75 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72 20 68  uming no error h
15330 61 73 20 6f 63 63 75 72 72 65 64 2c 20 72 75 6e  as occurred, run
15340 20 61 20 22 72 65 73 74 61 72 74 22 20 63 68 65   a "restart" che
15350 63 6b 70 6f 69 6e 74 20 77 69 74 68 20 74 68 65  ckpoint with the
15360 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 72 62 75  .  ** sqlite3rbu
15370 2e 65 53 74 61 67 65 20 76 61 72 69 61 62 6c 65  .eStage variable
15380 20 73 65 74 20 74 6f 20 43 41 50 54 55 52 45 2e   set to CAPTURE.
15390 20 54 68 69 73 20 74 75 72 6e 73 20 6f 6e 20 74   This turns on t
153a0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a  he following.  *
153b0 2a 20 73 70 65 63 69 61 6c 20 62 65 68 61 76 69  * special behavi
153c0 6f 75 72 20 69 6e 20 74 68 65 20 72 62 75 20 56  our in the rbu V
153d0 46 53 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  FS:.  **.  **   
153e0 2a 20 49 66 20 74 68 65 20 65 78 63 6c 75 73 69  * If the exclusi
153f0 76 65 20 73 68 6d 20 57 52 49 54 45 52 20 6f 72  ve shm WRITER or
15400 20 52 45 41 44 30 20 6c 6f 63 6b 20 63 61 6e 6e   READ0 lock cann
15410 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 0a  ot be obtained,.
15420 20 20 2a 2a 20 20 20 20 20 74 68 65 20 63 68 65    **     the che
15430 63 6b 70 6f 69 6e 74 20 66 61 69 6c 73 20 77 69  ckpoint fails wi
15440 74 68 20 53 51 4c 49 54 45 5f 42 55 53 59 20 28  th SQLITE_BUSY (
15450 6e 6f 72 6d 61 6c 6c 79 20 53 51 4c 69 74 65 20  normally SQLite 
15460 77 6f 75 6c 64 0a 20 20 2a 2a 20 20 20 20 20 70  would.  **     p
15470 72 6f 63 65 65 64 20 77 69 74 68 20 72 75 6e 6e  roceed with runn
15480 69 6e 67 20 61 20 70 61 73 73 69 76 65 20 63 68  ing a passive ch
15490 65 63 6b 70 6f 69 6e 74 20 69 6e 73 74 65 61 64  eckpoint instead
154a0 20 6f 66 20 66 61 69 6c 69 6e 67 29 2e 0a 20 20   of failing)..  
154b0 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 41 74 74 65  **.  **   * Atte
154c0 6d 70 74 73 20 74 6f 20 72 65 61 64 20 66 72 6f  mpts to read fro
154d0 6d 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65  m the *-wal file
154e0 20 6f 72 20 77 72 69 74 65 20 74 6f 20 74 68 65   or write to the
154f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20   database file. 
15500 20 2a 2a 20 20 20 20 20 64 6f 20 6e 6f 74 20 70   **     do not p
15510 65 72 66 6f 72 6d 20 61 6e 79 20 49 4f 2e 20 49  erform any IO. I
15520 6e 73 74 65 61 64 2c 20 74 68 65 20 66 72 61 6d  nstead, the fram
15530 65 2f 70 61 67 65 20 63 6f 6d 62 69 6e 61 74 69  e/page combinati
15540 6f 6e 73 20 74 68 61 74 0a 20 20 2a 2a 20 20 20  ons that.  **   
15550 20 20 77 6f 75 6c 64 20 62 65 20 72 65 61 64 2f    would be read/
15560 77 72 69 74 74 65 6e 20 61 72 65 20 72 65 63 6f  written are reco
15570 72 64 65 64 20 69 6e 20 74 68 65 20 73 71 6c 69  rded in the sqli
15580 74 65 33 72 62 75 2e 61 46 72 61 6d 65 5b 5d 0a  te3rbu.aFrame[].
15590 20 20 2a 2a 20 20 20 20 20 61 72 72 61 79 2e 0a    **     array..
155a0 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 43 61    **.  **   * Ca
155b0 6c 6c 73 20 74 6f 20 78 53 68 6d 4c 6f 63 6b 28  lls to xShmLock(
155c0 55 4e 4c 4f 43 4b 29 20 74 6f 20 72 65 6c 65 61  UNLOCK) to relea
155d0 73 65 20 74 68 65 20 65 78 63 6c 75 73 69 76 65  se the exclusive
155e0 20 73 68 6d 20 57 52 49 54 45 52 2c 20 0a 20 20   shm WRITER, .  
155f0 2a 2a 20 20 20 20 20 52 45 41 44 30 20 61 6e 64  **     READ0 and
15600 20 43 48 45 43 4b 50 4f 49 4e 54 20 6c 6f 63 6b   CHECKPOINT lock
15610 73 20 74 61 6b 65 6e 20 61 73 20 70 61 72 74 20  s taken as part 
15620 6f 66 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e  of the checkpoin
15630 74 20 61 72 65 0a 20 20 2a 2a 20 20 20 20 20 6e  t are.  **     n
15640 6f 2d 6f 70 73 2e 20 54 68 65 73 65 20 6c 6f 63  o-ops. These loc
15650 6b 73 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 72  ks will not be r
15660 65 6c 65 61 73 65 64 20 75 6e 74 69 6c 20 74 68  eleased until th
15670 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 2a  e connection.  *
15680 2a 20 20 20 20 20 69 73 20 63 6c 6f 73 65 64 2e  *     is closed.
15690 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 41  .  **.  **   * A
156a0 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 78 53 79  ttempting to xSy
156b0 6e 63 28 29 20 74 68 65 20 64 61 74 61 62 61 73  nc() the databas
156c0 65 20 66 69 6c 65 20 63 61 75 73 65 73 20 61 6e  e file causes an
156d0 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c   SQLITE_INTERNAL
156e0 20 0a 20 20 2a 2a 20 20 20 20 20 65 72 72 6f 72   .  **     error
156f0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 73 20 61  ..  **.  ** As a
15700 20 72 65 73 75 6c 74 2c 20 75 6e 6c 65 73 73 20   result, unless 
15710 61 6e 20 65 72 72 6f 72 20 28 69 2e 65 2e 20 4f  an error (i.e. O
15720 4f 4d 20 6f 72 20 53 51 4c 49 54 45 5f 42 55 53  OM or SQLITE_BUS
15730 59 29 20 6f 63 63 75 72 73 2c 20 74 68 65 0a 20  Y) occurs, the. 
15740 20 2a 2a 20 63 68 65 63 6b 70 6f 69 6e 74 20 62   ** checkpoint b
15750 65 6c 6f 77 20 66 61 69 6c 73 20 77 69 74 68 20  elow fails with 
15760 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c 2c  SQLITE_INTERNAL,
15770 20 61 6e 64 20 6c 65 61 76 65 73 20 74 68 65 20   and leaves the 
15780 61 46 72 61 6d 65 5b 5d 0a 20 20 2a 2a 20 61 72  aFrame[].  ** ar
15790 72 61 79 20 70 6f 70 75 6c 61 74 65 64 20 77 69  ray populated wi
157a0 74 68 20 61 20 73 65 74 20 6f 66 20 28 66 72 61  th a set of (fra
157b0 6d 65 20 2d 3e 20 70 61 67 65 29 20 6d 61 70 70  me -> page) mapp
157c0 69 6e 67 73 2e 20 42 65 63 61 75 73 65 20 74 68  ings. Because th
157d0 65 20 0a 20 20 2a 2a 20 57 52 49 54 45 52 2c 20  e .  ** WRITER, 
157e0 43 48 45 43 4b 50 4f 49 4e 54 20 61 6e 64 20 52  CHECKPOINT and R
157f0 45 41 44 30 20 6c 6f 63 6b 73 20 61 72 65 20 73  EAD0 locks are s
15800 74 69 6c 6c 20 68 65 6c 64 2c 20 69 74 20 69 73  till held, it is
15810 20 73 61 66 65 20 74 6f 20 63 6f 70 79 20 0a 20   safe to copy . 
15820 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68   ** data from th
15830 65 20 77 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20  e wal file into 
15840 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
15850 65 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  e according to t
15860 68 65 20 0a 20 20 2a 2a 20 63 6f 6e 74 65 6e 74  he .  ** content
15870 73 20 6f 66 20 61 46 72 61 6d 65 5b 5d 2e 0a 20  s of aFrame[].. 
15880 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d   */.  if( p->rc=
15890 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
158a0 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 20 20 70    int rc2;.    p
158b0 2d 3e 65 53 74 61 67 65 20 3d 20 52 42 55 5f 53  ->eStage = RBU_S
158c0 54 41 47 45 5f 43 41 50 54 55 52 45 3b 0a 20 20  TAGE_CAPTURE;.  
158d0 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f    rc2 = sqlite3_
158e0 65 78 65 63 28 70 2d 3e 64 62 4d 61 69 6e 2c 20  exec(p->dbMain, 
158f0 22 50 52 41 47 4d 41 20 6d 61 69 6e 2e 77 61 6c  "PRAGMA main.wal
15900 5f 63 68 65 63 6b 70 6f 69 6e 74 3d 72 65 73 74  _checkpoint=rest
15910 61 72 74 22 2c 20 30 2c 20 30 2c 30 29 3b 0a 20  art", 0, 0,0);. 
15920 20 20 20 69 66 28 20 72 63 32 21 3d 53 51 4c 49     if( rc2!=SQLI
15930 54 45 5f 49 4e 54 45 52 4e 41 4c 20 29 20 70 2d  TE_INTERNAL ) p-
15940 3e 72 63 20 3d 20 72 63 32 3b 0a 20 20 7d 0a 0a  >rc = rc2;.  }..
15950 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
15960 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 6e 46 72  ITE_OK && p->nFr
15970 61 6d 65 3e 30 20 29 7b 0a 20 20 20 20 70 2d 3e  ame>0 ){.    p->
15980 65 53 74 61 67 65 20 3d 20 52 42 55 5f 53 54 41  eStage = RBU_STA
15990 47 45 5f 43 4b 50 54 3b 0a 20 20 20 20 70 2d 3e  GE_CKPT;.    p->
159a0 6e 53 74 65 70 20 3d 20 28 70 53 74 61 74 65 20  nStep = (pState 
159b0 3f 20 70 53 74 61 74 65 2d 3e 6e 52 6f 77 20 3a  ? pState->nRow :
159c0 20 30 29 3b 0a 20 20 20 20 70 2d 3e 61 42 75 66   0);.    p->aBuf
159d0 20 3d 20 72 62 75 4d 61 6c 6c 6f 63 28 70 2c 20   = rbuMalloc(p, 
159e0 70 2d 3e 70 67 73 7a 29 3b 0a 20 20 20 20 70 2d  p->pgsz);.    p-
159f0 3e 69 57 61 6c 43 6b 73 75 6d 20 3d 20 72 62 75  >iWalCksum = rbu
15a00 53 68 6d 43 68 65 63 6b 73 75 6d 28 70 29 3b 0a  ShmChecksum(p);.
15a10 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63    }..  if( p->rc
15a20 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
15a30 20 20 20 69 66 28 20 70 2d 3e 6e 46 72 61 6d 65     if( p->nFrame
15a40 3d 3d 30 20 7c 7c 20 28 70 53 74 61 74 65 20 26  ==0 || (pState &
15a50 26 20 70 53 74 61 74 65 2d 3e 69 57 61 6c 43 6b  & pState->iWalCk
15a60 73 75 6d 21 3d 70 2d 3e 69 57 61 6c 43 6b 73 75  sum!=p->iWalCksu
15a70 6d 29 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72  m) ){.      p->r
15a80 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  c = SQLITE_DONE;
15a90 0a 20 20 20 20 20 20 70 2d 3e 65 53 74 61 67 65  .      p->eStage
15aa0 20 3d 20 52 42 55 5f 53 54 41 47 45 5f 44 4f 4e   = RBU_STAGE_DON
15ab0 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  E;.    }else{.  
15ac0 20 20 20 20 69 6e 74 20 6e 53 65 63 74 6f 72 53      int nSectorS
15ad0 69 7a 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ize;.      sqlit
15ae0 65 33 5f 66 69 6c 65 20 2a 70 44 62 20 3d 20 70  e3_file *pDb = p
15af0 2d 3e 70 54 61 72 67 65 74 46 64 2d 3e 70 52 65  ->pTargetFd->pRe
15b00 61 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  al;.      sqlite
15b10 33 5f 66 69 6c 65 20 2a 70 57 61 6c 20 3d 20 70  3_file *pWal = p
15b20 2d 3e 70 54 61 72 67 65 74 46 64 2d 3e 70 57 61  ->pTargetFd->pWa
15b30 6c 46 64 2d 3e 70 52 65 61 6c 3b 0a 20 20 20 20  lFd->pReal;.    
15b40 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 50 61    assert( p->nPa
15b50 67 65 50 65 72 53 65 63 74 6f 72 3d 3d 30 20 29  gePerSector==0 )
15b60 3b 0a 20 20 20 20 20 20 6e 53 65 63 74 6f 72 53  ;.      nSectorS
15b70 69 7a 65 20 3d 20 70 44 62 2d 3e 70 4d 65 74 68  ize = pDb->pMeth
15b80 6f 64 73 2d 3e 78 53 65 63 74 6f 72 53 69 7a 65  ods->xSectorSize
15b90 28 70 44 62 29 3b 0a 20 20 20 20 20 20 69 66 28  (pDb);.      if(
15ba0 20 6e 53 65 63 74 6f 72 53 69 7a 65 3e 70 2d 3e   nSectorSize>p->
15bb0 70 67 73 7a 20 29 7b 0a 20 20 20 20 20 20 20 20  pgsz ){.        
15bc0 70 2d 3e 6e 50 61 67 65 50 65 72 53 65 63 74 6f  p->nPagePerSecto
15bd0 72 20 3d 20 6e 53 65 63 74 6f 72 53 69 7a 65 20  r = nSectorSize 
15be0 2f 20 70 2d 3e 70 67 73 7a 3b 0a 20 20 20 20 20  / p->pgsz;.     
15bf0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
15c00 70 2d 3e 6e 50 61 67 65 50 65 72 53 65 63 74 6f  p->nPagePerSecto
15c10 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 0a  r = 1;.      }..
15c20 20 20 20 20 20 20 2f 2a 20 43 61 6c 6c 20 78 53        /* Call xS
15c30 79 6e 63 28 29 20 6f 6e 20 74 68 65 20 77 61 6c  ync() on the wal
15c40 20 66 69 6c 65 2e 20 54 68 69 73 20 63 61 75 73   file. This caus
15c50 65 73 20 53 51 4c 69 74 65 20 74 6f 20 73 79 6e  es SQLite to syn
15c60 63 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  c the .      ** 
15c70 64 69 72 65 63 74 6f 72 79 20 69 6e 20 77 68 69  directory in whi
15c80 63 68 20 74 68 65 20 74 61 72 67 65 74 20 64 61  ch the target da
15c90 74 61 62 61 73 65 20 61 6e 64 20 74 68 65 20 77  tabase and the w
15ca0 61 6c 20 66 69 6c 65 20 72 65 73 69 64 65 2c 20  al file reside, 
15cb0 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 63 61 73  in .      ** cas
15cc0 65 20 69 74 20 68 61 73 20 6e 6f 74 20 62 65 65  e it has not bee
15cd0 6e 20 73 79 6e 63 65 64 20 73 69 6e 63 65 20 74  n synced since t
15ce0 68 65 20 72 65 6e 61 6d 65 28 29 20 63 61 6c 6c  he rename() call
15cf0 20 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 72 62   in .      ** rb
15d00 75 4d 6f 76 65 4f 61 6c 46 69 6c 65 28 29 2e 20  uMoveOalFile(). 
15d10 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  */.      p->rc =
15d20 20 70 57 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d   pWal->pMethods-
15d30 3e 78 53 79 6e 63 28 70 57 61 6c 2c 20 53 51 4c  >xSync(pWal, SQL
15d40 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29  ITE_SYNC_NORMAL)
15d50 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
15d60 2a 0a 2a 2a 20 43 61 6c 6c 65 64 20 77 68 65 6e  *.** Called when
15d70 20 69 41 6d 74 20 62 79 74 65 73 20 61 72 65 20   iAmt bytes are 
15d80 72 65 61 64 20 66 72 6f 6d 20 6f 66 66 73 65 74  read from offset
15d90 20 69 4f 66 66 20 6f 66 20 74 68 65 20 77 61 6c   iOff of the wal
15da0 20 66 69 6c 65 20 77 68 69 6c 65 0a 2a 2a 20 74   file while.** t
15db0 68 65 20 72 62 75 20 6f 62 6a 65 63 74 20 69 73  he rbu object is
15dc0 20 69 6e 20 63 61 70 74 75 72 65 20 6d 6f 64 65   in capture mode
15dd0 2e 20 52 65 63 6f 72 64 20 74 68 65 20 66 72 61  . Record the fra
15de0 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  me number of the
15df0 20 66 72 61 6d 65 0a 2a 2a 20 62 65 69 6e 67 20   frame.** being 
15e00 72 65 61 64 20 69 6e 20 74 68 65 20 61 46 72 61  read in the aFra
15e10 6d 65 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73  me[] array..*/.s
15e20 74 61 74 69 63 20 69 6e 74 20 72 62 75 43 61 70  tatic int rbuCap
15e30 74 75 72 65 57 61 6c 52 65 61 64 28 73 71 6c 69  tureWalRead(sqli
15e40 74 65 33 72 62 75 20 2a 70 52 62 75 2c 20 69 36  te3rbu *pRbu, i6
15e50 34 20 69 4f 66 66 2c 20 69 6e 74 20 69 41 6d 74  4 iOff, int iAmt
15e60 29 7b 0a 20 20 63 6f 6e 73 74 20 75 33 32 20 6d  ){.  const u32 m
15e70 52 65 71 20 3d 20 28 31 3c 3c 57 41 4c 5f 4c 4f  Req = (1<<WAL_LO
15e80 43 4b 5f 57 52 49 54 45 29 7c 28 31 3c 3c 57 41  CK_WRITE)|(1<<WA
15e90 4c 5f 4c 4f 43 4b 5f 43 4b 50 54 29 7c 28 31 3c  L_LOCK_CKPT)|(1<
15ea0 3c 57 41 4c 5f 4c 4f 43 4b 5f 52 45 41 44 30 29  <WAL_LOCK_READ0)
15eb0 3b 0a 20 20 75 33 32 20 69 46 72 61 6d 65 3b 0a  ;.  u32 iFrame;.
15ec0 0a 20 20 69 66 28 20 70 52 62 75 2d 3e 6d 4c 6f  .  if( pRbu->mLo
15ed0 63 6b 21 3d 6d 52 65 71 20 29 7b 0a 20 20 20 20  ck!=mReq ){.    
15ee0 70 52 62 75 2d 3e 72 63 20 3d 20 53 51 4c 49 54  pRbu->rc = SQLIT
15ef0 45 5f 42 55 53 59 3b 0a 20 20 20 20 72 65 74 75  E_BUSY;.    retu
15f00 72 6e 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e  rn SQLITE_INTERN
15f10 41 4c 3b 0a 20 20 7d 0a 0a 20 20 70 52 62 75 2d  AL;.  }..  pRbu-
15f20 3e 70 67 73 7a 20 3d 20 69 41 6d 74 3b 0a 20 20  >pgsz = iAmt;.  
15f30 69 66 28 20 70 52 62 75 2d 3e 6e 46 72 61 6d 65  if( pRbu->nFrame
15f40 3d 3d 70 52 62 75 2d 3e 6e 46 72 61 6d 65 41 6c  ==pRbu->nFrameAl
15f50 6c 6f 63 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  loc ){.    int n
15f60 4e 65 77 20 3d 20 28 70 52 62 75 2d 3e 6e 46 72  New = (pRbu->nFr
15f70 61 6d 65 41 6c 6c 6f 63 20 3f 20 70 52 62 75 2d  ameAlloc ? pRbu-
15f80 3e 6e 46 72 61 6d 65 41 6c 6c 6f 63 20 3a 20 36  >nFrameAlloc : 6
15f90 34 29 20 2a 20 32 3b 0a 20 20 20 20 52 62 75 46  4) * 2;.    RbuF
15fa0 72 61 6d 65 20 2a 61 4e 65 77 3b 0a 20 20 20 20  rame *aNew;.    
15fb0 61 4e 65 77 20 3d 20 28 52 62 75 46 72 61 6d 65  aNew = (RbuFrame
15fc0 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f  *)sqlite3_reallo
15fd0 63 36 34 28 70 52 62 75 2d 3e 61 46 72 61 6d 65  c64(pRbu->aFrame
15fe0 2c 20 6e 4e 65 77 20 2a 20 73 69 7a 65 6f 66 28  , nNew * sizeof(
15ff0 52 62 75 46 72 61 6d 65 29 29 3b 0a 20 20 20 20  RbuFrame));.    
16000 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 20 72 65  if( aNew==0 ) re
16010 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
16020 4d 3b 0a 20 20 20 20 70 52 62 75 2d 3e 61 46 72  M;.    pRbu->aFr
16030 61 6d 65 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20  ame = aNew;.    
16040 70 52 62 75 2d 3e 6e 46 72 61 6d 65 41 6c 6c 6f  pRbu->nFrameAllo
16050 63 20 3d 20 6e 4e 65 77 3b 0a 20 20 7d 0a 0a 20  c = nNew;.  }.. 
16060 20 69 46 72 61 6d 65 20 3d 20 28 75 33 32 29 28   iFrame = (u32)(
16070 28 69 4f 66 66 2d 33 32 29 20 2f 20 28 69 36 34  (iOff-32) / (i64
16080 29 28 69 41 6d 74 2b 32 34 29 29 20 2b 20 31 3b  )(iAmt+24)) + 1;
16090 0a 20 20 69 66 28 20 70 52 62 75 2d 3e 69 4d 61  .  if( pRbu->iMa
160a0 78 46 72 61 6d 65 3c 69 46 72 61 6d 65 20 29 20  xFrame<iFrame ) 
160b0 70 52 62 75 2d 3e 69 4d 61 78 46 72 61 6d 65 20  pRbu->iMaxFrame 
160c0 3d 20 69 46 72 61 6d 65 3b 0a 20 20 70 52 62 75  = iFrame;.  pRbu
160d0 2d 3e 61 46 72 61 6d 65 5b 70 52 62 75 2d 3e 6e  ->aFrame[pRbu->n
160e0 46 72 61 6d 65 5d 2e 69 57 61 6c 46 72 61 6d 65  Frame].iWalFrame
160f0 20 3d 20 69 46 72 61 6d 65 3b 0a 20 20 70 52 62   = iFrame;.  pRb
16100 75 2d 3e 61 46 72 61 6d 65 5b 70 52 62 75 2d 3e  u->aFrame[pRbu->
16110 6e 46 72 61 6d 65 5d 2e 69 44 62 50 61 67 65 20  nFrame].iDbPage 
16120 3d 20 30 3b 0a 20 20 70 52 62 75 2d 3e 6e 46 72  = 0;.  pRbu->nFr
16130 61 6d 65 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20  ame++;.  return 
16140 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
16150 0a 2a 2a 20 43 61 6c 6c 65 64 20 77 68 65 6e 20  .** Called when 
16160 61 20 70 61 67 65 20 6f 66 20 64 61 74 61 20 69  a page of data i
16170 73 20 77 72 69 74 74 65 6e 20 74 6f 20 6f 66 66  s written to off
16180 73 65 74 20 69 4f 66 66 20 6f 66 20 74 68 65 20  set iOff of the 
16190 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65  database.** file
161a0 20 77 68 69 6c 65 20 74 68 65 20 72 62 75 20 68   while the rbu h
161b0 61 6e 64 6c 65 20 69 73 20 69 6e 20 63 61 70 74  andle is in capt
161c0 75 72 65 20 6d 6f 64 65 2e 20 52 65 63 6f 72 64  ure mode. Record
161d0 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
161e0 20 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65   .** of the page
161f0 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 69   being written i
16200 6e 20 74 68 65 20 61 46 72 61 6d 65 5b 5d 20 61  n the aFrame[] a
16210 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rray..*/.static 
16220 69 6e 74 20 72 62 75 43 61 70 74 75 72 65 44 62  int rbuCaptureDb
16230 57 72 69 74 65 28 73 71 6c 69 74 65 33 72 62 75  Write(sqlite3rbu
16240 20 2a 70 52 62 75 2c 20 69 36 34 20 69 4f 66 66   *pRbu, i64 iOff
16250 29 7b 0a 20 20 70 52 62 75 2d 3e 61 46 72 61 6d  ){.  pRbu->aFram
16260 65 5b 70 52 62 75 2d 3e 6e 46 72 61 6d 65 2d 31  e[pRbu->nFrame-1
16270 5d 2e 69 44 62 50 61 67 65 20 3d 20 28 75 33 32  ].iDbPage = (u32
16280 29 28 69 4f 66 66 20 2f 20 70 52 62 75 2d 3e 70  )(iOff / pRbu->p
16290 67 73 7a 29 20 2b 20 31 3b 0a 20 20 72 65 74 75  gsz) + 1;.  retu
162a0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
162b0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 63  ./*.** This is c
162c0 61 6c 6c 65 64 20 61 73 20 70 61 72 74 20 6f 66  alled as part of
162d0 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   an incremental 
162e0 63 68 65 63 6b 70 6f 69 6e 74 20 6f 70 65 72 61  checkpoint opera
162f0 74 69 6f 6e 2e 20 43 6f 70 79 0a 2a 2a 20 61 20  tion. Copy.** a 
16300 73 69 6e 67 6c 65 20 66 72 61 6d 65 20 6f 66 20  single frame of 
16310 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 77 61  data from the wa
16320 6c 20 66 69 6c 65 20 69 6e 74 6f 20 74 68 65 20  l file into the 
16330 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 61  database file, a
16340 73 0a 2a 2a 20 69 6e 64 69 63 61 74 65 64 20 62  s.** indicated b
16350 79 20 74 68 65 20 52 62 75 46 72 61 6d 65 20 6f  y the RbuFrame o
16360 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  bject..*/.static
16370 20 76 6f 69 64 20 72 62 75 43 68 65 63 6b 70 6f   void rbuCheckpo
16380 69 6e 74 46 72 61 6d 65 28 73 71 6c 69 74 65 33  intFrame(sqlite3
16390 72 62 75 20 2a 70 2c 20 52 62 75 46 72 61 6d 65  rbu *p, RbuFrame
163a0 20 2a 70 46 72 61 6d 65 29 7b 0a 20 20 73 71 6c   *pFrame){.  sql
163b0 69 74 65 33 5f 66 69 6c 65 20 2a 70 57 61 6c 20  ite3_file *pWal 
163c0 3d 20 70 2d 3e 70 54 61 72 67 65 74 46 64 2d 3e  = p->pTargetFd->
163d0 70 57 61 6c 46 64 2d 3e 70 52 65 61 6c 3b 0a 20  pWalFd->pReal;. 
163e0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
163f0 44 62 20 3d 20 70 2d 3e 70 54 61 72 67 65 74 46  Db = p->pTargetF
16400 64 2d 3e 70 52 65 61 6c 3b 0a 20 20 69 36 34 20  d->pReal;.  i64 
16410 69 4f 66 66 3b 0a 0a 20 20 61 73 73 65 72 74 28  iOff;..  assert(
16420 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
16430 4b 20 29 3b 0a 20 20 69 4f 66 66 20 3d 20 28 69  K );.  iOff = (i
16440 36 34 29 28 70 46 72 61 6d 65 2d 3e 69 57 61 6c  64)(pFrame->iWal
16450 46 72 61 6d 65 2d 31 29 20 2a 20 28 70 2d 3e 70  Frame-1) * (p->p
16460 67 73 7a 20 2b 20 32 34 29 20 2b 20 33 32 20 2b  gsz + 24) + 32 +
16470 20 32 34 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 70   24;.  p->rc = p
16480 57 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78  Wal->pMethods->x
16490 52 65 61 64 28 70 57 61 6c 2c 20 70 2d 3e 61 42  Read(pWal, p->aB
164a0 75 66 2c 20 70 2d 3e 70 67 73 7a 2c 20 69 4f 66  uf, p->pgsz, iOf
164b0 66 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 20  f);.  if( p->rc 
164c0 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 4f 66  ) return;..  iOf
164d0 66 20 3d 20 28 69 36 34 29 28 70 46 72 61 6d 65  f = (i64)(pFrame
164e0 2d 3e 69 44 62 50 61 67 65 2d 31 29 20 2a 20 70  ->iDbPage-1) * p
164f0 2d 3e 70 67 73 7a 3b 0a 20 20 70 2d 3e 72 63 20  ->pgsz;.  p->rc 
16500 3d 20 70 44 62 2d 3e 70 4d 65 74 68 6f 64 73 2d  = pDb->pMethods-
16510 3e 78 57 72 69 74 65 28 70 44 62 2c 20 70 2d 3e  >xWrite(pDb, p->
16520 61 42 75 66 2c 20 70 2d 3e 70 67 73 7a 2c 20 69  aBuf, p->pgsz, i
16530 4f 66 66 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  Off);.}.../*.** 
16540 54 61 6b 65 20 61 6e 20 45 58 43 4c 55 53 49 56  Take an EXCLUSIV
16550 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  E lock on the da
16560 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a  tabase file..*/.
16570 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75 4c  static void rbuL
16580 6f 63 6b 44 61 74 61 62 61 73 65 28 73 71 6c 69  ockDatabase(sqli
16590 74 65 33 72 62 75 20 2a 70 29 7b 0a 20 20 73 71  te3rbu *p){.  sq
165a0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 52 65 61  lite3_file *pRea
165b0 6c 20 3d 20 70 2d 3e 70 54 61 72 67 65 74 46 64  l = p->pTargetFd
165c0 2d 3e 70 52 65 61 6c 3b 0a 20 20 61 73 73 65 72  ->pReal;.  asser
165d0 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  t( p->rc==SQLITE
165e0 5f 4f 4b 20 29 3b 0a 20 20 70 2d 3e 72 63 20 3d  _OK );.  p->rc =
165f0 20 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73   pReal->pMethods
16600 2d 3e 78 4c 6f 63 6b 28 70 52 65 61 6c 2c 20 53  ->xLock(pReal, S
16610 51 4c 49 54 45 5f 4c 4f 43 4b 5f 53 48 41 52 45  QLITE_LOCK_SHARE
16620 44 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  D);.  if( p->rc=
16630 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16640 20 20 70 2d 3e 72 63 20 3d 20 70 52 65 61 6c 2d    p->rc = pReal-
16650 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 4c 6f 63 6b  >pMethods->xLock
16660 28 70 52 65 61 6c 2c 20 53 51 4c 49 54 45 5f 4c  (pReal, SQLITE_L
16670 4f 43 4b 5f 45 58 43 4c 55 53 49 56 45 29 3b 0a  OCK_EXCLUSIVE);.
16680 20 20 7d 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e    }.}..#if defin
16690 65 64 28 5f 57 49 4e 33 32 5f 57 43 45 29 0a 73  ed(_WIN32_WCE).s
166a0 74 61 74 69 63 20 4c 50 57 53 54 52 20 72 62 75  tatic LPWSTR rbu
166b0 57 69 6e 55 74 66 38 54 6f 55 6e 69 63 6f 64 65  WinUtf8ToUnicode
166c0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69  (const char *zFi
166d0 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e  lename){.  int n
166e0 43 68 61 72 3b 0a 20 20 4c 50 57 53 54 52 20 7a  Char;.  LPWSTR z
166f0 57 69 64 65 46 69 6c 65 6e 61 6d 65 3b 0a 0a 20  WideFilename;.. 
16700 20 6e 43 68 61 72 20 3d 20 4d 75 6c 74 69 42 79   nChar = MultiBy
16710 74 65 54 6f 57 69 64 65 43 68 61 72 28 43 50 5f  teToWideChar(CP_
16720 55 54 46 38 2c 20 30 2c 20 7a 46 69 6c 65 6e 61  UTF8, 0, zFilena
16730 6d 65 2c 20 2d 31 2c 20 4e 55 4c 4c 2c 20 30 29  me, -1, NULL, 0)
16740 3b 0a 20 20 69 66 28 20 6e 43 68 61 72 3d 3d 30  ;.  if( nChar==0
16750 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
16760 3b 0a 20 20 7d 0a 20 20 7a 57 69 64 65 46 69 6c  ;.  }.  zWideFil
16770 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 5f  ename = sqlite3_
16780 6d 61 6c 6c 6f 63 36 34 28 20 6e 43 68 61 72 2a  malloc64( nChar*
16790 73 69 7a 65 6f 66 28 7a 57 69 64 65 46 69 6c 65  sizeof(zWideFile
167a0 6e 61 6d 65 5b 30 5d 29 20 29 3b 0a 20 20 69 66  name[0]) );.  if
167b0 28 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 3d  ( zWideFilename=
167c0 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
167d0 20 30 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74   0;.  }.  memset
167e0 28 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c 20  (zWideFilename, 
167f0 30 2c 20 6e 43 68 61 72 2a 73 69 7a 65 6f 66 28  0, nChar*sizeof(
16800 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 5b 30 5d  zWideFilename[0]
16810 29 29 3b 0a 20 20 6e 43 68 61 72 20 3d 20 4d 75  ));.  nChar = Mu
16820 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 61  ltiByteToWideCha
16830 72 28 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 46  r(CP_UTF8, 0, zF
16840 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 57 69  ilename, -1, zWi
16850 64 65 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20  deFilename,.    
16860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16870 20 20 20 20 20 20 20 20 20 20 20 20 6e 43 68 61              nCha
16880 72 29 3b 0a 20 20 69 66 28 20 6e 43 68 61 72 3d  r);.  if( nChar=
16890 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
168a0 33 5f 66 72 65 65 28 7a 57 69 64 65 46 69 6c 65  3_free(zWideFile
168b0 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 57 69 64 65  name);.    zWide
168c0 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20  Filename = 0;.  
168d0 7d 0a 20 20 72 65 74 75 72 6e 20 7a 57 69 64 65  }.  return zWide
168e0 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 23 65 6e 64  Filename;.}.#end
168f0 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 52 42  if../*.** The RB
16900 55 20 68 61 6e 64 6c 65 20 69 73 20 63 75 72 72  U handle is curr
16910 65 6e 74 6c 79 20 69 6e 20 52 42 55 5f 53 54 41  ently in RBU_STA
16920 47 45 5f 4f 41 4c 20 73 74 61 74 65 2c 20 77 69  GE_OAL state, wi
16930 74 68 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  th a SHARED lock
16940 0a 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62  .** on the datab
16950 61 73 65 20 66 69 6c 65 2e 20 54 68 69 73 20 70  ase file. This p
16960 72 6f 63 20 6d 6f 76 65 73 20 74 68 65 20 2a 2d  roc moves the *-
16970 6f 61 6c 20 66 69 6c 65 20 74 6f 20 74 68 65 20  oal file to the 
16980 2a 2d 77 61 6c 20 70 61 74 68 2c 0a 2a 2a 20 74  *-wal path,.** t
16990 68 65 6e 20 72 65 6f 70 65 6e 73 20 74 68 65 20  hen reopens the 
169a0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 74  database file (t
169b0 68 69 73 20 74 69 6d 65 20 69 6e 20 76 61 6e 69  his time in vani
169c0 6c 6c 61 2c 20 6e 6f 6e 2d 6f 61 6c 2c 20 57 41  lla, non-oal, WA
169d0 4c 20 6d 6f 64 65 29 2e 0a 2a 2a 20 49 66 20 61  L mode)..** If a
169e0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
169f0 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 63  leave an error c
16a00 6f 64 65 20 61 6e 64 20 65 72 72 6f 72 20 6d 65  ode and error me
16a10 73 73 61 67 65 20 69 6e 20 74 68 65 20 72 62 75  ssage in the rbu
16a20 20 0a 2a 2a 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a   .** handle..*/.
16a30 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75 4d  static void rbuM
16a40 6f 76 65 4f 61 6c 46 69 6c 65 28 73 71 6c 69 74  oveOalFile(sqlit
16a50 65 33 72 62 75 20 2a 70 29 7b 0a 20 20 63 6f 6e  e3rbu *p){.  con
16a60 73 74 20 63 68 61 72 20 2a 7a 42 61 73 65 20 3d  st char *zBase =
16a70 20 73 71 6c 69 74 65 33 5f 64 62 5f 66 69 6c 65   sqlite3_db_file
16a80 6e 61 6d 65 28 70 2d 3e 64 62 4d 61 69 6e 2c 20  name(p->dbMain, 
16a90 22 6d 61 69 6e 22 29 3b 0a 20 20 63 6f 6e 73 74  "main");.  const
16aa0 20 63 68 61 72 20 2a 7a 4d 6f 76 65 20 3d 20 7a   char *zMove = z
16ab0 42 61 73 65 3b 0a 20 20 63 68 61 72 20 2a 7a 4f  Base;.  char *zO
16ac0 61 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 57 61 6c  al;.  char *zWal
16ad0 3b 0a 0a 20 20 69 66 28 20 72 62 75 49 73 56 61  ;..  if( rbuIsVa
16ae0 63 75 75 6d 28 70 29 20 29 7b 0a 20 20 20 20 7a  cuum(p) ){.    z
16af0 4d 6f 76 65 20 3d 20 73 71 6c 69 74 65 33 5f 64  Move = sqlite3_d
16b00 62 5f 66 69 6c 65 6e 61 6d 65 28 70 2d 3e 64 62  b_filename(p->db
16b10 52 62 75 2c 20 22 6d 61 69 6e 22 29 3b 0a 20 20  Rbu, "main");.  
16b20 7d 0a 20 20 7a 4f 61 6c 20 3d 20 73 71 6c 69 74  }.  zOal = sqlit
16b30 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 2d 6f  e3_mprintf("%s-o
16b40 61 6c 22 2c 20 7a 4d 6f 76 65 29 3b 0a 20 20 7a  al", zMove);.  z
16b50 57 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Wal = sqlite3_mp
16b60 72 69 6e 74 66 28 22 25 73 2d 77 61 6c 22 2c 20  rintf("%s-wal", 
16b70 7a 4d 6f 76 65 29 3b 0a 0a 20 20 61 73 73 65 72  zMove);..  asser
16b80 74 28 20 70 2d 3e 65 53 74 61 67 65 3d 3d 52 42  t( p->eStage==RB
16b90 55 5f 53 54 41 47 45 5f 4d 4f 56 45 20 29 3b 0a  U_STAGE_MOVE );.
16ba0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d    assert( p->rc=
16bb0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d  =SQLITE_OK && p-
16bc0 3e 7a 45 72 72 6d 73 67 3d 3d 30 20 29 3b 0a 20  >zErrmsg==0 );. 
16bd0 20 69 66 28 20 7a 57 61 6c 3d 3d 30 20 7c 7c 20   if( zWal==0 || 
16be0 7a 4f 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 70  zOal==0 ){.    p
16bf0 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ->rc = SQLITE_NO
16c00 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  MEM;.  }else{.  
16c10 20 20 2f 2a 20 4d 6f 76 65 20 74 68 65 20 2a 2d    /* Move the *-
16c20 6f 61 6c 20 66 69 6c 65 20 74 6f 20 2a 2d 77 61  oal file to *-wa
16c30 6c 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  l. At this point
16c40 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 2d 3e 64   connection p->d
16c50 62 20 69 73 0a 20 20 20 20 2a 2a 20 68 6f 6c 64  b is.    ** hold
16c60 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63  ing a SHARED loc
16c70 6b 20 6f 6e 20 74 68 65 20 74 61 72 67 65 74 20  k on the target 
16c80 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 62  database file (b
16c90 65 63 61 75 73 65 20 69 74 20 69 73 0a 20 20 20  ecause it is.   
16ca0 20 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f 64 65 29   ** in WAL mode)
16cb0 2e 20 53 6f 20 6e 6f 20 6f 74 68 65 72 20 63 6f  . So no other co
16cc0 6e 6e 65 63 74 69 6f 6e 20 6d 61 79 20 62 65 20  nnection may be 
16cd0 77 72 69 74 69 6e 67 20 74 68 65 20 64 62 2e 20  writing the db. 
16ce0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
16cf0 6e 20 6f 72 64 65 72 20 74 6f 20 65 6e 73 75 72  n order to ensur
16d00 65 20 74 68 61 74 20 74 68 65 72 65 20 61 72 65  e that there are
16d10 20 6e 6f 20 64 61 74 61 62 61 73 65 20 72 65 61   no database rea
16d20 64 65 72 73 2c 20 61 6e 20 45 58 43 4c 55 53 49  ders, an EXCLUSI
16d30 56 45 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 69  VE.    ** lock i
16d40 73 20 6f 62 74 61 69 6e 65 64 20 68 65 72 65 20  s obtained here 
16d50 62 65 66 6f 72 65 20 74 68 65 20 2a 2d 6f 61 6c  before the *-oal
16d60 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 2a 2d 77   is moved to *-w
16d70 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  al..    */.    r
16d80 62 75 4c 6f 63 6b 44 61 74 61 62 61 73 65 28 70  buLockDatabase(p
16d90 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  );.    if( p->rc
16da0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
16db0 20 20 20 20 20 72 62 75 46 69 6c 65 53 75 66 66       rbuFileSuff
16dc0 69 78 33 28 7a 42 61 73 65 2c 20 7a 57 61 6c 29  ix3(zBase, zWal)
16dd0 3b 0a 20 20 20 20 20 20 72 62 75 46 69 6c 65 53  ;.      rbuFileS
16de0 75 66 66 69 78 33 28 7a 42 61 73 65 2c 20 7a 4f  uffix3(zBase, zO
16df0 61 6c 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 52  al);..      /* R
16e00 65 2d 6f 70 65 6e 20 74 68 65 20 64 61 74 61 62  e-open the datab
16e10 61 73 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 72  ases. */.      r
16e20 62 75 4f 62 6a 49 74 65 72 46 69 6e 61 6c 69 7a  buObjIterFinaliz
16e30 65 28 26 70 2d 3e 6f 62 6a 69 74 65 72 29 3b 0a  e(&p->objiter);.
16e40 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c        sqlite3_cl
16e50 6f 73 65 28 70 2d 3e 64 62 52 62 75 29 3b 0a 20  ose(p->dbRbu);. 
16e60 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f       sqlite3_clo
16e70 73 65 28 70 2d 3e 64 62 4d 61 69 6e 29 3b 0a 20  se(p->dbMain);. 
16e80 20 20 20 20 20 70 2d 3e 64 62 4d 61 69 6e 20 3d       p->dbMain =
16e90 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 64 62 52   0;.      p->dbR
16ea0 62 75 20 3d 20 30 3b 0a 0a 23 69 66 20 64 65 66  bu = 0;..#if def
16eb0 69 6e 65 64 28 5f 57 49 4e 33 32 5f 57 43 45 29  ined(_WIN32_WCE)
16ec0 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
16ed0 20 4c 50 57 53 54 52 20 7a 57 69 64 65 4f 61 6c   LPWSTR zWideOal
16ee0 3b 0a 20 20 20 20 20 20 20 20 4c 50 57 53 54 52  ;.        LPWSTR
16ef0 20 7a 57 69 64 65 57 61 6c 3b 0a 0a 20 20 20 20   zWideWal;..    
16f00 20 20 20 20 7a 57 69 64 65 4f 61 6c 20 3d 20 72      zWideOal = r
16f10 62 75 57 69 6e 55 74 66 38 54 6f 55 6e 69 63 6f  buWinUtf8ToUnico
16f20 64 65 28 7a 4f 61 6c 29 3b 0a 20 20 20 20 20 20  de(zOal);.      
16f30 20 20 69 66 28 20 7a 57 69 64 65 4f 61 6c 20 29    if( zWideOal )
16f40 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 57 69 64  {.          zWid
16f50 65 57 61 6c 20 3d 20 72 62 75 57 69 6e 55 74 66  eWal = rbuWinUtf
16f60 38 54 6f 55 6e 69 63 6f 64 65 28 7a 57 61 6c 29  8ToUnicode(zWal)
16f70 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
16f80 7a 57 69 64 65 57 61 6c 20 29 7b 0a 20 20 20 20  zWideWal ){.    
16f90 20 20 20 20 20 20 20 20 69 66 28 20 4d 6f 76 65          if( Move
16fa0 46 69 6c 65 57 28 7a 57 69 64 65 4f 61 6c 2c 20  FileW(zWideOal, 
16fb0 7a 57 69 64 65 57 61 6c 29 20 29 7b 0a 20 20 20  zWideWal) ){.   
16fc0 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63             p->rc
16fd0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
16fe0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
16ff0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
17000 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f  ->rc = SQLITE_IO
17010 45 52 52 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ERR;.           
17020 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73   }.            s
17030 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 57 69 64  qlite3_free(zWid
17040 65 57 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 20  eWal);.         
17050 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
17060 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
17070 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a  TE_IOERR_NOMEM;.
17080 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
17090 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
170a0 65 65 28 7a 57 69 64 65 4f 61 6c 29 3b 0a 20 20  ee(zWideOal);.  
170b0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
170c0 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53         p->rc = S
170d0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
170e0 4d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  M;.        }.   
170f0 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20     }.#else.     
17100 20 70 2d 3e 72 63 20 3d 20 72 65 6e 61 6d 65 28   p->rc = rename(
17110 7a 4f 61 6c 2c 20 7a 57 61 6c 29 20 3f 20 53 51  zOal, zWal) ? SQ
17120 4c 49 54 45 5f 49 4f 45 52 52 20 3a 20 53 51 4c  LITE_IOERR : SQL
17130 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a  ITE_OK;.#endif..
17140 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
17150 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
17160 20 20 20 20 20 20 72 62 75 4f 70 65 6e 44 61 74        rbuOpenDat
17170 61 62 61 73 65 28 70 2c 20 30 29 3b 0a 20 20 20  abase(p, 0);.   
17180 20 20 20 20 20 72 62 75 53 65 74 75 70 43 68 65       rbuSetupChe
17190 63 6b 70 6f 69 6e 74 28 70 2c 20 30 29 3b 0a 20  ckpoint(p, 0);. 
171a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
171b0 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ..  sqlite3_free
171c0 28 7a 57 61 6c 29 3b 0a 20 20 73 71 6c 69 74 65  (zWal);.  sqlite
171d0 33 5f 66 72 65 65 28 7a 4f 61 6c 29 3b 0a 7d 0a  3_free(zOal);.}.
171e0 0a 2f 2a 0a 2a 2a 20 54 68 65 20 53 45 4c 45 43  ./*.** The SELEC
171f0 54 20 73 74 61 74 65 6d 65 6e 74 20 69 74 65 72  T statement iter
17200 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20 74 68  ating through th
17210 65 20 6b 65 79 73 20 66 6f 72 20 74 68 65 20 63  e keys for the c
17220 75 72 72 65 6e 74 20 6f 62 6a 65 63 74 0a 2a 2a  urrent object.**
17230 20 28 70 2d 3e 6f 62 6a 69 74 65 72 2e 70 53 65   (p->objiter.pSe
17240 6c 65 63 74 29 20 63 75 72 72 65 6e 74 6c 79 20  lect) currently 
17250 70 6f 69 6e 74 73 20 74 6f 20 61 20 76 61 6c 69  points to a vali
17260 64 20 72 6f 77 2e 20 54 68 69 73 20 66 75 6e 63  d row. This func
17270 74 69 6f 6e 0a 2a 2a 20 64 65 74 65 72 6d 69 6e  tion.** determin
17280 65 73 20 74 68 65 20 74 79 70 65 20 6f 66 20 6f  es the type of o
17290 70 65 72 61 74 69 6f 6e 20 72 65 71 75 65 73 74  peration request
172a0 65 64 20 62 79 20 74 68 69 73 20 72 6f 77 20 61  ed by this row a
172b0 6e 64 20 72 65 74 75 72 6e 73 0a 2a 2a 20 6f 6e  nd returns.** on
172c0 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
172d0 6e 67 20 76 61 6c 75 65 73 20 74 6f 20 69 6e 64  ng values to ind
172e0 69 63 61 74 65 20 74 68 65 20 72 65 73 75 6c 74  icate the result
172f0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 52 42  :.**.**     * RB
17300 55 5f 49 4e 53 45 52 54 0a 2a 2a 20 20 20 20 20  U_INSERT.**     
17310 2a 20 52 42 55 5f 44 45 4c 45 54 45 0a 2a 2a 20  * RBU_DELETE.** 
17320 20 20 20 20 2a 20 52 42 55 5f 49 44 58 5f 44 45      * RBU_IDX_DE
17330 4c 45 54 45 0a 2a 2a 20 20 20 20 20 2a 20 52 42  LETE.**     * RB
17340 55 5f 55 50 44 41 54 45 0a 2a 2a 0a 2a 2a 20 49  U_UPDATE.**.** I
17350 66 20 52 42 55 5f 55 50 44 41 54 45 20 69 73 20  f RBU_UPDATE is 
17360 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 6f  returned, then o
17370 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 20 2a  utput variable *
17380 70 7a 4d 61 73 6b 20 69 73 20 73 65 74 20 74 6f  pzMask is set to
17390 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  .** point to the
173a0 20 74 65 78 74 20 76 61 6c 75 65 20 69 6e 64 69   text value indi
173b0 63 61 74 69 6e 67 20 74 68 65 20 63 6f 6c 75 6d  cating the colum
173c0 6e 73 20 74 6f 20 75 70 64 61 74 65 2e 0a 2a 2a  ns to update..**
173d0 0a 2a 2a 20 49 66 20 74 68 65 20 72 62 75 5f 63  .** If the rbu_c
173e0 6f 6e 74 72 6f 6c 20 66 69 65 6c 64 20 63 6f 6e  ontrol field con
173f0 74 61 69 6e 73 20 61 6e 20 69 6e 76 61 6c 69 64  tains an invalid
17400 20 76 61 6c 75 65 2c 20 61 6e 20 65 72 72 6f 72   value, an error
17410 20 63 6f 64 65 20 61 6e 64 0a 2a 2a 20 6d 65 73   code and.** mes
17420 73 61 67 65 20 61 72 65 20 6c 65 66 74 20 69 6e  sage are left in
17430 20 74 68 65 20 52 42 55 20 68 61 6e 64 6c 65 20   the RBU handle 
17440 61 6e 64 20 7a 65 72 6f 20 72 65 74 75 72 6e 65  and zero returne
17450 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
17460 20 72 62 75 53 74 65 70 54 79 70 65 28 73 71 6c   rbuStepType(sql
17470 69 74 65 33 72 62 75 20 2a 70 2c 20 63 6f 6e 73  ite3rbu *p, cons
17480 74 20 63 68 61 72 20 2a 2a 70 7a 4d 61 73 6b 29  t char **pzMask)
17490 7b 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70  {.  int iCol = p
174a0 2d 3e 6f 62 6a 69 74 65 72 2e 6e 43 6f 6c 3b 20  ->objiter.nCol; 
174b0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
174c0 72 62 75 5f 63 6f 6e 74 72 6f 6c 20 63 6f 6c 75  rbu_control colu
174d0 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 20  mn */.  int res 
174e0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
174f0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
17500 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 73 77  n value */..  sw
17510 69 74 63 68 28 20 73 71 6c 69 74 65 33 5f 63 6f  itch( sqlite3_co
17520 6c 75 6d 6e 5f 74 79 70 65 28 70 2d 3e 6f 62 6a  lumn_type(p->obj
17530 69 74 65 72 2e 70 53 65 6c 65 63 74 2c 20 69 43  iter.pSelect, iC
17540 6f 6c 29 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ol) ){.    case 
17550 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a 20  SQLITE_INTEGER: 
17560 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 56 61 6c  {.      int iVal
17570 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
17580 6e 5f 69 6e 74 28 70 2d 3e 6f 62 6a 69 74 65 72  n_int(p->objiter
17590 2e 70 53 65 6c 65 63 74 2c 20 69 43 6f 6c 29 3b  .pSelect, iCol);
175a0 0a 20 20 20 20 20 20 73 77 69 74 63 68 28 20 69  .      switch( i
175b0 56 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 63  Val ){.        c
175c0 61 73 65 20 30 3a 20 72 65 73 20 3d 20 52 42 55  ase 0: res = RBU
175d0 5f 49 4e 53 45 52 54 3b 20 20 20 20 20 62 72 65  _INSERT;     bre
175e0 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65  ak;.        case
175f0 20 31 3a 20 72 65 73 20 3d 20 52 42 55 5f 44 45   1: res = RBU_DE
17600 4c 45 54 45 3b 20 20 20 20 20 62 72 65 61 6b 3b  LETE;     break;
17610 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 32 3a  .        case 2:
17620 20 72 65 73 20 3d 20 52 42 55 5f 52 45 50 4c 41   res = RBU_REPLA
17630 43 45 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  CE;    break;.  
17640 20 20 20 20 20 20 63 61 73 65 20 33 3a 20 72 65        case 3: re
17650 73 20 3d 20 52 42 55 5f 49 44 58 5f 44 45 4c 45  s = RBU_IDX_DELE
17660 54 45 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  TE; break;.     
17670 20 20 20 63 61 73 65 20 34 3a 20 72 65 73 20 3d     case 4: res =
17680 20 52 42 55 5f 49 44 58 5f 49 4e 53 45 52 54 3b   RBU_IDX_INSERT;
17690 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
176a0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
176b0 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c   }..    case SQL
176c0 49 54 45 5f 54 45 58 54 3a 20 7b 0a 20 20 20 20  ITE_TEXT: {.    
176d0 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
176e0 20 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74   char *z = sqlit
176f0 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
17700 2d 3e 6f 62 6a 69 74 65 72 2e 70 53 65 6c 65 63  ->objiter.pSelec
17710 74 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20  t, iCol);.      
17720 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20  if( z==0 ){.    
17730 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
17740 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
17750 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2a  }else{.        *
17760 70 7a 4d 61 73 6b 20 3d 20 28 63 6f 6e 73 74 20  pzMask = (const 
17770 63 68 61 72 2a 29 7a 3b 0a 20 20 20 20 20 20 7d  char*)z;.      }
17780 0a 20 20 20 20 20 20 72 65 73 20 3d 20 52 42 55  .      res = RBU
17790 5f 55 50 44 41 54 45 3b 0a 0a 20 20 20 20 20 20  _UPDATE;..      
177a0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
177b0 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
177c0 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 69   break;.  }..  i
177d0 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20  f( res==0 ){.   
177e0 20 72 62 75 42 61 64 43 6f 6e 74 72 6f 6c 45 72   rbuBadControlEr
177f0 72 6f 72 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65  ror(p);.  }.  re
17800 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 23 69 66  turn res;.}..#if
17810 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
17820 0a 2f 2a 0a 2a 2a 20 41 73 73 65 72 74 20 74 68  ./*.** Assert th
17830 61 74 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 20 6f  at column iCol o
17840 66 20 73 74 61 74 65 6d 65 6e 74 20 70 53 74 6d  f statement pStm
17850 74 20 69 73 20 6e 61 6d 65 64 20 7a 4e 61 6d 65  t is named zName
17860 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
17870 20 61 73 73 65 72 74 43 6f 6c 75 6d 6e 4e 61 6d   assertColumnNam
17880 65 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a  e(sqlite3_stmt *
17890 70 53 74 6d 74 2c 20 69 6e 74 20 69 43 6f 6c 2c  pStmt, int iCol,
178a0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
178b0 6d 65 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  me){.  const cha
178c0 72 20 2a 7a 43 6f 6c 20 3d 20 73 71 6c 69 74 65  r *zCol = sqlite
178d0 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53  3_column_name(pS
178e0 74 6d 74 2c 20 69 43 6f 6c 29 3b 0a 20 20 61 73  tmt, iCol);.  as
178f0 73 65 72 74 28 20 30 3d 3d 73 71 6c 69 74 65 33  sert( 0==sqlite3
17900 5f 73 74 72 69 63 6d 70 28 7a 4e 61 6d 65 2c 20  _stricmp(zName, 
17910 7a 43 6f 6c 29 20 29 3b 0a 7d 0a 23 65 6c 73 65  zCol) );.}.#else
17920 0a 23 20 64 65 66 69 6e 65 20 61 73 73 65 72 74  .# define assert
17930 43 6f 6c 75 6d 6e 4e 61 6d 65 28 78 2c 79 2c 7a  ColumnName(x,y,z
17940 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
17950 41 72 67 75 6d 65 6e 74 20 65 54 79 70 65 20 6d  Argument eType m
17960 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20 52 42  ust be one of RB
17970 55 5f 49 4e 53 45 52 54 2c 20 52 42 55 5f 44 45  U_INSERT, RBU_DE
17980 4c 45 54 45 2c 20 52 42 55 5f 49 44 58 5f 49 4e  LETE, RBU_IDX_IN
17990 53 45 52 54 20 6f 72 0a 2a 2a 20 52 42 55 5f 49  SERT or.** RBU_I
179a0 44 58 5f 44 45 4c 45 54 45 2e 20 54 68 69 73 20  DX_DELETE. This 
179b0 66 75 6e 63 74 69 6f 6e 20 70 65 72 66 6f 72 6d  function perform
179c0 73 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 61 20  s the work of a 
179d0 73 69 6e 67 6c 65 0a 2a 2a 20 73 71 6c 69 74 65  single.** sqlite
179e0 33 72 62 75 5f 73 74 65 70 28 29 20 63 61 6c 6c  3rbu_step() call
179f0 20 66 6f 72 20 74 68 65 20 74 79 70 65 20 6f 66   for the type of
17a00 20 6f 70 65 72 61 74 69 6f 6e 20 73 70 65 63 69   operation speci
17a10 66 69 65 64 20 62 79 20 65 54 79 70 65 2e 0a 2a  fied by eType..*
17a20 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62  /.static void rb
17a30 75 53 74 65 70 4f 6e 65 4f 70 28 73 71 6c 69 74  uStepOneOp(sqlit
17a40 65 33 72 62 75 20 2a 70 2c 20 69 6e 74 20 65 54  e3rbu *p, int eT
17a50 79 70 65 29 7b 0a 20 20 52 62 75 4f 62 6a 49 74  ype){.  RbuObjIt
17a60 65 72 20 2a 70 49 74 65 72 20 3d 20 26 70 2d 3e  er *pIter = &p->
17a70 6f 62 6a 69 74 65 72 3b 0a 20 20 73 71 6c 69 74  objiter;.  sqlit
17a80 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a  e3_value *pVal;.
17a90 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
17aa0 70 57 72 69 74 65 72 3b 0a 20 20 69 6e 74 20 69  pWriter;.  int i
17ab0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ;..  assert( p->
17ac0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
17ad0 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65  .  assert( eType
17ae0 21 3d 52 42 55 5f 44 45 4c 45 54 45 20 7c 7c 20  !=RBU_DELETE || 
17af0 70 49 74 65 72 2d 3e 7a 49 64 78 3d 3d 30 20 29  pIter->zIdx==0 )
17b00 3b 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70  ;.  assert( eTyp
17b10 65 3d 3d 52 42 55 5f 44 45 4c 45 54 45 20 7c 7c  e==RBU_DELETE ||
17b20 20 65 54 79 70 65 3d 3d 52 42 55 5f 49 44 58 5f   eType==RBU_IDX_
17b30 44 45 4c 45 54 45 0a 20 20 20 20 20 20 20 7c 7c  DELETE.       ||
17b40 20 65 54 79 70 65 3d 3d 52 42 55 5f 49 4e 53 45   eType==RBU_INSE
17b50 52 54 20 7c 7c 20 65 54 79 70 65 3d 3d 52 42 55  RT || eType==RBU
17b60 5f 49 44 58 5f 49 4e 53 45 52 54 0a 20 20 29 3b  _IDX_INSERT.  );
17b70 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
17b80 73 20 61 20 64 65 6c 65 74 65 2c 20 64 65 63 72  s a delete, decr
17b90 65 6d 65 6e 74 20 6e 50 68 61 73 65 4f 6e 65 53  ement nPhaseOneS
17ba0 74 65 70 20 62 79 20 6e 49 6e 64 65 78 2e 20 49  tep by nIndex. I
17bb0 66 20 74 68 65 20 44 45 4c 45 54 45 0a 20 20 2a  f the DELETE.  *
17bc0 2a 20 73 74 61 74 65 6d 65 6e 74 20 62 65 6c 6f  * statement belo
17bd0 77 20 64 6f 65 73 20 61 63 74 75 61 6c 6c 79 20  w does actually 
17be0 64 65 6c 65 74 65 20 61 20 72 6f 77 2c 20 6e 50  delete a row, nP
17bf0 68 61 73 65 4f 6e 65 53 74 65 70 20 77 69 6c 6c  haseOneStep will
17c00 20 62 65 0a 20 20 2a 2a 20 69 6e 63 72 65 6d 65   be.  ** increme
17c10 6e 74 65 64 20 62 79 20 74 68 65 20 73 61 6d 65  nted by the same
17c20 20 61 6d 6f 75 6e 74 20 77 68 65 6e 20 53 51 4c   amount when SQL
17c30 20 66 75 6e 63 74 69 6f 6e 20 72 62 75 5f 74 6d   function rbu_tm
17c40 70 5f 69 6e 73 65 72 74 28 29 0a 20 20 2a 2a 20  p_insert().  ** 
17c50 69 73 20 69 6e 76 6f 6b 65 64 20 62 79 20 74 68  is invoked by th
17c60 65 20 74 72 69 67 67 65 72 2e 20 20 2a 2f 0a 20  e trigger.  */. 
17c70 20 69 66 28 20 65 54 79 70 65 3d 3d 52 42 55 5f   if( eType==RBU_
17c80 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 70 2d  DELETE ){.    p-
17c90 3e 6e 50 68 61 73 65 4f 6e 65 53 74 65 70 20 2d  >nPhaseOneStep -
17ca0 3d 20 70 2d 3e 6f 62 6a 69 74 65 72 2e 6e 49 6e  = p->objiter.nIn
17cb0 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  dex;.  }..  if( 
17cc0 65 54 79 70 65 3d 3d 52 42 55 5f 49 44 58 5f 44  eType==RBU_IDX_D
17cd0 45 4c 45 54 45 20 7c 7c 20 65 54 79 70 65 3d 3d  ELETE || eType==
17ce0 52 42 55 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20  RBU_DELETE ){.  
17cf0 20 20 70 57 72 69 74 65 72 20 3d 20 70 49 74 65    pWriter = pIte
17d00 72 2d 3e 70 44 65 6c 65 74 65 3b 0a 20 20 7d 65  r->pDelete;.  }e
17d10 6c 73 65 7b 0a 20 20 20 20 70 57 72 69 74 65 72  lse{.    pWriter
17d20 20 3d 20 70 49 74 65 72 2d 3e 70 49 6e 73 65 72   = pIter->pInser
17d30 74 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 3d  t;.  }..  for(i=
17d40 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 43 6f 6c  0; i<pIter->nCol
17d50 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 49  ; i++){.    /* I
17d60 66 20 74 68 69 73 20 69 73 20 61 6e 20 49 4e 53  f this is an INS
17d70 45 52 54 20 69 6e 74 6f 20 61 20 74 61 62 6c 65  ERT into a table
17d80 20 62 2d 74 72 65 65 20 61 6e 64 20 74 68 65 20   b-tree and the 
17d90 74 61 62 6c 65 20 68 61 73 20 61 6e 0a 20 20 20  table has an.   
17da0 20 2a 2a 20 65 78 70 6c 69 63 69 74 20 49 4e 54   ** explicit INT
17db0 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
17dc0 2c 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 69  , check that thi
17dd0 73 20 69 73 20 6e 6f 74 20 61 6e 20 61 74 74 65  s is not an atte
17de0 6d 70 74 0a 20 20 20 20 2a 2a 20 74 6f 20 77 72  mpt.    ** to wr
17df0 69 74 65 20 61 20 4e 55 4c 4c 20 69 6e 74 6f 20  ite a NULL into 
17e00 74 68 65 20 49 50 4b 20 63 6f 6c 75 6d 6e 2e 20  the IPK column. 
17e10 54 68 61 74 20 69 73 20 6e 6f 74 20 70 65 72 6d  That is not perm
17e20 69 74 74 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69  itted.  */.    i
17e30 66 28 20 65 54 79 70 65 3d 3d 52 42 55 5f 49 4e  f( eType==RBU_IN
17e40 53 45 52 54 20 0a 20 20 20 20 20 26 26 20 70 49  SERT .     && pI
17e50 74 65 72 2d 3e 7a 49 64 78 3d 3d 30 20 26 26 20  ter->zIdx==0 && 
17e60 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42  pIter->eType==RB
17e70 55 5f 50 4b 5f 49 50 4b 20 26 26 20 70 49 74 65  U_PK_IPK && pIte
17e80 72 2d 3e 61 62 54 62 6c 50 6b 5b 69 5d 20 0a 20  r->abTblPk[i] . 
17e90 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 5f 63      && sqlite3_c
17ea0 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 49 74 65 72  olumn_type(pIter
17eb0 2d 3e 70 53 65 6c 65 63 74 2c 20 69 29 3d 3d 53  ->pSelect, i)==S
17ec0 51 4c 49 54 45 5f 4e 55 4c 4c 0a 20 20 20 20 29  QLITE_NULL.    )
17ed0 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20  {.      p->rc = 
17ee0 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48 3b  SQLITE_MISMATCH;
17ef0 0a 20 20 20 20 20 20 70 2d 3e 7a 45 72 72 6d 73  .      p->zErrms
17f00 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  g = sqlite3_mpri
17f10 6e 74 66 28 22 64 61 74 61 74 79 70 65 20 6d 69  ntf("datatype mi
17f20 73 6d 61 74 63 68 22 29 3b 0a 20 20 20 20 20 20  smatch");.      
17f30 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20  return;.    }.. 
17f40 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 52 42     if( eType==RB
17f50 55 5f 44 45 4c 45 54 45 20 26 26 20 70 49 74 65  U_DELETE && pIte
17f60 72 2d 3e 61 62 54 62 6c 50 6b 5b 69 5d 3d 3d 30  r->abTblPk[i]==0
17f70 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e   ){.      contin
17f80 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  ue;.    }..    p
17f90 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  Val = sqlite3_co
17fa0 6c 75 6d 6e 5f 76 61 6c 75 65 28 70 49 74 65 72  lumn_value(pIter
17fb0 2d 3e 70 53 65 6c 65 63 74 2c 20 69 29 3b 0a 20  ->pSelect, i);. 
17fc0 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74     p->rc = sqlit
17fd0 65 33 5f 62 69 6e 64 5f 76 61 6c 75 65 28 70 57  e3_bind_value(pW
17fe0 72 69 74 65 72 2c 20 69 2b 31 2c 20 70 56 61 6c  riter, i+1, pVal
17ff0 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  );.    if( p->rc
18000 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20   ) return;.  }. 
18010 20 69 66 28 20 70 49 74 65 72 2d 3e 7a 49 64 78   if( pIter->zIdx
18020 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ==0 ){.    if( p
18030 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55  Iter->eType==RBU
18040 5f 50 4b 5f 56 54 41 42 20 0a 20 20 20 20 20 7c  _PK_VTAB .     |
18050 7c 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d  | pIter->eType==
18060 52 42 55 5f 50 4b 5f 4e 4f 4e 45 20 0a 20 20 20  RBU_PK_NONE .   
18070 20 20 7c 7c 20 28 70 49 74 65 72 2d 3e 65 54 79    || (pIter->eTy
18080 70 65 3d 3d 52 42 55 5f 50 4b 5f 45 58 54 45 52  pe==RBU_PK_EXTER
18090 4e 41 4c 20 26 26 20 72 62 75 49 73 56 61 63 75  NAL && rbuIsVacu
180a0 75 6d 28 70 29 29 20 0a 20 20 20 20 29 7b 0a 20  um(p)) .    ){. 
180b0 20 20 20 20 20 2f 2a 20 46 6f 72 20 61 20 76 69       /* For a vi
180c0 72 74 75 61 6c 20 74 61 62 6c 65 2c 20 6f 72 20  rtual table, or 
180d0 61 20 74 61 62 6c 65 20 77 69 74 68 20 6e 6f 20  a table with no 
180e0 70 72 69 6d 61 72 79 20 6b 65 79 2c 20 74 68 65  primary key, the
180f0 20 0a 20 20 20 20 20 20 2a 2a 20 53 45 4c 45 43   .      ** SELEC
18100 54 20 73 74 61 74 65 6d 65 6e 74 20 69 73 3a 0a  T statement is:.
18110 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
18120 2a 20 20 20 53 45 4c 45 43 54 20 3c 63 6f 6c 73  *   SELECT <cols
18130 3e 2c 20 72 62 75 5f 63 6f 6e 74 72 6f 6c 2c 20  >, rbu_control, 
18140 72 62 75 5f 72 6f 77 69 64 20 46 52 4f 4d 20 2e  rbu_rowid FROM .
18150 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ....      **.   
18160 20 20 20 2a 2a 20 48 65 6e 63 65 20 63 6f 6c 75     ** Hence colu
18170 6d 6e 5f 76 61 6c 75 65 28 70 49 74 65 72 2d 3e  mn_value(pIter->
18180 6e 43 6f 6c 2b 31 29 2e 0a 20 20 20 20 20 20 2a  nCol+1)..      *
18190 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 43 6f  /.      assertCo
181a0 6c 75 6d 6e 4e 61 6d 65 28 70 49 74 65 72 2d 3e  lumnName(pIter->
181b0 70 53 65 6c 65 63 74 2c 20 70 49 74 65 72 2d 3e  pSelect, pIter->
181c0 6e 43 6f 6c 2b 31 2c 20 0a 20 20 20 20 20 20 20  nCol+1, .       
181d0 20 20 20 72 62 75 49 73 56 61 63 75 75 6d 28 70     rbuIsVacuum(p
181e0 29 20 3f 20 22 72 6f 77 69 64 22 20 3a 20 22 72  ) ? "rowid" : "r
181f0 62 75 5f 72 6f 77 69 64 22 0a 20 20 20 20 20 20  bu_rowid".      
18200 29 3b 0a 20 20 20 20 20 20 70 56 61 6c 20 3d 20  );.      pVal = 
18210 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 76  sqlite3_column_v
18220 61 6c 75 65 28 70 49 74 65 72 2d 3e 70 53 65 6c  alue(pIter->pSel
18230 65 63 74 2c 20 70 49 74 65 72 2d 3e 6e 43 6f 6c  ect, pIter->nCol
18240 2b 31 29 3b 0a 20 20 20 20 20 20 70 2d 3e 72 63  +1);.      p->rc
18250 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f   = sqlite3_bind_
18260 76 61 6c 75 65 28 70 57 72 69 74 65 72 2c 20 70  value(pWriter, p
18270 49 74 65 72 2d 3e 6e 43 6f 6c 2b 31 2c 20 70 56  Iter->nCol+1, pV
18280 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  al);.    }.  }. 
18290 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
182a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
182b0 69 74 65 33 5f 73 74 65 70 28 70 57 72 69 74 65  ite3_step(pWrite
182c0 72 29 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20  r);.    p->rc = 
182d0 72 65 73 65 74 41 6e 64 43 6f 6c 6c 65 63 74 45  resetAndCollectE
182e0 72 72 6f 72 28 70 57 72 69 74 65 72 2c 20 26 70  rror(pWriter, &p
182f0 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a 20 20 7d 0a  ->zErrmsg);.  }.
18300 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
18310 6e 63 74 69 6f 6e 20 64 6f 65 73 20 74 68 65 20  nction does the 
18320 77 6f 72 6b 20 66 6f 72 20 61 6e 20 73 71 6c 69  work for an sqli
18330 74 65 33 72 62 75 5f 73 74 65 70 28 29 20 63 61  te3rbu_step() ca
18340 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 62  ll..**.** The ob
18350 6a 65 63 74 2d 69 74 65 72 61 74 6f 72 20 28 70  ject-iterator (p
18360 2d 3e 6f 62 6a 69 74 65 72 29 20 63 75 72 72 65  ->objiter) curre
18370 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 61  ntly points to a
18380 20 76 61 6c 69 64 20 6f 62 6a 65 63 74 2c 0a 2a   valid object,.*
18390 2a 20 61 6e 64 20 74 68 65 20 69 6e 70 75 74 20  * and the input 
183a0 63 75 72 73 6f 72 20 28 70 2d 3e 6f 62 6a 69 74  cursor (p->objit
183b0 65 72 2e 70 53 65 6c 65 63 74 29 20 63 75 72 72  er.pSelect) curr
183c0 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20  ently points to 
183d0 61 20 76 61 6c 69 64 0a 2a 2a 20 69 6e 70 75 74  a valid.** input
183e0 20 72 6f 77 2e 20 50 65 72 66 6f 72 6d 20 77 68   row. Perform wh
183f0 61 74 65 76 65 72 20 70 72 6f 63 65 73 73 69 6e  atever processin
18400 67 20 69 73 20 72 65 71 75 69 72 65 64 20 61 6e  g is required an
18410 64 20 72 65 74 75 72 6e 2e 0a 2a 2a 0a 2a 2a 20  d return..**.** 
18420 49 66 20 6e 6f 20 20 65 72 72 6f 72 20 6f 63 63  If no  error occ
18430 75 72 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  urs, SQLITE_OK i
18440 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
18450 72 77 69 73 65 2c 20 61 6e 20 65 72 72 6f 72 20  rwise, an error 
18460 63 6f 64 65 0a 2a 2a 20 61 6e 64 20 6d 65 73 73  code.** and mess
18470 61 67 65 20 69 73 20 6c 65 66 74 20 69 6e 20 74  age is left in t
18480 68 65 20 52 42 55 20 68 61 6e 64 6c 65 20 61 6e  he RBU handle an
18490 64 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  d a copy of the 
184a0 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 72 65  error code.** re
184b0 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
184c0 63 20 69 6e 74 20 72 62 75 53 74 65 70 28 73 71  c int rbuStep(sq
184d0 6c 69 74 65 33 72 62 75 20 2a 70 29 7b 0a 20 20  lite3rbu *p){.  
184e0 52 62 75 4f 62 6a 49 74 65 72 20 2a 70 49 74 65  RbuObjIter *pIte
184f0 72 20 3d 20 26 70 2d 3e 6f 62 6a 69 74 65 72 3b  r = &p->objiter;
18500 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
18510 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Mask = 0;.  int 
18520 65 54 79 70 65 20 3d 20 72 62 75 53 74 65 70 54  eType = rbuStepT
18530 79 70 65 28 70 2c 20 26 7a 4d 61 73 6b 29 3b 0a  ype(p, &zMask);.
18540 0a 20 20 69 66 28 20 65 54 79 70 65 20 29 7b 0a  .  if( eType ){.
18550 20 20 20 20 61 73 73 65 72 74 28 20 65 54 79 70      assert( eTyp
18560 65 3d 3d 52 42 55 5f 49 4e 53 45 52 54 20 20 20  e==RBU_INSERT   
18570 20 20 7c 7c 20 65 54 79 70 65 3d 3d 52 42 55 5f    || eType==RBU_
18580 44 45 4c 45 54 45 0a 20 20 20 20 20 20 20 20 20  DELETE.         
18590 7c 7c 20 65 54 79 70 65 3d 3d 52 42 55 5f 52 45  || eType==RBU_RE
185a0 50 4c 41 43 45 20 20 20 20 7c 7c 20 65 54 79 70  PLACE    || eTyp
185b0 65 3d 3d 52 42 55 5f 49 44 58 5f 44 45 4c 45 54  e==RBU_IDX_DELET
185c0 45 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 65 54  E.         || eT
185d0 79 70 65 3d 3d 52 42 55 5f 49 44 58 5f 49 4e 53  ype==RBU_IDX_INS
185e0 45 52 54 20 7c 7c 20 65 54 79 70 65 3d 3d 52 42  ERT || eType==RB
185f0 55 5f 55 50 44 41 54 45 0a 20 20 20 20 29 3b 0a  U_UPDATE.    );.
18600 20 20 20 20 61 73 73 65 72 74 28 20 65 54 79 70      assert( eTyp
18610 65 21 3d 52 42 55 5f 55 50 44 41 54 45 20 7c 7c  e!=RBU_UPDATE ||
18620 20 70 49 74 65 72 2d 3e 7a 49 64 78 3d 3d 30 20   pIter->zIdx==0 
18630 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 49 74 65  );..    if( pIte
18640 72 2d 3e 7a 49 64 78 3d 3d 30 20 26 26 20 28 65  r->zIdx==0 && (e
18650 54 79 70 65 3d 3d 52 42 55 5f 49 44 58 5f 44 45  Type==RBU_IDX_DE
18660 4c 45 54 45 20 7c 7c 20 65 54 79 70 65 3d 3d 52  LETE || eType==R
18670 42 55 5f 49 44 58 5f 49 4e 53 45 52 54 29 20 29  BU_IDX_INSERT) )
18680 7b 0a 20 20 20 20 20 20 72 62 75 42 61 64 43 6f  {.      rbuBadCo
18690 6e 74 72 6f 6c 45 72 72 6f 72 28 70 29 3b 0a 20  ntrolError(p);. 
186a0 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69 66     }.    else if
186b0 28 20 65 54 79 70 65 3d 3d 52 42 55 5f 52 45 50  ( eType==RBU_REP
186c0 4c 41 43 45 20 29 7b 0a 20 20 20 20 20 20 69 66  LACE ){.      if
186d0 28 20 70 49 74 65 72 2d 3e 7a 49 64 78 3d 3d 30  ( pIter->zIdx==0
186e0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e   ){.        p->n
186f0 50 68 61 73 65 4f 6e 65 53 74 65 70 20 2b 3d 20  PhaseOneStep += 
18700 70 2d 3e 6f 62 6a 69 74 65 72 2e 6e 49 6e 64 65  p->objiter.nInde
18710 78 3b 0a 20 20 20 20 20 20 20 20 72 62 75 53 74  x;.        rbuSt
18720 65 70 4f 6e 65 4f 70 28 70 2c 20 52 42 55 5f 44  epOneOp(p, RBU_D
18730 45 4c 45 54 45 29 3b 0a 20 20 20 20 20 20 7d 0a  ELETE);.      }.
18740 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
18750 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 62 75  =SQLITE_OK ) rbu
18760 53 74 65 70 4f 6e 65 4f 70 28 70 2c 20 52 42 55  StepOneOp(p, RBU
18770 5f 49 4e 53 45 52 54 29 3b 0a 20 20 20 20 7d 0a  _INSERT);.    }.
18780 20 20 20 20 65 6c 73 65 20 69 66 28 20 65 54 79      else if( eTy
18790 70 65 21 3d 52 42 55 5f 55 50 44 41 54 45 20 29  pe!=RBU_UPDATE )
187a0 7b 0a 20 20 20 20 20 20 72 62 75 53 74 65 70 4f  {.      rbuStepO
187b0 6e 65 4f 70 28 70 2c 20 65 54 79 70 65 29 3b 0a  neOp(p, eType);.
187c0 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 7b 0a      }.    else{.
187d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61        sqlite3_va
187e0 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 20 20 20  lue *pVal;.     
187f0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
18800 55 70 64 61 74 65 20 3d 20 30 3b 0a 20 20 20 20  Update = 0;.    
18810 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d    assert( eType=
18820 3d 52 42 55 5f 55 50 44 41 54 45 20 29 3b 0a 20  =RBU_UPDATE );. 
18830 20 20 20 20 20 70 2d 3e 6e 50 68 61 73 65 4f 6e       p->nPhaseOn
18840 65 53 74 65 70 20 2d 3d 20 70 2d 3e 6f 62 6a 69  eStep -= p->obji
18850 74 65 72 2e 6e 49 6e 64 65 78 3b 0a 20 20 20 20  ter.nIndex;.    
18860 20 20 72 62 75 47 65 74 55 70 64 61 74 65 53 74    rbuGetUpdateSt
18870 6d 74 28 70 2c 20 70 49 74 65 72 2c 20 7a 4d 61  mt(p, pIter, zMa
18880 73 6b 2c 20 26 70 55 70 64 61 74 65 29 3b 0a 20  sk, &pUpdate);. 
18890 20 20 20 20 20 69 66 28 20 70 55 70 64 61 74 65       if( pUpdate
188a0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
188b0 69 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  i;.        for(i
188c0 3d 30 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  =0; p->rc==SQLIT
188d0 45 5f 4f 4b 20 26 26 20 69 3c 70 49 74 65 72 2d  E_OK && i<pIter-
188e0 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCol; i++){.   
188f0 20 20 20 20 20 20 20 63 68 61 72 20 63 20 3d 20         char c = 
18900 7a 4d 61 73 6b 5b 70 49 74 65 72 2d 3e 61 69 53  zMask[pIter->aiS
18910 72 63 4f 72 64 65 72 5b 69 5d 5d 3b 0a 20 20 20  rcOrder[i]];.   
18920 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20 73 71         pVal = sq
18930 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c  lite3_column_val
18940 75 65 28 70 49 74 65 72 2d 3e 70 53 65 6c 65 63  ue(pIter->pSelec
18950 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20  t, i);.         
18960 20 69 66 28 20 70 49 74 65 72 2d 3e 61 62 54 62   if( pIter->abTb
18970 6c 50 6b 5b 69 5d 20 7c 7c 20 63 21 3d 27 2e 27  lPk[i] || c!='.'
18980 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
18990 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  p->rc = sqlite3_
189a0 62 69 6e 64 5f 76 61 6c 75 65 28 70 55 70 64 61  bind_value(pUpda
189b0 74 65 2c 20 69 2b 31 2c 20 70 56 61 6c 29 3b 0a  te, i+1, pVal);.
189c0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
189d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
189e0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
189f0 4f 4b 20 0a 20 20 20 20 20 20 20 20 20 26 26 20  OK .         && 
18a00 28 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52  (pIter->eType==R
18a10 42 55 5f 50 4b 5f 56 54 41 42 20 7c 7c 20 70 49  BU_PK_VTAB || pI
18a20 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f  ter->eType==RBU_
18a30 50 4b 5f 4e 4f 4e 45 29 20 0a 20 20 20 20 20 20  PK_NONE) .      
18a40 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f    ){.          /
18a50 2a 20 42 69 6e 64 20 74 68 65 20 72 62 75 5f 72  * Bind the rbu_r
18a60 6f 77 69 64 20 76 61 6c 75 65 20 74 6f 20 63 6f  owid value to co
18a70 6c 75 6d 6e 20 5f 72 6f 77 69 64 5f 20 2a 2f 0a  lumn _rowid_ */.
18a80 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
18a90 43 6f 6c 75 6d 6e 4e 61 6d 65 28 70 49 74 65 72  ColumnName(pIter
18aa0 2d 3e 70 53 65 6c 65 63 74 2c 20 70 49 74 65 72  ->pSelect, pIter
18ab0 2d 3e 6e 43 6f 6c 2b 31 2c 20 22 72 62 75 5f 72  ->nCol+1, "rbu_r
18ac0 6f 77 69 64 22 29 3b 0a 20 20 20 20 20 20 20 20  owid");.        
18ad0 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33    pVal = sqlite3
18ae0 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28 70 49  _column_value(pI
18af0 74 65 72 2d 3e 70 53 65 6c 65 63 74 2c 20 70 49  ter->pSelect, pI
18b00 74 65 72 2d 3e 6e 43 6f 6c 2b 31 29 3b 0a 20 20  ter->nCol+1);.  
18b10 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
18b20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 76 61 6c  sqlite3_bind_val
18b30 75 65 28 70 55 70 64 61 74 65 2c 20 70 49 74 65  ue(pUpdate, pIte
18b40 72 2d 3e 6e 43 6f 6c 2b 31 2c 20 70 56 61 6c 29  r->nCol+1, pVal)
18b50 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
18b60 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
18b70 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
18b80 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
18b90 65 70 28 70 55 70 64 61 74 65 29 3b 0a 20 20 20  ep(pUpdate);.   
18ba0 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72         p->rc = r
18bb0 65 73 65 74 41 6e 64 43 6f 6c 6c 65 63 74 45 72  esetAndCollectEr
18bc0 72 6f 72 28 70 55 70 64 61 74 65 2c 20 26 70 2d  ror(pUpdate, &p-
18bd0 3e 7a 45 72 72 6d 73 67 29 3b 0a 20 20 20 20 20  >zErrmsg);.     
18be0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
18bf0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
18c00 70 2d 3e 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  p->rc;.}../*.** 
18c10 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 73 63  Increment the sc
18c20 68 65 6d 61 20 63 6f 6f 6b 69 65 20 6f 66 20 74  hema cookie of t
18c30 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
18c40 20 6f 70 65 6e 65 64 20 62 79 20 70 2d 3e 64 62   opened by p->db
18c50 4d 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20  Main..**.** Or, 
18c60 69 66 20 74 68 69 73 20 69 73 20 61 6e 20 52 42  if this is an RB
18c70 55 20 76 61 63 75 75 6d 2c 20 73 65 74 20 74 68  U vacuum, set th
18c80 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20  e schema cookie 
18c90 6f 66 20 74 68 65 20 6d 61 69 6e 20 64 62 0a 2a  of the main db.*
18ca0 2a 20 6f 70 65 6e 65 64 20 62 79 20 70 2d 3e 64  * opened by p->d
18cb0 62 4d 61 69 6e 20 74 6f 20 6f 6e 65 20 6d 6f 72  bMain to one mor
18cc0 65 20 74 68 61 6e 20 74 68 65 20 73 63 68 65 6d  e than the schem
18cd0 61 20 63 6f 6f 6b 69 65 20 6f 66 20 74 68 65 20  a cookie of the 
18ce0 6d 61 69 6e 0a 2a 2a 20 64 62 20 6f 70 65 6e 65  main.** db opene
18cf0 64 20 62 79 20 70 2d 3e 64 62 52 62 75 2e 0a 2a  d by p->dbRbu..*
18d00 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62  /.static void rb
18d10 75 49 6e 63 72 53 63 68 65 6d 61 43 6f 6f 6b 69  uIncrSchemaCooki
18d20 65 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 29  e(sqlite3rbu *p)
18d30 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  {.  if( p->rc==S
18d40 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
18d50 73 71 6c 69 74 65 33 20 2a 64 62 72 65 61 64 20  sqlite3 *dbread 
18d60 3d 20 28 72 62 75 49 73 56 61 63 75 75 6d 28 70  = (rbuIsVacuum(p
18d70 29 20 3f 20 70 2d 3e 64 62 52 62 75 20 3a 20 70  ) ? p->dbRbu : p
18d80 2d 3e 64 62 4d 61 69 6e 29 3b 0a 20 20 20 20 69  ->dbMain);.    i
18d90 6e 74 20 69 43 6f 6f 6b 69 65 20 3d 20 31 30 30  nt iCookie = 100
18da0 30 30 30 30 3b 0a 20 20 20 20 73 71 6c 69 74 65  0000;.    sqlite
18db0 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a  3_stmt *pStmt;..
18dc0 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70      p->rc = prep
18dd0 61 72 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72  areAndCollectErr
18de0 6f 72 28 64 62 72 65 61 64 2c 20 26 70 53 74 6d  or(dbread, &pStm
18df0 74 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 20  t, &p->zErrmsg, 
18e00 0a 20 20 20 20 20 20 20 20 22 50 52 41 47 4d 41  .        "PRAGMA
18e10 20 73 63 68 65 6d 61 5f 76 65 72 73 69 6f 6e 22   schema_version"
18e20 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
18e30 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
18e40 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 6f 76   ){.      /* Cov
18e50 65 72 61 67 65 3a 20 69 74 20 6d 61 79 20 62 65  erage: it may be
18e60 20 74 68 61 74 20 74 68 69 73 20 73 71 6c 69 74   that this sqlit
18e70 65 33 5f 73 74 65 70 28 29 20 63 61 6e 6e 6f 74  e3_step() cannot
18e80 20 66 61 69 6c 2e 20 54 68 65 72 65 0a 20 20 20   fail. There.   
18e90 20 20 20 2a 2a 20 69 73 20 61 6c 72 65 61 64 79     ** is already
18ea0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f   a transaction o
18eb0 70 65 6e 2c 20 73 6f 20 74 68 65 20 70 72 65 70  pen, so the prep
18ec0 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 63  ared statement c
18ed0 61 6e 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20 74  annot.      ** t
18ee0 68 72 6f 77 20 61 6e 20 53 51 4c 49 54 45 5f 53  hrow an SQLITE_S
18ef0 43 48 45 4d 41 20 65 78 63 65 70 74 69 6f 6e 2e  CHEMA exception.
18f00 20 54 68 65 20 6f 6e 6c 79 20 64 61 74 61 62 61   The only databa
18f10 73 65 20 70 61 67 65 20 74 68 65 0a 20 20 20 20  se page the.    
18f20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 72    ** statement r
18f30 65 61 64 73 20 69 73 20 70 61 67 65 20 31 2c 20  eads is page 1, 
18f40 77 68 69 63 68 20 69 73 20 67 75 61 72 61 6e 74  which is guarant
18f50 65 65 64 20 74 6f 20 62 65 20 69 6e 20 74 68 65  eed to be in the
18f60 20 63 61 63 68 65 2e 0a 20 20 20 20 20 20 2a 2a   cache..      **
18f70 20 41 6e 64 20 6e 6f 20 6d 65 6d 6f 72 79 20 61   And no memory a
18f80 6c 6c 6f 63 61 74 69 6f 6e 73 20 61 72 65 20 72  llocations are r
18f90 65 71 75 69 72 65 64 2e 20 20 2a 2f 0a 20 20 20  equired.  */.   
18fa0 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f     if( SQLITE_RO
18fb0 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28  W==sqlite3_step(
18fc0 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20 20  pStmt) ){.      
18fd0 20 20 69 43 6f 6f 6b 69 65 20 3d 20 73 71 6c 69    iCookie = sqli
18fe0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
18ff0 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  Stmt, 0);.      
19000 7d 0a 20 20 20 20 20 20 72 62 75 46 69 6e 61 6c  }.      rbuFinal
19010 69 7a 65 28 70 2c 20 70 53 74 6d 74 29 3b 0a 20  ize(p, pStmt);. 
19020 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e     }.    if( p->
19030 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
19040 0a 20 20 20 20 20 20 72 62 75 4d 50 72 69 6e 74  .      rbuMPrint
19050 66 45 78 65 63 28 70 2c 20 70 2d 3e 64 62 4d 61  fExec(p, p->dbMa
19060 69 6e 2c 20 22 50 52 41 47 4d 41 20 73 63 68 65  in, "PRAGMA sche
19070 6d 61 5f 76 65 72 73 69 6f 6e 20 3d 20 25 64 22  ma_version = %d"
19080 2c 20 69 43 6f 6f 6b 69 65 2b 31 29 3b 0a 20 20  , iCookie+1);.  
19090 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
190a0 20 55 70 64 61 74 65 20 74 68 65 20 63 6f 6e 74   Update the cont
190b0 65 6e 74 73 20 6f 66 20 74 68 65 20 72 62 75 5f  ents of the rbu_
190c0 73 74 61 74 65 20 74 61 62 6c 65 20 77 69 74 68  state table with
190d0 69 6e 20 74 68 65 20 72 62 75 20 64 61 74 61 62  in the rbu datab
190e0 61 73 65 2e 20 54 68 65 0a 2a 2a 20 76 61 6c 75  ase. The.** valu
190f0 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  e stored in the 
19100 52 42 55 5f 53 54 41 54 45 5f 53 54 41 47 45 20  RBU_STATE_STAGE 
19110 63 6f 6c 75 6d 6e 20 69 73 20 65 53 74 61 67 65  column is eStage
19120 2e 20 41 6c 6c 20 6f 74 68 65 72 20 76 61 6c 75  . All other valu
19130 65 73 0a 2a 2a 20 61 72 65 20 64 65 74 65 72 6d  es.** are determ
19140 69 6e 65 64 20 62 79 20 69 6e 73 70 65 63 74 69  ined by inspecti
19150 6e 67 20 74 68 65 20 72 62 75 20 68 61 6e 64 6c  ng the rbu handl
19160 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
19170 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a  first argument..
19180 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
19190 62 75 53 61 76 65 53 74 61 74 65 28 73 71 6c 69  buSaveState(sqli
191a0 74 65 33 72 62 75 20 2a 70 2c 20 69 6e 74 20 65  te3rbu *p, int e
191b0 53 74 61 67 65 29 7b 0a 20 20 69 66 28 20 70 2d  Stage){.  if( p-
191c0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc==SQLITE_OK |
191d0 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  | p->rc==SQLITE_
191e0 44 4f 4e 45 20 29 7b 0a 20 20 20 20 73 71 6c 69  DONE ){.    sqli
191f0 74 65 33 5f 73 74 6d 74 20 2a 70 49 6e 73 65 72  te3_stmt *pInser
19200 74 20 3d 20 30 3b 0a 20 20 20 20 72 62 75 5f 66  t = 0;.    rbu_f
19210 69 6c 65 20 2a 70 46 64 20 3d 20 28 72 62 75 49  ile *pFd = (rbuI
19220 73 56 61 63 75 75 6d 28 70 29 20 3f 20 70 2d 3e  sVacuum(p) ? p->
19230 70 52 62 75 46 64 20 3a 20 70 2d 3e 70 54 61 72  pRbuFd : p->pTar
19240 67 65 74 46 64 29 3b 0a 20 20 20 20 69 6e 74 20  getFd);.    int 
19250 72 63 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  rc;..    assert(
19260 20 70 2d 3e 7a 45 72 72 6d 73 67 3d 3d 30 20 29   p->zErrmsg==0 )
19270 3b 0a 20 20 20 20 72 63 20 3d 20 70 72 65 70 61  ;.    rc = prepa
19280 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74  reFreeAndCollect
19290 45 72 72 6f 72 28 70 2d 3e 64 62 52 62 75 2c 20  Error(p->dbRbu, 
192a0 26 70 49 6e 73 65 72 74 2c 20 26 70 2d 3e 7a 45  &pInsert, &p->zE
192b0 72 72 6d 73 67 2c 20 0a 20 20 20 20 20 20 20 20  rrmsg, .        
192c0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
192d0 0a 20 20 20 20 20 20 20 20 20 20 22 49 4e 53 45  .          "INSE
192e0 52 54 20 4f 52 20 52 45 50 4c 41 43 45 20 49 4e  RT OR REPLACE IN
192f0 54 4f 20 25 73 2e 72 62 75 5f 73 74 61 74 65 28  TO %s.rbu_state(
19300 6b 2c 20 76 29 20 56 41 4c 55 45 53 20 22 0a 20  k, v) VALUES ". 
19310 20 20 20 20 20 20 20 20 20 22 28 25 64 2c 20 25           "(%d, %
19320 64 29 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20  d), ".          
19330 22 28 25 64 2c 20 25 51 29 2c 20 22 0a 20 20 20  "(%d, %Q), ".   
19340 20 20 20 20 20 20 20 22 28 25 64 2c 20 25 51 29         "(%d, %Q)
19350 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 22 28  , ".          "(
19360 25 64 2c 20 25 64 29 2c 20 22 0a 20 20 20 20 20  %d, %d), ".     
19370 20 20 20 20 20 22 28 25 64 2c 20 25 64 29 2c 20       "(%d, %d), 
19380 22 0a 20 20 20 20 20 20 20 20 20 20 22 28 25 64  ".          "(%d
19390 2c 20 25 6c 6c 64 29 2c 20 22 0a 20 20 20 20 20  , %lld), ".     
193a0 20 20 20 20 20 22 28 25 64 2c 20 25 6c 6c 64 29       "(%d, %lld)
193b0 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 22 28  , ".          "(
193c0 25 64 2c 20 25 6c 6c 64 29 2c 20 22 0a 20 20 20  %d, %lld), ".   
193d0 20 20 20 20 20 20 20 22 28 25 64 2c 20 25 6c 6c         "(%d, %ll
193e0 64 29 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20  d), ".          
193f0 22 28 25 64 2c 20 25 51 29 20 20 22 2c 0a 20 20  "(%d, %Q)  ",.  
19400 20 20 20 20 20 20 20 20 70 2d 3e 7a 53 74 61 74          p->zStat
19410 65 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 52  eDb,.          R
19420 42 55 5f 53 54 41 54 45 5f 53 54 41 47 45 2c 20  BU_STATE_STAGE, 
19430 65 53 74 61 67 65 2c 0a 20 20 20 20 20 20 20 20  eStage,.        
19440 20 20 52 42 55 5f 53 54 41 54 45 5f 54 42 4c 2c    RBU_STATE_TBL,
19450 20 70 2d 3e 6f 62 6a 69 74 65 72 2e 7a 54 62 6c   p->objiter.zTbl
19460 2c 20 0a 20 20 20 20 20 20 20 20 20 20 52 42 55  , .          RBU
19470 5f 53 54 41 54 45 5f 49 44 58 2c 20 70 2d 3e 6f  _STATE_IDX, p->o
19480 62 6a 69 74 65 72 2e 7a 49 64 78 2c 20 0a 20 20  bjiter.zIdx, .  
19490 20 20 20 20 20 20 20 20 52 42 55 5f 53 54 41 54          RBU_STAT
194a0 45 5f 52 4f 57 2c 20 70 2d 3e 6e 53 74 65 70 2c  E_ROW, p->nStep,
194b0 20 0a 20 20 20 20 20 20 20 20 20 20 52 42 55 5f   .          RBU_
194c0 53 54 41 54 45 5f 50 52 4f 47 52 45 53 53 2c 20  STATE_PROGRESS, 
194d0 70 2d 3e 6e 50 72 6f 67 72 65 73 73 2c 0a 20 20  p->nProgress,.  
194e0 20 20 20 20 20 20 20 20 52 42 55 5f 53 54 41 54          RBU_STAT
194f0 45 5f 43 4b 50 54 2c 20 70 2d 3e 69 57 61 6c 43  E_CKPT, p->iWalC
19500 6b 73 75 6d 2c 0a 20 20 20 20 20 20 20 20 20 20  ksum,.          
19510 52 42 55 5f 53 54 41 54 45 5f 43 4f 4f 4b 49 45  RBU_STATE_COOKIE
19520 2c 20 28 69 36 34 29 70 46 64 2d 3e 69 43 6f 6f  , (i64)pFd->iCoo
19530 6b 69 65 2c 0a 20 20 20 20 20 20 20 20 20 20 52  kie,.          R
19540 42 55 5f 53 54 41 54 45 5f 4f 41 4c 53 5a 2c 20  BU_STATE_OALSZ, 
19550 70 2d 3e 69 4f 61 6c 53 7a 2c 0a 20 20 20 20 20  p->iOalSz,.     
19560 20 20 20 20 20 52 42 55 5f 53 54 41 54 45 5f 50       RBU_STATE_P
19570 48 41 53 45 4f 4e 45 53 54 45 50 2c 20 70 2d 3e  HASEONESTEP, p->
19580 6e 50 68 61 73 65 4f 6e 65 53 74 65 70 2c 0a 20  nPhaseOneStep,. 
19590 20 20 20 20 20 20 20 20 20 52 42 55 5f 53 54 41           RBU_STA
195a0 54 45 5f 44 41 54 41 54 42 4c 2c 20 70 2d 3e 6f  TE_DATATBL, p->o
195b0 62 6a 69 74 65 72 2e 7a 44 61 74 61 54 62 6c 0a  bjiter.zDataTbl.
195c0 20 20 20 20 20 20 29 0a 20 20 20 20 29 3b 0a 20        ).    );. 
195d0 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 73 65     assert( pInse
195e0 72 74 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c  rt==0 || rc==SQL
195f0 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 69  ITE_OK );..    i
19600 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
19610 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
19620 33 5f 73 74 65 70 28 70 49 6e 73 65 72 74 29 3b  3_step(pInsert);
19630 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
19640 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 49 6e  te3_finalize(pIn
19650 73 65 72 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  sert);.    }.   
19660 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
19670 4f 4b 20 29 20 70 2d 3e 72 63 20 3d 20 72 63 3b  OK ) p->rc = rc;
19680 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  .  }.}.../*.** T
19690 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
196a0 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 69  nt passed to thi
196b0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 74 68  s function is th
196c0 65 20 6e 61 6d 65 20 6f 66 20 61 20 50 52 41 47  e name of a PRAG
196d0 4d 41 20 0a 2a 2a 20 73 65 74 74 69 6e 67 20 2d  MA .** setting -
196e0 20 22 70 61 67 65 5f 73 69 7a 65 22 2c 20 22 61   "page_size", "a
196f0 75 74 6f 5f 76 61 63 75 75 6d 22 2c 20 22 75 73  uto_vacuum", "us
19700 65 72 5f 76 65 72 73 69 6f 6e 22 20 6f 72 20 22  er_version" or "
19710 61 70 70 6c 69 63 61 74 69 6f 6e 5f 69 64 22 2e  application_id".
19720 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
19730 6e 20 65 78 65 63 75 74 65 73 20 74 68 65 20 66  n executes the f
19740 6f 6c 6c 6f 77 69 6e 67 20 6f 6e 20 73 71 6c 69  ollowing on sqli
19750 74 65 33 72 62 75 2e 64 62 52 62 75 3a 0a 2a 2a  te3rbu.dbRbu:.**
19760 0a 2a 2a 20 20 20 22 50 52 41 47 4d 41 20 6d 61  .**   "PRAGMA ma
19770 69 6e 2e 24 7a 50 72 61 67 6d 61 22 0a 2a 2a 0a  in.$zPragma".**.
19780 2a 2a 20 77 68 65 72 65 20 24 7a 50 72 61 67 6d  ** where $zPragm
19790 61 20 69 73 20 74 68 65 20 73 74 72 69 6e 67 20  a is the string 
197a0 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
197b0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20 74  cond argument, t
197c0 68 65 6e 0a 2a 2a 20 6f 6e 20 73 71 6c 69 74 65  hen.** on sqlite
197d0 33 72 62 75 2e 64 62 4d 61 69 6e 3a 0a 2a 2a 0a  3rbu.dbMain:.**.
197e0 2a 2a 20 20 20 22 50 52 41 47 4d 41 20 6d 61 69  **   "PRAGMA mai
197f0 6e 2e 24 7a 50 72 61 67 6d 61 20 3d 20 24 76 61  n.$zPragma = $va
19800 6c 22 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 24  l".**.** where $
19810 76 61 6c 20 69 73 20 74 68 65 20 76 61 6c 75 65  val is the value
19820 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
19830 20 66 69 72 73 74 20 50 52 41 47 4d 41 20 69 6e   first PRAGMA in
19840 76 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  vocation..**.** 
19850 49 6e 20 73 68 6f 72 74 2c 20 69 74 20 63 6f 70  In short, it cop
19860 69 65 73 20 74 68 65 20 76 61 6c 75 65 20 20 6f  ies the value  o
19870 66 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  f the specified 
19880 50 52 41 47 4d 41 20 73 65 74 74 69 6e 67 20 66  PRAGMA setting f
19890 72 6f 6d 0a 2a 2a 20 64 62 52 62 75 20 74 6f 20  rom.** dbRbu to 
198a0 64 62 4d 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69  dbMain..*/.stati
198b0 63 20 76 6f 69 64 20 72 62 75 43 6f 70 79 50 72  c void rbuCopyPr
198c0 61 67 6d 61 28 73 71 6c 69 74 65 33 72 62 75 20  agma(sqlite3rbu 
198d0 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
198e0 7a 50 72 61 67 6d 61 29 7b 0a 20 20 69 66 28 20  zPragma){.  if( 
198f0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
19900 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
19910 73 74 6d 74 20 2a 70 50 72 61 67 6d 61 20 3d 20  stmt *pPragma = 
19920 30 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 70  0;.    p->rc = p
19930 72 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f 6c  repareFreeAndCol
19940 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 52  lectError(p->dbR
19950 62 75 2c 20 26 70 50 72 61 67 6d 61 2c 20 26 70  bu, &pPragma, &p
19960 2d 3e 7a 45 72 72 6d 73 67 2c 20 0a 20 20 20 20  ->zErrmsg, .    
19970 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69      sqlite3_mpri
19980 6e 74 66 28 22 50 52 41 47 4d 41 20 6d 61 69 6e  ntf("PRAGMA main
19990 2e 25 73 22 2c 20 7a 50 72 61 67 6d 61 29 0a 20  .%s", zPragma). 
199a0 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d     );.    if( p-
199b0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
199c0 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71  & SQLITE_ROW==sq
199d0 6c 69 74 65 33 5f 73 74 65 70 28 70 50 72 61 67  lite3_step(pPrag
199e0 6d 61 29 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ma) ){.      p->
199f0 72 63 20 3d 20 72 62 75 4d 50 72 69 6e 74 66 45  rc = rbuMPrintfE
19a00 78 65 63 28 70 2c 20 70 2d 3e 64 62 4d 61 69 6e  xec(p, p->dbMain
19a10 2c 20 22 50 52 41 47 4d 41 20 6d 61 69 6e 2e 25  , "PRAGMA main.%
19a20 73 20 3d 20 25 64 22 2c 0a 20 20 20 20 20 20 20  s = %d",.       
19a30 20 20 20 7a 50 72 61 67 6d 61 2c 20 73 71 6c 69     zPragma, sqli
19a40 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
19a50 50 72 61 67 6d 61 2c 20 30 29 0a 20 20 20 20 20  Pragma, 0).     
19a60 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 62   );.    }.    rb
19a70 75 46 69 6e 61 6c 69 7a 65 28 70 2c 20 70 50 72  uFinalize(p, pPr
19a80 61 67 6d 61 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  agma);.  }.}../*
19a90 0a 2a 2a 20 54 68 65 20 52 42 55 20 68 61 6e 64  .** The RBU hand
19aa0 6c 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  le passed as the
19ab0 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20 68   only argument h
19ac0 61 73 20 6a 75 73 74 20 62 65 65 6e 20 6f 70 65  as just been ope
19ad0 6e 65 64 20 61 6e 64 20 0a 2a 2a 20 74 68 65 20  ned and .** the 
19ae0 73 74 61 74 65 20 64 61 74 61 62 61 73 65 20 69  state database i
19af0 73 20 65 6d 70 74 79 2e 20 49 66 20 74 68 69 73  s empty. If this
19b00 20 52 42 55 20 68 61 6e 64 6c 65 20 77 61 73 20   RBU handle was 
19b10 6f 70 65 6e 65 64 20 66 6f 72 20 61 6e 0a 2a 2a  opened for an.**
19b20 20 52 42 55 20 76 61 63 75 75 6d 20 6f 70 65 72   RBU vacuum oper
19b30 61 74 69 6f 6e 2c 20 63 72 65 61 74 65 20 74 68  ation, create th
19b40 65 20 73 63 68 65 6d 61 20 69 6e 20 74 68 65 20  e schema in the 
19b50 74 61 72 67 65 74 20 64 62 2e 0a 2a 2f 0a 73 74  target db..*/.st
19b60 61 74 69 63 20 76 6f 69 64 20 72 62 75 43 72 65  atic void rbuCre
19b70 61 74 65 54 61 72 67 65 74 53 63 68 65 6d 61 28  ateTargetSchema(
19b80 73 71 6c 69 74 65 33 72 62 75 20 2a 70 29 7b 0a  sqlite3rbu *p){.
19b90 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
19ba0 70 53 71 6c 20 3d 20 30 3b 0a 20 20 73 71 6c 69  pSql = 0;.  sqli
19bb0 74 65 33 5f 73 74 6d 74 20 2a 70 49 6e 73 65 72  te3_stmt *pInser
19bc0 74 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  t = 0;..  assert
19bd0 28 20 72 62 75 49 73 56 61 63 75 75 6d 28 70 29  ( rbuIsVacuum(p)
19be0 20 29 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 73 71   );.  p->rc = sq
19bf0 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62  lite3_exec(p->db
19c00 4d 61 69 6e 2c 20 22 50 52 41 47 4d 41 20 77 72  Main, "PRAGMA wr
19c10 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d 31 22  itable_schema=1"
19c20 2c 20 30 2c 30 2c 20 26 70 2d 3e 7a 45 72 72 6d  , 0,0, &p->zErrm
19c30 73 67 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63  sg);.  if( p->rc
19c40 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
19c50 20 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61     p->rc = prepa
19c60 72 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f  reAndCollectErro
19c70 72 28 70 2d 3e 64 62 52 62 75 2c 20 26 70 53 71  r(p->dbRbu, &pSq
19c80 6c 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 20  l, &p->zErrmsg, 
19c90 0a 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 73  .      "SELECT s
19ca0 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d  ql FROM sqlite_m
19cb0 61 73 74 65 72 20 57 48 45 52 45 20 73 71 6c 21  aster WHERE sql!
19cc0 3d 27 27 20 41 4e 44 20 72 6f 6f 74 70 61 67 65  ='' AND rootpage
19cd0 21 3d 30 22 0a 20 20 20 20 20 20 22 20 41 4e 44  !=0".      " AND
19ce0 20 6e 61 6d 65 21 3d 27 73 71 6c 69 74 65 5f 73   name!='sqlite_s
19cf0 65 71 75 65 6e 63 65 27 20 22 0a 20 20 20 20 20  equence' ".     
19d00 20 22 20 4f 52 44 45 52 20 42 59 20 74 79 70 65   " ORDER BY type
19d10 20 44 45 53 43 22 0a 20 20 20 20 29 3b 0a 20 20   DESC".    );.  
19d20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 72  }..  while( p->r
19d30 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
19d40 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 71  sqlite3_step(pSq
19d50 6c 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  l)==SQLITE_ROW )
19d60 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
19d70 20 2a 7a 53 71 6c 20 3d 20 28 63 6f 6e 73 74 20   *zSql = (const 
19d80 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
19d90 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20  lumn_text(pSql, 
19da0 30 29 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20  0);.    p->rc = 
19db0 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e  sqlite3_exec(p->
19dc0 64 62 4d 61 69 6e 2c 20 7a 53 71 6c 2c 20 30 2c  dbMain, zSql, 0,
19dd0 20 30 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 29   0, &p->zErrmsg)
19de0 3b 0a 20 20 7d 0a 20 20 72 62 75 46 69 6e 61 6c  ;.  }.  rbuFinal
19df0 69 7a 65 28 70 2c 20 70 53 71 6c 29 3b 0a 20 20  ize(p, pSql);.  
19e00 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54  if( p->rc!=SQLIT
19e10 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 3b 0a 0a  E_OK ) return;..
19e20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
19e30 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d  ITE_OK ){.    p-
19e40 3e 72 63 20 3d 20 70 72 65 70 61 72 65 41 6e 64  >rc = prepareAnd
19e50 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e  CollectError(p->
19e60 64 62 52 62 75 2c 20 26 70 53 71 6c 2c 20 26 70  dbRbu, &pSql, &p
19e70 2d 3e 7a 45 72 72 6d 73 67 2c 20 0a 20 20 20 20  ->zErrmsg, .    
19e80 20 20 20 20 22 53 45 4c 45 43 54 20 2a 20 46 52      "SELECT * FR
19e90 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  OM sqlite_master
19ea0 20 57 48 45 52 45 20 72 6f 6f 74 70 61 67 65 3d   WHERE rootpage=
19eb0 30 20 4f 52 20 72 6f 6f 74 70 61 67 65 20 49 53  0 OR rootpage IS
19ec0 20 4e 55 4c 4c 22 20 0a 20 20 20 20 29 3b 0a 20   NULL" .    );. 
19ed0 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d   }..  if( p->rc=
19ee0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
19ef0 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72    p->rc = prepar
19f00 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72  eAndCollectError
19f10 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 70 49 6e  (p->dbMain, &pIn
19f20 73 65 72 74 2c 20 26 70 2d 3e 7a 45 72 72 6d 73  sert, &p->zErrms
19f30 67 2c 20 0a 20 20 20 20 20 20 20 20 22 49 4e 53  g, .        "INS
19f40 45 52 54 20 49 4e 54 4f 20 73 71 6c 69 74 65 5f  ERT INTO sqlite_
19f50 6d 61 73 74 65 72 20 56 41 4c 55 45 53 28 3f 2c  master VALUES(?,
19f60 3f 2c 3f 2c 3f 2c 3f 29 22 0a 20 20 20 20 29 3b  ?,?,?,?)".    );
19f70 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 70  .  }..  while( p
19f80 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
19f90 26 26 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  && sqlite3_step(
19fa0 70 53 71 6c 29 3d 3d 53 51 4c 49 54 45 5f 52 4f  pSql)==SQLITE_RO
19fb0 57 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  W ){.    int i;.
19fc0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 35      for(i=0; i<5
19fd0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
19fe0 6c 69 74 65 33 5f 62 69 6e 64 5f 76 61 6c 75 65  lite3_bind_value
19ff0 28 70 49 6e 73 65 72 74 2c 20 69 2b 31 2c 20 73  (pInsert, i+1, s
1a000 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 76 61  qlite3_column_va
1a010 6c 75 65 28 70 53 71 6c 2c 20 69 29 29 3b 0a 20  lue(pSql, i));. 
1a020 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1a030 5f 73 74 65 70 28 70 49 6e 73 65 72 74 29 3b 0a  _step(pInsert);.
1a040 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69      p->rc = sqli
1a050 74 65 33 5f 72 65 73 65 74 28 70 49 6e 73 65 72  te3_reset(pInser
1a060 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  t);.  }.  if( p-
1a070 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
1a080 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71  {.    p->rc = sq
1a090 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62  lite3_exec(p->db
1a0a0 4d 61 69 6e 2c 20 22 50 52 41 47 4d 41 20 77 72  Main, "PRAGMA wr
1a0b0 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d 30 22  itable_schema=0"
1a0c0 2c 30 2c 30 2c 26 70 2d 3e 7a 45 72 72 6d 73 67  ,0,0,&p->zErrmsg
1a0d0 29 3b 0a 20 20 7d 0a 0a 20 20 72 62 75 46 69 6e  );.  }..  rbuFin
1a0e0 61 6c 69 7a 65 28 70 2c 20 70 53 71 6c 29 3b 0a  alize(p, pSql);.
1a0f0 20 20 72 62 75 46 69 6e 61 6c 69 7a 65 28 70 2c    rbuFinalize(p,
1a100 20 70 49 6e 73 65 72 74 29 3b 0a 7d 0a 0a 2f 2a   pInsert);.}../*
1a110 0a 2a 2a 20 53 74 65 70 20 74 68 65 20 52 42 55  .** Step the RBU
1a120 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 69 6e 74 20   object..*/.int 
1a130 73 71 6c 69 74 65 33 72 62 75 5f 73 74 65 70 28  sqlite3rbu_step(
1a140 73 71 6c 69 74 65 33 72 62 75 20 2a 70 29 7b 0a  sqlite3rbu *p){.
1a150 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 73    if( p ){.    s
1a160 77 69 74 63 68 28 20 70 2d 3e 65 53 74 61 67 65  witch( p->eStage
1a170 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 52   ){.      case R
1a180 42 55 5f 53 54 41 47 45 5f 4f 41 4c 3a 20 7b 0a  BU_STAGE_OAL: {.
1a190 20 20 20 20 20 20 20 20 52 62 75 4f 62 6a 49 74          RbuObjIt
1a1a0 65 72 20 2a 70 49 74 65 72 20 3d 20 26 70 2d 3e  er *pIter = &p->
1a1b0 6f 62 6a 69 74 65 72 3b 0a 0a 20 20 20 20 20 20  objiter;..      
1a1c0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
1a1d0 61 6e 20 52 42 55 20 76 61 63 75 75 6d 20 6f 70  an RBU vacuum op
1a1e0 65 72 61 74 69 6f 6e 20 61 6e 64 20 74 68 65 20  eration and the 
1a1f0 73 74 61 74 65 20 74 61 62 6c 65 20 77 61 73 20  state table was 
1a200 65 6d 70 74 79 0a 20 20 20 20 20 20 20 20 2a 2a  empty.        **
1a210 20 77 68 65 6e 20 74 68 69 73 20 68 61 6e 64 6c   when this handl
1a220 65 20 77 61 73 20 6f 70 65 6e 65 64 2c 20 63 72  e was opened, cr
1a230 65 61 74 65 20 74 68 65 20 74 61 72 67 65 74 20  eate the target 
1a240 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e  database schema.
1a250 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
1a260 72 62 75 49 73 56 61 63 75 75 6d 28 70 29 20 26  rbuIsVacuum(p) &
1a270 26 20 70 2d 3e 6e 50 72 6f 67 72 65 73 73 3d 3d  & p->nProgress==
1a280 30 20 26 26 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  0 && p->rc==SQLI
1a290 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1a2a0 20 20 20 72 62 75 43 72 65 61 74 65 54 61 72 67     rbuCreateTarg
1a2b0 65 74 53 63 68 65 6d 61 28 70 29 3b 0a 20 20 20  etSchema(p);.   
1a2c0 20 20 20 20 20 20 20 72 62 75 43 6f 70 79 50 72         rbuCopyPr
1a2d0 61 67 6d 61 28 70 2c 20 22 75 73 65 72 5f 76 65  agma(p, "user_ve
1a2e0 72 73 69 6f 6e 22 29 3b 0a 20 20 20 20 20 20 20  rsion");.       
1a2f0 20 20 20 72 62 75 43 6f 70 79 50 72 61 67 6d 61     rbuCopyPragma
1a300 28 70 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e  (p, "application
1a310 5f 69 64 22 29 3b 0a 20 20 20 20 20 20 20 20 7d  _id");.        }
1a320 0a 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  ..        while(
1a330 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1a340 4b 20 26 26 20 70 49 74 65 72 2d 3e 7a 54 62 6c  K && pIter->zTbl
1a350 20 29 7b 0a 0a 20 20 20 20 20 20 20 20 20 20 69   ){..          i
1a360 66 28 20 70 49 74 65 72 2d 3e 62 43 6c 65 61 6e  f( pIter->bClean
1a370 75 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  up ){.          
1a380 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 74 68    /* Clean up th
1a390 65 20 72 62 75 5f 74 6d 70 5f 78 78 78 20 74 61  e rbu_tmp_xxx ta
1a3a0 62 6c 65 20 66 6f 72 20 74 68 65 20 70 72 65 76  ble for the prev
1a3b0 69 6f 75 73 20 74 61 62 6c 65 2e 20 49 74 20 0a  ious table. It .
1a3c0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63              ** c
1a3d0 61 6e 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64  annot be dropped
1a3e0 20 61 73 20 74 68 65 72 65 20 61 72 65 20 63 75   as there are cu
1a3f0 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 20 53  rrently active S
1a400 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20  QL statements.. 
1a410 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 42 75             ** Bu
1a420 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 63  t the contents c
1a430 61 6e 20 62 65 20 64 65 6c 65 74 65 64 2e 20 20  an be deleted.  
1a440 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  */.            i
1a450 66 28 20 72 62 75 49 73 56 61 63 75 75 6d 28 70  f( rbuIsVacuum(p
1a460 29 3d 3d 30 20 26 26 20 70 49 74 65 72 2d 3e 61  )==0 && pIter->a
1a470 62 49 6e 64 65 78 65 64 20 29 7b 0a 20 20 20 20  bIndexed ){.    
1a480 20 20 20 20 20 20 20 20 20 20 72 62 75 4d 50 72            rbuMPr
1a490 69 6e 74 66 45 78 65 63 28 70 2c 20 70 2d 3e 64  intfExec(p, p->d
1a4a0 62 52 62 75 2c 20 0a 20 20 20 20 20 20 20 20 20  bRbu, .         
1a4b0 20 20 20 20 20 20 20 20 20 22 44 45 4c 45 54 45           "DELETE
1a4c0 20 46 52 4f 4d 20 25 73 2e 27 72 62 75 5f 74 6d   FROM %s.'rbu_tm
1a4d0 70 5f 25 71 27 22 2c 20 70 2d 3e 7a 53 74 61 74  p_%q'", p->zStat
1a4e0 65 44 62 2c 20 70 49 74 65 72 2d 3e 7a 44 61 74  eDb, pIter->zDat
1a4f0 61 54 62 6c 0a 20 20 20 20 20 20 20 20 20 20 20  aTbl.           
1a500 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20     );.          
1a510 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65    }.          }e
1a520 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
1a530 20 72 62 75 4f 62 6a 49 74 65 72 50 72 65 70 61   rbuObjIterPrepa
1a540 72 65 41 6c 6c 28 70 2c 20 70 49 74 65 72 2c 20  reAll(p, pIter, 
1a550 30 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20  0);..           
1a560 20 2f 2a 20 41 64 76 61 6e 63 65 20 74 6f 20 74   /* Advance to t
1a570 68 65 20 6e 65 78 74 20 72 6f 77 20 74 6f 20 70  he next row to p
1a580 72 6f 63 65 73 73 2e 20 2a 2f 0a 20 20 20 20 20  rocess. */.     
1a590 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63         if( p->rc
1a5a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1a5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74               int
1a5c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74   rc = sqlite3_st
1a5d0 65 70 28 70 49 74 65 72 2d 3e 70 53 65 6c 65 63  ep(pIter->pSelec
1a5e0 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
1a5f0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1a600 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 20 20  _ROW ){.        
1a610 20 20 20 20 20 20 20 20 70 2d 3e 6e 50 72 6f 67          p->nProg
1a620 72 65 73 73 2b 2b 3b 0a 20 20 20 20 20 20 20 20  ress++;.        
1a630 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 74 65 70          p->nStep
1a640 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
1a650 20 20 20 20 72 65 74 75 72 6e 20 72 62 75 53 74      return rbuSt
1a660 65 70 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20  ep(p);.         
1a670 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1a680 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c       p->rc = sql
1a690 69 74 65 33 5f 72 65 73 65 74 28 70 49 74 65 72  ite3_reset(pIter
1a6a0 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  ->pSelect);.    
1a6b0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 74            p->nSt
1a6c0 65 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ep = 0;.        
1a6d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1a6e0 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 72 62 75  }..          rbu
1a6f0 4f 62 6a 49 74 65 72 4e 65 78 74 28 70 2c 20 70  ObjIterNext(p, p
1a700 49 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  Iter);.        }
1a710 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  ..        if( p-
1a720 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
1a730 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
1a740 72 74 28 20 70 49 74 65 72 2d 3e 7a 54 62 6c 3d  rt( pIter->zTbl=
1a750 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
1a760 72 62 75 53 61 76 65 53 74 61 74 65 28 70 2c 20  rbuSaveState(p, 
1a770 52 42 55 5f 53 54 41 47 45 5f 4d 4f 56 45 29 3b  RBU_STAGE_MOVE);
1a780 0a 20 20 20 20 20 20 20 20 20 20 72 62 75 49 6e  .          rbuIn
1a790 63 72 53 63 68 65 6d 61 43 6f 6f 6b 69 65 28 70  crSchemaCookie(p
1a7a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
1a7b0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1a7c0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
1a7d0 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33   p->rc = sqlite3
1a7e0 5f 65 78 65 63 28 70 2d 3e 64 62 4d 61 69 6e 2c  _exec(p->dbMain,
1a7f0 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 2c   "COMMIT", 0, 0,
1a800 20 26 70 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a 20   &p->zErrmsg);. 
1a810 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1a820 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
1a830 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1a840 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d           p->rc =
1a850 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d   sqlite3_exec(p-
1a860 3e 64 62 52 62 75 2c 20 22 43 4f 4d 4d 49 54 22  >dbRbu, "COMMIT"
1a870 2c 20 30 2c 20 30 2c 20 26 70 2d 3e 7a 45 72 72  , 0, 0, &p->zErr
1a880 6d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  msg);.          
1a890 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 65  }.          p->e
1a8a0 53 74 61 67 65 20 3d 20 52 42 55 5f 53 54 41 47  Stage = RBU_STAG
1a8b0 45 5f 4d 4f 56 45 3b 0a 20 20 20 20 20 20 20 20  E_MOVE;.        
1a8c0 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  }.        break;
1a8d0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
1a8e0 63 61 73 65 20 52 42 55 5f 53 54 41 47 45 5f 4d  case RBU_STAGE_M
1a8f0 4f 56 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 69  OVE: {.        i
1a900 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
1a910 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1a920 20 72 62 75 4d 6f 76 65 4f 61 6c 46 69 6c 65 28   rbuMoveOalFile(
1a930 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d  p);.          p-
1a940 3e 6e 50 72 6f 67 72 65 73 73 2b 2b 3b 0a 20 20  >nProgress++;.  
1a950 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1a960 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a  break;.      }..
1a970 20 20 20 20 20 20 63 61 73 65 20 52 42 55 5f 53        case RBU_S
1a980 54 41 47 45 5f 43 4b 50 54 3a 20 7b 0a 20 20 20  TAGE_CKPT: {.   
1a990 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
1a9a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1a9b0 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 53         if( p->nS
1a9c0 74 65 70 3e 3d 70 2d 3e 6e 46 72 61 6d 65 20 29  tep>=p->nFrame )
1a9d0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
1a9e0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 44 62 20  lite3_file *pDb 
1a9f0 3d 20 70 2d 3e 70 54 61 72 67 65 74 46 64 2d 3e  = p->pTargetFd->
1aa00 70 52 65 61 6c 3b 0a 20 20 0a 20 20 20 20 20 20  pReal;.  .      
1aa10 20 20 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68        /* Sync th
1aa20 65 20 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20 20  e db file */.   
1aa30 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d           p->rc =
1aa40 20 70 44 62 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e   pDb->pMethods->
1aa50 78 53 79 6e 63 28 70 44 62 2c 20 53 51 4c 49 54  xSync(pDb, SQLIT
1aa60 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a  E_SYNC_NORMAL);.
1aa70 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f    .            /
1aa80 2a 20 55 70 64 61 74 65 20 6e 42 61 63 6b 66 69  * Update nBackfi
1aa90 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ll */.          
1aaa0 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
1aab0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1aac0 20 20 20 20 20 20 20 20 76 6f 69 64 20 76 6f 6c          void vol
1aad0 61 74 69 6c 65 20 2a 70 74 72 3b 0a 20 20 20 20  atile *ptr;.    
1aae0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20            p->rc 
1aaf0 3d 20 70 44 62 2d 3e 70 4d 65 74 68 6f 64 73 2d  = pDb->pMethods-
1ab00 3e 78 53 68 6d 4d 61 70 28 70 44 62 2c 20 30 2c  >xShmMap(pDb, 0,
1ab10 20 33 32 2a 31 30 32 34 2c 20 30 2c 20 26 70 74   32*1024, 0, &pt
1ab20 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  r);.            
1ab30 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
1ab40 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1ab50 20 20 20 20 20 20 20 20 20 20 28 28 75 33 32 20            ((u32 
1ab60 76 6f 6c 61 74 69 6c 65 2a 29 70 74 72 29 5b 32  volatile*)ptr)[2
1ab70 34 5d 20 3d 20 70 2d 3e 69 4d 61 78 46 72 61 6d  4] = p->iMaxFram
1ab80 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
1ab90 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
1aba0 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  .  .            
1abb0 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
1abc0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1abd0 20 20 20 20 20 20 70 2d 3e 65 53 74 61 67 65 20        p->eStage 
1abe0 3d 20 52 42 55 5f 53 54 41 47 45 5f 44 4f 4e 45  = RBU_STAGE_DONE
1abf0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1ac00 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 44  p->rc = SQLITE_D
1ac10 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ONE;.           
1ac20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c   }.          }el
1ac30 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
1ac40 2f 2a 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20  /* At one point 
1ac50 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c  the following bl
1ac60 6f 63 6b 20 63 6f 70 69 65 64 20 61 20 73 69 6e  ock copied a sin
1ac70 67 6c 65 20 66 72 61 6d 65 20 66 72 6f 6d 20 74  gle frame from t
1ac80 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  he.            *
1ac90 2a 20 77 61 6c 20 66 69 6c 65 20 74 6f 20 74 68  * wal file to th
1aca0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1acb0 20 53 6f 20 74 68 61 74 20 6f 6e 65 20 63 61 6c   So that one cal
1acc0 6c 20 74 6f 20 73 71 6c 69 74 65 33 72 62 75 5f  l to sqlite3rbu_
1acd0 73 74 65 70 28 29 0a 20 20 20 20 20 20 20 20 20  step().         
1ace0 20 20 20 2a 2a 20 63 68 65 63 6b 70 6f 69 6e 74     ** checkpoint
1acf0 65 64 20 61 20 73 69 6e 67 6c 65 20 66 72 61 6d  ed a single fram
1ad00 65 2e 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  e. .            
1ad10 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  **.            *
1ad20 2a 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68  * However, if th
1ad30 65 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 69 73  e sector-size is
1ad40 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
1ad50 20 70 61 67 65 2d 73 69 7a 65 2c 20 61 6e 64 20   page-size, and 
1ad60 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  the.            
1ad70 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 63  ** application c
1ad80 61 6c 6c 73 20 73 71 6c 69 74 65 33 72 62 75 5f  alls sqlite3rbu_
1ad90 73 61 76 65 73 74 61 74 65 28 29 20 6f 72 20 63  savestate() or c
1ada0 6c 6f 73 65 28 29 20 69 6d 6d 65 64 69 61 74 65  lose() immediate
1adb0 6c 79 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  ly.            *
1adc0 2a 20 61 66 74 65 72 20 74 68 69 73 20 73 74 65  * after this ste
1add0 70 2c 20 74 68 65 6e 20 72 62 75 5f 73 74 65 70  p, then rbu_step
1ade0 28 29 20 61 67 61 69 6e 2c 20 74 68 65 6e 20 61  () again, then a
1adf0 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f   power failure o
1ae00 63 63 75 72 73 2c 0a 20 20 20 20 20 20 20 20 20  ccurs,.         
1ae10 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 64     ** then the d
1ae20 61 74 61 62 61 73 65 20 70 61 67 65 20 77 72 69  atabase page wri
1ae30 74 74 65 6e 20 68 65 72 65 20 6d 61 79 20 62 65  tten here may be
1ae40 20 64 61 6d 61 67 65 64 2e 20 57 6f 72 6b 20 61   damaged. Work a
1ae50 72 6f 75 6e 64 0a 20 20 20 20 20 20 20 20 20 20  round.          
1ae60 20 20 2a 2a 20 74 68 69 73 20 62 79 20 63 68 65    ** this by che
1ae70 63 6b 70 6f 69 6e 74 69 6e 67 20 66 72 61 6d 65  ckpointing frame
1ae80 73 20 75 6e 74 69 6c 20 74 68 65 20 6e 65 78 74  s until the next
1ae90 20 70 61 67 65 20 69 6e 20 74 68 65 20 61 46 72   page in the aFr
1aea0 61 6d 65 5b 5d 0a 20 20 20 20 20 20 20 20 20 20  ame[].          
1aeb0 20 20 2a 2a 20 6c 69 65 73 20 6f 6e 20 61 20 64    ** lies on a d
1aec0 69 66 66 65 72 65 6e 74 20 64 69 73 6b 20 73 65  ifferent disk se
1aed0 63 74 6f 72 20 74 6f 20 74 68 65 20 63 75 72 72  ctor to the curr
1aee0 65 6e 74 20 6f 6e 65 2e 20 2a 2f 0a 20 20 20 20  ent one. */.    
1aef0 20 20 20 20 20 20 20 20 75 33 32 20 69 53 65 63          u32 iSec
1af00 74 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  tor;.           
1af10 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 20 20 20   do{.           
1af20 20 20 20 52 62 75 46 72 61 6d 65 20 2a 70 46 72     RbuFrame *pFr
1af30 61 6d 65 20 3d 20 26 70 2d 3e 61 46 72 61 6d 65  ame = &p->aFrame
1af40 5b 70 2d 3e 6e 53 74 65 70 5d 3b 0a 20 20 20 20  [p->nStep];.    
1af50 20 20 20 20 20 20 20 20 20 20 69 53 65 63 74 6f            iSecto
1af60 72 20 3d 20 28 70 46 72 61 6d 65 2d 3e 69 44 62  r = (pFrame->iDb
1af70 50 61 67 65 2d 31 29 20 2f 20 70 2d 3e 6e 50 61  Page-1) / p->nPa
1af80 67 65 50 65 72 53 65 63 74 6f 72 3b 0a 20 20 20  gePerSector;.   
1af90 20 20 20 20 20 20 20 20 20 20 20 72 62 75 43 68             rbuCh
1afa0 65 63 6b 70 6f 69 6e 74 46 72 61 6d 65 28 70 2c  eckpointFrame(p,
1afb0 20 70 46 72 61 6d 65 29 3b 0a 20 20 20 20 20 20   pFrame);.      
1afc0 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 74 65 70          p->nStep
1afd0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
1afe0 7d 77 68 69 6c 65 28 20 70 2d 3e 6e 53 74 65 70  }while( p->nStep
1aff0 3c 70 2d 3e 6e 46 72 61 6d 65 20 0a 20 20 20 20  <p->nFrame .    
1b000 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
1b010 69 53 65 63 74 6f 72 3d 3d 28 28 70 2d 3e 61 46  iSector==((p->aF
1b020 72 61 6d 65 5b 70 2d 3e 6e 53 74 65 70 5d 2e 69  rame[p->nStep].i
1b030 44 62 50 61 67 65 2d 31 29 20 2f 20 70 2d 3e 6e  DbPage-1) / p->n
1b040 50 61 67 65 50 65 72 53 65 63 74 6f 72 29 0a 20  PagePerSector). 
1b050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b060 26 26 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  && p->rc==SQLITE
1b070 5f 4f 4b 0a 20 20 20 20 20 20 20 20 20 20 20 20  _OK.            
1b080 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
1b090 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 50 72 6f           p->nPro
1b0a0 67 72 65 73 73 2b 2b 3b 0a 20 20 20 20 20 20 20  gress++;.       
1b0b0 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b   }.        break
1b0c0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
1b0d0 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
1b0e0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1b0f0 20 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 3b     return p->rc;
1b100 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
1b110 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
1b120 4d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  M;.  }.}../*.** 
1b130 43 6f 6d 70 61 72 65 20 73 74 72 69 6e 67 73 20  Compare strings 
1b140 7a 31 20 61 6e 64 20 7a 32 2c 20 72 65 74 75 72  z1 and z2, retur
1b150 6e 69 6e 67 20 30 20 69 66 20 74 68 65 79 20 61  ning 0 if they a
1b160 72 65 20 69 64 65 6e 74 69 63 61 6c 2c 20 6f 72  re identical, or
1b170 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 6f 74 68   non-zero.** oth
1b180 65 72 77 69 73 65 2e 20 45 69 74 68 65 72 20 6f  erwise. Either o
1b190 72 20 62 6f 74 68 20 61 72 67 75 6d 65 6e 74 20  r both argument 
1b1a0 6d 61 79 20 62 65 20 4e 55 4c 4c 2e 20 54 77 6f  may be NULL. Two
1b1b0 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61 72 65   NULL values are
1b1c0 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 65  .** considered e
1b1d0 71 75 61 6c 2c 20 61 6e 64 20 4e 55 4c 4c 20 69  qual, and NULL i
1b1e0 73 20 63 6f 6e 73 69 64 65 72 65 64 20 64 69 73  s considered dis
1b1f0 74 69 6e 63 74 20 66 72 6f 6d 20 61 6c 6c 20 6f  tinct from all o
1b200 74 68 65 72 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a  ther values..*/.
1b210 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 53 74  static int rbuSt
1b220 72 43 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20 63  rCompare(const c
1b230 68 61 72 20 2a 7a 31 2c 20 63 6f 6e 73 74 20 63  har *z1, const c
1b240 68 61 72 20 2a 7a 32 29 7b 0a 20 20 69 66 28 20  har *z2){.  if( 
1b250 7a 31 3d 3d 30 20 26 26 20 7a 32 3d 3d 30 20 29  z1==0 && z2==0 )
1b260 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
1b270 20 7a 31 3d 3d 30 20 7c 7c 20 7a 32 3d 3d 30 20   z1==0 || z2==0 
1b280 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65  ) return 1;.  re
1b290 74 75 72 6e 20 28 73 71 6c 69 74 65 33 5f 73 74  turn (sqlite3_st
1b2a0 72 69 63 6d 70 28 7a 31 2c 20 7a 32 29 21 3d 30  ricmp(z1, z2)!=0
1b2b0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
1b2c0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
1b2d0 6c 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 73  led as part of s
1b2e0 71 6c 69 74 65 33 72 62 75 5f 6f 70 65 6e 28 29  qlite3rbu_open()
1b2f0 20 77 68 65 6e 20 69 6e 69 74 69 61 6c 69 7a 69   when initializi
1b300 6e 67 0a 2a 2a 20 61 6e 20 72 62 75 20 68 61 6e  ng.** an rbu han
1b310 64 6c 65 20 69 6e 20 4f 41 4c 20 73 74 61 67 65  dle in OAL stage
1b320 2e 20 49 66 20 74 68 65 20 72 62 75 20 75 70 64  . If the rbu upd
1b330 61 74 65 20 68 61 73 20 6e 6f 74 20 73 74 61 72  ate has not star
1b340 74 65 64 20 28 69 2e 65 2e 0a 2a 2a 20 74 68 65  ted (i.e..** the
1b350 20 72 62 75 5f 73 74 61 74 65 20 74 61 62 6c 65   rbu_state table
1b360 20 77 61 73 20 65 6d 70 74 79 29 20 69 74 20 69   was empty) it i
1b370 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72  s a no-op. Other
1b380 77 69 73 65 2c 20 69 74 20 61 72 72 61 6e 67 65  wise, it arrange
1b390 73 0a 2a 2a 20 74 68 69 6e 67 73 20 73 6f 20 74  s.** things so t
1b3a0 68 61 74 20 74 68 65 20 6e 65 78 74 20 63 61 6c  hat the next cal
1b3b0 6c 20 74 6f 20 73 71 6c 69 74 65 33 72 62 75 5f  l to sqlite3rbu_
1b3c0 73 74 65 70 28 29 20 63 6f 6e 74 69 6e 75 65 73  step() continues
1b3d0 20 6f 6e 20 66 72 6f 6d 0a 2a 2a 20 77 68 65 72   on from.** wher
1b3e0 65 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 72  e the previous r
1b3f0 62 75 20 68 61 6e 64 6c 65 20 6c 65 66 74 20 6f  bu handle left o
1b400 66 66 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ff..**.** If an 
1b410 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e  error occurs, an
1b420 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20   error code and 
1b430 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 61 72  error message ar
1b440 65 20 6c 65 66 74 20 69 6e 20 74 68 65 0a 2a 2a  e left in the.**
1b450 20 72 62 75 20 68 61 6e 64 6c 65 20 70 61 73 73   rbu handle pass
1b460 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
1b470 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61  argument..*/.sta
1b480 74 69 63 20 76 6f 69 64 20 72 62 75 53 65 74 75  tic void rbuSetu
1b490 70 4f 61 6c 28 73 71 6c 69 74 65 33 72 62 75 20  pOal(sqlite3rbu 
1b4a0 2a 70 2c 20 52 62 75 53 74 61 74 65 20 2a 70 53  *p, RbuState *pS
1b4b0 74 61 74 65 29 7b 0a 20 20 61 73 73 65 72 74 28  tate){.  assert(
1b4c0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1b4d0 4b 20 29 3b 0a 20 20 69 66 28 20 70 53 74 61 74  K );.  if( pStat
1b4e0 65 2d 3e 7a 54 62 6c 20 29 7b 0a 20 20 20 20 52  e->zTbl ){.    R
1b4f0 62 75 4f 62 6a 49 74 65 72 20 2a 70 49 74 65 72  buObjIter *pIter
1b500 20 3d 20 26 70 2d 3e 6f 62 6a 69 74 65 72 3b 0a   = &p->objiter;.
1b510 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c      int rc = SQL
1b520 49 54 45 5f 4f 4b 3b 0a 0a 20 20 20 20 77 68 69  ITE_OK;..    whi
1b530 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
1b540 4b 20 26 26 20 70 49 74 65 72 2d 3e 7a 54 62 6c  K && pIter->zTbl
1b550 20 26 26 20 28 70 49 74 65 72 2d 3e 62 43 6c 65   && (pIter->bCle
1b560 61 6e 75 70 20 0a 20 20 20 20 20 20 20 7c 7c 20  anup .       || 
1b570 72 62 75 53 74 72 43 6f 6d 70 61 72 65 28 70 49  rbuStrCompare(pI
1b580 74 65 72 2d 3e 7a 49 64 78 2c 20 70 53 74 61 74  ter->zIdx, pStat
1b590 65 2d 3e 7a 49 64 78 29 0a 20 20 20 20 20 20 20  e->zIdx).       
1b5a0 7c 7c 20 28 70 53 74 61 74 65 2d 3e 7a 44 61 74  || (pState->zDat
1b5b0 61 54 62 6c 3d 3d 30 20 26 26 20 72 62 75 53 74  aTbl==0 && rbuSt
1b5c0 72 43 6f 6d 70 61 72 65 28 70 49 74 65 72 2d 3e  rCompare(pIter->
1b5d0 7a 54 62 6c 2c 20 70 53 74 61 74 65 2d 3e 7a 54  zTbl, pState->zT
1b5e0 62 6c 29 29 0a 20 20 20 20 20 20 20 7c 7c 20 28  bl)).       || (
1b5f0 70 53 74 61 74 65 2d 3e 7a 44 61 74 61 54 62 6c  pState->zDataTbl
1b600 20 26 26 20 72 62 75 53 74 72 43 6f 6d 70 61 72   && rbuStrCompar
1b610 65 28 70 49 74 65 72 2d 3e 7a 44 61 74 61 54 62  e(pIter->zDataTb
1b620 6c 2c 20 70 53 74 61 74 65 2d 3e 7a 44 61 74 61  l, pState->zData
1b630 54 62 6c 29 29 0a 20 20 20 20 29 29 7b 0a 20 20  Tbl)).    )){.  
1b640 20 20 20 20 72 63 20 3d 20 72 62 75 4f 62 6a 49      rc = rbuObjI
1b650 74 65 72 4e 65 78 74 28 70 2c 20 70 49 74 65 72  terNext(p, pIter
1b660 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
1b670 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1b680 26 26 20 21 70 49 74 65 72 2d 3e 7a 54 62 6c 20  && !pIter->zTbl 
1b690 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
1b6a0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
1b6b0 20 20 70 2d 3e 7a 45 72 72 6d 73 67 20 3d 20 73    p->zErrmsg = s
1b6c0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
1b6d0 72 62 75 5f 73 74 61 74 65 20 6d 69 73 6d 61 74  rbu_state mismat
1b6e0 63 68 20 65 72 72 6f 72 22 29 3b 0a 20 20 20 20  ch error");.    
1b6f0 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  }..    if( rc==S
1b700 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1b710 20 20 70 2d 3e 6e 53 74 65 70 20 3d 20 70 53 74    p->nStep = pSt
1b720 61 74 65 2d 3e 6e 52 6f 77 3b 0a 20 20 20 20 20  ate->nRow;.     
1b730 20 72 63 20 3d 20 72 62 75 4f 62 6a 49 74 65 72   rc = rbuObjIter
1b740 50 72 65 70 61 72 65 41 6c 6c 28 70 2c 20 26 70  PrepareAll(p, &p
1b750 2d 3e 6f 62 6a 69 74 65 72 2c 20 70 2d 3e 6e 53  ->objiter, p->nS
1b760 74 65 70 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  tep);.    }..   
1b770 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 7d   p->rc = rc;.  }
1b780 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
1b790 72 65 20 69 73 20 61 20 22 2a 2d 6f 61 6c 22 20  re is a "*-oal" 
1b7a0 66 69 6c 65 20 69 6e 20 74 68 65 20 66 69 6c 65  file in the file
1b7b0 2d 73 79 73 74 65 6d 20 63 6f 72 72 65 73 70 6f  -system correspo
1b7c0 6e 64 69 6e 67 20 74 6f 20 74 68 65 0a 2a 2a 20  nding to the.** 
1b7d0 74 61 72 67 65 74 20 64 61 74 61 62 61 73 65 20  target database 
1b7e0 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  in the file-syst
1b7f0 65 6d 2c 20 64 65 6c 65 74 65 20 69 74 2e 20 49  em, delete it. I
1b800 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
1b810 73 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65  s,.** leave an e
1b820 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 65 72  rror code and er
1b830 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 74  ror message in t
1b840 68 65 20 72 62 75 20 68 61 6e 64 6c 65 2e 0a 2a  he rbu handle..*
1b850 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62  /.static void rb
1b860 75 44 65 6c 65 74 65 4f 61 6c 46 69 6c 65 28 73  uDeleteOalFile(s
1b870 71 6c 69 74 65 33 72 62 75 20 2a 70 29 7b 0a 20  qlite3rbu *p){. 
1b880 20 63 68 61 72 20 2a 7a 4f 61 6c 20 3d 20 72 62   char *zOal = rb
1b890 75 4d 50 72 69 6e 74 66 28 70 2c 20 22 25 73 2d  uMPrintf(p, "%s-
1b8a0 6f 61 6c 22 2c 20 70 2d 3e 7a 54 61 72 67 65 74  oal", p->zTarget
1b8b0 29 3b 0a 20 20 69 66 28 20 7a 4f 61 6c 20 29 7b  );.  if( zOal ){
1b8c0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73  .    sqlite3_vfs
1b8d0 20 2a 70 56 66 73 20 3d 20 73 71 6c 69 74 65 33   *pVfs = sqlite3
1b8e0 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20  _vfs_find(0);.  
1b8f0 20 20 61 73 73 65 72 74 28 20 70 56 66 73 20 26    assert( pVfs &
1b900 26 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  & p->rc==SQLITE_
1b910 4f 4b 20 26 26 20 70 2d 3e 7a 45 72 72 6d 73 67  OK && p->zErrmsg
1b920 3d 3d 30 20 29 3b 0a 20 20 20 20 70 56 66 73 2d  ==0 );.    pVfs-
1b930 3e 78 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a  >xDelete(pVfs, z
1b940 4f 61 6c 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  Oal, 0);.    sql
1b950 69 74 65 33 5f 66 72 65 65 28 7a 4f 61 6c 29 3b  ite3_free(zOal);
1b960 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  .  }.}../*.** Al
1b970 6c 6f 63 61 74 65 20 61 20 70 72 69 76 61 74 65  locate a private
1b980 20 72 62 75 20 56 46 53 20 66 6f 72 20 74 68 65   rbu VFS for the
1b990 20 72 62 75 20 68 61 6e 64 6c 65 20 70 61 73 73   rbu handle pass
1b9a0 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 0a 2a  ed as the only.*
1b9b0 2a 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 69 73  * argument. This
1b9c0 20 56 46 53 20 77 69 6c 6c 20 62 65 20 75 73 65   VFS will be use
1b9d0 64 20 75 6e 6c 65 73 73 20 74 68 65 20 63 61 6c  d unless the cal
1b9e0 6c 20 74 6f 20 73 71 6c 69 74 65 33 72 62 75 5f  l to sqlite3rbu_
1b9f0 6f 70 65 6e 28 29 0a 2a 2a 20 73 70 65 63 69 66  open().** specif
1ba00 69 65 64 20 61 20 55 52 49 20 77 69 74 68 20 61  ied a URI with a
1ba10 20 76 66 73 3d 3f 20 6f 70 74 69 6f 6e 20 69 6e   vfs=? option in
1ba20 20 70 6c 61 63 65 20 6f 66 20 61 20 74 61 72 67   place of a targ
1ba30 65 74 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66  et database.** f
1ba40 69 6c 65 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61  ile name..*/.sta
1ba50 74 69 63 20 76 6f 69 64 20 72 62 75 43 72 65 61  tic void rbuCrea
1ba60 74 65 56 66 73 28 73 71 6c 69 74 65 33 72 62 75  teVfs(sqlite3rbu
1ba70 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 6e 64 3b   *p){.  int rnd;
1ba80 0a 20 20 63 68 61 72 20 7a 52 6e 64 5b 36 34 5d  .  char zRnd[64]
1ba90 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ;..  assert( p->
1baa0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
1bab0 0a 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f  .  sqlite3_rando
1bac0 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 69 6e 74  mness(sizeof(int
1bad0 29 2c 20 28 76 6f 69 64 2a 29 26 72 6e 64 29 3b  ), (void*)&rnd);
1bae0 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
1baf0 6e 74 66 28 73 69 7a 65 6f 66 28 7a 52 6e 64 29  ntf(sizeof(zRnd)
1bb00 2c 20 7a 52 6e 64 2c 20 22 72 62 75 5f 76 66 73  , zRnd, "rbu_vfs
1bb10 5f 25 64 22 2c 20 72 6e 64 29 3b 0a 20 20 70 2d  _%d", rnd);.  p-
1bb20 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 72 62 75  >rc = sqlite3rbu
1bb30 5f 63 72 65 61 74 65 5f 76 66 73 28 7a 52 6e 64  _create_vfs(zRnd
1bb40 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72  , 0);.  if( p->r
1bb50 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1bb60 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20      sqlite3_vfs 
1bb70 2a 70 56 66 73 20 3d 20 73 71 6c 69 74 65 33 5f  *pVfs = sqlite3_
1bb80 76 66 73 5f 66 69 6e 64 28 7a 52 6e 64 29 3b 0a  vfs_find(zRnd);.
1bb90 20 20 20 20 61 73 73 65 72 74 28 20 70 56 66 73      assert( pVfs
1bba0 20 29 3b 0a 20 20 20 20 70 2d 3e 7a 56 66 73 4e   );.    p->zVfsN
1bbb0 61 6d 65 20 3d 20 70 56 66 73 2d 3e 7a 4e 61 6d  ame = pVfs->zNam
1bbc0 65 3b 0a 20 20 20 20 28 28 72 62 75 5f 76 66 73  e;.    ((rbu_vfs
1bbd0 2a 29 70 56 66 73 29 2d 3e 70 52 62 75 20 3d 20  *)pVfs)->pRbu = 
1bbe0 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  p;.  }.}../*.** 
1bbf0 44 65 73 74 72 6f 79 20 74 68 65 20 70 72 69 76  Destroy the priv
1bc00 61 74 65 20 56 46 53 20 63 72 65 61 74 65 64 20  ate VFS created 
1bc10 66 6f 72 20 74 68 65 20 72 62 75 20 68 61 6e 64  for the rbu hand
1bc20 6c 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  le passed as the
1bc30 20 6f 6e 6c 79 0a 2a 2a 20 61 72 67 75 6d 65 6e   only.** argumen
1bc40 74 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20  t by an earlier 
1bc50 63 61 6c 6c 20 74 6f 20 72 62 75 43 72 65 61 74  call to rbuCreat
1bc60 65 56 66 73 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  eVfs()..*/.stati
1bc70 63 20 76 6f 69 64 20 72 62 75 44 65 6c 65 74 65  c void rbuDelete
1bc80 56 66 73 28 73 71 6c 69 74 65 33 72 62 75 20 2a  Vfs(sqlite3rbu *
1bc90 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 7a 56 66  p){.  if( p->zVf
1bca0 73 4e 61 6d 65 20 29 7b 0a 20 20 20 20 73 71 6c  sName ){.    sql
1bcb0 69 74 65 33 72 62 75 5f 64 65 73 74 72 6f 79 5f  ite3rbu_destroy_
1bcc0 76 66 73 28 70 2d 3e 7a 56 66 73 4e 61 6d 65 29  vfs(p->zVfsName)
1bcd0 3b 0a 20 20 20 20 70 2d 3e 7a 56 66 73 4e 61 6d  ;.    p->zVfsNam
1bce0 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  e = 0;.  }.}../*
1bcf0 0a 2a 2a 20 54 68 69 73 20 75 73 65 72 2d 64 65  .** This user-de
1bd00 66 69 6e 65 64 20 53 51 4c 20 66 75 6e 63 74 69  fined SQL functi
1bd10 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 77 69  on is invoked wi
1bd20 74 68 20 61 20 73 69 6e 67 6c 65 20 61 72 67 75  th a single argu
1bd30 6d 65 6e 74 20 2d 20 74 68 65 0a 2a 2a 20 6e 61  ment - the.** na
1bd40 6d 65 20 6f 66 20 61 20 74 61 62 6c 65 20 65 78  me of a table ex
1bd50 70 65 63 74 65 64 20 74 6f 20 61 70 70 65 61 72  pected to appear
1bd60 20 69 6e 20 74 68 65 20 74 61 72 67 65 74 20 64   in the target d
1bd70 61 74 61 62 61 73 65 2e 20 49 74 20 72 65 74 75  atabase. It retu
1bd80 72 6e 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65  rns.** the numbe
1bd90 72 20 6f 66 20 61 75 78 69 6c 6c 69 61 72 79 20  r of auxilliary 
1bda0 69 6e 64 65 78 65 73 20 6f 6e 20 74 68 65 20 74  indexes on the t
1bdb0 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
1bdc0 76 6f 69 64 20 72 62 75 49 6e 64 65 78 43 6e 74  void rbuIndexCnt
1bdd0 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
1bde0 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a  context *pCtx, .
1bdf0 20 20 69 6e 74 20 6e 56 61 6c 2c 0a 20 20 73 71    int nVal,.  sq
1be00 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70  lite3_value **ap
1be10 56 61 6c 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  Val.){.  sqlite3
1be20 72 62 75 20 2a 70 20 3d 20 28 73 71 6c 69 74 65  rbu *p = (sqlite
1be30 33 72 62 75 2a 29 73 71 6c 69 74 65 33 5f 75 73  3rbu*)sqlite3_us
1be40 65 72 5f 64 61 74 61 28 70 43 74 78 29 3b 0a 20  er_data(pCtx);. 
1be50 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
1be60 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61 72  Stmt = 0;.  char
1be70 20 2a 7a 45 72 72 6d 73 67 20 3d 20 30 3b 0a 20   *zErrmsg = 0;. 
1be80 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
1be90 72 74 28 20 6e 56 61 6c 3d 3d 31 20 29 3b 0a 20  rt( nVal==1 );. 
1bea0 20 0a 20 20 72 63 20 3d 20 70 72 65 70 61 72 65   .  rc = prepare
1beb0 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72  FreeAndCollectEr
1bec0 72 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 26  ror(p->dbMain, &
1bed0 70 53 74 6d 74 2c 20 26 7a 45 72 72 6d 73 67 2c  pStmt, &zErrmsg,
1bee0 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f   .      sqlite3_
1bef0 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20  mprintf("SELECT 
1bf00 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 73 71  count(*) FROM sq
1bf10 6c 69 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20  lite_master ".  
1bf20 20 20 20 20 20 20 22 57 48 45 52 45 20 74 79 70        "WHERE typ
1bf30 65 3d 27 69 6e 64 65 78 27 20 41 4e 44 20 74 62  e='index' AND tb
1bf40 6c 5f 6e 61 6d 65 20 3d 20 25 51 22 2c 20 73 71  l_name = %Q", sq
1bf50 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
1bf60 28 61 70 56 61 6c 5b 30 5d 29 29 0a 20 20 29 3b  (apVal[0])).  );
1bf70 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
1bf80 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
1bf90 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
1bfa0 28 70 43 74 78 2c 20 7a 45 72 72 6d 73 67 2c 20  (pCtx, zErrmsg, 
1bfb0 2d 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  -1);.  }else{.  
1bfc0 20 20 69 6e 74 20 6e 49 6e 64 65 78 20 3d 20 30    int nIndex = 0
1bfd0 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  ;.    if( SQLITE
1bfe0 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74  _ROW==sqlite3_st
1bff0 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20  ep(pStmt) ){.   
1c000 20 20 20 6e 49 6e 64 65 78 20 3d 20 73 71 6c 69     nIndex = sqli
1c010 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
1c020 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  Stmt, 0);.    }.
1c030 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1c040 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
1c050 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
1c060 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1c070 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
1c080 69 6e 74 28 70 43 74 78 2c 20 6e 49 6e 64 65 78  int(pCtx, nIndex
1c090 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1c0a0 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
1c0b0 6c 74 5f 65 72 72 6f 72 28 70 43 74 78 2c 20 73  lt_error(pCtx, s
1c0c0 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d  qlite3_errmsg(p-
1c0d0 3e 64 62 4d 61 69 6e 29 2c 20 2d 31 29 3b 0a 20  >dbMain), -1);. 
1c0e0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69     }.  }..  sqli
1c0f0 74 65 33 5f 66 72 65 65 28 7a 45 72 72 6d 73 67  te3_free(zErrmsg
1c100 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  );.}../*.** If t
1c110 68 65 20 52 42 55 20 64 61 74 61 62 61 73 65 20  he RBU database 
1c120 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 72 62 75  contains the rbu
1c130 5f 63 6f 75 6e 74 20 74 61 62 6c 65 2c 20 75 73  _count table, us
1c140 65 20 69 74 20 74 6f 20 69 6e 69 74 69 61 6c 69  e it to initiali
1c150 7a 65 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65  ze.** the sqlite
1c160 33 72 62 75 2e 6e 50 68 61 73 65 4f 6e 65 53 74  3rbu.nPhaseOneSt
1c170 65 70 20 76 61 72 69 61 62 6c 65 2e 20 54 68 65  ep variable. The
1c180 20 73 63 68 65 6d 61 20 6f 66 20 74 68 65 20 72   schema of the r
1c190 62 75 5f 63 6f 75 6e 74 20 74 61 62 6c 65 0a 2a  bu_count table.*
1c1a0 2a 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20  * is assumed to 
1c1b0 63 6f 6e 74 61 69 6e 20 74 68 65 20 73 61 6d 65  contain the same
1c1c0 20 63 6f 6c 75 6d 6e 73 20 61 73 3a 0a 2a 2a 0a   columns as:.**.
1c1d0 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  **   CREATE TABL
1c1e0 45 20 72 62 75 5f 63 6f 75 6e 74 28 74 62 6c 20  E rbu_count(tbl 
1c1f0 54 45 58 54 20 50 52 49 4d 41 52 59 20 4b 45 59  TEXT PRIMARY KEY
1c200 2c 20 63 6e 74 20 49 4e 54 45 47 45 52 29 20 57  , cnt INTEGER) W
1c210 49 54 48 4f 55 54 20 52 4f 57 49 44 3b 0a 2a 2a  ITHOUT ROWID;.**
1c220 0a 2a 2a 20 54 68 65 72 65 20 73 68 6f 75 6c 64  .** There should
1c230 20 62 65 20 6f 6e 65 20 72 6f 77 20 69 6e 20 74   be one row in t
1c240 68 65 20 74 61 62 6c 65 20 66 6f 72 20 65 61 63  he table for eac
1c250 68 20 64 61 74 61 5f 78 78 78 20 74 61 62 6c 65  h data_xxx table
1c260 20 69 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   in the.** datab
1c270 61 73 65 2e 20 54 68 65 20 27 74 62 6c 27 20 63  ase. The 'tbl' c
1c280 6f 6c 75 6d 6e 20 73 68 6f 75 6c 64 20 63 6f 6e  olumn should con
1c290 74 61 69 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  tain the name of
1c2a0 20 61 20 64 61 74 61 5f 78 78 78 20 74 61 62 6c   a data_xxx tabl
1c2b0 65 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20 63 6e  e,.** and the cn
1c2c0 74 20 63 6f 6c 75 6d 6e 20 74 68 65 20 6e 75 6d  t column the num
1c2d0 62 65 72 20 6f 66 20 72 6f 77 73 20 69 74 20 63  ber of rows it c
1c2e0 6f 6e 74 61 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 73  ontains..**.** s
1c2f0 71 6c 69 74 65 33 72 62 75 2e 6e 50 68 61 73 65  qlite3rbu.nPhase
1c300 4f 6e 65 53 74 65 70 20 69 73 20 69 6e 69 74 69  OneStep is initi
1c310 61 6c 69 7a 65 64 20 74 6f 20 74 68 65 20 73 75  alized to the su
1c320 6d 20 6f 66 20 28 31 20 2b 20 6e 49 6e 64 65 78  m of (1 + nIndex
1c330 29 20 2a 20 63 6e 74 0a 2a 2a 20 66 6f 72 20 61  ) * cnt.** for a
1c340 6c 6c 20 72 6f 77 73 20 69 6e 20 74 68 65 20 72  ll rows in the r
1c350 62 75 5f 63 6f 75 6e 74 20 74 61 62 6c 65 2c 20  bu_count table, 
1c360 77 68 65 72 65 20 6e 49 6e 64 65 78 20 69 73 20  where nIndex is 
1c370 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 0a 2a  the number of .*
1c380 2a 20 69 6e 64 65 78 65 73 20 6f 6e 20 74 68 65  * indexes on the
1c390 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
1c3a0 61 72 67 65 74 20 64 61 74 61 62 61 73 65 20 74  arget database t
1c3b0 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
1c3c0 76 6f 69 64 20 72 62 75 49 6e 69 74 50 68 61 73  void rbuInitPhas
1c3d0 65 4f 6e 65 53 74 65 70 73 28 73 71 6c 69 74 65  eOneSteps(sqlite
1c3e0 33 72 62 75 20 2a 70 29 7b 0a 20 20 69 66 28 20  3rbu *p){.  if( 
1c3f0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
1c400 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
1c410 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b  stmt *pStmt = 0;
1c420 0a 20 20 20 20 69 6e 74 20 62 45 78 69 73 74 73  .    int bExists
1c430 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1c440 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1c450 72 62 75 5f 63 6f 75 6e 74 20 65 78 69 73 74 73  rbu_count exists
1c460 20 2a 2f 0a 0a 20 20 20 20 70 2d 3e 6e 50 68 61   */..    p->nPha
1c470 73 65 4f 6e 65 53 74 65 70 20 3d 20 2d 31 3b 0a  seOneStep = -1;.
1c480 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c  .    p->rc = sql
1c490 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
1c4a0 74 69 6f 6e 28 70 2d 3e 64 62 52 62 75 2c 20 0a  tion(p->dbRbu, .
1c4b0 20 20 20 20 20 20 20 20 22 72 62 75 5f 69 6e 64          "rbu_ind
1c4c0 65 78 5f 63 6e 74 22 2c 20 31 2c 20 53 51 4c 49  ex_cnt", 1, SQLI
1c4d0 54 45 5f 55 54 46 38 2c 20 28 76 6f 69 64 2a 29  TE_UTF8, (void*)
1c4e0 70 2c 20 72 62 75 49 6e 64 65 78 43 6e 74 46 75  p, rbuIndexCntFu
1c4f0 6e 63 2c 20 30 2c 20 30 0a 20 20 20 20 29 3b 0a  nc, 0, 0.    );.
1c500 20 20 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20    .    /* Check 
1c510 66 6f 72 20 74 68 65 20 72 62 75 5f 63 6f 75 6e  for the rbu_coun
1c520 74 20 74 61 62 6c 65 2e 20 49 66 20 69 74 20 64  t table. If it d
1c530 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 6f  oes not exist, o
1c540 72 20 69 66 20 61 6e 20 65 72 72 6f 72 0a 20 20  r if an error.  
1c550 20 20 2a 2a 20 6f 63 63 75 72 73 2c 20 6e 50 68    ** occurs, nPh
1c560 61 73 65 4f 6e 65 53 74 65 70 20 77 69 6c 6c 20  aseOneStep will 
1c570 62 65 20 6c 65 66 74 20 73 65 74 20 74 6f 20 2d  be left set to -
1c580 31 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d  1. */.    if( p-
1c590 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
1c5a0 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20  {.      p->rc = 
1c5b0 70 72 65 70 61 72 65 41 6e 64 43 6f 6c 6c 65 63  prepareAndCollec
1c5c0 74 45 72 72 6f 72 28 70 2d 3e 64 62 52 62 75 2c  tError(p->dbRbu,
1c5d0 20 26 70 53 74 6d 74 2c 20 26 70 2d 3e 7a 45 72   &pStmt, &p->zEr
1c5e0 72 6d 73 67 2c 0a 20 20 20 20 20 20 20 20 20 20  rmsg,.          
1c5f0 22 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20 73  "SELECT 1 FROM s
1c600 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 57 48 45  qlite_master WHE
1c610 52 45 20 74 62 6c 5f 6e 61 6d 65 20 3d 20 27 72  RE tbl_name = 'r
1c620 62 75 5f 63 6f 75 6e 74 27 22 0a 20 20 20 20 20  bu_count'".     
1c630 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   );.    }.    if
1c640 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
1c650 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  OK ){.      if( 
1c660 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69  SQLITE_ROW==sqli
1c670 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20  te3_step(pStmt) 
1c680 29 7b 0a 20 20 20 20 20 20 20 20 62 45 78 69 73  ){.        bExis
1c690 74 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ts = 1;.      }.
1c6a0 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71        p->rc = sq
1c6b0 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
1c6c0 53 74 6d 74 29 3b 0a 20 20 20 20 7d 0a 20 20 0a  Stmt);.    }.  .
1c6d0 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
1c6e0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 45 78 69  QLITE_OK && bExi
1c6f0 73 74 73 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  sts ){.      p->
1c700 72 63 20 3d 20 70 72 65 70 61 72 65 41 6e 64 43  rc = prepareAndC
1c710 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64  ollectError(p->d
1c720 62 52 62 75 2c 20 26 70 53 74 6d 74 2c 20 26 70  bRbu, &pStmt, &p
1c730 2d 3e 7a 45 72 72 6d 73 67 2c 0a 20 20 20 20 20  ->zErrmsg,.     
1c740 20 20 20 20 20 22 53 45 4c 45 43 54 20 73 75 6d       "SELECT sum
1c750 28 63 6e 74 20 2a 20 28 31 20 2b 20 72 62 75 5f  (cnt * (1 + rbu_
1c760 69 6e 64 65 78 5f 63 6e 74 28 72 62 75 5f 74 61  index_cnt(rbu_ta
1c770 72 67 65 74 5f 6e 61 6d 65 28 74 62 6c 29 29 29  rget_name(tbl)))
1c780 29 22 0a 20 20 20 20 20 20 20 20 20 20 22 46 52  )".          "FR
1c790 4f 4d 20 72 62 75 5f 63 6f 75 6e 74 22 0a 20 20  OM rbu_count".  
1c7a0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28      );.      if(
1c7b0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1c7c0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  K ){.        if(
1c7d0 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
1c7e0 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
1c7f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   ){.          p-
1c800 3e 6e 50 68 61 73 65 4f 6e 65 53 74 65 70 20 3d  >nPhaseOneStep =
1c810 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
1c820 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 30 29 3b  int64(pStmt, 0);
1c830 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1c840 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74     p->rc = sqlit
1c850 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
1c860 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
1c870 7d 0a 20 20 7d 0a 7d 0a 0a 0a 73 74 61 74 69 63  }.  }.}...static
1c880 20 73 71 6c 69 74 65 33 72 62 75 20 2a 6f 70 65   sqlite3rbu *ope
1c890 6e 52 62 75 48 61 6e 64 6c 65 28 0a 20 20 63 6f  nRbuHandle(.  co
1c8a0 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 72 67 65  nst char *zTarge
1c8b0 74 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  t, .  const char
1c8c0 20 2a 7a 52 62 75 2c 0a 20 20 63 6f 6e 73 74 20   *zRbu,.  const 
1c8d0 63 68 61 72 20 2a 7a 53 74 61 74 65 0a 29 7b 0a  char *zState.){.
1c8e0 20 20 73 71 6c 69 74 65 33 72 62 75 20 2a 70 3b    sqlite3rbu *p;
1c8f0 0a 20 20 73 69 7a 65 5f 74 20 6e 54 61 72 67 65  .  size_t nTarge
1c900 74 20 3d 20 7a 54 61 72 67 65 74 20 3f 20 73 74  t = zTarget ? st
1c910 72 6c 65 6e 28 7a 54 61 72 67 65 74 29 20 3a 20  rlen(zTarget) : 
1c920 30 3b 0a 20 20 73 69 7a 65 5f 74 20 6e 52 62 75  0;.  size_t nRbu
1c930 20 3d 20 73 74 72 6c 65 6e 28 7a 52 62 75 29 3b   = strlen(zRbu);
1c940 0a 20 20 73 69 7a 65 5f 74 20 6e 42 79 74 65 20  .  size_t nByte 
1c950 3d 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33  = sizeof(sqlite3
1c960 72 62 75 29 20 2b 20 6e 54 61 72 67 65 74 2b 31  rbu) + nTarget+1
1c970 20 2b 20 6e 52 62 75 2b 31 3b 0a 0a 20 20 70 20   + nRbu+1;..  p 
1c980 3d 20 28 73 71 6c 69 74 65 33 72 62 75 2a 29 73  = (sqlite3rbu*)s
1c990 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28  qlite3_malloc64(
1c9a0 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 70 20  nByte);.  if( p 
1c9b0 29 7b 0a 20 20 20 20 52 62 75 53 74 61 74 65 20  ){.    RbuState 
1c9c0 2a 70 53 74 61 74 65 20 3d 20 30 3b 0a 0a 20 20  *pState = 0;..  
1c9d0 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20    /* Create the 
1c9e0 63 75 73 74 6f 6d 20 56 46 53 2e 20 2a 2f 0a 20  custom VFS. */. 
1c9f0 20 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20     memset(p, 0, 
1ca00 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 72 62  sizeof(sqlite3rb
1ca10 75 29 29 3b 0a 20 20 20 20 72 62 75 43 72 65 61  u));.    rbuCrea
1ca20 74 65 56 66 73 28 70 29 3b 0a 0a 20 20 20 20 2f  teVfs(p);..    /
1ca30 2a 20 4f 70 65 6e 20 74 68 65 20 74 61 72 67 65  * Open the targe
1ca40 74 2c 20 52 42 55 20 61 6e 64 20 73 74 61 74 65  t, RBU and state
1ca50 20 64 61 74 61 62 61 73 65 73 20 2a 2f 0a 20 20   databases */.  
1ca60 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
1ca70 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1ca80 63 68 61 72 20 2a 70 43 73 72 20 3d 20 28 63 68  char *pCsr = (ch
1ca90 61 72 2a 29 26 70 5b 31 5d 3b 0a 20 20 20 20 20  ar*)&p[1];.     
1caa0 20 69 6e 74 20 62 52 65 74 72 79 20 3d 20 30 3b   int bRetry = 0;
1cab0 0a 20 20 20 20 20 20 69 66 28 20 7a 54 61 72 67  .      if( zTarg
1cac0 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  et ){.        p-
1cad0 3e 7a 54 61 72 67 65 74 20 3d 20 70 43 73 72 3b  >zTarget = pCsr;
1cae0 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
1caf0 70 2d 3e 7a 54 61 72 67 65 74 2c 20 7a 54 61 72  p->zTarget, zTar
1cb00 67 65 74 2c 20 6e 54 61 72 67 65 74 2b 31 29 3b  get, nTarget+1);
1cb10 0a 20 20 20 20 20 20 20 20 70 43 73 72 20 2b 3d  .        pCsr +=
1cb20 20 6e 54 61 72 67 65 74 2b 31 3b 0a 20 20 20 20   nTarget+1;.    
1cb30 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 7a 52 62    }.      p->zRb
1cb40 75 20 3d 20 70 43 73 72 3b 0a 20 20 20 20 20 20  u = pCsr;.      
1cb50 6d 65 6d 63 70 79 28 70 2d 3e 7a 52 62 75 2c 20  memcpy(p->zRbu, 
1cb60 7a 52 62 75 2c 20 6e 52 62 75 2b 31 29 3b 0a 20  zRbu, nRbu+1);. 
1cb70 20 20 20 20 20 70 43 73 72 20 2b 3d 20 6e 52 62       pCsr += nRb
1cb80 75 2b 31 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  u+1;.      if( z
1cb90 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20  State ){.       
1cba0 20 70 2d 3e 7a 53 74 61 74 65 20 3d 20 72 62 75   p->zState = rbu
1cbb0 4d 50 72 69 6e 74 66 28 70 2c 20 22 25 73 22 2c  MPrintf(p, "%s",
1cbc0 20 7a 53 74 61 74 65 29 3b 0a 20 20 20 20 20 20   zState);.      
1cbd0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  }..      /* If t
1cbe0 68 65 20 66 69 72 73 74 20 61 74 74 65 6d 70 74  he first attempt
1cbf0 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 64 61 74   to open the dat
1cc00 61 62 61 73 65 20 66 69 6c 65 20 66 61 69 6c 73  abase file fails
1cc10 20 61 6e 64 20 74 68 65 20 62 52 65 74 72 79 0a   and the bRetry.
1cc20 20 20 20 20 20 20 2a 2a 20 66 6c 61 67 20 69 74        ** flag it
1cc30 20 73 65 74 2c 20 74 68 69 73 20 6d 65 61 6e 73   set, this means
1cc40 20 74 68 61 74 20 74 68 65 20 64 62 20 77 61 73   that the db was
1cc50 20 6e 6f 74 20 6f 70 65 6e 65 64 20 62 65 63 61   not opened beca
1cc60 75 73 65 20 69 74 20 73 65 65 6d 65 64 0a 20 20  use it seemed.  
1cc70 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 61 20 77      ** to be a w
1cc80 61 6c 2d 6d 6f 64 65 20 64 62 2e 20 42 75 74 2c  al-mode db. But,
1cc90 20 74 68 69 73 20 6d 61 79 20 68 61 76 65 20 68   this may have h
1cca0 61 70 70 65 6e 65 64 20 64 75 65 20 74 6f 20 61  appened due to a
1ccb0 6e 20 65 61 72 6c 69 65 72 0a 20 20 20 20 20 20  n earlier.      
1ccc0 2a 2a 20 52 42 55 20 76 61 63 75 75 6d 20 6f 70  ** RBU vacuum op
1ccd0 65 72 61 74 69 6f 6e 20 6c 65 61 76 69 6e 67 20  eration leaving 
1cce0 61 6e 20 6f 6c 64 20 77 61 6c 20 66 69 6c 65 20  an old wal file 
1ccf0 69 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  in the directory
1cd00 2e 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68  ..      ** If th
1cd10 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c 20  is is the case, 
1cd20 69 74 20 77 69 6c 6c 20 68 61 76 65 20 62 65 65  it will have bee
1cd30 6e 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 20 61  n checkpointed a
1cd40 6e 64 20 64 65 6c 65 74 65 64 0a 20 20 20 20 20  nd deleted.     
1cd50 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 68 61 6e   ** when the han
1cd60 64 6c 65 20 77 61 73 20 63 6c 6f 73 65 64 20 61  dle was closed a
1cd70 6e 64 20 61 20 73 65 63 6f 6e 64 20 61 74 74 65  nd a second atte
1cd80 6d 70 74 20 74 6f 20 6f 70 65 6e 20 74 68 65 20  mpt to open the 
1cd90 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61  .      ** databa
1cda0 73 65 20 6d 61 79 20 73 75 63 63 65 65 64 2e 20  se may succeed. 
1cdb0 20 2a 2f 0a 20 20 20 20 20 20 72 62 75 4f 70 65   */.      rbuOpe
1cdc0 6e 44 61 74 61 62 61 73 65 28 70 2c 20 26 62 52  nDatabase(p, &bR
1cdd0 65 74 72 79 29 3b 0a 20 20 20 20 20 20 69 66 28  etry);.      if(
1cde0 20 62 52 65 74 72 79 20 29 7b 0a 20 20 20 20 20   bRetry ){.     
1cdf0 20 20 20 72 62 75 4f 70 65 6e 44 61 74 61 62 61     rbuOpenDataba
1ce00 73 65 28 70 2c 20 30 29 3b 0a 20 20 20 20 20 20  se(p, 0);.      
1ce10 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  }.    }..    if(
1ce20 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1ce30 4b 20 29 7b 0a 20 20 20 20 20 20 70 53 74 61 74  K ){.      pStat
1ce40 65 20 3d 20 72 62 75 4c 6f 61 64 53 74 61 74 65  e = rbuLoadState
1ce50 28 70 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  (p);.      asser
1ce60 74 28 20 70 53 74 61 74 65 20 7c 7c 20 70 2d 3e  t( pState || p->
1ce70 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
1ce80 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63  .      if( p->rc
1ce90 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 0a  ==SQLITE_OK ){..
1cea0 20 20 20 20 20 20 20 20 69 66 28 20 70 53 74 61          if( pSta
1ceb0 74 65 2d 3e 65 53 74 61 67 65 3d 3d 30 20 29 7b  te->eStage==0 ){
1cec0 20 0a 20 20 20 20 20 20 20 20 20 20 72 62 75 44   .          rbuD
1ced0 65 6c 65 74 65 4f 61 6c 46 69 6c 65 28 70 29 3b  eleteOalFile(p);
1cee0 0a 20 20 20 20 20 20 20 20 20 20 72 62 75 49 6e  .          rbuIn
1cef0 69 74 50 68 61 73 65 4f 6e 65 53 74 65 70 73 28  itPhaseOneSteps(
1cf00 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d  p);.          p-
1cf10 3e 65 53 74 61 67 65 20 3d 20 52 42 55 5f 53 54  >eStage = RBU_ST
1cf20 41 47 45 5f 4f 41 4c 3b 0a 20 20 20 20 20 20 20  AGE_OAL;.       
1cf30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1cf40 20 20 70 2d 3e 65 53 74 61 67 65 20 3d 20 70 53    p->eStage = pS
1cf50 74 61 74 65 2d 3e 65 53 74 61 67 65 3b 0a 20 20  tate->eStage;.  
1cf60 20 20 20 20 20 20 20 20 70 2d 3e 6e 50 68 61 73          p->nPhas
1cf70 65 4f 6e 65 53 74 65 70 20 3d 20 70 53 74 61 74  eOneStep = pStat
1cf80 65 2d 3e 6e 50 68 61 73 65 4f 6e 65 53 74 65 70  e->nPhaseOneStep
1cf90 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1cfa0 20 20 20 20 70 2d 3e 6e 50 72 6f 67 72 65 73 73      p->nProgress
1cfb0 20 3d 20 70 53 74 61 74 65 2d 3e 6e 50 72 6f 67   = pState->nProg
1cfc0 72 65 73 73 3b 0a 20 20 20 20 20 20 20 20 70 2d  ress;.        p-
1cfd0 3e 69 4f 61 6c 53 7a 20 3d 20 70 53 74 61 74 65  >iOalSz = pState
1cfe0 2d 3e 69 4f 61 6c 53 7a 3b 0a 20 20 20 20 20 20  ->iOalSz;.      
1cff0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  }.    }.    asse
1d000 72 74 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54  rt( p->rc!=SQLIT
1d010 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 65 53 74 61 67  E_OK || p->eStag
1d020 65 21 3d 30 20 29 3b 0a 0a 20 20 20 20 69 66 28  e!=0 );..    if(
1d030 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1d040 4b 20 26 26 20 70 2d 3e 70 54 61 72 67 65 74 46  K && p->pTargetF
1d050 64 2d 3e 70 57 61 6c 46 64 20 29 7b 0a 20 20 20  d->pWalFd ){.   
1d060 20 20 20 69 66 28 20 70 2d 3e 65 53 74 61 67 65     if( p->eStage
1d070 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20  ==RBU_STAGE_OAL 
1d080 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63  ){.        p->rc
1d090 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
1d0a0 0a 20 20 20 20 20 20 20 20 70 2d 3e 7a 45 72 72  .        p->zErr
1d0b0 6d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  msg = sqlite3_mp
1d0c0 72 69 6e 74 66 28 22 63 61 6e 6e 6f 74 20 75 70  rintf("cannot up
1d0d0 64 61 74 65 20 77 61 6c 20 6d 6f 64 65 20 64 61  date wal mode da
1d0e0 74 61 62 61 73 65 22 29 3b 0a 20 20 20 20 20 20  tabase");.      
1d0f0 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 65 53 74  }else if( p->eSt
1d100 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4d  age==RBU_STAGE_M
1d110 4f 56 45 20 29 7b 0a 20 20 20 20 20 20 20 20 70  OVE ){.        p
1d120 2d 3e 65 53 74 61 67 65 20 3d 20 52 42 55 5f 53  ->eStage = RBU_S
1d130 54 41 47 45 5f 43 4b 50 54 3b 0a 20 20 20 20 20  TAGE_CKPT;.     
1d140 20 20 20 70 2d 3e 6e 53 74 65 70 20 3d 20 30 3b     p->nStep = 0;
1d150 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1d160 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
1d170 51 4c 49 54 45 5f 4f 4b 20 0a 20 20 20 20 20 26  QLITE_OK .     &
1d180 26 20 28 70 2d 3e 65 53 74 61 67 65 3d 3d 52 42  & (p->eStage==RB
1d190 55 5f 53 54 41 47 45 5f 4f 41 4c 20 7c 7c 20 70  U_STAGE_OAL || p
1d1a0 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54  ->eStage==RBU_ST
1d1b0 41 47 45 5f 4d 4f 56 45 29 0a 20 20 20 20 20 26  AGE_MOVE).     &
1d1c0 26 20 70 53 74 61 74 65 2d 3e 65 53 74 61 67 65  & pState->eStage
1d1d0 21 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  !=0.    ){.     
1d1e0 20 72 62 75 5f 66 69 6c 65 20 2a 70 46 64 20 3d   rbu_file *pFd =
1d1f0 20 28 72 62 75 49 73 56 61 63 75 75 6d 28 70 29   (rbuIsVacuum(p)
1d200 20 3f 20 70 2d 3e 70 52 62 75 46 64 20 3a 20 70   ? p->pRbuFd : p
1d210 2d 3e 70 54 61 72 67 65 74 46 64 29 3b 0a 20 20  ->pTargetFd);.  
1d220 20 20 20 20 69 66 28 20 70 46 64 2d 3e 69 43 6f      if( pFd->iCo
1d230 6f 6b 69 65 21 3d 70 53 74 61 74 65 2d 3e 69 43  okie!=pState->iC
1d240 6f 6f 6b 69 65 20 29 7b 20 20 20 0a 20 20 20 20  ookie ){   .    
1d250 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
1d260 6f 69 6e 74 20 28 70 54 61 72 67 65 74 46 64 2d  oint (pTargetFd-
1d270 3e 69 43 6f 6f 6b 69 65 29 20 63 6f 6e 74 61 69  >iCookie) contai
1d280 6e 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ns the value of 
1d290 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  the.        ** c
1d2a0 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 63 6f  hange-counter co
1d2b0 6f 6b 69 65 20 28 74 68 65 20 74 68 69 6e 67 20  okie (the thing 
1d2c0 74 68 61 74 20 67 65 74 73 20 69 6e 63 72 65 6d  that gets increm
1d2d0 65 6e 74 65 64 20 77 68 65 6e 20 61 20 0a 20 20  ented when a .  
1d2e0 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63        ** transac
1d2f0 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65  tion is committe
1d300 64 20 69 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f  d in rollback mo
1d310 64 65 29 20 63 75 72 72 65 6e 74 6c 79 20 73 74  de) currently st
1d320 6f 72 65 64 20 6f 6e 20 0a 20 20 20 20 20 20 20  ored on .       
1d330 20 2a 2a 20 70 61 67 65 20 31 20 6f 66 20 74 68   ** page 1 of th
1d340 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1d350 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 2d 3e 72   */.        p->r
1d360 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
1d370 0a 20 20 20 20 20 20 20 20 70 2d 3e 7a 45 72 72  .        p->zErr
1d380 6d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  msg = sqlite3_mp
1d390 72 69 6e 74 66 28 22 64 61 74 61 62 61 73 65 20  rintf("database 
1d3a0 6d 6f 64 69 66 69 65 64 20 64 75 72 69 6e 67 20  modified during 
1d3b0 72 62 75 20 25 73 22 2c 0a 20 20 20 20 20 20 20  rbu %s",.       
1d3c0 20 20 20 20 20 28 72 62 75 49 73 56 61 63 75 75       (rbuIsVacuu
1d3d0 6d 28 70 29 20 3f 20 22 76 61 63 75 75 6d 22 20  m(p) ? "vacuum" 
1d3e0 3a 20 22 75 70 64 61 74 65 22 29 0a 20 20 20 20  : "update").    
1d3f0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20      );.      }. 
1d400 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 2d     }..    if( p-
1d410 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
1d420 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65  {.      if( p->e
1d430 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45  Stage==RBU_STAGE
1d440 5f 4f 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  _OAL ){.        
1d450 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
1d460 3e 64 62 4d 61 69 6e 3b 0a 20 20 20 20 20 20 20  >dbMain;.       
1d470 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33   p->rc = sqlite3
1d480 5f 65 78 65 63 28 70 2d 3e 64 62 52 62 75 2c 20  _exec(p->dbRbu, 
1d490 22 42 45 47 49 4e 22 2c 20 30 2c 20 30 2c 20 26  "BEGIN", 0, 0, &
1d4a0 70 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a 0a 20 20  p->zErrmsg);..  
1d4b0 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 20 74        /* Point t
1d4c0 68 65 20 6f 62 6a 65 63 74 20 69 74 65 72 61 74  he object iterat
1d4d0 6f 72 20 61 74 20 74 68 65 20 66 69 72 73 74 20  or at the first 
1d4e0 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 20 20  object */.      
1d4f0 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
1d500 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1d510 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 62 75 4f      p->rc = rbuO
1d520 62 6a 49 74 65 72 46 69 72 73 74 28 70 2c 20 26  bjIterFirst(p, &
1d530 70 2d 3e 6f 62 6a 69 74 65 72 29 3b 0a 20 20 20  p->objiter);.   
1d540 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
1d550 2f 2a 20 49 66 20 74 68 65 20 52 42 55 20 64 61  /* If the RBU da
1d560 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 73 20  tabase contains 
1d570 6e 6f 20 64 61 74 61 5f 78 78 78 20 74 61 62 6c  no data_xxx tabl
1d580 65 73 2c 20 64 65 63 6c 61 72 65 20 74 68 65 20  es, declare the 
1d590 52 42 55 0a 20 20 20 20 20 20 20 20 2a 2a 20 75  RBU.        ** u
1d5a0 70 64 61 74 65 20 66 69 6e 69 73 68 65 64 2e 20  pdate finished. 
1d5b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
1d5c0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
1d5d0 20 26 26 20 70 2d 3e 6f 62 6a 69 74 65 72 2e 7a   && p->objiter.z
1d5e0 54 62 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Tbl==0 ){.      
1d5f0 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
1d600 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20 20  TE_DONE;.       
1d610 20 20 20 70 2d 3e 65 53 74 61 67 65 20 3d 20 52     p->eStage = R
1d620 42 55 5f 53 54 41 47 45 5f 44 4f 4e 45 3b 0a 20  BU_STAGE_DONE;. 
1d630 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1d640 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72          if( p->r
1d650 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1d660 70 53 74 61 74 65 2d 3e 65 53 74 61 67 65 3d 3d  pState->eStage==
1d670 30 20 26 26 20 72 62 75 49 73 56 61 63 75 75 6d  0 && rbuIsVacuum
1d680 28 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  (p) ){.         
1d690 20 20 20 72 62 75 43 6f 70 79 50 72 61 67 6d 61     rbuCopyPragma
1d6a0 28 70 2c 20 22 70 61 67 65 5f 73 69 7a 65 22 29  (p, "page_size")
1d6b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 62  ;.            rb
1d6c0 75 43 6f 70 79 50 72 61 67 6d 61 28 70 2c 20 22  uCopyPragma(p, "
1d6d0 61 75 74 6f 5f 76 61 63 75 75 6d 22 29 3b 0a 20  auto_vacuum");. 
1d6e0 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20           }..    
1d6f0 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 72        /* Open tr
1d700 61 6e 73 61 63 74 69 6f 6e 73 20 62 6f 74 68 20  ansactions both 
1d710 64 61 74 61 62 61 73 65 73 2e 20 54 68 65 20 2a  databases. The *
1d720 2d 6f 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  -oal file is ope
1d730 6e 65 64 20 6f 72 0a 20 20 20 20 20 20 20 20 20  ned or.         
1d740 20 2a 2a 20 63 72 65 61 74 65 64 20 61 74 20 74   ** created at t
1d750 68 69 73 20 70 6f 69 6e 74 2e 20 2a 2f 0a 20 20  his point. */.  
1d760 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72          if( p->r
1d770 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1d780 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72              p->r
1d790 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  c = sqlite3_exec
1d7a0 28 64 62 2c 20 22 42 45 47 49 4e 20 49 4d 4d 45  (db, "BEGIN IMME
1d7b0 44 49 41 54 45 22 2c 20 30 2c 20 30 2c 20 26 70  DIATE", 0, 0, &p
1d7c0 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a 20 20 20 20  ->zErrmsg);.    
1d7d0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
1d7e0 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74     /* Check if t
1d7f0 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
1d800 20 69 73 20 61 20 7a 69 70 76 66 73 20 64 62 2e   is a zipvfs db.
1d810 20 49 66 20 69 74 20 69 73 2c 20 73 65 74 20 74   If it is, set t
1d820 68 65 20 75 70 70 65 72 0a 20 20 20 20 20 20 20  he upper.       
1d830 20 20 20 2a 2a 20 6c 65 76 65 6c 20 70 61 67 65     ** level page
1d840 72 20 74 6f 20 75 73 65 20 22 6a 6f 75 72 6e 61  r to use "journa
1d850 6c 5f 6d 6f 64 65 3d 6f 66 66 22 2e 20 54 68 69  l_mode=off". Thi
1d860 73 20 70 72 65 76 65 6e 74 73 20 69 74 20 66 72  s prevents it fr
1d870 6f 6d 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  om .          **
1d880 20 67 65 6e 65 72 61 74 69 6e 67 20 61 20 6c 61   generating a la
1d890 72 67 65 20 6a 6f 75 72 6e 61 6c 20 75 73 69 6e  rge journal usin
1d8a0 67 20 61 20 74 65 6d 70 20 66 69 6c 65 2e 20 20  g a temp file.  
1d8b0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
1d8c0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1d8d0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
1d8e0 20 69 6e 74 20 66 72 63 20 3d 20 73 71 6c 69 74   int frc = sqlit
1d8f0 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28  e3_file_control(
1d900 64 62 2c 20 22 6d 61 69 6e 22 2c 20 53 51 4c 49  db, "main", SQLI
1d910 54 45 5f 46 43 4e 54 4c 5f 5a 49 50 56 46 53 2c  TE_FCNTL_ZIPVFS,
1d920 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
1d930 20 69 66 28 20 66 72 63 3d 3d 53 51 4c 49 54 45   if( frc==SQLITE
1d940 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1d950 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c       p->rc = sql
1d960 69 74 65 33 5f 65 78 65 63 28 0a 20 20 20 20 20  ite3_exec(.     
1d970 20 20 20 20 20 20 20 20 20 20 20 64 62 2c 20 22             db, "
1d980 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
1d990 6f 64 65 3d 6f 66 66 22 2c 30 2c 30 2c 26 70 2d  ode=off",0,0,&p-
1d9a0 3e 7a 45 72 72 6d 73 67 29 3b 0a 20 20 20 20 20  >zErrmsg);.     
1d9b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1d9c0 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20     }..          
1d9d0 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
1d9e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1d9f0 20 20 20 20 72 62 75 53 65 74 75 70 4f 61 6c 28      rbuSetupOal(
1da00 70 2c 20 70 53 74 61 74 65 29 3b 0a 20 20 20 20  p, pState);.    
1da10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1da20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
1da30 28 20 70 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55  ( p->eStage==RBU
1da40 5f 53 54 41 47 45 5f 4d 4f 56 45 20 29 7b 0a 20  _STAGE_MOVE ){. 
1da50 20 20 20 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20         /* no-op 
1da60 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  */.      }else i
1da70 66 28 20 70 2d 3e 65 53 74 61 67 65 3d 3d 52 42  f( p->eStage==RB
1da80 55 5f 53 54 41 47 45 5f 43 4b 50 54 20 29 7b 0a  U_STAGE_CKPT ){.
1da90 20 20 20 20 20 20 20 20 72 62 75 53 65 74 75 70          rbuSetup
1daa0 43 68 65 63 6b 70 6f 69 6e 74 28 70 2c 20 70 53  Checkpoint(p, pS
1dab0 74 61 74 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c  tate);.      }el
1dac0 73 65 20 69 66 28 20 70 2d 3e 65 53 74 61 67 65  se if( p->eStage
1dad0 3d 3d 52 42 55 5f 53 54 41 47 45 5f 44 4f 4e 45  ==RBU_STAGE_DONE
1dae0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72   ){.        p->r
1daf0 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  c = SQLITE_DONE;
1db00 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1db10 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51        p->rc = SQ
1db20 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20  LITE_CORRUPT;.  
1db30 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1db40 20 72 62 75 46 72 65 65 53 74 61 74 65 28 70 53   rbuFreeState(pS
1db50 74 61 74 65 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  tate);.  }..  re
1db60 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
1db70 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72 65   Allocate and re
1db80 74 75 72 6e 20 61 6e 20 52 42 55 20 68 61 6e 64  turn an RBU hand
1db90 6c 65 20 77 69 74 68 20 61 6c 6c 20 66 69 65 6c  le with all fiel
1dba0 64 73 20 7a 65 72 6f 65 64 20 65 78 63 65 70 74  ds zeroed except
1dbb0 20 66 6f 72 20 74 68 65 0a 2a 2a 20 65 72 72 6f   for the.** erro
1dbc0 72 20 63 6f 64 65 2c 20 77 68 69 63 68 20 69 73  r code, which is
1dbd0 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4d   set to SQLITE_M
1dbe0 49 53 55 53 45 2e 0a 2a 2f 0a 73 74 61 74 69 63  ISUSE..*/.static
1dbf0 20 73 71 6c 69 74 65 33 72 62 75 20 2a 72 62 75   sqlite3rbu *rbu
1dc00 4d 69 73 75 73 65 45 72 72 6f 72 28 76 6f 69 64  MisuseError(void
1dc10 29 7b 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20  ){.  sqlite3rbu 
1dc20 2a 70 52 65 74 3b 0a 20 20 70 52 65 74 20 3d 20  *pRet;.  pRet = 
1dc30 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
1dc40 28 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 72  (sizeof(sqlite3r
1dc50 62 75 29 29 3b 0a 20 20 69 66 28 20 70 52 65 74  bu));.  if( pRet
1dc60 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70   ){.    memset(p
1dc70 52 65 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  Ret, 0, sizeof(s
1dc80 71 6c 69 74 65 33 72 62 75 29 29 3b 0a 20 20 20  qlite3rbu));.   
1dc90 20 70 52 65 74 2d 3e 72 63 20 3d 20 53 51 4c 49   pRet->rc = SQLI
1dca0 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 20  TE_MISUSE;.  }. 
1dcb0 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
1dcc0 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 6e 64 20  ./*.** Open and 
1dcd0 72 65 74 75 72 6e 20 61 20 6e 65 77 20 52 42 55  return a new RBU
1dce0 20 68 61 6e 64 6c 65 2e 20 0a 2a 2f 0a 73 71 6c   handle. .*/.sql
1dcf0 69 74 65 33 72 62 75 20 2a 73 71 6c 69 74 65 33  ite3rbu *sqlite3
1dd00 72 62 75 5f 6f 70 65 6e 28 0a 20 20 63 6f 6e 73  rbu_open(.  cons
1dd10 74 20 63 68 61 72 20 2a 7a 54 61 72 67 65 74 2c  t char *zTarget,
1dd20 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a   .  const char *
1dd30 7a 52 62 75 2c 0a 20 20 63 6f 6e 73 74 20 63 68  zRbu,.  const ch
1dd40 61 72 20 2a 7a 53 74 61 74 65 0a 29 7b 0a 20 20  ar *zState.){.  
1dd50 69 66 28 20 7a 54 61 72 67 65 74 3d 3d 30 20 7c  if( zTarget==0 |
1dd60 7c 20 7a 52 62 75 3d 3d 30 20 29 7b 20 72 65 74  | zRbu==0 ){ ret
1dd70 75 72 6e 20 72 62 75 4d 69 73 75 73 65 45 72 72  urn rbuMisuseErr
1dd80 6f 72 28 29 3b 20 7d 0a 20 20 2f 2a 20 54 4f 44  or(); }.  /* TOD
1dd90 4f 3a 20 43 68 65 63 6b 20 74 68 61 74 20 7a 54  O: Check that zT
1dda0 61 72 67 65 74 20 61 6e 64 20 7a 52 62 75 20 61  arget and zRbu a
1ddb0 72 65 20 6e 6f 6e 2d 4e 55 4c 4c 20 2a 2f 0a 20  re non-NULL */. 
1ddc0 20 72 65 74 75 72 6e 20 6f 70 65 6e 52 62 75 48   return openRbuH
1ddd0 61 6e 64 6c 65 28 7a 54 61 72 67 65 74 2c 20 7a  andle(zTarget, z
1dde0 52 62 75 2c 20 7a 53 74 61 74 65 29 3b 0a 7d 0a  Rbu, zState);.}.
1ddf0 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 68 61  ./*.** Open a ha
1de00 6e 64 6c 65 20 74 6f 20 62 65 67 69 6e 20 6f 72  ndle to begin or
1de10 20 72 65 73 75 6d 65 20 61 6e 20 52 42 55 20 56   resume an RBU V
1de20 41 43 55 55 4d 20 6f 70 65 72 61 74 69 6f 6e 2e  ACUUM operation.
1de30 0a 2a 2f 0a 73 71 6c 69 74 65 33 72 62 75 20 2a  .*/.sqlite3rbu *
1de40 73 71 6c 69 74 65 33 72 62 75 5f 76 61 63 75 75  sqlite3rbu_vacuu
1de50 6d 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  m(.  const char 
1de60 2a 7a 54 61 72 67 65 74 2c 20 0a 20 20 63 6f 6e  *zTarget, .  con
1de70 73 74 20 63 68 61 72 20 2a 7a 53 74 61 74 65 0a  st char *zState.
1de80 29 7b 0a 20 20 69 66 28 20 7a 54 61 72 67 65 74  ){.  if( zTarget
1de90 3d 3d 30 20 29 7b 20 72 65 74 75 72 6e 20 72 62  ==0 ){ return rb
1dea0 75 4d 69 73 75 73 65 45 72 72 6f 72 28 29 3b 20  uMisuseError(); 
1deb0 7d 0a 20 20 69 66 28 20 7a 53 74 61 74 65 20 29  }.  if( zState )
1dec0 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 74  {.    int n = st
1ded0 72 6c 65 6e 28 7a 53 74 61 74 65 29 3b 0a 20 20  rlen(zState);.  
1dee0 20 20 69 66 28 20 6e 3e 3d 37 20 26 26 20 30 3d    if( n>=7 && 0=
1def0 3d 6d 65 6d 63 6d 70 28 22 2d 76 61 63 74 6d 70  =memcmp("-vactmp
1df00 22 2c 20 26 7a 53 74 61 74 65 5b 6e 2d 37 5d 2c  ", &zState[n-7],
1df10 20 37 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74   7) ){.      ret
1df20 75 72 6e 20 72 62 75 4d 69 73 75 73 65 45 72 72  urn rbuMisuseErr
1df30 6f 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  or();.    }.  }.
1df40 20 20 2f 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b    /* TODO: Check
1df50 20 74 68 61 74 20 62 6f 74 68 20 61 72 67 75 6d   that both argum
1df60 65 6e 74 73 20 61 72 65 20 6e 6f 6e 2d 4e 55 4c  ents are non-NUL
1df70 4c 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 6f 70  L */.  return op
1df80 65 6e 52 62 75 48 61 6e 64 6c 65 28 30 2c 20 7a  enRbuHandle(0, z
1df90 54 61 72 67 65 74 2c 20 7a 53 74 61 74 65 29 3b  Target, zState);
1dfa0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1dfb0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
1dfc0 6e 64 6c 65 20 75 73 65 64 20 62 79 20 70 52 62  ndle used by pRb
1dfd0 75 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20 2a 73  u..*/.sqlite3 *s
1dfe0 71 6c 69 74 65 33 72 62 75 5f 64 62 28 73 71 6c  qlite3rbu_db(sql
1dff0 69 74 65 33 72 62 75 20 2a 70 52 62 75 2c 20 69  ite3rbu *pRbu, i
1e000 6e 74 20 62 52 62 75 29 7b 0a 20 20 73 71 6c 69  nt bRbu){.  sqli
1e010 74 65 33 20 2a 64 62 20 3d 20 30 3b 0a 20 20 69  te3 *db = 0;.  i
1e020 66 28 20 70 52 62 75 20 29 7b 0a 20 20 20 20 64  f( pRbu ){.    d
1e030 62 20 3d 20 28 62 52 62 75 20 3f 20 70 52 62 75  b = (bRbu ? pRbu
1e040 2d 3e 64 62 52 62 75 20 3a 20 70 52 62 75 2d 3e  ->dbRbu : pRbu->
1e050 64 62 4d 61 69 6e 29 3b 0a 20 20 7d 0a 20 20 72  dbMain);.  }.  r
1e060 65 74 75 72 6e 20 64 62 3b 0a 7d 0a 0a 0a 2f 2a  eturn db;.}.../*
1e070 0a 2a 2a 20 49 66 20 74 68 65 20 65 72 72 6f 72  .** If the error
1e080 20 63 6f 64 65 20 63 75 72 72 65 6e 74 6c 79 20   code currently 
1e090 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 52 42  stored in the RB
1e0a0 55 20 68 61 6e 64 6c 65 20 69 73 20 53 51 4c 49  U handle is SQLI
1e0b0 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 0a 2a  TE_CONSTRAINT,.*
1e0c0 2a 20 74 68 65 6e 20 65 64 69 74 20 61 6e 79 20  * then edit any 
1e0d0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 73 74  error message st
1e0e0 72 69 6e 67 20 73 6f 20 61 73 20 74 6f 20 72 65  ring so as to re
1e0f0 6d 6f 76 65 20 61 6c 6c 20 6f 63 63 75 72 72 65  move all occurre
1e100 6e 63 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 70  nces of.** the p
1e110 61 74 74 65 72 6e 20 22 72 62 75 5f 69 6d 70 5f  attern "rbu_imp_
1e120 5b 30 2d 39 5d 2a 22 2e 0a 2a 2f 0a 73 74 61 74  [0-9]*"..*/.stat
1e130 69 63 20 76 6f 69 64 20 72 62 75 45 64 69 74 45  ic void rbuEditE
1e140 72 72 6d 73 67 28 73 71 6c 69 74 65 33 72 62 75  rrmsg(sqlite3rbu
1e150 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72   *p){.  if( p->r
1e160 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  c==SQLITE_CONSTR
1e170 41 49 4e 54 20 26 26 20 70 2d 3e 7a 45 72 72 6d  AINT && p->zErrm
1e180 73 67 20 29 7b 0a 20 20 20 20 75 6e 73 69 67 6e  sg ){.    unsign
1e190 65 64 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 69  ed int i;.    si
1e1a0 7a 65 5f 74 20 6e 45 72 72 6d 73 67 20 3d 20 73  ze_t nErrmsg = s
1e1b0 74 72 6c 65 6e 28 70 2d 3e 7a 45 72 72 6d 73 67  trlen(p->zErrmsg
1e1c0 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
1e1d0 69 3c 28 6e 45 72 72 6d 73 67 2d 38 29 3b 20 69  i<(nErrmsg-8); i
1e1e0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6d  ++){.      if( m
1e1f0 65 6d 63 6d 70 28 26 70 2d 3e 7a 45 72 72 6d 73  emcmp(&p->zErrms
1e200 67 5b 69 5d 2c 20 22 72 62 75 5f 69 6d 70 5f 22  g[i], "rbu_imp_"
1e210 2c 20 38 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  , 8)==0 ){.     
1e220 20 20 20 69 6e 74 20 6e 44 65 6c 20 3d 20 38 3b     int nDel = 8;
1e230 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
1e240 70 2d 3e 7a 45 72 72 6d 73 67 5b 69 2b 6e 44 65  p->zErrmsg[i+nDe
1e250 6c 5d 3e 3d 27 30 27 20 26 26 20 70 2d 3e 7a 45  l]>='0' && p->zE
1e260 72 72 6d 73 67 5b 69 2b 6e 44 65 6c 5d 3c 3d 27  rrmsg[i+nDel]<='
1e270 39 27 20 29 20 6e 44 65 6c 2b 2b 3b 0a 20 20 20  9' ) nDel++;.   
1e280 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26 70 2d       memmove(&p-
1e290 3e 7a 45 72 72 6d 73 67 5b 69 5d 2c 20 26 70 2d  >zErrmsg[i], &p-
1e2a0 3e 7a 45 72 72 6d 73 67 5b 69 2b 6e 44 65 6c 5d  >zErrmsg[i+nDel]
1e2b0 2c 20 6e 45 72 72 6d 73 67 20 2b 20 31 20 2d 20  , nErrmsg + 1 - 
1e2c0 69 20 2d 20 6e 44 65 6c 29 3b 0a 20 20 20 20 20  i - nDel);.     
1e2d0 20 20 20 6e 45 72 72 6d 73 67 20 2d 3d 20 6e 44     nErrmsg -= nD
1e2e0 65 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  el;.      }.    
1e2f0 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  }.  }.}../*.** C
1e300 6c 6f 73 65 20 74 68 65 20 52 42 55 20 68 61 6e  lose the RBU han
1e310 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  dle..*/.int sqli
1e320 74 65 33 72 62 75 5f 63 6c 6f 73 65 28 73 71 6c  te3rbu_close(sql
1e330 69 74 65 33 72 62 75 20 2a 70 2c 20 63 68 61 72  ite3rbu *p, char
1e340 20 2a 2a 70 7a 45 72 72 6d 73 67 29 7b 0a 20 20   **pzErrmsg){.  
1e350 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 70 20  int rc;.  if( p 
1e360 29 7b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 6d 69  ){..    /* Commi
1e370 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
1e380 6e 20 74 6f 20 74 68 65 20 2a 2d 6f 61 6c 20 66  n to the *-oal f
1e390 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ile. */.    if( 
1e3a0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
1e3b0 20 26 26 20 70 2d 3e 65 53 74 61 67 65 3d 3d 52   && p->eStage==R
1e3c0 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20 29 7b 0a  BU_STAGE_OAL ){.
1e3d0 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71        p->rc = sq
1e3e0 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62  lite3_exec(p->db
1e3f0 4d 61 69 6e 2c 20 22 43 4f 4d 4d 49 54 22 2c 20  Main, "COMMIT", 
1e400 30 2c 20 30 2c 20 26 70 2d 3e 7a 45 72 72 6d 73  0, 0, &p->zErrms
1e410 67 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  g);.    }..    /
1e420 2a 20 53 79 6e 63 20 74 68 65 20 64 62 20 66 69  * Sync the db fi
1e430 6c 65 20 69 66 20 63 75 72 72 65 6e 74 6c 79 20  le if currently 
1e440 64 6f 69 6e 67 20 61 6e 20 69 6e 63 72 65 6d 65  doing an increme
1e450 6e 74 61 6c 20 63 68 65 63 6b 70 6f 69 6e 74 20  ntal checkpoint 
1e460 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  */.    if( p->rc
1e470 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
1e480 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54  ->eStage==RBU_ST
1e490 41 47 45 5f 43 4b 50 54 20 29 7b 0a 20 20 20 20  AGE_CKPT ){.    
1e4a0 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
1e4b0 70 44 62 20 3d 20 70 2d 3e 70 54 61 72 67 65 74  pDb = p->pTarget
1e4c0 46 64 2d 3e 70 52 65 61 6c 3b 0a 20 20 20 20 20  Fd->pReal;.     
1e4d0 20 70 2d 3e 72 63 20 3d 20 70 44 62 2d 3e 70 4d   p->rc = pDb->pM
1e4e0 65 74 68 6f 64 73 2d 3e 78 53 79 6e 63 28 70 44  ethods->xSync(pD
1e4f0 62 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e  b, SQLITE_SYNC_N
1e500 4f 52 4d 41 4c 29 3b 0a 20 20 20 20 7d 0a 0a 20  ORMAL);.    }.. 
1e510 20 20 20 72 62 75 53 61 76 65 53 74 61 74 65 28     rbuSaveState(
1e520 70 2c 20 70 2d 3e 65 53 74 61 67 65 29 3b 0a 0a  p, p->eStage);..
1e530 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
1e540 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 65  QLITE_OK && p->e
1e550 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45  Stage==RBU_STAGE
1e560 5f 4f 41 4c 20 29 7b 0a 20 20 20 20 20 20 70 2d  _OAL ){.      p-
1e570 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78  >rc = sqlite3_ex
1e580 65 63 28 70 2d 3e 64 62 52 62 75 2c 20 22 43 4f  ec(p->dbRbu, "CO
1e590 4d 4d 49 54 22 2c 20 30 2c 20 30 2c 20 26 70 2d  MMIT", 0, 0, &p-
1e5a0 3e 7a 45 72 72 6d 73 67 29 3b 0a 20 20 20 20 7d  >zErrmsg);.    }
1e5b0 0a 0a 20 20 20 20 2f 2a 20 43 6c 6f 73 65 20 61  ..    /* Close a
1e5c0 6e 79 20 6f 70 65 6e 20 73 74 61 74 65 6d 65 6e  ny open statemen
1e5d0 74 20 68 61 6e 64 6c 65 73 2e 20 2a 2f 0a 20 20  t handles. */.  
1e5e0 20 20 72 62 75 4f 62 6a 49 74 65 72 46 69 6e 61    rbuObjIterFina
1e5f0 6c 69 7a 65 28 26 70 2d 3e 6f 62 6a 69 74 65 72  lize(&p->objiter
1e600 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
1e610 69 73 20 69 73 20 61 6e 20 52 42 55 20 76 61 63  is is an RBU vac
1e620 75 75 6d 20 68 61 6e 64 6c 65 20 61 6e 64 20 74  uum handle and t
1e630 68 65 20 76 61 63 75 75 6d 20 68 61 73 20 65 69  he vacuum has ei
1e640 74 68 65 72 20 66 69 6e 69 73 68 65 64 0a 20 20  ther finished.  
1e650 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c    ** successfull
1e660 79 20 6f 72 20 65 6e 63 6f 75 6e 74 65 72 65 64  y or encountered
1e670 20 61 6e 20 65 72 72 6f 72 2c 20 64 65 6c 65 74   an error, delet
1e680 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  e the contents o
1e690 66 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 73 74  f the .    ** st
1e6a0 61 74 65 20 74 61 62 6c 65 2e 20 54 68 69 73 20  ate table. This 
1e6b0 63 61 75 73 65 73 20 74 68 65 20 6e 65 78 74 20  causes the next 
1e6c0 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 72  call to sqlite3r
1e6d0 62 75 5f 76 61 63 75 75 6d 28 29 20 0a 20 20 20  bu_vacuum() .   
1e6e0 20 2a 2a 20 73 70 65 63 69 66 79 69 6e 67 20 74   ** specifying t
1e6f0 68 65 20 63 75 72 72 65 6e 74 20 74 61 72 67 65  he current targe
1e700 74 20 61 6e 64 20 73 74 61 74 65 20 64 61 74 61  t and state data
1e710 62 61 73 65 73 20 74 6f 20 73 74 61 72 74 20 61  bases to start a
1e720 20 6e 65 77 0a 20 20 20 20 2a 2a 20 76 61 63 75   new.    ** vacu
1e730 75 6d 20 66 72 6f 6d 20 73 63 72 61 74 63 68 2e  um from scratch.
1e740 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 62 75    */.    if( rbu
1e750 49 73 56 61 63 75 75 6d 28 70 29 20 26 26 20 70  IsVacuum(p) && p
1e760 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc!=SQLITE_OK 
1e770 26 26 20 70 2d 3e 64 62 52 62 75 20 29 7b 0a 20  && p->dbRbu ){. 
1e780 20 20 20 20 20 69 6e 74 20 72 63 32 20 3d 20 73       int rc2 = s
1e790 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
1e7a0 62 52 62 75 2c 20 22 44 45 4c 45 54 45 20 46 52  bRbu, "DELETE FR
1e7b0 4f 4d 20 73 74 61 74 2e 72 62 75 5f 73 74 61 74  OM stat.rbu_stat
1e7c0 65 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  e", 0, 0, 0);.  
1e7d0 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
1e7e0 51 4c 49 54 45 5f 44 4f 4e 45 20 26 26 20 72 63  QLITE_DONE && rc
1e7f0 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70  2!=SQLITE_OK ) p
1e800 2d 3e 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20  ->rc = rc2;.    
1e810 7d 0a 0a 20 20 20 20 2f 2a 20 43 6c 6f 73 65 20  }..    /* Close 
1e820 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73  the open databas
1e830 65 20 68 61 6e 64 6c 65 20 61 6e 64 20 56 46 53  e handle and VFS
1e840 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 20 20   object. */.    
1e850 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 2d  sqlite3_close(p-
1e860 3e 64 62 52 62 75 29 3b 0a 20 20 20 20 73 71 6c  >dbRbu);.    sql
1e870 69 74 65 33 5f 63 6c 6f 73 65 28 70 2d 3e 64 62  ite3_close(p->db
1e880 4d 61 69 6e 29 3b 0a 20 20 20 20 61 73 73 65 72  Main);.    asser
1e890 74 28 20 70 2d 3e 73 7a 54 65 6d 70 3d 3d 30 20  t( p->szTemp==0 
1e8a0 29 3b 0a 20 20 20 20 72 62 75 44 65 6c 65 74 65  );.    rbuDelete
1e8b0 56 66 73 28 70 29 3b 0a 20 20 20 20 73 71 6c 69  Vfs(p);.    sqli
1e8c0 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 42 75 66  te3_free(p->aBuf
1e8d0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
1e8e0 72 65 65 28 70 2d 3e 61 46 72 61 6d 65 29 3b 0a  ree(p->aFrame);.
1e8f0 0a 20 20 20 20 72 62 75 45 64 69 74 45 72 72 6d  .    rbuEditErrm
1e900 73 67 28 70 29 3b 0a 20 20 20 20 72 63 20 3d 20  sg(p);.    rc = 
1e910 70 2d 3e 72 63 3b 0a 20 20 20 20 69 66 28 20 70  p->rc;.    if( p
1e920 7a 45 72 72 6d 73 67 20 29 7b 0a 20 20 20 20 20  zErrmsg ){.     
1e930 20 2a 70 7a 45 72 72 6d 73 67 20 3d 20 70 2d 3e   *pzErrmsg = p->
1e940 7a 45 72 72 6d 73 67 3b 0a 20 20 20 20 7d 65 6c  zErrmsg;.    }el
1e950 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
1e960 33 5f 66 72 65 65 28 70 2d 3e 7a 45 72 72 6d 73  3_free(p->zErrms
1e970 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  g);.    }.    sq
1e980 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 53  lite3_free(p->zS
1e990 74 61 74 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  tate);.    sqlit
1e9a0 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d 65  e3_free(p);.  }e
1e9b0 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  lse{.    rc = SQ
1e9c0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
1e9d0 2a 70 7a 45 72 72 6d 73 67 20 3d 20 30 3b 0a 20  *pzErrmsg = 0;. 
1e9e0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1e9f0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1ea00 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
1ea10 20 6f 66 20 6b 65 79 2d 76 61 6c 75 65 20 6f 70   of key-value op
1ea20 65 72 61 74 69 6f 6e 73 20 28 69 6e 73 65 72 74  erations (insert
1ea30 73 2c 20 64 65 6c 65 74 65 73 20 6f 72 20 0a 2a  s, deletes or .*
1ea40 2a 20 75 70 64 61 74 65 73 29 20 74 68 61 74 20  * updates) that 
1ea50 68 61 76 65 20 62 65 65 6e 20 70 65 72 66 6f 72  have been perfor
1ea60 6d 65 64 20 6f 6e 20 74 68 65 20 74 61 72 67 65  med on the targe
1ea70 74 20 64 61 74 61 62 61 73 65 20 73 69 6e 63 65  t database since
1ea80 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20   the.** current 
1ea90 52 42 55 20 75 70 64 61 74 65 20 77 61 73 20 73  RBU update was s
1eaa0 74 61 72 74 65 64 2e 0a 2a 2f 0a 73 71 6c 69 74  tarted..*/.sqlit
1eab0 65 33 5f 69 6e 74 36 34 20 73 71 6c 69 74 65 33  e3_int64 sqlite3
1eac0 72 62 75 5f 70 72 6f 67 72 65 73 73 28 73 71 6c  rbu_progress(sql
1ead0 69 74 65 33 72 62 75 20 2a 70 52 62 75 29 7b 0a  ite3rbu *pRbu){.
1eae0 20 20 72 65 74 75 72 6e 20 70 52 62 75 2d 3e 6e    return pRbu->n
1eaf0 50 72 6f 67 72 65 73 73 3b 0a 7d 0a 0a 2f 2a 0a  Progress;.}../*.
1eb00 2a 2a 20 52 65 74 75 72 6e 20 70 65 72 6d 79 72  ** Return permyr
1eb10 69 61 64 61 67 65 20 70 72 6f 67 72 65 73 73 20  iadage progress 
1eb20 69 6e 64 69 63 61 74 69 6f 6e 73 20 66 6f 72 20  indications for 
1eb30 74 68 65 20 74 77 6f 20 6d 61 69 6e 20 73 74 61  the two main sta
1eb40 67 65 73 20 6f 66 0a 2a 2a 20 61 6e 20 52 42 55  ges of.** an RBU
1eb50 20 75 70 64 61 74 65 2e 0a 2a 2f 0a 76 6f 69 64   update..*/.void
1eb60 20 73 71 6c 69 74 65 33 72 62 75 5f 62 70 5f 70   sqlite3rbu_bp_p
1eb70 72 6f 67 72 65 73 73 28 73 71 6c 69 74 65 33 72  rogress(sqlite3r
1eb80 62 75 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 4f 6e  bu *p, int *pnOn
1eb90 65 2c 20 69 6e 74 20 2a 70 6e 54 77 6f 29 7b 0a  e, int *pnTwo){.
1eba0 20 20 63 6f 6e 73 74 20 69 6e 74 20 4d 41 58 5f    const int MAX_
1ebb0 50 52 4f 47 52 45 53 53 20 3d 20 31 30 30 30 30  PROGRESS = 10000
1ebc0 3b 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 65  ;.  switch( p->e
1ebd0 53 74 61 67 65 20 29 7b 0a 20 20 20 20 63 61 73  Stage ){.    cas
1ebe0 65 20 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 3a  e RBU_STAGE_OAL:
1ebf0 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 50  .      if( p->nP
1ec00 68 61 73 65 4f 6e 65 53 74 65 70 3e 30 20 29 7b  haseOneStep>0 ){
1ec10 0a 20 20 20 20 20 20 20 20 2a 70 6e 4f 6e 65 20  .        *pnOne 
1ec20 3d 20 28 69 6e 74 29 28 4d 41 58 5f 50 52 4f 47  = (int)(MAX_PROG
1ec30 52 45 53 53 20 2a 20 28 69 36 34 29 70 2d 3e 6e  RESS * (i64)p->n
1ec40 50 72 6f 67 72 65 73 73 2f 28 69 36 34 29 70 2d  Progress/(i64)p-
1ec50 3e 6e 50 68 61 73 65 4f 6e 65 53 74 65 70 29 3b  >nPhaseOneStep);
1ec60 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1ec70 20 20 20 20 20 20 2a 70 6e 4f 6e 65 20 3d 20 2d        *pnOne = -
1ec80 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
1ec90 20 2a 70 6e 54 77 6f 20 3d 20 30 3b 0a 20 20 20   *pnTwo = 0;.   
1eca0 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63     break;..    c
1ecb0 61 73 65 20 52 42 55 5f 53 54 41 47 45 5f 4d 4f  ase RBU_STAGE_MO
1ecc0 56 45 3a 0a 20 20 20 20 20 20 2a 70 6e 4f 6e 65  VE:.      *pnOne
1ecd0 20 3d 20 4d 41 58 5f 50 52 4f 47 52 45 53 53 3b   = MAX_PROGRESS;
1ece0 0a 20 20 20 20 20 20 2a 70 6e 54 77 6f 20 3d 20  .      *pnTwo = 
1ecf0 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  0;.      break;.
1ed00 0a 20 20 20 20 63 61 73 65 20 52 42 55 5f 53 54  .    case RBU_ST
1ed10 41 47 45 5f 43 4b 50 54 3a 0a 20 20 20 20 20 20  AGE_CKPT:.      
1ed20 2a 70 6e 4f 6e 65 20 3d 20 4d 41 58 5f 50 52 4f  *pnOne = MAX_PRO
1ed30 47 52 45 53 53 3b 0a 20 20 20 20 20 20 2a 70 6e  GRESS;.      *pn
1ed40 54 77 6f 20 3d 20 28 69 6e 74 29 28 4d 41 58 5f  Two = (int)(MAX_
1ed50 50 52 4f 47 52 45 53 53 20 2a 20 28 69 36 34 29  PROGRESS * (i64)
1ed60 70 2d 3e 6e 53 74 65 70 20 2f 20 28 69 36 34 29  p->nStep / (i64)
1ed70 70 2d 3e 6e 46 72 61 6d 65 29 3b 0a 20 20 20 20  p->nFrame);.    
1ed80 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61    break;..    ca
1ed90 73 65 20 52 42 55 5f 53 54 41 47 45 5f 44 4f 4e  se RBU_STAGE_DON
1eda0 45 3a 0a 20 20 20 20 20 20 2a 70 6e 4f 6e 65 20  E:.      *pnOne 
1edb0 3d 20 4d 41 58 5f 50 52 4f 47 52 45 53 53 3b 0a  = MAX_PROGRESS;.
1edc0 20 20 20 20 20 20 2a 70 6e 54 77 6f 20 3d 20 4d        *pnTwo = M
1edd0 41 58 5f 50 52 4f 47 52 45 53 53 3b 0a 20 20 20  AX_PROGRESS;.   
1ede0 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 64     break;..    d
1edf0 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 61 73  efault:.      as
1ee00 73 65 72 74 28 20 30 20 29 3b 0a 20 20 7d 0a 7d  sert( 0 );.  }.}
1ee10 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1ee20 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65  he current state
1ee30 20 6f 66 20 74 68 65 20 52 42 55 20 76 61 63 75   of the RBU vacu
1ee40 75 6d 20 6f 72 20 75 70 64 61 74 65 20 6f 70 65  um or update ope
1ee50 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  ration..*/.int s
1ee60 71 6c 69 74 65 33 72 62 75 5f 73 74 61 74 65 28  qlite3rbu_state(
1ee70 73 71 6c 69 74 65 33 72 62 75 20 2a 70 29 7b 0a  sqlite3rbu *p){.
1ee80 20 20 69 6e 74 20 61 52 65 73 5b 5d 20 3d 20 7b    int aRes[] = {
1ee90 0a 20 20 20 20 30 2c 20 53 51 4c 49 54 45 5f 52  .    0, SQLITE_R
1eea0 42 55 5f 53 54 41 54 45 5f 4f 41 4c 2c 20 53 51  BU_STATE_OAL, SQ
1eeb0 4c 49 54 45 5f 52 42 55 5f 53 54 41 54 45 5f 4d  LITE_RBU_STATE_M
1eec0 4f 56 45 2c 0a 20 20 20 20 30 2c 20 53 51 4c 49  OVE,.    0, SQLI
1eed0 54 45 5f 52 42 55 5f 53 54 41 54 45 5f 43 48 45  TE_RBU_STATE_CHE
1eee0 43 4b 50 4f 49 4e 54 2c 20 53 51 4c 49 54 45 5f  CKPOINT, SQLITE_
1eef0 52 42 55 5f 53 54 41 54 45 5f 44 4f 4e 45 0a 20  RBU_STATE_DONE. 
1ef00 20 7d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 52   };..  assert( R
1ef10 42 55 5f 53 54 41 47 45 5f 4f 41 4c 3d 3d 31 20  BU_STAGE_OAL==1 
1ef20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 52 42 55  );.  assert( RBU
1ef30 5f 53 54 41 47 45 5f 4d 4f 56 45 3d 3d 32 20 29  _STAGE_MOVE==2 )
1ef40 3b 0a 20 20 61 73 73 65 72 74 28 20 52 42 55 5f  ;.  assert( RBU_
1ef50 53 54 41 47 45 5f 43 4b 50 54 3d 3d 34 20 29 3b  STAGE_CKPT==4 );
1ef60 0a 20 20 61 73 73 65 72 74 28 20 52 42 55 5f 53  .  assert( RBU_S
1ef70 54 41 47 45 5f 44 4f 4e 45 3d 3d 35 20 29 3b 0a  TAGE_DONE==5 );.
1ef80 20 20 61 73 73 65 72 74 28 20 61 52 65 73 5b 52    assert( aRes[R
1ef90 42 55 5f 53 54 41 47 45 5f 4f 41 4c 5d 3d 3d 53  BU_STAGE_OAL]==S
1efa0 51 4c 49 54 45 5f 52 42 55 5f 53 54 41 54 45 5f  QLITE_RBU_STATE_
1efb0 4f 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OAL );.  assert(
1efc0 20 61 52 65 73 5b 52 42 55 5f 53 54 41 47 45 5f   aRes[RBU_STAGE_
1efd0 4d 4f 56 45 5d 3d 3d 53 51 4c 49 54 45 5f 52 42  MOVE]==SQLITE_RB
1efe0 55 5f 53 54 41 54 45 5f 4d 4f 56 45 20 29 3b 0a  U_STATE_MOVE );.
1eff0 20 20 61 73 73 65 72 74 28 20 61 52 65 73 5b 52    assert( aRes[R
1f000 42 55 5f 53 54 41 47 45 5f 43 4b 50 54 5d 3d 3d  BU_STAGE_CKPT]==
1f010 53 51 4c 49 54 45 5f 52 42 55 5f 53 54 41 54 45  SQLITE_RBU_STATE
1f020 5f 43 48 45 43 4b 50 4f 49 4e 54 20 29 3b 0a 20  _CHECKPOINT );. 
1f030 20 61 73 73 65 72 74 28 20 61 52 65 73 5b 52 42   assert( aRes[RB
1f040 55 5f 53 54 41 47 45 5f 44 4f 4e 45 5d 3d 3d 53  U_STAGE_DONE]==S
1f050 51 4c 49 54 45 5f 52 42 55 5f 53 54 41 54 45 5f  QLITE_RBU_STATE_
1f060 44 4f 4e 45 20 29 3b 0a 0a 20 20 69 66 28 20 70  DONE );..  if( p
1f070 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc!=SQLITE_OK 
1f080 26 26 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45  && p->rc!=SQLITE
1f090 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 72 65 74  _DONE ){.    ret
1f0a0 75 72 6e 20 53 51 4c 49 54 45 5f 52 42 55 5f 53  urn SQLITE_RBU_S
1f0b0 54 41 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 65  TATE_ERROR;.  }e
1f0c0 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
1f0d0 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 44   p->rc!=SQLITE_D
1f0e0 4f 4e 45 20 7c 7c 20 70 2d 3e 65 53 74 61 67 65  ONE || p->eStage
1f0f0 3d 3d 52 42 55 5f 53 54 41 47 45 5f 44 4f 4e 45  ==RBU_STAGE_DONE
1f100 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1f110 70 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53  p->eStage==RBU_S
1f120 54 41 47 45 5f 4f 41 4c 0a 20 20 20 20 20 20 20  TAGE_OAL.       
1f130 20 20 7c 7c 20 70 2d 3e 65 53 74 61 67 65 3d 3d    || p->eStage==
1f140 52 42 55 5f 53 54 41 47 45 5f 4d 4f 56 45 0a 20  RBU_STAGE_MOVE. 
1f150 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53          || p->eS
1f160 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f  tage==RBU_STAGE_
1f170 43 4b 50 54 0a 20 20 20 20 20 20 20 20 20 7c 7c  CKPT.         ||
1f180 20 70 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f   p->eStage==RBU_
1f190 53 54 41 47 45 5f 44 4f 4e 45 0a 20 20 20 20 29  STAGE_DONE.    )
1f1a0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 61 52 65  ;.    return aRe
1f1b0 73 5b 70 2d 3e 65 53 74 61 67 65 5d 3b 0a 20 20  s[p->eStage];.  
1f1c0 7d 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33  }.}..int sqlite3
1f1d0 72 62 75 5f 73 61 76 65 73 74 61 74 65 28 73 71  rbu_savestate(sq
1f1e0 6c 69 74 65 33 72 62 75 20 2a 70 29 7b 0a 20 20  lite3rbu *p){.  
1f1f0 69 6e 74 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a  int rc = p->rc;.
1f200 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1f210 5f 44 4f 4e 45 20 29 20 72 65 74 75 72 6e 20 53  _DONE ) return S
1f220 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
1f230 65 72 74 28 20 70 2d 3e 65 53 74 61 67 65 3e 3d  ert( p->eStage>=
1f240 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20 26 26  RBU_STAGE_OAL &&
1f250 20 70 2d 3e 65 53 74 61 67 65 3c 3d 52 42 55 5f   p->eStage<=RBU_
1f260 53 54 41 47 45 5f 44 4f 4e 45 20 29 3b 0a 20 20  STAGE_DONE );.  
1f270 69 66 28 20 70 2d 3e 65 53 74 61 67 65 3d 3d 52  if( p->eStage==R
1f280 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20 29 7b 0a  BU_STAGE_OAL ){.
1f290 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
1f2a0 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
1f2b0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1f2c0 45 5f 4f 4b 20 29 20 72 63 20 3d 20 73 71 6c 69  E_OK ) rc = sqli
1f2d0 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 4d 61  te3_exec(p->dbMa
1f2e0 69 6e 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c  in, "COMMIT", 0,
1f2f0 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f   0, 0);.  }..  /
1f300 2a 20 53 79 6e 63 20 74 68 65 20 64 62 20 66 69  * Sync the db fi
1f310 6c 65 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  le */.  if( rc==
1f320 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e  SQLITE_OK && p->
1f330 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47  eStage==RBU_STAG
1f340 45 5f 43 4b 50 54 20 29 7b 0a 20 20 20 20 73 71  E_CKPT ){.    sq
1f350 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 44 62 20  lite3_file *pDb 
1f360 3d 20 70 2d 3e 70 54 61 72 67 65 74 46 64 2d 3e  = p->pTargetFd->
1f370 70 52 65 61 6c 3b 0a 20 20 20 20 72 63 20 3d 20  pReal;.    rc = 
1f380 70 44 62 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78  pDb->pMethods->x
1f390 53 79 6e 63 28 70 44 62 2c 20 53 51 4c 49 54 45  Sync(pDb, SQLITE
1f3a0 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20  _SYNC_NORMAL);. 
1f3b0 20 7d 0a 0a 20 20 70 2d 3e 72 63 20 3d 20 72 63   }..  p->rc = rc
1f3c0 3b 0a 20 20 72 62 75 53 61 76 65 53 74 61 74 65  ;.  rbuSaveState
1f3d0 28 70 2c 20 70 2d 3e 65 53 74 61 67 65 29 3b 0a  (p, p->eStage);.
1f3e0 20 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 0a 20    rc = p->rc;.. 
1f3f0 20 69 66 28 20 70 2d 3e 65 53 74 61 67 65 3d 3d   if( p->eStage==
1f400 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20 29 7b  RBU_STAGE_OAL ){
1f410 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
1f420 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
1f430 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1f440 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 73 71 6c  TE_OK ) rc = sql
1f450 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 52  ite3_exec(p->dbR
1f460 62 75 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c  bu, "COMMIT", 0,
1f470 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   0, 0);.    if( 
1f480 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1f490 20 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68   .      const ch
1f4a0 61 72 20 2a 7a 42 65 67 69 6e 20 3d 20 72 62 75  ar *zBegin = rbu
1f4b0 49 73 56 61 63 75 75 6d 28 70 29 20 3f 20 22 42  IsVacuum(p) ? "B
1f4c0 45 47 49 4e 22 20 3a 20 22 42 45 47 49 4e 20 49  EGIN" : "BEGIN I
1f4d0 4d 4d 45 44 49 41 54 45 22 3b 0a 20 20 20 20 20  MMEDIATE";.     
1f4e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78   rc = sqlite3_ex
1f4f0 65 63 28 70 2d 3e 64 62 52 62 75 2c 20 7a 42 65  ec(p->dbRbu, zBe
1f500 67 69 6e 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  gin, 0, 0, 0);. 
1f510 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
1f520 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20  =SQLITE_OK ) rc 
1f530 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70  = sqlite3_exec(p
1f540 2d 3e 64 62 4d 61 69 6e 2c 20 22 42 45 47 49 4e  ->dbMain, "BEGIN
1f550 20 49 4d 4d 45 44 49 41 54 45 22 2c 20 30 2c 20   IMMEDIATE", 0, 
1f560 30 2c 30 29 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e  0,0);.  }..  p->
1f570 72 63 20 3d 20 72 63 3b 0a 20 20 72 65 74 75 72  rc = rc;.  retur
1f580 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a  n rc;.}../******
1f590 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f5a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f5b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f5c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f5d0 2a 2a 2a 2a 0a 2a 2a 20 42 65 67 69 6e 6e 69 6e  ****.** Beginnin
1f5e0 67 20 6f 66 20 52 42 55 20 56 46 53 20 73 68 69  g of RBU VFS shi
1f5f0 6d 20 6d 65 74 68 6f 64 73 2e 20 54 68 65 20 56  m methods. The V
1f600 46 53 20 73 68 69 6d 20 6d 6f 64 69 66 69 65 73  FS shim modifies
1f610 20 74 68 65 20 62 65 68 61 76 69 6f 75 72 0a 2a   the behaviour.*
1f620 2a 20 6f 66 20 61 20 73 74 61 6e 64 61 72 64 20  * of a standard 
1f630 56 46 53 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f  VFS in the follo
1f640 77 69 6e 67 20 77 61 79 73 3a 0a 2a 2a 0a 2a 2a  wing ways:.**.**
1f650 20 31 2e 20 57 68 65 6e 65 76 65 72 20 74 68 65   1. Whenever the
1f660 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 61   first page of a
1f670 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66   main database f
1f680 69 6c 65 20 69 73 20 72 65 61 64 20 6f 72 20 0a  ile is read or .
1f690 2a 2a 20 20 20 20 77 72 69 74 74 65 6e 2c 20 74  **    written, t
1f6a0 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
1f6b0 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 63  change-counter c
1f6c0 6f 6f 6b 69 65 20 69 73 20 73 74 6f 72 65 64 20  ookie is stored 
1f6d0 69 6e 0a 2a 2a 20 20 20 20 72 62 75 5f 66 69 6c  in.**    rbu_fil
1f6e0 65 2e 69 43 6f 6f 6b 69 65 2e 20 53 69 6d 69 6c  e.iCookie. Simil
1f6f0 61 72 6c 79 2c 20 74 68 65 20 76 61 6c 75 65 20  arly, the value 
1f700 6f 66 20 74 68 65 20 22 77 72 69 74 65 2d 76 65  of the "write-ve
1f710 72 73 69 6f 6e 22 0a 2a 2a 20 20 20 20 64 61 74  rsion".**    dat
1f720 61 62 61 73 65 20 68 65 61 64 65 72 20 66 69 65  abase header fie
1f730 6c 64 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  ld is stored in 
1f740 72 62 75 5f 66 69 6c 65 2e 69 57 72 69 74 65 56  rbu_file.iWriteV
1f750 65 72 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73  er. This ensures
1f760 0a 2a 2a 20 20 20 20 74 68 61 74 20 74 68 65 20  .**    that the 
1f770 76 61 6c 75 65 73 20 61 72 65 20 61 6c 77 61 79  values are alway
1f780 73 20 74 72 75 73 74 77 6f 72 74 68 79 20 77 69  s trustworthy wi
1f790 74 68 69 6e 20 61 6e 20 6f 70 65 6e 20 74 72 61  thin an open tra
1f7a0 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
1f7b0 32 2e 20 57 68 65 6e 65 76 65 72 20 61 6e 20 53  2. Whenever an S
1f7c0 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 66  QLITE_OPEN_WAL f
1f7d0 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 2c 20 74  ile is opened, t
1f7e0 68 65 20 28 72 62 75 5f 66 69 6c 65 2e 70 57 61  he (rbu_file.pWa
1f7f0 6c 46 64 29 0a 2a 2a 20 20 20 20 6d 65 6d 62 65  lFd).**    membe
1f800 72 20 76 61 72 69 61 62 6c 65 20 6f 66 20 74 68  r variable of th
1f810 65 20 61 73 73 6f 63 69 61 74 65 64 20 64 61 74  e associated dat
1f820 61 62 61 73 65 20 66 69 6c 65 20 64 65 73 63 72  abase file descr
1f830 69 70 74 6f 72 20 69 73 20 73 65 74 0a 2a 2a 20  iptor is set.** 
1f840 20 20 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74     to point to t
1f850 68 65 20 6e 65 77 20 66 69 6c 65 2e 20 41 20 6d  he new file. A m
1f860 75 74 65 78 20 70 72 6f 74 65 63 74 65 64 20 6c  utex protected l
1f870 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 61 6c  inked list of al
1f880 6c 20 6d 61 69 6e 20 0a 2a 2a 20 20 20 20 64 62  l main .**    db
1f890 20 66 64 73 20 6f 70 65 6e 65 64 20 75 73 69 6e   fds opened usin
1f8a0 67 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 52  g a particular R
1f8b0 42 55 20 56 46 53 20 69 73 20 6d 61 69 6e 74 61  BU VFS is mainta
1f8c0 69 6e 65 64 20 61 74 20 0a 2a 2a 20 20 20 20 72  ined at .**    r
1f8d0 62 75 5f 76 66 73 2e 70 4d 61 69 6e 20 74 6f 20  bu_vfs.pMain to 
1f8e0 66 61 63 69 6c 69 74 61 74 65 20 74 68 69 73 2e  facilitate this.
1f8f0 0a 2a 2a 0a 2a 2a 20 33 2e 20 55 73 69 6e 67 20  .**.** 3. Using 
1f900 61 20 6e 65 77 20 66 69 6c 65 2d 63 6f 6e 74 72  a new file-contr
1f910 6f 6c 20 22 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ol "SQLITE_FCNTL
1f920 5f 52 42 55 22 2c 20 61 20 6d 61 69 6e 20 64 62  _RBU", a main db
1f930 20 72 62 75 5f 66 69 6c 65 20 0a 2a 2a 20 20 20   rbu_file .**   
1f940 20 6f 62 6a 65 63 74 20 63 61 6e 20 62 65 20 6d   object can be m
1f950 61 72 6b 65 64 20 61 73 20 74 68 65 20 74 61 72  arked as the tar
1f960 67 65 74 20 64 61 74 61 62 61 73 65 20 6f 66 20  get database of 
1f970 61 6e 20 52 42 55 20 75 70 64 61 74 65 2e 20 54  an RBU update. T
1f980 68 69 73 0a 2a 2a 20 20 20 20 74 75 72 6e 73 20  his.**    turns 
1f990 6f 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  on the following
1f9a0 20 65 78 74 72 61 20 73 70 65 63 69 61 6c 20 62   extra special b
1f9b0 65 68 61 76 69 6f 75 72 3a 0a 2a 2a 0a 2a 2a 20  ehaviour:.**.** 
1f9c0 33 61 2e 20 49 66 20 78 41 63 63 65 73 73 28 29  3a. If xAccess()
1f9d0 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 68   is called to ch
1f9e0 65 63 6b 20 69 66 20 74 68 65 72 65 20 65 78 69  eck if there exi
1f9f0 73 74 73 20 61 20 2a 2d 77 61 6c 20 66 69 6c 65  sts a *-wal file
1fa00 20 0a 2a 2a 20 20 20 20 20 61 73 73 6f 63 69 61   .**     associa
1fa10 74 65 64 20 77 69 74 68 20 61 6e 20 52 42 55 20  ted with an RBU 
1fa20 74 61 72 67 65 74 20 64 61 74 61 62 61 73 65 20  target database 
1fa30 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 52 42 55  currently in RBU
1fa40 5f 53 54 41 47 45 5f 4f 41 4c 0a 2a 2a 20 20 20  _STAGE_OAL.**   
1fa50 20 20 73 74 61 67 65 20 28 70 72 65 70 61 72 69    stage (prepari
1fa60 6e 67 20 74 68 65 20 2a 2d 6f 61 6c 20 66 69 6c  ng the *-oal fil
1fa70 65 29 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  e), the followin
1fa80 67 20 73 70 65 63 69 61 6c 20 68 61 6e 64 6c 69  g special handli
1fa90 6e 67 0a 2a 2a 20 20 20 20 20 61 70 70 6c 69 65  ng.**     applie
1faa0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 2a 20  s:.**.**      * 
1fab0 69 66 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c  if the *-wal fil
1fac0 65 20 64 6f 65 73 20 65 78 69 73 74 2c 20 72 65  e does exist, re
1fad0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54  turn SQLITE_CANT
1fae0 4f 50 45 4e 2e 20 41 6e 20 52 42 55 0a 2a 2a 20  OPEN. An RBU.** 
1faf0 20 20 20 20 20 20 20 74 61 72 67 65 74 20 64 61         target da
1fb00 74 61 62 61 73 65 20 6d 61 79 20 6e 6f 74 20 62  tabase may not b
1fb10 65 20 69 6e 20 77 61 6c 20 6d 6f 64 65 20 61 6c  e in wal mode al
1fb20 72 65 61 64 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ready..**.**    
1fb30 20 20 2a 20 69 66 20 74 68 65 20 2a 2d 77 61 6c    * if the *-wal
1fb40 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65   file does not e
1fb50 78 69 73 74 2c 20 73 65 74 20 74 68 65 20 6f 75  xist, set the ou
1fb60 74 70 75 74 20 70 61 72 61 6d 65 74 65 72 20 74  tput parameter t
1fb70 6f 0a 2a 2a 20 20 20 20 20 20 20 20 6e 6f 6e 2d  o.**        non-
1fb80 7a 65 72 6f 20 28 74 6f 20 74 65 6c 6c 20 53 51  zero (to tell SQ
1fb90 4c 69 74 65 20 74 68 61 74 20 69 74 20 64 6f 65  Lite that it doe
1fba0 73 20 65 78 69 73 74 29 20 61 6e 79 77 61 79 2e  s exist) anyway.
1fbb0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 54 68 65 6e 2c  .**.**     Then,
1fbc0 20 77 68 65 6e 20 78 4f 70 65 6e 28 29 20 69 73   when xOpen() is
1fbd0 20 63 61 6c 6c 65 64 20 74 6f 20 6f 70 65 6e 20   called to open 
1fbe0 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 61  the *-wal file a
1fbf0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a  ssociated with.*
1fc00 2a 20 20 20 20 20 74 68 65 20 52 42 55 20 74 61  *     the RBU ta
1fc10 72 67 65 74 20 69 6e 20 52 42 55 5f 53 54 41 47  rget in RBU_STAG
1fc20 45 5f 4f 41 4c 20 73 74 61 67 65 2c 20 69 6e 73  E_OAL stage, ins
1fc30 74 65 61 64 20 6f 66 20 6f 70 65 6e 69 6e 67 20  tead of opening 
1fc40 74 68 65 20 2a 2d 77 61 6c 0a 2a 2a 20 20 20 20  the *-wal.**    
1fc50 20 66 69 6c 65 2c 20 74 68 65 20 72 62 75 20 76   file, the rbu v
1fc60 66 73 20 6f 70 65 6e 73 20 74 68 65 20 63 6f 72  fs opens the cor
1fc70 72 65 73 70 6f 6e 64 69 6e 67 20 2a 2d 6f 61 6c  responding *-oal
1fc80 20 66 69 6c 65 20 69 6e 73 74 65 61 64 2e 20 0a   file instead. .
1fc90 2a 2a 0a 2a 2a 20 33 62 2e 20 54 68 65 20 2a 2d  **.** 3b. The *-
1fca0 73 68 6d 20 70 61 67 65 73 20 72 65 74 75 72 6e  shm pages return
1fcb0 65 64 20 62 79 20 78 53 68 6d 4d 61 70 28 29 20  ed by xShmMap() 
1fcc0 66 6f 72 20 61 20 74 61 72 67 65 74 20 64 62 20  for a target db 
1fcd0 66 69 6c 65 20 69 6e 0a 2a 2a 20 20 20 20 20 52  file in.**     R
1fce0 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20 6d 6f 64  BU_STAGE_OAL mod
1fcf0 65 20 61 72 65 20 61 63 74 75 61 6c 6c 79 20 73  e are actually s
1fd00 74 6f 72 65 64 20 69 6e 20 68 65 61 70 20 6d 65  tored in heap me
1fd10 6d 6f 72 79 2e 20 54 68 69 73 20 69 73 20 74 6f  mory. This is to
1fd20 0a 2a 2a 20 20 20 20 20 61 76 6f 69 64 20 63 72  .**     avoid cr
1fd30 65 61 74 69 6e 67 20 61 20 2a 2d 73 68 6d 20 66  eating a *-shm f
1fd40 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 41 64 64  ile on disk. Add
1fd50 69 74 69 6f 6e 61 6c 6c 79 2c 20 78 53 68 6d 4c  itionally, xShmL
1fd60 6f 63 6b 28 29 20 63 61 6c 6c 73 0a 2a 2a 20 20  ock() calls.**  
1fd70 20 20 20 61 72 65 20 6e 6f 2d 6f 70 73 20 6f 6e     are no-ops on
1fd80 20 74 61 72 67 65 74 20 64 61 74 61 62 61 73 65   target database
1fd90 20 66 69 6c 65 73 20 69 6e 20 52 42 55 5f 53 54   files in RBU_ST
1fda0 41 47 45 5f 4f 41 4c 20 6d 6f 64 65 2e 20 54 68  AGE_OAL mode. Th
1fdb0 69 73 20 69 73 0a 2a 2a 20 20 20 20 20 62 65 63  is is.**     bec
1fdc0 61 75 73 65 20 61 73 73 65 72 74 28 29 20 73 74  ause assert() st
1fdd0 61 74 65 6d 65 6e 74 73 20 69 6e 20 73 6f 6d 65  atements in some
1fde0 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74 61 74   VFS implementat
1fdf0 69 6f 6e 73 20 66 61 69 6c 20 69 66 20 0a 2a 2a  ions fail if .**
1fe00 20 20 20 20 20 78 53 68 6d 4c 6f 63 6b 28 29 20       xShmLock() 
1fe10 69 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65  is called before
1fe20 20 78 53 68 6d 4d 61 70 28 29 2e 0a 2a 2a 0a 2a   xShmMap()..**.*
1fe30 2a 20 33 63 2e 20 49 66 20 61 6e 20 45 58 43 4c  * 3c. If an EXCL
1fe40 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20 61 74  USIVE lock is at
1fe50 74 65 6d 70 74 65 64 20 6f 6e 20 61 20 74 61 72  tempted on a tar
1fe60 67 65 74 20 64 61 74 61 62 61 73 65 20 66 69 6c  get database fil
1fe70 65 20 69 6e 20 61 6e 79 0a 2a 2a 20 20 20 20 20  e in any.**     
1fe80 6d 6f 64 65 20 65 78 63 65 70 74 20 52 42 55 5f  mode except RBU_
1fe90 53 54 41 47 45 5f 44 4f 4e 45 20 28 61 6c 6c 20  STAGE_DONE (all 
1fea0 77 6f 72 6b 20 63 6f 6d 70 6c 65 74 65 64 20 61  work completed a
1feb0 6e 64 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 29  nd checkpointed)
1fec0 2c 20 69 74 20 0a 2a 2a 20 20 20 20 20 66 61 69  , it .**     fai
1fed0 6c 73 20 77 69 74 68 20 61 6e 20 53 51 4c 49 54  ls with an SQLIT
1fee0 45 5f 42 55 53 59 20 65 72 72 6f 72 2e 20 54 68  E_BUSY error. Th
1fef0 69 73 20 69 73 20 74 6f 20 73 74 6f 70 20 52 42  is is to stop RB
1ff00 55 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a  U connections.**
1ff10 20 20 20 20 20 66 72 6f 6d 20 61 75 74 6f 6d 61       from automa
1ff20 74 69 63 61 6c 6c 79 20 63 68 65 63 6b 70 6f 69  tically checkpoi
1ff30 6e 74 69 6e 67 20 61 20 2a 2d 77 61 6c 20 28 6f  nting a *-wal (o
1ff40 72 20 2a 2d 6f 61 6c 29 20 66 69 6c 65 20 66 72  r *-oal) file fr
1ff50 6f 6d 20 77 69 74 68 69 6e 0a 2a 2a 20 20 20 20  om within.**    
1ff60 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 29   sqlite3_close()
1ff70 2e 0a 2a 2a 0a 2a 2a 20 33 64 2e 20 49 6e 20 52  ..**.** 3d. In R
1ff80 42 55 5f 53 54 41 47 45 5f 43 41 50 54 55 52 45  BU_STAGE_CAPTURE
1ff90 20 6d 6f 64 65 2c 20 61 6c 6c 20 78 52 65 61 64   mode, all xRead
1ffa0 28 29 20 63 61 6c 6c 73 20 6f 6e 20 74 68 65 20  () calls on the 
1ffb0 77 61 6c 20 66 69 6c 65 2c 20 61 6e 64 0a 2a 2a  wal file, and.**
1ffc0 20 20 20 20 20 61 6c 6c 20 78 57 72 69 74 65 28       all xWrite(
1ffd0 29 20 63 61 6c 6c 73 20 6f 6e 20 74 68 65 20 74  ) calls on the t
1ffe0 61 72 67 65 74 20 64 61 74 61 62 61 73 65 20 66  arget database f
1fff0 69 6c 65 20 70 65 72 66 6f 72 6d 20 6e 6f 20 49  ile perform no I
20000 4f 2e 20 0a 2a 2a 20 20 20 20 20 49 6e 73 74 65  O. .**     Inste
20010 61 64 20 74 68 65 20 66 72 61 6d 65 20 61 6e 64  ad the frame and
20020 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 74 68   page numbers th
20030 61 74 20 77 6f 75 6c 64 20 62 65 20 72 65 61 64  at would be read
20040 20 61 6e 64 20 77 72 69 74 74 65 6e 0a 2a 2a 20   and written.** 
20050 20 20 20 20 61 72 65 20 72 65 63 6f 72 64 65 64      are recorded
20060 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20  . Additionally, 
20070 73 75 63 63 65 73 73 66 75 6c 20 61 74 74 65 6d  successful attem
20080 70 74 73 20 74 6f 20 6f 62 74 61 69 6e 20 65 78  pts to obtain ex
20090 63 6c 75 73 69 76 65 0a 2a 2a 20 20 20 20 20 78  clusive.**     x
200a0 53 68 6d 4c 6f 63 6b 28 29 20 57 52 49 54 45 52  ShmLock() WRITER
200b0 2c 20 43 48 45 43 4b 50 4f 49 4e 54 45 52 20 61  , CHECKPOINTER a
200c0 6e 64 20 52 45 41 44 30 20 6c 6f 63 6b 73 20 6f  nd READ0 locks o
200d0 6e 20 74 68 65 20 74 61 72 67 65 74 20 0a 2a 2a  n the target .**
200e0 20 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69       database fi
200f0 6c 65 20 61 72 65 20 72 65 63 6f 72 64 65 64 2e  le are recorded.
20100 20 78 53 68 6d 4c 6f 63 6b 28 29 20 63 61 6c 6c   xShmLock() call
20110 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20  s to unlock the 
20120 73 61 6d 65 0a 2a 2a 20 20 20 20 20 6c 6f 63 6b  same.**     lock
20130 73 20 61 72 65 20 6e 6f 2d 6f 70 73 20 28 73 6f  s are no-ops (so
20140 20 74 68 61 74 20 6f 6e 63 65 20 6f 62 74 61 69   that once obtai
20150 6e 65 64 2c 20 74 68 65 73 65 20 6c 6f 63 6b 73  ned, these locks
20160 20 61 72 65 20 6e 65 76 65 72 0a 2a 2a 20 20 20   are never.**   
20170 20 20 72 65 6c 69 6e 71 75 69 73 68 65 64 29 2e    relinquished).
20180 20 46 69 6e 61 6c 6c 79 2c 20 63 61 6c 6c 73 20   Finally, calls 
20190 74 6f 20 78 53 79 6e 63 28 29 20 6f 6e 20 74 68  to xSync() on th
201a0 65 20 74 61 72 67 65 74 20 64 61 74 61 62 61 73  e target databas
201b0 65 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20 66 61  e.**     file fa
201c0 69 6c 20 77 69 74 68 20 53 51 4c 49 54 45 5f 49  il with SQLITE_I
201d0 4e 54 45 52 4e 41 4c 20 65 72 72 6f 72 73 2e 0a  NTERNAL errors..
201e0 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  */..static void 
201f0 72 62 75 55 6e 6c 6f 63 6b 53 68 6d 28 72 62 75  rbuUnlockShm(rbu
20200 5f 66 69 6c 65 20 2a 70 29 7b 0a 20 20 61 73 73  _file *p){.  ass
20210 65 72 74 28 20 70 2d 3e 6f 70 65 6e 46 6c 61 67  ert( p->openFlag
20220 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
20230 4d 41 49 4e 5f 44 42 20 29 3b 0a 20 20 69 66 28  MAIN_DB );.  if(
20240 20 70 2d 3e 70 52 62 75 20 29 7b 0a 20 20 20 20   p->pRbu ){.    
20250 69 6e 74 20 28 2a 78 53 68 6d 4c 6f 63 6b 29 28  int (*xShmLock)(
20260 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 69 6e  sqlite3_file*,in
20270 74 2c 69 6e 74 2c 69 6e 74 29 20 3d 20 70 2d 3e  t,int,int) = p->
20280 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d  pReal->pMethods-
20290 3e 78 53 68 6d 4c 6f 63 6b 3b 0a 20 20 20 20 69  >xShmLock;.    i
202a0 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
202b0 30 3b 20 69 3c 53 51 4c 49 54 45 5f 53 48 4d 5f  0; i<SQLITE_SHM_
202c0 4e 4c 4f 43 4b 3b 69 2b 2b 29 7b 0a 20 20 20 20  NLOCK;i++){.    
202d0 20 20 69 66 28 20 28 31 3c 3c 69 29 20 26 20 70    if( (1<<i) & p
202e0 2d 3e 70 52 62 75 2d 3e 6d 4c 6f 63 6b 20 29 7b  ->pRbu->mLock ){
202f0 0a 20 20 20 20 20 20 20 20 78 53 68 6d 4c 6f 63  .        xShmLoc
20300 6b 28 70 2d 3e 70 52 65 61 6c 2c 20 69 2c 20 31  k(p->pReal, i, 1
20310 2c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c  , SQLITE_SHM_UNL
20320 4f 43 4b 7c 53 51 4c 49 54 45 5f 53 48 4d 5f 45  OCK|SQLITE_SHM_E
20330 58 43 4c 55 53 49 56 45 29 3b 0a 20 20 20 20 20  XCLUSIVE);.     
20340 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e   }.    }.    p->
20350 70 52 62 75 2d 3e 6d 4c 6f 63 6b 20 3d 20 30 3b  pRbu->mLock = 0;
20360 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2f 0a 73 74  .  }.}../*.*/.st
20370 61 74 69 63 20 69 6e 74 20 72 62 75 55 70 64 61  atic int rbuUpda
20380 74 65 54 65 6d 70 53 69 7a 65 28 72 62 75 5f 66  teTempSize(rbu_f
20390 69 6c 65 20 2a 70 46 64 2c 20 73 71 6c 69 74 65  ile *pFd, sqlite
203a0 33 5f 69 6e 74 36 34 20 6e 4e 65 77 29 7b 0a 20  3_int64 nNew){. 
203b0 20 73 71 6c 69 74 65 33 72 62 75 20 2a 70 52 62   sqlite3rbu *pRb
203c0 75 20 3d 20 70 46 64 2d 3e 70 52 62 75 3b 0a 20  u = pFd->pRbu;. 
203d0 20 69 36 34 20 6e 44 69 66 66 20 3d 20 6e 4e 65   i64 nDiff = nNe
203e0 77 20 2d 20 70 46 64 2d 3e 73 7a 3b 0a 20 20 70  w - pFd->sz;.  p
203f0 52 62 75 2d 3e 73 7a 54 65 6d 70 20 2b 3d 20 6e  Rbu->szTemp += n
20400 44 69 66 66 3b 0a 20 20 70 46 64 2d 3e 73 7a 20  Diff;.  pFd->sz 
20410 3d 20 6e 4e 65 77 3b 0a 20 20 61 73 73 65 72 74  = nNew;.  assert
20420 28 20 70 52 62 75 2d 3e 73 7a 54 65 6d 70 3e 3d  ( pRbu->szTemp>=
20430 30 20 29 3b 0a 20 20 69 66 28 20 70 52 62 75 2d  0 );.  if( pRbu-
20440 3e 73 7a 54 65 6d 70 4c 69 6d 69 74 20 26 26 20  >szTempLimit && 
20450 70 52 62 75 2d 3e 73 7a 54 65 6d 70 3e 70 52 62  pRbu->szTemp>pRb
20460 75 2d 3e 73 7a 54 65 6d 70 4c 69 6d 69 74 20 29  u->szTempLimit )
20470 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46   return SQLITE_F
20480 55 4c 4c 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ULL;.  return SQ
20490 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
204a0 2a 20 41 64 64 20 61 6e 20 69 74 65 6d 20 74 6f  * Add an item to
204b0 20 74 68 65 20 6d 61 69 6e 2d 64 62 20 6c 69 73   the main-db lis
204c0 74 73 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74  ts, if it is not
204d0 20 61 6c 72 65 61 64 79 20 70 72 65 73 65 6e 74   already present
204e0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72  ..**.** There ar
204f0 65 20 74 77 6f 20 6d 61 69 6e 2d 64 62 20 6c 69  e two main-db li
20500 73 74 73 2e 20 4f 6e 65 20 66 6f 72 20 61 6c 6c  sts. One for all
20510 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
20520 73 2c 20 61 6e 64 20 6f 6e 65 0a 2a 2a 20 66 6f  s, and one.** fo
20530 72 20 61 6c 6c 20 66 69 6c 65 20 64 65 73 63 72  r all file descr
20540 69 70 74 6f 72 73 20 77 69 74 68 20 72 62 75 5f  iptors with rbu_
20550 66 69 6c 65 2e 70 44 62 21 3d 30 2e 20 49 66 20  file.pDb!=0. If 
20560 74 68 65 20 61 72 67 75 6d 65 6e 74 20 68 61 73  the argument has
20570 0a 2a 2a 20 72 62 75 5f 66 69 6c 65 2e 70 44 62  .** rbu_file.pDb
20580 21 3d 30 2c 20 74 68 65 6e 20 69 74 20 69 73 20  !=0, then it is 
20590 61 73 73 75 6d 65 64 20 74 6f 20 61 6c 72 65 61  assumed to alrea
205a0 64 79 20 62 65 20 70 72 65 73 65 6e 74 20 6f 6e  dy be present on
205b0 20 74 68 65 0a 2a 2a 20 6d 61 69 6e 20 6c 69 73   the.** main lis
205c0 74 20 61 6e 64 20 69 73 20 6f 6e 6c 79 20 61 64  t and is only ad
205d0 64 65 64 20 74 6f 20 74 68 65 20 70 44 62 21 3d  ded to the pDb!=
205e0 30 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  0 list..*/.stati
205f0 63 20 76 6f 69 64 20 72 62 75 4d 61 69 6e 6c 69  c void rbuMainli
20600 73 74 41 64 64 28 72 62 75 5f 66 69 6c 65 20 2a  stAdd(rbu_file *
20610 70 29 7b 0a 20 20 72 62 75 5f 76 66 73 20 2a 70  p){.  rbu_vfs *p
20620 52 62 75 56 66 73 20 3d 20 70 2d 3e 70 52 62 75  RbuVfs = p->pRbu
20630 56 66 73 3b 0a 20 20 72 62 75 5f 66 69 6c 65 20  Vfs;.  rbu_file 
20640 2a 70 49 74 65 72 3b 0a 20 20 61 73 73 65 72 74  *pIter;.  assert
20650 28 20 28 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20  ( (p->openFlags 
20660 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  & SQLITE_OPEN_MA
20670 49 4e 5f 44 42 29 20 29 3b 0a 20 20 73 71 6c 69  IN_DB) );.  sqli
20680 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
20690 70 52 62 75 56 66 73 2d 3e 6d 75 74 65 78 29 3b  pRbuVfs->mutex);
206a0 0a 20 20 69 66 28 20 70 2d 3e 70 52 62 75 3d 3d  .  if( p->pRbu==
206b0 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 70 49 74  0 ){.    for(pIt
206c0 65 72 3d 70 52 62 75 56 66 73 2d 3e 70 4d 61 69  er=pRbuVfs->pMai
206d0 6e 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d  n; pIter; pIter=
206e0 70 49 74 65 72 2d 3e 70 4d 61 69 6e 4e 65 78 74  pIter->pMainNext
206f0 29 3b 0a 20 20 20 20 70 2d 3e 70 4d 61 69 6e 4e  );.    p->pMainN
20700 65 78 74 20 3d 20 70 52 62 75 56 66 73 2d 3e 70  ext = pRbuVfs->p
20710 4d 61 69 6e 3b 0a 20 20 20 20 70 52 62 75 56 66  Main;.    pRbuVf
20720 73 2d 3e 70 4d 61 69 6e 20 3d 20 70 3b 0a 20 20  s->pMain = p;.  
20730 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 70  }else{.    for(p
20740 49 74 65 72 3d 70 52 62 75 56 66 73 2d 3e 70 4d  Iter=pRbuVfs->pM
20750 61 69 6e 52 62 75 3b 20 70 49 74 65 72 20 26 26  ainRbu; pIter &&
20760 20 70 49 74 65 72 21 3d 70 3b 20 70 49 74 65 72   pIter!=p; pIter
20770 3d 70 49 74 65 72 2d 3e 70 4d 61 69 6e 52 62 75  =pIter->pMainRbu
20780 4e 65 78 74 29 7b 7d 0a 20 20 20 20 69 66 28 20  Next){}.    if( 
20790 70 49 74 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20  pIter==0 ){.    
207a0 20 20 70 2d 3e 70 4d 61 69 6e 52 62 75 4e 65 78    p->pMainRbuNex
207b0 74 20 3d 20 70 52 62 75 56 66 73 2d 3e 70 4d 61  t = pRbuVfs->pMa
207c0 69 6e 52 62 75 3b 0a 20 20 20 20 20 20 70 52 62  inRbu;.      pRb
207d0 75 56 66 73 2d 3e 70 4d 61 69 6e 52 62 75 20 3d  uVfs->pMainRbu =
207e0 20 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   p;.    }.  }.  
207f0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
20800 61 76 65 28 70 52 62 75 56 66 73 2d 3e 6d 75 74  ave(pRbuVfs->mut
20810 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ex);.}../*.** Re
20820 6d 6f 76 65 20 61 6e 20 69 74 65 6d 20 66 72 6f  move an item fro
20830 6d 20 74 68 65 20 6d 61 69 6e 2d 64 62 20 6c 69  m the main-db li
20840 73 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  sts..*/.static v
20850 6f 69 64 20 72 62 75 4d 61 69 6e 6c 69 73 74 52  oid rbuMainlistR
20860 65 6d 6f 76 65 28 72 62 75 5f 66 69 6c 65 20 2a  emove(rbu_file *
20870 70 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a  p){.  rbu_file *
20880 2a 70 70 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  *pp;.  sqlite3_m
20890 75 74 65 78 5f 65 6e 74 65 72 28 70 2d 3e 70 52  utex_enter(p->pR
208a0 62 75 56 66 73 2d 3e 6d 75 74 65 78 29 3b 0a 20  buVfs->mutex);. 
208b0 20 66 6f 72 28 70 70 3d 26 70 2d 3e 70 52 62 75   for(pp=&p->pRbu
208c0 56 66 73 2d 3e 70 4d 61 69 6e 3b 20 2a 70 70 20  Vfs->pMain; *pp 
208d0 26 26 20 2a 70 70 21 3d 70 3b 20 70 70 3d 26 28  && *pp!=p; pp=&(
208e0 28 2a 70 70 29 2d 3e 70 4d 61 69 6e 4e 65 78 74  (*pp)->pMainNext
208f0 29 29 7b 7d 0a 20 20 69 66 28 20 2a 70 70 20 29  )){}.  if( *pp )
20900 20 2a 70 70 20 3d 20 70 2d 3e 70 4d 61 69 6e 4e   *pp = p->pMainN
20910 65 78 74 3b 0a 20 20 70 2d 3e 70 4d 61 69 6e 4e  ext;.  p->pMainN
20920 65 78 74 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70  ext = 0;.  for(p
20930 70 3d 26 70 2d 3e 70 52 62 75 56 66 73 2d 3e 70  p=&p->pRbuVfs->p
20940 4d 61 69 6e 52 62 75 3b 20 2a 70 70 20 26 26 20  MainRbu; *pp && 
20950 2a 70 70 21 3d 70 3b 20 70 70 3d 26 28 28 2a 70  *pp!=p; pp=&((*p
20960 70 29 2d 3e 70 4d 61 69 6e 52 62 75 4e 65 78 74  p)->pMainRbuNext
20970 29 29 7b 7d 0a 20 20 69 66 28 20 2a 70 70 20 29  )){}.  if( *pp )
20980 20 2a 70 70 20 3d 20 70 2d 3e 70 4d 61 69 6e 52   *pp = p->pMainR
20990 62 75 4e 65 78 74 3b 0a 20 20 70 2d 3e 70 4d 61  buNext;.  p->pMa
209a0 69 6e 52 62 75 4e 65 78 74 20 3d 20 30 3b 0a 20  inRbuNext = 0;. 
209b0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
209c0 65 61 76 65 28 70 2d 3e 70 52 62 75 56 66 73 2d  eave(p->pRbuVfs-
209d0 3e 6d 75 74 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  >mutex);.}../*.*
209e0 2a 20 47 69 76 65 6e 20 74 68 61 74 20 7a 57 61  * Given that zWa
209f0 6c 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 62 75  l points to a bu
20a00 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
20a10 61 20 77 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  a wal file name 
20a20 70 61 73 73 65 64 20 74 6f 20 0a 2a 2a 20 65 69  passed to .** ei
20a30 74 68 65 72 20 74 68 65 20 78 4f 70 65 6e 28 29  ther the xOpen()
20a40 20 6f 72 20 78 41 63 63 65 73 73 28 29 20 56 46   or xAccess() VF
20a50 53 20 6d 65 74 68 6f 64 2c 20 73 65 61 72 63 68  S method, search
20a60 20 74 68 65 20 6d 61 69 6e 2d 64 62 20 6c 69 73   the main-db lis
20a70 74 20 66 6f 72 0a 2a 2a 20 61 20 66 69 6c 65 2d  t for.** a file-
20a80 68 61 6e 64 6c 65 20 6f 70 65 6e 65 64 20 62 79  handle opened by
20a90 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61   the same databa
20aa0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 6e  se connection on
20ab0 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
20ac0 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66  ng.** database f
20ad0 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61  ile..**.** If pa
20ae0 72 61 6d 65 74 65 72 20 62 52 62 75 20 69 73 20  rameter bRbu is 
20af0 74 72 75 65 2c 20 6f 6e 6c 79 20 73 65 61 72 63  true, only searc
20b00 68 20 66 6f 72 20 66 69 6c 65 2d 64 65 73 63 72  h for file-descr
20b10 69 70 74 6f 72 73 20 77 69 74 68 0a 2a 2a 20 72  iptors with.** r
20b20 62 75 5f 66 69 6c 65 2e 70 44 62 21 3d 30 2e 0a  bu_file.pDb!=0..
20b30 2a 2f 0a 73 74 61 74 69 63 20 72 62 75 5f 66 69  */.static rbu_fi
20b40 6c 65 20 2a 72 62 75 46 69 6e 64 4d 61 69 6e 64  le *rbuFindMaind
20b50 62 28 72 62 75 5f 76 66 73 20 2a 70 52 62 75 56  b(rbu_vfs *pRbuV
20b60 66 73 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  fs, const char *
20b70 7a 57 61 6c 2c 20 69 6e 74 20 62 52 62 75 29 7b  zWal, int bRbu){
20b80 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 44 62  .  rbu_file *pDb
20b90 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
20ba0 78 5f 65 6e 74 65 72 28 70 52 62 75 56 66 73 2d  x_enter(pRbuVfs-
20bb0 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 62  >mutex);.  if( b
20bc0 52 62 75 20 29 7b 0a 20 20 20 20 66 6f 72 28 70  Rbu ){.    for(p
20bd0 44 62 3d 70 52 62 75 56 66 73 2d 3e 70 4d 61 69  Db=pRbuVfs->pMai
20be0 6e 52 62 75 3b 20 70 44 62 20 26 26 20 70 44 62  nRbu; pDb && pDb
20bf0 2d 3e 7a 57 61 6c 21 3d 7a 57 61 6c 3b 20 70 44  ->zWal!=zWal; pD
20c00 62 3d 70 44 62 2d 3e 70 4d 61 69 6e 52 62 75 4e  b=pDb->pMainRbuN
20c10 65 78 74 29 7b 7d 0a 20 20 7d 65 6c 73 65 7b 0a  ext){}.  }else{.
20c20 20 20 20 20 66 6f 72 28 70 44 62 3d 70 52 62 75      for(pDb=pRbu
20c30 56 66 73 2d 3e 70 4d 61 69 6e 3b 20 70 44 62 20  Vfs->pMain; pDb 
20c40 26 26 20 70 44 62 2d 3e 7a 57 61 6c 21 3d 7a 57  && pDb->zWal!=zW
20c50 61 6c 3b 20 70 44 62 3d 70 44 62 2d 3e 70 4d 61  al; pDb=pDb->pMa
20c60 69 6e 4e 65 78 74 29 7b 7d 0a 20 20 7d 0a 20 20  inNext){}.  }.  
20c70 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
20c80 61 76 65 28 70 52 62 75 56 66 73 2d 3e 6d 75 74  ave(pRbuVfs->mut
20c90 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 44  ex);.  return pD
20ca0 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  b;.}../*.** Clos
20cb0 65 20 61 6e 20 72 62 75 20 66 69 6c 65 2e 0a 2a  e an rbu file..*
20cc0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62 75  /.static int rbu
20cd0 56 66 73 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  VfsClose(sqlite3
20ce0 5f 66 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  _file *pFile){. 
20cf0 20 72 62 75 5f 66 69 6c 65 20 2a 70 20 3d 20 28   rbu_file *p = (
20d00 72 62 75 5f 66 69 6c 65 2a 29 70 46 69 6c 65 3b  rbu_file*)pFile;
20d10 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
20d20 20 69 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74   i;..  /* Free t
20d30 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
20d40 68 65 20 61 70 53 68 6d 5b 5d 20 61 72 72 61 79  he apShm[] array
20d50 2e 20 41 6e 64 20 74 68 65 20 61 72 72 61 79 20  . And the array 
20d60 69 74 73 65 6c 66 2e 20 2a 2f 0a 20 20 66 6f 72  itself. */.  for
20d70 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 68 6d 3b  (i=0; i<p->nShm;
20d80 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
20d90 65 33 5f 66 72 65 65 28 70 2d 3e 61 70 53 68 6d  e3_free(p->apShm
20da0 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  [i]);.  }.  sqli
20db0 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 70 53 68  te3_free(p->apSh
20dc0 6d 29 3b 0a 20 20 70 2d 3e 61 70 53 68 6d 20 3d  m);.  p->apShm =
20dd0 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   0;.  sqlite3_fr
20de0 65 65 28 70 2d 3e 7a 44 65 6c 29 3b 0a 0a 20 20  ee(p->zDel);..  
20df0 69 66 28 20 70 2d 3e 6f 70 65 6e 46 6c 61 67 73  if( p->openFlags
20e00 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d   & SQLITE_OPEN_M
20e10 41 49 4e 5f 44 42 20 29 7b 0a 20 20 20 20 72 62  AIN_DB ){.    rb
20e20 75 4d 61 69 6e 6c 69 73 74 52 65 6d 6f 76 65 28  uMainlistRemove(
20e30 70 29 3b 0a 20 20 20 20 72 62 75 55 6e 6c 6f 63  p);.    rbuUnloc
20e40 6b 53 68 6d 28 70 29 3b 0a 20 20 20 20 70 2d 3e  kShm(p);.    p->
20e50 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d  pReal->pMethods-
20e60 3e 78 53 68 6d 55 6e 6d 61 70 28 70 2d 3e 70 52  >xShmUnmap(p->pR
20e70 65 61 6c 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 65  eal, 0);.  }.  e
20e80 6c 73 65 20 69 66 28 20 28 70 2d 3e 6f 70 65 6e  lse if( (p->open
20e90 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  Flags & SQLITE_O
20ea0 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
20eb0 45 29 20 26 26 20 70 2d 3e 70 52 62 75 20 29 7b  E) && p->pRbu ){
20ec0 0a 20 20 20 20 72 62 75 55 70 64 61 74 65 54 65  .    rbuUpdateTe
20ed0 6d 70 53 69 7a 65 28 70 2c 20 30 29 3b 0a 20 20  mpSize(p, 0);.  
20ee0 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  }.  assert( p->p
20ef0 4d 61 69 6e 4e 65 78 74 3d 3d 30 20 26 26 20 70  MainNext==0 && p
20f00 2d 3e 70 52 62 75 56 66 73 2d 3e 70 4d 61 69 6e  ->pRbuVfs->pMain
20f10 21 3d 70 20 29 3b 0a 0a 20 20 2f 2a 20 43 6c 6f  !=p );..  /* Clo
20f20 73 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  se the underlyin
20f30 67 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 2a 2f  g file handle */
20f40 0a 20 20 72 63 20 3d 20 70 2d 3e 70 52 65 61 6c  .  rc = p->pReal
20f50 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 43 6c 6f  ->pMethods->xClo
20f60 73 65 28 70 2d 3e 70 52 65 61 6c 29 3b 0a 20 20  se(p->pReal);.  
20f70 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
20f80 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 64 20 72 65  *.** Read and re
20f90 74 75 72 6e 20 61 6e 20 75 6e 73 69 67 6e 65 64  turn an unsigned
20fa0 20 33 32 2d 62 69 74 20 62 69 67 2d 65 6e 64 69   32-bit big-endi
20fb0 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f 6d 20  an integer from 
20fc0 74 68 65 20 62 75 66 66 65 72 20 0a 2a 2a 20 70  the buffer .** p
20fd0 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c  assed as the onl
20fe0 79 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73  y argument..*/.s
20ff0 74 61 74 69 63 20 75 33 32 20 72 62 75 47 65 74  tatic u32 rbuGet
21000 55 33 32 28 75 38 20 2a 61 42 75 66 29 7b 0a 20  U32(u8 *aBuf){. 
21010 20 72 65 74 75 72 6e 20 28 28 75 33 32 29 61 42   return ((u32)aB
21020 75 66 5b 30 5d 20 3c 3c 20 32 34 29 0a 20 20 20  uf[0] << 24).   
21030 20 20 20 20 2b 20 28 28 75 33 32 29 61 42 75 66      + ((u32)aBuf
21040 5b 31 5d 20 3c 3c 20 31 36 29 0a 20 20 20 20 20  [1] << 16).     
21050 20 20 2b 20 28 28 75 33 32 29 61 42 75 66 5b 32    + ((u32)aBuf[2
21060 5d 20 3c 3c 20 20 38 29 0a 20 20 20 20 20 20 20  ] <<  8).       
21070 2b 20 28 28 75 33 32 29 61 42 75 66 5b 33 5d 29  + ((u32)aBuf[3])
21080 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
21090 20 61 6e 20 75 6e 73 69 67 6e 65 64 20 33 32 2d   an unsigned 32-
210a0 62 69 74 20 76 61 6c 75 65 20 69 6e 20 62 69 67  bit value in big
210b0 2d 65 6e 64 69 61 6e 20 66 6f 72 6d 61 74 20 74  -endian format t
210c0 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64 0a 2a  o the supplied.*
210d0 2a 20 62 75 66 66 65 72 2e 0a 2a 2f 0a 73 74 61  * buffer..*/.sta
210e0 74 69 63 20 76 6f 69 64 20 72 62 75 50 75 74 55  tic void rbuPutU
210f0 33 32 28 75 38 20 2a 61 42 75 66 2c 20 75 33 32  32(u8 *aBuf, u32
21100 20 69 56 61 6c 29 7b 0a 20 20 61 42 75 66 5b 30   iVal){.  aBuf[0
21110 5d 20 3d 20 28 69 56 61 6c 20 3e 3e 20 32 34 29  ] = (iVal >> 24)
21120 20 26 20 30 78 46 46 3b 0a 20 20 61 42 75 66 5b   & 0xFF;.  aBuf[
21130 31 5d 20 3d 20 28 69 56 61 6c 20 3e 3e 20 31 36  1] = (iVal >> 16
21140 29 20 26 20 30 78 46 46 3b 0a 20 20 61 42 75 66  ) & 0xFF;.  aBuf
21150 5b 32 5d 20 3d 20 28 69 56 61 6c 20 3e 3e 20 20  [2] = (iVal >>  
21160 38 29 20 26 20 30 78 46 46 3b 0a 20 20 61 42 75  8) & 0xFF;.  aBu
21170 66 5b 33 5d 20 3d 20 28 69 56 61 6c 20 3e 3e 20  f[3] = (iVal >> 
21180 20 30 29 20 26 20 30 78 46 46 3b 0a 7d 0a 0a 73   0) & 0xFF;.}..s
21190 74 61 74 69 63 20 76 6f 69 64 20 72 62 75 50 75  tatic void rbuPu
211a0 74 55 31 36 28 75 38 20 2a 61 42 75 66 2c 20 75  tU16(u8 *aBuf, u
211b0 31 36 20 69 56 61 6c 29 7b 0a 20 20 61 42 75 66  16 iVal){.  aBuf
211c0 5b 30 5d 20 3d 20 28 69 56 61 6c 20 3e 3e 20 20  [0] = (iVal >>  
211d0 38 29 20 26 20 30 78 46 46 3b 0a 20 20 61 42 75  8) & 0xFF;.  aBu
211e0 66 5b 31 5d 20 3d 20 28 69 56 61 6c 20 3e 3e 20  f[1] = (iVal >> 
211f0 20 30 29 20 26 20 30 78 46 46 3b 0a 7d 0a 0a 2f   0) & 0xFF;.}../
21200 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66  *.** Read data f
21210 72 6f 6d 20 61 6e 20 72 62 75 56 66 73 2d 66 69  rom an rbuVfs-fi
21220 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
21230 74 20 72 62 75 56 66 73 52 65 61 64 28 0a 20 20  t rbuVfsRead(.  
21240 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
21250 69 6c 65 2c 20 0a 20 20 76 6f 69 64 20 2a 7a 42  ile, .  void *zB
21260 75 66 2c 20 0a 20 20 69 6e 74 20 69 41 6d 74 2c  uf, .  int iAmt,
21270 20 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34   .  sqlite_int64
21280 20 69 4f 66 73 74 0a 29 7b 0a 20 20 72 62 75 5f   iOfst.){.  rbu_
21290 66 69 6c 65 20 2a 70 20 3d 20 28 72 62 75 5f 66  file *p = (rbu_f
212a0 69 6c 65 2a 29 70 46 69 6c 65 3b 0a 20 20 73 71  ile*)pFile;.  sq
212b0 6c 69 74 65 33 72 62 75 20 2a 70 52 62 75 20 3d  lite3rbu *pRbu =
212c0 20 70 2d 3e 70 52 62 75 3b 0a 20 20 69 6e 74 20   p->pRbu;.  int 
212d0 72 63 3b 0a 0a 20 20 69 66 28 20 70 52 62 75 20  rc;..  if( pRbu 
212e0 26 26 20 70 52 62 75 2d 3e 65 53 74 61 67 65 3d  && pRbu->eStage=
212f0 3d 52 42 55 5f 53 54 41 47 45 5f 43 41 50 54 55  =RBU_STAGE_CAPTU
21300 52 45 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  RE ){.    assert
21310 28 20 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26  ( p->openFlags &
21320 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c   SQLITE_OPEN_WAL
21330 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 72 62 75   );.    rc = rbu
21340 43 61 70 74 75 72 65 57 61 6c 52 65 61 64 28 70  CaptureWalRead(p
21350 2d 3e 70 52 62 75 2c 20 69 4f 66 73 74 2c 20 69  ->pRbu, iOfst, i
21360 41 6d 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Amt);.  }else{. 
21370 20 20 20 69 66 28 20 70 52 62 75 20 26 26 20 70     if( pRbu && p
21380 52 62 75 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55  Rbu->eStage==RBU
21390 5f 53 54 41 47 45 5f 4f 41 4c 20 0a 20 20 20 20  _STAGE_OAL .    
213a0 20 26 26 20 28 70 2d 3e 6f 70 65 6e 46 6c 61 67   && (p->openFlag
213b0 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
213c0 57 41 4c 29 20 0a 20 20 20 20 20 26 26 20 69 4f  WAL) .     && iO
213d0 66 73 74 3e 3d 70 52 62 75 2d 3e 69 4f 61 6c 53  fst>=pRbu->iOalS
213e0 7a 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  z .    ){.      
213f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
21400 20 20 20 20 20 20 6d 65 6d 73 65 74 28 7a 42 75        memset(zBu
21410 66 2c 20 30 2c 20 69 41 6d 74 29 3b 0a 20 20 20  f, 0, iAmt);.   
21420 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
21430 20 3d 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65   = p->pReal->pMe
21440 74 68 6f 64 73 2d 3e 78 52 65 61 64 28 70 2d 3e  thods->xRead(p->
21450 70 52 65 61 6c 2c 20 7a 42 75 66 2c 20 69 41 6d  pReal, zBuf, iAm
21460 74 2c 20 69 4f 66 73 74 29 3b 0a 23 69 66 20 31  t, iOfst);.#if 1
21470 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69  .      /* If thi
21480 73 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65  s is being calle
21490 64 20 74 6f 20 72 65 61 64 20 74 68 65 20 66 69  d to read the fi
214a0 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  rst page of the 
214b0 74 61 72 67 65 74 20 0a 20 20 20 20 20 20 2a 2a  target .      **
214c0 20 64 61 74 61 62 61 73 65 20 61 73 20 70 61 72   database as par
214d0 74 20 6f 66 20 61 6e 20 72 62 75 20 76 61 63 75  t of an rbu vacu
214e0 75 6d 20 6f 70 65 72 61 74 69 6f 6e 2c 20 73 79  um operation, sy
214f0 6e 74 68 65 73 69 7a 65 20 74 68 65 20 0a 20 20  nthesize the .  
21500 20 20 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 73 20      ** contents 
21510 6f 66 20 74 68 65 20 66 69 72 73 74 20 70 61 67  of the first pag
21520 65 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74  e if it does not
21530 20 79 65 74 20 65 78 69 73 74 2e 20 4f 74 68 65   yet exist. Othe
21540 72 77 69 73 65 2c 0a 20 20 20 20 20 20 2a 2a 20  rwise,.      ** 
21550 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e 6f 74 20  SQLite will not 
21560 63 68 65 63 6b 20 66 6f 72 20 61 20 2a 2d 77 61  check for a *-wa
21570 6c 20 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 20 20  l file.  */.    
21580 20 20 69 66 28 20 70 52 62 75 20 26 26 20 72 62    if( pRbu && rb
21590 75 49 73 56 61 63 75 75 6d 28 70 52 62 75 29 20  uIsVacuum(pRbu) 
215a0 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 72 63  .          && rc
215b0 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  ==SQLITE_IOERR_S
215c0 48 4f 52 54 5f 52 45 41 44 20 26 26 20 69 4f 66  HORT_READ && iOf
215d0 73 74 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  st==0.          
215e0 26 26 20 28 70 2d 3e 6f 70 65 6e 46 6c 61 67 73  && (p->openFlags
215f0 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d   & SQLITE_OPEN_M
21600 41 49 4e 5f 44 42 29 0a 20 20 20 20 20 20 20 20  AIN_DB).        
21610 20 20 26 26 20 70 52 62 75 2d 3e 72 63 3d 3d 53    && pRbu->rc==S
21620 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20 29  QLITE_OK.      )
21630 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
21640 33 5f 66 69 6c 65 20 2a 70 46 64 20 3d 20 28 73  3_file *pFd = (s
21650 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70 52 62  qlite3_file*)pRb
21660 75 2d 3e 70 52 62 75 46 64 3b 0a 20 20 20 20 20  u->pRbuFd;.     
21670 20 20 20 72 63 20 3d 20 70 46 64 2d 3e 70 4d 65     rc = pFd->pMe
21680 74 68 6f 64 73 2d 3e 78 52 65 61 64 28 70 46 64  thods->xRead(pFd
21690 2c 20 7a 42 75 66 2c 20 69 41 6d 74 2c 20 69 4f  , zBuf, iAmt, iO
216a0 66 73 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66  fst);.        if
216b0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
216c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 38 20  ){.          u8 
216d0 2a 61 42 75 66 20 3d 20 28 75 38 2a 29 7a 42 75  *aBuf = (u8*)zBu
216e0 66 3b 0a 20 20 20 20 20 20 20 20 20 20 75 33 32  f;.          u32
216f0 20 69 52 6f 6f 74 20 3d 20 72 62 75 47 65 74 55   iRoot = rbuGetU
21700 33 32 28 26 61 42 75 66 5b 35 32 5d 29 20 3f 20  32(&aBuf[52]) ? 
21710 31 20 3a 20 30 3b 0a 20 20 20 20 20 20 20 20 20  1 : 0;.         
21720 20 72 62 75 50 75 74 55 33 32 28 26 61 42 75 66   rbuPutU32(&aBuf
21730 5b 35 32 5d 2c 20 69 52 6f 6f 74 29 3b 20 20 20  [52], iRoot);   
21740 20 20 20 2f 2a 20 6c 61 72 67 65 73 74 20 72 6f     /* largest ro
21750 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a  ot page number *
21760 2f 0a 20 20 20 20 20 20 20 20 20 20 72 62 75 50  /.          rbuP
21770 75 74 55 33 32 28 26 61 42 75 66 5b 33 36 5d 2c  utU32(&aBuf[36],
21780 20 30 29 3b 20 20 20 20 20 20 20 20 20 20 2f 2a   0);          /*
21790 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 20   number of free 
217a0 70 61 67 65 73 20 2a 2f 0a 20 20 20 20 20 20 20  pages */.       
217b0 20 20 20 72 62 75 50 75 74 55 33 32 28 26 61 42     rbuPutU32(&aB
217c0 75 66 5b 33 32 5d 2c 20 30 29 3b 20 20 20 20 20  uf[32], 0);     
217d0 20 20 20 20 20 2f 2a 20 66 69 72 73 74 20 70 61       /* first pa
217e0 67 65 20 6f 6e 20 66 72 65 65 20 6c 69 73 74 20  ge on free list 
217f0 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 20  trunk */.       
21800 20 20 20 72 62 75 50 75 74 55 33 32 28 26 61 42     rbuPutU32(&aB
21810 75 66 5b 32 38 5d 2c 20 31 29 3b 20 20 20 20 20  uf[28], 1);     
21820 20 20 20 20 20 2f 2a 20 73 69 7a 65 20 6f 66 20       /* size of 
21830 64 62 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73  db file in pages
21840 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 62   */.          rb
21850 75 50 75 74 55 33 32 28 26 61 42 75 66 5b 32 34  uPutU32(&aBuf[24
21860 5d 2c 20 70 52 62 75 2d 3e 70 52 62 75 46 64 2d  ], pRbu->pRbuFd-
21870 3e 69 43 6f 6f 6b 69 65 2b 31 29 3b 20 20 2f 2a  >iCookie+1);  /*
21880 20 43 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20   Change counter 
21890 2a 2f 0a 0a 20 20 20 20 20 20 20 20 20 20 69 66  */..          if
218a0 28 20 69 41 6d 74 3e 31 30 30 20 29 7b 0a 20 20  ( iAmt>100 ){.  
218b0 20 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74            memset
218c0 28 26 61 42 75 66 5b 31 30 30 5d 2c 20 30 2c 20  (&aBuf[100], 0, 
218d0 69 41 6d 74 2d 31 30 30 29 3b 0a 20 20 20 20 20  iAmt-100);.     
218e0 20 20 20 20 20 20 20 72 62 75 50 75 74 55 31 36         rbuPutU16
218f0 28 26 61 42 75 66 5b 31 30 35 5d 2c 20 69 41 6d  (&aBuf[105], iAm
21900 74 20 26 20 30 78 46 46 46 46 29 3b 0a 20 20 20  t & 0xFFFF);.   
21910 20 20 20 20 20 20 20 20 20 61 42 75 66 5b 31 30           aBuf[10
21920 30 5d 20 3d 20 30 78 30 44 3b 0a 20 20 20 20 20  0] = 0x0D;.     
21930 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
21940 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
21950 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
21960 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
21970 4f 66 73 74 3d 3d 30 20 26 26 20 28 70 2d 3e 6f  Ofst==0 && (p->o
21980 70 65 6e 46 6c 61 67 73 20 26 20 53 51 4c 49 54  penFlags & SQLIT
21990 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 20  E_OPEN_MAIN_DB) 
219a0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 73  ){.      /* Thes
219b0 65 20 6c 6f 6f 6b 20 6c 69 6b 65 20 6d 61 67 69  e look like magi
219c0 63 20 6e 75 6d 62 65 72 73 2e 20 42 75 74 20 74  c numbers. But t
219d0 68 65 79 20 61 72 65 20 73 74 61 62 6c 65 2c 20  hey are stable, 
219e0 61 73 20 74 68 65 79 20 61 72 65 20 70 61 72 74  as they are part
219f0 0a 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68  .       ** of th
21a00 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66 20  e definition of 
21a10 74 68 65 20 53 51 4c 69 74 65 20 66 69 6c 65 20  the SQLite file 
21a20 66 6f 72 6d 61 74 2c 20 77 68 69 63 68 20 6d 61  format, which ma
21a30 79 20 6e 6f 74 20 63 68 61 6e 67 65 2e 20 2a 2f  y not change. */
21a40 0a 20 20 20 20 20 20 75 38 20 2a 70 42 75 66 20  .      u8 *pBuf 
21a50 3d 20 28 75 38 2a 29 7a 42 75 66 3b 0a 20 20 20  = (u8*)zBuf;.   
21a60 20 20 20 70 2d 3e 69 43 6f 6f 6b 69 65 20 3d 20     p->iCookie = 
21a70 72 62 75 47 65 74 55 33 32 28 26 70 42 75 66 5b  rbuGetU32(&pBuf[
21a80 32 34 5d 29 3b 0a 20 20 20 20 20 20 70 2d 3e 69  24]);.      p->i
21a90 57 72 69 74 65 56 65 72 20 3d 20 70 42 75 66 5b  WriteVer = pBuf[
21aa0 31 39 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  19];.    }.  }. 
21ab0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
21ac0 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61 74 61 20  *.** Write data 
21ad0 74 6f 20 61 6e 20 72 62 75 56 66 73 2d 66 69 6c  to an rbuVfs-fil
21ae0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
21af0 20 72 62 75 56 66 73 57 72 69 74 65 28 0a 20 20   rbuVfsWrite(.  
21b00 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
21b10 69 6c 65 2c 20 0a 20 20 63 6f 6e 73 74 20 76 6f  ile, .  const vo
21b20 69 64 20 2a 7a 42 75 66 2c 20 0a 20 20 69 6e 74  id *zBuf, .  int
21b30 20 69 41 6d 74 2c 20 0a 20 20 73 71 6c 69 74 65   iAmt, .  sqlite
21b40 5f 69 6e 74 36 34 20 69 4f 66 73 74 0a 29 7b 0a  _int64 iOfst.){.
21b50 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 20 3d 20    rbu_file *p = 
21b60 28 72 62 75 5f 66 69 6c 65 2a 29 70 46 69 6c 65  (rbu_file*)pFile
21b70 3b 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20 2a  ;.  sqlite3rbu *
21b80 70 52 62 75 20 3d 20 70 2d 3e 70 52 62 75 3b 0a  pRbu = p->pRbu;.
21b90 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
21ba0 20 70 52 62 75 20 26 26 20 70 52 62 75 2d 3e 65   pRbu && pRbu->e
21bb0 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45  Stage==RBU_STAGE
21bc0 5f 43 41 50 54 55 52 45 20 29 7b 0a 20 20 20 20  _CAPTURE ){.    
21bd0 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 65 6e 46  assert( p->openF
21be0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
21bf0 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 3b 0a 20 20  EN_MAIN_DB );.  
21c00 20 20 72 63 20 3d 20 72 62 75 43 61 70 74 75 72    rc = rbuCaptur
21c10 65 44 62 57 72 69 74 65 28 70 2d 3e 70 52 62 75  eDbWrite(p->pRbu
21c20 2c 20 69 4f 66 73 74 29 3b 0a 20 20 7d 65 6c 73  , iOfst);.  }els
21c30 65 7b 0a 20 20 20 20 69 66 28 20 70 52 62 75 20  e{.    if( pRbu 
21c40 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 52 62  ){.      if( pRb
21c50 75 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53  u->eStage==RBU_S
21c60 54 41 47 45 5f 4f 41 4c 20 0a 20 20 20 20 20 20  TAGE_OAL .      
21c70 20 26 26 20 28 70 2d 3e 6f 70 65 6e 46 6c 61 67   && (p->openFlag
21c80 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
21c90 57 41 4c 29 20 0a 20 20 20 20 20 20 20 26 26 20  WAL) .       && 
21ca0 69 4f 66 73 74 3e 3d 70 52 62 75 2d 3e 69 4f 61  iOfst>=pRbu->iOa
21cb0 6c 53 7a 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  lSz.      ){.   
21cc0 20 20 20 20 20 70 52 62 75 2d 3e 69 4f 61 6c 53       pRbu->iOalS
21cd0 7a 20 3d 20 69 41 6d 74 20 2b 20 69 4f 66 73 74  z = iAmt + iOfst
21ce0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
21cf0 28 20 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26  ( p->openFlags &
21d00 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c   SQLITE_OPEN_DEL
21d10 45 54 45 4f 4e 43 4c 4f 53 45 20 29 7b 0a 20 20  ETEONCLOSE ){.  
21d20 20 20 20 20 20 20 69 36 34 20 73 7a 4e 65 77 20        i64 szNew 
21d30 3d 20 69 41 6d 74 2b 69 4f 66 73 74 3b 0a 20 20  = iAmt+iOfst;.  
21d40 20 20 20 20 20 20 69 66 28 20 73 7a 4e 65 77 3e        if( szNew>
21d50 70 2d 3e 73 7a 20 29 7b 0a 20 20 20 20 20 20 20  p->sz ){.       
21d60 20 20 20 72 63 20 3d 20 72 62 75 55 70 64 61 74     rc = rbuUpdat
21d70 65 54 65 6d 70 53 69 7a 65 28 70 2c 20 73 7a 4e  eTempSize(p, szN
21d80 65 77 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ew);.          i
21d90 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
21da0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
21db0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
21dc0 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 70      }.    rc = p
21dd0 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64  ->pReal->pMethod
21de0 73 2d 3e 78 57 72 69 74 65 28 70 2d 3e 70 52 65  s->xWrite(p->pRe
21df0 61 6c 2c 20 7a 42 75 66 2c 20 69 41 6d 74 2c 20  al, zBuf, iAmt, 
21e00 69 4f 66 73 74 29 3b 0a 20 20 20 20 69 66 28 20  iOfst);.    if( 
21e10 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
21e20 20 69 4f 66 73 74 3d 3d 30 20 26 26 20 28 70 2d   iOfst==0 && (p-
21e30 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20 53 51 4c  >openFlags & SQL
21e40 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
21e50 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  ) ){.      /* Th
21e60 65 73 65 20 6c 6f 6f 6b 20 6c 69 6b 65 20 6d 61  ese look like ma
21e70 67 69 63 20 6e 75 6d 62 65 72 73 2e 20 42 75 74  gic numbers. But
21e80 20 74 68 65 79 20 61 72 65 20 73 74 61 62 6c 65   they are stable
21e90 2c 20 61 73 20 74 68 65 79 20 61 72 65 20 70 61  , as they are pa
21ea0 72 74 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74  rt.      ** of t
21eb0 68 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66  he definition of
21ec0 20 74 68 65 20 53 51 4c 69 74 65 20 66 69 6c 65   the SQLite file
21ed0 20 66 6f 72 6d 61 74 2c 20 77 68 69 63 68 20 6d   format, which m
21ee0 61 79 20 6e 6f 74 20 63 68 61 6e 67 65 2e 20 2a  ay not change. *
21ef0 2f 0a 20 20 20 20 20 20 75 38 20 2a 70 42 75 66  /.      u8 *pBuf
21f00 20 3d 20 28 75 38 2a 29 7a 42 75 66 3b 0a 20 20   = (u8*)zBuf;.  
21f10 20 20 20 20 70 2d 3e 69 43 6f 6f 6b 69 65 20 3d      p->iCookie =
21f20 20 72 62 75 47 65 74 55 33 32 28 26 70 42 75 66   rbuGetU32(&pBuf
21f30 5b 32 34 5d 29 3b 0a 20 20 20 20 20 20 70 2d 3e  [24]);.      p->
21f40 69 57 72 69 74 65 56 65 72 20 3d 20 70 42 75 66  iWriteVer = pBuf
21f50 5b 31 39 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  [19];.    }.  }.
21f60 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
21f70 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 61  /*.** Truncate a
21f80 6e 20 72 62 75 56 66 73 2d 66 69 6c 65 2e 0a 2a  n rbuVfs-file..*
21f90 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62 75  /.static int rbu
21fa0 56 66 73 54 72 75 6e 63 61 74 65 28 73 71 6c 69  VfsTruncate(sqli
21fb0 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c  te3_file *pFile,
21fc0 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 73 69   sqlite_int64 si
21fd0 7a 65 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20  ze){.  rbu_file 
21fe0 2a 70 20 3d 20 28 72 62 75 5f 66 69 6c 65 2a 29  *p = (rbu_file*)
21ff0 70 46 69 6c 65 3b 0a 20 20 69 66 28 20 28 70 2d  pFile;.  if( (p-
22000 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20 53 51 4c  >openFlags & SQL
22010 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f  ITE_OPEN_DELETEO
22020 4e 43 4c 4f 53 45 29 20 26 26 20 70 2d 3e 70 52  NCLOSE) && p->pR
22030 62 75 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  bu ){.    int rc
22040 20 3d 20 72 62 75 55 70 64 61 74 65 54 65 6d 70   = rbuUpdateTemp
22050 53 69 7a 65 28 70 2c 20 73 69 7a 65 29 3b 0a 20  Size(p, size);. 
22060 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
22070 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
22080 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
22090 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64  ->pReal->pMethod
220a0 73 2d 3e 78 54 72 75 6e 63 61 74 65 28 70 2d 3e  s->xTruncate(p->
220b0 70 52 65 61 6c 2c 20 73 69 7a 65 29 3b 0a 7d 0a  pReal, size);.}.
220c0 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 61 6e 20 72  ./*.** Sync an r
220d0 62 75 56 66 73 2d 66 69 6c 65 2e 0a 2a 2f 0a 73  buVfs-file..*/.s
220e0 74 61 74 69 63 20 69 6e 74 20 72 62 75 56 66 73  tatic int rbuVfs
220f0 53 79 6e 63 28 73 71 6c 69 74 65 33 5f 66 69 6c  Sync(sqlite3_fil
22100 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20 66 6c  e *pFile, int fl
22110 61 67 73 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65  ags){.  rbu_file
22120 20 2a 70 20 3d 20 28 72 62 75 5f 66 69 6c 65 20   *p = (rbu_file 
22130 2a 29 70 46 69 6c 65 3b 0a 20 20 69 66 28 20 70  *)pFile;.  if( p
22140 2d 3e 70 52 62 75 20 26 26 20 70 2d 3e 70 52 62  ->pRbu && p->pRb
22150 75 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53  u->eStage==RBU_S
22160 54 41 47 45 5f 43 41 50 54 55 52 45 20 29 7b 0a  TAGE_CAPTURE ){.
22170 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 65 6e 46      if( p->openF
22180 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
22190 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 7b 0a 20 20  EN_MAIN_DB ){.  
221a0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
221b0 45 5f 49 4e 54 45 52 4e 41 4c 3b 0a 20 20 20 20  E_INTERNAL;.    
221c0 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  }.    return SQL
221d0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65  ITE_OK;.  }.  re
221e0 74 75 72 6e 20 70 2d 3e 70 52 65 61 6c 2d 3e 70  turn p->pReal->p
221f0 4d 65 74 68 6f 64 73 2d 3e 78 53 79 6e 63 28 70  Methods->xSync(p
22200 2d 3e 70 52 65 61 6c 2c 20 66 6c 61 67 73 29 3b  ->pReal, flags);
22210 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
22220 20 74 68 65 20 63 75 72 72 65 6e 74 20 66 69 6c   the current fil
22230 65 2d 73 69 7a 65 20 6f 66 20 61 6e 20 72 62 75  e-size of an rbu
22240 56 66 73 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  Vfs-file..*/.sta
22250 74 69 63 20 69 6e 74 20 72 62 75 56 66 73 46 69  tic int rbuVfsFi
22260 6c 65 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66  leSize(sqlite3_f
22270 69 6c 65 20 2a 70 46 69 6c 65 2c 20 73 71 6c 69  ile *pFile, sqli
22280 74 65 5f 69 6e 74 36 34 20 2a 70 53 69 7a 65 29  te_int64 *pSize)
22290 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 20  {.  rbu_file *p 
222a0 3d 20 28 72 62 75 5f 66 69 6c 65 20 2a 29 70 46  = (rbu_file *)pF
222b0 69 6c 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ile;.  int rc;. 
222c0 20 72 63 20 3d 20 70 2d 3e 70 52 65 61 6c 2d 3e   rc = p->pReal->
222d0 70 4d 65 74 68 6f 64 73 2d 3e 78 46 69 6c 65 53  pMethods->xFileS
222e0 69 7a 65 28 70 2d 3e 70 52 65 61 6c 2c 20 70 53  ize(p->pReal, pS
222f0 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  ize);..  /* If t
22300 68 69 73 20 69 73 20 61 6e 20 52 42 55 20 76 61  his is an RBU va
22310 63 75 75 6d 20 6f 70 65 72 61 74 69 6f 6e 20 61  cuum operation a
22320 6e 64 20 74 68 69 73 20 69 73 20 74 68 65 20 74  nd this is the t
22330 61 72 67 65 74 20 64 61 74 61 62 61 73 65 2c 0a  arget database,.
22340 20 20 2a 2a 20 70 72 65 74 65 6e 64 20 74 68 61    ** pretend tha
22350 74 20 69 74 20 68 61 73 20 61 74 20 6c 65 61 73  t it has at leas
22360 74 20 6f 6e 65 20 70 61 67 65 2e 20 4f 74 68 65  t one page. Othe
22370 72 77 69 73 65 2c 20 53 51 4c 69 74 65 20 77 69  rwise, SQLite wi
22380 6c 6c 20 6e 6f 74 0a 20 20 2a 2a 20 63 68 65 63  ll not.  ** chec
22390 6b 20 66 6f 72 20 74 68 65 20 65 78 69 73 74 61  k for the exista
223a0 6e 63 65 20 6f 66 20 61 20 2a 2d 77 61 6c 20 66  nce of a *-wal f
223b0 69 6c 65 2e 20 72 62 75 56 66 73 52 65 61 64 28  ile. rbuVfsRead(
223c0 29 20 63 6f 6e 74 61 69 6e 73 20 0a 20 20 2a 2a  ) contains .  **
223d0 20 73 69 6d 69 6c 61 72 20 6c 6f 67 69 63 2e 20   similar logic. 
223e0 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
223f0 4c 49 54 45 5f 4f 4b 20 26 26 20 2a 70 53 69 7a  LITE_OK && *pSiz
22400 65 3d 3d 30 20 0a 20 20 20 26 26 20 70 2d 3e 70  e==0 .   && p->p
22410 52 62 75 20 26 26 20 72 62 75 49 73 56 61 63 75  Rbu && rbuIsVacu
22420 75 6d 28 70 2d 3e 70 52 62 75 29 20 0a 20 20 20  um(p->pRbu) .   
22430 26 26 20 28 70 2d 3e 6f 70 65 6e 46 6c 61 67 73  && (p->openFlags
22440 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d   & SQLITE_OPEN_M
22450 41 49 4e 5f 44 42 29 0a 20 20 29 7b 0a 20 20 20  AIN_DB).  ){.   
22460 20 2a 70 53 69 7a 65 20 3d 20 31 30 32 34 3b 0a   *pSize = 1024;.
22470 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
22480 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 61  .}../*.** Lock a
22490 6e 20 72 62 75 56 66 73 2d 66 69 6c 65 2e 0a 2a  n rbuVfs-file..*
224a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62 75  /.static int rbu
224b0 56 66 73 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  VfsLock(sqlite3_
224c0 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74  file *pFile, int
224d0 20 65 4c 6f 63 6b 29 7b 0a 20 20 72 62 75 5f 66   eLock){.  rbu_f
224e0 69 6c 65 20 2a 70 20 3d 20 28 72 62 75 5f 66 69  ile *p = (rbu_fi
224f0 6c 65 2a 29 70 46 69 6c 65 3b 0a 20 20 73 71 6c  le*)pFile;.  sql
22500 69 74 65 33 72 62 75 20 2a 70 52 62 75 20 3d 20  ite3rbu *pRbu = 
22510 70 2d 3e 70 52 62 75 3b 0a 20 20 69 6e 74 20 72  p->pRbu;.  int r
22520 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
22530 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 65    assert( p->ope
22540 6e 46 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45  nFlags & (SQLITE
22550 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 7c 53 51  _OPEN_MAIN_DB|SQ
22560 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44  LITE_OPEN_TEMP_D
22570 42 29 20 29 3b 0a 20 20 69 66 28 20 65 4c 6f 63  B) );.  if( eLoc
22580 6b 3d 3d 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 45  k==SQLITE_LOCK_E
22590 58 43 4c 55 53 49 56 45 20 0a 20 20 20 26 26 20  XCLUSIVE .   && 
225a0 28 70 2d 3e 62 4e 6f 6c 6f 63 6b 20 7c 7c 20 28  (p->bNolock || (
225b0 70 52 62 75 20 26 26 20 70 52 62 75 2d 3e 65 53  pRbu && pRbu->eS
225c0 74 61 67 65 21 3d 52 42 55 5f 53 54 41 47 45 5f  tage!=RBU_STAGE_
225d0 44 4f 4e 45 29 29 0a 20 20 29 7b 0a 20 20 20 20  DONE)).  ){.    
225e0 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20  /* Do not allow 
225f0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 2e  EXCLUSIVE locks.
22600 20 50 72 65 76 65 6e 74 69 6e 67 20 53 51 4c 69   Preventing SQLi
22610 74 65 20 66 72 6f 6d 20 74 61 6b 69 6e 67 20 74  te from taking t
22620 68 69 73 20 0a 20 20 20 20 2a 2a 20 70 72 65 76  his .    ** prev
22630 65 6e 74 73 20 69 74 20 66 72 6f 6d 20 63 68 65  ents it from che
22640 63 6b 70 6f 69 6e 74 69 6e 67 20 74 68 65 20 64  ckpointing the d
22650 61 74 61 62 61 73 65 20 66 72 6f 6d 20 73 71 6c  atabase from sql
22660 69 74 65 33 5f 63 6c 6f 73 65 28 29 2e 20 2a 2f  ite3_close(). */
22670 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
22680 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _BUSY;.  }else{.
22690 20 20 20 20 72 63 20 3d 20 70 2d 3e 70 52 65 61      rc = p->pRea
226a0 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 4c 6f  l->pMethods->xLo
226b0 63 6b 28 70 2d 3e 70 52 65 61 6c 2c 20 65 4c 6f  ck(p->pReal, eLo
226c0 63 6b 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ck);.  }..  retu
226d0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
226e0 55 6e 6c 6f 63 6b 20 61 6e 20 72 62 75 56 66 73  Unlock an rbuVfs
226f0 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  -file..*/.static
22700 20 69 6e 74 20 72 62 75 56 66 73 55 6e 6c 6f 63   int rbuVfsUnloc
22710 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
22720 70 46 69 6c 65 2c 20 69 6e 74 20 65 4c 6f 63 6b  pFile, int eLock
22730 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a 70  ){.  rbu_file *p
22740 20 3d 20 28 72 62 75 5f 66 69 6c 65 20 2a 29 70   = (rbu_file *)p
22750 46 69 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 70  File;.  return p
22760 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64  ->pReal->pMethod
22770 73 2d 3e 78 55 6e 6c 6f 63 6b 28 70 2d 3e 70 52  s->xUnlock(p->pR
22780 65 61 6c 2c 20 65 4c 6f 63 6b 29 3b 0a 7d 0a 0a  eal, eLock);.}..
22790 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 69 66 20 61  /*.** Check if a
227a0 6e 6f 74 68 65 72 20 66 69 6c 65 2d 68 61 6e 64  nother file-hand
227b0 6c 65 20 68 6f 6c 64 73 20 61 20 52 45 53 45 52  le holds a RESER
227c0 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 61 6e 20 72  VED lock on an r
227d0 62 75 56 66 73 2d 66 69 6c 65 2e 0a 2a 2f 0a 73  buVfs-file..*/.s
227e0 74 61 74 69 63 20 69 6e 74 20 72 62 75 56 66 73  tatic int rbuVfs
227f0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
22800 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
22810 70 46 69 6c 65 2c 20 69 6e 74 20 2a 70 52 65 73  pFile, int *pRes
22820 4f 75 74 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65  Out){.  rbu_file
22830 20 2a 70 20 3d 20 28 72 62 75 5f 66 69 6c 65 20   *p = (rbu_file 
22840 2a 29 70 46 69 6c 65 3b 0a 20 20 72 65 74 75 72  *)pFile;.  retur
22850 6e 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74  n p->pReal->pMet
22860 68 6f 64 73 2d 3e 78 43 68 65 63 6b 52 65 73 65  hods->xCheckRese
22870 72 76 65 64 4c 6f 63 6b 28 70 2d 3e 70 52 65 61  rvedLock(p->pRea
22880 6c 2c 20 70 52 65 73 4f 75 74 29 3b 0a 7d 0a 0a  l, pResOut);.}..
22890 2f 2a 0a 2a 2a 20 46 69 6c 65 20 63 6f 6e 74 72  /*.** File contr
228a0 6f 6c 20 6d 65 74 68 6f 64 2e 20 46 6f 72 20 63  ol method. For c
228b0 75 73 74 6f 6d 20 6f 70 65 72 61 74 69 6f 6e 73  ustom operations
228c0 20 6f 6e 20 61 6e 20 72 62 75 56 66 73 2d 66 69   on an rbuVfs-fi
228d0 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
228e0 74 20 72 62 75 56 66 73 46 69 6c 65 43 6f 6e 74  t rbuVfsFileCont
228f0 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  rol(sqlite3_file
22900 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20 6f 70 2c   *pFile, int op,
22910 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20   void *pArg){.  
22920 72 62 75 5f 66 69 6c 65 20 2a 70 20 3d 20 28 72  rbu_file *p = (r
22930 62 75 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65 3b  bu_file *)pFile;
22940 0a 20 20 69 6e 74 20 28 2a 78 43 6f 6e 74 72 6f  .  int (*xContro
22950 6c 29 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  l)(sqlite3_file*
22960 2c 69 6e 74 2c 76 6f 69 64 2a 29 20 3d 20 70 2d  ,int,void*) = p-
22970 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73  >pReal->pMethods
22980 2d 3e 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 3b 0a  ->xFileControl;.
22990 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
229a0 65 72 74 28 20 70 2d 3e 6f 70 65 6e 46 6c 61 67  ert( p->openFlag
229b0 73 20 26 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e  s & (SQLITE_OPEN
229c0 5f 4d 41 49 4e 5f 44 42 7c 53 51 4c 49 54 45 5f  _MAIN_DB|SQLITE_
229d0 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 29 0a 20 20  OPEN_TEMP_DB).  
229e0 20 20 20 20 20 7c 7c 20 70 2d 3e 6f 70 65 6e 46       || p->openF
229f0 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f 4f  lags & (SQLITE_O
22a00 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42  PEN_TRANSIENT_DB
22a10 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d  |SQLITE_OPEN_TEM
22a20 50 5f 4a 4f 55 52 4e 41 4c 29 0a 20 20 29 3b 0a  P_JOURNAL).  );.
22a30 20 20 69 66 28 20 6f 70 3d 3d 53 51 4c 49 54 45    if( op==SQLITE
22a40 5f 46 43 4e 54 4c 5f 52 42 55 20 29 7b 0a 20 20  _FCNTL_RBU ){.  
22a50 20 20 73 71 6c 69 74 65 33 72 62 75 20 2a 70 52    sqlite3rbu *pR
22a60 62 75 20 3d 20 28 73 71 6c 69 74 65 33 72 62 75  bu = (sqlite3rbu
22a70 2a 29 70 41 72 67 3b 0a 0a 20 20 20 20 2f 2a 20  *)pArg;..    /* 
22a80 46 69 72 73 74 20 74 72 79 20 74 6f 20 66 69 6e  First try to fin
22a90 64 20 61 6e 6f 74 68 65 72 20 52 42 55 20 76 66  d another RBU vf
22aa0 73 20 6c 6f 77 65 72 20 64 6f 77 6e 20 69 6e 20  s lower down in 
22ab0 74 68 65 20 76 66 73 20 73 74 61 63 6b 2e 20 49  the vfs stack. I
22ac0 66 0a 20 20 20 20 2a 2a 20 6f 6e 65 20 69 73 20  f.    ** one is 
22ad0 66 6f 75 6e 64 2c 20 74 68 69 73 20 76 66 73 20  found, this vfs 
22ae0 77 69 6c 6c 20 6f 70 65 72 61 74 65 20 69 6e 20  will operate in 
22af0 70 61 73 73 2d 74 68 72 6f 75 67 68 20 6d 6f 64  pass-through mod
22b00 65 2e 20 54 68 65 20 6c 6f 77 65 72 0a 20 20 20  e. The lower.   
22b10 20 2a 2a 20 6c 65 76 65 6c 20 76 66 73 20 77 69   ** level vfs wi
22b20 6c 6c 20 64 6f 20 74 68 65 20 73 70 65 63 69 61  ll do the specia
22b30 6c 20 52 42 55 20 68 61 6e 64 6c 69 6e 67 2e 20  l RBU handling. 
22b40 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 78 43 6f   */.    rc = xCo
22b50 6e 74 72 6f 6c 28 70 2d 3e 70 52 65 61 6c 2c 20  ntrol(p->pReal, 
22b60 6f 70 2c 20 70 41 72 67 29 3b 0a 0a 20 20 20 20  op, pArg);..    
22b70 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  if( rc==SQLITE_N
22b80 4f 54 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20  OTFOUND ){.     
22b90 20 2f 2a 20 4e 6f 77 20 73 65 61 72 63 68 20 66   /* Now search f
22ba0 6f 72 20 61 20 7a 69 70 76 66 73 20 69 6e 73 74  or a zipvfs inst
22bb0 61 6e 63 65 20 6c 6f 77 65 72 20 64 6f 77 6e 20  ance lower down 
22bc0 69 6e 20 74 68 65 20 56 46 53 20 73 74 61 63 6b  in the VFS stack
22bd0 2e 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 6f 6e  . If.      ** on
22be0 65 20 69 73 20 66 6f 75 6e 64 2c 20 74 68 69 73  e is found, this
22bf0 20 69 73 20 61 6e 20 65 72 72 6f 72 2e 20 20 2a   is an error.  *
22c00 2f 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 64 75  /.      void *du
22c10 6d 6d 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  mmy = 0;.      r
22c20 63 20 3d 20 78 43 6f 6e 74 72 6f 6c 28 70 2d 3e  c = xControl(p->
22c30 70 52 65 61 6c 2c 20 53 51 4c 49 54 45 5f 46 43  pReal, SQLITE_FC
22c40 4e 54 4c 5f 5a 49 50 56 46 53 2c 20 26 64 75 6d  NTL_ZIPVFS, &dum
22c50 6d 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  my);.      if( r
22c60 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
22c70 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
22c80 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
22c90 20 20 20 70 52 62 75 2d 3e 7a 45 72 72 6d 73 67     pRbu->zErrmsg
22ca0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
22cb0 74 66 28 22 72 62 75 2f 7a 69 70 76 66 73 20 73  tf("rbu/zipvfs s
22cc0 65 74 75 70 20 65 72 72 6f 72 22 29 3b 0a 20 20  etup error");.  
22cd0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63      }else if( rc
22ce0 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  ==SQLITE_NOTFOUN
22cf0 44 20 29 7b 0a 20 20 20 20 20 20 20 20 70 52 62  D ){.        pRb
22d00 75 2d 3e 70 54 61 72 67 65 74 46 64 20 3d 20 70  u->pTargetFd = p
22d10 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 52 62  ;.        p->pRb
22d20 75 20 3d 20 70 52 62 75 3b 0a 20 20 20 20 20 20  u = pRbu;.      
22d30 20 20 69 66 28 20 70 2d 3e 6f 70 65 6e 46 6c 61    if( p->openFla
22d40 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
22d50 5f 4d 41 49 4e 5f 44 42 20 29 7b 0a 20 20 20 20  _MAIN_DB ){.    
22d60 20 20 20 20 20 20 72 62 75 4d 61 69 6e 6c 69 73        rbuMainlis
22d70 74 41 64 64 28 70 29 3b 0a 20 20 20 20 20 20 20  tAdd(p);.       
22d80 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
22d90 2d 3e 70 57 61 6c 46 64 20 29 20 70 2d 3e 70 57  ->pWalFd ) p->pW
22da0 61 6c 46 64 2d 3e 70 52 62 75 20 3d 20 70 52 62  alFd->pRbu = pRb
22db0 75 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  u;.        rc = 
22dc0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
22dd0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74   }.    }.    ret
22de0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 65 6c  urn rc;.  }.  el
22df0 73 65 20 69 66 28 20 6f 70 3d 3d 53 51 4c 49 54  se if( op==SQLIT
22e00 45 5f 46 43 4e 54 4c 5f 52 42 55 43 4e 54 20 29  E_FCNTL_RBUCNT )
22e10 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 72 62 75  {.    sqlite3rbu
22e20 20 2a 70 52 62 75 20 3d 20 28 73 71 6c 69 74 65   *pRbu = (sqlite
22e30 33 72 62 75 2a 29 70 41 72 67 3b 0a 20 20 20 20  3rbu*)pArg;.    
22e40 70 52 62 75 2d 3e 6e 52 62 75 2b 2b 3b 0a 20 20  pRbu->nRbu++;.  
22e50 20 20 70 52 62 75 2d 3e 70 52 62 75 46 64 20 3d    pRbu->pRbuFd =
22e60 20 70 3b 0a 20 20 20 20 70 2d 3e 62 4e 6f 6c 6f   p;.    p->bNolo
22e70 63 6b 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 72  ck = 1;.  }..  r
22e80 63 20 3d 20 78 43 6f 6e 74 72 6f 6c 28 70 2d 3e  c = xControl(p->
22e90 70 52 65 61 6c 2c 20 6f 70 2c 20 70 41 72 67 29  pReal, op, pArg)
22ea0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
22eb0 54 45 5f 4f 4b 20 26 26 20 6f 70 3d 3d 53 51 4c  TE_OK && op==SQL
22ec0 49 54 45 5f 46 43 4e 54 4c 5f 56 46 53 4e 41 4d  ITE_FCNTL_VFSNAM
22ed0 45 20 29 7b 0a 20 20 20 20 72 62 75 5f 76 66 73  E ){.    rbu_vfs
22ee0 20 2a 70 52 62 75 56 66 73 20 3d 20 70 2d 3e 70   *pRbuVfs = p->p
22ef0 52 62 75 56 66 73 3b 0a 20 20 20 20 63 68 61 72  RbuVfs;.    char
22f00 20 2a 7a 49 6e 20 3d 20 2a 28 63 68 61 72 2a 2a   *zIn = *(char**
22f10 29 70 41 72 67 3b 0a 20 20 20 20 63 68 61 72 20  )pArg;.    char 
22f20 2a 7a 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 5f  *zOut = sqlite3_
22f30 6d 70 72 69 6e 74 66 28 22 72 62 75 28 25 73 29  mprintf("rbu(%s)
22f40 2f 25 7a 22 2c 20 70 52 62 75 56 66 73 2d 3e 62  /%z", pRbuVfs->b
22f50 61 73 65 2e 7a 4e 61 6d 65 2c 20 7a 49 6e 29 3b  ase.zName, zIn);
22f60 0a 20 20 20 20 2a 28 63 68 61 72 2a 2a 29 70 41  .    *(char**)pA
22f70 72 67 20 3d 20 7a 4f 75 74 3b 0a 20 20 20 20 69  rg = zOut;.    i
22f80 66 28 20 7a 4f 75 74 3d 3d 30 20 29 20 72 63 20  f( zOut==0 ) rc 
22f90 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
22fa0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
22fb0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
22fc0 6e 20 74 68 65 20 73 65 63 74 6f 72 2d 73 69 7a  n the sector-siz
22fd0 65 20 69 6e 20 62 79 74 65 73 20 66 6f 72 20 61  e in bytes for a
22fe0 6e 20 72 62 75 56 66 73 2d 66 69 6c 65 2e 0a 2a  n rbuVfs-file..*
22ff0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62 75  /.static int rbu
23000 56 66 73 53 65 63 74 6f 72 53 69 7a 65 28 73 71  VfsSectorSize(sq
23010 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
23020 65 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a  e){.  rbu_file *
23030 70 20 3d 20 28 72 62 75 5f 66 69 6c 65 20 2a 29  p = (rbu_file *)
23040 70 46 69 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20  pFile;.  return 
23050 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f  p->pReal->pMetho
23060 64 73 2d 3e 78 53 65 63 74 6f 72 53 69 7a 65 28  ds->xSectorSize(
23070 70 2d 3e 70 52 65 61 6c 29 3b 0a 7d 0a 0a 2f 2a  p->pReal);.}../*
23080 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64  .** Return the d
23090 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69  evice characteri
230a0 73 74 69 63 20 66 6c 61 67 73 20 73 75 70 70 6f  stic flags suppo
230b0 72 74 65 64 20 62 79 20 61 6e 20 72 62 75 56 66  rted by an rbuVf
230c0 73 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  s-file..*/.stati
230d0 63 20 69 6e 74 20 72 62 75 56 66 73 44 65 76 69  c int rbuVfsDevi
230e0 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
230f0 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  s(sqlite3_file *
23100 70 46 69 6c 65 29 7b 0a 20 20 72 62 75 5f 66 69  pFile){.  rbu_fi
23110 6c 65 20 2a 70 20 3d 20 28 72 62 75 5f 66 69 6c  le *p = (rbu_fil
23120 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 72 65 74  e *)pFile;.  ret
23130 75 72 6e 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d  urn p->pReal->pM
23140 65 74 68 6f 64 73 2d 3e 78 44 65 76 69 63 65 43  ethods->xDeviceC
23150 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
23160 2d 3e 70 52 65 61 6c 29 3b 0a 7d 0a 0a 2f 2a 0a  ->pReal);.}../*.
23170 2a 2a 20 54 61 6b 65 20 6f 72 20 72 65 6c 65 61  ** Take or relea
23180 73 65 20 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f  se a shared-memo
23190 72 79 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74  ry lock..*/.stat
231a0 69 63 20 69 6e 74 20 72 62 75 56 66 73 53 68 6d  ic int rbuVfsShm
231b0 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
231c0 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20 6f 66  e *pFile, int of
231d0 73 74 2c 20 69 6e 74 20 6e 2c 20 69 6e 74 20 66  st, int n, int f
231e0 6c 61 67 73 29 7b 0a 20 20 72 62 75 5f 66 69 6c  lags){.  rbu_fil
231f0 65 20 2a 70 20 3d 20 28 72 62 75 5f 66 69 6c 65  e *p = (rbu_file
23200 2a 29 70 46 69 6c 65 3b 0a 20 20 73 71 6c 69 74  *)pFile;.  sqlit
23210 65 33 72 62 75 20 2a 70 52 62 75 20 3d 20 70 2d  e3rbu *pRbu = p-
23220 3e 70 52 62 75 3b 0a 20 20 69 6e 74 20 72 63 20  >pRbu;.  int rc 
23230 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 23 69  = SQLITE_OK;..#i
23240 66 64 65 66 20 53 51 4c 49 54 45 5f 41 4d 41 4c  fdef SQLITE_AMAL
23250 47 41 4d 41 54 49 4f 4e 0a 20 20 20 20 61 73 73  GAMATION.    ass
23260 65 72 74 28 20 57 41 4c 5f 43 4b 50 54 5f 4c 4f  ert( WAL_CKPT_LO
23270 43 4b 3d 3d 31 20 29 3b 0a 23 65 6e 64 69 66 0a  CK==1 );.#endif.
23280 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70  .  assert( p->op
23290 65 6e 46 6c 61 67 73 20 26 20 28 53 51 4c 49 54  enFlags & (SQLIT
232a0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 7c 53  E_OPEN_MAIN_DB|S
232b0 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
232c0 44 42 29 20 29 3b 0a 20 20 69 66 28 20 70 52 62  DB) );.  if( pRb
232d0 75 20 26 26 20 28 70 52 62 75 2d 3e 65 53 74 61  u && (pRbu->eSta
232e0 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4f 41  ge==RBU_STAGE_OA
232f0 4c 20 7c 7c 20 70 52 62 75 2d 3e 65 53 74 61 67  L || pRbu->eStag
23300 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4d 4f 56  e==RBU_STAGE_MOV
23310 45 29 20 29 7b 0a 20 20 20 20 2f 2a 20 4d 61 67  E) ){.    /* Mag
23320 69 63 20 6e 75 6d 62 65 72 20 31 20 69 73 20 74  ic number 1 is t
23330 68 65 20 57 41 4c 5f 43 4b 50 54 5f 4c 4f 43 4b  he WAL_CKPT_LOCK
23340 20 6c 6f 63 6b 2e 20 50 72 65 76 65 6e 74 69 6e   lock. Preventin
23350 67 20 53 51 4c 69 74 65 20 66 72 6f 6d 0a 20 20  g SQLite from.  
23360 20 20 2a 2a 20 74 61 6b 69 6e 67 20 74 68 69 73    ** taking this
23370 20 6c 6f 63 6b 20 61 6c 73 6f 20 70 72 65 76 65   lock also preve
23380 6e 74 73 20 61 6e 79 20 63 68 65 63 6b 70 6f 69  nts any checkpoi
23390 6e 74 73 20 66 72 6f 6d 20 6f 63 63 75 72 72 69  nts from occurri
233a0 6e 67 2e 20 0a 20 20 20 20 2a 2a 20 74 6f 64 6f  ng. .    ** todo
233b0 3a 20 72 65 61 6c 6c 79 2c 20 69 74 27 73 20 6e  : really, it's n
233c0 6f 74 20 63 6c 65 61 72 20 77 68 79 20 74 68 69  ot clear why thi
233d0 73 20 6d 69 67 68 74 20 6f 63 63 75 72 2c 20 61  s might occur, a
233e0 73 20 0a 20 20 20 20 2a 2a 20 77 61 6c 5f 61 75  s .    ** wal_au
233f0 74 6f 63 68 65 63 6b 70 6f 69 6e 74 20 6f 75 67  tocheckpoint oug
23400 68 74 20 74 6f 20 62 65 20 74 75 72 6e 65 64 20  ht to be turned 
23410 6f 66 66 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  off.  */.    if(
23420 20 6f 66 73 74 3d 3d 57 41 4c 5f 4c 4f 43 4b 5f   ofst==WAL_LOCK_
23430 43 4b 50 54 20 26 26 20 6e 3d 3d 31 20 29 20 72  CKPT && n==1 ) r
23440 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
23450 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
23460 74 20 62 43 61 70 74 75 72 65 20 3d 20 30 3b 0a  t bCapture = 0;.
23470 20 20 20 20 69 66 28 20 6e 3d 3d 31 20 26 26 20      if( n==1 && 
23480 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
23490 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 0a 20  SHM_EXCLUSIVE). 
234a0 20 20 20 20 26 26 20 70 52 62 75 20 26 26 20 70      && pRbu && p
234b0 52 62 75 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55  Rbu->eStage==RBU
234c0 5f 53 54 41 47 45 5f 43 41 50 54 55 52 45 0a 20  _STAGE_CAPTURE. 
234d0 20 20 20 20 26 26 20 28 6f 66 73 74 3d 3d 57 41      && (ofst==WA
234e0 4c 5f 4c 4f 43 4b 5f 57 52 49 54 45 20 7c 7c 20  L_LOCK_WRITE || 
234f0 6f 66 73 74 3d 3d 57 41 4c 5f 4c 4f 43 4b 5f 43  ofst==WAL_LOCK_C
23500 4b 50 54 20 7c 7c 20 6f 66 73 74 3d 3d 57 41 4c  KPT || ofst==WAL
23510 5f 4c 4f 43 4b 5f 52 45 41 44 30 29 0a 20 20 20  _LOCK_READ0).   
23520 20 29 7b 0a 20 20 20 20 20 20 62 43 61 70 74 75   ){.      bCaptu
23530 72 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20  re = 1;.    }.. 
23540 20 20 20 69 66 28 20 62 43 61 70 74 75 72 65 3d     if( bCapture=
23550 3d 30 20 7c 7c 20 30 3d 3d 28 66 6c 61 67 73 20  =0 || 0==(flags 
23560 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c  & SQLITE_SHM_UNL
23570 4f 43 4b 29 20 29 7b 0a 20 20 20 20 20 20 72 63  OCK) ){.      rc
23580 20 3d 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65   = p->pReal->pMe
23590 74 68 6f 64 73 2d 3e 78 53 68 6d 4c 6f 63 6b 28  thods->xShmLock(
235a0 70 2d 3e 70 52 65 61 6c 2c 20 6f 66 73 74 2c 20  p->pReal, ofst, 
235b0 6e 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 20  n, flags);.     
235c0 20 69 66 28 20 62 43 61 70 74 75 72 65 20 26 26   if( bCapture &&
235d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
235e0 7b 0a 20 20 20 20 20 20 20 20 70 52 62 75 2d 3e  {.        pRbu->
235f0 6d 4c 6f 63 6b 20 7c 3d 20 28 31 20 3c 3c 20 6f  mLock |= (1 << o
23600 66 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  fst);.      }.  
23610 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
23620 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  n rc;.}../*.** O
23630 62 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20  btain a pointer 
23640 74 6f 20 61 20 6d 61 70 70 69 6e 67 20 6f 66 20  to a mapping of 
23650 61 20 73 69 6e 67 6c 65 20 33 32 4b 69 42 20 70  a single 32KiB p
23660 61 67 65 20 6f 66 20 74 68 65 20 2a 2d 73 68 6d  age of the *-shm
23670 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
23680 20 69 6e 74 20 72 62 75 56 66 73 53 68 6d 4d 61   int rbuVfsShmMa
23690 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  p(.  sqlite3_fil
236a0 65 20 2a 70 46 69 6c 65 2c 20 0a 20 20 69 6e 74  e *pFile, .  int
236b0 20 69 52 65 67 69 6f 6e 2c 20 0a 20 20 69 6e 74   iRegion, .  int
236c0 20 73 7a 52 65 67 69 6f 6e 2c 20 0a 20 20 69 6e   szRegion, .  in
236d0 74 20 69 73 57 72 69 74 65 2c 20 0a 20 20 76 6f  t isWrite, .  vo
236e0 69 64 20 76 6f 6c 61 74 69 6c 65 20 2a 2a 70 70  id volatile **pp
236f0 0a 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a  .){.  rbu_file *
23700 70 20 3d 20 28 72 62 75 5f 66 69 6c 65 2a 29 70  p = (rbu_file*)p
23710 46 69 6c 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d  File;.  int rc =
23720 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
23730 74 20 65 53 74 61 67 65 20 3d 20 28 70 2d 3e 70  t eStage = (p->p
23740 52 62 75 20 3f 20 70 2d 3e 70 52 62 75 2d 3e 65  Rbu ? p->pRbu->e
23750 53 74 61 67 65 20 3a 20 30 29 3b 0a 0a 20 20 2f  Stage : 0);..  /
23760 2a 20 49 66 20 6e 6f 74 20 69 6e 20 52 42 55 5f  * If not in RBU_
23770 53 54 41 47 45 5f 4f 41 4c 2c 20 61 6c 6c 6f 77  STAGE_OAL, allow
23780 20 74 68 69 73 20 63 61 6c 6c 20 74 6f 20 70 61   this call to pa
23790 73 73 20 74 68 72 6f 75 67 68 2e 20 4f 72 2c 20  ss through. Or, 
237a0 69 66 20 74 68 69 73 0a 20 20 2a 2a 20 72 62 75  if this.  ** rbu
237b0 20 69 73 20 69 6e 20 74 68 65 20 52 42 55 5f 53   is in the RBU_S
237c0 54 41 47 45 5f 4f 41 4c 20 73 74 61 74 65 2c 20  TAGE_OAL state, 
237d0 75 73 65 20 68 65 61 70 20 6d 65 6d 6f 72 79 20  use heap memory 
237e0 66 6f 72 20 2a 2d 73 68 6d 20 73 70 61 63 65 20  for *-shm space 
237f0 0a 20 20 2a 2a 20 69 6e 73 74 65 61 64 20 6f 66  .  ** instead of
23800 20 61 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e   a file on disk.
23810 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
23820 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20 28 53  ->openFlags & (S
23830 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
23840 44 42 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54  DB|SQLITE_OPEN_T
23850 45 4d 50 5f 44 42 29 20 29 3b 0a 20 20 69 66 28  EMP_DB) );.  if(
23860 20 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41   eStage==RBU_STA
23870 47 45 5f 4f 41 4c 20 7c 7c 20 65 53 74 61 67 65  GE_OAL || eStage
23880 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4d 4f 56 45  ==RBU_STAGE_MOVE
23890 20 29 7b 0a 20 20 20 20 69 66 28 20 69 52 65 67   ){.    if( iReg
238a0 69 6f 6e 3c 3d 70 2d 3e 6e 53 68 6d 20 29 7b 0a  ion<=p->nShm ){.
238b0 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20        int nByte 
238c0 3d 20 28 69 52 65 67 69 6f 6e 2b 31 29 20 2a 20  = (iRegion+1) * 
238d0 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 3b 0a 20  sizeof(char*);. 
238e0 20 20 20 20 20 63 68 61 72 20 2a 2a 61 70 4e 65       char **apNe
238f0 77 20 3d 20 28 63 68 61 72 2a 2a 29 73 71 6c 69  w = (char**)sqli
23900 74 65 33 5f 72 65 61 6c 6c 6f 63 36 34 28 70 2d  te3_realloc64(p-
23910 3e 61 70 53 68 6d 2c 20 6e 42 79 74 65 29 3b 0a  >apShm, nByte);.
23920 20 20 20 20 20 20 69 66 28 20 61 70 4e 65 77 3d        if( apNew=
23930 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
23940 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
23950 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
23960 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 61 70        memset(&ap
23970 4e 65 77 5b 70 2d 3e 6e 53 68 6d 5d 2c 20 30 2c  New[p->nShm], 0,
23980 20 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 20 2a   sizeof(char*) *
23990 20 28 31 20 2b 20 69 52 65 67 69 6f 6e 20 2d 20   (1 + iRegion - 
239a0 70 2d 3e 6e 53 68 6d 29 29 3b 0a 20 20 20 20 20  p->nShm));.     
239b0 20 20 20 70 2d 3e 61 70 53 68 6d 20 3d 20 61 70     p->apShm = ap
239c0 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  New;.        p->
239d0 6e 53 68 6d 20 3d 20 69 52 65 67 69 6f 6e 2b 31  nShm = iRegion+1
239e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
239f0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
23a00 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 61 70 53  ITE_OK && p->apS
23a10 68 6d 5b 69 52 65 67 69 6f 6e 5d 3d 3d 30 20 29  hm[iRegion]==0 )
23a20 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70 4e  {.      char *pN
23a30 65 77 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69  ew = (char*)sqli
23a40 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 73 7a 52  te3_malloc64(szR
23a50 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 69 66  egion);.      if
23a60 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( pNew==0 ){.   
23a70 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
23a80 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65  _NOMEM;.      }e
23a90 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  lse{.        mem
23aa0 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 7a 52  set(pNew, 0, szR
23ab0 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20 20  egion);.        
23ac0 70 2d 3e 61 70 53 68 6d 5b 69 52 65 67 69 6f 6e  p->apShm[iRegion
23ad0 5d 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20  ] = pNew;.      
23ae0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  }.    }..    if(
23af0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
23b00 7b 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 70 2d  {.      *pp = p-
23b10 3e 61 70 53 68 6d 5b 69 52 65 67 69 6f 6e 5d 3b  >apShm[iRegion];
23b20 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
23b30 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20 20 20 7d    *pp = 0;.    }
23b40 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
23b50 73 65 72 74 28 20 70 2d 3e 61 70 53 68 6d 3d 3d  sert( p->apShm==
23b60 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 2d  0 );.    rc = p-
23b70 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73  >pReal->pMethods
23b80 2d 3e 78 53 68 6d 4d 61 70 28 70 2d 3e 70 52 65  ->xShmMap(p->pRe
23b90 61 6c 2c 20 69 52 65 67 69 6f 6e 2c 20 73 7a 52  al, iRegion, szR
23ba0 65 67 69 6f 6e 2c 20 69 73 57 72 69 74 65 2c 20  egion, isWrite, 
23bb0 70 70 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  pp);.  }..  retu
23bc0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
23bd0 4d 65 6d 6f 72 79 20 62 61 72 72 69 65 72 2e 0a  Memory barrier..
23be0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
23bf0 62 75 56 66 73 53 68 6d 42 61 72 72 69 65 72 28  buVfsShmBarrier(
23c00 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
23c10 69 6c 65 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65  ile){.  rbu_file
23c20 20 2a 70 20 3d 20 28 72 62 75 5f 66 69 6c 65 20   *p = (rbu_file 
23c30 2a 29 70 46 69 6c 65 3b 0a 20 20 70 2d 3e 70 52  *)pFile;.  p->pR
23c40 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78  eal->pMethods->x
23c50 53 68 6d 42 61 72 72 69 65 72 28 70 2d 3e 70 52  ShmBarrier(p->pR
23c60 65 61 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  eal);.}../*.** T
23c70 68 65 20 78 53 68 6d 55 6e 6d 61 70 20 6d 65 74  he xShmUnmap met
23c80 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  hod..*/.static i
23c90 6e 74 20 72 62 75 56 66 73 53 68 6d 55 6e 6d 61  nt rbuVfsShmUnma
23ca0 70 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  p(sqlite3_file *
23cb0 70 46 69 6c 65 2c 20 69 6e 74 20 64 65 6c 46 6c  pFile, int delFl
23cc0 61 67 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20  ag){.  rbu_file 
23cd0 2a 70 20 3d 20 28 72 62 75 5f 66 69 6c 65 2a 29  *p = (rbu_file*)
23ce0 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20 72 63 20  pFile;.  int rc 
23cf0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
23d00 6e 74 20 65 53 74 61 67 65 20 3d 20 28 70 2d 3e  nt eStage = (p->
23d10 70 52 62 75 20 3f 20 70 2d 3e 70 52 62 75 2d 3e  pRbu ? p->pRbu->
23d20 65 53 74 61 67 65 20 3a 20 30 29 3b 0a 0a 20 20  eStage : 0);..  
23d30 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 65 6e 46  assert( p->openF
23d40 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f 4f  lags & (SQLITE_O
23d50 50 45 4e 5f 4d 41 49 4e 5f 44 42 7c 53 51 4c 49  PEN_MAIN_DB|SQLI
23d60 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 29  TE_OPEN_TEMP_DB)
23d70 20 29 3b 0a 20 20 69 66 28 20 65 53 74 61 67 65   );.  if( eStage
23d80 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20  ==RBU_STAGE_OAL 
23d90 7c 7c 20 65 53 74 61 67 65 3d 3d 52 42 55 5f 53  || eStage==RBU_S
23da0 54 41 47 45 5f 4d 4f 56 45 20 29 7b 0a 20 20 20  TAGE_MOVE ){.   
23db0 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 7d   /* no-op */.  }
23dc0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 52 65 6c  else{.    /* Rel
23dd0 65 61 73 65 20 74 68 65 20 63 68 65 63 6b 70 6f  ease the checkpo
23de0 69 6e 74 65 72 20 61 6e 64 20 77 72 69 74 65 72  inter and writer
23df0 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 72 62   locks */.    rb
23e00 75 55 6e 6c 6f 63 6b 53 68 6d 28 70 29 3b 0a 20  uUnlockShm(p);. 
23e10 20 20 20 72 63 20 3d 20 70 2d 3e 70 52 65 61 6c     rc = p->pReal
23e20 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53 68 6d  ->pMethods->xShm
23e30 55 6e 6d 61 70 28 70 2d 3e 70 52 65 61 6c 2c 20  Unmap(p->pReal, 
23e40 64 65 6c 46 6c 61 67 29 3b 0a 20 20 7d 0a 20 20  delFlag);.  }.  
23e50 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
23e60 20 0a 2a 2a 20 41 20 6d 61 69 6e 20 64 61 74 61   .** A main data
23e70 62 61 73 65 20 6e 61 6d 65 64 20 7a 4e 61 6d 65  base named zName
23e80 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 6f   has just been o
23e90 70 65 6e 65 64 2e 20 54 68 65 20 66 6f 6c 6c 6f  pened. The follo
23ea0 77 69 6e 67 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  wing .** functio
23eb0 6e 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e  n returns a poin
23ec0 74 65 72 20 74 6f 20 61 20 62 75 66 66 65 72 20  ter to a buffer 
23ed0 6f 77 6e 65 64 20 62 79 20 53 51 4c 69 74 65 20  owned by SQLite 
23ee0 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  that contains.**
23ef0 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
23f00 20 2a 2d 77 61 6c 20 66 69 6c 65 20 74 68 69 73   *-wal file this
23f10 20 64 62 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77   db connection w
23f20 69 6c 6c 20 75 73 65 2e 20 53 51 4c 69 74 65 0a  ill use. SQLite.
23f30 2a 2a 20 68 61 70 70 65 6e 73 20 74 6f 20 70 61  ** happens to pa
23f40 73 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ss a pointer to 
23f50 74 68 69 73 20 62 75 66 66 65 72 20 77 68 65 6e  this buffer when
23f60 20 75 73 69 6e 67 20 78 41 63 63 65 73 73 28 29   using xAccess()
23f70 0a 2a 2a 20 6f 72 20 78 4f 70 65 6e 28 29 20 74  .** or xOpen() t
23f80 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65  o operate on the
23f90 20 2a 2d 77 61 6c 20 66 69 6c 65 2e 20 20 0a 2a   *-wal file.  .*
23fa0 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  /.static const c
23fb0 68 61 72 20 2a 72 62 75 4d 61 69 6e 54 6f 57 61  har *rbuMainToWa
23fc0 6c 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  l(const char *zN
23fd0 61 6d 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  ame, int flags){
23fe0 0a 20 20 69 6e 74 20 6e 20 3d 20 28 69 6e 74 29  .  int n = (int)
23ff0 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20  strlen(zName);. 
24000 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
24010 20 26 7a 4e 61 6d 65 5b 6e 5d 3b 0a 20 20 69 66   &zName[n];.  if
24020 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ( flags & SQLITE
24030 5f 4f 50 45 4e 5f 55 52 49 20 29 7b 0a 20 20 20  _OPEN_URI ){.   
24040 20 69 6e 74 20 6f 64 64 20 3d 20 30 3b 0a 20 20   int odd = 0;.  
24050 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20    while( 1 ){.  
24060 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 30 20      if( z[0]==0 
24070 29 7b 0a 20 20 20 20 20 20 20 20 6f 64 64 20 3d  ){.        odd =
24080 20 31 20 2d 20 6f 64 64 3b 0a 20 20 20 20 20 20   1 - odd;.      
24090 20 20 69 66 28 20 6f 64 64 20 26 26 20 7a 5b 31    if( odd && z[1
240a0 5d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  ]==0 ) break;.  
240b0 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 2b 2b 3b      }.      z++;
240c0 0a 20 20 20 20 7d 0a 20 20 20 20 7a 20 2b 3d 20  .    }.    z += 
240d0 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  2;.  }else{.    
240e0 77 68 69 6c 65 28 20 2a 7a 3d 3d 30 20 29 20 7a  while( *z==0 ) z
240f0 2b 2b 3b 0a 20 20 7d 0a 20 20 7a 20 2b 3d 20 28  ++;.  }.  z += (
24100 6e 20 2b 20 38 20 2b 20 31 29 3b 0a 20 20 72 65  n + 8 + 1);.  re
24110 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn z;.}../*.**
24120 20 4f 70 65 6e 20 61 6e 20 72 62 75 20 66 69 6c   Open an rbu fil
24130 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61  e handle..*/.sta
24140 74 69 63 20 69 6e 74 20 72 62 75 56 66 73 4f 70  tic int rbuVfsOp
24150 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  en(.  sqlite3_vf
24160 73 20 2a 70 56 66 73 2c 0a 20 20 63 6f 6e 73 74  s *pVfs,.  const
24170 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20   char *zName,.  
24180 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
24190 69 6c 65 2c 0a 20 20 69 6e 74 20 66 6c 61 67 73  ile,.  int flags
241a0 2c 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46 6c 61  ,.  int *pOutFla
241b0 67 73 0a 29 7b 0a 20 20 73 74 61 74 69 63 20 73  gs.){.  static s
241c0 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
241d0 73 20 72 62 75 76 66 73 5f 69 6f 5f 6d 65 74 68  s rbuvfs_io_meth
241e0 6f 64 73 20 3d 20 7b 0a 20 20 20 20 32 2c 20 20  ods = {.    2,  
241f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24200 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65            /* iVe
24210 72 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 72 62 75  rsion */.    rbu
24220 56 66 73 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  VfsClose,       
24230 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
24240 6c 6f 73 65 20 2a 2f 0a 20 20 20 20 72 62 75 56  lose */.    rbuV
24250 66 73 52 65 61 64 2c 20 20 20 20 20 20 20 20 20  fsRead,         
24260 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65            /* xRe
24270 61 64 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73  ad */.    rbuVfs
24280 57 72 69 74 65 2c 20 20 20 20 20 20 20 20 20 20  Write,          
24290 20 20 20 20 20 20 20 20 2f 2a 20 78 57 72 69 74          /* xWrit
242a0 65 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 54  e */.    rbuVfsT
242b0 72 75 6e 63 61 74 65 2c 20 20 20 20 20 20 20 20  runcate,        
242c0 20 20 20 20 20 20 20 2f 2a 20 78 54 72 75 6e 63         /* xTrunc
242d0 61 74 65 20 2a 2f 0a 20 20 20 20 72 62 75 56 66  ate */.    rbuVf
242e0 73 53 79 6e 63 2c 20 20 20 20 20 20 20 20 20 20  sSync,          
242f0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 79 6e           /* xSyn
24300 63 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 46  c */.    rbuVfsF
24310 69 6c 65 53 69 7a 65 2c 20 20 20 20 20 20 20 20  ileSize,        
24320 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 53         /* xFileS
24330 69 7a 65 20 2a 2f 0a 20 20 20 20 72 62 75 56 66  ize */.    rbuVf
24340 73 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  sLock,          
24350 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63           /* xLoc
24360 6b 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 55  k */.    rbuVfsU
24370 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  nlock,          
24380 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
24390 6b 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 43  k */.    rbuVfsC
243a0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
243b0 2c 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b  ,      /* xCheck
243c0 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 2a 2f 0a  ReservedLock */.
243d0 20 20 20 20 72 62 75 56 66 73 46 69 6c 65 43 6f      rbuVfsFileCo
243e0 6e 74 72 6f 6c 2c 20 20 20 20 20 20 20 20 20 20  ntrol,          
243f0 20 20 2f 2a 20 78 46 69 6c 65 43 6f 6e 74 72 6f    /* xFileContro
24400 6c 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 53  l */.    rbuVfsS
24410 65 63 74 6f 72 53 69 7a 65 2c 20 20 20 20 20 20  ectorSize,      
24420 20 20 20 20 20 20 20 2f 2a 20 78 53 65 63 74 6f         /* xSecto
24430 72 53 69 7a 65 20 2a 2f 0a 20 20 20 20 72 62 75  rSize */.    rbu
24440 56 66 73 44 65 76 69 63 65 43 68 61 72 61 63 74  VfsDeviceCharact
24450 65 72 69 73 74 69 63 73 2c 20 20 2f 2a 20 78 44  eristics,  /* xD
24460 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
24470 74 69 63 73 20 2a 2f 0a 20 20 20 20 72 62 75 56  tics */.    rbuV
24480 66 73 53 68 6d 4d 61 70 2c 20 20 20 20 20 20 20  fsShmMap,       
24490 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
244a0 6d 4d 61 70 20 2a 2f 0a 20 20 20 20 72 62 75 56  mMap */.    rbuV
244b0 66 73 53 68 6d 4c 6f 63 6b 2c 20 20 20 20 20 20  fsShmLock,      
244c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
244d0 6d 4c 6f 63 6b 20 2a 2f 0a 20 20 20 20 72 62 75  mLock */.    rbu
244e0 56 66 73 53 68 6d 42 61 72 72 69 65 72 2c 20 20  VfsShmBarrier,  
244f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
24500 68 6d 42 61 72 72 69 65 72 20 2a 2f 0a 20 20 20  hmBarrier */.   
24510 20 72 62 75 56 66 73 53 68 6d 55 6e 6d 61 70 2c   rbuVfsShmUnmap,
24520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24530 2a 20 78 53 68 6d 55 6e 6d 61 70 20 2a 2f 0a 20  * xShmUnmap */. 
24540 20 20 20 30 2c 20 30 20 20 20 20 20 20 20 20 20     0, 0         
24550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24560 20 2f 2a 20 78 46 65 74 63 68 2c 20 78 55 6e 66   /* xFetch, xUnf
24570 65 74 63 68 20 2a 2f 0a 20 20 7d 3b 0a 20 20 72  etch */.  };.  r
24580 62 75 5f 76 66 73 20 2a 70 52 62 75 56 66 73 20  bu_vfs *pRbuVfs 
24590 3d 20 28 72 62 75 5f 76 66 73 2a 29 70 56 66 73  = (rbu_vfs*)pVfs
245a0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  ;.  sqlite3_vfs 
245b0 2a 70 52 65 61 6c 56 66 73 20 3d 20 70 52 62 75  *pRealVfs = pRbu
245c0 56 66 73 2d 3e 70 52 65 61 6c 56 66 73 3b 0a 20  Vfs->pRealVfs;. 
245d0 20 72 62 75 5f 66 69 6c 65 20 2a 70 46 64 20 3d   rbu_file *pFd =
245e0 20 28 72 62 75 5f 66 69 6c 65 20 2a 29 70 46 69   (rbu_file *)pFi
245f0 6c 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  le;.  int rc = S
24600 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63 6f 6e 73  QLITE_OK;.  cons
24610 74 20 63 68 61 72 20 2a 7a 4f 70 65 6e 20 3d 20  t char *zOpen = 
24620 7a 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 6f 66 6c  zName;.  int ofl
24630 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 0a 20 20  ags = flags;..  
24640 6d 65 6d 73 65 74 28 70 46 64 2c 20 30 2c 20 73  memset(pFd, 0, s
24650 69 7a 65 6f 66 28 72 62 75 5f 66 69 6c 65 29 29  izeof(rbu_file))
24660 3b 0a 20 20 70 46 64 2d 3e 70 52 65 61 6c 20 3d  ;.  pFd->pReal =
24670 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29   (sqlite3_file*)
24680 26 70 46 64 5b 31 5d 3b 0a 20 20 70 46 64 2d 3e  &pFd[1];.  pFd->
24690 70 52 62 75 56 66 73 20 3d 20 70 52 62 75 56 66  pRbuVfs = pRbuVf
246a0 73 3b 0a 20 20 70 46 64 2d 3e 6f 70 65 6e 46 6c  s;.  pFd->openFl
246b0 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 69  ags = flags;.  i
246c0 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  f( zName ){.    
246d0 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49  if( flags & SQLI
246e0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20  TE_OPEN_MAIN_DB 
246f0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 6d 61  ){.      /* A ma
24700 69 6e 20 64 61 74 61 62 61 73 65 20 68 61 73 20  in database has 
24710 6a 75 73 74 20 62 65 65 6e 20 6f 70 65 6e 65 64  just been opened
24720 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  . The following 
24730 62 6c 6f 63 6b 20 73 65 74 73 0a 20 20 20 20 20  block sets.     
24740 20 2a 2a 20 28 70 46 64 2d 3e 7a 57 61 6c 29 20   ** (pFd->zWal) 
24750 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75  to point to a bu
24760 66 66 65 72 20 6f 77 6e 65 64 20 62 79 20 53 51  ffer owned by SQ
24770 4c 69 74 65 20 74 68 61 74 20 63 6f 6e 74 61 69  Lite that contai
24780 6e 73 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  ns.      ** the 
24790 6e 61 6d 65 20 6f 66 20 74 68 65 20 2a 2d 77 61  name of the *-wa
247a0 6c 20 66 69 6c 65 20 74 68 69 73 20 64 62 20 63  l file this db c
247b0 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 6c 6c 20 75  onnection will u
247c0 73 65 2e 20 53 51 4c 69 74 65 0a 20 20 20 20 20  se. SQLite.     
247d0 20 2a 2a 20 68 61 70 70 65 6e 73 20 74 6f 20 70   ** happens to p
247e0 61 73 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ass a pointer to
247f0 20 74 68 69 73 20 62 75 66 66 65 72 20 77 68 65   this buffer whe
24800 6e 20 75 73 69 6e 67 20 78 41 63 63 65 73 73 28  n using xAccess(
24810 29 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 78 4f  ).      ** or xO
24820 70 65 6e 28 29 20 74 6f 20 6f 70 65 72 61 74 65  pen() to operate
24830 20 6f 6e 20 74 68 65 20 2a 2d 77 61 6c 20 66 69   on the *-wal fi
24840 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 70 46  le.  */.      pF
24850 64 2d 3e 7a 57 61 6c 20 3d 20 72 62 75 4d 61 69  d->zWal = rbuMai
24860 6e 54 6f 57 61 6c 28 7a 4e 61 6d 65 2c 20 66 6c  nToWal(zName, fl
24870 61 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ags);.    }.    
24880 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26  else if( flags &
24890 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c   SQLITE_OPEN_WAL
248a0 20 29 7b 0a 20 20 20 20 20 20 72 62 75 5f 66 69   ){.      rbu_fi
248b0 6c 65 20 2a 70 44 62 20 3d 20 72 62 75 46 69 6e  le *pDb = rbuFin
248c0 64 4d 61 69 6e 64 62 28 70 52 62 75 56 66 73 2c  dMaindb(pRbuVfs,
248d0 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20   zName, 0);.    
248e0 20 20 69 66 28 20 70 44 62 20 29 7b 0a 20 20 20    if( pDb ){.   
248f0 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 52       if( pDb->pR
24900 62 75 20 26 26 20 70 44 62 2d 3e 70 52 62 75 2d  bu && pDb->pRbu-
24910 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41  >eStage==RBU_STA
24920 47 45 5f 4f 41 4c 20 29 7b 0a 20 20 20 20 20 20  GE_OAL ){.      
24930 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c      /* This call
24940 20 69 73 20 74 6f 20 6f 70 65 6e 20 61 20 2a 2d   is to open a *-
24950 77 61 6c 20 66 69 6c 65 2e 20 49 6e 74 65 61 64  wal file. Intead
24960 2c 20 6f 70 65 6e 20 74 68 65 20 2a 2d 6f 61 6c  , open the *-oal
24970 2e 20 54 68 69 73 0a 20 20 20 20 20 20 20 20 20  . This.         
24980 20 2a 2a 20 63 6f 64 65 20 65 6e 73 75 72 65 73   ** code ensures
24990 20 74 68 61 74 20 74 68 65 20 73 74 72 69 6e 67   that the string
249a0 20 70 61 73 73 65 64 20 74 6f 20 78 4f 70 65 6e   passed to xOpen
249b0 28 29 20 69 73 20 74 65 72 6d 69 6e 61 74 65 64  () is terminated
249c0 20 62 79 20 61 0a 20 20 20 20 20 20 20 20 20 20   by a.          
249d0 2a 2a 20 70 61 69 72 20 6f 66 20 27 5c 30 27 20  ** pair of '\0' 
249e0 62 79 74 65 73 20 69 6e 20 63 61 73 65 20 74 68  bytes in case th
249f0 65 20 56 46 53 20 61 74 74 65 6d 70 74 73 20 74  e VFS attempts t
24a00 6f 20 65 78 74 72 61 63 74 20 61 20 55 52 49 20  o extract a URI 
24a10 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61  .          ** pa
24a20 72 61 6d 65 74 65 72 20 66 72 6f 6d 20 69 74 2e  rameter from it.
24a30 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 63    */.          c
24a40 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 61 73 65  onst char *zBase
24a50 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20   = zName;.      
24a60 20 20 20 20 73 69 7a 65 5f 74 20 6e 43 6f 70 79      size_t nCopy
24a70 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72  ;.          char
24a80 20 2a 7a 43 6f 70 79 3b 0a 20 20 20 20 20 20 20   *zCopy;.       
24a90 20 20 20 69 66 28 20 72 62 75 49 73 56 61 63 75     if( rbuIsVacu
24aa0 75 6d 28 70 44 62 2d 3e 70 52 62 75 29 20 29 7b  um(pDb->pRbu) ){
24ab0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 42 61  .            zBa
24ac0 73 65 20 3d 20 73 71 6c 69 74 65 33 5f 64 62 5f  se = sqlite3_db_
24ad0 66 69 6c 65 6e 61 6d 65 28 70 44 62 2d 3e 70 52  filename(pDb->pR
24ae0 62 75 2d 3e 64 62 52 62 75 2c 20 22 6d 61 69 6e  bu->dbRbu, "main
24af0 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ");.            
24b00 7a 42 61 73 65 20 3d 20 72 62 75 4d 61 69 6e 54  zBase = rbuMainT
24b10 6f 57 61 6c 28 7a 42 61 73 65 2c 20 53 51 4c 49  oWal(zBase, SQLI
24b20 54 45 5f 4f 50 45 4e 5f 55 52 49 29 3b 0a 20 20  TE_OPEN_URI);.  
24b30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
24b40 20 20 20 20 6e 43 6f 70 79 20 3d 20 73 74 72 6c      nCopy = strl
24b50 65 6e 28 7a 42 61 73 65 29 3b 0a 20 20 20 20 20  en(zBase);.     
24b60 20 20 20 20 20 7a 43 6f 70 79 20 3d 20 73 71 6c       zCopy = sql
24b70 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 43  ite3_malloc64(nC
24b80 6f 70 79 2b 32 29 3b 0a 20 20 20 20 20 20 20 20  opy+2);.        
24b90 20 20 69 66 28 20 7a 43 6f 70 79 20 29 7b 0a 20    if( zCopy ){. 
24ba0 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
24bb0 79 28 7a 43 6f 70 79 2c 20 7a 42 61 73 65 2c 20  y(zCopy, zBase, 
24bc0 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 20 20  nCopy);.        
24bd0 20 20 20 20 7a 43 6f 70 79 5b 6e 43 6f 70 79 2d      zCopy[nCopy-
24be0 33 5d 20 3d 20 27 6f 27 3b 0a 20 20 20 20 20 20  3] = 'o';.      
24bf0 20 20 20 20 20 20 7a 43 6f 70 79 5b 6e 43 6f 70        zCopy[nCop
24c00 79 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20  y] = '\0';.     
24c10 20 20 20 20 20 20 20 7a 43 6f 70 79 5b 6e 43 6f         zCopy[nCo
24c20 70 79 2b 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  py+1] = '\0';.  
24c30 20 20 20 20 20 20 20 20 20 20 7a 4f 70 65 6e 20            zOpen 
24c40 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 28  = (const char*)(
24c50 70 46 64 2d 3e 7a 44 65 6c 20 3d 20 7a 43 6f 70  pFd->zDel = zCop
24c60 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  y);.          }e
24c70 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
24c80 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
24c90 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  EM;.          }.
24ca0 20 20 20 20 20 20 20 20 20 20 70 46 64 2d 3e 70            pFd->p
24cb0 52 62 75 20 3d 20 70 44 62 2d 3e 70 52 62 75 3b  Rbu = pDb->pRbu;
24cc0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
24cd0 20 20 20 70 44 62 2d 3e 70 57 61 6c 46 64 20 3d     pDb->pWalFd =
24ce0 20 70 46 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20   pFd;.      }.  
24cf0 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
24d00 20 70 46 64 2d 3e 70 52 62 75 20 3d 20 70 52 62   pFd->pRbu = pRb
24d10 75 56 66 73 2d 3e 70 52 62 75 3b 0a 20 20 7d 0a  uVfs->pRbu;.  }.
24d20 0a 20 20 69 66 28 20 6f 66 6c 61 67 73 20 26 20  .  if( oflags & 
24d30 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
24d40 5f 44 42 20 0a 20 20 20 26 26 20 73 71 6c 69 74  _DB .   && sqlit
24d50 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 7a  e3_uri_boolean(z
24d60 4e 61 6d 65 2c 20 22 72 62 75 5f 6d 65 6d 6f 72  Name, "rbu_memor
24d70 79 22 2c 20 30 29 20 0a 20 20 29 7b 0a 20 20 20  y", 0) .  ){.   
24d80 20 61 73 73 65 72 74 28 20 6f 66 6c 61 67 73 20   assert( oflags 
24d90 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  & SQLITE_OPEN_MA
24da0 49 4e 5f 44 42 20 29 3b 0a 20 20 20 20 6f 66 6c  IN_DB );.    ofl
24db0 61 67 73 20 3d 20 20 53 51 4c 49 54 45 5f 4f 50  ags =  SQLITE_OP
24dc0 45 4e 5f 54 45 4d 50 5f 44 42 20 7c 20 53 51 4c  EN_TEMP_DB | SQL
24dd0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
24de0 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  TE | SQLITE_OPEN
24df0 5f 43 52 45 41 54 45 20 7c 0a 20 20 20 20 20 20  _CREATE |.      
24e00 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
24e10 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 20  PEN_EXCLUSIVE | 
24e20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
24e30 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 20 20 7a  TEONCLOSE;.    z
24e40 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  Open = 0;.  }.. 
24e50 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
24e60 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  OK ){.    rc = p
24e70 52 65 61 6c 56 66 73 2d 3e 78 4f 70 65 6e 28 70  RealVfs->xOpen(p
24e80 52 65 61 6c 56 66 73 2c 20 7a 4f 70 65 6e 2c 20  RealVfs, zOpen, 
24e90 70 46 64 2d 3e 70 52 65 61 6c 2c 20 6f 66 6c 61  pFd->pReal, ofla
24ea0 67 73 2c 20 70 4f 75 74 46 6c 61 67 73 29 3b 0a  gs, pOutFlags);.
24eb0 20 20 7d 0a 20 20 69 66 28 20 70 46 64 2d 3e 70    }.  if( pFd->p
24ec0 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 20 29  Real->pMethods )
24ed0 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 78 4f 70  {.    /* The xOp
24ee0 65 6e 28 29 20 6f 70 65 72 61 74 69 6f 6e 20 68  en() operation h
24ef0 61 73 20 73 75 63 63 65 65 64 65 64 2e 20 53 65  as succeeded. Se
24f00 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69  t the sqlite3_fi
24f10 6c 65 2e 70 4d 65 74 68 6f 64 73 0a 20 20 20 20  le.pMethods.    
24f20 2a 2a 20 70 6f 69 6e 74 65 72 20 61 6e 64 2c 20  ** pointer and, 
24f30 69 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 61  if the file is a
24f40 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66   main database f
24f50 69 6c 65 2c 20 6c 69 6e 6b 20 69 74 20 69 6e 74  ile, link it int
24f60 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 6d 75 74  o the.    ** mut
24f70 65 78 20 70 72 6f 74 65 63 74 65 64 20 6c 69 6e  ex protected lin
24f80 6b 65 64 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  ked list of all 
24f90 73 75 63 68 20 66 69 6c 65 73 2e 20 20 2a 2f 0a  such files.  */.
24fa0 20 20 20 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68      pFile->pMeth
24fb0 6f 64 73 20 3d 20 26 72 62 75 76 66 73 5f 69 6f  ods = &rbuvfs_io
24fc0 5f 6d 65 74 68 6f 64 73 3b 0a 20 20 20 20 69 66  _methods;.    if
24fd0 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ( flags & SQLITE
24fe0 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 7b  _OPEN_MAIN_DB ){
24ff0 0a 20 20 20 20 20 20 72 62 75 4d 61 69 6e 6c 69  .      rbuMainli
25000 73 74 41 64 64 28 70 46 64 29 3b 0a 20 20 20 20  stAdd(pFd);.    
25010 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  }.  }else{.    s
25020 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46 64 2d  qlite3_free(pFd-
25030 3e 7a 44 65 6c 29 3b 0a 20 20 7d 0a 0a 20 20 72  >zDel);.  }..  r
25040 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
25050 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 66 69  ** Delete the fi
25060 6c 65 20 6c 6f 63 61 74 65 64 20 61 74 20 7a 50  le located at zP
25070 61 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ath..*/.static i
25080 6e 74 20 72 62 75 56 66 73 44 65 6c 65 74 65 28  nt rbuVfsDelete(
25090 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
250a0 73 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  s, const char *z
250b0 50 61 74 68 2c 20 69 6e 74 20 64 69 72 53 79 6e  Path, int dirSyn
250c0 63 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  c){.  sqlite3_vf
250d0 73 20 2a 70 52 65 61 6c 56 66 73 20 3d 20 28 28  s *pRealVfs = ((
250e0 72 62 75 5f 76 66 73 2a 29 70 56 66 73 29 2d 3e  rbu_vfs*)pVfs)->
250f0 70 52 65 61 6c 56 66 73 3b 0a 20 20 72 65 74 75  pRealVfs;.  retu
25100 72 6e 20 70 52 65 61 6c 56 66 73 2d 3e 78 44 65  rn pRealVfs->xDe
25110 6c 65 74 65 28 70 52 65 61 6c 56 66 73 2c 20 7a  lete(pRealVfs, z
25120 50 61 74 68 2c 20 64 69 72 53 79 6e 63 29 3b 0a  Path, dirSync);.
25130 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 66 6f  }../*.** Test fo
25140 72 20 61 63 63 65 73 73 20 70 65 72 6d 69 73 73  r access permiss
25150 69 6f 6e 73 2e 20 52 65 74 75 72 6e 20 74 72 75  ions. Return tru
25160 65 20 69 66 20 74 68 65 20 72 65 71 75 65 73 74  e if the request
25170 65 64 20 70 65 72 6d 69 73 73 69 6f 6e 0a 2a 2a  ed permission.**
25180 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f   is available, o
25190 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73  r false otherwis
251a0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
251b0 20 72 62 75 56 66 73 41 63 63 65 73 73 28 0a 20   rbuVfsAccess(. 
251c0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
251d0 66 73 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61  fs, .  const cha
251e0 72 20 2a 7a 50 61 74 68 2c 20 0a 20 20 69 6e 74  r *zPath, .  int
251f0 20 66 6c 61 67 73 2c 20 0a 20 20 69 6e 74 20 2a   flags, .  int *
25200 70 52 65 73 4f 75 74 0a 29 7b 0a 20 20 72 62 75  pResOut.){.  rbu
25210 5f 76 66 73 20 2a 70 52 62 75 56 66 73 20 3d 20  _vfs *pRbuVfs = 
25220 28 72 62 75 5f 76 66 73 2a 29 70 56 66 73 3b 0a  (rbu_vfs*)pVfs;.
25230 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
25240 52 65 61 6c 56 66 73 20 3d 20 70 52 62 75 56 66  RealVfs = pRbuVf
25250 73 2d 3e 70 52 65 61 6c 56 66 73 3b 0a 20 20 69  s->pRealVfs;.  i
25260 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 70  nt rc;..  rc = p
25270 52 65 61 6c 56 66 73 2d 3e 78 41 63 63 65 73 73  RealVfs->xAccess
25280 28 70 52 65 61 6c 56 66 73 2c 20 7a 50 61 74 68  (pRealVfs, zPath
25290 2c 20 66 6c 61 67 73 2c 20 70 52 65 73 4f 75 74  , flags, pResOut
252a0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  );..  /* If this
252b0 20 63 61 6c 6c 20 69 73 20 74 6f 20 63 68 65 63   call is to chec
252c0 6b 20 69 66 20 61 20 2a 2d 77 61 6c 20 66 69 6c  k if a *-wal fil
252d0 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
252e0 68 20 61 6e 20 52 42 55 20 74 61 72 67 65 74 0a  h an RBU target.
252f0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f    ** database co
25300 6e 6e 65 63 74 69 6f 6e 20 65 78 69 73 74 73 2c  nnection exists,
25310 20 61 6e 64 20 74 68 65 20 52 42 55 20 75 70 64   and the RBU upd
25320 61 74 65 20 69 73 20 69 6e 20 52 42 55 5f 53 54  ate is in RBU_ST
25330 41 47 45 5f 4f 41 4c 2c 0a 20 20 2a 2a 20 74 68  AGE_OAL,.  ** th
25340 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 70 65 63  e following spec
25350 69 61 6c 20 68 61 6e 64 6c 69 6e 67 20 69 73 20  ial handling is 
25360 61 63 74 69 76 61 74 65 64 3a 0a 20 20 2a 2a 0a  activated:.  **.
25370 20 20 2a 2a 20 20 20 61 29 20 69 66 20 74 68 65    **   a) if the
25380 20 2a 2d 77 61 6c 20 66 69 6c 65 20 64 6f 65 73   *-wal file does
25390 20 65 78 69 73 74 2c 20 72 65 74 75 72 6e 20 53   exist, return S
253a0 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2e 20  QLITE_CANTOPEN. 
253b0 54 68 69 73 0a 20 20 2a 2a 20 20 20 20 20 20 65  This.  **      e
253c0 6e 73 75 72 65 73 20 74 68 61 74 20 74 68 65 20  nsures that the 
253d0 52 42 55 20 65 78 74 65 6e 73 69 6f 6e 20 6e 65  RBU extension ne
253e0 76 65 72 20 74 72 69 65 73 20 74 6f 20 75 70 64  ver tries to upd
253f0 61 74 65 20 61 20 64 61 74 61 62 61 73 65 0a 20  ate a database. 
25400 20 2a 2a 20 20 20 20 20 20 69 6e 20 77 61 6c 20   **      in wal 
25410 6d 6f 64 65 2c 20 65 76 65 6e 20 69 66 20 74 68  mode, even if th
25420 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20  e first page of 
25430 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
25440 65 20 68 61 73 0a 20 20 2a 2a 20 20 20 20 20 20  e has.  **      
25450 62 65 65 6e 20 64 61 6d 61 67 65 64 2e 20 0a 20  been damaged. . 
25460 20 2a 2a 0a 20 20 2a 2a 20 20 20 62 29 20 69 66   **.  **   b) if
25470 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20   the *-wal file 
25480 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20  does not exist, 
25490 63 6c 61 69 6d 20 74 68 61 74 20 69 74 20 64 6f  claim that it do
254a0 65 73 20 61 6e 79 77 61 79 2c 0a 20 20 2a 2a 20  es anyway,.  ** 
254b0 20 20 20 20 20 63 61 75 73 69 6e 67 20 53 51 4c       causing SQL
254c0 69 74 65 20 74 6f 20 63 61 6c 6c 20 78 4f 70 65  ite to call xOpe
254d0 6e 28 29 20 74 6f 20 6f 70 65 6e 20 69 74 2e 20  n() to open it. 
254e0 54 68 69 73 20 63 61 6c 6c 20 77 69 6c 6c 20 61  This call will a
254f0 6c 73 6f 0a 20 20 2a 2a 20 20 20 20 20 20 62 65  lso.  **      be
25500 20 69 6e 74 65 72 63 65 70 74 65 64 20 28 73 65   intercepted (se
25510 65 20 74 68 65 20 72 62 75 56 66 73 4f 70 65 6e  e the rbuVfsOpen
25520 28 29 20 66 75 6e 63 74 69 6f 6e 29 20 61 6e 64  () function) and
25530 20 74 68 65 20 2a 2d 6f 61 6c 0a 20 20 2a 2a 20   the *-oal.  ** 
25540 20 20 20 20 20 66 69 6c 65 20 6f 70 65 6e 65 64       file opened
25550 20 69 6e 73 74 65 61 64 2e 0a 20 20 2a 2f 0a 20   instead..  */. 
25560 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
25570 4f 4b 20 26 26 20 66 6c 61 67 73 3d 3d 53 51 4c  OK && flags==SQL
25580 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
25590 53 20 29 7b 0a 20 20 20 20 72 62 75 5f 66 69 6c  S ){.    rbu_fil
255a0 65 20 2a 70 44 62 20 3d 20 72 62 75 46 69 6e 64  e *pDb = rbuFind
255b0 4d 61 69 6e 64 62 28 70 52 62 75 56 66 73 2c 20  Maindb(pRbuVfs, 
255c0 7a 50 61 74 68 2c 20 31 29 3b 0a 20 20 20 20 69  zPath, 1);.    i
255d0 66 28 20 70 44 62 20 26 26 20 70 44 62 2d 3e 70  f( pDb && pDb->p
255e0 52 62 75 20 26 26 20 70 44 62 2d 3e 70 52 62 75  Rbu && pDb->pRbu
255f0 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54  ->eStage==RBU_ST
25600 41 47 45 5f 4f 41 4c 20 29 7b 0a 20 20 20 20 20  AGE_OAL ){.     
25610 20 69 66 28 20 2a 70 52 65 73 4f 75 74 20 29 7b   if( *pResOut ){
25620 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
25630 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20  LITE_CANTOPEN;. 
25640 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
25650 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
25660 34 20 73 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20  4 sz = 0;.      
25670 20 20 72 63 20 3d 20 72 62 75 56 66 73 46 69 6c    rc = rbuVfsFil
25680 65 53 69 7a 65 28 26 70 44 62 2d 3e 62 61 73 65  eSize(&pDb->base
25690 2c 20 26 73 7a 29 3b 0a 20 20 20 20 20 20 20 20  , &sz);.        
256a0 2a 70 52 65 73 4f 75 74 20 3d 20 28 73 7a 3e 30  *pResOut = (sz>0
256b0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
256c0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
256d0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 75  c;.}../*.** Popu
256e0 6c 61 74 65 20 62 75 66 66 65 72 20 7a 4f 75 74  late buffer zOut
256f0 20 77 69 74 68 20 74 68 65 20 66 75 6c 6c 20 63   with the full c
25700 61 6e 6f 6e 69 63 61 6c 20 70 61 74 68 6e 61 6d  anonical pathnam
25710 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a  e corresponding.
25720 2a 2a 20 74 6f 20 74 68 65 20 70 61 74 68 6e 61  ** to the pathna
25730 6d 65 20 69 6e 20 7a 50 61 74 68 2e 20 7a 4f 75  me in zPath. zOu
25740 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  t is guaranteed 
25750 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75  to point to a bu
25760 66 66 65 72 0a 2a 2a 20 6f 66 20 61 74 20 6c 65  ffer.** of at le
25770 61 73 74 20 28 44 45 56 53 59 4d 5f 4d 41 58 5f  ast (DEVSYM_MAX_
25780 50 41 54 48 4e 41 4d 45 2b 31 29 20 62 79 74 65  PATHNAME+1) byte
25790 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
257a0 20 72 62 75 56 66 73 46 75 6c 6c 50 61 74 68 6e   rbuVfsFullPathn
257b0 61 6d 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  ame(.  sqlite3_v
257c0 66 73 20 2a 70 56 66 73 2c 20 0a 20 20 63 6f 6e  fs *pVfs, .  con
257d0 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20  st char *zPath, 
257e0 0a 20 20 69 6e 74 20 6e 4f 75 74 2c 20 0a 20 20  .  int nOut, .  
257f0 63 68 61 72 20 2a 7a 4f 75 74 0a 29 7b 0a 20 20  char *zOut.){.  
25800 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 52 65  sqlite3_vfs *pRe
25810 61 6c 56 66 73 20 3d 20 28 28 72 62 75 5f 76 66  alVfs = ((rbu_vf
25820 73 2a 29 70 56 66 73 29 2d 3e 70 52 65 61 6c 56  s*)pVfs)->pRealV
25830 66 73 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65  fs;.  return pRe
25840 61 6c 56 66 73 2d 3e 78 46 75 6c 6c 50 61 74 68  alVfs->xFullPath
25850 6e 61 6d 65 28 70 52 65 61 6c 56 66 73 2c 20 7a  name(pRealVfs, z
25860 50 61 74 68 2c 20 6e 4f 75 74 2c 20 7a 4f 75 74  Path, nOut, zOut
25870 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  );.}..#ifndef SQ
25880 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45  LITE_OMIT_LOAD_E
25890 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 4f  XTENSION./*.** O
258a0 70 65 6e 20 74 68 65 20 64 79 6e 61 6d 69 63 20  pen the dynamic 
258b0 6c 69 62 72 61 72 79 20 6c 6f 63 61 74 65 64 20  library located 
258c0 61 74 20 7a 50 61 74 68 20 61 6e 64 20 72 65 74  at zPath and ret
258d0 75 72 6e 20 61 20 68 61 6e 64 6c 65 2e 0a 2a 2f  urn a handle..*/
258e0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 72 62  .static void *rb
258f0 75 56 66 73 44 6c 4f 70 65 6e 28 73 71 6c 69 74  uVfsDlOpen(sqlit
25900 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 63 6f  e3_vfs *pVfs, co
25910 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 29  nst char *zPath)
25920 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  {.  sqlite3_vfs 
25930 2a 70 52 65 61 6c 56 66 73 20 3d 20 28 28 72 62  *pRealVfs = ((rb
25940 75 5f 76 66 73 2a 29 70 56 66 73 29 2d 3e 70 52  u_vfs*)pVfs)->pR
25950 65 61 6c 56 66 73 3b 0a 20 20 72 65 74 75 72 6e  ealVfs;.  return
25960 20 70 52 65 61 6c 56 66 73 2d 3e 78 44 6c 4f 70   pRealVfs->xDlOp
25970 65 6e 28 70 52 65 61 6c 56 66 73 2c 20 7a 50 61  en(pRealVfs, zPa
25980 74 68 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f  th);.}../*.** Po
25990 70 75 6c 61 74 65 20 74 68 65 20 62 75 66 66 65  pulate the buffe
259a0 72 20 7a 45 72 72 4d 73 67 20 28 73 69 7a 65 20  r zErrMsg (size 
259b0 6e 42 79 74 65 20 62 79 74 65 73 29 20 77 69 74  nByte bytes) wit
259c0 68 20 61 20 68 75 6d 61 6e 20 72 65 61 64 61 62  h a human readab
259d0 6c 65 0a 2a 2a 20 75 74 66 2d 38 20 73 74 72 69  le.** utf-8 stri
259e0 6e 67 20 64 65 73 63 72 69 62 69 6e 67 20 74 68  ng describing th
259f0 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 65 72  e most recent er
25a00 72 6f 72 20 65 6e 63 6f 75 6e 74 65 72 65 64 20  ror encountered 
25a10 61 73 73 6f 63 69 61 74 65 64 20 0a 2a 2a 20 77  associated .** w
25a20 69 74 68 20 64 79 6e 61 6d 69 63 20 6c 69 62 72  ith dynamic libr
25a30 61 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  aries..*/.static
25a40 20 76 6f 69 64 20 72 62 75 56 66 73 44 6c 45 72   void rbuVfsDlEr
25a50 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ror(sqlite3_vfs 
25a60 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 79 74 65  *pVfs, int nByte
25a70 2c 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 29  , char *zErrMsg)
25a80 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  {.  sqlite3_vfs 
25a90 2a 70 52 65 61 6c 56 66 73 20 3d 20 28 28 72 62  *pRealVfs = ((rb
25aa0 75 5f 76 66 73 2a 29 70 56 66 73 29 2d 3e 70 52  u_vfs*)pVfs)->pR
25ab0 65 61 6c 56 66 73 3b 0a 20 20 70 52 65 61 6c 56  ealVfs;.  pRealV
25ac0 66 73 2d 3e 78 44 6c 45 72 72 6f 72 28 70 52 65  fs->xDlError(pRe
25ad0 61 6c 56 66 73 2c 20 6e 42 79 74 65 2c 20 7a 45  alVfs, nByte, zE
25ae0 72 72 4d 73 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rrMsg);.}../*.**
25af0 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
25b00 72 20 74 6f 20 74 68 65 20 73 79 6d 62 6f 6c 20  r to the symbol 
25b10 7a 53 79 6d 62 6f 6c 20 69 6e 20 74 68 65 20 64  zSymbol in the d
25b20 79 6e 61 6d 69 63 20 6c 69 62 72 61 72 79 20 70  ynamic library p
25b30 48 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  Handle..*/.stati
25b40 63 20 76 6f 69 64 20 28 2a 72 62 75 56 66 73 44  c void (*rbuVfsD
25b50 6c 53 79 6d 28 0a 20 20 73 71 6c 69 74 65 33 5f  lSym(.  sqlite3_
25b60 76 66 73 20 2a 70 56 66 73 2c 20 0a 20 20 76 6f  vfs *pVfs, .  vo
25b70 69 64 20 2a 70 41 72 67 2c 20 0a 20 20 63 6f 6e  id *pArg, .  con
25b80 73 74 20 63 68 61 72 20 2a 7a 53 79 6d 0a 29 29  st char *zSym.))
25b90 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65  (void){.  sqlite
25ba0 33 5f 76 66 73 20 2a 70 52 65 61 6c 56 66 73 20  3_vfs *pRealVfs 
25bb0 3d 20 28 28 72 62 75 5f 76 66 73 2a 29 70 56 66  = ((rbu_vfs*)pVf
25bc0 73 29 2d 3e 70 52 65 61 6c 56 66 73 3b 0a 20 20  s)->pRealVfs;.  
25bd0 72 65 74 75 72 6e 20 70 52 65 61 6c 56 66 73 2d  return pRealVfs-
25be0 3e 78 44 6c 53 79 6d 28 70 52 65 61 6c 56 66 73  >xDlSym(pRealVfs
25bf0 2c 20 70 41 72 67 2c 20 7a 53 79 6d 29 3b 0a 7d  , pArg, zSym);.}
25c00 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68  ../*.** Close th
25c10 65 20 64 79 6e 61 6d 69 63 20 6c 69 62 72 61 72  e dynamic librar
25c20 79 20 68 61 6e 64 6c 65 20 70 48 61 6e 64 6c 65  y handle pHandle
25c30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
25c40 20 72 62 75 56 66 73 44 6c 43 6c 6f 73 65 28 73   rbuVfsDlClose(s
25c50 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
25c60 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65 29  , void *pHandle)
25c70 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  {.  sqlite3_vfs 
25c80 2a 70 52 65 61 6c 56 66 73 20 3d 20 28 28 72 62  *pRealVfs = ((rb
25c90 75 5f 76 66 73 2a 29 70 56 66 73 29 2d 3e 70 52  u_vfs*)pVfs)->pR
25ca0 65 61 6c 56 66 73 3b 0a 20 20 70 52 65 61 6c 56  ealVfs;.  pRealV
25cb0 66 73 2d 3e 78 44 6c 43 6c 6f 73 65 28 70 52 65  fs->xDlClose(pRe
25cc0 61 6c 56 66 73 2c 20 70 48 61 6e 64 6c 65 29 3b  alVfs, pHandle);
25cd0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
25ce0 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58  ITE_OMIT_LOAD_EX
25cf0 54 45 4e 53 49 4f 4e 20 2a 2f 0a 0a 2f 2a 0a 2a  TENSION */../*.*
25d00 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 62  * Populate the b
25d10 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f  uffer pointed to
25d20 20 62 79 20 7a 42 75 66 4f 75 74 20 77 69 74 68   by zBufOut with
25d30 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66 20   nByte bytes of 
25d40 0a 2a 2a 20 72 61 6e 64 6f 6d 20 64 61 74 61 2e  .** random data.
25d50 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
25d60 62 75 56 66 73 52 61 6e 64 6f 6d 6e 65 73 73 28  buVfsRandomness(
25d70 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
25d80 73 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 63 68  s, int nByte, ch
25d90 61 72 20 2a 7a 42 75 66 4f 75 74 29 7b 0a 20 20  ar *zBufOut){.  
25da0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 52 65  sqlite3_vfs *pRe
25db0 61 6c 56 66 73 20 3d 20 28 28 72 62 75 5f 76 66  alVfs = ((rbu_vf
25dc0 73 2a 29 70 56 66 73 29 2d 3e 70 52 65 61 6c 56  s*)pVfs)->pRealV
25dd0 66 73 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65  fs;.  return pRe
25de0 61 6c 56 66 73 2d 3e 78 52 61 6e 64 6f 6d 6e 65  alVfs->xRandomne
25df0 73 73 28 70 52 65 61 6c 56 66 73 2c 20 6e 42 79  ss(pRealVfs, nBy
25e00 74 65 2c 20 7a 42 75 66 4f 75 74 29 3b 0a 7d 0a  te, zBufOut);.}.
25e10 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72  ./*.** Sleep for
25e20 20 6e 4d 69 63 72 6f 20 6d 69 63 72 6f 73 65 63   nMicro microsec
25e30 6f 6e 64 73 2e 20 52 65 74 75 72 6e 20 74 68 65  onds. Return the
25e40 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 63 72 6f   number of micro
25e50 73 65 63 6f 6e 64 73 20 0a 2a 2a 20 61 63 74 75  seconds .** actu
25e60 61 6c 6c 79 20 73 6c 65 70 74 2e 0a 2a 2f 0a 73  ally slept..*/.s
25e70 74 61 74 69 63 20 69 6e 74 20 72 62 75 56 66 73  tatic int rbuVfs
25e80 53 6c 65 65 70 28 73 71 6c 69 74 65 33 5f 76 66  Sleep(sqlite3_vf
25e90 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 4d 69  s *pVfs, int nMi
25ea0 63 72 6f 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  cro){.  sqlite3_
25eb0 76 66 73 20 2a 70 52 65 61 6c 56 66 73 20 3d 20  vfs *pRealVfs = 
25ec0 28 28 72 62 75 5f 76 66 73 2a 29 70 56 66 73 29  ((rbu_vfs*)pVfs)
25ed0 2d 3e 70 52 65 61 6c 56 66 73 3b 0a 20 20 72 65  ->pRealVfs;.  re
25ee0 74 75 72 6e 20 70 52 65 61 6c 56 66 73 2d 3e 78  turn pRealVfs->x
25ef0 53 6c 65 65 70 28 70 52 65 61 6c 56 66 73 2c 20  Sleep(pRealVfs, 
25f00 6e 4d 69 63 72 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  nMicro);.}../*.*
25f10 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72  * Return the cur
25f20 72 65 6e 74 20 74 69 6d 65 20 61 73 20 61 20 4a  rent time as a J
25f30 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72  ulian Day number
25f40 20 69 6e 20 2a 70 54 69 6d 65 4f 75 74 2e 0a 2a   in *pTimeOut..*
25f50 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62 75  /.static int rbu
25f60 56 66 73 43 75 72 72 65 6e 74 54 69 6d 65 28 73  VfsCurrentTime(s
25f70 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
25f80 2c 20 64 6f 75 62 6c 65 20 2a 70 54 69 6d 65 4f  , double *pTimeO
25f90 75 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  ut){.  sqlite3_v
25fa0 66 73 20 2a 70 52 65 61 6c 56 66 73 20 3d 20 28  fs *pRealVfs = (
25fb0 28 72 62 75 5f 76 66 73 2a 29 70 56 66 73 29 2d  (rbu_vfs*)pVfs)-
25fc0 3e 70 52 65 61 6c 56 66 73 3b 0a 20 20 72 65 74  >pRealVfs;.  ret
25fd0 75 72 6e 20 70 52 65 61 6c 56 66 73 2d 3e 78 43  urn pRealVfs->xC
25fe0 75 72 72 65 6e 74 54 69 6d 65 28 70 52 65 61 6c  urrentTime(pReal
25ff0 56 66 73 2c 20 70 54 69 6d 65 4f 75 74 29 3b 0a  Vfs, pTimeOut);.
26000 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 2e 0a  }../*.** No-op..
26010 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62  */.static int rb
26020 75 56 66 73 47 65 74 4c 61 73 74 45 72 72 6f 72  uVfsGetLastError
26030 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
26040 66 73 2c 20 69 6e 74 20 61 2c 20 63 68 61 72 20  fs, int a, char 
26050 2a 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 30 3b  *b){.  return 0;
26060 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 72 65 67 69  .}../*.** Deregi
26070 73 74 65 72 20 61 6e 64 20 64 65 73 74 72 6f 79  ster and destroy
26080 20 61 6e 20 52 42 55 20 76 66 73 20 63 72 65 61   an RBU vfs crea
26090 74 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65  ted by an earlie
260a0 72 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 73 71 6c  r call to.** sql
260b0 69 74 65 33 72 62 75 5f 63 72 65 61 74 65 5f 76  ite3rbu_create_v
260c0 66 73 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  fs()..*/.void sq
260d0 6c 69 74 65 33 72 62 75 5f 64 65 73 74 72 6f 79  lite3rbu_destroy
260e0 5f 76 66 73 28 63 6f 6e 73 74 20 63 68 61 72 20  _vfs(const char 
260f0 2a 7a 4e 61 6d 65 29 7b 0a 20 20 73 71 6c 69 74  *zName){.  sqlit
26100 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 73  e3_vfs *pVfs = s
26110 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
26120 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 56  zName);.  if( pV
26130 66 73 20 26 26 20 70 56 66 73 2d 3e 78 4f 70 65  fs && pVfs->xOpe
26140 6e 3d 3d 72 62 75 56 66 73 4f 70 65 6e 20 29 7b  n==rbuVfsOpen ){
26150 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
26160 65 78 5f 66 72 65 65 28 28 28 72 62 75 5f 76 66  ex_free(((rbu_vf
26170 73 2a 29 70 56 66 73 29 2d 3e 6d 75 74 65 78 29  s*)pVfs)->mutex)
26180 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66  ;.    sqlite3_vf
26190 73 5f 75 6e 72 65 67 69 73 74 65 72 28 70 56 66  s_unregister(pVf
261a0 73 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  s);.    sqlite3_
261b0 66 72 65 65 28 70 56 66 73 29 3b 0a 20 20 7d 0a  free(pVfs);.  }.
261c0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
261d0 61 6e 20 52 42 55 20 56 46 53 20 6e 61 6d 65 64  an RBU VFS named
261e0 20 7a 4e 61 6d 65 20 74 68 61 74 20 61 63 63 65   zName that acce
261f0 73 73 65 73 20 74 68 65 20 75 6e 64 65 72 6c 79  sses the underly
26200 69 6e 67 20 66 69 6c 65 2d 73 79 73 74 65 6d 0a  ing file-system.
26210 2a 2a 20 76 69 61 20 65 78 69 73 74 69 6e 67 20  ** via existing 
26220 56 46 53 20 7a 50 61 72 65 6e 74 2e 20 54 68 65  VFS zParent. The
26230 20 6e 65 77 20 6f 62 6a 65 63 74 20 69 73 20 72   new object is r
26240 65 67 69 73 74 65 72 65 64 20 61 73 20 61 20 6e  egistered as a n
26250 6f 6e 2d 64 65 66 61 75 6c 74 0a 2a 2a 20 56 46  on-default.** VF
26260 53 20 77 69 74 68 20 53 51 4c 69 74 65 20 62 65  S with SQLite be
26270 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
26280 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 72 62  */.int sqlite3rb
26290 75 5f 63 72 65 61 74 65 5f 76 66 73 28 63 6f 6e  u_create_vfs(con
262a0 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
262b0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72  const char *zPar
262c0 65 6e 74 29 7b 0a 0a 20 20 2f 2a 20 54 65 6d 70  ent){..  /* Temp
262d0 6c 61 74 65 20 66 6f 72 20 56 46 53 20 2a 2f 0a  late for VFS */.
262e0 20 20 73 74 61 74 69 63 20 73 71 6c 69 74 65 33    static sqlite3
262f0 5f 76 66 73 20 76 66 73 5f 74 65 6d 70 6c 61 74  _vfs vfs_templat
26300 65 20 3d 20 7b 0a 20 20 20 20 31 2c 20 20 20 20  e = {.    1,    
26310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26320 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73          /* iVers
26330 69 6f 6e 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20  ion */.    0,   
26340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26350 20 20 20 20 20 20 20 20 20 2f 2a 20 73 7a 4f 73           /* szOs
26360 46 69 6c 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20  File */.    0,  
26370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26380 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6d 78 50            /* mxP
26390 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 30  athname */.    0
263a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
263b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
263c0 70 4e 65 78 74 20 2a 2f 0a 20 20 20 20 30 2c 20  pNext */.    0, 
263d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
263e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4e             /* zN
263f0 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20  ame */.    0,   
26400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26410 20 20 20 20 20 20 20 20 20 2f 2a 20 70 41 70 70           /* pApp
26420 44 61 74 61 20 2a 2f 0a 20 20 20 20 72 62 75 56  Data */.    rbuV
26430 66 73 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20  fsOpen,         
26440 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4f 70            /* xOp
26450 65 6e 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73  en */.    rbuVfs
26460 44 65 6c 65 74 65 2c 20 20 20 20 20 20 20 20 20  Delete,         
26470 20 20 20 20 20 20 20 20 2f 2a 20 78 44 65 6c 65          /* xDele
26480 74 65 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73  te */.    rbuVfs
26490 41 63 63 65 73 73 2c 20 20 20 20 20 20 20 20 20  Access,         
264a0 20 20 20 20 20 20 20 20 2f 2a 20 78 41 63 63 65          /* xAcce
264b0 73 73 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73  ss */.    rbuVfs
264c0 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20 20  FullPathname,   
264d0 20 20 20 20 20 20 20 20 2f 2a 20 78 46 75 6c 6c          /* xFull
264e0 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 0a 23 69 66  Pathname */..#if
264f0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
26500 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a  _LOAD_EXTENSION.
26510 20 20 20 20 72 62 75 56 66 73 44 6c 4f 70 65 6e      rbuVfsDlOpen
26520 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
26530 20 20 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f 0a    /* xDlOpen */.
26540 20 20 20 20 72 62 75 56 66 73 44 6c 45 72 72 6f      rbuVfsDlErro
26550 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
26560 20 20 2f 2a 20 78 44 6c 45 72 72 6f 72 20 2a 2f    /* xDlError */
26570 0a 20 20 20 20 72 62 75 56 66 73 44 6c 53 79 6d  .    rbuVfsDlSym
26580 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
26590 20 20 20 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f 0a     /* xDlSym */.
265a0 20 20 20 20 72 62 75 56 66 73 44 6c 43 6c 6f 73      rbuVfsDlClos
265b0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
265c0 20 20 2f 2a 20 78 44 6c 43 6c 6f 73 65 20 2a 2f    /* xDlClose */
265d0 0a 23 65 6c 73 65 0a 20 20 20 20 30 2c 20 30 2c  .#else.    0, 0,
265e0 20 30 2c 20 30 2c 0a 23 65 6e 64 69 66 0a 0a 20   0, 0,.#endif.. 
265f0 20 20 20 72 62 75 56 66 73 52 61 6e 64 6f 6d 6e     rbuVfsRandomn
26600 65 73 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ess,            
26610 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20   /* xRandomness 
26620 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 53 6c 65  */.    rbuVfsSle
26630 65 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ep,             
26640 20 20 20 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a       /* xSleep *
26650 2f 0a 20 20 20 20 72 62 75 56 66 73 43 75 72 72  /.    rbuVfsCurr
26660 65 6e 74 54 69 6d 65 2c 20 20 20 20 20 20 20 20  entTime,        
26670 20 20 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54      /* xCurrentT
26680 69 6d 65 20 2a 2f 0a 20 20 20 20 72 62 75 56 66  ime */.    rbuVf
26690 73 47 65 74 4c 61 73 74 45 72 72 6f 72 2c 20 20  sGetLastError,  
266a0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 47 65 74           /* xGet
266b0 4c 61 73 74 45 72 72 6f 72 20 2a 2f 0a 20 20 20  LastError */.   
266c0 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
266d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
266e0 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e  * xCurrentTimeIn
266f0 74 36 34 20 28 76 65 72 73 69 6f 6e 20 32 29 20  t64 (version 2) 
26700 2a 2f 0a 20 20 20 20 30 2c 20 30 2c 20 30 20 20  */.    0, 0, 0  
26710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26720 20 20 20 20 20 2f 2a 20 55 6e 69 6d 70 6c 65 6d       /* Unimplem
26730 65 6e 74 65 64 20 76 65 72 73 69 6f 6e 20 33 20  ented version 3 
26740 6d 65 74 68 6f 64 73 20 2a 2f 0a 20 20 7d 3b 0a  methods */.  };.
26750 0a 20 20 72 62 75 5f 76 66 73 20 2a 70 4e 65 77  .  rbu_vfs *pNew
26760 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
26770 20 20 20 2f 2a 20 4e 65 77 6c 79 20 61 6c 6c 6f     /* Newly allo
26780 63 61 74 65 64 20 56 46 53 20 2a 2f 0a 20 20 69  cated VFS */.  i
26790 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
267a0 4b 3b 0a 20 20 73 69 7a 65 5f 74 20 6e 4e 61 6d  K;.  size_t nNam
267b0 65 3b 0a 20 20 73 69 7a 65 5f 74 20 6e 42 79 74  e;.  size_t nByt
267c0 65 3b 0a 0a 20 20 6e 4e 61 6d 65 20 3d 20 73 74  e;..  nName = st
267d0 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 6e  rlen(zName);.  n
267e0 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 72 62  Byte = sizeof(rb
267f0 75 5f 76 66 73 29 20 2b 20 6e 4e 61 6d 65 20 2b  u_vfs) + nName +
26800 20 31 3b 0a 20 20 70 4e 65 77 20 3d 20 28 72 62   1;.  pNew = (rb
26810 75 5f 76 66 73 2a 29 73 71 6c 69 74 65 33 5f 6d  u_vfs*)sqlite3_m
26820 61 6c 6c 6f 63 36 34 28 6e 42 79 74 65 29 3b 0a  alloc64(nByte);.
26830 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b    if( pNew==0 ){
26840 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
26850 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b  _NOMEM;.  }else{
26860 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73  .    sqlite3_vfs
26870 20 2a 70 50 61 72 65 6e 74 3b 20 20 20 20 20 20   *pParent;      
26880 20 20 20 20 20 2f 2a 20 50 61 72 65 6e 74 20 56       /* Parent V
26890 46 53 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74  FS */.    memset
268a0 28 70 4e 65 77 2c 20 30 2c 20 6e 42 79 74 65 29  (pNew, 0, nByte)
268b0 3b 0a 20 20 20 20 70 50 61 72 65 6e 74 20 3d 20  ;.    pParent = 
268c0 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
268d0 28 7a 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 69  (zParent);.    i
268e0 66 28 20 70 50 61 72 65 6e 74 3d 3d 30 20 29 7b  f( pParent==0 ){
268f0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
26900 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20 20  TE_NOTFOUND;.   
26910 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68   }else{.      ch
26920 61 72 20 2a 7a 53 70 61 63 65 3b 0a 20 20 20 20  ar *zSpace;.    
26930 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 2d 3e    memcpy(&pNew->
26940 62 61 73 65 2c 20 26 76 66 73 5f 74 65 6d 70 6c  base, &vfs_templ
26950 61 74 65 2c 20 73 69 7a 65 6f 66 28 73 71 6c 69  ate, sizeof(sqli
26960 74 65 33 5f 76 66 73 29 29 3b 0a 20 20 20 20 20  te3_vfs));.     
26970 20 70 4e 65 77 2d 3e 62 61 73 65 2e 6d 78 50 61   pNew->base.mxPa
26980 74 68 6e 61 6d 65 20 3d 20 70 50 61 72 65 6e 74  thname = pParent
26990 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 3b 0a 20 20  ->mxPathname;.  
269a0 20 20 20 20 70 4e 65 77 2d 3e 62 61 73 65 2e 73      pNew->base.s
269b0 7a 4f 73 46 69 6c 65 20 3d 20 73 69 7a 65 6f 66  zOsFile = sizeof
269c0 28 72 62 75 5f 66 69 6c 65 29 20 2b 20 70 50 61  (rbu_file) + pPa
269d0 72 65 6e 74 2d 3e 73 7a 4f 73 46 69 6c 65 3b 0a  rent->szOsFile;.
269e0 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 52 65 61        pNew->pRea
269f0 6c 56 66 73 20 3d 20 70 50 61 72 65 6e 74 3b 0a  lVfs = pParent;.
26a00 20 20 20 20 20 20 70 4e 65 77 2d 3e 62 61 73 65        pNew->base
26a10 2e 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20  .zName = (const 
26a20 63 68 61 72 2a 29 28 7a 53 70 61 63 65 20 3d 20  char*)(zSpace = 
26a30 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 29  (char*)&pNew[1])
26a40 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a  ;.      memcpy(z
26a50 53 70 61 63 65 2c 20 7a 4e 61 6d 65 2c 20 6e 4e  Space, zName, nN
26a60 61 6d 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  ame);..      /* 
26a70 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 6d 75 74  Allocate the mut
26a80 65 78 20 61 6e 64 20 72 65 67 69 73 74 65 72 20  ex and register 
26a90 74 68 65 20 6e 65 77 20 56 46 53 20 28 6e 6f 74  the new VFS (not
26aa0 20 61 73 20 74 68 65 20 64 65 66 61 75 6c 74 29   as the default)
26ab0 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   */.      pNew->
26ac0 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 5f  mutex = sqlite3_
26ad0 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49  mutex_alloc(SQLI
26ae0 54 45 5f 4d 55 54 45 58 5f 52 45 43 55 52 53 49  TE_MUTEX_RECURSI
26af0 56 45 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  VE);.      if( p
26b00 4e 65 77 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b  New->mutex==0 ){
26b10 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
26b20 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
26b30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
26b40 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 76 66   rc = sqlite3_vf
26b50 73 5f 72 65 67 69 73 74 65 72 28 26 70 4e 65 77  s_register(&pNew
26b60 2d 3e 62 61 73 65 2c 20 30 29 3b 0a 20 20 20 20  ->base, 0);.    
26b70 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69    }.    }..    i
26b80 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
26b90 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
26ba0 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 4e 65  3_mutex_free(pNe
26bb0 77 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20  w->mutex);.     
26bc0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e   sqlite3_free(pN
26bd0 65 77 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ew);.    }.  }..
26be0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
26bf0 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20  /*.** Configure 
26c00 74 68 65 20 61 67 67 72 65 67 61 74 65 20 74 65  the aggregate te
26c10 6d 70 20 66 69 6c 65 20 73 69 7a 65 20 6c 69 6d  mp file size lim
26c20 69 74 20 66 6f 72 20 74 68 69 73 20 52 42 55 20  it for this RBU 
26c30 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 71 6c 69 74  handle..*/.sqlit
26c40 65 33 5f 69 6e 74 36 34 20 73 71 6c 69 74 65 33  e3_int64 sqlite3
26c50 72 62 75 5f 74 65 6d 70 5f 73 69 7a 65 5f 6c 69  rbu_temp_size_li
26c60 6d 69 74 28 73 71 6c 69 74 65 33 72 62 75 20 2a  mit(sqlite3rbu *
26c70 70 52 62 75 2c 20 73 71 6c 69 74 65 33 5f 69 6e  pRbu, sqlite3_in
26c80 74 36 34 20 6e 29 7b 0a 20 20 69 66 28 20 6e 3e  t64 n){.  if( n>
26c90 3d 30 20 29 7b 0a 20 20 20 20 70 52 62 75 2d 3e  =0 ){.    pRbu->
26ca0 73 7a 54 65 6d 70 4c 69 6d 69 74 20 3d 20 6e 3b  szTempLimit = n;
26cb0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52  .  }.  return pR
26cc0 62 75 2d 3e 73 7a 54 65 6d 70 4c 69 6d 69 74 3b  bu->szTempLimit;
26cd0 0a 7d 0a 0a 73 71 6c 69 74 65 33 5f 69 6e 74 36  .}..sqlite3_int6
26ce0 34 20 73 71 6c 69 74 65 33 72 62 75 5f 74 65 6d  4 sqlite3rbu_tem
26cf0 70 5f 73 69 7a 65 28 73 71 6c 69 74 65 33 72 62  p_size(sqlite3rb
26d00 75 20 2a 70 52 62 75 29 7b 0a 20 20 72 65 74 75  u *pRbu){.  retu
26d10 72 6e 20 70 52 62 75 2d 3e 73 7a 54 65 6d 70 3b  rn pRbu->szTemp;
26d20 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}.../**********
26d30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26d40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26d50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26d60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26d70 2f 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  /..#endif /* !de
26d80 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 43 4f 52  fined(SQLITE_COR
26d90 45 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  E) || defined(SQ
26da0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 52 42 55 29  LITE_ENABLE_RBU)
26db0 20 2a 2f 0a                                       */.