/ Hex Artifact Content
Login

Artifact 8741c0ee1496b41ff888b983a1a32547bc8822602603c68b3e524e5e0e287395:


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 0a 2a   otherwise..**.*
2150: 2a 20 20 20 49 66 20 74 68 65 72 65 20 61 72 65  *   If there are
2160: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 70 61 72   one or more par
2170: 74 69 61 6c 20 69 6e 64 65 78 65 73 20 6f 6e 20  tial indexes on 
2180: 74 68 65 20 74 61 62 6c 65 2c 20 61 6c 6c 20 66  the table, all f
2190: 69 65 6c 64 73 20 6f 66 0a 2a 2a 20 20 20 74 68  ields of.**   th
21a0: 69 73 20 61 72 72 61 79 20 73 65 74 20 73 65 74  is array set set
21b0: 20 74 6f 20 31 2e 20 54 68 69 73 20 69 73 20 62   to 1. This is b
21c0: 65 63 61 75 73 65 20 69 6e 20 74 68 61 74 20 63  ecause in that c
21d0: 61 73 65 2c 20 74 68 65 20 6d 6f 64 75 6c 65 20  ase, the module 
21e0: 68 61 73 0a 2a 2a 20 20 20 6e 6f 20 77 61 79 20  has.**   no way 
21f0: 74 6f 20 74 65 6c 6c 20 77 68 69 63 68 20 66 69  to tell which fi
2200: 65 6c 64 73 20 77 69 6c 6c 20 62 65 20 72 65 71  elds will be req
2210: 75 69 72 65 64 20 74 6f 20 61 64 64 20 61 6e 64  uired to add and
2220: 20 72 65 6d 6f 76 65 20 65 6e 74 72 69 65 73 0a   remove entries.
2230: 2a 2a 20 20 20 66 72 6f 6d 20 74 68 65 20 70 61  **   from the pa
2240: 72 74 69 61 6c 20 69 6e 64 65 78 65 73 2e 0a 2a  rtial indexes..*
2250: 2a 20 20 20 0a 2a 2f 0a 73 74 72 75 63 74 20 52  *   .*/.struct R
2260: 62 75 4f 62 6a 49 74 65 72 20 7b 0a 20 20 73 71  buObjIter {.  sq
2270: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 54 62 6c  lite3_stmt *pTbl
2280: 49 74 65 72 3b 20 20 20 20 20 20 20 20 20 2f 2a  Iter;         /*
2290: 20 49 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   Iterate through
22a0: 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 73 71 6c   tables */.  sql
22b0: 69 74 65 33 5f 73 74 6d 74 20 2a 70 49 64 78 49  ite3_stmt *pIdxI
22c0: 74 65 72 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ter;         /* 
22d0: 49 6e 64 65 78 20 69 74 65 72 61 74 6f 72 20 2a  Index iterator *
22e0: 2f 0a 20 20 69 6e 74 20 6e 54 62 6c 43 6f 6c 3b  /.  int nTblCol;
22f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2300: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61      /* Size of a
2310: 7a 54 62 6c 43 6f 6c 5b 5d 20 61 72 72 61 79 20  zTblCol[] array 
2320: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a 54 62  */.  char **azTb
2330: 6c 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  lCol;           
2340: 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
2350: 20 75 6e 71 75 6f 74 65 64 20 74 61 72 67 65 74   unquoted target
2360: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f   column names */
2370: 0a 20 20 63 68 61 72 20 2a 2a 61 7a 54 62 6c 54  .  char **azTblT
2380: 79 70 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ype;            
2390: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 74     /* Array of t
23a0: 61 72 67 65 74 20 63 6f 6c 75 6d 6e 20 74 79 70  arget column typ
23b0: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 69 53  es */.  int *aiS
23c0: 72 63 4f 72 64 65 72 3b 20 20 20 20 20 20 20 20  rcOrder;        
23d0: 20 20 20 20 20 20 20 20 2f 2a 20 73 72 63 20 74          /* src t
23e0: 61 62 6c 65 20 63 6f 6c 20 2d 3e 20 74 61 72 67  able col -> targ
23f0: 65 74 20 74 61 62 6c 65 20 63 6f 6c 20 2a 2f 0a  et table col */.
2400: 20 20 75 38 20 2a 61 62 54 62 6c 50 6b 3b 20 20    u8 *abTblPk;  
2410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2420: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 66 6c    /* Array of fl
2430: 61 67 73 2c 20 73 65 74 20 6f 6e 20 74 61 72 67  ags, set on targ
2440: 65 74 20 50 4b 20 63 6f 6c 75 6d 6e 73 20 2a 2f  et PK columns */
2450: 0a 20 20 75 38 20 2a 61 62 4e 6f 74 4e 75 6c 6c  .  u8 *abNotNull
2460: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2470: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 66     /* Array of f
2480: 6c 61 67 73 2c 20 73 65 74 20 6f 6e 20 4e 4f 54  lags, set on NOT
2490: 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73 20 2a 2f   NULL columns */
24a0: 0a 20 20 75 38 20 2a 61 62 49 6e 64 65 78 65 64  .  u8 *abIndexed
24b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
24c0: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 66     /* Array of f
24d0: 6c 61 67 73 2c 20 73 65 74 20 6f 6e 20 69 6e 64  lags, set on ind
24e0: 65 78 65 64 20 26 20 50 4b 20 63 6f 6c 73 20 2a  exed & PK cols *
24f0: 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 3b 20 20  /.  int eType;  
2500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2510: 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 79 70      /* Table typ
2520: 65 20 2d 20 61 6e 20 52 42 55 5f 50 4b 5f 58 58  e - an RBU_PK_XX
2530: 58 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 2f 2a  X value */..  /*
2540: 20 4f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65   Output variable
2550: 73 2e 20 7a 54 62 6c 3d 3d 30 20 69 6d 70 6c 69  s. zTbl==0 impli
2560: 65 73 20 45 4f 46 2e 20 2a 2f 0a 20 20 69 6e 74  es EOF. */.  int
2570: 20 62 43 6c 65 61 6e 75 70 3b 20 20 20 20 20 20   bCleanup;      
2580: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2590: 54 72 75 65 20 69 6e 20 22 63 6c 65 61 6e 75 70  True in "cleanup
25a0: 22 20 73 74 61 74 65 20 2a 2f 0a 20 20 63 6f 6e  " state */.  con
25b0: 73 74 20 63 68 61 72 20 2a 7a 54 62 6c 3b 20 20  st char *zTbl;  
25c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25d0: 4e 61 6d 65 20 6f 66 20 74 61 72 67 65 74 20 64  Name of target d
25e0: 62 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63 6f 6e  b table */.  con
25f0: 73 74 20 63 68 61 72 20 2a 7a 44 61 74 61 54 62  st char *zDataTb
2600: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  l;           /* 
2610: 4e 61 6d 65 20 6f 66 20 72 62 75 20 64 62 20 74  Name of rbu db t
2620: 61 62 6c 65 20 28 6f 72 20 6e 75 6c 6c 29 20 2a  able (or null) *
2630: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
2640: 7a 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  zIdx;           
2650: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
2660: 61 72 67 65 74 20 64 62 20 69 6e 64 65 78 20 28  arget db index (
2670: 6f 72 20 6e 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e  or null) */.  in
2680: 74 20 69 54 6e 75 6d 3b 20 20 20 20 20 20 20 20  t iTnum;        
2690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26a0: 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 63 75   Root page of cu
26b0: 72 72 65 6e 74 20 6f 62 6a 65 63 74 20 2a 2f 0a  rrent object */.
26c0: 20 20 69 6e 74 20 69 50 6b 54 6e 75 6d 3b 20 20    int iPkTnum;  
26d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e0: 20 20 2f 2a 20 49 66 20 65 54 79 70 65 3d 3d 45    /* If eType==E
26f0: 58 54 45 52 4e 41 4c 2c 20 72 6f 6f 74 20 6f 66  XTERNAL, root of
2700: 20 50 4b 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69   PK index */.  i
2710: 6e 74 20 62 55 6e 69 71 75 65 3b 20 20 20 20 20  nt bUnique;     
2720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2730: 2a 20 43 75 72 72 65 6e 74 20 69 6e 64 65 78 20  * Current index 
2740: 69 73 20 75 6e 69 71 75 65 20 2a 2f 0a 20 20 69  is unique */.  i
2750: 6e 74 20 6e 49 6e 64 65 78 3b 20 20 20 20 20 20  nt nIndex;      
2760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2770: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 75 78 2e  * Number of aux.
2780: 20 69 6e 64 65 78 65 73 20 6f 6e 20 74 61 62 6c   indexes on tabl
2790: 65 20 7a 54 62 6c 20 2a 2f 0a 0a 20 20 2f 2a 20  e zTbl */..  /* 
27a0: 53 74 61 74 65 6d 65 6e 74 73 20 63 72 65 61 74  Statements creat
27b0: 65 64 20 62 79 20 72 62 75 4f 62 6a 49 74 65 72  ed by rbuObjIter
27c0: 50 72 65 70 61 72 65 41 6c 6c 28 29 20 2a 2f 0a  PrepareAll() */.
27d0: 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20    int nCol;     
27e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27f0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
2800: 6f 6c 75 6d 6e 73 20 69 6e 20 63 75 72 72 65 6e  olumns in curren
2810: 74 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71  t object */.  sq
2820: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 65 6c  lite3_stmt *pSel
2830: 65 63 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ect;          /*
2840: 20 53 6f 75 72 63 65 20 64 61 74 61 20 2a 2f 0a   Source data */.
2850: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
2860: 70 49 6e 73 65 72 74 3b 20 20 20 20 20 20 20 20  pInsert;        
2870: 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20 66    /* Statement f
2880: 6f 72 20 49 4e 53 45 52 54 20 6f 70 65 72 61 74  or INSERT operat
2890: 69 6f 6e 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ions */.  sqlite
28a0: 33 5f 73 74 6d 74 20 2a 70 44 65 6c 65 74 65 3b  3_stmt *pDelete;
28b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61            /* Sta
28c0: 74 65 6d 65 6e 74 20 66 6f 72 20 44 45 4c 45 54  tement for DELET
28d0: 45 20 6f 70 73 20 2a 2f 0a 20 20 73 71 6c 69 74  E ops */.  sqlit
28e0: 65 33 5f 73 74 6d 74 20 2a 70 54 6d 70 49 6e 73  e3_stmt *pTmpIns
28f0: 65 72 74 3b 20 20 20 20 20 20 20 2f 2a 20 49 6e  ert;       /* In
2900: 73 65 72 74 20 69 6e 74 6f 20 72 62 75 5f 74 6d  sert into rbu_tm
2910: 70 5f 24 7a 44 61 74 61 54 62 6c 20 2a 2f 0a 0a  p_$zDataTbl */..
2920: 20 20 2f 2a 20 4c 61 73 74 20 55 50 44 41 54 45    /* Last UPDATE
2930: 20 75 73 65 64 20 28 66 6f 72 20 50 4b 20 62 2d   used (for PK b-
2940: 74 72 65 65 20 75 70 64 61 74 65 73 20 6f 6e 6c  tree updates onl
2950: 79 29 2c 20 6f 72 20 4e 55 4c 4c 2e 20 2a 2f 0a  y), or NULL. */.
2960: 20 20 52 62 75 55 70 64 61 74 65 53 74 6d 74 20    RbuUpdateStmt 
2970: 2a 70 52 62 75 55 70 64 61 74 65 3b 0a 7d 3b 0a  *pRbuUpdate;.};.
2980: 0a 2f 2a 0a 2a 2a 20 56 61 6c 75 65 73 20 66 6f  ./*.** Values fo
2990: 72 20 52 62 75 4f 62 6a 49 74 65 72 2e 65 54 79  r RbuObjIter.eTy
29a0: 70 65 0a 2a 2a 0a 2a 2a 20 20 20 20 20 30 3a 20  pe.**.**     0: 
29b0: 54 61 62 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65  Table does not e
29c0: 78 69 73 74 20 28 65 72 72 6f 72 29 0a 2a 2a 20  xist (error).** 
29d0: 20 20 20 20 31 3a 20 54 61 62 6c 65 20 68 61 73      1: Table has
29e0: 20 61 6e 20 69 6d 70 6c 69 63 69 74 20 72 6f 77   an implicit row
29f0: 69 64 2e 0a 2a 2a 20 20 20 20 20 32 3a 20 54 61  id..**     2: Ta
2a00: 62 6c 65 20 68 61 73 20 61 6e 20 65 78 70 6c 69  ble has an expli
2a10: 63 69 74 20 49 50 4b 20 63 6f 6c 75 6d 6e 2e 0a  cit IPK column..
2a20: 2a 2a 20 20 20 20 20 33 3a 20 54 61 62 6c 65 20  **     3: Table 
2a30: 68 61 73 20 61 6e 20 65 78 74 65 72 6e 61 6c 20  has an external 
2a40: 50 4b 20 69 6e 64 65 78 2e 0a 2a 2a 20 20 20 20  PK index..**    
2a50: 20 34 3a 20 54 61 62 6c 65 20 69 73 20 57 49 54   4: Table is WIT
2a60: 48 4f 55 54 20 52 4f 57 49 44 2e 0a 2a 2a 20 20  HOUT ROWID..**  
2a70: 20 20 20 35 3a 20 54 61 62 6c 65 20 69 73 20 61     5: Table is a
2a80: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a   virtual table..
2a90: 2a 2f 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 50  */.#define RBU_P
2aa0: 4b 5f 4e 4f 54 41 42 4c 45 20 20 20 20 20 20 20  K_NOTABLE       
2ab0: 20 30 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 50   0.#define RBU_P
2ac0: 4b 5f 4e 4f 4e 45 20 20 20 20 20 20 20 20 20 20  K_NONE          
2ad0: 20 31 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 50   1.#define RBU_P
2ae0: 4b 5f 49 50 4b 20 20 20 20 20 20 20 20 20 20 20  K_IPK           
2af0: 20 32 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 50   2.#define RBU_P
2b00: 4b 5f 45 58 54 45 52 4e 41 4c 20 20 20 20 20 20  K_EXTERNAL      
2b10: 20 33 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 50   3.#define RBU_P
2b20: 4b 5f 57 49 54 48 4f 55 54 5f 52 4f 57 49 44 20  K_WITHOUT_ROWID 
2b30: 20 34 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 50   4.#define RBU_P
2b40: 4b 5f 56 54 41 42 20 20 20 20 20 20 20 20 20 20  K_VTAB          
2b50: 20 35 0a 0a 0a 2f 2a 0a 2a 2a 20 57 69 74 68 69   5.../*.** Withi
2b60: 6e 20 74 68 65 20 52 42 55 5f 53 54 41 47 45 5f  n the RBU_STAGE_
2b70: 4f 41 4c 20 73 74 61 67 65 2c 20 65 61 63 68 20  OAL stage, each 
2b80: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 72  call to sqlite3r
2b90: 62 75 5f 73 74 65 70 28 29 20 70 65 72 66 6f 72  bu_step() perfor
2ba0: 6d 73 0a 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65  ms.** one of the
2bb0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70 65 72 61   following opera
2bc0: 74 69 6f 6e 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e  tions..*/.#defin
2bd0: 65 20 52 42 55 5f 49 4e 53 45 52 54 20 20 20 20  e RBU_INSERT    
2be0: 20 31 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49   1          /* I
2bf0: 6e 73 65 72 74 20 6f 6e 20 61 20 6d 61 69 6e 20  nsert on a main 
2c00: 74 61 62 6c 65 20 62 2d 74 72 65 65 20 2a 2f 0a  table b-tree */.
2c10: 23 64 65 66 69 6e 65 20 52 42 55 5f 44 45 4c 45  #define RBU_DELE
2c20: 54 45 20 20 20 20 20 32 20 20 20 20 20 20 20 20  TE     2        
2c30: 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 20 72 6f    /* Delete a ro
2c40: 77 20 66 72 6f 6d 20 61 20 6d 61 69 6e 20 74 61  w from a main ta
2c50: 62 6c 65 20 62 2d 74 72 65 65 20 2a 2f 0a 23 64  ble b-tree */.#d
2c60: 65 66 69 6e 65 20 52 42 55 5f 52 45 50 4c 41 43  efine RBU_REPLAC
2c70: 45 20 20 20 20 33 20 20 20 20 20 20 20 20 20 20  E    3          
2c80: 2f 2a 20 44 65 6c 65 74 65 20 61 6e 64 20 74 68  /* Delete and th
2c90: 65 6e 20 69 6e 73 65 72 74 20 61 20 72 6f 77 20  en insert a row 
2ca0: 2a 2f 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 49  */.#define RBU_I
2cb0: 44 58 5f 44 45 4c 45 54 45 20 34 20 20 20 20 20  DX_DELETE 4     
2cc0: 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 61       /* Delete a
2cd0: 20 72 6f 77 20 66 72 6f 6d 20 61 6e 20 61 75 78   row from an aux
2ce0: 2e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20 2a  . index b-tree *
2cf0: 2f 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 49 44  /.#define RBU_ID
2d00: 58 5f 49 4e 53 45 52 54 20 35 20 20 20 20 20 20  X_INSERT 5      
2d10: 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 6f 6e      /* Insert on
2d20: 20 61 6e 20 61 75 78 2e 20 69 6e 64 65 78 20 62   an aux. index b
2d30: 2d 74 72 65 65 20 2a 2f 0a 0a 23 64 65 66 69 6e  -tree */..#defin
2d40: 65 20 52 42 55 5f 55 50 44 41 54 45 20 20 20 20  e RBU_UPDATE    
2d50: 20 36 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55   6          /* U
2d60: 70 64 61 74 65 20 61 20 72 6f 77 20 69 6e 20 61  pdate a row in a
2d70: 20 6d 61 69 6e 20 74 61 62 6c 65 20 62 2d 74 72   main table b-tr
2d80: 65 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 20 73  ee */../*.** A s
2d90: 69 6e 67 6c 65 20 73 74 65 70 20 6f 66 20 61 6e  ingle step of an
2da0: 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 63 68 65   incremental che
2db0: 63 6b 70 6f 69 6e 74 20 2d 20 66 72 61 6d 65 20  ckpoint - frame 
2dc0: 69 57 61 6c 46 72 61 6d 65 20 6f 66 20 74 68 65  iWalFrame of the
2dd0: 20 77 61 6c 0a 2a 2a 20 66 69 6c 65 20 73 68 6f   wal.** file sho
2de0: 75 6c 64 20 62 65 20 63 6f 70 69 65 64 20 74 6f  uld be copied to
2df0: 20 70 61 67 65 20 69 44 62 50 61 67 65 20 6f 66   page iDbPage of
2e00: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2e10: 6c 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 52 62  le..*/.struct Rb
2e20: 75 46 72 61 6d 65 20 7b 0a 20 20 75 33 32 20 69  uFrame {.  u32 i
2e30: 44 62 50 61 67 65 3b 0a 20 20 75 33 32 20 69 57  DbPage;.  u32 iW
2e40: 61 6c 46 72 61 6d 65 3b 0a 7d 3b 0a 0a 2f 2a 0a  alFrame;.};../*.
2e50: 2a 2a 20 52 42 55 20 68 61 6e 64 6c 65 2e 0a 2a  ** RBU handle..*
2e60: 2a 0a 2a 2a 20 6e 50 68 61 73 65 4f 6e 65 53 74  *.** nPhaseOneSt
2e70: 65 70 3a 0a 2a 2a 20 20 20 49 66 20 74 68 65 20  ep:.**   If the 
2e80: 52 42 55 20 64 61 74 61 62 61 73 65 20 63 6f 6e  RBU database con
2e90: 74 61 69 6e 73 20 61 6e 20 72 62 75 5f 63 6f 75  tains an rbu_cou
2ea0: 6e 74 20 74 61 62 6c 65 2c 20 74 68 69 73 20 76  nt table, this v
2eb0: 61 6c 75 65 20 69 73 20 73 65 74 20 74 6f 0a 2a  alue is set to.*
2ec0: 2a 20 20 20 61 20 72 75 6e 6e 69 6e 67 20 65 73  *   a running es
2ed0: 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75  timate of the nu
2ee0: 6d 62 65 72 20 6f 66 20 62 2d 74 72 65 65 20 6f  mber of b-tree o
2ef0: 70 65 72 61 74 69 6f 6e 73 20 72 65 71 75 69 72  perations requir
2f00: 65 64 20 74 6f 20 0a 2a 2a 20 20 20 66 69 6e 69  ed to .**   fini
2f10: 73 68 20 70 6f 70 75 6c 61 74 69 6e 67 20 74 68  sh populating th
2f20: 65 20 2a 2d 6f 61 6c 20 66 69 6c 65 2e 20 54 68  e *-oal file. Th
2f30: 69 73 20 61 6c 6c 6f 77 73 20 74 68 65 20 73 71  is allows the sq
2f40: 6c 69 74 65 33 5f 62 70 5f 70 72 6f 67 72 65 73  lite3_bp_progres
2f50: 73 28 29 0a 2a 2a 20 20 20 41 50 49 20 74 6f 20  s().**   API to 
2f60: 63 61 6c 63 75 6c 61 74 65 20 74 68 65 20 70 65  calculate the pe
2f70: 72 6d 79 72 69 61 64 61 67 65 20 70 72 6f 67 72  rmyriadage progr
2f80: 65 73 73 20 6f 66 20 70 6f 70 75 6c 61 74 69 6e  ess of populatin
2f90: 67 20 74 68 65 20 2a 2d 6f 61 6c 20 66 69 6c 65  g the *-oal file
2fa0: 0a 2a 2a 20 20 20 75 73 69 6e 67 20 74 68 65 20  .**   using the 
2fb0: 66 6f 72 6d 75 6c 61 3a 0a 2a 2a 0a 2a 2a 20 20  formula:.**.**  
2fc0: 20 20 20 70 65 72 6d 79 72 69 61 64 61 67 65 20     permyriadage 
2fd0: 3d 20 28 31 30 30 30 30 20 2a 20 6e 50 72 6f 67  = (10000 * nProg
2fe0: 72 65 73 73 29 20 2f 20 6e 50 68 61 73 65 4f 6e  ress) / nPhaseOn
2ff0: 65 53 74 65 70 0a 2a 2a 0a 2a 2a 20 20 20 6e 50  eStep.**.**   nP
3000: 68 61 73 65 4f 6e 65 53 74 65 70 20 69 73 20 69  haseOneStep is i
3010: 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 74 68  nitialized to th
3020: 65 20 73 75 6d 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20  e sum of:.**.** 
3030: 20 20 20 20 6e 52 6f 77 20 2a 20 28 6e 49 6e 64      nRow * (nInd
3040: 65 78 20 2b 20 31 29 0a 2a 2a 0a 2a 2a 20 20 20  ex + 1).**.**   
3050: 66 6f 72 20 61 6c 6c 20 73 6f 75 72 63 65 20 74  for all source t
3060: 61 62 6c 65 73 20 69 6e 20 74 68 65 20 52 42 55  ables in the RBU
3070: 20 64 61 74 61 62 61 73 65 2c 20 77 68 65 72 65   database, where
3080: 20 6e 52 6f 77 20 69 73 20 74 68 65 20 6e 75 6d   nRow is the num
3090: 62 65 72 0a 2a 2a 20 20 20 6f 66 20 72 6f 77 73  ber.**   of rows
30a0: 20 69 6e 20 74 68 65 20 73 6f 75 72 63 65 20 74   in the source t
30b0: 61 62 6c 65 20 61 6e 64 20 6e 49 6e 64 65 78 20  able and nIndex 
30c0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e  the number of in
30d0: 64 65 78 65 73 20 6f 6e 20 74 68 65 0a 2a 2a 20  dexes on the.** 
30e0: 20 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20    corresponding 
30f0: 74 61 72 67 65 74 20 64 61 74 61 62 61 73 65 20  target database 
3100: 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 54  table..**.**   T
3110: 68 69 73 20 65 73 74 69 6d 61 74 65 20 69 73 20  his estimate is 
3120: 61 63 63 75 72 61 74 65 20 69 66 20 74 68 65 20  accurate if the 
3130: 52 42 55 20 75 70 64 61 74 65 20 63 6f 6e 73 69  RBU update consi
3140: 73 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 66 0a  sts entirely of.
3150: 2a 2a 20 20 20 49 4e 53 45 52 54 20 6f 70 65 72  **   INSERT oper
3160: 61 74 69 6f 6e 73 2e 20 48 6f 77 65 76 65 72 2c  ations. However,
3170: 20 69 74 20 69 73 20 69 6e 61 63 63 75 72 61 74   it is inaccurat
3180: 65 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  e if:.**.**     
3190: 2a 20 74 68 65 20 52 42 55 20 75 70 64 61 74 65  * the RBU update
31a0: 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 55 50   contains any UP
31b0: 44 41 54 45 20 6f 70 65 72 61 74 69 6f 6e 73 2e  DATE operations.
31c0: 20 49 66 20 74 68 65 20 50 4b 20 73 70 65 63 69   If the PK speci
31d0: 66 69 65 64 0a 2a 2a 20 20 20 20 20 20 20 66 6f  fied.**       fo
31e0: 72 20 61 6e 20 55 50 44 41 54 45 20 6f 70 65 72  r an UPDATE oper
31f0: 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65  ation does not e
3200: 78 69 73 74 20 69 6e 20 74 68 65 20 74 61 72 67  xist in the targ
3210: 65 74 20 74 61 62 6c 65 2c 20 74 68 65 6e 0a 2a  et table, then.*
3220: 2a 20 20 20 20 20 20 20 6e 6f 20 62 2d 74 72 65  *       no b-tre
3230: 65 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 72 65  e operations are
3240: 20 72 65 71 75 69 72 65 64 20 6f 6e 20 69 6e 64   required on ind
3250: 65 78 20 62 2d 74 72 65 65 73 2e 20 4f 72 20 69  ex b-trees. Or i
3260: 66 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 20  f the .**       
3270: 73 70 65 63 69 66 69 65 64 20 50 4b 20 64 6f 65  specified PK doe
3280: 73 20 65 78 69 73 74 2c 20 74 68 65 6e 20 28 6e  s exist, then (n
3290: 49 6e 64 65 78 2a 32 29 20 73 75 63 68 20 6f 70  Index*2) such op
32a0: 65 72 61 74 69 6f 6e 73 20 61 72 65 0a 2a 2a 20  erations are.** 
32b0: 20 20 20 20 20 20 72 65 71 75 69 72 65 64 20 28        required (
32c0: 6f 6e 65 20 64 65 6c 65 74 65 20 61 6e 64 20 6f  one delete and o
32d0: 6e 65 20 69 6e 73 65 72 74 20 6f 6e 20 65 61 63  ne insert on eac
32e0: 68 20 69 6e 64 65 78 20 62 2d 74 72 65 65 29 2e  h index b-tree).
32f0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 74 68 65  .**.**     * the
3300: 20 52 42 55 20 75 70 64 61 74 65 20 63 6f 6e 74   RBU update cont
3310: 61 69 6e 73 20 61 6e 79 20 44 45 4c 45 54 45 20  ains any DELETE 
3320: 6f 70 65 72 61 74 69 6f 6e 73 20 66 6f 72 20 77  operations for w
3330: 68 69 63 68 20 74 68 65 20 73 70 65 63 69 66 69  hich the specifi
3340: 65 64 0a 2a 2a 20 20 20 20 20 20 20 50 4b 20 64  ed.**       PK d
3350: 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 20 49  oes not exist. I
3360: 6e 20 74 68 69 73 20 63 61 73 65 20 6e 6f 20 6f  n this case no o
3370: 70 65 72 61 74 69 6f 6e 73 20 61 72 65 20 72 65  perations are re
3380: 71 75 69 72 65 64 20 6f 6e 20 69 6e 64 65 78 0a  quired on index.
3390: 2a 2a 20 20 20 20 20 20 20 62 2d 74 72 65 65 73  **       b-trees
33a0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 74 68  ..**.**     * th
33b0: 65 20 52 42 55 20 75 70 64 61 74 65 20 63 6f 6e  e RBU update con
33c0: 74 61 69 6e 73 20 52 45 50 4c 41 43 45 20 6f 70  tains REPLACE op
33d0: 65 72 61 74 69 6f 6e 73 2e 20 54 68 65 73 65 20  erations. These 
33e0: 61 72 65 20 73 69 6d 69 6c 61 72 20 74 6f 0a 2a  are similar to.*
33f0: 2a 20 20 20 20 20 20 20 55 50 44 41 54 45 20 6f  *       UPDATE o
3400: 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a  perations..**.**
3410: 20 20 20 6e 50 68 61 73 65 4f 6e 65 53 74 65 70     nPhaseOneStep
3420: 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 61   is updated to a
3430: 63 63 6f 75 6e 74 20 66 6f 72 20 74 68 65 20 63  ccount for the c
3440: 6f 6e 64 69 74 69 6f 6e 73 20 61 62 6f 76 65 20  onditions above 
3450: 64 75 72 69 6e 67 20 74 68 65 0a 2a 2a 20 20 20  during the.**   
3460: 66 69 72 73 74 20 70 61 73 73 20 6f 66 20 65 61  first pass of ea
3470: 63 68 20 73 6f 75 72 63 65 20 74 61 62 6c 65 2e  ch source table.
3480: 20 54 68 65 20 75 70 64 61 74 65 64 20 6e 50 68   The updated nPh
3490: 61 73 65 4f 6e 65 53 74 65 70 20 76 61 6c 75 65  aseOneStep value
34a0: 20 69 73 0a 2a 2a 20 20 20 73 74 6f 72 65 64 20   is.**   stored 
34b0: 69 6e 20 74 68 65 20 72 62 75 5f 73 74 61 74 65  in the rbu_state
34c0: 20 74 61 62 6c 65 20 69 66 20 74 68 65 20 52 42   table if the RB
34d0: 55 20 75 70 64 61 74 65 20 69 73 20 73 75 73 70  U update is susp
34e0: 65 6e 64 65 64 2e 0a 2a 2f 0a 73 74 72 75 63 74  ended..*/.struct
34f0: 20 73 71 6c 69 74 65 33 72 62 75 20 7b 0a 20 20   sqlite3rbu {.  
3500: 69 6e 74 20 65 53 74 61 67 65 3b 20 20 20 20 20  int eStage;     
3510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3520: 2f 2a 20 56 61 6c 75 65 20 6f 66 20 52 42 55 5f  /* Value of RBU_
3530: 53 54 41 54 45 5f 53 54 41 47 45 20 66 69 65 6c  STATE_STAGE fiel
3540: 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  d */.  sqlite3 *
3550: 64 62 4d 61 69 6e 3b 20 20 20 20 20 20 20 20 20  dbMain;         
3560: 20 20 20 20 20 20 20 2f 2a 20 74 61 72 67 65 74         /* target
3570: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
3580: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
3590: 62 52 62 75 3b 20 20 20 20 20 20 20 20 20 20 20  bRbu;           
35a0: 20 20 20 20 20 20 2f 2a 20 72 62 75 20 64 61 74        /* rbu dat
35b0: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  abase handle */.
35c0: 20 20 63 68 61 72 20 2a 7a 54 61 72 67 65 74 3b    char *zTarget;
35d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35e0: 20 20 2f 2a 20 50 61 74 68 20 74 6f 20 74 61 72    /* Path to tar
35f0: 67 65 74 20 64 62 20 2a 2f 0a 20 20 63 68 61 72  get db */.  char
3600: 20 2a 7a 52 62 75 3b 20 20 20 20 20 20 20 20 20   *zRbu;         
3610: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
3620: 61 74 68 20 74 6f 20 72 62 75 20 64 62 20 2a 2f  ath to rbu db */
3630: 0a 20 20 63 68 61 72 20 2a 7a 53 74 61 74 65 3b  .  char *zState;
3640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3650: 20 20 20 2f 2a 20 50 61 74 68 20 74 6f 20 73 74     /* Path to st
3660: 61 74 65 20 64 62 20 28 6f 72 20 4e 55 4c 4c 20  ate db (or NULL 
3670: 69 66 20 7a 52 62 75 29 20 2a 2f 0a 20 20 63 68  if zRbu) */.  ch
3680: 61 72 20 7a 53 74 61 74 65 44 62 5b 35 5d 3b 20  ar zStateDb[5]; 
3690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
36a0: 20 44 62 20 6e 61 6d 65 20 66 6f 72 20 73 74 61   Db name for sta
36b0: 74 65 20 28 22 73 74 61 74 22 20 6f 72 20 22 6d  te ("stat" or "m
36c0: 61 69 6e 22 29 20 2a 2f 0a 20 20 69 6e 74 20 72  ain") */.  int r
36d0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
36e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
36f0: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
3700: 6c 61 73 74 20 72 62 75 5f 73 74 65 70 28 29 20  last rbu_step() 
3710: 63 61 6c 6c 20 2a 2f 0a 20 20 63 68 61 72 20 2a  call */.  char *
3720: 7a 45 72 72 6d 73 67 3b 20 20 20 20 20 20 20 20  zErrmsg;        
3730: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72            /* Err
3740: 6f 72 20 6d 65 73 73 61 67 65 20 69 66 20 72 63  or message if rc
3750: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 2a 2f 0a 20  !=SQLITE_OK */. 
3760: 20 69 6e 74 20 6e 53 74 65 70 3b 20 20 20 20 20   int nStep;     
3770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3780: 20 2f 2a 20 52 6f 77 73 20 70 72 6f 63 65 73 73   /* Rows process
3790: 65 64 20 66 6f 72 20 63 75 72 72 65 6e 74 20 6f  ed for current o
37a0: 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  bject */.  int n
37b0: 50 72 6f 67 72 65 73 73 3b 20 20 20 20 20 20 20  Progress;       
37c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
37d0: 77 73 20 70 72 6f 63 65 73 73 65 64 20 66 6f 72  ws processed for
37e0: 20 61 6c 6c 20 6f 62 6a 65 63 74 73 20 2a 2f 0a   all objects */.
37f0: 20 20 52 62 75 4f 62 6a 49 74 65 72 20 6f 62 6a    RbuObjIter obj
3800: 69 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  iter;           
3810: 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 66 6f    /* Iterator fo
3820: 72 20 73 6b 69 70 70 69 6e 67 20 74 68 72 6f 75  r skipping throu
3830: 67 68 20 74 62 6c 2f 69 64 78 20 2a 2f 0a 20 20  gh tbl/idx */.  
3840: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73  const char *zVfs
3850: 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  Name;           
3860: 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 75 74 6f 6d  /* Name of autom
3870: 61 74 69 63 61 6c 6c 79 20 63 72 65 61 74 65 64  atically created
3880: 20 72 62 75 20 76 66 73 20 2a 2f 0a 20 20 72 62   rbu vfs */.  rb
3890: 75 5f 66 69 6c 65 20 2a 70 54 61 72 67 65 74 46  u_file *pTargetF
38a0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  d;            /*
38b0: 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 6f 70 65   File handle ope
38c0: 6e 20 6f 6e 20 74 61 72 67 65 74 20 64 62 20 2a  n on target db *
38d0: 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 50 65 72  /.  int nPagePer
38e0: 53 65 63 74 6f 72 3b 20 20 20 20 20 20 20 20 20  Sector;         
38f0: 20 20 20 20 2f 2a 20 50 61 67 65 73 20 70 65 72      /* Pages per
3900: 20 73 65 63 74 6f 72 20 66 6f 72 20 70 54 61 72   sector for pTar
3910: 67 65 74 46 64 20 2a 2f 0a 20 20 69 36 34 20 69  getFd */.  i64 i
3920: 4f 61 6c 53 7a 3b 0a 20 20 69 36 34 20 6e 50 68  OalSz;.  i64 nPh
3930: 61 73 65 4f 6e 65 53 74 65 70 3b 0a 0a 20 20 2f  aseOneStep;..  /
3940: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
3950: 73 74 61 74 65 20 76 61 72 69 61 62 6c 65 73 20  state variables 
3960: 61 72 65 20 75 73 65 64 20 61 73 20 70 61 72 74  are used as part
3970: 20 6f 66 20 74 68 65 20 69 6e 63 72 65 6d 65 6e   of the incremen
3980: 74 61 6c 0a 20 20 2a 2a 20 63 68 65 63 6b 70 6f  tal.  ** checkpo
3990: 69 6e 74 20 73 74 61 67 65 20 28 65 53 74 61 67  int stage (eStag
39a0: 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 43 4b 50  e==RBU_STAGE_CKP
39b0: 54 29 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73  T). See comments
39c0: 20 73 75 72 72 6f 75 6e 64 69 6e 67 0a 20 20 2a   surrounding.  *
39d0: 2a 20 66 75 6e 63 74 69 6f 6e 20 72 62 75 53 65  * function rbuSe
39e0: 74 75 70 43 68 65 63 6b 70 6f 69 6e 74 28 29 20  tupCheckpoint() 
39f0: 66 6f 72 20 64 65 74 61 69 6c 73 2e 20 20 2a 2f  for details.  */
3a00: 0a 20 20 75 33 32 20 69 4d 61 78 46 72 61 6d 65  .  u32 iMaxFrame
3a10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3a20: 20 20 20 2f 2a 20 4c 61 72 67 65 73 74 20 69 57     /* Largest iW
3a30: 61 6c 46 72 61 6d 65 20 76 61 6c 75 65 20 69 6e  alFrame value in
3a40: 20 61 46 72 61 6d 65 5b 5d 20 2a 2f 0a 20 20 75   aFrame[] */.  u
3a50: 33 32 20 6d 4c 6f 63 6b 3b 0a 20 20 69 6e 74 20  32 mLock;.  int 
3a60: 6e 46 72 61 6d 65 3b 20 20 20 20 20 20 20 20 20  nFrame;         
3a70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
3a80: 6e 74 72 69 65 73 20 69 6e 20 61 46 72 61 6d 65  ntries in aFrame
3a90: 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e  [] array */.  in
3aa0: 74 20 6e 46 72 61 6d 65 41 6c 6c 6f 63 3b 20 20  t nFrameAlloc;  
3ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3ac0: 20 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65 20   Allocated size 
3ad0: 6f 66 20 61 46 72 61 6d 65 5b 5d 20 61 72 72 61  of aFrame[] arra
3ae0: 79 20 2a 2f 0a 20 20 52 62 75 46 72 61 6d 65 20  y */.  RbuFrame 
3af0: 2a 61 46 72 61 6d 65 3b 0a 20 20 69 6e 74 20 70  *aFrame;.  int p
3b00: 67 73 7a 3b 0a 20 20 75 38 20 2a 61 42 75 66 3b  gsz;.  u8 *aBuf;
3b10: 0a 20 20 69 36 34 20 69 57 61 6c 43 6b 73 75 6d  .  i64 iWalCksum
3b20: 3b 0a 20 20 69 36 34 20 73 7a 54 65 6d 70 3b 20  ;.  i64 szTemp; 
3b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b40: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73      /* Current s
3b50: 69 7a 65 20 6f 66 20 61 6c 6c 20 74 65 6d 70 20  ize of all temp 
3b60: 66 69 6c 65 73 20 69 6e 20 75 73 65 20 2a 2f 0a  files in use */.
3b70: 20 20 69 36 34 20 73 7a 54 65 6d 70 4c 69 6d 69    i64 szTempLimi
3b80: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
3b90: 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20    /* Total size 
3ba0: 6c 69 6d 69 74 20 66 6f 72 20 74 65 6d 70 20 66  limit for temp f
3bb0: 69 6c 65 73 20 2a 2f 0a 0a 20 20 2f 2a 20 55 73  iles */..  /* Us
3bc0: 65 64 20 69 6e 20 52 42 55 20 76 61 63 75 75 6d  ed in RBU vacuum
3bd0: 20 6d 6f 64 65 20 6f 6e 6c 79 20 2a 2f 0a 20 20   mode only */.  
3be0: 69 6e 74 20 6e 52 62 75 3b 20 20 20 20 20 20 20  int nRbu;       
3bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c00: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 42 55  /* Number of RBU
3c10: 20 56 46 53 20 69 6e 20 74 68 65 20 73 74 61 63   VFS in the stac
3c20: 6b 20 2a 2f 0a 20 20 72 62 75 5f 66 69 6c 65 20  k */.  rbu_file 
3c30: 2a 70 52 62 75 46 64 3b 20 20 20 20 20 20 20 20  *pRbuFd;        
3c40: 20 20 20 20 20 20 20 2f 2a 20 46 64 20 66 6f 72         /* Fd for
3c50: 20 6d 61 69 6e 20 64 62 20 6f 66 20 64 62 52 62   main db of dbRb
3c60: 75 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  u */.};../*.** A
3c70: 6e 20 72 62 75 20 56 46 53 20 69 73 20 69 6d 70  n rbu VFS is imp
3c80: 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e 67 20 61  lemented using a
3c90: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
3ca0: 69 73 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  is structure..**
3cb0: 0a 2a 2a 20 56 61 72 69 61 62 6c 65 20 70 52 62  .** Variable pRb
3cc0: 75 20 69 73 20 6f 6e 6c 79 20 6e 6f 6e 2d 4e 55  u is only non-NU
3cd0: 4c 4c 20 66 6f 72 20 61 75 74 6f 6d 61 74 69 63  LL for automatic
3ce0: 61 6c 6c 79 20 63 72 65 61 74 65 64 20 52 42 55  ally created RBU
3cf0: 20 56 46 53 20 6f 62 6a 65 63 74 73 2e 0a 2a 2a   VFS objects..**
3d00: 20 49 74 20 69 73 20 4e 55 4c 4c 20 66 6f 72 20   It is NULL for 
3d10: 52 42 55 20 56 46 53 20 6f 62 6a 65 63 74 73 20  RBU VFS objects 
3d20: 63 72 65 61 74 65 64 20 65 78 70 6c 69 63 69 74  created explicit
3d30: 6c 79 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69  ly using.** sqli
3d40: 74 65 33 72 62 75 5f 63 72 65 61 74 65 5f 76 66  te3rbu_create_vf
3d50: 73 28 29 2e 20 49 74 20 69 73 20 75 73 65 64 20  s(). It is used 
3d60: 74 6f 20 74 72 61 63 6b 20 74 68 65 20 74 6f 74  to track the tot
3d70: 61 6c 20 61 6d 6f 75 6e 74 20 6f 66 20 74 65 6d  al amount of tem
3d80: 70 0a 2a 2a 20 73 70 61 63 65 20 75 73 65 64 20  p.** space used 
3d90: 62 79 20 74 68 65 20 52 42 55 20 68 61 6e 64 6c  by the RBU handl
3da0: 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 72 62 75  e..*/.struct rbu
3db0: 5f 76 66 73 20 7b 0a 20 20 73 71 6c 69 74 65 33  _vfs {.  sqlite3
3dc0: 5f 76 66 73 20 62 61 73 65 3b 20 20 20 20 20 20  _vfs base;      
3dd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 72 62 75 20           /* rbu 
3de0: 56 46 53 20 73 68 69 6d 20 6d 65 74 68 6f 64 73  VFS shim methods
3df0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66   */.  sqlite3_vf
3e00: 73 20 2a 70 52 65 61 6c 56 66 73 3b 20 20 20 20  s *pRealVfs;    
3e10: 20 20 20 20 20 20 2f 2a 20 55 6e 64 65 72 6c 79        /* Underly
3e20: 69 6e 67 20 56 46 53 20 2a 2f 0a 20 20 73 71 6c  ing VFS */.  sql
3e30: 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65  ite3_mutex *mute
3e40: 78 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  x;           /* 
3e50: 4d 75 74 65 78 20 74 6f 20 70 72 6f 74 65 63 74  Mutex to protect
3e60: 20 70 4d 61 69 6e 20 2a 2f 0a 20 20 73 71 6c 69   pMain */.  sqli
3e70: 74 65 33 72 62 75 20 2a 70 52 62 75 3b 20 20 20  te3rbu *pRbu;   
3e80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
3e90: 77 6e 65 72 20 52 42 55 20 6f 62 6a 65 63 74 20  wner RBU object 
3ea0: 2a 2f 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a 70  */.  rbu_file *p
3eb0: 4d 61 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20  Main;           
3ec0: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
3ed0: 6d 61 69 6e 20 64 62 20 66 69 6c 65 73 20 2a 2f  main db files */
3ee0: 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 4d 61  .  rbu_file *pMa
3ef0: 69 6e 52 62 75 3b 20 20 20 20 20 20 20 20 20 20  inRbu;          
3f00: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 6d 61     /* List of ma
3f10: 69 6e 20 64 62 20 66 69 6c 65 73 20 77 69 74 68  in db files with
3f20: 20 70 52 62 75 21 3d 30 20 2a 2f 0a 7d 3b 0a 0a   pRbu!=0 */.};..
3f30: 2f 2a 0a 2a 2a 20 45 61 63 68 20 66 69 6c 65 20  /*.** Each file 
3f40: 6f 70 65 6e 65 64 20 62 79 20 61 6e 20 72 62 75  opened by an rbu
3f50: 20 56 46 53 20 69 73 20 72 65 70 72 65 73 65 6e   VFS is represen
3f60: 74 65 64 20 62 79 20 61 6e 20 69 6e 73 74 61 6e  ted by an instan
3f70: 63 65 20 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 6c  ce of.** the fol
3f80: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
3f90: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20  ..**.** If this 
3fa0: 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  is a temporary f
3fb0: 69 6c 65 20 28 70 52 62 75 21 3d 30 20 26 26 20  ile (pRbu!=0 && 
3fc0: 66 6c 61 67 73 26 44 45 4c 45 54 45 5f 4f 4e 5f  flags&DELETE_ON_
3fd0: 43 4c 4f 53 45 29 2c 20 76 61 72 69 61 62 6c 65  CLOSE), variable
3fe0: 0a 2a 2a 20 22 73 7a 22 20 69 73 20 73 65 74 20  .** "sz" is set 
3ff0: 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  to the current s
4000: 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
4010: 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 72  ase file..*/.str
4020: 75 63 74 20 72 62 75 5f 66 69 6c 65 20 7b 0a 20  uct rbu_file {. 
4030: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 62 61   sqlite3_file ba
4040: 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
4050: 20 2f 2a 20 73 71 6c 69 74 65 33 5f 66 69 6c 65   /* sqlite3_file
4060: 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 20 20 73 71   methods */.  sq
4070: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 52 65 61  lite3_file *pRea
4080: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  l;            /*
4090: 20 55 6e 64 65 72 6c 79 69 6e 67 20 66 69 6c 65   Underlying file
40a0: 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 72 62 75   handle */.  rbu
40b0: 5f 76 66 73 20 2a 70 52 62 75 56 66 73 3b 20 20  _vfs *pRbuVfs;  
40c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
40d0: 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 72  Pointer to the r
40e0: 62 75 5f 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f  bu_vfs object */
40f0: 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20 2a 70  .  sqlite3rbu *p
4100: 52 62 75 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rbu;            
4110: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
4120: 20 72 62 75 20 6f 62 6a 65 63 74 20 28 72 62 75   rbu object (rbu
4130: 20 74 61 72 67 65 74 20 6f 6e 6c 79 29 20 2a 2f   target only) */
4140: 0a 20 20 69 36 34 20 73 7a 3b 20 20 20 20 20 20  .  i64 sz;      
4150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4160: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 66 69     /* Size of fi
4170: 6c 65 20 69 6e 20 62 79 74 65 73 20 28 74 65 6d  le in bytes (tem
4180: 70 20 6f 6e 6c 79 29 20 2a 2f 0a 0a 20 20 69 6e  p only) */..  in
4190: 74 20 6f 70 65 6e 46 6c 61 67 73 3b 20 20 20 20  t openFlags;    
41a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
41b0: 20 46 6c 61 67 73 20 74 68 69 73 20 66 69 6c 65   Flags this file
41c0: 20 77 61 73 20 6f 70 65 6e 65 64 20 77 69 74 68   was opened with
41d0: 20 2a 2f 0a 20 20 75 33 32 20 69 43 6f 6f 6b 69   */.  u32 iCooki
41e0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
41f0: 20 20 20 20 20 20 2f 2a 20 43 6f 6f 6b 69 65 20        /* Cookie 
4200: 76 61 6c 75 65 20 66 6f 72 20 6d 61 69 6e 20 64  value for main d
4210: 62 20 66 69 6c 65 73 20 2a 2f 0a 20 20 75 38 20  b files */.  u8 
4220: 69 57 72 69 74 65 56 65 72 3b 20 20 20 20 20 20  iWriteVer;      
4230: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4240: 22 77 72 69 74 65 2d 76 65 72 73 69 6f 6e 22 20  "write-version" 
4250: 76 61 6c 75 65 20 66 6f 72 20 6d 61 69 6e 20 64  value for main d
4260: 62 20 66 69 6c 65 73 20 2a 2f 0a 20 20 75 38 20  b files */.  u8 
4270: 62 4e 6f 6c 6f 63 6b 3b 20 20 20 20 20 20 20 20  bNolock;        
4280: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4290: 54 72 75 65 20 74 6f 20 66 61 69 6c 20 45 58 43  True to fail EXC
42a0: 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20 2a 2f 0a  LUSIVE locks */.
42b0: 0a 20 20 69 6e 74 20 6e 53 68 6d 3b 20 20 20 20  .  int nShm;    
42c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
42d0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
42e0: 65 6e 74 72 69 65 73 20 69 6e 20 61 70 53 68 6d  entries in apShm
42f0: 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 63 68  [] array */.  ch
4300: 61 72 20 2a 2a 61 70 53 68 6d 3b 20 20 20 20 20  ar **apShm;     
4310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4320: 20 41 72 72 61 79 20 6f 66 20 6d 6d 61 70 27 64   Array of mmap'd
4330: 20 2a 2d 73 68 6d 20 72 65 67 69 6f 6e 73 20 2a   *-shm regions *
4340: 2f 0a 20 20 63 68 61 72 20 2a 7a 44 65 6c 3b 20  /.  char *zDel; 
4350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4360: 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68      /* Delete th
4370: 69 73 20 77 68 65 6e 20 63 6c 6f 73 69 6e 67 20  is when closing 
4380: 66 69 6c 65 20 2a 2f 0a 0a 20 20 63 6f 6e 73 74  file */..  const
4390: 20 63 68 61 72 20 2a 7a 57 61 6c 3b 20 20 20 20   char *zWal;    
43a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 61             /* Wa
43b0: 6c 20 66 69 6c 65 6e 61 6d 65 20 66 6f 72 20 74  l filename for t
43c0: 68 69 73 20 6d 61 69 6e 20 64 62 20 66 69 6c 65  his main db file
43d0: 20 2a 2f 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a   */.  rbu_file *
43e0: 70 57 61 6c 46 64 3b 20 20 20 20 20 20 20 20 20  pWalFd;         
43f0: 20 20 20 20 20 20 2f 2a 20 57 61 6c 20 66 69 6c        /* Wal fil
4400: 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
4410: 20 74 68 69 73 20 6d 61 69 6e 20 64 62 20 2a 2f   this main db */
4420: 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 4d 61  .  rbu_file *pMa
4430: 69 6e 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20  inNext;         
4440: 20 20 20 2f 2a 20 4e 65 78 74 20 4d 41 49 4e 5f     /* Next MAIN_
4450: 44 42 20 66 69 6c 65 20 2a 2f 0a 20 20 72 62 75  DB file */.  rbu
4460: 5f 66 69 6c 65 20 2a 70 4d 61 69 6e 52 62 75 4e  _file *pMainRbuN
4470: 65 78 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ext;         /* 
4480: 4e 65 78 74 20 4d 41 49 4e 5f 44 42 20 66 69 6c  Next MAIN_DB fil
4490: 65 20 77 69 74 68 20 70 52 62 75 21 3d 30 20 2a  e with pRbu!=0 *
44a0: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 65  /.};../*.** True
44b0: 20 66 6f 72 20 61 6e 20 52 42 55 20 76 61 63 75   for an RBU vacu
44c0: 75 6d 20 68 61 6e 64 6c 65 2c 20 6f 72 20 66 61  um handle, or fa
44d0: 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  lse otherwise..*
44e0: 2f 0a 23 64 65 66 69 6e 65 20 72 62 75 49 73 56  /.#define rbuIsV
44f0: 61 63 75 75 6d 28 70 29 20 28 28 70 29 2d 3e 7a  acuum(p) ((p)->z
4500: 54 61 72 67 65 74 3d 3d 30 29 0a 0a 0a 2f 2a 2a  Target==0).../**
4510: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4520: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4530: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4540: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4550: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 66  *******.** The f
4560: 6f 6c 6c 6f 77 69 6e 67 20 74 68 72 65 65 20 66  ollowing three f
4570: 75 6e 63 74 69 6f 6e 73 2c 20 66 6f 75 6e 64 20  unctions, found 
4580: 62 65 6c 6f 77 3a 0a 2a 2a 0a 2a 2a 20 20 20 72  below:.**.**   r
4590: 62 75 44 65 6c 74 61 47 65 74 49 6e 74 28 29 0a  buDeltaGetInt().
45a0: 2a 2a 20 20 20 72 62 75 44 65 6c 74 61 43 68 65  **   rbuDeltaChe
45b0: 63 6b 73 75 6d 28 29 0a 2a 2a 20 20 20 72 62 75  cksum().**   rbu
45c0: 44 65 6c 74 61 41 70 70 6c 79 28 29 0a 2a 2a 0a  DeltaApply().**.
45d0: 2a 2a 20 61 72 65 20 6c 69 66 74 65 64 20 66 72  ** are lifted fr
45e0: 6f 6d 20 74 68 65 20 66 6f 73 73 69 6c 20 73 6f  om the fossil so
45f0: 75 72 63 65 20 63 6f 64 65 20 28 68 74 74 70 3a  urce code (http:
4600: 2f 2f 66 6f 73 73 69 6c 2d 73 63 6d 2e 6f 72 67  //fossil-scm.org
4610: 29 2e 20 54 68 65 79 0a 2a 2a 20 61 72 65 20 75  ). They.** are u
4620: 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
4630: 20 74 68 65 20 73 63 61 6c 61 72 20 53 51 4c 20   the scalar SQL 
4640: 66 75 6e 63 74 69 6f 6e 20 72 62 75 5f 66 6f 73  function rbu_fos
4650: 73 69 6c 5f 64 65 6c 74 61 28 29 2e 0a 2a 2f 0a  sil_delta()..*/.
4660: 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 62 79 74 65  ./*.** Read byte
4670: 73 20 66 72 6f 6d 20 2a 70 7a 20 61 6e 64 20 63  s from *pz and c
4680: 6f 6e 76 65 72 74 20 74 68 65 6d 20 69 6e 74 6f  onvert them into
4690: 20 61 20 70 6f 73 69 74 69 76 65 20 69 6e 74 65   a positive inte
46a0: 67 65 72 2e 20 20 57 68 65 6e 0a 2a 2a 20 66 69  ger.  When.** fi
46b0: 6e 69 73 68 65 64 2c 20 6c 65 61 76 65 20 2a 70  nished, leave *p
46c0: 7a 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  z pointing to th
46d0: 65 20 66 69 72 73 74 20 63 68 61 72 61 63 74 65  e first characte
46e0: 72 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  r past the end o
46f0: 66 0a 2a 2a 20 74 68 65 20 69 6e 74 65 67 65 72  f.** the integer
4700: 2e 20 20 54 68 65 20 2a 70 4c 65 6e 20 70 61 72  .  The *pLen par
4710: 61 6d 65 74 65 72 20 68 6f 6c 64 73 20 74 68 65  ameter holds the
4720: 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 73   length of the s
4730: 74 72 69 6e 67 0a 2a 2a 20 69 6e 20 2a 70 7a 20  tring.** in *pz 
4740: 61 6e 64 20 69 73 20 64 65 63 72 65 6d 65 6e 74  and is decrement
4750: 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ed once for each
4760: 20 63 68 61 72 61 63 74 65 72 20 69 6e 20 74 68   character in th
4770: 65 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 73 74  e integer..*/.st
4780: 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20 69 6e  atic unsigned in
4790: 74 20 72 62 75 44 65 6c 74 61 47 65 74 49 6e 74  t rbuDeltaGetInt
47a0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a  (const char **pz
47b0: 2c 20 69 6e 74 20 2a 70 4c 65 6e 29 7b 0a 20 20  , int *pLen){.  
47c0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 69 67  static const sig
47d0: 6e 65 64 20 63 68 61 72 20 7a 56 61 6c 75 65 5b  ned char zValue[
47e0: 5d 20 3d 20 7b 0a 20 20 20 20 2d 31 2c 20 2d 31  ] = {.    -1, -1
47f0: 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31  , -1, -1, -1, -1
4800: 2c 20 2d 31 2c 20 2d 31 2c 20 20 20 2d 31 2c 20  , -1, -1,   -1, 
4810: 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20  -1, -1, -1, -1, 
4820: 2d 31 2c 20 2d 31 2c 20 2d 31 2c 0a 20 20 20 20  -1, -1, -1,.    
4830: 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20  -1, -1, -1, -1, 
4840: 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20  -1, -1, -1, -1, 
4850: 20 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31    -1, -1, -1, -1
4860: 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31  , -1, -1, -1, -1
4870: 2c 0a 20 20 20 20 2d 31 2c 20 2d 31 2c 20 2d 31  ,.    -1, -1, -1
4880: 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31  , -1, -1, -1, -1
4890: 2c 20 2d 31 2c 20 20 20 2d 31 2c 20 2d 31 2c 20  , -1,   -1, -1, 
48a0: 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20  -1, -1, -1, -1, 
48b0: 2d 31 2c 20 2d 31 2c 0a 20 20 20 20 20 30 2c 20  -1, -1,.     0, 
48c0: 20 31 2c 20 20 32 2c 20 20 33 2c 20 20 34 2c 20   1,  2,  3,  4, 
48d0: 20 35 2c 20 20 36 2c 20 20 37 2c 20 20 20 20 38   5,  6,  7,    8
48e0: 2c 20 20 39 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31  ,  9, -1, -1, -1
48f0: 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 0a 20 20  , -1, -1, -1,.  
4900: 20 20 2d 31 2c 20 31 30 2c 20 31 31 2c 20 31 32    -1, 10, 11, 12
4910: 2c 20 31 33 2c 20 31 34 2c 20 31 35 2c 20 31 36  , 13, 14, 15, 16
4920: 2c 20 20 20 31 37 2c 20 31 38 2c 20 31 39 2c 20  ,   17, 18, 19, 
4930: 32 30 2c 20 32 31 2c 20 32 32 2c 20 32 33 2c 20  20, 21, 22, 23, 
4940: 32 34 2c 0a 20 20 20 20 32 35 2c 20 32 36 2c 20  24,.    25, 26, 
4950: 32 37 2c 20 32 38 2c 20 32 39 2c 20 33 30 2c 20  27, 28, 29, 30, 
4960: 33 31 2c 20 33 32 2c 20 20 20 33 33 2c 20 33 34  31, 32,   33, 34
4970: 2c 20 33 35 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31  , 35, -1, -1, -1
4980: 2c 20 2d 31 2c 20 33 36 2c 0a 20 20 20 20 2d 31  , -1, 36,.    -1
4990: 2c 20 33 37 2c 20 33 38 2c 20 33 39 2c 20 34 30  , 37, 38, 39, 40
49a0: 2c 20 34 31 2c 20 34 32 2c 20 34 33 2c 20 20 20  , 41, 42, 43,   
49b0: 34 34 2c 20 34 35 2c 20 34 36 2c 20 34 37 2c 20  44, 45, 46, 47, 
49c0: 34 38 2c 20 34 39 2c 20 35 30 2c 20 35 31 2c 0a  48, 49, 50, 51,.
49d0: 20 20 20 20 35 32 2c 20 35 33 2c 20 35 34 2c 20      52, 53, 54, 
49e0: 35 35 2c 20 35 36 2c 20 35 37 2c 20 35 38 2c 20  55, 56, 57, 58, 
49f0: 35 39 2c 20 20 20 36 30 2c 20 36 31 2c 20 36 32  59,   60, 61, 62
4a00: 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 36 33  , -1, -1, -1, 63
4a10: 2c 20 2d 31 2c 0a 20 20 7d 3b 0a 20 20 75 6e 73  , -1,.  };.  uns
4a20: 69 67 6e 65 64 20 69 6e 74 20 76 20 3d 20 30 3b  igned int v = 0;
4a30: 0a 20 20 69 6e 74 20 63 3b 0a 20 20 75 6e 73 69  .  int c;.  unsi
4a40: 67 6e 65 64 20 63 68 61 72 20 2a 7a 20 3d 20 28  gned char *z = (
4a50: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 2a  unsigned char*)*
4a60: 70 7a 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  pz;.  unsigned c
4a70: 68 61 72 20 2a 7a 53 74 61 72 74 20 3d 20 7a 3b  har *zStart = z;
4a80: 0a 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20 7a  .  while( (c = z
4a90: 56 61 6c 75 65 5b 30 78 37 66 26 2a 28 7a 2b 2b  Value[0x7f&*(z++
4aa0: 29 5d 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 76  )])>=0 ){.     v
4ab0: 20 3d 20 28 76 3c 3c 36 29 20 2b 20 63 3b 0a 20   = (v<<6) + c;. 
4ac0: 20 7d 0a 20 20 7a 2d 2d 3b 0a 20 20 2a 70 4c 65   }.  z--;.  *pLe
4ad0: 6e 20 2d 3d 20 7a 20 2d 20 7a 53 74 61 72 74 3b  n -= z - zStart;
4ae0: 0a 20 20 2a 70 7a 20 3d 20 28 63 68 61 72 2a 29  .  *pz = (char*)
4af0: 7a 3b 0a 20 20 72 65 74 75 72 6e 20 76 3b 0a 7d  z;.  return v;.}
4b00: 0a 0a 23 69 66 20 52 42 55 5f 45 4e 41 42 4c 45  ..#if RBU_ENABLE
4b10: 5f 44 45 4c 54 41 5f 43 4b 53 55 4d 0a 2f 2a 0a  _DELTA_CKSUM./*.
4b20: 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 33 32 2d  ** Compute a 32-
4b30: 62 69 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20  bit checksum on 
4b40: 74 68 65 20 4e 2d 62 79 74 65 20 62 75 66 66 65  the N-byte buffe
4b50: 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 72  r.  Return the r
4b60: 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  esult..*/.static
4b70: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 72 62   unsigned int rb
4b80: 75 44 65 6c 74 61 43 68 65 63 6b 73 75 6d 28 63  uDeltaChecksum(c
4b90: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 2c 20  onst char *zIn, 
4ba0: 73 69 7a 65 5f 74 20 4e 29 7b 0a 20 20 63 6f 6e  size_t N){.  con
4bb0: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
4bc0: 20 2a 7a 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73   *z = (const uns
4bd0: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 7a 49 6e  igned char *)zIn
4be0: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 73 75 6d  ;.  unsigned sum
4bf0: 30 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65  0 = 0;.  unsigne
4c00: 64 20 73 75 6d 31 20 3d 20 30 3b 0a 20 20 75 6e  d sum1 = 0;.  un
4c10: 73 69 67 6e 65 64 20 73 75 6d 32 20 3d 20 30 3b  signed sum2 = 0;
4c20: 0a 20 20 75 6e 73 69 67 6e 65 64 20 73 75 6d 33  .  unsigned sum3
4c30: 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 4e 20   = 0;.  while(N 
4c40: 3e 3d 20 31 36 29 7b 0a 20 20 20 20 73 75 6d 30  >= 16){.    sum0
4c50: 20 2b 3d 20 28 28 75 6e 73 69 67 6e 65 64 29 7a   += ((unsigned)z
4c60: 5b 30 5d 20 2b 20 7a 5b 34 5d 20 2b 20 7a 5b 38  [0] + z[4] + z[8
4c70: 5d 20 2b 20 7a 5b 31 32 5d 29 3b 0a 20 20 20 20  ] + z[12]);.    
4c80: 73 75 6d 31 20 2b 3d 20 28 28 75 6e 73 69 67 6e  sum1 += ((unsign
4c90: 65 64 29 7a 5b 31 5d 20 2b 20 7a 5b 35 5d 20 2b  ed)z[1] + z[5] +
4ca0: 20 7a 5b 39 5d 20 2b 20 7a 5b 31 33 5d 29 3b 0a   z[9] + z[13]);.
4cb0: 20 20 20 20 73 75 6d 32 20 2b 3d 20 28 28 75 6e      sum2 += ((un
4cc0: 73 69 67 6e 65 64 29 7a 5b 32 5d 20 2b 20 7a 5b  signed)z[2] + z[
4cd0: 36 5d 20 2b 20 7a 5b 31 30 5d 2b 20 7a 5b 31 34  6] + z[10]+ z[14
4ce0: 5d 29 3b 0a 20 20 20 20 73 75 6d 33 20 2b 3d 20  ]);.    sum3 += 
4cf0: 28 28 75 6e 73 69 67 6e 65 64 29 7a 5b 33 5d 20  ((unsigned)z[3] 
4d00: 2b 20 7a 5b 37 5d 20 2b 20 7a 5b 31 31 5d 2b 20  + z[7] + z[11]+ 
4d10: 7a 5b 31 35 5d 29 3b 0a 20 20 20 20 7a 20 2b 3d  z[15]);.    z +=
4d20: 20 31 36 3b 0a 20 20 20 20 4e 20 2d 3d 20 31 36   16;.    N -= 16
4d30: 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 4e 20  ;.  }.  while(N 
4d40: 3e 3d 20 34 29 7b 0a 20 20 20 20 73 75 6d 30 20  >= 4){.    sum0 
4d50: 2b 3d 20 7a 5b 30 5d 3b 0a 20 20 20 20 73 75 6d  += z[0];.    sum
4d60: 31 20 2b 3d 20 7a 5b 31 5d 3b 0a 20 20 20 20 73  1 += z[1];.    s
4d70: 75 6d 32 20 2b 3d 20 7a 5b 32 5d 3b 0a 20 20 20  um2 += z[2];.   
4d80: 20 73 75 6d 33 20 2b 3d 20 7a 5b 33 5d 3b 0a 20   sum3 += z[3];. 
4d90: 20 20 20 7a 20 2b 3d 20 34 3b 0a 20 20 20 20 4e     z += 4;.    N
4da0: 20 2d 3d 20 34 3b 0a 20 20 7d 0a 20 20 73 75 6d   -= 4;.  }.  sum
4db0: 33 20 2b 3d 20 28 73 75 6d 32 20 3c 3c 20 38 29  3 += (sum2 << 8)
4dc0: 20 2b 20 28 73 75 6d 31 20 3c 3c 20 31 36 29 20   + (sum1 << 16) 
4dd0: 2b 20 28 73 75 6d 30 20 3c 3c 20 32 34 29 3b 0a  + (sum0 << 24);.
4de0: 20 20 73 77 69 74 63 68 28 4e 29 7b 0a 20 20 20    switch(N){.   
4df0: 20 63 61 73 65 20 33 3a 20 20 20 73 75 6d 33 20   case 3:   sum3 
4e00: 2b 3d 20 28 7a 5b 32 5d 20 3c 3c 20 38 29 3b 0a  += (z[2] << 8);.
4e10: 20 20 20 20 63 61 73 65 20 32 3a 20 20 20 73 75      case 2:   su
4e20: 6d 33 20 2b 3d 20 28 7a 5b 31 5d 20 3c 3c 20 31  m3 += (z[1] << 1
4e30: 36 29 3b 0a 20 20 20 20 63 61 73 65 20 31 3a 20  6);.    case 1: 
4e40: 20 20 73 75 6d 33 20 2b 3d 20 28 7a 5b 30 5d 20    sum3 += (z[0] 
4e50: 3c 3c 20 32 34 29 3b 0a 20 20 20 20 64 65 66 61  << 24);.    defa
4e60: 75 6c 74 3a 20 20 3b 0a 20 20 7d 0a 20 20 72 65  ult:  ;.  }.  re
4e70: 74 75 72 6e 20 73 75 6d 33 3b 0a 7d 0a 23 65 6e  turn sum3;.}.#en
4e80: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 6c 79  dif../*.** Apply
4e90: 20 61 20 64 65 6c 74 61 2e 0a 2a 2a 0a 2a 2a 20   a delta..**.** 
4ea0: 54 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65  The output buffe
4eb0: 72 20 73 68 6f 75 6c 64 20 62 65 20 62 69 67 20  r should be big 
4ec0: 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74  enough to hold t
4ed0: 68 65 20 77 68 6f 6c 65 20 6f 75 74 70 75 74 0a  he whole output.
4ee0: 2a 2a 20 66 69 6c 65 20 61 6e 64 20 61 20 4e 55  ** file and a NU
4ef0: 4c 20 74 65 72 6d 69 6e 61 74 6f 72 20 61 74 20  L terminator at 
4f00: 74 68 65 20 65 6e 64 2e 20 20 54 68 65 20 64 65  the end.  The de
4f10: 6c 74 61 5f 6f 75 74 70 75 74 5f 73 69 7a 65 28  lta_output_size(
4f20: 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69 6c  ).** routine wil
4f30: 6c 20 64 65 74 65 72 6d 69 6e 65 20 74 68 69 73  l determine this
4f40: 20 73 69 7a 65 20 66 6f 72 20 79 6f 75 2e 0a 2a   size for you..*
4f50: 2a 0a 2a 2a 20 54 68 65 20 64 65 6c 74 61 20 73  *.** The delta s
4f60: 74 72 69 6e 67 20 73 68 6f 75 6c 64 20 62 65 20  tring should be 
4f70: 6e 75 6c 6c 2d 74 65 72 6d 69 6e 61 74 65 64 2e  null-terminated.
4f80: 20 20 42 75 74 20 74 68 65 20 64 65 6c 74 61 20    But the delta 
4f90: 73 74 72 69 6e 67 0a 2a 2a 20 6d 61 79 20 63 6f  string.** may co
4fa0: 6e 74 61 69 6e 20 65 6d 62 65 64 64 65 64 20 4e  ntain embedded N
4fb0: 55 4c 20 63 68 61 72 61 63 74 65 72 73 20 28 69  UL characters (i
4fc0: 66 20 74 68 65 20 69 6e 70 75 74 20 61 6e 64 20  f the input and 
4fd0: 6f 75 74 70 75 74 20 61 72 65 0a 2a 2a 20 62 69  output are.** bi
4fe0: 6e 61 72 79 20 66 69 6c 65 73 29 20 73 6f 20 77  nary files) so w
4ff0: 65 20 61 6c 73 6f 20 68 61 76 65 20 74 6f 20 70  e also have to p
5000: 61 73 73 20 69 6e 20 74 68 65 20 6c 65 6e 67 74  ass in the lengt
5010: 68 20 6f 66 20 74 68 65 20 64 65 6c 74 61 20 69  h of the delta i
5020: 6e 0a 2a 2a 20 74 68 65 20 6c 65 6e 44 65 6c 74  n.** the lenDelt
5030: 61 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a  a parameter..**.
5040: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
5050: 20 72 65 74 75 72 6e 73 20 74 68 65 20 73 69 7a   returns the siz
5060: 65 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74 20  e of the output 
5070: 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 28 65  file in bytes (e
5080: 78 63 6c 75 64 69 6e 67 0a 2a 2a 20 74 68 65 20  xcluding.** the 
5090: 66 69 6e 61 6c 20 4e 55 4c 20 74 65 72 6d 69 6e  final NUL termin
50a0: 61 74 6f 72 20 63 68 61 72 61 63 74 65 72 29 2e  ator character).
50b0: 20 20 45 78 63 65 70 74 2c 20 69 66 20 74 68 65    Except, if the
50c0: 20 64 65 6c 74 61 20 73 74 72 69 6e 67 20 69 73   delta string is
50d0: 0a 2a 2a 20 6d 61 6c 66 6f 72 6d 65 64 20 6f 72  .** malformed or
50e0: 20 69 6e 74 65 6e 64 65 64 20 66 6f 72 20 75 73   intended for us
50f0: 65 20 77 69 74 68 20 61 20 73 6f 75 72 63 65 20  e with a source 
5100: 66 69 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20  file other than 
5110: 7a 53 72 63 2c 0a 2a 2a 20 74 68 65 6e 20 74 68  zSrc,.** then th
5120: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
5130: 6e 73 20 2d 31 2e 0a 2a 2a 0a 2a 2a 20 52 65 66  ns -1..**.** Ref
5140: 65 72 20 74 6f 20 74 68 65 20 64 65 6c 74 61 5f  er to the delta_
5150: 63 72 65 61 74 65 28 29 20 64 6f 63 75 6d 65 6e  create() documen
5160: 74 61 74 69 6f 6e 20 61 62 6f 76 65 20 66 6f 72  tation above for
5170: 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e 0a 2a   a description.*
5180: 2a 20 6f 66 20 74 68 65 20 64 65 6c 74 61 20 66  * of the delta f
5190: 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 2a 2f 0a 73  ile format..*/.s
51a0: 74 61 74 69 63 20 69 6e 74 20 72 62 75 44 65 6c  tatic int rbuDel
51b0: 74 61 41 70 70 6c 79 28 0a 20 20 63 6f 6e 73 74  taApply(.  const
51c0: 20 63 68 61 72 20 2a 7a 53 72 63 2c 20 20 20 20   char *zSrc,    
51d0: 20 20 2f 2a 20 54 68 65 20 73 6f 75 72 63 65 20    /* The source 
51e0: 6f 72 20 70 61 74 74 65 72 6e 20 66 69 6c 65 20  or pattern file 
51f0: 2a 2f 0a 20 20 69 6e 74 20 6c 65 6e 53 72 63 2c  */.  int lenSrc,
5200: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
5210: 65 6e 67 74 68 20 6f 66 20 74 68 65 20 73 6f 75  ength of the sou
5220: 72 63 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63 6f  rce file */.  co
5230: 6e 73 74 20 63 68 61 72 20 2a 7a 44 65 6c 74 61  nst char *zDelta
5240: 2c 20 20 20 20 2f 2a 20 44 65 6c 74 61 20 74 6f  ,    /* Delta to
5250: 20 61 70 70 6c 79 20 74 6f 20 74 68 65 20 70 61   apply to the pa
5260: 74 74 65 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 6c  ttern */.  int l
5270: 65 6e 44 65 6c 74 61 2c 20 20 20 20 20 20 20 20  enDelta,        
5280: 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74    /* Length of t
5290: 68 65 20 64 65 6c 74 61 20 2a 2f 0a 20 20 63 68  he delta */.  ch
52a0: 61 72 20 2a 7a 4f 75 74 20 20 20 20 20 20 20 20  ar *zOut        
52b0: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
52c0: 65 20 6f 75 74 70 75 74 20 69 6e 74 6f 20 74 68  e output into th
52d0: 69 73 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20  is preallocated 
52e0: 62 75 66 66 65 72 20 2a 2f 0a 29 7b 0a 20 20 75  buffer */.){.  u
52f0: 6e 73 69 67 6e 65 64 20 69 6e 74 20 6c 69 6d 69  nsigned int limi
5300: 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  t;.  unsigned in
5310: 74 20 74 6f 74 61 6c 20 3d 20 30 3b 0a 23 69 66  t total = 0;.#if
5320: 20 52 42 55 5f 45 4e 41 42 4c 45 5f 44 45 4c 54   RBU_ENABLE_DELT
5330: 41 5f 43 4b 53 55 4d 0a 20 20 63 68 61 72 20 2a  A_CKSUM.  char *
5340: 7a 4f 72 69 67 4f 75 74 20 3d 20 7a 4f 75 74 3b  zOrigOut = zOut;
5350: 0a 23 65 6e 64 69 66 0a 0a 20 20 6c 69 6d 69 74  .#endif..  limit
5360: 20 3d 20 72 62 75 44 65 6c 74 61 47 65 74 49 6e   = rbuDeltaGetIn
5370: 74 28 26 7a 44 65 6c 74 61 2c 20 26 6c 65 6e 44  t(&zDelta, &lenD
5380: 65 6c 74 61 29 3b 0a 20 20 69 66 28 20 2a 7a 44  elta);.  if( *zD
5390: 65 6c 74 61 21 3d 27 5c 6e 27 20 29 7b 0a 20 20  elta!='\n' ){.  
53a0: 20 20 2f 2a 20 45 52 52 4f 52 3a 20 73 69 7a 65    /* ERROR: size
53b0: 20 69 6e 74 65 67 65 72 20 6e 6f 74 20 74 65 72   integer not ter
53c0: 6d 69 6e 61 74 65 64 20 62 79 20 22 5c 6e 22 20  minated by "\n" 
53d0: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31  */.    return -1
53e0: 3b 0a 20 20 7d 0a 20 20 7a 44 65 6c 74 61 2b 2b  ;.  }.  zDelta++
53f0: 3b 20 6c 65 6e 44 65 6c 74 61 2d 2d 3b 0a 20 20  ; lenDelta--;.  
5400: 77 68 69 6c 65 28 20 2a 7a 44 65 6c 74 61 20 26  while( *zDelta &
5410: 26 20 6c 65 6e 44 65 6c 74 61 3e 30 20 29 7b 0a  & lenDelta>0 ){.
5420: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74      unsigned int
5430: 20 63 6e 74 2c 20 6f 66 73 74 3b 0a 20 20 20 20   cnt, ofst;.    
5440: 63 6e 74 20 3d 20 72 62 75 44 65 6c 74 61 47 65  cnt = rbuDeltaGe
5450: 74 49 6e 74 28 26 7a 44 65 6c 74 61 2c 20 26 6c  tInt(&zDelta, &l
5460: 65 6e 44 65 6c 74 61 29 3b 0a 20 20 20 20 73 77  enDelta);.    sw
5470: 69 74 63 68 28 20 7a 44 65 6c 74 61 5b 30 5d 20  itch( zDelta[0] 
5480: 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 27 40  ){.      case '@
5490: 27 3a 20 7b 0a 20 20 20 20 20 20 20 20 7a 44 65  ': {.        zDe
54a0: 6c 74 61 2b 2b 3b 20 6c 65 6e 44 65 6c 74 61 2d  lta++; lenDelta-
54b0: 2d 3b 0a 20 20 20 20 20 20 20 20 6f 66 73 74 20  -;.        ofst 
54c0: 3d 20 72 62 75 44 65 6c 74 61 47 65 74 49 6e 74  = rbuDeltaGetInt
54d0: 28 26 7a 44 65 6c 74 61 2c 20 26 6c 65 6e 44 65  (&zDelta, &lenDe
54e0: 6c 74 61 29 3b 0a 20 20 20 20 20 20 20 20 69 66  lta);.        if
54f0: 28 20 6c 65 6e 44 65 6c 74 61 3e 30 20 26 26 20  ( lenDelta>0 && 
5500: 7a 44 65 6c 74 61 5b 30 5d 21 3d 27 2c 27 20 29  zDelta[0]!=',' )
5510: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45  {.          /* E
5520: 52 52 4f 52 3a 20 63 6f 70 79 20 63 6f 6d 6d 61  RROR: copy comma
5530: 6e 64 20 6e 6f 74 20 74 65 72 6d 69 6e 61 74 65  nd not terminate
5540: 64 20 62 79 20 27 2c 27 20 2a 2f 0a 20 20 20 20  d by ',' */.    
5550: 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b        return -1;
5560: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5570: 20 20 20 7a 44 65 6c 74 61 2b 2b 3b 20 6c 65 6e     zDelta++; len
5580: 44 65 6c 74 61 2d 2d 3b 0a 20 20 20 20 20 20 20  Delta--;.       
5590: 20 74 6f 74 61 6c 20 2b 3d 20 63 6e 74 3b 0a 20   total += cnt;. 
55a0: 20 20 20 20 20 20 20 69 66 28 20 74 6f 74 61 6c         if( total
55b0: 3e 6c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  >limit ){.      
55c0: 20 20 20 20 2f 2a 20 45 52 52 4f 52 3a 20 63 6f      /* ERROR: co
55d0: 70 79 20 65 78 63 65 65 64 73 20 6f 75 74 70 75  py exceeds outpu
55e0: 74 20 66 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20  t file size */. 
55f0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
5600: 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  -1;.        }.  
5610: 20 20 20 20 20 20 69 66 28 20 28 69 6e 74 29 28        if( (int)(
5620: 6f 66 73 74 2b 63 6e 74 29 20 3e 20 6c 65 6e 53  ofst+cnt) > lenS
5630: 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
5640: 2f 2a 20 45 52 52 4f 52 3a 20 63 6f 70 79 20 65  /* ERROR: copy e
5650: 78 74 65 6e 64 73 20 70 61 73 74 20 65 6e 64 20  xtends past end 
5660: 6f 66 20 69 6e 70 75 74 20 2a 2f 0a 20 20 20 20  of input */.    
5670: 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b        return -1;
5680: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5690: 20 20 20 6d 65 6d 63 70 79 28 7a 4f 75 74 2c 20     memcpy(zOut, 
56a0: 26 7a 53 72 63 5b 6f 66 73 74 5d 2c 20 63 6e 74  &zSrc[ofst], cnt
56b0: 29 3b 0a 20 20 20 20 20 20 20 20 7a 4f 75 74 20  );.        zOut 
56c0: 2b 3d 20 63 6e 74 3b 0a 20 20 20 20 20 20 20 20  += cnt;.        
56d0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
56e0: 20 20 20 20 20 63 61 73 65 20 27 3a 27 3a 20 7b       case ':': {
56f0: 0a 20 20 20 20 20 20 20 20 7a 44 65 6c 74 61 2b  .        zDelta+
5700: 2b 3b 20 6c 65 6e 44 65 6c 74 61 2d 2d 3b 0a 20  +; lenDelta--;. 
5710: 20 20 20 20 20 20 20 74 6f 74 61 6c 20 2b 3d 20         total += 
5720: 63 6e 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28  cnt;.        if(
5730: 20 74 6f 74 61 6c 3e 6c 69 6d 69 74 20 29 7b 0a   total>limit ){.
5740: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 52 52            /* ERR
5750: 4f 52 3a 20 20 69 6e 73 65 72 74 20 63 6f 6d 6d  OR:  insert comm
5760: 61 6e 64 20 67 69 76 65 73 20 61 6e 20 6f 75 74  and gives an out
5770: 70 75 74 20 6c 61 72 67 65 72 20 74 68 61 6e 20  put larger than 
5780: 70 72 65 64 69 63 74 65 64 20 2a 2f 0a 20 20 20  predicted */.   
5790: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31         return -1
57a0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
57b0: 20 20 20 20 69 66 28 20 28 69 6e 74 29 63 6e 74      if( (int)cnt
57c0: 3e 6c 65 6e 44 65 6c 74 61 20 29 7b 0a 20 20 20  >lenDelta ){.   
57d0: 20 20 20 20 20 20 20 2f 2a 20 45 52 52 4f 52 3a         /* ERROR:
57e0: 20 69 6e 73 65 72 74 20 63 6f 75 6e 74 20 65 78   insert count ex
57f0: 63 65 65 64 73 20 73 69 7a 65 20 6f 66 20 64 65  ceeds size of de
5800: 6c 74 61 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  lta */.         
5810: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
5820: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6d 65      }.        me
5830: 6d 63 70 79 28 7a 4f 75 74 2c 20 7a 44 65 6c 74  mcpy(zOut, zDelt
5840: 61 2c 20 63 6e 74 29 3b 0a 20 20 20 20 20 20 20  a, cnt);.       
5850: 20 7a 4f 75 74 20 2b 3d 20 63 6e 74 3b 0a 20 20   zOut += cnt;.  
5860: 20 20 20 20 20 20 7a 44 65 6c 74 61 20 2b 3d 20        zDelta += 
5870: 63 6e 74 3b 0a 20 20 20 20 20 20 20 20 6c 65 6e  cnt;.        len
5880: 44 65 6c 74 61 20 2d 3d 20 63 6e 74 3b 0a 20 20  Delta -= cnt;.  
5890: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
58a0: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
58b0: 27 3b 27 3a 20 7b 0a 20 20 20 20 20 20 20 20 7a  ';': {.        z
58c0: 44 65 6c 74 61 2b 2b 3b 20 6c 65 6e 44 65 6c 74  Delta++; lenDelt
58d0: 61 2d 2d 3b 0a 20 20 20 20 20 20 20 20 7a 4f 75  a--;.        zOu
58e0: 74 5b 30 5d 20 3d 20 30 3b 0a 23 69 66 20 52 42  t[0] = 0;.#if RB
58f0: 55 5f 45 4e 41 42 4c 45 5f 44 45 4c 54 41 5f 43  U_ENABLE_DELTA_C
5900: 4b 53 55 4d 0a 20 20 20 20 20 20 20 20 69 66 28  KSUM.        if(
5910: 20 63 6e 74 21 3d 72 62 75 44 65 6c 74 61 43 68   cnt!=rbuDeltaCh
5920: 65 63 6b 73 75 6d 28 7a 4f 72 69 67 4f 75 74 2c  ecksum(zOrigOut,
5930: 20 74 6f 74 61 6c 29 20 29 7b 0a 20 20 20 20 20   total) ){.     
5940: 20 20 20 20 20 2f 2a 20 45 52 52 4f 52 3a 20 20       /* ERROR:  
5950: 62 61 64 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a  bad checksum */.
5960: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
5970: 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23   -1;.        }.#
5980: 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 69 66  endif.        if
5990: 28 20 74 6f 74 61 6c 21 3d 6c 69 6d 69 74 20 29  ( total!=limit )
59a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45  {.          /* E
59b0: 52 52 4f 52 3a 20 67 65 6e 65 72 61 74 65 64 20  RROR: generated 
59c0: 73 69 7a 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61  size does not ma
59d0: 74 63 68 20 70 72 65 64 69 63 74 65 64 20 73 69  tch predicted si
59e0: 7a 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ze */.          
59f0: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20  return -1;.     
5a00: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 74     }.        ret
5a10: 75 72 6e 20 74 6f 74 61 6c 3b 0a 20 20 20 20 20  urn total;.     
5a20: 20 7d 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74   }.      default
5a30: 3a 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45  : {.        /* E
5a40: 52 52 4f 52 3a 20 75 6e 6b 6e 6f 77 6e 20 64 65  RROR: unknown de
5a50: 6c 74 61 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  lta operator */.
5a60: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d          return -
5a70: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
5a80: 0a 20 20 7d 0a 20 20 2f 2a 20 45 52 52 4f 52 3a  .  }.  /* ERROR:
5a90: 20 75 6e 74 65 72 6d 69 6e 61 74 65 64 20 64 65   unterminated de
5aa0: 6c 74 61 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  lta */.  return 
5ab0: 2d 31 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  -1;.}..static in
5ac0: 74 20 72 62 75 44 65 6c 74 61 4f 75 74 70 75 74  t rbuDeltaOutput
5ad0: 53 69 7a 65 28 63 6f 6e 73 74 20 63 68 61 72 20  Size(const char 
5ae0: 2a 7a 44 65 6c 74 61 2c 20 69 6e 74 20 6c 65 6e  *zDelta, int len
5af0: 44 65 6c 74 61 29 7b 0a 20 20 69 6e 74 20 73 69  Delta){.  int si
5b00: 7a 65 3b 0a 20 20 73 69 7a 65 20 3d 20 72 62 75  ze;.  size = rbu
5b10: 44 65 6c 74 61 47 65 74 49 6e 74 28 26 7a 44 65  DeltaGetInt(&zDe
5b20: 6c 74 61 2c 20 26 6c 65 6e 44 65 6c 74 61 29 3b  lta, &lenDelta);
5b30: 0a 20 20 69 66 28 20 2a 7a 44 65 6c 74 61 21 3d  .  if( *zDelta!=
5b40: 27 5c 6e 27 20 29 7b 0a 20 20 20 20 2f 2a 20 45  '\n' ){.    /* E
5b50: 52 52 4f 52 3a 20 73 69 7a 65 20 69 6e 74 65 67  RROR: size integ
5b60: 65 72 20 6e 6f 74 20 74 65 72 6d 69 6e 61 74 65  er not terminate
5b70: 64 20 62 79 20 22 5c 6e 22 20 2a 2f 0a 20 20 20  d by "\n" */.   
5b80: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a   return -1;.  }.
5b90: 20 20 72 65 74 75 72 6e 20 73 69 7a 65 3b 0a 7d    return size;.}
5ba0: 0a 0a 2f 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20 63  ../*.** End of c
5bb0: 6f 64 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 66  ode taken from f
5bc0: 6f 73 73 69 6c 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ossil..*********
5bd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5be0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5bf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5c00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5c10: 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  /../*.** Impleme
5c20: 6e 74 61 74 69 6f 6e 20 6f 66 20 53 51 4c 20 73  ntation of SQL s
5c30: 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20 72  calar function r
5c40: 62 75 5f 66 6f 73 73 69 6c 5f 64 65 6c 74 61 28  bu_fossil_delta(
5c50: 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  )..**.** This fu
5c60: 6e 63 74 69 6f 6e 20 61 70 70 6c 69 65 73 20 61  nction applies a
5c70: 20 66 6f 73 73 69 6c 20 64 65 6c 74 61 20 70 61   fossil delta pa
5c80: 74 63 68 20 74 6f 20 61 20 62 6c 6f 62 2e 20 45  tch to a blob. E
5c90: 78 61 63 74 6c 79 20 74 77 6f 0a 2a 2a 20 61 72  xactly two.** ar
5ca0: 67 75 6d 65 6e 74 73 20 6d 75 73 74 20 62 65 20  guments must be 
5cb0: 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66  passed to this f
5cc0: 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20 66 69 72  unction. The fir
5cd0: 73 74 20 69 73 20 74 68 65 20 62 6c 6f 62 20 74  st is the blob t
5ce0: 6f 0a 2a 2a 20 70 61 74 63 68 20 61 6e 64 20 74  o.** patch and t
5cf0: 68 65 20 73 65 63 6f 6e 64 20 74 68 65 20 70 61  he second the pa
5d00: 74 63 68 20 74 6f 20 61 70 70 6c 79 2e 20 49 66  tch to apply. If
5d10: 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
5d20: 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  , this.** functi
5d30: 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 70  on returns the p
5d40: 61 74 63 68 65 64 20 62 6c 6f 62 2e 0a 2a 2f 0a  atched blob..*/.
5d50: 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75 46  static void rbuF
5d60: 6f 73 73 69 6c 44 65 6c 74 61 46 75 6e 63 28 0a  ossilDeltaFunc(.
5d70: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
5d80: 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e  t *context,.  in
5d90: 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65  t argc,.  sqlite
5da0: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
5db0: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
5dc0: 61 44 65 6c 74 61 3b 0a 20 20 69 6e 74 20 6e 44  aDelta;.  int nD
5dd0: 65 6c 74 61 3b 0a 20 20 63 6f 6e 73 74 20 63 68  elta;.  const ch
5de0: 61 72 20 2a 61 4f 72 69 67 3b 0a 20 20 69 6e 74  ar *aOrig;.  int
5df0: 20 6e 4f 72 69 67 3b 0a 0a 20 20 69 6e 74 20 6e   nOrig;..  int n
5e00: 4f 75 74 3b 0a 20 20 69 6e 74 20 6e 4f 75 74 32  Out;.  int nOut2
5e10: 3b 0a 20 20 63 68 61 72 20 2a 61 4f 75 74 3b 0a  ;.  char *aOut;.
5e20: 0a 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3d  .  assert( argc=
5e30: 3d 32 20 29 3b 0a 0a 20 20 6e 4f 72 69 67 20 3d  =2 );..  nOrig =
5e40: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
5e50: 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20  ytes(argv[0]);. 
5e60: 20 61 4f 72 69 67 20 3d 20 28 63 6f 6e 73 74 20   aOrig = (const 
5e70: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
5e80: 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30 5d  lue_blob(argv[0]
5e90: 29 3b 0a 20 20 6e 44 65 6c 74 61 20 3d 20 73 71  );.  nDelta = sq
5ea0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
5eb0: 73 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 61 44  s(argv[1]);.  aD
5ec0: 65 6c 74 61 20 3d 20 28 63 6f 6e 73 74 20 63 68  elta = (const ch
5ed0: 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
5ee0: 65 5f 62 6c 6f 62 28 61 72 67 76 5b 31 5d 29 3b  e_blob(argv[1]);
5ef0: 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
5f00: 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  t the size of th
5f10: 65 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 6e 4f  e output */.  nO
5f20: 75 74 20 3d 20 72 62 75 44 65 6c 74 61 4f 75 74  ut = rbuDeltaOut
5f30: 70 75 74 53 69 7a 65 28 61 44 65 6c 74 61 2c 20  putSize(aDelta, 
5f40: 6e 44 65 6c 74 61 29 3b 0a 20 20 69 66 28 20 6e  nDelta);.  if( n
5f50: 4f 75 74 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c  Out<0 ){.    sql
5f60: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
5f70: 72 28 63 6f 6e 74 65 78 74 2c 20 22 63 6f 72 72  r(context, "corr
5f80: 75 70 74 20 66 6f 73 73 69 6c 20 64 65 6c 74 61  upt fossil delta
5f90: 22 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65 74 75  ", -1);.    retu
5fa0: 72 6e 3b 0a 20 20 7d 0a 0a 20 20 61 4f 75 74 20  rn;.  }..  aOut 
5fb0: 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
5fc0: 28 6e 4f 75 74 2b 31 29 3b 0a 20 20 69 66 28 20  (nOut+1);.  if( 
5fd0: 61 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73  aOut==0 ){.    s
5fe0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
5ff0: 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78  ror_nomem(contex
6000: 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t);.  }else{.   
6010: 20 6e 4f 75 74 32 20 3d 20 72 62 75 44 65 6c 74   nOut2 = rbuDelt
6020: 61 41 70 70 6c 79 28 61 4f 72 69 67 2c 20 6e 4f  aApply(aOrig, nO
6030: 72 69 67 2c 20 61 44 65 6c 74 61 2c 20 6e 44 65  rig, aDelta, nDe
6040: 6c 74 61 2c 20 61 4f 75 74 29 3b 0a 20 20 20 20  lta, aOut);.    
6050: 69 66 28 20 6e 4f 75 74 32 21 3d 6e 4f 75 74 20  if( nOut2!=nOut 
6060: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
6070: 5f 66 72 65 65 28 61 4f 75 74 29 3b 0a 20 20 20  _free(aOut);.   
6080: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
6090: 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c  t_error(context,
60a0: 20 22 63 6f 72 72 75 70 74 20 66 6f 73 73 69 6c   "corrupt fossil
60b0: 20 64 65 6c 74 61 22 2c 20 2d 31 29 3b 0a 20 20   delta", -1);.  
60c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
60d0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c  qlite3_result_bl
60e0: 6f 62 28 63 6f 6e 74 65 78 74 2c 20 61 4f 75 74  ob(context, aOut
60f0: 2c 20 6e 4f 75 74 2c 20 73 71 6c 69 74 65 33 5f  , nOut, sqlite3_
6100: 66 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  free);.    }.  }
6110: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61  .}.../*.** Prepa
6120: 72 65 20 74 68 65 20 53 51 4c 20 73 74 61 74 65  re the SQL state
6130: 6d 65 6e 74 20 69 6e 20 62 75 66 66 65 72 20 7a  ment in buffer z
6140: 53 71 6c 20 61 67 61 69 6e 73 74 20 64 61 74 61  Sql against data
6150: 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a  base handle db..
6160: 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
6170: 2c 20 73 65 74 20 2a 70 70 53 74 6d 74 20 74 6f  , set *ppStmt to
6180: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65   point to the ne
6190: 77 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20  w statement and 
61a0: 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45  return.** SQLITE
61b0: 5f 4f 4b 2e 20 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  _OK. .**.** Othe
61c0: 72 77 69 73 65 2c 20 69 66 20 61 6e 20 65 72 72  rwise, if an err
61d0: 6f 72 20 64 6f 65 73 20 6f 63 63 75 72 2c 20 73  or does occur, s
61e0: 65 74 20 2a 70 70 53 74 6d 74 20 74 6f 20 4e 55  et *ppStmt to NU
61f0: 4c 4c 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a  LL and return.**
6200: 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
6210: 20 63 6f 64 65 2e 20 41 64 64 69 74 69 6f 6e 61   code. Additiona
6220: 6c 6c 79 2c 20 73 65 74 20 6f 75 74 70 75 74 20  lly, set output 
6230: 76 61 72 69 61 62 6c 65 20 2a 70 7a 45 72 72 6d  variable *pzErrm
6240: 73 67 20 74 6f 0a 2a 2a 20 70 6f 69 6e 74 20 74  sg to.** point t
6250: 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61  o a buffer conta
6260: 69 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 6d  ining an error m
6270: 65 73 73 61 67 65 2e 20 49 74 20 69 73 20 74 68  essage. It is th
6280: 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
6290: 0a 2a 2a 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  .** of the calle
62a0: 72 20 74 6f 20 28 65 76 65 6e 74 75 61 6c 6c 79  r to (eventually
62b0: 29 20 66 72 65 65 20 74 68 69 73 20 62 75 66 66  ) free this buff
62c0: 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  er using sqlite3
62d0: 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  _free()..*/.stat
62e0: 69 63 20 69 6e 74 20 70 72 65 70 61 72 65 41 6e  ic int prepareAn
62f0: 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 0a 20  dCollectError(. 
6300: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20   sqlite3 *db, . 
6310: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a   sqlite3_stmt **
6320: 70 70 53 74 6d 74 2c 0a 20 20 63 68 61 72 20 2a  ppStmt,.  char *
6330: 2a 70 7a 45 72 72 6d 73 67 2c 0a 20 20 63 6f 6e  *pzErrmsg,.  con
6340: 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 0a 29 7b  st char *zSql.){
6350: 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69  .  int rc = sqli
6360: 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64  te3_prepare_v2(d
6370: 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 70 70 53  b, zSql, -1, ppS
6380: 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  tmt, 0);.  if( r
6390: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
63a0: 20 20 20 20 2a 70 7a 45 72 72 6d 73 67 20 3d 20      *pzErrmsg = 
63b0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
63c0: 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 65 72  "%s", sqlite3_er
63d0: 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 20 20 2a  rmsg(db));.    *
63e0: 70 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a  ppStmt = 0;.  }.
63f0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
6400: 2f 2a 0a 2a 2a 20 52 65 73 65 74 20 74 68 65 20  /*.** Reset the 
6410: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 70 61  SQL statement pa
6420: 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
6430: 74 20 61 72 67 75 6d 65 6e 74 2e 20 52 65 74 75  t argument. Retu
6440: 72 6e 20 61 20 63 6f 70 79 0a 2a 2a 20 6f 66 20  rn a copy.** of 
6450: 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
6460: 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f 72 65  ed by sqlite3_re
6470: 73 65 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  set()..**.** If 
6480: 61 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63  an error has occ
6490: 75 72 72 65 64 2c 20 74 68 65 6e 20 73 65 74 20  urred, then set 
64a0: 2a 70 7a 45 72 72 6d 73 67 20 74 6f 20 70 6f 69  *pzErrmsg to poi
64b0: 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 0a 2a  nt to a buffer.*
64c0: 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6e 20  * containing an 
64d0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 20 49  error message. I
64e0: 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73  t is the respons
64f0: 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
6500: 61 6c 6c 65 72 0a 2a 2a 20 74 6f 20 65 76 65 6e  aller.** to even
6510: 74 75 61 6c 6c 79 20 66 72 65 65 20 74 68 69 73  tually free this
6520: 20 62 75 66 66 65 72 20 75 73 69 6e 67 20 73 71   buffer using sq
6530: 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f  lite3_free()..*/
6540: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 73 65  .static int rese
6550: 74 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72  tAndCollectError
6560: 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70  (sqlite3_stmt *p
6570: 53 74 6d 74 2c 20 63 68 61 72 20 2a 2a 70 7a 45  Stmt, char **pzE
6580: 72 72 6d 73 67 29 7b 0a 20 20 69 6e 74 20 72 63  rrmsg){.  int rc
6590: 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
65a0: 28 70 53 74 6d 74 29 3b 0a 20 20 69 66 28 20 72  (pStmt);.  if( r
65b0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
65c0: 20 20 20 20 2a 70 7a 45 72 72 6d 73 67 20 3d 20      *pzErrmsg = 
65d0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
65e0: 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 65 72  "%s", sqlite3_er
65f0: 72 6d 73 67 28 73 71 6c 69 74 65 33 5f 64 62 5f  rmsg(sqlite3_db_
6600: 68 61 6e 64 6c 65 28 70 53 74 6d 74 29 29 29 3b  handle(pStmt)));
6610: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
6620: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73  ;.}../*.** Unles
6630: 73 20 69 74 20 69 73 20 4e 55 4c 4c 2c 20 61 72  s it is NULL, ar
6640: 67 75 6d 65 6e 74 20 7a 53 71 6c 20 70 6f 69 6e  gument zSql poin
6650: 74 73 20 74 6f 20 61 20 62 75 66 66 65 72 20 61  ts to a buffer a
6660: 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 0a 2a  llocated using.*
6670: 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  * sqlite3_malloc
6680: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6e 20 53   containing an S
6690: 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68  QL statement. Th
66a0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 70 72 65 70  is function prep
66b0: 61 72 65 73 20 74 68 65 20 53 51 4c 0a 2a 2a 20  ares the SQL.** 
66c0: 73 74 61 74 65 6d 65 6e 74 20 61 67 61 69 6e 73  statement agains
66d0: 74 20 64 61 74 61 62 61 73 65 20 64 62 20 61 6e  t database db an
66e0: 64 20 66 72 65 65 73 20 74 68 65 20 62 75 66 66  d frees the buff
66f0: 65 72 2e 20 49 66 20 73 74 61 74 65 6d 65 6e 74  er. If statement
6700: 20 0a 2a 2a 20 63 6f 6d 70 69 6c 61 74 69 6f 6e   .** compilation
6710: 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20   is successful, 
6720: 2a 70 70 53 74 6d 74 20 69 73 20 73 65 74 20 74  *ppStmt is set t
6730: 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e  o point to the n
6740: 65 77 20 73 74 61 74 65 6d 65 6e 74 20 0a 2a 2a  ew statement .**
6750: 20 68 61 6e 64 6c 65 20 61 6e 64 20 53 51 4c 49   handle and SQLI
6760: 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
6770: 64 2e 20 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  d. .**.** Otherw
6780: 69 73 65 2c 20 69 66 20 61 6e 20 65 72 72 6f 72  ise, if an error
6790: 20 6f 63 63 75 72 73 2c 20 2a 70 70 53 74 6d 74   occurs, *ppStmt
67a0: 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20   is set to NULL 
67b0: 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  and an error cod
67c0: 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20 49  e.** returned. I
67d0: 6e 20 74 68 69 73 20 63 61 73 65 2c 20 2a 70 7a  n this case, *pz
67e0: 45 72 72 6d 73 67 20 6d 61 79 20 61 6c 73 6f 20  Errmsg may also 
67f0: 62 65 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  be set to point 
6800: 74 6f 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 6d  to an error.** m
6810: 65 73 73 61 67 65 2e 20 49 74 20 69 73 20 74 68  essage. It is th
6820: 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
6830: 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74   of the caller t
6840: 6f 20 66 72 65 65 20 74 68 69 73 20 65 72 72 6f  o free this erro
6850: 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 62 75 66  r message.** buf
6860: 66 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65  fer using sqlite
6870: 33 5f 66 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  3_free()..**.** 
6880: 49 66 20 61 72 67 75 6d 65 6e 74 20 7a 53 71 6c  If argument zSql
6890: 20 69 73 20 4e 55 4c 4c 2c 20 74 68 69 73 20 66   is NULL, this f
68a0: 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20  unction assumes 
68b0: 74 68 61 74 20 61 6e 20 4f 4f 4d 20 68 61 73 20  that an OOM has 
68c0: 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 20 49 6e 20  occurred..** In 
68d0: 74 68 69 73 20 63 61 73 65 20 53 51 4c 49 54 45  this case SQLITE
68e0: 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e  _NOMEM is return
68f0: 65 64 20 61 6e 64 20 2a 70 70 53 74 6d 74 20 73  ed and *ppStmt s
6900: 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73  et to NULL..*/.s
6910: 74 61 74 69 63 20 69 6e 74 20 70 72 65 70 61 72  tatic int prepar
6920: 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45  eFreeAndCollectE
6930: 72 72 6f 72 28 0a 20 20 73 71 6c 69 74 65 33 20  rror(.  sqlite3 
6940: 2a 64 62 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f  *db, .  sqlite3_
6950: 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 2c 0a 20  stmt **ppStmt,. 
6960: 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 6d 73 67   char **pzErrmsg
6970: 2c 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 0a 29  ,.  char *zSql.)
6980: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73  {.  int rc;.  as
6990: 73 65 72 74 28 20 2a 70 7a 45 72 72 6d 73 67 3d  sert( *pzErrmsg=
69a0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c  =0 );.  if( zSql
69b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
69c0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
69d0: 20 20 2a 70 70 53 74 6d 74 20 3d 20 30 3b 0a 20    *ppStmt = 0;. 
69e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
69f0: 20 70 72 65 70 61 72 65 41 6e 64 43 6f 6c 6c 65   prepareAndColle
6a00: 63 74 45 72 72 6f 72 28 64 62 2c 20 70 70 53 74  ctError(db, ppSt
6a10: 6d 74 2c 20 70 7a 45 72 72 6d 73 67 2c 20 7a 53  mt, pzErrmsg, zS
6a20: 71 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ql);.    sqlite3
6a30: 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 7d  _free(zSql);.  }
6a40: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
6a50: 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20  ./*.** Free the 
6a60: 52 62 75 4f 62 6a 49 74 65 72 2e 61 7a 54 62 6c  RbuObjIter.azTbl
6a70: 43 6f 6c 5b 5d 20 61 6e 64 20 52 62 75 4f 62 6a  Col[] and RbuObj
6a80: 49 74 65 72 2e 61 62 54 62 6c 50 6b 5b 5d 20 61  Iter.abTblPk[] a
6a90: 72 72 61 79 73 20 61 6c 6c 6f 63 61 74 65 64 0a  rrays allocated.
6aa0: 2a 2a 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72  ** by an earlier
6ab0: 20 63 61 6c 6c 20 74 6f 20 72 62 75 4f 62 6a 49   call to rbuObjI
6ac0: 74 65 72 43 61 63 68 65 54 61 62 6c 65 49 6e 66  terCacheTableInf
6ad0: 6f 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  o()..*/.static v
6ae0: 6f 69 64 20 72 62 75 4f 62 6a 49 74 65 72 46 72  oid rbuObjIterFr
6af0: 65 65 43 6f 6c 73 28 52 62 75 4f 62 6a 49 74 65  eeCols(RbuObjIte
6b00: 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e 74  r *pIter){.  int
6b10: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
6b20: 3c 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 3b  <pIter->nTblCol;
6b30: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
6b40: 65 33 5f 66 72 65 65 28 70 49 74 65 72 2d 3e 61  e3_free(pIter->a
6b50: 7a 54 62 6c 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20  zTblCol[i]);.   
6b60: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49   sqlite3_free(pI
6b70: 74 65 72 2d 3e 61 7a 54 62 6c 54 79 70 65 5b 69  ter->azTblType[i
6b80: 5d 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ]);.  }.  sqlite
6b90: 33 5f 66 72 65 65 28 70 49 74 65 72 2d 3e 61 7a  3_free(pIter->az
6ba0: 54 62 6c 43 6f 6c 29 3b 0a 20 20 70 49 74 65 72  TblCol);.  pIter
6bb0: 2d 3e 61 7a 54 62 6c 43 6f 6c 20 3d 20 30 3b 0a  ->azTblCol = 0;.
6bc0: 20 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 54 79    pIter->azTblTy
6bd0: 70 65 20 3d 20 30 3b 0a 20 20 70 49 74 65 72 2d  pe = 0;.  pIter-
6be0: 3e 61 69 53 72 63 4f 72 64 65 72 20 3d 20 30 3b  >aiSrcOrder = 0;
6bf0: 0a 20 20 70 49 74 65 72 2d 3e 61 62 54 62 6c 50  .  pIter->abTblP
6c00: 6b 20 3d 20 30 3b 0a 20 20 70 49 74 65 72 2d 3e  k = 0;.  pIter->
6c10: 61 62 4e 6f 74 4e 75 6c 6c 20 3d 20 30 3b 0a 20  abNotNull = 0;. 
6c20: 20 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 20   pIter->nTblCol 
6c30: 3d 20 30 3b 0a 20 20 70 49 74 65 72 2d 3e 65 54  = 0;.  pIter->eT
6c40: 79 70 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ype = 0;        
6c50: 20 20 20 20 20 20 20 2f 2a 20 49 6e 76 61 6c 69         /* Invali
6c60: 64 20 76 61 6c 75 65 20 2a 2f 0a 7d 0a 0a 2f 2a  d value */.}../*
6c70: 0a 2a 2a 20 46 69 6e 61 6c 69 7a 65 20 61 6c 6c  .** Finalize all
6c80: 20 73 74 61 74 65 6d 65 6e 74 73 20 61 6e 64 20   statements and 
6c90: 66 72 65 65 20 61 6c 6c 20 61 6c 6c 6f 63 61 74  free all allocat
6ca0: 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20 73 70  ions that are sp
6cb0: 65 63 69 66 69 63 20 74 6f 0a 2a 2a 20 74 68 65  ecific to.** the
6cc0: 20 63 75 72 72 65 6e 74 20 6f 62 6a 65 63 74 20   current object 
6cd0: 28 74 61 62 6c 65 2f 69 6e 64 65 78 20 70 61 69  (table/index pai
6ce0: 72 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  r)..*/.static vo
6cf0: 69 64 20 72 62 75 4f 62 6a 49 74 65 72 43 6c 65  id rbuObjIterCle
6d00: 61 72 53 74 61 74 65 6d 65 6e 74 73 28 52 62 75  arStatements(Rbu
6d10: 4f 62 6a 49 74 65 72 20 2a 70 49 74 65 72 29 7b  ObjIter *pIter){
6d20: 0a 20 20 52 62 75 55 70 64 61 74 65 53 74 6d 74  .  RbuUpdateStmt
6d30: 20 2a 70 55 70 3b 0a 0a 20 20 73 71 6c 69 74 65   *pUp;..  sqlite
6d40: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 49 74 65 72  3_finalize(pIter
6d50: 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 73 71  ->pSelect);.  sq
6d60: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
6d70: 49 74 65 72 2d 3e 70 49 6e 73 65 72 74 29 3b 0a  Iter->pInsert);.
6d80: 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
6d90: 7a 65 28 70 49 74 65 72 2d 3e 70 44 65 6c 65 74  ze(pIter->pDelet
6da0: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  e);.  sqlite3_fi
6db0: 6e 61 6c 69 7a 65 28 70 49 74 65 72 2d 3e 70 54  nalize(pIter->pT
6dc0: 6d 70 49 6e 73 65 72 74 29 3b 0a 20 20 70 55 70  mpInsert);.  pUp
6dd0: 20 3d 20 70 49 74 65 72 2d 3e 70 52 62 75 55 70   = pIter->pRbuUp
6de0: 64 61 74 65 3b 0a 20 20 77 68 69 6c 65 28 20 70  date;.  while( p
6df0: 55 70 20 29 7b 0a 20 20 20 20 52 62 75 55 70 64  Up ){.    RbuUpd
6e00: 61 74 65 53 74 6d 74 20 2a 70 54 6d 70 20 3d 20  ateStmt *pTmp = 
6e10: 70 55 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  pUp->pNext;.    
6e20: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
6e30: 28 70 55 70 2d 3e 70 55 70 64 61 74 65 29 3b 0a  (pUp->pUpdate);.
6e40: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
6e50: 28 70 55 70 29 3b 0a 20 20 20 20 70 55 70 20 3d  (pUp);.    pUp =
6e60: 20 70 54 6d 70 3b 0a 20 20 7d 0a 20 20 0a 20 20   pTmp;.  }.  .  
6e70: 70 49 74 65 72 2d 3e 70 53 65 6c 65 63 74 20 3d  pIter->pSelect =
6e80: 20 30 3b 0a 20 20 70 49 74 65 72 2d 3e 70 49 6e   0;.  pIter->pIn
6e90: 73 65 72 74 20 3d 20 30 3b 0a 20 20 70 49 74 65  sert = 0;.  pIte
6ea0: 72 2d 3e 70 44 65 6c 65 74 65 20 3d 20 30 3b 0a  r->pDelete = 0;.
6eb0: 20 20 70 49 74 65 72 2d 3e 70 52 62 75 55 70 64    pIter->pRbuUpd
6ec0: 61 74 65 20 3d 20 30 3b 0a 20 20 70 49 74 65 72  ate = 0;.  pIter
6ed0: 2d 3e 70 54 6d 70 49 6e 73 65 72 74 20 3d 20 30  ->pTmpInsert = 0
6ee0: 3b 0a 20 20 70 49 74 65 72 2d 3e 6e 43 6f 6c 20  ;.  pIter->nCol 
6ef0: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  = 0;.}../*.** Cl
6f00: 65 61 6e 20 75 70 20 61 6e 79 20 72 65 73 6f 75  ean up any resou
6f10: 72 63 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 61  rces allocated a
6f20: 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 69 74  s part of the it
6f30: 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 70 61  erator object pa
6f40: 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 6f  ssed.** as the o
6f50: 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  nly argument..*/
6f60: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75  .static void rbu
6f70: 4f 62 6a 49 74 65 72 46 69 6e 61 6c 69 7a 65 28  ObjIterFinalize(
6f80: 52 62 75 4f 62 6a 49 74 65 72 20 2a 70 49 74 65  RbuObjIter *pIte
6f90: 72 29 7b 0a 20 20 72 62 75 4f 62 6a 49 74 65 72  r){.  rbuObjIter
6fa0: 43 6c 65 61 72 53 74 61 74 65 6d 65 6e 74 73 28  ClearStatements(
6fb0: 70 49 74 65 72 29 3b 0a 20 20 73 71 6c 69 74 65  pIter);.  sqlite
6fc0: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 49 74 65 72  3_finalize(pIter
6fd0: 2d 3e 70 54 62 6c 49 74 65 72 29 3b 0a 20 20 73  ->pTblIter);.  s
6fe0: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
6ff0: 70 49 74 65 72 2d 3e 70 49 64 78 49 74 65 72 29  pIter->pIdxIter)
7000: 3b 0a 20 20 72 62 75 4f 62 6a 49 74 65 72 46 72  ;.  rbuObjIterFr
7010: 65 65 43 6f 6c 73 28 70 49 74 65 72 29 3b 0a 20  eeCols(pIter);. 
7020: 20 6d 65 6d 73 65 74 28 70 49 74 65 72 2c 20 30   memset(pIter, 0
7030: 2c 20 73 69 7a 65 6f 66 28 52 62 75 4f 62 6a 49  , sizeof(RbuObjI
7040: 74 65 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ter));.}../*.** 
7050: 41 64 76 61 6e 63 65 20 74 68 65 20 69 74 65 72  Advance the iter
7060: 61 74 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74  ator to the next
7070: 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   position..**.**
7080: 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63   If no error occ
7090: 75 72 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  urs, SQLITE_OK i
70a0: 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74  s returned and t
70b0: 68 65 20 69 74 65 72 61 74 6f 72 20 69 73 20 6c  he iterator is l
70c0: 65 66 74 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67  eft .** pointing
70d0: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74   to the next ent
70e0: 72 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61  ry. Otherwise, a
70f0: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64  n error code and
7100: 20 6d 65 73 73 61 67 65 20 69 73 20 0a 2a 2a 20   message is .** 
7110: 6c 65 66 74 20 69 6e 20 74 68 65 20 52 42 55 20  left in the RBU 
7120: 68 61 6e 64 6c 65 20 70 61 73 73 65 64 20 61 73  handle passed as
7130: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
7140: 65 6e 74 2e 20 41 20 63 6f 70 79 20 6f 66 20 74  ent. A copy of t
7150: 68 65 20 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64  he .** error cod
7160: 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
7170: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62 75  /.static int rbu
7180: 4f 62 6a 49 74 65 72 4e 65 78 74 28 73 71 6c 69  ObjIterNext(sqli
7190: 74 65 33 72 62 75 20 2a 70 2c 20 52 62 75 4f 62  te3rbu *p, RbuOb
71a0: 6a 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  jIter *pIter){. 
71b0: 20 69 6e 74 20 72 63 20 3d 20 70 2d 3e 72 63 3b   int rc = p->rc;
71c0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
71d0: 45 5f 4f 4b 20 29 7b 0a 0a 20 20 20 20 2f 2a 20  E_OK ){..    /* 
71e0: 46 72 65 65 20 61 6e 79 20 53 51 4c 69 74 65 20  Free any SQLite 
71f0: 73 74 61 74 65 6d 65 6e 74 73 20 75 73 65 64 20  statements used 
7200: 77 68 69 6c 65 20 70 72 6f 63 65 73 73 69 6e 67  while processing
7210: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 6f 62   the previous ob
7220: 6a 65 63 74 20 2a 2f 20 0a 20 20 20 20 72 62 75  ject */ .    rbu
7230: 4f 62 6a 49 74 65 72 43 6c 65 61 72 53 74 61 74  ObjIterClearStat
7240: 65 6d 65 6e 74 73 28 70 49 74 65 72 29 3b 0a 20  ements(pIter);. 
7250: 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 7a 49     if( pIter->zI
7260: 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  dx==0 ){.      r
7270: 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  c = sqlite3_exec
7280: 28 70 2d 3e 64 62 4d 61 69 6e 2c 0a 20 20 20 20  (p->dbMain,.    
7290: 20 20 20 20 20 20 22 44 52 4f 50 20 54 52 49 47        "DROP TRIG
72a0: 47 45 52 20 49 46 20 45 58 49 53 54 53 20 74 65  GER IF EXISTS te
72b0: 6d 70 2e 72 62 75 5f 69 6e 73 65 72 74 5f 74 72  mp.rbu_insert_tr
72c0: 3b 22 0a 20 20 20 20 20 20 20 20 20 20 22 44 52  ;".          "DR
72d0: 4f 50 20 54 52 49 47 47 45 52 20 49 46 20 45 58  OP TRIGGER IF EX
72e0: 49 53 54 53 20 74 65 6d 70 2e 72 62 75 5f 75 70  ISTS temp.rbu_up
72f0: 64 61 74 65 31 5f 74 72 3b 22 0a 20 20 20 20 20  date1_tr;".     
7300: 20 20 20 20 20 22 44 52 4f 50 20 54 52 49 47 47       "DROP TRIGG
7310: 45 52 20 49 46 20 45 58 49 53 54 53 20 74 65 6d  ER IF EXISTS tem
7320: 70 2e 72 62 75 5f 75 70 64 61 74 65 32 5f 74 72  p.rbu_update2_tr
7330: 3b 22 0a 20 20 20 20 20 20 20 20 20 20 22 44 52  ;".          "DR
7340: 4f 50 20 54 52 49 47 47 45 52 20 49 46 20 45 58  OP TRIGGER IF EX
7350: 49 53 54 53 20 74 65 6d 70 2e 72 62 75 5f 64 65  ISTS temp.rbu_de
7360: 6c 65 74 65 5f 74 72 3b 22 0a 20 20 20 20 20 20  lete_tr;".      
7370: 20 20 20 20 2c 20 30 2c 20 30 2c 20 26 70 2d 3e      , 0, 0, &p->
7380: 7a 45 72 72 6d 73 67 0a 20 20 20 20 20 20 29 3b  zErrmsg.      );
7390: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
73a0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
73b0: 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72  .      if( pIter
73c0: 2d 3e 62 43 6c 65 61 6e 75 70 20 29 7b 0a 20 20  ->bCleanup ){.  
73d0: 20 20 20 20 20 20 72 62 75 4f 62 6a 49 74 65 72        rbuObjIter
73e0: 46 72 65 65 43 6f 6c 73 28 70 49 74 65 72 29 3b  FreeCols(pIter);
73f0: 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e  .        pIter->
7400: 62 43 6c 65 61 6e 75 70 20 3d 20 30 3b 0a 20 20  bCleanup = 0;.  
7410: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
7420: 65 33 5f 73 74 65 70 28 70 49 74 65 72 2d 3e 70  e3_step(pIter->p
7430: 54 62 6c 49 74 65 72 29 3b 0a 20 20 20 20 20 20  TblIter);.      
7440: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
7450: 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 20 20  _ROW ){.        
7460: 20 20 72 63 20 3d 20 72 65 73 65 74 41 6e 64 43    rc = resetAndC
7470: 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 49 74 65  ollectError(pIte
7480: 72 2d 3e 70 54 62 6c 49 74 65 72 2c 20 26 70 2d  r->pTblIter, &p-
7490: 3e 7a 45 72 72 6d 73 67 29 3b 0a 20 20 20 20 20  >zErrmsg);.     
74a0: 20 20 20 20 20 70 49 74 65 72 2d 3e 7a 54 62 6c       pIter->zTbl
74b0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 0;.        }e
74c0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
74d0: 49 74 65 72 2d 3e 7a 54 62 6c 20 3d 20 28 63 6f  Iter->zTbl = (co
74e0: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
74f0: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 49  3_column_text(pI
7500: 74 65 72 2d 3e 70 54 62 6c 49 74 65 72 2c 20 30  ter->pTblIter, 0
7510: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74  );.          pIt
7520: 65 72 2d 3e 7a 44 61 74 61 54 62 6c 20 3d 20 28  er->zDataTbl = (
7530: 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
7540: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
7550: 70 49 74 65 72 2d 3e 70 54 62 6c 49 74 65 72 2c  pIter->pTblIter,
7560: 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  1);.          rc
7570: 20 3d 20 28 70 49 74 65 72 2d 3e 7a 44 61 74 61   = (pIter->zData
7580: 54 62 6c 20 26 26 20 70 49 74 65 72 2d 3e 7a 54  Tbl && pIter->zT
7590: 62 6c 29 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20  bl) ? SQLITE_OK 
75a0: 3a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  : SQLITE_NOMEM;.
75b0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
75c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
75d0: 66 28 20 70 49 74 65 72 2d 3e 7a 49 64 78 3d 3d  f( pIter->zIdx==
75e0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
75f0: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 49 64  qlite3_stmt *pId
7600: 78 20 3d 20 70 49 74 65 72 2d 3e 70 49 64 78 49  x = pIter->pIdxI
7610: 74 65 72 3b 0a 20 20 20 20 20 20 20 20 20 20 72  ter;.          r
7620: 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  c = sqlite3_bind
7630: 5f 74 65 78 74 28 70 49 64 78 2c 20 31 2c 20 70  _text(pIdx, 1, p
7640: 49 74 65 72 2d 3e 7a 54 62 6c 2c 20 2d 31 2c 20  Iter->zTbl, -1, 
7650: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
7660: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7670: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
7680: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
7690: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74   rc = sqlite3_st
76a0: 65 70 28 70 49 74 65 72 2d 3e 70 49 64 78 49 74  ep(pIter->pIdxIt
76b0: 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  er);.          i
76c0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 52 4f  f( rc!=SQLITE_RO
76d0: 57 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  W ){.           
76e0: 20 72 63 20 3d 20 72 65 73 65 74 41 6e 64 43 6f   rc = resetAndCo
76f0: 6c 6c 65 63 74 45 72 72 6f 72 28 70 49 74 65 72  llectError(pIter
7700: 2d 3e 70 49 64 78 49 74 65 72 2c 20 26 70 2d 3e  ->pIdxIter, &p->
7710: 7a 45 72 72 6d 73 67 29 3b 0a 20 20 20 20 20 20  zErrmsg);.      
7720: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 62 43 6c        pIter->bCl
7730: 65 61 6e 75 70 20 3d 20 31 3b 0a 20 20 20 20 20  eanup = 1;.     
7740: 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 7a 49         pIter->zI
7750: 64 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  dx = 0;.        
7760: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
7770: 20 20 20 20 20 70 49 74 65 72 2d 3e 7a 49 64 78       pIter->zIdx
7780: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
7790: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
77a0: 65 78 74 28 70 49 74 65 72 2d 3e 70 49 64 78 49  ext(pIter->pIdxI
77b0: 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ter, 0);.       
77c0: 20 20 20 20 20 70 49 74 65 72 2d 3e 69 54 6e 75       pIter->iTnu
77d0: 6d 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  m = sqlite3_colu
77e0: 6d 6e 5f 69 6e 74 28 70 49 74 65 72 2d 3e 70 49  mn_int(pIter->pI
77f0: 64 78 49 74 65 72 2c 20 31 29 3b 0a 20 20 20 20  dxIter, 1);.    
7800: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 62          pIter->b
7810: 55 6e 69 71 75 65 20 3d 20 73 71 6c 69 74 65 33  Unique = sqlite3
7820: 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 49 74 65  _column_int(pIte
7830: 72 2d 3e 70 49 64 78 49 74 65 72 2c 20 32 29 3b  r->pIdxIter, 2);
7840: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
7850: 3d 20 70 49 74 65 72 2d 3e 7a 49 64 78 20 3f 20  = pIter->zIdx ? 
7860: 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49  SQLITE_OK : SQLI
7870: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
7880: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
7890: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
78a0: 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  }..  if( rc!=SQL
78b0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 62  ITE_OK ){.    rb
78c0: 75 4f 62 6a 49 74 65 72 46 69 6e 61 6c 69 7a 65  uObjIterFinalize
78d0: 28 70 49 74 65 72 29 3b 0a 20 20 20 20 70 2d 3e  (pIter);.    p->
78e0: 72 63 20 3d 20 72 63 3b 0a 20 20 7d 0a 20 20 72  rc = rc;.  }.  r
78f0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
7900: 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e  .** The implemen
7910: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 72 62  tation of the rb
7920: 75 5f 74 61 72 67 65 74 5f 6e 61 6d 65 28 29 20  u_target_name() 
7930: 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68  SQL function. Th
7940: 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61  is function.** a
7950: 63 63 65 70 74 73 20 6f 6e 65 20 6f 72 20 74 77  ccepts one or tw
7960: 6f 20 61 72 67 75 6d 65 6e 74 73 2e 20 54 68 65  o arguments. The
7970: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
7980: 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  is the name of a
7990: 20 74 61 62 6c 65 20 2d 0a 2a 2a 20 74 68 65 20   table -.** the 
79a0: 6e 61 6d 65 20 6f 66 20 61 20 74 61 62 6c 65 20  name of a table 
79b0: 69 6e 20 74 68 65 20 52 42 55 20 64 61 74 61 62  in the RBU datab
79c0: 61 73 65 2e 20 20 54 68 65 20 73 65 63 6f 6e 64  ase.  The second
79d0: 2c 20 69 66 20 69 74 20 69 73 20 70 72 65 73 65  , if it is prese
79e0: 6e 74 2c 20 69 73 20 31 0a 2a 2a 20 66 6f 72 20  nt, is 1.** for 
79f0: 61 20 76 69 65 77 20 6f 72 20 30 20 66 6f 72 20  a view or 0 for 
7a00: 61 20 74 61 62 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20  a table. .**.** 
7a10: 46 6f 72 20 61 20 6e 6f 6e 2d 76 61 63 75 75 6d  For a non-vacuum
7a20: 20 52 42 55 20 68 61 6e 64 6c 65 2c 20 69 66 20   RBU handle, if 
7a30: 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 6d  the table name m
7a40: 61 74 63 68 65 73 20 74 68 65 20 70 61 74 74 65  atches the patte
7a50: 72 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 64 61  rn:.**.**     da
7a60: 74 61 5b 30 2d 39 5d 5f 3c 6e 61 6d 65 3e 0a 2a  ta[0-9]_<name>.*
7a70: 2a 0a 2a 2a 20 77 68 65 72 65 20 3c 6e 61 6d 65  *.** where <name
7a80: 3e 20 69 73 20 61 6e 79 20 73 65 71 75 65 6e 63  > is any sequenc
7a90: 65 20 6f 66 20 31 20 6f 72 20 6d 6f 72 65 20 63  e of 1 or more c
7aa0: 68 61 72 61 63 74 65 72 73 2c 20 3c 6e 61 6d 65  haracters, <name
7ab0: 3e 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  > is returned..*
7ac0: 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
7ad0: 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e  the only argumen
7ae0: 74 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  t does not match
7af0: 20 74 68 65 20 61 62 6f 76 65 20 70 61 74 74 65   the above patte
7b00: 72 6e 2c 20 61 6e 20 53 51 4c 0a 2a 2a 20 4e 55  rn, an SQL.** NU
7b10: 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  LL is returned..
7b20: 2a 2a 0a 2a 2a 20 20 20 20 20 22 64 61 74 61 5f  **.**     "data_
7b30: 74 31 22 20 20 20 20 20 2d 3e 20 22 74 31 22 0a  t1"     -> "t1".
7b40: 2a 2a 20 20 20 20 20 22 64 61 74 61 30 31 32 33  **     "data0123
7b50: 5f 74 32 22 20 2d 3e 20 22 74 32 22 0a 2a 2a 20  _t2" -> "t2".** 
7b60: 20 20 20 20 22 64 61 74 61 41 42 5f 74 33 22 20      "dataAB_t3" 
7b70: 20 20 2d 3e 20 4e 55 4c 4c 0a 2a 2a 0a 2a 2a 20    -> NULL.**.** 
7b80: 46 6f 72 20 61 6e 20 72 62 75 20 76 61 63 75 75  For an rbu vacuu
7b90: 6d 20 68 61 6e 64 6c 65 2c 20 61 20 63 6f 70 79  m handle, a copy
7ba0: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 61 72   of the first ar
7bb0: 67 75 6d 65 6e 74 20 69 73 20 72 65 74 75 72 6e  gument is return
7bc0: 65 64 20 69 66 0a 2a 2a 20 74 68 65 20 73 65 63  ed if.** the sec
7bd0: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
7be0: 65 69 74 68 65 72 20 6d 69 73 73 69 6e 67 20 6f  either missing o
7bf0: 72 20 30 20 28 6e 6f 74 20 61 20 76 69 65 77 29  r 0 (not a view)
7c00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
7c10: 20 72 62 75 54 61 72 67 65 74 4e 61 6d 65 46 75   rbuTargetNameFu
7c20: 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  nc(.  sqlite3_co
7c30: 6e 74 65 78 74 20 2a 70 43 74 78 2c 0a 20 20 69  ntext *pCtx,.  i
7c40: 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74  nt argc,.  sqlit
7c50: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
7c60: 29 7b 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20  ){.  sqlite3rbu 
7c70: 2a 70 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65  *p = sqlite3_use
7c80: 72 5f 64 61 74 61 28 70 43 74 78 29 3b 0a 20 20  r_data(pCtx);.  
7c90: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 3b  const char *zIn;
7ca0: 0a 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3d  .  assert( argc=
7cb0: 3d 31 20 7c 7c 20 61 72 67 63 3d 3d 32 20 29 3b  =1 || argc==2 );
7cc0: 0a 0a 20 20 7a 49 6e 20 3d 20 28 63 6f 6e 73 74  ..  zIn = (const
7cd0: 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76   char*)sqlite3_v
7ce0: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
7cf0: 5d 29 3b 0a 20 20 69 66 28 20 7a 49 6e 20 29 7b  ]);.  if( zIn ){
7d00: 0a 20 20 20 20 69 66 28 20 72 62 75 49 73 56 61  .    if( rbuIsVa
7d10: 63 75 75 6d 28 70 29 20 29 7b 0a 20 20 20 20 20  cuum(p) ){.     
7d20: 20 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d 32   assert( argc==2
7d30: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d   );.      if( 0=
7d40: 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69  =sqlite3_value_i
7d50: 6e 74 28 61 72 67 76 5b 31 5d 29 20 29 7b 0a 20  nt(argv[1]) ){. 
7d60: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
7d70: 65 73 75 6c 74 5f 74 65 78 74 28 70 43 74 78 2c  esult_text(pCtx,
7d80: 20 7a 49 6e 2c 20 2d 31 2c 20 53 51 4c 49 54 45   zIn, -1, SQLITE
7d90: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
7da0: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
7db0: 20 20 20 69 66 28 20 73 74 72 6c 65 6e 28 7a 49     if( strlen(zI
7dc0: 6e 29 3e 34 20 26 26 20 6d 65 6d 63 6d 70 28 22  n)>4 && memcmp("
7dd0: 64 61 74 61 22 2c 20 7a 49 6e 2c 20 34 29 3d 3d  data", zIn, 4)==
7de0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  0 ){.        int
7df0: 20 69 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   i;.        for(
7e00: 69 3d 34 3b 20 7a 49 6e 5b 69 5d 3e 3d 27 30 27  i=4; zIn[i]>='0'
7e10: 20 26 26 20 7a 49 6e 5b 69 5d 3c 3d 27 39 27 3b   && zIn[i]<='9';
7e20: 20 69 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20 69   i++);.        i
7e30: 66 28 20 7a 49 6e 5b 69 5d 3d 3d 27 5f 27 20 26  f( zIn[i]=='_' &
7e40: 26 20 7a 49 6e 5b 69 2b 31 5d 20 29 7b 0a 20 20  & zIn[i+1] ){.  
7e50: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
7e60: 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43 74 78  result_text(pCtx
7e70: 2c 20 26 7a 49 6e 5b 69 2b 31 5d 2c 20 2d 31 2c  , &zIn[i+1], -1,
7e80: 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
7e90: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
7ea0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
7eb0: 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
7ec0: 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 73 74   the iterator st
7ed0: 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20 61  ructure passed a
7ee0: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
7ef0: 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ument..**.** If 
7f00: 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  no error occurs,
7f10: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
7f20: 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 69  turned and the i
7f30: 74 65 72 61 74 6f 72 20 69 73 20 6c 65 66 74 20  terator is left 
7f40: 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  .** pointing to 
7f50: 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 2e  the first entry.
7f60: 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20 65   Otherwise, an e
7f70: 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 6d 65  rror code and me
7f80: 73 73 61 67 65 20 69 73 20 0a 2a 2a 20 6c 65 66  ssage is .** lef
7f90: 74 20 69 6e 20 74 68 65 20 52 42 55 20 68 61 6e  t in the RBU han
7fa0: 64 6c 65 20 70 61 73 73 65 64 20 61 73 20 74 68  dle passed as th
7fb0: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
7fc0: 2e 20 41 20 63 6f 70 79 20 6f 66 20 74 68 65 20  . A copy of the 
7fd0: 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69  .** error code i
7fe0: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
7ff0: 74 61 74 69 63 20 69 6e 74 20 72 62 75 4f 62 6a  tatic int rbuObj
8000: 49 74 65 72 46 69 72 73 74 28 73 71 6c 69 74 65  IterFirst(sqlite
8010: 33 72 62 75 20 2a 70 2c 20 52 62 75 4f 62 6a 49  3rbu *p, RbuObjI
8020: 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69  ter *pIter){.  i
8030: 6e 74 20 72 63 3b 0a 20 20 6d 65 6d 73 65 74 28  nt rc;.  memset(
8040: 70 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66  pIter, 0, sizeof
8050: 28 52 62 75 4f 62 6a 49 74 65 72 29 29 3b 0a 0a  (RbuObjIter));..
8060: 20 20 72 63 20 3d 20 70 72 65 70 61 72 65 46 72    rc = prepareFr
8070: 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f  eeAndCollectErro
8080: 72 28 70 2d 3e 64 62 52 62 75 2c 20 26 70 49 74  r(p->dbRbu, &pIt
8090: 65 72 2d 3e 70 54 62 6c 49 74 65 72 2c 20 26 70  er->pTblIter, &p
80a0: 2d 3e 7a 45 72 72 6d 73 67 2c 20 0a 20 20 20 20  ->zErrmsg, .    
80b0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
80c0: 0a 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 72  .      "SELECT r
80d0: 62 75 5f 74 61 72 67 65 74 5f 6e 61 6d 65 28 6e  bu_target_name(n
80e0: 61 6d 65 2c 20 74 79 70 65 3d 27 76 69 65 77 27  ame, type='view'
80f0: 29 20 41 53 20 74 61 72 67 65 74 2c 20 6e 61 6d  ) AS target, nam
8100: 65 20 22 0a 20 20 20 20 20 20 22 46 52 4f 4d 20  e ".      "FROM 
8110: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 22 0a  sqlite_master ".
8120: 20 20 20 20 20 20 22 57 48 45 52 45 20 74 79 70        "WHERE typ
8130: 65 20 49 4e 20 28 27 74 61 62 6c 65 27 2c 20 27  e IN ('table', '
8140: 76 69 65 77 27 29 20 41 4e 44 20 74 61 72 67 65  view') AND targe
8150: 74 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 22 0a  t IS NOT NULL ".
8160: 20 20 20 20 20 20 22 20 25 73 20 22 0a 20 20 20        " %s ".   
8170: 20 20 20 22 4f 52 44 45 52 20 42 59 20 6e 61 6d     "ORDER BY nam
8180: 65 22 0a 20 20 2c 20 72 62 75 49 73 56 61 63 75  e".  , rbuIsVacu
8190: 75 6d 28 70 29 20 3f 20 22 41 4e 44 20 72 6f 6f  um(p) ? "AND roo
81a0: 74 70 61 67 65 21 3d 30 20 41 4e 44 20 72 6f 6f  tpage!=0 AND roo
81b0: 74 70 61 67 65 20 49 53 20 4e 4f 54 20 4e 55 4c  tpage IS NOT NUL
81c0: 4c 22 20 3a 20 22 22 29 29 3b 0a 0a 20 20 69 66  L" : ""));..  if
81d0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
81e0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 72 65 70  ){.    rc = prep
81f0: 61 72 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72  areAndCollectErr
8200: 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 70  or(p->dbMain, &p
8210: 49 74 65 72 2d 3e 70 49 64 78 49 74 65 72 2c 20  Iter->pIdxIter, 
8220: 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 0a 20 20 20  &p->zErrmsg,.   
8230: 20 20 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d       "SELECT nam
8240: 65 2c 20 72 6f 6f 74 70 61 67 65 2c 20 73 71 6c  e, rootpage, sql
8250: 20 49 53 20 4e 55 4c 4c 20 4f 52 20 73 75 62 73   IS NULL OR subs
8260: 74 72 28 38 2c 20 36 29 3d 3d 27 55 4e 49 51 55  tr(8, 6)=='UNIQU
8270: 45 27 20 22 0a 20 20 20 20 20 20 20 20 22 20 20  E' ".        "  
8280: 46 52 4f 4d 20 6d 61 69 6e 2e 73 71 6c 69 74 65  FROM main.sqlite
8290: 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20 20 20  _master ".      
82a0: 20 20 22 20 20 57 48 45 52 45 20 74 79 70 65 3d    "  WHERE type=
82b0: 27 69 6e 64 65 78 27 20 41 4e 44 20 74 62 6c 5f  'index' AND tbl_
82c0: 6e 61 6d 65 20 3d 20 3f 22 0a 20 20 20 20 29 3b  name = ?".    );
82d0: 0a 20 20 7d 0a 0a 20 20 70 49 74 65 72 2d 3e 62  .  }..  pIter->b
82e0: 43 6c 65 61 6e 75 70 20 3d 20 31 3b 0a 20 20 70  Cleanup = 1;.  p
82f0: 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 72 65 74  ->rc = rc;.  ret
8300: 75 72 6e 20 72 62 75 4f 62 6a 49 74 65 72 4e 65  urn rbuObjIterNe
8310: 78 74 28 70 2c 20 70 49 74 65 72 29 3b 0a 7d 0a  xt(p, pIter);.}.
8320: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  ./*.** This is a
8330: 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20   wrapper around 
8340: 22 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66  "sqlite3_mprintf
8350: 28 7a 46 6d 74 2c 20 2e 2e 2e 29 22 2e 20 49 66  (zFmt, ...)". If
8360: 20 61 6e 20 4f 4f 4d 20 6f 63 63 75 72 73 2c 0a   an OOM occurs,.
8370: 2a 2a 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  ** an error code
8380: 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68   is stored in th
8390: 65 20 52 42 55 20 68 61 6e 64 6c 65 20 70 61 73  e RBU handle pas
83a0: 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
83b0: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a   argument..**.**
83c0: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73   If an error has
83d0: 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65   already occurre
83e0: 64 20 28 70 2d 3e 72 63 20 69 73 20 61 6c 72 65  d (p->rc is alre
83f0: 61 64 79 20 73 65 74 20 74 6f 20 73 6f 6d 65 74  ady set to somet
8400: 68 69 6e 67 20 6f 74 68 65 72 0a 2a 2a 20 74 68  hing other.** th
8410: 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 29 2c 20 74  an SQLITE_OK), t
8420: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
8430: 6e 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 77  n returns NULL w
8440: 69 74 68 6f 75 74 20 6d 6f 64 69 66 79 69 6e 67  ithout modifying
8450: 20 74 68 65 0a 2a 2a 20 73 74 6f 72 65 64 20 65   the.** stored e
8460: 72 72 6f 72 20 63 6f 64 65 2e 20 49 6e 20 74 68  rror code. In th
8470: 69 73 20 63 61 73 65 20 69 74 20 73 74 69 6c 6c  is case it still
8480: 20 63 61 6c 6c 73 20 73 71 6c 69 74 65 33 5f 66   calls sqlite3_f
8490: 72 65 65 28 29 20 6f 6e 20 61 6e 79 20 0a 2a 2a  ree() on any .**
84a0: 20 70 72 69 6e 74 66 28 29 20 70 61 72 61 6d 65   printf() parame
84b0: 74 65 72 73 20 61 73 73 6f 63 69 61 74 65 64 20  ters associated 
84c0: 77 69 74 68 20 25 7a 20 63 6f 6e 76 65 72 73 69  with %z conversi
84d0: 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ons..*/.static c
84e0: 68 61 72 20 2a 72 62 75 4d 50 72 69 6e 74 66 28  har *rbuMPrintf(
84f0: 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 63  sqlite3rbu *p, c
8500: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d 74 2c  onst char *zFmt,
8510: 20 2e 2e 2e 29 7b 0a 20 20 63 68 61 72 20 2a 7a   ...){.  char *z
8520: 53 71 6c 20 3d 20 30 3b 0a 20 20 76 61 5f 6c 69  Sql = 0;.  va_li
8530: 73 74 20 61 70 3b 0a 20 20 76 61 5f 73 74 61 72  st ap;.  va_star
8540: 74 28 61 70 2c 20 7a 46 6d 74 29 3b 0a 20 20 7a  t(ap, zFmt);.  z
8550: 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 6d  Sql = sqlite3_vm
8560: 70 72 69 6e 74 66 28 7a 46 6d 74 2c 20 61 70 29  printf(zFmt, ap)
8570: 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ;.  if( p->rc==S
8580: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
8590: 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 20 70 2d  if( zSql==0 ) p-
85a0: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  >rc = SQLITE_NOM
85b0: 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  EM;.  }else{.   
85c0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53   sqlite3_free(zS
85d0: 71 6c 29 3b 0a 20 20 20 20 7a 53 71 6c 20 3d 20  ql);.    zSql = 
85e0: 30 3b 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28  0;.  }.  va_end(
85f0: 61 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 53  ap);.  return zS
8600: 71 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67  ql;.}../*.** Arg
8610: 75 6d 65 6e 74 20 7a 46 6d 74 20 69 73 20 61 20  ument zFmt is a 
8620: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
8630: 29 20 73 74 79 6c 65 20 66 6f 72 6d 61 74 20 73  ) style format s
8640: 74 72 69 6e 67 2e 20 54 68 65 20 74 72 61 69 6c  tring. The trail
8650: 69 6e 67 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73  ing.** arguments
8660: 20 61 72 65 20 74 68 65 20 75 73 75 61 6c 20 73   are the usual s
8670: 75 62 73 69 74 75 74 69 6f 6e 20 76 61 6c 75 65  ubsitution value
8680: 73 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  s. This function
8690: 20 70 65 72 66 6f 72 6d 73 0a 2a 2a 20 74 68 65   performs.** the
86a0: 20 70 72 69 6e 74 66 28 29 20 73 74 79 6c 65 20   printf() style 
86b0: 73 75 62 73 74 69 74 75 74 69 6f 6e 73 20 61 6e  substitutions an
86c0: 64 20 65 78 65 63 75 74 65 73 20 74 68 65 20 72  d executes the r
86d0: 65 73 75 6c 74 20 61 73 20 61 6e 20 53 51 4c 0a  esult as an SQL.
86e0: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20  ** statement on 
86f0: 74 68 65 20 52 42 55 20 68 61 6e 64 6c 65 73 20  the RBU handles 
8700: 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
8710: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
8720: 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  rs, an error cod
8730: 65 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73  e and error mess
8740: 61 67 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e  age is stored in
8750: 20 74 68 65 0a 2a 2a 20 52 42 55 20 68 61 6e 64   the.** RBU hand
8760: 6c 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  le. If an error 
8770: 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75  has already occu
8780: 72 72 65 64 20 77 68 65 6e 20 74 68 69 73 20 66  rred when this f
8790: 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 63 61  unction is.** ca
87a0: 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f  lled, it is a no
87b0: 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  -op..*/.static i
87c0: 6e 74 20 72 62 75 4d 50 72 69 6e 74 66 45 78 65  nt rbuMPrintfExe
87d0: 63 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c  c(sqlite3rbu *p,
87e0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f   sqlite3 *db, co
87f0: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d 74 2c 20  nst char *zFmt, 
8800: 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
8810: 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c  ap;.  char *zSql
8820: 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c  ;.  va_start(ap,
8830: 20 7a 46 6d 74 29 3b 0a 20 20 7a 53 71 6c 20 3d   zFmt);.  zSql =
8840: 20 73 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74   sqlite3_vmprint
8850: 66 28 7a 46 6d 74 2c 20 61 70 29 3b 0a 20 20 69  f(zFmt, ap);.  i
8860: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
8870: 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 7a  _OK ){.    if( z
8880: 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Sql==0 ){.      
8890: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  p->rc = SQLITE_N
88a0: 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  OMEM;.    }else{
88b0: 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73  .      p->rc = s
88c0: 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20  qlite3_exec(db, 
88d0: 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 26 70 2d 3e  zSql, 0, 0, &p->
88e0: 7a 45 72 72 6d 73 67 29 3b 0a 20 20 20 20 7d 0a  zErrmsg);.    }.
88f0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
8900: 65 65 28 7a 53 71 6c 29 3b 0a 20 20 76 61 5f 65  ee(zSql);.  va_e
8910: 6e 64 28 61 70 29 3b 0a 20 20 72 65 74 75 72 6e  nd(ap);.  return
8920: 20 70 2d 3e 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   p->rc;.}../*.**
8930: 20 41 74 74 65 6d 70 74 20 74 6f 20 61 6c 6c 6f   Attempt to allo
8940: 63 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20  cate and return 
8950: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 7a  a pointer to a z
8960: 65 72 6f 65 64 20 62 6c 6f 63 6b 20 6f 66 20 6e  eroed block of n
8970: 42 79 74 65 20 0a 2a 2a 20 62 79 74 65 73 2e 20  Byte .** bytes. 
8980: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
8990: 6f 72 20 28 69 2e 65 2e 20 61 6e 20 4f 4f 4d 20  or (i.e. an OOM 
89a0: 63 6f 6e 64 69 74 69 6f 6e 29 20 6f 63 63 75 72  condition) occur
89b0: 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61  s, return NULL a
89c0: 6e 64 20 6c 65 61 76 65 20 61 6e 20 0a 2a 2a 20  nd leave an .** 
89d0: 65 72 72 6f 72 20 63 6f 64 65 20 69 6e 20 74 68  error code in th
89e0: 65 20 72 62 75 20 68 61 6e 64 6c 65 20 70 61 73  e rbu handle pas
89f0: 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
8a00: 20 61 72 67 75 6d 65 6e 74 2e 20 4f 72 2c 20 69   argument. Or, i
8a10: 66 20 61 6e 20 0a 2a 2a 20 65 72 72 6f 72 20 68  f an .** error h
8a20: 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72  as already occur
8a30: 72 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75  red when this fu
8a40: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
8a50: 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 0a 2a  , return NULL .*
8a60: 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 77 69  * immediately wi
8a70: 74 68 6f 75 74 20 61 74 74 65 6d 70 74 69 6e 67  thout attempting
8a80: 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20   the allocation 
8a90: 6f 72 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65  or modifying the
8aa0: 20 73 74 6f 72 65 64 0a 2a 2a 20 65 72 72 6f 72   stored.** error
8ab0: 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   code..*/.static
8ac0: 20 76 6f 69 64 20 2a 72 62 75 4d 61 6c 6c 6f 63   void *rbuMalloc
8ad0: 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20  (sqlite3rbu *p, 
8ae0: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 42  sqlite3_int64 nB
8af0: 79 74 65 29 7b 0a 20 20 76 6f 69 64 20 2a 70 52  yte){.  void *pR
8b00: 65 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d  et = 0;.  if( p-
8b10: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
8b20: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 42  {.    assert( nB
8b30: 79 74 65 3e 30 20 29 3b 0a 20 20 20 20 70 52 65  yte>0 );.    pRe
8b40: 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  t = sqlite3_mall
8b50: 6f 63 36 34 28 6e 42 79 74 65 29 3b 0a 20 20 20  oc64(nByte);.   
8b60: 20 69 66 28 20 70 52 65 74 3d 3d 30 20 29 7b 0a   if( pRet==0 ){.
8b70: 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51        p->rc = SQ
8b80: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
8b90: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d  }else{.      mem
8ba0: 73 65 74 28 70 52 65 74 2c 20 30 2c 20 6e 42 79  set(pRet, 0, nBy
8bb0: 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  te);.    }.  }. 
8bc0: 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
8bd0: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
8be0: 20 61 6e 64 20 7a 65 72 6f 20 74 68 65 20 70 49   and zero the pI
8bf0: 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 5d 20  ter->azTblCol[] 
8c00: 61 6e 64 20 61 62 54 62 6c 50 6b 5b 5d 20 61 72  and abTblPk[] ar
8c10: 72 61 79 73 20 73 6f 20 74 68 61 74 0a 2a 2a 20  rays so that.** 
8c20: 74 68 65 72 65 20 69 73 20 72 6f 6f 6d 20 66 6f  there is room fo
8c30: 72 20 61 74 20 6c 65 61 73 74 20 6e 43 6f 6c 20  r at least nCol 
8c40: 65 6c 65 6d 65 6e 74 73 2e 20 49 66 20 61 6e 20  elements. If an 
8c50: 4f 4f 4d 20 6f 63 63 75 72 73 2c 20 73 74 6f 72  OOM occurs, stor
8c60: 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f  e an.** error co
8c70: 64 65 20 69 6e 20 74 68 65 20 52 42 55 20 68 61  de in the RBU ha
8c80: 6e 64 6c 65 20 70 61 73 73 65 64 20 61 73 20 74  ndle passed as t
8c90: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
8ca0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
8cb0: 64 20 72 62 75 41 6c 6c 6f 63 61 74 65 49 74 65  d rbuAllocateIte
8cc0: 72 41 72 72 61 79 73 28 73 71 6c 69 74 65 33 72  rArrays(sqlite3r
8cd0: 62 75 20 2a 70 2c 20 52 62 75 4f 62 6a 49 74 65  bu *p, RbuObjIte
8ce0: 72 20 2a 70 49 74 65 72 2c 20 69 6e 74 20 6e 43  r *pIter, int nC
8cf0: 6f 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69  ol){.  sqlite3_i
8d00: 6e 74 36 34 20 6e 42 79 74 65 20 3d 20 28 32 2a  nt64 nByte = (2*
8d10: 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 20 2b 20  sizeof(char*) + 
8d20: 73 69 7a 65 6f 66 28 69 6e 74 29 20 2b 20 33 2a  sizeof(int) + 3*
8d30: 73 69 7a 65 6f 66 28 75 38 29 29 20 2a 20 6e 43  sizeof(u8)) * nC
8d40: 6f 6c 3b 0a 20 20 63 68 61 72 20 2a 2a 61 7a 4e  ol;.  char **azN
8d50: 65 77 3b 0a 0a 20 20 61 7a 4e 65 77 20 3d 20 28  ew;..  azNew = (
8d60: 63 68 61 72 2a 2a 29 72 62 75 4d 61 6c 6c 6f 63  char**)rbuMalloc
8d70: 28 70 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69 66  (p, nByte);.  if
8d80: 28 20 61 7a 4e 65 77 20 29 7b 0a 20 20 20 20 70  ( azNew ){.    p
8d90: 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 20 3d  Iter->azTblCol =
8da0: 20 61 7a 4e 65 77 3b 0a 20 20 20 20 70 49 74 65   azNew;.    pIte
8db0: 72 2d 3e 61 7a 54 62 6c 54 79 70 65 20 3d 20 26  r->azTblType = &
8dc0: 61 7a 4e 65 77 5b 6e 43 6f 6c 5d 3b 0a 20 20 20  azNew[nCol];.   
8dd0: 20 70 49 74 65 72 2d 3e 61 69 53 72 63 4f 72 64   pIter->aiSrcOrd
8de0: 65 72 20 3d 20 28 69 6e 74 2a 29 26 70 49 74 65  er = (int*)&pIte
8df0: 72 2d 3e 61 7a 54 62 6c 54 79 70 65 5b 6e 43 6f  r->azTblType[nCo
8e00: 6c 5d 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 61  l];.    pIter->a
8e10: 62 54 62 6c 50 6b 20 3d 20 28 75 38 2a 29 26 70  bTblPk = (u8*)&p
8e20: 49 74 65 72 2d 3e 61 69 53 72 63 4f 72 64 65 72  Iter->aiSrcOrder
8e30: 5b 6e 43 6f 6c 5d 3b 0a 20 20 20 20 70 49 74 65  [nCol];.    pIte
8e40: 72 2d 3e 61 62 4e 6f 74 4e 75 6c 6c 20 3d 20 28  r->abNotNull = (
8e50: 75 38 2a 29 26 70 49 74 65 72 2d 3e 61 62 54 62  u8*)&pIter->abTb
8e60: 6c 50 6b 5b 6e 43 6f 6c 5d 3b 0a 20 20 20 20 70  lPk[nCol];.    p
8e70: 49 74 65 72 2d 3e 61 62 49 6e 64 65 78 65 64 20  Iter->abIndexed 
8e80: 3d 20 28 75 38 2a 29 26 70 49 74 65 72 2d 3e 61  = (u8*)&pIter->a
8e90: 62 4e 6f 74 4e 75 6c 6c 5b 6e 43 6f 6c 5d 3b 0a  bNotNull[nCol];.
8ea0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65    }.}../*.** The
8eb0: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
8ec0: 6d 75 73 74 20 62 65 20 61 20 6e 75 6c 2d 74 65  must be a nul-te
8ed0: 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 2e  rminated string.
8ee0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   This function.*
8ef0: 2a 20 72 65 74 75 72 6e 73 20 61 20 63 6f 70 79  * returns a copy
8f00: 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67 20 69   of the string i
8f10: 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65  n memory obtaine
8f20: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
8f30: 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 49 74 20 69  alloc()..** It i
8f40: 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69  s the responsibi
8f50: 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c  lity of the call
8f60: 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79  er to eventually
8f70: 20 66 72 65 65 20 74 68 69 73 20 6d 65 6d 6f 72   free this memor
8f80: 79 0a 2a 2a 20 75 73 69 6e 67 20 73 71 6c 69 74  y.** using sqlit
8f90: 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a  e3_free()..**.**
8fa0: 20 49 66 20 61 6e 20 4f 4f 4d 20 63 6f 6e 64 69   If an OOM condi
8fb0: 74 69 6f 6e 20 69 73 20 65 6e 63 6f 75 6e 74 65  tion is encounte
8fc0: 72 65 64 20 77 68 65 6e 20 61 74 74 65 6d 70 74  red when attempt
8fd0: 69 6e 67 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  ing to allocate 
8fe0: 6d 65 6d 6f 72 79 2c 0a 2a 2a 20 6f 75 74 70 75  memory,.** outpu
8ff0: 74 20 76 61 72 69 61 62 6c 65 20 28 2a 70 52 63  t variable (*pRc
9000: 29 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49  ) is set to SQLI
9010: 54 45 5f 4e 4f 4d 45 4d 20 62 65 66 6f 72 65 20  TE_NOMEM before 
9020: 72 65 74 75 72 6e 69 6e 67 2e 20 4f 74 68 65 72  returning. Other
9030: 77 69 73 65 2c 0a 2a 2a 20 69 66 20 74 68 65 20  wise,.** if the 
9040: 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 75 63 63 65  allocation succe
9050: 65 64 73 2c 20 28 2a 70 52 63 29 20 69 73 20 6c  eds, (*pRc) is l
9060: 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a  eft unchanged..*
9070: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 72  /.static char *r
9080: 62 75 53 74 72 6e 64 75 70 28 63 6f 6e 73 74 20  buStrndup(const 
9090: 63 68 61 72 20 2a 7a 53 74 72 2c 20 69 6e 74 20  char *zStr, int 
90a0: 2a 70 52 63 29 7b 0a 20 20 63 68 61 72 20 2a 7a  *pRc){.  char *z
90b0: 52 65 74 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  Ret = 0;..  asse
90c0: 72 74 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45  rt( *pRc==SQLITE
90d0: 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 7a 53 74  _OK );.  if( zSt
90e0: 72 20 29 7b 0a 20 20 20 20 73 69 7a 65 5f 74 20  r ){.    size_t 
90f0: 6e 43 6f 70 79 20 3d 20 73 74 72 6c 65 6e 28 7a  nCopy = strlen(z
9100: 53 74 72 29 20 2b 20 31 3b 0a 20 20 20 20 7a 52  Str) + 1;.    zR
9110: 65 74 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69  et = (char*)sqli
9120: 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 43 6f  te3_malloc64(nCo
9130: 70 79 29 3b 0a 20 20 20 20 69 66 28 20 7a 52 65  py);.    if( zRe
9140: 74 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  t ){.      memcp
9150: 79 28 7a 52 65 74 2c 20 7a 53 74 72 2c 20 6e 43  y(zRet, zStr, nC
9160: 6f 70 79 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  opy);.    }else{
9170: 0a 20 20 20 20 20 20 2a 70 52 63 20 3d 20 53 51  .      *pRc = SQ
9180: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
9190: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
91a0: 7a 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  zRet;.}../*.** F
91b0: 69 6e 61 6c 69 7a 65 20 74 68 65 20 73 74 61 74  inalize the stat
91c0: 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61 73 20  ement passed as 
91d0: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
91e0: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ent..**.** If th
91f0: 65 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69  e sqlite3_finali
9200: 7a 65 28 29 20 63 61 6c 6c 20 69 6e 64 69 63 61  ze() call indica
9210: 74 65 73 20 74 68 61 74 20 61 6e 20 65 72 72 6f  tes that an erro
9220: 72 20 6f 63 63 75 72 73 2c 20 61 6e 64 20 74 68  r occurs, and th
9230: 65 0a 2a 2a 20 72 62 75 20 68 61 6e 64 6c 65 20  e.** rbu handle 
9240: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 6e 6f  error code is no
9250: 74 20 61 6c 72 65 61 64 79 20 73 65 74 2c 20 73  t already set, s
9260: 65 74 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  et the error cod
9270: 65 20 61 6e 64 20 65 72 72 6f 72 0a 2a 2a 20 6d  e and error.** m
9280: 65 73 73 61 67 65 20 61 63 63 6f 72 64 69 6e 67  essage according
9290: 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ly..*/.static vo
92a0: 69 64 20 72 62 75 46 69 6e 61 6c 69 7a 65 28 73  id rbuFinalize(s
92b0: 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 73 71  qlite3rbu *p, sq
92c0: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
92d0: 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  t){.  sqlite3 *d
92e0: 62 20 3d 20 73 71 6c 69 74 65 33 5f 64 62 5f 68  b = sqlite3_db_h
92f0: 61 6e 64 6c 65 28 70 53 74 6d 74 29 3b 0a 20 20  andle(pStmt);.  
9300: 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
9310: 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
9320: 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ;.  if( p->rc==S
9330: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d  QLITE_OK && rc!=
9340: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
9350: 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20   p->rc = rc;.   
9360: 20 70 2d 3e 7a 45 72 72 6d 73 67 20 3d 20 73 71   p->zErrmsg = sq
9370: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
9380: 73 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  s", sqlite3_errm
9390: 73 67 28 64 62 29 29 3b 0a 20 20 7d 0a 7d 0a 0a  sg(db));.  }.}..
93a0: 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65  /* Determine the
93b0: 20 74 79 70 65 20 6f 66 20 61 20 74 61 62 6c 65   type of a table
93c0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 70 65 54 79 70 65  ..**.**   peType
93d0: 20 69 73 20 6f 66 20 74 79 70 65 20 28 69 6e 74   is of type (int
93e0: 2a 29 2c 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  *), a pointer to
93f0: 20 61 6e 20 6f 75 74 70 75 74 20 70 61 72 61 6d   an output param
9400: 65 74 65 72 20 6f 66 20 74 79 70 65 0a 2a 2a 20  eter of type.** 
9410: 20 20 28 69 6e 74 29 2e 20 54 68 69 73 20 63 61    (int). This ca
9420: 6c 6c 20 73 65 74 73 20 74 68 65 20 6f 75 74 70  ll sets the outp
9430: 75 74 20 70 61 72 61 6d 65 74 65 72 20 61 73 20  ut parameter as 
9440: 66 6f 6c 6c 6f 77 73 2c 20 64 65 70 65 6e 64 69  follows, dependi
9450: 6e 67 0a 2a 2a 20 20 20 6f 6e 20 74 68 65 20 74  ng.**   on the t
9460: 79 70 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ype of the table
9470: 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61   specified by pa
9480: 72 61 6d 65 74 65 72 73 20 64 62 4e 61 6d 65 20  rameters dbName 
9490: 61 6e 64 20 7a 54 62 6c 2e 0a 2a 2a 0a 2a 2a 20  and zTbl..**.** 
94a0: 20 20 20 20 52 42 55 5f 50 4b 5f 4e 4f 54 41 42      RBU_PK_NOTAB
94b0: 4c 45 3a 20 20 20 20 20 20 20 4e 6f 20 73 75 63  LE:       No suc
94c0: 68 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20  h table..**     
94d0: 52 42 55 5f 50 4b 5f 4e 4f 4e 45 3a 20 20 20 20  RBU_PK_NONE:    
94e0: 20 20 20 20 20 20 54 61 62 6c 65 20 68 61 73 20        Table has 
94f0: 61 6e 20 69 6d 70 6c 69 63 69 74 20 72 6f 77 69  an implicit rowi
9500: 64 2e 0a 2a 2a 20 20 20 20 20 52 42 55 5f 50 4b  d..**     RBU_PK
9510: 5f 49 50 4b 3a 20 20 20 20 20 20 20 20 20 20 20  _IPK:           
9520: 54 61 62 6c 65 20 68 61 73 20 61 6e 20 65 78 70  Table has an exp
9530: 6c 69 63 69 74 20 49 50 4b 20 63 6f 6c 75 6d 6e  licit IPK column
9540: 2e 0a 2a 2a 20 20 20 20 20 52 42 55 5f 50 4b 5f  ..**     RBU_PK_
9550: 45 58 54 45 52 4e 41 4c 3a 20 20 20 20 20 20 54  EXTERNAL:      T
9560: 61 62 6c 65 20 68 61 73 20 61 6e 20 65 78 74 65  able has an exte
9570: 72 6e 61 6c 20 50 4b 20 69 6e 64 65 78 2e 0a 2a  rnal PK index..*
9580: 2a 20 20 20 20 20 52 42 55 5f 50 4b 5f 57 49 54  *     RBU_PK_WIT
9590: 48 4f 55 54 5f 52 4f 57 49 44 3a 20 54 61 62 6c  HOUT_ROWID: Tabl
95a0: 65 20 69 73 20 57 49 54 48 4f 55 54 20 52 4f 57  e is WITHOUT ROW
95b0: 49 44 2e 0a 2a 2a 20 20 20 20 20 52 42 55 5f 50  ID..**     RBU_P
95c0: 4b 5f 56 54 41 42 3a 20 20 20 20 20 20 20 20 20  K_VTAB:         
95d0: 20 54 61 62 6c 65 20 69 73 20 61 20 76 69 72 74   Table is a virt
95e0: 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  ual table..**.**
95f0: 20 20 20 41 72 67 75 6d 65 6e 74 20 2a 70 69 50     Argument *piP
9600: 6b 20 69 73 20 61 6c 73 6f 20 6f 66 20 74 79 70  k is also of typ
9610: 65 20 28 69 6e 74 2a 29 2c 20 61 6e 64 20 61 6c  e (int*), and al
9620: 73 6f 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20  so points to an 
9630: 6f 75 74 70 75 74 0a 2a 2a 20 20 20 70 61 72 61  output.**   para
9640: 6d 65 74 65 72 2e 20 55 6e 6c 65 73 73 20 74 68  meter. Unless th
9650: 65 20 74 61 62 6c 65 20 68 61 73 20 61 6e 20 65  e table has an e
9660: 78 74 65 72 6e 61 6c 20 70 72 69 6d 61 72 79 20  xternal primary 
9670: 6b 65 79 20 69 6e 64 65 78 20 0a 2a 2a 20 20 20  key index .**   
9680: 28 69 2e 65 2e 20 75 6e 6c 65 73 73 20 2a 70 65  (i.e. unless *pe
9690: 54 79 70 65 20 69 73 20 73 65 74 20 74 6f 20 33  Type is set to 3
96a0: 29 2c 20 74 68 65 6e 20 2a 70 69 50 6b 20 69 73  ), then *piPk is
96b0: 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 4f 72   set to zero. Or
96c0: 2c 0a 2a 2a 20 20 20 69 66 20 74 68 65 20 74 61  ,.**   if the ta
96d0: 62 6c 65 20 64 6f 65 73 20 68 61 76 65 20 61 6e  ble does have an
96e0: 20 65 78 74 65 72 6e 61 6c 20 70 72 69 6d 61 72   external primar
96f0: 79 20 6b 65 79 20 69 6e 64 65 78 2c 20 74 68 65  y key index, the
9700: 6e 20 2a 70 69 50 6b 0a 2a 2a 20 20 20 69 73 20  n *piPk.**   is 
9710: 73 65 74 20 74 6f 20 74 68 65 20 72 6f 6f 74 20  set to the root 
9720: 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
9730: 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69  he primary key i
9740: 6e 64 65 78 20 62 65 66 6f 72 65 0a 2a 2a 20 20  ndex before.**  
9750: 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a   returning..**.*
9760: 2a 20 41 4c 47 4f 52 49 54 48 4d 3a 0a 2a 2a 0a  * ALGORITHM:.**.
9770: 2a 2a 20 20 20 69 66 28 20 6e 6f 20 65 6e 74 72  **   if( no entr
9780: 79 20 65 78 69 73 74 73 20 69 6e 20 73 71 6c 69  y exists in sqli
9790: 74 65 5f 6d 61 73 74 65 72 20 29 7b 0a 2a 2a 20  te_master ){.** 
97a0: 20 20 20 20 72 65 74 75 72 6e 20 52 42 55 5f 50      return RBU_P
97b0: 4b 5f 4e 4f 54 41 42 4c 45 0a 2a 2a 20 20 20 7d  K_NOTABLE.**   }
97c0: 65 6c 73 65 20 69 66 28 20 73 71 6c 20 66 6f 72  else if( sql for
97d0: 20 74 68 65 20 65 6e 74 72 79 20 73 74 61 72 74   the entry start
97e0: 73 20 77 69 74 68 20 22 43 52 45 41 54 45 20 56  s with "CREATE V
97f0: 49 52 54 55 41 4c 22 20 29 7b 0a 2a 2a 20 20 20  IRTUAL" ){.**   
9800: 20 20 72 65 74 75 72 6e 20 52 42 55 5f 50 4b 5f    return RBU_PK_
9810: 56 54 41 42 0a 2a 2a 20 20 20 7d 65 6c 73 65 20  VTAB.**   }else 
9820: 69 66 28 20 22 50 52 41 47 4d 41 20 69 6e 64 65  if( "PRAGMA inde
9830: 78 5f 6c 69 73 74 28 29 22 20 66 6f 72 20 74 68  x_list()" for th
9840: 65 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73  e table contains
9850: 20 61 20 22 70 6b 22 20 69 6e 64 65 78 20 29 7b   a "pk" index ){
9860: 0a 2a 2a 20 20 20 20 20 69 66 28 20 74 68 65 20  .**     if( the 
9870: 69 6e 64 65 78 20 74 68 61 74 20 69 73 20 74 68  index that is th
9880: 65 20 70 6b 20 65 78 69 73 74 73 20 69 6e 20 73  e pk exists in s
9890: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 29 7b 0a  qlite_master ){.
98a0: 2a 2a 20 20 20 20 20 20 20 2a 70 69 50 4b 20 3d  **       *piPK =
98b0: 20 72 6f 6f 74 70 61 67 65 20 6f 66 20 74 68 61   rootpage of tha
98c0: 74 20 69 6e 64 65 78 2e 0a 2a 2a 20 20 20 20 20  t index..**     
98d0: 20 20 72 65 74 75 72 6e 20 52 42 55 5f 50 4b 5f    return RBU_PK_
98e0: 45 58 54 45 52 4e 41 4c 0a 2a 2a 20 20 20 20 20  EXTERNAL.**     
98f0: 7d 65 6c 73 65 7b 0a 2a 2a 20 20 20 20 20 20 20  }else{.**       
9900: 72 65 74 75 72 6e 20 52 42 55 5f 50 4b 5f 57 49  return RBU_PK_WI
9910: 54 48 4f 55 54 5f 52 4f 57 49 44 0a 2a 2a 20 20  THOUT_ROWID.**  
9920: 20 20 20 7d 0a 2a 2a 20 20 20 7d 65 6c 73 65 20     }.**   }else 
9930: 69 66 28 20 22 50 52 41 47 4d 41 20 74 61 62 6c  if( "PRAGMA tabl
9940: 65 5f 69 6e 66 6f 28 29 22 20 6c 69 73 74 73 20  e_info()" lists 
9950: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 22 70 6b 22  one or more "pk"
9960: 20 63 6f 6c 75 6d 6e 73 20 29 7b 0a 2a 2a 20 20   columns ){.**  
9970: 20 20 20 72 65 74 75 72 6e 20 52 42 55 5f 50 4b     return RBU_PK
9980: 5f 49 50 4b 0a 2a 2a 20 20 20 7d 65 6c 73 65 7b  _IPK.**   }else{
9990: 0a 2a 2a 20 20 20 20 20 72 65 74 75 72 6e 20 52  .**     return R
99a0: 42 55 5f 50 4b 5f 4e 4f 4e 45 0a 2a 2a 20 20 20  BU_PK_NONE.**   
99b0: 7d 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  }.*/.static void
99c0: 20 72 62 75 54 61 62 6c 65 54 79 70 65 28 0a 20   rbuTableType(. 
99d0: 20 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 0a   sqlite3rbu *p,.
99e0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
99f0: 61 62 2c 0a 20 20 69 6e 74 20 2a 70 65 54 79 70  ab,.  int *peTyp
9a00: 65 2c 0a 20 20 69 6e 74 20 2a 70 69 54 6e 75 6d  e,.  int *piTnum
9a10: 2c 0a 20 20 69 6e 74 20 2a 70 69 50 6b 0a 29 7b  ,.  int *piPk.){
9a20: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 30 29 20 53 45  .  /*.  ** 0) SE
9a30: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
9a40: 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  OM sqlite_master
9a50: 20 77 68 65 72 65 20 6e 61 6d 65 3d 25 51 20 41   where name=%Q A
9a60: 4e 44 20 49 73 56 69 72 74 75 61 6c 28 25 51 29  ND IsVirtual(%Q)
9a70: 0a 20 20 2a 2a 20 31 29 20 50 52 41 47 4d 41 20  .  ** 1) PRAGMA 
9a80: 69 6e 64 65 78 5f 6c 69 73 74 20 3d 20 3f 0a 20  index_list = ?. 
9a90: 20 2a 2a 20 32 29 20 53 45 4c 45 43 54 20 63 6f   ** 2) SELECT co
9aa0: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 73 71 6c 69  unt(*) FROM sqli
9ab0: 74 65 5f 6d 61 73 74 65 72 20 77 68 65 72 65 20  te_master where 
9ac0: 6e 61 6d 65 3d 25 51 20 0a 20 20 2a 2a 20 33 29  name=%Q .  ** 3)
9ad0: 20 50 52 41 47 4d 41 20 74 61 62 6c 65 5f 69 6e   PRAGMA table_in
9ae0: 66 6f 20 3d 20 3f 0a 20 20 2a 2f 0a 20 20 73 71  fo = ?.  */.  sq
9af0: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 61 53 74 6d  lite3_stmt *aStm
9b00: 74 5b 34 5d 20 3d 20 7b 30 2c 20 30 2c 20 30 2c  t[4] = {0, 0, 0,
9b10: 20 30 7d 3b 0a 0a 20 20 2a 70 65 54 79 70 65 20   0};..  *peType 
9b20: 3d 20 52 42 55 5f 50 4b 5f 4e 4f 54 41 42 4c 45  = RBU_PK_NOTABLE
9b30: 3b 0a 20 20 2a 70 69 50 6b 20 3d 20 30 3b 0a 0a  ;.  *piPk = 0;..
9b40: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d    assert( p->rc=
9b50: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
9b60: 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65 46  p->rc = prepareF
9b70: 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72  reeAndCollectErr
9b80: 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 61  or(p->dbMain, &a
9b90: 53 74 6d 74 5b 30 5d 2c 20 26 70 2d 3e 7a 45 72  Stmt[0], &p->zEr
9ba0: 72 6d 73 67 2c 20 0a 20 20 20 20 73 71 6c 69 74  rmsg, .    sqlit
9bb0: 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20  e3_mprintf(.    
9bc0: 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 28 73        "SELECT (s
9bd0: 71 6c 20 4c 49 4b 45 20 27 63 72 65 61 74 65 20  ql LIKE 'create 
9be0: 76 69 72 74 75 61 6c 25 25 27 29 2c 20 72 6f 6f  virtual%%'), roo
9bf0: 74 70 61 67 65 22 0a 20 20 20 20 20 20 20 20 20  tpage".         
9c00: 20 22 20 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f   "  FROM sqlite_
9c10: 6d 61 73 74 65 72 22 0a 20 20 20 20 20 20 20 20  master".        
9c20: 20 20 22 20 57 48 45 52 45 20 6e 61 6d 65 3d 25    " WHERE name=%
9c30: 51 22 2c 20 7a 54 61 62 0a 20 20 29 29 3b 0a 20  Q", zTab.  ));. 
9c40: 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49   if( p->rc!=SQLI
9c50: 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74 65 33  TE_OK || sqlite3
9c60: 5f 73 74 65 70 28 61 53 74 6d 74 5b 30 5d 29 21  _step(aStmt[0])!
9c70: 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
9c80: 20 20 20 2f 2a 20 45 69 74 68 65 72 20 61 6e 20     /* Either an 
9c90: 65 72 72 6f 72 2c 20 6f 72 20 6e 6f 20 73 75 63  error, or no suc
9ca0: 68 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20  h table. */.    
9cb0: 67 6f 74 6f 20 72 62 75 54 61 62 6c 65 54 79 70  goto rbuTableTyp
9cc0: 65 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28  e_end;.  }.  if(
9cd0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
9ce0: 69 6e 74 28 61 53 74 6d 74 5b 30 5d 2c 20 30 29  int(aStmt[0], 0)
9cf0: 20 29 7b 0a 20 20 20 20 2a 70 65 54 79 70 65 20   ){.    *peType 
9d00: 3d 20 52 42 55 5f 50 4b 5f 56 54 41 42 3b 20 20  = RBU_PK_VTAB;  
9d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d20: 20 20 20 2f 2a 20 76 69 72 74 75 61 6c 20 74 61     /* virtual ta
9d30: 62 6c 65 20 2a 2f 0a 20 20 20 20 67 6f 74 6f 20  ble */.    goto 
9d40: 72 62 75 54 61 62 6c 65 54 79 70 65 5f 65 6e 64  rbuTableType_end
9d50: 3b 0a 20 20 7d 0a 20 20 2a 70 69 54 6e 75 6d 20  ;.  }.  *piTnum 
9d60: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
9d70: 5f 69 6e 74 28 61 53 74 6d 74 5b 30 5d 2c 20 31  _int(aStmt[0], 1
9d80: 29 3b 0a 0a 20 20 70 2d 3e 72 63 20 3d 20 70 72  );..  p->rc = pr
9d90: 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c  epareFreeAndColl
9da0: 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 4d 61  ectError(p->dbMa
9db0: 69 6e 2c 20 26 61 53 74 6d 74 5b 31 5d 2c 20 26  in, &aStmt[1], &
9dc0: 70 2d 3e 7a 45 72 72 6d 73 67 2c 20 0a 20 20 20  p->zErrmsg, .   
9dd0: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
9de0: 28 22 50 52 41 47 4d 41 20 69 6e 64 65 78 5f 6c  ("PRAGMA index_l
9df0: 69 73 74 3d 25 51 22 2c 7a 54 61 62 29 0a 20 20  ist=%Q",zTab).  
9e00: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 20 29  );.  if( p->rc )
9e10: 20 67 6f 74 6f 20 72 62 75 54 61 62 6c 65 54 79   goto rbuTableTy
9e20: 70 65 5f 65 6e 64 3b 0a 20 20 77 68 69 6c 65 28  pe_end;.  while(
9e30: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 61 53   sqlite3_step(aS
9e40: 74 6d 74 5b 31 5d 29 3d 3d 53 51 4c 49 54 45 5f  tmt[1])==SQLITE_
9e50: 52 4f 57 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  ROW ){.    const
9e60: 20 75 38 20 2a 7a 4f 72 69 67 20 3d 20 73 71 6c   u8 *zOrig = sql
9e70: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
9e80: 28 61 53 74 6d 74 5b 31 5d 2c 20 33 29 3b 0a 20  (aStmt[1], 3);. 
9e90: 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 7a 49 64     const u8 *zId
9ea0: 78 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  x = sqlite3_colu
9eb0: 6d 6e 5f 74 65 78 74 28 61 53 74 6d 74 5b 31 5d  mn_text(aStmt[1]
9ec0: 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 7a 4f  , 1);.    if( zO
9ed0: 72 69 67 20 26 26 20 7a 49 64 78 20 26 26 20 7a  rig && zIdx && z
9ee0: 4f 72 69 67 5b 30 5d 3d 3d 27 70 27 20 29 7b 0a  Orig[0]=='p' ){.
9ef0: 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 72        p->rc = pr
9f00: 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c  epareFreeAndColl
9f10: 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 4d 61  ectError(p->dbMa
9f20: 69 6e 2c 20 26 61 53 74 6d 74 5b 32 5d 2c 20 26  in, &aStmt[2], &
9f30: 70 2d 3e 7a 45 72 72 6d 73 67 2c 20 0a 20 20 20  p->zErrmsg, .   
9f40: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d         sqlite3_m
9f50: 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  printf(.        
9f60: 20 20 20 20 22 53 45 4c 45 43 54 20 72 6f 6f 74      "SELECT root
9f70: 70 61 67 65 20 46 52 4f 4d 20 73 71 6c 69 74 65  page FROM sqlite
9f80: 5f 6d 61 73 74 65 72 20 57 48 45 52 45 20 6e 61  _master WHERE na
9f90: 6d 65 20 3d 20 25 51 22 2c 20 7a 49 64 78 0a 20  me = %Q", zIdx. 
9fa0: 20 20 20 20 20 29 29 3b 0a 20 20 20 20 20 20 69       ));.      i
9fb0: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
9fc0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  _OK ){.        i
9fd0: 66 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  f( sqlite3_step(
9fe0: 61 53 74 6d 74 5b 32 5d 29 3d 3d 53 51 4c 49 54  aStmt[2])==SQLIT
9ff0: 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 20  E_ROW ){.       
a000: 20 20 20 2a 70 69 50 6b 20 3d 20 73 71 6c 69 74     *piPk = sqlit
a010: 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 61 53  e3_column_int(aS
a020: 74 6d 74 5b 32 5d 2c 20 30 29 3b 0a 20 20 20 20  tmt[2], 0);.    
a030: 20 20 20 20 20 20 2a 70 65 54 79 70 65 20 3d 20        *peType = 
a040: 52 42 55 5f 50 4b 5f 45 58 54 45 52 4e 41 4c 3b  RBU_PK_EXTERNAL;
a050: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
a060: 20 20 20 20 20 20 20 20 20 20 2a 70 65 54 79 70            *peTyp
a070: 65 20 3d 20 52 42 55 5f 50 4b 5f 57 49 54 48 4f  e = RBU_PK_WITHO
a080: 55 54 5f 52 4f 57 49 44 3b 0a 20 20 20 20 20 20  UT_ROWID;.      
a090: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
a0a0: 20 20 67 6f 74 6f 20 72 62 75 54 61 62 6c 65 54    goto rbuTableT
a0b0: 79 70 65 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20  ype_end;.    }. 
a0c0: 20 7d 0a 0a 20 20 70 2d 3e 72 63 20 3d 20 70 72   }..  p->rc = pr
a0d0: 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c  epareFreeAndColl
a0e0: 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 4d 61  ectError(p->dbMa
a0f0: 69 6e 2c 20 26 61 53 74 6d 74 5b 33 5d 2c 20 26  in, &aStmt[3], &
a100: 70 2d 3e 7a 45 72 72 6d 73 67 2c 20 0a 20 20 20  p->zErrmsg, .   
a110: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
a120: 28 22 50 52 41 47 4d 41 20 74 61 62 6c 65 5f 69  ("PRAGMA table_i
a130: 6e 66 6f 3d 25 51 22 2c 7a 54 61 62 29 0a 20 20  nfo=%Q",zTab).  
a140: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  );.  if( p->rc==
a150: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
a160: 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33 5f   while( sqlite3_
a170: 73 74 65 70 28 61 53 74 6d 74 5b 33 5d 29 3d 3d  step(aStmt[3])==
a180: 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
a190: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
a1a0: 63 6f 6c 75 6d 6e 5f 69 6e 74 28 61 53 74 6d 74  column_int(aStmt
a1b0: 5b 33 5d 2c 35 29 3e 30 20 29 7b 0a 20 20 20 20  [3],5)>0 ){.    
a1c0: 20 20 20 20 2a 70 65 54 79 70 65 20 3d 20 52 42      *peType = RB
a1d0: 55 5f 50 4b 5f 49 50 4b 3b 20 20 20 20 20 20 20  U_PK_IPK;       
a1e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 65 78 70 6c           /* expl
a1f0: 69 63 69 74 20 49 50 4b 20 63 6f 6c 75 6d 6e 20  icit IPK column 
a200: 2a 2f 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  */.        goto 
a210: 72 62 75 54 61 62 6c 65 54 79 70 65 5f 65 6e 64  rbuTableType_end
a220: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
a230: 20 20 20 20 2a 70 65 54 79 70 65 20 3d 20 52 42      *peType = RB
a240: 55 5f 50 4b 5f 4e 4f 4e 45 3b 0a 20 20 7d 0a 0a  U_PK_NONE;.  }..
a250: 72 62 75 54 61 62 6c 65 54 79 70 65 5f 65 6e 64  rbuTableType_end
a260: 3a 20 7b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64  : {.    unsigned
a270: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
a280: 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53  i=0; i<sizeof(aS
a290: 74 6d 74 29 2f 73 69 7a 65 6f 66 28 61 53 74 6d  tmt)/sizeof(aStm
a2a0: 74 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  t[0]); i++){.   
a2b0: 20 20 20 72 62 75 46 69 6e 61 6c 69 7a 65 28 70     rbuFinalize(p
a2c0: 2c 20 61 53 74 6d 74 5b 69 5d 29 3b 0a 20 20 20  , aStmt[i]);.   
a2d0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
a2e0: 54 68 69 73 20 69 73 20 61 20 68 65 6c 70 65 72  This is a helper
a2f0: 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 72 62   function for rb
a300: 75 4f 62 6a 49 74 65 72 43 61 63 68 65 54 61 62  uObjIterCacheTab
a310: 6c 65 49 6e 66 6f 28 29 2e 20 49 74 20 70 6f 70  leInfo(). It pop
a320: 75 6c 61 74 65 73 0a 2a 2a 20 74 68 65 20 70 49  ulates.** the pI
a330: 74 65 72 2d 3e 61 62 49 6e 64 65 78 65 64 5b 5d  ter->abIndexed[]
a340: 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69   array..*/.stati
a350: 63 20 76 6f 69 64 20 72 62 75 4f 62 6a 49 74 65  c void rbuObjIte
a360: 72 43 61 63 68 65 49 6e 64 65 78 65 64 43 6f 6c  rCacheIndexedCol
a370: 73 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c  s(sqlite3rbu *p,
a380: 20 52 62 75 4f 62 6a 49 74 65 72 20 2a 70 49 74   RbuObjIter *pIt
a390: 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  er){.  sqlite3_s
a3a0: 74 6d 74 20 2a 70 4c 69 73 74 20 3d 20 30 3b 0a  tmt *pList = 0;.
a3b0: 20 20 69 6e 74 20 62 49 6e 64 65 78 20 3d 20 30    int bIndex = 0
a3c0: 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  ;..  if( p->rc==
a3d0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
a3e0: 20 6d 65 6d 63 70 79 28 70 49 74 65 72 2d 3e 61   memcpy(pIter->a
a3f0: 62 49 6e 64 65 78 65 64 2c 20 70 49 74 65 72 2d  bIndexed, pIter-
a400: 3e 61 62 54 62 6c 50 6b 2c 20 73 69 7a 65 6f 66  >abTblPk, sizeof
a410: 28 75 38 29 2a 70 49 74 65 72 2d 3e 6e 54 62 6c  (u8)*pIter->nTbl
a420: 43 6f 6c 29 3b 0a 20 20 20 20 70 2d 3e 72 63 20  Col);.    p->rc 
a430: 3d 20 70 72 65 70 61 72 65 46 72 65 65 41 6e 64  = prepareFreeAnd
a440: 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e  CollectError(p->
a450: 64 62 4d 61 69 6e 2c 20 26 70 4c 69 73 74 2c 20  dbMain, &pList, 
a460: 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 0a 20 20 20  &p->zErrmsg,.   
a470: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72       sqlite3_mpr
a480: 69 6e 74 66 28 22 50 52 41 47 4d 41 20 6d 61 69  intf("PRAGMA mai
a490: 6e 2e 69 6e 64 65 78 5f 6c 69 73 74 20 3d 20 25  n.index_list = %
a4a0: 51 22 2c 20 70 49 74 65 72 2d 3e 7a 54 62 6c 29  Q", pIter->zTbl)
a4b0: 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 70  .    );.  }..  p
a4c0: 49 74 65 72 2d 3e 6e 49 6e 64 65 78 20 3d 20 30  Iter->nIndex = 0
a4d0: 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63  ;.  while( p->rc
a4e0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53  ==SQLITE_OK && S
a4f0: 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74  QLITE_ROW==sqlit
a500: 65 33 5f 73 74 65 70 28 70 4c 69 73 74 29 20 29  e3_step(pList) )
a510: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
a520: 20 2a 7a 49 64 78 20 3d 20 28 63 6f 6e 73 74 20   *zIdx = (const 
a530: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
a540: 6c 75 6d 6e 5f 74 65 78 74 28 70 4c 69 73 74 2c  lumn_text(pList,
a550: 20 31 29 3b 0a 20 20 20 20 69 6e 74 20 62 50 61   1);.    int bPa
a560: 72 74 69 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f  rtial = sqlite3_
a570: 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 4c 69 73 74  column_int(pList
a580: 2c 20 34 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 4);.    sqlite
a590: 33 5f 73 74 6d 74 20 2a 70 58 49 6e 66 6f 20 3d  3_stmt *pXInfo =
a5a0: 20 30 3b 0a 20 20 20 20 69 66 28 20 7a 49 64 78   0;.    if( zIdx
a5b0: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
a5c0: 20 69 66 28 20 62 50 61 72 74 69 61 6c 20 29 7b   if( bPartial ){
a5d0: 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 49  .      memset(pI
a5e0: 74 65 72 2d 3e 61 62 49 6e 64 65 78 65 64 2c 20  ter->abIndexed, 
a5f0: 30 78 30 31 2c 20 73 69 7a 65 6f 66 28 75 38 29  0x01, sizeof(u8)
a600: 2a 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 29  *pIter->nTblCol)
a610: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 72  ;.    }.    p->r
a620: 63 20 3d 20 70 72 65 70 61 72 65 46 72 65 65 41  c = prepareFreeA
a630: 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70  ndCollectError(p
a640: 2d 3e 64 62 4d 61 69 6e 2c 20 26 70 58 49 6e 66  ->dbMain, &pXInf
a650: 6f 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 0a  o, &p->zErrmsg,.
a660: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
a670: 6d 70 72 69 6e 74 66 28 22 50 52 41 47 4d 41 20  mprintf("PRAGMA 
a680: 6d 61 69 6e 2e 69 6e 64 65 78 5f 78 69 6e 66 6f  main.index_xinfo
a690: 20 3d 20 25 51 22 2c 20 7a 49 64 78 29 0a 20 20   = %Q", zIdx).  
a6a0: 20 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20    );.    while( 
a6b0: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
a6c0: 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d   && SQLITE_ROW==
a6d0: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 58 49  sqlite3_step(pXI
a6e0: 6e 66 6f 29 20 29 7b 0a 20 20 20 20 20 20 69 6e  nfo) ){.      in
a6f0: 74 20 69 43 69 64 20 3d 20 73 71 6c 69 74 65 33  t iCid = sqlite3
a700: 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 58 49 6e  _column_int(pXIn
a710: 66 6f 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66  fo, 1);.      if
a720: 28 20 69 43 69 64 3e 3d 30 20 29 20 70 49 74 65  ( iCid>=0 ) pIte
a730: 72 2d 3e 61 62 49 6e 64 65 78 65 64 5b 69 43 69  r->abIndexed[iCi
a740: 64 5d 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  d] = 1;.    }.  
a750: 20 20 72 62 75 46 69 6e 61 6c 69 7a 65 28 70 2c    rbuFinalize(p,
a760: 20 70 58 49 6e 66 6f 29 3b 0a 20 20 20 20 62 49   pXInfo);.    bI
a770: 6e 64 65 78 20 3d 20 31 3b 0a 20 20 20 20 70 49  ndex = 1;.    pI
a780: 74 65 72 2d 3e 6e 49 6e 64 65 78 2b 2b 3b 0a 20  ter->nIndex++;. 
a790: 20 7d 0a 0a 20 20 69 66 28 20 70 49 74 65 72 2d   }..  if( pIter-
a7a0: 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 57  >eType==RBU_PK_W
a7b0: 49 54 48 4f 55 54 5f 52 4f 57 49 44 20 29 7b 0a  ITHOUT_ROWID ){.
a7c0: 20 20 20 20 2f 2a 20 22 50 52 41 47 4d 41 20 69      /* "PRAGMA i
a7d0: 6e 64 65 78 5f 6c 69 73 74 22 20 69 6e 63 6c 75  ndex_list" inclu
a7e0: 64 65 73 20 74 68 65 20 6d 61 69 6e 20 50 4b 20  des the main PK 
a7f0: 62 2d 74 72 65 65 20 2a 2f 0a 20 20 20 20 70 49  b-tree */.    pI
a800: 74 65 72 2d 3e 6e 49 6e 64 65 78 2d 2d 3b 0a 20  ter->nIndex--;. 
a810: 20 7d 0a 0a 20 20 72 62 75 46 69 6e 61 6c 69 7a   }..  rbuFinaliz
a820: 65 28 70 2c 20 70 4c 69 73 74 29 3b 0a 20 20 69  e(p, pList);.  i
a830: 66 28 20 62 49 6e 64 65 78 3d 3d 30 20 29 20 70  f( bIndex==0 ) p
a840: 49 74 65 72 2d 3e 61 62 49 6e 64 65 78 65 64 20  Iter->abIndexed 
a850: 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49  = 0;.}.../*.** I
a860: 66 20 74 68 65 79 20 61 72 65 20 6e 6f 74 20 61  f they are not a
a870: 6c 72 65 61 64 79 20 70 6f 70 75 6c 61 74 65 64  lready populated
a880: 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 70  , populate the p
a890: 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 5d  Iter->azTblCol[]
a8a0: 2c 0a 2a 2a 20 70 49 74 65 72 2d 3e 61 62 54 62  ,.** pIter->abTb
a8b0: 6c 50 6b 5b 5d 2c 20 70 49 74 65 72 2d 3e 6e 54  lPk[], pIter->nT
a8c0: 62 6c 43 6f 6c 20 61 6e 64 20 70 49 74 65 72 2d  blCol and pIter-
a8d0: 3e 62 52 6f 77 69 64 20 76 61 72 69 61 62 6c 65  >bRowid variable
a8e0: 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 0a 2a  s according to.*
a8f0: 2a 20 74 68 65 20 74 61 62 6c 65 20 28 6e 6f 74  * the table (not
a900: 20 69 6e 64 65 78 29 20 74 68 61 74 20 74 68 65   index) that the
a910: 20 69 74 65 72 61 74 6f 72 20 63 75 72 72 65 6e   iterator curren
a920: 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a  tly points to..*
a930: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
a940: 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73  TE_OK if success
a950: 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74  ful, or an SQLit
a960: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68  e error code oth
a970: 65 72 77 69 73 65 2e 20 49 66 0a 2a 2a 20 61 6e  erwise. If.** an
a980: 20 65 72 72 6f 72 20 64 6f 65 73 20 6f 63 63 75   error does occu
a990: 72 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  r, an error code
a9a0: 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61   and error messa
a9b0: 67 65 20 61 72 65 20 61 6c 73 6f 20 6c 65 66 74  ge are also left
a9c0: 20 69 6e 20 0a 2a 2a 20 74 68 65 20 52 42 55 20   in .** the RBU 
a9d0: 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  handle..*/.stati
a9e0: 63 20 69 6e 74 20 72 62 75 4f 62 6a 49 74 65 72  c int rbuObjIter
a9f0: 43 61 63 68 65 54 61 62 6c 65 49 6e 66 6f 28 73  CacheTableInfo(s
aa00: 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 52 62  qlite3rbu *p, Rb
aa10: 75 4f 62 6a 49 74 65 72 20 2a 70 49 74 65 72 29  uObjIter *pIter)
aa20: 7b 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 61  {.  if( pIter->a
aa30: 7a 54 62 6c 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20  zTblCol==0 ){.  
aa40: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
aa50: 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 69  pStmt = 0;.    i
aa60: 6e 74 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  nt nCol = 0;.   
aa70: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
aa80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
aa90: 2a 20 66 6f 72 28 29 20 6c 6f 6f 70 20 69 74 65  * for() loop ite
aaa0: 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a  rator variable *
aab0: 2f 0a 20 20 20 20 69 6e 74 20 62 52 62 75 52 6f  /.    int bRbuRo
aac0: 77 69 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20  wid = 0;        
aad0: 20 20 20 20 2f 2a 20 49 66 20 69 6e 70 75 74 20      /* If input 
aae0: 74 61 62 6c 65 20 68 61 73 20 63 6f 6c 75 6d 6e  table has column
aaf0: 20 22 72 62 75 5f 72 6f 77 69 64 22 20 2a 2f 0a   "rbu_rowid" */.
ab00: 20 20 20 20 69 6e 74 20 69 4f 72 64 65 72 20 3d      int iOrder =
ab10: 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 54 6e 75   0;.    int iTnu
ab20: 6d 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 46  m = 0;..    /* F
ab30: 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 74 79  igure out the ty
ab40: 70 65 20 6f 66 20 74 61 62 6c 65 20 74 68 69 73  pe of table this
ab50: 20 73 74 65 70 20 77 69 6c 6c 20 64 65 61 6c 20   step will deal 
ab60: 77 69 74 68 2e 20 2a 2f 0a 20 20 20 20 61 73 73  with. */.    ass
ab70: 65 72 74 28 20 70 49 74 65 72 2d 3e 65 54 79 70  ert( pIter->eTyp
ab80: 65 3d 3d 30 20 29 3b 0a 20 20 20 20 72 62 75 54  e==0 );.    rbuT
ab90: 61 62 6c 65 54 79 70 65 28 70 2c 20 70 49 74 65  ableType(p, pIte
aba0: 72 2d 3e 7a 54 62 6c 2c 20 26 70 49 74 65 72 2d  r->zTbl, &pIter-
abb0: 3e 65 54 79 70 65 2c 20 26 69 54 6e 75 6d 2c 20  >eType, &iTnum, 
abc0: 26 70 49 74 65 72 2d 3e 69 50 6b 54 6e 75 6d 29  &pIter->iPkTnum)
abd0: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d  ;.    if( p->rc=
abe0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 49  =SQLITE_OK && pI
abf0: 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f  ter->eType==RBU_
ac00: 50 4b 5f 4e 4f 54 41 42 4c 45 20 29 7b 0a 20 20  PK_NOTABLE ){.  
ac10: 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
ac20: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
ac30: 70 2d 3e 7a 45 72 72 6d 73 67 20 3d 20 73 71 6c  p->zErrmsg = sql
ac40: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 6e 6f  ite3_mprintf("no
ac50: 20 73 75 63 68 20 74 61 62 6c 65 3a 20 25 73 22   such table: %s"
ac60: 2c 20 70 49 74 65 72 2d 3e 7a 54 62 6c 29 3b 0a  , pIter->zTbl);.
ac70: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d      }.    if( p-
ac80: 3e 72 63 20 29 20 72 65 74 75 72 6e 20 70 2d 3e  >rc ) return p->
ac90: 72 63 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65  rc;.    if( pIte
aca0: 72 2d 3e 7a 49 64 78 3d 3d 30 20 29 20 70 49 74  r->zIdx==0 ) pIt
acb0: 65 72 2d 3e 69 54 6e 75 6d 20 3d 20 69 54 6e 75  er->iTnum = iTnu
acc0: 6d 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  m;..    assert( 
acd0: 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42  pIter->eType==RB
ace0: 55 5f 50 4b 5f 4e 4f 4e 45 20 7c 7c 20 70 49 74  U_PK_NONE || pIt
acf0: 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50  er->eType==RBU_P
ad00: 4b 5f 49 50 4b 20 0a 20 20 20 20 20 20 20 20 20  K_IPK .         
ad10: 7c 7c 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d  || pIter->eType=
ad20: 3d 52 42 55 5f 50 4b 5f 45 58 54 45 52 4e 41 4c  =RBU_PK_EXTERNAL
ad30: 20 7c 7c 20 70 49 74 65 72 2d 3e 65 54 79 70 65   || pIter->eType
ad40: 3d 3d 52 42 55 5f 50 4b 5f 57 49 54 48 4f 55 54  ==RBU_PK_WITHOUT
ad50: 5f 52 4f 57 49 44 0a 20 20 20 20 20 20 20 20 20  _ROWID.         
ad60: 7c 7c 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d  || pIter->eType=
ad70: 3d 52 42 55 5f 50 4b 5f 56 54 41 42 0a 20 20 20  =RBU_PK_VTAB.   
ad80: 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 50 6f 70 75   );..    /* Popu
ad90: 6c 61 74 65 20 74 68 65 20 61 7a 54 62 6c 43 6f  late the azTblCo
ada0: 6c 5b 5d 20 61 6e 64 20 6e 54 62 6c 43 6f 6c 20  l[] and nTblCol 
adb0: 76 61 72 69 61 62 6c 65 73 20 62 61 73 65 64 20  variables based 
adc0: 6f 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 73 0a 20  on the columns. 
add0: 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 69 6e 70     ** of the inp
ade0: 75 74 20 74 61 62 6c 65 2e 20 49 67 6e 6f 72 65  ut table. Ignore
adf0: 20 61 6e 79 20 69 6e 70 75 74 20 74 61 62 6c 65   any input table
ae00: 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 62 65   columns that be
ae10: 67 69 6e 20 77 69 74 68 0a 20 20 20 20 2a 2a 20  gin with.    ** 
ae20: 22 72 62 75 5f 22 2e 20 20 2a 2f 0a 20 20 20 20  "rbu_".  */.    
ae30: 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65 46  p->rc = prepareF
ae40: 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72  reeAndCollectErr
ae50: 6f 72 28 70 2d 3e 64 62 52 62 75 2c 20 26 70 53  or(p->dbRbu, &pS
ae60: 74 6d 74 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67  tmt, &p->zErrmsg
ae70: 2c 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  , .        sqlit
ae80: 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45  e3_mprintf("SELE
ae90: 43 54 20 2a 20 46 52 4f 4d 20 27 25 71 27 22 2c  CT * FROM '%q'",
aea0: 20 70 49 74 65 72 2d 3e 7a 44 61 74 61 54 62 6c   pIter->zDataTbl
aeb0: 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  ).    );.    if(
aec0: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
aed0: 4b 20 29 7b 0a 20 20 20 20 20 20 6e 43 6f 6c 20  K ){.      nCol 
aee0: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
aef0: 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20  _count(pStmt);. 
af00: 20 20 20 20 20 72 62 75 41 6c 6c 6f 63 61 74 65       rbuAllocate
af10: 49 74 65 72 41 72 72 61 79 73 28 70 2c 20 70 49  IterArrays(p, pI
af20: 74 65 72 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20  ter, nCol);.    
af30: 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 70  }.    for(i=0; p
af40: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
af50: 26 26 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  && i<nCol; i++){
af60: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
af70: 72 20 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73  r *zName = (cons
af80: 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
af90: 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53 74 6d  column_name(pStm
afa0: 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28  t, i);.      if(
afb0: 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d   sqlite3_strnicm
afc0: 70 28 22 72 62 75 5f 22 2c 20 7a 4e 61 6d 65 2c  p("rbu_", zName,
afd0: 20 34 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63   4) ){.        c
afe0: 68 61 72 20 2a 7a 43 6f 70 79 20 3d 20 72 62 75  har *zCopy = rbu
aff0: 53 74 72 6e 64 75 70 28 7a 4e 61 6d 65 2c 20 26  Strndup(zName, &
b000: 70 2d 3e 72 63 29 3b 0a 20 20 20 20 20 20 20 20  p->rc);.        
b010: 70 49 74 65 72 2d 3e 61 69 53 72 63 4f 72 64 65  pIter->aiSrcOrde
b020: 72 5b 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c  r[pIter->nTblCol
b030: 5d 20 3d 20 70 49 74 65 72 2d 3e 6e 54 62 6c 43  ] = pIter->nTblC
b040: 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65  ol;.        pIte
b050: 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 70 49 74 65  r->azTblCol[pIte
b060: 72 2d 3e 6e 54 62 6c 43 6f 6c 2b 2b 5d 20 3d 20  r->nTblCol++] = 
b070: 7a 43 6f 70 79 3b 0a 20 20 20 20 20 20 7d 0a 20  zCopy;.      }. 
b080: 20 20 20 20 20 65 6c 73 65 20 69 66 28 20 30 3d       else if( 0=
b090: 3d 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70  =sqlite3_stricmp
b0a0: 28 22 72 62 75 5f 72 6f 77 69 64 22 2c 20 7a 4e  ("rbu_rowid", zN
b0b0: 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ame) ){.        
b0c0: 62 52 62 75 52 6f 77 69 64 20 3d 20 31 3b 0a 20  bRbuRowid = 1;. 
b0d0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
b0e0: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
b0f0: 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 70 53  e(pStmt);.    pS
b100: 74 6d 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66  tmt = 0;..    if
b110: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
b120: 4f 4b 0a 20 20 20 20 20 26 26 20 72 62 75 49 73  OK.     && rbuIs
b130: 56 61 63 75 75 6d 28 70 29 3d 3d 30 0a 20 20 20  Vacuum(p)==0.   
b140: 20 20 26 26 20 62 52 62 75 52 6f 77 69 64 21 3d    && bRbuRowid!=
b150: 28 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52  (pIter->eType==R
b160: 42 55 5f 50 4b 5f 56 54 41 42 20 7c 7c 20 70 49  BU_PK_VTAB || pI
b170: 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f  ter->eType==RBU_
b180: 50 4b 5f 4e 4f 4e 45 29 0a 20 20 20 20 29 7b 0a  PK_NONE).    ){.
b190: 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51        p->rc = SQ
b1a0: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
b1b0: 20 20 70 2d 3e 7a 45 72 72 6d 73 67 20 3d 20 73    p->zErrmsg = s
b1c0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a  qlite3_mprintf(.
b1d0: 20 20 20 20 20 20 20 20 20 20 22 74 61 62 6c 65            "table
b1e0: 20 25 71 20 25 73 20 72 62 75 5f 72 6f 77 69 64   %q %s rbu_rowid
b1f0: 20 63 6f 6c 75 6d 6e 22 2c 20 70 49 74 65 72 2d   column", pIter-
b200: 3e 7a 44 61 74 61 54 62 6c 2c 0a 20 20 20 20 20  >zDataTbl,.     
b210: 20 20 20 20 20 28 62 52 62 75 52 6f 77 69 64 20       (bRbuRowid 
b220: 3f 20 22 6d 61 79 20 6e 6f 74 20 68 61 76 65 22  ? "may not have"
b230: 20 3a 20 22 72 65 71 75 69 72 65 73 22 29 0a 20   : "requires"). 
b240: 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20       );.    }.. 
b250: 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74     /* Check that
b260: 20 61 6c 6c 20 6e 6f 6e 2d 48 49 44 44 45 4e 20   all non-HIDDEN 
b270: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 64  columns in the d
b280: 65 73 74 69 6e 61 74 69 6f 6e 20 74 61 62 6c 65  estination table
b290: 20 61 72 65 20 61 6c 73 6f 0a 20 20 20 20 2a 2a   are also.    **
b2a0: 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20   present in the 
b2b0: 69 6e 70 75 74 20 74 61 62 6c 65 2e 20 50 6f 70  input table. Pop
b2c0: 75 6c 61 74 65 20 74 68 65 20 61 62 54 62 6c 50  ulate the abTblP
b2d0: 6b 5b 5d 2c 20 61 7a 54 62 6c 54 79 70 65 5b 5d  k[], azTblType[]
b2e0: 20 61 6e 64 0a 20 20 20 20 2a 2a 20 61 69 54 62   and.    ** aiTb
b2f0: 6c 4f 72 64 65 72 5b 5d 20 61 72 72 61 79 73 20  lOrder[] arrays 
b300: 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65  at the same time
b310: 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d  .  */.    if( p-
b320: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
b330: 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20  {.      p->rc = 
b340: 70 72 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f  prepareFreeAndCo
b350: 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62  llectError(p->db
b360: 4d 61 69 6e 2c 20 26 70 53 74 6d 74 2c 20 26 70  Main, &pStmt, &p
b370: 2d 3e 7a 45 72 72 6d 73 67 2c 20 0a 20 20 20 20  ->zErrmsg, .    
b380: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70        sqlite3_mp
b390: 72 69 6e 74 66 28 22 50 52 41 47 4d 41 20 74 61  rintf("PRAGMA ta
b3a0: 62 6c 65 5f 69 6e 66 6f 28 25 51 29 22 2c 20 70  ble_info(%Q)", p
b3b0: 49 74 65 72 2d 3e 7a 54 62 6c 29 0a 20 20 20 20  Iter->zTbl).    
b3c0: 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77    );.    }.    w
b3d0: 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  hile( p->rc==SQL
b3e0: 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45  ITE_OK && SQLITE
b3f0: 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74  _ROW==sqlite3_st
b400: 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20  ep(pStmt) ){.   
b410: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
b420: 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68  Name = (const ch
b430: 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
b440: 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31  mn_text(pStmt, 1
b450: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 4e 61  );.      if( zNa
b460: 6d 65 3d 3d 30 20 29 20 62 72 65 61 6b 3b 20 20  me==0 ) break;  
b470: 2f 2a 20 41 6e 20 4f 4f 4d 20 2d 20 66 69 6e 61  /* An OOM - fina
b480: 6c 69 7a 65 28 29 20 62 65 6c 6f 77 20 72 65 74  lize() below ret
b490: 75 72 6e 73 20 53 5f 4e 4f 4d 45 4d 20 2a 2f 0a  urns S_NOMEM */.
b4a0: 20 20 20 20 20 20 66 6f 72 28 69 3d 69 4f 72 64        for(i=iOrd
b4b0: 65 72 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 54 62  er; i<pIter->nTb
b4c0: 6c 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lCol; i++){.    
b4d0: 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63 6d      if( 0==strcm
b4e0: 70 28 7a 4e 61 6d 65 2c 20 70 49 74 65 72 2d 3e  p(zName, pIter->
b4f0: 61 7a 54 62 6c 43 6f 6c 5b 69 5d 29 20 29 20 62  azTblCol[i]) ) b
b500: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
b510: 20 20 20 20 69 66 28 20 69 3d 3d 70 49 74 65 72      if( i==pIter
b520: 2d 3e 6e 54 62 6c 43 6f 6c 20 29 7b 0a 20 20 20  ->nTblCol ){.   
b530: 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c       p->rc = SQL
b540: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
b550: 20 20 20 70 2d 3e 7a 45 72 72 6d 73 67 20 3d 20     p->zErrmsg = 
b560: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
b570: 22 63 6f 6c 75 6d 6e 20 6d 69 73 73 69 6e 67 20  "column missing 
b580: 66 72 6f 6d 20 25 71 3a 20 25 73 22 2c 0a 20 20  from %q: %s",.  
b590: 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d            pIter-
b5a0: 3e 7a 44 61 74 61 54 62 6c 2c 20 7a 4e 61 6d 65  >zDataTbl, zName
b5b0: 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
b5c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
b5d0: 20 69 6e 74 20 69 50 6b 20 3d 20 73 71 6c 69 74   int iPk = sqlit
b5e0: 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53  e3_column_int(pS
b5f0: 74 6d 74 2c 20 35 29 3b 0a 20 20 20 20 20 20 20  tmt, 5);.       
b600: 20 69 6e 74 20 62 4e 6f 74 4e 75 6c 6c 20 3d 20   int bNotNull = 
b610: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
b620: 6e 74 28 70 53 74 6d 74 2c 20 33 29 3b 0a 20 20  nt(pStmt, 3);.  
b630: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
b640: 20 2a 7a 54 79 70 65 20 3d 20 28 63 6f 6e 73 74   *zType = (const
b650: 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63   char*)sqlite3_c
b660: 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74  olumn_text(pStmt
b670: 2c 20 32 29 3b 0a 0a 20 20 20 20 20 20 20 20 69  , 2);..        i
b680: 66 28 20 69 21 3d 69 4f 72 64 65 72 20 29 7b 0a  f( i!=iOrder ){.
b690: 20 20 20 20 20 20 20 20 20 20 53 57 41 50 28 69            SWAP(i
b6a0: 6e 74 2c 20 70 49 74 65 72 2d 3e 61 69 53 72 63  nt, pIter->aiSrc
b6b0: 4f 72 64 65 72 5b 69 5d 2c 20 70 49 74 65 72 2d  Order[i], pIter-
b6c0: 3e 61 69 53 72 63 4f 72 64 65 72 5b 69 4f 72 64  >aiSrcOrder[iOrd
b6d0: 65 72 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  er]);.          
b6e0: 53 57 41 50 28 63 68 61 72 2a 2c 20 70 49 74 65  SWAP(char*, pIte
b6f0: 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69 5d 2c 20  r->azTblCol[i], 
b700: 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b  pIter->azTblCol[
b710: 69 4f 72 64 65 72 5d 29 3b 0a 20 20 20 20 20 20  iOrder]);.      
b720: 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 70 49 74    }..        pIt
b730: 65 72 2d 3e 61 7a 54 62 6c 54 79 70 65 5b 69 4f  er->azTblType[iO
b740: 72 64 65 72 5d 20 3d 20 72 62 75 53 74 72 6e 64  rder] = rbuStrnd
b750: 75 70 28 7a 54 79 70 65 2c 20 26 70 2d 3e 72 63  up(zType, &p->rc
b760: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
b770: 74 28 20 69 50 6b 3e 3d 30 20 29 3b 0a 20 20 20  t( iPk>=0 );.   
b780: 20 20 20 20 20 70 49 74 65 72 2d 3e 61 62 54 62       pIter->abTb
b790: 6c 50 6b 5b 69 4f 72 64 65 72 5d 20 3d 20 28 75  lPk[iOrder] = (u
b7a0: 38 29 69 50 6b 3b 0a 20 20 20 20 20 20 20 20 70  8)iPk;.        p
b7b0: 49 74 65 72 2d 3e 61 62 4e 6f 74 4e 75 6c 6c 5b  Iter->abNotNull[
b7c0: 69 4f 72 64 65 72 5d 20 3d 20 28 75 38 29 62 4e  iOrder] = (u8)bN
b7d0: 6f 74 4e 75 6c 6c 20 7c 7c 20 28 69 50 6b 21 3d  otNull || (iPk!=
b7e0: 30 29 3b 0a 20 20 20 20 20 20 20 20 69 4f 72 64  0);.        iOrd
b7f0: 65 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  er++;.      }.  
b800: 20 20 7d 0a 0a 20 20 20 20 72 62 75 46 69 6e 61    }..    rbuFina
b810: 6c 69 7a 65 28 70 2c 20 70 53 74 6d 74 29 3b 0a  lize(p, pStmt);.
b820: 20 20 20 20 72 62 75 4f 62 6a 49 74 65 72 43 61      rbuObjIterCa
b830: 63 68 65 49 6e 64 65 78 65 64 43 6f 6c 73 28 70  cheIndexedCols(p
b840: 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 61 73  , pIter);.    as
b850: 73 65 72 74 28 20 70 49 74 65 72 2d 3e 65 54 79  sert( pIter->eTy
b860: 70 65 21 3d 52 42 55 5f 50 4b 5f 56 54 41 42 20  pe!=RBU_PK_VTAB 
b870: 7c 7c 20 70 49 74 65 72 2d 3e 61 62 49 6e 64 65  || pIter->abInde
b880: 78 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  xed==0 );.    as
b890: 73 65 72 74 28 20 70 49 74 65 72 2d 3e 65 54 79  sert( pIter->eTy
b8a0: 70 65 21 3d 52 42 55 5f 50 4b 5f 56 54 41 42 20  pe!=RBU_PK_VTAB 
b8b0: 7c 7c 20 70 49 74 65 72 2d 3e 6e 49 6e 64 65 78  || pIter->nIndex
b8c0: 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  ==0 );.  }..  re
b8d0: 74 75 72 6e 20 70 2d 3e 72 63 3b 0a 7d 0a 0a 2f  turn p->rc;.}../
b8e0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
b8f0: 6f 6e 20 63 6f 6e 73 74 72 75 63 74 73 20 61 6e  on constructs an
b900: 64 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e  d returns a poin
b910: 74 65 72 20 74 6f 20 61 20 6e 75 6c 2d 74 65 72  ter to a nul-ter
b920: 6d 69 6e 61 74 65 64 20 0a 2a 2a 20 73 74 72 69  minated .** stri
b930: 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 73 6f  ng containing so
b940: 6d 65 20 53 51 4c 20 63 6c 61 75 73 65 20 6f 72  me SQL clause or
b950: 20 6c 69 73 74 20 62 61 73 65 64 20 6f 6e 20 6f   list based on o
b960: 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68  ne or more of th
b970: 65 20 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6e 61 6d  e .** column nam
b980: 65 73 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f  es currently sto
b990: 72 65 64 20 69 6e 20 74 68 65 20 70 49 74 65 72  red in the pIter
b9a0: 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 5d 20 61 72 72  ->azTblCol[] arr
b9b0: 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  ay..*/.static ch
b9c0: 61 72 20 2a 72 62 75 4f 62 6a 49 74 65 72 47 65  ar *rbuObjIterGe
b9d0: 74 43 6f 6c 6c 69 73 74 28 0a 20 20 73 71 6c 69  tCollist(.  sqli
b9e0: 74 65 33 72 62 75 20 2a 70 2c 20 20 20 20 20 20  te3rbu *p,      
b9f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
ba00: 42 55 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 52  BU object */.  R
ba10: 62 75 4f 62 6a 49 74 65 72 20 2a 70 49 74 65 72  buObjIter *pIter
ba20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ba30: 2a 20 4f 62 6a 65 63 74 20 69 74 65 72 61 74 6f  * Object iterato
ba40: 72 20 66 6f 72 20 63 6f 6c 75 6d 6e 20 6e 61 6d  r for column nam
ba50: 65 73 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20  es */.){.  char 
ba60: 2a 7a 4c 69 73 74 20 3d 20 30 3b 0a 20 20 63 6f  *zList = 0;.  co
ba70: 6e 73 74 20 63 68 61 72 20 2a 7a 53 65 70 20 3d  nst char *zSep =
ba80: 20 22 22 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20   "";.  int i;.  
ba90: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72  for(i=0; i<pIter
baa0: 2d 3e 6e 54 62 6c 43 6f 6c 3b 20 69 2b 2b 29 7b  ->nTblCol; i++){
bab0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
bac0: 2a 7a 20 3d 20 70 49 74 65 72 2d 3e 61 7a 54 62  *z = pIter->azTb
bad0: 6c 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 7a 4c 69  lCol[i];.    zLi
bae0: 73 74 20 3d 20 72 62 75 4d 50 72 69 6e 74 66 28  st = rbuMPrintf(
baf0: 70 2c 20 22 25 7a 25 73 5c 22 25 77 5c 22 22 2c  p, "%z%s\"%w\"",
bb00: 20 7a 4c 69 73 74 2c 20 7a 53 65 70 2c 20 7a 29   zList, zSep, z)
bb10: 3b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 2c 20  ;.    zSep = ", 
bb20: 22 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  ";.  }.  return 
bb30: 7a 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  zList;.}../*.** 
bb40: 52 65 74 75 72 6e 20 61 20 63 6f 6d 6d 61 20 73  Return a comma s
bb50: 65 70 61 72 61 74 65 64 20 6c 69 73 74 20 6f 66  eparated list of
bb60: 20 74 68 65 20 71 75 6f 74 65 64 20 50 52 49 4d   the quoted PRIM
bb70: 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 6e  ARY KEY column n
bb80: 61 6d 65 73 2c 0a 2a 2a 20 69 6e 20 6f 72 64 65  ames,.** in orde
bb90: 72 2c 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  r, for the curre
bba0: 6e 74 20 74 61 62 6c 65 2e 20 42 65 66 6f 72 65  nt table. Before
bbb0: 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6e 61 6d   each column nam
bbc0: 65 2c 20 61 64 64 20 74 68 65 20 74 65 78 74 0a  e, add the text.
bbd0: 2a 2a 20 7a 50 72 65 2e 20 41 66 74 65 72 20 65  ** zPre. After e
bbe0: 61 63 68 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2c  ach column name,
bbf0: 20 61 64 64 20 74 68 65 20 7a 50 6f 73 74 20 74   add the zPost t
bc00: 65 78 74 2e 20 55 73 65 20 7a 53 65 70 61 72 61  ext. Use zSepara
bc10: 74 6f 72 20 61 73 0a 2a 2a 20 74 68 65 20 73 65  tor as.** the se
bc20: 70 61 72 61 74 6f 72 20 74 65 78 74 20 28 75 73  parator text (us
bc30: 75 61 6c 6c 79 20 22 2c 20 22 29 2e 0a 2a 2f 0a  ually ", ")..*/.
bc40: 73 74 61 74 69 63 20 63 68 61 72 20 2a 72 62 75  static char *rbu
bc50: 4f 62 6a 49 74 65 72 47 65 74 50 6b 4c 69 73 74  ObjIterGetPkList
bc60: 28 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20 2a  (.  sqlite3rbu *
bc70: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
bc80: 20 20 20 20 2f 2a 20 52 42 55 20 6f 62 6a 65 63      /* RBU objec
bc90: 74 20 2a 2f 0a 20 20 52 62 75 4f 62 6a 49 74 65  t */.  RbuObjIte
bca0: 72 20 2a 70 49 74 65 72 2c 20 20 20 20 20 20 20  r *pIter,       
bcb0: 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74         /* Object
bcc0: 20 69 74 65 72 61 74 6f 72 20 66 6f 72 20 63 6f   iterator for co
bcd0: 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20  lumn names */.  
bce0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 72 65  const char *zPre
bcf0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
bd00: 2f 2a 20 42 65 66 6f 72 65 20 65 61 63 68 20 71  /* Before each q
bd10: 75 6f 74 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d  uoted column nam
bd20: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
bd30: 72 20 2a 7a 53 65 70 61 72 61 74 6f 72 2c 20 20  r *zSeparator,  
bd40: 20 20 20 20 20 20 20 2f 2a 20 53 65 70 61 72 61         /* Separa
bd50: 74 6f 72 20 74 6f 20 75 73 65 20 62 65 74 77 65  tor to use betwe
bd60: 65 6e 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  en columns */.  
bd70: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 6f 73  const char *zPos
bd80: 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
bd90: 2f 2a 20 41 66 74 65 72 20 65 61 63 68 20 71 75  /* After each qu
bda0: 6f 74 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  oted column name
bdb0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 50 6b   */.){.  int iPk
bdc0: 20 3d 20 31 3b 0a 20 20 63 68 61 72 20 2a 7a 52   = 1;.  char *zR
bdd0: 65 74 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20  et = 0;.  const 
bde0: 63 68 61 72 20 2a 7a 53 65 70 20 3d 20 22 22 3b  char *zSep = "";
bdf0: 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20  .  while( 1 ){. 
be00: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
be10: 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e  r(i=0; i<pIter->
be20: 6e 54 62 6c 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  nTblCol; i++){. 
be30: 20 20 20 20 20 69 66 28 20 28 69 6e 74 29 70 49       if( (int)pI
be40: 74 65 72 2d 3e 61 62 54 62 6c 50 6b 5b 69 5d 3d  ter->abTblPk[i]=
be50: 3d 69 50 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  =iPk ){.        
be60: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
be70: 20 3d 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43   = pIter->azTblC
be80: 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 7a  ol[i];.        z
be90: 52 65 74 20 3d 20 72 62 75 4d 50 72 69 6e 74 66  Ret = rbuMPrintf
bea0: 28 70 2c 20 22 25 7a 25 73 25 73 5c 22 25 77 5c  (p, "%z%s%s\"%w\
beb0: 22 25 73 22 2c 20 7a 52 65 74 2c 20 7a 53 65 70  "%s", zRet, zSep
bec0: 2c 20 7a 50 72 65 2c 20 7a 43 6f 6c 2c 20 7a 50  , zPre, zCol, zP
bed0: 6f 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7a 53  ost);.        zS
bee0: 65 70 20 3d 20 7a 53 65 70 61 72 61 74 6f 72 3b  ep = zSeparator;
bef0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
bf00: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
bf10: 20 20 69 66 28 20 69 3d 3d 70 49 74 65 72 2d 3e    if( i==pIter->
bf20: 6e 54 62 6c 43 6f 6c 20 29 20 62 72 65 61 6b 3b  nTblCol ) break;
bf30: 0a 20 20 20 20 69 50 6b 2b 2b 3b 0a 20 20 7d 0a  .    iPk++;.  }.
bf40: 20 20 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d    return zRet;.}
bf50: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
bf60: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
bf70: 61 73 20 70 61 72 74 20 6f 66 20 72 65 73 74 61  as part of resta
bf80: 72 74 69 6e 67 20 61 6e 20 52 42 55 20 76 61 63  rting an RBU vac
bf90: 75 75 6d 20 77 69 74 68 69 6e 20 0a 2a 2a 20 73  uum within .** s
bfa0: 74 61 67 65 20 31 20 6f 66 20 74 68 65 20 70 72  tage 1 of the pr
bfb0: 6f 63 65 73 73 20 28 77 68 69 6c 65 20 74 68 65  ocess (while the
bfc0: 20 2a 2d 6f 61 6c 20 66 69 6c 65 20 69 73 20 62   *-oal file is b
bfd0: 65 69 6e 67 20 62 75 69 6c 74 29 20 77 68 69 6c  eing built) whil
bfe0: 65 0a 2a 2a 20 75 70 64 61 74 69 6e 67 20 61 20  e.** updating a 
bff0: 74 61 62 6c 65 20 28 6e 6f 74 20 61 6e 20 69 6e  table (not an in
c000: 64 65 78 29 2e 20 54 68 65 20 74 61 62 6c 65 20  dex). The table 
c010: 6d 61 79 20 62 65 20 61 20 72 6f 77 69 64 20 74  may be a rowid t
c020: 61 62 6c 65 20 6f 72 0a 2a 2a 20 61 20 57 49 54  able or.** a WIT
c030: 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65  HOUT ROWID table
c040: 2e 20 49 74 20 71 75 65 72 69 65 73 20 74 68 65  . It queries the
c050: 20 74 61 72 67 65 74 20 64 61 74 61 62 61 73 65   target database
c060: 20 74 6f 20 66 69 6e 64 20 74 68 65 20 0a 2a 2a   to find the .**
c070: 20 6c 61 72 67 65 73 74 20 6b 65 79 20 74 68 61   largest key tha
c080: 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  t has already be
c090: 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
c0a0: 65 20 74 61 72 67 65 74 20 74 61 62 6c 65 20 61  e target table a
c0b0: 6e 64 0a 2a 2a 20 63 6f 6e 73 74 72 75 63 74 73  nd.** constructs
c0c0: 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20   a WHERE clause 
c0d0: 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64  that can be used
c0e0: 20 74 6f 20 65 78 74 72 61 63 74 20 74 68 65 20   to extract the 
c0f0: 72 65 6d 61 69 6e 69 6e 67 0a 2a 2a 20 72 6f 77  remaining.** row
c100: 73 20 66 72 6f 6d 20 74 68 65 20 73 6f 75 72 63  s from the sourc
c110: 65 20 74 61 62 6c 65 2e 20 46 6f 72 20 61 20 72  e table. For a r
c120: 6f 77 69 64 20 74 61 62 6c 65 2c 20 74 68 65 20  owid table, the 
c130: 57 48 45 52 45 20 63 6c 61 75 73 65 0a 2a 2a 20  WHERE clause.** 
c140: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  is of the form:.
c150: 2a 2a 0a 2a 2a 20 20 20 20 20 22 57 48 45 52 45  **.**     "WHERE
c160: 20 5f 72 6f 77 69 64 5f 20 3e 20 3f 22 0a 2a 2a   _rowid_ > ?".**
c170: 0a 2a 2a 20 61 6e 64 20 66 6f 72 20 57 49 54 48  .** and for WITH
c180: 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 73  OUT ROWID tables
c190: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 22 57 48 45  :.**.**     "WHE
c1a0: 52 45 20 28 6b 65 79 31 2c 20 6b 65 79 32 29 20  RE (key1, key2) 
c1b0: 3e 20 28 3f 2c 20 3f 29 22 0a 2a 2a 0a 2a 2a 20  > (?, ?)".**.** 
c1c0: 49 6e 73 74 65 61 64 20 6f 66 20 22 3f 22 20 70  Instead of "?" p
c1d0: 6c 61 63 65 68 6f 6c 64 65 72 73 2c 20 74 68 65  laceholders, the
c1e0: 20 61 63 74 75 61 6c 20 57 48 45 52 45 20 63 6c   actual WHERE cl
c1f0: 61 75 73 65 73 20 63 72 65 61 74 65 64 20 62 79  auses created by
c200: 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f  .** this functio
c210: 6e 20 63 6f 6e 74 61 69 6e 20 6c 69 74 65 72 61  n contain litera
c220: 6c 20 53 51 4c 20 76 61 6c 75 65 73 2e 0a 2a 2f  l SQL values..*/
c230: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 72 62  .static char *rb
c240: 75 56 61 63 75 75 6d 54 61 62 6c 65 53 74 61 72  uVacuumTableStar
c250: 74 28 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20  t(.  sqlite3rbu 
c260: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
c270: 20 20 20 20 20 2f 2a 20 52 42 55 20 68 61 6e 64       /* RBU hand
c280: 6c 65 20 2a 2f 0a 20 20 52 62 75 4f 62 6a 49 74  le */.  RbuObjIt
c290: 65 72 20 2a 70 49 74 65 72 2c 20 20 20 20 20 20  er *pIter,      
c2a0: 20 20 20 20 20 20 20 20 2f 2a 20 52 42 55 20 69          /* RBU i
c2b0: 74 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 2a  terator object *
c2c0: 2f 0a 20 20 69 6e 74 20 62 52 6f 77 69 64 2c 20  /.  int bRowid, 
c2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c2e0: 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
c2f0: 61 20 72 6f 77 69 64 20 74 61 62 6c 65 20 2a 2f  a rowid table */
c300: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
c310: 57 72 69 74 65 20 20 20 20 20 20 20 20 20 20 20  Write           
c320: 20 20 20 2f 2a 20 54 61 72 67 65 74 20 74 61 62     /* Target tab
c330: 6c 65 20 6e 61 6d 65 20 70 72 65 66 69 78 20 2a  le name prefix *
c340: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  /.){.  sqlite3_s
c350: 74 6d 74 20 2a 70 4d 61 78 20 3d 20 30 3b 0a 20  tmt *pMax = 0;. 
c360: 20 63 68 61 72 20 2a 7a 52 65 74 20 3d 20 30 3b   char *zRet = 0;
c370: 0a 20 20 69 66 28 20 62 52 6f 77 69 64 20 29 7b  .  if( bRowid ){
c380: 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 72 65  .    p->rc = pre
c390: 70 61 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65  pareFreeAndColle
c3a0: 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 4d 61 69  ctError(p->dbMai
c3b0: 6e 2c 20 26 70 4d 61 78 2c 20 26 70 2d 3e 7a 45  n, &pMax, &p->zE
c3c0: 72 72 6d 73 67 2c 20 0a 20 20 20 20 20 20 20 20  rrmsg, .        
c3d0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
c3e0: 0a 20 20 20 20 20 20 20 20 20 20 22 53 45 4c 45  .          "SELE
c3f0: 43 54 20 6d 61 78 28 5f 72 6f 77 69 64 5f 29 20  CT max(_rowid_) 
c400: 46 52 4f 4d 20 5c 22 25 73 25 77 5c 22 22 2c 20  FROM \"%s%w\"", 
c410: 7a 57 72 69 74 65 2c 20 70 49 74 65 72 2d 3e 7a  zWrite, pIter->z
c420: 54 62 6c 0a 20 20 20 20 20 20 20 20 29 0a 20 20  Tbl.        ).  
c430: 20 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e    );.    if( p->
c440: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
c450: 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
c460: 69 74 65 33 5f 73 74 65 70 28 70 4d 61 78 29 20  ite3_step(pMax) 
c470: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
c480: 5f 69 6e 74 36 34 20 69 4d 61 78 20 3d 20 73 71  _int64 iMax = sq
c490: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
c4a0: 36 34 28 70 4d 61 78 2c 20 30 29 3b 0a 20 20 20  64(pMax, 0);.   
c4b0: 20 20 20 7a 52 65 74 20 3d 20 72 62 75 4d 50 72     zRet = rbuMPr
c4c0: 69 6e 74 66 28 70 2c 20 22 20 57 48 45 52 45 20  intf(p, " WHERE 
c4d0: 5f 72 6f 77 69 64 5f 20 3e 20 25 6c 6c 64 20 22  _rowid_ > %lld "
c4e0: 2c 20 69 4d 61 78 29 3b 0a 20 20 20 20 7d 0a 20  , iMax);.    }. 
c4f0: 20 20 20 72 62 75 46 69 6e 61 6c 69 7a 65 28 70     rbuFinalize(p
c500: 2c 20 70 4d 61 78 29 3b 0a 20 20 7d 65 6c 73 65  , pMax);.  }else
c510: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4f 72 64  {.    char *zOrd
c520: 65 72 20 3d 20 72 62 75 4f 62 6a 49 74 65 72 47  er = rbuObjIterG
c530: 65 74 50 6b 4c 69 73 74 28 70 2c 20 70 49 74 65  etPkList(p, pIte
c540: 72 2c 20 22 22 2c 20 22 2c 20 22 2c 20 22 20 44  r, "", ", ", " D
c550: 45 53 43 22 29 3b 0a 20 20 20 20 63 68 61 72 20  ESC");.    char 
c560: 2a 7a 53 65 6c 65 63 74 20 3d 20 72 62 75 4f 62  *zSelect = rbuOb
c570: 6a 49 74 65 72 47 65 74 50 6b 4c 69 73 74 28 70  jIterGetPkList(p
c580: 2c 20 70 49 74 65 72 2c 20 22 71 75 6f 74 65 28  , pIter, "quote(
c590: 22 2c 20 22 7c 7c 27 2c 27 7c 7c 22 2c 20 22 29  ", "||','||", ")
c5a0: 22 29 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4c  ");.    char *zL
c5b0: 69 73 74 20 3d 20 72 62 75 4f 62 6a 49 74 65 72  ist = rbuObjIter
c5c0: 47 65 74 50 6b 4c 69 73 74 28 70 2c 20 70 49 74  GetPkList(p, pIt
c5d0: 65 72 2c 20 22 22 2c 20 22 2c 20 22 2c 20 22 22  er, "", ", ", ""
c5e0: 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 72  );..    if( p->r
c5f0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
c600: 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 72        p->rc = pr
c610: 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c  epareFreeAndColl
c620: 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 4d 61  ectError(p->dbMa
c630: 69 6e 2c 20 26 70 4d 61 78 2c 20 26 70 2d 3e 7a  in, &pMax, &p->z
c640: 45 72 72 6d 73 67 2c 20 0a 20 20 20 20 20 20 20  Errmsg, .       
c650: 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e     sqlite3_mprin
c660: 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  tf(.            
c670: 22 53 45 4c 45 43 54 20 25 73 20 46 52 4f 4d 20  "SELECT %s FROM 
c680: 5c 22 25 73 25 77 5c 22 20 4f 52 44 45 52 20 42  \"%s%w\" ORDER B
c690: 59 20 25 73 20 4c 49 4d 49 54 20 31 22 2c 20 0a  Y %s LIMIT 1", .
c6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c6b0: 7a 53 65 6c 65 63 74 2c 20 7a 57 72 69 74 65 2c  zSelect, zWrite,
c6c0: 20 70 49 74 65 72 2d 3e 7a 54 62 6c 2c 20 7a 4f   pIter->zTbl, zO
c6d0: 72 64 65 72 0a 20 20 20 20 20 20 20 20 20 20 29  rder.          )
c6e0: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
c6f0: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
c700: 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52  E_OK && SQLITE_R
c710: 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
c720: 28 70 4d 61 78 29 20 29 7b 0a 20 20 20 20 20 20  (pMax) ){.      
c730: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56    const char *zV
c740: 61 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  al = (const char
c750: 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
c760: 5f 74 65 78 74 28 70 4d 61 78 2c 20 30 29 3b 0a  _text(pMax, 0);.
c770: 20 20 20 20 20 20 20 20 7a 52 65 74 20 3d 20 72          zRet = r
c780: 62 75 4d 50 72 69 6e 74 66 28 70 2c 20 22 20 57  buMPrintf(p, " W
c790: 48 45 52 45 20 28 25 73 29 20 3e 20 28 25 73 29  HERE (%s) > (%s)
c7a0: 20 22 2c 20 7a 4c 69 73 74 2c 20 7a 56 61 6c 29   ", zList, zVal)
c7b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
c7c0: 72 62 75 46 69 6e 61 6c 69 7a 65 28 70 2c 20 70  rbuFinalize(p, p
c7d0: 4d 61 78 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Max);.    }..   
c7e0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f   sqlite3_free(zO
c7f0: 72 64 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  rder);.    sqlit
c800: 65 33 5f 66 72 65 65 28 7a 53 65 6c 65 63 74 29  e3_free(zSelect)
c810: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
c820: 65 65 28 7a 4c 69 73 74 29 3b 0a 20 20 7d 0a 20  ee(zList);.  }. 
c830: 20 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a   return zRet;.}.
c840: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
c850: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61  tion is called a
c860: 73 20 70 61 72 74 20 6f 66 20 72 65 73 74 61 74  s part of restat
c870: 69 6e 67 20 61 6e 20 52 42 55 20 76 61 63 75 75  ing an RBU vacuu
c880: 6d 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 63 75  m when the.** cu
c890: 72 72 65 6e 74 20 6f 70 65 72 61 74 69 6f 6e 20  rrent operation 
c8a0: 69 73 20 77 72 69 74 69 6e 67 20 63 6f 6e 74 65  is writing conte
c8b0: 6e 74 20 74 6f 20 61 6e 20 69 6e 64 65 78 2e 20  nt to an index. 
c8c0: 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 74 0a  If possible, it.
c8d0: 2a 2a 20 71 75 65 72 69 65 73 20 74 68 65 20 74  ** queries the t
c8e0: 61 72 67 65 74 20 69 6e 64 65 78 20 62 2d 74 72  arget index b-tr
c8f0: 65 65 20 66 6f 72 20 74 68 65 20 6c 61 72 67 65  ee for the large
c900: 73 74 20 6b 65 79 20 61 6c 72 65 61 64 79 20 77  st key already w
c910: 72 69 74 74 65 6e 20 74 6f 0a 2a 2a 20 69 74 2c  ritten to.** it,
c920: 20 74 68 65 6e 20 63 6f 6d 70 6f 73 65 73 20 61   then composes a
c930: 6e 64 20 72 65 74 75 72 6e 73 20 61 6e 20 65 78  nd returns an ex
c940: 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63 61  pression that ca
c950: 6e 20 62 65 20 75 73 65 64 20 69 6e 20 61 20 57  n be used in a W
c960: 48 45 52 45 20 0a 2a 2a 20 63 6c 61 75 73 65 20  HERE .** clause 
c970: 74 6f 20 73 65 6c 65 63 74 20 74 68 65 20 72 65  to select the re
c980: 6d 61 69 6e 69 6e 67 20 72 65 71 75 69 72 65 64  maining required
c990: 20 72 6f 77 73 20 66 72 6f 6d 20 74 68 65 20 73   rows from the s
c9a0: 6f 75 72 63 65 20 74 61 62 6c 65 2e 20 0a 2a 2a  ource table. .**
c9b0: 20 49 74 20 69 73 20 6f 6e 6c 79 20 70 6f 73 73   It is only poss
c9c0: 69 62 6c 65 20 74 6f 20 72 65 74 75 72 6e 20 73  ible to return s
c9d0: 75 63 68 20 61 6e 20 65 78 70 72 65 73 73 69 6f  uch an expressio
c9e0: 6e 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  n if:.**.**   * 
c9f0: 54 68 65 20 69 6e 64 65 78 20 63 6f 6e 74 61 69  The index contai
ca00: 6e 73 20 6e 6f 20 44 45 53 43 20 63 6f 6c 75 6d  ns no DESC colum
ca10: 6e 73 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54  ns, and.**   * T
ca20: 68 65 20 6c 61 73 74 20 6b 65 79 20 77 72 69 74  he last key writ
ca30: 74 65 6e 20 74 6f 20 74 68 65 20 69 6e 64 65 78  ten to the index
ca40: 20 62 65 66 6f 72 65 20 74 68 65 20 6f 70 65 72   before the oper
ca50: 61 74 69 6f 6e 20 77 61 73 20 0a 2a 2a 20 20 20  ation was .**   
ca60: 20 20 73 75 73 70 65 6e 64 65 64 20 64 6f 65 73    suspended does
ca70: 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e 79   not contain any
ca80: 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a 2a   NULL values..**
ca90: 0a 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73 69  .** The expressi
caa0: 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  on is of the for
cab0: 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 69 6e 64 65  m:.**.**   (inde
cac0: 78 2d 66 69 65 6c 64 31 2c 20 69 6e 64 65 78 2d  x-field1, index-
cad0: 66 69 65 6c 64 32 2c 20 2e 2e 2e 29 20 3e 20 28  field2, ...) > (
cae0: 3f 2c 20 3f 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a  ?, ?, ...).**.**
caf0: 20 65 78 63 65 70 74 20 74 68 61 74 20 74 68 65   except that the
cb00: 20 22 3f 22 20 70 6c 61 63 65 68 6f 6c 64 65 72   "?" placeholder
cb10: 73 20 61 72 65 20 72 65 70 6c 61 63 65 64 20 77  s are replaced w
cb20: 69 74 68 20 6c 69 74 65 72 61 6c 20 76 61 6c 75  ith literal valu
cb30: 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  es..**.** If the
cb40: 20 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 6e   expression cann
cb50: 6f 74 20 62 65 20 63 72 65 61 74 65 64 2c 20 4e  ot be created, N
cb60: 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ULL is returned.
cb70: 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 0a 2a   In this case,.*
cb80: 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73  * the caller has
cb90: 20 74 6f 20 75 73 65 20 61 6e 20 4f 46 46 53 45   to use an OFFSE
cba0: 54 20 63 6c 61 75 73 65 20 74 6f 20 65 78 74 72  T clause to extr
cbb0: 61 63 74 20 6f 6e 6c 79 20 74 68 65 20 72 65 71  act only the req
cbc0: 75 69 72 65 64 20 0a 2a 2a 20 72 6f 77 73 20 66  uired .** rows f
cbd0: 72 6f 6d 20 74 68 65 20 73 6f 75 72 63 74 20 74  rom the sourct t
cbe0: 61 62 6c 65 2c 20 6a 75 73 74 20 61 73 20 69 74  able, just as it
cbf0: 20 64 6f 65 73 20 66 6f 72 20 61 6e 20 52 42 55   does for an RBU
cc00: 20 75 70 64 61 74 65 20 6f 70 65 72 61 74 69 6f   update operatio
cc10: 6e 2e 0a 2a 2f 0a 63 68 61 72 20 2a 72 62 75 56  n..*/.char *rbuV
cc20: 61 63 75 75 6d 49 6e 64 65 78 53 74 61 72 74 28  acuumIndexStart(
cc30: 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20 2a 70  .  sqlite3rbu *p
cc40: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
cc50: 20 20 20 2f 2a 20 52 42 55 20 68 61 6e 64 6c 65     /* RBU handle
cc60: 20 2a 2f 0a 20 20 52 62 75 4f 62 6a 49 74 65 72   */.  RbuObjIter
cc70: 20 2a 70 49 74 65 72 20 20 20 20 20 20 20 20 20   *pIter         
cc80: 20 20 20 20 20 20 2f 2a 20 52 42 55 20 69 74 65        /* RBU ite
cc90: 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  rator object */.
cca0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4f 72 64 65  ){.  char *zOrde
ccb0: 72 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a  r = 0;.  char *z
ccc0: 4c 68 73 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  Lhs = 0;.  char 
ccd0: 2a 7a 53 65 6c 65 63 74 20 3d 20 30 3b 0a 20 20  *zSelect = 0;.  
cce0: 63 68 61 72 20 2a 7a 56 65 63 74 6f 72 20 3d 20  char *zVector = 
ccf0: 30 3b 0a 20 20 63 68 61 72 20 2a 7a 52 65 74 20  0;.  char *zRet 
cd00: 3d 20 30 3b 0a 20 20 69 6e 74 20 62 46 61 69 6c  = 0;.  int bFail
cd10: 65 64 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20  ed = 0;.  const 
cd20: 63 68 61 72 20 2a 7a 53 65 70 20 3d 20 22 22 3b  char *zSep = "";
cd30: 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 30 3b  .  int iCol = 0;
cd40: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
cd50: 2a 70 58 49 6e 66 6f 20 3d 20 30 3b 0a 0a 20 20  *pXInfo = 0;..  
cd60: 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65 46  p->rc = prepareF
cd70: 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72  reeAndCollectErr
cd80: 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 70  or(p->dbMain, &p
cd90: 58 49 6e 66 6f 2c 20 26 70 2d 3e 7a 45 72 72 6d  XInfo, &p->zErrm
cda0: 73 67 2c 0a 20 20 20 20 20 20 73 71 6c 69 74 65  sg,.      sqlite
cdb0: 33 5f 6d 70 72 69 6e 74 66 28 22 50 52 41 47 4d  3_mprintf("PRAGM
cdc0: 41 20 6d 61 69 6e 2e 69 6e 64 65 78 5f 78 69 6e  A main.index_xin
cdd0: 66 6f 20 3d 20 25 51 22 2c 20 70 49 74 65 72 2d  fo = %Q", pIter-
cde0: 3e 7a 49 64 78 29 0a 20 20 29 3b 0a 20 20 77 68  >zIdx).  );.  wh
cdf0: 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ile( p->rc==SQLI
ce00: 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f  TE_OK && SQLITE_
ce10: 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW==sqlite3_ste
ce20: 70 28 70 58 49 6e 66 6f 29 20 29 7b 0a 20 20 20  p(pXInfo) ){.   
ce30: 20 69 6e 74 20 69 43 69 64 20 3d 20 73 71 6c 69   int iCid = sqli
ce40: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
ce50: 58 49 6e 66 6f 2c 20 31 29 3b 0a 20 20 20 20 63  XInfo, 1);.    c
ce60: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  onst char *zColl
ce70: 61 74 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ate = (const cha
ce80: 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
ce90: 6e 5f 74 65 78 74 28 70 58 49 6e 66 6f 2c 20 34  n_text(pXInfo, 4
cea0: 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  );.    const cha
ceb0: 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 69 66 28  r *zCol;.    if(
cec0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
ced0: 69 6e 74 28 70 58 49 6e 66 6f 2c 20 33 29 20 29  int(pXInfo, 3) )
cee0: 7b 0a 20 20 20 20 20 20 62 46 61 69 6c 65 64 20  {.      bFailed 
cef0: 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = 1;.      break
cf00: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
cf10: 20 69 43 69 64 3c 30 20 29 7b 0a 20 20 20 20 20   iCid<0 ){.     
cf20: 20 69 66 28 20 70 49 74 65 72 2d 3e 65 54 79 70   if( pIter->eTyp
cf30: 65 3d 3d 52 42 55 5f 50 4b 5f 49 50 4b 20 29 7b  e==RBU_PK_IPK ){
cf40: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  .        int i;.
cf50: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
cf60: 20 70 49 74 65 72 2d 3e 61 62 54 62 6c 50 6b 5b   pIter->abTblPk[
cf70: 69 5d 3d 3d 30 3b 20 69 2b 2b 29 3b 0a 20 20 20  i]==0; i++);.   
cf80: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 70       assert( i<p
cf90: 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 20 29 3b  Iter->nTblCol );
cfa0: 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20  .        zCol = 
cfb0: 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b  pIter->azTblCol[
cfc0: 69 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  i];.      }else{
cfd0: 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20  .        zCol = 
cfe0: 22 5f 72 6f 77 69 64 5f 22 3b 0a 20 20 20 20 20  "_rowid_";.     
cff0: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
d000: 20 20 20 20 7a 43 6f 6c 20 3d 20 70 49 74 65 72      zCol = pIter
d010: 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69 43 69 64 5d  ->azTblCol[iCid]
d020: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 7a 4c 68  ;.    }..    zLh
d030: 73 20 3d 20 72 62 75 4d 50 72 69 6e 74 66 28 70  s = rbuMPrintf(p
d040: 2c 20 22 25 7a 25 73 20 5c 22 25 77 5c 22 20 43  , "%z%s \"%w\" C
d050: 4f 4c 4c 41 54 45 20 25 51 22 2c 0a 20 20 20 20  OLLATE %Q",.    
d060: 20 20 20 20 7a 4c 68 73 2c 20 7a 53 65 70 2c 20      zLhs, zSep, 
d070: 7a 43 6f 6c 2c 20 7a 43 6f 6c 6c 61 74 65 0a 20  zCol, zCollate. 
d080: 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7a 4f         );.    zO
d090: 72 64 65 72 20 3d 20 72 62 75 4d 50 72 69 6e 74  rder = rbuMPrint
d0a0: 66 28 70 2c 20 22 25 7a 25 73 20 5c 22 72 62 75  f(p, "%z%s \"rbu
d0b0: 5f 69 6d 70 5f 25 64 25 77 5c 22 20 43 4f 4c 4c  _imp_%d%w\" COLL
d0c0: 41 54 45 20 25 51 20 44 45 53 43 22 2c 0a 20 20  ATE %Q DESC",.  
d0d0: 20 20 20 20 20 20 7a 4f 72 64 65 72 2c 20 7a 53        zOrder, zS
d0e0: 65 70 2c 20 69 43 6f 6c 2c 20 7a 43 6f 6c 2c 20  ep, iCol, zCol, 
d0f0: 7a 43 6f 6c 6c 61 74 65 0a 20 20 20 20 20 20 20  zCollate.       
d100: 20 29 3b 0a 20 20 20 20 7a 53 65 6c 65 63 74 20   );.    zSelect 
d110: 3d 20 72 62 75 4d 50 72 69 6e 74 66 28 70 2c 20  = rbuMPrintf(p, 
d120: 22 25 7a 25 73 20 71 75 6f 74 65 28 5c 22 72 62  "%z%s quote(\"rb
d130: 75 5f 69 6d 70 5f 25 64 25 77 5c 22 29 22 2c 0a  u_imp_%d%w\")",.
d140: 20 20 20 20 20 20 20 20 7a 53 65 6c 65 63 74 2c          zSelect,
d150: 20 7a 53 65 70 2c 20 69 43 6f 6c 2c 20 7a 43 6f   zSep, iCol, zCo
d160: 6c 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  l.        );.   
d170: 20 7a 53 65 70 20 3d 20 22 2c 20 22 3b 0a 20 20   zSep = ", ";.  
d180: 20 20 69 43 6f 6c 2b 2b 3b 0a 20 20 7d 0a 20 20    iCol++;.  }.  
d190: 72 62 75 46 69 6e 61 6c 69 7a 65 28 70 2c 20 70  rbuFinalize(p, p
d1a0: 58 49 6e 66 6f 29 3b 0a 20 20 69 66 28 20 62 46  XInfo);.  if( bF
d1b0: 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 69 6e 64  ailed ) goto ind
d1c0: 65 78 5f 73 74 61 72 74 5f 6f 75 74 3b 0a 0a 20  ex_start_out;.. 
d1d0: 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
d1e0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
d1f0: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 65 6c 20  ite3_stmt *pSel 
d200: 3d 20 30 3b 0a 0a 20 20 20 20 70 2d 3e 72 63 20  = 0;..    p->rc 
d210: 3d 20 70 72 65 70 61 72 65 46 72 65 65 41 6e 64  = prepareFreeAnd
d220: 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e  CollectError(p->
d230: 64 62 4d 61 69 6e 2c 20 26 70 53 65 6c 2c 20 26  dbMain, &pSel, &
d240: 70 2d 3e 7a 45 72 72 6d 73 67 2c 0a 20 20 20 20  p->zErrmsg,.    
d250: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69      sqlite3_mpri
d260: 6e 74 66 28 22 53 45 4c 45 43 54 20 25 73 20 46  ntf("SELECT %s F
d270: 52 4f 4d 20 5c 22 72 62 75 5f 69 6d 70 5f 25 77  ROM \"rbu_imp_%w
d280: 5c 22 20 4f 52 44 45 52 20 42 59 20 25 73 20 4c  \" ORDER BY %s L
d290: 49 4d 49 54 20 31 22 2c 0a 20 20 20 20 20 20 20  IMIT 1",.       
d2a0: 20 20 20 7a 53 65 6c 65 63 74 2c 20 70 49 74 65     zSelect, pIte
d2b0: 72 2d 3e 7a 54 62 6c 2c 20 7a 4f 72 64 65 72 0a  r->zTbl, zOrder.
d2c0: 20 20 20 20 20 20 20 20 29 0a 20 20 20 20 29 3b          ).    );
d2d0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  .    if( p->rc==
d2e0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c  SQLITE_OK && SQL
d2f0: 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
d300: 5f 73 74 65 70 28 70 53 65 6c 29 20 29 7b 0a 20  _step(pSel) ){. 
d310: 20 20 20 20 20 7a 53 65 70 20 3d 20 22 22 3b 0a       zSep = "";.
d320: 20 20 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30        for(iCol=0
d330: 3b 20 69 43 6f 6c 3c 70 49 74 65 72 2d 3e 6e 43  ; iCol<pIter->nC
d340: 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ol; iCol++){.   
d350: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
d360: 2a 7a 51 75 6f 74 65 64 20 3d 20 28 63 6f 6e 73  *zQuoted = (cons
d370: 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
d380: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 65 6c  column_text(pSel
d390: 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  , iCol);.       
d3a0: 20 69 66 28 20 7a 51 75 6f 74 65 64 5b 30 5d 3d   if( zQuoted[0]=
d3b0: 3d 27 4e 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='N' ){.        
d3c0: 20 20 62 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20    bFailed = 1;. 
d3d0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
d3e0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d3f0: 20 20 7a 56 65 63 74 6f 72 20 3d 20 72 62 75 4d    zVector = rbuM
d400: 50 72 69 6e 74 66 28 70 2c 20 22 25 7a 25 73 25  Printf(p, "%z%s%
d410: 73 22 2c 20 7a 56 65 63 74 6f 72 2c 20 7a 53 65  s", zVector, zSe
d420: 70 2c 20 7a 51 75 6f 74 65 64 29 3b 0a 20 20 20  p, zQuoted);.   
d430: 20 20 20 20 20 7a 53 65 70 20 3d 20 22 2c 20 22       zSep = ", "
d440: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
d450: 20 69 66 28 20 21 62 46 61 69 6c 65 64 20 29 7b   if( !bFailed ){
d460: 0a 20 20 20 20 20 20 20 20 7a 52 65 74 20 3d 20  .        zRet = 
d470: 72 62 75 4d 50 72 69 6e 74 66 28 70 2c 20 22 28  rbuMPrintf(p, "(
d480: 25 73 29 20 3e 20 28 25 73 29 22 2c 20 7a 4c 68  %s) > (%s)", zLh
d490: 73 2c 20 7a 56 65 63 74 6f 72 29 3b 0a 20 20 20  s, zVector);.   
d4a0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72     }.    }.    r
d4b0: 62 75 46 69 6e 61 6c 69 7a 65 28 70 2c 20 70 53  buFinalize(p, pS
d4c0: 65 6c 29 3b 0a 20 20 7d 0a 0a 20 69 6e 64 65 78  el);.  }.. index
d4d0: 5f 73 74 61 72 74 5f 6f 75 74 3a 0a 20 20 73 71  _start_out:.  sq
d4e0: 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 72 64 65  lite3_free(zOrde
d4f0: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  r);.  sqlite3_fr
d500: 65 65 28 7a 53 65 6c 65 63 74 29 3b 0a 20 20 73  ee(zSelect);.  s
d510: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 56 65 63  qlite3_free(zVec
d520: 74 6f 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  tor);.  sqlite3_
d530: 66 72 65 65 28 7a 4c 68 73 29 3b 0a 20 20 72 65  free(zLhs);.  re
d540: 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 0a 2f 2a  turn zRet;.}../*
d550: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
d560: 6e 20 69 73 20 75 73 65 64 20 74 6f 20 63 72 65  n is used to cre
d570: 61 74 65 20 61 20 53 45 4c 45 43 54 20 6c 69 73  ate a SELECT lis
d580: 74 20 28 74 68 65 20 6c 69 73 74 20 6f 66 20 53  t (the list of S
d590: 51 4c 20 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  QL .** expressio
d5a0: 6e 73 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20  ns that follows 
d5b0: 61 20 53 45 4c 45 43 54 20 6b 65 79 77 6f 72 64  a SELECT keyword
d5c0: 29 20 66 6f 72 20 61 20 53 45 4c 45 43 54 20 73  ) for a SELECT s
d5d0: 74 61 74 65 6d 65 6e 74 20 0a 2a 2a 20 75 73 65  tatement .** use
d5e0: 64 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 61  d to read from a
d5f0: 6e 20 64 61 74 61 5f 78 78 78 20 6f 72 20 72 62  n data_xxx or rb
d600: 75 5f 74 6d 70 5f 78 78 78 20 74 61 62 6c 65 20  u_tmp_xxx table 
d610: 77 68 69 6c 65 20 75 70 64 61 74 69 6e 67 20 74  while updating t
d620: 68 65 20 0a 2a 2a 20 69 6e 64 65 78 20 6f 62 6a  he .** index obj
d630: 65 63 74 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  ect currently in
d640: 64 69 63 61 74 65 64 20 62 79 20 74 68 65 20 69  dicated by the i
d650: 74 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 70  terator object p
d660: 61 73 73 65 64 20 61 73 20 74 68 65 20 0a 2a 2a  assed as the .**
d670: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
d680: 2e 20 41 20 22 50 52 41 47 4d 41 20 69 6e 64 65  . A "PRAGMA inde
d690: 78 5f 78 69 6e 66 6f 20 3d 20 3c 69 64 78 6e 61  x_xinfo = <idxna
d6a0: 6d 65 3e 22 20 73 74 61 74 65 6d 65 6e 74 20 69  me>" statement i
d6b0: 73 20 75 73 65 64 20 0a 2a 2a 20 74 6f 20 6f 62  s used .** to ob
d6c0: 74 61 69 6e 20 74 68 65 20 72 65 71 75 69 72 65  tain the require
d6d0: 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  d information..*
d6e0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 64 65  *.** If the inde
d6f0: 78 20 69 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c  x is of the foll
d700: 6f 77 69 6e 67 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a  owing form:.**.*
d710: 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58  *   CREATE INDEX
d720: 20 69 31 20 4f 4e 20 74 31 28 63 2c 20 62 20 43   i1 ON t1(c, b C
d730: 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 29 3b 0a  OLLATE nocase);.
d740: 2a 2a 0a 2a 2a 20 61 6e 64 20 22 74 31 22 20 69  **.** and "t1" i
d750: 73 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 61  s a table with a
d760: 6e 20 65 78 70 6c 69 63 69 74 20 49 4e 54 45 47  n explicit INTEG
d770: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63  ER PRIMARY KEY c
d780: 6f 6c 75 6d 6e 20 0a 2a 2a 20 22 69 70 6b 22 2c  olumn .** "ipk",
d790: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 74   the returned st
d7a0: 72 69 6e 67 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ring is:.**.**  
d7b0: 20 22 60 63 60 20 43 4f 4c 4c 41 54 45 20 27 42   "`c` COLLATE 'B
d7c0: 49 4e 41 52 59 27 2c 20 60 62 60 20 43 4f 4c 4c  INARY', `b` COLL
d7d0: 41 54 45 20 27 4e 4f 43 41 53 45 27 2c 20 60 69  ATE 'NOCASE', `i
d7e0: 70 6b 60 20 43 4f 4c 4c 41 54 45 20 27 42 49 4e  pk` COLLATE 'BIN
d7f0: 41 52 59 27 22 0a 2a 2a 0a 2a 2a 20 41 73 20 77  ARY'".**.** As w
d800: 65 6c 6c 20 61 73 20 74 68 65 20 72 65 74 75 72  ell as the retur
d810: 6e 65 64 20 73 74 72 69 6e 67 2c 20 74 68 72 65  ned string, thre
d820: 65 20 6f 74 68 65 72 20 6d 61 6c 6c 6f 63 27 64  e other malloc'd
d830: 20 73 74 72 69 6e 67 73 20 61 72 65 20 0a 2a 2a   strings are .**
d840: 20 72 65 74 75 72 6e 65 64 20 76 69 61 20 6f 75   returned via ou
d850: 74 70 75 74 20 70 61 72 61 6d 65 74 65 72 73 2e  tput parameters.
d860: 20 41 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   As follows:.**.
d870: 2a 2a 20 20 20 70 7a 49 6d 70 6f 73 74 65 72 43  **   pzImposterC
d880: 6f 6c 73 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 70 7a  ols: ....**   pz
d890: 49 6d 70 6f 73 74 65 72 50 6b 3a 20 2e 2e 2e 0a  ImposterPk: ....
d8a0: 2a 2a 20 20 20 70 7a 57 68 65 72 65 3a 20 2e 2e  **   pzWhere: ..
d8b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
d8c0: 20 2a 72 62 75 4f 62 6a 49 74 65 72 47 65 74 49   *rbuObjIterGetI
d8d0: 6e 64 65 78 43 6f 6c 73 28 0a 20 20 73 71 6c 69  ndexCols(.  sqli
d8e0: 74 65 33 72 62 75 20 2a 70 2c 20 20 20 20 20 20  te3rbu *p,      
d8f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
d900: 42 55 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 52  BU object */.  R
d910: 62 75 4f 62 6a 49 74 65 72 20 2a 70 49 74 65 72  buObjIter *pIter
d920: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
d930: 2a 20 4f 62 6a 65 63 74 20 69 74 65 72 61 74 6f  * Object iterato
d940: 72 20 66 6f 72 20 63 6f 6c 75 6d 6e 20 6e 61 6d  r for column nam
d950: 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70  es */.  char **p
d960: 7a 49 6d 70 6f 73 74 65 72 43 6f 6c 73 2c 20 20  zImposterCols,  
d970: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
d980: 43 6f 6c 75 6d 6e 73 20 66 6f 72 20 69 6d 70 6f  Columns for impo
d990: 73 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ster table */.  
d9a0: 63 68 61 72 20 2a 2a 70 7a 49 6d 70 6f 73 74 65  char **pzImposte
d9b0: 72 50 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  rPk,            
d9c0: 2f 2a 20 4f 55 54 3a 20 49 6d 70 6f 73 74 65 72  /* OUT: Imposter
d9d0: 20 50 4b 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   PK clause */.  
d9e0: 63 68 61 72 20 2a 2a 70 7a 57 68 65 72 65 2c 20  char **pzWhere, 
d9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da00: 2f 2a 20 4f 55 54 3a 20 57 48 45 52 45 20 63 6c  /* OUT: WHERE cl
da10: 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ause */.  int *p
da20: 6e 42 69 6e 64 20 20 20 20 20 20 20 20 20 20 20  nBind           
da30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
da40: 3a 20 54 72 62 75 6c 20 6e 75 6d 62 65 72 20 6f  : Trbul number o
da50: 66 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 29 7b 0a  f columns */.){.
da60: 20 20 69 6e 74 20 72 63 20 3d 20 70 2d 3e 72 63    int rc = p->rc
da70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
da80: 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20    /* Error code 
da90: 2a 2f 0a 20 20 69 6e 74 20 72 63 32 3b 20 20 20  */.  int rc2;   
daa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dab0: 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f       /* sqlite3_
dac0: 66 69 6e 61 6c 69 7a 65 28 29 20 72 65 74 75 72  finalize() retur
dad0: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 63 68 61 72  n code */.  char
dae0: 20 2a 7a 52 65 74 20 3d 20 30 3b 20 20 20 20 20   *zRet = 0;     
daf0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
db00: 74 72 69 6e 67 20 74 6f 20 72 65 74 75 72 6e 20  tring to return 
db10: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 49 6d 70 43  */.  char *zImpC
db20: 6f 6c 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ols = 0;        
db30: 20 20 20 20 20 2f 2a 20 53 74 72 69 6e 67 20 74       /* String t
db40: 6f 20 72 65 74 75 72 6e 20 76 69 61 20 2a 70 7a  o return via *pz
db50: 49 6d 70 6f 73 74 65 72 43 6f 6c 73 20 2a 2f 0a  ImposterCols */.
db60: 20 20 63 68 61 72 20 2a 7a 49 6d 70 50 4b 20 3d    char *zImpPK =
db70: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
db80: 20 20 2f 2a 20 53 74 72 69 6e 67 20 74 6f 20 72    /* String to r
db90: 65 74 75 72 6e 20 76 69 61 20 2a 70 7a 49 6d 70  eturn via *pzImp
dba0: 6f 73 74 65 72 50 4b 20 2a 2f 0a 20 20 63 68 61  osterPK */.  cha
dbb0: 72 20 2a 7a 57 68 65 72 65 20 3d 20 30 3b 20 20  r *zWhere = 0;  
dbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
dbd0: 53 74 72 69 6e 67 20 74 6f 20 72 65 74 75 72 6e  String to return
dbe0: 20 76 69 61 20 2a 70 7a 57 68 65 72 65 20 2a 2f   via *pzWhere */
dbf0: 0a 20 20 69 6e 74 20 6e 42 69 6e 64 20 3d 20 30  .  int nBind = 0
dc00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
dc10: 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72     /* Value to r
dc20: 65 74 75 72 6e 20 76 69 61 20 2a 70 6e 42 69 6e  eturn via *pnBin
dc30: 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
dc40: 72 20 2a 7a 43 6f 6d 20 3d 20 22 22 3b 20 20 20  r *zCom = "";   
dc50: 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f         /* Set to
dc60: 20 22 2c 20 22 20 6c 61 74 65 72 20 6f 6e 20 2a   ", " later on *
dc70: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
dc80: 7a 41 6e 64 20 3d 20 22 22 3b 20 20 20 20 20 20  zAnd = "";      
dc90: 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 22 20      /* Set to " 
dca0: 41 4e 44 20 22 20 6c 61 74 65 72 20 6f 6e 20 2a  AND " later on *
dcb0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  /.  sqlite3_stmt
dcc0: 20 2a 70 58 49 6e 66 6f 20 3d 20 30 3b 20 20 20   *pXInfo = 0;   
dcd0: 20 20 20 20 2f 2a 20 50 52 41 47 4d 41 20 69 6e      /* PRAGMA in
dce0: 64 65 78 5f 78 69 6e 66 6f 20 3d 20 3f 20 2a 2f  dex_xinfo = ? */
dcf0: 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
dd00: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
dd10: 65 72 74 28 20 70 2d 3e 7a 45 72 72 6d 73 67 3d  ert( p->zErrmsg=
dd20: 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70  =0 );.    rc = p
dd30: 72 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f 6c  repareFreeAndCol
dd40: 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 4d  lectError(p->dbM
dd50: 61 69 6e 2c 20 26 70 58 49 6e 66 6f 2c 20 26 70  ain, &pXInfo, &p
dd60: 2d 3e 7a 45 72 72 6d 73 67 2c 0a 20 20 20 20 20  ->zErrmsg,.     
dd70: 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e     sqlite3_mprin
dd80: 74 66 28 22 50 52 41 47 4d 41 20 6d 61 69 6e 2e  tf("PRAGMA main.
dd90: 69 6e 64 65 78 5f 78 69 6e 66 6f 20 3d 20 25 51  index_xinfo = %Q
dda0: 22 2c 20 70 49 74 65 72 2d 3e 7a 49 64 78 29 0a  ", pIter->zIdx).
ddb0: 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 77 68      );.  }..  wh
ddc0: 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
ddd0: 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57  OK && SQLITE_ROW
dde0: 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ==sqlite3_step(p
ddf0: 58 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 69 6e  XInfo) ){.    in
de00: 74 20 69 43 69 64 20 3d 20 73 71 6c 69 74 65 33  t iCid = sqlite3
de10: 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 58 49 6e  _column_int(pXIn
de20: 66 6f 2c 20 31 29 3b 0a 20 20 20 20 69 6e 74 20  fo, 1);.    int 
de30: 62 44 65 73 63 20 3d 20 73 71 6c 69 74 65 33 5f  bDesc = sqlite3_
de40: 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 58 49 6e 66  column_int(pXInf
de50: 6f 2c 20 33 29 3b 0a 20 20 20 20 63 6f 6e 73 74  o, 3);.    const
de60: 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 61 74 65 20   char *zCollate 
de70: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
de80: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
de90: 78 74 28 70 58 49 6e 66 6f 2c 20 34 29 3b 0a 20  xt(pXInfo, 4);. 
dea0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
deb0: 43 6f 6c 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  Col;.    const c
dec0: 68 61 72 20 2a 7a 54 79 70 65 3b 0a 0a 20 20 20  har *zType;..   
ded0: 20 69 66 28 20 69 43 69 64 3c 30 20 29 7b 0a 20   if( iCid<0 ){. 
dee0: 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 74 65 67       /* An integ
def0: 65 72 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20  er primary key. 
df00: 49 66 20 74 68 65 20 74 61 62 6c 65 20 68 61 73  If the table has
df10: 20 61 6e 20 65 78 70 6c 69 63 69 74 20 49 50 4b   an explicit IPK
df20: 2c 20 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 69  , use.      ** i
df30: 74 73 20 6e 61 6d 65 2e 20 4f 74 68 65 72 77 69  ts name. Otherwi
df40: 73 65 2c 20 75 73 65 20 22 72 62 75 5f 72 6f 77  se, use "rbu_row
df50: 69 64 22 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69  id".  */.      i
df60: 66 28 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d  f( pIter->eType=
df70: 3d 52 42 55 5f 50 4b 5f 49 50 4b 20 29 7b 0a 20  =RBU_PK_IPK ){. 
df80: 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20         int i;.  
df90: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 70        for(i=0; p
dfa0: 49 74 65 72 2d 3e 61 62 54 62 6c 50 6b 5b 69 5d  Iter->abTblPk[i]
dfb0: 3d 3d 30 3b 20 69 2b 2b 29 3b 0a 20 20 20 20 20  ==0; i++);.     
dfc0: 20 20 20 61 73 73 65 72 74 28 20 69 3c 70 49 74     assert( i<pIt
dfd0: 65 72 2d 3e 6e 54 62 6c 43 6f 6c 20 29 3b 0a 20  er->nTblCol );. 
dfe0: 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 70 49         zCol = pI
dff0: 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69 5d  ter->azTblCol[i]
e000: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
e010: 28 20 72 62 75 49 73 56 61 63 75 75 6d 28 70 29  ( rbuIsVacuum(p)
e020: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c   ){.        zCol
e030: 20 3d 20 22 5f 72 6f 77 69 64 5f 22 3b 0a 20 20   = "_rowid_";.  
e040: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e050: 20 20 20 7a 43 6f 6c 20 3d 20 22 72 62 75 5f 72     zCol = "rbu_r
e060: 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 7d 0a 20  owid";.      }. 
e070: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 49 4e       zType = "IN
e080: 54 45 47 45 52 22 3b 0a 20 20 20 20 7d 65 6c 73  TEGER";.    }els
e090: 65 7b 0a 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20  e{.      zCol = 
e0a0: 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b  pIter->azTblCol[
e0b0: 69 43 69 64 5d 3b 0a 20 20 20 20 20 20 7a 54 79  iCid];.      zTy
e0c0: 70 65 20 3d 20 70 49 74 65 72 2d 3e 61 7a 54 62  pe = pIter->azTb
e0d0: 6c 54 79 70 65 5b 69 43 69 64 5d 3b 0a 20 20 20  lType[iCid];.   
e0e0: 20 7d 0a 0a 20 20 20 20 7a 52 65 74 20 3d 20 73   }..    zRet = s
e0f0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
e100: 25 7a 25 73 5c 22 25 77 5c 22 20 43 4f 4c 4c 41  %z%s\"%w\" COLLA
e110: 54 45 20 25 51 22 2c 20 7a 52 65 74 2c 20 7a 43  TE %Q", zRet, zC
e120: 6f 6d 2c 20 7a 43 6f 6c 2c 20 7a 43 6f 6c 6c 61  om, zCol, zColla
e130: 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74  te);.    if( pIt
e140: 65 72 2d 3e 62 55 6e 69 71 75 65 3d 3d 30 20 7c  er->bUnique==0 |
e150: 7c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  | sqlite3_column
e160: 5f 69 6e 74 28 70 58 49 6e 66 6f 2c 20 35 29 20  _int(pXInfo, 5) 
e170: 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
e180: 68 61 72 20 2a 7a 4f 72 64 65 72 20 3d 20 28 62  har *zOrder = (b
e190: 44 65 73 63 20 3f 20 22 20 44 45 53 43 22 20 3a  Desc ? " DESC" :
e1a0: 20 22 22 29 3b 0a 20 20 20 20 20 20 7a 49 6d 70   "");.      zImp
e1b0: 50 4b 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  PK = sqlite3_mpr
e1c0: 69 6e 74 66 28 22 25 7a 25 73 5c 22 72 62 75 5f  intf("%z%s\"rbu_
e1d0: 69 6d 70 5f 25 64 25 77 5c 22 25 73 22 2c 20 0a  imp_%d%w\"%s", .
e1e0: 20 20 20 20 20 20 20 20 20 20 7a 49 6d 70 50 4b            zImpPK
e1f0: 2c 20 7a 43 6f 6d 2c 20 6e 42 69 6e 64 2c 20 7a  , zCom, nBind, z
e200: 43 6f 6c 2c 20 7a 4f 72 64 65 72 0a 20 20 20 20  Col, zOrder.    
e210: 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a    );.    }.    z
e220: 49 6d 70 43 6f 6c 73 20 3d 20 73 71 6c 69 74 65  ImpCols = sqlite
e230: 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a 25 73 5c  3_mprintf("%z%s\
e240: 22 72 62 75 5f 69 6d 70 5f 25 64 25 77 5c 22 20  "rbu_imp_%d%w\" 
e250: 25 73 20 43 4f 4c 4c 41 54 45 20 25 51 22 2c 20  %s COLLATE %Q", 
e260: 0a 20 20 20 20 20 20 20 20 7a 49 6d 70 43 6f 6c  .        zImpCol
e270: 73 2c 20 7a 43 6f 6d 2c 20 6e 42 69 6e 64 2c 20  s, zCom, nBind, 
e280: 7a 43 6f 6c 2c 20 7a 54 79 70 65 2c 20 7a 43 6f  zCol, zType, zCo
e290: 6c 6c 61 74 65 0a 20 20 20 20 29 3b 0a 20 20 20  llate.    );.   
e2a0: 20 7a 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65   zWhere = sqlite
e2b0: 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20  3_mprintf(.     
e2c0: 20 20 20 22 25 7a 25 73 5c 22 72 62 75 5f 69 6d     "%z%s\"rbu_im
e2d0: 70 5f 25 64 25 77 5c 22 20 49 53 20 3f 22 2c 20  p_%d%w\" IS ?", 
e2e0: 7a 57 68 65 72 65 2c 20 7a 41 6e 64 2c 20 6e 42  zWhere, zAnd, nB
e2f0: 69 6e 64 2c 20 7a 43 6f 6c 0a 20 20 20 20 29 3b  ind, zCol.    );
e300: 0a 20 20 20 20 69 66 28 20 7a 52 65 74 3d 3d 30  .    if( zRet==0
e310: 20 7c 7c 20 7a 49 6d 70 50 4b 3d 3d 30 20 7c 7c   || zImpPK==0 ||
e320: 20 7a 49 6d 70 43 6f 6c 73 3d 3d 30 20 7c 7c 20   zImpCols==0 || 
e330: 7a 57 68 65 72 65 3d 3d 30 20 29 20 72 63 20 3d  zWhere==0 ) rc =
e340: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
e350: 20 20 20 7a 43 6f 6d 20 3d 20 22 2c 20 22 3b 0a     zCom = ", ";.
e360: 20 20 20 20 7a 41 6e 64 20 3d 20 22 20 41 4e 44      zAnd = " AND
e370: 20 22 3b 0a 20 20 20 20 6e 42 69 6e 64 2b 2b 3b   ";.    nBind++;
e380: 0a 20 20 7d 0a 0a 20 20 72 63 32 20 3d 20 73 71  .  }..  rc2 = sq
e390: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
e3a0: 58 49 6e 66 6f 29 3b 0a 20 20 69 66 28 20 72 63  XInfo);.  if( rc
e3b0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63  ==SQLITE_OK ) rc
e3c0: 20 3d 20 72 63 32 3b 0a 0a 20 20 69 66 28 20 72   = rc2;..  if( r
e3d0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
e3e0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
e3f0: 28 7a 52 65 74 29 3b 0a 20 20 20 20 73 71 6c 69  (zRet);.    sqli
e400: 74 65 33 5f 66 72 65 65 28 7a 49 6d 70 43 6f 6c  te3_free(zImpCol
e410: 73 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  s);.    sqlite3_
e420: 66 72 65 65 28 7a 49 6d 70 50 4b 29 3b 0a 20 20  free(zImpPK);.  
e430: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
e440: 57 68 65 72 65 29 3b 0a 20 20 20 20 7a 52 65 74  Where);.    zRet
e450: 20 3d 20 30 3b 0a 20 20 20 20 7a 49 6d 70 43 6f   = 0;.    zImpCo
e460: 6c 73 20 3d 20 30 3b 0a 20 20 20 20 7a 49 6d 70  ls = 0;.    zImp
e470: 50 4b 20 3d 20 30 3b 0a 20 20 20 20 7a 57 68 65  PK = 0;.    zWhe
e480: 72 65 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 72  re = 0;.    p->r
e490: 63 20 3d 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2a  c = rc;.  }..  *
e4a0: 70 7a 49 6d 70 6f 73 74 65 72 43 6f 6c 73 20 3d  pzImposterCols =
e4b0: 20 7a 49 6d 70 43 6f 6c 73 3b 0a 20 20 2a 70 7a   zImpCols;.  *pz
e4c0: 49 6d 70 6f 73 74 65 72 50 6b 20 3d 20 7a 49 6d  ImposterPk = zIm
e4d0: 70 50 4b 3b 0a 20 20 2a 70 7a 57 68 65 72 65 20  pPK;.  *pzWhere 
e4e0: 3d 20 7a 57 68 65 72 65 3b 0a 20 20 2a 70 6e 42  = zWhere;.  *pnB
e4f0: 69 6e 64 20 3d 20 6e 42 69 6e 64 3b 0a 20 20 72  ind = nBind;.  r
e500: 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 0a 2f  eturn zRet;.}../
e510: 2a 0a 2a 2a 20 41 73 73 75 6d 69 6e 67 20 74 68  *.** Assuming th
e520: 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20  e current table 
e530: 63 6f 6c 75 6d 6e 73 20 61 72 65 20 22 61 22 2c  columns are "a",
e540: 20 22 62 22 20 61 6e 64 20 22 63 22 2c 20 61 6e   "b" and "c", an
e550: 64 20 74 68 65 20 7a 4f 62 6a 0a 2a 2a 20 70 61  d the zObj.** pa
e560: 72 61 6d 74 65 72 20 69 73 20 70 61 73 73 65 64  ramter is passed
e570: 20 22 6f 6c 64 22 2c 20 72 65 74 75 72 6e 20 61   "old", return a
e580: 20 73 74 72 69 6e 67 20 6f 66 20 74 68 65 20 66   string of the f
e590: 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 22  orm:.**.**     "
e5a0: 6f 6c 64 2e 61 2c 20 6f 6c 64 2e 62 2c 20 6f 6c  old.a, old.b, ol
e5b0: 64 2e 62 22 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20  d.b".**.** With 
e5c0: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
e5d0: 20 65 73 63 61 70 65 64 2e 0a 2a 2a 0a 2a 2a 20   escaped..**.** 
e5e0: 46 6f 72 20 74 61 62 6c 65 73 20 77 69 74 68 20  For tables with 
e5f0: 69 6d 70 6c 69 63 69 74 20 72 6f 77 69 64 73 20  implicit rowids 
e600: 2d 20 52 42 55 5f 50 4b 5f 45 58 54 45 52 4e 41  - RBU_PK_EXTERNA
e610: 4c 20 61 6e 64 20 52 42 55 5f 50 4b 5f 4e 4f 4e  L and RBU_PK_NON
e620: 45 2c 20 61 70 70 65 6e 64 0a 2a 2a 20 74 68 65  E, append.** the
e630: 20 74 65 78 74 20 22 2c 20 6f 6c 64 2e 5f 72 6f   text ", old._ro
e640: 77 69 64 5f 22 20 74 6f 20 74 68 65 20 72 65 74  wid_" to the ret
e650: 75 72 6e 65 64 20 76 61 6c 75 65 2e 0a 2a 2f 0a  urned value..*/.
e660: 73 74 61 74 69 63 20 63 68 61 72 20 2a 72 62 75  static char *rbu
e670: 4f 62 6a 49 74 65 72 47 65 74 4f 6c 64 6c 69 73  ObjIterGetOldlis
e680: 74 28 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20  t(.  sqlite3rbu 
e690: 2a 70 2c 20 0a 20 20 52 62 75 4f 62 6a 49 74 65  *p, .  RbuObjIte
e6a0: 72 20 2a 70 49 74 65 72 2c 0a 20 20 63 6f 6e 73  r *pIter,.  cons
e6b0: 74 20 63 68 61 72 20 2a 7a 4f 62 6a 0a 29 7b 0a  t char *zObj.){.
e6c0: 20 20 63 68 61 72 20 2a 7a 4c 69 73 74 20 3d 20    char *zList = 
e6d0: 30 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  0;.  if( p->rc==
e6e0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 49 74  SQLITE_OK && pIt
e6f0: 65 72 2d 3e 61 62 49 6e 64 65 78 65 64 20 29 7b  er->abIndexed ){
e700: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
e710: 2a 7a 53 20 3d 20 22 22 3b 0a 20 20 20 20 69 6e  *zS = "";.    in
e720: 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
e730: 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 54 62 6c 43  ; i<pIter->nTblC
e740: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
e750: 69 66 28 20 70 49 74 65 72 2d 3e 61 62 49 6e 64  if( pIter->abInd
e760: 65 78 65 64 5b 69 5d 20 29 7b 0a 20 20 20 20 20  exed[i] ){.     
e770: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
e780: 43 6f 6c 20 3d 20 70 49 74 65 72 2d 3e 61 7a 54  Col = pIter->azT
e790: 62 6c 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20 20  blCol[i];.      
e7a0: 20 20 7a 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    zList = sqlite
e7b0: 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a 25 73 25  3_mprintf("%z%s%
e7c0: 73 2e 5c 22 25 77 5c 22 22 2c 20 7a 4c 69 73 74  s.\"%w\"", zList
e7d0: 2c 20 7a 53 2c 20 7a 4f 62 6a 2c 20 7a 43 6f 6c  , zS, zObj, zCol
e7e0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
e7f0: 20 20 20 20 20 20 20 20 7a 4c 69 73 74 20 3d 20          zList = 
e800: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
e810: 22 25 7a 25 73 4e 55 4c 4c 22 2c 20 7a 4c 69 73  "%z%sNULL", zLis
e820: 74 2c 20 7a 53 29 3b 0a 20 20 20 20 20 20 7d 0a  t, zS);.      }.
e830: 20 20 20 20 20 20 7a 53 20 3d 20 22 2c 20 22 3b        zS = ", ";
e840: 0a 20 20 20 20 20 20 69 66 28 20 7a 4c 69 73 74  .      if( zList
e850: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
e860: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ->rc = SQLITE_NO
e870: 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 62 72 65  MEM;.        bre
e880: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
e890: 7d 0a 0a 20 20 20 20 2f 2a 20 46 6f 72 20 61 20  }..    /* For a 
e8a0: 74 61 62 6c 65 20 77 69 74 68 20 69 6d 70 6c 69  table with impli
e8b0: 63 69 74 20 72 6f 77 69 64 73 2c 20 61 70 70 65  cit rowids, appe
e8c0: 6e 64 20 22 6f 6c 64 2e 5f 72 6f 77 69 64 5f 22  nd "old._rowid_"
e8d0: 20 74 6f 20 74 68 65 20 6c 69 73 74 2e 20 2a 2f   to the list. */
e8e0: 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e  .    if( pIter->
e8f0: 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 45 58  eType==RBU_PK_EX
e900: 54 45 52 4e 41 4c 20 7c 7c 20 70 49 74 65 72 2d  TERNAL || pIter-
e910: 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 4e  >eType==RBU_PK_N
e920: 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 7a 4c 69  ONE ){.      zLi
e930: 73 74 20 3d 20 72 62 75 4d 50 72 69 6e 74 66 28  st = rbuMPrintf(
e940: 70 2c 20 22 25 7a 2c 20 25 73 2e 5f 72 6f 77 69  p, "%z, %s._rowi
e950: 64 5f 22 2c 20 7a 4c 69 73 74 2c 20 7a 4f 62 6a  d_", zList, zObj
e960: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
e970: 65 74 75 72 6e 20 7a 4c 69 73 74 3b 0a 7d 0a 0a  eturn zList;.}..
e980: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20  /*.** Return an 
e990: 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
e9a0: 63 61 6e 20 62 65 20 75 73 65 64 20 69 6e 20 61  can be used in a
e9b0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f   WHERE clause to
e9c0: 20 6d 61 74 63 68 20 74 68 65 0a 2a 2a 20 70 72   match the.** pr
e9d0: 69 6d 61 72 79 20 6b 65 79 20 6f 66 20 74 68 65  imary key of the
e9e0: 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65 2e 20   current table. 
e9f0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20  For example, if 
ea00: 74 68 65 20 74 61 62 6c 65 20 69 73 3a 0a 2a 2a  the table is:.**
ea10: 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42  .**   CREATE TAB
ea20: 4c 45 20 74 31 28 61 2c 20 62 2c 20 63 2c 20 50  LE t1(a, b, c, P
ea30: 52 49 4d 41 52 59 20 4b 45 59 28 62 2c 20 63 29  RIMARY KEY(b, c)
ea40: 29 3b 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  );.**.** Return 
ea50: 74 68 65 20 73 74 72 69 6e 67 3a 0a 2a 2a 0a 2a  the string:.**.*
ea60: 2a 20 20 20 22 62 20 3d 20 3f 31 20 41 4e 44 20  *   "b = ?1 AND 
ea70: 63 20 3d 20 3f 32 22 0a 2a 2f 0a 73 74 61 74 69  c = ?2".*/.stati
ea80: 63 20 63 68 61 72 20 2a 72 62 75 4f 62 6a 49 74  c char *rbuObjIt
ea90: 65 72 47 65 74 57 68 65 72 65 28 0a 20 20 73 71  erGetWhere(.  sq
eaa0: 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 0a 20 20  lite3rbu *p, .  
eab0: 52 62 75 4f 62 6a 49 74 65 72 20 2a 70 49 74 65  RbuObjIter *pIte
eac0: 72 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4c 69  r.){.  char *zLi
ead0: 73 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 49  st = 0;.  if( pI
eae0: 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f  ter->eType==RBU_
eaf0: 50 4b 5f 56 54 41 42 20 7c 7c 20 70 49 74 65 72  PK_VTAB || pIter
eb00: 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f  ->eType==RBU_PK_
eb10: 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 7a 4c 69 73  NONE ){.    zLis
eb20: 74 20 3d 20 72 62 75 4d 50 72 69 6e 74 66 28 70  t = rbuMPrintf(p
eb30: 2c 20 22 5f 72 6f 77 69 64 5f 20 3d 20 3f 25 64  , "_rowid_ = ?%d
eb40: 22 2c 20 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f  ", pIter->nTblCo
eb50: 6c 2b 31 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  l+1);.  }else if
eb60: 28 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d  ( pIter->eType==
eb70: 52 42 55 5f 50 4b 5f 45 58 54 45 52 4e 41 4c 20  RBU_PK_EXTERNAL 
eb80: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
eb90: 72 20 2a 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20  r *zSep = "";.  
eba0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
ebb0: 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e  (i=0; i<pIter->n
ebc0: 54 62 6c 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  TblCol; i++){.  
ebd0: 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 61      if( pIter->a
ebe0: 62 54 62 6c 50 6b 5b 69 5d 20 29 7b 0a 20 20 20  bTblPk[i] ){.   
ebf0: 20 20 20 20 20 7a 4c 69 73 74 20 3d 20 72 62 75       zList = rbu
ec00: 4d 50 72 69 6e 74 66 28 70 2c 20 22 25 7a 25 73  MPrintf(p, "%z%s
ec10: 63 25 64 3d 3f 25 64 22 2c 20 7a 4c 69 73 74 2c  c%d=?%d", zList,
ec20: 20 7a 53 65 70 2c 20 69 2c 20 69 2b 31 29 3b 0a   zSep, i, i+1);.
ec30: 20 20 20 20 20 20 20 20 7a 53 65 70 20 3d 20 22          zSep = "
ec40: 20 41 4e 44 20 22 3b 0a 20 20 20 20 20 20 7d 0a   AND ";.      }.
ec50: 20 20 20 20 7d 0a 20 20 20 20 7a 4c 69 73 74 20      }.    zList 
ec60: 3d 20 72 62 75 4d 50 72 69 6e 74 66 28 70 2c 20  = rbuMPrintf(p, 
ec70: 0a 20 20 20 20 20 20 20 20 22 5f 72 6f 77 69 64  .        "_rowid
ec80: 5f 20 3d 20 28 53 45 4c 45 43 54 20 69 64 20 46  _ = (SELECT id F
ec90: 52 4f 4d 20 72 62 75 5f 69 6d 70 6f 73 74 65 72  ROM rbu_imposter
eca0: 32 20 57 48 45 52 45 20 25 7a 29 22 2c 20 7a 4c  2 WHERE %z)", zL
ecb0: 69 73 74 0a 20 20 20 20 29 3b 0a 0a 20 20 7d 65  ist.    );..  }e
ecc0: 6c 73 65 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  lse{.    const c
ecd0: 68 61 72 20 2a 7a 53 65 70 20 3d 20 22 22 3b 0a  har *zSep = "";.
ece0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
ecf0: 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d  or(i=0; i<pIter-
ed00: 3e 6e 54 62 6c 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  >nTblCol; i++){.
ed10: 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d        if( pIter-
ed20: 3e 61 62 54 62 6c 50 6b 5b 69 5d 20 29 7b 0a 20  >abTblPk[i] ){. 
ed30: 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
ed40: 72 20 2a 7a 43 6f 6c 20 3d 20 70 49 74 65 72 2d  r *zCol = pIter-
ed50: 3e 61 7a 54 62 6c 43 6f 6c 5b 69 5d 3b 0a 20 20  >azTblCol[i];.  
ed60: 20 20 20 20 20 20 7a 4c 69 73 74 20 3d 20 72 62        zList = rb
ed70: 75 4d 50 72 69 6e 74 66 28 70 2c 20 22 25 7a 25  uMPrintf(p, "%z%
ed80: 73 5c 22 25 77 5c 22 3d 3f 25 64 22 2c 20 7a 4c  s\"%w\"=?%d", zL
ed90: 69 73 74 2c 20 7a 53 65 70 2c 20 7a 43 6f 6c 2c  ist, zSep, zCol,
eda0: 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 7a   i+1);.        z
edb0: 53 65 70 20 3d 20 22 20 41 4e 44 20 22 3b 0a 20  Sep = " AND ";. 
edc0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
edd0: 0a 20 20 72 65 74 75 72 6e 20 7a 4c 69 73 74 3b  .  return zList;
ede0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 53 45  .}../*.** The SE
edf0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69  LECT statement i
ee00: 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68  terating through
ee10: 20 74 68 65 20 6b 65 79 73 20 66 6f 72 20 74 68   the keys for th
ee20: 65 20 63 75 72 72 65 6e 74 20 6f 62 6a 65 63 74  e current object
ee30: 0a 2a 2a 20 28 70 2d 3e 6f 62 6a 69 74 65 72 2e  .** (p->objiter.
ee40: 70 53 65 6c 65 63 74 29 20 63 75 72 72 65 6e 74  pSelect) current
ee50: 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 76  ly points to a v
ee60: 61 6c 69 64 20 72 6f 77 2e 20 48 6f 77 65 76 65  alid row. Howeve
ee70: 72 2c 20 74 68 65 72 65 0a 2a 2a 20 69 73 20 73  r, there.** is s
ee80: 6f 6d 65 74 68 69 6e 67 20 77 72 6f 6e 67 20 77  omething wrong w
ee90: 69 74 68 20 74 68 65 20 72 62 75 5f 63 6f 6e 74  ith the rbu_cont
eea0: 72 6f 6c 20 76 61 6c 75 65 20 69 6e 20 74 68 65  rol value in the
eeb0: 20 72 62 75 5f 63 6f 6e 74 72 6f 6c 20 76 61 6c   rbu_control val
eec0: 75 65 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20  ue.** stored in 
eed0: 74 68 65 20 28 70 2d 3e 6e 43 6f 6c 2b 31 29 27  the (p->nCol+1)'
eee0: 74 68 20 63 6f 6c 75 6d 6e 2e 20 53 65 74 20 74  th column. Set t
eef0: 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e  he error code an
ef00: 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a  d error message.
ef10: 2a 2a 20 6f 66 20 74 68 65 20 52 42 55 20 68 61  ** of the RBU ha
ef20: 6e 64 6c 65 20 74 6f 20 73 6f 6d 65 74 68 69 6e  ndle to somethin
ef30: 67 20 72 65 66 6c 65 63 74 69 6e 67 20 74 68 69  g reflecting thi
ef40: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
ef50: 64 20 72 62 75 42 61 64 43 6f 6e 74 72 6f 6c 45  d rbuBadControlE
ef60: 72 72 6f 72 28 73 71 6c 69 74 65 33 72 62 75 20  rror(sqlite3rbu 
ef70: 2a 70 29 7b 0a 20 20 70 2d 3e 72 63 20 3d 20 53  *p){.  p->rc = S
ef80: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 70  QLITE_ERROR;.  p
ef90: 2d 3e 7a 45 72 72 6d 73 67 20 3d 20 73 71 6c 69  ->zErrmsg = sqli
efa0: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 69 6e 76  te3_mprintf("inv
efb0: 61 6c 69 64 20 72 62 75 5f 63 6f 6e 74 72 6f 6c  alid rbu_control
efc0: 20 76 61 6c 75 65 22 29 3b 0a 7d 0a 0a 0a 2f 2a   value");.}.../*
efd0: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 6e 75 6c  .** Return a nul
efe0: 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69  -terminated stri
eff0: 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ng containing th
f000: 65 20 63 6f 6d 6d 61 20 73 65 70 61 72 61 74 65  e comma separate
f010: 64 20 6c 69 73 74 20 6f 66 0a 2a 2a 20 61 73 73  d list of.** ass
f020: 69 67 6e 6d 65 6e 74 73 20 74 68 61 74 20 73 68  ignments that sh
f030: 6f 75 6c 64 20 62 65 20 69 6e 63 6c 75 64 65 64  ould be included
f040: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 22   following the "
f050: 53 45 54 22 20 6b 65 79 77 6f 72 64 20 6f 66 0a  SET" keyword of.
f060: 2a 2a 20 61 6e 20 55 50 44 41 54 45 20 73 74 61  ** an UPDATE sta
f070: 74 65 6d 65 6e 74 20 75 73 65 64 20 74 6f 20 75  tement used to u
f080: 70 64 61 74 65 20 74 68 65 20 74 61 62 6c 65 20  pdate the table 
f090: 6f 62 6a 65 63 74 20 74 68 61 74 20 74 68 65 20  object that the 
f0a0: 69 74 65 72 61 74 6f 72 0a 2a 2a 20 70 61 73 73  iterator.** pass
f0b0: 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
f0c0: 20 61 72 67 75 6d 65 6e 74 20 63 75 72 72 65 6e   argument curren
f0d0: 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 69 66  tly points to if
f0e0: 20 74 68 65 20 72 62 75 5f 63 6f 6e 74 72 6f 6c   the rbu_control
f0f0: 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  .** column of th
f100: 65 20 64 61 74 61 5f 78 78 78 20 74 61 62 6c 65  e data_xxx table
f110: 20 65 6e 74 72 79 20 69 73 20 73 65 74 20 74 6f   entry is set to
f120: 20 7a 4d 61 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68   zMask..**.** Th
f130: 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68 65  e memory for the
f140: 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67   returned string
f150: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
f160: 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
f170: 28 29 2e 0a 2a 2a 20 49 74 20 69 73 20 74 68 65  ()..** It is the
f180: 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
f190: 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  of the caller to
f1a0: 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65   eventually free
f1b0: 20 69 74 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c   it using.** sql
f1c0: 69 74 65 33 5f 66 72 65 65 28 29 2e 20 0a 2a 2a  ite3_free(). .**
f1d0: 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72  .** If an OOM er
f1e0: 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ror is encounter
f1f0: 65 64 20 77 68 65 6e 20 61 6c 6c 6f 63 61 74 69  ed when allocati
f200: 6e 67 20 73 70 61 63 65 20 66 6f 72 20 74 68 65  ng space for the
f210: 20 6e 65 77 0a 2a 2a 20 73 74 72 69 6e 67 2c 20   new.** string, 
f220: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
f230: 20 6c 65 66 74 20 69 6e 20 74 68 65 20 72 62 75   left in the rbu
f240: 20 68 61 6e 64 6c 65 20 70 61 73 73 65 64 20 61   handle passed a
f250: 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 61  s the first.** a
f260: 72 67 75 6d 65 6e 74 20 61 6e 64 20 4e 55 4c 4c  rgument and NULL
f270: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 72   is returned. Or
f280: 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 68 61  , if an error ha
f290: 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72  s already occurr
f2a0: 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20  ed.** when this 
f2b0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
f2c0: 65 64 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  ed, NULL is retu
f2d0: 72 6e 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79  rned immediately
f2e0: 2c 20 77 69 74 68 6f 75 74 0a 2a 2a 20 61 74 74  , without.** att
f2f0: 65 6d 70 74 69 6e 67 20 74 68 65 20 61 6c 6c 6f  empting the allo
f300: 63 61 74 69 6f 6e 20 6f 72 20 6d 6f 64 69 66 79  cation or modify
f310: 69 6e 67 20 74 68 65 20 73 74 6f 72 65 64 20 65  ing the stored e
f320: 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74  rror code..*/.st
f330: 61 74 69 63 20 63 68 61 72 20 2a 72 62 75 4f 62  atic char *rbuOb
f340: 6a 49 74 65 72 47 65 74 53 65 74 6c 69 73 74 28  jIterGetSetlist(
f350: 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20 2a 70  .  sqlite3rbu *p
f360: 2c 0a 20 20 52 62 75 4f 62 6a 49 74 65 72 20 2a  ,.  RbuObjIter *
f370: 70 49 74 65 72 2c 0a 20 20 63 6f 6e 73 74 20 63  pIter,.  const c
f380: 68 61 72 20 2a 7a 4d 61 73 6b 0a 29 7b 0a 20 20  har *zMask.){.  
f390: 63 68 61 72 20 2a 7a 4c 69 73 74 20 3d 20 30 3b  char *zList = 0;
f3a0: 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
f3b0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
f3c0: 6e 74 20 69 3b 0a 0a 20 20 20 20 69 66 28 20 28  nt i;..    if( (
f3d0: 69 6e 74 29 73 74 72 6c 65 6e 28 7a 4d 61 73 6b  int)strlen(zMask
f3e0: 29 21 3d 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f  )!=pIter->nTblCo
f3f0: 6c 20 29 7b 0a 20 20 20 20 20 20 72 62 75 42 61  l ){.      rbuBa
f400: 64 43 6f 6e 74 72 6f 6c 45 72 72 6f 72 28 70 29  dControlError(p)
f410: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
f420: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
f430: 53 65 70 20 3d 20 22 22 3b 0a 20 20 20 20 20 20  Sep = "";.      
f440: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72  for(i=0; i<pIter
f450: 2d 3e 6e 54 62 6c 43 6f 6c 3b 20 69 2b 2b 29 7b  ->nTblCol; i++){
f460: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 63 20  .        char c 
f470: 3d 20 7a 4d 61 73 6b 5b 70 49 74 65 72 2d 3e 61  = zMask[pIter->a
f480: 69 53 72 63 4f 72 64 65 72 5b 69 5d 5d 3b 0a 20  iSrcOrder[i]];. 
f490: 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 78         if( c=='x
f4a0: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  ' ){.          z
f4b0: 4c 69 73 74 20 3d 20 72 62 75 4d 50 72 69 6e 74  List = rbuMPrint
f4c0: 66 28 70 2c 20 22 25 7a 25 73 5c 22 25 77 5c 22  f(p, "%z%s\"%w\"
f4d0: 3d 3f 25 64 22 2c 20 0a 20 20 20 20 20 20 20 20  =?%d", .        
f4e0: 20 20 20 20 20 20 7a 4c 69 73 74 2c 20 7a 53 65        zList, zSe
f4f0: 70 2c 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43  p, pIter->azTblC
f500: 6f 6c 5b 69 5d 2c 20 69 2b 31 0a 20 20 20 20 20  ol[i], i+1.     
f510: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
f520: 20 20 7a 53 65 70 20 3d 20 22 2c 20 22 3b 0a 20    zSep = ", ";. 
f530: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
f540: 20 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 64 27   else if( c=='d'
f550: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 4c   ){.          zL
f560: 69 73 74 20 3d 20 72 62 75 4d 50 72 69 6e 74 66  ist = rbuMPrintf
f570: 28 70 2c 20 22 25 7a 25 73 5c 22 25 77 5c 22 3d  (p, "%z%s\"%w\"=
f580: 72 62 75 5f 64 65 6c 74 61 28 5c 22 25 77 5c 22  rbu_delta(\"%w\"
f590: 2c 20 3f 25 64 29 22 2c 20 0a 20 20 20 20 20 20  , ?%d)", .      
f5a0: 20 20 20 20 20 20 20 20 7a 4c 69 73 74 2c 20 7a          zList, z
f5b0: 53 65 70 2c 20 70 49 74 65 72 2d 3e 61 7a 54 62  Sep, pIter->azTb
f5c0: 6c 43 6f 6c 5b 69 5d 2c 20 70 49 74 65 72 2d 3e  lCol[i], pIter->
f5d0: 61 7a 54 62 6c 43 6f 6c 5b 69 5d 2c 20 69 2b 31  azTblCol[i], i+1
f5e0: 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20  .          );.  
f5f0: 20 20 20 20 20 20 20 20 7a 53 65 70 20 3d 20 22          zSep = "
f600: 2c 20 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  , ";.        }. 
f610: 20 20 20 20 20 20 20 65 6c 73 65 20 69 66 28 20         else if( 
f620: 63 3d 3d 27 66 27 20 29 7b 0a 20 20 20 20 20 20  c=='f' ){.      
f630: 20 20 20 20 7a 4c 69 73 74 20 3d 20 72 62 75 4d      zList = rbuM
f640: 50 72 69 6e 74 66 28 70 2c 20 22 25 7a 25 73 5c  Printf(p, "%z%s\
f650: 22 25 77 5c 22 3d 72 62 75 5f 66 6f 73 73 69 6c  "%w\"=rbu_fossil
f660: 5f 64 65 6c 74 61 28 5c 22 25 77 5c 22 2c 20 3f  _delta(\"%w\", ?
f670: 25 64 29 22 2c 20 0a 20 20 20 20 20 20 20 20 20  %d)", .         
f680: 20 20 20 20 20 7a 4c 69 73 74 2c 20 7a 53 65 70       zList, zSep
f690: 2c 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f  , pIter->azTblCo
f6a0: 6c 5b 69 5d 2c 20 70 49 74 65 72 2d 3e 61 7a 54  l[i], pIter->azT
f6b0: 62 6c 43 6f 6c 5b 69 5d 2c 20 69 2b 31 0a 20 20  blCol[i], i+1.  
f6c0: 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
f6d0: 20 20 20 20 20 7a 53 65 70 20 3d 20 22 2c 20 22       zSep = ", "
f6e0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
f6f0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
f700: 72 65 74 75 72 6e 20 7a 4c 69 73 74 3b 0a 7d 0a  return zList;.}.
f710: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
f720: 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73  nul-terminated s
f730: 74 72 69 6e 67 20 63 6f 6e 73 69 73 74 69 6e 67  tring consisting
f740: 20 6f 66 20 6e 42 79 74 65 20 63 6f 6d 6d 61 20   of nByte comma 
f750: 73 65 70 61 72 61 74 65 64 0a 2a 2a 20 22 3f 22  separated.** "?"
f760: 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 46 6f   expressions. Fo
f770: 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 6e 42  r example, if nB
f780: 79 74 65 20 69 73 20 33 2c 20 72 65 74 75 72 6e  yte is 3, return
f790: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a   a pointer to.**
f7a0: 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69   a buffer contai
f7b0: 6e 69 6e 67 20 74 68 65 20 73 74 72 69 6e 67 20  ning the string 
f7c0: 22 3f 2c 3f 2c 3f 22 2e 0a 2a 2a 0a 2a 2a 20 54  "?,?,?"..**.** T
f7d0: 68 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68  he memory for th
f7e0: 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e  e returned strin
f7f0: 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  g is obtained fr
f800: 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
f810: 63 28 29 2e 0a 2a 2a 20 49 74 20 69 73 20 74 68  c()..** It is th
f820: 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
f830: 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74   of the caller t
f840: 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65  o eventually fre
f850: 65 20 69 74 20 75 73 69 6e 67 0a 2a 2a 20 73 71  e it using.** sq
f860: 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 20 0a 2a  lite3_free(). .*
f870: 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65  *.** If an OOM e
f880: 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65  rror is encounte
f890: 72 65 64 20 77 68 65 6e 20 61 6c 6c 6f 63 61 74  red when allocat
f8a0: 69 6e 67 20 73 70 61 63 65 20 66 6f 72 20 74 68  ing space for th
f8b0: 65 20 6e 65 77 0a 2a 2a 20 73 74 72 69 6e 67 2c  e new.** string,
f8c0: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
f8d0: 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20 72 62  s left in the rb
f8e0: 75 20 68 61 6e 64 6c 65 20 70 61 73 73 65 64 20  u handle passed 
f8f0: 61 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20  as the first.** 
f900: 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 4e 55 4c  argument and NUL
f910: 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  L is returned. O
f920: 72 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 68  r, if an error h
f930: 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72  as already occur
f940: 72 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73  red.** when this
f950: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
f960: 6c 65 64 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74  led, NULL is ret
f970: 75 72 6e 65 64 20 69 6d 6d 65 64 69 61 74 65 6c  urned immediatel
f980: 79 2c 20 77 69 74 68 6f 75 74 0a 2a 2a 20 61 74  y, without.** at
f990: 74 65 6d 70 74 69 6e 67 20 74 68 65 20 61 6c 6c  tempting the all
f9a0: 6f 63 61 74 69 6f 6e 20 6f 72 20 6d 6f 64 69 66  ocation or modif
f9b0: 79 69 6e 67 20 74 68 65 20 73 74 6f 72 65 64 20  ying the stored 
f9c0: 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73  error code..*/.s
f9d0: 74 61 74 69 63 20 63 68 61 72 20 2a 72 62 75 4f  tatic char *rbuO
f9e0: 62 6a 49 74 65 72 47 65 74 42 69 6e 64 6c 69 73  bjIterGetBindlis
f9f0: 74 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c  t(sqlite3rbu *p,
fa00: 20 69 6e 74 20 6e 42 69 6e 64 29 7b 0a 20 20 63   int nBind){.  c
fa10: 68 61 72 20 2a 7a 52 65 74 20 3d 20 30 3b 0a 20  har *zRet = 0;. 
fa20: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e   sqlite3_int64 n
fa30: 42 79 74 65 20 3d 20 32 2a 28 73 71 6c 69 74 65  Byte = 2*(sqlite
fa40: 33 5f 69 6e 74 36 34 29 6e 42 69 6e 64 20 2b 20  3_int64)nBind + 
fa50: 31 3b 0a 0a 20 20 7a 52 65 74 20 3d 20 28 63 68  1;..  zRet = (ch
fa60: 61 72 2a 29 72 62 75 4d 61 6c 6c 6f 63 28 70 2c  ar*)rbuMalloc(p,
fa70: 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 7a   nByte);.  if( z
fa80: 52 65 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  Ret ){.    int i
fa90: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
faa0: 3c 6e 42 69 6e 64 3b 20 69 2b 2b 29 7b 0a 20 20  <nBind; i++){.  
fab0: 20 20 20 20 7a 52 65 74 5b 69 2a 32 5d 20 3d 20      zRet[i*2] = 
fac0: 27 3f 27 3b 0a 20 20 20 20 20 20 7a 52 65 74 5b  '?';.      zRet[
fad0: 69 2a 32 2b 31 5d 20 3d 20 28 69 2b 31 3d 3d 6e  i*2+1] = (i+1==n
fae0: 42 69 6e 64 29 20 3f 20 27 5c 30 27 20 3a 20 27  Bind) ? '\0' : '
faf0: 2c 27 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ,';.    }.  }.  
fb00: 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 0a  return zRet;.}..
fb10: 2f 2a 0a 2a 2a 20 54 68 65 20 69 74 65 72 61 74  /*.** The iterat
fb20: 6f 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  or currently poi
fb30: 6e 74 73 20 74 6f 20 61 20 74 61 62 6c 65 20 28  nts to a table (
fb40: 6e 6f 74 20 69 6e 64 65 78 29 20 6f 66 20 74 79  not index) of ty
fb50: 70 65 20 0a 2a 2a 20 52 42 55 5f 50 4b 5f 57 49  pe .** RBU_PK_WI
fb60: 54 48 4f 55 54 5f 52 4f 57 49 44 2e 20 54 68 69  THOUT_ROWID. Thi
fb70: 73 20 66 75 6e 63 74 69 6f 6e 20 63 72 65 61 74  s function creat
fb80: 65 73 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  es the PRIMARY K
fb90: 45 59 20 0a 2a 2a 20 64 65 63 6c 61 72 61 74 69  EY .** declarati
fba0: 6f 6e 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65  on for the corre
fbb0: 73 70 6f 6e 64 69 6e 67 20 69 6d 70 6f 73 74 65  sponding imposte
fbc0: 72 20 74 61 62 6c 65 2e 20 46 6f 72 20 65 78 61  r table. For exa
fbd0: 6d 70 6c 65 2c 0a 2a 2a 20 69 66 20 74 68 65 20  mple,.** if the 
fbe0: 69 74 65 72 61 74 6f 72 20 70 6f 69 6e 74 73 20  iterator points 
fbf0: 74 6f 20 61 20 74 61 62 6c 65 20 63 72 65 61 74  to a table creat
fc00: 65 64 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 43  ed as:.**.**   C
fc10: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
fc20: 2c 20 62 2c 20 63 2c 20 50 52 49 4d 41 52 59 20  , b, c, PRIMARY 
fc30: 4b 45 59 28 62 2c 20 61 20 44 45 53 43 29 29 20  KEY(b, a DESC)) 
fc40: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 0a 2a 2a  WITHOUT ROWID.**
fc50: 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f  .** this functio
fc60: 6e 20 72 65 74 75 72 6e 73 3a 0a 2a 2a 0a 2a 2a  n returns:.**.**
fc70: 20 20 20 50 52 49 4d 41 52 59 20 4b 45 59 28 22     PRIMARY KEY("
fc80: 62 22 2c 20 22 61 22 20 44 45 53 43 29 0a 2a 2f  b", "a" DESC).*/
fc90: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 72 62  .static char *rb
fca0: 75 57 69 74 68 6f 75 74 52 6f 77 69 64 50 4b 28  uWithoutRowidPK(
fcb0: 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 52  sqlite3rbu *p, R
fcc0: 62 75 4f 62 6a 49 74 65 72 20 2a 70 49 74 65 72  buObjIter *pIter
fcd0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 20 3d 20 30  ){.  char *z = 0
fce0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65  ;.  assert( pIte
fcf0: 72 2d 3e 7a 49 64 78 3d 3d 30 20 29 3b 0a 20 20  r->zIdx==0 );.  
fd00: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
fd10: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 6f 6e 73  E_OK ){.    cons
fd20: 74 20 63 68 61 72 20 2a 7a 53 65 70 20 3d 20 22  t char *zSep = "
fd30: 50 52 49 4d 41 52 59 20 4b 45 59 28 22 3b 0a 20  PRIMARY KEY(";. 
fd40: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20     sqlite3_stmt 
fd50: 2a 70 58 4c 69 73 74 20 3d 20 30 3b 20 20 20 20  *pXList = 0;    
fd60: 20 2f 2a 20 50 52 41 47 4d 41 20 69 6e 64 65 78   /* PRAGMA index
fd70: 5f 6c 69 73 74 20 3d 20 28 70 49 74 65 72 2d 3e  _list = (pIter->
fd80: 7a 54 62 6c 29 20 2a 2f 0a 20 20 20 20 73 71 6c  zTbl) */.    sql
fd90: 69 74 65 33 5f 73 74 6d 74 20 2a 70 58 49 6e 66  ite3_stmt *pXInf
fda0: 6f 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 50 52  o = 0;     /* PR
fdb0: 41 47 4d 41 20 69 6e 64 65 78 5f 78 69 6e 66 6f  AGMA index_xinfo
fdc0: 20 3d 20 3c 70 6b 2d 69 6e 64 65 78 3e 20 2a 2f   = <pk-index> */
fdd0: 0a 20 20 20 0a 20 20 20 20 70 2d 3e 72 63 20 3d  .   .    p->rc =
fde0: 20 70 72 65 70 61 72 65 46 72 65 65 41 6e 64 43   prepareFreeAndC
fdf0: 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64  ollectError(p->d
fe00: 62 4d 61 69 6e 2c 20 26 70 58 4c 69 73 74 2c 20  bMain, &pXList, 
fe10: 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 0a 20 20 20  &p->zErrmsg,.   
fe20: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72       sqlite3_mpr
fe30: 69 6e 74 66 28 22 50 52 41 47 4d 41 20 6d 61 69  intf("PRAGMA mai
fe40: 6e 2e 69 6e 64 65 78 5f 6c 69 73 74 20 3d 20 25  n.index_list = %
fe50: 51 22 2c 20 70 49 74 65 72 2d 3e 7a 54 62 6c 29  Q", pIter->zTbl)
fe60: 0a 20 20 20 20 29 3b 0a 20 20 20 20 77 68 69 6c  .    );.    whil
fe70: 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  e( p->rc==SQLITE
fe80: 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f  _OK && SQLITE_RO
fe90: 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28  W==sqlite3_step(
fea0: 70 58 4c 69 73 74 29 20 29 7b 0a 20 20 20 20 20  pXList) ){.     
feb0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72   const char *zOr
fec0: 69 67 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  ig = (const char
fed0: 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
fee0: 5f 74 65 78 74 28 70 58 4c 69 73 74 2c 33 29 3b  _text(pXList,3);
fef0: 0a 20 20 20 20 20 20 69 66 28 20 7a 4f 72 69 67  .      if( zOrig
ff00: 20 26 26 20 73 74 72 63 6d 70 28 7a 4f 72 69 67   && strcmp(zOrig
ff10: 2c 20 22 70 6b 22 29 3d 3d 30 20 29 7b 0a 20 20  , "pk")==0 ){.  
ff20: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
ff30: 20 2a 7a 49 64 78 20 3d 20 28 63 6f 6e 73 74 20   *zIdx = (const 
ff40: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
ff50: 6c 75 6d 6e 5f 74 65 78 74 28 70 58 4c 69 73 74  lumn_text(pXList
ff60: 2c 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ,1);.        if(
ff70: 20 7a 49 64 78 20 29 7b 0a 20 20 20 20 20 20 20   zIdx ){.       
ff80: 20 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61     p->rc = prepa
ff90: 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74  reFreeAndCollect
ffa0: 45 72 72 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c  Error(p->dbMain,
ffb0: 20 26 70 58 49 6e 66 6f 2c 20 26 70 2d 3e 7a 45   &pXInfo, &p->zE
ffc0: 72 72 6d 73 67 2c 0a 20 20 20 20 20 20 20 20 20  rrmsg,.         
ffd0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72       sqlite3_mpr
ffe0: 69 6e 74 66 28 22 50 52 41 47 4d 41 20 6d 61 69  intf("PRAGMA mai
fff0: 6e 2e 69 6e 64 65 78 5f 78 69 6e 66 6f 20 3d 20  n.index_xinfo = 
10000 25 51 22 2c 20 7a 49 64 78 29 0a 20 20 20 20 20  %Q", zIdx).     
10010 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
10020 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  }.        break;
10030 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
10040 20 20 20 72 62 75 46 69 6e 61 6c 69 7a 65 28 70     rbuFinalize(p
10050 2c 20 70 58 4c 69 73 74 29 3b 0a 0a 20 20 20 20  , pXList);..    
10060 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51  while( p->rc==SQ
10070 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54  LITE_OK && SQLIT
10080 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73  E_ROW==sqlite3_s
10090 74 65 70 28 70 58 49 6e 66 6f 29 20 29 7b 0a 20  tep(pXInfo) ){. 
100a0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
100b0 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 58 49 6e  _column_int(pXIn
100c0 66 6f 2c 20 35 29 20 29 7b 0a 20 20 20 20 20 20  fo, 5) ){.      
100d0 20 20 2f 2a 20 69 6e 74 20 69 43 69 64 20 3d 20    /* int iCid = 
100e0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
100f0 6e 74 28 70 58 49 6e 66 6f 2c 20 30 29 3b 20 2a  nt(pXInfo, 0); *
10100 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  /.        const 
10110 63 68 61 72 20 2a 7a 43 6f 6c 20 3d 20 28 63 6f  char *zCol = (co
10120 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
10130 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 58  3_column_text(pX
10140 49 6e 66 6f 2c 20 32 29 3b 0a 20 20 20 20 20 20  Info, 2);.      
10150 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
10160 65 73 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  esc = sqlite3_co
10170 6c 75 6d 6e 5f 69 6e 74 28 70 58 49 6e 66 6f 2c  lumn_int(pXInfo,
10180 20 33 29 20 3f 20 22 20 44 45 53 43 22 20 3a 20   3) ? " DESC" : 
10190 22 22 3b 0a 20 20 20 20 20 20 20 20 7a 20 3d 20  "";.        z = 
101a0 72 62 75 4d 50 72 69 6e 74 66 28 70 2c 20 22 25  rbuMPrintf(p, "%
101b0 7a 25 73 5c 22 25 77 5c 22 25 73 22 2c 20 7a 2c  z%s\"%w\"%s", z,
101c0 20 7a 53 65 70 2c 20 7a 43 6f 6c 2c 20 7a 44 65   zSep, zCol, zDe
101d0 73 63 29 3b 0a 20 20 20 20 20 20 20 20 7a 53 65  sc);.        zSe
101e0 70 20 3d 20 22 2c 20 22 3b 0a 20 20 20 20 20 20  p = ", ";.      
101f0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 20 3d 20  }.    }.    z = 
10200 72 62 75 4d 50 72 69 6e 74 66 28 70 2c 20 22 25  rbuMPrintf(p, "%
10210 7a 29 22 2c 20 7a 29 3b 0a 20 20 20 20 72 62 75  z)", z);.    rbu
10220 46 69 6e 61 6c 69 7a 65 28 70 2c 20 70 58 49 6e  Finalize(p, pXIn
10230 66 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  fo);.  }.  retur
10240 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  n z;.}../*.** Th
10250 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 72 65 61  is function crea
10260 74 65 73 20 74 68 65 20 73 65 63 6f 6e 64 20 69  tes the second i
10270 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 20 75 73  mposter table us
10280 65 64 20 77 68 65 6e 20 77 72 69 74 69 6e 67 20  ed when writing 
10290 74 6f 0a 2a 2a 20 61 20 74 61 62 6c 65 20 62 2d  to.** a table b-
102a0 74 72 65 65 20 77 68 65 72 65 20 74 68 65 20 74  tree where the t
102b0 61 62 6c 65 20 68 61 73 20 61 6e 20 65 78 74 65  able has an exte
102c0 72 6e 61 6c 20 70 72 69 6d 61 72 79 20 6b 65 79  rnal primary key
102d0 2e 20 49 66 20 74 68 65 0a 2a 2a 20 69 74 65 72  . If the.** iter
102e0 61 74 6f 72 20 70 61 73 73 65 64 20 61 73 20 74  ator passed as t
102f0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
10300 6e 74 20 64 6f 65 73 20 6e 6f 74 20 63 75 72 72  nt does not curr
10310 65 6e 74 6c 79 20 70 6f 69 6e 74 20 74 6f 0a 2a  ently point to.*
10320 2a 20 61 20 74 61 62 6c 65 20 28 6e 6f 74 20 69  * a table (not i
10330 6e 64 65 78 29 20 77 69 74 68 20 61 6e 20 65 78  ndex) with an ex
10340 74 65 72 6e 61 6c 20 70 72 69 6d 61 72 79 20 6b  ternal primary k
10350 65 79 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ey, this functio
10360 6e 20 69 73 20 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e  n is a.** no-op.
10370 20 0a 2a 2a 0a 2a 2a 20 41 73 73 75 6d 69 6e 67   .**.** Assuming
10380 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 64 6f   the iterator do
10390 65 73 20 70 6f 69 6e 74 20 74 6f 20 61 20 74 61  es point to a ta
103a0 62 6c 65 20 77 69 74 68 20 61 6e 20 65 78 74 65  ble with an exte
103b0 72 6e 61 6c 20 50 4b 2c 20 74 68 69 73 0a 2a 2a  rnal PK, this.**
103c0 20 66 75 6e 63 74 69 6f 6e 20 63 72 65 61 74 65   function create
103d0 73 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49  s a WITHOUT ROWI
103e0 44 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65  D imposter table
103f0 20 6e 61 6d 65 64 20 22 72 62 75 5f 69 6d 70 6f   named "rbu_impo
10400 73 74 65 72 32 22 0a 2a 2a 20 75 73 65 64 20 74  ster2".** used t
10410 6f 20 61 63 63 65 73 73 20 74 68 61 74 20 50 4b  o access that PK
10420 20 69 6e 64 65 78 2e 20 46 6f 72 20 65 78 61 6d   index. For exam
10430 70 6c 65 2c 20 69 66 20 74 68 65 20 74 61 72 67  ple, if the targ
10440 65 74 20 74 61 62 6c 65 20 69 73 0a 2a 2a 20 64  et table is.** d
10450 65 63 6c 61 72 65 64 20 61 73 20 66 6f 6c 6c 6f  eclared as follo
10460 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41  ws:.**.**   CREA
10470 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62  TE TABLE t1(a, b
10480 20 54 45 58 54 2c 20 63 20 52 45 41 4c 2c 20 50   TEXT, c REAL, P
10490 52 49 4d 41 52 59 20 4b 45 59 28 62 2c 20 63 29  RIMARY KEY(b, c)
104a0 29 3b 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 74 68  );.**.** then th
104b0 65 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65  e imposter table
104c0 20 73 63 68 65 6d 61 20 69 73 3a 0a 2a 2a 0a 2a   schema is:.**.*
104d0 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  *   CREATE TABLE
104e0 20 72 62 75 5f 69 6d 70 6f 73 74 65 72 32 28 63   rbu_imposter2(c
104f0 31 20 54 45 58 54 2c 20 63 32 20 52 45 41 4c 2c  1 TEXT, c2 REAL,
10500 20 69 64 20 49 4e 54 45 47 45 52 29 20 57 49 54   id INTEGER) WIT
10510 48 4f 55 54 20 52 4f 57 49 44 3b 0a 2a 2a 0a 2a  HOUT ROWID;.**.*
10520 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62  /.static void rb
10530 75 43 72 65 61 74 65 49 6d 70 6f 73 74 65 72 54  uCreateImposterT
10540 61 62 6c 65 32 28 73 71 6c 69 74 65 33 72 62 75  able2(sqlite3rbu
10550 20 2a 70 2c 20 52 62 75 4f 62 6a 49 74 65 72 20   *p, RbuObjIter 
10560 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70  *pIter){.  if( p
10570 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
10580 26 26 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d  && pIter->eType=
10590 3d 52 42 55 5f 50 4b 5f 45 58 54 45 52 4e 41 4c  =RBU_PK_EXTERNAL
105a0 20 29 7b 0a 20 20 20 20 69 6e 74 20 74 6e 75 6d   ){.    int tnum
105b0 20 3d 20 70 49 74 65 72 2d 3e 69 50 6b 54 6e 75   = pIter->iPkTnu
105c0 6d 3b 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61  m;    /* Root pa
105d0 67 65 20 6f 66 20 50 4b 20 69 6e 64 65 78 20 2a  ge of PK index *
105e0 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  /.    sqlite3_st
105f0 6d 74 20 2a 70 51 75 65 72 79 20 3d 20 30 3b 20  mt *pQuery = 0; 
10600 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 6e 61      /* SELECT na
10610 6d 65 20 2e 2e 2e 20 57 48 45 52 45 20 72 6f 6f  me ... WHERE roo
10620 74 70 61 67 65 20 3d 20 24 74 6e 75 6d 20 2a 2f  tpage = $tnum */
10630 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
10640 2a 7a 49 64 78 20 3d 20 30 3b 20 20 20 20 20 20  *zIdx = 0;      
10650 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 50 4b     /* Name of PK
10660 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 73 71   index */.    sq
10670 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 58 49 6e  lite3_stmt *pXIn
10680 66 6f 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 50  fo = 0;     /* P
10690 52 41 47 4d 41 20 6d 61 69 6e 2e 69 6e 64 65 78  RAGMA main.index
106a0 5f 78 69 6e 66 6f 20 3d 20 24 7a 49 64 78 20 2a  _xinfo = $zIdx *
106b0 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  /.    const char
106c0 20 2a 7a 43 6f 6d 6d 61 20 3d 20 22 22 3b 0a 20   *zComma = "";. 
106d0 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 73 20 3d     char *zCols =
106e0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
106f0 20 2f 2a 20 55 73 65 64 20 74 6f 20 62 75 69 6c   /* Used to buil
10700 64 20 75 70 20 6c 69 73 74 20 6f 66 20 74 61 62  d up list of tab
10710 6c 65 20 63 6f 6c 73 20 2a 2f 0a 20 20 20 20 63  le cols */.    c
10720 68 61 72 20 2a 7a 50 6b 20 3d 20 30 3b 20 20 20  har *zPk = 0;   
10730 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10740 55 73 65 64 20 74 6f 20 62 75 69 6c 64 20 75 70  Used to build up
10750 20 74 61 62 6c 65 20 50 4b 20 64 65 63 6c 61 72   table PK declar
10760 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20 20 20 2f 2a  ation */..    /*
10770 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20   Figure out the 
10780 6e 61 6d 65 20 6f 66 20 74 68 65 20 70 72 69 6d  name of the prim
10790 61 72 79 20 6b 65 79 20 69 6e 64 65 78 20 66 6f  ary key index fo
107a0 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 61  r the current ta
107b0 62 6c 65 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73  ble..    ** This
107c0 20 69 73 20 6e 65 65 64 65 64 20 66 6f 72 20 74   is needed for t
107d0 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 22  he argument to "
107e0 50 52 41 47 4d 41 20 69 6e 64 65 78 5f 78 69 6e  PRAGMA index_xin
107f0 66 6f 22 2e 20 53 65 74 0a 20 20 20 20 2a 2a 20  fo". Set.    ** 
10800 7a 49 64 78 20 74 6f 20 70 6f 69 6e 74 20 74 6f  zIdx to point to
10810 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65   a nul-terminate
10820 64 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e  d string contain
10830 69 6e 67 20 74 68 69 73 20 6e 61 6d 65 2e 20 2a  ing this name. *
10840 2f 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 72  /.    p->rc = pr
10850 65 70 61 72 65 41 6e 64 43 6f 6c 6c 65 63 74 45  epareAndCollectE
10860 72 72 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20  rror(p->dbMain, 
10870 26 70 51 75 65 72 79 2c 20 26 70 2d 3e 7a 45 72  &pQuery, &p->zEr
10880 72 6d 73 67 2c 20 0a 20 20 20 20 20 20 20 20 22  rmsg, .        "
10890 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d  SELECT name FROM
108a0 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 57   sqlite_master W
108b0 48 45 52 45 20 72 6f 6f 74 70 61 67 65 20 3d 20  HERE rootpage = 
108c0 3f 22 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  ?".    );.    if
108d0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
108e0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
108f0 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 51 75  te3_bind_int(pQu
10900 65 72 79 2c 20 31 2c 20 74 6e 75 6d 29 3b 0a 20  ery, 1, tnum);. 
10910 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f       if( SQLITE_
10920 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW==sqlite3_ste
10930 70 28 70 51 75 65 72 79 29 20 29 7b 0a 20 20 20  p(pQuery) ){.   
10940 20 20 20 20 20 7a 49 64 78 20 3d 20 28 63 6f 6e       zIdx = (con
10950 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
10960 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 51 75  _column_text(pQu
10970 65 72 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  ery, 0);.      }
10980 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a  .    }.    if( z
10990 49 64 78 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  Idx ){.      p->
109a0 72 63 20 3d 20 70 72 65 70 61 72 65 46 72 65 65  rc = prepareFree
109b0 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28  AndCollectError(
109c0 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 70 58 49 6e  p->dbMain, &pXIn
109d0 66 6f 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c  fo, &p->zErrmsg,
109e0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
109f0 65 33 5f 6d 70 72 69 6e 74 66 28 22 50 52 41 47  e3_mprintf("PRAG
10a00 4d 41 20 6d 61 69 6e 2e 69 6e 64 65 78 5f 78 69  MA main.index_xi
10a10 6e 66 6f 20 3d 20 25 51 22 2c 20 7a 49 64 78 29  nfo = %Q", zIdx)
10a20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
10a30 20 20 20 20 72 62 75 46 69 6e 61 6c 69 7a 65 28      rbuFinalize(
10a40 70 2c 20 70 51 75 65 72 79 29 3b 0a 0a 20 20 20  p, pQuery);..   
10a50 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53   while( p->rc==S
10a60 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49  QLITE_OK && SQLI
10a70 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
10a80 73 74 65 70 28 70 58 49 6e 66 6f 29 20 29 7b 0a  step(pXInfo) ){.
10a90 20 20 20 20 20 20 69 6e 74 20 62 4b 65 79 20 3d        int bKey =
10aa0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
10ab0 69 6e 74 28 70 58 49 6e 66 6f 2c 20 35 29 3b 0a  int(pXInfo, 5);.
10ac0 20 20 20 20 20 20 69 66 28 20 62 4b 65 79 20 29        if( bKey )
10ad0 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43  {.        int iC
10ae0 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  id = sqlite3_col
10af0 75 6d 6e 5f 69 6e 74 28 70 58 49 6e 66 6f 2c 20  umn_int(pXInfo, 
10b00 31 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  1);.        int 
10b10 62 44 65 73 63 20 3d 20 73 71 6c 69 74 65 33 5f  bDesc = sqlite3_
10b20 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 58 49 6e 66  column_int(pXInf
10b30 6f 2c 20 33 29 3b 0a 20 20 20 20 20 20 20 20 63  o, 3);.        c
10b40 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  onst char *zColl
10b50 61 74 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ate = (const cha
10b60 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
10b70 6e 5f 74 65 78 74 28 70 58 49 6e 66 6f 2c 20 34  n_text(pXInfo, 4
10b80 29 3b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 73  );.        zCols
10b90 20 3d 20 72 62 75 4d 50 72 69 6e 74 66 28 70 2c   = rbuMPrintf(p,
10ba0 20 22 25 7a 25 73 63 25 64 20 25 73 20 43 4f 4c   "%z%sc%d %s COL
10bb0 4c 41 54 45 20 25 51 22 2c 20 7a 43 6f 6c 73 2c  LATE %Q", zCols,
10bc0 20 7a 43 6f 6d 6d 61 2c 20 0a 20 20 20 20 20 20   zComma, .      
10bd0 20 20 20 20 20 20 69 43 69 64 2c 20 70 49 74 65        iCid, pIte
10be0 72 2d 3e 61 7a 54 62 6c 54 79 70 65 5b 69 43 69  r->azTblType[iCi
10bf0 64 5d 2c 20 7a 43 6f 6c 6c 61 74 65 0a 20 20 20  d], zCollate.   
10c00 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
10c10 7a 50 6b 20 3d 20 72 62 75 4d 50 72 69 6e 74 66  zPk = rbuMPrintf
10c20 28 70 2c 20 22 25 7a 25 73 63 25 64 25 73 22 2c  (p, "%z%sc%d%s",
10c30 20 7a 50 6b 2c 20 7a 43 6f 6d 6d 61 2c 20 69 43   zPk, zComma, iC
10c40 69 64 2c 20 62 44 65 73 63 3f 22 20 44 45 53 43  id, bDesc?" DESC
10c50 22 3a 22 22 29 3b 0a 20 20 20 20 20 20 20 20 7a  ":"");.        z
10c60 43 6f 6d 6d 61 20 3d 20 22 2c 20 22 3b 0a 20 20  Comma = ", ";.  
10c70 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
10c80 7a 43 6f 6c 73 20 3d 20 72 62 75 4d 50 72 69 6e  zCols = rbuMPrin
10c90 74 66 28 70 2c 20 22 25 7a 2c 20 69 64 20 49 4e  tf(p, "%z, id IN
10ca0 54 45 47 45 52 22 2c 20 7a 43 6f 6c 73 29 3b 0a  TEGER", zCols);.
10cb0 20 20 20 20 72 62 75 46 69 6e 61 6c 69 7a 65 28      rbuFinalize(
10cc0 70 2c 20 70 58 49 6e 66 6f 29 3b 0a 0a 20 20 20  p, pXInfo);..   
10cd0 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
10ce0 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
10cf0 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52 2c 20  TCTRL_IMPOSTER, 
10d00 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 6d 61 69 6e  p->dbMain, "main
10d10 22 2c 20 31 2c 20 74 6e 75 6d 29 3b 0a 20 20 20  ", 1, tnum);.   
10d20 20 72 62 75 4d 50 72 69 6e 74 66 45 78 65 63 28   rbuMPrintfExec(
10d30 70 2c 20 70 2d 3e 64 62 4d 61 69 6e 2c 0a 20 20  p, p->dbMain,.  
10d40 20 20 20 20 20 20 22 43 52 45 41 54 45 20 54 41        "CREATE TA
10d50 42 4c 45 20 72 62 75 5f 69 6d 70 6f 73 74 65 72  BLE rbu_imposter
10d60 32 28 25 7a 2c 20 50 52 49 4d 41 52 59 20 4b 45  2(%z, PRIMARY KE
10d70 59 28 25 7a 29 29 20 57 49 54 48 4f 55 54 20 52  Y(%z)) WITHOUT R
10d80 4f 57 49 44 22 2c 20 0a 20 20 20 20 20 20 20 20  OWID", .        
10d90 7a 43 6f 6c 73 2c 20 7a 50 6b 0a 20 20 20 20 29  zCols, zPk.    )
10da0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 74 65  ;.    sqlite3_te
10db0 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
10dc0 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53  E_TESTCTRL_IMPOS
10dd0 54 45 52 2c 20 70 2d 3e 64 62 4d 61 69 6e 2c 20  TER, p->dbMain, 
10de0 22 6d 61 69 6e 22 2c 20 30 2c 20 30 29 3b 0a 20  "main", 0, 0);. 
10df0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61   }.}../*.** If a
10e00 6e 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65  n error has alre
10e10 61 64 79 20 6f 63 63 75 72 72 65 64 20 77 68 65  ady occurred whe
10e20 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
10e30 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 0a 2a  is called, it .*
10e40 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65  * immediately re
10e50 74 75 72 6e 73 20 7a 65 72 6f 20 28 77 69 74 68  turns zero (with
10e60 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 20 77 6f  out doing any wo
10e70 72 6b 29 2e 20 4f 72 2c 20 69 66 20 61 6e 20 65  rk). Or, if an e
10e80 72 72 6f 72 0a 2a 2a 20 6f 63 63 75 72 73 20 64  rror.** occurs d
10e90 75 72 69 6e 67 20 74 68 65 20 65 78 65 63 75 74  uring the execut
10ea0 69 6f 6e 20 6f 66 20 74 68 69 73 20 66 75 6e 63  ion of this func
10eb0 74 69 6f 6e 2c 20 69 74 20 73 65 74 73 20 74 68  tion, it sets th
10ec0 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20  e error code.** 
10ed0 69 6e 20 74 68 65 20 73 71 6c 69 74 65 33 72 62  in the sqlite3rb
10ee0 75 20 6f 62 6a 65 63 74 20 69 6e 64 69 63 61 74  u object indicat
10ef0 65 64 20 62 79 20 74 68 65 20 66 69 72 73 74 20  ed by the first 
10f00 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 72 65 74  argument and ret
10f10 75 72 6e 73 0a 2a 2a 20 7a 65 72 6f 2e 0a 2a 2a  urns.** zero..**
10f20 0a 2a 2a 20 54 68 65 20 69 74 65 72 61 74 6f 72  .** The iterator
10f30 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
10f40 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
10f50 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
10f60 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 61 20 74 61  point to.** a ta
10f70 62 6c 65 20 28 6e 6f 74 20 61 6e 20 69 6e 64 65  ble (not an inde
10f80 78 29 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  x) when this fun
10f90 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e  ction is called.
10fa0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   This function.*
10fb0 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20 63 72  * attempts to cr
10fc0 65 61 74 65 20 61 6e 79 20 69 6d 70 6f 73 74 65  eate any imposte
10fd0 72 20 74 61 62 6c 65 20 72 65 71 75 69 72 65 64  r table required
10fe0 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65   to write to the
10ff0 20 6d 61 69 6e 0a 2a 2a 20 74 61 62 6c 65 20 62   main.** table b
11000 2d 74 72 65 65 20 6f 66 20 74 68 65 20 74 61 62  -tree of the tab
11010 6c 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  le before return
11020 69 6e 67 2e 20 4e 6f 6e 2d 7a 65 72 6f 20 69 73  ing. Non-zero is
11030 20 72 65 74 75 72 6e 65 64 20 69 66 0a 2a 2a 20   returned if.** 
11040 61 6e 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c  an imposter tabl
11050 65 20 61 72 65 20 63 72 65 61 74 65 64 2c 20 6f  e are created, o
11060 72 20 7a 65 72 6f 20 6f 74 68 65 72 77 69 73 65  r zero otherwise
11070 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6d 70 6f 73  ..**.** An impos
11080 74 65 72 20 74 61 62 6c 65 20 69 73 20 72 65 71  ter table is req
11090 75 69 72 65 64 20 69 6e 20 61 6c 6c 20 63 61 73  uired in all cas
110a0 65 73 20 65 78 63 65 70 74 20 52 42 55 5f 50 4b  es except RBU_PK
110b0 5f 56 54 41 42 2e 20 4f 6e 6c 79 0a 2a 2a 20 76  _VTAB. Only.** v
110c0 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20 61 72  irtual tables ar
110d0 65 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 72  e written to dir
110e0 65 63 74 6c 79 2e 20 54 68 65 20 69 6d 70 6f 73  ectly. The impos
110f0 74 65 72 20 74 61 62 6c 65 20 68 61 73 20 74 68  ter table has th
11100 65 20 0a 2a 2a 20 73 61 6d 65 20 73 63 68 65 6d  e .** same schem
11110 61 20 61 73 20 74 68 65 20 61 63 74 75 61 6c 20  a as the actual 
11120 74 61 72 67 65 74 20 74 61 62 6c 65 20 28 6c 65  target table (le
11130 73 73 20 61 6e 79 20 55 4e 49 51 55 45 20 63 6f  ss any UNIQUE co
11140 6e 73 74 72 61 69 6e 74 73 29 2e 20 0a 2a 2a 20  nstraints). .** 
11150 4d 6f 72 65 20 70 72 65 63 69 73 65 6c 79 2c 20  More precisely, 
11160 74 68 65 20 22 73 61 6d 65 20 73 63 68 65 6d 61  the "same schema
11170 22 20 6d 65 61 6e 73 20 74 68 65 20 73 61 6d 65  " means the same
11180 20 63 6f 6c 75 6d 6e 73 2c 20 74 79 70 65 73 2c   columns, types,
11190 20 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   .** collation s
111a0 65 71 75 65 6e 63 65 73 2e 20 46 6f 72 20 74 61  equences. For ta
111b0 62 6c 65 73 20 74 68 61 74 20 64 6f 20 6e 6f 74  bles that do not
111c0 20 68 61 76 65 20 61 6e 20 65 78 74 65 72 6e 61   have an externa
111d0 6c 20 50 52 49 4d 41 52 59 0a 2a 2a 20 4b 45 59  l PRIMARY.** KEY
111e0 2c 20 69 74 20 61 6c 73 6f 20 6d 65 61 6e 73 20  , it also means 
111f0 74 68 65 20 73 61 6d 65 20 50 52 49 4d 41 52 59  the same PRIMARY
11200 20 4b 45 59 20 64 65 63 6c 61 72 61 74 69 6f 6e   KEY declaration
11210 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
11220 20 72 62 75 43 72 65 61 74 65 49 6d 70 6f 73 74   rbuCreateImpost
11230 65 72 54 61 62 6c 65 28 73 71 6c 69 74 65 33 72  erTable(sqlite3r
11240 62 75 20 2a 70 2c 20 52 62 75 4f 62 6a 49 74 65  bu *p, RbuObjIte
11250 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28  r *pIter){.  if(
11260 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
11270 4b 20 26 26 20 70 49 74 65 72 2d 3e 65 54 79 70  K && pIter->eTyp
11280 65 21 3d 52 42 55 5f 50 4b 5f 56 54 41 42 20 29  e!=RBU_PK_VTAB )
11290 7b 0a 20 20 20 20 69 6e 74 20 74 6e 75 6d 20 3d  {.    int tnum =
112a0 20 70 49 74 65 72 2d 3e 69 54 6e 75 6d 3b 0a 20   pIter->iTnum;. 
112b0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
112c0 43 6f 6d 6d 61 20 3d 20 22 22 3b 0a 20 20 20 20  Comma = "";.    
112d0 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 30 3b 0a  char *zSql = 0;.
112e0 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20      int iCol;.  
112f0 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
11300 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
11310 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52 2c  STCTRL_IMPOSTER,
11320 20 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 6d 61 69   p->dbMain, "mai
11330 6e 22 2c 20 30 2c 20 31 29 3b 0a 0a 20 20 20 20  n", 0, 1);..    
11340 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 70 2d 3e 72  for(iCol=0; p->r
11350 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
11360 69 43 6f 6c 3c 70 49 74 65 72 2d 3e 6e 54 62 6c  iCol<pIter->nTbl
11370 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20  Col; iCol++){.  
11380 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
11390 7a 50 6b 20 3d 20 22 22 3b 0a 20 20 20 20 20 20  zPk = "";.      
113a0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
113b0 20 3d 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43   = pIter->azTblC
113c0 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 20 20  ol[iCol];.      
113d0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
113e0 6c 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 70 2d  l = 0;..      p-
113f0 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 74 61  >rc = sqlite3_ta
11400 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64  ble_column_metad
11410 61 74 61 28 0a 20 20 20 20 20 20 20 20 20 20 70  ata(.          p
11420 2d 3e 64 62 4d 61 69 6e 2c 20 22 6d 61 69 6e 22  ->dbMain, "main"
11430 2c 20 70 49 74 65 72 2d 3e 7a 54 62 6c 2c 20 7a  , pIter->zTbl, z
11440 43 6f 6c 2c 20 30 2c 20 26 7a 43 6f 6c 6c 2c 20  Col, 0, &zColl, 
11450 30 2c 20 30 2c 20 30 0a 20 20 20 20 20 20 29 3b  0, 0, 0.      );
11460 0a 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  ..      if( pIte
11470 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b  r->eType==RBU_PK
11480 5f 49 50 4b 20 26 26 20 70 49 74 65 72 2d 3e 61  _IPK && pIter->a
11490 62 54 62 6c 50 6b 5b 69 43 6f 6c 5d 20 29 7b 0a  bTblPk[iCol] ){.
114a0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
114b0 65 20 74 61 72 67 65 74 20 74 61 62 6c 65 20 63  e target table c
114c0 6f 6c 75 6d 6e 20 69 73 20 61 6e 20 22 49 4e 54  olumn is an "INT
114d0 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
114e0 22 2c 20 61 64 64 0a 20 20 20 20 20 20 20 20 2a  ", add.        *
114f0 2a 20 22 50 52 49 4d 41 52 59 20 4b 45 59 22 20  * "PRIMARY KEY" 
11500 74 6f 20 74 68 65 20 69 6d 70 6f 73 74 65 72 20  to the imposter 
11510 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 64 65 63  table column dec
11520 6c 61 72 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20  laration. */.   
11530 20 20 20 20 20 7a 50 6b 20 3d 20 22 50 52 49 4d       zPk = "PRIM
11540 41 52 59 20 4b 45 59 20 22 3b 0a 20 20 20 20 20  ARY KEY ";.     
11550 20 7d 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d 20   }.      zSql = 
11560 72 62 75 4d 50 72 69 6e 74 66 28 70 2c 20 22 25  rbuMPrintf(p, "%
11570 7a 25 73 5c 22 25 77 5c 22 20 25 73 20 25 73 43  z%s\"%w\" %s %sC
11580 4f 4c 4c 41 54 45 20 25 51 25 73 22 2c 20 0a 20  OLLATE %Q%s", . 
11590 20 20 20 20 20 20 20 20 20 7a 53 71 6c 2c 20 7a           zSql, z
115a0 43 6f 6d 6d 61 2c 20 7a 43 6f 6c 2c 20 70 49 74  Comma, zCol, pIt
115b0 65 72 2d 3e 61 7a 54 62 6c 54 79 70 65 5b 69 43  er->azTblType[iC
115c0 6f 6c 5d 2c 20 7a 50 6b 2c 20 7a 43 6f 6c 6c 2c  ol], zPk, zColl,
115d0 0a 20 20 20 20 20 20 20 20 20 20 28 70 49 74 65  .          (pIte
115e0 72 2d 3e 61 62 4e 6f 74 4e 75 6c 6c 5b 69 43 6f  r->abNotNull[iCo
115f0 6c 5d 20 3f 20 22 20 4e 4f 54 20 4e 55 4c 4c 22  l] ? " NOT NULL"
11600 20 3a 20 22 22 29 0a 20 20 20 20 20 20 29 3b 0a   : "").      );.
11610 20 20 20 20 20 20 7a 43 6f 6d 6d 61 20 3d 20 22        zComma = "
11620 2c 20 22 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  , ";.    }..    
11630 69 66 28 20 70 49 74 65 72 2d 3e 65 54 79 70 65  if( pIter->eType
11640 3d 3d 52 42 55 5f 50 4b 5f 57 49 54 48 4f 55 54  ==RBU_PK_WITHOUT
11650 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 20 20  _ROWID ){.      
11660 63 68 61 72 20 2a 7a 50 6b 20 3d 20 72 62 75 57  char *zPk = rbuW
11670 69 74 68 6f 75 74 52 6f 77 69 64 50 4b 28 70 2c  ithoutRowidPK(p,
11680 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 69   pIter);.      i
11690 66 28 20 7a 50 6b 20 29 7b 0a 20 20 20 20 20 20  f( zPk ){.      
116a0 20 20 7a 53 71 6c 20 3d 20 72 62 75 4d 50 72 69    zSql = rbuMPri
116b0 6e 74 66 28 70 2c 20 22 25 7a 2c 20 25 7a 22 2c  ntf(p, "%z, %z",
116c0 20 7a 53 71 6c 2c 20 7a 50 6b 29 3b 0a 20 20 20   zSql, zPk);.   
116d0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
116e0 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
116f0 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
11700 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52 2c 20 70  CTRL_IMPOSTER, p
11710 2d 3e 64 62 4d 61 69 6e 2c 20 22 6d 61 69 6e 22  ->dbMain, "main"
11720 2c 20 31 2c 20 74 6e 75 6d 29 3b 0a 20 20 20 20  , 1, tnum);.    
11730 72 62 75 4d 50 72 69 6e 74 66 45 78 65 63 28 70  rbuMPrintfExec(p
11740 2c 20 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 43 52  , p->dbMain, "CR
11750 45 41 54 45 20 54 41 42 4c 45 20 5c 22 72 62 75  EATE TABLE \"rbu
11760 5f 69 6d 70 5f 25 77 5c 22 28 25 7a 29 25 73 22  _imp_%w\"(%z)%s"
11770 2c 20 0a 20 20 20 20 20 20 20 20 70 49 74 65 72  , .        pIter
11780 2d 3e 7a 54 62 6c 2c 20 7a 53 71 6c 2c 20 0a 20  ->zTbl, zSql, . 
11790 20 20 20 20 20 20 20 28 70 49 74 65 72 2d 3e 65         (pIter->e
117a0 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 57 49 54  Type==RBU_PK_WIT
117b0 48 4f 55 54 5f 52 4f 57 49 44 20 3f 20 22 20 57  HOUT_ROWID ? " W
117c0 49 54 48 4f 55 54 20 52 4f 57 49 44 22 20 3a 20  ITHOUT ROWID" : 
117d0 22 22 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 73  "").    );.    s
117e0 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
117f0 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
11800 54 52 4c 5f 49 4d 50 4f 53 54 45 52 2c 20 70 2d  TRL_IMPOSTER, p-
11810 3e 64 62 4d 61 69 6e 2c 20 22 6d 61 69 6e 22 2c  >dbMain, "main",
11820 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f   0, 0);.  }.}../
11830 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20 61 20 73  *.** Prepare a s
11840 74 61 74 65 6d 65 6e 74 20 75 73 65 64 20 74 6f  tatement used to
11850 20 69 6e 73 65 72 74 20 72 6f 77 73 20 69 6e 74   insert rows int
11860 6f 20 74 68 65 20 22 72 62 75 5f 74 6d 70 5f 78  o the "rbu_tmp_x
11870 78 78 22 20 74 61 62 6c 65 2e 0a 2a 2a 20 53 70  xx" table..** Sp
11880 65 63 69 66 69 63 61 6c 6c 79 20 61 20 73 74 61  ecifically a sta
11890 74 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 66 6f  tement of the fo
118a0 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 49 4e  rm:.**.**     IN
118b0 53 45 52 54 20 49 4e 54 4f 20 72 62 75 5f 74 6d  SERT INTO rbu_tm
118c0 70 5f 78 78 78 20 56 41 4c 55 45 53 28 3f 2c 20  p_xxx VALUES(?, 
118d0 3f 2c 20 3f 20 2e 2e 2e 29 3b 0a 2a 2a 0a 2a 2a  ?, ? ...);.**.**
118e0 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   The number of b
118f0 6f 75 6e 64 20 76 61 72 69 61 62 6c 65 73 20 69  ound variables i
11900 73 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6e  s equal to the n
11910 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
11920 20 69 6e 0a 2a 2a 20 74 68 65 20 74 61 72 67 65   in.** the targe
11930 74 20 74 61 62 6c 65 2c 20 70 6c 75 73 20 6f 6e  t table, plus on
11940 65 20 28 66 6f 72 20 74 68 65 20 72 62 75 5f 63  e (for the rbu_c
11950 6f 6e 74 72 6f 6c 20 63 6f 6c 75 6d 6e 29 2c 20  ontrol column), 
11960 70 6c 75 73 20 6f 6e 65 20 6d 6f 72 65 20 0a 2a  plus one more .*
11970 2a 20 28 66 6f 72 20 74 68 65 20 72 62 75 5f 72  * (for the rbu_r
11980 6f 77 69 64 20 63 6f 6c 75 6d 6e 29 20 69 66 20  owid column) if 
11990 74 68 65 20 74 61 72 67 65 74 20 74 61 62 6c 65  the target table
119a0 20 69 73 20 61 6e 20 69 6d 70 6c 69 63 69 74 20   is an implicit 
119b0 49 50 4b 20 6f 72 20 0a 2a 2a 20 76 69 72 74 75  IPK or .** virtu
119c0 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  al table..*/.sta
119d0 74 69 63 20 76 6f 69 64 20 72 62 75 4f 62 6a 49  tic void rbuObjI
119e0 74 65 72 50 72 65 70 61 72 65 54 6d 70 49 6e 73  terPrepareTmpIns
119f0 65 72 74 28 0a 20 20 73 71 6c 69 74 65 33 72 62  ert(.  sqlite3rb
11a00 75 20 2a 70 2c 20 0a 20 20 52 62 75 4f 62 6a 49  u *p, .  RbuObjI
11a10 74 65 72 20 2a 70 49 74 65 72 2c 0a 20 20 63 6f  ter *pIter,.  co
11a20 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 69  nst char *zColli
11a30 73 74 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  st,.  const char
11a40 20 2a 7a 52 62 75 52 6f 77 69 64 0a 29 7b 0a 20   *zRbuRowid.){. 
11a50 20 69 6e 74 20 62 52 62 75 52 6f 77 69 64 20 3d   int bRbuRowid =
11a60 20 28 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d   (pIter->eType==
11a70 52 42 55 5f 50 4b 5f 45 58 54 45 52 4e 41 4c 20  RBU_PK_EXTERNAL 
11a80 7c 7c 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d  || pIter->eType=
11a90 3d 52 42 55 5f 50 4b 5f 4e 4f 4e 45 29 3b 0a 20  =RBU_PK_NONE);. 
11aa0 20 63 68 61 72 20 2a 7a 42 69 6e 64 20 3d 20 72   char *zBind = r
11ab0 62 75 4f 62 6a 49 74 65 72 47 65 74 42 69 6e 64  buObjIterGetBind
11ac0 6c 69 73 74 28 70 2c 20 70 49 74 65 72 2d 3e 6e  list(p, pIter->n
11ad0 54 62 6c 43 6f 6c 20 2b 20 31 20 2b 20 62 52 62  TblCol + 1 + bRb
11ae0 75 52 6f 77 69 64 29 3b 0a 20 20 69 66 28 20 7a  uRowid);.  if( z
11af0 42 69 6e 64 20 29 7b 0a 20 20 20 20 61 73 73 65  Bind ){.    asse
11b00 72 74 28 20 70 49 74 65 72 2d 3e 70 54 6d 70 49  rt( pIter->pTmpI
11b10 6e 73 65 72 74 3d 3d 30 20 29 3b 0a 20 20 20 20  nsert==0 );.    
11b20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65 46  p->rc = prepareF
11b30 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72  reeAndCollectErr
11b40 6f 72 28 0a 20 20 20 20 20 20 20 20 70 2d 3e 64  or(.        p->d
11b50 62 52 62 75 2c 20 26 70 49 74 65 72 2d 3e 70 54  bRbu, &pIter->pT
11b60 6d 70 49 6e 73 65 72 74 2c 20 26 70 2d 3e 7a 45  mpInsert, &p->zE
11b70 72 72 6d 73 67 2c 20 73 71 6c 69 74 65 33 5f 6d  rrmsg, sqlite3_m
11b80 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  printf(.        
11b90 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 25    "INSERT INTO %
11ba0 73 2e 27 72 62 75 5f 74 6d 70 5f 25 71 27 28 72  s.'rbu_tmp_%q'(r
11bb0 62 75 5f 63 6f 6e 74 72 6f 6c 2c 25 73 25 73 29  bu_control,%s%s)
11bc0 20 56 41 4c 55 45 53 28 25 7a 29 22 2c 20 0a 20   VALUES(%z)", . 
11bd0 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 53 74 61           p->zSta
11be0 74 65 44 62 2c 20 70 49 74 65 72 2d 3e 7a 44 61  teDb, pIter->zDa
11bf0 74 61 54 62 6c 2c 20 7a 43 6f 6c 6c 69 73 74 2c  taTbl, zCollist,
11c00 20 7a 52 62 75 52 6f 77 69 64 2c 20 7a 42 69 6e   zRbuRowid, zBin
11c10 64 0a 20 20 20 20 29 29 3b 0a 20 20 7d 0a 7d 0a  d.    ));.  }.}.
11c20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75  .static void rbu
11c30 54 6d 70 49 6e 73 65 72 74 46 75 6e 63 28 0a 20  TmpInsertFunc(. 
11c40 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
11c50 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e   *pCtx, .  int n
11c60 56 61 6c 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  Val,.  sqlite3_v
11c70 61 6c 75 65 20 2a 2a 61 70 56 61 6c 0a 29 7b 0a  alue **apVal.){.
11c80 20 20 73 71 6c 69 74 65 33 72 62 75 20 2a 70 20    sqlite3rbu *p 
11c90 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64  = sqlite3_user_d
11ca0 61 74 61 28 70 43 74 78 29 3b 0a 20 20 69 6e 74  ata(pCtx);.  int
11cb0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
11cc0 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61 73 73  .  int i;..  ass
11cd0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76 61 6c  ert( sqlite3_val
11ce0 75 65 5f 69 6e 74 28 61 70 56 61 6c 5b 30 5d 29  ue_int(apVal[0])
11cf0 21 3d 30 0a 20 20 20 20 20 20 7c 7c 20 70 2d 3e  !=0.      || p->
11d00 6f 62 6a 69 74 65 72 2e 65 54 79 70 65 3d 3d 52  objiter.eType==R
11d10 42 55 5f 50 4b 5f 45 58 54 45 52 4e 41 4c 20 0a  BU_PK_EXTERNAL .
11d20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6f 62 6a 69        || p->obji
11d30 74 65 72 2e 65 54 79 70 65 3d 3d 52 42 55 5f 50  ter.eType==RBU_P
11d40 4b 5f 4e 4f 4e 45 20 0a 20 20 29 3b 0a 20 20 69  K_NONE .  );.  i
11d50 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f( sqlite3_value
11d60 5f 69 6e 74 28 61 70 56 61 6c 5b 30 5d 29 21 3d  _int(apVal[0])!=
11d70 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 50 68 61  0 ){.    p->nPha
11d80 73 65 4f 6e 65 53 74 65 70 20 2b 3d 20 70 2d 3e  seOneStep += p->
11d90 6f 62 6a 69 74 65 72 2e 6e 49 6e 64 65 78 3b 0a  objiter.nIndex;.
11da0 20 20 7d 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20    }..  for(i=0; 
11db0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
11dc0 20 69 3c 6e 56 61 6c 3b 20 69 2b 2b 29 7b 0a 20   i<nVal; i++){. 
11dd0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
11de0 62 69 6e 64 5f 76 61 6c 75 65 28 70 2d 3e 6f 62  bind_value(p->ob
11df0 6a 69 74 65 72 2e 70 54 6d 70 49 6e 73 65 72 74  jiter.pTmpInsert
11e00 2c 20 69 2b 31 2c 20 61 70 56 61 6c 5b 69 5d 29  , i+1, apVal[i])
11e10 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
11e20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
11e30 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 2d   sqlite3_step(p-
11e40 3e 6f 62 6a 69 74 65 72 2e 70 54 6d 70 49 6e 73  >objiter.pTmpIns
11e50 65 72 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  ert);.    rc = s
11e60 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 2d 3e  qlite3_reset(p->
11e70 6f 62 6a 69 74 65 72 2e 70 54 6d 70 49 6e 73 65  objiter.pTmpInse
11e80 72 74 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  rt);.  }..  if( 
11e90 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
11ea0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
11eb0 75 6c 74 5f 65 72 72 6f 72 5f 63 6f 64 65 28 70  ult_error_code(p
11ec0 43 74 78 2c 20 72 63 29 3b 0a 20 20 7d 0a 7d 0a  Ctx, rc);.  }.}.
11ed0 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 72 62  .static char *rb
11ee0 75 4f 62 6a 49 74 65 72 47 65 74 49 6e 64 65 78  uObjIterGetIndex
11ef0 57 68 65 72 65 28 73 71 6c 69 74 65 33 72 62 75  Where(sqlite3rbu
11f00 20 2a 70 2c 20 52 62 75 4f 62 6a 49 74 65 72 20   *p, RbuObjIter 
11f10 2a 70 49 74 65 72 29 7b 0a 20 20 73 71 6c 69 74  *pIter){.  sqlit
11f20 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d  e3_stmt *pStmt =
11f30 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70   0;.  int rc = p
11f40 2d 3e 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 52  ->rc;.  char *zR
11f50 65 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 72  et = 0;..  if( r
11f60 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
11f70 20 20 20 20 72 63 20 3d 20 70 72 65 70 61 72 65      rc = prepare
11f80 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28  AndCollectError(
11f90 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 70 53 74 6d  p->dbMain, &pStm
11fa0 74 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 0a  t, &p->zErrmsg,.
11fb0 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
11fc0 74 72 69 6d 28 73 71 6c 29 20 46 52 4f 4d 20 73  trim(sql) FROM s
11fd0 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 57 48 45  qlite_master WHE
11fe0 52 45 20 74 79 70 65 3d 27 69 6e 64 65 78 27 20  RE type='index' 
11ff0 41 4e 44 20 6e 61 6d 65 3d 3f 22 0a 20 20 20 20  AND name=?".    
12000 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
12010 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
12020 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 20 20 72    int rc2;.    r
12030 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  c = sqlite3_bind
12040 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31 2c 20  _text(pStmt, 1, 
12050 70 49 74 65 72 2d 3e 7a 49 64 78 2c 20 2d 31 2c  pIter->zIdx, -1,
12060 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
12070 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
12080 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45  ITE_OK && SQLITE
12090 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74  _ROW==sqlite3_st
120a0 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20  ep(pStmt) ){.   
120b0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
120c0 53 71 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  Sql = (const cha
120d0 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
120e0 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 30 29  n_text(pStmt, 0)
120f0 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 53 71 6c  ;.      if( zSql
12100 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
12110 6e 50 61 72 65 6e 20 3d 20 30 3b 20 20 20 20 20  nParen = 0;     
12120 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
12130 6f 66 20 6f 70 65 6e 20 70 61 72 65 6e 74 68 65  of open parenthe
12140 73 69 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  sis */.        i
12150 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 66 6f  nt i;.        fo
12160 72 28 69 3d 30 3b 20 7a 53 71 6c 5b 69 5d 3b 20  r(i=0; zSql[i]; 
12170 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
12180 63 68 61 72 20 63 20 3d 20 7a 53 71 6c 5b 69 5d  char c = zSql[i]
12190 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
121a0 63 3d 3d 27 28 27 20 29 7b 0a 20 20 20 20 20 20  c=='(' ){.      
121b0 20 20 20 20 20 20 6e 50 61 72 65 6e 2b 2b 3b 0a        nParen++;.
121c0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
121d0 20 20 20 20 20 20 65 6c 73 65 20 69 66 28 20 63        else if( c
121e0 3d 3d 27 29 27 20 29 7b 0a 20 20 20 20 20 20 20  ==')' ){.       
121f0 20 20 20 20 20 6e 50 61 72 65 6e 2d 2d 3b 0a 20       nParen--;. 
12200 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e             if( n
12210 50 61 72 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  Paren==0 ){.    
12220 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20            i++;. 
12230 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
12240 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
12250 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  }.          }els
12260 65 20 69 66 28 20 63 3d 3d 27 22 27 20 7c 7c 20  e if( c=='"' || 
12270 63 3d 3d 27 5c 27 27 20 7c 7c 20 63 3d 3d 27 60  c=='\'' || c=='`
12280 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ' ){.           
12290 20 66 6f 72 28 69 2b 2b 3b 20 31 3b 20 69 2b 2b   for(i++; 1; i++
122a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
122b0 20 69 66 28 20 7a 53 71 6c 5b 69 5d 3d 3d 63 20   if( zSql[i]==c 
122c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
122d0 20 20 20 69 66 28 20 7a 53 71 6c 5b 69 2b 31 5d     if( zSql[i+1]
122e0 21 3d 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  !=c ) break;.   
122f0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 2b 2b               i++
12300 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
12310 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
12320 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20            }else 
12330 69 66 28 20 63 3d 3d 27 5b 27 20 29 7b 0a 20 20  if( c=='[' ){.  
12340 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 2b            for(i+
12350 2b 3b 20 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  +; 1; i++){.    
12360 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 53            if( zS
12370 71 6c 5b 69 5d 3d 3d 27 5d 27 20 29 20 62 72 65  ql[i]==']' ) bre
12380 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
12390 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
123a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
123b0 69 66 28 20 7a 53 71 6c 5b 69 5d 20 29 7b 0a 20  if( zSql[i] ){. 
123c0 20 20 20 20 20 20 20 20 20 7a 52 65 74 20 3d 20           zRet = 
123d0 72 62 75 53 74 72 6e 64 75 70 28 26 7a 53 71 6c  rbuStrndup(&zSql
123e0 5b 69 5d 2c 20 26 72 63 29 3b 0a 20 20 20 20 20  [i], &rc);.     
123f0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
12400 20 7d 0a 0a 20 20 20 20 72 63 32 20 3d 20 73 71   }..    rc2 = sq
12410 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
12420 53 74 6d 74 29 3b 0a 20 20 20 20 69 66 28 20 72  Stmt);.    if( r
12430 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c==SQLITE_OK ) r
12440 63 20 3d 20 72 63 32 3b 0a 20 20 7d 0a 0a 20 20  c = rc2;.  }..  
12450 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 72 65  p->rc = rc;.  re
12460 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 0a 2f 2a  turn zRet;.}../*
12470 0a 2a 2a 20 45 6e 73 75 72 65 20 74 68 61 74 20  .** Ensure that 
12480 74 68 65 20 53 51 4c 69 74 65 20 73 74 61 74 65  the SQLite state
12490 6d 65 6e 74 20 68 61 6e 64 6c 65 73 20 72 65 71  ment handles req
124a0 75 69 72 65 64 20 74 6f 20 75 70 64 61 74 65 20  uired to update 
124b0 74 68 65 20 0a 2a 2a 20 74 61 72 67 65 74 20 64  the .** target d
124c0 61 74 61 62 61 73 65 20 6f 62 6a 65 63 74 20 63  atabase object c
124d0 75 72 72 65 6e 74 6c 79 20 69 6e 64 69 63 61 74  urrently indicat
124e0 65 64 20 62 79 20 74 68 65 20 69 74 65 72 61 74  ed by the iterat
124f0 6f 72 20 70 61 73 73 65 64 20 0a 2a 2a 20 61 73  or passed .** as
12500 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
12510 6d 65 6e 74 20 61 72 65 20 61 76 61 69 6c 61 62  ment are availab
12520 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
12530 74 20 72 62 75 4f 62 6a 49 74 65 72 50 72 65 70  t rbuObjIterPrep
12540 61 72 65 41 6c 6c 28 0a 20 20 73 71 6c 69 74 65  areAll(.  sqlite
12550 33 72 62 75 20 2a 70 2c 20 0a 20 20 52 62 75 4f  3rbu *p, .  RbuO
12560 62 6a 49 74 65 72 20 2a 70 49 74 65 72 2c 0a 20  bjIter *pIter,. 
12570 20 69 6e 74 20 6e 4f 66 66 73 65 74 20 20 20 20   int nOffset    
12580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12590 20 2f 2a 20 41 64 64 20 22 4c 49 4d 49 54 20 2d   /* Add "LIMIT -
125a0 31 20 4f 46 46 53 45 54 20 24 6e 4f 66 66 73 65  1 OFFSET $nOffse
125b0 74 22 20 74 6f 20 53 45 4c 45 43 54 20 2a 2f 0a  t" to SELECT */.
125c0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74  ){.  assert( pIt
125d0 65 72 2d 3e 62 43 6c 65 61 6e 75 70 3d 3d 30 20  er->bCleanup==0 
125e0 29 3b 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e  );.  if( pIter->
125f0 70 53 65 6c 65 63 74 3d 3d 30 20 26 26 20 72 62  pSelect==0 && rb
12600 75 4f 62 6a 49 74 65 72 43 61 63 68 65 54 61 62  uObjIterCacheTab
12610 6c 65 49 6e 66 6f 28 70 2c 20 70 49 74 65 72 29  leInfo(p, pIter)
12620 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
12630 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 74 6e 75     const int tnu
12640 6d 20 3d 20 70 49 74 65 72 2d 3e 69 54 6e 75 6d  m = pIter->iTnum
12650 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c  ;.    char *zCol
12660 6c 69 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20  list = 0;       
12670 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 69      /* List of i
12680 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 73 20 2a  ndexed columns *
12690 2f 0a 20 20 20 20 63 68 61 72 20 2a 2a 70 7a 20  /.    char **pz 
126a0 3d 20 26 70 2d 3e 7a 45 72 72 6d 73 67 3b 0a 20  = &p->zErrmsg;. 
126b0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
126c0 49 64 78 20 3d 20 70 49 74 65 72 2d 3e 7a 49 64  Idx = pIter->zId
126d0 78 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4c 69  x;.    char *zLi
126e0 6d 69 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66  mit = 0;..    if
126f0 28 20 6e 4f 66 66 73 65 74 20 29 7b 0a 20 20 20  ( nOffset ){.   
12700 20 20 20 7a 4c 69 6d 69 74 20 3d 20 73 71 6c 69     zLimit = sqli
12710 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 20 4c 49  te3_mprintf(" LI
12720 4d 49 54 20 2d 31 20 4f 46 46 53 45 54 20 25 64  MIT -1 OFFSET %d
12730 22 2c 20 6e 4f 66 66 73 65 74 29 3b 0a 20 20 20  ", nOffset);.   
12740 20 20 20 69 66 28 20 21 7a 4c 69 6d 69 74 20 29     if( !zLimit )
12750 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
12760 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 0a 20 20  NOMEM;.    }..  
12770 20 20 69 66 28 20 7a 49 64 78 20 29 7b 0a 20 20    if( zIdx ){.  
12780 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
12790 7a 54 62 6c 20 3d 20 70 49 74 65 72 2d 3e 7a 54  zTbl = pIter->zT
127a0 62 6c 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  bl;.      char *
127b0 7a 49 6d 70 6f 73 74 65 72 43 6f 6c 73 20 3d 20  zImposterCols = 
127c0 30 3b 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73  0;    /* Columns
127d0 20 66 6f 72 20 69 6d 70 6f 73 74 65 72 20 74 61   for imposter ta
127e0 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 63 68 61  ble */.      cha
127f0 72 20 2a 7a 49 6d 70 6f 73 74 65 72 50 4b 20 3d  r *zImposterPK =
12800 20 30 3b 20 20 20 20 20 20 2f 2a 20 50 72 69 6d   0;      /* Prim
12810 61 72 79 20 6b 65 79 20 64 65 63 6c 61 72 61 74  ary key declarat
12820 69 6f 6e 20 66 6f 72 20 69 6d 70 6f 73 74 65 72  ion for imposter
12830 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20 2a   */.      char *
12840 7a 57 68 65 72 65 20 3d 20 30 3b 20 20 20 20 20  zWhere = 0;     
12850 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20 63        /* WHERE c
12860 6c 61 75 73 65 20 6f 6e 20 50 4b 20 63 6f 6c 75  lause on PK colu
12870 6d 6e 73 20 2a 2f 0a 20 20 20 20 20 20 63 68 61  mns */.      cha
12880 72 20 2a 7a 42 69 6e 64 20 3d 20 30 3b 0a 20 20  r *zBind = 0;.  
12890 20 20 20 20 63 68 61 72 20 2a 7a 50 61 72 74 20      char *zPart 
128a0 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  = 0;.      int n
128b0 42 69 6e 64 20 3d 20 30 3b 0a 0a 20 20 20 20 20  Bind = 0;..     
128c0 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
128d0 65 54 79 70 65 21 3d 52 42 55 5f 50 4b 5f 56 54  eType!=RBU_PK_VT
128e0 41 42 20 29 3b 0a 20 20 20 20 20 20 7a 43 6f 6c  AB );.      zCol
128f0 6c 69 73 74 20 3d 20 72 62 75 4f 62 6a 49 74 65  list = rbuObjIte
12900 72 47 65 74 49 6e 64 65 78 43 6f 6c 73 28 0a 20  rGetIndexCols(. 
12910 20 20 20 20 20 20 20 20 20 70 2c 20 70 49 74 65           p, pIte
12920 72 2c 20 26 7a 49 6d 70 6f 73 74 65 72 43 6f 6c  r, &zImposterCol
12930 73 2c 20 26 7a 49 6d 70 6f 73 74 65 72 50 4b 2c  s, &zImposterPK,
12940 20 26 7a 57 68 65 72 65 2c 20 26 6e 42 69 6e 64   &zWhere, &nBind
12950 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
12960 7a 42 69 6e 64 20 3d 20 72 62 75 4f 62 6a 49 74  zBind = rbuObjIt
12970 65 72 47 65 74 42 69 6e 64 6c 69 73 74 28 70 2c  erGetBindlist(p,
12980 20 6e 42 69 6e 64 29 3b 0a 20 20 20 20 20 20 7a   nBind);.      z
12990 50 61 72 74 20 3d 20 72 62 75 4f 62 6a 49 74 65  Part = rbuObjIte
129a0 72 47 65 74 49 6e 64 65 78 57 68 65 72 65 28 70  rGetIndexWhere(p
129b0 2c 20 70 49 74 65 72 29 3b 0a 0a 20 20 20 20 20  , pIter);..     
129c0 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 69   /* Create the i
129d0 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 20 75 73  mposter table us
129e0 65 64 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74  ed to write to t
129f0 68 69 73 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20  his index. */.  
12a00 20 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74      sqlite3_test
12a10 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
12a20 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45  TESTCTRL_IMPOSTE
12a30 52 2c 20 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 6d  R, p->dbMain, "m
12a40 61 69 6e 22 2c 20 30 2c 20 31 29 3b 0a 20 20 20  ain", 0, 1);.   
12a50 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f     sqlite3_test_
12a60 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
12a70 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52  ESTCTRL_IMPOSTER
12a80 2c 20 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 6d 61  , p->dbMain, "ma
12a90 69 6e 22 2c 20 31 2c 74 6e 75 6d 29 3b 0a 20 20  in", 1,tnum);.  
12aa0 20 20 20 20 72 62 75 4d 50 72 69 6e 74 66 45 78      rbuMPrintfEx
12ab0 65 63 28 70 2c 20 70 2d 3e 64 62 4d 61 69 6e 2c  ec(p, p->dbMain,
12ac0 0a 20 20 20 20 20 20 20 20 20 20 22 43 52 45 41  .          "CREA
12ad0 54 45 20 54 41 42 4c 45 20 5c 22 72 62 75 5f 69  TE TABLE \"rbu_i
12ae0 6d 70 5f 25 77 5c 22 28 20 25 73 2c 20 50 52 49  mp_%w\"( %s, PRI
12af0 4d 41 52 59 20 4b 45 59 28 20 25 73 20 29 20 29  MARY KEY( %s ) )
12b00 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 22 2c   WITHOUT ROWID",
12b10 0a 20 20 20 20 20 20 20 20 20 20 7a 54 62 6c 2c  .          zTbl,
12b20 20 7a 49 6d 70 6f 73 74 65 72 43 6f 6c 73 2c 20   zImposterCols, 
12b30 7a 49 6d 70 6f 73 74 65 72 50 4b 0a 20 20 20 20  zImposterPK.    
12b40 20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74    );.      sqlit
12b50 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
12b60 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
12b70 49 4d 50 4f 53 54 45 52 2c 20 70 2d 3e 64 62 4d  IMPOSTER, p->dbM
12b80 61 69 6e 2c 20 22 6d 61 69 6e 22 2c 20 30 2c 20  ain, "main", 0, 
12b90 30 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 72  0);..      /* Cr
12ba0 65 61 74 65 20 74 68 65 20 73 74 61 74 65 6d 65  eate the stateme
12bb0 6e 74 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 64  nt to insert ind
12bc0 65 78 20 65 6e 74 72 69 65 73 20 2a 2f 0a 20 20  ex entries */.  
12bd0 20 20 20 20 70 49 74 65 72 2d 3e 6e 43 6f 6c 20      pIter->nCol 
12be0 3d 20 6e 42 69 6e 64 3b 0a 20 20 20 20 20 20 69  = nBind;.      i
12bf0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
12c00 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
12c10 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65 46 72  ->rc = prepareFr
12c20 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f  eeAndCollectErro
12c30 72 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  r(.            p
12c40 2d 3e 64 62 4d 61 69 6e 2c 20 26 70 49 74 65 72  ->dbMain, &pIter
12c50 2d 3e 70 49 6e 73 65 72 74 2c 20 26 70 2d 3e 7a  ->pInsert, &p->z
12c60 45 72 72 6d 73 67 2c 0a 20 20 20 20 20 20 20 20  Errmsg,.        
12c70 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74    sqlite3_mprint
12c80 66 28 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 5c  f("INSERT INTO \
12c90 22 72 62 75 5f 69 6d 70 5f 25 77 5c 22 20 56 41  "rbu_imp_%w\" VA
12ca0 4c 55 45 53 28 25 73 29 22 2c 20 7a 54 62 6c 2c  LUES(%s)", zTbl,
12cb0 20 7a 42 69 6e 64 29 0a 20 20 20 20 20 20 20 20   zBind).        
12cc0 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
12cd0 20 20 2f 2a 20 41 6e 64 20 74 6f 20 64 65 6c 65    /* And to dele
12ce0 74 65 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73  te index entries
12cf0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 72 62   */.      if( rb
12d00 75 49 73 56 61 63 75 75 6d 28 70 29 3d 3d 30 20  uIsVacuum(p)==0 
12d10 26 26 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  && p->rc==SQLITE
12d20 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
12d30 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65 46 72  ->rc = prepareFr
12d40 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f  eeAndCollectErro
12d50 72 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  r(.            p
12d60 2d 3e 64 62 4d 61 69 6e 2c 20 26 70 49 74 65 72  ->dbMain, &pIter
12d70 2d 3e 70 44 65 6c 65 74 65 2c 20 26 70 2d 3e 7a  ->pDelete, &p->z
12d80 45 72 72 6d 73 67 2c 0a 20 20 20 20 20 20 20 20  Errmsg,.        
12d90 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74    sqlite3_mprint
12da0 66 28 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 5c  f("DELETE FROM \
12db0 22 72 62 75 5f 69 6d 70 5f 25 77 5c 22 20 57 48  "rbu_imp_%w\" WH
12dc0 45 52 45 20 25 73 22 2c 20 7a 54 62 6c 2c 20 7a  ERE %s", zTbl, z
12dd0 57 68 65 72 65 29 0a 20 20 20 20 20 20 20 20 29  Where).        )
12de0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
12df0 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 53   /* Create the S
12e00 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
12e10 74 6f 20 72 65 61 64 20 6b 65 79 73 20 69 6e 20  to read keys in 
12e20 73 6f 72 74 65 64 20 6f 72 64 65 72 20 2a 2f 0a  sorted order */.
12e30 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
12e40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
12e50 20 20 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c        char *zSql
12e60 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 62  ;.        if( rb
12e70 75 49 73 56 61 63 75 75 6d 28 70 29 20 29 7b 0a  uIsVacuum(p) ){.
12e80 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
12e90 7a 53 74 61 72 74 20 3d 20 30 3b 0a 20 20 20 20  zStart = 0;.    
12ea0 20 20 20 20 20 20 69 66 28 20 6e 4f 66 66 73 65        if( nOffse
12eb0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
12ec0 20 7a 53 74 61 72 74 20 3d 20 72 62 75 56 61 63   zStart = rbuVac
12ed0 75 75 6d 49 6e 64 65 78 53 74 61 72 74 28 70 2c  uumIndexStart(p,
12ee0 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 20   pIter);.       
12ef0 20 20 20 20 20 69 66 28 20 7a 53 74 61 72 74 20       if( zStart 
12f00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
12f10 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4c   sqlite3_free(zL
12f20 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 20 20 20  imit);.         
12f30 20 20 20 20 20 7a 4c 69 6d 69 74 20 3d 20 30 3b       zLimit = 0;
12f40 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
12f50 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20           }..    
12f60 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c        zSql = sql
12f70 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20  ite3_mprintf(.  
12f80 20 20 20 20 20 20 20 20 20 20 20 20 22 53 45 4c              "SEL
12f90 45 43 54 20 25 73 2c 20 30 20 41 53 20 72 62 75  ECT %s, 0 AS rbu
12fa0 5f 63 6f 6e 74 72 6f 6c 20 46 52 4f 4d 20 27 25  _control FROM '%
12fb0 71 27 20 25 73 20 25 73 20 25 73 20 4f 52 44 45  q' %s %s %s ORDE
12fc0 52 20 42 59 20 25 73 25 73 22 2c 0a 20 20 20 20  R BY %s%s",.    
12fd0 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 6c 69            zColli
12fe0 73 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  st, .           
12ff0 20 20 20 70 49 74 65 72 2d 3e 7a 44 61 74 61 54     pIter->zDataT
13000 62 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  bl,.            
13010 20 20 7a 50 61 72 74 2c 20 0a 20 20 20 20 20 20    zPart, .      
13020 20 20 20 20 20 20 20 20 28 7a 53 74 61 72 74 20          (zStart 
13030 3f 20 28 7a 50 61 72 74 20 3f 20 22 41 4e 44 22  ? (zPart ? "AND"
13040 20 3a 20 22 57 48 45 52 45 22 29 20 3a 20 22 22   : "WHERE") : ""
13050 29 2c 20 7a 53 74 61 72 74 2c 0a 20 20 20 20 20  ), zStart,.     
13060 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 6c 69 73           zCollis
13070 74 2c 20 7a 4c 69 6d 69 74 0a 20 20 20 20 20 20  t, zLimit.      
13080 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20      );.         
13090 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53   sqlite3_free(zS
130a0 74 61 72 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  tart);.        }
130b0 65 6c 73 65 0a 0a 20 20 20 20 20 20 20 20 69 66  else..        if
130c0 28 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d  ( pIter->eType==
130d0 52 42 55 5f 50 4b 5f 45 58 54 45 52 4e 41 4c 20  RBU_PK_EXTERNAL 
130e0 7c 7c 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d  || pIter->eType=
130f0 3d 52 42 55 5f 50 4b 5f 4e 4f 4e 45 20 29 7b 0a  =RBU_PK_NONE ){.
13100 20 20 20 20 20 20 20 20 20 20 7a 53 71 6c 20 3d            zSql =
13110 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
13120 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  (.              
13130 22 53 45 4c 45 43 54 20 25 73 2c 20 72 62 75 5f  "SELECT %s, rbu_
13140 63 6f 6e 74 72 6f 6c 20 46 52 4f 4d 20 25 73 2e  control FROM %s.
13150 27 72 62 75 5f 74 6d 70 5f 25 71 27 20 25 73 20  'rbu_tmp_%q' %s 
13160 4f 52 44 45 52 20 42 59 20 25 73 25 73 22 2c 0a  ORDER BY %s%s",.
13170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 43                zC
13180 6f 6c 6c 69 73 74 2c 20 70 2d 3e 7a 53 74 61 74  ollist, p->zStat
13190 65 44 62 2c 20 70 49 74 65 72 2d 3e 7a 44 61 74  eDb, pIter->zDat
131a0 61 54 62 6c 2c 0a 20 20 20 20 20 20 20 20 20 20  aTbl,.          
131b0 20 20 20 20 7a 50 61 72 74 2c 20 7a 43 6f 6c 6c      zPart, zColl
131c0 69 73 74 2c 20 7a 4c 69 6d 69 74 0a 20 20 20 20  ist, zLimit.    
131d0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
131e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
131f0 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
13200 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20  _mprintf(.      
13210 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
13220 25 73 2c 20 72 62 75 5f 63 6f 6e 74 72 6f 6c 20  %s, rbu_control 
13230 46 52 4f 4d 20 25 73 2e 27 72 62 75 5f 74 6d 70  FROM %s.'rbu_tmp
13240 5f 25 71 27 20 25 73 20 22 0a 20 20 20 20 20 20  _%q' %s ".      
13250 20 20 20 20 20 20 20 20 22 55 4e 49 4f 4e 20 41          "UNION A
13260 4c 4c 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  LL ".           
13270 20 20 20 22 53 45 4c 45 43 54 20 25 73 2c 20 72     "SELECT %s, r
13280 62 75 5f 63 6f 6e 74 72 6f 6c 20 46 52 4f 4d 20  bu_control FROM 
13290 27 25 71 27 20 22 0a 20 20 20 20 20 20 20 20 20  '%q' ".         
132a0 20 20 20 20 20 22 25 73 20 25 73 20 74 79 70 65       "%s %s type
132b0 6f 66 28 72 62 75 5f 63 6f 6e 74 72 6f 6c 29 3d  of(rbu_control)=
132c0 27 69 6e 74 65 67 65 72 27 20 41 4e 44 20 72 62  'integer' AND rb
132d0 75 5f 63 6f 6e 74 72 6f 6c 21 3d 31 20 22 0a 20  u_control!=1 ". 
132e0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 4f 52               "OR
132f0 44 45 52 20 42 59 20 25 73 25 73 22 2c 0a 20 20  DER BY %s%s",.  
13300 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c              zCol
13310 6c 69 73 74 2c 20 70 2d 3e 7a 53 74 61 74 65 44  list, p->zStateD
13320 62 2c 20 70 49 74 65 72 2d 3e 7a 44 61 74 61 54  b, pIter->zDataT
13330 62 6c 2c 20 7a 50 61 72 74 2c 0a 20 20 20 20 20  bl, zPart,.     
13340 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 6c 69 73           zCollis
13350 74 2c 20 70 49 74 65 72 2d 3e 7a 44 61 74 61 54  t, pIter->zDataT
13360 62 6c 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  bl, .           
13370 20 20 20 7a 50 61 72 74 2c 0a 20 20 20 20 20 20     zPart,.      
13380 20 20 20 20 20 20 20 20 28 7a 50 61 72 74 20 3f          (zPart ?
13390 20 22 41 4e 44 22 20 3a 20 22 57 48 45 52 45 22   "AND" : "WHERE"
133a0 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
133b0 20 7a 43 6f 6c 6c 69 73 74 2c 20 7a 4c 69 6d 69   zCollist, zLimi
133c0 74 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20  t.          );. 
133d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
133e0 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
133f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
13400 20 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61     p->rc = prepa
13410 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74  reFreeAndCollect
13420 45 72 72 6f 72 28 70 2d 3e 64 62 52 62 75 2c 26  Error(p->dbRbu,&
13430 70 49 74 65 72 2d 3e 70 53 65 6c 65 63 74 2c 70  pIter->pSelect,p
13440 7a 2c 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 20  z,zSql);.       
13450 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
13460 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
13470 53 71 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Sql);.        }.
13480 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 73        }..      s
13490 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 49 6d 70  qlite3_free(zImp
134a0 6f 73 74 65 72 43 6f 6c 73 29 3b 0a 20 20 20 20  osterCols);.    
134b0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
134c0 49 6d 70 6f 73 74 65 72 50 4b 29 3b 0a 20 20 20  ImposterPK);.   
134d0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
134e0 7a 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20 73  zWhere);.      s
134f0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 69 6e  qlite3_free(zBin
13500 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
13510 33 5f 66 72 65 65 28 7a 50 61 72 74 29 3b 0a 20  3_free(zPart);. 
13520 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13530 69 6e 74 20 62 52 62 75 52 6f 77 69 64 20 3d 20  int bRbuRowid = 
13540 28 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52  (pIter->eType==R
13550 42 55 5f 50 4b 5f 56 54 41 42 29 0a 20 20 20 20  BU_PK_VTAB).    
13560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13570 7c 7c 28 70 49 74 65 72 2d 3e 65 54 79 70 65 3d  ||(pIter->eType=
13580 3d 52 42 55 5f 50 4b 5f 4e 4f 4e 45 29 0a 20 20  =RBU_PK_NONE).  
13590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
135a0 20 20 7c 7c 28 70 49 74 65 72 2d 3e 65 54 79 70    ||(pIter->eTyp
135b0 65 3d 3d 52 42 55 5f 50 4b 5f 45 58 54 45 52 4e  e==RBU_PK_EXTERN
135c0 41 4c 20 26 26 20 72 62 75 49 73 56 61 63 75 75  AL && rbuIsVacuu
135d0 6d 28 70 29 29 3b 0a 20 20 20 20 20 20 63 6f 6e  m(p));.      con
135e0 73 74 20 63 68 61 72 20 2a 7a 54 62 6c 20 3d 20  st char *zTbl = 
135f0 70 49 74 65 72 2d 3e 7a 54 62 6c 3b 20 20 20 20  pIter->zTbl;    
13600 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 68 69 73     /* Table this
13610 20 73 74 65 70 20 61 70 70 6c 69 65 73 20 74 6f   step applies to
13620 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   */.      const 
13630 63 68 61 72 20 2a 7a 57 72 69 74 65 3b 20 20 20  char *zWrite;   
13640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13650 2f 2a 20 49 6d 70 6f 73 74 65 72 20 74 61 62 6c  /* Imposter tabl
13660 65 20 6e 61 6d 65 20 2a 2f 0a 0a 20 20 20 20 20  e name */..     
13670 20 63 68 61 72 20 2a 7a 42 69 6e 64 69 6e 67 73   char *zBindings
13680 20 3d 20 72 62 75 4f 62 6a 49 74 65 72 47 65 74   = rbuObjIterGet
13690 42 69 6e 64 6c 69 73 74 28 70 2c 20 70 49 74 65  Bindlist(p, pIte
136a0 72 2d 3e 6e 54 62 6c 43 6f 6c 20 2b 20 62 52 62  r->nTblCol + bRb
136b0 75 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 63  uRowid);.      c
136c0 68 61 72 20 2a 7a 57 68 65 72 65 20 3d 20 72 62  har *zWhere = rb
136d0 75 4f 62 6a 49 74 65 72 47 65 74 57 68 65 72 65  uObjIterGetWhere
136e0 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  (p, pIter);.    
136f0 20 20 63 68 61 72 20 2a 7a 4f 6c 64 6c 69 73 74    char *zOldlist
13700 20 3d 20 72 62 75 4f 62 6a 49 74 65 72 47 65 74   = rbuObjIterGet
13710 4f 6c 64 6c 69 73 74 28 70 2c 20 70 49 74 65 72  Oldlist(p, pIter
13720 2c 20 22 6f 6c 64 22 29 3b 0a 20 20 20 20 20 20  , "old");.      
13730 63 68 61 72 20 2a 7a 4e 65 77 6c 69 73 74 20 3d  char *zNewlist =
13740 20 72 62 75 4f 62 6a 49 74 65 72 47 65 74 4f 6c   rbuObjIterGetOl
13750 64 6c 69 73 74 28 70 2c 20 70 49 74 65 72 2c 20  dlist(p, pIter, 
13760 22 6e 65 77 22 29 3b 0a 0a 20 20 20 20 20 20 7a  "new");..      z
13770 43 6f 6c 6c 69 73 74 20 3d 20 72 62 75 4f 62 6a  Collist = rbuObj
13780 49 74 65 72 47 65 74 43 6f 6c 6c 69 73 74 28 70  IterGetCollist(p
13790 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20  , pIter);.      
137a0 70 49 74 65 72 2d 3e 6e 43 6f 6c 20 3d 20 70 49  pIter->nCol = pI
137b0 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 3b 0a 0a 20  ter->nTblCol;.. 
137c0 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74       /* Create t
137d0 68 65 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c  he imposter tabl
137e0 65 20 6f 72 20 74 61 62 6c 65 73 20 28 69 66 20  e or tables (if 
137f0 72 65 71 75 69 72 65 64 29 2e 20 2a 2f 0a 20 20  required). */.  
13800 20 20 20 20 72 62 75 43 72 65 61 74 65 49 6d 70      rbuCreateImp
13810 6f 73 74 65 72 54 61 62 6c 65 28 70 2c 20 70 49  osterTable(p, pI
13820 74 65 72 29 3b 0a 20 20 20 20 20 20 72 62 75 43  ter);.      rbuC
13830 72 65 61 74 65 49 6d 70 6f 73 74 65 72 54 61 62  reateImposterTab
13840 6c 65 32 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  le2(p, pIter);. 
13850 20 20 20 20 20 7a 57 72 69 74 65 20 3d 20 28 70       zWrite = (p
13860 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55  Iter->eType==RBU
13870 5f 50 4b 5f 56 54 41 42 20 3f 20 22 22 20 3a 20  _PK_VTAB ? "" : 
13880 22 72 62 75 5f 69 6d 70 5f 22 29 3b 0a 0a 20 20  "rbu_imp_");..  
13890 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68      /* Create th
138a0 65 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65  e INSERT stateme
138b0 6e 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74  nt to write to t
138c0 68 65 20 74 61 72 67 65 74 20 50 4b 20 62 2d 74  he target PK b-t
138d0 72 65 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ree */.      if(
138e0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
138f0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  K ){.        p->
13900 72 63 20 3d 20 70 72 65 70 61 72 65 46 72 65 65  rc = prepareFree
13910 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28  AndCollectError(
13920 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 70 49 74 65  p->dbMain, &pIte
13930 72 2d 3e 70 49 6e 73 65 72 74 2c 20 70 7a 2c 0a  r->pInsert, pz,.
13940 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
13950 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20  te3_mprintf(.   
13960 20 20 20 20 20 20 20 20 20 20 20 22 49 4e 53 45             "INSE
13970 52 54 20 49 4e 54 4f 20 5c 22 25 73 25 77 5c 22  RT INTO \"%s%w\"
13980 28 25 73 25 73 29 20 56 41 4c 55 45 53 28 25 73  (%s%s) VALUES(%s
13990 29 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  )", .           
139a0 20 20 20 7a 57 72 69 74 65 2c 20 7a 54 62 6c 2c     zWrite, zTbl,
139b0 20 7a 43 6f 6c 6c 69 73 74 2c 20 28 62 52 62 75   zCollist, (bRbu
139c0 52 6f 77 69 64 20 3f 20 22 2c 20 5f 72 6f 77 69  Rowid ? ", _rowi
139d0 64 5f 22 20 3a 20 22 22 29 2c 20 7a 42 69 6e 64  d_" : ""), zBind
139e0 69 6e 67 73 0a 20 20 20 20 20 20 20 20 20 20 20  ings.           
139f0 20 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20   ).        );.  
13a00 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
13a10 43 72 65 61 74 65 20 74 68 65 20 44 45 4c 45 54  Create the DELET
13a20 45 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 77  E statement to w
13a30 72 69 74 65 20 74 6f 20 74 68 65 20 74 61 72 67  rite to the targ
13a40 65 74 20 50 4b 20 62 2d 74 72 65 65 2e 0a 20 20  et PK b-tree..  
13a50 20 20 20 20 2a 2a 20 42 65 63 61 75 73 65 20 69      ** Because i
13a60 74 20 6f 6e 6c 79 20 70 65 72 66 6f 72 6d 73 20  t only performs 
13a70 49 4e 53 45 52 54 20 6f 70 65 72 61 74 69 6f 6e  INSERT operation
13a80 73 2c 20 74 68 69 73 20 69 73 20 6e 6f 74 20 72  s, this is not r
13a90 65 71 75 69 72 65 64 20 66 6f 72 0a 20 20 20 20  equired for.    
13aa0 20 20 2a 2a 20 61 6e 20 72 62 75 20 76 61 63 75    ** an rbu vacu
13ab0 75 6d 20 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20  um handle.  */. 
13ac0 20 20 20 20 20 69 66 28 20 72 62 75 49 73 56 61       if( rbuIsVa
13ad0 63 75 75 6d 28 70 29 3d 3d 30 20 26 26 20 70 2d  cuum(p)==0 && p-
13ae0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
13af0 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20  {.        p->rc 
13b00 3d 20 70 72 65 70 61 72 65 46 72 65 65 41 6e 64  = prepareFreeAnd
13b10 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e  CollectError(p->
13b20 64 62 4d 61 69 6e 2c 20 26 70 49 74 65 72 2d 3e  dbMain, &pIter->
13b30 70 44 65 6c 65 74 65 2c 20 70 7a 2c 0a 20 20 20  pDelete, pz,.   
13b40 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
13b50 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20  _mprintf(.      
13b60 20 20 20 20 20 20 20 20 22 44 45 4c 45 54 45 20          "DELETE 
13b70 46 52 4f 4d 20 5c 22 25 73 25 77 5c 22 20 57 48  FROM \"%s%w\" WH
13b80 45 52 45 20 25 73 22 2c 20 7a 57 72 69 74 65 2c  ERE %s", zWrite,
13b90 20 7a 54 62 6c 2c 20 7a 57 68 65 72 65 0a 20 20   zTbl, zWhere.  
13ba0 20 20 20 20 20 20 20 20 20 20 29 0a 20 20 20 20            ).    
13bb0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a      );.      }..
13bc0 20 20 20 20 20 20 69 66 28 20 72 62 75 49 73 56        if( rbuIsV
13bd0 61 63 75 75 6d 28 70 29 3d 3d 30 20 26 26 20 70  acuum(p)==0 && p
13be0 49 74 65 72 2d 3e 61 62 49 6e 64 65 78 65 64 20  Iter->abIndexed 
13bf0 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
13c00 20 63 68 61 72 20 2a 7a 52 62 75 52 6f 77 69 64   char *zRbuRowid
13c10 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 20 20 69   = "";.        i
13c20 66 28 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d  f( pIter->eType=
13c30 3d 52 42 55 5f 50 4b 5f 45 58 54 45 52 4e 41 4c  =RBU_PK_EXTERNAL
13c40 20 7c 7c 20 70 49 74 65 72 2d 3e 65 54 79 70 65   || pIter->eType
13c50 3d 3d 52 42 55 5f 50 4b 5f 4e 4f 4e 45 20 29 7b  ==RBU_PK_NONE ){
13c60 0a 20 20 20 20 20 20 20 20 20 20 7a 52 62 75 52  .          zRbuR
13c70 6f 77 69 64 20 3d 20 22 2c 20 72 62 75 5f 72 6f  owid = ", rbu_ro
13c80 77 69 64 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a  wid";.        }.
13c90 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 72 65 61  .        /* Crea
13ca0 74 65 20 74 68 65 20 72 62 75 5f 74 6d 70 5f 78  te the rbu_tmp_x
13cb0 78 78 20 74 61 62 6c 65 20 61 6e 64 20 74 68 65  xx table and the
13cc0 20 74 72 69 67 67 65 72 73 20 74 6f 20 70 6f 70   triggers to pop
13cd0 75 6c 61 74 65 20 69 74 2e 20 2a 2f 0a 20 20 20  ulate it. */.   
13ce0 20 20 20 20 20 72 62 75 4d 50 72 69 6e 74 66 45       rbuMPrintfE
13cf0 78 65 63 28 70 2c 20 70 2d 3e 64 62 52 62 75 2c  xec(p, p->dbRbu,
13d00 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 43 52  .            "CR
13d10 45 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f  EATE TABLE IF NO
13d20 54 20 45 58 49 53 54 53 20 25 73 2e 27 72 62 75  T EXISTS %s.'rbu
13d30 5f 74 6d 70 5f 25 71 27 20 41 53 20 22 0a 20 20  _tmp_%q' AS ".  
13d40 20 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43            "SELEC
13d50 54 20 2a 25 73 20 46 52 4f 4d 20 27 25 71 27 20  T *%s FROM '%q' 
13d60 57 48 45 52 45 20 30 3b 22 0a 20 20 20 20 20 20  WHERE 0;".      
13d70 20 20 20 20 20 20 2c 20 70 2d 3e 7a 53 74 61 74        , p->zStat
13d80 65 44 62 2c 20 70 49 74 65 72 2d 3e 7a 44 61 74  eDb, pIter->zDat
13d90 61 54 62 6c 0a 20 20 20 20 20 20 20 20 20 20 20  aTbl.           
13da0 20 2c 20 28 70 49 74 65 72 2d 3e 65 54 79 70 65   , (pIter->eType
13db0 3d 3d 52 42 55 5f 50 4b 5f 45 58 54 45 52 4e 41  ==RBU_PK_EXTERNA
13dc0 4c 20 3f 20 22 2c 20 30 20 41 53 20 72 62 75 5f  L ? ", 0 AS rbu_
13dd0 72 6f 77 69 64 22 20 3a 20 22 22 29 0a 20 20 20  rowid" : "").   
13de0 20 20 20 20 20 20 20 20 20 2c 20 70 49 74 65 72           , pIter
13df0 2d 3e 7a 44 61 74 61 54 62 6c 0a 20 20 20 20 20  ->zDataTbl.     
13e00 20 20 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 72     );..        r
13e10 62 75 4d 50 72 69 6e 74 66 45 78 65 63 28 70 2c  buMPrintfExec(p,
13e20 20 70 2d 3e 64 62 4d 61 69 6e 2c 0a 20 20 20 20   p->dbMain,.    
13e30 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20          "CREATE 
13e40 54 45 4d 50 20 54 52 49 47 47 45 52 20 72 62 75  TEMP TRIGGER rbu
13e50 5f 64 65 6c 65 74 65 5f 74 72 20 42 45 46 4f 52  _delete_tr BEFOR
13e60 45 20 44 45 4c 45 54 45 20 4f 4e 20 5c 22 25 73  E DELETE ON \"%s
13e70 25 77 5c 22 20 22 0a 20 20 20 20 20 20 20 20 20  %w\" ".         
13e80 20 20 20 22 42 45 47 49 4e 20 22 0a 20 20 20 20     "BEGIN ".    
13e90 20 20 20 20 20 20 20 20 22 20 20 53 45 4c 45 43          "  SELEC
13ea0 54 20 72 62 75 5f 74 6d 70 5f 69 6e 73 65 72 74  T rbu_tmp_insert
13eb0 28 33 2c 20 25 73 29 3b 22 0a 20 20 20 20 20 20  (3, %s);".      
13ec0 20 20 20 20 20 20 22 45 4e 44 3b 22 0a 0a 20 20        "END;"..  
13ed0 20 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54            "CREAT
13ee0 45 20 54 45 4d 50 20 54 52 49 47 47 45 52 20 72  E TEMP TRIGGER r
13ef0 62 75 5f 75 70 64 61 74 65 31 5f 74 72 20 42 45  bu_update1_tr BE
13f00 46 4f 52 45 20 55 50 44 41 54 45 20 4f 4e 20 5c  FORE UPDATE ON \
13f10 22 25 73 25 77 5c 22 20 22 0a 20 20 20 20 20 20  "%s%w\" ".      
13f20 20 20 20 20 20 20 22 42 45 47 49 4e 20 22 0a 20        "BEGIN ". 
13f30 20 20 20 20 20 20 20 20 20 20 20 22 20 20 53 45             "  SE
13f40 4c 45 43 54 20 72 62 75 5f 74 6d 70 5f 69 6e 73  LECT rbu_tmp_ins
13f50 65 72 74 28 33 2c 20 25 73 29 3b 22 0a 20 20 20  ert(3, %s);".   
13f60 20 20 20 20 20 20 20 20 20 22 45 4e 44 3b 22 0a           "END;".
13f70 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 43 52  .            "CR
13f80 45 41 54 45 20 54 45 4d 50 20 54 52 49 47 47 45  EATE TEMP TRIGGE
13f90 52 20 72 62 75 5f 75 70 64 61 74 65 32 5f 74 72  R rbu_update2_tr
13fa0 20 41 46 54 45 52 20 55 50 44 41 54 45 20 4f 4e   AFTER UPDATE ON
13fb0 20 5c 22 25 73 25 77 5c 22 20 22 0a 20 20 20 20   \"%s%w\" ".    
13fc0 20 20 20 20 20 20 20 20 22 42 45 47 49 4e 20 22          "BEGIN "
13fd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20  .            "  
13fe0 53 45 4c 45 43 54 20 72 62 75 5f 74 6d 70 5f 69  SELECT rbu_tmp_i
13ff0 6e 73 65 72 74 28 34 2c 20 25 73 29 3b 22 0a 20  nsert(4, %s);". 
14000 20 20 20 20 20 20 20 20 20 20 20 22 45 4e 44 3b             "END;
14010 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  ",.            z
14020 57 72 69 74 65 2c 20 7a 54 62 6c 2c 20 7a 4f 6c  Write, zTbl, zOl
14030 64 6c 69 73 74 2c 0a 20 20 20 20 20 20 20 20 20  dlist,.         
14040 20 20 20 7a 57 72 69 74 65 2c 20 7a 54 62 6c 2c     zWrite, zTbl,
14050 20 7a 4f 6c 64 6c 69 73 74 2c 0a 20 20 20 20 20   zOldlist,.     
14060 20 20 20 20 20 20 20 7a 57 72 69 74 65 2c 20 7a         zWrite, z
14070 54 62 6c 2c 20 7a 4e 65 77 6c 69 73 74 0a 20 20  Tbl, zNewlist.  
14080 20 20 20 20 20 20 29 3b 0a 0a 20 20 20 20 20 20        );..      
14090 20 20 69 66 28 20 70 49 74 65 72 2d 3e 65 54 79    if( pIter->eTy
140a0 70 65 3d 3d 52 42 55 5f 50 4b 5f 45 58 54 45 52  pe==RBU_PK_EXTER
140b0 4e 41 4c 20 7c 7c 20 70 49 74 65 72 2d 3e 65 54  NAL || pIter->eT
140c0 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 4e 4f 4e 45  ype==RBU_PK_NONE
140d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 62   ){.          rb
140e0 75 4d 50 72 69 6e 74 66 45 78 65 63 28 70 2c 20  uMPrintfExec(p, 
140f0 70 2d 3e 64 62 4d 61 69 6e 2c 0a 20 20 20 20 20  p->dbMain,.     
14100 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45           "CREATE
14110 20 54 45 4d 50 20 54 52 49 47 47 45 52 20 72 62   TEMP TRIGGER rb
14120 75 5f 69 6e 73 65 72 74 5f 74 72 20 41 46 54 45  u_insert_tr AFTE
14130 52 20 49 4e 53 45 52 54 20 4f 4e 20 5c 22 25 73  R INSERT ON \"%s
14140 25 77 5c 22 20 22 0a 20 20 20 20 20 20 20 20 20  %w\" ".         
14150 20 20 20 20 20 22 42 45 47 49 4e 20 22 0a 20 20       "BEGIN ".  
14160 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20 53              "  S
14170 45 4c 45 43 54 20 72 62 75 5f 74 6d 70 5f 69 6e  ELECT rbu_tmp_in
14180 73 65 72 74 28 30 2c 20 25 73 29 3b 22 0a 20 20  sert(0, %s);".  
14190 20 20 20 20 20 20 20 20 20 20 20 20 22 45 4e 44              "END
141a0 3b 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ;",.            
141b0 20 20 7a 57 72 69 74 65 2c 20 7a 54 62 6c 2c 20    zWrite, zTbl, 
141c0 7a 4e 65 77 6c 69 73 74 0a 20 20 20 20 20 20 20  zNewlist.       
141d0 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a     );.        }.
141e0 0a 20 20 20 20 20 20 20 20 72 62 75 4f 62 6a 49  .        rbuObjI
141f0 74 65 72 50 72 65 70 61 72 65 54 6d 70 49 6e 73  terPrepareTmpIns
14200 65 72 74 28 70 2c 20 70 49 74 65 72 2c 20 7a 43  ert(p, pIter, zC
14210 6f 6c 6c 69 73 74 2c 20 7a 52 62 75 52 6f 77 69  ollist, zRbuRowi
14220 64 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  d);.      }..   
14230 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65     /* Create the
14240 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
14250 74 20 74 6f 20 72 65 61 64 20 6b 65 79 73 20 66  t to read keys f
14260 72 6f 6d 20 64 61 74 61 5f 78 78 78 20 2a 2f 0a  rom data_xxx */.
14270 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
14280 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
14290 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
142a0 20 2a 7a 52 62 75 52 6f 77 69 64 20 3d 20 22 22   *zRbuRowid = ""
142b0 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  ;.        char *
142c0 7a 53 74 61 72 74 20 3d 20 30 3b 0a 20 20 20 20  zStart = 0;.    
142d0 20 20 20 20 63 68 61 72 20 2a 7a 4f 72 64 65 72      char *zOrder
142e0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66   = 0;.        if
142f0 28 20 62 52 62 75 52 6f 77 69 64 20 29 7b 0a 20  ( bRbuRowid ){. 
14300 20 20 20 20 20 20 20 20 20 7a 52 62 75 52 6f 77           zRbuRow
14310 69 64 20 3d 20 72 62 75 49 73 56 61 63 75 75 6d  id = rbuIsVacuum
14320 28 70 29 20 3f 20 22 2c 5f 72 6f 77 69 64 5f 20  (p) ? ",_rowid_ 
14330 22 20 3a 20 22 2c 72 62 75 5f 72 6f 77 69 64 22  " : ",rbu_rowid"
14340 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
14350 20 20 20 20 20 69 66 28 20 72 62 75 49 73 56 61       if( rbuIsVa
14360 63 75 75 6d 28 70 29 20 29 7b 0a 20 20 20 20 20  cuum(p) ){.     
14370 20 20 20 20 20 69 66 28 20 6e 4f 66 66 73 65 74       if( nOffset
14380 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
14390 7a 53 74 61 72 74 20 3d 20 72 62 75 56 61 63 75  zStart = rbuVacu
143a0 75 6d 54 61 62 6c 65 53 74 61 72 74 28 70 2c 20  umTableStart(p, 
143b0 70 49 74 65 72 2c 20 62 52 62 75 52 6f 77 69 64  pIter, bRbuRowid
143c0 2c 20 7a 57 72 69 74 65 29 3b 0a 20 20 20 20 20  , zWrite);.     
143d0 20 20 20 20 20 20 20 69 66 28 20 7a 53 74 61 72         if( zStar
143e0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
143f0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
14400 7a 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 20  zLimit);.       
14410 20 20 20 20 20 20 20 7a 4c 69 6d 69 74 20 3d 20         zLimit = 
14420 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  0;.            }
14430 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
14440 20 20 20 20 20 20 20 69 66 28 20 62 52 62 75 52         if( bRbuR
14450 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20  owid ){.        
14460 20 20 20 20 7a 4f 72 64 65 72 20 3d 20 72 62 75      zOrder = rbu
14470 4d 50 72 69 6e 74 66 28 70 2c 20 22 5f 72 6f 77  MPrintf(p, "_row
14480 69 64 5f 22 29 3b 0a 20 20 20 20 20 20 20 20 20  id_");.         
14490 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
144a0 20 20 20 20 7a 4f 72 64 65 72 20 3d 20 72 62 75      zOrder = rbu
144b0 4f 62 6a 49 74 65 72 47 65 74 50 6b 4c 69 73 74  ObjIterGetPkList
144c0 28 70 2c 20 70 49 74 65 72 2c 20 22 22 2c 20 22  (p, pIter, "", "
144d0 2c 20 22 2c 20 22 22 29 3b 0a 20 20 20 20 20 20  , ", "");.      
144e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
144f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
14500 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
14510 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63  .          p->rc
14520 20 3d 20 70 72 65 70 61 72 65 46 72 65 65 41 6e   = prepareFreeAn
14530 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d  dCollectError(p-
14540 3e 64 62 52 62 75 2c 20 26 70 49 74 65 72 2d 3e  >dbRbu, &pIter->
14550 70 53 65 6c 65 63 74 2c 20 70 7a 2c 0a 20 20 20  pSelect, pz,.   
14560 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
14570 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20  e3_mprintf(.    
14580 20 20 20 20 20 20 20 20 20 20 20 20 22 53 45 4c              "SEL
14590 45 43 54 20 25 73 2c 25 73 20 72 62 75 5f 63 6f  ECT %s,%s rbu_co
145a0 6e 74 72 6f 6c 25 73 20 46 52 4f 4d 20 27 25 71  ntrol%s FROM '%q
145b0 27 25 73 20 25 73 20 25 73 20 25 73 22 2c 0a 20  '%s %s %s %s",. 
145c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
145d0 43 6f 6c 6c 69 73 74 2c 20 0a 20 20 20 20 20 20  Collist, .      
145e0 20 20 20 20 20 20 20 20 20 20 28 72 62 75 49 73            (rbuIs
145f0 56 61 63 75 75 6d 28 70 29 20 3f 20 22 30 20 41  Vacuum(p) ? "0 A
14600 53 20 22 20 3a 20 22 22 29 2c 0a 20 20 20 20 20  S " : ""),.     
14610 20 20 20 20 20 20 20 20 20 20 20 7a 52 62 75 52             zRbuR
14620 6f 77 69 64 2c 0a 20 20 20 20 20 20 20 20 20 20  owid,.          
14630 20 20 20 20 20 20 70 49 74 65 72 2d 3e 7a 44 61        pIter->zDa
14640 74 61 54 62 6c 2c 20 28 7a 53 74 61 72 74 20 3f  taTbl, (zStart ?
14650 20 7a 53 74 61 72 74 20 3a 20 22 22 29 2c 20 0a   zStart : ""), .
14660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14670 28 7a 4f 72 64 65 72 20 3f 20 22 4f 52 44 45 52  (zOrder ? "ORDER
14680 20 42 59 22 20 3a 20 22 22 29 2c 20 7a 4f 72 64   BY" : ""), zOrd
14690 65 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  er,.            
146a0 20 20 20 20 7a 4c 69 6d 69 74 0a 20 20 20 20 20      zLimit.     
146b0 20 20 20 20 20 20 20 20 20 29 0a 20 20 20 20 20           ).     
146c0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
146d0 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
146e0 33 5f 66 72 65 65 28 7a 53 74 61 72 74 29 3b 0a  3_free(zStart);.
146f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
14700 66 72 65 65 28 7a 4f 72 64 65 72 29 3b 0a 20 20  free(zOrder);.  
14710 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 73 71 6c      }..      sql
14720 69 74 65 33 5f 66 72 65 65 28 7a 57 68 65 72 65  ite3_free(zWhere
14730 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
14740 5f 66 72 65 65 28 7a 4f 6c 64 6c 69 73 74 29 3b  _free(zOldlist);
14750 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
14760 72 65 65 28 7a 4e 65 77 6c 69 73 74 29 3b 0a 20  ree(zNewlist);. 
14770 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
14780 65 28 7a 42 69 6e 64 69 6e 67 73 29 3b 0a 20 20  e(zBindings);.  
14790 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
147a0 66 72 65 65 28 7a 43 6f 6c 6c 69 73 74 29 3b 0a  free(zCollist);.
147b0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
147c0 28 7a 4c 69 6d 69 74 29 3b 0a 20 20 7d 0a 20 20  (zLimit);.  }.  
147d0 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 3b  .  return p->rc;
147e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 6f 75  .}../*.** Set ou
147f0 74 70 75 74 20 76 61 72 69 61 62 6c 65 20 2a 70  tput variable *p
14800 70 53 74 6d 74 20 74 6f 20 70 6f 69 6e 74 20 74  pStmt to point t
14810 6f 20 61 6e 20 55 50 44 41 54 45 20 73 74 61 74  o an UPDATE stat
14820 65 6d 65 6e 74 20 74 68 61 74 20 6d 61 79 0a 2a  ement that may.*
14830 2a 20 62 65 20 75 73 65 64 20 74 6f 20 75 70 64  * be used to upd
14840 61 74 65 20 74 68 65 20 69 6d 70 6f 73 74 65 72  ate the imposter
14850 20 74 61 62 6c 65 20 66 6f 72 20 74 68 65 20 6d   table for the m
14860 61 69 6e 20 74 61 62 6c 65 20 62 2d 74 72 65 65  ain table b-tree
14870 20 6f 66 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65   of the.** table
14880 20 6f 62 6a 65 63 74 20 74 68 61 74 20 70 49 74   object that pIt
14890 65 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  er currently poi
148a0 6e 74 73 20 74 6f 2c 20 61 73 73 75 6d 69 6e 67  nts to, assuming
148b0 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 72 62   that the .** rb
148c0 75 5f 63 6f 6e 74 72 6f 6c 20 63 6f 6c 75 6d 6e  u_control column
148d0 20 6f 66 20 74 68 65 20 64 61 74 61 5f 78 79 7a   of the data_xyz
148e0 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20   table contains 
148f0 7a 4d 61 73 6b 2e 0a 2a 2a 20 0a 2a 2a 20 49 66  zMask..** .** If
14900 20 74 68 65 20 7a 4d 61 73 6b 20 73 74 72 69 6e   the zMask strin
14910 67 20 64 6f 65 73 20 6e 6f 74 20 73 70 65 63 69  g does not speci
14920 66 79 20 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 74  fy any columns t
14930 6f 20 75 70 64 61 74 65 2c 20 74 68 65 6e 20 74  o update, then t
14940 68 69 73 0a 2a 2a 20 69 73 20 6e 6f 74 20 61 6e  his.** is not an
14950 20 65 72 72 6f 72 2e 20 4f 75 74 70 75 74 20 76   error. Output v
14960 61 72 69 61 62 6c 65 20 2a 70 70 53 74 6d 74 20  ariable *ppStmt 
14970 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69  is set to NULL i
14980 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a  n this case..*/.
14990 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 47 65  static int rbuGe
149a0 74 55 70 64 61 74 65 53 74 6d 74 28 0a 20 20 73  tUpdateStmt(.  s
149b0 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 20 20  qlite3rbu *p,   
149c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
149d0 2a 20 52 42 55 20 68 61 6e 64 6c 65 20 2a 2f 0a  * RBU handle */.
149e0 20 20 52 62 75 4f 62 6a 49 74 65 72 20 2a 70 49    RbuObjIter *pI
149f0 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ter,            
14a00 20 20 2f 2a 20 4f 62 6a 65 63 74 20 69 74 65 72    /* Object iter
14a10 61 74 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ator */.  const 
14a20 63 68 61 72 20 2a 7a 4d 61 73 6b 2c 20 20 20 20  char *zMask,    
14a30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72 62 75            /* rbu
14a40 5f 63 6f 6e 74 72 6f 6c 20 76 61 6c 75 65 20 28  _control value (
14a50 27 78 2e 78 2e 27 29 20 2a 2f 0a 20 20 73 71 6c  'x.x.') */.  sql
14a60 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74  ite3_stmt **ppSt
14a70 6d 74 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  mt           /* 
14a80 4f 55 54 3a 20 55 50 44 41 54 45 20 73 74 61 74  OUT: UPDATE stat
14a90 65 6d 65 6e 74 20 68 61 6e 64 6c 65 20 2a 2f 0a  ement handle */.
14aa0 29 7b 0a 20 20 52 62 75 55 70 64 61 74 65 53 74  ){.  RbuUpdateSt
14ab0 6d 74 20 2a 2a 70 70 3b 0a 20 20 52 62 75 55 70  mt **pp;.  RbuUp
14ac0 64 61 74 65 53 74 6d 74 20 2a 70 55 70 20 3d 20  dateStmt *pUp = 
14ad0 30 3b 0a 20 20 69 6e 74 20 6e 55 70 20 3d 20 30  0;.  int nUp = 0
14ae0 3b 0a 0a 20 20 2f 2a 20 49 6e 20 63 61 73 65 20  ;..  /* In case 
14af0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
14b00 2a 2f 0a 20 20 2a 70 70 53 74 6d 74 20 3d 20 30  */.  *ppStmt = 0
14b10 3b 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20 66  ;..  /* Search f
14b20 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20 73  or an existing s
14b30 74 61 74 65 6d 65 6e 74 2e 20 49 66 20 6f 6e 65  tatement. If one
14b40 20 69 73 20 66 6f 75 6e 64 2c 20 73 68 69 66 74   is found, shift
14b50 20 69 74 20 74 6f 20 74 68 65 20 66 72 6f 6e 74   it to the front
14b60 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 4c 52 55  .  ** of the LRU
14b70 20 71 75 65 75 65 20 61 6e 64 20 72 65 74 75 72   queue and retur
14b80 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 4f  n immediately. O
14b90 74 68 65 72 77 69 73 65 2c 20 6c 65 61 76 65 20  therwise, leave 
14ba0 6e 55 70 20 70 6f 69 6e 74 69 6e 67 0a 20 20 2a  nUp pointing.  *
14bb0 2a 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  * to the number 
14bc0 6f 66 20 73 74 61 74 65 6d 65 6e 74 73 20 63 75  of statements cu
14bd0 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 63  rrently in the c
14be0 61 63 68 65 20 61 6e 64 20 70 55 70 20 74 6f 20  ache and pUp to 
14bf0 74 68 65 0a 20 20 2a 2a 20 6c 61 73 74 20 6f 62  the.  ** last ob
14c00 6a 65 63 74 20 69 6e 20 74 68 65 20 6c 69 73 74  ject in the list
14c10 2e 20 20 2a 2f 0a 20 20 66 6f 72 28 70 70 3d 26  .  */.  for(pp=&
14c20 70 49 74 65 72 2d 3e 70 52 62 75 55 70 64 61 74  pIter->pRbuUpdat
14c30 65 3b 20 2a 70 70 3b 20 70 70 3d 26 28 28 2a 70  e; *pp; pp=&((*p
14c40 70 29 2d 3e 70 4e 65 78 74 29 29 7b 0a 20 20 20  p)->pNext)){.   
14c50 20 70 55 70 20 3d 20 2a 70 70 3b 0a 20 20 20 20   pUp = *pp;.    
14c60 69 66 28 20 73 74 72 63 6d 70 28 70 55 70 2d 3e  if( strcmp(pUp->
14c70 7a 4d 61 73 6b 2c 20 7a 4d 61 73 6b 29 3d 3d 30  zMask, zMask)==0
14c80 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 20 3d 20   ){.      *pp = 
14c90 70 55 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  pUp->pNext;.    
14ca0 20 20 70 55 70 2d 3e 70 4e 65 78 74 20 3d 20 70    pUp->pNext = p
14cb0 49 74 65 72 2d 3e 70 52 62 75 55 70 64 61 74 65  Iter->pRbuUpdate
14cc0 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70  ;.      pIter->p
14cd0 52 62 75 55 70 64 61 74 65 20 3d 20 70 55 70 3b  RbuUpdate = pUp;
14ce0 0a 20 20 20 20 20 20 2a 70 70 53 74 6d 74 20 3d  .      *ppStmt =
14cf0 20 70 55 70 2d 3e 70 55 70 64 61 74 65 3b 20 0a   pUp->pUpdate; .
14d00 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
14d10 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
14d20 20 20 6e 55 70 2b 2b 3b 0a 20 20 7d 0a 20 20 61    nUp++;.  }.  a
14d30 73 73 65 72 74 28 20 70 55 70 3d 3d 30 20 7c 7c  ssert( pUp==0 ||
14d40 20 70 55 70 2d 3e 70 4e 65 78 74 3d 3d 30 20 29   pUp->pNext==0 )
14d50 3b 0a 0a 20 20 69 66 28 20 6e 55 70 3e 3d 53 51  ;..  if( nUp>=SQ
14d60 4c 49 54 45 5f 52 42 55 5f 55 50 44 41 54 45 5f  LITE_RBU_UPDATE_
14d70 43 41 43 48 45 53 49 5a 45 20 29 7b 0a 20 20 20  CACHESIZE ){.   
14d80 20 66 6f 72 28 70 70 3d 26 70 49 74 65 72 2d 3e   for(pp=&pIter->
14d90 70 52 62 75 55 70 64 61 74 65 3b 20 2a 70 70 21  pRbuUpdate; *pp!
14da0 3d 70 55 70 3b 20 70 70 3d 26 28 28 2a 70 70 29  =pUp; pp=&((*pp)
14db0 2d 3e 70 4e 65 78 74 29 29 3b 0a 20 20 20 20 2a  ->pNext));.    *
14dc0 70 70 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  pp = 0;.    sqli
14dd0 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 55 70  te3_finalize(pUp
14de0 2d 3e 70 55 70 64 61 74 65 29 3b 0a 20 20 20 20  ->pUpdate);.    
14df0 70 55 70 2d 3e 70 55 70 64 61 74 65 20 3d 20 30  pUp->pUpdate = 0
14e00 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
14e10 55 70 20 3d 20 28 52 62 75 55 70 64 61 74 65 53  Up = (RbuUpdateS
14e20 74 6d 74 2a 29 72 62 75 4d 61 6c 6c 6f 63 28 70  tmt*)rbuMalloc(p
14e30 2c 20 73 69 7a 65 6f 66 28 52 62 75 55 70 64 61  , sizeof(RbuUpda
14e40 74 65 53 74 6d 74 29 2b 70 49 74 65 72 2d 3e 6e  teStmt)+pIter->n
14e50 54 62 6c 43 6f 6c 2b 31 29 3b 0a 20 20 7d 0a 0a  TblCol+1);.  }..
14e60 20 20 69 66 28 20 70 55 70 20 29 7b 0a 20 20 20    if( pUp ){.   
14e70 20 63 68 61 72 20 2a 7a 57 68 65 72 65 20 3d 20   char *zWhere = 
14e80 72 62 75 4f 62 6a 49 74 65 72 47 65 74 57 68 65  rbuObjIterGetWhe
14e90 72 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  re(p, pIter);.  
14ea0 20 20 63 68 61 72 20 2a 7a 53 65 74 20 3d 20 72    char *zSet = r
14eb0 62 75 4f 62 6a 49 74 65 72 47 65 74 53 65 74 6c  buObjIterGetSetl
14ec0 69 73 74 28 70 2c 20 70 49 74 65 72 2c 20 7a 4d  ist(p, pIter, zM
14ed0 61 73 6b 29 3b 0a 20 20 20 20 63 68 61 72 20 2a  ask);.    char *
14ee0 7a 55 70 64 61 74 65 20 3d 20 30 3b 0a 0a 20 20  zUpdate = 0;..  
14ef0 20 20 70 55 70 2d 3e 7a 4d 61 73 6b 20 3d 20 28    pUp->zMask = (
14f00 63 68 61 72 2a 29 26 70 55 70 5b 31 5d 3b 0a 20  char*)&pUp[1];. 
14f10 20 20 20 6d 65 6d 63 70 79 28 70 55 70 2d 3e 7a     memcpy(pUp->z
14f20 4d 61 73 6b 2c 20 7a 4d 61 73 6b 2c 20 70 49 74  Mask, zMask, pIt
14f30 65 72 2d 3e 6e 54 62 6c 43 6f 6c 29 3b 0a 20 20  er->nTblCol);.  
14f40 20 20 70 55 70 2d 3e 70 4e 65 78 74 20 3d 20 70    pUp->pNext = p
14f50 49 74 65 72 2d 3e 70 52 62 75 55 70 64 61 74 65  Iter->pRbuUpdate
14f60 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70 52 62  ;.    pIter->pRb
14f70 75 55 70 64 61 74 65 20 3d 20 70 55 70 3b 0a 0a  uUpdate = pUp;..
14f80 20 20 20 20 69 66 28 20 7a 53 65 74 20 29 7b 0a      if( zSet ){.
14f90 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
14fa0 20 2a 7a 50 72 65 66 69 78 20 3d 20 22 22 3b 0a   *zPrefix = "";.
14fb0 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72  .      if( pIter
14fc0 2d 3e 65 54 79 70 65 21 3d 52 42 55 5f 50 4b 5f  ->eType!=RBU_PK_
14fd0 56 54 41 42 20 29 20 7a 50 72 65 66 69 78 20 3d  VTAB ) zPrefix =
14fe0 20 22 72 62 75 5f 69 6d 70 5f 22 3b 0a 20 20 20   "rbu_imp_";.   
14ff0 20 20 20 7a 55 70 64 61 74 65 20 3d 20 73 71 6c     zUpdate = sql
15000 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 55 50  ite3_mprintf("UP
15010 44 41 54 45 20 5c 22 25 73 25 77 5c 22 20 53 45  DATE \"%s%w\" SE
15020 54 20 25 73 20 57 48 45 52 45 20 25 73 22 2c 20  T %s WHERE %s", 
15030 0a 20 20 20 20 20 20 20 20 20 20 7a 50 72 65 66  .          zPref
15040 69 78 2c 20 70 49 74 65 72 2d 3e 7a 54 62 6c 2c  ix, pIter->zTbl,
15050 20 7a 53 65 74 2c 20 7a 57 68 65 72 65 0a 20 20   zSet, zWhere.  
15060 20 20 20 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e      );.      p->
15070 72 63 20 3d 20 70 72 65 70 61 72 65 46 72 65 65  rc = prepareFree
15080 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28  AndCollectError(
15090 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 64 62  .          p->db
150a0 4d 61 69 6e 2c 20 26 70 55 70 2d 3e 70 55 70 64  Main, &pUp->pUpd
150b0 61 74 65 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67  ate, &p->zErrmsg
150c0 2c 20 7a 55 70 64 61 74 65 0a 20 20 20 20 20 20  , zUpdate.      
150d0 29 3b 0a 20 20 20 20 20 20 2a 70 70 53 74 6d 74  );.      *ppStmt
150e0 20 3d 20 70 55 70 2d 3e 70 55 70 64 61 74 65 3b   = pUp->pUpdate;
150f0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
15100 65 33 5f 66 72 65 65 28 7a 57 68 65 72 65 29 3b  e3_free(zWhere);
15110 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
15120 65 28 7a 53 65 74 29 3b 0a 20 20 7d 0a 0a 20 20  e(zSet);.  }..  
15130 72 65 74 75 72 6e 20 70 2d 3e 72 63 3b 0a 7d 0a  return p->rc;.}.
15140 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 20  .static sqlite3 
15150 2a 72 62 75 4f 70 65 6e 44 62 68 61 6e 64 6c 65  *rbuOpenDbhandle
15160 28 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20 2a  (.  sqlite3rbu *
15170 70 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  p, .  const char
15180 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 69 6e 74 20   *zName, .  int 
15190 62 55 73 65 56 66 73 0a 29 7b 0a 20 20 73 71 6c  bUseVfs.){.  sql
151a0 69 74 65 33 20 2a 64 62 20 3d 20 30 3b 0a 20 20  ite3 *db = 0;.  
151b0 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
151c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 6f 6e 73  E_OK ){.    cons
151d0 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 53 51  t int flags = SQ
151e0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
151f0 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ITE|SQLITE_OPEN_
15200 43 52 45 41 54 45 7c 53 51 4c 49 54 45 5f 4f 50  CREATE|SQLITE_OP
15210 45 4e 5f 55 52 49 3b 0a 20 20 20 20 70 2d 3e 72  EN_URI;.    p->r
15220 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  c = sqlite3_open
15230 5f 76 32 28 7a 4e 61 6d 65 2c 20 26 64 62 2c 20  _v2(zName, &db, 
15240 66 6c 61 67 73 2c 20 62 55 73 65 56 66 73 20 3f  flags, bUseVfs ?
15250 20 70 2d 3e 7a 56 66 73 4e 61 6d 65 20 3a 20 30   p->zVfsName : 0
15260 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  );.    if( p->rc
15270 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 7a 45 72   ){.      p->zEr
15280 72 6d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  rmsg = sqlite3_m
15290 70 72 69 6e 74 66 28 22 25 73 22 2c 20 73 71 6c  printf("%s", sql
152a0 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29  ite3_errmsg(db))
152b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
152c0 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20 20 20 20  close(db);.     
152d0 20 64 62 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20   db = 0;.    }. 
152e0 20 7d 0a 20 20 72 65 74 75 72 6e 20 64 62 3b 0a   }.  return db;.
152f0 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e  }../*.** Free an
15300 20 52 62 75 53 74 61 74 65 20 6f 62 6a 65 63 74   RbuState object
15310 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 72 62   allocated by rb
15320 75 4c 6f 61 64 53 74 61 74 65 28 29 2e 0a 2a 2f  uLoadState()..*/
15330 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75  .static void rbu
15340 46 72 65 65 53 74 61 74 65 28 52 62 75 53 74 61  FreeState(RbuSta
15350 74 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20  te *p){.  if( p 
15360 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
15370 72 65 65 28 70 2d 3e 7a 54 62 6c 29 3b 0a 20 20  ree(p->zTbl);.  
15380 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
15390 2d 3e 7a 44 61 74 61 54 62 6c 29 3b 0a 20 20 20  ->zDataTbl);.   
153a0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
153b0 3e 7a 49 64 78 29 3b 0a 20 20 20 20 73 71 6c 69  >zIdx);.    sqli
153c0 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d  te3_free(p);.  }
153d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
153e0 74 65 20 61 6e 20 52 62 75 53 74 61 74 65 20 6f  te an RbuState o
153f0 62 6a 65 63 74 20 61 6e 64 20 6c 6f 61 64 20 74  bject and load t
15400 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
15410 68 65 20 72 62 75 5f 73 74 61 74 65 20 0a 2a 2a  he rbu_state .**
15420 20 74 61 62 6c 65 20 69 6e 74 6f 20 69 74 2e 20   table into it. 
15430 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
15440 20 74 6f 20 74 68 65 20 6e 65 77 20 6f 62 6a 65   to the new obje
15450 63 74 2e 20 49 74 20 69 73 20 74 68 65 20 0a 2a  ct. It is the .*
15460 2a 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  * responsibility
15470 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74   of the caller t
15480 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65  o eventually fre
15490 65 20 74 68 65 20 6f 62 6a 65 63 74 20 75 73 69  e the object usi
154a0 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66 72  ng.** sqlite3_fr
154b0 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ee()..**.** If a
154c0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
154d0 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 63  leave an error c
154e0 6f 64 65 20 61 6e 64 20 6d 65 73 73 61 67 65 20  ode and message 
154f0 69 6e 20 74 68 65 20 72 62 75 20 68 61 6e 64 6c  in the rbu handl
15500 65 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e 20  e.** and return 
15510 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  NULL..*/.static 
15520 52 62 75 53 74 61 74 65 20 2a 72 62 75 4c 6f 61  RbuState *rbuLoa
15530 64 53 74 61 74 65 28 73 71 6c 69 74 65 33 72 62  dState(sqlite3rb
15540 75 20 2a 70 29 7b 0a 20 20 52 62 75 53 74 61 74  u *p){.  RbuStat
15550 65 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 73  e *pRet = 0;.  s
15560 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
15570 6d 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  mt = 0;.  int rc
15580 3b 0a 20 20 69 6e 74 20 72 63 32 3b 0a 0a 20 20  ;.  int rc2;..  
15590 70 52 65 74 20 3d 20 28 52 62 75 53 74 61 74 65  pRet = (RbuState
155a0 2a 29 72 62 75 4d 61 6c 6c 6f 63 28 70 2c 20 73  *)rbuMalloc(p, s
155b0 69 7a 65 6f 66 28 52 62 75 53 74 61 74 65 29 29  izeof(RbuState))
155c0 3b 0a 20 20 69 66 28 20 70 52 65 74 3d 3d 30 20  ;.  if( pRet==0 
155d0 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 72  ) return 0;..  r
155e0 63 20 3d 20 70 72 65 70 61 72 65 46 72 65 65 41  c = prepareFreeA
155f0 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70  ndCollectError(p
15600 2d 3e 64 62 52 62 75 2c 20 26 70 53 74 6d 74 2c  ->dbRbu, &pStmt,
15610 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 20 0a 20   &p->zErrmsg, . 
15620 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72       sqlite3_mpr
15630 69 6e 74 66 28 22 53 45 4c 45 43 54 20 6b 2c 20  intf("SELECT k, 
15640 76 20 46 52 4f 4d 20 25 73 2e 72 62 75 5f 73 74  v FROM %s.rbu_st
15650 61 74 65 22 2c 20 70 2d 3e 7a 53 74 61 74 65 44  ate", p->zStateD
15660 62 29 0a 20 20 29 3b 0a 20 20 77 68 69 6c 65 28  b).  );.  while(
15670 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
15680 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71  & SQLITE_ROW==sq
15690 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
156a0 29 20 29 7b 0a 20 20 20 20 73 77 69 74 63 68 28  ) ){.    switch(
156b0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
156c0 69 6e 74 28 70 53 74 6d 74 2c 20 30 29 20 29 7b  int(pStmt, 0) ){
156d0 0a 20 20 20 20 20 20 63 61 73 65 20 52 42 55 5f  .      case RBU_
156e0 53 54 41 54 45 5f 53 54 41 47 45 3a 0a 20 20 20  STATE_STAGE:.   
156f0 20 20 20 20 20 70 52 65 74 2d 3e 65 53 74 61 67       pRet->eStag
15700 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  e = sqlite3_colu
15710 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 31 29  mn_int(pStmt, 1)
15720 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 52  ;.        if( pR
15730 65 74 2d 3e 65 53 74 61 67 65 21 3d 52 42 55 5f  et->eStage!=RBU_
15740 53 54 41 47 45 5f 4f 41 4c 0a 20 20 20 20 20 20  STAGE_OAL.      
15750 20 20 20 26 26 20 70 52 65 74 2d 3e 65 53 74 61     && pRet->eSta
15760 67 65 21 3d 52 42 55 5f 53 54 41 47 45 5f 4d 4f  ge!=RBU_STAGE_MO
15770 56 45 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  VE.         && p
15780 52 65 74 2d 3e 65 53 74 61 67 65 21 3d 52 42 55  Ret->eStage!=RBU
15790 5f 53 54 41 47 45 5f 43 4b 50 54 0a 20 20 20 20  _STAGE_CKPT.    
157a0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
157b0 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
157c0 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20  CORRUPT;.       
157d0 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b   }.        break
157e0 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20 52 42  ;..      case RB
157f0 55 5f 53 54 41 54 45 5f 54 42 4c 3a 0a 20 20 20  U_STATE_TBL:.   
15800 20 20 20 20 20 70 52 65 74 2d 3e 7a 54 62 6c 20       pRet->zTbl 
15810 3d 20 72 62 75 53 74 72 6e 64 75 70 28 28 63 68  = rbuStrndup((ch
15820 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
15830 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31  mn_text(pStmt, 1
15840 29 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20  ), &rc);.       
15850 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 63   break;..      c
15860 61 73 65 20 52 42 55 5f 53 54 41 54 45 5f 49 44  ase RBU_STATE_ID
15870 58 3a 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d  X:.        pRet-
15880 3e 7a 49 64 78 20 3d 20 72 62 75 53 74 72 6e 64  >zIdx = rbuStrnd
15890 75 70 28 28 63 68 61 72 2a 29 73 71 6c 69 74 65  up((char*)sqlite
158a0 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
158b0 74 6d 74 2c 20 31 29 2c 20 26 72 63 29 3b 0a 20  tmt, 1), &rc);. 
158c0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20         break;.. 
158d0 20 20 20 20 20 63 61 73 65 20 52 42 55 5f 53 54       case RBU_ST
158e0 41 54 45 5f 52 4f 57 3a 0a 20 20 20 20 20 20 20  ATE_ROW:.       
158f0 20 70 52 65 74 2d 3e 6e 52 6f 77 20 3d 20 73 71   pRet->nRow = sq
15900 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
15910 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20  (pStmt, 1);.    
15920 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
15930 20 20 63 61 73 65 20 52 42 55 5f 53 54 41 54 45    case RBU_STATE
15940 5f 50 52 4f 47 52 45 53 53 3a 0a 20 20 20 20 20  _PROGRESS:.     
15950 20 20 20 70 52 65 74 2d 3e 6e 50 72 6f 67 72 65     pRet->nProgre
15960 73 73 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ss = sqlite3_col
15970 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c  umn_int64(pStmt,
15980 20 31 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65   1);.        bre
15990 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20  ak;..      case 
159a0 52 42 55 5f 53 54 41 54 45 5f 43 4b 50 54 3a 0a  RBU_STATE_CKPT:.
159b0 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e 69 57          pRet->iW
159c0 61 6c 43 6b 73 75 6d 20 3d 20 73 71 6c 69 74 65  alCksum = sqlite
159d0 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70  3_column_int64(p
159e0 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  Stmt, 1);.      
159f0 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20    break;..      
15a00 63 61 73 65 20 52 42 55 5f 53 54 41 54 45 5f 43  case RBU_STATE_C
15a10 4f 4f 4b 49 45 3a 0a 20 20 20 20 20 20 20 20 70  OOKIE:.        p
15a20 52 65 74 2d 3e 69 43 6f 6f 6b 69 65 20 3d 20 28  Ret->iCookie = (
15a30 75 33 32 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  u32)sqlite3_colu
15a40 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20  mn_int64(pStmt, 
15a50 31 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  1);.        brea
15a60 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20 52  k;..      case R
15a70 42 55 5f 53 54 41 54 45 5f 4f 41 4c 53 5a 3a 0a  BU_STATE_OALSZ:.
15a80 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e 69 4f          pRet->iO
15a90 61 6c 53 7a 20 3d 20 28 75 33 32 29 73 71 6c 69  alSz = (u32)sqli
15aa0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34  te3_column_int64
15ab0 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20  (pStmt, 1);.    
15ac0 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
15ad0 20 20 63 61 73 65 20 52 42 55 5f 53 54 41 54 45    case RBU_STATE
15ae0 5f 50 48 41 53 45 4f 4e 45 53 54 45 50 3a 0a 20  _PHASEONESTEP:. 
15af0 20 20 20 20 20 20 20 70 52 65 74 2d 3e 6e 50 68         pRet->nPh
15b00 61 73 65 4f 6e 65 53 74 65 70 20 3d 20 73 71 6c  aseOneStep = sql
15b10 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36  ite3_column_int6
15b20 34 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20  4(pStmt, 1);.   
15b30 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
15b40 20 20 20 63 61 73 65 20 52 42 55 5f 53 54 41 54     case RBU_STAT
15b50 45 5f 44 41 54 41 54 42 4c 3a 0a 20 20 20 20 20  E_DATATBL:.     
15b60 20 20 20 70 52 65 74 2d 3e 7a 44 61 74 61 54 62     pRet->zDataTb
15b70 6c 20 3d 20 72 62 75 53 74 72 6e 64 75 70 28 28  l = rbuStrndup((
15b80 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
15b90 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
15ba0 20 31 29 2c 20 26 72 63 29 3b 0a 20 20 20 20 20   1), &rc);.     
15bb0 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20     break;..     
15bc0 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
15bd0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
15be0 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20 62  RRUPT;.        b
15bf0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
15c00 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f    rc2 = sqlite3_
15c10 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
15c20 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
15c30 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63 32 3b  E_OK ) rc = rc2;
15c40 0a 0a 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a  ..  p->rc = rc;.
15c50 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d    return pRet;.}
15c60 0a 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68  .../*.** Open th
15c70 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
15c80 65 20 61 6e 64 20 61 74 74 61 63 68 20 74 68 65  e and attach the
15c90 20 52 42 55 20 64 61 74 61 62 61 73 65 20 61 73   RBU database as
15ca0 20 22 72 62 75 22 2e 20 49 66 20 61 6e 0a 2a 2a   "rbu". If an.**
15cb0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c   error occurs, l
15cc0 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 63 6f  eave an error co
15cd0 64 65 20 61 6e 64 20 6d 65 73 73 61 67 65 20 69  de and message i
15ce0 6e 20 74 68 65 20 52 42 55 20 68 61 6e 64 6c 65  n the RBU handle
15cf0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
15d00 20 72 62 75 4f 70 65 6e 44 61 74 61 62 61 73 65   rbuOpenDatabase
15d10 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20  (sqlite3rbu *p, 
15d20 69 6e 74 20 2a 70 62 52 65 74 72 79 29 7b 0a 20  int *pbRetry){. 
15d30 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 20 7c   assert( p->rc |
15d40 7c 20 28 70 2d 3e 64 62 4d 61 69 6e 3d 3d 30 20  | (p->dbMain==0 
15d50 26 26 20 70 2d 3e 64 62 52 62 75 3d 3d 30 29 20  && p->dbRbu==0) 
15d60 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
15d70 72 63 20 7c 7c 20 72 62 75 49 73 56 61 63 75 75  rc || rbuIsVacuu
15d80 6d 28 70 29 20 7c 7c 20 70 2d 3e 7a 54 61 72 67  m(p) || p->zTarg
15d90 65 74 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 4f  et!=0 );..  /* O
15da0 70 65 6e 20 74 68 65 20 52 42 55 20 64 61 74 61  pen the RBU data
15db0 62 61 73 65 20 2a 2f 0a 20 20 70 2d 3e 64 62 52  base */.  p->dbR
15dc0 62 75 20 3d 20 72 62 75 4f 70 65 6e 44 62 68 61  bu = rbuOpenDbha
15dd0 6e 64 6c 65 28 70 2c 20 70 2d 3e 7a 52 62 75 2c  ndle(p, p->zRbu,
15de0 20 31 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72   1);..  if( p->r
15df0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
15e00 72 62 75 49 73 56 61 63 75 75 6d 28 70 29 20 29  rbuIsVacuum(p) )
15e10 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  {.    sqlite3_fi
15e20 6c 65 5f 63 6f 6e 74 72 6f 6c 28 70 2d 3e 64 62  le_control(p->db
15e30 52 62 75 2c 20 22 6d 61 69 6e 22 2c 20 53 51 4c  Rbu, "main", SQL
15e40 49 54 45 5f 46 43 4e 54 4c 5f 52 42 55 43 4e 54  ITE_FCNTL_RBUCNT
15e50 2c 20 28 76 6f 69 64 2a 29 70 29 3b 0a 20 20 20  , (void*)p);.   
15e60 20 69 66 28 20 70 2d 3e 7a 53 74 61 74 65 3d 3d   if( p->zState==
15e70 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  0 ){.      const
15e80 20 63 68 61 72 20 2a 7a 46 69 6c 65 20 3d 20 73   char *zFile = s
15e90 71 6c 69 74 65 33 5f 64 62 5f 66 69 6c 65 6e 61  qlite3_db_filena
15ea0 6d 65 28 70 2d 3e 64 62 52 62 75 2c 20 22 6d 61  me(p->dbRbu, "ma
15eb0 69 6e 22 29 3b 0a 20 20 20 20 20 20 70 2d 3e 7a  in");.      p->z
15ec0 53 74 61 74 65 20 3d 20 72 62 75 4d 50 72 69 6e  State = rbuMPrin
15ed0 74 66 28 70 2c 20 22 66 69 6c 65 3a 2f 2f 25 73  tf(p, "file://%s
15ee0 2d 76 61 63 75 75 6d 3f 6d 6f 64 65 6f 66 3d 25  -vacuum?modeof=%
15ef0 73 22 2c 20 7a 46 69 6c 65 2c 20 7a 46 69 6c 65  s", zFile, zFile
15f00 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
15f10 2f 2a 20 49 66 20 75 73 69 6e 67 20 73 65 70 61  /* If using sepa
15f20 72 61 74 65 20 52 42 55 20 61 6e 64 20 73 74 61  rate RBU and sta
15f30 74 65 20 64 61 74 61 62 61 73 65 73 2c 20 61 74  te databases, at
15f40 74 61 63 68 20 74 68 65 20 73 74 61 74 65 20 64  tach the state d
15f50 61 74 61 62 61 73 65 20 74 6f 0a 20 20 2a 2a 20  atabase to.  ** 
15f60 74 68 65 20 52 42 55 20 64 62 20 68 61 6e 64 6c  the RBU db handl
15f70 65 20 6e 6f 77 2e 20 20 2a 2f 0a 20 20 69 66 28  e now.  */.  if(
15f80 20 70 2d 3e 7a 53 74 61 74 65 20 29 7b 0a 20 20   p->zState ){.  
15f90 20 20 72 62 75 4d 50 72 69 6e 74 66 45 78 65 63    rbuMPrintfExec
15fa0 28 70 2c 20 70 2d 3e 64 62 52 62 75 2c 20 22 41  (p, p->dbRbu, "A
15fb0 54 54 41 43 48 20 25 51 20 41 53 20 73 74 61 74  TTACH %Q AS stat
15fc0 22 2c 20 70 2d 3e 7a 53 74 61 74 65 29 3b 0a 20  ", p->zState);. 
15fd0 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e 7a 53 74     memcpy(p->zSt
15fe0 61 74 65 44 62 2c 20 22 73 74 61 74 22 2c 20 34  ateDb, "stat", 4
15ff0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
16000 6d 65 6d 63 70 79 28 70 2d 3e 7a 53 74 61 74 65  memcpy(p->zState
16010 44 62 2c 20 22 6d 61 69 6e 22 2c 20 34 29 3b 0a  Db, "main", 4);.
16020 20 20 7d 0a 0a 23 69 66 20 30 0a 20 20 69 66 28    }..#if 0.  if(
16030 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
16040 4b 20 26 26 20 72 62 75 49 73 56 61 63 75 75 6d  K && rbuIsVacuum
16050 28 70 29 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63  (p) ){.    p->rc
16060 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28   = sqlite3_exec(
16070 70 2d 3e 64 62 52 62 75 2c 20 22 42 45 47 49 4e  p->dbRbu, "BEGIN
16080 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  ", 0, 0, 0);.  }
16090 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
160a0 20 69 74 20 68 61 73 20 6e 6f 74 20 61 6c 72 65   it has not alre
160b0 61 64 79 20 62 65 65 6e 20 63 72 65 61 74 65 64  ady been created
160c0 2c 20 63 72 65 61 74 65 20 74 68 65 20 72 62 75  , create the rbu
160d0 5f 73 74 61 74 65 20 74 61 62 6c 65 20 2a 2f 0a  _state table */.
160e0 20 20 72 62 75 4d 50 72 69 6e 74 66 45 78 65 63    rbuMPrintfExec
160f0 28 70 2c 20 70 2d 3e 64 62 52 62 75 2c 20 52 42  (p, p->dbRbu, RB
16100 55 5f 43 52 45 41 54 45 5f 53 54 41 54 45 2c 20  U_CREATE_STATE, 
16110 70 2d 3e 7a 53 74 61 74 65 44 62 29 3b 0a 0a 23  p->zStateDb);..#
16120 69 66 20 30 0a 20 20 69 66 28 20 72 62 75 49 73  if 0.  if( rbuIs
16130 56 61 63 75 75 6d 28 70 29 20 29 7b 0a 20 20 20  Vacuum(p) ){.   
16140 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
16150 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
16160 6e 74 20 72 63 32 3b 0a 20 20 20 20 20 20 69 6e  nt rc2;.      in
16170 74 20 62 4f 6b 20 3d 20 30 3b 0a 20 20 20 20 20  t bOk = 0;.     
16180 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
16190 43 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  Cnt = 0;.      p
161a0 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65 41 6e  ->rc = prepareAn
161b0 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d  dCollectError(p-
161c0 3e 64 62 52 62 75 2c 20 26 70 43 6e 74 2c 20 26  >dbRbu, &pCnt, &
161d0 70 2d 3e 7a 45 72 72 6d 73 67 2c 0a 20 20 20 20  p->zErrmsg,.    
161e0 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 63 6f        "SELECT co
161f0 75 6e 74 28 2a 29 20 46 52 4f 4d 20 73 74 61 74  unt(*) FROM stat
16200 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 0a  .sqlite_master".
16210 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69        );.      i
16220 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
16230 5f 4f 4b 20 0a 20 20 20 20 20 20 20 26 26 20 73  _OK .       && s
16240 71 6c 69 74 65 33 5f 73 74 65 70 28 70 43 6e 74  qlite3_step(pCnt
16250 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 0a 20 20  )==SQLITE_ROW.  
16260 20 20 20 20 20 26 26 20 31 3d 3d 73 71 6c 69 74       && 1==sqlit
16270 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 43  e3_column_int(pC
16280 6e 74 2c 20 30 29 0a 20 20 20 20 20 20 29 7b 0a  nt, 0).      ){.
16290 20 20 20 20 20 20 20 20 62 4f 6b 20 3d 20 31 3b          bOk = 1;
162a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
162b0 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e  c2 = sqlite3_fin
162c0 61 6c 69 7a 65 28 70 43 6e 74 29 3b 0a 20 20 20  alize(pCnt);.   
162d0 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
162e0 4c 49 54 45 5f 4f 4b 20 29 20 70 2d 3e 72 63 20  LITE_OK ) p->rc 
162f0 3d 20 72 63 32 3b 0a 0a 20 20 20 20 20 20 69 66  = rc2;..      if
16300 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
16310 4f 4b 20 26 26 20 62 4f 6b 3d 3d 30 20 29 7b 0a  OK && bOk==0 ){.
16320 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
16330 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
16340 20 20 20 20 20 20 70 2d 3e 7a 45 72 72 6d 73 67        p->zErrmsg
16350 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
16360 74 66 28 22 69 6e 76 61 6c 69 64 20 73 74 61 74  tf("invalid stat
16370 65 20 64 61 74 61 62 61 73 65 22 29 3b 0a 20 20  e database");.  
16380 20 20 20 20 7d 0a 20 20 20 20 0a 20 20 20 20 20      }.    .     
16390 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
163a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
163b0 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33   p->rc = sqlite3
163c0 5f 65 78 65 63 28 70 2d 3e 64 62 52 62 75 2c 20  _exec(p->dbRbu, 
163d0 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 2c 20  "COMMIT", 0, 0, 
163e0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
163f0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
16400 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
16410 45 5f 4f 4b 20 26 26 20 72 62 75 49 73 56 61 63  E_OK && rbuIsVac
16420 75 75 6d 28 70 29 20 29 7b 0a 20 20 20 20 69 6e  uum(p) ){.    in
16430 74 20 62 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20  t bOpen = 0;.   
16440 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 70 2d 3e   int rc;.    p->
16450 6e 52 62 75 20 3d 20 30 3b 0a 20 20 20 20 70 2d  nRbu = 0;.    p-
16460 3e 70 52 62 75 46 64 20 3d 20 30 3b 0a 20 20 20  >pRbuFd = 0;.   
16470 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69   rc = sqlite3_fi
16480 6c 65 5f 63 6f 6e 74 72 6f 6c 28 70 2d 3e 64 62  le_control(p->db
16490 52 62 75 2c 20 22 6d 61 69 6e 22 2c 20 53 51 4c  Rbu, "main", SQL
164a0 49 54 45 5f 46 43 4e 54 4c 5f 52 42 55 43 4e 54  ITE_FCNTL_RBUCNT
164b0 2c 20 28 76 6f 69 64 2a 29 70 29 3b 0a 20 20 20  , (void*)p);.   
164c0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
164d0 4e 4f 54 46 4f 55 4e 44 20 29 20 70 2d 3e 72 63  NOTFOUND ) p->rc
164e0 20 3d 20 72 63 3b 0a 20 20 20 20 69 66 28 20 70   = rc;.    if( p
164f0 2d 3e 65 53 74 61 67 65 3e 3d 52 42 55 5f 53 54  ->eStage>=RBU_ST
16500 41 47 45 5f 4d 4f 56 45 20 29 7b 0a 20 20 20 20  AGE_MOVE ){.    
16510 20 20 62 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20    bOpen = 1;.   
16520 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 52 62   }else{.      Rb
16530 75 53 74 61 74 65 20 2a 70 53 74 61 74 65 20 3d  uState *pState =
16540 20 72 62 75 4c 6f 61 64 53 74 61 74 65 28 70 29   rbuLoadState(p)
16550 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 74 61  ;.      if( pSta
16560 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 62 4f  te ){.        bO
16570 70 65 6e 20 3d 20 28 70 53 74 61 74 65 2d 3e 65  pen = (pState->e
16580 53 74 61 67 65 3e 3d 52 42 55 5f 53 54 41 47 45  Stage>=RBU_STAGE
16590 5f 4d 4f 56 45 29 3b 0a 20 20 20 20 20 20 20 20  _MOVE);.        
165a0 72 62 75 46 72 65 65 53 74 61 74 65 28 70 53 74  rbuFreeState(pSt
165b0 61 74 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ate);.      }.  
165c0 20 20 7d 0a 20 20 20 20 69 66 28 20 62 4f 70 65    }.    if( bOpe
165d0 6e 20 29 20 70 2d 3e 64 62 4d 61 69 6e 20 3d 20  n ) p->dbMain = 
165e0 72 62 75 4f 70 65 6e 44 62 68 61 6e 64 6c 65 28  rbuOpenDbhandle(
165f0 70 2c 20 70 2d 3e 7a 52 62 75 2c 20 70 2d 3e 6e  p, p->zRbu, p->n
16600 52 62 75 3c 3d 31 29 3b 0a 20 20 7d 0a 0a 20 20  Rbu<=1);.  }..  
16610 70 2d 3e 65 53 74 61 67 65 20 3d 20 30 3b 0a 20  p->eStage = 0;. 
16620 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
16630 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 64 62 4d 61  TE_OK && p->dbMa
16640 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  in==0 ){.    if(
16650 20 21 72 62 75 49 73 56 61 63 75 75 6d 28 70 29   !rbuIsVacuum(p)
16660 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 64 62 4d   ){.      p->dbM
16670 61 69 6e 20 3d 20 72 62 75 4f 70 65 6e 44 62 68  ain = rbuOpenDbh
16680 61 6e 64 6c 65 28 70 2c 20 70 2d 3e 7a 54 61 72  andle(p, p->zTar
16690 67 65 74 2c 20 31 29 3b 0a 20 20 20 20 7d 65 6c  get, 1);.    }el
166a0 73 65 20 69 66 28 20 70 2d 3e 70 52 62 75 46 64  se if( p->pRbuFd
166b0 2d 3e 70 57 61 6c 46 64 20 29 7b 0a 20 20 20 20  ->pWalFd ){.    
166c0 20 20 69 66 28 20 70 62 52 65 74 72 79 20 29 7b    if( pbRetry ){
166d0 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 52 62 75  .        p->pRbu
166e0 46 64 2d 3e 62 4e 6f 6c 6f 63 6b 20 3d 20 30 3b  Fd->bNolock = 0;
166f0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
16700 5f 63 6c 6f 73 65 28 70 2d 3e 64 62 52 62 75 29  _close(p->dbRbu)
16710 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
16720 33 5f 63 6c 6f 73 65 28 70 2d 3e 64 62 4d 61 69  3_close(p->dbMai
16730 6e 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 64  n);.        p->d
16740 62 4d 61 69 6e 20 3d 20 30 3b 0a 20 20 20 20 20  bMain = 0;.     
16750 20 20 20 70 2d 3e 64 62 52 62 75 20 3d 20 30 3b     p->dbRbu = 0;
16760 0a 20 20 20 20 20 20 20 20 2a 70 62 52 65 74 72  .        *pbRetr
16770 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72  y = 1;.        r
16780 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
16790 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c       p->rc = SQL
167a0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
167b0 20 70 2d 3e 7a 45 72 72 6d 73 67 20 3d 20 73 71   p->zErrmsg = sq
167c0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 63  lite3_mprintf("c
167d0 61 6e 6e 6f 74 20 76 61 63 75 75 6d 20 77 61 6c  annot vacuum wal
167e0 20 6d 6f 64 65 20 64 61 74 61 62 61 73 65 22 29   mode database")
167f0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
16800 20 20 20 63 68 61 72 20 2a 7a 54 61 72 67 65 74     char *zTarget
16810 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 45  ;.      char *zE
16820 78 74 72 61 20 3d 20 30 3b 0a 20 20 20 20 20 20  xtra = 0;.      
16830 69 66 28 20 73 74 72 6c 65 6e 28 70 2d 3e 7a 52  if( strlen(p->zR
16840 62 75 29 3e 3d 35 20 26 26 20 30 3d 3d 6d 65 6d  bu)>=5 && 0==mem
16850 63 6d 70 28 22 66 69 6c 65 3a 22 2c 20 70 2d 3e  cmp("file:", p->
16860 7a 52 62 75 2c 20 35 29 20 29 7b 0a 20 20 20 20  zRbu, 5) ){.    
16870 20 20 20 20 7a 45 78 74 72 61 20 3d 20 26 70 2d      zExtra = &p-
16880 3e 7a 52 62 75 5b 35 5d 3b 0a 20 20 20 20 20 20  >zRbu[5];.      
16890 20 20 77 68 69 6c 65 28 20 2a 7a 45 78 74 72 61    while( *zExtra
168a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
168b0 28 20 2a 7a 45 78 74 72 61 2b 2b 3d 3d 27 3f 27  ( *zExtra++=='?'
168c0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
168d0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
168e0 2a 7a 45 78 74 72 61 3d 3d 27 5c 30 27 20 29 20  *zExtra=='\0' ) 
168f0 7a 45 78 74 72 61 20 3d 20 30 3b 0a 20 20 20 20  zExtra = 0;.    
16900 20 20 7d 0a 0a 20 20 20 20 20 20 7a 54 61 72 67    }..      zTarg
16910 65 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  et = sqlite3_mpr
16920 69 6e 74 66 28 22 66 69 6c 65 3a 25 73 2d 76 61  intf("file:%s-va
16930 63 74 6d 70 3f 72 62 75 5f 6d 65 6d 6f 72 79 3d  ctmp?rbu_memory=
16940 31 25 73 25 73 22 2c 20 0a 20 20 20 20 20 20 20  1%s%s", .       
16950 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 66 69     sqlite3_db_fi
16960 6c 65 6e 61 6d 65 28 70 2d 3e 64 62 52 62 75 2c  lename(p->dbRbu,
16970 20 22 6d 61 69 6e 22 29 2c 0a 20 20 20 20 20 20   "main"),.      
16980 20 20 20 20 28 7a 45 78 74 72 61 3d 3d 30 20 3f      (zExtra==0 ?
16990 20 22 22 20 3a 20 22 26 22 29 2c 20 28 7a 45 78   "" : "&"), (zEx
169a0 74 72 61 3d 3d 30 20 3f 20 22 22 20 3a 20 7a 45  tra==0 ? "" : zE
169b0 78 74 72 61 29 0a 20 20 20 20 20 20 29 3b 0a 0a  xtra).      );..
169c0 20 20 20 20 20 20 69 66 28 20 7a 54 61 72 67 65        if( zTarge
169d0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
169e0 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  p->rc = SQLITE_N
169f0 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 72 65  OMEM;.        re
16a00 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  turn;.      }.  
16a10 20 20 20 20 70 2d 3e 64 62 4d 61 69 6e 20 3d 20      p->dbMain = 
16a20 72 62 75 4f 70 65 6e 44 62 68 61 6e 64 6c 65 28  rbuOpenDbhandle(
16a30 70 2c 20 7a 54 61 72 67 65 74 2c 20 70 2d 3e 6e  p, zTarget, p->n
16a40 52 62 75 3c 3d 31 29 3b 0a 20 20 20 20 20 20 73  Rbu<=1);.      s
16a50 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 61 72  qlite3_free(zTar
16a60 67 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  get);.    }.  }.
16a70 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
16a80 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
16a90 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63  ->rc = sqlite3_c
16aa0 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70  reate_function(p
16ab0 2d 3e 64 62 4d 61 69 6e 2c 20 0a 20 20 20 20 20  ->dbMain, .     
16ac0 20 20 20 22 72 62 75 5f 74 6d 70 5f 69 6e 73 65     "rbu_tmp_inse
16ad0 72 74 22 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  rt", -1, SQLITE_
16ae0 55 54 46 38 2c 20 28 76 6f 69 64 2a 29 70 2c 20  UTF8, (void*)p, 
16af0 72 62 75 54 6d 70 49 6e 73 65 72 74 46 75 6e 63  rbuTmpInsertFunc
16b00 2c 20 30 2c 20 30 0a 20 20 20 20 29 3b 0a 20 20  , 0, 0.    );.  
16b10 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  }..  if( p->rc==
16b20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16b30 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33   p->rc = sqlite3
16b40 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
16b50 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 0a 20 20 20  (p->dbMain, .   
16b60 20 20 20 20 20 22 72 62 75 5f 66 6f 73 73 69 6c       "rbu_fossil
16b70 5f 64 65 6c 74 61 22 2c 20 32 2c 20 53 51 4c 49  _delta", 2, SQLI
16b80 54 45 5f 55 54 46 38 2c 20 30 2c 20 72 62 75 46  TE_UTF8, 0, rbuF
16b90 6f 73 73 69 6c 44 65 6c 74 61 46 75 6e 63 2c 20  ossilDeltaFunc, 
16ba0 30 2c 20 30 0a 20 20 20 20 29 3b 0a 20 20 7d 0a  0, 0.    );.  }.
16bb0 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
16bc0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
16bd0 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63  ->rc = sqlite3_c
16be0 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70  reate_function(p
16bf0 2d 3e 64 62 52 62 75 2c 20 0a 20 20 20 20 20 20  ->dbRbu, .      
16c00 20 20 22 72 62 75 5f 74 61 72 67 65 74 5f 6e 61    "rbu_target_na
16c10 6d 65 22 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  me", -1, SQLITE_
16c20 55 54 46 38 2c 20 28 76 6f 69 64 2a 29 70 2c 20  UTF8, (void*)p, 
16c30 72 62 75 54 61 72 67 65 74 4e 61 6d 65 46 75 6e  rbuTargetNameFun
16c40 63 2c 20 30 2c 20 30 0a 20 20 20 20 29 3b 0a 20  c, 0, 0.    );. 
16c50 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d   }..  if( p->rc=
16c60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16c70 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65    p->rc = sqlite
16c80 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 70  3_file_control(p
16c90 2d 3e 64 62 4d 61 69 6e 2c 20 22 6d 61 69 6e 22  ->dbMain, "main"
16ca0 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 52  , SQLITE_FCNTL_R
16cb0 42 55 2c 20 28 76 6f 69 64 2a 29 70 29 3b 0a 20  BU, (void*)p);. 
16cc0 20 7d 0a 20 20 72 62 75 4d 50 72 69 6e 74 66 45   }.  rbuMPrintfE
16cd0 78 65 63 28 70 2c 20 70 2d 3e 64 62 4d 61 69 6e  xec(p, p->dbMain
16ce0 2c 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  , "SELECT * FROM
16cf0 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 29   sqlite_master")
16d00 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65  ;..  /* Mark the
16d10 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6a   database file j
16d20 75 73 74 20 6f 70 65 6e 65 64 20 61 73 20 61 6e  ust opened as an
16d30 20 52 42 55 20 74 61 72 67 65 74 20 64 61 74 61   RBU target data
16d40 62 61 73 65 2e 20 49 66 20 0a 20 20 2a 2a 20 74  base. If .  ** t
16d50 68 69 73 20 63 61 6c 6c 20 72 65 74 75 72 6e 73  his call returns
16d60 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44   SQLITE_NOTFOUND
16d70 2c 20 74 68 65 6e 20 74 68 65 20 52 42 55 20 76  , then the RBU v
16d80 66 73 20 69 73 20 6e 6f 74 20 69 6e 20 75 73 65  fs is not in use
16d90 2e 0a 20 20 2a 2a 20 54 68 69 73 20 69 73 20 61  ..  ** This is a
16da0 6e 20 65 72 72 6f 72 2e 20 20 2a 2f 0a 20 20 69  n error.  */.  i
16db0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
16dc0 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63  _OK ){.    p->rc
16dd0 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f   = sqlite3_file_
16de0 63 6f 6e 74 72 6f 6c 28 70 2d 3e 64 62 4d 61 69  control(p->dbMai
16df0 6e 2c 20 22 6d 61 69 6e 22 2c 20 53 51 4c 49 54  n, "main", SQLIT
16e00 45 5f 46 43 4e 54 4c 5f 52 42 55 2c 20 28 76 6f  E_FCNTL_RBU, (vo
16e10 69 64 2a 29 70 29 3b 0a 20 20 7d 0a 0a 20 20 69  id*)p);.  }..  i
16e20 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
16e30 5f 4e 4f 54 46 4f 55 4e 44 20 29 7b 0a 20 20 20  _NOTFOUND ){.   
16e40 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
16e50 45 52 52 4f 52 3b 0a 20 20 20 20 70 2d 3e 7a 45  ERROR;.    p->zE
16e60 72 72 6d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f  rrmsg = sqlite3_
16e70 6d 70 72 69 6e 74 66 28 22 72 62 75 20 76 66 73  mprintf("rbu vfs
16e80 20 6e 6f 74 20 66 6f 75 6e 64 22 29 3b 0a 20 20   not found");.  
16e90 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
16ea0 72 6f 75 74 69 6e 65 20 69 73 20 61 20 63 6f 70  routine is a cop
16eb0 79 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33  y of the sqlite3
16ec0 46 69 6c 65 53 75 66 66 69 78 33 28 29 20 72 6f  FileSuffix3() ro
16ed0 75 74 69 6e 65 20 66 72 6f 6d 20 74 68 65 20 63  utine from the c
16ee0 6f 72 65 2e 0a 2a 2a 20 49 74 20 69 73 20 61 20  ore..** It is a 
16ef0 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73 20 53 51 4c  no-op unless SQL
16f00 49 54 45 5f 45 4e 41 42 4c 45 5f 38 5f 33 5f 4e  ITE_ENABLE_8_3_N
16f10 41 4d 45 53 20 69 73 20 64 65 66 69 6e 65 64 2e  AMES is defined.
16f20 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45  .**.** If SQLITE
16f30 5f 45 4e 41 42 4c 45 5f 38 5f 33 5f 4e 41 4d 45  _ENABLE_8_3_NAME
16f40 53 20 69 73 20 73 65 74 20 61 74 20 63 6f 6d 70  S is set at comp
16f50 69 6c 65 2d 74 69 6d 65 20 61 6e 64 20 69 66 20  ile-time and if 
16f60 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
16f70 66 69 6c 65 6e 61 6d 65 20 69 6e 20 7a 42 61 73  filename in zBas
16f80 65 46 69 6c 65 6e 61 6d 65 20 69 73 20 61 20 55  eFilename is a U
16f90 52 49 20 77 69 74 68 20 74 68 65 20 22 38 5f 33  RI with the "8_3
16fa0 5f 6e 61 6d 65 73 3d 31 22 20 70 61 72 61 6d 65  _names=1" parame
16fb0 74 65 72 20 61 6e 64 0a 2a 2a 20 69 66 20 66 69  ter and.** if fi
16fc0 6c 65 6e 61 6d 65 20 69 6e 20 7a 5b 5d 20 68 61  lename in z[] ha
16fd0 73 20 61 20 73 75 66 66 69 78 20 28 61 2e 6b 2e  s a suffix (a.k.
16fe0 61 2e 20 22 65 78 74 65 6e 73 69 6f 6e 22 29 20  a. "extension") 
16ff0 74 68 61 74 20 69 73 20 6c 6f 6e 67 65 72 20 74  that is longer t
17000 68 61 6e 0a 2a 2a 20 74 68 72 65 65 20 63 68 61  han.** three cha
17010 72 61 63 74 65 72 73 2c 20 74 68 65 6e 20 73 68  racters, then sh
17020 6f 72 74 65 6e 20 74 68 65 20 73 75 66 66 69 78  orten the suffix
17030 20 6f 6e 20 7a 5b 5d 20 74 6f 20 62 65 20 74 68   on z[] to be th
17040 65 20 6c 61 73 74 20 74 68 72 65 65 0a 2a 2a 20  e last three.** 
17050 63 68 61 72 61 63 74 65 72 73 20 6f 66 20 74 68  characters of th
17060 65 20 6f 72 69 67 69 6e 61 6c 20 73 75 66 66 69  e original suffi
17070 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49  x..**.** If SQLI
17080 54 45 5f 45 4e 41 42 4c 45 5f 38 5f 33 5f 4e 41  TE_ENABLE_8_3_NA
17090 4d 45 53 20 69 73 20 73 65 74 20 74 6f 20 32 20  MES is set to 2 
170a0 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2c  at compile-time,
170b0 20 74 68 65 6e 20 61 6c 77 61 79 73 0a 2a 2a 20   then always.** 
170c0 64 6f 20 74 68 65 20 73 75 66 66 69 78 20 73 68  do the suffix sh
170d0 6f 72 74 65 6e 69 6e 67 20 72 65 67 61 72 64 6c  ortening regardl
170e0 65 73 73 20 6f 66 20 55 52 49 20 70 61 72 61 6d  ess of URI param
170f0 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d  eter..**.** Exam
17100 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ples:.**.**     
17110 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20  test.db-journal 
17120 20 20 20 3d 3e 20 20 20 74 65 73 74 2e 6e 61 6c     =>   test.nal
17130 0a 2a 2a 20 20 20 20 20 74 65 73 74 2e 64 62 2d  .**     test.db-
17140 77 61 6c 20 20 20 20 20 20 20 20 3d 3e 20 20 20  wal        =>   
17150 74 65 73 74 2e 77 61 6c 0a 2a 2a 20 20 20 20 20  test.wal.**     
17160 74 65 73 74 2e 64 62 2d 73 68 6d 20 20 20 20 20  test.db-shm     
17170 20 20 20 3d 3e 20 20 20 74 65 73 74 2e 73 68 6d     =>   test.shm
17180 0a 2a 2a 20 20 20 20 20 74 65 73 74 2e 64 62 2d  .**     test.db-
17190 6d 6a 37 66 33 33 31 39 66 61 20 3d 3e 20 20 20  mj7f3319fa =>   
171a0 74 65 73 74 2e 39 66 61 0a 2a 2f 0a 73 74 61 74  test.9fa.*/.stat
171b0 69 63 20 76 6f 69 64 20 72 62 75 46 69 6c 65 53  ic void rbuFileS
171c0 75 66 66 69 78 33 28 63 6f 6e 73 74 20 63 68 61  uffix3(const cha
171d0 72 20 2a 7a 42 61 73 65 2c 20 63 68 61 72 20 2a  r *zBase, char *
171e0 7a 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  z){.#ifdef SQLIT
171f0 45 5f 45 4e 41 42 4c 45 5f 38 5f 33 5f 4e 41 4d  E_ENABLE_8_3_NAM
17200 45 53 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  ES.#if SQLITE_EN
17210 41 42 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53 3c 32  ABLE_8_3_NAMES<2
17220 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 75  .  if( sqlite3_u
17230 72 69 5f 62 6f 6f 6c 65 61 6e 28 7a 42 61 73 65  ri_boolean(zBase
17240 2c 20 22 38 5f 33 5f 6e 61 6d 65 73 22 2c 20 30  , "8_3_names", 0
17250 29 20 29 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20  ) ).#endif.  {. 
17260 20 20 20 69 6e 74 20 69 2c 20 73 7a 3b 0a 20 20     int i, sz;.  
17270 20 20 73 7a 20 3d 20 28 69 6e 74 29 73 74 72 6c    sz = (int)strl
17280 65 6e 28 7a 29 26 30 78 66 66 66 66 66 66 3b 0a  en(z)&0xffffff;.
17290 20 20 20 20 66 6f 72 28 69 3d 73 7a 2d 31 3b 20      for(i=sz-1; 
172a0 69 3e 30 20 26 26 20 7a 5b 69 5d 21 3d 27 2f 27  i>0 && z[i]!='/'
172b0 20 26 26 20 7a 5b 69 5d 21 3d 27 2e 27 3b 20 69   && z[i]!='.'; i
172c0 2d 2d 29 7b 7d 0a 20 20 20 20 69 66 28 20 7a 5b  --){}.    if( z[
172d0 69 5d 3d 3d 27 2e 27 20 26 26 20 73 7a 3e 69 2b  i]=='.' && sz>i+
172e0 34 20 29 20 6d 65 6d 6d 6f 76 65 28 26 7a 5b 69  4 ) memmove(&z[i
172f0 2b 31 5d 2c 20 26 7a 5b 73 7a 2d 33 5d 2c 20 34  +1], &z[sz-3], 4
17300 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a  );.  }.#endif.}.
17310 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
17320 65 20 63 75 72 72 65 6e 74 20 77 61 6c 2d 69 6e  e current wal-in
17330 64 65 78 20 68 65 61 64 65 72 20 63 68 65 63 6b  dex header check
17340 73 75 6d 20 66 6f 72 20 74 68 65 20 74 61 72 67  sum for the targ
17350 65 74 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  et database .** 
17360 61 73 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65  as a 64-bit inte
17370 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  ger..**.** The c
17380 68 65 63 6b 73 75 6d 20 69 73 20 73 74 6f 72 65  hecksum is store
17390 20 69 6e 20 74 68 65 20 66 69 72 73 74 20 70 61   in the first pa
173a0 67 65 20 6f 66 20 78 53 68 6d 4d 61 70 20 6d 65  ge of xShmMap me
173b0 6d 6f 72 79 20 61 73 20 61 6e 20 38 2d 62 79 74  mory as an 8-byt
173c0 65 20 0a 2a 2a 20 62 6c 6f 62 20 73 74 61 72 74  e .** blob start
173d0 69 6e 67 20 61 74 20 62 79 74 65 20 6f 66 66 73  ing at byte offs
173e0 65 74 20 34 30 2e 0a 2a 2f 0a 73 74 61 74 69 63  et 40..*/.static
173f0 20 69 36 34 20 72 62 75 53 68 6d 43 68 65 63 6b   i64 rbuShmCheck
17400 73 75 6d 28 73 71 6c 69 74 65 33 72 62 75 20 2a  sum(sqlite3rbu *
17410 70 29 7b 0a 20 20 69 36 34 20 69 52 65 74 20 3d  p){.  i64 iRet =
17420 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d   0;.  if( p->rc=
17430 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
17440 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
17450 70 44 62 20 3d 20 70 2d 3e 70 54 61 72 67 65 74  pDb = p->pTarget
17460 46 64 2d 3e 70 52 65 61 6c 3b 0a 20 20 20 20 75  Fd->pReal;.    u
17470 33 32 20 76 6f 6c 61 74 69 6c 65 20 2a 70 74 72  32 volatile *ptr
17480 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 44  ;.    p->rc = pD
17490 62 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53 68  b->pMethods->xSh
174a0 6d 4d 61 70 28 70 44 62 2c 20 30 2c 20 33 32 2a  mMap(pDb, 0, 32*
174b0 31 30 32 34 2c 20 30 2c 20 28 76 6f 69 64 20 76  1024, 0, (void v
174c0 6f 6c 61 74 69 6c 65 2a 2a 29 26 70 74 72 29 3b  olatile**)&ptr);
174d0 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  .    if( p->rc==
174e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
174f0 20 20 20 69 52 65 74 20 3d 20 28 28 69 36 34 29     iRet = ((i64)
17500 70 74 72 5b 31 30 5d 20 3c 3c 20 33 32 29 20 2b  ptr[10] << 32) +
17510 20 70 74 72 5b 31 31 5d 3b 0a 20 20 20 20 7d 0a   ptr[11];.    }.
17520 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 52 65    }.  return iRe
17530 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  t;.}../*.** This
17540 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
17550 6c 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 69  led as part of i
17560 6e 69 74 69 61 6c 69 7a 69 6e 67 20 6f 72 20 72  nitializing or r
17570 65 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 6e  einitializing an
17580 0a 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20  .** incremental 
17590 63 68 65 63 6b 70 6f 69 6e 74 2e 20 0a 2a 2a 0a  checkpoint. .**.
175a0 2a 2a 20 49 74 20 70 6f 70 75 6c 61 74 65 73 20  ** It populates 
175b0 74 68 65 20 73 71 6c 69 74 65 33 72 62 75 2e 61  the sqlite3rbu.a
175c0 46 72 61 6d 65 5b 5d 20 61 72 72 61 79 20 77 69  Frame[] array wi
175d0 74 68 20 74 68 65 20 73 65 74 20 6f 66 20 0a 2a  th the set of .*
175e0 2a 20 28 77 61 6c 20 66 72 61 6d 65 20 2d 3e 20  * (wal frame -> 
175f0 64 62 20 70 61 67 65 29 20 63 6f 70 79 20 6f 70  db page) copy op
17600 65 72 61 74 69 6f 6e 73 20 72 65 71 75 69 72 65  erations require
17610 64 20 74 6f 20 63 68 65 63 6b 70 6f 69 6e 74 20  d to checkpoint 
17620 74 68 65 20 0a 2a 2a 20 63 75 72 72 65 6e 74 20  the .** current 
17630 77 61 6c 20 66 69 6c 65 2c 20 61 6e 64 20 6f 62  wal file, and ob
17640 74 61 69 6e 73 20 74 68 65 20 73 65 74 20 6f 66  tains the set of
17650 20 73 68 6d 20 6c 6f 63 6b 73 20 72 65 71 75 69   shm locks requi
17660 72 65 64 20 74 6f 20 73 61 66 65 6c 79 20 0a 2a  red to safely .*
17670 2a 20 70 65 72 66 6f 72 6d 20 74 68 65 20 63 6f  * perform the co
17680 70 79 20 6f 70 65 72 61 74 69 6f 6e 73 20 64 69  py operations di
17690 72 65 63 74 6c 79 20 6f 6e 20 74 68 65 20 66 69  rectly on the fi
176a0 6c 65 2d 73 79 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a  le-system..**.**
176b0 20 49 66 20 61 72 67 75 6d 65 6e 74 20 70 53 74   If argument pSt
176c0 61 74 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  ate is not NULL,
176d0 20 74 68 65 6e 20 74 68 65 20 69 6e 63 72 65 6d   then the increm
176e0 65 6e 74 61 6c 20 63 68 65 63 6b 70 6f 69 6e 74  ental checkpoint
176f0 20 69 73 0a 2a 2a 20 62 65 69 6e 67 20 72 65 73   is.** being res
17700 75 6d 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  umed. In this ca
17710 73 65 2c 20 69 66 20 74 68 65 20 63 68 65 63 6b  se, if the check
17720 73 75 6d 20 6f 66 20 74 68 65 20 77 61 6c 2d 69  sum of the wal-i
17730 6e 64 65 78 2d 68 65 61 64 65 72 0a 2a 2a 20 66  ndex-header.** f
17740 6f 6c 6c 6f 77 69 6e 67 20 72 65 63 6f 76 65 72  ollowing recover
17750 79 20 69 73 20 6e 6f 74 20 74 68 65 20 73 61 6d  y is not the sam
17760 65 20 61 73 20 74 68 65 20 63 68 65 63 6b 73 75  e as the checksu
17770 6d 20 73 61 76 65 64 20 69 6e 20 74 68 65 20 52  m saved in the R
17780 62 75 53 74 61 74 65 0a 2a 2a 20 6f 62 6a 65 63  buState.** objec
17790 74 2c 20 74 68 65 6e 20 74 68 65 20 72 62 75 20  t, then the rbu 
177a0 68 61 6e 64 6c 65 20 69 73 20 73 65 74 20 74 6f  handle is set to
177b0 20 44 4f 4e 45 20 73 74 61 74 65 2e 20 54 68 69   DONE state. Thi
177c0 73 20 6f 63 63 75 72 73 20 69 66 20 73 6f 6d 65  s occurs if some
177d0 0a 2a 2a 20 6f 74 68 65 72 20 63 6c 69 65 6e 74  .** other client
177e0 20 61 70 70 65 6e 64 73 20 61 20 74 72 61 6e 73   appends a trans
177f0 61 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 77 61  action to the wa
17800 6c 20 66 69 6c 65 20 69 6e 20 74 68 65 20 6d 69  l file in the mi
17810 64 64 6c 65 20 6f 66 0a 2a 2a 20 61 6e 20 69 6e  ddle of.** an in
17820 63 72 65 6d 65 6e 74 61 6c 20 63 68 65 63 6b 70  cremental checkp
17830 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  oint..*/.static 
17840 76 6f 69 64 20 72 62 75 53 65 74 75 70 43 68 65  void rbuSetupChe
17850 63 6b 70 6f 69 6e 74 28 73 71 6c 69 74 65 33 72  ckpoint(sqlite3r
17860 62 75 20 2a 70 2c 20 52 62 75 53 74 61 74 65 20  bu *p, RbuState 
17870 2a 70 53 74 61 74 65 29 7b 0a 0a 20 20 2f 2a 20  *pState){..  /* 
17880 49 66 20 70 53 74 61 74 65 20 69 73 20 4e 55 4c  If pState is NUL
17890 4c 2c 20 74 68 65 6e 20 74 68 65 20 77 61 6c 20  L, then the wal 
178a0 66 69 6c 65 20 6d 61 79 20 6e 6f 74 20 68 61 76  file may not hav
178b0 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 61 6e  e been opened an
178c0 64 0a 20 20 2a 2a 20 72 65 63 6f 76 65 72 65 64  d.  ** recovered
178d0 2e 20 52 75 6e 6e 69 6e 67 20 61 20 72 65 61 64  . Running a read
178e0 2d 73 74 61 74 65 6d 65 6e 74 20 68 65 72 65 20  -statement here 
178f0 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 64  to ensure that d
17900 6f 69 6e 67 20 73 6f 0a 20 20 2a 2a 20 64 6f 65  oing so.  ** doe
17910 73 20 6e 6f 74 20 69 6e 74 65 72 66 65 72 65 20  s not interfere 
17920 77 69 74 68 20 74 68 65 20 22 63 61 70 74 75 72  with the "captur
17930 65 22 20 70 72 6f 63 65 73 73 20 62 65 6c 6f 77  e" process below
17940 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 74 61  .  */.  if( pSta
17950 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e  te==0 ){.    p->
17960 65 53 74 61 67 65 20 3d 20 30 3b 0a 20 20 20 20  eStage = 0;.    
17970 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
17980 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d  E_OK ){.      p-
17990 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78  >rc = sqlite3_ex
179a0 65 63 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 53  ec(p->dbMain, "S
179b0 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c  ELECT * FROM sql
179c0 69 74 65 5f 6d 61 73 74 65 72 22 2c 20 30 2c 20  ite_master", 0, 
179d0 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  0, 0);.    }.  }
179e0 0a 0a 20 20 2f 2a 20 41 73 73 75 6d 69 6e 67 20  ..  /* Assuming 
179f0 6e 6f 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63  no error has occ
17a00 75 72 72 65 64 2c 20 72 75 6e 20 61 20 22 72 65  urred, run a "re
17a10 73 74 61 72 74 22 20 63 68 65 63 6b 70 6f 69 6e  start" checkpoin
17a20 74 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20  t with the.  ** 
17a30 73 71 6c 69 74 65 33 72 62 75 2e 65 53 74 61 67  sqlite3rbu.eStag
17a40 65 20 76 61 72 69 61 62 6c 65 20 73 65 74 20 74  e variable set t
17a50 6f 20 43 41 50 54 55 52 45 2e 20 54 68 69 73 20  o CAPTURE. This 
17a60 74 75 72 6e 73 20 6f 6e 20 74 68 65 20 66 6f 6c  turns on the fol
17a70 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 73 70 65 63  lowing.  ** spec
17a80 69 61 6c 20 62 65 68 61 76 69 6f 75 72 20 69 6e  ial behaviour in
17a90 20 74 68 65 20 72 62 75 20 56 46 53 3a 0a 20 20   the rbu VFS:.  
17aa0 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 49 66 20 74  **.  **   * If t
17ab0 68 65 20 65 78 63 6c 75 73 69 76 65 20 73 68 6d  he exclusive shm
17ac0 20 57 52 49 54 45 52 20 6f 72 20 52 45 41 44 30   WRITER or READ0
17ad0 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20   lock cannot be 
17ae0 6f 62 74 61 69 6e 65 64 2c 0a 20 20 2a 2a 20 20  obtained,.  **  
17af0 20 20 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e     the checkpoin
17b00 74 20 66 61 69 6c 73 20 77 69 74 68 20 53 51 4c  t fails with SQL
17b10 49 54 45 5f 42 55 53 59 20 28 6e 6f 72 6d 61 6c  ITE_BUSY (normal
17b20 6c 79 20 53 51 4c 69 74 65 20 77 6f 75 6c 64 0a  ly SQLite would.
17b30 20 20 2a 2a 20 20 20 20 20 70 72 6f 63 65 65 64    **     proceed
17b40 20 77 69 74 68 20 72 75 6e 6e 69 6e 67 20 61 20   with running a 
17b50 70 61 73 73 69 76 65 20 63 68 65 63 6b 70 6f 69  passive checkpoi
17b60 6e 74 20 69 6e 73 74 65 61 64 20 6f 66 20 66 61  nt instead of fa
17b70 69 6c 69 6e 67 29 2e 0a 20 20 2a 2a 0a 20 20 2a  iling)..  **.  *
17b80 2a 20 20 20 2a 20 41 74 74 65 6d 70 74 73 20 74  *   * Attempts t
17b90 6f 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  o read from the 
17ba0 2a 2d 77 61 6c 20 66 69 6c 65 20 6f 72 20 77 72  *-wal file or wr
17bb0 69 74 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  ite to the datab
17bc0 61 73 65 20 66 69 6c 65 0a 20 20 2a 2a 20 20 20  ase file.  **   
17bd0 20 20 64 6f 20 6e 6f 74 20 70 65 72 66 6f 72 6d    do not perform
17be0 20 61 6e 79 20 49 4f 2e 20 49 6e 73 74 65 61 64   any IO. Instead
17bf0 2c 20 74 68 65 20 66 72 61 6d 65 2f 70 61 67 65  , the frame/page
17c00 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 74 68   combinations th
17c10 61 74 0a 20 20 2a 2a 20 20 20 20 20 77 6f 75 6c  at.  **     woul
17c20 64 20 62 65 20 72 65 61 64 2f 77 72 69 74 74 65  d be read/writte
17c30 6e 20 61 72 65 20 72 65 63 6f 72 64 65 64 20 69  n are recorded i
17c40 6e 20 74 68 65 20 73 71 6c 69 74 65 33 72 62 75  n the sqlite3rbu
17c50 2e 61 46 72 61 6d 65 5b 5d 0a 20 20 2a 2a 20 20  .aFrame[].  **  
17c60 20 20 20 61 72 72 61 79 2e 0a 20 20 2a 2a 0a 20     array..  **. 
17c70 20 2a 2a 20 20 20 2a 20 43 61 6c 6c 73 20 74 6f   **   * Calls to
17c80 20 78 53 68 6d 4c 6f 63 6b 28 55 4e 4c 4f 43 4b   xShmLock(UNLOCK
17c90 29 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68 65  ) to release the
17ca0 20 65 78 63 6c 75 73 69 76 65 20 73 68 6d 20 57   exclusive shm W
17cb0 52 49 54 45 52 2c 20 0a 20 20 2a 2a 20 20 20 20  RITER, .  **    
17cc0 20 52 45 41 44 30 20 61 6e 64 20 43 48 45 43 4b   READ0 and CHECK
17cd0 50 4f 49 4e 54 20 6c 6f 63 6b 73 20 74 61 6b 65  POINT locks take
17ce0 6e 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  n as part of the
17cf0 20 63 68 65 63 6b 70 6f 69 6e 74 20 61 72 65 0a   checkpoint are.
17d00 20 20 2a 2a 20 20 20 20 20 6e 6f 2d 6f 70 73 2e    **     no-ops.
17d10 20 54 68 65 73 65 20 6c 6f 63 6b 73 20 77 69 6c   These locks wil
17d20 6c 20 6e 6f 74 20 62 65 20 72 65 6c 65 61 73 65  l not be release
17d30 64 20 75 6e 74 69 6c 20 74 68 65 20 63 6f 6e 6e  d until the conn
17d40 65 63 74 69 6f 6e 0a 20 20 2a 2a 20 20 20 20 20  ection.  **     
17d50 69 73 20 63 6c 6f 73 65 64 2e 0a 20 20 2a 2a 0a  is closed..  **.
17d60 20 20 2a 2a 20 20 20 2a 20 41 74 74 65 6d 70 74    **   * Attempt
17d70 69 6e 67 20 74 6f 20 78 53 79 6e 63 28 29 20 74  ing to xSync() t
17d80 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
17d90 20 63 61 75 73 65 73 20 61 6e 20 53 51 4c 49 54   causes an SQLIT
17da0 45 5f 49 4e 54 45 52 4e 41 4c 20 0a 20 20 2a 2a  E_INTERNAL .  **
17db0 20 20 20 20 20 65 72 72 6f 72 2e 0a 20 20 2a 2a       error..  **
17dc0 0a 20 20 2a 2a 20 41 73 20 61 20 72 65 73 75 6c  .  ** As a resul
17dd0 74 2c 20 75 6e 6c 65 73 73 20 61 6e 20 65 72 72  t, unless an err
17de0 6f 72 20 28 69 2e 65 2e 20 4f 4f 4d 20 6f 72 20  or (i.e. OOM or 
17df0 53 51 4c 49 54 45 5f 42 55 53 59 29 20 6f 63 63  SQLITE_BUSY) occ
17e00 75 72 73 2c 20 74 68 65 0a 20 20 2a 2a 20 63 68  urs, the.  ** ch
17e10 65 63 6b 70 6f 69 6e 74 20 62 65 6c 6f 77 20 66  eckpoint below f
17e20 61 69 6c 73 20 77 69 74 68 20 53 51 4c 49 54 45  ails with SQLITE
17e30 5f 49 4e 54 45 52 4e 41 4c 2c 20 61 6e 64 20 6c  _INTERNAL, and l
17e40 65 61 76 65 73 20 74 68 65 20 61 46 72 61 6d 65  eaves the aFrame
17e50 5b 5d 0a 20 20 2a 2a 20 61 72 72 61 79 20 70 6f  [].  ** array po
17e60 70 75 6c 61 74 65 64 20 77 69 74 68 20 61 20 73  pulated with a s
17e70 65 74 20 6f 66 20 28 66 72 61 6d 65 20 2d 3e 20  et of (frame -> 
17e80 70 61 67 65 29 20 6d 61 70 70 69 6e 67 73 2e 20  page) mappings. 
17e90 42 65 63 61 75 73 65 20 74 68 65 20 0a 20 20 2a  Because the .  *
17ea0 2a 20 57 52 49 54 45 52 2c 20 43 48 45 43 4b 50  * WRITER, CHECKP
17eb0 4f 49 4e 54 20 61 6e 64 20 52 45 41 44 30 20 6c  OINT and READ0 l
17ec0 6f 63 6b 73 20 61 72 65 20 73 74 69 6c 6c 20 68  ocks are still h
17ed0 65 6c 64 2c 20 69 74 20 69 73 20 73 61 66 65 20  eld, it is safe 
17ee0 74 6f 20 63 6f 70 79 20 0a 20 20 2a 2a 20 64 61  to copy .  ** da
17ef0 74 61 20 66 72 6f 6d 20 74 68 65 20 77 61 6c 20  ta from the wal 
17f00 66 69 6c 65 20 69 6e 74 6f 20 74 68 65 20 64 61  file into the da
17f10 74 61 62 61 73 65 20 66 69 6c 65 20 61 63 63 6f  tabase file acco
17f20 72 64 69 6e 67 20 74 6f 20 74 68 65 20 0a 20 20  rding to the .  
17f30 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61  ** contents of a
17f40 46 72 61 6d 65 5b 5d 2e 0a 20 20 2a 2f 0a 20 20  Frame[]..  */.  
17f50 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
17f60 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20  E_OK ){.    int 
17f70 72 63 32 3b 0a 20 20 20 20 70 2d 3e 65 53 74 61  rc2;.    p->eSta
17f80 67 65 20 3d 20 52 42 55 5f 53 54 41 47 45 5f 43  ge = RBU_STAGE_C
17f90 41 50 54 55 52 45 3b 0a 20 20 20 20 72 63 32 20  APTURE;.    rc2 
17fa0 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70  = sqlite3_exec(p
17fb0 2d 3e 64 62 4d 61 69 6e 2c 20 22 50 52 41 47 4d  ->dbMain, "PRAGM
17fc0 41 20 6d 61 69 6e 2e 77 61 6c 5f 63 68 65 63 6b  A main.wal_check
17fd0 70 6f 69 6e 74 3d 72 65 73 74 61 72 74 22 2c 20  point=restart", 
17fe0 30 2c 20 30 2c 30 29 3b 0a 20 20 20 20 69 66 28  0, 0,0);.    if(
17ff0 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 49 4e 54   rc2!=SQLITE_INT
18000 45 52 4e 41 4c 20 29 20 70 2d 3e 72 63 20 3d 20  ERNAL ) p->rc = 
18010 72 63 32 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  rc2;.  }..  if( 
18020 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
18030 20 26 26 20 70 2d 3e 6e 46 72 61 6d 65 3e 30 20   && p->nFrame>0 
18040 29 7b 0a 20 20 20 20 70 2d 3e 65 53 74 61 67 65  ){.    p->eStage
18050 20 3d 20 52 42 55 5f 53 54 41 47 45 5f 43 4b 50   = RBU_STAGE_CKP
18060 54 3b 0a 20 20 20 20 70 2d 3e 6e 53 74 65 70 20  T;.    p->nStep 
18070 3d 20 28 70 53 74 61 74 65 20 3f 20 70 53 74 61  = (pState ? pSta
18080 74 65 2d 3e 6e 52 6f 77 20 3a 20 30 29 3b 0a 20  te->nRow : 0);. 
18090 20 20 20 70 2d 3e 61 42 75 66 20 3d 20 72 62 75     p->aBuf = rbu
180a0 4d 61 6c 6c 6f 63 28 70 2c 20 70 2d 3e 70 67 73  Malloc(p, p->pgs
180b0 7a 29 3b 0a 20 20 20 20 70 2d 3e 69 57 61 6c 43  z);.    p->iWalC
180c0 6b 73 75 6d 20 3d 20 72 62 75 53 68 6d 43 68 65  ksum = rbuShmChe
180d0 63 6b 73 75 6d 28 70 29 3b 0a 20 20 7d 0a 0a 20  cksum(p);.  }.. 
180e0 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
180f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
18100 20 70 2d 3e 6e 46 72 61 6d 65 3d 3d 30 20 7c 7c   p->nFrame==0 ||
18110 20 28 70 53 74 61 74 65 20 26 26 20 70 53 74 61   (pState && pSta
18120 74 65 2d 3e 69 57 61 6c 43 6b 73 75 6d 21 3d 70  te->iWalCksum!=p
18130 2d 3e 69 57 61 6c 43 6b 73 75 6d 29 20 29 7b 0a  ->iWalCksum) ){.
18140 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51        p->rc = SQ
18150 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20  LITE_DONE;.     
18160 20 70 2d 3e 65 53 74 61 67 65 20 3d 20 52 42 55   p->eStage = RBU
18170 5f 53 54 41 47 45 5f 44 4f 4e 45 3b 0a 20 20 20  _STAGE_DONE;.   
18180 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
18190 74 20 6e 53 65 63 74 6f 72 53 69 7a 65 3b 0a 20  t nSectorSize;. 
181a0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c       sqlite3_fil
181b0 65 20 2a 70 44 62 20 3d 20 70 2d 3e 70 54 61 72  e *pDb = p->pTar
181c0 67 65 74 46 64 2d 3e 70 52 65 61 6c 3b 0a 20 20  getFd->pReal;.  
181d0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65      sqlite3_file
181e0 20 2a 70 57 61 6c 20 3d 20 70 2d 3e 70 54 61 72   *pWal = p->pTar
181f0 67 65 74 46 64 2d 3e 70 57 61 6c 46 64 2d 3e 70  getFd->pWalFd->p
18200 52 65 61 6c 3b 0a 20 20 20 20 20 20 61 73 73 65  Real;.      asse
18210 72 74 28 20 70 2d 3e 6e 50 61 67 65 50 65 72 53  rt( p->nPagePerS
18220 65 63 74 6f 72 3d 3d 30 20 29 3b 0a 20 20 20 20  ector==0 );.    
18230 20 20 6e 53 65 63 74 6f 72 53 69 7a 65 20 3d 20    nSectorSize = 
18240 70 44 62 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78  pDb->pMethods->x
18250 53 65 63 74 6f 72 53 69 7a 65 28 70 44 62 29 3b  SectorSize(pDb);
18260 0a 20 20 20 20 20 20 69 66 28 20 6e 53 65 63 74  .      if( nSect
18270 6f 72 53 69 7a 65 3e 70 2d 3e 70 67 73 7a 20 29  orSize>p->pgsz )
18280 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 50 61  {.        p->nPa
18290 67 65 50 65 72 53 65 63 74 6f 72 20 3d 20 6e 53  gePerSector = nS
182a0 65 63 74 6f 72 53 69 7a 65 20 2f 20 70 2d 3e 70  ectorSize / p->p
182b0 67 73 7a 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  gsz;.      }else
182c0 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 50 61  {.        p->nPa
182d0 67 65 50 65 72 53 65 63 74 6f 72 20 3d 20 31 3b  gePerSector = 1;
182e0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
182f0 2f 2a 20 43 61 6c 6c 20 78 53 79 6e 63 28 29 20  /* Call xSync() 
18300 6f 6e 20 74 68 65 20 77 61 6c 20 66 69 6c 65 2e  on the wal file.
18310 20 54 68 69 73 20 63 61 75 73 65 73 20 53 51 4c   This causes SQL
18320 69 74 65 20 74 6f 20 73 79 6e 63 20 74 68 65 20  ite to sync the 
18330 0a 20 20 20 20 20 20 2a 2a 20 64 69 72 65 63 74  .      ** direct
18340 6f 72 79 20 69 6e 20 77 68 69 63 68 20 74 68 65  ory in which the
18350 20 74 61 72 67 65 74 20 64 61 74 61 62 61 73 65   target database
18360 20 61 6e 64 20 74 68 65 20 77 61 6c 20 66 69 6c   and the wal fil
18370 65 20 72 65 73 69 64 65 2c 20 69 6e 20 0a 20 20  e reside, in .  
18380 20 20 20 20 2a 2a 20 63 61 73 65 20 69 74 20 68      ** case it h
18390 61 73 20 6e 6f 74 20 62 65 65 6e 20 73 79 6e 63  as not been sync
183a0 65 64 20 73 69 6e 63 65 20 74 68 65 20 72 65 6e  ed since the ren
183b0 61 6d 65 28 29 20 63 61 6c 6c 20 69 6e 20 0a 20  ame() call in . 
183c0 20 20 20 20 20 2a 2a 20 72 62 75 4d 6f 76 65 4f       ** rbuMoveO
183d0 61 6c 46 69 6c 65 28 29 2e 20 2a 2f 0a 20 20 20  alFile(). */.   
183e0 20 20 20 70 2d 3e 72 63 20 3d 20 70 57 61 6c 2d     p->rc = pWal-
183f0 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53 79 6e 63  >pMethods->xSync
18400 28 70 57 61 6c 2c 20 53 51 4c 49 54 45 5f 53 59  (pWal, SQLITE_SY
18410 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20 20 20  NC_NORMAL);.    
18420 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  }.  }.}../*.** C
18430 61 6c 6c 65 64 20 77 68 65 6e 20 69 41 6d 74 20  alled when iAmt 
18440 62 79 74 65 73 20 61 72 65 20 72 65 61 64 20 66  bytes are read f
18450 72 6f 6d 20 6f 66 66 73 65 74 20 69 4f 66 66 20  rom offset iOff 
18460 6f 66 20 74 68 65 20 77 61 6c 20 66 69 6c 65 20  of the wal file 
18470 77 68 69 6c 65 0a 2a 2a 20 74 68 65 20 72 62 75  while.** the rbu
18480 20 6f 62 6a 65 63 74 20 69 73 20 69 6e 20 63 61   object is in ca
18490 70 74 75 72 65 20 6d 6f 64 65 2e 20 52 65 63 6f  pture mode. Reco
184a0 72 64 20 74 68 65 20 66 72 61 6d 65 20 6e 75 6d  rd the frame num
184b0 62 65 72 20 6f 66 20 74 68 65 20 66 72 61 6d 65  ber of the frame
184c0 0a 2a 2a 20 62 65 69 6e 67 20 72 65 61 64 20 69  .** being read i
184d0 6e 20 74 68 65 20 61 46 72 61 6d 65 5b 5d 20 61  n the aFrame[] a
184e0 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rray..*/.static 
184f0 69 6e 74 20 72 62 75 43 61 70 74 75 72 65 57 61  int rbuCaptureWa
18500 6c 52 65 61 64 28 73 71 6c 69 74 65 33 72 62 75  lRead(sqlite3rbu
18510 20 2a 70 52 62 75 2c 20 69 36 34 20 69 4f 66 66   *pRbu, i64 iOff
18520 2c 20 69 6e 74 20 69 41 6d 74 29 7b 0a 20 20 63  , int iAmt){.  c
18530 6f 6e 73 74 20 75 33 32 20 6d 52 65 71 20 3d 20  onst u32 mReq = 
18540 28 31 3c 3c 57 41 4c 5f 4c 4f 43 4b 5f 57 52 49  (1<<WAL_LOCK_WRI
18550 54 45 29 7c 28 31 3c 3c 57 41 4c 5f 4c 4f 43 4b  TE)|(1<<WAL_LOCK
18560 5f 43 4b 50 54 29 7c 28 31 3c 3c 57 41 4c 5f 4c  _CKPT)|(1<<WAL_L
18570 4f 43 4b 5f 52 45 41 44 30 29 3b 0a 20 20 75 33  OCK_READ0);.  u3
18580 32 20 69 46 72 61 6d 65 3b 0a 0a 20 20 69 66 28  2 iFrame;..  if(
18590 20 70 52 62 75 2d 3e 6d 4c 6f 63 6b 21 3d 6d 52   pRbu->mLock!=mR
185a0 65 71 20 29 7b 0a 20 20 20 20 70 52 62 75 2d 3e  eq ){.    pRbu->
185b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
185c0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
185d0 49 54 45 5f 49 4e 54 45 52 4e 41 4c 3b 0a 20 20  ITE_INTERNAL;.  
185e0 7d 0a 0a 20 20 70 52 62 75 2d 3e 70 67 73 7a 20  }..  pRbu->pgsz 
185f0 3d 20 69 41 6d 74 3b 0a 20 20 69 66 28 20 70 52  = iAmt;.  if( pR
18600 62 75 2d 3e 6e 46 72 61 6d 65 3d 3d 70 52 62 75  bu->nFrame==pRbu
18610 2d 3e 6e 46 72 61 6d 65 41 6c 6c 6f 63 20 29 7b  ->nFrameAlloc ){
18620 0a 20 20 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20  .    int nNew = 
18630 28 70 52 62 75 2d 3e 6e 46 72 61 6d 65 41 6c 6c  (pRbu->nFrameAll
18640 6f 63 20 3f 20 70 52 62 75 2d 3e 6e 46 72 61 6d  oc ? pRbu->nFram
18650 65 41 6c 6c 6f 63 20 3a 20 36 34 29 20 2a 20 32  eAlloc : 64) * 2
18660 3b 0a 20 20 20 20 52 62 75 46 72 61 6d 65 20 2a  ;.    RbuFrame *
18670 61 4e 65 77 3b 0a 20 20 20 20 61 4e 65 77 20 3d  aNew;.    aNew =
18680 20 28 52 62 75 46 72 61 6d 65 2a 29 73 71 6c 69   (RbuFrame*)sqli
18690 74 65 33 5f 72 65 61 6c 6c 6f 63 36 34 28 70 52  te3_realloc64(pR
186a0 62 75 2d 3e 61 46 72 61 6d 65 2c 20 6e 4e 65 77  bu->aFrame, nNew
186b0 20 2a 20 73 69 7a 65 6f 66 28 52 62 75 46 72 61   * sizeof(RbuFra
186c0 6d 65 29 29 3b 0a 20 20 20 20 69 66 28 20 61 4e  me));.    if( aN
186d0 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ew==0 ) return S
186e0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
186f0 20 70 52 62 75 2d 3e 61 46 72 61 6d 65 20 3d 20   pRbu->aFrame = 
18700 61 4e 65 77 3b 0a 20 20 20 20 70 52 62 75 2d 3e  aNew;.    pRbu->
18710 6e 46 72 61 6d 65 41 6c 6c 6f 63 20 3d 20 6e 4e  nFrameAlloc = nN
18720 65 77 3b 0a 20 20 7d 0a 0a 20 20 69 46 72 61 6d  ew;.  }..  iFram
18730 65 20 3d 20 28 75 33 32 29 28 28 69 4f 66 66 2d  e = (u32)((iOff-
18740 33 32 29 20 2f 20 28 69 36 34 29 28 69 41 6d 74  32) / (i64)(iAmt
18750 2b 32 34 29 29 20 2b 20 31 3b 0a 20 20 69 66 28  +24)) + 1;.  if(
18760 20 70 52 62 75 2d 3e 69 4d 61 78 46 72 61 6d 65   pRbu->iMaxFrame
18770 3c 69 46 72 61 6d 65 20 29 20 70 52 62 75 2d 3e  <iFrame ) pRbu->
18780 69 4d 61 78 46 72 61 6d 65 20 3d 20 69 46 72 61  iMaxFrame = iFra
18790 6d 65 3b 0a 20 20 70 52 62 75 2d 3e 61 46 72 61  me;.  pRbu->aFra
187a0 6d 65 5b 70 52 62 75 2d 3e 6e 46 72 61 6d 65 5d  me[pRbu->nFrame]
187b0 2e 69 57 61 6c 46 72 61 6d 65 20 3d 20 69 46 72  .iWalFrame = iFr
187c0 61 6d 65 3b 0a 20 20 70 52 62 75 2d 3e 61 46 72  ame;.  pRbu->aFr
187d0 61 6d 65 5b 70 52 62 75 2d 3e 6e 46 72 61 6d 65  ame[pRbu->nFrame
187e0 5d 2e 69 44 62 50 61 67 65 20 3d 20 30 3b 0a 20  ].iDbPage = 0;. 
187f0 20 70 52 62 75 2d 3e 6e 46 72 61 6d 65 2b 2b 3b   pRbu->nFrame++;
18800 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
18810 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61  _OK;.}../*.** Ca
18820 6c 6c 65 64 20 77 68 65 6e 20 61 20 70 61 67 65  lled when a page
18830 20 6f 66 20 64 61 74 61 20 69 73 20 77 72 69 74   of data is writ
18840 74 65 6e 20 74 6f 20 6f 66 66 73 65 74 20 69 4f  ten to offset iO
18850 66 66 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ff of the databa
18860 73 65 0a 2a 2a 20 66 69 6c 65 20 77 68 69 6c 65  se.** file while
18870 20 74 68 65 20 72 62 75 20 68 61 6e 64 6c 65 20   the rbu handle 
18880 69 73 20 69 6e 20 63 61 70 74 75 72 65 20 6d 6f  is in capture mo
18890 64 65 2e 20 52 65 63 6f 72 64 20 74 68 65 20 70  de. Record the p
188a0 61 67 65 20 6e 75 6d 62 65 72 20 0a 2a 2a 20 6f  age number .** o
188b0 66 20 74 68 65 20 70 61 67 65 20 62 65 69 6e 67  f the page being
188c0 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68 65 20   written in the 
188d0 61 46 72 61 6d 65 5b 5d 20 61 72 72 61 79 2e 0a  aFrame[] array..
188e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62  */.static int rb
188f0 75 43 61 70 74 75 72 65 44 62 57 72 69 74 65 28  uCaptureDbWrite(
18900 73 71 6c 69 74 65 33 72 62 75 20 2a 70 52 62 75  sqlite3rbu *pRbu
18910 2c 20 69 36 34 20 69 4f 66 66 29 7b 0a 20 20 70  , i64 iOff){.  p
18920 52 62 75 2d 3e 61 46 72 61 6d 65 5b 70 52 62 75  Rbu->aFrame[pRbu
18930 2d 3e 6e 46 72 61 6d 65 2d 31 5d 2e 69 44 62 50  ->nFrame-1].iDbP
18940 61 67 65 20 3d 20 28 75 33 32 29 28 69 4f 66 66  age = (u32)(iOff
18950 20 2f 20 70 52 62 75 2d 3e 70 67 73 7a 29 20 2b   / pRbu->pgsz) +
18960 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   1;.  return SQL
18970 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
18980 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20   This is called 
18990 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20 69 6e  as part of an in
189a0 63 72 65 6d 65 6e 74 61 6c 20 63 68 65 63 6b 70  cremental checkp
189b0 6f 69 6e 74 20 6f 70 65 72 61 74 69 6f 6e 2e 20  oint operation. 
189c0 43 6f 70 79 0a 2a 2a 20 61 20 73 69 6e 67 6c 65  Copy.** a single
189d0 20 66 72 61 6d 65 20 6f 66 20 64 61 74 61 20 66   frame of data f
189e0 72 6f 6d 20 74 68 65 20 77 61 6c 20 66 69 6c 65  rom the wal file
189f0 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
18a00 73 65 20 66 69 6c 65 2c 20 61 73 0a 2a 2a 20 69  se file, as.** i
18a10 6e 64 69 63 61 74 65 64 20 62 79 20 74 68 65 20  ndicated by the 
18a20 52 62 75 46 72 61 6d 65 20 6f 62 6a 65 63 74 2e  RbuFrame object.
18a30 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
18a40 72 62 75 43 68 65 63 6b 70 6f 69 6e 74 46 72 61  rbuCheckpointFra
18a50 6d 65 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70  me(sqlite3rbu *p
18a60 2c 20 52 62 75 46 72 61 6d 65 20 2a 70 46 72 61  , RbuFrame *pFra
18a70 6d 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66  me){.  sqlite3_f
18a80 69 6c 65 20 2a 70 57 61 6c 20 3d 20 70 2d 3e 70  ile *pWal = p->p
18a90 54 61 72 67 65 74 46 64 2d 3e 70 57 61 6c 46 64  TargetFd->pWalFd
18aa0 2d 3e 70 52 65 61 6c 3b 0a 20 20 73 71 6c 69 74  ->pReal;.  sqlit
18ab0 65 33 5f 66 69 6c 65 20 2a 70 44 62 20 3d 20 70  e3_file *pDb = p
18ac0 2d 3e 70 54 61 72 67 65 74 46 64 2d 3e 70 52 65  ->pTargetFd->pRe
18ad0 61 6c 3b 0a 20 20 69 36 34 20 69 4f 66 66 3b 0a  al;.  i64 iOff;.
18ae0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63  .  assert( p->rc
18af0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
18b00 20 69 4f 66 66 20 3d 20 28 69 36 34 29 28 70 46   iOff = (i64)(pF
18b10 72 61 6d 65 2d 3e 69 57 61 6c 46 72 61 6d 65 2d  rame->iWalFrame-
18b20 31 29 20 2a 20 28 70 2d 3e 70 67 73 7a 20 2b 20  1) * (p->pgsz + 
18b30 32 34 29 20 2b 20 33 32 20 2b 20 32 34 3b 0a 20  24) + 32 + 24;. 
18b40 20 70 2d 3e 72 63 20 3d 20 70 57 61 6c 2d 3e 70   p->rc = pWal->p
18b50 4d 65 74 68 6f 64 73 2d 3e 78 52 65 61 64 28 70  Methods->xRead(p
18b60 57 61 6c 2c 20 70 2d 3e 61 42 75 66 2c 20 70 2d  Wal, p->aBuf, p-
18b70 3e 70 67 73 7a 2c 20 69 4f 66 66 29 3b 0a 20 20  >pgsz, iOff);.  
18b80 69 66 28 20 70 2d 3e 72 63 20 29 20 72 65 74 75  if( p->rc ) retu
18b90 72 6e 3b 0a 0a 20 20 69 4f 66 66 20 3d 20 28 69  rn;..  iOff = (i
18ba0 36 34 29 28 70 46 72 61 6d 65 2d 3e 69 44 62 50  64)(pFrame->iDbP
18bb0 61 67 65 2d 31 29 20 2a 20 70 2d 3e 70 67 73 7a  age-1) * p->pgsz
18bc0 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 70 44 62 2d  ;.  p->rc = pDb-
18bd0 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 57 72 69 74  >pMethods->xWrit
18be0 65 28 70 44 62 2c 20 70 2d 3e 61 42 75 66 2c 20  e(pDb, p->aBuf, 
18bf0 70 2d 3e 70 67 73 7a 2c 20 69 4f 66 66 29 3b 0a  p->pgsz, iOff);.
18c00 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 61 6b 65 20 61  }.../*.** Take a
18c10 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
18c20 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
18c30 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
18c40 20 76 6f 69 64 20 72 62 75 4c 6f 63 6b 44 61 74   void rbuLockDat
18c50 61 62 61 73 65 28 73 71 6c 69 74 65 33 72 62 75  abase(sqlite3rbu
18c60 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f   *p){.  sqlite3_
18c70 66 69 6c 65 20 2a 70 52 65 61 6c 20 3d 20 70 2d  file *pReal = p-
18c80 3e 70 54 61 72 67 65 74 46 64 2d 3e 70 52 65 61  >pTargetFd->pRea
18c90 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  l;.  assert( p->
18ca0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
18cb0 0a 20 20 70 2d 3e 72 63 20 3d 20 70 52 65 61 6c  .  p->rc = pReal
18cc0 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 4c 6f 63  ->pMethods->xLoc
18cd0 6b 28 70 52 65 61 6c 2c 20 53 51 4c 49 54 45 5f  k(pReal, SQLITE_
18ce0 4c 4f 43 4b 5f 53 48 41 52 45 44 29 3b 0a 20 20  LOCK_SHARED);.  
18cf0 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
18d00 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d 3e 72  E_OK ){.    p->r
18d10 63 20 3d 20 70 52 65 61 6c 2d 3e 70 4d 65 74 68  c = pReal->pMeth
18d20 6f 64 73 2d 3e 78 4c 6f 63 6b 28 70 52 65 61 6c  ods->xLock(pReal
18d30 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 45 58  , SQLITE_LOCK_EX
18d40 43 4c 55 53 49 56 45 29 3b 0a 20 20 7d 0a 7d 0a  CLUSIVE);.  }.}.
18d50 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57 49  .#if defined(_WI
18d60 4e 33 32 5f 57 43 45 29 0a 73 74 61 74 69 63 20  N32_WCE).static 
18d70 4c 50 57 53 54 52 20 72 62 75 57 69 6e 55 74 66  LPWSTR rbuWinUtf
18d80 38 54 6f 55 6e 69 63 6f 64 65 28 63 6f 6e 73 74  8ToUnicode(const
18d90 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
18da0 29 7b 0a 20 20 69 6e 74 20 6e 43 68 61 72 3b 0a  ){.  int nChar;.
18db0 20 20 4c 50 57 53 54 52 20 7a 57 69 64 65 46 69    LPWSTR zWideFi
18dc0 6c 65 6e 61 6d 65 3b 0a 0a 20 20 6e 43 68 61 72  lename;..  nChar
18dd0 20 3d 20 4d 75 6c 74 69 42 79 74 65 54 6f 57 69   = MultiByteToWi
18de0 64 65 43 68 61 72 28 43 50 5f 55 54 46 38 2c 20  deChar(CP_UTF8, 
18df0 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31  0, zFilename, -1
18e00 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a 20 20 69 66  , NULL, 0);.  if
18e10 28 20 6e 43 68 61 72 3d 3d 30 20 29 7b 0a 20 20  ( nChar==0 ){.  
18e20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
18e30 20 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 20    zWideFilename 
18e40 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
18e50 36 34 28 20 6e 43 68 61 72 2a 73 69 7a 65 6f 66  64( nChar*sizeof
18e60 28 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 5b 30  (zWideFilename[0
18e70 5d 29 20 29 3b 0a 20 20 69 66 28 20 7a 57 69 64  ]) );.  if( zWid
18e80 65 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a  eFilename==0 ){.
18e90 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
18ea0 7d 0a 20 20 6d 65 6d 73 65 74 28 7a 57 69 64 65  }.  memset(zWide
18eb0 46 69 6c 65 6e 61 6d 65 2c 20 30 2c 20 6e 43 68  Filename, 0, nCh
18ec0 61 72 2a 73 69 7a 65 6f 66 28 7a 57 69 64 65 46  ar*sizeof(zWideF
18ed0 69 6c 65 6e 61 6d 65 5b 30 5d 29 29 3b 0a 20 20  ilename[0]));.  
18ee0 6e 43 68 61 72 20 3d 20 4d 75 6c 74 69 42 79 74  nChar = MultiByt
18ef0 65 54 6f 57 69 64 65 43 68 61 72 28 43 50 5f 55  eToWideChar(CP_U
18f00 54 46 38 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d  TF8, 0, zFilenam
18f10 65 2c 20 2d 31 2c 20 7a 57 69 64 65 46 69 6c 65  e, -1, zWideFile
18f20 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  name,.          
18f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f40 20 20 20 20 20 20 6e 43 68 61 72 29 3b 0a 20 20        nChar);.  
18f50 69 66 28 20 6e 43 68 61 72 3d 3d 30 20 29 7b 0a  if( nChar==0 ){.
18f60 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
18f70 28 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 29 3b  (zWideFilename);
18f80 0a 20 20 20 20 7a 57 69 64 65 46 69 6c 65 6e 61  .    zWideFilena
18f90 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  me = 0;.  }.  re
18fa0 74 75 72 6e 20 7a 57 69 64 65 46 69 6c 65 6e 61  turn zWideFilena
18fb0 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  me;.}.#endif../*
18fc0 0a 2a 2a 20 54 68 65 20 52 42 55 20 68 61 6e 64  .** The RBU hand
18fd0 6c 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  le is currently 
18fe0 69 6e 20 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c  in RBU_STAGE_OAL
18ff0 20 73 74 61 74 65 2c 20 77 69 74 68 20 61 20 53   state, with a S
19000 48 41 52 45 44 20 6c 6f 63 6b 0a 2a 2a 20 6f 6e  HARED lock.** on
19010 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
19020 6c 65 2e 20 54 68 69 73 20 70 72 6f 63 20 6d 6f  le. This proc mo
19030 76 65 73 20 74 68 65 20 2a 2d 6f 61 6c 20 66 69  ves the *-oal fi
19040 6c 65 20 74 6f 20 74 68 65 20 2a 2d 77 61 6c 20  le to the *-wal 
19050 70 61 74 68 2c 0a 2a 2a 20 74 68 65 6e 20 72 65  path,.** then re
19060 6f 70 65 6e 73 20 74 68 65 20 64 61 74 61 62 61  opens the databa
19070 73 65 20 66 69 6c 65 20 28 74 68 69 73 20 74 69  se file (this ti
19080 6d 65 20 69 6e 20 76 61 6e 69 6c 6c 61 2c 20 6e  me in vanilla, n
19090 6f 6e 2d 6f 61 6c 2c 20 57 41 4c 20 6d 6f 64 65  on-oal, WAL mode
190a0 29 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  )..** If an erro
190b0 72 20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65 20  r occurs, leave 
190c0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e  an error code an
190d0 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  d error message 
190e0 69 6e 20 74 68 65 20 72 62 75 20 0a 2a 2a 20 68  in the rbu .** h
190f0 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  andle..*/.static
19100 20 76 6f 69 64 20 72 62 75 4d 6f 76 65 4f 61 6c   void rbuMoveOal
19110 46 69 6c 65 28 73 71 6c 69 74 65 33 72 62 75 20  File(sqlite3rbu 
19120 2a 70 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  *p){.  const cha
19130 72 20 2a 7a 42 61 73 65 20 3d 20 73 71 6c 69 74  r *zBase = sqlit
19140 65 33 5f 64 62 5f 66 69 6c 65 6e 61 6d 65 28 70  e3_db_filename(p
19150 2d 3e 64 62 4d 61 69 6e 2c 20 22 6d 61 69 6e 22  ->dbMain, "main"
19160 29 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  );.  const char 
19170 2a 7a 4d 6f 76 65 20 3d 20 7a 42 61 73 65 3b 0a  *zMove = zBase;.
19180 20 20 63 68 61 72 20 2a 7a 4f 61 6c 3b 0a 20 20    char *zOal;.  
19190 63 68 61 72 20 2a 7a 57 61 6c 3b 0a 0a 20 20 69  char *zWal;..  i
191a0 66 28 20 72 62 75 49 73 56 61 63 75 75 6d 28 70  f( rbuIsVacuum(p
191b0 29 20 29 7b 0a 20 20 20 20 7a 4d 6f 76 65 20 3d  ) ){.    zMove =
191c0 20 73 71 6c 69 74 65 33 5f 64 62 5f 66 69 6c 65   sqlite3_db_file
191d0 6e 61 6d 65 28 70 2d 3e 64 62 52 62 75 2c 20 22  name(p->dbRbu, "
191e0 6d 61 69 6e 22 29 3b 0a 20 20 7d 0a 20 20 7a 4f  main");.  }.  zO
191f0 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  al = sqlite3_mpr
19200 69 6e 74 66 28 22 25 73 2d 6f 61 6c 22 2c 20 7a  intf("%s-oal", z
19210 4d 6f 76 65 29 3b 0a 20 20 7a 57 61 6c 20 3d 20  Move);.  zWal = 
19220 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
19230 22 25 73 2d 77 61 6c 22 2c 20 7a 4d 6f 76 65 29  "%s-wal", zMove)
19240 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ;..  assert( p->
19250 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47  eStage==RBU_STAG
19260 45 5f 4d 4f 56 45 20 29 3b 0a 20 20 61 73 73 65  E_MOVE );.  asse
19270 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rt( p->rc==SQLIT
19280 45 5f 4f 4b 20 26 26 20 70 2d 3e 7a 45 72 72 6d  E_OK && p->zErrm
19290 73 67 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 7a  sg==0 );.  if( z
192a0 57 61 6c 3d 3d 30 20 7c 7c 20 7a 4f 61 6c 3d 3d  Wal==0 || zOal==
192b0 30 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  0 ){.    p->rc =
192c0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
192d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4d   }else{.    /* M
192e0 6f 76 65 20 74 68 65 20 2a 2d 6f 61 6c 20 66 69  ove the *-oal fi
192f0 6c 65 20 74 6f 20 2a 2d 77 61 6c 2e 20 41 74 20  le to *-wal. At 
19300 74 68 69 73 20 70 6f 69 6e 74 20 63 6f 6e 6e 65  this point conne
19310 63 74 69 6f 6e 20 70 2d 3e 64 62 20 69 73 0a 20  ction p->db is. 
19320 20 20 20 2a 2a 20 68 6f 6c 64 69 6e 67 20 61 20     ** holding a 
19330 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SHARED lock on t
19340 68 65 20 74 61 72 67 65 74 20 64 61 74 61 62 61  he target databa
19350 73 65 20 66 69 6c 65 20 28 62 65 63 61 75 73 65  se file (because
19360 20 69 74 20 69 73 0a 20 20 20 20 2a 2a 20 69 6e   it is.    ** in
19370 20 57 41 4c 20 6d 6f 64 65 29 2e 20 53 6f 20 6e   WAL mode). So n
19380 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  o other connecti
19390 6f 6e 20 6d 61 79 20 62 65 20 77 72 69 74 69 6e  on may be writin
193a0 67 20 74 68 65 20 64 62 2e 20 0a 20 20 20 20 2a  g the db. .    *
193b0 2a 0a 20 20 20 20 2a 2a 20 49 6e 20 6f 72 64 65  *.    ** In orde
193c0 72 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74  r to ensure that
193d0 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 64 61   there are no da
193e0 74 61 62 61 73 65 20 72 65 61 64 65 72 73 2c 20  tabase readers, 
193f0 61 6e 20 45 58 43 4c 55 53 49 56 45 0a 20 20 20  an EXCLUSIVE.   
19400 20 2a 2a 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61   ** lock is obta
19410 69 6e 65 64 20 68 65 72 65 20 62 65 66 6f 72 65  ined here before
19420 20 74 68 65 20 2a 2d 6f 61 6c 20 69 73 20 6d 6f   the *-oal is mo
19430 76 65 64 20 74 6f 20 2a 2d 77 61 6c 2e 0a 20 20  ved to *-wal..  
19440 20 20 2a 2f 0a 20 20 20 20 72 62 75 4c 6f 63 6b    */.    rbuLock
19450 44 61 74 61 62 61 73 65 28 70 29 3b 0a 20 20 20  Database(p);.   
19460 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
19470 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
19480 62 75 46 69 6c 65 53 75 66 66 69 78 33 28 7a 42  buFileSuffix3(zB
19490 61 73 65 2c 20 7a 57 61 6c 29 3b 0a 20 20 20 20  ase, zWal);.    
194a0 20 20 72 62 75 46 69 6c 65 53 75 66 66 69 78 33    rbuFileSuffix3
194b0 28 7a 42 61 73 65 2c 20 7a 4f 61 6c 29 3b 0a 0a  (zBase, zOal);..
194c0 20 20 20 20 20 20 2f 2a 20 52 65 2d 6f 70 65 6e        /* Re-open
194d0 20 74 68 65 20 64 61 74 61 62 61 73 65 73 2e 20   the databases. 
194e0 2a 2f 0a 20 20 20 20 20 20 72 62 75 4f 62 6a 49  */.      rbuObjI
194f0 74 65 72 46 69 6e 61 6c 69 7a 65 28 26 70 2d 3e  terFinalize(&p->
19500 6f 62 6a 69 74 65 72 29 3b 0a 20 20 20 20 20 20  objiter);.      
19510 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 2d  sqlite3_close(p-
19520 3e 64 62 52 62 75 29 3b 0a 20 20 20 20 20 20 73  >dbRbu);.      s
19530 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 2d 3e  qlite3_close(p->
19540 64 62 4d 61 69 6e 29 3b 0a 20 20 20 20 20 20 70  dbMain);.      p
19550 2d 3e 64 62 4d 61 69 6e 20 3d 20 30 3b 0a 20 20  ->dbMain = 0;.  
19560 20 20 20 20 70 2d 3e 64 62 52 62 75 20 3d 20 30      p->dbRbu = 0
19570 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  ;..#if defined(_
19580 57 49 4e 33 32 5f 57 43 45 29 0a 20 20 20 20 20  WIN32_WCE).     
19590 20 7b 0a 20 20 20 20 20 20 20 20 4c 50 57 53 54   {.        LPWST
195a0 52 20 7a 57 69 64 65 4f 61 6c 3b 0a 20 20 20 20  R zWideOal;.    
195b0 20 20 20 20 4c 50 57 53 54 52 20 7a 57 69 64 65      LPWSTR zWide
195c0 57 61 6c 3b 0a 0a 20 20 20 20 20 20 20 20 7a 57  Wal;..        zW
195d0 69 64 65 4f 61 6c 20 3d 20 72 62 75 57 69 6e 55  ideOal = rbuWinU
195e0 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a 4f 61  tf8ToUnicode(zOa
195f0 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  l);.        if( 
19600 7a 57 69 64 65 4f 61 6c 20 29 7b 0a 20 20 20 20  zWideOal ){.    
19610 20 20 20 20 20 20 7a 57 69 64 65 57 61 6c 20 3d        zWideWal =
19620 20 72 62 75 57 69 6e 55 74 66 38 54 6f 55 6e 69   rbuWinUtf8ToUni
19630 63 6f 64 65 28 7a 57 61 6c 29 3b 0a 20 20 20 20  code(zWal);.    
19640 20 20 20 20 20 20 69 66 28 20 7a 57 69 64 65 57        if( zWideW
19650 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  al ){.          
19660 20 20 69 66 28 20 4d 6f 76 65 46 69 6c 65 57 28    if( MoveFileW(
19670 7a 57 69 64 65 4f 61 6c 2c 20 7a 57 69 64 65 57  zWideOal, zWideW
19680 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  al) ){.         
19690 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c       p->rc = SQL
196a0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
196b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
196c0 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d           p->rc =
196d0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
196e0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
196f0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
19700 5f 66 72 65 65 28 7a 57 69 64 65 57 61 6c 29 3b  _free(zWideWal);
19710 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
19720 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d  {.            p-
19730 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45  >rc = SQLITE_IOE
19740 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  RR_NOMEM;.      
19750 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
19760 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 57 69  sqlite3_free(zWi
19770 64 65 4f 61 6c 29 3b 0a 20 20 20 20 20 20 20 20  deOal);.        
19780 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
19790 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
197a0 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  IOERR_NOMEM;.   
197b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23       }.      }.#
197c0 65 6c 73 65 0a 20 20 20 20 20 20 70 2d 3e 72 63  else.      p->rc
197d0 20 3d 20 72 65 6e 61 6d 65 28 7a 4f 61 6c 2c 20   = rename(zOal, 
197e0 7a 57 61 6c 29 20 3f 20 53 51 4c 49 54 45 5f 49  zWal) ? SQLITE_I
197f0 4f 45 52 52 20 3a 20 53 51 4c 49 54 45 5f 4f 4b  OERR : SQLITE_OK
19800 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20  ;.#endif..      
19810 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
19820 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
19830 72 62 75 4f 70 65 6e 44 61 74 61 62 61 73 65 28  rbuOpenDatabase(
19840 70 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 72  p, 0);.        r
19850 62 75 53 65 74 75 70 43 68 65 63 6b 70 6f 69 6e  buSetupCheckpoin
19860 74 28 70 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  t(p, 0);.      }
19870 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71  .    }.  }..  sq
19880 6c 69 74 65 33 5f 66 72 65 65 28 7a 57 61 6c 29  lite3_free(zWal)
19890 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
198a0 28 7a 4f 61 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  (zOal);.}../*.**
198b0 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
198c0 65 6d 65 6e 74 20 69 74 65 72 61 74 69 6e 67 20  ement iterating 
198d0 74 68 72 6f 75 67 68 20 74 68 65 20 6b 65 79 73  through the keys
198e0 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
198f0 20 6f 62 6a 65 63 74 0a 2a 2a 20 28 70 2d 3e 6f   object.** (p->o
19900 62 6a 69 74 65 72 2e 70 53 65 6c 65 63 74 29 20  bjiter.pSelect) 
19910 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73  currently points
19920 20 74 6f 20 61 20 76 61 6c 69 64 20 72 6f 77 2e   to a valid row.
19930 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   This function.*
19940 2a 20 64 65 74 65 72 6d 69 6e 65 73 20 74 68 65  * determines the
19950 20 74 79 70 65 20 6f 66 20 6f 70 65 72 61 74 69   type of operati
19960 6f 6e 20 72 65 71 75 65 73 74 65 64 20 62 79 20  on requested by 
19970 74 68 69 73 20 72 6f 77 20 61 6e 64 20 72 65 74  this row and ret
19980 75 72 6e 73 0a 2a 2a 20 6f 6e 65 20 6f 66 20 74  urns.** one of t
19990 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 6c  he following val
199a0 75 65 73 20 74 6f 20 69 6e 64 69 63 61 74 65 20  ues to indicate 
199b0 74 68 65 20 72 65 73 75 6c 74 3a 0a 2a 2a 0a 2a  the result:.**.*
199c0 2a 20 20 20 20 20 2a 20 52 42 55 5f 49 4e 53 45  *     * RBU_INSE
199d0 52 54 0a 2a 2a 20 20 20 20 20 2a 20 52 42 55 5f  RT.**     * RBU_
199e0 44 45 4c 45 54 45 0a 2a 2a 20 20 20 20 20 2a 20  DELETE.**     * 
199f0 52 42 55 5f 49 44 58 5f 44 45 4c 45 54 45 0a 2a  RBU_IDX_DELETE.*
19a00 2a 20 20 20 20 20 2a 20 52 42 55 5f 55 50 44 41  *     * RBU_UPDA
19a10 54 45 0a 2a 2a 0a 2a 2a 20 49 66 20 52 42 55 5f  TE.**.** If RBU_
19a20 55 50 44 41 54 45 20 69 73 20 72 65 74 75 72 6e  UPDATE is return
19a30 65 64 2c 20 74 68 65 6e 20 6f 75 74 70 75 74 20  ed, then output 
19a40 76 61 72 69 61 62 6c 65 20 2a 70 7a 4d 61 73 6b  variable *pzMask
19a50 20 69 73 20 73 65 74 20 74 6f 0a 2a 2a 20 70 6f   is set to.** po
19a60 69 6e 74 20 74 6f 20 74 68 65 20 74 65 78 74 20  int to the text 
19a70 76 61 6c 75 65 20 69 6e 64 69 63 61 74 69 6e 67  value indicating
19a80 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 74 6f 20   the columns to 
19a90 75 70 64 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  update..**.** If
19aa0 20 74 68 65 20 72 62 75 5f 63 6f 6e 74 72 6f 6c   the rbu_control
19ab0 20 66 69 65 6c 64 20 63 6f 6e 74 61 69 6e 73 20   field contains 
19ac0 61 6e 20 69 6e 76 61 6c 69 64 20 76 61 6c 75 65  an invalid value
19ad0 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  , an error code 
19ae0 61 6e 64 0a 2a 2a 20 6d 65 73 73 61 67 65 20 61  and.** message a
19af0 72 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 52  re left in the R
19b00 42 55 20 68 61 6e 64 6c 65 20 61 6e 64 20 7a 65  BU handle and ze
19b10 72 6f 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  ro returned..*/.
19b20 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 53 74  static int rbuSt
19b30 65 70 54 79 70 65 28 73 71 6c 69 74 65 33 72 62  epType(sqlite3rb
19b40 75 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  u *p, const char
19b50 20 2a 2a 70 7a 4d 61 73 6b 29 7b 0a 20 20 69 6e   **pzMask){.  in
19b60 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 6f 62 6a 69  t iCol = p->obji
19b70 74 65 72 2e 6e 43 6f 6c 3b 20 20 20 20 20 2f 2a  ter.nCol;     /*
19b80 20 49 6e 64 65 78 20 6f 66 20 72 62 75 5f 63 6f   Index of rbu_co
19b90 6e 74 72 6f 6c 20 63 6f 6c 75 6d 6e 20 2a 2f 0a  ntrol column */.
19ba0 20 20 69 6e 74 20 72 65 73 20 3d 20 30 3b 20 20    int res = 0;  
19bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19bc0 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75    /* Return valu
19bd0 65 20 2a 2f 0a 0a 20 20 73 77 69 74 63 68 28 20  e */..  switch( 
19be0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
19bf0 79 70 65 28 70 2d 3e 6f 62 6a 69 74 65 72 2e 70  ype(p->objiter.p
19c00 53 65 6c 65 63 74 2c 20 69 43 6f 6c 29 20 29 7b  Select, iCol) ){
19c10 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
19c20 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20  _INTEGER: {.    
19c30 20 20 69 6e 74 20 69 56 61 6c 20 3d 20 73 71 6c    int iVal = sql
19c40 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
19c50 70 2d 3e 6f 62 6a 69 74 65 72 2e 70 53 65 6c 65  p->objiter.pSele
19c60 63 74 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 20  ct, iCol);.     
19c70 20 73 77 69 74 63 68 28 20 69 56 61 6c 20 29 7b   switch( iVal ){
19c80 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 30 3a  .        case 0:
19c90 20 72 65 73 20 3d 20 52 42 55 5f 49 4e 53 45 52   res = RBU_INSER
19ca0 54 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  T;     break;.  
19cb0 20 20 20 20 20 20 63 61 73 65 20 31 3a 20 72 65        case 1: re
19cc0 73 20 3d 20 52 42 55 5f 44 45 4c 45 54 45 3b 20  s = RBU_DELETE; 
19cd0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
19ce0 20 20 20 63 61 73 65 20 32 3a 20 72 65 73 20 3d     case 2: res =
19cf0 20 52 42 55 5f 52 45 50 4c 41 43 45 3b 20 20 20   RBU_REPLACE;   
19d00 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
19d10 63 61 73 65 20 33 3a 20 72 65 73 20 3d 20 52 42  case 3: res = RB
19d20 55 5f 49 44 58 5f 44 45 4c 45 54 45 3b 20 62 72  U_IDX_DELETE; br
19d30 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73  eak;.        cas
19d40 65 20 34 3a 20 72 65 73 20 3d 20 52 42 55 5f 49  e 4: res = RBU_I
19d50 44 58 5f 49 4e 53 45 52 54 3b 20 62 72 65 61 6b  DX_INSERT; break
19d60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
19d70 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
19d80 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
19d90 58 54 3a 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73  XT: {.      cons
19da0 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
19db0 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  *z = sqlite3_col
19dc0 75 6d 6e 5f 74 65 78 74 28 70 2d 3e 6f 62 6a 69  umn_text(p->obji
19dd0 74 65 72 2e 70 53 65 6c 65 63 74 2c 20 69 43 6f  ter.pSelect, iCo
19de0 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 3d  l);.      if( z=
19df0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  =0 ){.        p-
19e00 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  >rc = SQLITE_NOM
19e10 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  EM;.      }else{
19e20 0a 20 20 20 20 20 20 20 20 2a 70 7a 4d 61 73 6b  .        *pzMask
19e30 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
19e40 7a 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  z;.      }.     
19e50 20 72 65 73 20 3d 20 52 42 55 5f 55 50 44 41 54   res = RBU_UPDAT
19e60 45 3b 0a 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  E;..      break;
19e70 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 65 66 61  .    }..    defa
19e80 75 6c 74 3a 0a 20 20 20 20 20 20 62 72 65 61 6b  ult:.      break
19e90 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 65 73  ;.  }..  if( res
19ea0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 62 75 42 61  ==0 ){.    rbuBa
19eb0 64 43 6f 6e 74 72 6f 6c 45 72 72 6f 72 28 70 29  dControlError(p)
19ec0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
19ed0 65 73 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  es;.}..#ifdef SQ
19ee0 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a  LITE_DEBUG./*.**
19ef0 20 41 73 73 65 72 74 20 74 68 61 74 20 63 6f 6c   Assert that col
19f00 75 6d 6e 20 69 43 6f 6c 20 6f 66 20 73 74 61 74  umn iCol of stat
19f10 65 6d 65 6e 74 20 70 53 74 6d 74 20 69 73 20 6e  ement pStmt is n
19f20 61 6d 65 64 20 7a 4e 61 6d 65 2e 0a 2a 2f 0a 73  amed zName..*/.s
19f30 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72  tatic void asser
19f40 74 43 6f 6c 75 6d 6e 4e 61 6d 65 28 73 71 6c 69  tColumnName(sqli
19f50 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 2c  te3_stmt *pStmt,
19f60 20 69 6e 74 20 69 43 6f 6c 2c 20 63 6f 6e 73 74   int iCol, const
19f70 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20   char *zName){. 
19f80 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
19f90 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  l = sqlite3_colu
19fa0 6d 6e 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 20 69  mn_name(pStmt, i
19fb0 43 6f 6c 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Col);.  assert( 
19fc0 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 69 63  0==sqlite3_stric
19fd0 6d 70 28 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 20  mp(zName, zCol) 
19fe0 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  );.}.#else.# def
19ff0 69 6e 65 20 61 73 73 65 72 74 43 6f 6c 75 6d 6e  ine assertColumn
1a000 4e 61 6d 65 28 78 2c 79 2c 7a 29 0a 23 65 6e 64  Name(x,y,z).#end
1a010 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65  if../*.** Argume
1a020 6e 74 20 65 54 79 70 65 20 6d 75 73 74 20 62 65  nt eType must be
1a030 20 6f 6e 65 20 6f 66 20 52 42 55 5f 49 4e 53 45   one of RBU_INSE
1a040 52 54 2c 20 52 42 55 5f 44 45 4c 45 54 45 2c 20  RT, RBU_DELETE, 
1a050 52 42 55 5f 49 44 58 5f 49 4e 53 45 52 54 20 6f  RBU_IDX_INSERT o
1a060 72 0a 2a 2a 20 52 42 55 5f 49 44 58 5f 44 45 4c  r.** RBU_IDX_DEL
1a070 45 54 45 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ETE. This functi
1a080 6f 6e 20 70 65 72 66 6f 72 6d 73 20 74 68 65 20  on performs the 
1a090 77 6f 72 6b 20 6f 66 20 61 20 73 69 6e 67 6c 65  work of a single
1a0a0 0a 2a 2a 20 73 71 6c 69 74 65 33 72 62 75 5f 73  .** sqlite3rbu_s
1a0b0 74 65 70 28 29 20 63 61 6c 6c 20 66 6f 72 20 74  tep() call for t
1a0c0 68 65 20 74 79 70 65 20 6f 66 20 6f 70 65 72 61  he type of opera
1a0d0 74 69 6f 6e 20 73 70 65 63 69 66 69 65 64 20 62  tion specified b
1a0e0 79 20 65 54 79 70 65 2e 0a 2a 2f 0a 73 74 61 74  y eType..*/.stat
1a0f0 69 63 20 76 6f 69 64 20 72 62 75 53 74 65 70 4f  ic void rbuStepO
1a100 6e 65 4f 70 28 73 71 6c 69 74 65 33 72 62 75 20  neOp(sqlite3rbu 
1a110 2a 70 2c 20 69 6e 74 20 65 54 79 70 65 29 7b 0a  *p, int eType){.
1a120 20 20 52 62 75 4f 62 6a 49 74 65 72 20 2a 70 49    RbuObjIter *pI
1a130 74 65 72 20 3d 20 26 70 2d 3e 6f 62 6a 69 74 65  ter = &p->objite
1a140 72 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  r;.  sqlite3_val
1a150 75 65 20 2a 70 56 61 6c 3b 0a 20 20 73 71 6c 69  ue *pVal;.  sqli
1a160 74 65 33 5f 73 74 6d 74 20 2a 70 57 72 69 74 65  te3_stmt *pWrite
1a170 72 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61  r;.  int i;..  a
1a180 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51  ssert( p->rc==SQ
1a190 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 61 73 73  LITE_OK );.  ass
1a1a0 65 72 74 28 20 65 54 79 70 65 21 3d 52 42 55 5f  ert( eType!=RBU_
1a1b0 44 45 4c 45 54 45 20 7c 7c 20 70 49 74 65 72 2d  DELETE || pIter-
1a1c0 3e 7a 49 64 78 3d 3d 30 20 29 3b 0a 20 20 61 73  >zIdx==0 );.  as
1a1d0 73 65 72 74 28 20 65 54 79 70 65 3d 3d 52 42 55  sert( eType==RBU
1a1e0 5f 44 45 4c 45 54 45 20 7c 7c 20 65 54 79 70 65  _DELETE || eType
1a1f0 3d 3d 52 42 55 5f 49 44 58 5f 44 45 4c 45 54 45  ==RBU_IDX_DELETE
1a200 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65  .       || eType
1a210 3d 3d 52 42 55 5f 49 4e 53 45 52 54 20 7c 7c 20  ==RBU_INSERT || 
1a220 65 54 79 70 65 3d 3d 52 42 55 5f 49 44 58 5f 49  eType==RBU_IDX_I
1a230 4e 53 45 52 54 0a 20 20 29 3b 0a 0a 20 20 2f 2a  NSERT.  );..  /*
1a240 20 49 66 20 74 68 69 73 20 69 73 20 61 20 64 65   If this is a de
1a250 6c 65 74 65 2c 20 64 65 63 72 65 6d 65 6e 74 20  lete, decrement 
1a260 6e 50 68 61 73 65 4f 6e 65 53 74 65 70 20 62 79  nPhaseOneStep by
1a270 20 6e 49 6e 64 65 78 2e 20 49 66 20 74 68 65 20   nIndex. If the 
1a280 44 45 4c 45 54 45 0a 20 20 2a 2a 20 73 74 61 74  DELETE.  ** stat
1a290 65 6d 65 6e 74 20 62 65 6c 6f 77 20 64 6f 65 73  ement below does
1a2a0 20 61 63 74 75 61 6c 6c 79 20 64 65 6c 65 74 65   actually delete
1a2b0 20 61 20 72 6f 77 2c 20 6e 50 68 61 73 65 4f 6e   a row, nPhaseOn
1a2c0 65 53 74 65 70 20 77 69 6c 6c 20 62 65 0a 20 20  eStep will be.  
1a2d0 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 62  ** incremented b
1a2e0 79 20 74 68 65 20 73 61 6d 65 20 61 6d 6f 75 6e  y the same amoun
1a2f0 74 20 77 68 65 6e 20 53 51 4c 20 66 75 6e 63 74  t when SQL funct
1a300 69 6f 6e 20 72 62 75 5f 74 6d 70 5f 69 6e 73 65  ion rbu_tmp_inse
1a310 72 74 28 29 0a 20 20 2a 2a 20 69 73 20 69 6e 76  rt().  ** is inv
1a320 6f 6b 65 64 20 62 79 20 74 68 65 20 74 72 69 67  oked by the trig
1a330 67 65 72 2e 20 20 2a 2f 0a 20 20 69 66 28 20 65  ger.  */.  if( e
1a340 54 79 70 65 3d 3d 52 42 55 5f 44 45 4c 45 54 45  Type==RBU_DELETE
1a350 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 50 68 61 73   ){.    p->nPhas
1a360 65 4f 6e 65 53 74 65 70 20 2d 3d 20 70 2d 3e 6f  eOneStep -= p->o
1a370 62 6a 69 74 65 72 2e 6e 49 6e 64 65 78 3b 0a 20  bjiter.nIndex;. 
1a380 20 7d 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d   }..  if( eType=
1a390 3d 52 42 55 5f 49 44 58 5f 44 45 4c 45 54 45 20  =RBU_IDX_DELETE 
1a3a0 7c 7c 20 65 54 79 70 65 3d 3d 52 42 55 5f 44 45  || eType==RBU_DE
1a3b0 4c 45 54 45 20 29 7b 0a 20 20 20 20 70 57 72 69  LETE ){.    pWri
1a3c0 74 65 72 20 3d 20 70 49 74 65 72 2d 3e 70 44 65  ter = pIter->pDe
1a3d0 6c 65 74 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  lete;.  }else{. 
1a3e0 20 20 20 70 57 72 69 74 65 72 20 3d 20 70 49 74     pWriter = pIt
1a3f0 65 72 2d 3e 70 49 6e 73 65 72 74 3b 0a 20 20 7d  er->pInsert;.  }
1a400 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ..  for(i=0; i<p
1a410 49 74 65 72 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29  Iter->nCol; i++)
1a420 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  {.    /* If this
1a430 20 69 73 20 61 6e 20 49 4e 53 45 52 54 20 69 6e   is an INSERT in
1a440 74 6f 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65  to a table b-tre
1a450 65 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20  e and the table 
1a460 68 61 73 20 61 6e 0a 20 20 20 20 2a 2a 20 65 78  has an.    ** ex
1a470 70 6c 69 63 69 74 20 49 4e 54 45 47 45 52 20 50  plicit INTEGER P
1a480 52 49 4d 41 52 59 20 4b 45 59 2c 20 63 68 65 63  RIMARY KEY, chec
1a490 6b 20 74 68 61 74 20 74 68 69 73 20 69 73 20 6e  k that this is n
1a4a0 6f 74 20 61 6e 20 61 74 74 65 6d 70 74 0a 20 20  ot an attempt.  
1a4b0 20 20 2a 2a 20 74 6f 20 77 72 69 74 65 20 61 20    ** to write a 
1a4c0 4e 55 4c 4c 20 69 6e 74 6f 20 74 68 65 20 49 50  NULL into the IP
1a4d0 4b 20 63 6f 6c 75 6d 6e 2e 20 54 68 61 74 20 69  K column. That i
1a4e0 73 20 6e 6f 74 20 70 65 72 6d 69 74 74 65 64 2e  s not permitted.
1a4f0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 54 79    */.    if( eTy
1a500 70 65 3d 3d 52 42 55 5f 49 4e 53 45 52 54 20 0a  pe==RBU_INSERT .
1a510 20 20 20 20 20 26 26 20 70 49 74 65 72 2d 3e 7a       && pIter->z
1a520 49 64 78 3d 3d 30 20 26 26 20 70 49 74 65 72 2d  Idx==0 && pIter-
1a530 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 49  >eType==RBU_PK_I
1a540 50 4b 20 26 26 20 70 49 74 65 72 2d 3e 61 62 54  PK && pIter->abT
1a550 62 6c 50 6b 5b 69 5d 20 0a 20 20 20 20 20 26 26  blPk[i] .     &&
1a560 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
1a570 74 79 70 65 28 70 49 74 65 72 2d 3e 70 53 65 6c  type(pIter->pSel
1a580 65 63 74 2c 20 69 29 3d 3d 53 51 4c 49 54 45 5f  ect, i)==SQLITE_
1a590 4e 55 4c 4c 0a 20 20 20 20 29 7b 0a 20 20 20 20  NULL.    ){.    
1a5a0 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
1a5b0 5f 4d 49 53 4d 41 54 43 48 3b 0a 20 20 20 20 20  _MISMATCH;.     
1a5c0 20 70 2d 3e 7a 45 72 72 6d 73 67 20 3d 20 73 71   p->zErrmsg = sq
1a5d0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 64  lite3_mprintf("d
1a5e0 61 74 61 74 79 70 65 20 6d 69 73 6d 61 74 63 68  atatype mismatch
1a5f0 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
1a600 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
1a610 20 65 54 79 70 65 3d 3d 52 42 55 5f 44 45 4c 45   eType==RBU_DELE
1a620 54 45 20 26 26 20 70 49 74 65 72 2d 3e 61 62 54  TE && pIter->abT
1a630 62 6c 50 6b 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20  blPk[i]==0 ){.  
1a640 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
1a650 20 20 7d 0a 0a 20 20 20 20 70 56 61 6c 20 3d 20    }..    pVal = 
1a660 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 76  sqlite3_column_v
1a670 61 6c 75 65 28 70 49 74 65 72 2d 3e 70 53 65 6c  alue(pIter->pSel
1a680 65 63 74 2c 20 69 29 3b 0a 20 20 20 20 70 2d 3e  ect, i);.    p->
1a690 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e  rc = sqlite3_bin
1a6a0 64 5f 76 61 6c 75 65 28 70 57 72 69 74 65 72 2c  d_value(pWriter,
1a6b0 20 69 2b 31 2c 20 70 56 61 6c 29 3b 0a 20 20 20   i+1, pVal);.   
1a6c0 20 69 66 28 20 70 2d 3e 72 63 20 29 20 72 65 74   if( p->rc ) ret
1a6d0 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  urn;.  }.  if( p
1a6e0 49 74 65 72 2d 3e 7a 49 64 78 3d 3d 30 20 29 7b  Iter->zIdx==0 ){
1a6f0 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e  .    if( pIter->
1a700 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 56 54  eType==RBU_PK_VT
1a710 41 42 20 0a 20 20 20 20 20 7c 7c 20 70 49 74 65  AB .     || pIte
1a720 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b  r->eType==RBU_PK
1a730 5f 4e 4f 4e 45 20 0a 20 20 20 20 20 7c 7c 20 28  _NONE .     || (
1a740 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42  pIter->eType==RB
1a750 55 5f 50 4b 5f 45 58 54 45 52 4e 41 4c 20 26 26  U_PK_EXTERNAL &&
1a760 20 72 62 75 49 73 56 61 63 75 75 6d 28 70 29 29   rbuIsVacuum(p))
1a770 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f   .    ){.      /
1a780 2a 20 46 6f 72 20 61 20 76 69 72 74 75 61 6c 20  * For a virtual 
1a790 74 61 62 6c 65 2c 20 6f 72 20 61 20 74 61 62 6c  table, or a tabl
1a7a0 65 20 77 69 74 68 20 6e 6f 20 70 72 69 6d 61 72  e with no primar
1a7b0 79 20 6b 65 79 2c 20 74 68 65 20 0a 20 20 20 20  y key, the .    
1a7c0 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74    ** SELECT stat
1a7d0 65 6d 65 6e 74 20 69 73 3a 0a 20 20 20 20 20 20  ement is:.      
1a7e0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 53 45  **.      **   SE
1a7f0 4c 45 43 54 20 3c 63 6f 6c 73 3e 2c 20 72 62 75  LECT <cols>, rbu
1a800 5f 63 6f 6e 74 72 6f 6c 2c 20 72 62 75 5f 72 6f  _control, rbu_ro
1a810 77 69 64 20 46 52 4f 4d 20 2e 2e 2e 2e 0a 20 20  wid FROM .....  
1a820 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
1a830 48 65 6e 63 65 20 63 6f 6c 75 6d 6e 5f 76 61 6c  Hence column_val
1a840 75 65 28 70 49 74 65 72 2d 3e 6e 43 6f 6c 2b 31  ue(pIter->nCol+1
1a850 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  )..      */.    
1a860 20 20 61 73 73 65 72 74 43 6f 6c 75 6d 6e 4e 61    assertColumnNa
1a870 6d 65 28 70 49 74 65 72 2d 3e 70 53 65 6c 65 63  me(pIter->pSelec
1a880 74 2c 20 70 49 74 65 72 2d 3e 6e 43 6f 6c 2b 31  t, pIter->nCol+1
1a890 2c 20 0a 20 20 20 20 20 20 20 20 20 20 72 62 75  , .          rbu
1a8a0 49 73 56 61 63 75 75 6d 28 70 29 20 3f 20 22 72  IsVacuum(p) ? "r
1a8b0 6f 77 69 64 22 20 3a 20 22 72 62 75 5f 72 6f 77  owid" : "rbu_row
1a8c0 69 64 22 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  id".      );.   
1a8d0 20 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65     pVal = sqlite
1a8e0 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28 70  3_column_value(p
1a8f0 49 74 65 72 2d 3e 70 53 65 6c 65 63 74 2c 20 70  Iter->pSelect, p
1a900 49 74 65 72 2d 3e 6e 43 6f 6c 2b 31 29 3b 0a 20  Iter->nCol+1);. 
1a910 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c       p->rc = sql
1a920 69 74 65 33 5f 62 69 6e 64 5f 76 61 6c 75 65 28  ite3_bind_value(
1a930 70 57 72 69 74 65 72 2c 20 70 49 74 65 72 2d 3e  pWriter, pIter->
1a940 6e 43 6f 6c 2b 31 2c 20 70 56 61 6c 29 3b 0a 20  nCol+1, pVal);. 
1a950 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
1a960 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
1a970 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
1a980 74 65 70 28 70 57 72 69 74 65 72 29 3b 0a 20 20  tep(pWriter);.  
1a990 20 20 70 2d 3e 72 63 20 3d 20 72 65 73 65 74 41    p->rc = resetA
1a9a0 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70  ndCollectError(p
1a9b0 57 72 69 74 65 72 2c 20 26 70 2d 3e 7a 45 72 72  Writer, &p->zErr
1a9c0 6d 73 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  msg);.  }.}../*.
1a9d0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1a9e0 20 64 6f 65 73 20 74 68 65 20 77 6f 72 6b 20 66   does the work f
1a9f0 6f 72 20 61 6e 20 73 71 6c 69 74 65 33 72 62 75  or an sqlite3rbu
1aa00 5f 73 74 65 70 28 29 20 63 61 6c 6c 2e 0a 2a 2a  _step() call..**
1aa10 0a 2a 2a 20 54 68 65 20 6f 62 6a 65 63 74 2d 69  .** The object-i
1aa20 74 65 72 61 74 6f 72 20 28 70 2d 3e 6f 62 6a 69  terator (p->obji
1aa30 74 65 72 29 20 63 75 72 72 65 6e 74 6c 79 20 70  ter) currently p
1aa40 6f 69 6e 74 73 20 74 6f 20 61 20 76 61 6c 69 64  oints to a valid
1aa50 20 6f 62 6a 65 63 74 2c 0a 2a 2a 20 61 6e 64 20   object,.** and 
1aa60 74 68 65 20 69 6e 70 75 74 20 63 75 72 73 6f 72  the input cursor
1aa70 20 28 70 2d 3e 6f 62 6a 69 74 65 72 2e 70 53 65   (p->objiter.pSe
1aa80 6c 65 63 74 29 20 63 75 72 72 65 6e 74 6c 79 20  lect) currently 
1aa90 70 6f 69 6e 74 73 20 74 6f 20 61 20 76 61 6c 69  points to a vali
1aaa0 64 0a 2a 2a 20 69 6e 70 75 74 20 72 6f 77 2e 20  d.** input row. 
1aab0 50 65 72 66 6f 72 6d 20 77 68 61 74 65 76 65 72  Perform whatever
1aac0 20 70 72 6f 63 65 73 73 69 6e 67 20 69 73 20 72   processing is r
1aad0 65 71 75 69 72 65 64 20 61 6e 64 20 72 65 74 75  equired and retu
1aae0 72 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20  rn..**.** If no 
1aaf0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 53   error occurs, S
1ab00 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
1ab10 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rned. Otherwise,
1ab20 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a   an error code.*
1ab30 2a 20 61 6e 64 20 6d 65 73 73 61 67 65 20 69 73  * and message is
1ab40 20 6c 65 66 74 20 69 6e 20 74 68 65 20 52 42 55   left in the RBU
1ab50 20 68 61 6e 64 6c 65 20 61 6e 64 20 61 20 63 6f   handle and a co
1ab60 70 79 20 6f 66 20 74 68 65 20 65 72 72 6f 72 20  py of the error 
1ab70 63 6f 64 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64  code.** returned
1ab80 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1ab90 72 62 75 53 74 65 70 28 73 71 6c 69 74 65 33 72  rbuStep(sqlite3r
1aba0 62 75 20 2a 70 29 7b 0a 20 20 52 62 75 4f 62 6a  bu *p){.  RbuObj
1abb0 49 74 65 72 20 2a 70 49 74 65 72 20 3d 20 26 70  Iter *pIter = &p
1abc0 2d 3e 6f 62 6a 69 74 65 72 3b 0a 20 20 63 6f 6e  ->objiter;.  con
1abd0 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 6b 20 3d  st char *zMask =
1abe0 20 30 3b 0a 20 20 69 6e 74 20 65 54 79 70 65 20   0;.  int eType 
1abf0 3d 20 72 62 75 53 74 65 70 54 79 70 65 28 70 2c  = rbuStepType(p,
1ac00 20 26 7a 4d 61 73 6b 29 3b 0a 0a 20 20 69 66 28   &zMask);..  if(
1ac10 20 65 54 79 70 65 20 29 7b 0a 20 20 20 20 61 73   eType ){.    as
1ac20 73 65 72 74 28 20 65 54 79 70 65 3d 3d 52 42 55  sert( eType==RBU
1ac30 5f 49 4e 53 45 52 54 20 20 20 20 20 7c 7c 20 65  _INSERT     || e
1ac40 54 79 70 65 3d 3d 52 42 55 5f 44 45 4c 45 54 45  Type==RBU_DELETE
1ac50 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 65 54 79  .         || eTy
1ac60 70 65 3d 3d 52 42 55 5f 52 45 50 4c 41 43 45 20  pe==RBU_REPLACE 
1ac70 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 52 42 55     || eType==RBU
1ac80 5f 49 44 58 5f 44 45 4c 45 54 45 0a 20 20 20 20  _IDX_DELETE.    
1ac90 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 52       || eType==R
1aca0 42 55 5f 49 44 58 5f 49 4e 53 45 52 54 20 7c 7c  BU_IDX_INSERT ||
1acb0 20 65 54 79 70 65 3d 3d 52 42 55 5f 55 50 44 41   eType==RBU_UPDA
1acc0 54 45 0a 20 20 20 20 29 3b 0a 20 20 20 20 61 73  TE.    );.    as
1acd0 73 65 72 74 28 20 65 54 79 70 65 21 3d 52 42 55  sert( eType!=RBU
1ace0 5f 55 50 44 41 54 45 20 7c 7c 20 70 49 74 65 72  _UPDATE || pIter
1acf0 2d 3e 7a 49 64 78 3d 3d 30 20 29 3b 0a 0a 20 20  ->zIdx==0 );..  
1ad00 20 20 69 66 28 20 70 49 74 65 72 2d 3e 7a 49 64    if( pIter->zId
1ad10 78 3d 3d 30 20 26 26 20 28 65 54 79 70 65 3d 3d  x==0 && (eType==
1ad20 52 42 55 5f 49 44 58 5f 44 45 4c 45 54 45 20 7c  RBU_IDX_DELETE |
1ad30 7c 20 65 54 79 70 65 3d 3d 52 42 55 5f 49 44 58  | eType==RBU_IDX
1ad40 5f 49 4e 53 45 52 54 29 20 29 7b 0a 20 20 20 20  _INSERT) ){.    
1ad50 20 20 72 62 75 42 61 64 43 6f 6e 74 72 6f 6c 45    rbuBadControlE
1ad60 72 72 6f 72 28 70 29 3b 0a 20 20 20 20 7d 0a 20  rror(p);.    }. 
1ad70 20 20 20 65 6c 73 65 20 69 66 28 20 65 54 79 70     else if( eTyp
1ad80 65 3d 3d 52 42 55 5f 52 45 50 4c 41 43 45 20 29  e==RBU_REPLACE )
1ad90 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  {.      if( pIte
1ada0 72 2d 3e 7a 49 64 78 3d 3d 30 20 29 7b 0a 20 20  r->zIdx==0 ){.  
1adb0 20 20 20 20 20 20 70 2d 3e 6e 50 68 61 73 65 4f        p->nPhaseO
1adc0 6e 65 53 74 65 70 20 2b 3d 20 70 2d 3e 6f 62 6a  neStep += p->obj
1add0 69 74 65 72 2e 6e 49 6e 64 65 78 3b 0a 20 20 20  iter.nIndex;.   
1ade0 20 20 20 20 20 72 62 75 53 74 65 70 4f 6e 65 4f       rbuStepOneO
1adf0 70 28 70 2c 20 52 42 55 5f 44 45 4c 45 54 45 29  p(p, RBU_DELETE)
1ae00 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1ae10 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
1ae20 45 5f 4f 4b 20 29 20 72 62 75 53 74 65 70 4f 6e  E_OK ) rbuStepOn
1ae30 65 4f 70 28 70 2c 20 52 42 55 5f 49 4e 53 45 52  eOp(p, RBU_INSER
1ae40 54 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c  T);.    }.    el
1ae50 73 65 20 69 66 28 20 65 54 79 70 65 21 3d 52 42  se if( eType!=RB
1ae60 55 5f 55 50 44 41 54 45 20 29 7b 0a 20 20 20 20  U_UPDATE ){.    
1ae70 20 20 72 62 75 53 74 65 70 4f 6e 65 4f 70 28 70    rbuStepOneOp(p
1ae80 2c 20 65 54 79 70 65 29 3b 0a 20 20 20 20 7d 0a  , eType);.    }.
1ae90 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20      else{.      
1aea0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
1aeb0 56 61 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Val;.      sqlit
1aec0 65 33 5f 73 74 6d 74 20 2a 70 55 70 64 61 74 65  e3_stmt *pUpdate
1aed0 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65   = 0;.      asse
1aee0 72 74 28 20 65 54 79 70 65 3d 3d 52 42 55 5f 55  rt( eType==RBU_U
1aef0 50 44 41 54 45 20 29 3b 0a 20 20 20 20 20 20 70  PDATE );.      p
1af00 2d 3e 6e 50 68 61 73 65 4f 6e 65 53 74 65 70 20  ->nPhaseOneStep 
1af10 2d 3d 20 70 2d 3e 6f 62 6a 69 74 65 72 2e 6e 49  -= p->objiter.nI
1af20 6e 64 65 78 3b 0a 20 20 20 20 20 20 72 62 75 47  ndex;.      rbuG
1af30 65 74 55 70 64 61 74 65 53 74 6d 74 28 70 2c 20  etUpdateStmt(p, 
1af40 70 49 74 65 72 2c 20 7a 4d 61 73 6b 2c 20 26 70  pIter, zMask, &p
1af50 55 70 64 61 74 65 29 3b 0a 20 20 20 20 20 20 69  Update);.      i
1af60 66 28 20 70 55 70 64 61 74 65 20 29 7b 0a 20 20  f( pUpdate ){.  
1af70 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
1af80 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 70 2d       for(i=0; p-
1af90 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
1afa0 26 20 69 3c 70 49 74 65 72 2d 3e 6e 43 6f 6c 3b  & i<pIter->nCol;
1afb0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
1afc0 20 63 68 61 72 20 63 20 3d 20 7a 4d 61 73 6b 5b   char c = zMask[
1afd0 70 49 74 65 72 2d 3e 61 69 53 72 63 4f 72 64 65  pIter->aiSrcOrde
1afe0 72 5b 69 5d 5d 3b 0a 20 20 20 20 20 20 20 20 20  r[i]];.         
1aff0 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f   pVal = sqlite3_
1b000 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28 70 49 74  column_value(pIt
1b010 65 72 2d 3e 70 53 65 6c 65 63 74 2c 20 69 29 3b  er->pSelect, i);
1b020 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
1b030 49 74 65 72 2d 3e 61 62 54 62 6c 50 6b 5b 69 5d  Iter->abTblPk[i]
1b040 20 7c 7c 20 63 21 3d 27 2e 27 20 29 7b 0a 20 20   || c!='.' ){.  
1b050 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20            p->rc 
1b060 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 76  = sqlite3_bind_v
1b070 61 6c 75 65 28 70 55 70 64 61 74 65 2c 20 69 2b  alue(pUpdate, i+
1b080 31 2c 20 70 56 61 6c 29 3b 0a 20 20 20 20 20 20  1, pVal);.      
1b090 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
1b0a0 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72          if( p->r
1b0b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a 20 20  c==SQLITE_OK .  
1b0c0 20 20 20 20 20 20 20 26 26 20 28 70 49 74 65 72         && (pIter
1b0d0 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f  ->eType==RBU_PK_
1b0e0 56 54 41 42 20 7c 7c 20 70 49 74 65 72 2d 3e 65  VTAB || pIter->e
1b0f0 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 4e 4f 4e  Type==RBU_PK_NON
1b100 45 29 20 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  E) .        ){. 
1b110 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 6e 64           /* Bind
1b120 20 74 68 65 20 72 62 75 5f 72 6f 77 69 64 20 76   the rbu_rowid v
1b130 61 6c 75 65 20 74 6f 20 63 6f 6c 75 6d 6e 20 5f  alue to column _
1b140 72 6f 77 69 64 5f 20 2a 2f 0a 20 20 20 20 20 20  rowid_ */.      
1b150 20 20 20 20 61 73 73 65 72 74 43 6f 6c 75 6d 6e      assertColumn
1b160 4e 61 6d 65 28 70 49 74 65 72 2d 3e 70 53 65 6c  Name(pIter->pSel
1b170 65 63 74 2c 20 70 49 74 65 72 2d 3e 6e 43 6f 6c  ect, pIter->nCol
1b180 2b 31 2c 20 22 72 62 75 5f 72 6f 77 69 64 22 29  +1, "rbu_rowid")
1b190 3b 0a 20 20 20 20 20 20 20 20 20 20 70 56 61 6c  ;.          pVal
1b1a0 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
1b1b0 6e 5f 76 61 6c 75 65 28 70 49 74 65 72 2d 3e 70  n_value(pIter->p
1b1c0 53 65 6c 65 63 74 2c 20 70 49 74 65 72 2d 3e 6e  Select, pIter->n
1b1d0 43 6f 6c 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  Col+1);.        
1b1e0 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65    p->rc = sqlite
1b1f0 33 5f 62 69 6e 64 5f 76 61 6c 75 65 28 70 55 70  3_bind_value(pUp
1b200 64 61 74 65 2c 20 70 49 74 65 72 2d 3e 6e 43 6f  date, pIter->nCo
1b210 6c 2b 31 2c 20 70 56 61 6c 29 3b 0a 20 20 20 20  l+1, pVal);.    
1b220 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
1b230 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
1b240 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
1b250 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 55 70  sqlite3_step(pUp
1b260 64 61 74 65 29 3b 0a 20 20 20 20 20 20 20 20 20  date);.         
1b270 20 70 2d 3e 72 63 20 3d 20 72 65 73 65 74 41 6e   p->rc = resetAn
1b280 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 55  dCollectError(pU
1b290 70 64 61 74 65 2c 20 26 70 2d 3e 7a 45 72 72 6d  pdate, &p->zErrm
1b2a0 73 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  sg);.        }. 
1b2b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1b2c0 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 3b  .  return p->rc;
1b2d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d  .}../*.** Increm
1b2e0 65 6e 74 20 74 68 65 20 73 63 68 65 6d 61 20 63  ent the schema c
1b2f0 6f 6f 6b 69 65 20 6f 66 20 74 68 65 20 6d 61 69  ookie of the mai
1b300 6e 20 64 61 74 61 62 61 73 65 20 6f 70 65 6e 65  n database opene
1b310 64 20 62 79 20 70 2d 3e 64 62 4d 61 69 6e 2e 0a  d by p->dbMain..
1b320 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68 69  **.** Or, if thi
1b330 73 20 69 73 20 61 6e 20 52 42 55 20 76 61 63 75  s is an RBU vacu
1b340 75 6d 2c 20 73 65 74 20 74 68 65 20 73 63 68 65  um, set the sche
1b350 6d 61 20 63 6f 6f 6b 69 65 20 6f 66 20 74 68 65  ma cookie of the
1b360 20 6d 61 69 6e 20 64 62 0a 2a 2a 20 6f 70 65 6e   main db.** open
1b370 65 64 20 62 79 20 70 2d 3e 64 62 4d 61 69 6e 20  ed by p->dbMain 
1b380 74 6f 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e  to one more than
1b390 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b   the schema cook
1b3a0 69 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 0a 2a  ie of the main.*
1b3b0 2a 20 64 62 20 6f 70 65 6e 65 64 20 62 79 20 70  * db opened by p
1b3c0 2d 3e 64 62 52 62 75 2e 0a 2a 2f 0a 73 74 61 74  ->dbRbu..*/.stat
1b3d0 69 63 20 76 6f 69 64 20 72 62 75 49 6e 63 72 53  ic void rbuIncrS
1b3e0 63 68 65 6d 61 43 6f 6f 6b 69 65 28 73 71 6c 69  chemaCookie(sqli
1b3f0 74 65 33 72 62 75 20 2a 70 29 7b 0a 20 20 69 66  te3rbu *p){.  if
1b400 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
1b410 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
1b420 33 20 2a 64 62 72 65 61 64 20 3d 20 28 72 62 75  3 *dbread = (rbu
1b430 49 73 56 61 63 75 75 6d 28 70 29 20 3f 20 70 2d  IsVacuum(p) ? p-
1b440 3e 64 62 52 62 75 20 3a 20 70 2d 3e 64 62 4d 61  >dbRbu : p->dbMa
1b450 69 6e 29 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f  in);.    int iCo
1b460 6f 6b 69 65 20 3d 20 31 30 30 30 30 30 30 3b 0a  okie = 1000000;.
1b470 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
1b480 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 20 20 70 2d   *pStmt;..    p-
1b490 3e 72 63 20 3d 20 70 72 65 70 61 72 65 41 6e 64  >rc = prepareAnd
1b4a0 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 64 62 72  CollectError(dbr
1b4b0 65 61 64 2c 20 26 70 53 74 6d 74 2c 20 26 70 2d  ead, &pStmt, &p-
1b4c0 3e 7a 45 72 72 6d 73 67 2c 20 0a 20 20 20 20 20  >zErrmsg, .     
1b4d0 20 20 20 22 50 52 41 47 4d 41 20 73 63 68 65 6d     "PRAGMA schem
1b4e0 61 5f 76 65 72 73 69 6f 6e 22 0a 20 20 20 20 29  a_version".    )
1b4f0 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d  ;.    if( p->rc=
1b500 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1b510 20 20 20 20 2f 2a 20 43 6f 76 65 72 61 67 65 3a      /* Coverage:
1b520 20 69 74 20 6d 61 79 20 62 65 20 74 68 61 74 20   it may be that 
1b530 74 68 69 73 20 73 71 6c 69 74 65 33 5f 73 74 65  this sqlite3_ste
1b540 70 28 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e  p() cannot fail.
1b550 20 54 68 65 72 65 0a 20 20 20 20 20 20 2a 2a 20   There.      ** 
1b560 69 73 20 61 6c 72 65 61 64 79 20 61 20 74 72 61  is already a tra
1b570 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 73  nsaction open, s
1b580 6f 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73  o the prepared s
1b590 74 61 74 65 6d 65 6e 74 20 63 61 6e 6e 6f 74 0a  tatement cannot.
1b5a0 20 20 20 20 20 20 2a 2a 20 74 68 72 6f 77 20 61        ** throw a
1b5b0 6e 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 20  n SQLITE_SCHEMA 
1b5c0 65 78 63 65 70 74 69 6f 6e 2e 20 54 68 65 20 6f  exception. The o
1b5d0 6e 6c 79 20 64 61 74 61 62 61 73 65 20 70 61 67  nly database pag
1b5e0 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 73  e the.      ** s
1b5f0 74 61 74 65 6d 65 6e 74 20 72 65 61 64 73 20 69  tatement reads i
1b600 73 20 70 61 67 65 20 31 2c 20 77 68 69 63 68 20  s page 1, which 
1b610 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
1b620 20 62 65 20 69 6e 20 74 68 65 20 63 61 63 68 65   be in the cache
1b630 2e 0a 20 20 20 20 20 20 2a 2a 20 41 6e 64 20 6e  ..      ** And n
1b640 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  o memory allocat
1b650 69 6f 6e 73 20 61 72 65 20 72 65 71 75 69 72 65  ions are require
1b660 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  d.  */.      if(
1b670 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
1b680 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
1b690 20 29 7b 0a 20 20 20 20 20 20 20 20 69 43 6f 6f   ){.        iCoo
1b6a0 6b 69 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  kie = sqlite3_co
1b6b0 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20  lumn_int(pStmt, 
1b6c0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
1b6d0 20 20 72 62 75 46 69 6e 61 6c 69 7a 65 28 70 2c    rbuFinalize(p,
1b6e0 20 70 53 74 6d 74 29 3b 0a 20 20 20 20 7d 0a 20   pStmt);.    }. 
1b6f0 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
1b700 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1b710 20 72 62 75 4d 50 72 69 6e 74 66 45 78 65 63 28   rbuMPrintfExec(
1b720 70 2c 20 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 50  p, p->dbMain, "P
1b730 52 41 47 4d 41 20 73 63 68 65 6d 61 5f 76 65 72  RAGMA schema_ver
1b740 73 69 6f 6e 20 3d 20 25 64 22 2c 20 69 43 6f 6f  sion = %d", iCoo
1b750 6b 69 65 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20  kie+1);.    }.  
1b760 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74  }.}../*.** Updat
1b770 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  e the contents o
1b780 66 20 74 68 65 20 72 62 75 5f 73 74 61 74 65 20  f the rbu_state 
1b790 74 61 62 6c 65 20 77 69 74 68 69 6e 20 74 68 65  table within the
1b7a0 20 72 62 75 20 64 61 74 61 62 61 73 65 2e 20 54   rbu database. T
1b7b0 68 65 0a 2a 2a 20 76 61 6c 75 65 20 73 74 6f 72  he.** value stor
1b7c0 65 64 20 69 6e 20 74 68 65 20 52 42 55 5f 53 54  ed in the RBU_ST
1b7d0 41 54 45 5f 53 54 41 47 45 20 63 6f 6c 75 6d 6e  ATE_STAGE column
1b7e0 20 69 73 20 65 53 74 61 67 65 2e 20 41 6c 6c 20   is eStage. All 
1b7f0 6f 74 68 65 72 20 76 61 6c 75 65 73 0a 2a 2a 20  other values.** 
1b800 61 72 65 20 64 65 74 65 72 6d 69 6e 65 64 20 62  are determined b
1b810 79 20 69 6e 73 70 65 63 74 69 6e 67 20 74 68 65  y inspecting the
1b820 20 72 62 75 20 68 61 6e 64 6c 65 20 70 61 73 73   rbu handle pass
1b830 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
1b840 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61  argument..*/.sta
1b850 74 69 63 20 76 6f 69 64 20 72 62 75 53 61 76 65  tic void rbuSave
1b860 53 74 61 74 65 28 73 71 6c 69 74 65 33 72 62 75  State(sqlite3rbu
1b870 20 2a 70 2c 20 69 6e 74 20 65 53 74 61 67 65 29   *p, int eStage)
1b880 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  {.  if( p->rc==S
1b890 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72  QLITE_OK || p->r
1b8a0 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
1b8b0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  {.    sqlite3_st
1b8c0 6d 74 20 2a 70 49 6e 73 65 72 74 20 3d 20 30 3b  mt *pInsert = 0;
1b8d0 0a 20 20 20 20 72 62 75 5f 66 69 6c 65 20 2a 70  .    rbu_file *p
1b8e0 46 64 20 3d 20 28 72 62 75 49 73 56 61 63 75 75  Fd = (rbuIsVacuu
1b8f0 6d 28 70 29 20 3f 20 70 2d 3e 70 52 62 75 46 64  m(p) ? p->pRbuFd
1b900 20 3a 20 70 2d 3e 70 54 61 72 67 65 74 46 64 29   : p->pTargetFd)
1b910 3b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 0a 20  ;.    int rc;.. 
1b920 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 7a 45     assert( p->zE
1b930 72 72 6d 73 67 3d 3d 30 20 29 3b 0a 20 20 20 20  rrmsg==0 );.    
1b940 72 63 20 3d 20 70 72 65 70 61 72 65 46 72 65 65  rc = prepareFree
1b950 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28  AndCollectError(
1b960 70 2d 3e 64 62 52 62 75 2c 20 26 70 49 6e 73 65  p->dbRbu, &pInse
1b970 72 74 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c  rt, &p->zErrmsg,
1b980 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65   .        sqlite
1b990 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20  3_mprintf(.     
1b9a0 20 20 20 20 20 22 49 4e 53 45 52 54 20 4f 52 20       "INSERT OR 
1b9b0 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 25 73 2e  REPLACE INTO %s.
1b9c0 72 62 75 5f 73 74 61 74 65 28 6b 2c 20 76 29 20  rbu_state(k, v) 
1b9d0 56 41 4c 55 45 53 20 22 0a 20 20 20 20 20 20 20  VALUES ".       
1b9e0 20 20 20 22 28 25 64 2c 20 25 64 29 2c 20 22 0a     "(%d, %d), ".
1b9f0 20 20 20 20 20 20 20 20 20 20 22 28 25 64 2c 20            "(%d, 
1ba00 25 51 29 2c 20 22 0a 20 20 20 20 20 20 20 20 20  %Q), ".         
1ba10 20 22 28 25 64 2c 20 25 51 29 2c 20 22 0a 20 20   "(%d, %Q), ".  
1ba20 20 20 20 20 20 20 20 20 22 28 25 64 2c 20 25 64          "(%d, %d
1ba30 29 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 22  ), ".          "
1ba40 28 25 64 2c 20 25 64 29 2c 20 22 0a 20 20 20 20  (%d, %d), ".    
1ba50 20 20 20 20 20 20 22 28 25 64 2c 20 25 6c 6c 64        "(%d, %lld
1ba60 29 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 22  ), ".          "
1ba70 28 25 64 2c 20 25 6c 6c 64 29 2c 20 22 0a 20 20  (%d, %lld), ".  
1ba80 20 20 20 20 20 20 20 20 22 28 25 64 2c 20 25 6c          "(%d, %l
1ba90 6c 64 29 2c 20 22 0a 20 20 20 20 20 20 20 20 20  ld), ".         
1baa0 20 22 28 25 64 2c 20 25 6c 6c 64 29 2c 20 22 0a   "(%d, %lld), ".
1bab0 20 20 20 20 20 20 20 20 20 20 22 28 25 64 2c 20            "(%d, 
1bac0 25 51 29 20 20 22 2c 0a 20 20 20 20 20 20 20 20  %Q)  ",.        
1bad0 20 20 70 2d 3e 7a 53 74 61 74 65 44 62 2c 0a 20    p->zStateDb,. 
1bae0 20 20 20 20 20 20 20 20 20 52 42 55 5f 53 54 41           RBU_STA
1baf0 54 45 5f 53 54 41 47 45 2c 20 65 53 74 61 67 65  TE_STAGE, eStage
1bb00 2c 0a 20 20 20 20 20 20 20 20 20 20 52 42 55 5f  ,.          RBU_
1bb10 53 54 41 54 45 5f 54 42 4c 2c 20 70 2d 3e 6f 62  STATE_TBL, p->ob
1bb20 6a 69 74 65 72 2e 7a 54 62 6c 2c 20 0a 20 20 20  jiter.zTbl, .   
1bb30 20 20 20 20 20 20 20 52 42 55 5f 53 54 41 54 45         RBU_STATE
1bb40 5f 49 44 58 2c 20 70 2d 3e 6f 62 6a 69 74 65 72  _IDX, p->objiter
1bb50 2e 7a 49 64 78 2c 20 0a 20 20 20 20 20 20 20 20  .zIdx, .        
1bb60 20 20 52 42 55 5f 53 54 41 54 45 5f 52 4f 57 2c    RBU_STATE_ROW,
1bb70 20 70 2d 3e 6e 53 74 65 70 2c 20 0a 20 20 20 20   p->nStep, .    
1bb80 20 20 20 20 20 20 52 42 55 5f 53 54 41 54 45 5f        RBU_STATE_
1bb90 50 52 4f 47 52 45 53 53 2c 20 70 2d 3e 6e 50 72  PROGRESS, p->nPr
1bba0 6f 67 72 65 73 73 2c 0a 20 20 20 20 20 20 20 20  ogress,.        
1bbb0 20 20 52 42 55 5f 53 54 41 54 45 5f 43 4b 50 54    RBU_STATE_CKPT
1bbc0 2c 20 70 2d 3e 69 57 61 6c 43 6b 73 75 6d 2c 0a  , p->iWalCksum,.
1bbd0 20 20 20 20 20 20 20 20 20 20 52 42 55 5f 53 54            RBU_ST
1bbe0 41 54 45 5f 43 4f 4f 4b 49 45 2c 20 28 69 36 34  ATE_COOKIE, (i64
1bbf0 29 70 46 64 2d 3e 69 43 6f 6f 6b 69 65 2c 0a 20  )pFd->iCookie,. 
1bc00 20 20 20 20 20 20 20 20 20 52 42 55 5f 53 54 41           RBU_STA
1bc10 54 45 5f 4f 41 4c 53 5a 2c 20 70 2d 3e 69 4f 61  TE_OALSZ, p->iOa
1bc20 6c 53 7a 2c 0a 20 20 20 20 20 20 20 20 20 20 52  lSz,.          R
1bc30 42 55 5f 53 54 41 54 45 5f 50 48 41 53 45 4f 4e  BU_STATE_PHASEON
1bc40 45 53 54 45 50 2c 20 70 2d 3e 6e 50 68 61 73 65  ESTEP, p->nPhase
1bc50 4f 6e 65 53 74 65 70 2c 0a 20 20 20 20 20 20 20  OneStep,.       
1bc60 20 20 20 52 42 55 5f 53 54 41 54 45 5f 44 41 54     RBU_STATE_DAT
1bc70 41 54 42 4c 2c 20 70 2d 3e 6f 62 6a 69 74 65 72  ATBL, p->objiter
1bc80 2e 7a 44 61 74 61 54 62 6c 0a 20 20 20 20 20 20  .zDataTbl.      
1bc90 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 61 73 73  ).    );.    ass
1bca0 65 72 74 28 20 70 49 6e 73 65 72 74 3d 3d 30 20  ert( pInsert==0 
1bcb0 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  || rc==SQLITE_OK
1bcc0 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d   );..    if( rc=
1bcd0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1bce0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70      sqlite3_step
1bcf0 28 70 49 6e 73 65 72 74 29 3b 0a 20 20 20 20 20  (pInsert);.     
1bd00 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69   rc = sqlite3_fi
1bd10 6e 61 6c 69 7a 65 28 70 49 6e 73 65 72 74 29 3b  nalize(pInsert);
1bd20 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
1bd30 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70  c!=SQLITE_OK ) p
1bd40 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 7d 0a 7d  ->rc = rc;.  }.}
1bd50 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 63  .../*.** The sec
1bd60 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 70 61 73  ond argument pas
1bd70 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63  sed to this func
1bd80 74 69 6f 6e 20 69 73 20 74 68 65 20 6e 61 6d 65  tion is the name
1bd90 20 6f 66 20 61 20 50 52 41 47 4d 41 20 0a 2a 2a   of a PRAGMA .**
1bda0 20 73 65 74 74 69 6e 67 20 2d 20 22 70 61 67 65   setting - "page
1bdb0 5f 73 69 7a 65 22 2c 20 22 61 75 74 6f 5f 76 61  _size", "auto_va
1bdc0 63 75 75 6d 22 2c 20 22 75 73 65 72 5f 76 65 72  cuum", "user_ver
1bdd0 73 69 6f 6e 22 20 6f 72 20 22 61 70 70 6c 69 63  sion" or "applic
1bde0 61 74 69 6f 6e 5f 69 64 22 2e 0a 2a 2a 20 54 68  ation_id"..** Th
1bdf0 69 73 20 66 75 6e 63 74 69 6f 6e 20 65 78 65 63  is function exec
1be00 75 74 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69  utes the followi
1be10 6e 67 20 6f 6e 20 73 71 6c 69 74 65 33 72 62 75  ng on sqlite3rbu
1be20 2e 64 62 52 62 75 3a 0a 2a 2a 0a 2a 2a 20 20 20  .dbRbu:.**.**   
1be30 22 50 52 41 47 4d 41 20 6d 61 69 6e 2e 24 7a 50  "PRAGMA main.$zP
1be40 72 61 67 6d 61 22 0a 2a 2a 0a 2a 2a 20 77 68 65  ragma".**.** whe
1be50 72 65 20 24 7a 50 72 61 67 6d 61 20 69 73 20 74  re $zPragma is t
1be60 68 65 20 73 74 72 69 6e 67 20 70 61 73 73 65 64  he string passed
1be70 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
1be80 72 67 75 6d 65 6e 74 2c 20 74 68 65 6e 0a 2a 2a  rgument, then.**
1be90 20 6f 6e 20 73 71 6c 69 74 65 33 72 62 75 2e 64   on sqlite3rbu.d
1bea0 62 4d 61 69 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 22  bMain:.**.**   "
1beb0 50 52 41 47 4d 41 20 6d 61 69 6e 2e 24 7a 50 72  PRAGMA main.$zPr
1bec0 61 67 6d 61 20 3d 20 24 76 61 6c 22 0a 2a 2a 0a  agma = $val".**.
1bed0 2a 2a 20 77 68 65 72 65 20 24 76 61 6c 20 69 73  ** where $val is
1bee0 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   the value retur
1bef0 6e 65 64 20 62 79 20 74 68 65 20 66 69 72 73 74  ned by the first
1bf00 20 50 52 41 47 4d 41 20 69 6e 76 6f 63 61 74 69   PRAGMA invocati
1bf10 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 73 68 6f  on..**.** In sho
1bf20 72 74 2c 20 69 74 20 63 6f 70 69 65 73 20 74 68  rt, it copies th
1bf30 65 20 76 61 6c 75 65 20 20 6f 66 20 74 68 65 20  e value  of the 
1bf40 73 70 65 63 69 66 69 65 64 20 50 52 41 47 4d 41  specified PRAGMA
1bf50 20 73 65 74 74 69 6e 67 20 66 72 6f 6d 0a 2a 2a   setting from.**
1bf60 20 64 62 52 62 75 20 74 6f 20 64 62 4d 61 69 6e   dbRbu to dbMain
1bf70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1bf80 20 72 62 75 43 6f 70 79 50 72 61 67 6d 61 28 73   rbuCopyPragma(s
1bf90 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 63 6f  qlite3rbu *p, co
1bfa0 6e 73 74 20 63 68 61 72 20 2a 7a 50 72 61 67 6d  nst char *zPragm
1bfb0 61 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  a){.  if( p->rc=
1bfc0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1bfd0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
1bfe0 70 50 72 61 67 6d 61 20 3d 20 30 3b 0a 20 20 20  pPragma = 0;.   
1bff0 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65   p->rc = prepare
1c000 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72  FreeAndCollectEr
1c010 72 6f 72 28 70 2d 3e 64 62 52 62 75 2c 20 26 70  ror(p->dbRbu, &p
1c020 50 72 61 67 6d 61 2c 20 26 70 2d 3e 7a 45 72 72  Pragma, &p->zErr
1c030 6d 73 67 2c 20 0a 20 20 20 20 20 20 20 20 73 71  msg, .        sq
1c040 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 50  lite3_mprintf("P
1c050 52 41 47 4d 41 20 6d 61 69 6e 2e 25 73 22 2c 20  RAGMA main.%s", 
1c060 7a 50 72 61 67 6d 61 29 0a 20 20 20 20 29 3b 0a  zPragma).    );.
1c070 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
1c080 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49  QLITE_OK && SQLI
1c090 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
1c0a0 73 74 65 70 28 70 50 72 61 67 6d 61 29 20 29 7b  step(pPragma) ){
1c0b0 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72  .      p->rc = r
1c0c0 62 75 4d 50 72 69 6e 74 66 45 78 65 63 28 70 2c  buMPrintfExec(p,
1c0d0 20 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 50 52 41   p->dbMain, "PRA
1c0e0 47 4d 41 20 6d 61 69 6e 2e 25 73 20 3d 20 25 64  GMA main.%s = %d
1c0f0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 7a 50 72  ",.          zPr
1c100 61 67 6d 61 2c 20 73 71 6c 69 74 65 33 5f 63 6f  agma, sqlite3_co
1c110 6c 75 6d 6e 5f 69 6e 74 28 70 50 72 61 67 6d 61  lumn_int(pPragma
1c120 2c 20 30 29 0a 20 20 20 20 20 20 29 3b 0a 20 20  , 0).      );.  
1c130 20 20 7d 0a 20 20 20 20 72 62 75 46 69 6e 61 6c    }.    rbuFinal
1c140 69 7a 65 28 70 2c 20 70 50 72 61 67 6d 61 29 3b  ize(p, pPragma);
1c150 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
1c160 65 20 52 42 55 20 68 61 6e 64 6c 65 20 70 61 73  e RBU handle pas
1c170 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20  sed as the only 
1c180 61 72 67 75 6d 65 6e 74 20 68 61 73 20 6a 75 73  argument has jus
1c190 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 61 6e  t been opened an
1c1a0 64 20 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20  d .** the state 
1c1b0 64 61 74 61 62 61 73 65 20 69 73 20 65 6d 70 74  database is empt
1c1c0 79 2e 20 49 66 20 74 68 69 73 20 52 42 55 20 68  y. If this RBU h
1c1d0 61 6e 64 6c 65 20 77 61 73 20 6f 70 65 6e 65 64  andle was opened
1c1e0 20 66 6f 72 20 61 6e 0a 2a 2a 20 52 42 55 20 76   for an.** RBU v
1c1f0 61 63 75 75 6d 20 6f 70 65 72 61 74 69 6f 6e 2c  acuum operation,
1c200 20 63 72 65 61 74 65 20 74 68 65 20 73 63 68 65   create the sche
1c210 6d 61 20 69 6e 20 74 68 65 20 74 61 72 67 65 74  ma in the target
1c220 20 64 62 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76   db..*/.static v
1c230 6f 69 64 20 72 62 75 43 72 65 61 74 65 54 61 72  oid rbuCreateTar
1c240 67 65 74 53 63 68 65 6d 61 28 73 71 6c 69 74 65  getSchema(sqlite
1c250 33 72 62 75 20 2a 70 29 7b 0a 20 20 73 71 6c 69  3rbu *p){.  sqli
1c260 74 65 33 5f 73 74 6d 74 20 2a 70 53 71 6c 20 3d  te3_stmt *pSql =
1c270 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   0;.  sqlite3_st
1c280 6d 74 20 2a 70 49 6e 73 65 72 74 20 3d 20 30 3b  mt *pInsert = 0;
1c290 0a 0a 20 20 61 73 73 65 72 74 28 20 72 62 75 49  ..  assert( rbuI
1c2a0 73 56 61 63 75 75 6d 28 70 29 20 29 3b 0a 20 20  sVacuum(p) );.  
1c2b0 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  p->rc = sqlite3_
1c2c0 65 78 65 63 28 70 2d 3e 64 62 4d 61 69 6e 2c 20  exec(p->dbMain, 
1c2d0 22 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65  "PRAGMA writable
1c2e0 5f 73 63 68 65 6d 61 3d 31 22 2c 20 30 2c 30 2c  _schema=1", 0,0,
1c2f0 20 26 70 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a 20   &p->zErrmsg);. 
1c300 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
1c310 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d 3e  TE_OK ){.    p->
1c320 72 63 20 3d 20 70 72 65 70 61 72 65 41 6e 64 43  rc = prepareAndC
1c330 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64  ollectError(p->d
1c340 62 52 62 75 2c 20 26 70 53 71 6c 2c 20 26 70 2d  bRbu, &pSql, &p-
1c350 3e 7a 45 72 72 6d 73 67 2c 20 0a 20 20 20 20 20  >zErrmsg, .     
1c360 20 22 53 45 4c 45 43 54 20 73 71 6c 20 46 52 4f   "SELECT sql FRO
1c370 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  M sqlite_master 
1c380 57 48 45 52 45 20 73 71 6c 21 3d 27 27 20 41 4e  WHERE sql!='' AN
1c390 44 20 72 6f 6f 74 70 61 67 65 21 3d 30 22 0a 20  D rootpage!=0". 
1c3a0 20 20 20 20 20 22 20 41 4e 44 20 6e 61 6d 65 21       " AND name!
1c3b0 3d 27 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63  ='sqlite_sequenc
1c3c0 65 27 20 22 0a 20 20 20 20 20 20 22 20 4f 52 44  e' ".      " ORD
1c3d0 45 52 20 42 59 20 74 79 70 65 20 44 45 53 43 22  ER BY type DESC"
1c3e0 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 77  .    );.  }..  w
1c3f0 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  hile( p->rc==SQL
1c400 49 54 45 5f 4f 4b 20 26 26 20 73 71 6c 69 74 65  ITE_OK && sqlite
1c410 33 5f 73 74 65 70 28 70 53 71 6c 29 3d 3d 53 51  3_step(pSql)==SQ
1c420 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20  LITE_ROW ){.    
1c430 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
1c440 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
1c450 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
1c460 65 78 74 28 70 53 71 6c 2c 20 30 29 3b 0a 20 20  ext(pSql, 0);.  
1c470 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65    p->rc = sqlite
1c480 33 5f 65 78 65 63 28 70 2d 3e 64 62 4d 61 69 6e  3_exec(p->dbMain
1c490 2c 20 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 26 70  , zSql, 0, 0, &p
1c4a0 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a 20 20 7d 0a  ->zErrmsg);.  }.
1c4b0 20 20 72 62 75 46 69 6e 61 6c 69 7a 65 28 70 2c    rbuFinalize(p,
1c4c0 20 70 53 71 6c 29 3b 0a 20 20 69 66 28 20 70 2d   pSql);.  if( p-
1c4d0 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc!=SQLITE_OK )
1c4e0 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66 28 20   return;..  if( 
1c4f0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
1c500 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
1c510 70 72 65 70 61 72 65 41 6e 64 43 6f 6c 6c 65 63  prepareAndCollec
1c520 74 45 72 72 6f 72 28 70 2d 3e 64 62 52 62 75 2c  tError(p->dbRbu,
1c530 20 26 70 53 71 6c 2c 20 26 70 2d 3e 7a 45 72 72   &pSql, &p->zErr
1c540 6d 73 67 2c 20 0a 20 20 20 20 20 20 20 20 22 53  msg, .        "S
1c550 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c  ELECT * FROM sql
1c560 69 74 65 5f 6d 61 73 74 65 72 20 57 48 45 52 45  ite_master WHERE
1c570 20 72 6f 6f 74 70 61 67 65 3d 30 20 4f 52 20 72   rootpage=0 OR r
1c580 6f 6f 74 70 61 67 65 20 49 53 20 4e 55 4c 4c 22  ootpage IS NULL"
1c590 20 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20   .    );.  }..  
1c5a0 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
1c5b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d 3e 72  E_OK ){.    p->r
1c5c0 63 20 3d 20 70 72 65 70 61 72 65 41 6e 64 43 6f  c = prepareAndCo
1c5d0 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62  llectError(p->db
1c5e0 4d 61 69 6e 2c 20 26 70 49 6e 73 65 72 74 2c 20  Main, &pInsert, 
1c5f0 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 20 0a 20 20  &p->zErrmsg, .  
1c600 20 20 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e        "INSERT IN
1c610 54 4f 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  TO sqlite_master
1c620 20 56 41 4c 55 45 53 28 3f 2c 3f 2c 3f 2c 3f 2c   VALUES(?,?,?,?,
1c630 3f 29 22 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a  ?)".    );.  }..
1c640 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d    while( p->rc==
1c650 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 71 6c  SQLITE_OK && sql
1c660 69 74 65 33 5f 73 74 65 70 28 70 53 71 6c 29 3d  ite3_step(pSql)=
1c670 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
1c680 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
1c690 72 28 69 3d 30 3b 20 69 3c 35 3b 20 69 2b 2b 29  r(i=0; i<5; i++)
1c6a0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
1c6b0 62 69 6e 64 5f 76 61 6c 75 65 28 70 49 6e 73 65  bind_value(pInse
1c6c0 72 74 2c 20 69 2b 31 2c 20 73 71 6c 69 74 65 33  rt, i+1, sqlite3
1c6d0 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28 70 53  _column_value(pS
1c6e0 71 6c 2c 20 69 29 29 3b 0a 20 20 20 20 7d 0a 20  ql, i));.    }. 
1c6f0 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28     sqlite3_step(
1c700 70 49 6e 73 65 72 74 29 3b 0a 20 20 20 20 70 2d  pInsert);.    p-
1c710 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65  >rc = sqlite3_re
1c720 73 65 74 28 70 49 6e 73 65 72 74 29 3b 0a 20 20  set(pInsert);.  
1c730 7d 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  }.  if( p->rc==S
1c740 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1c750 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  p->rc = sqlite3_
1c760 65 78 65 63 28 70 2d 3e 64 62 4d 61 69 6e 2c 20  exec(p->dbMain, 
1c770 22 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65  "PRAGMA writable
1c780 5f 73 63 68 65 6d 61 3d 30 22 2c 30 2c 30 2c 26  _schema=0",0,0,&
1c790 70 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a 20 20 7d  p->zErrmsg);.  }
1c7a0 0a 0a 20 20 72 62 75 46 69 6e 61 6c 69 7a 65 28  ..  rbuFinalize(
1c7b0 70 2c 20 70 53 71 6c 29 3b 0a 20 20 72 62 75 46  p, pSql);.  rbuF
1c7c0 69 6e 61 6c 69 7a 65 28 70 2c 20 70 49 6e 73 65  inalize(p, pInse
1c7d0 72 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74  rt);.}../*.** St
1c7e0 65 70 20 74 68 65 20 52 42 55 20 6f 62 6a 65 63  ep the RBU objec
1c7f0 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
1c800 33 72 62 75 5f 73 74 65 70 28 73 71 6c 69 74 65  3rbu_step(sqlite
1c810 33 72 62 75 20 2a 70 29 7b 0a 20 20 69 66 28 20  3rbu *p){.  if( 
1c820 70 20 29 7b 0a 20 20 20 20 73 77 69 74 63 68 28  p ){.    switch(
1c830 20 70 2d 3e 65 53 74 61 67 65 20 29 7b 0a 20 20   p->eStage ){.  
1c840 20 20 20 20 63 61 73 65 20 52 42 55 5f 53 54 41      case RBU_STA
1c850 47 45 5f 4f 41 4c 3a 20 7b 0a 20 20 20 20 20 20  GE_OAL: {.      
1c860 20 20 52 62 75 4f 62 6a 49 74 65 72 20 2a 70 49    RbuObjIter *pI
1c870 74 65 72 20 3d 20 26 70 2d 3e 6f 62 6a 69 74 65  ter = &p->objite
1c880 72 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 49  r;..        /* I
1c890 66 20 74 68 69 73 20 69 73 20 61 6e 20 52 42 55  f this is an RBU
1c8a0 20 76 61 63 75 75 6d 20 6f 70 65 72 61 74 69 6f   vacuum operatio
1c8b0 6e 20 61 6e 64 20 74 68 65 20 73 74 61 74 65 20  n and the state 
1c8c0 74 61 62 6c 65 20 77 61 73 20 65 6d 70 74 79 0a  table was empty.
1c8d0 20 20 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20          ** when 
1c8e0 74 68 69 73 20 68 61 6e 64 6c 65 20 77 61 73 20  this handle was 
1c8f0 6f 70 65 6e 65 64 2c 20 63 72 65 61 74 65 20 74  opened, create t
1c900 68 65 20 74 61 72 67 65 74 20 64 61 74 61 62 61  he target databa
1c910 73 65 20 73 63 68 65 6d 61 2e 20 2a 2f 0a 20 20  se schema. */.  
1c920 20 20 20 20 20 20 69 66 28 20 72 62 75 49 73 56        if( rbuIsV
1c930 61 63 75 75 6d 28 70 29 20 26 26 20 70 2d 3e 6e  acuum(p) && p->n
1c940 50 72 6f 67 72 65 73 73 3d 3d 30 20 26 26 20 70  Progress==0 && p
1c950 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
1c960 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 62 75  ){.          rbu
1c970 43 72 65 61 74 65 54 61 72 67 65 74 53 63 68 65  CreateTargetSche
1c980 6d 61 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20  ma(p);.         
1c990 20 72 62 75 43 6f 70 79 50 72 61 67 6d 61 28 70   rbuCopyPragma(p
1c9a0 2c 20 22 75 73 65 72 5f 76 65 72 73 69 6f 6e 22  , "user_version"
1c9b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 62 75  );.          rbu
1c9c0 43 6f 70 79 50 72 61 67 6d 61 28 70 2c 20 22 61  CopyPragma(p, "a
1c9d0 70 70 6c 69 63 61 74 69 6f 6e 5f 69 64 22 29 3b  pplication_id");
1c9e0 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
1c9f0 20 20 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63      while( p->rc
1ca00 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
1ca10 49 74 65 72 2d 3e 7a 54 62 6c 20 29 7b 0a 0a 20  Iter->zTbl ){.. 
1ca20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74           if( pIt
1ca30 65 72 2d 3e 62 43 6c 65 61 6e 75 70 20 29 7b 0a  er->bCleanup ){.
1ca40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
1ca50 6c 65 61 6e 20 75 70 20 74 68 65 20 72 62 75 5f  lean up the rbu_
1ca60 74 6d 70 5f 78 78 78 20 74 61 62 6c 65 20 66 6f  tmp_xxx table fo
1ca70 72 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 74  r the previous t
1ca80 61 62 6c 65 2e 20 49 74 20 0a 20 20 20 20 20 20  able. It .      
1ca90 20 20 20 20 20 20 2a 2a 20 63 61 6e 6e 6f 74 20        ** cannot 
1caa0 62 65 20 64 72 6f 70 70 65 64 20 61 73 20 74 68  be dropped as th
1cab0 65 72 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c  ere are currentl
1cac0 79 20 61 63 74 69 76 65 20 53 51 4c 20 73 74 61  y active SQL sta
1cad0 74 65 6d 65 6e 74 73 2e 0a 20 20 20 20 20 20 20  tements..       
1cae0 20 20 20 20 20 2a 2a 20 42 75 74 20 74 68 65 20       ** But the 
1caf0 63 6f 6e 74 65 6e 74 73 20 63 61 6e 20 62 65 20  contents can be 
1cb00 64 65 6c 65 74 65 64 2e 20 20 2a 2f 0a 20 20 20  deleted.  */.   
1cb10 20 20 20 20 20 20 20 20 20 69 66 28 20 72 62 75           if( rbu
1cb20 49 73 56 61 63 75 75 6d 28 70 29 3d 3d 30 20 26  IsVacuum(p)==0 &
1cb30 26 20 70 49 74 65 72 2d 3e 61 62 49 6e 64 65 78  & pIter->abIndex
1cb40 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ed ){.          
1cb50 20 20 20 20 72 62 75 4d 50 72 69 6e 74 66 45 78      rbuMPrintfEx
1cb60 65 63 28 70 2c 20 70 2d 3e 64 62 52 62 75 2c 20  ec(p, p->dbRbu, 
1cb70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1cb80 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20     "DELETE FROM 
1cb90 25 73 2e 27 72 62 75 5f 74 6d 70 5f 25 71 27 22  %s.'rbu_tmp_%q'"
1cba0 2c 20 70 2d 3e 7a 53 74 61 74 65 44 62 2c 20 70  , p->zStateDb, p
1cbb0 49 74 65 72 2d 3e 7a 44 61 74 61 54 62 6c 0a 20  Iter->zDataTbl. 
1cbc0 20 20 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a               );.
1cbd0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1cbe0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1cbf0 20 20 20 20 20 20 20 20 20 20 20 72 62 75 4f 62             rbuOb
1cc00 6a 49 74 65 72 50 72 65 70 61 72 65 41 6c 6c 28  jIterPrepareAll(
1cc10 70 2c 20 70 49 74 65 72 2c 20 30 29 3b 0a 0a 20  p, pIter, 0);.. 
1cc20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
1cc30 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78  vance to the nex
1cc40 74 20 72 6f 77 20 74 6f 20 70 72 6f 63 65 73 73  t row to process
1cc50 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  . */.           
1cc60 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
1cc70 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1cc80 20 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20         int rc = 
1cc90 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 49 74  sqlite3_step(pIt
1cca0 65 72 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20  er->pSelect);.  
1ccb0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1ccc0 72 63 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  rc==SQLITE_ROW )
1ccd0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1cce0 20 20 70 2d 3e 6e 50 72 6f 67 72 65 73 73 2b 2b    p->nProgress++
1ccf0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1cd00 20 20 70 2d 3e 6e 53 74 65 70 2b 2b 3b 0a 20 20    p->nStep++;.  
1cd10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
1cd20 74 75 72 6e 20 72 62 75 53 74 65 70 28 70 29 3b  turn rbuStep(p);
1cd30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
1cd40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
1cd50 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72  ->rc = sqlite3_r
1cd60 65 73 65 74 28 70 49 74 65 72 2d 3e 70 53 65 6c  eset(pIter->pSel
1cd70 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ect);.          
1cd80 20 20 20 20 70 2d 3e 6e 53 74 65 70 20 3d 20 30      p->nStep = 0
1cd90 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
1cda0 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20            }..   
1cdb0 20 20 20 20 20 20 20 72 62 75 4f 62 6a 49 74 65         rbuObjIte
1cdc0 72 4e 65 78 74 28 70 2c 20 70 49 74 65 72 29 3b  rNext(p, pIter);
1cdd0 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
1cde0 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
1cdf0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1ce00 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
1ce10 74 65 72 2d 3e 7a 54 62 6c 3d 3d 30 20 29 3b 0a  ter->zTbl==0 );.
1ce20 20 20 20 20 20 20 20 20 20 20 72 62 75 53 61 76            rbuSav
1ce30 65 53 74 61 74 65 28 70 2c 20 52 42 55 5f 53 54  eState(p, RBU_ST
1ce40 41 47 45 5f 4d 4f 56 45 29 3b 0a 20 20 20 20 20  AGE_MOVE);.     
1ce50 20 20 20 20 20 72 62 75 49 6e 63 72 53 63 68 65       rbuIncrSche
1ce60 6d 61 43 6f 6f 6b 69 65 28 70 29 3b 0a 20 20 20  maCookie(p);.   
1ce70 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63         if( p->rc
1ce80 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1ce90 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63             p->rc
1cea0 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28   = sqlite3_exec(
1ceb0 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 43 4f 4d 4d  p->dbMain, "COMM
1cec0 49 54 22 2c 20 30 2c 20 30 2c 20 26 70 2d 3e 7a  IT", 0, 0, &p->z
1ced0 45 72 72 6d 73 67 29 3b 0a 20 20 20 20 20 20 20  Errmsg);.       
1cee0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
1cef0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
1cf00 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1cf10 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74     p->rc = sqlit
1cf20 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 52 62 75  e3_exec(p->dbRbu
1cf30 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30  , "COMMIT", 0, 0
1cf40 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a  , &p->zErrmsg);.
1cf50 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1cf60 20 20 20 20 20 20 70 2d 3e 65 53 74 61 67 65 20        p->eStage 
1cf70 3d 20 52 42 55 5f 53 54 41 47 45 5f 4d 4f 56 45  = RBU_STAGE_MOVE
1cf80 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1cf90 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1cfa0 20 7d 0a 0a 20 20 20 20 20 20 63 61 73 65 20 52   }..      case R
1cfb0 42 55 5f 53 54 41 47 45 5f 4d 4f 56 45 3a 20 7b  BU_STAGE_MOVE: {
1cfc0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
1cfd0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1cfe0 0a 20 20 20 20 20 20 20 20 20 20 72 62 75 4d 6f  .          rbuMo
1cff0 76 65 4f 61 6c 46 69 6c 65 28 70 29 3b 0a 20 20  veOalFile(p);.  
1d000 20 20 20 20 20 20 20 20 70 2d 3e 6e 50 72 6f 67          p->nProg
1d010 72 65 73 73 2b 2b 3b 0a 20 20 20 20 20 20 20 20  ress++;.        
1d020 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  }.        break;
1d030 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
1d040 63 61 73 65 20 52 42 55 5f 53 54 41 47 45 5f 43  case RBU_STAGE_C
1d050 4b 50 54 3a 20 7b 0a 20 20 20 20 20 20 20 20 69  KPT: {.        i
1d060 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
1d070 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1d080 20 69 66 28 20 70 2d 3e 6e 53 74 65 70 3e 3d 70   if( p->nStep>=p
1d090 2d 3e 6e 46 72 61 6d 65 20 29 7b 0a 20 20 20 20  ->nFrame ){.    
1d0a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
1d0b0 66 69 6c 65 20 2a 70 44 62 20 3d 20 70 2d 3e 70  file *pDb = p->p
1d0c0 54 61 72 67 65 74 46 64 2d 3e 70 52 65 61 6c 3b  TargetFd->pReal;
1d0d0 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  .  .            
1d0e0 2f 2a 20 53 79 6e 63 20 74 68 65 20 64 62 20 66  /* Sync the db f
1d0f0 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ile */.         
1d100 20 20 20 70 2d 3e 72 63 20 3d 20 70 44 62 2d 3e     p->rc = pDb->
1d110 70 4d 65 74 68 6f 64 73 2d 3e 78 53 79 6e 63 28  pMethods->xSync(
1d120 70 44 62 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43  pDb, SQLITE_SYNC
1d130 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20 0a 20 20 20  _NORMAL);.  .   
1d140 20 20 20 20 20 20 20 20 20 2f 2a 20 55 70 64 61           /* Upda
1d150 74 65 20 6e 42 61 63 6b 66 69 6c 6c 20 2a 2f 0a  te nBackfill */.
1d160 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1d170 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
1d180 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1d190 20 20 76 6f 69 64 20 76 6f 6c 61 74 69 6c 65 20    void volatile 
1d1a0 2a 70 74 72 3b 0a 20 20 20 20 20 20 20 20 20 20  *ptr;.          
1d1b0 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 44 62 2d      p->rc = pDb-
1d1c0 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53 68 6d 4d  >pMethods->xShmM
1d1d0 61 70 28 70 44 62 2c 20 30 2c 20 33 32 2a 31 30  ap(pDb, 0, 32*10
1d1e0 32 34 2c 20 30 2c 20 26 70 74 72 29 3b 0a 20 20  24, 0, &ptr);.  
1d1f0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1d200 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
1d210 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1d220 20 20 20 20 28 28 75 33 32 20 76 6f 6c 61 74 69      ((u32 volati
1d230 6c 65 2a 29 70 74 72 29 5b 32 34 5d 20 3d 20 70  le*)ptr)[24] = p
1d240 2d 3e 69 4d 61 78 46 72 61 6d 65 3b 0a 20 20 20  ->iMaxFrame;.   
1d250 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1d260 20 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20           }.  .  
1d270 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d            if( p-
1d280 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
1d290 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1d2a0 70 2d 3e 65 53 74 61 67 65 20 3d 20 52 42 55 5f  p->eStage = RBU_
1d2b0 53 54 41 47 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  STAGE_DONE;.    
1d2c0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20            p->rc 
1d2d0 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  = SQLITE_DONE;. 
1d2e0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1d2f0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1d300 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20            /* At 
1d310 6f 6e 65 20 70 6f 69 6e 74 20 74 68 65 20 66 6f  one point the fo
1d320 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 63 6f  llowing block co
1d330 70 69 65 64 20 61 20 73 69 6e 67 6c 65 20 66 72  pied a single fr
1d340 61 6d 65 20 66 72 6f 6d 20 74 68 65 0a 20 20 20  ame from the.   
1d350 20 20 20 20 20 20 20 20 20 2a 2a 20 77 61 6c 20           ** wal 
1d360 66 69 6c 65 20 74 6f 20 74 68 65 20 64 61 74 61  file to the data
1d370 62 61 73 65 20 66 69 6c 65 2e 20 53 6f 20 74 68  base file. So th
1d380 61 74 20 6f 6e 65 20 63 61 6c 6c 20 74 6f 20 73  at one call to s
1d390 71 6c 69 74 65 33 72 62 75 5f 73 74 65 70 28 29  qlite3rbu_step()
1d3a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
1d3b0 63 68 65 63 6b 70 6f 69 6e 74 65 64 20 61 20 73  checkpointed a s
1d3c0 69 6e 67 6c 65 20 66 72 61 6d 65 2e 20 0a 20 20  ingle frame. .  
1d3d0 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20            **.   
1d3e0 20 20 20 20 20 20 20 20 20 2a 2a 20 48 6f 77 65           ** Howe
1d3f0 76 65 72 2c 20 69 66 20 74 68 65 20 73 65 63 74  ver, if the sect
1d400 6f 72 2d 73 69 7a 65 20 69 73 20 6c 61 72 67 65  or-size is large
1d410 72 20 74 68 61 6e 20 74 68 65 20 70 61 67 65 2d  r than the page-
1d420 73 69 7a 65 2c 20 61 6e 64 20 74 68 65 0a 20 20  size, and the.  
1d430 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 70 70            ** app
1d440 6c 69 63 61 74 69 6f 6e 20 63 61 6c 6c 73 20 73  lication calls s
1d450 71 6c 69 74 65 33 72 62 75 5f 73 61 76 65 73 74  qlite3rbu_savest
1d460 61 74 65 28 29 20 6f 72 20 63 6c 6f 73 65 28 29  ate() or close()
1d470 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 20 20 20   immediately.   
1d480 20 20 20 20 20 20 20 20 20 2a 2a 20 61 66 74 65           ** afte
1d490 72 20 74 68 69 73 20 73 74 65 70 2c 20 74 68 65  r this step, the
1d4a0 6e 20 72 62 75 5f 73 74 65 70 28 29 20 61 67 61  n rbu_step() aga
1d4b0 69 6e 2c 20 74 68 65 6e 20 61 20 70 6f 77 65 72  in, then a power
1d4c0 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2c   failure occurs,
1d4d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
1d4e0 74 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73  then the databas
1d4f0 65 20 70 61 67 65 20 77 72 69 74 74 65 6e 20 68  e page written h
1d500 65 72 65 20 6d 61 79 20 62 65 20 64 61 6d 61 67  ere may be damag
1d510 65 64 2e 20 57 6f 72 6b 20 61 72 6f 75 6e 64 0a  ed. Work around.
1d520 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
1d530 68 69 73 20 62 79 20 63 68 65 63 6b 70 6f 69 6e  his by checkpoin
1d540 74 69 6e 67 20 66 72 61 6d 65 73 20 75 6e 74 69  ting frames unti
1d550 6c 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  l the next page 
1d560 69 6e 20 74 68 65 20 61 46 72 61 6d 65 5b 5d 0a  in the aFrame[].
1d570 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6c              ** l
1d580 69 65 73 20 6f 6e 20 61 20 64 69 66 66 65 72 65  ies on a differe
1d590 6e 74 20 64 69 73 6b 20 73 65 63 74 6f 72 20 74  nt disk sector t
1d5a0 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 6f 6e  o the current on
1d5b0 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  e. */.          
1d5c0 20 20 75 33 32 20 69 53 65 63 74 6f 72 3b 0a 20    u32 iSector;. 
1d5d0 20 20 20 20 20 20 20 20 20 20 20 64 6f 7b 0a 20             do{. 
1d5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 52 62 75               Rbu
1d5f0 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 20 3d 20  Frame *pFrame = 
1d600 26 70 2d 3e 61 46 72 61 6d 65 5b 70 2d 3e 6e 53  &p->aFrame[p->nS
1d610 74 65 70 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  tep];.          
1d620 20 20 20 20 69 53 65 63 74 6f 72 20 3d 20 28 70      iSector = (p
1d630 46 72 61 6d 65 2d 3e 69 44 62 50 61 67 65 2d 31  Frame->iDbPage-1
1d640 29 20 2f 20 70 2d 3e 6e 50 61 67 65 50 65 72 53  ) / p->nPagePerS
1d650 65 63 74 6f 72 3b 0a 20 20 20 20 20 20 20 20 20  ector;.         
1d660 20 20 20 20 20 72 62 75 43 68 65 63 6b 70 6f 69       rbuCheckpoi
1d670 6e 74 46 72 61 6d 65 28 70 2c 20 70 46 72 61 6d  ntFrame(p, pFram
1d680 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
1d690 20 20 70 2d 3e 6e 53 74 65 70 2b 2b 3b 0a 20 20    p->nStep++;.  
1d6a0 20 20 20 20 20 20 20 20 20 20 7d 77 68 69 6c 65            }while
1d6b0 28 20 70 2d 3e 6e 53 74 65 70 3c 70 2d 3e 6e 46  ( p->nStep<p->nF
1d6c0 72 61 6d 65 20 0a 20 20 20 20 20 20 20 20 20 20  rame .          
1d6d0 20 20 20 20 20 20 20 26 26 20 69 53 65 63 74 6f         && iSecto
1d6e0 72 3d 3d 28 28 70 2d 3e 61 46 72 61 6d 65 5b 70  r==((p->aFrame[p
1d6f0 2d 3e 6e 53 74 65 70 5d 2e 69 44 62 50 61 67 65  ->nStep].iDbPage
1d700 2d 31 29 20 2f 20 70 2d 3e 6e 50 61 67 65 50 65  -1) / p->nPagePe
1d710 72 53 65 63 74 6f 72 29 0a 20 20 20 20 20 20 20  rSector).       
1d720 20 20 20 20 20 20 20 20 20 20 26 26 20 70 2d 3e            && p->
1d730 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  rc==SQLITE_OK.  
1d740 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20            );.   
1d750 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1d760 20 20 20 70 2d 3e 6e 50 72 6f 67 72 65 73 73 2b     p->nProgress+
1d770 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  +;.        }.   
1d780 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1d790 20 20 7d 0a 0a 20 20 20 20 20 20 64 65 66 61 75    }..      defau
1d7a0 6c 74 3a 0a 20 20 20 20 20 20 20 20 62 72 65 61  lt:.        brea
1d7b0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  k;.    }.    ret
1d7c0 75 72 6e 20 70 2d 3e 72 63 3b 0a 20 20 7d 65 6c  urn p->rc;.  }el
1d7d0 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  se{.    return S
1d7e0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
1d7f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72  .}../*.** Compar
1d800 65 20 73 74 72 69 6e 67 73 20 7a 31 20 61 6e 64  e strings z1 and
1d810 20 7a 32 2c 20 72 65 74 75 72 6e 69 6e 67 20 30   z2, returning 0
1d820 20 69 66 20 74 68 65 79 20 61 72 65 20 69 64 65   if they are ide
1d830 6e 74 69 63 61 6c 2c 20 6f 72 20 6e 6f 6e 2d 7a  ntical, or non-z
1d840 65 72 6f 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65  ero.** otherwise
1d850 2e 20 45 69 74 68 65 72 20 6f 72 20 62 6f 74 68  . Either or both
1d860 20 61 72 67 75 6d 65 6e 74 20 6d 61 79 20 62 65   argument may be
1d870 20 4e 55 4c 4c 2e 20 54 77 6f 20 4e 55 4c 4c 20   NULL. Two NULL 
1d880 76 61 6c 75 65 73 20 61 72 65 0a 2a 2a 20 63 6f  values are.** co
1d890 6e 73 69 64 65 72 65 64 20 65 71 75 61 6c 2c 20  nsidered equal, 
1d8a0 61 6e 64 20 4e 55 4c 4c 20 69 73 20 63 6f 6e 73  and NULL is cons
1d8b0 69 64 65 72 65 64 20 64 69 73 74 69 6e 63 74 20  idered distinct 
1d8c0 66 72 6f 6d 20 61 6c 6c 20 6f 74 68 65 72 20 76  from all other v
1d8d0 61 6c 75 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  alues..*/.static
1d8e0 20 69 6e 74 20 72 62 75 53 74 72 43 6f 6d 70 61   int rbuStrCompa
1d8f0 72 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  re(const char *z
1d900 31 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  1, const char *z
1d910 32 29 7b 0a 20 20 69 66 28 20 7a 31 3d 3d 30 20  2){.  if( z1==0 
1d920 26 26 20 7a 32 3d 3d 30 20 29 20 72 65 74 75 72  && z2==0 ) retur
1d930 6e 20 30 3b 0a 20 20 69 66 28 20 7a 31 3d 3d 30  n 0;.  if( z1==0
1d940 20 7c 7c 20 7a 32 3d 3d 30 20 29 20 72 65 74 75   || z2==0 ) retu
1d950 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 28  rn 1;.  return (
1d960 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
1d970 7a 31 2c 20 7a 32 29 21 3d 30 29 3b 0a 7d 0a 0a  z1, z2)!=0);.}..
1d980 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
1d990 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 73  ion is called as
1d9a0 20 70 61 72 74 20 6f 66 20 73 71 6c 69 74 65 33   part of sqlite3
1d9b0 72 62 75 5f 6f 70 65 6e 28 29 20 77 68 65 6e 20  rbu_open() when 
1d9c0 69 6e 69 74 69 61 6c 69 7a 69 6e 67 0a 2a 2a 20  initializing.** 
1d9d0 61 6e 20 72 62 75 20 68 61 6e 64 6c 65 20 69 6e  an rbu handle in
1d9e0 20 4f 41 4c 20 73 74 61 67 65 2e 20 49 66 20 74   OAL stage. If t
1d9f0 68 65 20 72 62 75 20 75 70 64 61 74 65 20 68 61  he rbu update ha
1da00 73 20 6e 6f 74 20 73 74 61 72 74 65 64 20 28 69  s not started (i
1da10 2e 65 2e 0a 2a 2a 20 74 68 65 20 72 62 75 5f 73  .e..** the rbu_s
1da20 74 61 74 65 20 74 61 62 6c 65 20 77 61 73 20 65  tate table was e
1da30 6d 70 74 79 29 20 69 74 20 69 73 20 61 20 6e 6f  mpty) it is a no
1da40 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  -op. Otherwise, 
1da50 69 74 20 61 72 72 61 6e 67 65 73 0a 2a 2a 20 74  it arranges.** t
1da60 68 69 6e 67 73 20 73 6f 20 74 68 61 74 20 74 68  hings so that th
1da70 65 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20 73  e next call to s
1da80 71 6c 69 74 65 33 72 62 75 5f 73 74 65 70 28 29  qlite3rbu_step()
1da90 20 63 6f 6e 74 69 6e 75 65 73 20 6f 6e 20 66 72   continues on fr
1daa0 6f 6d 0a 2a 2a 20 77 68 65 72 65 20 74 68 65 20  om.** where the 
1dab0 70 72 65 76 69 6f 75 73 20 72 62 75 20 68 61 6e  previous rbu han
1dac0 64 6c 65 20 6c 65 66 74 20 6f 66 66 2e 0a 2a 2a  dle left off..**
1dad0 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
1dae0 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72  occurs, an error
1daf0 20 63 6f 64 65 20 61 6e 64 20 65 72 72 6f 72 20   code and error 
1db00 6d 65 73 73 61 67 65 20 61 72 65 20 6c 65 66 74  message are left
1db10 20 69 6e 20 74 68 65 0a 2a 2a 20 72 62 75 20 68   in the.** rbu h
1db20 61 6e 64 6c 65 20 70 61 73 73 65 64 20 61 73 20  andle passed as 
1db30 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
1db40 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nt..*/.static vo
1db50 69 64 20 72 62 75 53 65 74 75 70 4f 61 6c 28 73  id rbuSetupOal(s
1db60 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 52 62  qlite3rbu *p, Rb
1db70 75 53 74 61 74 65 20 2a 70 53 74 61 74 65 29 7b  uState *pState){
1db80 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63  .  assert( p->rc
1db90 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
1dba0 20 69 66 28 20 70 53 74 61 74 65 2d 3e 7a 54 62   if( pState->zTb
1dbb0 6c 20 29 7b 0a 20 20 20 20 52 62 75 4f 62 6a 49  l ){.    RbuObjI
1dbc0 74 65 72 20 2a 70 49 74 65 72 20 3d 20 26 70 2d  ter *pIter = &p-
1dbd0 3e 6f 62 6a 69 74 65 72 3b 0a 20 20 20 20 69 6e  >objiter;.    in
1dbe0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1dbf0 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63  ;..    while( rc
1dc00 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
1dc10 49 74 65 72 2d 3e 7a 54 62 6c 20 26 26 20 28 70  Iter->zTbl && (p
1dc20 49 74 65 72 2d 3e 62 43 6c 65 61 6e 75 70 20 0a  Iter->bCleanup .
1dc30 20 20 20 20 20 20 20 7c 7c 20 72 62 75 53 74 72         || rbuStr
1dc40 43 6f 6d 70 61 72 65 28 70 49 74 65 72 2d 3e 7a  Compare(pIter->z
1dc50 49 64 78 2c 20 70 53 74 61 74 65 2d 3e 7a 49 64  Idx, pState->zId
1dc60 78 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 53  x).       || (pS
1dc70 74 61 74 65 2d 3e 7a 44 61 74 61 54 62 6c 3d 3d  tate->zDataTbl==
1dc80 30 20 26 26 20 72 62 75 53 74 72 43 6f 6d 70 61  0 && rbuStrCompa
1dc90 72 65 28 70 49 74 65 72 2d 3e 7a 54 62 6c 2c 20  re(pIter->zTbl, 
1dca0 70 53 74 61 74 65 2d 3e 7a 54 62 6c 29 29 0a 20  pState->zTbl)). 
1dcb0 20 20 20 20 20 20 7c 7c 20 28 70 53 74 61 74 65        || (pState
1dcc0 2d 3e 7a 44 61 74 61 54 62 6c 20 26 26 20 72 62  ->zDataTbl && rb
1dcd0 75 53 74 72 43 6f 6d 70 61 72 65 28 70 49 74 65  uStrCompare(pIte
1dce0 72 2d 3e 7a 44 61 74 61 54 62 6c 2c 20 70 53 74  r->zDataTbl, pSt
1dcf0 61 74 65 2d 3e 7a 44 61 74 61 54 62 6c 29 29 0a  ate->zDataTbl)).
1dd00 20 20 20 20 29 29 7b 0a 20 20 20 20 20 20 72 63      )){.      rc
1dd10 20 3d 20 72 62 75 4f 62 6a 49 74 65 72 4e 65 78   = rbuObjIterNex
1dd20 74 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20  t(p, pIter);.   
1dd30 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   }..    if( rc==
1dd40 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70 49  SQLITE_OK && !pI
1dd50 74 65 72 2d 3e 7a 54 62 6c 20 29 7b 0a 20 20 20  ter->zTbl ){.   
1dd60 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
1dd70 52 52 4f 52 3b 0a 20 20 20 20 20 20 70 2d 3e 7a  RROR;.      p->z
1dd80 45 72 72 6d 73 67 20 3d 20 73 71 6c 69 74 65 33  Errmsg = sqlite3
1dd90 5f 6d 70 72 69 6e 74 66 28 22 72 62 75 5f 73 74  _mprintf("rbu_st
1dda0 61 74 65 20 6d 69 73 6d 61 74 63 68 20 65 72 72  ate mismatch err
1ddb0 6f 72 22 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  or");.    }..   
1ddc0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1ddd0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e  OK ){.      p->n
1dde0 53 74 65 70 20 3d 20 70 53 74 61 74 65 2d 3e 6e  Step = pState->n
1ddf0 52 6f 77 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  Row;.      rc = 
1de00 72 62 75 4f 62 6a 49 74 65 72 50 72 65 70 61 72  rbuObjIterPrepar
1de10 65 41 6c 6c 28 70 2c 20 26 70 2d 3e 6f 62 6a 69  eAll(p, &p->obji
1de20 74 65 72 2c 20 70 2d 3e 6e 53 74 65 70 29 3b 0a  ter, p->nStep);.
1de30 20 20 20 20 7d 0a 0a 20 20 20 20 70 2d 3e 72 63      }..    p->rc
1de40 20 3d 20 72 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   = rc;.  }.}../*
1de50 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20  .** If there is 
1de60 61 20 22 2a 2d 6f 61 6c 22 20 66 69 6c 65 20 69  a "*-oal" file i
1de70 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  n the file-syste
1de80 6d 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  m corresponding 
1de90 74 6f 20 74 68 65 0a 2a 2a 20 74 61 72 67 65 74  to the.** target
1dea0 20 64 61 74 61 62 61 73 65 20 69 6e 20 74 68 65   database in the
1deb0 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 64 65   file-system, de
1dec0 6c 65 74 65 20 69 74 2e 20 49 66 20 61 6e 20 65  lete it. If an e
1ded0 72 72 6f 72 20 6f 63 63 75 72 73 2c 0a 2a 2a 20  rror occurs,.** 
1dee0 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 63  leave an error c
1def0 6f 64 65 20 61 6e 64 20 65 72 72 6f 72 20 6d 65  ode and error me
1df00 73 73 61 67 65 20 69 6e 20 74 68 65 20 72 62 75  ssage in the rbu
1df10 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74   handle..*/.stat
1df20 69 63 20 76 6f 69 64 20 72 62 75 44 65 6c 65 74  ic void rbuDelet
1df30 65 4f 61 6c 46 69 6c 65 28 73 71 6c 69 74 65 33  eOalFile(sqlite3
1df40 72 62 75 20 2a 70 29 7b 0a 20 20 63 68 61 72 20  rbu *p){.  char 
1df50 2a 7a 4f 61 6c 20 3d 20 72 62 75 4d 50 72 69 6e  *zOal = rbuMPrin
1df60 74 66 28 70 2c 20 22 25 73 2d 6f 61 6c 22 2c 20  tf(p, "%s-oal", 
1df70 70 2d 3e 7a 54 61 72 67 65 74 29 3b 0a 20 20 69  p->zTarget);.  i
1df80 66 28 20 7a 4f 61 6c 20 29 7b 0a 20 20 20 20 73  f( zOal ){.    s
1df90 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
1dfa0 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66   = sqlite3_vfs_f
1dfb0 69 6e 64 28 30 29 3b 0a 20 20 20 20 61 73 73 65  ind(0);.    asse
1dfc0 72 74 28 20 70 56 66 73 20 26 26 20 70 2d 3e 72  rt( pVfs && p->r
1dfd0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1dfe0 70 2d 3e 7a 45 72 72 6d 73 67 3d 3d 30 20 29 3b  p->zErrmsg==0 );
1dff0 0a 20 20 20 20 70 56 66 73 2d 3e 78 44 65 6c 65  .    pVfs->xDele
1e000 74 65 28 70 56 66 73 2c 20 7a 4f 61 6c 2c 20 30  te(pVfs, zOal, 0
1e010 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
1e020 72 65 65 28 7a 4f 61 6c 29 3b 0a 20 20 7d 0a 7d  ree(zOal);.  }.}
1e030 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
1e040 20 61 20 70 72 69 76 61 74 65 20 72 62 75 20 56   a private rbu V
1e050 46 53 20 66 6f 72 20 74 68 65 20 72 62 75 20 68  FS for the rbu h
1e060 61 6e 64 6c 65 20 70 61 73 73 65 64 20 61 73 20  andle passed as 
1e070 74 68 65 20 6f 6e 6c 79 0a 2a 2a 20 61 72 67 75  the only.** argu
1e080 6d 65 6e 74 2e 20 54 68 69 73 20 56 46 53 20 77  ment. This VFS w
1e090 69 6c 6c 20 62 65 20 75 73 65 64 20 75 6e 6c 65  ill be used unle
1e0a0 73 73 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73  ss the call to s
1e0b0 71 6c 69 74 65 33 72 62 75 5f 6f 70 65 6e 28 29  qlite3rbu_open()
1e0c0 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 61 20  .** specified a 
1e0d0 55 52 49 20 77 69 74 68 20 61 20 76 66 73 3d 3f  URI with a vfs=?
1e0e0 20 6f 70 74 69 6f 6e 20 69 6e 20 70 6c 61 63 65   option in place
1e0f0 20 6f 66 20 61 20 74 61 72 67 65 74 20 64 61 74   of a target dat
1e100 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 6e 61  abase.** file na
1e110 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  me..*/.static vo
1e120 69 64 20 72 62 75 43 72 65 61 74 65 56 66 73 28  id rbuCreateVfs(
1e130 73 71 6c 69 74 65 33 72 62 75 20 2a 70 29 7b 0a  sqlite3rbu *p){.
1e140 20 20 69 6e 74 20 72 6e 64 3b 0a 20 20 63 68 61    int rnd;.  cha
1e150 72 20 7a 52 6e 64 5b 36 34 5d 3b 0a 0a 20 20 61  r zRnd[64];..  a
1e160 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51  ssert( p->rc==SQ
1e170 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 73 71 6c  LITE_OK );.  sql
1e180 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28  ite3_randomness(
1e190 73 69 7a 65 6f 66 28 69 6e 74 29 2c 20 28 76 6f  sizeof(int), (vo
1e1a0 69 64 2a 29 26 72 6e 64 29 3b 0a 20 20 73 71 6c  id*)&rnd);.  sql
1e1b0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
1e1c0 7a 65 6f 66 28 7a 52 6e 64 29 2c 20 7a 52 6e 64  zeof(zRnd), zRnd
1e1d0 2c 20 22 72 62 75 5f 76 66 73 5f 25 64 22 2c 20  , "rbu_vfs_%d", 
1e1e0 72 6e 64 29 3b 0a 20 20 70 2d 3e 72 63 20 3d 20  rnd);.  p->rc = 
1e1f0 73 71 6c 69 74 65 33 72 62 75 5f 63 72 65 61 74  sqlite3rbu_creat
1e200 65 5f 76 66 73 28 7a 52 6e 64 2c 20 30 29 3b 0a  e_vfs(zRnd, 0);.
1e210 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
1e220 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
1e230 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20  lite3_vfs *pVfs 
1e240 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  = sqlite3_vfs_fi
1e250 6e 64 28 7a 52 6e 64 29 3b 0a 20 20 20 20 61 73  nd(zRnd);.    as
1e260 73 65 72 74 28 20 70 56 66 73 20 29 3b 0a 20 20  sert( pVfs );.  
1e270 20 20 70 2d 3e 7a 56 66 73 4e 61 6d 65 20 3d 20    p->zVfsName = 
1e280 70 56 66 73 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  pVfs->zName;.   
1e290 20 28 28 72 62 75 5f 76 66 73 2a 29 70 56 66 73   ((rbu_vfs*)pVfs
1e2a0 29 2d 3e 70 52 62 75 20 3d 20 70 3b 0a 20 20 7d  )->pRbu = p;.  }
1e2b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 74 72 6f  .}../*.** Destro
1e2c0 79 20 74 68 65 20 70 72 69 76 61 74 65 20 56 46  y the private VF
1e2d0 53 20 63 72 65 61 74 65 64 20 66 6f 72 20 74 68  S created for th
1e2e0 65 20 72 62 75 20 68 61 6e 64 6c 65 20 70 61 73  e rbu handle pas
1e2f0 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 0a  sed as the only.
1e300 2a 2a 20 61 72 67 75 6d 65 6e 74 20 62 79 20 61  ** argument by a
1e310 6e 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74  n earlier call t
1e320 6f 20 72 62 75 43 72 65 61 74 65 56 66 73 28 29  o rbuCreateVfs()
1e330 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1e340 20 72 62 75 44 65 6c 65 74 65 56 66 73 28 73 71   rbuDeleteVfs(sq
1e350 6c 69 74 65 33 72 62 75 20 2a 70 29 7b 0a 20 20  lite3rbu *p){.  
1e360 69 66 28 20 70 2d 3e 7a 56 66 73 4e 61 6d 65 20  if( p->zVfsName 
1e370 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 72 62  ){.    sqlite3rb
1e380 75 5f 64 65 73 74 72 6f 79 5f 76 66 73 28 70 2d  u_destroy_vfs(p-
1e390 3e 7a 56 66 73 4e 61 6d 65 29 3b 0a 20 20 20 20  >zVfsName);.    
1e3a0 70 2d 3e 7a 56 66 73 4e 61 6d 65 20 3d 20 30 3b  p->zVfsName = 0;
1e3b0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
1e3c0 69 73 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20  is user-defined 
1e3d0 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  SQL function is 
1e3e0 69 6e 76 6f 6b 65 64 20 77 69 74 68 20 61 20 73  invoked with a s
1e3f0 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 20 2d  ingle argument -
1e400 20 74 68 65 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20   the.** name of 
1e410 61 20 74 61 62 6c 65 20 65 78 70 65 63 74 65 64  a table expected
1e420 20 74 6f 20 61 70 70 65 61 72 20 69 6e 20 74 68   to appear in th
1e430 65 20 74 61 72 67 65 74 20 64 61 74 61 62 61 73  e target databas
1e440 65 2e 20 49 74 20 72 65 74 75 72 6e 73 0a 2a 2a  e. It returns.**
1e450 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61   the number of a
1e460 75 78 69 6c 6c 69 61 72 79 20 69 6e 64 65 78 65  uxilliary indexe
1e470 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a  s on the table..
1e480 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
1e490 62 75 49 6e 64 65 78 43 6e 74 46 75 6e 63 28 0a  buIndexCntFunc(.
1e4a0 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
1e4b0 74 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20  t *pCtx, .  int 
1e4c0 6e 56 61 6c 2c 0a 20 20 73 71 6c 69 74 65 33 5f  nVal,.  sqlite3_
1e4d0 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 0a 29 7b  value **apVal.){
1e4e0 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20 2a 70  .  sqlite3rbu *p
1e4f0 20 3d 20 28 73 71 6c 69 74 65 33 72 62 75 2a 29   = (sqlite3rbu*)
1e500 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74  sqlite3_user_dat
1e510 61 28 70 43 74 78 29 3b 0a 20 20 73 71 6c 69 74  a(pCtx);.  sqlit
1e520 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d  e3_stmt *pStmt =
1e530 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72   0;.  char *zErr
1e540 6d 73 67 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  msg = 0;.  int r
1e550 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 56  c;..  assert( nV
1e560 61 6c 3d 3d 31 20 29 3b 0a 20 20 0a 20 20 72 63  al==1 );.  .  rc
1e570 20 3d 20 70 72 65 70 61 72 65 46 72 65 65 41 6e   = prepareFreeAn
1e580 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d  dCollectError(p-
1e590 3e 64 62 4d 61 69 6e 2c 20 26 70 53 74 6d 74 2c  >dbMain, &pStmt,
1e5a0 20 26 7a 45 72 72 6d 73 67 2c 20 0a 20 20 20 20   &zErrmsg, .    
1e5b0 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74    sqlite3_mprint
1e5c0 66 28 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28  f("SELECT count(
1e5d0 2a 29 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d  *) FROM sqlite_m
1e5e0 61 73 74 65 72 20 22 0a 20 20 20 20 20 20 20 20  aster ".        
1e5f0 22 57 48 45 52 45 20 74 79 70 65 3d 27 69 6e 64  "WHERE type='ind
1e600 65 78 27 20 41 4e 44 20 74 62 6c 5f 6e 61 6d 65  ex' AND tbl_name
1e610 20 3d 20 25 51 22 2c 20 73 71 6c 69 74 65 33 5f   = %Q", sqlite3_
1e620 76 61 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c  value_text(apVal
1e630 5b 30 5d 29 29 0a 20 20 29 3b 0a 20 20 69 66 28  [0])).  );.  if(
1e640 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1e650 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
1e660 73 75 6c 74 5f 65 72 72 6f 72 28 70 43 74 78 2c  sult_error(pCtx,
1e670 20 7a 45 72 72 6d 73 67 2c 20 2d 31 29 3b 0a 20   zErrmsg, -1);. 
1e680 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
1e690 6e 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20  nIndex = 0;.    
1e6a0 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d  if( SQLITE_ROW==
1e6b0 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
1e6c0 6d 74 29 20 29 7b 0a 20 20 20 20 20 20 6e 49 6e  mt) ){.      nIn
1e6d0 64 65 78 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  dex = sqlite3_co
1e6e0 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20  lumn_int(pStmt, 
1e6f0 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  0);.    }.    rc
1e700 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c   = sqlite3_final
1e710 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
1e720 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1e730 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
1e740 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 70 43  e3_result_int(pC
1e750 74 78 2c 20 6e 49 6e 64 65 78 29 3b 0a 20 20 20  tx, nIndex);.   
1e760 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
1e770 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
1e780 6f 72 28 70 43 74 78 2c 20 73 71 6c 69 74 65 33  or(pCtx, sqlite3
1e790 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 4d 61 69  _errmsg(p->dbMai
1e7a0 6e 29 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 20  n), -1);.    }. 
1e7b0 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   }..  sqlite3_fr
1e7c0 65 65 28 7a 45 72 72 6d 73 67 29 3b 0a 7d 0a 0a  ee(zErrmsg);.}..
1e7d0 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 52 42 55  /*.** If the RBU
1e7e0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69   database contai
1e7f0 6e 73 20 74 68 65 20 72 62 75 5f 63 6f 75 6e 74  ns the rbu_count
1e800 20 74 61 62 6c 65 2c 20 75 73 65 20 69 74 20 74   table, use it t
1e810 6f 20 69 6e 69 74 69 61 6c 69 7a 65 0a 2a 2a 20  o initialize.** 
1e820 74 68 65 20 73 71 6c 69 74 65 33 72 62 75 2e 6e  the sqlite3rbu.n
1e830 50 68 61 73 65 4f 6e 65 53 74 65 70 20 76 61 72  PhaseOneStep var
1e840 69 61 62 6c 65 2e 20 54 68 65 20 73 63 68 65 6d  iable. The schem
1e850 61 20 6f 66 20 74 68 65 20 72 62 75 5f 63 6f 75  a of the rbu_cou
1e860 6e 74 20 74 61 62 6c 65 0a 2a 2a 20 69 73 20 61  nt table.** is a
1e870 73 73 75 6d 65 64 20 74 6f 20 63 6f 6e 74 61 69  ssumed to contai
1e880 6e 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 75 6d  n the same colum
1e890 6e 73 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 43  ns as:.**.**   C
1e8a0 52 45 41 54 45 20 54 41 42 4c 45 20 72 62 75 5f  REATE TABLE rbu_
1e8b0 63 6f 75 6e 74 28 74 62 6c 20 54 45 58 54 20 50  count(tbl TEXT P
1e8c0 52 49 4d 41 52 59 20 4b 45 59 2c 20 63 6e 74 20  RIMARY KEY, cnt 
1e8d0 49 4e 54 45 47 45 52 29 20 57 49 54 48 4f 55 54  INTEGER) WITHOUT
1e8e0 20 52 4f 57 49 44 3b 0a 2a 2a 0a 2a 2a 20 54 68   ROWID;.**.** Th
1e8f0 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 6f 6e  ere should be on
1e900 65 20 72 6f 77 20 69 6e 20 74 68 65 20 74 61 62  e row in the tab
1e910 6c 65 20 66 6f 72 20 65 61 63 68 20 64 61 74 61  le for each data
1e920 5f 78 78 78 20 74 61 62 6c 65 20 69 6e 20 74 68  _xxx table in th
1e930 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54  e.** database. T
1e940 68 65 20 27 74 62 6c 27 20 63 6f 6c 75 6d 6e 20  he 'tbl' column 
1e950 73 68 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 20 74  should contain t
1e960 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 64 61 74  he name of a dat
1e970 61 5f 78 78 78 20 74 61 62 6c 65 2c 0a 2a 2a 20  a_xxx table,.** 
1e980 61 6e 64 20 74 68 65 20 63 6e 74 20 63 6f 6c 75  and the cnt colu
1e990 6d 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  mn the number of
1e9a0 20 72 6f 77 73 20 69 74 20 63 6f 6e 74 61 69 6e   rows it contain
1e9b0 73 2e 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65 33  s..**.** sqlite3
1e9c0 72 62 75 2e 6e 50 68 61 73 65 4f 6e 65 53 74 65  rbu.nPhaseOneSte
1e9d0 70 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  p is initialized
1e9e0 20 74 6f 20 74 68 65 20 73 75 6d 20 6f 66 20 28   to the sum of (
1e9f0 31 20 2b 20 6e 49 6e 64 65 78 29 20 2a 20 63 6e  1 + nIndex) * cn
1ea00 74 0a 2a 2a 20 66 6f 72 20 61 6c 6c 20 72 6f 77  t.** for all row
1ea10 73 20 69 6e 20 74 68 65 20 72 62 75 5f 63 6f 75  s in the rbu_cou
1ea20 6e 74 20 74 61 62 6c 65 2c 20 77 68 65 72 65 20  nt table, where 
1ea30 6e 49 6e 64 65 78 20 69 73 20 74 68 65 20 6e 75  nIndex is the nu
1ea40 6d 62 65 72 20 6f 66 20 0a 2a 2a 20 69 6e 64 65  mber of .** inde
1ea50 78 65 73 20 6f 6e 20 74 68 65 20 63 6f 72 72 65  xes on the corre
1ea60 73 70 6f 6e 64 69 6e 67 20 74 61 72 67 65 74 20  sponding target 
1ea70 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 2e 0a  database table..
1ea80 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
1ea90 62 75 49 6e 69 74 50 68 61 73 65 4f 6e 65 53 74  buInitPhaseOneSt
1eaa0 65 70 73 28 73 71 6c 69 74 65 33 72 62 75 20 2a  eps(sqlite3rbu *
1eab0 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  p){.  if( p->rc=
1eac0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1ead0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
1eae0 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 69  pStmt = 0;.    i
1eaf0 6e 74 20 62 45 78 69 73 74 73 20 3d 20 30 3b 20  nt bExists = 0; 
1eb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1eb10 2a 20 54 72 75 65 20 69 66 20 72 62 75 5f 63 6f  * True if rbu_co
1eb20 75 6e 74 20 65 78 69 73 74 73 20 2a 2f 0a 0a 20  unt exists */.. 
1eb30 20 20 20 70 2d 3e 6e 50 68 61 73 65 4f 6e 65 53     p->nPhaseOneS
1eb40 74 65 70 20 3d 20 2d 31 3b 0a 0a 20 20 20 20 70  tep = -1;..    p
1eb50 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63  ->rc = sqlite3_c
1eb60 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70  reate_function(p
1eb70 2d 3e 64 62 52 62 75 2c 20 0a 20 20 20 20 20 20  ->dbRbu, .      
1eb80 20 20 22 72 62 75 5f 69 6e 64 65 78 5f 63 6e 74    "rbu_index_cnt
1eb90 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  ", 1, SQLITE_UTF
1eba0 38 2c 20 28 76 6f 69 64 2a 29 70 2c 20 72 62 75  8, (void*)p, rbu
1ebb0 49 6e 64 65 78 43 6e 74 46 75 6e 63 2c 20 30 2c  IndexCntFunc, 0,
1ebc0 20 30 0a 20 20 20 20 29 3b 0a 20 20 0a 20 20 20   0.    );.  .   
1ebd0 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 74 68   /* Check for th
1ebe0 65 20 72 62 75 5f 63 6f 75 6e 74 20 74 61 62 6c  e rbu_count tabl
1ebf0 65 2e 20 49 66 20 69 74 20 64 6f 65 73 20 6e 6f  e. If it does no
1ec00 74 20 65 78 69 73 74 2c 20 6f 72 20 69 66 20 61  t exist, or if a
1ec10 6e 20 65 72 72 6f 72 0a 20 20 20 20 2a 2a 20 6f  n error.    ** o
1ec20 63 63 75 72 73 2c 20 6e 50 68 61 73 65 4f 6e 65  ccurs, nPhaseOne
1ec30 53 74 65 70 20 77 69 6c 6c 20 62 65 20 6c 65 66  Step will be lef
1ec40 74 20 73 65 74 20 74 6f 20 2d 31 2e 20 2a 2f 0a  t set to -1. */.
1ec50 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
1ec60 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1ec70 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72    p->rc = prepar
1ec80 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72  eAndCollectError
1ec90 28 70 2d 3e 64 62 52 62 75 2c 20 26 70 53 74 6d  (p->dbRbu, &pStm
1eca0 74 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 0a  t, &p->zErrmsg,.
1ecb0 20 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43            "SELEC
1ecc0 54 20 31 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  T 1 FROM sqlite_
1ecd0 6d 61 73 74 65 72 20 57 48 45 52 45 20 74 62 6c  master WHERE tbl
1ece0 5f 6e 61 6d 65 20 3d 20 27 72 62 75 5f 63 6f 75  _name = 'rbu_cou
1ecf0 6e 74 27 22 0a 20 20 20 20 20 20 29 3b 0a 20 20  nt'".      );.  
1ed00 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 72    }.    if( p->r
1ed10 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1ed20 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45        if( SQLITE
1ed30 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74  _ROW==sqlite3_st
1ed40 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20  ep(pStmt) ){.   
1ed50 20 20 20 20 20 62 45 78 69 73 74 73 20 3d 20 31       bExists = 1
1ed60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1ed70 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  p->rc = sqlite3_
1ed80 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
1ed90 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66  .    }.  .    if
1eda0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
1edb0 4f 4b 20 26 26 20 62 45 78 69 73 74 73 20 29 7b  OK && bExists ){
1edc0 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 70  .      p->rc = p
1edd0 72 65 70 61 72 65 41 6e 64 43 6f 6c 6c 65 63 74  repareAndCollect
1ede0 45 72 72 6f 72 28 70 2d 3e 64 62 52 62 75 2c 20  Error(p->dbRbu, 
1edf0 26 70 53 74 6d 74 2c 20 26 70 2d 3e 7a 45 72 72  &pStmt, &p->zErr
1ee00 6d 73 67 2c 0a 20 20 20 20 20 20 20 20 20 20 22  msg,.          "
1ee10 53 45 4c 45 43 54 20 73 75 6d 28 63 6e 74 20 2a  SELECT sum(cnt *
1ee20 20 28 31 20 2b 20 72 62 75 5f 69 6e 64 65 78 5f   (1 + rbu_index_
1ee30 63 6e 74 28 72 62 75 5f 74 61 72 67 65 74 5f 6e  cnt(rbu_target_n
1ee40 61 6d 65 28 74 62 6c 29 29 29 29 22 0a 20 20 20  ame(tbl))))".   
1ee50 20 20 20 20 20 20 20 22 46 52 4f 4d 20 72 62 75         "FROM rbu
1ee60 5f 63 6f 75 6e 74 22 0a 20 20 20 20 20 20 29 3b  _count".      );
1ee70 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63  .      if( p->rc
1ee80 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1ee90 20 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54         if( SQLIT
1eea0 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73  E_ROW==sqlite3_s
1eeb0 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20  tep(pStmt) ){.  
1eec0 20 20 20 20 20 20 20 20 70 2d 3e 6e 50 68 61 73          p->nPhas
1eed0 65 4f 6e 65 53 74 65 70 20 3d 20 73 71 6c 69 74  eOneStep = sqlit
1eee0 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28  e3_column_int64(
1eef0 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20  pStmt, 0);.     
1ef00 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 2d 3e     }.        p->
1ef10 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e  rc = sqlite3_fin
1ef20 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
1ef30 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1ef40 7d 0a 0a 0a 73 74 61 74 69 63 20 73 71 6c 69 74  }...static sqlit
1ef50 65 33 72 62 75 20 2a 6f 70 65 6e 52 62 75 48 61  e3rbu *openRbuHa
1ef60 6e 64 6c 65 28 0a 20 20 63 6f 6e 73 74 20 63 68  ndle(.  const ch
1ef70 61 72 20 2a 7a 54 61 72 67 65 74 2c 20 0a 20 20  ar *zTarget, .  
1ef80 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 62 75  const char *zRbu
1ef90 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
1efa0 7a 53 74 61 74 65 0a 29 7b 0a 20 20 73 71 6c 69  zState.){.  sqli
1efb0 74 65 33 72 62 75 20 2a 70 3b 0a 20 20 73 69 7a  te3rbu *p;.  siz
1efc0 65 5f 74 20 6e 54 61 72 67 65 74 20 3d 20 7a 54  e_t nTarget = zT
1efd0 61 72 67 65 74 20 3f 20 73 74 72 6c 65 6e 28 7a  arget ? strlen(z
1efe0 54 61 72 67 65 74 29 20 3a 20 30 3b 0a 20 20 73  Target) : 0;.  s
1eff0 69 7a 65 5f 74 20 6e 52 62 75 20 3d 20 73 74 72  ize_t nRbu = str
1f000 6c 65 6e 28 7a 52 62 75 29 3b 0a 20 20 73 69 7a  len(zRbu);.  siz
1f010 65 5f 74 20 6e 42 79 74 65 20 3d 20 73 69 7a 65  e_t nByte = size
1f020 6f 66 28 73 71 6c 69 74 65 33 72 62 75 29 20 2b  of(sqlite3rbu) +
1f030 20 6e 54 61 72 67 65 74 2b 31 20 2b 20 6e 52 62   nTarget+1 + nRb
1f040 75 2b 31 3b 0a 0a 20 20 70 20 3d 20 28 73 71 6c  u+1;..  p = (sql
1f050 69 74 65 33 72 62 75 2a 29 73 71 6c 69 74 65 33  ite3rbu*)sqlite3
1f060 5f 6d 61 6c 6c 6f 63 36 34 28 6e 42 79 74 65 29  _malloc64(nByte)
1f070 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
1f080 20 52 62 75 53 74 61 74 65 20 2a 70 53 74 61 74   RbuState *pStat
1f090 65 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 43  e = 0;..    /* C
1f0a0 72 65 61 74 65 20 74 68 65 20 63 75 73 74 6f 6d  reate the custom
1f0b0 20 56 46 53 2e 20 2a 2f 0a 20 20 20 20 6d 65 6d   VFS. */.    mem
1f0c0 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66  set(p, 0, sizeof
1f0d0 28 73 71 6c 69 74 65 33 72 62 75 29 29 3b 0a 20  (sqlite3rbu));. 
1f0e0 20 20 20 72 62 75 43 72 65 61 74 65 56 66 73 28     rbuCreateVfs(
1f0f0 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e  p);..    /* Open
1f100 20 74 68 65 20 74 61 72 67 65 74 2c 20 52 42 55   the target, RBU
1f110 20 61 6e 64 20 73 74 61 74 65 20 64 61 74 61 62   and state datab
1f120 61 73 65 73 20 2a 2f 0a 20 20 20 20 69 66 28 20  ases */.    if( 
1f130 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
1f140 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
1f150 70 43 73 72 20 3d 20 28 63 68 61 72 2a 29 26 70  pCsr = (char*)&p
1f160 5b 31 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20 62  [1];.      int b
1f170 52 65 74 72 79 20 3d 20 30 3b 0a 20 20 20 20 20  Retry = 0;.     
1f180 20 69 66 28 20 7a 54 61 72 67 65 74 20 29 7b 0a   if( zTarget ){.
1f190 20 20 20 20 20 20 20 20 70 2d 3e 7a 54 61 72 67          p->zTarg
1f1a0 65 74 20 3d 20 70 43 73 72 3b 0a 20 20 20 20 20  et = pCsr;.     
1f1b0 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e 7a 54 61     memcpy(p->zTa
1f1c0 72 67 65 74 2c 20 7a 54 61 72 67 65 74 2c 20 6e  rget, zTarget, n
1f1d0 54 61 72 67 65 74 2b 31 29 3b 0a 20 20 20 20 20  Target+1);.     
1f1e0 20 20 20 70 43 73 72 20 2b 3d 20 6e 54 61 72 67     pCsr += nTarg
1f1f0 65 74 2b 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  et+1;.      }.  
1f200 20 20 20 20 70 2d 3e 7a 52 62 75 20 3d 20 70 43      p->zRbu = pC
1f210 73 72 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  sr;.      memcpy
1f220 28 70 2d 3e 7a 52 62 75 2c 20 7a 52 62 75 2c 20  (p->zRbu, zRbu, 
1f230 6e 52 62 75 2b 31 29 3b 0a 20 20 20 20 20 20 70  nRbu+1);.      p
1f240 43 73 72 20 2b 3d 20 6e 52 62 75 2b 31 3b 0a 20  Csr += nRbu+1;. 
1f250 20 20 20 20 20 69 66 28 20 7a 53 74 61 74 65 20       if( zState 
1f260 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 7a 53  ){.        p->zS
1f270 74 61 74 65 20 3d 20 72 62 75 4d 50 72 69 6e 74  tate = rbuMPrint
1f280 66 28 70 2c 20 22 25 73 22 2c 20 7a 53 74 61 74  f(p, "%s", zStat
1f290 65 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  e);.      }..   
1f2a0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 72     /* If the fir
1f2b0 73 74 20 61 74 74 65 6d 70 74 20 74 6f 20 6f 70  st attempt to op
1f2c0 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  en the database 
1f2d0 66 69 6c 65 20 66 61 69 6c 73 20 61 6e 64 20 74  file fails and t
1f2e0 68 65 20 62 52 65 74 72 79 0a 20 20 20 20 20 20  he bRetry.      
1f2f0 2a 2a 20 66 6c 61 67 20 69 74 20 73 65 74 2c 20  ** flag it set, 
1f300 74 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20  this means that 
1f310 74 68 65 20 64 62 20 77 61 73 20 6e 6f 74 20 6f  the db was not o
1f320 70 65 6e 65 64 20 62 65 63 61 75 73 65 20 69 74  pened because it
1f330 20 73 65 65 6d 65 64 0a 20 20 20 20 20 20 2a 2a   seemed.      **
1f340 20 74 6f 20 62 65 20 61 20 77 61 6c 2d 6d 6f 64   to be a wal-mod
1f350 65 20 64 62 2e 20 42 75 74 2c 20 74 68 69 73 20  e db. But, this 
1f360 6d 61 79 20 68 61 76 65 20 68 61 70 70 65 6e 65  may have happene
1f370 64 20 64 75 65 20 74 6f 20 61 6e 20 65 61 72 6c  d due to an earl
1f380 69 65 72 0a 20 20 20 20 20 20 2a 2a 20 52 42 55  ier.      ** RBU
1f390 20 76 61 63 75 75 6d 20 6f 70 65 72 61 74 69 6f   vacuum operatio
1f3a0 6e 20 6c 65 61 76 69 6e 67 20 61 6e 20 6f 6c 64  n leaving an old
1f3b0 20 77 61 6c 20 66 69 6c 65 20 69 6e 20 74 68 65   wal file in the
1f3c0 20 64 69 72 65 63 74 6f 72 79 2e 0a 20 20 20 20   directory..    
1f3d0 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20    ** If this is 
1f3e0 74 68 65 20 63 61 73 65 2c 20 69 74 20 77 69 6c  the case, it wil
1f3f0 6c 20 68 61 76 65 20 62 65 65 6e 20 63 68 65 63  l have been chec
1f400 6b 70 6f 69 6e 74 65 64 20 61 6e 64 20 64 65 6c  kpointed and del
1f410 65 74 65 64 0a 20 20 20 20 20 20 2a 2a 20 77 68  eted.      ** wh
1f420 65 6e 20 74 68 65 20 68 61 6e 64 6c 65 20 77 61  en the handle wa
1f430 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 61 20 73  s closed and a s
1f440 65 63 6f 6e 64 20 61 74 74 65 6d 70 74 20 74 6f  econd attempt to
1f450 20 6f 70 65 6e 20 74 68 65 20 0a 20 20 20 20 20   open the .     
1f460 20 2a 2a 20 64 61 74 61 62 61 73 65 20 6d 61 79   ** database may
1f470 20 73 75 63 63 65 65 64 2e 20 20 2a 2f 0a 20 20   succeed.  */.  
1f480 20 20 20 20 72 62 75 4f 70 65 6e 44 61 74 61 62      rbuOpenDatab
1f490 61 73 65 28 70 2c 20 26 62 52 65 74 72 79 29 3b  ase(p, &bRetry);
1f4a0 0a 20 20 20 20 20 20 69 66 28 20 62 52 65 74 72  .      if( bRetr
1f4b0 79 20 29 7b 0a 20 20 20 20 20 20 20 20 72 62 75  y ){.        rbu
1f4c0 4f 70 65 6e 44 61 74 61 62 61 73 65 28 70 2c 20  OpenDatabase(p, 
1f4d0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
1f4e0 7d 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  }..    if( p->rc
1f4f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1f500 20 20 20 20 20 70 53 74 61 74 65 20 3d 20 72 62       pState = rb
1f510 75 4c 6f 61 64 53 74 61 74 65 28 70 29 3b 0a 20  uLoadState(p);. 
1f520 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74       assert( pSt
1f530 61 74 65 20 7c 7c 20 70 2d 3e 72 63 21 3d 53 51  ate || p->rc!=SQ
1f540 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
1f550 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
1f560 54 45 5f 4f 4b 20 29 7b 0a 0a 20 20 20 20 20 20  TE_OK ){..      
1f570 20 20 69 66 28 20 70 53 74 61 74 65 2d 3e 65 53    if( pState->eS
1f580 74 61 67 65 3d 3d 30 20 29 7b 20 0a 20 20 20 20  tage==0 ){ .    
1f590 20 20 20 20 20 20 72 62 75 44 65 6c 65 74 65 4f        rbuDeleteO
1f5a0 61 6c 46 69 6c 65 28 70 29 3b 0a 20 20 20 20 20  alFile(p);.     
1f5b0 20 20 20 20 20 72 62 75 49 6e 69 74 50 68 61 73       rbuInitPhas
1f5c0 65 4f 6e 65 53 74 65 70 73 28 70 29 3b 0a 20 20  eOneSteps(p);.  
1f5d0 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 67          p->eStag
1f5e0 65 20 3d 20 52 42 55 5f 53 54 41 47 45 5f 4f 41  e = RBU_STAGE_OA
1f5f0 4c 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  L;.        }else
1f600 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 65  {.          p->e
1f610 53 74 61 67 65 20 3d 20 70 53 74 61 74 65 2d 3e  Stage = pState->
1f620 65 53 74 61 67 65 3b 0a 20 20 20 20 20 20 20 20  eStage;.        
1f630 20 20 70 2d 3e 6e 50 68 61 73 65 4f 6e 65 53 74    p->nPhaseOneSt
1f640 65 70 20 3d 20 70 53 74 61 74 65 2d 3e 6e 50 68  ep = pState->nPh
1f650 61 73 65 4f 6e 65 53 74 65 70 3b 0a 20 20 20 20  aseOneStep;.    
1f660 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 2d      }.        p-
1f670 3e 6e 50 72 6f 67 72 65 73 73 20 3d 20 70 53 74  >nProgress = pSt
1f680 61 74 65 2d 3e 6e 50 72 6f 67 72 65 73 73 3b 0a  ate->nProgress;.
1f690 20 20 20 20 20 20 20 20 70 2d 3e 69 4f 61 6c 53          p->iOalS
1f6a0 7a 20 3d 20 70 53 74 61 74 65 2d 3e 69 4f 61 6c  z = pState->iOal
1f6b0 53 7a 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  Sz;.      }.    
1f6c0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  }.    assert( p-
1f6d0 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc!=SQLITE_OK |
1f6e0 7c 20 70 2d 3e 65 53 74 61 67 65 21 3d 30 20 29  | p->eStage!=0 )
1f6f0 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  ;..    if( p->rc
1f700 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
1f710 2d 3e 70 54 61 72 67 65 74 46 64 2d 3e 70 57 61  ->pTargetFd->pWa
1f720 6c 46 64 20 29 7b 0a 20 20 20 20 20 20 69 66 28  lFd ){.      if(
1f730 20 70 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f   p->eStage==RBU_
1f740 53 54 41 47 45 5f 4f 41 4c 20 29 7b 0a 20 20 20  STAGE_OAL ){.   
1f750 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c       p->rc = SQL
1f760 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
1f770 20 20 20 70 2d 3e 7a 45 72 72 6d 73 67 20 3d 20     p->zErrmsg = 
1f780 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
1f790 22 63 61 6e 6e 6f 74 20 75 70 64 61 74 65 20 77  "cannot update w
1f7a0 61 6c 20 6d 6f 64 65 20 64 61 74 61 62 61 73 65  al mode database
1f7b0 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ");.      }else 
1f7c0 69 66 28 20 70 2d 3e 65 53 74 61 67 65 3d 3d 52  if( p->eStage==R
1f7d0 42 55 5f 53 54 41 47 45 5f 4d 4f 56 45 20 29 7b  BU_STAGE_MOVE ){
1f7e0 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61  .        p->eSta
1f7f0 67 65 20 3d 20 52 42 55 5f 53 54 41 47 45 5f 43  ge = RBU_STAGE_C
1f800 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  KPT;.        p->
1f810 6e 53 74 65 70 20 3d 20 30 3b 0a 20 20 20 20 20  nStep = 0;.     
1f820 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66   }.    }..    if
1f830 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
1f840 4f 4b 20 0a 20 20 20 20 20 26 26 20 28 70 2d 3e  OK .     && (p->
1f850 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47  eStage==RBU_STAG
1f860 45 5f 4f 41 4c 20 7c 7c 20 70 2d 3e 65 53 74 61  E_OAL || p->eSta
1f870 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4d 4f  ge==RBU_STAGE_MO
1f880 56 45 29 0a 20 20 20 20 20 26 26 20 70 53 74 61  VE).     && pSta
1f890 74 65 2d 3e 65 53 74 61 67 65 21 3d 30 0a 20 20  te->eStage!=0.  
1f8a0 20 20 29 7b 0a 20 20 20 20 20 20 72 62 75 5f 66    ){.      rbu_f
1f8b0 69 6c 65 20 2a 70 46 64 20 3d 20 28 72 62 75 49  ile *pFd = (rbuI
1f8c0 73 56 61 63 75 75 6d 28 70 29 20 3f 20 70 2d 3e  sVacuum(p) ? p->
1f8d0 70 52 62 75 46 64 20 3a 20 70 2d 3e 70 54 61 72  pRbuFd : p->pTar
1f8e0 67 65 74 46 64 29 3b 0a 20 20 20 20 20 20 69 66  getFd);.      if
1f8f0 28 20 70 46 64 2d 3e 69 43 6f 6f 6b 69 65 21 3d  ( pFd->iCookie!=
1f900 70 53 74 61 74 65 2d 3e 69 43 6f 6f 6b 69 65 20  pState->iCookie 
1f910 29 7b 20 20 20 0a 20 20 20 20 20 20 20 20 2f 2a  ){   .        /*
1f920 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 28   At this point (
1f930 70 54 61 72 67 65 74 46 64 2d 3e 69 43 6f 6f 6b  pTargetFd->iCook
1f940 69 65 29 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ie) contains the
1f950 20 76 61 6c 75 65 20 6f 66 20 74 68 65 0a 20 20   value of the.  
1f960 20 20 20 20 20 20 2a 2a 20 63 68 61 6e 67 65 2d        ** change-
1f970 63 6f 75 6e 74 65 72 20 63 6f 6f 6b 69 65 20 28  counter cookie (
1f980 74 68 65 20 74 68 69 6e 67 20 74 68 61 74 20 67  the thing that g
1f990 65 74 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20  ets incremented 
1f9a0 77 68 65 6e 20 61 20 0a 20 20 20 20 20 20 20 20  when a .        
1f9b0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
1f9c0 73 20 63 6f 6d 6d 69 74 74 65 64 20 69 6e 20 72  s committed in r
1f9d0 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 29 20 63 75  ollback mode) cu
1f9e0 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 6f  rrently stored o
1f9f0 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61  n .        ** pa
1fa00 67 65 20 31 20 6f 66 20 74 68 65 20 64 61 74 61  ge 1 of the data
1fa10 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  base file. */.  
1fa20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51        p->rc = SQ
1fa30 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
1fa40 20 20 20 70 2d 3e 7a 45 72 72 6d 73 67 20 3d 20     p->zErrmsg = 
1fa50 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
1fa60 22 64 61 74 61 62 61 73 65 20 6d 6f 64 69 66 69  "database modifi
1fa70 65 64 20 64 75 72 69 6e 67 20 72 62 75 20 25 73  ed during rbu %s
1fa80 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 28  ",.            (
1fa90 72 62 75 49 73 56 61 63 75 75 6d 28 70 29 20 3f  rbuIsVacuum(p) ?
1faa0 20 22 76 61 63 75 75 6d 22 20 3a 20 22 75 70 64   "vacuum" : "upd
1fab0 61 74 65 22 29 0a 20 20 20 20 20 20 20 20 29 3b  ate").        );
1fac0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1fad0 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
1fae0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1faf0 20 20 69 66 28 20 70 2d 3e 65 53 74 61 67 65 3d    if( p->eStage=
1fb00 3d 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20 29  =RBU_STAGE_OAL )
1fb10 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1fb20 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 4d 61 69  3 *db = p->dbMai
1fb30 6e 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63  n;.        p->rc
1fb40 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28   = sqlite3_exec(
1fb50 70 2d 3e 64 62 52 62 75 2c 20 22 42 45 47 49 4e  p->dbRbu, "BEGIN
1fb60 22 2c 20 30 2c 20 30 2c 20 26 70 2d 3e 7a 45 72  ", 0, 0, &p->zEr
1fb70 72 6d 73 67 29 3b 0a 0a 20 20 20 20 20 20 20 20  rmsg);..        
1fb80 2f 2a 20 50 6f 69 6e 74 20 74 68 65 20 6f 62 6a  /* Point the obj
1fb90 65 63 74 20 69 74 65 72 61 74 6f 72 20 61 74 20  ect iterator at 
1fba0 74 68 65 20 66 69 72 73 74 20 6f 62 6a 65 63 74  the first object
1fbb0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
1fbc0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
1fbd0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   ){.          p-
1fbe0 3e 72 63 20 3d 20 72 62 75 4f 62 6a 49 74 65 72  >rc = rbuObjIter
1fbf0 46 69 72 73 74 28 70 2c 20 26 70 2d 3e 6f 62 6a  First(p, &p->obj
1fc00 69 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  iter);.        }
1fc10 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  ..        /* If 
1fc20 74 68 65 20 52 42 55 20 64 61 74 61 62 61 73 65  the RBU database
1fc30 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74   contains no dat
1fc40 61 5f 78 78 78 20 74 61 62 6c 65 73 2c 20 64 65  a_xxx tables, de
1fc50 63 6c 61 72 65 20 74 68 65 20 52 42 55 0a 20 20  clare the RBU.  
1fc60 20 20 20 20 20 20 2a 2a 20 75 70 64 61 74 65 20        ** update 
1fc70 66 69 6e 69 73 68 65 64 2e 20 20 2a 2f 0a 20 20  finished.  */.  
1fc80 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
1fc90 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d  =SQLITE_OK && p-
1fca0 3e 6f 62 6a 69 74 65 72 2e 7a 54 62 6c 3d 3d 30  >objiter.zTbl==0
1fcb0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   ){.          p-
1fcc0 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e  >rc = SQLITE_DON
1fcd0 45 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  E;.          p->
1fce0 65 53 74 61 67 65 20 3d 20 52 42 55 5f 53 54 41  eStage = RBU_STA
1fcf0 47 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20 20  GE_DONE;.       
1fd00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1fd10 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
1fd20 49 54 45 5f 4f 4b 20 26 26 20 70 53 74 61 74 65  ITE_OK && pState
1fd30 2d 3e 65 53 74 61 67 65 3d 3d 30 20 26 26 20 72  ->eStage==0 && r
1fd40 62 75 49 73 56 61 63 75 75 6d 28 70 29 20 29 7b  buIsVacuum(p) ){
1fd50 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 62 75  .            rbu
1fd60 43 6f 70 79 50 72 61 67 6d 61 28 70 2c 20 22 70  CopyPragma(p, "p
1fd70 61 67 65 5f 73 69 7a 65 22 29 3b 0a 20 20 20 20  age_size");.    
1fd80 20 20 20 20 20 20 20 20 72 62 75 43 6f 70 79 50          rbuCopyP
1fd90 72 61 67 6d 61 28 70 2c 20 22 61 75 74 6f 5f 76  ragma(p, "auto_v
1fda0 61 63 75 75 6d 22 29 3b 0a 20 20 20 20 20 20 20  acuum");.       
1fdb0 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20     }..          
1fdc0 2f 2a 20 4f 70 65 6e 20 74 72 61 6e 73 61 63 74  /* Open transact
1fdd0 69 6f 6e 73 20 62 6f 74 68 20 64 61 74 61 62 61  ions both databa
1fde0 73 65 73 2e 20 54 68 65 20 2a 2d 6f 61 6c 20 66  ses. The *-oal f
1fdf0 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 6f 72  ile is opened or
1fe00 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 72  .          ** cr
1fe10 65 61 74 65 64 20 61 74 20 74 68 69 73 20 70 6f  eated at this po
1fe20 69 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  int. */.        
1fe30 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
1fe40 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1fe50 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71        p->rc = sq
1fe60 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20 22  lite3_exec(db, "
1fe70 42 45 47 49 4e 20 49 4d 4d 45 44 49 41 54 45 22  BEGIN IMMEDIATE"
1fe80 2c 20 30 2c 20 30 2c 20 26 70 2d 3e 7a 45 72 72  , 0, 0, &p->zErr
1fe90 6d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  msg);.          
1fea0 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  }..          /* 
1feb0 43 68 65 63 6b 20 69 66 20 74 68 65 20 6d 61 69  Check if the mai
1fec0 6e 20 64 61 74 61 62 61 73 65 20 69 73 20 61 20  n database is a 
1fed0 7a 69 70 76 66 73 20 64 62 2e 20 49 66 20 69 74  zipvfs db. If it
1fee0 20 69 73 2c 20 73 65 74 20 74 68 65 20 75 70 70   is, set the upp
1fef0 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  er.          ** 
1ff00 6c 65 76 65 6c 20 70 61 67 65 72 20 74 6f 20 75  level pager to u
1ff10 73 65 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  se "journal_mode
1ff20 3d 6f 66 66 22 2e 20 54 68 69 73 20 70 72 65 76  =off". This prev
1ff30 65 6e 74 73 20 69 74 20 66 72 6f 6d 20 0a 20 20  ents it from .  
1ff40 20 20 20 20 20 20 20 20 2a 2a 20 67 65 6e 65 72          ** gener
1ff50 61 74 69 6e 67 20 61 20 6c 61 72 67 65 20 6a 6f  ating a large jo
1ff60 75 72 6e 61 6c 20 75 73 69 6e 67 20 61 20 74 65  urnal using a te
1ff70 6d 70 20 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 20  mp file.  */.   
1ff80 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63         if( p->rc
1ff90 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1ffa0 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66             int f
1ffb0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c  rc = sqlite3_fil
1ffc0 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 22 6d  e_control(db, "m
1ffd0 61 69 6e 22 2c 20 53 51 4c 49 54 45 5f 46 43 4e  ain", SQLITE_FCN
1ffe0 54 4c 5f 5a 49 50 56 46 53 2c 20 30 29 3b 0a 20  TL_ZIPVFS, 0);. 
1fff0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 66             if( f
20000 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
20010 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
20020 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65  ->rc = sqlite3_e
20030 78 65 63 28 0a 20 20 20 20 20 20 20 20 20 20 20  xec(.           
20040 20 20 20 20 20 64 62 2c 20 22 50 52 41 47 4d 41       db, "PRAGMA
20050 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6f 66   journal_mode=of
20060 66 22 2c 30 2c 30 2c 26 70 2d 3e 7a 45 72 72 6d  f",0,0,&p->zErrm
20070 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  sg);.           
20080 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a   }.          }..
20090 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d            if( p-
200a0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
200b0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 62  {.            rb
200c0 75 53 65 74 75 70 4f 61 6c 28 70 2c 20 70 53 74  uSetupOal(p, pSt
200d0 61 74 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ate);.          
200e0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
200f0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 65    }else if( p->e
20100 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45  Stage==RBU_STAGE
20110 5f 4d 4f 56 45 20 29 7b 0a 20 20 20 20 20 20 20  _MOVE ){.       
20120 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20   /* no-op */.   
20130 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e     }else if( p->
20140 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47  eStage==RBU_STAG
20150 45 5f 43 4b 50 54 20 29 7b 0a 20 20 20 20 20 20  E_CKPT ){.      
20160 20 20 72 62 75 53 65 74 75 70 43 68 65 63 6b 70    rbuSetupCheckp
20170 6f 69 6e 74 28 70 2c 20 70 53 74 61 74 65 29 3b  oint(p, pState);
20180 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
20190 20 70 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f   p->eStage==RBU_
201a0 53 54 41 47 45 5f 44 4f 4e 45 20 29 7b 0a 20 20  STAGE_DONE ){.  
201b0 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51        p->rc = SQ
201c0 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20  LITE_DONE;.     
201d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
201e0 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 43  p->rc = SQLITE_C
201f0 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 7d 0a  ORRUPT;.      }.
20200 20 20 20 20 7d 0a 0a 20 20 20 20 72 62 75 46 72      }..    rbuFr
20210 65 65 53 74 61 74 65 28 70 53 74 61 74 65 29 3b  eeState(pState);
20220 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
20230 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ;.}../*.** Alloc
20240 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61  ate and return a
20250 6e 20 52 42 55 20 68 61 6e 64 6c 65 20 77 69 74  n RBU handle wit
20260 68 20 61 6c 6c 20 66 69 65 6c 64 73 20 7a 65 72  h all fields zer
20270 6f 65 64 20 65 78 63 65 70 74 20 66 6f 72 20 74  oed except for t
20280 68 65 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65  he.** error code
20290 2c 20 77 68 69 63 68 20 69 73 20 73 65 74 20 74  , which is set t
202a0 6f 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 2e  o SQLITE_MISUSE.
202b0 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74  .*/.static sqlit
202c0 65 33 72 62 75 20 2a 72 62 75 4d 69 73 75 73 65  e3rbu *rbuMisuse
202d0 45 72 72 6f 72 28 76 6f 69 64 29 7b 0a 20 20 73  Error(void){.  s
202e0 71 6c 69 74 65 33 72 62 75 20 2a 70 52 65 74 3b  qlite3rbu *pRet;
202f0 0a 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65  .  pRet = sqlite
20300 33 5f 6d 61 6c 6c 6f 63 36 34 28 73 69 7a 65 6f  3_malloc64(sizeo
20310 66 28 73 71 6c 69 74 65 33 72 62 75 29 29 3b 0a  f(sqlite3rbu));.
20320 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20    if( pRet ){.  
20330 20 20 6d 65 6d 73 65 74 28 70 52 65 74 2c 20 30    memset(pRet, 0
20340 2c 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33  , sizeof(sqlite3
20350 72 62 75 29 29 3b 0a 20 20 20 20 70 52 65 74 2d  rbu));.    pRet-
20360 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4d 49 53  >rc = SQLITE_MIS
20370 55 53 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  USE;.  }.  retur
20380 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pRet;.}../*.**
20390 20 4f 70 65 6e 20 61 6e 64 20 72 65 74 75 72 6e   Open and return
203a0 20 61 20 6e 65 77 20 52 42 55 20 68 61 6e 64 6c   a new RBU handl
203b0 65 2e 20 0a 2a 2f 0a 73 71 6c 69 74 65 33 72 62  e. .*/.sqlite3rb
203c0 75 20 2a 73 71 6c 69 74 65 33 72 62 75 5f 6f 70  u *sqlite3rbu_op
203d0 65 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  en(.  const char
203e0 20 2a 7a 54 61 72 67 65 74 2c 20 0a 20 20 63 6f   *zTarget, .  co
203f0 6e 73 74 20 63 68 61 72 20 2a 7a 52 62 75 2c 0a  nst char *zRbu,.
20400 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
20410 74 61 74 65 0a 29 7b 0a 20 20 69 66 28 20 7a 54  tate.){.  if( zT
20420 61 72 67 65 74 3d 3d 30 20 7c 7c 20 7a 52 62 75  arget==0 || zRbu
20430 3d 3d 30 20 29 7b 20 72 65 74 75 72 6e 20 72 62  ==0 ){ return rb
20440 75 4d 69 73 75 73 65 45 72 72 6f 72 28 29 3b 20  uMisuseError(); 
20450 7d 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 43 68 65  }.  /* TODO: Che
20460 63 6b 20 74 68 61 74 20 7a 54 61 72 67 65 74 20  ck that zTarget 
20470 61 6e 64 20 7a 52 62 75 20 61 72 65 20 6e 6f 6e  and zRbu are non
20480 2d 4e 55 4c 4c 20 2a 2f 0a 20 20 72 65 74 75 72  -NULL */.  retur
20490 6e 20 6f 70 65 6e 52 62 75 48 61 6e 64 6c 65 28  n openRbuHandle(
204a0 7a 54 61 72 67 65 74 2c 20 7a 52 62 75 2c 20 7a  zTarget, zRbu, z
204b0 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  State);.}../*.**
204c0 20 4f 70 65 6e 20 61 20 68 61 6e 64 6c 65 20 74   Open a handle t
204d0 6f 20 62 65 67 69 6e 20 6f 72 20 72 65 73 75 6d  o begin or resum
204e0 65 20 61 6e 20 52 42 55 20 56 41 43 55 55 4d 20  e an RBU VACUUM 
204f0 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 71  operation..*/.sq
20500 6c 69 74 65 33 72 62 75 20 2a 73 71 6c 69 74 65  lite3rbu *sqlite
20510 33 72 62 75 5f 76 61 63 75 75 6d 28 0a 20 20 63  3rbu_vacuum(.  c
20520 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 72 67  onst char *zTarg
20530 65 74 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61  et, .  const cha
20540 72 20 2a 7a 53 74 61 74 65 0a 29 7b 0a 20 20 69  r *zState.){.  i
20550 66 28 20 7a 54 61 72 67 65 74 3d 3d 30 20 29 7b  f( zTarget==0 ){
20560 20 72 65 74 75 72 6e 20 72 62 75 4d 69 73 75 73   return rbuMisus
20570 65 45 72 72 6f 72 28 29 3b 20 7d 0a 20 20 69 66  eError(); }.  if
20580 28 20 7a 53 74 61 74 65 20 29 7b 0a 20 20 20 20  ( zState ){.    
20590 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a  int n = strlen(z
205a0 53 74 61 74 65 29 3b 0a 20 20 20 20 69 66 28 20  State);.    if( 
205b0 6e 3e 3d 37 20 26 26 20 30 3d 3d 6d 65 6d 63 6d  n>=7 && 0==memcm
205c0 70 28 22 2d 76 61 63 74 6d 70 22 2c 20 26 7a 53  p("-vactmp", &zS
205d0 74 61 74 65 5b 6e 2d 37 5d 2c 20 37 29 20 29 7b  tate[n-7], 7) ){
205e0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 62  .      return rb
205f0 75 4d 69 73 75 73 65 45 72 72 6f 72 28 29 3b 0a  uMisuseError();.
20600 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 54      }.  }.  /* T
20610 4f 44 4f 3a 20 43 68 65 63 6b 20 74 68 61 74 20  ODO: Check that 
20620 62 6f 74 68 20 61 72 67 75 6d 65 6e 74 73 20 61  both arguments a
20630 72 65 20 6e 6f 6e 2d 4e 55 4c 4c 20 2a 2f 0a 20  re non-NULL */. 
20640 20 72 65 74 75 72 6e 20 6f 70 65 6e 52 62 75 48   return openRbuH
20650 61 6e 64 6c 65 28 30 2c 20 7a 54 61 72 67 65 74  andle(0, zTarget
20660 2c 20 7a 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a  , zState);.}../*
20670 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64  .** Return the d
20680 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 75  atabase handle u
20690 73 65 64 20 62 79 20 70 52 62 75 2e 0a 2a 2f 0a  sed by pRbu..*/.
206a0 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65 33  sqlite3 *sqlite3
206b0 72 62 75 5f 64 62 28 73 71 6c 69 74 65 33 72 62  rbu_db(sqlite3rb
206c0 75 20 2a 70 52 62 75 2c 20 69 6e 74 20 62 52 62  u *pRbu, int bRb
206d0 75 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  u){.  sqlite3 *d
206e0 62 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 52 62  b = 0;.  if( pRb
206f0 75 20 29 7b 0a 20 20 20 20 64 62 20 3d 20 28 62  u ){.    db = (b
20700 52 62 75 20 3f 20 70 52 62 75 2d 3e 64 62 52 62  Rbu ? pRbu->dbRb
20710 75 20 3a 20 70 52 62 75 2d 3e 64 62 4d 61 69 6e  u : pRbu->dbMain
20720 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
20730 64 62 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66  db;.}.../*.** If
20740 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
20750 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64  currently stored
20760 20 69 6e 20 74 68 65 20 52 42 55 20 68 61 6e 64   in the RBU hand
20770 6c 65 20 69 73 20 53 51 4c 49 54 45 5f 43 4f 4e  le is SQLITE_CON
20780 53 54 52 41 49 4e 54 2c 0a 2a 2a 20 74 68 65 6e  STRAINT,.** then
20790 20 65 64 69 74 20 61 6e 79 20 65 72 72 6f 72 20   edit any error 
207a0 6d 65 73 73 61 67 65 20 73 74 72 69 6e 67 20 73  message string s
207b0 6f 20 61 73 20 74 6f 20 72 65 6d 6f 76 65 20 61  o as to remove a
207c0 6c 6c 20 6f 63 63 75 72 72 65 6e 63 65 73 20 6f  ll occurrences o
207d0 66 0a 2a 2a 20 74 68 65 20 70 61 74 74 65 72 6e  f.** the pattern
207e0 20 22 72 62 75 5f 69 6d 70 5f 5b 30 2d 39 5d 2a   "rbu_imp_[0-9]*
207f0 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  "..*/.static voi
20800 64 20 72 62 75 45 64 69 74 45 72 72 6d 73 67 28  d rbuEditErrmsg(
20810 73 71 6c 69 74 65 33 72 62 75 20 2a 70 29 7b 0a  sqlite3rbu *p){.
20820 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
20830 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 26  ITE_CONSTRAINT &
20840 26 20 70 2d 3e 7a 45 72 72 6d 73 67 20 29 7b 0a  & p->zErrmsg ){.
20850 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74      unsigned int
20860 20 69 3b 0a 20 20 20 20 73 69 7a 65 5f 74 20 6e   i;.    size_t n
20870 45 72 72 6d 73 67 20 3d 20 73 74 72 6c 65 6e 28  Errmsg = strlen(
20880 70 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a 20 20 20  p->zErrmsg);.   
20890 20 66 6f 72 28 69 3d 30 3b 20 69 3c 28 6e 45 72   for(i=0; i<(nEr
208a0 72 6d 73 67 2d 38 29 3b 20 69 2b 2b 29 7b 0a 20  rmsg-8); i++){. 
208b0 20 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28       if( memcmp(
208c0 26 70 2d 3e 7a 45 72 72 6d 73 67 5b 69 5d 2c 20  &p->zErrmsg[i], 
208d0 22 72 62 75 5f 69 6d 70 5f 22 2c 20 38 29 3d 3d  "rbu_imp_", 8)==
208e0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  0 ){.        int
208f0 20 6e 44 65 6c 20 3d 20 38 3b 0a 20 20 20 20 20   nDel = 8;.     
20900 20 20 20 77 68 69 6c 65 28 20 70 2d 3e 7a 45 72     while( p->zEr
20910 72 6d 73 67 5b 69 2b 6e 44 65 6c 5d 3e 3d 27 30  rmsg[i+nDel]>='0
20920 27 20 26 26 20 70 2d 3e 7a 45 72 72 6d 73 67 5b  ' && p->zErrmsg[
20930 69 2b 6e 44 65 6c 5d 3c 3d 27 39 27 20 29 20 6e  i+nDel]<='9' ) n
20940 44 65 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6d  Del++;.        m
20950 65 6d 6d 6f 76 65 28 26 70 2d 3e 7a 45 72 72 6d  emmove(&p->zErrm
20960 73 67 5b 69 5d 2c 20 26 70 2d 3e 7a 45 72 72 6d  sg[i], &p->zErrm
20970 73 67 5b 69 2b 6e 44 65 6c 5d 2c 20 6e 45 72 72  sg[i+nDel], nErr
20980 6d 73 67 20 2b 20 31 20 2d 20 69 20 2d 20 6e 44  msg + 1 - i - nD
20990 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 6e 45 72  el);.        nEr
209a0 72 6d 73 67 20 2d 3d 20 6e 44 65 6c 3b 0a 20 20  rmsg -= nDel;.  
209b0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
209c0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74  }../*.** Close t
209d0 68 65 20 52 42 55 20 68 61 6e 64 6c 65 2e 0a 2a  he RBU handle..*
209e0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 72 62 75  /.int sqlite3rbu
209f0 5f 63 6c 6f 73 65 28 73 71 6c 69 74 65 33 72 62  _close(sqlite3rb
20a00 75 20 2a 70 2c 20 63 68 61 72 20 2a 2a 70 7a 45  u *p, char **pzE
20a10 72 72 6d 73 67 29 7b 0a 20 20 69 6e 74 20 72 63  rrmsg){.  int rc
20a20 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 0a 20 20  ;.  if( p ){..  
20a30 20 20 2f 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20    /* Commit the 
20a40 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20 74  transaction to t
20a50 68 65 20 2a 2d 6f 61 6c 20 66 69 6c 65 2e 20 2a  he *-oal file. *
20a60 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d  /.    if( p->rc=
20a70 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d  =SQLITE_OK && p-
20a80 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41  >eStage==RBU_STA
20a90 47 45 5f 4f 41 4c 20 29 7b 0a 20 20 20 20 20 20  GE_OAL ){.      
20aa0 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  p->rc = sqlite3_
20ab0 65 78 65 63 28 70 2d 3e 64 62 4d 61 69 6e 2c 20  exec(p->dbMain, 
20ac0 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 2c 20  "COMMIT", 0, 0, 
20ad0 26 70 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a 20 20  &p->zErrmsg);.  
20ae0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63    }..    /* Sync
20af0 20 74 68 65 20 64 62 20 66 69 6c 65 20 69 66 20   the db file if 
20b00 63 75 72 72 65 6e 74 6c 79 20 64 6f 69 6e 67 20  currently doing 
20b10 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 63  an incremental c
20b20 68 65 63 6b 70 6f 69 6e 74 20 2a 2f 0a 20 20 20  heckpoint */.   
20b30 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
20b40 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 65 53 74 61  TE_OK && p->eSta
20b50 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 43 4b  ge==RBU_STAGE_CK
20b60 50 54 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  PT ){.      sqli
20b70 74 65 33 5f 66 69 6c 65 20 2a 70 44 62 20 3d 20  te3_file *pDb = 
20b80 70 2d 3e 70 54 61 72 67 65 74 46 64 2d 3e 70 52  p->pTargetFd->pR
20b90 65 61 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 72 63  eal;.      p->rc
20ba0 20 3d 20 70 44 62 2d 3e 70 4d 65 74 68 6f 64 73   = pDb->pMethods
20bb0 2d 3e 78 53 79 6e 63 28 70 44 62 2c 20 53 51 4c  ->xSync(pDb, SQL
20bc0 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29  ITE_SYNC_NORMAL)
20bd0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 62 75  ;.    }..    rbu
20be0 53 61 76 65 53 74 61 74 65 28 70 2c 20 70 2d 3e  SaveState(p, p->
20bf0 65 53 74 61 67 65 29 3b 0a 0a 20 20 20 20 69 66  eStage);..    if
20c00 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
20c10 4f 4b 20 26 26 20 70 2d 3e 65 53 74 61 67 65 3d  OK && p->eStage=
20c20 3d 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20 29  =RBU_STAGE_OAL )
20c30 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20  {.      p->rc = 
20c40 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e  sqlite3_exec(p->
20c50 64 62 52 62 75 2c 20 22 43 4f 4d 4d 49 54 22 2c  dbRbu, "COMMIT",
20c60 20 30 2c 20 30 2c 20 26 70 2d 3e 7a 45 72 72 6d   0, 0, &p->zErrm
20c70 73 67 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  sg);.    }..    
20c80 2f 2a 20 43 6c 6f 73 65 20 61 6e 79 20 6f 70 65  /* Close any ope
20c90 6e 20 73 74 61 74 65 6d 65 6e 74 20 68 61 6e 64  n statement hand
20ca0 6c 65 73 2e 20 2a 2f 0a 20 20 20 20 72 62 75 4f  les. */.    rbuO
20cb0 62 6a 49 74 65 72 46 69 6e 61 6c 69 7a 65 28 26  bjIterFinalize(&
20cc0 70 2d 3e 6f 62 6a 69 74 65 72 29 3b 0a 0a 20 20  p->objiter);..  
20cd0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
20ce0 61 6e 20 52 42 55 20 76 61 63 75 75 6d 20 68 61  an RBU vacuum ha
20cf0 6e 64 6c 65 20 61 6e 64 20 74 68 65 20 76 61 63  ndle and the vac
20d00 75 75 6d 20 68 61 73 20 65 69 74 68 65 72 20 66  uum has either f
20d10 69 6e 69 73 68 65 64 0a 20 20 20 20 2a 2a 20 73  inished.    ** s
20d20 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 72 20 65  uccessfully or e
20d30 6e 63 6f 75 6e 74 65 72 65 64 20 61 6e 20 65 72  ncountered an er
20d40 72 6f 72 2c 20 64 65 6c 65 74 65 20 74 68 65 20  ror, delete the 
20d50 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
20d60 0a 20 20 20 20 2a 2a 20 73 74 61 74 65 20 74 61  .    ** state ta
20d70 62 6c 65 2e 20 54 68 69 73 20 63 61 75 73 65 73  ble. This causes
20d80 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74   the next call t
20d90 6f 20 73 71 6c 69 74 65 33 72 62 75 5f 76 61 63  o sqlite3rbu_vac
20da0 75 75 6d 28 29 20 0a 20 20 20 20 2a 2a 20 73 70  uum() .    ** sp
20db0 65 63 69 66 79 69 6e 67 20 74 68 65 20 63 75 72  ecifying the cur
20dc0 72 65 6e 74 20 74 61 72 67 65 74 20 61 6e 64 20  rent target and 
20dd0 73 74 61 74 65 20 64 61 74 61 62 61 73 65 73 20  state databases 
20de0 74 6f 20 73 74 61 72 74 20 61 20 6e 65 77 0a 20  to start a new. 
20df0 20 20 20 2a 2a 20 76 61 63 75 75 6d 20 66 72 6f     ** vacuum fro
20e00 6d 20 73 63 72 61 74 63 68 2e 20 20 2a 2f 0a 20  m scratch.  */. 
20e10 20 20 20 69 66 28 20 72 62 75 49 73 56 61 63 75     if( rbuIsVacu
20e20 75 6d 28 70 29 20 26 26 20 70 2d 3e 72 63 21 3d  um(p) && p->rc!=
20e30 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e  SQLITE_OK && p->
20e40 64 62 52 62 75 20 29 7b 0a 20 20 20 20 20 20 69  dbRbu ){.      i
20e50 6e 74 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33  nt rc2 = sqlite3
20e60 5f 65 78 65 63 28 70 2d 3e 64 62 52 62 75 2c 20  _exec(p->dbRbu, 
20e70 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 73 74 61  "DELETE FROM sta
20e80 74 2e 72 62 75 5f 73 74 61 74 65 22 2c 20 30 2c  t.rbu_state", 0,
20e90 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66   0, 0);.      if
20ea0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
20eb0 44 4f 4e 45 20 26 26 20 72 63 32 21 3d 53 51 4c  DONE && rc2!=SQL
20ec0 49 54 45 5f 4f 4b 20 29 20 70 2d 3e 72 63 20 3d  ITE_OK ) p->rc =
20ed0 20 72 63 32 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   rc2;.    }..   
20ee0 20 2f 2a 20 43 6c 6f 73 65 20 74 68 65 20 6f 70   /* Close the op
20ef0 65 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  en database hand
20f00 6c 65 20 61 6e 64 20 56 46 53 20 6f 62 6a 65 63  le and VFS objec
20f10 74 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  t. */.    sqlite
20f20 33 5f 63 6c 6f 73 65 28 70 2d 3e 64 62 52 62 75  3_close(p->dbRbu
20f30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
20f40 6c 6f 73 65 28 70 2d 3e 64 62 4d 61 69 6e 29 3b  lose(p->dbMain);
20f50 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
20f60 73 7a 54 65 6d 70 3d 3d 30 20 29 3b 0a 20 20 20  szTemp==0 );.   
20f70 20 72 62 75 44 65 6c 65 74 65 56 66 73 28 70 29   rbuDeleteVfs(p)
20f80 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
20f90 65 65 28 70 2d 3e 61 42 75 66 29 3b 0a 20 20 20  ee(p->aBuf);.   
20fa0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
20fb0 3e 61 46 72 61 6d 65 29 3b 0a 0a 20 20 20 20 72  >aFrame);..    r
20fc0 62 75 45 64 69 74 45 72 72 6d 73 67 28 70 29 3b  buEditErrmsg(p);
20fd0 0a 20 20 20 20 72 63 20 3d 20 70 2d 3e 72 63 3b  .    rc = p->rc;
20fe0 0a 20 20 20 20 69 66 28 20 70 7a 45 72 72 6d 73  .    if( pzErrms
20ff0 67 20 29 7b 0a 20 20 20 20 20 20 2a 70 7a 45 72  g ){.      *pzEr
21000 72 6d 73 67 20 3d 20 70 2d 3e 7a 45 72 72 6d 73  rmsg = p->zErrms
21010 67 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  g;.    }else{.  
21020 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
21030 28 70 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a 20 20  (p->zErrmsg);.  
21040 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
21050 66 72 65 65 28 70 2d 3e 7a 53 74 61 74 65 29 3b  free(p->zState);
21060 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
21070 65 28 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  e(p);.  }else{. 
21080 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
21090 4f 4d 45 4d 3b 0a 20 20 20 20 2a 70 7a 45 72 72  OMEM;.    *pzErr
210a0 6d 73 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  msg = 0;.  }.  r
210b0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
210c0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74 6f  ** Return the to
210d0 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6b 65  tal number of ke
210e0 79 2d 76 61 6c 75 65 20 6f 70 65 72 61 74 69 6f  y-value operatio
210f0 6e 73 20 28 69 6e 73 65 72 74 73 2c 20 64 65 6c  ns (inserts, del
21100 65 74 65 73 20 6f 72 20 0a 2a 2a 20 75 70 64 61  etes or .** upda
21110 74 65 73 29 20 74 68 61 74 20 68 61 76 65 20 62  tes) that have b
21120 65 65 6e 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e  een performed on
21130 20 74 68 65 20 74 61 72 67 65 74 20 64 61 74 61   the target data
21140 62 61 73 65 20 73 69 6e 63 65 20 74 68 65 0a 2a  base since the.*
21150 2a 20 63 75 72 72 65 6e 74 20 52 42 55 20 75 70  * current RBU up
21160 64 61 74 65 20 77 61 73 20 73 74 61 72 74 65 64  date was started
21170 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 69 6e 74  ..*/.sqlite3_int
21180 36 34 20 73 71 6c 69 74 65 33 72 62 75 5f 70 72  64 sqlite3rbu_pr
21190 6f 67 72 65 73 73 28 73 71 6c 69 74 65 33 72 62  ogress(sqlite3rb
211a0 75 20 2a 70 52 62 75 29 7b 0a 20 20 72 65 74 75  u *pRbu){.  retu
211b0 72 6e 20 70 52 62 75 2d 3e 6e 50 72 6f 67 72 65  rn pRbu->nProgre
211c0 73 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ss;.}../*.** Ret
211d0 75 72 6e 20 70 65 72 6d 79 72 69 61 64 61 67 65  urn permyriadage
211e0 20 70 72 6f 67 72 65 73 73 20 69 6e 64 69 63 61   progress indica
211f0 74 69 6f 6e 73 20 66 6f 72 20 74 68 65 20 74 77  tions for the tw
21200 6f 20 6d 61 69 6e 20 73 74 61 67 65 73 20 6f 66  o main stages of
21210 0a 2a 2a 20 61 6e 20 52 42 55 20 75 70 64 61 74  .** an RBU updat
21220 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
21230 65 33 72 62 75 5f 62 70 5f 70 72 6f 67 72 65 73  e3rbu_bp_progres
21240 73 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c  s(sqlite3rbu *p,
21250 20 69 6e 74 20 2a 70 6e 4f 6e 65 2c 20 69 6e 74   int *pnOne, int
21260 20 2a 70 6e 54 77 6f 29 7b 0a 20 20 63 6f 6e 73   *pnTwo){.  cons
21270 74 20 69 6e 74 20 4d 41 58 5f 50 52 4f 47 52 45  t int MAX_PROGRE
21280 53 53 20 3d 20 31 30 30 30 30 3b 0a 20 20 73 77  SS = 10000;.  sw
21290 69 74 63 68 28 20 70 2d 3e 65 53 74 61 67 65 20  itch( p->eStage 
212a0 29 7b 0a 20 20 20 20 63 61 73 65 20 52 42 55 5f  ){.    case RBU_
212b0 53 54 41 47 45 5f 4f 41 4c 3a 0a 20 20 20 20 20  STAGE_OAL:.     
212c0 20 69 66 28 20 70 2d 3e 6e 50 68 61 73 65 4f 6e   if( p->nPhaseOn
212d0 65 53 74 65 70 3e 30 20 29 7b 0a 20 20 20 20 20  eStep>0 ){.     
212e0 20 20 20 2a 70 6e 4f 6e 65 20 3d 20 28 69 6e 74     *pnOne = (int
212f0 29 28 4d 41 58 5f 50 52 4f 47 52 45 53 53 20 2a  )(MAX_PROGRESS *
21300 20 28 69 36 34 29 70 2d 3e 6e 50 72 6f 67 72 65   (i64)p->nProgre
21310 73 73 2f 28 69 36 34 29 70 2d 3e 6e 50 68 61 73  ss/(i64)p->nPhas
21320 65 4f 6e 65 53 74 65 70 29 3b 0a 20 20 20 20 20  eOneStep);.     
21330 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
21340 2a 70 6e 4f 6e 65 20 3d 20 2d 31 3b 0a 20 20 20  *pnOne = -1;.   
21350 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 6e 54 77     }.      *pnTw
21360 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65  o = 0;.      bre
21370 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 52 42  ak;..    case RB
21380 55 5f 53 54 41 47 45 5f 4d 4f 56 45 3a 0a 20 20  U_STAGE_MOVE:.  
21390 20 20 20 20 2a 70 6e 4f 6e 65 20 3d 20 4d 41 58      *pnOne = MAX
213a0 5f 50 52 4f 47 52 45 53 53 3b 0a 20 20 20 20 20  _PROGRESS;.     
213b0 20 2a 70 6e 54 77 6f 20 3d 20 30 3b 0a 20 20 20   *pnTwo = 0;.   
213c0 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63     break;..    c
213d0 61 73 65 20 52 42 55 5f 53 54 41 47 45 5f 43 4b  ase RBU_STAGE_CK
213e0 50 54 3a 0a 20 20 20 20 20 20 2a 70 6e 4f 6e 65  PT:.      *pnOne
213f0 20 3d 20 4d 41 58 5f 50 52 4f 47 52 45 53 53 3b   = MAX_PROGRESS;
21400 0a 20 20 20 20 20 20 2a 70 6e 54 77 6f 20 3d 20  .      *pnTwo = 
21410 28 69 6e 74 29 28 4d 41 58 5f 50 52 4f 47 52 45  (int)(MAX_PROGRE
21420 53 53 20 2a 20 28 69 36 34 29 70 2d 3e 6e 53 74  SS * (i64)p->nSt
21430 65 70 20 2f 20 28 69 36 34 29 70 2d 3e 6e 46 72  ep / (i64)p->nFr
21440 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ame);.      brea
21450 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 52 42 55  k;..    case RBU
21460 5f 53 54 41 47 45 5f 44 4f 4e 45 3a 0a 20 20 20  _STAGE_DONE:.   
21470 20 20 20 2a 70 6e 4f 6e 65 20 3d 20 4d 41 58 5f     *pnOne = MAX_
21480 50 52 4f 47 52 45 53 53 3b 0a 20 20 20 20 20 20  PROGRESS;.      
21490 2a 70 6e 54 77 6f 20 3d 20 4d 41 58 5f 50 52 4f  *pnTwo = MAX_PRO
214a0 47 52 45 53 53 3b 0a 20 20 20 20 20 20 62 72 65  GRESS;.      bre
214b0 61 6b 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c 74  ak;..    default
214c0 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  :.      assert( 
214d0 30 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  0 );.  }.}../*.*
214e0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72  * Return the cur
214f0 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20 74 68  rent state of th
21500 65 20 52 42 55 20 76 61 63 75 75 6d 20 6f 72 20  e RBU vacuum or 
21510 75 70 64 61 74 65 20 6f 70 65 72 61 74 69 6f 6e  update operation
21520 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
21530 72 62 75 5f 73 74 61 74 65 28 73 71 6c 69 74 65  rbu_state(sqlite
21540 33 72 62 75 20 2a 70 29 7b 0a 20 20 69 6e 74 20  3rbu *p){.  int 
21550 61 52 65 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 30  aRes[] = {.    0
21560 2c 20 53 51 4c 49 54 45 5f 52 42 55 5f 53 54 41  , SQLITE_RBU_STA
21570 54 45 5f 4f 41 4c 2c 20 53 51 4c 49 54 45 5f 52  TE_OAL, SQLITE_R
21580 42 55 5f 53 54 41 54 45 5f 4d 4f 56 45 2c 0a 20  BU_STATE_MOVE,. 
21590 20 20 20 30 2c 20 53 51 4c 49 54 45 5f 52 42 55     0, SQLITE_RBU
215a0 5f 53 54 41 54 45 5f 43 48 45 43 4b 50 4f 49 4e  _STATE_CHECKPOIN
215b0 54 2c 20 53 51 4c 49 54 45 5f 52 42 55 5f 53 54  T, SQLITE_RBU_ST
215c0 41 54 45 5f 44 4f 4e 45 0a 20 20 7d 3b 0a 0a 20  ATE_DONE.  };.. 
215d0 20 61 73 73 65 72 74 28 20 52 42 55 5f 53 54 41   assert( RBU_STA
215e0 47 45 5f 4f 41 4c 3d 3d 31 20 29 3b 0a 20 20 61  GE_OAL==1 );.  a
215f0 73 73 65 72 74 28 20 52 42 55 5f 53 54 41 47 45  ssert( RBU_STAGE
21600 5f 4d 4f 56 45 3d 3d 32 20 29 3b 0a 20 20 61 73  _MOVE==2 );.  as
21610 73 65 72 74 28 20 52 42 55 5f 53 54 41 47 45 5f  sert( RBU_STAGE_
21620 43 4b 50 54 3d 3d 34 20 29 3b 0a 20 20 61 73 73  CKPT==4 );.  ass
21630 65 72 74 28 20 52 42 55 5f 53 54 41 47 45 5f 44  ert( RBU_STAGE_D
21640 4f 4e 45 3d 3d 35 20 29 3b 0a 20 20 61 73 73 65  ONE==5 );.  asse
21650 72 74 28 20 61 52 65 73 5b 52 42 55 5f 53 54 41  rt( aRes[RBU_STA
21660 47 45 5f 4f 41 4c 5d 3d 3d 53 51 4c 49 54 45 5f  GE_OAL]==SQLITE_
21670 52 42 55 5f 53 54 41 54 45 5f 4f 41 4c 20 29 3b  RBU_STATE_OAL );
21680 0a 20 20 61 73 73 65 72 74 28 20 61 52 65 73 5b  .  assert( aRes[
21690 52 42 55 5f 53 54 41 47 45 5f 4d 4f 56 45 5d 3d  RBU_STAGE_MOVE]=
216a0 3d 53 51 4c 49 54 45 5f 52 42 55 5f 53 54 41 54  =SQLITE_RBU_STAT
216b0 45 5f 4d 4f 56 45 20 29 3b 0a 20 20 61 73 73 65  E_MOVE );.  asse
216c0 72 74 28 20 61 52 65 73 5b 52 42 55 5f 53 54 41  rt( aRes[RBU_STA
216d0 47 45 5f 43 4b 50 54 5d 3d 3d 53 51 4c 49 54 45  GE_CKPT]==SQLITE
216e0 5f 52 42 55 5f 53 54 41 54 45 5f 43 48 45 43 4b  _RBU_STATE_CHECK
216f0 50 4f 49 4e 54 20 29 3b 0a 20 20 61 73 73 65 72  POINT );.  asser
21700 74 28 20 61 52 65 73 5b 52 42 55 5f 53 54 41 47  t( aRes[RBU_STAG
21710 45 5f 44 4f 4e 45 5d 3d 3d 53 51 4c 49 54 45 5f  E_DONE]==SQLITE_
21720 52 42 55 5f 53 54 41 54 45 5f 44 4f 4e 45 20 29  RBU_STATE_DONE )
21730 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 21 3d  ;..  if( p->rc!=
21740 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e  SQLITE_OK && p->
21750 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
21760 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
21770 4c 49 54 45 5f 52 42 55 5f 53 54 41 54 45 5f 45  LITE_RBU_STATE_E
21780 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  RROR;.  }else{. 
21790 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63     assert( p->rc
217a0 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c  !=SQLITE_DONE ||
217b0 20 70 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f   p->eStage==RBU_
217c0 53 54 41 47 45 5f 44 4f 4e 45 20 29 3b 0a 20 20  STAGE_DONE );.  
217d0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 53 74    assert( p->eSt
217e0 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4f  age==RBU_STAGE_O
217f0 41 4c 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  AL.         || p
21800 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54  ->eStage==RBU_ST
21810 41 47 45 5f 4d 4f 56 45 0a 20 20 20 20 20 20 20  AGE_MOVE.       
21820 20 20 7c 7c 20 70 2d 3e 65 53 74 61 67 65 3d 3d    || p->eStage==
21830 52 42 55 5f 53 54 41 47 45 5f 43 4b 50 54 0a 20  RBU_STAGE_CKPT. 
21840 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53          || p->eS
21850 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f  tage==RBU_STAGE_
21860 44 4f 4e 45 0a 20 20 20 20 29 3b 0a 20 20 20 20  DONE.    );.    
21870 72 65 74 75 72 6e 20 61 52 65 73 5b 70 2d 3e 65  return aRes[p->e
21880 53 74 61 67 65 5d 3b 0a 20 20 7d 0a 7d 0a 0a 69  Stage];.  }.}..i
21890 6e 74 20 73 71 6c 69 74 65 33 72 62 75 5f 73 61  nt sqlite3rbu_sa
218a0 76 65 73 74 61 74 65 28 73 71 6c 69 74 65 33 72  vestate(sqlite3r
218b0 62 75 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  bu *p){.  int rc
218c0 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 69 66 28 20   = p->rc;.  if( 
218d0 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
218e0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
218f0 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  OK;..  assert( p
21900 2d 3e 65 53 74 61 67 65 3e 3d 52 42 55 5f 53 54  ->eStage>=RBU_ST
21910 41 47 45 5f 4f 41 4c 20 26 26 20 70 2d 3e 65 53  AGE_OAL && p->eS
21920 74 61 67 65 3c 3d 52 42 55 5f 53 54 41 47 45 5f  tage<=RBU_STAGE_
21930 44 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 70 2d  DONE );.  if( p-
21940 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41  >eStage==RBU_STA
21950 47 45 5f 4f 41 4c 20 29 7b 0a 20 20 20 20 61 73  GE_OAL ){.    as
21960 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
21970 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69 66 28  _DONE );.    if(
21980 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
21990 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78   rc = sqlite3_ex
219a0 65 63 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 43  ec(p->dbMain, "C
219b0 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 2c 20 30 29  OMMIT", 0, 0, 0)
219c0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 79 6e 63  ;.  }..  /* Sync
219d0 20 74 68 65 20 64 62 20 66 69 6c 65 20 2a 2f 0a   the db file */.
219e0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
219f0 5f 4f 4b 20 26 26 20 70 2d 3e 65 53 74 61 67 65  _OK && p->eStage
21a00 3d 3d 52 42 55 5f 53 54 41 47 45 5f 43 4b 50 54  ==RBU_STAGE_CKPT
21a10 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
21a20 66 69 6c 65 20 2a 70 44 62 20 3d 20 70 2d 3e 70  file *pDb = p->p
21a30 54 61 72 67 65 74 46 64 2d 3e 70 52 65 61 6c 3b  TargetFd->pReal;
21a40 0a 20 20 20 20 72 63 20 3d 20 70 44 62 2d 3e 70  .    rc = pDb->p
21a50 4d 65 74 68 6f 64 73 2d 3e 78 53 79 6e 63 28 70  Methods->xSync(p
21a60 44 62 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  Db, SQLITE_SYNC_
21a70 4e 4f 52 4d 41 4c 29 3b 0a 20 20 7d 0a 0a 20 20  NORMAL);.  }..  
21a80 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 72 62  p->rc = rc;.  rb
21a90 75 53 61 76 65 53 74 61 74 65 28 70 2c 20 70 2d  uSaveState(p, p-
21aa0 3e 65 53 74 61 67 65 29 3b 0a 20 20 72 63 20 3d  >eStage);.  rc =
21ab0 20 70 2d 3e 72 63 3b 0a 0a 20 20 69 66 28 20 70   p->rc;..  if( p
21ac0 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54  ->eStage==RBU_ST
21ad0 41 47 45 5f 4f 41 4c 20 29 7b 0a 20 20 20 20 61  AGE_OAL ){.    a
21ae0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
21af0 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69 66  E_DONE );.    if
21b00 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
21b10 29 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65  ) rc = sqlite3_e
21b20 78 65 63 28 70 2d 3e 64 62 52 62 75 2c 20 22 43  xec(p->dbRbu, "C
21b30 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 2c 20 30 29  OMMIT", 0, 0, 0)
21b40 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
21b50 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20 20 20  LITE_OK ){ .    
21b60 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42    const char *zB
21b70 65 67 69 6e 20 3d 20 72 62 75 49 73 56 61 63 75  egin = rbuIsVacu
21b80 75 6d 28 70 29 20 3f 20 22 42 45 47 49 4e 22 20  um(p) ? "BEGIN" 
21b90 3a 20 22 42 45 47 49 4e 20 49 4d 4d 45 44 49 41  : "BEGIN IMMEDIA
21ba0 54 45 22 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  TE";.      rc = 
21bb0 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e  sqlite3_exec(p->
21bc0 64 62 52 62 75 2c 20 7a 42 65 67 69 6e 2c 20 30  dbRbu, zBegin, 0
21bd0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  , 0, 0);.    }. 
21be0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
21bf0 45 5f 4f 4b 20 29 20 72 63 20 3d 20 73 71 6c 69  E_OK ) rc = sqli
21c00 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 4d 61  te3_exec(p->dbMa
21c10 69 6e 2c 20 22 42 45 47 49 4e 20 49 4d 4d 45 44  in, "BEGIN IMMED
21c20 49 41 54 45 22 2c 20 30 2c 20 30 2c 30 29 3b 0a  IATE", 0, 0,0);.
21c30 20 20 7d 0a 0a 20 20 70 2d 3e 72 63 20 3d 20 72    }..  p->rc = r
21c40 63 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  c;.  return rc;.
21c50 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }../************
21c60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21c70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21c80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21c90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
21ca0 2a 20 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20 52  * Beginning of R
21cb0 42 55 20 56 46 53 20 73 68 69 6d 20 6d 65 74 68  BU VFS shim meth
21cc0 6f 64 73 2e 20 54 68 65 20 56 46 53 20 73 68 69  ods. The VFS shi
21cd0 6d 20 6d 6f 64 69 66 69 65 73 20 74 68 65 20 62  m modifies the b
21ce0 65 68 61 76 69 6f 75 72 0a 2a 2a 20 6f 66 20 61  ehaviour.** of a
21cf0 20 73 74 61 6e 64 61 72 64 20 56 46 53 20 69 6e   standard VFS in
21d00 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 77   the following w
21d10 61 79 73 3a 0a 2a 2a 0a 2a 2a 20 31 2e 20 57 68  ays:.**.** 1. Wh
21d20 65 6e 65 76 65 72 20 74 68 65 20 66 69 72 73 74  enever the first
21d30 20 70 61 67 65 20 6f 66 20 61 20 6d 61 69 6e 20   page of a main 
21d40 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
21d50 20 72 65 61 64 20 6f 72 20 0a 2a 2a 20 20 20 20   read or .**    
21d60 77 72 69 74 74 65 6e 2c 20 74 68 65 20 76 61 6c  written, the val
21d70 75 65 20 6f 66 20 74 68 65 20 63 68 61 6e 67 65  ue of the change
21d80 2d 63 6f 75 6e 74 65 72 20 63 6f 6f 6b 69 65 20  -counter cookie 
21d90 69 73 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20  is stored in.** 
21da0 20 20 20 72 62 75 5f 66 69 6c 65 2e 69 43 6f 6f     rbu_file.iCoo
21db0 6b 69 65 2e 20 53 69 6d 69 6c 61 72 6c 79 2c 20  kie. Similarly, 
21dc0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
21dd0 20 22 77 72 69 74 65 2d 76 65 72 73 69 6f 6e 22   "write-version"
21de0 0a 2a 2a 20 20 20 20 64 61 74 61 62 61 73 65 20  .**    database 
21df0 68 65 61 64 65 72 20 66 69 65 6c 64 20 69 73 20  header field is 
21e00 73 74 6f 72 65 64 20 69 6e 20 72 62 75 5f 66 69  stored in rbu_fi
21e10 6c 65 2e 69 57 72 69 74 65 56 65 72 2e 20 54 68  le.iWriteVer. Th
21e20 69 73 20 65 6e 73 75 72 65 73 0a 2a 2a 20 20 20  is ensures.**   
21e30 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 73   that the values
21e40 20 61 72 65 20 61 6c 77 61 79 73 20 74 72 75 73   are always trus
21e50 74 77 6f 72 74 68 79 20 77 69 74 68 69 6e 20 61  tworthy within a
21e60 6e 20 6f 70 65 6e 20 74 72 61 6e 73 61 63 74 69  n open transacti
21e70 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 32 2e 20 57 68 65  on..**.** 2. Whe
21e80 6e 65 76 65 72 20 61 6e 20 53 51 4c 49 54 45 5f  never an SQLITE_
21e90 4f 50 45 4e 5f 57 41 4c 20 66 69 6c 65 20 69 73  OPEN_WAL file is
21ea0 20 6f 70 65 6e 65 64 2c 20 74 68 65 20 28 72 62   opened, the (rb
21eb0 75 5f 66 69 6c 65 2e 70 57 61 6c 46 64 29 0a 2a  u_file.pWalFd).*
21ec0 2a 20 20 20 20 6d 65 6d 62 65 72 20 76 61 72 69  *    member vari
21ed0 61 62 6c 65 20 6f 66 20 74 68 65 20 61 73 73 6f  able of the asso
21ee0 63 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20  ciated database 
21ef0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
21f00 69 73 20 73 65 74 0a 2a 2a 20 20 20 20 74 6f 20  is set.**    to 
21f10 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77  point to the new
21f20 20 66 69 6c 65 2e 20 41 20 6d 75 74 65 78 20 70   file. A mutex p
21f30 72 6f 74 65 63 74 65 64 20 6c 69 6e 6b 65 64 20  rotected linked 
21f40 6c 69 73 74 20 6f 66 20 61 6c 6c 20 6d 61 69 6e  list of all main
21f50 20 0a 2a 2a 20 20 20 20 64 62 20 66 64 73 20 6f   .**    db fds o
21f60 70 65 6e 65 64 20 75 73 69 6e 67 20 61 20 70 61  pened using a pa
21f70 72 74 69 63 75 6c 61 72 20 52 42 55 20 56 46 53  rticular RBU VFS
21f80 20 69 73 20 6d 61 69 6e 74 61 69 6e 65 64 20 61   is maintained a
21f90 74 20 0a 2a 2a 20 20 20 20 72 62 75 5f 76 66 73  t .**    rbu_vfs
21fa0 2e 70 4d 61 69 6e 20 74 6f 20 66 61 63 69 6c 69  .pMain to facili
21fb0 74 61 74 65 20 74 68 69 73 2e 0a 2a 2a 0a 2a 2a  tate this..**.**
21fc0 20 33 2e 20 55 73 69 6e 67 20 61 20 6e 65 77 20   3. Using a new 
21fd0 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 22 53 51  file-control "SQ
21fe0 4c 49 54 45 5f 46 43 4e 54 4c 5f 52 42 55 22 2c  LITE_FCNTL_RBU",
21ff0 20 61 20 6d 61 69 6e 20 64 62 20 72 62 75 5f 66   a main db rbu_f
22000 69 6c 65 20 0a 2a 2a 20 20 20 20 6f 62 6a 65 63  ile .**    objec
22010 74 20 63 61 6e 20 62 65 20 6d 61 72 6b 65 64 20  t can be marked 
22020 61 73 20 74 68 65 20 74 61 72 67 65 74 20 64 61  as the target da
22030 74 61 62 61 73 65 20 6f 66 20 61 6e 20 52 42 55  tabase of an RBU
22040 20 75 70 64 61 74 65 2e 20 54 68 69 73 0a 2a 2a   update. This.**
22050 20 20 20 20 74 75 72 6e 73 20 6f 6e 20 74 68 65      turns on the
22060 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 78 74 72 61   following extra
22070 20 73 70 65 63 69 61 6c 20 62 65 68 61 76 69 6f   special behavio
22080 75 72 3a 0a 2a 2a 0a 2a 2a 20 33 61 2e 20 49 66  ur:.**.** 3a. If
22090 20 78 41 63 63 65 73 73 28 29 20 69 73 20 63 61   xAccess() is ca
220a0 6c 6c 65 64 20 74 6f 20 63 68 65 63 6b 20 69 66  lled to check if
220b0 20 74 68 65 72 65 20 65 78 69 73 74 73 20 61 20   there exists a 
220c0 2a 2d 77 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 20  *-wal file .**  
220d0 20 20 20 61 73 73 6f 63 69 61 74 65 64 20 77 69     associated wi
220e0 74 68 20 61 6e 20 52 42 55 20 74 61 72 67 65 74  th an RBU target
220f0 20 64 61 74 61 62 61 73 65 20 63 75 72 72 65 6e   database curren
22100 74 6c 79 20 69 6e 20 52 42 55 5f 53 54 41 47 45  tly in RBU_STAGE
22110 5f 4f 41 4c 0a 2a 2a 20 20 20 20 20 73 74 61 67  _OAL.**     stag
22120 65 20 28 70 72 65 70 61 72 69 6e 67 20 74 68 65  e (preparing the
22130 20 2a 2d 6f 61 6c 20 66 69 6c 65 29 2c 20 74 68   *-oal file), th
22140 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 70 65 63  e following spec
22150 69 61 6c 20 68 61 6e 64 6c 69 6e 67 0a 2a 2a 20  ial handling.** 
22160 20 20 20 20 61 70 70 6c 69 65 73 3a 0a 2a 2a 0a      applies:.**.
22170 2a 2a 20 20 20 20 20 20 2a 20 69 66 20 74 68 65  **      * if the
22180 20 2a 2d 77 61 6c 20 66 69 6c 65 20 64 6f 65 73   *-wal file does
22190 20 65 78 69 73 74 2c 20 72 65 74 75 72 6e 20 53   exist, return S
221a0 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2e 20  QLITE_CANTOPEN. 
221b0 41 6e 20 52 42 55 0a 2a 2a 20 20 20 20 20 20 20  An RBU.**       
221c0 20 74 61 72 67 65 74 20 64 61 74 61 62 61 73 65   target database
221d0 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 20 77   may not be in w
221e0 61 6c 20 6d 6f 64 65 20 61 6c 72 65 61 64 79 2e  al mode already.
221f0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 2a 20 69 66  .**.**      * if
22200 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20   the *-wal file 
22210 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20  does not exist, 
22220 73 65 74 20 74 68 65 20 6f 75 74 70 75 74 20 70  set the output p
22230 61 72 61 6d 65 74 65 72 20 74 6f 0a 2a 2a 20 20  arameter to.**  
22240 20 20 20 20 20 20 6e 6f 6e 2d 7a 65 72 6f 20 28        non-zero (
22250 74 6f 20 74 65 6c 6c 20 53 51 4c 69 74 65 20 74  to tell SQLite t
22260 68 61 74 20 69 74 20 64 6f 65 73 20 65 78 69 73  hat it does exis
22270 74 29 20 61 6e 79 77 61 79 2e 0a 2a 2a 0a 2a 2a  t) anyway..**.**
22280 20 20 20 20 20 54 68 65 6e 2c 20 77 68 65 6e 20       Then, when 
22290 78 4f 70 65 6e 28 29 20 69 73 20 63 61 6c 6c 65  xOpen() is calle
222a0 64 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 2a 2d  d to open the *-
222b0 77 61 6c 20 66 69 6c 65 20 61 73 73 6f 63 69 61  wal file associa
222c0 74 65 64 20 77 69 74 68 0a 2a 2a 20 20 20 20 20  ted with.**     
222d0 74 68 65 20 52 42 55 20 74 61 72 67 65 74 20 69  the RBU target i
222e0 6e 20 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20  n RBU_STAGE_OAL 
222f0 73 74 61 67 65 2c 20 69 6e 73 74 65 61 64 20 6f  stage, instead o
22300 66 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 2a 2d  f opening the *-
22310 77 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65 2c  wal.**     file,
22320 20 74 68 65 20 72 62 75 20 76 66 73 20 6f 70 65   the rbu vfs ope
22330 6e 73 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  ns the correspon
22340 64 69 6e 67 20 2a 2d 6f 61 6c 20 66 69 6c 65 20  ding *-oal file 
22350 69 6e 73 74 65 61 64 2e 20 0a 2a 2a 0a 2a 2a 20  instead. .**.** 
22360 33 62 2e 20 54 68 65 20 2a 2d 73 68 6d 20 70 61  3b. The *-shm pa
22370 67 65 73 20 72 65 74 75 72 6e 65 64 20 62 79 20  ges returned by 
22380 78 53 68 6d 4d 61 70 28 29 20 66 6f 72 20 61 20  xShmMap() for a 
22390 74 61 72 67 65 74 20 64 62 20 66 69 6c 65 20 69  target db file i
223a0 6e 0a 2a 2a 20 20 20 20 20 52 42 55 5f 53 54 41  n.**     RBU_STA
223b0 47 45 5f 4f 41 4c 20 6d 6f 64 65 20 61 72 65 20  GE_OAL mode are 
223c0 61 63 74 75 61 6c 6c 79 20 73 74 6f 72 65 64 20  actually stored 
223d0 69 6e 20 68 65 61 70 20 6d 65 6d 6f 72 79 2e 20  in heap memory. 
223e0 54 68 69 73 20 69 73 20 74 6f 0a 2a 2a 20 20 20  This is to.**   
223f0 20 20 61 76 6f 69 64 20 63 72 65 61 74 69 6e 67    avoid creating
22400 20 61 20 2a 2d 73 68 6d 20 66 69 6c 65 20 6f 6e   a *-shm file on
22410 20 64 69 73 6b 2e 20 41 64 64 69 74 69 6f 6e 61   disk. Additiona
22420 6c 6c 79 2c 20 78 53 68 6d 4c 6f 63 6b 28 29 20  lly, xShmLock() 
22430 63 61 6c 6c 73 0a 2a 2a 20 20 20 20 20 61 72 65  calls.**     are
22440 20 6e 6f 2d 6f 70 73 20 6f 6e 20 74 61 72 67 65   no-ops on targe
22450 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  t database files
22460 20 69 6e 20 52 42 55 5f 53 54 41 47 45 5f 4f 41   in RBU_STAGE_OA
22470 4c 20 6d 6f 64 65 2e 20 54 68 69 73 20 69 73 0a  L mode. This is.
22480 2a 2a 20 20 20 20 20 62 65 63 61 75 73 65 20 61  **     because a
22490 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
224a0 74 73 20 69 6e 20 73 6f 6d 65 20 56 46 53 20 69  ts in some VFS i
224b0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 66  mplementations f
224c0 61 69 6c 20 69 66 20 0a 2a 2a 20 20 20 20 20 78  ail if .**     x
224d0 53 68 6d 4c 6f 63 6b 28 29 20 69 73 20 63 61 6c  ShmLock() is cal
224e0 6c 65 64 20 62 65 66 6f 72 65 20 78 53 68 6d 4d  led before xShmM
224f0 61 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 33 63 2e 20  ap()..**.** 3c. 
22500 49 66 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  If an EXCLUSIVE 
22510 6c 6f 63 6b 20 69 73 20 61 74 74 65 6d 70 74 65  lock is attempte
22520 64 20 6f 6e 20 61 20 74 61 72 67 65 74 20 64 61  d on a target da
22530 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 61  tabase file in a
22540 6e 79 0a 2a 2a 20 20 20 20 20 6d 6f 64 65 20 65  ny.**     mode e
22550 78 63 65 70 74 20 52 42 55 5f 53 54 41 47 45 5f  xcept RBU_STAGE_
22560 44 4f 4e 45 20 28 61 6c 6c 20 77 6f 72 6b 20 63  DONE (all work c
22570 6f 6d 70 6c 65 74 65 64 20 61 6e 64 20 63 68 65  ompleted and che
22580 63 6b 70 6f 69 6e 74 65 64 29 2c 20 69 74 20 0a  ckpointed), it .
22590 2a 2a 20 20 20 20 20 66 61 69 6c 73 20 77 69 74  **     fails wit
225a0 68 20 61 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  h an SQLITE_BUSY
225b0 20 65 72 72 6f 72 2e 20 54 68 69 73 20 69 73 20   error. This is 
225c0 74 6f 20 73 74 6f 70 20 52 42 55 20 63 6f 6e 6e  to stop RBU conn
225d0 65 63 74 69 6f 6e 73 0a 2a 2a 20 20 20 20 20 66  ections.**     f
225e0 72 6f 6d 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  rom automaticall
225f0 79 20 63 68 65 63 6b 70 6f 69 6e 74 69 6e 67 20  y checkpointing 
22600 61 20 2a 2d 77 61 6c 20 28 6f 72 20 2a 2d 6f 61  a *-wal (or *-oa
22610 6c 29 20 66 69 6c 65 20 66 72 6f 6d 20 77 69 74  l) file from wit
22620 68 69 6e 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74  hin.**     sqlit
22630 65 33 5f 63 6c 6f 73 65 28 29 2e 0a 2a 2a 0a 2a  e3_close()..**.*
22640 2a 20 33 64 2e 20 49 6e 20 52 42 55 5f 53 54 41  * 3d. In RBU_STA
22650 47 45 5f 43 41 50 54 55 52 45 20 6d 6f 64 65 2c  GE_CAPTURE mode,
22660 20 61 6c 6c 20 78 52 65 61 64 28 29 20 63 61 6c   all xRead() cal
22670 6c 73 20 6f 6e 20 74 68 65 20 77 61 6c 20 66 69  ls on the wal fi
22680 6c 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 61  le, and.**     a
22690 6c 6c 20 78 57 72 69 74 65 28 29 20 63 61 6c 6c  ll xWrite() call
226a0 73 20 6f 6e 20 74 68 65 20 74 61 72 67 65 74 20  s on the target 
226b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 70 65  database file pe
226c0 72 66 6f 72 6d 20 6e 6f 20 49 4f 2e 20 0a 2a 2a  rform no IO. .**
226d0 20 20 20 20 20 49 6e 73 74 65 61 64 20 74 68 65       Instead the
226e0 20 66 72 61 6d 65 20 61 6e 64 20 70 61 67 65 20   frame and page 
226f0 6e 75 6d 62 65 72 73 20 74 68 61 74 20 77 6f 75  numbers that wou
22700 6c 64 20 62 65 20 72 65 61 64 20 61 6e 64 20 77  ld be read and w
22710 72 69 74 74 65 6e 0a 2a 2a 20 20 20 20 20 61 72  ritten.**     ar
22720 65 20 72 65 63 6f 72 64 65 64 2e 20 41 64 64 69  e recorded. Addi
22730 74 69 6f 6e 61 6c 6c 79 2c 20 73 75 63 63 65 73  tionally, succes
22740 73 66 75 6c 20 61 74 74 65 6d 70 74 73 20 74 6f  sful attempts to
22750 20 6f 62 74 61 69 6e 20 65 78 63 6c 75 73 69 76   obtain exclusiv
22760 65 0a 2a 2a 20 20 20 20 20 78 53 68 6d 4c 6f 63  e.**     xShmLoc
22770 6b 28 29 20 57 52 49 54 45 52 2c 20 43 48 45 43  k() WRITER, CHEC
22780 4b 50 4f 49 4e 54 45 52 20 61 6e 64 20 52 45 41  KPOINTER and REA
22790 44 30 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20  D0 locks on the 
227a0 74 61 72 67 65 74 20 0a 2a 2a 20 20 20 20 20 64  target .**     d
227b0 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 72 65  atabase file are
227c0 20 72 65 63 6f 72 64 65 64 2e 20 78 53 68 6d 4c   recorded. xShmL
227d0 6f 63 6b 28 29 20 63 61 6c 6c 73 20 74 6f 20 75  ock() calls to u
227e0 6e 6c 6f 63 6b 20 74 68 65 20 73 61 6d 65 0a 2a  nlock the same.*
227f0 2a 20 20 20 20 20 6c 6f 63 6b 73 20 61 72 65 20  *     locks are 
22800 6e 6f 2d 6f 70 73 20 28 73 6f 20 74 68 61 74 20  no-ops (so that 
22810 6f 6e 63 65 20 6f 62 74 61 69 6e 65 64 2c 20 74  once obtained, t
22820 68 65 73 65 20 6c 6f 63 6b 73 20 61 72 65 20 6e  hese locks are n
22830 65 76 65 72 0a 2a 2a 20 20 20 20 20 72 65 6c 69  ever.**     reli
22840 6e 71 75 69 73 68 65 64 29 2e 20 46 69 6e 61 6c  nquished). Final
22850 6c 79 2c 20 63 61 6c 6c 73 20 74 6f 20 78 53 79  ly, calls to xSy
22860 6e 63 28 29 20 6f 6e 20 74 68 65 20 74 61 72 67  nc() on the targ
22870 65 74 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20  et database.**  
22880 20 20 20 66 69 6c 65 20 66 61 69 6c 20 77 69 74     file fail wit
22890 68 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41  h SQLITE_INTERNA
228a0 4c 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 0a 73 74  L errors..*/..st
228b0 61 74 69 63 20 76 6f 69 64 20 72 62 75 55 6e 6c  atic void rbuUnl
228c0 6f 63 6b 53 68 6d 28 72 62 75 5f 66 69 6c 65 20  ockShm(rbu_file 
228d0 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  *p){.  assert( p
228e0 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20 53 51  ->openFlags & SQ
228f0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
22900 42 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 52  B );.  if( p->pR
22910 62 75 20 29 7b 0a 20 20 20 20 69 6e 74 20 28 2a  bu ){.    int (*
22920 78 53 68 6d 4c 6f 63 6b 29 28 73 71 6c 69 74 65  xShmLock)(sqlite
22930 33 5f 66 69 6c 65 2a 2c 69 6e 74 2c 69 6e 74 2c  3_file*,int,int,
22940 69 6e 74 29 20 3d 20 70 2d 3e 70 52 65 61 6c 2d  int) = p->pReal-
22950 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53 68 6d 4c  >pMethods->xShmL
22960 6f 63 6b 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  ock;.    int i;.
22970 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 53      for(i=0; i<S
22980 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 3b  QLITE_SHM_NLOCK;
22990 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
229a0 28 31 3c 3c 69 29 20 26 20 70 2d 3e 70 52 62 75  (1<<i) & p->pRbu
229b0 2d 3e 6d 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20  ->mLock ){.     
229c0 20 20 20 78 53 68 6d 4c 6f 63 6b 28 70 2d 3e 70     xShmLock(p->p
229d0 52 65 61 6c 2c 20 69 2c 20 31 2c 20 53 51 4c 49  Real, i, 1, SQLI
229e0 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 7c 53 51  TE_SHM_UNLOCK|SQ
229f0 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49  LITE_SHM_EXCLUSI
22a00 56 45 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  VE);.      }.   
22a10 20 7d 0a 20 20 20 20 70 2d 3e 70 52 62 75 2d 3e   }.    p->pRbu->
22a20 6d 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 7d 0a 7d  mLock = 0;.  }.}
22a30 0a 0a 2f 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ../*.*/.static i
22a40 6e 74 20 72 62 75 55 70 64 61 74 65 54 65 6d 70  nt rbuUpdateTemp
22a50 53 69 7a 65 28 72 62 75 5f 66 69 6c 65 20 2a 70  Size(rbu_file *p
22a60 46 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  Fd, sqlite3_int6
22a70 34 20 6e 4e 65 77 29 7b 0a 20 20 73 71 6c 69 74  4 nNew){.  sqlit
22a80 65 33 72 62 75 20 2a 70 52 62 75 20 3d 20 70 46  e3rbu *pRbu = pF
22a90 64 2d 3e 70 52 62 75 3b 0a 20 20 69 36 34 20 6e  d->pRbu;.  i64 n
22aa0 44 69 66 66 20 3d 20 6e 4e 65 77 20 2d 20 70 46  Diff = nNew - pF
22ab0 64 2d 3e 73 7a 3b 0a 20 20 70 52 62 75 2d 3e 73  d->sz;.  pRbu->s
22ac0 7a 54 65 6d 70 20 2b 3d 20 6e 44 69 66 66 3b 0a  zTemp += nDiff;.
22ad0 20 20 70 46 64 2d 3e 73 7a 20 3d 20 6e 4e 65 77    pFd->sz = nNew
22ae0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 62 75  ;.  assert( pRbu
22af0 2d 3e 73 7a 54 65 6d 70 3e 3d 30 20 29 3b 0a 20  ->szTemp>=0 );. 
22b00 20 69 66 28 20 70 52 62 75 2d 3e 73 7a 54 65 6d   if( pRbu->szTem
22b10 70 4c 69 6d 69 74 20 26 26 20 70 52 62 75 2d 3e  pLimit && pRbu->
22b20 73 7a 54 65 6d 70 3e 70 52 62 75 2d 3e 73 7a 54  szTemp>pRbu->szT
22b30 65 6d 70 4c 69 6d 69 74 20 29 20 72 65 74 75 72  empLimit ) retur
22b40 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20  n SQLITE_FULL;. 
22b50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
22b60 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  K;.}../*.** Add 
22b70 61 6e 20 69 74 65 6d 20 74 6f 20 74 68 65 20 6d  an item to the m
22b80 61 69 6e 2d 64 62 20 6c 69 73 74 73 2c 20 69 66  ain-db lists, if
22b90 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
22ba0 64 79 20 70 72 65 73 65 6e 74 2e 0a 2a 2a 0a 2a  dy present..**.*
22bb0 2a 20 54 68 65 72 65 20 61 72 65 20 74 77 6f 20  * There are two 
22bc0 6d 61 69 6e 2d 64 62 20 6c 69 73 74 73 2e 20 4f  main-db lists. O
22bd0 6e 65 20 66 6f 72 20 61 6c 6c 20 66 69 6c 65 20  ne for all file 
22be0 64 65 73 63 72 69 70 74 6f 72 73 2c 20 61 6e 64  descriptors, and
22bf0 20 6f 6e 65 0a 2a 2a 20 66 6f 72 20 61 6c 6c 20   one.** for all 
22c00 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
22c10 20 77 69 74 68 20 72 62 75 5f 66 69 6c 65 2e 70   with rbu_file.p
22c20 44 62 21 3d 30 2e 20 49 66 20 74 68 65 20 61 72  Db!=0. If the ar
22c30 67 75 6d 65 6e 74 20 68 61 73 0a 2a 2a 20 72 62  gument has.** rb
22c40 75 5f 66 69 6c 65 2e 70 44 62 21 3d 30 2c 20 74  u_file.pDb!=0, t
22c50 68 65 6e 20 69 74 20 69 73 20 61 73 73 75 6d 65  hen it is assume
22c60 64 20 74 6f 20 61 6c 72 65 61 64 79 20 62 65 20  d to already be 
22c70 70 72 65 73 65 6e 74 20 6f 6e 20 74 68 65 0a 2a  present on the.*
22c80 2a 20 6d 61 69 6e 20 6c 69 73 74 20 61 6e 64 20  * main list and 
22c90 69 73 20 6f 6e 6c 79 20 61 64 64 65 64 20 74 6f  is only added to
22ca0 20 74 68 65 20 70 44 62 21 3d 30 20 6c 69 73 74   the pDb!=0 list
22cb0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
22cc0 20 72 62 75 4d 61 69 6e 6c 69 73 74 41 64 64 28   rbuMainlistAdd(
22cd0 72 62 75 5f 66 69 6c 65 20 2a 70 29 7b 0a 20 20  rbu_file *p){.  
22ce0 72 62 75 5f 76 66 73 20 2a 70 52 62 75 56 66 73  rbu_vfs *pRbuVfs
22cf0 20 3d 20 70 2d 3e 70 52 62 75 56 66 73 3b 0a 20   = p->pRbuVfs;. 
22d00 20 72 62 75 5f 66 69 6c 65 20 2a 70 49 74 65 72   rbu_file *pIter
22d10 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e  ;.  assert( (p->
22d20 6f 70 65 6e 46 6c 61 67 73 20 26 20 53 51 4c 49  openFlags & SQLI
22d30 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29  TE_OPEN_MAIN_DB)
22d40 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   );.  sqlite3_mu
22d50 74 65 78 5f 65 6e 74 65 72 28 70 52 62 75 56 66  tex_enter(pRbuVf
22d60 73 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28  s->mutex);.  if(
22d70 20 70 2d 3e 70 52 62 75 3d 3d 30 20 29 7b 0a 20   p->pRbu==0 ){. 
22d80 20 20 20 66 6f 72 28 70 49 74 65 72 3d 70 52 62     for(pIter=pRb
22d90 75 56 66 73 2d 3e 70 4d 61 69 6e 3b 20 70 49 74  uVfs->pMain; pIt
22da0 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72 2d  er; pIter=pIter-
22db0 3e 70 4d 61 69 6e 4e 65 78 74 29 3b 0a 20 20 20  >pMainNext);.   
22dc0 20 70 2d 3e 70 4d 61 69 6e 4e 65 78 74 20 3d 20   p->pMainNext = 
22dd0 70 52 62 75 56 66 73 2d 3e 70 4d 61 69 6e 3b 0a  pRbuVfs->pMain;.
22de0 20 20 20 20 70 52 62 75 56 66 73 2d 3e 70 4d 61      pRbuVfs->pMa
22df0 69 6e 20 3d 20 70 3b 0a 20 20 7d 65 6c 73 65 7b  in = p;.  }else{
22e00 0a 20 20 20 20 66 6f 72 28 70 49 74 65 72 3d 70  .    for(pIter=p
22e10 52 62 75 56 66 73 2d 3e 70 4d 61 69 6e 52 62 75  RbuVfs->pMainRbu
22e20 3b 20 70 49 74 65 72 20 26 26 20 70 49 74 65 72  ; pIter && pIter
22e30 21 3d 70 3b 20 70 49 74 65 72 3d 70 49 74 65 72  !=p; pIter=pIter
22e40 2d 3e 70 4d 61 69 6e 52 62 75 4e 65 78 74 29 7b  ->pMainRbuNext){
22e50 7d 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 3d  }.    if( pIter=
22e60 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70  =0 ){.      p->p
22e70 4d 61 69 6e 52 62 75 4e 65 78 74 20 3d 20 70 52  MainRbuNext = pR
22e80 62 75 56 66 73 2d 3e 70 4d 61 69 6e 52 62 75 3b  buVfs->pMainRbu;
22e90 0a 20 20 20 20 20 20 70 52 62 75 56 66 73 2d 3e  .      pRbuVfs->
22ea0 70 4d 61 69 6e 52 62 75 20 3d 20 70 3b 0a 20 20  pMainRbu = p;.  
22eb0 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
22ec0 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 52  3_mutex_leave(pR
22ed0 62 75 56 66 73 2d 3e 6d 75 74 65 78 29 3b 0a 7d  buVfs->mutex);.}
22ee0 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 61  ../*.** Remove a
22ef0 6e 20 69 74 65 6d 20 66 72 6f 6d 20 74 68 65 20  n item from the 
22f00 6d 61 69 6e 2d 64 62 20 6c 69 73 74 73 2e 0a 2a  main-db lists..*
22f10 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62  /.static void rb
22f20 75 4d 61 69 6e 6c 69 73 74 52 65 6d 6f 76 65 28  uMainlistRemove(
22f30 72 62 75 5f 66 69 6c 65 20 2a 70 29 7b 0a 20 20  rbu_file *p){.  
22f40 72 62 75 5f 66 69 6c 65 20 2a 2a 70 70 3b 0a 20  rbu_file **pp;. 
22f50 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
22f60 6e 74 65 72 28 70 2d 3e 70 52 62 75 56 66 73 2d  nter(p->pRbuVfs-
22f70 3e 6d 75 74 65 78 29 3b 0a 20 20 66 6f 72 28 70  >mutex);.  for(p
22f80 70 3d 26 70 2d 3e 70 52 62 75 56 66 73 2d 3e 70  p=&p->pRbuVfs->p
22f90 4d 61 69 6e 3b 20 2a 70 70 20 26 26 20 2a 70 70  Main; *pp && *pp
22fa0 21 3d 70 3b 20 70 70 3d 26 28 28 2a 70 70 29 2d  !=p; pp=&((*pp)-
22fb0 3e 70 4d 61 69 6e 4e 65 78 74 29 29 7b 7d 0a 20  >pMainNext)){}. 
22fc0 20 69 66 28 20 2a 70 70 20 29 20 2a 70 70 20 3d   if( *pp ) *pp =
22fd0 20 70 2d 3e 70 4d 61 69 6e 4e 65 78 74 3b 0a 20   p->pMainNext;. 
22fe0 20 70 2d 3e 70 4d 61 69 6e 4e 65 78 74 20 3d 20   p->pMainNext = 
22ff0 30 3b 0a 20 20 66 6f 72 28 70 70 3d 26 70 2d 3e  0;.  for(pp=&p->
23000 70 52 62 75 56 66 73 2d 3e 70 4d 61 69 6e 52 62  pRbuVfs->pMainRb
23010 75 3b 20 2a 70 70 20 26 26 20 2a 70 70 21 3d 70  u; *pp && *pp!=p
23020 3b 20 70 70 3d 26 28 28 2a 70 70 29 2d 3e 70 4d  ; pp=&((*pp)->pM
23030 61 69 6e 52 62 75 4e 65 78 74 29 29 7b 7d 0a 20  ainRbuNext)){}. 
23040 20 69 66 28 20 2a 70 70 20 29 20 2a 70 70 20 3d   if( *pp ) *pp =
23050 20 70 2d 3e 70 4d 61 69 6e 52 62 75 4e 65 78 74   p->pMainRbuNext
23060 3b 0a 20 20 70 2d 3e 70 4d 61 69 6e 52 62 75 4e  ;.  p->pMainRbuN
23070 65 78 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  ext = 0;.  sqlit
23080 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
23090 2d 3e 70 52 62 75 56 66 73 2d 3e 6d 75 74 65 78  ->pRbuVfs->mutex
230a0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  );.}../*.** Give
230b0 6e 20 74 68 61 74 20 7a 57 61 6c 20 70 6f 69 6e  n that zWal poin
230c0 74 73 20 74 6f 20 61 20 62 75 66 66 65 72 20 63  ts to a buffer c
230d0 6f 6e 74 61 69 6e 69 6e 67 20 61 20 77 61 6c 20  ontaining a wal 
230e0 66 69 6c 65 20 6e 61 6d 65 20 70 61 73 73 65 64  file name passed
230f0 20 74 6f 20 0a 2a 2a 20 65 69 74 68 65 72 20 74   to .** either t
23100 68 65 20 78 4f 70 65 6e 28 29 20 6f 72 20 78 41  he xOpen() or xA
23110 63 63 65 73 73 28 29 20 56 46 53 20 6d 65 74 68  ccess() VFS meth
23120 6f 64 2c 20 73 65 61 72 63 68 20 74 68 65 20 6d  od, search the m
23130 61 69 6e 2d 64 62 20 6c 69 73 74 20 66 6f 72 0a  ain-db list for.
23140 2a 2a 20 61 20 66 69 6c 65 2d 68 61 6e 64 6c 65  ** a file-handle
23150 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20 73   opened by the s
23160 61 6d 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  ame database con
23170 6e 65 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 63  nection on the c
23180 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20  orresponding.** 
23190 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
231a0 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65  *.** If paramete
231b0 72 20 62 52 62 75 20 69 73 20 74 72 75 65 2c 20  r bRbu is true, 
231c0 6f 6e 6c 79 20 73 65 61 72 63 68 20 66 6f 72 20  only search for 
231d0 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 73  file-descriptors
231e0 20 77 69 74 68 0a 2a 2a 20 72 62 75 5f 66 69 6c   with.** rbu_fil
231f0 65 2e 70 44 62 21 3d 30 2e 0a 2a 2f 0a 73 74 61  e.pDb!=0..*/.sta
23200 74 69 63 20 72 62 75 5f 66 69 6c 65 20 2a 72 62  tic rbu_file *rb
23210 75 46 69 6e 64 4d 61 69 6e 64 62 28 72 62 75 5f  uFindMaindb(rbu_
23220 76 66 73 20 2a 70 52 62 75 56 66 73 2c 20 63 6f  vfs *pRbuVfs, co
23230 6e 73 74 20 63 68 61 72 20 2a 7a 57 61 6c 2c 20  nst char *zWal, 
23240 69 6e 74 20 62 52 62 75 29 7b 0a 20 20 72 62 75  int bRbu){.  rbu
23250 5f 66 69 6c 65 20 2a 70 44 62 3b 0a 20 20 73 71  _file *pDb;.  sq
23260 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
23270 72 28 70 52 62 75 56 66 73 2d 3e 6d 75 74 65 78  r(pRbuVfs->mutex
23280 29 3b 0a 20 20 69 66 28 20 62 52 62 75 20 29 7b  );.  if( bRbu ){
23290 0a 20 20 20 20 66 6f 72 28 70 44 62 3d 70 52 62  .    for(pDb=pRb
232a0 75 56 66 73 2d 3e 70 4d 61 69 6e 52 62 75 3b 20  uVfs->pMainRbu; 
232b0 70 44 62 20 26 26 20 70 44 62 2d 3e 7a 57 61 6c  pDb && pDb->zWal
232c0 21 3d 7a 57 61 6c 3b 20 70 44 62 3d 70 44 62 2d  !=zWal; pDb=pDb-
232d0 3e 70 4d 61 69 6e 52 62 75 4e 65 78 74 29 7b 7d  >pMainRbuNext){}
232e0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f  .  }else{.    fo
232f0 72 28 70 44 62 3d 70 52 62 75 56 66 73 2d 3e 70  r(pDb=pRbuVfs->p
23300 4d 61 69 6e 3b 20 70 44 62 20 26 26 20 70 44 62  Main; pDb && pDb
23310 2d 3e 7a 57 61 6c 21 3d 7a 57 61 6c 3b 20 70 44  ->zWal!=zWal; pD
23320 62 3d 70 44 62 2d 3e 70 4d 61 69 6e 4e 65 78 74  b=pDb->pMainNext
23330 29 7b 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ){}.  }.  sqlite
23340 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 52  3_mutex_leave(pR
23350 62 75 56 66 73 2d 3e 6d 75 74 65 78 29 3b 0a 20  buVfs->mutex);. 
23360 20 72 65 74 75 72 6e 20 70 44 62 3b 0a 7d 0a 0a   return pDb;.}..
23370 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 72  /*.** Close an r
23380 62 75 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  bu file..*/.stat
23390 69 63 20 69 6e 74 20 72 62 75 56 66 73 43 6c 6f  ic int rbuVfsClo
233a0 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  se(sqlite3_file 
233b0 2a 70 46 69 6c 65 29 7b 0a 20 20 72 62 75 5f 66  *pFile){.  rbu_f
233c0 69 6c 65 20 2a 70 20 3d 20 28 72 62 75 5f 66 69  ile *p = (rbu_fi
233d0 6c 65 2a 29 70 46 69 6c 65 3b 0a 20 20 69 6e 74  le*)pFile;.  int
233e0 20 72 63 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20   rc;.  int i;.. 
233f0 20 2f 2a 20 46 72 65 65 20 74 68 65 20 63 6f 6e   /* Free the con
23400 74 65 6e 74 73 20 6f 66 20 74 68 65 20 61 70 53  tents of the apS
23410 68 6d 5b 5d 20 61 72 72 61 79 2e 20 41 6e 64 20  hm[] array. And 
23420 74 68 65 20 61 72 72 61 79 20 69 74 73 65 6c 66  the array itself
23430 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  . */.  for(i=0; 
23440 69 3c 70 2d 3e 6e 53 68 6d 3b 20 69 2b 2b 29 7b  i<p->nShm; i++){
23450 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
23460 65 28 70 2d 3e 61 70 53 68 6d 5b 69 5d 29 3b 0a  e(p->apShm[i]);.
23470 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
23480 65 65 28 70 2d 3e 61 70 53 68 6d 29 3b 0a 20 20  ee(p->apShm);.  
23490 70 2d 3e 61 70 53 68 6d 20 3d 20 30 3b 0a 20 20  p->apShm = 0;.  
234a0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
234b0 7a 44 65 6c 29 3b 0a 0a 20 20 69 66 28 20 70 2d  zDel);..  if( p-
234c0 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20 53 51 4c  >openFlags & SQL
234d0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
234e0 20 29 7b 0a 20 20 20 20 72 62 75 4d 61 69 6e 6c   ){.    rbuMainl
234f0 69 73 74 52 65 6d 6f 76 65 28 70 29 3b 0a 20 20  istRemove(p);.  
23500 20 20 72 62 75 55 6e 6c 6f 63 6b 53 68 6d 28 70    rbuUnlockShm(p
23510 29 3b 0a 20 20 20 20 70 2d 3e 70 52 65 61 6c 2d  );.    p->pReal-
23520 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53 68 6d 55  >pMethods->xShmU
23530 6e 6d 61 70 28 70 2d 3e 70 52 65 61 6c 2c 20 30  nmap(p->pReal, 0
23540 29 3b 0a 20 20 7d 0a 20 20 65 6c 73 65 20 69 66  );.  }.  else if
23550 28 20 28 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20  ( (p->openFlags 
23560 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45  & SQLITE_OPEN_DE
23570 4c 45 54 45 4f 4e 43 4c 4f 53 45 29 20 26 26 20  LETEONCLOSE) && 
23580 70 2d 3e 70 52 62 75 20 29 7b 0a 20 20 20 20 72  p->pRbu ){.    r
23590 62 75 55 70 64 61 74 65 54 65 6d 70 53 69 7a 65  buUpdateTempSize
235a0 28 70 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 61 73  (p, 0);.  }.  as
235b0 73 65 72 74 28 20 70 2d 3e 70 4d 61 69 6e 4e 65  sert( p->pMainNe
235c0 78 74 3d 3d 30 20 26 26 20 70 2d 3e 70 52 62 75  xt==0 && p->pRbu
235d0 56 66 73 2d 3e 70 4d 61 69 6e 21 3d 70 20 29 3b  Vfs->pMain!=p );
235e0 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 74 68 65  ..  /* Close the
235f0 20 75 6e 64 65 72 6c 79 69 6e 67 20 66 69 6c 65   underlying file
23600 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 72 63 20   handle */.  rc 
23610 3d 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74  = p->pReal->pMet
23620 68 6f 64 73 2d 3e 78 43 6c 6f 73 65 28 70 2d 3e  hods->xClose(p->
23630 70 52 65 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e  pReal);.  return
23640 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52   rc;.}.../*.** R
23650 65 61 64 20 61 6e 64 20 72 65 74 75 72 6e 20 61  ead and return a
23660 6e 20 75 6e 73 69 67 6e 65 64 20 33 32 2d 62 69  n unsigned 32-bi
23670 74 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  t big-endian int
23680 65 67 65 72 20 66 72 6f 6d 20 74 68 65 20 62 75  eger from the bu
23690 66 66 65 72 20 0a 2a 2a 20 70 61 73 73 65 64 20  ffer .** passed 
236a0 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75  as the only argu
236b0 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
236c0 75 33 32 20 72 62 75 47 65 74 55 33 32 28 75 38  u32 rbuGetU32(u8
236d0 20 2a 61 42 75 66 29 7b 0a 20 20 72 65 74 75 72   *aBuf){.  retur
236e0 6e 20 28 28 75 33 32 29 61 42 75 66 5b 30 5d 20  n ((u32)aBuf[0] 
236f0 3c 3c 20 32 34 29 0a 20 20 20 20 20 20 20 2b 20  << 24).       + 
23700 28 28 75 33 32 29 61 42 75 66 5b 31 5d 20 3c 3c  ((u32)aBuf[1] <<
23710 20 31 36 29 0a 20 20 20 20 20 20 20 2b 20 28 28   16).       + ((
23720 75 33 32 29 61 42 75 66 5b 32 5d 20 3c 3c 20 20  u32)aBuf[2] <<  
23730 38 29 0a 20 20 20 20 20 20 20 2b 20 28 28 75 33  8).       + ((u3
23740 32 29 61 42 75 66 5b 33 5d 29 3b 0a 7d 0a 0a 2f  2)aBuf[3]);.}../
23750 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20 75 6e  *.** Write an un
23760 73 69 67 6e 65 64 20 33 32 2d 62 69 74 20 76 61  signed 32-bit va
23770 6c 75 65 20 69 6e 20 62 69 67 2d 65 6e 64 69 61  lue in big-endia
23780 6e 20 66 6f 72 6d 61 74 20 74 6f 20 74 68 65 20  n format to the 
23790 73 75 70 70 6c 69 65 64 0a 2a 2a 20 62 75 66 66  supplied.** buff
237a0 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
237b0 69 64 20 72 62 75 50 75 74 55 33 32 28 75 38 20  id rbuPutU32(u8 
237c0 2a 61 42 75 66 2c 20 75 33 32 20 69 56 61 6c 29  *aBuf, u32 iVal)
237d0 7b 0a 20 20 61 42 75 66 5b 30 5d 20 3d 20 28 69  {.  aBuf[0] = (i
237e0 56 61 6c 20 3e 3e 20 32 34 29 20 26 20 30 78 46  Val >> 24) & 0xF
237f0 46 3b 0a 20 20 61 42 75 66 5b 31 5d 20 3d 20 28  F;.  aBuf[1] = (
23800 69 56 61 6c 20 3e 3e 20 31 36 29 20 26 20 30 78  iVal >> 16) & 0x
23810 46 46 3b 0a 20 20 61 42 75 66 5b 32 5d 20 3d 20  FF;.  aBuf[2] = 
23820 28 69 56 61 6c 20 3e 3e 20 20 38 29 20 26 20 30  (iVal >>  8) & 0
23830 78 46 46 3b 0a 20 20 61 42 75 66 5b 33 5d 20 3d  xFF;.  aBuf[3] =
23840 20 28 69 56 61 6c 20 3e 3e 20 20 30 29 20 26 20   (iVal >>  0) & 
23850 30 78 46 46 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  0xFF;.}..static 
23860 76 6f 69 64 20 72 62 75 50 75 74 55 31 36 28 75  void rbuPutU16(u
23870 38 20 2a 61 42 75 66 2c 20 75 31 36 20 69 56 61  8 *aBuf, u16 iVa
23880 6c 29 7b 0a 20 20 61 42 75 66 5b 30 5d 20 3d 20  l){.  aBuf[0] = 
23890 28 69 56 61 6c 20 3e 3e 20 20 38 29 20 26 20 30  (iVal >>  8) & 0
238a0 78 46 46 3b 0a 20 20 61 42 75 66 5b 31 5d 20 3d  xFF;.  aBuf[1] =
238b0 20 28 69 56 61 6c 20 3e 3e 20 20 30 29 20 26 20   (iVal >>  0) & 
238c0 30 78 46 46 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  0xFF;.}../*.** R
238d0 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20 61 6e  ead data from an
238e0 20 72 62 75 56 66 73 2d 66 69 6c 65 2e 0a 2a 2f   rbuVfs-file..*/
238f0 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 56  .static int rbuV
23900 66 73 52 65 61 64 28 0a 20 20 73 71 6c 69 74 65  fsRead(.  sqlite
23910 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 0a  3_file *pFile, .
23920 20 20 76 6f 69 64 20 2a 7a 42 75 66 2c 20 0a 20    void *zBuf, . 
23930 20 69 6e 74 20 69 41 6d 74 2c 20 0a 20 20 73 71   int iAmt, .  sq
23940 6c 69 74 65 5f 69 6e 74 36 34 20 69 4f 66 73 74  lite_int64 iOfst
23950 0a 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a  .){.  rbu_file *
23960 70 20 3d 20 28 72 62 75 5f 66 69 6c 65 2a 29 70  p = (rbu_file*)p
23970 46 69 6c 65 3b 0a 20 20 73 71 6c 69 74 65 33 72  File;.  sqlite3r
23980 62 75 20 2a 70 52 62 75 20 3d 20 70 2d 3e 70 52  bu *pRbu = p->pR
23990 62 75 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  bu;.  int rc;.. 
239a0 20 69 66 28 20 70 52 62 75 20 26 26 20 70 52 62   if( pRbu && pRb
239b0 75 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53  u->eStage==RBU_S
239c0 54 41 47 45 5f 43 41 50 54 55 52 45 20 29 7b 0a  TAGE_CAPTURE ){.
239d0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f      assert( p->o
239e0 70 65 6e 46 6c 61 67 73 20 26 20 53 51 4c 49 54  penFlags & SQLIT
239f0 45 5f 4f 50 45 4e 5f 57 41 4c 20 29 3b 0a 20 20  E_OPEN_WAL );.  
23a00 20 20 72 63 20 3d 20 72 62 75 43 61 70 74 75 72    rc = rbuCaptur
23a10 65 57 61 6c 52 65 61 64 28 70 2d 3e 70 52 62 75  eWalRead(p->pRbu
23a20 2c 20 69 4f 66 73 74 2c 20 69 41 6d 74 29 3b 0a  , iOfst, iAmt);.
23a30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
23a40 20 70 52 62 75 20 26 26 20 70 52 62 75 2d 3e 65   pRbu && pRbu->e
23a50 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45  Stage==RBU_STAGE
23a60 5f 4f 41 4c 20 0a 20 20 20 20 20 26 26 20 28 70  _OAL .     && (p
23a70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20 53 51  ->openFlags & SQ
23a80 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 29 20 0a  LITE_OPEN_WAL) .
23a90 20 20 20 20 20 26 26 20 69 4f 66 73 74 3e 3d 70       && iOfst>=p
23aa0 52 62 75 2d 3e 69 4f 61 6c 53 7a 20 0a 20 20 20  Rbu->iOalSz .   
23ab0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
23ac0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
23ad0 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c 20  memset(zBuf, 0, 
23ae0 69 41 6d 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65  iAmt);.    }else
23af0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 2d 3e  {.      rc = p->
23b00 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d  pReal->pMethods-
23b10 3e 78 52 65 61 64 28 70 2d 3e 70 52 65 61 6c 2c  >xRead(p->pReal,
23b20 20 7a 42 75 66 2c 20 69 41 6d 74 2c 20 69 4f 66   zBuf, iAmt, iOf
23b30 73 74 29 3b 0a 23 69 66 20 31 0a 20 20 20 20 20  st);.#if 1.     
23b40 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 62   /* If this is b
23b50 65 69 6e 67 20 63 61 6c 6c 65 64 20 74 6f 20 72  eing called to r
23b60 65 61 64 20 74 68 65 20 66 69 72 73 74 20 70 61  ead the first pa
23b70 67 65 20 6f 66 20 74 68 65 20 74 61 72 67 65 74  ge of the target
23b80 20 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62   .      ** datab
23b90 61 73 65 20 61 73 20 70 61 72 74 20 6f 66 20 61  ase as part of a
23ba0 6e 20 72 62 75 20 76 61 63 75 75 6d 20 6f 70 65  n rbu vacuum ope
23bb0 72 61 74 69 6f 6e 2c 20 73 79 6e 74 68 65 73 69  ration, synthesi
23bc0 7a 65 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a  ze the .      **
23bd0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
23be0 20 66 69 72 73 74 20 70 61 67 65 20 69 66 20 69   first page if i
23bf0 74 20 64 6f 65 73 20 6e 6f 74 20 79 65 74 20 65  t does not yet e
23c00 78 69 73 74 2e 20 4f 74 68 65 72 77 69 73 65 2c  xist. Otherwise,
23c10 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 69 74 65  .      ** SQLite
23c20 20 77 69 6c 6c 20 6e 6f 74 20 63 68 65 63 6b 20   will not check 
23c30 66 6f 72 20 61 20 2a 2d 77 61 6c 20 66 69 6c 65  for a *-wal file
23c40 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  .  */.      if( 
23c50 70 52 62 75 20 26 26 20 72 62 75 49 73 56 61 63  pRbu && rbuIsVac
23c60 75 75 6d 28 70 52 62 75 29 20 0a 20 20 20 20 20  uum(pRbu) .     
23c70 20 20 20 20 20 26 26 20 72 63 3d 3d 53 51 4c 49       && rc==SQLI
23c80 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
23c90 45 41 44 20 26 26 20 69 4f 66 73 74 3d 3d 30 0a  EAD && iOfst==0.
23ca0 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70 2d            && (p-
23cb0 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20 53 51 4c  >openFlags & SQL
23cc0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
23cd0 29 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 70  ).          && p
23ce0 52 62 75 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  Rbu->rc==SQLITE_
23cf0 4f 4b 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  OK.      ){.    
23d00 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65      sqlite3_file
23d10 20 2a 70 46 64 20 3d 20 28 73 71 6c 69 74 65 33   *pFd = (sqlite3
23d20 5f 66 69 6c 65 2a 29 70 52 62 75 2d 3e 70 52 62  _file*)pRbu->pRb
23d30 75 46 64 3b 0a 20 20 20 20 20 20 20 20 72 63 20  uFd;.        rc 
23d40 3d 20 70 46 64 2d 3e 70 4d 65 74 68 6f 64 73 2d  = pFd->pMethods-
23d50 3e 78 52 65 61 64 28 70 46 64 2c 20 7a 42 75 66  >xRead(pFd, zBuf
23d60 2c 20 69 41 6d 74 2c 20 69 4f 66 73 74 29 3b 0a  , iAmt, iOfst);.
23d70 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
23d80 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
23d90 20 20 20 20 20 20 20 75 38 20 2a 61 42 75 66 20         u8 *aBuf 
23da0 3d 20 28 75 38 2a 29 7a 42 75 66 3b 0a 20 20 20  = (u8*)zBuf;.   
23db0 20 20 20 20 20 20 20 75 33 32 20 69 52 6f 6f 74         u32 iRoot
23dc0 20 3d 20 72 62 75 47 65 74 55 33 32 28 26 61 42   = rbuGetU32(&aB
23dd0 75 66 5b 35 32 5d 29 20 3f 20 31 20 3a 20 30 3b  uf[52]) ? 1 : 0;
23de0 0a 20 20 20 20 20 20 20 20 20 20 72 62 75 50 75  .          rbuPu
23df0 74 55 33 32 28 26 61 42 75 66 5b 35 32 5d 2c 20  tU32(&aBuf[52], 
23e00 69 52 6f 6f 74 29 3b 20 20 20 20 20 20 2f 2a 20  iRoot);      /* 
23e10 6c 61 72 67 65 73 74 20 72 6f 6f 74 20 70 61 67  largest root pag
23e20 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20  e number */.    
23e30 20 20 20 20 20 20 72 62 75 50 75 74 55 33 32 28        rbuPutU32(
23e40 26 61 42 75 66 5b 33 36 5d 2c 20 30 29 3b 20 20  &aBuf[36], 0);  
23e50 20 20 20 20 20 20 20 20 2f 2a 20 6e 75 6d 62 65          /* numbe
23e60 72 20 6f 66 20 66 72 65 65 20 70 61 67 65 73 20  r of free pages 
23e70 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 62 75  */.          rbu
23e80 50 75 74 55 33 32 28 26 61 42 75 66 5b 33 32 5d  PutU32(&aBuf[32]
23e90 2c 20 30 29 3b 20 20 20 20 20 20 20 20 20 20 2f  , 0);          /
23ea0 2a 20 66 69 72 73 74 20 70 61 67 65 20 6f 6e 20  * first page on 
23eb0 66 72 65 65 20 6c 69 73 74 20 74 72 75 6e 6b 20  free list trunk 
23ec0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 62 75  */.          rbu
23ed0 50 75 74 55 33 32 28 26 61 42 75 66 5b 32 38 5d  PutU32(&aBuf[28]
23ee0 2c 20 31 29 3b 20 20 20 20 20 20 20 20 20 20 2f  , 1);          /
23ef0 2a 20 73 69 7a 65 20 6f 66 20 64 62 20 66 69 6c  * size of db fil
23f00 65 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20  e in pages */.  
23f10 20 20 20 20 20 20 20 20 72 62 75 50 75 74 55 33          rbuPutU3
23f20 32 28 26 61 42 75 66 5b 32 34 5d 2c 20 70 52 62  2(&aBuf[24], pRb
23f30 75 2d 3e 70 52 62 75 46 64 2d 3e 69 43 6f 6f 6b  u->pRbuFd->iCook
23f40 69 65 2b 31 29 3b 20 20 2f 2a 20 43 68 61 6e 67  ie+1);  /* Chang
23f50 65 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20  e counter */..  
23f60 20 20 20 20 20 20 20 20 69 66 28 20 69 41 6d 74          if( iAmt
23f70 3e 31 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20  >100 ){.        
23f80 20 20 20 20 6d 65 6d 73 65 74 28 26 61 42 75 66      memset(&aBuf
23f90 5b 31 30 30 5d 2c 20 30 2c 20 69 41 6d 74 2d 31  [100], 0, iAmt-1
23fa0 30 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  00);.           
23fb0 20 72 62 75 50 75 74 55 31 36 28 26 61 42 75 66   rbuPutU16(&aBuf
23fc0 5b 31 30 35 5d 2c 20 69 41 6d 74 20 26 20 30 78  [105], iAmt & 0x
23fd0 46 46 46 46 29 3b 0a 20 20 20 20 20 20 20 20 20  FFFF);.         
23fe0 20 20 20 61 42 75 66 5b 31 30 30 5d 20 3d 20 30     aBuf[100] = 0
23ff0 78 30 44 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  x0D;.          }
24000 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
24010 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a   }.#endif.    }.
24020 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
24030 54 45 5f 4f 4b 20 26 26 20 69 4f 66 73 74 3d 3d  TE_OK && iOfst==
24040 30 20 26 26 20 28 70 2d 3e 6f 70 65 6e 46 6c 61  0 && (p->openFla
24050 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
24060 5f 4d 41 49 4e 5f 44 42 29 20 29 7b 0a 20 20 20  _MAIN_DB) ){.   
24070 20 20 20 2f 2a 20 54 68 65 73 65 20 6c 6f 6f 6b     /* These look
24080 20 6c 69 6b 65 20 6d 61 67 69 63 20 6e 75 6d 62   like magic numb
24090 65 72 73 2e 20 42 75 74 20 74 68 65 79 20 61 72  ers. But they ar
240a0 65 20 73 74 61 62 6c 65 2c 20 61 73 20 74 68 65  e stable, as the
240b0 79 20 61 72 65 20 70 61 72 74 0a 20 20 20 20 20  y are part.     
240c0 20 20 2a 2a 20 6f 66 20 74 68 65 20 64 65 66 69    ** of the defi
240d0 6e 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 53 51  nition of the SQ
240e0 4c 69 74 65 20 66 69 6c 65 20 66 6f 72 6d 61 74  Lite file format
240f0 2c 20 77 68 69 63 68 20 6d 61 79 20 6e 6f 74 20  , which may not 
24100 63 68 61 6e 67 65 2e 20 2a 2f 0a 20 20 20 20 20  change. */.     
24110 20 75 38 20 2a 70 42 75 66 20 3d 20 28 75 38 2a   u8 *pBuf = (u8*
24120 29 7a 42 75 66 3b 0a 20 20 20 20 20 20 70 2d 3e  )zBuf;.      p->
24130 69 43 6f 6f 6b 69 65 20 3d 20 72 62 75 47 65 74  iCookie = rbuGet
24140 55 33 32 28 26 70 42 75 66 5b 32 34 5d 29 3b 0a  U32(&pBuf[24]);.
24150 20 20 20 20 20 20 70 2d 3e 69 57 72 69 74 65 56        p->iWriteV
24160 65 72 20 3d 20 70 42 75 66 5b 31 39 5d 3b 0a 20  er = pBuf[19];. 
24170 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
24180 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  n rc;.}../*.** W
24190 72 69 74 65 20 64 61 74 61 20 74 6f 20 61 6e 20  rite data to an 
241a0 72 62 75 56 66 73 2d 66 69 6c 65 2e 0a 2a 2f 0a  rbuVfs-file..*/.
241b0 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 56 66  static int rbuVf
241c0 73 57 72 69 74 65 28 0a 20 20 73 71 6c 69 74 65  sWrite(.  sqlite
241d0 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 0a  3_file *pFile, .
241e0 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 42    const void *zB
241f0 75 66 2c 20 0a 20 20 69 6e 74 20 69 41 6d 74 2c  uf, .  int iAmt,
24200 20 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34   .  sqlite_int64
24210 20 69 4f 66 73 74 0a 29 7b 0a 20 20 72 62 75 5f   iOfst.){.  rbu_
24220 66 69 6c 65 20 2a 70 20 3d 20 28 72 62 75 5f 66  file *p = (rbu_f
24230 69 6c 65 2a 29 70 46 69 6c 65 3b 0a 20 20 73 71  ile*)pFile;.  sq
24240 6c 69 74 65 33 72 62 75 20 2a 70 52 62 75 20 3d  lite3rbu *pRbu =
24250 20 70 2d 3e 70 52 62 75 3b 0a 20 20 69 6e 74 20   p->pRbu;.  int 
24260 72 63 3b 0a 0a 20 20 69 66 28 20 70 52 62 75 20  rc;..  if( pRbu 
24270 26 26 20 70 52 62 75 2d 3e 65 53 74 61 67 65 3d  && pRbu->eStage=
24280 3d 52 42 55 5f 53 54 41 47 45 5f 43 41 50 54 55  =RBU_STAGE_CAPTU
24290 52 45 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  RE ){.    assert
242a0 28 20 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26  ( p->openFlags &
242b0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49   SQLITE_OPEN_MAI
242c0 4e 5f 44 42 20 29 3b 0a 20 20 20 20 72 63 20 3d  N_DB );.    rc =
242d0 20 72 62 75 43 61 70 74 75 72 65 44 62 57 72 69   rbuCaptureDbWri
242e0 74 65 28 70 2d 3e 70 52 62 75 2c 20 69 4f 66 73  te(p->pRbu, iOfs
242f0 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t);.  }else{.   
24300 20 69 66 28 20 70 52 62 75 20 29 7b 0a 20 20 20   if( pRbu ){.   
24310 20 20 20 69 66 28 20 70 52 62 75 2d 3e 65 53 74     if( pRbu->eSt
24320 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4f  age==RBU_STAGE_O
24330 41 4c 20 0a 20 20 20 20 20 20 20 26 26 20 28 70  AL .       && (p
24340 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20 53 51  ->openFlags & SQ
24350 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 29 20 0a  LITE_OPEN_WAL) .
24360 20 20 20 20 20 20 20 26 26 20 69 4f 66 73 74 3e         && iOfst>
24370 3d 70 52 62 75 2d 3e 69 4f 61 6c 53 7a 0a 20 20  =pRbu->iOalSz.  
24380 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 70      ){.        p
24390 52 62 75 2d 3e 69 4f 61 6c 53 7a 20 3d 20 69 41  Rbu->iOalSz = iA
243a0 6d 74 20 2b 20 69 4f 66 73 74 3b 0a 20 20 20 20  mt + iOfst;.    
243b0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6f    }else if( p->o
243c0 70 65 6e 46 6c 61 67 73 20 26 20 53 51 4c 49 54  penFlags & SQLIT
243d0 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43  E_OPEN_DELETEONC
243e0 4c 4f 53 45 20 29 7b 0a 20 20 20 20 20 20 20 20  LOSE ){.        
243f0 69 36 34 20 73 7a 4e 65 77 20 3d 20 69 41 6d 74  i64 szNew = iAmt
24400 2b 69 4f 66 73 74 3b 0a 20 20 20 20 20 20 20 20  +iOfst;.        
24410 69 66 28 20 73 7a 4e 65 77 3e 70 2d 3e 73 7a 20  if( szNew>p->sz 
24420 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
24430 3d 20 72 62 75 55 70 64 61 74 65 54 65 6d 70 53  = rbuUpdateTempS
24440 69 7a 65 28 70 2c 20 73 7a 4e 65 77 29 3b 0a 20  ize(p, szNew);. 
24450 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
24460 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
24470 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
24480 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
24490 20 20 20 20 72 63 20 3d 20 70 2d 3e 70 52 65 61      rc = p->pRea
244a0 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 57 72  l->pMethods->xWr
244b0 69 74 65 28 70 2d 3e 70 52 65 61 6c 2c 20 7a 42  ite(p->pReal, zB
244c0 75 66 2c 20 69 41 6d 74 2c 20 69 4f 66 73 74 29  uf, iAmt, iOfst)
244d0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
244e0 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4f 66 73 74  LITE_OK && iOfst
244f0 3d 3d 30 20 26 26 20 28 70 2d 3e 6f 70 65 6e 46  ==0 && (p->openF
24500 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
24510 45 4e 5f 4d 41 49 4e 5f 44 42 29 20 29 7b 0a 20  EN_MAIN_DB) ){. 
24520 20 20 20 20 20 2f 2a 20 54 68 65 73 65 20 6c 6f       /* These lo
24530 6f 6b 20 6c 69 6b 65 20 6d 61 67 69 63 20 6e 75  ok like magic nu
24540 6d 62 65 72 73 2e 20 42 75 74 20 74 68 65 79 20  mbers. But they 
24550 61 72 65 20 73 74 61 62 6c 65 2c 20 61 73 20 74  are stable, as t
24560 68 65 79 20 61 72 65 20 70 61 72 74 0a 20 20 20  hey are part.   
24570 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 64 65 66     ** of the def
24580 69 6e 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 53  inition of the S
24590 51 4c 69 74 65 20 66 69 6c 65 20 66 6f 72 6d 61  QLite file forma
245a0 74 2c 20 77 68 69 63 68 20 6d 61 79 20 6e 6f 74  t, which may not
245b0 20 63 68 61 6e 67 65 2e 20 2a 2f 0a 20 20 20 20   change. */.    
245c0 20 20 75 38 20 2a 70 42 75 66 20 3d 20 28 75 38    u8 *pBuf = (u8
245d0 2a 29 7a 42 75 66 3b 0a 20 20 20 20 20 20 70 2d  *)zBuf;.      p-
245e0 3e 69 43 6f 6f 6b 69 65 20 3d 20 72 62 75 47 65  >iCookie = rbuGe
245f0 74 55 33 32 28 26 70 42 75 66 5b 32 34 5d 29 3b  tU32(&pBuf[24]);
24600 0a 20 20 20 20 20 20 70 2d 3e 69 57 72 69 74 65  .      p->iWrite
24610 56 65 72 20 3d 20 70 42 75 66 5b 31 39 5d 3b 0a  Ver = pBuf[19];.
24620 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
24630 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
24640 54 72 75 6e 63 61 74 65 20 61 6e 20 72 62 75 56  Truncate an rbuV
24650 66 73 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  fs-file..*/.stat
24660 69 63 20 69 6e 74 20 72 62 75 56 66 73 54 72 75  ic int rbuVfsTru
24670 6e 63 61 74 65 28 73 71 6c 69 74 65 33 5f 66 69  ncate(sqlite3_fi
24680 6c 65 20 2a 70 46 69 6c 65 2c 20 73 71 6c 69 74  le *pFile, sqlit
24690 65 5f 69 6e 74 36 34 20 73 69 7a 65 29 7b 0a 20  e_int64 size){. 
246a0 20 72 62 75 5f 66 69 6c 65 20 2a 70 20 3d 20 28   rbu_file *p = (
246b0 72 62 75 5f 66 69 6c 65 2a 29 70 46 69 6c 65 3b  rbu_file*)pFile;
246c0 0a 20 20 69 66 28 20 28 70 2d 3e 6f 70 65 6e 46  .  if( (p->openF
246d0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
246e0 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  EN_DELETEONCLOSE
246f0 29 20 26 26 20 70 2d 3e 70 52 62 75 20 29 7b 0a  ) && p->pRbu ){.
24700 20 20 20 20 69 6e 74 20 72 63 20 3d 20 72 62 75      int rc = rbu
24710 55 70 64 61 74 65 54 65 6d 70 53 69 7a 65 28 70  UpdateTempSize(p
24720 2c 20 73 69 7a 65 29 3b 0a 20 20 20 20 69 66 28  , size);.    if(
24730 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
24740 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
24750 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 52 65 61    return p->pRea
24760 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 54 72  l->pMethods->xTr
24770 75 6e 63 61 74 65 28 70 2d 3e 70 52 65 61 6c 2c  uncate(p->pReal,
24780 20 73 69 7a 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   size);.}../*.**
24790 20 53 79 6e 63 20 61 6e 20 72 62 75 56 66 73 2d   Sync an rbuVfs-
247a0 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
247b0 69 6e 74 20 72 62 75 56 66 73 53 79 6e 63 28 73  int rbuVfsSync(s
247c0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
247d0 6c 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  le, int flags){.
247e0 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 20 3d 20    rbu_file *p = 
247f0 28 72 62 75 5f 66 69 6c 65 20 2a 29 70 46 69 6c  (rbu_file *)pFil
24800 65 3b 0a 20 20 69 66 28 20 70 2d 3e 70 52 62 75  e;.  if( p->pRbu
24810 20 26 26 20 70 2d 3e 70 52 62 75 2d 3e 65 53 74   && p->pRbu->eSt
24820 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 43  age==RBU_STAGE_C
24830 41 50 54 55 52 45 20 29 7b 0a 20 20 20 20 69 66  APTURE ){.    if
24840 28 20 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26  ( p->openFlags &
24850 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49   SQLITE_OPEN_MAI
24860 4e 5f 44 42 20 29 7b 0a 20 20 20 20 20 20 72 65  N_DB ){.      re
24870 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4e 54 45  turn SQLITE_INTE
24880 52 4e 41 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RNAL;.    }.    
24890 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
248a0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
248b0 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64  ->pReal->pMethod
248c0 73 2d 3e 78 53 79 6e 63 28 70 2d 3e 70 52 65 61  s->xSync(p->pRea
248d0 6c 2c 20 66 6c 61 67 73 29 3b 0a 7d 0a 0a 2f 2a  l, flags);.}../*
248e0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63  .** Return the c
248f0 75 72 72 65 6e 74 20 66 69 6c 65 2d 73 69 7a 65  urrent file-size
24900 20 6f 66 20 61 6e 20 72 62 75 56 66 73 2d 66 69   of an rbuVfs-fi
24910 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
24920 74 20 72 62 75 56 66 73 46 69 6c 65 53 69 7a 65  t rbuVfsFileSize
24930 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70  (sqlite3_file *p
24940 46 69 6c 65 2c 20 73 71 6c 69 74 65 5f 69 6e 74  File, sqlite_int
24950 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 72 62  64 *pSize){.  rb
24960 75 5f 66 69 6c 65 20 2a 70 20 3d 20 28 72 62 75  u_file *p = (rbu
24970 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20  _file *)pFile;. 
24980 20 69 6e 74 20 72 63 3b 0a 20 20 72 63 20 3d 20   int rc;.  rc = 
24990 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f  p->pReal->pMetho
249a0 64 73 2d 3e 78 46 69 6c 65 53 69 7a 65 28 70 2d  ds->xFileSize(p-
249b0 3e 70 52 65 61 6c 2c 20 70 53 69 7a 65 29 3b 0a  >pReal, pSize);.
249c0 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
249d0 20 61 6e 20 52 42 55 20 76 61 63 75 75 6d 20 6f   an RBU vacuum o
249e0 70 65 72 61 74 69 6f 6e 20 61 6e 64 20 74 68 69  peration and thi
249f0 73 20 69 73 20 74 68 65 20 74 61 72 67 65 74 20  s is the target 
24a00 64 61 74 61 62 61 73 65 2c 0a 20 20 2a 2a 20 70  database,.  ** p
24a10 72 65 74 65 6e 64 20 74 68 61 74 20 69 74 20 68  retend that it h
24a20 61 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  as at least one 
24a30 70 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  page. Otherwise,
24a40 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e 6f 74   SQLite will not
24a50 0a 20 20 2a 2a 20 63 68 65 63 6b 20 66 6f 72 20  .  ** check for 
24a60 74 68 65 20 65 78 69 73 74 61 6e 63 65 20 6f 66  the existance of
24a70 20 61 20 2a 2d 77 61 6c 20 66 69 6c 65 2e 20 72   a *-wal file. r
24a80 62 75 56 66 73 52 65 61 64 28 29 20 63 6f 6e 74  buVfsRead() cont
24a90 61 69 6e 73 20 0a 20 20 2a 2a 20 73 69 6d 69 6c  ains .  ** simil
24aa0 61 72 20 6c 6f 67 69 63 2e 20 20 2a 2f 0a 20 20  ar logic.  */.  
24ab0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
24ac0 4b 20 26 26 20 2a 70 53 69 7a 65 3d 3d 30 20 0a  K && *pSize==0 .
24ad0 20 20 20 26 26 20 70 2d 3e 70 52 62 75 20 26 26     && p->pRbu &&
24ae0 20 72 62 75 49 73 56 61 63 75 75 6d 28 70 2d 3e   rbuIsVacuum(p->
24af0 70 52 62 75 29 20 0a 20 20 20 26 26 20 28 70 2d  pRbu) .   && (p-
24b00 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20 53 51 4c  >openFlags & SQL
24b10 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
24b20 29 0a 20 20 29 7b 0a 20 20 20 20 2a 70 53 69 7a  ).  ){.    *pSiz
24b30 65 20 3d 20 31 30 32 34 3b 0a 20 20 7d 0a 20 20  e = 1024;.  }.  
24b40 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
24b50 0a 2a 2a 20 4c 6f 63 6b 20 61 6e 20 72 62 75 56  .** Lock an rbuV
24b60 66 73 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  fs-file..*/.stat
24b70 69 63 20 69 6e 74 20 72 62 75 56 66 73 4c 6f 63  ic int rbuVfsLoc
24b80 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
24b90 70 46 69 6c 65 2c 20 69 6e 74 20 65 4c 6f 63 6b  pFile, int eLock
24ba0 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a 70  ){.  rbu_file *p
24bb0 20 3d 20 28 72 62 75 5f 66 69 6c 65 2a 29 70 46   = (rbu_file*)pF
24bc0 69 6c 65 3b 0a 20 20 73 71 6c 69 74 65 33 72 62  ile;.  sqlite3rb
24bd0 75 20 2a 70 52 62 75 20 3d 20 70 2d 3e 70 52 62  u *pRbu = p->pRb
24be0 75 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  u;.  int rc = SQ
24bf0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65  LITE_OK;..  asse
24c00 72 74 28 20 70 2d 3e 6f 70 65 6e 46 6c 61 67 73  rt( p->openFlags
24c10 20 26 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   & (SQLITE_OPEN_
24c20 4d 41 49 4e 5f 44 42 7c 53 51 4c 49 54 45 5f 4f  MAIN_DB|SQLITE_O
24c30 50 45 4e 5f 54 45 4d 50 5f 44 42 29 20 29 3b 0a  PEN_TEMP_DB) );.
24c40 20 20 69 66 28 20 65 4c 6f 63 6b 3d 3d 53 51 4c    if( eLock==SQL
24c50 49 54 45 5f 4c 4f 43 4b 5f 45 58 43 4c 55 53 49  ITE_LOCK_EXCLUSI
24c60 56 45 20 0a 20 20 20 26 26 20 28 70 2d 3e 62 4e  VE .   && (p->bN
24c70 6f 6c 6f 63 6b 20 7c 7c 20 28 70 52 62 75 20 26  olock || (pRbu &
24c80 26 20 70 52 62 75 2d 3e 65 53 74 61 67 65 21 3d  & pRbu->eStage!=
24c90 52 42 55 5f 53 54 41 47 45 5f 44 4f 4e 45 29 29  RBU_STAGE_DONE))
24ca0 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 44 6f 20  .  ){.    /* Do 
24cb0 6e 6f 74 20 61 6c 6c 6f 77 20 45 58 43 4c 55 53  not allow EXCLUS
24cc0 49 56 45 20 6c 6f 63 6b 73 2e 20 50 72 65 76 65  IVE locks. Preve
24cd0 6e 74 69 6e 67 20 53 51 4c 69 74 65 20 66 72 6f  nting SQLite fro
24ce0 6d 20 74 61 6b 69 6e 67 20 74 68 69 73 20 0a 20  m taking this . 
24cf0 20 20 20 2a 2a 20 70 72 65 76 65 6e 74 73 20 69     ** prevents i
24d00 74 20 66 72 6f 6d 20 63 68 65 63 6b 70 6f 69 6e  t from checkpoin
24d10 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ting the databas
24d20 65 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 63  e from sqlite3_c
24d30 6c 6f 73 65 28 29 2e 20 2a 2f 0a 20 20 20 20 72  lose(). */.    r
24d40 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
24d50 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
24d60 20 3d 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65   = p->pReal->pMe
24d70 74 68 6f 64 73 2d 3e 78 4c 6f 63 6b 28 70 2d 3e  thods->xLock(p->
24d80 70 52 65 61 6c 2c 20 65 4c 6f 63 6b 29 3b 0a 20  pReal, eLock);. 
24d90 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
24da0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b  .}../*.** Unlock
24db0 20 61 6e 20 72 62 75 56 66 73 2d 66 69 6c 65 2e   an rbuVfs-file.
24dc0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
24dd0 62 75 56 66 73 55 6e 6c 6f 63 6b 28 73 71 6c 69  buVfsUnlock(sqli
24de0 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c  te3_file *pFile,
24df0 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 72   int eLock){.  r
24e00 62 75 5f 66 69 6c 65 20 2a 70 20 3d 20 28 72 62  bu_file *p = (rb
24e10 75 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a  u_file *)pFile;.
24e20 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 52 65 61    return p->pRea
24e30 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 55 6e  l->pMethods->xUn
24e40 6c 6f 63 6b 28 70 2d 3e 70 52 65 61 6c 2c 20 65  lock(p->pReal, e
24e50 4c 6f 63 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Lock);.}../*.** 
24e60 43 68 65 63 6b 20 69 66 20 61 6e 6f 74 68 65 72  Check if another
24e70 20 66 69 6c 65 2d 68 61 6e 64 6c 65 20 68 6f 6c   file-handle hol
24e80 64 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  ds a RESERVED lo
24e90 63 6b 20 6f 6e 20 61 6e 20 72 62 75 56 66 73 2d  ck on an rbuVfs-
24ea0 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
24eb0 69 6e 74 20 72 62 75 56 66 73 43 68 65 63 6b 52  int rbuVfsCheckR
24ec0 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69  eservedLock(sqli
24ed0 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c  te3_file *pFile,
24ee0 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a   int *pResOut){.
24ef0 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 20 3d 20    rbu_file *p = 
24f00 28 72 62 75 5f 66 69 6c 65 20 2a 29 70 46 69 6c  (rbu_file *)pFil
24f10 65 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70  e;.  return p->p
24f20 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e  Real->pMethods->
24f30 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
24f40 63 6b 28 70 2d 3e 70 52 65 61 6c 2c 20 70 52 65  ck(p->pReal, pRe
24f50 73 4f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  sOut);.}../*.** 
24f60 46 69 6c 65 20 63 6f 6e 74 72 6f 6c 20 6d 65 74  File control met
24f70 68 6f 64 2e 20 46 6f 72 20 63 75 73 74 6f 6d 20  hod. For custom 
24f80 6f 70 65 72 61 74 69 6f 6e 73 20 6f 6e 20 61 6e  operations on an
24f90 20 72 62 75 56 66 73 2d 66 69 6c 65 2e 0a 2a 2f   rbuVfs-file..*/
24fa0 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 56  .static int rbuV
24fb0 66 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71  fsFileControl(sq
24fc0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
24fd0 65 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20  e, int op, void 
24fe0 2a 70 41 72 67 29 7b 0a 20 20 72 62 75 5f 66 69  *pArg){.  rbu_fi
24ff0 6c 65 20 2a 70 20 3d 20 28 72 62 75 5f 66 69 6c  le *p = (rbu_fil
25000 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 69 6e 74  e *)pFile;.  int
25010 20 28 2a 78 43 6f 6e 74 72 6f 6c 29 28 73 71 6c   (*xControl)(sql
25020 69 74 65 33 5f 66 69 6c 65 2a 2c 69 6e 74 2c 76  ite3_file*,int,v
25030 6f 69 64 2a 29 20 3d 20 70 2d 3e 70 52 65 61 6c  oid*) = p->pReal
25040 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 46 69 6c  ->pMethods->xFil
25050 65 43 6f 6e 74 72 6f 6c 3b 0a 20 20 69 6e 74 20  eControl;.  int 
25060 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  rc;..  assert( p
25070 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20 28 53  ->openFlags & (S
25080 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
25090 44 42 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54  DB|SQLITE_OPEN_T
250a0 45 4d 50 5f 44 42 29 0a 20 20 20 20 20 20 20 7c  EMP_DB).       |
250b0 7c 20 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26  | p->openFlags &
250c0 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52   (SQLITE_OPEN_TR
250d0 41 4e 53 49 45 4e 54 5f 44 42 7c 53 51 4c 49 54  ANSIENT_DB|SQLIT
250e0 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52  E_OPEN_TEMP_JOUR
250f0 4e 41 4c 29 0a 20 20 29 3b 0a 20 20 69 66 28 20  NAL).  );.  if( 
25100 6f 70 3d 3d 53 51 4c 49 54 45 5f 46 43 4e 54 4c  op==SQLITE_FCNTL
25110 5f 52 42 55 20 29 7b 0a 20 20 20 20 73 71 6c 69  _RBU ){.    sqli
25120 74 65 33 72 62 75 20 2a 70 52 62 75 20 3d 20 28  te3rbu *pRbu = (
25130 73 71 6c 69 74 65 33 72 62 75 2a 29 70 41 72 67  sqlite3rbu*)pArg
25140 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 72 73 74 20  ;..    /* First 
25150 74 72 79 20 74 6f 20 66 69 6e 64 20 61 6e 6f 74  try to find anot
25160 68 65 72 20 52 42 55 20 76 66 73 20 6c 6f 77 65  her RBU vfs lowe
25170 72 20 64 6f 77 6e 20 69 6e 20 74 68 65 20 76 66  r down in the vf
25180 73 20 73 74 61 63 6b 2e 20 49 66 0a 20 20 20 20  s stack. If.    
25190 2a 2a 20 6f 6e 65 20 69 73 20 66 6f 75 6e 64 2c  ** one is found,
251a0 20 74 68 69 73 20 76 66 73 20 77 69 6c 6c 20 6f   this vfs will o
251b0 70 65 72 61 74 65 20 69 6e 20 70 61 73 73 2d 74  perate in pass-t
251c0 68 72 6f 75 67 68 20 6d 6f 64 65 2e 20 54 68 65  hrough mode. The
251d0 20 6c 6f 77 65 72 0a 20 20 20 20 2a 2a 20 6c 65   lower.    ** le
251e0 76 65 6c 20 76 66 73 20 77 69 6c 6c 20 64 6f 20  vel vfs will do 
251f0 74 68 65 20 73 70 65 63 69 61 6c 20 52 42 55 20  the special RBU 
25200 68 61 6e 64 6c 69 6e 67 2e 20 20 2a 2f 0a 20 20  handling.  */.  
25210 20 20 72 63 20 3d 20 78 43 6f 6e 74 72 6f 6c 28    rc = xControl(
25220 70 2d 3e 70 52 65 61 6c 2c 20 6f 70 2c 20 70 41  p->pReal, op, pA
25230 72 67 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63  rg);..    if( rc
25240 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  ==SQLITE_NOTFOUN
25250 44 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f  D ){.      /* No
25260 77 20 73 65 61 72 63 68 20 66 6f 72 20 61 20 7a  w search for a z
25270 69 70 76 66 73 20 69 6e 73 74 61 6e 63 65 20 6c  ipvfs instance l
25280 6f 77 65 72 20 64 6f 77 6e 20 69 6e 20 74 68 65  ower down in the
25290 20 56 46 53 20 73 74 61 63 6b 2e 20 49 66 0a 20   VFS stack. If. 
252a0 20 20 20 20 20 2a 2a 20 6f 6e 65 20 69 73 20 66       ** one is f
252b0 6f 75 6e 64 2c 20 74 68 69 73 20 69 73 20 61 6e  ound, this is an
252c0 20 65 72 72 6f 72 2e 20 20 2a 2f 0a 20 20 20 20   error.  */.    
252d0 20 20 76 6f 69 64 20 2a 64 75 6d 6d 79 20 3d 20    void *dummy = 
252e0 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 78 43  0;.      rc = xC
252f0 6f 6e 74 72 6f 6c 28 70 2d 3e 70 52 65 61 6c 2c  ontrol(p->pReal,
25300 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 5a 49   SQLITE_FCNTL_ZI
25310 50 56 46 53 2c 20 26 64 75 6d 6d 79 29 3b 0a 20  PVFS, &dummy);. 
25320 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
25330 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
25340 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
25350 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 70 52 62  ROR;.        pRb
25360 75 2d 3e 7a 45 72 72 6d 73 67 20 3d 20 73 71 6c  u->zErrmsg = sql
25370 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 72 62  ite3_mprintf("rb
25380 75 2f 7a 69 70 76 66 73 20 73 65 74 75 70 20 65  u/zipvfs setup e
25390 72 72 6f 72 22 29 3b 0a 20 20 20 20 20 20 7d 65  rror");.      }e
253a0 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  lse if( rc==SQLI
253b0 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 7b 0a 20  TE_NOTFOUND ){. 
253c0 20 20 20 20 20 20 20 70 52 62 75 2d 3e 70 54 61         pRbu->pTa
253d0 72 67 65 74 46 64 20 3d 20 70 3b 0a 20 20 20 20  rgetFd = p;.    
253e0 20 20 20 20 70 2d 3e 70 52 62 75 20 3d 20 70 52      p->pRbu = pR
253f0 62 75 3b 0a 20 20 20 20 20 20 20 20 72 62 75 4d  bu;.        rbuM
25400 61 69 6e 6c 69 73 74 41 64 64 28 70 29 3b 0a 20  ainlistAdd(p);. 
25410 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 57         if( p->pW
25420 61 6c 46 64 20 29 20 70 2d 3e 70 57 61 6c 46 64  alFd ) p->pWalFd
25430 2d 3e 70 52 62 75 20 3d 20 70 52 62 75 3b 0a 20  ->pRbu = pRbu;. 
25440 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
25450 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
25460 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
25470 72 63 3b 0a 20 20 7d 0a 20 20 65 6c 73 65 20 69  rc;.  }.  else i
25480 66 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 46 43  f( op==SQLITE_FC
25490 4e 54 4c 5f 52 42 55 43 4e 54 20 29 7b 0a 20 20  NTL_RBUCNT ){.  
254a0 20 20 73 71 6c 69 74 65 33 72 62 75 20 2a 70 52    sqlite3rbu *pR
254b0 62 75 20 3d 20 28 73 71 6c 69 74 65 33 72 62 75  bu = (sqlite3rbu
254c0 2a 29 70 41 72 67 3b 0a 20 20 20 20 70 52 62 75  *)pArg;.    pRbu
254d0 2d 3e 6e 52 62 75 2b 2b 3b 0a 20 20 20 20 70 52  ->nRbu++;.    pR
254e0 62 75 2d 3e 70 52 62 75 46 64 20 3d 20 70 3b 0a  bu->pRbuFd = p;.
254f0 20 20 20 20 70 2d 3e 62 4e 6f 6c 6f 63 6b 20 3d      p->bNolock =
25500 20 31 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20   1;.  }..  rc = 
25510 78 43 6f 6e 74 72 6f 6c 28 70 2d 3e 70 52 65 61  xControl(p->pRea
25520 6c 2c 20 6f 70 2c 20 70 41 72 67 29 3b 0a 20 20  l, op, pArg);.  
25530 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
25540 4b 20 26 26 20 6f 70 3d 3d 53 51 4c 49 54 45 5f  K && op==SQLITE_
25550 46 43 4e 54 4c 5f 56 46 53 4e 41 4d 45 20 29 7b  FCNTL_VFSNAME ){
25560 0a 20 20 20 20 72 62 75 5f 76 66 73 20 2a 70 52  .    rbu_vfs *pR
25570 62 75 56 66 73 20 3d 20 70 2d 3e 70 52 62 75 56  buVfs = p->pRbuV
25580 66 73 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 49  fs;.    char *zI
25590 6e 20 3d 20 2a 28 63 68 61 72 2a 2a 29 70 41 72  n = *(char**)pAr
255a0 67 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4f 75  g;.    char *zOu
255b0 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  t = sqlite3_mpri
255c0 6e 74 66 28 22 72 62 75 28 25 73 29 2f 25 7a 22  ntf("rbu(%s)/%z"
255d0 2c 20 70 52 62 75 56 66 73 2d 3e 62 61 73 65 2e  , pRbuVfs->base.
255e0 7a 4e 61 6d 65 2c 20 7a 49 6e 29 3b 0a 20 20 20  zName, zIn);.   
255f0 20 2a 28 63 68 61 72 2a 2a 29 70 41 72 67 20 3d   *(char**)pArg =
25600 20 7a 4f 75 74 3b 0a 20 20 20 20 69 66 28 20 7a   zOut;.    if( z
25610 4f 75 74 3d 3d 30 20 29 20 72 63 20 3d 20 53 51  Out==0 ) rc = SQ
25620 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
25630 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
25640 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
25650 65 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 69 6e  e sector-size in
25660 20 62 79 74 65 73 20 66 6f 72 20 61 6e 20 72 62   bytes for an rb
25670 75 56 66 73 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74  uVfs-file..*/.st
25680 61 74 69 63 20 69 6e 74 20 72 62 75 56 66 73 53  atic int rbuVfsS
25690 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65  ectorSize(sqlite
256a0 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  3_file *pFile){.
256b0 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 20 3d 20    rbu_file *p = 
256c0 28 72 62 75 5f 66 69 6c 65 20 2a 29 70 46 69 6c  (rbu_file *)pFil
256d0 65 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70  e;.  return p->p
256e0 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e  Real->pMethods->
256f0 78 53 65 63 74 6f 72 53 69 7a 65 28 70 2d 3e 70  xSectorSize(p->p
25700 52 65 61 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Real);.}../*.** 
25710 52 65 74 75 72 6e 20 74 68 65 20 64 65 76 69 63  Return the devic
25720 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63  e characteristic
25730 20 66 6c 61 67 73 20 73 75 70 70 6f 72 74 65 64   flags supported
25740 20 62 79 20 61 6e 20 72 62 75 56 66 73 2d 66 69   by an rbuVfs-fi
25750 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
25760 74 20 72 62 75 56 66 73 44 65 76 69 63 65 43 68  t rbuVfsDeviceCh
25770 61 72 61 63 74 65 72 69 73 74 69 63 73 28 73 71  aracteristics(sq
25780 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
25790 65 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a  e){.  rbu_file *
257a0 70 20 3d 20 28 72 62 75 5f 66 69 6c 65 20 2a 29  p = (rbu_file *)
257b0 70 46 69 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20  pFile;.  return 
257c0 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f  p->pReal->pMetho
257d0 64 73 2d 3e 78 44 65 76 69 63 65 43 68 61 72 61  ds->xDeviceChara
257e0 63 74 65 72 69 73 74 69 63 73 28 70 2d 3e 70 52  cteristics(p->pR
257f0 65 61 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  eal);.}../*.** T
25800 61 6b 65 20 6f 72 20 72 65 6c 65 61 73 65 20 61  ake or release a
25810 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6c   shared-memory l
25820 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ock..*/.static i
25830 6e 74 20 72 62 75 56 66 73 53 68 6d 4c 6f 63 6b  nt rbuVfsShmLock
25840 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70  (sqlite3_file *p
25850 46 69 6c 65 2c 20 69 6e 74 20 6f 66 73 74 2c 20  File, int ofst, 
25860 69 6e 74 20 6e 2c 20 69 6e 74 20 66 6c 61 67 73  int n, int flags
25870 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a 70  ){.  rbu_file *p
25880 20 3d 20 28 72 62 75 5f 66 69 6c 65 2a 29 70 46   = (rbu_file*)pF
25890 69 6c 65 3b 0a 20 20 73 71 6c 69 74 65 33 72 62  ile;.  sqlite3rb
258a0 75 20 2a 70 52 62 75 20 3d 20 70 2d 3e 70 52 62  u *pRbu = p->pRb
258b0 75 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  u;.  int rc = SQ
258c0 4c 49 54 45 5f 4f 4b 3b 0a 0a 23 69 66 64 65 66  LITE_OK;..#ifdef
258d0 20 53 51 4c 49 54 45 5f 41 4d 41 4c 47 41 4d 41   SQLITE_AMALGAMA
258e0 54 49 4f 4e 0a 20 20 20 20 61 73 73 65 72 74 28  TION.    assert(
258f0 20 57 41 4c 5f 43 4b 50 54 5f 4c 4f 43 4b 3d 3d   WAL_CKPT_LOCK==
25900 31 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61  1 );.#endif..  a
25910 73 73 65 72 74 28 20 70 2d 3e 6f 70 65 6e 46 6c  ssert( p->openFl
25920 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f 4f 50  ags & (SQLITE_OP
25930 45 4e 5f 4d 41 49 4e 5f 44 42 7c 53 51 4c 49 54  EN_MAIN_DB|SQLIT
25940 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 29 20  E_OPEN_TEMP_DB) 
25950 29 3b 0a 20 20 69 66 28 20 70 52 62 75 20 26 26  );.  if( pRbu &&
25960 20 28 70 52 62 75 2d 3e 65 53 74 61 67 65 3d 3d   (pRbu->eStage==
25970 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20 7c 7c  RBU_STAGE_OAL ||
25980 20 70 52 62 75 2d 3e 65 53 74 61 67 65 3d 3d 52   pRbu->eStage==R
25990 42 55 5f 53 54 41 47 45 5f 4d 4f 56 45 29 20 29  BU_STAGE_MOVE) )
259a0 7b 0a 20 20 20 20 2f 2a 20 4d 61 67 69 63 20 6e  {.    /* Magic n
259b0 75 6d 62 65 72 20 31 20 69 73 20 74 68 65 20 57  umber 1 is the W
259c0 41 4c 5f 43 4b 50 54 5f 4c 4f 43 4b 20 6c 6f 63  AL_CKPT_LOCK loc
259d0 6b 2e 20 50 72 65 76 65 6e 74 69 6e 67 20 53 51  k. Preventing SQ
259e0 4c 69 74 65 20 66 72 6f 6d 0a 20 20 20 20 2a 2a  Lite from.    **
259f0 20 74 61 6b 69 6e 67 20 74 68 69 73 20 6c 6f 63   taking this loc
25a00 6b 20 61 6c 73 6f 20 70 72 65 76 65 6e 74 73 20  k also prevents 
25a10 61 6e 79 20 63 68 65 63 6b 70 6f 69 6e 74 73 20  any checkpoints 
25a20 66 72 6f 6d 20 6f 63 63 75 72 72 69 6e 67 2e 20  from occurring. 
25a30 0a 20 20 20 20 2a 2a 20 74 6f 64 6f 3a 20 72 65  .    ** todo: re
25a40 61 6c 6c 79 2c 20 69 74 27 73 20 6e 6f 74 20 63  ally, it's not c
25a50 6c 65 61 72 20 77 68 79 20 74 68 69 73 20 6d 69  lear why this mi
25a60 67 68 74 20 6f 63 63 75 72 2c 20 61 73 20 0a 20  ght occur, as . 
25a70 20 20 20 2a 2a 20 77 61 6c 5f 61 75 74 6f 63 68     ** wal_autoch
25a80 65 63 6b 70 6f 69 6e 74 20 6f 75 67 68 74 20 74  eckpoint ought t
25a90 6f 20 62 65 20 74 75 72 6e 65 64 20 6f 66 66 2e  o be turned off.
25aa0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 66 73    */.    if( ofs
25ab0 74 3d 3d 57 41 4c 5f 4c 4f 43 4b 5f 43 4b 50 54  t==WAL_LOCK_CKPT
25ac0 20 26 26 20 6e 3d 3d 31 20 29 20 72 63 20 3d 20   && n==1 ) rc = 
25ad0 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
25ae0 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 62 43  else{.    int bC
25af0 61 70 74 75 72 65 20 3d 20 30 3b 0a 20 20 20 20  apture = 0;.    
25b00 69 66 28 20 70 52 62 75 20 26 26 20 70 52 62 75  if( pRbu && pRbu
25b10 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54  ->eStage==RBU_ST
25b20 41 47 45 5f 43 41 50 54 55 52 45 20 29 7b 0a 20  AGE_CAPTURE ){. 
25b30 20 20 20 20 20 62 43 61 70 74 75 72 65 20 3d 20       bCapture = 
25b40 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  1;.    }..    if
25b50 28 20 62 43 61 70 74 75 72 65 3d 3d 30 20 7c 7c  ( bCapture==0 ||
25b60 20 30 3d 3d 28 66 6c 61 67 73 20 26 20 53 51 4c   0==(flags & SQL
25b70 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 29 20  ITE_SHM_UNLOCK) 
25b80 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 2d  ){.      rc = p-
25b90 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73  >pReal->pMethods
25ba0 2d 3e 78 53 68 6d 4c 6f 63 6b 28 70 2d 3e 70 52  ->xShmLock(p->pR
25bb0 65 61 6c 2c 20 6f 66 73 74 2c 20 6e 2c 20 66 6c  eal, ofst, n, fl
25bc0 61 67 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ags);.      if( 
25bd0 62 43 61 70 74 75 72 65 20 26 26 20 72 63 3d 3d  bCapture && rc==
25be0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
25bf0 20 20 20 20 20 70 52 62 75 2d 3e 6d 4c 6f 63 6b       pRbu->mLock
25c00 20 7c 3d 20 28 31 20 3c 3c 20 6f 66 73 74 29 3b   |= (1 << ofst);
25c10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
25c20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
25c30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e  .}../*.** Obtain
25c40 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
25c50 6d 61 70 70 69 6e 67 20 6f 66 20 61 20 73 69 6e  mapping of a sin
25c60 67 6c 65 20 33 32 4b 69 42 20 70 61 67 65 20 6f  gle 32KiB page o
25c70 66 20 74 68 65 20 2a 2d 73 68 6d 20 66 69 6c 65  f the *-shm file
25c80 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
25c90 72 62 75 56 66 73 53 68 6d 4d 61 70 28 0a 20 20  rbuVfsShmMap(.  
25ca0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
25cb0 69 6c 65 2c 20 0a 20 20 69 6e 74 20 69 52 65 67  ile, .  int iReg
25cc0 69 6f 6e 2c 20 0a 20 20 69 6e 74 20 73 7a 52 65  ion, .  int szRe
25cd0 67 69 6f 6e 2c 20 0a 20 20 69 6e 74 20 69 73 57  gion, .  int isW
25ce0 72 69 74 65 2c 20 0a 20 20 76 6f 69 64 20 76 6f  rite, .  void vo
25cf0 6c 61 74 69 6c 65 20 2a 2a 70 70 0a 29 7b 0a 20  latile **pp.){. 
25d00 20 72 62 75 5f 66 69 6c 65 20 2a 70 20 3d 20 28   rbu_file *p = (
25d10 72 62 75 5f 66 69 6c 65 2a 29 70 46 69 6c 65 3b  rbu_file*)pFile;
25d20 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
25d30 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 65 53 74  TE_OK;.  int eSt
25d40 61 67 65 20 3d 20 28 70 2d 3e 70 52 62 75 20 3f  age = (p->pRbu ?
25d50 20 70 2d 3e 70 52 62 75 2d 3e 65 53 74 61 67 65   p->pRbu->eStage
25d60 20 3a 20 30 29 3b 0a 0a 20 20 2f 2a 20 49 66 20   : 0);..  /* If 
25d70 6e 6f 74 20 69 6e 20 52 42 55 5f 53 54 41 47 45  not in RBU_STAGE
25d80 5f 4f 41 4c 2c 20 61 6c 6c 6f 77 20 74 68 69 73  _OAL, allow this
25d90 20 63 61 6c 6c 20 74 6f 20 70 61 73 73 20 74 68   call to pass th
25da0 72 6f 75 67 68 2e 20 4f 72 2c 20 69 66 20 74 68  rough. Or, if th
25db0 69 73 0a 20 20 2a 2a 20 72 62 75 20 69 73 20 69  is.  ** rbu is i
25dc0 6e 20 74 68 65 20 52 42 55 5f 53 54 41 47 45 5f  n the RBU_STAGE_
25dd0 4f 41 4c 20 73 74 61 74 65 2c 20 75 73 65 20 68  OAL state, use h
25de0 65 61 70 20 6d 65 6d 6f 72 79 20 66 6f 72 20 2a  eap memory for *
25df0 2d 73 68 6d 20 73 70 61 63 65 20 0a 20 20 2a 2a  -shm space .  **
25e00 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20 66 69   instead of a fi
25e10 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 20 2a 2f 0a  le on disk.  */.
25e20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 65    assert( p->ope
25e30 6e 46 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45  nFlags & (SQLITE
25e40 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 7c 53 51  _OPEN_MAIN_DB|SQ
25e50 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44  LITE_OPEN_TEMP_D
25e60 42 29 20 29 3b 0a 20 20 69 66 28 20 65 53 74 61  B) );.  if( eSta
25e70 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4f 41  ge==RBU_STAGE_OA
25e80 4c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  L ){.    sqlite3
25e90 5f 69 6e 74 36 34 20 6e 42 79 74 65 20 3d 20 28  _int64 nByte = (
25ea0 69 52 65 67 69 6f 6e 2b 31 29 20 2a 20 73 69 7a  iRegion+1) * siz
25eb0 65 6f 66 28 63 68 61 72 2a 29 3b 0a 20 20 20 20  eof(char*);.    
25ec0 63 68 61 72 20 2a 2a 61 70 4e 65 77 20 3d 20 28  char **apNew = (
25ed0 63 68 61 72 2a 2a 29 73 71 6c 69 74 65 33 5f 72  char**)sqlite3_r
25ee0 65 61 6c 6c 6f 63 36 34 28 70 2d 3e 61 70 53 68  ealloc64(p->apSh
25ef0 6d 2c 20 6e 42 79 74 65 29 3b 0a 0a 20 20 20 20  m, nByte);..    
25f00 2f 2a 20 54 68 69 73 20 69 73 20 61 6e 20 52 42  /* This is an RB
25f10 55 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 68 61  U connection tha
25f20 74 20 75 73 65 73 20 69 74 73 20 6f 77 6e 20 68  t uses its own h
25f30 65 61 70 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74  eap memory for t
25f40 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 73 20  he.    ** pages 
25f50 6f 66 20 74 68 65 20 2a 2d 73 68 6d 20 66 69 6c  of the *-shm fil
25f60 65 2e 20 53 69 6e 63 65 20 6e 6f 20 6f 74 68 65  e. Since no othe
25f70 72 20 70 72 6f 63 65 73 73 20 63 61 6e 20 68 61  r process can ha
25f80 76 65 20 72 75 6e 0a 20 20 20 20 2a 2a 20 72 65  ve run.    ** re
25f90 63 6f 76 65 72 79 2c 20 74 68 65 20 63 6f 6e 6e  covery, the conn
25fa0 65 63 74 69 6f 6e 20 6d 75 73 74 20 72 65 71 75  ection must requ
25fb0 65 73 74 20 2a 2d 73 68 6d 20 70 61 67 65 73 20  est *-shm pages 
25fc0 69 6e 20 6f 72 64 65 72 0a 20 20 20 20 2a 2a 20  in order.    ** 
25fd0 66 72 6f 6d 20 73 74 61 72 74 20 74 6f 20 66 69  from start to fi
25fe0 6e 69 73 68 2e 20 20 2a 2f 0a 20 20 20 20 61 73  nish.  */.    as
25ff0 73 65 72 74 28 20 69 52 65 67 69 6f 6e 3d 3d 70  sert( iRegion==p
26000 2d 3e 6e 53 68 6d 20 29 3b 0a 20 20 20 20 69 66  ->nShm );.    if
26010 28 20 61 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  ( apNew==0 ){.  
26020 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
26030 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65  NOMEM;.    }else
26040 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26  {.      memset(&
26050 61 70 4e 65 77 5b 70 2d 3e 6e 53 68 6d 5d 2c 20  apNew[p->nShm], 
26060 30 2c 20 73 69 7a 65 6f 66 28 63 68 61 72 2a 29  0, sizeof(char*)
26070 20 2a 20 28 31 20 2b 20 69 52 65 67 69 6f 6e 20   * (1 + iRegion 
26080 2d 20 70 2d 3e 6e 53 68 6d 29 29 3b 0a 20 20 20  - p->nShm));.   
26090 20 20 20 70 2d 3e 61 70 53 68 6d 20 3d 20 61 70     p->apShm = ap
260a0 4e 65 77 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 53  New;.      p->nS
260b0 68 6d 20 3d 20 69 52 65 67 69 6f 6e 2b 31 3b 0a  hm = iRegion+1;.
260c0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72      }..    if( r
260d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
260e0 20 20 20 20 20 20 63 68 61 72 20 2a 70 4e 65 77        char *pNew
260f0 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65   = (char*)sqlite
26100 33 5f 6d 61 6c 6c 6f 63 36 34 28 73 7a 52 65 67  3_malloc64(szReg
26110 69 6f 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ion);.      if( 
26120 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pNew==0 ){.     
26130 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
26140 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73  OMEM;.      }els
26150 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  e{.        memse
26160 74 28 70 4e 65 77 2c 20 30 2c 20 73 7a 52 65 67  t(pNew, 0, szReg
26170 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  ion);.        p-
26180 3e 61 70 53 68 6d 5b 69 52 65 67 69 6f 6e 5d 20  >apShm[iRegion] 
26190 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 7d 0a  = pNew;.      }.
261a0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72      }..    if( r
261b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
261c0 20 20 20 20 20 20 2a 70 70 20 3d 20 70 2d 3e 61        *pp = p->a
261d0 70 53 68 6d 5b 69 52 65 67 69 6f 6e 5d 3b 0a 20  pShm[iRegion];. 
261e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
261f0 2a 70 70 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  *pp = 0;.    }. 
26200 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
26210 72 74 28 20 70 2d 3e 61 70 53 68 6d 3d 3d 30 20  rt( p->apShm==0 
26220 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 2d 3e 70  );.    rc = p->p
26230 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e  Real->pMethods->
26240 78 53 68 6d 4d 61 70 28 70 2d 3e 70 52 65 61 6c  xShmMap(p->pReal
26250 2c 20 69 52 65 67 69 6f 6e 2c 20 73 7a 52 65 67  , iRegion, szReg
26260 69 6f 6e 2c 20 69 73 57 72 69 74 65 2c 20 70 70  ion, isWrite, pp
26270 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
26280 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65   rc;.}../*.** Me
26290 6d 6f 72 79 20 62 61 72 72 69 65 72 2e 0a 2a 2f  mory barrier..*/
262a0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75  .static void rbu
262b0 56 66 73 53 68 6d 42 61 72 72 69 65 72 28 73 71  VfsShmBarrier(sq
262c0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
262d0 65 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a  e){.  rbu_file *
262e0 70 20 3d 20 28 72 62 75 5f 66 69 6c 65 20 2a 29  p = (rbu_file *)
262f0 70 46 69 6c 65 3b 0a 20 20 70 2d 3e 70 52 65 61  pFile;.  p->pRea
26300 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53 68  l->pMethods->xSh
26310 6d 42 61 72 72 69 65 72 28 70 2d 3e 70 52 65 61  mBarrier(p->pRea
26320 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  l);.}../*.** The
26330 20 78 53 68 6d 55 6e 6d 61 70 20 6d 65 74 68 6f   xShmUnmap metho
26340 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
26350 20 72 62 75 56 66 73 53 68 6d 55 6e 6d 61 70 28   rbuVfsShmUnmap(
26360 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
26370 69 6c 65 2c 20 69 6e 74 20 64 65 6c 46 6c 61 67  ile, int delFlag
26380 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a 70  ){.  rbu_file *p
26390 20 3d 20 28 72 62 75 5f 66 69 6c 65 2a 29 70 46   = (rbu_file*)pF
263a0 69 6c 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ile;.  int rc = 
263b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
263c0 20 65 53 74 61 67 65 20 3d 20 28 70 2d 3e 70 52   eStage = (p->pR
263d0 62 75 20 3f 20 70 2d 3e 70 52 62 75 2d 3e 65 53  bu ? p->pRbu->eS
263e0 74 61 67 65 20 3a 20 30 29 3b 0a 0a 20 20 61 73  tage : 0);..  as
263f0 73 65 72 74 28 20 70 2d 3e 6f 70 65 6e 46 6c 61  sert( p->openFla
26400 67 73 20 26 20 28 53 51 4c 49 54 45 5f 4f 50 45  gs & (SQLITE_OPE
26410 4e 5f 4d 41 49 4e 5f 44 42 7c 53 51 4c 49 54 45  N_MAIN_DB|SQLITE
26420 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 29 20 29  _OPEN_TEMP_DB) )
26430 3b 0a 20 20 69 66 28 20 65 53 74 61 67 65 3d 3d  ;.  if( eStage==
26440 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20 7c 7c  RBU_STAGE_OAL ||
26450 20 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41   eStage==RBU_STA
26460 47 45 5f 4d 4f 56 45 20 29 7b 0a 20 20 20 20 2f  GE_MOVE ){.    /
26470 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 7d 65 6c  * no-op */.  }el
26480 73 65 7b 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61  se{.    /* Relea
26490 73 65 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e  se the checkpoin
264a0 74 65 72 20 61 6e 64 20 77 72 69 74 65 72 20 6c  ter and writer l
264b0 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 72 62 75 55  ocks */.    rbuU
264c0 6e 6c 6f 63 6b 53 68 6d 28 70 29 3b 0a 20 20 20  nlockShm(p);.   
264d0 20 72 63 20 3d 20 70 2d 3e 70 52 65 61 6c 2d 3e   rc = p->pReal->
264e0 70 4d 65 74 68 6f 64 73 2d 3e 78 53 68 6d 55 6e  pMethods->xShmUn
264f0 6d 61 70 28 70 2d 3e 70 52 65 61 6c 2c 20 64 65  map(p->pReal, de
26500 6c 46 6c 61 67 29 3b 0a 20 20 7d 0a 20 20 72 65  lFlag);.  }.  re
26510 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a  turn rc;.}../* .
26520 2a 2a 20 41 20 6d 61 69 6e 20 64 61 74 61 62 61  ** A main databa
26530 73 65 20 6e 61 6d 65 64 20 7a 4e 61 6d 65 20 68  se named zName h
26540 61 73 20 6a 75 73 74 20 62 65 65 6e 20 6f 70 65  as just been ope
26550 6e 65 64 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ned. The followi
26560 6e 67 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  ng .** function 
26570 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65  returns a pointe
26580 72 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f 77  r to a buffer ow
26590 6e 65 64 20 62 79 20 53 51 4c 69 74 65 20 74 68  ned by SQLite th
265a0 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74  at contains.** t
265b0 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 2a  he name of the *
265c0 2d 77 61 6c 20 66 69 6c 65 20 74 68 69 73 20 64  -wal file this d
265d0 62 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 6c  b connection wil
265e0 6c 20 75 73 65 2e 20 53 51 4c 69 74 65 0a 2a 2a  l use. SQLite.**
265f0 20 68 61 70 70 65 6e 73 20 74 6f 20 70 61 73 73   happens to pass
26600 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
26610 69 73 20 62 75 66 66 65 72 20 77 68 65 6e 20 75  is buffer when u
26620 73 69 6e 67 20 78 41 63 63 65 73 73 28 29 0a 2a  sing xAccess().*
26630 2a 20 6f 72 20 78 4f 70 65 6e 28 29 20 74 6f 20  * or xOpen() to 
26640 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 2a  operate on the *
26650 2d 77 61 6c 20 66 69 6c 65 2e 20 20 0a 2a 2f 0a  -wal file.  .*/.
26660 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
26670 72 20 2a 72 62 75 4d 61 69 6e 54 6f 57 61 6c 28  r *rbuMainToWal(
26680 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
26690 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  e, int flags){. 
266a0 20 69 6e 74 20 6e 20 3d 20 28 69 6e 74 29 73 74   int n = (int)st
266b0 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 63  rlen(zName);.  c
266c0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 26  onst char *z = &
266d0 7a 4e 61 6d 65 5b 6e 5d 3b 0a 20 20 69 66 28 20  zName[n];.  if( 
266e0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
266f0 50 45 4e 5f 55 52 49 20 29 7b 0a 20 20 20 20 69  PEN_URI ){.    i
26700 6e 74 20 6f 64 64 20 3d 20 30 3b 0a 20 20 20 20  nt odd = 0;.    
26710 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20  while( 1 ){.    
26720 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 30 20 29 7b    if( z[0]==0 ){
26730 0a 20 20 20 20 20 20 20 20 6f 64 64 20 3d 20 31  .        odd = 1
26740 20 2d 20 6f 64 64 3b 0a 20 20 20 20 20 20 20 20   - odd;.        
26750 69 66 28 20 6f 64 64 20 26 26 20 7a 5b 31 5d 3d  if( odd && z[1]=
26760 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
26770 20 20 7d 0a 20 20 20 20 20 20 7a 2b 2b 3b 0a 20    }.      z++;. 
26780 20 20 20 7d 0a 20 20 20 20 7a 20 2b 3d 20 32 3b     }.    z += 2;
26790 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68  .  }else{.    wh
267a0 69 6c 65 28 20 2a 7a 3d 3d 30 20 29 20 7a 2b 2b  ile( *z==0 ) z++
267b0 3b 0a 20 20 7d 0a 20 20 7a 20 2b 3d 20 28 6e 20  ;.  }.  z += (n 
267c0 2b 20 38 20 2b 20 31 29 3b 0a 20 20 72 65 74 75  + 8 + 1);.  retu
267d0 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  rn z;.}../*.** O
267e0 70 65 6e 20 61 6e 20 72 62 75 20 66 69 6c 65 20  pen an rbu file 
267f0 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  handle..*/.stati
26800 63 20 69 6e 74 20 72 62 75 56 66 73 4f 70 65 6e  c int rbuVfsOpen
26810 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
26820 2a 70 56 66 73 2c 0a 20 20 63 6f 6e 73 74 20 63  *pVfs,.  const c
26830 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20 73 71  har *zName,.  sq
26840 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
26850 65 2c 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 0a  e,.  int flags,.
26860 20 20 69 6e 74 20 2a 70 4f 75 74 46 6c 61 67 73    int *pOutFlags
26870 0a 29 7b 0a 20 20 73 74 61 74 69 63 20 73 71 6c  .){.  static sql
26880 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
26890 72 62 75 76 66 73 5f 69 6f 5f 6d 65 74 68 6f 64  rbuvfs_io_method
268a0 73 20 3d 20 7b 0a 20 20 20 20 32 2c 20 20 20 20  s = {.    2,    
268b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
268c0 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73          /* iVers
268d0 69 6f 6e 20 2a 2f 0a 20 20 20 20 72 62 75 56 66  ion */.    rbuVf
268e0 73 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  sClose,         
268f0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
26900 73 65 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73  se */.    rbuVfs
26910 52 65 61 64 2c 20 20 20 20 20 20 20 20 20 20 20  Read,           
26920 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65 61 64          /* xRead
26930 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 57 72   */.    rbuVfsWr
26940 69 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ite,            
26950 20 20 20 20 20 20 2f 2a 20 78 57 72 69 74 65 20        /* xWrite 
26960 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 54 72 75  */.    rbuVfsTru
26970 6e 63 61 74 65 2c 20 20 20 20 20 20 20 20 20 20  ncate,          
26980 20 20 20 20 20 2f 2a 20 78 54 72 75 6e 63 61 74       /* xTruncat
26990 65 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 53  e */.    rbuVfsS
269a0 79 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  ync,            
269b0 20 20 20 20 20 20 20 2f 2a 20 78 53 79 6e 63 20         /* xSync 
269c0 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 46 69 6c  */.    rbuVfsFil
269d0 65 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20  eSize,          
269e0 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 53 69 7a       /* xFileSiz
269f0 65 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 4c  e */.    rbuVfsL
26a00 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
26a10 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
26a20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 55 6e 6c  */.    rbuVfsUnl
26a30 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
26a40 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20       /* xUnlock 
26a50 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 43 68 65  */.    rbuVfsChe
26a60 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20  ckReservedLock, 
26a70 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65       /* xCheckRe
26a80 73 65 72 76 65 64 4c 6f 63 6b 20 2a 2f 0a 20 20  servedLock */.  
26a90 20 20 72 62 75 56 66 73 46 69 6c 65 43 6f 6e 74    rbuVfsFileCont
26aa0 72 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  rol,            
26ab0 2f 2a 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20  /* xFileControl 
26ac0 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 53 65 63  */.    rbuVfsSec
26ad0 74 6f 72 53 69 7a 65 2c 20 20 20 20 20 20 20 20  torSize,        
26ae0 20 20 20 20 20 2f 2a 20 78 53 65 63 74 6f 72 53       /* xSectorS
26af0 69 7a 65 20 2a 2f 0a 20 20 20 20 72 62 75 56 66  ize */.    rbuVf
26b00 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
26b10 69 73 74 69 63 73 2c 20 20 2f 2a 20 78 44 65 76  istics,  /* xDev
26b20 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
26b30 63 73 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73  cs */.    rbuVfs
26b40 53 68 6d 4d 61 70 2c 20 20 20 20 20 20 20 20 20  ShmMap,         
26b50 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d          /* xShmM
26b60 61 70 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73  ap */.    rbuVfs
26b70 53 68 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  ShmLock,        
26b80 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4c          /* xShmL
26b90 6f 63 6b 20 2a 2f 0a 20 20 20 20 72 62 75 56 66  ock */.    rbuVf
26ba0 73 53 68 6d 42 61 72 72 69 65 72 2c 20 20 20 20  sShmBarrier,    
26bb0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
26bc0 42 61 72 72 69 65 72 20 2a 2f 0a 20 20 20 20 72  Barrier */.    r
26bd0 62 75 56 66 73 53 68 6d 55 6e 6d 61 70 2c 20 20  buVfsShmUnmap,  
26be0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26bf0 78 53 68 6d 55 6e 6d 61 70 20 2a 2f 0a 20 20 20  xShmUnmap */.   
26c00 20 30 2c 20 30 20 20 20 20 20 20 20 20 20 20 20   0, 0           
26c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26c20 2a 20 78 46 65 74 63 68 2c 20 78 55 6e 66 65 74  * xFetch, xUnfet
26c30 63 68 20 2a 2f 0a 20 20 7d 3b 0a 20 20 72 62 75  ch */.  };.  rbu
26c40 5f 76 66 73 20 2a 70 52 62 75 56 66 73 20 3d 20  _vfs *pRbuVfs = 
26c50 28 72 62 75 5f 76 66 73 2a 29 70 56 66 73 3b 0a  (rbu_vfs*)pVfs;.
26c60 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
26c70 52 65 61 6c 56 66 73 20 3d 20 70 52 62 75 56 66  RealVfs = pRbuVf
26c80 73 2d 3e 70 52 65 61 6c 56 66 73 3b 0a 20 20 72  s->pRealVfs;.  r
26c90 62 75 5f 66 69 6c 65 20 2a 70 46 64 20 3d 20 28  bu_file *pFd = (
26ca0 72 62 75 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65  rbu_file *)pFile
26cb0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
26cc0 49 54 45 5f 4f 4b 3b 0a 20 20 63 6f 6e 73 74 20  ITE_OK;.  const 
26cd0 63 68 61 72 20 2a 7a 4f 70 65 6e 20 3d 20 7a 4e  char *zOpen = zN
26ce0 61 6d 65 3b 0a 20 20 69 6e 74 20 6f 66 6c 61 67  ame;.  int oflag
26cf0 73 20 3d 20 66 6c 61 67 73 3b 0a 0a 20 20 6d 65  s = flags;..  me
26d00 6d 73 65 74 28 70 46 64 2c 20 30 2c 20 73 69 7a  mset(pFd, 0, siz
26d10 65 6f 66 28 72 62 75 5f 66 69 6c 65 29 29 3b 0a  eof(rbu_file));.
26d20 20 20 70 46 64 2d 3e 70 52 65 61 6c 20 3d 20 28    pFd->pReal = (
26d30 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 26 70  sqlite3_file*)&p
26d40 46 64 5b 31 5d 3b 0a 20 20 70 46 64 2d 3e 70 52  Fd[1];.  pFd->pR
26d50 62 75 56 66 73 20 3d 20 70 52 62 75 56 66 73 3b  buVfs = pRbuVfs;
26d60 0a 20 20 70 46 64 2d 3e 6f 70 65 6e 46 6c 61 67  .  pFd->openFlag
26d70 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 69 66 28  s = flags;.  if(
26d80 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 69 66   zName ){.    if
26d90 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ( flags & SQLITE
26da0 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 7b  _OPEN_MAIN_DB ){
26db0 0a 20 20 20 20 20 20 2f 2a 20 41 20 6d 61 69 6e  .      /* A main
26dc0 20 64 61 74 61 62 61 73 65 20 68 61 73 20 6a 75   database has ju
26dd0 73 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e 20  st been opened. 
26de0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c  The following bl
26df0 6f 63 6b 20 73 65 74 73 0a 20 20 20 20 20 20 2a  ock sets.      *
26e00 2a 20 28 70 46 64 2d 3e 7a 57 61 6c 29 20 74 6f  * (pFd->zWal) to
26e10 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66   point to a buff
26e20 65 72 20 6f 77 6e 65 64 20 62 79 20 53 51 4c 69  er owned by SQLi
26e30 74 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  te that contains
26e40 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6e 61  .      ** the na
26e50 6d 65 20 6f 66 20 74 68 65 20 2a 2d 77 61 6c 20  me of the *-wal 
26e60 66 69 6c 65 20 74 68 69 73 20 64 62 20 63 6f 6e  file this db con
26e70 6e 65 63 74 69 6f 6e 20 77 69 6c 6c 20 75 73 65  nection will use
26e80 2e 20 53 51 4c 69 74 65 0a 20 20 20 20 20 20 2a  . SQLite.      *
26e90 2a 20 68 61 70 70 65 6e 73 20 74 6f 20 70 61 73  * happens to pas
26ea0 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
26eb0 68 69 73 20 62 75 66 66 65 72 20 77 68 65 6e 20  his buffer when 
26ec0 75 73 69 6e 67 20 78 41 63 63 65 73 73 28 29 0a  using xAccess().
26ed0 20 20 20 20 20 20 2a 2a 20 6f 72 20 78 4f 70 65        ** or xOpe
26ee0 6e 28 29 20 74 6f 20 6f 70 65 72 61 74 65 20 6f  n() to operate o
26ef0 6e 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65  n the *-wal file
26f00 2e 20 20 2a 2f 0a 20 20 20 20 20 20 70 46 64 2d  .  */.      pFd-
26f10 3e 7a 57 61 6c 20 3d 20 72 62 75 4d 61 69 6e 54  >zWal = rbuMainT
26f20 6f 57 61 6c 28 7a 4e 61 6d 65 2c 20 66 6c 61 67  oWal(zName, flag
26f30 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c  s);.    }.    el
26f40 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 53  se if( flags & S
26f50 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 29  QLITE_OPEN_WAL )
26f60 7b 0a 20 20 20 20 20 20 72 62 75 5f 66 69 6c 65  {.      rbu_file
26f70 20 2a 70 44 62 20 3d 20 72 62 75 46 69 6e 64 4d   *pDb = rbuFindM
26f80 61 69 6e 64 62 28 70 52 62 75 56 66 73 2c 20 7a  aindb(pRbuVfs, z
26f90 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  Name, 0);.      
26fa0 69 66 28 20 70 44 62 20 29 7b 0a 20 20 20 20 20  if( pDb ){.     
26fb0 20 20 20 69 66 28 20 70 44 62 2d 3e 70 52 62 75     if( pDb->pRbu
26fc0 20 26 26 20 70 44 62 2d 3e 70 52 62 75 2d 3e 65   && pDb->pRbu->e
26fd0 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45  Stage==RBU_STAGE
26fe0 5f 4f 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  _OAL ){.        
26ff0 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 69    /* This call i
27000 73 20 74 6f 20 6f 70 65 6e 20 61 20 2a 2d 77 61  s to open a *-wa
27010 6c 20 66 69 6c 65 2e 20 49 6e 74 65 61 64 2c 20  l file. Intead, 
27020 6f 70 65 6e 20 74 68 65 20 2a 2d 6f 61 6c 2e 20  open the *-oal. 
27030 54 68 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a  This.          *
27040 2a 20 63 6f 64 65 20 65 6e 73 75 72 65 73 20 74  * code ensures t
27050 68 61 74 20 74 68 65 20 73 74 72 69 6e 67 20 70  hat the string p
27060 61 73 73 65 64 20 74 6f 20 78 4f 70 65 6e 28 29  assed to xOpen()
27070 20 69 73 20 74 65 72 6d 69 6e 61 74 65 64 20 62   is terminated b
27080 79 20 61 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  y a.          **
27090 20 70 61 69 72 20 6f 66 20 27 5c 30 27 20 62 79   pair of '\0' by
270a0 74 65 73 20 69 6e 20 63 61 73 65 20 74 68 65 20  tes in case the 
270b0 56 46 53 20 61 74 74 65 6d 70 74 73 20 74 6f 20  VFS attempts to 
270c0 65 78 74 72 61 63 74 20 61 20 55 52 49 20 0a 20  extract a URI . 
270d0 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61 72 61           ** para
270e0 6d 65 74 65 72 20 66 72 6f 6d 20 69 74 2e 20 20  meter from it.  
270f0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  */.          con
27100 73 74 20 63 68 61 72 20 2a 7a 42 61 73 65 20 3d  st char *zBase =
27110 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20   zName;.        
27120 20 20 73 69 7a 65 5f 74 20 6e 43 6f 70 79 3b 0a    size_t nCopy;.
27130 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
27140 7a 43 6f 70 79 3b 0a 20 20 20 20 20 20 20 20 20  zCopy;.         
27150 20 69 66 28 20 72 62 75 49 73 56 61 63 75 75 6d   if( rbuIsVacuum
27160 28 70 44 62 2d 3e 70 52 62 75 29 20 29 7b 0a 20  (pDb->pRbu) ){. 
27170 20 20 20 20 20 20 20 20 20 20 20 7a 42 61 73 65             zBase
27180 20 3d 20 73 71 6c 69 74 65 33 5f 64 62 5f 66 69   = sqlite3_db_fi
27190 6c 65 6e 61 6d 65 28 70 44 62 2d 3e 70 52 62 75  lename(pDb->pRbu
271a0 2d 3e 64 62 52 62 75 2c 20 22 6d 61 69 6e 22 29  ->dbRbu, "main")
271b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 42  ;.            zB
271c0 61 73 65 20 3d 20 72 62 75 4d 61 69 6e 54 6f 57  ase = rbuMainToW
271d0 61 6c 28 7a 42 61 73 65 2c 20 53 51 4c 49 54 45  al(zBase, SQLITE
271e0 5f 4f 50 45 4e 5f 55 52 49 29 3b 0a 20 20 20 20  _OPEN_URI);.    
271f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
27200 20 20 6e 43 6f 70 79 20 3d 20 73 74 72 6c 65 6e    nCopy = strlen
27210 28 7a 42 61 73 65 29 3b 0a 20 20 20 20 20 20 20  (zBase);.       
27220 20 20 20 7a 43 6f 70 79 20 3d 20 73 71 6c 69 74     zCopy = sqlit
27230 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 43 6f 70  e3_malloc64(nCop
27240 79 2b 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20  y+2);.          
27250 69 66 28 20 7a 43 6f 70 79 20 29 7b 0a 20 20 20  if( zCopy ){.   
27260 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
27270 7a 43 6f 70 79 2c 20 7a 42 61 73 65 2c 20 6e 43  zCopy, zBase, nC
27280 6f 70 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20  opy);.          
27290 20 20 7a 43 6f 70 79 5b 6e 43 6f 70 79 2d 33 5d    zCopy[nCopy-3]
272a0 20 3d 20 27 6f 27 3b 0a 20 20 20 20 20 20 20 20   = 'o';.        
272b0 20 20 20 20 7a 43 6f 70 79 5b 6e 43 6f 70 79 5d      zCopy[nCopy]
272c0 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 20   = '\0';.       
272d0 20 20 20 20 20 7a 43 6f 70 79 5b 6e 43 6f 70 79       zCopy[nCopy
272e0 2b 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20  +1] = '\0';.    
272f0 20 20 20 20 20 20 20 20 7a 4f 70 65 6e 20 3d 20          zOpen = 
27300 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 28 70 46  (const char*)(pF
27310 64 2d 3e 7a 44 65 6c 20 3d 20 7a 43 6f 70 79 29  d->zDel = zCopy)
27320 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
27330 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  e{.            r
27340 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
27350 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
27360 20 20 20 20 20 20 20 20 70 46 64 2d 3e 70 52 62          pFd->pRb
27370 75 20 3d 20 70 44 62 2d 3e 70 52 62 75 3b 0a 20  u = pDb->pRbu;. 
27380 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
27390 20 70 44 62 2d 3e 70 57 61 6c 46 64 20 3d 20 70   pDb->pWalFd = p
273a0 46 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  Fd;.      }.    
273b0 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  }.  }else{.    p
273c0 46 64 2d 3e 70 52 62 75 20 3d 20 70 52 62 75 56  Fd->pRbu = pRbuV
273d0 66 73 2d 3e 70 52 62 75 3b 0a 20 20 7d 0a 0a 20  fs->pRbu;.  }.. 
273e0 20 69 66 28 20 6f 66 6c 61 67 73 20 26 20 53 51   if( oflags & SQ
273f0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
27400 42 20 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33  B .   && sqlite3
27410 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 7a 4e 61  _uri_boolean(zNa
27420 6d 65 2c 20 22 72 62 75 5f 6d 65 6d 6f 72 79 22  me, "rbu_memory"
27430 2c 20 30 29 20 0a 20 20 29 7b 0a 20 20 20 20 61  , 0) .  ){.    a
27440 73 73 65 72 74 28 20 6f 66 6c 61 67 73 20 26 20  ssert( oflags & 
27450 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
27460 5f 44 42 20 29 3b 0a 20 20 20 20 6f 66 6c 61 67  _DB );.    oflag
27470 73 20 3d 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e  s =  SQLITE_OPEN
27480 5f 54 45 4d 50 5f 44 42 20 7c 20 53 51 4c 49 54  _TEMP_DB | SQLIT
27490 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
274a0 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43   | SQLITE_OPEN_C
274b0 52 45 41 54 45 20 7c 0a 20 20 20 20 20 20 20 20  REATE |.        
274c0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
274d0 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 20 53 51  N_EXCLUSIVE | SQ
274e0 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45  LITE_OPEN_DELETE
274f0 4f 4e 43 4c 4f 53 45 3b 0a 20 20 20 20 7a 4f 70  ONCLOSE;.    zOp
27500 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 69  en = 0;.  }..  i
27510 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
27520 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 52 65   ){.    rc = pRe
27530 61 6c 56 66 73 2d 3e 78 4f 70 65 6e 28 70 52 65  alVfs->xOpen(pRe
27540 61 6c 56 66 73 2c 20 7a 4f 70 65 6e 2c 20 70 46  alVfs, zOpen, pF
27550 64 2d 3e 70 52 65 61 6c 2c 20 6f 66 6c 61 67 73  d->pReal, oflags
27560 2c 20 70 4f 75 74 46 6c 61 67 73 29 3b 0a 20 20  , pOutFlags);.  
27570 7d 0a 20 20 69 66 28 20 70 46 64 2d 3e 70 52 65  }.  if( pFd->pRe
27580 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a  al->pMethods ){.
27590 20 20 20 20 2f 2a 20 54 68 65 20 78 4f 70 65 6e      /* The xOpen
275a0 28 29 20 6f 70 65 72 61 74 69 6f 6e 20 68 61 73  () operation has
275b0 20 73 75 63 63 65 65 64 65 64 2e 20 53 65 74 20   succeeded. Set 
275c0 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  the sqlite3_file
275d0 2e 70 4d 65 74 68 6f 64 73 0a 20 20 20 20 2a 2a  .pMethods.    **
275e0 20 70 6f 69 6e 74 65 72 20 61 6e 64 2c 20 69 66   pointer and, if
275f0 20 74 68 65 20 66 69 6c 65 20 69 73 20 61 20 6d   the file is a m
27600 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
27610 65 2c 20 6c 69 6e 6b 20 69 74 20 69 6e 74 6f 20  e, link it into 
27620 74 68 65 0a 20 20 20 20 2a 2a 20 6d 75 74 65 78  the.    ** mutex
27630 20 70 72 6f 74 65 63 74 65 64 20 6c 69 6e 6b 65   protected linke
27640 64 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 73 75  d list of all su
27650 63 68 20 66 69 6c 65 73 2e 20 20 2a 2f 0a 20 20  ch files.  */.  
27660 20 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64    pFile->pMethod
27670 73 20 3d 20 26 72 62 75 76 66 73 5f 69 6f 5f 6d  s = &rbuvfs_io_m
27680 65 74 68 6f 64 73 3b 0a 20 20 20 20 69 66 28 20  ethods;.    if( 
27690 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
276a0 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 7b 0a 20  PEN_MAIN_DB ){. 
276b0 20 20 20 20 20 72 62 75 4d 61 69 6e 6c 69 73 74       rbuMainlist
276c0 41 64 64 28 70 46 64 29 3b 0a 20 20 20 20 7d 0a  Add(pFd);.    }.
276d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
276e0 69 74 65 33 5f 66 72 65 65 28 70 46 64 2d 3e 7a  ite3_free(pFd->z
276f0 44 65 6c 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  Del);.  }..  ret
27700 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
27710 20 44 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65   Delete the file
27720 20 6c 6f 63 61 74 65 64 20 61 74 20 7a 50 61 74   located at zPat
27730 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  h..*/.static int
27740 20 72 62 75 56 66 73 44 65 6c 65 74 65 28 73 71   rbuVfsDelete(sq
27750 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
27760 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
27770 74 68 2c 20 69 6e 74 20 64 69 72 53 79 6e 63 29  th, int dirSync)
27780 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  {.  sqlite3_vfs 
27790 2a 70 52 65 61 6c 56 66 73 20 3d 20 28 28 72 62  *pRealVfs = ((rb
277a0 75 5f 76 66 73 2a 29 70 56 66 73 29 2d 3e 70 52  u_vfs*)pVfs)->pR
277b0 65 61 6c 56 66 73 3b 0a 20 20 72 65 74 75 72 6e  ealVfs;.  return
277c0 20 70 52 65 61 6c 56 66 73 2d 3e 78 44 65 6c 65   pRealVfs->xDele
277d0 74 65 28 70 52 65 61 6c 56 66 73 2c 20 7a 50 61  te(pRealVfs, zPa
277e0 74 68 2c 20 64 69 72 53 79 6e 63 29 3b 0a 7d 0a  th, dirSync);.}.
277f0 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 66 6f 72 20  ./*.** Test for 
27800 61 63 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f  access permissio
27810 6e 73 2e 20 52 65 74 75 72 6e 20 74 72 75 65 20  ns. Return true 
27820 69 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  if the requested
27830 20 70 65 72 6d 69 73 73 69 6f 6e 0a 2a 2a 20 69   permission.** i
27840 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72 20  s available, or 
27850 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e  false otherwise.
27860 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
27870 62 75 56 66 73 41 63 63 65 73 73 28 0a 20 20 73  buVfsAccess(.  s
27880 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
27890 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  , .  const char 
278a0 2a 7a 50 61 74 68 2c 20 0a 20 20 69 6e 74 20 66  *zPath, .  int f
278b0 6c 61 67 73 2c 20 0a 20 20 69 6e 74 20 2a 70 52  lags, .  int *pR
278c0 65 73 4f 75 74 0a 29 7b 0a 20 20 72 62 75 5f 76  esOut.){.  rbu_v
278d0 66 73 20 2a 70 52 62 75 56 66 73 20 3d 20 28 72  fs *pRbuVfs = (r
278e0 62 75 5f 76 66 73 2a 29 70 56 66 73 3b 0a 20 20  bu_vfs*)pVfs;.  
278f0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 52 65  sqlite3_vfs *pRe
27900 61 6c 56 66 73 20 3d 20 70 52 62 75 56 66 73 2d  alVfs = pRbuVfs-
27910 3e 70 52 65 61 6c 56 66 73 3b 0a 20 20 69 6e 74  >pRealVfs;.  int
27920 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 70 52 65   rc;..  rc = pRe
27930 61 6c 56 66 73 2d 3e 78 41 63 63 65 73 73 28 70  alVfs->xAccess(p
27940 52 65 61 6c 56 66 73 2c 20 7a 50 61 74 68 2c 20  RealVfs, zPath, 
27950 66 6c 61 67 73 2c 20 70 52 65 73 4f 75 74 29 3b  flags, pResOut);
27960 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 63  ..  /* If this c
27970 61 6c 6c 20 69 73 20 74 6f 20 63 68 65 63 6b 20  all is to check 
27980 69 66 20 61 20 2a 2d 77 61 6c 20 66 69 6c 65 20  if a *-wal file 
27990 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
279a0 61 6e 20 52 42 55 20 74 61 72 67 65 74 0a 20 20  an RBU target.  
279b0 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  ** database conn
279c0 65 63 74 69 6f 6e 20 65 78 69 73 74 73 2c 20 61  ection exists, a
279d0 6e 64 20 74 68 65 20 52 42 55 20 75 70 64 61 74  nd the RBU updat
279e0 65 20 69 73 20 69 6e 20 52 42 55 5f 53 54 41 47  e is in RBU_STAG
279f0 45 5f 4f 41 4c 2c 0a 20 20 2a 2a 20 74 68 65 20  E_OAL,.  ** the 
27a00 66 6f 6c 6c 6f 77 69 6e 67 20 73 70 65 63 69 61  following specia
27a10 6c 20 68 61 6e 64 6c 69 6e 67 20 69 73 20 61 63  l handling is ac
27a20 74 69 76 61 74 65 64 3a 0a 20 20 2a 2a 0a 20 20  tivated:.  **.  
27a30 2a 2a 20 20 20 61 29 20 69 66 20 74 68 65 20 2a  **   a) if the *
27a40 2d 77 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 65  -wal file does e
27a50 78 69 73 74 2c 20 72 65 74 75 72 6e 20 53 51 4c  xist, return SQL
27a60 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2e 20 54 68  ITE_CANTOPEN. Th
27a70 69 73 0a 20 20 2a 2a 20 20 20 20 20 20 65 6e 73  is.  **      ens
27a80 75 72 65 73 20 74 68 61 74 20 74 68 65 20 52 42  ures that the RB
27a90 55 20 65 78 74 65 6e 73 69 6f 6e 20 6e 65 76 65  U extension neve
27aa0 72 20 74 72 69 65 73 20 74 6f 20 75 70 64 61 74  r tries to updat
27ab0 65 20 61 20 64 61 74 61 62 61 73 65 0a 20 20 2a  e a database.  *
27ac0 2a 20 20 20 20 20 20 69 6e 20 77 61 6c 20 6d 6f  *      in wal mo
27ad0 64 65 2c 20 65 76 65 6e 20 69 66 20 74 68 65 20  de, even if the 
27ae0 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  first page of th
27af0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
27b00 68 61 73 0a 20 20 2a 2a 20 20 20 20 20 20 62 65  has.  **      be
27b10 65 6e 20 64 61 6d 61 67 65 64 2e 20 0a 20 20 2a  en damaged. .  *
27b20 2a 0a 20 20 2a 2a 20 20 20 62 29 20 69 66 20 74  *.  **   b) if t
27b30 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 64 6f  he *-wal file do
27b40 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 63 6c  es not exist, cl
27b50 61 69 6d 20 74 68 61 74 20 69 74 20 64 6f 65 73  aim that it does
27b60 20 61 6e 79 77 61 79 2c 0a 20 20 2a 2a 20 20 20   anyway,.  **   
27b70 20 20 20 63 61 75 73 69 6e 67 20 53 51 4c 69 74     causing SQLit
27b80 65 20 74 6f 20 63 61 6c 6c 20 78 4f 70 65 6e 28  e to call xOpen(
27b90 29 20 74 6f 20 6f 70 65 6e 20 69 74 2e 20 54 68  ) to open it. Th
27ba0 69 73 20 63 61 6c 6c 20 77 69 6c 6c 20 61 6c 73  is call will als
27bb0 6f 0a 20 20 2a 2a 20 20 20 20 20 20 62 65 20 69  o.  **      be i
27bc0 6e 74 65 72 63 65 70 74 65 64 20 28 73 65 65 20  ntercepted (see 
27bd0 74 68 65 20 72 62 75 56 66 73 4f 70 65 6e 28 29  the rbuVfsOpen()
27be0 20 66 75 6e 63 74 69 6f 6e 29 20 61 6e 64 20 74   function) and t
27bf0 68 65 20 2a 2d 6f 61 6c 0a 20 20 2a 2a 20 20 20  he *-oal.  **   
27c00 20 20 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 69     file opened i
27c10 6e 73 74 65 61 64 2e 0a 20 20 2a 2f 0a 20 20 69  nstead..  */.  i
27c20 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
27c30 20 26 26 20 66 6c 61 67 73 3d 3d 53 51 4c 49 54   && flags==SQLIT
27c40 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 20  E_ACCESS_EXISTS 
27c50 29 7b 0a 20 20 20 20 72 62 75 5f 66 69 6c 65 20  ){.    rbu_file 
27c60 2a 70 44 62 20 3d 20 72 62 75 46 69 6e 64 4d 61  *pDb = rbuFindMa
27c70 69 6e 64 62 28 70 52 62 75 56 66 73 2c 20 7a 50  indb(pRbuVfs, zP
27c80 61 74 68 2c 20 31 29 3b 0a 20 20 20 20 69 66 28  ath, 1);.    if(
27c90 20 70 44 62 20 26 26 20 70 44 62 2d 3e 70 52 62   pDb && pDb->pRb
27ca0 75 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53  u->eStage==RBU_S
27cb0 54 41 47 45 5f 4f 41 4c 20 29 7b 0a 20 20 20 20  TAGE_OAL ){.    
27cc0 20 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e 70    assert( pDb->p
27cd0 52 62 75 20 29 3b 0a 20 20 20 20 20 20 69 66 28  Rbu );.      if(
27ce0 20 2a 70 52 65 73 4f 75 74 20 29 7b 0a 20 20 20   *pResOut ){.   
27cf0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
27d00 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 20 20  _CANTOPEN;.     
27d10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
27d20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a  sqlite3_int64 sz
27d30 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63   = 0;.        rc
27d40 20 3d 20 72 62 75 56 66 73 46 69 6c 65 53 69 7a   = rbuVfsFileSiz
27d50 65 28 26 70 44 62 2d 3e 62 61 73 65 2c 20 26 73  e(&pDb->base, &s
27d60 7a 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 52 65  z);.        *pRe
27d70 73 4f 75 74 20 3d 20 28 73 7a 3e 30 29 3b 0a 20  sOut = (sz>0);. 
27d80 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
27d90 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
27da0 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 75 6c 61 74 65  ../*.** Populate
27db0 20 62 75 66 66 65 72 20 7a 4f 75 74 20 77 69 74   buffer zOut wit
27dc0 68 20 74 68 65 20 66 75 6c 6c 20 63 61 6e 6f 6e  h the full canon
27dd0 69 63 61 6c 20 70 61 74 68 6e 61 6d 65 20 63 6f  ical pathname co
27de0 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74  rresponding.** t
27df0 6f 20 74 68 65 20 70 61 74 68 6e 61 6d 65 20 69  o the pathname i
27e00 6e 20 7a 50 61 74 68 2e 20 7a 4f 75 74 20 69 73  n zPath. zOut is
27e10 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 70   guaranteed to p
27e20 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72  oint to a buffer
27e30 0a 2a 2a 20 6f 66 20 61 74 20 6c 65 61 73 74 20  .** of at least 
27e40 28 44 45 56 53 59 4d 5f 4d 41 58 5f 50 41 54 48  (DEVSYM_MAX_PATH
27e50 4e 41 4d 45 2b 31 29 20 62 79 74 65 73 2e 0a 2a  NAME+1) bytes..*
27e60 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62 75  /.static int rbu
27e70 56 66 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28  VfsFullPathname(
27e80 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
27e90 70 56 66 73 2c 20 0a 20 20 63 6f 6e 73 74 20 63  pVfs, .  const c
27ea0 68 61 72 20 2a 7a 50 61 74 68 2c 20 0a 20 20 69  har *zPath, .  i
27eb0 6e 74 20 6e 4f 75 74 2c 20 0a 20 20 63 68 61 72  nt nOut, .  char
27ec0 20 2a 7a 4f 75 74 0a 29 7b 0a 20 20 73 71 6c 69   *zOut.){.  sqli
27ed0 74 65 33 5f 76 66 73 20 2a 70 52 65 61 6c 56 66  te3_vfs *pRealVf
27ee0 73 20 3d 20 28 28 72 62 75 5f 76 66 73 2a 29 70  s = ((rbu_vfs*)p
27ef0 56 66 73 29 2d 3e 70 52 65 61 6c 56 66 73 3b 0a  Vfs)->pRealVfs;.
27f00 20 20 72 65 74 75 72 6e 20 70 52 65 61 6c 56 66    return pRealVf
27f10 73 2d 3e 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65  s->xFullPathname
27f20 28 70 52 65 61 6c 56 66 73 2c 20 7a 50 61 74 68  (pRealVfs, zPath
27f30 2c 20 6e 4f 75 74 2c 20 7a 4f 75 74 29 3b 0a 7d  , nOut, zOut);.}
27f40 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
27f50 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e  _OMIT_LOAD_EXTEN
27f60 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  SION./*.** Open 
27f70 74 68 65 20 64 79 6e 61 6d 69 63 20 6c 69 62 72  the dynamic libr
27f80 61 72 79 20 6c 6f 63 61 74 65 64 20 61 74 20 7a  ary located at z
27f90 50 61 74 68 20 61 6e 64 20 72 65 74 75 72 6e 20  Path and return 
27fa0 61 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61  a handle..*/.sta
27fb0 74 69 63 20 76 6f 69 64 20 2a 72 62 75 56 66 73  tic void *rbuVfs
27fc0 44 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76  DlOpen(sqlite3_v
27fd0 66 73 20 2a 70 56 66 73 2c 20 63 6f 6e 73 74 20  fs *pVfs, const 
27fe0 63 68 61 72 20 2a 7a 50 61 74 68 29 7b 0a 20 20  char *zPath){.  
27ff0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 52 65  sqlite3_vfs *pRe
28000 61 6c 56 66 73 20 3d 20 28 28 72 62 75 5f 76 66  alVfs = ((rbu_vf
28010 73 2a 29 70 56 66 73 29 2d 3e 70 52 65 61 6c 56  s*)pVfs)->pRealV
28020 66 73 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65  fs;.  return pRe
28030 61 6c 56 66 73 2d 3e 78 44 6c 4f 70 65 6e 28 70  alVfs->xDlOpen(p
28040 52 65 61 6c 56 66 73 2c 20 7a 50 61 74 68 29 3b  RealVfs, zPath);
28050 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 75 6c 61  .}../*.** Popula
28060 74 65 20 74 68 65 20 62 75 66 66 65 72 20 7a 45  te the buffer zE
28070 72 72 4d 73 67 20 28 73 69 7a 65 20 6e 42 79 74  rrMsg (size nByt
28080 65 20 62 79 74 65 73 29 20 77 69 74 68 20 61 20  e bytes) with a 
28090 68 75 6d 61 6e 20 72 65 61 64 61 62 6c 65 0a 2a  human readable.*
280a0 2a 20 75 74 66 2d 38 20 73 74 72 69 6e 67 20 64  * utf-8 string d
280b0 65 73 63 72 69 62 69 6e 67 20 74 68 65 20 6d 6f  escribing the mo
280c0 73 74 20 72 65 63 65 6e 74 20 65 72 72 6f 72 20  st recent error 
280d0 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 73 73 6f  encountered asso
280e0 63 69 61 74 65 64 20 0a 2a 2a 20 77 69 74 68 20  ciated .** with 
280f0 64 79 6e 61 6d 69 63 20 6c 69 62 72 61 72 69 65  dynamic librarie
28100 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
28110 64 20 72 62 75 56 66 73 44 6c 45 72 72 6f 72 28  d rbuVfsDlError(
28120 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
28130 73 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 63 68  s, int nByte, ch
28140 61 72 20 2a 7a 45 72 72 4d 73 67 29 7b 0a 20 20  ar *zErrMsg){.  
28150 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 52 65  sqlite3_vfs *pRe
28160 61 6c 56 66 73 20 3d 20 28 28 72 62 75 5f 76 66  alVfs = ((rbu_vf
28170 73 2a 29 70 56 66 73 29 2d 3e 70 52 65 61 6c 56  s*)pVfs)->pRealV
28180 66 73 3b 0a 20 20 70 52 65 61 6c 56 66 73 2d 3e  fs;.  pRealVfs->
28190 78 44 6c 45 72 72 6f 72 28 70 52 65 61 6c 56 66  xDlError(pRealVf
281a0 73 2c 20 6e 42 79 74 65 2c 20 7a 45 72 72 4d 73  s, nByte, zErrMs
281b0 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  g);.}../*.** Ret
281c0 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
281d0 20 74 68 65 20 73 79 6d 62 6f 6c 20 7a 53 79 6d   the symbol zSym
281e0 62 6f 6c 20 69 6e 20 74 68 65 20 64 79 6e 61 6d  bol in the dynam
281f0 69 63 20 6c 69 62 72 61 72 79 20 70 48 61 6e 64  ic library pHand
28200 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  le..*/.static vo
28210 69 64 20 28 2a 72 62 75 56 66 73 44 6c 53 79 6d  id (*rbuVfsDlSym
28220 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
28230 2a 70 56 66 73 2c 20 0a 20 20 76 6f 69 64 20 2a  *pVfs, .  void *
28240 70 41 72 67 2c 20 0a 20 20 63 6f 6e 73 74 20 63  pArg, .  const c
28250 68 61 72 20 2a 7a 53 79 6d 0a 29 29 28 76 6f 69  har *zSym.))(voi
28260 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  d){.  sqlite3_vf
28270 73 20 2a 70 52 65 61 6c 56 66 73 20 3d 20 28 28  s *pRealVfs = ((
28280 72 62 75 5f 76 66 73 2a 29 70 56 66 73 29 2d 3e  rbu_vfs*)pVfs)->
28290 70 52 65 61 6c 56 66 73 3b 0a 20 20 72 65 74 75  pRealVfs;.  retu
282a0 72 6e 20 70 52 65 61 6c 56 66 73 2d 3e 78 44 6c  rn pRealVfs->xDl
282b0 53 79 6d 28 70 52 65 61 6c 56 66 73 2c 20 70 41  Sym(pRealVfs, pA
282c0 72 67 2c 20 7a 53 79 6d 29 3b 0a 7d 0a 0a 2f 2a  rg, zSym);.}../*
282d0 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 64 79  .** Close the dy
282e0 6e 61 6d 69 63 20 6c 69 62 72 61 72 79 20 68 61  namic library ha
282f0 6e 64 6c 65 20 70 48 61 6e 64 6c 65 2e 0a 2a 2f  ndle pHandle..*/
28300 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75  .static void rbu
28310 56 66 73 44 6c 43 6c 6f 73 65 28 73 71 6c 69 74  VfsDlClose(sqlit
28320 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 76 6f  e3_vfs *pVfs, vo
28330 69 64 20 2a 70 48 61 6e 64 6c 65 29 7b 0a 20 20  id *pHandle){.  
28340 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 52 65  sqlite3_vfs *pRe
28350 61 6c 56 66 73 20 3d 20 28 28 72 62 75 5f 76 66  alVfs = ((rbu_vf
28360 73 2a 29 70 56 66 73 29 2d 3e 70 52 65 61 6c 56  s*)pVfs)->pRealV
28370 66 73 3b 0a 20 20 70 52 65 61 6c 56 66 73 2d 3e  fs;.  pRealVfs->
28380 78 44 6c 43 6c 6f 73 65 28 70 52 65 61 6c 56 66  xDlClose(pRealVf
28390 73 2c 20 70 48 61 6e 64 6c 65 29 3b 0a 7d 0a 23  s, pHandle);.}.#
283a0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
283b0 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
283c0 49 4f 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 50 6f  ION */../*.** Po
283d0 70 75 6c 61 74 65 20 74 68 65 20 62 75 66 66 65  pulate the buffe
283e0 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  r pointed to by 
283f0 7a 42 75 66 4f 75 74 20 77 69 74 68 20 6e 42 79  zBufOut with nBy
28400 74 65 20 62 79 74 65 73 20 6f 66 20 0a 2a 2a 20  te bytes of .** 
28410 72 61 6e 64 6f 6d 20 64 61 74 61 2e 0a 2a 2f 0a  random data..*/.
28420 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 56 66  static int rbuVf
28430 73 52 61 6e 64 6f 6d 6e 65 73 73 28 73 71 6c 69  sRandomness(sqli
28440 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69  te3_vfs *pVfs, i
28450 6e 74 20 6e 42 79 74 65 2c 20 63 68 61 72 20 2a  nt nByte, char *
28460 7a 42 75 66 4f 75 74 29 7b 0a 20 20 73 71 6c 69  zBufOut){.  sqli
28470 74 65 33 5f 76 66 73 20 2a 70 52 65 61 6c 56 66  te3_vfs *pRealVf
28480 73 20 3d 20 28 28 72 62 75 5f 76 66 73 2a 29 70  s = ((rbu_vfs*)p
28490 56 66 73 29 2d 3e 70 52 65 61 6c 56 66 73 3b 0a  Vfs)->pRealVfs;.
284a0 20 20 72 65 74 75 72 6e 20 70 52 65 61 6c 56 66    return pRealVf
284b0 73 2d 3e 78 52 61 6e 64 6f 6d 6e 65 73 73 28 70  s->xRandomness(p
284c0 52 65 61 6c 56 66 73 2c 20 6e 42 79 74 65 2c 20  RealVfs, nByte, 
284d0 7a 42 75 66 4f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a  zBufOut);.}../*.
284e0 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 6e 4d 69  ** Sleep for nMi
284f0 63 72 6f 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73  cro microseconds
28500 2e 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  . Return the num
28510 62 65 72 20 6f 66 20 6d 69 63 72 6f 73 65 63 6f  ber of microseco
28520 6e 64 73 20 0a 2a 2a 20 61 63 74 75 61 6c 6c 79  nds .** actually
28530 20 73 6c 65 70 74 2e 0a 2a 2f 0a 73 74 61 74 69   slept..*/.stati
28540 63 20 69 6e 74 20 72 62 75 56 66 73 53 6c 65 65  c int rbuVfsSlee
28550 70 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  p(sqlite3_vfs *p
28560 56 66 73 2c 20 69 6e 74 20 6e 4d 69 63 72 6f 29  Vfs, int nMicro)
28570 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  {.  sqlite3_vfs 
28580 2a 70 52 65 61 6c 56 66 73 20 3d 20 28 28 72 62  *pRealVfs = ((rb
28590 75 5f 76 66 73 2a 29 70 56 66 73 29 2d 3e 70 52  u_vfs*)pVfs)->pR
285a0 65 61 6c 56 66 73 3b 0a 20 20 72 65 74 75 72 6e  ealVfs;.  return
285b0 20 70 52 65 61 6c 56 66 73 2d 3e 78 53 6c 65 65   pRealVfs->xSlee
285c0 70 28 70 52 65 61 6c 56 66 73 2c 20 6e 4d 69 63  p(pRealVfs, nMic
285d0 72 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ro);.}../*.** Re
285e0 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74  turn the current
285f0 20 74 69 6d 65 20 61 73 20 61 20 4a 75 6c 69 61   time as a Julia
28600 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 69 6e 20  n Day number in 
28610 2a 70 54 69 6d 65 4f 75 74 2e 0a 2a 2f 0a 73 74  *pTimeOut..*/.st
28620 61 74 69 63 20 69 6e 74 20 72 62 75 56 66 73 43  atic int rbuVfsC
28630 75 72 72 65 6e 74 54 69 6d 65 28 73 71 6c 69 74  urrentTime(sqlit
28640 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 64 6f  e3_vfs *pVfs, do
28650 75 62 6c 65 20 2a 70 54 69 6d 65 4f 75 74 29 7b  uble *pTimeOut){
28660 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
28670 70 52 65 61 6c 56 66 73 20 3d 20 28 28 72 62 75  pRealVfs = ((rbu
28680 5f 76 66 73 2a 29 70 56 66 73 29 2d 3e 70 52 65  _vfs*)pVfs)->pRe
28690 61 6c 56 66 73 3b 0a 20 20 72 65 74 75 72 6e 20  alVfs;.  return 
286a0 70 52 65 61 6c 56 66 73 2d 3e 78 43 75 72 72 65  pRealVfs->xCurre
286b0 6e 74 54 69 6d 65 28 70 52 65 61 6c 56 66 73 2c  ntTime(pRealVfs,
286c0 20 70 54 69 6d 65 4f 75 74 29 3b 0a 7d 0a 0a 2f   pTimeOut);.}../
286d0 2a 0a 2a 2a 20 4e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  *.** No-op..*/.s
286e0 74 61 74 69 63 20 69 6e 74 20 72 62 75 56 66 73  tatic int rbuVfs
286f0 47 65 74 4c 61 73 74 45 72 72 6f 72 28 73 71 6c  GetLastError(sql
28700 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
28710 69 6e 74 20 61 2c 20 63 68 61 72 20 2a 62 29 7b  int a, char *b){
28720 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
28730 2f 2a 0a 2a 2a 20 44 65 72 65 67 69 73 74 65 72  /*.** Deregister
28740 20 61 6e 64 20 64 65 73 74 72 6f 79 20 61 6e 20   and destroy an 
28750 52 42 55 20 76 66 73 20 63 72 65 61 74 65 64 20  RBU vfs created 
28760 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20 63 61  by an earlier ca
28770 6c 6c 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33  ll to.** sqlite3
28780 72 62 75 5f 63 72 65 61 74 65 5f 76 66 73 28 29  rbu_create_vfs()
28790 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
287a0 33 72 62 75 5f 64 65 73 74 72 6f 79 5f 76 66 73  3rbu_destroy_vfs
287b0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61  (const char *zNa
287c0 6d 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  me){.  sqlite3_v
287d0 66 73 20 2a 70 56 66 73 20 3d 20 73 71 6c 69 74  fs *pVfs = sqlit
287e0 65 33 5f 76 66 73 5f 66 69 6e 64 28 7a 4e 61 6d  e3_vfs_find(zNam
287f0 65 29 3b 0a 20 20 69 66 28 20 70 56 66 73 20 26  e);.  if( pVfs &
28800 26 20 70 56 66 73 2d 3e 78 4f 70 65 6e 3d 3d 72  & pVfs->xOpen==r
28810 62 75 56 66 73 4f 70 65 6e 20 29 7b 0a 20 20 20  buVfsOpen ){.   
28820 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66   sqlite3_mutex_f
28830 72 65 65 28 28 28 72 62 75 5f 76 66 73 2a 29 70  ree(((rbu_vfs*)p
28840 56 66 73 29 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Vfs)->mutex);.  
28850 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 75 6e    sqlite3_vfs_un
28860 72 65 67 69 73 74 65 72 28 70 56 66 73 29 3b 0a  register(pVfs);.
28870 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
28880 28 70 56 66 73 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  (pVfs);.  }.}../
28890 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 6e 20 52  *.** Create an R
288a0 42 55 20 56 46 53 20 6e 61 6d 65 64 20 7a 4e 61  BU VFS named zNa
288b0 6d 65 20 74 68 61 74 20 61 63 63 65 73 73 65 73  me that accesses
288c0 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
288d0 66 69 6c 65 2d 73 79 73 74 65 6d 0a 2a 2a 20 76  file-system.** v
288e0 69 61 20 65 78 69 73 74 69 6e 67 20 56 46 53 20  ia existing VFS 
288f0 7a 50 61 72 65 6e 74 2e 20 54 68 65 20 6e 65 77  zParent. The new
28900 20 6f 62 6a 65 63 74 20 69 73 20 72 65 67 69 73   object is regis
28910 74 65 72 65 64 20 61 73 20 61 20 6e 6f 6e 2d 64  tered as a non-d
28920 65 66 61 75 6c 74 0a 2a 2a 20 56 46 53 20 77 69  efault.** VFS wi
28930 74 68 20 53 51 4c 69 74 65 20 62 65 66 6f 72 65  th SQLite before
28940 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69   returning..*/.i
28950 6e 74 20 73 71 6c 69 74 65 33 72 62 75 5f 63 72  nt sqlite3rbu_cr
28960 65 61 74 65 5f 76 66 73 28 63 6f 6e 73 74 20 63  eate_vfs(const c
28970 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73  har *zName, cons
28980 74 20 63 68 61 72 20 2a 7a 50 61 72 65 6e 74 29  t char *zParent)
28990 7b 0a 0a 20 20 2f 2a 20 54 65 6d 70 6c 61 74 65  {..  /* Template
289a0 20 66 6f 72 20 56 46 53 20 2a 2f 0a 20 20 73 74   for VFS */.  st
289b0 61 74 69 63 20 73 71 6c 69 74 65 33 5f 76 66 73  atic sqlite3_vfs
289c0 20 76 66 73 5f 74 65 6d 70 6c 61 74 65 20 3d 20   vfs_template = 
289d0 7b 0a 20 20 20 20 31 2c 20 20 20 20 20 20 20 20  {.    1,        
289e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
289f0 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20      /* iVersion 
28a00 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20  */.    0,       
28a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a20 20 20 20 20 20 2f 2a 20 73 7a 4f 73 46 69 6c 65       /* szOsFile
28a30 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20   */.    0,      
28a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a50 20 20 20 20 20 20 2f 2a 20 6d 78 50 61 74 68 6e        /* mxPathn
28a60 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20  ame */.    0,   
28a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a80 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 78           /* pNex
28a90 74 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20  t */.    0,     
28aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ab0 20 20 20 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20         /* zName 
28ac0 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20  */.    0,       
28ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ae0 20 20 20 20 20 2f 2a 20 70 41 70 70 44 61 74 61       /* pAppData
28af0 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 4f 70   */.    rbuVfsOp
28b00 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  en,             
28b10 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2a        /* xOpen *
28b20 2f 0a 20 20 20 20 72 62 75 56 66 73 44 65 6c 65  /.    rbuVfsDele
28b30 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
28b40 20 20 20 20 2f 2a 20 78 44 65 6c 65 74 65 20 2a      /* xDelete *
28b50 2f 0a 20 20 20 20 72 62 75 56 66 73 41 63 63 65  /.    rbuVfsAcce
28b60 73 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ss,             
28b70 20 20 20 20 2f 2a 20 78 41 63 63 65 73 73 20 2a      /* xAccess *
28b80 2f 0a 20 20 20 20 72 62 75 56 66 73 46 75 6c 6c  /.    rbuVfsFull
28b90 50 61 74 68 6e 61 6d 65 2c 20 20 20 20 20 20 20  Pathname,       
28ba0 20 20 20 20 2f 2a 20 78 46 75 6c 6c 50 61 74 68      /* xFullPath
28bb0 6e 61 6d 65 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  name */..#ifndef
28bc0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41   SQLITE_OMIT_LOA
28bd0 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 20 20  D_EXTENSION.    
28be0 72 62 75 56 66 73 44 6c 4f 70 65 6e 2c 20 20 20  rbuVfsDlOpen,   
28bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28c00 20 78 44 6c 4f 70 65 6e 20 2a 2f 0a 20 20 20 20   xDlOpen */.    
28c10 72 62 75 56 66 73 44 6c 45 72 72 6f 72 2c 20 20  rbuVfsDlError,  
28c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28c30 20 78 44 6c 45 72 72 6f 72 20 2a 2f 0a 20 20 20   xDlError */.   
28c40 20 72 62 75 56 66 73 44 6c 53 79 6d 2c 20 20 20   rbuVfsDlSym,   
28c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28c60 2a 20 78 44 6c 53 79 6d 20 2a 2f 0a 20 20 20 20  * xDlSym */.    
28c70 72 62 75 56 66 73 44 6c 43 6c 6f 73 65 2c 20 20  rbuVfsDlClose,  
28c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28c90 20 78 44 6c 43 6c 6f 73 65 20 2a 2f 0a 23 65 6c   xDlClose */.#el
28ca0 73 65 0a 20 20 20 20 30 2c 20 30 2c 20 30 2c 20  se.    0, 0, 0, 
28cb0 30 2c 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 72  0,.#endif..    r
28cc0 62 75 56 66 73 52 61 6e 64 6f 6d 6e 65 73 73 2c  buVfsRandomness,
28cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28ce0 78 52 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f 0a 20  xRandomness */. 
28cf0 20 20 20 72 62 75 56 66 73 53 6c 65 65 70 2c 20     rbuVfsSleep, 
28d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d10 20 2f 2a 20 78 53 6c 65 65 70 20 2a 2f 0a 20 20   /* xSleep */.  
28d20 20 20 72 62 75 56 66 73 43 75 72 72 65 6e 74 54    rbuVfsCurrentT
28d30 69 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ime,            
28d40 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65 20  /* xCurrentTime 
28d50 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 47 65 74  */.    rbuVfsGet
28d60 4c 61 73 74 45 72 72 6f 72 2c 20 20 20 20 20 20  LastError,      
28d70 20 20 20 20 20 2f 2a 20 78 47 65 74 4c 61 73 74       /* xGetLast
28d80 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20 30 2c 20  Error */.    0, 
28d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28da0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
28db0 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 20  urrentTimeInt64 
28dc0 28 76 65 72 73 69 6f 6e 20 32 29 20 2a 2f 0a 20  (version 2) */. 
28dd0 20 20 20 30 2c 20 30 2c 20 30 20 20 20 20 20 20     0, 0, 0      
28de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28df0 20 2f 2a 20 55 6e 69 6d 70 6c 65 6d 65 6e 74 65   /* Unimplemente
28e00 64 20 76 65 72 73 69 6f 6e 20 33 20 6d 65 74 68  d version 3 meth
28e10 6f 64 73 20 2a 2f 0a 20 20 7d 3b 0a 0a 20 20 72  ods */.  };..  r
28e20 62 75 5f 76 66 73 20 2a 70 4e 65 77 20 3d 20 30  bu_vfs *pNew = 0
28e30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
28e40 2a 20 4e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65  * Newly allocate
28e50 64 20 56 46 53 20 2a 2f 0a 20 20 69 6e 74 20 72  d VFS */.  int r
28e60 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
28e70 20 73 69 7a 65 5f 74 20 6e 4e 61 6d 65 3b 0a 20   size_t nName;. 
28e80 20 73 69 7a 65 5f 74 20 6e 42 79 74 65 3b 0a 0a   size_t nByte;..
28e90 20 20 6e 4e 61 6d 65 20 3d 20 73 74 72 6c 65 6e    nName = strlen
28ea0 28 7a 4e 61 6d 65 29 3b 0a 20 20 6e 42 79 74 65  (zName);.  nByte
28eb0 20 3d 20 73 69 7a 65 6f 66 28 72 62 75 5f 76 66   = sizeof(rbu_vf
28ec0 73 29 20 2b 20 6e 4e 61 6d 65 20 2b 20 31 3b 0a  s) + nName + 1;.
28ed0 20 20 70 4e 65 77 20 3d 20 28 72 62 75 5f 76 66    pNew = (rbu_vf
28ee0 73 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  s*)sqlite3_mallo
28ef0 63 36 34 28 6e 42 79 74 65 29 3b 0a 20 20 69 66  c64(nByte);.  if
28f00 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( pNew==0 ){.   
28f10 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
28f20 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  EM;.  }else{.   
28f30 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 50   sqlite3_vfs *pP
28f40 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20  arent;          
28f50 20 2f 2a 20 50 61 72 65 6e 74 20 56 46 53 20 2a   /* Parent VFS *
28f60 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 4e 65  /.    memset(pNe
28f70 77 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a 20 20  w, 0, nByte);.  
28f80 20 20 70 50 61 72 65 6e 74 20 3d 20 73 71 6c 69    pParent = sqli
28f90 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 7a 50 61  te3_vfs_find(zPa
28fa0 72 65 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 70  rent);.    if( p
28fb0 50 61 72 65 6e 74 3d 3d 30 20 29 7b 0a 20 20 20  Parent==0 ){.   
28fc0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
28fd0 4f 54 46 4f 55 4e 44 3b 0a 20 20 20 20 7d 65 6c  OTFOUND;.    }el
28fe0 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  se{.      char *
28ff0 7a 53 70 61 63 65 3b 0a 20 20 20 20 20 20 6d 65  zSpace;.      me
29000 6d 63 70 79 28 26 70 4e 65 77 2d 3e 62 61 73 65  mcpy(&pNew->base
29010 2c 20 26 76 66 73 5f 74 65 6d 70 6c 61 74 65 2c  , &vfs_template,
29020 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f   sizeof(sqlite3_
29030 76 66 73 29 29 3b 0a 20 20 20 20 20 20 70 4e 65  vfs));.      pNe
29040 77 2d 3e 62 61 73 65 2e 6d 78 50 61 74 68 6e 61  w->base.mxPathna
29050 6d 65 20 3d 20 70 50 61 72 65 6e 74 2d 3e 6d 78  me = pParent->mx
29060 50 61 74 68 6e 61 6d 65 3b 0a 20 20 20 20 20 20  Pathname;.      
29070 70 4e 65 77 2d 3e 62 61 73 65 2e 73 7a 4f 73 46  pNew->base.szOsF
29080 69 6c 65 20 3d 20 73 69 7a 65 6f 66 28 72 62 75  ile = sizeof(rbu
29090 5f 66 69 6c 65 29 20 2b 20 70 50 61 72 65 6e 74  _file) + pParent
290a0 2d 3e 73 7a 4f 73 46 69 6c 65 3b 0a 20 20 20 20  ->szOsFile;.    
290b0 20 20 70 4e 65 77 2d 3e 70 52 65 61 6c 56 66 73    pNew->pRealVfs
290c0 20 3d 20 70 50 61 72 65 6e 74 3b 0a 20 20 20 20   = pParent;.    
290d0 20 20 70 4e 65 77 2d 3e 62 61 73 65 2e 7a 4e 61    pNew->base.zNa
290e0 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  me = (const char
290f0 2a 29 28 7a 53 70 61 63 65 20 3d 20 28 63 68 61  *)(zSpace = (cha
29100 72 2a 29 26 70 4e 65 77 5b 31 5d 29 3b 0a 20 20  r*)&pNew[1]);.  
29110 20 20 20 20 6d 65 6d 63 70 79 28 7a 53 70 61 63      memcpy(zSpac
29120 65 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29  e, zName, nName)
29130 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f  ;..      /* Allo
29140 63 61 74 65 20 74 68 65 20 6d 75 74 65 78 20 61  cate the mutex a
29150 6e 64 20 72 65 67 69 73 74 65 72 20 74 68 65 20  nd register the 
29160 6e 65 77 20 56 46 53 20 28 6e 6f 74 20 61 73 20  new VFS (not as 
29170 74 68 65 20 64 65 66 61 75 6c 74 29 20 2a 2f 0a  the default) */.
29180 20 20 20 20 20 20 70 4e 65 77 2d 3e 6d 75 74 65        pNew->mute
29190 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  x = sqlite3_mute
291a0 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  x_alloc(SQLITE_M
291b0 55 54 45 58 5f 52 45 43 55 52 53 49 56 45 29 3b  UTEX_RECURSIVE);
291c0 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d  .      if( pNew-
291d0 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20  >mutex==0 ){.   
291e0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
291f0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65  _NOMEM;.      }e
29200 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
29210 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65  = sqlite3_vfs_re
29220 67 69 73 74 65 72 28 26 70 4e 65 77 2d 3e 62 61  gister(&pNew->ba
29230 73 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  se, 0);.      }.
29240 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72      }..    if( r
29250 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
29260 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
29270 74 65 78 5f 66 72 65 65 28 70 4e 65 77 2d 3e 6d  tex_free(pNew->m
29280 75 74 65 78 29 3b 0a 20 20 20 20 20 20 73 71 6c  utex);.      sql
29290 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b  ite3_free(pNew);
292a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
292b0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
292c0 2a 20 43 6f 6e 66 69 67 75 72 65 20 74 68 65 20  * Configure the 
292d0 61 67 67 72 65 67 61 74 65 20 74 65 6d 70 20 66  aggregate temp f
292e0 69 6c 65 20 73 69 7a 65 20 6c 69 6d 69 74 20 66  ile size limit f
292f0 6f 72 20 74 68 69 73 20 52 42 55 20 68 61 6e 64  or this RBU hand
29300 6c 65 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 69  le..*/.sqlite3_i
29310 6e 74 36 34 20 73 71 6c 69 74 65 33 72 62 75 5f  nt64 sqlite3rbu_
29320 74 65 6d 70 5f 73 69 7a 65 5f 6c 69 6d 69 74 28  temp_size_limit(
29330 73 71 6c 69 74 65 33 72 62 75 20 2a 70 52 62 75  sqlite3rbu *pRbu
29340 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  , sqlite3_int64 
29350 6e 29 7b 0a 20 20 69 66 28 20 6e 3e 3d 30 20 29  n){.  if( n>=0 )
29360 7b 0a 20 20 20 20 70 52 62 75 2d 3e 73 7a 54 65  {.    pRbu->szTe
29370 6d 70 4c 69 6d 69 74 20 3d 20 6e 3b 0a 20 20 7d  mpLimit = n;.  }
29380 0a 20 20 72 65 74 75 72 6e 20 70 52 62 75 2d 3e  .  return pRbu->
29390 73 7a 54 65 6d 70 4c 69 6d 69 74 3b 0a 7d 0a 0a  szTempLimit;.}..
293a0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 71  sqlite3_int64 sq
293b0 6c 69 74 65 33 72 62 75 5f 74 65 6d 70 5f 73 69  lite3rbu_temp_si
293c0 7a 65 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70  ze(sqlite3rbu *p
293d0 52 62 75 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  Rbu){.  return p
293e0 52 62 75 2d 3e 73 7a 54 65 6d 70 3b 0a 7d 0a 0a  Rbu->szTemp;.}..
293f0 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
29400 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29410 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29420 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29430 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 23  ************/..#
29440 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
29450 64 28 53 51 4c 49 54 45 5f 43 4f 52 45 29 20 7c  d(SQLITE_CORE) |
29460 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
29470 5f 45 4e 41 42 4c 45 5f 52 42 55 29 20 2a 2f 0a  _ENABLE_RBU) */.