/ Hex Artifact Content
Login

Artifact cba23db39792175295b94ad0086825894b617921:


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 0a 2a 2a 20 53 77 61  ZE 16../*.** Swa
1070: 70 20 74 77 6f 20 6f 62 6a 65 63 74 73 20 6f 66  p two objects of
1080: 20 74 79 70 65 20 54 59 50 45 2e 0a 2a 2f 0a 23   type TYPE..*/.#
1090: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
10a0: 54 45 5f 41 4d 41 4c 47 41 4d 41 54 49 4f 4e 29  TE_AMALGAMATION)
10b0: 0a 23 20 64 65 66 69 6e 65 20 53 57 41 50 28 54  .# define SWAP(T
10c0: 59 50 45 2c 41 2c 42 29 20 7b 54 59 50 45 20 74  YPE,A,B) {TYPE t
10d0: 3d 41 3b 20 41 3d 42 3b 20 42 3d 74 3b 7d 0a 23  =A; A=B; B=t;}.#
10e0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
10f0: 20 72 62 75 5f 73 74 61 74 65 20 74 61 62 6c 65   rbu_state table
1100: 20 69 73 20 75 73 65 64 20 74 6f 20 73 61 76 65   is used to save
1110: 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 61 20   the state of a 
1120: 70 61 72 74 69 61 6c 6c 79 20 61 70 70 6c 69 65  partially applie
1130: 64 0a 2a 2a 20 75 70 64 61 74 65 20 73 6f 20 74  d.** update so t
1140: 68 61 74 20 69 74 20 63 61 6e 20 62 65 20 72 65  hat it can be re
1150: 73 75 6d 65 64 20 6c 61 74 65 72 2e 20 54 68 65  sumed later. The
1160: 20 74 61 62 6c 65 20 63 6f 6e 73 69 73 74 73 20   table consists 
1170: 6f 66 20 69 6e 74 65 67 65 72 0a 2a 2a 20 6b 65  of integer.** ke
1180: 79 73 20 6d 61 70 70 65 64 20 74 6f 20 76 61 6c  ys mapped to val
1190: 75 65 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ues as follows:.
11a0: 2a 2a 0a 2a 2a 20 52 42 55 5f 53 54 41 54 45 5f  **.** RBU_STATE_
11b0: 53 54 41 47 45 3a 0a 2a 2a 20 20 20 4d 61 79 20  STAGE:.**   May 
11c0: 62 65 20 73 65 74 20 74 6f 20 69 6e 74 65 67 65  be set to intege
11d0: 72 20 76 61 6c 75 65 73 20 31 2c 20 32 2c 20 34  r values 1, 2, 4
11e0: 20 6f 72 20 35 2e 20 41 73 20 66 6f 6c 6c 6f 77   or 5. As follow
11f0: 73 3a 0a 2a 2a 20 20 20 20 20 20 20 31 3a 20 74  s:.**       1: t
1200: 68 65 20 2a 2d 72 62 75 20 66 69 6c 65 20 69 73  he *-rbu file is
1210: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
1220: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a   construction..*
1230: 2a 20 20 20 20 20 20 20 32 3a 20 74 68 65 20 2a  *       2: the *
1240: 2d 72 62 75 20 66 69 6c 65 20 68 61 73 20 62 65  -rbu file has be
1250: 65 6e 20 63 6f 6e 73 74 72 75 63 74 65 64 2c 20  en constructed, 
1260: 62 75 74 20 6e 6f 74 20 79 65 74 20 6d 6f 76 65  but not yet move
1270: 64 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 74  d .**          t
1280: 6f 20 74 68 65 20 2a 2d 77 61 6c 20 70 61 74 68  o the *-wal path
1290: 2e 0a 2a 2a 20 20 20 20 20 20 20 34 3a 20 74 68  ..**       4: th
12a0: 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 73 20  e checkpoint is 
12b0: 75 6e 64 65 72 77 61 79 2e 0a 2a 2a 20 20 20 20  underway..**    
12c0: 20 20 20 35 3a 20 74 68 65 20 72 62 75 20 75 70     5: the rbu up
12d0: 64 61 74 65 20 68 61 73 20 62 65 65 6e 20 63 68  date has been ch
12e0: 65 63 6b 70 6f 69 6e 74 65 64 2e 0a 2a 2a 0a 2a  eckpointed..**.*
12f0: 2a 20 52 42 55 5f 53 54 41 54 45 5f 54 42 4c 3a  * RBU_STATE_TBL:
1300: 0a 2a 2a 20 20 20 4f 6e 6c 79 20 76 61 6c 69 64  .**   Only valid
1310: 20 69 66 20 53 54 41 47 45 3d 3d 31 2e 20 54 68   if STAGE==1. Th
1320: 65 20 74 61 72 67 65 74 20 64 61 74 61 62 61 73  e target databas
1330: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
1340: 62 6c 65 20 0a 2a 2a 20 20 20 63 75 72 72 65 6e  ble .**   curren
1350: 74 6c 79 20 62 65 69 6e 67 20 77 72 69 74 74 65  tly being writte
1360: 6e 2e 0a 2a 2a 0a 2a 2a 20 52 42 55 5f 53 54 41  n..**.** RBU_STA
1370: 54 45 5f 49 44 58 3a 0a 2a 2a 20 20 20 4f 6e 6c  TE_IDX:.**   Onl
1380: 79 20 76 61 6c 69 64 20 69 66 20 53 54 41 47 45  y valid if STAGE
1390: 3d 3d 31 2e 20 54 68 65 20 74 61 72 67 65 74 20  ==1. The target 
13a0: 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 6f 66  database name of
13b0: 20 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20 20   the index .**  
13c0: 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67   currently being
13d0: 20 77 72 69 74 74 65 6e 2c 20 6f 72 20 4e 55 4c   written, or NUL
13e0: 4c 20 69 66 20 74 68 65 20 6d 61 69 6e 20 74 61  L if the main ta
13f0: 62 6c 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ble is currently
1400: 20 62 65 69 6e 67 0a 2a 2a 20 20 20 75 70 64 61   being.**   upda
1410: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 42 55 5f 53  ted..**.** RBU_S
1420: 54 41 54 45 5f 52 4f 57 3a 0a 2a 2a 20 20 20 4f  TATE_ROW:.**   O
1430: 6e 6c 79 20 76 61 6c 69 64 20 69 66 20 53 54 41  nly valid if STA
1440: 47 45 3d 3d 31 2e 20 4e 75 6d 62 65 72 20 6f 66  GE==1. Number of
1450: 20 72 6f 77 73 20 61 6c 72 65 61 64 79 20 70 72   rows already pr
1460: 6f 63 65 73 73 65 64 20 66 6f 72 20 74 68 65 20  ocessed for the 
1470: 63 75 72 72 65 6e 74 0a 2a 2a 20 20 20 74 61 62  current.**   tab
1480: 6c 65 2f 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20  le/index..**.** 
1490: 52 42 55 5f 53 54 41 54 45 5f 50 52 4f 47 52 45  RBU_STATE_PROGRE
14a0: 53 53 3a 0a 2a 2a 20 20 20 54 72 62 75 6c 20 6e  SS:.**   Trbul n
14b0: 75 6d 62 65 72 20 6f 66 20 73 71 6c 69 74 65 33  umber of sqlite3
14c0: 72 62 75 5f 73 74 65 70 28 29 20 63 61 6c 6c 73  rbu_step() calls
14d0: 20 6d 61 64 65 20 73 6f 20 66 61 72 20 61 73 20   made so far as 
14e0: 70 61 72 74 20 6f 66 20 74 68 69 73 0a 2a 2a 20  part of this.** 
14f0: 20 20 72 62 75 20 75 70 64 61 74 65 2e 0a 2a 2a    rbu update..**
1500: 0a 2a 2a 20 52 42 55 5f 53 54 41 54 45 5f 43 4b  .** RBU_STATE_CK
1510: 50 54 3a 0a 2a 2a 20 20 20 56 61 6c 69 64 20 69  PT:.**   Valid i
1520: 66 20 53 54 41 47 45 3d 3d 34 2e 20 54 68 65 20  f STAGE==4. The 
1530: 36 34 2d 62 69 74 20 63 68 65 63 6b 73 75 6d 20  64-bit checksum 
1540: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1550: 74 68 65 20 77 61 6c 2d 69 6e 64 65 78 0a 2a 2a  the wal-index.**
1560: 20 20 20 68 65 61 64 65 72 20 63 72 65 61 74 65     header create
1570: 64 20 62 79 20 72 65 63 6f 76 65 72 69 6e 67 20  d by recovering 
1580: 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 2e 20  the *-wal file. 
1590: 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20  This is used to 
15a0: 64 65 74 65 63 74 0a 2a 2a 20 20 20 63 61 73 65  detect.**   case
15b0: 73 20 77 68 65 6e 20 61 6e 6f 74 68 65 72 20 63  s when another c
15c0: 6c 69 65 6e 74 20 61 70 70 65 6e 64 73 20 66 72  lient appends fr
15d0: 61 6d 65 73 20 74 6f 20 74 68 65 20 2a 2d 77 61  ames to the *-wa
15e0: 6c 20 66 69 6c 65 20 69 6e 20 74 68 65 0a 2a 2a  l file in the.**
15f0: 20 20 20 6d 69 64 64 6c 65 20 6f 66 20 61 6e 20     middle of an 
1600: 69 6e 63 72 65 6d 65 6e 74 61 6c 20 63 68 65 63  incremental chec
1610: 6b 70 6f 69 6e 74 20 28 61 6e 20 69 6e 63 72 65  kpoint (an incre
1620: 6d 65 6e 74 61 6c 20 63 68 65 63 6b 70 6f 69 6e  mental checkpoin
1630: 74 20 63 61 6e 6e 6f 74 0a 2a 2a 20 20 20 62 65  t cannot.**   be
1640: 20 63 6f 6e 74 69 6e 75 65 64 20 69 66 20 74 68   continued if th
1650: 69 73 20 68 61 70 70 65 6e 73 29 2e 0a 2a 2a 0a  is happens)..**.
1660: 2a 2a 20 52 42 55 5f 53 54 41 54 45 5f 43 4f 4f  ** RBU_STATE_COO
1670: 4b 49 45 3a 0a 2a 2a 20 20 20 56 61 6c 69 64 20  KIE:.**   Valid 
1680: 69 66 20 53 54 41 47 45 3d 3d 31 2e 20 54 68 65  if STAGE==1. The
1690: 20 63 75 72 72 65 6e 74 20 63 68 61 6e 67 65 2d   current change-
16a0: 63 6f 75 6e 74 65 72 20 63 6f 6f 6b 69 65 20 76  counter cookie v
16b0: 61 6c 75 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20  alue in the .** 
16c0: 20 20 74 61 72 67 65 74 20 64 62 20 66 69 6c 65    target db file
16d0: 2e 0a 2a 2a 0a 2a 2a 20 52 42 55 5f 53 54 41 54  ..**.** RBU_STAT
16e0: 45 5f 4f 41 4c 53 5a 3a 0a 2a 2a 20 20 20 56 61  E_OALSZ:.**   Va
16f0: 6c 69 64 20 69 66 20 53 54 41 47 45 3d 3d 31 2e  lid if STAGE==1.
1700: 20 54 68 65 20 73 69 7a 65 20 69 6e 20 62 79 74   The size in byt
1710: 65 73 20 6f 66 20 74 68 65 20 2a 2d 6f 61 6c 20  es of the *-oal 
1720: 66 69 6c 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  file..*/.#define
1730: 20 52 42 55 5f 53 54 41 54 45 5f 53 54 41 47 45   RBU_STATE_STAGE
1740: 20 20 20 20 20 20 20 20 31 0a 23 64 65 66 69 6e          1.#defin
1750: 65 20 52 42 55 5f 53 54 41 54 45 5f 54 42 4c 20  e RBU_STATE_TBL 
1760: 20 20 20 20 20 20 20 20 20 32 0a 23 64 65 66 69           2.#defi
1770: 6e 65 20 52 42 55 5f 53 54 41 54 45 5f 49 44 58  ne RBU_STATE_IDX
1780: 20 20 20 20 20 20 20 20 20 20 33 0a 23 64 65 66            3.#def
1790: 69 6e 65 20 52 42 55 5f 53 54 41 54 45 5f 52 4f  ine RBU_STATE_RO
17a0: 57 20 20 20 20 20 20 20 20 20 20 34 0a 23 64 65  W          4.#de
17b0: 66 69 6e 65 20 52 42 55 5f 53 54 41 54 45 5f 50  fine RBU_STATE_P
17c0: 52 4f 47 52 45 53 53 20 20 20 20 20 35 0a 23 64  ROGRESS     5.#d
17d0: 65 66 69 6e 65 20 52 42 55 5f 53 54 41 54 45 5f  efine RBU_STATE_
17e0: 43 4b 50 54 20 20 20 20 20 20 20 20 20 36 0a 23  CKPT         6.#
17f0: 64 65 66 69 6e 65 20 52 42 55 5f 53 54 41 54 45  define RBU_STATE
1800: 5f 43 4f 4f 4b 49 45 20 20 20 20 20 20 20 37 0a  _COOKIE       7.
1810: 23 64 65 66 69 6e 65 20 52 42 55 5f 53 54 41 54  #define RBU_STAT
1820: 45 5f 4f 41 4c 53 5a 20 20 20 20 20 20 20 20 38  E_OALSZ        8
1830: 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 53 54 41  .#define RBU_STA
1840: 54 45 5f 50 48 41 53 45 4f 4e 45 53 54 45 50 20  TE_PHASEONESTEP 
1850: 39 0a 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 53  9..#define RBU_S
1860: 54 41 47 45 5f 4f 41 4c 20 20 20 20 20 20 20 20  TAGE_OAL        
1870: 20 31 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 53   1.#define RBU_S
1880: 54 41 47 45 5f 4d 4f 56 45 20 20 20 20 20 20 20  TAGE_MOVE       
1890: 20 32 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 53   2.#define RBU_S
18a0: 54 41 47 45 5f 43 41 50 54 55 52 45 20 20 20 20  TAGE_CAPTURE    
18b0: 20 33 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 53   3.#define RBU_S
18c0: 54 41 47 45 5f 43 4b 50 54 20 20 20 20 20 20 20  TAGE_CKPT       
18d0: 20 34 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 53   4.#define RBU_S
18e0: 54 41 47 45 5f 44 4f 4e 45 20 20 20 20 20 20 20  TAGE_DONE       
18f0: 20 35 0a 0a 0a 23 64 65 66 69 6e 65 20 52 42 55   5...#define RBU
1900: 5f 43 52 45 41 54 45 5f 53 54 41 54 45 20 5c 0a  _CREATE_STATE \.
1910: 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20    "CREATE TABLE 
1920: 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20 25 73  IF NOT EXISTS %s
1930: 2e 72 62 75 5f 73 74 61 74 65 28 6b 20 49 4e 54  .rbu_state(k INT
1940: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
1950: 2c 20 76 29 22 0a 0a 74 79 70 65 64 65 66 20 73  , v)"..typedef s
1960: 74 72 75 63 74 20 52 62 75 46 72 61 6d 65 20 52  truct RbuFrame R
1970: 62 75 46 72 61 6d 65 3b 0a 74 79 70 65 64 65 66  buFrame;.typedef
1980: 20 73 74 72 75 63 74 20 52 62 75 4f 62 6a 49 74   struct RbuObjIt
1990: 65 72 20 52 62 75 4f 62 6a 49 74 65 72 3b 0a 74  er RbuObjIter;.t
19a0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 52 62  ypedef struct Rb
19b0: 75 53 74 61 74 65 20 52 62 75 53 74 61 74 65 3b  uState RbuState;
19c0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
19d0: 72 62 75 5f 76 66 73 20 72 62 75 5f 76 66 73 3b  rbu_vfs rbu_vfs;
19e0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
19f0: 72 62 75 5f 66 69 6c 65 20 72 62 75 5f 66 69 6c  rbu_file rbu_fil
1a00: 65 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  e;.typedef struc
1a10: 74 20 52 62 75 55 70 64 61 74 65 53 74 6d 74 20  t RbuUpdateStmt 
1a20: 52 62 75 55 70 64 61 74 65 53 74 6d 74 3b 0a 0a  RbuUpdateStmt;..
1a30: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
1a40: 49 54 45 5f 41 4d 41 4c 47 41 4d 41 54 49 4f 4e  ITE_AMALGAMATION
1a50: 29 0a 74 79 70 65 64 65 66 20 75 6e 73 69 67 6e  ).typedef unsign
1a60: 65 64 20 69 6e 74 20 75 33 32 3b 0a 74 79 70 65  ed int u32;.type
1a70: 64 65 66 20 75 6e 73 69 67 6e 65 64 20 73 68 6f  def unsigned sho
1a80: 72 74 20 75 31 36 3b 0a 74 79 70 65 64 65 66 20  rt u16;.typedef 
1a90: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 75 38  unsigned char u8
1aa0: 3b 0a 74 79 70 65 64 65 66 20 73 71 6c 69 74 65  ;.typedef sqlite
1ab0: 33 5f 69 6e 74 36 34 20 69 36 34 3b 0a 23 65 6e  3_int64 i64;.#en
1ac0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65  dif../*.** These
1ad0: 20 76 61 6c 75 65 73 20 6d 75 73 74 20 6d 61 74   values must mat
1ae0: 63 68 20 74 68 65 20 76 61 6c 75 65 73 20 64 65  ch the values de
1af0: 66 69 6e 65 64 20 69 6e 20 77 61 6c 2e 63 20 66  fined in wal.c f
1b00: 6f 72 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e  or the equivalen
1b10: 74 0a 2a 2a 20 6c 6f 63 6b 73 2e 20 54 68 65 73  t.** locks. Thes
1b20: 65 20 61 72 65 20 6e 6f 74 20 6d 61 67 69 63 20  e are not magic 
1b30: 6e 75 6d 62 65 72 73 20 61 73 20 74 68 65 79 20  numbers as they 
1b40: 61 72 65 20 70 61 72 74 20 6f 66 20 74 68 65 20  are part of the 
1b50: 53 51 4c 69 74 65 20 66 69 6c 65 0a 2a 2a 20 66  SQLite file.** f
1b60: 6f 72 6d 61 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e  ormat..*/.#defin
1b70: 65 20 57 41 4c 5f 4c 4f 43 4b 5f 57 52 49 54 45  e WAL_LOCK_WRITE
1b80: 20 20 30 0a 23 64 65 66 69 6e 65 20 57 41 4c 5f    0.#define WAL_
1b90: 4c 4f 43 4b 5f 43 4b 50 54 20 20 20 31 0a 23 64  LOCK_CKPT   1.#d
1ba0: 65 66 69 6e 65 20 57 41 4c 5f 4c 4f 43 4b 5f 52  efine WAL_LOCK_R
1bb0: 45 41 44 30 20 20 33 0a 0a 23 64 65 66 69 6e 65  EAD0  3..#define
1bc0: 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 52 42   SQLITE_FCNTL_RB
1bd0: 55 43 4e 54 20 20 20 20 35 31 34 39 32 31 36 0a  UCNT    5149216.
1be0: 0a 2f 2a 0a 2a 2a 20 41 20 73 74 72 75 63 74 75  ./*.** A structu
1bf0: 72 65 20 74 6f 20 73 74 6f 72 65 20 76 61 6c 75  re to store valu
1c00: 65 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  es read from the
1c10: 20 72 62 75 5f 73 74 61 74 65 20 74 61 62 6c 65   rbu_state table
1c20: 20 69 6e 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73   in memory..*/.s
1c30: 74 72 75 63 74 20 52 62 75 53 74 61 74 65 20 7b  truct RbuState {
1c40: 0a 20 20 69 6e 74 20 65 53 74 61 67 65 3b 0a 20  .  int eStage;. 
1c50: 20 63 68 61 72 20 2a 7a 54 62 6c 3b 0a 20 20 63   char *zTbl;.  c
1c60: 68 61 72 20 2a 7a 49 64 78 3b 0a 20 20 69 36 34  har *zIdx;.  i64
1c70: 20 69 57 61 6c 43 6b 73 75 6d 3b 0a 20 20 69 6e   iWalCksum;.  in
1c80: 74 20 6e 52 6f 77 3b 0a 20 20 69 36 34 20 6e 50  t nRow;.  i64 nP
1c90: 72 6f 67 72 65 73 73 3b 0a 20 20 75 33 32 20 69  rogress;.  u32 i
1ca0: 43 6f 6f 6b 69 65 3b 0a 20 20 69 36 34 20 69 4f  Cookie;.  i64 iO
1cb0: 61 6c 53 7a 3b 0a 20 20 69 36 34 20 6e 50 68 61  alSz;.  i64 nPha
1cc0: 73 65 4f 6e 65 53 74 65 70 3b 0a 7d 3b 0a 0a 73  seOneStep;.};..s
1cd0: 74 72 75 63 74 20 52 62 75 55 70 64 61 74 65 53  truct RbuUpdateS
1ce0: 74 6d 74 20 7b 0a 20 20 63 68 61 72 20 2a 7a 4d  tmt {.  char *zM
1cf0: 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
1d00: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20          /* Copy 
1d10: 6f 66 20 75 70 64 61 74 65 20 6d 61 73 6b 20 75  of update mask u
1d20: 73 65 64 20 77 69 74 68 20 70 55 70 64 61 74 65  sed with pUpdate
1d30: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
1d40: 6d 74 20 2a 70 55 70 64 61 74 65 3b 20 20 20 20  mt *pUpdate;    
1d50: 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 75 70        /* Last up
1d60: 64 61 74 65 20 73 74 61 74 65 6d 65 6e 74 20 28  date statement (
1d70: 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 52 62  or NULL) */.  Rb
1d80: 75 55 70 64 61 74 65 53 74 6d 74 20 2a 70 4e 65  uUpdateStmt *pNe
1d90: 78 74 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e  xt;.};../*.** An
1da0: 20 69 74 65 72 61 74 6f 72 20 6f 66 20 74 68 69   iterator of thi
1db0: 73 20 74 79 70 65 20 69 73 20 75 73 65 64 20 74  s type is used t
1dc0: 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
1dd0: 68 20 61 6c 6c 20 6f 62 6a 65 63 74 73 20 69 6e  h all objects in
1de0: 0a 2a 2a 20 74 68 65 20 74 61 72 67 65 74 20 64  .** the target d
1df0: 61 74 61 62 61 73 65 20 74 68 61 74 20 72 65 71  atabase that req
1e00: 75 69 72 65 20 75 70 64 61 74 69 6e 67 2e 20 46  uire updating. F
1e10: 6f 72 20 65 61 63 68 20 73 75 63 68 20 74 61 62  or each such tab
1e20: 6c 65 2c 20 74 68 65 0a 2a 2a 20 69 74 65 72 61  le, the.** itera
1e30: 74 6f 72 20 76 69 73 69 74 73 2c 20 69 6e 20 6f  tor visits, in o
1e40: 72 64 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  rder:.**.**     
1e50: 2a 20 74 68 65 20 74 61 62 6c 65 20 69 74 73 65  * the table itse
1e60: 6c 66 2c 20 0a 2a 2a 20 20 20 20 20 2a 20 65 61  lf, .**     * ea
1e70: 63 68 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  ch index of the 
1e80: 74 61 62 6c 65 20 28 7a 65 72 6f 20 6f 72 20 6d  table (zero or m
1e90: 6f 72 65 20 70 6f 69 6e 74 73 20 74 6f 20 76 69  ore points to vi
1ea0: 73 69 74 29 2c 20 61 6e 64 0a 2a 2a 20 20 20 20  sit), and.**    
1eb0: 20 2a 20 61 20 73 70 65 63 69 61 6c 20 22 63 6c   * a special "cl
1ec0: 65 61 6e 75 70 20 74 61 62 6c 65 22 20 73 74 61  eanup table" sta
1ed0: 74 65 2e 0a 2a 2a 0a 2a 2a 20 61 62 49 6e 64 65  te..**.** abInde
1ee0: 78 65 64 3a 0a 2a 2a 20 20 20 49 66 20 74 68 65  xed:.**   If the
1ef0: 20 74 61 62 6c 65 20 68 61 73 20 6e 6f 20 69 6e   table has no in
1f00: 64 65 78 65 73 20 6f 6e 20 69 74 2c 20 61 62 49  dexes on it, abI
1f10: 6e 64 65 78 65 64 20 69 73 20 73 65 74 20 74 6f  ndexed is set to
1f20: 20 4e 55 4c 4c 2e 20 4f 74 68 65 72 77 69 73 65   NULL. Otherwise
1f30: 2c 0a 2a 2a 20 20 20 69 74 20 70 6f 69 6e 74 73  ,.**   it points
1f40: 20 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66 20   to an array of 
1f50: 66 6c 61 67 73 20 6e 54 62 6c 43 6f 6c 20 65 6c  flags nTblCol el
1f60: 65 6d 65 6e 74 73 20 69 6e 20 73 69 7a 65 2e 20  ements in size. 
1f70: 54 68 65 20 66 6c 61 67 20 69 73 0a 2a 2a 20 20  The flag is.**  
1f80: 20 73 65 74 20 66 6f 72 20 65 61 63 68 20 63 6f   set for each co
1f90: 6c 75 6d 6e 20 74 68 61 74 20 69 73 20 65 69 74  lumn that is eit
1fa0: 68 65 72 20 61 20 70 61 72 74 20 6f 66 20 74 68  her a part of th
1fb0: 65 20 50 4b 20 6f 72 20 61 20 70 61 72 74 20 6f  e PK or a part o
1fc0: 66 20 61 6e 0a 2a 2a 20 20 20 69 6e 64 65 78 2e  f an.**   index.
1fd0: 20 4f 72 20 63 6c 65 61 72 20 6f 74 68 65 72 77   Or clear otherw
1fe0: 69 73 65 2e 0a 2a 2a 20 20 20 0a 2a 2f 0a 73 74  ise..**   .*/.st
1ff0: 72 75 63 74 20 52 62 75 4f 62 6a 49 74 65 72 20  ruct RbuObjIter 
2000: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
2010: 20 2a 70 54 62 6c 49 74 65 72 3b 20 20 20 20 20   *pTblIter;     
2020: 20 20 20 20 2f 2a 20 49 74 65 72 61 74 65 20 74      /* Iterate t
2030: 68 72 6f 75 67 68 20 74 61 62 6c 65 73 20 2a 2f  hrough tables */
2040: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
2050: 2a 70 49 64 78 49 74 65 72 3b 20 20 20 20 20 20  *pIdxIter;      
2060: 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 74 65 72     /* Index iter
2070: 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 54  ator */.  int nT
2080: 62 6c 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20  blCol;          
2090: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
20a0: 65 20 6f 66 20 61 7a 54 62 6c 43 6f 6c 5b 5d 20  e of azTblCol[] 
20b0: 61 72 72 61 79 20 2a 2f 0a 20 20 63 68 61 72 20  array */.  char 
20c0: 2a 2a 61 7a 54 62 6c 43 6f 6c 3b 20 20 20 20 20  **azTblCol;     
20d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
20e0: 72 61 79 20 6f 66 20 75 6e 71 75 6f 74 65 64 20  ray of unquoted 
20f0: 74 61 72 67 65 74 20 63 6f 6c 75 6d 6e 20 6e 61  target column na
2100: 6d 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  mes */.  char **
2110: 61 7a 54 62 6c 54 79 70 65 3b 20 20 20 20 20 20  azTblType;      
2120: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
2130: 79 20 6f 66 20 74 61 72 67 65 74 20 63 6f 6c 75  y of target colu
2140: 6d 6e 20 74 79 70 65 73 20 2a 2f 0a 20 20 69 6e  mn types */.  in
2150: 74 20 2a 61 69 53 72 63 4f 72 64 65 72 3b 20 20  t *aiSrcOrder;  
2160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2170: 20 73 72 63 20 74 61 62 6c 65 20 63 6f 6c 20 2d   src table col -
2180: 3e 20 74 61 72 67 65 74 20 74 61 62 6c 65 20 63  > target table c
2190: 6f 6c 20 2a 2f 0a 20 20 75 38 20 2a 61 62 54 62  ol */.  u8 *abTb
21a0: 6c 50 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  lPk;            
21b0: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
21c0: 20 6f 66 20 66 6c 61 67 73 2c 20 73 65 74 20 6f   of flags, set o
21d0: 6e 20 74 61 72 67 65 74 20 50 4b 20 63 6f 6c 75  n target PK colu
21e0: 6d 6e 73 20 2a 2f 0a 20 20 75 38 20 2a 61 62 4e  mns */.  u8 *abN
21f0: 6f 74 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20 20  otNull;         
2200: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
2210: 79 20 6f 66 20 66 6c 61 67 73 2c 20 73 65 74 20  y of flags, set 
2220: 6f 6e 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75  on NOT NULL colu
2230: 6d 6e 73 20 2a 2f 0a 20 20 75 38 20 2a 61 62 49  mns */.  u8 *abI
2240: 6e 64 65 78 65 64 3b 20 20 20 20 20 20 20 20 20  ndexed;         
2250: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
2260: 79 20 6f 66 20 66 6c 61 67 73 2c 20 73 65 74 20  y of flags, set 
2270: 6f 6e 20 69 6e 64 65 78 65 64 20 26 20 50 4b 20  on indexed & PK 
2280: 63 6f 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 65 54  cols */.  int eT
2290: 79 70 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ype;            
22a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
22b0: 6c 65 20 74 79 70 65 20 2d 20 61 6e 20 52 42 55  le type - an RBU
22c0: 5f 50 4b 5f 58 58 58 20 76 61 6c 75 65 20 2a 2f  _PK_XXX value */
22d0: 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 76 61  ..  /* Output va
22e0: 72 69 61 62 6c 65 73 2e 20 7a 54 62 6c 3d 3d 30  riables. zTbl==0
22f0: 20 69 6d 70 6c 69 65 73 20 45 4f 46 2e 20 2a 2f   implies EOF. */
2300: 0a 20 20 69 6e 74 20 62 43 6c 65 61 6e 75 70 3b  .  int bCleanup;
2310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2320: 20 20 20 2f 2a 20 54 72 75 65 20 69 6e 20 22 63     /* True in "c
2330: 6c 65 61 6e 75 70 22 20 73 74 61 74 65 20 2a 2f  leanup" state */
2340: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2350: 54 62 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Tbl;            
2360: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 61     /* Name of ta
2370: 72 67 65 74 20 64 62 20 74 61 62 6c 65 20 2a 2f  rget db table */
2380: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2390: 44 61 74 61 54 62 6c 3b 20 20 20 20 20 20 20 20  DataTbl;        
23a0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 72 62     /* Name of rb
23b0: 75 20 64 62 20 74 61 62 6c 65 20 28 6f 72 20 6e  u db table (or n
23c0: 75 6c 6c 29 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ull) */.  const 
23d0: 63 68 61 72 20 2a 7a 49 64 78 3b 20 20 20 20 20  char *zIdx;     
23e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
23f0: 65 20 6f 66 20 74 61 72 67 65 74 20 64 62 20 69  e of target db i
2400: 6e 64 65 78 20 28 6f 72 20 6e 75 6c 6c 29 20 2a  ndex (or null) *
2410: 2f 0a 20 20 69 6e 74 20 69 54 6e 75 6d 3b 20 20  /.  int iTnum;  
2420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2430: 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
2440: 20 6f 66 20 63 75 72 72 65 6e 74 20 6f 62 6a 65   of current obje
2450: 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 50 6b 54  ct */.  int iPkT
2460: 6e 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  num;            
2470: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 65 54          /* If eT
2480: 79 70 65 3d 3d 45 58 54 45 52 4e 41 4c 2c 20 72  ype==EXTERNAL, r
2490: 6f 6f 74 20 6f 66 20 50 4b 20 69 6e 64 65 78 20  oot of PK index 
24a0: 2a 2f 0a 20 20 69 6e 74 20 62 55 6e 69 71 75 65  */.  int bUnique
24b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
24c0: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
24d0: 69 6e 64 65 78 20 69 73 20 75 6e 69 71 75 65 20  index is unique 
24e0: 2a 2f 0a 20 20 69 6e 74 20 6e 49 6e 64 65 78 3b  */.  int nIndex;
24f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2500: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2510: 66 20 61 75 78 2e 20 69 6e 64 65 78 65 73 20 6f  f aux. indexes o
2520: 6e 20 74 61 62 6c 65 20 7a 54 62 6c 20 2a 2f 0a  n table zTbl */.
2530: 0a 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 73  .  /* Statements
2540: 20 63 72 65 61 74 65 64 20 62 79 20 72 62 75 4f   created by rbuO
2550: 62 6a 49 74 65 72 50 72 65 70 61 72 65 41 6c 6c  bjIterPrepareAll
2560: 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c  () */.  int nCol
2570: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2580: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2590: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
25a0: 63 75 72 72 65 6e 74 20 6f 62 6a 65 63 74 20 2a  current object *
25b0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  /.  sqlite3_stmt
25c0: 20 2a 70 53 65 6c 65 63 74 3b 20 20 20 20 20 20   *pSelect;      
25d0: 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 20 64 61      /* Source da
25e0: 74 61 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ta */.  sqlite3_
25f0: 73 74 6d 74 20 2a 70 49 6e 73 65 72 74 3b 20 20  stmt *pInsert;  
2600: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 65          /* State
2610: 6d 65 6e 74 20 66 6f 72 20 49 4e 53 45 52 54 20  ment for INSERT 
2620: 6f 70 65 72 61 74 69 6f 6e 73 20 2a 2f 0a 20 20  operations */.  
2630: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 44  sqlite3_stmt *pD
2640: 65 6c 65 74 65 3b 20 20 20 20 20 20 20 20 20 20  elete;          
2650: 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20 66 6f 72  /* Statement for
2660: 20 44 45 4c 45 54 45 20 6f 70 73 20 2a 2f 0a 20   DELETE ops */. 
2670: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
2680: 54 6d 70 49 6e 73 65 72 74 3b 20 20 20 20 20 20  TmpInsert;      
2690: 20 2f 2a 20 49 6e 73 65 72 74 20 69 6e 74 6f 20   /* Insert into 
26a0: 72 62 75 5f 74 6d 70 5f 24 7a 44 61 74 61 54 62  rbu_tmp_$zDataTb
26b0: 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 4c 61 73 74 20  l */..  /* Last 
26c0: 55 50 44 41 54 45 20 75 73 65 64 20 28 66 6f 72  UPDATE used (for
26d0: 20 50 4b 20 62 2d 74 72 65 65 20 75 70 64 61 74   PK b-tree updat
26e0: 65 73 20 6f 6e 6c 79 29 2c 20 6f 72 20 4e 55 4c  es only), or NUL
26f0: 4c 2e 20 2a 2f 0a 20 20 52 62 75 55 70 64 61 74  L. */.  RbuUpdat
2700: 65 53 74 6d 74 20 2a 70 52 62 75 55 70 64 61 74  eStmt *pRbuUpdat
2710: 65 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c  e;.};../*.** Val
2720: 75 65 73 20 66 6f 72 20 52 62 75 4f 62 6a 49 74  ues for RbuObjIt
2730: 65 72 2e 65 54 79 70 65 0a 2a 2a 0a 2a 2a 20 20  er.eType.**.**  
2740: 20 20 20 30 3a 20 54 61 62 6c 65 20 64 6f 65 73     0: Table does
2750: 20 6e 6f 74 20 65 78 69 73 74 20 28 65 72 72 6f   not exist (erro
2760: 72 29 0a 2a 2a 20 20 20 20 20 31 3a 20 54 61 62  r).**     1: Tab
2770: 6c 65 20 68 61 73 20 61 6e 20 69 6d 70 6c 69 63  le has an implic
2780: 69 74 20 72 6f 77 69 64 2e 0a 2a 2a 20 20 20 20  it rowid..**    
2790: 20 32 3a 20 54 61 62 6c 65 20 68 61 73 20 61 6e   2: Table has an
27a0: 20 65 78 70 6c 69 63 69 74 20 49 50 4b 20 63 6f   explicit IPK co
27b0: 6c 75 6d 6e 2e 0a 2a 2a 20 20 20 20 20 33 3a 20  lumn..**     3: 
27c0: 54 61 62 6c 65 20 68 61 73 20 61 6e 20 65 78 74  Table has an ext
27d0: 65 72 6e 61 6c 20 50 4b 20 69 6e 64 65 78 2e 0a  ernal PK index..
27e0: 2a 2a 20 20 20 20 20 34 3a 20 54 61 62 6c 65 20  **     4: Table 
27f0: 69 73 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44  is WITHOUT ROWID
2800: 2e 0a 2a 2a 20 20 20 20 20 35 3a 20 54 61 62 6c  ..**     5: Tabl
2810: 65 20 69 73 20 61 20 76 69 72 74 75 61 6c 20 74  e is a virtual t
2820: 61 62 6c 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  able..*/.#define
2830: 20 52 42 55 5f 50 4b 5f 4e 4f 54 41 42 4c 45 20   RBU_PK_NOTABLE 
2840: 20 20 20 20 20 20 20 30 0a 23 64 65 66 69 6e 65         0.#define
2850: 20 52 42 55 5f 50 4b 5f 4e 4f 4e 45 20 20 20 20   RBU_PK_NONE    
2860: 20 20 20 20 20 20 20 31 0a 23 64 65 66 69 6e 65         1.#define
2870: 20 52 42 55 5f 50 4b 5f 49 50 4b 20 20 20 20 20   RBU_PK_IPK     
2880: 20 20 20 20 20 20 20 32 0a 23 64 65 66 69 6e 65         2.#define
2890: 20 52 42 55 5f 50 4b 5f 45 58 54 45 52 4e 41 4c   RBU_PK_EXTERNAL
28a0: 20 20 20 20 20 20 20 33 0a 23 64 65 66 69 6e 65         3.#define
28b0: 20 52 42 55 5f 50 4b 5f 57 49 54 48 4f 55 54 5f   RBU_PK_WITHOUT_
28c0: 52 4f 57 49 44 20 20 34 0a 23 64 65 66 69 6e 65  ROWID  4.#define
28d0: 20 52 42 55 5f 50 4b 5f 56 54 41 42 20 20 20 20   RBU_PK_VTAB    
28e0: 20 20 20 20 20 20 20 35 0a 0a 0a 2f 2a 0a 2a 2a         5.../*.**
28f0: 20 57 69 74 68 69 6e 20 74 68 65 20 52 42 55 5f   Within the RBU_
2900: 53 54 41 47 45 5f 4f 41 4c 20 73 74 61 67 65 2c  STAGE_OAL stage,
2910: 20 65 61 63 68 20 63 61 6c 6c 20 74 6f 20 73 71   each call to sq
2920: 6c 69 74 65 33 72 62 75 5f 73 74 65 70 28 29 20  lite3rbu_step() 
2930: 70 65 72 66 6f 72 6d 73 0a 2a 2a 20 6f 6e 65 20  performs.** one 
2940: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
2950: 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2f 0a   operations..*/.
2960: 23 64 65 66 69 6e 65 20 52 42 55 5f 49 4e 53 45  #define RBU_INSE
2970: 52 54 20 20 20 20 20 31 20 20 20 20 20 20 20 20  RT     1        
2980: 20 20 2f 2a 20 49 6e 73 65 72 74 20 6f 6e 20 61    /* Insert on a
2990: 20 6d 61 69 6e 20 74 61 62 6c 65 20 62 2d 74 72   main table b-tr
29a0: 65 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 52 42  ee */.#define RB
29b0: 55 5f 44 45 4c 45 54 45 20 20 20 20 20 32 20 20  U_DELETE     2  
29c0: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74          /* Delet
29d0: 65 20 61 20 72 6f 77 20 66 72 6f 6d 20 61 20 6d  e a row from a m
29e0: 61 69 6e 20 74 61 62 6c 65 20 62 2d 74 72 65 65  ain table b-tree
29f0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 52 42 55 5f   */.#define RBU_
2a00: 52 45 50 4c 41 43 45 20 20 20 20 33 20 20 20 20  REPLACE    3    
2a10: 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20        /* Delete 
2a20: 61 6e 64 20 74 68 65 6e 20 69 6e 73 65 72 74 20  and then insert 
2a30: 61 20 72 6f 77 20 2a 2f 0a 23 64 65 66 69 6e 65  a row */.#define
2a40: 20 52 42 55 5f 49 44 58 5f 44 45 4c 45 54 45 20   RBU_IDX_DELETE 
2a50: 34 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65  4          /* De
2a60: 6c 65 74 65 20 61 20 72 6f 77 20 66 72 6f 6d 20  lete a row from 
2a70: 61 6e 20 61 75 78 2e 20 69 6e 64 65 78 20 62 2d  an aux. index b-
2a80: 74 72 65 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  tree */.#define 
2a90: 52 42 55 5f 49 44 58 5f 49 4e 53 45 52 54 20 35  RBU_IDX_INSERT 5
2aa0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73            /* Ins
2ab0: 65 72 74 20 6f 6e 20 61 6e 20 61 75 78 2e 20 69  ert on an aux. i
2ac0: 6e 64 65 78 20 62 2d 74 72 65 65 20 2a 2f 0a 0a  ndex b-tree */..
2ad0: 23 64 65 66 69 6e 65 20 52 42 55 5f 55 50 44 41  #define RBU_UPDA
2ae0: 54 45 20 20 20 20 20 36 20 20 20 20 20 20 20 20  TE     6        
2af0: 20 20 2f 2a 20 55 70 64 61 74 65 20 61 20 72 6f    /* Update a ro
2b00: 77 20 69 6e 20 61 20 6d 61 69 6e 20 74 61 62 6c  w in a main tabl
2b10: 65 20 62 2d 74 72 65 65 20 2a 2f 0a 0a 2f 2a 0a  e b-tree */../*.
2b20: 2a 2a 20 41 20 73 69 6e 67 6c 65 20 73 74 65 70  ** A single step
2b30: 20 6f 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74   of an increment
2b40: 61 6c 20 63 68 65 63 6b 70 6f 69 6e 74 20 2d 20  al checkpoint - 
2b50: 66 72 61 6d 65 20 69 57 61 6c 46 72 61 6d 65 20  frame iWalFrame 
2b60: 6f 66 20 74 68 65 20 77 61 6c 0a 2a 2a 20 66 69  of the wal.** fi
2b70: 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 70  le should be cop
2b80: 69 65 64 20 74 6f 20 70 61 67 65 20 69 44 62 50  ied to page iDbP
2b90: 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
2ba0: 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 72  ase file..*/.str
2bb0: 75 63 74 20 52 62 75 46 72 61 6d 65 20 7b 0a 20  uct RbuFrame {. 
2bc0: 20 75 33 32 20 69 44 62 50 61 67 65 3b 0a 20 20   u32 iDbPage;.  
2bd0: 75 33 32 20 69 57 61 6c 46 72 61 6d 65 3b 0a 7d  u32 iWalFrame;.}
2be0: 3b 0a 0a 2f 2a 0a 2a 2a 20 52 42 55 20 68 61 6e  ;../*.** RBU han
2bf0: 64 6c 65 2e 0a 2a 2a 0a 2a 2a 20 6e 50 68 61 73  dle..**.** nPhas
2c00: 65 4f 6e 65 53 74 65 70 3a 0a 2a 2a 20 20 20 49  eOneStep:.**   I
2c10: 66 20 74 68 65 20 52 42 55 20 64 61 74 61 62 61  f the RBU databa
2c20: 73 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 72  se contains an r
2c30: 62 75 5f 63 6f 75 6e 74 20 74 61 62 6c 65 2c 20  bu_count table, 
2c40: 74 68 69 73 20 76 61 6c 75 65 20 69 73 20 73 65  this value is se
2c50: 74 20 74 6f 0a 2a 2a 20 20 20 61 20 72 75 6e 6e  t to.**   a runn
2c60: 69 6e 67 20 65 73 74 69 6d 61 74 65 20 6f 66 20  ing estimate of 
2c70: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 2d  the number of b-
2c80: 74 72 65 65 20 6f 70 65 72 61 74 69 6f 6e 73 20  tree operations 
2c90: 72 65 71 75 69 72 65 64 20 74 6f 20 0a 2a 2a 20  required to .** 
2ca0: 20 20 66 69 6e 69 73 68 20 70 6f 70 75 6c 61 74    finish populat
2cb0: 69 6e 67 20 74 68 65 20 2a 2d 6f 61 6c 20 66 69  ing the *-oal fi
2cc0: 6c 65 2e 20 54 68 69 73 20 61 6c 6c 6f 77 73 20  le. This allows 
2cd0: 74 68 65 20 73 71 6c 69 74 65 33 5f 62 70 5f 70  the sqlite3_bp_p
2ce0: 72 6f 67 72 65 73 73 28 29 0a 2a 2a 20 20 20 41  rogress().**   A
2cf0: 50 49 20 74 6f 20 63 61 6c 63 75 6c 61 74 65 20  PI to calculate 
2d00: 74 68 65 20 70 65 72 6d 79 72 69 61 64 61 67 65  the permyriadage
2d10: 20 70 72 6f 67 72 65 73 73 20 6f 66 20 70 6f 70   progress of pop
2d20: 75 6c 61 74 69 6e 67 20 74 68 65 20 2a 2d 6f 61  ulating the *-oa
2d30: 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 75 73 69 6e  l file.**   usin
2d40: 67 20 74 68 65 20 66 6f 72 6d 75 6c 61 3a 0a 2a  g the formula:.*
2d50: 2a 0a 2a 2a 20 20 20 20 20 70 65 72 6d 79 72 69  *.**     permyri
2d60: 61 64 61 67 65 20 3d 20 28 31 30 30 30 30 20 2a  adage = (10000 *
2d70: 20 6e 50 72 6f 67 72 65 73 73 29 20 2f 20 6e 50   nProgress) / nP
2d80: 68 61 73 65 4f 6e 65 53 74 65 70 0a 2a 2a 0a 2a  haseOneStep.**.*
2d90: 2a 20 20 20 6e 50 68 61 73 65 4f 6e 65 53 74 65  *   nPhaseOneSte
2da0: 70 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  p is initialized
2db0: 20 74 6f 20 74 68 65 20 73 75 6d 20 6f 66 3a 0a   to the sum of:.
2dc0: 2a 2a 0a 2a 2a 20 20 20 20 20 6e 52 6f 77 20 2a  **.**     nRow *
2dd0: 20 28 6e 49 6e 64 65 78 20 2b 20 31 29 0a 2a 2a   (nIndex + 1).**
2de0: 0a 2a 2a 20 20 20 66 6f 72 20 61 6c 6c 20 73 6f  .**   for all so
2df0: 75 72 63 65 20 74 61 62 6c 65 73 20 69 6e 20 74  urce tables in t
2e00: 68 65 20 52 42 55 20 64 61 74 61 62 61 73 65 2c  he RBU database,
2e10: 20 77 68 65 72 65 20 6e 52 6f 77 20 69 73 20 74   where nRow is t
2e20: 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 20 20 6f  he number.**   o
2e30: 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 73 6f  f rows in the so
2e40: 75 72 63 65 20 74 61 62 6c 65 20 61 6e 64 20 6e  urce table and n
2e50: 49 6e 64 65 78 20 74 68 65 20 6e 75 6d 62 65 72  Index the number
2e60: 20 6f 66 20 69 6e 64 65 78 65 73 20 6f 6e 20 74   of indexes on t
2e70: 68 65 0a 2a 2a 20 20 20 63 6f 72 72 65 73 70 6f  he.**   correspo
2e80: 6e 64 69 6e 67 20 74 61 72 67 65 74 20 64 61 74  nding target dat
2e90: 61 62 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a  abase table..**.
2ea0: 2a 2a 20 20 20 54 68 69 73 20 65 73 74 69 6d 61  **   This estima
2eb0: 74 65 20 69 73 20 61 63 63 75 72 61 74 65 20 69  te is accurate i
2ec0: 66 20 74 68 65 20 52 42 55 20 75 70 64 61 74 65  f the RBU update
2ed0: 20 63 6f 6e 73 69 73 74 73 20 65 6e 74 69 72 65   consists entire
2ee0: 6c 79 20 6f 66 0a 2a 2a 20 20 20 49 4e 53 45 52  ly of.**   INSER
2ef0: 54 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 48 6f  T operations. Ho
2f00: 77 65 76 65 72 2c 20 69 74 20 69 73 20 69 6e 61  wever, it is ina
2f10: 63 63 75 72 61 74 65 20 69 66 3a 0a 2a 2a 0a 2a  ccurate if:.**.*
2f20: 2a 20 20 20 20 20 2a 20 74 68 65 20 52 42 55 20  *     * the RBU 
2f30: 75 70 64 61 74 65 20 63 6f 6e 74 61 69 6e 73 20  update contains 
2f40: 61 6e 79 20 55 50 44 41 54 45 20 6f 70 65 72 61  any UPDATE opera
2f50: 74 69 6f 6e 73 2e 20 49 66 20 74 68 65 20 50 4b  tions. If the PK
2f60: 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 20 20   specified.**   
2f70: 20 20 20 20 66 6f 72 20 61 6e 20 55 50 44 41 54      for an UPDAT
2f80: 45 20 6f 70 65 72 61 74 69 6f 6e 20 64 6f 65 73  E operation does
2f90: 20 6e 6f 74 20 65 78 69 73 74 20 69 6e 20 74 68   not exist in th
2fa0: 65 20 74 61 72 67 65 74 20 74 61 62 6c 65 2c 20  e target table, 
2fb0: 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20 6e 6f  then.**       no
2fc0: 20 62 2d 74 72 65 65 20 6f 70 65 72 61 74 69 6f   b-tree operatio
2fd0: 6e 73 20 61 72 65 20 72 65 71 75 69 72 65 64 20  ns are required 
2fe0: 6f 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 73  on index b-trees
2ff0: 2e 20 4f 72 20 69 66 20 74 68 65 20 0a 2a 2a 20  . Or if the .** 
3000: 20 20 20 20 20 20 73 70 65 63 69 66 69 65 64 20        specified 
3010: 50 4b 20 64 6f 65 73 20 65 78 69 73 74 2c 20 74  PK does exist, t
3020: 68 65 6e 20 28 6e 49 6e 64 65 78 2a 32 29 20 73  hen (nIndex*2) s
3030: 75 63 68 20 6f 70 65 72 61 74 69 6f 6e 73 20 61  uch operations a
3040: 72 65 0a 2a 2a 20 20 20 20 20 20 20 72 65 71 75  re.**       requ
3050: 69 72 65 64 20 28 6f 6e 65 20 64 65 6c 65 74 65  ired (one delete
3060: 20 61 6e 64 20 6f 6e 65 20 69 6e 73 65 72 74 20   and one insert 
3070: 6f 6e 20 65 61 63 68 20 69 6e 64 65 78 20 62 2d  on each index b-
3080: 74 72 65 65 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  tree)..**.**    
3090: 20 2a 20 74 68 65 20 52 42 55 20 75 70 64 61 74   * the RBU updat
30a0: 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 44  e contains any D
30b0: 45 4c 45 54 45 20 6f 70 65 72 61 74 69 6f 6e 73  ELETE operations
30c0: 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 73   for which the s
30d0: 70 65 63 69 66 69 65 64 0a 2a 2a 20 20 20 20 20  pecified.**     
30e0: 20 20 50 4b 20 64 6f 65 73 20 6e 6f 74 20 65 78    PK does not ex
30f0: 69 73 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ist. In this cas
3100: 65 20 6e 6f 20 6f 70 65 72 61 74 69 6f 6e 73 20  e no operations 
3110: 61 72 65 20 72 65 71 75 69 72 65 64 20 6f 6e 20  are required on 
3120: 69 6e 64 65 78 0a 2a 2a 20 20 20 20 20 20 20 62  index.**       b
3130: 2d 74 72 65 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  -trees..**.**   
3140: 20 20 2a 20 74 68 65 20 52 42 55 20 75 70 64 61    * the RBU upda
3150: 74 65 20 63 6f 6e 74 61 69 6e 73 20 52 45 50 4c  te contains REPL
3160: 41 43 45 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20  ACE operations. 
3170: 54 68 65 73 65 20 61 72 65 20 73 69 6d 69 6c 61  These are simila
3180: 72 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20 55 50  r to.**       UP
3190: 44 41 54 45 20 6f 70 65 72 61 74 69 6f 6e 73 2e  DATE operations.
31a0: 0a 2a 2a 0a 2a 2a 20 20 20 6e 50 68 61 73 65 4f  .**.**   nPhaseO
31b0: 6e 65 53 74 65 70 20 69 73 20 75 70 64 61 74 65  neStep is update
31c0: 64 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72  d to account for
31d0: 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20   the conditions 
31e0: 61 62 6f 76 65 20 64 75 72 69 6e 67 20 74 68 65  above during the
31f0: 0a 2a 2a 20 20 20 66 69 72 73 74 20 70 61 73 73  .**   first pass
3200: 20 6f 66 20 65 61 63 68 20 73 6f 75 72 63 65 20   of each source 
3210: 74 61 62 6c 65 2e 20 54 68 65 20 75 70 64 61 74  table. The updat
3220: 65 64 20 6e 50 68 61 73 65 4f 6e 65 53 74 65 70  ed nPhaseOneStep
3230: 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20 20 20 73   value is.**   s
3240: 74 6f 72 65 64 20 69 6e 20 74 68 65 20 72 62 75  tored in the rbu
3250: 5f 73 74 61 74 65 20 74 61 62 6c 65 20 69 66 20  _state table if 
3260: 74 68 65 20 52 42 55 20 75 70 64 61 74 65 20 69  the RBU update i
3270: 73 20 73 75 73 70 65 6e 64 65 64 2e 0a 2a 2f 0a  s suspended..*/.
3280: 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 72 62  struct sqlite3rb
3290: 75 20 7b 0a 20 20 69 6e 74 20 65 53 74 61 67 65  u {.  int eStage
32a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
32b0: 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f        /* Value o
32c0: 66 20 52 42 55 5f 53 54 41 54 45 5f 53 54 41 47  f RBU_STATE_STAG
32d0: 45 20 66 69 65 6c 64 20 2a 2f 0a 20 20 73 71 6c  E field */.  sql
32e0: 69 74 65 33 20 2a 64 62 4d 61 69 6e 3b 20 20 20  ite3 *dbMain;   
32f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3300: 74 61 72 67 65 74 20 64 61 74 61 62 61 73 65 20  target database 
3310: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 73 71 6c 69  handle */.  sqli
3320: 74 65 33 20 2a 64 62 52 62 75 3b 20 20 20 20 20  te3 *dbRbu;     
3330: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72              /* r
3340: 62 75 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  bu database hand
3350: 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54  le */.  char *zT
3360: 61 72 67 65 74 3b 20 20 20 20 20 20 20 20 20 20  arget;          
3370: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 74 68 20          /* Path 
3380: 74 6f 20 74 61 72 67 65 74 20 64 62 20 2a 2f 0a  to target db */.
3390: 20 20 63 68 61 72 20 2a 7a 52 62 75 3b 20 20 20    char *zRbu;   
33a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33b0: 20 20 2f 2a 20 50 61 74 68 20 74 6f 20 72 62 75    /* Path to rbu
33c0: 20 64 62 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a   db */.  char *z
33d0: 53 74 61 74 65 3b 20 20 20 20 20 20 20 20 20 20  State;          
33e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 74 68           /* Path
33f0: 20 74 6f 20 73 74 61 74 65 20 64 62 20 28 6f 72   to state db (or
3400: 20 4e 55 4c 4c 20 69 66 20 7a 52 62 75 29 20 2a   NULL if zRbu) *
3410: 2f 0a 20 20 63 68 61 72 20 7a 53 74 61 74 65 44  /.  char zStateD
3420: 62 5b 35 5d 3b 20 20 20 20 20 20 20 20 20 20 20  b[5];           
3430: 20 20 20 20 2f 2a 20 44 62 20 6e 61 6d 65 20 66      /* Db name f
3440: 6f 72 20 73 74 61 74 65 20 28 22 73 74 61 74 22  or state ("stat"
3450: 20 6f 72 20 22 6d 61 69 6e 22 29 20 2a 2f 0a 20   or "main") */. 
3460: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
3470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3480: 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e   /* Value return
3490: 65 64 20 62 79 20 6c 61 73 74 20 72 62 75 5f 73  ed by last rbu_s
34a0: 74 65 70 28 29 20 63 61 6c 6c 20 2a 2f 0a 20 20  tep() call */.  
34b0: 63 68 61 72 20 2a 7a 45 72 72 6d 73 67 3b 20 20  char *zErrmsg;  
34c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34d0: 2f 2a 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65  /* Error message
34e0: 20 69 66 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f   if rc!=SQLITE_O
34f0: 4b 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 74 65 70  K */.  int nStep
3500: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3510: 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 70         /* Rows p
3520: 72 6f 63 65 73 73 65 64 20 66 6f 72 20 63 75 72  rocessed for cur
3530: 72 65 6e 74 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  rent object */. 
3540: 20 69 6e 74 20 6e 50 72 6f 67 72 65 73 73 3b 20   int nProgress; 
3550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3560: 20 2f 2a 20 52 6f 77 73 20 70 72 6f 63 65 73 73   /* Rows process
3570: 65 64 20 66 6f 72 20 61 6c 6c 20 6f 62 6a 65 63  ed for all objec
3580: 74 73 20 2a 2f 0a 20 20 52 62 75 4f 62 6a 49 74  ts */.  RbuObjIt
3590: 65 72 20 6f 62 6a 69 74 65 72 3b 20 20 20 20 20  er objiter;     
35a0: 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
35b0: 74 6f 72 20 66 6f 72 20 73 6b 69 70 70 69 6e 67  tor for skipping
35c0: 20 74 68 72 6f 75 67 68 20 74 62 6c 2f 69 64 78   through tbl/idx
35d0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
35e0: 20 2a 7a 56 66 73 4e 61 6d 65 3b 20 20 20 20 20   *zVfsName;     
35f0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
3600: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63   automatically c
3610: 72 65 61 74 65 64 20 72 62 75 20 76 66 73 20 2a  reated rbu vfs *
3620: 2f 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 54  /.  rbu_file *pT
3630: 61 72 67 65 74 46 64 3b 20 20 20 20 20 20 20 20  argetFd;        
3640: 20 20 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64      /* File hand
3650: 6c 65 20 6f 70 65 6e 20 6f 6e 20 74 61 72 67 65  le open on targe
3660: 74 20 64 62 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  t db */.  int nP
3670: 61 67 65 50 65 72 53 65 63 74 6f 72 3b 20 20 20  agePerSector;   
3680: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
3690: 65 73 20 70 65 72 20 73 65 63 74 6f 72 20 66 6f  es per sector fo
36a0: 72 20 70 54 61 72 67 65 74 46 64 20 2a 2f 0a 20  r pTargetFd */. 
36b0: 20 69 36 34 20 69 4f 61 6c 53 7a 3b 0a 20 20 69   i64 iOalSz;.  i
36c0: 36 34 20 6e 50 68 61 73 65 4f 6e 65 53 74 65 70  64 nPhaseOneStep
36d0: 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  ;..  /* The foll
36e0: 6f 77 69 6e 67 20 73 74 61 74 65 20 76 61 72 69  owing state vari
36f0: 61 62 6c 65 73 20 61 72 65 20 75 73 65 64 20 61  ables are used a
3700: 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 69 6e  s part of the in
3710: 63 72 65 6d 65 6e 74 61 6c 0a 20 20 2a 2a 20 63  cremental.  ** c
3720: 68 65 63 6b 70 6f 69 6e 74 20 73 74 61 67 65 20  heckpoint stage 
3730: 28 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41  (eStage==RBU_STA
3740: 47 45 5f 43 4b 50 54 29 2e 20 53 65 65 20 63 6f  GE_CKPT). See co
3750: 6d 6d 65 6e 74 73 20 73 75 72 72 6f 75 6e 64 69  mments surroundi
3760: 6e 67 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e  ng.  ** function
3770: 20 72 62 75 53 65 74 75 70 43 68 65 63 6b 70 6f   rbuSetupCheckpo
3780: 69 6e 74 28 29 20 66 6f 72 20 64 65 74 61 69 6c  int() for detail
3790: 73 2e 20 20 2a 2f 0a 20 20 75 33 32 20 69 4d 61  s.  */.  u32 iMa
37a0: 78 46 72 61 6d 65 3b 20 20 20 20 20 20 20 20 20  xFrame;         
37b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 72 67           /* Larg
37c0: 65 73 74 20 69 57 61 6c 46 72 61 6d 65 20 76 61  est iWalFrame va
37d0: 6c 75 65 20 69 6e 20 61 46 72 61 6d 65 5b 5d 20  lue in aFrame[] 
37e0: 2a 2f 0a 20 20 75 33 32 20 6d 4c 6f 63 6b 3b 0a  */.  u32 mLock;.
37f0: 20 20 69 6e 74 20 6e 46 72 61 6d 65 3b 20 20 20    int nFrame;   
3800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3810: 20 20 2f 2a 20 45 6e 74 72 69 65 73 20 69 6e 20    /* Entries in 
3820: 61 46 72 61 6d 65 5b 5d 20 61 72 72 61 79 20 2a  aFrame[] array *
3830: 2f 0a 20 20 69 6e 74 20 6e 46 72 61 6d 65 41 6c  /.  int nFrameAl
3840: 6c 6f 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  loc;            
3850: 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64      /* Allocated
3860: 20 73 69 7a 65 20 6f 66 20 61 46 72 61 6d 65 5b   size of aFrame[
3870: 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 52 62 75  ] array */.  Rbu
3880: 46 72 61 6d 65 20 2a 61 46 72 61 6d 65 3b 0a 20  Frame *aFrame;. 
3890: 20 69 6e 74 20 70 67 73 7a 3b 0a 20 20 75 38 20   int pgsz;.  u8 
38a0: 2a 61 42 75 66 3b 0a 20 20 69 36 34 20 69 57 61  *aBuf;.  i64 iWa
38b0: 6c 43 6b 73 75 6d 3b 0a 0a 20 20 2f 2a 20 55 73  lCksum;..  /* Us
38c0: 65 64 20 69 6e 20 52 42 55 20 76 61 63 75 75 6d  ed in RBU vacuum
38d0: 20 6d 6f 64 65 20 6f 6e 6c 79 20 2a 2f 0a 20 20   mode only */.  
38e0: 69 6e 74 20 6e 52 62 75 3b 20 20 20 20 20 20 20  int nRbu;       
38f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3900: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 42 55  /* Number of RBU
3910: 20 56 46 53 20 69 6e 20 74 68 65 20 73 74 61 63   VFS in the stac
3920: 6b 20 2a 2f 0a 20 20 72 62 75 5f 66 69 6c 65 20  k */.  rbu_file 
3930: 2a 70 52 62 75 46 64 3b 20 20 20 20 20 20 20 20  *pRbuFd;        
3940: 20 20 20 20 20 20 20 2f 2a 20 46 64 20 66 6f 72         /* Fd for
3950: 20 6d 61 69 6e 20 64 62 20 6f 66 20 64 62 52 62   main db of dbRb
3960: 75 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  u */.};../*.** A
3970: 6e 20 72 62 75 20 56 46 53 20 69 73 20 69 6d 70  n rbu VFS is imp
3980: 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e 67 20 61  lemented using a
3990: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
39a0: 69 73 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  is structure..*/
39b0: 0a 73 74 72 75 63 74 20 72 62 75 5f 76 66 73 20  .struct rbu_vfs 
39c0: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  {.  sqlite3_vfs 
39d0: 62 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  base;           
39e0: 20 20 20 20 2f 2a 20 72 62 75 20 56 46 53 20 73      /* rbu VFS s
39f0: 68 69 6d 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 20  him methods */. 
3a00: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 52   sqlite3_vfs *pR
3a10: 65 61 6c 56 66 73 3b 20 20 20 20 20 20 20 20 20  ealVfs;         
3a20: 20 2f 2a 20 55 6e 64 65 72 6c 79 69 6e 67 20 56   /* Underlying V
3a30: 46 53 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  FS */.  sqlite3_
3a40: 6d 75 74 65 78 20 2a 6d 75 74 65 78 3b 20 20 20  mutex *mutex;   
3a50: 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 74 65 78          /* Mutex
3a60: 20 74 6f 20 70 72 6f 74 65 63 74 20 70 4d 61 69   to protect pMai
3a70: 6e 20 2a 2f 0a 20 20 72 62 75 5f 66 69 6c 65 20  n */.  rbu_file 
3a80: 2a 70 4d 61 69 6e 3b 20 20 20 20 20 20 20 20 20  *pMain;         
3a90: 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 6b 65 64         /* Linked
3aa0: 20 6c 69 73 74 20 6f 66 20 6d 61 69 6e 20 64 62   list of main db
3ab0: 20 66 69 6c 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a   files */.};../*
3ac0: 0a 2a 2a 20 45 61 63 68 20 66 69 6c 65 20 6f 70  .** Each file op
3ad0: 65 6e 65 64 20 62 79 20 61 6e 20 72 62 75 20 56  ened by an rbu V
3ae0: 46 53 20 69 73 20 72 65 70 72 65 73 65 6e 74 65  FS is represente
3af0: 64 20 62 79 20 61 6e 20 69 6e 73 74 61 6e 63 65  d by an instance
3b00: 20 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f   of.** the follo
3b10: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a  wing structure..
3b20: 2a 2f 0a 73 74 72 75 63 74 20 72 62 75 5f 66 69  */.struct rbu_fi
3b30: 6c 65 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66  le {.  sqlite3_f
3b40: 69 6c 65 20 62 61 73 65 3b 20 20 20 20 20 20 20  ile base;       
3b50: 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
3b60: 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73 20 2a  3_file methods *
3b70: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
3b80: 20 2a 70 52 65 61 6c 3b 20 20 20 20 20 20 20 20   *pReal;        
3b90: 20 20 20 20 2f 2a 20 55 6e 64 65 72 6c 79 69 6e      /* Underlyin
3ba0: 67 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 2a 2f  g file handle */
3bb0: 0a 20 20 72 62 75 5f 76 66 73 20 2a 70 52 62 75  .  rbu_vfs *pRbu
3bc0: 56 66 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  Vfs;            
3bd0: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
3be0: 20 74 68 65 20 72 62 75 5f 76 66 73 20 6f 62 6a   the rbu_vfs obj
3bf0: 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ect */.  sqlite3
3c00: 72 62 75 20 2a 70 52 62 75 3b 20 20 20 20 20 20  rbu *pRbu;      
3c10: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
3c20: 74 65 72 20 74 6f 20 72 62 75 20 6f 62 6a 65 63  ter to rbu objec
3c30: 74 20 28 72 62 75 20 74 61 72 67 65 74 20 6f 6e  t (rbu target on
3c40: 6c 79 29 20 2a 2f 0a 0a 20 20 69 6e 74 20 6f 70  ly) */..  int op
3c50: 65 6e 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  enFlags;        
3c60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
3c70: 67 73 20 74 68 69 73 20 66 69 6c 65 20 77 61 73  gs this file was
3c80: 20 6f 70 65 6e 65 64 20 77 69 74 68 20 2a 2f 0a   opened with */.
3c90: 20 20 75 33 32 20 69 43 6f 6f 6b 69 65 3b 20 20    u32 iCookie;  
3ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3cb0: 20 20 2f 2a 20 43 6f 6f 6b 69 65 20 76 61 6c 75    /* Cookie valu
3cc0: 65 20 66 6f 72 20 6d 61 69 6e 20 64 62 20 66 69  e for main db fi
3cd0: 6c 65 73 20 2a 2f 0a 20 20 75 38 20 69 57 72 69  les */.  u8 iWri
3ce0: 74 65 56 65 72 3b 20 20 20 20 20 20 20 20 20 20  teVer;          
3cf0: 20 20 20 20 20 20 20 20 20 2f 2a 20 22 77 72 69           /* "wri
3d00: 74 65 2d 76 65 72 73 69 6f 6e 22 20 76 61 6c 75  te-version" valu
3d10: 65 20 66 6f 72 20 6d 61 69 6e 20 64 62 20 66 69  e for main db fi
3d20: 6c 65 73 20 2a 2f 0a 20 20 75 38 20 62 4e 6f 6c  les */.  u8 bNol
3d30: 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ock;            
3d40: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
3d50: 20 74 6f 20 66 61 69 6c 20 45 58 43 4c 55 53 49   to fail EXCLUSI
3d60: 56 45 20 6c 6f 63 6b 73 20 2a 2f 0a 0a 20 20 69  VE locks */..  i
3d70: 6e 74 20 6e 53 68 6d 3b 20 20 20 20 20 20 20 20  nt nShm;        
3d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3d90: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  * Number of entr
3da0: 69 65 73 20 69 6e 20 61 70 53 68 6d 5b 5d 20 61  ies in apShm[] a
3db0: 72 72 61 79 20 2a 2f 0a 20 20 63 68 61 72 20 2a  rray */.  char *
3dc0: 2a 61 70 53 68 6d 3b 20 20 20 20 20 20 20 20 20  *apShm;         
3dd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72            /* Arr
3de0: 61 79 20 6f 66 20 6d 6d 61 70 27 64 20 2a 2d 73  ay of mmap'd *-s
3df0: 68 6d 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20  hm regions */.  
3e00: 63 68 61 72 20 2a 7a 44 65 6c 3b 20 20 20 20 20  char *zDel;     
3e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e20: 2f 2a 20 44 65 6c 65 74 65 20 74 68 69 73 20 77  /* Delete this w
3e30: 68 65 6e 20 63 6c 6f 73 69 6e 67 20 66 69 6c 65  hen closing file
3e40: 20 2a 2f 0a 0a 20 20 63 6f 6e 73 74 20 63 68 61   */..  const cha
3e50: 72 20 2a 7a 57 61 6c 3b 20 20 20 20 20 20 20 20  r *zWal;        
3e60: 20 20 20 20 20 20 20 2f 2a 20 57 61 6c 20 66 69         /* Wal fi
3e70: 6c 65 6e 61 6d 65 20 66 6f 72 20 74 68 69 73 20  lename for this 
3e80: 6d 61 69 6e 20 64 62 20 66 69 6c 65 20 2a 2f 0a  main db file */.
3e90: 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 57 61 6c    rbu_file *pWal
3ea0: 46 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Fd;             
3eb0: 20 20 2f 2a 20 57 61 6c 20 66 69 6c 65 20 64 65    /* Wal file de
3ec0: 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68 69  scriptor for thi
3ed0: 73 20 6d 61 69 6e 20 64 62 20 2a 2f 0a 20 20 72  s main db */.  r
3ee0: 62 75 5f 66 69 6c 65 20 2a 70 4d 61 69 6e 4e 65  bu_file *pMainNe
3ef0: 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  xt;            /
3f00: 2a 20 4e 65 78 74 20 4d 41 49 4e 5f 44 42 20 66  * Next MAIN_DB f
3f10: 69 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ile */.};../*.**
3f20: 20 54 72 75 65 20 66 6f 72 20 61 6e 20 52 42 55   True for an RBU
3f30: 20 76 61 63 75 75 6d 20 68 61 6e 64 6c 65 2c 20   vacuum handle, 
3f40: 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69  or false otherwi
3f50: 73 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 72  se..*/.#define r
3f60: 62 75 49 73 56 61 63 75 75 6d 28 70 29 20 28 28  buIsVacuum(p) ((
3f70: 70 29 2d 3e 7a 54 61 72 67 65 74 3d 3d 30 29 0a  p)->zTarget==0).
3f80: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
3f90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3fa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3fb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3fc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20  ************.** 
3fd0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  The following th
3fe0: 72 65 65 20 66 75 6e 63 74 69 6f 6e 73 2c 20 66  ree functions, f
3ff0: 6f 75 6e 64 20 62 65 6c 6f 77 3a 0a 2a 2a 0a 2a  ound below:.**.*
4000: 2a 20 20 20 72 62 75 44 65 6c 74 61 47 65 74 49  *   rbuDeltaGetI
4010: 6e 74 28 29 0a 2a 2a 20 20 20 72 62 75 44 65 6c  nt().**   rbuDel
4020: 74 61 43 68 65 63 6b 73 75 6d 28 29 0a 2a 2a 20  taChecksum().** 
4030: 20 20 72 62 75 44 65 6c 74 61 41 70 70 6c 79 28    rbuDeltaApply(
4040: 29 0a 2a 2a 0a 2a 2a 20 61 72 65 20 6c 69 66 74  ).**.** are lift
4050: 65 64 20 66 72 6f 6d 20 74 68 65 20 66 6f 73 73  ed from the foss
4060: 69 6c 20 73 6f 75 72 63 65 20 63 6f 64 65 20 28  il source code (
4070: 68 74 74 70 3a 2f 2f 66 6f 73 73 69 6c 2d 73 63  http://fossil-sc
4080: 6d 2e 6f 72 67 29 2e 20 54 68 65 79 0a 2a 2a 20  m.org). They.** 
4090: 61 72 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c  are used to impl
40a0: 65 6d 65 6e 74 20 74 68 65 20 73 63 61 6c 61 72  ement the scalar
40b0: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 72 62   SQL function rb
40c0: 75 5f 66 6f 73 73 69 6c 5f 64 65 6c 74 61 28 29  u_fossil_delta()
40d0: 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  ..*/../*.** Read
40e0: 20 62 79 74 65 73 20 66 72 6f 6d 20 2a 70 7a 20   bytes from *pz 
40f0: 61 6e 64 20 63 6f 6e 76 65 72 74 20 74 68 65 6d  and convert them
4100: 20 69 6e 74 6f 20 61 20 70 6f 73 69 74 69 76 65   into a positive
4110: 20 69 6e 74 65 67 65 72 2e 20 20 57 68 65 6e 0a   integer.  When.
4120: 2a 2a 20 66 69 6e 69 73 68 65 64 2c 20 6c 65 61  ** finished, lea
4130: 76 65 20 2a 70 7a 20 70 6f 69 6e 74 69 6e 67 20  ve *pz pointing 
4140: 74 6f 20 74 68 65 20 66 69 72 73 74 20 63 68 61  to the first cha
4150: 72 61 63 74 65 72 20 70 61 73 74 20 74 68 65 20  racter past the 
4160: 65 6e 64 20 6f 66 0a 2a 2a 20 74 68 65 20 69 6e  end of.** the in
4170: 74 65 67 65 72 2e 20 20 54 68 65 20 2a 70 4c 65  teger.  The *pLe
4180: 6e 20 70 61 72 61 6d 65 74 65 72 20 68 6f 6c 64  n parameter hold
4190: 73 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20  s the length of 
41a0: 74 68 65 20 73 74 72 69 6e 67 0a 2a 2a 20 69 6e  the string.** in
41b0: 20 2a 70 7a 20 61 6e 64 20 69 73 20 64 65 63 72   *pz and is decr
41c0: 65 6d 65 6e 74 65 64 20 6f 6e 63 65 20 66 6f 72  emented once for
41d0: 20 65 61 63 68 20 63 68 61 72 61 63 74 65 72 20   each character 
41e0: 69 6e 20 74 68 65 20 69 6e 74 65 67 65 72 2e 0a  in the integer..
41f0: 2a 2f 0a 73 74 61 74 69 63 20 75 6e 73 69 67 6e  */.static unsign
4200: 65 64 20 69 6e 74 20 72 62 75 44 65 6c 74 61 47  ed int rbuDeltaG
4210: 65 74 49 6e 74 28 63 6f 6e 73 74 20 63 68 61 72  etInt(const char
4220: 20 2a 2a 70 7a 2c 20 69 6e 74 20 2a 70 4c 65 6e   **pz, int *pLen
4230: 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ){.  static cons
4240: 74 20 73 69 67 6e 65 64 20 63 68 61 72 20 7a 56  t signed char zV
4250: 61 6c 75 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 2d  alue[] = {.    -
4260: 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d  1, -1, -1, -1, -
4270: 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 20  1, -1, -1, -1,  
4280: 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c   -1, -1, -1, -1,
4290: 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c   -1, -1, -1, -1,
42a0: 0a 20 20 20 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c  .    -1, -1, -1,
42b0: 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c   -1, -1, -1, -1,
42c0: 20 2d 31 2c 20 20 20 2d 31 2c 20 2d 31 2c 20 2d   -1,   -1, -1, -
42d0: 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d  1, -1, -1, -1, -
42e0: 31 2c 20 2d 31 2c 0a 20 20 20 20 2d 31 2c 20 2d  1, -1,.    -1, -
42f0: 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d  1, -1, -1, -1, -
4300: 31 2c 20 2d 31 2c 20 2d 31 2c 20 20 20 2d 31 2c  1, -1, -1,   -1,
4310: 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c   -1, -1, -1, -1,
4320: 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 0a 20 20 20   -1, -1, -1,.   
4330: 20 20 30 2c 20 20 31 2c 20 20 32 2c 20 20 33 2c    0,  1,  2,  3,
4340: 20 20 34 2c 20 20 35 2c 20 20 36 2c 20 20 37 2c    4,  5,  6,  7,
4350: 20 20 20 20 38 2c 20 20 39 2c 20 2d 31 2c 20 2d      8,  9, -1, -
4360: 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d  1, -1, -1, -1, -
4370: 31 2c 0a 20 20 20 20 2d 31 2c 20 31 30 2c 20 31  1,.    -1, 10, 1
4380: 31 2c 20 31 32 2c 20 31 33 2c 20 31 34 2c 20 31  1, 12, 13, 14, 1
4390: 35 2c 20 31 36 2c 20 20 20 31 37 2c 20 31 38 2c  5, 16,   17, 18,
43a0: 20 31 39 2c 20 32 30 2c 20 32 31 2c 20 32 32 2c   19, 20, 21, 22,
43b0: 20 32 33 2c 20 32 34 2c 0a 20 20 20 20 32 35 2c   23, 24,.    25,
43c0: 20 32 36 2c 20 32 37 2c 20 32 38 2c 20 32 39 2c   26, 27, 28, 29,
43d0: 20 33 30 2c 20 33 31 2c 20 33 32 2c 20 20 20 33   30, 31, 32,   3
43e0: 33 2c 20 33 34 2c 20 33 35 2c 20 2d 31 2c 20 2d  3, 34, 35, -1, -
43f0: 31 2c 20 2d 31 2c 20 2d 31 2c 20 33 36 2c 0a 20  1, -1, -1, 36,. 
4400: 20 20 20 2d 31 2c 20 33 37 2c 20 33 38 2c 20 33     -1, 37, 38, 3
4410: 39 2c 20 34 30 2c 20 34 31 2c 20 34 32 2c 20 34  9, 40, 41, 42, 4
4420: 33 2c 20 20 20 34 34 2c 20 34 35 2c 20 34 36 2c  3,   44, 45, 46,
4430: 20 34 37 2c 20 34 38 2c 20 34 39 2c 20 35 30 2c   47, 48, 49, 50,
4440: 20 35 31 2c 0a 20 20 20 20 35 32 2c 20 35 33 2c   51,.    52, 53,
4450: 20 35 34 2c 20 35 35 2c 20 35 36 2c 20 35 37 2c   54, 55, 56, 57,
4460: 20 35 38 2c 20 35 39 2c 20 20 20 36 30 2c 20 36   58, 59,   60, 6
4470: 31 2c 20 36 32 2c 20 2d 31 2c 20 2d 31 2c 20 2d  1, 62, -1, -1, -
4480: 31 2c 20 36 33 2c 20 2d 31 2c 0a 20 20 7d 3b 0a  1, 63, -1,.  };.
4490: 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 76    unsigned int v
44a0: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 63 3b 0a 20   = 0;.  int c;. 
44b0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
44c0: 7a 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  z = (unsigned ch
44d0: 61 72 2a 29 2a 70 7a 3b 0a 20 20 75 6e 73 69 67  ar*)*pz;.  unsig
44e0: 6e 65 64 20 63 68 61 72 20 2a 7a 53 74 61 72 74  ned char *zStart
44f0: 20 3d 20 7a 3b 0a 20 20 77 68 69 6c 65 28 20 28   = z;.  while( (
4500: 63 20 3d 20 7a 56 61 6c 75 65 5b 30 78 37 66 26  c = zValue[0x7f&
4510: 2a 28 7a 2b 2b 29 5d 29 3e 3d 30 20 29 7b 0a 20  *(z++)])>=0 ){. 
4520: 20 20 20 20 76 20 3d 20 28 76 3c 3c 36 29 20 2b      v = (v<<6) +
4530: 20 63 3b 0a 20 20 7d 0a 20 20 7a 2d 2d 3b 0a 20   c;.  }.  z--;. 
4540: 20 2a 70 4c 65 6e 20 2d 3d 20 7a 20 2d 20 7a 53   *pLen -= z - zS
4550: 74 61 72 74 3b 0a 20 20 2a 70 7a 20 3d 20 28 63  tart;.  *pz = (c
4560: 68 61 72 2a 29 7a 3b 0a 20 20 72 65 74 75 72 6e  har*)z;.  return
4570: 20 76 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d   v;.}../*.** Com
4580: 70 75 74 65 20 61 20 33 32 2d 62 69 74 20 63 68  pute a 32-bit ch
4590: 65 63 6b 73 75 6d 20 6f 6e 20 74 68 65 20 4e 2d  ecksum on the N-
45a0: 62 79 74 65 20 62 75 66 66 65 72 2e 20 20 52 65  byte buffer.  Re
45b0: 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 2e  turn the result.
45c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 6e 73 69 67  .*/.static unsig
45d0: 6e 65 64 20 69 6e 74 20 72 62 75 44 65 6c 74 61  ned int rbuDelta
45e0: 43 68 65 63 6b 73 75 6d 28 63 6f 6e 73 74 20 63  Checksum(const c
45f0: 68 61 72 20 2a 7a 49 6e 2c 20 73 69 7a 65 5f 74  har *zIn, size_t
4600: 20 4e 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73   N){.  const uns
4610: 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 20 3d 20  igned char *z = 
4620: 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
4630: 63 68 61 72 20 2a 29 7a 49 6e 3b 0a 20 20 75 6e  char *)zIn;.  un
4640: 73 69 67 6e 65 64 20 73 75 6d 30 20 3d 20 30 3b  signed sum0 = 0;
4650: 0a 20 20 75 6e 73 69 67 6e 65 64 20 73 75 6d 31  .  unsigned sum1
4660: 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64   = 0;.  unsigned
4670: 20 73 75 6d 32 20 3d 20 30 3b 0a 20 20 75 6e 73   sum2 = 0;.  uns
4680: 69 67 6e 65 64 20 73 75 6d 33 20 3d 20 30 3b 0a  igned sum3 = 0;.
4690: 20 20 77 68 69 6c 65 28 4e 20 3e 3d 20 31 36 29    while(N >= 16)
46a0: 7b 0a 20 20 20 20 73 75 6d 30 20 2b 3d 20 28 28  {.    sum0 += ((
46b0: 75 6e 73 69 67 6e 65 64 29 7a 5b 30 5d 20 2b 20  unsigned)z[0] + 
46c0: 7a 5b 34 5d 20 2b 20 7a 5b 38 5d 20 2b 20 7a 5b  z[4] + z[8] + z[
46d0: 31 32 5d 29 3b 0a 20 20 20 20 73 75 6d 31 20 2b  12]);.    sum1 +
46e0: 3d 20 28 28 75 6e 73 69 67 6e 65 64 29 7a 5b 31  = ((unsigned)z[1
46f0: 5d 20 2b 20 7a 5b 35 5d 20 2b 20 7a 5b 39 5d 20  ] + z[5] + z[9] 
4700: 2b 20 7a 5b 31 33 5d 29 3b 0a 20 20 20 20 73 75  + z[13]);.    su
4710: 6d 32 20 2b 3d 20 28 28 75 6e 73 69 67 6e 65 64  m2 += ((unsigned
4720: 29 7a 5b 32 5d 20 2b 20 7a 5b 36 5d 20 2b 20 7a  )z[2] + z[6] + z
4730: 5b 31 30 5d 2b 20 7a 5b 31 34 5d 29 3b 0a 20 20  [10]+ z[14]);.  
4740: 20 20 73 75 6d 33 20 2b 3d 20 28 28 75 6e 73 69    sum3 += ((unsi
4750: 67 6e 65 64 29 7a 5b 33 5d 20 2b 20 7a 5b 37 5d  gned)z[3] + z[7]
4760: 20 2b 20 7a 5b 31 31 5d 2b 20 7a 5b 31 35 5d 29   + z[11]+ z[15])
4770: 3b 0a 20 20 20 20 7a 20 2b 3d 20 31 36 3b 0a 20  ;.    z += 16;. 
4780: 20 20 20 4e 20 2d 3d 20 31 36 3b 0a 20 20 7d 0a     N -= 16;.  }.
4790: 20 20 77 68 69 6c 65 28 4e 20 3e 3d 20 34 29 7b    while(N >= 4){
47a0: 0a 20 20 20 20 73 75 6d 30 20 2b 3d 20 7a 5b 30  .    sum0 += z[0
47b0: 5d 3b 0a 20 20 20 20 73 75 6d 31 20 2b 3d 20 7a  ];.    sum1 += z
47c0: 5b 31 5d 3b 0a 20 20 20 20 73 75 6d 32 20 2b 3d  [1];.    sum2 +=
47d0: 20 7a 5b 32 5d 3b 0a 20 20 20 20 73 75 6d 33 20   z[2];.    sum3 
47e0: 2b 3d 20 7a 5b 33 5d 3b 0a 20 20 20 20 7a 20 2b  += z[3];.    z +
47f0: 3d 20 34 3b 0a 20 20 20 20 4e 20 2d 3d 20 34 3b  = 4;.    N -= 4;
4800: 0a 20 20 7d 0a 20 20 73 75 6d 33 20 2b 3d 20 28  .  }.  sum3 += (
4810: 73 75 6d 32 20 3c 3c 20 38 29 20 2b 20 28 73 75  sum2 << 8) + (su
4820: 6d 31 20 3c 3c 20 31 36 29 20 2b 20 28 73 75 6d  m1 << 16) + (sum
4830: 30 20 3c 3c 20 32 34 29 3b 0a 20 20 73 77 69 74  0 << 24);.  swit
4840: 63 68 28 4e 29 7b 0a 20 20 20 20 63 61 73 65 20  ch(N){.    case 
4850: 33 3a 20 20 20 73 75 6d 33 20 2b 3d 20 28 7a 5b  3:   sum3 += (z[
4860: 32 5d 20 3c 3c 20 38 29 3b 0a 20 20 20 20 63 61  2] << 8);.    ca
4870: 73 65 20 32 3a 20 20 20 73 75 6d 33 20 2b 3d 20  se 2:   sum3 += 
4880: 28 7a 5b 31 5d 20 3c 3c 20 31 36 29 3b 0a 20 20  (z[1] << 16);.  
4890: 20 20 63 61 73 65 20 31 3a 20 20 20 73 75 6d 33    case 1:   sum3
48a0: 20 2b 3d 20 28 7a 5b 30 5d 20 3c 3c 20 32 34 29   += (z[0] << 24)
48b0: 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20  ;.    default:  
48c0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73  ;.  }.  return s
48d0: 75 6d 33 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70  um3;.}../*.** Ap
48e0: 70 6c 79 20 61 20 64 65 6c 74 61 2e 0a 2a 2a 0a  ply a delta..**.
48f0: 2a 2a 20 54 68 65 20 6f 75 74 70 75 74 20 62 75  ** The output bu
4900: 66 66 65 72 20 73 68 6f 75 6c 64 20 62 65 20 62  ffer should be b
4910: 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c  ig enough to hol
4920: 64 20 74 68 65 20 77 68 6f 6c 65 20 6f 75 74 70  d the whole outp
4930: 75 74 0a 2a 2a 20 66 69 6c 65 20 61 6e 64 20 61  ut.** file and a
4940: 20 4e 55 4c 20 74 65 72 6d 69 6e 61 74 6f 72 20   NUL terminator 
4950: 61 74 20 74 68 65 20 65 6e 64 2e 20 20 54 68 65  at the end.  The
4960: 20 64 65 6c 74 61 5f 6f 75 74 70 75 74 5f 73 69   delta_output_si
4970: 7a 65 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  ze().** routine 
4980: 77 69 6c 6c 20 64 65 74 65 72 6d 69 6e 65 20 74  will determine t
4990: 68 69 73 20 73 69 7a 65 20 66 6f 72 20 79 6f 75  his size for you
49a0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 6c 74  ..**.** The delt
49b0: 61 20 73 74 72 69 6e 67 20 73 68 6f 75 6c 64 20  a string should 
49c0: 62 65 20 6e 75 6c 6c 2d 74 65 72 6d 69 6e 61 74  be null-terminat
49d0: 65 64 2e 20 20 42 75 74 20 74 68 65 20 64 65 6c  ed.  But the del
49e0: 74 61 20 73 74 72 69 6e 67 0a 2a 2a 20 6d 61 79  ta string.** may
49f0: 20 63 6f 6e 74 61 69 6e 20 65 6d 62 65 64 64 65   contain embedde
4a00: 64 20 4e 55 4c 20 63 68 61 72 61 63 74 65 72 73  d NUL characters
4a10: 20 28 69 66 20 74 68 65 20 69 6e 70 75 74 20 61   (if the input a
4a20: 6e 64 20 6f 75 74 70 75 74 20 61 72 65 0a 2a 2a  nd output are.**
4a30: 20 62 69 6e 61 72 79 20 66 69 6c 65 73 29 20 73   binary files) s
4a40: 6f 20 77 65 20 61 6c 73 6f 20 68 61 76 65 20 74  o we also have t
4a50: 6f 20 70 61 73 73 20 69 6e 20 74 68 65 20 6c 65  o pass in the le
4a60: 6e 67 74 68 20 6f 66 20 74 68 65 20 64 65 6c 74  ngth of the delt
4a70: 61 20 69 6e 0a 2a 2a 20 74 68 65 20 6c 65 6e 44  a in.** the lenD
4a80: 65 6c 74 61 20 70 61 72 61 6d 65 74 65 72 2e 0a  elta parameter..
4a90: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
4aa0: 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20  ion returns the 
4ab0: 73 69 7a 65 20 6f 66 20 74 68 65 20 6f 75 74 70  size of the outp
4ac0: 75 74 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73  ut file in bytes
4ad0: 20 28 65 78 63 6c 75 64 69 6e 67 0a 2a 2a 20 74   (excluding.** t
4ae0: 68 65 20 66 69 6e 61 6c 20 4e 55 4c 20 74 65 72  he final NUL ter
4af0: 6d 69 6e 61 74 6f 72 20 63 68 61 72 61 63 74 65  minator characte
4b00: 72 29 2e 20 20 45 78 63 65 70 74 2c 20 69 66 20  r).  Except, if 
4b10: 74 68 65 20 64 65 6c 74 61 20 73 74 72 69 6e 67  the delta string
4b20: 20 69 73 0a 2a 2a 20 6d 61 6c 66 6f 72 6d 65 64   is.** malformed
4b30: 20 6f 72 20 69 6e 74 65 6e 64 65 64 20 66 6f 72   or intended for
4b40: 20 75 73 65 20 77 69 74 68 20 61 20 73 6f 75 72   use with a sour
4b50: 63 65 20 66 69 6c 65 20 6f 74 68 65 72 20 74 68  ce file other th
4b60: 61 6e 20 7a 53 72 63 2c 0a 2a 2a 20 74 68 65 6e  an zSrc,.** then
4b70: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
4b80: 74 75 72 6e 73 20 2d 31 2e 0a 2a 2a 0a 2a 2a 20  turns -1..**.** 
4b90: 52 65 66 65 72 20 74 6f 20 74 68 65 20 64 65 6c  Refer to the del
4ba0: 74 61 5f 63 72 65 61 74 65 28 29 20 64 6f 63 75  ta_create() docu
4bb0: 6d 65 6e 74 61 74 69 6f 6e 20 61 62 6f 76 65 20  mentation above 
4bc0: 66 6f 72 20 61 20 64 65 73 63 72 69 70 74 69 6f  for a descriptio
4bd0: 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 64 65 6c 74  n.** of the delt
4be0: 61 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 2a  a file format..*
4bf0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62 75  /.static int rbu
4c00: 44 65 6c 74 61 41 70 70 6c 79 28 0a 20 20 63 6f  DeltaApply(.  co
4c10: 6e 73 74 20 63 68 61 72 20 2a 7a 53 72 63 2c 20  nst char *zSrc, 
4c20: 20 20 20 20 20 2f 2a 20 54 68 65 20 73 6f 75 72       /* The sour
4c30: 63 65 20 6f 72 20 70 61 74 74 65 72 6e 20 66 69  ce or pattern fi
4c40: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 6e 53  le */.  int lenS
4c50: 72 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  rc,            /
4c60: 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20  * Length of the 
4c70: 73 6f 75 72 63 65 20 66 69 6c 65 20 2a 2f 0a 20  source file */. 
4c80: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 65   const char *zDe
4c90: 6c 74 61 2c 20 20 20 20 2f 2a 20 44 65 6c 74 61  lta,    /* Delta
4ca0: 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 74 68 65   to apply to the
4cb0: 20 70 61 74 74 65 72 6e 20 2a 2f 0a 20 20 69 6e   pattern */.  in
4cc0: 74 20 6c 65 6e 44 65 6c 74 61 2c 20 20 20 20 20  t lenDelta,     
4cd0: 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f       /* Length o
4ce0: 66 20 74 68 65 20 64 65 6c 74 61 20 2a 2f 0a 20  f the delta */. 
4cf0: 20 63 68 61 72 20 2a 7a 4f 75 74 20 20 20 20 20   char *zOut     
4d00: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
4d10: 20 74 68 65 20 6f 75 74 70 75 74 20 69 6e 74 6f   the output into
4d20: 20 74 68 69 73 20 70 72 65 61 6c 6c 6f 63 61 74   this preallocat
4d30: 65 64 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b 0a  ed buffer */.){.
4d40: 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6c    unsigned int l
4d50: 69 6d 69 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64  imit;.  unsigned
4d60: 20 69 6e 74 20 74 6f 74 61 6c 20 3d 20 30 3b 0a   int total = 0;.
4d70: 23 69 66 6e 64 65 66 20 46 4f 53 53 49 4c 5f 4f  #ifndef FOSSIL_O
4d80: 4d 49 54 5f 44 45 4c 54 41 5f 43 4b 53 55 4d 5f  MIT_DELTA_CKSUM_
4d90: 54 45 53 54 0a 20 20 63 68 61 72 20 2a 7a 4f 72  TEST.  char *zOr
4da0: 69 67 4f 75 74 20 3d 20 7a 4f 75 74 3b 0a 23 65  igOut = zOut;.#e
4db0: 6e 64 69 66 0a 0a 20 20 6c 69 6d 69 74 20 3d 20  ndif..  limit = 
4dc0: 72 62 75 44 65 6c 74 61 47 65 74 49 6e 74 28 26  rbuDeltaGetInt(&
4dd0: 7a 44 65 6c 74 61 2c 20 26 6c 65 6e 44 65 6c 74  zDelta, &lenDelt
4de0: 61 29 3b 0a 20 20 69 66 28 20 2a 7a 44 65 6c 74  a);.  if( *zDelt
4df0: 61 21 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 2f  a!='\n' ){.    /
4e00: 2a 20 45 52 52 4f 52 3a 20 73 69 7a 65 20 69 6e  * ERROR: size in
4e10: 74 65 67 65 72 20 6e 6f 74 20 74 65 72 6d 69 6e  teger not termin
4e20: 61 74 65 64 20 62 79 20 22 5c 6e 22 20 2a 2f 0a  ated by "\n" */.
4e30: 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
4e40: 20 7d 0a 20 20 7a 44 65 6c 74 61 2b 2b 3b 20 6c   }.  zDelta++; l
4e50: 65 6e 44 65 6c 74 61 2d 2d 3b 0a 20 20 77 68 69  enDelta--;.  whi
4e60: 6c 65 28 20 2a 7a 44 65 6c 74 61 20 26 26 20 6c  le( *zDelta && l
4e70: 65 6e 44 65 6c 74 61 3e 30 20 29 7b 0a 20 20 20  enDelta>0 ){.   
4e80: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 63 6e   unsigned int cn
4e90: 74 2c 20 6f 66 73 74 3b 0a 20 20 20 20 63 6e 74  t, ofst;.    cnt
4ea0: 20 3d 20 72 62 75 44 65 6c 74 61 47 65 74 49 6e   = rbuDeltaGetIn
4eb0: 74 28 26 7a 44 65 6c 74 61 2c 20 26 6c 65 6e 44  t(&zDelta, &lenD
4ec0: 65 6c 74 61 29 3b 0a 20 20 20 20 73 77 69 74 63  elta);.    switc
4ed0: 68 28 20 7a 44 65 6c 74 61 5b 30 5d 20 29 7b 0a  h( zDelta[0] ){.
4ee0: 20 20 20 20 20 20 63 61 73 65 20 27 40 27 3a 20        case '@': 
4ef0: 7b 0a 20 20 20 20 20 20 20 20 7a 44 65 6c 74 61  {.        zDelta
4f00: 2b 2b 3b 20 6c 65 6e 44 65 6c 74 61 2d 2d 3b 0a  ++; lenDelta--;.
4f10: 20 20 20 20 20 20 20 20 6f 66 73 74 20 3d 20 72          ofst = r
4f20: 62 75 44 65 6c 74 61 47 65 74 49 6e 74 28 26 7a  buDeltaGetInt(&z
4f30: 44 65 6c 74 61 2c 20 26 6c 65 6e 44 65 6c 74 61  Delta, &lenDelta
4f40: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c  );.        if( l
4f50: 65 6e 44 65 6c 74 61 3e 30 20 26 26 20 7a 44 65  enDelta>0 && zDe
4f60: 6c 74 61 5b 30 5d 21 3d 27 2c 27 20 29 7b 0a 20  lta[0]!=',' ){. 
4f70: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 52 52 4f           /* ERRO
4f80: 52 3a 20 63 6f 70 79 20 63 6f 6d 6d 61 6e 64 20  R: copy command 
4f90: 6e 6f 74 20 74 65 72 6d 69 6e 61 74 65 64 20 62  not terminated b
4fa0: 79 20 27 2c 27 20 2a 2f 0a 20 20 20 20 20 20 20  y ',' */.       
4fb0: 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
4fc0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
4fd0: 7a 44 65 6c 74 61 2b 2b 3b 20 6c 65 6e 44 65 6c  zDelta++; lenDel
4fe0: 74 61 2d 2d 3b 0a 20 20 20 20 20 20 20 20 74 6f  ta--;.        to
4ff0: 74 61 6c 20 2b 3d 20 63 6e 74 3b 0a 20 20 20 20  tal += cnt;.    
5000: 20 20 20 20 69 66 28 20 74 6f 74 61 6c 3e 6c 69      if( total>li
5010: 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  mit ){.         
5020: 20 2f 2a 20 45 52 52 4f 52 3a 20 63 6f 70 79 20   /* ERROR: copy 
5030: 65 78 63 65 65 64 73 20 6f 75 74 70 75 74 20 66  exceeds output f
5040: 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20  ile size */.    
5050: 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b        return -1;
5060: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5070: 20 20 20 69 66 28 20 28 69 6e 74 29 28 6f 66 73     if( (int)(ofs
5080: 74 2b 63 6e 74 29 20 3e 20 6c 65 6e 53 72 63 20  t+cnt) > lenSrc 
5090: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
50a0: 45 52 52 4f 52 3a 20 63 6f 70 79 20 65 78 74 65  ERROR: copy exte
50b0: 6e 64 73 20 70 61 73 74 20 65 6e 64 20 6f 66 20  nds past end of 
50c0: 69 6e 70 75 74 20 2a 2f 0a 20 20 20 20 20 20 20  input */.       
50d0: 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
50e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
50f0: 6d 65 6d 63 70 79 28 7a 4f 75 74 2c 20 26 7a 53  memcpy(zOut, &zS
5100: 72 63 5b 6f 66 73 74 5d 2c 20 63 6e 74 29 3b 0a  rc[ofst], cnt);.
5110: 20 20 20 20 20 20 20 20 7a 4f 75 74 20 2b 3d 20          zOut += 
5120: 63 6e 74 3b 0a 20 20 20 20 20 20 20 20 62 72 65  cnt;.        bre
5130: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
5140: 20 20 63 61 73 65 20 27 3a 27 3a 20 7b 0a 20 20    case ':': {.  
5150: 20 20 20 20 20 20 7a 44 65 6c 74 61 2b 2b 3b 20        zDelta++; 
5160: 6c 65 6e 44 65 6c 74 61 2d 2d 3b 0a 20 20 20 20  lenDelta--;.    
5170: 20 20 20 20 74 6f 74 61 6c 20 2b 3d 20 63 6e 74      total += cnt
5180: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 74 6f  ;.        if( to
5190: 74 61 6c 3e 6c 69 6d 69 74 20 29 7b 0a 20 20 20  tal>limit ){.   
51a0: 20 20 20 20 20 20 20 2f 2a 20 45 52 52 4f 52 3a         /* ERROR:
51b0: 20 20 69 6e 73 65 72 74 20 63 6f 6d 6d 61 6e 64    insert command
51c0: 20 67 69 76 65 73 20 61 6e 20 6f 75 74 70 75 74   gives an output
51d0: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 70 72 65   larger than pre
51e0: 64 69 63 74 65 64 20 2a 2f 0a 20 20 20 20 20 20  dicted */.      
51f0: 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
5200: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
5210: 20 69 66 28 20 28 69 6e 74 29 63 6e 74 3e 6c 65   if( (int)cnt>le
5220: 6e 44 65 6c 74 61 20 29 7b 0a 20 20 20 20 20 20  nDelta ){.      
5230: 20 20 20 20 2f 2a 20 45 52 52 4f 52 3a 20 69 6e      /* ERROR: in
5240: 73 65 72 74 20 63 6f 75 6e 74 20 65 78 63 65 65  sert count excee
5250: 64 73 20 73 69 7a 65 20 6f 66 20 64 65 6c 74 61  ds size of delta
5260: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 65   */.          re
5270: 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 20  turn -1;.       
5280: 20 7d 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70   }.        memcp
5290: 79 28 7a 4f 75 74 2c 20 7a 44 65 6c 74 61 2c 20  y(zOut, zDelta, 
52a0: 63 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 7a 4f  cnt);.        zO
52b0: 75 74 20 2b 3d 20 63 6e 74 3b 0a 20 20 20 20 20  ut += cnt;.     
52c0: 20 20 20 7a 44 65 6c 74 61 20 2b 3d 20 63 6e 74     zDelta += cnt
52d0: 3b 0a 20 20 20 20 20 20 20 20 6c 65 6e 44 65 6c  ;.        lenDel
52e0: 74 61 20 2d 3d 20 63 6e 74 3b 0a 20 20 20 20 20  ta -= cnt;.     
52f0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
5300: 7d 0a 20 20 20 20 20 20 63 61 73 65 20 27 3b 27  }.      case ';'
5310: 3a 20 7b 0a 20 20 20 20 20 20 20 20 7a 44 65 6c  : {.        zDel
5320: 74 61 2b 2b 3b 20 6c 65 6e 44 65 6c 74 61 2d 2d  ta++; lenDelta--
5330: 3b 0a 20 20 20 20 20 20 20 20 7a 4f 75 74 5b 30  ;.        zOut[0
5340: 5d 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 46  ] = 0;.#ifndef F
5350: 4f 53 53 49 4c 5f 4f 4d 49 54 5f 44 45 4c 54 41  OSSIL_OMIT_DELTA
5360: 5f 43 4b 53 55 4d 5f 54 45 53 54 0a 20 20 20 20  _CKSUM_TEST.    
5370: 20 20 20 20 69 66 28 20 63 6e 74 21 3d 72 62 75      if( cnt!=rbu
5380: 44 65 6c 74 61 43 68 65 63 6b 73 75 6d 28 7a 4f  DeltaChecksum(zO
5390: 72 69 67 4f 75 74 2c 20 74 6f 74 61 6c 29 20 29  rigOut, total) )
53a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45  {.          /* E
53b0: 52 52 4f 52 3a 20 20 62 61 64 20 63 68 65 63 6b  RROR:  bad check
53c0: 73 75 6d 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  sum */.         
53d0: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
53e0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
53f0: 20 20 20 20 20 69 66 28 20 74 6f 74 61 6c 21 3d       if( total!=
5400: 6c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20  limit ){.       
5410: 20 20 20 2f 2a 20 45 52 52 4f 52 3a 20 67 65 6e     /* ERROR: gen
5420: 65 72 61 74 65 64 20 73 69 7a 65 20 64 6f 65 73  erated size does
5430: 20 6e 6f 74 20 6d 61 74 63 68 20 70 72 65 64 69   not match predi
5440: 63 74 65 64 20 73 69 7a 65 20 2a 2f 0a 20 20 20  cted size */.   
5450: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31         return -1
5460: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
5470: 20 20 20 20 72 65 74 75 72 6e 20 74 6f 74 61 6c      return total
5480: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5490: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
54a0: 20 20 20 2f 2a 20 45 52 52 4f 52 3a 20 75 6e 6b     /* ERROR: unk
54b0: 6e 6f 77 6e 20 64 65 6c 74 61 20 6f 70 65 72 61  nown delta opera
54c0: 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  tor */.        r
54d0: 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20  eturn -1;.      
54e0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a  }.    }.  }.  /*
54f0: 20 45 52 52 4f 52 3a 20 75 6e 74 65 72 6d 69 6e   ERROR: untermin
5500: 61 74 65 64 20 64 65 6c 74 61 20 2a 2f 0a 20 20  ated delta */.  
5510: 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 73 74  return -1;.}..st
5520: 61 74 69 63 20 69 6e 74 20 72 62 75 44 65 6c 74  atic int rbuDelt
5530: 61 4f 75 74 70 75 74 53 69 7a 65 28 63 6f 6e 73  aOutputSize(cons
5540: 74 20 63 68 61 72 20 2a 7a 44 65 6c 74 61 2c 20  t char *zDelta, 
5550: 69 6e 74 20 6c 65 6e 44 65 6c 74 61 29 7b 0a 20  int lenDelta){. 
5560: 20 69 6e 74 20 73 69 7a 65 3b 0a 20 20 73 69 7a   int size;.  siz
5570: 65 20 3d 20 72 62 75 44 65 6c 74 61 47 65 74 49  e = rbuDeltaGetI
5580: 6e 74 28 26 7a 44 65 6c 74 61 2c 20 26 6c 65 6e  nt(&zDelta, &len
5590: 44 65 6c 74 61 29 3b 0a 20 20 69 66 28 20 2a 7a  Delta);.  if( *z
55a0: 44 65 6c 74 61 21 3d 27 5c 6e 27 20 29 7b 0a 20  Delta!='\n' ){. 
55b0: 20 20 20 2f 2a 20 45 52 52 4f 52 3a 20 73 69 7a     /* ERROR: siz
55c0: 65 20 69 6e 74 65 67 65 72 20 6e 6f 74 20 74 65  e integer not te
55d0: 72 6d 69 6e 61 74 65 64 20 62 79 20 22 5c 6e 22  rminated by "\n"
55e0: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 2d   */.    return -
55f0: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
5600: 73 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  size;.}../*.** E
5610: 6e 64 20 6f 66 20 63 6f 64 65 20 74 61 6b 65 6e  nd of code taken
5620: 20 66 72 6f 6d 20 66 6f 73 73 69 6c 2e 0a 2a 2a   from fossil..**
5630: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5640: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5650: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5660: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5670: 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  *******/../*.** 
5680: 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
5690: 66 20 53 51 4c 20 73 63 61 6c 61 72 20 66 75 6e  f SQL scalar fun
56a0: 63 74 69 6f 6e 20 72 62 75 5f 66 6f 73 73 69 6c  ction rbu_fossil
56b0: 5f 64 65 6c 74 61 28 29 2e 0a 2a 2a 0a 2a 2a 20  _delta()..**.** 
56c0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 70  This function ap
56d0: 70 6c 69 65 73 20 61 20 66 6f 73 73 69 6c 20 64  plies a fossil d
56e0: 65 6c 74 61 20 70 61 74 63 68 20 74 6f 20 61 20  elta patch to a 
56f0: 62 6c 6f 62 2e 20 45 78 61 63 74 6c 79 20 74 77  blob. Exactly tw
5700: 6f 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20 6d  o.** arguments m
5710: 75 73 74 20 62 65 20 70 61 73 73 65 64 20 74 6f  ust be passed to
5720: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20   this function. 
5730: 54 68 65 20 66 69 72 73 74 20 69 73 20 74 68 65  The first is the
5740: 20 62 6c 6f 62 20 74 6f 0a 2a 2a 20 70 61 74 63   blob to.** patc
5750: 68 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64  h and the second
5760: 20 74 68 65 20 70 61 74 63 68 20 74 6f 20 61 70   the patch to ap
5770: 70 6c 79 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72  ply. If no error
5780: 20 6f 63 63 75 72 73 2c 20 74 68 69 73 0a 2a 2a   occurs, this.**
5790: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
57a0: 73 20 74 68 65 20 70 61 74 63 68 65 64 20 62 6c  s the patched bl
57b0: 6f 62 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ob..*/.static vo
57c0: 69 64 20 72 62 75 46 6f 73 73 69 6c 44 65 6c 74  id rbuFossilDelt
57d0: 61 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33  aFunc(.  sqlite3
57e0: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
57f0: 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  t,.  int argc,. 
5800: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
5810: 2a 61 72 67 76 0a 29 7b 0a 20 20 63 6f 6e 73 74  *argv.){.  const
5820: 20 63 68 61 72 20 2a 61 44 65 6c 74 61 3b 0a 20   char *aDelta;. 
5830: 20 69 6e 74 20 6e 44 65 6c 74 61 3b 0a 20 20 63   int nDelta;.  c
5840: 6f 6e 73 74 20 63 68 61 72 20 2a 61 4f 72 69 67  onst char *aOrig
5850: 3b 0a 20 20 69 6e 74 20 6e 4f 72 69 67 3b 0a 0a  ;.  int nOrig;..
5860: 20 20 69 6e 74 20 6e 4f 75 74 3b 0a 20 20 69 6e    int nOut;.  in
5870: 74 20 6e 4f 75 74 32 3b 0a 20 20 63 68 61 72 20  t nOut2;.  char 
5880: 2a 61 4f 75 74 3b 0a 0a 20 20 61 73 73 65 72 74  *aOut;..  assert
5890: 28 20 61 72 67 63 3d 3d 32 20 29 3b 0a 0a 20 20  ( argc==2 );..  
58a0: 6e 4f 72 69 67 20 3d 20 73 71 6c 69 74 65 33 5f  nOrig = sqlite3_
58b0: 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76  value_bytes(argv
58c0: 5b 30 5d 29 3b 0a 20 20 61 4f 72 69 67 20 3d 20  [0]);.  aOrig = 
58d0: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
58e0: 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28  ite3_value_blob(
58f0: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 6e 44 65 6c  argv[0]);.  nDel
5900: 74 61 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  ta = sqlite3_val
5910: 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 31 5d  ue_bytes(argv[1]
5920: 29 3b 0a 20 20 61 44 65 6c 74 61 20 3d 20 28 63  );.  aDelta = (c
5930: 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
5940: 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72  e3_value_blob(ar
5950: 67 76 5b 31 5d 29 3b 0a 0a 20 20 2f 2a 20 46 69  gv[1]);..  /* Fi
5960: 67 75 72 65 20 6f 75 74 20 74 68 65 20 73 69 7a  gure out the siz
5970: 65 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74 20  e of the output 
5980: 2a 2f 0a 20 20 6e 4f 75 74 20 3d 20 72 62 75 44  */.  nOut = rbuD
5990: 65 6c 74 61 4f 75 74 70 75 74 53 69 7a 65 28 61  eltaOutputSize(a
59a0: 44 65 6c 74 61 2c 20 6e 44 65 6c 74 61 29 3b 0a  Delta, nDelta);.
59b0: 20 20 69 66 28 20 6e 4f 75 74 3c 30 20 29 7b 0a    if( nOut<0 ){.
59c0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
59d0: 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74  lt_error(context
59e0: 2c 20 22 63 6f 72 72 75 70 74 20 66 6f 73 73 69  , "corrupt fossi
59f0: 6c 20 64 65 6c 74 61 22 2c 20 2d 31 29 3b 0a 20  l delta", -1);. 
5a00: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
5a10: 20 20 61 4f 75 74 20 3d 20 73 71 6c 69 74 65 33    aOut = sqlite3
5a20: 5f 6d 61 6c 6c 6f 63 28 6e 4f 75 74 2b 31 29 3b  _malloc(nOut+1);
5a30: 0a 20 20 69 66 28 20 61 4f 75 74 3d 3d 30 20 29  .  if( aOut==0 )
5a40: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
5a50: 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d  sult_error_nomem
5a60: 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 7d 65 6c  (context);.  }el
5a70: 73 65 7b 0a 20 20 20 20 6e 4f 75 74 32 20 3d 20  se{.    nOut2 = 
5a80: 72 62 75 44 65 6c 74 61 41 70 70 6c 79 28 61 4f  rbuDeltaApply(aO
5a90: 72 69 67 2c 20 6e 4f 72 69 67 2c 20 61 44 65 6c  rig, nOrig, aDel
5aa0: 74 61 2c 20 6e 44 65 6c 74 61 2c 20 61 4f 75 74  ta, nDelta, aOut
5ab0: 29 3b 0a 20 20 20 20 69 66 28 20 6e 4f 75 74 32  );.    if( nOut2
5ac0: 21 3d 6e 4f 75 74 20 29 7b 0a 20 20 20 20 20 20  !=nOut ){.      
5ad0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
5ae0: 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 22 63  rror(context, "c
5af0: 6f 72 72 75 70 74 20 66 6f 73 73 69 6c 20 64 65  orrupt fossil de
5b00: 6c 74 61 22 2c 20 2d 31 29 3b 0a 20 20 20 20 7d  lta", -1);.    }
5b10: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
5b20: 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 28  te3_result_blob(
5b30: 63 6f 6e 74 65 78 74 2c 20 61 4f 75 74 2c 20 6e  context, aOut, n
5b40: 4f 75 74 2c 20 73 71 6c 69 74 65 33 5f 66 72 65  Out, sqlite3_fre
5b50: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  e);.    }.  }.}.
5b60: 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20  ../*.** Prepare 
5b70: 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
5b80: 74 20 69 6e 20 62 75 66 66 65 72 20 7a 53 71 6c  t in buffer zSql
5b90: 20 61 67 61 69 6e 73 74 20 64 61 74 61 62 61 73   against databas
5ba0: 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2a 20  e handle db..** 
5bb0: 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73  If successful, s
5bc0: 65 74 20 2a 70 70 53 74 6d 74 20 74 6f 20 70 6f  et *ppStmt to po
5bd0: 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20 73  int to the new s
5be0: 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 72 65 74  tatement and ret
5bf0: 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  urn.** SQLITE_OK
5c00: 2e 20 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  . .**.** Otherwi
5c10: 73 65 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20  se, if an error 
5c20: 64 6f 65 73 20 6f 63 63 75 72 2c 20 73 65 74 20  does occur, set 
5c30: 2a 70 70 53 74 6d 74 20 74 6f 20 4e 55 4c 4c 20  *ppStmt to NULL 
5c40: 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 61 6e  and return.** an
5c50: 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
5c60: 64 65 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79  de. Additionally
5c70: 2c 20 73 65 74 20 6f 75 74 70 75 74 20 76 61 72  , set output var
5c80: 69 61 62 6c 65 20 2a 70 7a 45 72 72 6d 73 67 20  iable *pzErrmsg 
5c90: 74 6f 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 61  to.** point to a
5ca0: 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
5cb0: 6e 67 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ng an error mess
5cc0: 61 67 65 2e 20 49 74 20 69 73 20 74 68 65 20 72  age. It is the r
5cd0: 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 0a 2a 2a  esponsibility.**
5ce0: 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74   of the caller t
5cf0: 6f 20 28 65 76 65 6e 74 75 61 6c 6c 79 29 20 66  o (eventually) f
5d00: 72 65 65 20 74 68 69 73 20 62 75 66 66 65 72 20  ree this buffer 
5d10: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 72  using sqlite3_fr
5d20: 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ee()..*/.static 
5d30: 69 6e 74 20 70 72 65 70 61 72 65 41 6e 64 43 6f  int prepareAndCo
5d40: 6c 6c 65 63 74 45 72 72 6f 72 28 0a 20 20 73 71  llectError(.  sq
5d50: 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 73 71  lite3 *db, .  sq
5d60: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53  lite3_stmt **ppS
5d70: 74 6d 74 2c 0a 20 20 63 68 61 72 20 2a 2a 70 7a  tmt,.  char **pz
5d80: 45 72 72 6d 73 67 2c 0a 20 20 63 6f 6e 73 74 20  Errmsg,.  const 
5d90: 63 68 61 72 20 2a 7a 53 71 6c 0a 29 7b 0a 20 20  char *zSql.){.  
5da0: 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
5db0: 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20  _prepare_v2(db, 
5dc0: 7a 53 71 6c 2c 20 2d 31 2c 20 70 70 53 74 6d 74  zSql, -1, ppStmt
5dd0: 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 0);.  if( rc!=
5de0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
5df0: 20 2a 70 7a 45 72 72 6d 73 67 20 3d 20 73 71 6c   *pzErrmsg = sql
5e00: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
5e10: 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ", sqlite3_errms
5e20: 67 28 64 62 29 29 3b 0a 20 20 20 20 2a 70 70 53  g(db));.    *ppS
5e30: 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  tmt = 0;.  }.  r
5e40: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
5e50: 2a 2a 20 52 65 73 65 74 20 74 68 65 20 53 51 4c  ** Reset the SQL
5e60: 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65   statement passe
5e70: 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  d as the first a
5e80: 72 67 75 6d 65 6e 74 2e 20 52 65 74 75 72 6e 20  rgument. Return 
5e90: 61 20 63 6f 70 79 0a 2a 2a 20 6f 66 20 74 68 65  a copy.** of the
5ea0: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
5eb0: 62 79 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74  by sqlite3_reset
5ec0: 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ()..**.** If an 
5ed0: 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72  error has occurr
5ee0: 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 7a  ed, then set *pz
5ef0: 45 72 72 6d 73 67 20 74 6f 20 70 6f 69 6e 74 20  Errmsg to point 
5f00: 74 6f 20 61 20 62 75 66 66 65 72 0a 2a 2a 20 63  to a buffer.** c
5f10: 6f 6e 74 61 69 6e 69 6e 67 20 61 6e 20 65 72 72  ontaining an err
5f20: 6f 72 20 6d 65 73 73 61 67 65 2e 20 49 74 20 69  or message. It i
5f30: 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69  s the responsibi
5f40: 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c  lity of the call
5f50: 65 72 0a 2a 2a 20 74 6f 20 65 76 65 6e 74 75 61  er.** to eventua
5f60: 6c 6c 79 20 66 72 65 65 20 74 68 69 73 20 62 75  lly free this bu
5f70: 66 66 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74  ffer using sqlit
5f80: 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 73 74  e3_free()..*/.st
5f90: 61 74 69 63 20 69 6e 74 20 72 65 73 65 74 41 6e  atic int resetAn
5fa0: 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 73 71  dCollectError(sq
5fb0: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
5fc0: 74 2c 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 6d  t, char **pzErrm
5fd0: 73 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  sg){.  int rc = 
5fe0: 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53  sqlite3_reset(pS
5ff0: 74 6d 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  tmt);.  if( rc!=
6000: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
6010: 20 2a 70 7a 45 72 72 6d 73 67 20 3d 20 73 71 6c   *pzErrmsg = sql
6020: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
6030: 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ", sqlite3_errms
6040: 67 28 73 71 6c 69 74 65 33 5f 64 62 5f 68 61 6e  g(sqlite3_db_han
6050: 64 6c 65 28 70 53 74 6d 74 29 29 29 3b 0a 20 20  dle(pStmt)));.  
6060: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
6070: 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 69  ../*.** Unless i
6080: 74 20 69 73 20 4e 55 4c 4c 2c 20 61 72 67 75 6d  t is NULL, argum
6090: 65 6e 74 20 7a 53 71 6c 20 70 6f 69 6e 74 73 20  ent zSql points 
60a0: 74 6f 20 61 20 62 75 66 66 65 72 20 61 6c 6c 6f  to a buffer allo
60b0: 63 61 74 65 64 20 75 73 69 6e 67 0a 2a 2a 20 73  cated using.** s
60c0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 20 63 6f  qlite3_malloc co
60d0: 6e 74 61 69 6e 69 6e 67 20 61 6e 20 53 51 4c 20  ntaining an SQL 
60e0: 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20  statement. This 
60f0: 66 75 6e 63 74 69 6f 6e 20 70 72 65 70 61 72 65  function prepare
6100: 73 20 74 68 65 20 53 51 4c 0a 2a 2a 20 73 74 61  s the SQL.** sta
6110: 74 65 6d 65 6e 74 20 61 67 61 69 6e 73 74 20 64  tement against d
6120: 61 74 61 62 61 73 65 20 64 62 20 61 6e 64 20 66  atabase db and f
6130: 72 65 65 73 20 74 68 65 20 62 75 66 66 65 72 2e  rees the buffer.
6140: 20 49 66 20 73 74 61 74 65 6d 65 6e 74 20 0a 2a   If statement .*
6150: 2a 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 69 73  * compilation is
6160: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 2a 70 70   successful, *pp
6170: 53 74 6d 74 20 69 73 20 73 65 74 20 74 6f 20 70  Stmt is set to p
6180: 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20  oint to the new 
6190: 73 74 61 74 65 6d 65 6e 74 20 0a 2a 2a 20 68 61  statement .** ha
61a0: 6e 64 6c 65 20 61 6e 64 20 53 51 4c 49 54 45 5f  ndle and SQLITE_
61b0: 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
61c0: 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
61d0: 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  , if an error oc
61e0: 63 75 72 73 2c 20 2a 70 70 53 74 6d 74 20 69 73  curs, *ppStmt is
61f0: 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64   set to NULL and
6200: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a   an error code.*
6210: 2a 20 72 65 74 75 72 6e 65 64 2e 20 49 6e 20 74  * returned. In t
6220: 68 69 73 20 63 61 73 65 2c 20 2a 70 7a 45 72 72  his case, *pzErr
6230: 6d 73 67 20 6d 61 79 20 61 6c 73 6f 20 62 65 20  msg may also be 
6240: 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
6250: 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 6d 65 73 73  an error.** mess
6260: 61 67 65 2e 20 49 74 20 69 73 20 74 68 65 20 72  age. It is the r
6270: 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
6280: 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 66   the caller to f
6290: 72 65 65 20 74 68 69 73 20 65 72 72 6f 72 20 6d  ree this error m
62a0: 65 73 73 61 67 65 0a 2a 2a 20 62 75 66 66 65 72  essage.** buffer
62b0: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 66   using sqlite3_f
62c0: 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ree()..**.** If 
62d0: 61 72 67 75 6d 65 6e 74 20 7a 53 71 6c 20 69 73  argument zSql is
62e0: 20 4e 55 4c 4c 2c 20 74 68 69 73 20 66 75 6e 63   NULL, this func
62f0: 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 61  tion assumes tha
6300: 74 20 61 6e 20 4f 4f 4d 20 68 61 73 20 6f 63 63  t an OOM has occ
6310: 75 72 72 65 64 2e 0a 2a 2a 20 49 6e 20 74 68 69  urred..** In thi
6320: 73 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f  s case SQLITE_NO
6330: 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64 20  MEM is returned 
6340: 61 6e 64 20 2a 70 70 53 74 6d 74 20 73 65 74 20  and *ppStmt set 
6350: 74 6f 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74  to NULL..*/.stat
6360: 69 63 20 69 6e 74 20 70 72 65 70 61 72 65 46 72  ic int prepareFr
6370: 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f  eeAndCollectErro
6380: 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  r(.  sqlite3 *db
6390: 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  , .  sqlite3_stm
63a0: 74 20 2a 2a 70 70 53 74 6d 74 2c 0a 20 20 63 68  t **ppStmt,.  ch
63b0: 61 72 20 2a 2a 70 7a 45 72 72 6d 73 67 2c 0a 20  ar **pzErrmsg,. 
63c0: 20 63 68 61 72 20 2a 7a 53 71 6c 0a 29 7b 0a 20   char *zSql.){. 
63d0: 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
63e0: 74 28 20 2a 70 7a 45 72 72 6d 73 67 3d 3d 30 20  t( *pzErrmsg==0 
63f0: 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30  );.  if( zSql==0
6400: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
6410: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 2a  ITE_NOMEM;.    *
6420: 70 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 65  ppStmt = 0;.  }e
6430: 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 70 72  lse{.    rc = pr
6440: 65 70 61 72 65 41 6e 64 43 6f 6c 6c 65 63 74 45  epareAndCollectE
6450: 72 72 6f 72 28 64 62 2c 20 70 70 53 74 6d 74 2c  rror(db, ppStmt,
6460: 20 70 7a 45 72 72 6d 73 67 2c 20 7a 53 71 6c 29   pzErrmsg, zSql)
6470: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
6480: 65 65 28 7a 53 71 6c 29 3b 0a 20 20 7d 0a 20 20  ee(zSql);.  }.  
6490: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
64a0: 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 52 62 75  .** Free the Rbu
64b0: 4f 62 6a 49 74 65 72 2e 61 7a 54 62 6c 43 6f 6c  ObjIter.azTblCol
64c0: 5b 5d 20 61 6e 64 20 52 62 75 4f 62 6a 49 74 65  [] and RbuObjIte
64d0: 72 2e 61 62 54 62 6c 50 6b 5b 5d 20 61 72 72 61  r.abTblPk[] arra
64e0: 79 73 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20  ys allocated.** 
64f0: 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20 63 61  by an earlier ca
6500: 6c 6c 20 74 6f 20 72 62 75 4f 62 6a 49 74 65 72  ll to rbuObjIter
6510: 43 61 63 68 65 54 61 62 6c 65 49 6e 66 6f 28 29  CacheTableInfo()
6520: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
6530: 20 72 62 75 4f 62 6a 49 74 65 72 46 72 65 65 43   rbuObjIterFreeC
6540: 6f 6c 73 28 52 62 75 4f 62 6a 49 74 65 72 20 2a  ols(RbuObjIter *
6550: 70 49 74 65 72 29 7b 0a 20 20 69 6e 74 20 69 3b  pIter){.  int i;
6560: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49  .  for(i=0; i<pI
6570: 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 3b 20 69 2b  ter->nTblCol; i+
6580: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  +){.    sqlite3_
6590: 66 72 65 65 28 70 49 74 65 72 2d 3e 61 7a 54 62  free(pIter->azTb
65a0: 6c 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20 73 71  lCol[i]);.    sq
65b0: 6c 69 74 65 33 5f 66 72 65 65 28 70 49 74 65 72  lite3_free(pIter
65c0: 2d 3e 61 7a 54 62 6c 54 79 70 65 5b 69 5d 29 3b  ->azTblType[i]);
65d0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
65e0: 72 65 65 28 70 49 74 65 72 2d 3e 61 7a 54 62 6c  ree(pIter->azTbl
65f0: 43 6f 6c 29 3b 0a 20 20 70 49 74 65 72 2d 3e 61  Col);.  pIter->a
6600: 7a 54 62 6c 43 6f 6c 20 3d 20 30 3b 0a 20 20 70  zTblCol = 0;.  p
6610: 49 74 65 72 2d 3e 61 7a 54 62 6c 54 79 70 65 20  Iter->azTblType 
6620: 3d 20 30 3b 0a 20 20 70 49 74 65 72 2d 3e 61 69  = 0;.  pIter->ai
6630: 53 72 63 4f 72 64 65 72 20 3d 20 30 3b 0a 20 20  SrcOrder = 0;.  
6640: 70 49 74 65 72 2d 3e 61 62 54 62 6c 50 6b 20 3d  pIter->abTblPk =
6650: 20 30 3b 0a 20 20 70 49 74 65 72 2d 3e 61 62 4e   0;.  pIter->abN
6660: 6f 74 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 70 49  otNull = 0;.  pI
6670: 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 20 3d 20 30  ter->nTblCol = 0
6680: 3b 0a 20 20 70 49 74 65 72 2d 3e 65 54 79 70 65  ;.  pIter->eType
6690: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
66a0: 20 20 20 20 2f 2a 20 49 6e 76 61 6c 69 64 20 76      /* Invalid v
66b0: 61 6c 75 65 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a  alue */.}../*.**
66c0: 20 46 69 6e 61 6c 69 7a 65 20 61 6c 6c 20 73 74   Finalize all st
66d0: 61 74 65 6d 65 6e 74 73 20 61 6e 64 20 66 72 65  atements and fre
66e0: 65 20 61 6c 6c 20 61 6c 6c 6f 63 61 74 69 6f 6e  e all allocation
66f0: 73 20 74 68 61 74 20 61 72 65 20 73 70 65 63 69  s that are speci
6700: 66 69 63 20 74 6f 0a 2a 2a 20 74 68 65 20 63 75  fic to.** the cu
6710: 72 72 65 6e 74 20 6f 62 6a 65 63 74 20 28 74 61  rrent object (ta
6720: 62 6c 65 2f 69 6e 64 65 78 20 70 61 69 72 29 2e  ble/index pair).
6730: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6740: 72 62 75 4f 62 6a 49 74 65 72 43 6c 65 61 72 53  rbuObjIterClearS
6750: 74 61 74 65 6d 65 6e 74 73 28 52 62 75 4f 62 6a  tatements(RbuObj
6760: 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
6770: 52 62 75 55 70 64 61 74 65 53 74 6d 74 20 2a 70  RbuUpdateStmt *p
6780: 55 70 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66  Up;..  sqlite3_f
6790: 69 6e 61 6c 69 7a 65 28 70 49 74 65 72 2d 3e 70  inalize(pIter->p
67a0: 53 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69 74  Select);.  sqlit
67b0: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 49 74 65  e3_finalize(pIte
67c0: 72 2d 3e 70 49 6e 73 65 72 74 29 3b 0a 20 20 73  r->pInsert);.  s
67d0: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
67e0: 70 49 74 65 72 2d 3e 70 44 65 6c 65 74 65 29 3b  pIter->pDelete);
67f0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c  .  sqlite3_final
6800: 69 7a 65 28 70 49 74 65 72 2d 3e 70 54 6d 70 49  ize(pIter->pTmpI
6810: 6e 73 65 72 74 29 3b 0a 20 20 70 55 70 20 3d 20  nsert);.  pUp = 
6820: 70 49 74 65 72 2d 3e 70 52 62 75 55 70 64 61 74  pIter->pRbuUpdat
6830: 65 3b 0a 20 20 77 68 69 6c 65 28 20 70 55 70 20  e;.  while( pUp 
6840: 29 7b 0a 20 20 20 20 52 62 75 55 70 64 61 74 65  ){.    RbuUpdate
6850: 53 74 6d 74 20 2a 70 54 6d 70 20 3d 20 70 55 70  Stmt *pTmp = pUp
6860: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c  ->pNext;.    sql
6870: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 55  ite3_finalize(pU
6880: 70 2d 3e 70 55 70 64 61 74 65 29 3b 0a 20 20 20  p->pUpdate);.   
6890: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 55   sqlite3_free(pU
68a0: 70 29 3b 0a 20 20 20 20 70 55 70 20 3d 20 70 54  p);.    pUp = pT
68b0: 6d 70 3b 0a 20 20 7d 0a 20 20 0a 20 20 70 49 74  mp;.  }.  .  pIt
68c0: 65 72 2d 3e 70 53 65 6c 65 63 74 20 3d 20 30 3b  er->pSelect = 0;
68d0: 0a 20 20 70 49 74 65 72 2d 3e 70 49 6e 73 65 72  .  pIter->pInser
68e0: 74 20 3d 20 30 3b 0a 20 20 70 49 74 65 72 2d 3e  t = 0;.  pIter->
68f0: 70 44 65 6c 65 74 65 20 3d 20 30 3b 0a 20 20 70  pDelete = 0;.  p
6900: 49 74 65 72 2d 3e 70 52 62 75 55 70 64 61 74 65  Iter->pRbuUpdate
6910: 20 3d 20 30 3b 0a 20 20 70 49 74 65 72 2d 3e 70   = 0;.  pIter->p
6920: 54 6d 70 49 6e 73 65 72 74 20 3d 20 30 3b 0a 20  TmpInsert = 0;. 
6930: 20 70 49 74 65 72 2d 3e 6e 43 6f 6c 20 3d 20 30   pIter->nCol = 0
6940: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e  ;.}../*.** Clean
6950: 20 75 70 20 61 6e 79 20 72 65 73 6f 75 72 63 65   up any resource
6960: 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 73 20 70  s allocated as p
6970: 61 72 74 20 6f 66 20 74 68 65 20 69 74 65 72 61  art of the itera
6980: 74 6f 72 20 6f 62 6a 65 63 74 20 70 61 73 73 65  tor object passe
6990: 64 0a 2a 2a 20 61 73 20 74 68 65 20 6f 6e 6c 79  d.** as the only
69a0: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   argument..*/.st
69b0: 61 74 69 63 20 76 6f 69 64 20 72 62 75 4f 62 6a  atic void rbuObj
69c0: 49 74 65 72 46 69 6e 61 6c 69 7a 65 28 52 62 75  IterFinalize(Rbu
69d0: 4f 62 6a 49 74 65 72 20 2a 70 49 74 65 72 29 7b  ObjIter *pIter){
69e0: 0a 20 20 72 62 75 4f 62 6a 49 74 65 72 43 6c 65  .  rbuObjIterCle
69f0: 61 72 53 74 61 74 65 6d 65 6e 74 73 28 70 49 74  arStatements(pIt
6a00: 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  er);.  sqlite3_f
6a10: 69 6e 61 6c 69 7a 65 28 70 49 74 65 72 2d 3e 70  inalize(pIter->p
6a20: 54 62 6c 49 74 65 72 29 3b 0a 20 20 73 71 6c 69  TblIter);.  sqli
6a30: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 49 74  te3_finalize(pIt
6a40: 65 72 2d 3e 70 49 64 78 49 74 65 72 29 3b 0a 20  er->pIdxIter);. 
6a50: 20 72 62 75 4f 62 6a 49 74 65 72 46 72 65 65 43   rbuObjIterFreeC
6a60: 6f 6c 73 28 70 49 74 65 72 29 3b 0a 20 20 6d 65  ols(pIter);.  me
6a70: 6d 73 65 74 28 70 49 74 65 72 2c 20 30 2c 20 73  mset(pIter, 0, s
6a80: 69 7a 65 6f 66 28 52 62 75 4f 62 6a 49 74 65 72  izeof(RbuObjIter
6a90: 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76  ));.}../*.** Adv
6aa0: 61 6e 63 65 20 74 68 65 20 69 74 65 72 61 74 6f  ance the iterato
6ab0: 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 70 6f  r to the next po
6ac0: 73 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  sition..**.** If
6ad0: 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
6ae0: 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
6af0: 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20  eturned and the 
6b00: 69 74 65 72 61 74 6f 72 20 69 73 20 6c 65 66 74  iterator is left
6b10: 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74 6f   .** pointing to
6b20: 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 2e   the next entry.
6b30: 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20 65   Otherwise, an e
6b40: 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 6d 65  rror code and me
6b50: 73 73 61 67 65 20 69 73 20 0a 2a 2a 20 6c 65 66  ssage is .** lef
6b60: 74 20 69 6e 20 74 68 65 20 52 42 55 20 68 61 6e  t in the RBU han
6b70: 64 6c 65 20 70 61 73 73 65 64 20 61 73 20 74 68  dle passed as th
6b80: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
6b90: 2e 20 41 20 63 6f 70 79 20 6f 66 20 74 68 65 20  . A copy of the 
6ba0: 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69  .** error code i
6bb0: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
6bc0: 74 61 74 69 63 20 69 6e 74 20 72 62 75 4f 62 6a  tatic int rbuObj
6bd0: 49 74 65 72 4e 65 78 74 28 73 71 6c 69 74 65 33  IterNext(sqlite3
6be0: 72 62 75 20 2a 70 2c 20 52 62 75 4f 62 6a 49 74  rbu *p, RbuObjIt
6bf0: 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e  er *pIter){.  in
6c00: 74 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 20 20  t rc = p->rc;.  
6c10: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
6c20: 4b 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 46 72 65  K ){..    /* Fre
6c30: 65 20 61 6e 79 20 53 51 4c 69 74 65 20 73 74 61  e any SQLite sta
6c40: 74 65 6d 65 6e 74 73 20 75 73 65 64 20 77 68 69  tements used whi
6c50: 6c 65 20 70 72 6f 63 65 73 73 69 6e 67 20 74 68  le processing th
6c60: 65 20 70 72 65 76 69 6f 75 73 20 6f 62 6a 65 63  e previous objec
6c70: 74 20 2a 2f 20 0a 20 20 20 20 72 62 75 4f 62 6a  t */ .    rbuObj
6c80: 49 74 65 72 43 6c 65 61 72 53 74 61 74 65 6d 65  IterClearStateme
6c90: 6e 74 73 28 70 49 74 65 72 29 3b 0a 20 20 20 20  nts(pIter);.    
6ca0: 69 66 28 20 70 49 74 65 72 2d 3e 7a 49 64 78 3d  if( pIter->zIdx=
6cb0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
6cc0: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d   sqlite3_exec(p-
6cd0: 3e 64 62 4d 61 69 6e 2c 0a 20 20 20 20 20 20 20  >dbMain,.       
6ce0: 20 20 20 22 44 52 4f 50 20 54 52 49 47 47 45 52     "DROP TRIGGER
6cf0: 20 49 46 20 45 58 49 53 54 53 20 74 65 6d 70 2e   IF EXISTS temp.
6d00: 72 62 75 5f 69 6e 73 65 72 74 5f 74 72 3b 22 0a  rbu_insert_tr;".
6d10: 20 20 20 20 20 20 20 20 20 20 22 44 52 4f 50 20            "DROP 
6d20: 54 52 49 47 47 45 52 20 49 46 20 45 58 49 53 54  TRIGGER IF EXIST
6d30: 53 20 74 65 6d 70 2e 72 62 75 5f 75 70 64 61 74  S temp.rbu_updat
6d40: 65 31 5f 74 72 3b 22 0a 20 20 20 20 20 20 20 20  e1_tr;".        
6d50: 20 20 22 44 52 4f 50 20 54 52 49 47 47 45 52 20    "DROP TRIGGER 
6d60: 49 46 20 45 58 49 53 54 53 20 74 65 6d 70 2e 72  IF EXISTS temp.r
6d70: 62 75 5f 75 70 64 61 74 65 32 5f 74 72 3b 22 0a  bu_update2_tr;".
6d80: 20 20 20 20 20 20 20 20 20 20 22 44 52 4f 50 20            "DROP 
6d90: 54 52 49 47 47 45 52 20 49 46 20 45 58 49 53 54  TRIGGER IF EXIST
6da0: 53 20 74 65 6d 70 2e 72 62 75 5f 64 65 6c 65 74  S temp.rbu_delet
6db0: 65 5f 74 72 3b 22 0a 20 20 20 20 20 20 20 20 20  e_tr;".         
6dc0: 20 2c 20 30 2c 20 30 2c 20 26 70 2d 3e 7a 45 72   , 0, 0, &p->zEr
6dd0: 72 6d 73 67 0a 20 20 20 20 20 20 29 3b 0a 20 20  rmsg.      );.  
6de0: 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d    }..    if( rc=
6df0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
6e00: 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 62      if( pIter->b
6e10: 43 6c 65 61 6e 75 70 20 29 7b 0a 20 20 20 20 20  Cleanup ){.     
6e20: 20 20 20 72 62 75 4f 62 6a 49 74 65 72 46 72 65     rbuObjIterFre
6e30: 65 43 6f 6c 73 28 70 49 74 65 72 29 3b 0a 20 20  eCols(pIter);.  
6e40: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 62 43 6c        pIter->bCl
6e50: 65 61 6e 75 70 20 3d 20 30 3b 0a 20 20 20 20 20  eanup = 0;.     
6e60: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
6e70: 73 74 65 70 28 70 49 74 65 72 2d 3e 70 54 62 6c  step(pIter->pTbl
6e80: 49 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69  Iter);.        i
6e90: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 52 4f  f( rc!=SQLITE_RO
6ea0: 57 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  W ){.          r
6eb0: 63 20 3d 20 72 65 73 65 74 41 6e 64 43 6f 6c 6c  c = resetAndColl
6ec0: 65 63 74 45 72 72 6f 72 28 70 49 74 65 72 2d 3e  ectError(pIter->
6ed0: 70 54 62 6c 49 74 65 72 2c 20 26 70 2d 3e 7a 45  pTblIter, &p->zE
6ee0: 72 72 6d 73 67 29 3b 0a 20 20 20 20 20 20 20 20  rrmsg);.        
6ef0: 20 20 70 49 74 65 72 2d 3e 7a 54 62 6c 20 3d 20    pIter->zTbl = 
6f00: 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  0;.        }else
6f10: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65  {.          pIte
6f20: 72 2d 3e 7a 54 62 6c 20 3d 20 28 63 6f 6e 73 74  r->zTbl = (const
6f30: 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63   char*)sqlite3_c
6f40: 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 49 74 65 72  olumn_text(pIter
6f50: 2d 3e 70 54 62 6c 49 74 65 72 2c 20 30 29 3b 0a  ->pTblIter, 0);.
6f60: 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d            pIter-
6f70: 3e 7a 44 61 74 61 54 62 6c 20 3d 20 28 63 6f 6e  >zDataTbl = (con
6f80: 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
6f90: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 49 74  _column_text(pIt
6fa0: 65 72 2d 3e 70 54 62 6c 49 74 65 72 2c 31 29 3b  er->pTblIter,1);
6fb0: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
6fc0: 28 70 49 74 65 72 2d 3e 7a 44 61 74 61 54 62 6c  (pIter->zDataTbl
6fd0: 20 26 26 20 70 49 74 65 72 2d 3e 7a 54 62 6c 29   && pIter->zTbl)
6fe0: 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53   ? SQLITE_OK : S
6ff0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
7000: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
7010: 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  se{.        if( 
7020: 70 49 74 65 72 2d 3e 7a 49 64 78 3d 3d 30 20 29  pIter->zIdx==0 )
7030: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
7040: 74 65 33 5f 73 74 6d 74 20 2a 70 49 64 78 20 3d  te3_stmt *pIdx =
7050: 20 70 49 74 65 72 2d 3e 70 49 64 78 49 74 65 72   pIter->pIdxIter
7060: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
7070: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65   sqlite3_bind_te
7080: 78 74 28 70 49 64 78 2c 20 31 2c 20 70 49 74 65  xt(pIdx, 1, pIte
7090: 72 2d 3e 7a 54 62 6c 2c 20 2d 31 2c 20 53 51 4c  r->zTbl, -1, SQL
70a0: 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  ITE_STATIC);.   
70b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
70c0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
70d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
70e0: 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28   = sqlite3_step(
70f0: 70 49 74 65 72 2d 3e 70 49 64 78 49 74 65 72 29  pIter->pIdxIter)
7100: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
7110: 72 63 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  rc!=SQLITE_ROW )
7120: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
7130: 20 3d 20 72 65 73 65 74 41 6e 64 43 6f 6c 6c 65   = resetAndColle
7140: 63 74 45 72 72 6f 72 28 70 49 74 65 72 2d 3e 70  ctError(pIter->p
7150: 49 64 78 49 74 65 72 2c 20 26 70 2d 3e 7a 45 72  IdxIter, &p->zEr
7160: 72 6d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20  rmsg);.         
7170: 20 20 20 70 49 74 65 72 2d 3e 62 43 6c 65 61 6e     pIter->bClean
7180: 75 70 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  up = 1;.        
7190: 20 20 20 20 70 49 74 65 72 2d 3e 7a 49 64 78 20      pIter->zIdx 
71a0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 0;.          }
71b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
71c0: 20 20 70 49 74 65 72 2d 3e 7a 49 64 78 20 3d 20    pIter->zIdx = 
71d0: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
71e0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
71f0: 28 70 49 74 65 72 2d 3e 70 49 64 78 49 74 65 72  (pIter->pIdxIter
7200: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
7210: 20 20 70 49 74 65 72 2d 3e 69 54 6e 75 6d 20 3d    pIter->iTnum =
7220: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
7230: 69 6e 74 28 70 49 74 65 72 2d 3e 70 49 64 78 49  int(pIter->pIdxI
7240: 74 65 72 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  ter, 1);.       
7250: 20 20 20 20 20 70 49 74 65 72 2d 3e 62 55 6e 69       pIter->bUni
7260: 71 75 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  que = sqlite3_co
7270: 6c 75 6d 6e 5f 69 6e 74 28 70 49 74 65 72 2d 3e  lumn_int(pIter->
7280: 70 49 64 78 49 74 65 72 2c 20 32 29 3b 0a 20 20  pIdxIter, 2);.  
7290: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
72a0: 49 74 65 72 2d 3e 7a 49 64 78 20 3f 20 53 51 4c  Iter->zIdx ? SQL
72b0: 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49 54 45 5f  ITE_OK : SQLITE_
72c0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20  NOMEM;.         
72d0: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
72e0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
72f0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
7300: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 62 75 4f 62  _OK ){.    rbuOb
7310: 6a 49 74 65 72 46 69 6e 61 6c 69 7a 65 28 70 49  jIterFinalize(pI
7320: 74 65 72 29 3b 0a 20 20 20 20 70 2d 3e 72 63 20  ter);.    p->rc 
7330: 3d 20 72 63 3b 0a 20 20 7d 0a 20 20 72 65 74 75  = rc;.  }.  retu
7340: 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
7350: 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   The implementat
7360: 69 6f 6e 20 6f 66 20 74 68 65 20 72 62 75 5f 74  ion of the rbu_t
7370: 61 72 67 65 74 5f 6e 61 6d 65 28 29 20 53 51 4c  arget_name() SQL
7380: 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 69 73 20   function. This 
7390: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 63 63 65  function.** acce
73a0: 70 74 73 20 6f 6e 65 20 6f 72 20 74 77 6f 20 61  pts one or two a
73b0: 72 67 75 6d 65 6e 74 73 2e 20 54 68 65 20 66 69  rguments. The fi
73c0: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  rst argument is 
73d0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 74 61  the name of a ta
73e0: 62 6c 65 20 2d 0a 2a 2a 20 74 68 65 20 6e 61 6d  ble -.** the nam
73f0: 65 20 6f 66 20 61 20 74 61 62 6c 65 20 69 6e 20  e of a table in 
7400: 74 68 65 20 52 42 55 20 64 61 74 61 62 61 73 65  the RBU database
7410: 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 2c 20 69  .  The second, i
7420: 66 20 69 74 20 69 73 20 70 72 65 73 65 6e 74 2c  f it is present,
7430: 20 69 73 20 31 0a 2a 2a 20 66 6f 72 20 61 20 76   is 1.** for a v
7440: 69 65 77 20 6f 72 20 30 20 66 6f 72 20 61 20 74  iew or 0 for a t
7450: 61 62 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72  able. .**.** For
7460: 20 61 20 6e 6f 6e 2d 76 61 63 75 75 6d 20 52 42   a non-vacuum RB
7470: 55 20 68 61 6e 64 6c 65 2c 20 69 66 20 74 68 65  U handle, if the
7480: 20 74 61 62 6c 65 20 6e 61 6d 65 20 6d 61 74 63   table name matc
7490: 68 65 73 20 74 68 65 20 70 61 74 74 65 72 6e 3a  hes the pattern:
74a0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 64 61 74 61 5b  .**.**     data[
74b0: 30 2d 39 5d 5f 3c 6e 61 6d 65 3e 0a 2a 2a 0a 2a  0-9]_<name>.**.*
74c0: 2a 20 77 68 65 72 65 20 3c 6e 61 6d 65 3e 20 69  * where <name> i
74d0: 73 20 61 6e 79 20 73 65 71 75 65 6e 63 65 20 6f  s any sequence o
74e0: 66 20 31 20 6f 72 20 6d 6f 72 65 20 63 68 61 72  f 1 or more char
74f0: 61 63 74 65 72 73 2c 20 3c 6e 61 6d 65 3e 20 69  acters, <name> i
7500: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 4f  s returned..** O
7510: 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65  therwise, if the
7520: 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20 64   only argument d
7530: 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68  oes not match th
7540: 65 20 61 62 6f 76 65 20 70 61 74 74 65 72 6e 2c  e above pattern,
7550: 20 61 6e 20 53 51 4c 0a 2a 2a 20 4e 55 4c 4c 20   an SQL.** NULL 
7560: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
7570: 2a 2a 20 20 20 20 20 22 64 61 74 61 5f 74 31 22  **     "data_t1"
7580: 20 20 20 20 20 2d 3e 20 22 74 31 22 0a 2a 2a 20       -> "t1".** 
7590: 20 20 20 20 22 64 61 74 61 30 31 32 33 5f 74 32      "data0123_t2
75a0: 22 20 2d 3e 20 22 74 32 22 0a 2a 2a 20 20 20 20  " -> "t2".**    
75b0: 20 22 64 61 74 61 41 42 5f 74 33 22 20 20 20 2d   "dataAB_t3"   -
75c0: 3e 20 4e 55 4c 4c 0a 2a 2a 0a 2a 2a 20 46 6f 72  > NULL.**.** For
75d0: 20 61 6e 20 72 62 75 20 76 61 63 75 75 6d 20 68   an rbu vacuum h
75e0: 61 6e 64 6c 65 2c 20 61 20 63 6f 70 79 20 6f 66  andle, a copy of
75f0: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
7600: 65 6e 74 20 69 73 20 72 65 74 75 72 6e 65 64 20  ent is returned 
7610: 69 66 0a 2a 2a 20 74 68 65 20 73 65 63 6f 6e 64  if.** the second
7620: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 65 69 74   argument is eit
7630: 68 65 72 20 6d 69 73 73 69 6e 67 20 6f 72 20 30  her missing or 0
7640: 20 28 6e 6f 74 20 61 20 76 69 65 77 29 2e 0a 2a   (not a view)..*
7650: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62  /.static void rb
7660: 75 54 61 72 67 65 74 4e 61 6d 65 46 75 6e 63 28  uTargetNameFunc(
7670: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
7680: 78 74 20 2a 70 43 74 78 2c 0a 20 20 69 6e 74 20  xt *pCtx,.  int 
7690: 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f  argc,.  sqlite3_
76a0: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
76b0: 20 20 73 71 6c 69 74 65 33 72 62 75 20 2a 70 20    sqlite3rbu *p 
76c0: 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64  = sqlite3_user_d
76d0: 61 74 61 28 70 43 74 78 29 3b 0a 20 20 63 6f 6e  ata(pCtx);.  con
76e0: 73 74 20 63 68 61 72 20 2a 7a 49 6e 3b 0a 20 20  st char *zIn;.  
76f0: 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d 31 20  assert( argc==1 
7700: 7c 7c 20 61 72 67 63 3d 3d 32 20 29 3b 0a 0a 20  || argc==2 );.. 
7710: 20 7a 49 6e 20 3d 20 28 63 6f 6e 73 74 20 63 68   zIn = (const ch
7720: 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
7730: 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b  e_text(argv[0]);
7740: 0a 20 20 69 66 28 20 7a 49 6e 20 29 7b 0a 20 20  .  if( zIn ){.  
7750: 20 20 69 66 28 20 72 62 75 49 73 56 61 63 75 75    if( rbuIsVacuu
7760: 6d 28 70 29 20 29 7b 0a 20 20 20 20 20 20 69 66  m(p) ){.      if
7770: 28 20 61 72 67 63 3d 3d 31 20 7c 7c 20 30 3d 3d  ( argc==1 || 0==
7780: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
7790: 74 28 61 72 67 76 5b 31 5d 29 20 29 7b 0a 20 20  t(argv[1]) ){.  
77a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
77b0: 73 75 6c 74 5f 74 65 78 74 28 70 43 74 78 2c 20  sult_text(pCtx, 
77c0: 7a 49 6e 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  zIn, -1, SQLITE_
77d0: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 7d  STATIC);.      }
77e0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
77f0: 20 20 69 66 28 20 73 74 72 6c 65 6e 28 7a 49 6e    if( strlen(zIn
7800: 29 3e 34 20 26 26 20 6d 65 6d 63 6d 70 28 22 64  )>4 && memcmp("d
7810: 61 74 61 22 2c 20 7a 49 6e 2c 20 34 29 3d 3d 30  ata", zIn, 4)==0
7820: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
7830: 69 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  i;.        for(i
7840: 3d 34 3b 20 7a 49 6e 5b 69 5d 3e 3d 27 30 27 20  =4; zIn[i]>='0' 
7850: 26 26 20 7a 49 6e 5b 69 5d 3c 3d 27 39 27 3b 20  && zIn[i]<='9'; 
7860: 69 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20 69 66  i++);.        if
7870: 28 20 7a 49 6e 5b 69 5d 3d 3d 27 5f 27 20 26 26  ( zIn[i]=='_' &&
7880: 20 7a 49 6e 5b 69 2b 31 5d 20 29 7b 0a 20 20 20   zIn[i+1] ){.   
7890: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
78a0: 65 73 75 6c 74 5f 74 65 78 74 28 70 43 74 78 2c  esult_text(pCtx,
78b0: 20 26 7a 49 6e 5b 69 2b 31 5d 2c 20 2d 31 2c 20   &zIn[i+1], -1, 
78c0: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
78d0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
78e0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
78f0: 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
7900: 74 68 65 20 69 74 65 72 61 74 6f 72 20 73 74 72  the iterator str
7910: 75 63 74 75 72 65 20 70 61 73 73 65 64 20 61 73  ucture passed as
7920: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
7930: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  ment..**.** If n
7940: 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  o error occurs, 
7950: 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
7960: 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 69 74  urned and the it
7970: 65 72 61 74 6f 72 20 69 73 20 6c 65 66 74 20 0a  erator is left .
7980: 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  ** pointing to t
7990: 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 2e 20  he first entry. 
79a0: 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20 65 72  Otherwise, an er
79b0: 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 6d 65 73  ror code and mes
79c0: 73 61 67 65 20 69 73 20 0a 2a 2a 20 6c 65 66 74  sage is .** left
79d0: 20 69 6e 20 74 68 65 20 52 42 55 20 68 61 6e 64   in the RBU hand
79e0: 6c 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  le passed as the
79f0: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
7a00: 20 41 20 63 6f 70 79 20 6f 66 20 74 68 65 20 0a   A copy of the .
7a10: 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  ** error code is
7a20: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
7a30: 61 74 69 63 20 69 6e 74 20 72 62 75 4f 62 6a 49  atic int rbuObjI
7a40: 74 65 72 46 69 72 73 74 28 73 71 6c 69 74 65 33  terFirst(sqlite3
7a50: 72 62 75 20 2a 70 2c 20 52 62 75 4f 62 6a 49 74  rbu *p, RbuObjIt
7a60: 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e  er *pIter){.  in
7a70: 74 20 72 63 3b 0a 20 20 6d 65 6d 73 65 74 28 70  t rc;.  memset(p
7a80: 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Iter, 0, sizeof(
7a90: 52 62 75 4f 62 6a 49 74 65 72 29 29 3b 0a 0a 20  RbuObjIter));.. 
7aa0: 20 72 63 20 3d 20 70 72 65 70 61 72 65 46 72 65   rc = prepareFre
7ab0: 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72  eAndCollectError
7ac0: 28 70 2d 3e 64 62 52 62 75 2c 20 26 70 49 74 65  (p->dbRbu, &pIte
7ad0: 72 2d 3e 70 54 62 6c 49 74 65 72 2c 20 26 70 2d  r->pTblIter, &p-
7ae0: 3e 7a 45 72 72 6d 73 67 2c 20 0a 20 20 20 20 73  >zErrmsg, .    s
7af0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a  qlite3_mprintf(.
7b00: 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 72 62        "SELECT rb
7b10: 75 5f 74 61 72 67 65 74 5f 6e 61 6d 65 28 6e 61  u_target_name(na
7b20: 6d 65 2c 20 74 79 70 65 3d 27 76 69 65 77 27 29  me, type='view')
7b30: 20 41 53 20 74 61 72 67 65 74 2c 20 6e 61 6d 65   AS target, name
7b40: 20 22 0a 20 20 20 20 20 20 22 46 52 4f 4d 20 73   ".      "FROM s
7b50: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 22 0a 20  qlite_master ". 
7b60: 20 20 20 20 20 22 57 48 45 52 45 20 74 79 70 65       "WHERE type
7b70: 20 49 4e 20 28 27 74 61 62 6c 65 27 2c 20 27 76   IN ('table', 'v
7b80: 69 65 77 27 29 20 41 4e 44 20 74 61 72 67 65 74  iew') AND target
7b90: 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 22 0a 20   IS NOT NULL ". 
7ba0: 20 20 20 20 20 22 20 25 73 20 22 0a 20 20 20 20       " %s ".    
7bb0: 20 20 22 4f 52 44 45 52 20 42 59 20 6e 61 6d 65    "ORDER BY name
7bc0: 22 0a 20 20 2c 20 72 62 75 49 73 56 61 63 75 75  ".  , rbuIsVacuu
7bd0: 6d 28 70 29 20 3f 20 22 41 4e 44 20 72 6f 6f 74  m(p) ? "AND root
7be0: 70 61 67 65 21 3d 30 20 41 4e 44 20 72 6f 6f 74  page!=0 AND root
7bf0: 70 61 67 65 20 49 53 20 4e 4f 54 20 4e 55 4c 4c  page IS NOT NULL
7c00: 22 20 3a 20 22 22 29 29 3b 0a 0a 20 20 69 66 28  " : ""));..  if(
7c10: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
7c20: 7b 0a 20 20 20 20 72 63 20 3d 20 70 72 65 70 61  {.    rc = prepa
7c30: 72 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f  reAndCollectErro
7c40: 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 70 49  r(p->dbMain, &pI
7c50: 74 65 72 2d 3e 70 49 64 78 49 74 65 72 2c 20 26  ter->pIdxIter, &
7c60: 70 2d 3e 7a 45 72 72 6d 73 67 2c 0a 20 20 20 20  p->zErrmsg,.    
7c70: 20 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d 65      "SELECT name
7c80: 2c 20 72 6f 6f 74 70 61 67 65 2c 20 73 71 6c 20  , rootpage, sql 
7c90: 49 53 20 4e 55 4c 4c 20 4f 52 20 73 75 62 73 74  IS NULL OR subst
7ca0: 72 28 38 2c 20 36 29 3d 3d 27 55 4e 49 51 55 45  r(8, 6)=='UNIQUE
7cb0: 27 20 22 0a 20 20 20 20 20 20 20 20 22 20 20 46  ' ".        "  F
7cc0: 52 4f 4d 20 6d 61 69 6e 2e 73 71 6c 69 74 65 5f  ROM main.sqlite_
7cd0: 6d 61 73 74 65 72 20 22 0a 20 20 20 20 20 20 20  master ".       
7ce0: 20 22 20 20 57 48 45 52 45 20 74 79 70 65 3d 27   "  WHERE type='
7cf0: 69 6e 64 65 78 27 20 41 4e 44 20 74 62 6c 5f 6e  index' AND tbl_n
7d00: 61 6d 65 20 3d 20 3f 22 0a 20 20 20 20 29 3b 0a  ame = ?".    );.
7d10: 20 20 7d 0a 0a 20 20 70 49 74 65 72 2d 3e 62 43    }..  pIter->bC
7d20: 6c 65 61 6e 75 70 20 3d 20 31 3b 0a 20 20 70 2d  leanup = 1;.  p-
7d30: 3e 72 63 20 3d 20 72 63 3b 0a 20 20 72 65 74 75  >rc = rc;.  retu
7d40: 72 6e 20 72 62 75 4f 62 6a 49 74 65 72 4e 65 78  rn rbuObjIterNex
7d50: 74 28 70 2c 20 70 49 74 65 72 29 3b 0a 7d 0a 0a  t(p, pIter);.}..
7d60: 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  /*.** This is a 
7d70: 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 22  wrapper around "
7d80: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
7d90: 7a 46 6d 74 2c 20 2e 2e 2e 29 22 2e 20 49 66 20  zFmt, ...)". If 
7da0: 61 6e 20 4f 4f 4d 20 6f 63 63 75 72 73 2c 0a 2a  an OOM occurs,.*
7db0: 2a 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  * an error code 
7dc0: 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  is stored in the
7dd0: 20 52 42 55 20 68 61 6e 64 6c 65 20 70 61 73 73   RBU handle pass
7de0: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
7df0: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  argument..**.** 
7e00: 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20  If an error has 
7e10: 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64  already occurred
7e20: 20 28 70 2d 3e 72 63 20 69 73 20 61 6c 72 65 61   (p->rc is alrea
7e30: 64 79 20 73 65 74 20 74 6f 20 73 6f 6d 65 74 68  dy set to someth
7e40: 69 6e 67 20 6f 74 68 65 72 0a 2a 2a 20 74 68 61  ing other.** tha
7e50: 6e 20 53 51 4c 49 54 45 5f 4f 4b 29 2c 20 74 68  n SQLITE_OK), th
7e60: 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
7e70: 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 77 69   returns NULL wi
7e80: 74 68 6f 75 74 20 6d 6f 64 69 66 79 69 6e 67 20  thout modifying 
7e90: 74 68 65 0a 2a 2a 20 73 74 6f 72 65 64 20 65 72  the.** stored er
7ea0: 72 6f 72 20 63 6f 64 65 2e 20 49 6e 20 74 68 69  ror code. In thi
7eb0: 73 20 63 61 73 65 20 69 74 20 73 74 69 6c 6c 20  s case it still 
7ec0: 63 61 6c 6c 73 20 73 71 6c 69 74 65 33 5f 66 72  calls sqlite3_fr
7ed0: 65 65 28 29 20 6f 6e 20 61 6e 79 20 0a 2a 2a 20  ee() on any .** 
7ee0: 70 72 69 6e 74 66 28 29 20 70 61 72 61 6d 65 74  printf() paramet
7ef0: 65 72 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ers associated w
7f00: 69 74 68 20 25 7a 20 63 6f 6e 76 65 72 73 69 6f  ith %z conversio
7f10: 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  ns..*/.static ch
7f20: 61 72 20 2a 72 62 75 4d 50 72 69 6e 74 66 28 73  ar *rbuMPrintf(s
7f30: 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 63 6f  qlite3rbu *p, co
7f40: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d 74 2c 20  nst char *zFmt, 
7f50: 2e 2e 2e 29 7b 0a 20 20 63 68 61 72 20 2a 7a 53  ...){.  char *zS
7f60: 71 6c 20 3d 20 30 3b 0a 20 20 76 61 5f 6c 69 73  ql = 0;.  va_lis
7f70: 74 20 61 70 3b 0a 20 20 76 61 5f 73 74 61 72 74  t ap;.  va_start
7f80: 28 61 70 2c 20 7a 46 6d 74 29 3b 0a 20 20 7a 53  (ap, zFmt);.  zS
7f90: 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 6d 70  ql = sqlite3_vmp
7fa0: 72 69 6e 74 66 28 7a 46 6d 74 2c 20 61 70 29 3b  rintf(zFmt, ap);
7fb0: 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
7fc0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
7fd0: 66 28 20 7a 53 71 6c 3d 3d 30 20 29 20 70 2d 3e  f( zSql==0 ) p->
7fe0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
7ff0: 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  M;.  }else{.    
8000: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71  sqlite3_free(zSq
8010: 6c 29 3b 0a 20 20 20 20 7a 53 71 6c 20 3d 20 30  l);.    zSql = 0
8020: 3b 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61  ;.  }.  va_end(a
8030: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 53 71  p);.  return zSq
8040: 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75  l;.}../*.** Argu
8050: 6d 65 6e 74 20 7a 46 6d 74 20 69 73 20 61 20 73  ment zFmt is a s
8060: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 29  qlite3_mprintf()
8070: 20 73 74 79 6c 65 20 66 6f 72 6d 61 74 20 73 74   style format st
8080: 72 69 6e 67 2e 20 54 68 65 20 74 72 61 69 6c 69  ring. The traili
8090: 6e 67 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20  ng.** arguments 
80a0: 61 72 65 20 74 68 65 20 75 73 75 61 6c 20 73 75  are the usual su
80b0: 62 73 69 74 75 74 69 6f 6e 20 76 61 6c 75 65 73  bsitution values
80c0: 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
80d0: 70 65 72 66 6f 72 6d 73 0a 2a 2a 20 74 68 65 20  performs.** the 
80e0: 70 72 69 6e 74 66 28 29 20 73 74 79 6c 65 20 73  printf() style s
80f0: 75 62 73 74 69 74 75 74 69 6f 6e 73 20 61 6e 64  ubstitutions and
8100: 20 65 78 65 63 75 74 65 73 20 74 68 65 20 72 65   executes the re
8110: 73 75 6c 74 20 61 73 20 61 6e 20 53 51 4c 0a 2a  sult as an SQL.*
8120: 2a 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 74  * statement on t
8130: 68 65 20 52 42 55 20 68 61 6e 64 6c 65 73 20 64  he RBU handles d
8140: 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  atabase..**.** I
8150: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
8160: 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  s, an error code
8170: 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61   and error messa
8180: 67 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  ge is stored in 
8190: 74 68 65 0a 2a 2a 20 52 42 55 20 68 61 6e 64 6c  the.** RBU handl
81a0: 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68  e. If an error h
81b0: 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72  as already occur
81c0: 72 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75  red when this fu
81d0: 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 63 61 6c  nction is.** cal
81e0: 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d  led, it is a no-
81f0: 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  op..*/.static in
8200: 74 20 72 62 75 4d 50 72 69 6e 74 66 45 78 65 63  t rbuMPrintfExec
8210: 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20  (sqlite3rbu *p, 
8220: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e  sqlite3 *db, con
8230: 73 74 20 63 68 61 72 20 2a 7a 46 6d 74 2c 20 2e  st char *zFmt, .
8240: 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61  ..){.  va_list a
8250: 70 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b  p;.  char *zSql;
8260: 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20  .  va_start(ap, 
8270: 7a 46 6d 74 29 3b 0a 20 20 7a 53 71 6c 20 3d 20  zFmt);.  zSql = 
8280: 73 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74 66  sqlite3_vmprintf
8290: 28 7a 46 6d 74 2c 20 61 70 29 3b 0a 20 20 69 66  (zFmt, ap);.  if
82a0: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
82b0: 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 7a 53  OK ){.    if( zS
82c0: 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  ql==0 ){.      p
82d0: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ->rc = SQLITE_NO
82e0: 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  MEM;.    }else{.
82f0: 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71        p->rc = sq
8300: 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20 7a  lite3_exec(db, z
8310: 53 71 6c 2c 20 30 2c 20 30 2c 20 26 70 2d 3e 7a  Sql, 0, 0, &p->z
8320: 45 72 72 6d 73 67 29 3b 0a 20 20 20 20 7d 0a 20  Errmsg);.    }. 
8330: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
8340: 65 28 7a 53 71 6c 29 3b 0a 20 20 76 61 5f 65 6e  e(zSql);.  va_en
8350: 64 28 61 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  d(ap);.  return 
8360: 70 2d 3e 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  p->rc;.}../*.** 
8370: 41 74 74 65 6d 70 74 20 74 6f 20 61 6c 6c 6f 63  Attempt to alloc
8380: 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61  ate and return a
8390: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 7a 65   pointer to a ze
83a0: 72 6f 65 64 20 62 6c 6f 63 6b 20 6f 66 20 6e 42  roed block of nB
83b0: 79 74 65 20 0a 2a 2a 20 62 79 74 65 73 2e 20 0a  yte .** bytes. .
83c0: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
83d0: 72 20 28 69 2e 65 2e 20 61 6e 20 4f 4f 4d 20 63  r (i.e. an OOM c
83e0: 6f 6e 64 69 74 69 6f 6e 29 20 6f 63 63 75 72 73  ondition) occurs
83f0: 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e  , return NULL an
8400: 64 20 6c 65 61 76 65 20 61 6e 20 0a 2a 2a 20 65  d leave an .** e
8410: 72 72 6f 72 20 63 6f 64 65 20 69 6e 20 74 68 65  rror code in the
8420: 20 72 62 75 20 68 61 6e 64 6c 65 20 70 61 73 73   rbu handle pass
8430: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
8440: 61 72 67 75 6d 65 6e 74 2e 20 4f 72 2c 20 69 66  argument. Or, if
8450: 20 61 6e 20 0a 2a 2a 20 65 72 72 6f 72 20 68 61   an .** error ha
8460: 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72  s already occurr
8470: 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ed when this fun
8480: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
8490: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 0a 2a 2a   return NULL .**
84a0: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 77 69 74   immediately wit
84b0: 68 6f 75 74 20 61 74 74 65 6d 70 74 69 6e 67 20  hout attempting 
84c0: 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f  the allocation o
84d0: 72 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20  r modifying the 
84e0: 73 74 6f 72 65 64 0a 2a 2a 20 65 72 72 6f 72 20  stored.** error 
84f0: 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  code..*/.static 
8500: 76 6f 69 64 20 2a 72 62 75 4d 61 6c 6c 6f 63 28  void *rbuMalloc(
8510: 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 69  sqlite3rbu *p, i
8520: 6e 74 20 6e 42 79 74 65 29 7b 0a 20 20 76 6f 69  nt nByte){.  voi
8530: 64 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 69  d *pRet = 0;.  i
8540: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
8550: 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OK ){.    asser
8560: 74 28 20 6e 42 79 74 65 3e 30 20 29 3b 0a 20 20  t( nByte>0 );.  
8570: 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33    pRet = sqlite3
8580: 5f 6d 61 6c 6c 6f 63 36 34 28 6e 42 79 74 65 29  _malloc64(nByte)
8590: 3b 0a 20 20 20 20 69 66 28 20 70 52 65 74 3d 3d  ;.    if( pRet==
85a0: 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63  0 ){.      p->rc
85b0: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
85c0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
85d0: 20 20 6d 65 6d 73 65 74 28 70 52 65 74 2c 20 30    memset(pRet, 0
85e0: 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 7d 0a  , nByte);.    }.
85f0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65    }.  return pRe
8600: 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  t;.}.../*.** All
8610: 6f 63 61 74 65 20 61 6e 64 20 7a 65 72 6f 20 74  ocate and zero t
8620: 68 65 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43  he pIter->azTblC
8630: 6f 6c 5b 5d 20 61 6e 64 20 61 62 54 62 6c 50 6b  ol[] and abTblPk
8640: 5b 5d 20 61 72 72 61 79 73 20 73 6f 20 74 68 61  [] arrays so tha
8650: 74 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 72 6f  t.** there is ro
8660: 6f 6d 20 66 6f 72 20 61 74 20 6c 65 61 73 74 20  om for at least 
8670: 6e 43 6f 6c 20 65 6c 65 6d 65 6e 74 73 2e 20 49  nCol elements. I
8680: 66 20 61 6e 20 4f 4f 4d 20 6f 63 63 75 72 73 2c  f an OOM occurs,
8690: 20 73 74 6f 72 65 20 61 6e 0a 2a 2a 20 65 72 72   store an.** err
86a0: 6f 72 20 63 6f 64 65 20 69 6e 20 74 68 65 20 52  or code in the R
86b0: 42 55 20 68 61 6e 64 6c 65 20 70 61 73 73 65 64  BU handle passed
86c0: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
86d0: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  gument..*/.stati
86e0: 63 20 76 6f 69 64 20 72 62 75 41 6c 6c 6f 63 61  c void rbuAlloca
86f0: 74 65 49 74 65 72 41 72 72 61 79 73 28 73 71 6c  teIterArrays(sql
8700: 69 74 65 33 72 62 75 20 2a 70 2c 20 52 62 75 4f  ite3rbu *p, RbuO
8710: 62 6a 49 74 65 72 20 2a 70 49 74 65 72 2c 20 69  bjIter *pIter, i
8720: 6e 74 20 6e 43 6f 6c 29 7b 0a 20 20 69 6e 74 20  nt nCol){.  int 
8730: 6e 42 79 74 65 20 3d 20 28 32 2a 73 69 7a 65 6f  nByte = (2*sizeo
8740: 66 28 63 68 61 72 2a 29 20 2b 20 73 69 7a 65 6f  f(char*) + sizeo
8750: 66 28 69 6e 74 29 20 2b 20 33 2a 73 69 7a 65 6f  f(int) + 3*sizeo
8760: 66 28 75 38 29 29 20 2a 20 6e 43 6f 6c 3b 0a 20  f(u8)) * nCol;. 
8770: 20 63 68 61 72 20 2a 2a 61 7a 4e 65 77 3b 0a 0a   char **azNew;..
8780: 20 20 61 7a 4e 65 77 20 3d 20 28 63 68 61 72 2a    azNew = (char*
8790: 2a 29 72 62 75 4d 61 6c 6c 6f 63 28 70 2c 20 6e  *)rbuMalloc(p, n
87a0: 42 79 74 65 29 3b 0a 20 20 69 66 28 20 61 7a 4e  Byte);.  if( azN
87b0: 65 77 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d  ew ){.    pIter-
87c0: 3e 61 7a 54 62 6c 43 6f 6c 20 3d 20 61 7a 4e 65  >azTblCol = azNe
87d0: 77 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 61 7a  w;.    pIter->az
87e0: 54 62 6c 54 79 70 65 20 3d 20 26 61 7a 4e 65 77  TblType = &azNew
87f0: 5b 6e 43 6f 6c 5d 3b 0a 20 20 20 20 70 49 74 65  [nCol];.    pIte
8800: 72 2d 3e 61 69 53 72 63 4f 72 64 65 72 20 3d 20  r->aiSrcOrder = 
8810: 28 69 6e 74 2a 29 26 70 49 74 65 72 2d 3e 61 7a  (int*)&pIter->az
8820: 54 62 6c 54 79 70 65 5b 6e 43 6f 6c 5d 3b 0a 20  TblType[nCol];. 
8830: 20 20 20 70 49 74 65 72 2d 3e 61 62 54 62 6c 50     pIter->abTblP
8840: 6b 20 3d 20 28 75 38 2a 29 26 70 49 74 65 72 2d  k = (u8*)&pIter-
8850: 3e 61 69 53 72 63 4f 72 64 65 72 5b 6e 43 6f 6c  >aiSrcOrder[nCol
8860: 5d 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 61 62  ];.    pIter->ab
8870: 4e 6f 74 4e 75 6c 6c 20 3d 20 28 75 38 2a 29 26  NotNull = (u8*)&
8880: 70 49 74 65 72 2d 3e 61 62 54 62 6c 50 6b 5b 6e  pIter->abTblPk[n
8890: 43 6f 6c 5d 3b 0a 20 20 20 20 70 49 74 65 72 2d  Col];.    pIter-
88a0: 3e 61 62 49 6e 64 65 78 65 64 20 3d 20 28 75 38  >abIndexed = (u8
88b0: 2a 29 26 70 49 74 65 72 2d 3e 61 62 4e 6f 74 4e  *)&pIter->abNotN
88c0: 75 6c 6c 5b 6e 43 6f 6c 5d 3b 0a 20 20 7d 0a 7d  ull[nCol];.  }.}
88d0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ../*.** The firs
88e0: 74 20 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20  t argument must 
88f0: 62 65 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  be a nul-termina
8900: 74 65 64 20 73 74 72 69 6e 67 2e 20 54 68 69 73  ted string. This
8910: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 72 65 74   function.** ret
8920: 75 72 6e 73 20 61 20 63 6f 70 79 20 6f 66 20 74  urns a copy of t
8930: 68 65 20 73 74 72 69 6e 67 20 69 6e 20 6d 65 6d  he string in mem
8940: 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ory obtained fro
8950: 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
8960: 28 29 2e 0a 2a 2a 20 49 74 20 69 73 20 74 68 65  ()..** It is the
8970: 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
8980: 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  of the caller to
8990: 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65   eventually free
89a0: 20 74 68 69 73 20 6d 65 6d 6f 72 79 0a 2a 2a 20   this memory.** 
89b0: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 72  using sqlite3_fr
89c0: 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ee()..**.** If a
89d0: 6e 20 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e 20  n OOM condition 
89e0: 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 77  is encountered w
89f0: 68 65 6e 20 61 74 74 65 6d 70 74 69 6e 67 20 74  hen attempting t
8a00: 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72  o allocate memor
8a10: 79 2c 0a 2a 2a 20 6f 75 74 70 75 74 20 76 61 72  y,.** output var
8a20: 69 61 62 6c 65 20 28 2a 70 52 63 29 20 69 73 20  iable (*pRc) is 
8a30: 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4e 4f  set to SQLITE_NO
8a40: 4d 45 4d 20 62 65 66 6f 72 65 20 72 65 74 75 72  MEM before retur
8a50: 6e 69 6e 67 2e 20 4f 74 68 65 72 77 69 73 65 2c  ning. Otherwise,
8a60: 0a 2a 2a 20 69 66 20 74 68 65 20 61 6c 6c 6f 63  .** if the alloc
8a70: 61 74 69 6f 6e 20 73 75 63 63 65 65 64 73 2c 20  ation succeeds, 
8a80: 28 2a 70 52 63 29 20 69 73 20 6c 65 66 74 20 75  (*pRc) is left u
8a90: 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 73 74 61  nchanged..*/.sta
8aa0: 74 69 63 20 63 68 61 72 20 2a 72 62 75 53 74 72  tic char *rbuStr
8ab0: 6e 64 75 70 28 63 6f 6e 73 74 20 63 68 61 72 20  ndup(const char 
8ac0: 2a 7a 53 74 72 2c 20 69 6e 74 20 2a 70 52 63 29  *zStr, int *pRc)
8ad0: 7b 0a 20 20 63 68 61 72 20 2a 7a 52 65 74 20 3d  {.  char *zRet =
8ae0: 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 2a   0;..  assert( *
8af0: 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  pRc==SQLITE_OK )
8b00: 3b 0a 20 20 69 66 28 20 7a 53 74 72 20 29 7b 0a  ;.  if( zStr ){.
8b10: 20 20 20 20 73 69 7a 65 5f 74 20 6e 43 6f 70 79      size_t nCopy
8b20: 20 3d 20 73 74 72 6c 65 6e 28 7a 53 74 72 29 20   = strlen(zStr) 
8b30: 2b 20 31 3b 0a 20 20 20 20 7a 52 65 74 20 3d 20  + 1;.    zRet = 
8b40: 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 6d  (char*)sqlite3_m
8b50: 61 6c 6c 6f 63 36 34 28 6e 43 6f 70 79 29 3b 0a  alloc64(nCopy);.
8b60: 20 20 20 20 69 66 28 20 7a 52 65 74 20 29 7b 0a      if( zRet ){.
8b70: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 52 65        memcpy(zRe
8b80: 74 2c 20 7a 53 74 72 2c 20 6e 43 6f 70 79 29 3b  t, zStr, nCopy);
8b90: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
8ba0: 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f    *pRc = SQLITE_
8bb0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d  NOMEM;.    }.  }
8bc0: 0a 0a 20 20 72 65 74 75 72 6e 20 7a 52 65 74 3b  ..  return zRet;
8bd0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 61 6c 69  .}../*.** Finali
8be0: 7a 65 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ze the statement
8bf0: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
8c00: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a  econd argument..
8c10: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 71 6c  **.** If the sql
8c20: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 29 20  ite3_finalize() 
8c30: 63 61 6c 6c 20 69 6e 64 69 63 61 74 65 73 20 74  call indicates t
8c40: 68 61 74 20 61 6e 20 65 72 72 6f 72 20 6f 63 63  hat an error occ
8c50: 75 72 73 2c 20 61 6e 64 20 74 68 65 0a 2a 2a 20  urs, and the.** 
8c60: 72 62 75 20 68 61 6e 64 6c 65 20 65 72 72 6f 72  rbu handle error
8c70: 20 63 6f 64 65 20 69 73 20 6e 6f 74 20 61 6c 72   code is not alr
8c80: 65 61 64 79 20 73 65 74 2c 20 73 65 74 20 74 68  eady set, set th
8c90: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64  e error code and
8ca0: 20 65 72 72 6f 72 0a 2a 2a 20 6d 65 73 73 61 67   error.** messag
8cb0: 65 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a  e accordingly..*
8cc0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62  /.static void rb
8cd0: 75 46 69 6e 61 6c 69 7a 65 28 73 71 6c 69 74 65  uFinalize(sqlite
8ce0: 33 72 62 75 20 2a 70 2c 20 73 71 6c 69 74 65 33  3rbu *p, sqlite3
8cf0: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 29 7b 0a 20  _stmt *pStmt){. 
8d00: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73   sqlite3 *db = s
8d10: 71 6c 69 74 65 33 5f 64 62 5f 68 61 6e 64 6c 65  qlite3_db_handle
8d20: 28 70 53 74 6d 74 29 3b 0a 20 20 69 6e 74 20 72  (pStmt);.  int r
8d30: 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  c = sqlite3_fina
8d40: 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 69  lize(pStmt);.  i
8d50: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
8d60: 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54  _OK && rc!=SQLIT
8d70: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d 3e 72  E_OK ){.    p->r
8d80: 63 20 3d 20 72 63 3b 0a 20 20 20 20 70 2d 3e 7a  c = rc;.    p->z
8d90: 45 72 72 6d 73 67 20 3d 20 73 71 6c 69 74 65 33  Errmsg = sqlite3
8da0: 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 73  _mprintf("%s", s
8db0: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62  qlite3_errmsg(db
8dc0: 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 44 65  ));.  }.}../* De
8dd0: 74 65 72 6d 69 6e 65 20 74 68 65 20 74 79 70 65  termine the type
8de0: 20 6f 66 20 61 20 74 61 62 6c 65 2e 0a 2a 2a 0a   of a table..**.
8df0: 2a 2a 20 20 20 70 65 54 79 70 65 20 69 73 20 6f  **   peType is o
8e00: 66 20 74 79 70 65 20 28 69 6e 74 2a 29 2c 20 61  f type (int*), a
8e10: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f   pointer to an o
8e20: 75 74 70 75 74 20 70 61 72 61 6d 65 74 65 72 20  utput parameter 
8e30: 6f 66 20 74 79 70 65 0a 2a 2a 20 20 20 28 69 6e  of type.**   (in
8e40: 74 29 2e 20 54 68 69 73 20 63 61 6c 6c 20 73 65  t). This call se
8e50: 74 73 20 74 68 65 20 6f 75 74 70 75 74 20 70 61  ts the output pa
8e60: 72 61 6d 65 74 65 72 20 61 73 20 66 6f 6c 6c 6f  rameter as follo
8e70: 77 73 2c 20 64 65 70 65 6e 64 69 6e 67 0a 2a 2a  ws, depending.**
8e80: 20 20 20 6f 6e 20 74 68 65 20 74 79 70 65 20 6f     on the type o
8e90: 66 20 74 68 65 20 74 61 62 6c 65 20 73 70 65 63  f the table spec
8ea0: 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74  ified by paramet
8eb0: 65 72 73 20 64 62 4e 61 6d 65 20 61 6e 64 20 7a  ers dbName and z
8ec0: 54 62 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52  Tbl..**.**     R
8ed0: 42 55 5f 50 4b 5f 4e 4f 54 41 42 4c 45 3a 20 20  BU_PK_NOTABLE:  
8ee0: 20 20 20 20 20 4e 6f 20 73 75 63 68 20 74 61 62       No such tab
8ef0: 6c 65 2e 0a 2a 2a 20 20 20 20 20 52 42 55 5f 50  le..**     RBU_P
8f00: 4b 5f 4e 4f 4e 45 3a 20 20 20 20 20 20 20 20 20  K_NONE:         
8f10: 20 54 61 62 6c 65 20 68 61 73 20 61 6e 20 69 6d   Table has an im
8f20: 70 6c 69 63 69 74 20 72 6f 77 69 64 2e 0a 2a 2a  plicit rowid..**
8f30: 20 20 20 20 20 52 42 55 5f 50 4b 5f 49 50 4b 3a       RBU_PK_IPK:
8f40: 20 20 20 20 20 20 20 20 20 20 20 54 61 62 6c 65             Table
8f50: 20 68 61 73 20 61 6e 20 65 78 70 6c 69 63 69 74   has an explicit
8f60: 20 49 50 4b 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 20   IPK column..** 
8f70: 20 20 20 20 52 42 55 5f 50 4b 5f 45 58 54 45 52      RBU_PK_EXTER
8f80: 4e 41 4c 3a 20 20 20 20 20 20 54 61 62 6c 65 20  NAL:      Table 
8f90: 68 61 73 20 61 6e 20 65 78 74 65 72 6e 61 6c 20  has an external 
8fa0: 50 4b 20 69 6e 64 65 78 2e 0a 2a 2a 20 20 20 20  PK index..**    
8fb0: 20 52 42 55 5f 50 4b 5f 57 49 54 48 4f 55 54 5f   RBU_PK_WITHOUT_
8fc0: 52 4f 57 49 44 3a 20 54 61 62 6c 65 20 69 73 20  ROWID: Table is 
8fd0: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 2e 0a 2a  WITHOUT ROWID..*
8fe0: 2a 20 20 20 20 20 52 42 55 5f 50 4b 5f 56 54 41  *     RBU_PK_VTA
8ff0: 42 3a 20 20 20 20 20 20 20 20 20 20 54 61 62 6c  B:          Tabl
9000: 65 20 69 73 20 61 20 76 69 72 74 75 61 6c 20 74  e is a virtual t
9010: 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 41 72  able..**.**   Ar
9020: 67 75 6d 65 6e 74 20 2a 70 69 50 6b 20 69 73 20  gument *piPk is 
9030: 61 6c 73 6f 20 6f 66 20 74 79 70 65 20 28 69 6e  also of type (in
9040: 74 2a 29 2c 20 61 6e 64 20 61 6c 73 6f 20 70 6f  t*), and also po
9050: 69 6e 74 73 20 74 6f 20 61 6e 20 6f 75 74 70 75  ints to an outpu
9060: 74 0a 2a 2a 20 20 20 70 61 72 61 6d 65 74 65 72  t.**   parameter
9070: 2e 20 55 6e 6c 65 73 73 20 74 68 65 20 74 61 62  . Unless the tab
9080: 6c 65 20 68 61 73 20 61 6e 20 65 78 74 65 72 6e  le has an extern
9090: 61 6c 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69  al primary key i
90a0: 6e 64 65 78 20 0a 2a 2a 20 20 20 28 69 2e 65 2e  ndex .**   (i.e.
90b0: 20 75 6e 6c 65 73 73 20 2a 70 65 54 79 70 65 20   unless *peType 
90c0: 69 73 20 73 65 74 20 74 6f 20 33 29 2c 20 74 68  is set to 3), th
90d0: 65 6e 20 2a 70 69 50 6b 20 69 73 20 73 65 74 20  en *piPk is set 
90e0: 74 6f 20 7a 65 72 6f 2e 20 4f 72 2c 0a 2a 2a 20  to zero. Or,.** 
90f0: 20 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 64    if the table d
9100: 6f 65 73 20 68 61 76 65 20 61 6e 20 65 78 74 65  oes have an exte
9110: 72 6e 61 6c 20 70 72 69 6d 61 72 79 20 6b 65 79  rnal primary key
9120: 20 69 6e 64 65 78 2c 20 74 68 65 6e 20 2a 70 69   index, then *pi
9130: 50 6b 0a 2a 2a 20 20 20 69 73 20 73 65 74 20 74  Pk.**   is set t
9140: 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  o the root page 
9150: 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 72  number of the pr
9160: 69 6d 61 72 79 20 6b 65 79 20 69 6e 64 65 78 20  imary key index 
9170: 62 65 66 6f 72 65 0a 2a 2a 20 20 20 72 65 74 75  before.**   retu
9180: 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 4c 47  rning..**.** ALG
9190: 4f 52 49 54 48 4d 3a 0a 2a 2a 0a 2a 2a 20 20 20  ORITHM:.**.**   
91a0: 69 66 28 20 6e 6f 20 65 6e 74 72 79 20 65 78 69  if( no entry exi
91b0: 73 74 73 20 69 6e 20 73 71 6c 69 74 65 5f 6d 61  sts in sqlite_ma
91c0: 73 74 65 72 20 29 7b 0a 2a 2a 20 20 20 20 20 72  ster ){.**     r
91d0: 65 74 75 72 6e 20 52 42 55 5f 50 4b 5f 4e 4f 54  eturn RBU_PK_NOT
91e0: 41 42 4c 45 0a 2a 2a 20 20 20 7d 65 6c 73 65 20  ABLE.**   }else 
91f0: 69 66 28 20 73 71 6c 20 66 6f 72 20 74 68 65 20  if( sql for the 
9200: 65 6e 74 72 79 20 73 74 61 72 74 73 20 77 69 74  entry starts wit
9210: 68 20 22 43 52 45 41 54 45 20 56 49 52 54 55 41  h "CREATE VIRTUA
9220: 4c 22 20 29 7b 0a 2a 2a 20 20 20 20 20 72 65 74  L" ){.**     ret
9230: 75 72 6e 20 52 42 55 5f 50 4b 5f 56 54 41 42 0a  urn RBU_PK_VTAB.
9240: 2a 2a 20 20 20 7d 65 6c 73 65 20 69 66 28 20 22  **   }else if( "
9250: 50 52 41 47 4d 41 20 69 6e 64 65 78 5f 6c 69 73  PRAGMA index_lis
9260: 74 28 29 22 20 66 6f 72 20 74 68 65 20 74 61 62  t()" for the tab
9270: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 22 70  le contains a "p
9280: 6b 22 20 69 6e 64 65 78 20 29 7b 0a 2a 2a 20 20  k" index ){.**  
9290: 20 20 20 69 66 28 20 74 68 65 20 69 6e 64 65 78     if( the index
92a0: 20 74 68 61 74 20 69 73 20 74 68 65 20 70 6b 20   that is the pk 
92b0: 65 78 69 73 74 73 20 69 6e 20 73 71 6c 69 74 65  exists in sqlite
92c0: 5f 6d 61 73 74 65 72 20 29 7b 0a 2a 2a 20 20 20  _master ){.**   
92d0: 20 20 20 20 2a 70 69 50 4b 20 3d 20 72 6f 6f 74      *piPK = root
92e0: 70 61 67 65 20 6f 66 20 74 68 61 74 20 69 6e 64  page of that ind
92f0: 65 78 2e 0a 2a 2a 20 20 20 20 20 20 20 72 65 74  ex..**       ret
9300: 75 72 6e 20 52 42 55 5f 50 4b 5f 45 58 54 45 52  urn RBU_PK_EXTER
9310: 4e 41 4c 0a 2a 2a 20 20 20 20 20 7d 65 6c 73 65  NAL.**     }else
9320: 7b 0a 2a 2a 20 20 20 20 20 20 20 72 65 74 75 72  {.**       retur
9330: 6e 20 52 42 55 5f 50 4b 5f 57 49 54 48 4f 55 54  n RBU_PK_WITHOUT
9340: 5f 52 4f 57 49 44 0a 2a 2a 20 20 20 20 20 7d 0a  _ROWID.**     }.
9350: 2a 2a 20 20 20 7d 65 6c 73 65 20 69 66 28 20 22  **   }else if( "
9360: 50 52 41 47 4d 41 20 74 61 62 6c 65 5f 69 6e 66  PRAGMA table_inf
9370: 6f 28 29 22 20 6c 69 73 74 73 20 6f 6e 65 20 6f  o()" lists one o
9380: 72 20 6d 6f 72 65 20 22 70 6b 22 20 63 6f 6c 75  r more "pk" colu
9390: 6d 6e 73 20 29 7b 0a 2a 2a 20 20 20 20 20 72 65  mns ){.**     re
93a0: 74 75 72 6e 20 52 42 55 5f 50 4b 5f 49 50 4b 0a  turn RBU_PK_IPK.
93b0: 2a 2a 20 20 20 7d 65 6c 73 65 7b 0a 2a 2a 20 20  **   }else{.**  
93c0: 20 20 20 72 65 74 75 72 6e 20 52 42 55 5f 50 4b     return RBU_PK
93d0: 5f 4e 4f 4e 45 0a 2a 2a 20 20 20 7d 0a 2a 2f 0a  _NONE.**   }.*/.
93e0: 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75 54  static void rbuT
93f0: 61 62 6c 65 54 79 70 65 28 0a 20 20 73 71 6c 69  ableType(.  sqli
9400: 74 65 33 72 62 75 20 2a 70 2c 0a 20 20 63 6f 6e  te3rbu *p,.  con
9410: 73 74 20 63 68 61 72 20 2a 7a 54 61 62 2c 0a 20  st char *zTab,. 
9420: 20 69 6e 74 20 2a 70 65 54 79 70 65 2c 0a 20 20   int *peType,.  
9430: 69 6e 74 20 2a 70 69 54 6e 75 6d 2c 0a 20 20 69  int *piTnum,.  i
9440: 6e 74 20 2a 70 69 50 6b 0a 29 7b 0a 20 20 2f 2a  nt *piPk.){.  /*
9450: 0a 20 20 2a 2a 20 30 29 20 53 45 4c 45 43 54 20  .  ** 0) SELECT 
9460: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 73 71  count(*) FROM sq
9470: 6c 69 74 65 5f 6d 61 73 74 65 72 20 77 68 65 72  lite_master wher
9480: 65 20 6e 61 6d 65 3d 25 51 20 41 4e 44 20 49 73  e name=%Q AND Is
9490: 56 69 72 74 75 61 6c 28 25 51 29 0a 20 20 2a 2a  Virtual(%Q).  **
94a0: 20 31 29 20 50 52 41 47 4d 41 20 69 6e 64 65 78   1) PRAGMA index
94b0: 5f 6c 69 73 74 20 3d 20 3f 0a 20 20 2a 2a 20 32  _list = ?.  ** 2
94c0: 29 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a  ) SELECT count(*
94d0: 29 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  ) FROM sqlite_ma
94e0: 73 74 65 72 20 77 68 65 72 65 20 6e 61 6d 65 3d  ster where name=
94f0: 25 51 20 0a 20 20 2a 2a 20 33 29 20 50 52 41 47  %Q .  ** 3) PRAG
9500: 4d 41 20 74 61 62 6c 65 5f 69 6e 66 6f 20 3d 20  MA table_info = 
9510: 3f 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ?.  */.  sqlite3
9520: 5f 73 74 6d 74 20 2a 61 53 74 6d 74 5b 34 5d 20  _stmt *aStmt[4] 
9530: 3d 20 7b 30 2c 20 30 2c 20 30 2c 20 30 7d 3b 0a  = {0, 0, 0, 0};.
9540: 0a 20 20 2a 70 65 54 79 70 65 20 3d 20 52 42 55  .  *peType = RBU
9550: 5f 50 4b 5f 4e 4f 54 41 42 4c 45 3b 0a 20 20 2a  _PK_NOTABLE;.  *
9560: 70 69 50 6b 20 3d 20 30 3b 0a 0a 20 20 61 73 73  piPk = 0;..  ass
9570: 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ert( p->rc==SQLI
9580: 54 45 5f 4f 4b 20 29 3b 0a 20 20 70 2d 3e 72 63  TE_OK );.  p->rc
9590: 20 3d 20 70 72 65 70 61 72 65 46 72 65 65 41 6e   = prepareFreeAn
95a0: 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d  dCollectError(p-
95b0: 3e 64 62 4d 61 69 6e 2c 20 26 61 53 74 6d 74 5b  >dbMain, &aStmt[
95c0: 30 5d 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c  0], &p->zErrmsg,
95d0: 20 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70   .    sqlite3_mp
95e0: 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20  rintf(.         
95f0: 20 22 53 45 4c 45 43 54 20 28 73 71 6c 20 4c 49   "SELECT (sql LI
9600: 4b 45 20 27 63 72 65 61 74 65 20 76 69 72 74 75  KE 'create virtu
9610: 61 6c 25 25 27 29 2c 20 72 6f 6f 74 70 61 67 65  al%%'), rootpage
9620: 22 0a 20 20 20 20 20 20 20 20 20 20 22 20 20 46  ".          "  F
9630: 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
9640: 72 22 0a 20 20 20 20 20 20 20 20 20 20 22 20 57  r".          " W
9650: 48 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c 20 7a  HERE name=%Q", z
9660: 54 61 62 0a 20 20 29 29 3b 0a 20 20 69 66 28 20  Tab.  ));.  if( 
9670: 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc!=SQLITE_OK
9680: 20 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74 65 70   || sqlite3_step
9690: 28 61 53 74 6d 74 5b 30 5d 29 21 3d 53 51 4c 49  (aStmt[0])!=SQLI
96a0: 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 2f 2a  TE_ROW ){.    /*
96b0: 20 45 69 74 68 65 72 20 61 6e 20 65 72 72 6f 72   Either an error
96c0: 2c 20 6f 72 20 6e 6f 20 73 75 63 68 20 74 61 62  , or no such tab
96d0: 6c 65 2e 20 2a 2f 0a 20 20 20 20 67 6f 74 6f 20  le. */.    goto 
96e0: 72 62 75 54 61 62 6c 65 54 79 70 65 5f 65 6e 64  rbuTableType_end
96f0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
9700: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 61  te3_column_int(a
9710: 53 74 6d 74 5b 30 5d 2c 20 30 29 20 29 7b 0a 20  Stmt[0], 0) ){. 
9720: 20 20 20 2a 70 65 54 79 70 65 20 3d 20 52 42 55     *peType = RBU
9730: 5f 50 4b 5f 56 54 41 42 3b 20 20 20 20 20 20 20  _PK_VTAB;       
9740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9750: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a   virtual table *
9760: 2f 0a 20 20 20 20 67 6f 74 6f 20 72 62 75 54 61  /.    goto rbuTa
9770: 62 6c 65 54 79 70 65 5f 65 6e 64 3b 0a 20 20 7d  bleType_end;.  }
9780: 0a 20 20 2a 70 69 54 6e 75 6d 20 3d 20 73 71 6c  .  *piTnum = sql
9790: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
97a0: 61 53 74 6d 74 5b 30 5d 2c 20 31 29 3b 0a 0a 20  aStmt[0], 1);.. 
97b0: 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65   p->rc = prepare
97c0: 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72  FreeAndCollectEr
97d0: 72 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 26  ror(p->dbMain, &
97e0: 61 53 74 6d 74 5b 31 5d 2c 20 26 70 2d 3e 7a 45  aStmt[1], &p->zE
97f0: 72 72 6d 73 67 2c 20 0a 20 20 20 20 73 71 6c 69  rrmsg, .    sqli
9800: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 50 52 41  te3_mprintf("PRA
9810: 47 4d 41 20 69 6e 64 65 78 5f 6c 69 73 74 3d 25  GMA index_list=%
9820: 51 22 2c 7a 54 61 62 29 0a 20 20 29 3b 0a 20 20  Q",zTab).  );.  
9830: 69 66 28 20 70 2d 3e 72 63 20 29 20 67 6f 74 6f  if( p->rc ) goto
9840: 20 72 62 75 54 61 62 6c 65 54 79 70 65 5f 65 6e   rbuTableType_en
9850: 64 3b 0a 20 20 77 68 69 6c 65 28 20 73 71 6c 69  d;.  while( sqli
9860: 74 65 33 5f 73 74 65 70 28 61 53 74 6d 74 5b 31  te3_step(aStmt[1
9870: 5d 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  ])==SQLITE_ROW )
9880: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a  {.    const u8 *
9890: 7a 4f 72 69 67 20 3d 20 73 71 6c 69 74 65 33 5f  zOrig = sqlite3_
98a0: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 61 53 74 6d  column_text(aStm
98b0: 74 5b 31 5d 2c 20 33 29 3b 0a 20 20 20 20 63 6f  t[1], 3);.    co
98c0: 6e 73 74 20 75 38 20 2a 7a 49 64 78 20 3d 20 73  nst u8 *zIdx = s
98d0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
98e0: 78 74 28 61 53 74 6d 74 5b 31 5d 2c 20 31 29 3b  xt(aStmt[1], 1);
98f0: 0a 20 20 20 20 69 66 28 20 7a 4f 72 69 67 20 26  .    if( zOrig &
9900: 26 20 7a 49 64 78 20 26 26 20 7a 4f 72 69 67 5b  & zIdx && zOrig[
9910: 30 5d 3d 3d 27 70 27 20 29 7b 0a 20 20 20 20 20  0]=='p' ){.     
9920: 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65   p->rc = prepare
9930: 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72  FreeAndCollectEr
9940: 72 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 26  ror(p->dbMain, &
9950: 61 53 74 6d 74 5b 32 5d 2c 20 26 70 2d 3e 7a 45  aStmt[2], &p->zE
9960: 72 72 6d 73 67 2c 20 0a 20 20 20 20 20 20 20 20  rrmsg, .        
9970: 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74    sqlite3_mprint
9980: 66 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  f(.            "
9990: 53 45 4c 45 43 54 20 72 6f 6f 74 70 61 67 65 20  SELECT rootpage 
99a0: 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
99b0: 65 72 20 57 48 45 52 45 20 6e 61 6d 65 20 3d 20  er WHERE name = 
99c0: 25 51 22 2c 20 7a 49 64 78 0a 20 20 20 20 20 20  %Q", zIdx.      
99d0: 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  ));.      if( p-
99e0: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
99f0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
9a00: 6c 69 74 65 33 5f 73 74 65 70 28 61 53 74 6d 74  lite3_step(aStmt
9a10: 5b 32 5d 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  [2])==SQLITE_ROW
9a20: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70   ){.          *p
9a30: 69 50 6b 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  iPk = sqlite3_co
9a40: 6c 75 6d 6e 5f 69 6e 74 28 61 53 74 6d 74 5b 32  lumn_int(aStmt[2
9a50: 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  ], 0);.         
9a60: 20 2a 70 65 54 79 70 65 20 3d 20 52 42 55 5f 50   *peType = RBU_P
9a70: 4b 5f 45 58 54 45 52 4e 41 4c 3b 0a 20 20 20 20  K_EXTERNAL;.    
9a80: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9a90: 20 20 20 20 20 2a 70 65 54 79 70 65 20 3d 20 52       *peType = R
9aa0: 42 55 5f 50 4b 5f 57 49 54 48 4f 55 54 5f 52 4f  BU_PK_WITHOUT_RO
9ab0: 57 49 44 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  WID;.        }. 
9ac0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74       }.      got
9ad0: 6f 20 72 62 75 54 61 62 6c 65 54 79 70 65 5f 65  o rbuTableType_e
9ae0: 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  nd;.    }.  }.. 
9af0: 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65   p->rc = prepare
9b00: 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72  FreeAndCollectEr
9b10: 72 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 26  ror(p->dbMain, &
9b20: 61 53 74 6d 74 5b 33 5d 2c 20 26 70 2d 3e 7a 45  aStmt[3], &p->zE
9b30: 72 72 6d 73 67 2c 20 0a 20 20 20 20 73 71 6c 69  rrmsg, .    sqli
9b40: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 50 52 41  te3_mprintf("PRA
9b50: 47 4d 41 20 74 61 62 6c 65 5f 69 6e 66 6f 3d 25  GMA table_info=%
9b60: 51 22 2c 7a 54 61 62 29 0a 20 20 29 3b 0a 20 20  Q",zTab).  );.  
9b70: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
9b80: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 77 68 69 6c  E_OK ){.    whil
9b90: 65 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  e( sqlite3_step(
9ba0: 61 53 74 6d 74 5b 33 5d 29 3d 3d 53 51 4c 49 54  aStmt[3])==SQLIT
9bb0: 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 69  E_ROW ){.      i
9bc0: 66 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  f( sqlite3_colum
9bd0: 6e 5f 69 6e 74 28 61 53 74 6d 74 5b 33 5d 2c 35  n_int(aStmt[3],5
9be0: 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  )>0 ){.        *
9bf0: 70 65 54 79 70 65 20 3d 20 52 42 55 5f 50 4b 5f  peType = RBU_PK_
9c00: 49 50 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  IPK;            
9c10: 20 20 20 20 2f 2a 20 65 78 70 6c 69 63 69 74 20      /* explicit 
9c20: 49 50 4b 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  IPK column */.  
9c30: 20 20 20 20 20 20 67 6f 74 6f 20 72 62 75 54 61        goto rbuTa
9c40: 62 6c 65 54 79 70 65 5f 65 6e 64 3b 0a 20 20 20  bleType_end;.   
9c50: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 2a     }.    }.    *
9c60: 70 65 54 79 70 65 20 3d 20 52 42 55 5f 50 4b 5f  peType = RBU_PK_
9c70: 4e 4f 4e 45 3b 0a 20 20 7d 0a 0a 72 62 75 54 61  NONE;.  }..rbuTa
9c80: 62 6c 65 54 79 70 65 5f 65 6e 64 3a 20 7b 0a 20  bleType_end: {. 
9c90: 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20     unsigned int 
9ca0: 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
9cb0: 69 3c 73 69 7a 65 6f 66 28 61 53 74 6d 74 29 2f  i<sizeof(aStmt)/
9cc0: 73 69 7a 65 6f 66 28 61 53 74 6d 74 5b 30 5d 29  sizeof(aStmt[0])
9cd0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 62  ; i++){.      rb
9ce0: 75 46 69 6e 61 6c 69 7a 65 28 70 2c 20 61 53 74  uFinalize(p, aSt
9cf0: 6d 74 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  mt[i]);.    }.  
9d00: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
9d10: 69 73 20 61 20 68 65 6c 70 65 72 20 66 75 6e 63  is a helper func
9d20: 74 69 6f 6e 20 66 6f 72 20 72 62 75 4f 62 6a 49  tion for rbuObjI
9d30: 74 65 72 43 61 63 68 65 54 61 62 6c 65 49 6e 66  terCacheTableInf
9d40: 6f 28 29 2e 20 49 74 20 70 6f 70 75 6c 61 74 65  o(). It populate
9d50: 73 0a 2a 2a 20 74 68 65 20 70 49 74 65 72 2d 3e  s.** the pIter->
9d60: 61 62 49 6e 64 65 78 65 64 5b 5d 20 61 72 72 61  abIndexed[] arra
9d70: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
9d80: 64 20 72 62 75 4f 62 6a 49 74 65 72 43 61 63 68  d rbuObjIterCach
9d90: 65 49 6e 64 65 78 65 64 43 6f 6c 73 28 73 71 6c  eIndexedCols(sql
9da0: 69 74 65 33 72 62 75 20 2a 70 2c 20 52 62 75 4f  ite3rbu *p, RbuO
9db0: 62 6a 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  bjIter *pIter){.
9dc0: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
9dd0: 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 69 6e 74  pList = 0;.  int
9de0: 20 62 49 6e 64 65 78 20 3d 20 30 3b 0a 0a 20 20   bIndex = 0;..  
9df0: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
9e00: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6d 65 6d 63  E_OK ){.    memc
9e10: 70 79 28 70 49 74 65 72 2d 3e 61 62 49 6e 64 65  py(pIter->abInde
9e20: 78 65 64 2c 20 70 49 74 65 72 2d 3e 61 62 54 62  xed, pIter->abTb
9e30: 6c 50 6b 2c 20 73 69 7a 65 6f 66 28 75 38 29 2a  lPk, sizeof(u8)*
9e40: 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 29 3b  pIter->nTblCol);
9e50: 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 72 65  .    p->rc = pre
9e60: 70 61 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65  pareFreeAndColle
9e70: 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 4d 61 69  ctError(p->dbMai
9e80: 6e 2c 20 26 70 4c 69 73 74 2c 20 26 70 2d 3e 7a  n, &pList, &p->z
9e90: 45 72 72 6d 73 67 2c 0a 20 20 20 20 20 20 20 20  Errmsg,.        
9ea0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
9eb0: 22 50 52 41 47 4d 41 20 6d 61 69 6e 2e 69 6e 64  "PRAGMA main.ind
9ec0: 65 78 5f 6c 69 73 74 20 3d 20 25 51 22 2c 20 70  ex_list = %Q", p
9ed0: 49 74 65 72 2d 3e 7a 54 62 6c 29 0a 20 20 20 20  Iter->zTbl).    
9ee0: 29 3b 0a 20 20 7d 0a 0a 20 20 70 49 74 65 72 2d  );.  }..  pIter-
9ef0: 3e 6e 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 77  >nIndex = 0;.  w
9f00: 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  hile( p->rc==SQL
9f10: 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45  ITE_OK && SQLITE
9f20: 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74  _ROW==sqlite3_st
9f30: 65 70 28 70 4c 69 73 74 29 20 29 7b 0a 20 20 20  ep(pList) ){.   
9f40: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64   const char *zId
9f50: 78 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  x = (const char*
9f60: 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
9f70: 74 65 78 74 28 70 4c 69 73 74 2c 20 31 29 3b 0a  text(pList, 1);.
9f80: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
9f90: 20 2a 70 58 49 6e 66 6f 20 3d 20 30 3b 0a 20 20   *pXInfo = 0;.  
9fa0: 20 20 69 66 28 20 7a 49 64 78 3d 3d 30 20 29 20    if( zIdx==0 ) 
9fb0: 62 72 65 61 6b 3b 0a 20 20 20 20 70 2d 3e 72 63  break;.    p->rc
9fc0: 20 3d 20 70 72 65 70 61 72 65 46 72 65 65 41 6e   = prepareFreeAn
9fd0: 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d  dCollectError(p-
9fe0: 3e 64 62 4d 61 69 6e 2c 20 26 70 58 49 6e 66 6f  >dbMain, &pXInfo
9ff0: 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 0a 20  , &p->zErrmsg,. 
a000: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d         sqlite3_m
a010: 70 72 69 6e 74 66 28 22 50 52 41 47 4d 41 20 6d  printf("PRAGMA m
a020: 61 69 6e 2e 69 6e 64 65 78 5f 78 69 6e 66 6f 20  ain.index_xinfo 
a030: 3d 20 25 51 22 2c 20 7a 49 64 78 29 0a 20 20 20  = %Q", zIdx).   
a040: 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70   );.    while( p
a050: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
a060: 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  && SQLITE_ROW==s
a070: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 58 49 6e  qlite3_step(pXIn
a080: 66 6f 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  fo) ){.      int
a090: 20 69 43 69 64 20 3d 20 73 71 6c 69 74 65 33 5f   iCid = sqlite3_
a0a0: 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 58 49 6e 66  column_int(pXInf
a0b0: 6f 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28  o, 1);.      if(
a0c0: 20 69 43 69 64 3e 3d 30 20 29 20 70 49 74 65 72   iCid>=0 ) pIter
a0d0: 2d 3e 61 62 49 6e 64 65 78 65 64 5b 69 43 69 64  ->abIndexed[iCid
a0e0: 5d 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  ] = 1;.    }.   
a0f0: 20 72 62 75 46 69 6e 61 6c 69 7a 65 28 70 2c 20   rbuFinalize(p, 
a100: 70 58 49 6e 66 6f 29 3b 0a 20 20 20 20 62 49 6e  pXInfo);.    bIn
a110: 64 65 78 20 3d 20 31 3b 0a 20 20 20 20 70 49 74  dex = 1;.    pIt
a120: 65 72 2d 3e 6e 49 6e 64 65 78 2b 2b 3b 0a 20 20  er->nIndex++;.  
a130: 7d 0a 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e  }..  if( pIter->
a140: 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 57 49  eType==RBU_PK_WI
a150: 54 48 4f 55 54 5f 52 4f 57 49 44 20 29 7b 0a 20  THOUT_ROWID ){. 
a160: 20 20 20 2f 2a 20 22 50 52 41 47 4d 41 20 69 6e     /* "PRAGMA in
a170: 64 65 78 5f 6c 69 73 74 22 20 69 6e 63 6c 75 64  dex_list" includ
a180: 65 73 20 74 68 65 20 6d 61 69 6e 20 50 4b 20 62  es the main PK b
a190: 2d 74 72 65 65 20 2a 2f 0a 20 20 20 20 70 49 74  -tree */.    pIt
a1a0: 65 72 2d 3e 6e 49 6e 64 65 78 2d 2d 3b 0a 20 20  er->nIndex--;.  
a1b0: 7d 0a 0a 20 20 72 62 75 46 69 6e 61 6c 69 7a 65  }..  rbuFinalize
a1c0: 28 70 2c 20 70 4c 69 73 74 29 3b 0a 20 20 69 66  (p, pList);.  if
a1d0: 28 20 62 49 6e 64 65 78 3d 3d 30 20 29 20 70 49  ( bIndex==0 ) pI
a1e0: 74 65 72 2d 3e 61 62 49 6e 64 65 78 65 64 20 3d  ter->abIndexed =
a1f0: 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66   0;.}.../*.** If
a200: 20 74 68 65 79 20 61 72 65 20 6e 6f 74 20 61 6c   they are not al
a210: 72 65 61 64 79 20 70 6f 70 75 6c 61 74 65 64 2c  ready populated,
a220: 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 70 49   populate the pI
a230: 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 5d 2c  ter->azTblCol[],
a240: 0a 2a 2a 20 70 49 74 65 72 2d 3e 61 62 54 62 6c  .** pIter->abTbl
a250: 50 6b 5b 5d 2c 20 70 49 74 65 72 2d 3e 6e 54 62  Pk[], pIter->nTb
a260: 6c 43 6f 6c 20 61 6e 64 20 70 49 74 65 72 2d 3e  lCol and pIter->
a270: 62 52 6f 77 69 64 20 76 61 72 69 61 62 6c 65 73  bRowid variables
a280: 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 0a 2a 2a   according to.**
a290: 20 74 68 65 20 74 61 62 6c 65 20 28 6e 6f 74 20   the table (not 
a2a0: 69 6e 64 65 78 29 20 74 68 61 74 20 74 68 65 20  index) that the 
a2b0: 69 74 65 72 61 74 6f 72 20 63 75 72 72 65 6e 74  iterator current
a2c0: 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2a  ly points to..**
a2d0: 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
a2e0: 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66  E_OK if successf
a2f0: 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65  ul, or an SQLite
a300: 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65   error code othe
a310: 72 77 69 73 65 2e 20 49 66 0a 2a 2a 20 61 6e 20  rwise. If.** an 
a320: 65 72 72 6f 72 20 64 6f 65 73 20 6f 63 63 75 72  error does occur
a330: 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  , an error code 
a340: 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67  and error messag
a350: 65 20 61 72 65 20 61 6c 73 6f 20 6c 65 66 74 20  e are also left 
a360: 69 6e 20 0a 2a 2a 20 74 68 65 20 52 42 55 20 68  in .** the RBU h
a370: 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  andle..*/.static
a380: 20 69 6e 74 20 72 62 75 4f 62 6a 49 74 65 72 43   int rbuObjIterC
a390: 61 63 68 65 54 61 62 6c 65 49 6e 66 6f 28 73 71  acheTableInfo(sq
a3a0: 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 52 62 75  lite3rbu *p, Rbu
a3b0: 4f 62 6a 49 74 65 72 20 2a 70 49 74 65 72 29 7b  ObjIter *pIter){
a3c0: 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 61 7a  .  if( pIter->az
a3d0: 54 62 6c 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20  TblCol==0 ){.   
a3e0: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
a3f0: 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e  Stmt = 0;.    in
a400: 74 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  t nCol = 0;.    
a410: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
a420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a430: 20 66 6f 72 28 29 20 6c 6f 6f 70 20 69 74 65 72   for() loop iter
a440: 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f  ator variable */
a450: 0a 20 20 20 20 69 6e 74 20 62 52 62 75 52 6f 77  .    int bRbuRow
a460: 69 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  id = 0;         
a470: 20 20 20 2f 2a 20 49 66 20 69 6e 70 75 74 20 74     /* If input t
a480: 61 62 6c 65 20 68 61 73 20 63 6f 6c 75 6d 6e 20  able has column 
a490: 22 72 62 75 5f 72 6f 77 69 64 22 20 2a 2f 0a 20  "rbu_rowid" */. 
a4a0: 20 20 20 69 6e 74 20 69 4f 72 64 65 72 20 3d 20     int iOrder = 
a4b0: 30 3b 0a 20 20 20 20 69 6e 74 20 69 54 6e 75 6d  0;.    int iTnum
a4c0: 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 46 69   = 0;..    /* Fi
a4d0: 67 75 72 65 20 6f 75 74 20 74 68 65 20 74 79 70  gure out the typ
a4e0: 65 20 6f 66 20 74 61 62 6c 65 20 74 68 69 73 20  e of table this 
a4f0: 73 74 65 70 20 77 69 6c 6c 20 64 65 61 6c 20 77  step will deal w
a500: 69 74 68 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  ith. */.    asse
a510: 72 74 28 20 70 49 74 65 72 2d 3e 65 54 79 70 65  rt( pIter->eType
a520: 3d 3d 30 20 29 3b 0a 20 20 20 20 72 62 75 54 61  ==0 );.    rbuTa
a530: 62 6c 65 54 79 70 65 28 70 2c 20 70 49 74 65 72  bleType(p, pIter
a540: 2d 3e 7a 54 62 6c 2c 20 26 70 49 74 65 72 2d 3e  ->zTbl, &pIter->
a550: 65 54 79 70 65 2c 20 26 69 54 6e 75 6d 2c 20 26  eType, &iTnum, &
a560: 70 49 74 65 72 2d 3e 69 50 6b 54 6e 75 6d 29 3b  pIter->iPkTnum);
a570: 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  .    if( p->rc==
a580: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 49 74  SQLITE_OK && pIt
a590: 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50  er->eType==RBU_P
a5a0: 4b 5f 4e 4f 54 41 42 4c 45 20 29 7b 0a 20 20 20  K_NOTABLE ){.   
a5b0: 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
a5c0: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 70  E_ERROR;.      p
a5d0: 2d 3e 7a 45 72 72 6d 73 67 20 3d 20 73 71 6c 69  ->zErrmsg = sqli
a5e0: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 6e 6f 20  te3_mprintf("no 
a5f0: 73 75 63 68 20 74 61 62 6c 65 3a 20 25 73 22 2c  such table: %s",
a600: 20 70 49 74 65 72 2d 3e 7a 54 62 6c 29 3b 0a 20   pIter->zTbl);. 
a610: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e     }.    if( p->
a620: 72 63 20 29 20 72 65 74 75 72 6e 20 70 2d 3e 72  rc ) return p->r
a630: 63 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72  c;.    if( pIter
a640: 2d 3e 7a 49 64 78 3d 3d 30 20 29 20 70 49 74 65  ->zIdx==0 ) pIte
a650: 72 2d 3e 69 54 6e 75 6d 20 3d 20 69 54 6e 75 6d  r->iTnum = iTnum
a660: 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ;..    assert( p
a670: 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55  Iter->eType==RBU
a680: 5f 50 4b 5f 4e 4f 4e 45 20 7c 7c 20 70 49 74 65  _PK_NONE || pIte
a690: 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b  r->eType==RBU_PK
a6a0: 5f 49 50 4b 20 0a 20 20 20 20 20 20 20 20 20 7c  _IPK .         |
a6b0: 7c 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d  | pIter->eType==
a6c0: 52 42 55 5f 50 4b 5f 45 58 54 45 52 4e 41 4c 20  RBU_PK_EXTERNAL 
a6d0: 7c 7c 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d  || pIter->eType=
a6e0: 3d 52 42 55 5f 50 4b 5f 57 49 54 48 4f 55 54 5f  =RBU_PK_WITHOUT_
a6f0: 52 4f 57 49 44 0a 20 20 20 20 20 20 20 20 20 7c  ROWID.         |
a700: 7c 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d  | pIter->eType==
a710: 52 42 55 5f 50 4b 5f 56 54 41 42 0a 20 20 20 20  RBU_PK_VTAB.    
a720: 29 3b 0a 0a 20 20 20 20 2f 2a 20 50 6f 70 75 6c  );..    /* Popul
a730: 61 74 65 20 74 68 65 20 61 7a 54 62 6c 43 6f 6c  ate the azTblCol
a740: 5b 5d 20 61 6e 64 20 6e 54 62 6c 43 6f 6c 20 76  [] and nTblCol v
a750: 61 72 69 61 62 6c 65 73 20 62 61 73 65 64 20 6f  ariables based o
a760: 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 73 0a 20 20  n the columns.  
a770: 20 20 2a 2a 20 6f 66 20 74 68 65 20 69 6e 70 75    ** of the inpu
a780: 74 20 74 61 62 6c 65 2e 20 49 67 6e 6f 72 65 20  t table. Ignore 
a790: 61 6e 79 20 69 6e 70 75 74 20 74 61 62 6c 65 20  any input table 
a7a0: 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 62 65 67  columns that beg
a7b0: 69 6e 20 77 69 74 68 0a 20 20 20 20 2a 2a 20 22  in with.    ** "
a7c0: 72 62 75 5f 22 2e 20 20 2a 2f 0a 20 20 20 20 70  rbu_".  */.    p
a7d0: 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65 46 72  ->rc = prepareFr
a7e0: 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f  eeAndCollectErro
a7f0: 72 28 70 2d 3e 64 62 52 62 75 2c 20 26 70 53 74  r(p->dbRbu, &pSt
a800: 6d 74 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c  mt, &p->zErrmsg,
a810: 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65   .        sqlite
a820: 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43  3_mprintf("SELEC
a830: 54 20 2a 20 46 52 4f 4d 20 27 25 71 27 22 2c 20  T * FROM '%q'", 
a840: 70 49 74 65 72 2d 3e 7a 44 61 74 61 54 62 6c 29  pIter->zDataTbl)
a850: 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
a860: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
a870: 20 29 7b 0a 20 20 20 20 20 20 6e 43 6f 6c 20 3d   ){.      nCol =
a880: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
a890: 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20  count(pStmt);.  
a8a0: 20 20 20 20 72 62 75 41 6c 6c 6f 63 61 74 65 49      rbuAllocateI
a8b0: 74 65 72 41 72 72 61 79 73 28 70 2c 20 70 49 74  terArrays(p, pIt
a8c0: 65 72 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 7d  er, nCol);.    }
a8d0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 70 2d  .    for(i=0; p-
a8e0: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
a8f0: 26 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  & i<nCol; i++){.
a900: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
a910: 20 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74   *zName = (const
a920: 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63   char*)sqlite3_c
a930: 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53 74 6d 74  olumn_name(pStmt
a940: 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , i);.      if( 
a950: 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70  sqlite3_strnicmp
a960: 28 22 72 62 75 5f 22 2c 20 7a 4e 61 6d 65 2c 20  ("rbu_", zName, 
a970: 34 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  4) ){.        ch
a980: 61 72 20 2a 7a 43 6f 70 79 20 3d 20 72 62 75 53  ar *zCopy = rbuS
a990: 74 72 6e 64 75 70 28 7a 4e 61 6d 65 2c 20 26 70  trndup(zName, &p
a9a0: 2d 3e 72 63 29 3b 0a 20 20 20 20 20 20 20 20 70  ->rc);.        p
a9b0: 49 74 65 72 2d 3e 61 69 53 72 63 4f 72 64 65 72  Iter->aiSrcOrder
a9c0: 5b 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 5d  [pIter->nTblCol]
a9d0: 20 3d 20 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f   = pIter->nTblCo
a9e0: 6c 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65 72  l;.        pIter
a9f0: 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 70 49 74 65 72  ->azTblCol[pIter
aa00: 2d 3e 6e 54 62 6c 43 6f 6c 2b 2b 5d 20 3d 20 7a  ->nTblCol++] = z
aa10: 43 6f 70 79 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Copy;.      }.  
aa20: 20 20 20 20 65 6c 73 65 20 69 66 28 20 30 3d 3d      else if( 0==
aa30: 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
aa40: 22 72 62 75 5f 72 6f 77 69 64 22 2c 20 7a 4e 61  "rbu_rowid", zNa
aa50: 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62  me) ){.        b
aa60: 52 62 75 52 6f 77 69 64 20 3d 20 31 3b 0a 20 20  RbuRowid = 1;.  
aa70: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
aa80: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
aa90: 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 70 53 74  (pStmt);.    pSt
aaa0: 6d 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28  mt = 0;..    if(
aab0: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
aac0: 4b 0a 20 20 20 20 20 26 26 20 72 62 75 49 73 56  K.     && rbuIsV
aad0: 61 63 75 75 6d 28 70 29 3d 3d 30 0a 20 20 20 20  acuum(p)==0.    
aae0: 20 26 26 20 62 52 62 75 52 6f 77 69 64 21 3d 28   && bRbuRowid!=(
aaf0: 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42  pIter->eType==RB
ab00: 55 5f 50 4b 5f 56 54 41 42 20 7c 7c 20 70 49 74  U_PK_VTAB || pIt
ab10: 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50  er->eType==RBU_P
ab20: 4b 5f 4e 4f 4e 45 29 0a 20 20 20 20 29 7b 0a 20  K_NONE).    ){. 
ab30: 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c       p->rc = SQL
ab40: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
ab50: 20 70 2d 3e 7a 45 72 72 6d 73 67 20 3d 20 73 71   p->zErrmsg = sq
ab60: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20  lite3_mprintf(. 
ab70: 20 20 20 20 20 20 20 20 20 22 74 61 62 6c 65 20           "table 
ab80: 25 71 20 25 73 20 72 62 75 5f 72 6f 77 69 64 20  %q %s rbu_rowid 
ab90: 63 6f 6c 75 6d 6e 22 2c 20 70 49 74 65 72 2d 3e  column", pIter->
aba0: 7a 44 61 74 61 54 62 6c 2c 0a 20 20 20 20 20 20  zDataTbl,.      
abb0: 20 20 20 20 28 62 52 62 75 52 6f 77 69 64 20 3f      (bRbuRowid ?
abc0: 20 22 6d 61 79 20 6e 6f 74 20 68 61 76 65 22 20   "may not have" 
abd0: 3a 20 22 72 65 71 75 69 72 65 73 22 29 0a 20 20  : "requires").  
abe0: 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20      );.    }..  
abf0: 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
ac00: 61 6c 6c 20 6e 6f 6e 2d 48 49 44 44 45 4e 20 63  all non-HIDDEN c
ac10: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 64 65  olumns in the de
ac20: 73 74 69 6e 61 74 69 6f 6e 20 74 61 62 6c 65 20  stination table 
ac30: 61 72 65 20 61 6c 73 6f 0a 20 20 20 20 2a 2a 20  are also.    ** 
ac40: 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 69  present in the i
ac50: 6e 70 75 74 20 74 61 62 6c 65 2e 20 50 6f 70 75  nput table. Popu
ac60: 6c 61 74 65 20 74 68 65 20 61 62 54 62 6c 50 6b  late the abTblPk
ac70: 5b 5d 2c 20 61 7a 54 62 6c 54 79 70 65 5b 5d 20  [], azTblType[] 
ac80: 61 6e 64 0a 20 20 20 20 2a 2a 20 61 69 54 62 6c  and.    ** aiTbl
ac90: 4f 72 64 65 72 5b 5d 20 61 72 72 61 79 73 20 61  Order[] arrays a
aca0: 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e  t the same time.
acb0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e    */.    if( p->
acc0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
acd0: 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 70  .      p->rc = p
ace0: 72 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f 6c  repareFreeAndCol
acf0: 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 4d  lectError(p->dbM
ad00: 61 69 6e 2c 20 26 70 53 74 6d 74 2c 20 26 70 2d  ain, &pStmt, &p-
ad10: 3e 7a 45 72 72 6d 73 67 2c 20 0a 20 20 20 20 20  >zErrmsg, .     
ad20: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72       sqlite3_mpr
ad30: 69 6e 74 66 28 22 50 52 41 47 4d 41 20 74 61 62  intf("PRAGMA tab
ad40: 6c 65 5f 69 6e 66 6f 28 25 51 29 22 2c 20 70 49  le_info(%Q)", pI
ad50: 74 65 72 2d 3e 7a 54 62 6c 29 0a 20 20 20 20 20  ter->zTbl).     
ad60: 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68   );.    }.    wh
ad70: 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ile( p->rc==SQLI
ad80: 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f  TE_OK && SQLITE_
ad90: 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW==sqlite3_ste
ada0: 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20  p(pStmt) ){.    
adb0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
adc0: 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ame = (const cha
add0: 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
ade0: 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31 29  n_text(pStmt, 1)
adf0: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d  ;.      if( zNam
ae00: 65 3d 3d 30 20 29 20 62 72 65 61 6b 3b 20 20 2f  e==0 ) break;  /
ae10: 2a 20 41 6e 20 4f 4f 4d 20 2d 20 66 69 6e 61 6c  * An OOM - final
ae20: 69 7a 65 28 29 20 62 65 6c 6f 77 20 72 65 74 75  ize() below retu
ae30: 72 6e 73 20 53 5f 4e 4f 4d 45 4d 20 2a 2f 0a 20  rns S_NOMEM */. 
ae40: 20 20 20 20 20 66 6f 72 28 69 3d 69 4f 72 64 65       for(i=iOrde
ae50: 72 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 54 62 6c  r; i<pIter->nTbl
ae60: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
ae70: 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63 6d 70     if( 0==strcmp
ae80: 28 7a 4e 61 6d 65 2c 20 70 49 74 65 72 2d 3e 61  (zName, pIter->a
ae90: 7a 54 62 6c 43 6f 6c 5b 69 5d 29 20 29 20 62 72  zTblCol[i]) ) br
aea0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
aeb0: 20 20 20 69 66 28 20 69 3d 3d 70 49 74 65 72 2d     if( i==pIter-
aec0: 3e 6e 54 62 6c 43 6f 6c 20 29 7b 0a 20 20 20 20  >nTblCol ){.    
aed0: 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
aee0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
aef0: 20 20 70 2d 3e 7a 45 72 72 6d 73 67 20 3d 20 73    p->zErrmsg = s
af00: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
af10: 63 6f 6c 75 6d 6e 20 6d 69 73 73 69 6e 67 20 66  column missing f
af20: 72 6f 6d 20 25 71 3a 20 25 73 22 2c 0a 20 20 20  rom %q: %s",.   
af30: 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e           pIter->
af40: 7a 44 61 74 61 54 62 6c 2c 20 7a 4e 61 6d 65 0a  zDataTbl, zName.
af50: 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
af60: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
af70: 69 6e 74 20 69 50 6b 20 3d 20 73 71 6c 69 74 65  int iPk = sqlite
af80: 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74  3_column_int(pSt
af90: 6d 74 2c 20 35 29 3b 0a 20 20 20 20 20 20 20 20  mt, 5);.        
afa0: 69 6e 74 20 62 4e 6f 74 4e 75 6c 6c 20 3d 20 73  int bNotNull = s
afb0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
afc0: 74 28 70 53 74 6d 74 2c 20 33 29 3b 0a 20 20 20  t(pStmt, 3);.   
afd0: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
afe0: 2a 7a 54 79 70 65 20 3d 20 28 63 6f 6e 73 74 20  *zType = (const 
aff0: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
b000: 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
b010: 20 32 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 66   2);..        if
b020: 28 20 69 21 3d 69 4f 72 64 65 72 20 29 7b 0a 20  ( i!=iOrder ){. 
b030: 20 20 20 20 20 20 20 20 20 53 57 41 50 28 69 6e           SWAP(in
b040: 74 2c 20 70 49 74 65 72 2d 3e 61 69 53 72 63 4f  t, pIter->aiSrcO
b050: 72 64 65 72 5b 69 5d 2c 20 70 49 74 65 72 2d 3e  rder[i], pIter->
b060: 61 69 53 72 63 4f 72 64 65 72 5b 69 4f 72 64 65  aiSrcOrder[iOrde
b070: 72 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 53  r]);.          S
b080: 57 41 50 28 63 68 61 72 2a 2c 20 70 49 74 65 72  WAP(char*, pIter
b090: 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69 5d 2c 20 70  ->azTblCol[i], p
b0a0: 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69  Iter->azTblCol[i
b0b0: 4f 72 64 65 72 5d 29 3b 0a 20 20 20 20 20 20 20  Order]);.       
b0c0: 20 7d 0a 0a 20 20 20 20 20 20 20 20 70 49 74 65   }..        pIte
b0d0: 72 2d 3e 61 7a 54 62 6c 54 79 70 65 5b 69 4f 72  r->azTblType[iOr
b0e0: 64 65 72 5d 20 3d 20 72 62 75 53 74 72 6e 64 75  der] = rbuStrndu
b0f0: 70 28 7a 54 79 70 65 2c 20 26 70 2d 3e 72 63 29  p(zType, &p->rc)
b100: 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d  ;.        pIter-
b110: 3e 61 62 54 62 6c 50 6b 5b 69 4f 72 64 65 72 5d  >abTblPk[iOrder]
b120: 20 3d 20 28 69 50 6b 21 3d 30 29 3b 0a 20 20 20   = (iPk!=0);.   
b130: 20 20 20 20 20 70 49 74 65 72 2d 3e 61 62 4e 6f       pIter->abNo
b140: 74 4e 75 6c 6c 5b 69 4f 72 64 65 72 5d 20 3d 20  tNull[iOrder] = 
b150: 28 75 38 29 62 4e 6f 74 4e 75 6c 6c 20 7c 7c 20  (u8)bNotNull || 
b160: 28 69 50 6b 21 3d 30 29 3b 0a 20 20 20 20 20 20  (iPk!=0);.      
b170: 20 20 69 4f 72 64 65 72 2b 2b 3b 0a 20 20 20 20    iOrder++;.    
b180: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72    }.    }..    r
b190: 62 75 46 69 6e 61 6c 69 7a 65 28 70 2c 20 70 53  buFinalize(p, pS
b1a0: 74 6d 74 29 3b 0a 20 20 20 20 72 62 75 4f 62 6a  tmt);.    rbuObj
b1b0: 49 74 65 72 43 61 63 68 65 49 6e 64 65 78 65 64  IterCacheIndexed
b1c0: 43 6f 6c 73 28 70 2c 20 70 49 74 65 72 29 3b 0a  Cols(p, pIter);.
b1d0: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
b1e0: 72 2d 3e 65 54 79 70 65 21 3d 52 42 55 5f 50 4b  r->eType!=RBU_PK
b1f0: 5f 56 54 41 42 20 7c 7c 20 70 49 74 65 72 2d 3e  _VTAB || pIter->
b200: 61 62 49 6e 64 65 78 65 64 3d 3d 30 20 29 3b 0a  abIndexed==0 );.
b210: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
b220: 72 2d 3e 65 54 79 70 65 21 3d 52 42 55 5f 50 4b  r->eType!=RBU_PK
b230: 5f 56 54 41 42 20 7c 7c 20 70 49 74 65 72 2d 3e  _VTAB || pIter->
b240: 6e 49 6e 64 65 78 3d 3d 30 20 29 3b 0a 20 20 7d  nIndex==0 );.  }
b250: 0a 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63  ..  return p->rc
b260: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
b270: 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 73 74 72 75  function constru
b280: 63 74 73 20 61 6e 64 20 72 65 74 75 72 6e 73 20  cts and returns 
b290: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e  a pointer to a n
b2a0: 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 0a 2a  ul-terminated .*
b2b0: 2a 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e  * string contain
b2c0: 69 6e 67 20 73 6f 6d 65 20 53 51 4c 20 63 6c 61  ing some SQL cla
b2d0: 75 73 65 20 6f 72 20 6c 69 73 74 20 62 61 73 65  use or list base
b2e0: 64 20 6f 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  d on one or more
b2f0: 20 6f 66 20 74 68 65 20 0a 2a 2a 20 63 6f 6c 75   of the .** colu
b300: 6d 6e 20 6e 61 6d 65 73 20 63 75 72 72 65 6e 74  mn names current
b310: 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ly stored in the
b320: 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c   pIter->azTblCol
b330: 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61  [] array..*/.sta
b340: 74 69 63 20 63 68 61 72 20 2a 72 62 75 4f 62 6a  tic char *rbuObj
b350: 49 74 65 72 47 65 74 43 6f 6c 6c 69 73 74 28 0a  IterGetCollist(.
b360: 20 20 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c    sqlite3rbu *p,
b370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b380: 20 20 2f 2a 20 52 42 55 20 6f 62 6a 65 63 74 20    /* RBU object 
b390: 2a 2f 0a 20 20 52 62 75 4f 62 6a 49 74 65 72 20  */.  RbuObjIter 
b3a0: 2a 70 49 74 65 72 20 20 20 20 20 20 20 20 20 20  *pIter          
b3b0: 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 69       /* Object i
b3c0: 74 65 72 61 74 6f 72 20 66 6f 72 20 63 6f 6c 75  terator for colu
b3d0: 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 29 7b 0a 20  mn names */.){. 
b3e0: 20 63 68 61 72 20 2a 7a 4c 69 73 74 20 3d 20 30   char *zList = 0
b3f0: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
b400: 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20 69 6e 74  zSep = "";.  int
b410: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
b420: 3c 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 3b  <pIter->nTblCol;
b430: 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74   i++){.    const
b440: 20 63 68 61 72 20 2a 7a 20 3d 20 70 49 74 65 72   char *z = pIter
b450: 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69 5d 3b 0a 20  ->azTblCol[i];. 
b460: 20 20 20 7a 4c 69 73 74 20 3d 20 72 62 75 4d 50     zList = rbuMP
b470: 72 69 6e 74 66 28 70 2c 20 22 25 7a 25 73 5c 22  rintf(p, "%z%s\"
b480: 25 77 5c 22 22 2c 20 7a 4c 69 73 74 2c 20 7a 53  %w\"", zList, zS
b490: 65 70 2c 20 7a 29 3b 0a 20 20 20 20 7a 53 65 70  ep, z);.    zSep
b4a0: 20 3d 20 22 2c 20 22 3b 0a 20 20 7d 0a 20 20 72   = ", ";.  }.  r
b4b0: 65 74 75 72 6e 20 7a 4c 69 73 74 3b 0a 7d 0a 0a  eturn zList;.}..
b4c0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
b4d0: 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 63  ion is used to c
b4e0: 72 65 61 74 65 20 61 20 53 45 4c 45 43 54 20 6c  reate a SELECT l
b4f0: 69 73 74 20 28 74 68 65 20 6c 69 73 74 20 6f 66  ist (the list of
b500: 20 53 51 4c 20 0a 2a 2a 20 65 78 70 72 65 73 73   SQL .** express
b510: 69 6f 6e 73 20 74 68 61 74 20 66 6f 6c 6c 6f 77  ions that follow
b520: 73 20 61 20 53 45 4c 45 43 54 20 6b 65 79 77 6f  s a SELECT keywo
b530: 72 64 29 20 66 6f 72 20 61 20 53 45 4c 45 43 54  rd) for a SELECT
b540: 20 73 74 61 74 65 6d 65 6e 74 20 0a 2a 2a 20 75   statement .** u
b550: 73 65 64 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  sed to read from
b560: 20 61 6e 20 64 61 74 61 5f 78 78 78 20 6f 72 20   an data_xxx or 
b570: 72 62 75 5f 74 6d 70 5f 78 78 78 20 74 61 62 6c  rbu_tmp_xxx tabl
b580: 65 20 77 68 69 6c 65 20 75 70 64 61 74 69 6e 67  e while updating
b590: 20 74 68 65 20 0a 2a 2a 20 69 6e 64 65 78 20 6f   the .** index o
b5a0: 62 6a 65 63 74 20 63 75 72 72 65 6e 74 6c 79 20  bject currently 
b5b0: 69 6e 64 69 63 61 74 65 64 20 62 79 20 74 68 65  indicated by the
b5c0: 20 69 74 65 72 61 74 6f 72 20 6f 62 6a 65 63 74   iterator object
b5d0: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 0a   passed as the .
b5e0: 2a 2a 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  ** second argume
b5f0: 6e 74 2e 20 41 20 22 50 52 41 47 4d 41 20 69 6e  nt. A "PRAGMA in
b600: 64 65 78 5f 78 69 6e 66 6f 20 3d 20 3c 69 64 78  dex_xinfo = <idx
b610: 6e 61 6d 65 3e 22 20 73 74 61 74 65 6d 65 6e 74  name>" statement
b620: 20 69 73 20 75 73 65 64 20 0a 2a 2a 20 74 6f 20   is used .** to 
b630: 6f 62 74 61 69 6e 20 74 68 65 20 72 65 71 75 69  obtain the requi
b640: 72 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  red information.
b650: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e  .**.** If the in
b660: 64 65 78 20 69 73 20 6f 66 20 74 68 65 20 66 6f  dex is of the fo
b670: 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 3a 0a 2a 2a  llowing form:.**
b680: 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44  .**   CREATE IND
b690: 45 58 20 69 31 20 4f 4e 20 74 31 28 63 2c 20 62  EX i1 ON t1(c, b
b6a0: 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 29   COLLATE nocase)
b6b0: 3b 0a 2a 2a 0a 2a 2a 20 61 6e 64 20 22 74 31 22  ;.**.** and "t1"
b6c0: 20 69 73 20 61 20 74 61 62 6c 65 20 77 69 74 68   is a table with
b6d0: 20 61 6e 20 65 78 70 6c 69 63 69 74 20 49 4e 54   an explicit INT
b6e0: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
b6f0: 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 22 69 70 6b   column .** "ipk
b700: 22 2c 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  ", the returned 
b710: 73 74 72 69 6e 67 20 69 73 3a 0a 2a 2a 0a 2a 2a  string is:.**.**
b720: 20 20 20 22 60 63 60 20 43 4f 4c 4c 41 54 45 20     "`c` COLLATE 
b730: 27 42 49 4e 41 52 59 27 2c 20 60 62 60 20 43 4f  'BINARY', `b` CO
b740: 4c 4c 41 54 45 20 27 4e 4f 43 41 53 45 27 2c 20  LLATE 'NOCASE', 
b750: 60 69 70 6b 60 20 43 4f 4c 4c 41 54 45 20 27 42  `ipk` COLLATE 'B
b760: 49 4e 41 52 59 27 22 0a 2a 2a 0a 2a 2a 20 41 73  INARY'".**.** As
b770: 20 77 65 6c 6c 20 61 73 20 74 68 65 20 72 65 74   well as the ret
b780: 75 72 6e 65 64 20 73 74 72 69 6e 67 2c 20 74 68  urned string, th
b790: 72 65 65 20 6f 74 68 65 72 20 6d 61 6c 6c 6f 63  ree other malloc
b7a0: 27 64 20 73 74 72 69 6e 67 73 20 61 72 65 20 0a  'd strings are .
b7b0: 2a 2a 20 72 65 74 75 72 6e 65 64 20 76 69 61 20  ** returned via 
b7c0: 6f 75 74 70 75 74 20 70 61 72 61 6d 65 74 65 72  output parameter
b7d0: 73 2e 20 41 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  s. As follows:.*
b7e0: 2a 0a 2a 2a 20 20 20 70 7a 49 6d 70 6f 73 74 65  *.**   pzImposte
b7f0: 72 43 6f 6c 73 3a 20 2e 2e 2e 0a 2a 2a 20 20 20  rCols: ....**   
b800: 70 7a 49 6d 70 6f 73 74 65 72 50 6b 3a 20 2e 2e  pzImposterPk: ..
b810: 2e 0a 2a 2a 20 20 20 70 7a 57 68 65 72 65 3a 20  ..**   pzWhere: 
b820: 2e 2e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  ....*/.static ch
b830: 61 72 20 2a 72 62 75 4f 62 6a 49 74 65 72 47 65  ar *rbuObjIterGe
b840: 74 49 6e 64 65 78 43 6f 6c 73 28 0a 20 20 73 71  tIndexCols(.  sq
b850: 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 20 20 20  lite3rbu *p,    
b860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b870: 20 52 42 55 20 6f 62 6a 65 63 74 20 2a 2f 0a 20   RBU object */. 
b880: 20 52 62 75 4f 62 6a 49 74 65 72 20 2a 70 49 74   RbuObjIter *pIt
b890: 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
b8a0: 20 2f 2a 20 4f 62 6a 65 63 74 20 69 74 65 72 61   /* Object itera
b8b0: 74 6f 72 20 66 6f 72 20 63 6f 6c 75 6d 6e 20 6e  tor for column n
b8c0: 61 6d 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ames */.  char *
b8d0: 2a 70 7a 49 6d 70 6f 73 74 65 72 43 6f 6c 73 2c  *pzImposterCols,
b8e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
b8f0: 3a 20 43 6f 6c 75 6d 6e 73 20 66 6f 72 20 69 6d  : Columns for im
b900: 70 6f 73 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a  poster table */.
b910: 20 20 63 68 61 72 20 2a 2a 70 7a 49 6d 70 6f 73    char **pzImpos
b920: 74 65 72 50 6b 2c 20 20 20 20 20 20 20 20 20 20  terPk,          
b930: 20 20 2f 2a 20 4f 55 54 3a 20 49 6d 70 6f 73 74    /* OUT: Impost
b940: 65 72 20 50 4b 20 63 6c 61 75 73 65 20 2a 2f 0a  er PK clause */.
b950: 20 20 63 68 61 72 20 2a 2a 70 7a 57 68 65 72 65    char **pzWhere
b960: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
b970: 20 20 2f 2a 20 4f 55 54 3a 20 57 48 45 52 45 20    /* OUT: WHERE 
b980: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
b990: 2a 70 6e 42 69 6e 64 20 20 20 20 20 20 20 20 20  *pnBind         
b9a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
b9b0: 55 54 3a 20 54 72 62 75 6c 20 6e 75 6d 62 65 72  UT: Trbul number
b9c0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 29   of columns */.)
b9d0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 2d 3e  {.  int rc = p->
b9e0: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
b9f0: 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64      /* Error cod
ba00: 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 32 3b 20  e */.  int rc2; 
ba10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba20: 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
ba30: 33 5f 66 69 6e 61 6c 69 7a 65 28 29 20 72 65 74  3_finalize() ret
ba40: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 63 68  urn code */.  ch
ba50: 61 72 20 2a 7a 52 65 74 20 3d 20 30 3b 20 20 20  ar *zRet = 0;   
ba60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ba70: 20 53 74 72 69 6e 67 20 74 6f 20 72 65 74 75 72   String to retur
ba80: 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 49 6d  n */.  char *zIm
ba90: 70 43 6f 6c 73 20 3d 20 30 3b 20 20 20 20 20 20  pCols = 0;      
baa0: 20 20 20 20 20 20 20 2f 2a 20 53 74 72 69 6e 67         /* String
bab0: 20 74 6f 20 72 65 74 75 72 6e 20 76 69 61 20 2a   to return via *
bac0: 70 7a 49 6d 70 6f 73 74 65 72 43 6f 6c 73 20 2a  pzImposterCols *
bad0: 2f 0a 20 20 63 68 61 72 20 2a 7a 49 6d 70 50 4b  /.  char *zImpPK
bae0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
baf0: 20 20 20 20 2f 2a 20 53 74 72 69 6e 67 20 74 6f      /* String to
bb00: 20 72 65 74 75 72 6e 20 76 69 61 20 2a 70 7a 49   return via *pzI
bb10: 6d 70 6f 73 74 65 72 50 4b 20 2a 2f 0a 20 20 63  mposterPK */.  c
bb20: 68 61 72 20 2a 7a 57 68 65 72 65 20 3d 20 30 3b  har *zWhere = 0;
bb30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bb40: 2a 20 53 74 72 69 6e 67 20 74 6f 20 72 65 74 75  * String to retu
bb50: 72 6e 20 76 69 61 20 2a 70 7a 57 68 65 72 65 20  rn via *pzWhere 
bb60: 2a 2f 0a 20 20 69 6e 74 20 6e 42 69 6e 64 20 3d  */.  int nBind =
bb70: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
bb80: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f       /* Value to
bb90: 20 72 65 74 75 72 6e 20 76 69 61 20 2a 70 6e 42   return via *pnB
bba0: 69 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ind */.  const c
bbb0: 68 61 72 20 2a 7a 43 6f 6d 20 3d 20 22 22 3b 20  har *zCom = ""; 
bbc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20           /* Set 
bbd0: 74 6f 20 22 2c 20 22 20 6c 61 74 65 72 20 6f 6e  to ", " later on
bbe0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
bbf0: 20 2a 7a 41 6e 64 20 3d 20 22 22 3b 20 20 20 20   *zAnd = "";    
bc00: 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20        /* Set to 
bc10: 22 20 41 4e 44 20 22 20 6c 61 74 65 72 20 6f 6e  " AND " later on
bc20: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
bc30: 6d 74 20 2a 70 58 49 6e 66 6f 20 3d 20 30 3b 20  mt *pXInfo = 0; 
bc40: 20 20 20 20 20 20 2f 2a 20 50 52 41 47 4d 41 20        /* PRAGMA 
bc50: 69 6e 64 65 78 5f 78 69 6e 66 6f 20 3d 20 3f 20  index_xinfo = ? 
bc60: 2a 2f 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  */..  if( rc==SQ
bc70: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61  LITE_OK ){.    a
bc80: 73 73 65 72 74 28 20 70 2d 3e 7a 45 72 72 6d 73  ssert( p->zErrms
bc90: 67 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d  g==0 );.    rc =
bca0: 20 70 72 65 70 61 72 65 46 72 65 65 41 6e 64 43   prepareFreeAndC
bcb0: 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64  ollectError(p->d
bcc0: 62 4d 61 69 6e 2c 20 26 70 58 49 6e 66 6f 2c 20  bMain, &pXInfo, 
bcd0: 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 0a 20 20 20  &p->zErrmsg,.   
bce0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72       sqlite3_mpr
bcf0: 69 6e 74 66 28 22 50 52 41 47 4d 41 20 6d 61 69  intf("PRAGMA mai
bd00: 6e 2e 69 6e 64 65 78 5f 78 69 6e 66 6f 20 3d 20  n.index_xinfo = 
bd10: 25 51 22 2c 20 70 49 74 65 72 2d 3e 7a 49 64 78  %Q", pIter->zIdx
bd20: 29 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20  ).    );.  }..  
bd30: 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
bd40: 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52  E_OK && SQLITE_R
bd50: 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
bd60: 28 70 58 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20  (pXInfo) ){.    
bd70: 69 6e 74 20 69 43 69 64 20 3d 20 73 71 6c 69 74  int iCid = sqlit
bd80: 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 58  e3_column_int(pX
bd90: 49 6e 66 6f 2c 20 31 29 3b 0a 20 20 20 20 69 6e  Info, 1);.    in
bda0: 74 20 62 44 65 73 63 20 3d 20 73 71 6c 69 74 65  t bDesc = sqlite
bdb0: 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 58 49  3_column_int(pXI
bdc0: 6e 66 6f 2c 20 33 29 3b 0a 20 20 20 20 63 6f 6e  nfo, 3);.    con
bdd0: 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 61 74  st char *zCollat
bde0: 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  e = (const char*
bdf0: 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
be00: 74 65 78 74 28 70 58 49 6e 66 6f 2c 20 34 29 3b  text(pXInfo, 4);
be10: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
be20: 2a 7a 43 6f 6c 3b 0a 20 20 20 20 63 6f 6e 73 74  *zCol;.    const
be30: 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 0a 20   char *zType;.. 
be40: 20 20 20 69 66 28 20 69 43 69 64 3c 30 20 29 7b     if( iCid<0 ){
be50: 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 74  .      /* An int
be60: 65 67 65 72 20 70 72 69 6d 61 72 79 20 6b 65 79  eger primary key
be70: 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 68  . If the table h
be80: 61 73 20 61 6e 20 65 78 70 6c 69 63 69 74 20 49  as an explicit I
be90: 50 4b 2c 20 75 73 65 0a 20 20 20 20 20 20 2a 2a  PK, use.      **
bea0: 20 69 74 73 20 6e 61 6d 65 2e 20 4f 74 68 65 72   its name. Other
beb0: 77 69 73 65 2c 20 75 73 65 20 22 72 62 75 5f 72  wise, use "rbu_r
bec0: 6f 77 69 64 22 2e 20 20 2a 2f 0a 20 20 20 20 20  owid".  */.     
bed0: 20 69 66 28 20 70 49 74 65 72 2d 3e 65 54 79 70   if( pIter->eTyp
bee0: 65 3d 3d 52 42 55 5f 50 4b 5f 49 50 4b 20 29 7b  e==RBU_PK_IPK ){
bef0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  .        int i;.
bf00: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
bf10: 20 70 49 74 65 72 2d 3e 61 62 54 62 6c 50 6b 5b   pIter->abTblPk[
bf20: 69 5d 3d 3d 30 3b 20 69 2b 2b 29 3b 0a 20 20 20  i]==0; i++);.   
bf30: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 70       assert( i<p
bf40: 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 20 29 3b  Iter->nTblCol );
bf50: 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20  .        zCol = 
bf60: 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b  pIter->azTblCol[
bf70: 69 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  i];.      }else 
bf80: 69 66 28 20 72 62 75 49 73 56 61 63 75 75 6d 28  if( rbuIsVacuum(
bf90: 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 43  p) ){.        zC
bfa0: 6f 6c 20 3d 20 22 5f 72 6f 77 69 64 5f 22 3b 0a  ol = "_rowid_";.
bfb0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
bfc0: 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22 72 62 75       zCol = "rbu
bfd0: 5f 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 7d  _rowid";.      }
bfe0: 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22  .      zType = "
bff0: 49 4e 54 45 47 45 52 22 3b 0a 20 20 20 20 7d 65  INTEGER";.    }e
c000: 6c 73 65 7b 0a 20 20 20 20 20 20 7a 43 6f 6c 20  lse{.      zCol 
c010: 3d 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f  = pIter->azTblCo
c020: 6c 5b 69 43 69 64 5d 3b 0a 20 20 20 20 20 20 7a  l[iCid];.      z
c030: 54 79 70 65 20 3d 20 70 49 74 65 72 2d 3e 61 7a  Type = pIter->az
c040: 54 62 6c 54 79 70 65 5b 69 43 69 64 5d 3b 0a 20  TblType[iCid];. 
c050: 20 20 20 7d 0a 0a 20 20 20 20 7a 52 65 74 20 3d     }..    zRet =
c060: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
c070: 28 22 25 7a 25 73 5c 22 25 77 5c 22 20 43 4f 4c  ("%z%s\"%w\" COL
c080: 4c 41 54 45 20 25 51 22 2c 20 7a 52 65 74 2c 20  LATE %Q", zRet, 
c090: 7a 43 6f 6d 2c 20 7a 43 6f 6c 2c 20 7a 43 6f 6c  zCom, zCol, zCol
c0a0: 6c 61 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70  late);.    if( p
c0b0: 49 74 65 72 2d 3e 62 55 6e 69 71 75 65 3d 3d 30  Iter->bUnique==0
c0c0: 20 7c 7c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75   || sqlite3_colu
c0d0: 6d 6e 5f 69 6e 74 28 70 58 49 6e 66 6f 2c 20 35  mn_int(pXInfo, 5
c0e0: 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  ) ){.      const
c0f0: 20 63 68 61 72 20 2a 7a 4f 72 64 65 72 20 3d 20   char *zOrder = 
c100: 28 62 44 65 73 63 20 3f 20 22 20 44 45 53 43 22  (bDesc ? " DESC"
c110: 20 3a 20 22 22 29 3b 0a 20 20 20 20 20 20 7a 49   : "");.      zI
c120: 6d 70 50 4b 20 3d 20 73 71 6c 69 74 65 33 5f 6d  mpPK = sqlite3_m
c130: 70 72 69 6e 74 66 28 22 25 7a 25 73 5c 22 72 62  printf("%z%s\"rb
c140: 75 5f 69 6d 70 5f 25 64 25 77 5c 22 25 73 22 2c  u_imp_%d%w\"%s",
c150: 20 0a 20 20 20 20 20 20 20 20 20 20 7a 49 6d 70   .          zImp
c160: 50 4b 2c 20 7a 43 6f 6d 2c 20 6e 42 69 6e 64 2c  PK, zCom, nBind,
c170: 20 7a 43 6f 6c 2c 20 7a 4f 72 64 65 72 0a 20 20   zCol, zOrder.  
c180: 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20      );.    }.   
c190: 20 7a 49 6d 70 43 6f 6c 73 20 3d 20 73 71 6c 69   zImpCols = sqli
c1a0: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a 25  te3_mprintf("%z%
c1b0: 73 5c 22 72 62 75 5f 69 6d 70 5f 25 64 25 77 5c  s\"rbu_imp_%d%w\
c1c0: 22 20 25 73 20 43 4f 4c 4c 41 54 45 20 25 51 22  " %s COLLATE %Q"
c1d0: 2c 20 0a 20 20 20 20 20 20 20 20 7a 49 6d 70 43  , .        zImpC
c1e0: 6f 6c 73 2c 20 7a 43 6f 6d 2c 20 6e 42 69 6e 64  ols, zCom, nBind
c1f0: 2c 20 7a 43 6f 6c 2c 20 7a 54 79 70 65 2c 20 7a  , zCol, zType, z
c200: 43 6f 6c 6c 61 74 65 0a 20 20 20 20 29 3b 0a 20  Collate.    );. 
c210: 20 20 20 7a 57 68 65 72 65 20 3d 20 73 71 6c 69     zWhere = sqli
c220: 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20  te3_mprintf(.   
c230: 20 20 20 20 20 22 25 7a 25 73 5c 22 72 62 75 5f       "%z%s\"rbu_
c240: 69 6d 70 5f 25 64 25 77 5c 22 20 49 53 20 3f 22  imp_%d%w\" IS ?"
c250: 2c 20 7a 57 68 65 72 65 2c 20 7a 41 6e 64 2c 20  , zWhere, zAnd, 
c260: 6e 42 69 6e 64 2c 20 7a 43 6f 6c 0a 20 20 20 20  nBind, zCol.    
c270: 29 3b 0a 20 20 20 20 69 66 28 20 7a 52 65 74 3d  );.    if( zRet=
c280: 3d 30 20 7c 7c 20 7a 49 6d 70 50 4b 3d 3d 30 20  =0 || zImpPK==0 
c290: 7c 7c 20 7a 49 6d 70 43 6f 6c 73 3d 3d 30 20 7c  || zImpCols==0 |
c2a0: 7c 20 7a 57 68 65 72 65 3d 3d 30 20 29 20 72 63  | zWhere==0 ) rc
c2b0: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
c2c0: 0a 20 20 20 20 7a 43 6f 6d 20 3d 20 22 2c 20 22  .    zCom = ", "
c2d0: 3b 0a 20 20 20 20 7a 41 6e 64 20 3d 20 22 20 41  ;.    zAnd = " A
c2e0: 4e 44 20 22 3b 0a 20 20 20 20 6e 42 69 6e 64 2b  ND ";.    nBind+
c2f0: 2b 3b 0a 20 20 7d 0a 0a 20 20 72 63 32 20 3d 20  +;.  }..  rc2 = 
c300: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
c310: 28 70 58 49 6e 66 6f 29 3b 0a 20 20 69 66 28 20  (pXInfo);.  if( 
c320: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
c330: 72 63 20 3d 20 72 63 32 3b 0a 0a 20 20 69 66 28  rc = rc2;..  if(
c340: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
c350: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
c360: 65 65 28 7a 52 65 74 29 3b 0a 20 20 20 20 73 71  ee(zRet);.    sq
c370: 6c 69 74 65 33 5f 66 72 65 65 28 7a 49 6d 70 43  lite3_free(zImpC
c380: 6f 6c 73 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ols);.    sqlite
c390: 33 5f 66 72 65 65 28 7a 49 6d 70 50 4b 29 3b 0a  3_free(zImpPK);.
c3a0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
c3b0: 28 7a 57 68 65 72 65 29 3b 0a 20 20 20 20 7a 52  (zWhere);.    zR
c3c0: 65 74 20 3d 20 30 3b 0a 20 20 20 20 7a 49 6d 70  et = 0;.    zImp
c3d0: 43 6f 6c 73 20 3d 20 30 3b 0a 20 20 20 20 7a 49  Cols = 0;.    zI
c3e0: 6d 70 50 4b 20 3d 20 30 3b 0a 20 20 20 20 7a 57  mpPK = 0;.    zW
c3f0: 68 65 72 65 20 3d 20 30 3b 0a 20 20 20 20 70 2d  here = 0;.    p-
c400: 3e 72 63 20 3d 20 72 63 3b 0a 20 20 7d 0a 0a 20  >rc = rc;.  }.. 
c410: 20 2a 70 7a 49 6d 70 6f 73 74 65 72 43 6f 6c 73   *pzImposterCols
c420: 20 3d 20 7a 49 6d 70 43 6f 6c 73 3b 0a 20 20 2a   = zImpCols;.  *
c430: 70 7a 49 6d 70 6f 73 74 65 72 50 6b 20 3d 20 7a  pzImposterPk = z
c440: 49 6d 70 50 4b 3b 0a 20 20 2a 70 7a 57 68 65 72  ImpPK;.  *pzWher
c450: 65 20 3d 20 7a 57 68 65 72 65 3b 0a 20 20 2a 70  e = zWhere;.  *p
c460: 6e 42 69 6e 64 20 3d 20 6e 42 69 6e 64 3b 0a 20  nBind = nBind;. 
c470: 20 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a   return zRet;.}.
c480: 0a 2f 2a 0a 2a 2a 20 41 73 73 75 6d 69 6e 67 20  ./*.** Assuming 
c490: 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c  the current tabl
c4a0: 65 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 22 61  e columns are "a
c4b0: 22 2c 20 22 62 22 20 61 6e 64 20 22 63 22 2c 20  ", "b" and "c", 
c4c0: 61 6e 64 20 74 68 65 20 7a 4f 62 6a 0a 2a 2a 20  and the zObj.** 
c4d0: 70 61 72 61 6d 74 65 72 20 69 73 20 70 61 73 73  paramter is pass
c4e0: 65 64 20 22 6f 6c 64 22 2c 20 72 65 74 75 72 6e  ed "old", return
c4f0: 20 61 20 73 74 72 69 6e 67 20 6f 66 20 74 68 65   a string of the
c500: 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   form:.**.**    
c510: 20 22 6f 6c 64 2e 61 2c 20 6f 6c 64 2e 62 2c 20   "old.a, old.b, 
c520: 6f 6c 64 2e 62 22 0a 2a 2a 0a 2a 2a 20 57 69 74  old.b".**.** Wit
c530: 68 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  h the column nam
c540: 65 73 20 65 73 63 61 70 65 64 2e 0a 2a 2a 0a 2a  es escaped..**.*
c550: 2a 20 46 6f 72 20 74 61 62 6c 65 73 20 77 69 74  * For tables wit
c560: 68 20 69 6d 70 6c 69 63 69 74 20 72 6f 77 69 64  h implicit rowid
c570: 73 20 2d 20 52 42 55 5f 50 4b 5f 45 58 54 45 52  s - RBU_PK_EXTER
c580: 4e 41 4c 20 61 6e 64 20 52 42 55 5f 50 4b 5f 4e  NAL and RBU_PK_N
c590: 4f 4e 45 2c 20 61 70 70 65 6e 64 0a 2a 2a 20 74  ONE, append.** t
c5a0: 68 65 20 74 65 78 74 20 22 2c 20 6f 6c 64 2e 5f  he text ", old._
c5b0: 72 6f 77 69 64 5f 22 20 74 6f 20 74 68 65 20 72  rowid_" to the r
c5c0: 65 74 75 72 6e 65 64 20 76 61 6c 75 65 2e 0a 2a  eturned value..*
c5d0: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 72  /.static char *r
c5e0: 62 75 4f 62 6a 49 74 65 72 47 65 74 4f 6c 64 6c  buObjIterGetOldl
c5f0: 69 73 74 28 0a 20 20 73 71 6c 69 74 65 33 72 62  ist(.  sqlite3rb
c600: 75 20 2a 70 2c 20 0a 20 20 52 62 75 4f 62 6a 49  u *p, .  RbuObjI
c610: 74 65 72 20 2a 70 49 74 65 72 2c 0a 20 20 63 6f  ter *pIter,.  co
c620: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 62 6a 0a 29  nst char *zObj.)
c630: 7b 0a 20 20 63 68 61 72 20 2a 7a 4c 69 73 74 20  {.  char *zList 
c640: 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63  = 0;.  if( p->rc
c650: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
c660: 49 74 65 72 2d 3e 61 62 49 6e 64 65 78 65 64 20  Iter->abIndexed 
c670: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
c680: 72 20 2a 7a 53 20 3d 20 22 22 3b 0a 20 20 20 20  r *zS = "";.    
c690: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
c6a0: 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 54 62  =0; i<pIter->nTb
c6b0: 6c 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lCol; i++){.    
c6c0: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 61 62 49    if( pIter->abI
c6d0: 6e 64 65 78 65 64 5b 69 5d 20 29 7b 0a 20 20 20  ndexed[i] ){.   
c6e0: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
c6f0: 2a 7a 43 6f 6c 20 3d 20 70 49 74 65 72 2d 3e 61  *zCol = pIter->a
c700: 7a 54 62 6c 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20  zTblCol[i];.    
c710: 20 20 20 20 7a 4c 69 73 74 20 3d 20 73 71 6c 69      zList = sqli
c720: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a 25  te3_mprintf("%z%
c730: 73 25 73 2e 5c 22 25 77 5c 22 22 2c 20 7a 4c 69  s%s.\"%w\"", zLi
c740: 73 74 2c 20 7a 53 2c 20 7a 4f 62 6a 2c 20 7a 43  st, zS, zObj, zC
c750: 6f 6c 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ol);.      }else
c760: 7b 0a 20 20 20 20 20 20 20 20 7a 4c 69 73 74 20  {.        zList 
c770: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
c780: 66 28 22 25 7a 25 73 4e 55 4c 4c 22 2c 20 7a 4c  f("%z%sNULL", zL
c790: 69 73 74 2c 20 7a 53 29 3b 0a 20 20 20 20 20 20  ist, zS);.      
c7a0: 7d 0a 20 20 20 20 20 20 7a 53 20 3d 20 22 2c 20  }.      zS = ", 
c7b0: 22 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 4c 69  ";.      if( zLi
c7c0: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  st==0 ){.       
c7d0: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
c7e0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 62  NOMEM;.        b
c7f0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
c800: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 6f 72 20    }..    /* For 
c810: 61 20 74 61 62 6c 65 20 77 69 74 68 20 69 6d 70  a table with imp
c820: 6c 69 63 69 74 20 72 6f 77 69 64 73 2c 20 61 70  licit rowids, ap
c830: 70 65 6e 64 20 22 6f 6c 64 2e 5f 72 6f 77 69 64  pend "old._rowid
c840: 5f 22 20 74 6f 20 74 68 65 20 6c 69 73 74 2e 20  _" to the list. 
c850: 2a 2f 0a 20 20 20 20 69 66 28 20 70 49 74 65 72  */.    if( pIter
c860: 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f  ->eType==RBU_PK_
c870: 45 58 54 45 52 4e 41 4c 20 7c 7c 20 70 49 74 65  EXTERNAL || pIte
c880: 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b  r->eType==RBU_PK
c890: 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 7a  _NONE ){.      z
c8a0: 4c 69 73 74 20 3d 20 72 62 75 4d 50 72 69 6e 74  List = rbuMPrint
c8b0: 66 28 70 2c 20 22 25 7a 2c 20 25 73 2e 5f 72 6f  f(p, "%z, %s._ro
c8c0: 77 69 64 5f 22 2c 20 7a 4c 69 73 74 2c 20 7a 4f  wid_", zList, zO
c8d0: 62 6a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  bj);.    }.  }. 
c8e0: 20 72 65 74 75 72 6e 20 7a 4c 69 73 74 3b 0a 7d   return zList;.}
c8f0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
c900: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  n expression tha
c910: 74 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 6e  t can be used in
c920: 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20   a WHERE clause 
c930: 74 6f 20 6d 61 74 63 68 20 74 68 65 0a 2a 2a 20  to match the.** 
c940: 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 66 20 74  primary key of t
c950: 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65  he current table
c960: 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69  . For example, i
c970: 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 3a 0a  f the table is:.
c980: 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 54  **.**   CREATE T
c990: 41 42 4c 45 20 74 31 28 61 2c 20 62 2c 20 63 2c  ABLE t1(a, b, c,
c9a0: 20 50 52 49 4d 41 52 59 20 4b 45 59 28 62 2c 20   PRIMARY KEY(b, 
c9b0: 63 29 29 3b 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  c));.**.** Retur
c9c0: 6e 20 74 68 65 20 73 74 72 69 6e 67 3a 0a 2a 2a  n the string:.**
c9d0: 0a 2a 2a 20 20 20 22 62 20 3d 20 3f 31 20 41 4e  .**   "b = ?1 AN
c9e0: 44 20 63 20 3d 20 3f 32 22 0a 2a 2f 0a 73 74 61  D c = ?2".*/.sta
c9f0: 74 69 63 20 63 68 61 72 20 2a 72 62 75 4f 62 6a  tic char *rbuObj
ca00: 49 74 65 72 47 65 74 57 68 65 72 65 28 0a 20 20  IterGetWhere(.  
ca10: 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 0a  sqlite3rbu *p, .
ca20: 20 20 52 62 75 4f 62 6a 49 74 65 72 20 2a 70 49    RbuObjIter *pI
ca30: 74 65 72 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a  ter.){.  char *z
ca40: 4c 69 73 74 20 3d 20 30 3b 0a 20 20 69 66 28 20  List = 0;.  if( 
ca50: 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42  pIter->eType==RB
ca60: 55 5f 50 4b 5f 56 54 41 42 20 7c 7c 20 70 49 74  U_PK_VTAB || pIt
ca70: 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50  er->eType==RBU_P
ca80: 4b 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 7a 4c  K_NONE ){.    zL
ca90: 69 73 74 20 3d 20 72 62 75 4d 50 72 69 6e 74 66  ist = rbuMPrintf
caa0: 28 70 2c 20 22 5f 72 6f 77 69 64 5f 20 3d 20 3f  (p, "_rowid_ = ?
cab0: 25 64 22 2c 20 70 49 74 65 72 2d 3e 6e 54 62 6c  %d", pIter->nTbl
cac0: 43 6f 6c 2b 31 29 3b 0a 20 20 7d 65 6c 73 65 20  Col+1);.  }else 
cad0: 69 66 28 20 70 49 74 65 72 2d 3e 65 54 79 70 65  if( pIter->eType
cae0: 3d 3d 52 42 55 5f 50 4b 5f 45 58 54 45 52 4e 41  ==RBU_PK_EXTERNA
caf0: 4c 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  L ){.    const c
cb00: 68 61 72 20 2a 7a 53 65 70 20 3d 20 22 22 3b 0a  har *zSep = "";.
cb10: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
cb20: 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d  or(i=0; i<pIter-
cb30: 3e 6e 54 62 6c 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  >nTblCol; i++){.
cb40: 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d        if( pIter-
cb50: 3e 61 62 54 62 6c 50 6b 5b 69 5d 20 29 7b 0a 20  >abTblPk[i] ){. 
cb60: 20 20 20 20 20 20 20 7a 4c 69 73 74 20 3d 20 72         zList = r
cb70: 62 75 4d 50 72 69 6e 74 66 28 70 2c 20 22 25 7a  buMPrintf(p, "%z
cb80: 25 73 63 25 64 3d 3f 25 64 22 2c 20 7a 4c 69 73  %sc%d=?%d", zLis
cb90: 74 2c 20 7a 53 65 70 2c 20 69 2c 20 69 2b 31 29  t, zSep, i, i+1)
cba0: 3b 0a 20 20 20 20 20 20 20 20 7a 53 65 70 20 3d  ;.        zSep =
cbb0: 20 22 20 41 4e 44 20 22 3b 0a 20 20 20 20 20 20   " AND ";.      
cbc0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4c 69 73  }.    }.    zLis
cbd0: 74 20 3d 20 72 62 75 4d 50 72 69 6e 74 66 28 70  t = rbuMPrintf(p
cbe0: 2c 20 0a 20 20 20 20 20 20 20 20 22 5f 72 6f 77  , .        "_row
cbf0: 69 64 5f 20 3d 20 28 53 45 4c 45 43 54 20 69 64  id_ = (SELECT id
cc00: 20 46 52 4f 4d 20 72 62 75 5f 69 6d 70 6f 73 74   FROM rbu_impost
cc10: 65 72 32 20 57 48 45 52 45 20 25 7a 29 22 2c 20  er2 WHERE %z)", 
cc20: 7a 4c 69 73 74 0a 20 20 20 20 29 3b 0a 0a 20 20  zList.    );..  
cc30: 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e 73 74  }else{.    const
cc40: 20 63 68 61 72 20 2a 7a 53 65 70 20 3d 20 22 22   char *zSep = ""
cc50: 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
cc60: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65   for(i=0; i<pIte
cc70: 72 2d 3e 6e 54 62 6c 43 6f 6c 3b 20 69 2b 2b 29  r->nTblCol; i++)
cc80: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  {.      if( pIte
cc90: 72 2d 3e 61 62 54 62 6c 50 6b 5b 69 5d 20 29 7b  r->abTblPk[i] ){
cca0: 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
ccb0: 68 61 72 20 2a 7a 43 6f 6c 20 3d 20 70 49 74 65  har *zCol = pIte
ccc0: 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69 5d 3b 0a  r->azTblCol[i];.
ccd0: 20 20 20 20 20 20 20 20 7a 4c 69 73 74 20 3d 20          zList = 
cce0: 72 62 75 4d 50 72 69 6e 74 66 28 70 2c 20 22 25  rbuMPrintf(p, "%
ccf0: 7a 25 73 5c 22 25 77 5c 22 3d 3f 25 64 22 2c 20  z%s\"%w\"=?%d", 
cd00: 7a 4c 69 73 74 2c 20 7a 53 65 70 2c 20 7a 43 6f  zList, zSep, zCo
cd10: 6c 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 20  l, i+1);.       
cd20: 20 7a 53 65 70 20 3d 20 22 20 41 4e 44 20 22 3b   zSep = " AND ";
cd30: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
cd40: 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4c 69 73   }.  return zLis
cd50: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  t;.}../*.** The 
cd60: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
cd70: 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75   iterating throu
cd80: 67 68 20 74 68 65 20 6b 65 79 73 20 66 6f 72 20  gh the keys for 
cd90: 74 68 65 20 63 75 72 72 65 6e 74 20 6f 62 6a 65  the current obje
cda0: 63 74 0a 2a 2a 20 28 70 2d 3e 6f 62 6a 69 74 65  ct.** (p->objite
cdb0: 72 2e 70 53 65 6c 65 63 74 29 20 63 75 72 72 65  r.pSelect) curre
cdc0: 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 61  ntly points to a
cdd0: 20 76 61 6c 69 64 20 72 6f 77 2e 20 48 6f 77 65   valid row. Howe
cde0: 76 65 72 2c 20 74 68 65 72 65 0a 2a 2a 20 69 73  ver, there.** is
cdf0: 20 73 6f 6d 65 74 68 69 6e 67 20 77 72 6f 6e 67   something wrong
ce00: 20 77 69 74 68 20 74 68 65 20 72 62 75 5f 63 6f   with the rbu_co
ce10: 6e 74 72 6f 6c 20 76 61 6c 75 65 20 69 6e 20 74  ntrol value in t
ce20: 68 65 20 72 62 75 5f 63 6f 6e 74 72 6f 6c 20 76  he rbu_control v
ce30: 61 6c 75 65 0a 2a 2a 20 73 74 6f 72 65 64 20 69  alue.** stored i
ce40: 6e 20 74 68 65 20 28 70 2d 3e 6e 43 6f 6c 2b 31  n the (p->nCol+1
ce50: 29 27 74 68 20 63 6f 6c 75 6d 6e 2e 20 53 65 74  )'th column. Set
ce60: 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
ce70: 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67  and error messag
ce80: 65 0a 2a 2a 20 6f 66 20 74 68 65 20 52 42 55 20  e.** of the RBU 
ce90: 68 61 6e 64 6c 65 20 74 6f 20 73 6f 6d 65 74 68  handle to someth
cea0: 69 6e 67 20 72 65 66 6c 65 63 74 69 6e 67 20 74  ing reflecting t
ceb0: 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  his..*/.static v
cec0: 6f 69 64 20 72 62 75 42 61 64 43 6f 6e 74 72 6f  oid rbuBadContro
ced0: 6c 45 72 72 6f 72 28 73 71 6c 69 74 65 33 72 62  lError(sqlite3rb
cee0: 75 20 2a 70 29 7b 0a 20 20 70 2d 3e 72 63 20 3d  u *p){.  p->rc =
cef0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
cf00: 20 70 2d 3e 7a 45 72 72 6d 73 67 20 3d 20 73 71   p->zErrmsg = sq
cf10: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 69  lite3_mprintf("i
cf20: 6e 76 61 6c 69 64 20 72 62 75 5f 63 6f 6e 74 72  nvalid rbu_contr
cf30: 6f 6c 20 76 61 6c 75 65 22 29 3b 0a 7d 0a 0a 0a  ol value");.}...
cf40: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 6e  /*.** Return a n
cf50: 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74  ul-terminated st
cf60: 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ring containing 
cf70: 74 68 65 20 63 6f 6d 6d 61 20 73 65 70 61 72 61  the comma separa
cf80: 74 65 64 20 6c 69 73 74 20 6f 66 0a 2a 2a 20 61  ted list of.** a
cf90: 73 73 69 67 6e 6d 65 6e 74 73 20 74 68 61 74 20  ssignments that 
cfa0: 73 68 6f 75 6c 64 20 62 65 20 69 6e 63 6c 75 64  should be includ
cfb0: 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ed following the
cfc0: 20 22 53 45 54 22 20 6b 65 79 77 6f 72 64 20 6f   "SET" keyword o
cfd0: 66 0a 2a 2a 20 61 6e 20 55 50 44 41 54 45 20 73  f.** an UPDATE s
cfe0: 74 61 74 65 6d 65 6e 74 20 75 73 65 64 20 74 6f  tatement used to
cff0: 20 75 70 64 61 74 65 20 74 68 65 20 74 61 62 6c   update the tabl
d000: 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20 74 68  e object that th
d010: 65 20 69 74 65 72 61 74 6f 72 0a 2a 2a 20 70 61  e iterator.** pa
d020: 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
d030: 6e 64 20 61 72 67 75 6d 65 6e 74 20 63 75 72 72  nd argument curr
d040: 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20  ently points to 
d050: 69 66 20 74 68 65 20 72 62 75 5f 63 6f 6e 74 72  if the rbu_contr
d060: 6f 6c 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6f 66 20  ol.** column of 
d070: 74 68 65 20 64 61 74 61 5f 78 78 78 20 74 61 62  the data_xxx tab
d080: 6c 65 20 65 6e 74 72 79 20 69 73 20 73 65 74 20  le entry is set 
d090: 74 6f 20 7a 4d 61 73 6b 2e 0a 2a 2a 0a 2a 2a 20  to zMask..**.** 
d0a0: 54 68 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74  The memory for t
d0b0: 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69  he returned stri
d0c0: 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  ng is obtained f
d0d0: 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
d0e0: 6f 63 28 29 2e 0a 2a 2a 20 49 74 20 69 73 20 74  oc()..** It is t
d0f0: 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  he responsibilit
d100: 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20  y of the caller 
d110: 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72  to eventually fr
d120: 65 65 20 69 74 20 75 73 69 6e 67 0a 2a 2a 20 73  ee it using.** s
d130: 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 20 0a  qlite3_free(). .
d140: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20  **.** If an OOM 
d150: 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74  error is encount
d160: 65 72 65 64 20 77 68 65 6e 20 61 6c 6c 6f 63 61  ered when alloca
d170: 74 69 6e 67 20 73 70 61 63 65 20 66 6f 72 20 74  ting space for t
d180: 68 65 20 6e 65 77 0a 2a 2a 20 73 74 72 69 6e 67  he new.** string
d190: 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  , an error code 
d1a0: 69 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20 72  is left in the r
d1b0: 62 75 20 68 61 6e 64 6c 65 20 70 61 73 73 65 64  bu handle passed
d1c0: 20 61 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a   as the first.**
d1d0: 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 4e 55   argument and NU
d1e0: 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  LL is returned. 
d1f0: 4f 72 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20  Or, if an error 
d200: 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75  has already occu
d210: 72 72 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 69  rred.** when thi
d220: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
d230: 6c 6c 65 64 2c 20 4e 55 4c 4c 20 69 73 20 72 65  lled, NULL is re
d240: 74 75 72 6e 65 64 20 69 6d 6d 65 64 69 61 74 65  turned immediate
d250: 6c 79 2c 20 77 69 74 68 6f 75 74 0a 2a 2a 20 61  ly, without.** a
d260: 74 74 65 6d 70 74 69 6e 67 20 74 68 65 20 61 6c  ttempting the al
d270: 6c 6f 63 61 74 69 6f 6e 20 6f 72 20 6d 6f 64 69  location or modi
d280: 66 79 69 6e 67 20 74 68 65 20 73 74 6f 72 65 64  fying the stored
d290: 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a   error code..*/.
d2a0: 73 74 61 74 69 63 20 63 68 61 72 20 2a 72 62 75  static char *rbu
d2b0: 4f 62 6a 49 74 65 72 47 65 74 53 65 74 6c 69 73  ObjIterGetSetlis
d2c0: 74 28 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20  t(.  sqlite3rbu 
d2d0: 2a 70 2c 0a 20 20 52 62 75 4f 62 6a 49 74 65 72  *p,.  RbuObjIter
d2e0: 20 2a 70 49 74 65 72 2c 0a 20 20 63 6f 6e 73 74   *pIter,.  const
d2f0: 20 63 68 61 72 20 2a 7a 4d 61 73 6b 0a 29 7b 0a   char *zMask.){.
d300: 20 20 63 68 61 72 20 2a 7a 4c 69 73 74 20 3d 20    char *zList = 
d310: 30 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  0;.  if( p->rc==
d320: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
d330: 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20 69 66 28   int i;..    if(
d340: 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 4d 61   (int)strlen(zMa
d350: 73 6b 29 21 3d 70 49 74 65 72 2d 3e 6e 54 62 6c  sk)!=pIter->nTbl
d360: 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 72 62 75  Col ){.      rbu
d370: 42 61 64 43 6f 6e 74 72 6f 6c 45 72 72 6f 72 28  BadControlError(
d380: 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  p);.    }else{. 
d390: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
d3a0: 2a 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20 20 20  *zSep = "";.    
d3b0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74    for(i=0; i<pIt
d3c0: 65 72 2d 3e 6e 54 62 6c 43 6f 6c 3b 20 69 2b 2b  er->nTblCol; i++
d3d0: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
d3e0: 63 20 3d 20 7a 4d 61 73 6b 5b 70 49 74 65 72 2d  c = zMask[pIter-
d3f0: 3e 61 69 53 72 63 4f 72 64 65 72 5b 69 5d 5d 3b  >aiSrcOrder[i]];
d400: 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d  .        if( c==
d410: 27 78 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20  'x' ){.         
d420: 20 7a 4c 69 73 74 20 3d 20 72 62 75 4d 50 72 69   zList = rbuMPri
d430: 6e 74 66 28 70 2c 20 22 25 7a 25 73 5c 22 25 77  ntf(p, "%z%s\"%w
d440: 5c 22 3d 3f 25 64 22 2c 20 0a 20 20 20 20 20 20  \"=?%d", .      
d450: 20 20 20 20 20 20 20 20 7a 4c 69 73 74 2c 20 7a          zList, z
d460: 53 65 70 2c 20 70 49 74 65 72 2d 3e 61 7a 54 62  Sep, pIter->azTb
d470: 6c 43 6f 6c 5b 69 5d 2c 20 69 2b 31 0a 20 20 20  lCol[i], i+1.   
d480: 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
d490: 20 20 20 20 7a 53 65 70 20 3d 20 22 2c 20 22 3b      zSep = ", ";
d4a0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
d4b0: 20 20 20 65 6c 73 65 20 69 66 28 20 63 3d 3d 27     else if( c=='
d4c0: 64 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  d' ){.          
d4d0: 7a 4c 69 73 74 20 3d 20 72 62 75 4d 50 72 69 6e  zList = rbuMPrin
d4e0: 74 66 28 70 2c 20 22 25 7a 25 73 5c 22 25 77 5c  tf(p, "%z%s\"%w\
d4f0: 22 3d 72 62 75 5f 64 65 6c 74 61 28 5c 22 25 77  "=rbu_delta(\"%w
d500: 5c 22 2c 20 3f 25 64 29 22 2c 20 0a 20 20 20 20  \", ?%d)", .    
d510: 20 20 20 20 20 20 20 20 20 20 7a 4c 69 73 74 2c            zList,
d520: 20 7a 53 65 70 2c 20 70 49 74 65 72 2d 3e 61 7a   zSep, pIter->az
d530: 54 62 6c 43 6f 6c 5b 69 5d 2c 20 70 49 74 65 72  TblCol[i], pIter
d540: 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69 5d 2c 20 69  ->azTblCol[i], i
d550: 2b 31 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a  +1.          );.
d560: 20 20 20 20 20 20 20 20 20 20 7a 53 65 70 20 3d            zSep =
d570: 20 22 2c 20 22 3b 0a 20 20 20 20 20 20 20 20 7d   ", ";.        }
d580: 0a 20 20 20 20 20 20 20 20 65 6c 73 65 20 69 66  .        else if
d590: 28 20 63 3d 3d 27 66 27 20 29 7b 0a 20 20 20 20  ( c=='f' ){.    
d5a0: 20 20 20 20 20 20 7a 4c 69 73 74 20 3d 20 72 62        zList = rb
d5b0: 75 4d 50 72 69 6e 74 66 28 70 2c 20 22 25 7a 25  uMPrintf(p, "%z%
d5c0: 73 5c 22 25 77 5c 22 3d 72 62 75 5f 66 6f 73 73  s\"%w\"=rbu_foss
d5d0: 69 6c 5f 64 65 6c 74 61 28 5c 22 25 77 5c 22 2c  il_delta(\"%w\",
d5e0: 20 3f 25 64 29 22 2c 20 0a 20 20 20 20 20 20 20   ?%d)", .       
d5f0: 20 20 20 20 20 20 20 7a 4c 69 73 74 2c 20 7a 53         zList, zS
d600: 65 70 2c 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c  ep, pIter->azTbl
d610: 43 6f 6c 5b 69 5d 2c 20 70 49 74 65 72 2d 3e 61  Col[i], pIter->a
d620: 7a 54 62 6c 43 6f 6c 5b 69 5d 2c 20 69 2b 31 0a  zTblCol[i], i+1.
d630: 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20            );.   
d640: 20 20 20 20 20 20 20 7a 53 65 70 20 3d 20 22 2c         zSep = ",
d650: 20 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   ";.        }.  
d660: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
d670: 20 20 72 65 74 75 72 6e 20 7a 4c 69 73 74 3b 0a    return zList;.
d680: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
d690: 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64  a nul-terminated
d6a0: 20 73 74 72 69 6e 67 20 63 6f 6e 73 69 73 74 69   string consisti
d6b0: 6e 67 20 6f 66 20 6e 42 79 74 65 20 63 6f 6d 6d  ng of nByte comm
d6c0: 61 20 73 65 70 61 72 61 74 65 64 0a 2a 2a 20 22  a separated.** "
d6d0: 3f 22 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 20  ?" expressions. 
d6e0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20  For example, if 
d6f0: 6e 42 79 74 65 20 69 73 20 33 2c 20 72 65 74 75  nByte is 3, retu
d700: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 0a  rn a pointer to.
d710: 2a 2a 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74  ** a buffer cont
d720: 61 69 6e 69 6e 67 20 74 68 65 20 73 74 72 69 6e  aining the strin
d730: 67 20 22 3f 2c 3f 2c 3f 22 2e 0a 2a 2a 0a 2a 2a  g "?,?,?"..**.**
d740: 20 54 68 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20   The memory for 
d750: 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72  the returned str
d760: 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ing is obtained 
d770: 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  from sqlite3_mal
d780: 6c 6f 63 28 29 2e 0a 2a 2a 20 49 74 20 69 73 20  loc()..** It is 
d790: 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  the responsibili
d7a0: 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72  ty of the caller
d7b0: 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 66   to eventually f
d7c0: 72 65 65 20 69 74 20 75 73 69 6e 67 0a 2a 2a 20  ree it using.** 
d7d0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 20  sqlite3_free(). 
d7e0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d  .**.** If an OOM
d7f0: 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e   error is encoun
d800: 74 65 72 65 64 20 77 68 65 6e 20 61 6c 6c 6f 63  tered when alloc
d810: 61 74 69 6e 67 20 73 70 61 63 65 20 66 6f 72 20  ating space for 
d820: 74 68 65 20 6e 65 77 0a 2a 2a 20 73 74 72 69 6e  the new.** strin
d830: 67 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  g, an error code
d840: 20 69 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20   is left in the 
d850: 72 62 75 20 68 61 6e 64 6c 65 20 70 61 73 73 65  rbu handle passe
d860: 64 20 61 73 20 74 68 65 20 66 69 72 73 74 0a 2a  d as the first.*
d870: 2a 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 4e  * argument and N
d880: 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ULL is returned.
d890: 20 4f 72 2c 20 69 66 20 61 6e 20 65 72 72 6f 72   Or, if an error
d8a0: 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63   has already occ
d8b0: 75 72 72 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68  urred.** when th
d8c0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
d8d0: 61 6c 6c 65 64 2c 20 4e 55 4c 4c 20 69 73 20 72  alled, NULL is r
d8e0: 65 74 75 72 6e 65 64 20 69 6d 6d 65 64 69 61 74  eturned immediat
d8f0: 65 6c 79 2c 20 77 69 74 68 6f 75 74 0a 2a 2a 20  ely, without.** 
d900: 61 74 74 65 6d 70 74 69 6e 67 20 74 68 65 20 61  attempting the a
d910: 6c 6c 6f 63 61 74 69 6f 6e 20 6f 72 20 6d 6f 64  llocation or mod
d920: 69 66 79 69 6e 67 20 74 68 65 20 73 74 6f 72 65  ifying the store
d930: 64 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f  d error code..*/
d940: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 72 62  .static char *rb
d950: 75 4f 62 6a 49 74 65 72 47 65 74 42 69 6e 64 6c  uObjIterGetBindl
d960: 69 73 74 28 73 71 6c 69 74 65 33 72 62 75 20 2a  ist(sqlite3rbu *
d970: 70 2c 20 69 6e 74 20 6e 42 69 6e 64 29 7b 0a 20  p, int nBind){. 
d980: 20 63 68 61 72 20 2a 7a 52 65 74 20 3d 20 30 3b   char *zRet = 0;
d990: 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 6e  .  int nByte = n
d9a0: 42 69 6e 64 2a 32 20 2b 20 31 3b 0a 0a 20 20 7a  Bind*2 + 1;..  z
d9b0: 52 65 74 20 3d 20 28 63 68 61 72 2a 29 72 62 75  Ret = (char*)rbu
d9c0: 4d 61 6c 6c 6f 63 28 70 2c 20 6e 42 79 74 65 29  Malloc(p, nByte)
d9d0: 3b 0a 20 20 69 66 28 20 7a 52 65 74 20 29 7b 0a  ;.  if( zRet ){.
d9e0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
d9f0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 69 6e 64 3b  or(i=0; i<nBind;
da00: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 52 65   i++){.      zRe
da10: 74 5b 69 2a 32 5d 20 3d 20 27 3f 27 3b 0a 20 20  t[i*2] = '?';.  
da20: 20 20 20 20 7a 52 65 74 5b 69 2a 32 2b 31 5d 20      zRet[i*2+1] 
da30: 3d 20 28 69 2b 31 3d 3d 6e 42 69 6e 64 29 20 3f  = (i+1==nBind) ?
da40: 20 27 5c 30 27 20 3a 20 27 2c 27 3b 0a 20 20 20   '\0' : ',';.   
da50: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
da60: 7a 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  zRet;.}../*.** T
da70: 68 65 20 69 74 65 72 61 74 6f 72 20 63 75 72 72  he iterator curr
da80: 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20  ently points to 
da90: 61 20 74 61 62 6c 65 20 28 6e 6f 74 20 69 6e 64  a table (not ind
daa0: 65 78 29 20 6f 66 20 74 79 70 65 20 0a 2a 2a 20  ex) of type .** 
dab0: 52 42 55 5f 50 4b 5f 57 49 54 48 4f 55 54 5f 52  RBU_PK_WITHOUT_R
dac0: 4f 57 49 44 2e 20 54 68 69 73 20 66 75 6e 63 74  OWID. This funct
dad0: 69 6f 6e 20 63 72 65 61 74 65 73 20 74 68 65 20  ion creates the 
dae0: 50 52 49 4d 41 52 59 20 4b 45 59 20 0a 2a 2a 20  PRIMARY KEY .** 
daf0: 64 65 63 6c 61 72 61 74 69 6f 6e 20 66 6f 72 20  declaration for 
db00: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
db10: 67 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65  g imposter table
db20: 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 0a 2a  . For example,.*
db30: 2a 20 69 66 20 74 68 65 20 69 74 65 72 61 74 6f  * if the iterato
db40: 72 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 74 61  r points to a ta
db50: 62 6c 65 20 63 72 65 61 74 65 64 20 61 73 3a 0a  ble created as:.
db60: 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 54  **.**   CREATE T
db70: 41 42 4c 45 20 74 31 28 61 2c 20 62 2c 20 63 2c  ABLE t1(a, b, c,
db80: 20 50 52 49 4d 41 52 59 20 4b 45 59 28 62 2c 20   PRIMARY KEY(b, 
db90: 61 20 44 45 53 43 29 29 20 57 49 54 48 4f 55 54  a DESC)) WITHOUT
dba0: 20 52 4f 57 49 44 0a 2a 2a 0a 2a 2a 20 74 68 69   ROWID.**.** thi
dbb0: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
dbc0: 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 52 49 4d  ns:.**.**   PRIM
dbd0: 41 52 59 20 4b 45 59 28 22 62 22 2c 20 22 61 22  ARY KEY("b", "a"
dbe0: 20 44 45 53 43 29 0a 2a 2f 0a 73 74 61 74 69 63   DESC).*/.static
dbf0: 20 63 68 61 72 20 2a 72 62 75 57 69 74 68 6f 75   char *rbuWithou
dc00: 74 52 6f 77 69 64 50 4b 28 73 71 6c 69 74 65 33  tRowidPK(sqlite3
dc10: 72 62 75 20 2a 70 2c 20 52 62 75 4f 62 6a 49 74  rbu *p, RbuObjIt
dc20: 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 63 68  er *pIter){.  ch
dc30: 61 72 20 2a 7a 20 3d 20 30 3b 0a 20 20 61 73 73  ar *z = 0;.  ass
dc40: 65 72 74 28 20 70 49 74 65 72 2d 3e 7a 49 64 78  ert( pIter->zIdx
dc50: 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  ==0 );.  if( p->
dc60: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
dc70: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
dc80: 2a 7a 53 65 70 20 3d 20 22 50 52 49 4d 41 52 59  *zSep = "PRIMARY
dc90: 20 4b 45 59 28 22 3b 0a 20 20 20 20 73 71 6c 69   KEY(";.    sqli
dca0: 74 65 33 5f 73 74 6d 74 20 2a 70 58 4c 69 73 74  te3_stmt *pXList
dcb0: 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 50 52 41   = 0;     /* PRA
dcc0: 47 4d 41 20 69 6e 64 65 78 5f 6c 69 73 74 20 3d  GMA index_list =
dcd0: 20 28 70 49 74 65 72 2d 3e 7a 54 62 6c 29 20 2a   (pIter->zTbl) *
dce0: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  /.    sqlite3_st
dcf0: 6d 74 20 2a 70 58 49 6e 66 6f 20 3d 20 30 3b 20  mt *pXInfo = 0; 
dd00: 20 20 20 20 2f 2a 20 50 52 41 47 4d 41 20 69 6e      /* PRAGMA in
dd10: 64 65 78 5f 78 69 6e 66 6f 20 3d 20 3c 70 6b 2d  dex_xinfo = <pk-
dd20: 69 6e 64 65 78 3e 20 2a 2f 0a 20 20 20 0a 20 20  index> */.   .  
dd30: 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72    p->rc = prepar
dd40: 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45  eFreeAndCollectE
dd50: 72 72 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20  rror(p->dbMain, 
dd60: 26 70 58 4c 69 73 74 2c 20 26 70 2d 3e 7a 45 72  &pXList, &p->zEr
dd70: 72 6d 73 67 2c 0a 20 20 20 20 20 20 20 20 73 71  rmsg,.        sq
dd80: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 50  lite3_mprintf("P
dd90: 52 41 47 4d 41 20 6d 61 69 6e 2e 69 6e 64 65 78  RAGMA main.index
dda0: 5f 6c 69 73 74 20 3d 20 25 51 22 2c 20 70 49 74  _list = %Q", pIt
ddb0: 65 72 2d 3e 7a 54 62 6c 29 0a 20 20 20 20 29 3b  er->zTbl).    );
ddc0: 0a 20 20 20 20 77 68 69 6c 65 28 20 70 2d 3e 72  .    while( p->r
ddd0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
dde0: 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69  SQLITE_ROW==sqli
ddf0: 74 65 33 5f 73 74 65 70 28 70 58 4c 69 73 74 29  te3_step(pXList)
de00: 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   ){.      const 
de10: 63 68 61 72 20 2a 7a 4f 72 69 67 20 3d 20 28 63  char *zOrig = (c
de20: 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
de30: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
de40: 58 4c 69 73 74 2c 33 29 3b 0a 20 20 20 20 20 20  XList,3);.      
de50: 69 66 28 20 7a 4f 72 69 67 20 26 26 20 73 74 72  if( zOrig && str
de60: 63 6d 70 28 7a 4f 72 69 67 2c 20 22 70 6b 22 29  cmp(zOrig, "pk")
de70: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ==0 ){.        c
de80: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 78 20  onst char *zIdx 
de90: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
dea0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
deb0: 78 74 28 70 58 4c 69 73 74 2c 31 29 3b 0a 20 20  xt(pXList,1);.  
dec0: 20 20 20 20 20 20 69 66 28 20 7a 49 64 78 20 29        if( zIdx )
ded0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72  {.          p->r
dee0: 63 20 3d 20 70 72 65 70 61 72 65 46 72 65 65 41  c = prepareFreeA
def0: 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70  ndCollectError(p
df00: 2d 3e 64 62 4d 61 69 6e 2c 20 26 70 58 49 6e 66  ->dbMain, &pXInf
df10: 6f 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 0a  o, &p->zErrmsg,.
df20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
df30: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 50  lite3_mprintf("P
df40: 52 41 47 4d 41 20 6d 61 69 6e 2e 69 6e 64 65 78  RAGMA main.index
df50: 5f 78 69 6e 66 6f 20 3d 20 25 51 22 2c 20 7a 49  _xinfo = %Q", zI
df60: 64 78 29 0a 20 20 20 20 20 20 20 20 20 20 29 3b  dx).          );
df70: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
df80: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
df90: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 62 75 46  }.    }.    rbuF
dfa0: 69 6e 61 6c 69 7a 65 28 70 2c 20 70 58 4c 69 73  inalize(p, pXLis
dfb0: 74 29 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20  t);..    while( 
dfc0: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
dfd0: 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d   && SQLITE_ROW==
dfe0: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 58 49  sqlite3_step(pXI
dff0: 6e 66 6f 29 20 29 7b 0a 20 20 20 20 20 20 69 66  nfo) ){.      if
e000: 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  ( sqlite3_column
e010: 5f 69 6e 74 28 70 58 49 6e 66 6f 2c 20 35 29 20  _int(pXInfo, 5) 
e020: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 69 6e  ){.        /* in
e030: 74 20 69 43 69 64 20 3d 20 73 71 6c 69 74 65 33  t iCid = sqlite3
e040: 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 58 49 6e  _column_int(pXIn
e050: 66 6f 2c 20 30 29 3b 20 2a 2f 0a 20 20 20 20 20  fo, 0); */.     
e060: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
e070: 43 6f 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  Col = (const cha
e080: 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
e090: 6e 5f 74 65 78 74 28 70 58 49 6e 66 6f 2c 20 32  n_text(pXInfo, 2
e0a0: 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  );.        const
e0b0: 20 63 68 61 72 20 2a 7a 44 65 73 63 20 3d 20 73   char *zDesc = s
e0c0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
e0d0: 74 28 70 58 49 6e 66 6f 2c 20 33 29 20 3f 20 22  t(pXInfo, 3) ? "
e0e0: 20 44 45 53 43 22 20 3a 20 22 22 3b 0a 20 20 20   DESC" : "";.   
e0f0: 20 20 20 20 20 7a 20 3d 20 72 62 75 4d 50 72 69       z = rbuMPri
e100: 6e 74 66 28 70 2c 20 22 25 7a 25 73 5c 22 25 77  ntf(p, "%z%s\"%w
e110: 5c 22 25 73 22 2c 20 7a 2c 20 7a 53 65 70 2c 20  \"%s", z, zSep, 
e120: 7a 43 6f 6c 2c 20 7a 44 65 73 63 29 3b 0a 20 20  zCol, zDesc);.  
e130: 20 20 20 20 20 20 7a 53 65 70 20 3d 20 22 2c 20        zSep = ", 
e140: 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ";.      }.    }
e150: 0a 20 20 20 20 7a 20 3d 20 72 62 75 4d 50 72 69  .    z = rbuMPri
e160: 6e 74 66 28 70 2c 20 22 25 7a 29 22 2c 20 7a 29  ntf(p, "%z)", z)
e170: 3b 0a 20 20 20 20 72 62 75 46 69 6e 61 6c 69 7a  ;.    rbuFinaliz
e180: 65 28 70 2c 20 70 58 49 6e 66 6f 29 3b 0a 20 20  e(p, pXInfo);.  
e190: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a  }.  return z;.}.
e1a0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
e1b0: 74 69 6f 6e 20 63 72 65 61 74 65 73 20 74 68 65  tion creates the
e1c0: 20 73 65 63 6f 6e 64 20 69 6d 70 6f 73 74 65 72   second imposter
e1d0: 20 74 61 62 6c 65 20 75 73 65 64 20 77 68 65 6e   table used when
e1e0: 20 77 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 61   writing to.** a
e1f0: 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20 77 68   table b-tree wh
e200: 65 72 65 20 74 68 65 20 74 61 62 6c 65 20 68 61  ere the table ha
e210: 73 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 70 72  s an external pr
e220: 69 6d 61 72 79 20 6b 65 79 2e 20 49 66 20 74 68  imary key. If th
e230: 65 0a 2a 2a 20 69 74 65 72 61 74 6f 72 20 70 61  e.** iterator pa
e240: 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
e250: 6e 64 20 61 72 67 75 6d 65 6e 74 20 64 6f 65 73  nd argument does
e260: 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 70   not currently p
e270: 6f 69 6e 74 20 74 6f 0a 2a 2a 20 61 20 74 61 62  oint to.** a tab
e280: 6c 65 20 28 6e 6f 74 20 69 6e 64 65 78 29 20 77  le (not index) w
e290: 69 74 68 20 61 6e 20 65 78 74 65 72 6e 61 6c 20  ith an external 
e2a0: 70 72 69 6d 61 72 79 20 6b 65 79 2c 20 74 68 69  primary key, thi
e2b0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 0a  s function is a.
e2c0: 2a 2a 20 6e 6f 2d 6f 70 2e 20 0a 2a 2a 0a 2a 2a  ** no-op. .**.**
e2d0: 20 41 73 73 75 6d 69 6e 67 20 74 68 65 20 69 74   Assuming the it
e2e0: 65 72 61 74 6f 72 20 64 6f 65 73 20 70 6f 69 6e  erator does poin
e2f0: 74 20 74 6f 20 61 20 74 61 62 6c 65 20 77 69 74  t to a table wit
e300: 68 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 50 4b  h an external PK
e310: 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  , this.** functi
e320: 6f 6e 20 63 72 65 61 74 65 73 20 61 20 57 49 54  on creates a WIT
e330: 48 4f 55 54 20 52 4f 57 49 44 20 69 6d 70 6f 73  HOUT ROWID impos
e340: 74 65 72 20 74 61 62 6c 65 20 6e 61 6d 65 64 20  ter table named 
e350: 22 72 62 75 5f 69 6d 70 6f 73 74 65 72 32 22 0a  "rbu_imposter2".
e360: 2a 2a 20 75 73 65 64 20 74 6f 20 61 63 63 65 73  ** used to acces
e370: 73 20 74 68 61 74 20 50 4b 20 69 6e 64 65 78 2e  s that PK index.
e380: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66   For example, if
e390: 20 74 68 65 20 74 61 72 67 65 74 20 74 61 62 6c   the target tabl
e3a0: 65 20 69 73 0a 2a 2a 20 64 65 63 6c 61 72 65 64  e is.** declared
e3b0: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
e3c0: 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  **   CREATE TABL
e3d0: 45 20 74 31 28 61 2c 20 62 20 54 45 58 54 2c 20  E t1(a, b TEXT, 
e3e0: 63 20 52 45 41 4c 2c 20 50 52 49 4d 41 52 59 20  c REAL, PRIMARY 
e3f0: 4b 45 59 28 62 2c 20 63 29 29 3b 0a 2a 2a 0a 2a  KEY(b, c));.**.*
e400: 2a 20 74 68 65 6e 20 74 68 65 20 69 6d 70 6f 73  * then the impos
e410: 74 65 72 20 74 61 62 6c 65 20 73 63 68 65 6d 61  ter table schema
e420: 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45   is:.**.**   CRE
e430: 41 54 45 20 54 41 42 4c 45 20 72 62 75 5f 69 6d  ATE TABLE rbu_im
e440: 70 6f 73 74 65 72 32 28 63 31 20 54 45 58 54 2c  poster2(c1 TEXT,
e450: 20 63 32 20 52 45 41 4c 2c 20 69 64 20 49 4e 54   c2 REAL, id INT
e460: 45 47 45 52 29 20 57 49 54 48 4f 55 54 20 52 4f  EGER) WITHOUT RO
e470: 57 49 44 3b 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69  WID;.**.*/.stati
e480: 63 20 76 6f 69 64 20 72 62 75 43 72 65 61 74 65  c void rbuCreate
e490: 49 6d 70 6f 73 74 65 72 54 61 62 6c 65 32 28 73  ImposterTable2(s
e4a0: 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 52 62  qlite3rbu *p, Rb
e4b0: 75 4f 62 6a 49 74 65 72 20 2a 70 49 74 65 72 29  uObjIter *pIter)
e4c0: 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  {.  if( p->rc==S
e4d0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 49 74 65  QLITE_OK && pIte
e4e0: 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b  r->eType==RBU_PK
e4f0: 5f 45 58 54 45 52 4e 41 4c 20 29 7b 0a 20 20 20  _EXTERNAL ){.   
e500: 20 69 6e 74 20 74 6e 75 6d 20 3d 20 70 49 74 65   int tnum = pIte
e510: 72 2d 3e 69 50 6b 54 6e 75 6d 3b 20 20 20 20 2f  r->iPkTnum;    /
e520: 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 50  * Root page of P
e530: 4b 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 73  K index */.    s
e540: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 51 75  qlite3_stmt *pQu
e550: 65 72 79 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  ery = 0;     /* 
e560: 53 45 4c 45 43 54 20 6e 61 6d 65 20 2e 2e 2e 20  SELECT name ... 
e570: 57 48 45 52 45 20 72 6f 6f 74 70 61 67 65 20 3d  WHERE rootpage =
e580: 20 24 74 6e 75 6d 20 2a 2f 0a 20 20 20 20 63 6f   $tnum */.    co
e590: 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 78 20 3d  nst char *zIdx =
e5a0: 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e   0;         /* N
e5b0: 61 6d 65 20 6f 66 20 50 4b 20 69 6e 64 65 78 20  ame of PK index 
e5c0: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  */.    sqlite3_s
e5d0: 74 6d 74 20 2a 70 58 49 6e 66 6f 20 3d 20 30 3b  tmt *pXInfo = 0;
e5e0: 20 20 20 20 20 2f 2a 20 50 52 41 47 4d 41 20 6d       /* PRAGMA m
e5f0: 61 69 6e 2e 69 6e 64 65 78 5f 78 69 6e 66 6f 20  ain.index_xinfo 
e600: 3d 20 24 7a 49 64 78 20 2a 2f 0a 20 20 20 20 63  = $zIdx */.    c
e610: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6d 6d  onst char *zComm
e620: 61 20 3d 20 22 22 3b 0a 20 20 20 20 63 68 61 72  a = "";.    char
e630: 20 2a 7a 43 6f 6c 73 20 3d 20 30 3b 20 20 20 20   *zCols = 0;    
e640: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
e650: 64 20 74 6f 20 62 75 69 6c 64 20 75 70 20 6c 69  d to build up li
e660: 73 74 20 6f 66 20 74 61 62 6c 65 20 63 6f 6c 73  st of table cols
e670: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 50   */.    char *zP
e680: 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  k = 0;          
e690: 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
e6a0: 20 62 75 69 6c 64 20 75 70 20 74 61 62 6c 65 20   build up table 
e6b0: 50 4b 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a  PK declaration *
e6c0: 2f 0a 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65  /..    /* Figure
e6d0: 20 6f 75 74 20 74 68 65 20 6e 61 6d 65 20 6f 66   out the name of
e6e0: 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79   the primary key
e6f0: 20 69 6e 64 65 78 20 66 6f 72 20 74 68 65 20 63   index for the c
e700: 75 72 72 65 6e 74 20 74 61 62 6c 65 2e 0a 20 20  urrent table..  
e710: 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e 65 65    ** This is nee
e720: 64 65 64 20 66 6f 72 20 74 68 65 20 61 72 67 75  ded for the argu
e730: 6d 65 6e 74 20 74 6f 20 22 50 52 41 47 4d 41 20  ment to "PRAGMA 
e740: 69 6e 64 65 78 5f 78 69 6e 66 6f 22 2e 20 53 65  index_xinfo". Se
e750: 74 0a 20 20 20 20 2a 2a 20 7a 49 64 78 20 74 6f  t.    ** zIdx to
e760: 20 70 6f 69 6e 74 20 74 6f 20 61 20 6e 75 6c 2d   point to a nul-
e770: 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e  terminated strin
e780: 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69  g containing thi
e790: 73 20 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 70  s name. */.    p
e7a0: 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65 41 6e  ->rc = prepareAn
e7b0: 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d  dCollectError(p-
e7c0: 3e 64 62 4d 61 69 6e 2c 20 26 70 51 75 65 72 79  >dbMain, &pQuery
e7d0: 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 20 0a  , &p->zErrmsg, .
e7e0: 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
e7f0: 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74 65  name FROM sqlite
e800: 5f 6d 61 73 74 65 72 20 57 48 45 52 45 20 72 6f  _master WHERE ro
e810: 6f 74 70 61 67 65 20 3d 20 3f 22 0a 20 20 20 20  otpage = ?".    
e820: 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  );.    if( p->rc
e830: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
e840: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
e850: 64 5f 69 6e 74 28 70 51 75 65 72 79 2c 20 31 2c  d_int(pQuery, 1,
e860: 20 74 6e 75 6d 29 3b 0a 20 20 20 20 20 20 69 66   tnum);.      if
e870: 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71  ( SQLITE_ROW==sq
e880: 6c 69 74 65 33 5f 73 74 65 70 28 70 51 75 65 72  lite3_step(pQuer
e890: 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 49  y) ){.        zI
e8a0: 64 78 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  dx = (const char
e8b0: 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
e8c0: 5f 74 65 78 74 28 70 51 75 65 72 79 2c 20 30 29  _text(pQuery, 0)
e8d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
e8e0: 20 20 20 20 69 66 28 20 7a 49 64 78 20 29 7b 0a      if( zIdx ){.
e8f0: 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 72        p->rc = pr
e900: 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c  epareFreeAndColl
e910: 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 4d 61  ectError(p->dbMa
e920: 69 6e 2c 20 26 70 58 49 6e 66 6f 2c 20 26 70 2d  in, &pXInfo, &p-
e930: 3e 7a 45 72 72 6d 73 67 2c 0a 20 20 20 20 20 20  >zErrmsg,.      
e940: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69      sqlite3_mpri
e950: 6e 74 66 28 22 50 52 41 47 4d 41 20 6d 61 69 6e  ntf("PRAGMA main
e960: 2e 69 6e 64 65 78 5f 78 69 6e 66 6f 20 3d 20 25  .index_xinfo = %
e970: 51 22 2c 20 7a 49 64 78 29 0a 20 20 20 20 20 20  Q", zIdx).      
e980: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 62 75  );.    }.    rbu
e990: 46 69 6e 61 6c 69 7a 65 28 70 2c 20 70 51 75 65  Finalize(p, pQue
e9a0: 72 79 29 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28  ry);..    while(
e9b0: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
e9c0: 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d  K && SQLITE_ROW=
e9d0: 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 58  =sqlite3_step(pX
e9e0: 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 20 20 69  Info) ){.      i
e9f0: 6e 74 20 62 4b 65 79 20 3d 20 73 71 6c 69 74 65  nt bKey = sqlite
ea00: 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 58 49  3_column_int(pXI
ea10: 6e 66 6f 2c 20 35 29 3b 0a 20 20 20 20 20 20 69  nfo, 5);.      i
ea20: 66 28 20 62 4b 65 79 20 29 7b 0a 20 20 20 20 20  f( bKey ){.     
ea30: 20 20 20 69 6e 74 20 69 43 69 64 20 3d 20 73 71     int iCid = sq
ea40: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
ea50: 28 70 58 49 6e 66 6f 2c 20 31 29 3b 0a 20 20 20  (pXInfo, 1);.   
ea60: 20 20 20 20 20 69 6e 74 20 62 44 65 73 63 20 3d       int bDesc =
ea70: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
ea80: 69 6e 74 28 70 58 49 6e 66 6f 2c 20 33 29 3b 0a  int(pXInfo, 3);.
ea90: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
eaa0: 61 72 20 2a 7a 43 6f 6c 6c 61 74 65 20 3d 20 28  ar *zCollate = (
eab0: 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
eac0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
ead0: 70 58 49 6e 66 6f 2c 20 34 29 3b 0a 20 20 20 20  pXInfo, 4);.    
eae0: 20 20 20 20 7a 43 6f 6c 73 20 3d 20 72 62 75 4d      zCols = rbuM
eaf0: 50 72 69 6e 74 66 28 70 2c 20 22 25 7a 25 73 63  Printf(p, "%z%sc
eb00: 25 64 20 25 73 20 43 4f 4c 4c 41 54 45 20 25 73  %d %s COLLATE %s
eb10: 22 2c 20 7a 43 6f 6c 73 2c 20 7a 43 6f 6d 6d 61  ", zCols, zComma
eb20: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  , .            i
eb30: 43 69 64 2c 20 70 49 74 65 72 2d 3e 61 7a 54 62  Cid, pIter->azTb
eb40: 6c 54 79 70 65 5b 69 43 69 64 5d 2c 20 7a 43 6f  lType[iCid], zCo
eb50: 6c 6c 61 74 65 0a 20 20 20 20 20 20 20 20 29 3b  llate.        );
eb60: 0a 20 20 20 20 20 20 20 20 7a 50 6b 20 3d 20 72  .        zPk = r
eb70: 62 75 4d 50 72 69 6e 74 66 28 70 2c 20 22 25 7a  buMPrintf(p, "%z
eb80: 25 73 63 25 64 25 73 22 2c 20 7a 50 6b 2c 20 7a  %sc%d%s", zPk, z
eb90: 43 6f 6d 6d 61 2c 20 69 43 69 64 2c 20 62 44 65  Comma, iCid, bDe
eba0: 73 63 3f 22 20 44 45 53 43 22 3a 22 22 29 3b 0a  sc?" DESC":"");.
ebb0: 20 20 20 20 20 20 20 20 7a 43 6f 6d 6d 61 20 3d          zComma =
ebc0: 20 22 2c 20 22 3b 0a 20 20 20 20 20 20 7d 0a 20   ", ";.      }. 
ebd0: 20 20 20 7d 0a 20 20 20 20 7a 43 6f 6c 73 20 3d     }.    zCols =
ebe0: 20 72 62 75 4d 50 72 69 6e 74 66 28 70 2c 20 22   rbuMPrintf(p, "
ebf0: 25 7a 2c 20 69 64 20 49 4e 54 45 47 45 52 22 2c  %z, id INTEGER",
ec00: 20 7a 43 6f 6c 73 29 3b 0a 20 20 20 20 72 62 75   zCols);.    rbu
ec10: 46 69 6e 61 6c 69 7a 65 28 70 2c 20 70 58 49 6e  Finalize(p, pXIn
ec20: 66 6f 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65  fo);..    sqlite
ec30: 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
ec40: 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49  QLITE_TESTCTRL_I
ec50: 4d 50 4f 53 54 45 52 2c 20 70 2d 3e 64 62 4d 61  MPOSTER, p->dbMa
ec60: 69 6e 2c 20 22 6d 61 69 6e 22 2c 20 31 2c 20 74  in, "main", 1, t
ec70: 6e 75 6d 29 3b 0a 20 20 20 20 72 62 75 4d 50 72  num);.    rbuMPr
ec80: 69 6e 74 66 45 78 65 63 28 70 2c 20 70 2d 3e 64  intfExec(p, p->d
ec90: 62 4d 61 69 6e 2c 0a 20 20 20 20 20 20 20 20 22  bMain,.        "
eca0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 72 62 75  CREATE TABLE rbu
ecb0: 5f 69 6d 70 6f 73 74 65 72 32 28 25 7a 2c 20 50  _imposter2(%z, P
ecc0: 52 49 4d 41 52 59 20 4b 45 59 28 25 7a 29 29 20  RIMARY KEY(%z)) 
ecd0: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 22 2c 20  WITHOUT ROWID", 
ece0: 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 73 2c 20  .        zCols, 
ecf0: 7a 50 6b 0a 20 20 20 20 29 3b 0a 20 20 20 20 73  zPk.    );.    s
ed00: 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
ed10: 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
ed20: 54 52 4c 5f 49 4d 50 4f 53 54 45 52 2c 20 70 2d  TRL_IMPOSTER, p-
ed30: 3e 64 62 4d 61 69 6e 2c 20 22 6d 61 69 6e 22 2c  >dbMain, "main",
ed40: 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f   0, 0);.  }.}../
ed50: 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
ed60: 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63   has already occ
ed70: 75 72 72 65 64 20 77 68 65 6e 20 74 68 69 73 20  urred when this 
ed80: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
ed90: 65 64 2c 20 69 74 20 0a 2a 2a 20 69 6d 6d 65 64  ed, it .** immed
eda0: 69 61 74 65 6c 79 20 72 65 74 75 72 6e 73 20 7a  iately returns z
edb0: 65 72 6f 20 28 77 69 74 68 6f 75 74 20 64 6f 69  ero (without doi
edc0: 6e 67 20 61 6e 79 20 77 6f 72 6b 29 2e 20 4f 72  ng any work). Or
edd0: 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 0a 2a 2a  , if an error.**
ede0: 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 74   occurs during t
edf0: 68 65 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20  he execution of 
ee00: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 69  this function, i
ee10: 74 20 73 65 74 73 20 74 68 65 20 65 72 72 6f 72  t sets the error
ee20: 20 63 6f 64 65 0a 2a 2a 20 69 6e 20 74 68 65 20   code.** in the 
ee30: 73 71 6c 69 74 65 33 72 62 75 20 6f 62 6a 65 63  sqlite3rbu objec
ee40: 74 20 69 6e 64 69 63 61 74 65 64 20 62 79 20 74  t indicated by t
ee50: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
ee60: 74 20 61 6e 64 20 72 65 74 75 72 6e 73 0a 2a 2a  t and returns.**
ee70: 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   zero..**.** The
ee80: 20 69 74 65 72 61 74 6f 72 20 70 61 73 73 65 64   iterator passed
ee90: 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
eea0: 72 67 75 6d 65 6e 74 20 69 73 20 67 75 61 72 61  rgument is guara
eeb0: 6e 74 65 65 64 20 74 6f 20 70 6f 69 6e 74 20 74  nteed to point t
eec0: 6f 0a 2a 2a 20 61 20 74 61 62 6c 65 20 28 6e 6f  o.** a table (no
eed0: 74 20 61 6e 20 69 6e 64 65 78 29 20 77 68 65 6e  t an index) when
eee0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
eef0: 73 20 63 61 6c 6c 65 64 2e 20 54 68 69 73 20 66  s called. This f
ef00: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 74 74 65 6d  unction.** attem
ef10: 70 74 73 20 74 6f 20 63 72 65 61 74 65 20 61 6e  pts to create an
ef20: 79 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65  y imposter table
ef30: 20 72 65 71 75 69 72 65 64 20 74 6f 20 77 72 69   required to wri
ef40: 74 65 20 74 6f 20 74 68 65 20 6d 61 69 6e 0a 2a  te to the main.*
ef50: 2a 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20 6f  * table b-tree o
ef60: 66 20 74 68 65 20 74 61 62 6c 65 20 62 65 66 6f  f the table befo
ef70: 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 4e 6f  re returning. No
ef80: 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e  n-zero is return
ef90: 65 64 20 69 66 0a 2a 2a 20 61 6e 20 69 6d 70 6f  ed if.** an impo
efa0: 73 74 65 72 20 74 61 62 6c 65 20 61 72 65 20 63  ster table are c
efb0: 72 65 61 74 65 64 2c 20 6f 72 20 7a 65 72 6f 20  reated, or zero 
efc0: 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a  otherwise..**.**
efd0: 20 41 6e 20 69 6d 70 6f 73 74 65 72 20 74 61 62   An imposter tab
efe0: 6c 65 20 69 73 20 72 65 71 75 69 72 65 64 20 69  le is required i
eff0: 6e 20 61 6c 6c 20 63 61 73 65 73 20 65 78 63 65  n all cases exce
f000: 70 74 20 52 42 55 5f 50 4b 5f 56 54 41 42 2e 20  pt RBU_PK_VTAB. 
f010: 4f 6e 6c 79 0a 2a 2a 20 76 69 72 74 75 61 6c 20  Only.** virtual 
f020: 74 61 62 6c 65 73 20 61 72 65 20 77 72 69 74 74  tables are writt
f030: 65 6e 20 74 6f 20 64 69 72 65 63 74 6c 79 2e 20  en to directly. 
f040: 54 68 65 20 69 6d 70 6f 73 74 65 72 20 74 61 62  The imposter tab
f050: 6c 65 20 68 61 73 20 74 68 65 20 0a 2a 2a 20 73  le has the .** s
f060: 61 6d 65 20 73 63 68 65 6d 61 20 61 73 20 74 68  ame schema as th
f070: 65 20 61 63 74 75 61 6c 20 74 61 72 67 65 74 20  e actual target 
f080: 74 61 62 6c 65 20 28 6c 65 73 73 20 61 6e 79 20  table (less any 
f090: 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e  UNIQUE constrain
f0a0: 74 73 29 2e 20 0a 2a 2a 20 4d 6f 72 65 20 70 72  ts). .** More pr
f0b0: 65 63 69 73 65 6c 79 2c 20 74 68 65 20 22 73 61  ecisely, the "sa
f0c0: 6d 65 20 73 63 68 65 6d 61 22 20 6d 65 61 6e 73  me schema" means
f0d0: 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 75 6d 6e   the same column
f0e0: 73 2c 20 74 79 70 65 73 2c 20 0a 2a 2a 20 63 6f  s, types, .** co
f0f0: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
f100: 73 2e 20 46 6f 72 20 74 61 62 6c 65 73 20 74 68  s. For tables th
f110: 61 74 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 61  at do not have a
f120: 6e 20 65 78 74 65 72 6e 61 6c 20 50 52 49 4d 41  n external PRIMA
f130: 52 59 0a 2a 2a 20 4b 45 59 2c 20 69 74 20 61 6c  RY.** KEY, it al
f140: 73 6f 20 6d 65 61 6e 73 20 74 68 65 20 73 61 6d  so means the sam
f150: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 64 65  e PRIMARY KEY de
f160: 63 6c 61 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  claration..*/.st
f170: 61 74 69 63 20 76 6f 69 64 20 72 62 75 43 72 65  atic void rbuCre
f180: 61 74 65 49 6d 70 6f 73 74 65 72 54 61 62 6c 65  ateImposterTable
f190: 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20  (sqlite3rbu *p, 
f1a0: 52 62 75 4f 62 6a 49 74 65 72 20 2a 70 49 74 65  RbuObjIter *pIte
f1b0: 72 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  r){.  if( p->rc=
f1c0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 49  =SQLITE_OK && pI
f1d0: 74 65 72 2d 3e 65 54 79 70 65 21 3d 52 42 55 5f  ter->eType!=RBU_
f1e0: 50 4b 5f 56 54 41 42 20 29 7b 0a 20 20 20 20 69  PK_VTAB ){.    i
f1f0: 6e 74 20 74 6e 75 6d 20 3d 20 70 49 74 65 72 2d  nt tnum = pIter-
f200: 3e 69 54 6e 75 6d 3b 0a 20 20 20 20 63 6f 6e 73  >iTnum;.    cons
f210: 74 20 63 68 61 72 20 2a 7a 43 6f 6d 6d 61 20 3d  t char *zComma =
f220: 20 22 22 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a   "";.    char *z
f230: 53 71 6c 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  Sql = 0;.    int
f240: 20 69 43 6f 6c 3b 0a 20 20 20 20 73 71 6c 69 74   iCol;.    sqlit
f250: 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
f260: 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
f270: 49 4d 50 4f 53 54 45 52 2c 20 70 2d 3e 64 62 4d  IMPOSTER, p->dbM
f280: 61 69 6e 2c 20 22 6d 61 69 6e 22 2c 20 30 2c 20  ain, "main", 0, 
f290: 31 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 43 6f  1);..    for(iCo
f2a0: 6c 3d 30 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  l=0; p->rc==SQLI
f2b0: 54 45 5f 4f 4b 20 26 26 20 69 43 6f 6c 3c 70 49  TE_OK && iCol<pI
f2c0: 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 3b 20 69 43  ter->nTblCol; iC
f2d0: 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 63 6f 6e  ol++){.      con
f2e0: 73 74 20 63 68 61 72 20 2a 7a 50 6b 20 3d 20 22  st char *zPk = "
f2f0: 22 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ";.      const c
f300: 68 61 72 20 2a 7a 43 6f 6c 20 3d 20 70 49 74 65  har *zCol = pIte
f310: 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69 43 6f 6c  r->azTblCol[iCol
f320: 5d 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ];.      const c
f330: 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 30 3b 0a  har *zColl = 0;.
f340: 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73  .      p->rc = s
f350: 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c  qlite3_table_col
f360: 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28 0a 20 20  umn_metadata(.  
f370: 20 20 20 20 20 20 20 20 70 2d 3e 64 62 4d 61 69          p->dbMai
f380: 6e 2c 20 22 6d 61 69 6e 22 2c 20 70 49 74 65 72  n, "main", pIter
f390: 2d 3e 7a 54 62 6c 2c 20 7a 43 6f 6c 2c 20 30 2c  ->zTbl, zCol, 0,
f3a0: 20 26 7a 43 6f 6c 6c 2c 20 30 2c 20 30 2c 20 30   &zColl, 0, 0, 0
f3b0: 0a 20 20 20 20 20 20 29 3b 0a 0a 20 20 20 20 20  .      );..     
f3c0: 20 69 66 28 20 70 49 74 65 72 2d 3e 65 54 79 70   if( pIter->eTyp
f3d0: 65 3d 3d 52 42 55 5f 50 4b 5f 49 50 4b 20 26 26  e==RBU_PK_IPK &&
f3e0: 20 70 49 74 65 72 2d 3e 61 62 54 62 6c 50 6b 5b   pIter->abTblPk[
f3f0: 69 43 6f 6c 5d 20 29 7b 0a 20 20 20 20 20 20 20  iCol] ){.       
f400: 20 2f 2a 20 49 66 20 74 68 65 20 74 61 72 67 65   /* If the targe
f410: 74 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 69  t table column i
f420: 73 20 61 6e 20 22 49 4e 54 45 47 45 52 20 50 52  s an "INTEGER PR
f430: 49 4d 41 52 59 20 4b 45 59 22 2c 20 61 64 64 0a  IMARY KEY", add.
f440: 20 20 20 20 20 20 20 20 2a 2a 20 22 50 52 49 4d          ** "PRIM
f450: 41 52 59 20 4b 45 59 22 20 74 6f 20 74 68 65 20  ARY KEY" to the 
f460: 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 20 63  imposter table c
f470: 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f  olumn declaratio
f480: 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 7a 50  n. */.        zP
f490: 6b 20 3d 20 22 50 52 49 4d 41 52 59 20 4b 45 59  k = "PRIMARY KEY
f4a0: 20 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   ";.      }.    
f4b0: 20 20 7a 53 71 6c 20 3d 20 72 62 75 4d 50 72 69    zSql = rbuMPri
f4c0: 6e 74 66 28 70 2c 20 22 25 7a 25 73 5c 22 25 77  ntf(p, "%z%s\"%w
f4d0: 5c 22 20 25 73 20 25 73 43 4f 4c 4c 41 54 45 20  \" %s %sCOLLATE 
f4e0: 25 73 25 73 22 2c 20 0a 20 20 20 20 20 20 20 20  %s%s", .        
f4f0: 20 20 7a 53 71 6c 2c 20 7a 43 6f 6d 6d 61 2c 20    zSql, zComma, 
f500: 7a 43 6f 6c 2c 20 70 49 74 65 72 2d 3e 61 7a 54  zCol, pIter->azT
f510: 62 6c 54 79 70 65 5b 69 43 6f 6c 5d 2c 20 7a 50  blType[iCol], zP
f520: 6b 2c 20 7a 43 6f 6c 6c 2c 0a 20 20 20 20 20 20  k, zColl,.      
f530: 20 20 20 20 28 70 49 74 65 72 2d 3e 61 62 4e 6f      (pIter->abNo
f540: 74 4e 75 6c 6c 5b 69 43 6f 6c 5d 20 3f 20 22 20  tNull[iCol] ? " 
f550: 4e 4f 54 20 4e 55 4c 4c 22 20 3a 20 22 22 29 0a  NOT NULL" : "").
f560: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7a        );.      z
f570: 43 6f 6d 6d 61 20 3d 20 22 2c 20 22 3b 0a 20 20  Comma = ", ";.  
f580: 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 49 74    }..    if( pIt
f590: 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50  er->eType==RBU_P
f5a0: 4b 5f 57 49 54 48 4f 55 54 5f 52 4f 57 49 44 20  K_WITHOUT_ROWID 
f5b0: 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
f5c0: 50 6b 20 3d 20 72 62 75 57 69 74 68 6f 75 74 52  Pk = rbuWithoutR
f5d0: 6f 77 69 64 50 4b 28 70 2c 20 70 49 74 65 72 29  owidPK(p, pIter)
f5e0: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50 6b 20  ;.      if( zPk 
f5f0: 29 7b 0a 20 20 20 20 20 20 20 20 7a 53 71 6c 20  ){.        zSql 
f600: 3d 20 72 62 75 4d 50 72 69 6e 74 66 28 70 2c 20  = rbuMPrintf(p, 
f610: 22 25 7a 2c 20 25 7a 22 2c 20 7a 53 71 6c 2c 20  "%z, %z", zSql, 
f620: 7a 50 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  zPk);.      }.  
f630: 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33    }..    sqlite3
f640: 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
f650: 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d  LITE_TESTCTRL_IM
f660: 50 4f 53 54 45 52 2c 20 70 2d 3e 64 62 4d 61 69  POSTER, p->dbMai
f670: 6e 2c 20 22 6d 61 69 6e 22 2c 20 31 2c 20 74 6e  n, "main", 1, tn
f680: 75 6d 29 3b 0a 20 20 20 20 72 62 75 4d 50 72 69  um);.    rbuMPri
f690: 6e 74 66 45 78 65 63 28 70 2c 20 70 2d 3e 64 62  ntfExec(p, p->db
f6a0: 4d 61 69 6e 2c 20 22 43 52 45 41 54 45 20 54 41  Main, "CREATE TA
f6b0: 42 4c 45 20 5c 22 72 62 75 5f 69 6d 70 5f 25 77  BLE \"rbu_imp_%w
f6c0: 5c 22 28 25 7a 29 25 73 22 2c 20 0a 20 20 20 20  \"(%z)%s", .    
f6d0: 20 20 20 20 70 49 74 65 72 2d 3e 7a 54 62 6c 2c      pIter->zTbl,
f6e0: 20 7a 53 71 6c 2c 20 0a 20 20 20 20 20 20 20 20   zSql, .        
f6f0: 28 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52  (pIter->eType==R
f700: 42 55 5f 50 4b 5f 57 49 54 48 4f 55 54 5f 52 4f  BU_PK_WITHOUT_RO
f710: 57 49 44 20 3f 20 22 20 57 49 54 48 4f 55 54 20  WID ? " WITHOUT 
f720: 52 4f 57 49 44 22 20 3a 20 22 22 29 0a 20 20 20  ROWID" : "").   
f730: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   );.    sqlite3_
f740: 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
f750: 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50  ITE_TESTCTRL_IMP
f760: 4f 53 54 45 52 2c 20 70 2d 3e 64 62 4d 61 69 6e  OSTER, p->dbMain
f770: 2c 20 22 6d 61 69 6e 22 2c 20 30 2c 20 30 29 3b  , "main", 0, 0);
f780: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72  .  }.}../*.** Pr
f790: 65 70 61 72 65 20 61 20 73 74 61 74 65 6d 65 6e  epare a statemen
f7a0: 74 20 75 73 65 64 20 74 6f 20 69 6e 73 65 72 74  t used to insert
f7b0: 20 72 6f 77 73 20 69 6e 74 6f 20 74 68 65 20 22   rows into the "
f7c0: 72 62 75 5f 74 6d 70 5f 78 78 78 22 20 74 61 62  rbu_tmp_xxx" tab
f7d0: 6c 65 2e 0a 2a 2a 20 53 70 65 63 69 66 69 63 61  le..** Specifica
f7e0: 6c 6c 79 20 61 20 73 74 61 74 65 6d 65 6e 74 20  lly a statement 
f7f0: 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a  of the form:.**.
f800: 2a 2a 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  **     INSERT IN
f810: 54 4f 20 72 62 75 5f 74 6d 70 5f 78 78 78 20 56  TO rbu_tmp_xxx V
f820: 41 4c 55 45 53 28 3f 2c 20 3f 2c 20 3f 20 2e 2e  ALUES(?, ?, ? ..
f830: 2e 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 75  .);.**.** The nu
f840: 6d 62 65 72 20 6f 66 20 62 6f 75 6e 64 20 76 61  mber of bound va
f850: 72 69 61 62 6c 65 73 20 69 73 20 65 71 75 61 6c  riables is equal
f860: 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
f870: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 0a 2a 2a 20  f columns in.** 
f880: 74 68 65 20 74 61 72 67 65 74 20 74 61 62 6c 65  the target table
f890: 2c 20 70 6c 75 73 20 6f 6e 65 20 28 66 6f 72 20  , plus one (for 
f8a0: 74 68 65 20 72 62 75 5f 63 6f 6e 74 72 6f 6c 20  the rbu_control 
f8b0: 63 6f 6c 75 6d 6e 29 2c 20 70 6c 75 73 20 6f 6e  column), plus on
f8c0: 65 20 6d 6f 72 65 20 0a 2a 2a 20 28 66 6f 72 20  e more .** (for 
f8d0: 74 68 65 20 72 62 75 5f 72 6f 77 69 64 20 63 6f  the rbu_rowid co
f8e0: 6c 75 6d 6e 29 20 69 66 20 74 68 65 20 74 61 72  lumn) if the tar
f8f0: 67 65 74 20 74 61 62 6c 65 20 69 73 20 61 6e 20  get table is an 
f900: 69 6d 70 6c 69 63 69 74 20 49 50 4b 20 6f 72 20  implicit IPK or 
f910: 0a 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c  .** virtual tabl
f920: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
f930: 64 20 72 62 75 4f 62 6a 49 74 65 72 50 72 65 70  d rbuObjIterPrep
f940: 61 72 65 54 6d 70 49 6e 73 65 72 74 28 0a 20 20  areTmpInsert(.  
f950: 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 0a  sqlite3rbu *p, .
f960: 20 20 52 62 75 4f 62 6a 49 74 65 72 20 2a 70 49    RbuObjIter *pI
f970: 74 65 72 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  ter,.  const cha
f980: 72 20 2a 7a 43 6f 6c 6c 69 73 74 2c 0a 20 20 63  r *zCollist,.  c
f990: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 62 75 52  onst char *zRbuR
f9a0: 6f 77 69 64 0a 29 7b 0a 20 20 69 6e 74 20 62 52  owid.){.  int bR
f9b0: 62 75 52 6f 77 69 64 20 3d 20 28 70 49 74 65 72  buRowid = (pIter
f9c0: 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f  ->eType==RBU_PK_
f9d0: 45 58 54 45 52 4e 41 4c 20 7c 7c 20 70 49 74 65  EXTERNAL || pIte
f9e0: 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b  r->eType==RBU_PK
f9f0: 5f 4e 4f 4e 45 29 3b 0a 20 20 63 68 61 72 20 2a  _NONE);.  char *
fa00: 7a 42 69 6e 64 20 3d 20 72 62 75 4f 62 6a 49 74  zBind = rbuObjIt
fa10: 65 72 47 65 74 42 69 6e 64 6c 69 73 74 28 70 2c  erGetBindlist(p,
fa20: 20 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 20   pIter->nTblCol 
fa30: 2b 20 31 20 2b 20 62 52 62 75 52 6f 77 69 64 29  + 1 + bRbuRowid)
fa40: 3b 0a 20 20 69 66 28 20 7a 42 69 6e 64 20 29 7b  ;.  if( zBind ){
fa50: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
fa60: 65 72 2d 3e 70 54 6d 70 49 6e 73 65 72 74 3d 3d  er->pTmpInsert==
fa70: 30 20 29 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  0 );.    p->rc =
fa80: 20 70 72 65 70 61 72 65 46 72 65 65 41 6e 64 43   prepareFreeAndC
fa90: 6f 6c 6c 65 63 74 45 72 72 6f 72 28 0a 20 20 20  ollectError(.   
faa0: 20 20 20 20 20 70 2d 3e 64 62 52 62 75 2c 20 26       p->dbRbu, &
fab0: 70 49 74 65 72 2d 3e 70 54 6d 70 49 6e 73 65 72  pIter->pTmpInser
fac0: 74 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 20  t, &p->zErrmsg, 
fad0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
fae0: 0a 20 20 20 20 20 20 20 20 20 20 22 49 4e 53 45  .          "INSE
faf0: 52 54 20 49 4e 54 4f 20 25 73 2e 27 72 62 75 5f  RT INTO %s.'rbu_
fb00: 74 6d 70 5f 25 71 27 28 72 62 75 5f 63 6f 6e 74  tmp_%q'(rbu_cont
fb10: 72 6f 6c 2c 25 73 25 73 29 20 56 41 4c 55 45 53  rol,%s%s) VALUES
fb20: 28 25 7a 29 22 2c 20 0a 20 20 20 20 20 20 20 20  (%z)", .        
fb30: 20 20 70 2d 3e 7a 53 74 61 74 65 44 62 2c 20 70    p->zStateDb, p
fb40: 49 74 65 72 2d 3e 7a 44 61 74 61 54 62 6c 2c 20  Iter->zDataTbl, 
fb50: 7a 43 6f 6c 6c 69 73 74 2c 20 7a 52 62 75 52 6f  zCollist, zRbuRo
fb60: 77 69 64 2c 20 7a 42 69 6e 64 0a 20 20 20 20 29  wid, zBind.    )
fb70: 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63  );.  }.}..static
fb80: 20 76 6f 69 64 20 72 62 75 54 6d 70 49 6e 73 65   void rbuTmpInse
fb90: 72 74 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  rtFunc(.  sqlite
fba0: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
fbb0: 20 0a 20 20 69 6e 74 20 6e 56 61 6c 2c 0a 20 20   .  int nVal,.  
fbc0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
fbd0: 61 70 56 61 6c 0a 29 7b 0a 20 20 73 71 6c 69 74  apVal.){.  sqlit
fbe0: 65 33 72 62 75 20 2a 70 20 3d 20 73 71 6c 69 74  e3rbu *p = sqlit
fbf0: 65 33 5f 75 73 65 72 5f 64 61 74 61 28 70 43 74  e3_user_data(pCt
fc00: 78 29 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  x);.  int rc = S
fc10: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
fc20: 69 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  i;..  assert( sq
fc30: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28  lite3_value_int(
fc40: 61 70 56 61 6c 5b 30 5d 29 21 3d 30 0a 20 20 20  apVal[0])!=0.   
fc50: 20 20 20 7c 7c 20 70 2d 3e 6f 62 6a 69 74 65 72     || p->objiter
fc60: 2e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 45  .eType==RBU_PK_E
fc70: 58 54 45 52 4e 41 4c 20 0a 20 20 20 20 20 20 7c  XTERNAL .      |
fc80: 7c 20 70 2d 3e 6f 62 6a 69 74 65 72 2e 65 54 79  | p->objiter.eTy
fc90: 70 65 3d 3d 52 42 55 5f 50 4b 5f 4e 4f 4e 45 20  pe==RBU_PK_NONE 
fca0: 0a 20 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  .  );.  if( sqli
fcb0: 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 70  te3_value_int(ap
fcc0: 56 61 6c 5b 30 5d 29 21 3d 30 20 29 7b 0a 20 20  Val[0])!=0 ){.  
fcd0: 20 20 70 2d 3e 6e 50 68 61 73 65 4f 6e 65 53 74    p->nPhaseOneSt
fce0: 65 70 20 2b 3d 20 70 2d 3e 6f 62 6a 69 74 65 72  ep += p->objiter
fcf0: 2e 6e 49 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20  .nIndex;.  }..  
fd00: 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  for(i=0; rc==SQL
fd10: 49 54 45 5f 4f 4b 20 26 26 20 69 3c 6e 56 61 6c  ITE_OK && i<nVal
fd20: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 63 20 3d  ; i++){.    rc =
fd30: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 76 61   sqlite3_bind_va
fd40: 6c 75 65 28 70 2d 3e 6f 62 6a 69 74 65 72 2e 70  lue(p->objiter.p
fd50: 54 6d 70 49 6e 73 65 72 74 2c 20 69 2b 31 2c 20  TmpInsert, i+1, 
fd60: 61 70 56 61 6c 5b 69 5d 29 3b 0a 20 20 7d 0a 20  apVal[i]);.  }. 
fd70: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
fd80: 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
fd90: 33 5f 73 74 65 70 28 70 2d 3e 6f 62 6a 69 74 65  3_step(p->objite
fda0: 72 2e 70 54 6d 70 49 6e 73 65 72 74 29 3b 0a 20  r.pTmpInsert);. 
fdb0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
fdc0: 72 65 73 65 74 28 70 2d 3e 6f 62 6a 69 74 65 72  reset(p->objiter
fdd0: 2e 70 54 6d 70 49 6e 73 65 72 74 29 3b 0a 20 20  .pTmpInsert);.  
fde0: 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  }..  if( rc!=SQL
fdf0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
fe00: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
fe10: 6f 72 5f 63 6f 64 65 28 70 43 74 78 2c 20 72 63  or_code(pCtx, rc
fe20: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
fe30: 45 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  Ensure that the 
fe40: 53 51 4c 69 74 65 20 73 74 61 74 65 6d 65 6e 74  SQLite statement
fe50: 20 68 61 6e 64 6c 65 73 20 72 65 71 75 69 72 65   handles require
fe60: 64 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20  d to update the 
fe70: 0a 2a 2a 20 74 61 72 67 65 74 20 64 61 74 61 62  .** target datab
fe80: 61 73 65 20 6f 62 6a 65 63 74 20 63 75 72 72 65  ase object curre
fe90: 6e 74 6c 79 20 69 6e 64 69 63 61 74 65 64 20 62  ntly indicated b
fea0: 79 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70  y the iterator p
feb0: 61 73 73 65 64 20 0a 2a 2a 20 61 73 20 74 68 65  assed .** as the
fec0: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
fed0: 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2e 0a   are available..
fee0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62  */.static int rb
fef0: 75 4f 62 6a 49 74 65 72 50 72 65 70 61 72 65 41  uObjIterPrepareA
ff00: 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33 72 62 75  ll(.  sqlite3rbu
ff10: 20 2a 70 2c 20 0a 20 20 52 62 75 4f 62 6a 49 74   *p, .  RbuObjIt
ff20: 65 72 20 2a 70 49 74 65 72 2c 0a 20 20 69 6e 74  er *pIter,.  int
ff30: 20 6e 4f 66 66 73 65 74 20 20 20 20 20 20 20 20   nOffset        
ff40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ff50: 41 64 64 20 22 4c 49 4d 49 54 20 2d 31 20 4f 46  Add "LIMIT -1 OF
ff60: 46 53 45 54 20 24 6e 4f 66 66 73 65 74 22 20 74  FSET $nOffset" t
ff70: 6f 20 53 45 4c 45 43 54 20 2a 2f 0a 29 7b 0a 20  o SELECT */.){. 
ff80: 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
ff90: 62 43 6c 65 61 6e 75 70 3d 3d 30 20 29 3b 0a 20  bCleanup==0 );. 
ffa0: 20 69 66 28 20 70 49 74 65 72 2d 3e 70 53 65 6c   if( pIter->pSel
ffb0: 65 63 74 3d 3d 30 20 26 26 20 72 62 75 4f 62 6a  ect==0 && rbuObj
ffc0: 49 74 65 72 43 61 63 68 65 54 61 62 6c 65 49 6e  IterCacheTableIn
ffd0: 66 6f 28 70 2c 20 70 49 74 65 72 29 3d 3d 53 51  fo(p, pIter)==SQ
ffe0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 63  LITE_OK ){.    c
fff0: 6f 6e 73 74 20 69 6e 74 20 74 6e 75 6d 20 3d 20  onst int tnum = 
10000 70 49 74 65 72 2d 3e 69 54 6e 75 6d 3b 0a 20 20  pIter->iTnum;.  
10010 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 69 73 74    char *zCollist
10020 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
10030 2f 2a 20 4c 69 73 74 20 6f 66 20 69 6e 64 65 78  /* List of index
10040 65 64 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  ed columns */.  
10050 20 20 63 68 61 72 20 2a 2a 70 7a 20 3d 20 26 70    char **pz = &p
10060 2d 3e 7a 45 72 72 6d 73 67 3b 0a 20 20 20 20 63  ->zErrmsg;.    c
10070 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 78 20  onst char *zIdx 
10080 3d 20 70 49 74 65 72 2d 3e 7a 49 64 78 3b 0a 20  = pIter->zIdx;. 
10090 20 20 20 63 68 61 72 20 2a 7a 4c 69 6d 69 74 20     char *zLimit 
100a0 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 6e 4f  = 0;..    if( nO
100b0 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20 7a  ffset ){.      z
100c0 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 5f  Limit = sqlite3_
100d0 6d 70 72 69 6e 74 66 28 22 20 4c 49 4d 49 54 20  mprintf(" LIMIT 
100e0 2d 31 20 4f 46 46 53 45 54 20 25 64 22 2c 20 6e  -1 OFFSET %d", n
100f0 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 69  Offset);.      i
10100 66 28 20 21 7a 4c 69 6d 69 74 20 29 20 70 2d 3e  f( !zLimit ) p->
10110 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
10120 4d 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  M;.    }..    if
10130 28 20 7a 49 64 78 20 29 7b 0a 20 20 20 20 20 20  ( zIdx ){.      
10140 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 62 6c  const char *zTbl
10150 20 3d 20 70 49 74 65 72 2d 3e 7a 54 62 6c 3b 0a   = pIter->zTbl;.
10160 20 20 20 20 20 20 63 68 61 72 20 2a 7a 49 6d 70        char *zImp
10170 6f 73 74 65 72 43 6f 6c 73 20 3d 20 30 3b 20 20  osterCols = 0;  
10180 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 66 6f 72    /* Columns for
10190 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 20   imposter table 
101a0 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  */.      char *z
101b0 49 6d 70 6f 73 74 65 72 50 4b 20 3d 20 30 3b 20  ImposterPK = 0; 
101c0 20 20 20 20 20 2f 2a 20 50 72 69 6d 61 72 79 20       /* Primary 
101d0 6b 65 79 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  key declaration 
101e0 66 6f 72 20 69 6d 70 6f 73 74 65 72 20 2a 2f 0a  for imposter */.
101f0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 57 68 65        char *zWhe
10200 72 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  re = 0;         
10210 20 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73    /* WHERE claus
10220 65 20 6f 6e 20 50 4b 20 63 6f 6c 75 6d 6e 73 20  e on PK columns 
10230 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  */.      char *z
10240 42 69 6e 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  Bind = 0;.      
10250 69 6e 74 20 6e 42 69 6e 64 20 3d 20 30 3b 0a 0a  int nBind = 0;..
10260 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
10270 74 65 72 2d 3e 65 54 79 70 65 21 3d 52 42 55 5f  ter->eType!=RBU_
10280 50 4b 5f 56 54 41 42 20 29 3b 0a 20 20 20 20 20  PK_VTAB );.     
10290 20 7a 43 6f 6c 6c 69 73 74 20 3d 20 72 62 75 4f   zCollist = rbuO
102a0 62 6a 49 74 65 72 47 65 74 49 6e 64 65 78 43 6f  bjIterGetIndexCo
102b0 6c 73 28 0a 20 20 20 20 20 20 20 20 20 20 70 2c  ls(.          p,
102c0 20 70 49 74 65 72 2c 20 26 7a 49 6d 70 6f 73 74   pIter, &zImpost
102d0 65 72 43 6f 6c 73 2c 20 26 7a 49 6d 70 6f 73 74  erCols, &zImpost
102e0 65 72 50 4b 2c 20 26 7a 57 68 65 72 65 2c 20 26  erPK, &zWhere, &
102f0 6e 42 69 6e 64 0a 20 20 20 20 20 20 29 3b 0a 20  nBind.      );. 
10300 20 20 20 20 20 7a 42 69 6e 64 20 3d 20 72 62 75       zBind = rbu
10310 4f 62 6a 49 74 65 72 47 65 74 42 69 6e 64 6c 69  ObjIterGetBindli
10320 73 74 28 70 2c 20 6e 42 69 6e 64 29 3b 0a 0a 20  st(p, nBind);.. 
10330 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74       /* Create t
10340 68 65 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c  he imposter tabl
10350 65 20 75 73 65 64 20 74 6f 20 77 72 69 74 65 20  e used to write 
10360 74 6f 20 74 68 69 73 20 69 6e 64 65 78 2e 20 2a  to this index. *
10370 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  /.      sqlite3_
10380 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
10390 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50  ITE_TESTCTRL_IMP
103a0 4f 53 54 45 52 2c 20 70 2d 3e 64 62 4d 61 69 6e  OSTER, p->dbMain
103b0 2c 20 22 6d 61 69 6e 22 2c 20 30 2c 20 31 29 3b  , "main", 0, 1);
103c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74  .      sqlite3_t
103d0 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
103e0 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f  TE_TESTCTRL_IMPO
103f0 53 54 45 52 2c 20 70 2d 3e 64 62 4d 61 69 6e 2c  STER, p->dbMain,
10400 20 22 6d 61 69 6e 22 2c 20 31 2c 74 6e 75 6d 29   "main", 1,tnum)
10410 3b 0a 20 20 20 20 20 20 72 62 75 4d 50 72 69 6e  ;.      rbuMPrin
10420 74 66 45 78 65 63 28 70 2c 20 70 2d 3e 64 62 4d  tfExec(p, p->dbM
10430 61 69 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 22  ain,.          "
10440 43 52 45 41 54 45 20 54 41 42 4c 45 20 5c 22 72  CREATE TABLE \"r
10450 62 75 5f 69 6d 70 5f 25 77 5c 22 28 20 25 73 2c  bu_imp_%w\"( %s,
10460 20 50 52 49 4d 41 52 59 20 4b 45 59 28 20 25 73   PRIMARY KEY( %s
10470 20 29 20 29 20 57 49 54 48 4f 55 54 20 52 4f 57   ) ) WITHOUT ROW
10480 49 44 22 2c 0a 20 20 20 20 20 20 20 20 20 20 7a  ID",.          z
10490 54 62 6c 2c 20 7a 49 6d 70 6f 73 74 65 72 43 6f  Tbl, zImposterCo
104a0 6c 73 2c 20 7a 49 6d 70 6f 73 74 65 72 50 4b 0a  ls, zImposterPK.
104b0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 73        );.      s
104c0 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
104d0 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
104e0 54 52 4c 5f 49 4d 50 4f 53 54 45 52 2c 20 70 2d  TRL_IMPOSTER, p-
104f0 3e 64 62 4d 61 69 6e 2c 20 22 6d 61 69 6e 22 2c  >dbMain, "main",
10500 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20 20 20 2f   0, 0);..      /
10510 2a 20 43 72 65 61 74 65 20 74 68 65 20 73 74 61  * Create the sta
10520 74 65 6d 65 6e 74 20 74 6f 20 69 6e 73 65 72 74  tement to insert
10530 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20 2a   index entries *
10540 2f 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 6e  /.      pIter->n
10550 43 6f 6c 20 3d 20 6e 42 69 6e 64 3b 0a 20 20 20  Col = nBind;.   
10560 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
10570 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
10580 20 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61     p->rc = prepa
10590 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74  reFreeAndCollect
105a0 45 72 72 6f 72 28 0a 20 20 20 20 20 20 20 20 20  Error(.         
105b0 20 20 20 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 70     p->dbMain, &p
105c0 49 74 65 72 2d 3e 70 49 6e 73 65 72 74 2c 20 26  Iter->pInsert, &
105d0 70 2d 3e 7a 45 72 72 6d 73 67 2c 0a 20 20 20 20  p->zErrmsg,.    
105e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70        sqlite3_mp
105f0 72 69 6e 74 66 28 22 49 4e 53 45 52 54 20 49 4e  rintf("INSERT IN
10600 54 4f 20 5c 22 72 62 75 5f 69 6d 70 5f 25 77 5c  TO \"rbu_imp_%w\
10610 22 20 56 41 4c 55 45 53 28 25 73 29 22 2c 20 7a  " VALUES(%s)", z
10620 54 62 6c 2c 20 7a 42 69 6e 64 29 0a 20 20 20 20  Tbl, zBind).    
10630 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a      );.      }..
10640 20 20 20 20 20 20 2f 2a 20 41 6e 64 20 74 6f 20        /* And to 
10650 64 65 6c 65 74 65 20 69 6e 64 65 78 20 65 6e 74  delete index ent
10660 72 69 65 73 20 2a 2f 0a 20 20 20 20 20 20 69 66  ries */.      if
10670 28 20 72 62 75 49 73 56 61 63 75 75 6d 28 70 29  ( rbuIsVacuum(p)
10680 3d 3d 30 20 26 26 20 70 2d 3e 72 63 3d 3d 53 51  ==0 && p->rc==SQ
10690 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
106a0 20 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61     p->rc = prepa
106b0 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74  reFreeAndCollect
106c0 45 72 72 6f 72 28 0a 20 20 20 20 20 20 20 20 20  Error(.         
106d0 20 20 20 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 70     p->dbMain, &p
106e0 49 74 65 72 2d 3e 70 44 65 6c 65 74 65 2c 20 26  Iter->pDelete, &
106f0 70 2d 3e 7a 45 72 72 6d 73 67 2c 0a 20 20 20 20  p->zErrmsg,.    
10700 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70        sqlite3_mp
10710 72 69 6e 74 66 28 22 44 45 4c 45 54 45 20 46 52  rintf("DELETE FR
10720 4f 4d 20 5c 22 72 62 75 5f 69 6d 70 5f 25 77 5c  OM \"rbu_imp_%w\
10730 22 20 57 48 45 52 45 20 25 73 22 2c 20 7a 54 62  " WHERE %s", zTb
10740 6c 2c 20 7a 57 68 65 72 65 29 0a 20 20 20 20 20  l, zWhere).     
10750 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20     );.      }.. 
10760 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74       /* Create t
10770 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
10780 65 6e 74 20 74 6f 20 72 65 61 64 20 6b 65 79 73  ent to read keys
10790 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72   in sorted order
107a0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 2d   */.      if( p-
107b0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
107c0 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
107d0 7a 53 71 6c 3b 0a 20 20 20 20 20 20 20 20 69 66  zSql;.        if
107e0 28 20 72 62 75 49 73 56 61 63 75 75 6d 28 70 29  ( rbuIsVacuum(p)
107f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 53   ){.          zS
10800 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ql = sqlite3_mpr
10810 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20  intf(.          
10820 20 20 20 20 22 53 45 4c 45 43 54 20 25 73 2c 20      "SELECT %s, 
10830 30 20 41 53 20 72 62 75 5f 63 6f 6e 74 72 6f 6c  0 AS rbu_control
10840 20 46 52 4f 4d 20 27 25 71 27 20 4f 52 44 45 52   FROM '%q' ORDER
10850 20 42 59 20 25 73 25 73 22 2c 0a 20 20 20 20 20   BY %s%s",.     
10860 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 6c 69 73           zCollis
10870 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  t, .            
10880 20 20 70 49 74 65 72 2d 3e 7a 44 61 74 61 54 62    pIter->zDataTb
10890 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l,.             
108a0 20 7a 43 6f 6c 6c 69 73 74 2c 20 7a 4c 69 6d 69   zCollist, zLimi
108b0 74 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20  t.          );. 
108c0 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20         }else..  
108d0 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d        if( pIter-
108e0 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 45  >eType==RBU_PK_E
108f0 58 54 45 52 4e 41 4c 20 7c 7c 20 70 49 74 65 72  XTERNAL || pIter
10900 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f  ->eType==RBU_PK_
10910 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20  NONE ){.        
10920 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
10930 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20  _mprintf(.      
10940 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
10950 25 73 2c 20 72 62 75 5f 63 6f 6e 74 72 6f 6c 20  %s, rbu_control 
10960 46 52 4f 4d 20 25 73 2e 27 72 62 75 5f 74 6d 70  FROM %s.'rbu_tmp
10970 5f 25 71 27 20 4f 52 44 45 52 20 42 59 20 25 73  _%q' ORDER BY %s
10980 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %s",.           
10990 20 20 20 7a 43 6f 6c 6c 69 73 74 2c 20 70 2d 3e     zCollist, p->
109a0 7a 53 74 61 74 65 44 62 2c 20 70 49 74 65 72 2d  zStateDb, pIter-
109b0 3e 7a 44 61 74 61 54 62 6c 2c 0a 20 20 20 20 20  >zDataTbl,.     
109c0 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 6c 69 73           zCollis
109d0 74 2c 20 7a 4c 69 6d 69 74 0a 20 20 20 20 20 20  t, zLimit.      
109e0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7d      );.        }
109f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
10a00 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
10a10 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  printf(.        
10a20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 25 73        "SELECT %s
10a30 2c 20 72 62 75 5f 63 6f 6e 74 72 6f 6c 20 46 52  , rbu_control FR
10a40 4f 4d 20 25 73 2e 27 72 62 75 5f 74 6d 70 5f 25  OM %s.'rbu_tmp_%
10a50 71 27 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  q' ".           
10a60 20 20 20 22 55 4e 49 4f 4e 20 41 4c 4c 20 22 0a     "UNION ALL ".
10a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 53                "S
10a80 45 4c 45 43 54 20 25 73 2c 20 72 62 75 5f 63 6f  ELECT %s, rbu_co
10a90 6e 74 72 6f 6c 20 46 52 4f 4d 20 27 25 71 27 20  ntrol FROM '%q' 
10aa0 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
10ab0 22 57 48 45 52 45 20 74 79 70 65 6f 66 28 72 62  "WHERE typeof(rb
10ac0 75 5f 63 6f 6e 74 72 6f 6c 29 3d 27 69 6e 74 65  u_control)='inte
10ad0 67 65 72 27 20 41 4e 44 20 72 62 75 5f 63 6f 6e  ger' AND rbu_con
10ae0 74 72 6f 6c 21 3d 31 20 22 0a 20 20 20 20 20 20  trol!=1 ".      
10af0 20 20 20 20 20 20 20 20 22 4f 52 44 45 52 20 42          "ORDER B
10b00 59 20 25 73 25 73 22 2c 0a 20 20 20 20 20 20 20  Y %s%s",.       
10b10 20 20 20 20 20 20 20 7a 43 6f 6c 6c 69 73 74 2c         zCollist,
10b20 20 70 2d 3e 7a 53 74 61 74 65 44 62 2c 20 70 49   p->zStateDb, pI
10b30 74 65 72 2d 3e 7a 44 61 74 61 54 62 6c 2c 20 0a  ter->zDataTbl, .
10b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 43                zC
10b50 6f 6c 6c 69 73 74 2c 20 70 49 74 65 72 2d 3e 7a  ollist, pIter->z
10b60 44 61 74 61 54 62 6c 2c 20 0a 20 20 20 20 20 20  DataTbl, .      
10b70 20 20 20 20 20 20 20 20 7a 43 6f 6c 6c 69 73 74          zCollist
10b80 2c 20 7a 4c 69 6d 69 74 0a 20 20 20 20 20 20 20  , zLimit.       
10b90 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a     );.        }.
10ba0 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
10bb0 70 72 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f  prepareFreeAndCo
10bc0 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62  llectError(p->db
10bd0 52 62 75 2c 20 26 70 49 74 65 72 2d 3e 70 53 65  Rbu, &pIter->pSe
10be0 6c 65 63 74 2c 20 70 7a 2c 20 7a 53 71 6c 29 3b  lect, pz, zSql);
10bf0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
10c00 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 49 6d  sqlite3_free(zIm
10c10 70 6f 73 74 65 72 43 6f 6c 73 29 3b 0a 20 20 20  posterCols);.   
10c20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
10c30 7a 49 6d 70 6f 73 74 65 72 50 4b 29 3b 0a 20 20  zImposterPK);.  
10c40 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
10c50 28 7a 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20  (zWhere);.      
10c60 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 69  sqlite3_free(zBi
10c70 6e 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  nd);.    }else{.
10c80 20 20 20 20 20 20 69 6e 74 20 62 52 62 75 52 6f        int bRbuRo
10c90 77 69 64 20 3d 20 28 70 49 74 65 72 2d 3e 65 54  wid = (pIter->eT
10ca0 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 56 54 41 42  ype==RBU_PK_VTAB
10cb0 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
10cc0 20 20 20 20 20 20 7c 7c 28 70 49 74 65 72 2d 3e        ||(pIter->
10cd0 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 4e 4f  eType==RBU_PK_NO
10ce0 4e 45 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  NE).            
10cf0 20 20 20 20 20 20 20 20 7c 7c 28 70 49 74 65 72          ||(pIter
10d00 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f  ->eType==RBU_PK_
10d10 45 58 54 45 52 4e 41 4c 20 26 26 20 72 62 75 49  EXTERNAL && rbuI
10d20 73 56 61 63 75 75 6d 28 70 29 29 3b 0a 20 20 20  sVacuum(p));.   
10d30 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
10d40 54 62 6c 20 3d 20 70 49 74 65 72 2d 3e 7a 54 62  Tbl = pIter->zTb
10d50 6c 3b 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c  l;       /* Tabl
10d60 65 20 74 68 69 73 20 73 74 65 70 20 61 70 70 6c  e this step appl
10d70 69 65 73 20 74 6f 20 2a 2f 0a 20 20 20 20 20 20  ies to */.      
10d80 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 57 72 69  const char *zWri
10d90 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
10da0 20 20 20 20 20 20 2f 2a 20 49 6d 70 6f 73 74 65        /* Imposte
10db0 72 20 74 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a  r table name */.
10dc0 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 42 69  .      char *zBi
10dd0 6e 64 69 6e 67 73 20 3d 20 72 62 75 4f 62 6a 49  ndings = rbuObjI
10de0 74 65 72 47 65 74 42 69 6e 64 6c 69 73 74 28 70  terGetBindlist(p
10df0 2c 20 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c  , pIter->nTblCol
10e00 20 2b 20 62 52 62 75 52 6f 77 69 64 29 3b 0a 20   + bRbuRowid);. 
10e10 20 20 20 20 20 63 68 61 72 20 2a 7a 57 68 65 72       char *zWher
10e20 65 20 3d 20 72 62 75 4f 62 6a 49 74 65 72 47 65  e = rbuObjIterGe
10e30 74 57 68 65 72 65 28 70 2c 20 70 49 74 65 72 29  tWhere(p, pIter)
10e40 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4f  ;.      char *zO
10e50 6c 64 6c 69 73 74 20 3d 20 72 62 75 4f 62 6a 49  ldlist = rbuObjI
10e60 74 65 72 47 65 74 4f 6c 64 6c 69 73 74 28 70 2c  terGetOldlist(p,
10e70 20 70 49 74 65 72 2c 20 22 6f 6c 64 22 29 3b 0a   pIter, "old");.
10e80 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 65 77        char *zNew
10e90 6c 69 73 74 20 3d 20 72 62 75 4f 62 6a 49 74 65  list = rbuObjIte
10ea0 72 47 65 74 4f 6c 64 6c 69 73 74 28 70 2c 20 70  rGetOldlist(p, p
10eb0 49 74 65 72 2c 20 22 6e 65 77 22 29 3b 0a 0a 20  Iter, "new");.. 
10ec0 20 20 20 20 20 7a 43 6f 6c 6c 69 73 74 20 3d 20       zCollist = 
10ed0 72 62 75 4f 62 6a 49 74 65 72 47 65 74 43 6f 6c  rbuObjIterGetCol
10ee0 6c 69 73 74 28 70 2c 20 70 49 74 65 72 29 3b 0a  list(p, pIter);.
10ef0 20 20 20 20 20 20 70 49 74 65 72 2d 3e 6e 43 6f        pIter->nCo
10f00 6c 20 3d 20 70 49 74 65 72 2d 3e 6e 54 62 6c 43  l = pIter->nTblC
10f10 6f 6c 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 72  ol;..      /* Cr
10f20 65 61 74 65 20 74 68 65 20 69 6d 70 6f 73 74 65  eate the imposte
10f30 72 20 74 61 62 6c 65 20 6f 72 20 74 61 62 6c 65  r table or table
10f40 73 20 28 69 66 20 72 65 71 75 69 72 65 64 29 2e  s (if required).
10f50 20 2a 2f 0a 20 20 20 20 20 20 72 62 75 43 72 65   */.      rbuCre
10f60 61 74 65 49 6d 70 6f 73 74 65 72 54 61 62 6c 65  ateImposterTable
10f70 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  (p, pIter);.    
10f80 20 20 72 62 75 43 72 65 61 74 65 49 6d 70 6f 73    rbuCreateImpos
10f90 74 65 72 54 61 62 6c 65 32 28 70 2c 20 70 49 74  terTable2(p, pIt
10fa0 65 72 29 3b 0a 20 20 20 20 20 20 7a 57 72 69 74  er);.      zWrit
10fb0 65 20 3d 20 28 70 49 74 65 72 2d 3e 65 54 79 70  e = (pIter->eTyp
10fc0 65 3d 3d 52 42 55 5f 50 4b 5f 56 54 41 42 20 3f  e==RBU_PK_VTAB ?
10fd0 20 22 22 20 3a 20 22 72 62 75 5f 69 6d 70 5f 22   "" : "rbu_imp_"
10fe0 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 72 65  );..      /* Cre
10ff0 61 74 65 20 74 68 65 20 49 4e 53 45 52 54 20 73  ate the INSERT s
11000 74 61 74 65 6d 65 6e 74 20 74 6f 20 77 72 69 74  tatement to writ
11010 65 20 74 6f 20 74 68 65 20 74 61 72 67 65 74 20  e to the target 
11020 50 4b 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 20  PK b-tree */.   
11030 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
11040 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
11050 20 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61     p->rc = prepa
11060 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74  reFreeAndCollect
11070 45 72 72 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c  Error(p->dbMain,
11080 20 26 70 49 74 65 72 2d 3e 70 49 6e 73 65 72 74   &pIter->pInsert
11090 2c 20 70 7a 2c 0a 20 20 20 20 20 20 20 20 20 20  , pz,.          
110a0 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74    sqlite3_mprint
110b0 66 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  f(.             
110c0 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 5c 22   "INSERT INTO \"
110d0 25 73 25 77 5c 22 28 25 73 25 73 29 20 56 41 4c  %s%w\"(%s%s) VAL
110e0 55 45 53 28 25 73 29 22 2c 20 0a 20 20 20 20 20  UES(%s)", .     
110f0 20 20 20 20 20 20 20 20 20 7a 57 72 69 74 65 2c           zWrite,
11100 20 7a 54 62 6c 2c 20 7a 43 6f 6c 6c 69 73 74 2c   zTbl, zCollist,
11110 20 28 62 52 62 75 52 6f 77 69 64 20 3f 20 22 2c   (bRbuRowid ? ",
11120 20 5f 72 6f 77 69 64 5f 22 20 3a 20 22 22 29 2c   _rowid_" : ""),
11130 20 7a 42 69 6e 64 69 6e 67 73 0a 20 20 20 20 20   zBindings.     
11140 20 20 20 20 20 20 20 29 0a 20 20 20 20 20 20 20         ).       
11150 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20   );.      }..   
11160 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65     /* Create the
11170 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e   DELETE statemen
11180 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68  t to write to th
11190 65 20 74 61 72 67 65 74 20 50 4b 20 62 2d 74 72  e target PK b-tr
111a0 65 65 2e 0a 20 20 20 20 20 20 2a 2a 20 42 65 63  ee..      ** Bec
111b0 61 75 73 65 20 69 74 20 6f 6e 6c 79 20 70 65 72  ause it only per
111c0 66 6f 72 6d 73 20 49 4e 53 45 52 54 20 6f 70 65  forms INSERT ope
111d0 72 61 74 69 6f 6e 73 2c 20 74 68 69 73 20 69 73  rations, this is
111e0 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20 66 6f   not required fo
111f0 72 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20 72 62  r.      ** an rb
11200 75 20 76 61 63 75 75 6d 20 68 61 6e 64 6c 65 2e  u vacuum handle.
11210 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 72    */.      if( r
11220 62 75 49 73 56 61 63 75 75 6d 28 70 29 3d 3d 30  buIsVacuum(p)==0
11230 20 26 26 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54   && p->rc==SQLIT
11240 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
11250 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65 46  p->rc = prepareF
11260 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72  reeAndCollectErr
11270 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 70  or(p->dbMain, &p
11280 49 74 65 72 2d 3e 70 44 65 6c 65 74 65 2c 20 70  Iter->pDelete, p
11290 7a 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  z,.            s
112a0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a  qlite3_mprintf(.
112b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 44                "D
112c0 45 4c 45 54 45 20 46 52 4f 4d 20 5c 22 25 73 25  ELETE FROM \"%s%
112d0 77 5c 22 20 57 48 45 52 45 20 25 73 22 2c 20 7a  w\" WHERE %s", z
112e0 57 72 69 74 65 2c 20 7a 54 62 6c 2c 20 7a 57 68  Write, zTbl, zWh
112f0 65 72 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  ere.            
11300 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  ).        );.   
11310 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
11320 72 62 75 49 73 56 61 63 75 75 6d 28 70 29 3d 3d  rbuIsVacuum(p)==
11330 30 20 26 26 20 70 49 74 65 72 2d 3e 61 62 49 6e  0 && pIter->abIn
11340 64 65 78 65 64 20 29 7b 0a 20 20 20 20 20 20 20  dexed ){.       
11350 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 62   const char *zRb
11360 75 52 6f 77 69 64 20 3d 20 22 22 3b 0a 20 20 20  uRowid = "";.   
11370 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e       if( pIter->
11380 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 45 58  eType==RBU_PK_EX
11390 54 45 52 4e 41 4c 20 7c 7c 20 70 49 74 65 72 2d  TERNAL || pIter-
113a0 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 4e  >eType==RBU_PK_N
113b0 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ONE ){.         
113c0 20 7a 52 62 75 52 6f 77 69 64 20 3d 20 22 2c 20   zRbuRowid = ", 
113d0 72 62 75 5f 72 6f 77 69 64 22 3b 0a 20 20 20 20  rbu_rowid";.    
113e0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
113f0 2a 20 43 72 65 61 74 65 20 74 68 65 20 72 62 75  * Create the rbu
11400 5f 74 6d 70 5f 78 78 78 20 74 61 62 6c 65 20 61  _tmp_xxx table a
11410 6e 64 20 74 68 65 20 74 72 69 67 67 65 72 73 20  nd the triggers 
11420 74 6f 20 70 6f 70 75 6c 61 74 65 20 69 74 2e 20  to populate it. 
11430 2a 2f 0a 20 20 20 20 20 20 20 20 72 62 75 4d 50  */.        rbuMP
11440 72 69 6e 74 66 45 78 65 63 28 70 2c 20 70 2d 3e  rintfExec(p, p->
11450 64 62 52 62 75 2c 0a 20 20 20 20 20 20 20 20 20  dbRbu,.         
11460 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45     "CREATE TABLE
11470 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20 25   IF NOT EXISTS %
11480 73 2e 27 72 62 75 5f 74 6d 70 5f 25 71 27 20 41  s.'rbu_tmp_%q' A
11490 53 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  S ".            
114a0 22 53 45 4c 45 43 54 20 2a 25 73 20 46 52 4f 4d  "SELECT *%s FROM
114b0 20 27 25 71 27 20 57 48 45 52 45 20 30 3b 22 0a   '%q' WHERE 0;".
114c0 20 20 20 20 20 20 20 20 20 20 20 20 2c 20 70 2d              , p-
114d0 3e 7a 53 74 61 74 65 44 62 2c 20 70 49 74 65 72  >zStateDb, pIter
114e0 2d 3e 7a 44 61 74 61 54 62 6c 0a 20 20 20 20 20  ->zDataTbl.     
114f0 20 20 20 20 20 20 20 2c 20 28 70 49 74 65 72 2d         , (pIter-
11500 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 45  >eType==RBU_PK_E
11510 58 54 45 52 4e 41 4c 20 3f 20 22 2c 20 30 20 41  XTERNAL ? ", 0 A
11520 53 20 72 62 75 5f 72 6f 77 69 64 22 20 3a 20 22  S rbu_rowid" : "
11530 22 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 2c  ").            ,
11540 20 70 49 74 65 72 2d 3e 7a 44 61 74 61 54 62 6c   pIter->zDataTbl
11550 0a 20 20 20 20 20 20 20 20 29 3b 0a 0a 20 20 20  .        );..   
11560 20 20 20 20 20 72 62 75 4d 50 72 69 6e 74 66 45       rbuMPrintfE
11570 78 65 63 28 70 2c 20 70 2d 3e 64 62 4d 61 69 6e  xec(p, p->dbMain
11580 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 43  ,.            "C
11590 52 45 41 54 45 20 54 45 4d 50 20 54 52 49 47 47  REATE TEMP TRIGG
115a0 45 52 20 72 62 75 5f 64 65 6c 65 74 65 5f 74 72  ER rbu_delete_tr
115b0 20 42 45 46 4f 52 45 20 44 45 4c 45 54 45 20 4f   BEFORE DELETE O
115c0 4e 20 5c 22 25 73 25 77 5c 22 20 22 0a 20 20 20  N \"%s%w\" ".   
115d0 20 20 20 20 20 20 20 20 20 22 42 45 47 49 4e 20           "BEGIN 
115e0 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 20  ".            " 
115f0 20 53 45 4c 45 43 54 20 72 62 75 5f 74 6d 70 5f   SELECT rbu_tmp_
11600 69 6e 73 65 72 74 28 33 2c 20 25 73 29 3b 22 0a  insert(3, %s);".
11610 20 20 20 20 20 20 20 20 20 20 20 20 22 45 4e 44              "END
11620 3b 22 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20  ;"..            
11630 22 43 52 45 41 54 45 20 54 45 4d 50 20 54 52 49  "CREATE TEMP TRI
11640 47 47 45 52 20 72 62 75 5f 75 70 64 61 74 65 31  GGER rbu_update1
11650 5f 74 72 20 42 45 46 4f 52 45 20 55 50 44 41 54  _tr BEFORE UPDAT
11660 45 20 4f 4e 20 5c 22 25 73 25 77 5c 22 20 22 0a  E ON \"%s%w\" ".
11670 20 20 20 20 20 20 20 20 20 20 20 20 22 42 45 47              "BEG
11680 49 4e 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  IN ".           
11690 20 22 20 20 53 45 4c 45 43 54 20 72 62 75 5f 74   "  SELECT rbu_t
116a0 6d 70 5f 69 6e 73 65 72 74 28 33 2c 20 25 73 29  mp_insert(3, %s)
116b0 3b 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  ;".            "
116c0 45 4e 44 3b 22 0a 0a 20 20 20 20 20 20 20 20 20  END;"..         
116d0 20 20 20 22 43 52 45 41 54 45 20 54 45 4d 50 20     "CREATE TEMP 
116e0 54 52 49 47 47 45 52 20 72 62 75 5f 75 70 64 61  TRIGGER rbu_upda
116f0 74 65 32 5f 74 72 20 41 46 54 45 52 20 55 50 44  te2_tr AFTER UPD
11700 41 54 45 20 4f 4e 20 5c 22 25 73 25 77 5c 22 20  ATE ON \"%s%w\" 
11710 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 42  ".            "B
11720 45 47 49 4e 20 22 0a 20 20 20 20 20 20 20 20 20  EGIN ".         
11730 20 20 20 22 20 20 53 45 4c 45 43 54 20 72 62 75     "  SELECT rbu
11740 5f 74 6d 70 5f 69 6e 73 65 72 74 28 34 2c 20 25  _tmp_insert(4, %
11750 73 29 3b 22 0a 20 20 20 20 20 20 20 20 20 20 20  s);".           
11760 20 22 45 4e 44 3b 22 2c 0a 20 20 20 20 20 20 20   "END;",.       
11770 20 20 20 20 20 7a 57 72 69 74 65 2c 20 7a 54 62       zWrite, zTb
11780 6c 2c 20 7a 4f 6c 64 6c 69 73 74 2c 0a 20 20 20  l, zOldlist,.   
11790 20 20 20 20 20 20 20 20 20 7a 57 72 69 74 65 2c           zWrite,
117a0 20 7a 54 62 6c 2c 20 7a 4f 6c 64 6c 69 73 74 2c   zTbl, zOldlist,
117b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 57 72  .            zWr
117c0 69 74 65 2c 20 7a 54 62 6c 2c 20 7a 4e 65 77 6c  ite, zTbl, zNewl
117d0 69 73 74 0a 20 20 20 20 20 20 20 20 29 3b 0a 0a  ist.        );..
117e0 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65          if( pIte
117f0 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b  r->eType==RBU_PK
11800 5f 45 58 54 45 52 4e 41 4c 20 7c 7c 20 70 49 74  _EXTERNAL || pIt
11810 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50  er->eType==RBU_P
11820 4b 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  K_NONE ){.      
11830 20 20 20 20 72 62 75 4d 50 72 69 6e 74 66 45 78      rbuMPrintfEx
11840 65 63 28 70 2c 20 70 2d 3e 64 62 4d 61 69 6e 2c  ec(p, p->dbMain,
11850 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
11860 43 52 45 41 54 45 20 54 45 4d 50 20 54 52 49 47  CREATE TEMP TRIG
11870 47 45 52 20 72 62 75 5f 69 6e 73 65 72 74 5f 74  GER rbu_insert_t
11880 72 20 41 46 54 45 52 20 49 4e 53 45 52 54 20 4f  r AFTER INSERT O
11890 4e 20 5c 22 25 73 25 77 5c 22 20 22 0a 20 20 20  N \"%s%w\" ".   
118a0 20 20 20 20 20 20 20 20 20 20 20 22 42 45 47 49             "BEGI
118b0 4e 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  N ".            
118c0 20 20 22 20 20 53 45 4c 45 43 54 20 72 62 75 5f    "  SELECT rbu_
118d0 74 6d 70 5f 69 6e 73 65 72 74 28 30 2c 20 25 73  tmp_insert(0, %s
118e0 29 3b 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  );".            
118f0 20 20 22 45 4e 44 3b 22 2c 0a 20 20 20 20 20 20    "END;",.      
11900 20 20 20 20 20 20 20 20 7a 57 72 69 74 65 2c 20          zWrite, 
11910 7a 54 62 6c 2c 20 7a 4e 65 77 6c 69 73 74 0a 20  zTbl, zNewlist. 
11920 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
11930 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 72      }..        r
11940 62 75 4f 62 6a 49 74 65 72 50 72 65 70 61 72 65  buObjIterPrepare
11950 54 6d 70 49 6e 73 65 72 74 28 70 2c 20 70 49 74  TmpInsert(p, pIt
11960 65 72 2c 20 7a 43 6f 6c 6c 69 73 74 2c 20 7a 52  er, zCollist, zR
11970 62 75 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  buRowid);.      
11980 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 72 65 61  }..      /* Crea
11990 74 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  te the SELECT st
119a0 61 74 65 6d 65 6e 74 20 74 6f 20 72 65 61 64 20  atement to read 
119b0 6b 65 79 73 20 66 72 6f 6d 20 64 61 74 61 5f 78  keys from data_x
119c0 78 78 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  xx */.      if( 
119d0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
119e0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73   ){.        cons
119f0 74 20 63 68 61 72 20 2a 7a 52 62 75 52 6f 77 69  t char *zRbuRowi
11a00 64 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 20 20  d = "";.        
11a10 69 66 28 20 62 52 62 75 52 6f 77 69 64 20 29 7b  if( bRbuRowid ){
11a20 0a 20 20 20 20 20 20 20 20 20 20 7a 52 62 75 52  .          zRbuR
11a30 6f 77 69 64 20 3d 20 72 62 75 49 73 56 61 63 75  owid = rbuIsVacu
11a40 75 6d 28 70 29 20 3f 20 22 2c 5f 72 6f 77 69 64  um(p) ? ",_rowid
11a50 5f 20 22 20 3a 20 22 2c 72 62 75 5f 72 6f 77 69  _ " : ",rbu_rowi
11a60 64 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  d";.        }.  
11a70 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 72        p->rc = pr
11a80 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c  epareFreeAndColl
11a90 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 52 62  ectError(p->dbRb
11aa0 75 2c 20 26 70 49 74 65 72 2d 3e 70 53 65 6c 65  u, &pIter->pSele
11ab0 63 74 2c 20 70 7a 2c 0a 20 20 20 20 20 20 20 20  ct, pz,.        
11ac0 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69      sqlite3_mpri
11ad0 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 20  ntf(.           
11ae0 20 20 20 22 53 45 4c 45 43 54 20 25 73 2c 25 73     "SELECT %s,%s
11af0 20 72 62 75 5f 63 6f 6e 74 72 6f 6c 25 73 20 46   rbu_control%s F
11b00 52 4f 4d 20 27 25 71 27 25 73 22 2c 20 0a 20 20  ROM '%q'%s", .  
11b10 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c              zCol
11b20 6c 69 73 74 2c 20 0a 20 20 20 20 20 20 20 20 20  list, .         
11b30 20 20 20 20 20 28 72 62 75 49 73 56 61 63 75 75       (rbuIsVacuu
11b40 6d 28 70 29 20 3f 20 22 30 20 41 53 20 22 20 3a  m(p) ? "0 AS " :
11b50 20 22 22 29 2c 0a 20 20 20 20 20 20 20 20 20 20   ""),.          
11b60 20 20 20 20 7a 52 62 75 52 6f 77 69 64 2c 0a 20      zRbuRowid,. 
11b70 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74               pIt
11b80 65 72 2d 3e 7a 44 61 74 61 54 62 6c 2c 20 7a 4c  er->zDataTbl, zL
11b90 69 6d 69 74 0a 20 20 20 20 20 20 20 20 20 20 20  imit.           
11ba0 20 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20   ).        );.  
11bb0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 73 71 6c      }..      sql
11bc0 69 74 65 33 5f 66 72 65 65 28 7a 57 68 65 72 65  ite3_free(zWhere
11bd0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
11be0 5f 66 72 65 65 28 7a 4f 6c 64 6c 69 73 74 29 3b  _free(zOldlist);
11bf0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
11c00 72 65 65 28 7a 4e 65 77 6c 69 73 74 29 3b 0a 20  ree(zNewlist);. 
11c10 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
11c20 65 28 7a 42 69 6e 64 69 6e 67 73 29 3b 0a 20 20  e(zBindings);.  
11c30 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
11c40 66 72 65 65 28 7a 43 6f 6c 6c 69 73 74 29 3b 0a  free(zCollist);.
11c50 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
11c60 28 7a 4c 69 6d 69 74 29 3b 0a 20 20 7d 0a 20 20  (zLimit);.  }.  
11c70 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 3b  .  return p->rc;
11c80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 6f 75  .}../*.** Set ou
11c90 74 70 75 74 20 76 61 72 69 61 62 6c 65 20 2a 70  tput variable *p
11ca0 70 53 74 6d 74 20 74 6f 20 70 6f 69 6e 74 20 74  pStmt to point t
11cb0 6f 20 61 6e 20 55 50 44 41 54 45 20 73 74 61 74  o an UPDATE stat
11cc0 65 6d 65 6e 74 20 74 68 61 74 20 6d 61 79 0a 2a  ement that may.*
11cd0 2a 20 62 65 20 75 73 65 64 20 74 6f 20 75 70 64  * be used to upd
11ce0 61 74 65 20 74 68 65 20 69 6d 70 6f 73 74 65 72  ate the imposter
11cf0 20 74 61 62 6c 65 20 66 6f 72 20 74 68 65 20 6d   table for the m
11d00 61 69 6e 20 74 61 62 6c 65 20 62 2d 74 72 65 65  ain table b-tree
11d10 20 6f 66 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65   of the.** table
11d20 20 6f 62 6a 65 63 74 20 74 68 61 74 20 70 49 74   object that pIt
11d30 65 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  er currently poi
11d40 6e 74 73 20 74 6f 2c 20 61 73 73 75 6d 69 6e 67  nts to, assuming
11d50 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 72 62   that the .** rb
11d60 75 5f 63 6f 6e 74 72 6f 6c 20 63 6f 6c 75 6d 6e  u_control column
11d70 20 6f 66 20 74 68 65 20 64 61 74 61 5f 78 79 7a   of the data_xyz
11d80 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20   table contains 
11d90 7a 4d 61 73 6b 2e 0a 2a 2a 20 0a 2a 2a 20 49 66  zMask..** .** If
11da0 20 74 68 65 20 7a 4d 61 73 6b 20 73 74 72 69 6e   the zMask strin
11db0 67 20 64 6f 65 73 20 6e 6f 74 20 73 70 65 63 69  g does not speci
11dc0 66 79 20 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 74  fy any columns t
11dd0 6f 20 75 70 64 61 74 65 2c 20 74 68 65 6e 20 74  o update, then t
11de0 68 69 73 0a 2a 2a 20 69 73 20 6e 6f 74 20 61 6e  his.** is not an
11df0 20 65 72 72 6f 72 2e 20 4f 75 74 70 75 74 20 76   error. Output v
11e00 61 72 69 61 62 6c 65 20 2a 70 70 53 74 6d 74 20  ariable *ppStmt 
11e10 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69  is set to NULL i
11e20 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a  n this case..*/.
11e30 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 47 65  static int rbuGe
11e40 74 55 70 64 61 74 65 53 74 6d 74 28 0a 20 20 73  tUpdateStmt(.  s
11e50 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 20 20  qlite3rbu *p,   
11e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11e70 2a 20 52 42 55 20 68 61 6e 64 6c 65 20 2a 2f 0a  * RBU handle */.
11e80 20 20 52 62 75 4f 62 6a 49 74 65 72 20 2a 70 49    RbuObjIter *pI
11e90 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ter,            
11ea0 20 20 2f 2a 20 4f 62 6a 65 63 74 20 69 74 65 72    /* Object iter
11eb0 61 74 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ator */.  const 
11ec0 63 68 61 72 20 2a 7a 4d 61 73 6b 2c 20 20 20 20  char *zMask,    
11ed0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72 62 75            /* rbu
11ee0 5f 63 6f 6e 74 72 6f 6c 20 76 61 6c 75 65 20 28  _control value (
11ef0 27 78 2e 78 2e 27 29 20 2a 2f 0a 20 20 73 71 6c  'x.x.') */.  sql
11f00 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74  ite3_stmt **ppSt
11f10 6d 74 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  mt           /* 
11f20 4f 55 54 3a 20 55 50 44 41 54 45 20 73 74 61 74  OUT: UPDATE stat
11f30 65 6d 65 6e 74 20 68 61 6e 64 6c 65 20 2a 2f 0a  ement handle */.
11f40 29 7b 0a 20 20 52 62 75 55 70 64 61 74 65 53 74  ){.  RbuUpdateSt
11f50 6d 74 20 2a 2a 70 70 3b 0a 20 20 52 62 75 55 70  mt **pp;.  RbuUp
11f60 64 61 74 65 53 74 6d 74 20 2a 70 55 70 20 3d 20  dateStmt *pUp = 
11f70 30 3b 0a 20 20 69 6e 74 20 6e 55 70 20 3d 20 30  0;.  int nUp = 0
11f80 3b 0a 0a 20 20 2f 2a 20 49 6e 20 63 61 73 65 20  ;..  /* In case 
11f90 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
11fa0 2a 2f 0a 20 20 2a 70 70 53 74 6d 74 20 3d 20 30  */.  *ppStmt = 0
11fb0 3b 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20 66  ;..  /* Search f
11fc0 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20 73  or an existing s
11fd0 74 61 74 65 6d 65 6e 74 2e 20 49 66 20 6f 6e 65  tatement. If one
11fe0 20 69 73 20 66 6f 75 6e 64 2c 20 73 68 69 66 74   is found, shift
11ff0 20 69 74 20 74 6f 20 74 68 65 20 66 72 6f 6e 74   it to the front
12000 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 4c 52 55  .  ** of the LRU
12010 20 71 75 65 75 65 20 61 6e 64 20 72 65 74 75 72   queue and retur
12020 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 4f  n immediately. O
12030 74 68 65 72 77 69 73 65 2c 20 6c 65 61 76 65 20  therwise, leave 
12040 6e 55 70 20 70 6f 69 6e 74 69 6e 67 0a 20 20 2a  nUp pointing.  *
12050 2a 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  * to the number 
12060 6f 66 20 73 74 61 74 65 6d 65 6e 74 73 20 63 75  of statements cu
12070 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 63  rrently in the c
12080 61 63 68 65 20 61 6e 64 20 70 55 70 20 74 6f 20  ache and pUp to 
12090 74 68 65 0a 20 20 2a 2a 20 6c 61 73 74 20 6f 62  the.  ** last ob
120a0 6a 65 63 74 20 69 6e 20 74 68 65 20 6c 69 73 74  ject in the list
120b0 2e 20 20 2a 2f 0a 20 20 66 6f 72 28 70 70 3d 26  .  */.  for(pp=&
120c0 70 49 74 65 72 2d 3e 70 52 62 75 55 70 64 61 74  pIter->pRbuUpdat
120d0 65 3b 20 2a 70 70 3b 20 70 70 3d 26 28 28 2a 70  e; *pp; pp=&((*p
120e0 70 29 2d 3e 70 4e 65 78 74 29 29 7b 0a 20 20 20  p)->pNext)){.   
120f0 20 70 55 70 20 3d 20 2a 70 70 3b 0a 20 20 20 20   pUp = *pp;.    
12100 69 66 28 20 73 74 72 63 6d 70 28 70 55 70 2d 3e  if( strcmp(pUp->
12110 7a 4d 61 73 6b 2c 20 7a 4d 61 73 6b 29 3d 3d 30  zMask, zMask)==0
12120 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 20 3d 20   ){.      *pp = 
12130 70 55 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  pUp->pNext;.    
12140 20 20 70 55 70 2d 3e 70 4e 65 78 74 20 3d 20 70    pUp->pNext = p
12150 49 74 65 72 2d 3e 70 52 62 75 55 70 64 61 74 65  Iter->pRbuUpdate
12160 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70  ;.      pIter->p
12170 52 62 75 55 70 64 61 74 65 20 3d 20 70 55 70 3b  RbuUpdate = pUp;
12180 0a 20 20 20 20 20 20 2a 70 70 53 74 6d 74 20 3d  .      *ppStmt =
12190 20 70 55 70 2d 3e 70 55 70 64 61 74 65 3b 20 0a   pUp->pUpdate; .
121a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
121b0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
121c0 20 20 6e 55 70 2b 2b 3b 0a 20 20 7d 0a 20 20 61    nUp++;.  }.  a
121d0 73 73 65 72 74 28 20 70 55 70 3d 3d 30 20 7c 7c  ssert( pUp==0 ||
121e0 20 70 55 70 2d 3e 70 4e 65 78 74 3d 3d 30 20 29   pUp->pNext==0 )
121f0 3b 0a 0a 20 20 69 66 28 20 6e 55 70 3e 3d 53 51  ;..  if( nUp>=SQ
12200 4c 49 54 45 5f 52 42 55 5f 55 50 44 41 54 45 5f  LITE_RBU_UPDATE_
12210 43 41 43 48 45 53 49 5a 45 20 29 7b 0a 20 20 20  CACHESIZE ){.   
12220 20 66 6f 72 28 70 70 3d 26 70 49 74 65 72 2d 3e   for(pp=&pIter->
12230 70 52 62 75 55 70 64 61 74 65 3b 20 2a 70 70 21  pRbuUpdate; *pp!
12240 3d 70 55 70 3b 20 70 70 3d 26 28 28 2a 70 70 29  =pUp; pp=&((*pp)
12250 2d 3e 70 4e 65 78 74 29 29 3b 0a 20 20 20 20 2a  ->pNext));.    *
12260 70 70 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  pp = 0;.    sqli
12270 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 55 70  te3_finalize(pUp
12280 2d 3e 70 55 70 64 61 74 65 29 3b 0a 20 20 20 20  ->pUpdate);.    
12290 70 55 70 2d 3e 70 55 70 64 61 74 65 20 3d 20 30  pUp->pUpdate = 0
122a0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
122b0 55 70 20 3d 20 28 52 62 75 55 70 64 61 74 65 53  Up = (RbuUpdateS
122c0 74 6d 74 2a 29 72 62 75 4d 61 6c 6c 6f 63 28 70  tmt*)rbuMalloc(p
122d0 2c 20 73 69 7a 65 6f 66 28 52 62 75 55 70 64 61  , sizeof(RbuUpda
122e0 74 65 53 74 6d 74 29 2b 70 49 74 65 72 2d 3e 6e  teStmt)+pIter->n
122f0 54 62 6c 43 6f 6c 2b 31 29 3b 0a 20 20 7d 0a 0a  TblCol+1);.  }..
12300 20 20 69 66 28 20 70 55 70 20 29 7b 0a 20 20 20    if( pUp ){.   
12310 20 63 68 61 72 20 2a 7a 57 68 65 72 65 20 3d 20   char *zWhere = 
12320 72 62 75 4f 62 6a 49 74 65 72 47 65 74 57 68 65  rbuObjIterGetWhe
12330 72 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  re(p, pIter);.  
12340 20 20 63 68 61 72 20 2a 7a 53 65 74 20 3d 20 72    char *zSet = r
12350 62 75 4f 62 6a 49 74 65 72 47 65 74 53 65 74 6c  buObjIterGetSetl
12360 69 73 74 28 70 2c 20 70 49 74 65 72 2c 20 7a 4d  ist(p, pIter, zM
12370 61 73 6b 29 3b 0a 20 20 20 20 63 68 61 72 20 2a  ask);.    char *
12380 7a 55 70 64 61 74 65 20 3d 20 30 3b 0a 0a 20 20  zUpdate = 0;..  
12390 20 20 70 55 70 2d 3e 7a 4d 61 73 6b 20 3d 20 28    pUp->zMask = (
123a0 63 68 61 72 2a 29 26 70 55 70 5b 31 5d 3b 0a 20  char*)&pUp[1];. 
123b0 20 20 20 6d 65 6d 63 70 79 28 70 55 70 2d 3e 7a     memcpy(pUp->z
123c0 4d 61 73 6b 2c 20 7a 4d 61 73 6b 2c 20 70 49 74  Mask, zMask, pIt
123d0 65 72 2d 3e 6e 54 62 6c 43 6f 6c 29 3b 0a 20 20  er->nTblCol);.  
123e0 20 20 70 55 70 2d 3e 70 4e 65 78 74 20 3d 20 70    pUp->pNext = p
123f0 49 74 65 72 2d 3e 70 52 62 75 55 70 64 61 74 65  Iter->pRbuUpdate
12400 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70 52 62  ;.    pIter->pRb
12410 75 55 70 64 61 74 65 20 3d 20 70 55 70 3b 0a 0a  uUpdate = pUp;..
12420 20 20 20 20 69 66 28 20 7a 53 65 74 20 29 7b 0a      if( zSet ){.
12430 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
12440 20 2a 7a 50 72 65 66 69 78 20 3d 20 22 22 3b 0a   *zPrefix = "";.
12450 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72  .      if( pIter
12460 2d 3e 65 54 79 70 65 21 3d 52 42 55 5f 50 4b 5f  ->eType!=RBU_PK_
12470 56 54 41 42 20 29 20 7a 50 72 65 66 69 78 20 3d  VTAB ) zPrefix =
12480 20 22 72 62 75 5f 69 6d 70 5f 22 3b 0a 20 20 20   "rbu_imp_";.   
12490 20 20 20 7a 55 70 64 61 74 65 20 3d 20 73 71 6c     zUpdate = sql
124a0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 55 50  ite3_mprintf("UP
124b0 44 41 54 45 20 5c 22 25 73 25 77 5c 22 20 53 45  DATE \"%s%w\" SE
124c0 54 20 25 73 20 57 48 45 52 45 20 25 73 22 2c 20  T %s WHERE %s", 
124d0 0a 20 20 20 20 20 20 20 20 20 20 7a 50 72 65 66  .          zPref
124e0 69 78 2c 20 70 49 74 65 72 2d 3e 7a 54 62 6c 2c  ix, pIter->zTbl,
124f0 20 7a 53 65 74 2c 20 7a 57 68 65 72 65 0a 20 20   zSet, zWhere.  
12500 20 20 20 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e      );.      p->
12510 72 63 20 3d 20 70 72 65 70 61 72 65 46 72 65 65  rc = prepareFree
12520 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28  AndCollectError(
12530 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 64 62  .          p->db
12540 4d 61 69 6e 2c 20 26 70 55 70 2d 3e 70 55 70 64  Main, &pUp->pUpd
12550 61 74 65 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67  ate, &p->zErrmsg
12560 2c 20 7a 55 70 64 61 74 65 0a 20 20 20 20 20 20  , zUpdate.      
12570 29 3b 0a 20 20 20 20 20 20 2a 70 70 53 74 6d 74  );.      *ppStmt
12580 20 3d 20 70 55 70 2d 3e 70 55 70 64 61 74 65 3b   = pUp->pUpdate;
12590 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
125a0 65 33 5f 66 72 65 65 28 7a 57 68 65 72 65 29 3b  e3_free(zWhere);
125b0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
125c0 65 28 7a 53 65 74 29 3b 0a 20 20 7d 0a 0a 20 20  e(zSet);.  }..  
125d0 72 65 74 75 72 6e 20 70 2d 3e 72 63 3b 0a 7d 0a  return p->rc;.}.
125e0 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 20  .static sqlite3 
125f0 2a 72 62 75 4f 70 65 6e 44 62 68 61 6e 64 6c 65  *rbuOpenDbhandle
12600 28 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20 2a  (.  sqlite3rbu *
12610 70 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  p, .  const char
12620 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 69 6e 74 20   *zName, .  int 
12630 62 55 73 65 56 66 73 0a 29 7b 0a 20 20 73 71 6c  bUseVfs.){.  sql
12640 69 74 65 33 20 2a 64 62 20 3d 20 30 3b 0a 20 20  ite3 *db = 0;.  
12650 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
12660 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 6f 6e 73  E_OK ){.    cons
12670 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 53 51  t int flags = SQ
12680 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
12690 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ITE|SQLITE_OPEN_
126a0 43 52 45 41 54 45 7c 53 51 4c 49 54 45 5f 4f 50  CREATE|SQLITE_OP
126b0 45 4e 5f 55 52 49 3b 0a 20 20 20 20 70 2d 3e 72  EN_URI;.    p->r
126c0 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  c = sqlite3_open
126d0 5f 76 32 28 7a 4e 61 6d 65 2c 20 26 64 62 2c 20  _v2(zName, &db, 
126e0 66 6c 61 67 73 2c 20 62 55 73 65 56 66 73 20 3f  flags, bUseVfs ?
126f0 20 70 2d 3e 7a 56 66 73 4e 61 6d 65 20 3a 20 30   p->zVfsName : 0
12700 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  );.    if( p->rc
12710 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 7a 45 72   ){.      p->zEr
12720 72 6d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  rmsg = sqlite3_m
12730 70 72 69 6e 74 66 28 22 25 73 22 2c 20 73 71 6c  printf("%s", sql
12740 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29  ite3_errmsg(db))
12750 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
12760 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20 20 20 20  close(db);.     
12770 20 64 62 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20   db = 0;.    }. 
12780 20 7d 0a 20 20 72 65 74 75 72 6e 20 64 62 3b 0a   }.  return db;.
12790 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e  }../*.** Free an
127a0 20 52 62 75 53 74 61 74 65 20 6f 62 6a 65 63 74   RbuState object
127b0 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 72 62   allocated by rb
127c0 75 4c 6f 61 64 53 74 61 74 65 28 29 2e 0a 2a 2f  uLoadState()..*/
127d0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75  .static void rbu
127e0 46 72 65 65 53 74 61 74 65 28 52 62 75 53 74 61  FreeState(RbuSta
127f0 74 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20  te *p){.  if( p 
12800 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
12810 72 65 65 28 70 2d 3e 7a 54 62 6c 29 3b 0a 20 20  ree(p->zTbl);.  
12820 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
12830 2d 3e 7a 49 64 78 29 3b 0a 20 20 20 20 73 71 6c  ->zIdx);.    sql
12840 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
12850 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  }.}../*.** Alloc
12860 61 74 65 20 61 6e 20 52 62 75 53 74 61 74 65 20  ate an RbuState 
12870 6f 62 6a 65 63 74 20 61 6e 64 20 6c 6f 61 64 20  object and load 
12880 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
12890 74 68 65 20 72 62 75 5f 73 74 61 74 65 20 0a 2a  the rbu_state .*
128a0 2a 20 74 61 62 6c 65 20 69 6e 74 6f 20 69 74 2e  * table into it.
128b0 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
128c0 72 20 74 6f 20 74 68 65 20 6e 65 77 20 6f 62 6a  r to the new obj
128d0 65 63 74 2e 20 49 74 20 69 73 20 74 68 65 20 0a  ect. It is the .
128e0 2a 2a 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  ** responsibilit
128f0 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20  y of the caller 
12900 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72  to eventually fr
12910 65 65 20 74 68 65 20 6f 62 6a 65 63 74 20 75 73  ee the object us
12920 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66  ing.** sqlite3_f
12930 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ree()..**.** If 
12940 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
12950 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
12960 63 6f 64 65 20 61 6e 64 20 6d 65 73 73 61 67 65  code and message
12970 20 69 6e 20 74 68 65 20 72 62 75 20 68 61 6e 64   in the rbu hand
12980 6c 65 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e  le.** and return
12990 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63   NULL..*/.static
129a0 20 52 62 75 53 74 61 74 65 20 2a 72 62 75 4c 6f   RbuState *rbuLo
129b0 61 64 53 74 61 74 65 28 73 71 6c 69 74 65 33 72  adState(sqlite3r
129c0 62 75 20 2a 70 29 7b 0a 20 20 52 62 75 53 74 61  bu *p){.  RbuSta
129d0 74 65 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20  te *pRet = 0;.  
129e0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
129f0 74 6d 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  tmt = 0;.  int r
12a00 63 3b 0a 20 20 69 6e 74 20 72 63 32 3b 0a 0a 20  c;.  int rc2;.. 
12a10 20 70 52 65 74 20 3d 20 28 52 62 75 53 74 61 74   pRet = (RbuStat
12a20 65 2a 29 72 62 75 4d 61 6c 6c 6f 63 28 70 2c 20  e*)rbuMalloc(p, 
12a30 73 69 7a 65 6f 66 28 52 62 75 53 74 61 74 65 29  sizeof(RbuState)
12a40 29 3b 0a 20 20 69 66 28 20 70 52 65 74 3d 3d 30  );.  if( pRet==0
12a50 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
12a60 72 63 20 3d 20 70 72 65 70 61 72 65 46 72 65 65  rc = prepareFree
12a70 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28  AndCollectError(
12a80 70 2d 3e 64 62 52 62 75 2c 20 26 70 53 74 6d 74  p->dbRbu, &pStmt
12a90 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 20 0a  , &p->zErrmsg, .
12aa0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70        sqlite3_mp
12ab0 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20 6b 2c  rintf("SELECT k,
12ac0 20 76 20 46 52 4f 4d 20 25 73 2e 72 62 75 5f 73   v FROM %s.rbu_s
12ad0 74 61 74 65 22 2c 20 70 2d 3e 7a 53 74 61 74 65  tate", p->zState
12ae0 44 62 29 0a 20 20 29 3b 0a 20 20 77 68 69 6c 65  Db).  );.  while
12af0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
12b00 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  && SQLITE_ROW==s
12b10 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
12b20 74 29 20 29 7b 0a 20 20 20 20 73 77 69 74 63 68  t) ){.    switch
12b30 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  ( sqlite3_column
12b40 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30 29 20 29  _int(pStmt, 0) )
12b50 7b 0a 20 20 20 20 20 20 63 61 73 65 20 52 42 55  {.      case RBU
12b60 5f 53 54 41 54 45 5f 53 54 41 47 45 3a 0a 20 20  _STATE_STAGE:.  
12b70 20 20 20 20 20 20 70 52 65 74 2d 3e 65 53 74 61        pRet->eSta
12b80 67 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ge = sqlite3_col
12b90 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 31  umn_int(pStmt, 1
12ba0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
12bb0 52 65 74 2d 3e 65 53 74 61 67 65 21 3d 52 42 55  Ret->eStage!=RBU
12bc0 5f 53 54 41 47 45 5f 4f 41 4c 0a 20 20 20 20 20  _STAGE_OAL.     
12bd0 20 20 20 20 26 26 20 70 52 65 74 2d 3e 65 53 74      && pRet->eSt
12be0 61 67 65 21 3d 52 42 55 5f 53 54 41 47 45 5f 4d  age!=RBU_STAGE_M
12bf0 4f 56 45 0a 20 20 20 20 20 20 20 20 20 26 26 20  OVE.         && 
12c00 70 52 65 74 2d 3e 65 53 74 61 67 65 21 3d 52 42  pRet->eStage!=RB
12c10 55 5f 53 54 41 47 45 5f 43 4b 50 54 0a 20 20 20  U_STAGE_CKPT.   
12c20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
12c30 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
12c40 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20  _CORRUPT;.      
12c50 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
12c60 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20 52  k;..      case R
12c70 42 55 5f 53 54 41 54 45 5f 54 42 4c 3a 0a 20 20  BU_STATE_TBL:.  
12c80 20 20 20 20 20 20 70 52 65 74 2d 3e 7a 54 62 6c        pRet->zTbl
12c90 20 3d 20 72 62 75 53 74 72 6e 64 75 70 28 28 63   = rbuStrndup((c
12ca0 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
12cb0 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  umn_text(pStmt, 
12cc0 31 29 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20  1), &rc);.      
12cd0 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20    break;..      
12ce0 63 61 73 65 20 52 42 55 5f 53 54 41 54 45 5f 49  case RBU_STATE_I
12cf0 44 58 3a 0a 20 20 20 20 20 20 20 20 70 52 65 74  DX:.        pRet
12d00 2d 3e 7a 49 64 78 20 3d 20 72 62 75 53 74 72 6e  ->zIdx = rbuStrn
12d10 64 75 70 28 28 63 68 61 72 2a 29 73 71 6c 69 74  dup((char*)sqlit
12d20 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
12d30 53 74 6d 74 2c 20 31 29 2c 20 26 72 63 29 3b 0a  Stmt, 1), &rc);.
12d40 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a          break;..
12d50 20 20 20 20 20 20 63 61 73 65 20 52 42 55 5f 53        case RBU_S
12d60 54 41 54 45 5f 52 4f 57 3a 0a 20 20 20 20 20 20  TATE_ROW:.      
12d70 20 20 70 52 65 74 2d 3e 6e 52 6f 77 20 3d 20 73    pRet->nRow = s
12d80 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
12d90 74 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20  t(pStmt, 1);.   
12da0 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
12db0 20 20 20 63 61 73 65 20 52 42 55 5f 53 54 41 54     case RBU_STAT
12dc0 45 5f 50 52 4f 47 52 45 53 53 3a 0a 20 20 20 20  E_PROGRESS:.    
12dd0 20 20 20 20 70 52 65 74 2d 3e 6e 50 72 6f 67 72      pRet->nProgr
12de0 65 73 73 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  ess = sqlite3_co
12df0 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74  lumn_int64(pStmt
12e00 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 62 72  , 1);.        br
12e10 65 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73 65  eak;..      case
12e20 20 52 42 55 5f 53 54 41 54 45 5f 43 4b 50 54 3a   RBU_STATE_CKPT:
12e30 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e 69  .        pRet->i
12e40 57 61 6c 43 6b 73 75 6d 20 3d 20 73 71 6c 69 74  WalCksum = sqlit
12e50 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28  e3_column_int64(
12e60 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20 20  pStmt, 1);.     
12e70 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20     break;..     
12e80 20 63 61 73 65 20 52 42 55 5f 53 54 41 54 45 5f   case RBU_STATE_
12e90 43 4f 4f 4b 49 45 3a 0a 20 20 20 20 20 20 20 20  COOKIE:.        
12ea0 70 52 65 74 2d 3e 69 43 6f 6f 6b 69 65 20 3d 20  pRet->iCookie = 
12eb0 28 75 33 32 29 73 71 6c 69 74 65 33 5f 63 6f 6c  (u32)sqlite3_col
12ec0 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c  umn_int64(pStmt,
12ed0 20 31 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65   1);.        bre
12ee0 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20  ak;..      case 
12ef0 52 42 55 5f 53 54 41 54 45 5f 4f 41 4c 53 5a 3a  RBU_STATE_OALSZ:
12f00 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e 69  .        pRet->i
12f10 4f 61 6c 53 7a 20 3d 20 28 75 33 32 29 73 71 6c  OalSz = (u32)sql
12f20 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36  ite3_column_int6
12f30 34 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20  4(pStmt, 1);.   
12f40 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
12f50 20 20 20 63 61 73 65 20 52 42 55 5f 53 54 41 54     case RBU_STAT
12f60 45 5f 50 48 41 53 45 4f 4e 45 53 54 45 50 3a 0a  E_PHASEONESTEP:.
12f70 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e 6e 50          pRet->nP
12f80 68 61 73 65 4f 6e 65 53 74 65 70 20 3d 20 73 71  haseOneStep = sq
12f90 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
12fa0 36 34 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20  64(pStmt, 1);.  
12fb0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
12fc0 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
12fd0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
12fe0 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20  _CORRUPT;.      
12ff0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
13000 20 7d 0a 20 20 72 63 32 20 3d 20 73 71 6c 69 74   }.  rc2 = sqlit
13010 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
13020 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  t);.  if( rc==SQ
13030 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72  LITE_OK ) rc = r
13040 63 32 3b 0a 0a 20 20 70 2d 3e 72 63 20 3d 20 72  c2;..  p->rc = r
13050 63 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74  c;.  return pRet
13060 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  ;.}.../*.** Open
13070 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
13080 6e 64 6c 65 20 61 6e 64 20 61 74 74 61 63 68 20  ndle and attach 
13090 74 68 65 20 52 42 55 20 64 61 74 61 62 61 73 65  the RBU database
130a0 20 61 73 20 22 72 62 75 22 2e 20 49 66 20 61 6e   as "rbu". If an
130b0 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73  .** error occurs
130c0 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  , leave an error
130d0 20 63 6f 64 65 20 61 6e 64 20 6d 65 73 73 61 67   code and messag
130e0 65 20 69 6e 20 74 68 65 20 52 42 55 20 68 61 6e  e in the RBU han
130f0 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  dle..*/.static v
13100 6f 69 64 20 72 62 75 4f 70 65 6e 44 61 74 61 62  oid rbuOpenDatab
13110 61 73 65 28 73 71 6c 69 74 65 33 72 62 75 20 2a  ase(sqlite3rbu *
13120 70 2c 20 69 6e 74 20 2a 70 62 52 65 74 72 79 29  p, int *pbRetry)
13130 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72  {.  assert( p->r
13140 63 20 7c 7c 20 28 70 2d 3e 64 62 4d 61 69 6e 3d  c || (p->dbMain=
13150 3d 30 20 26 26 20 70 2d 3e 64 62 52 62 75 3d 3d  =0 && p->dbRbu==
13160 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  0) );.  assert( 
13170 70 2d 3e 72 63 20 7c 7c 20 72 62 75 49 73 56 61  p->rc || rbuIsVa
13180 63 75 75 6d 28 70 29 20 7c 7c 20 70 2d 3e 7a 54  cuum(p) || p->zT
13190 61 72 67 65 74 21 3d 30 20 29 3b 0a 0a 20 20 2f  arget!=0 );..  /
131a0 2a 20 4f 70 65 6e 20 74 68 65 20 52 42 55 20 64  * Open the RBU d
131b0 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 70 2d 3e  atabase */.  p->
131c0 64 62 52 62 75 20 3d 20 72 62 75 4f 70 65 6e 44  dbRbu = rbuOpenD
131d0 62 68 61 6e 64 6c 65 28 70 2c 20 70 2d 3e 7a 52  bhandle(p, p->zR
131e0 62 75 2c 20 31 29 3b 0a 0a 20 20 69 66 28 20 70  bu, 1);..  if( p
131f0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
13200 26 26 20 72 62 75 49 73 56 61 63 75 75 6d 28 70  && rbuIsVacuum(p
13210 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
13220 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 70 2d  _file_control(p-
13230 3e 64 62 52 62 75 2c 20 22 6d 61 69 6e 22 2c 20  >dbRbu, "main", 
13240 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 52 42 55  SQLITE_FCNTL_RBU
13250 43 4e 54 2c 20 28 76 6f 69 64 2a 29 70 29 3b 0a  CNT, (void*)p);.
13260 20 20 20 20 69 66 28 20 70 2d 3e 7a 53 74 61 74      if( p->zStat
13270 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f  e==0 ){.      co
13280 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 20  nst char *zFile 
13290 3d 20 73 71 6c 69 74 65 33 5f 64 62 5f 66 69 6c  = sqlite3_db_fil
132a0 65 6e 61 6d 65 28 70 2d 3e 64 62 52 62 75 2c 20  ename(p->dbRbu, 
132b0 22 6d 61 69 6e 22 29 3b 0a 20 20 20 20 20 20 70  "main");.      p
132c0 2d 3e 7a 53 74 61 74 65 20 3d 20 72 62 75 4d 50  ->zState = rbuMP
132d0 72 69 6e 74 66 28 70 2c 20 22 66 69 6c 65 3a 2f  rintf(p, "file:/
132e0 2f 25 73 2d 76 61 63 75 75 6d 3f 6d 6f 64 65 6f  /%s-vacuum?modeo
132f0 66 3d 25 73 22 2c 20 7a 46 69 6c 65 2c 20 7a 46  f=%s", zFile, zF
13300 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ile);.    }.  }.
13310 0a 20 20 2f 2a 20 49 66 20 75 73 69 6e 67 20 73  .  /* If using s
13320 65 70 61 72 61 74 65 20 52 42 55 20 61 6e 64 20  eparate RBU and 
13330 73 74 61 74 65 20 64 61 74 61 62 61 73 65 73 2c  state databases,
13340 20 61 74 74 61 63 68 20 74 68 65 20 73 74 61 74   attach the stat
13350 65 20 64 61 74 61 62 61 73 65 20 74 6f 0a 20 20  e database to.  
13360 2a 2a 20 74 68 65 20 52 42 55 20 64 62 20 68 61  ** the RBU db ha
13370 6e 64 6c 65 20 6e 6f 77 2e 20 20 2a 2f 0a 20 20  ndle now.  */.  
13380 69 66 28 20 70 2d 3e 7a 53 74 61 74 65 20 29 7b  if( p->zState ){
13390 0a 20 20 20 20 72 62 75 4d 50 72 69 6e 74 66 45  .    rbuMPrintfE
133a0 78 65 63 28 70 2c 20 70 2d 3e 64 62 52 62 75 2c  xec(p, p->dbRbu,
133b0 20 22 41 54 54 41 43 48 20 25 51 20 41 53 20 73   "ATTACH %Q AS s
133c0 74 61 74 22 2c 20 70 2d 3e 7a 53 74 61 74 65 29  tat", p->zState)
133d0 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e  ;.    memcpy(p->
133e0 7a 53 74 61 74 65 44 62 2c 20 22 73 74 61 74 22  zStateDb, "stat"
133f0 2c 20 34 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  , 4);.  }else{. 
13400 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e 7a 53 74     memcpy(p->zSt
13410 61 74 65 44 62 2c 20 22 6d 61 69 6e 22 2c 20 34  ateDb, "main", 4
13420 29 3b 0a 20 20 7d 0a 0a 23 69 66 20 30 0a 20 20  );.  }..#if 0.  
13430 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
13440 45 5f 4f 4b 20 26 26 20 72 62 75 49 73 56 61 63  E_OK && rbuIsVac
13450 75 75 6d 28 70 29 20 29 7b 0a 20 20 20 20 70 2d  uum(p) ){.    p-
13460 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78  >rc = sqlite3_ex
13470 65 63 28 70 2d 3e 64 62 52 62 75 2c 20 22 42 45  ec(p->dbRbu, "BE
13480 47 49 4e 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  GIN", 0, 0, 0);.
13490 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
134a0 20 49 66 20 69 74 20 68 61 73 20 6e 6f 74 20 61   If it has not a
134b0 6c 72 65 61 64 79 20 62 65 65 6e 20 63 72 65 61  lready been crea
134c0 74 65 64 2c 20 63 72 65 61 74 65 20 74 68 65 20  ted, create the 
134d0 72 62 75 5f 73 74 61 74 65 20 74 61 62 6c 65 20  rbu_state table 
134e0 2a 2f 0a 20 20 72 62 75 4d 50 72 69 6e 74 66 45  */.  rbuMPrintfE
134f0 78 65 63 28 70 2c 20 70 2d 3e 64 62 52 62 75 2c  xec(p, p->dbRbu,
13500 20 52 42 55 5f 43 52 45 41 54 45 5f 53 54 41 54   RBU_CREATE_STAT
13510 45 2c 20 70 2d 3e 7a 53 74 61 74 65 44 62 29 3b  E, p->zStateDb);
13520 0a 0a 23 69 66 20 30 0a 20 20 69 66 28 20 72 62  ..#if 0.  if( rb
13530 75 49 73 56 61 63 75 75 6d 28 70 29 20 29 7b 0a  uIsVacuum(p) ){.
13540 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
13550 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
13560 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 20 20 20    int rc2;.     
13570 20 69 6e 74 20 62 4f 6b 20 3d 20 30 3b 0a 20 20   int bOk = 0;.  
13580 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
13590 20 2a 70 43 6e 74 20 3d 20 30 3b 0a 20 20 20 20   *pCnt = 0;.    
135a0 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72    p->rc = prepar
135b0 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72  eAndCollectError
135c0 28 70 2d 3e 64 62 52 62 75 2c 20 26 70 43 6e 74  (p->dbRbu, &pCnt
135d0 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 0a 20  , &p->zErrmsg,. 
135e0 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54           "SELECT
135f0 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 73   count(*) FROM s
13600 74 61 74 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65  tat.sqlite_maste
13610 72 22 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  r".      );.    
13620 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
13630 49 54 45 5f 4f 4b 20 0a 20 20 20 20 20 20 20 26  ITE_OK .       &
13640 26 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  & sqlite3_step(p
13650 43 6e 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  Cnt)==SQLITE_ROW
13660 0a 20 20 20 20 20 20 20 26 26 20 31 3d 3d 73 71  .       && 1==sq
13670 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
13680 28 70 43 6e 74 2c 20 30 29 0a 20 20 20 20 20 20  (pCnt, 0).      
13690 29 7b 0a 20 20 20 20 20 20 20 20 62 4f 6b 20 3d  ){.        bOk =
136a0 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
136b0 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f    rc2 = sqlite3_
136c0 66 69 6e 61 6c 69 7a 65 28 70 43 6e 74 29 3b 0a  finalize(pCnt);.
136d0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
136e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 2d 3e  =SQLITE_OK ) p->
136f0 72 63 20 3d 20 72 63 32 3b 0a 0a 20 20 20 20 20  rc = rc2;..     
13700 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
13710 54 45 5f 4f 4b 20 26 26 20 62 4f 6b 3d 3d 30 20  TE_OK && bOk==0 
13720 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63  ){.        p->rc
13730 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
13740 0a 20 20 20 20 20 20 20 20 70 2d 3e 7a 45 72 72  .        p->zErr
13750 6d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  msg = sqlite3_mp
13760 72 69 6e 74 66 28 22 69 6e 76 61 6c 69 64 20 73  rintf("invalid s
13770 74 61 74 65 20 64 61 74 61 62 61 73 65 22 29 3b  tate database");
13780 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 0a 20 20  .      }.    .  
13790 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
137a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
137b0 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69      p->rc = sqli
137c0 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 52 62  te3_exec(p->dbRb
137d0 75 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20  u, "COMMIT", 0, 
137e0 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  0, 0);.      }. 
137f0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
13800 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
13810 4c 49 54 45 5f 4f 4b 20 26 26 20 72 62 75 49 73  LITE_OK && rbuIs
13820 56 61 63 75 75 6d 28 70 29 20 29 7b 0a 20 20 20  Vacuum(p) ){.   
13830 20 69 6e 74 20 62 4f 70 65 6e 20 3d 20 30 3b 0a   int bOpen = 0;.
13840 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
13850 70 2d 3e 6e 52 62 75 20 3d 20 30 3b 0a 20 20 20  p->nRbu = 0;.   
13860 20 70 2d 3e 70 52 62 75 46 64 20 3d 20 30 3b 0a   p->pRbuFd = 0;.
13870 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
13880 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 70 2d  _file_control(p-
13890 3e 64 62 52 62 75 2c 20 22 6d 61 69 6e 22 2c 20  >dbRbu, "main", 
138a0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 52 42 55  SQLITE_FCNTL_RBU
138b0 43 4e 54 2c 20 28 76 6f 69 64 2a 29 70 29 3b 0a  CNT, (void*)p);.
138c0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
138d0 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 20 70 2d  TE_NOTFOUND ) p-
138e0 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 69 66  >rc = rc;.    if
138f0 28 20 70 2d 3e 65 53 74 61 67 65 3e 3d 52 42 55  ( p->eStage>=RBU
13900 5f 53 54 41 47 45 5f 4d 4f 56 45 20 29 7b 0a 20  _STAGE_MOVE ){. 
13910 20 20 20 20 20 62 4f 70 65 6e 20 3d 20 31 3b 0a       bOpen = 1;.
13920 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13930 20 52 62 75 53 74 61 74 65 20 2a 70 53 74 61 74   RbuState *pStat
13940 65 20 3d 20 72 62 75 4c 6f 61 64 53 74 61 74 65  e = rbuLoadState
13950 28 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  (p);.      if( p
13960 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20  State ){.       
13970 20 62 4f 70 65 6e 20 3d 20 28 70 53 74 61 74 65   bOpen = (pState
13980 2d 3e 65 53 74 61 67 65 3e 3d 52 42 55 5f 53 54  ->eStage>=RBU_ST
13990 41 47 45 5f 4d 4f 56 45 29 3b 0a 20 20 20 20 20  AGE_MOVE);.     
139a0 20 20 20 72 62 75 46 72 65 65 53 74 61 74 65 28     rbuFreeState(
139b0 70 53 74 61 74 65 29 3b 0a 20 20 20 20 20 20 7d  pState);.      }
139c0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 62  .    }.    if( b
139d0 4f 70 65 6e 20 29 20 70 2d 3e 64 62 4d 61 69 6e  Open ) p->dbMain
139e0 20 3d 20 72 62 75 4f 70 65 6e 44 62 68 61 6e 64   = rbuOpenDbhand
139f0 6c 65 28 70 2c 20 70 2d 3e 7a 52 62 75 2c 20 70  le(p, p->zRbu, p
13a00 2d 3e 6e 52 62 75 3c 3d 31 29 3b 0a 20 20 7d 0a  ->nRbu<=1);.  }.
13a10 0a 20 20 70 2d 3e 65 53 74 61 67 65 20 3d 20 30  .  p->eStage = 0
13a20 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ;.  if( p->rc==S
13a30 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 64  QLITE_OK && p->d
13a40 62 4d 61 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  bMain==0 ){.    
13a50 69 66 28 20 21 72 62 75 49 73 56 61 63 75 75 6d  if( !rbuIsVacuum
13a60 28 70 29 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  (p) ){.      p->
13a70 64 62 4d 61 69 6e 20 3d 20 72 62 75 4f 70 65 6e  dbMain = rbuOpen
13a80 44 62 68 61 6e 64 6c 65 28 70 2c 20 70 2d 3e 7a  Dbhandle(p, p->z
13a90 54 61 72 67 65 74 2c 20 31 29 3b 0a 20 20 20 20  Target, 1);.    
13aa0 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 70 52 62  }else if( p->pRb
13ab0 75 46 64 2d 3e 70 57 61 6c 46 64 20 29 7b 0a 20  uFd->pWalFd ){. 
13ac0 20 20 20 20 20 69 66 28 20 70 62 52 65 74 72 79       if( pbRetry
13ad0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70   ){.        p->p
13ae0 52 62 75 46 64 2d 3e 62 4e 6f 6c 6f 63 6b 20 3d  RbuFd->bNolock =
13af0 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   0;.        sqli
13b00 74 65 33 5f 63 6c 6f 73 65 28 70 2d 3e 64 62 52  te3_close(p->dbR
13b10 62 75 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  bu);.        sql
13b20 69 74 65 33 5f 63 6c 6f 73 65 28 70 2d 3e 64 62  ite3_close(p->db
13b30 4d 61 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 70  Main);.        p
13b40 2d 3e 64 62 4d 61 69 6e 20 3d 20 30 3b 0a 20 20  ->dbMain = 0;.  
13b50 20 20 20 20 20 20 70 2d 3e 64 62 52 62 75 20 3d        p->dbRbu =
13b60 20 30 3b 0a 20 20 20 20 20 20 20 20 2a 70 62 52   0;.        *pbR
13b70 65 74 72 79 20 3d 20 31 3b 0a 20 20 20 20 20 20  etry = 1;.      
13b80 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
13b90 7d 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20  }.      p->rc = 
13ba0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
13bb0 20 20 20 20 70 2d 3e 7a 45 72 72 6d 73 67 20 3d      p->zErrmsg =
13bc0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
13bd0 28 22 63 61 6e 6e 6f 74 20 76 61 63 75 75 6d 20  ("cannot vacuum 
13be0 77 61 6c 20 6d 6f 64 65 20 64 61 74 61 62 61 73  wal mode databas
13bf0 65 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  e");.    }else{.
13c00 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61 72        char *zTar
13c10 67 65 74 3b 0a 20 20 20 20 20 20 63 68 61 72 20  get;.      char 
13c20 2a 7a 45 78 74 72 61 20 3d 20 30 3b 0a 20 20 20  *zExtra = 0;.   
13c30 20 20 20 69 66 28 20 73 74 72 6c 65 6e 28 70 2d     if( strlen(p-
13c40 3e 7a 52 62 75 29 3e 3d 35 20 26 26 20 30 3d 3d  >zRbu)>=5 && 0==
13c50 6d 65 6d 63 6d 70 28 22 66 69 6c 65 3a 22 2c 20  memcmp("file:", 
13c60 70 2d 3e 7a 52 62 75 2c 20 35 29 20 29 7b 0a 20  p->zRbu, 5) ){. 
13c70 20 20 20 20 20 20 20 7a 45 78 74 72 61 20 3d 20         zExtra = 
13c80 26 70 2d 3e 7a 52 62 75 5b 35 5d 3b 0a 20 20 20  &p->zRbu[5];.   
13c90 20 20 20 20 20 77 68 69 6c 65 28 20 2a 7a 45 78       while( *zEx
13ca0 74 72 61 20 29 7b 0a 20 20 20 20 20 20 20 20 20  tra ){.         
13cb0 20 69 66 28 20 2a 7a 45 78 74 72 61 2b 2b 3d 3d   if( *zExtra++==
13cc0 27 3f 27 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  '?' ) break;.   
13cd0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
13ce0 66 28 20 2a 7a 45 78 74 72 61 3d 3d 27 5c 30 27  f( *zExtra=='\0'
13cf0 20 29 20 7a 45 78 74 72 61 20 3d 20 30 3b 0a 20   ) zExtra = 0;. 
13d00 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 7a 54       }..      zT
13d10 61 72 67 65 74 20 3d 20 73 71 6c 69 74 65 33 5f  arget = sqlite3_
13d20 6d 70 72 69 6e 74 66 28 22 66 69 6c 65 3a 25 73  mprintf("file:%s
13d30 2d 76 61 63 75 75 6d 3f 72 62 75 5f 6d 65 6d 6f  -vacuum?rbu_memo
13d40 72 79 3d 31 25 73 25 73 22 2c 20 0a 20 20 20 20  ry=1%s%s", .    
13d50 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62        sqlite3_db
13d60 5f 66 69 6c 65 6e 61 6d 65 28 70 2d 3e 64 62 52  _filename(p->dbR
13d70 62 75 2c 20 22 6d 61 69 6e 22 29 2c 0a 20 20 20  bu, "main"),.   
13d80 20 20 20 20 20 20 20 28 7a 45 78 74 72 61 3d 3d         (zExtra==
13d90 30 20 3f 20 22 22 20 3a 20 22 26 22 29 2c 20 28  0 ? "" : "&"), (
13da0 7a 45 78 74 72 61 3d 3d 30 20 3f 20 22 22 20 3a  zExtra==0 ? "" :
13db0 20 7a 45 78 74 72 61 29 0a 20 20 20 20 20 20 29   zExtra).      )
13dc0 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 7a 54 61  ;..      if( zTa
13dd0 72 67 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  rget==0 ){.     
13de0 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
13df0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
13e00 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
13e10 0a 20 20 20 20 20 20 70 2d 3e 64 62 4d 61 69 6e  .      p->dbMain
13e20 20 3d 20 72 62 75 4f 70 65 6e 44 62 68 61 6e 64   = rbuOpenDbhand
13e30 6c 65 28 70 2c 20 7a 54 61 72 67 65 74 2c 20 70  le(p, zTarget, p
13e40 2d 3e 6e 52 62 75 3c 3d 31 29 3b 0a 20 20 20 20  ->nRbu<=1);.    
13e50 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
13e60 54 61 72 67 65 74 29 3b 0a 20 20 20 20 7d 0a 20  Target);.    }. 
13e70 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d   }..  if( p->rc=
13e80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
13e90 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65    p->rc = sqlite
13ea0 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
13eb0 6e 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 0a 20 20  n(p->dbMain, .  
13ec0 20 20 20 20 20 20 22 72 62 75 5f 74 6d 70 5f 69        "rbu_tmp_i
13ed0 6e 73 65 72 74 22 2c 20 2d 31 2c 20 53 51 4c 49  nsert", -1, SQLI
13ee0 54 45 5f 55 54 46 38 2c 20 28 76 6f 69 64 2a 29  TE_UTF8, (void*)
13ef0 70 2c 20 72 62 75 54 6d 70 49 6e 73 65 72 74 46  p, rbuTmpInsertF
13f00 75 6e 63 2c 20 30 2c 20 30 0a 20 20 20 20 29 3b  unc, 0, 0.    );
13f10 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72  .  }..  if( p->r
13f20 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
13f30 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69      p->rc = sqli
13f40 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
13f50 69 6f 6e 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 0a  ion(p->dbMain, .
13f60 20 20 20 20 20 20 20 20 22 72 62 75 5f 66 6f 73          "rbu_fos
13f70 73 69 6c 5f 64 65 6c 74 61 22 2c 20 32 2c 20 53  sil_delta", 2, S
13f80 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 72  QLITE_UTF8, 0, r
13f90 62 75 46 6f 73 73 69 6c 44 65 6c 74 61 46 75 6e  buFossilDeltaFun
13fa0 63 2c 20 30 2c 20 30 0a 20 20 20 20 29 3b 0a 20  c, 0, 0.    );. 
13fb0 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d   }..  if( p->rc=
13fc0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
13fd0 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65    p->rc = sqlite
13fe0 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
13ff0 6e 28 70 2d 3e 64 62 52 62 75 2c 20 0a 20 20 20  n(p->dbRbu, .   
14000 20 20 20 20 20 22 72 62 75 5f 74 61 72 67 65 74       "rbu_target
14010 5f 6e 61 6d 65 22 2c 20 2d 31 2c 20 53 51 4c 49  _name", -1, SQLI
14020 54 45 5f 55 54 46 38 2c 20 28 76 6f 69 64 2a 29  TE_UTF8, (void*)
14030 70 2c 20 72 62 75 54 61 72 67 65 74 4e 61 6d 65  p, rbuTargetName
14040 46 75 6e 63 2c 20 30 2c 20 30 0a 20 20 20 20 29  Func, 0, 0.    )
14050 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e  ;.  }..  if( p->
14060 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
14070 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c  .    p->rc = sql
14080 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
14090 6c 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 6d 61  l(p->dbMain, "ma
140a0 69 6e 22 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54  in", SQLITE_FCNT
140b0 4c 5f 52 42 55 2c 20 28 76 6f 69 64 2a 29 70 29  L_RBU, (void*)p)
140c0 3b 0a 20 20 7d 0a 20 20 72 62 75 4d 50 72 69 6e  ;.  }.  rbuMPrin
140d0 74 66 45 78 65 63 28 70 2c 20 70 2d 3e 64 62 4d  tfExec(p, p->dbM
140e0 61 69 6e 2c 20 22 53 45 4c 45 43 54 20 2a 20 46  ain, "SELECT * F
140f0 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
14100 72 22 29 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20  r");..  /* Mark 
14110 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
14120 65 20 6a 75 73 74 20 6f 70 65 6e 65 64 20 61 73  e just opened as
14130 20 61 6e 20 52 42 55 20 74 61 72 67 65 74 20 64   an RBU target d
14140 61 74 61 62 61 73 65 2e 20 49 66 20 0a 20 20 2a  atabase. If .  *
14150 2a 20 74 68 69 73 20 63 61 6c 6c 20 72 65 74 75  * this call retu
14160 72 6e 73 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f  rns SQLITE_NOTFO
14170 55 4e 44 2c 20 74 68 65 6e 20 74 68 65 20 52 42  UND, then the RB
14180 55 20 76 66 73 20 69 73 20 6e 6f 74 20 69 6e 20  U vfs is not in 
14190 75 73 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20 69  use..  ** This i
141a0 73 20 61 6e 20 65 72 72 6f 72 2e 20 20 2a 2f 0a  s an error.  */.
141b0 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
141c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d  ITE_OK ){.    p-
141d0 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69  >rc = sqlite3_fi
141e0 6c 65 5f 63 6f 6e 74 72 6f 6c 28 70 2d 3e 64 62  le_control(p->db
141f0 4d 61 69 6e 2c 20 22 6d 61 69 6e 22 2c 20 53 51  Main, "main", SQ
14200 4c 49 54 45 5f 46 43 4e 54 4c 5f 52 42 55 2c 20  LITE_FCNTL_RBU, 
14210 28 76 6f 69 64 2a 29 70 29 3b 0a 20 20 7d 0a 0a  (void*)p);.  }..
14220 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
14230 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 7b 0a  ITE_NOTFOUND ){.
14240 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
14250 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 70 2d  TE_ERROR;.    p-
14260 3e 7a 45 72 72 6d 73 67 20 3d 20 73 71 6c 69 74  >zErrmsg = sqlit
14270 65 33 5f 6d 70 72 69 6e 74 66 28 22 72 62 75 20  e3_mprintf("rbu 
14280 76 66 73 20 6e 6f 74 20 66 6f 75 6e 64 22 29 3b  vfs not found");
14290 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
142a0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
142b0 63 6f 70 79 20 6f 66 20 74 68 65 20 73 71 6c 69  copy of the sqli
142c0 74 65 33 46 69 6c 65 53 75 66 66 69 78 33 28 29  te3FileSuffix3()
142d0 20 72 6f 75 74 69 6e 65 20 66 72 6f 6d 20 74 68   routine from th
142e0 65 20 63 6f 72 65 2e 0a 2a 2a 20 49 74 20 69 73  e core..** It is
142f0 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73 20   a no-op unless 
14300 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 38 5f  SQLITE_ENABLE_8_
14310 33 5f 4e 41 4d 45 53 20 69 73 20 64 65 66 69 6e  3_NAMES is defin
14320 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c  ed..**.** If SQL
14330 49 54 45 5f 45 4e 41 42 4c 45 5f 38 5f 33 5f 4e  ITE_ENABLE_8_3_N
14340 41 4d 45 53 20 69 73 20 73 65 74 20 61 74 20 63  AMES is set at c
14350 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 61 6e 64 20  ompile-time and 
14360 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  if the database.
14370 2a 2a 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 7a  ** filename in z
14380 42 61 73 65 46 69 6c 65 6e 61 6d 65 20 69 73 20  BaseFilename is 
14390 61 20 55 52 49 20 77 69 74 68 20 74 68 65 20 22  a URI with the "
143a0 38 5f 33 5f 6e 61 6d 65 73 3d 31 22 20 70 61 72  8_3_names=1" par
143b0 61 6d 65 74 65 72 20 61 6e 64 0a 2a 2a 20 69 66  ameter and.** if
143c0 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 7a 5b 5d   filename in z[]
143d0 20 68 61 73 20 61 20 73 75 66 66 69 78 20 28 61   has a suffix (a
143e0 2e 6b 2e 61 2e 20 22 65 78 74 65 6e 73 69 6f 6e  .k.a. "extension
143f0 22 29 20 74 68 61 74 20 69 73 20 6c 6f 6e 67 65  ") that is longe
14400 72 20 74 68 61 6e 0a 2a 2a 20 74 68 72 65 65 20  r than.** three 
14410 63 68 61 72 61 63 74 65 72 73 2c 20 74 68 65 6e  characters, then
14420 20 73 68 6f 72 74 65 6e 20 74 68 65 20 73 75 66   shorten the suf
14430 66 69 78 20 6f 6e 20 7a 5b 5d 20 74 6f 20 62 65  fix on z[] to be
14440 20 74 68 65 20 6c 61 73 74 20 74 68 72 65 65 0a   the last three.
14450 2a 2a 20 63 68 61 72 61 63 74 65 72 73 20 6f 66  ** characters of
14460 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 73 75   the original su
14470 66 66 69 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53  ffix..**.** If S
14480 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 38 5f 33  QLITE_ENABLE_8_3
14490 5f 4e 41 4d 45 53 20 69 73 20 73 65 74 20 74 6f  _NAMES is set to
144a0 20 32 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69   2 at compile-ti
144b0 6d 65 2c 20 74 68 65 6e 20 61 6c 77 61 79 73 0a  me, then always.
144c0 2a 2a 20 64 6f 20 74 68 65 20 73 75 66 66 69 78  ** do the suffix
144d0 20 73 68 6f 72 74 65 6e 69 6e 67 20 72 65 67 61   shortening rega
144e0 72 64 6c 65 73 73 20 6f 66 20 55 52 49 20 70 61  rdless of URI pa
144f0 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 45  rameter..**.** E
14500 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  xamples:.**.**  
14510 20 20 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e     test.db-journ
14520 61 6c 20 20 20 20 3d 3e 20 20 20 74 65 73 74 2e  al    =>   test.
14530 6e 61 6c 0a 2a 2a 20 20 20 20 20 74 65 73 74 2e  nal.**     test.
14540 64 62 2d 77 61 6c 20 20 20 20 20 20 20 20 3d 3e  db-wal        =>
14550 20 20 20 74 65 73 74 2e 77 61 6c 0a 2a 2a 20 20     test.wal.**  
14560 20 20 20 74 65 73 74 2e 64 62 2d 73 68 6d 20 20     test.db-shm  
14570 20 20 20 20 20 20 3d 3e 20 20 20 74 65 73 74 2e        =>   test.
14580 73 68 6d 0a 2a 2a 20 20 20 20 20 74 65 73 74 2e  shm.**     test.
14590 64 62 2d 6d 6a 37 66 33 33 31 39 66 61 20 3d 3e  db-mj7f3319fa =>
145a0 20 20 20 74 65 73 74 2e 39 66 61 0a 2a 2f 0a 73     test.9fa.*/.s
145b0 74 61 74 69 63 20 76 6f 69 64 20 72 62 75 46 69  tatic void rbuFi
145c0 6c 65 53 75 66 66 69 78 33 28 63 6f 6e 73 74 20  leSuffix3(const 
145d0 63 68 61 72 20 2a 7a 42 61 73 65 2c 20 63 68 61  char *zBase, cha
145e0 72 20 2a 7a 29 7b 0a 23 69 66 64 65 66 20 53 51  r *z){.#ifdef SQ
145f0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 38 5f 33 5f  LITE_ENABLE_8_3_
14600 4e 41 4d 45 53 0a 23 69 66 20 53 51 4c 49 54 45  NAMES.#if SQLITE
14610 5f 45 4e 41 42 4c 45 5f 38 5f 33 5f 4e 41 4d 45  _ENABLE_8_3_NAME
14620 53 3c 32 0a 20 20 69 66 28 20 73 71 6c 69 74 65  S<2.  if( sqlite
14630 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 7a 42  3_uri_boolean(zB
14640 61 73 65 2c 20 22 38 5f 33 5f 6e 61 6d 65 73 22  ase, "8_3_names"
14650 2c 20 30 29 20 29 0a 23 65 6e 64 69 66 0a 20 20  , 0) ).#endif.  
14660 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 73 7a 3b  {.    int i, sz;
14670 0a 20 20 20 20 73 7a 20 3d 20 28 69 6e 74 29 73  .    sz = (int)s
14680 74 72 6c 65 6e 28 7a 29 26 30 78 66 66 66 66 66  trlen(z)&0xfffff
14690 66 3b 0a 20 20 20 20 66 6f 72 28 69 3d 73 7a 2d  f;.    for(i=sz-
146a0 31 3b 20 69 3e 30 20 26 26 20 7a 5b 69 5d 21 3d  1; i>0 && z[i]!=
146b0 27 2f 27 20 26 26 20 7a 5b 69 5d 21 3d 27 2e 27  '/' && z[i]!='.'
146c0 3b 20 69 2d 2d 29 7b 7d 0a 20 20 20 20 69 66 28  ; i--){}.    if(
146d0 20 7a 5b 69 5d 3d 3d 27 2e 27 20 26 26 20 73 7a   z[i]=='.' && sz
146e0 3e 69 2b 34 20 29 20 6d 65 6d 6d 6f 76 65 28 26  >i+4 ) memmove(&
146f0 7a 5b 69 2b 31 5d 2c 20 26 7a 5b 73 7a 2d 33 5d  z[i+1], &z[sz-3]
14700 2c 20 34 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  , 4);.  }.#endif
14710 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
14720 20 74 68 65 20 63 75 72 72 65 6e 74 20 77 61 6c   the current wal
14730 2d 69 6e 64 65 78 20 68 65 61 64 65 72 20 63 68  -index header ch
14740 65 63 6b 73 75 6d 20 66 6f 72 20 74 68 65 20 74  ecksum for the t
14750 61 72 67 65 74 20 64 61 74 61 62 61 73 65 20 0a  arget database .
14760 2a 2a 20 61 73 20 61 20 36 34 2d 62 69 74 20 69  ** as a 64-bit i
14770 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  nteger..**.** Th
14780 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20 73 74  e checksum is st
14790 6f 72 65 20 69 6e 20 74 68 65 20 66 69 72 73 74  ore in the first
147a0 20 70 61 67 65 20 6f 66 20 78 53 68 6d 4d 61 70   page of xShmMap
147b0 20 6d 65 6d 6f 72 79 20 61 73 20 61 6e 20 38 2d   memory as an 8-
147c0 62 79 74 65 20 0a 2a 2a 20 62 6c 6f 62 20 73 74  byte .** blob st
147d0 61 72 74 69 6e 67 20 61 74 20 62 79 74 65 20 6f  arting at byte o
147e0 66 66 73 65 74 20 34 30 2e 0a 2a 2f 0a 73 74 61  ffset 40..*/.sta
147f0 74 69 63 20 69 36 34 20 72 62 75 53 68 6d 43 68  tic i64 rbuShmCh
14800 65 63 6b 73 75 6d 28 73 71 6c 69 74 65 33 72 62  ecksum(sqlite3rb
14810 75 20 2a 70 29 7b 0a 20 20 69 36 34 20 69 52 65  u *p){.  i64 iRe
14820 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e  t = 0;.  if( p->
14830 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
14840 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  .    sqlite3_fil
14850 65 20 2a 70 44 62 20 3d 20 70 2d 3e 70 54 61 72  e *pDb = p->pTar
14860 67 65 74 46 64 2d 3e 70 52 65 61 6c 3b 0a 20 20  getFd->pReal;.  
14870 20 20 75 33 32 20 76 6f 6c 61 74 69 6c 65 20 2a    u32 volatile *
14880 70 74 72 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  ptr;.    p->rc =
14890 20 70 44 62 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e   pDb->pMethods->
148a0 78 53 68 6d 4d 61 70 28 70 44 62 2c 20 30 2c 20  xShmMap(pDb, 0, 
148b0 33 32 2a 31 30 32 34 2c 20 30 2c 20 28 76 6f 69  32*1024, 0, (voi
148c0 64 20 76 6f 6c 61 74 69 6c 65 2a 2a 29 26 70 74  d volatile**)&pt
148d0 72 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72  r);.    if( p->r
148e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
148f0 20 20 20 20 20 20 69 52 65 74 20 3d 20 28 28 69        iRet = ((i
14900 36 34 29 70 74 72 5b 31 30 5d 20 3c 3c 20 33 32  64)ptr[10] << 32
14910 29 20 2b 20 70 74 72 5b 31 31 5d 3b 0a 20 20 20  ) + ptr[11];.   
14920 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
14930 69 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  iRet;.}../*.** T
14940 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
14950 63 61 6c 6c 65 64 20 61 73 20 70 61 72 74 20 6f  called as part o
14960 66 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 6f  f initializing o
14970 72 20 72 65 69 6e 69 74 69 61 6c 69 7a 69 6e 67  r reinitializing
14980 20 61 6e 0a 2a 2a 20 69 6e 63 72 65 6d 65 6e 74   an.** increment
14990 61 6c 20 63 68 65 63 6b 70 6f 69 6e 74 2e 20 0a  al checkpoint. .
149a0 2a 2a 0a 2a 2a 20 49 74 20 70 6f 70 75 6c 61 74  **.** It populat
149b0 65 73 20 74 68 65 20 73 71 6c 69 74 65 33 72 62  es the sqlite3rb
149c0 75 2e 61 46 72 61 6d 65 5b 5d 20 61 72 72 61 79  u.aFrame[] array
149d0 20 77 69 74 68 20 74 68 65 20 73 65 74 20 6f 66   with the set of
149e0 20 0a 2a 2a 20 28 77 61 6c 20 66 72 61 6d 65 20   .** (wal frame 
149f0 2d 3e 20 64 62 20 70 61 67 65 29 20 63 6f 70 79  -> db page) copy
14a00 20 6f 70 65 72 61 74 69 6f 6e 73 20 72 65 71 75   operations requ
14a10 69 72 65 64 20 74 6f 20 63 68 65 63 6b 70 6f 69  ired to checkpoi
14a20 6e 74 20 74 68 65 20 0a 2a 2a 20 63 75 72 72 65  nt the .** curre
14a30 6e 74 20 77 61 6c 20 66 69 6c 65 2c 20 61 6e 64  nt wal file, and
14a40 20 6f 62 74 61 69 6e 73 20 74 68 65 20 73 65 74   obtains the set
14a50 20 6f 66 20 73 68 6d 20 6c 6f 63 6b 73 20 72 65   of shm locks re
14a60 71 75 69 72 65 64 20 74 6f 20 73 61 66 65 6c 79  quired to safely
14a70 20 0a 2a 2a 20 70 65 72 66 6f 72 6d 20 74 68 65   .** perform the
14a80 20 63 6f 70 79 20 6f 70 65 72 61 74 69 6f 6e 73   copy operations
14a90 20 64 69 72 65 63 74 6c 79 20 6f 6e 20 74 68 65   directly on the
14aa0 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 0a 2a 2a   file-system..**
14ab0 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20  .** If argument 
14ac0 70 53 74 61 74 65 20 69 73 20 6e 6f 74 20 4e 55  pState is not NU
14ad0 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 69 6e 63  LL, then the inc
14ae0 72 65 6d 65 6e 74 61 6c 20 63 68 65 63 6b 70 6f  remental checkpo
14af0 69 6e 74 20 69 73 0a 2a 2a 20 62 65 69 6e 67 20  int is.** being 
14b00 72 65 73 75 6d 65 64 2e 20 49 6e 20 74 68 69 73  resumed. In this
14b10 20 63 61 73 65 2c 20 69 66 20 74 68 65 20 63 68   case, if the ch
14b20 65 63 6b 73 75 6d 20 6f 66 20 74 68 65 20 77 61  ecksum of the wa
14b30 6c 2d 69 6e 64 65 78 2d 68 65 61 64 65 72 0a 2a  l-index-header.*
14b40 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65 63 6f  * following reco
14b50 76 65 72 79 20 69 73 20 6e 6f 74 20 74 68 65 20  very is not the 
14b60 73 61 6d 65 20 61 73 20 74 68 65 20 63 68 65 63  same as the chec
14b70 6b 73 75 6d 20 73 61 76 65 64 20 69 6e 20 74 68  ksum saved in th
14b80 65 20 52 62 75 53 74 61 74 65 0a 2a 2a 20 6f 62  e RbuState.** ob
14b90 6a 65 63 74 2c 20 74 68 65 6e 20 74 68 65 20 72  ject, then the r
14ba0 62 75 20 68 61 6e 64 6c 65 20 69 73 20 73 65 74  bu handle is set
14bb0 20 74 6f 20 44 4f 4e 45 20 73 74 61 74 65 2e 20   to DONE state. 
14bc0 54 68 69 73 20 6f 63 63 75 72 73 20 69 66 20 73  This occurs if s
14bd0 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20 63 6c 69  ome.** other cli
14be0 65 6e 74 20 61 70 70 65 6e 64 73 20 61 20 74 72  ent appends a tr
14bf0 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20 74 68 65  ansaction to the
14c00 20 77 61 6c 20 66 69 6c 65 20 69 6e 20 74 68 65   wal file in the
14c10 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 61 6e   middle of.** an
14c20 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 63 68 65   incremental che
14c30 63 6b 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74  ckpoint..*/.stat
14c40 69 63 20 76 6f 69 64 20 72 62 75 53 65 74 75 70  ic void rbuSetup
14c50 43 68 65 63 6b 70 6f 69 6e 74 28 73 71 6c 69 74  Checkpoint(sqlit
14c60 65 33 72 62 75 20 2a 70 2c 20 52 62 75 53 74 61  e3rbu *p, RbuSta
14c70 74 65 20 2a 70 53 74 61 74 65 29 7b 0a 0a 20 20  te *pState){..  
14c80 2f 2a 20 49 66 20 70 53 74 61 74 65 20 69 73 20  /* If pState is 
14c90 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 77  NULL, then the w
14ca0 61 6c 20 66 69 6c 65 20 6d 61 79 20 6e 6f 74 20  al file may not 
14cb0 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64  have been opened
14cc0 20 61 6e 64 0a 20 20 2a 2a 20 72 65 63 6f 76 65   and.  ** recove
14cd0 72 65 64 2e 20 52 75 6e 6e 69 6e 67 20 61 20 72  red. Running a r
14ce0 65 61 64 2d 73 74 61 74 65 6d 65 6e 74 20 68 65  ead-statement he
14cf0 72 65 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61  re to ensure tha
14d00 74 20 64 6f 69 6e 67 20 73 6f 0a 20 20 2a 2a 20  t doing so.  ** 
14d10 64 6f 65 73 20 6e 6f 74 20 69 6e 74 65 72 66 65  does not interfe
14d20 72 65 20 77 69 74 68 20 74 68 65 20 22 63 61 70  re with the "cap
14d30 74 75 72 65 22 20 70 72 6f 63 65 73 73 20 62 65  ture" process be
14d40 6c 6f 77 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70  low.  */.  if( p
14d50 53 74 61 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20  State==0 ){.    
14d60 70 2d 3e 65 53 74 61 67 65 20 3d 20 30 3b 0a 20  p->eStage = 0;. 
14d70 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
14d80 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
14d90 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33   p->rc = sqlite3
14da0 5f 65 78 65 63 28 70 2d 3e 64 62 4d 61 69 6e 2c  _exec(p->dbMain,
14db0 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   "SELECT * FROM 
14dc0 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 2c 20  sqlite_master", 
14dd0 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  0, 0, 0);.    }.
14de0 20 20 7d 0a 0a 20 20 2f 2a 20 41 73 73 75 6d 69    }..  /* Assumi
14df0 6e 67 20 6e 6f 20 65 72 72 6f 72 20 68 61 73 20  ng no error has 
14e00 6f 63 63 75 72 72 65 64 2c 20 72 75 6e 20 61 20  occurred, run a 
14e10 22 72 65 73 74 61 72 74 22 20 63 68 65 63 6b 70  "restart" checkp
14e20 6f 69 6e 74 20 77 69 74 68 20 74 68 65 0a 20 20  oint with the.  
14e30 2a 2a 20 73 71 6c 69 74 65 33 72 62 75 2e 65 53  ** sqlite3rbu.eS
14e40 74 61 67 65 20 76 61 72 69 61 62 6c 65 20 73 65  tage variable se
14e50 74 20 74 6f 20 43 41 50 54 55 52 45 2e 20 54 68  t to CAPTURE. Th
14e60 69 73 20 74 75 72 6e 73 20 6f 6e 20 74 68 65 20  is turns on the 
14e70 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 73  following.  ** s
14e80 70 65 63 69 61 6c 20 62 65 68 61 76 69 6f 75 72  pecial behaviour
14e90 20 69 6e 20 74 68 65 20 72 62 75 20 56 46 53 3a   in the rbu VFS:
14ea0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 49  .  **.  **   * I
14eb0 66 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20  f the exclusive 
14ec0 73 68 6d 20 57 52 49 54 45 52 20 6f 72 20 52 45  shm WRITER or RE
14ed0 41 44 30 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20  AD0 lock cannot 
14ee0 62 65 20 6f 62 74 61 69 6e 65 64 2c 0a 20 20 2a  be obtained,.  *
14ef0 2a 20 20 20 20 20 74 68 65 20 63 68 65 63 6b 70  *     the checkp
14f00 6f 69 6e 74 20 66 61 69 6c 73 20 77 69 74 68 20  oint fails with 
14f10 53 51 4c 49 54 45 5f 42 55 53 59 20 28 6e 6f 72  SQLITE_BUSY (nor
14f20 6d 61 6c 6c 79 20 53 51 4c 69 74 65 20 77 6f 75  mally SQLite wou
14f30 6c 64 0a 20 20 2a 2a 20 20 20 20 20 70 72 6f 63  ld.  **     proc
14f40 65 65 64 20 77 69 74 68 20 72 75 6e 6e 69 6e 67  eed with running
14f50 20 61 20 70 61 73 73 69 76 65 20 63 68 65 63 6b   a passive check
14f60 70 6f 69 6e 74 20 69 6e 73 74 65 61 64 20 6f 66  point instead of
14f70 20 66 61 69 6c 69 6e 67 29 2e 0a 20 20 2a 2a 0a   failing)..  **.
14f80 20 20 2a 2a 20 20 20 2a 20 41 74 74 65 6d 70 74    **   * Attempt
14f90 73 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 74  s to read from t
14fa0 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 6f 72  he *-wal file or
14fb0 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 64 61   write to the da
14fc0 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20 2a 2a  tabase file.  **
14fd0 20 20 20 20 20 64 6f 20 6e 6f 74 20 70 65 72 66       do not perf
14fe0 6f 72 6d 20 61 6e 79 20 49 4f 2e 20 49 6e 73 74  orm any IO. Inst
14ff0 65 61 64 2c 20 74 68 65 20 66 72 61 6d 65 2f 70  ead, the frame/p
15000 61 67 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73  age combinations
15010 20 74 68 61 74 0a 20 20 2a 2a 20 20 20 20 20 77   that.  **     w
15020 6f 75 6c 64 20 62 65 20 72 65 61 64 2f 77 72 69  ould be read/wri
15030 74 74 65 6e 20 61 72 65 20 72 65 63 6f 72 64 65  tten are recorde
15040 64 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 33  d in the sqlite3
15050 72 62 75 2e 61 46 72 61 6d 65 5b 5d 0a 20 20 2a  rbu.aFrame[].  *
15060 2a 20 20 20 20 20 61 72 72 61 79 2e 0a 20 20 2a  *     array..  *
15070 2a 0a 20 20 2a 2a 20 20 20 2a 20 43 61 6c 6c 73  *.  **   * Calls
15080 20 74 6f 20 78 53 68 6d 4c 6f 63 6b 28 55 4e 4c   to xShmLock(UNL
15090 4f 43 4b 29 20 74 6f 20 72 65 6c 65 61 73 65 20  OCK) to release 
150a0 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 73 68  the exclusive sh
150b0 6d 20 57 52 49 54 45 52 2c 20 0a 20 20 2a 2a 20  m WRITER, .  ** 
150c0 20 20 20 20 52 45 41 44 30 20 61 6e 64 20 43 48      READ0 and CH
150d0 45 43 4b 50 4f 49 4e 54 20 6c 6f 63 6b 73 20 74  ECKPOINT locks t
150e0 61 6b 65 6e 20 61 73 20 70 61 72 74 20 6f 66 20  aken as part of 
150f0 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 61  the checkpoint a
15100 72 65 0a 20 20 2a 2a 20 20 20 20 20 6e 6f 2d 6f  re.  **     no-o
15110 70 73 2e 20 54 68 65 73 65 20 6c 6f 63 6b 73 20  ps. These locks 
15120 77 69 6c 6c 20 6e 6f 74 20 62 65 20 72 65 6c 65  will not be rele
15130 61 73 65 64 20 75 6e 74 69 6c 20 74 68 65 20 63  ased until the c
15140 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 2a 2a 20 20  onnection.  **  
15150 20 20 20 69 73 20 63 6c 6f 73 65 64 2e 0a 20 20     is closed..  
15160 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 41 74 74 65  **.  **   * Atte
15170 6d 70 74 69 6e 67 20 74 6f 20 78 53 79 6e 63 28  mpting to xSync(
15180 29 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  ) the database f
15190 69 6c 65 20 63 61 75 73 65 73 20 61 6e 20 53 51  ile causes an SQ
151a0 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c 20 0a 20  LITE_INTERNAL . 
151b0 20 2a 2a 20 20 20 20 20 65 72 72 6f 72 2e 0a 20   **     error.. 
151c0 20 2a 2a 0a 20 20 2a 2a 20 41 73 20 61 20 72 65   **.  ** As a re
151d0 73 75 6c 74 2c 20 75 6e 6c 65 73 73 20 61 6e 20  sult, unless an 
151e0 65 72 72 6f 72 20 28 69 2e 65 2e 20 4f 4f 4d 20  error (i.e. OOM 
151f0 6f 72 20 53 51 4c 49 54 45 5f 42 55 53 59 29 20  or SQLITE_BUSY) 
15200 6f 63 63 75 72 73 2c 20 74 68 65 0a 20 20 2a 2a  occurs, the.  **
15210 20 63 68 65 63 6b 70 6f 69 6e 74 20 62 65 6c 6f   checkpoint belo
15220 77 20 66 61 69 6c 73 20 77 69 74 68 20 53 51 4c  w fails with SQL
15230 49 54 45 5f 49 4e 54 45 52 4e 41 4c 2c 20 61 6e  ITE_INTERNAL, an
15240 64 20 6c 65 61 76 65 73 20 74 68 65 20 61 46 72  d leaves the aFr
15250 61 6d 65 5b 5d 0a 20 20 2a 2a 20 61 72 72 61 79  ame[].  ** array
15260 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
15270 61 20 73 65 74 20 6f 66 20 28 66 72 61 6d 65 20  a set of (frame 
15280 2d 3e 20 70 61 67 65 29 20 6d 61 70 70 69 6e 67  -> page) mapping
15290 73 2e 20 42 65 63 61 75 73 65 20 74 68 65 20 0a  s. Because the .
152a0 20 20 2a 2a 20 57 52 49 54 45 52 2c 20 43 48 45    ** WRITER, CHE
152b0 43 4b 50 4f 49 4e 54 20 61 6e 64 20 52 45 41 44  CKPOINT and READ
152c0 30 20 6c 6f 63 6b 73 20 61 72 65 20 73 74 69 6c  0 locks are stil
152d0 6c 20 68 65 6c 64 2c 20 69 74 20 69 73 20 73 61  l held, it is sa
152e0 66 65 20 74 6f 20 63 6f 70 79 20 0a 20 20 2a 2a  fe to copy .  **
152f0 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 77   data from the w
15300 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 74 68 65  al file into the
15310 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
15320 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20  ccording to the 
15330 0a 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f  .  ** contents o
15340 66 20 61 46 72 61 6d 65 5b 5d 2e 0a 20 20 2a 2f  f aFrame[]..  */
15350 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
15360 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
15370 6e 74 20 72 63 32 3b 0a 20 20 20 20 70 2d 3e 65  nt rc2;.    p->e
15380 53 74 61 67 65 20 3d 20 52 42 55 5f 53 54 41 47  Stage = RBU_STAG
15390 45 5f 43 41 50 54 55 52 45 3b 0a 20 20 20 20 72  E_CAPTURE;.    r
153a0 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65  c2 = sqlite3_exe
153b0 63 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 50 52  c(p->dbMain, "PR
153c0 41 47 4d 41 20 6d 61 69 6e 2e 77 61 6c 5f 63 68  AGMA main.wal_ch
153d0 65 63 6b 70 6f 69 6e 74 3d 72 65 73 74 61 72 74  eckpoint=restart
153e0 22 2c 20 30 2c 20 30 2c 30 29 3b 0a 20 20 20 20  ", 0, 0,0);.    
153f0 69 66 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f  if( rc2!=SQLITE_
15400 49 4e 54 45 52 4e 41 4c 20 29 20 70 2d 3e 72 63  INTERNAL ) p->rc
15410 20 3d 20 72 63 32 3b 0a 20 20 7d 0a 0a 20 20 69   = rc2;.  }..  i
15420 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
15430 5f 4f 4b 20 26 26 20 70 2d 3e 6e 46 72 61 6d 65  _OK && p->nFrame
15440 3e 30 20 29 7b 0a 20 20 20 20 70 2d 3e 65 53 74  >0 ){.    p->eSt
15450 61 67 65 20 3d 20 52 42 55 5f 53 54 41 47 45 5f  age = RBU_STAGE_
15460 43 4b 50 54 3b 0a 20 20 20 20 70 2d 3e 6e 53 74  CKPT;.    p->nSt
15470 65 70 20 3d 20 28 70 53 74 61 74 65 20 3f 20 70  ep = (pState ? p
15480 53 74 61 74 65 2d 3e 6e 52 6f 77 20 3a 20 30 29  State->nRow : 0)
15490 3b 0a 20 20 20 20 70 2d 3e 61 42 75 66 20 3d 20  ;.    p->aBuf = 
154a0 72 62 75 4d 61 6c 6c 6f 63 28 70 2c 20 70 2d 3e  rbuMalloc(p, p->
154b0 70 67 73 7a 29 3b 0a 20 20 20 20 70 2d 3e 69 57  pgsz);.    p->iW
154c0 61 6c 43 6b 73 75 6d 20 3d 20 72 62 75 53 68 6d  alCksum = rbuShm
154d0 43 68 65 63 6b 73 75 6d 28 70 29 3b 0a 20 20 7d  Checksum(p);.  }
154e0 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ..  if( p->rc==S
154f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
15500 69 66 28 20 70 2d 3e 6e 46 72 61 6d 65 3d 3d 30  if( p->nFrame==0
15510 20 7c 7c 20 28 70 53 74 61 74 65 20 26 26 20 70   || (pState && p
15520 53 74 61 74 65 2d 3e 69 57 61 6c 43 6b 73 75 6d  State->iWalCksum
15530 21 3d 70 2d 3e 69 57 61 6c 43 6b 73 75 6d 29 20  !=p->iWalCksum) 
15540 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  ){.      p->rc =
15550 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
15560 20 20 20 20 70 2d 3e 65 53 74 61 67 65 20 3d 20      p->eStage = 
15570 52 42 55 5f 53 54 41 47 45 5f 44 4f 4e 45 3b 0a  RBU_STAGE_DONE;.
15580 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15590 20 69 6e 74 20 6e 53 65 63 74 6f 72 53 69 7a 65   int nSectorSize
155a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
155b0 66 69 6c 65 20 2a 70 44 62 20 3d 20 70 2d 3e 70  file *pDb = p->p
155c0 54 61 72 67 65 74 46 64 2d 3e 70 52 65 61 6c 3b  TargetFd->pReal;
155d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
155e0 2d 3e 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72  ->nPagePerSector
155f0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e 53 65  ==0 );.      nSe
15600 63 74 6f 72 53 69 7a 65 20 3d 20 70 44 62 2d 3e  ctorSize = pDb->
15610 70 4d 65 74 68 6f 64 73 2d 3e 78 53 65 63 74 6f  pMethods->xSecto
15620 72 53 69 7a 65 28 70 44 62 29 3b 0a 20 20 20 20  rSize(pDb);.    
15630 20 20 69 66 28 20 6e 53 65 63 74 6f 72 53 69 7a    if( nSectorSiz
15640 65 3e 70 2d 3e 70 67 73 7a 20 29 7b 0a 20 20 20  e>p->pgsz ){.   
15650 20 20 20 20 20 70 2d 3e 6e 50 61 67 65 50 65 72       p->nPagePer
15660 53 65 63 74 6f 72 20 3d 20 6e 53 65 63 74 6f 72  Sector = nSector
15670 53 69 7a 65 20 2f 20 70 2d 3e 70 67 73 7a 3b 0a  Size / p->pgsz;.
15680 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
15690 20 20 20 20 20 70 2d 3e 6e 50 61 67 65 50 65 72       p->nPagePer
156a0 53 65 63 74 6f 72 20 3d 20 31 3b 0a 20 20 20 20  Sector = 1;.    
156b0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
156c0 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 65 64 20 77 68  ./*.** Called wh
156d0 65 6e 20 69 41 6d 74 20 62 79 74 65 73 20 61 72  en iAmt bytes ar
156e0 65 20 72 65 61 64 20 66 72 6f 6d 20 6f 66 66 73  e read from offs
156f0 65 74 20 69 4f 66 66 20 6f 66 20 74 68 65 20 77  et iOff of the w
15700 61 6c 20 66 69 6c 65 20 77 68 69 6c 65 0a 2a 2a  al file while.**
15710 20 74 68 65 20 72 62 75 20 6f 62 6a 65 63 74 20   the rbu object 
15720 69 73 20 69 6e 20 63 61 70 74 75 72 65 20 6d 6f  is in capture mo
15730 64 65 2e 20 52 65 63 6f 72 64 20 74 68 65 20 66  de. Record the f
15740 72 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  rame number of t
15750 68 65 20 66 72 61 6d 65 0a 2a 2a 20 62 65 69 6e  he frame.** bein
15760 67 20 72 65 61 64 20 69 6e 20 74 68 65 20 61 46  g read in the aF
15770 72 61 6d 65 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f  rame[] array..*/
15780 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 43  .static int rbuC
15790 61 70 74 75 72 65 57 61 6c 52 65 61 64 28 73 71  aptureWalRead(sq
157a0 6c 69 74 65 33 72 62 75 20 2a 70 52 62 75 2c 20  lite3rbu *pRbu, 
157b0 69 36 34 20 69 4f 66 66 2c 20 69 6e 74 20 69 41  i64 iOff, int iA
157c0 6d 74 29 7b 0a 20 20 63 6f 6e 73 74 20 75 33 32  mt){.  const u32
157d0 20 6d 52 65 71 20 3d 20 28 31 3c 3c 57 41 4c 5f   mReq = (1<<WAL_
157e0 4c 4f 43 4b 5f 57 52 49 54 45 29 7c 28 31 3c 3c  LOCK_WRITE)|(1<<
157f0 57 41 4c 5f 4c 4f 43 4b 5f 43 4b 50 54 29 7c 28  WAL_LOCK_CKPT)|(
15800 31 3c 3c 57 41 4c 5f 4c 4f 43 4b 5f 52 45 41 44  1<<WAL_LOCK_READ
15810 30 29 3b 0a 20 20 75 33 32 20 69 46 72 61 6d 65  0);.  u32 iFrame
15820 3b 0a 0a 20 20 69 66 28 20 70 52 62 75 2d 3e 6d  ;..  if( pRbu->m
15830 4c 6f 63 6b 21 3d 6d 52 65 71 20 29 7b 0a 20 20  Lock!=mReq ){.  
15840 20 20 70 52 62 75 2d 3e 72 63 20 3d 20 53 51 4c    pRbu->rc = SQL
15850 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 72 65  ITE_BUSY;.    re
15860 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4e 54 45  turn SQLITE_INTE
15870 52 4e 41 4c 3b 0a 20 20 7d 0a 0a 20 20 70 52 62  RNAL;.  }..  pRb
15880 75 2d 3e 70 67 73 7a 20 3d 20 69 41 6d 74 3b 0a  u->pgsz = iAmt;.
15890 20 20 69 66 28 20 70 52 62 75 2d 3e 6e 46 72 61    if( pRbu->nFra
158a0 6d 65 3d 3d 70 52 62 75 2d 3e 6e 46 72 61 6d 65  me==pRbu->nFrame
158b0 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 69 6e 74  Alloc ){.    int
158c0 20 6e 4e 65 77 20 3d 20 28 70 52 62 75 2d 3e 6e   nNew = (pRbu->n
158d0 46 72 61 6d 65 41 6c 6c 6f 63 20 3f 20 70 52 62  FrameAlloc ? pRb
158e0 75 2d 3e 6e 46 72 61 6d 65 41 6c 6c 6f 63 20 3a  u->nFrameAlloc :
158f0 20 36 34 29 20 2a 20 32 3b 0a 20 20 20 20 52 62   64) * 2;.    Rb
15900 75 46 72 61 6d 65 20 2a 61 4e 65 77 3b 0a 20 20  uFrame *aNew;.  
15910 20 20 61 4e 65 77 20 3d 20 28 52 62 75 46 72 61    aNew = (RbuFra
15920 6d 65 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c  me*)sqlite3_real
15930 6c 6f 63 36 34 28 70 52 62 75 2d 3e 61 46 72 61  loc64(pRbu->aFra
15940 6d 65 2c 20 6e 4e 65 77 20 2a 20 73 69 7a 65 6f  me, nNew * sizeo
15950 66 28 52 62 75 46 72 61 6d 65 29 29 3b 0a 20 20  f(RbuFrame));.  
15960 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 20    if( aNew==0 ) 
15970 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
15980 4d 45 4d 3b 0a 20 20 20 20 70 52 62 75 2d 3e 61  MEM;.    pRbu->a
15990 46 72 61 6d 65 20 3d 20 61 4e 65 77 3b 0a 20 20  Frame = aNew;.  
159a0 20 20 70 52 62 75 2d 3e 6e 46 72 61 6d 65 41 6c    pRbu->nFrameAl
159b0 6c 6f 63 20 3d 20 6e 4e 65 77 3b 0a 20 20 7d 0a  loc = nNew;.  }.
159c0 0a 20 20 69 46 72 61 6d 65 20 3d 20 28 75 33 32  .  iFrame = (u32
159d0 29 28 28 69 4f 66 66 2d 33 32 29 20 2f 20 28 69  )((iOff-32) / (i
159e0 36 34 29 28 69 41 6d 74 2b 32 34 29 29 20 2b 20  64)(iAmt+24)) + 
159f0 31 3b 0a 20 20 69 66 28 20 70 52 62 75 2d 3e 69  1;.  if( pRbu->i
15a00 4d 61 78 46 72 61 6d 65 3c 69 46 72 61 6d 65 20  MaxFrame<iFrame 
15a10 29 20 70 52 62 75 2d 3e 69 4d 61 78 46 72 61 6d  ) pRbu->iMaxFram
15a20 65 20 3d 20 69 46 72 61 6d 65 3b 0a 20 20 70 52  e = iFrame;.  pR
15a30 62 75 2d 3e 61 46 72 61 6d 65 5b 70 52 62 75 2d  bu->aFrame[pRbu-
15a40 3e 6e 46 72 61 6d 65 5d 2e 69 57 61 6c 46 72 61  >nFrame].iWalFra
15a50 6d 65 20 3d 20 69 46 72 61 6d 65 3b 0a 20 20 70  me = iFrame;.  p
15a60 52 62 75 2d 3e 61 46 72 61 6d 65 5b 70 52 62 75  Rbu->aFrame[pRbu
15a70 2d 3e 6e 46 72 61 6d 65 5d 2e 69 44 62 50 61 67  ->nFrame].iDbPag
15a80 65 20 3d 20 30 3b 0a 20 20 70 52 62 75 2d 3e 6e  e = 0;.  pRbu->n
15a90 46 72 61 6d 65 2b 2b 3b 0a 20 20 72 65 74 75 72  Frame++;.  retur
15aa0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
15ab0 2f 2a 0a 2a 2a 20 43 61 6c 6c 65 64 20 77 68 65  /*.** Called whe
15ac0 6e 20 61 20 70 61 67 65 20 6f 66 20 64 61 74 61  n a page of data
15ad0 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 6f   is written to o
15ae0 66 66 73 65 74 20 69 4f 66 66 20 6f 66 20 74 68  ffset iOff of th
15af0 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69  e database.** fi
15b00 6c 65 20 77 68 69 6c 65 20 74 68 65 20 72 62 75  le while the rbu
15b10 20 68 61 6e 64 6c 65 20 69 73 20 69 6e 20 63 61   handle is in ca
15b20 70 74 75 72 65 20 6d 6f 64 65 2e 20 52 65 63 6f  pture mode. Reco
15b30 72 64 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  rd the page numb
15b40 65 72 20 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61  er .** of the pa
15b50 67 65 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  ge being written
15b60 20 69 6e 20 74 68 65 20 61 46 72 61 6d 65 5b 5d   in the aFrame[]
15b70 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69   array..*/.stati
15b80 63 20 69 6e 74 20 72 62 75 43 61 70 74 75 72 65  c int rbuCapture
15b90 44 62 57 72 69 74 65 28 73 71 6c 69 74 65 33 72  DbWrite(sqlite3r
15ba0 62 75 20 2a 70 52 62 75 2c 20 69 36 34 20 69 4f  bu *pRbu, i64 iO
15bb0 66 66 29 7b 0a 20 20 70 52 62 75 2d 3e 61 46 72  ff){.  pRbu->aFr
15bc0 61 6d 65 5b 70 52 62 75 2d 3e 6e 46 72 61 6d 65  ame[pRbu->nFrame
15bd0 2d 31 5d 2e 69 44 62 50 61 67 65 20 3d 20 28 75  -1].iDbPage = (u
15be0 33 32 29 28 69 4f 66 66 20 2f 20 70 52 62 75 2d  32)(iOff / pRbu-
15bf0 3e 70 67 73 7a 29 20 2b 20 31 3b 0a 20 20 72 65  >pgsz) + 1;.  re
15c00 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
15c10 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  }../*.** This is
15c20 20 63 61 6c 6c 65 64 20 61 73 20 70 61 72 74 20   called as part 
15c30 6f 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61  of an incrementa
15c40 6c 20 63 68 65 63 6b 70 6f 69 6e 74 20 6f 70 65  l checkpoint ope
15c50 72 61 74 69 6f 6e 2e 20 43 6f 70 79 0a 2a 2a 20  ration. Copy.** 
15c60 61 20 73 69 6e 67 6c 65 20 66 72 61 6d 65 20 6f  a single frame o
15c70 66 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  f data from the 
15c80 77 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 74 68  wal file into th
15c90 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
15ca0 20 61 73 0a 2a 2a 20 69 6e 64 69 63 61 74 65 64   as.** indicated
15cb0 20 62 79 20 74 68 65 20 52 62 75 46 72 61 6d 65   by the RbuFrame
15cc0 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74   object..*/.stat
15cd0 69 63 20 76 6f 69 64 20 72 62 75 43 68 65 63 6b  ic void rbuCheck
15ce0 70 6f 69 6e 74 46 72 61 6d 65 28 73 71 6c 69 74  pointFrame(sqlit
15cf0 65 33 72 62 75 20 2a 70 2c 20 52 62 75 46 72 61  e3rbu *p, RbuFra
15d00 6d 65 20 2a 70 46 72 61 6d 65 29 7b 0a 20 20 73  me *pFrame){.  s
15d10 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 57 61  qlite3_file *pWa
15d20 6c 20 3d 20 70 2d 3e 70 54 61 72 67 65 74 46 64  l = p->pTargetFd
15d30 2d 3e 70 57 61 6c 46 64 2d 3e 70 52 65 61 6c 3b  ->pWalFd->pReal;
15d40 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
15d50 2a 70 44 62 20 3d 20 70 2d 3e 70 54 61 72 67 65  *pDb = p->pTarge
15d60 74 46 64 2d 3e 70 52 65 61 6c 3b 0a 20 20 69 36  tFd->pReal;.  i6
15d70 34 20 69 4f 66 66 3b 0a 0a 20 20 61 73 73 65 72  4 iOff;..  asser
15d80 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  t( p->rc==SQLITE
15d90 5f 4f 4b 20 29 3b 0a 20 20 69 4f 66 66 20 3d 20  _OK );.  iOff = 
15da0 28 69 36 34 29 28 70 46 72 61 6d 65 2d 3e 69 57  (i64)(pFrame->iW
15db0 61 6c 46 72 61 6d 65 2d 31 29 20 2a 20 28 70 2d  alFrame-1) * (p-
15dc0 3e 70 67 73 7a 20 2b 20 32 34 29 20 2b 20 33 32  >pgsz + 24) + 32
15dd0 20 2b 20 32 34 3b 0a 20 20 70 2d 3e 72 63 20 3d   + 24;.  p->rc =
15de0 20 70 57 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d   pWal->pMethods-
15df0 3e 78 52 65 61 64 28 70 57 61 6c 2c 20 70 2d 3e  >xRead(pWal, p->
15e00 61 42 75 66 2c 20 70 2d 3e 70 67 73 7a 2c 20 69  aBuf, p->pgsz, i
15e10 4f 66 66 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72  Off);.  if( p->r
15e20 63 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69  c ) return;..  i
15e30 4f 66 66 20 3d 20 28 69 36 34 29 28 70 46 72 61  Off = (i64)(pFra
15e40 6d 65 2d 3e 69 44 62 50 61 67 65 2d 31 29 20 2a  me->iDbPage-1) *
15e50 20 70 2d 3e 70 67 73 7a 3b 0a 20 20 70 2d 3e 72   p->pgsz;.  p->r
15e60 63 20 3d 20 70 44 62 2d 3e 70 4d 65 74 68 6f 64  c = pDb->pMethod
15e70 73 2d 3e 78 57 72 69 74 65 28 70 44 62 2c 20 70  s->xWrite(pDb, p
15e80 2d 3e 61 42 75 66 2c 20 70 2d 3e 70 67 73 7a 2c  ->aBuf, p->pgsz,
15e90 20 69 4f 66 66 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a   iOff);.}.../*.*
15ea0 2a 20 54 61 6b 65 20 61 6e 20 45 58 43 4c 55 53  * Take an EXCLUS
15eb0 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
15ec0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
15ed0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62  /.static void rb
15ee0 75 4c 6f 63 6b 44 61 74 61 62 61 73 65 28 73 71  uLockDatabase(sq
15ef0 6c 69 74 65 33 72 62 75 20 2a 70 29 7b 0a 20 20  lite3rbu *p){.  
15f00 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 52  sqlite3_file *pR
15f10 65 61 6c 20 3d 20 70 2d 3e 70 54 61 72 67 65 74  eal = p->pTarget
15f20 46 64 2d 3e 70 52 65 61 6c 3b 0a 20 20 61 73 73  Fd->pReal;.  ass
15f30 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ert( p->rc==SQLI
15f40 54 45 5f 4f 4b 20 29 3b 0a 20 20 70 2d 3e 72 63  TE_OK );.  p->rc
15f50 20 3d 20 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f   = pReal->pMetho
15f60 64 73 2d 3e 78 4c 6f 63 6b 28 70 52 65 61 6c 2c  ds->xLock(pReal,
15f70 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 53 48 41   SQLITE_LOCK_SHA
15f80 52 45 44 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72  RED);.  if( p->r
15f90 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
15fa0 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 52 65 61      p->rc = pRea
15fb0 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 4c 6f  l->pMethods->xLo
15fc0 63 6b 28 70 52 65 61 6c 2c 20 53 51 4c 49 54 45  ck(pReal, SQLITE
15fd0 5f 4c 4f 43 4b 5f 45 58 43 4c 55 53 49 56 45 29  _LOCK_EXCLUSIVE)
15fe0 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 64 65 66  ;.  }.}..#if def
15ff0 69 6e 65 64 28 5f 57 49 4e 33 32 5f 57 43 45 29  ined(_WIN32_WCE)
16000 0a 73 74 61 74 69 63 20 4c 50 57 53 54 52 20 72  .static LPWSTR r
16010 62 75 57 69 6e 55 74 66 38 54 6f 55 6e 69 63 6f  buWinUtf8ToUnico
16020 64 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  de(const char *z
16030 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74  Filename){.  int
16040 20 6e 43 68 61 72 3b 0a 20 20 4c 50 57 53 54 52   nChar;.  LPWSTR
16050 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 3b 0a   zWideFilename;.
16060 0a 20 20 6e 43 68 61 72 20 3d 20 4d 75 6c 74 69  .  nChar = Multi
16070 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 28 43  ByteToWideChar(C
16080 50 5f 55 54 46 38 2c 20 30 2c 20 7a 46 69 6c 65  P_UTF8, 0, zFile
16090 6e 61 6d 65 2c 20 2d 31 2c 20 4e 55 4c 4c 2c 20  name, -1, NULL, 
160a0 30 29 3b 0a 20 20 69 66 28 20 6e 43 68 61 72 3d  0);.  if( nChar=
160b0 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
160c0 20 30 3b 0a 20 20 7d 0a 20 20 7a 57 69 64 65 46   0;.  }.  zWideF
160d0 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ilename = sqlite
160e0 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 6e 43 68 61  3_malloc64( nCha
160f0 72 2a 73 69 7a 65 6f 66 28 7a 57 69 64 65 46 69  r*sizeof(zWideFi
16100 6c 65 6e 61 6d 65 5b 30 5d 29 20 29 3b 0a 20 20  lename[0]) );.  
16110 69 66 28 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d  if( zWideFilenam
16120 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  e==0 ){.    retu
16130 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73  rn 0;.  }.  mems
16140 65 74 28 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  et(zWideFilename
16150 2c 20 30 2c 20 6e 43 68 61 72 2a 73 69 7a 65 6f  , 0, nChar*sizeo
16160 66 28 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 5b  f(zWideFilename[
16170 30 5d 29 29 3b 0a 20 20 6e 43 68 61 72 20 3d 20  0]));.  nChar = 
16180 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43  MultiByteToWideC
16190 68 61 72 28 43 50 5f 55 54 46 38 2c 20 30 2c 20  har(CP_UTF8, 0, 
161a0 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a  zFilename, -1, z
161b0 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c 0a 20 20  WideFilename,.  
161c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 43                nC
161e0 68 61 72 29 3b 0a 20 20 69 66 28 20 6e 43 68 61  har);.  if( nCha
161f0 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  r==0 ){.    sqli
16200 74 65 33 5f 66 72 65 65 28 7a 57 69 64 65 46 69  te3_free(zWideFi
16210 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 57 69  lename);.    zWi
16220 64 65 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a  deFilename = 0;.
16230 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 57 69    }.  return zWi
16240 64 65 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 23 65  deFilename;.}.#e
16250 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
16260 52 42 55 20 68 61 6e 64 6c 65 20 69 73 20 63 75  RBU handle is cu
16270 72 72 65 6e 74 6c 79 20 69 6e 20 52 42 55 5f 53  rrently in RBU_S
16280 54 41 47 45 5f 4f 41 4c 20 73 74 61 74 65 2c 20  TAGE_OAL state, 
16290 77 69 74 68 20 61 20 53 48 41 52 45 44 20 6c 6f  with a SHARED lo
162a0 63 6b 0a 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74  ck.** on the dat
162b0 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 69 73  abase file. This
162c0 20 70 72 6f 63 20 6d 6f 76 65 73 20 74 68 65 20   proc moves the 
162d0 2a 2d 6f 61 6c 20 66 69 6c 65 20 74 6f 20 74 68  *-oal file to th
162e0 65 20 2a 2d 77 61 6c 20 70 61 74 68 2c 0a 2a 2a  e *-wal path,.**
162f0 20 74 68 65 6e 20 72 65 6f 70 65 6e 73 20 74 68   then reopens th
16300 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
16310 28 74 68 69 73 20 74 69 6d 65 20 69 6e 20 76 61  (this time in va
16320 6e 69 6c 6c 61 2c 20 6e 6f 6e 2d 6f 61 6c 2c 20  nilla, non-oal, 
16330 57 41 4c 20 6d 6f 64 65 29 2e 0a 2a 2a 20 49 66  WAL mode)..** If
16340 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
16350 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  , leave an error
16360 20 63 6f 64 65 20 61 6e 64 20 65 72 72 6f 72 20   code and error 
16370 6d 65 73 73 61 67 65 20 69 6e 20 74 68 65 20 72  message in the r
16380 62 75 20 0a 2a 2a 20 68 61 6e 64 6c 65 2e 0a 2a  bu .** handle..*
16390 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62  /.static void rb
163a0 75 4d 6f 76 65 4f 61 6c 46 69 6c 65 28 73 71 6c  uMoveOalFile(sql
163b0 69 74 65 33 72 62 75 20 2a 70 29 7b 0a 20 20 63  ite3rbu *p){.  c
163c0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 61 73 65  onst char *zBase
163d0 20 3d 20 73 71 6c 69 74 65 33 5f 64 62 5f 66 69   = sqlite3_db_fi
163e0 6c 65 6e 61 6d 65 28 70 2d 3e 64 62 4d 61 69 6e  lename(p->dbMain
163f0 2c 20 22 6d 61 69 6e 22 29 3b 0a 20 20 63 6f 6e  , "main");.  con
16400 73 74 20 63 68 61 72 20 2a 7a 4d 6f 76 65 20 3d  st char *zMove =
16410 20 7a 42 61 73 65 3b 0a 20 20 63 68 61 72 20 2a   zBase;.  char *
16420 7a 4f 61 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 57  zOal;.  char *zW
16430 61 6c 3b 0a 0a 20 20 69 66 28 20 72 62 75 49 73  al;..  if( rbuIs
16440 56 61 63 75 75 6d 28 70 29 20 29 7b 0a 20 20 20  Vacuum(p) ){.   
16450 20 7a 4d 6f 76 65 20 3d 20 73 71 6c 69 74 65 33   zMove = sqlite3
16460 5f 64 62 5f 66 69 6c 65 6e 61 6d 65 28 70 2d 3e  _db_filename(p->
16470 64 62 52 62 75 2c 20 22 6d 61 69 6e 22 29 3b 0a  dbRbu, "main");.
16480 20 20 7d 0a 20 20 7a 4f 61 6c 20 3d 20 73 71 6c    }.  zOal = sql
16490 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
164a0 2d 6f 61 6c 22 2c 20 7a 4d 6f 76 65 29 3b 0a 20  -oal", zMove);. 
164b0 20 7a 57 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zWal = sqlite3_
164c0 6d 70 72 69 6e 74 66 28 22 25 73 2d 77 61 6c 22  mprintf("%s-wal"
164d0 2c 20 7a 4d 6f 76 65 29 3b 0a 0a 20 20 61 73 73  , zMove);..  ass
164e0 65 72 74 28 20 70 2d 3e 65 53 74 61 67 65 3d 3d  ert( p->eStage==
164f0 52 42 55 5f 53 54 41 47 45 5f 4d 4f 56 45 20 29  RBU_STAGE_MOVE )
16500 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72  ;.  assert( p->r
16510 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
16520 70 2d 3e 7a 45 72 72 6d 73 67 3d 3d 30 20 29 3b  p->zErrmsg==0 );
16530 0a 20 20 69 66 28 20 7a 57 61 6c 3d 3d 30 20 7c  .  if( zWal==0 |
16540 7c 20 7a 4f 61 6c 3d 3d 30 20 29 7b 0a 20 20 20  | zOal==0 ){.   
16550 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
16560 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  NOMEM;.  }else{.
16570 20 20 20 20 2f 2a 20 4d 6f 76 65 20 74 68 65 20      /* Move the 
16580 2a 2d 6f 61 6c 20 66 69 6c 65 20 74 6f 20 2a 2d  *-oal file to *-
16590 77 61 6c 2e 20 41 74 20 74 68 69 73 20 70 6f 69  wal. At this poi
165a0 6e 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 2d  nt connection p-
165b0 3e 64 62 20 69 73 0a 20 20 20 20 2a 2a 20 68 6f  >db is.    ** ho
165c0 6c 64 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c  lding a SHARED l
165d0 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 72 67 65  ock on the targe
165e0 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  t database file 
165f0 28 62 65 63 61 75 73 65 20 69 74 20 69 73 0a 20  (because it is. 
16600 20 20 20 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f 64     ** in WAL mod
16610 65 29 2e 20 53 6f 20 6e 6f 20 6f 74 68 65 72 20  e). So no other 
16620 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61 79 20 62  connection may b
16630 65 20 77 72 69 74 69 6e 67 20 74 68 65 20 64 62  e writing the db
16640 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  . .    **.    **
16650 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 65 6e 73   In order to ens
16660 75 72 65 20 74 68 61 74 20 74 68 65 72 65 20 61  ure that there a
16670 72 65 20 6e 6f 20 64 61 74 61 62 61 73 65 20 72  re no database r
16680 65 61 64 65 72 73 2c 20 61 6e 20 45 58 43 4c 55  eaders, an EXCLU
16690 53 49 56 45 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b  SIVE.    ** lock
166a0 20 69 73 20 6f 62 74 61 69 6e 65 64 20 68 65 72   is obtained her
166b0 65 20 62 65 66 6f 72 65 20 74 68 65 20 2a 2d 6f  e before the *-o
166c0 61 6c 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 2a  al is moved to *
166d0 2d 77 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  -wal..    */.   
166e0 20 72 62 75 4c 6f 63 6b 44 61 74 61 62 61 73 65   rbuLockDatabase
166f0 28 70 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  (p);.    if( p->
16700 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
16710 0a 20 20 20 20 20 20 72 62 75 46 69 6c 65 53 75  .      rbuFileSu
16720 66 66 69 78 33 28 7a 42 61 73 65 2c 20 7a 57 61  ffix3(zBase, zWa
16730 6c 29 3b 0a 20 20 20 20 20 20 72 62 75 46 69 6c  l);.      rbuFil
16740 65 53 75 66 66 69 78 33 28 7a 42 61 73 65 2c 20  eSuffix3(zBase, 
16750 7a 4f 61 6c 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  zOal);..      /*
16760 20 52 65 2d 6f 70 65 6e 20 74 68 65 20 64 61 74   Re-open the dat
16770 61 62 61 73 65 73 2e 20 2a 2f 0a 20 20 20 20 20  abases. */.     
16780 20 72 62 75 4f 62 6a 49 74 65 72 46 69 6e 61 6c   rbuObjIterFinal
16790 69 7a 65 28 26 70 2d 3e 6f 62 6a 69 74 65 72 29  ize(&p->objiter)
167a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
167b0 63 6c 6f 73 65 28 70 2d 3e 64 62 52 62 75 29 3b  close(p->dbRbu);
167c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63  .      sqlite3_c
167d0 6c 6f 73 65 28 70 2d 3e 64 62 4d 61 69 6e 29 3b  lose(p->dbMain);
167e0 0a 20 20 20 20 20 20 70 2d 3e 64 62 4d 61 69 6e  .      p->dbMain
167f0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 64   = 0;.      p->d
16800 62 52 62 75 20 3d 20 30 3b 0a 0a 23 69 66 20 64  bRbu = 0;..#if d
16810 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 5f 57 43  efined(_WIN32_WC
16820 45 29 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  E).      {.     
16830 20 20 20 4c 50 57 53 54 52 20 7a 57 69 64 65 4f     LPWSTR zWideO
16840 61 6c 3b 0a 20 20 20 20 20 20 20 20 4c 50 57 53  al;.        LPWS
16850 54 52 20 7a 57 69 64 65 57 61 6c 3b 0a 0a 20 20  TR zWideWal;..  
16860 20 20 20 20 20 20 7a 57 69 64 65 4f 61 6c 20 3d        zWideOal =
16870 20 72 62 75 57 69 6e 55 74 66 38 54 6f 55 6e 69   rbuWinUtf8ToUni
16880 63 6f 64 65 28 7a 4f 61 6c 29 3b 0a 20 20 20 20  code(zOal);.    
16890 20 20 20 20 69 66 28 20 7a 57 69 64 65 4f 61 6c      if( zWideOal
168a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 57   ){.          zW
168b0 69 64 65 57 61 6c 20 3d 20 72 62 75 57 69 6e 55  ideWal = rbuWinU
168c0 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a 57 61  tf8ToUnicode(zWa
168d0 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  l);.          if
168e0 28 20 7a 57 69 64 65 57 61 6c 20 29 7b 0a 20 20  ( zWideWal ){.  
168f0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 4d 6f            if( Mo
16900 76 65 46 69 6c 65 57 28 7a 57 69 64 65 4f 61 6c  veFileW(zWideOal
16910 2c 20 7a 57 69 64 65 57 61 6c 29 20 29 7b 0a 20  , zWideWal) ){. 
16920 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
16930 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
16940 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
16950 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
16960 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
16970 49 4f 45 52 52 3b 0a 20 20 20 20 20 20 20 20 20  IOERR;.         
16980 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
16990 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 57   sqlite3_free(zW
169a0 69 64 65 57 61 6c 29 3b 0a 20 20 20 20 20 20 20  ideWal);.       
169b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
169c0 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51        p->rc = SQ
169d0 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
169e0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
169f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
16a00 66 72 65 65 28 7a 57 69 64 65 4f 61 6c 29 3b 0a  free(zWideOal);.
16a10 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
16a20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d           p->rc =
16a30 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
16a40 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  MEM;.        }. 
16a50 20 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20       }.#else.   
16a60 20 20 20 70 2d 3e 72 63 20 3d 20 72 65 6e 61 6d     p->rc = renam
16a70 65 28 7a 4f 61 6c 2c 20 7a 57 61 6c 29 20 3f 20  e(zOal, zWal) ? 
16a80 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 3a 20 53  SQLITE_IOERR : S
16a90 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66  QLITE_OK;.#endif
16aa0 0a 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72  ..      if( p->r
16ab0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
16ac0 20 20 20 20 20 20 20 20 72 62 75 4f 70 65 6e 44          rbuOpenD
16ad0 61 74 61 62 61 73 65 28 70 2c 20 30 29 3b 0a 20  atabase(p, 0);. 
16ae0 20 20 20 20 20 20 20 72 62 75 53 65 74 75 70 43         rbuSetupC
16af0 68 65 63 6b 70 6f 69 6e 74 28 70 2c 20 30 29 3b  heckpoint(p, 0);
16b00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
16b10 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   }..  sqlite3_fr
16b20 65 65 28 7a 57 61 6c 29 3b 0a 20 20 73 71 6c 69  ee(zWal);.  sqli
16b30 74 65 33 5f 66 72 65 65 28 7a 4f 61 6c 29 3b 0a  te3_free(zOal);.
16b40 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 53 45 4c  }../*.** The SEL
16b50 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 74  ECT statement it
16b60 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20  erating through 
16b70 74 68 65 20 6b 65 79 73 20 66 6f 72 20 74 68 65  the keys for the
16b80 20 63 75 72 72 65 6e 74 20 6f 62 6a 65 63 74 0a   current object.
16b90 2a 2a 20 28 70 2d 3e 6f 62 6a 69 74 65 72 2e 70  ** (p->objiter.p
16ba0 53 65 6c 65 63 74 29 20 63 75 72 72 65 6e 74 6c  Select) currentl
16bb0 79 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 76 61  y points to a va
16bc0 6c 69 64 20 72 6f 77 2e 20 54 68 69 73 20 66 75  lid row. This fu
16bd0 6e 63 74 69 6f 6e 0a 2a 2a 20 64 65 74 65 72 6d  nction.** determ
16be0 69 6e 65 73 20 74 68 65 20 74 79 70 65 20 6f 66  ines the type of
16bf0 20 6f 70 65 72 61 74 69 6f 6e 20 72 65 71 75 65   operation reque
16c00 73 74 65 64 20 62 79 20 74 68 69 73 20 72 6f 77  sted by this row
16c10 20 61 6e 64 20 72 65 74 75 72 6e 73 0a 2a 2a 20   and returns.** 
16c20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  one of the follo
16c30 77 69 6e 67 20 76 61 6c 75 65 73 20 74 6f 20 69  wing values to i
16c40 6e 64 69 63 61 74 65 20 74 68 65 20 72 65 73 75  ndicate the resu
16c50 6c 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20  lt:.**.**     * 
16c60 52 42 55 5f 49 4e 53 45 52 54 0a 2a 2a 20 20 20  RBU_INSERT.**   
16c70 20 20 2a 20 52 42 55 5f 44 45 4c 45 54 45 0a 2a    * RBU_DELETE.*
16c80 2a 20 20 20 20 20 2a 20 52 42 55 5f 49 44 58 5f  *     * RBU_IDX_
16c90 44 45 4c 45 54 45 0a 2a 2a 20 20 20 20 20 2a 20  DELETE.**     * 
16ca0 52 42 55 5f 55 50 44 41 54 45 0a 2a 2a 0a 2a 2a  RBU_UPDATE.**.**
16cb0 20 49 66 20 52 42 55 5f 55 50 44 41 54 45 20 69   If RBU_UPDATE i
16cc0 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e  s returned, then
16cd0 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65   output variable
16ce0 20 2a 70 7a 4d 61 73 6b 20 69 73 20 73 65 74 20   *pzMask is set 
16cf0 74 6f 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 74  to.** point to t
16d00 68 65 20 74 65 78 74 20 76 61 6c 75 65 20 69 6e  he text value in
16d10 64 69 63 61 74 69 6e 67 20 74 68 65 20 63 6f 6c  dicating the col
16d20 75 6d 6e 73 20 74 6f 20 75 70 64 61 74 65 2e 0a  umns to update..
16d30 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 62 75  **.** If the rbu
16d40 5f 63 6f 6e 74 72 6f 6c 20 66 69 65 6c 64 20 63  _control field c
16d50 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6e 76 61 6c  ontains an inval
16d60 69 64 20 76 61 6c 75 65 2c 20 61 6e 20 65 72 72  id value, an err
16d70 6f 72 20 63 6f 64 65 20 61 6e 64 0a 2a 2a 20 6d  or code and.** m
16d80 65 73 73 61 67 65 20 61 72 65 20 6c 65 66 74 20  essage are left 
16d90 69 6e 20 74 68 65 20 52 42 55 20 68 61 6e 64 6c  in the RBU handl
16da0 65 20 61 6e 64 20 7a 65 72 6f 20 72 65 74 75 72  e and zero retur
16db0 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
16dc0 6e 74 20 72 62 75 53 74 65 70 54 79 70 65 28 73  nt rbuStepType(s
16dd0 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 63 6f  qlite3rbu *p, co
16de0 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4d 61 73  nst char **pzMas
16df0 6b 29 7b 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d  k){.  int iCol =
16e00 20 70 2d 3e 6f 62 6a 69 74 65 72 2e 6e 43 6f 6c   p->objiter.nCol
16e10 3b 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f  ;     /* Index o
16e20 66 20 72 62 75 5f 63 6f 6e 74 72 6f 6c 20 63 6f  f rbu_control co
16e30 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 65  lumn */.  int re
16e40 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  s = 0;          
16e50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
16e60 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20  urn value */..  
16e70 73 77 69 74 63 68 28 20 73 71 6c 69 74 65 33 5f  switch( sqlite3_
16e80 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 2d 3e 6f  column_type(p->o
16e90 62 6a 69 74 65 72 2e 70 53 65 6c 65 63 74 2c 20  bjiter.pSelect, 
16ea0 69 43 6f 6c 29 20 29 7b 0a 20 20 20 20 63 61 73  iCol) ){.    cas
16eb0 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  e SQLITE_INTEGER
16ec0 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 56  : {.      int iV
16ed0 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  al = sqlite3_col
16ee0 75 6d 6e 5f 69 6e 74 28 70 2d 3e 6f 62 6a 69 74  umn_int(p->objit
16ef0 65 72 2e 70 53 65 6c 65 63 74 2c 20 69 43 6f 6c  er.pSelect, iCol
16f00 29 3b 0a 20 20 20 20 20 20 73 77 69 74 63 68 28  );.      switch(
16f10 20 69 56 61 6c 20 29 7b 0a 20 20 20 20 20 20 20   iVal ){.       
16f20 20 63 61 73 65 20 30 3a 20 72 65 73 20 3d 20 52   case 0: res = R
16f30 42 55 5f 49 4e 53 45 52 54 3b 20 20 20 20 20 62  BU_INSERT;     b
16f40 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61  reak;.        ca
16f50 73 65 20 31 3a 20 72 65 73 20 3d 20 52 42 55 5f  se 1: res = RBU_
16f60 44 45 4c 45 54 45 3b 20 20 20 20 20 62 72 65 61  DELETE;     brea
16f70 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  k;.        case 
16f80 32 3a 20 72 65 73 20 3d 20 52 42 55 5f 52 45 50  2: res = RBU_REP
16f90 4c 41 43 45 3b 20 20 20 20 62 72 65 61 6b 3b 0a  LACE;    break;.
16fa0 20 20 20 20 20 20 20 20 63 61 73 65 20 33 3a 20          case 3: 
16fb0 72 65 73 20 3d 20 52 42 55 5f 49 44 58 5f 44 45  res = RBU_IDX_DE
16fc0 4c 45 54 45 3b 20 62 72 65 61 6b 3b 0a 20 20 20  LETE; break;.   
16fd0 20 20 20 20 20 63 61 73 65 20 34 3a 20 72 65 73       case 4: res
16fe0 20 3d 20 52 42 55 5f 49 44 58 5f 49 4e 53 45 52   = RBU_IDX_INSER
16ff0 54 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  T; break;.      
17000 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
17010 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 53     }..    case S
17020 51 4c 49 54 45 5f 54 45 58 54 3a 20 7b 0a 20 20  QLITE_TEXT: {.  
17030 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e      const unsign
17040 65 64 20 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c  ed char *z = sql
17050 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
17060 28 70 2d 3e 6f 62 6a 69 74 65 72 2e 70 53 65 6c  (p->objiter.pSel
17070 65 63 74 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20  ect, iCol);.    
17080 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20    if( z==0 ){.  
17090 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51        p->rc = SQ
170a0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
170b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
170c0 20 2a 70 7a 4d 61 73 6b 20 3d 20 28 63 6f 6e 73   *pzMask = (cons
170d0 74 20 63 68 61 72 2a 29 7a 3b 0a 20 20 20 20 20  t char*)z;.     
170e0 20 7d 0a 20 20 20 20 20 20 72 65 73 20 3d 20 52   }.      res = R
170f0 42 55 5f 55 50 44 41 54 45 3b 0a 0a 20 20 20 20  BU_UPDATE;..    
17100 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
17110 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
17120 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
17130 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20   if( res==0 ){. 
17140 20 20 20 72 62 75 42 61 64 43 6f 6e 74 72 6f 6c     rbuBadControl
17150 45 72 72 6f 72 28 70 29 3b 0a 20 20 7d 0a 20 20  Error(p);.  }.  
17160 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 23  return res;.}..#
17170 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
17180 55 47 0a 2f 2a 0a 2a 2a 20 41 73 73 65 72 74 20  UG./*.** Assert 
17190 74 68 61 74 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c  that column iCol
171a0 20 6f 66 20 73 74 61 74 65 6d 65 6e 74 20 70 53   of statement pS
171b0 74 6d 74 20 69 73 20 6e 61 6d 65 64 20 7a 4e 61  tmt is named zNa
171c0 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  me..*/.static vo
171d0 69 64 20 61 73 73 65 72 74 43 6f 6c 75 6d 6e 4e  id assertColumnN
171e0 61 6d 65 28 73 71 6c 69 74 65 33 5f 73 74 6d 74  ame(sqlite3_stmt
171f0 20 2a 70 53 74 6d 74 2c 20 69 6e 74 20 69 43 6f   *pStmt, int iCo
17200 6c 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  l, const char *z
17210 4e 61 6d 65 29 7b 0a 20 20 63 6f 6e 73 74 20 63  Name){.  const c
17220 68 61 72 20 2a 7a 43 6f 6c 20 3d 20 73 71 6c 69  har *zCol = sqli
17230 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 28  te3_column_name(
17240 70 53 74 6d 74 2c 20 69 43 6f 6c 29 3b 0a 20 20  pStmt, iCol);.  
17250 61 73 73 65 72 74 28 20 30 3d 3d 73 71 6c 69 74  assert( 0==sqlit
17260 65 33 5f 73 74 72 69 63 6d 70 28 7a 4e 61 6d 65  e3_stricmp(zName
17270 2c 20 7a 43 6f 6c 29 20 29 3b 0a 7d 0a 23 65 6c  , zCol) );.}.#el
17280 73 65 0a 23 20 64 65 66 69 6e 65 20 61 73 73 65  se.# define asse
17290 72 74 43 6f 6c 75 6d 6e 4e 61 6d 65 28 78 2c 79  rtColumnName(x,y
172a0 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ,z).#endif../*.*
172b0 2a 20 41 72 67 75 6d 65 6e 74 20 65 54 79 70 65  * Argument eType
172c0 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20   must be one of 
172d0 52 42 55 5f 49 4e 53 45 52 54 2c 20 52 42 55 5f  RBU_INSERT, RBU_
172e0 44 45 4c 45 54 45 2c 20 52 42 55 5f 49 44 58 5f  DELETE, RBU_IDX_
172f0 49 4e 53 45 52 54 20 6f 72 0a 2a 2a 20 52 42 55  INSERT or.** RBU
17300 5f 49 44 58 5f 44 45 4c 45 54 45 2e 20 54 68 69  _IDX_DELETE. Thi
17310 73 20 66 75 6e 63 74 69 6f 6e 20 70 65 72 66 6f  s function perfo
17320 72 6d 73 20 74 68 65 20 77 6f 72 6b 20 6f 66 20  rms the work of 
17330 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 73 71 6c 69  a single.** sqli
17340 74 65 33 72 62 75 5f 73 74 65 70 28 29 20 63 61  te3rbu_step() ca
17350 6c 6c 20 66 6f 72 20 74 68 65 20 74 79 70 65 20  ll for the type 
17360 6f 66 20 6f 70 65 72 61 74 69 6f 6e 20 73 70 65  of operation spe
17370 63 69 66 69 65 64 20 62 79 20 65 54 79 70 65 2e  cified by eType.
17380 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
17390 72 62 75 53 74 65 70 4f 6e 65 4f 70 28 73 71 6c  rbuStepOneOp(sql
173a0 69 74 65 33 72 62 75 20 2a 70 2c 20 69 6e 74 20  ite3rbu *p, int 
173b0 65 54 79 70 65 29 7b 0a 20 20 52 62 75 4f 62 6a  eType){.  RbuObj
173c0 49 74 65 72 20 2a 70 49 74 65 72 20 3d 20 26 70  Iter *pIter = &p
173d0 2d 3e 6f 62 6a 69 74 65 72 3b 0a 20 20 73 71 6c  ->objiter;.  sql
173e0 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c  ite3_value *pVal
173f0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ;.  sqlite3_stmt
17400 20 2a 70 57 72 69 74 65 72 3b 0a 20 20 69 6e 74   *pWriter;.  int
17410 20 69 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   i;..  assert( p
17420 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
17430 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 54 79  );.  assert( eTy
17440 70 65 21 3d 52 42 55 5f 44 45 4c 45 54 45 20 7c  pe!=RBU_DELETE |
17450 7c 20 70 49 74 65 72 2d 3e 7a 49 64 78 3d 3d 30  | pIter->zIdx==0
17460 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 54   );.  assert( eT
17470 79 70 65 3d 3d 52 42 55 5f 44 45 4c 45 54 45 20  ype==RBU_DELETE 
17480 7c 7c 20 65 54 79 70 65 3d 3d 52 42 55 5f 49 44  || eType==RBU_ID
17490 58 5f 44 45 4c 45 54 45 0a 20 20 20 20 20 20 20  X_DELETE.       
174a0 7c 7c 20 65 54 79 70 65 3d 3d 52 42 55 5f 49 4e  || eType==RBU_IN
174b0 53 45 52 54 20 7c 7c 20 65 54 79 70 65 3d 3d 52  SERT || eType==R
174c0 42 55 5f 49 44 58 5f 49 4e 53 45 52 54 0a 20 20  BU_IDX_INSERT.  
174d0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  );..  /* If this
174e0 20 69 73 20 61 20 64 65 6c 65 74 65 2c 20 64 65   is a delete, de
174f0 63 72 65 6d 65 6e 74 20 6e 50 68 61 73 65 4f 6e  crement nPhaseOn
17500 65 53 74 65 70 20 62 79 20 6e 49 6e 64 65 78 2e  eStep by nIndex.
17510 20 49 66 20 74 68 65 20 44 45 4c 45 54 45 0a 20   If the DELETE. 
17520 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 62 65   ** statement be
17530 6c 6f 77 20 64 6f 65 73 20 61 63 74 75 61 6c 6c  low does actuall
17540 79 20 64 65 6c 65 74 65 20 61 20 72 6f 77 2c 20  y delete a row, 
17550 6e 50 68 61 73 65 4f 6e 65 53 74 65 70 20 77 69  nPhaseOneStep wi
17560 6c 6c 20 62 65 0a 20 20 2a 2a 20 69 6e 63 72 65  ll be.  ** incre
17570 6d 65 6e 74 65 64 20 62 79 20 74 68 65 20 73 61  mented by the sa
17580 6d 65 20 61 6d 6f 75 6e 74 20 77 68 65 6e 20 53  me amount when S
17590 51 4c 20 66 75 6e 63 74 69 6f 6e 20 72 62 75 5f  QL function rbu_
175a0 74 6d 70 5f 69 6e 73 65 72 74 28 29 0a 20 20 2a  tmp_insert().  *
175b0 2a 20 69 73 20 69 6e 76 6f 6b 65 64 20 62 79 20  * is invoked by 
175c0 74 68 65 20 74 72 69 67 67 65 72 2e 20 20 2a 2f  the trigger.  */
175d0 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 52 42  .  if( eType==RB
175e0 55 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20  U_DELETE ){.    
175f0 70 2d 3e 6e 50 68 61 73 65 4f 6e 65 53 74 65 70  p->nPhaseOneStep
17600 20 2d 3d 20 70 2d 3e 6f 62 6a 69 74 65 72 2e 6e   -= p->objiter.n
17610 49 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 69 66  Index;.  }..  if
17620 28 20 65 54 79 70 65 3d 3d 52 42 55 5f 49 44 58  ( eType==RBU_IDX
17630 5f 44 45 4c 45 54 45 20 7c 7c 20 65 54 79 70 65  _DELETE || eType
17640 3d 3d 52 42 55 5f 44 45 4c 45 54 45 20 29 7b 0a  ==RBU_DELETE ){.
17650 20 20 20 20 70 57 72 69 74 65 72 20 3d 20 70 49      pWriter = pI
17660 74 65 72 2d 3e 70 44 65 6c 65 74 65 3b 0a 20 20  ter->pDelete;.  
17670 7d 65 6c 73 65 7b 0a 20 20 20 20 70 57 72 69 74  }else{.    pWrit
17680 65 72 20 3d 20 70 49 74 65 72 2d 3e 70 49 6e 73  er = pIter->pIns
17690 65 72 74 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28  ert;.  }..  for(
176a0 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 43  i=0; i<pIter->nC
176b0 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 2f 2a  ol; i++){.    /*
176c0 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 49   If this is an I
176d0 4e 53 45 52 54 20 69 6e 74 6f 20 61 20 74 61 62  NSERT into a tab
176e0 6c 65 20 62 2d 74 72 65 65 20 61 6e 64 20 74 68  le b-tree and th
176f0 65 20 74 61 62 6c 65 20 68 61 73 20 61 6e 0a 20  e table has an. 
17700 20 20 20 2a 2a 20 65 78 70 6c 69 63 69 74 20 49     ** explicit I
17710 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
17720 45 59 2c 20 63 68 65 63 6b 20 74 68 61 74 20 74  EY, check that t
17730 68 69 73 20 69 73 20 6e 6f 74 20 61 6e 20 61 74  his is not an at
17740 74 65 6d 70 74 0a 20 20 20 20 2a 2a 20 74 6f 20  tempt.    ** to 
17750 77 72 69 74 65 20 61 20 4e 55 4c 4c 20 69 6e 74  write a NULL int
17760 6f 20 74 68 65 20 49 50 4b 20 63 6f 6c 75 6d 6e  o the IPK column
17770 2e 20 54 68 61 74 20 69 73 20 6e 6f 74 20 70 65  . That is not pe
17780 72 6d 69 74 74 65 64 2e 20 20 2a 2f 0a 20 20 20  rmitted.  */.   
17790 20 69 66 28 20 65 54 79 70 65 3d 3d 52 42 55 5f   if( eType==RBU_
177a0 49 4e 53 45 52 54 20 0a 20 20 20 20 20 26 26 20  INSERT .     && 
177b0 70 49 74 65 72 2d 3e 7a 49 64 78 3d 3d 30 20 26  pIter->zIdx==0 &
177c0 26 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d  & pIter->eType==
177d0 52 42 55 5f 50 4b 5f 49 50 4b 20 26 26 20 70 49  RBU_PK_IPK && pI
177e0 74 65 72 2d 3e 61 62 54 62 6c 50 6b 5b 69 5d 20  ter->abTblPk[i] 
177f0 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33  .     && sqlite3
17800 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 49 74  _column_type(pIt
17810 65 72 2d 3e 70 53 65 6c 65 63 74 2c 20 69 29 3d  er->pSelect, i)=
17820 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 0a 20 20 20  =SQLITE_NULL.   
17830 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20   ){.      p->rc 
17840 3d 20 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43  = SQLITE_MISMATC
17850 48 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 45 72 72  H;.      p->zErr
17860 6d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  msg = sqlite3_mp
17870 72 69 6e 74 66 28 22 64 61 74 61 74 79 70 65 20  rintf("datatype 
17880 6d 69 73 6d 61 74 63 68 22 29 3b 0a 20 20 20 20  mismatch");.    
17890 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
178a0 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d  .    if( eType==
178b0 52 42 55 5f 44 45 4c 45 54 45 20 26 26 20 70 49  RBU_DELETE && pI
178c0 74 65 72 2d 3e 61 62 54 62 6c 50 6b 5b 69 5d 3d  ter->abTblPk[i]=
178d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74  =0 ){.      cont
178e0 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  inue;.    }..   
178f0 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f   pVal = sqlite3_
17900 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28 70 49 74  column_value(pIt
17910 65 72 2d 3e 70 53 65 6c 65 63 74 2c 20 69 29 3b  er->pSelect, i);
17920 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c  .    p->rc = sql
17930 69 74 65 33 5f 62 69 6e 64 5f 76 61 6c 75 65 28  ite3_bind_value(
17940 70 57 72 69 74 65 72 2c 20 69 2b 31 2c 20 70 56  pWriter, i+1, pV
17950 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  al);.    if( p->
17960 72 63 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7d  rc ) return;.  }
17970 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 7a 49  .  if( pIter->zI
17980 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  dx==0 ){.    if(
17990 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52   pIter->eType==R
179a0 42 55 5f 50 4b 5f 56 54 41 42 20 0a 20 20 20 20  BU_PK_VTAB .    
179b0 20 7c 7c 20 70 49 74 65 72 2d 3e 65 54 79 70 65   || pIter->eType
179c0 3d 3d 52 42 55 5f 50 4b 5f 4e 4f 4e 45 20 0a 20  ==RBU_PK_NONE . 
179d0 20 20 20 20 7c 7c 20 28 70 49 74 65 72 2d 3e 65      || (pIter->e
179e0 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 45 58 54  Type==RBU_PK_EXT
179f0 45 52 4e 41 4c 20 26 26 20 72 62 75 49 73 56 61  ERNAL && rbuIsVa
17a00 63 75 75 6d 28 70 29 29 20 0a 20 20 20 20 29 7b  cuum(p)) .    ){
17a10 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 61 20  .      /* For a 
17a20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2c 20 6f  virtual table, o
17a30 72 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 6e  r a table with n
17a40 6f 20 70 72 69 6d 61 72 79 20 6b 65 79 2c 20 74  o primary key, t
17a50 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 53 45 4c  he .      ** SEL
17a60 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 73  ECT statement is
17a70 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  :.      **.     
17a80 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 3c 63 6f   **   SELECT <co
17a90 6c 73 3e 2c 20 72 62 75 5f 63 6f 6e 74 72 6f 6c  ls>, rbu_control
17aa0 2c 20 72 62 75 5f 72 6f 77 69 64 20 46 52 4f 4d  , rbu_rowid FROM
17ab0 20 2e 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20   .....      **. 
17ac0 20 20 20 20 20 2a 2a 20 48 65 6e 63 65 20 63 6f       ** Hence co
17ad0 6c 75 6d 6e 5f 76 61 6c 75 65 28 70 49 74 65 72  lumn_value(pIter
17ae0 2d 3e 6e 43 6f 6c 2b 31 29 2e 0a 20 20 20 20 20  ->nCol+1)..     
17af0 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
17b00 43 6f 6c 75 6d 6e 4e 61 6d 65 28 70 49 74 65 72  ColumnName(pIter
17b10 2d 3e 70 53 65 6c 65 63 74 2c 20 70 49 74 65 72  ->pSelect, pIter
17b20 2d 3e 6e 43 6f 6c 2b 31 2c 20 0a 20 20 20 20 20  ->nCol+1, .     
17b30 20 20 20 20 20 72 62 75 49 73 56 61 63 75 75 6d       rbuIsVacuum
17b40 28 70 29 20 3f 20 22 72 6f 77 69 64 22 20 3a 20  (p) ? "rowid" : 
17b50 22 72 62 75 5f 72 6f 77 69 64 22 0a 20 20 20 20  "rbu_rowid".    
17b60 20 20 29 3b 0a 20 20 20 20 20 20 70 56 61 6c 20    );.      pVal 
17b70 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
17b80 5f 76 61 6c 75 65 28 70 49 74 65 72 2d 3e 70 53  _value(pIter->pS
17b90 65 6c 65 63 74 2c 20 70 49 74 65 72 2d 3e 6e 43  elect, pIter->nC
17ba0 6f 6c 2b 31 29 3b 0a 20 20 20 20 20 20 70 2d 3e  ol+1);.      p->
17bb0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e  rc = sqlite3_bin
17bc0 64 5f 76 61 6c 75 65 28 70 57 72 69 74 65 72 2c  d_value(pWriter,
17bd0 20 70 49 74 65 72 2d 3e 6e 43 6f 6c 2b 31 2c 20   pIter->nCol+1, 
17be0 70 56 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pVal);.    }.  }
17bf0 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
17c00 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
17c10 71 6c 69 74 65 33 5f 73 74 65 70 28 70 57 72 69  qlite3_step(pWri
17c20 74 65 72 29 3b 0a 20 20 20 20 70 2d 3e 72 63 20  ter);.    p->rc 
17c30 3d 20 72 65 73 65 74 41 6e 64 43 6f 6c 6c 65 63  = resetAndCollec
17c40 74 45 72 72 6f 72 28 70 57 72 69 74 65 72 2c 20  tError(pWriter, 
17c50 26 70 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a 20 20  &p->zErrmsg);.  
17c60 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
17c70 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 74 68  function does th
17c80 65 20 77 6f 72 6b 20 66 6f 72 20 61 6e 20 73 71  e work for an sq
17c90 6c 69 74 65 33 72 62 75 5f 73 74 65 70 28 29 20  lite3rbu_step() 
17ca0 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  call..**.** The 
17cb0 6f 62 6a 65 63 74 2d 69 74 65 72 61 74 6f 72 20  object-iterator 
17cc0 28 70 2d 3e 6f 62 6a 69 74 65 72 29 20 63 75 72  (p->objiter) cur
17cd0 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f  rently points to
17ce0 20 61 20 76 61 6c 69 64 20 6f 62 6a 65 63 74 2c   a valid object,
17cf0 0a 2a 2a 20 61 6e 64 20 74 68 65 20 69 6e 70 75  .** and the inpu
17d00 74 20 63 75 72 73 6f 72 20 28 70 2d 3e 6f 62 6a  t cursor (p->obj
17d10 69 74 65 72 2e 70 53 65 6c 65 63 74 29 20 63 75  iter.pSelect) cu
17d20 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74  rrently points t
17d30 6f 20 61 20 76 61 6c 69 64 0a 2a 2a 20 69 6e 70  o a valid.** inp
17d40 75 74 20 72 6f 77 2e 20 50 65 72 66 6f 72 6d 20  ut row. Perform 
17d50 77 68 61 74 65 76 65 72 20 70 72 6f 63 65 73 73  whatever process
17d60 69 6e 67 20 69 73 20 72 65 71 75 69 72 65 64 20  ing is required 
17d70 61 6e 64 20 72 65 74 75 72 6e 2e 0a 2a 2a 0a 2a  and return..**.*
17d80 2a 20 49 66 20 6e 6f 20 20 65 72 72 6f 72 20 6f  * If no  error o
17d90 63 63 75 72 73 2c 20 53 51 4c 49 54 45 5f 4f 4b  ccurs, SQLITE_OK
17da0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
17db0 68 65 72 77 69 73 65 2c 20 61 6e 20 65 72 72 6f  herwise, an erro
17dc0 72 20 63 6f 64 65 0a 2a 2a 20 61 6e 64 20 6d 65  r code.** and me
17dd0 73 73 61 67 65 20 69 73 20 6c 65 66 74 20 69 6e  ssage is left in
17de0 20 74 68 65 20 52 42 55 20 68 61 6e 64 6c 65 20   the RBU handle 
17df0 61 6e 64 20 61 20 63 6f 70 79 20 6f 66 20 74 68  and a copy of th
17e00 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20  e error code.** 
17e10 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
17e20 74 69 63 20 69 6e 74 20 72 62 75 53 74 65 70 28  tic int rbuStep(
17e30 73 71 6c 69 74 65 33 72 62 75 20 2a 70 29 7b 0a  sqlite3rbu *p){.
17e40 20 20 52 62 75 4f 62 6a 49 74 65 72 20 2a 70 49    RbuObjIter *pI
17e50 74 65 72 20 3d 20 26 70 2d 3e 6f 62 6a 69 74 65  ter = &p->objite
17e60 72 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  r;.  const char 
17e70 2a 7a 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 69 6e  *zMask = 0;.  in
17e80 74 20 65 54 79 70 65 20 3d 20 72 62 75 53 74 65  t eType = rbuSte
17e90 70 54 79 70 65 28 70 2c 20 26 7a 4d 61 73 6b 29  pType(p, &zMask)
17ea0 3b 0a 0a 20 20 69 66 28 20 65 54 79 70 65 20 29  ;..  if( eType )
17eb0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 54  {.    assert( eT
17ec0 79 70 65 3d 3d 52 42 55 5f 49 4e 53 45 52 54 20  ype==RBU_INSERT 
17ed0 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 52 42      || eType==RB
17ee0 55 5f 44 45 4c 45 54 45 0a 20 20 20 20 20 20 20  U_DELETE.       
17ef0 20 20 7c 7c 20 65 54 79 70 65 3d 3d 52 42 55 5f    || eType==RBU_
17f00 52 45 50 4c 41 43 45 20 20 20 20 7c 7c 20 65 54  REPLACE    || eT
17f10 79 70 65 3d 3d 52 42 55 5f 49 44 58 5f 44 45 4c  ype==RBU_IDX_DEL
17f20 45 54 45 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  ETE.         || 
17f30 65 54 79 70 65 3d 3d 52 42 55 5f 49 44 58 5f 49  eType==RBU_IDX_I
17f40 4e 53 45 52 54 20 7c 7c 20 65 54 79 70 65 3d 3d  NSERT || eType==
17f50 52 42 55 5f 55 50 44 41 54 45 0a 20 20 20 20 29  RBU_UPDATE.    )
17f60 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 54  ;.    assert( eT
17f70 79 70 65 21 3d 52 42 55 5f 55 50 44 41 54 45 20  ype!=RBU_UPDATE 
17f80 7c 7c 20 70 49 74 65 72 2d 3e 7a 49 64 78 3d 3d  || pIter->zIdx==
17f90 30 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 49  0 );..    if( pI
17fa0 74 65 72 2d 3e 7a 49 64 78 3d 3d 30 20 26 26 20  ter->zIdx==0 && 
17fb0 28 65 54 79 70 65 3d 3d 52 42 55 5f 49 44 58 5f  (eType==RBU_IDX_
17fc0 44 45 4c 45 54 45 20 7c 7c 20 65 54 79 70 65 3d  DELETE || eType=
17fd0 3d 52 42 55 5f 49 44 58 5f 49 4e 53 45 52 54 29  =RBU_IDX_INSERT)
17fe0 20 29 7b 0a 20 20 20 20 20 20 72 62 75 42 61 64   ){.      rbuBad
17ff0 43 6f 6e 74 72 6f 6c 45 72 72 6f 72 28 70 29 3b  ControlError(p);
18000 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20  .    }.    else 
18010 69 66 28 20 65 54 79 70 65 3d 3d 52 42 55 5f 52  if( eType==RBU_R
18020 45 50 4c 41 43 45 20 29 7b 0a 20 20 20 20 20 20  EPLACE ){.      
18030 69 66 28 20 70 49 74 65 72 2d 3e 7a 49 64 78 3d  if( pIter->zIdx=
18040 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  =0 ){.        p-
18050 3e 6e 50 68 61 73 65 4f 6e 65 53 74 65 70 20 2b  >nPhaseOneStep +
18060 3d 20 70 2d 3e 6f 62 6a 69 74 65 72 2e 6e 49 6e  = p->objiter.nIn
18070 64 65 78 3b 0a 20 20 20 20 20 20 20 20 72 62 75  dex;.        rbu
18080 53 74 65 70 4f 6e 65 4f 70 28 70 2c 20 52 42 55  StepOneOp(p, RBU
18090 5f 44 45 4c 45 54 45 29 3b 0a 20 20 20 20 20 20  _DELETE);.      
180a0 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72  }.      if( p->r
180b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c==SQLITE_OK ) r
180c0 62 75 53 74 65 70 4f 6e 65 4f 70 28 70 2c 20 52  buStepOneOp(p, R
180d0 42 55 5f 49 4e 53 45 52 54 29 3b 0a 20 20 20 20  BU_INSERT);.    
180e0 7d 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 65  }.    else if( e
180f0 54 79 70 65 21 3d 52 42 55 5f 55 50 44 41 54 45  Type!=RBU_UPDATE
18100 20 29 7b 0a 20 20 20 20 20 20 72 62 75 53 74 65   ){.      rbuSte
18110 70 4f 6e 65 4f 70 28 70 2c 20 65 54 79 70 65 29  pOneOp(p, eType)
18120 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65  ;.    }.    else
18130 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
18140 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 20  value *pVal;.   
18150 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20     sqlite3_stmt 
18160 2a 70 55 70 64 61 74 65 20 3d 20 30 3b 0a 20 20  *pUpdate = 0;.  
18170 20 20 20 20 61 73 73 65 72 74 28 20 65 54 79 70      assert( eTyp
18180 65 3d 3d 52 42 55 5f 55 50 44 41 54 45 20 29 3b  e==RBU_UPDATE );
18190 0a 20 20 20 20 20 20 70 2d 3e 6e 50 68 61 73 65  .      p->nPhase
181a0 4f 6e 65 53 74 65 70 20 2d 3d 20 70 2d 3e 6f 62  OneStep -= p->ob
181b0 6a 69 74 65 72 2e 6e 49 6e 64 65 78 3b 0a 20 20  jiter.nIndex;.  
181c0 20 20 20 20 72 62 75 47 65 74 55 70 64 61 74 65      rbuGetUpdate
181d0 53 74 6d 74 28 70 2c 20 70 49 74 65 72 2c 20 7a  Stmt(p, pIter, z
181e0 4d 61 73 6b 2c 20 26 70 55 70 64 61 74 65 29 3b  Mask, &pUpdate);
181f0 0a 20 20 20 20 20 20 69 66 28 20 70 55 70 64 61  .      if( pUpda
18200 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  te ){.        in
18210 74 20 69 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  t i;.        for
18220 28 69 3d 30 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c  (i=0; p->rc==SQL
18230 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70 49 74 65  ITE_OK && i<pIte
18240 72 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  r->nCol; i++){. 
18250 20 20 20 20 20 20 20 20 20 63 68 61 72 20 63 20           char c 
18260 3d 20 7a 4d 61 73 6b 5b 70 49 74 65 72 2d 3e 61  = zMask[pIter->a
18270 69 53 72 63 4f 72 64 65 72 5b 69 5d 5d 3b 0a 20  iSrcOrder[i]];. 
18280 20 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20           pVal = 
18290 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 76  sqlite3_column_v
182a0 61 6c 75 65 28 70 49 74 65 72 2d 3e 70 53 65 6c  alue(pIter->pSel
182b0 65 63 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20  ect, i);.       
182c0 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 61 62     if( pIter->ab
182d0 54 62 6c 50 6b 5b 69 5d 20 7c 7c 20 63 21 3d 27  TblPk[i] || c!='
182e0 2e 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  .' ){.          
182f0 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65    p->rc = sqlite
18300 33 5f 62 69 6e 64 5f 76 61 6c 75 65 28 70 55 70  3_bind_value(pUp
18310 64 61 74 65 2c 20 69 2b 31 2c 20 70 56 61 6c 29  date, i+1, pVal)
18320 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
18330 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
18340 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
18350 45 5f 4f 4b 20 0a 20 20 20 20 20 20 20 20 20 26  E_OK .         &
18360 26 20 28 70 49 74 65 72 2d 3e 65 54 79 70 65 3d  & (pIter->eType=
18370 3d 52 42 55 5f 50 4b 5f 56 54 41 42 20 7c 7c 20  =RBU_PK_VTAB || 
18380 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42  pIter->eType==RB
18390 55 5f 50 4b 5f 4e 4f 4e 45 29 20 0a 20 20 20 20  U_PK_NONE) .    
183a0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
183b0 20 2f 2a 20 42 69 6e 64 20 74 68 65 20 72 62 75   /* Bind the rbu
183c0 5f 72 6f 77 69 64 20 76 61 6c 75 65 20 74 6f 20  _rowid value to 
183d0 63 6f 6c 75 6d 6e 20 5f 72 6f 77 69 64 5f 20 2a  column _rowid_ *
183e0 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  /.          asse
183f0 72 74 43 6f 6c 75 6d 6e 4e 61 6d 65 28 70 49 74  rtColumnName(pIt
18400 65 72 2d 3e 70 53 65 6c 65 63 74 2c 20 70 49 74  er->pSelect, pIt
18410 65 72 2d 3e 6e 43 6f 6c 2b 31 2c 20 22 72 62 75  er->nCol+1, "rbu
18420 5f 72 6f 77 69 64 22 29 3b 0a 20 20 20 20 20 20  _rowid");.      
18430 20 20 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74      pVal = sqlit
18440 65 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28  e3_column_value(
18450 70 49 74 65 72 2d 3e 70 53 65 6c 65 63 74 2c 20  pIter->pSelect, 
18460 70 49 74 65 72 2d 3e 6e 43 6f 6c 2b 31 29 3b 0a  pIter->nCol+1);.
18470 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20            p->rc 
18480 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 76  = sqlite3_bind_v
18490 61 6c 75 65 28 70 55 70 64 61 74 65 2c 20 70 49  alue(pUpdate, pI
184a0 74 65 72 2d 3e 6e 43 6f 6c 2b 31 2c 20 70 56 61  ter->nCol+1, pVa
184b0 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  l);.        }.  
184c0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
184d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
184e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
184f0 73 74 65 70 28 70 55 70 64 61 74 65 29 3b 0a 20  step(pUpdate);. 
18500 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d           p->rc =
18510 20 72 65 73 65 74 41 6e 64 43 6f 6c 6c 65 63 74   resetAndCollect
18520 45 72 72 6f 72 28 70 55 70 64 61 74 65 2c 20 26  Error(pUpdate, &
18530 70 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a 20 20 20  p->zErrmsg);.   
18540 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
18550 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
18560 6e 20 70 2d 3e 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  n p->rc;.}../*.*
18570 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
18580 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 6f 66  schema cookie of
18590 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
185a0 73 65 20 6f 70 65 6e 65 64 20 62 79 20 70 2d 3e  se opened by p->
185b0 64 62 4d 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 4f 72  dbMain..**.** Or
185c0 2c 20 69 66 20 74 68 69 73 20 69 73 20 61 6e 20  , if this is an 
185d0 52 42 55 20 76 61 63 75 75 6d 2c 20 73 65 74 20  RBU vacuum, set 
185e0 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69  the schema cooki
185f0 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 64 62  e of the main db
18600 0a 2a 2a 20 6f 70 65 6e 65 64 20 62 79 20 70 2d  .** opened by p-
18610 3e 64 62 4d 61 69 6e 20 74 6f 20 6f 6e 65 20 6d  >dbMain to one m
18620 6f 72 65 20 74 68 61 6e 20 74 68 65 20 73 63 68  ore than the sch
18630 65 6d 61 20 63 6f 6f 6b 69 65 20 6f 66 20 74 68  ema cookie of th
18640 65 20 6d 61 69 6e 0a 2a 2a 20 64 62 20 6f 70 65  e main.** db ope
18650 6e 65 64 20 62 79 20 70 2d 3e 64 62 52 62 75 2e  ned by p->dbRbu.
18660 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
18670 72 62 75 49 6e 63 72 53 63 68 65 6d 61 43 6f 6f  rbuIncrSchemaCoo
18680 6b 69 65 28 73 71 6c 69 74 65 33 72 62 75 20 2a  kie(sqlite3rbu *
18690 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  p){.  if( p->rc=
186a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
186b0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 72 65 61    sqlite3 *dbrea
186c0 64 20 3d 20 28 72 62 75 49 73 56 61 63 75 75 6d  d = (rbuIsVacuum
186d0 28 70 29 20 3f 20 70 2d 3e 64 62 52 62 75 20 3a  (p) ? p->dbRbu :
186e0 20 70 2d 3e 64 62 4d 61 69 6e 29 3b 0a 20 20 20   p->dbMain);.   
186f0 20 69 6e 74 20 69 43 6f 6f 6b 69 65 20 3d 20 31   int iCookie = 1
18700 30 30 30 30 30 30 3b 0a 20 20 20 20 73 71 6c 69  000000;.    sqli
18710 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
18720 0a 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 72  ..    p->rc = pr
18730 65 70 61 72 65 41 6e 64 43 6f 6c 6c 65 63 74 45  epareAndCollectE
18740 72 72 6f 72 28 64 62 72 65 61 64 2c 20 26 70 53  rror(dbread, &pS
18750 74 6d 74 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67  tmt, &p->zErrmsg
18760 2c 20 0a 20 20 20 20 20 20 20 20 22 50 52 41 47  , .        "PRAG
18770 4d 41 20 73 63 68 65 6d 61 5f 76 65 72 73 69 6f  MA schema_versio
18780 6e 22 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  n".    );.    if
18790 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
187a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43  OK ){.      /* C
187b0 6f 76 65 72 61 67 65 3a 20 69 74 20 6d 61 79 20  overage: it may 
187c0 62 65 20 74 68 61 74 20 74 68 69 73 20 73 71 6c  be that this sql
187d0 69 74 65 33 5f 73 74 65 70 28 29 20 63 61 6e 6e  ite3_step() cann
187e0 6f 74 20 66 61 69 6c 2e 20 54 68 65 72 65 0a 20  ot fail. There. 
187f0 20 20 20 20 20 2a 2a 20 69 73 20 61 6c 72 65 61       ** is alrea
18800 64 79 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  dy a transaction
18810 20 6f 70 65 6e 2c 20 73 6f 20 74 68 65 20 70 72   open, so the pr
18820 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
18830 20 63 61 6e 6e 6f 74 0a 20 20 20 20 20 20 2a 2a   cannot.      **
18840 20 74 68 72 6f 77 20 61 6e 20 53 51 4c 49 54 45   throw an SQLITE
18850 5f 53 43 48 45 4d 41 20 65 78 63 65 70 74 69 6f  _SCHEMA exceptio
18860 6e 2e 20 54 68 65 20 6f 6e 6c 79 20 64 61 74 61  n. The only data
18870 62 61 73 65 20 70 61 67 65 20 74 68 65 0a 20 20  base page the.  
18880 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
18890 20 72 65 61 64 73 20 69 73 20 70 61 67 65 20 31   reads is page 1
188a0 2c 20 77 68 69 63 68 20 69 73 20 67 75 61 72 61  , which is guara
188b0 6e 74 65 65 64 20 74 6f 20 62 65 20 69 6e 20 74  nteed to be in t
188c0 68 65 20 63 61 63 68 65 2e 0a 20 20 20 20 20 20  he cache..      
188d0 2a 2a 20 41 6e 64 20 6e 6f 20 6d 65 6d 6f 72 79  ** And no memory
188e0 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 61 72 65   allocations are
188f0 20 72 65 71 75 69 72 65 64 2e 20 20 2a 2f 0a 20   required.  */. 
18900 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f       if( SQLITE_
18910 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW==sqlite3_ste
18920 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20  p(pStmt) ){.    
18930 20 20 20 20 69 43 6f 6f 6b 69 65 20 3d 20 73 71      iCookie = sq
18940 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
18950 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  (pStmt, 0);.    
18960 20 20 7d 0a 20 20 20 20 20 20 72 62 75 46 69 6e    }.      rbuFin
18970 61 6c 69 7a 65 28 70 2c 20 70 53 74 6d 74 29 3b  alize(p, pStmt);
18980 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
18990 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
189a0 29 7b 0a 20 20 20 20 20 20 72 62 75 4d 50 72 69  ){.      rbuMPri
189b0 6e 74 66 45 78 65 63 28 70 2c 20 70 2d 3e 64 62  ntfExec(p, p->db
189c0 4d 61 69 6e 2c 20 22 50 52 41 47 4d 41 20 73 63  Main, "PRAGMA sc
189d0 68 65 6d 61 5f 76 65 72 73 69 6f 6e 20 3d 20 25  hema_version = %
189e0 64 22 2c 20 69 43 6f 6f 6b 69 65 2b 31 29 3b 0a  d", iCookie+1);.
189f0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
18a00 2a 2a 20 55 70 64 61 74 65 20 74 68 65 20 63 6f  ** Update the co
18a10 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 72 62  ntents of the rb
18a20 75 5f 73 74 61 74 65 20 74 61 62 6c 65 20 77 69  u_state table wi
18a30 74 68 69 6e 20 74 68 65 20 72 62 75 20 64 61 74  thin the rbu dat
18a40 61 62 61 73 65 2e 20 54 68 65 0a 2a 2a 20 76 61  abase. The.** va
18a50 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68  lue stored in th
18a60 65 20 52 42 55 5f 53 54 41 54 45 5f 53 54 41 47  e RBU_STATE_STAG
18a70 45 20 63 6f 6c 75 6d 6e 20 69 73 20 65 53 74 61  E column is eSta
18a80 67 65 2e 20 41 6c 6c 20 6f 74 68 65 72 20 76 61  ge. All other va
18a90 6c 75 65 73 0a 2a 2a 20 61 72 65 20 64 65 74 65  lues.** are dete
18aa0 72 6d 69 6e 65 64 20 62 79 20 69 6e 73 70 65 63  rmined by inspec
18ab0 74 69 6e 67 20 74 68 65 20 72 62 75 20 68 61 6e  ting the rbu han
18ac0 64 6c 65 20 70 61 73 73 65 64 20 61 73 20 74 68  dle passed as th
18ad0 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
18ae0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
18af0 20 72 62 75 53 61 76 65 53 74 61 74 65 28 73 71   rbuSaveState(sq
18b00 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 69 6e 74  lite3rbu *p, int
18b10 20 65 53 74 61 67 65 29 7b 0a 20 20 69 66 28 20   eStage){.  if( 
18b20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
18b30 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54   || p->rc==SQLIT
18b40 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 73 71  E_DONE ){.    sq
18b50 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 49 6e 73  lite3_stmt *pIns
18b60 65 72 74 20 3d 20 30 3b 0a 20 20 20 20 72 62 75  ert = 0;.    rbu
18b70 5f 66 69 6c 65 20 2a 70 46 64 20 3d 20 28 72 62  _file *pFd = (rb
18b80 75 49 73 56 61 63 75 75 6d 28 70 29 20 3f 20 70  uIsVacuum(p) ? p
18b90 2d 3e 70 52 62 75 46 64 20 3a 20 70 2d 3e 70 54  ->pRbuFd : p->pT
18ba0 61 72 67 65 74 46 64 29 3b 0a 20 20 20 20 69 6e  argetFd);.    in
18bb0 74 20 72 63 3b 0a 0a 20 20 20 20 61 73 73 65 72  t rc;..    asser
18bc0 74 28 20 70 2d 3e 7a 45 72 72 6d 73 67 3d 3d 30  t( p->zErrmsg==0
18bd0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 72 65   );.    rc = pre
18be0 70 61 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65  pareFreeAndColle
18bf0 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 52 62 75  ctError(p->dbRbu
18c00 2c 20 26 70 49 6e 73 65 72 74 2c 20 26 70 2d 3e  , &pInsert, &p->
18c10 7a 45 72 72 6d 73 67 2c 20 0a 20 20 20 20 20 20  zErrmsg, .      
18c20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74    sqlite3_mprint
18c30 66 28 0a 20 20 20 20 20 20 20 20 20 20 22 49 4e  f(.          "IN
18c40 53 45 52 54 20 4f 52 20 52 45 50 4c 41 43 45 20  SERT OR REPLACE 
18c50 49 4e 54 4f 20 25 73 2e 72 62 75 5f 73 74 61 74  INTO %s.rbu_stat
18c60 65 28 6b 2c 20 76 29 20 56 41 4c 55 45 53 20 22  e(k, v) VALUES "
18c70 0a 20 20 20 20 20 20 20 20 20 20 22 28 25 64 2c  .          "(%d,
18c80 20 25 64 29 2c 20 22 0a 20 20 20 20 20 20 20 20   %d), ".        
18c90 20 20 22 28 25 64 2c 20 25 51 29 2c 20 22 0a 20    "(%d, %Q), ". 
18ca0 20 20 20 20 20 20 20 20 20 22 28 25 64 2c 20 25           "(%d, %
18cb0 51 29 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20  Q), ".          
18cc0 22 28 25 64 2c 20 25 64 29 2c 20 22 0a 20 20 20  "(%d, %d), ".   
18cd0 20 20 20 20 20 20 20 22 28 25 64 2c 20 25 64 29         "(%d, %d)
18ce0 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 22 28  , ".          "(
18cf0 25 64 2c 20 25 6c 6c 64 29 2c 20 22 0a 20 20 20  %d, %lld), ".   
18d00 20 20 20 20 20 20 20 22 28 25 64 2c 20 25 6c 6c         "(%d, %ll
18d10 64 29 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20  d), ".          
18d20 22 28 25 64 2c 20 25 6c 6c 64 29 2c 20 22 0a 20  "(%d, %lld), ". 
18d30 20 20 20 20 20 20 20 20 20 22 28 25 64 2c 20 25           "(%d, %
18d40 6c 6c 64 29 20 22 2c 0a 20 20 20 20 20 20 20 20  lld) ",.        
18d50 20 20 70 2d 3e 7a 53 74 61 74 65 44 62 2c 0a 20    p->zStateDb,. 
18d60 20 20 20 20 20 20 20 20 20 52 42 55 5f 53 54 41           RBU_STA
18d70 54 45 5f 53 54 41 47 45 2c 20 65 53 74 61 67 65  TE_STAGE, eStage
18d80 2c 0a 20 20 20 20 20 20 20 20 20 20 52 42 55 5f  ,.          RBU_
18d90 53 54 41 54 45 5f 54 42 4c 2c 20 70 2d 3e 6f 62  STATE_TBL, p->ob
18da0 6a 69 74 65 72 2e 7a 54 62 6c 2c 20 0a 20 20 20  jiter.zTbl, .   
18db0 20 20 20 20 20 20 20 52 42 55 5f 53 54 41 54 45         RBU_STATE
18dc0 5f 49 44 58 2c 20 70 2d 3e 6f 62 6a 69 74 65 72  _IDX, p->objiter
18dd0 2e 7a 49 64 78 2c 20 0a 20 20 20 20 20 20 20 20  .zIdx, .        
18de0 20 20 52 42 55 5f 53 54 41 54 45 5f 52 4f 57 2c    RBU_STATE_ROW,
18df0 20 70 2d 3e 6e 53 74 65 70 2c 20 0a 20 20 20 20   p->nStep, .    
18e00 20 20 20 20 20 20 52 42 55 5f 53 54 41 54 45 5f        RBU_STATE_
18e10 50 52 4f 47 52 45 53 53 2c 20 70 2d 3e 6e 50 72  PROGRESS, p->nPr
18e20 6f 67 72 65 73 73 2c 0a 20 20 20 20 20 20 20 20  ogress,.        
18e30 20 20 52 42 55 5f 53 54 41 54 45 5f 43 4b 50 54    RBU_STATE_CKPT
18e40 2c 20 70 2d 3e 69 57 61 6c 43 6b 73 75 6d 2c 0a  , p->iWalCksum,.
18e50 20 20 20 20 20 20 20 20 20 20 52 42 55 5f 53 54            RBU_ST
18e60 41 54 45 5f 43 4f 4f 4b 49 45 2c 20 28 69 36 34  ATE_COOKIE, (i64
18e70 29 70 46 64 2d 3e 69 43 6f 6f 6b 69 65 2c 0a 20  )pFd->iCookie,. 
18e80 20 20 20 20 20 20 20 20 20 52 42 55 5f 53 54 41           RBU_STA
18e90 54 45 5f 4f 41 4c 53 5a 2c 20 70 2d 3e 69 4f 61  TE_OALSZ, p->iOa
18ea0 6c 53 7a 2c 0a 20 20 20 20 20 20 20 20 20 20 52  lSz,.          R
18eb0 42 55 5f 53 54 41 54 45 5f 50 48 41 53 45 4f 4e  BU_STATE_PHASEON
18ec0 45 53 54 45 50 2c 20 70 2d 3e 6e 50 68 61 73 65  ESTEP, p->nPhase
18ed0 4f 6e 65 53 74 65 70 0a 20 20 20 20 20 20 29 0a  OneStep.      ).
18ee0 20 20 20 20 29 3b 0a 20 20 20 20 61 73 73 65 72      );.    asser
18ef0 74 28 20 70 49 6e 73 65 72 74 3d 3d 30 20 7c 7c  t( pInsert==0 ||
18f00 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
18f10 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  ;..    if( rc==S
18f20 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
18f30 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70    sqlite3_step(p
18f40 49 6e 73 65 72 74 29 3b 0a 20 20 20 20 20 20 72  Insert);.      r
18f50 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  c = sqlite3_fina
18f60 6c 69 7a 65 28 70 49 6e 73 65 72 74 29 3b 0a 20  lize(pInsert);. 
18f70 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21     }.    if( rc!
18f80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 2d 3e  =SQLITE_OK ) p->
18f90 72 63 20 3d 20 72 63 3b 0a 20 20 7d 0a 7d 0a 0a  rc = rc;.  }.}..
18fa0 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e  ./*.** The secon
18fb0 64 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65  d argument passe
18fc0 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  d to this functi
18fd0 6f 6e 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  on is the name o
18fe0 66 20 61 20 50 52 41 47 4d 41 20 0a 2a 2a 20 73  f a PRAGMA .** s
18ff0 65 74 74 69 6e 67 20 2d 20 22 70 61 67 65 5f 73  etting - "page_s
19000 69 7a 65 22 2c 20 22 61 75 74 6f 5f 76 61 63 75  ize", "auto_vacu
19010 75 6d 22 2c 20 22 75 73 65 72 5f 76 65 72 73 69  um", "user_versi
19020 6f 6e 22 20 6f 72 20 22 61 70 70 6c 69 63 61 74  on" or "applicat
19030 69 6f 6e 5f 69 64 22 2e 0a 2a 2a 20 54 68 69 73  ion_id"..** This
19040 20 66 75 6e 63 74 69 6f 6e 20 65 78 65 63 75 74   function execut
19050 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  es the following
19060 20 6f 6e 20 73 71 6c 69 74 65 33 72 62 75 2e 64   on sqlite3rbu.d
19070 62 52 62 75 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 50  bRbu:.**.**   "P
19080 52 41 47 4d 41 20 6d 61 69 6e 2e 24 7a 50 72 61  RAGMA main.$zPra
19090 67 6d 61 22 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65  gma".**.** where
190a0 20 24 7a 50 72 61 67 6d 61 20 69 73 20 74 68 65   $zPragma is the
190b0 20 73 74 72 69 6e 67 20 70 61 73 73 65 64 20 61   string passed a
190c0 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
190d0 75 6d 65 6e 74 2c 20 74 68 65 6e 0a 2a 2a 20 6f  ument, then.** o
190e0 6e 20 73 71 6c 69 74 65 33 72 62 75 2e 64 62 4d  n sqlite3rbu.dbM
190f0 61 69 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 50 52  ain:.**.**   "PR
19100 41 47 4d 41 20 6d 61 69 6e 2e 24 7a 50 72 61 67  AGMA main.$zPrag
19110 6d 61 20 3d 20 24 76 61 6c 22 0a 2a 2a 0a 2a 2a  ma = $val".**.**
19120 20 77 68 65 72 65 20 24 76 61 6c 20 69 73 20 74   where $val is t
19130 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
19140 64 20 62 79 20 74 68 65 20 66 69 72 73 74 20 50  d by the first P
19150 52 41 47 4d 41 20 69 6e 76 6f 63 61 74 69 6f 6e  RAGMA invocation
19160 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 73 68 6f 72 74  ..**.** In short
19170 2c 20 69 74 20 63 6f 70 69 65 73 20 74 68 65 20  , it copies the 
19180 76 61 6c 75 65 20 20 6f 66 20 74 68 65 20 73 70  value  of the sp
19190 65 63 69 66 69 65 64 20 50 52 41 47 4d 41 20 73  ecified PRAGMA s
191a0 65 74 74 69 6e 67 20 66 72 6f 6d 0a 2a 2a 20 64  etting from.** d
191b0 62 52 62 75 20 74 6f 20 64 62 4d 61 69 6e 2e 0a  bRbu to dbMain..
191c0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
191d0 62 75 43 6f 70 79 50 72 61 67 6d 61 28 73 71 6c  buCopyPragma(sql
191e0 69 74 65 33 72 62 75 20 2a 70 2c 20 63 6f 6e 73  ite3rbu *p, cons
191f0 74 20 63 68 61 72 20 2a 7a 50 72 61 67 6d 61 29  t char *zPragma)
19200 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  {.  if( p->rc==S
19210 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19220 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 50  sqlite3_stmt *pP
19230 72 61 67 6d 61 20 3d 20 30 3b 0a 20 20 20 20 70  ragma = 0;.    p
19240 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65 46 72  ->rc = prepareFr
19250 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f  eeAndCollectErro
19260 72 28 70 2d 3e 64 62 52 62 75 2c 20 26 70 50 72  r(p->dbRbu, &pPr
19270 61 67 6d 61 2c 20 26 70 2d 3e 7a 45 72 72 6d 73  agma, &p->zErrms
19280 67 2c 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69  g, .        sqli
19290 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 50 52 41  te3_mprintf("PRA
192a0 47 4d 41 20 6d 61 69 6e 2e 25 73 22 2c 20 7a 50  GMA main.%s", zP
192b0 72 61 67 6d 61 29 0a 20 20 20 20 29 3b 0a 20 20  ragma).    );.  
192c0 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
192d0 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45  ITE_OK && SQLITE
192e0 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74  _ROW==sqlite3_st
192f0 65 70 28 70 50 72 61 67 6d 61 29 20 29 7b 0a 20  ep(pPragma) ){. 
19300 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 62 75       p->rc = rbu
19310 4d 50 72 69 6e 74 66 45 78 65 63 28 70 2c 20 70  MPrintfExec(p, p
19320 2d 3e 64 62 4d 61 69 6e 2c 20 22 50 52 41 47 4d  ->dbMain, "PRAGM
19330 41 20 6d 61 69 6e 2e 25 73 20 3d 20 25 64 22 2c  A main.%s = %d",
19340 0a 20 20 20 20 20 20 20 20 20 20 7a 50 72 61 67  .          zPrag
19350 6d 61 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ma, sqlite3_colu
19360 6d 6e 5f 69 6e 74 28 70 50 72 61 67 6d 61 2c 20  mn_int(pPragma, 
19370 30 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  0).      );.    
19380 7d 0a 20 20 20 20 72 62 75 46 69 6e 61 6c 69 7a  }.    rbuFinaliz
19390 65 28 70 2c 20 70 50 72 61 67 6d 61 29 3b 0a 20  e(p, pPragma);. 
193a0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20   }.}../*.** The 
193b0 52 42 55 20 68 61 6e 64 6c 65 20 70 61 73 73 65  RBU handle passe
193c0 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72  d as the only ar
193d0 67 75 6d 65 6e 74 20 68 61 73 20 6a 75 73 74 20  gument has just 
193e0 62 65 65 6e 20 6f 70 65 6e 65 64 20 61 6e 64 20  been opened and 
193f0 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20 64 61  .** the state da
19400 74 61 62 61 73 65 20 69 73 20 65 6d 70 74 79 2e  tabase is empty.
19410 20 49 66 20 74 68 69 73 20 52 42 55 20 68 61 6e   If this RBU han
19420 64 6c 65 20 77 61 73 20 6f 70 65 6e 65 64 20 66  dle was opened f
19430 6f 72 20 61 6e 0a 2a 2a 20 52 42 55 20 76 61 63  or an.** RBU vac
19440 75 75 6d 20 6f 70 65 72 61 74 69 6f 6e 2c 20 63  uum operation, c
19450 72 65 61 74 65 20 74 68 65 20 73 63 68 65 6d 61  reate the schema
19460 20 69 6e 20 74 68 65 20 74 61 72 67 65 74 20 64   in the target d
19470 62 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  b..*/.static voi
19480 64 20 72 62 75 43 72 65 61 74 65 54 61 72 67 65  d rbuCreateTarge
19490 74 53 63 68 65 6d 61 28 73 71 6c 69 74 65 33 72  tSchema(sqlite3r
194a0 62 75 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65  bu *p){.  sqlite
194b0 33 5f 73 74 6d 74 20 2a 70 53 71 6c 20 3d 20 30  3_stmt *pSql = 0
194c0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ;.  sqlite3_stmt
194d0 20 2a 70 49 6e 73 65 72 74 20 3d 20 30 3b 0a 0a   *pInsert = 0;..
194e0 20 20 61 73 73 65 72 74 28 20 72 62 75 49 73 56    assert( rbuIsV
194f0 61 63 75 75 6d 28 70 29 20 29 3b 0a 20 20 70 2d  acuum(p) );.  p-
19500 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78  >rc = sqlite3_ex
19510 65 63 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 50  ec(p->dbMain, "P
19520 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73  RAGMA writable_s
19530 63 68 65 6d 61 3d 31 22 2c 20 30 2c 30 2c 20 26  chema=1", 0,0, &
19540 70 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a 20 20 69  p->zErrmsg);.  i
19550 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
19560 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63  _OK ){.    p->rc
19570 20 3d 20 70 72 65 70 61 72 65 41 6e 64 43 6f 6c   = prepareAndCol
19580 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 52  lectError(p->dbR
19590 62 75 2c 20 26 70 53 71 6c 2c 20 26 70 2d 3e 7a  bu, &pSql, &p->z
195a0 45 72 72 6d 73 67 2c 20 0a 20 20 20 20 20 20 22  Errmsg, .      "
195b0 53 45 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d 20  SELECT sql FROM 
195c0 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 57 48  sqlite_master WH
195d0 45 52 45 20 73 71 6c 21 3d 27 27 20 41 4e 44 20  ERE sql!='' AND 
195e0 72 6f 6f 74 70 61 67 65 21 3d 30 22 0a 20 20 20  rootpage!=0".   
195f0 20 20 20 22 20 41 4e 44 20 6e 61 6d 65 21 3d 27     " AND name!='
19600 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 27  sqlite_sequence'
19610 20 22 0a 20 20 20 20 20 20 22 20 4f 52 44 45 52   ".      " ORDER
19620 20 42 59 20 74 79 70 65 20 44 45 53 43 22 0a 20   BY type DESC". 
19630 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 77 68 69     );.  }..  whi
19640 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  le( p->rc==SQLIT
19650 45 5f 4f 4b 20 26 26 20 73 71 6c 69 74 65 33 5f  E_OK && sqlite3_
19660 73 74 65 70 28 70 53 71 6c 29 3d 3d 53 51 4c 49  step(pSql)==SQLI
19670 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 63 6f  TE_ROW ){.    co
19680 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d  nst char *zSql =
19690 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
196a0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
196b0 74 28 70 53 71 6c 2c 20 30 29 3b 0a 20 20 20 20  t(pSql, 0);.    
196c0 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  p->rc = sqlite3_
196d0 65 78 65 63 28 70 2d 3e 64 62 4d 61 69 6e 2c 20  exec(p->dbMain, 
196e0 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 26 70 2d 3e  zSql, 0, 0, &p->
196f0 7a 45 72 72 6d 73 67 29 3b 0a 20 20 7d 0a 20 20  zErrmsg);.  }.  
19700 72 62 75 46 69 6e 61 6c 69 7a 65 28 70 2c 20 70  rbuFinalize(p, p
19710 53 71 6c 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72  Sql);.  if( p->r
19720 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
19730 65 74 75 72 6e 3b 0a 0a 20 20 69 66 28 20 70 2d  eturn;..  if( p-
19740 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
19750 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 72  {.    p->rc = pr
19760 65 70 61 72 65 41 6e 64 43 6f 6c 6c 65 63 74 45  epareAndCollectE
19770 72 72 6f 72 28 70 2d 3e 64 62 52 62 75 2c 20 26  rror(p->dbRbu, &
19780 70 53 71 6c 2c 20 26 70 2d 3e 7a 45 72 72 6d 73  pSql, &p->zErrms
19790 67 2c 20 0a 20 20 20 20 20 20 20 20 22 53 45 4c  g, .        "SEL
197a0 45 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74  ECT * FROM sqlit
197b0 65 5f 6d 61 73 74 65 72 20 57 48 45 52 45 20 72  e_master WHERE r
197c0 6f 6f 74 70 61 67 65 3d 30 20 4f 52 20 72 6f 6f  ootpage=0 OR roo
197d0 74 70 61 67 65 20 49 53 20 4e 55 4c 4c 22 20 0a  tpage IS NULL" .
197e0 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 69 66      );.  }..  if
197f0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
19800 4f 4b 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  OK ){.    p->rc 
19810 3d 20 70 72 65 70 61 72 65 41 6e 64 43 6f 6c 6c  = prepareAndColl
19820 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 4d 61  ectError(p->dbMa
19830 69 6e 2c 20 26 70 49 6e 73 65 72 74 2c 20 26 70  in, &pInsert, &p
19840 2d 3e 7a 45 72 72 6d 73 67 2c 20 0a 20 20 20 20  ->zErrmsg, .    
19850 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f      "INSERT INTO
19860 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 56   sqlite_master V
19870 41 4c 55 45 53 28 3f 2c 3f 2c 3f 2c 3f 2c 3f 29  ALUES(?,?,?,?,?)
19880 22 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20  ".    );.  }..  
19890 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51  while( p->rc==SQ
198a0 4c 49 54 45 5f 4f 4b 20 26 26 20 73 71 6c 69 74  LITE_OK && sqlit
198b0 65 33 5f 73 74 65 70 28 70 53 71 6c 29 3d 3d 53  e3_step(pSql)==S
198c0 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20  QLITE_ROW ){.   
198d0 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
198e0 69 3d 30 3b 20 69 3c 35 3b 20 69 2b 2b 29 7b 0a  i=0; i<5; i++){.
198f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
19900 6e 64 5f 76 61 6c 75 65 28 70 49 6e 73 65 72 74  nd_value(pInsert
19910 2c 20 69 2b 31 2c 20 73 71 6c 69 74 65 33 5f 63  , i+1, sqlite3_c
19920 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28 70 53 71 6c  olumn_value(pSql
19930 2c 20 69 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  , i));.    }.   
19940 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 49   sqlite3_step(pI
19950 6e 73 65 72 74 29 3b 0a 20 20 20 20 70 2d 3e 72  nsert);.    p->r
19960 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
19970 74 28 70 49 6e 73 65 72 74 29 3b 0a 20 20 7d 0a  t(pInsert);.  }.
19980 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
19990 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d  ITE_OK ){.    p-
199a0 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78  >rc = sqlite3_ex
199b0 65 63 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 50  ec(p->dbMain, "P
199c0 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73  RAGMA writable_s
199d0 63 68 65 6d 61 3d 30 22 2c 30 2c 30 2c 26 70 2d  chema=0",0,0,&p-
199e0 3e 7a 45 72 72 6d 73 67 29 3b 0a 20 20 7d 0a 0a  >zErrmsg);.  }..
199f0 20 20 72 62 75 46 69 6e 61 6c 69 7a 65 28 70 2c    rbuFinalize(p,
19a00 20 70 53 71 6c 29 3b 0a 20 20 72 62 75 46 69 6e   pSql);.  rbuFin
19a10 61 6c 69 7a 65 28 70 2c 20 70 49 6e 73 65 72 74  alize(p, pInsert
19a20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70  );.}../*.** Step
19a30 20 74 68 65 20 52 42 55 20 6f 62 6a 65 63 74 2e   the RBU object.
19a40 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 72  .*/.int sqlite3r
19a50 62 75 5f 73 74 65 70 28 73 71 6c 69 74 65 33 72  bu_step(sqlite3r
19a60 62 75 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20  bu *p){.  if( p 
19a70 29 7b 0a 20 20 20 20 73 77 69 74 63 68 28 20 70  ){.    switch( p
19a80 2d 3e 65 53 74 61 67 65 20 29 7b 0a 20 20 20 20  ->eStage ){.    
19a90 20 20 63 61 73 65 20 52 42 55 5f 53 54 41 47 45    case RBU_STAGE
19aa0 5f 4f 41 4c 3a 20 7b 0a 20 20 20 20 20 20 20 20  _OAL: {.        
19ab0 52 62 75 4f 62 6a 49 74 65 72 20 2a 70 49 74 65  RbuObjIter *pIte
19ac0 72 20 3d 20 26 70 2d 3e 6f 62 6a 69 74 65 72 3b  r = &p->objiter;
19ad0 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  ..        /* If 
19ae0 74 68 69 73 20 69 73 20 61 6e 20 52 42 55 20 76  this is an RBU v
19af0 61 63 75 75 6d 20 6f 70 65 72 61 74 69 6f 6e 20  acuum operation 
19b00 61 6e 64 20 74 68 65 20 73 74 61 74 65 20 74 61  and the state ta
19b10 62 6c 65 20 77 61 73 20 65 6d 70 74 79 0a 20 20  ble was empty.  
19b20 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 74 68        ** when th
19b30 69 73 20 68 61 6e 64 6c 65 20 77 61 73 20 6f 70  is handle was op
19b40 65 6e 65 64 2c 20 63 72 65 61 74 65 20 74 68 65  ened, create the
19b50 20 74 61 72 67 65 74 20 64 61 74 61 62 61 73 65   target database
19b60 20 73 63 68 65 6d 61 2e 20 2a 2f 0a 20 20 20 20   schema. */.    
19b70 20 20 20 20 69 66 28 20 72 62 75 49 73 56 61 63      if( rbuIsVac
19b80 75 75 6d 28 70 29 20 26 26 20 70 2d 3e 6e 50 72  uum(p) && p->nPr
19b90 6f 67 72 65 73 73 3d 3d 30 20 26 26 20 70 2d 3e  ogress==0 && p->
19ba0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
19bb0 0a 20 20 20 20 20 20 20 20 20 20 72 62 75 43 72  .          rbuCr
19bc0 65 61 74 65 54 61 72 67 65 74 53 63 68 65 6d 61  eateTargetSchema
19bd0 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  (p);.          r
19be0 62 75 43 6f 70 79 50 72 61 67 6d 61 28 70 2c 20  buCopyPragma(p, 
19bf0 22 75 73 65 72 5f 76 65 72 73 69 6f 6e 22 29 3b  "user_version");
19c00 0a 20 20 20 20 20 20 20 20 20 20 72 62 75 43 6f  .          rbuCo
19c10 70 79 50 72 61 67 6d 61 28 70 2c 20 22 61 70 70  pyPragma(p, "app
19c20 6c 69 63 61 74 69 6f 6e 5f 69 64 22 29 3b 0a 20  lication_id");. 
19c30 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
19c40 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d    while( p->rc==
19c50 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 49 74  SQLITE_OK && pIt
19c60 65 72 2d 3e 7a 54 62 6c 20 29 7b 0a 0a 20 20 20  er->zTbl ){..   
19c70 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72         if( pIter
19c80 2d 3e 62 43 6c 65 61 6e 75 70 20 29 7b 0a 20 20  ->bCleanup ){.  
19c90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6c 65            /* Cle
19ca0 61 6e 20 75 70 20 74 68 65 20 72 62 75 5f 74 6d  an up the rbu_tm
19cb0 70 5f 78 78 78 20 74 61 62 6c 65 20 66 6f 72 20  p_xxx table for 
19cc0 74 68 65 20 70 72 65 76 69 6f 75 73 20 74 61 62  the previous tab
19cd0 6c 65 2e 20 49 74 20 0a 20 20 20 20 20 20 20 20  le. It .        
19ce0 20 20 20 20 2a 2a 20 63 61 6e 6e 6f 74 20 62 65      ** cannot be
19cf0 20 64 72 6f 70 70 65 64 20 61 73 20 74 68 65 72   dropped as ther
19d00 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20  e are currently 
19d10 61 63 74 69 76 65 20 53 51 4c 20 73 74 61 74 65  active SQL state
19d20 6d 65 6e 74 73 2e 0a 20 20 20 20 20 20 20 20 20  ments..         
19d30 20 20 20 2a 2a 20 42 75 74 20 74 68 65 20 63 6f     ** But the co
19d40 6e 74 65 6e 74 73 20 63 61 6e 20 62 65 20 64 65  ntents can be de
19d50 6c 65 74 65 64 2e 20 20 2a 2f 0a 20 20 20 20 20  leted.  */.     
19d60 20 20 20 20 20 20 20 69 66 28 20 72 62 75 49 73         if( rbuIs
19d70 56 61 63 75 75 6d 28 70 29 3d 3d 30 20 26 26 20  Vacuum(p)==0 && 
19d80 70 49 74 65 72 2d 3e 61 62 49 6e 64 65 78 65 64  pIter->abIndexed
19d90 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
19da0 20 20 72 62 75 4d 50 72 69 6e 74 66 45 78 65 63    rbuMPrintfExec
19db0 28 70 2c 20 70 2d 3e 64 62 52 62 75 2c 20 0a 20  (p, p->dbRbu, . 
19dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19dd0 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 73   "DELETE FROM %s
19de0 2e 27 72 62 75 5f 74 6d 70 5f 25 71 27 22 2c 20  .'rbu_tmp_%q'", 
19df0 70 2d 3e 7a 53 74 61 74 65 44 62 2c 20 70 49 74  p->zStateDb, pIt
19e00 65 72 2d 3e 7a 44 61 74 61 54 62 6c 0a 20 20 20  er->zDataTbl.   
19e10 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20             );.  
19e20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
19e30 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
19e40 20 20 20 20 20 20 20 20 20 72 62 75 4f 62 6a 49           rbuObjI
19e50 74 65 72 50 72 65 70 61 72 65 41 6c 6c 28 70 2c  terPrepareAll(p,
19e60 20 70 49 74 65 72 2c 20 30 29 3b 0a 0a 20 20 20   pIter, 0);..   
19e70 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 76 61           /* Adva
19e80 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20  nce to the next 
19e90 72 6f 77 20 74 6f 20 70 72 6f 63 65 73 73 2e 20  row to process. 
19ea0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  */.            i
19eb0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
19ec0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
19ed0 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71       int rc = sq
19ee0 6c 69 74 65 33 5f 73 74 65 70 28 70 49 74 65 72  lite3_step(pIter
19ef0 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  ->pSelect);.    
19f00 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
19f10 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
19f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f30 70 2d 3e 6e 50 72 6f 67 72 65 73 73 2b 2b 3b 0a  p->nProgress++;.
19f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f50 70 2d 3e 6e 53 74 65 70 2b 2b 3b 0a 20 20 20 20  p->nStep++;.    
19f60 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
19f70 72 6e 20 72 62 75 53 74 65 70 28 70 29 3b 0a 20  rn rbuStep(p);. 
19f80 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
19f90 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
19fa0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73  rc = sqlite3_res
19fb0 65 74 28 70 49 74 65 72 2d 3e 70 53 65 6c 65 63  et(pIter->pSelec
19fc0 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
19fd0 20 20 70 2d 3e 6e 53 74 65 70 20 3d 20 30 3b 0a    p->nStep = 0;.
19fe0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
19ff0 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
1a000 20 20 20 20 20 72 62 75 4f 62 6a 49 74 65 72 4e       rbuObjIterN
1a010 65 78 74 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  ext(p, pIter);. 
1a020 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
1a030 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
1a040 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1a050 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
1a060 72 2d 3e 7a 54 62 6c 3d 3d 30 20 29 3b 0a 20 20  r->zTbl==0 );.  
1a070 20 20 20 20 20 20 20 20 72 62 75 53 61 76 65 53          rbuSaveS
1a080 74 61 74 65 28 70 2c 20 52 42 55 5f 53 54 41 47  tate(p, RBU_STAG
1a090 45 5f 4d 4f 56 45 29 3b 0a 20 20 20 20 20 20 20  E_MOVE);.       
1a0a0 20 20 20 72 62 75 49 6e 63 72 53 63 68 65 6d 61     rbuIncrSchema
1a0b0 43 6f 6f 6b 69 65 28 70 29 3b 0a 20 20 20 20 20  Cookie(p);.     
1a0c0 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
1a0d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1a0e0 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d           p->rc =
1a0f0 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d   sqlite3_exec(p-
1a100 3e 64 62 4d 61 69 6e 2c 20 22 43 4f 4d 4d 49 54  >dbMain, "COMMIT
1a110 22 2c 20 30 2c 20 30 2c 20 26 70 2d 3e 7a 45 72  ", 0, 0, &p->zEr
1a120 72 6d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20  rmsg);.         
1a130 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
1a140 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1a150 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
1a160 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33   p->rc = sqlite3
1a170 5f 65 78 65 63 28 70 2d 3e 64 62 52 62 75 2c 20  _exec(p->dbRbu, 
1a180 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 2c 20  "COMMIT", 0, 0, 
1a190 26 70 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a 20 20  &p->zErrmsg);.  
1a1a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1a1b0 20 20 20 20 70 2d 3e 65 53 74 61 67 65 20 3d 20      p->eStage = 
1a1c0 52 42 55 5f 53 54 41 47 45 5f 4d 4f 56 45 3b 0a  RBU_STAGE_MOVE;.
1a1d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1a1e0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
1a1f0 0a 0a 20 20 20 20 20 20 63 61 73 65 20 52 42 55  ..      case RBU
1a200 5f 53 54 41 47 45 5f 4d 4f 56 45 3a 20 7b 0a 20  _STAGE_MOVE: {. 
1a210 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63         if( p->rc
1a220 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1a230 20 20 20 20 20 20 20 20 20 72 62 75 4d 6f 76 65           rbuMove
1a240 4f 61 6c 46 69 6c 65 28 70 29 3b 0a 20 20 20 20  OalFile(p);.    
1a250 20 20 20 20 20 20 70 2d 3e 6e 50 72 6f 67 72 65        p->nProgre
1a260 73 73 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ss++;.        }.
1a270 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1a280 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 63 61       }..      ca
1a290 73 65 20 52 42 55 5f 53 54 41 47 45 5f 43 4b 50  se RBU_STAGE_CKP
1a2a0 54 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28  T: {.        if(
1a2b0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1a2c0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  K ){.          i
1a2d0 66 28 20 70 2d 3e 6e 53 74 65 70 3e 3d 70 2d 3e  f( p->nStep>=p->
1a2e0 6e 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  nFrame ){.      
1a2f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69        sqlite3_fi
1a300 6c 65 20 2a 70 44 62 20 3d 20 70 2d 3e 70 54 61  le *pDb = p->pTa
1a310 72 67 65 74 46 64 2d 3e 70 52 65 61 6c 3b 0a 20  rgetFd->pReal;. 
1a320 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a   .            /*
1a330 20 53 79 6e 63 20 74 68 65 20 64 62 20 66 69 6c   Sync the db fil
1a340 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  e */.           
1a350 20 70 2d 3e 72 63 20 3d 20 70 44 62 2d 3e 70 4d   p->rc = pDb->pM
1a360 65 74 68 6f 64 73 2d 3e 78 53 79 6e 63 28 70 44  ethods->xSync(pD
1a370 62 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e  b, SQLITE_SYNC_N
1a380 4f 52 4d 41 4c 29 3b 0a 20 20 0a 20 20 20 20 20  ORMAL);.  .     
1a390 20 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65         /* Update
1a3a0 20 6e 42 61 63 6b 66 69 6c 6c 20 2a 2f 0a 20 20   nBackfill */.  
1a3b0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d            if( p-
1a3c0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
1a3d0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1a3e0 76 6f 69 64 20 76 6f 6c 61 74 69 6c 65 20 2a 70  void volatile *p
1a3f0 74 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  tr;.            
1a400 20 20 70 2d 3e 72 63 20 3d 20 70 44 62 2d 3e 70    p->rc = pDb->p
1a410 4d 65 74 68 6f 64 73 2d 3e 78 53 68 6d 4d 61 70  Methods->xShmMap
1a420 28 70 44 62 2c 20 30 2c 20 33 32 2a 31 30 32 34  (pDb, 0, 32*1024
1a430 2c 20 30 2c 20 26 70 74 72 29 3b 0a 20 20 20 20  , 0, &ptr);.    
1a440 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d            if( p-
1a450 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
1a460 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1a470 20 20 28 28 75 33 32 20 76 6f 6c 61 74 69 6c 65    ((u32 volatile
1a480 2a 29 70 74 72 29 5b 32 34 5d 20 3d 20 70 2d 3e  *)ptr)[24] = p->
1a490 69 4d 61 78 46 72 61 6d 65 3b 0a 20 20 20 20 20  iMaxFrame;.     
1a4a0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1a4b0 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20         }.  .    
1a4c0 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72          if( p->r
1a4d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1a4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
1a4f0 3e 65 53 74 61 67 65 20 3d 20 52 42 55 5f 53 54  >eStage = RBU_ST
1a500 41 47 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20  AGE_DONE;.      
1a510 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
1a520 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
1a530 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1a540 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1a550 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20 6f 6e          /* At on
1a560 65 20 70 6f 69 6e 74 20 74 68 65 20 66 6f 6c 6c  e point the foll
1a570 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 63 6f 70 69  owing block copi
1a580 65 64 20 61 20 73 69 6e 67 6c 65 20 66 72 61 6d  ed a single fram
1a590 65 20 66 72 6f 6d 20 74 68 65 0a 20 20 20 20 20  e from the.     
1a5a0 20 20 20 20 20 20 20 2a 2a 20 77 61 6c 20 66 69         ** wal fi
1a5b0 6c 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  le to the databa
1a5c0 73 65 20 66 69 6c 65 2e 20 53 6f 20 74 68 61 74  se file. So that
1a5d0 20 6f 6e 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c   one call to sql
1a5e0 69 74 65 33 72 62 75 5f 73 74 65 70 28 29 0a 20  ite3rbu_step(). 
1a5f0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 68             ** ch
1a600 65 63 6b 70 6f 69 6e 74 65 64 20 61 20 73 69 6e  eckpointed a sin
1a610 67 6c 65 20 66 72 61 6d 65 2e 20 0a 20 20 20 20  gle frame. .    
1a620 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
1a630 20 20 20 20 20 20 20 2a 2a 20 48 6f 77 65 76 65         ** Howeve
1a640 72 2c 20 69 66 20 74 68 65 20 73 65 63 74 6f 72  r, if the sector
1a650 2d 73 69 7a 65 20 69 73 20 6c 61 72 67 65 72 20  -size is larger 
1a660 74 68 61 6e 20 74 68 65 20 70 61 67 65 2d 73 69  than the page-si
1a670 7a 65 2c 20 61 6e 64 20 74 68 65 0a 20 20 20 20  ze, and the.    
1a680 20 20 20 20 20 20 20 20 2a 2a 20 61 70 70 6c 69          ** appli
1a690 63 61 74 69 6f 6e 20 63 61 6c 6c 73 20 73 71 6c  cation calls sql
1a6a0 69 74 65 33 72 62 75 5f 73 61 76 65 73 74 61 74  ite3rbu_savestat
1a6b0 65 28 29 20 6f 72 20 63 6c 6f 73 65 28 29 20 69  e() or close() i
1a6c0 6d 6d 65 64 69 61 74 65 6c 79 0a 20 20 20 20 20  mmediately.     
1a6d0 20 20 20 20 20 20 20 2a 2a 20 61 66 74 65 72 20         ** after 
1a6e0 74 68 69 73 20 73 74 65 70 2c 20 74 68 65 6e 20  this step, then 
1a6f0 72 62 75 5f 73 74 65 70 28 29 20 61 67 61 69 6e  rbu_step() again
1a700 2c 20 74 68 65 6e 20 61 20 70 6f 77 65 72 20 66  , then a power f
1a710 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2c 0a 20  ailure occurs,. 
1a720 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68             ** th
1a730 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  en the database 
1a740 70 61 67 65 20 77 72 69 74 74 65 6e 20 68 65 72  page written her
1a750 65 20 6d 61 79 20 62 65 20 64 61 6d 61 67 65 64  e may be damaged
1a760 2e 20 57 6f 72 6b 20 61 72 6f 75 6e 64 0a 20 20  . Work around.  
1a770 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69            ** thi
1a780 73 20 62 79 20 63 68 65 63 6b 70 6f 69 6e 74 69  s by checkpointi
1a790 6e 67 20 66 72 61 6d 65 73 20 75 6e 74 69 6c 20  ng frames until 
1a7a0 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e  the next page in
1a7b0 20 74 68 65 20 61 46 72 61 6d 65 5b 5d 0a 20 20   the aFrame[].  
1a7c0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6c 69 65            ** lie
1a7d0 73 20 6f 6e 20 61 20 64 69 66 66 65 72 65 6e 74  s on a different
1a7e0 20 64 69 73 6b 20 73 65 63 74 6f 72 20 74 6f 20   disk sector to 
1a7f0 74 68 65 20 63 75 72 72 65 6e 74 20 6f 6e 65 2e  the current one.
1a800 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
1a810 75 33 32 20 69 53 65 63 74 6f 72 3b 0a 20 20 20  u32 iSector;.   
1a820 20 20 20 20 20 20 20 20 20 64 6f 7b 0a 20 20 20           do{.   
1a830 20 20 20 20 20 20 20 20 20 20 20 52 62 75 46 72             RbuFr
1a840 61 6d 65 20 2a 70 46 72 61 6d 65 20 3d 20 26 70  ame *pFrame = &p
1a850 2d 3e 61 46 72 61 6d 65 5b 70 2d 3e 6e 53 74 65  ->aFrame[p->nSte
1a860 70 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  p];.            
1a870 20 20 69 53 65 63 74 6f 72 20 3d 20 28 70 46 72    iSector = (pFr
1a880 61 6d 65 2d 3e 69 44 62 50 61 67 65 2d 31 29 20  ame->iDbPage-1) 
1a890 2f 20 70 2d 3e 6e 50 61 67 65 50 65 72 53 65 63  / p->nPagePerSec
1a8a0 74 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  tor;.           
1a8b0 20 20 20 72 62 75 43 68 65 63 6b 70 6f 69 6e 74     rbuCheckpoint
1a8c0 46 72 61 6d 65 28 70 2c 20 70 46 72 61 6d 65 29  Frame(p, pFrame)
1a8d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1a8e0 70 2d 3e 6e 53 74 65 70 2b 2b 3b 0a 20 20 20 20  p->nStep++;.    
1a8f0 20 20 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20          }while( 
1a900 70 2d 3e 6e 53 74 65 70 3c 70 2d 3e 6e 46 72 61  p->nStep<p->nFra
1a910 6d 65 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  me .            
1a920 20 20 20 20 20 26 26 20 69 53 65 63 74 6f 72 3d       && iSector=
1a930 3d 28 28 70 2d 3e 61 46 72 61 6d 65 5b 70 2d 3e  =((p->aFrame[p->
1a940 6e 53 74 65 70 5d 2e 69 44 62 50 61 67 65 2d 31  nStep].iDbPage-1
1a950 29 20 2f 20 70 2d 3e 6e 50 61 67 65 50 65 72 53  ) / p->nPagePerS
1a960 65 63 74 6f 72 29 0a 20 20 20 20 20 20 20 20 20  ector).         
1a970 20 20 20 20 20 20 20 20 26 26 20 70 2d 3e 72 63          && p->rc
1a980 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20  ==SQLITE_OK.    
1a990 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
1a9a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1a9b0 20 70 2d 3e 6e 50 72 6f 67 72 65 73 73 2b 2b 3b   p->nProgress++;
1a9c0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1a9d0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1a9e0 7d 0a 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74  }..      default
1a9f0 3a 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  :.        break;
1aa00 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
1aa10 6e 20 70 2d 3e 72 63 3b 0a 20 20 7d 65 6c 73 65  n p->rc;.  }else
1aa20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
1aa30 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 7d  ITE_NOMEM;.  }.}
1aa40 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20  ../*.** Compare 
1aa50 73 74 72 69 6e 67 73 20 7a 31 20 61 6e 64 20 7a  strings z1 and z
1aa60 32 2c 20 72 65 74 75 72 6e 69 6e 67 20 30 20 69  2, returning 0 i
1aa70 66 20 74 68 65 79 20 61 72 65 20 69 64 65 6e 74  f they are ident
1aa80 69 63 61 6c 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72  ical, or non-zer
1aa90 6f 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 2e 20  o.** otherwise. 
1aaa0 45 69 74 68 65 72 20 6f 72 20 62 6f 74 68 20 61  Either or both a
1aab0 72 67 75 6d 65 6e 74 20 6d 61 79 20 62 65 20 4e  rgument may be N
1aac0 55 4c 4c 2e 20 54 77 6f 20 4e 55 4c 4c 20 76 61  ULL. Two NULL va
1aad0 6c 75 65 73 20 61 72 65 0a 2a 2a 20 63 6f 6e 73  lues are.** cons
1aae0 69 64 65 72 65 64 20 65 71 75 61 6c 2c 20 61 6e  idered equal, an
1aaf0 64 20 4e 55 4c 4c 20 69 73 20 63 6f 6e 73 69 64  d NULL is consid
1ab00 65 72 65 64 20 64 69 73 74 69 6e 63 74 20 66 72  ered distinct fr
1ab10 6f 6d 20 61 6c 6c 20 6f 74 68 65 72 20 76 61 6c  om all other val
1ab20 75 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ues..*/.static i
1ab30 6e 74 20 72 62 75 53 74 72 43 6f 6d 70 61 72 65  nt rbuStrCompare
1ab40 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 31 2c  (const char *z1,
1ab50 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32 29   const char *z2)
1ab60 7b 0a 20 20 69 66 28 20 7a 31 3d 3d 30 20 26 26  {.  if( z1==0 &&
1ab70 20 7a 32 3d 3d 30 20 29 20 72 65 74 75 72 6e 20   z2==0 ) return 
1ab80 30 3b 0a 20 20 69 66 28 20 7a 31 3d 3d 30 20 7c  0;.  if( z1==0 |
1ab90 7c 20 7a 32 3d 3d 30 20 29 20 72 65 74 75 72 6e  | z2==0 ) return
1aba0 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 28 73 71   1;.  return (sq
1abb0 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 31  lite3_stricmp(z1
1abc0 2c 20 7a 32 29 21 3d 30 29 3b 0a 7d 0a 0a 2f 2a  , z2)!=0);.}../*
1abd0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1abe0 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 73 20 70  n is called as p
1abf0 61 72 74 20 6f 66 20 73 71 6c 69 74 65 33 72 62  art of sqlite3rb
1ac00 75 5f 6f 70 65 6e 28 29 20 77 68 65 6e 20 69 6e  u_open() when in
1ac10 69 74 69 61 6c 69 7a 69 6e 67 0a 2a 2a 20 61 6e  itializing.** an
1ac20 20 72 62 75 20 68 61 6e 64 6c 65 20 69 6e 20 4f   rbu handle in O
1ac30 41 4c 20 73 74 61 67 65 2e 20 49 66 20 74 68 65  AL stage. If the
1ac40 20 72 62 75 20 75 70 64 61 74 65 20 68 61 73 20   rbu update has 
1ac50 6e 6f 74 20 73 74 61 72 74 65 64 20 28 69 2e 65  not started (i.e
1ac60 2e 0a 2a 2a 20 74 68 65 20 72 62 75 5f 73 74 61  ..** the rbu_sta
1ac70 74 65 20 74 61 62 6c 65 20 77 61 73 20 65 6d 70  te table was emp
1ac80 74 79 29 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f  ty) it is a no-o
1ac90 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  p. Otherwise, it
1aca0 20 61 72 72 61 6e 67 65 73 0a 2a 2a 20 74 68 69   arranges.** thi
1acb0 6e 67 73 20 73 6f 20 74 68 61 74 20 74 68 65 20  ngs so that the 
1acc0 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c  next call to sql
1acd0 69 74 65 33 72 62 75 5f 73 74 65 70 28 29 20 63  ite3rbu_step() c
1ace0 6f 6e 74 69 6e 75 65 73 20 6f 6e 20 66 72 6f 6d  ontinues on from
1acf0 0a 2a 2a 20 77 68 65 72 65 20 74 68 65 20 70 72  .** where the pr
1ad00 65 76 69 6f 75 73 20 72 62 75 20 68 61 6e 64 6c  evious rbu handl
1ad10 65 20 6c 65 66 74 20 6f 66 66 2e 0a 2a 2a 0a 2a  e left off..**.*
1ad20 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
1ad30 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63  curs, an error c
1ad40 6f 64 65 20 61 6e 64 20 65 72 72 6f 72 20 6d 65  ode and error me
1ad50 73 73 61 67 65 20 61 72 65 20 6c 65 66 74 20 69  ssage are left i
1ad60 6e 20 74 68 65 0a 2a 2a 20 72 62 75 20 68 61 6e  n the.** rbu han
1ad70 64 6c 65 20 70 61 73 73 65 64 20 61 73 20 74 68  dle passed as th
1ad80 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
1ad90 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1ada0 20 72 62 75 53 65 74 75 70 4f 61 6c 28 73 71 6c   rbuSetupOal(sql
1adb0 69 74 65 33 72 62 75 20 2a 70 2c 20 52 62 75 53  ite3rbu *p, RbuS
1adc0 74 61 74 65 20 2a 70 53 74 61 74 65 29 7b 0a 20  tate *pState){. 
1add0 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d   assert( p->rc==
1ade0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69  SQLITE_OK );.  i
1adf0 66 28 20 70 53 74 61 74 65 2d 3e 7a 54 62 6c 20  f( pState->zTbl 
1ae00 29 7b 0a 20 20 20 20 52 62 75 4f 62 6a 49 74 65  ){.    RbuObjIte
1ae10 72 20 2a 70 49 74 65 72 20 3d 20 26 70 2d 3e 6f  r *pIter = &p->o
1ae20 62 6a 69 74 65 72 3b 0a 20 20 20 20 69 6e 74 20  bjiter;.    int 
1ae30 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1ae40 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  .    while( rc==
1ae50 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 49 74  SQLITE_OK && pIt
1ae60 65 72 2d 3e 7a 54 62 6c 20 26 26 20 28 70 49 74  er->zTbl && (pIt
1ae70 65 72 2d 3e 62 43 6c 65 61 6e 75 70 20 0a 20 20  er->bCleanup .  
1ae80 20 20 20 20 20 7c 7c 20 72 62 75 53 74 72 43 6f       || rbuStrCo
1ae90 6d 70 61 72 65 28 70 49 74 65 72 2d 3e 7a 49 64  mpare(pIter->zId
1aea0 78 2c 20 70 53 74 61 74 65 2d 3e 7a 49 64 78 29  x, pState->zIdx)
1aeb0 0a 20 20 20 20 20 20 20 7c 7c 20 72 62 75 53 74  .       || rbuSt
1aec0 72 43 6f 6d 70 61 72 65 28 70 49 74 65 72 2d 3e  rCompare(pIter->
1aed0 7a 54 62 6c 2c 20 70 53 74 61 74 65 2d 3e 7a 54  zTbl, pState->zT
1aee0 62 6c 29 20 0a 20 20 20 20 29 29 7b 0a 20 20 20  bl) .    )){.   
1aef0 20 20 20 72 63 20 3d 20 72 62 75 4f 62 6a 49 74     rc = rbuObjIt
1af00 65 72 4e 65 78 74 28 70 2c 20 70 49 74 65 72 29  erNext(p, pIter)
1af10 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
1af20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1af30 26 20 21 70 49 74 65 72 2d 3e 7a 54 62 6c 20 29  & !pIter->zTbl )
1af40 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
1af50 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
1af60 20 70 2d 3e 7a 45 72 72 6d 73 67 20 3d 20 73 71   p->zErrmsg = sq
1af70 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 72  lite3_mprintf("r
1af80 62 75 5f 73 74 61 74 65 20 6d 69 73 6d 61 74 63  bu_state mismatc
1af90 68 20 65 72 72 6f 72 22 29 3b 0a 20 20 20 20 7d  h error");.    }
1afa0 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ..    if( rc==SQ
1afb0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1afc0 20 70 2d 3e 6e 53 74 65 70 20 3d 20 70 53 74 61   p->nStep = pSta
1afd0 74 65 2d 3e 6e 52 6f 77 3b 0a 20 20 20 20 20 20  te->nRow;.      
1afe0 72 63 20 3d 20 72 62 75 4f 62 6a 49 74 65 72 50  rc = rbuObjIterP
1aff0 72 65 70 61 72 65 41 6c 6c 28 70 2c 20 26 70 2d  repareAll(p, &p-
1b000 3e 6f 62 6a 69 74 65 72 2c 20 70 2d 3e 6e 53 74  >objiter, p->nSt
1b010 65 70 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ep);.    }..    
1b020 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 7d 0a  p->rc = rc;.  }.
1b030 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 72  }../*.** If ther
1b040 65 20 69 73 20 61 20 22 2a 2d 6f 61 6c 22 20 66  e is a "*-oal" f
1b050 69 6c 65 20 69 6e 20 74 68 65 20 66 69 6c 65 2d  ile in the file-
1b060 73 79 73 74 65 6d 20 63 6f 72 72 65 73 70 6f 6e  system correspon
1b070 64 69 6e 67 20 74 6f 20 74 68 65 0a 2a 2a 20 74  ding to the.** t
1b080 61 72 67 65 74 20 64 61 74 61 62 61 73 65 20 69  arget database i
1b090 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  n the file-syste
1b0a0 6d 2c 20 64 65 6c 65 74 65 20 69 74 2e 20 49 66  m, delete it. If
1b0b0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
1b0c0 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65 72  ,.** leave an er
1b0d0 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 65 72 72  ror code and err
1b0e0 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 74 68  or message in th
1b0f0 65 20 72 62 75 20 68 61 6e 64 6c 65 2e 0a 2a 2f  e rbu handle..*/
1b100 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75  .static void rbu
1b110 44 65 6c 65 74 65 4f 61 6c 46 69 6c 65 28 73 71  DeleteOalFile(sq
1b120 6c 69 74 65 33 72 62 75 20 2a 70 29 7b 0a 20 20  lite3rbu *p){.  
1b130 63 68 61 72 20 2a 7a 4f 61 6c 20 3d 20 72 62 75  char *zOal = rbu
1b140 4d 50 72 69 6e 74 66 28 70 2c 20 22 25 73 2d 6f  MPrintf(p, "%s-o
1b150 61 6c 22 2c 20 70 2d 3e 7a 54 61 72 67 65 74 29  al", p->zTarget)
1b160 3b 0a 20 20 69 66 28 20 7a 4f 61 6c 20 29 7b 0a  ;.  if( zOal ){.
1b170 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20      sqlite3_vfs 
1b180 2a 70 56 66 73 20 3d 20 73 71 6c 69 74 65 33 5f  *pVfs = sqlite3_
1b190 76 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20 20  vfs_find(0);.   
1b1a0 20 61 73 73 65 72 74 28 20 70 56 66 73 20 26 26   assert( pVfs &&
1b1b0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1b1c0 4b 20 26 26 20 70 2d 3e 7a 45 72 72 6d 73 67 3d  K && p->zErrmsg=
1b1d0 3d 30 20 29 3b 0a 20 20 20 20 70 56 66 73 2d 3e  =0 );.    pVfs->
1b1e0 78 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4f  xDelete(pVfs, zO
1b1f0 61 6c 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  al, 0);.    sqli
1b200 74 65 33 5f 66 72 65 65 28 7a 4f 61 6c 29 3b 0a  te3_free(zOal);.
1b210 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c    }.}../*.** All
1b220 6f 63 61 74 65 20 61 20 70 72 69 76 61 74 65 20  ocate a private 
1b230 72 62 75 20 56 46 53 20 66 6f 72 20 74 68 65 20  rbu VFS for the 
1b240 72 62 75 20 68 61 6e 64 6c 65 20 70 61 73 73 65  rbu handle passe
1b250 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 0a 2a 2a  d as the only.**
1b260 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 69 73 20   argument. This 
1b270 56 46 53 20 77 69 6c 6c 20 62 65 20 75 73 65 64  VFS will be used
1b280 20 75 6e 6c 65 73 73 20 74 68 65 20 63 61 6c 6c   unless the call
1b290 20 74 6f 20 73 71 6c 69 74 65 33 72 62 75 5f 6f   to sqlite3rbu_o
1b2a0 70 65 6e 28 29 0a 2a 2a 20 73 70 65 63 69 66 69  pen().** specifi
1b2b0 65 64 20 61 20 55 52 49 20 77 69 74 68 20 61 20  ed a URI with a 
1b2c0 76 66 73 3d 3f 20 6f 70 74 69 6f 6e 20 69 6e 20  vfs=? option in 
1b2d0 70 6c 61 63 65 20 6f 66 20 61 20 74 61 72 67 65  place of a targe
1b2e0 74 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69  t database.** fi
1b2f0 6c 65 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74  le name..*/.stat
1b300 69 63 20 76 6f 69 64 20 72 62 75 43 72 65 61 74  ic void rbuCreat
1b310 65 56 66 73 28 73 71 6c 69 74 65 33 72 62 75 20  eVfs(sqlite3rbu 
1b320 2a 70 29 7b 0a 20 20 69 6e 74 20 72 6e 64 3b 0a  *p){.  int rnd;.
1b330 20 20 63 68 61 72 20 7a 52 6e 64 5b 36 34 5d 3b    char zRnd[64];
1b340 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72  ..  assert( p->r
1b350 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
1b360 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d    sqlite3_random
1b370 6e 65 73 73 28 73 69 7a 65 6f 66 28 69 6e 74 29  ness(sizeof(int)
1b380 2c 20 28 76 6f 69 64 2a 29 26 72 6e 64 29 3b 0a  , (void*)&rnd);.
1b390 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
1b3a0 74 66 28 73 69 7a 65 6f 66 28 7a 52 6e 64 29 2c  tf(sizeof(zRnd),
1b3b0 20 7a 52 6e 64 2c 20 22 72 62 75 5f 76 66 73 5f   zRnd, "rbu_vfs_
1b3c0 25 64 22 2c 20 72 6e 64 29 3b 0a 20 20 70 2d 3e  %d", rnd);.  p->
1b3d0 72 63 20 3d 20 73 71 6c 69 74 65 33 72 62 75 5f  rc = sqlite3rbu_
1b3e0 63 72 65 61 74 65 5f 76 66 73 28 7a 52 6e 64 2c  create_vfs(zRnd,
1b3f0 20 30 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63   0);.  if( p->rc
1b400 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1b410 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a     sqlite3_vfs *
1b420 70 56 66 73 20 3d 20 73 71 6c 69 74 65 33 5f 76  pVfs = sqlite3_v
1b430 66 73 5f 66 69 6e 64 28 7a 52 6e 64 29 3b 0a 20  fs_find(zRnd);. 
1b440 20 20 20 61 73 73 65 72 74 28 20 70 56 66 73 20     assert( pVfs 
1b450 29 3b 0a 20 20 20 20 70 2d 3e 7a 56 66 73 4e 61  );.    p->zVfsNa
1b460 6d 65 20 3d 20 70 56 66 73 2d 3e 7a 4e 61 6d 65  me = pVfs->zName
1b470 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ;.  }.}../*.** D
1b480 65 73 74 72 6f 79 20 74 68 65 20 70 72 69 76 61  estroy the priva
1b490 74 65 20 56 46 53 20 63 72 65 61 74 65 64 20 66  te VFS created f
1b4a0 6f 72 20 74 68 65 20 72 62 75 20 68 61 6e 64 6c  or the rbu handl
1b4b0 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
1b4c0 6f 6e 6c 79 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  only.** argument
1b4d0 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20 63   by an earlier c
1b4e0 61 6c 6c 20 74 6f 20 72 62 75 43 72 65 61 74 65  all to rbuCreate
1b4f0 56 66 73 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  Vfs()..*/.static
1b500 20 76 6f 69 64 20 72 62 75 44 65 6c 65 74 65 56   void rbuDeleteV
1b510 66 73 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70  fs(sqlite3rbu *p
1b520 29 7b 0a 20 20 69 66 28 20 70 2d 3e 7a 56 66 73  ){.  if( p->zVfs
1b530 4e 61 6d 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  Name ){.    sqli
1b540 74 65 33 72 62 75 5f 64 65 73 74 72 6f 79 5f 76  te3rbu_destroy_v
1b550 66 73 28 70 2d 3e 7a 56 66 73 4e 61 6d 65 29 3b  fs(p->zVfsName);
1b560 0a 20 20 20 20 70 2d 3e 7a 56 66 73 4e 61 6d 65  .    p->zVfsName
1b570 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 0;.  }.}../*.
1b580 2a 2a 20 54 68 69 73 20 75 73 65 72 2d 64 65 66  ** This user-def
1b590 69 6e 65 64 20 53 51 4c 20 66 75 6e 63 74 69 6f  ined SQL functio
1b5a0 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 77 69 74  n is invoked wit
1b5b0 68 20 61 20 73 69 6e 67 6c 65 20 61 72 67 75 6d  h a single argum
1b5c0 65 6e 74 20 2d 20 74 68 65 0a 2a 2a 20 6e 61 6d  ent - the.** nam
1b5d0 65 20 6f 66 20 61 20 74 61 62 6c 65 20 65 78 70  e of a table exp
1b5e0 65 63 74 65 64 20 74 6f 20 61 70 70 65 61 72 20  ected to appear 
1b5f0 69 6e 20 74 68 65 20 74 61 72 67 65 74 20 64 61  in the target da
1b600 74 61 62 61 73 65 2e 20 49 74 20 72 65 74 75 72  tabase. It retur
1b610 6e 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72  ns.** the number
1b620 20 6f 66 20 61 75 78 69 6c 6c 69 61 72 79 20 69   of auxilliary i
1b630 6e 64 65 78 65 73 20 6f 6e 20 74 68 65 20 74 61  ndexes on the ta
1b640 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ble..*/.static v
1b650 6f 69 64 20 72 62 75 49 6e 64 65 78 43 6e 74 46  oid rbuIndexCntF
1b660 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
1b670 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20  ontext *pCtx, . 
1b680 20 69 6e 74 20 6e 56 61 6c 2c 0a 20 20 73 71 6c   int nVal,.  sql
1b690 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56  ite3_value **apV
1b6a0 61 6c 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 72  al.){.  sqlite3r
1b6b0 62 75 20 2a 70 20 3d 20 28 73 71 6c 69 74 65 33  bu *p = (sqlite3
1b6c0 72 62 75 2a 29 73 71 6c 69 74 65 33 5f 75 73 65  rbu*)sqlite3_use
1b6d0 72 5f 64 61 74 61 28 70 43 74 78 29 3b 0a 20 20  r_data(pCtx);.  
1b6e0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
1b6f0 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  tmt = 0;.  char 
1b700 2a 7a 45 72 72 6d 73 67 20 3d 20 30 3b 0a 20 20  *zErrmsg = 0;.  
1b710 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
1b720 74 28 20 6e 56 61 6c 3d 3d 31 20 29 3b 0a 20 20  t( nVal==1 );.  
1b730 0a 20 20 72 63 20 3d 20 70 72 65 70 61 72 65 46  .  rc = prepareF
1b740 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72  reeAndCollectErr
1b750 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 70  or(p->dbMain, &p
1b760 53 74 6d 74 2c 20 26 7a 45 72 72 6d 73 67 2c 20  Stmt, &zErrmsg, 
1b770 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
1b780 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20 63  printf("SELECT c
1b790 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 73 71 6c  ount(*) FROM sql
1b7a0 69 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20 20  ite_master ".   
1b7b0 20 20 20 20 20 22 57 48 45 52 45 20 74 79 70 65       "WHERE type
1b7c0 3d 27 69 6e 64 65 78 27 20 41 4e 44 20 74 62 6c  ='index' AND tbl
1b7d0 5f 6e 61 6d 65 20 3d 20 25 51 22 2c 20 73 71 6c  _name = %Q", sql
1b7e0 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
1b7f0 61 70 56 61 6c 5b 30 5d 29 29 0a 20 20 29 3b 0a  apVal[0])).  );.
1b800 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1b810 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
1b820 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28  e3_result_error(
1b830 70 43 74 78 2c 20 7a 45 72 72 6d 73 67 2c 20 2d  pCtx, zErrmsg, -
1b840 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  1);.  }else{.   
1b850 20 69 6e 74 20 6e 49 6e 64 65 78 20 3d 20 30 3b   int nIndex = 0;
1b860 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
1b870 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW==sqlite3_ste
1b880 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20  p(pStmt) ){.    
1b890 20 20 6e 49 6e 64 65 78 20 3d 20 73 71 6c 69 74    nIndex = sqlit
1b8a0 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53  e3_column_int(pS
1b8b0 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  tmt, 0);.    }. 
1b8c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
1b8d0 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
1b8e0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1b8f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1b900 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
1b910 6e 74 28 70 43 74 78 2c 20 6e 49 6e 64 65 78 29  nt(pCtx, nIndex)
1b920 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1b930 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
1b940 74 5f 65 72 72 6f 72 28 70 43 74 78 2c 20 73 71  t_error(pCtx, sq
1b950 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e  lite3_errmsg(p->
1b960 64 62 4d 61 69 6e 29 2c 20 2d 31 29 3b 0a 20 20  dbMain), -1);.  
1b970 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74    }.  }..  sqlit
1b980 65 33 5f 66 72 65 65 28 7a 45 72 72 6d 73 67 29  e3_free(zErrmsg)
1b990 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  ;.}../*.** If th
1b9a0 65 20 52 42 55 20 64 61 74 61 62 61 73 65 20 63  e RBU database c
1b9b0 6f 6e 74 61 69 6e 73 20 74 68 65 20 72 62 75 5f  ontains the rbu_
1b9c0 63 6f 75 6e 74 20 74 61 62 6c 65 2c 20 75 73 65  count table, use
1b9d0 20 69 74 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a   it to initializ
1b9e0 65 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33  e.** the sqlite3
1b9f0 72 62 75 2e 6e 50 68 61 73 65 4f 6e 65 53 74 65  rbu.nPhaseOneSte
1ba00 70 20 76 61 72 69 61 62 6c 65 2e 20 54 68 65 20  p variable. The 
1ba10 73 63 68 65 6d 61 20 6f 66 20 74 68 65 20 72 62  schema of the rb
1ba20 75 5f 63 6f 75 6e 74 20 74 61 62 6c 65 0a 2a 2a  u_count table.**
1ba30 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 63   is assumed to c
1ba40 6f 6e 74 61 69 6e 20 74 68 65 20 73 61 6d 65 20  ontain the same 
1ba50 63 6f 6c 75 6d 6e 73 20 61 73 3a 0a 2a 2a 0a 2a  columns as:.**.*
1ba60 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  *   CREATE TABLE
1ba70 20 72 62 75 5f 63 6f 75 6e 74 28 74 62 6c 20 54   rbu_count(tbl T
1ba80 45 58 54 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  EXT PRIMARY KEY,
1ba90 20 63 6e 74 20 49 4e 54 45 47 45 52 29 20 57 49   cnt INTEGER) WI
1baa0 54 48 4f 55 54 20 52 4f 57 49 44 3b 0a 2a 2a 0a  THOUT ROWID;.**.
1bab0 2a 2a 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20  ** There should 
1bac0 62 65 20 6f 6e 65 20 72 6f 77 20 69 6e 20 74 68  be one row in th
1bad0 65 20 74 61 62 6c 65 20 66 6f 72 20 65 61 63 68  e table for each
1bae0 20 64 61 74 61 5f 78 78 78 20 74 61 62 6c 65 20   data_xxx table 
1baf0 69 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  in the.** databa
1bb00 73 65 2e 20 54 68 65 20 27 74 62 6c 27 20 63 6f  se. The 'tbl' co
1bb10 6c 75 6d 6e 20 73 68 6f 75 6c 64 20 63 6f 6e 74  lumn should cont
1bb20 61 69 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ain the name of 
1bb30 61 20 64 61 74 61 5f 78 78 78 20 74 61 62 6c 65  a data_xxx table
1bb40 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20 63 6e 74  ,.** and the cnt
1bb50 20 63 6f 6c 75 6d 6e 20 74 68 65 20 6e 75 6d 62   column the numb
1bb60 65 72 20 6f 66 20 72 6f 77 73 20 69 74 20 63 6f  er of rows it co
1bb70 6e 74 61 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 73 71  ntains..**.** sq
1bb80 6c 69 74 65 33 72 62 75 2e 6e 50 68 61 73 65 4f  lite3rbu.nPhaseO
1bb90 6e 65 53 74 65 70 20 69 73 20 69 6e 69 74 69 61  neStep is initia
1bba0 6c 69 7a 65 64 20 74 6f 20 74 68 65 20 73 75 6d  lized to the sum
1bbb0 20 6f 66 20 28 31 20 2b 20 6e 49 6e 64 65 78 29   of (1 + nIndex)
1bbc0 20 2a 20 63 6e 74 0a 2a 2a 20 66 6f 72 20 61 6c   * cnt.** for al
1bbd0 6c 20 72 6f 77 73 20 69 6e 20 74 68 65 20 72 62  l rows in the rb
1bbe0 75 5f 63 6f 75 6e 74 20 74 61 62 6c 65 2c 20 77  u_count table, w
1bbf0 68 65 72 65 20 6e 49 6e 64 65 78 20 69 73 20 74  here nIndex is t
1bc00 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 0a 2a 2a  he number of .**
1bc10 20 69 6e 64 65 78 65 73 20 6f 6e 20 74 68 65 20   indexes on the 
1bc20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61  corresponding ta
1bc30 72 67 65 74 20 64 61 74 61 62 61 73 65 20 74 61  rget database ta
1bc40 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ble..*/.static v
1bc50 6f 69 64 20 72 62 75 49 6e 69 74 50 68 61 73 65  oid rbuInitPhase
1bc60 4f 6e 65 53 74 65 70 73 28 73 71 6c 69 74 65 33  OneSteps(sqlite3
1bc70 72 62 75 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  rbu *p){.  if( p
1bc80 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
1bc90 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
1bca0 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a  tmt *pStmt = 0;.
1bcb0 20 20 20 20 69 6e 74 20 62 45 78 69 73 74 73 20      int bExists 
1bcc0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1bcd0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72      /* True if r
1bce0 62 75 5f 63 6f 75 6e 74 20 65 78 69 73 74 73 20  bu_count exists 
1bcf0 2a 2f 0a 0a 20 20 20 20 70 2d 3e 6e 50 68 61 73  */..    p->nPhas
1bd00 65 4f 6e 65 53 74 65 70 20 3d 20 2d 31 3b 0a 0a  eOneStep = -1;..
1bd10 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69      p->rc = sqli
1bd20 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
1bd30 69 6f 6e 28 70 2d 3e 64 62 52 62 75 2c 20 0a 20  ion(p->dbRbu, . 
1bd40 20 20 20 20 20 20 20 22 72 62 75 5f 69 6e 64 65         "rbu_inde
1bd50 78 5f 63 6e 74 22 2c 20 31 2c 20 53 51 4c 49 54  x_cnt", 1, SQLIT
1bd60 45 5f 55 54 46 38 2c 20 28 76 6f 69 64 2a 29 70  E_UTF8, (void*)p
1bd70 2c 20 72 62 75 49 6e 64 65 78 43 6e 74 46 75 6e  , rbuIndexCntFun
1bd80 63 2c 20 30 2c 20 30 0a 20 20 20 20 29 3b 0a 20  c, 0, 0.    );. 
1bd90 20 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66   .    /* Check f
1bda0 6f 72 20 74 68 65 20 72 62 75 5f 63 6f 75 6e 74  or the rbu_count
1bdb0 20 74 61 62 6c 65 2e 20 49 66 20 69 74 20 64 6f   table. If it do
1bdc0 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 6f 72  es not exist, or
1bdd0 20 69 66 20 61 6e 20 65 72 72 6f 72 0a 20 20 20   if an error.   
1bde0 20 2a 2a 20 6f 63 63 75 72 73 2c 20 6e 50 68 61   ** occurs, nPha
1bdf0 73 65 4f 6e 65 53 74 65 70 20 77 69 6c 6c 20 62  seOneStep will b
1be00 65 20 6c 65 66 74 20 73 65 74 20 74 6f 20 2d 31  e left set to -1
1be10 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e  . */.    if( p->
1be20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1be30 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 70  .      p->rc = p
1be40 72 65 70 61 72 65 41 6e 64 43 6f 6c 6c 65 63 74  repareAndCollect
1be50 45 72 72 6f 72 28 70 2d 3e 64 62 52 62 75 2c 20  Error(p->dbRbu, 
1be60 26 70 53 74 6d 74 2c 20 26 70 2d 3e 7a 45 72 72  &pStmt, &p->zErr
1be70 6d 73 67 2c 0a 20 20 20 20 20 20 20 20 20 20 22  msg,.          "
1be80 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20 73 71  SELECT 1 FROM sq
1be90 6c 69 74 65 5f 6d 61 73 74 65 72 20 57 48 45 52  lite_master WHER
1bea0 45 20 74 62 6c 5f 6e 61 6d 65 20 3d 20 27 72 62  E tbl_name = 'rb
1beb0 75 5f 63 6f 75 6e 74 27 22 0a 20 20 20 20 20 20  u_count'".      
1bec0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
1bed0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1bee0 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 53  K ){.      if( S
1bef0 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74  QLITE_ROW==sqlit
1bf00 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29  e3_step(pStmt) )
1bf10 7b 0a 20 20 20 20 20 20 20 20 62 45 78 69 73 74  {.        bExist
1bf20 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  s = 1;.      }. 
1bf30 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c       p->rc = sql
1bf40 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
1bf50 74 6d 74 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  tmt);.    }.  . 
1bf60 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
1bf70 4c 49 54 45 5f 4f 4b 20 26 26 20 62 45 78 69 73  LITE_OK && bExis
1bf80 74 73 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72  ts ){.      p->r
1bf90 63 20 3d 20 70 72 65 70 61 72 65 41 6e 64 43 6f  c = prepareAndCo
1bfa0 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62  llectError(p->db
1bfb0 52 62 75 2c 20 26 70 53 74 6d 74 2c 20 26 70 2d  Rbu, &pStmt, &p-
1bfc0 3e 7a 45 72 72 6d 73 67 2c 0a 20 20 20 20 20 20  >zErrmsg,.      
1bfd0 20 20 20 20 22 53 45 4c 45 43 54 20 73 75 6d 28      "SELECT sum(
1bfe0 63 6e 74 20 2a 20 28 31 20 2b 20 72 62 75 5f 69  cnt * (1 + rbu_i
1bff0 6e 64 65 78 5f 63 6e 74 28 72 62 75 5f 74 61 72  ndex_cnt(rbu_tar
1c000 67 65 74 5f 6e 61 6d 65 28 74 62 6c 29 29 29 29  get_name(tbl))))
1c010 22 0a 20 20 20 20 20 20 20 20 20 20 22 46 52 4f  ".          "FRO
1c020 4d 20 72 62 75 5f 63 6f 75 6e 74 22 0a 20 20 20  M rbu_count".   
1c030 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20     );.      if( 
1c040 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
1c050 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
1c060 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69  SQLITE_ROW==sqli
1c070 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20  te3_step(pStmt) 
1c080 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ){.          p->
1c090 6e 50 68 61 73 65 4f 6e 65 53 74 65 70 20 3d 20  nPhaseOneStep = 
1c0a0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
1c0b0 6e 74 36 34 28 70 53 74 6d 74 2c 20 30 29 3b 0a  nt64(pStmt, 0);.
1c0c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1c0d0 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65    p->rc = sqlite
1c0e0 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
1c0f0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1c100 0a 20 20 7d 0a 7d 0a 0a 0a 73 74 61 74 69 63 20  .  }.}...static 
1c110 73 71 6c 69 74 65 33 72 62 75 20 2a 6f 70 65 6e  sqlite3rbu *open
1c120 52 62 75 48 61 6e 64 6c 65 28 0a 20 20 63 6f 6e  RbuHandle(.  con
1c130 73 74 20 63 68 61 72 20 2a 7a 54 61 72 67 65 74  st char *zTarget
1c140 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  , .  const char 
1c150 2a 7a 52 62 75 2c 0a 20 20 63 6f 6e 73 74 20 63  *zRbu,.  const c
1c160 68 61 72 20 2a 7a 53 74 61 74 65 0a 29 7b 0a 20  har *zState.){. 
1c170 20 73 71 6c 69 74 65 33 72 62 75 20 2a 70 3b 0a   sqlite3rbu *p;.
1c180 20 20 73 69 7a 65 5f 74 20 6e 54 61 72 67 65 74    size_t nTarget
1c190 20 3d 20 7a 54 61 72 67 65 74 20 3f 20 73 74 72   = zTarget ? str
1c1a0 6c 65 6e 28 7a 54 61 72 67 65 74 29 20 3a 20 30  len(zTarget) : 0
1c1b0 3b 0a 20 20 73 69 7a 65 5f 74 20 6e 52 62 75 20  ;.  size_t nRbu 
1c1c0 3d 20 73 74 72 6c 65 6e 28 7a 52 62 75 29 3b 0a  = strlen(zRbu);.
1c1d0 20 20 73 69 7a 65 5f 74 20 6e 42 79 74 65 20 3d    size_t nByte =
1c1e0 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 72   sizeof(sqlite3r
1c1f0 62 75 29 20 2b 20 6e 54 61 72 67 65 74 2b 31 20  bu) + nTarget+1 
1c200 2b 20 6e 52 62 75 2b 31 3b 0a 0a 20 20 70 20 3d  + nRbu+1;..  p =
1c210 20 28 73 71 6c 69 74 65 33 72 62 75 2a 29 73 71   (sqlite3rbu*)sq
1c220 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e  lite3_malloc64(n
1c230 42 79 74 65 29 3b 0a 20 20 69 66 28 20 70 20 29  Byte);.  if( p )
1c240 7b 0a 20 20 20 20 52 62 75 53 74 61 74 65 20 2a  {.    RbuState *
1c250 70 53 74 61 74 65 20 3d 20 30 3b 0a 0a 20 20 20  pState = 0;..   
1c260 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 63   /* Create the c
1c270 75 73 74 6f 6d 20 56 46 53 2e 20 2a 2f 0a 20 20  ustom VFS. */.  
1c280 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73    memset(p, 0, s
1c290 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 72 62 75  izeof(sqlite3rbu
1c2a0 29 29 3b 0a 20 20 20 20 72 62 75 43 72 65 61 74  ));.    rbuCreat
1c2b0 65 56 66 73 28 70 29 3b 0a 0a 20 20 20 20 2f 2a  eVfs(p);..    /*
1c2c0 20 4f 70 65 6e 20 74 68 65 20 74 61 72 67 65 74   Open the target
1c2d0 2c 20 52 42 55 20 61 6e 64 20 73 74 61 74 65 20  , RBU and state 
1c2e0 64 61 74 61 62 61 73 65 73 20 2a 2f 0a 20 20 20  databases */.   
1c2f0 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
1c300 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 63  TE_OK ){.      c
1c310 68 61 72 20 2a 70 43 73 72 20 3d 20 28 63 68 61  har *pCsr = (cha
1c320 72 2a 29 26 70 5b 31 5d 3b 0a 20 20 20 20 20 20  r*)&p[1];.      
1c330 69 6e 74 20 62 52 65 74 72 79 20 3d 20 30 3b 0a  int bRetry = 0;.
1c340 20 20 20 20 20 20 69 66 28 20 7a 54 61 72 67 65        if( zTarge
1c350 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  t ){.        p->
1c360 7a 54 61 72 67 65 74 20 3d 20 70 43 73 72 3b 0a  zTarget = pCsr;.
1c370 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
1c380 2d 3e 7a 54 61 72 67 65 74 2c 20 7a 54 61 72 67  ->zTarget, zTarg
1c390 65 74 2c 20 6e 54 61 72 67 65 74 2b 31 29 3b 0a  et, nTarget+1);.
1c3a0 20 20 20 20 20 20 20 20 70 43 73 72 20 2b 3d 20          pCsr += 
1c3b0 6e 54 61 72 67 65 74 2b 31 3b 0a 20 20 20 20 20  nTarget+1;.     
1c3c0 20 7d 0a 20 20 20 20 20 20 70 2d 3e 7a 52 62 75   }.      p->zRbu
1c3d0 20 3d 20 70 43 73 72 3b 0a 20 20 20 20 20 20 6d   = pCsr;.      m
1c3e0 65 6d 63 70 79 28 70 2d 3e 7a 52 62 75 2c 20 7a  emcpy(p->zRbu, z
1c3f0 52 62 75 2c 20 6e 52 62 75 2b 31 29 3b 0a 20 20  Rbu, nRbu+1);.  
1c400 20 20 20 20 70 43 73 72 20 2b 3d 20 6e 52 62 75      pCsr += nRbu
1c410 2b 31 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 53  +1;.      if( zS
1c420 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  tate ){.        
1c430 70 2d 3e 7a 53 74 61 74 65 20 3d 20 72 62 75 4d  p->zState = rbuM
1c440 50 72 69 6e 74 66 28 70 2c 20 22 25 73 22 2c 20  Printf(p, "%s", 
1c450 7a 53 74 61 74 65 29 3b 0a 20 20 20 20 20 20 7d  zState);.      }
1c460 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  ..      /* If th
1c470 65 20 66 69 72 73 74 20 61 74 74 65 6d 70 74 20  e first attempt 
1c480 74 6f 20 6f 70 65 6e 20 74 68 65 20 64 61 74 61  to open the data
1c490 62 61 73 65 20 66 69 6c 65 20 66 61 69 6c 73 20  base file fails 
1c4a0 61 6e 64 20 74 68 65 20 62 52 65 74 72 79 0a 20  and the bRetry. 
1c4b0 20 20 20 20 20 2a 2a 20 66 6c 61 67 20 69 74 20       ** flag it 
1c4c0 73 65 74 2c 20 74 68 69 73 20 6d 65 61 6e 73 20  set, this means 
1c4d0 74 68 61 74 20 74 68 65 20 64 62 20 77 61 73 20  that the db was 
1c4e0 6e 6f 74 20 6f 70 65 6e 65 64 20 62 65 63 61 75  not opened becau
1c4f0 73 65 20 69 74 20 73 65 65 6d 65 64 0a 20 20 20  se it seemed.   
1c500 20 20 20 2a 2a 20 74 6f 20 62 65 20 61 20 77 61     ** to be a wa
1c510 6c 2d 6d 6f 64 65 20 64 62 2e 20 42 75 74 2c 20  l-mode db. But, 
1c520 74 68 69 73 20 6d 61 79 20 68 61 76 65 20 68 61  this may have ha
1c530 70 70 65 6e 65 64 20 64 75 65 20 74 6f 20 61 6e  ppened due to an
1c540 20 65 61 72 6c 69 65 72 0a 20 20 20 20 20 20 2a   earlier.      *
1c550 2a 20 52 42 55 20 76 61 63 75 75 6d 20 6f 70 65  * RBU vacuum ope
1c560 72 61 74 69 6f 6e 20 6c 65 61 76 69 6e 67 20 61  ration leaving a
1c570 6e 20 6f 6c 64 20 77 61 6c 20 66 69 6c 65 20 69  n old wal file i
1c580 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 2e  n the directory.
1c590 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 69  .      ** If thi
1c5a0 73 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 69  s is the case, i
1c5b0 74 20 77 69 6c 6c 20 68 61 76 65 20 62 65 65 6e  t will have been
1c5c0 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 20 61 6e   checkpointed an
1c5d0 64 20 64 65 6c 65 74 65 64 0a 20 20 20 20 20 20  d deleted.      
1c5e0 2a 2a 20 77 68 65 6e 20 74 68 65 20 68 61 6e 64  ** when the hand
1c5f0 6c 65 20 77 61 73 20 63 6c 6f 73 65 64 20 61 6e  le was closed an
1c600 64 20 61 20 73 65 63 6f 6e 64 20 61 74 74 65 6d  d a second attem
1c610 70 74 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 0a  pt to open the .
1c620 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73        ** databas
1c630 65 20 6d 61 79 20 73 75 63 63 65 65 64 2e 20 20  e may succeed.  
1c640 2a 2f 0a 20 20 20 20 20 20 72 62 75 4f 70 65 6e  */.      rbuOpen
1c650 44 61 74 61 62 61 73 65 28 70 2c 20 26 62 52 65  Database(p, &bRe
1c660 74 72 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20  try);.      if( 
1c670 62 52 65 74 72 79 20 29 7b 0a 20 20 20 20 20 20  bRetry ){.      
1c680 20 20 72 62 75 4f 70 65 6e 44 61 74 61 62 61 73    rbuOpenDatabas
1c690 65 28 70 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  e(p, 0);.      }
1c6a0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
1c6b0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
1c6c0 20 29 7b 0a 20 20 20 20 20 20 70 53 74 61 74 65   ){.      pState
1c6d0 20 3d 20 72 62 75 4c 6f 61 64 53 74 61 74 65 28   = rbuLoadState(
1c6e0 70 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  p);.      assert
1c6f0 28 20 70 53 74 61 74 65 20 7c 7c 20 70 2d 3e 72  ( pState || p->r
1c700 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
1c710 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
1c720 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 0a 20  =SQLITE_OK ){.. 
1c730 20 20 20 20 20 20 20 69 66 28 20 70 53 74 61 74         if( pStat
1c740 65 2d 3e 65 53 74 61 67 65 3d 3d 30 20 29 7b 20  e->eStage==0 ){ 
1c750 0a 20 20 20 20 20 20 20 20 20 20 72 62 75 44 65  .          rbuDe
1c760 6c 65 74 65 4f 61 6c 46 69 6c 65 28 70 29 3b 0a  leteOalFile(p);.
1c770 20 20 20 20 20 20 20 20 20 20 72 62 75 49 6e 69            rbuIni
1c780 74 50 68 61 73 65 4f 6e 65 53 74 65 70 73 28 70  tPhaseOneSteps(p
1c790 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  );.          p->
1c7a0 65 53 74 61 67 65 20 3d 20 52 42 55 5f 53 54 41  eStage = RBU_STA
1c7b0 47 45 5f 4f 41 4c 3b 0a 20 20 20 20 20 20 20 20  GE_OAL;.        
1c7c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1c7d0 20 70 2d 3e 65 53 74 61 67 65 20 3d 20 70 53 74   p->eStage = pSt
1c7e0 61 74 65 2d 3e 65 53 74 61 67 65 3b 0a 20 20 20  ate->eStage;.   
1c7f0 20 20 20 20 20 20 20 70 2d 3e 6e 50 68 61 73 65         p->nPhase
1c800 4f 6e 65 53 74 65 70 20 3d 20 70 53 74 61 74 65  OneStep = pState
1c810 2d 3e 6e 50 68 61 73 65 4f 6e 65 53 74 65 70 3b  ->nPhaseOneStep;
1c820 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1c830 20 20 20 70 2d 3e 6e 50 72 6f 67 72 65 73 73 20     p->nProgress 
1c840 3d 20 70 53 74 61 74 65 2d 3e 6e 50 72 6f 67 72  = pState->nProgr
1c850 65 73 73 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  ess;.        p->
1c860 69 4f 61 6c 53 7a 20 3d 20 70 53 74 61 74 65 2d  iOalSz = pState-
1c870 3e 69 4f 61 6c 53 7a 3b 0a 20 20 20 20 20 20 7d  >iOalSz;.      }
1c880 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
1c890 74 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45  t( p->rc!=SQLITE
1c8a0 5f 4f 4b 20 7c 7c 20 70 2d 3e 65 53 74 61 67 65  _OK || p->eStage
1c8b0 21 3d 30 20 29 3b 0a 0a 20 20 20 20 69 66 28 20  !=0 );..    if( 
1c8c0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
1c8d0 20 26 26 20 70 2d 3e 70 54 61 72 67 65 74 46 64   && p->pTargetFd
1c8e0 2d 3e 70 57 61 6c 46 64 20 29 7b 0a 20 20 20 20  ->pWalFd ){.    
1c8f0 20 20 69 66 28 20 70 2d 3e 65 53 74 61 67 65 3d    if( p->eStage=
1c900 3d 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20 29  =RBU_STAGE_OAL )
1c910 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20  {.        p->rc 
1c920 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
1c930 20 20 20 20 20 20 20 20 70 2d 3e 7a 45 72 72 6d          p->zErrm
1c940 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  sg = sqlite3_mpr
1c950 69 6e 74 66 28 22 63 61 6e 6e 6f 74 20 75 70 64  intf("cannot upd
1c960 61 74 65 20 77 61 6c 20 6d 6f 64 65 20 64 61 74  ate wal mode dat
1c970 61 62 61 73 65 22 29 3b 0a 20 20 20 20 20 20 7d  abase");.      }
1c980 65 6c 73 65 20 69 66 28 20 70 2d 3e 65 53 74 61  else if( p->eSta
1c990 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4d 4f  ge==RBU_STAGE_MO
1c9a0 56 45 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  VE ){.        p-
1c9b0 3e 65 53 74 61 67 65 20 3d 20 52 42 55 5f 53 54  >eStage = RBU_ST
1c9c0 41 47 45 5f 43 4b 50 54 3b 0a 20 20 20 20 20 20  AGE_CKPT;.      
1c9d0 20 20 70 2d 3e 6e 53 74 65 70 20 3d 20 30 3b 0a    p->nStep = 0;.
1c9e0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1c9f0 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
1ca00 4c 49 54 45 5f 4f 4b 20 0a 20 20 20 20 20 26 26  LITE_OK .     &&
1ca10 20 28 70 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55   (p->eStage==RBU
1ca20 5f 53 54 41 47 45 5f 4f 41 4c 20 7c 7c 20 70 2d  _STAGE_OAL || p-
1ca30 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41  >eStage==RBU_STA
1ca40 47 45 5f 4d 4f 56 45 29 0a 20 20 20 20 20 26 26  GE_MOVE).     &&
1ca50 20 70 53 74 61 74 65 2d 3e 65 53 74 61 67 65 21   pState->eStage!
1ca60 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  =0.    ){.      
1ca70 72 62 75 5f 66 69 6c 65 20 2a 70 46 64 20 3d 20  rbu_file *pFd = 
1ca80 28 72 62 75 49 73 56 61 63 75 75 6d 28 70 29 20  (rbuIsVacuum(p) 
1ca90 3f 20 70 2d 3e 70 52 62 75 46 64 20 3a 20 70 2d  ? p->pRbuFd : p-
1caa0 3e 70 54 61 72 67 65 74 46 64 29 3b 0a 20 20 20  >pTargetFd);.   
1cab0 20 20 20 69 66 28 20 70 46 64 2d 3e 69 43 6f 6f     if( pFd->iCoo
1cac0 6b 69 65 21 3d 70 53 74 61 74 65 2d 3e 69 43 6f  kie!=pState->iCo
1cad0 6f 6b 69 65 20 29 7b 20 20 20 0a 20 20 20 20 20  okie ){   .     
1cae0 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f     /* At this po
1caf0 69 6e 74 20 28 70 54 61 72 67 65 74 46 64 2d 3e  int (pTargetFd->
1cb00 69 43 6f 6f 6b 69 65 29 20 63 6f 6e 74 61 69 6e  iCookie) contain
1cb10 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  s the value of t
1cb20 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 68  he.        ** ch
1cb30 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 63 6f 6f  ange-counter coo
1cb40 6b 69 65 20 28 74 68 65 20 74 68 69 6e 67 20 74  kie (the thing t
1cb50 68 61 74 20 67 65 74 73 20 69 6e 63 72 65 6d 65  hat gets increme
1cb60 6e 74 65 64 20 77 68 65 6e 20 61 20 0a 20 20 20  nted when a .   
1cb70 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74       ** transact
1cb80 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  ion is committed
1cb90 20 69 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64   in rollback mod
1cba0 65 29 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f  e) currently sto
1cbb0 72 65 64 20 6f 6e 20 0a 20 20 20 20 20 20 20 20  red on .        
1cbc0 2a 2a 20 70 61 67 65 20 31 20 6f 66 20 74 68 65  ** page 1 of the
1cbd0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
1cbe0 2a 2f 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63  */.        p->rc
1cbf0 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
1cc00 20 20 20 20 20 20 20 20 70 2d 3e 7a 45 72 72 6d          p->zErrm
1cc10 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  sg = sqlite3_mpr
1cc20 69 6e 74 66 28 22 64 61 74 61 62 61 73 65 20 6d  intf("database m
1cc30 6f 64 69 66 69 65 64 20 64 75 72 69 6e 67 20 72  odified during r
1cc40 62 75 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20  bu %s",.        
1cc50 20 20 20 20 28 72 62 75 49 73 56 61 63 75 75 6d      (rbuIsVacuum
1cc60 28 70 29 20 3f 20 22 76 61 63 75 75 6d 22 20 3a  (p) ? "vacuum" :
1cc70 20 22 75 70 64 61 74 65 22 29 0a 20 20 20 20 20   "update").     
1cc80 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20     );.      }.  
1cc90 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e    }..    if( p->
1cca0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1ccb0 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65 53  .      if( p->eS
1ccc0 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f  tage==RBU_STAGE_
1ccd0 4f 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 73  OAL ){.        s
1cce0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
1ccf0 64 62 4d 61 69 6e 3b 0a 20 20 20 20 20 20 20 20  dbMain;.        
1cd00 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  p->rc = sqlite3_
1cd10 65 78 65 63 28 70 2d 3e 64 62 52 62 75 2c 20 22  exec(p->dbRbu, "
1cd20 42 45 47 49 4e 22 2c 20 30 2c 20 30 2c 20 26 70  BEGIN", 0, 0, &p
1cd30 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a 0a 20 20 20  ->zErrmsg);..   
1cd40 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 20 74 68       /* Point th
1cd50 65 20 6f 62 6a 65 63 74 20 69 74 65 72 61 74 6f  e object iterato
1cd60 72 20 61 74 20 74 68 65 20 66 69 72 73 74 20 6f  r at the first o
1cd70 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 20 20 20  bject */.       
1cd80 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
1cd90 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1cda0 20 20 20 70 2d 3e 72 63 20 3d 20 72 62 75 4f 62     p->rc = rbuOb
1cdb0 6a 49 74 65 72 46 69 72 73 74 28 70 2c 20 26 70  jIterFirst(p, &p
1cdc0 2d 3e 6f 62 6a 69 74 65 72 29 3b 0a 20 20 20 20  ->objiter);.    
1cdd0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
1cde0 2a 20 49 66 20 74 68 65 20 52 42 55 20 64 61 74  * If the RBU dat
1cdf0 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 73 20 6e  abase contains n
1ce00 6f 20 64 61 74 61 5f 78 78 78 20 74 61 62 6c 65  o data_xxx table
1ce10 73 2c 20 64 65 63 6c 61 72 65 20 74 68 65 20 52  s, declare the R
1ce20 42 55 0a 20 20 20 20 20 20 20 20 2a 2a 20 75 70  BU.        ** up
1ce30 64 61 74 65 20 66 69 6e 69 73 68 65 64 2e 20 20  date finished.  
1ce40 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  */.        if( p
1ce50 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
1ce60 26 26 20 70 2d 3e 6f 62 6a 69 74 65 72 2e 7a 54  && p->objiter.zT
1ce70 62 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  bl==0 ){.       
1ce80 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
1ce90 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20  E_DONE;.        
1cea0 20 20 70 2d 3e 65 53 74 61 67 65 20 3d 20 52 42    p->eStage = RB
1ceb0 55 5f 53 54 41 47 45 5f 44 4f 4e 45 3b 0a 20 20  U_STAGE_DONE;.  
1cec0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1ced0 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63         if( p->rc
1cee0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
1cef0 53 74 61 74 65 2d 3e 65 53 74 61 67 65 3d 3d 30  State->eStage==0
1cf00 20 26 26 20 72 62 75 49 73 56 61 63 75 75 6d 28   && rbuIsVacuum(
1cf10 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  p) ){.          
1cf20 20 20 72 62 75 43 6f 70 79 50 72 61 67 6d 61 28    rbuCopyPragma(
1cf30 70 2c 20 22 70 61 67 65 5f 73 69 7a 65 22 29 3b  p, "page_size");
1cf40 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 62 75  .            rbu
1cf50 43 6f 70 79 50 72 61 67 6d 61 28 70 2c 20 22 61  CopyPragma(p, "a
1cf60 75 74 6f 5f 76 61 63 75 75 6d 22 29 3b 0a 20 20  uto_vacuum");.  
1cf70 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
1cf80 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 72 61       /* Open tra
1cf90 6e 73 61 63 74 69 6f 6e 73 20 62 6f 74 68 20 64  nsactions both d
1cfa0 61 74 61 62 61 73 65 73 2e 20 54 68 65 20 2a 2d  atabases. The *-
1cfb0 6f 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e  oal file is open
1cfc0 65 64 20 6f 72 0a 20 20 20 20 20 20 20 20 20 20  ed or.          
1cfd0 2a 2a 20 63 72 65 61 74 65 64 20 61 74 20 74 68  ** created at th
1cfe0 69 73 20 70 6f 69 6e 74 2e 20 2a 2f 0a 20 20 20  is point. */.   
1cff0 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63         if( p->rc
1d000 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1d010 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63             p->rc
1d020 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28   = sqlite3_exec(
1d030 64 62 2c 20 22 42 45 47 49 4e 20 49 4d 4d 45 44  db, "BEGIN IMMED
1d040 49 41 54 45 22 2c 20 30 2c 20 30 2c 20 26 70 2d  IATE", 0, 0, &p-
1d050 3e 7a 45 72 72 6d 73 67 29 3b 0a 20 20 20 20 20  >zErrmsg);.     
1d060 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
1d070 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68    /* Check if th
1d080 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
1d090 69 73 20 61 20 7a 69 70 76 66 73 20 64 62 2e 20  is a zipvfs db. 
1d0a0 49 66 20 69 74 20 69 73 2c 20 73 65 74 20 74 68  If it is, set th
1d0b0 65 20 75 70 70 65 72 0a 20 20 20 20 20 20 20 20  e upper.        
1d0c0 20 20 2a 2a 20 6c 65 76 65 6c 20 70 61 67 65 72    ** level pager
1d0d0 20 74 6f 20 75 73 65 20 22 6a 6f 75 72 6e 61 6c   to use "journal
1d0e0 5f 6d 6f 64 65 3d 6f 66 66 22 2e 20 54 68 69 73  _mode=off". This
1d0f0 20 70 72 65 76 65 6e 74 73 20 69 74 20 66 72 6f   prevents it fro
1d100 6d 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  m .          ** 
1d110 67 65 6e 65 72 61 74 69 6e 67 20 61 20 6c 61 72  generating a lar
1d120 67 65 20 6a 6f 75 72 6e 61 6c 20 75 73 69 6e 67  ge journal using
1d130 20 61 20 74 65 6d 70 20 66 69 6c 65 2e 20 20 2a   a temp file.  *
1d140 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
1d150 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
1d160 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1d170 69 6e 74 20 66 72 63 20 3d 20 73 71 6c 69 74 65  int frc = sqlite
1d180 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64  3_file_control(d
1d190 62 2c 20 22 6d 61 69 6e 22 2c 20 53 51 4c 49 54  b, "main", SQLIT
1d1a0 45 5f 46 43 4e 54 4c 5f 5a 49 50 56 46 53 2c 20  E_FCNTL_ZIPVFS, 
1d1b0 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
1d1c0 69 66 28 20 66 72 63 3d 3d 53 51 4c 49 54 45 5f  if( frc==SQLITE_
1d1d0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
1d1e0 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69      p->rc = sqli
1d1f0 74 65 33 5f 65 78 65 63 28 0a 20 20 20 20 20 20  te3_exec(.      
1d200 20 20 20 20 20 20 20 20 20 20 64 62 2c 20 22 50            db, "P
1d210 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
1d220 64 65 3d 6f 66 66 22 2c 30 2c 30 2c 26 70 2d 3e  de=off",0,0,&p->
1d230 7a 45 72 72 6d 73 67 29 3b 0a 20 20 20 20 20 20  zErrmsg);.      
1d240 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1d250 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 69    }..          i
1d260 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
1d270 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1d280 20 20 20 72 62 75 53 65 74 75 70 4f 61 6c 28 70     rbuSetupOal(p
1d290 2c 20 70 53 74 61 74 65 29 3b 0a 20 20 20 20 20  , pState);.     
1d2a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
1d2b0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1d2c0 20 70 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f   p->eStage==RBU_
1d2d0 53 54 41 47 45 5f 4d 4f 56 45 20 29 7b 0a 20 20  STAGE_MOVE ){.  
1d2e0 20 20 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a        /* no-op *
1d2f0 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  /.      }else if
1d300 28 20 70 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55  ( p->eStage==RBU
1d310 5f 53 54 41 47 45 5f 43 4b 50 54 20 29 7b 0a 20  _STAGE_CKPT ){. 
1d320 20 20 20 20 20 20 20 72 62 75 53 65 74 75 70 43         rbuSetupC
1d330 68 65 63 6b 70 6f 69 6e 74 28 70 2c 20 70 53 74  heckpoint(p, pSt
1d340 61 74 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ate);.      }els
1d350 65 20 69 66 28 20 70 2d 3e 65 53 74 61 67 65 3d  e if( p->eStage=
1d360 3d 52 42 55 5f 53 54 41 47 45 5f 44 4f 4e 45 20  =RBU_STAGE_DONE 
1d370 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63  ){.        p->rc
1d380 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a   = SQLITE_DONE;.
1d390 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1d3a0 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c       p->rc = SQL
1d3b0 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  ITE_CORRUPT;.   
1d3c0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
1d3d0 72 62 75 46 72 65 65 53 74 61 74 65 28 70 53 74  rbuFreeState(pSt
1d3e0 61 74 65 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  ate);.  }..  ret
1d3f0 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
1d400 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72 65 74  Allocate and ret
1d410 75 72 6e 20 61 6e 20 52 42 55 20 68 61 6e 64 6c  urn an RBU handl
1d420 65 20 77 69 74 68 20 61 6c 6c 20 66 69 65 6c 64  e with all field
1d430 73 20 7a 65 72 6f 65 64 20 65 78 63 65 70 74 20  s zeroed except 
1d440 66 6f 72 20 74 68 65 0a 2a 2a 20 65 72 72 6f 72  for the.** error
1d450 20 63 6f 64 65 2c 20 77 68 69 63 68 20 69 73 20   code, which is 
1d460 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4d 49  set to SQLITE_MI
1d470 53 55 53 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  SUSE..*/.static 
1d480 73 71 6c 69 74 65 33 72 62 75 20 2a 72 62 75 4d  sqlite3rbu *rbuM
1d490 69 73 75 73 65 45 72 72 6f 72 28 76 6f 69 64 29  isuseError(void)
1d4a0 7b 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20 2a  {.  sqlite3rbu *
1d4b0 70 52 65 74 3b 0a 20 20 70 52 65 74 20 3d 20 73  pRet;.  pRet = s
1d4c0 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28  qlite3_malloc64(
1d4d0 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 72 62  sizeof(sqlite3rb
1d4e0 75 29 29 3b 0a 20 20 69 66 28 20 70 52 65 74 20  u));.  if( pRet 
1d4f0 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 52  ){.    memset(pR
1d500 65 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 71  et, 0, sizeof(sq
1d510 6c 69 74 65 33 72 62 75 29 29 3b 0a 20 20 20 20  lite3rbu));.    
1d520 70 52 65 74 2d 3e 72 63 20 3d 20 53 51 4c 49 54  pRet->rc = SQLIT
1d530 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 20 20  E_MISUSE;.  }.  
1d540 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a  return pRet;.}..
1d550 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 6e 64 20 72  /*.** Open and r
1d560 65 74 75 72 6e 20 61 20 6e 65 77 20 52 42 55 20  eturn a new RBU 
1d570 68 61 6e 64 6c 65 2e 20 0a 2a 2f 0a 73 71 6c 69  handle. .*/.sqli
1d580 74 65 33 72 62 75 20 2a 73 71 6c 69 74 65 33 72  te3rbu *sqlite3r
1d590 62 75 5f 6f 70 65 6e 28 0a 20 20 63 6f 6e 73 74  bu_open(.  const
1d5a0 20 63 68 61 72 20 2a 7a 54 61 72 67 65 74 2c 20   char *zTarget, 
1d5b0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1d5c0 52 62 75 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  Rbu,.  const cha
1d5d0 72 20 2a 7a 53 74 61 74 65 0a 29 7b 0a 20 20 69  r *zState.){.  i
1d5e0 66 28 20 7a 54 61 72 67 65 74 3d 3d 30 20 7c 7c  f( zTarget==0 ||
1d5f0 20 7a 52 62 75 3d 3d 30 20 29 7b 20 72 65 74 75   zRbu==0 ){ retu
1d600 72 6e 20 72 62 75 4d 69 73 75 73 65 45 72 72 6f  rn rbuMisuseErro
1d610 72 28 29 3b 20 7d 0a 20 20 2f 2a 20 54 4f 44 4f  r(); }.  /* TODO
1d620 3a 20 43 68 65 63 6b 20 74 68 61 74 20 7a 54 61  : Check that zTa
1d630 72 67 65 74 20 61 6e 64 20 7a 52 62 75 20 61 72  rget and zRbu ar
1d640 65 20 6e 6f 6e 2d 4e 55 4c 4c 20 2a 2f 0a 20 20  e non-NULL */.  
1d650 72 65 74 75 72 6e 20 6f 70 65 6e 52 62 75 48 61  return openRbuHa
1d660 6e 64 6c 65 28 7a 54 61 72 67 65 74 2c 20 7a 52  ndle(zTarget, zR
1d670 62 75 2c 20 7a 53 74 61 74 65 29 3b 0a 7d 0a 0a  bu, zState);.}..
1d680 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 68 61 6e  /*.** Open a han
1d690 64 6c 65 20 74 6f 20 62 65 67 69 6e 20 6f 72 20  dle to begin or 
1d6a0 72 65 73 75 6d 65 20 61 6e 20 52 42 55 20 56 41  resume an RBU VA
1d6b0 43 55 55 4d 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  CUUM operation..
1d6c0 2a 2f 0a 73 71 6c 69 74 65 33 72 62 75 20 2a 73  */.sqlite3rbu *s
1d6d0 71 6c 69 74 65 33 72 62 75 5f 76 61 63 75 75 6d  qlite3rbu_vacuum
1d6e0 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
1d6f0 7a 54 61 72 67 65 74 2c 20 0a 20 20 63 6f 6e 73  zTarget, .  cons
1d700 74 20 63 68 61 72 20 2a 7a 53 74 61 74 65 0a 29  t char *zState.)
1d710 7b 0a 20 20 69 66 28 20 7a 54 61 72 67 65 74 3d  {.  if( zTarget=
1d720 3d 30 20 29 7b 20 72 65 74 75 72 6e 20 72 62 75  =0 ){ return rbu
1d730 4d 69 73 75 73 65 45 72 72 6f 72 28 29 3b 20 7d  MisuseError(); }
1d740 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 43 68 65 63  .  /* TODO: Chec
1d750 6b 20 74 68 61 74 20 62 6f 74 68 20 61 72 67 75  k that both argu
1d760 6d 65 6e 74 73 20 61 72 65 20 6e 6f 6e 2d 4e 55  ments are non-NU
1d770 4c 4c 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 6f  LL */.  return o
1d780 70 65 6e 52 62 75 48 61 6e 64 6c 65 28 30 2c 20  penRbuHandle(0, 
1d790 7a 54 61 72 67 65 74 2c 20 7a 53 74 61 74 65 29  zTarget, zState)
1d7a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1d7b0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  n the database h
1d7c0 61 6e 64 6c 65 20 75 73 65 64 20 62 79 20 70 52  andle used by pR
1d7d0 62 75 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20 2a  bu..*/.sqlite3 *
1d7e0 73 71 6c 69 74 65 33 72 62 75 5f 64 62 28 73 71  sqlite3rbu_db(sq
1d7f0 6c 69 74 65 33 72 62 75 20 2a 70 52 62 75 2c 20  lite3rbu *pRbu, 
1d800 69 6e 74 20 62 52 62 75 29 7b 0a 20 20 73 71 6c  int bRbu){.  sql
1d810 69 74 65 33 20 2a 64 62 20 3d 20 30 3b 0a 20 20  ite3 *db = 0;.  
1d820 69 66 28 20 70 52 62 75 20 29 7b 0a 20 20 20 20  if( pRbu ){.    
1d830 64 62 20 3d 20 28 62 52 62 75 20 3f 20 70 52 62  db = (bRbu ? pRb
1d840 75 2d 3e 64 62 52 62 75 20 3a 20 70 52 62 75 2d  u->dbRbu : pRbu-
1d850 3e 64 62 4d 61 69 6e 29 3b 0a 20 20 7d 0a 20 20  >dbMain);.  }.  
1d860 72 65 74 75 72 6e 20 64 62 3b 0a 7d 0a 0a 0a 2f  return db;.}.../
1d870 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 72 72 6f  *.** If the erro
1d880 72 20 63 6f 64 65 20 63 75 72 72 65 6e 74 6c 79  r code currently
1d890 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 52   stored in the R
1d8a0 42 55 20 68 61 6e 64 6c 65 20 69 73 20 53 51 4c  BU handle is SQL
1d8b0 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 0a  ITE_CONSTRAINT,.
1d8c0 2a 2a 20 74 68 65 6e 20 65 64 69 74 20 61 6e 79  ** then edit any
1d8d0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 73   error message s
1d8e0 74 72 69 6e 67 20 73 6f 20 61 73 20 74 6f 20 72  tring so as to r
1d8f0 65 6d 6f 76 65 20 61 6c 6c 20 6f 63 63 75 72 72  emove all occurr
1d900 65 6e 63 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20  ences of.** the 
1d910 70 61 74 74 65 72 6e 20 22 72 62 75 5f 69 6d 70  pattern "rbu_imp
1d920 5f 5b 30 2d 39 5d 2a 22 2e 0a 2a 2f 0a 73 74 61  _[0-9]*"..*/.sta
1d930 74 69 63 20 76 6f 69 64 20 72 62 75 45 64 69 74  tic void rbuEdit
1d940 45 72 72 6d 73 67 28 73 71 6c 69 74 65 33 72 62  Errmsg(sqlite3rb
1d950 75 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  u *p){.  if( p->
1d960 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54  rc==SQLITE_CONST
1d970 52 41 49 4e 54 20 26 26 20 70 2d 3e 7a 45 72 72  RAINT && p->zErr
1d980 6d 73 67 20 29 7b 0a 20 20 20 20 75 6e 73 69 67  msg ){.    unsig
1d990 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20 20 20 73  ned int i;.    s
1d9a0 69 7a 65 5f 74 20 6e 45 72 72 6d 73 67 20 3d 20  ize_t nErrmsg = 
1d9b0 73 74 72 6c 65 6e 28 70 2d 3e 7a 45 72 72 6d 73  strlen(p->zErrms
1d9c0 67 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  g);.    for(i=0;
1d9d0 20 69 3c 28 6e 45 72 72 6d 73 67 2d 38 29 3b 20   i<(nErrmsg-8); 
1d9e0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
1d9f0 6d 65 6d 63 6d 70 28 26 70 2d 3e 7a 45 72 72 6d  memcmp(&p->zErrm
1da00 73 67 5b 69 5d 2c 20 22 72 62 75 5f 69 6d 70 5f  sg[i], "rbu_imp_
1da10 22 2c 20 38 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", 8)==0 ){.    
1da20 20 20 20 20 69 6e 74 20 6e 44 65 6c 20 3d 20 38      int nDel = 8
1da30 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  ;.        while(
1da40 20 70 2d 3e 7a 45 72 72 6d 73 67 5b 69 2b 6e 44   p->zErrmsg[i+nD
1da50 65 6c 5d 3e 3d 27 30 27 20 26 26 20 70 2d 3e 7a  el]>='0' && p->z
1da60 45 72 72 6d 73 67 5b 69 2b 6e 44 65 6c 5d 3c 3d  Errmsg[i+nDel]<=
1da70 27 39 27 20 29 20 6e 44 65 6c 2b 2b 3b 0a 20 20  '9' ) nDel++;.  
1da80 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26 70        memmove(&p
1da90 2d 3e 7a 45 72 72 6d 73 67 5b 69 5d 2c 20 26 70  ->zErrmsg[i], &p
1daa0 2d 3e 7a 45 72 72 6d 73 67 5b 69 2b 6e 44 65 6c  ->zErrmsg[i+nDel
1dab0 5d 2c 20 6e 45 72 72 6d 73 67 20 2b 20 31 20 2d  ], nErrmsg + 1 -
1dac0 20 69 20 2d 20 6e 44 65 6c 29 3b 0a 20 20 20 20   i - nDel);.    
1dad0 20 20 20 20 6e 45 72 72 6d 73 67 20 2d 3d 20 6e      nErrmsg -= n
1dae0 44 65 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Del;.      }.   
1daf0 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
1db00 43 6c 6f 73 65 20 74 68 65 20 52 42 55 20 68 61  Close the RBU ha
1db10 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ndle..*/.int sql
1db20 69 74 65 33 72 62 75 5f 63 6c 6f 73 65 28 73 71  ite3rbu_close(sq
1db30 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 63 68 61  lite3rbu *p, cha
1db40 72 20 2a 2a 70 7a 45 72 72 6d 73 67 29 7b 0a 20  r **pzErrmsg){. 
1db50 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 70   int rc;.  if( p
1db60 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 6d   ){..    /* Comm
1db70 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  it the transacti
1db80 6f 6e 20 74 6f 20 74 68 65 20 2a 2d 6f 61 6c 20  on to the *-oal 
1db90 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28  file. */.    if(
1dba0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1dbb0 4b 20 26 26 20 70 2d 3e 65 53 74 61 67 65 3d 3d  K && p->eStage==
1dbc0 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20 29 7b  RBU_STAGE_OAL ){
1dbd0 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73  .      p->rc = s
1dbe0 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
1dbf0 62 4d 61 69 6e 2c 20 22 43 4f 4d 4d 49 54 22 2c  bMain, "COMMIT",
1dc00 20 30 2c 20 30 2c 20 26 70 2d 3e 7a 45 72 72 6d   0, 0, &p->zErrm
1dc10 73 67 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  sg);.    }..    
1dc20 2f 2a 20 53 79 6e 63 20 74 68 65 20 64 62 20 66  /* Sync the db f
1dc30 69 6c 65 20 69 66 20 63 75 72 72 65 6e 74 6c 79  ile if currently
1dc40 20 64 6f 69 6e 67 20 61 6e 20 69 6e 63 72 65 6d   doing an increm
1dc50 65 6e 74 61 6c 20 63 68 65 63 6b 70 6f 69 6e 74  ental checkpoint
1dc60 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 72   */.    if( p->r
1dc70 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1dc80 70 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53  p->eStage==RBU_S
1dc90 54 41 47 45 5f 43 4b 50 54 20 29 7b 0a 20 20 20  TAGE_CKPT ){.   
1dca0 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20     sqlite3_file 
1dcb0 2a 70 44 62 20 3d 20 70 2d 3e 70 54 61 72 67 65  *pDb = p->pTarge
1dcc0 74 46 64 2d 3e 70 52 65 61 6c 3b 0a 20 20 20 20  tFd->pReal;.    
1dcd0 20 20 70 2d 3e 72 63 20 3d 20 70 44 62 2d 3e 70    p->rc = pDb->p
1dce0 4d 65 74 68 6f 64 73 2d 3e 78 53 79 6e 63 28 70  Methods->xSync(p
1dcf0 44 62 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  Db, SQLITE_SYNC_
1dd00 4e 4f 52 4d 41 4c 29 3b 0a 20 20 20 20 7d 0a 0a  NORMAL);.    }..
1dd10 20 20 20 20 72 62 75 53 61 76 65 53 74 61 74 65      rbuSaveState
1dd20 28 70 2c 20 70 2d 3e 65 53 74 61 67 65 29 3b 0a  (p, p->eStage);.
1dd30 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  .    if( p->rc==
1dd40 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e  SQLITE_OK && p->
1dd50 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47  eStage==RBU_STAG
1dd60 45 5f 4f 41 4c 20 29 7b 0a 20 20 20 20 20 20 70  E_OAL ){.      p
1dd70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65  ->rc = sqlite3_e
1dd80 78 65 63 28 70 2d 3e 64 62 52 62 75 2c 20 22 43  xec(p->dbRbu, "C
1dd90 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 2c 20 26 70  OMMIT", 0, 0, &p
1dda0 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a 20 20 20 20  ->zErrmsg);.    
1ddb0 7d 0a 0a 20 20 20 20 2f 2a 20 43 6c 6f 73 65 20  }..    /* Close 
1ddc0 61 6e 79 20 6f 70 65 6e 20 73 74 61 74 65 6d 65  any open stateme
1ddd0 6e 74 20 68 61 6e 64 6c 65 73 2e 20 2a 2f 0a 20  nt handles. */. 
1dde0 20 20 20 72 62 75 4f 62 6a 49 74 65 72 46 69 6e     rbuObjIterFin
1ddf0 61 6c 69 7a 65 28 26 70 2d 3e 6f 62 6a 69 74 65  alize(&p->objite
1de00 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  r);..    /* If t
1de10 68 69 73 20 69 73 20 61 6e 20 52 42 55 20 76 61  his is an RBU va
1de20 63 75 75 6d 20 68 61 6e 64 6c 65 20 61 6e 64 20  cuum handle and 
1de30 74 68 65 20 76 61 63 75 75 6d 20 68 61 73 20 65  the vacuum has e
1de40 69 74 68 65 72 20 66 69 6e 69 73 68 65 64 0a 20  ither finished. 
1de50 20 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c     ** successful
1de60 6c 79 20 6f 72 20 65 6e 63 6f 75 6e 74 65 72 65  ly or encountere
1de70 64 20 61 6e 20 65 72 72 6f 72 2c 20 64 65 6c 65  d an error, dele
1de80 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  te the contents 
1de90 6f 66 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 73  of the .    ** s
1dea0 74 61 74 65 20 74 61 62 6c 65 2e 20 54 68 69 73  tate table. This
1deb0 20 63 61 75 73 65 73 20 74 68 65 20 6e 65 78 74   causes the next
1dec0 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
1ded0 72 62 75 5f 76 61 63 75 75 6d 28 29 20 0a 20 20  rbu_vacuum() .  
1dee0 20 20 2a 2a 20 73 70 65 63 69 66 79 69 6e 67 20    ** specifying 
1def0 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 72 67  the current targ
1df00 65 74 20 61 6e 64 20 73 74 61 74 65 20 64 61 74  et and state dat
1df10 61 62 61 73 65 73 20 74 6f 20 73 74 61 72 74 20  abases to start 
1df20 61 20 6e 65 77 0a 20 20 20 20 2a 2a 20 76 61 63  a new.    ** vac
1df30 75 75 6d 20 66 72 6f 6d 20 73 63 72 61 74 63 68  uum from scratch
1df40 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 62  .  */.    if( rb
1df50 75 49 73 56 61 63 75 75 6d 28 70 29 20 26 26 20  uIsVacuum(p) && 
1df60 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc!=SQLITE_OK
1df70 20 26 26 20 70 2d 3e 64 62 52 62 75 20 29 7b 0a   && p->dbRbu ){.
1df80 20 20 20 20 20 20 69 6e 74 20 72 63 32 20 3d 20        int rc2 = 
1df90 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e  sqlite3_exec(p->
1dfa0 64 62 52 62 75 2c 20 22 44 45 4c 45 54 45 20 46  dbRbu, "DELETE F
1dfb0 52 4f 4d 20 73 74 61 74 2e 72 62 75 5f 73 74 61  ROM stat.rbu_sta
1dfc0 74 65 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  te", 0, 0, 0);. 
1dfd0 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
1dfe0 53 51 4c 49 54 45 5f 44 4f 4e 45 20 26 26 20 72  SQLITE_DONE && r
1dff0 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  c2!=SQLITE_OK ) 
1e000 70 2d 3e 72 63 20 3d 20 72 63 32 3b 0a 20 20 20  p->rc = rc2;.   
1e010 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6c 6f 73 65   }..    /* Close
1e020 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61   the open databa
1e030 73 65 20 68 61 6e 64 6c 65 20 61 6e 64 20 56 46  se handle and VF
1e040 53 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 20  S object. */.   
1e050 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70   sqlite3_close(p
1e060 2d 3e 64 62 52 62 75 29 3b 0a 20 20 20 20 73 71  ->dbRbu);.    sq
1e070 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 2d 3e 64  lite3_close(p->d
1e080 62 4d 61 69 6e 29 3b 0a 20 20 20 20 72 62 75 44  bMain);.    rbuD
1e090 65 6c 65 74 65 56 66 73 28 70 29 3b 0a 20 20 20  eleteVfs(p);.   
1e0a0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
1e0b0 3e 61 42 75 66 29 3b 0a 20 20 20 20 73 71 6c 69  >aBuf);.    sqli
1e0c0 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 46 72 61  te3_free(p->aFra
1e0d0 6d 65 29 3b 0a 0a 20 20 20 20 72 62 75 45 64 69  me);..    rbuEdi
1e0e0 74 45 72 72 6d 73 67 28 70 29 3b 0a 20 20 20 20  tErrmsg(p);.    
1e0f0 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 20 20  rc = p->rc;.    
1e100 2a 70 7a 45 72 72 6d 73 67 20 3d 20 70 2d 3e 7a  *pzErrmsg = p->z
1e110 45 72 72 6d 73 67 3b 0a 20 20 20 20 73 71 6c 69  Errmsg;.    sqli
1e120 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 53 74 61  te3_free(p->zSta
1e130 74 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  te);.    sqlite3
1e140 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d 65 6c 73  _free(p);.  }els
1e150 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  e{.    rc = SQLI
1e160 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 2a 70  TE_NOMEM;.    *p
1e170 7a 45 72 72 6d 73 67 20 3d 20 30 3b 0a 20 20 7d  zErrmsg = 0;.  }
1e180 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1e190 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
1e1a0 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
1e1b0 66 20 6b 65 79 2d 76 61 6c 75 65 20 6f 70 65 72  f key-value oper
1e1c0 61 74 69 6f 6e 73 20 28 69 6e 73 65 72 74 73 2c  ations (inserts,
1e1d0 20 64 65 6c 65 74 65 73 20 6f 72 20 0a 2a 2a 20   deletes or .** 
1e1e0 75 70 64 61 74 65 73 29 20 74 68 61 74 20 68 61  updates) that ha
1e1f0 76 65 20 62 65 65 6e 20 70 65 72 66 6f 72 6d 65  ve been performe
1e200 64 20 6f 6e 20 74 68 65 20 74 61 72 67 65 74 20  d on the target 
1e210 64 61 74 61 62 61 73 65 20 73 69 6e 63 65 20 74  database since t
1e220 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 52 42  he.** current RB
1e230 55 20 75 70 64 61 74 65 20 77 61 73 20 73 74 61  U update was sta
1e240 72 74 65 64 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33  rted..*/.sqlite3
1e250 5f 69 6e 74 36 34 20 73 71 6c 69 74 65 33 72 62  _int64 sqlite3rb
1e260 75 5f 70 72 6f 67 72 65 73 73 28 73 71 6c 69 74  u_progress(sqlit
1e270 65 33 72 62 75 20 2a 70 52 62 75 29 7b 0a 20 20  e3rbu *pRbu){.  
1e280 72 65 74 75 72 6e 20 70 52 62 75 2d 3e 6e 50 72  return pRbu->nPr
1e290 6f 67 72 65 73 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ogress;.}../*.**
1e2a0 20 52 65 74 75 72 6e 20 70 65 72 6d 79 72 69 61   Return permyria
1e2b0 64 61 67 65 20 70 72 6f 67 72 65 73 73 20 69 6e  dage progress in
1e2c0 64 69 63 61 74 69 6f 6e 73 20 66 6f 72 20 74 68  dications for th
1e2d0 65 20 74 77 6f 20 6d 61 69 6e 20 73 74 61 67 65  e two main stage
1e2e0 73 20 6f 66 0a 2a 2a 20 61 6e 20 52 42 55 20 75  s of.** an RBU u
1e2f0 70 64 61 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  pdate..*/.void s
1e300 71 6c 69 74 65 33 72 62 75 5f 62 70 5f 70 72 6f  qlite3rbu_bp_pro
1e310 67 72 65 73 73 28 73 71 6c 69 74 65 33 72 62 75  gress(sqlite3rbu
1e320 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 4f 6e 65 2c   *p, int *pnOne,
1e330 20 69 6e 74 20 2a 70 6e 54 77 6f 29 7b 0a 20 20   int *pnTwo){.  
1e340 63 6f 6e 73 74 20 69 6e 74 20 4d 41 58 5f 50 52  const int MAX_PR
1e350 4f 47 52 45 53 53 20 3d 20 31 30 30 30 30 3b 0a  OGRESS = 10000;.
1e360 20 20 73 77 69 74 63 68 28 20 70 2d 3e 65 53 74    switch( p->eSt
1e370 61 67 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20  age ){.    case 
1e380 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 3a 0a 20  RBU_STAGE_OAL:. 
1e390 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 50 68 61       if( p->nPha
1e3a0 73 65 4f 6e 65 53 74 65 70 3e 30 20 29 7b 0a 20  seOneStep>0 ){. 
1e3b0 20 20 20 20 20 20 20 2a 70 6e 4f 6e 65 20 3d 20         *pnOne = 
1e3c0 28 69 6e 74 29 28 4d 41 58 5f 50 52 4f 47 52 45  (int)(MAX_PROGRE
1e3d0 53 53 20 2a 20 28 69 36 34 29 70 2d 3e 6e 50 72  SS * (i64)p->nPr
1e3e0 6f 67 72 65 73 73 2f 28 69 36 34 29 70 2d 3e 6e  ogress/(i64)p->n
1e3f0 50 68 61 73 65 4f 6e 65 53 74 65 70 29 3b 0a 20  PhaseOneStep);. 
1e400 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1e410 20 20 20 20 2a 70 6e 4f 6e 65 20 3d 20 2d 31 3b      *pnOne = -1;
1e420 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a  .      }.      *
1e430 70 6e 54 77 6f 20 3d 20 30 3b 0a 20 20 20 20 20  pnTwo = 0;.     
1e440 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73   break;..    cas
1e450 65 20 52 42 55 5f 53 54 41 47 45 5f 4d 4f 56 45  e RBU_STAGE_MOVE
1e460 3a 0a 20 20 20 20 20 20 2a 70 6e 4f 6e 65 20 3d  :.      *pnOne =
1e470 20 4d 41 58 5f 50 52 4f 47 52 45 53 53 3b 0a 20   MAX_PROGRESS;. 
1e480 20 20 20 20 20 2a 70 6e 54 77 6f 20 3d 20 30 3b       *pnTwo = 0;
1e490 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20  .      break;.. 
1e4a0 20 20 20 63 61 73 65 20 52 42 55 5f 53 54 41 47     case RBU_STAG
1e4b0 45 5f 43 4b 50 54 3a 0a 20 20 20 20 20 20 2a 70  E_CKPT:.      *p
1e4c0 6e 4f 6e 65 20 3d 20 4d 41 58 5f 50 52 4f 47 52  nOne = MAX_PROGR
1e4d0 45 53 53 3b 0a 20 20 20 20 20 20 2a 70 6e 54 77  ESS;.      *pnTw
1e4e0 6f 20 3d 20 28 69 6e 74 29 28 4d 41 58 5f 50 52  o = (int)(MAX_PR
1e4f0 4f 47 52 45 53 53 20 2a 20 28 69 36 34 29 70 2d  OGRESS * (i64)p-
1e500 3e 6e 53 74 65 70 20 2f 20 28 69 36 34 29 70 2d  >nStep / (i64)p-
1e510 3e 6e 46 72 61 6d 65 29 3b 0a 20 20 20 20 20 20  >nFrame);.      
1e520 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
1e530 20 52 42 55 5f 53 54 41 47 45 5f 44 4f 4e 45 3a   RBU_STAGE_DONE:
1e540 0a 20 20 20 20 20 20 2a 70 6e 4f 6e 65 20 3d 20  .      *pnOne = 
1e550 4d 41 58 5f 50 52 4f 47 52 45 53 53 3b 0a 20 20  MAX_PROGRESS;.  
1e560 20 20 20 20 2a 70 6e 54 77 6f 20 3d 20 4d 41 58      *pnTwo = MAX
1e570 5f 50 52 4f 47 52 45 53 53 3b 0a 20 20 20 20 20  _PROGRESS;.     
1e580 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 64 65 66   break;..    def
1e590 61 75 6c 74 3a 0a 20 20 20 20 20 20 61 73 73 65  ault:.      asse
1e5a0 72 74 28 20 30 20 29 3b 0a 20 20 7d 0a 7d 0a 0a  rt( 0 );.  }.}..
1e5b0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
1e5c0 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f   current state o
1e5d0 66 20 74 68 65 20 52 42 55 20 76 61 63 75 75 6d  f the RBU vacuum
1e5e0 20 6f 72 20 75 70 64 61 74 65 20 6f 70 65 72 61   or update opera
1e5f0 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
1e600 69 74 65 33 72 62 75 5f 73 74 61 74 65 28 73 71  ite3rbu_state(sq
1e610 6c 69 74 65 33 72 62 75 20 2a 70 29 7b 0a 20 20  lite3rbu *p){.  
1e620 69 6e 74 20 61 52 65 73 5b 5d 20 3d 20 7b 0a 20  int aRes[] = {. 
1e630 20 20 20 30 2c 20 53 51 4c 49 54 45 5f 52 42 55     0, SQLITE_RBU
1e640 5f 53 54 41 54 45 5f 4f 41 4c 2c 20 53 51 4c 49  _STATE_OAL, SQLI
1e650 54 45 5f 52 42 55 5f 53 54 41 54 45 5f 4d 4f 56  TE_RBU_STATE_MOV
1e660 45 2c 0a 20 20 20 20 30 2c 20 53 51 4c 49 54 45  E,.    0, SQLITE
1e670 5f 52 42 55 5f 53 54 41 54 45 5f 43 48 45 43 4b  _RBU_STATE_CHECK
1e680 50 4f 49 4e 54 2c 20 53 51 4c 49 54 45 5f 52 42  POINT, SQLITE_RB
1e690 55 5f 53 54 41 54 45 5f 44 4f 4e 45 0a 20 20 7d  U_STATE_DONE.  }
1e6a0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 52 42 55  ;..  assert( RBU
1e6b0 5f 53 54 41 47 45 5f 4f 41 4c 3d 3d 31 20 29 3b  _STAGE_OAL==1 );
1e6c0 0a 20 20 61 73 73 65 72 74 28 20 52 42 55 5f 53  .  assert( RBU_S
1e6d0 54 41 47 45 5f 4d 4f 56 45 3d 3d 32 20 29 3b 0a  TAGE_MOVE==2 );.
1e6e0 20 20 61 73 73 65 72 74 28 20 52 42 55 5f 53 54    assert( RBU_ST
1e6f0 41 47 45 5f 43 4b 50 54 3d 3d 34 20 29 3b 0a 20  AGE_CKPT==4 );. 
1e700 20 61 73 73 65 72 74 28 20 52 42 55 5f 53 54 41   assert( RBU_STA
1e710 47 45 5f 44 4f 4e 45 3d 3d 35 20 29 3b 0a 20 20  GE_DONE==5 );.  
1e720 61 73 73 65 72 74 28 20 61 52 65 73 5b 52 42 55  assert( aRes[RBU
1e730 5f 53 54 41 47 45 5f 4f 41 4c 5d 3d 3d 53 51 4c  _STAGE_OAL]==SQL
1e740 49 54 45 5f 52 42 55 5f 53 54 41 54 45 5f 4f 41  ITE_RBU_STATE_OA
1e750 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  L );.  assert( a
1e760 52 65 73 5b 52 42 55 5f 53 54 41 47 45 5f 4d 4f  Res[RBU_STAGE_MO
1e770 56 45 5d 3d 3d 53 51 4c 49 54 45 5f 52 42 55 5f  VE]==SQLITE_RBU_
1e780 53 54 41 54 45 5f 4d 4f 56 45 20 29 3b 0a 20 20  STATE_MOVE );.  
1e790 61 73 73 65 72 74 28 20 61 52 65 73 5b 52 42 55  assert( aRes[RBU
1e7a0 5f 53 54 41 47 45 5f 43 4b 50 54 5d 3d 3d 53 51  _STAGE_CKPT]==SQ
1e7b0 4c 49 54 45 5f 52 42 55 5f 53 54 41 54 45 5f 43  LITE_RBU_STATE_C
1e7c0 48 45 43 4b 50 4f 49 4e 54 20 29 3b 0a 20 20 61  HECKPOINT );.  a
1e7d0 73 73 65 72 74 28 20 61 52 65 73 5b 52 42 55 5f  ssert( aRes[RBU_
1e7e0 53 54 41 47 45 5f 44 4f 4e 45 5d 3d 3d 53 51 4c  STAGE_DONE]==SQL
1e7f0 49 54 45 5f 52 42 55 5f 53 54 41 54 45 5f 44 4f  ITE_RBU_STATE_DO
1e800 4e 45 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  NE );..  if( p->
1e810 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc!=SQLITE_OK &&
1e820 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 44   p->rc!=SQLITE_D
1e830 4f 4e 45 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ONE ){.    retur
1e840 6e 20 53 51 4c 49 54 45 5f 52 42 55 5f 53 54 41  n SQLITE_RBU_STA
1e850 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73  TE_ERROR;.  }els
1e860 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
1e870 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ->rc!=SQLITE_DON
1e880 45 20 7c 7c 20 70 2d 3e 65 53 74 61 67 65 3d 3d  E || p->eStage==
1e890 52 42 55 5f 53 54 41 47 45 5f 44 4f 4e 45 20 29  RBU_STAGE_DONE )
1e8a0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
1e8b0 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41  >eStage==RBU_STA
1e8c0 47 45 5f 4f 41 4c 0a 20 20 20 20 20 20 20 20 20  GE_OAL.         
1e8d0 7c 7c 20 70 2d 3e 65 53 74 61 67 65 3d 3d 52 42  || p->eStage==RB
1e8e0 55 5f 53 54 41 47 45 5f 4d 4f 56 45 0a 20 20 20  U_STAGE_MOVE.   
1e8f0 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61        || p->eSta
1e900 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 43 4b  ge==RBU_STAGE_CK
1e910 50 54 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  PT.         || p
1e920 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54  ->eStage==RBU_ST
1e930 41 47 45 5f 44 4f 4e 45 0a 20 20 20 20 29 3b 0a  AGE_DONE.    );.
1e940 20 20 20 20 72 65 74 75 72 6e 20 61 52 65 73 5b      return aRes[
1e950 70 2d 3e 65 53 74 61 67 65 5d 3b 0a 20 20 7d 0a  p->eStage];.  }.
1e960 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 72 62  }..int sqlite3rb
1e970 75 5f 73 61 76 65 73 74 61 74 65 28 73 71 6c 69  u_savestate(sqli
1e980 74 65 33 72 62 75 20 2a 70 29 7b 0a 20 20 69 6e  te3rbu *p){.  in
1e990 74 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 20 20  t rc = p->rc;.  
1e9a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44  if( rc==SQLITE_D
1e9b0 4f 4e 45 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ONE ) return SQL
1e9c0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
1e9d0 74 28 20 70 2d 3e 65 53 74 61 67 65 3e 3d 52 42  t( p->eStage>=RB
1e9e0 55 5f 53 54 41 47 45 5f 4f 41 4c 20 26 26 20 70  U_STAGE_OAL && p
1e9f0 2d 3e 65 53 74 61 67 65 3c 3d 52 42 55 5f 53 54  ->eStage<=RBU_ST
1ea00 41 47 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 69 66  AGE_DONE );.  if
1ea10 28 20 70 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55  ( p->eStage==RBU
1ea20 5f 53 54 41 47 45 5f 4f 41 4c 20 29 7b 0a 20 20  _STAGE_OAL ){.  
1ea30 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
1ea40 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20  LITE_DONE );.   
1ea50 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1ea60 4f 4b 20 29 20 72 63 20 3d 20 73 71 6c 69 74 65  OK ) rc = sqlite
1ea70 33 5f 65 78 65 63 28 70 2d 3e 64 62 4d 61 69 6e  3_exec(p->dbMain
1ea80 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30  , "COMMIT", 0, 0
1ea90 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  , 0);.  }..  /* 
1eaa0 53 79 6e 63 20 74 68 65 20 64 62 20 66 69 6c 65  Sync the db file
1eab0 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
1eac0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 65 53  LITE_OK && p->eS
1ead0 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f  tage==RBU_STAGE_
1eae0 43 4b 50 54 20 29 7b 0a 20 20 20 20 73 71 6c 69  CKPT ){.    sqli
1eaf0 74 65 33 5f 66 69 6c 65 20 2a 70 44 62 20 3d 20  te3_file *pDb = 
1eb00 70 2d 3e 70 54 61 72 67 65 74 46 64 2d 3e 70 52  p->pTargetFd->pR
1eb10 65 61 6c 3b 0a 20 20 20 20 72 63 20 3d 20 70 44  eal;.    rc = pD
1eb20 62 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53 79  b->pMethods->xSy
1eb30 6e 63 28 70 44 62 2c 20 53 51 4c 49 54 45 5f 53  nc(pDb, SQLITE_S
1eb40 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20 7d  YNC_NORMAL);.  }
1eb50 0a 0a 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a  ..  p->rc = rc;.
1eb60 20 20 72 62 75 53 61 76 65 53 74 61 74 65 28 70    rbuSaveState(p
1eb70 2c 20 70 2d 3e 65 53 74 61 67 65 29 3b 0a 20 20  , p->eStage);.  
1eb80 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 0a 20 20 69  rc = p->rc;..  i
1eb90 66 28 20 70 2d 3e 65 53 74 61 67 65 3d 3d 52 42  f( p->eStage==RB
1eba0 55 5f 53 54 41 47 45 5f 4f 41 4c 20 29 7b 0a 20  U_STAGE_OAL ){. 
1ebb0 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
1ebc0 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20  QLITE_DONE );.  
1ebd0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1ebe0 5f 4f 4b 20 29 20 72 63 20 3d 20 73 71 6c 69 74  _OK ) rc = sqlit
1ebf0 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 52 62 75  e3_exec(p->dbRbu
1ec00 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30  , "COMMIT", 0, 0
1ec10 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
1ec20 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63  ==SQLITE_OK ) rc
1ec30 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28   = sqlite3_exec(
1ec40 70 2d 3e 64 62 52 62 75 2c 20 22 42 45 47 49 4e  p->dbRbu, "BEGIN
1ec50 20 49 4d 4d 45 44 49 41 54 45 22 2c 20 30 2c 20   IMMEDIATE", 0, 
1ec60 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  0, 0);.    if( r
1ec70 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c==SQLITE_OK ) r
1ec80 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  c = sqlite3_exec
1ec90 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 42 45 47  (p->dbMain, "BEG
1eca0 49 4e 20 49 4d 4d 45 44 49 41 54 45 22 2c 20 30  IN IMMEDIATE", 0
1ecb0 2c 20 30 2c 30 29 3b 0a 20 20 7d 0a 0a 20 20 70  , 0,0);.  }..  p
1ecc0 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 72 65 74  ->rc = rc;.  ret
1ecd0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a  urn rc;.}../****
1ece0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ecf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ed00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ed10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ed20 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 42 65 67 69 6e 6e  ******.** Beginn
1ed30 69 6e 67 20 6f 66 20 52 42 55 20 56 46 53 20 73  ing of RBU VFS s
1ed40 68 69 6d 20 6d 65 74 68 6f 64 73 2e 20 54 68 65  him methods. The
1ed50 20 56 46 53 20 73 68 69 6d 20 6d 6f 64 69 66 69   VFS shim modifi
1ed60 65 73 20 74 68 65 20 62 65 68 61 76 69 6f 75 72  es the behaviour
1ed70 0a 2a 2a 20 6f 66 20 61 20 73 74 61 6e 64 61 72  .** of a standar
1ed80 64 20 56 46 53 20 69 6e 20 74 68 65 20 66 6f 6c  d VFS in the fol
1ed90 6c 6f 77 69 6e 67 20 77 61 79 73 3a 0a 2a 2a 0a  lowing ways:.**.
1eda0 2a 2a 20 31 2e 20 57 68 65 6e 65 76 65 72 20 74  ** 1. Whenever t
1edb0 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
1edc0 20 61 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65   a main database
1edd0 20 66 69 6c 65 20 69 73 20 72 65 61 64 20 6f 72   file is read or
1ede0 20 0a 2a 2a 20 20 20 20 77 72 69 74 74 65 6e 2c   .**    written,
1edf0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
1ee00 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
1ee10 20 63 6f 6f 6b 69 65 20 69 73 20 73 74 6f 72 65   cookie is store
1ee20 64 20 69 6e 0a 2a 2a 20 20 20 20 72 62 75 5f 66  d in.**    rbu_f
1ee30 69 6c 65 2e 69 43 6f 6f 6b 69 65 2e 20 53 69 6d  ile.iCookie. Sim
1ee40 69 6c 61 72 6c 79 2c 20 74 68 65 20 76 61 6c 75  ilarly, the valu
1ee50 65 20 6f 66 20 74 68 65 20 22 77 72 69 74 65 2d  e of the "write-
1ee60 76 65 72 73 69 6f 6e 22 0a 2a 2a 20 20 20 20 64  version".**    d
1ee70 61 74 61 62 61 73 65 20 68 65 61 64 65 72 20 66  atabase header f
1ee80 69 65 6c 64 20 69 73 20 73 74 6f 72 65 64 20 69  ield is stored i
1ee90 6e 20 72 62 75 5f 66 69 6c 65 2e 69 57 72 69 74  n rbu_file.iWrit
1eea0 65 56 65 72 2e 20 54 68 69 73 20 65 6e 73 75 72  eVer. This ensur
1eeb0 65 73 0a 2a 2a 20 20 20 20 74 68 61 74 20 74 68  es.**    that th
1eec0 65 20 76 61 6c 75 65 73 20 61 72 65 20 61 6c 77  e values are alw
1eed0 61 79 73 20 74 72 75 73 74 77 6f 72 74 68 79 20  ays trustworthy 
1eee0 77 69 74 68 69 6e 20 61 6e 20 6f 70 65 6e 20 74  within an open t
1eef0 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ransaction..**.*
1ef00 2a 20 32 2e 20 57 68 65 6e 65 76 65 72 20 61 6e  * 2. Whenever an
1ef10 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c   SQLITE_OPEN_WAL
1ef20 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 2c   file is opened,
1ef30 20 74 68 65 20 28 72 62 75 5f 66 69 6c 65 2e 70   the (rbu_file.p
1ef40 57 61 6c 46 64 29 0a 2a 2a 20 20 20 20 6d 65 6d  WalFd).**    mem
1ef50 62 65 72 20 76 61 72 69 61 62 6c 65 20 6f 66 20  ber variable of 
1ef60 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 64  the associated d
1ef70 61 74 61 62 61 73 65 20 66 69 6c 65 20 64 65 73  atabase file des
1ef80 63 72 69 70 74 6f 72 20 69 73 20 73 65 74 0a 2a  criptor is set.*
1ef90 2a 20 20 20 20 74 6f 20 70 6f 69 6e 74 20 74 6f  *    to point to
1efa0 20 74 68 65 20 6e 65 77 20 66 69 6c 65 2e 20 41   the new file. A
1efb0 20 6d 75 74 65 78 20 70 72 6f 74 65 63 74 65 64   mutex protected
1efc0 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   linked list of 
1efd0 61 6c 6c 20 6d 61 69 6e 20 0a 2a 2a 20 20 20 20  all main .**    
1efe0 64 62 20 66 64 73 20 6f 70 65 6e 65 64 20 75 73  db fds opened us
1eff0 69 6e 67 20 61 20 70 61 72 74 69 63 75 6c 61 72  ing a particular
1f000 20 52 42 55 20 56 46 53 20 69 73 20 6d 61 69 6e   RBU VFS is main
1f010 74 61 69 6e 65 64 20 61 74 20 0a 2a 2a 20 20 20  tained at .**   
1f020 20 72 62 75 5f 76 66 73 2e 70 4d 61 69 6e 20 74   rbu_vfs.pMain t
1f030 6f 20 66 61 63 69 6c 69 74 61 74 65 20 74 68 69  o facilitate thi
1f040 73 2e 0a 2a 2a 0a 2a 2a 20 33 2e 20 55 73 69 6e  s..**.** 3. Usin
1f050 67 20 61 20 6e 65 77 20 66 69 6c 65 2d 63 6f 6e  g a new file-con
1f060 74 72 6f 6c 20 22 53 51 4c 49 54 45 5f 46 43 4e  trol "SQLITE_FCN
1f070 54 4c 5f 52 42 55 22 2c 20 61 20 6d 61 69 6e 20  TL_RBU", a main 
1f080 64 62 20 72 62 75 5f 66 69 6c 65 20 0a 2a 2a 20  db rbu_file .** 
1f090 20 20 20 6f 62 6a 65 63 74 20 63 61 6e 20 62 65     object can be
1f0a0 20 6d 61 72 6b 65 64 20 61 73 20 74 68 65 20 74   marked as the t
1f0b0 61 72 67 65 74 20 64 61 74 61 62 61 73 65 20 6f  arget database o
1f0c0 66 20 61 6e 20 52 42 55 20 75 70 64 61 74 65 2e  f an RBU update.
1f0d0 20 54 68 69 73 0a 2a 2a 20 20 20 20 74 75 72 6e   This.**    turn
1f0e0 73 20 6f 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  s on the followi
1f0f0 6e 67 20 65 78 74 72 61 20 73 70 65 63 69 61 6c  ng extra special
1f100 20 62 65 68 61 76 69 6f 75 72 3a 0a 2a 2a 0a 2a   behaviour:.**.*
1f110 2a 20 33 61 2e 20 49 66 20 78 41 63 63 65 73 73  * 3a. If xAccess
1f120 28 29 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  () is called to 
1f130 63 68 65 63 6b 20 69 66 20 74 68 65 72 65 20 65  check if there e
1f140 78 69 73 74 73 20 61 20 2a 2d 77 61 6c 20 66 69  xists a *-wal fi
1f150 6c 65 20 0a 2a 2a 20 20 20 20 20 61 73 73 6f 63  le .**     assoc
1f160 69 61 74 65 64 20 77 69 74 68 20 61 6e 20 52 42  iated with an RB
1f170 55 20 74 61 72 67 65 74 20 64 61 74 61 62 61 73  U target databas
1f180 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 52  e currently in R
1f190 42 55 5f 53 54 41 47 45 5f 4f 41 4c 0a 2a 2a 20  BU_STAGE_OAL.** 
1f1a0 20 20 20 20 73 74 61 67 65 20 28 70 72 65 70 61      stage (prepa
1f1b0 72 69 6e 67 20 74 68 65 20 2a 2d 6f 61 6c 20 66  ring the *-oal f
1f1c0 69 6c 65 29 2c 20 74 68 65 20 66 6f 6c 6c 6f 77  ile), the follow
1f1d0 69 6e 67 20 73 70 65 63 69 61 6c 20 68 61 6e 64  ing special hand
1f1e0 6c 69 6e 67 0a 2a 2a 20 20 20 20 20 61 70 70 6c  ling.**     appl
1f1f0 69 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ies:.**.**      
1f200 2a 20 69 66 20 74 68 65 20 2a 2d 77 61 6c 20 66  * if the *-wal f
1f210 69 6c 65 20 64 6f 65 73 20 65 78 69 73 74 2c 20  ile does exist, 
1f220 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41  return SQLITE_CA
1f230 4e 54 4f 50 45 4e 2e 20 41 6e 20 52 42 55 0a 2a  NTOPEN. An RBU.*
1f240 2a 20 20 20 20 20 20 20 20 74 61 72 67 65 74 20  *        target 
1f250 64 61 74 61 62 61 73 65 20 6d 61 79 20 6e 6f 74  database may not
1f260 20 62 65 20 69 6e 20 77 61 6c 20 6d 6f 64 65 20   be in wal mode 
1f270 61 6c 72 65 61 64 79 2e 0a 2a 2a 0a 2a 2a 20 20  already..**.**  
1f280 20 20 20 20 2a 20 69 66 20 74 68 65 20 2a 2d 77      * if the *-w
1f290 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  al file does not
1f2a0 20 65 78 69 73 74 2c 20 73 65 74 20 74 68 65 20   exist, set the 
1f2b0 6f 75 74 70 75 74 20 70 61 72 61 6d 65 74 65 72  output parameter
1f2c0 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20 6e 6f   to.**        no
1f2d0 6e 2d 7a 65 72 6f 20 28 74 6f 20 74 65 6c 6c 20  n-zero (to tell 
1f2e0 53 51 4c 69 74 65 20 74 68 61 74 20 69 74 20 64  SQLite that it d
1f2f0 6f 65 73 20 65 78 69 73 74 29 20 61 6e 79 77 61  oes exist) anywa
1f300 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 54 68 65  y..**.**     The
1f310 6e 2c 20 77 68 65 6e 20 78 4f 70 65 6e 28 29 20  n, when xOpen() 
1f320 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 70 65  is called to ope
1f330 6e 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65  n the *-wal file
1f340 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
1f350 0a 2a 2a 20 20 20 20 20 74 68 65 20 52 42 55 20  .**     the RBU 
1f360 74 61 72 67 65 74 20 69 6e 20 52 42 55 5f 53 54  target in RBU_ST
1f370 41 47 45 5f 4f 41 4c 20 73 74 61 67 65 2c 20 69  AGE_OAL stage, i
1f380 6e 73 74 65 61 64 20 6f 66 20 6f 70 65 6e 69 6e  nstead of openin
1f390 67 20 74 68 65 20 2a 2d 77 61 6c 0a 2a 2a 20 20  g the *-wal.**  
1f3a0 20 20 20 66 69 6c 65 2c 20 74 68 65 20 72 62 75     file, the rbu
1f3b0 20 76 66 73 20 6f 70 65 6e 73 20 74 68 65 20 63   vfs opens the c
1f3c0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 2a 2d 6f  orresponding *-o
1f3d0 61 6c 20 66 69 6c 65 20 69 6e 73 74 65 61 64 2e  al file instead.
1f3e0 20 0a 2a 2a 0a 2a 2a 20 33 62 2e 20 54 68 65 20   .**.** 3b. The 
1f3f0 2a 2d 73 68 6d 20 70 61 67 65 73 20 72 65 74 75  *-shm pages retu
1f400 72 6e 65 64 20 62 79 20 78 53 68 6d 4d 61 70 28  rned by xShmMap(
1f410 29 20 66 6f 72 20 61 20 74 61 72 67 65 74 20 64  ) for a target d
1f420 62 20 66 69 6c 65 20 69 6e 0a 2a 2a 20 20 20 20  b file in.**    
1f430 20 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20 6d   RBU_STAGE_OAL m
1f440 6f 64 65 20 61 72 65 20 61 63 74 75 61 6c 6c 79  ode are actually
1f450 20 73 74 6f 72 65 64 20 69 6e 20 68 65 61 70 20   stored in heap 
1f460 6d 65 6d 6f 72 79 2e 20 54 68 69 73 20 69 73 20  memory. This is 
1f470 74 6f 0a 2a 2a 20 20 20 20 20 61 76 6f 69 64 20  to.**     avoid 
1f480 63 72 65 61 74 69 6e 67 20 61 20 2a 2d 73 68 6d  creating a *-shm
1f490 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 41   file on disk. A
1f4a0 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 78 53 68  dditionally, xSh
1f4b0 6d 4c 6f 63 6b 28 29 20 63 61 6c 6c 73 0a 2a 2a  mLock() calls.**
1f4c0 20 20 20 20 20 61 72 65 20 6e 6f 2d 6f 70 73 20       are no-ops 
1f4d0 6f 6e 20 74 61 72 67 65 74 20 64 61 74 61 62 61  on target databa
1f4e0 73 65 20 66 69 6c 65 73 20 69 6e 20 52 42 55 5f  se files in RBU_
1f4f0 53 54 41 47 45 5f 4f 41 4c 20 6d 6f 64 65 2e 20  STAGE_OAL mode. 
1f500 54 68 69 73 20 69 73 0a 2a 2a 20 20 20 20 20 62  This is.**     b
1f510 65 63 61 75 73 65 20 61 73 73 65 72 74 28 29 20  ecause assert() 
1f520 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 73 6f  statements in so
1f530 6d 65 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74  me VFS implement
1f540 61 74 69 6f 6e 73 20 66 61 69 6c 20 69 66 20 0a  ations fail if .
1f550 2a 2a 20 20 20 20 20 78 53 68 6d 4c 6f 63 6b 28  **     xShmLock(
1f560 29 20 69 73 20 63 61 6c 6c 65 64 20 62 65 66 6f  ) is called befo
1f570 72 65 20 78 53 68 6d 4d 61 70 28 29 2e 0a 2a 2a  re xShmMap()..**
1f580 0a 2a 2a 20 33 63 2e 20 49 66 20 61 6e 20 45 58  .** 3c. If an EX
1f590 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20  CLUSIVE lock is 
1f5a0 61 74 74 65 6d 70 74 65 64 20 6f 6e 20 61 20 74  attempted on a t
1f5b0 61 72 67 65 74 20 64 61 74 61 62 61 73 65 20 66  arget database f
1f5c0 69 6c 65 20 69 6e 20 61 6e 79 0a 2a 2a 20 20 20  ile in any.**   
1f5d0 20 20 6d 6f 64 65 20 65 78 63 65 70 74 20 52 42    mode except RB
1f5e0 55 5f 53 54 41 47 45 5f 44 4f 4e 45 20 28 61 6c  U_STAGE_DONE (al
1f5f0 6c 20 77 6f 72 6b 20 63 6f 6d 70 6c 65 74 65 64  l work completed
1f600 20 61 6e 64 20 63 68 65 63 6b 70 6f 69 6e 74 65   and checkpointe
1f610 64 29 2c 20 69 74 20 0a 2a 2a 20 20 20 20 20 66  d), it .**     f
1f620 61 69 6c 73 20 77 69 74 68 20 61 6e 20 53 51 4c  ails with an SQL
1f630 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72 2e 20  ITE_BUSY error. 
1f640 54 68 69 73 20 69 73 20 74 6f 20 73 74 6f 70 20  This is to stop 
1f650 52 42 55 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a  RBU connections.
1f660 2a 2a 20 20 20 20 20 66 72 6f 6d 20 61 75 74 6f  **     from auto
1f670 6d 61 74 69 63 61 6c 6c 79 20 63 68 65 63 6b 70  matically checkp
1f680 6f 69 6e 74 69 6e 67 20 61 20 2a 2d 77 61 6c 20  ointing a *-wal 
1f690 28 6f 72 20 2a 2d 6f 61 6c 29 20 66 69 6c 65 20  (or *-oal) file 
1f6a0 66 72 6f 6d 20 77 69 74 68 69 6e 0a 2a 2a 20 20  from within.**  
1f6b0 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65     sqlite3_close
1f6c0 28 29 2e 0a 2a 2a 0a 2a 2a 20 33 64 2e 20 49 6e  ()..**.** 3d. In
1f6d0 20 52 42 55 5f 53 54 41 47 45 5f 43 41 50 54 55   RBU_STAGE_CAPTU
1f6e0 52 45 20 6d 6f 64 65 2c 20 61 6c 6c 20 78 52 65  RE mode, all xRe
1f6f0 61 64 28 29 20 63 61 6c 6c 73 20 6f 6e 20 74 68  ad() calls on th
1f700 65 20 77 61 6c 20 66 69 6c 65 2c 20 61 6e 64 0a  e wal file, and.
1f710 2a 2a 20 20 20 20 20 61 6c 6c 20 78 57 72 69 74  **     all xWrit
1f720 65 28 29 20 63 61 6c 6c 73 20 6f 6e 20 74 68 65  e() calls on the
1f730 20 74 61 72 67 65 74 20 64 61 74 61 62 61 73 65   target database
1f740 20 66 69 6c 65 20 70 65 72 66 6f 72 6d 20 6e 6f   file perform no
1f750 20 49 4f 2e 20 0a 2a 2a 20 20 20 20 20 49 6e 73   IO. .**     Ins
1f760 74 65 61 64 20 74 68 65 20 66 72 61 6d 65 20 61  tead the frame a
1f770 6e 64 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20  nd page numbers 
1f780 74 68 61 74 20 77 6f 75 6c 64 20 62 65 20 72 65  that would be re
1f790 61 64 20 61 6e 64 20 77 72 69 74 74 65 6e 0a 2a  ad and written.*
1f7a0 2a 20 20 20 20 20 61 72 65 20 72 65 63 6f 72 64  *     are record
1f7b0 65 64 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79  ed. Additionally
1f7c0 2c 20 73 75 63 63 65 73 73 66 75 6c 20 61 74 74  , successful att
1f7d0 65 6d 70 74 73 20 74 6f 20 6f 62 74 61 69 6e 20  empts to obtain 
1f7e0 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 20 20 20  exclusive.**    
1f7f0 20 78 53 68 6d 4c 6f 63 6b 28 29 20 57 52 49 54   xShmLock() WRIT
1f800 45 52 2c 20 43 48 45 43 4b 50 4f 49 4e 54 45 52  ER, CHECKPOINTER
1f810 20 61 6e 64 20 52 45 41 44 30 20 6c 6f 63 6b 73   and READ0 locks
1f820 20 6f 6e 20 74 68 65 20 74 61 72 67 65 74 20 0a   on the target .
1f830 2a 2a 20 20 20 20 20 64 61 74 61 62 61 73 65 20  **     database 
1f840 66 69 6c 65 20 61 72 65 20 72 65 63 6f 72 64 65  file are recorde
1f850 64 2e 20 78 53 68 6d 4c 6f 63 6b 28 29 20 63 61  d. xShmLock() ca
1f860 6c 6c 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68  lls to unlock th
1f870 65 20 73 61 6d 65 0a 2a 2a 20 20 20 20 20 6c 6f  e same.**     lo
1f880 63 6b 73 20 61 72 65 20 6e 6f 2d 6f 70 73 20 28  cks are no-ops (
1f890 73 6f 20 74 68 61 74 20 6f 6e 63 65 20 6f 62 74  so that once obt
1f8a0 61 69 6e 65 64 2c 20 74 68 65 73 65 20 6c 6f 63  ained, these loc
1f8b0 6b 73 20 61 72 65 20 6e 65 76 65 72 0a 2a 2a 20  ks are never.** 
1f8c0 20 20 20 20 72 65 6c 69 6e 71 75 69 73 68 65 64      relinquished
1f8d0 29 2e 20 46 69 6e 61 6c 6c 79 2c 20 63 61 6c 6c  ). Finally, call
1f8e0 73 20 74 6f 20 78 53 79 6e 63 28 29 20 6f 6e 20  s to xSync() on 
1f8f0 74 68 65 20 74 61 72 67 65 74 20 64 61 74 61 62  the target datab
1f900 61 73 65 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20  ase.**     file 
1f910 66 61 69 6c 20 77 69 74 68 20 53 51 4c 49 54 45  fail with SQLITE
1f920 5f 49 4e 54 45 52 4e 41 4c 20 65 72 72 6f 72 73  _INTERNAL errors
1f930 2e 0a 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69  ..*/..static voi
1f940 64 20 72 62 75 55 6e 6c 6f 63 6b 53 68 6d 28 72  d rbuUnlockShm(r
1f950 62 75 5f 66 69 6c 65 20 2a 70 29 7b 0a 20 20 69  bu_file *p){.  i
1f960 66 28 20 70 2d 3e 70 52 62 75 20 29 7b 0a 20 20  f( p->pRbu ){.  
1f970 20 20 69 6e 74 20 28 2a 78 53 68 6d 4c 6f 63 6b    int (*xShmLock
1f980 29 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c  )(sqlite3_file*,
1f990 69 6e 74 2c 69 6e 74 2c 69 6e 74 29 20 3d 20 70  int,int,int) = p
1f9a0 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64  ->pReal->pMethod
1f9b0 73 2d 3e 78 53 68 6d 4c 6f 63 6b 3b 0a 20 20 20  s->xShmLock;.   
1f9c0 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
1f9d0 69 3d 30 3b 20 69 3c 53 51 4c 49 54 45 5f 53 48  i=0; i<SQLITE_SH
1f9e0 4d 5f 4e 4c 4f 43 4b 3b 69 2b 2b 29 7b 0a 20 20  M_NLOCK;i++){.  
1f9f0 20 20 20 20 69 66 28 20 28 31 3c 3c 69 29 20 26      if( (1<<i) &
1fa00 20 70 2d 3e 70 52 62 75 2d 3e 6d 4c 6f 63 6b 20   p->pRbu->mLock 
1fa10 29 7b 0a 20 20 20 20 20 20 20 20 78 53 68 6d 4c  ){.        xShmL
1fa20 6f 63 6b 28 70 2d 3e 70 52 65 61 6c 2c 20 69 2c  ock(p->pReal, i,
1fa30 20 31 2c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 55   1, SQLITE_SHM_U
1fa40 4e 4c 4f 43 4b 7c 53 51 4c 49 54 45 5f 53 48 4d  NLOCK|SQLITE_SHM
1fa50 5f 45 58 43 4c 55 53 49 56 45 29 3b 0a 20 20 20  _EXCLUSIVE);.   
1fa60 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
1fa70 2d 3e 70 52 62 75 2d 3e 6d 4c 6f 63 6b 20 3d 20  ->pRbu->mLock = 
1fa80 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
1fa90 43 6c 6f 73 65 20 61 6e 20 72 62 75 20 66 69 6c  Close an rbu fil
1faa0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1fab0 20 72 62 75 56 66 73 43 6c 6f 73 65 28 73 71 6c   rbuVfsClose(sql
1fac0 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65  ite3_file *pFile
1fad0 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a 70  ){.  rbu_file *p
1fae0 20 3d 20 28 72 62 75 5f 66 69 6c 65 2a 29 70 46   = (rbu_file*)pF
1faf0 69 6c 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ile;.  int rc;. 
1fb00 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 46 72   int i;..  /* Fr
1fb10 65 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ee the contents 
1fb20 6f 66 20 74 68 65 20 61 70 53 68 6d 5b 5d 20 61  of the apShm[] a
1fb30 72 72 61 79 2e 20 41 6e 64 20 74 68 65 20 61 72  rray. And the ar
1fb40 72 61 79 20 69 74 73 65 6c 66 2e 20 2a 2f 0a 20  ray itself. */. 
1fb50 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
1fb60 53 68 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  Shm; i++){.    s
1fb70 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61  qlite3_free(p->a
1fb80 70 53 68 6d 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20  pShm[i]);.  }.  
1fb90 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
1fba0 61 70 53 68 6d 29 3b 0a 20 20 70 2d 3e 61 70 53  apShm);.  p->apS
1fbb0 68 6d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  hm = 0;.  sqlite
1fbc0 33 5f 66 72 65 65 28 70 2d 3e 7a 44 65 6c 29 3b  3_free(p->zDel);
1fbd0 0a 0a 20 20 69 66 28 20 70 2d 3e 6f 70 65 6e 46  ..  if( p->openF
1fbe0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
1fbf0 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 7b 0a 20 20  EN_MAIN_DB ){.  
1fc00 20 20 72 62 75 5f 66 69 6c 65 20 2a 2a 70 70 3b    rbu_file **pp;
1fc10 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
1fc20 65 78 5f 65 6e 74 65 72 28 70 2d 3e 70 52 62 75  ex_enter(p->pRbu
1fc30 56 66 73 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20  Vfs->mutex);.   
1fc40 20 66 6f 72 28 70 70 3d 26 70 2d 3e 70 52 62 75   for(pp=&p->pRbu
1fc50 56 66 73 2d 3e 70 4d 61 69 6e 3b 20 2a 70 70 21  Vfs->pMain; *pp!
1fc60 3d 70 3b 20 70 70 3d 26 28 28 2a 70 70 29 2d 3e  =p; pp=&((*pp)->
1fc70 70 4d 61 69 6e 4e 65 78 74 29 29 3b 0a 20 20 20  pMainNext));.   
1fc80 20 2a 70 70 20 3d 20 70 2d 3e 70 4d 61 69 6e 4e   *pp = p->pMainN
1fc90 65 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ext;.    sqlite3
1fca0 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 2d 3e  _mutex_leave(p->
1fcb0 70 52 62 75 56 66 73 2d 3e 6d 75 74 65 78 29 3b  pRbuVfs->mutex);
1fcc0 0a 20 20 20 20 72 62 75 55 6e 6c 6f 63 6b 53 68  .    rbuUnlockSh
1fcd0 6d 28 70 29 3b 0a 20 20 20 20 70 2d 3e 70 52 65  m(p);.    p->pRe
1fce0 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53  al->pMethods->xS
1fcf0 68 6d 55 6e 6d 61 70 28 70 2d 3e 70 52 65 61 6c  hmUnmap(p->pReal
1fd00 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  , 0);.  }..  /* 
1fd10 43 6c 6f 73 65 20 74 68 65 20 75 6e 64 65 72 6c  Close the underl
1fd20 79 69 6e 67 20 66 69 6c 65 20 68 61 6e 64 6c 65  ying file handle
1fd30 20 2a 2f 0a 20 20 72 63 20 3d 20 70 2d 3e 70 52   */.  rc = p->pR
1fd40 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78  eal->pMethods->x
1fd50 43 6c 6f 73 65 28 70 2d 3e 70 52 65 61 6c 29 3b  Close(p->pReal);
1fd60 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1fd70 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 64  ../*.** Read and
1fd80 20 72 65 74 75 72 6e 20 61 6e 20 75 6e 73 69 67   return an unsig
1fd90 6e 65 64 20 33 32 2d 62 69 74 20 62 69 67 2d 65  ned 32-bit big-e
1fda0 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72  ndian integer fr
1fdb0 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20 0a 2a  om the buffer .*
1fdc0 2a 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  * passed as the 
1fdd0 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  only argument..*
1fde0 2f 0a 73 74 61 74 69 63 20 75 33 32 20 72 62 75  /.static u32 rbu
1fdf0 47 65 74 55 33 32 28 75 38 20 2a 61 42 75 66 29  GetU32(u8 *aBuf)
1fe00 7b 0a 20 20 72 65 74 75 72 6e 20 28 28 75 33 32  {.  return ((u32
1fe10 29 61 42 75 66 5b 30 5d 20 3c 3c 20 32 34 29 0a  )aBuf[0] << 24).
1fe20 20 20 20 20 20 20 20 2b 20 28 28 75 33 32 29 61         + ((u32)a
1fe30 42 75 66 5b 31 5d 20 3c 3c 20 31 36 29 0a 20 20  Buf[1] << 16).  
1fe40 20 20 20 20 20 2b 20 28 28 75 33 32 29 61 42 75       + ((u32)aBu
1fe50 66 5b 32 5d 20 3c 3c 20 20 38 29 0a 20 20 20 20  f[2] <<  8).    
1fe60 20 20 20 2b 20 28 28 75 33 32 29 61 42 75 66 5b     + ((u32)aBuf[
1fe70 33 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72  3]);.}../*.** Wr
1fe80 69 74 65 20 61 6e 20 75 6e 73 69 67 6e 65 64 20  ite an unsigned 
1fe90 33 32 2d 62 69 74 20 76 61 6c 75 65 20 69 6e 20  32-bit value in 
1fea0 62 69 67 2d 65 6e 64 69 61 6e 20 66 6f 72 6d 61  big-endian forma
1feb0 74 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65  t to the supplie
1fec0 64 0a 2a 2a 20 62 75 66 66 65 72 2e 0a 2a 2f 0a  d.** buffer..*/.
1fed0 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75 50  static void rbuP
1fee0 75 74 55 33 32 28 75 38 20 2a 61 42 75 66 2c 20  utU32(u8 *aBuf, 
1fef0 75 33 32 20 69 56 61 6c 29 7b 0a 20 20 61 42 75  u32 iVal){.  aBu
1ff00 66 5b 30 5d 20 3d 20 28 69 56 61 6c 20 3e 3e 20  f[0] = (iVal >> 
1ff10 32 34 29 20 26 20 30 78 46 46 3b 0a 20 20 61 42  24) & 0xFF;.  aB
1ff20 75 66 5b 31 5d 20 3d 20 28 69 56 61 6c 20 3e 3e  uf[1] = (iVal >>
1ff30 20 31 36 29 20 26 20 30 78 46 46 3b 0a 20 20 61   16) & 0xFF;.  a
1ff40 42 75 66 5b 32 5d 20 3d 20 28 69 56 61 6c 20 3e  Buf[2] = (iVal >
1ff50 3e 20 20 38 29 20 26 20 30 78 46 46 3b 0a 20 20  >  8) & 0xFF;.  
1ff60 61 42 75 66 5b 33 5d 20 3d 20 28 69 56 61 6c 20  aBuf[3] = (iVal 
1ff70 3e 3e 20 20 30 29 20 26 20 30 78 46 46 3b 0a 7d  >>  0) & 0xFF;.}
1ff80 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62  ..static void rb
1ff90 75 50 75 74 55 31 36 28 75 38 20 2a 61 42 75 66  uPutU16(u8 *aBuf
1ffa0 2c 20 75 31 36 20 69 56 61 6c 29 7b 0a 20 20 61  , u16 iVal){.  a
1ffb0 42 75 66 5b 30 5d 20 3d 20 28 69 56 61 6c 20 3e  Buf[0] = (iVal >
1ffc0 3e 20 20 38 29 20 26 20 30 78 46 46 3b 0a 20 20  >  8) & 0xFF;.  
1ffd0 61 42 75 66 5b 31 5d 20 3d 20 28 69 56 61 6c 20  aBuf[1] = (iVal 
1ffe0 3e 3e 20 20 30 29 20 26 20 30 78 46 46 3b 0a 7d  >>  0) & 0xFF;.}
1fff0 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74  ../*.** Read dat
20000 61 20 66 72 6f 6d 20 61 6e 20 72 62 75 56 66 73  a from an rbuVfs
20010 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  -file..*/.static
20020 20 69 6e 74 20 72 62 75 56 66 73 52 65 61 64 28   int rbuVfsRead(
20030 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
20040 2a 70 46 69 6c 65 2c 20 0a 20 20 76 6f 69 64 20  *pFile, .  void 
20050 2a 7a 42 75 66 2c 20 0a 20 20 69 6e 74 20 69 41  *zBuf, .  int iA
20060 6d 74 2c 20 0a 20 20 73 71 6c 69 74 65 5f 69 6e  mt, .  sqlite_in
20070 74 36 34 20 69 4f 66 73 74 0a 29 7b 0a 20 20 72  t64 iOfst.){.  r
20080 62 75 5f 66 69 6c 65 20 2a 70 20 3d 20 28 72 62  bu_file *p = (rb
20090 75 5f 66 69 6c 65 2a 29 70 46 69 6c 65 3b 0a 20  u_file*)pFile;. 
200a0 20 73 71 6c 69 74 65 33 72 62 75 20 2a 70 52 62   sqlite3rbu *pRb
200b0 75 20 3d 20 70 2d 3e 70 52 62 75 3b 0a 20 20 69  u = p->pRbu;.  i
200c0 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 70 52  nt rc;..  if( pR
200d0 62 75 20 26 26 20 70 52 62 75 2d 3e 65 53 74 61  bu && pRbu->eSta
200e0 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 43 41  ge==RBU_STAGE_CA
200f0 50 54 55 52 45 20 29 7b 0a 20 20 20 20 61 73 73  PTURE ){.    ass
20100 65 72 74 28 20 70 2d 3e 6f 70 65 6e 46 6c 61 67  ert( p->openFlag
20110 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
20120 57 41 4c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  WAL );.    rc = 
20130 72 62 75 43 61 70 74 75 72 65 57 61 6c 52 65 61  rbuCaptureWalRea
20140 64 28 70 2d 3e 70 52 62 75 2c 20 69 4f 66 73 74  d(p->pRbu, iOfst
20150 2c 20 69 41 6d 74 29 3b 0a 20 20 7d 65 6c 73 65  , iAmt);.  }else
20160 7b 0a 20 20 20 20 69 66 28 20 70 52 62 75 20 26  {.    if( pRbu &
20170 26 20 70 52 62 75 2d 3e 65 53 74 61 67 65 3d 3d  & pRbu->eStage==
20180 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20 0a 20  RBU_STAGE_OAL . 
20190 20 20 20 20 26 26 20 28 70 2d 3e 6f 70 65 6e 46      && (p->openF
201a0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
201b0 45 4e 5f 57 41 4c 29 20 0a 20 20 20 20 20 26 26  EN_WAL) .     &&
201c0 20 69 4f 66 73 74 3e 3d 70 52 62 75 2d 3e 69 4f   iOfst>=pRbu->iO
201d0 61 6c 53 7a 20 0a 20 20 20 20 29 7b 0a 20 20 20  alSz .    ){.   
201e0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
201f0 4b 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  K;.      memset(
20200 7a 42 75 66 2c 20 30 2c 20 69 41 6d 74 29 3b 0a  zBuf, 0, iAmt);.
20210 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
20220 20 72 63 20 3d 20 70 2d 3e 70 52 65 61 6c 2d 3e   rc = p->pReal->
20230 70 4d 65 74 68 6f 64 73 2d 3e 78 52 65 61 64 28  pMethods->xRead(
20240 70 2d 3e 70 52 65 61 6c 2c 20 7a 42 75 66 2c 20  p->pReal, zBuf, 
20250 69 41 6d 74 2c 20 69 4f 66 73 74 29 3b 0a 23 69  iAmt, iOfst);.#i
20260 66 20 31 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  f 1.      /* If 
20270 74 68 69 73 20 69 73 20 62 65 69 6e 67 20 63 61  this is being ca
20280 6c 6c 65 64 20 74 6f 20 72 65 61 64 20 74 68 65  lled to read the
20290 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74   first page of t
202a0 68 65 20 74 61 72 67 65 74 20 0a 20 20 20 20 20  he target .     
202b0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61 73 20   ** database as 
202c0 70 61 72 74 20 6f 66 20 61 6e 20 72 62 75 20 76  part of an rbu v
202d0 61 63 75 75 6d 20 6f 70 65 72 61 74 69 6f 6e 2c  acuum operation,
202e0 20 73 79 6e 74 68 65 73 69 7a 65 20 74 68 65 20   synthesize the 
202f0 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 65 6e  .      ** conten
20300 74 73 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  ts of the first 
20310 70 61 67 65 20 69 66 20 69 74 20 64 6f 65 73 20  page if it does 
20320 6e 6f 74 20 79 65 74 20 65 78 69 73 74 2e 20 4f  not yet exist. O
20330 74 68 65 72 77 69 73 65 2c 0a 20 20 20 20 20 20  therwise,.      
20340 2a 2a 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e  ** SQLite will n
20350 6f 74 20 63 68 65 63 6b 20 66 6f 72 20 61 20 2a  ot check for a *
20360 2d 77 61 6c 20 66 69 6c 65 2e 20 20 2a 2f 0a 20  -wal file.  */. 
20370 20 20 20 20 20 69 66 28 20 70 52 62 75 20 26 26       if( pRbu &&
20380 20 72 62 75 49 73 56 61 63 75 75 6d 28 70 52 62   rbuIsVacuum(pRb
20390 75 29 20 0a 20 20 20 20 20 20 20 20 20 20 26 26  u) .          &&
203a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc==SQLITE_IOER
203b0 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 26 26 20  R_SHORT_READ && 
203c0 69 4f 66 73 74 3d 3d 30 0a 20 20 20 20 20 20 20  iOfst==0.       
203d0 20 20 20 26 26 20 28 70 2d 3e 6f 70 65 6e 46 6c     && (p->openFl
203e0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
203f0 4e 5f 4d 41 49 4e 5f 44 42 29 0a 20 20 20 20 20  N_MAIN_DB).     
20400 20 20 20 20 20 26 26 20 70 52 62 75 2d 3e 72 63       && pRbu->rc
20410 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20  ==SQLITE_OK.    
20420 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c    ){.        sql
20430 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 64 20 3d  ite3_file *pFd =
20440 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29   (sqlite3_file*)
20450 70 52 62 75 2d 3e 70 52 62 75 46 64 3b 0a 20 20  pRbu->pRbuFd;.  
20460 20 20 20 20 20 20 72 63 20 3d 20 70 46 64 2d 3e        rc = pFd->
20470 70 4d 65 74 68 6f 64 73 2d 3e 78 52 65 61 64 28  pMethods->xRead(
20480 70 46 64 2c 20 7a 42 75 66 2c 20 69 41 6d 74 2c  pFd, zBuf, iAmt,
20490 20 69 4f 66 73 74 29 3b 0a 20 20 20 20 20 20 20   iOfst);.       
204a0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
204b0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
204c0 75 38 20 2a 61 42 75 66 20 3d 20 28 75 38 2a 29  u8 *aBuf = (u8*)
204d0 7a 42 75 66 3b 0a 20 20 20 20 20 20 20 20 20 20  zBuf;.          
204e0 75 33 32 20 69 52 6f 6f 74 20 3d 20 72 62 75 47  u32 iRoot = rbuG
204f0 65 74 55 33 32 28 26 61 42 75 66 5b 35 32 5d 29  etU32(&aBuf[52])
20500 20 3f 20 31 20 3a 20 30 3b 0a 20 20 20 20 20 20   ? 1 : 0;.      
20510 20 20 20 20 72 62 75 50 75 74 55 33 32 28 26 61      rbuPutU32(&a
20520 42 75 66 5b 35 32 5d 2c 20 69 52 6f 6f 74 29 3b  Buf[52], iRoot);
20530 20 20 20 20 20 20 2f 2a 20 6c 61 72 67 65 73 74        /* largest
20540 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65   root page numbe
20550 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  r */.          r
20560 62 75 50 75 74 55 33 32 28 26 61 42 75 66 5b 33  buPutU32(&aBuf[3
20570 36 5d 2c 20 30 29 3b 20 20 20 20 20 20 20 20 20  6], 0);         
20580 20 2f 2a 20 6e 75 6d 62 65 72 20 6f 66 20 66 72   /* number of fr
20590 65 65 20 70 61 67 65 73 20 2a 2f 0a 20 20 20 20  ee pages */.    
205a0 20 20 20 20 20 20 72 62 75 50 75 74 55 33 32 28        rbuPutU32(
205b0 26 61 42 75 66 5b 33 32 5d 2c 20 30 29 3b 20 20  &aBuf[32], 0);  
205c0 20 20 20 20 20 20 20 20 2f 2a 20 66 69 72 73 74          /* first
205d0 20 70 61 67 65 20 6f 6e 20 66 72 65 65 20 6c 69   page on free li
205e0 73 74 20 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20  st trunk */.    
205f0 20 20 20 20 20 20 72 62 75 50 75 74 55 33 32 28        rbuPutU32(
20600 26 61 42 75 66 5b 32 38 5d 2c 20 31 29 3b 20 20  &aBuf[28], 1);  
20610 20 20 20 20 20 20 20 20 2f 2a 20 73 69 7a 65 20          /* size 
20620 6f 66 20 64 62 20 66 69 6c 65 20 69 6e 20 70 61  of db file in pa
20630 67 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ges */.         
20640 20 72 62 75 50 75 74 55 33 32 28 26 61 42 75 66   rbuPutU32(&aBuf
20650 5b 32 34 5d 2c 20 70 52 62 75 2d 3e 70 52 62 75  [24], pRbu->pRbu
20660 46 64 2d 3e 69 43 6f 6f 6b 69 65 2b 31 29 3b 20  Fd->iCookie+1); 
20670 20 2f 2a 20 43 68 61 6e 67 65 20 63 6f 75 6e 74   /* Change count
20680 65 72 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 20  er */..         
20690 20 69 66 28 20 69 41 6d 74 3e 31 30 30 20 29 7b   if( iAmt>100 ){
206a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d  .            mem
206b0 73 65 74 28 26 61 42 75 66 5b 31 30 30 5d 2c 20  set(&aBuf[100], 
206c0 30 2c 20 69 41 6d 74 2d 31 30 30 29 3b 0a 20 20  0, iAmt-100);.  
206d0 20 20 20 20 20 20 20 20 20 20 72 62 75 50 75 74            rbuPut
206e0 55 31 36 28 26 61 42 75 66 5b 31 30 35 5d 2c 20  U16(&aBuf[105], 
206f0 69 41 6d 74 20 26 20 30 78 46 46 46 46 29 3b 0a  iAmt & 0xFFFF);.
20700 20 20 20 20 20 20 20 20 20 20 20 20 61 42 75 66              aBuf
20710 5b 31 30 30 5d 20 3d 20 30 78 30 44 3b 0a 20 20  [100] = 0x0D;.  
20720 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
20730 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64    }.      }.#end
20740 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  if.    }.    if(
20750 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
20760 26 20 69 4f 66 73 74 3d 3d 30 20 26 26 20 28 70  & iOfst==0 && (p
20770 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20 53 51  ->openFlags & SQ
20780 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
20790 42 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  B) ){.      /* T
207a0 68 65 73 65 20 6c 6f 6f 6b 20 6c 69 6b 65 20 6d  hese look like m
207b0 61 67 69 63 20 6e 75 6d 62 65 72 73 2e 20 42 75  agic numbers. Bu
207c0 74 20 74 68 65 79 20 61 72 65 20 73 74 61 62 6c  t they are stabl
207d0 65 2c 20 61 73 20 74 68 65 79 20 61 72 65 20 70  e, as they are p
207e0 61 72 74 0a 20 20 20 20 20 20 20 2a 2a 20 6f 66  art.       ** of
207f0 20 74 68 65 20 64 65 66 69 6e 69 74 69 6f 6e 20   the definition 
20800 6f 66 20 74 68 65 20 53 51 4c 69 74 65 20 66 69  of the SQLite fi
20810 6c 65 20 66 6f 72 6d 61 74 2c 20 77 68 69 63 68  le format, which
20820 20 6d 61 79 20 6e 6f 74 20 63 68 61 6e 67 65 2e   may not change.
20830 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 2a 70 42   */.      u8 *pB
20840 75 66 20 3d 20 28 75 38 2a 29 7a 42 75 66 3b 0a  uf = (u8*)zBuf;.
20850 20 20 20 20 20 20 70 2d 3e 69 43 6f 6f 6b 69 65        p->iCookie
20860 20 3d 20 72 62 75 47 65 74 55 33 32 28 26 70 42   = rbuGetU32(&pB
20870 75 66 5b 32 34 5d 29 3b 0a 20 20 20 20 20 20 70  uf[24]);.      p
20880 2d 3e 69 57 72 69 74 65 56 65 72 20 3d 20 70 42  ->iWriteVer = pB
20890 75 66 5b 31 39 5d 3b 0a 20 20 20 20 7d 0a 20 20  uf[19];.    }.  
208a0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
208b0 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61  ../*.** Write da
208c0 74 61 20 74 6f 20 61 6e 20 72 62 75 56 66 73 2d  ta to an rbuVfs-
208d0 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
208e0 69 6e 74 20 72 62 75 56 66 73 57 72 69 74 65 28  int rbuVfsWrite(
208f0 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
20900 2a 70 46 69 6c 65 2c 20 0a 20 20 63 6f 6e 73 74  *pFile, .  const
20910 20 76 6f 69 64 20 2a 7a 42 75 66 2c 20 0a 20 20   void *zBuf, .  
20920 69 6e 74 20 69 41 6d 74 2c 20 0a 20 20 73 71 6c  int iAmt, .  sql
20930 69 74 65 5f 69 6e 74 36 34 20 69 4f 66 73 74 0a  ite_int64 iOfst.
20940 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a 70  ){.  rbu_file *p
20950 20 3d 20 28 72 62 75 5f 66 69 6c 65 2a 29 70 46   = (rbu_file*)pF
20960 69 6c 65 3b 0a 20 20 73 71 6c 69 74 65 33 72 62  ile;.  sqlite3rb
20970 75 20 2a 70 52 62 75 20 3d 20 70 2d 3e 70 52 62  u *pRbu = p->pRb
20980 75 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  u;.  int rc;..  
20990 69 66 28 20 70 52 62 75 20 26 26 20 70 52 62 75  if( pRbu && pRbu
209a0 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54  ->eStage==RBU_ST
209b0 41 47 45 5f 43 41 50 54 55 52 45 20 29 7b 0a 20  AGE_CAPTURE ){. 
209c0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70     assert( p->op
209d0 65 6e 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  enFlags & SQLITE
209e0 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 3b  _OPEN_MAIN_DB );
209f0 0a 20 20 20 20 72 63 20 3d 20 72 62 75 43 61 70  .    rc = rbuCap
20a00 74 75 72 65 44 62 57 72 69 74 65 28 70 2d 3e 70  tureDbWrite(p->p
20a10 52 62 75 2c 20 69 4f 66 73 74 29 3b 0a 20 20 7d  Rbu, iOfst);.  }
20a20 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 52  else{.    if( pR
20a30 62 75 20 26 26 20 70 52 62 75 2d 3e 65 53 74 61  bu && pRbu->eSta
20a40 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4f 41  ge==RBU_STAGE_OA
20a50 4c 20 0a 20 20 20 20 20 26 26 20 28 70 2d 3e 6f  L .     && (p->o
20a60 70 65 6e 46 6c 61 67 73 20 26 20 53 51 4c 49 54  penFlags & SQLIT
20a70 45 5f 4f 50 45 4e 5f 57 41 4c 29 20 0a 20 20 20  E_OPEN_WAL) .   
20a80 20 20 26 26 20 69 4f 66 73 74 3e 3d 70 52 62 75    && iOfst>=pRbu
20a90 2d 3e 69 4f 61 6c 53 7a 0a 20 20 20 20 29 7b 0a  ->iOalSz.    ){.
20aa0 20 20 20 20 20 20 70 52 62 75 2d 3e 69 4f 61 6c        pRbu->iOal
20ab0 53 7a 20 3d 20 69 41 6d 74 20 2b 20 69 4f 66 73  Sz = iAmt + iOfs
20ac0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  t;.    }.    rc 
20ad0 3d 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74  = p->pReal->pMet
20ae0 68 6f 64 73 2d 3e 78 57 72 69 74 65 28 70 2d 3e  hods->xWrite(p->
20af0 70 52 65 61 6c 2c 20 7a 42 75 66 2c 20 69 41 6d  pReal, zBuf, iAm
20b00 74 2c 20 69 4f 66 73 74 29 3b 0a 20 20 20 20 69  t, iOfst);.    i
20b10 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
20b20 20 26 26 20 69 4f 66 73 74 3d 3d 30 20 26 26 20   && iOfst==0 && 
20b30 28 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20  (p->openFlags & 
20b40 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
20b50 5f 44 42 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  _DB) ){.      /*
20b60 20 54 68 65 73 65 20 6c 6f 6f 6b 20 6c 69 6b 65   These look like
20b70 20 6d 61 67 69 63 20 6e 75 6d 62 65 72 73 2e 20   magic numbers. 
20b80 42 75 74 20 74 68 65 79 20 61 72 65 20 73 74 61  But they are sta
20b90 62 6c 65 2c 20 61 73 20 74 68 65 79 20 61 72 65  ble, as they are
20ba0 20 70 61 72 74 0a 20 20 20 20 20 20 2a 2a 20 6f   part.      ** o
20bb0 66 20 74 68 65 20 64 65 66 69 6e 69 74 69 6f 6e  f the definition
20bc0 20 6f 66 20 74 68 65 20 53 51 4c 69 74 65 20 66   of the SQLite f
20bd0 69 6c 65 20 66 6f 72 6d 61 74 2c 20 77 68 69 63  ile format, whic
20be0 68 20 6d 61 79 20 6e 6f 74 20 63 68 61 6e 67 65  h may not change
20bf0 2e 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 2a 70  . */.      u8 *p
20c00 42 75 66 20 3d 20 28 75 38 2a 29 7a 42 75 66 3b  Buf = (u8*)zBuf;
20c10 0a 20 20 20 20 20 20 70 2d 3e 69 43 6f 6f 6b 69  .      p->iCooki
20c20 65 20 3d 20 72 62 75 47 65 74 55 33 32 28 26 70  e = rbuGetU32(&p
20c30 42 75 66 5b 32 34 5d 29 3b 0a 20 20 20 20 20 20  Buf[24]);.      
20c40 70 2d 3e 69 57 72 69 74 65 56 65 72 20 3d 20 70  p->iWriteVer = p
20c50 42 75 66 5b 31 39 5d 3b 0a 20 20 20 20 7d 0a 20  Buf[19];.    }. 
20c60 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
20c70 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74  }../*.** Truncat
20c80 65 20 61 6e 20 72 62 75 56 66 73 2d 66 69 6c 65  e an rbuVfs-file
20c90 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
20ca0 72 62 75 56 66 73 54 72 75 6e 63 61 74 65 28 73  rbuVfsTruncate(s
20cb0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
20cc0 6c 65 2c 20 73 71 6c 69 74 65 5f 69 6e 74 36 34  le, sqlite_int64
20cd0 20 73 69 7a 65 29 7b 0a 20 20 72 62 75 5f 66 69   size){.  rbu_fi
20ce0 6c 65 20 2a 70 20 3d 20 28 72 62 75 5f 66 69 6c  le *p = (rbu_fil
20cf0 65 2a 29 70 46 69 6c 65 3b 0a 20 20 72 65 74 75  e*)pFile;.  retu
20d00 72 6e 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65  rn p->pReal->pMe
20d10 74 68 6f 64 73 2d 3e 78 54 72 75 6e 63 61 74 65  thods->xTruncate
20d20 28 70 2d 3e 70 52 65 61 6c 2c 20 73 69 7a 65 29  (p->pReal, size)
20d30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20  ;.}../*.** Sync 
20d40 61 6e 20 72 62 75 56 66 73 2d 66 69 6c 65 2e 0a  an rbuVfs-file..
20d50 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62  */.static int rb
20d60 75 56 66 73 53 79 6e 63 28 73 71 6c 69 74 65 33  uVfsSync(sqlite3
20d70 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e  _file *pFile, in
20d80 74 20 66 6c 61 67 73 29 7b 0a 20 20 72 62 75 5f  t flags){.  rbu_
20d90 66 69 6c 65 20 2a 70 20 3d 20 28 72 62 75 5f 66  file *p = (rbu_f
20da0 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 69  ile *)pFile;.  i
20db0 66 28 20 70 2d 3e 70 52 62 75 20 26 26 20 70 2d  f( p->pRbu && p-
20dc0 3e 70 52 62 75 2d 3e 65 53 74 61 67 65 3d 3d 52  >pRbu->eStage==R
20dd0 42 55 5f 53 54 41 47 45 5f 43 41 50 54 55 52 45  BU_STAGE_CAPTURE
20de0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f   ){.    if( p->o
20df0 70 65 6e 46 6c 61 67 73 20 26 20 53 51 4c 49 54  penFlags & SQLIT
20e00 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29  E_OPEN_MAIN_DB )
20e10 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
20e20 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c 3b 0a  QLITE_INTERNAL;.
20e30 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
20e40 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
20e50 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 52 65 61    return p->pRea
20e60 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53 79  l->pMethods->xSy
20e70 6e 63 28 70 2d 3e 70 52 65 61 6c 2c 20 66 6c 61  nc(p->pReal, fla
20e80 67 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  gs);.}../*.** Re
20e90 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74  turn the current
20ea0 20 66 69 6c 65 2d 73 69 7a 65 20 6f 66 20 61 6e   file-size of an
20eb0 20 72 62 75 56 66 73 2d 66 69 6c 65 2e 0a 2a 2f   rbuVfs-file..*/
20ec0 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 56  .static int rbuV
20ed0 66 73 46 69 6c 65 53 69 7a 65 28 73 71 6c 69 74  fsFileSize(sqlit
20ee0 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20  e3_file *pFile, 
20ef0 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 2a 70 53  sqlite_int64 *pS
20f00 69 7a 65 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65  ize){.  rbu_file
20f10 20 2a 70 20 3d 20 28 72 62 75 5f 66 69 6c 65 20   *p = (rbu_file 
20f20 2a 29 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20 72  *)pFile;.  int r
20f30 63 3b 0a 20 20 72 63 20 3d 20 70 2d 3e 70 52 65  c;.  rc = p->pRe
20f40 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 46  al->pMethods->xF
20f50 69 6c 65 53 69 7a 65 28 70 2d 3e 70 52 65 61 6c  ileSize(p->pReal
20f60 2c 20 70 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20  , pSize);..  /* 
20f70 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 52 42  If this is an RB
20f80 55 20 76 61 63 75 75 6d 20 6f 70 65 72 61 74 69  U vacuum operati
20f90 6f 6e 20 61 6e 64 20 74 68 69 73 20 69 73 20 74  on and this is t
20fa0 68 65 20 74 61 72 67 65 74 20 64 61 74 61 62 61  he target databa
20fb0 73 65 2c 0a 20 20 2a 2a 20 70 72 65 74 65 6e 64  se,.  ** pretend
20fc0 20 74 68 61 74 20 69 74 20 68 61 73 20 61 74 20   that it has at 
20fd0 6c 65 61 73 74 20 6f 6e 65 20 70 61 67 65 2e 20  least one page. 
20fe0 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 69 74  Otherwise, SQLit
20ff0 65 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 2a 2a 20  e will not.  ** 
21000 63 68 65 63 6b 20 66 6f 72 20 74 68 65 20 65 78  check for the ex
21010 69 73 74 61 6e 63 65 20 6f 66 20 61 20 2a 2d 77  istance of a *-w
21020 61 6c 20 66 69 6c 65 2e 20 72 62 75 56 66 73 52  al file. rbuVfsR
21030 65 61 64 28 29 20 63 6f 6e 74 61 69 6e 73 20 0a  ead() contains .
21040 20 20 2a 2a 20 73 69 6d 69 6c 61 72 20 6c 6f 67    ** similar log
21050 69 63 2e 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  ic.  */.  if( rc
21060 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 2a  ==SQLITE_OK && *
21070 70 53 69 7a 65 3d 3d 30 20 0a 20 20 20 26 26 20  pSize==0 .   && 
21080 70 2d 3e 70 52 62 75 20 26 26 20 72 62 75 49 73  p->pRbu && rbuIs
21090 56 61 63 75 75 6d 28 70 2d 3e 70 52 62 75 29 20  Vacuum(p->pRbu) 
210a0 0a 20 20 20 26 26 20 28 70 2d 3e 6f 70 65 6e 46  .   && (p->openF
210b0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
210c0 45 4e 5f 4d 41 49 4e 5f 44 42 29 0a 20 20 29 7b  EN_MAIN_DB).  ){
210d0 0a 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 31 30  .    *pSize = 10
210e0 32 34 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  24;.  }.  return
210f0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
21100 63 6b 20 61 6e 20 72 62 75 56 66 73 2d 66 69 6c  ck an rbuVfs-fil
21110 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
21120 20 72 62 75 56 66 73 4c 6f 63 6b 28 73 71 6c 69   rbuVfsLock(sqli
21130 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c  te3_file *pFile,
21140 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 72   int eLock){.  r
21150 62 75 5f 66 69 6c 65 20 2a 70 20 3d 20 28 72 62  bu_file *p = (rb
21160 75 5f 66 69 6c 65 2a 29 70 46 69 6c 65 3b 0a 20  u_file*)pFile;. 
21170 20 73 71 6c 69 74 65 33 72 62 75 20 2a 70 52 62   sqlite3rbu *pRb
21180 75 20 3d 20 70 2d 3e 70 52 62 75 3b 0a 20 20 69  u = p->pRbu;.  i
21190 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
211a0 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  K;..  assert( p-
211b0 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20 28 53 51  >openFlags & (SQ
211c0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
211d0 42 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45  B|SQLITE_OPEN_TE
211e0 4d 50 5f 44 42 29 20 29 3b 0a 20 20 69 66 28 20  MP_DB) );.  if( 
211f0 65 4c 6f 63 6b 3d 3d 53 51 4c 49 54 45 5f 4c 4f  eLock==SQLITE_LO
21200 43 4b 5f 45 58 43 4c 55 53 49 56 45 20 0a 20 20  CK_EXCLUSIVE .  
21210 20 26 26 20 28 70 2d 3e 62 4e 6f 6c 6f 63 6b 20   && (p->bNolock 
21220 7c 7c 20 28 70 52 62 75 20 26 26 20 70 52 62 75  || (pRbu && pRbu
21230 2d 3e 65 53 74 61 67 65 21 3d 52 42 55 5f 53 54  ->eStage!=RBU_ST
21240 41 47 45 5f 44 4f 4e 45 29 29 0a 20 20 29 7b 0a  AGE_DONE)).  ){.
21250 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c      /* Do not al
21260 6c 6f 77 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  low EXCLUSIVE lo
21270 63 6b 73 2e 20 50 72 65 76 65 6e 74 69 6e 67 20  cks. Preventing 
21280 53 51 4c 69 74 65 20 66 72 6f 6d 20 74 61 6b 69  SQLite from taki
21290 6e 67 20 74 68 69 73 20 0a 20 20 20 20 2a 2a 20  ng this .    ** 
212a0 70 72 65 76 65 6e 74 73 20 69 74 20 66 72 6f 6d  prevents it from
212b0 20 63 68 65 63 6b 70 6f 69 6e 74 69 6e 67 20 74   checkpointing t
212c0 68 65 20 64 61 74 61 62 61 73 65 20 66 72 6f 6d  he database from
212d0 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 29   sqlite3_close()
212e0 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51  . */.    rc = SQ
212f0 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65 6c  LITE_BUSY;.  }el
21300 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 70 2d 3e  se{.    rc = p->
21310 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d  pReal->pMethods-
21320 3e 78 4c 6f 63 6b 28 70 2d 3e 70 52 65 61 6c 2c  >xLock(p->pReal,
21330 20 65 4c 6f 63 6b 29 3b 0a 20 20 7d 0a 0a 20 20   eLock);.  }..  
21340 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
21350 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 61 6e 20 72 62  .** Unlock an rb
21360 75 56 66 73 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74  uVfs-file..*/.st
21370 61 74 69 63 20 69 6e 74 20 72 62 75 56 66 73 55  atic int rbuVfsU
21380 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
21390 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20 65  le *pFile, int e
213a0 4c 6f 63 6b 29 7b 0a 20 20 72 62 75 5f 66 69 6c  Lock){.  rbu_fil
213b0 65 20 2a 70 20 3d 20 28 72 62 75 5f 66 69 6c 65  e *p = (rbu_file
213c0 20 2a 29 70 46 69 6c 65 3b 0a 20 20 72 65 74 75   *)pFile;.  retu
213d0 72 6e 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65  rn p->pReal->pMe
213e0 74 68 6f 64 73 2d 3e 78 55 6e 6c 6f 63 6b 28 70  thods->xUnlock(p
213f0 2d 3e 70 52 65 61 6c 2c 20 65 4c 6f 63 6b 29 3b  ->pReal, eLock);
21400 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  .}../*.** Check 
21410 69 66 20 61 6e 6f 74 68 65 72 20 66 69 6c 65 2d  if another file-
21420 68 61 6e 64 6c 65 20 68 6f 6c 64 73 20 61 20 52  handle holds a R
21430 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20  ESERVED lock on 
21440 61 6e 20 72 62 75 56 66 73 2d 66 69 6c 65 2e 0a  an rbuVfs-file..
21450 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62  */.static int rb
21460 75 56 66 73 43 68 65 63 6b 52 65 73 65 72 76 65  uVfsCheckReserve
21470 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  dLock(sqlite3_fi
21480 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20 2a  le *pFile, int *
21490 70 52 65 73 4f 75 74 29 7b 0a 20 20 72 62 75 5f  pResOut){.  rbu_
214a0 66 69 6c 65 20 2a 70 20 3d 20 28 72 62 75 5f 66  file *p = (rbu_f
214b0 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 72  ile *)pFile;.  r
214c0 65 74 75 72 6e 20 70 2d 3e 70 52 65 61 6c 2d 3e  eturn p->pReal->
214d0 70 4d 65 74 68 6f 64 73 2d 3e 78 43 68 65 63 6b  pMethods->xCheck
214e0 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 70 2d 3e  ReservedLock(p->
214f0 70 52 65 61 6c 2c 20 70 52 65 73 4f 75 74 29 3b  pReal, pResOut);
21500 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c 65 20 63  .}../*.** File c
21510 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64 2e 20 46  ontrol method. F
21520 6f 72 20 63 75 73 74 6f 6d 20 6f 70 65 72 61 74  or custom operat
21530 69 6f 6e 73 20 6f 6e 20 61 6e 20 72 62 75 56 66  ions on an rbuVf
21540 73 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  s-file..*/.stati
21550 63 20 69 6e 74 20 72 62 75 56 66 73 46 69 6c 65  c int rbuVfsFile
21560 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f  Control(sqlite3_
21570 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74  file *pFile, int
21580 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 67 29   op, void *pArg)
21590 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 20  {.  rbu_file *p 
215a0 3d 20 28 72 62 75 5f 66 69 6c 65 20 2a 29 70 46  = (rbu_file *)pF
215b0 69 6c 65 3b 0a 20 20 69 6e 74 20 28 2a 78 43 6f  ile;.  int (*xCo
215c0 6e 74 72 6f 6c 29 28 73 71 6c 69 74 65 33 5f 66  ntrol)(sqlite3_f
215d0 69 6c 65 2a 2c 69 6e 74 2c 76 6f 69 64 2a 29 20  ile*,int,void*) 
215e0 3d 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74  = p->pReal->pMet
215f0 68 6f 64 73 2d 3e 78 46 69 6c 65 43 6f 6e 74 72  hods->xFileContr
21600 6f 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  ol;.  int rc;.. 
21610 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 65 6e   assert( p->open
21620 46 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f  Flags & (SQLITE_
21630 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 7c 53 51 4c  OPEN_MAIN_DB|SQL
21640 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42  ITE_OPEN_TEMP_DB
21650 29 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6f  ).       || p->o
21660 70 65 6e 46 6c 61 67 73 20 26 20 28 53 51 4c 49  penFlags & (SQLI
21670 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e  TE_OPEN_TRANSIEN
21680 54 5f 44 42 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  T_DB|SQLITE_OPEN
21690 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 29 0a 20  _TEMP_JOURNAL). 
216a0 20 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 53 51   );.  if( op==SQ
216b0 4c 49 54 45 5f 46 43 4e 54 4c 5f 52 42 55 20 29  LITE_FCNTL_RBU )
216c0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 72 62 75  {.    sqlite3rbu
216d0 20 2a 70 52 62 75 20 3d 20 28 73 71 6c 69 74 65   *pRbu = (sqlite
216e0 33 72 62 75 2a 29 70 41 72 67 3b 0a 0a 20 20 20  3rbu*)pArg;..   
216f0 20 2f 2a 20 46 69 72 73 74 20 74 72 79 20 74 6f   /* First try to
21700 20 66 69 6e 64 20 61 6e 6f 74 68 65 72 20 52 42   find another RB
21710 55 20 76 66 73 20 6c 6f 77 65 72 20 64 6f 77 6e  U vfs lower down
21720 20 69 6e 20 74 68 65 20 76 66 73 20 73 74 61 63   in the vfs stac
21730 6b 2e 20 49 66 0a 20 20 20 20 2a 2a 20 6f 6e 65  k. If.    ** one
21740 20 69 73 20 66 6f 75 6e 64 2c 20 74 68 69 73 20   is found, this 
21750 76 66 73 20 77 69 6c 6c 20 6f 70 65 72 61 74 65  vfs will operate
21760 20 69 6e 20 70 61 73 73 2d 74 68 72 6f 75 67 68   in pass-through
21770 20 6d 6f 64 65 2e 20 54 68 65 20 6c 6f 77 65 72   mode. The lower
21780 0a 20 20 20 20 2a 2a 20 6c 65 76 65 6c 20 76 66  .    ** level vf
21790 73 20 77 69 6c 6c 20 64 6f 20 74 68 65 20 73 70  s will do the sp
217a0 65 63 69 61 6c 20 52 42 55 20 68 61 6e 64 6c 69  ecial RBU handli
217b0 6e 67 2e 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  ng.  */.    rc =
217c0 20 78 43 6f 6e 74 72 6f 6c 28 70 2d 3e 70 52 65   xControl(p->pRe
217d0 61 6c 2c 20 6f 70 2c 20 70 41 72 67 29 3b 0a 0a  al, op, pArg);..
217e0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
217f0 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 7b 0a 20  TE_NOTFOUND ){. 
21800 20 20 20 20 20 2f 2a 20 4e 6f 77 20 73 65 61 72       /* Now sear
21810 63 68 20 66 6f 72 20 61 20 7a 69 70 76 66 73 20  ch for a zipvfs 
21820 69 6e 73 74 61 6e 63 65 20 6c 6f 77 65 72 20 64  instance lower d
21830 6f 77 6e 20 69 6e 20 74 68 65 20 56 46 53 20 73  own in the VFS s
21840 74 61 63 6b 2e 20 49 66 0a 20 20 20 20 20 20 2a  tack. If.      *
21850 2a 20 6f 6e 65 20 69 73 20 66 6f 75 6e 64 2c 20  * one is found, 
21860 74 68 69 73 20 69 73 20 61 6e 20 65 72 72 6f 72  this is an error
21870 2e 20 20 2a 2f 0a 20 20 20 20 20 20 76 6f 69 64  .  */.      void
21880 20 2a 64 75 6d 6d 79 20 3d 20 30 3b 0a 20 20 20   *dummy = 0;.   
21890 20 20 20 72 63 20 3d 20 78 43 6f 6e 74 72 6f 6c     rc = xControl
218a0 28 70 2d 3e 70 52 65 61 6c 2c 20 53 51 4c 49 54  (p->pReal, SQLIT
218b0 45 5f 46 43 4e 54 4c 5f 5a 49 50 56 46 53 2c 20  E_FCNTL_ZIPVFS, 
218c0 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20 69  &dummy);.      i
218d0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
218e0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
218f0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
21900 20 20 20 20 20 20 20 70 52 62 75 2d 3e 7a 45 72         pRbu->zEr
21910 72 6d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  rmsg = sqlite3_m
21920 70 72 69 6e 74 66 28 22 72 62 75 2f 7a 69 70 76  printf("rbu/zipv
21930 66 73 20 73 65 74 75 70 20 65 72 72 6f 72 22 29  fs setup error")
21940 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
21950 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54  ( rc==SQLITE_NOT
21960 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20 20 20  FOUND ){.       
21970 20 70 52 62 75 2d 3e 70 54 61 72 67 65 74 46 64   pRbu->pTargetFd
21980 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 70 2d   = p;.        p-
21990 3e 70 52 62 75 20 3d 20 70 52 62 75 3b 0a 20 20  >pRbu = pRbu;.  
219a0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 57 61        if( p->pWa
219b0 6c 46 64 20 29 20 70 2d 3e 70 57 61 6c 46 64 2d  lFd ) p->pWalFd-
219c0 3e 70 52 62 75 20 3d 20 70 52 62 75 3b 0a 20 20  >pRbu = pRbu;.  
219d0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
219e0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
219f0 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72    }.    return r
21a00 63 3b 0a 20 20 7d 0a 20 20 65 6c 73 65 20 69 66  c;.  }.  else if
21a10 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 46 43 4e  ( op==SQLITE_FCN
21a20 54 4c 5f 52 42 55 43 4e 54 20 29 7b 0a 20 20 20  TL_RBUCNT ){.   
21a30 20 73 71 6c 69 74 65 33 72 62 75 20 2a 70 52 62   sqlite3rbu *pRb
21a40 75 20 3d 20 28 73 71 6c 69 74 65 33 72 62 75 2a  u = (sqlite3rbu*
21a50 29 70 41 72 67 3b 0a 20 20 20 20 70 52 62 75 2d  )pArg;.    pRbu-
21a60 3e 6e 52 62 75 2b 2b 3b 0a 20 20 20 20 70 52 62  >nRbu++;.    pRb
21a70 75 2d 3e 70 52 62 75 46 64 20 3d 20 70 3b 0a 20  u->pRbuFd = p;. 
21a80 20 20 20 70 2d 3e 62 4e 6f 6c 6f 63 6b 20 3d 20     p->bNolock = 
21a90 31 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 78  1;.  }..  rc = x
21aa0 43 6f 6e 74 72 6f 6c 28 70 2d 3e 70 52 65 61 6c  Control(p->pReal
21ab0 2c 20 6f 70 2c 20 70 41 72 67 29 3b 0a 20 20 69  , op, pArg);.  i
21ac0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
21ad0 20 26 26 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 46   && op==SQLITE_F
21ae0 43 4e 54 4c 5f 56 46 53 4e 41 4d 45 20 29 7b 0a  CNTL_VFSNAME ){.
21af0 20 20 20 20 72 62 75 5f 76 66 73 20 2a 70 52 62      rbu_vfs *pRb
21b00 75 56 66 73 20 3d 20 70 2d 3e 70 52 62 75 56 66  uVfs = p->pRbuVf
21b10 73 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 49 6e  s;.    char *zIn
21b20 20 3d 20 2a 28 63 68 61 72 2a 2a 29 70 41 72 67   = *(char**)pArg
21b30 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4f 75 74  ;.    char *zOut
21b40 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
21b50 74 66 28 22 72 62 75 28 25 73 29 2f 25 7a 22 2c  tf("rbu(%s)/%z",
21b60 20 70 52 62 75 56 66 73 2d 3e 62 61 73 65 2e 7a   pRbuVfs->base.z
21b70 4e 61 6d 65 2c 20 7a 49 6e 29 3b 0a 20 20 20 20  Name, zIn);.    
21b80 2a 28 63 68 61 72 2a 2a 29 70 41 72 67 20 3d 20  *(char**)pArg = 
21b90 7a 4f 75 74 3b 0a 20 20 20 20 69 66 28 20 7a 4f  zOut;.    if( zO
21ba0 75 74 3d 3d 30 20 29 20 72 63 20 3d 20 53 51 4c  ut==0 ) rc = SQL
21bb0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a  ITE_NOMEM;.  }..
21bc0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
21bd0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
21be0 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 69 6e 20   sector-size in 
21bf0 62 79 74 65 73 20 66 6f 72 20 61 6e 20 72 62 75  bytes for an rbu
21c00 56 66 73 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  Vfs-file..*/.sta
21c10 74 69 63 20 69 6e 74 20 72 62 75 56 66 73 53 65  tic int rbuVfsSe
21c20 63 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33  ctorSize(sqlite3
21c30 5f 66 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  _file *pFile){. 
21c40 20 72 62 75 5f 66 69 6c 65 20 2a 70 20 3d 20 28   rbu_file *p = (
21c50 72 62 75 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65  rbu_file *)pFile
21c60 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 52  ;.  return p->pR
21c70 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78  eal->pMethods->x
21c80 53 65 63 74 6f 72 53 69 7a 65 28 70 2d 3e 70 52  SectorSize(p->pR
21c90 65 61 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  eal);.}../*.** R
21ca0 65 74 75 72 6e 20 74 68 65 20 64 65 76 69 63 65  eturn the device
21cb0 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63 20   characteristic 
21cc0 66 6c 61 67 73 20 73 75 70 70 6f 72 74 65 64 20  flags supported 
21cd0 62 79 20 61 6e 20 72 62 75 56 66 73 2d 66 69 6c  by an rbuVfs-fil
21ce0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
21cf0 20 72 62 75 56 66 73 44 65 76 69 63 65 43 68 61   rbuVfsDeviceCha
21d00 72 61 63 74 65 72 69 73 74 69 63 73 28 73 71 6c  racteristics(sql
21d10 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65  ite3_file *pFile
21d20 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a 70  ){.  rbu_file *p
21d30 20 3d 20 28 72 62 75 5f 66 69 6c 65 20 2a 29 70   = (rbu_file *)p
21d40 46 69 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 70  File;.  return p
21d50 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64  ->pReal->pMethod
21d60 73 2d 3e 78 44 65 76 69 63 65 43 68 61 72 61 63  s->xDeviceCharac
21d70 74 65 72 69 73 74 69 63 73 28 70 2d 3e 70 52 65  teristics(p->pRe
21d80 61 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 61  al);.}../*.** Ta
21d90 6b 65 20 6f 72 20 72 65 6c 65 61 73 65 20 61 20  ke or release a 
21da0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6c 6f  shared-memory lo
21db0 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ck..*/.static in
21dc0 74 20 72 62 75 56 66 73 53 68 6d 4c 6f 63 6b 28  t rbuVfsShmLock(
21dd0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
21de0 69 6c 65 2c 20 69 6e 74 20 6f 66 73 74 2c 20 69  ile, int ofst, i
21df0 6e 74 20 6e 2c 20 69 6e 74 20 66 6c 61 67 73 29  nt n, int flags)
21e00 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 20  {.  rbu_file *p 
21e10 3d 20 28 72 62 75 5f 66 69 6c 65 2a 29 70 46 69  = (rbu_file*)pFi
21e20 6c 65 3b 0a 20 20 73 71 6c 69 74 65 33 72 62 75  le;.  sqlite3rbu
21e30 20 2a 70 52 62 75 20 3d 20 70 2d 3e 70 52 62 75   *pRbu = p->pRbu
21e40 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
21e50 49 54 45 5f 4f 4b 3b 0a 0a 23 69 66 64 65 66 20  ITE_OK;..#ifdef 
21e60 53 51 4c 49 54 45 5f 41 4d 41 4c 47 41 4d 41 54  SQLITE_AMALGAMAT
21e70 49 4f 4e 0a 20 20 20 20 61 73 73 65 72 74 28 20  ION.    assert( 
21e80 57 41 4c 5f 43 4b 50 54 5f 4c 4f 43 4b 3d 3d 31  WAL_CKPT_LOCK==1
21e90 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73   );.#endif..  as
21ea0 73 65 72 74 28 20 70 2d 3e 6f 70 65 6e 46 6c 61  sert( p->openFla
21eb0 67 73 20 26 20 28 53 51 4c 49 54 45 5f 4f 50 45  gs & (SQLITE_OPE
21ec0 4e 5f 4d 41 49 4e 5f 44 42 7c 53 51 4c 49 54 45  N_MAIN_DB|SQLITE
21ed0 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 29 20 29  _OPEN_TEMP_DB) )
21ee0 3b 0a 20 20 69 66 28 20 70 52 62 75 20 26 26 20  ;.  if( pRbu && 
21ef0 28 70 52 62 75 2d 3e 65 53 74 61 67 65 3d 3d 52  (pRbu->eStage==R
21f00 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20 7c 7c 20  BU_STAGE_OAL || 
21f10 70 52 62 75 2d 3e 65 53 74 61 67 65 3d 3d 52 42  pRbu->eStage==RB
21f20 55 5f 53 54 41 47 45 5f 4d 4f 56 45 29 20 29 7b  U_STAGE_MOVE) ){
21f30 0a 20 20 20 20 2f 2a 20 4d 61 67 69 63 20 6e 75  .    /* Magic nu
21f40 6d 62 65 72 20 31 20 69 73 20 74 68 65 20 57 41  mber 1 is the WA
21f50 4c 5f 43 4b 50 54 5f 4c 4f 43 4b 20 6c 6f 63 6b  L_CKPT_LOCK lock
21f60 2e 20 50 72 65 76 65 6e 74 69 6e 67 20 53 51 4c  . Preventing SQL
21f70 69 74 65 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20  ite from.    ** 
21f80 74 61 6b 69 6e 67 20 74 68 69 73 20 6c 6f 63 6b  taking this lock
21f90 20 61 6c 73 6f 20 70 72 65 76 65 6e 74 73 20 61   also prevents a
21fa0 6e 79 20 63 68 65 63 6b 70 6f 69 6e 74 73 20 66  ny checkpoints f
21fb0 72 6f 6d 20 6f 63 63 75 72 72 69 6e 67 2e 20 0a  rom occurring. .
21fc0 20 20 20 20 2a 2a 20 74 6f 64 6f 3a 20 72 65 61      ** todo: rea
21fd0 6c 6c 79 2c 20 69 74 27 73 20 6e 6f 74 20 63 6c  lly, it's not cl
21fe0 65 61 72 20 77 68 79 20 74 68 69 73 20 6d 69 67  ear why this mig
21ff0 68 74 20 6f 63 63 75 72 2c 20 61 73 20 0a 20 20  ht occur, as .  
22000 20 20 2a 2a 20 77 61 6c 5f 61 75 74 6f 63 68 65    ** wal_autoche
22010 63 6b 70 6f 69 6e 74 20 6f 75 67 68 74 20 74 6f  ckpoint ought to
22020 20 62 65 20 74 75 72 6e 65 64 20 6f 66 66 2e 20   be turned off. 
22030 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 66 73 74   */.    if( ofst
22040 3d 3d 57 41 4c 5f 4c 4f 43 4b 5f 43 4b 50 54 20  ==WAL_LOCK_CKPT 
22050 26 26 20 6e 3d 3d 31 20 29 20 72 63 20 3d 20 53  && n==1 ) rc = S
22060 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65  QLITE_BUSY;.  }e
22070 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 62 43 61  lse{.    int bCa
22080 70 74 75 72 65 20 3d 20 30 3b 0a 20 20 20 20 69  pture = 0;.    i
22090 66 28 20 6e 3d 3d 31 20 26 26 20 28 66 6c 61 67  f( n==1 && (flag
220a0 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45  s & SQLITE_SHM_E
220b0 58 43 4c 55 53 49 56 45 29 0a 20 20 20 20 20 26  XCLUSIVE).     &
220c0 26 20 70 52 62 75 20 26 26 20 70 52 62 75 2d 3e  & pRbu && pRbu->
220d0 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47  eStage==RBU_STAG
220e0 45 5f 43 41 50 54 55 52 45 0a 20 20 20 20 20 26  E_CAPTURE.     &
220f0 26 20 28 6f 66 73 74 3d 3d 57 41 4c 5f 4c 4f 43  & (ofst==WAL_LOC
22100 4b 5f 57 52 49 54 45 20 7c 7c 20 6f 66 73 74 3d  K_WRITE || ofst=
22110 3d 57 41 4c 5f 4c 4f 43 4b 5f 43 4b 50 54 20 7c  =WAL_LOCK_CKPT |
22120 7c 20 6f 66 73 74 3d 3d 57 41 4c 5f 4c 4f 43 4b  | ofst==WAL_LOCK
22130 5f 52 45 41 44 30 29 0a 20 20 20 20 29 7b 0a 20  _READ0).    ){. 
22140 20 20 20 20 20 62 43 61 70 74 75 72 65 20 3d 20       bCapture = 
22150 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  1;.    }..    if
22160 28 20 62 43 61 70 74 75 72 65 3d 3d 30 20 7c 7c  ( bCapture==0 ||
22170 20 30 3d 3d 28 66 6c 61 67 73 20 26 20 53 51 4c   0==(flags & SQL
22180 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 29 20  ITE_SHM_UNLOCK) 
22190 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 2d  ){.      rc = p-
221a0 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73  >pReal->pMethods
221b0 2d 3e 78 53 68 6d 4c 6f 63 6b 28 70 2d 3e 70 52  ->xShmLock(p->pR
221c0 65 61 6c 2c 20 6f 66 73 74 2c 20 6e 2c 20 66 6c  eal, ofst, n, fl
221d0 61 67 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ags);.      if( 
221e0 62 43 61 70 74 75 72 65 20 26 26 20 72 63 3d 3d  bCapture && rc==
221f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
22200 20 20 20 20 20 70 52 62 75 2d 3e 6d 4c 6f 63 6b       pRbu->mLock
22210 20 7c 3d 20 28 31 20 3c 3c 20 6f 66 73 74 29 3b   |= (1 << ofst);
22220 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
22230 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
22240 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e  .}../*.** Obtain
22250 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
22260 6d 61 70 70 69 6e 67 20 6f 66 20 61 20 73 69 6e  mapping of a sin
22270 67 6c 65 20 33 32 4b 69 42 20 70 61 67 65 20 6f  gle 32KiB page o
22280 66 20 74 68 65 20 2a 2d 73 68 6d 20 66 69 6c 65  f the *-shm file
22290 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
222a0 72 62 75 56 66 73 53 68 6d 4d 61 70 28 0a 20 20  rbuVfsShmMap(.  
222b0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
222c0 69 6c 65 2c 20 0a 20 20 69 6e 74 20 69 52 65 67  ile, .  int iReg
222d0 69 6f 6e 2c 20 0a 20 20 69 6e 74 20 73 7a 52 65  ion, .  int szRe
222e0 67 69 6f 6e 2c 20 0a 20 20 69 6e 74 20 69 73 57  gion, .  int isW
222f0 72 69 74 65 2c 20 0a 20 20 76 6f 69 64 20 76 6f  rite, .  void vo
22300 6c 61 74 69 6c 65 20 2a 2a 70 70 0a 29 7b 0a 20  latile **pp.){. 
22310 20 72 62 75 5f 66 69 6c 65 20 2a 70 20 3d 20 28   rbu_file *p = (
22320 72 62 75 5f 66 69 6c 65 2a 29 70 46 69 6c 65 3b  rbu_file*)pFile;
22330 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
22340 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 65 53 74  TE_OK;.  int eSt
22350 61 67 65 20 3d 20 28 70 2d 3e 70 52 62 75 20 3f  age = (p->pRbu ?
22360 20 70 2d 3e 70 52 62 75 2d 3e 65 53 74 61 67 65   p->pRbu->eStage
22370 20 3a 20 30 29 3b 0a 0a 20 20 2f 2a 20 49 66 20   : 0);..  /* If 
22380 6e 6f 74 20 69 6e 20 52 42 55 5f 53 54 41 47 45  not in RBU_STAGE
22390 5f 4f 41 4c 2c 20 61 6c 6c 6f 77 20 74 68 69 73  _OAL, allow this
223a0 20 63 61 6c 6c 20 74 6f 20 70 61 73 73 20 74 68   call to pass th
223b0 72 6f 75 67 68 2e 20 4f 72 2c 20 69 66 20 74 68  rough. Or, if th
223c0 69 73 0a 20 20 2a 2a 20 72 62 75 20 69 73 20 69  is.  ** rbu is i
223d0 6e 20 74 68 65 20 52 42 55 5f 53 54 41 47 45 5f  n the RBU_STAGE_
223e0 4f 41 4c 20 73 74 61 74 65 2c 20 75 73 65 20 68  OAL state, use h
223f0 65 61 70 20 6d 65 6d 6f 72 79 20 66 6f 72 20 2a  eap memory for *
22400 2d 73 68 6d 20 73 70 61 63 65 20 0a 20 20 2a 2a  -shm space .  **
22410 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20 66 69   instead of a fi
22420 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 20 2a 2f 0a  le on disk.  */.
22430 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 65    assert( p->ope
22440 6e 46 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45  nFlags & (SQLITE
22450 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 7c 53 51  _OPEN_MAIN_DB|SQ
22460 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44  LITE_OPEN_TEMP_D
22470 42 29 20 29 3b 0a 20 20 69 66 28 20 65 53 74 61  B) );.  if( eSta
22480 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4f 41  ge==RBU_STAGE_OA
22490 4c 20 7c 7c 20 65 53 74 61 67 65 3d 3d 52 42 55  L || eStage==RBU
224a0 5f 53 54 41 47 45 5f 4d 4f 56 45 20 29 7b 0a 20  _STAGE_MOVE ){. 
224b0 20 20 20 69 66 28 20 69 52 65 67 69 6f 6e 3c 3d     if( iRegion<=
224c0 70 2d 3e 6e 53 68 6d 20 29 7b 0a 20 20 20 20 20  p->nShm ){.     
224d0 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 69 52   int nByte = (iR
224e0 65 67 69 6f 6e 2b 31 29 20 2a 20 73 69 7a 65 6f  egion+1) * sizeo
224f0 66 28 63 68 61 72 2a 29 3b 0a 20 20 20 20 20 20  f(char*);.      
22500 63 68 61 72 20 2a 2a 61 70 4e 65 77 20 3d 20 28  char **apNew = (
22510 63 68 61 72 2a 2a 29 73 71 6c 69 74 65 33 5f 72  char**)sqlite3_r
22520 65 61 6c 6c 6f 63 36 34 28 70 2d 3e 61 70 53 68  ealloc64(p->apSh
22530 6d 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  m, nByte);.     
22540 20 69 66 28 20 61 70 4e 65 77 3d 3d 30 20 29 7b   if( apNew==0 ){
22550 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
22560 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
22570 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
22580 20 6d 65 6d 73 65 74 28 26 61 70 4e 65 77 5b 70   memset(&apNew[p
22590 2d 3e 6e 53 68 6d 5d 2c 20 30 2c 20 73 69 7a 65  ->nShm], 0, size
225a0 6f 66 28 63 68 61 72 2a 29 20 2a 20 28 31 20 2b  of(char*) * (1 +
225b0 20 69 52 65 67 69 6f 6e 20 2d 20 70 2d 3e 6e 53   iRegion - p->nS
225c0 68 6d 29 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  hm));.        p-
225d0 3e 61 70 53 68 6d 20 3d 20 61 70 4e 65 77 3b 0a  >apShm = apNew;.
225e0 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 68 6d 20          p->nShm 
225f0 3d 20 69 52 65 67 69 6f 6e 2b 31 3b 0a 20 20 20  = iRegion+1;.   
22600 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
22610 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
22620 4b 20 26 26 20 70 2d 3e 61 70 53 68 6d 5b 69 52  K && p->apShm[iR
22630 65 67 69 6f 6e 5d 3d 3d 30 20 29 7b 0a 20 20 20  egion]==0 ){.   
22640 20 20 20 63 68 61 72 20 2a 70 4e 65 77 20 3d 20     char *pNew = 
22650 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 6d  (char*)sqlite3_m
22660 61 6c 6c 6f 63 36 34 28 73 7a 52 65 67 69 6f 6e  alloc64(szRegion
22670 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65  );.      if( pNe
22680 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  w==0 ){.        
22690 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
226a0 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  M;.      }else{.
226b0 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70          memset(p
226c0 4e 65 77 2c 20 30 2c 20 73 7a 52 65 67 69 6f 6e  New, 0, szRegion
226d0 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 70  );.        p->ap
226e0 53 68 6d 5b 69 52 65 67 69 6f 6e 5d 20 3d 20 70  Shm[iRegion] = p
226f0 4e 65 77 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  New;.      }.   
22700 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   }..    if( rc==
22710 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
22720 20 20 20 2a 70 70 20 3d 20 70 2d 3e 61 70 53 68     *pp = p->apSh
22730 6d 5b 69 52 65 67 69 6f 6e 5d 3b 0a 20 20 20 20  m[iRegion];.    
22740 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 70  }else{.      *pp
22750 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 0;.    }.  }e
22760 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
22770 20 70 2d 3e 61 70 53 68 6d 3d 3d 30 20 29 3b 0a   p->apShm==0 );.
22780 20 20 20 20 72 63 20 3d 20 70 2d 3e 70 52 65 61      rc = p->pRea
22790 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53 68  l->pMethods->xSh
227a0 6d 4d 61 70 28 70 2d 3e 70 52 65 61 6c 2c 20 69  mMap(p->pReal, i
227b0 52 65 67 69 6f 6e 2c 20 73 7a 52 65 67 69 6f 6e  Region, szRegion
227c0 2c 20 69 73 57 72 69 74 65 2c 20 70 70 29 3b 0a  , isWrite, pp);.
227d0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
227e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 6d 6f 72  ;.}../*.** Memor
227f0 79 20 62 61 72 72 69 65 72 2e 0a 2a 2f 0a 73 74  y barrier..*/.st
22800 61 74 69 63 20 76 6f 69 64 20 72 62 75 56 66 73  atic void rbuVfs
22810 53 68 6d 42 61 72 72 69 65 72 28 73 71 6c 69 74  ShmBarrier(sqlit
22820 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 29 7b  e3_file *pFile){
22830 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 20 3d  .  rbu_file *p =
22840 20 28 72 62 75 5f 66 69 6c 65 20 2a 29 70 46 69   (rbu_file *)pFi
22850 6c 65 3b 0a 20 20 70 2d 3e 70 52 65 61 6c 2d 3e  le;.  p->pReal->
22860 70 4d 65 74 68 6f 64 73 2d 3e 78 53 68 6d 42 61  pMethods->xShmBa
22870 72 72 69 65 72 28 70 2d 3e 70 52 65 61 6c 29 3b  rrier(p->pReal);
22880 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 78 53  .}../*.** The xS
22890 68 6d 55 6e 6d 61 70 20 6d 65 74 68 6f 64 2e 0a  hmUnmap method..
228a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62  */.static int rb
228b0 75 56 66 73 53 68 6d 55 6e 6d 61 70 28 73 71 6c  uVfsShmUnmap(sql
228c0 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65  ite3_file *pFile
228d0 2c 20 69 6e 74 20 64 65 6c 46 6c 61 67 29 7b 0a  , int delFlag){.
228e0 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 20 3d 20    rbu_file *p = 
228f0 28 72 62 75 5f 66 69 6c 65 2a 29 70 46 69 6c 65  (rbu_file*)pFile
22900 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
22910 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 65 53  ITE_OK;.  int eS
22920 74 61 67 65 20 3d 20 28 70 2d 3e 70 52 62 75 20  tage = (p->pRbu 
22930 3f 20 70 2d 3e 70 52 62 75 2d 3e 65 53 74 61 67  ? p->pRbu->eStag
22940 65 20 3a 20 30 29 3b 0a 0a 20 20 61 73 73 65 72  e : 0);..  asser
22950 74 28 20 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20  t( p->openFlags 
22960 26 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  & (SQLITE_OPEN_M
22970 41 49 4e 5f 44 42 7c 53 51 4c 49 54 45 5f 4f 50  AIN_DB|SQLITE_OP
22980 45 4e 5f 54 45 4d 50 5f 44 42 29 20 29 3b 0a 20  EN_TEMP_DB) );. 
22990 20 69 66 28 20 65 53 74 61 67 65 3d 3d 52 42 55   if( eStage==RBU
229a0 5f 53 54 41 47 45 5f 4f 41 4c 20 7c 7c 20 65 53  _STAGE_OAL || eS
229b0 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f  tage==RBU_STAGE_
229c0 4d 4f 56 45 20 29 7b 0a 20 20 20 20 2f 2a 20 6e  MOVE ){.    /* n
229d0 6f 2d 6f 70 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b  o-op */.  }else{
229e0 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20  .    /* Release 
229f0 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 65 72  the checkpointer
22a00 20 61 6e 64 20 77 72 69 74 65 72 20 6c 6f 63 6b   and writer lock
22a10 73 20 2a 2f 0a 20 20 20 20 72 62 75 55 6e 6c 6f  s */.    rbuUnlo
22a20 63 6b 53 68 6d 28 70 29 3b 0a 20 20 20 20 72 63  ckShm(p);.    rc
22a30 20 3d 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65   = p->pReal->pMe
22a40 74 68 6f 64 73 2d 3e 78 53 68 6d 55 6e 6d 61 70  thods->xShmUnmap
22a50 28 70 2d 3e 70 52 65 61 6c 2c 20 64 65 6c 46 6c  (p->pReal, delFl
22a60 61 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ag);.  }.  retur
22a70 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  n rc;.}../*.** G
22a80 69 76 65 6e 20 74 68 61 74 20 7a 57 61 6c 20 70  iven that zWal p
22a90 6f 69 6e 74 73 20 74 6f 20 61 20 62 75 66 66 65  oints to a buffe
22aa0 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20 77  r containing a w
22ab0 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 70 61 73  al file name pas
22ac0 73 65 64 20 74 6f 20 0a 2a 2a 20 65 69 74 68 65  sed to .** eithe
22ad0 72 20 74 68 65 20 78 4f 70 65 6e 28 29 20 6f 72  r the xOpen() or
22ae0 20 78 41 63 63 65 73 73 28 29 20 56 46 53 20 6d   xAccess() VFS m
22af0 65 74 68 6f 64 2c 20 72 65 74 75 72 6e 20 61 20  ethod, return a 
22b00 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0a 2a  pointer to the.*
22b10 2a 20 66 69 6c 65 2d 68 61 6e 64 6c 65 20 6f 70  * file-handle op
22b20 65 6e 65 64 20 62 79 20 74 68 65 20 73 61 6d 65  ened by the same
22b30 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
22b40 74 69 6f 6e 20 6f 6e 20 74 68 65 20 63 6f 72 72  tion on the corr
22b50 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 64 61 74  esponding.** dat
22b60 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73  abase file..*/.s
22b70 74 61 74 69 63 20 72 62 75 5f 66 69 6c 65 20 2a  tatic rbu_file *
22b80 72 62 75 46 69 6e 64 4d 61 69 6e 64 62 28 72 62  rbuFindMaindb(rb
22b90 75 5f 76 66 73 20 2a 70 52 62 75 56 66 73 2c 20  u_vfs *pRbuVfs, 
22ba0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 57 61 6c  const char *zWal
22bb0 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a 70  ){.  rbu_file *p
22bc0 44 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  Db;.  sqlite3_mu
22bd0 74 65 78 5f 65 6e 74 65 72 28 70 52 62 75 56 66  tex_enter(pRbuVf
22be0 73 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 66 6f 72  s->mutex);.  for
22bf0 28 70 44 62 3d 70 52 62 75 56 66 73 2d 3e 70 4d  (pDb=pRbuVfs->pM
22c00 61 69 6e 3b 20 70 44 62 20 26 26 20 70 44 62 2d  ain; pDb && pDb-
22c10 3e 7a 57 61 6c 21 3d 7a 57 61 6c 3b 20 70 44 62  >zWal!=zWal; pDb
22c20 3d 70 44 62 2d 3e 70 4d 61 69 6e 4e 65 78 74 29  =pDb->pMainNext)
22c30 7b 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  {}.  sqlite3_mut
22c40 65 78 5f 6c 65 61 76 65 28 70 52 62 75 56 66 73  ex_leave(pRbuVfs
22c50 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
22c60 72 6e 20 70 44 62 3b 0a 7d 0a 0a 2f 2a 20 0a 2a  rn pDb;.}../* .*
22c70 2a 20 41 20 6d 61 69 6e 20 64 61 74 61 62 61 73  * A main databas
22c80 65 20 6e 61 6d 65 64 20 7a 4e 61 6d 65 20 68 61  e named zName ha
22c90 73 20 6a 75 73 74 20 62 65 65 6e 20 6f 70 65 6e  s just been open
22ca0 65 64 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  ed. The followin
22cb0 67 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72  g .** function r
22cc0 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72  eturns a pointer
22cd0 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f 77 6e   to a buffer own
22ce0 65 64 20 62 79 20 53 51 4c 69 74 65 20 74 68 61  ed by SQLite tha
22cf0 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74 68  t contains.** th
22d00 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 2a 2d  e name of the *-
22d10 77 61 6c 20 66 69 6c 65 20 74 68 69 73 20 64 62  wal file this db
22d20 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 6c 6c   connection will
22d30 20 75 73 65 2e 20 53 51 4c 69 74 65 0a 2a 2a 20   use. SQLite.** 
22d40 68 61 70 70 65 6e 73 20 74 6f 20 70 61 73 73 20  happens to pass 
22d50 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69  a pointer to thi
22d60 73 20 62 75 66 66 65 72 20 77 68 65 6e 20 75 73  s buffer when us
22d70 69 6e 67 20 78 41 63 63 65 73 73 28 29 0a 2a 2a  ing xAccess().**
22d80 20 6f 72 20 78 4f 70 65 6e 28 29 20 74 6f 20 6f   or xOpen() to o
22d90 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 2a 2d  perate on the *-
22da0 77 61 6c 20 66 69 6c 65 2e 20 20 0a 2a 2f 0a 73  wal file.  .*/.s
22db0 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
22dc0 20 2a 72 62 75 4d 61 69 6e 54 6f 57 61 6c 28 63   *rbuMainToWal(c
22dd0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
22de0 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
22df0 69 6e 74 20 6e 20 3d 20 28 69 6e 74 29 73 74 72  int n = (int)str
22e00 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 63 6f  len(zName);.  co
22e10 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 26 7a  nst char *z = &z
22e20 4e 61 6d 65 5b 6e 5d 3b 0a 20 20 69 66 28 20 66  Name[n];.  if( f
22e30 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
22e40 45 4e 5f 55 52 49 20 29 7b 0a 20 20 20 20 69 6e  EN_URI ){.    in
22e50 74 20 6f 64 64 20 3d 20 30 3b 0a 20 20 20 20 77  t odd = 0;.    w
22e60 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 20  hile( 1 ){.     
22e70 20 69 66 28 20 7a 5b 30 5d 3d 3d 30 20 29 7b 0a   if( z[0]==0 ){.
22e80 20 20 20 20 20 20 20 20 6f 64 64 20 3d 20 31 20          odd = 1 
22e90 2d 20 6f 64 64 3b 0a 20 20 20 20 20 20 20 20 69  - odd;.        i
22ea0 66 28 20 6f 64 64 20 26 26 20 7a 5b 31 5d 3d 3d  f( odd && z[1]==
22eb0 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
22ec0 20 7d 0a 20 20 20 20 20 20 7a 2b 2b 3b 0a 20 20   }.      z++;.  
22ed0 20 20 7d 0a 20 20 20 20 7a 20 2b 3d 20 32 3b 0a    }.    z += 2;.
22ee0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69    }else{.    whi
22ef0 6c 65 28 20 2a 7a 3d 3d 30 20 29 20 7a 2b 2b 3b  le( *z==0 ) z++;
22f00 0a 20 20 7d 0a 20 20 7a 20 2b 3d 20 28 6e 20 2b  .  }.  z += (n +
22f10 20 38 20 2b 20 31 29 3b 0a 20 20 72 65 74 75 72   8 + 1);.  retur
22f20 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70  n z;.}../*.** Op
22f30 65 6e 20 61 6e 20 72 62 75 20 66 69 6c 65 20 68  en an rbu file h
22f40 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  andle..*/.static
22f50 20 69 6e 74 20 72 62 75 56 66 73 4f 70 65 6e 28   int rbuVfsOpen(
22f60 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
22f70 70 56 66 73 2c 0a 20 20 63 6f 6e 73 74 20 63 68  pVfs,.  const ch
22f80 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20 73 71 6c  ar *zName,.  sql
22f90 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65  ite3_file *pFile
22fa0 2c 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 0a 20  ,.  int flags,. 
22fb0 20 69 6e 74 20 2a 70 4f 75 74 46 6c 61 67 73 0a   int *pOutFlags.
22fc0 29 7b 0a 20 20 73 74 61 74 69 63 20 73 71 6c 69  ){.  static sqli
22fd0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 72  te3_io_methods r
22fe0 62 75 76 66 73 5f 69 6f 5f 6d 65 74 68 6f 64 73  buvfs_io_methods
22ff0 20 3d 20 7b 0a 20 20 20 20 32 2c 20 20 20 20 20   = {.    2,     
23000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23010 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69         /* iVersi
23020 6f 6e 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73  on */.    rbuVfs
23030 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
23040 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
23050 65 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 52  e */.    rbuVfsR
23060 65 61 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  ead,            
23070 20 20 20 20 20 20 20 2f 2a 20 78 52 65 61 64 20         /* xRead 
23080 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 57 72 69  */.    rbuVfsWri
23090 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
230a0 20 20 20 20 20 2f 2a 20 78 57 72 69 74 65 20 2a       /* xWrite *
230b0 2f 0a 20 20 20 20 72 62 75 56 66 73 54 72 75 6e  /.    rbuVfsTrun
230c0 63 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  cate,           
230d0 20 20 20 20 2f 2a 20 78 54 72 75 6e 63 61 74 65      /* xTruncate
230e0 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 53 79   */.    rbuVfsSy
230f0 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nc,             
23100 20 20 20 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a        /* xSync *
23110 2f 0a 20 20 20 20 72 62 75 56 66 73 46 69 6c 65  /.    rbuVfsFile
23120 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20  Size,           
23130 20 20 20 20 2f 2a 20 78 46 69 6c 65 53 69 7a 65      /* xFileSize
23140 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 4c 6f   */.    rbuVfsLo
23150 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
23160 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a        /* xLock *
23170 2f 0a 20 20 20 20 72 62 75 56 66 73 55 6e 6c 6f  /.    rbuVfsUnlo
23180 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
23190 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a      /* xUnlock *
231a0 2f 0a 20 20 20 20 72 62 75 56 66 73 43 68 65 63  /.    rbuVfsChec
231b0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20  kReservedLock,  
231c0 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73      /* xCheckRes
231d0 65 72 76 65 64 4c 6f 63 6b 20 2a 2f 0a 20 20 20  ervedLock */.   
231e0 20 72 62 75 56 66 73 46 69 6c 65 43 6f 6e 74 72   rbuVfsFileContr
231f0 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ol,            /
23200 2a 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a  * xFileControl *
23210 2f 0a 20 20 20 20 72 62 75 56 66 73 53 65 63 74  /.    rbuVfsSect
23220 6f 72 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20  orSize,         
23230 20 20 20 20 2f 2a 20 78 53 65 63 74 6f 72 53 69      /* xSectorSi
23240 7a 65 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73  ze */.    rbuVfs
23250 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
23260 73 74 69 63 73 2c 20 20 2f 2a 20 78 44 65 76 69  stics,  /* xDevi
23270 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
23280 73 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 53  s */.    rbuVfsS
23290 68 6d 4d 61 70 2c 20 20 20 20 20 20 20 20 20 20  hmMap,          
232a0 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61         /* xShmMa
232b0 70 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 53  p */.    rbuVfsS
232c0 68 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  hmLock,         
232d0 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4c 6f         /* xShmLo
232e0 63 6b 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73  ck */.    rbuVfs
232f0 53 68 6d 42 61 72 72 69 65 72 2c 20 20 20 20 20  ShmBarrier,     
23300 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 42          /* xShmB
23310 61 72 72 69 65 72 20 2a 2f 0a 20 20 20 20 72 62  arrier */.    rb
23320 75 56 66 73 53 68 6d 55 6e 6d 61 70 2c 20 20 20  uVfsShmUnmap,   
23330 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
23340 53 68 6d 55 6e 6d 61 70 20 2a 2f 0a 20 20 20 20  ShmUnmap */.    
23350 30 2c 20 30 20 20 20 20 20 20 20 20 20 20 20 20  0, 0            
23360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23370 20 78 46 65 74 63 68 2c 20 78 55 6e 66 65 74 63   xFetch, xUnfetc
23380 68 20 2a 2f 0a 20 20 7d 3b 0a 20 20 72 62 75 5f  h */.  };.  rbu_
23390 76 66 73 20 2a 70 52 62 75 56 66 73 20 3d 20 28  vfs *pRbuVfs = (
233a0 72 62 75 5f 76 66 73 2a 29 70 56 66 73 3b 0a 20  rbu_vfs*)pVfs;. 
233b0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 52   sqlite3_vfs *pR
233c0 65 61 6c 56 66 73 20 3d 20 70 52 62 75 56 66 73  ealVfs = pRbuVfs
233d0 2d 3e 70 52 65 61 6c 56 66 73 3b 0a 20 20 72 62  ->pRealVfs;.  rb
233e0 75 5f 66 69 6c 65 20 2a 70 46 64 20 3d 20 28 72  u_file *pFd = (r
233f0 62 75 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65 3b  bu_file *)pFile;
23400 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
23410 54 45 5f 4f 4b 3b 0a 20 20 63 6f 6e 73 74 20 63  TE_OK;.  const c
23420 68 61 72 20 2a 7a 4f 70 65 6e 20 3d 20 7a 4e 61  har *zOpen = zNa
23430 6d 65 3b 0a 20 20 69 6e 74 20 6f 66 6c 61 67 73  me;.  int oflags
23440 20 3d 20 66 6c 61 67 73 3b 0a 0a 20 20 6d 65 6d   = flags;..  mem
23450 73 65 74 28 70 46 64 2c 20 30 2c 20 73 69 7a 65  set(pFd, 0, size
23460 6f 66 28 72 62 75 5f 66 69 6c 65 29 29 3b 0a 20  of(rbu_file));. 
23470 20 70 46 64 2d 3e 70 52 65 61 6c 20 3d 20 28 73   pFd->pReal = (s
23480 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 26 70 46  qlite3_file*)&pF
23490 64 5b 31 5d 3b 0a 20 20 70 46 64 2d 3e 70 52 62  d[1];.  pFd->pRb
234a0 75 56 66 73 20 3d 20 70 52 62 75 56 66 73 3b 0a  uVfs = pRbuVfs;.
234b0 20 20 70 46 64 2d 3e 6f 70 65 6e 46 6c 61 67 73    pFd->openFlags
234c0 20 3d 20 66 6c 61 67 73 3b 0a 20 20 69 66 28 20   = flags;.  if( 
234d0 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 69 66 28  zName ){.    if(
234e0 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f   flags & SQLITE_
234f0 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 7b 0a  OPEN_MAIN_DB ){.
23500 20 20 20 20 20 20 2f 2a 20 41 20 6d 61 69 6e 20        /* A main 
23510 64 61 74 61 62 61 73 65 20 68 61 73 20 6a 75 73  database has jus
23520 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e 20 54  t been opened. T
23530 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
23540 63 6b 20 73 65 74 73 0a 20 20 20 20 20 20 2a 2a  ck sets.      **
23550 20 28 70 46 64 2d 3e 7a 57 61 6c 29 20 74 6f 20   (pFd->zWal) to 
23560 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65  point to a buffe
23570 72 20 6f 77 6e 65 64 20 62 79 20 53 51 4c 69 74  r owned by SQLit
23580 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a  e that contains.
23590 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6e 61 6d        ** the nam
235a0 65 20 6f 66 20 74 68 65 20 2a 2d 77 61 6c 20 66  e of the *-wal f
235b0 69 6c 65 20 74 68 69 73 20 64 62 20 63 6f 6e 6e  ile this db conn
235c0 65 63 74 69 6f 6e 20 77 69 6c 6c 20 75 73 65 2e  ection will use.
235d0 20 53 51 4c 69 74 65 0a 20 20 20 20 20 20 2a 2a   SQLite.      **
235e0 20 68 61 70 70 65 6e 73 20 74 6f 20 70 61 73 73   happens to pass
235f0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
23600 69 73 20 62 75 66 66 65 72 20 77 68 65 6e 20 75  is buffer when u
23610 73 69 6e 67 20 78 41 63 63 65 73 73 28 29 0a 20  sing xAccess(). 
23620 20 20 20 20 20 2a 2a 20 6f 72 20 78 4f 70 65 6e       ** or xOpen
23630 28 29 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e  () to operate on
23640 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 2e   the *-wal file.
23650 20 20 2a 2f 0a 20 20 20 20 20 20 70 46 64 2d 3e    */.      pFd->
23660 7a 57 61 6c 20 3d 20 72 62 75 4d 61 69 6e 54 6f  zWal = rbuMainTo
23670 57 61 6c 28 7a 4e 61 6d 65 2c 20 66 6c 61 67 73  Wal(zName, flags
23680 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73  );.    }.    els
23690 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51  e if( flags & SQ
236a0 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 29 7b  LITE_OPEN_WAL ){
236b0 0a 20 20 20 20 20 20 72 62 75 5f 66 69 6c 65 20  .      rbu_file 
236c0 2a 70 44 62 20 3d 20 72 62 75 46 69 6e 64 4d 61  *pDb = rbuFindMa
236d0 69 6e 64 62 28 70 52 62 75 56 66 73 2c 20 7a 4e  indb(pRbuVfs, zN
236e0 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ame);.      if( 
236f0 70 44 62 20 29 7b 0a 20 20 20 20 20 20 20 20 69  pDb ){.        i
23700 66 28 20 70 44 62 2d 3e 70 52 62 75 20 26 26 20  f( pDb->pRbu && 
23710 70 44 62 2d 3e 70 52 62 75 2d 3e 65 53 74 61 67  pDb->pRbu->eStag
23720 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c  e==RBU_STAGE_OAL
23730 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
23740 20 54 68 69 73 20 63 61 6c 6c 20 69 73 20 74 6f   This call is to
23750 20 6f 70 65 6e 20 61 20 2a 2d 77 61 6c 20 66 69   open a *-wal fi
23760 6c 65 2e 20 49 6e 74 65 61 64 2c 20 6f 70 65 6e  le. Intead, open
23770 20 74 68 65 20 2a 2d 6f 61 6c 2e 20 54 68 69 73   the *-oal. This
23780 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  .          ** co
23790 64 65 20 65 6e 73 75 72 65 73 20 74 68 61 74 20  de ensures that 
237a0 74 68 65 20 73 74 72 69 6e 67 20 70 61 73 73 65  the string passe
237b0 64 20 74 6f 20 78 4f 70 65 6e 28 29 20 69 73 20  d to xOpen() is 
237c0 74 65 72 6d 69 6e 61 74 65 64 20 62 79 20 61 0a  terminated by a.
237d0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61 69            ** pai
237e0 72 20 6f 66 20 27 5c 30 27 20 62 79 74 65 73 20  r of '\0' bytes 
237f0 69 6e 20 63 61 73 65 20 74 68 65 20 56 46 53 20  in case the VFS 
23800 61 74 74 65 6d 70 74 73 20 74 6f 20 65 78 74 72  attempts to extr
23810 61 63 74 20 61 20 55 52 49 20 0a 20 20 20 20 20  act a URI .     
23820 20 20 20 20 20 2a 2a 20 70 61 72 61 6d 65 74 65       ** paramete
23830 72 20 66 72 6f 6d 20 69 74 2e 20 20 2a 2f 0a 20  r from it.  */. 
23840 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63           const c
23850 68 61 72 20 2a 7a 42 61 73 65 20 3d 20 7a 4e 61  har *zBase = zNa
23860 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 73 69  me;.          si
23870 7a 65 5f 74 20 6e 43 6f 70 79 3b 0a 20 20 20 20  ze_t nCopy;.    
23880 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 70        char *zCop
23890 79 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  y;.          if(
238a0 20 72 62 75 49 73 56 61 63 75 75 6d 28 70 44 62   rbuIsVacuum(pDb
238b0 2d 3e 70 52 62 75 29 20 29 7b 0a 20 20 20 20 20  ->pRbu) ){.     
238c0 20 20 20 20 20 20 20 7a 42 61 73 65 20 3d 20 73         zBase = s
238d0 71 6c 69 74 65 33 5f 64 62 5f 66 69 6c 65 6e 61  qlite3_db_filena
238e0 6d 65 28 70 44 62 2d 3e 70 52 62 75 2d 3e 64 62  me(pDb->pRbu->db
238f0 52 62 75 2c 20 22 6d 61 69 6e 22 29 3b 0a 20 20  Rbu, "main");.  
23900 20 20 20 20 20 20 20 20 20 20 7a 42 61 73 65 20            zBase 
23910 3d 20 72 62 75 4d 61 69 6e 54 6f 57 61 6c 28 7a  = rbuMainToWal(z
23920 42 61 73 65 2c 20 53 51 4c 49 54 45 5f 4f 50 45  Base, SQLITE_OPE
23930 4e 5f 55 52 49 29 3b 0a 20 20 20 20 20 20 20 20  N_URI);.        
23940 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6e 43    }.          nC
23950 6f 70 79 20 3d 20 73 74 72 6c 65 6e 28 7a 42 61  opy = strlen(zBa
23960 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  se);.          z
23970 43 6f 70 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d  Copy = sqlite3_m
23980 61 6c 6c 6f 63 36 34 28 6e 43 6f 70 79 2b 32 29  alloc64(nCopy+2)
23990 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
239a0 7a 43 6f 70 79 20 29 7b 0a 20 20 20 20 20 20 20  zCopy ){.       
239b0 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 43 6f 70       memcpy(zCop
239c0 79 2c 20 7a 42 61 73 65 2c 20 6e 43 6f 70 79 29  y, zBase, nCopy)
239d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 43  ;.            zC
239e0 6f 70 79 5b 6e 43 6f 70 79 2d 33 5d 20 3d 20 27  opy[nCopy-3] = '
239f0 6f 27 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  o';.            
23a00 7a 43 6f 70 79 5b 6e 43 6f 70 79 5d 20 3d 20 27  zCopy[nCopy] = '
23a10 5c 30 27 3b 0a 20 20 20 20 20 20 20 20 20 20 20  \0';.           
23a20 20 7a 43 6f 70 79 5b 6e 43 6f 70 79 2b 31 5d 20   zCopy[nCopy+1] 
23a30 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20  = '\0';.        
23a40 20 20 20 20 7a 4f 70 65 6e 20 3d 20 28 63 6f 6e      zOpen = (con
23a50 73 74 20 63 68 61 72 2a 29 28 70 46 64 2d 3e 7a  st char*)(pFd->z
23a60 44 65 6c 20 3d 20 7a 43 6f 70 79 29 3b 0a 20 20  Del = zCopy);.  
23a70 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
23a80 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
23a90 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
23aa0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
23ab0 20 20 20 20 70 46 64 2d 3e 70 52 62 75 20 3d 20      pFd->pRbu = 
23ac0 70 44 62 2d 3e 70 52 62 75 3b 0a 20 20 20 20 20  pDb->pRbu;.     
23ad0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 44 62     }.        pDb
23ae0 2d 3e 70 57 61 6c 46 64 20 3d 20 70 46 64 3b 0a  ->pWalFd = pFd;.
23af0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
23b00 7d 0a 0a 20 20 69 66 28 20 6f 66 6c 61 67 73 20  }..  if( oflags 
23b10 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  & SQLITE_OPEN_MA
23b20 49 4e 5f 44 42 20 0a 20 20 20 26 26 20 73 71 6c  IN_DB .   && sql
23b30 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e  ite3_uri_boolean
23b40 28 7a 4e 61 6d 65 2c 20 22 72 62 75 5f 6d 65 6d  (zName, "rbu_mem
23b50 6f 72 79 22 2c 20 30 29 20 0a 20 20 29 7b 0a 20  ory", 0) .  ){. 
23b60 20 20 20 61 73 73 65 72 74 28 20 6f 66 6c 61 67     assert( oflag
23b70 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
23b80 4d 41 49 4e 5f 44 42 20 29 3b 0a 20 20 20 20 6f  MAIN_DB );.    o
23b90 66 6c 61 67 73 20 3d 20 20 53 51 4c 49 54 45 5f  flags =  SQLITE_
23ba0 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20 7c 20 53  OPEN_TEMP_DB | S
23bb0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
23bc0 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  RITE | SQLITE_OP
23bd0 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20 20 20  EN_CREATE |.    
23be0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
23bf0 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20  _OPEN_EXCLUSIVE 
23c00 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45  | SQLITE_OPEN_DE
23c10 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 20  LETEONCLOSE;.   
23c20 20 7a 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a   zOpen = 0;.  }.
23c30 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
23c40 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
23c50 20 70 52 65 61 6c 56 66 73 2d 3e 78 4f 70 65 6e   pRealVfs->xOpen
23c60 28 70 52 65 61 6c 56 66 73 2c 20 7a 4f 70 65 6e  (pRealVfs, zOpen
23c70 2c 20 70 46 64 2d 3e 70 52 65 61 6c 2c 20 6f 66  , pFd->pReal, of
23c80 6c 61 67 73 2c 20 70 4f 75 74 46 6c 61 67 73 29  lags, pOutFlags)
23c90 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 46 64 2d  ;.  }.  if( pFd-
23ca0 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73  >pReal->pMethods
23cb0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 78   ){.    /* The x
23cc0 4f 70 65 6e 28 29 20 6f 70 65 72 61 74 69 6f 6e  Open() operation
23cd0 20 68 61 73 20 73 75 63 63 65 65 64 65 64 2e 20   has succeeded. 
23ce0 53 65 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f  Set the sqlite3_
23cf0 66 69 6c 65 2e 70 4d 65 74 68 6f 64 73 0a 20 20  file.pMethods.  
23d00 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 61 6e 64    ** pointer and
23d10 2c 20 69 66 20 74 68 65 20 66 69 6c 65 20 69 73  , if the file is
23d20 20 61 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65   a main database
23d30 20 66 69 6c 65 2c 20 6c 69 6e 6b 20 69 74 20 69   file, link it i
23d40 6e 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 6d  nto the.    ** m
23d50 75 74 65 78 20 70 72 6f 74 65 63 74 65 64 20 6c  utex protected l
23d60 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 61 6c  inked list of al
23d70 6c 20 73 75 63 68 20 66 69 6c 65 73 2e 20 20 2a  l such files.  *
23d80 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70 4d 65  /.    pFile->pMe
23d90 74 68 6f 64 73 20 3d 20 26 72 62 75 76 66 73 5f  thods = &rbuvfs_
23da0 69 6f 5f 6d 65 74 68 6f 64 73 3b 0a 20 20 20 20  io_methods;.    
23db0 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49  if( flags & SQLI
23dc0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20  TE_OPEN_MAIN_DB 
23dd0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
23de0 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 52 62  _mutex_enter(pRb
23df0 75 56 66 73 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  uVfs->mutex);.  
23e00 20 20 20 20 70 46 64 2d 3e 70 4d 61 69 6e 4e 65      pFd->pMainNe
23e10 78 74 20 3d 20 70 52 62 75 56 66 73 2d 3e 70 4d  xt = pRbuVfs->pM
23e20 61 69 6e 3b 0a 20 20 20 20 20 20 70 52 62 75 56  ain;.      pRbuV
23e30 66 73 2d 3e 70 4d 61 69 6e 20 3d 20 70 46 64 3b  fs->pMain = pFd;
23e40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
23e50 75 74 65 78 5f 6c 65 61 76 65 28 70 52 62 75 56  utex_leave(pRbuV
23e60 66 73 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20  fs->mutex);.    
23e70 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  }.  }else{.    s
23e80 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46 64 2d  qlite3_free(pFd-
23e90 3e 7a 44 65 6c 29 3b 0a 20 20 7d 0a 0a 20 20 72  >zDel);.  }..  r
23ea0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
23eb0 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 66 69  ** Delete the fi
23ec0 6c 65 20 6c 6f 63 61 74 65 64 20 61 74 20 7a 50  le located at zP
23ed0 61 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ath..*/.static i
23ee0 6e 74 20 72 62 75 56 66 73 44 65 6c 65 74 65 28  nt rbuVfsDelete(
23ef0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
23f00 73 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  s, const char *z
23f10 50 61 74 68 2c 20 69 6e 74 20 64 69 72 53 79 6e  Path, int dirSyn
23f20 63 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  c){.  sqlite3_vf
23f30 73 20 2a 70 52 65 61 6c 56 66 73 20 3d 20 28 28  s *pRealVfs = ((
23f40 72 62 75 5f 76 66 73 2a 29 70 56 66 73 29 2d 3e  rbu_vfs*)pVfs)->
23f50 70 52 65 61 6c 56 66 73 3b 0a 20 20 72 65 74 75  pRealVfs;.  retu
23f60 72 6e 20 70 52 65 61 6c 56 66 73 2d 3e 78 44 65  rn pRealVfs->xDe
23f70 6c 65 74 65 28 70 52 65 61 6c 56 66 73 2c 20 7a  lete(pRealVfs, z
23f80 50 61 74 68 2c 20 64 69 72 53 79 6e 63 29 3b 0a  Path, dirSync);.
23f90 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 66 6f  }../*.** Test fo
23fa0 72 20 61 63 63 65 73 73 20 70 65 72 6d 69 73 73  r access permiss
23fb0 69 6f 6e 73 2e 20 52 65 74 75 72 6e 20 74 72 75  ions. Return tru
23fc0 65 20 69 66 20 74 68 65 20 72 65 71 75 65 73 74  e if the request
23fd0 65 64 20 70 65 72 6d 69 73 73 69 6f 6e 0a 2a 2a  ed permission.**
23fe0 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f   is available, o
23ff0 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73  r false otherwis
24000 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
24010 20 72 62 75 56 66 73 41 63 63 65 73 73 28 0a 20   rbuVfsAccess(. 
24020 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
24030 66 73 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61  fs, .  const cha
24040 72 20 2a 7a 50 61 74 68 2c 20 0a 20 20 69 6e 74  r *zPath, .  int
24050 20 66 6c 61 67 73 2c 20 0a 20 20 69 6e 74 20 2a   flags, .  int *
24060 70 52 65 73 4f 75 74 0a 29 7b 0a 20 20 72 62 75  pResOut.){.  rbu
24070 5f 76 66 73 20 2a 70 52 62 75 56 66 73 20 3d 20  _vfs *pRbuVfs = 
24080 28 72 62 75 5f 76 66 73 2a 29 70 56 66 73 3b 0a  (rbu_vfs*)pVfs;.
24090 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
240a0 52 65 61 6c 56 66 73 20 3d 20 70 52 62 75 56 66  RealVfs = pRbuVf
240b0 73 2d 3e 70 52 65 61 6c 56 66 73 3b 0a 20 20 69  s->pRealVfs;.  i
240c0 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 70  nt rc;..  rc = p
240d0 52 65 61 6c 56 66 73 2d 3e 78 41 63 63 65 73 73  RealVfs->xAccess
240e0 28 70 52 65 61 6c 56 66 73 2c 20 7a 50 61 74 68  (pRealVfs, zPath
240f0 2c 20 66 6c 61 67 73 2c 20 70 52 65 73 4f 75 74  , flags, pResOut
24100 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  );..  /* If this
24110 20 63 61 6c 6c 20 69 73 20 74 6f 20 63 68 65 63   call is to chec
24120 6b 20 69 66 20 61 20 2a 2d 77 61 6c 20 66 69 6c  k if a *-wal fil
24130 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
24140 68 20 61 6e 20 52 42 55 20 74 61 72 67 65 74 0a  h an RBU target.
24150 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f    ** database co
24160 6e 6e 65 63 74 69 6f 6e 20 65 78 69 73 74 73 2c  nnection exists,
24170 20 61 6e 64 20 74 68 65 20 52 42 55 20 75 70 64   and the RBU upd
24180 61 74 65 20 69 73 20 69 6e 20 52 42 55 5f 53 54  ate is in RBU_ST
24190 41 47 45 5f 4f 41 4c 2c 0a 20 20 2a 2a 20 74 68  AGE_OAL,.  ** th
241a0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 70 65 63  e following spec
241b0 69 61 6c 20 68 61 6e 64 6c 69 6e 67 20 69 73 20  ial handling is 
241c0 61 63 74 69 76 61 74 65 64 3a 0a 20 20 2a 2a 0a  activated:.  **.
241d0 20 20 2a 2a 20 20 20 61 29 20 69 66 20 74 68 65    **   a) if the
241e0 20 2a 2d 77 61 6c 20 66 69 6c 65 20 64 6f 65 73   *-wal file does
241f0 20 65 78 69 73 74 2c 20 72 65 74 75 72 6e 20 53   exist, return S
24200 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2e 20  QLITE_CANTOPEN. 
24210 54 68 69 73 0a 20 20 2a 2a 20 20 20 20 20 20 65  This.  **      e
24220 6e 73 75 72 65 73 20 74 68 61 74 20 74 68 65 20  nsures that the 
24230 52 42 55 20 65 78 74 65 6e 73 69 6f 6e 20 6e 65  RBU extension ne
24240 76 65 72 20 74 72 69 65 73 20 74 6f 20 75 70 64  ver tries to upd
24250 61 74 65 20 61 20 64 61 74 61 62 61 73 65 0a 20  ate a database. 
24260 20 2a 2a 20 20 20 20 20 20 69 6e 20 77 61 6c 20   **      in wal 
24270 6d 6f 64 65 2c 20 65 76 65 6e 20 69 66 20 74 68  mode, even if th
24280 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20  e first page of 
24290 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
242a0 65 20 68 61 73 0a 20 20 2a 2a 20 20 20 20 20 20  e has.  **      
242b0 62 65 65 6e 20 64 61 6d 61 67 65 64 2e 20 0a 20  been damaged. . 
242c0 20 2a 2a 0a 20 20 2a 2a 20 20 20 62 29 20 69 66   **.  **   b) if
242d0 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20   the *-wal file 
242e0 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20  does not exist, 
242f0 63 6c 61 69 6d 20 74 68 61 74 20 69 74 20 64 6f  claim that it do
24300 65 73 20 61 6e 79 77 61 79 2c 0a 20 20 2a 2a 20  es anyway,.  ** 
24310 20 20 20 20 20 63 61 75 73 69 6e 67 20 53 51 4c       causing SQL
24320 69 74 65 20 74 6f 20 63 61 6c 6c 20 78 4f 70 65  ite to call xOpe
24330 6e 28 29 20 74 6f 20 6f 70 65 6e 20 69 74 2e 20  n() to open it. 
24340 54 68 69 73 20 63 61 6c 6c 20 77 69 6c 6c 20 61  This call will a
24350 6c 73 6f 0a 20 20 2a 2a 20 20 20 20 20 20 62 65  lso.  **      be
24360 20 69 6e 74 65 72 63 65 70 74 65 64 20 28 73 65   intercepted (se
24370 65 20 74 68 65 20 72 62 75 56 66 73 4f 70 65 6e  e the rbuVfsOpen
24380 28 29 20 66 75 6e 63 74 69 6f 6e 29 20 61 6e 64  () function) and
24390 20 74 68 65 20 2a 2d 6f 61 6c 0a 20 20 2a 2a 20   the *-oal.  ** 
243a0 20 20 20 20 20 66 69 6c 65 20 6f 70 65 6e 65 64       file opened
243b0 20 69 6e 73 74 65 61 64 2e 0a 20 20 2a 2f 0a 20   instead..  */. 
243c0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
243d0 4f 4b 20 26 26 20 66 6c 61 67 73 3d 3d 53 51 4c  OK && flags==SQL
243e0 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
243f0 53 20 29 7b 0a 20 20 20 20 72 62 75 5f 66 69 6c  S ){.    rbu_fil
24400 65 20 2a 70 44 62 20 3d 20 72 62 75 46 69 6e 64  e *pDb = rbuFind
24410 4d 61 69 6e 64 62 28 70 52 62 75 56 66 73 2c 20  Maindb(pRbuVfs, 
24420 7a 50 61 74 68 29 3b 0a 20 20 20 20 69 66 28 20  zPath);.    if( 
24430 70 44 62 20 26 26 20 70 44 62 2d 3e 70 52 62 75  pDb && pDb->pRbu
24440 20 26 26 20 70 44 62 2d 3e 70 52 62 75 2d 3e 65   && pDb->pRbu->e
24450 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45  Stage==RBU_STAGE
24460 5f 4f 41 4c 20 29 7b 0a 20 20 20 20 20 20 69 66  _OAL ){.      if
24470 28 20 2a 70 52 65 73 4f 75 74 20 29 7b 0a 20 20  ( *pResOut ){.  
24480 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
24490 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 20  E_CANTOPEN;.    
244a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
244b0 20 2a 70 52 65 73 4f 75 74 20 3d 20 31 3b 0a 20   *pResOut = 1;. 
244c0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
244d0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
244e0 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 75 6c 61 74 65  ../*.** Populate
244f0 20 62 75 66 66 65 72 20 7a 4f 75 74 20 77 69 74   buffer zOut wit
24500 68 20 74 68 65 20 66 75 6c 6c 20 63 61 6e 6f 6e  h the full canon
24510 69 63 61 6c 20 70 61 74 68 6e 61 6d 65 20 63 6f  ical pathname co
24520 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74  rresponding.** t
24530 6f 20 74 68 65 20 70 61 74 68 6e 61 6d 65 20 69  o the pathname i
24540 6e 20 7a 50 61 74 68 2e 20 7a 4f 75 74 20 69 73  n zPath. zOut is
24550 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 70   guaranteed to p
24560 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72  oint to a buffer
24570 0a 2a 2a 20 6f 66 20 61 74 20 6c 65 61 73 74 20  .** of at least 
24580 28 44 45 56 53 59 4d 5f 4d 41 58 5f 50 41 54 48  (DEVSYM_MAX_PATH
24590 4e 41 4d 45 2b 31 29 20 62 79 74 65 73 2e 0a 2a  NAME+1) bytes..*
245a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62 75  /.static int rbu
245b0 56 66 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28  VfsFullPathname(
245c0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
245d0 70 56 66 73 2c 20 0a 20 20 63 6f 6e 73 74 20 63  pVfs, .  const c
245e0 68 61 72 20 2a 7a 50 61 74 68 2c 20 0a 20 20 69  har *zPath, .  i
245f0 6e 74 20 6e 4f 75 74 2c 20 0a 20 20 63 68 61 72  nt nOut, .  char
24600 20 2a 7a 4f 75 74 0a 29 7b 0a 20 20 73 71 6c 69   *zOut.){.  sqli
24610 74 65 33 5f 76 66 73 20 2a 70 52 65 61 6c 56 66  te3_vfs *pRealVf
24620 73 20 3d 20 28 28 72 62 75 5f 76 66 73 2a 29 70  s = ((rbu_vfs*)p
24630 56 66 73 29 2d 3e 70 52 65 61 6c 56 66 73 3b 0a  Vfs)->pRealVfs;.
24640 20 20 72 65 74 75 72 6e 20 70 52 65 61 6c 56 66    return pRealVf
24650 73 2d 3e 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65  s->xFullPathname
24660 28 70 52 65 61 6c 56 66 73 2c 20 7a 50 61 74 68  (pRealVfs, zPath
24670 2c 20 6e 4f 75 74 2c 20 7a 4f 75 74 29 3b 0a 7d  , nOut, zOut);.}
24680 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
24690 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e  _OMIT_LOAD_EXTEN
246a0 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  SION./*.** Open 
246b0 74 68 65 20 64 79 6e 61 6d 69 63 20 6c 69 62 72  the dynamic libr
246c0 61 72 79 20 6c 6f 63 61 74 65 64 20 61 74 20 7a  ary located at z
246d0 50 61 74 68 20 61 6e 64 20 72 65 74 75 72 6e 20  Path and return 
246e0 61 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61  a handle..*/.sta
246f0 74 69 63 20 76 6f 69 64 20 2a 72 62 75 56 66 73  tic void *rbuVfs
24700 44 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76  DlOpen(sqlite3_v
24710 66 73 20 2a 70 56 66 73 2c 20 63 6f 6e 73 74 20  fs *pVfs, const 
24720 63 68 61 72 20 2a 7a 50 61 74 68 29 7b 0a 20 20  char *zPath){.  
24730 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 52 65  sqlite3_vfs *pRe
24740 61 6c 56 66 73 20 3d 20 28 28 72 62 75 5f 76 66  alVfs = ((rbu_vf
24750 73 2a 29 70 56 66 73 29 2d 3e 70 52 65 61 6c 56  s*)pVfs)->pRealV
24760 66 73 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65  fs;.  return pRe
24770 61 6c 56 66 73 2d 3e 78 44 6c 4f 70 65 6e 28 70  alVfs->xDlOpen(p
24780 52 65 61 6c 56 66 73 2c 20 7a 50 61 74 68 29 3b  RealVfs, zPath);
24790 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 75 6c 61  .}../*.** Popula
247a0 74 65 20 74 68 65 20 62 75 66 66 65 72 20 7a 45  te the buffer zE
247b0 72 72 4d 73 67 20 28 73 69 7a 65 20 6e 42 79 74  rrMsg (size nByt
247c0 65 20 62 79 74 65 73 29 20 77 69 74 68 20 61 20  e bytes) with a 
247d0 68 75 6d 61 6e 20 72 65 61 64 61 62 6c 65 0a 2a  human readable.*
247e0 2a 20 75 74 66 2d 38 20 73 74 72 69 6e 67 20 64  * utf-8 string d
247f0 65 73 63 72 69 62 69 6e 67 20 74 68 65 20 6d 6f  escribing the mo
24800 73 74 20 72 65 63 65 6e 74 20 65 72 72 6f 72 20  st recent error 
24810 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 73 73 6f  encountered asso
24820 63 69 61 74 65 64 20 0a 2a 2a 20 77 69 74 68 20  ciated .** with 
24830 64 79 6e 61 6d 69 63 20 6c 69 62 72 61 72 69 65  dynamic librarie
24840 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
24850 64 20 72 62 75 56 66 73 44 6c 45 72 72 6f 72 28  d rbuVfsDlError(
24860 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
24870 73 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 63 68  s, int nByte, ch
24880 61 72 20 2a 7a 45 72 72 4d 73 67 29 7b 0a 20 20  ar *zErrMsg){.  
24890 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 52 65  sqlite3_vfs *pRe
248a0 61 6c 56 66 73 20 3d 20 28 28 72 62 75 5f 76 66  alVfs = ((rbu_vf
248b0 73 2a 29 70 56 66 73 29 2d 3e 70 52 65 61 6c 56  s*)pVfs)->pRealV
248c0 66 73 3b 0a 20 20 70 52 65 61 6c 56 66 73 2d 3e  fs;.  pRealVfs->
248d0 78 44 6c 45 72 72 6f 72 28 70 52 65 61 6c 56 66  xDlError(pRealVf
248e0 73 2c 20 6e 42 79 74 65 2c 20 7a 45 72 72 4d 73  s, nByte, zErrMs
248f0 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  g);.}../*.** Ret
24900 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
24910 20 74 68 65 20 73 79 6d 62 6f 6c 20 7a 53 79 6d   the symbol zSym
24920 62 6f 6c 20 69 6e 20 74 68 65 20 64 79 6e 61 6d  bol in the dynam
24930 69 63 20 6c 69 62 72 61 72 79 20 70 48 61 6e 64  ic library pHand
24940 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  le..*/.static vo
24950 69 64 20 28 2a 72 62 75 56 66 73 44 6c 53 79 6d  id (*rbuVfsDlSym
24960 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
24970 2a 70 56 66 73 2c 20 0a 20 20 76 6f 69 64 20 2a  *pVfs, .  void *
24980 70 41 72 67 2c 20 0a 20 20 63 6f 6e 73 74 20 63  pArg, .  const c
24990 68 61 72 20 2a 7a 53 79 6d 0a 29 29 28 76 6f 69  har *zSym.))(voi
249a0 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  d){.  sqlite3_vf
249b0 73 20 2a 70 52 65 61 6c 56 66 73 20 3d 20 28 28  s *pRealVfs = ((
249c0 72 62 75 5f 76 66 73 2a 29 70 56 66 73 29 2d 3e  rbu_vfs*)pVfs)->
249d0 70 52 65 61 6c 56 66 73 3b 0a 20 20 72 65 74 75  pRealVfs;.  retu
249e0 72 6e 20 70 52 65 61 6c 56 66 73 2d 3e 78 44 6c  rn pRealVfs->xDl
249f0 53 79 6d 28 70 52 65 61 6c 56 66 73 2c 20 70 41  Sym(pRealVfs, pA
24a00 72 67 2c 20 7a 53 79 6d 29 3b 0a 7d 0a 0a 2f 2a  rg, zSym);.}../*
24a10 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 64 79  .** Close the dy
24a20 6e 61 6d 69 63 20 6c 69 62 72 61 72 79 20 68 61  namic library ha
24a30 6e 64 6c 65 20 70 48 61 6e 64 6c 65 2e 0a 2a 2f  ndle pHandle..*/
24a40 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75  .static void rbu
24a50 56 66 73 44 6c 43 6c 6f 73 65 28 73 71 6c 69 74  VfsDlClose(sqlit
24a60 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 76 6f  e3_vfs *pVfs, vo
24a70 69 64 20 2a 70 48 61 6e 64 6c 65 29 7b 0a 20 20  id *pHandle){.  
24a80 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 52 65  sqlite3_vfs *pRe
24a90 61 6c 56 66 73 20 3d 20 28 28 72 62 75 5f 76 66  alVfs = ((rbu_vf
24aa0 73 2a 29 70 56 66 73 29 2d 3e 70 52 65 61 6c 56  s*)pVfs)->pRealV
24ab0 66 73 3b 0a 20 20 70 52 65 61 6c 56 66 73 2d 3e  fs;.  pRealVfs->
24ac0 78 44 6c 43 6c 6f 73 65 28 70 52 65 61 6c 56 66  xDlClose(pRealVf
24ad0 73 2c 20 70 48 61 6e 64 6c 65 29 3b 0a 7d 0a 23  s, pHandle);.}.#
24ae0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
24af0 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
24b00 49 4f 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 50 6f  ION */../*.** Po
24b10 70 75 6c 61 74 65 20 74 68 65 20 62 75 66 66 65  pulate the buffe
24b20 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  r pointed to by 
24b30 7a 42 75 66 4f 75 74 20 77 69 74 68 20 6e 42 79  zBufOut with nBy
24b40 74 65 20 62 79 74 65 73 20 6f 66 20 0a 2a 2a 20  te bytes of .** 
24b50 72 61 6e 64 6f 6d 20 64 61 74 61 2e 0a 2a 2f 0a  random data..*/.
24b60 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 56 66  static int rbuVf
24b70 73 52 61 6e 64 6f 6d 6e 65 73 73 28 73 71 6c 69  sRandomness(sqli
24b80 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69  te3_vfs *pVfs, i
24b90 6e 74 20 6e 42 79 74 65 2c 20 63 68 61 72 20 2a  nt nByte, char *
24ba0 7a 42 75 66 4f 75 74 29 7b 0a 20 20 73 71 6c 69  zBufOut){.  sqli
24bb0 74 65 33 5f 76 66 73 20 2a 70 52 65 61 6c 56 66  te3_vfs *pRealVf
24bc0 73 20 3d 20 28 28 72 62 75 5f 76 66 73 2a 29 70  s = ((rbu_vfs*)p
24bd0 56 66 73 29 2d 3e 70 52 65 61 6c 56 66 73 3b 0a  Vfs)->pRealVfs;.
24be0 20 20 72 65 74 75 72 6e 20 70 52 65 61 6c 56 66    return pRealVf
24bf0 73 2d 3e 78 52 61 6e 64 6f 6d 6e 65 73 73 28 70  s->xRandomness(p
24c00 52 65 61 6c 56 66 73 2c 20 6e 42 79 74 65 2c 20  RealVfs, nByte, 
24c10 7a 42 75 66 4f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a  zBufOut);.}../*.
24c20 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 6e 4d 69  ** Sleep for nMi
24c30 63 72 6f 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73  cro microseconds
24c40 2e 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  . Return the num
24c50 62 65 72 20 6f 66 20 6d 69 63 72 6f 73 65 63 6f  ber of microseco
24c60 6e 64 73 20 0a 2a 2a 20 61 63 74 75 61 6c 6c 79  nds .** actually
24c70 20 73 6c 65 70 74 2e 0a 2a 2f 0a 73 74 61 74 69   slept..*/.stati
24c80 63 20 69 6e 74 20 72 62 75 56 66 73 53 6c 65 65  c int rbuVfsSlee
24c90 70 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  p(sqlite3_vfs *p
24ca0 56 66 73 2c 20 69 6e 74 20 6e 4d 69 63 72 6f 29  Vfs, int nMicro)
24cb0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  {.  sqlite3_vfs 
24cc0 2a 70 52 65 61 6c 56 66 73 20 3d 20 28 28 72 62  *pRealVfs = ((rb
24cd0 75 5f 76 66 73 2a 29 70 56 66 73 29 2d 3e 70 52  u_vfs*)pVfs)->pR
24ce0 65 61 6c 56 66 73 3b 0a 20 20 72 65 74 75 72 6e  ealVfs;.  return
24cf0 20 70 52 65 61 6c 56 66 73 2d 3e 78 53 6c 65 65   pRealVfs->xSlee
24d00 70 28 70 52 65 61 6c 56 66 73 2c 20 6e 4d 69 63  p(pRealVfs, nMic
24d10 72 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ro);.}../*.** Re
24d20 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74  turn the current
24d30 20 74 69 6d 65 20 61 73 20 61 20 4a 75 6c 69 61   time as a Julia
24d40 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 69 6e 20  n Day number in 
24d50 2a 70 54 69 6d 65 4f 75 74 2e 0a 2a 2f 0a 73 74  *pTimeOut..*/.st
24d60 61 74 69 63 20 69 6e 74 20 72 62 75 56 66 73 43  atic int rbuVfsC
24d70 75 72 72 65 6e 74 54 69 6d 65 28 73 71 6c 69 74  urrentTime(sqlit
24d80 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 64 6f  e3_vfs *pVfs, do
24d90 75 62 6c 65 20 2a 70 54 69 6d 65 4f 75 74 29 7b  uble *pTimeOut){
24da0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
24db0 70 52 65 61 6c 56 66 73 20 3d 20 28 28 72 62 75  pRealVfs = ((rbu
24dc0 5f 76 66 73 2a 29 70 56 66 73 29 2d 3e 70 52 65  _vfs*)pVfs)->pRe
24dd0 61 6c 56 66 73 3b 0a 20 20 72 65 74 75 72 6e 20  alVfs;.  return 
24de0 70 52 65 61 6c 56 66 73 2d 3e 78 43 75 72 72 65  pRealVfs->xCurre
24df0 6e 74 54 69 6d 65 28 70 52 65 61 6c 56 66 73 2c  ntTime(pRealVfs,
24e00 20 70 54 69 6d 65 4f 75 74 29 3b 0a 7d 0a 0a 2f   pTimeOut);.}../
24e10 2a 0a 2a 2a 20 4e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  *.** No-op..*/.s
24e20 74 61 74 69 63 20 69 6e 74 20 72 62 75 56 66 73  tatic int rbuVfs
24e30 47 65 74 4c 61 73 74 45 72 72 6f 72 28 73 71 6c  GetLastError(sql
24e40 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
24e50 69 6e 74 20 61 2c 20 63 68 61 72 20 2a 62 29 7b  int a, char *b){
24e60 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
24e70 2f 2a 0a 2a 2a 20 44 65 72 65 67 69 73 74 65 72  /*.** Deregister
24e80 20 61 6e 64 20 64 65 73 74 72 6f 79 20 61 6e 20   and destroy an 
24e90 52 42 55 20 76 66 73 20 63 72 65 61 74 65 64 20  RBU vfs created 
24ea0 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20 63 61  by an earlier ca
24eb0 6c 6c 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33  ll to.** sqlite3
24ec0 72 62 75 5f 63 72 65 61 74 65 5f 76 66 73 28 29  rbu_create_vfs()
24ed0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
24ee0 33 72 62 75 5f 64 65 73 74 72 6f 79 5f 76 66 73  3rbu_destroy_vfs
24ef0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61  (const char *zNa
24f00 6d 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  me){.  sqlite3_v
24f10 66 73 20 2a 70 56 66 73 20 3d 20 73 71 6c 69 74  fs *pVfs = sqlit
24f20 65 33 5f 76 66 73 5f 66 69 6e 64 28 7a 4e 61 6d  e3_vfs_find(zNam
24f30 65 29 3b 0a 20 20 69 66 28 20 70 56 66 73 20 26  e);.  if( pVfs &
24f40 26 20 70 56 66 73 2d 3e 78 4f 70 65 6e 3d 3d 72  & pVfs->xOpen==r
24f50 62 75 56 66 73 4f 70 65 6e 20 29 7b 0a 20 20 20  buVfsOpen ){.   
24f60 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66   sqlite3_mutex_f
24f70 72 65 65 28 28 28 72 62 75 5f 76 66 73 2a 29 70  ree(((rbu_vfs*)p
24f80 56 66 73 29 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Vfs)->mutex);.  
24f90 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 75 6e    sqlite3_vfs_un
24fa0 72 65 67 69 73 74 65 72 28 70 56 66 73 29 3b 0a  register(pVfs);.
24fb0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
24fc0 28 70 56 66 73 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  (pVfs);.  }.}../
24fd0 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 6e 20 52  *.** Create an R
24fe0 42 55 20 56 46 53 20 6e 61 6d 65 64 20 7a 4e 61  BU VFS named zNa
24ff0 6d 65 20 74 68 61 74 20 61 63 63 65 73 73 65 73  me that accesses
25000 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
25010 66 69 6c 65 2d 73 79 73 74 65 6d 0a 2a 2a 20 76  file-system.** v
25020 69 61 20 65 78 69 73 74 69 6e 67 20 56 46 53 20  ia existing VFS 
25030 7a 50 61 72 65 6e 74 2e 20 54 68 65 20 6e 65 77  zParent. The new
25040 20 6f 62 6a 65 63 74 20 69 73 20 72 65 67 69 73   object is regis
25050 74 65 72 65 64 20 61 73 20 61 20 6e 6f 6e 2d 64  tered as a non-d
25060 65 66 61 75 6c 74 0a 2a 2a 20 56 46 53 20 77 69  efault.** VFS wi
25070 74 68 20 53 51 4c 69 74 65 20 62 65 66 6f 72 65  th SQLite before
25080 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69   returning..*/.i
25090 6e 74 20 73 71 6c 69 74 65 33 72 62 75 5f 63 72  nt sqlite3rbu_cr
250a0 65 61 74 65 5f 76 66 73 28 63 6f 6e 73 74 20 63  eate_vfs(const c
250b0 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73  har *zName, cons
250c0 74 20 63 68 61 72 20 2a 7a 50 61 72 65 6e 74 29  t char *zParent)
250d0 7b 0a 0a 20 20 2f 2a 20 54 65 6d 70 6c 61 74 65  {..  /* Template
250e0 20 66 6f 72 20 56 46 53 20 2a 2f 0a 20 20 73 74   for VFS */.  st
250f0 61 74 69 63 20 73 71 6c 69 74 65 33 5f 76 66 73  atic sqlite3_vfs
25100 20 76 66 73 5f 74 65 6d 70 6c 61 74 65 20 3d 20   vfs_template = 
25110 7b 0a 20 20 20 20 31 2c 20 20 20 20 20 20 20 20  {.    1,        
25120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25130 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20      /* iVersion 
25140 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20  */.    0,       
25150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25160 20 20 20 20 20 2f 2a 20 73 7a 4f 73 46 69 6c 65       /* szOsFile
25170 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20   */.    0,      
25180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25190 20 20 20 20 20 20 2f 2a 20 6d 78 50 61 74 68 6e        /* mxPathn
251a0 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20  ame */.    0,   
251b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
251c0 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 78           /* pNex
251d0 74 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20  t */.    0,     
251e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
251f0 20 20 20 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20         /* zName 
25200 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20  */.    0,       
25210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25220 20 20 20 20 20 2f 2a 20 70 41 70 70 44 61 74 61       /* pAppData
25230 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 4f 70   */.    rbuVfsOp
25240 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  en,             
25250 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2a        /* xOpen *
25260 2f 0a 20 20 20 20 72 62 75 56 66 73 44 65 6c 65  /.    rbuVfsDele
25270 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
25280 20 20 20 20 2f 2a 20 78 44 65 6c 65 74 65 20 2a      /* xDelete *
25290 2f 0a 20 20 20 20 72 62 75 56 66 73 41 63 63 65  /.    rbuVfsAcce
252a0 73 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ss,             
252b0 20 20 20 20 2f 2a 20 78 41 63 63 65 73 73 20 2a      /* xAccess *
252c0 2f 0a 20 20 20 20 72 62 75 56 66 73 46 75 6c 6c  /.    rbuVfsFull
252d0 50 61 74 68 6e 61 6d 65 2c 20 20 20 20 20 20 20  Pathname,       
252e0 20 20 20 20 2f 2a 20 78 46 75 6c 6c 50 61 74 68      /* xFullPath
252f0 6e 61 6d 65 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  name */..#ifndef
25300 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41   SQLITE_OMIT_LOA
25310 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 20 20  D_EXTENSION.    
25320 72 62 75 56 66 73 44 6c 4f 70 65 6e 2c 20 20 20  rbuVfsDlOpen,   
25330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25340 20 78 44 6c 4f 70 65 6e 20 2a 2f 0a 20 20 20 20   xDlOpen */.    
25350 72 62 75 56 66 73 44 6c 45 72 72 6f 72 2c 20 20  rbuVfsDlError,  
25360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25370 20 78 44 6c 45 72 72 6f 72 20 2a 2f 0a 20 20 20   xDlError */.   
25380 20 72 62 75 56 66 73 44 6c 53 79 6d 2c 20 20 20   rbuVfsDlSym,   
25390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
253a0 2a 20 78 44 6c 53 79 6d 20 2a 2f 0a 20 20 20 20  * xDlSym */.    
253b0 72 62 75 56 66 73 44 6c 43 6c 6f 73 65 2c 20 20  rbuVfsDlClose,  
253c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
253d0 20 78 44 6c 43 6c 6f 73 65 20 2a 2f 0a 23 65 6c   xDlClose */.#el
253e0 73 65 0a 20 20 20 20 30 2c 20 30 2c 20 30 2c 20  se.    0, 0, 0, 
253f0 30 2c 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 72  0,.#endif..    r
25400 62 75 56 66 73 52 61 6e 64 6f 6d 6e 65 73 73 2c  buVfsRandomness,
25410 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25420 78 52 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f 0a 20  xRandomness */. 
25430 20 20 20 72 62 75 56 66 73 53 6c 65 65 70 2c 20     rbuVfsSleep, 
25440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25450 20 2f 2a 20 78 53 6c 65 65 70 20 2a 2f 0a 20 20   /* xSleep */.  
25460 20 20 72 62 75 56 66 73 43 75 72 72 65 6e 74 54    rbuVfsCurrentT
25470 69 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ime,            
25480 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65 20  /* xCurrentTime 
25490 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 47 65 74  */.    rbuVfsGet
254a0 4c 61 73 74 45 72 72 6f 72 2c 20 20 20 20 20 20  LastError,      
254b0 20 20 20 20 20 2f 2a 20 78 47 65 74 4c 61 73 74       /* xGetLast
254c0 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20 30 2c 20  Error */.    0, 
254d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
254e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
254f0 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 20  urrentTimeInt64 
25500 28 76 65 72 73 69 6f 6e 20 32 29 20 2a 2f 0a 20  (version 2) */. 
25510 20 20 20 30 2c 20 30 2c 20 30 20 20 20 20 20 20     0, 0, 0      
25520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25530 20 2f 2a 20 55 6e 69 6d 70 6c 65 6d 65 6e 74 65   /* Unimplemente
25540 64 20 76 65 72 73 69 6f 6e 20 33 20 6d 65 74 68  d version 3 meth
25550 6f 64 73 20 2a 2f 0a 20 20 7d 3b 0a 0a 20 20 72  ods */.  };..  r
25560 62 75 5f 76 66 73 20 2a 70 4e 65 77 20 3d 20 30  bu_vfs *pNew = 0
25570 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
25580 2a 20 4e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65  * Newly allocate
25590 64 20 56 46 53 20 2a 2f 0a 20 20 69 6e 74 20 72  d VFS */.  int r
255a0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
255b0 20 73 69 7a 65 5f 74 20 6e 4e 61 6d 65 3b 0a 20   size_t nName;. 
255c0 20 73 69 7a 65 5f 74 20 6e 42 79 74 65 3b 0a 0a   size_t nByte;..
255d0 20 20 6e 4e 61 6d 65 20 3d 20 73 74 72 6c 65 6e    nName = strlen
255e0 28 7a 4e 61 6d 65 29 3b 0a 20 20 6e 42 79 74 65  (zName);.  nByte
255f0 20 3d 20 73 69 7a 65 6f 66 28 72 62 75 5f 76 66   = sizeof(rbu_vf
25600 73 29 20 2b 20 6e 4e 61 6d 65 20 2b 20 31 3b 0a  s) + nName + 1;.
25610 20 20 70 4e 65 77 20 3d 20 28 72 62 75 5f 76 66    pNew = (rbu_vf
25620 73 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  s*)sqlite3_mallo
25630 63 36 34 28 6e 42 79 74 65 29 3b 0a 20 20 69 66  c64(nByte);.  if
25640 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( pNew==0 ){.   
25650 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
25660 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  EM;.  }else{.   
25670 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 50   sqlite3_vfs *pP
25680 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20  arent;          
25690 20 2f 2a 20 50 61 72 65 6e 74 20 56 46 53 20 2a   /* Parent VFS *
256a0 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 4e 65  /.    memset(pNe
256b0 77 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a 20 20  w, 0, nByte);.  
256c0 20 20 70 50 61 72 65 6e 74 20 3d 20 73 71 6c 69    pParent = sqli
256d0 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 7a 50 61  te3_vfs_find(zPa
256e0 72 65 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 70  rent);.    if( p
256f0 50 61 72 65 6e 74 3d 3d 30 20 29 7b 0a 20 20 20  Parent==0 ){.   
25700 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
25710 4f 54 46 4f 55 4e 44 3b 0a 20 20 20 20 7d 65 6c  OTFOUND;.    }el
25720 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  se{.      char *
25730 7a 53 70 61 63 65 3b 0a 20 20 20 20 20 20 6d 65  zSpace;.      me
25740 6d 63 70 79 28 26 70 4e 65 77 2d 3e 62 61 73 65  mcpy(&pNew->base
25750 2c 20 26 76 66 73 5f 74 65 6d 70 6c 61 74 65 2c  , &vfs_template,
25760 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f   sizeof(sqlite3_
25770 76 66 73 29 29 3b 0a 20 20 20 20 20 20 70 4e 65  vfs));.      pNe
25780 77 2d 3e 62 61 73 65 2e 6d 78 50 61 74 68 6e 61  w->base.mxPathna
25790 6d 65 20 3d 20 70 50 61 72 65 6e 74 2d 3e 6d 78  me = pParent->mx
257a0 50 61 74 68 6e 61 6d 65 3b 0a 20 20 20 20 20 20  Pathname;.      
257b0 70 4e 65 77 2d 3e 62 61 73 65 2e 73 7a 4f 73 46  pNew->base.szOsF
257c0 69 6c 65 20 3d 20 73 69 7a 65 6f 66 28 72 62 75  ile = sizeof(rbu
257d0 5f 66 69 6c 65 29 20 2b 20 70 50 61 72 65 6e 74  _file) + pParent
257e0 2d 3e 73 7a 4f 73 46 69 6c 65 3b 0a 20 20 20 20  ->szOsFile;.    
257f0 20 20 70 4e 65 77 2d 3e 70 52 65 61 6c 56 66 73    pNew->pRealVfs
25800 20 3d 20 70 50 61 72 65 6e 74 3b 0a 20 20 20 20   = pParent;.    
25810 20 20 70 4e 65 77 2d 3e 62 61 73 65 2e 7a 4e 61    pNew->base.zNa
25820 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  me = (const char
25830 2a 29 28 7a 53 70 61 63 65 20 3d 20 28 63 68 61  *)(zSpace = (cha
25840 72 2a 29 26 70 4e 65 77 5b 31 5d 29 3b 0a 20 20  r*)&pNew[1]);.  
25850 20 20 20 20 6d 65 6d 63 70 79 28 7a 53 70 61 63      memcpy(zSpac
25860 65 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29  e, zName, nName)
25870 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f  ;..      /* Allo
25880 63 61 74 65 20 74 68 65 20 6d 75 74 65 78 20 61  cate the mutex a
25890 6e 64 20 72 65 67 69 73 74 65 72 20 74 68 65 20  nd register the 
258a0 6e 65 77 20 56 46 53 20 28 6e 6f 74 20 61 73 20  new VFS (not as 
258b0 74 68 65 20 64 65 66 61 75 6c 74 29 20 2a 2f 0a  the default) */.
258c0 20 20 20 20 20 20 70 4e 65 77 2d 3e 6d 75 74 65        pNew->mute
258d0 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  x = sqlite3_mute
258e0 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  x_alloc(SQLITE_M
258f0 55 54 45 58 5f 52 45 43 55 52 53 49 56 45 29 3b  UTEX_RECURSIVE);
25900 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d  .      if( pNew-
25910 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20  >mutex==0 ){.   
25920 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
25930 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65  _NOMEM;.      }e
25940 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
25950 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65  = sqlite3_vfs_re
25960 67 69 73 74 65 72 28 26 70 4e 65 77 2d 3e 62 61  gister(&pNew->ba
25970 73 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  se, 0);.      }.
25980 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72      }..    if( r
25990 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
259a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
259b0 74 65 78 5f 66 72 65 65 28 70 4e 65 77 2d 3e 6d  tex_free(pNew->m
259c0 75 74 65 78 29 3b 0a 20 20 20 20 20 20 73 71 6c  utex);.      sql
259d0 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b  ite3_free(pNew);
259e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
259f0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 2a  turn rc;.}.../**
25a00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25a10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25a20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25a30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25a40 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 23 65 6e 64 69  ********/..#endi
25a50 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
25a60 4c 49 54 45 5f 43 4f 52 45 29 20 7c 7c 20 64 65  LITE_CORE) || de
25a70 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
25a80 42 4c 45 5f 52 42 55 29 20 2a 2f 0a              BLE_RBU) */.