/ Hex Artifact Content
Login

Artifact a37a7dfb225c497171aa60120e81b884954361c7:


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 36 34 20 69 4f  t db */.  i64 iO
3670: 61 6c 53 7a 3b 0a 20 20 69 36 34 20 6e 50 68 61  alSz;.  i64 nPha
3680: 73 65 4f 6e 65 53 74 65 70 3b 0a 0a 20 20 2f 2a  seOneStep;..  /*
3690: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   The following s
36a0: 74 61 74 65 20 76 61 72 69 61 62 6c 65 73 20 61  tate variables a
36b0: 72 65 20 75 73 65 64 20 61 73 20 70 61 72 74 20  re used as part 
36c0: 6f 66 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74  of the increment
36d0: 61 6c 0a 20 20 2a 2a 20 63 68 65 63 6b 70 6f 69  al.  ** checkpoi
36e0: 6e 74 20 73 74 61 67 65 20 28 65 53 74 61 67 65  nt stage (eStage
36f0: 3d 3d 52 42 55 5f 53 54 41 47 45 5f 43 4b 50 54  ==RBU_STAGE_CKPT
3700: 29 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20  ). See comments 
3710: 73 75 72 72 6f 75 6e 64 69 6e 67 0a 20 20 2a 2a  surrounding.  **
3720: 20 66 75 6e 63 74 69 6f 6e 20 72 62 75 53 65 74   function rbuSet
3730: 75 70 43 68 65 63 6b 70 6f 69 6e 74 28 29 20 66  upCheckpoint() f
3740: 6f 72 20 64 65 74 61 69 6c 73 2e 20 20 2a 2f 0a  or details.  */.
3750: 20 20 75 33 32 20 69 4d 61 78 46 72 61 6d 65 3b    u32 iMaxFrame;
3760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3770: 20 20 2f 2a 20 4c 61 72 67 65 73 74 20 69 57 61    /* Largest iWa
3780: 6c 46 72 61 6d 65 20 76 61 6c 75 65 20 69 6e 20  lFrame value in 
3790: 61 46 72 61 6d 65 5b 5d 20 2a 2f 0a 20 20 75 33  aFrame[] */.  u3
37a0: 32 20 6d 4c 6f 63 6b 3b 0a 20 20 69 6e 74 20 6e  2 mLock;.  int n
37b0: 46 72 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  Frame;          
37c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e             /* En
37d0: 74 72 69 65 73 20 69 6e 20 61 46 72 61 6d 65 5b  tries in aFrame[
37e0: 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74  ] array */.  int
37f0: 20 6e 46 72 61 6d 65 41 6c 6c 6f 63 3b 20 20 20   nFrameAlloc;   
3800: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3810: 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65 20 6f  Allocated size o
3820: 66 20 61 46 72 61 6d 65 5b 5d 20 61 72 72 61 79  f aFrame[] array
3830: 20 2a 2f 0a 20 20 52 62 75 46 72 61 6d 65 20 2a   */.  RbuFrame *
3840: 61 46 72 61 6d 65 3b 0a 20 20 69 6e 74 20 70 67  aFrame;.  int pg
3850: 73 7a 3b 0a 20 20 75 38 20 2a 61 42 75 66 3b 0a  sz;.  u8 *aBuf;.
3860: 20 20 69 36 34 20 69 57 61 6c 43 6b 73 75 6d 3b    i64 iWalCksum;
3870: 0a 0a 20 20 2f 2a 20 55 73 65 64 20 69 6e 20 52  ..  /* Used in R
3880: 42 55 20 76 61 63 75 75 6d 20 6d 6f 64 65 20 6f  BU vacuum mode o
3890: 6e 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 62  nly */.  int nRb
38a0: 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  u;              
38b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
38c0: 65 72 20 6f 66 20 52 42 55 20 56 46 53 20 69 6e  er of RBU VFS in
38d0: 20 74 68 65 20 73 74 61 63 6b 20 2a 2f 0a 20 20   the stack */.  
38e0: 72 62 75 5f 66 69 6c 65 20 2a 70 52 62 75 46 64  rbu_file *pRbuFd
38f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3900: 2f 2a 20 46 64 20 66 6f 72 20 6d 61 69 6e 20 64  /* Fd for main d
3910: 62 20 6f 66 20 64 62 52 62 75 20 2a 2f 0a 7d 3b  b of dbRbu */.};
3920: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 72 62 75 20 56  ../*.** An rbu V
3930: 46 53 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  FS is implemente
3940: 64 20 75 73 69 6e 67 20 61 6e 20 69 6e 73 74 61  d using an insta
3950: 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 75  nce of this stru
3960: 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72 75 63 74  cture..*/.struct
3970: 20 72 62 75 5f 76 66 73 20 7b 0a 20 20 73 71 6c   rbu_vfs {.  sql
3980: 69 74 65 33 5f 76 66 73 20 62 61 73 65 3b 20 20  ite3_vfs base;  
3990: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
39a0: 72 62 75 20 56 46 53 20 73 68 69 6d 20 6d 65 74  rbu VFS shim met
39b0: 68 6f 64 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  hods */.  sqlite
39c0: 33 5f 76 66 73 20 2a 70 52 65 61 6c 56 66 73 3b  3_vfs *pRealVfs;
39d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 64            /* Und
39e0: 65 72 6c 79 69 6e 67 20 56 46 53 20 2a 2f 0a 20  erlying VFS */. 
39f0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
3a00: 6d 75 74 65 78 3b 20 20 20 20 20 20 20 20 20 20  mutex;          
3a10: 20 2f 2a 20 4d 75 74 65 78 20 74 6f 20 70 72 6f   /* Mutex to pro
3a20: 74 65 63 74 20 70 4d 61 69 6e 20 2a 2f 0a 20 20  tect pMain */.  
3a30: 72 62 75 5f 66 69 6c 65 20 2a 70 4d 61 69 6e 3b  rbu_file *pMain;
3a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a50: 2f 2a 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20 6f  /* Linked list o
3a60: 66 20 6d 61 69 6e 20 64 62 20 66 69 6c 65 73 20  f main db files 
3a70: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 45 61 63  */.};../*.** Eac
3a80: 68 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 62 79  h file opened by
3a90: 20 61 6e 20 72 62 75 20 56 46 53 20 69 73 20 72   an rbu VFS is r
3aa0: 65 70 72 65 73 65 6e 74 65 64 20 62 79 20 61 6e  epresented by an
3ab0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 0a 2a 2a 20   instance of.** 
3ac0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
3ad0: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72 75  ructure..*/.stru
3ae0: 63 74 20 72 62 75 5f 66 69 6c 65 20 7b 0a 20 20  ct rbu_file {.  
3af0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 62 61 73  sqlite3_file bas
3b00: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
3b10: 2f 2a 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  /* sqlite3_file 
3b20: 6d 65 74 68 6f 64 73 20 2a 2f 0a 20 20 73 71 6c  methods */.  sql
3b30: 69 74 65 33 5f 66 69 6c 65 20 2a 70 52 65 61 6c  ite3_file *pReal
3b40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
3b50: 55 6e 64 65 72 6c 79 69 6e 67 20 66 69 6c 65 20  Underlying file 
3b60: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 72 62 75 5f  handle */.  rbu_
3b70: 76 66 73 20 2a 70 52 62 75 56 66 73 3b 20 20 20  vfs *pRbuVfs;   
3b80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
3b90: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 72 62  ointer to the rb
3ba0: 75 5f 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a  u_vfs object */.
3bb0: 20 20 73 71 6c 69 74 65 33 72 62 75 20 2a 70 52    sqlite3rbu *pR
3bc0: 62 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  bu;             
3bd0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
3be0: 72 62 75 20 6f 62 6a 65 63 74 20 28 72 62 75 20  rbu object (rbu 
3bf0: 74 61 72 67 65 74 20 6f 6e 6c 79 29 20 2a 2f 0a  target only) */.
3c00: 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73  .  int openFlags
3c10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3c20: 20 20 20 2f 2a 20 46 6c 61 67 73 20 74 68 69 73     /* Flags this
3c30: 20 66 69 6c 65 20 77 61 73 20 6f 70 65 6e 65 64   file was opened
3c40: 20 77 69 74 68 20 2a 2f 0a 20 20 75 33 32 20 69   with */.  u32 i
3c50: 43 6f 6f 6b 69 65 3b 20 20 20 20 20 20 20 20 20  Cookie;         
3c60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
3c70: 6f 6b 69 65 20 76 61 6c 75 65 20 66 6f 72 20 6d  okie value for m
3c80: 61 69 6e 20 64 62 20 66 69 6c 65 73 20 2a 2f 0a  ain db files */.
3c90: 20 20 75 38 20 69 57 72 69 74 65 56 65 72 3b 20    u8 iWriteVer; 
3ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3cb0: 20 20 2f 2a 20 22 77 72 69 74 65 2d 76 65 72 73    /* "write-vers
3cc0: 69 6f 6e 22 20 76 61 6c 75 65 20 66 6f 72 20 6d  ion" value for m
3cd0: 61 69 6e 20 64 62 20 66 69 6c 65 73 20 2a 2f 0a  ain db files */.
3ce0: 20 20 75 38 20 62 4e 6f 6c 6f 63 6b 3b 20 20 20    u8 bNolock;   
3cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d00: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 66 61 69    /* True to fai
3d10: 6c 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  l EXCLUSIVE lock
3d20: 73 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 53 68 6d  s */..  int nShm
3d30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3d40: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
3d50: 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
3d60: 61 70 53 68 6d 5b 5d 20 61 72 72 61 79 20 2a 2f  apShm[] array */
3d70: 0a 20 20 63 68 61 72 20 2a 2a 61 70 53 68 6d 3b  .  char **apShm;
3d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d90: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 6d     /* Array of m
3da0: 6d 61 70 27 64 20 2a 2d 73 68 6d 20 72 65 67 69  map'd *-shm regi
3db0: 6f 6e 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ons */.  char *z
3dc0: 44 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Del;            
3dd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65           /* Dele
3de0: 74 65 20 74 68 69 73 20 77 68 65 6e 20 63 6c 6f  te this when clo
3df0: 73 69 6e 67 20 66 69 6c 65 20 2a 2f 0a 0a 20 20  sing file */..  
3e00: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 57 61 6c  const char *zWal
3e10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3e20: 2f 2a 20 57 61 6c 20 66 69 6c 65 6e 61 6d 65 20  /* Wal filename 
3e30: 66 6f 72 20 74 68 69 73 20 6d 61 69 6e 20 64 62  for this main db
3e40: 20 66 69 6c 65 20 2a 2f 0a 20 20 72 62 75 5f 66   file */.  rbu_f
3e50: 69 6c 65 20 2a 70 57 61 6c 46 64 3b 20 20 20 20  ile *pWalFd;    
3e60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 61             /* Wa
3e70: 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  l file descripto
3e80: 72 20 66 6f 72 20 74 68 69 73 20 6d 61 69 6e 20  r for this main 
3e90: 64 62 20 2a 2f 0a 20 20 72 62 75 5f 66 69 6c 65  db */.  rbu_file
3ea0: 20 2a 70 4d 61 69 6e 4e 65 78 74 3b 20 20 20 20   *pMainNext;    
3eb0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
3ec0: 4d 41 49 4e 5f 44 42 20 66 69 6c 65 20 2a 2f 0a  MAIN_DB file */.
3ed0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 65 20 66  };../*.** True f
3ee0: 6f 72 20 61 6e 20 52 42 55 20 76 61 63 75 75 6d  or an RBU vacuum
3ef0: 20 68 61 6e 64 6c 65 2c 20 6f 72 20 66 61 6c 73   handle, or fals
3f00: 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  e otherwise..*/.
3f10: 23 64 65 66 69 6e 65 20 72 62 75 49 73 56 61 63  #define rbuIsVac
3f20: 75 75 6d 28 70 29 20 28 28 70 29 2d 3e 7a 54 61  uum(p) ((p)->zTa
3f30: 72 67 65 74 3d 3d 30 29 0a 0a 0a 2f 2a 2a 2a 2a  rget==0).../****
3f40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3f50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3f60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3f70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3f80: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  *****.** The fol
3f90: 6c 6f 77 69 6e 67 20 74 68 72 65 65 20 66 75 6e  lowing three fun
3fa0: 63 74 69 6f 6e 73 2c 20 66 6f 75 6e 64 20 62 65  ctions, found be
3fb0: 6c 6f 77 3a 0a 2a 2a 0a 2a 2a 20 20 20 72 62 75  low:.**.**   rbu
3fc0: 44 65 6c 74 61 47 65 74 49 6e 74 28 29 0a 2a 2a  DeltaGetInt().**
3fd0: 20 20 20 72 62 75 44 65 6c 74 61 43 68 65 63 6b     rbuDeltaCheck
3fe0: 73 75 6d 28 29 0a 2a 2a 20 20 20 72 62 75 44 65  sum().**   rbuDe
3ff0: 6c 74 61 41 70 70 6c 79 28 29 0a 2a 2a 0a 2a 2a  ltaApply().**.**
4000: 20 61 72 65 20 6c 69 66 74 65 64 20 66 72 6f 6d   are lifted from
4010: 20 74 68 65 20 66 6f 73 73 69 6c 20 73 6f 75 72   the fossil sour
4020: 63 65 20 63 6f 64 65 20 28 68 74 74 70 3a 2f 2f  ce code (http://
4030: 66 6f 73 73 69 6c 2d 73 63 6d 2e 6f 72 67 29 2e  fossil-scm.org).
4040: 20 54 68 65 79 0a 2a 2a 20 61 72 65 20 75 73 65   They.** are use
4050: 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  d to implement t
4060: 68 65 20 73 63 61 6c 61 72 20 53 51 4c 20 66 75  he scalar SQL fu
4070: 6e 63 74 69 6f 6e 20 72 62 75 5f 66 6f 73 73 69  nction rbu_fossi
4080: 6c 5f 64 65 6c 74 61 28 29 2e 0a 2a 2f 0a 0a 2f  l_delta()..*/../
4090: 2a 0a 2a 2a 20 52 65 61 64 20 62 79 74 65 73 20  *.** Read bytes 
40a0: 66 72 6f 6d 20 2a 70 7a 20 61 6e 64 20 63 6f 6e  from *pz and con
40b0: 76 65 72 74 20 74 68 65 6d 20 69 6e 74 6f 20 61  vert them into a
40c0: 20 70 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65   positive intege
40d0: 72 2e 20 20 57 68 65 6e 0a 2a 2a 20 66 69 6e 69  r.  When.** fini
40e0: 73 68 65 64 2c 20 6c 65 61 76 65 20 2a 70 7a 20  shed, leave *pz 
40f0: 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
4100: 66 69 72 73 74 20 63 68 61 72 61 63 74 65 72 20  first character 
4110: 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 0a  past the end of.
4120: 2a 2a 20 74 68 65 20 69 6e 74 65 67 65 72 2e 20  ** the integer. 
4130: 20 54 68 65 20 2a 70 4c 65 6e 20 70 61 72 61 6d   The *pLen param
4140: 65 74 65 72 20 68 6f 6c 64 73 20 74 68 65 20 6c  eter holds the l
4150: 65 6e 67 74 68 20 6f 66 20 74 68 65 20 73 74 72  ength of the str
4160: 69 6e 67 0a 2a 2a 20 69 6e 20 2a 70 7a 20 61 6e  ing.** in *pz an
4170: 64 20 69 73 20 64 65 63 72 65 6d 65 6e 74 65 64  d is decremented
4180: 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 63   once for each c
4190: 68 61 72 61 63 74 65 72 20 69 6e 20 74 68 65 20  haracter in the 
41a0: 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 73 74 61 74  integer..*/.stat
41b0: 69 63 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  ic unsigned int 
41c0: 72 62 75 44 65 6c 74 61 47 65 74 49 6e 74 28 63  rbuDeltaGetInt(c
41d0: 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 2c 20  onst char **pz, 
41e0: 69 6e 74 20 2a 70 4c 65 6e 29 7b 0a 20 20 73 74  int *pLen){.  st
41f0: 61 74 69 63 20 63 6f 6e 73 74 20 73 69 67 6e 65  atic const signe
4200: 64 20 63 68 61 72 20 7a 56 61 6c 75 65 5b 5d 20  d char zValue[] 
4210: 3d 20 7b 0a 20 20 20 20 2d 31 2c 20 2d 31 2c 20  = {.    -1, -1, 
4220: 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20  -1, -1, -1, -1, 
4230: 2d 31 2c 20 2d 31 2c 20 20 20 2d 31 2c 20 2d 31  -1, -1,   -1, -1
4240: 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31  , -1, -1, -1, -1
4250: 2c 20 2d 31 2c 20 2d 31 2c 0a 20 20 20 20 2d 31  , -1, -1,.    -1
4260: 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31  , -1, -1, -1, -1
4270: 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 20 20  , -1, -1, -1,   
4280: 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20  -1, -1, -1, -1, 
4290: 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 0a  -1, -1, -1, -1,.
42a0: 20 20 20 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20      -1, -1, -1, 
42b0: 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20  -1, -1, -1, -1, 
42c0: 2d 31 2c 20 20 20 2d 31 2c 20 2d 31 2c 20 2d 31  -1,   -1, -1, -1
42d0: 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31  , -1, -1, -1, -1
42e0: 2c 20 2d 31 2c 0a 20 20 20 20 20 30 2c 20 20 31  , -1,.     0,  1
42f0: 2c 20 20 32 2c 20 20 33 2c 20 20 34 2c 20 20 35  ,  2,  3,  4,  5
4300: 2c 20 20 36 2c 20 20 37 2c 20 20 20 20 38 2c 20  ,  6,  7,    8, 
4310: 20 39 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20   9, -1, -1, -1, 
4320: 2d 31 2c 20 2d 31 2c 20 2d 31 2c 0a 20 20 20 20  -1, -1, -1,.    
4330: 2d 31 2c 20 31 30 2c 20 31 31 2c 20 31 32 2c 20  -1, 10, 11, 12, 
4340: 31 33 2c 20 31 34 2c 20 31 35 2c 20 31 36 2c 20  13, 14, 15, 16, 
4350: 20 20 31 37 2c 20 31 38 2c 20 31 39 2c 20 32 30    17, 18, 19, 20
4360: 2c 20 32 31 2c 20 32 32 2c 20 32 33 2c 20 32 34  , 21, 22, 23, 24
4370: 2c 0a 20 20 20 20 32 35 2c 20 32 36 2c 20 32 37  ,.    25, 26, 27
4380: 2c 20 32 38 2c 20 32 39 2c 20 33 30 2c 20 33 31  , 28, 29, 30, 31
4390: 2c 20 33 32 2c 20 20 20 33 33 2c 20 33 34 2c 20  , 32,   33, 34, 
43a0: 33 35 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20  35, -1, -1, -1, 
43b0: 2d 31 2c 20 33 36 2c 0a 20 20 20 20 2d 31 2c 20  -1, 36,.    -1, 
43c0: 33 37 2c 20 33 38 2c 20 33 39 2c 20 34 30 2c 20  37, 38, 39, 40, 
43d0: 34 31 2c 20 34 32 2c 20 34 33 2c 20 20 20 34 34  41, 42, 43,   44
43e0: 2c 20 34 35 2c 20 34 36 2c 20 34 37 2c 20 34 38  , 45, 46, 47, 48
43f0: 2c 20 34 39 2c 20 35 30 2c 20 35 31 2c 0a 20 20  , 49, 50, 51,.  
4400: 20 20 35 32 2c 20 35 33 2c 20 35 34 2c 20 35 35    52, 53, 54, 55
4410: 2c 20 35 36 2c 20 35 37 2c 20 35 38 2c 20 35 39  , 56, 57, 58, 59
4420: 2c 20 20 20 36 30 2c 20 36 31 2c 20 36 32 2c 20  ,   60, 61, 62, 
4430: 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 36 33 2c 20  -1, -1, -1, 63, 
4440: 2d 31 2c 0a 20 20 7d 3b 0a 20 20 75 6e 73 69 67  -1,.  };.  unsig
4450: 6e 65 64 20 69 6e 74 20 76 20 3d 20 30 3b 0a 20  ned int v = 0;. 
4460: 20 69 6e 74 20 63 3b 0a 20 20 75 6e 73 69 67 6e   int c;.  unsign
4470: 65 64 20 63 68 61 72 20 2a 7a 20 3d 20 28 75 6e  ed char *z = (un
4480: 73 69 67 6e 65 64 20 63 68 61 72 2a 29 2a 70 7a  signed char*)*pz
4490: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
44a0: 72 20 2a 7a 53 74 61 72 74 20 3d 20 7a 3b 0a 20  r *zStart = z;. 
44b0: 20 77 68 69 6c 65 28 20 28 63 20 3d 20 7a 56 61   while( (c = zVa
44c0: 6c 75 65 5b 30 78 37 66 26 2a 28 7a 2b 2b 29 5d  lue[0x7f&*(z++)]
44d0: 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 76 20 3d  )>=0 ){.     v =
44e0: 20 28 76 3c 3c 36 29 20 2b 20 63 3b 0a 20 20 7d   (v<<6) + c;.  }
44f0: 0a 20 20 7a 2d 2d 3b 0a 20 20 2a 70 4c 65 6e 20  .  z--;.  *pLen 
4500: 2d 3d 20 7a 20 2d 20 7a 53 74 61 72 74 3b 0a 20  -= z - zStart;. 
4510: 20 2a 70 7a 20 3d 20 28 63 68 61 72 2a 29 7a 3b   *pz = (char*)z;
4520: 0a 20 20 72 65 74 75 72 6e 20 76 3b 0a 7d 0a 0a  .  return v;.}..
4530: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20  /*.** Compute a 
4540: 33 32 2d 62 69 74 20 63 68 65 63 6b 73 75 6d 20  32-bit checksum 
4550: 6f 6e 20 74 68 65 20 4e 2d 62 79 74 65 20 62 75  on the N-byte bu
4560: 66 66 65 72 2e 20 20 52 65 74 75 72 6e 20 74 68  ffer.  Return th
4570: 65 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61  e result..*/.sta
4580: 74 69 63 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  tic unsigned int
4590: 20 72 62 75 44 65 6c 74 61 43 68 65 63 6b 73 75   rbuDeltaChecksu
45a0: 6d 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49  m(const char *zI
45b0: 6e 2c 20 73 69 7a 65 5f 74 20 4e 29 7b 0a 20 20  n, size_t N){.  
45c0: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
45d0: 68 61 72 20 2a 7a 20 3d 20 28 63 6f 6e 73 74 20  har *z = (const 
45e0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
45f0: 7a 49 6e 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  zIn;.  unsigned 
4600: 73 75 6d 30 20 3d 20 30 3b 0a 20 20 75 6e 73 69  sum0 = 0;.  unsi
4610: 67 6e 65 64 20 73 75 6d 31 20 3d 20 30 3b 0a 20  gned sum1 = 0;. 
4620: 20 75 6e 73 69 67 6e 65 64 20 73 75 6d 32 20 3d   unsigned sum2 =
4630: 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 73   0;.  unsigned s
4640: 75 6d 33 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65  um3 = 0;.  while
4650: 28 4e 20 3e 3d 20 31 36 29 7b 0a 20 20 20 20 73  (N >= 16){.    s
4660: 75 6d 30 20 2b 3d 20 28 28 75 6e 73 69 67 6e 65  um0 += ((unsigne
4670: 64 29 7a 5b 30 5d 20 2b 20 7a 5b 34 5d 20 2b 20  d)z[0] + z[4] + 
4680: 7a 5b 38 5d 20 2b 20 7a 5b 31 32 5d 29 3b 0a 20  z[8] + z[12]);. 
4690: 20 20 20 73 75 6d 31 20 2b 3d 20 28 28 75 6e 73     sum1 += ((uns
46a0: 69 67 6e 65 64 29 7a 5b 31 5d 20 2b 20 7a 5b 35  igned)z[1] + z[5
46b0: 5d 20 2b 20 7a 5b 39 5d 20 2b 20 7a 5b 31 33 5d  ] + z[9] + z[13]
46c0: 29 3b 0a 20 20 20 20 73 75 6d 32 20 2b 3d 20 28  );.    sum2 += (
46d0: 28 75 6e 73 69 67 6e 65 64 29 7a 5b 32 5d 20 2b  (unsigned)z[2] +
46e0: 20 7a 5b 36 5d 20 2b 20 7a 5b 31 30 5d 2b 20 7a   z[6] + z[10]+ z
46f0: 5b 31 34 5d 29 3b 0a 20 20 20 20 73 75 6d 33 20  [14]);.    sum3 
4700: 2b 3d 20 28 28 75 6e 73 69 67 6e 65 64 29 7a 5b  += ((unsigned)z[
4710: 33 5d 20 2b 20 7a 5b 37 5d 20 2b 20 7a 5b 31 31  3] + z[7] + z[11
4720: 5d 2b 20 7a 5b 31 35 5d 29 3b 0a 20 20 20 20 7a  ]+ z[15]);.    z
4730: 20 2b 3d 20 31 36 3b 0a 20 20 20 20 4e 20 2d 3d   += 16;.    N -=
4740: 20 31 36 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65   16;.  }.  while
4750: 28 4e 20 3e 3d 20 34 29 7b 0a 20 20 20 20 73 75  (N >= 4){.    su
4760: 6d 30 20 2b 3d 20 7a 5b 30 5d 3b 0a 20 20 20 20  m0 += z[0];.    
4770: 73 75 6d 31 20 2b 3d 20 7a 5b 31 5d 3b 0a 20 20  sum1 += z[1];.  
4780: 20 20 73 75 6d 32 20 2b 3d 20 7a 5b 32 5d 3b 0a    sum2 += z[2];.
4790: 20 20 20 20 73 75 6d 33 20 2b 3d 20 7a 5b 33 5d      sum3 += z[3]
47a0: 3b 0a 20 20 20 20 7a 20 2b 3d 20 34 3b 0a 20 20  ;.    z += 4;.  
47b0: 20 20 4e 20 2d 3d 20 34 3b 0a 20 20 7d 0a 20 20    N -= 4;.  }.  
47c0: 73 75 6d 33 20 2b 3d 20 28 73 75 6d 32 20 3c 3c  sum3 += (sum2 <<
47d0: 20 38 29 20 2b 20 28 73 75 6d 31 20 3c 3c 20 31   8) + (sum1 << 1
47e0: 36 29 20 2b 20 28 73 75 6d 30 20 3c 3c 20 32 34  6) + (sum0 << 24
47f0: 29 3b 0a 20 20 73 77 69 74 63 68 28 4e 29 7b 0a  );.  switch(N){.
4800: 20 20 20 20 63 61 73 65 20 33 3a 20 20 20 73 75      case 3:   su
4810: 6d 33 20 2b 3d 20 28 7a 5b 32 5d 20 3c 3c 20 38  m3 += (z[2] << 8
4820: 29 3b 0a 20 20 20 20 63 61 73 65 20 32 3a 20 20  );.    case 2:  
4830: 20 73 75 6d 33 20 2b 3d 20 28 7a 5b 31 5d 20 3c   sum3 += (z[1] <
4840: 3c 20 31 36 29 3b 0a 20 20 20 20 63 61 73 65 20  < 16);.    case 
4850: 31 3a 20 20 20 73 75 6d 33 20 2b 3d 20 28 7a 5b  1:   sum3 += (z[
4860: 30 5d 20 3c 3c 20 32 34 29 3b 0a 20 20 20 20 64  0] << 24);.    d
4870: 65 66 61 75 6c 74 3a 20 20 3b 0a 20 20 7d 0a 20  efault:  ;.  }. 
4880: 20 72 65 74 75 72 6e 20 73 75 6d 33 3b 0a 7d 0a   return sum3;.}.
4890: 0a 2f 2a 0a 2a 2a 20 41 70 70 6c 79 20 61 20 64  ./*.** Apply a d
48a0: 65 6c 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  elta..**.** The 
48b0: 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 73 68  output buffer sh
48c0: 6f 75 6c 64 20 62 65 20 62 69 67 20 65 6e 6f 75  ould be big enou
48d0: 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 77  gh to hold the w
48e0: 68 6f 6c 65 20 6f 75 74 70 75 74 0a 2a 2a 20 66  hole output.** f
48f0: 69 6c 65 20 61 6e 64 20 61 20 4e 55 4c 20 74 65  ile and a NUL te
4900: 72 6d 69 6e 61 74 6f 72 20 61 74 20 74 68 65 20  rminator at the 
4910: 65 6e 64 2e 20 20 54 68 65 20 64 65 6c 74 61 5f  end.  The delta_
4920: 6f 75 74 70 75 74 5f 73 69 7a 65 28 29 0a 2a 2a  output_size().**
4930: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 65   routine will de
4940: 74 65 72 6d 69 6e 65 20 74 68 69 73 20 73 69 7a  termine this siz
4950: 65 20 66 6f 72 20 79 6f 75 2e 0a 2a 2a 0a 2a 2a  e for you..**.**
4960: 20 54 68 65 20 64 65 6c 74 61 20 73 74 72 69 6e   The delta strin
4970: 67 20 73 68 6f 75 6c 64 20 62 65 20 6e 75 6c 6c  g should be null
4980: 2d 74 65 72 6d 69 6e 61 74 65 64 2e 20 20 42 75  -terminated.  Bu
4990: 74 20 74 68 65 20 64 65 6c 74 61 20 73 74 72 69  t the delta stri
49a0: 6e 67 0a 2a 2a 20 6d 61 79 20 63 6f 6e 74 61 69  ng.** may contai
49b0: 6e 20 65 6d 62 65 64 64 65 64 20 4e 55 4c 20 63  n embedded NUL c
49c0: 68 61 72 61 63 74 65 72 73 20 28 69 66 20 74 68  haracters (if th
49d0: 65 20 69 6e 70 75 74 20 61 6e 64 20 6f 75 74 70  e input and outp
49e0: 75 74 20 61 72 65 0a 2a 2a 20 62 69 6e 61 72 79  ut are.** binary
49f0: 20 66 69 6c 65 73 29 20 73 6f 20 77 65 20 61 6c   files) so we al
4a00: 73 6f 20 68 61 76 65 20 74 6f 20 70 61 73 73 20  so have to pass 
4a10: 69 6e 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66  in the length of
4a20: 20 74 68 65 20 64 65 6c 74 61 20 69 6e 0a 2a 2a   the delta in.**
4a30: 20 74 68 65 20 6c 65 6e 44 65 6c 74 61 20 70 61   the lenDelta pa
4a40: 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54  rameter..**.** T
4a50: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
4a60: 75 72 6e 73 20 74 68 65 20 73 69 7a 65 20 6f 66  urns the size of
4a70: 20 74 68 65 20 6f 75 74 70 75 74 20 66 69 6c 65   the output file
4a80: 20 69 6e 20 62 79 74 65 73 20 28 65 78 63 6c 75   in bytes (exclu
4a90: 64 69 6e 67 0a 2a 2a 20 74 68 65 20 66 69 6e 61  ding.** the fina
4aa0: 6c 20 4e 55 4c 20 74 65 72 6d 69 6e 61 74 6f 72  l NUL terminator
4ab0: 20 63 68 61 72 61 63 74 65 72 29 2e 20 20 45 78   character).  Ex
4ac0: 63 65 70 74 2c 20 69 66 20 74 68 65 20 64 65 6c  cept, if the del
4ad0: 74 61 20 73 74 72 69 6e 67 20 69 73 0a 2a 2a 20  ta string is.** 
4ae0: 6d 61 6c 66 6f 72 6d 65 64 20 6f 72 20 69 6e 74  malformed or int
4af0: 65 6e 64 65 64 20 66 6f 72 20 75 73 65 20 77 69  ended for use wi
4b00: 74 68 20 61 20 73 6f 75 72 63 65 20 66 69 6c 65  th a source file
4b10: 20 6f 74 68 65 72 20 74 68 61 6e 20 7a 53 72 63   other than zSrc
4b20: 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 72  ,.** then this r
4b30: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 2d  outine returns -
4b40: 31 2e 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72 20 74  1..**.** Refer t
4b50: 6f 20 74 68 65 20 64 65 6c 74 61 5f 63 72 65 61  o the delta_crea
4b60: 74 65 28 29 20 64 6f 63 75 6d 65 6e 74 61 74 69  te() documentati
4b70: 6f 6e 20 61 62 6f 76 65 20 66 6f 72 20 61 20 64  on above for a d
4b80: 65 73 63 72 69 70 74 69 6f 6e 0a 2a 2a 20 6f 66  escription.** of
4b90: 20 74 68 65 20 64 65 6c 74 61 20 66 69 6c 65 20   the delta file 
4ba0: 66 6f 72 6d 61 74 2e 0a 2a 2f 0a 73 74 61 74 69  format..*/.stati
4bb0: 63 20 69 6e 74 20 72 62 75 44 65 6c 74 61 41 70  c int rbuDeltaAp
4bc0: 70 6c 79 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  ply(.  const cha
4bd0: 72 20 2a 7a 53 72 63 2c 20 20 20 20 20 20 2f 2a  r *zSrc,      /*
4be0: 20 54 68 65 20 73 6f 75 72 63 65 20 6f 72 20 70   The source or p
4bf0: 61 74 74 65 72 6e 20 66 69 6c 65 20 2a 2f 0a 20  attern file */. 
4c00: 20 69 6e 74 20 6c 65 6e 53 72 63 2c 20 20 20 20   int lenSrc,    
4c10: 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74          /* Lengt
4c20: 68 20 6f 66 20 74 68 65 20 73 6f 75 72 63 65 20  h of the source 
4c30: 66 69 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  file */.  const 
4c40: 63 68 61 72 20 2a 7a 44 65 6c 74 61 2c 20 20 20  char *zDelta,   
4c50: 20 2f 2a 20 44 65 6c 74 61 20 74 6f 20 61 70 70   /* Delta to app
4c60: 6c 79 20 74 6f 20 74 68 65 20 70 61 74 74 65 72  ly to the patter
4c70: 6e 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 6e 44 65  n */.  int lenDe
4c80: 6c 74 61 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  lta,          /*
4c90: 20 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 64   Length of the d
4ca0: 65 6c 74 61 20 2a 2f 0a 20 20 63 68 61 72 20 2a  elta */.  char *
4cb0: 7a 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 20  zOut            
4cc0: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6f 75   /* Write the ou
4cd0: 74 70 75 74 20 69 6e 74 6f 20 74 68 69 73 20 70  tput into this p
4ce0: 72 65 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66  reallocated buff
4cf0: 65 72 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67  er */.){.  unsig
4d00: 6e 65 64 20 69 6e 74 20 6c 69 6d 69 74 3b 0a 20  ned int limit;. 
4d10: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 74 6f   unsigned int to
4d20: 74 61 6c 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66  tal = 0;.#ifndef
4d30: 20 46 4f 53 53 49 4c 5f 4f 4d 49 54 5f 44 45 4c   FOSSIL_OMIT_DEL
4d40: 54 41 5f 43 4b 53 55 4d 5f 54 45 53 54 0a 20 20  TA_CKSUM_TEST.  
4d50: 63 68 61 72 20 2a 7a 4f 72 69 67 4f 75 74 20 3d  char *zOrigOut =
4d60: 20 7a 4f 75 74 3b 0a 23 65 6e 64 69 66 0a 0a 20   zOut;.#endif.. 
4d70: 20 6c 69 6d 69 74 20 3d 20 72 62 75 44 65 6c 74   limit = rbuDelt
4d80: 61 47 65 74 49 6e 74 28 26 7a 44 65 6c 74 61 2c  aGetInt(&zDelta,
4d90: 20 26 6c 65 6e 44 65 6c 74 61 29 3b 0a 20 20 69   &lenDelta);.  i
4da0: 66 28 20 2a 7a 44 65 6c 74 61 21 3d 27 5c 6e 27  f( *zDelta!='\n'
4db0: 20 29 7b 0a 20 20 20 20 2f 2a 20 45 52 52 4f 52   ){.    /* ERROR
4dc0: 3a 20 73 69 7a 65 20 69 6e 74 65 67 65 72 20 6e  : size integer n
4dd0: 6f 74 20 74 65 72 6d 69 6e 61 74 65 64 20 62 79  ot terminated by
4de0: 20 22 5c 6e 22 20 2a 2f 0a 20 20 20 20 72 65 74   "\n" */.    ret
4df0: 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 7a 44  urn -1;.  }.  zD
4e00: 65 6c 74 61 2b 2b 3b 20 6c 65 6e 44 65 6c 74 61  elta++; lenDelta
4e10: 2d 2d 3b 0a 20 20 77 68 69 6c 65 28 20 2a 7a 44  --;.  while( *zD
4e20: 65 6c 74 61 20 26 26 20 6c 65 6e 44 65 6c 74 61  elta && lenDelta
4e30: 3e 30 20 29 7b 0a 20 20 20 20 75 6e 73 69 67 6e  >0 ){.    unsign
4e40: 65 64 20 69 6e 74 20 63 6e 74 2c 20 6f 66 73 74  ed int cnt, ofst
4e50: 3b 0a 20 20 20 20 63 6e 74 20 3d 20 72 62 75 44  ;.    cnt = rbuD
4e60: 65 6c 74 61 47 65 74 49 6e 74 28 26 7a 44 65 6c  eltaGetInt(&zDel
4e70: 74 61 2c 20 26 6c 65 6e 44 65 6c 74 61 29 3b 0a  ta, &lenDelta);.
4e80: 20 20 20 20 73 77 69 74 63 68 28 20 7a 44 65 6c      switch( zDel
4e90: 74 61 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 63  ta[0] ){.      c
4ea0: 61 73 65 20 27 40 27 3a 20 7b 0a 20 20 20 20 20  ase '@': {.     
4eb0: 20 20 20 7a 44 65 6c 74 61 2b 2b 3b 20 6c 65 6e     zDelta++; len
4ec0: 44 65 6c 74 61 2d 2d 3b 0a 20 20 20 20 20 20 20  Delta--;.       
4ed0: 20 6f 66 73 74 20 3d 20 72 62 75 44 65 6c 74 61   ofst = rbuDelta
4ee0: 47 65 74 49 6e 74 28 26 7a 44 65 6c 74 61 2c 20  GetInt(&zDelta, 
4ef0: 26 6c 65 6e 44 65 6c 74 61 29 3b 0a 20 20 20 20  &lenDelta);.    
4f00: 20 20 20 20 69 66 28 20 6c 65 6e 44 65 6c 74 61      if( lenDelta
4f10: 3e 30 20 26 26 20 7a 44 65 6c 74 61 5b 30 5d 21  >0 && zDelta[0]!
4f20: 3d 27 2c 27 20 29 7b 0a 20 20 20 20 20 20 20 20  =',' ){.        
4f30: 20 20 2f 2a 20 45 52 52 4f 52 3a 20 63 6f 70 79    /* ERROR: copy
4f40: 20 63 6f 6d 6d 61 6e 64 20 6e 6f 74 20 74 65 72   command not ter
4f50: 6d 69 6e 61 74 65 64 20 62 79 20 27 2c 27 20 2a  minated by ',' *
4f60: 2f 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  /.          retu
4f70: 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d  rn -1;.        }
4f80: 0a 20 20 20 20 20 20 20 20 7a 44 65 6c 74 61 2b  .        zDelta+
4f90: 2b 3b 20 6c 65 6e 44 65 6c 74 61 2d 2d 3b 0a 20  +; lenDelta--;. 
4fa0: 20 20 20 20 20 20 20 74 6f 74 61 6c 20 2b 3d 20         total += 
4fb0: 63 6e 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28  cnt;.        if(
4fc0: 20 74 6f 74 61 6c 3e 6c 69 6d 69 74 20 29 7b 0a   total>limit ){.
4fd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 52 52            /* ERR
4fe0: 4f 52 3a 20 63 6f 70 79 20 65 78 63 65 65 64 73  OR: copy exceeds
4ff0: 20 6f 75 74 70 75 74 20 66 69 6c 65 20 73 69 7a   output file siz
5000: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  e */.          r
5010: 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20  eturn -1;.      
5020: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
5030: 28 69 6e 74 29 28 6f 66 73 74 2b 63 6e 74 29 20  (int)(ofst+cnt) 
5040: 3e 20 6c 65 6e 53 72 63 20 29 7b 0a 20 20 20 20  > lenSrc ){.    
5050: 20 20 20 20 20 20 2f 2a 20 45 52 52 4f 52 3a 20        /* ERROR: 
5060: 63 6f 70 79 20 65 78 74 65 6e 64 73 20 70 61 73  copy extends pas
5070: 74 20 65 6e 64 20 6f 66 20 69 6e 70 75 74 20 2a  t end of input *
5080: 2f 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  /.          retu
5090: 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d  rn -1;.        }
50a0: 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
50b0: 7a 4f 75 74 2c 20 26 7a 53 72 63 5b 6f 66 73 74  zOut, &zSrc[ofst
50c0: 5d 2c 20 63 6e 74 29 3b 0a 20 20 20 20 20 20 20  ], cnt);.       
50d0: 20 7a 4f 75 74 20 2b 3d 20 63 6e 74 3b 0a 20 20   zOut += cnt;.  
50e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
50f0: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
5100: 27 3a 27 3a 20 7b 0a 20 20 20 20 20 20 20 20 7a  ':': {.        z
5110: 44 65 6c 74 61 2b 2b 3b 20 6c 65 6e 44 65 6c 74  Delta++; lenDelt
5120: 61 2d 2d 3b 0a 20 20 20 20 20 20 20 20 74 6f 74  a--;.        tot
5130: 61 6c 20 2b 3d 20 63 6e 74 3b 0a 20 20 20 20 20  al += cnt;.     
5140: 20 20 20 69 66 28 20 74 6f 74 61 6c 3e 6c 69 6d     if( total>lim
5150: 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  it ){.          
5160: 2f 2a 20 45 52 52 4f 52 3a 20 20 69 6e 73 65 72  /* ERROR:  inser
5170: 74 20 63 6f 6d 6d 61 6e 64 20 67 69 76 65 73 20  t command gives 
5180: 61 6e 20 6f 75 74 70 75 74 20 6c 61 72 67 65 72  an output larger
5190: 20 74 68 61 6e 20 70 72 65 64 69 63 74 65 64 20   than predicted 
51a0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  */.          ret
51b0: 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  urn -1;.        
51c0: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 69  }.        if( (i
51d0: 6e 74 29 63 6e 74 3e 6c 65 6e 44 65 6c 74 61 20  nt)cnt>lenDelta 
51e0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
51f0: 45 52 52 4f 52 3a 20 69 6e 73 65 72 74 20 63 6f  ERROR: insert co
5200: 75 6e 74 20 65 78 63 65 65 64 73 20 73 69 7a 65  unt exceeds size
5210: 20 6f 66 20 64 65 6c 74 61 20 2a 2f 0a 20 20 20   of delta */.   
5220: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31         return -1
5230: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
5240: 20 20 20 20 6d 65 6d 63 70 79 28 7a 4f 75 74 2c      memcpy(zOut,
5250: 20 7a 44 65 6c 74 61 2c 20 63 6e 74 29 3b 0a 20   zDelta, cnt);. 
5260: 20 20 20 20 20 20 20 7a 4f 75 74 20 2b 3d 20 63         zOut += c
5270: 6e 74 3b 0a 20 20 20 20 20 20 20 20 7a 44 65 6c  nt;.        zDel
5280: 74 61 20 2b 3d 20 63 6e 74 3b 0a 20 20 20 20 20  ta += cnt;.     
5290: 20 20 20 6c 65 6e 44 65 6c 74 61 20 2d 3d 20 63     lenDelta -= c
52a0: 6e 74 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  nt;.        brea
52b0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
52c0: 20 63 61 73 65 20 27 3b 27 3a 20 7b 0a 20 20 20   case ';': {.   
52d0: 20 20 20 20 20 7a 44 65 6c 74 61 2b 2b 3b 20 6c       zDelta++; l
52e0: 65 6e 44 65 6c 74 61 2d 2d 3b 0a 20 20 20 20 20  enDelta--;.     
52f0: 20 20 20 7a 4f 75 74 5b 30 5d 20 3d 20 30 3b 0a     zOut[0] = 0;.
5300: 23 69 66 6e 64 65 66 20 46 4f 53 53 49 4c 5f 4f  #ifndef FOSSIL_O
5310: 4d 49 54 5f 44 45 4c 54 41 5f 43 4b 53 55 4d 5f  MIT_DELTA_CKSUM_
5320: 54 45 53 54 0a 20 20 20 20 20 20 20 20 69 66 28  TEST.        if(
5330: 20 63 6e 74 21 3d 72 62 75 44 65 6c 74 61 43 68   cnt!=rbuDeltaCh
5340: 65 63 6b 73 75 6d 28 7a 4f 72 69 67 4f 75 74 2c  ecksum(zOrigOut,
5350: 20 74 6f 74 61 6c 29 20 29 7b 0a 20 20 20 20 20   total) ){.     
5360: 20 20 20 20 20 2f 2a 20 45 52 52 4f 52 3a 20 20       /* ERROR:  
5370: 62 61 64 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a  bad checksum */.
5380: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
5390: 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23   -1;.        }.#
53a0: 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 69 66  endif.        if
53b0: 28 20 74 6f 74 61 6c 21 3d 6c 69 6d 69 74 20 29  ( total!=limit )
53c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45  {.          /* E
53d0: 52 52 4f 52 3a 20 67 65 6e 65 72 61 74 65 64 20  RROR: generated 
53e0: 73 69 7a 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61  size does not ma
53f0: 74 63 68 20 70 72 65 64 69 63 74 65 64 20 73 69  tch predicted si
5400: 7a 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ze */.          
5410: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20  return -1;.     
5420: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 74     }.        ret
5430: 75 72 6e 20 74 6f 74 61 6c 3b 0a 20 20 20 20 20  urn total;.     
5440: 20 7d 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74   }.      default
5450: 3a 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45  : {.        /* E
5460: 52 52 4f 52 3a 20 75 6e 6b 6e 6f 77 6e 20 64 65  RROR: unknown de
5470: 6c 74 61 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  lta operator */.
5480: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d          return -
5490: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
54a0: 0a 20 20 7d 0a 20 20 2f 2a 20 45 52 52 4f 52 3a  .  }.  /* ERROR:
54b0: 20 75 6e 74 65 72 6d 69 6e 61 74 65 64 20 64 65   unterminated de
54c0: 6c 74 61 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  lta */.  return 
54d0: 2d 31 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  -1;.}..static in
54e0: 74 20 72 62 75 44 65 6c 74 61 4f 75 74 70 75 74  t rbuDeltaOutput
54f0: 53 69 7a 65 28 63 6f 6e 73 74 20 63 68 61 72 20  Size(const char 
5500: 2a 7a 44 65 6c 74 61 2c 20 69 6e 74 20 6c 65 6e  *zDelta, int len
5510: 44 65 6c 74 61 29 7b 0a 20 20 69 6e 74 20 73 69  Delta){.  int si
5520: 7a 65 3b 0a 20 20 73 69 7a 65 20 3d 20 72 62 75  ze;.  size = rbu
5530: 44 65 6c 74 61 47 65 74 49 6e 74 28 26 7a 44 65  DeltaGetInt(&zDe
5540: 6c 74 61 2c 20 26 6c 65 6e 44 65 6c 74 61 29 3b  lta, &lenDelta);
5550: 0a 20 20 69 66 28 20 2a 7a 44 65 6c 74 61 21 3d  .  if( *zDelta!=
5560: 27 5c 6e 27 20 29 7b 0a 20 20 20 20 2f 2a 20 45  '\n' ){.    /* E
5570: 52 52 4f 52 3a 20 73 69 7a 65 20 69 6e 74 65 67  RROR: size integ
5580: 65 72 20 6e 6f 74 20 74 65 72 6d 69 6e 61 74 65  er not terminate
5590: 64 20 62 79 20 22 5c 6e 22 20 2a 2f 0a 20 20 20  d by "\n" */.   
55a0: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a   return -1;.  }.
55b0: 20 20 72 65 74 75 72 6e 20 73 69 7a 65 3b 0a 7d    return size;.}
55c0: 0a 0a 2f 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20 63  ../*.** End of c
55d0: 6f 64 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 66  ode taken from f
55e0: 6f 73 73 69 6c 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ossil..*********
55f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5600: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5610: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5620: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5630: 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  /../*.** Impleme
5640: 6e 74 61 74 69 6f 6e 20 6f 66 20 53 51 4c 20 73  ntation of SQL s
5650: 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20 72  calar function r
5660: 62 75 5f 66 6f 73 73 69 6c 5f 64 65 6c 74 61 28  bu_fossil_delta(
5670: 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  )..**.** This fu
5680: 6e 63 74 69 6f 6e 20 61 70 70 6c 69 65 73 20 61  nction applies a
5690: 20 66 6f 73 73 69 6c 20 64 65 6c 74 61 20 70 61   fossil delta pa
56a0: 74 63 68 20 74 6f 20 61 20 62 6c 6f 62 2e 20 45  tch to a blob. E
56b0: 78 61 63 74 6c 79 20 74 77 6f 0a 2a 2a 20 61 72  xactly two.** ar
56c0: 67 75 6d 65 6e 74 73 20 6d 75 73 74 20 62 65 20  guments must be 
56d0: 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66  passed to this f
56e0: 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20 66 69 72  unction. The fir
56f0: 73 74 20 69 73 20 74 68 65 20 62 6c 6f 62 20 74  st is the blob t
5700: 6f 0a 2a 2a 20 70 61 74 63 68 20 61 6e 64 20 74  o.** patch and t
5710: 68 65 20 73 65 63 6f 6e 64 20 74 68 65 20 70 61  he second the pa
5720: 74 63 68 20 74 6f 20 61 70 70 6c 79 2e 20 49 66  tch to apply. If
5730: 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
5740: 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  , this.** functi
5750: 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 70  on returns the p
5760: 61 74 63 68 65 64 20 62 6c 6f 62 2e 0a 2a 2f 0a  atched blob..*/.
5770: 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75 46  static void rbuF
5780: 6f 73 73 69 6c 44 65 6c 74 61 46 75 6e 63 28 0a  ossilDeltaFunc(.
5790: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
57a0: 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e  t *context,.  in
57b0: 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65  t argc,.  sqlite
57c0: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
57d0: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
57e0: 61 44 65 6c 74 61 3b 0a 20 20 69 6e 74 20 6e 44  aDelta;.  int nD
57f0: 65 6c 74 61 3b 0a 20 20 63 6f 6e 73 74 20 63 68  elta;.  const ch
5800: 61 72 20 2a 61 4f 72 69 67 3b 0a 20 20 69 6e 74  ar *aOrig;.  int
5810: 20 6e 4f 72 69 67 3b 0a 0a 20 20 69 6e 74 20 6e   nOrig;..  int n
5820: 4f 75 74 3b 0a 20 20 69 6e 74 20 6e 4f 75 74 32  Out;.  int nOut2
5830: 3b 0a 20 20 63 68 61 72 20 2a 61 4f 75 74 3b 0a  ;.  char *aOut;.
5840: 0a 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3d  .  assert( argc=
5850: 3d 32 20 29 3b 0a 0a 20 20 6e 4f 72 69 67 20 3d  =2 );..  nOrig =
5860: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
5870: 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20  ytes(argv[0]);. 
5880: 20 61 4f 72 69 67 20 3d 20 28 63 6f 6e 73 74 20   aOrig = (const 
5890: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
58a0: 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30 5d  lue_blob(argv[0]
58b0: 29 3b 0a 20 20 6e 44 65 6c 74 61 20 3d 20 73 71  );.  nDelta = sq
58c0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
58d0: 73 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 61 44  s(argv[1]);.  aD
58e0: 65 6c 74 61 20 3d 20 28 63 6f 6e 73 74 20 63 68  elta = (const ch
58f0: 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
5900: 65 5f 62 6c 6f 62 28 61 72 67 76 5b 31 5d 29 3b  e_blob(argv[1]);
5910: 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
5920: 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  t the size of th
5930: 65 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 6e 4f  e output */.  nO
5940: 75 74 20 3d 20 72 62 75 44 65 6c 74 61 4f 75 74  ut = rbuDeltaOut
5950: 70 75 74 53 69 7a 65 28 61 44 65 6c 74 61 2c 20  putSize(aDelta, 
5960: 6e 44 65 6c 74 61 29 3b 0a 20 20 69 66 28 20 6e  nDelta);.  if( n
5970: 4f 75 74 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c  Out<0 ){.    sql
5980: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
5990: 72 28 63 6f 6e 74 65 78 74 2c 20 22 63 6f 72 72  r(context, "corr
59a0: 75 70 74 20 66 6f 73 73 69 6c 20 64 65 6c 74 61  upt fossil delta
59b0: 22 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65 74 75  ", -1);.    retu
59c0: 72 6e 3b 0a 20 20 7d 0a 0a 20 20 61 4f 75 74 20  rn;.  }..  aOut 
59d0: 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
59e0: 28 6e 4f 75 74 2b 31 29 3b 0a 20 20 69 66 28 20  (nOut+1);.  if( 
59f0: 61 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73  aOut==0 ){.    s
5a00: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
5a10: 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78  ror_nomem(contex
5a20: 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t);.  }else{.   
5a30: 20 6e 4f 75 74 32 20 3d 20 72 62 75 44 65 6c 74   nOut2 = rbuDelt
5a40: 61 41 70 70 6c 79 28 61 4f 72 69 67 2c 20 6e 4f  aApply(aOrig, nO
5a50: 72 69 67 2c 20 61 44 65 6c 74 61 2c 20 6e 44 65  rig, aDelta, nDe
5a60: 6c 74 61 2c 20 61 4f 75 74 29 3b 0a 20 20 20 20  lta, aOut);.    
5a70: 69 66 28 20 6e 4f 75 74 32 21 3d 6e 4f 75 74 20  if( nOut2!=nOut 
5a80: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
5a90: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f  _result_error(co
5aa0: 6e 74 65 78 74 2c 20 22 63 6f 72 72 75 70 74 20  ntext, "corrupt 
5ab0: 66 6f 73 73 69 6c 20 64 65 6c 74 61 22 2c 20 2d  fossil delta", -
5ac0: 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  1);.    }else{. 
5ad0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
5ae0: 75 6c 74 5f 62 6c 6f 62 28 63 6f 6e 74 65 78 74  ult_blob(context
5af0: 2c 20 61 4f 75 74 2c 20 6e 4f 75 74 2c 20 73 71  , aOut, nOut, sq
5b00: 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 20 20 20  lite3_free);.   
5b10: 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a   }.  }.}.../*.**
5b20: 20 50 72 65 70 61 72 65 20 74 68 65 20 53 51 4c   Prepare the SQL
5b30: 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 62 75   statement in bu
5b40: 66 66 65 72 20 7a 53 71 6c 20 61 67 61 69 6e 73  ffer zSql agains
5b50: 74 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  t database handl
5b60: 65 20 64 62 2e 0a 2a 2a 20 49 66 20 73 75 63 63  e db..** If succ
5b70: 65 73 73 66 75 6c 2c 20 73 65 74 20 2a 70 70 53  essful, set *ppS
5b80: 74 6d 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  tmt to point to 
5b90: 74 68 65 20 6e 65 77 20 73 74 61 74 65 6d 65 6e  the new statemen
5ba0: 74 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20  t and return.** 
5bb0: 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 0a 2a  SQLITE_OK. .**.*
5bc0: 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
5bd0: 61 6e 20 65 72 72 6f 72 20 64 6f 65 73 20 6f 63  an error does oc
5be0: 63 75 72 2c 20 73 65 74 20 2a 70 70 53 74 6d 74  cur, set *ppStmt
5bf0: 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 72 65 74   to NULL and ret
5c00: 75 72 6e 0a 2a 2a 20 61 6e 20 53 51 4c 69 74 65  urn.** an SQLite
5c10: 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 41 64 64   error code. Add
5c20: 69 74 69 6f 6e 61 6c 6c 79 2c 20 73 65 74 20 6f  itionally, set o
5c30: 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 20 2a  utput variable *
5c40: 70 7a 45 72 72 6d 73 67 20 74 6f 0a 2a 2a 20 70  pzErrmsg to.** p
5c50: 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72  oint to a buffer
5c60: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6e 20 65   containing an e
5c70: 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 20 49 74  rror message. It
5c80: 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
5c90: 62 69 6c 69 74 79 0a 2a 2a 20 6f 66 20 74 68 65  bility.** of the
5ca0: 20 63 61 6c 6c 65 72 20 74 6f 20 28 65 76 65 6e   caller to (even
5cb0: 74 75 61 6c 6c 79 29 20 66 72 65 65 20 74 68 69  tually) free thi
5cc0: 73 20 62 75 66 66 65 72 20 75 73 69 6e 67 20 73  s buffer using s
5cd0: 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a  qlite3_free()..*
5ce0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 65  /.static int pre
5cf0: 70 61 72 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72  pareAndCollectEr
5d00: 72 6f 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ror(.  sqlite3 *
5d10: 64 62 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 73  db, .  sqlite3_s
5d20: 74 6d 74 20 2a 2a 70 70 53 74 6d 74 2c 0a 20 20  tmt **ppStmt,.  
5d30: 63 68 61 72 20 2a 2a 70 7a 45 72 72 6d 73 67 2c  char **pzErrmsg,
5d40: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
5d50: 53 71 6c 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20  Sql.){.  int rc 
5d60: 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
5d70: 65 5f 76 32 28 64 62 2c 20 7a 53 71 6c 2c 20 2d  e_v2(db, zSql, -
5d80: 31 2c 20 70 70 53 74 6d 74 2c 20 30 29 3b 0a 20  1, ppStmt, 0);. 
5d90: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
5da0: 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 7a 45 72 72  OK ){.    *pzErr
5db0: 6d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  msg = sqlite3_mp
5dc0: 72 69 6e 74 66 28 22 25 73 22 2c 20 73 71 6c 69  rintf("%s", sqli
5dd0: 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b  te3_errmsg(db));
5de0: 0a 20 20 20 20 2a 70 70 53 74 6d 74 20 3d 20 30  .    *ppStmt = 0
5df0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
5e00: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65  c;.}../*.** Rese
5e10: 74 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  t the SQL statem
5e20: 65 6e 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ent passed as th
5e30: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
5e40: 2e 20 52 65 74 75 72 6e 20 61 20 63 6f 70 79 0a  . Return a copy.
5e50: 2a 2a 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20  ** of the value 
5e60: 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69  returned by sqli
5e70: 74 65 33 5f 72 65 73 65 74 28 29 2e 0a 2a 2a 0a  te3_reset()..**.
5e80: 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68  ** If an error h
5e90: 61 73 20 6f 63 63 75 72 72 65 64 2c 20 74 68 65  as occurred, the
5ea0: 6e 20 73 65 74 20 2a 70 7a 45 72 72 6d 73 67 20  n set *pzErrmsg 
5eb0: 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75  to point to a bu
5ec0: 66 66 65 72 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69  ffer.** containi
5ed0: 6e 67 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ng an error mess
5ee0: 61 67 65 2e 20 49 74 20 69 73 20 74 68 65 20 72  age. It is the r
5ef0: 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
5f00: 20 74 68 65 20 63 61 6c 6c 65 72 0a 2a 2a 20 74   the caller.** t
5f10: 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65  o eventually fre
5f20: 65 20 74 68 69 73 20 62 75 66 66 65 72 20 75 73  e this buffer us
5f30: 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ing sqlite3_free
5f40: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ()..*/.static in
5f50: 74 20 72 65 73 65 74 41 6e 64 43 6f 6c 6c 65 63  t resetAndCollec
5f60: 74 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 73  tError(sqlite3_s
5f70: 74 6d 74 20 2a 70 53 74 6d 74 2c 20 63 68 61 72  tmt *pStmt, char
5f80: 20 2a 2a 70 7a 45 72 72 6d 73 67 29 7b 0a 20 20   **pzErrmsg){.  
5f90: 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
5fa0: 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20  _reset(pStmt);. 
5fb0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
5fc0: 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 7a 45 72 72  OK ){.    *pzErr
5fd0: 6d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  msg = sqlite3_mp
5fe0: 72 69 6e 74 66 28 22 25 73 22 2c 20 73 71 6c 69  rintf("%s", sqli
5ff0: 74 65 33 5f 65 72 72 6d 73 67 28 73 71 6c 69 74  te3_errmsg(sqlit
6000: 65 33 5f 64 62 5f 68 61 6e 64 6c 65 28 70 53 74  e3_db_handle(pSt
6010: 6d 74 29 29 29 3b 0a 20 20 7d 0a 20 20 72 65 74  mt)));.  }.  ret
6020: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
6030: 20 55 6e 6c 65 73 73 20 69 74 20 69 73 20 4e 55   Unless it is NU
6040: 4c 4c 2c 20 61 72 67 75 6d 65 6e 74 20 7a 53 71  LL, argument zSq
6050: 6c 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 62 75  l points to a bu
6060: 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 75  ffer allocated u
6070: 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  sing.** sqlite3_
6080: 6d 61 6c 6c 6f 63 20 63 6f 6e 74 61 69 6e 69 6e  malloc containin
6090: 67 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65  g an SQL stateme
60a0: 6e 74 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  nt. This functio
60b0: 6e 20 70 72 65 70 61 72 65 73 20 74 68 65 20 53  n prepares the S
60c0: 51 4c 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  QL.** statement 
60d0: 61 67 61 69 6e 73 74 20 64 61 74 61 62 61 73 65  against database
60e0: 20 64 62 20 61 6e 64 20 66 72 65 65 73 20 74 68   db and frees th
60f0: 65 20 62 75 66 66 65 72 2e 20 49 66 20 73 74 61  e buffer. If sta
6100: 74 65 6d 65 6e 74 20 0a 2a 2a 20 63 6f 6d 70 69  tement .** compi
6110: 6c 61 74 69 6f 6e 20 69 73 20 73 75 63 63 65 73  lation is succes
6120: 73 66 75 6c 2c 20 2a 70 70 53 74 6d 74 20 69 73  sful, *ppStmt is
6130: 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
6140: 20 74 68 65 20 6e 65 77 20 73 74 61 74 65 6d 65   the new stateme
6150: 6e 74 20 0a 2a 2a 20 68 61 6e 64 6c 65 20 61 6e  nt .** handle an
6160: 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  d SQLITE_OK is r
6170: 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 0a 2a 2a 20  eturned. .**.** 
6180: 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 6e  Otherwise, if an
6190: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a   error occurs, *
61a0: 70 70 53 74 6d 74 20 69 73 20 73 65 74 20 74 6f  ppStmt is set to
61b0: 20 4e 55 4c 4c 20 61 6e 64 20 61 6e 20 65 72 72   NULL and an err
61c0: 6f 72 20 63 6f 64 65 0a 2a 2a 20 72 65 74 75 72  or code.** retur
61d0: 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ned. In this cas
61e0: 65 2c 20 2a 70 7a 45 72 72 6d 73 67 20 6d 61 79  e, *pzErrmsg may
61f0: 20 61 6c 73 6f 20 62 65 20 73 65 74 20 74 6f 20   also be set to 
6200: 70 6f 69 6e 74 20 74 6f 20 61 6e 20 65 72 72 6f  point to an erro
6210: 72 0a 2a 2a 20 6d 65 73 73 61 67 65 2e 20 49 74  r.** message. It
6220: 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
6230: 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
6240: 6c 6c 65 72 20 74 6f 20 66 72 65 65 20 74 68 69  ller to free thi
6250: 73 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a  s error message.
6260: 2a 2a 20 62 75 66 66 65 72 20 75 73 69 6e 67 20  ** buffer using 
6270: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a  sqlite3_free()..
6280: 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e  **.** If argumen
6290: 74 20 7a 53 71 6c 20 69 73 20 4e 55 4c 4c 2c 20  t zSql is NULL, 
62a0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73  this function as
62b0: 73 75 6d 65 73 20 74 68 61 74 20 61 6e 20 4f 4f  sumes that an OO
62c0: 4d 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e 0a  M has occurred..
62d0: 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  ** In this case 
62e0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20  SQLITE_NOMEM is 
62f0: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70  returned and *pp
6300: 53 74 6d 74 20 73 65 74 20 74 6f 20 4e 55 4c 4c  Stmt set to NULL
6310: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6320: 70 72 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f  prepareFreeAndCo
6330: 6c 6c 65 63 74 45 72 72 6f 72 28 0a 20 20 73 71  llectError(.  sq
6340: 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 73 71  lite3 *db, .  sq
6350: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53  lite3_stmt **ppS
6360: 74 6d 74 2c 0a 20 20 63 68 61 72 20 2a 2a 70 7a  tmt,.  char **pz
6370: 45 72 72 6d 73 67 2c 0a 20 20 63 68 61 72 20 2a  Errmsg,.  char *
6380: 7a 53 71 6c 0a 29 7b 0a 20 20 69 6e 74 20 72 63  zSql.){.  int rc
6390: 3b 0a 20 20 61 73 73 65 72 74 28 20 2a 70 7a 45  ;.  assert( *pzE
63a0: 72 72 6d 73 67 3d 3d 30 20 29 3b 0a 20 20 69 66  rrmsg==0 );.  if
63b0: 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20  ( zSql==0 ){.   
63c0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
63d0: 45 4d 3b 0a 20 20 20 20 2a 70 70 53 74 6d 74 20  EM;.    *ppStmt 
63e0: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
63f0: 20 20 72 63 20 3d 20 70 72 65 70 61 72 65 41 6e    rc = prepareAn
6400: 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 64 62  dCollectError(db
6410: 2c 20 70 70 53 74 6d 74 2c 20 70 7a 45 72 72 6d  , ppStmt, pzErrm
6420: 73 67 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 73  sg, zSql);.    s
6430: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c  qlite3_free(zSql
6440: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
6450: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  rc;.}../*.** Fre
6460: 65 20 74 68 65 20 52 62 75 4f 62 6a 49 74 65 72  e the RbuObjIter
6470: 2e 61 7a 54 62 6c 43 6f 6c 5b 5d 20 61 6e 64 20  .azTblCol[] and 
6480: 52 62 75 4f 62 6a 49 74 65 72 2e 61 62 54 62 6c  RbuObjIter.abTbl
6490: 50 6b 5b 5d 20 61 72 72 61 79 73 20 61 6c 6c 6f  Pk[] arrays allo
64a0: 63 61 74 65 64 0a 2a 2a 20 62 79 20 61 6e 20 65  cated.** by an e
64b0: 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20 72  arlier call to r
64c0: 62 75 4f 62 6a 49 74 65 72 43 61 63 68 65 54 61  buObjIterCacheTa
64d0: 62 6c 65 49 6e 66 6f 28 29 2e 0a 2a 2f 0a 73 74  bleInfo()..*/.st
64e0: 61 74 69 63 20 76 6f 69 64 20 72 62 75 4f 62 6a  atic void rbuObj
64f0: 49 74 65 72 46 72 65 65 43 6f 6c 73 28 52 62 75  IterFreeCols(Rbu
6500: 4f 62 6a 49 74 65 72 20 2a 70 49 74 65 72 29 7b  ObjIter *pIter){
6510: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
6520: 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 54  i=0; i<pIter->nT
6530: 62 6c 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  blCol; i++){.   
6540: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49   sqlite3_free(pI
6550: 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69 5d  ter->azTblCol[i]
6560: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
6570: 72 65 65 28 70 49 74 65 72 2d 3e 61 7a 54 62 6c  ree(pIter->azTbl
6580: 54 79 70 65 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20  Type[i]);.  }.  
6590: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 74  sqlite3_free(pIt
65a0: 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 29 3b 0a 20  er->azTblCol);. 
65b0: 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c   pIter->azTblCol
65c0: 20 3d 20 30 3b 0a 20 20 70 49 74 65 72 2d 3e 61   = 0;.  pIter->a
65d0: 7a 54 62 6c 54 79 70 65 20 3d 20 30 3b 0a 20 20  zTblType = 0;.  
65e0: 70 49 74 65 72 2d 3e 61 69 53 72 63 4f 72 64 65  pIter->aiSrcOrde
65f0: 72 20 3d 20 30 3b 0a 20 20 70 49 74 65 72 2d 3e  r = 0;.  pIter->
6600: 61 62 54 62 6c 50 6b 20 3d 20 30 3b 0a 20 20 70  abTblPk = 0;.  p
6610: 49 74 65 72 2d 3e 61 62 4e 6f 74 4e 75 6c 6c 20  Iter->abNotNull 
6620: 3d 20 30 3b 0a 20 20 70 49 74 65 72 2d 3e 6e 54  = 0;.  pIter->nT
6630: 62 6c 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 49 74  blCol = 0;.  pIt
6640: 65 72 2d 3e 65 54 79 70 65 20 3d 20 30 3b 20 20  er->eType = 0;  
6650: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6660: 49 6e 76 61 6c 69 64 20 76 61 6c 75 65 20 2a 2f  Invalid value */
6670: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 61 6c 69  .}../*.** Finali
6680: 7a 65 20 61 6c 6c 20 73 74 61 74 65 6d 65 6e 74  ze all statement
6690: 73 20 61 6e 64 20 66 72 65 65 20 61 6c 6c 20 61  s and free all a
66a0: 6c 6c 6f 63 61 74 69 6f 6e 73 20 74 68 61 74 20  llocations that 
66b0: 61 72 65 20 73 70 65 63 69 66 69 63 20 74 6f 0a  are specific to.
66c0: 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 6f  ** the current o
66d0: 62 6a 65 63 74 20 28 74 61 62 6c 65 2f 69 6e 64  bject (table/ind
66e0: 65 78 20 70 61 69 72 29 2e 0a 2a 2f 0a 73 74 61  ex pair)..*/.sta
66f0: 74 69 63 20 76 6f 69 64 20 72 62 75 4f 62 6a 49  tic void rbuObjI
6700: 74 65 72 43 6c 65 61 72 53 74 61 74 65 6d 65 6e  terClearStatemen
6710: 74 73 28 52 62 75 4f 62 6a 49 74 65 72 20 2a 70  ts(RbuObjIter *p
6720: 49 74 65 72 29 7b 0a 20 20 52 62 75 55 70 64 61  Iter){.  RbuUpda
6730: 74 65 53 74 6d 74 20 2a 70 55 70 3b 0a 0a 20 20  teStmt *pUp;..  
6740: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
6750: 28 70 49 74 65 72 2d 3e 70 53 65 6c 65 63 74 29  (pIter->pSelect)
6760: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  ;.  sqlite3_fina
6770: 6c 69 7a 65 28 70 49 74 65 72 2d 3e 70 49 6e 73  lize(pIter->pIns
6780: 65 72 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ert);.  sqlite3_
6790: 66 69 6e 61 6c 69 7a 65 28 70 49 74 65 72 2d 3e  finalize(pIter->
67a0: 70 44 65 6c 65 74 65 29 3b 0a 20 20 73 71 6c 69  pDelete);.  sqli
67b0: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 49 74  te3_finalize(pIt
67c0: 65 72 2d 3e 70 54 6d 70 49 6e 73 65 72 74 29 3b  er->pTmpInsert);
67d0: 0a 20 20 70 55 70 20 3d 20 70 49 74 65 72 2d 3e  .  pUp = pIter->
67e0: 70 52 62 75 55 70 64 61 74 65 3b 0a 20 20 77 68  pRbuUpdate;.  wh
67f0: 69 6c 65 28 20 70 55 70 20 29 7b 0a 20 20 20 20  ile( pUp ){.    
6800: 52 62 75 55 70 64 61 74 65 53 74 6d 74 20 2a 70  RbuUpdateStmt *p
6810: 54 6d 70 20 3d 20 70 55 70 2d 3e 70 4e 65 78 74  Tmp = pUp->pNext
6820: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  ;.    sqlite3_fi
6830: 6e 61 6c 69 7a 65 28 70 55 70 2d 3e 70 55 70 64  nalize(pUp->pUpd
6840: 61 74 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ate);.    sqlite
6850: 33 5f 66 72 65 65 28 70 55 70 29 3b 0a 20 20 20  3_free(pUp);.   
6860: 20 70 55 70 20 3d 20 70 54 6d 70 3b 0a 20 20 7d   pUp = pTmp;.  }
6870: 0a 20 20 0a 20 20 70 49 74 65 72 2d 3e 70 53 65  .  .  pIter->pSe
6880: 6c 65 63 74 20 3d 20 30 3b 0a 20 20 70 49 74 65  lect = 0;.  pIte
6890: 72 2d 3e 70 49 6e 73 65 72 74 20 3d 20 30 3b 0a  r->pInsert = 0;.
68a0: 20 20 70 49 74 65 72 2d 3e 70 44 65 6c 65 74 65    pIter->pDelete
68b0: 20 3d 20 30 3b 0a 20 20 70 49 74 65 72 2d 3e 70   = 0;.  pIter->p
68c0: 52 62 75 55 70 64 61 74 65 20 3d 20 30 3b 0a 20  RbuUpdate = 0;. 
68d0: 20 70 49 74 65 72 2d 3e 70 54 6d 70 49 6e 73 65   pIter->pTmpInse
68e0: 72 74 20 3d 20 30 3b 0a 20 20 70 49 74 65 72 2d  rt = 0;.  pIter-
68f0: 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  >nCol = 0;.}../*
6900: 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61 6e 79  .** Clean up any
6910: 20 72 65 73 6f 75 72 63 65 73 20 61 6c 6c 6f 63   resources alloc
6920: 61 74 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  ated as part of 
6930: 74 68 65 20 69 74 65 72 61 74 6f 72 20 6f 62 6a  the iterator obj
6940: 65 63 74 20 70 61 73 73 65 64 0a 2a 2a 20 61 73  ect passed.** as
6950: 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65   the only argume
6960: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nt..*/.static vo
6970: 69 64 20 72 62 75 4f 62 6a 49 74 65 72 46 69 6e  id rbuObjIterFin
6980: 61 6c 69 7a 65 28 52 62 75 4f 62 6a 49 74 65 72  alize(RbuObjIter
6990: 20 2a 70 49 74 65 72 29 7b 0a 20 20 72 62 75 4f   *pIter){.  rbuO
69a0: 62 6a 49 74 65 72 43 6c 65 61 72 53 74 61 74 65  bjIterClearState
69b0: 6d 65 6e 74 73 28 70 49 74 65 72 29 3b 0a 20 20  ments(pIter);.  
69c0: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
69d0: 28 70 49 74 65 72 2d 3e 70 54 62 6c 49 74 65 72  (pIter->pTblIter
69e0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  );.  sqlite3_fin
69f0: 61 6c 69 7a 65 28 70 49 74 65 72 2d 3e 70 49 64  alize(pIter->pId
6a00: 78 49 74 65 72 29 3b 0a 20 20 72 62 75 4f 62 6a  xIter);.  rbuObj
6a10: 49 74 65 72 46 72 65 65 43 6f 6c 73 28 70 49 74  IterFreeCols(pIt
6a20: 65 72 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 49  er);.  memset(pI
6a30: 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 52  ter, 0, sizeof(R
6a40: 62 75 4f 62 6a 49 74 65 72 29 29 3b 0a 7d 0a 0a  buObjIter));.}..
6a50: 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68  /*.** Advance th
6a60: 65 20 69 74 65 72 61 74 6f 72 20 74 6f 20 74 68  e iterator to th
6a70: 65 20 6e 65 78 74 20 70 6f 73 69 74 69 6f 6e 2e  e next position.
6a80: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 65 72 72  .**.** If no err
6a90: 6f 72 20 6f 63 63 75 72 73 2c 20 53 51 4c 49 54  or occurs, SQLIT
6aa0: 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
6ab0: 20 61 6e 64 20 74 68 65 20 69 74 65 72 61 74 6f   and the iterato
6ac0: 72 20 69 73 20 6c 65 66 74 20 0a 2a 2a 20 70 6f  r is left .** po
6ad0: 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6e 65  inting to the ne
6ae0: 78 74 20 65 6e 74 72 79 2e 20 4f 74 68 65 72 77  xt entry. Otherw
6af0: 69 73 65 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f  ise, an error co
6b00: 64 65 20 61 6e 64 20 6d 65 73 73 61 67 65 20 69  de and message i
6b10: 73 20 0a 2a 2a 20 6c 65 66 74 20 69 6e 20 74 68  s .** left in th
6b20: 65 20 52 42 55 20 68 61 6e 64 6c 65 20 70 61 73  e RBU handle pas
6b30: 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
6b40: 20 61 72 67 75 6d 65 6e 74 2e 20 41 20 63 6f 70   argument. A cop
6b50: 79 20 6f 66 20 74 68 65 20 0a 2a 2a 20 65 72 72  y of the .** err
6b60: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
6b70: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
6b80: 6e 74 20 72 62 75 4f 62 6a 49 74 65 72 4e 65 78  nt rbuObjIterNex
6b90: 74 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c  t(sqlite3rbu *p,
6ba0: 20 52 62 75 4f 62 6a 49 74 65 72 20 2a 70 49 74   RbuObjIter *pIt
6bb0: 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
6bc0: 70 2d 3e 72 63 3b 0a 20 20 69 66 28 20 72 63 3d  p->rc;.  if( rc=
6bd0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 0a 20  =SQLITE_OK ){.. 
6be0: 20 20 20 2f 2a 20 46 72 65 65 20 61 6e 79 20 53     /* Free any S
6bf0: 51 4c 69 74 65 20 73 74 61 74 65 6d 65 6e 74 73  QLite statements
6c00: 20 75 73 65 64 20 77 68 69 6c 65 20 70 72 6f 63   used while proc
6c10: 65 73 73 69 6e 67 20 74 68 65 20 70 72 65 76 69  essing the previ
6c20: 6f 75 73 20 6f 62 6a 65 63 74 20 2a 2f 20 0a 20  ous object */ . 
6c30: 20 20 20 72 62 75 4f 62 6a 49 74 65 72 43 6c 65     rbuObjIterCle
6c40: 61 72 53 74 61 74 65 6d 65 6e 74 73 28 70 49 74  arStatements(pIt
6c50: 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74  er);.    if( pIt
6c60: 65 72 2d 3e 7a 49 64 78 3d 3d 30 20 29 7b 0a 20  er->zIdx==0 ){. 
6c70: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
6c80: 33 5f 65 78 65 63 28 70 2d 3e 64 62 4d 61 69 6e  3_exec(p->dbMain
6c90: 2c 0a 20 20 20 20 20 20 20 20 20 20 22 44 52 4f  ,.          "DRO
6ca0: 50 20 54 52 49 47 47 45 52 20 49 46 20 45 58 49  P TRIGGER IF EXI
6cb0: 53 54 53 20 74 65 6d 70 2e 72 62 75 5f 69 6e 73  STS temp.rbu_ins
6cc0: 65 72 74 5f 74 72 3b 22 0a 20 20 20 20 20 20 20  ert_tr;".       
6cd0: 20 20 20 22 44 52 4f 50 20 54 52 49 47 47 45 52     "DROP TRIGGER
6ce0: 20 49 46 20 45 58 49 53 54 53 20 74 65 6d 70 2e   IF EXISTS temp.
6cf0: 72 62 75 5f 75 70 64 61 74 65 31 5f 74 72 3b 22  rbu_update1_tr;"
6d00: 0a 20 20 20 20 20 20 20 20 20 20 22 44 52 4f 50  .          "DROP
6d10: 20 54 52 49 47 47 45 52 20 49 46 20 45 58 49 53   TRIGGER IF EXIS
6d20: 54 53 20 74 65 6d 70 2e 72 62 75 5f 75 70 64 61  TS temp.rbu_upda
6d30: 74 65 32 5f 74 72 3b 22 0a 20 20 20 20 20 20 20  te2_tr;".       
6d40: 20 20 20 22 44 52 4f 50 20 54 52 49 47 47 45 52     "DROP TRIGGER
6d50: 20 49 46 20 45 58 49 53 54 53 20 74 65 6d 70 2e   IF EXISTS temp.
6d60: 72 62 75 5f 64 65 6c 65 74 65 5f 74 72 3b 22 0a  rbu_delete_tr;".
6d70: 20 20 20 20 20 20 20 20 20 20 2c 20 30 2c 20 30            , 0, 0
6d80: 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 0a 20 20  , &p->zErrmsg.  
6d90: 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20      );.    }..  
6da0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
6db0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  _OK ){.      if(
6dc0: 20 70 49 74 65 72 2d 3e 62 43 6c 65 61 6e 75 70   pIter->bCleanup
6dd0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 62 75 4f   ){.        rbuO
6de0: 62 6a 49 74 65 72 46 72 65 65 43 6f 6c 73 28 70  bjIterFreeCols(p
6df0: 49 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 70  Iter);.        p
6e00: 49 74 65 72 2d 3e 62 43 6c 65 61 6e 75 70 20 3d  Iter->bCleanup =
6e10: 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   0;.        rc =
6e20: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 49   sqlite3_step(pI
6e30: 74 65 72 2d 3e 70 54 62 6c 49 74 65 72 29 3b 0a  ter->pTblIter);.
6e40: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
6e50: 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
6e60: 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 65 73          rc = res
6e70: 65 74 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f  etAndCollectErro
6e80: 72 28 70 49 74 65 72 2d 3e 70 54 62 6c 49 74 65  r(pIter->pTblIte
6e90: 72 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 29 3b  r, &p->zErrmsg);
6ea0: 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72  .          pIter
6eb0: 2d 3e 7a 54 62 6c 20 3d 20 30 3b 0a 20 20 20 20  ->zTbl = 0;.    
6ec0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6ed0: 20 20 20 20 20 70 49 74 65 72 2d 3e 7a 54 62 6c       pIter->zTbl
6ee0: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
6ef0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
6f00: 65 78 74 28 70 49 74 65 72 2d 3e 70 54 62 6c 49  ext(pIter->pTblI
6f10: 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ter, 0);.       
6f20: 20 20 20 70 49 74 65 72 2d 3e 7a 44 61 74 61 54     pIter->zDataT
6f30: 62 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  bl = (const char
6f40: 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
6f50: 5f 74 65 78 74 28 70 49 74 65 72 2d 3e 70 54 62  _text(pIter->pTb
6f60: 6c 49 74 65 72 2c 31 29 3b 0a 20 20 20 20 20 20  lIter,1);.      
6f70: 20 20 20 20 72 63 20 3d 20 28 70 49 74 65 72 2d      rc = (pIter-
6f80: 3e 7a 44 61 74 61 54 62 6c 20 26 26 20 70 49 74  >zDataTbl && pIt
6f90: 65 72 2d 3e 7a 54 62 6c 29 20 3f 20 53 51 4c 49  er->zTbl) ? SQLI
6fa0: 54 45 5f 4f 4b 20 3a 20 53 51 4c 49 54 45 5f 4e  TE_OK : SQLITE_N
6fb0: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 7d 0a  OMEM;.        }.
6fc0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
6fd0: 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e       if( pIter->
6fe0: 7a 49 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  zIdx==0 ){.     
6ff0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d       sqlite3_stm
7000: 74 20 2a 70 49 64 78 20 3d 20 70 49 74 65 72 2d  t *pIdx = pIter-
7010: 3e 70 49 64 78 49 74 65 72 3b 0a 20 20 20 20 20  >pIdxIter;.     
7020: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
7030: 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 49 64 78  3_bind_text(pIdx
7040: 2c 20 31 2c 20 70 49 74 65 72 2d 3e 7a 54 62 6c  , 1, pIter->zTbl
7050: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41  , -1, SQLITE_STA
7060: 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  TIC);.        }.
7070: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
7080: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
7090: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
70a0: 74 65 33 5f 73 74 65 70 28 70 49 74 65 72 2d 3e  te3_step(pIter->
70b0: 70 49 64 78 49 74 65 72 29 3b 0a 20 20 20 20 20  pIdxIter);.     
70c0: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
70d0: 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20  ITE_ROW ){.     
70e0: 20 20 20 20 20 20 20 72 63 20 3d 20 72 65 73 65         rc = rese
70f0: 74 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72  tAndCollectError
7100: 28 70 49 74 65 72 2d 3e 70 49 64 78 49 74 65 72  (pIter->pIdxIter
7110: 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a  , &p->zErrmsg);.
7120: 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
7130: 72 2d 3e 62 43 6c 65 61 6e 75 70 20 3d 20 31 3b  r->bCleanup = 1;
7140: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74  .            pIt
7150: 65 72 2d 3e 7a 49 64 78 20 3d 20 30 3b 0a 20 20  er->zIdx = 0;.  
7160: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
7170: 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72             pIter
7180: 2d 3e 7a 49 64 78 20 3d 20 28 63 6f 6e 73 74 20  ->zIdx = (const 
7190: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
71a0: 6c 75 6d 6e 5f 74 65 78 74 28 70 49 74 65 72 2d  lumn_text(pIter-
71b0: 3e 70 49 64 78 49 74 65 72 2c 20 30 29 3b 0a 20  >pIdxIter, 0);. 
71c0: 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72             pIter
71d0: 2d 3e 69 54 6e 75 6d 20 3d 20 73 71 6c 69 74 65  ->iTnum = sqlite
71e0: 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 49 74  3_column_int(pIt
71f0: 65 72 2d 3e 70 49 64 78 49 74 65 72 2c 20 31 29  er->pIdxIter, 1)
7200: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49  ;.            pI
7210: 74 65 72 2d 3e 62 55 6e 69 71 75 65 20 3d 20 73  ter->bUnique = s
7220: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
7230: 74 28 70 49 74 65 72 2d 3e 70 49 64 78 49 74 65  t(pIter->pIdxIte
7240: 72 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20 20  r, 2);.         
7250: 20 20 20 72 63 20 3d 20 70 49 74 65 72 2d 3e 7a     rc = pIter->z
7260: 49 64 78 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20  Idx ? SQLITE_OK 
7270: 3a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  : SQLITE_NOMEM;.
7280: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
7290: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
72a0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72    }.  }..  if( r
72b0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
72c0: 20 20 20 20 72 62 75 4f 62 6a 49 74 65 72 46 69      rbuObjIterFi
72d0: 6e 61 6c 69 7a 65 28 70 49 74 65 72 29 3b 0a 20  nalize(pIter);. 
72e0: 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20     p->rc = rc;. 
72f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
7300: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6d  }.../*.** The im
7310: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
7320: 74 68 65 20 72 62 75 5f 74 61 72 67 65 74 5f 6e  the rbu_target_n
7330: 61 6d 65 28 29 20 53 51 4c 20 66 75 6e 63 74 69  ame() SQL functi
7340: 6f 6e 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  on. This functio
7350: 6e 0a 2a 2a 20 61 63 63 65 70 74 73 20 6f 6e 65  n.** accepts one
7360: 20 6f 72 20 74 77 6f 20 61 72 67 75 6d 65 6e 74   or two argument
7370: 73 2e 20 54 68 65 20 66 69 72 73 74 20 61 72 67  s. The first arg
7380: 75 6d 65 6e 74 20 69 73 20 74 68 65 20 6e 61 6d  ument is the nam
7390: 65 20 6f 66 20 61 20 74 61 62 6c 65 20 2d 0a 2a  e of a table -.*
73a0: 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  * the name of a 
73b0: 74 61 62 6c 65 20 69 6e 20 74 68 65 20 52 42 55  table in the RBU
73c0: 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20   database.  The 
73d0: 73 65 63 6f 6e 64 2c 20 69 66 20 69 74 20 69 73  second, if it is
73e0: 20 70 72 65 73 65 6e 74 2c 20 69 73 20 31 0a 2a   present, is 1.*
73f0: 2a 20 66 6f 72 20 61 20 76 69 65 77 20 6f 72 20  * for a view or 
7400: 30 20 66 6f 72 20 61 20 74 61 62 6c 65 2e 20 0a  0 for a table. .
7410: 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 6e 6f 6e 2d  **.** For a non-
7420: 76 61 63 75 75 6d 20 52 42 55 20 68 61 6e 64 6c  vacuum RBU handl
7430: 65 2c 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  e, if the table 
7440: 6e 61 6d 65 20 6d 61 74 63 68 65 73 20 74 68 65  name matches the
7450: 20 70 61 74 74 65 72 6e 3a 0a 2a 2a 0a 2a 2a 20   pattern:.**.** 
7460: 20 20 20 20 64 61 74 61 5b 30 2d 39 5d 5f 3c 6e      data[0-9]_<n
7470: 61 6d 65 3e 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65  ame>.**.** where
7480: 20 3c 6e 61 6d 65 3e 20 69 73 20 61 6e 79 20 73   <name> is any s
7490: 65 71 75 65 6e 63 65 20 6f 66 20 31 20 6f 72 20  equence of 1 or 
74a0: 6d 6f 72 65 20 63 68 61 72 61 63 74 65 72 73 2c  more characters,
74b0: 20 3c 6e 61 6d 65 3e 20 69 73 20 72 65 74 75 72   <name> is retur
74c0: 6e 65 64 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ned..** Otherwis
74d0: 65 2c 20 69 66 20 74 68 65 20 6f 6e 6c 79 20 61  e, if the only a
74e0: 72 67 75 6d 65 6e 74 20 64 6f 65 73 20 6e 6f 74  rgument does not
74f0: 20 6d 61 74 63 68 20 74 68 65 20 61 62 6f 76 65   match the above
7500: 20 70 61 74 74 65 72 6e 2c 20 61 6e 20 53 51 4c   pattern, an SQL
7510: 0a 2a 2a 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  .** NULL is retu
7520: 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  rned..**.**     
7530: 22 64 61 74 61 5f 74 31 22 20 20 20 20 20 2d 3e  "data_t1"     ->
7540: 20 22 74 31 22 0a 2a 2a 20 20 20 20 20 22 64 61   "t1".**     "da
7550: 74 61 30 31 32 33 5f 74 32 22 20 2d 3e 20 22 74  ta0123_t2" -> "t
7560: 32 22 0a 2a 2a 20 20 20 20 20 22 64 61 74 61 41  2".**     "dataA
7570: 42 5f 74 33 22 20 20 20 2d 3e 20 4e 55 4c 4c 0a  B_t3"   -> NULL.
7580: 2a 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 72 62 75  **.** For an rbu
7590: 20 76 61 63 75 75 6d 20 68 61 6e 64 6c 65 2c 20   vacuum handle, 
75a0: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 66 69  a copy of the fi
75b0: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  rst argument is 
75c0: 72 65 74 75 72 6e 65 64 20 69 66 0a 2a 2a 20 74  returned if.** t
75d0: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
75e0: 6e 74 20 69 73 20 65 69 74 68 65 72 20 6d 69 73  nt is either mis
75f0: 73 69 6e 67 20 6f 72 20 30 20 28 6e 6f 74 20 61  sing or 0 (not a
7600: 20 76 69 65 77 29 2e 0a 2a 2f 0a 73 74 61 74 69   view)..*/.stati
7610: 63 20 76 6f 69 64 20 72 62 75 54 61 72 67 65 74  c void rbuTarget
7620: 4e 61 6d 65 46 75 6e 63 28 0a 20 20 73 71 6c 69  NameFunc(.  sqli
7630: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74  te3_context *pCt
7640: 78 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  x,.  int argc,. 
7650: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
7660: 2a 61 72 67 76 0a 29 7b 0a 20 20 73 71 6c 69 74  *argv.){.  sqlit
7670: 65 33 72 62 75 20 2a 70 20 3d 20 73 71 6c 69 74  e3rbu *p = sqlit
7680: 65 33 5f 75 73 65 72 5f 64 61 74 61 28 70 43 74  e3_user_data(pCt
7690: 78 29 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  x);.  const char
76a0: 20 2a 7a 49 6e 3b 0a 20 20 61 73 73 65 72 74 28   *zIn;.  assert(
76b0: 20 61 72 67 63 3d 3d 31 20 7c 7c 20 61 72 67 63   argc==1 || argc
76c0: 3d 3d 32 20 29 3b 0a 0a 20 20 7a 49 6e 20 3d 20  ==2 );..  zIn = 
76d0: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
76e0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
76f0: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28 20  argv[0]);.  if( 
7700: 7a 49 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 72  zIn ){.    if( r
7710: 62 75 49 73 56 61 63 75 75 6d 28 70 29 20 29 7b  buIsVacuum(p) ){
7720: 0a 20 20 20 20 20 20 69 66 28 20 61 72 67 63 3d  .      if( argc=
7730: 3d 31 20 7c 7c 20 30 3d 3d 73 71 6c 69 74 65 33  =1 || 0==sqlite3
7740: 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b  _value_int(argv[
7750: 31 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  1]) ){.        s
7760: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
7770: 78 74 28 70 43 74 78 2c 20 7a 49 6e 2c 20 2d 31  xt(pCtx, zIn, -1
7780: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
7790: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
77a0: 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 73  lse{.      if( s
77b0: 74 72 6c 65 6e 28 7a 49 6e 29 3e 34 20 26 26 20  trlen(zIn)>4 && 
77c0: 6d 65 6d 63 6d 70 28 22 64 61 74 61 22 2c 20 7a  memcmp("data", z
77d0: 49 6e 2c 20 34 29 3d 3d 30 20 29 7b 0a 20 20 20  In, 4)==0 ){.   
77e0: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
77f0: 20 20 20 20 66 6f 72 28 69 3d 34 3b 20 7a 49 6e      for(i=4; zIn
7800: 5b 69 5d 3e 3d 27 30 27 20 26 26 20 7a 49 6e 5b  [i]>='0' && zIn[
7810: 69 5d 3c 3d 27 39 27 3b 20 69 2b 2b 29 3b 0a 20  i]<='9'; i++);. 
7820: 20 20 20 20 20 20 20 69 66 28 20 7a 49 6e 5b 69         if( zIn[i
7830: 5d 3d 3d 27 5f 27 20 26 26 20 7a 49 6e 5b 69 2b  ]=='_' && zIn[i+
7840: 31 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  1] ){.          
7850: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
7860: 65 78 74 28 70 43 74 78 2c 20 26 7a 49 6e 5b 69  ext(pCtx, &zIn[i
7870: 2b 31 5d 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  +1], -1, SQLITE_
7880: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20  STATIC);.       
7890: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
78a0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  .  }.}../*.** In
78b0: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 69 74 65  itialize the ite
78c0: 72 61 74 6f 72 20 73 74 72 75 63 74 75 72 65 20  rator structure 
78d0: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
78e0: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  cond argument..*
78f0: 2a 0a 2a 2a 20 49 66 20 6e 6f 20 65 72 72 6f 72  *.** If no error
7900: 20 6f 63 63 75 72 73 2c 20 53 51 4c 49 54 45 5f   occurs, SQLITE_
7910: 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  OK is returned a
7920: 6e 64 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  nd the iterator 
7930: 69 73 20 6c 65 66 74 20 0a 2a 2a 20 70 6f 69 6e  is left .** poin
7940: 74 69 6e 67 20 74 6f 20 74 68 65 20 66 69 72 73  ting to the firs
7950: 74 20 65 6e 74 72 79 2e 20 4f 74 68 65 72 77 69  t entry. Otherwi
7960: 73 65 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  se, an error cod
7970: 65 20 61 6e 64 20 6d 65 73 73 61 67 65 20 69 73  e and message is
7980: 20 0a 2a 2a 20 6c 65 66 74 20 69 6e 20 74 68 65   .** left in the
7990: 20 52 42 55 20 68 61 6e 64 6c 65 20 70 61 73 73   RBU handle pass
79a0: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
79b0: 61 72 67 75 6d 65 6e 74 2e 20 41 20 63 6f 70 79  argument. A copy
79c0: 20 6f 66 20 74 68 65 20 0a 2a 2a 20 65 72 72 6f   of the .** erro
79d0: 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
79e0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
79f0: 74 20 72 62 75 4f 62 6a 49 74 65 72 46 69 72 73  t rbuObjIterFirs
7a00: 74 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c  t(sqlite3rbu *p,
7a10: 20 52 62 75 4f 62 6a 49 74 65 72 20 2a 70 49 74   RbuObjIter *pIt
7a20: 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
7a30: 20 6d 65 6d 73 65 74 28 70 49 74 65 72 2c 20 30   memset(pIter, 0
7a40: 2c 20 73 69 7a 65 6f 66 28 52 62 75 4f 62 6a 49  , sizeof(RbuObjI
7a50: 74 65 72 29 29 3b 0a 0a 20 20 72 63 20 3d 20 70  ter));..  rc = p
7a60: 72 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f 6c  repareFreeAndCol
7a70: 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 52  lectError(p->dbR
7a80: 62 75 2c 20 26 70 49 74 65 72 2d 3e 70 54 62 6c  bu, &pIter->pTbl
7a90: 49 74 65 72 2c 20 26 70 2d 3e 7a 45 72 72 6d 73  Iter, &p->zErrms
7aa0: 67 2c 20 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  g, .    sqlite3_
7ab0: 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 22  mprintf(.      "
7ac0: 53 45 4c 45 43 54 20 72 62 75 5f 74 61 72 67 65  SELECT rbu_targe
7ad0: 74 5f 6e 61 6d 65 28 6e 61 6d 65 2c 20 74 79 70  t_name(name, typ
7ae0: 65 3d 27 76 69 65 77 27 29 20 41 53 20 74 61 72  e='view') AS tar
7af0: 67 65 74 2c 20 6e 61 6d 65 20 22 0a 20 20 20 20  get, name ".    
7b00: 20 20 22 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d    "FROM sqlite_m
7b10: 61 73 74 65 72 20 22 0a 20 20 20 20 20 20 22 57  aster ".      "W
7b20: 48 45 52 45 20 74 79 70 65 20 49 4e 20 28 27 74  HERE type IN ('t
7b30: 61 62 6c 65 27 2c 20 27 76 69 65 77 27 29 20 41  able', 'view') A
7b40: 4e 44 20 74 61 72 67 65 74 20 49 53 20 4e 4f 54  ND target IS NOT
7b50: 20 4e 55 4c 4c 20 22 0a 20 20 20 20 20 20 22 20   NULL ".      " 
7b60: 25 73 20 22 0a 20 20 20 20 20 20 22 4f 52 44 45  %s ".      "ORDE
7b70: 52 20 42 59 20 6e 61 6d 65 22 0a 20 20 2c 20 72  R BY name".  , r
7b80: 62 75 49 73 56 61 63 75 75 6d 28 70 29 20 3f 20  buIsVacuum(p) ? 
7b90: 22 41 4e 44 20 72 6f 6f 74 70 61 67 65 21 3d 30  "AND rootpage!=0
7ba0: 20 41 4e 44 20 72 6f 6f 74 70 61 67 65 20 49 53   AND rootpage IS
7bb0: 20 4e 4f 54 20 4e 55 4c 4c 22 20 3a 20 22 22 29   NOT NULL" : "")
7bc0: 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  );..  if( rc==SQ
7bd0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
7be0: 63 20 3d 20 70 72 65 70 61 72 65 41 6e 64 43 6f  c = prepareAndCo
7bf0: 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62  llectError(p->db
7c00: 4d 61 69 6e 2c 20 26 70 49 74 65 72 2d 3e 70 49  Main, &pIter->pI
7c10: 64 78 49 74 65 72 2c 20 26 70 2d 3e 7a 45 72 72  dxIter, &p->zErr
7c20: 6d 73 67 2c 0a 20 20 20 20 20 20 20 20 22 53 45  msg,.        "SE
7c30: 4c 45 43 54 20 6e 61 6d 65 2c 20 72 6f 6f 74 70  LECT name, rootp
7c40: 61 67 65 2c 20 73 71 6c 20 49 53 20 4e 55 4c 4c  age, sql IS NULL
7c50: 20 4f 52 20 73 75 62 73 74 72 28 38 2c 20 36 29   OR substr(8, 6)
7c60: 3d 3d 27 55 4e 49 51 55 45 27 20 22 0a 20 20 20  =='UNIQUE' ".   
7c70: 20 20 20 20 20 22 20 20 46 52 4f 4d 20 6d 61 69       "  FROM mai
7c80: 6e 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  n.sqlite_master 
7c90: 22 0a 20 20 20 20 20 20 20 20 22 20 20 57 48 45  ".        "  WHE
7ca0: 52 45 20 74 79 70 65 3d 27 69 6e 64 65 78 27 20  RE type='index' 
7cb0: 41 4e 44 20 74 62 6c 5f 6e 61 6d 65 20 3d 20 3f  AND tbl_name = ?
7cc0: 22 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20  ".    );.  }..  
7cd0: 70 49 74 65 72 2d 3e 62 43 6c 65 61 6e 75 70 20  pIter->bCleanup 
7ce0: 3d 20 31 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 72  = 1;.  p->rc = r
7cf0: 63 3b 0a 20 20 72 65 74 75 72 6e 20 72 62 75 4f  c;.  return rbuO
7d00: 62 6a 49 74 65 72 4e 65 78 74 28 70 2c 20 70 49  bjIterNext(p, pI
7d10: 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ter);.}../*.** T
7d20: 68 69 73 20 69 73 20 61 20 77 72 61 70 70 65 72  his is a wrapper
7d30: 20 61 72 6f 75 6e 64 20 22 73 71 6c 69 74 65 33   around "sqlite3
7d40: 5f 6d 70 72 69 6e 74 66 28 7a 46 6d 74 2c 20 2e  _mprintf(zFmt, .
7d50: 2e 2e 29 22 2e 20 49 66 20 61 6e 20 4f 4f 4d 20  ..)". If an OOM 
7d60: 6f 63 63 75 72 73 2c 0a 2a 2a 20 61 6e 20 65 72  occurs,.** an er
7d70: 72 6f 72 20 63 6f 64 65 20 69 73 20 73 74 6f 72  ror code is stor
7d80: 65 64 20 69 6e 20 74 68 65 20 52 42 55 20 68 61  ed in the RBU ha
7d90: 6e 64 6c 65 20 70 61 73 73 65 64 20 61 73 20 74  ndle passed as t
7da0: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
7db0: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  t..**.** If an e
7dc0: 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79  rror has already
7dd0: 20 6f 63 63 75 72 72 65 64 20 28 70 2d 3e 72 63   occurred (p->rc
7de0: 20 69 73 20 61 6c 72 65 61 64 79 20 73 65 74 20   is already set 
7df0: 74 6f 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68  to something oth
7e00: 65 72 0a 2a 2a 20 74 68 61 6e 20 53 51 4c 49 54  er.** than SQLIT
7e10: 45 5f 4f 4b 29 2c 20 74 68 65 6e 20 74 68 69 73  E_OK), then this
7e20: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
7e30: 73 20 4e 55 4c 4c 20 77 69 74 68 6f 75 74 20 6d  s NULL without m
7e40: 6f 64 69 66 79 69 6e 67 20 74 68 65 0a 2a 2a 20  odifying the.** 
7e50: 73 74 6f 72 65 64 20 65 72 72 6f 72 20 63 6f 64  stored error cod
7e60: 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  e. In this case 
7e70: 69 74 20 73 74 69 6c 6c 20 63 61 6c 6c 73 20 73  it still calls s
7e80: 71 6c 69 74 65 33 5f 66 72 65 65 28 29 20 6f 6e  qlite3_free() on
7e90: 20 61 6e 79 20 0a 2a 2a 20 70 72 69 6e 74 66 28   any .** printf(
7ea0: 29 20 70 61 72 61 6d 65 74 65 72 73 20 61 73 73  ) parameters ass
7eb0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 25 7a 20  ociated with %z 
7ec0: 63 6f 6e 76 65 72 73 69 6f 6e 73 2e 0a 2a 2f 0a  conversions..*/.
7ed0: 73 74 61 74 69 63 20 63 68 61 72 20 2a 72 62 75  static char *rbu
7ee0: 4d 50 72 69 6e 74 66 28 73 71 6c 69 74 65 33 72  MPrintf(sqlite3r
7ef0: 62 75 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  bu *p, const cha
7f00: 72 20 2a 7a 46 6d 74 2c 20 2e 2e 2e 29 7b 0a 20  r *zFmt, ...){. 
7f10: 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 30 3b   char *zSql = 0;
7f20: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
7f30: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46   va_start(ap, zF
7f40: 6d 74 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71  mt);.  zSql = sq
7f50: 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a  lite3_vmprintf(z
7f60: 46 6d 74 2c 20 61 70 29 3b 0a 20 20 69 66 28 20  Fmt, ap);.  if( 
7f70: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
7f80: 20 29 7b 0a 20 20 20 20 69 66 28 20 7a 53 71 6c   ){.    if( zSql
7f90: 3d 3d 30 20 29 20 70 2d 3e 72 63 20 3d 20 53 51  ==0 ) p->rc = SQ
7fa0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65  LITE_NOMEM;.  }e
7fb0: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
7fc0: 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20  _free(zSql);.   
7fd0: 20 7a 53 71 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20   zSql = 0;.  }. 
7fe0: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72   va_end(ap);.  r
7ff0: 65 74 75 72 6e 20 7a 53 71 6c 3b 0a 7d 0a 0a 2f  eturn zSql;.}../
8000: 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 7a 46  *.** Argument zF
8010: 6d 74 20 69 73 20 61 20 73 71 6c 69 74 65 33 5f  mt is a sqlite3_
8020: 6d 70 72 69 6e 74 66 28 29 20 73 74 79 6c 65 20  mprintf() style 
8030: 66 6f 72 6d 61 74 20 73 74 72 69 6e 67 2e 20 54  format string. T
8040: 68 65 20 74 72 61 69 6c 69 6e 67 0a 2a 2a 20 61  he trailing.** a
8050: 72 67 75 6d 65 6e 74 73 20 61 72 65 20 74 68 65  rguments are the
8060: 20 75 73 75 61 6c 20 73 75 62 73 69 74 75 74 69   usual subsituti
8070: 6f 6e 20 76 61 6c 75 65 73 2e 20 54 68 69 73 20  on values. This 
8080: 66 75 6e 63 74 69 6f 6e 20 70 65 72 66 6f 72 6d  function perform
8090: 73 0a 2a 2a 20 74 68 65 20 70 72 69 6e 74 66 28  s.** the printf(
80a0: 29 20 73 74 79 6c 65 20 73 75 62 73 74 69 74 75  ) style substitu
80b0: 74 69 6f 6e 73 20 61 6e 64 20 65 78 65 63 75 74  tions and execut
80c0: 65 73 20 74 68 65 20 72 65 73 75 6c 74 20 61 73  es the result as
80d0: 20 61 6e 20 53 51 4c 0a 2a 2a 20 73 74 61 74 65   an SQL.** state
80e0: 6d 65 6e 74 20 6f 6e 20 74 68 65 20 52 42 55 20  ment on the RBU 
80f0: 68 61 6e 64 6c 65 73 20 64 61 74 61 62 61 73 65  handles database
8100: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
8110: 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65  ror occurs, an e
8120: 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 65 72  rror code and er
8130: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 73  ror message is s
8140: 74 6f 72 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20  tored in the.** 
8150: 52 42 55 20 68 61 6e 64 6c 65 2e 20 49 66 20 61  RBU handle. If a
8160: 6e 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65  n error has alre
8170: 61 64 79 20 6f 63 63 75 72 72 65 64 20 77 68 65  ady occurred whe
8180: 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
8190: 69 73 0a 2a 2a 20 63 61 6c 6c 65 64 2c 20 69 74  is.** called, it
81a0: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
81b0: 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 4d 50  static int rbuMP
81c0: 72 69 6e 74 66 45 78 65 63 28 73 71 6c 69 74 65  rintfExec(sqlite
81d0: 33 72 62 75 20 2a 70 2c 20 73 71 6c 69 74 65 33  3rbu *p, sqlite3
81e0: 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72   *db, const char
81f0: 20 2a 7a 46 6d 74 2c 20 2e 2e 2e 29 7b 0a 20 20   *zFmt, ...){.  
8200: 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63 68  va_list ap;.  ch
8210: 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 76 61 5f 73  ar *zSql;.  va_s
8220: 74 61 72 74 28 61 70 2c 20 7a 46 6d 74 29 3b 0a  tart(ap, zFmt);.
8230: 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
8240: 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6d 74 2c 20  _vmprintf(zFmt, 
8250: 61 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63  ap);.  if( p->rc
8260: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
8270: 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29     if( zSql==0 )
8280: 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20  {.      p->rc = 
8290: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
82a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
82b0: 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65  ->rc = sqlite3_e
82c0: 78 65 63 28 64 62 2c 20 7a 53 71 6c 2c 20 30 2c  xec(db, zSql, 0,
82d0: 20 30 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 29   0, &p->zErrmsg)
82e0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
82f0: 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29  lite3_free(zSql)
8300: 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a  ;.  va_end(ap);.
8310: 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 3b 0a    return p->rc;.
8320: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  }../*.** Attempt
8330: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64   to allocate and
8340: 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
8350: 72 20 74 6f 20 61 20 7a 65 72 6f 65 64 20 62 6c  r to a zeroed bl
8360: 6f 63 6b 20 6f 66 20 6e 42 79 74 65 20 0a 2a 2a  ock of nByte .**
8370: 20 62 79 74 65 73 2e 20 0a 2a 2a 0a 2a 2a 20 49   bytes. .**.** I
8380: 66 20 61 6e 20 65 72 72 6f 72 20 28 69 2e 65 2e  f an error (i.e.
8390: 20 61 6e 20 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f   an OOM conditio
83a0: 6e 29 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  n) occurs, retur
83b0: 6e 20 4e 55 4c 4c 20 61 6e 64 20 6c 65 61 76 65  n NULL and leave
83c0: 20 61 6e 20 0a 2a 2a 20 65 72 72 6f 72 20 63 6f   an .** error co
83d0: 64 65 20 69 6e 20 74 68 65 20 72 62 75 20 68 61  de in the rbu ha
83e0: 6e 64 6c 65 20 70 61 73 73 65 64 20 61 73 20 74  ndle passed as t
83f0: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
8400: 74 2e 20 4f 72 2c 20 69 66 20 61 6e 20 0a 2a 2a  t. Or, if an .**
8410: 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61   error has alrea
8420: 64 79 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e  dy occurred when
8430: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
8440: 73 20 63 61 6c 6c 65 64 2c 20 72 65 74 75 72 6e  s called, return
8450: 20 4e 55 4c 4c 20 0a 2a 2a 20 69 6d 6d 65 64 69   NULL .** immedi
8460: 61 74 65 6c 79 20 77 69 74 68 6f 75 74 20 61 74  ately without at
8470: 74 65 6d 70 74 69 6e 67 20 74 68 65 20 61 6c 6c  tempting the all
8480: 6f 63 61 74 69 6f 6e 20 6f 72 20 6d 6f 64 69 66  ocation or modif
8490: 79 69 6e 67 20 74 68 65 20 73 74 6f 72 65 64 0a  ying the stored.
84a0: 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  ** error code..*
84b0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 72  /.static void *r
84c0: 62 75 4d 61 6c 6c 6f 63 28 73 71 6c 69 74 65 33  buMalloc(sqlite3
84d0: 72 62 75 20 2a 70 2c 20 69 6e 74 20 6e 42 79 74  rbu *p, int nByt
84e0: 65 29 7b 0a 20 20 76 6f 69 64 20 2a 70 52 65 74  e){.  void *pRet
84f0: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 72   = 0;.  if( p->r
8500: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
8510: 20 20 20 20 61 73 73 65 72 74 28 20 6e 42 79 74      assert( nByt
8520: 65 3e 30 20 29 3b 0a 20 20 20 20 70 52 65 74 20  e>0 );.    pRet 
8530: 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
8540: 36 34 28 6e 42 79 74 65 29 3b 0a 20 20 20 20 69  64(nByte);.    i
8550: 66 28 20 70 52 65 74 3d 3d 30 20 29 7b 0a 20 20  f( pRet==0 ){.  
8560: 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
8570: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65  TE_NOMEM;.    }e
8580: 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65  lse{.      memse
8590: 74 28 70 52 65 74 2c 20 30 2c 20 6e 42 79 74 65  t(pRet, 0, nByte
85a0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
85b0: 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 0a  eturn pRet;.}...
85c0: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
85d0: 6e 64 20 7a 65 72 6f 20 74 68 65 20 70 49 74 65  nd zero the pIte
85e0: 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 5d 20 61 6e  r->azTblCol[] an
85f0: 64 20 61 62 54 62 6c 50 6b 5b 5d 20 61 72 72 61  d abTblPk[] arra
8600: 79 73 20 73 6f 20 74 68 61 74 0a 2a 2a 20 74 68  ys so that.** th
8610: 65 72 65 20 69 73 20 72 6f 6f 6d 20 66 6f 72 20  ere is room for 
8620: 61 74 20 6c 65 61 73 74 20 6e 43 6f 6c 20 65 6c  at least nCol el
8630: 65 6d 65 6e 74 73 2e 20 49 66 20 61 6e 20 4f 4f  ements. If an OO
8640: 4d 20 6f 63 63 75 72 73 2c 20 73 74 6f 72 65 20  M occurs, store 
8650: 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65  an.** error code
8660: 20 69 6e 20 74 68 65 20 52 42 55 20 68 61 6e 64   in the RBU hand
8670: 6c 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  le passed as the
8680: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
8690: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
86a0: 72 62 75 41 6c 6c 6f 63 61 74 65 49 74 65 72 41  rbuAllocateIterA
86b0: 72 72 61 79 73 28 73 71 6c 69 74 65 33 72 62 75  rrays(sqlite3rbu
86c0: 20 2a 70 2c 20 52 62 75 4f 62 6a 49 74 65 72 20   *p, RbuObjIter 
86d0: 2a 70 49 74 65 72 2c 20 69 6e 74 20 6e 43 6f 6c  *pIter, int nCol
86e0: 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d  ){.  int nByte =
86f0: 20 28 32 2a 73 69 7a 65 6f 66 28 63 68 61 72 2a   (2*sizeof(char*
8700: 29 20 2b 20 73 69 7a 65 6f 66 28 69 6e 74 29 20  ) + sizeof(int) 
8710: 2b 20 33 2a 73 69 7a 65 6f 66 28 75 38 29 29 20  + 3*sizeof(u8)) 
8720: 2a 20 6e 43 6f 6c 3b 0a 20 20 63 68 61 72 20 2a  * nCol;.  char *
8730: 2a 61 7a 4e 65 77 3b 0a 0a 20 20 61 7a 4e 65 77  *azNew;..  azNew
8740: 20 3d 20 28 63 68 61 72 2a 2a 29 72 62 75 4d 61   = (char**)rbuMa
8750: 6c 6c 6f 63 28 70 2c 20 6e 42 79 74 65 29 3b 0a  lloc(p, nByte);.
8760: 20 20 69 66 28 20 61 7a 4e 65 77 20 29 7b 0a 20    if( azNew ){. 
8770: 20 20 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43     pIter->azTblC
8780: 6f 6c 20 3d 20 61 7a 4e 65 77 3b 0a 20 20 20 20  ol = azNew;.    
8790: 70 49 74 65 72 2d 3e 61 7a 54 62 6c 54 79 70 65  pIter->azTblType
87a0: 20 3d 20 26 61 7a 4e 65 77 5b 6e 43 6f 6c 5d 3b   = &azNew[nCol];
87b0: 0a 20 20 20 20 70 49 74 65 72 2d 3e 61 69 53 72  .    pIter->aiSr
87c0: 63 4f 72 64 65 72 20 3d 20 28 69 6e 74 2a 29 26  cOrder = (int*)&
87d0: 70 49 74 65 72 2d 3e 61 7a 54 62 6c 54 79 70 65  pIter->azTblType
87e0: 5b 6e 43 6f 6c 5d 3b 0a 20 20 20 20 70 49 74 65  [nCol];.    pIte
87f0: 72 2d 3e 61 62 54 62 6c 50 6b 20 3d 20 28 75 38  r->abTblPk = (u8
8800: 2a 29 26 70 49 74 65 72 2d 3e 61 69 53 72 63 4f  *)&pIter->aiSrcO
8810: 72 64 65 72 5b 6e 43 6f 6c 5d 3b 0a 20 20 20 20  rder[nCol];.    
8820: 70 49 74 65 72 2d 3e 61 62 4e 6f 74 4e 75 6c 6c  pIter->abNotNull
8830: 20 3d 20 28 75 38 2a 29 26 70 49 74 65 72 2d 3e   = (u8*)&pIter->
8840: 61 62 54 62 6c 50 6b 5b 6e 43 6f 6c 5d 3b 0a 20  abTblPk[nCol];. 
8850: 20 20 20 70 49 74 65 72 2d 3e 61 62 49 6e 64 65     pIter->abInde
8860: 78 65 64 20 3d 20 28 75 38 2a 29 26 70 49 74 65  xed = (u8*)&pIte
8870: 72 2d 3e 61 62 4e 6f 74 4e 75 6c 6c 5b 6e 43 6f  r->abNotNull[nCo
8880: 6c 5d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  l];.  }.}../*.**
8890: 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   The first argum
88a0: 65 6e 74 20 6d 75 73 74 20 62 65 20 61 20 6e 75  ent must be a nu
88b0: 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72  l-terminated str
88c0: 69 6e 67 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ing. This functi
88d0: 6f 6e 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61 20  on.** returns a 
88e0: 63 6f 70 79 20 6f 66 20 74 68 65 20 73 74 72 69  copy of the stri
88f0: 6e 67 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74  ng in memory obt
8900: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
8910: 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20  e3_malloc()..** 
8920: 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e  It is the respon
8930: 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
8940: 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75  caller to eventu
8950: 61 6c 6c 79 20 66 72 65 65 20 74 68 69 73 20 6d  ally free this m
8960: 65 6d 6f 72 79 0a 2a 2a 20 75 73 69 6e 67 20 73  emory.** using s
8970: 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a  qlite3_free()..*
8980: 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 63  *.** If an OOM c
8990: 6f 6e 64 69 74 69 6f 6e 20 69 73 20 65 6e 63 6f  ondition is enco
89a0: 75 6e 74 65 72 65 64 20 77 68 65 6e 20 61 74 74  untered when att
89b0: 65 6d 70 74 69 6e 67 20 74 6f 20 61 6c 6c 6f 63  empting to alloc
89c0: 61 74 65 20 6d 65 6d 6f 72 79 2c 0a 2a 2a 20 6f  ate memory,.** o
89d0: 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 20 28  utput variable (
89e0: 2a 70 52 63 29 20 69 73 20 73 65 74 20 74 6f 20  *pRc) is set to 
89f0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 62 65 66  SQLITE_NOMEM bef
8a00: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 4f  ore returning. O
8a10: 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 69 66 20  therwise,.** if 
8a20: 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73  the allocation s
8a30: 75 63 63 65 65 64 73 2c 20 28 2a 70 52 63 29 20  ucceeds, (*pRc) 
8a40: 69 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65  is left unchange
8a50: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  d..*/.static cha
8a60: 72 20 2a 72 62 75 53 74 72 6e 64 75 70 28 63 6f  r *rbuStrndup(co
8a70: 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 72 2c 20  nst char *zStr, 
8a80: 69 6e 74 20 2a 70 52 63 29 7b 0a 20 20 63 68 61  int *pRc){.  cha
8a90: 72 20 2a 7a 52 65 74 20 3d 20 30 3b 0a 0a 20 20  r *zRet = 0;..  
8aa0: 61 73 73 65 72 74 28 20 2a 70 52 63 3d 3d 53 51  assert( *pRc==SQ
8ab0: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28  LITE_OK );.  if(
8ac0: 20 7a 53 74 72 20 29 7b 0a 20 20 20 20 73 69 7a   zStr ){.    siz
8ad0: 65 5f 74 20 6e 43 6f 70 79 20 3d 20 73 74 72 6c  e_t nCopy = strl
8ae0: 65 6e 28 7a 53 74 72 29 20 2b 20 31 3b 0a 20 20  en(zStr) + 1;.  
8af0: 20 20 7a 52 65 74 20 3d 20 28 63 68 61 72 2a 29    zRet = (char*)
8b00: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
8b10: 28 6e 43 6f 70 79 29 3b 0a 20 20 20 20 69 66 28  (nCopy);.    if(
8b20: 20 7a 52 65 74 20 29 7b 0a 20 20 20 20 20 20 6d   zRet ){.      m
8b30: 65 6d 63 70 79 28 7a 52 65 74 2c 20 7a 53 74 72  emcpy(zRet, zStr
8b40: 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20 7d 65  , nCopy);.    }e
8b50: 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 52 63 20  lse{.      *pRc 
8b60: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
8b70: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
8b80: 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a  urn zRet;.}../*.
8b90: 2a 2a 20 46 69 6e 61 6c 69 7a 65 20 74 68 65 20  ** Finalize the 
8ba0: 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64  statement passed
8bb0: 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
8bc0: 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49  rgument..**.** I
8bd0: 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69  f the sqlite3_fi
8be0: 6e 61 6c 69 7a 65 28 29 20 63 61 6c 6c 20 69 6e  nalize() call in
8bf0: 64 69 63 61 74 65 73 20 74 68 61 74 20 61 6e 20  dicates that an 
8c00: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e  error occurs, an
8c10: 64 20 74 68 65 0a 2a 2a 20 72 62 75 20 68 61 6e  d the.** rbu han
8c20: 64 6c 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  dle error code i
8c30: 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 73 65  s not already se
8c40: 74 2c 20 73 65 74 20 74 68 65 20 65 72 72 6f 72  t, set the error
8c50: 20 63 6f 64 65 20 61 6e 64 20 65 72 72 6f 72 0a   code and error.
8c60: 2a 2a 20 6d 65 73 73 61 67 65 20 61 63 63 6f 72  ** message accor
8c70: 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  dingly..*/.stati
8c80: 63 20 76 6f 69 64 20 72 62 75 46 69 6e 61 6c 69  c void rbuFinali
8c90: 7a 65 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70  ze(sqlite3rbu *p
8ca0: 2c 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a  , sqlite3_stmt *
8cb0: 70 53 74 6d 74 29 7b 0a 20 20 73 71 6c 69 74 65  pStmt){.  sqlite
8cc0: 33 20 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f  3 *db = sqlite3_
8cd0: 64 62 5f 68 61 6e 64 6c 65 28 70 53 74 6d 74 29  db_handle(pStmt)
8ce0: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c  ;.  int rc = sql
8cf0: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
8d00: 74 6d 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72  tmt);.  if( p->r
8d10: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
8d20: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
8d30: 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b  .    p->rc = rc;
8d40: 0a 20 20 20 20 70 2d 3e 7a 45 72 72 6d 73 67 20  .    p->zErrmsg 
8d50: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
8d60: 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f  f("%s", sqlite3_
8d70: 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 7d  errmsg(db));.  }
8d80: 0a 7d 0a 0a 2f 2a 20 44 65 74 65 72 6d 69 6e 65  .}../* Determine
8d90: 20 74 68 65 20 74 79 70 65 20 6f 66 20 61 20 74   the type of a t
8da0: 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 70 65  able..**.**   pe
8db0: 54 79 70 65 20 69 73 20 6f 66 20 74 79 70 65 20  Type is of type 
8dc0: 28 69 6e 74 2a 29 2c 20 61 20 70 6f 69 6e 74 65  (int*), a pointe
8dd0: 72 20 74 6f 20 61 6e 20 6f 75 74 70 75 74 20 70  r to an output p
8de0: 61 72 61 6d 65 74 65 72 20 6f 66 20 74 79 70 65  arameter of type
8df0: 0a 2a 2a 20 20 20 28 69 6e 74 29 2e 20 54 68 69  .**   (int). Thi
8e00: 73 20 63 61 6c 6c 20 73 65 74 73 20 74 68 65 20  s call sets the 
8e10: 6f 75 74 70 75 74 20 70 61 72 61 6d 65 74 65 72  output parameter
8e20: 20 61 73 20 66 6f 6c 6c 6f 77 73 2c 20 64 65 70   as follows, dep
8e30: 65 6e 64 69 6e 67 0a 2a 2a 20 20 20 6f 6e 20 74  ending.**   on t
8e40: 68 65 20 74 79 70 65 20 6f 66 20 74 68 65 20 74  he type of the t
8e50: 61 62 6c 65 20 73 70 65 63 69 66 69 65 64 20 62  able specified b
8e60: 79 20 70 61 72 61 6d 65 74 65 72 73 20 64 62 4e  y parameters dbN
8e70: 61 6d 65 20 61 6e 64 20 7a 54 62 6c 2e 0a 2a 2a  ame and zTbl..**
8e80: 0a 2a 2a 20 20 20 20 20 52 42 55 5f 50 4b 5f 4e  .**     RBU_PK_N
8e90: 4f 54 41 42 4c 45 3a 20 20 20 20 20 20 20 4e 6f  OTABLE:       No
8ea0: 20 73 75 63 68 20 74 61 62 6c 65 2e 0a 2a 2a 20   such table..** 
8eb0: 20 20 20 20 52 42 55 5f 50 4b 5f 4e 4f 4e 45 3a      RBU_PK_NONE:
8ec0: 20 20 20 20 20 20 20 20 20 20 54 61 62 6c 65 20            Table 
8ed0: 68 61 73 20 61 6e 20 69 6d 70 6c 69 63 69 74 20  has an implicit 
8ee0: 72 6f 77 69 64 2e 0a 2a 2a 20 20 20 20 20 52 42  rowid..**     RB
8ef0: 55 5f 50 4b 5f 49 50 4b 3a 20 20 20 20 20 20 20  U_PK_IPK:       
8f00: 20 20 20 20 54 61 62 6c 65 20 68 61 73 20 61 6e      Table has an
8f10: 20 65 78 70 6c 69 63 69 74 20 49 50 4b 20 63 6f   explicit IPK co
8f20: 6c 75 6d 6e 2e 0a 2a 2a 20 20 20 20 20 52 42 55  lumn..**     RBU
8f30: 5f 50 4b 5f 45 58 54 45 52 4e 41 4c 3a 20 20 20  _PK_EXTERNAL:   
8f40: 20 20 20 54 61 62 6c 65 20 68 61 73 20 61 6e 20     Table has an 
8f50: 65 78 74 65 72 6e 61 6c 20 50 4b 20 69 6e 64 65  external PK inde
8f60: 78 2e 0a 2a 2a 20 20 20 20 20 52 42 55 5f 50 4b  x..**     RBU_PK
8f70: 5f 57 49 54 48 4f 55 54 5f 52 4f 57 49 44 3a 20  _WITHOUT_ROWID: 
8f80: 54 61 62 6c 65 20 69 73 20 57 49 54 48 4f 55 54  Table is WITHOUT
8f90: 20 52 4f 57 49 44 2e 0a 2a 2a 20 20 20 20 20 52   ROWID..**     R
8fa0: 42 55 5f 50 4b 5f 56 54 41 42 3a 20 20 20 20 20  BU_PK_VTAB:     
8fb0: 20 20 20 20 20 54 61 62 6c 65 20 69 73 20 61 20       Table is a 
8fc0: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a  virtual table..*
8fd0: 2a 0a 2a 2a 20 20 20 41 72 67 75 6d 65 6e 74 20  *.**   Argument 
8fe0: 2a 70 69 50 6b 20 69 73 20 61 6c 73 6f 20 6f 66  *piPk is also of
8ff0: 20 74 79 70 65 20 28 69 6e 74 2a 29 2c 20 61 6e   type (int*), an
9000: 64 20 61 6c 73 6f 20 70 6f 69 6e 74 73 20 74 6f  d also points to
9010: 20 61 6e 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20   an output.**   
9020: 70 61 72 61 6d 65 74 65 72 2e 20 55 6e 6c 65 73  parameter. Unles
9030: 73 20 74 68 65 20 74 61 62 6c 65 20 68 61 73 20  s the table has 
9040: 61 6e 20 65 78 74 65 72 6e 61 6c 20 70 72 69 6d  an external prim
9050: 61 72 79 20 6b 65 79 20 69 6e 64 65 78 20 0a 2a  ary key index .*
9060: 2a 20 20 20 28 69 2e 65 2e 20 75 6e 6c 65 73 73  *   (i.e. unless
9070: 20 2a 70 65 54 79 70 65 20 69 73 20 73 65 74 20   *peType is set 
9080: 74 6f 20 33 29 2c 20 74 68 65 6e 20 2a 70 69 50  to 3), then *piP
9090: 6b 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  k is set to zero
90a0: 2e 20 4f 72 2c 0a 2a 2a 20 20 20 69 66 20 74 68  . Or,.**   if th
90b0: 65 20 74 61 62 6c 65 20 64 6f 65 73 20 68 61 76  e table does hav
90c0: 65 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 70 72  e an external pr
90d0: 69 6d 61 72 79 20 6b 65 79 20 69 6e 64 65 78 2c  imary key index,
90e0: 20 74 68 65 6e 20 2a 70 69 50 6b 0a 2a 2a 20 20   then *piPk.**  
90f0: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 72   is set to the r
9100: 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  oot page number 
9110: 6f 66 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b  of the primary k
9120: 65 79 20 69 6e 64 65 78 20 62 65 66 6f 72 65 0a  ey index before.
9130: 2a 2a 20 20 20 72 65 74 75 72 6e 69 6e 67 2e 0a  **   returning..
9140: 2a 2a 0a 2a 2a 20 41 4c 47 4f 52 49 54 48 4d 3a  **.** ALGORITHM:
9150: 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 6e 6f 20  .**.**   if( no 
9160: 65 6e 74 72 79 20 65 78 69 73 74 73 20 69 6e 20  entry exists in 
9170: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 29 7b  sqlite_master ){
9180: 0a 2a 2a 20 20 20 20 20 72 65 74 75 72 6e 20 52  .**     return R
9190: 42 55 5f 50 4b 5f 4e 4f 54 41 42 4c 45 0a 2a 2a  BU_PK_NOTABLE.**
91a0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c     }else if( sql
91b0: 20 66 6f 72 20 74 68 65 20 65 6e 74 72 79 20 73   for the entry s
91c0: 74 61 72 74 73 20 77 69 74 68 20 22 43 52 45 41  tarts with "CREA
91d0: 54 45 20 56 49 52 54 55 41 4c 22 20 29 7b 0a 2a  TE VIRTUAL" ){.*
91e0: 2a 20 20 20 20 20 72 65 74 75 72 6e 20 52 42 55  *     return RBU
91f0: 5f 50 4b 5f 56 54 41 42 0a 2a 2a 20 20 20 7d 65  _PK_VTAB.**   }e
9200: 6c 73 65 20 69 66 28 20 22 50 52 41 47 4d 41 20  lse if( "PRAGMA 
9210: 69 6e 64 65 78 5f 6c 69 73 74 28 29 22 20 66 6f  index_list()" fo
9220: 72 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6e 74  r the table cont
9230: 61 69 6e 73 20 61 20 22 70 6b 22 20 69 6e 64 65  ains a "pk" inde
9240: 78 20 29 7b 0a 2a 2a 20 20 20 20 20 69 66 28 20  x ){.**     if( 
9250: 74 68 65 20 69 6e 64 65 78 20 74 68 61 74 20 69  the index that i
9260: 73 20 74 68 65 20 70 6b 20 65 78 69 73 74 73 20  s the pk exists 
9270: 69 6e 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  in sqlite_master
9280: 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 2a 70 69   ){.**       *pi
9290: 50 4b 20 3d 20 72 6f 6f 74 70 61 67 65 20 6f 66  PK = rootpage of
92a0: 20 74 68 61 74 20 69 6e 64 65 78 2e 0a 2a 2a 20   that index..** 
92b0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 52 42 55        return RBU
92c0: 5f 50 4b 5f 45 58 54 45 52 4e 41 4c 0a 2a 2a 20  _PK_EXTERNAL.** 
92d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 2a 2a 20 20 20      }else{.**   
92e0: 20 20 20 20 72 65 74 75 72 6e 20 52 42 55 5f 50      return RBU_P
92f0: 4b 5f 57 49 54 48 4f 55 54 5f 52 4f 57 49 44 0a  K_WITHOUT_ROWID.
9300: 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20 7d 65  **     }.**   }e
9310: 6c 73 65 20 69 66 28 20 22 50 52 41 47 4d 41 20  lse if( "PRAGMA 
9320: 74 61 62 6c 65 5f 69 6e 66 6f 28 29 22 20 6c 69  table_info()" li
9330: 73 74 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  sts one or more 
9340: 22 70 6b 22 20 63 6f 6c 75 6d 6e 73 20 29 7b 0a  "pk" columns ){.
9350: 2a 2a 20 20 20 20 20 72 65 74 75 72 6e 20 52 42  **     return RB
9360: 55 5f 50 4b 5f 49 50 4b 0a 2a 2a 20 20 20 7d 65  U_PK_IPK.**   }e
9370: 6c 73 65 7b 0a 2a 2a 20 20 20 20 20 72 65 74 75  lse{.**     retu
9380: 72 6e 20 52 42 55 5f 50 4b 5f 4e 4f 4e 45 0a 2a  rn RBU_PK_NONE.*
9390: 2a 20 20 20 7d 0a 2a 2f 0a 73 74 61 74 69 63 20  *   }.*/.static 
93a0: 76 6f 69 64 20 72 62 75 54 61 62 6c 65 54 79 70  void rbuTableTyp
93b0: 65 28 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20  e(.  sqlite3rbu 
93c0: 2a 70 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  *p,.  const char
93d0: 20 2a 7a 54 61 62 2c 0a 20 20 69 6e 74 20 2a 70   *zTab,.  int *p
93e0: 65 54 79 70 65 2c 0a 20 20 69 6e 74 20 2a 70 69  eType,.  int *pi
93f0: 54 6e 75 6d 2c 0a 20 20 69 6e 74 20 2a 70 69 50  Tnum,.  int *piP
9400: 6b 0a 29 7b 0a 20 20 2f 2a 0a 20 20 2a 2a 20 30  k.){.  /*.  ** 0
9410: 29 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a  ) SELECT count(*
9420: 29 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  ) FROM sqlite_ma
9430: 73 74 65 72 20 77 68 65 72 65 20 6e 61 6d 65 3d  ster where name=
9440: 25 51 20 41 4e 44 20 49 73 56 69 72 74 75 61 6c  %Q AND IsVirtual
9450: 28 25 51 29 0a 20 20 2a 2a 20 31 29 20 50 52 41  (%Q).  ** 1) PRA
9460: 47 4d 41 20 69 6e 64 65 78 5f 6c 69 73 74 20 3d  GMA index_list =
9470: 20 3f 0a 20 20 2a 2a 20 32 29 20 53 45 4c 45 43   ?.  ** 2) SELEC
9480: 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
9490: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 77 68  sqlite_master wh
94a0: 65 72 65 20 6e 61 6d 65 3d 25 51 20 0a 20 20 2a  ere name=%Q .  *
94b0: 2a 20 33 29 20 50 52 41 47 4d 41 20 74 61 62 6c  * 3) PRAGMA tabl
94c0: 65 5f 69 6e 66 6f 20 3d 20 3f 0a 20 20 2a 2f 0a  e_info = ?.  */.
94d0: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
94e0: 61 53 74 6d 74 5b 34 5d 20 3d 20 7b 30 2c 20 30  aStmt[4] = {0, 0
94f0: 2c 20 30 2c 20 30 7d 3b 0a 0a 20 20 2a 70 65 54  , 0, 0};..  *peT
9500: 79 70 65 20 3d 20 52 42 55 5f 50 4b 5f 4e 4f 54  ype = RBU_PK_NOT
9510: 41 42 4c 45 3b 0a 20 20 2a 70 69 50 6b 20 3d 20  ABLE;.  *piPk = 
9520: 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  0;..  assert( p-
9530: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
9540: 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70  ;.  p->rc = prep
9550: 61 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63  areFreeAndCollec
9560: 74 45 72 72 6f 72 28 70 2d 3e 64 62 4d 61 69 6e  tError(p->dbMain
9570: 2c 20 26 61 53 74 6d 74 5b 30 5d 2c 20 26 70 2d  , &aStmt[0], &p-
9580: 3e 7a 45 72 72 6d 73 67 2c 20 0a 20 20 20 20 73  >zErrmsg, .    s
9590: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a  qlite3_mprintf(.
95a0: 20 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43            "SELEC
95b0: 54 20 28 73 71 6c 20 4c 49 4b 45 20 27 63 72 65  T (sql LIKE 'cre
95c0: 61 74 65 20 76 69 72 74 75 61 6c 25 25 27 29 2c  ate virtual%%'),
95d0: 20 72 6f 6f 74 70 61 67 65 22 0a 20 20 20 20 20   rootpage".     
95e0: 20 20 20 20 20 22 20 20 46 52 4f 4d 20 73 71 6c       "  FROM sql
95f0: 69 74 65 5f 6d 61 73 74 65 72 22 0a 20 20 20 20  ite_master".    
9600: 20 20 20 20 20 20 22 20 57 48 45 52 45 20 6e 61        " WHERE na
9610: 6d 65 3d 25 51 22 2c 20 7a 54 61 62 0a 20 20 29  me=%Q", zTab.  )
9620: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 21 3d  );.  if( p->rc!=
9630: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c  SQLITE_OK || sql
9640: 69 74 65 33 5f 73 74 65 70 28 61 53 74 6d 74 5b  ite3_step(aStmt[
9650: 30 5d 29 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20  0])!=SQLITE_ROW 
9660: 29 7b 0a 20 20 20 20 2f 2a 20 45 69 74 68 65 72  ){.    /* Either
9670: 20 61 6e 20 65 72 72 6f 72 2c 20 6f 72 20 6e 6f   an error, or no
9680: 20 73 75 63 68 20 74 61 62 6c 65 2e 20 2a 2f 0a   such table. */.
9690: 20 20 20 20 67 6f 74 6f 20 72 62 75 54 61 62 6c      goto rbuTabl
96a0: 65 54 79 70 65 5f 65 6e 64 3b 0a 20 20 7d 0a 20  eType_end;.  }. 
96b0: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c   if( sqlite3_col
96c0: 75 6d 6e 5f 69 6e 74 28 61 53 74 6d 74 5b 30 5d  umn_int(aStmt[0]
96d0: 2c 20 30 29 20 29 7b 0a 20 20 20 20 2a 70 65 54  , 0) ){.    *peT
96e0: 79 70 65 20 3d 20 52 42 55 5f 50 4b 5f 56 54 41  ype = RBU_PK_VTA
96f0: 42 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  B;              
9700: 20 20 20 20 20 20 20 2f 2a 20 76 69 72 74 75 61         /* virtua
9710: 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 67  l table */.    g
9720: 6f 74 6f 20 72 62 75 54 61 62 6c 65 54 79 70 65  oto rbuTableType
9730: 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 2a 70 69 54  _end;.  }.  *piT
9740: 6e 75 6d 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  num = sqlite3_co
9750: 6c 75 6d 6e 5f 69 6e 74 28 61 53 74 6d 74 5b 30  lumn_int(aStmt[0
9760: 5d 2c 20 31 29 3b 0a 0a 20 20 70 2d 3e 72 63 20  ], 1);..  p->rc 
9770: 3d 20 70 72 65 70 61 72 65 46 72 65 65 41 6e 64  = prepareFreeAnd
9780: 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e  CollectError(p->
9790: 64 62 4d 61 69 6e 2c 20 26 61 53 74 6d 74 5b 31  dbMain, &aStmt[1
97a0: 5d 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 20  ], &p->zErrmsg, 
97b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72  .    sqlite3_mpr
97c0: 69 6e 74 66 28 22 50 52 41 47 4d 41 20 69 6e 64  intf("PRAGMA ind
97d0: 65 78 5f 6c 69 73 74 3d 25 51 22 2c 7a 54 61 62  ex_list=%Q",zTab
97e0: 29 0a 20 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  ).  );.  if( p->
97f0: 72 63 20 29 20 67 6f 74 6f 20 72 62 75 54 61 62  rc ) goto rbuTab
9800: 6c 65 54 79 70 65 5f 65 6e 64 3b 0a 20 20 77 68  leType_end;.  wh
9810: 69 6c 65 28 20 73 71 6c 69 74 65 33 5f 73 74 65  ile( sqlite3_ste
9820: 70 28 61 53 74 6d 74 5b 31 5d 29 3d 3d 53 51 4c  p(aStmt[1])==SQL
9830: 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 63  ITE_ROW ){.    c
9840: 6f 6e 73 74 20 75 38 20 2a 7a 4f 72 69 67 20 3d  onst u8 *zOrig =
9850: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
9860: 74 65 78 74 28 61 53 74 6d 74 5b 31 5d 2c 20 33  text(aStmt[1], 3
9870: 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 38 20  );.    const u8 
9880: 2a 7a 49 64 78 20 3d 20 73 71 6c 69 74 65 33 5f  *zIdx = sqlite3_
9890: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 61 53 74 6d  column_text(aStm
98a0: 74 5b 31 5d 2c 20 31 29 3b 0a 20 20 20 20 69 66  t[1], 1);.    if
98b0: 28 20 7a 4f 72 69 67 20 26 26 20 7a 49 64 78 20  ( zOrig && zIdx 
98c0: 26 26 20 7a 4f 72 69 67 5b 30 5d 3d 3d 27 70 27  && zOrig[0]=='p'
98d0: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20   ){.      p->rc 
98e0: 3d 20 70 72 65 70 61 72 65 46 72 65 65 41 6e 64  = prepareFreeAnd
98f0: 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e  CollectError(p->
9900: 64 62 4d 61 69 6e 2c 20 26 61 53 74 6d 74 5b 32  dbMain, &aStmt[2
9910: 5d 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 20  ], &p->zErrmsg, 
9920: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
9930: 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20  e3_mprintf(.    
9940: 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
9950: 72 6f 6f 74 70 61 67 65 20 46 52 4f 4d 20 73 71  rootpage FROM sq
9960: 6c 69 74 65 5f 6d 61 73 74 65 72 20 57 48 45 52  lite_master WHER
9970: 45 20 6e 61 6d 65 20 3d 20 25 51 22 2c 20 7a 49  E name = %Q", zI
9980: 64 78 0a 20 20 20 20 20 20 29 29 3b 0a 20 20 20  dx.      ));.   
9990: 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
99a0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
99b0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
99c0: 74 65 70 28 61 53 74 6d 74 5b 32 5d 29 3d 3d 53  tep(aStmt[2])==S
99d0: 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20  QLITE_ROW ){.   
99e0: 20 20 20 20 20 20 20 2a 70 69 50 6b 20 3d 20 73         *piPk = s
99f0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
9a00: 74 28 61 53 74 6d 74 5b 32 5d 2c 20 30 29 3b 0a  t(aStmt[2], 0);.
9a10: 20 20 20 20 20 20 20 20 20 20 2a 70 65 54 79 70            *peTyp
9a20: 65 20 3d 20 52 42 55 5f 50 4b 5f 45 58 54 45 52  e = RBU_PK_EXTER
9a30: 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  NAL;.        }el
9a40: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70  se{.          *p
9a50: 65 54 79 70 65 20 3d 20 52 42 55 5f 50 4b 5f 57  eType = RBU_PK_W
9a60: 49 54 48 4f 55 54 5f 52 4f 57 49 44 3b 0a 20 20  ITHOUT_ROWID;.  
9a70: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
9a80: 20 20 20 20 20 20 67 6f 74 6f 20 72 62 75 54 61        goto rbuTa
9a90: 62 6c 65 54 79 70 65 5f 65 6e 64 3b 0a 20 20 20  bleType_end;.   
9aa0: 20 7d 0a 20 20 7d 0a 0a 20 20 70 2d 3e 72 63 20   }.  }..  p->rc 
9ab0: 3d 20 70 72 65 70 61 72 65 46 72 65 65 41 6e 64  = prepareFreeAnd
9ac0: 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e  CollectError(p->
9ad0: 64 62 4d 61 69 6e 2c 20 26 61 53 74 6d 74 5b 33  dbMain, &aStmt[3
9ae0: 5d 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 20  ], &p->zErrmsg, 
9af0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72  .    sqlite3_mpr
9b00: 69 6e 74 66 28 22 50 52 41 47 4d 41 20 74 61 62  intf("PRAGMA tab
9b10: 6c 65 5f 69 6e 66 6f 3d 25 51 22 2c 7a 54 61 62  le_info=%Q",zTab
9b20: 29 0a 20 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  ).  );.  if( p->
9b30: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
9b40: 0a 20 20 20 20 77 68 69 6c 65 28 20 73 71 6c 69  .    while( sqli
9b50: 74 65 33 5f 73 74 65 70 28 61 53 74 6d 74 5b 33  te3_step(aStmt[3
9b60: 5d 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  ])==SQLITE_ROW )
9b70: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
9b80: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 61  te3_column_int(a
9b90: 53 74 6d 74 5b 33 5d 2c 35 29 3e 30 20 29 7b 0a  Stmt[3],5)>0 ){.
9ba0: 20 20 20 20 20 20 20 20 2a 70 65 54 79 70 65 20          *peType 
9bb0: 3d 20 52 42 55 5f 50 4b 5f 49 50 4b 3b 20 20 20  = RBU_PK_IPK;   
9bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9bd0: 65 78 70 6c 69 63 69 74 20 49 50 4b 20 63 6f 6c  explicit IPK col
9be0: 75 6d 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 67  umn */.        g
9bf0: 6f 74 6f 20 72 62 75 54 61 62 6c 65 54 79 70 65  oto rbuTableType
9c00: 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _end;.      }.  
9c10: 20 20 7d 0a 20 20 20 20 2a 70 65 54 79 70 65 20    }.    *peType 
9c20: 3d 20 52 42 55 5f 50 4b 5f 4e 4f 4e 45 3b 0a 20  = RBU_PK_NONE;. 
9c30: 20 7d 0a 0a 72 62 75 54 61 62 6c 65 54 79 70 65   }..rbuTableType
9c40: 5f 65 6e 64 3a 20 7b 0a 20 20 20 20 75 6e 73 69  _end: {.    unsi
9c50: 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20 20 20  gned int i;.    
9c60: 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
9c70: 66 28 61 53 74 6d 74 29 2f 73 69 7a 65 6f 66 28  f(aStmt)/sizeof(
9c80: 61 53 74 6d 74 5b 30 5d 29 3b 20 69 2b 2b 29 7b  aStmt[0]); i++){
9c90: 0a 20 20 20 20 20 20 72 62 75 46 69 6e 61 6c 69  .      rbuFinali
9ca0: 7a 65 28 70 2c 20 61 53 74 6d 74 5b 69 5d 29 3b  ze(p, aStmt[i]);
9cb0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
9cc0: 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 68 65  .** This is a he
9cd0: 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 20 66 6f  lper function fo
9ce0: 72 20 72 62 75 4f 62 6a 49 74 65 72 43 61 63 68  r rbuObjIterCach
9cf0: 65 54 61 62 6c 65 49 6e 66 6f 28 29 2e 20 49 74  eTableInfo(). It
9d00: 20 70 6f 70 75 6c 61 74 65 73 0a 2a 2a 20 74 68   populates.** th
9d10: 65 20 70 49 74 65 72 2d 3e 61 62 49 6e 64 65 78  e pIter->abIndex
9d20: 65 64 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73  ed[] array..*/.s
9d30: 74 61 74 69 63 20 76 6f 69 64 20 72 62 75 4f 62  tatic void rbuOb
9d40: 6a 49 74 65 72 43 61 63 68 65 49 6e 64 65 78 65  jIterCacheIndexe
9d50: 64 43 6f 6c 73 28 73 71 6c 69 74 65 33 72 62 75  dCols(sqlite3rbu
9d60: 20 2a 70 2c 20 52 62 75 4f 62 6a 49 74 65 72 20   *p, RbuObjIter 
9d70: 2a 70 49 74 65 72 29 7b 0a 20 20 73 71 6c 69 74  *pIter){.  sqlit
9d80: 65 33 5f 73 74 6d 74 20 2a 70 4c 69 73 74 20 3d  e3_stmt *pList =
9d90: 20 30 3b 0a 20 20 69 6e 74 20 62 49 6e 64 65 78   0;.  int bIndex
9da0: 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e   = 0;..  if( p->
9db0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
9dc0: 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 49 74 65  .    memcpy(pIte
9dd0: 72 2d 3e 61 62 49 6e 64 65 78 65 64 2c 20 70 49  r->abIndexed, pI
9de0: 74 65 72 2d 3e 61 62 54 62 6c 50 6b 2c 20 73 69  ter->abTblPk, si
9df0: 7a 65 6f 66 28 75 38 29 2a 70 49 74 65 72 2d 3e  zeof(u8)*pIter->
9e00: 6e 54 62 6c 43 6f 6c 29 3b 0a 20 20 20 20 70 2d  nTblCol);.    p-
9e10: 3e 72 63 20 3d 20 70 72 65 70 61 72 65 46 72 65  >rc = prepareFre
9e20: 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72  eAndCollectError
9e30: 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 70 4c 69  (p->dbMain, &pLi
9e40: 73 74 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c  st, &p->zErrmsg,
9e50: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
9e60: 5f 6d 70 72 69 6e 74 66 28 22 50 52 41 47 4d 41  _mprintf("PRAGMA
9e70: 20 6d 61 69 6e 2e 69 6e 64 65 78 5f 6c 69 73 74   main.index_list
9e80: 20 3d 20 25 51 22 2c 20 70 49 74 65 72 2d 3e 7a   = %Q", pIter->z
9e90: 54 62 6c 29 0a 20 20 20 20 29 3b 0a 20 20 7d 0a  Tbl).    );.  }.
9ea0: 0a 20 20 70 49 74 65 72 2d 3e 6e 49 6e 64 65 78  .  pIter->nIndex
9eb0: 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 70   = 0;.  while( p
9ec0: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
9ed0: 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  && SQLITE_ROW==s
9ee0: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 4c 69 73  qlite3_step(pLis
9ef0: 74 29 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  t) ){.    const 
9f00: 63 68 61 72 20 2a 7a 49 64 78 20 3d 20 28 63 6f  char *zIdx = (co
9f10: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
9f20: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 4c  3_column_text(pL
9f30: 69 73 74 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c  ist, 1);.    sql
9f40: 69 74 65 33 5f 73 74 6d 74 20 2a 70 58 49 6e 66  ite3_stmt *pXInf
9f50: 6f 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 7a  o = 0;.    if( z
9f60: 49 64 78 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  Idx==0 ) break;.
9f70: 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70      p->rc = prep
9f80: 61 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63  areFreeAndCollec
9f90: 74 45 72 72 6f 72 28 70 2d 3e 64 62 4d 61 69 6e  tError(p->dbMain
9fa0: 2c 20 26 70 58 49 6e 66 6f 2c 20 26 70 2d 3e 7a  , &pXInfo, &p->z
9fb0: 45 72 72 6d 73 67 2c 0a 20 20 20 20 20 20 20 20  Errmsg,.        
9fc0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
9fd0: 22 50 52 41 47 4d 41 20 6d 61 69 6e 2e 69 6e 64  "PRAGMA main.ind
9fe0: 65 78 5f 78 69 6e 66 6f 20 3d 20 25 51 22 2c 20  ex_xinfo = %Q", 
9ff0: 7a 49 64 78 29 0a 20 20 20 20 29 3b 0a 20 20 20  zIdx).    );.   
a000: 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53   while( p->rc==S
a010: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49  QLITE_OK && SQLI
a020: 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
a030: 73 74 65 70 28 70 58 49 6e 66 6f 29 20 29 7b 0a  step(pXInfo) ){.
a040: 20 20 20 20 20 20 69 6e 74 20 69 43 69 64 20 3d        int iCid =
a050: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
a060: 69 6e 74 28 70 58 49 6e 66 6f 2c 20 31 29 3b 0a  int(pXInfo, 1);.
a070: 20 20 20 20 20 20 69 66 28 20 69 43 69 64 3e 3d        if( iCid>=
a080: 30 20 29 20 70 49 74 65 72 2d 3e 61 62 49 6e 64  0 ) pIter->abInd
a090: 65 78 65 64 5b 69 43 69 64 5d 20 3d 20 31 3b 0a  exed[iCid] = 1;.
a0a0: 20 20 20 20 7d 0a 20 20 20 20 72 62 75 46 69 6e      }.    rbuFin
a0b0: 61 6c 69 7a 65 28 70 2c 20 70 58 49 6e 66 6f 29  alize(p, pXInfo)
a0c0: 3b 0a 20 20 20 20 62 49 6e 64 65 78 20 3d 20 31  ;.    bIndex = 1
a0d0: 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 6e 49 6e  ;.    pIter->nIn
a0e0: 64 65 78 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 69 66  dex++;.  }..  if
a0f0: 28 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d  ( pIter->eType==
a100: 52 42 55 5f 50 4b 5f 57 49 54 48 4f 55 54 5f 52  RBU_PK_WITHOUT_R
a110: 4f 57 49 44 20 29 7b 0a 20 20 20 20 2f 2a 20 22  OWID ){.    /* "
a120: 50 52 41 47 4d 41 20 69 6e 64 65 78 5f 6c 69 73  PRAGMA index_lis
a130: 74 22 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20  t" includes the 
a140: 6d 61 69 6e 20 50 4b 20 62 2d 74 72 65 65 20 2a  main PK b-tree *
a150: 2f 0a 20 20 20 20 70 49 74 65 72 2d 3e 6e 49 6e  /.    pIter->nIn
a160: 64 65 78 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 72 62  dex--;.  }..  rb
a170: 75 46 69 6e 61 6c 69 7a 65 28 70 2c 20 70 4c 69  uFinalize(p, pLi
a180: 73 74 29 3b 0a 20 20 69 66 28 20 62 49 6e 64 65  st);.  if( bInde
a190: 78 3d 3d 30 20 29 20 70 49 74 65 72 2d 3e 61 62  x==0 ) pIter->ab
a1a0: 49 6e 64 65 78 65 64 20 3d 20 30 3b 0a 7d 0a 0a  Indexed = 0;.}..
a1b0: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 79 20 61  ./*.** If they a
a1c0: 72 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 70  re not already p
a1d0: 6f 70 75 6c 61 74 65 64 2c 20 70 6f 70 75 6c 61  opulated, popula
a1e0: 74 65 20 74 68 65 20 70 49 74 65 72 2d 3e 61 7a  te the pIter->az
a1f0: 54 62 6c 43 6f 6c 5b 5d 2c 0a 2a 2a 20 70 49 74  TblCol[],.** pIt
a200: 65 72 2d 3e 61 62 54 62 6c 50 6b 5b 5d 2c 20 70  er->abTblPk[], p
a210: 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 20 61 6e  Iter->nTblCol an
a220: 64 20 70 49 74 65 72 2d 3e 62 52 6f 77 69 64 20  d pIter->bRowid 
a230: 76 61 72 69 61 62 6c 65 73 20 61 63 63 6f 72 64  variables accord
a240: 69 6e 67 20 74 6f 0a 2a 2a 20 74 68 65 20 74 61  ing to.** the ta
a250: 62 6c 65 20 28 6e 6f 74 20 69 6e 64 65 78 29 20  ble (not index) 
a260: 74 68 61 74 20 74 68 65 20 69 74 65 72 61 74 6f  that the iterato
a270: 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  r currently poin
a280: 74 73 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  ts to..**.** Ret
a290: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
a2a0: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20   successful, or 
a2b0: 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
a2c0: 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 20  code otherwise. 
a2d0: 49 66 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 64  If.** an error d
a2e0: 6f 65 73 20 6f 63 63 75 72 2c 20 61 6e 20 65 72  oes occur, an er
a2f0: 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 65 72 72  ror code and err
a300: 6f 72 20 6d 65 73 73 61 67 65 20 61 72 65 20 61  or message are a
a310: 6c 73 6f 20 6c 65 66 74 20 69 6e 20 0a 2a 2a 20  lso left in .** 
a320: 74 68 65 20 52 42 55 20 68 61 6e 64 6c 65 2e 0a  the RBU handle..
a330: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62  */.static int rb
a340: 75 4f 62 6a 49 74 65 72 43 61 63 68 65 54 61 62  uObjIterCacheTab
a350: 6c 65 49 6e 66 6f 28 73 71 6c 69 74 65 33 72 62  leInfo(sqlite3rb
a360: 75 20 2a 70 2c 20 52 62 75 4f 62 6a 49 74 65 72  u *p, RbuObjIter
a370: 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20   *pIter){.  if( 
a380: 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 3d  pIter->azTblCol=
a390: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
a3a0: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
a3b0: 30 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 20  0;.    int nCol 
a3c0: 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 3b 20  = 0;.    int i; 
a3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a3e0: 20 20 20 20 20 20 20 2f 2a 20 66 6f 72 28 29 20         /* for() 
a3f0: 6c 6f 6f 70 20 69 74 65 72 61 74 6f 72 20 76 61  loop iterator va
a400: 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e  riable */.    in
a410: 74 20 62 52 62 75 52 6f 77 69 64 20 3d 20 30 3b  t bRbuRowid = 0;
a420: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
a430: 66 20 69 6e 70 75 74 20 74 61 62 6c 65 20 68 61  f input table ha
a440: 73 20 63 6f 6c 75 6d 6e 20 22 72 62 75 5f 72 6f  s column "rbu_ro
a450: 77 69 64 22 20 2a 2f 0a 20 20 20 20 69 6e 74 20  wid" */.    int 
a460: 69 4f 72 64 65 72 20 3d 20 30 3b 0a 20 20 20 20  iOrder = 0;.    
a470: 69 6e 74 20 69 54 6e 75 6d 20 3d 20 30 3b 0a 0a  int iTnum = 0;..
a480: 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75      /* Figure ou
a490: 74 20 74 68 65 20 74 79 70 65 20 6f 66 20 74 61  t the type of ta
a4a0: 62 6c 65 20 74 68 69 73 20 73 74 65 70 20 77 69  ble this step wi
a4b0: 6c 6c 20 64 65 61 6c 20 77 69 74 68 2e 20 2a 2f  ll deal with. */
a4c0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
a4d0: 65 72 2d 3e 65 54 79 70 65 3d 3d 30 20 29 3b 0a  er->eType==0 );.
a4e0: 20 20 20 20 72 62 75 54 61 62 6c 65 54 79 70 65      rbuTableType
a4f0: 28 70 2c 20 70 49 74 65 72 2d 3e 7a 54 62 6c 2c  (p, pIter->zTbl,
a500: 20 26 70 49 74 65 72 2d 3e 65 54 79 70 65 2c 20   &pIter->eType, 
a510: 26 69 54 6e 75 6d 2c 20 26 70 49 74 65 72 2d 3e  &iTnum, &pIter->
a520: 69 50 6b 54 6e 75 6d 29 3b 0a 20 20 20 20 69 66  iPkTnum);.    if
a530: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
a540: 4f 4b 20 26 26 20 70 49 74 65 72 2d 3e 65 54 79  OK && pIter->eTy
a550: 70 65 3d 3d 52 42 55 5f 50 4b 5f 4e 4f 54 41 42  pe==RBU_PK_NOTAB
a560: 4c 45 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72  LE ){.      p->r
a570: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
a580: 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 45 72 72 6d  ;.      p->zErrm
a590: 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  sg = sqlite3_mpr
a5a0: 69 6e 74 66 28 22 6e 6f 20 73 75 63 68 20 74 61  intf("no such ta
a5b0: 62 6c 65 3a 20 25 73 22 2c 20 70 49 74 65 72 2d  ble: %s", pIter-
a5c0: 3e 7a 54 62 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  >zTbl);.    }.  
a5d0: 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20 72 65    if( p->rc ) re
a5e0: 74 75 72 6e 20 70 2d 3e 72 63 3b 0a 20 20 20 20  turn p->rc;.    
a5f0: 69 66 28 20 70 49 74 65 72 2d 3e 7a 49 64 78 3d  if( pIter->zIdx=
a600: 3d 30 20 29 20 70 49 74 65 72 2d 3e 69 54 6e 75  =0 ) pIter->iTnu
a610: 6d 20 3d 20 69 54 6e 75 6d 3b 0a 0a 20 20 20 20  m = iTnum;..    
a620: 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 65  assert( pIter->e
a630: 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 4e 4f 4e  Type==RBU_PK_NON
a640: 45 20 7c 7c 20 70 49 74 65 72 2d 3e 65 54 79 70  E || pIter->eTyp
a650: 65 3d 3d 52 42 55 5f 50 4b 5f 49 50 4b 20 0a 20  e==RBU_PK_IPK . 
a660: 20 20 20 20 20 20 20 20 7c 7c 20 70 49 74 65 72          || pIter
a670: 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f  ->eType==RBU_PK_
a680: 45 58 54 45 52 4e 41 4c 20 7c 7c 20 70 49 74 65  EXTERNAL || pIte
a690: 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b  r->eType==RBU_PK
a6a0: 5f 57 49 54 48 4f 55 54 5f 52 4f 57 49 44 0a 20  _WITHOUT_ROWID. 
a6b0: 20 20 20 20 20 20 20 20 7c 7c 20 70 49 74 65 72          || pIter
a6c0: 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f  ->eType==RBU_PK_
a6d0: 56 54 41 42 0a 20 20 20 20 29 3b 0a 0a 20 20 20  VTAB.    );..   
a6e0: 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65   /* Populate the
a6f0: 20 61 7a 54 62 6c 43 6f 6c 5b 5d 20 61 6e 64 20   azTblCol[] and 
a700: 6e 54 62 6c 43 6f 6c 20 76 61 72 69 61 62 6c 65  nTblCol variable
a710: 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63  s based on the c
a720: 6f 6c 75 6d 6e 73 0a 20 20 20 20 2a 2a 20 6f 66  olumns.    ** of
a730: 20 74 68 65 20 69 6e 70 75 74 20 74 61 62 6c 65   the input table
a740: 2e 20 49 67 6e 6f 72 65 20 61 6e 79 20 69 6e 70  . Ignore any inp
a750: 75 74 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73  ut table columns
a760: 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74 68   that begin with
a770: 0a 20 20 20 20 2a 2a 20 22 72 62 75 5f 22 2e 20  .    ** "rbu_". 
a780: 20 2a 2f 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   */.    p->rc = 
a790: 70 72 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f  prepareFreeAndCo
a7a0: 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62  llectError(p->db
a7b0: 52 62 75 2c 20 26 70 53 74 6d 74 2c 20 26 70 2d  Rbu, &pStmt, &p-
a7c0: 3e 7a 45 72 72 6d 73 67 2c 20 0a 20 20 20 20 20  >zErrmsg, .     
a7d0: 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e     sqlite3_mprin
a7e0: 74 66 28 22 53 45 4c 45 43 54 20 2a 20 46 52 4f  tf("SELECT * FRO
a7f0: 4d 20 27 25 71 27 22 2c 20 70 49 74 65 72 2d 3e  M '%q'", pIter->
a800: 7a 44 61 74 61 54 62 6c 29 0a 20 20 20 20 29 3b  zDataTbl).    );
a810: 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  .    if( p->rc==
a820: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
a830: 20 20 20 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65     nCol = sqlite
a840: 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70  3_column_count(p
a850: 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 72 62 75  Stmt);.      rbu
a860: 41 6c 6c 6f 63 61 74 65 49 74 65 72 41 72 72 61  AllocateIterArra
a870: 79 73 28 70 2c 20 70 49 74 65 72 2c 20 6e 43 6f  ys(p, pIter, nCo
a880: 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  l);.    }.    fo
a890: 72 28 69 3d 30 3b 20 70 2d 3e 72 63 3d 3d 53 51  r(i=0; p->rc==SQ
a8a0: 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 6e 43 6f  LITE_OK && i<nCo
a8b0: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63  l; i++){.      c
a8c0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
a8d0: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
a8e0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e  sqlite3_column_n
a8f0: 61 6d 65 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20  ame(pStmt, i);. 
a900: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
a910: 5f 73 74 72 6e 69 63 6d 70 28 22 72 62 75 5f 22  _strnicmp("rbu_"
a920: 2c 20 7a 4e 61 6d 65 2c 20 34 29 20 29 7b 0a 20  , zName, 4) ){. 
a930: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f         char *zCo
a940: 70 79 20 3d 20 72 62 75 53 74 72 6e 64 75 70 28  py = rbuStrndup(
a950: 7a 4e 61 6d 65 2c 20 26 70 2d 3e 72 63 29 3b 0a  zName, &p->rc);.
a960: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 61          pIter->a
a970: 69 53 72 63 4f 72 64 65 72 5b 70 49 74 65 72 2d  iSrcOrder[pIter-
a980: 3e 6e 54 62 6c 43 6f 6c 5d 20 3d 20 70 49 74 65  >nTblCol] = pIte
a990: 72 2d 3e 6e 54 62 6c 43 6f 6c 3b 0a 20 20 20 20  r->nTblCol;.    
a9a0: 20 20 20 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c      pIter->azTbl
a9b0: 43 6f 6c 5b 70 49 74 65 72 2d 3e 6e 54 62 6c 43  Col[pIter->nTblC
a9c0: 6f 6c 2b 2b 5d 20 3d 20 7a 43 6f 70 79 3b 0a 20  ol++] = zCopy;. 
a9d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65 6c 73       }.      els
a9e0: 65 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33  e if( 0==sqlite3
a9f0: 5f 73 74 72 69 63 6d 70 28 22 72 62 75 5f 72 6f  _stricmp("rbu_ro
aa00: 77 69 64 22 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a  wid", zName) ){.
aa10: 20 20 20 20 20 20 20 20 62 52 62 75 52 6f 77 69          bRbuRowi
aa20: 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  d = 1;.      }. 
aa30: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
aa40: 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
aa50: 3b 0a 20 20 20 20 70 53 74 6d 74 20 3d 20 30 3b  ;.    pStmt = 0;
aa60: 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d  ..    if( p->rc=
aa70: 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20  =SQLITE_OK.     
aa80: 26 26 20 72 62 75 49 73 56 61 63 75 75 6d 28 70  && rbuIsVacuum(p
aa90: 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 62 52 62  )==0.     && bRb
aaa0: 75 52 6f 77 69 64 21 3d 28 70 49 74 65 72 2d 3e  uRowid!=(pIter->
aab0: 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 56 54  eType==RBU_PK_VT
aac0: 41 42 20 7c 7c 20 70 49 74 65 72 2d 3e 65 54 79  AB || pIter->eTy
aad0: 70 65 3d 3d 52 42 55 5f 50 4b 5f 4e 4f 4e 45 29  pe==RBU_PK_NONE)
aae0: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70 2d  .    ){.      p-
aaf0: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52  >rc = SQLITE_ERR
ab00: 4f 52 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 45 72  OR;.      p->zEr
ab10: 72 6d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  rmsg = sqlite3_m
ab20: 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  printf(.        
ab30: 20 20 22 74 61 62 6c 65 20 25 71 20 25 73 20 72    "table %q %s r
ab40: 62 75 5f 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 22  bu_rowid column"
ab50: 2c 20 70 49 74 65 72 2d 3e 7a 44 61 74 61 54 62  , pIter->zDataTb
ab60: 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 28 62 52  l,.          (bR
ab70: 62 75 52 6f 77 69 64 20 3f 20 22 6d 61 79 20 6e  buRowid ? "may n
ab80: 6f 74 20 68 61 76 65 22 20 3a 20 22 72 65 71 75  ot have" : "requ
ab90: 69 72 65 73 22 29 0a 20 20 20 20 20 20 29 3b 0a  ires").      );.
aba0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68      }..    /* Ch
abb0: 65 63 6b 20 74 68 61 74 20 61 6c 6c 20 6e 6f 6e  eck that all non
abc0: 2d 48 49 44 44 45 4e 20 63 6f 6c 75 6d 6e 73 20  -HIDDEN columns 
abd0: 69 6e 20 74 68 65 20 64 65 73 74 69 6e 61 74 69  in the destinati
abe0: 6f 6e 20 74 61 62 6c 65 20 61 72 65 20 61 6c 73  on table are als
abf0: 6f 0a 20 20 20 20 2a 2a 20 70 72 65 73 65 6e 74  o.    ** present
ac00: 20 69 6e 20 74 68 65 20 69 6e 70 75 74 20 74 61   in the input ta
ac10: 62 6c 65 2e 20 50 6f 70 75 6c 61 74 65 20 74 68  ble. Populate th
ac20: 65 20 61 62 54 62 6c 50 6b 5b 5d 2c 20 61 7a 54  e abTblPk[], azT
ac30: 62 6c 54 79 70 65 5b 5d 20 61 6e 64 0a 20 20 20  blType[] and.   
ac40: 20 2a 2a 20 61 69 54 62 6c 4f 72 64 65 72 5b 5d   ** aiTblOrder[]
ac50: 20 61 72 72 61 79 73 20 61 74 20 74 68 65 20 73   arrays at the s
ac60: 61 6d 65 20 74 69 6d 65 2e 20 20 2a 2f 0a 20 20  ame time.  */.  
ac70: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
ac80: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
ac90: 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65 46  p->rc = prepareF
aca0: 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72  reeAndCollectErr
acb0: 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 70  or(p->dbMain, &p
acc0: 53 74 6d 74 2c 20 26 70 2d 3e 7a 45 72 72 6d 73  Stmt, &p->zErrms
acd0: 67 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73 71  g, .          sq
ace0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 50  lite3_mprintf("P
acf0: 52 41 47 4d 41 20 74 61 62 6c 65 5f 69 6e 66 6f  RAGMA table_info
ad00: 28 25 51 29 22 2c 20 70 49 74 65 72 2d 3e 7a 54  (%Q)", pIter->zT
ad10: 62 6c 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  bl).      );.   
ad20: 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 70 2d   }.    while( p-
ad30: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
ad40: 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71  & SQLITE_ROW==sq
ad50: 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
ad60: 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  ) ){.      const
ad70: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 28   char *zName = (
ad80: 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
ad90: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
ada0: 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20 20  pStmt, 1);.     
adb0: 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20   if( zName==0 ) 
adc0: 62 72 65 61 6b 3b 20 20 2f 2a 20 41 6e 20 4f 4f  break;  /* An OO
add0: 4d 20 2d 20 66 69 6e 61 6c 69 7a 65 28 29 20 62  M - finalize() b
ade0: 65 6c 6f 77 20 72 65 74 75 72 6e 73 20 53 5f 4e  elow returns S_N
adf0: 4f 4d 45 4d 20 2a 2f 0a 20 20 20 20 20 20 66 6f  OMEM */.      fo
ae00: 72 28 69 3d 69 4f 72 64 65 72 3b 20 69 3c 70 49  r(i=iOrder; i<pI
ae10: 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 3b 20 69 2b  ter->nTblCol; i+
ae20: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
ae30: 30 3d 3d 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c  0==strcmp(zName,
ae40: 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c   pIter->azTblCol
ae50: 5b 69 5d 29 20 29 20 62 72 65 61 6b 3b 0a 20 20  [i]) ) break;.  
ae60: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
ae70: 69 3d 3d 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f  i==pIter->nTblCo
ae80: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  l ){.        p->
ae90: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
aea0: 52 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 7a 45  R;.        p->zE
aeb0: 72 72 6d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f  rrmsg = sqlite3_
aec0: 6d 70 72 69 6e 74 66 28 22 63 6f 6c 75 6d 6e 20  mprintf("column 
aed0: 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20 25 71 3a  missing from %q:
aee0: 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20   %s",.          
aef0: 20 20 70 49 74 65 72 2d 3e 7a 44 61 74 61 54 62    pIter->zDataTb
af00: 6c 2c 20 7a 4e 61 6d 65 0a 20 20 20 20 20 20 20  l, zName.       
af10: 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   );.      }else{
af20: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 50 6b  .        int iPk
af30: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
af40: 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 35 29 3b  n_int(pStmt, 5);
af50: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 62 4e 6f  .        int bNo
af60: 74 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 5f  tNull = sqlite3_
af70: 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74  column_int(pStmt
af80: 2c 20 33 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  , 3);.        co
af90: 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 20  nst char *zType 
afa0: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
afb0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
afc0: 78 74 28 70 53 74 6d 74 2c 20 32 29 3b 0a 0a 20  xt(pStmt, 2);.. 
afd0: 20 20 20 20 20 20 20 69 66 28 20 69 21 3d 69 4f         if( i!=iO
afe0: 72 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  rder ){.        
aff0: 20 20 53 57 41 50 28 69 6e 74 2c 20 70 49 74 65    SWAP(int, pIte
b000: 72 2d 3e 61 69 53 72 63 4f 72 64 65 72 5b 69 5d  r->aiSrcOrder[i]
b010: 2c 20 70 49 74 65 72 2d 3e 61 69 53 72 63 4f 72  , pIter->aiSrcOr
b020: 64 65 72 5b 69 4f 72 64 65 72 5d 29 3b 0a 20 20  der[iOrder]);.  
b030: 20 20 20 20 20 20 20 20 53 57 41 50 28 63 68 61          SWAP(cha
b040: 72 2a 2c 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c  r*, pIter->azTbl
b050: 43 6f 6c 5b 69 5d 2c 20 70 49 74 65 72 2d 3e 61  Col[i], pIter->a
b060: 7a 54 62 6c 43 6f 6c 5b 69 4f 72 64 65 72 5d 29  zTblCol[iOrder])
b070: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
b080: 20 20 20 20 20 70 49 74 65 72 2d 3e 61 7a 54 62       pIter->azTb
b090: 6c 54 79 70 65 5b 69 4f 72 64 65 72 5d 20 3d 20  lType[iOrder] = 
b0a0: 72 62 75 53 74 72 6e 64 75 70 28 7a 54 79 70 65  rbuStrndup(zType
b0b0: 2c 20 26 70 2d 3e 72 63 29 3b 0a 20 20 20 20 20  , &p->rc);.     
b0c0: 20 20 20 70 49 74 65 72 2d 3e 61 62 54 62 6c 50     pIter->abTblP
b0d0: 6b 5b 69 4f 72 64 65 72 5d 20 3d 20 28 69 50 6b  k[iOrder] = (iPk
b0e0: 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 70 49  !=0);.        pI
b0f0: 74 65 72 2d 3e 61 62 4e 6f 74 4e 75 6c 6c 5b 69  ter->abNotNull[i
b100: 4f 72 64 65 72 5d 20 3d 20 28 75 38 29 62 4e 6f  Order] = (u8)bNo
b110: 74 4e 75 6c 6c 20 7c 7c 20 28 69 50 6b 21 3d 30  tNull || (iPk!=0
b120: 29 3b 0a 20 20 20 20 20 20 20 20 69 4f 72 64 65  );.        iOrde
b130: 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  r++;.      }.   
b140: 20 7d 0a 0a 20 20 20 20 72 62 75 46 69 6e 61 6c   }..    rbuFinal
b150: 69 7a 65 28 70 2c 20 70 53 74 6d 74 29 3b 0a 20  ize(p, pStmt);. 
b160: 20 20 20 72 62 75 4f 62 6a 49 74 65 72 43 61 63     rbuObjIterCac
b170: 68 65 49 6e 64 65 78 65 64 43 6f 6c 73 28 70 2c  heIndexedCols(p,
b180: 20 70 49 74 65 72 29 3b 0a 20 20 20 20 61 73 73   pIter);.    ass
b190: 65 72 74 28 20 70 49 74 65 72 2d 3e 65 54 79 70  ert( pIter->eTyp
b1a0: 65 21 3d 52 42 55 5f 50 4b 5f 56 54 41 42 20 7c  e!=RBU_PK_VTAB |
b1b0: 7c 20 70 49 74 65 72 2d 3e 61 62 49 6e 64 65 78  | pIter->abIndex
b1c0: 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ed==0 );.    ass
b1d0: 65 72 74 28 20 70 49 74 65 72 2d 3e 65 54 79 70  ert( pIter->eTyp
b1e0: 65 21 3d 52 42 55 5f 50 4b 5f 56 54 41 42 20 7c  e!=RBU_PK_VTAB |
b1f0: 7c 20 70 49 74 65 72 2d 3e 6e 49 6e 64 65 78 3d  | pIter->nIndex=
b200: 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  =0 );.  }..  ret
b210: 75 72 6e 20 70 2d 3e 72 63 3b 0a 7d 0a 0a 2f 2a  urn p->rc;.}../*
b220: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
b230: 6e 20 63 6f 6e 73 74 72 75 63 74 73 20 61 6e 64  n constructs and
b240: 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74   returns a point
b250: 65 72 20 74 6f 20 61 20 6e 75 6c 2d 74 65 72 6d  er to a nul-term
b260: 69 6e 61 74 65 64 20 0a 2a 2a 20 73 74 72 69 6e  inated .** strin
b270: 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 73 6f 6d  g containing som
b280: 65 20 53 51 4c 20 63 6c 61 75 73 65 20 6f 72 20  e SQL clause or 
b290: 6c 69 73 74 20 62 61 73 65 64 20 6f 6e 20 6f 6e  list based on on
b2a0: 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65  e or more of the
b2b0: 20 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   .** column name
b2c0: 73 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72  s currently stor
b2d0: 65 64 20 69 6e 20 74 68 65 20 70 49 74 65 72 2d  ed in the pIter-
b2e0: 3e 61 7a 54 62 6c 43 6f 6c 5b 5d 20 61 72 72 61  >azTblCol[] arra
b2f0: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  y..*/.static cha
b300: 72 20 2a 72 62 75 4f 62 6a 49 74 65 72 47 65 74  r *rbuObjIterGet
b310: 43 6f 6c 6c 69 73 74 28 0a 20 20 73 71 6c 69 74  Collist(.  sqlit
b320: 65 33 72 62 75 20 2a 70 2c 20 20 20 20 20 20 20  e3rbu *p,       
b330: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 42             /* RB
b340: 55 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 52 62  U object */.  Rb
b350: 75 4f 62 6a 49 74 65 72 20 2a 70 49 74 65 72 20  uObjIter *pIter 
b360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b370: 20 4f 62 6a 65 63 74 20 69 74 65 72 61 74 6f 72   Object iterator
b380: 20 66 6f 72 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   for column name
b390: 73 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a  s */.){.  char *
b3a0: 7a 4c 69 73 74 20 3d 20 30 3b 0a 20 20 63 6f 6e  zList = 0;.  con
b3b0: 73 74 20 63 68 61 72 20 2a 7a 53 65 70 20 3d 20  st char *zSep = 
b3c0: 22 22 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  "";.  int i;.  f
b3d0: 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d  or(i=0; i<pIter-
b3e0: 3e 6e 54 62 6c 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  >nTblCol; i++){.
b3f0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
b400: 7a 20 3d 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c  z = pIter->azTbl
b410: 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 7a 4c 69 73  Col[i];.    zLis
b420: 74 20 3d 20 72 62 75 4d 50 72 69 6e 74 66 28 70  t = rbuMPrintf(p
b430: 2c 20 22 25 7a 25 73 5c 22 25 77 5c 22 22 2c 20  , "%z%s\"%w\"", 
b440: 7a 4c 69 73 74 2c 20 7a 53 65 70 2c 20 7a 29 3b  zList, zSep, z);
b450: 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 2c 20 22  .    zSep = ", "
b460: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
b470: 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  List;.}../*.** T
b480: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
b490: 75 73 65 64 20 74 6f 20 63 72 65 61 74 65 20 61  used to create a
b4a0: 20 53 45 4c 45 43 54 20 6c 69 73 74 20 28 74 68   SELECT list (th
b4b0: 65 20 6c 69 73 74 20 6f 66 20 53 51 4c 20 0a 2a  e list of SQL .*
b4c0: 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68  * expressions th
b4d0: 61 74 20 66 6f 6c 6c 6f 77 73 20 61 20 53 45 4c  at follows a SEL
b4e0: 45 43 54 20 6b 65 79 77 6f 72 64 29 20 66 6f 72  ECT keyword) for
b4f0: 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
b500: 65 6e 74 20 0a 2a 2a 20 75 73 65 64 20 74 6f 20  ent .** used to 
b510: 72 65 61 64 20 66 72 6f 6d 20 61 6e 20 64 61 74  read from an dat
b520: 61 5f 78 78 78 20 6f 72 20 72 62 75 5f 74 6d 70  a_xxx or rbu_tmp
b530: 5f 78 78 78 20 74 61 62 6c 65 20 77 68 69 6c 65  _xxx table while
b540: 20 75 70 64 61 74 69 6e 67 20 74 68 65 20 0a 2a   updating the .*
b550: 2a 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 20 63  * index object c
b560: 75 72 72 65 6e 74 6c 79 20 69 6e 64 69 63 61 74  urrently indicat
b570: 65 64 20 62 79 20 74 68 65 20 69 74 65 72 61 74  ed by the iterat
b580: 6f 72 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64  or object passed
b590: 20 61 73 20 74 68 65 20 0a 2a 2a 20 73 65 63 6f   as the .** seco
b5a0: 6e 64 20 61 72 67 75 6d 65 6e 74 2e 20 41 20 22  nd argument. A "
b5b0: 50 52 41 47 4d 41 20 69 6e 64 65 78 5f 78 69 6e  PRAGMA index_xin
b5c0: 66 6f 20 3d 20 3c 69 64 78 6e 61 6d 65 3e 22 20  fo = <idxname>" 
b5d0: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 75 73 65  statement is use
b5e0: 64 20 0a 2a 2a 20 74 6f 20 6f 62 74 61 69 6e 20  d .** to obtain 
b5f0: 74 68 65 20 72 65 71 75 69 72 65 64 20 69 6e 66  the required inf
b600: 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  ormation..**.** 
b610: 49 66 20 74 68 65 20 69 6e 64 65 78 20 69 73 20  If the index is 
b620: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
b630: 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 43   form:.**.**   C
b640: 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f  REATE INDEX i1 O
b650: 4e 20 74 31 28 63 2c 20 62 20 43 4f 4c 4c 41 54  N t1(c, b COLLAT
b660: 45 20 6e 6f 63 61 73 65 29 3b 0a 2a 2a 0a 2a 2a  E nocase);.**.**
b670: 20 61 6e 64 20 22 74 31 22 20 69 73 20 61 20 74   and "t1" is a t
b680: 61 62 6c 65 20 77 69 74 68 20 61 6e 20 65 78 70  able with an exp
b690: 6c 69 63 69 74 20 49 4e 54 45 47 45 52 20 50 52  licit INTEGER PR
b6a0: 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e  IMARY KEY column
b6b0: 20 0a 2a 2a 20 22 69 70 6b 22 2c 20 74 68 65 20   .** "ipk", the 
b6c0: 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20  returned string 
b6d0: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 60 63 60  is:.**.**   "`c`
b6e0: 20 43 4f 4c 4c 41 54 45 20 27 42 49 4e 41 52 59   COLLATE 'BINARY
b6f0: 27 2c 20 60 62 60 20 43 4f 4c 4c 41 54 45 20 27  ', `b` COLLATE '
b700: 4e 4f 43 41 53 45 27 2c 20 60 69 70 6b 60 20 43  NOCASE', `ipk` C
b710: 4f 4c 4c 41 54 45 20 27 42 49 4e 41 52 59 27 22  OLLATE 'BINARY'"
b720: 0a 2a 2a 0a 2a 2a 20 41 73 20 77 65 6c 6c 20 61  .**.** As well a
b730: 73 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73  s the returned s
b740: 74 72 69 6e 67 2c 20 74 68 72 65 65 20 6f 74 68  tring, three oth
b750: 65 72 20 6d 61 6c 6c 6f 63 27 64 20 73 74 72 69  er malloc'd stri
b760: 6e 67 73 20 61 72 65 20 0a 2a 2a 20 72 65 74 75  ngs are .** retu
b770: 72 6e 65 64 20 76 69 61 20 6f 75 74 70 75 74 20  rned via output 
b780: 70 61 72 61 6d 65 74 65 72 73 2e 20 41 73 20 66  parameters. As f
b790: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
b7a0: 70 7a 49 6d 70 6f 73 74 65 72 43 6f 6c 73 3a 20  pzImposterCols: 
b7b0: 2e 2e 2e 0a 2a 2a 20 20 20 70 7a 49 6d 70 6f 73  ....**   pzImpos
b7c0: 74 65 72 50 6b 3a 20 2e 2e 2e 0a 2a 2a 20 20 20  terPk: ....**   
b7d0: 70 7a 57 68 65 72 65 3a 20 2e 2e 2e 0a 2a 2f 0a  pzWhere: ....*/.
b7e0: 73 74 61 74 69 63 20 63 68 61 72 20 2a 72 62 75  static char *rbu
b7f0: 4f 62 6a 49 74 65 72 47 65 74 49 6e 64 65 78 43  ObjIterGetIndexC
b800: 6f 6c 73 28 0a 20 20 73 71 6c 69 74 65 33 72 62  ols(.  sqlite3rb
b810: 75 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  u *p,           
b820: 20 20 20 20 20 20 20 2f 2a 20 52 42 55 20 6f 62         /* RBU ob
b830: 6a 65 63 74 20 2a 2f 0a 20 20 52 62 75 4f 62 6a  ject */.  RbuObj
b840: 49 74 65 72 20 2a 70 49 74 65 72 2c 20 20 20 20  Iter *pIter,    
b850: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a            /* Obj
b860: 65 63 74 20 69 74 65 72 61 74 6f 72 20 66 6f 72  ect iterator for
b870: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f   column names */
b880: 0a 20 20 63 68 61 72 20 2a 2a 70 7a 49 6d 70 6f  .  char **pzImpo
b890: 73 74 65 72 43 6f 6c 73 2c 20 20 20 20 20 20 20  sterCols,       
b8a0: 20 20 20 2f 2a 20 4f 55 54 3a 20 43 6f 6c 75 6d     /* OUT: Colum
b8b0: 6e 73 20 66 6f 72 20 69 6d 70 6f 73 74 65 72 20  ns for imposter 
b8c0: 74 61 62 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20  table */.  char 
b8d0: 2a 2a 70 7a 49 6d 70 6f 73 74 65 72 50 6b 2c 20  **pzImposterPk, 
b8e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
b8f0: 54 3a 20 49 6d 70 6f 73 74 65 72 20 50 4b 20 63  T: Imposter PK c
b900: 6c 61 75 73 65 20 2a 2f 0a 20 20 63 68 61 72 20  lause */.  char 
b910: 2a 2a 70 7a 57 68 65 72 65 2c 20 20 20 20 20 20  **pzWhere,      
b920: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
b930: 54 3a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  T: WHERE clause 
b940: 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 42 69 6e 64  */.  int *pnBind
b950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b960: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54 72 62       /* OUT: Trb
b970: 75 6c 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  ul number of col
b980: 75 6d 6e 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  umns */.){.  int
b990: 20 72 63 20 3d 20 70 2d 3e 72 63 3b 20 20 20 20   rc = p->rc;    
b9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b9b0: 45 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20  Error code */.  
b9c0: 69 6e 74 20 72 63 32 3b 20 20 20 20 20 20 20 20  int rc2;        
b9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9e0: 2f 2a 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c  /* sqlite3_final
b9f0: 69 7a 65 28 29 20 72 65 74 75 72 6e 20 63 6f 64  ize() return cod
ba00: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 52 65  e */.  char *zRe
ba10: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
ba20: 20 20 20 20 20 20 20 2f 2a 20 53 74 72 69 6e 67         /* String
ba30: 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20   to return */.  
ba40: 63 68 61 72 20 2a 7a 49 6d 70 43 6f 6c 73 20 3d  char *zImpCols =
ba50: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
ba60: 2f 2a 20 53 74 72 69 6e 67 20 74 6f 20 72 65 74  /* String to ret
ba70: 75 72 6e 20 76 69 61 20 2a 70 7a 49 6d 70 6f 73  urn via *pzImpos
ba80: 74 65 72 43 6f 6c 73 20 2a 2f 0a 20 20 63 68 61  terCols */.  cha
ba90: 72 20 2a 7a 49 6d 70 50 4b 20 3d 20 30 3b 20 20  r *zImpPK = 0;  
baa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
bab0: 53 74 72 69 6e 67 20 74 6f 20 72 65 74 75 72 6e  String to return
bac0: 20 76 69 61 20 2a 70 7a 49 6d 70 6f 73 74 65 72   via *pzImposter
bad0: 50 4b 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 57  PK */.  char *zW
bae0: 68 65 72 65 20 3d 20 30 3b 20 20 20 20 20 20 20  here = 0;       
baf0: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 72 69 6e          /* Strin
bb00: 67 20 74 6f 20 72 65 74 75 72 6e 20 76 69 61 20  g to return via 
bb10: 2a 70 7a 57 68 65 72 65 20 2a 2f 0a 20 20 69 6e  *pzWhere */.  in
bb20: 74 20 6e 42 69 6e 64 20 3d 20 30 3b 20 20 20 20  t nBind = 0;    
bb30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
bb40: 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e   Value to return
bb50: 20 76 69 61 20 2a 70 6e 42 69 6e 64 20 2a 2f 0a   via *pnBind */.
bb60: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
bb70: 6f 6d 20 3d 20 22 22 3b 20 20 20 20 20 20 20 20  om = "";        
bb80: 20 20 2f 2a 20 53 65 74 20 74 6f 20 22 2c 20 22    /* Set to ", "
bb90: 20 6c 61 74 65 72 20 6f 6e 20 2a 2f 0a 20 20 63   later on */.  c
bba0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 6e 64 20  onst char *zAnd 
bbb0: 3d 20 22 22 3b 20 20 20 20 20 20 20 20 20 20 2f  = "";          /
bbc0: 2a 20 53 65 74 20 74 6f 20 22 20 41 4e 44 20 22  * Set to " AND "
bbd0: 20 6c 61 74 65 72 20 6f 6e 20 2a 2f 0a 20 20 73   later on */.  s
bbe0: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 58 49  qlite3_stmt *pXI
bbf0: 6e 66 6f 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  nfo = 0;       /
bc00: 2a 20 50 52 41 47 4d 41 20 69 6e 64 65 78 5f 78  * PRAGMA index_x
bc10: 69 6e 66 6f 20 3d 20 3f 20 2a 2f 0a 0a 20 20 69  info = ? */..  i
bc20: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
bc30: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
bc40: 70 2d 3e 7a 45 72 72 6d 73 67 3d 3d 30 20 29 3b  p->zErrmsg==0 );
bc50: 0a 20 20 20 20 72 63 20 3d 20 70 72 65 70 61 72  .    rc = prepar
bc60: 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45  eFreeAndCollectE
bc70: 72 72 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20  rror(p->dbMain, 
bc80: 26 70 58 49 6e 66 6f 2c 20 26 70 2d 3e 7a 45 72  &pXInfo, &p->zEr
bc90: 72 6d 73 67 2c 0a 20 20 20 20 20 20 20 20 73 71  rmsg,.        sq
bca0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 50  lite3_mprintf("P
bcb0: 52 41 47 4d 41 20 6d 61 69 6e 2e 69 6e 64 65 78  RAGMA main.index
bcc0: 5f 78 69 6e 66 6f 20 3d 20 25 51 22 2c 20 70 49  _xinfo = %Q", pI
bcd0: 74 65 72 2d 3e 7a 49 64 78 29 0a 20 20 20 20 29  ter->zIdx).    )
bce0: 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20  ;.  }..  while( 
bcf0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
bd00: 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
bd10: 69 74 65 33 5f 73 74 65 70 28 70 58 49 6e 66 6f  ite3_step(pXInfo
bd20: 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 43 69  ) ){.    int iCi
bd30: 64 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  d = sqlite3_colu
bd40: 6d 6e 5f 69 6e 74 28 70 58 49 6e 66 6f 2c 20 31  mn_int(pXInfo, 1
bd50: 29 3b 0a 20 20 20 20 69 6e 74 20 62 44 65 73 63  );.    int bDesc
bd60: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
bd70: 6e 5f 69 6e 74 28 70 58 49 6e 66 6f 2c 20 33 29  n_int(pXInfo, 3)
bd80: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
bd90: 20 2a 7a 43 6f 6c 6c 61 74 65 20 3d 20 28 63 6f   *zCollate = (co
bda0: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
bdb0: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 58  3_column_text(pX
bdc0: 49 6e 66 6f 2c 20 34 29 3b 0a 20 20 20 20 63 6f  Info, 4);.    co
bdd0: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a  nst char *zCol;.
bde0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
bdf0: 7a 54 79 70 65 3b 0a 0a 20 20 20 20 69 66 28 20  zType;..    if( 
be00: 69 43 69 64 3c 30 20 29 7b 0a 20 20 20 20 20 20  iCid<0 ){.      
be10: 2f 2a 20 41 6e 20 69 6e 74 65 67 65 72 20 70 72  /* An integer pr
be20: 69 6d 61 72 79 20 6b 65 79 2e 20 49 66 20 74 68  imary key. If th
be30: 65 20 74 61 62 6c 65 20 68 61 73 20 61 6e 20 65  e table has an e
be40: 78 70 6c 69 63 69 74 20 49 50 4b 2c 20 75 73 65  xplicit IPK, use
be50: 0a 20 20 20 20 20 20 2a 2a 20 69 74 73 20 6e 61  .      ** its na
be60: 6d 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 75  me. Otherwise, u
be70: 73 65 20 22 72 62 75 5f 72 6f 77 69 64 22 2e 20  se "rbu_rowid". 
be80: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 49   */.      if( pI
be90: 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f  ter->eType==RBU_
bea0: 50 4b 5f 49 50 4b 20 29 7b 0a 20 20 20 20 20 20  PK_IPK ){.      
beb0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20    int i;.       
bec0: 20 66 6f 72 28 69 3d 30 3b 20 70 49 74 65 72 2d   for(i=0; pIter-
bed0: 3e 61 62 54 62 6c 50 6b 5b 69 5d 3d 3d 30 3b 20  >abTblPk[i]==0; 
bee0: 69 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20 61 73  i++);.        as
bef0: 73 65 72 74 28 20 69 3c 70 49 74 65 72 2d 3e 6e  sert( i<pIter->n
bf00: 54 62 6c 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20  TblCol );.      
bf10: 20 20 7a 43 6f 6c 20 3d 20 70 49 74 65 72 2d 3e    zCol = pIter->
bf20: 61 7a 54 62 6c 43 6f 6c 5b 69 5d 3b 0a 20 20 20  azTblCol[i];.   
bf30: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 62 75     }else if( rbu
bf40: 49 73 56 61 63 75 75 6d 28 70 29 20 29 7b 0a 20  IsVacuum(p) ){. 
bf50: 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22 5f         zCol = "_
bf60: 72 6f 77 69 64 5f 22 3b 0a 20 20 20 20 20 20 7d  rowid_";.      }
bf70: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 43  else{.        zC
bf80: 6f 6c 20 3d 20 22 72 62 75 5f 72 6f 77 69 64 22  ol = "rbu_rowid"
bf90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
bfa0: 7a 54 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52  zType = "INTEGER
bfb0: 22 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  ";.    }else{.  
bfc0: 20 20 20 20 7a 43 6f 6c 20 3d 20 70 49 74 65 72      zCol = pIter
bfd0: 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69 43 69 64 5d  ->azTblCol[iCid]
bfe0: 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20  ;.      zType = 
bff0: 70 49 74 65 72 2d 3e 61 7a 54 62 6c 54 79 70 65  pIter->azTblType
c000: 5b 69 43 69 64 5d 3b 0a 20 20 20 20 7d 0a 0a 20  [iCid];.    }.. 
c010: 20 20 20 7a 52 65 74 20 3d 20 73 71 6c 69 74 65     zRet = sqlite
c020: 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a 25 73 5c  3_mprintf("%z%s\
c030: 22 25 77 5c 22 20 43 4f 4c 4c 41 54 45 20 25 51  "%w\" COLLATE %Q
c040: 22 2c 20 7a 52 65 74 2c 20 7a 43 6f 6d 2c 20 7a  ", zRet, zCom, z
c050: 43 6f 6c 2c 20 7a 43 6f 6c 6c 61 74 65 29 3b 0a  Col, zCollate);.
c060: 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 62      if( pIter->b
c070: 55 6e 69 71 75 65 3d 3d 30 20 7c 7c 20 73 71 6c  Unique==0 || sql
c080: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
c090: 70 58 49 6e 66 6f 2c 20 35 29 20 29 7b 0a 20 20  pXInfo, 5) ){.  
c0a0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
c0b0: 7a 4f 72 64 65 72 20 3d 20 28 62 44 65 73 63 20  zOrder = (bDesc 
c0c0: 3f 20 22 20 44 45 53 43 22 20 3a 20 22 22 29 3b  ? " DESC" : "");
c0d0: 0a 20 20 20 20 20 20 7a 49 6d 70 50 4b 20 3d 20  .      zImpPK = 
c0e0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
c0f0: 22 25 7a 25 73 5c 22 72 62 75 5f 69 6d 70 5f 25  "%z%s\"rbu_imp_%
c100: 64 25 77 5c 22 25 73 22 2c 20 0a 20 20 20 20 20  d%w\"%s", .     
c110: 20 20 20 20 20 7a 49 6d 70 50 4b 2c 20 7a 43 6f       zImpPK, zCo
c120: 6d 2c 20 6e 42 69 6e 64 2c 20 7a 43 6f 6c 2c 20  m, nBind, zCol, 
c130: 7a 4f 72 64 65 72 0a 20 20 20 20 20 20 29 3b 0a  zOrder.      );.
c140: 20 20 20 20 7d 0a 20 20 20 20 7a 49 6d 70 43 6f      }.    zImpCo
c150: 6c 73 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ls = sqlite3_mpr
c160: 69 6e 74 66 28 22 25 7a 25 73 5c 22 72 62 75 5f  intf("%z%s\"rbu_
c170: 69 6d 70 5f 25 64 25 77 5c 22 20 25 73 20 43 4f  imp_%d%w\" %s CO
c180: 4c 4c 41 54 45 20 25 51 22 2c 20 0a 20 20 20 20  LLATE %Q", .    
c190: 20 20 20 20 7a 49 6d 70 43 6f 6c 73 2c 20 7a 43      zImpCols, zC
c1a0: 6f 6d 2c 20 6e 42 69 6e 64 2c 20 7a 43 6f 6c 2c  om, nBind, zCol,
c1b0: 20 7a 54 79 70 65 2c 20 7a 43 6f 6c 6c 61 74 65   zType, zCollate
c1c0: 0a 20 20 20 20 29 3b 0a 20 20 20 20 7a 57 68 65  .    );.    zWhe
c1d0: 72 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  re = sqlite3_mpr
c1e0: 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 22 25  intf(.        "%
c1f0: 7a 25 73 5c 22 72 62 75 5f 69 6d 70 5f 25 64 25  z%s\"rbu_imp_%d%
c200: 77 5c 22 20 49 53 20 3f 22 2c 20 7a 57 68 65 72  w\" IS ?", zWher
c210: 65 2c 20 7a 41 6e 64 2c 20 6e 42 69 6e 64 2c 20  e, zAnd, nBind, 
c220: 7a 43 6f 6c 0a 20 20 20 20 29 3b 0a 20 20 20 20  zCol.    );.    
c230: 69 66 28 20 7a 52 65 74 3d 3d 30 20 7c 7c 20 7a  if( zRet==0 || z
c240: 49 6d 70 50 4b 3d 3d 30 20 7c 7c 20 7a 49 6d 70  ImpPK==0 || zImp
c250: 43 6f 6c 73 3d 3d 30 20 7c 7c 20 7a 57 68 65 72  Cols==0 || zWher
c260: 65 3d 3d 30 20 29 20 72 63 20 3d 20 53 51 4c 49  e==0 ) rc = SQLI
c270: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7a 43  TE_NOMEM;.    zC
c280: 6f 6d 20 3d 20 22 2c 20 22 3b 0a 20 20 20 20 7a  om = ", ";.    z
c290: 41 6e 64 20 3d 20 22 20 41 4e 44 20 22 3b 0a 20  And = " AND ";. 
c2a0: 20 20 20 6e 42 69 6e 64 2b 2b 3b 0a 20 20 7d 0a     nBind++;.  }.
c2b0: 0a 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33  .  rc2 = sqlite3
c2c0: 5f 66 69 6e 61 6c 69 7a 65 28 70 58 49 6e 66 6f  _finalize(pXInfo
c2d0: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
c2e0: 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63  ITE_OK ) rc = rc
c2f0: 32 3b 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51  2;..  if( rc!=SQ
c300: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
c310: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 52 65 74  qlite3_free(zRet
c320: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
c330: 72 65 65 28 7a 49 6d 70 43 6f 6c 73 29 3b 0a 20  ree(zImpCols);. 
c340: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
c350: 7a 49 6d 70 50 4b 29 3b 0a 20 20 20 20 73 71 6c  zImpPK);.    sql
c360: 69 74 65 33 5f 66 72 65 65 28 7a 57 68 65 72 65  ite3_free(zWhere
c370: 29 3b 0a 20 20 20 20 7a 52 65 74 20 3d 20 30 3b  );.    zRet = 0;
c380: 0a 20 20 20 20 7a 49 6d 70 43 6f 6c 73 20 3d 20  .    zImpCols = 
c390: 30 3b 0a 20 20 20 20 7a 49 6d 70 50 4b 20 3d 20  0;.    zImpPK = 
c3a0: 30 3b 0a 20 20 20 20 7a 57 68 65 72 65 20 3d 20  0;.    zWhere = 
c3b0: 30 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 72  0;.    p->rc = r
c3c0: 63 3b 0a 20 20 7d 0a 0a 20 20 2a 70 7a 49 6d 70  c;.  }..  *pzImp
c3d0: 6f 73 74 65 72 43 6f 6c 73 20 3d 20 7a 49 6d 70  osterCols = zImp
c3e0: 43 6f 6c 73 3b 0a 20 20 2a 70 7a 49 6d 70 6f 73  Cols;.  *pzImpos
c3f0: 74 65 72 50 6b 20 3d 20 7a 49 6d 70 50 4b 3b 0a  terPk = zImpPK;.
c400: 20 20 2a 70 7a 57 68 65 72 65 20 3d 20 7a 57 68    *pzWhere = zWh
c410: 65 72 65 3b 0a 20 20 2a 70 6e 42 69 6e 64 20 3d  ere;.  *pnBind =
c420: 20 6e 42 69 6e 64 3b 0a 20 20 72 65 74 75 72 6e   nBind;.  return
c430: 20 7a 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   zRet;.}../*.** 
c440: 41 73 73 75 6d 69 6e 67 20 74 68 65 20 63 75 72  Assuming the cur
c450: 72 65 6e 74 20 74 61 62 6c 65 20 63 6f 6c 75 6d  rent table colum
c460: 6e 73 20 61 72 65 20 22 61 22 2c 20 22 62 22 20  ns are "a", "b" 
c470: 61 6e 64 20 22 63 22 2c 20 61 6e 64 20 74 68 65  and "c", and the
c480: 20 7a 4f 62 6a 0a 2a 2a 20 70 61 72 61 6d 74 65   zObj.** paramte
c490: 72 20 69 73 20 70 61 73 73 65 64 20 22 6f 6c 64  r is passed "old
c4a0: 22 2c 20 72 65 74 75 72 6e 20 61 20 73 74 72 69  ", return a stri
c4b0: 6e 67 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  ng of the form:.
c4c0: 2a 2a 0a 2a 2a 20 20 20 20 20 22 6f 6c 64 2e 61  **.**     "old.a
c4d0: 2c 20 6f 6c 64 2e 62 2c 20 6f 6c 64 2e 62 22 0a  , old.b, old.b".
c4e0: 2a 2a 0a 2a 2a 20 57 69 74 68 20 74 68 65 20 63  **.** With the c
c4f0: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 65 73 63 61  olumn names esca
c500: 70 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74  ped..**.** For t
c510: 61 62 6c 65 73 20 77 69 74 68 20 69 6d 70 6c 69  ables with impli
c520: 63 69 74 20 72 6f 77 69 64 73 20 2d 20 52 42 55  cit rowids - RBU
c530: 5f 50 4b 5f 45 58 54 45 52 4e 41 4c 20 61 6e 64  _PK_EXTERNAL and
c540: 20 52 42 55 5f 50 4b 5f 4e 4f 4e 45 2c 20 61 70   RBU_PK_NONE, ap
c550: 70 65 6e 64 0a 2a 2a 20 74 68 65 20 74 65 78 74  pend.** the text
c560: 20 22 2c 20 6f 6c 64 2e 5f 72 6f 77 69 64 5f 22   ", old._rowid_"
c570: 20 74 6f 20 74 68 65 20 72 65 74 75 72 6e 65 64   to the returned
c580: 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69   value..*/.stati
c590: 63 20 63 68 61 72 20 2a 72 62 75 4f 62 6a 49 74  c char *rbuObjIt
c5a0: 65 72 47 65 74 4f 6c 64 6c 69 73 74 28 0a 20 20  erGetOldlist(.  
c5b0: 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 0a  sqlite3rbu *p, .
c5c0: 20 20 52 62 75 4f 62 6a 49 74 65 72 20 2a 70 49    RbuObjIter *pI
c5d0: 74 65 72 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  ter,.  const cha
c5e0: 72 20 2a 7a 4f 62 6a 0a 29 7b 0a 20 20 63 68 61  r *zObj.){.  cha
c5f0: 72 20 2a 7a 4c 69 73 74 20 3d 20 30 3b 0a 20 20  r *zList = 0;.  
c600: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
c610: 45 5f 4f 4b 20 26 26 20 70 49 74 65 72 2d 3e 61  E_OK && pIter->a
c620: 62 49 6e 64 65 78 65 64 20 29 7b 0a 20 20 20 20  bIndexed ){.    
c630: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 20 3d  const char *zS =
c640: 20 22 22 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a   "";.    int i;.
c650: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
c660: 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 3b 20 69  Iter->nTblCol; i
c670: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
c680: 49 74 65 72 2d 3e 61 62 49 6e 64 65 78 65 64 5b  Iter->abIndexed[
c690: 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  i] ){.        co
c6a0: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 20 3d  nst char *zCol =
c6b0: 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c   pIter->azTblCol
c6c0: 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 7a 4c 69  [i];.        zLi
c6d0: 73 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  st = sqlite3_mpr
c6e0: 69 6e 74 66 28 22 25 7a 25 73 25 73 2e 5c 22 25  intf("%z%s%s.\"%
c6f0: 77 5c 22 22 2c 20 7a 4c 69 73 74 2c 20 7a 53 2c  w\"", zList, zS,
c700: 20 7a 4f 62 6a 2c 20 7a 43 6f 6c 29 3b 0a 20 20   zObj, zCol);.  
c710: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c720: 20 20 20 7a 4c 69 73 74 20 3d 20 73 71 6c 69 74     zList = sqlit
c730: 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a 25 73  e3_mprintf("%z%s
c740: 4e 55 4c 4c 22 2c 20 7a 4c 69 73 74 2c 20 7a 53  NULL", zList, zS
c750: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
c760: 20 7a 53 20 3d 20 22 2c 20 22 3b 0a 20 20 20 20   zS = ", ";.    
c770: 20 20 69 66 28 20 7a 4c 69 73 74 3d 3d 30 20 29    if( zList==0 )
c780: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20  {.        p->rc 
c790: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
c7a0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
c7b0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
c7c0: 20 20 2f 2a 20 46 6f 72 20 61 20 74 61 62 6c 65    /* For a table
c7d0: 20 77 69 74 68 20 69 6d 70 6c 69 63 69 74 20 72   with implicit r
c7e0: 6f 77 69 64 73 2c 20 61 70 70 65 6e 64 20 22 6f  owids, append "o
c7f0: 6c 64 2e 5f 72 6f 77 69 64 5f 22 20 74 6f 20 74  ld._rowid_" to t
c800: 68 65 20 6c 69 73 74 2e 20 2a 2f 0a 20 20 20 20  he list. */.    
c810: 69 66 28 20 70 49 74 65 72 2d 3e 65 54 79 70 65  if( pIter->eType
c820: 3d 3d 52 42 55 5f 50 4b 5f 45 58 54 45 52 4e 41  ==RBU_PK_EXTERNA
c830: 4c 20 7c 7c 20 70 49 74 65 72 2d 3e 65 54 79 70  L || pIter->eTyp
c840: 65 3d 3d 52 42 55 5f 50 4b 5f 4e 4f 4e 45 20 29  e==RBU_PK_NONE )
c850: 7b 0a 20 20 20 20 20 20 7a 4c 69 73 74 20 3d 20  {.      zList = 
c860: 72 62 75 4d 50 72 69 6e 74 66 28 70 2c 20 22 25  rbuMPrintf(p, "%
c870: 7a 2c 20 25 73 2e 5f 72 6f 77 69 64 5f 22 2c 20  z, %s._rowid_", 
c880: 7a 4c 69 73 74 2c 20 7a 4f 62 6a 29 3b 0a 20 20  zList, zObj);.  
c890: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
c8a0: 20 7a 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   zList;.}../*.**
c8b0: 20 52 65 74 75 72 6e 20 61 6e 20 65 78 70 72 65   Return an expre
c8c0: 73 73 69 6f 6e 20 74 68 61 74 20 63 61 6e 20 62  ssion that can b
c8d0: 65 20 75 73 65 64 20 69 6e 20 61 20 57 48 45 52  e used in a WHER
c8e0: 45 20 63 6c 61 75 73 65 20 74 6f 20 6d 61 74 63  E clause to matc
c8f0: 68 20 74 68 65 0a 2a 2a 20 70 72 69 6d 61 72 79  h the.** primary
c900: 20 6b 65 79 20 6f 66 20 74 68 65 20 63 75 72 72   key of the curr
c910: 65 6e 74 20 74 61 62 6c 65 2e 20 46 6f 72 20 65  ent table. For e
c920: 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 74  xample, if the t
c930: 61 62 6c 65 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  able is:.**.**  
c940: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
c950: 28 61 2c 20 62 2c 20 63 2c 20 50 52 49 4d 41 52  (a, b, c, PRIMAR
c960: 59 20 4b 45 59 28 62 2c 20 63 29 29 3b 0a 2a 2a  Y KEY(b, c));.**
c970: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
c980: 74 72 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 22  tring:.**.**   "
c990: 62 20 3d 20 3f 31 20 41 4e 44 20 63 20 3d 20 3f  b = ?1 AND c = ?
c9a0: 32 22 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  2".*/.static cha
c9b0: 72 20 2a 72 62 75 4f 62 6a 49 74 65 72 47 65 74  r *rbuObjIterGet
c9c0: 57 68 65 72 65 28 0a 20 20 73 71 6c 69 74 65 33  Where(.  sqlite3
c9d0: 72 62 75 20 2a 70 2c 20 0a 20 20 52 62 75 4f 62  rbu *p, .  RbuOb
c9e0: 6a 49 74 65 72 20 2a 70 49 74 65 72 0a 29 7b 0a  jIter *pIter.){.
c9f0: 20 20 63 68 61 72 20 2a 7a 4c 69 73 74 20 3d 20    char *zList = 
ca00: 30 3b 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e  0;.  if( pIter->
ca10: 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 56 54  eType==RBU_PK_VT
ca20: 41 42 20 7c 7c 20 70 49 74 65 72 2d 3e 65 54 79  AB || pIter->eTy
ca30: 70 65 3d 3d 52 42 55 5f 50 4b 5f 4e 4f 4e 45 20  pe==RBU_PK_NONE 
ca40: 29 7b 0a 20 20 20 20 7a 4c 69 73 74 20 3d 20 72  ){.    zList = r
ca50: 62 75 4d 50 72 69 6e 74 66 28 70 2c 20 22 5f 72  buMPrintf(p, "_r
ca60: 6f 77 69 64 5f 20 3d 20 3f 25 64 22 2c 20 70 49  owid_ = ?%d", pI
ca70: 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 2b 31 29 3b  ter->nTblCol+1);
ca80: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 49 74  .  }else if( pIt
ca90: 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50  er->eType==RBU_P
caa0: 4b 5f 45 58 54 45 52 4e 41 4c 20 29 7b 0a 20 20  K_EXTERNAL ){.  
cab0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
cac0: 65 70 20 3d 20 22 22 3b 0a 20 20 20 20 69 6e 74  ep = "";.    int
cad0: 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
cae0: 20 69 3c 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f   i<pIter->nTblCo
caf0: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  l; i++){.      i
cb00: 66 28 20 70 49 74 65 72 2d 3e 61 62 54 62 6c 50  f( pIter->abTblP
cb10: 6b 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  k[i] ){.        
cb20: 7a 4c 69 73 74 20 3d 20 72 62 75 4d 50 72 69 6e  zList = rbuMPrin
cb30: 74 66 28 70 2c 20 22 25 7a 25 73 63 25 64 3d 3f  tf(p, "%z%sc%d=?
cb40: 25 64 22 2c 20 7a 4c 69 73 74 2c 20 7a 53 65 70  %d", zList, zSep
cb50: 2c 20 69 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20  , i, i+1);.     
cb60: 20 20 20 7a 53 65 70 20 3d 20 22 20 41 4e 44 20     zSep = " AND 
cb70: 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ";.      }.    }
cb80: 0a 20 20 20 20 7a 4c 69 73 74 20 3d 20 72 62 75  .    zList = rbu
cb90: 4d 50 72 69 6e 74 66 28 70 2c 20 0a 20 20 20 20  MPrintf(p, .    
cba0: 20 20 20 20 22 5f 72 6f 77 69 64 5f 20 3d 20 28      "_rowid_ = (
cbb0: 53 45 4c 45 43 54 20 69 64 20 46 52 4f 4d 20 72  SELECT id FROM r
cbc0: 62 75 5f 69 6d 70 6f 73 74 65 72 32 20 57 48 45  bu_imposter2 WHE
cbd0: 52 45 20 25 7a 29 22 2c 20 7a 4c 69 73 74 0a 20  RE %z)", zList. 
cbe0: 20 20 20 29 3b 0a 0a 20 20 7d 65 6c 73 65 7b 0a     );..  }else{.
cbf0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
cc00: 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20 20 20 69  zSep = "";.    i
cc10: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
cc20: 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 54 62 6c  0; i<pIter->nTbl
cc30: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
cc40: 20 69 66 28 20 70 49 74 65 72 2d 3e 61 62 54 62   if( pIter->abTb
cc50: 6c 50 6b 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20  lPk[i] ){.      
cc60: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
cc70: 6f 6c 20 3d 20 70 49 74 65 72 2d 3e 61 7a 54 62  ol = pIter->azTb
cc80: 6c 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20  lCol[i];.       
cc90: 20 7a 4c 69 73 74 20 3d 20 72 62 75 4d 50 72 69   zList = rbuMPri
cca0: 6e 74 66 28 70 2c 20 22 25 7a 25 73 5c 22 25 77  ntf(p, "%z%s\"%w
ccb0: 5c 22 3d 3f 25 64 22 2c 20 7a 4c 69 73 74 2c 20  \"=?%d", zList, 
ccc0: 7a 53 65 70 2c 20 7a 43 6f 6c 2c 20 69 2b 31 29  zSep, zCol, i+1)
ccd0: 3b 0a 20 20 20 20 20 20 20 20 7a 53 65 70 20 3d  ;.        zSep =
cce0: 20 22 20 41 4e 44 20 22 3b 0a 20 20 20 20 20 20   " AND ";.      
ccf0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
cd00: 74 75 72 6e 20 7a 4c 69 73 74 3b 0a 7d 0a 0a 2f  turn zList;.}../
cd10: 2a 0a 2a 2a 20 54 68 65 20 53 45 4c 45 43 54 20  *.** The SELECT 
cd20: 73 74 61 74 65 6d 65 6e 74 20 69 74 65 72 61 74  statement iterat
cd30: 69 6e 67 20 74 68 72 6f 75 67 68 20 74 68 65 20  ing through the 
cd40: 6b 65 79 73 20 66 6f 72 20 74 68 65 20 63 75 72  keys for the cur
cd50: 72 65 6e 74 20 6f 62 6a 65 63 74 0a 2a 2a 20 28  rent object.** (
cd60: 70 2d 3e 6f 62 6a 69 74 65 72 2e 70 53 65 6c 65  p->objiter.pSele
cd70: 63 74 29 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  ct) currently po
cd80: 69 6e 74 73 20 74 6f 20 61 20 76 61 6c 69 64 20  ints to a valid 
cd90: 72 6f 77 2e 20 48 6f 77 65 76 65 72 2c 20 74 68  row. However, th
cda0: 65 72 65 0a 2a 2a 20 69 73 20 73 6f 6d 65 74 68  ere.** is someth
cdb0: 69 6e 67 20 77 72 6f 6e 67 20 77 69 74 68 20 74  ing wrong with t
cdc0: 68 65 20 72 62 75 5f 63 6f 6e 74 72 6f 6c 20 76  he rbu_control v
cdd0: 61 6c 75 65 20 69 6e 20 74 68 65 20 72 62 75 5f  alue in the rbu_
cde0: 63 6f 6e 74 72 6f 6c 20 76 61 6c 75 65 0a 2a 2a  control value.**
cdf0: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 28   stored in the (
ce00: 70 2d 3e 6e 43 6f 6c 2b 31 29 27 74 68 20 63 6f  p->nCol+1)'th co
ce10: 6c 75 6d 6e 2e 20 53 65 74 20 74 68 65 20 65 72  lumn. Set the er
ce20: 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 65 72 72  ror code and err
ce30: 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 6f 66  or message.** of
ce40: 20 74 68 65 20 52 42 55 20 68 61 6e 64 6c 65 20   the RBU handle 
ce50: 74 6f 20 73 6f 6d 65 74 68 69 6e 67 20 72 65 66  to something ref
ce60: 6c 65 63 74 69 6e 67 20 74 68 69 73 2e 0a 2a 2f  lecting this..*/
ce70: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75  .static void rbu
ce80: 42 61 64 43 6f 6e 74 72 6f 6c 45 72 72 6f 72 28  BadControlError(
ce90: 73 71 6c 69 74 65 33 72 62 75 20 2a 70 29 7b 0a  sqlite3rbu *p){.
cea0: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
ceb0: 5f 45 52 52 4f 52 3b 0a 20 20 70 2d 3e 7a 45 72  _ERROR;.  p->zEr
cec0: 72 6d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  rmsg = sqlite3_m
ced0: 70 72 69 6e 74 66 28 22 69 6e 76 61 6c 69 64 20  printf("invalid 
cee0: 72 62 75 5f 63 6f 6e 74 72 6f 6c 20 76 61 6c 75  rbu_control valu
cef0: 65 22 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52  e");.}.../*.** R
cf00: 65 74 75 72 6e 20 61 20 6e 75 6c 2d 74 65 72 6d  eturn a nul-term
cf10: 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20 63 6f  inated string co
cf20: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 6f 6d  ntaining the com
cf30: 6d 61 20 73 65 70 61 72 61 74 65 64 20 6c 69 73  ma separated lis
cf40: 74 20 6f 66 0a 2a 2a 20 61 73 73 69 67 6e 6d 65  t of.** assignme
cf50: 6e 74 73 20 74 68 61 74 20 73 68 6f 75 6c 64 20  nts that should 
cf60: 62 65 20 69 6e 63 6c 75 64 65 64 20 66 6f 6c 6c  be included foll
cf70: 6f 77 69 6e 67 20 74 68 65 20 22 53 45 54 22 20  owing the "SET" 
cf80: 6b 65 79 77 6f 72 64 20 6f 66 0a 2a 2a 20 61 6e  keyword of.** an
cf90: 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e   UPDATE statemen
cfa0: 74 20 75 73 65 64 20 74 6f 20 75 70 64 61 74 65  t used to update
cfb0: 20 74 68 65 20 74 61 62 6c 65 20 6f 62 6a 65 63   the table objec
cfc0: 74 20 74 68 61 74 20 74 68 65 20 69 74 65 72 61  t that the itera
cfd0: 74 6f 72 0a 2a 2a 20 70 61 73 73 65 64 20 61 73  tor.** passed as
cfe0: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
cff0: 6d 65 6e 74 20 63 75 72 72 65 6e 74 6c 79 20 70  ment currently p
d000: 6f 69 6e 74 73 20 74 6f 20 69 66 20 74 68 65 20  oints to if the 
d010: 72 62 75 5f 63 6f 6e 74 72 6f 6c 0a 2a 2a 20 63  rbu_control.** c
d020: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 64 61 74  olumn of the dat
d030: 61 5f 78 78 78 20 74 61 62 6c 65 20 65 6e 74 72  a_xxx table entr
d040: 79 20 69 73 20 73 65 74 20 74 6f 20 7a 4d 61 73  y is set to zMas
d050: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 65 6d  k..**.** The mem
d060: 6f 72 79 20 66 6f 72 20 74 68 65 20 72 65 74 75  ory for the retu
d070: 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f  rned string is o
d080: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
d090: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a  ite3_malloc()..*
d0a0: 2a 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70  * It is the resp
d0b0: 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
d0c0: 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e  e caller to even
d0d0: 74 75 61 6c 6c 79 20 66 72 65 65 20 69 74 20 75  tually free it u
d0e0: 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  sing.** sqlite3_
d0f0: 66 72 65 65 28 29 2e 20 0a 2a 2a 0a 2a 2a 20 49  free(). .**.** I
d100: 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 69  f an OOM error i
d110: 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 77 68  s encountered wh
d120: 65 6e 20 61 6c 6c 6f 63 61 74 69 6e 67 20 73 70  en allocating sp
d130: 61 63 65 20 66 6f 72 20 74 68 65 20 6e 65 77 0a  ace for the new.
d140: 2a 2a 20 73 74 72 69 6e 67 2c 20 61 6e 20 65 72  ** string, an er
d150: 72 6f 72 20 63 6f 64 65 20 69 73 20 6c 65 66 74  ror code is left
d160: 20 69 6e 20 74 68 65 20 72 62 75 20 68 61 6e 64   in the rbu hand
d170: 6c 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  le passed as the
d180: 20 66 69 72 73 74 0a 2a 2a 20 61 72 67 75 6d 65   first.** argume
d190: 6e 74 20 61 6e 64 20 4e 55 4c 4c 20 69 73 20 72  nt and NULL is r
d1a0: 65 74 75 72 6e 65 64 2e 20 4f 72 2c 20 69 66 20  eturned. Or, if 
d1b0: 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72  an error has alr
d1c0: 65 61 64 79 20 6f 63 63 75 72 72 65 64 0a 2a 2a  eady occurred.**
d1d0: 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
d1e0: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 4e  ion is called, N
d1f0: 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20  ULL is returned 
d200: 69 6d 6d 65 64 69 61 74 65 6c 79 2c 20 77 69 74  immediately, wit
d210: 68 6f 75 74 0a 2a 2a 20 61 74 74 65 6d 70 74 69  hout.** attempti
d220: 6e 67 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f  ng the allocatio
d230: 6e 20 6f 72 20 6d 6f 64 69 66 79 69 6e 67 20 74  n or modifying t
d240: 68 65 20 73 74 6f 72 65 64 20 65 72 72 6f 72 20  he stored error 
d250: 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  code..*/.static 
d260: 63 68 61 72 20 2a 72 62 75 4f 62 6a 49 74 65 72  char *rbuObjIter
d270: 47 65 74 53 65 74 6c 69 73 74 28 0a 20 20 73 71  GetSetlist(.  sq
d280: 6c 69 74 65 33 72 62 75 20 2a 70 2c 0a 20 20 52  lite3rbu *p,.  R
d290: 62 75 4f 62 6a 49 74 65 72 20 2a 70 49 74 65 72  buObjIter *pIter
d2a0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
d2b0: 7a 4d 61 73 6b 0a 29 7b 0a 20 20 63 68 61 72 20  zMask.){.  char 
d2c0: 2a 7a 4c 69 73 74 20 3d 20 30 3b 0a 20 20 69 66  *zList = 0;.  if
d2d0: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
d2e0: 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  OK ){.    int i;
d2f0: 0a 0a 20 20 20 20 69 66 28 20 28 69 6e 74 29 73  ..    if( (int)s
d300: 74 72 6c 65 6e 28 7a 4d 61 73 6b 29 21 3d 70 49  trlen(zMask)!=pI
d310: 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 20 29 7b 0a  ter->nTblCol ){.
d320: 20 20 20 20 20 20 72 62 75 42 61 64 43 6f 6e 74        rbuBadCont
d330: 72 6f 6c 45 72 72 6f 72 28 70 29 3b 0a 20 20 20  rolError(p);.   
d340: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f   }else{.      co
d350: 6e 73 74 20 63 68 61 72 20 2a 7a 53 65 70 20 3d  nst char *zSep =
d360: 20 22 22 3b 0a 20 20 20 20 20 20 66 6f 72 28 69   "";.      for(i
d370: 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 54 62  =0; i<pIter->nTb
d380: 6c 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lCol; i++){.    
d390: 20 20 20 20 63 68 61 72 20 63 20 3d 20 7a 4d 61      char c = zMa
d3a0: 73 6b 5b 70 49 74 65 72 2d 3e 61 69 53 72 63 4f  sk[pIter->aiSrcO
d3b0: 72 64 65 72 5b 69 5d 5d 3b 0a 20 20 20 20 20 20  rder[i]];.      
d3c0: 20 20 69 66 28 20 63 3d 3d 27 78 27 20 29 7b 0a    if( c=='x' ){.
d3d0: 20 20 20 20 20 20 20 20 20 20 7a 4c 69 73 74 20            zList 
d3e0: 3d 20 72 62 75 4d 50 72 69 6e 74 66 28 70 2c 20  = rbuMPrintf(p, 
d3f0: 22 25 7a 25 73 5c 22 25 77 5c 22 3d 3f 25 64 22  "%z%s\"%w\"=?%d"
d400: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
d410: 20 7a 4c 69 73 74 2c 20 7a 53 65 70 2c 20 70 49   zList, zSep, pI
d420: 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69 5d  ter->azTblCol[i]
d430: 2c 20 69 2b 31 0a 20 20 20 20 20 20 20 20 20 20  , i+1.          
d440: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 53 65  );.          zSe
d450: 70 20 3d 20 22 2c 20 22 3b 0a 20 20 20 20 20 20  p = ", ";.      
d460: 20 20 7d 0a 20 20 20 20 20 20 20 20 65 6c 73 65    }.        else
d470: 20 69 66 28 20 63 3d 3d 27 64 27 20 29 7b 0a 20   if( c=='d' ){. 
d480: 20 20 20 20 20 20 20 20 20 7a 4c 69 73 74 20 3d           zList =
d490: 20 72 62 75 4d 50 72 69 6e 74 66 28 70 2c 20 22   rbuMPrintf(p, "
d4a0: 25 7a 25 73 5c 22 25 77 5c 22 3d 72 62 75 5f 64  %z%s\"%w\"=rbu_d
d4b0: 65 6c 74 61 28 5c 22 25 77 5c 22 2c 20 3f 25 64  elta(\"%w\", ?%d
d4c0: 29 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  )", .           
d4d0: 20 20 20 7a 4c 69 73 74 2c 20 7a 53 65 70 2c 20     zList, zSep, 
d4e0: 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b  pIter->azTblCol[
d4f0: 69 5d 2c 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c  i], pIter->azTbl
d500: 43 6f 6c 5b 69 5d 2c 20 69 2b 31 0a 20 20 20 20  Col[i], i+1.    
d510: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
d520: 20 20 20 7a 53 65 70 20 3d 20 22 2c 20 22 3b 0a     zSep = ", ";.
d530: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d540: 20 20 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 66    else if( c=='f
d550: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  ' ){.          z
d560: 4c 69 73 74 20 3d 20 72 62 75 4d 50 72 69 6e 74  List = rbuMPrint
d570: 66 28 70 2c 20 22 25 7a 25 73 5c 22 25 77 5c 22  f(p, "%z%s\"%w\"
d580: 3d 72 62 75 5f 66 6f 73 73 69 6c 5f 64 65 6c 74  =rbu_fossil_delt
d590: 61 28 5c 22 25 77 5c 22 2c 20 3f 25 64 29 22 2c  a(\"%w\", ?%d)",
d5a0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
d5b0: 7a 4c 69 73 74 2c 20 7a 53 65 70 2c 20 70 49 74  zList, zSep, pIt
d5c0: 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69 5d 2c  er->azTblCol[i],
d5d0: 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c   pIter->azTblCol
d5e0: 5b 69 5d 2c 20 69 2b 31 0a 20 20 20 20 20 20 20  [i], i+1.       
d5f0: 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20     );.          
d600: 7a 53 65 70 20 3d 20 22 2c 20 22 3b 0a 20 20 20  zSep = ", ";.   
d610: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
d620: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
d630: 6e 20 7a 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  n zList;.}../*.*
d640: 2a 20 52 65 74 75 72 6e 20 61 20 6e 75 6c 2d 74  * Return a nul-t
d650: 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67  erminated string
d660: 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20 6e   consisting of n
d670: 42 79 74 65 20 63 6f 6d 6d 61 20 73 65 70 61 72  Byte comma separ
d680: 61 74 65 64 0a 2a 2a 20 22 3f 22 20 65 78 70 72  ated.** "?" expr
d690: 65 73 73 69 6f 6e 73 2e 20 46 6f 72 20 65 78 61  essions. For exa
d6a0: 6d 70 6c 65 2c 20 69 66 20 6e 42 79 74 65 20 69  mple, if nByte i
d6b0: 73 20 33 2c 20 72 65 74 75 72 6e 20 61 20 70 6f  s 3, return a po
d6c0: 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 61 20 62 75  inter to.** a bu
d6d0: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
d6e0: 74 68 65 20 73 74 72 69 6e 67 20 22 3f 2c 3f 2c  the string "?,?,
d6f0: 3f 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 65  ?"..**.** The me
d700: 6d 6f 72 79 20 66 6f 72 20 74 68 65 20 72 65 74  mory for the ret
d710: 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20  urned string is 
d720: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
d730: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a  lite3_malloc()..
d740: 2a 2a 20 49 74 20 69 73 20 74 68 65 20 72 65 73  ** It is the res
d750: 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
d760: 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65  he caller to eve
d770: 6e 74 75 61 6c 6c 79 20 66 72 65 65 20 69 74 20  ntually free it 
d780: 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33  using.** sqlite3
d790: 5f 66 72 65 65 28 29 2e 20 0a 2a 2a 0a 2a 2a 20  _free(). .**.** 
d7a0: 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20  If an OOM error 
d7b0: 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 77  is encountered w
d7c0: 68 65 6e 20 61 6c 6c 6f 63 61 74 69 6e 67 20 73  hen allocating s
d7d0: 70 61 63 65 20 66 6f 72 20 74 68 65 20 6e 65 77  pace for the new
d7e0: 0a 2a 2a 20 73 74 72 69 6e 67 2c 20 61 6e 20 65  .** string, an e
d7f0: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 6c 65 66  rror code is lef
d800: 74 20 69 6e 20 74 68 65 20 72 62 75 20 68 61 6e  t in the rbu han
d810: 64 6c 65 20 70 61 73 73 65 64 20 61 73 20 74 68  dle passed as th
d820: 65 20 66 69 72 73 74 0a 2a 2a 20 61 72 67 75 6d  e first.** argum
d830: 65 6e 74 20 61 6e 64 20 4e 55 4c 4c 20 69 73 20  ent and NULL is 
d840: 72 65 74 75 72 6e 65 64 2e 20 4f 72 2c 20 69 66  returned. Or, if
d850: 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61 6c   an error has al
d860: 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 0a 2a  ready occurred.*
d870: 2a 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  * when this func
d880: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
d890: 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
d8a0: 20 69 6d 6d 65 64 69 61 74 65 6c 79 2c 20 77 69   immediately, wi
d8b0: 74 68 6f 75 74 0a 2a 2a 20 61 74 74 65 6d 70 74  thout.** attempt
d8c0: 69 6e 67 20 74 68 65 20 61 6c 6c 6f 63 61 74 69  ing the allocati
d8d0: 6f 6e 20 6f 72 20 6d 6f 64 69 66 79 69 6e 67 20  on or modifying 
d8e0: 74 68 65 20 73 74 6f 72 65 64 20 65 72 72 6f 72  the stored error
d8f0: 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   code..*/.static
d900: 20 63 68 61 72 20 2a 72 62 75 4f 62 6a 49 74 65   char *rbuObjIte
d910: 72 47 65 74 42 69 6e 64 6c 69 73 74 28 73 71 6c  rGetBindlist(sql
d920: 69 74 65 33 72 62 75 20 2a 70 2c 20 69 6e 74 20  ite3rbu *p, int 
d930: 6e 42 69 6e 64 29 7b 0a 20 20 63 68 61 72 20 2a  nBind){.  char *
d940: 7a 52 65 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20  zRet = 0;.  int 
d950: 6e 42 79 74 65 20 3d 20 6e 42 69 6e 64 2a 32 20  nByte = nBind*2 
d960: 2b 20 31 3b 0a 0a 20 20 7a 52 65 74 20 3d 20 28  + 1;..  zRet = (
d970: 63 68 61 72 2a 29 72 62 75 4d 61 6c 6c 6f 63 28  char*)rbuMalloc(
d980: 70 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28  p, nByte);.  if(
d990: 20 7a 52 65 74 20 29 7b 0a 20 20 20 20 69 6e 74   zRet ){.    int
d9a0: 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
d9b0: 20 69 3c 6e 42 69 6e 64 3b 20 69 2b 2b 29 7b 0a   i<nBind; i++){.
d9c0: 20 20 20 20 20 20 7a 52 65 74 5b 69 2a 32 5d 20        zRet[i*2] 
d9d0: 3d 20 27 3f 27 3b 0a 20 20 20 20 20 20 7a 52 65  = '?';.      zRe
d9e0: 74 5b 69 2a 32 2b 31 5d 20 3d 20 28 69 2b 31 3d  t[i*2+1] = (i+1=
d9f0: 3d 6e 42 69 6e 64 29 20 3f 20 27 5c 30 27 20 3a  =nBind) ? '\0' :
da00: 20 27 2c 27 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   ',';.    }.  }.
da10: 20 20 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d    return zRet;.}
da20: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 74 65 72  ../*.** The iter
da30: 61 74 6f 72 20 63 75 72 72 65 6e 74 6c 79 20 70  ator currently p
da40: 6f 69 6e 74 73 20 74 6f 20 61 20 74 61 62 6c 65  oints to a table
da50: 20 28 6e 6f 74 20 69 6e 64 65 78 29 20 6f 66 20   (not index) of 
da60: 74 79 70 65 20 0a 2a 2a 20 52 42 55 5f 50 4b 5f  type .** RBU_PK_
da70: 57 49 54 48 4f 55 54 5f 52 4f 57 49 44 2e 20 54  WITHOUT_ROWID. T
da80: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 72 65  his function cre
da90: 61 74 65 73 20 74 68 65 20 50 52 49 4d 41 52 59  ates the PRIMARY
daa0: 20 4b 45 59 20 0a 2a 2a 20 64 65 63 6c 61 72 61   KEY .** declara
dab0: 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 63 6f 72  tion for the cor
dac0: 72 65 73 70 6f 6e 64 69 6e 67 20 69 6d 70 6f 73  responding impos
dad0: 74 65 72 20 74 61 62 6c 65 2e 20 46 6f 72 20 65  ter table. For e
dae0: 78 61 6d 70 6c 65 2c 0a 2a 2a 20 69 66 20 74 68  xample,.** if th
daf0: 65 20 69 74 65 72 61 74 6f 72 20 70 6f 69 6e 74  e iterator point
db00: 73 20 74 6f 20 61 20 74 61 62 6c 65 20 63 72 65  s to a table cre
db10: 61 74 65 64 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20  ated as:.**.**  
db20: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
db30: 28 61 2c 20 62 2c 20 63 2c 20 50 52 49 4d 41 52  (a, b, c, PRIMAR
db40: 59 20 4b 45 59 28 62 2c 20 61 20 44 45 53 43 29  Y KEY(b, a DESC)
db50: 29 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 0a  ) WITHOUT ROWID.
db60: 2a 2a 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74  **.** this funct
db70: 69 6f 6e 20 72 65 74 75 72 6e 73 3a 0a 2a 2a 0a  ion returns:.**.
db80: 2a 2a 20 20 20 50 52 49 4d 41 52 59 20 4b 45 59  **   PRIMARY KEY
db90: 28 22 62 22 2c 20 22 61 22 20 44 45 53 43 29 0a  ("b", "a" DESC).
dba0: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
dbb0: 72 62 75 57 69 74 68 6f 75 74 52 6f 77 69 64 50  rbuWithoutRowidP
dbc0: 4b 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c  K(sqlite3rbu *p,
dbd0: 20 52 62 75 4f 62 6a 49 74 65 72 20 2a 70 49 74   RbuObjIter *pIt
dbe0: 65 72 29 7b 0a 20 20 63 68 61 72 20 2a 7a 20 3d  er){.  char *z =
dbf0: 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49   0;.  assert( pI
dc00: 74 65 72 2d 3e 7a 49 64 78 3d 3d 30 20 29 3b 0a  ter->zIdx==0 );.
dc10: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
dc20: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 6f  ITE_OK ){.    co
dc30: 6e 73 74 20 63 68 61 72 20 2a 7a 53 65 70 20 3d  nst char *zSep =
dc40: 20 22 50 52 49 4d 41 52 59 20 4b 45 59 28 22 3b   "PRIMARY KEY(";
dc50: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  .    sqlite3_stm
dc60: 74 20 2a 70 58 4c 69 73 74 20 3d 20 30 3b 20 20  t *pXList = 0;  
dc70: 20 20 20 2f 2a 20 50 52 41 47 4d 41 20 69 6e 64     /* PRAGMA ind
dc80: 65 78 5f 6c 69 73 74 20 3d 20 28 70 49 74 65 72  ex_list = (pIter
dc90: 2d 3e 7a 54 62 6c 29 20 2a 2f 0a 20 20 20 20 73  ->zTbl) */.    s
dca0: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 58 49  qlite3_stmt *pXI
dcb0: 6e 66 6f 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  nfo = 0;     /* 
dcc0: 50 52 41 47 4d 41 20 69 6e 64 65 78 5f 78 69 6e  PRAGMA index_xin
dcd0: 66 6f 20 3d 20 3c 70 6b 2d 69 6e 64 65 78 3e 20  fo = <pk-index> 
dce0: 2a 2f 0a 20 20 20 0a 20 20 20 20 70 2d 3e 72 63  */.   .    p->rc
dcf0: 20 3d 20 70 72 65 70 61 72 65 46 72 65 65 41 6e   = prepareFreeAn
dd00: 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d  dCollectError(p-
dd10: 3e 64 62 4d 61 69 6e 2c 20 26 70 58 4c 69 73 74  >dbMain, &pXList
dd20: 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 0a 20  , &p->zErrmsg,. 
dd30: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d         sqlite3_m
dd40: 70 72 69 6e 74 66 28 22 50 52 41 47 4d 41 20 6d  printf("PRAGMA m
dd50: 61 69 6e 2e 69 6e 64 65 78 5f 6c 69 73 74 20 3d  ain.index_list =
dd60: 20 25 51 22 2c 20 70 49 74 65 72 2d 3e 7a 54 62   %Q", pIter->zTb
dd70: 6c 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 77 68  l).    );.    wh
dd80: 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ile( p->rc==SQLI
dd90: 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f  TE_OK && SQLITE_
dda0: 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW==sqlite3_ste
ddb0: 70 28 70 58 4c 69 73 74 29 20 29 7b 0a 20 20 20  p(pXList) ){.   
ddc0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
ddd0: 4f 72 69 67 20 3d 20 28 63 6f 6e 73 74 20 63 68  Orig = (const ch
dde0: 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
ddf0: 6d 6e 5f 74 65 78 74 28 70 58 4c 69 73 74 2c 33  mn_text(pXList,3
de00: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 4f 72  );.      if( zOr
de10: 69 67 20 26 26 20 73 74 72 63 6d 70 28 7a 4f 72  ig && strcmp(zOr
de20: 69 67 2c 20 22 70 6b 22 29 3d 3d 30 20 29 7b 0a  ig, "pk")==0 ){.
de30: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
de40: 61 72 20 2a 7a 49 64 78 20 3d 20 28 63 6f 6e 73  ar *zIdx = (cons
de50: 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
de60: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 58 4c 69  column_text(pXLi
de70: 73 74 2c 31 29 3b 0a 20 20 20 20 20 20 20 20 69  st,1);.        i
de80: 66 28 20 7a 49 64 78 20 29 7b 0a 20 20 20 20 20  f( zIdx ){.     
de90: 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 72 65       p->rc = pre
dea0: 70 61 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65  pareFreeAndColle
deb0: 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 4d 61 69  ctError(p->dbMai
dec0: 6e 2c 20 26 70 58 49 6e 66 6f 2c 20 26 70 2d 3e  n, &pXInfo, &p->
ded0: 7a 45 72 72 6d 73 67 2c 0a 20 20 20 20 20 20 20  zErrmsg,.       
dee0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d         sqlite3_m
def0: 70 72 69 6e 74 66 28 22 50 52 41 47 4d 41 20 6d  printf("PRAGMA m
df00: 61 69 6e 2e 69 6e 64 65 78 5f 78 69 6e 66 6f 20  ain.index_xinfo 
df10: 3d 20 25 51 22 2c 20 7a 49 64 78 29 0a 20 20 20  = %Q", zIdx).   
df20: 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
df30: 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
df40: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
df50: 0a 20 20 20 20 72 62 75 46 69 6e 61 6c 69 7a 65  .    rbuFinalize
df60: 28 70 2c 20 70 58 4c 69 73 74 29 3b 0a 0a 20 20  (p, pXList);..  
df70: 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d    while( p->rc==
df80: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c  SQLITE_OK && SQL
df90: 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
dfa0: 5f 73 74 65 70 28 70 58 49 6e 66 6f 29 20 29 7b  _step(pXInfo) ){
dfb0: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
dfc0: 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 58  e3_column_int(pX
dfd0: 49 6e 66 6f 2c 20 35 29 20 29 7b 0a 20 20 20 20  Info, 5) ){.    
dfe0: 20 20 20 20 2f 2a 20 69 6e 74 20 69 43 69 64 20      /* int iCid 
dff0: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
e000: 5f 69 6e 74 28 70 58 49 6e 66 6f 2c 20 30 29 3b  _int(pXInfo, 0);
e010: 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 73   */.        cons
e020: 74 20 63 68 61 72 20 2a 7a 43 6f 6c 20 3d 20 28  t char *zCol = (
e030: 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
e040: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
e050: 70 58 49 6e 66 6f 2c 20 32 29 3b 0a 20 20 20 20  pXInfo, 2);.    
e060: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
e070: 7a 44 65 73 63 20 3d 20 73 71 6c 69 74 65 33 5f  zDesc = sqlite3_
e080: 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 58 49 6e 66  column_int(pXInf
e090: 6f 2c 20 33 29 20 3f 20 22 20 44 45 53 43 22 20  o, 3) ? " DESC" 
e0a0: 3a 20 22 22 3b 0a 20 20 20 20 20 20 20 20 7a 20  : "";.        z 
e0b0: 3d 20 72 62 75 4d 50 72 69 6e 74 66 28 70 2c 20  = rbuMPrintf(p, 
e0c0: 22 25 7a 25 73 5c 22 25 77 5c 22 25 73 22 2c 20  "%z%s\"%w\"%s", 
e0d0: 7a 2c 20 7a 53 65 70 2c 20 7a 43 6f 6c 2c 20 7a  z, zSep, zCol, z
e0e0: 44 65 73 63 29 3b 0a 20 20 20 20 20 20 20 20 7a  Desc);.        z
e0f0: 53 65 70 20 3d 20 22 2c 20 22 3b 0a 20 20 20 20  Sep = ", ";.    
e100: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 20    }.    }.    z 
e110: 3d 20 72 62 75 4d 50 72 69 6e 74 66 28 70 2c 20  = rbuMPrintf(p, 
e120: 22 25 7a 29 22 2c 20 7a 29 3b 0a 20 20 20 20 72  "%z)", z);.    r
e130: 62 75 46 69 6e 61 6c 69 7a 65 28 70 2c 20 70 58  buFinalize(p, pX
e140: 49 6e 66 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Info);.  }.  ret
e150: 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn z;.}../*.** 
e160: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 72  This function cr
e170: 65 61 74 65 73 20 74 68 65 20 73 65 63 6f 6e 64  eates the second
e180: 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 20   imposter table 
e190: 75 73 65 64 20 77 68 65 6e 20 77 72 69 74 69 6e  used when writin
e1a0: 67 20 74 6f 0a 2a 2a 20 61 20 74 61 62 6c 65 20  g to.** a table 
e1b0: 62 2d 74 72 65 65 20 77 68 65 72 65 20 74 68 65  b-tree where the
e1c0: 20 74 61 62 6c 65 20 68 61 73 20 61 6e 20 65 78   table has an ex
e1d0: 74 65 72 6e 61 6c 20 70 72 69 6d 61 72 79 20 6b  ternal primary k
e1e0: 65 79 2e 20 49 66 20 74 68 65 0a 2a 2a 20 69 74  ey. If the.** it
e1f0: 65 72 61 74 6f 72 20 70 61 73 73 65 64 20 61 73  erator passed as
e200: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
e210: 6d 65 6e 74 20 64 6f 65 73 20 6e 6f 74 20 63 75  ment does not cu
e220: 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 20 74 6f  rrently point to
e230: 0a 2a 2a 20 61 20 74 61 62 6c 65 20 28 6e 6f 74  .** a table (not
e240: 20 69 6e 64 65 78 29 20 77 69 74 68 20 61 6e 20   index) with an 
e250: 65 78 74 65 72 6e 61 6c 20 70 72 69 6d 61 72 79  external primary
e260: 20 6b 65 79 2c 20 74 68 69 73 20 66 75 6e 63 74   key, this funct
e270: 69 6f 6e 20 69 73 20 61 0a 2a 2a 20 6e 6f 2d 6f  ion is a.** no-o
e280: 70 2e 20 0a 2a 2a 0a 2a 2a 20 41 73 73 75 6d 69  p. .**.** Assumi
e290: 6e 67 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  ng the iterator 
e2a0: 64 6f 65 73 20 70 6f 69 6e 74 20 74 6f 20 61 20  does point to a 
e2b0: 74 61 62 6c 65 20 77 69 74 68 20 61 6e 20 65 78  table with an ex
e2c0: 74 65 72 6e 61 6c 20 50 4b 2c 20 74 68 69 73 0a  ternal PK, this.
e2d0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 63 72 65 61  ** function crea
e2e0: 74 65 73 20 61 20 57 49 54 48 4f 55 54 20 52 4f  tes a WITHOUT RO
e2f0: 57 49 44 20 69 6d 70 6f 73 74 65 72 20 74 61 62  WID imposter tab
e300: 6c 65 20 6e 61 6d 65 64 20 22 72 62 75 5f 69 6d  le named "rbu_im
e310: 70 6f 73 74 65 72 32 22 0a 2a 2a 20 75 73 65 64  poster2".** used
e320: 20 74 6f 20 61 63 63 65 73 73 20 74 68 61 74 20   to access that 
e330: 50 4b 20 69 6e 64 65 78 2e 20 46 6f 72 20 65 78  PK index. For ex
e340: 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 74 61  ample, if the ta
e350: 72 67 65 74 20 74 61 62 6c 65 20 69 73 0a 2a 2a  rget table is.**
e360: 20 64 65 63 6c 61 72 65 64 20 61 73 20 66 6f 6c   declared as fol
e370: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52  lows:.**.**   CR
e380: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
e390: 20 62 20 54 45 58 54 2c 20 63 20 52 45 41 4c 2c   b TEXT, c REAL,
e3a0: 20 50 52 49 4d 41 52 59 20 4b 45 59 28 62 2c 20   PRIMARY KEY(b, 
e3b0: 63 29 29 3b 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20  c));.**.** then 
e3c0: 74 68 65 20 69 6d 70 6f 73 74 65 72 20 74 61 62  the imposter tab
e3d0: 6c 65 20 73 63 68 65 6d 61 20 69 73 3a 0a 2a 2a  le schema is:.**
e3e0: 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42  .**   CREATE TAB
e3f0: 4c 45 20 72 62 75 5f 69 6d 70 6f 73 74 65 72 32  LE rbu_imposter2
e400: 28 63 31 20 54 45 58 54 2c 20 63 32 20 52 45 41  (c1 TEXT, c2 REA
e410: 4c 2c 20 69 64 20 49 4e 54 45 47 45 52 29 20 57  L, id INTEGER) W
e420: 49 54 48 4f 55 54 20 52 4f 57 49 44 3b 0a 2a 2a  ITHOUT ROWID;.**
e430: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
e440: 72 62 75 43 72 65 61 74 65 49 6d 70 6f 73 74 65  rbuCreateImposte
e450: 72 54 61 62 6c 65 32 28 73 71 6c 69 74 65 33 72  rTable2(sqlite3r
e460: 62 75 20 2a 70 2c 20 52 62 75 4f 62 6a 49 74 65  bu *p, RbuObjIte
e470: 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28  r *pIter){.  if(
e480: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
e490: 4b 20 26 26 20 70 49 74 65 72 2d 3e 65 54 79 70  K && pIter->eTyp
e4a0: 65 3d 3d 52 42 55 5f 50 4b 5f 45 58 54 45 52 4e  e==RBU_PK_EXTERN
e4b0: 41 4c 20 29 7b 0a 20 20 20 20 69 6e 74 20 74 6e  AL ){.    int tn
e4c0: 75 6d 20 3d 20 70 49 74 65 72 2d 3e 69 50 6b 54  um = pIter->iPkT
e4d0: 6e 75 6d 3b 20 20 20 20 2f 2a 20 52 6f 6f 74 20  num;    /* Root 
e4e0: 70 61 67 65 20 6f 66 20 50 4b 20 69 6e 64 65 78  page of PK index
e4f0: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   */.    sqlite3_
e500: 73 74 6d 74 20 2a 70 51 75 65 72 79 20 3d 20 30  stmt *pQuery = 0
e510: 3b 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20  ;     /* SELECT 
e520: 6e 61 6d 65 20 2e 2e 2e 20 57 48 45 52 45 20 72  name ... WHERE r
e530: 6f 6f 74 70 61 67 65 20 3d 20 24 74 6e 75 6d 20  ootpage = $tnum 
e540: 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  */.    const cha
e550: 72 20 2a 7a 49 64 78 20 3d 20 30 3b 20 20 20 20  r *zIdx = 0;    
e560: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
e570: 50 4b 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  PK index */.    
e580: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 58  sqlite3_stmt *pX
e590: 49 6e 66 6f 20 3d 20 30 3b 20 20 20 20 20 2f 2a  Info = 0;     /*
e5a0: 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e 69 6e 64   PRAGMA main.ind
e5b0: 65 78 5f 78 69 6e 66 6f 20 3d 20 24 7a 49 64 78  ex_xinfo = $zIdx
e5c0: 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   */.    const ch
e5d0: 61 72 20 2a 7a 43 6f 6d 6d 61 20 3d 20 22 22 3b  ar *zComma = "";
e5e0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 73  .    char *zCols
e5f0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
e600: 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 62 75     /* Used to bu
e610: 69 6c 64 20 75 70 20 6c 69 73 74 20 6f 66 20 74  ild up list of t
e620: 61 62 6c 65 20 63 6f 6c 73 20 2a 2f 0a 20 20 20  able cols */.   
e630: 20 63 68 61 72 20 2a 7a 50 6b 20 3d 20 30 3b 20   char *zPk = 0; 
e640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e650: 2a 20 55 73 65 64 20 74 6f 20 62 75 69 6c 64 20  * Used to build 
e660: 75 70 20 74 61 62 6c 65 20 50 4b 20 64 65 63 6c  up table PK decl
e670: 61 72 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20 20 20  aration */..    
e680: 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74 68  /* Figure out th
e690: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 70 72  e name of the pr
e6a0: 69 6d 61 72 79 20 6b 65 79 20 69 6e 64 65 78 20  imary key index 
e6b0: 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
e6c0: 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20 54 68  table..    ** Th
e6d0: 69 73 20 69 73 20 6e 65 65 64 65 64 20 66 6f 72  is is needed for
e6e0: 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f   the argument to
e6f0: 20 22 50 52 41 47 4d 41 20 69 6e 64 65 78 5f 78   "PRAGMA index_x
e700: 69 6e 66 6f 22 2e 20 53 65 74 0a 20 20 20 20 2a  info". Set.    *
e710: 2a 20 7a 49 64 78 20 74 6f 20 70 6f 69 6e 74 20  * zIdx to point 
e720: 74 6f 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  to a nul-termina
e730: 74 65 64 20 73 74 72 69 6e 67 20 63 6f 6e 74 61  ted string conta
e740: 69 6e 69 6e 67 20 74 68 69 73 20 6e 61 6d 65 2e  ining this name.
e750: 20 2a 2f 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   */.    p->rc = 
e760: 70 72 65 70 61 72 65 41 6e 64 43 6f 6c 6c 65 63  prepareAndCollec
e770: 74 45 72 72 6f 72 28 70 2d 3e 64 62 4d 61 69 6e  tError(p->dbMain
e780: 2c 20 26 70 51 75 65 72 79 2c 20 26 70 2d 3e 7a  , &pQuery, &p->z
e790: 45 72 72 6d 73 67 2c 20 0a 20 20 20 20 20 20 20  Errmsg, .       
e7a0: 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52   "SELECT name FR
e7b0: 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  OM sqlite_master
e7c0: 20 57 48 45 52 45 20 72 6f 6f 74 70 61 67 65 20   WHERE rootpage 
e7d0: 3d 20 3f 22 0a 20 20 20 20 29 3b 0a 20 20 20 20  = ?".    );.    
e7e0: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
e7f0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
e800: 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70  lite3_bind_int(p
e810: 51 75 65 72 79 2c 20 31 2c 20 74 6e 75 6d 29 3b  Query, 1, tnum);
e820: 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54  .      if( SQLIT
e830: 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73  E_ROW==sqlite3_s
e840: 74 65 70 28 70 51 75 65 72 79 29 20 29 7b 0a 20  tep(pQuery) ){. 
e850: 20 20 20 20 20 20 20 7a 49 64 78 20 3d 20 28 63         zIdx = (c
e860: 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
e870: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
e880: 51 75 65 72 79 2c 20 30 29 3b 0a 20 20 20 20 20  Query, 0);.     
e890: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
e8a0: 20 7a 49 64 78 20 29 7b 0a 20 20 20 20 20 20 70   zIdx ){.      p
e8b0: 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65 46 72  ->rc = prepareFr
e8c0: 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f  eeAndCollectErro
e8d0: 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 70 58  r(p->dbMain, &pX
e8e0: 49 6e 66 6f 2c 20 26 70 2d 3e 7a 45 72 72 6d 73  Info, &p->zErrms
e8f0: 67 2c 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  g,.          sql
e900: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 50 52  ite3_mprintf("PR
e910: 41 47 4d 41 20 6d 61 69 6e 2e 69 6e 64 65 78 5f  AGMA main.index_
e920: 78 69 6e 66 6f 20 3d 20 25 51 22 2c 20 7a 49 64  xinfo = %Q", zId
e930: 78 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  x).      );.    
e940: 7d 0a 20 20 20 20 72 62 75 46 69 6e 61 6c 69 7a  }.    rbuFinaliz
e950: 65 28 70 2c 20 70 51 75 65 72 79 29 3b 0a 0a 20  e(p, pQuery);.. 
e960: 20 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d     while( p->rc=
e970: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51  =SQLITE_OK && SQ
e980: 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65  LITE_ROW==sqlite
e990: 33 5f 73 74 65 70 28 70 58 49 6e 66 6f 29 20 29  3_step(pXInfo) )
e9a0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 4b 65 79  {.      int bKey
e9b0: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
e9c0: 6e 5f 69 6e 74 28 70 58 49 6e 66 6f 2c 20 35 29  n_int(pXInfo, 5)
e9d0: 3b 0a 20 20 20 20 20 20 69 66 28 20 62 4b 65 79  ;.      if( bKey
e9e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
e9f0: 69 43 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 63  iCid = sqlite3_c
ea00: 6f 6c 75 6d 6e 5f 69 6e 74 28 70 58 49 6e 66 6f  olumn_int(pXInfo
ea10: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 6e  , 1);.        in
ea20: 74 20 62 44 65 73 63 20 3d 20 73 71 6c 69 74 65  t bDesc = sqlite
ea30: 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 58 49  3_column_int(pXI
ea40: 6e 66 6f 2c 20 33 29 3b 0a 20 20 20 20 20 20 20  nfo, 3);.       
ea50: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
ea60: 6c 6c 61 74 65 20 3d 20 28 63 6f 6e 73 74 20 63  llate = (const c
ea70: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
ea80: 75 6d 6e 5f 74 65 78 74 28 70 58 49 6e 66 6f 2c  umn_text(pXInfo,
ea90: 20 34 29 3b 0a 20 20 20 20 20 20 20 20 7a 43 6f   4);.        zCo
eaa0: 6c 73 20 3d 20 72 62 75 4d 50 72 69 6e 74 66 28  ls = rbuMPrintf(
eab0: 70 2c 20 22 25 7a 25 73 63 25 64 20 25 73 20 43  p, "%z%sc%d %s C
eac0: 4f 4c 4c 41 54 45 20 25 73 22 2c 20 7a 43 6f 6c  OLLATE %s", zCol
ead0: 73 2c 20 7a 43 6f 6d 6d 61 2c 20 0a 20 20 20 20  s, zComma, .    
eae0: 20 20 20 20 20 20 20 20 69 43 69 64 2c 20 70 49          iCid, pI
eaf0: 74 65 72 2d 3e 61 7a 54 62 6c 54 79 70 65 5b 69  ter->azTblType[i
eb00: 43 69 64 5d 2c 20 7a 43 6f 6c 6c 61 74 65 0a 20  Cid], zCollate. 
eb10: 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
eb20: 20 20 7a 50 6b 20 3d 20 72 62 75 4d 50 72 69 6e    zPk = rbuMPrin
eb30: 74 66 28 70 2c 20 22 25 7a 25 73 63 25 64 25 73  tf(p, "%z%sc%d%s
eb40: 22 2c 20 7a 50 6b 2c 20 7a 43 6f 6d 6d 61 2c 20  ", zPk, zComma, 
eb50: 69 43 69 64 2c 20 62 44 65 73 63 3f 22 20 44 45  iCid, bDesc?" DE
eb60: 53 43 22 3a 22 22 29 3b 0a 20 20 20 20 20 20 20  SC":"");.       
eb70: 20 7a 43 6f 6d 6d 61 20 3d 20 22 2c 20 22 3b 0a   zComma = ", ";.
eb80: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
eb90: 20 20 7a 43 6f 6c 73 20 3d 20 72 62 75 4d 50 72    zCols = rbuMPr
eba0: 69 6e 74 66 28 70 2c 20 22 25 7a 2c 20 69 64 20  intf(p, "%z, id 
ebb0: 49 4e 54 45 47 45 52 22 2c 20 7a 43 6f 6c 73 29  INTEGER", zCols)
ebc0: 3b 0a 20 20 20 20 72 62 75 46 69 6e 61 6c 69 7a  ;.    rbuFinaliz
ebd0: 65 28 70 2c 20 70 58 49 6e 66 6f 29 3b 0a 0a 20  e(p, pXInfo);.. 
ebe0: 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f     sqlite3_test_
ebf0: 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
ec00: 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52  ESTCTRL_IMPOSTER
ec10: 2c 20 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 6d 61  , p->dbMain, "ma
ec20: 69 6e 22 2c 20 31 2c 20 74 6e 75 6d 29 3b 0a 20  in", 1, tnum);. 
ec30: 20 20 20 72 62 75 4d 50 72 69 6e 74 66 45 78 65     rbuMPrintfExe
ec40: 63 28 70 2c 20 70 2d 3e 64 62 4d 61 69 6e 2c 0a  c(p, p->dbMain,.
ec50: 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20          "CREATE 
ec60: 54 41 42 4c 45 20 72 62 75 5f 69 6d 70 6f 73 74  TABLE rbu_impost
ec70: 65 72 32 28 25 7a 2c 20 50 52 49 4d 41 52 59 20  er2(%z, PRIMARY 
ec80: 4b 45 59 28 25 7a 29 29 20 57 49 54 48 4f 55 54  KEY(%z)) WITHOUT
ec90: 20 52 4f 57 49 44 22 2c 20 0a 20 20 20 20 20 20   ROWID", .      
eca0: 20 20 7a 43 6f 6c 73 2c 20 7a 50 6b 0a 20 20 20    zCols, zPk.   
ecb0: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   );.    sqlite3_
ecc0: 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
ecd0: 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50  ITE_TESTCTRL_IMP
ece0: 4f 53 54 45 52 2c 20 70 2d 3e 64 62 4d 61 69 6e  OSTER, p->dbMain
ecf0: 2c 20 22 6d 61 69 6e 22 2c 20 30 2c 20 30 29 3b  , "main", 0, 0);
ed00: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  .  }.}../*.** If
ed10: 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61 6c   an error has al
ed20: 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 20 77  ready occurred w
ed30: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
ed40: 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20  n is called, it 
ed50: 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  .** immediately 
ed60: 72 65 74 75 72 6e 73 20 7a 65 72 6f 20 28 77 69  returns zero (wi
ed70: 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 20  thout doing any 
ed80: 77 6f 72 6b 29 2e 20 4f 72 2c 20 69 66 20 61 6e  work). Or, if an
ed90: 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75 72 73   error.** occurs
eda0: 20 64 75 72 69 6e 67 20 74 68 65 20 65 78 65 63   during the exec
edb0: 75 74 69 6f 6e 20 6f 66 20 74 68 69 73 20 66 75  ution of this fu
edc0: 6e 63 74 69 6f 6e 2c 20 69 74 20 73 65 74 73 20  nction, it sets 
edd0: 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a  the error code.*
ede0: 2a 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 33  * in the sqlite3
edf0: 72 62 75 20 6f 62 6a 65 63 74 20 69 6e 64 69 63  rbu object indic
ee00: 61 74 65 64 20 62 79 20 74 68 65 20 66 69 72 73  ated by the firs
ee10: 74 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 72  t argument and r
ee20: 65 74 75 72 6e 73 0a 2a 2a 20 7a 65 72 6f 2e 0a  eturns.** zero..
ee30: 2a 2a 0a 2a 2a 20 54 68 65 20 69 74 65 72 61 74  **.** The iterat
ee40: 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65  or passed as the
ee50: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
ee60: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
ee70: 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 61 20  o point to.** a 
ee80: 74 61 62 6c 65 20 28 6e 6f 74 20 61 6e 20 69 6e  table (not an in
ee90: 64 65 78 29 20 77 68 65 6e 20 74 68 69 73 20 66  dex) when this f
eea0: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
eeb0: 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  d. This function
eec0: 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20  .** attempts to 
eed0: 63 72 65 61 74 65 20 61 6e 79 20 69 6d 70 6f 73  create any impos
eee0: 74 65 72 20 74 61 62 6c 65 20 72 65 71 75 69 72  ter table requir
eef0: 65 64 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74  ed to write to t
ef00: 68 65 20 6d 61 69 6e 0a 2a 2a 20 74 61 62 6c 65  he main.** table
ef10: 20 62 2d 74 72 65 65 20 6f 66 20 74 68 65 20 74   b-tree of the t
ef20: 61 62 6c 65 20 62 65 66 6f 72 65 20 72 65 74 75  able before retu
ef30: 72 6e 69 6e 67 2e 20 4e 6f 6e 2d 7a 65 72 6f 20  rning. Non-zero 
ef40: 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 0a 2a  is returned if.*
ef50: 2a 20 61 6e 20 69 6d 70 6f 73 74 65 72 20 74 61  * an imposter ta
ef60: 62 6c 65 20 61 72 65 20 63 72 65 61 74 65 64 2c  ble are created,
ef70: 20 6f 72 20 7a 65 72 6f 20 6f 74 68 65 72 77 69   or zero otherwi
ef80: 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6d 70  se..**.** An imp
ef90: 6f 73 74 65 72 20 74 61 62 6c 65 20 69 73 20 72  oster table is r
efa0: 65 71 75 69 72 65 64 20 69 6e 20 61 6c 6c 20 63  equired in all c
efb0: 61 73 65 73 20 65 78 63 65 70 74 20 52 42 55 5f  ases except RBU_
efc0: 50 4b 5f 56 54 41 42 2e 20 4f 6e 6c 79 0a 2a 2a  PK_VTAB. Only.**
efd0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20   virtual tables 
efe0: 61 72 65 20 77 72 69 74 74 65 6e 20 74 6f 20 64  are written to d
eff0: 69 72 65 63 74 6c 79 2e 20 54 68 65 20 69 6d 70  irectly. The imp
f000: 6f 73 74 65 72 20 74 61 62 6c 65 20 68 61 73 20  oster table has 
f010: 74 68 65 20 0a 2a 2a 20 73 61 6d 65 20 73 63 68  the .** same sch
f020: 65 6d 61 20 61 73 20 74 68 65 20 61 63 74 75 61  ema as the actua
f030: 6c 20 74 61 72 67 65 74 20 74 61 62 6c 65 20 28  l target table (
f040: 6c 65 73 73 20 61 6e 79 20 55 4e 49 51 55 45 20  less any UNIQUE 
f050: 63 6f 6e 73 74 72 61 69 6e 74 73 29 2e 20 0a 2a  constraints). .*
f060: 2a 20 4d 6f 72 65 20 70 72 65 63 69 73 65 6c 79  * More precisely
f070: 2c 20 74 68 65 20 22 73 61 6d 65 20 73 63 68 65  , the "same sche
f080: 6d 61 22 20 6d 65 61 6e 73 20 74 68 65 20 73 61  ma" means the sa
f090: 6d 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 79 70 65  me columns, type
f0a0: 73 2c 20 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e  s, .** collation
f0b0: 20 73 65 71 75 65 6e 63 65 73 2e 20 46 6f 72 20   sequences. For 
f0c0: 74 61 62 6c 65 73 20 74 68 61 74 20 64 6f 20 6e  tables that do n
f0d0: 6f 74 20 68 61 76 65 20 61 6e 20 65 78 74 65 72  ot have an exter
f0e0: 6e 61 6c 20 50 52 49 4d 41 52 59 0a 2a 2a 20 4b  nal PRIMARY.** K
f0f0: 45 59 2c 20 69 74 20 61 6c 73 6f 20 6d 65 61 6e  EY, it also mean
f100: 73 20 74 68 65 20 73 61 6d 65 20 50 52 49 4d 41  s the same PRIMA
f110: 52 59 20 4b 45 59 20 64 65 63 6c 61 72 61 74 69  RY KEY declarati
f120: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
f130: 69 64 20 72 62 75 43 72 65 61 74 65 49 6d 70 6f  id rbuCreateImpo
f140: 73 74 65 72 54 61 62 6c 65 28 73 71 6c 69 74 65  sterTable(sqlite
f150: 33 72 62 75 20 2a 70 2c 20 52 62 75 4f 62 6a 49  3rbu *p, RbuObjI
f160: 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69  ter *pIter){.  i
f170: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
f180: 5f 4f 4b 20 26 26 20 70 49 74 65 72 2d 3e 65 54  _OK && pIter->eT
f190: 79 70 65 21 3d 52 42 55 5f 50 4b 5f 56 54 41 42  ype!=RBU_PK_VTAB
f1a0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 74 6e 75 6d   ){.    int tnum
f1b0: 20 3d 20 70 49 74 65 72 2d 3e 69 54 6e 75 6d 3b   = pIter->iTnum;
f1c0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
f1d0: 2a 7a 43 6f 6d 6d 61 20 3d 20 22 22 3b 0a 20 20  *zComma = "";.  
f1e0: 20 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 30    char *zSql = 0
f1f0: 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b 0a  ;.    int iCol;.
f200: 20 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74      sqlite3_test
f210: 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
f220: 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45  TESTCTRL_IMPOSTE
f230: 52 2c 20 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 6d  R, p->dbMain, "m
f240: 61 69 6e 22 2c 20 30 2c 20 31 29 3b 0a 0a 20 20  ain", 0, 1);..  
f250: 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 70 2d    for(iCol=0; p-
f260: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
f270: 26 20 69 43 6f 6c 3c 70 49 74 65 72 2d 3e 6e 54  & iCol<pIter->nT
f280: 62 6c 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a  blCol; iCol++){.
f290: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
f2a0: 20 2a 7a 50 6b 20 3d 20 22 22 3b 0a 20 20 20 20   *zPk = "";.    
f2b0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
f2c0: 6f 6c 20 3d 20 70 49 74 65 72 2d 3e 61 7a 54 62  ol = pIter->azTb
f2d0: 6c 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20  lCol[iCol];.    
f2e0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
f2f0: 6f 6c 6c 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20  oll = 0;..      
f300: 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  p->rc = sqlite3_
f310: 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74  table_column_met
f320: 61 64 61 74 61 28 0a 20 20 20 20 20 20 20 20 20  adata(.         
f330: 20 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 6d 61 69   p->dbMain, "mai
f340: 6e 22 2c 20 70 49 74 65 72 2d 3e 7a 54 62 6c 2c  n", pIter->zTbl,
f350: 20 7a 43 6f 6c 2c 20 30 2c 20 26 7a 43 6f 6c 6c   zCol, 0, &zColl
f360: 2c 20 30 2c 20 30 2c 20 30 0a 20 20 20 20 20 20  , 0, 0, 0.      
f370: 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 49  );..      if( pI
f380: 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f  ter->eType==RBU_
f390: 50 4b 5f 49 50 4b 20 26 26 20 70 49 74 65 72 2d  PK_IPK && pIter-
f3a0: 3e 61 62 54 62 6c 50 6b 5b 69 43 6f 6c 5d 20 29  >abTblPk[iCol] )
f3b0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
f3c0: 74 68 65 20 74 61 72 67 65 74 20 74 61 62 6c 65  the target table
f3d0: 20 63 6f 6c 75 6d 6e 20 69 73 20 61 6e 20 22 49   column is an "I
f3e0: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
f3f0: 45 59 22 2c 20 61 64 64 0a 20 20 20 20 20 20 20  EY", add.       
f400: 20 2a 2a 20 22 50 52 49 4d 41 52 59 20 4b 45 59   ** "PRIMARY KEY
f410: 22 20 74 6f 20 74 68 65 20 69 6d 70 6f 73 74 65  " to the imposte
f420: 72 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 64  r table column d
f430: 65 63 6c 61 72 61 74 69 6f 6e 2e 20 2a 2f 0a 20  eclaration. */. 
f440: 20 20 20 20 20 20 20 7a 50 6b 20 3d 20 22 50 52         zPk = "PR
f450: 49 4d 41 52 59 20 4b 45 59 20 22 3b 0a 20 20 20  IMARY KEY ";.   
f460: 20 20 20 7d 0a 20 20 20 20 20 20 7a 53 71 6c 20     }.      zSql 
f470: 3d 20 72 62 75 4d 50 72 69 6e 74 66 28 70 2c 20  = rbuMPrintf(p, 
f480: 22 25 7a 25 73 5c 22 25 77 5c 22 20 25 73 20 25  "%z%s\"%w\" %s %
f490: 73 43 4f 4c 4c 41 54 45 20 25 73 25 73 22 2c 20  sCOLLATE %s%s", 
f4a0: 0a 20 20 20 20 20 20 20 20 20 20 7a 53 71 6c 2c  .          zSql,
f4b0: 20 7a 43 6f 6d 6d 61 2c 20 7a 43 6f 6c 2c 20 70   zComma, zCol, p
f4c0: 49 74 65 72 2d 3e 61 7a 54 62 6c 54 79 70 65 5b  Iter->azTblType[
f4d0: 69 43 6f 6c 5d 2c 20 7a 50 6b 2c 20 7a 43 6f 6c  iCol], zPk, zCol
f4e0: 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 28 70 49  l,.          (pI
f4f0: 74 65 72 2d 3e 61 62 4e 6f 74 4e 75 6c 6c 5b 69  ter->abNotNull[i
f500: 43 6f 6c 5d 20 3f 20 22 20 4e 4f 54 20 4e 55 4c  Col] ? " NOT NUL
f510: 4c 22 20 3a 20 22 22 29 0a 20 20 20 20 20 20 29  L" : "").      )
f520: 3b 0a 20 20 20 20 20 20 7a 43 6f 6d 6d 61 20 3d  ;.      zComma =
f530: 20 22 2c 20 22 3b 0a 20 20 20 20 7d 0a 0a 20 20   ", ";.    }..  
f540: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 65 54 79    if( pIter->eTy
f550: 70 65 3d 3d 52 42 55 5f 50 4b 5f 57 49 54 48 4f  pe==RBU_PK_WITHO
f560: 55 54 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20  UT_ROWID ){.    
f570: 20 20 63 68 61 72 20 2a 7a 50 6b 20 3d 20 72 62    char *zPk = rb
f580: 75 57 69 74 68 6f 75 74 52 6f 77 69 64 50 4b 28  uWithoutRowidPK(
f590: 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20  p, pIter);.     
f5a0: 20 69 66 28 20 7a 50 6b 20 29 7b 0a 20 20 20 20   if( zPk ){.    
f5b0: 20 20 20 20 7a 53 71 6c 20 3d 20 72 62 75 4d 50      zSql = rbuMP
f5c0: 72 69 6e 74 66 28 70 2c 20 22 25 7a 2c 20 25 7a  rintf(p, "%z, %z
f5d0: 22 2c 20 7a 53 71 6c 2c 20 7a 50 6b 29 3b 0a 20  ", zSql, zPk);. 
f5e0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
f5f0: 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
f600: 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
f610: 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52 2c  STCTRL_IMPOSTER,
f620: 20 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 6d 61 69   p->dbMain, "mai
f630: 6e 22 2c 20 31 2c 20 74 6e 75 6d 29 3b 0a 20 20  n", 1, tnum);.  
f640: 20 20 72 62 75 4d 50 72 69 6e 74 66 45 78 65 63    rbuMPrintfExec
f650: 28 70 2c 20 70 2d 3e 64 62 4d 61 69 6e 2c 20 22  (p, p->dbMain, "
f660: 43 52 45 41 54 45 20 54 41 42 4c 45 20 5c 22 72  CREATE TABLE \"r
f670: 62 75 5f 69 6d 70 5f 25 77 5c 22 28 25 7a 29 25  bu_imp_%w\"(%z)%
f680: 73 22 2c 20 0a 20 20 20 20 20 20 20 20 70 49 74  s", .        pIt
f690: 65 72 2d 3e 7a 54 62 6c 2c 20 7a 53 71 6c 2c 20  er->zTbl, zSql, 
f6a0: 0a 20 20 20 20 20 20 20 20 28 70 49 74 65 72 2d  .        (pIter-
f6b0: 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 57  >eType==RBU_PK_W
f6c0: 49 54 48 4f 55 54 5f 52 4f 57 49 44 20 3f 20 22  ITHOUT_ROWID ? "
f6d0: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 22 20   WITHOUT ROWID" 
f6e0: 3a 20 22 22 29 0a 20 20 20 20 29 3b 0a 20 20 20  : "").    );.   
f6f0: 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
f700: 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
f710: 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52 2c 20  TCTRL_IMPOSTER, 
f720: 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 6d 61 69 6e  p->dbMain, "main
f730: 22 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a  ", 0, 0);.  }.}.
f740: 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20 61  ./*.** Prepare a
f750: 20 73 74 61 74 65 6d 65 6e 74 20 75 73 65 64 20   statement used 
f760: 74 6f 20 69 6e 73 65 72 74 20 72 6f 77 73 20 69  to insert rows i
f770: 6e 74 6f 20 74 68 65 20 22 72 62 75 5f 74 6d 70  nto the "rbu_tmp
f780: 5f 78 78 78 22 20 74 61 62 6c 65 2e 0a 2a 2a 20  _xxx" table..** 
f790: 53 70 65 63 69 66 69 63 61 6c 6c 79 20 61 20 73  Specifically a s
f7a0: 74 61 74 65 6d 65 6e 74 20 6f 66 20 74 68 65 20  tatement of the 
f7b0: 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  form:.**.**     
f7c0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 72 62 75 5f  INSERT INTO rbu_
f7d0: 74 6d 70 5f 78 78 78 20 56 41 4c 55 45 53 28 3f  tmp_xxx VALUES(?
f7e0: 2c 20 3f 2c 20 3f 20 2e 2e 2e 29 3b 0a 2a 2a 0a  , ?, ? ...);.**.
f7f0: 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** The number of
f800: 20 62 6f 75 6e 64 20 76 61 72 69 61 62 6c 65 73   bound variables
f810: 20 69 73 20 65 71 75 61 6c 20 74 6f 20 74 68 65   is equal to the
f820: 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
f830: 6e 73 20 69 6e 0a 2a 2a 20 74 68 65 20 74 61 72  ns in.** the tar
f840: 67 65 74 20 74 61 62 6c 65 2c 20 70 6c 75 73 20  get table, plus 
f850: 6f 6e 65 20 28 66 6f 72 20 74 68 65 20 72 62 75  one (for the rbu
f860: 5f 63 6f 6e 74 72 6f 6c 20 63 6f 6c 75 6d 6e 29  _control column)
f870: 2c 20 70 6c 75 73 20 6f 6e 65 20 6d 6f 72 65 20  , plus one more 
f880: 0a 2a 2a 20 28 66 6f 72 20 74 68 65 20 72 62 75  .** (for the rbu
f890: 5f 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 29 20 69  _rowid column) i
f8a0: 66 20 74 68 65 20 74 61 72 67 65 74 20 74 61 62  f the target tab
f8b0: 6c 65 20 69 73 20 61 6e 20 69 6d 70 6c 69 63 69  le is an implici
f8c0: 74 20 49 50 4b 20 6f 72 20 0a 2a 2a 20 76 69 72  t IPK or .** vir
f8d0: 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73  tual table..*/.s
f8e0: 74 61 74 69 63 20 76 6f 69 64 20 72 62 75 4f 62  tatic void rbuOb
f8f0: 6a 49 74 65 72 50 72 65 70 61 72 65 54 6d 70 49  jIterPrepareTmpI
f900: 6e 73 65 72 74 28 0a 20 20 73 71 6c 69 74 65 33  nsert(.  sqlite3
f910: 72 62 75 20 2a 70 2c 20 0a 20 20 52 62 75 4f 62  rbu *p, .  RbuOb
f920: 6a 49 74 65 72 20 2a 70 49 74 65 72 2c 0a 20 20  jIter *pIter,.  
f930: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
f940: 6c 69 73 74 2c 0a 20 20 63 6f 6e 73 74 20 63 68  list,.  const ch
f950: 61 72 20 2a 7a 52 62 75 52 6f 77 69 64 0a 29 7b  ar *zRbuRowid.){
f960: 0a 20 20 69 6e 74 20 62 52 62 75 52 6f 77 69 64  .  int bRbuRowid
f970: 20 3d 20 28 70 49 74 65 72 2d 3e 65 54 79 70 65   = (pIter->eType
f980: 3d 3d 52 42 55 5f 50 4b 5f 45 58 54 45 52 4e 41  ==RBU_PK_EXTERNA
f990: 4c 20 7c 7c 20 70 49 74 65 72 2d 3e 65 54 79 70  L || pIter->eTyp
f9a0: 65 3d 3d 52 42 55 5f 50 4b 5f 4e 4f 4e 45 29 3b  e==RBU_PK_NONE);
f9b0: 0a 20 20 63 68 61 72 20 2a 7a 42 69 6e 64 20 3d  .  char *zBind =
f9c0: 20 72 62 75 4f 62 6a 49 74 65 72 47 65 74 42 69   rbuObjIterGetBi
f9d0: 6e 64 6c 69 73 74 28 70 2c 20 70 49 74 65 72 2d  ndlist(p, pIter-
f9e0: 3e 6e 54 62 6c 43 6f 6c 20 2b 20 31 20 2b 20 62  >nTblCol + 1 + b
f9f0: 52 62 75 52 6f 77 69 64 29 3b 0a 20 20 69 66 28  RbuRowid);.  if(
fa00: 20 7a 42 69 6e 64 20 29 7b 0a 20 20 20 20 61 73   zBind ){.    as
fa10: 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70 54 6d  sert( pIter->pTm
fa20: 70 49 6e 73 65 72 74 3d 3d 30 20 29 3b 0a 20 20  pInsert==0 );.  
fa30: 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72    p->rc = prepar
fa40: 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45  eFreeAndCollectE
fa50: 72 72 6f 72 28 0a 20 20 20 20 20 20 20 20 70 2d  rror(.        p-
fa60: 3e 64 62 52 62 75 2c 20 26 70 49 74 65 72 2d 3e  >dbRbu, &pIter->
fa70: 70 54 6d 70 49 6e 73 65 72 74 2c 20 26 70 2d 3e  pTmpInsert, &p->
fa80: 7a 45 72 72 6d 73 67 2c 20 73 71 6c 69 74 65 33  zErrmsg, sqlite3
fa90: 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20  _mprintf(.      
faa0: 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f      "INSERT INTO
fab0: 20 25 73 2e 27 72 62 75 5f 74 6d 70 5f 25 71 27   %s.'rbu_tmp_%q'
fac0: 28 72 62 75 5f 63 6f 6e 74 72 6f 6c 2c 25 73 25  (rbu_control,%s%
fad0: 73 29 20 56 41 4c 55 45 53 28 25 7a 29 22 2c 20  s) VALUES(%z)", 
fae0: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 53  .          p->zS
faf0: 74 61 74 65 44 62 2c 20 70 49 74 65 72 2d 3e 7a  tateDb, pIter->z
fb00: 44 61 74 61 54 62 6c 2c 20 7a 43 6f 6c 6c 69 73  DataTbl, zCollis
fb10: 74 2c 20 7a 52 62 75 52 6f 77 69 64 2c 20 7a 42  t, zRbuRowid, zB
fb20: 69 6e 64 0a 20 20 20 20 29 29 3b 0a 20 20 7d 0a  ind.    ));.  }.
fb30: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  }..static void r
fb40: 62 75 54 6d 70 49 6e 73 65 72 74 46 75 6e 63 28  buTmpInsertFunc(
fb50: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
fb60: 78 74 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74  xt *pCtx, .  int
fb70: 20 6e 56 61 6c 2c 0a 20 20 73 71 6c 69 74 65 33   nVal,.  sqlite3
fb80: 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 0a 29  _value **apVal.)
fb90: 7b 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20 2a  {.  sqlite3rbu *
fba0: 70 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72  p = sqlite3_user
fbb0: 5f 64 61 74 61 28 70 43 74 78 29 3b 0a 20 20 69  _data(pCtx);.  i
fbc0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
fbd0: 4b 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61  K;.  int i;..  a
fbe0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76  ssert( sqlite3_v
fbf0: 61 6c 75 65 5f 69 6e 74 28 61 70 56 61 6c 5b 30  alue_int(apVal[0
fc00: 5d 29 21 3d 30 0a 20 20 20 20 20 20 7c 7c 20 70  ])!=0.      || p
fc10: 2d 3e 6f 62 6a 69 74 65 72 2e 65 54 79 70 65 3d  ->objiter.eType=
fc20: 3d 52 42 55 5f 50 4b 5f 45 58 54 45 52 4e 41 4c  =RBU_PK_EXTERNAL
fc30: 20 0a 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6f 62   .      || p->ob
fc40: 6a 69 74 65 72 2e 65 54 79 70 65 3d 3d 52 42 55  jiter.eType==RBU
fc50: 5f 50 4b 5f 4e 4f 4e 45 20 0a 20 20 29 3b 0a 20  _PK_NONE .  );. 
fc60: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c   if( sqlite3_val
fc70: 75 65 5f 69 6e 74 28 61 70 56 61 6c 5b 30 5d 29  ue_int(apVal[0])
fc80: 21 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 50  !=0 ){.    p->nP
fc90: 68 61 73 65 4f 6e 65 53 74 65 70 20 2b 3d 20 70  haseOneStep += p
fca0: 2d 3e 6f 62 6a 69 74 65 72 2e 6e 49 6e 64 65 78  ->objiter.nIndex
fcb0: 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 3d 30  ;.  }..  for(i=0
fcc0: 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
fcd0: 26 26 20 69 3c 6e 56 61 6c 3b 20 69 2b 2b 29 7b  && i<nVal; i++){
fce0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
fcf0: 33 5f 62 69 6e 64 5f 76 61 6c 75 65 28 70 2d 3e  3_bind_value(p->
fd00: 6f 62 6a 69 74 65 72 2e 70 54 6d 70 49 6e 73 65  objiter.pTmpInse
fd10: 72 74 2c 20 69 2b 31 2c 20 61 70 56 61 6c 5b 69  rt, i+1, apVal[i
fd20: 5d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  ]);.  }.  if( rc
fd30: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
fd40: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28     sqlite3_step(
fd50: 70 2d 3e 6f 62 6a 69 74 65 72 2e 70 54 6d 70 49  p->objiter.pTmpI
fd60: 6e 73 65 72 74 29 3b 0a 20 20 20 20 72 63 20 3d  nsert);.    rc =
fd70: 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
fd80: 2d 3e 6f 62 6a 69 74 65 72 2e 70 54 6d 70 49 6e  ->objiter.pTmpIn
fd90: 73 65 72 74 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  sert);.  }..  if
fda0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
fdb0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ){.    sqlite3_r
fdc0: 65 73 75 6c 74 5f 65 72 72 6f 72 5f 63 6f 64 65  esult_error_code
fdd0: 28 70 43 74 78 2c 20 72 63 29 3b 0a 20 20 7d 0a  (pCtx, rc);.  }.
fde0: 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 73 75 72 65 20  }../*.** Ensure 
fdf0: 74 68 61 74 20 74 68 65 20 53 51 4c 69 74 65 20  that the SQLite 
fe00: 73 74 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65  statement handle
fe10: 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 75 70  s required to up
fe20: 64 61 74 65 20 74 68 65 20 0a 2a 2a 20 74 61 72  date the .** tar
fe30: 67 65 74 20 64 61 74 61 62 61 73 65 20 6f 62 6a  get database obj
fe40: 65 63 74 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  ect currently in
fe50: 64 69 63 61 74 65 64 20 62 79 20 74 68 65 20 69  dicated by the i
fe60: 74 65 72 61 74 6f 72 20 70 61 73 73 65 64 20 0a  terator passed .
fe70: 2a 2a 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ** as the second
fe80: 20 61 72 67 75 6d 65 6e 74 20 61 72 65 20 61 76   argument are av
fe90: 61 69 6c 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  ailable..*/.stat
fea0: 69 63 20 69 6e 74 20 72 62 75 4f 62 6a 49 74 65  ic int rbuObjIte
feb0: 72 50 72 65 70 61 72 65 41 6c 6c 28 0a 20 20 73  rPrepareAll(.  s
fec0: 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 0a 20  qlite3rbu *p, . 
fed0: 20 52 62 75 4f 62 6a 49 74 65 72 20 2a 70 49 74   RbuObjIter *pIt
fee0: 65 72 2c 0a 20 20 69 6e 74 20 6e 4f 66 66 73 65  er,.  int nOffse
fef0: 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
ff00: 20 20 20 20 20 20 2f 2a 20 41 64 64 20 22 4c 49        /* Add "LI
ff10: 4d 49 54 20 2d 31 20 4f 46 46 53 45 54 20 24 6e  MIT -1 OFFSET $n
ff20: 4f 66 66 73 65 74 22 20 74 6f 20 53 45 4c 45 43  Offset" to SELEC
ff30: 54 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74  T */.){.  assert
ff40: 28 20 70 49 74 65 72 2d 3e 62 43 6c 65 61 6e 75  ( pIter->bCleanu
ff50: 70 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 49  p==0 );.  if( pI
ff60: 74 65 72 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20  ter->pSelect==0 
ff70: 26 26 20 72 62 75 4f 62 6a 49 74 65 72 43 61 63  && rbuObjIterCac
ff80: 68 65 54 61 62 6c 65 49 6e 66 6f 28 70 2c 20 70  heTableInfo(p, p
ff90: 49 74 65 72 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  Iter)==SQLITE_OK
ffa0: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e   ){.    const in
ffb0: 74 20 74 6e 75 6d 20 3d 20 70 49 74 65 72 2d 3e  t tnum = pIter->
ffc0: 69 54 6e 75 6d 3b 0a 20 20 20 20 63 68 61 72 20  iTnum;.    char 
ffd0: 2a 7a 43 6f 6c 6c 69 73 74 20 3d 20 30 3b 20 20  *zCollist = 0;  
ffe0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
fff0: 20 6f 66 20 69 6e 64 65 78 65 64 20 63 6f 6c 75   of indexed colu
10000 6d 6e 73 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  mns */.    char 
10010 2a 2a 70 7a 20 3d 20 26 70 2d 3e 7a 45 72 72 6d  **pz = &p->zErrm
10020 73 67 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  sg;.    const ch
10030 61 72 20 2a 7a 49 64 78 20 3d 20 70 49 74 65 72  ar *zIdx = pIter
10040 2d 3e 7a 49 64 78 3b 0a 20 20 20 20 63 68 61 72  ->zIdx;.    char
10050 20 2a 7a 4c 69 6d 69 74 20 3d 20 30 3b 0a 0a 20   *zLimit = 0;.. 
10060 20 20 20 69 66 28 20 6e 4f 66 66 73 65 74 20 29     if( nOffset )
10070 7b 0a 20 20 20 20 20 20 7a 4c 69 6d 69 74 20 3d  {.      zLimit =
10080 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
10090 28 22 20 4c 49 4d 49 54 20 2d 31 20 4f 46 46 53  (" LIMIT -1 OFFS
100a0 45 54 20 25 64 22 2c 20 6e 4f 66 66 73 65 74 29  ET %d", nOffset)
100b0 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 4c 69  ;.      if( !zLi
100c0 6d 69 74 20 29 20 70 2d 3e 72 63 20 3d 20 53 51  mit ) p->rc = SQ
100d0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
100e0 7d 0a 0a 20 20 20 20 69 66 28 20 7a 49 64 78 20  }..    if( zIdx 
100f0 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
10100 68 61 72 20 2a 7a 54 62 6c 20 3d 20 70 49 74 65  har *zTbl = pIte
10110 72 2d 3e 7a 54 62 6c 3b 0a 20 20 20 20 20 20 63  r->zTbl;.      c
10120 68 61 72 20 2a 7a 49 6d 70 6f 73 74 65 72 43 6f  har *zImposterCo
10130 6c 73 20 3d 20 30 3b 20 20 20 20 2f 2a 20 43 6f  ls = 0;    /* Co
10140 6c 75 6d 6e 73 20 66 6f 72 20 69 6d 70 6f 73 74  lumns for impost
10150 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  er table */.    
10160 20 20 63 68 61 72 20 2a 7a 49 6d 70 6f 73 74 65    char *zImposte
10170 72 50 4b 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  rPK = 0;      /*
10180 20 50 72 69 6d 61 72 79 20 6b 65 79 20 64 65 63   Primary key dec
10190 6c 61 72 61 74 69 6f 6e 20 66 6f 72 20 69 6d 70  laration for imp
101a0 6f 73 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 63  oster */.      c
101b0 68 61 72 20 2a 7a 57 68 65 72 65 20 3d 20 30 3b  har *zWhere = 0;
101c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 48             /* WH
101d0 45 52 45 20 63 6c 61 75 73 65 20 6f 6e 20 50 4b  ERE clause on PK
101e0 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20   columns */.    
101f0 20 20 63 68 61 72 20 2a 7a 42 69 6e 64 20 3d 20    char *zBind = 
10200 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 69  0;.      int nBi
10210 6e 64 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 61  nd = 0;..      a
10220 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 65 54  ssert( pIter->eT
10230 79 70 65 21 3d 52 42 55 5f 50 4b 5f 56 54 41 42  ype!=RBU_PK_VTAB
10240 20 29 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 69   );.      zColli
10250 73 74 20 3d 20 72 62 75 4f 62 6a 49 74 65 72 47  st = rbuObjIterG
10260 65 74 49 6e 64 65 78 43 6f 6c 73 28 0a 20 20 20  etIndexCols(.   
10270 20 20 20 20 20 20 20 70 2c 20 70 49 74 65 72 2c         p, pIter,
10280 20 26 7a 49 6d 70 6f 73 74 65 72 43 6f 6c 73 2c   &zImposterCols,
10290 20 26 7a 49 6d 70 6f 73 74 65 72 50 4b 2c 20 26   &zImposterPK, &
102a0 7a 57 68 65 72 65 2c 20 26 6e 42 69 6e 64 0a 20  zWhere, &nBind. 
102b0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7a 42       );.      zB
102c0 69 6e 64 20 3d 20 72 62 75 4f 62 6a 49 74 65 72  ind = rbuObjIter
102d0 47 65 74 42 69 6e 64 6c 69 73 74 28 70 2c 20 6e  GetBindlist(p, n
102e0 42 69 6e 64 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  Bind);..      /*
102f0 20 43 72 65 61 74 65 20 74 68 65 20 69 6d 70 6f   Create the impo
10300 73 74 65 72 20 74 61 62 6c 65 20 75 73 65 64 20  ster table used 
10310 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 69 73  to write to this
10320 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20 20 20 20   index. */.     
10330 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
10340 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
10350 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52 2c 20  TCTRL_IMPOSTER, 
10360 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 6d 61 69 6e  p->dbMain, "main
10370 22 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20 20 20  ", 0, 1);.      
10380 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
10390 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
103a0 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52 2c 20 70  CTRL_IMPOSTER, p
103b0 2d 3e 64 62 4d 61 69 6e 2c 20 22 6d 61 69 6e 22  ->dbMain, "main"
103c0 2c 20 31 2c 74 6e 75 6d 29 3b 0a 20 20 20 20 20  , 1,tnum);.     
103d0 20 72 62 75 4d 50 72 69 6e 74 66 45 78 65 63 28   rbuMPrintfExec(
103e0 70 2c 20 70 2d 3e 64 62 4d 61 69 6e 2c 0a 20 20  p, p->dbMain,.  
103f0 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20          "CREATE 
10400 54 41 42 4c 45 20 5c 22 72 62 75 5f 69 6d 70 5f  TABLE \"rbu_imp_
10410 25 77 5c 22 28 20 25 73 2c 20 50 52 49 4d 41 52  %w\"( %s, PRIMAR
10420 59 20 4b 45 59 28 20 25 73 20 29 20 29 20 57 49  Y KEY( %s ) ) WI
10430 54 48 4f 55 54 20 52 4f 57 49 44 22 2c 0a 20 20  THOUT ROWID",.  
10440 20 20 20 20 20 20 20 20 7a 54 62 6c 2c 20 7a 49          zTbl, zI
10450 6d 70 6f 73 74 65 72 43 6f 6c 73 2c 20 7a 49 6d  mposterCols, zIm
10460 70 6f 73 74 65 72 50 4b 0a 20 20 20 20 20 20 29  posterPK.      )
10470 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
10480 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
10490 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50  ITE_TESTCTRL_IMP
104a0 4f 53 54 45 52 2c 20 70 2d 3e 64 62 4d 61 69 6e  OSTER, p->dbMain
104b0 2c 20 22 6d 61 69 6e 22 2c 20 30 2c 20 30 29 3b  , "main", 0, 0);
104c0 0a 0a 20 20 20 20 20 20 2f 2a 20 43 72 65 61 74  ..      /* Creat
104d0 65 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  e the statement 
104e0 74 6f 20 69 6e 73 65 72 74 20 69 6e 64 65 78 20  to insert index 
104f0 65 6e 74 72 69 65 73 20 2a 2f 0a 20 20 20 20 20  entries */.     
10500 20 70 49 74 65 72 2d 3e 6e 43 6f 6c 20 3d 20 6e   pIter->nCol = n
10510 42 69 6e 64 3b 0a 20 20 20 20 20 20 69 66 28 20  Bind;.      if( 
10520 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
10530 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72   ){.        p->r
10540 63 20 3d 20 70 72 65 70 61 72 65 46 72 65 65 41  c = prepareFreeA
10550 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 0a  ndCollectError(.
10560 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 64              p->d
10570 62 4d 61 69 6e 2c 20 26 70 49 74 65 72 2d 3e 70  bMain, &pIter->p
10580 49 6e 73 65 72 74 2c 20 26 70 2d 3e 7a 45 72 72  Insert, &p->zErr
10590 6d 73 67 2c 0a 20 20 20 20 20 20 20 20 20 20 73  msg,.          s
105a0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
105b0 49 4e 53 45 52 54 20 49 4e 54 4f 20 5c 22 72 62  INSERT INTO \"rb
105c0 75 5f 69 6d 70 5f 25 77 5c 22 20 56 41 4c 55 45  u_imp_%w\" VALUE
105d0 53 28 25 73 29 22 2c 20 7a 54 62 6c 2c 20 7a 42  S(%s)", zTbl, zB
105e0 69 6e 64 29 0a 20 20 20 20 20 20 20 20 29 3b 0a  ind).        );.
105f0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
10600 2a 20 41 6e 64 20 74 6f 20 64 65 6c 65 74 65 20  * And to delete 
10610 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20 2a 2f  index entries */
10620 0a 20 20 20 20 20 20 69 66 28 20 72 62 75 49 73  .      if( rbuIs
10630 56 61 63 75 75 6d 28 70 29 3d 3d 30 20 26 26 20  Vacuum(p)==0 && 
10640 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
10650 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72   ){.        p->r
10660 63 20 3d 20 70 72 65 70 61 72 65 46 72 65 65 41  c = prepareFreeA
10670 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 0a  ndCollectError(.
10680 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 64              p->d
10690 62 4d 61 69 6e 2c 20 26 70 49 74 65 72 2d 3e 70  bMain, &pIter->p
106a0 44 65 6c 65 74 65 2c 20 26 70 2d 3e 7a 45 72 72  Delete, &p->zErr
106b0 6d 73 67 2c 0a 20 20 20 20 20 20 20 20 20 20 73  msg,.          s
106c0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
106d0 44 45 4c 45 54 45 20 46 52 4f 4d 20 5c 22 72 62  DELETE FROM \"rb
106e0 75 5f 69 6d 70 5f 25 77 5c 22 20 57 48 45 52 45  u_imp_%w\" WHERE
106f0 20 25 73 22 2c 20 7a 54 62 6c 2c 20 7a 57 68 65   %s", zTbl, zWhe
10700 72 65 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  re).        );. 
10710 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
10720 20 43 72 65 61 74 65 20 74 68 65 20 53 45 4c 45   Create the SELE
10730 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20  CT statement to 
10740 72 65 61 64 20 6b 65 79 73 20 69 6e 20 73 6f 72  read keys in sor
10750 74 65 64 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20  ted order */.   
10760 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
10770 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
10780 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20     char *zSql;. 
10790 20 20 20 20 20 20 20 69 66 28 20 72 62 75 49 73         if( rbuIs
107a0 56 61 63 75 75 6d 28 70 29 20 29 7b 0a 20 20 20  Vacuum(p) ){.   
107b0 20 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73 71         zSql = sq
107c0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20  lite3_mprintf(. 
107d0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 53 45               "SE
107e0 4c 45 43 54 20 25 73 2c 20 30 20 41 53 20 72 62  LECT %s, 0 AS rb
107f0 75 5f 63 6f 6e 74 72 6f 6c 20 46 52 4f 4d 20 27  u_control FROM '
10800 25 71 27 20 4f 52 44 45 52 20 42 59 20 25 73 25  %q' ORDER BY %s%
10810 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s",.            
10820 20 20 7a 43 6f 6c 6c 69 73 74 2c 20 0a 20 20 20    zCollist, .   
10830 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72             pIter
10840 2d 3e 7a 44 61 74 61 54 62 6c 2c 0a 20 20 20 20  ->zDataTbl,.    
10850 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 6c 69            zColli
10860 73 74 2c 20 7a 4c 69 6d 69 74 0a 20 20 20 20 20  st, zLimit.     
10870 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
10880 7d 65 6c 73 65 0a 0a 20 20 20 20 20 20 20 20 69  }else..        i
10890 66 28 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d  f( pIter->eType=
108a0 3d 52 42 55 5f 50 4b 5f 45 58 54 45 52 4e 41 4c  =RBU_PK_EXTERNAL
108b0 20 7c 7c 20 70 49 74 65 72 2d 3e 65 54 79 70 65   || pIter->eType
108c0 3d 3d 52 42 55 5f 50 4b 5f 4e 4f 4e 45 20 29 7b  ==RBU_PK_NONE ){
108d0 0a 20 20 20 20 20 20 20 20 20 20 7a 53 71 6c 20  .          zSql 
108e0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
108f0 66 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  f(.             
10900 20 22 53 45 4c 45 43 54 20 25 73 2c 20 72 62 75   "SELECT %s, rbu
10910 5f 63 6f 6e 74 72 6f 6c 20 46 52 4f 4d 20 25 73  _control FROM %s
10920 2e 27 72 62 75 5f 74 6d 70 5f 25 71 27 20 4f 52  .'rbu_tmp_%q' OR
10930 44 45 52 20 42 59 20 25 73 25 73 22 2c 0a 20 20  DER BY %s%s",.  
10940 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c              zCol
10950 6c 69 73 74 2c 20 70 2d 3e 7a 53 74 61 74 65 44  list, p->zStateD
10960 62 2c 20 70 49 74 65 72 2d 3e 7a 44 61 74 61 54  b, pIter->zDataT
10970 62 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  bl,.            
10980 20 20 7a 43 6f 6c 6c 69 73 74 2c 20 7a 4c 69 6d    zCollist, zLim
10990 69 74 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a  it.          );.
109a0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
109b0 20 20 20 20 20 20 20 20 20 7a 53 71 6c 20 3d 20           zSql = 
109c0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
109d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
109e0 53 45 4c 45 43 54 20 25 73 2c 20 72 62 75 5f 63  SELECT %s, rbu_c
109f0 6f 6e 74 72 6f 6c 20 46 52 4f 4d 20 25 73 2e 27  ontrol FROM %s.'
10a00 72 62 75 5f 74 6d 70 5f 25 71 27 20 22 0a 20 20  rbu_tmp_%q' ".  
10a10 20 20 20 20 20 20 20 20 20 20 20 20 22 55 4e 49              "UNI
10a20 4f 4e 20 41 4c 4c 20 22 0a 20 20 20 20 20 20 20  ON ALL ".       
10a30 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 25         "SELECT %
10a40 73 2c 20 72 62 75 5f 63 6f 6e 74 72 6f 6c 20 46  s, rbu_control F
10a50 52 4f 4d 20 27 25 71 27 20 22 0a 20 20 20 20 20  ROM '%q' ".     
10a60 20 20 20 20 20 20 20 20 20 22 57 48 45 52 45 20           "WHERE 
10a70 74 79 70 65 6f 66 28 72 62 75 5f 63 6f 6e 74 72  typeof(rbu_contr
10a80 6f 6c 29 3d 27 69 6e 74 65 67 65 72 27 20 41 4e  ol)='integer' AN
10a90 44 20 72 62 75 5f 63 6f 6e 74 72 6f 6c 21 3d 31  D rbu_control!=1
10aa0 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ".             
10ab0 20 22 4f 52 44 45 52 20 42 59 20 25 73 25 73 22   "ORDER BY %s%s"
10ac0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
10ad0 7a 43 6f 6c 6c 69 73 74 2c 20 70 2d 3e 7a 53 74  zCollist, p->zSt
10ae0 61 74 65 44 62 2c 20 70 49 74 65 72 2d 3e 7a 44  ateDb, pIter->zD
10af0 61 74 61 54 62 6c 2c 20 0a 20 20 20 20 20 20 20  ataTbl, .       
10b00 20 20 20 20 20 20 20 7a 43 6f 6c 6c 69 73 74 2c         zCollist,
10b10 20 70 49 74 65 72 2d 3e 7a 44 61 74 61 54 62 6c   pIter->zDataTbl
10b20 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
10b30 20 7a 43 6f 6c 6c 69 73 74 2c 20 7a 4c 69 6d 69   zCollist, zLimi
10b40 74 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20  t.          );. 
10b50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
10b60 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65   p->rc = prepare
10b70 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72  FreeAndCollectEr
10b80 72 6f 72 28 70 2d 3e 64 62 52 62 75 2c 20 26 70  ror(p->dbRbu, &p
10b90 49 74 65 72 2d 3e 70 53 65 6c 65 63 74 2c 20 70  Iter->pSelect, p
10ba0 7a 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20  z, zSql);.      
10bb0 7d 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  }..      sqlite3
10bc0 5f 66 72 65 65 28 7a 49 6d 70 6f 73 74 65 72 43  _free(zImposterC
10bd0 6f 6c 73 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ols);.      sqli
10be0 74 65 33 5f 66 72 65 65 28 7a 49 6d 70 6f 73 74  te3_free(zImpost
10bf0 65 72 50 4b 29 3b 0a 20 20 20 20 20 20 73 71 6c  erPK);.      sql
10c00 69 74 65 33 5f 66 72 65 65 28 7a 57 68 65 72 65  ite3_free(zWhere
10c10 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10c20 5f 66 72 65 65 28 7a 42 69 6e 64 29 3b 0a 20 20  _free(zBind);.  
10c30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
10c40 6e 74 20 62 52 62 75 52 6f 77 69 64 20 3d 20 28  nt bRbuRowid = (
10c50 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42  pIter->eType==RB
10c60 55 5f 50 4b 5f 56 54 41 42 29 0a 20 20 20 20 20  U_PK_VTAB).     
10c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
10c80 7c 28 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d  |(pIter->eType==
10c90 52 42 55 5f 50 4b 5f 4e 4f 4e 45 29 0a 20 20 20  RBU_PK_NONE).   
10ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10cb0 20 7c 7c 28 70 49 74 65 72 2d 3e 65 54 79 70 65   ||(pIter->eType
10cc0 3d 3d 52 42 55 5f 50 4b 5f 45 58 54 45 52 4e 41  ==RBU_PK_EXTERNA
10cd0 4c 20 26 26 20 72 62 75 49 73 56 61 63 75 75 6d  L && rbuIsVacuum
10ce0 28 70 29 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73  (p));.      cons
10cf0 74 20 63 68 61 72 20 2a 7a 54 62 6c 20 3d 20 70  t char *zTbl = p
10d00 49 74 65 72 2d 3e 7a 54 62 6c 3b 20 20 20 20 20  Iter->zTbl;     
10d10 20 20 2f 2a 20 54 61 62 6c 65 20 74 68 69 73 20    /* Table this 
10d20 73 74 65 70 20 61 70 70 6c 69 65 73 20 74 6f 20  step applies to 
10d30 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  */.      const c
10d40 68 61 72 20 2a 7a 57 72 69 74 65 3b 20 20 20 20  har *zWrite;    
10d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10d60 2a 20 49 6d 70 6f 73 74 65 72 20 74 61 62 6c 65  * Imposter table
10d70 20 6e 61 6d 65 20 2a 2f 0a 0a 20 20 20 20 20 20   name */..      
10d80 63 68 61 72 20 2a 7a 42 69 6e 64 69 6e 67 73 20  char *zBindings 
10d90 3d 20 72 62 75 4f 62 6a 49 74 65 72 47 65 74 42  = rbuObjIterGetB
10da0 69 6e 64 6c 69 73 74 28 70 2c 20 70 49 74 65 72  indlist(p, pIter
10db0 2d 3e 6e 54 62 6c 43 6f 6c 20 2b 20 62 52 62 75  ->nTblCol + bRbu
10dc0 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 63 68  Rowid);.      ch
10dd0 61 72 20 2a 7a 57 68 65 72 65 20 3d 20 72 62 75  ar *zWhere = rbu
10de0 4f 62 6a 49 74 65 72 47 65 74 57 68 65 72 65 28  ObjIterGetWhere(
10df0 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20  p, pIter);.     
10e00 20 63 68 61 72 20 2a 7a 4f 6c 64 6c 69 73 74 20   char *zOldlist 
10e10 3d 20 72 62 75 4f 62 6a 49 74 65 72 47 65 74 4f  = rbuObjIterGetO
10e20 6c 64 6c 69 73 74 28 70 2c 20 70 49 74 65 72 2c  ldlist(p, pIter,
10e30 20 22 6f 6c 64 22 29 3b 0a 20 20 20 20 20 20 63   "old");.      c
10e40 68 61 72 20 2a 7a 4e 65 77 6c 69 73 74 20 3d 20  har *zNewlist = 
10e50 72 62 75 4f 62 6a 49 74 65 72 47 65 74 4f 6c 64  rbuObjIterGetOld
10e60 6c 69 73 74 28 70 2c 20 70 49 74 65 72 2c 20 22  list(p, pIter, "
10e70 6e 65 77 22 29 3b 0a 0a 20 20 20 20 20 20 7a 43  new");..      zC
10e80 6f 6c 6c 69 73 74 20 3d 20 72 62 75 4f 62 6a 49  ollist = rbuObjI
10e90 74 65 72 47 65 74 43 6f 6c 6c 69 73 74 28 70 2c  terGetCollist(p,
10ea0 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 70   pIter);.      p
10eb0 49 74 65 72 2d 3e 6e 43 6f 6c 20 3d 20 70 49 74  Iter->nCol = pIt
10ec0 65 72 2d 3e 6e 54 62 6c 43 6f 6c 3b 0a 0a 20 20  er->nTblCol;..  
10ed0 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68      /* Create th
10ee0 65 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65  e imposter table
10ef0 20 6f 72 20 74 61 62 6c 65 73 20 28 69 66 20 72   or tables (if r
10f00 65 71 75 69 72 65 64 29 2e 20 2a 2f 0a 20 20 20  equired). */.   
10f10 20 20 20 72 62 75 43 72 65 61 74 65 49 6d 70 6f     rbuCreateImpo
10f20 73 74 65 72 54 61 62 6c 65 28 70 2c 20 70 49 74  sterTable(p, pIt
10f30 65 72 29 3b 0a 20 20 20 20 20 20 72 62 75 43 72  er);.      rbuCr
10f40 65 61 74 65 49 6d 70 6f 73 74 65 72 54 61 62 6c  eateImposterTabl
10f50 65 32 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  e2(p, pIter);.  
10f60 20 20 20 20 7a 57 72 69 74 65 20 3d 20 28 70 49      zWrite = (pI
10f70 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f  ter->eType==RBU_
10f80 50 4b 5f 56 54 41 42 20 3f 20 22 22 20 3a 20 22  PK_VTAB ? "" : "
10f90 72 62 75 5f 69 6d 70 5f 22 29 3b 0a 0a 20 20 20  rbu_imp_");..   
10fa0 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65     /* Create the
10fb0 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65 6e   INSERT statemen
10fc0 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68  t to write to th
10fd0 65 20 74 61 72 67 65 74 20 50 4b 20 62 2d 74 72  e target PK b-tr
10fe0 65 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ee */.      if( 
10ff0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
11000 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72   ){.        p->r
11010 63 20 3d 20 70 72 65 70 61 72 65 46 72 65 65 41  c = prepareFreeA
11020 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70  ndCollectError(p
11030 2d 3e 64 62 4d 61 69 6e 2c 20 26 70 49 74 65 72  ->dbMain, &pIter
11040 2d 3e 70 49 6e 73 65 72 74 2c 20 70 7a 2c 0a 20  ->pInsert, pz,. 
11050 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
11060 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20  e3_mprintf(.    
11070 20 20 20 20 20 20 20 20 20 20 22 49 4e 53 45 52            "INSER
11080 54 20 49 4e 54 4f 20 5c 22 25 73 25 77 5c 22 28  T INTO \"%s%w\"(
11090 25 73 25 73 29 20 56 41 4c 55 45 53 28 25 73 29  %s%s) VALUES(%s)
110a0 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ", .            
110b0 20 20 7a 57 72 69 74 65 2c 20 7a 54 62 6c 2c 20    zWrite, zTbl, 
110c0 7a 43 6f 6c 6c 69 73 74 2c 20 28 62 52 62 75 52  zCollist, (bRbuR
110d0 6f 77 69 64 20 3f 20 22 2c 20 5f 72 6f 77 69 64  owid ? ", _rowid
110e0 5f 22 20 3a 20 22 22 29 2c 20 7a 42 69 6e 64 69  _" : ""), zBindi
110f0 6e 67 73 0a 20 20 20 20 20 20 20 20 20 20 20 20  ngs.            
11100 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  ).        );.   
11110 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43     }..      /* C
11120 72 65 61 74 65 20 74 68 65 20 44 45 4c 45 54 45  reate the DELETE
11130 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 77 72   statement to wr
11140 69 74 65 20 74 6f 20 74 68 65 20 74 61 72 67 65  ite to the targe
11150 74 20 50 4b 20 62 2d 74 72 65 65 2e 0a 20 20 20  t PK b-tree..   
11160 20 20 20 2a 2a 20 42 65 63 61 75 73 65 20 69 74     ** Because it
11170 20 6f 6e 6c 79 20 70 65 72 66 6f 72 6d 73 20 49   only performs I
11180 4e 53 45 52 54 20 6f 70 65 72 61 74 69 6f 6e 73  NSERT operations
11190 2c 20 74 68 69 73 20 69 73 20 6e 6f 74 20 72 65  , this is not re
111a0 71 75 69 72 65 64 20 66 6f 72 0a 20 20 20 20 20  quired for.     
111b0 20 2a 2a 20 61 6e 20 72 62 75 20 76 61 63 75 75   ** an rbu vacuu
111c0 6d 20 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20  m handle.  */.  
111d0 20 20 20 20 69 66 28 20 72 62 75 49 73 56 61 63      if( rbuIsVac
111e0 75 75 6d 28 70 29 3d 3d 30 20 26 26 20 70 2d 3e  uum(p)==0 && p->
111f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
11200 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  .        p->rc =
11210 20 70 72 65 70 61 72 65 46 72 65 65 41 6e 64 43   prepareFreeAndC
11220 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64  ollectError(p->d
11230 62 4d 61 69 6e 2c 20 26 70 49 74 65 72 2d 3e 70  bMain, &pIter->p
11240 44 65 6c 65 74 65 2c 20 70 7a 2c 0a 20 20 20 20  Delete, pz,.    
11250 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
11260 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20  mprintf(.       
11270 20 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46         "DELETE F
11280 52 4f 4d 20 5c 22 25 73 25 77 5c 22 20 57 48 45  ROM \"%s%w\" WHE
11290 52 45 20 25 73 22 2c 20 7a 57 72 69 74 65 2c 20  RE %s", zWrite, 
112a0 7a 54 62 6c 2c 20 7a 57 68 65 72 65 0a 20 20 20  zTbl, zWhere.   
112b0 20 20 20 20 20 20 20 20 20 29 0a 20 20 20 20 20           ).     
112c0 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20     );.      }.. 
112d0 20 20 20 20 20 69 66 28 20 72 62 75 49 73 56 61       if( rbuIsVa
112e0 63 75 75 6d 28 70 29 3d 3d 30 20 26 26 20 70 49  cuum(p)==0 && pI
112f0 74 65 72 2d 3e 61 62 49 6e 64 65 78 65 64 20 29  ter->abIndexed )
11300 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
11310 63 68 61 72 20 2a 7a 52 62 75 52 6f 77 69 64 20  char *zRbuRowid 
11320 3d 20 22 22 3b 0a 20 20 20 20 20 20 20 20 69 66  = "";.        if
11330 28 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d  ( pIter->eType==
11340 52 42 55 5f 50 4b 5f 45 58 54 45 52 4e 41 4c 20  RBU_PK_EXTERNAL 
11350 7c 7c 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d  || pIter->eType=
11360 3d 52 42 55 5f 50 4b 5f 4e 4f 4e 45 20 29 7b 0a  =RBU_PK_NONE ){.
11370 20 20 20 20 20 20 20 20 20 20 7a 52 62 75 52 6f            zRbuRo
11380 77 69 64 20 3d 20 22 2c 20 72 62 75 5f 72 6f 77  wid = ", rbu_row
11390 69 64 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  id";.        }..
113a0 20 20 20 20 20 20 20 20 2f 2a 20 43 72 65 61 74          /* Creat
113b0 65 20 74 68 65 20 72 62 75 5f 74 6d 70 5f 78 78  e the rbu_tmp_xx
113c0 78 20 74 61 62 6c 65 20 61 6e 64 20 74 68 65 20  x table and the 
113d0 74 72 69 67 67 65 72 73 20 74 6f 20 70 6f 70 75  triggers to popu
113e0 6c 61 74 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20  late it. */.    
113f0 20 20 20 20 72 62 75 4d 50 72 69 6e 74 66 45 78      rbuMPrintfEx
11400 65 63 28 70 2c 20 70 2d 3e 64 62 52 62 75 2c 0a  ec(p, p->dbRbu,.
11410 20 20 20 20 20 20 20 20 20 20 20 20 22 43 52 45              "CRE
11420 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54  ATE TABLE IF NOT
11430 20 45 58 49 53 54 53 20 25 73 2e 27 72 62 75 5f   EXISTS %s.'rbu_
11440 74 6d 70 5f 25 71 27 20 41 53 20 22 0a 20 20 20  tmp_%q' AS ".   
11450 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54           "SELECT
11460 20 2a 25 73 20 46 52 4f 4d 20 27 25 71 27 20 57   *%s FROM '%q' W
11470 48 45 52 45 20 30 3b 22 0a 20 20 20 20 20 20 20  HERE 0;".       
11480 20 20 20 20 20 2c 20 70 2d 3e 7a 53 74 61 74 65       , p->zState
11490 44 62 2c 20 70 49 74 65 72 2d 3e 7a 44 61 74 61  Db, pIter->zData
114a0 54 62 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20  Tbl.            
114b0 2c 20 28 70 49 74 65 72 2d 3e 65 54 79 70 65 3d  , (pIter->eType=
114c0 3d 52 42 55 5f 50 4b 5f 45 58 54 45 52 4e 41 4c  =RBU_PK_EXTERNAL
114d0 20 3f 20 22 2c 20 30 20 41 53 20 72 62 75 5f 72   ? ", 0 AS rbu_r
114e0 6f 77 69 64 22 20 3a 20 22 22 29 0a 20 20 20 20  owid" : "").    
114f0 20 20 20 20 20 20 20 20 2c 20 70 49 74 65 72 2d          , pIter-
11500 3e 7a 44 61 74 61 54 62 6c 0a 20 20 20 20 20 20  >zDataTbl.      
11510 20 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 72 62    );..        rb
11520 75 4d 50 72 69 6e 74 66 45 78 65 63 28 70 2c 20  uMPrintfExec(p, 
11530 70 2d 3e 64 62 4d 61 69 6e 2c 0a 20 20 20 20 20  p->dbMain,.     
11540 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20 54         "CREATE T
11550 45 4d 50 20 54 52 49 47 47 45 52 20 72 62 75 5f  EMP TRIGGER rbu_
11560 64 65 6c 65 74 65 5f 74 72 20 42 45 46 4f 52 45  delete_tr BEFORE
11570 20 44 45 4c 45 54 45 20 4f 4e 20 5c 22 25 73 25   DELETE ON \"%s%
11580 77 5c 22 20 22 0a 20 20 20 20 20 20 20 20 20 20  w\" ".          
11590 20 20 22 42 45 47 49 4e 20 22 0a 20 20 20 20 20    "BEGIN ".     
115a0 20 20 20 20 20 20 20 22 20 20 53 45 4c 45 43 54         "  SELECT
115b0 20 72 62 75 5f 74 6d 70 5f 69 6e 73 65 72 74 28   rbu_tmp_insert(
115c0 33 2c 20 25 73 29 3b 22 0a 20 20 20 20 20 20 20  3, %s);".       
115d0 20 20 20 20 20 22 45 4e 44 3b 22 0a 0a 20 20 20       "END;"..   
115e0 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45           "CREATE
115f0 20 54 45 4d 50 20 54 52 49 47 47 45 52 20 72 62   TEMP TRIGGER rb
11600 75 5f 75 70 64 61 74 65 31 5f 74 72 20 42 45 46  u_update1_tr BEF
11610 4f 52 45 20 55 50 44 41 54 45 20 4f 4e 20 5c 22  ORE UPDATE ON \"
11620 25 73 25 77 5c 22 20 22 0a 20 20 20 20 20 20 20  %s%w\" ".       
11630 20 20 20 20 20 22 42 45 47 49 4e 20 22 0a 20 20       "BEGIN ".  
11640 20 20 20 20 20 20 20 20 20 20 22 20 20 53 45 4c            "  SEL
11650 45 43 54 20 72 62 75 5f 74 6d 70 5f 69 6e 73 65  ECT rbu_tmp_inse
11660 72 74 28 33 2c 20 25 73 29 3b 22 0a 20 20 20 20  rt(3, %s);".    
11670 20 20 20 20 20 20 20 20 22 45 4e 44 3b 22 0a 0a          "END;"..
11680 20 20 20 20 20 20 20 20 20 20 20 20 22 43 52 45              "CRE
11690 41 54 45 20 54 45 4d 50 20 54 52 49 47 47 45 52  ATE TEMP TRIGGER
116a0 20 72 62 75 5f 75 70 64 61 74 65 32 5f 74 72 20   rbu_update2_tr 
116b0 41 46 54 45 52 20 55 50 44 41 54 45 20 4f 4e 20  AFTER UPDATE ON 
116c0 5c 22 25 73 25 77 5c 22 20 22 0a 20 20 20 20 20  \"%s%w\" ".     
116d0 20 20 20 20 20 20 20 22 42 45 47 49 4e 20 22 0a         "BEGIN ".
116e0 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20 53              "  S
116f0 45 4c 45 43 54 20 72 62 75 5f 74 6d 70 5f 69 6e  ELECT rbu_tmp_in
11700 73 65 72 74 28 34 2c 20 25 73 29 3b 22 0a 20 20  sert(4, %s);".  
11710 20 20 20 20 20 20 20 20 20 20 22 45 4e 44 3b 22            "END;"
11720 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 57  ,.            zW
11730 72 69 74 65 2c 20 7a 54 62 6c 2c 20 7a 4f 6c 64  rite, zTbl, zOld
11740 6c 69 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20  list,.          
11750 20 20 7a 57 72 69 74 65 2c 20 7a 54 62 6c 2c 20    zWrite, zTbl, 
11760 7a 4f 6c 64 6c 69 73 74 2c 0a 20 20 20 20 20 20  zOldlist,.      
11770 20 20 20 20 20 20 7a 57 72 69 74 65 2c 20 7a 54        zWrite, zT
11780 62 6c 2c 20 7a 4e 65 77 6c 69 73 74 0a 20 20 20  bl, zNewlist.   
11790 20 20 20 20 20 29 3b 0a 0a 20 20 20 20 20 20 20       );..       
117a0 20 69 66 28 20 70 49 74 65 72 2d 3e 65 54 79 70   if( pIter->eTyp
117b0 65 3d 3d 52 42 55 5f 50 4b 5f 45 58 54 45 52 4e  e==RBU_PK_EXTERN
117c0 41 4c 20 7c 7c 20 70 49 74 65 72 2d 3e 65 54 79  AL || pIter->eTy
117d0 70 65 3d 3d 52 42 55 5f 50 4b 5f 4e 4f 4e 45 20  pe==RBU_PK_NONE 
117e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 62 75  ){.          rbu
117f0 4d 50 72 69 6e 74 66 45 78 65 63 28 70 2c 20 70  MPrintfExec(p, p
11800 2d 3e 64 62 4d 61 69 6e 2c 0a 20 20 20 20 20 20  ->dbMain,.      
11810 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20          "CREATE 
11820 54 45 4d 50 20 54 52 49 47 47 45 52 20 72 62 75  TEMP TRIGGER rbu
11830 5f 69 6e 73 65 72 74 5f 74 72 20 41 46 54 45 52  _insert_tr AFTER
11840 20 49 4e 53 45 52 54 20 4f 4e 20 5c 22 25 73 25   INSERT ON \"%s%
11850 77 5c 22 20 22 0a 20 20 20 20 20 20 20 20 20 20  w\" ".          
11860 20 20 20 20 22 42 45 47 49 4e 20 22 0a 20 20 20      "BEGIN ".   
11870 20 20 20 20 20 20 20 20 20 20 20 22 20 20 53 45             "  SE
11880 4c 45 43 54 20 72 62 75 5f 74 6d 70 5f 69 6e 73  LECT rbu_tmp_ins
11890 65 72 74 28 30 2c 20 25 73 29 3b 22 0a 20 20 20  ert(0, %s);".   
118a0 20 20 20 20 20 20 20 20 20 20 20 22 45 4e 44 3b             "END;
118b0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
118c0 20 7a 57 72 69 74 65 2c 20 7a 54 62 6c 2c 20 7a   zWrite, zTbl, z
118d0 4e 65 77 6c 69 73 74 0a 20 20 20 20 20 20 20 20  Newlist.        
118e0 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a    );.        }..
118f0 20 20 20 20 20 20 20 20 72 62 75 4f 62 6a 49 74          rbuObjIt
11900 65 72 50 72 65 70 61 72 65 54 6d 70 49 6e 73 65  erPrepareTmpInse
11910 72 74 28 70 2c 20 70 49 74 65 72 2c 20 7a 43 6f  rt(p, pIter, zCo
11920 6c 6c 69 73 74 2c 20 7a 52 62 75 52 6f 77 69 64  llist, zRbuRowid
11930 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
11940 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20    /* Create the 
11950 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
11960 20 74 6f 20 72 65 61 64 20 6b 65 79 73 20 66 72   to read keys fr
11970 6f 6d 20 64 61 74 61 5f 78 78 78 20 2a 2f 0a 20  om data_xxx */. 
11980 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
11990 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
119a0 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
119b0 2a 7a 52 62 75 52 6f 77 69 64 20 3d 20 22 22 3b  *zRbuRowid = "";
119c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 62 52 62  .        if( bRb
119d0 75 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20  uRowid ){.      
119e0 20 20 20 20 7a 52 62 75 52 6f 77 69 64 20 3d 20      zRbuRowid = 
119f0 72 62 75 49 73 56 61 63 75 75 6d 28 70 29 20 3f  rbuIsVacuum(p) ?
11a00 20 22 2c 5f 72 6f 77 69 64 5f 20 22 20 3a 20 22   ",_rowid_ " : "
11a10 2c 72 62 75 5f 72 6f 77 69 64 22 3b 0a 20 20 20  ,rbu_rowid";.   
11a20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
11a30 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65 46 72  ->rc = prepareFr
11a40 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f  eeAndCollectErro
11a50 72 28 70 2d 3e 64 62 52 62 75 2c 20 26 70 49 74  r(p->dbRbu, &pIt
11a60 65 72 2d 3e 70 53 65 6c 65 63 74 2c 20 70 7a 2c  er->pSelect, pz,
11a70 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
11a80 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20  ite3_mprintf(.  
11a90 20 20 20 20 20 20 20 20 20 20 20 20 22 53 45 4c              "SEL
11aa0 45 43 54 20 25 73 2c 25 73 20 72 62 75 5f 63 6f  ECT %s,%s rbu_co
11ab0 6e 74 72 6f 6c 25 73 20 46 52 4f 4d 20 27 25 71  ntrol%s FROM '%q
11ac0 27 25 73 22 2c 20 0a 20 20 20 20 20 20 20 20 20  '%s", .         
11ad0 20 20 20 20 20 7a 43 6f 6c 6c 69 73 74 2c 20 0a       zCollist, .
11ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 72                (r
11af0 62 75 49 73 56 61 63 75 75 6d 28 70 29 20 3f 20  buIsVacuum(p) ? 
11b00 22 30 20 41 53 20 22 20 3a 20 22 22 29 2c 0a 20  "0 AS " : ""),. 
11b10 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 52 62               zRb
11b20 75 52 6f 77 69 64 2c 0a 20 20 20 20 20 20 20 20  uRowid,.        
11b30 20 20 20 20 20 20 70 49 74 65 72 2d 3e 7a 44 61        pIter->zDa
11b40 74 61 54 62 6c 2c 20 7a 4c 69 6d 69 74 0a 20 20  taTbl, zLimit.  
11b50 20 20 20 20 20 20 20 20 20 20 29 0a 20 20 20 20            ).    
11b60 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a      );.      }..
11b70 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
11b80 65 65 28 7a 57 68 65 72 65 29 3b 0a 20 20 20 20  ee(zWhere);.    
11b90 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
11ba0 4f 6c 64 6c 69 73 74 29 3b 0a 20 20 20 20 20 20  Oldlist);.      
11bb0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e 65  sqlite3_free(zNe
11bc0 77 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 73 71  wlist);.      sq
11bd0 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 69 6e 64  lite3_free(zBind
11be0 69 6e 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ings);.    }.   
11bf0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
11c00 6f 6c 6c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c  ollist);.    sql
11c10 69 74 65 33 5f 66 72 65 65 28 7a 4c 69 6d 69 74  ite3_free(zLimit
11c20 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 72 65 74 75  );.  }.  .  retu
11c30 72 6e 20 70 2d 3e 72 63 3b 0a 7d 0a 0a 2f 2a 0a  rn p->rc;.}../*.
11c40 2a 2a 20 53 65 74 20 6f 75 74 70 75 74 20 76 61  ** Set output va
11c50 72 69 61 62 6c 65 20 2a 70 70 53 74 6d 74 20 74  riable *ppStmt t
11c60 6f 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 55 50  o point to an UP
11c70 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20 74  DATE statement t
11c80 68 61 74 20 6d 61 79 0a 2a 2a 20 62 65 20 75 73  hat may.** be us
11c90 65 64 20 74 6f 20 75 70 64 61 74 65 20 74 68 65  ed to update the
11ca0 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 20   imposter table 
11cb0 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 74 61 62  for the main tab
11cc0 6c 65 20 62 2d 74 72 65 65 20 6f 66 20 74 68 65  le b-tree of the
11cd0 0a 2a 2a 20 74 61 62 6c 65 20 6f 62 6a 65 63 74  .** table object
11ce0 20 74 68 61 74 20 70 49 74 65 72 20 63 75 72 72   that pIter curr
11cf0 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2c  ently points to,
11d00 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20 74   assuming that t
11d10 68 65 20 0a 2a 2a 20 72 62 75 5f 63 6f 6e 74 72  he .** rbu_contr
11d20 6f 6c 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  ol column of the
11d30 20 64 61 74 61 5f 78 79 7a 20 74 61 62 6c 65 20   data_xyz table 
11d40 63 6f 6e 74 61 69 6e 73 20 7a 4d 61 73 6b 2e 0a  contains zMask..
11d50 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 7a 4d  ** .** If the zM
11d60 61 73 6b 20 73 74 72 69 6e 67 20 64 6f 65 73 20  ask string does 
11d70 6e 6f 74 20 73 70 65 63 69 66 79 20 61 6e 79 20  not specify any 
11d80 63 6f 6c 75 6d 6e 73 20 74 6f 20 75 70 64 61 74  columns to updat
11d90 65 2c 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20  e, then this.** 
11da0 69 73 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72 2e  is not an error.
11db0 20 4f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65   Output variable
11dc0 20 2a 70 70 53 74 6d 74 20 69 73 20 73 65 74 20   *ppStmt is set 
11dd0 74 6f 20 4e 55 4c 4c 20 69 6e 20 74 68 69 73 20  to NULL in this 
11de0 63 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  case..*/.static 
11df0 69 6e 74 20 72 62 75 47 65 74 55 70 64 61 74 65  int rbuGetUpdate
11e00 53 74 6d 74 28 0a 20 20 73 71 6c 69 74 65 33 72  Stmt(.  sqlite3r
11e10 62 75 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  bu *p,          
11e20 20 20 20 20 20 20 20 20 2f 2a 20 52 42 55 20 68          /* RBU h
11e30 61 6e 64 6c 65 20 2a 2f 0a 20 20 52 62 75 4f 62  andle */.  RbuOb
11e40 6a 49 74 65 72 20 2a 70 49 74 65 72 2c 20 20 20  jIter *pIter,   
11e50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62             /* Ob
11e60 6a 65 63 74 20 69 74 65 72 61 74 6f 72 20 2a 2f  ject iterator */
11e70 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
11e80 4d 61 73 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Mask,           
11e90 20 20 20 2f 2a 20 72 62 75 5f 63 6f 6e 74 72 6f     /* rbu_contro
11ea0 6c 20 76 61 6c 75 65 20 28 27 78 2e 78 2e 27 29  l value ('x.x.')
11eb0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
11ec0 6d 74 20 2a 2a 70 70 53 74 6d 74 20 20 20 20 20  mt **ppStmt     
11ed0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 55 50        /* OUT: UP
11ee0 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20 68  DATE statement h
11ef0 61 6e 64 6c 65 20 2a 2f 0a 29 7b 0a 20 20 52 62  andle */.){.  Rb
11f00 75 55 70 64 61 74 65 53 74 6d 74 20 2a 2a 70 70  uUpdateStmt **pp
11f10 3b 0a 20 20 52 62 75 55 70 64 61 74 65 53 74 6d  ;.  RbuUpdateStm
11f20 74 20 2a 70 55 70 20 3d 20 30 3b 0a 20 20 69 6e  t *pUp = 0;.  in
11f30 74 20 6e 55 70 20 3d 20 30 3b 0a 0a 20 20 2f 2a  t nUp = 0;..  /*
11f40 20 49 6e 20 63 61 73 65 20 61 6e 20 65 72 72 6f   In case an erro
11f50 72 20 6f 63 63 75 72 73 20 2a 2f 0a 20 20 2a 70  r occurs */.  *p
11f60 70 53 74 6d 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a  pStmt = 0;..  /*
11f70 20 53 65 61 72 63 68 20 66 6f 72 20 61 6e 20 65   Search for an e
11f80 78 69 73 74 69 6e 67 20 73 74 61 74 65 6d 65 6e  xisting statemen
11f90 74 2e 20 49 66 20 6f 6e 65 20 69 73 20 66 6f 75  t. If one is fou
11fa0 6e 64 2c 20 73 68 69 66 74 20 69 74 20 74 6f 20  nd, shift it to 
11fb0 74 68 65 20 66 72 6f 6e 74 0a 20 20 2a 2a 20 6f  the front.  ** o
11fc0 66 20 74 68 65 20 4c 52 55 20 71 75 65 75 65 20  f the LRU queue 
11fd0 61 6e 64 20 72 65 74 75 72 6e 20 69 6d 6d 65 64  and return immed
11fe0 69 61 74 65 6c 79 2e 20 4f 74 68 65 72 77 69 73  iately. Otherwis
11ff0 65 2c 20 6c 65 61 76 65 20 6e 55 70 20 70 6f 69  e, leave nUp poi
12000 6e 74 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 74 68  nting.  ** to th
12010 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 74 61 74  e number of stat
12020 65 6d 65 6e 74 73 20 63 75 72 72 65 6e 74 6c 79  ements currently
12030 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 61 6e   in the cache an
12040 64 20 70 55 70 20 74 6f 20 74 68 65 0a 20 20 2a  d pUp to the.  *
12050 2a 20 6c 61 73 74 20 6f 62 6a 65 63 74 20 69 6e  * last object in
12060 20 74 68 65 20 6c 69 73 74 2e 20 20 2a 2f 0a 20   the list.  */. 
12070 20 66 6f 72 28 70 70 3d 26 70 49 74 65 72 2d 3e   for(pp=&pIter->
12080 70 52 62 75 55 70 64 61 74 65 3b 20 2a 70 70 3b  pRbuUpdate; *pp;
12090 20 70 70 3d 26 28 28 2a 70 70 29 2d 3e 70 4e 65   pp=&((*pp)->pNe
120a0 78 74 29 29 7b 0a 20 20 20 20 70 55 70 20 3d 20  xt)){.    pUp = 
120b0 2a 70 70 3b 0a 20 20 20 20 69 66 28 20 73 74 72  *pp;.    if( str
120c0 63 6d 70 28 70 55 70 2d 3e 7a 4d 61 73 6b 2c 20  cmp(pUp->zMask, 
120d0 7a 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20  zMask)==0 ){.   
120e0 20 20 20 2a 70 70 20 3d 20 70 55 70 2d 3e 70 4e     *pp = pUp->pN
120f0 65 78 74 3b 0a 20 20 20 20 20 20 70 55 70 2d 3e  ext;.      pUp->
12100 70 4e 65 78 74 20 3d 20 70 49 74 65 72 2d 3e 70  pNext = pIter->p
12110 52 62 75 55 70 64 61 74 65 3b 0a 20 20 20 20 20  RbuUpdate;.     
12120 20 70 49 74 65 72 2d 3e 70 52 62 75 55 70 64 61   pIter->pRbuUpda
12130 74 65 20 3d 20 70 55 70 3b 0a 20 20 20 20 20 20  te = pUp;.      
12140 2a 70 70 53 74 6d 74 20 3d 20 70 55 70 2d 3e 70  *ppStmt = pUp->p
12150 55 70 64 61 74 65 3b 20 0a 20 20 20 20 20 20 72  Update; .      r
12160 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
12170 0a 20 20 20 20 7d 0a 20 20 20 20 6e 55 70 2b 2b  .    }.    nUp++
12180 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
12190 70 55 70 3d 3d 30 20 7c 7c 20 70 55 70 2d 3e 70  pUp==0 || pUp->p
121a0 4e 65 78 74 3d 3d 30 20 29 3b 0a 0a 20 20 69 66  Next==0 );..  if
121b0 28 20 6e 55 70 3e 3d 53 51 4c 49 54 45 5f 52 42  ( nUp>=SQLITE_RB
121c0 55 5f 55 50 44 41 54 45 5f 43 41 43 48 45 53 49  U_UPDATE_CACHESI
121d0 5a 45 20 29 7b 0a 20 20 20 20 66 6f 72 28 70 70  ZE ){.    for(pp
121e0 3d 26 70 49 74 65 72 2d 3e 70 52 62 75 55 70 64  =&pIter->pRbuUpd
121f0 61 74 65 3b 20 2a 70 70 21 3d 70 55 70 3b 20 70  ate; *pp!=pUp; p
12200 70 3d 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74  p=&((*pp)->pNext
12210 29 29 3b 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b  ));.    *pp = 0;
12220 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  .    sqlite3_fin
12230 61 6c 69 7a 65 28 70 55 70 2d 3e 70 55 70 64 61  alize(pUp->pUpda
12240 74 65 29 3b 0a 20 20 20 20 70 55 70 2d 3e 70 55  te);.    pUp->pU
12250 70 64 61 74 65 20 3d 20 30 3b 0a 20 20 7d 65 6c  pdate = 0;.  }el
12260 73 65 7b 0a 20 20 20 20 70 55 70 20 3d 20 28 52  se{.    pUp = (R
12270 62 75 55 70 64 61 74 65 53 74 6d 74 2a 29 72 62  buUpdateStmt*)rb
12280 75 4d 61 6c 6c 6f 63 28 70 2c 20 73 69 7a 65 6f  uMalloc(p, sizeo
12290 66 28 52 62 75 55 70 64 61 74 65 53 74 6d 74 29  f(RbuUpdateStmt)
122a0 2b 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 2b  +pIter->nTblCol+
122b0 31 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  1);.  }..  if( p
122c0 55 70 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  Up ){.    char *
122d0 7a 57 68 65 72 65 20 3d 20 72 62 75 4f 62 6a 49  zWhere = rbuObjI
122e0 74 65 72 47 65 74 57 68 65 72 65 28 70 2c 20 70  terGetWhere(p, p
122f0 49 74 65 72 29 3b 0a 20 20 20 20 63 68 61 72 20  Iter);.    char 
12300 2a 7a 53 65 74 20 3d 20 72 62 75 4f 62 6a 49 74  *zSet = rbuObjIt
12310 65 72 47 65 74 53 65 74 6c 69 73 74 28 70 2c 20  erGetSetlist(p, 
12320 70 49 74 65 72 2c 20 7a 4d 61 73 6b 29 3b 0a 20  pIter, zMask);. 
12330 20 20 20 63 68 61 72 20 2a 7a 55 70 64 61 74 65     char *zUpdate
12340 20 3d 20 30 3b 0a 0a 20 20 20 20 70 55 70 2d 3e   = 0;..    pUp->
12350 7a 4d 61 73 6b 20 3d 20 28 63 68 61 72 2a 29 26  zMask = (char*)&
12360 70 55 70 5b 31 5d 3b 0a 20 20 20 20 6d 65 6d 63  pUp[1];.    memc
12370 70 79 28 70 55 70 2d 3e 7a 4d 61 73 6b 2c 20 7a  py(pUp->zMask, z
12380 4d 61 73 6b 2c 20 70 49 74 65 72 2d 3e 6e 54 62  Mask, pIter->nTb
12390 6c 43 6f 6c 29 3b 0a 20 20 20 20 70 55 70 2d 3e  lCol);.    pUp->
123a0 70 4e 65 78 74 20 3d 20 70 49 74 65 72 2d 3e 70  pNext = pIter->p
123b0 52 62 75 55 70 64 61 74 65 3b 0a 20 20 20 20 70  RbuUpdate;.    p
123c0 49 74 65 72 2d 3e 70 52 62 75 55 70 64 61 74 65  Iter->pRbuUpdate
123d0 20 3d 20 70 55 70 3b 0a 0a 20 20 20 20 69 66 28   = pUp;..    if(
123e0 20 7a 53 65 74 20 29 7b 0a 20 20 20 20 20 20 63   zSet ){.      c
123f0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 72 65 66  onst char *zPref
12400 69 78 20 3d 20 22 22 3b 0a 0a 20 20 20 20 20 20  ix = "";..      
12410 69 66 28 20 70 49 74 65 72 2d 3e 65 54 79 70 65  if( pIter->eType
12420 21 3d 52 42 55 5f 50 4b 5f 56 54 41 42 20 29 20  !=RBU_PK_VTAB ) 
12430 7a 50 72 65 66 69 78 20 3d 20 22 72 62 75 5f 69  zPrefix = "rbu_i
12440 6d 70 5f 22 3b 0a 20 20 20 20 20 20 7a 55 70 64  mp_";.      zUpd
12450 61 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ate = sqlite3_mp
12460 72 69 6e 74 66 28 22 55 50 44 41 54 45 20 5c 22  rintf("UPDATE \"
12470 25 73 25 77 5c 22 20 53 45 54 20 25 73 20 57 48  %s%w\" SET %s WH
12480 45 52 45 20 25 73 22 2c 20 0a 20 20 20 20 20 20  ERE %s", .      
12490 20 20 20 20 7a 50 72 65 66 69 78 2c 20 70 49 74      zPrefix, pIt
124a0 65 72 2d 3e 7a 54 62 6c 2c 20 7a 53 65 74 2c 20  er->zTbl, zSet, 
124b0 7a 57 68 65 72 65 0a 20 20 20 20 20 20 29 3b 0a  zWhere.      );.
124c0 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 72        p->rc = pr
124d0 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c  epareFreeAndColl
124e0 65 63 74 45 72 72 6f 72 28 0a 20 20 20 20 20 20  ectError(.      
124f0 20 20 20 20 70 2d 3e 64 62 4d 61 69 6e 2c 20 26      p->dbMain, &
12500 70 55 70 2d 3e 70 55 70 64 61 74 65 2c 20 26 70  pUp->pUpdate, &p
12510 2d 3e 7a 45 72 72 6d 73 67 2c 20 7a 55 70 64 61  ->zErrmsg, zUpda
12520 74 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  te.      );.    
12530 20 20 2a 70 70 53 74 6d 74 20 3d 20 70 55 70 2d    *ppStmt = pUp-
12540 3e 70 55 70 64 61 74 65 3b 0a 20 20 20 20 7d 0a  >pUpdate;.    }.
12550 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
12560 28 7a 57 68 65 72 65 29 3b 0a 20 20 20 20 73 71  (zWhere);.    sq
12570 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 65 74 29  lite3_free(zSet)
12580 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
12590 70 2d 3e 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63  p->rc;.}..static
125a0 20 73 71 6c 69 74 65 33 20 2a 72 62 75 4f 70 65   sqlite3 *rbuOpe
125b0 6e 44 62 68 61 6e 64 6c 65 28 0a 20 20 73 71 6c  nDbhandle(.  sql
125c0 69 74 65 33 72 62 75 20 2a 70 2c 20 0a 20 20 63  ite3rbu *p, .  c
125d0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
125e0 2c 20 0a 20 20 69 6e 74 20 62 55 73 65 56 66 73  , .  int bUseVfs
125f0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
12600 62 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e  b = 0;.  if( p->
12610 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
12620 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 66  .    const int f
12630 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50  lags = SQLITE_OP
12640 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c  EN_READWRITE|SQL
12650 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c  ITE_OPEN_CREATE|
12660 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 3b  SQLITE_OPEN_URI;
12670 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c  .    p->rc = sql
12680 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 7a 4e 61  ite3_open_v2(zNa
12690 6d 65 2c 20 26 64 62 2c 20 66 6c 61 67 73 2c 20  me, &db, flags, 
126a0 62 55 73 65 56 66 73 20 3f 20 70 2d 3e 7a 56 66  bUseVfs ? p->zVf
126b0 73 4e 61 6d 65 20 3a 20 30 29 3b 0a 20 20 20 20  sName : 0);.    
126c0 69 66 28 20 70 2d 3e 72 63 20 29 7b 0a 20 20 20  if( p->rc ){.   
126d0 20 20 20 70 2d 3e 7a 45 72 72 6d 73 67 20 3d 20     p->zErrmsg = 
126e0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
126f0 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 65 72  "%s", sqlite3_er
12700 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 20 20 20  rmsg(db));.     
12710 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64   sqlite3_close(d
12720 62 29 3b 0a 20 20 20 20 20 20 64 62 20 3d 20 30  b);.      db = 0
12730 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
12740 74 75 72 6e 20 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn db;.}../*.*
12750 2a 20 46 72 65 65 20 61 6e 20 52 62 75 53 74 61  * Free an RbuSta
12760 74 65 20 6f 62 6a 65 63 74 20 61 6c 6c 6f 63 61  te object alloca
12770 74 65 64 20 62 79 20 72 62 75 4c 6f 61 64 53 74  ted by rbuLoadSt
12780 61 74 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ate()..*/.static
12790 20 76 6f 69 64 20 72 62 75 46 72 65 65 53 74 61   void rbuFreeSta
127a0 74 65 28 52 62 75 53 74 61 74 65 20 2a 70 29 7b  te(RbuState *p){
127b0 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
127c0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
127d0 7a 54 62 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74  zTbl);.    sqlit
127e0 65 33 5f 66 72 65 65 28 70 2d 3e 7a 49 64 78 29  e3_free(p->zIdx)
127f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
12800 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ee(p);.  }.}../*
12810 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 20  .** Allocate an 
12820 52 62 75 53 74 61 74 65 20 6f 62 6a 65 63 74 20  RbuState object 
12830 61 6e 64 20 6c 6f 61 64 20 74 68 65 20 63 6f 6e  and load the con
12840 74 65 6e 74 73 20 6f 66 20 74 68 65 20 72 62 75  tents of the rbu
12850 5f 73 74 61 74 65 20 0a 2a 2a 20 74 61 62 6c 65  _state .** table
12860 20 69 6e 74 6f 20 69 74 2e 20 52 65 74 75 72 6e   into it. Return
12870 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
12880 65 20 6e 65 77 20 6f 62 6a 65 63 74 2e 20 49 74  e new object. It
12890 20 69 73 20 74 68 65 20 0a 2a 2a 20 72 65 73 70   is the .** resp
128a0 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
128b0 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e  e caller to even
128c0 74 75 61 6c 6c 79 20 66 72 65 65 20 74 68 65 20  tually free the 
128d0 6f 62 6a 65 63 74 20 75 73 69 6e 67 0a 2a 2a 20  object using.** 
128e0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a  sqlite3_free()..
128f0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
12900 72 20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65 20  r occurs, leave 
12910 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e  an error code an
12920 64 20 6d 65 73 73 61 67 65 20 69 6e 20 74 68 65  d message in the
12930 20 72 62 75 20 68 61 6e 64 6c 65 0a 2a 2a 20 61   rbu handle.** a
12940 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a  nd return NULL..
12950 2a 2f 0a 73 74 61 74 69 63 20 52 62 75 53 74 61  */.static RbuSta
12960 74 65 20 2a 72 62 75 4c 6f 61 64 53 74 61 74 65  te *rbuLoadState
12970 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 29 7b  (sqlite3rbu *p){
12980 0a 20 20 52 62 75 53 74 61 74 65 20 2a 70 52 65  .  RbuState *pRe
12990 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  t = 0;.  sqlite3
129a0 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30  _stmt *pStmt = 0
129b0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  ;.  int rc;.  in
129c0 74 20 72 63 32 3b 0a 0a 20 20 70 52 65 74 20 3d  t rc2;..  pRet =
129d0 20 28 52 62 75 53 74 61 74 65 2a 29 72 62 75 4d   (RbuState*)rbuM
129e0 61 6c 6c 6f 63 28 70 2c 20 73 69 7a 65 6f 66 28  alloc(p, sizeof(
129f0 52 62 75 53 74 61 74 65 29 29 3b 0a 20 20 69 66  RbuState));.  if
12a00 28 20 70 52 65 74 3d 3d 30 20 29 20 72 65 74 75  ( pRet==0 ) retu
12a10 72 6e 20 30 3b 0a 0a 20 20 72 63 20 3d 20 70 72  rn 0;..  rc = pr
12a20 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c  epareFreeAndColl
12a30 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 52 62  ectError(p->dbRb
12a40 75 2c 20 26 70 53 74 6d 74 2c 20 26 70 2d 3e 7a  u, &pStmt, &p->z
12a50 45 72 72 6d 73 67 2c 20 0a 20 20 20 20 20 20 73  Errmsg, .      s
12a60 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
12a70 53 45 4c 45 43 54 20 6b 2c 20 76 20 46 52 4f 4d  SELECT k, v FROM
12a80 20 25 73 2e 72 62 75 5f 73 74 61 74 65 22 2c 20   %s.rbu_state", 
12a90 70 2d 3e 7a 53 74 61 74 65 44 62 29 0a 20 20 29  p->zStateDb).  )
12aa0 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53  ;.  while( rc==S
12ab0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49  QLITE_OK && SQLI
12ac0 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
12ad0 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20  step(pStmt) ){. 
12ae0 20 20 20 73 77 69 74 63 68 28 20 73 71 6c 69 74     switch( sqlit
12af0 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53  e3_column_int(pS
12b00 74 6d 74 2c 20 30 29 20 29 7b 0a 20 20 20 20 20  tmt, 0) ){.     
12b10 20 63 61 73 65 20 52 42 55 5f 53 54 41 54 45 5f   case RBU_STATE_
12b20 53 54 41 47 45 3a 0a 20 20 20 20 20 20 20 20 70  STAGE:.        p
12b30 52 65 74 2d 3e 65 53 74 61 67 65 20 3d 20 73 71  Ret->eStage = sq
12b40 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
12b50 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20  (pStmt, 1);.    
12b60 20 20 20 20 69 66 28 20 70 52 65 74 2d 3e 65 53      if( pRet->eS
12b70 74 61 67 65 21 3d 52 42 55 5f 53 54 41 47 45 5f  tage!=RBU_STAGE_
12b80 4f 41 4c 0a 20 20 20 20 20 20 20 20 20 26 26 20  OAL.         && 
12b90 70 52 65 74 2d 3e 65 53 74 61 67 65 21 3d 52 42  pRet->eStage!=RB
12ba0 55 5f 53 54 41 47 45 5f 4d 4f 56 45 0a 20 20 20  U_STAGE_MOVE.   
12bb0 20 20 20 20 20 20 26 26 20 70 52 65 74 2d 3e 65        && pRet->e
12bc0 53 74 61 67 65 21 3d 52 42 55 5f 53 54 41 47 45  Stage!=RBU_STAGE
12bd0 5f 43 4b 50 54 0a 20 20 20 20 20 20 20 20 29 7b  _CKPT.        ){
12be0 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63  .          p->rc
12bf0 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
12c00 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  T;.        }.   
12c10 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
12c20 20 20 20 63 61 73 65 20 52 42 55 5f 53 54 41 54     case RBU_STAT
12c30 45 5f 54 42 4c 3a 0a 20 20 20 20 20 20 20 20 70  E_TBL:.        p
12c40 52 65 74 2d 3e 7a 54 62 6c 20 3d 20 72 62 75 53  Ret->zTbl = rbuS
12c50 74 72 6e 64 75 70 28 28 63 68 61 72 2a 29 73 71  trndup((char*)sq
12c60 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
12c70 74 28 70 53 74 6d 74 2c 20 31 29 2c 20 26 72 63  t(pStmt, 1), &rc
12c80 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
12c90 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20 52 42  ;..      case RB
12ca0 55 5f 53 54 41 54 45 5f 49 44 58 3a 0a 20 20 20  U_STATE_IDX:.   
12cb0 20 20 20 20 20 70 52 65 74 2d 3e 7a 49 64 78 20       pRet->zIdx 
12cc0 3d 20 72 62 75 53 74 72 6e 64 75 70 28 28 63 68  = rbuStrndup((ch
12cd0 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
12ce0 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31  mn_text(pStmt, 1
12cf0 29 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20  ), &rc);.       
12d00 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 63   break;..      c
12d10 61 73 65 20 52 42 55 5f 53 54 41 54 45 5f 52 4f  ase RBU_STATE_RO
12d20 57 3a 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d  W:.        pRet-
12d30 3e 6e 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 5f  >nRow = sqlite3_
12d40 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74  column_int(pStmt
12d50 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 62 72  , 1);.        br
12d60 65 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73 65  eak;..      case
12d70 20 52 42 55 5f 53 54 41 54 45 5f 50 52 4f 47 52   RBU_STATE_PROGR
12d80 45 53 53 3a 0a 20 20 20 20 20 20 20 20 70 52 65  ESS:.        pRe
12d90 74 2d 3e 6e 50 72 6f 67 72 65 73 73 20 3d 20 73  t->nProgress = s
12da0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
12db0 74 36 34 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20  t64(pStmt, 1);. 
12dc0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20         break;.. 
12dd0 20 20 20 20 20 63 61 73 65 20 52 42 55 5f 53 54       case RBU_ST
12de0 41 54 45 5f 43 4b 50 54 3a 0a 20 20 20 20 20 20  ATE_CKPT:.      
12df0 20 20 70 52 65 74 2d 3e 69 57 61 6c 43 6b 73 75    pRet->iWalCksu
12e00 6d 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  m = sqlite3_colu
12e10 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20  mn_int64(pStmt, 
12e20 31 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  1);.        brea
12e30 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20 52  k;..      case R
12e40 42 55 5f 53 54 41 54 45 5f 43 4f 4f 4b 49 45 3a  BU_STATE_COOKIE:
12e50 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e 69  .        pRet->i
12e60 43 6f 6f 6b 69 65 20 3d 20 28 75 33 32 29 73 71  Cookie = (u32)sq
12e70 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
12e80 36 34 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20  64(pStmt, 1);.  
12e90 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
12ea0 20 20 20 20 63 61 73 65 20 52 42 55 5f 53 54 41      case RBU_STA
12eb0 54 45 5f 4f 41 4c 53 5a 3a 0a 20 20 20 20 20 20  TE_OALSZ:.      
12ec0 20 20 70 52 65 74 2d 3e 69 4f 61 6c 53 7a 20 3d    pRet->iOalSz =
12ed0 20 28 75 33 32 29 73 71 6c 69 74 65 33 5f 63 6f   (u32)sqlite3_co
12ee0 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74  lumn_int64(pStmt
12ef0 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 62 72  , 1);.        br
12f00 65 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73 65  eak;..      case
12f10 20 52 42 55 5f 53 54 41 54 45 5f 50 48 41 53 45   RBU_STATE_PHASE
12f20 4f 4e 45 53 54 45 50 3a 0a 20 20 20 20 20 20 20  ONESTEP:.       
12f30 20 70 52 65 74 2d 3e 6e 50 68 61 73 65 4f 6e 65   pRet->nPhaseOne
12f40 53 74 65 70 20 3d 20 73 71 6c 69 74 65 33 5f 63  Step = sqlite3_c
12f50 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d  olumn_int64(pStm
12f60 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 62  t, 1);.        b
12f70 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 64 65 66  reak;..      def
12f80 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 72 63  ault:.        rc
12f90 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
12fa0 54 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  T;.        break
12fb0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 63  ;.    }.  }.  rc
12fc0 32 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  2 = sqlite3_fina
12fd0 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 69  lize(pStmt);.  i
12fe0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
12ff0 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 0a 20 20   ) rc = rc2;..  
13000 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 72 65  p->rc = rc;.  re
13010 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 0a 2f  turn pRet;.}.../
13020 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 64 61  *.** Open the da
13030 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 61 6e  tabase handle an
13040 64 20 61 74 74 61 63 68 20 74 68 65 20 52 42 55  d attach the RBU
13050 20 64 61 74 61 62 61 73 65 20 61 73 20 22 72 62   database as "rb
13060 75 22 2e 20 49 66 20 61 6e 0a 2a 2a 20 65 72 72  u". If an.** err
13070 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65  or occurs, leave
13080 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 61   an error code a
13090 6e 64 20 6d 65 73 73 61 67 65 20 69 6e 20 74 68  nd message in th
130a0 65 20 52 42 55 20 68 61 6e 64 6c 65 2e 0a 2a 2f  e RBU handle..*/
130b0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75  .static void rbu
130c0 4f 70 65 6e 44 61 74 61 62 61 73 65 28 73 71 6c  OpenDatabase(sql
130d0 69 74 65 33 72 62 75 20 2a 70 29 7b 0a 20 20 61  ite3rbu *p){.  a
130e0 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51  ssert( p->rc==SQ
130f0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 61 73 73  LITE_OK );.  ass
13100 65 72 74 28 20 70 2d 3e 64 62 4d 61 69 6e 3d 3d  ert( p->dbMain==
13110 30 20 26 26 20 70 2d 3e 64 62 52 62 75 3d 3d 30  0 && p->dbRbu==0
13120 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 62   );.  assert( rb
13130 75 49 73 56 61 63 75 75 6d 28 70 29 20 7c 7c 20  uIsVacuum(p) || 
13140 70 2d 3e 7a 54 61 72 67 65 74 21 3d 30 20 29 3b  p->zTarget!=0 );
13150 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20  ..  /* Open the 
13160 52 42 55 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  RBU database */.
13170 20 20 70 2d 3e 64 62 52 62 75 20 3d 20 72 62 75    p->dbRbu = rbu
13180 4f 70 65 6e 44 62 68 61 6e 64 6c 65 28 70 2c 20  OpenDbhandle(p, 
13190 70 2d 3e 7a 52 62 75 2c 20 31 29 3b 0a 0a 20 20  p->zRbu, 1);..  
131a0 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
131b0 45 5f 4f 4b 20 26 26 20 72 62 75 49 73 56 61 63  E_OK && rbuIsVac
131c0 75 75 6d 28 70 29 20 29 7b 0a 20 20 20 20 73 71  uum(p) ){.    sq
131d0 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
131e0 6f 6c 28 70 2d 3e 64 62 52 62 75 2c 20 22 6d 61  ol(p->dbRbu, "ma
131f0 69 6e 22 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54  in", SQLITE_FCNT
13200 4c 5f 52 42 55 43 4e 54 2c 20 28 76 6f 69 64 2a  L_RBUCNT, (void*
13210 29 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  )p);.  }..  /* I
13220 66 20 75 73 69 6e 67 20 73 65 70 61 72 61 74 65  f using separate
13230 20 52 42 55 20 61 6e 64 20 73 74 61 74 65 20 64   RBU and state d
13240 61 74 61 62 61 73 65 73 2c 20 61 74 74 61 63 68  atabases, attach
13250 20 74 68 65 20 73 74 61 74 65 20 64 61 74 61 62   the state datab
13260 61 73 65 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20  ase to.  ** the 
13270 52 42 55 20 64 62 20 68 61 6e 64 6c 65 20 6e 6f  RBU db handle no
13280 77 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  w.  */.  if( p->
13290 7a 53 74 61 74 65 20 29 7b 0a 20 20 20 20 72 62  zState ){.    rb
132a0 75 4d 50 72 69 6e 74 66 45 78 65 63 28 70 2c 20  uMPrintfExec(p, 
132b0 70 2d 3e 64 62 52 62 75 2c 20 22 41 54 54 41 43  p->dbRbu, "ATTAC
132c0 48 20 25 51 20 41 53 20 73 74 61 74 22 2c 20 70  H %Q AS stat", p
132d0 2d 3e 7a 53 74 61 74 65 29 3b 0a 20 20 20 20 6d  ->zState);.    m
132e0 65 6d 63 70 79 28 70 2d 3e 7a 53 74 61 74 65 44  emcpy(p->zStateD
132f0 62 2c 20 22 73 74 61 74 22 2c 20 34 29 3b 0a 20  b, "stat", 4);. 
13300 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 63   }else{.    memc
13310 70 79 28 70 2d 3e 7a 53 74 61 74 65 44 62 2c 20  py(p->zStateDb, 
13320 22 6d 61 69 6e 22 2c 20 34 29 3b 0a 20 20 7d 0a  "main", 4);.  }.
13330 0a 23 69 66 20 30 0a 20 20 69 66 28 20 70 2d 3e  .#if 0.  if( p->
13340 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
13350 20 72 62 75 49 73 56 61 63 75 75 6d 28 70 29 20   rbuIsVacuum(p) 
13360 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73  ){.    p->rc = s
13370 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
13380 62 52 62 75 2c 20 22 42 45 47 49 4e 22 2c 20 30  bRbu, "BEGIN", 0
13390 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e  , 0, 0);.  }.#en
133a0 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 69 74 20  dif..  /* If it 
133b0 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  has not already 
133c0 62 65 65 6e 20 63 72 65 61 74 65 64 2c 20 63 72  been created, cr
133d0 65 61 74 65 20 74 68 65 20 72 62 75 5f 73 74 61  eate the rbu_sta
133e0 74 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 72 62  te table */.  rb
133f0 75 4d 50 72 69 6e 74 66 45 78 65 63 28 70 2c 20  uMPrintfExec(p, 
13400 70 2d 3e 64 62 52 62 75 2c 20 52 42 55 5f 43 52  p->dbRbu, RBU_CR
13410 45 41 54 45 5f 53 54 41 54 45 2c 20 70 2d 3e 7a  EATE_STATE, p->z
13420 53 74 61 74 65 44 62 29 3b 0a 0a 23 69 66 20 30  StateDb);..#if 0
13430 0a 20 20 69 66 28 20 72 62 75 49 73 56 61 63 75  .  if( rbuIsVacu
13440 75 6d 28 70 29 20 29 7b 0a 20 20 20 20 69 66 28  um(p) ){.    if(
13450 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
13460 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  K ){.      int r
13470 63 32 3b 0a 20 20 20 20 20 20 69 6e 74 20 62 4f  c2;.      int bO
13480 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c  k = 0;.      sql
13490 69 74 65 33 5f 73 74 6d 74 20 2a 70 43 6e 74 20  ite3_stmt *pCnt 
134a0 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 72 63  = 0;.      p->rc
134b0 20 3d 20 70 72 65 70 61 72 65 41 6e 64 43 6f 6c   = prepareAndCol
134c0 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 52  lectError(p->dbR
134d0 62 75 2c 20 26 70 43 6e 74 2c 20 26 70 2d 3e 7a  bu, &pCnt, &p->z
134e0 45 72 72 6d 73 67 2c 0a 20 20 20 20 20 20 20 20  Errmsg,.        
134f0 20 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28    "SELECT count(
13500 2a 29 20 46 52 4f 4d 20 73 74 61 74 2e 73 71 6c  *) FROM stat.sql
13510 69 74 65 5f 6d 61 73 74 65 72 22 0a 20 20 20 20  ite_master".    
13520 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70    );.      if( p
13530 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
13540 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74  .       && sqlit
13550 65 33 5f 73 74 65 70 28 70 43 6e 74 29 3d 3d 53  e3_step(pCnt)==S
13560 51 4c 49 54 45 5f 52 4f 57 0a 20 20 20 20 20 20  QLITE_ROW.      
13570 20 26 26 20 31 3d 3d 73 71 6c 69 74 65 33 5f 63   && 1==sqlite3_c
13580 6f 6c 75 6d 6e 5f 69 6e 74 28 70 43 6e 74 2c 20  olumn_int(pCnt, 
13590 30 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  0).      ){.    
135a0 20 20 20 20 62 4f 6b 20 3d 20 31 3b 0a 20 20 20      bOk = 1;.   
135b0 20 20 20 7d 0a 20 20 20 20 20 20 72 63 32 20 3d     }.      rc2 =
135c0 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
135d0 65 28 70 43 6e 74 29 3b 0a 20 20 20 20 20 20 69  e(pCnt);.      i
135e0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
135f0 5f 4f 4b 20 29 20 70 2d 3e 72 63 20 3d 20 72 63  _OK ) p->rc = rc
13600 32 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 2d  2;..      if( p-
13610 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
13620 26 20 62 4f 6b 3d 3d 30 20 29 7b 0a 20 20 20 20  & bOk==0 ){.    
13630 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
13640 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
13650 20 20 70 2d 3e 7a 45 72 72 6d 73 67 20 3d 20 73    p->zErrmsg = s
13660 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
13670 69 6e 76 61 6c 69 64 20 73 74 61 74 65 20 64 61  invalid state da
13680 74 61 62 61 73 65 22 29 3b 0a 20 20 20 20 20 20  tabase");.      
13690 7d 0a 20 20 20 20 0a 20 20 20 20 20 20 69 66 28  }.    .      if(
136a0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
136b0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  K ){.        p->
136c0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65  rc = sqlite3_exe
136d0 63 28 70 2d 3e 64 62 52 62 75 2c 20 22 43 4f 4d  c(p->dbRbu, "COM
136e0 4d 49 54 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  MIT", 0, 0, 0);.
136f0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
13700 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  }.#endif..  if( 
13710 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
13720 20 26 26 20 72 62 75 49 73 56 61 63 75 75 6d 28   && rbuIsVacuum(
13730 70 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 4f  p) ){.    int bO
13740 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  pen = 0;.    int
13750 20 72 63 3b 0a 20 20 20 20 70 2d 3e 6e 52 62 75   rc;.    p->nRbu
13760 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 52 62   = 0;.    p->pRb
13770 75 46 64 20 3d 20 30 3b 0a 20 20 20 20 72 63 20  uFd = 0;.    rc 
13780 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63  = sqlite3_file_c
13790 6f 6e 74 72 6f 6c 28 70 2d 3e 64 62 52 62 75 2c  ontrol(p->dbRbu,
137a0 20 22 6d 61 69 6e 22 2c 20 53 51 4c 49 54 45 5f   "main", SQLITE_
137b0 46 43 4e 54 4c 5f 52 42 55 43 4e 54 2c 20 28 76  FCNTL_RBUCNT, (v
137c0 6f 69 64 2a 29 70 29 3b 0a 20 20 20 20 69 66 28  oid*)p);.    if(
137d0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 54 46   rc!=SQLITE_NOTF
137e0 4f 55 4e 44 20 29 20 70 2d 3e 72 63 20 3d 20 72  OUND ) p->rc = r
137f0 63 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 53  c;.    if( p->eS
13800 74 61 67 65 3e 3d 52 42 55 5f 53 54 41 47 45 5f  tage>=RBU_STAGE_
13810 4d 4f 56 45 20 29 7b 0a 20 20 20 20 20 20 62 4f  MOVE ){.      bO
13820 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  pen = 1;.    }el
13830 73 65 7b 0a 20 20 20 20 20 20 52 62 75 53 74 61  se{.      RbuSta
13840 74 65 20 2a 70 53 74 61 74 65 20 3d 20 72 62 75  te *pState = rbu
13850 4c 6f 61 64 53 74 61 74 65 28 70 29 3b 0a 20 20  LoadState(p);.  
13860 20 20 20 20 69 66 28 20 70 53 74 61 74 65 20 29      if( pState )
13870 7b 0a 20 20 20 20 20 20 20 20 62 4f 70 65 6e 20  {.        bOpen 
13880 3d 20 28 70 53 74 61 74 65 2d 3e 65 53 74 61 67  = (pState->eStag
13890 65 3e 52 42 55 5f 53 54 41 47 45 5f 4d 4f 56 45  e>RBU_STAGE_MOVE
138a0 29 3b 0a 20 20 20 20 20 20 20 20 72 62 75 46 72  );.        rbuFr
138b0 65 65 53 74 61 74 65 28 70 53 74 61 74 65 29 3b  eeState(pState);
138c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
138d0 20 20 20 69 66 28 20 62 4f 70 65 6e 20 29 20 70     if( bOpen ) p
138e0 2d 3e 64 62 4d 61 69 6e 20 3d 20 72 62 75 4f 70  ->dbMain = rbuOp
138f0 65 6e 44 62 68 61 6e 64 6c 65 28 70 2c 20 70 2d  enDbhandle(p, p-
13900 3e 7a 52 62 75 2c 20 70 2d 3e 6e 52 62 75 3c 3d  >zRbu, p->nRbu<=
13910 31 29 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e 65 53  1);.  }..  p->eS
13920 74 61 67 65 20 3d 20 30 3b 0a 20 20 69 66 28 20  tage = 0;.  if( 
13930 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
13940 20 26 26 20 70 2d 3e 64 62 4d 61 69 6e 3d 3d 30   && p->dbMain==0
13950 20 29 7b 0a 20 20 20 20 69 66 28 20 21 72 62 75   ){.    if( !rbu
13960 49 73 56 61 63 75 75 6d 28 70 29 20 29 7b 0a 20  IsVacuum(p) ){. 
13970 20 20 20 20 20 70 2d 3e 64 62 4d 61 69 6e 20 3d       p->dbMain =
13980 20 72 62 75 4f 70 65 6e 44 62 68 61 6e 64 6c 65   rbuOpenDbhandle
13990 28 70 2c 20 70 2d 3e 7a 54 61 72 67 65 74 2c 20  (p, p->zTarget, 
139a0 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  1);.    }else if
139b0 28 20 70 2d 3e 70 52 62 75 46 64 2d 3e 70 57 61  ( p->pRbuFd->pWa
139c0 6c 46 64 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  lFd ){.      p->
139d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
139e0 52 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 45 72 72  R;.      p->zErr
139f0 6d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  msg = sqlite3_mp
13a00 72 69 6e 74 66 28 22 63 61 6e 6e 6f 74 20 76 61  rintf("cannot va
13a10 63 75 75 6d 20 77 61 6c 20 6d 6f 64 65 20 64 61  cuum wal mode da
13a20 74 61 62 61 73 65 22 29 3b 0a 20 20 20 20 7d 65  tabase");.    }e
13a30 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20  lse{.      char 
13a40 2a 7a 54 61 72 67 65 74 3b 0a 20 20 20 20 20 20  *zTarget;.      
13a50 63 68 61 72 20 2a 7a 45 78 74 72 61 20 3d 20 30  char *zExtra = 0
13a60 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 6c  ;.      if( strl
13a70 65 6e 28 70 2d 3e 7a 52 62 75 29 3e 3d 35 20 26  en(p->zRbu)>=5 &
13a80 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 22 66 69 6c  & 0==memcmp("fil
13a90 65 3a 22 2c 20 70 2d 3e 7a 52 62 75 2c 20 35 29  e:", p->zRbu, 5)
13aa0 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 45 78 74   ){.        zExt
13ab0 72 61 20 3d 20 26 70 2d 3e 7a 52 62 75 5b 35 5d  ra = &p->zRbu[5]
13ac0 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  ;.        while(
13ad0 20 2a 7a 45 78 74 72 61 20 29 7b 0a 20 20 20 20   *zExtra ){.    
13ae0 20 20 20 20 20 20 69 66 28 20 2a 7a 45 78 74 72        if( *zExtr
13af0 61 2b 2b 3d 3d 27 3f 27 20 29 20 62 72 65 61 6b  a++=='?' ) break
13b00 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
13b10 20 20 20 20 69 66 28 20 2a 7a 45 78 74 72 61 3d      if( *zExtra=
13b20 3d 27 5c 30 27 20 29 20 7a 45 78 74 72 61 20 3d  ='\0' ) zExtra =
13b30 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20   0;.      }..   
13b40 20 20 20 7a 54 61 72 67 65 74 20 3d 20 73 71 6c     zTarget = sql
13b50 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 66 69  ite3_mprintf("fi
13b60 6c 65 3a 25 73 2d 76 61 63 75 75 6d 3f 72 62 75  le:%s-vacuum?rbu
13b70 5f 6d 65 6d 6f 72 79 3d 31 25 73 25 73 22 2c 20  _memory=1%s%s", 
13b80 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
13b90 65 33 5f 64 62 5f 66 69 6c 65 6e 61 6d 65 28 70  e3_db_filename(p
13ba0 2d 3e 64 62 52 62 75 2c 20 22 6d 61 69 6e 22 29  ->dbRbu, "main")
13bb0 2c 0a 20 20 20 20 20 20 20 20 20 20 28 7a 45 78  ,.          (zEx
13bc0 74 72 61 3d 3d 30 20 3f 20 22 22 20 3a 20 22 26  tra==0 ? "" : "&
13bd0 22 29 2c 20 28 7a 45 78 74 72 61 3d 3d 30 20 3f  "), (zExtra==0 ?
13be0 20 22 22 20 3a 20 7a 45 78 74 72 61 29 0a 20 20   "" : zExtra).  
13bf0 20 20 20 20 29 3b 0a 0a 20 20 20 20 20 20 69 66      );..      if
13c00 28 20 7a 54 61 72 67 65 74 3d 3d 30 20 29 7b 0a  ( zTarget==0 ){.
13c10 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
13c20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
13c30 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
13c40 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 64      }.      p->d
13c50 62 4d 61 69 6e 20 3d 20 72 62 75 4f 70 65 6e 44  bMain = rbuOpenD
13c60 62 68 61 6e 64 6c 65 28 70 2c 20 7a 54 61 72 67  bhandle(p, zTarg
13c70 65 74 2c 20 70 2d 3e 6e 52 62 75 3c 3d 31 29 3b  et, p->nRbu<=1);
13c80 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
13c90 72 65 65 28 7a 54 61 72 67 65 74 29 3b 0a 20 20  ree(zTarget);.  
13ca0 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70    }.  }..  if( p
13cb0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
13cc0 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73  ){.    p->rc = s
13cd0 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
13ce0 6e 63 74 69 6f 6e 28 70 2d 3e 64 62 4d 61 69 6e  nction(p->dbMain
13cf0 2c 20 0a 20 20 20 20 20 20 20 20 22 72 62 75 5f  , .        "rbu_
13d00 74 6d 70 5f 69 6e 73 65 72 74 22 2c 20 2d 31 2c  tmp_insert", -1,
13d10 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 28 76   SQLITE_UTF8, (v
13d20 6f 69 64 2a 29 70 2c 20 72 62 75 54 6d 70 49 6e  oid*)p, rbuTmpIn
13d30 73 65 72 74 46 75 6e 63 2c 20 30 2c 20 30 0a 20  sertFunc, 0, 0. 
13d40 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28     );.  }..  if(
13d50 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
13d60 4b 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  K ){.    p->rc =
13d70 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
13d80 66 75 6e 63 74 69 6f 6e 28 70 2d 3e 64 62 4d 61  function(p->dbMa
13d90 69 6e 2c 20 0a 20 20 20 20 20 20 20 20 22 72 62  in, .        "rb
13da0 75 5f 66 6f 73 73 69 6c 5f 64 65 6c 74 61 22 2c  u_fossil_delta",
13db0 20 32 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c   2, SQLITE_UTF8,
13dc0 20 30 2c 20 72 62 75 46 6f 73 73 69 6c 44 65 6c   0, rbuFossilDel
13dd0 74 61 46 75 6e 63 2c 20 30 2c 20 30 0a 20 20 20  taFunc, 0, 0.   
13de0 20 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70   );.  }..  if( p
13df0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
13e00 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73  ){.    p->rc = s
13e10 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
13e20 6e 63 74 69 6f 6e 28 70 2d 3e 64 62 52 62 75 2c  nction(p->dbRbu,
13e30 20 0a 20 20 20 20 20 20 20 20 22 72 62 75 5f 74   .        "rbu_t
13e40 61 72 67 65 74 5f 6e 61 6d 65 22 2c 20 2d 31 2c  arget_name", -1,
13e50 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 28 76   SQLITE_UTF8, (v
13e60 6f 69 64 2a 29 70 2c 20 72 62 75 54 61 72 67 65  oid*)p, rbuTarge
13e70 74 4e 61 6d 65 46 75 6e 63 2c 20 30 2c 20 30 0a  tNameFunc, 0, 0.
13e80 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 69 66      );.  }..  if
13e90 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
13ea0 4f 4b 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  OK ){.    p->rc 
13eb0 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63  = sqlite3_file_c
13ec0 6f 6e 74 72 6f 6c 28 70 2d 3e 64 62 4d 61 69 6e  ontrol(p->dbMain
13ed0 2c 20 22 6d 61 69 6e 22 2c 20 53 51 4c 49 54 45  , "main", SQLITE
13ee0 5f 46 43 4e 54 4c 5f 52 42 55 2c 20 28 76 6f 69  _FCNTL_RBU, (voi
13ef0 64 2a 29 70 29 3b 0a 20 20 7d 0a 20 20 72 62 75  d*)p);.  }.  rbu
13f00 4d 50 72 69 6e 74 66 45 78 65 63 28 70 2c 20 70  MPrintfExec(p, p
13f10 2d 3e 64 62 4d 61 69 6e 2c 20 22 53 45 4c 45 43  ->dbMain, "SELEC
13f20 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  T * FROM sqlite_
13f30 6d 61 73 74 65 72 22 29 3b 0a 0a 20 20 2f 2a 20  master");..  /* 
13f40 4d 61 72 6b 20 74 68 65 20 64 61 74 61 62 61 73  Mark the databas
13f50 65 20 66 69 6c 65 20 6a 75 73 74 20 6f 70 65 6e  e file just open
13f60 65 64 20 61 73 20 61 6e 20 52 42 55 20 74 61 72  ed as an RBU tar
13f70 67 65 74 20 64 61 74 61 62 61 73 65 2e 20 49 66  get database. If
13f80 20 0a 20 20 2a 2a 20 74 68 69 73 20 63 61 6c 6c   .  ** this call
13f90 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
13fa0 4e 4f 54 46 4f 55 4e 44 2c 20 74 68 65 6e 20 74  NOTFOUND, then t
13fb0 68 65 20 52 42 55 20 76 66 73 20 69 73 20 6e 6f  he RBU vfs is no
13fc0 74 20 69 6e 20 75 73 65 2e 0a 20 20 2a 2a 20 54  t in use..  ** T
13fd0 68 69 73 20 69 73 20 61 6e 20 65 72 72 6f 72 2e  his is an error.
13fe0 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 72 63    */.  if( p->rc
13ff0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
14000 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74     p->rc = sqlit
14010 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28  e3_file_control(
14020 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 6d 61 69 6e  p->dbMain, "main
14030 22 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  ", SQLITE_FCNTL_
14040 52 42 55 2c 20 28 76 6f 69 64 2a 29 70 29 3b 0a  RBU, (void*)p);.
14050 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63    }..  if( p->rc
14060 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  ==SQLITE_NOTFOUN
14070 44 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  D ){.    p->rc =
14080 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
14090 20 20 20 70 2d 3e 7a 45 72 72 6d 73 67 20 3d 20     p->zErrmsg = 
140a0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
140b0 22 72 62 75 20 76 66 73 20 6e 6f 74 20 66 6f 75  "rbu vfs not fou
140c0 6e 64 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  nd");.  }.}../*.
140d0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
140e0 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  is a copy of the
140f0 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66   sqlite3FileSuff
14100 69 78 33 28 29 20 72 6f 75 74 69 6e 65 20 66 72  ix3() routine fr
14110 6f 6d 20 74 68 65 20 63 6f 72 65 2e 0a 2a 2a 20  om the core..** 
14120 49 74 20 69 73 20 61 20 6e 6f 2d 6f 70 20 75 6e  It is a no-op un
14130 6c 65 73 73 20 53 51 4c 49 54 45 5f 45 4e 41 42  less SQLITE_ENAB
14140 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53 20 69 73 20  LE_8_3_NAMES is 
14150 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  defined..**.** I
14160 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
14170 38 5f 33 5f 4e 41 4d 45 53 20 69 73 20 73 65 74  8_3_NAMES is set
14180 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
14190 20 61 6e 64 20 69 66 20 74 68 65 20 64 61 74 61   and if the data
141a0 62 61 73 65 0a 2a 2a 20 66 69 6c 65 6e 61 6d 65  base.** filename
141b0 20 69 6e 20 7a 42 61 73 65 46 69 6c 65 6e 61 6d   in zBaseFilenam
141c0 65 20 69 73 20 61 20 55 52 49 20 77 69 74 68 20  e is a URI with 
141d0 74 68 65 20 22 38 5f 33 5f 6e 61 6d 65 73 3d 31  the "8_3_names=1
141e0 22 20 70 61 72 61 6d 65 74 65 72 20 61 6e 64 0a  " parameter and.
141f0 2a 2a 20 69 66 20 66 69 6c 65 6e 61 6d 65 20 69  ** if filename i
14200 6e 20 7a 5b 5d 20 68 61 73 20 61 20 73 75 66 66  n z[] has a suff
14210 69 78 20 28 61 2e 6b 2e 61 2e 20 22 65 78 74 65  ix (a.k.a. "exte
14220 6e 73 69 6f 6e 22 29 20 74 68 61 74 20 69 73 20  nsion") that is 
14230 6c 6f 6e 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74  longer than.** t
14240 68 72 65 65 20 63 68 61 72 61 63 74 65 72 73 2c  hree characters,
14250 20 74 68 65 6e 20 73 68 6f 72 74 65 6e 20 74 68   then shorten th
14260 65 20 73 75 66 66 69 78 20 6f 6e 20 7a 5b 5d 20  e suffix on z[] 
14270 74 6f 20 62 65 20 74 68 65 20 6c 61 73 74 20 74  to be the last t
14280 68 72 65 65 0a 2a 2a 20 63 68 61 72 61 63 74 65  hree.** characte
14290 72 73 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e  rs of the origin
142a0 61 6c 20 73 75 66 66 69 78 2e 0a 2a 2a 0a 2a 2a  al suffix..**.**
142b0 20 49 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   If SQLITE_ENABL
142c0 45 5f 38 5f 33 5f 4e 41 4d 45 53 20 69 73 20 73  E_8_3_NAMES is s
142d0 65 74 20 74 6f 20 32 20 61 74 20 63 6f 6d 70 69  et to 2 at compi
142e0 6c 65 2d 74 69 6d 65 2c 20 74 68 65 6e 20 61 6c  le-time, then al
142f0 77 61 79 73 0a 2a 2a 20 64 6f 20 74 68 65 20 73  ways.** do the s
14300 75 66 66 69 78 20 73 68 6f 72 74 65 6e 69 6e 67  uffix shortening
14310 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 55   regardless of U
14320 52 49 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a  RI parameter..**
14330 0a 2a 2a 20 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a  .** Examples:.**
14340 0a 2a 2a 20 20 20 20 20 74 65 73 74 2e 64 62 2d  .**     test.db-
14350 6a 6f 75 72 6e 61 6c 20 20 20 20 3d 3e 20 20 20  journal    =>   
14360 74 65 73 74 2e 6e 61 6c 0a 2a 2a 20 20 20 20 20  test.nal.**     
14370 74 65 73 74 2e 64 62 2d 77 61 6c 20 20 20 20 20  test.db-wal     
14380 20 20 20 3d 3e 20 20 20 74 65 73 74 2e 77 61 6c     =>   test.wal
14390 0a 2a 2a 20 20 20 20 20 74 65 73 74 2e 64 62 2d  .**     test.db-
143a0 73 68 6d 20 20 20 20 20 20 20 20 3d 3e 20 20 20  shm        =>   
143b0 74 65 73 74 2e 73 68 6d 0a 2a 2a 20 20 20 20 20  test.shm.**     
143c0 74 65 73 74 2e 64 62 2d 6d 6a 37 66 33 33 31 39  test.db-mj7f3319
143d0 66 61 20 3d 3e 20 20 20 74 65 73 74 2e 39 66 61  fa =>   test.9fa
143e0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
143f0 72 62 75 46 69 6c 65 53 75 66 66 69 78 33 28 63  rbuFileSuffix3(c
14400 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 61 73 65  onst char *zBase
14410 2c 20 63 68 61 72 20 2a 7a 29 7b 0a 23 69 66 64  , char *z){.#ifd
14420 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
14430 5f 38 5f 33 5f 4e 41 4d 45 53 0a 23 69 66 20 53  _8_3_NAMES.#if S
14440 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 38 5f 33  QLITE_ENABLE_8_3
14450 5f 4e 41 4d 45 53 3c 32 0a 20 20 69 66 28 20 73  _NAMES<2.  if( s
14460 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65  qlite3_uri_boole
14470 61 6e 28 7a 42 61 73 65 2c 20 22 38 5f 33 5f 6e  an(zBase, "8_3_n
14480 61 6d 65 73 22 2c 20 30 29 20 29 0a 23 65 6e 64  ames", 0) ).#end
14490 69 66 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 69  if.  {.    int i
144a0 2c 20 73 7a 3b 0a 20 20 20 20 73 7a 20 3d 20 73  , sz;.    sz = s
144b0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
144c0 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 73 7a 2d  );.    for(i=sz-
144d0 31 3b 20 69 3e 30 20 26 26 20 7a 5b 69 5d 21 3d  1; i>0 && z[i]!=
144e0 27 2f 27 20 26 26 20 7a 5b 69 5d 21 3d 27 2e 27  '/' && z[i]!='.'
144f0 3b 20 69 2d 2d 29 7b 7d 0a 20 20 20 20 69 66 28  ; i--){}.    if(
14500 20 7a 5b 69 5d 3d 3d 27 2e 27 20 26 26 20 41 4c   z[i]=='.' && AL
14510 57 41 59 53 28 73 7a 3e 69 2b 34 29 20 29 20 6d  WAYS(sz>i+4) ) m
14520 65 6d 6d 6f 76 65 28 26 7a 5b 69 2b 31 5d 2c 20  emmove(&z[i+1], 
14530 26 7a 5b 73 7a 2d 33 5d 2c 20 34 29 3b 0a 20 20  &z[sz-3], 4);.  
14540 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  }.#endif.}../*.*
14550 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72  * Return the cur
14560 72 65 6e 74 20 77 61 6c 2d 69 6e 64 65 78 20 68  rent wal-index h
14570 65 61 64 65 72 20 63 68 65 63 6b 73 75 6d 20 66  eader checksum f
14580 6f 72 20 74 68 65 20 74 61 72 67 65 74 20 64 61  or the target da
14590 74 61 62 61 73 65 20 0a 2a 2a 20 61 73 20 61 20  tabase .** as a 
145a0 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 2e 0a  64-bit integer..
145b0 2a 2a 0a 2a 2a 20 54 68 65 20 63 68 65 63 6b 73  **.** The checks
145c0 75 6d 20 69 73 20 73 74 6f 72 65 20 69 6e 20 74  um is store in t
145d0 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
145e0 20 78 53 68 6d 4d 61 70 20 6d 65 6d 6f 72 79 20   xShmMap memory 
145f0 61 73 20 61 6e 20 38 2d 62 79 74 65 20 0a 2a 2a  as an 8-byte .**
14600 20 62 6c 6f 62 20 73 74 61 72 74 69 6e 67 20 61   blob starting a
14610 74 20 62 79 74 65 20 6f 66 66 73 65 74 20 34 30  t byte offset 40
14620 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36 34 20  ..*/.static i64 
14630 72 62 75 53 68 6d 43 68 65 63 6b 73 75 6d 28 73  rbuShmChecksum(s
14640 71 6c 69 74 65 33 72 62 75 20 2a 70 29 7b 0a 20  qlite3rbu *p){. 
14650 20 69 36 34 20 69 52 65 74 20 3d 20 30 3b 0a 20   i64 iRet = 0;. 
14660 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
14670 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
14680 69 74 65 33 5f 66 69 6c 65 20 2a 70 44 62 20 3d  ite3_file *pDb =
14690 20 70 2d 3e 70 54 61 72 67 65 74 46 64 2d 3e 70   p->pTargetFd->p
146a0 52 65 61 6c 3b 0a 20 20 20 20 75 33 32 20 76 6f  Real;.    u32 vo
146b0 6c 61 74 69 6c 65 20 2a 70 74 72 3b 0a 20 20 20  latile *ptr;.   
146c0 20 70 2d 3e 72 63 20 3d 20 70 44 62 2d 3e 70 4d   p->rc = pDb->pM
146d0 65 74 68 6f 64 73 2d 3e 78 53 68 6d 4d 61 70 28  ethods->xShmMap(
146e0 70 44 62 2c 20 30 2c 20 33 32 2a 31 30 32 34 2c  pDb, 0, 32*1024,
146f0 20 30 2c 20 28 76 6f 69 64 20 76 6f 6c 61 74 69   0, (void volati
14700 6c 65 2a 2a 29 26 70 74 72 29 3b 0a 20 20 20 20  le**)&ptr);.    
14710 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
14720 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 52  E_OK ){.      iR
14730 65 74 20 3d 20 28 28 69 36 34 29 70 74 72 5b 31  et = ((i64)ptr[1
14740 30 5d 20 3c 3c 20 33 32 29 20 2b 20 70 74 72 5b  0] << 32) + ptr[
14750 31 31 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  11];.    }.  }. 
14760 20 72 65 74 75 72 6e 20 69 52 65 74 3b 0a 7d 0a   return iRet;.}.
14770 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
14780 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61  tion is called a
14790 73 20 70 61 72 74 20 6f 66 20 69 6e 69 74 69 61  s part of initia
147a0 6c 69 7a 69 6e 67 20 6f 72 20 72 65 69 6e 69 74  lizing or reinit
147b0 69 61 6c 69 7a 69 6e 67 20 61 6e 0a 2a 2a 20 69  ializing an.** i
147c0 6e 63 72 65 6d 65 6e 74 61 6c 20 63 68 65 63 6b  ncremental check
147d0 70 6f 69 6e 74 2e 20 0a 2a 2a 0a 2a 2a 20 49 74  point. .**.** It
147e0 20 70 6f 70 75 6c 61 74 65 73 20 74 68 65 20 73   populates the s
147f0 71 6c 69 74 65 33 72 62 75 2e 61 46 72 61 6d 65  qlite3rbu.aFrame
14800 5b 5d 20 61 72 72 61 79 20 77 69 74 68 20 74 68  [] array with th
14810 65 20 73 65 74 20 6f 66 20 0a 2a 2a 20 28 77 61  e set of .** (wa
14820 6c 20 66 72 61 6d 65 20 2d 3e 20 64 62 20 70 61  l frame -> db pa
14830 67 65 29 20 63 6f 70 79 20 6f 70 65 72 61 74 69  ge) copy operati
14840 6f 6e 73 20 72 65 71 75 69 72 65 64 20 74 6f 20  ons required to 
14850 63 68 65 63 6b 70 6f 69 6e 74 20 74 68 65 20 0a  checkpoint the .
14860 2a 2a 20 63 75 72 72 65 6e 74 20 77 61 6c 20 66  ** current wal f
14870 69 6c 65 2c 20 61 6e 64 20 6f 62 74 61 69 6e 73  ile, and obtains
14880 20 74 68 65 20 73 65 74 20 6f 66 20 73 68 6d 20   the set of shm 
14890 6c 6f 63 6b 73 20 72 65 71 75 69 72 65 64 20 74  locks required t
148a0 6f 20 73 61 66 65 6c 79 20 0a 2a 2a 20 70 65 72  o safely .** per
148b0 66 6f 72 6d 20 74 68 65 20 63 6f 70 79 20 6f 70  form the copy op
148c0 65 72 61 74 69 6f 6e 73 20 64 69 72 65 63 74 6c  erations directl
148d0 79 20 6f 6e 20 74 68 65 20 66 69 6c 65 2d 73 79  y on the file-sy
148e0 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  stem..**.** If a
148f0 72 67 75 6d 65 6e 74 20 70 53 74 61 74 65 20 69  rgument pState i
14900 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e  s not NULL, then
14910 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c   the incremental
14920 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 73 0a 2a   checkpoint is.*
14930 2a 20 62 65 69 6e 67 20 72 65 73 75 6d 65 64 2e  * being resumed.
14940 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 69   In this case, i
14950 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6f  f the checksum o
14960 66 20 74 68 65 20 77 61 6c 2d 69 6e 64 65 78 2d  f the wal-index-
14970 68 65 61 64 65 72 0a 2a 2a 20 66 6f 6c 6c 6f 77  header.** follow
14980 69 6e 67 20 72 65 63 6f 76 65 72 79 20 69 73 20  ing recovery is 
14990 6e 6f 74 20 74 68 65 20 73 61 6d 65 20 61 73 20  not the same as 
149a0 74 68 65 20 63 68 65 63 6b 73 75 6d 20 73 61 76  the checksum sav
149b0 65 64 20 69 6e 20 74 68 65 20 52 62 75 53 74 61  ed in the RbuSta
149c0 74 65 0a 2a 2a 20 6f 62 6a 65 63 74 2c 20 74 68  te.** object, th
149d0 65 6e 20 74 68 65 20 72 62 75 20 68 61 6e 64 6c  en the rbu handl
149e0 65 20 69 73 20 73 65 74 20 74 6f 20 44 4f 4e 45  e is set to DONE
149f0 20 73 74 61 74 65 2e 20 54 68 69 73 20 6f 63 63   state. This occ
14a00 75 72 73 20 69 66 20 73 6f 6d 65 0a 2a 2a 20 6f  urs if some.** o
14a10 74 68 65 72 20 63 6c 69 65 6e 74 20 61 70 70 65  ther client appe
14a20 6e 64 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f  nds a transactio
14a30 6e 20 74 6f 20 74 68 65 20 77 61 6c 20 66 69 6c  n to the wal fil
14a40 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20  e in the middle 
14a50 6f 66 0a 2a 2a 20 61 6e 20 69 6e 63 72 65 6d 65  of.** an increme
14a60 6e 74 61 6c 20 63 68 65 63 6b 70 6f 69 6e 74 2e  ntal checkpoint.
14a70 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
14a80 72 62 75 53 65 74 75 70 43 68 65 63 6b 70 6f 69  rbuSetupCheckpoi
14a90 6e 74 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70  nt(sqlite3rbu *p
14aa0 2c 20 52 62 75 53 74 61 74 65 20 2a 70 53 74 61  , RbuState *pSta
14ab0 74 65 29 7b 0a 0a 20 20 2f 2a 20 49 66 20 70 53  te){..  /* If pS
14ac0 74 61 74 65 20 69 73 20 4e 55 4c 4c 2c 20 74 68  tate is NULL, th
14ad0 65 6e 20 74 68 65 20 77 61 6c 20 66 69 6c 65 20  en the wal file 
14ae0 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 62 65 65  may not have bee
14af0 6e 20 6f 70 65 6e 65 64 20 61 6e 64 0a 20 20 2a  n opened and.  *
14b00 2a 20 72 65 63 6f 76 65 72 65 64 2e 20 52 75 6e  * recovered. Run
14b10 6e 69 6e 67 20 61 20 72 65 61 64 2d 73 74 61 74  ning a read-stat
14b20 65 6d 65 6e 74 20 68 65 72 65 20 74 6f 20 65 6e  ement here to en
14b30 73 75 72 65 20 74 68 61 74 20 64 6f 69 6e 67 20  sure that doing 
14b40 73 6f 0a 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74  so.  ** does not
14b50 20 69 6e 74 65 72 66 65 72 65 20 77 69 74 68 20   interfere with 
14b60 74 68 65 20 22 63 61 70 74 75 72 65 22 20 70 72  the "capture" pr
14b70 6f 63 65 73 73 20 62 65 6c 6f 77 2e 20 20 2a 2f  ocess below.  */
14b80 0a 20 20 69 66 28 20 70 53 74 61 74 65 3d 3d 30  .  if( pState==0
14b90 20 29 7b 0a 20 20 20 20 70 2d 3e 65 53 74 61 67   ){.    p->eStag
14ba0 65 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70  e = 0;.    if( p
14bb0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
14bc0 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  ){.      p->rc =
14bd0 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d   sqlite3_exec(p-
14be0 3e 64 62 4d 61 69 6e 2c 20 22 53 45 4c 45 43 54  >dbMain, "SELECT
14bf0 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d   * FROM sqlite_m
14c00 61 73 74 65 72 22 2c 20 30 2c 20 30 2c 20 30 29  aster", 0, 0, 0)
14c10 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
14c20 2a 20 41 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72  * Assuming no er
14c30 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64  ror has occurred
14c40 2c 20 72 75 6e 20 61 20 22 72 65 73 74 61 72 74  , run a "restart
14c50 22 20 63 68 65 63 6b 70 6f 69 6e 74 20 77 69 74  " checkpoint wit
14c60 68 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74  h the.  ** sqlit
14c70 65 33 72 62 75 2e 65 53 74 61 67 65 20 76 61 72  e3rbu.eStage var
14c80 69 61 62 6c 65 20 73 65 74 20 74 6f 20 43 41 50  iable set to CAP
14c90 54 55 52 45 2e 20 54 68 69 73 20 74 75 72 6e 73  TURE. This turns
14ca0 20 6f 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   on the followin
14cb0 67 0a 20 20 2a 2a 20 73 70 65 63 69 61 6c 20 62  g.  ** special b
14cc0 65 68 61 76 69 6f 75 72 20 69 6e 20 74 68 65 20  ehaviour in the 
14cd0 72 62 75 20 56 46 53 3a 0a 20 20 2a 2a 0a 20 20  rbu VFS:.  **.  
14ce0 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 65 78  **   * If the ex
14cf0 63 6c 75 73 69 76 65 20 73 68 6d 20 57 52 49 54  clusive shm WRIT
14d00 45 52 20 6f 72 20 52 45 41 44 30 20 6c 6f 63 6b  ER or READ0 lock
14d10 20 63 61 6e 6e 6f 74 20 62 65 20 6f 62 74 61 69   cannot be obtai
14d20 6e 65 64 2c 0a 20 20 2a 2a 20 20 20 20 20 74 68  ned,.  **     th
14d30 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 66 61 69  e checkpoint fai
14d40 6c 73 20 77 69 74 68 20 53 51 4c 49 54 45 5f 42  ls with SQLITE_B
14d50 55 53 59 20 28 6e 6f 72 6d 61 6c 6c 79 20 53 51  USY (normally SQ
14d60 4c 69 74 65 20 77 6f 75 6c 64 0a 20 20 2a 2a 20  Lite would.  ** 
14d70 20 20 20 20 70 72 6f 63 65 65 64 20 77 69 74 68      proceed with
14d80 20 72 75 6e 6e 69 6e 67 20 61 20 70 61 73 73 69   running a passi
14d90 76 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 6e  ve checkpoint in
14da0 73 74 65 61 64 20 6f 66 20 66 61 69 6c 69 6e 67  stead of failing
14db0 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a  )..  **.  **   *
14dc0 20 41 74 74 65 6d 70 74 73 20 74 6f 20 72 65 61   Attempts to rea
14dd0 64 20 66 72 6f 6d 20 74 68 65 20 2a 2d 77 61 6c  d from the *-wal
14de0 20 66 69 6c 65 20 6f 72 20 77 72 69 74 65 20 74   file or write t
14df0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
14e00 69 6c 65 0a 20 20 2a 2a 20 20 20 20 20 64 6f 20  ile.  **     do 
14e10 6e 6f 74 20 70 65 72 66 6f 72 6d 20 61 6e 79 20  not perform any 
14e20 49 4f 2e 20 49 6e 73 74 65 61 64 2c 20 74 68 65  IO. Instead, the
14e30 20 66 72 61 6d 65 2f 70 61 67 65 20 63 6f 6d 62   frame/page comb
14e40 69 6e 61 74 69 6f 6e 73 20 74 68 61 74 0a 20 20  inations that.  
14e50 2a 2a 20 20 20 20 20 77 6f 75 6c 64 20 62 65 20  **     would be 
14e60 72 65 61 64 2f 77 72 69 74 74 65 6e 20 61 72 65  read/written are
14e70 20 72 65 63 6f 72 64 65 64 20 69 6e 20 74 68 65   recorded in the
14e80 20 73 71 6c 69 74 65 33 72 62 75 2e 61 46 72 61   sqlite3rbu.aFra
14e90 6d 65 5b 5d 0a 20 20 2a 2a 20 20 20 20 20 61 72  me[].  **     ar
14ea0 72 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ray..  **.  **  
14eb0 20 2a 20 43 61 6c 6c 73 20 74 6f 20 78 53 68 6d   * Calls to xShm
14ec0 4c 6f 63 6b 28 55 4e 4c 4f 43 4b 29 20 74 6f 20  Lock(UNLOCK) to 
14ed0 72 65 6c 65 61 73 65 20 74 68 65 20 65 78 63 6c  release the excl
14ee0 75 73 69 76 65 20 73 68 6d 20 57 52 49 54 45 52  usive shm WRITER
14ef0 2c 20 0a 20 20 2a 2a 20 20 20 20 20 52 45 41 44  , .  **     READ
14f00 30 20 61 6e 64 20 43 48 45 43 4b 50 4f 49 4e 54  0 and CHECKPOINT
14f10 20 6c 6f 63 6b 73 20 74 61 6b 65 6e 20 61 73 20   locks taken as 
14f20 70 61 72 74 20 6f 66 20 74 68 65 20 63 68 65 63  part of the chec
14f30 6b 70 6f 69 6e 74 20 61 72 65 0a 20 20 2a 2a 20  kpoint are.  ** 
14f40 20 20 20 20 6e 6f 2d 6f 70 73 2e 20 54 68 65 73      no-ops. Thes
14f50 65 20 6c 6f 63 6b 73 20 77 69 6c 6c 20 6e 6f 74  e locks will not
14f60 20 62 65 20 72 65 6c 65 61 73 65 64 20 75 6e 74   be released unt
14f70 69 6c 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  il the connectio
14f80 6e 0a 20 20 2a 2a 20 20 20 20 20 69 73 20 63 6c  n.  **     is cl
14f90 6f 73 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  osed..  **.  ** 
14fa0 20 20 2a 20 41 74 74 65 6d 70 74 69 6e 67 20 74    * Attempting t
14fb0 6f 20 78 53 79 6e 63 28 29 20 74 68 65 20 64 61  o xSync() the da
14fc0 74 61 62 61 73 65 20 66 69 6c 65 20 63 61 75 73  tabase file caus
14fd0 65 73 20 61 6e 20 53 51 4c 49 54 45 5f 49 4e 54  es an SQLITE_INT
14fe0 45 52 4e 41 4c 20 0a 20 20 2a 2a 20 20 20 20 20  ERNAL .  **     
14ff0 65 72 72 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  error..  **.  **
15000 20 41 73 20 61 20 72 65 73 75 6c 74 2c 20 75 6e   As a result, un
15010 6c 65 73 73 20 61 6e 20 65 72 72 6f 72 20 28 69  less an error (i
15020 2e 65 2e 20 4f 4f 4d 20 6f 72 20 53 51 4c 49 54  .e. OOM or SQLIT
15030 45 5f 42 55 53 59 29 20 6f 63 63 75 72 73 2c 20  E_BUSY) occurs, 
15040 74 68 65 0a 20 20 2a 2a 20 63 68 65 63 6b 70 6f  the.  ** checkpo
15050 69 6e 74 20 62 65 6c 6f 77 20 66 61 69 6c 73 20  int below fails 
15060 77 69 74 68 20 53 51 4c 49 54 45 5f 49 4e 54 45  with SQLITE_INTE
15070 52 4e 41 4c 2c 20 61 6e 64 20 6c 65 61 76 65 73  RNAL, and leaves
15080 20 74 68 65 20 61 46 72 61 6d 65 5b 5d 0a 20 20   the aFrame[].  
15090 2a 2a 20 61 72 72 61 79 20 70 6f 70 75 6c 61 74  ** array populat
150a0 65 64 20 77 69 74 68 20 61 20 73 65 74 20 6f 66  ed with a set of
150b0 20 28 66 72 61 6d 65 20 2d 3e 20 70 61 67 65 29   (frame -> page)
150c0 20 6d 61 70 70 69 6e 67 73 2e 20 42 65 63 61 75   mappings. Becau
150d0 73 65 20 74 68 65 20 0a 20 20 2a 2a 20 57 52 49  se the .  ** WRI
150e0 54 45 52 2c 20 43 48 45 43 4b 50 4f 49 4e 54 20  TER, CHECKPOINT 
150f0 61 6e 64 20 52 45 41 44 30 20 6c 6f 63 6b 73 20  and READ0 locks 
15100 61 72 65 20 73 74 69 6c 6c 20 68 65 6c 64 2c 20  are still held, 
15110 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 63 6f  it is safe to co
15120 70 79 20 0a 20 20 2a 2a 20 64 61 74 61 20 66 72  py .  ** data fr
15130 6f 6d 20 74 68 65 20 77 61 6c 20 66 69 6c 65 20  om the wal file 
15140 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
15150 65 20 66 69 6c 65 20 61 63 63 6f 72 64 69 6e 67  e file according
15160 20 74 6f 20 74 68 65 20 0a 20 20 2a 2a 20 63 6f   to the .  ** co
15170 6e 74 65 6e 74 73 20 6f 66 20 61 46 72 61 6d 65  ntents of aFrame
15180 5b 5d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  []..  */.  if( p
15190 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
151a0 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a  ){.    int rc2;.
151b0 20 20 20 20 70 2d 3e 65 53 74 61 67 65 20 3d 20      p->eStage = 
151c0 52 42 55 5f 53 54 41 47 45 5f 43 41 50 54 55 52  RBU_STAGE_CAPTUR
151d0 45 3b 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c  E;.    rc2 = sql
151e0 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 4d  ite3_exec(p->dbM
151f0 61 69 6e 2c 20 22 50 52 41 47 4d 41 20 6d 61 69  ain, "PRAGMA mai
15200 6e 2e 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  n.wal_checkpoint
15210 3d 72 65 73 74 61 72 74 22 2c 20 30 2c 20 30 2c  =restart", 0, 0,
15220 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 32 21  0);.    if( rc2!
15230 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c  =SQLITE_INTERNAL
15240 20 29 20 70 2d 3e 72 63 20 3d 20 72 63 32 3b 0a   ) p->rc = rc2;.
15250 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63    }..  if( p->rc
15260 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
15270 20 20 20 70 2d 3e 65 53 74 61 67 65 20 3d 20 52     p->eStage = R
15280 42 55 5f 53 54 41 47 45 5f 43 4b 50 54 3b 0a 20  BU_STAGE_CKPT;. 
15290 20 20 20 70 2d 3e 6e 53 74 65 70 20 3d 20 28 70     p->nStep = (p
152a0 53 74 61 74 65 20 3f 20 70 53 74 61 74 65 2d 3e  State ? pState->
152b0 6e 52 6f 77 20 3a 20 30 29 3b 0a 20 20 20 20 70  nRow : 0);.    p
152c0 2d 3e 61 42 75 66 20 3d 20 72 62 75 4d 61 6c 6c  ->aBuf = rbuMall
152d0 6f 63 28 70 2c 20 70 2d 3e 70 67 73 7a 29 3b 0a  oc(p, p->pgsz);.
152e0 20 20 20 20 70 2d 3e 69 57 61 6c 43 6b 73 75 6d      p->iWalCksum
152f0 20 3d 20 72 62 75 53 68 6d 43 68 65 63 6b 73 75   = rbuShmChecksu
15300 6d 28 70 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  m(p);.  }..  if(
15310 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
15320 4b 20 26 26 20 70 53 74 61 74 65 20 26 26 20 70  K && pState && p
15330 53 74 61 74 65 2d 3e 69 57 61 6c 43 6b 73 75 6d  State->iWalCksum
15340 21 3d 70 2d 3e 69 57 61 6c 43 6b 73 75 6d 20 29  !=p->iWalCksum )
15350 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51  {.    p->rc = SQ
15360 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 70  LITE_DONE;.    p
15370 2d 3e 65 53 74 61 67 65 20 3d 20 52 42 55 5f 53  ->eStage = RBU_S
15380 54 41 47 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 7d  TAGE_DONE;.  }.}
15390 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 65 64 20 77  ../*.** Called w
153a0 68 65 6e 20 69 41 6d 74 20 62 79 74 65 73 20 61  hen iAmt bytes a
153b0 72 65 20 72 65 61 64 20 66 72 6f 6d 20 6f 66 66  re read from off
153c0 73 65 74 20 69 4f 66 66 20 6f 66 20 74 68 65 20  set iOff of the 
153d0 77 61 6c 20 66 69 6c 65 20 77 68 69 6c 65 0a 2a  wal file while.*
153e0 2a 20 74 68 65 20 72 62 75 20 6f 62 6a 65 63 74  * the rbu object
153f0 20 69 73 20 69 6e 20 63 61 70 74 75 72 65 20 6d   is in capture m
15400 6f 64 65 2e 20 52 65 63 6f 72 64 20 74 68 65 20  ode. Record the 
15410 66 72 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20  frame number of 
15420 74 68 65 20 66 72 61 6d 65 0a 2a 2a 20 62 65 69  the frame.** bei
15430 6e 67 20 72 65 61 64 20 69 6e 20 74 68 65 20 61  ng read in the a
15440 46 72 61 6d 65 5b 5d 20 61 72 72 61 79 2e 0a 2a  Frame[] array..*
15450 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62 75  /.static int rbu
15460 43 61 70 74 75 72 65 57 61 6c 52 65 61 64 28 73  CaptureWalRead(s
15470 71 6c 69 74 65 33 72 62 75 20 2a 70 52 62 75 2c  qlite3rbu *pRbu,
15480 20 69 36 34 20 69 4f 66 66 2c 20 69 6e 74 20 69   i64 iOff, int i
15490 41 6d 74 29 7b 0a 20 20 63 6f 6e 73 74 20 75 33  Amt){.  const u3
154a0 32 20 6d 52 65 71 20 3d 20 28 31 3c 3c 57 41 4c  2 mReq = (1<<WAL
154b0 5f 4c 4f 43 4b 5f 57 52 49 54 45 29 7c 28 31 3c  _LOCK_WRITE)|(1<
154c0 3c 57 41 4c 5f 4c 4f 43 4b 5f 43 4b 50 54 29 7c  <WAL_LOCK_CKPT)|
154d0 28 31 3c 3c 57 41 4c 5f 4c 4f 43 4b 5f 52 45 41  (1<<WAL_LOCK_REA
154e0 44 30 29 3b 0a 20 20 75 33 32 20 69 46 72 61 6d  D0);.  u32 iFram
154f0 65 3b 0a 0a 20 20 69 66 28 20 70 52 62 75 2d 3e  e;..  if( pRbu->
15500 6d 4c 6f 63 6b 21 3d 6d 52 65 71 20 29 7b 0a 20  mLock!=mReq ){. 
15510 20 20 20 70 52 62 75 2d 3e 72 63 20 3d 20 53 51     pRbu->rc = SQ
15520 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 72  LITE_BUSY;.    r
15530 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4e 54  eturn SQLITE_INT
15540 45 52 4e 41 4c 3b 0a 20 20 7d 0a 0a 20 20 70 52  ERNAL;.  }..  pR
15550 62 75 2d 3e 70 67 73 7a 20 3d 20 69 41 6d 74 3b  bu->pgsz = iAmt;
15560 0a 20 20 69 66 28 20 70 52 62 75 2d 3e 6e 46 72  .  if( pRbu->nFr
15570 61 6d 65 3d 3d 70 52 62 75 2d 3e 6e 46 72 61 6d  ame==pRbu->nFram
15580 65 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 69 6e  eAlloc ){.    in
15590 74 20 6e 4e 65 77 20 3d 20 28 70 52 62 75 2d 3e  t nNew = (pRbu->
155a0 6e 46 72 61 6d 65 41 6c 6c 6f 63 20 3f 20 70 52  nFrameAlloc ? pR
155b0 62 75 2d 3e 6e 46 72 61 6d 65 41 6c 6c 6f 63 20  bu->nFrameAlloc 
155c0 3a 20 36 34 29 20 2a 20 32 3b 0a 20 20 20 20 52  : 64) * 2;.    R
155d0 62 75 46 72 61 6d 65 20 2a 61 4e 65 77 3b 0a 20  buFrame *aNew;. 
155e0 20 20 20 61 4e 65 77 20 3d 20 28 52 62 75 46 72     aNew = (RbuFr
155f0 61 6d 65 2a 29 73 71 6c 69 74 65 33 5f 72 65 61  ame*)sqlite3_rea
15600 6c 6c 6f 63 36 34 28 70 52 62 75 2d 3e 61 46 72  lloc64(pRbu->aFr
15610 61 6d 65 2c 20 6e 4e 65 77 20 2a 20 73 69 7a 65  ame, nNew * size
15620 6f 66 28 52 62 75 46 72 61 6d 65 29 29 3b 0a 20  of(RbuFrame));. 
15630 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29     if( aNew==0 )
15640 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
15650 4f 4d 45 4d 3b 0a 20 20 20 20 70 52 62 75 2d 3e  OMEM;.    pRbu->
15660 61 46 72 61 6d 65 20 3d 20 61 4e 65 77 3b 0a 20  aFrame = aNew;. 
15670 20 20 20 70 52 62 75 2d 3e 6e 46 72 61 6d 65 41     pRbu->nFrameA
15680 6c 6c 6f 63 20 3d 20 6e 4e 65 77 3b 0a 20 20 7d  lloc = nNew;.  }
15690 0a 0a 20 20 69 46 72 61 6d 65 20 3d 20 28 75 33  ..  iFrame = (u3
156a0 32 29 28 28 69 4f 66 66 2d 33 32 29 20 2f 20 28  2)((iOff-32) / (
156b0 69 36 34 29 28 69 41 6d 74 2b 32 34 29 29 20 2b  i64)(iAmt+24)) +
156c0 20 31 3b 0a 20 20 69 66 28 20 70 52 62 75 2d 3e   1;.  if( pRbu->
156d0 69 4d 61 78 46 72 61 6d 65 3c 69 46 72 61 6d 65  iMaxFrame<iFrame
156e0 20 29 20 70 52 62 75 2d 3e 69 4d 61 78 46 72 61   ) pRbu->iMaxFra
156f0 6d 65 20 3d 20 69 46 72 61 6d 65 3b 0a 20 20 70  me = iFrame;.  p
15700 52 62 75 2d 3e 61 46 72 61 6d 65 5b 70 52 62 75  Rbu->aFrame[pRbu
15710 2d 3e 6e 46 72 61 6d 65 5d 2e 69 57 61 6c 46 72  ->nFrame].iWalFr
15720 61 6d 65 20 3d 20 69 46 72 61 6d 65 3b 0a 20 20  ame = iFrame;.  
15730 70 52 62 75 2d 3e 61 46 72 61 6d 65 5b 70 52 62  pRbu->aFrame[pRb
15740 75 2d 3e 6e 46 72 61 6d 65 5d 2e 69 44 62 50 61  u->nFrame].iDbPa
15750 67 65 20 3d 20 30 3b 0a 20 20 70 52 62 75 2d 3e  ge = 0;.  pRbu->
15760 6e 46 72 61 6d 65 2b 2b 3b 0a 20 20 72 65 74 75  nFrame++;.  retu
15770 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
15780 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 65 64 20 77 68  ./*.** Called wh
15790 65 6e 20 61 20 70 61 67 65 20 6f 66 20 64 61 74  en a page of dat
157a0 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  a is written to 
157b0 6f 66 66 73 65 74 20 69 4f 66 66 20 6f 66 20 74  offset iOff of t
157c0 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66  he database.** f
157d0 69 6c 65 20 77 68 69 6c 65 20 74 68 65 20 72 62  ile while the rb
157e0 75 20 68 61 6e 64 6c 65 20 69 73 20 69 6e 20 63  u handle is in c
157f0 61 70 74 75 72 65 20 6d 6f 64 65 2e 20 52 65 63  apture mode. Rec
15800 6f 72 64 20 74 68 65 20 70 61 67 65 20 6e 75 6d  ord the page num
15810 62 65 72 20 0a 2a 2a 20 6f 66 20 74 68 65 20 70  ber .** of the p
15820 61 67 65 20 62 65 69 6e 67 20 77 72 69 74 74 65  age being writte
15830 6e 20 69 6e 20 74 68 65 20 61 46 72 61 6d 65 5b  n in the aFrame[
15840 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74  ] array..*/.stat
15850 69 63 20 69 6e 74 20 72 62 75 43 61 70 74 75 72  ic int rbuCaptur
15860 65 44 62 57 72 69 74 65 28 73 71 6c 69 74 65 33  eDbWrite(sqlite3
15870 72 62 75 20 2a 70 52 62 75 2c 20 69 36 34 20 69  rbu *pRbu, i64 i
15880 4f 66 66 29 7b 0a 20 20 70 52 62 75 2d 3e 61 46  Off){.  pRbu->aF
15890 72 61 6d 65 5b 70 52 62 75 2d 3e 6e 46 72 61 6d  rame[pRbu->nFram
158a0 65 2d 31 5d 2e 69 44 62 50 61 67 65 20 3d 20 28  e-1].iDbPage = (
158b0 75 33 32 29 28 69 4f 66 66 20 2f 20 70 52 62 75  u32)(iOff / pRbu
158c0 2d 3e 70 67 73 7a 29 20 2b 20 31 3b 0a 20 20 72  ->pgsz) + 1;.  r
158d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
158e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  .}../*.** This i
158f0 73 20 63 61 6c 6c 65 64 20 61 73 20 70 61 72 74  s called as part
15900 20 6f 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74   of an increment
15910 61 6c 20 63 68 65 63 6b 70 6f 69 6e 74 20 6f 70  al checkpoint op
15920 65 72 61 74 69 6f 6e 2e 20 43 6f 70 79 0a 2a 2a  eration. Copy.**
15930 20 61 20 73 69 6e 67 6c 65 20 66 72 61 6d 65 20   a single frame 
15940 6f 66 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  of data from the
15950 20 77 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 74   wal file into t
15960 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
15970 2c 20 61 73 0a 2a 2a 20 69 6e 64 69 63 61 74 65  , as.** indicate
15980 64 20 62 79 20 74 68 65 20 52 62 75 46 72 61 6d  d by the RbuFram
15990 65 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61  e object..*/.sta
159a0 74 69 63 20 76 6f 69 64 20 72 62 75 43 68 65 63  tic void rbuChec
159b0 6b 70 6f 69 6e 74 46 72 61 6d 65 28 73 71 6c 69  kpointFrame(sqli
159c0 74 65 33 72 62 75 20 2a 70 2c 20 52 62 75 46 72  te3rbu *p, RbuFr
159d0 61 6d 65 20 2a 70 46 72 61 6d 65 29 7b 0a 20 20  ame *pFrame){.  
159e0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 57  sqlite3_file *pW
159f0 61 6c 20 3d 20 70 2d 3e 70 54 61 72 67 65 74 46  al = p->pTargetF
15a00 64 2d 3e 70 57 61 6c 46 64 2d 3e 70 52 65 61 6c  d->pWalFd->pReal
15a10 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  ;.  sqlite3_file
15a20 20 2a 70 44 62 20 3d 20 70 2d 3e 70 54 61 72 67   *pDb = p->pTarg
15a30 65 74 46 64 2d 3e 70 52 65 61 6c 3b 0a 20 20 69  etFd->pReal;.  i
15a40 36 34 20 69 4f 66 66 3b 0a 0a 20 20 61 73 73 65  64 iOff;..  asse
15a50 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rt( p->rc==SQLIT
15a60 45 5f 4f 4b 20 29 3b 0a 20 20 69 4f 66 66 20 3d  E_OK );.  iOff =
15a70 20 28 69 36 34 29 28 70 46 72 61 6d 65 2d 3e 69   (i64)(pFrame->i
15a80 57 61 6c 46 72 61 6d 65 2d 31 29 20 2a 20 28 70  WalFrame-1) * (p
15a90 2d 3e 70 67 73 7a 20 2b 20 32 34 29 20 2b 20 33  ->pgsz + 24) + 3
15aa0 32 20 2b 20 32 34 3b 0a 20 20 70 2d 3e 72 63 20  2 + 24;.  p->rc 
15ab0 3d 20 70 57 61 6c 2d 3e 70 4d 65 74 68 6f 64 73  = pWal->pMethods
15ac0 2d 3e 78 52 65 61 64 28 70 57 61 6c 2c 20 70 2d  ->xRead(pWal, p-
15ad0 3e 61 42 75 66 2c 20 70 2d 3e 70 67 73 7a 2c 20  >aBuf, p->pgsz, 
15ae0 69 4f 66 66 29 3b 0a 20 20 69 66 28 20 70 2d 3e  iOff);.  if( p->
15af0 72 63 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  rc ) return;..  
15b00 69 4f 66 66 20 3d 20 28 69 36 34 29 28 70 46 72  iOff = (i64)(pFr
15b10 61 6d 65 2d 3e 69 44 62 50 61 67 65 2d 31 29 20  ame->iDbPage-1) 
15b20 2a 20 70 2d 3e 70 67 73 7a 3b 0a 20 20 70 2d 3e  * p->pgsz;.  p->
15b30 72 63 20 3d 20 70 44 62 2d 3e 70 4d 65 74 68 6f  rc = pDb->pMetho
15b40 64 73 2d 3e 78 57 72 69 74 65 28 70 44 62 2c 20  ds->xWrite(pDb, 
15b50 70 2d 3e 61 42 75 66 2c 20 70 2d 3e 70 67 73 7a  p->aBuf, p->pgsz
15b60 2c 20 69 4f 66 66 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  , iOff);.}.../*.
15b70 2a 2a 20 54 61 6b 65 20 61 6e 20 45 58 43 4c 55  ** Take an EXCLU
15b80 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
15b90 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
15ba0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
15bb0 62 75 4c 6f 63 6b 44 61 74 61 62 61 73 65 28 73  buLockDatabase(s
15bc0 71 6c 69 74 65 33 72 62 75 20 2a 70 29 7b 0a 20  qlite3rbu *p){. 
15bd0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
15be0 52 65 61 6c 20 3d 20 70 2d 3e 70 54 61 72 67 65  Real = p->pTarge
15bf0 74 46 64 2d 3e 70 52 65 61 6c 3b 0a 20 20 61 73  tFd->pReal;.  as
15c00 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  sert( p->rc==SQL
15c10 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 70 2d 3e 72  ITE_OK );.  p->r
15c20 63 20 3d 20 70 52 65 61 6c 2d 3e 70 4d 65 74 68  c = pReal->pMeth
15c30 6f 64 73 2d 3e 78 4c 6f 63 6b 28 70 52 65 61 6c  ods->xLock(pReal
15c40 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 53 48  , SQLITE_LOCK_SH
15c50 41 52 45 44 29 3b 0a 20 20 69 66 28 20 70 2d 3e  ARED);.  if( p->
15c60 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
15c70 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 52 65  .    p->rc = pRe
15c80 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 4c  al->pMethods->xL
15c90 6f 63 6b 28 70 52 65 61 6c 2c 20 53 51 4c 49 54  ock(pReal, SQLIT
15ca0 45 5f 4c 4f 43 4b 5f 45 58 43 4c 55 53 49 56 45  E_LOCK_EXCLUSIVE
15cb0 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 64 65  );.  }.}..#if de
15cc0 66 69 6e 65 64 28 5f 57 49 4e 33 32 5f 57 43 45  fined(_WIN32_WCE
15cd0 29 0a 73 74 61 74 69 63 20 4c 50 57 53 54 52 20  ).static LPWSTR 
15ce0 72 62 75 57 69 6e 55 74 66 38 54 6f 55 6e 69 63  rbuWinUtf8ToUnic
15cf0 6f 64 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ode(const char *
15d00 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e  zFilename){.  in
15d10 74 20 6e 43 68 61 72 3b 0a 20 20 4c 50 57 53 54  t nChar;.  LPWST
15d20 52 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 3b  R zWideFilename;
15d30 0a 0a 20 20 6e 43 68 61 72 20 3d 20 4d 75 6c 74  ..  nChar = Mult
15d40 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 28  iByteToWideChar(
15d50 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 46 69 6c  CP_UTF8, 0, zFil
15d60 65 6e 61 6d 65 2c 20 2d 31 2c 20 4e 55 4c 4c 2c  ename, -1, NULL,
15d70 20 30 29 3b 0a 20 20 69 66 28 20 6e 43 68 61 72   0);.  if( nChar
15d80 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
15d90 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 57 69 64 65  n 0;.  }.  zWide
15da0 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Filename = sqlit
15db0 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 6e 43 68  e3_malloc64( nCh
15dc0 61 72 2a 73 69 7a 65 6f 66 28 7a 57 69 64 65 46  ar*sizeof(zWideF
15dd0 69 6c 65 6e 61 6d 65 5b 30 5d 29 20 29 3b 0a 20  ilename[0]) );. 
15de0 20 69 66 28 20 7a 57 69 64 65 46 69 6c 65 6e 61   if( zWideFilena
15df0 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  me==0 ){.    ret
15e00 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6d 65 6d  urn 0;.  }.  mem
15e10 73 65 74 28 7a 57 69 64 65 46 69 6c 65 6e 61 6d  set(zWideFilenam
15e20 65 2c 20 30 2c 20 6e 43 68 61 72 2a 73 69 7a 65  e, 0, nChar*size
15e30 6f 66 28 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  of(zWideFilename
15e40 5b 30 5d 29 29 3b 0a 20 20 6e 43 68 61 72 20 3d  [0]));.  nChar =
15e50 20 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65   MultiByteToWide
15e60 43 68 61 72 28 43 50 5f 55 54 46 38 2c 20 30 2c  Char(CP_UTF8, 0,
15e70 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20   zFilename, -1, 
15e80 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c 0a 20  zWideFilename,. 
15e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
15eb0 43 68 61 72 29 3b 0a 20 20 69 66 28 20 6e 43 68  Char);.  if( nCh
15ec0 61 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ar==0 ){.    sql
15ed0 69 74 65 33 5f 66 72 65 65 28 7a 57 69 64 65 46  ite3_free(zWideF
15ee0 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 57  ilename);.    zW
15ef0 69 64 65 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b  ideFilename = 0;
15f00 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 57  .  }.  return zW
15f10 69 64 65 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 23  ideFilename;.}.#
15f20 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
15f30 20 52 42 55 20 68 61 6e 64 6c 65 20 69 73 20 63   RBU handle is c
15f40 75 72 72 65 6e 74 6c 79 20 69 6e 20 52 42 55 5f  urrently in RBU_
15f50 53 54 41 47 45 5f 4f 41 4c 20 73 74 61 74 65 2c  STAGE_OAL state,
15f60 20 77 69 74 68 20 61 20 53 48 41 52 45 44 20 6c   with a SHARED l
15f70 6f 63 6b 0a 2a 2a 20 6f 6e 20 74 68 65 20 64 61  ock.** on the da
15f80 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 69  tabase file. Thi
15f90 73 20 70 72 6f 63 20 6d 6f 76 65 73 20 74 68 65  s proc moves the
15fa0 20 2a 2d 6f 61 6c 20 66 69 6c 65 20 74 6f 20 74   *-oal file to t
15fb0 68 65 20 2a 2d 77 61 6c 20 70 61 74 68 2c 0a 2a  he *-wal path,.*
15fc0 2a 20 74 68 65 6e 20 72 65 6f 70 65 6e 73 20 74  * then reopens t
15fd0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
15fe0 20 28 74 68 69 73 20 74 69 6d 65 20 69 6e 20 76   (this time in v
15ff0 61 6e 69 6c 6c 61 2c 20 6e 6f 6e 2d 6f 61 6c 2c  anilla, non-oal,
16000 20 57 41 4c 20 6d 6f 64 65 29 2e 0a 2a 2a 20 49   WAL mode)..** I
16010 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
16020 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  s, leave an erro
16030 72 20 63 6f 64 65 20 61 6e 64 20 65 72 72 6f 72  r code and error
16040 20 6d 65 73 73 61 67 65 20 69 6e 20 74 68 65 20   message in the 
16050 72 62 75 20 0a 2a 2a 20 68 61 6e 64 6c 65 2e 0a  rbu .** handle..
16060 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
16070 62 75 4d 6f 76 65 4f 61 6c 46 69 6c 65 28 73 71  buMoveOalFile(sq
16080 6c 69 74 65 33 72 62 75 20 2a 70 29 7b 0a 20 20  lite3rbu *p){.  
16090 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 61 73  const char *zBas
160a0 65 20 3d 20 73 71 6c 69 74 65 33 5f 64 62 5f 66  e = sqlite3_db_f
160b0 69 6c 65 6e 61 6d 65 28 70 2d 3e 64 62 4d 61 69  ilename(p->dbMai
160c0 6e 2c 20 22 6d 61 69 6e 22 29 3b 0a 20 20 63 6f  n, "main");.  co
160d0 6e 73 74 20 63 68 61 72 20 2a 7a 4d 6f 76 65 20  nst char *zMove 
160e0 3d 20 7a 42 61 73 65 3b 0a 20 20 63 68 61 72 20  = zBase;.  char 
160f0 2a 7a 4f 61 6c 3b 0a 20 20 63 68 61 72 20 2a 7a  *zOal;.  char *z
16100 57 61 6c 3b 0a 0a 20 20 69 66 28 20 72 62 75 49  Wal;..  if( rbuI
16110 73 56 61 63 75 75 6d 28 70 29 20 29 7b 0a 20 20  sVacuum(p) ){.  
16120 20 20 7a 4d 6f 76 65 20 3d 20 73 71 6c 69 74 65    zMove = sqlite
16130 33 5f 64 62 5f 66 69 6c 65 6e 61 6d 65 28 70 2d  3_db_filename(p-
16140 3e 64 62 52 62 75 2c 20 22 6d 61 69 6e 22 29 3b  >dbRbu, "main");
16150 0a 20 20 7d 0a 20 20 7a 4f 61 6c 20 3d 20 73 71  .  }.  zOal = sq
16160 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
16170 73 2d 6f 61 6c 22 2c 20 7a 4d 6f 76 65 29 3b 0a  s-oal", zMove);.
16180 20 20 7a 57 61 6c 20 3d 20 73 71 6c 69 74 65 33    zWal = sqlite3
16190 5f 6d 70 72 69 6e 74 66 28 22 25 73 2d 77 61 6c  _mprintf("%s-wal
161a0 22 2c 20 7a 4d 6f 76 65 29 3b 0a 0a 20 20 61 73  ", zMove);..  as
161b0 73 65 72 74 28 20 70 2d 3e 65 53 74 61 67 65 3d  sert( p->eStage=
161c0 3d 52 42 55 5f 53 54 41 47 45 5f 4d 4f 56 45 20  =RBU_STAGE_MOVE 
161d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
161e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
161f0 20 70 2d 3e 7a 45 72 72 6d 73 67 3d 3d 30 20 29   p->zErrmsg==0 )
16200 3b 0a 20 20 69 66 28 20 7a 57 61 6c 3d 3d 30 20  ;.  if( zWal==0 
16210 7c 7c 20 7a 4f 61 6c 3d 3d 30 20 29 7b 0a 20 20  || zOal==0 ){.  
16220 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
16230 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b  _NOMEM;.  }else{
16240 0a 20 20 20 20 2f 2a 20 4d 6f 76 65 20 74 68 65  .    /* Move the
16250 20 2a 2d 6f 61 6c 20 66 69 6c 65 20 74 6f 20 2a   *-oal file to *
16260 2d 77 61 6c 2e 20 41 74 20 74 68 69 73 20 70 6f  -wal. At this po
16270 69 6e 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70  int connection p
16280 2d 3e 64 62 20 69 73 0a 20 20 20 20 2a 2a 20 68  ->db is.    ** h
16290 6f 6c 64 69 6e 67 20 61 20 53 48 41 52 45 44 20  olding a SHARED 
162a0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 72 67  lock on the targ
162b0 65 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  et database file
162c0 20 28 62 65 63 61 75 73 65 20 69 74 20 69 73 0a   (because it is.
162d0 20 20 20 20 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f      ** in WAL mo
162e0 64 65 29 2e 20 53 6f 20 6e 6f 20 6f 74 68 65 72  de). So no other
162f0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61 79 20   connection may 
16300 62 65 20 77 72 69 74 69 6e 67 20 74 68 65 20 64  be writing the d
16310 62 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  b. .    **.    *
16320 2a 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 65 6e  * In order to en
16330 73 75 72 65 20 74 68 61 74 20 74 68 65 72 65 20  sure that there 
16340 61 72 65 20 6e 6f 20 64 61 74 61 62 61 73 65 20  are no database 
16350 72 65 61 64 65 72 73 2c 20 61 6e 20 45 58 43 4c  readers, an EXCL
16360 55 53 49 56 45 0a 20 20 20 20 2a 2a 20 6c 6f 63  USIVE.    ** loc
16370 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 68 65  k is obtained he
16380 72 65 20 62 65 66 6f 72 65 20 74 68 65 20 2a 2d  re before the *-
16390 6f 61 6c 20 69 73 20 6d 6f 76 65 64 20 74 6f 20  oal is moved to 
163a0 2a 2d 77 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20  *-wal..    */.  
163b0 20 20 72 62 75 4c 6f 63 6b 44 61 74 61 62 61 73    rbuLockDatabas
163c0 65 28 70 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  e(p);.    if( p-
163d0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
163e0 7b 0a 20 20 20 20 20 20 72 62 75 46 69 6c 65 53  {.      rbuFileS
163f0 75 66 66 69 78 33 28 7a 42 61 73 65 2c 20 7a 57  uffix3(zBase, zW
16400 61 6c 29 3b 0a 20 20 20 20 20 20 72 62 75 46 69  al);.      rbuFi
16410 6c 65 53 75 66 66 69 78 33 28 7a 42 61 73 65 2c  leSuffix3(zBase,
16420 20 7a 4f 61 6c 29 3b 0a 0a 20 20 20 20 20 20 2f   zOal);..      /
16430 2a 20 52 65 2d 6f 70 65 6e 20 74 68 65 20 64 61  * Re-open the da
16440 74 61 62 61 73 65 73 2e 20 2a 2f 0a 20 20 20 20  tabases. */.    
16450 20 20 72 62 75 4f 62 6a 49 74 65 72 46 69 6e 61    rbuObjIterFina
16460 6c 69 7a 65 28 26 70 2d 3e 6f 62 6a 69 74 65 72  lize(&p->objiter
16470 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
16480 5f 63 6c 6f 73 65 28 70 2d 3e 64 62 52 62 75 29  _close(p->dbRbu)
16490 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
164a0 63 6c 6f 73 65 28 70 2d 3e 64 62 4d 61 69 6e 29  close(p->dbMain)
164b0 3b 0a 20 20 20 20 20 20 70 2d 3e 64 62 4d 61 69  ;.      p->dbMai
164c0 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e  n = 0;.      p->
164d0 64 62 52 62 75 20 3d 20 30 3b 0a 0a 23 69 66 20  dbRbu = 0;..#if 
164e0 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 5f 57  defined(_WIN32_W
164f0 43 45 29 0a 20 20 20 20 20 20 7b 0a 20 20 20 20  CE).      {.    
16500 20 20 20 20 4c 50 57 53 54 52 20 7a 57 69 64 65      LPWSTR zWide
16510 4f 61 6c 3b 0a 20 20 20 20 20 20 20 20 4c 50 57  Oal;.        LPW
16520 53 54 52 20 7a 57 69 64 65 57 61 6c 3b 0a 0a 20  STR zWideWal;.. 
16530 20 20 20 20 20 20 20 7a 57 69 64 65 4f 61 6c 20         zWideOal 
16540 3d 20 72 62 75 57 69 6e 55 74 66 38 54 6f 55 6e  = rbuWinUtf8ToUn
16550 69 63 6f 64 65 28 7a 4f 61 6c 29 3b 0a 20 20 20  icode(zOal);.   
16560 20 20 20 20 20 69 66 28 20 7a 57 69 64 65 4f 61       if( zWideOa
16570 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  l ){.          z
16580 57 69 64 65 57 61 6c 20 3d 20 72 62 75 57 69 6e  WideWal = rbuWin
16590 55 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a 57  Utf8ToUnicode(zW
165a0 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  al);.          i
165b0 66 28 20 7a 57 69 64 65 57 61 6c 20 29 7b 0a 20  f( zWideWal ){. 
165c0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 4d             if( M
165d0 6f 76 65 46 69 6c 65 57 28 7a 57 69 64 65 4f 61  oveFileW(zWideOa
165e0 6c 2c 20 7a 57 69 64 65 57 61 6c 29 20 29 7b 0a  l, zWideWal) ){.
165f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
16600 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  >rc = SQLITE_OK;
16610 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
16620 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
16630 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
16640 5f 49 4f 45 52 52 3b 0a 20 20 20 20 20 20 20 20  _IOERR;.        
16650 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
16660 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
16670 57 69 64 65 57 61 6c 29 3b 0a 20 20 20 20 20 20  WideWal);.      
16680 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16690 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53         p->rc = S
166a0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
166b0 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  M;.          }. 
166c0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
166d0 5f 66 72 65 65 28 7a 57 69 64 65 4f 61 6c 29 3b  _free(zWideOal);
166e0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
166f0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20            p->rc 
16700 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  = SQLITE_IOERR_N
16710 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 7d 0a  OMEM;.        }.
16720 20 20 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20        }.#else.  
16730 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 65 6e 61      p->rc = rena
16740 6d 65 28 7a 4f 61 6c 2c 20 7a 57 61 6c 29 20 3f  me(zOal, zWal) ?
16750 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 3a 20   SQLITE_IOERR : 
16760 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69  SQLITE_OK;.#endi
16770 66 0a 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  f..      if( p->
16780 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
16790 0a 20 20 20 20 20 20 20 20 72 62 75 4f 70 65 6e  .        rbuOpen
167a0 44 61 74 61 62 61 73 65 28 70 29 3b 0a 20 20 20  Database(p);.   
167b0 20 20 20 20 20 72 62 75 53 65 74 75 70 43 68 65       rbuSetupChe
167c0 63 6b 70 6f 69 6e 74 28 70 2c 20 30 29 3b 0a 20  ckpoint(p, 0);. 
167d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
167e0 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ..  sqlite3_free
167f0 28 7a 57 61 6c 29 3b 0a 20 20 73 71 6c 69 74 65  (zWal);.  sqlite
16800 33 5f 66 72 65 65 28 7a 4f 61 6c 29 3b 0a 7d 0a  3_free(zOal);.}.
16810 0a 2f 2a 0a 2a 2a 20 54 68 65 20 53 45 4c 45 43  ./*.** The SELEC
16820 54 20 73 74 61 74 65 6d 65 6e 74 20 69 74 65 72  T statement iter
16830 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20 74 68  ating through th
16840 65 20 6b 65 79 73 20 66 6f 72 20 74 68 65 20 63  e keys for the c
16850 75 72 72 65 6e 74 20 6f 62 6a 65 63 74 0a 2a 2a  urrent object.**
16860 20 28 70 2d 3e 6f 62 6a 69 74 65 72 2e 70 53 65   (p->objiter.pSe
16870 6c 65 63 74 29 20 63 75 72 72 65 6e 74 6c 79 20  lect) currently 
16880 70 6f 69 6e 74 73 20 74 6f 20 61 20 76 61 6c 69  points to a vali
16890 64 20 72 6f 77 2e 20 54 68 69 73 20 66 75 6e 63  d row. This func
168a0 74 69 6f 6e 0a 2a 2a 20 64 65 74 65 72 6d 69 6e  tion.** determin
168b0 65 73 20 74 68 65 20 74 79 70 65 20 6f 66 20 6f  es the type of o
168c0 70 65 72 61 74 69 6f 6e 20 72 65 71 75 65 73 74  peration request
168d0 65 64 20 62 79 20 74 68 69 73 20 72 6f 77 20 61  ed by this row a
168e0 6e 64 20 72 65 74 75 72 6e 73 0a 2a 2a 20 6f 6e  nd returns.** on
168f0 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
16900 6e 67 20 76 61 6c 75 65 73 20 74 6f 20 69 6e 64  ng values to ind
16910 69 63 61 74 65 20 74 68 65 20 72 65 73 75 6c 74  icate the result
16920 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 52 42  :.**.**     * RB
16930 55 5f 49 4e 53 45 52 54 0a 2a 2a 20 20 20 20 20  U_INSERT.**     
16940 2a 20 52 42 55 5f 44 45 4c 45 54 45 0a 2a 2a 20  * RBU_DELETE.** 
16950 20 20 20 20 2a 20 52 42 55 5f 49 44 58 5f 44 45      * RBU_IDX_DE
16960 4c 45 54 45 0a 2a 2a 20 20 20 20 20 2a 20 52 42  LETE.**     * RB
16970 55 5f 55 50 44 41 54 45 0a 2a 2a 0a 2a 2a 20 49  U_UPDATE.**.** I
16980 66 20 52 42 55 5f 55 50 44 41 54 45 20 69 73 20  f RBU_UPDATE is 
16990 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 6f  returned, then o
169a0 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 20 2a  utput variable *
169b0 70 7a 4d 61 73 6b 20 69 73 20 73 65 74 20 74 6f  pzMask is set to
169c0 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  .** point to the
169d0 20 74 65 78 74 20 76 61 6c 75 65 20 69 6e 64 69   text value indi
169e0 63 61 74 69 6e 67 20 74 68 65 20 63 6f 6c 75 6d  cating the colum
169f0 6e 73 20 74 6f 20 75 70 64 61 74 65 2e 0a 2a 2a  ns to update..**
16a00 0a 2a 2a 20 49 66 20 74 68 65 20 72 62 75 5f 63  .** If the rbu_c
16a10 6f 6e 74 72 6f 6c 20 66 69 65 6c 64 20 63 6f 6e  ontrol field con
16a20 74 61 69 6e 73 20 61 6e 20 69 6e 76 61 6c 69 64  tains an invalid
16a30 20 76 61 6c 75 65 2c 20 61 6e 20 65 72 72 6f 72   value, an error
16a40 20 63 6f 64 65 20 61 6e 64 0a 2a 2a 20 6d 65 73   code and.** mes
16a50 73 61 67 65 20 61 72 65 20 6c 65 66 74 20 69 6e  sage are left in
16a60 20 74 68 65 20 52 42 55 20 68 61 6e 64 6c 65 20   the RBU handle 
16a70 61 6e 64 20 7a 65 72 6f 20 72 65 74 75 72 6e 65  and zero returne
16a80 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
16a90 20 72 62 75 53 74 65 70 54 79 70 65 28 73 71 6c   rbuStepType(sql
16aa0 69 74 65 33 72 62 75 20 2a 70 2c 20 63 6f 6e 73  ite3rbu *p, cons
16ab0 74 20 63 68 61 72 20 2a 2a 70 7a 4d 61 73 6b 29  t char **pzMask)
16ac0 7b 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70  {.  int iCol = p
16ad0 2d 3e 6f 62 6a 69 74 65 72 2e 6e 43 6f 6c 3b 20  ->objiter.nCol; 
16ae0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
16af0 72 62 75 5f 63 6f 6e 74 72 6f 6c 20 63 6f 6c 75  rbu_control colu
16b00 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 20  mn */.  int res 
16b10 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
16b20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
16b30 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 73 77  n value */..  sw
16b40 69 74 63 68 28 20 73 71 6c 69 74 65 33 5f 63 6f  itch( sqlite3_co
16b50 6c 75 6d 6e 5f 74 79 70 65 28 70 2d 3e 6f 62 6a  lumn_type(p->obj
16b60 69 74 65 72 2e 70 53 65 6c 65 63 74 2c 20 69 43  iter.pSelect, iC
16b70 6f 6c 29 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ol) ){.    case 
16b80 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a 20  SQLITE_INTEGER: 
16b90 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 56 61 6c  {.      int iVal
16ba0 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
16bb0 6e 5f 69 6e 74 28 70 2d 3e 6f 62 6a 69 74 65 72  n_int(p->objiter
16bc0 2e 70 53 65 6c 65 63 74 2c 20 69 43 6f 6c 29 3b  .pSelect, iCol);
16bd0 0a 20 20 20 20 20 20 73 77 69 74 63 68 28 20 69  .      switch( i
16be0 56 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 63  Val ){.        c
16bf0 61 73 65 20 30 3a 20 72 65 73 20 3d 20 52 42 55  ase 0: res = RBU
16c00 5f 49 4e 53 45 52 54 3b 20 20 20 20 20 62 72 65  _INSERT;     bre
16c10 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65  ak;.        case
16c20 20 31 3a 20 72 65 73 20 3d 20 52 42 55 5f 44 45   1: res = RBU_DE
16c30 4c 45 54 45 3b 20 20 20 20 20 62 72 65 61 6b 3b  LETE;     break;
16c40 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 32 3a  .        case 2:
16c50 20 72 65 73 20 3d 20 52 42 55 5f 52 45 50 4c 41   res = RBU_REPLA
16c60 43 45 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  CE;    break;.  
16c70 20 20 20 20 20 20 63 61 73 65 20 33 3a 20 72 65        case 3: re
16c80 73 20 3d 20 52 42 55 5f 49 44 58 5f 44 45 4c 45  s = RBU_IDX_DELE
16c90 54 45 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  TE; break;.     
16ca0 20 20 20 63 61 73 65 20 34 3a 20 72 65 73 20 3d     case 4: res =
16cb0 20 52 42 55 5f 49 44 58 5f 49 4e 53 45 52 54 3b   RBU_IDX_INSERT;
16cc0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
16cd0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
16ce0 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c   }..    case SQL
16cf0 49 54 45 5f 54 45 58 54 3a 20 7b 0a 20 20 20 20  ITE_TEXT: {.    
16d00 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
16d10 20 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74   char *z = sqlit
16d20 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
16d30 2d 3e 6f 62 6a 69 74 65 72 2e 70 53 65 6c 65 63  ->objiter.pSelec
16d40 74 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20  t, iCol);.      
16d50 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20  if( z==0 ){.    
16d60 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
16d70 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
16d80 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2a  }else{.        *
16d90 70 7a 4d 61 73 6b 20 3d 20 28 63 6f 6e 73 74 20  pzMask = (const 
16da0 63 68 61 72 2a 29 7a 3b 0a 20 20 20 20 20 20 7d  char*)z;.      }
16db0 0a 20 20 20 20 20 20 72 65 73 20 3d 20 52 42 55  .      res = RBU
16dc0 5f 55 50 44 41 54 45 3b 0a 0a 20 20 20 20 20 20  _UPDATE;..      
16dd0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
16de0 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
16df0 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 69   break;.  }..  i
16e00 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20  f( res==0 ){.   
16e10 20 72 62 75 42 61 64 43 6f 6e 74 72 6f 6c 45 72   rbuBadControlEr
16e20 72 6f 72 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65  ror(p);.  }.  re
16e30 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 23 69 66  turn res;.}..#if
16e40 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
16e50 0a 2f 2a 0a 2a 2a 20 41 73 73 65 72 74 20 74 68  ./*.** Assert th
16e60 61 74 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 20 6f  at column iCol o
16e70 66 20 73 74 61 74 65 6d 65 6e 74 20 70 53 74 6d  f statement pStm
16e80 74 20 69 73 20 6e 61 6d 65 64 20 7a 4e 61 6d 65  t is named zName
16e90 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
16ea0 20 61 73 73 65 72 74 43 6f 6c 75 6d 6e 4e 61 6d   assertColumnNam
16eb0 65 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a  e(sqlite3_stmt *
16ec0 70 53 74 6d 74 2c 20 69 6e 74 20 69 43 6f 6c 2c  pStmt, int iCol,
16ed0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
16ee0 6d 65 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  me){.  const cha
16ef0 72 20 2a 7a 43 6f 6c 20 3d 20 73 71 6c 69 74 65  r *zCol = sqlite
16f00 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53  3_column_name(pS
16f10 74 6d 74 2c 20 69 43 6f 6c 29 3b 0a 20 20 61 73  tmt, iCol);.  as
16f20 73 65 72 74 28 20 30 3d 3d 73 71 6c 69 74 65 33  sert( 0==sqlite3
16f30 5f 73 74 72 69 63 6d 70 28 7a 4e 61 6d 65 2c 20  _stricmp(zName, 
16f40 7a 43 6f 6c 29 20 29 3b 0a 7d 0a 23 65 6c 73 65  zCol) );.}.#else
16f50 0a 23 20 64 65 66 69 6e 65 20 61 73 73 65 72 74  .# define assert
16f60 43 6f 6c 75 6d 6e 4e 61 6d 65 28 78 2c 79 2c 7a  ColumnName(x,y,z
16f70 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
16f80 41 72 67 75 6d 65 6e 74 20 65 54 79 70 65 20 6d  Argument eType m
16f90 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20 52 42  ust be one of RB
16fa0 55 5f 49 4e 53 45 52 54 2c 20 52 42 55 5f 44 45  U_INSERT, RBU_DE
16fb0 4c 45 54 45 2c 20 52 42 55 5f 49 44 58 5f 49 4e  LETE, RBU_IDX_IN
16fc0 53 45 52 54 20 6f 72 0a 2a 2a 20 52 42 55 5f 49  SERT or.** RBU_I
16fd0 44 58 5f 44 45 4c 45 54 45 2e 20 54 68 69 73 20  DX_DELETE. This 
16fe0 66 75 6e 63 74 69 6f 6e 20 70 65 72 66 6f 72 6d  function perform
16ff0 73 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 61 20  s the work of a 
17000 73 69 6e 67 6c 65 0a 2a 2a 20 73 71 6c 69 74 65  single.** sqlite
17010 33 72 62 75 5f 73 74 65 70 28 29 20 63 61 6c 6c  3rbu_step() call
17020 20 66 6f 72 20 74 68 65 20 74 79 70 65 20 6f 66   for the type of
17030 20 6f 70 65 72 61 74 69 6f 6e 20 73 70 65 63 69   operation speci
17040 66 69 65 64 20 62 79 20 65 54 79 70 65 2e 0a 2a  fied by eType..*
17050 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62  /.static void rb
17060 75 53 74 65 70 4f 6e 65 4f 70 28 73 71 6c 69 74  uStepOneOp(sqlit
17070 65 33 72 62 75 20 2a 70 2c 20 69 6e 74 20 65 54  e3rbu *p, int eT
17080 79 70 65 29 7b 0a 20 20 52 62 75 4f 62 6a 49 74  ype){.  RbuObjIt
17090 65 72 20 2a 70 49 74 65 72 20 3d 20 26 70 2d 3e  er *pIter = &p->
170a0 6f 62 6a 69 74 65 72 3b 0a 20 20 73 71 6c 69 74  objiter;.  sqlit
170b0 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a  e3_value *pVal;.
170c0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
170d0 70 57 72 69 74 65 72 3b 0a 20 20 69 6e 74 20 69  pWriter;.  int i
170e0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ;..  assert( p->
170f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
17100 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65  .  assert( eType
17110 21 3d 52 42 55 5f 44 45 4c 45 54 45 20 7c 7c 20  !=RBU_DELETE || 
17120 70 49 74 65 72 2d 3e 7a 49 64 78 3d 3d 30 20 29  pIter->zIdx==0 )
17130 3b 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70  ;.  assert( eTyp
17140 65 3d 3d 52 42 55 5f 44 45 4c 45 54 45 20 7c 7c  e==RBU_DELETE ||
17150 20 65 54 79 70 65 3d 3d 52 42 55 5f 49 44 58 5f   eType==RBU_IDX_
17160 44 45 4c 45 54 45 0a 20 20 20 20 20 20 20 7c 7c  DELETE.       ||
17170 20 65 54 79 70 65 3d 3d 52 42 55 5f 49 4e 53 45   eType==RBU_INSE
17180 52 54 20 7c 7c 20 65 54 79 70 65 3d 3d 52 42 55  RT || eType==RBU
17190 5f 49 44 58 5f 49 4e 53 45 52 54 0a 20 20 29 3b  _IDX_INSERT.  );
171a0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
171b0 73 20 61 20 64 65 6c 65 74 65 2c 20 64 65 63 72  s a delete, decr
171c0 65 6d 65 6e 74 20 6e 50 68 61 73 65 4f 6e 65 53  ement nPhaseOneS
171d0 74 65 70 20 62 79 20 6e 49 6e 64 65 78 2e 20 49  tep by nIndex. I
171e0 66 20 74 68 65 20 44 45 4c 45 54 45 0a 20 20 2a  f the DELETE.  *
171f0 2a 20 73 74 61 74 65 6d 65 6e 74 20 62 65 6c 6f  * statement belo
17200 77 20 64 6f 65 73 20 61 63 74 75 61 6c 6c 79 20  w does actually 
17210 64 65 6c 65 74 65 20 61 20 72 6f 77 2c 20 6e 50  delete a row, nP
17220 68 61 73 65 4f 6e 65 53 74 65 70 20 77 69 6c 6c  haseOneStep will
17230 20 62 65 0a 20 20 2a 2a 20 69 6e 63 72 65 6d 65   be.  ** increme
17240 6e 74 65 64 20 62 79 20 74 68 65 20 73 61 6d 65  nted by the same
17250 20 61 6d 6f 75 6e 74 20 77 68 65 6e 20 53 51 4c   amount when SQL
17260 20 66 75 6e 63 74 69 6f 6e 20 72 62 75 5f 74 6d   function rbu_tm
17270 70 5f 69 6e 73 65 72 74 28 29 0a 20 20 2a 2a 20  p_insert().  ** 
17280 69 73 20 69 6e 76 6f 6b 65 64 20 62 79 20 74 68  is invoked by th
17290 65 20 74 72 69 67 67 65 72 2e 20 20 2a 2f 0a 20  e trigger.  */. 
172a0 20 69 66 28 20 65 54 79 70 65 3d 3d 52 42 55 5f   if( eType==RBU_
172b0 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 70 2d  DELETE ){.    p-
172c0 3e 6e 50 68 61 73 65 4f 6e 65 53 74 65 70 20 2d  >nPhaseOneStep -
172d0 3d 20 70 2d 3e 6f 62 6a 69 74 65 72 2e 6e 49 6e  = p->objiter.nIn
172e0 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  dex;.  }..  if( 
172f0 65 54 79 70 65 3d 3d 52 42 55 5f 49 44 58 5f 44  eType==RBU_IDX_D
17300 45 4c 45 54 45 20 7c 7c 20 65 54 79 70 65 3d 3d  ELETE || eType==
17310 52 42 55 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20  RBU_DELETE ){.  
17320 20 20 70 57 72 69 74 65 72 20 3d 20 70 49 74 65    pWriter = pIte
17330 72 2d 3e 70 44 65 6c 65 74 65 3b 0a 20 20 7d 65  r->pDelete;.  }e
17340 6c 73 65 7b 0a 20 20 20 20 70 57 72 69 74 65 72  lse{.    pWriter
17350 20 3d 20 70 49 74 65 72 2d 3e 70 49 6e 73 65 72   = pIter->pInser
17360 74 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 3d  t;.  }..  for(i=
17370 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 43 6f 6c  0; i<pIter->nCol
17380 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 49  ; i++){.    /* I
17390 66 20 74 68 69 73 20 69 73 20 61 6e 20 49 4e 53  f this is an INS
173a0 45 52 54 20 69 6e 74 6f 20 61 20 74 61 62 6c 65  ERT into a table
173b0 20 62 2d 74 72 65 65 20 61 6e 64 20 74 68 65 20   b-tree and the 
173c0 74 61 62 6c 65 20 68 61 73 20 61 6e 0a 20 20 20  table has an.   
173d0 20 2a 2a 20 65 78 70 6c 69 63 69 74 20 49 4e 54   ** explicit INT
173e0 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
173f0 2c 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 69  , check that thi
17400 73 20 69 73 20 6e 6f 74 20 61 6e 20 61 74 74 65  s is not an atte
17410 6d 70 74 0a 20 20 20 20 2a 2a 20 74 6f 20 77 72  mpt.    ** to wr
17420 69 74 65 20 61 20 4e 55 4c 4c 20 69 6e 74 6f 20  ite a NULL into 
17430 74 68 65 20 49 50 4b 20 63 6f 6c 75 6d 6e 2e 20  the IPK column. 
17440 54 68 61 74 20 69 73 20 6e 6f 74 20 70 65 72 6d  That is not perm
17450 69 74 74 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69  itted.  */.    i
17460 66 28 20 65 54 79 70 65 3d 3d 52 42 55 5f 49 4e  f( eType==RBU_IN
17470 53 45 52 54 20 0a 20 20 20 20 20 26 26 20 70 49  SERT .     && pI
17480 74 65 72 2d 3e 7a 49 64 78 3d 3d 30 20 26 26 20  ter->zIdx==0 && 
17490 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42  pIter->eType==RB
174a0 55 5f 50 4b 5f 49 50 4b 20 26 26 20 70 49 74 65  U_PK_IPK && pIte
174b0 72 2d 3e 61 62 54 62 6c 50 6b 5b 69 5d 20 0a 20  r->abTblPk[i] . 
174c0 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 5f 63      && sqlite3_c
174d0 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 49 74 65 72  olumn_type(pIter
174e0 2d 3e 70 53 65 6c 65 63 74 2c 20 69 29 3d 3d 53  ->pSelect, i)==S
174f0 51 4c 49 54 45 5f 4e 55 4c 4c 0a 20 20 20 20 29  QLITE_NULL.    )
17500 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20  {.      p->rc = 
17510 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48 3b  SQLITE_MISMATCH;
17520 0a 20 20 20 20 20 20 70 2d 3e 7a 45 72 72 6d 73  .      p->zErrms
17530 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  g = sqlite3_mpri
17540 6e 74 66 28 22 64 61 74 61 74 79 70 65 20 6d 69  ntf("datatype mi
17550 73 6d 61 74 63 68 22 29 3b 0a 20 20 20 20 20 20  smatch");.      
17560 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20  return;.    }.. 
17570 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 52 42     if( eType==RB
17580 55 5f 44 45 4c 45 54 45 20 26 26 20 70 49 74 65  U_DELETE && pIte
17590 72 2d 3e 61 62 54 62 6c 50 6b 5b 69 5d 3d 3d 30  r->abTblPk[i]==0
175a0 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e   ){.      contin
175b0 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  ue;.    }..    p
175c0 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  Val = sqlite3_co
175d0 6c 75 6d 6e 5f 76 61 6c 75 65 28 70 49 74 65 72  lumn_value(pIter
175e0 2d 3e 70 53 65 6c 65 63 74 2c 20 69 29 3b 0a 20  ->pSelect, i);. 
175f0 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74     p->rc = sqlit
17600 65 33 5f 62 69 6e 64 5f 76 61 6c 75 65 28 70 57  e3_bind_value(pW
17610 72 69 74 65 72 2c 20 69 2b 31 2c 20 70 56 61 6c  riter, i+1, pVal
17620 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  );.    if( p->rc
17630 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20   ) return;.  }. 
17640 20 69 66 28 20 70 49 74 65 72 2d 3e 7a 49 64 78   if( pIter->zIdx
17650 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ==0 ){.    if( p
17660 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55  Iter->eType==RBU
17670 5f 50 4b 5f 56 54 41 42 20 0a 20 20 20 20 20 7c  _PK_VTAB .     |
17680 7c 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d  | pIter->eType==
17690 52 42 55 5f 50 4b 5f 4e 4f 4e 45 20 0a 20 20 20  RBU_PK_NONE .   
176a0 20 20 7c 7c 20 28 70 49 74 65 72 2d 3e 65 54 79    || (pIter->eTy
176b0 70 65 3d 3d 52 42 55 5f 50 4b 5f 45 58 54 45 52  pe==RBU_PK_EXTER
176c0 4e 41 4c 20 26 26 20 72 62 75 49 73 56 61 63 75  NAL && rbuIsVacu
176d0 75 6d 28 70 29 29 20 0a 20 20 20 20 29 7b 0a 20  um(p)) .    ){. 
176e0 20 20 20 20 20 2f 2a 20 46 6f 72 20 61 20 76 69       /* For a vi
176f0 72 74 75 61 6c 20 74 61 62 6c 65 2c 20 6f 72 20  rtual table, or 
17700 61 20 74 61 62 6c 65 20 77 69 74 68 20 6e 6f 20  a table with no 
17710 70 72 69 6d 61 72 79 20 6b 65 79 2c 20 74 68 65  primary key, the
17720 20 0a 20 20 20 20 20 20 2a 2a 20 53 45 4c 45 43   .      ** SELEC
17730 54 20 73 74 61 74 65 6d 65 6e 74 20 69 73 3a 0a  T statement is:.
17740 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
17750 2a 20 20 20 53 45 4c 45 43 54 20 3c 63 6f 6c 73  *   SELECT <cols
17760 3e 2c 20 72 62 75 5f 63 6f 6e 74 72 6f 6c 2c 20  >, rbu_control, 
17770 72 62 75 5f 72 6f 77 69 64 20 46 52 4f 4d 20 2e  rbu_rowid FROM .
17780 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ....      **.   
17790 20 20 20 2a 2a 20 48 65 6e 63 65 20 63 6f 6c 75     ** Hence colu
177a0 6d 6e 5f 76 61 6c 75 65 28 70 49 74 65 72 2d 3e  mn_value(pIter->
177b0 6e 43 6f 6c 2b 31 29 2e 0a 20 20 20 20 20 20 2a  nCol+1)..      *
177c0 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 43 6f  /.      assertCo
177d0 6c 75 6d 6e 4e 61 6d 65 28 70 49 74 65 72 2d 3e  lumnName(pIter->
177e0 70 53 65 6c 65 63 74 2c 20 70 49 74 65 72 2d 3e  pSelect, pIter->
177f0 6e 43 6f 6c 2b 31 2c 20 0a 20 20 20 20 20 20 20  nCol+1, .       
17800 20 20 20 72 62 75 49 73 56 61 63 75 75 6d 28 70     rbuIsVacuum(p
17810 29 20 3f 20 22 72 6f 77 69 64 22 20 3a 20 22 72  ) ? "rowid" : "r
17820 62 75 5f 72 6f 77 69 64 22 0a 20 20 20 20 20 20  bu_rowid".      
17830 29 3b 0a 20 20 20 20 20 20 70 56 61 6c 20 3d 20  );.      pVal = 
17840 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 76  sqlite3_column_v
17850 61 6c 75 65 28 70 49 74 65 72 2d 3e 70 53 65 6c  alue(pIter->pSel
17860 65 63 74 2c 20 70 49 74 65 72 2d 3e 6e 43 6f 6c  ect, pIter->nCol
17870 2b 31 29 3b 0a 20 20 20 20 20 20 70 2d 3e 72 63  +1);.      p->rc
17880 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f   = sqlite3_bind_
17890 76 61 6c 75 65 28 70 57 72 69 74 65 72 2c 20 70  value(pWriter, p
178a0 49 74 65 72 2d 3e 6e 43 6f 6c 2b 31 2c 20 70 56  Iter->nCol+1, pV
178b0 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  al);.    }.  }. 
178c0 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
178d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
178e0 69 74 65 33 5f 73 74 65 70 28 70 57 72 69 74 65  ite3_step(pWrite
178f0 72 29 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20  r);.    p->rc = 
17900 72 65 73 65 74 41 6e 64 43 6f 6c 6c 65 63 74 45  resetAndCollectE
17910 72 72 6f 72 28 70 57 72 69 74 65 72 2c 20 26 70  rror(pWriter, &p
17920 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a 20 20 7d 0a  ->zErrmsg);.  }.
17930 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
17940 6e 63 74 69 6f 6e 20 64 6f 65 73 20 74 68 65 20  nction does the 
17950 77 6f 72 6b 20 66 6f 72 20 61 6e 20 73 71 6c 69  work for an sqli
17960 74 65 33 72 62 75 5f 73 74 65 70 28 29 20 63 61  te3rbu_step() ca
17970 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 62  ll..**.** The ob
17980 6a 65 63 74 2d 69 74 65 72 61 74 6f 72 20 28 70  ject-iterator (p
17990 2d 3e 6f 62 6a 69 74 65 72 29 20 63 75 72 72 65  ->objiter) curre
179a0 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 61  ntly points to a
179b0 20 76 61 6c 69 64 20 6f 62 6a 65 63 74 2c 0a 2a   valid object,.*
179c0 2a 20 61 6e 64 20 74 68 65 20 69 6e 70 75 74 20  * and the input 
179d0 63 75 72 73 6f 72 20 28 70 2d 3e 6f 62 6a 69 74  cursor (p->objit
179e0 65 72 2e 70 53 65 6c 65 63 74 29 20 63 75 72 72  er.pSelect) curr
179f0 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20  ently points to 
17a00 61 20 76 61 6c 69 64 0a 2a 2a 20 69 6e 70 75 74  a valid.** input
17a10 20 72 6f 77 2e 20 50 65 72 66 6f 72 6d 20 77 68   row. Perform wh
17a20 61 74 65 76 65 72 20 70 72 6f 63 65 73 73 69 6e  atever processin
17a30 67 20 69 73 20 72 65 71 75 69 72 65 64 20 61 6e  g is required an
17a40 64 20 72 65 74 75 72 6e 2e 0a 2a 2a 0a 2a 2a 20  d return..**.** 
17a50 49 66 20 6e 6f 20 20 65 72 72 6f 72 20 6f 63 63  If no  error occ
17a60 75 72 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  urs, SQLITE_OK i
17a70 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
17a80 72 77 69 73 65 2c 20 61 6e 20 65 72 72 6f 72 20  rwise, an error 
17a90 63 6f 64 65 0a 2a 2a 20 61 6e 64 20 6d 65 73 73  code.** and mess
17aa0 61 67 65 20 69 73 20 6c 65 66 74 20 69 6e 20 74  age is left in t
17ab0 68 65 20 52 42 55 20 68 61 6e 64 6c 65 20 61 6e  he RBU handle an
17ac0 64 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  d a copy of the 
17ad0 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 72 65  error code.** re
17ae0 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
17af0 63 20 69 6e 74 20 72 62 75 53 74 65 70 28 73 71  c int rbuStep(sq
17b00 6c 69 74 65 33 72 62 75 20 2a 70 29 7b 0a 20 20  lite3rbu *p){.  
17b10 52 62 75 4f 62 6a 49 74 65 72 20 2a 70 49 74 65  RbuObjIter *pIte
17b20 72 20 3d 20 26 70 2d 3e 6f 62 6a 69 74 65 72 3b  r = &p->objiter;
17b30 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
17b40 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Mask = 0;.  int 
17b50 65 54 79 70 65 20 3d 20 72 62 75 53 74 65 70 54  eType = rbuStepT
17b60 79 70 65 28 70 2c 20 26 7a 4d 61 73 6b 29 3b 0a  ype(p, &zMask);.
17b70 0a 20 20 69 66 28 20 65 54 79 70 65 20 29 7b 0a  .  if( eType ){.
17b80 20 20 20 20 61 73 73 65 72 74 28 20 65 54 79 70      assert( eTyp
17b90 65 3d 3d 52 42 55 5f 49 4e 53 45 52 54 20 20 20  e==RBU_INSERT   
17ba0 20 20 7c 7c 20 65 54 79 70 65 3d 3d 52 42 55 5f    || eType==RBU_
17bb0 44 45 4c 45 54 45 0a 20 20 20 20 20 20 20 20 20  DELETE.         
17bc0 7c 7c 20 65 54 79 70 65 3d 3d 52 42 55 5f 52 45  || eType==RBU_RE
17bd0 50 4c 41 43 45 20 20 20 20 7c 7c 20 65 54 79 70  PLACE    || eTyp
17be0 65 3d 3d 52 42 55 5f 49 44 58 5f 44 45 4c 45 54  e==RBU_IDX_DELET
17bf0 45 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 65 54  E.         || eT
17c00 79 70 65 3d 3d 52 42 55 5f 49 44 58 5f 49 4e 53  ype==RBU_IDX_INS
17c10 45 52 54 20 7c 7c 20 65 54 79 70 65 3d 3d 52 42  ERT || eType==RB
17c20 55 5f 55 50 44 41 54 45 0a 20 20 20 20 29 3b 0a  U_UPDATE.    );.
17c30 20 20 20 20 61 73 73 65 72 74 28 20 65 54 79 70      assert( eTyp
17c40 65 21 3d 52 42 55 5f 55 50 44 41 54 45 20 7c 7c  e!=RBU_UPDATE ||
17c50 20 70 49 74 65 72 2d 3e 7a 49 64 78 3d 3d 30 20   pIter->zIdx==0 
17c60 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 49 74 65  );..    if( pIte
17c70 72 2d 3e 7a 49 64 78 3d 3d 30 20 26 26 20 28 65  r->zIdx==0 && (e
17c80 54 79 70 65 3d 3d 52 42 55 5f 49 44 58 5f 44 45  Type==RBU_IDX_DE
17c90 4c 45 54 45 20 7c 7c 20 65 54 79 70 65 3d 3d 52  LETE || eType==R
17ca0 42 55 5f 49 44 58 5f 49 4e 53 45 52 54 29 20 29  BU_IDX_INSERT) )
17cb0 7b 0a 20 20 20 20 20 20 72 62 75 42 61 64 43 6f  {.      rbuBadCo
17cc0 6e 74 72 6f 6c 45 72 72 6f 72 28 70 29 3b 0a 20  ntrolError(p);. 
17cd0 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69 66     }.    else if
17ce0 28 20 65 54 79 70 65 3d 3d 52 42 55 5f 52 45 50  ( eType==RBU_REP
17cf0 4c 41 43 45 20 29 7b 0a 20 20 20 20 20 20 69 66  LACE ){.      if
17d00 28 20 70 49 74 65 72 2d 3e 7a 49 64 78 3d 3d 30  ( pIter->zIdx==0
17d10 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e   ){.        p->n
17d20 50 68 61 73 65 4f 6e 65 53 74 65 70 20 2b 3d 20  PhaseOneStep += 
17d30 70 2d 3e 6f 62 6a 69 74 65 72 2e 6e 49 6e 64 65  p->objiter.nInde
17d40 78 3b 0a 20 20 20 20 20 20 20 20 72 62 75 53 74  x;.        rbuSt
17d50 65 70 4f 6e 65 4f 70 28 70 2c 20 52 42 55 5f 44  epOneOp(p, RBU_D
17d60 45 4c 45 54 45 29 3b 0a 20 20 20 20 20 20 7d 0a  ELETE);.      }.
17d70 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
17d80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 62 75  =SQLITE_OK ) rbu
17d90 53 74 65 70 4f 6e 65 4f 70 28 70 2c 20 52 42 55  StepOneOp(p, RBU
17da0 5f 49 4e 53 45 52 54 29 3b 0a 20 20 20 20 7d 0a  _INSERT);.    }.
17db0 20 20 20 20 65 6c 73 65 20 69 66 28 20 65 54 79      else if( eTy
17dc0 70 65 21 3d 52 42 55 5f 55 50 44 41 54 45 20 29  pe!=RBU_UPDATE )
17dd0 7b 0a 20 20 20 20 20 20 72 62 75 53 74 65 70 4f  {.      rbuStepO
17de0 6e 65 4f 70 28 70 2c 20 65 54 79 70 65 29 3b 0a  neOp(p, eType);.
17df0 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 7b 0a      }.    else{.
17e00 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61        sqlite3_va
17e10 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 20 20 20  lue *pVal;.     
17e20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
17e30 55 70 64 61 74 65 20 3d 20 30 3b 0a 20 20 20 20  Update = 0;.    
17e40 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d    assert( eType=
17e50 3d 52 42 55 5f 55 50 44 41 54 45 20 29 3b 0a 20  =RBU_UPDATE );. 
17e60 20 20 20 20 20 70 2d 3e 6e 50 68 61 73 65 4f 6e       p->nPhaseOn
17e70 65 53 74 65 70 20 2d 3d 20 70 2d 3e 6f 62 6a 69  eStep -= p->obji
17e80 74 65 72 2e 6e 49 6e 64 65 78 3b 0a 20 20 20 20  ter.nIndex;.    
17e90 20 20 72 62 75 47 65 74 55 70 64 61 74 65 53 74    rbuGetUpdateSt
17ea0 6d 74 28 70 2c 20 70 49 74 65 72 2c 20 7a 4d 61  mt(p, pIter, zMa
17eb0 73 6b 2c 20 26 70 55 70 64 61 74 65 29 3b 0a 20  sk, &pUpdate);. 
17ec0 20 20 20 20 20 69 66 28 20 70 55 70 64 61 74 65       if( pUpdate
17ed0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
17ee0 69 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  i;.        for(i
17ef0 3d 30 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  =0; p->rc==SQLIT
17f00 45 5f 4f 4b 20 26 26 20 69 3c 70 49 74 65 72 2d  E_OK && i<pIter-
17f10 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCol; i++){.   
17f20 20 20 20 20 20 20 20 63 68 61 72 20 63 20 3d 20         char c = 
17f30 7a 4d 61 73 6b 5b 70 49 74 65 72 2d 3e 61 69 53  zMask[pIter->aiS
17f40 72 63 4f 72 64 65 72 5b 69 5d 5d 3b 0a 20 20 20  rcOrder[i]];.   
17f50 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20 73 71         pVal = sq
17f60 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c  lite3_column_val
17f70 75 65 28 70 49 74 65 72 2d 3e 70 53 65 6c 65 63  ue(pIter->pSelec
17f80 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20  t, i);.         
17f90 20 69 66 28 20 70 49 74 65 72 2d 3e 61 62 54 62   if( pIter->abTb
17fa0 6c 50 6b 5b 69 5d 20 7c 7c 20 63 21 3d 27 2e 27  lPk[i] || c!='.'
17fb0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
17fc0 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  p->rc = sqlite3_
17fd0 62 69 6e 64 5f 76 61 6c 75 65 28 70 55 70 64 61  bind_value(pUpda
17fe0 74 65 2c 20 69 2b 31 2c 20 70 56 61 6c 29 3b 0a  te, i+1, pVal);.
17ff0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
18000 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
18010 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
18020 4f 4b 20 0a 20 20 20 20 20 20 20 20 20 26 26 20  OK .         && 
18030 28 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52  (pIter->eType==R
18040 42 55 5f 50 4b 5f 56 54 41 42 20 7c 7c 20 70 49  BU_PK_VTAB || pI
18050 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f  ter->eType==RBU_
18060 50 4b 5f 4e 4f 4e 45 29 20 0a 20 20 20 20 20 20  PK_NONE) .      
18070 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f    ){.          /
18080 2a 20 42 69 6e 64 20 74 68 65 20 72 62 75 5f 72  * Bind the rbu_r
18090 6f 77 69 64 20 76 61 6c 75 65 20 74 6f 20 63 6f  owid value to co
180a0 6c 75 6d 6e 20 5f 72 6f 77 69 64 5f 20 2a 2f 0a  lumn _rowid_ */.
180b0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
180c0 43 6f 6c 75 6d 6e 4e 61 6d 65 28 70 49 74 65 72  ColumnName(pIter
180d0 2d 3e 70 53 65 6c 65 63 74 2c 20 70 49 74 65 72  ->pSelect, pIter
180e0 2d 3e 6e 43 6f 6c 2b 31 2c 20 22 72 62 75 5f 72  ->nCol+1, "rbu_r
180f0 6f 77 69 64 22 29 3b 0a 20 20 20 20 20 20 20 20  owid");.        
18100 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33    pVal = sqlite3
18110 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28 70 49  _column_value(pI
18120 74 65 72 2d 3e 70 53 65 6c 65 63 74 2c 20 70 49  ter->pSelect, pI
18130 74 65 72 2d 3e 6e 43 6f 6c 2b 31 29 3b 0a 20 20  ter->nCol+1);.  
18140 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
18150 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 76 61 6c  sqlite3_bind_val
18160 75 65 28 70 55 70 64 61 74 65 2c 20 70 49 74 65  ue(pUpdate, pIte
18170 72 2d 3e 6e 43 6f 6c 2b 31 2c 20 70 56 61 6c 29  r->nCol+1, pVal)
18180 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
18190 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
181a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
181b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
181c0 65 70 28 70 55 70 64 61 74 65 29 3b 0a 20 20 20  ep(pUpdate);.   
181d0 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72         p->rc = r
181e0 65 73 65 74 41 6e 64 43 6f 6c 6c 65 63 74 45 72  esetAndCollectEr
181f0 72 6f 72 28 70 55 70 64 61 74 65 2c 20 26 70 2d  ror(pUpdate, &p-
18200 3e 7a 45 72 72 6d 73 67 29 3b 0a 20 20 20 20 20  >zErrmsg);.     
18210 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
18220 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
18230 70 2d 3e 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  p->rc;.}../*.** 
18240 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 73 63  Increment the sc
18250 68 65 6d 61 20 63 6f 6f 6b 69 65 20 6f 66 20 74  hema cookie of t
18260 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
18270 20 6f 70 65 6e 65 64 20 62 79 20 70 2d 3e 64 62   opened by p->db
18280 4d 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20  Main..**.** Or, 
18290 69 66 20 74 68 69 73 20 69 73 20 61 6e 20 52 42  if this is an RB
182a0 55 20 76 61 63 75 75 6d 2c 20 73 65 74 20 74 68  U vacuum, set th
182b0 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20  e schema cookie 
182c0 6f 66 20 74 68 65 20 6d 61 69 6e 20 64 62 0a 2a  of the main db.*
182d0 2a 20 6f 70 65 6e 65 64 20 62 79 20 70 2d 3e 64  * opened by p->d
182e0 62 4d 61 69 6e 20 74 6f 20 6f 6e 65 20 6d 6f 72  bMain to one mor
182f0 65 20 74 68 61 6e 20 74 68 65 20 73 63 68 65 6d  e than the schem
18300 61 20 63 6f 6f 6b 69 65 20 6f 66 20 74 68 65 20  a cookie of the 
18310 6d 61 69 6e 0a 2a 2a 20 64 62 20 6f 70 65 6e 65  main.** db opene
18320 64 20 62 79 20 70 2d 3e 64 62 52 62 75 2e 0a 2a  d by p->dbRbu..*
18330 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62  /.static void rb
18340 75 49 6e 63 72 53 63 68 65 6d 61 43 6f 6f 6b 69  uIncrSchemaCooki
18350 65 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 29  e(sqlite3rbu *p)
18360 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  {.  if( p->rc==S
18370 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
18380 73 71 6c 69 74 65 33 20 2a 64 62 72 65 61 64 20  sqlite3 *dbread 
18390 3d 20 28 72 62 75 49 73 56 61 63 75 75 6d 28 70  = (rbuIsVacuum(p
183a0 29 20 3f 20 70 2d 3e 64 62 52 62 75 20 3a 20 70  ) ? p->dbRbu : p
183b0 2d 3e 64 62 4d 61 69 6e 29 3b 0a 20 20 20 20 69  ->dbMain);.    i
183c0 6e 74 20 69 43 6f 6f 6b 69 65 20 3d 20 31 30 30  nt iCookie = 100
183d0 30 30 30 30 3b 0a 20 20 20 20 73 71 6c 69 74 65  0000;.    sqlite
183e0 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a  3_stmt *pStmt;..
183f0 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70      p->rc = prep
18400 61 72 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72  areAndCollectErr
18410 6f 72 28 64 62 72 65 61 64 2c 20 26 70 53 74 6d  or(dbread, &pStm
18420 74 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 20  t, &p->zErrmsg, 
18430 0a 20 20 20 20 20 20 20 20 22 50 52 41 47 4d 41  .        "PRAGMA
18440 20 73 63 68 65 6d 61 5f 76 65 72 73 69 6f 6e 22   schema_version"
18450 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
18460 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
18470 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 6f 76   ){.      /* Cov
18480 65 72 61 67 65 3a 20 69 74 20 6d 61 79 20 62 65  erage: it may be
18490 20 74 68 61 74 20 74 68 69 73 20 73 71 6c 69 74   that this sqlit
184a0 65 33 5f 73 74 65 70 28 29 20 63 61 6e 6e 6f 74  e3_step() cannot
184b0 20 66 61 69 6c 2e 20 54 68 65 72 65 0a 20 20 20   fail. There.   
184c0 20 20 20 2a 2a 20 69 73 20 61 6c 72 65 61 64 79     ** is already
184d0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f   a transaction o
184e0 70 65 6e 2c 20 73 6f 20 74 68 65 20 70 72 65 70  pen, so the prep
184f0 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 63  ared statement c
18500 61 6e 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20 74  annot.      ** t
18510 68 72 6f 77 20 61 6e 20 53 51 4c 49 54 45 5f 53  hrow an SQLITE_S
18520 43 48 45 4d 41 20 65 78 63 65 70 74 69 6f 6e 2e  CHEMA exception.
18530 20 54 68 65 20 6f 6e 6c 79 20 64 61 74 61 62 61   The only databa
18540 73 65 20 70 61 67 65 20 74 68 65 0a 20 20 20 20  se page the.    
18550 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 72    ** statement r
18560 65 61 64 73 20 69 73 20 70 61 67 65 20 31 2c 20  eads is page 1, 
18570 77 68 69 63 68 20 69 73 20 67 75 61 72 61 6e 74  which is guarant
18580 65 65 64 20 74 6f 20 62 65 20 69 6e 20 74 68 65  eed to be in the
18590 20 63 61 63 68 65 2e 0a 20 20 20 20 20 20 2a 2a   cache..      **
185a0 20 41 6e 64 20 6e 6f 20 6d 65 6d 6f 72 79 20 61   And no memory a
185b0 6c 6c 6f 63 61 74 69 6f 6e 73 20 61 72 65 20 72  llocations are r
185c0 65 71 75 69 72 65 64 2e 20 20 2a 2f 0a 20 20 20  equired.  */.   
185d0 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f     if( SQLITE_RO
185e0 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28  W==sqlite3_step(
185f0 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20 20  pStmt) ){.      
18600 20 20 69 43 6f 6f 6b 69 65 20 3d 20 73 71 6c 69    iCookie = sqli
18610 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
18620 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  Stmt, 0);.      
18630 7d 0a 20 20 20 20 20 20 72 62 75 46 69 6e 61 6c  }.      rbuFinal
18640 69 7a 65 28 70 2c 20 70 53 74 6d 74 29 3b 0a 20  ize(p, pStmt);. 
18650 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e     }.    if( p->
18660 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
18670 0a 20 20 20 20 20 20 72 62 75 4d 50 72 69 6e 74  .      rbuMPrint
18680 66 45 78 65 63 28 70 2c 20 70 2d 3e 64 62 4d 61  fExec(p, p->dbMa
18690 69 6e 2c 20 22 50 52 41 47 4d 41 20 73 63 68 65  in, "PRAGMA sche
186a0 6d 61 5f 76 65 72 73 69 6f 6e 20 3d 20 25 64 22  ma_version = %d"
186b0 2c 20 69 43 6f 6f 6b 69 65 2b 31 29 3b 0a 20 20  , iCookie+1);.  
186c0 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
186d0 20 55 70 64 61 74 65 20 74 68 65 20 63 6f 6e 74   Update the cont
186e0 65 6e 74 73 20 6f 66 20 74 68 65 20 72 62 75 5f  ents of the rbu_
186f0 73 74 61 74 65 20 74 61 62 6c 65 20 77 69 74 68  state table with
18700 69 6e 20 74 68 65 20 72 62 75 20 64 61 74 61 62  in the rbu datab
18710 61 73 65 2e 20 54 68 65 0a 2a 2a 20 76 61 6c 75  ase. The.** valu
18720 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  e stored in the 
18730 52 42 55 5f 53 54 41 54 45 5f 53 54 41 47 45 20  RBU_STATE_STAGE 
18740 63 6f 6c 75 6d 6e 20 69 73 20 65 53 74 61 67 65  column is eStage
18750 2e 20 41 6c 6c 20 6f 74 68 65 72 20 76 61 6c 75  . All other valu
18760 65 73 0a 2a 2a 20 61 72 65 20 64 65 74 65 72 6d  es.** are determ
18770 69 6e 65 64 20 62 79 20 69 6e 73 70 65 63 74 69  ined by inspecti
18780 6e 67 20 74 68 65 20 72 62 75 20 68 61 6e 64 6c  ng the rbu handl
18790 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
187a0 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a  first argument..
187b0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
187c0 62 75 53 61 76 65 53 74 61 74 65 28 73 71 6c 69  buSaveState(sqli
187d0 74 65 33 72 62 75 20 2a 70 2c 20 69 6e 74 20 65  te3rbu *p, int e
187e0 53 74 61 67 65 29 7b 0a 20 20 69 66 28 20 70 2d  Stage){.  if( p-
187f0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc==SQLITE_OK |
18800 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  | p->rc==SQLITE_
18810 44 4f 4e 45 20 29 7b 0a 20 20 20 20 73 71 6c 69  DONE ){.    sqli
18820 74 65 33 5f 73 74 6d 74 20 2a 70 49 6e 73 65 72  te3_stmt *pInser
18830 74 20 3d 20 30 3b 0a 20 20 20 20 72 62 75 5f 66  t = 0;.    rbu_f
18840 69 6c 65 20 2a 70 46 64 20 3d 20 28 72 62 75 49  ile *pFd = (rbuI
18850 73 56 61 63 75 75 6d 28 70 29 20 3f 20 70 2d 3e  sVacuum(p) ? p->
18860 70 52 62 75 46 64 20 3a 20 70 2d 3e 70 54 61 72  pRbuFd : p->pTar
18870 67 65 74 46 64 29 3b 0a 20 20 20 20 69 6e 74 20  getFd);.    int 
18880 72 63 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  rc;..    assert(
18890 20 70 2d 3e 7a 45 72 72 6d 73 67 3d 3d 30 20 29   p->zErrmsg==0 )
188a0 3b 0a 20 20 20 20 72 63 20 3d 20 70 72 65 70 61  ;.    rc = prepa
188b0 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74  reFreeAndCollect
188c0 45 72 72 6f 72 28 70 2d 3e 64 62 52 62 75 2c 20  Error(p->dbRbu, 
188d0 26 70 49 6e 73 65 72 74 2c 20 26 70 2d 3e 7a 45  &pInsert, &p->zE
188e0 72 72 6d 73 67 2c 20 0a 20 20 20 20 20 20 20 20  rrmsg, .        
188f0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
18900 0a 20 20 20 20 20 20 20 20 20 20 22 49 4e 53 45  .          "INSE
18910 52 54 20 4f 52 20 52 45 50 4c 41 43 45 20 49 4e  RT OR REPLACE IN
18920 54 4f 20 25 73 2e 72 62 75 5f 73 74 61 74 65 28  TO %s.rbu_state(
18930 6b 2c 20 76 29 20 56 41 4c 55 45 53 20 22 0a 20  k, v) VALUES ". 
18940 20 20 20 20 20 20 20 20 20 22 28 25 64 2c 20 25           "(%d, %
18950 64 29 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20  d), ".          
18960 22 28 25 64 2c 20 25 51 29 2c 20 22 0a 20 20 20  "(%d, %Q), ".   
18970 20 20 20 20 20 20 20 22 28 25 64 2c 20 25 51 29         "(%d, %Q)
18980 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 22 28  , ".          "(
18990 25 64 2c 20 25 64 29 2c 20 22 0a 20 20 20 20 20  %d, %d), ".     
189a0 20 20 20 20 20 22 28 25 64 2c 20 25 64 29 2c 20       "(%d, %d), 
189b0 22 0a 20 20 20 20 20 20 20 20 20 20 22 28 25 64  ".          "(%d
189c0 2c 20 25 6c 6c 64 29 2c 20 22 0a 20 20 20 20 20  , %lld), ".     
189d0 20 20 20 20 20 22 28 25 64 2c 20 25 6c 6c 64 29       "(%d, %lld)
189e0 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 22 28  , ".          "(
189f0 25 64 2c 20 25 6c 6c 64 29 2c 20 22 0a 20 20 20  %d, %lld), ".   
18a00 20 20 20 20 20 20 20 22 28 25 64 2c 20 25 6c 6c         "(%d, %ll
18a10 64 29 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d) ",.          
18a20 70 2d 3e 7a 53 74 61 74 65 44 62 2c 0a 20 20 20  p->zStateDb,.   
18a30 20 20 20 20 20 20 20 52 42 55 5f 53 54 41 54 45         RBU_STATE
18a40 5f 53 54 41 47 45 2c 20 65 53 74 61 67 65 2c 0a  _STAGE, eStage,.
18a50 20 20 20 20 20 20 20 20 20 20 52 42 55 5f 53 54            RBU_ST
18a60 41 54 45 5f 54 42 4c 2c 20 70 2d 3e 6f 62 6a 69  ATE_TBL, p->obji
18a70 74 65 72 2e 7a 54 62 6c 2c 20 0a 20 20 20 20 20  ter.zTbl, .     
18a80 20 20 20 20 20 52 42 55 5f 53 54 41 54 45 5f 49       RBU_STATE_I
18a90 44 58 2c 20 70 2d 3e 6f 62 6a 69 74 65 72 2e 7a  DX, p->objiter.z
18aa0 49 64 78 2c 20 0a 20 20 20 20 20 20 20 20 20 20  Idx, .          
18ab0 52 42 55 5f 53 54 41 54 45 5f 52 4f 57 2c 20 70  RBU_STATE_ROW, p
18ac0 2d 3e 6e 53 74 65 70 2c 20 0a 20 20 20 20 20 20  ->nStep, .      
18ad0 20 20 20 20 52 42 55 5f 53 54 41 54 45 5f 50 52      RBU_STATE_PR
18ae0 4f 47 52 45 53 53 2c 20 70 2d 3e 6e 50 72 6f 67  OGRESS, p->nProg
18af0 72 65 73 73 2c 0a 20 20 20 20 20 20 20 20 20 20  ress,.          
18b00 52 42 55 5f 53 54 41 54 45 5f 43 4b 50 54 2c 20  RBU_STATE_CKPT, 
18b10 70 2d 3e 69 57 61 6c 43 6b 73 75 6d 2c 0a 20 20  p->iWalCksum,.  
18b20 20 20 20 20 20 20 20 20 52 42 55 5f 53 54 41 54          RBU_STAT
18b30 45 5f 43 4f 4f 4b 49 45 2c 20 28 69 36 34 29 70  E_COOKIE, (i64)p
18b40 46 64 2d 3e 69 43 6f 6f 6b 69 65 2c 0a 20 20 20  Fd->iCookie,.   
18b50 20 20 20 20 20 20 20 52 42 55 5f 53 54 41 54 45         RBU_STATE
18b60 5f 4f 41 4c 53 5a 2c 20 70 2d 3e 69 4f 61 6c 53  _OALSZ, p->iOalS
18b70 7a 2c 0a 20 20 20 20 20 20 20 20 20 20 52 42 55  z,.          RBU
18b80 5f 53 54 41 54 45 5f 50 48 41 53 45 4f 4e 45 53  _STATE_PHASEONES
18b90 54 45 50 2c 20 70 2d 3e 6e 50 68 61 73 65 4f 6e  TEP, p->nPhaseOn
18ba0 65 53 74 65 70 0a 20 20 20 20 20 20 29 0a 20 20  eStep.      ).  
18bb0 20 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28    );.    assert(
18bc0 20 70 49 6e 73 65 72 74 3d 3d 30 20 7c 7c 20 72   pInsert==0 || r
18bd0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
18be0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
18bf0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
18c00 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 49 6e  sqlite3_step(pIn
18c10 73 65 72 74 29 3b 0a 20 20 20 20 20 20 72 63 20  sert);.      rc 
18c20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69  = sqlite3_finali
18c30 7a 65 28 70 49 6e 73 65 72 74 29 3b 0a 20 20 20  ze(pInsert);.   
18c40 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
18c50 51 4c 49 54 45 5f 4f 4b 20 29 20 70 2d 3e 72 63  QLITE_OK ) p->rc
18c60 20 3d 20 72 63 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f   = rc;.  }.}.../
18c70 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20  *.** The second 
18c80 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20  argument passed 
18c90 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
18ca0 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
18cb0 61 20 50 52 41 47 4d 41 20 0a 2a 2a 20 73 65 74  a PRAGMA .** set
18cc0 74 69 6e 67 20 2d 20 22 70 61 67 65 5f 73 69 7a  ting - "page_siz
18cd0 65 22 2c 20 22 61 75 74 6f 5f 76 61 63 75 75 6d  e", "auto_vacuum
18ce0 22 2c 20 22 75 73 65 72 5f 76 65 72 73 69 6f 6e  ", "user_version
18cf0 22 20 6f 72 20 22 61 70 70 6c 69 63 61 74 69 6f  " or "applicatio
18d00 6e 5f 69 64 22 2e 0a 2a 2a 20 54 68 69 73 20 66  n_id"..** This f
18d10 75 6e 63 74 69 6f 6e 20 65 78 65 63 75 74 65 73  unction executes
18d20 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f   the following o
18d30 6e 20 73 71 6c 69 74 65 33 72 62 75 2e 64 62 52  n sqlite3rbu.dbR
18d40 62 75 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 50 52 41  bu:.**.**   "PRA
18d50 47 4d 41 20 6d 61 69 6e 2e 24 7a 50 72 61 67 6d  GMA main.$zPragm
18d60 61 22 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 24  a".**.** where $
18d70 7a 50 72 61 67 6d 61 20 69 73 20 74 68 65 20 73  zPragma is the s
18d80 74 72 69 6e 67 20 70 61 73 73 65 64 20 61 73 20  tring passed as 
18d90 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
18da0 65 6e 74 2c 20 74 68 65 6e 0a 2a 2a 20 6f 6e 20  ent, then.** on 
18db0 73 71 6c 69 74 65 33 72 62 75 2e 64 62 4d 61 69  sqlite3rbu.dbMai
18dc0 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 50 52 41 47  n:.**.**   "PRAG
18dd0 4d 41 20 6d 61 69 6e 2e 24 7a 50 72 61 67 6d 61  MA main.$zPragma
18de0 20 3d 20 24 76 61 6c 22 0a 2a 2a 0a 2a 2a 20 77   = $val".**.** w
18df0 68 65 72 65 20 24 76 61 6c 20 69 73 20 74 68 65  here $val is the
18e00 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
18e10 62 79 20 74 68 65 20 66 69 72 73 74 20 50 52 41  by the first PRA
18e20 47 4d 41 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 0a  GMA invocation..
18e30 2a 2a 0a 2a 2a 20 49 6e 20 73 68 6f 72 74 2c 20  **.** In short, 
18e40 69 74 20 63 6f 70 69 65 73 20 74 68 65 20 76 61  it copies the va
18e50 6c 75 65 20 20 6f 66 20 74 68 65 20 73 70 65 63  lue  of the spec
18e60 69 66 69 65 64 20 50 52 41 47 4d 41 20 73 65 74  ified PRAGMA set
18e70 74 69 6e 67 20 66 72 6f 6d 0a 2a 2a 20 64 62 52  ting from.** dbR
18e80 62 75 20 74 6f 20 64 62 4d 61 69 6e 2e 0a 2a 2f  bu to dbMain..*/
18e90 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75  .static void rbu
18ea0 43 6f 70 79 50 72 61 67 6d 61 28 73 71 6c 69 74  CopyPragma(sqlit
18eb0 65 33 72 62 75 20 2a 70 2c 20 63 6f 6e 73 74 20  e3rbu *p, const 
18ec0 63 68 61 72 20 2a 7a 50 72 61 67 6d 61 29 7b 0a  char *zPragma){.
18ed0 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
18ee0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
18ef0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 50 72 61  lite3_stmt *pPra
18f00 67 6d 61 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  gma = 0;.    p->
18f10 72 63 20 3d 20 70 72 65 70 61 72 65 46 72 65 65  rc = prepareFree
18f20 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28  AndCollectError(
18f30 70 2d 3e 64 62 52 62 75 2c 20 26 70 50 72 61 67  p->dbRbu, &pPrag
18f40 6d 61 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c  ma, &p->zErrmsg,
18f50 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65   .        sqlite
18f60 33 5f 6d 70 72 69 6e 74 66 28 22 50 52 41 47 4d  3_mprintf("PRAGM
18f70 41 20 6d 61 69 6e 2e 25 73 22 2c 20 7a 50 72 61  A main.%s", zPra
18f80 67 6d 61 29 0a 20 20 20 20 29 3b 0a 20 20 20 20  gma).    );.    
18f90 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
18fa0 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52  E_OK && SQLITE_R
18fb0 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
18fc0 28 70 50 72 61 67 6d 61 29 20 29 7b 0a 20 20 20  (pPragma) ){.   
18fd0 20 20 20 70 2d 3e 72 63 20 3d 20 72 62 75 4d 50     p->rc = rbuMP
18fe0 72 69 6e 74 66 45 78 65 63 28 70 2c 20 70 2d 3e  rintfExec(p, p->
18ff0 64 62 4d 61 69 6e 2c 20 22 50 52 41 47 4d 41 20  dbMain, "PRAGMA 
19000 6d 61 69 6e 2e 25 73 20 3d 20 25 64 22 2c 0a 20  main.%s = %d",. 
19010 20 20 20 20 20 20 20 20 20 7a 50 72 61 67 6d 61           zPragma
19020 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  , sqlite3_column
19030 5f 69 6e 74 28 70 50 72 61 67 6d 61 2c 20 30 29  _int(pPragma, 0)
19040 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
19050 20 20 20 20 72 62 75 46 69 6e 61 6c 69 7a 65 28      rbuFinalize(
19060 70 2c 20 70 50 72 61 67 6d 61 29 3b 0a 20 20 7d  p, pPragma);.  }
19070 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 52 42  .}../*.** The RB
19080 55 20 68 61 6e 64 6c 65 20 70 61 73 73 65 64 20  U handle passed 
19090 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75  as the only argu
190a0 6d 65 6e 74 20 68 61 73 20 6a 75 73 74 20 62 65  ment has just be
190b0 65 6e 20 6f 70 65 6e 65 64 20 61 6e 64 20 0a 2a  en opened and .*
190c0 2a 20 74 68 65 20 73 74 61 74 65 20 64 61 74 61  * the state data
190d0 62 61 73 65 20 69 73 20 65 6d 70 74 79 2e 20 49  base is empty. I
190e0 66 20 74 68 69 73 20 52 42 55 20 68 61 6e 64 6c  f this RBU handl
190f0 65 20 77 61 73 20 6f 70 65 6e 65 64 20 66 6f 72  e was opened for
19100 20 61 6e 0a 2a 2a 20 52 42 55 20 76 61 63 75 75   an.** RBU vacuu
19110 6d 20 6f 70 65 72 61 74 69 6f 6e 2c 20 63 72 65  m operation, cre
19120 61 74 65 20 74 68 65 20 73 63 68 65 6d 61 20 69  ate the schema i
19130 6e 20 74 68 65 20 74 61 72 67 65 74 20 64 62 2e  n the target db.
19140 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
19150 72 62 75 43 72 65 61 74 65 54 61 72 67 65 74 53  rbuCreateTargetS
19160 63 68 65 6d 61 28 73 71 6c 69 74 65 33 72 62 75  chema(sqlite3rbu
19170 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f   *p){.  sqlite3_
19180 73 74 6d 74 20 2a 70 53 71 6c 20 3d 20 30 3b 0a  stmt *pSql = 0;.
19190 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
191a0 70 49 6e 73 65 72 74 20 3d 20 30 3b 0a 0a 20 20  pInsert = 0;..  
191b0 61 73 73 65 72 74 28 20 72 62 75 49 73 56 61 63  assert( rbuIsVac
191c0 75 75 6d 28 70 29 20 29 3b 0a 20 20 70 2d 3e 72  uum(p) );.  p->r
191d0 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  c = sqlite3_exec
191e0 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 50 52 41  (p->dbMain, "PRA
191f0 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68  GMA writable_sch
19200 65 6d 61 3d 31 22 2c 20 30 2c 30 2c 20 26 70 2d  ema=1", 0,0, &p-
19210 3e 7a 45 72 72 6d 73 67 29 3b 0a 20 20 69 66 28  >zErrmsg);.  if(
19220 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
19230 4b 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  K ){.    p->rc =
19240 20 70 72 65 70 61 72 65 41 6e 64 43 6f 6c 6c 65   prepareAndColle
19250 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 52 62 75  ctError(p->dbRbu
19260 2c 20 26 70 53 71 6c 2c 20 26 70 2d 3e 7a 45 72  , &pSql, &p->zEr
19270 72 6d 73 67 2c 20 0a 20 20 20 20 20 20 22 53 45  rmsg, .      "SE
19280 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d 20 73 71  LECT sql FROM sq
19290 6c 69 74 65 5f 6d 61 73 74 65 72 20 57 48 45 52  lite_master WHER
192a0 45 20 73 71 6c 21 3d 27 27 20 41 4e 44 20 72 6f  E sql!='' AND ro
192b0 6f 74 70 61 67 65 21 3d 30 22 0a 20 20 20 20 20  otpage!=0".     
192c0 20 22 20 41 4e 44 20 6e 61 6d 65 21 3d 27 73 71   " AND name!='sq
192d0 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 27 20 22  lite_sequence' "
192e0 0a 20 20 20 20 20 20 22 20 4f 52 44 45 52 20 42  .      " ORDER B
192f0 59 20 74 79 70 65 20 44 45 53 43 22 0a 20 20 20  Y type DESC".   
19300 20 29 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65   );.  }..  while
19310 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
19320 4f 4b 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74  OK && sqlite3_st
19330 65 70 28 70 53 71 6c 29 3d 3d 53 51 4c 49 54 45  ep(pSql)==SQLITE
19340 5f 52 4f 57 20 29 7b 0a 20 20 20 20 63 6f 6e 73  _ROW ){.    cons
19350 74 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 28  t char *zSql = (
19360 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
19370 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
19380 70 53 71 6c 2c 20 30 29 3b 0a 20 20 20 20 70 2d  pSql, 0);.    p-
19390 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78  >rc = sqlite3_ex
193a0 65 63 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 7a 53  ec(p->dbMain, zS
193b0 71 6c 2c 20 30 2c 20 30 2c 20 26 70 2d 3e 7a 45  ql, 0, 0, &p->zE
193c0 72 72 6d 73 67 29 3b 0a 20 20 7d 0a 20 20 72 62  rrmsg);.  }.  rb
193d0 75 46 69 6e 61 6c 69 7a 65 28 70 2c 20 70 53 71  uFinalize(p, pSq
193e0 6c 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 21  l);.  if( p->rc!
193f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
19400 75 72 6e 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72  urn;..  if( p->r
19410 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
19420 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70      p->rc = prep
19430 61 72 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72  areAndCollectErr
19440 6f 72 28 70 2d 3e 64 62 52 62 75 2c 20 26 70 53  or(p->dbRbu, &pS
19450 71 6c 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c  ql, &p->zErrmsg,
19460 20 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45 43   .        "SELEC
19470 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  T * FROM sqlite_
19480 6d 61 73 74 65 72 20 57 48 45 52 45 20 72 6f 6f  master WHERE roo
19490 74 70 61 67 65 3d 30 20 4f 52 20 72 6f 6f 74 70  tpage=0 OR rootp
194a0 61 67 65 20 49 53 20 4e 55 4c 4c 22 20 0a 20 20  age IS NULL" .  
194b0 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20    );.  }..  if( 
194c0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
194d0 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
194e0 70 72 65 70 61 72 65 41 6e 64 43 6f 6c 6c 65 63  prepareAndCollec
194f0 74 45 72 72 6f 72 28 70 2d 3e 64 62 4d 61 69 6e  tError(p->dbMain
19500 2c 20 26 70 49 6e 73 65 72 74 2c 20 26 70 2d 3e  , &pInsert, &p->
19510 7a 45 72 72 6d 73 67 2c 20 0a 20 20 20 20 20 20  zErrmsg, .      
19520 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 73    "INSERT INTO s
19530 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 56 41 4c  qlite_master VAL
19540 55 45 53 28 3f 2c 3f 2c 3f 2c 3f 2c 3f 29 22 0a  UES(?,?,?,?,?)".
19550 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 77 68      );.  }..  wh
19560 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ile( p->rc==SQLI
19570 54 45 5f 4f 4b 20 26 26 20 73 71 6c 69 74 65 33  TE_OK && sqlite3
19580 5f 73 74 65 70 28 70 53 71 6c 29 3d 3d 53 51 4c  _step(pSql)==SQL
19590 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 69  ITE_ROW ){.    i
195a0 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
195b0 30 3b 20 69 3c 35 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<5; i++){.  
195c0 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
195d0 5f 76 61 6c 75 65 28 70 49 6e 73 65 72 74 2c 20  _value(pInsert, 
195e0 69 2b 31 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c  i+1, sqlite3_col
195f0 75 6d 6e 5f 76 61 6c 75 65 28 70 53 71 6c 2c 20  umn_value(pSql, 
19600 69 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  i));.    }.    s
19610 71 6c 69 74 65 33 5f 73 74 65 70 28 70 49 6e 73  qlite3_step(pIns
19620 65 72 74 29 3b 0a 20 20 20 20 70 2d 3e 72 63 20  ert);.    p->rc 
19630 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
19640 70 49 6e 73 65 72 74 29 3b 0a 20 20 7d 0a 20 20  pInsert);.  }.  
19650 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
19660 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d 3e 72  E_OK ){.    p->r
19670 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  c = sqlite3_exec
19680 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 50 52 41  (p->dbMain, "PRA
19690 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68  GMA writable_sch
196a0 65 6d 61 3d 30 22 2c 30 2c 30 2c 26 70 2d 3e 7a  ema=0",0,0,&p->z
196b0 45 72 72 6d 73 67 29 3b 0a 20 20 7d 0a 0a 20 20  Errmsg);.  }..  
196c0 72 62 75 46 69 6e 61 6c 69 7a 65 28 70 2c 20 70  rbuFinalize(p, p
196d0 53 71 6c 29 3b 0a 20 20 72 62 75 46 69 6e 61 6c  Sql);.  rbuFinal
196e0 69 7a 65 28 70 2c 20 70 49 6e 73 65 72 74 29 3b  ize(p, pInsert);
196f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74  .}../*.** Step t
19700 68 65 20 52 42 55 20 6f 62 6a 65 63 74 2e 0a 2a  he RBU object..*
19710 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 72 62 75  /.int sqlite3rbu
19720 5f 73 74 65 70 28 73 71 6c 69 74 65 33 72 62 75  _step(sqlite3rbu
19730 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b   *p){.  if( p ){
19740 0a 20 20 20 20 73 77 69 74 63 68 28 20 70 2d 3e  .    switch( p->
19750 65 53 74 61 67 65 20 29 7b 0a 20 20 20 20 20 20  eStage ){.      
19760 63 61 73 65 20 52 42 55 5f 53 54 41 47 45 5f 4f  case RBU_STAGE_O
19770 41 4c 3a 20 7b 0a 20 20 20 20 20 20 20 20 52 62  AL: {.        Rb
19780 75 4f 62 6a 49 74 65 72 20 2a 70 49 74 65 72 20  uObjIter *pIter 
19790 3d 20 26 70 2d 3e 6f 62 6a 69 74 65 72 3b 0a 0a  = &p->objiter;..
197a0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
197b0 69 73 20 69 73 20 61 6e 20 52 42 55 20 76 61 63  is is an RBU vac
197c0 75 75 6d 20 6f 70 65 72 61 74 69 6f 6e 20 61 6e  uum operation an
197d0 64 20 74 68 65 20 73 74 61 74 65 20 74 61 62 6c  d the state tabl
197e0 65 20 77 61 73 20 65 6d 70 74 79 0a 20 20 20 20  e was empty.    
197f0 20 20 20 20 2a 2a 20 77 68 65 6e 20 74 68 69 73      ** when this
19800 20 68 61 6e 64 6c 65 20 77 61 73 20 6f 70 65 6e   handle was open
19810 65 64 2c 20 63 72 65 61 74 65 20 74 68 65 20 74  ed, create the t
19820 61 72 67 65 74 20 64 61 74 61 62 61 73 65 20 73  arget database s
19830 63 68 65 6d 61 2e 20 2a 2f 0a 20 20 20 20 20 20  chema. */.      
19840 20 20 69 66 28 20 72 62 75 49 73 56 61 63 75 75    if( rbuIsVacuu
19850 6d 28 70 29 20 26 26 20 70 2d 3e 6e 50 72 6f 67  m(p) && p->nProg
19860 72 65 73 73 3d 3d 30 20 26 26 20 70 2d 3e 72 63  ress==0 && p->rc
19870 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
19880 20 20 20 20 20 20 20 20 20 72 62 75 43 72 65 61           rbuCrea
19890 74 65 54 61 72 67 65 74 53 63 68 65 6d 61 28 70  teTargetSchema(p
198a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 62 75  );.          rbu
198b0 43 6f 70 79 50 72 61 67 6d 61 28 70 2c 20 22 75  CopyPragma(p, "u
198c0 73 65 72 5f 76 65 72 73 69 6f 6e 22 29 3b 0a 20  ser_version");. 
198d0 20 20 20 20 20 20 20 20 20 72 62 75 43 6f 70 79           rbuCopy
198e0 50 72 61 67 6d 61 28 70 2c 20 22 61 70 70 6c 69  Pragma(p, "appli
198f0 63 61 74 69 6f 6e 5f 69 64 22 29 3b 0a 20 20 20  cation_id");.   
19900 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
19910 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51  while( p->rc==SQ
19920 4c 49 54 45 5f 4f 4b 20 26 26 20 70 49 74 65 72  LITE_OK && pIter
19930 2d 3e 7a 54 62 6c 20 29 7b 0a 0a 20 20 20 20 20  ->zTbl ){..     
19940 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e       if( pIter->
19950 62 43 6c 65 61 6e 75 70 20 29 7b 0a 20 20 20 20  bCleanup ){.    
19960 20 20 20 20 20 20 20 20 2f 2a 20 43 6c 65 61 6e          /* Clean
19970 20 75 70 20 74 68 65 20 72 62 75 5f 74 6d 70 5f   up the rbu_tmp_
19980 78 78 78 20 74 61 62 6c 65 20 66 6f 72 20 74 68  xxx table for th
19990 65 20 70 72 65 76 69 6f 75 73 20 74 61 62 6c 65  e previous table
199a0 2e 20 49 74 20 0a 20 20 20 20 20 20 20 20 20 20  . It .          
199b0 20 20 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 64    ** cannot be d
199c0 72 6f 70 70 65 64 20 61 73 20 74 68 65 72 65 20  ropped as there 
199d0 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 61 63  are currently ac
199e0 74 69 76 65 20 53 51 4c 20 73 74 61 74 65 6d 65  tive SQL stateme
199f0 6e 74 73 2e 0a 20 20 20 20 20 20 20 20 20 20 20  nts..           
19a00 20 2a 2a 20 42 75 74 20 74 68 65 20 63 6f 6e 74   ** But the cont
19a10 65 6e 74 73 20 63 61 6e 20 62 65 20 64 65 6c 65  ents can be dele
19a20 74 65 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  ted.  */.       
19a30 20 20 20 20 20 69 66 28 20 72 62 75 49 73 56 61       if( rbuIsVa
19a40 63 75 75 6d 28 70 29 3d 3d 30 20 26 26 20 70 49  cuum(p)==0 && pI
19a50 74 65 72 2d 3e 61 62 49 6e 64 65 78 65 64 20 29  ter->abIndexed )
19a60 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
19a70 72 62 75 4d 50 72 69 6e 74 66 45 78 65 63 28 70  rbuMPrintfExec(p
19a80 2c 20 70 2d 3e 64 62 52 62 75 2c 20 0a 20 20 20  , p->dbRbu, .   
19a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
19aa0 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 73 2e 27  DELETE FROM %s.'
19ab0 72 62 75 5f 74 6d 70 5f 25 71 27 22 2c 20 70 2d  rbu_tmp_%q'", p-
19ac0 3e 7a 53 74 61 74 65 44 62 2c 20 70 49 74 65 72  >zStateDb, pIter
19ad0 2d 3e 7a 44 61 74 61 54 62 6c 0a 20 20 20 20 20  ->zDataTbl.     
19ae0 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
19af0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
19b00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
19b10 20 20 20 20 20 20 20 72 62 75 4f 62 6a 49 74 65         rbuObjIte
19b20 72 50 72 65 70 61 72 65 41 6c 6c 28 70 2c 20 70  rPrepareAll(p, p
19b30 49 74 65 72 2c 20 30 29 3b 0a 0a 20 20 20 20 20  Iter, 0);..     
19b40 20 20 20 20 20 20 20 2f 2a 20 41 64 76 61 6e 63         /* Advanc
19b50 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 72 6f  e to the next ro
19b60 77 20 74 6f 20 70 72 6f 63 65 73 73 2e 20 2a 2f  w to process. */
19b70 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
19b80 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
19b90 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
19ba0 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69     int rc = sqli
19bb0 74 65 33 5f 73 74 65 70 28 70 49 74 65 72 2d 3e  te3_step(pIter->
19bc0 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  pSelect);.      
19bd0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
19be0 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
19bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
19c00 3e 6e 50 72 6f 67 72 65 73 73 2b 2b 3b 0a 20 20  >nProgress++;.  
19c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
19c20 3e 6e 53 74 65 70 2b 2b 3b 0a 20 20 20 20 20 20  >nStep++;.      
19c30 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
19c40 20 72 62 75 53 74 65 70 28 70 29 3b 0a 20 20 20   rbuStep(p);.   
19c50 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
19c60 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63             p->rc
19c70 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
19c80 28 70 49 74 65 72 2d 3e 70 53 65 6c 65 63 74 29  (pIter->pSelect)
19c90 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
19ca0 70 2d 3e 6e 53 74 65 70 20 3d 20 30 3b 0a 20 20  p->nStep = 0;.  
19cb0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
19cc0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
19cd0 20 20 20 72 62 75 4f 62 6a 49 74 65 72 4e 65 78     rbuObjIterNex
19ce0 74 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20  t(p, pIter);.   
19cf0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
19d00 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
19d10 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
19d20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
19d30 3e 7a 54 62 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  >zTbl==0 );.    
19d40 20 20 20 20 20 20 72 62 75 53 61 76 65 53 74 61        rbuSaveSta
19d50 74 65 28 70 2c 20 52 42 55 5f 53 54 41 47 45 5f  te(p, RBU_STAGE_
19d60 4d 4f 56 45 29 3b 0a 20 20 20 20 20 20 20 20 20  MOVE);.         
19d70 20 72 62 75 49 6e 63 72 53 63 68 65 6d 61 43 6f   rbuIncrSchemaCo
19d80 6f 6b 69 65 28 70 29 3b 0a 20 20 20 20 20 20 20  okie(p);.       
19d90 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
19da0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
19db0 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73         p->rc = s
19dc0 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
19dd0 62 4d 61 69 6e 2c 20 22 43 4f 4d 4d 49 54 22 2c  bMain, "COMMIT",
19de0 20 30 2c 20 30 2c 20 26 70 2d 3e 7a 45 72 72 6d   0, 0, &p->zErrm
19df0 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  sg);.          }
19e00 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
19e10 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
19e20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
19e30 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65  ->rc = sqlite3_e
19e40 78 65 63 28 70 2d 3e 64 62 52 62 75 2c 20 22 43  xec(p->dbRbu, "C
19e50 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 2c 20 26 70  OMMIT", 0, 0, &p
19e60 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a 20 20 20 20  ->zErrmsg);.    
19e70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
19e80 20 20 70 2d 3e 65 53 74 61 67 65 20 3d 20 52 42    p->eStage = RB
19e90 55 5f 53 54 41 47 45 5f 4d 4f 56 45 3b 0a 20 20  U_STAGE_MOVE;.  
19ea0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
19eb0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a  break;.      }..
19ec0 20 20 20 20 20 20 63 61 73 65 20 52 42 55 5f 53        case RBU_S
19ed0 54 41 47 45 5f 4d 4f 56 45 3a 20 7b 0a 20 20 20  TAGE_MOVE: {.   
19ee0 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
19ef0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19f00 20 20 20 20 20 20 20 72 62 75 4d 6f 76 65 4f 61         rbuMoveOa
19f10 6c 46 69 6c 65 28 70 29 3b 0a 20 20 20 20 20 20  lFile(p);.      
19f20 20 20 20 20 70 2d 3e 6e 50 72 6f 67 72 65 73 73      p->nProgress
19f30 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ++;.        }.  
19f40 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
19f50 20 20 20 7d 0a 0a 20 20 20 20 20 20 63 61 73 65     }..      case
19f60 20 52 42 55 5f 53 54 41 47 45 5f 43 4b 50 54 3a   RBU_STAGE_CKPT:
19f70 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   {.        if( p
19f80 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
19f90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
19fa0 20 70 2d 3e 6e 53 74 65 70 3e 3d 70 2d 3e 6e 46   p->nStep>=p->nF
19fb0 72 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20  rame ){.        
19fc0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65      sqlite3_file
19fd0 20 2a 70 44 62 20 3d 20 70 2d 3e 70 54 61 72 67   *pDb = p->pTarg
19fe0 65 74 46 64 2d 3e 70 52 65 61 6c 3b 0a 20 20 0a  etFd->pReal;.  .
19ff0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1a000 79 6e 63 20 74 68 65 20 64 62 20 66 69 6c 65 20  ync the db file 
1a010 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  */.            p
1a020 2d 3e 72 63 20 3d 20 70 44 62 2d 3e 70 4d 65 74  ->rc = pDb->pMet
1a030 68 6f 64 73 2d 3e 78 53 79 6e 63 28 70 44 62 2c  hods->xSync(pDb,
1a040 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
1a050 4d 41 4c 29 3b 0a 20 20 0a 20 20 20 20 20 20 20  MAL);.  .       
1a060 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 6e       /* Update n
1a070 42 61 63 6b 66 69 6c 6c 20 2a 2f 0a 20 20 20 20  Backfill */.    
1a080 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72          if( p->r
1a090 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1a0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 76 6f                vo
1a0b0 69 64 20 76 6f 6c 61 74 69 6c 65 20 2a 70 74 72  id volatile *ptr
1a0c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1a0d0 70 2d 3e 72 63 20 3d 20 70 44 62 2d 3e 70 4d 65  p->rc = pDb->pMe
1a0e0 74 68 6f 64 73 2d 3e 78 53 68 6d 4d 61 70 28 70  thods->xShmMap(p
1a0f0 44 62 2c 20 30 2c 20 33 32 2a 31 30 32 34 2c 20  Db, 0, 32*1024, 
1a100 30 2c 20 26 70 74 72 29 3b 0a 20 20 20 20 20 20  0, &ptr);.      
1a110 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72          if( p->r
1a120 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1a130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a140 28 28 75 33 32 20 76 6f 6c 61 74 69 6c 65 2a 29  ((u32 volatile*)
1a150 70 74 72 29 5b 32 34 5d 20 3d 20 70 2d 3e 69 4d  ptr)[24] = p->iM
1a160 61 78 46 72 61 6d 65 3b 0a 20 20 20 20 20 20 20  axFrame;.       
1a170 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1a180 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20       }.  .      
1a190 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
1a1a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1a1b0 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 65              p->e
1a1c0 53 74 61 67 65 20 3d 20 52 42 55 5f 53 54 41 47  Stage = RBU_STAG
1a1d0 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20  E_DONE;.        
1a1e0 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51        p->rc = SQ
1a1f0 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20  LITE_DONE;.     
1a200 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1a210 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1a220 20 20 20 20 20 20 52 62 75 46 72 61 6d 65 20 2a        RbuFrame *
1a230 70 46 72 61 6d 65 20 3d 20 26 70 2d 3e 61 46 72  pFrame = &p->aFr
1a240 61 6d 65 5b 70 2d 3e 6e 53 74 65 70 5d 3b 0a 20  ame[p->nStep];. 
1a250 20 20 20 20 20 20 20 20 20 20 20 72 62 75 43 68             rbuCh
1a260 65 63 6b 70 6f 69 6e 74 46 72 61 6d 65 28 70 2c  eckpointFrame(p,
1a270 20 70 46 72 61 6d 65 29 3b 0a 20 20 20 20 20 20   pFrame);.      
1a280 20 20 20 20 20 20 70 2d 3e 6e 53 74 65 70 2b 2b        p->nStep++
1a290 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1a2a0 20 20 20 20 20 20 20 20 70 2d 3e 6e 50 72 6f 67          p->nProg
1a2b0 72 65 73 73 2b 2b 3b 0a 20 20 20 20 20 20 20 20  ress++;.        
1a2c0 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  }.        break;
1a2d0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
1a2e0 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20  default:.       
1a2f0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1a300 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 3b 0a    return p->rc;.
1a310 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
1a320 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
1a330 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
1a340 6f 6d 70 61 72 65 20 73 74 72 69 6e 67 73 20 7a  ompare strings z
1a350 31 20 61 6e 64 20 7a 32 2c 20 72 65 74 75 72 6e  1 and z2, return
1a360 69 6e 67 20 30 20 69 66 20 74 68 65 79 20 61 72  ing 0 if they ar
1a370 65 20 69 64 65 6e 74 69 63 61 6c 2c 20 6f 72 20  e identical, or 
1a380 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 6f 74 68 65  non-zero.** othe
1a390 72 77 69 73 65 2e 20 45 69 74 68 65 72 20 6f 72  rwise. Either or
1a3a0 20 62 6f 74 68 20 61 72 67 75 6d 65 6e 74 20 6d   both argument m
1a3b0 61 79 20 62 65 20 4e 55 4c 4c 2e 20 54 77 6f 20  ay be NULL. Two 
1a3c0 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61 72 65 0a  NULL values are.
1a3d0 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 65 71  ** considered eq
1a3e0 75 61 6c 2c 20 61 6e 64 20 4e 55 4c 4c 20 69 73  ual, and NULL is
1a3f0 20 63 6f 6e 73 69 64 65 72 65 64 20 64 69 73 74   considered dist
1a400 69 6e 63 74 20 66 72 6f 6d 20 61 6c 6c 20 6f 74  inct from all ot
1a410 68 65 72 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a 73  her values..*/.s
1a420 74 61 74 69 63 20 69 6e 74 20 72 62 75 53 74 72  tatic int rbuStr
1a430 43 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20 63 68  Compare(const ch
1a440 61 72 20 2a 7a 31 2c 20 63 6f 6e 73 74 20 63 68  ar *z1, const ch
1a450 61 72 20 2a 7a 32 29 7b 0a 20 20 69 66 28 20 7a  ar *z2){.  if( z
1a460 31 3d 3d 30 20 26 26 20 7a 32 3d 3d 30 20 29 20  1==0 && z2==0 ) 
1a470 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
1a480 7a 31 3d 3d 30 20 7c 7c 20 7a 32 3d 3d 30 20 29  z1==0 || z2==0 )
1a490 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74   return 1;.  ret
1a4a0 75 72 6e 20 28 73 71 6c 69 74 65 33 5f 73 74 72  urn (sqlite3_str
1a4b0 69 63 6d 70 28 7a 31 2c 20 7a 32 29 21 3d 30 29  icmp(z1, z2)!=0)
1a4c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1a4d0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
1a4e0 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 73 71  ed as part of sq
1a4f0 6c 69 74 65 33 72 62 75 5f 6f 70 65 6e 28 29 20  lite3rbu_open() 
1a500 77 68 65 6e 20 69 6e 69 74 69 61 6c 69 7a 69 6e  when initializin
1a510 67 0a 2a 2a 20 61 6e 20 72 62 75 20 68 61 6e 64  g.** an rbu hand
1a520 6c 65 20 69 6e 20 4f 41 4c 20 73 74 61 67 65 2e  le in OAL stage.
1a530 20 49 66 20 74 68 65 20 72 62 75 20 75 70 64 61   If the rbu upda
1a540 74 65 20 68 61 73 20 6e 6f 74 20 73 74 61 72 74  te has not start
1a550 65 64 20 28 69 2e 65 2e 0a 2a 2a 20 74 68 65 20  ed (i.e..** the 
1a560 72 62 75 5f 73 74 61 74 65 20 74 61 62 6c 65 20  rbu_state table 
1a570 77 61 73 20 65 6d 70 74 79 29 20 69 74 20 69 73  was empty) it is
1a580 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77   a no-op. Otherw
1a590 69 73 65 2c 20 69 74 20 61 72 72 61 6e 67 65 73  ise, it arranges
1a5a0 0a 2a 2a 20 74 68 69 6e 67 73 20 73 6f 20 74 68  .** things so th
1a5b0 61 74 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c  at the next call
1a5c0 20 74 6f 20 73 71 6c 69 74 65 33 72 62 75 5f 73   to sqlite3rbu_s
1a5d0 74 65 70 28 29 20 63 6f 6e 74 69 6e 75 65 73 20  tep() continues 
1a5e0 6f 6e 20 66 72 6f 6d 0a 2a 2a 20 77 68 65 72 65  on from.** where
1a5f0 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 72 62   the previous rb
1a600 75 20 68 61 6e 64 6c 65 20 6c 65 66 74 20 6f 66  u handle left of
1a610 66 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  f..**.** If an e
1a620 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20  rror occurs, an 
1a630 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 65  error code and e
1a640 72 72 6f 72 20 6d 65 73 73 61 67 65 20 61 72 65  rror message are
1a650 20 6c 65 66 74 20 69 6e 20 74 68 65 0a 2a 2a 20   left in the.** 
1a660 72 62 75 20 68 61 6e 64 6c 65 20 70 61 73 73 65  rbu handle passe
1a670 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  d as the first a
1a680 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  rgument..*/.stat
1a690 69 63 20 76 6f 69 64 20 72 62 75 53 65 74 75 70  ic void rbuSetup
1a6a0 4f 61 6c 28 73 71 6c 69 74 65 33 72 62 75 20 2a  Oal(sqlite3rbu *
1a6b0 70 2c 20 52 62 75 53 74 61 74 65 20 2a 70 53 74  p, RbuState *pSt
1a6c0 61 74 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ate){.  assert( 
1a6d0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
1a6e0 20 29 3b 0a 20 20 69 66 28 20 70 53 74 61 74 65   );.  if( pState
1a6f0 2d 3e 7a 54 62 6c 20 29 7b 0a 20 20 20 20 52 62  ->zTbl ){.    Rb
1a700 75 4f 62 6a 49 74 65 72 20 2a 70 49 74 65 72 20  uObjIter *pIter 
1a710 3d 20 26 70 2d 3e 6f 62 6a 69 74 65 72 3b 0a 20  = &p->objiter;. 
1a720 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49     int rc = SQLI
1a730 54 45 5f 4f 4b 3b 0a 0a 20 20 20 20 77 68 69 6c  TE_OK;..    whil
1a740 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
1a750 20 26 26 20 70 49 74 65 72 2d 3e 7a 54 62 6c 20   && pIter->zTbl 
1a760 26 26 20 28 70 49 74 65 72 2d 3e 62 43 6c 65 61  && (pIter->bClea
1a770 6e 75 70 20 0a 20 20 20 20 20 20 20 7c 7c 20 72  nup .       || r
1a780 62 75 53 74 72 43 6f 6d 70 61 72 65 28 70 49 74  buStrCompare(pIt
1a790 65 72 2d 3e 7a 49 64 78 2c 20 70 53 74 61 74 65  er->zIdx, pState
1a7a0 2d 3e 7a 49 64 78 29 0a 20 20 20 20 20 20 20 7c  ->zIdx).       |
1a7b0 7c 20 72 62 75 53 74 72 43 6f 6d 70 61 72 65 28  | rbuStrCompare(
1a7c0 70 49 74 65 72 2d 3e 7a 54 62 6c 2c 20 70 53 74  pIter->zTbl, pSt
1a7d0 61 74 65 2d 3e 7a 54 62 6c 29 20 0a 20 20 20 20  ate->zTbl) .    
1a7e0 29 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72  )){.      rc = r
1a7f0 62 75 4f 62 6a 49 74 65 72 4e 65 78 74 28 70 2c  buObjIterNext(p,
1a800 20 70 49 74 65 72 29 3b 0a 20 20 20 20 7d 0a 0a   pIter);.    }..
1a810 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1a820 54 45 5f 4f 4b 20 26 26 20 21 70 49 74 65 72 2d  TE_OK && !pIter-
1a830 3e 7a 54 62 6c 20 29 7b 0a 20 20 20 20 20 20 72  >zTbl ){.      r
1a840 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
1a850 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 45 72 72 6d  ;.      p->zErrm
1a860 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  sg = sqlite3_mpr
1a870 69 6e 74 66 28 22 72 62 75 5f 73 74 61 74 65 20  intf("rbu_state 
1a880 6d 69 73 6d 61 74 63 68 20 65 72 72 6f 72 22 29  mismatch error")
1a890 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
1a8a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1a8b0 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 74 65 70  {.      p->nStep
1a8c0 20 3d 20 70 53 74 61 74 65 2d 3e 6e 52 6f 77 3b   = pState->nRow;
1a8d0 0a 20 20 20 20 20 20 72 63 20 3d 20 72 62 75 4f  .      rc = rbuO
1a8e0 62 6a 49 74 65 72 50 72 65 70 61 72 65 41 6c 6c  bjIterPrepareAll
1a8f0 28 70 2c 20 26 70 2d 3e 6f 62 6a 69 74 65 72 2c  (p, &p->objiter,
1a900 20 70 2d 3e 6e 53 74 65 70 29 3b 0a 20 20 20 20   p->nStep);.    
1a910 7d 0a 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 72  }..    p->rc = r
1a920 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  c;.  }.}../*.** 
1a930 49 66 20 74 68 65 72 65 20 69 73 20 61 20 22 2a  If there is a "*
1a940 2d 6f 61 6c 22 20 66 69 6c 65 20 69 6e 20 74 68  -oal" file in th
1a950 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 63 6f  e file-system co
1a960 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74  rresponding to t
1a970 68 65 0a 2a 2a 20 74 61 72 67 65 74 20 64 61 74  he.** target dat
1a980 61 62 61 73 65 20 69 6e 20 74 68 65 20 66 69 6c  abase in the fil
1a990 65 2d 73 79 73 74 65 6d 2c 20 64 65 6c 65 74 65  e-system, delete
1a9a0 20 69 74 2e 20 49 66 20 61 6e 20 65 72 72 6f 72   it. If an error
1a9b0 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 6c 65 61 76   occurs,.** leav
1a9c0 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  e an error code 
1a9d0 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67  and error messag
1a9e0 65 20 69 6e 20 74 68 65 20 72 62 75 20 68 61 6e  e in the rbu han
1a9f0 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  dle..*/.static v
1aa00 6f 69 64 20 72 62 75 44 65 6c 65 74 65 4f 61 6c  oid rbuDeleteOal
1aa10 46 69 6c 65 28 73 71 6c 69 74 65 33 72 62 75 20  File(sqlite3rbu 
1aa20 2a 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4f 61  *p){.  char *zOa
1aa30 6c 20 3d 20 72 62 75 4d 50 72 69 6e 74 66 28 70  l = rbuMPrintf(p
1aa40 2c 20 22 25 73 2d 6f 61 6c 22 2c 20 70 2d 3e 7a  , "%s-oal", p->z
1aa50 54 61 72 67 65 74 29 3b 0a 20 20 69 66 28 20 7a  Target);.  if( z
1aa60 4f 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Oal ){.    sqlit
1aa70 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 73  e3_vfs *pVfs = s
1aa80 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
1aa90 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  0);.    assert( 
1aaa0 70 56 66 73 20 26 26 20 70 2d 3e 72 63 3d 3d 53  pVfs && p->rc==S
1aab0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 7a  QLITE_OK && p->z
1aac0 45 72 72 6d 73 67 3d 3d 30 20 29 3b 0a 20 20 20  Errmsg==0 );.   
1aad0 20 70 56 66 73 2d 3e 78 44 65 6c 65 74 65 28 70   pVfs->xDelete(p
1aae0 56 66 73 2c 20 7a 4f 61 6c 2c 20 30 29 3b 0a 20  Vfs, zOal, 0);. 
1aaf0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1ab00 7a 4f 61 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  zOal);.  }.}../*
1ab10 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 70  .** Allocate a p
1ab20 72 69 76 61 74 65 20 72 62 75 20 56 46 53 20 66  rivate rbu VFS f
1ab30 6f 72 20 74 68 65 20 72 62 75 20 68 61 6e 64 6c  or the rbu handl
1ab40 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
1ab50 6f 6e 6c 79 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  only.** argument
1ab60 2e 20 54 68 69 73 20 56 46 53 20 77 69 6c 6c 20  . This VFS will 
1ab70 62 65 20 75 73 65 64 20 75 6e 6c 65 73 73 20 74  be used unless t
1ab80 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  he call to sqlit
1ab90 65 33 72 62 75 5f 6f 70 65 6e 28 29 0a 2a 2a 20  e3rbu_open().** 
1aba0 73 70 65 63 69 66 69 65 64 20 61 20 55 52 49 20  specified a URI 
1abb0 77 69 74 68 20 61 20 76 66 73 3d 3f 20 6f 70 74  with a vfs=? opt
1abc0 69 6f 6e 20 69 6e 20 70 6c 61 63 65 20 6f 66 20  ion in place of 
1abd0 61 20 74 61 72 67 65 74 20 64 61 74 61 62 61 73  a target databas
1abe0 65 0a 2a 2a 20 66 69 6c 65 20 6e 61 6d 65 2e 0a  e.** file name..
1abf0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
1ac00 62 75 43 72 65 61 74 65 56 66 73 28 73 71 6c 69  buCreateVfs(sqli
1ac10 74 65 33 72 62 75 20 2a 70 29 7b 0a 20 20 69 6e  te3rbu *p){.  in
1ac20 74 20 72 6e 64 3b 0a 20 20 63 68 61 72 20 7a 52  t rnd;.  char zR
1ac30 6e 64 5b 36 34 5d 3b 0a 0a 20 20 61 73 73 65 72  nd[64];..  asser
1ac40 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  t( p->rc==SQLITE
1ac50 5f 4f 4b 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  _OK );.  sqlite3
1ac60 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65  _randomness(size
1ac70 6f 66 28 69 6e 74 29 2c 20 28 76 6f 69 64 2a 29  of(int), (void*)
1ac80 26 72 6e 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  &rnd);.  sqlite3
1ac90 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
1aca0 28 7a 52 6e 64 29 2c 20 7a 52 6e 64 2c 20 22 72  (zRnd), zRnd, "r
1acb0 62 75 5f 76 66 73 5f 25 64 22 2c 20 72 6e 64 29  bu_vfs_%d", rnd)
1acc0 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69  ;.  p->rc = sqli
1acd0 74 65 33 72 62 75 5f 63 72 65 61 74 65 5f 76 66  te3rbu_create_vf
1ace0 73 28 7a 52 6e 64 2c 20 30 29 3b 0a 20 20 69 66  s(zRnd, 0);.  if
1acf0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
1ad00 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
1ad10 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 73 71  3_vfs *pVfs = sq
1ad20 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 7a  lite3_vfs_find(z
1ad30 52 6e 64 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Rnd);.    assert
1ad40 28 20 70 56 66 73 20 29 3b 0a 20 20 20 20 70 2d  ( pVfs );.    p-
1ad50 3e 7a 56 66 73 4e 61 6d 65 20 3d 20 70 56 66 73  >zVfsName = pVfs
1ad60 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 7d 0a 0a  ->zName;.  }.}..
1ad70 2f 2a 0a 2a 2a 20 44 65 73 74 72 6f 79 20 74 68  /*.** Destroy th
1ad80 65 20 70 72 69 76 61 74 65 20 56 46 53 20 63 72  e private VFS cr
1ad90 65 61 74 65 64 20 66 6f 72 20 74 68 65 20 72 62  eated for the rb
1ada0 75 20 68 61 6e 64 6c 65 20 70 61 73 73 65 64 20  u handle passed 
1adb0 61 73 20 74 68 65 20 6f 6e 6c 79 0a 2a 2a 20 61  as the only.** a
1adc0 72 67 75 6d 65 6e 74 20 62 79 20 61 6e 20 65 61  rgument by an ea
1add0 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20 72 62  rlier call to rb
1ade0 75 43 72 65 61 74 65 56 66 73 28 29 2e 0a 2a 2f  uCreateVfs()..*/
1adf0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75  .static void rbu
1ae00 44 65 6c 65 74 65 56 66 73 28 73 71 6c 69 74 65  DeleteVfs(sqlite
1ae10 33 72 62 75 20 2a 70 29 7b 0a 20 20 69 66 28 20  3rbu *p){.  if( 
1ae20 70 2d 3e 7a 56 66 73 4e 61 6d 65 20 29 7b 0a 20  p->zVfsName ){. 
1ae30 20 20 20 73 71 6c 69 74 65 33 72 62 75 5f 64 65     sqlite3rbu_de
1ae40 73 74 72 6f 79 5f 76 66 73 28 70 2d 3e 7a 56 66  stroy_vfs(p->zVf
1ae50 73 4e 61 6d 65 29 3b 0a 20 20 20 20 70 2d 3e 7a  sName);.    p->z
1ae60 56 66 73 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d  VfsName = 0;.  }
1ae70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 75  .}../*.** This u
1ae80 73 65 72 2d 64 65 66 69 6e 65 64 20 53 51 4c 20  ser-defined SQL 
1ae90 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f  function is invo
1aea0 6b 65 64 20 77 69 74 68 20 61 20 73 69 6e 67 6c  ked with a singl
1aeb0 65 20 61 72 67 75 6d 65 6e 74 20 2d 20 74 68 65  e argument - the
1aec0 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 61 20 74 61  .** name of a ta
1aed0 62 6c 65 20 65 78 70 65 63 74 65 64 20 74 6f 20  ble expected to 
1aee0 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 74 61  appear in the ta
1aef0 72 67 65 74 20 64 61 74 61 62 61 73 65 2e 20 49  rget database. I
1af00 74 20 72 65 74 75 72 6e 73 0a 2a 2a 20 74 68 65  t returns.** the
1af10 20 6e 75 6d 62 65 72 20 6f 66 20 61 75 78 69 6c   number of auxil
1af20 6c 69 61 72 79 20 69 6e 64 65 78 65 73 20 6f 6e  liary indexes on
1af30 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73   the table..*/.s
1af40 74 61 74 69 63 20 76 6f 69 64 20 72 62 75 49 6e  tatic void rbuIn
1af50 64 65 78 43 6e 74 46 75 6e 63 28 0a 20 20 73 71  dexCntFunc(.  sq
1af60 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70  lite3_context *p
1af70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 56 61 6c  Ctx, .  int nVal
1af80 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
1af90 65 20 2a 2a 61 70 56 61 6c 0a 29 7b 0a 20 20 73  e **apVal.){.  s
1afa0 71 6c 69 74 65 33 72 62 75 20 2a 70 20 3d 20 28  qlite3rbu *p = (
1afb0 73 71 6c 69 74 65 33 72 62 75 2a 29 73 71 6c 69  sqlite3rbu*)sqli
1afc0 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28 70 43  te3_user_data(pC
1afd0 74 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  tx);.  sqlite3_s
1afe0 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a  tmt *pStmt = 0;.
1aff0 20 20 63 68 61 72 20 2a 7a 45 72 72 6d 73 67 20    char *zErrmsg 
1b000 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  = 0;.  int rc;..
1b010 20 20 61 73 73 65 72 74 28 20 6e 56 61 6c 3d 3d    assert( nVal==
1b020 31 20 29 3b 0a 20 20 0a 20 20 72 63 20 3d 20 70  1 );.  .  rc = p
1b030 72 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f 6c  repareFreeAndCol
1b040 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 4d  lectError(p->dbM
1b050 61 69 6e 2c 20 26 70 53 74 6d 74 2c 20 26 7a 45  ain, &pStmt, &zE
1b060 72 72 6d 73 67 2c 20 0a 20 20 20 20 20 20 73 71  rrmsg, .      sq
1b070 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53  lite3_mprintf("S
1b080 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
1b090 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
1b0a0 72 20 22 0a 20 20 20 20 20 20 20 20 22 57 48 45  r ".        "WHE
1b0b0 52 45 20 74 79 70 65 3d 27 69 6e 64 65 78 27 20  RE type='index' 
1b0c0 41 4e 44 20 74 62 6c 5f 6e 61 6d 65 20 3d 20 25  AND tbl_name = %
1b0d0 51 22 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  Q", sqlite3_valu
1b0e0 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 30 5d 29  e_text(apVal[0])
1b0f0 29 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 21  ).  );.  if( rc!
1b100 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1b110 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
1b120 5f 65 72 72 6f 72 28 70 43 74 78 2c 20 7a 45 72  _error(pCtx, zEr
1b130 72 6d 73 67 2c 20 2d 31 29 3b 0a 20 20 7d 65 6c  rmsg, -1);.  }el
1b140 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 49 6e 64  se{.    int nInd
1b150 65 78 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  ex = 0;.    if( 
1b160 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69  SQLITE_ROW==sqli
1b170 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20  te3_step(pStmt) 
1b180 29 7b 0a 20 20 20 20 20 20 6e 49 6e 64 65 78 20  ){.      nIndex 
1b190 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
1b1a0 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a  _int(pStmt, 0);.
1b1b0 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
1b1c0 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
1b1d0 70 53 74 6d 74 29 3b 0a 20 20 20 20 69 66 28 20  pStmt);.    if( 
1b1e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1b1f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
1b200 65 73 75 6c 74 5f 69 6e 74 28 70 43 74 78 2c 20  esult_int(pCtx, 
1b210 6e 49 6e 64 65 78 29 3b 0a 20 20 20 20 7d 65 6c  nIndex);.    }el
1b220 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
1b230 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 70  3_result_error(p
1b240 43 74 78 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  Ctx, sqlite3_err
1b250 6d 73 67 28 70 2d 3e 64 62 4d 61 69 6e 29 2c 20  msg(p->dbMain), 
1b260 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  -1);.    }.  }..
1b270 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
1b280 45 72 72 6d 73 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Errmsg);.}../*.*
1b290 2a 20 49 66 20 74 68 65 20 52 42 55 20 64 61 74  * If the RBU dat
1b2a0 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 73 20 74  abase contains t
1b2b0 68 65 20 72 62 75 5f 63 6f 75 6e 74 20 74 61 62  he rbu_count tab
1b2c0 6c 65 2c 20 75 73 65 20 69 74 20 74 6f 20 69 6e  le, use it to in
1b2d0 69 74 69 61 6c 69 7a 65 0a 2a 2a 20 74 68 65 20  itialize.** the 
1b2e0 73 71 6c 69 74 65 33 72 62 75 2e 6e 50 68 61 73  sqlite3rbu.nPhas
1b2f0 65 4f 6e 65 53 74 65 70 20 76 61 72 69 61 62 6c  eOneStep variabl
1b300 65 2e 20 54 68 65 20 73 63 68 65 6d 61 20 6f 66  e. The schema of
1b310 20 74 68 65 20 72 62 75 5f 63 6f 75 6e 74 20 74   the rbu_count t
1b320 61 62 6c 65 0a 2a 2a 20 69 73 20 61 73 73 75 6d  able.** is assum
1b330 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68  ed to contain th
1b340 65 20 73 61 6d 65 20 63 6f 6c 75 6d 6e 73 20 61  e same columns a
1b350 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54  s:.**.**   CREAT
1b360 45 20 54 41 42 4c 45 20 72 62 75 5f 63 6f 75 6e  E TABLE rbu_coun
1b370 74 28 74 62 6c 20 54 45 58 54 20 50 52 49 4d 41  t(tbl TEXT PRIMA
1b380 52 59 20 4b 45 59 2c 20 63 6e 74 20 49 4e 54 45  RY KEY, cnt INTE
1b390 47 45 52 29 20 57 49 54 48 4f 55 54 20 52 4f 57  GER) WITHOUT ROW
1b3a0 49 44 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  ID;.**.** There 
1b3b0 73 68 6f 75 6c 64 20 62 65 20 6f 6e 65 20 72 6f  should be one ro
1b3c0 77 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 66  w in the table f
1b3d0 6f 72 20 65 61 63 68 20 64 61 74 61 5f 78 78 78  or each data_xxx
1b3e0 20 74 61 62 6c 65 20 69 6e 20 74 68 65 0a 2a 2a   table in the.**
1b3f0 20 64 61 74 61 62 61 73 65 2e 20 54 68 65 20 27   database. The '
1b400 74 62 6c 27 20 63 6f 6c 75 6d 6e 20 73 68 6f 75  tbl' column shou
1b410 6c 64 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e  ld contain the n
1b420 61 6d 65 20 6f 66 20 61 20 64 61 74 61 5f 78 78  ame of a data_xx
1b430 78 20 74 61 62 6c 65 2c 0a 2a 2a 20 61 6e 64 20  x table,.** and 
1b440 74 68 65 20 63 6e 74 20 63 6f 6c 75 6d 6e 20 74  the cnt column t
1b450 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
1b460 73 20 69 74 20 63 6f 6e 74 61 69 6e 73 2e 0a 2a  s it contains..*
1b470 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 72 62 75 2e  *.** sqlite3rbu.
1b480 6e 50 68 61 73 65 4f 6e 65 53 74 65 70 20 69 73  nPhaseOneStep is
1b490 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
1b4a0 74 68 65 20 73 75 6d 20 6f 66 20 28 31 20 2b 20  the sum of (1 + 
1b4b0 6e 49 6e 64 65 78 29 20 2a 20 63 6e 74 0a 2a 2a  nIndex) * cnt.**
1b4c0 20 66 6f 72 20 61 6c 6c 20 72 6f 77 73 20 69 6e   for all rows in
1b4d0 20 74 68 65 20 72 62 75 5f 63 6f 75 6e 74 20 74   the rbu_count t
1b4e0 61 62 6c 65 2c 20 77 68 65 72 65 20 6e 49 6e 64  able, where nInd
1b4f0 65 78 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ex is the number
1b500 20 6f 66 20 0a 2a 2a 20 69 6e 64 65 78 65 73 20   of .** indexes 
1b510 6f 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  on the correspon
1b520 64 69 6e 67 20 74 61 72 67 65 74 20 64 61 74 61  ding target data
1b530 62 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73  base table..*/.s
1b540 74 61 74 69 63 20 76 6f 69 64 20 72 62 75 49 6e  tatic void rbuIn
1b550 69 74 50 68 61 73 65 4f 6e 65 53 74 65 70 73 28  itPhaseOneSteps(
1b560 73 71 6c 69 74 65 33 72 62 75 20 2a 70 29 7b 0a  sqlite3rbu *p){.
1b570 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
1b580 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
1b590 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
1b5a0 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 62  t = 0;.    int b
1b5b0 45 78 69 73 74 73 20 3d 20 30 3b 20 20 20 20 20  Exists = 0;     
1b5c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1b5d0 75 65 20 69 66 20 72 62 75 5f 63 6f 75 6e 74 20  ue if rbu_count 
1b5e0 65 78 69 73 74 73 20 2a 2f 0a 0a 20 20 20 20 70  exists */..    p
1b5f0 2d 3e 6e 50 68 61 73 65 4f 6e 65 53 74 65 70 20  ->nPhaseOneStep 
1b600 3d 20 2d 31 3b 0a 0a 20 20 20 20 70 2d 3e 72 63  = -1;..    p->rc
1b610 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
1b620 65 5f 66 75 6e 63 74 69 6f 6e 28 70 2d 3e 64 62  e_function(p->db
1b630 52 62 75 2c 20 0a 20 20 20 20 20 20 20 20 22 72  Rbu, .        "r
1b640 62 75 5f 69 6e 64 65 78 5f 63 6e 74 22 2c 20 31  bu_index_cnt", 1
1b650 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 28  , SQLITE_UTF8, (
1b660 76 6f 69 64 2a 29 70 2c 20 72 62 75 49 6e 64 65  void*)p, rbuInde
1b670 78 43 6e 74 46 75 6e 63 2c 20 30 2c 20 30 0a 20  xCntFunc, 0, 0. 
1b680 20 20 20 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20     );.  .    /* 
1b690 43 68 65 63 6b 20 66 6f 72 20 74 68 65 20 72 62  Check for the rb
1b6a0 75 5f 63 6f 75 6e 74 20 74 61 62 6c 65 2e 20 49  u_count table. I
1b6b0 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78  f it does not ex
1b6c0 69 73 74 2c 20 6f 72 20 69 66 20 61 6e 20 65 72  ist, or if an er
1b6d0 72 6f 72 0a 20 20 20 20 2a 2a 20 6f 63 63 75 72  ror.    ** occur
1b6e0 73 2c 20 6e 50 68 61 73 65 4f 6e 65 53 74 65 70  s, nPhaseOneStep
1b6f0 20 77 69 6c 6c 20 62 65 20 6c 65 66 74 20 73 65   will be left se
1b700 74 20 74 6f 20 2d 31 2e 20 2a 2f 0a 20 20 20 20  t to -1. */.    
1b710 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
1b720 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d  E_OK ){.      p-
1b730 3e 72 63 20 3d 20 70 72 65 70 61 72 65 41 6e 64  >rc = prepareAnd
1b740 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e  CollectError(p->
1b750 64 62 52 62 75 2c 20 26 70 53 74 6d 74 2c 20 26  dbRbu, &pStmt, &
1b760 70 2d 3e 7a 45 72 72 6d 73 67 2c 0a 20 20 20 20  p->zErrmsg,.    
1b770 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 31 20        "SELECT 1 
1b780 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
1b790 65 72 20 57 48 45 52 45 20 74 62 6c 5f 6e 61 6d  er WHERE tbl_nam
1b7a0 65 20 3d 20 27 72 62 75 5f 63 6f 75 6e 74 27 22  e = 'rbu_count'"
1b7b0 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
1b7c0 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
1b7d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1b7e0 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57    if( SQLITE_ROW
1b7f0 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ==sqlite3_step(p
1b800 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20 20 20  Stmt) ){.       
1b810 20 62 45 78 69 73 74 73 20 3d 20 31 3b 0a 20 20   bExists = 1;.  
1b820 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 72      }.      p->r
1b830 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  c = sqlite3_fina
1b840 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
1b850 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 70 2d   }.  .    if( p-
1b860 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
1b870 26 20 62 45 78 69 73 74 73 20 29 7b 0a 20 20 20  & bExists ){.   
1b880 20 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61     p->rc = prepa
1b890 72 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f  reAndCollectErro
1b8a0 72 28 70 2d 3e 64 62 52 62 75 2c 20 26 70 53 74  r(p->dbRbu, &pSt
1b8b0 6d 74 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c  mt, &p->zErrmsg,
1b8c0 0a 20 20 20 20 20 20 20 20 20 20 22 53 45 4c 45  .          "SELE
1b8d0 43 54 20 73 75 6d 28 63 6e 74 20 2a 20 28 31 20  CT sum(cnt * (1 
1b8e0 2b 20 72 62 75 5f 69 6e 64 65 78 5f 63 6e 74 28  + rbu_index_cnt(
1b8f0 72 62 75 5f 74 61 72 67 65 74 5f 6e 61 6d 65 28  rbu_target_name(
1b900 74 62 6c 29 29 29 29 22 0a 20 20 20 20 20 20 20  tbl))))".       
1b910 20 20 20 22 46 52 4f 4d 20 72 62 75 5f 63 6f 75     "FROM rbu_cou
1b920 6e 74 22 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  nt".      );.   
1b930 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
1b940 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1b950 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f     if( SQLITE_RO
1b960 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28  W==sqlite3_step(
1b970 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20 20  pStmt) ){.      
1b980 20 20 20 20 70 2d 3e 6e 50 68 61 73 65 4f 6e 65      p->nPhaseOne
1b990 53 74 65 70 20 3d 20 73 71 6c 69 74 65 33 5f 63  Step = sqlite3_c
1b9a0 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d  olumn_int64(pStm
1b9b0 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d  t, 0);.        }
1b9c0 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  .        p->rc =
1b9d0 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
1b9e0 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  e(pStmt);.      
1b9f0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a  }.    }.  }.}...
1ba00 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 72 62  static sqlite3rb
1ba10 75 20 2a 6f 70 65 6e 52 62 75 48 61 6e 64 6c 65  u *openRbuHandle
1ba20 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
1ba30 7a 54 61 72 67 65 74 2c 20 0a 20 20 63 6f 6e 73  zTarget, .  cons
1ba40 74 20 63 68 61 72 20 2a 7a 52 62 75 2c 0a 20 20  t char *zRbu,.  
1ba50 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 61  const char *zSta
1ba60 74 65 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 72  te.){.  sqlite3r
1ba70 62 75 20 2a 70 3b 0a 20 20 73 69 7a 65 5f 74 20  bu *p;.  size_t 
1ba80 6e 54 61 72 67 65 74 20 3d 20 7a 54 61 72 67 65  nTarget = zTarge
1ba90 74 20 3f 20 73 74 72 6c 65 6e 28 7a 54 61 72 67  t ? strlen(zTarg
1baa0 65 74 29 20 3a 20 30 3b 0a 20 20 73 69 7a 65 5f  et) : 0;.  size_
1bab0 74 20 6e 52 62 75 20 3d 20 73 74 72 6c 65 6e 28  t nRbu = strlen(
1bac0 7a 52 62 75 29 3b 0a 20 20 73 69 7a 65 5f 74 20  zRbu);.  size_t 
1bad0 6e 53 74 61 74 65 20 3d 20 7a 53 74 61 74 65 20  nState = zState 
1bae0 3f 20 73 74 72 6c 65 6e 28 7a 53 74 61 74 65 29  ? strlen(zState)
1baf0 20 3a 20 30 3b 0a 20 20 73 69 7a 65 5f 74 20 6e   : 0;.  size_t n
1bb00 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 73 71  Byte = sizeof(sq
1bb10 6c 69 74 65 33 72 62 75 29 20 2b 20 6e 54 61 72  lite3rbu) + nTar
1bb20 67 65 74 2b 31 20 2b 20 6e 52 62 75 2b 31 2b 20  get+1 + nRbu+1+ 
1bb30 6e 53 74 61 74 65 2b 31 3b 0a 0a 20 20 70 20 3d  nState+1;..  p =
1bb40 20 28 73 71 6c 69 74 65 33 72 62 75 2a 29 73 71   (sqlite3rbu*)sq
1bb50 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e  lite3_malloc64(n
1bb60 42 79 74 65 29 3b 0a 20 20 69 66 28 20 70 20 29  Byte);.  if( p )
1bb70 7b 0a 20 20 20 20 52 62 75 53 74 61 74 65 20 2a  {.    RbuState *
1bb80 70 53 74 61 74 65 20 3d 20 30 3b 0a 0a 20 20 20  pState = 0;..   
1bb90 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 63   /* Create the c
1bba0 75 73 74 6f 6d 20 56 46 53 2e 20 2a 2f 0a 20 20  ustom VFS. */.  
1bbb0 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73    memset(p, 0, s
1bbc0 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 72 62 75  izeof(sqlite3rbu
1bbd0 29 29 3b 0a 20 20 20 20 72 62 75 43 72 65 61 74  ));.    rbuCreat
1bbe0 65 56 66 73 28 70 29 3b 0a 0a 20 20 20 20 2f 2a  eVfs(p);..    /*
1bbf0 20 4f 70 65 6e 20 74 68 65 20 74 61 72 67 65 74   Open the target
1bc00 2c 20 52 42 55 20 61 6e 64 20 73 74 61 74 65 20  , RBU and state 
1bc10 64 61 74 61 62 61 73 65 73 20 2a 2f 0a 20 20 20  databases */.   
1bc20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
1bc30 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 63  TE_OK ){.      c
1bc40 68 61 72 20 2a 70 43 73 72 20 3d 20 28 63 68 61  har *pCsr = (cha
1bc50 72 2a 29 26 70 5b 31 5d 3b 0a 20 20 20 20 20 20  r*)&p[1];.      
1bc60 69 66 28 20 7a 54 61 72 67 65 74 20 29 7b 0a 20  if( zTarget ){. 
1bc70 20 20 20 20 20 20 20 70 2d 3e 7a 54 61 72 67 65         p->zTarge
1bc80 74 20 3d 20 70 43 73 72 3b 0a 20 20 20 20 20 20  t = pCsr;.      
1bc90 20 20 6d 65 6d 63 70 79 28 70 2d 3e 7a 54 61 72    memcpy(p->zTar
1bca0 67 65 74 2c 20 7a 54 61 72 67 65 74 2c 20 6e 54  get, zTarget, nT
1bcb0 61 72 67 65 74 2b 31 29 3b 0a 20 20 20 20 20 20  arget+1);.      
1bcc0 20 20 70 43 73 72 20 2b 3d 20 6e 54 61 72 67 65    pCsr += nTarge
1bcd0 74 2b 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  t+1;.      }.   
1bce0 20 20 20 70 2d 3e 7a 52 62 75 20 3d 20 70 43 73     p->zRbu = pCs
1bcf0 72 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  r;.      memcpy(
1bd00 70 2d 3e 7a 52 62 75 2c 20 7a 52 62 75 2c 20 6e  p->zRbu, zRbu, n
1bd10 52 62 75 2b 31 29 3b 0a 20 20 20 20 20 20 70 43  Rbu+1);.      pC
1bd20 73 72 20 2b 3d 20 6e 52 62 75 2b 31 3b 0a 20 20  sr += nRbu+1;.  
1bd30 20 20 20 20 69 66 28 20 7a 53 74 61 74 65 20 29      if( zState )
1bd40 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 7a 53 74  {.        p->zSt
1bd50 61 74 65 20 3d 20 70 43 73 72 3b 0a 20 20 20 20  ate = pCsr;.    
1bd60 20 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e 7a 53      memcpy(p->zS
1bd70 74 61 74 65 2c 20 7a 53 74 61 74 65 2c 20 6e 53  tate, zState, nS
1bd80 74 61 74 65 2b 31 29 3b 0a 20 20 20 20 20 20 7d  tate+1);.      }
1bd90 0a 20 20 20 20 20 20 72 62 75 4f 70 65 6e 44 61  .      rbuOpenDa
1bda0 74 61 62 61 73 65 28 70 29 3b 0a 20 20 20 20 7d  tabase(p);.    }
1bdb0 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d  ..    if( p->rc=
1bdc0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1bdd0 20 20 20 20 70 53 74 61 74 65 20 3d 20 72 62 75      pState = rbu
1bde0 4c 6f 61 64 53 74 61 74 65 28 70 29 3b 0a 20 20  LoadState(p);.  
1bdf0 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74 61      assert( pSta
1be00 74 65 20 7c 7c 20 70 2d 3e 72 63 21 3d 53 51 4c  te || p->rc!=SQL
1be10 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
1be20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
1be30 45 5f 4f 4b 20 29 7b 0a 0a 20 20 20 20 20 20 20  E_OK ){..       
1be40 20 69 66 28 20 70 53 74 61 74 65 2d 3e 65 53 74   if( pState->eSt
1be50 61 67 65 3d 3d 30 20 29 7b 20 0a 20 20 20 20 20  age==0 ){ .     
1be60 20 20 20 20 20 72 62 75 44 65 6c 65 74 65 4f 61       rbuDeleteOa
1be70 6c 46 69 6c 65 28 70 29 3b 0a 20 20 20 20 20 20  lFile(p);.      
1be80 20 20 20 20 72 62 75 49 6e 69 74 50 68 61 73 65      rbuInitPhase
1be90 4f 6e 65 53 74 65 70 73 28 70 29 3b 0a 20 20 20  OneSteps(p);.   
1bea0 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 67 65         p->eStage
1beb0 20 3d 20 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c   = RBU_STAGE_OAL
1bec0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
1bed0 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 65 53  .          p->eS
1bee0 74 61 67 65 20 3d 20 70 53 74 61 74 65 2d 3e 65  tage = pState->e
1bef0 53 74 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  Stage;.         
1bf00 20 70 2d 3e 6e 50 68 61 73 65 4f 6e 65 53 74 65   p->nPhaseOneSte
1bf10 70 20 3d 20 70 53 74 61 74 65 2d 3e 6e 50 68 61  p = pState->nPha
1bf20 73 65 4f 6e 65 53 74 65 70 3b 0a 20 20 20 20 20  seOneStep;.     
1bf30 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 2d 3e     }.        p->
1bf40 6e 50 72 6f 67 72 65 73 73 20 3d 20 70 53 74 61  nProgress = pSta
1bf50 74 65 2d 3e 6e 50 72 6f 67 72 65 73 73 3b 0a 20  te->nProgress;. 
1bf60 20 20 20 20 20 20 20 70 2d 3e 69 4f 61 6c 53 7a         p->iOalSz
1bf70 20 3d 20 70 53 74 61 74 65 2d 3e 69 4f 61 6c 53   = pState->iOalS
1bf80 7a 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  z;.      }.    }
1bf90 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
1bfa0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
1bfb0 20 70 2d 3e 65 53 74 61 67 65 21 3d 30 20 29 3b   p->eStage!=0 );
1bfc0 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d  ..    if( p->rc=
1bfd0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d  =SQLITE_OK && p-
1bfe0 3e 70 54 61 72 67 65 74 46 64 2d 3e 70 57 61 6c  >pTargetFd->pWal
1bff0 46 64 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  Fd ){.      if( 
1c000 70 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53  p->eStage==RBU_S
1c010 54 41 47 45 5f 4f 41 4c 20 29 7b 0a 20 20 20 20  TAGE_OAL ){.    
1c020 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
1c030 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
1c040 20 20 70 2d 3e 7a 45 72 72 6d 73 67 20 3d 20 73    p->zErrmsg = s
1c050 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
1c060 63 61 6e 6e 6f 74 20 75 70 64 61 74 65 20 77 61  cannot update wa
1c070 6c 20 6d 6f 64 65 20 64 61 74 61 62 61 73 65 22  l mode database"
1c080 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
1c090 66 28 20 70 2d 3e 65 53 74 61 67 65 3d 3d 52 42  f( p->eStage==RB
1c0a0 55 5f 53 54 41 47 45 5f 4d 4f 56 45 20 29 7b 0a  U_STAGE_MOVE ){.
1c0b0 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 67          p->eStag
1c0c0 65 20 3d 20 52 42 55 5f 53 54 41 47 45 5f 43 4b  e = RBU_STAGE_CK
1c0d0 50 54 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e  PT;.        p->n
1c0e0 53 74 65 70 20 3d 20 30 3b 0a 20 20 20 20 20 20  Step = 0;.      
1c0f0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  }.    }..    if(
1c100 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1c110 4b 20 0a 20 20 20 20 20 26 26 20 28 70 2d 3e 65  K .     && (p->e
1c120 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45  Stage==RBU_STAGE
1c130 5f 4f 41 4c 20 7c 7c 20 70 2d 3e 65 53 74 61 67  _OAL || p->eStag
1c140 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4d 4f 56  e==RBU_STAGE_MOV
1c150 45 29 0a 20 20 20 20 20 26 26 20 70 53 74 61 74  E).     && pStat
1c160 65 2d 3e 65 53 74 61 67 65 21 3d 30 0a 20 20 20  e->eStage!=0.   
1c170 20 29 7b 0a 20 20 20 20 20 20 72 62 75 5f 66 69   ){.      rbu_fi
1c180 6c 65 20 2a 70 46 64 20 3d 20 28 72 62 75 49 73  le *pFd = (rbuIs
1c190 56 61 63 75 75 6d 28 70 29 20 3f 20 70 2d 3e 70  Vacuum(p) ? p->p
1c1a0 52 62 75 46 64 20 3a 20 70 2d 3e 70 54 61 72 67  RbuFd : p->pTarg
1c1b0 65 74 46 64 29 3b 0a 20 20 20 20 20 20 69 66 28  etFd);.      if(
1c1c0 20 70 46 64 2d 3e 69 43 6f 6f 6b 69 65 21 3d 70   pFd->iCookie!=p
1c1d0 53 74 61 74 65 2d 3e 69 43 6f 6f 6b 69 65 20 29  State->iCookie )
1c1e0 7b 20 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20  {   .        /* 
1c1f0 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 28 70  At this point (p
1c200 54 61 72 67 65 74 46 64 2d 3e 69 43 6f 6f 6b 69  TargetFd->iCooki
1c210 65 29 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  e) contains the 
1c220 76 61 6c 75 65 20 6f 66 20 74 68 65 0a 20 20 20  value of the.   
1c230 20 20 20 20 20 2a 2a 20 63 68 61 6e 67 65 2d 63       ** change-c
1c240 6f 75 6e 74 65 72 20 63 6f 6f 6b 69 65 20 28 74  ounter cookie (t
1c250 68 65 20 74 68 69 6e 67 20 74 68 61 74 20 67 65  he thing that ge
1c260 74 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77  ts incremented w
1c270 68 65 6e 20 61 20 0a 20 20 20 20 20 20 20 20 2a  hen a .        *
1c280 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  * transaction is
1c290 20 63 6f 6d 6d 69 74 74 65 64 20 69 6e 20 72 6f   committed in ro
1c2a0 6c 6c 62 61 63 6b 20 6d 6f 64 65 29 20 63 75 72  llback mode) cur
1c2b0 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 6f 6e  rently stored on
1c2c0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67   .        ** pag
1c2d0 65 20 31 20 6f 66 20 74 68 65 20 64 61 74 61 62  e 1 of the datab
1c2e0 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  ase file. */.   
1c2f0 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c       p->rc = SQL
1c300 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
1c310 20 20 70 2d 3e 7a 45 72 72 6d 73 67 20 3d 20 73    p->zErrmsg = s
1c320 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
1c330 64 61 74 61 62 61 73 65 20 6d 6f 64 69 66 69 65  database modifie
1c340 64 20 64 75 72 69 6e 67 20 72 62 75 20 25 73 22  d during rbu %s"
1c350 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 72  ,.            (r
1c360 62 75 49 73 56 61 63 75 75 6d 28 70 29 20 3f 20  buIsVacuum(p) ? 
1c370 22 76 61 63 75 75 6d 22 20 3a 20 22 75 70 64 61  "vacuum" : "upda
1c380 74 65 22 29 0a 20 20 20 20 20 20 20 20 29 3b 0a  te").        );.
1c390 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1c3a0 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
1c3b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1c3c0 20 69 66 28 20 70 2d 3e 65 53 74 61 67 65 3d 3d   if( p->eStage==
1c3d0 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20 29 7b  RBU_STAGE_OAL ){
1c3e0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1c3f0 20 2a 64 62 20 3d 20 70 2d 3e 64 62 4d 61 69 6e   *db = p->dbMain
1c400 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ;..        if( p
1c410 53 74 61 74 65 2d 3e 65 53 74 61 67 65 3d 3d 30  State->eStage==0
1c420 20 26 26 20 72 62 75 49 73 56 61 63 75 75 6d 28   && rbuIsVacuum(
1c430 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  p) ){.          
1c440 72 62 75 43 6f 70 79 50 72 61 67 6d 61 28 70 2c  rbuCopyPragma(p,
1c450 20 22 70 61 67 65 5f 73 69 7a 65 22 29 3b 0a 20   "page_size");. 
1c460 20 20 20 20 20 20 20 20 20 72 62 75 43 6f 70 79           rbuCopy
1c470 50 72 61 67 6d 61 28 70 2c 20 22 61 75 74 6f 5f  Pragma(p, "auto_
1c480 76 61 63 75 75 6d 22 29 3b 0a 20 20 20 20 20 20  vacuum");.      
1c490 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
1c4a0 4f 70 65 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e  Open transaction
1c4b0 73 20 62 6f 74 68 20 64 61 74 61 62 61 73 65 73  s both databases
1c4c0 2e 20 54 68 65 20 2a 2d 6f 61 6c 20 66 69 6c 65  . The *-oal file
1c4d0 20 69 73 20 6f 70 65 6e 65 64 20 6f 72 0a 20 20   is opened or.  
1c4e0 20 20 20 20 20 20 2a 2a 20 63 72 65 61 74 65 64        ** created
1c4f0 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2e 20   at this point. 
1c500 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  */.        if( p
1c510 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
1c520 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ){.          p->
1c530 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65  rc = sqlite3_exe
1c540 63 28 64 62 2c 20 22 42 45 47 49 4e 20 49 4d 4d  c(db, "BEGIN IMM
1c550 45 44 49 41 54 45 22 2c 20 30 2c 20 30 2c 20 26  EDIATE", 0, 0, &
1c560 70 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a 20 20 20  p->zErrmsg);.   
1c570 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
1c580 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
1c590 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1c5a0 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33   p->rc = sqlite3
1c5b0 5f 65 78 65 63 28 70 2d 3e 64 62 52 62 75 2c 20  _exec(p->dbRbu, 
1c5c0 22 42 45 47 49 4e 22 2c 20 30 2c 20 30 2c 20 26  "BEGIN", 0, 0, &
1c5d0 70 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a 20 20 20  p->zErrmsg);.   
1c5e0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
1c5f0 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20  /* Check if the 
1c600 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 69 73  main database is
1c610 20 61 20 7a 69 70 76 66 73 20 64 62 2e 20 49 66   a zipvfs db. If
1c620 20 69 74 20 69 73 2c 20 73 65 74 20 74 68 65 20   it is, set the 
1c630 75 70 70 65 72 0a 20 20 20 20 20 20 20 20 2a 2a  upper.        **
1c640 20 6c 65 76 65 6c 20 70 61 67 65 72 20 74 6f 20   level pager to 
1c650 75 73 65 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  use "journal_mod
1c660 65 3d 6f 66 66 22 2e 20 54 68 69 73 20 70 72 65  e=off". This pre
1c670 76 65 6e 74 73 20 69 74 20 66 72 6f 6d 20 0a 20  vents it from . 
1c680 20 20 20 20 20 20 20 2a 2a 20 67 65 6e 65 72 61         ** genera
1c690 74 69 6e 67 20 61 20 6c 61 72 67 65 20 6a 6f 75  ting a large jou
1c6a0 72 6e 61 6c 20 75 73 69 6e 67 20 61 20 74 65 6d  rnal using a tem
1c6b0 70 20 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 20 20  p file.  */.    
1c6c0 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
1c6d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1c6e0 20 20 20 20 20 20 69 6e 74 20 66 72 63 20 3d 20        int frc = 
1c6f0 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
1c700 74 72 6f 6c 28 64 62 2c 20 22 6d 61 69 6e 22 2c  trol(db, "main",
1c710 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 5a 49   SQLITE_FCNTL_ZI
1c720 50 56 46 53 2c 20 30 29 3b 0a 20 20 20 20 20 20  PVFS, 0);.      
1c730 20 20 20 20 69 66 28 20 66 72 63 3d 3d 53 51 4c      if( frc==SQL
1c740 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1c750 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71        p->rc = sq
1c760 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20 22  lite3_exec(db, "
1c770 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
1c780 6f 64 65 3d 6f 66 66 22 2c 30 2c 30 2c 26 70 2d  ode=off",0,0,&p-
1c790 3e 7a 45 72 72 6d 73 67 29 3b 0a 20 20 20 20 20  >zErrmsg);.     
1c7a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
1c7b0 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69  ..        /* Poi
1c7c0 6e 74 20 74 68 65 20 6f 62 6a 65 63 74 20 69 74  nt the object it
1c7d0 65 72 61 74 6f 72 20 61 74 20 74 68 65 20 66 69  erator at the fi
1c7e0 72 73 74 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  rst object */.  
1c7f0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
1c800 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1c810 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
1c820 72 62 75 4f 62 6a 49 74 65 72 46 69 72 73 74 28  rbuObjIterFirst(
1c830 70 2c 20 26 70 2d 3e 6f 62 6a 69 74 65 72 29 3b  p, &p->objiter);
1c840 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
1c850 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 52 42      /* If the RB
1c860 55 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61  U database conta
1c870 69 6e 73 20 6e 6f 20 64 61 74 61 5f 78 78 78 20  ins no data_xxx 
1c880 74 61 62 6c 65 73 2c 20 64 65 63 6c 61 72 65 20  tables, declare 
1c890 74 68 65 20 52 42 55 0a 20 20 20 20 20 20 20 20  the RBU.        
1c8a0 2a 2a 20 75 70 64 61 74 65 20 66 69 6e 69 73 68  ** update finish
1c8b0 65 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ed.  */.        
1c8c0 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
1c8d0 45 5f 4f 4b 20 26 26 20 70 2d 3e 6f 62 6a 69 74  E_OK && p->objit
1c8e0 65 72 2e 7a 54 62 6c 3d 3d 30 20 29 7b 0a 20 20  er.zTbl==0 ){.  
1c8f0 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
1c900 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
1c910 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
1c920 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
1c930 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1c940 20 20 72 62 75 53 65 74 75 70 4f 61 6c 28 70 2c    rbuSetupOal(p,
1c950 20 70 53 74 61 74 65 29 3b 0a 20 20 20 20 20 20   pState);.      
1c960 20 20 7d 0a 0a 20 20 20 20 20 20 7d 65 6c 73 65    }..      }else
1c970 20 69 66 28 20 70 2d 3e 65 53 74 61 67 65 3d 3d   if( p->eStage==
1c980 52 42 55 5f 53 54 41 47 45 5f 4d 4f 56 45 20 29  RBU_STAGE_MOVE )
1c990 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6e 6f 2d  {.        /* no-
1c9a0 6f 70 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73  op */.      }els
1c9b0 65 20 69 66 28 20 70 2d 3e 65 53 74 61 67 65 3d  e if( p->eStage=
1c9c0 3d 52 42 55 5f 53 54 41 47 45 5f 43 4b 50 54 20  =RBU_STAGE_CKPT 
1c9d0 29 7b 0a 20 20 20 20 20 20 20 20 72 62 75 53 65  ){.        rbuSe
1c9e0 74 75 70 43 68 65 63 6b 70 6f 69 6e 74 28 70 2c  tupCheckpoint(p,
1c9f0 20 70 53 74 61 74 65 29 3b 0a 20 20 20 20 20 20   pState);.      
1ca00 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 65 53 74  }else if( p->eSt
1ca10 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 44  age==RBU_STAGE_D
1ca20 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ONE ){.        p
1ca30 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f  ->rc = SQLITE_DO
1ca40 4e 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  NE;.      }else{
1ca50 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  .        p->rc =
1ca60 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b   SQLITE_CORRUPT;
1ca70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1ca80 20 20 20 20 72 62 75 46 72 65 65 53 74 61 74 65      rbuFreeState
1ca90 28 70 53 74 61 74 65 29 3b 0a 20 20 7d 0a 0a 20  (pState);.  }.. 
1caa0 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
1cab0 0a 2a 2a 20 4f 70 65 6e 20 61 6e 64 20 72 65 74  .** Open and ret
1cac0 75 72 6e 20 61 20 6e 65 77 20 52 42 55 20 68 61  urn a new RBU ha
1cad0 6e 64 6c 65 2e 20 0a 2a 2f 0a 73 71 6c 69 74 65  ndle. .*/.sqlite
1cae0 33 72 62 75 20 2a 73 71 6c 69 74 65 33 72 62 75  3rbu *sqlite3rbu
1caf0 5f 6f 70 65 6e 28 0a 20 20 63 6f 6e 73 74 20 63  _open(.  const c
1cb00 68 61 72 20 2a 7a 54 61 72 67 65 74 2c 20 0a 20  har *zTarget, . 
1cb10 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 62   const char *zRb
1cb20 75 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  u,.  const char 
1cb30 2a 7a 53 74 61 74 65 0a 29 7b 0a 20 20 2f 2a 20  *zState.){.  /* 
1cb40 54 4f 44 4f 3a 20 43 68 65 63 6b 20 74 68 61 74  TODO: Check that
1cb50 20 7a 54 61 72 67 65 74 20 61 6e 64 20 7a 52 62   zTarget and zRb
1cb60 75 20 61 72 65 20 6e 6f 6e 2d 4e 55 4c 4c 20 2a  u are non-NULL *
1cb70 2f 0a 20 20 72 65 74 75 72 6e 20 6f 70 65 6e 52  /.  return openR
1cb80 62 75 48 61 6e 64 6c 65 28 7a 54 61 72 67 65 74  buHandle(zTarget
1cb90 2c 20 7a 52 62 75 2c 20 7a 53 74 61 74 65 29 3b  , zRbu, zState);
1cba0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  .}../*.** Open a
1cbb0 20 68 61 6e 64 6c 65 20 74 6f 20 62 65 67 69 6e   handle to begin
1cbc0 20 6f 72 20 72 65 73 75 6d 65 20 61 6e 20 52 42   or resume an RB
1cbd0 55 20 56 41 43 55 55 4d 20 6f 70 65 72 61 74 69  U VACUUM operati
1cbe0 6f 6e 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 72 62  on..*/.sqlite3rb
1cbf0 75 20 2a 73 71 6c 69 74 65 33 72 62 75 5f 76 61  u *sqlite3rbu_va
1cc00 63 75 75 6d 28 0a 20 20 63 6f 6e 73 74 20 63 68  cuum(.  const ch
1cc10 61 72 20 2a 7a 54 61 72 67 65 74 2c 20 0a 20 20  ar *zTarget, .  
1cc20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 61  const char *zSta
1cc30 74 65 0a 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a  te.){.  /* TODO:
1cc40 20 43 68 65 63 6b 20 74 68 61 74 20 62 6f 74 68   Check that both
1cc50 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 6e   arguments are n
1cc60 6f 6e 2d 4e 55 4c 4c 20 2a 2f 0a 20 20 72 65 74  on-NULL */.  ret
1cc70 75 72 6e 20 6f 70 65 6e 52 62 75 48 61 6e 64 6c  urn openRbuHandl
1cc80 65 28 30 2c 20 7a 54 61 72 67 65 74 2c 20 7a 53  e(0, zTarget, zS
1cc90 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tate);.}../*.** 
1cca0 52 65 74 75 72 6e 20 74 68 65 20 64 61 74 61 62  Return the datab
1ccb0 61 73 65 20 68 61 6e 64 6c 65 20 75 73 65 64 20  ase handle used 
1ccc0 62 79 20 70 52 62 75 2e 0a 2a 2f 0a 73 71 6c 69  by pRbu..*/.sqli
1ccd0 74 65 33 20 2a 73 71 6c 69 74 65 33 72 62 75 5f  te3 *sqlite3rbu_
1cce0 64 62 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70  db(sqlite3rbu *p
1ccf0 52 62 75 2c 20 69 6e 74 20 62 52 62 75 29 7b 0a  Rbu, int bRbu){.
1cd00 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1cd10 30 3b 0a 20 20 69 66 28 20 70 52 62 75 20 29 7b  0;.  if( pRbu ){
1cd20 0a 20 20 20 20 64 62 20 3d 20 28 62 52 62 75 20  .    db = (bRbu 
1cd30 3f 20 70 52 62 75 2d 3e 64 62 52 62 75 20 3a 20  ? pRbu->dbRbu : 
1cd40 70 52 62 75 2d 3e 64 62 4d 61 69 6e 29 3b 0a 20  pRbu->dbMain);. 
1cd50 20 7d 0a 20 20 72 65 74 75 72 6e 20 64 62 3b 0a   }.  return db;.
1cd60 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  }.../*.** If the
1cd70 20 65 72 72 6f 72 20 63 6f 64 65 20 63 75 72 72   error code curr
1cd80 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20  ently stored in 
1cd90 74 68 65 20 52 42 55 20 68 61 6e 64 6c 65 20 69  the RBU handle i
1cda0 73 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  s SQLITE_CONSTRA
1cdb0 49 4e 54 2c 0a 2a 2a 20 74 68 65 6e 20 65 64 69  INT,.** then edi
1cdc0 74 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73  t any error mess
1cdd0 61 67 65 20 73 74 72 69 6e 67 20 73 6f 20 61 73  age string so as
1cde0 20 74 6f 20 72 65 6d 6f 76 65 20 61 6c 6c 20 6f   to remove all o
1cdf0 63 63 75 72 72 65 6e 63 65 73 20 6f 66 0a 2a 2a  ccurrences of.**
1ce00 20 74 68 65 20 70 61 74 74 65 72 6e 20 22 72 62   the pattern "rb
1ce10 75 5f 69 6d 70 5f 5b 30 2d 39 5d 2a 22 2e 0a 2a  u_imp_[0-9]*"..*
1ce20 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62  /.static void rb
1ce30 75 45 64 69 74 45 72 72 6d 73 67 28 73 71 6c 69  uEditErrmsg(sqli
1ce40 74 65 33 72 62 75 20 2a 70 29 7b 0a 20 20 69 66  te3rbu *p){.  if
1ce50 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
1ce60 43 4f 4e 53 54 52 41 49 4e 54 20 26 26 20 70 2d  CONSTRAINT && p-
1ce70 3e 7a 45 72 72 6d 73 67 20 29 7b 0a 20 20 20 20  >zErrmsg ){.    
1ce80 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a  unsigned int i;.
1ce90 20 20 20 20 73 69 7a 65 5f 74 20 6e 45 72 72 6d      size_t nErrm
1cea0 73 67 20 3d 20 73 74 72 6c 65 6e 28 70 2d 3e 7a  sg = strlen(p->z
1ceb0 45 72 72 6d 73 67 29 3b 0a 20 20 20 20 66 6f 72  Errmsg);.    for
1cec0 28 69 3d 30 3b 20 69 3c 28 6e 45 72 72 6d 73 67  (i=0; i<(nErrmsg
1ced0 2d 38 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  -8); i++){.     
1cee0 20 69 66 28 20 6d 65 6d 63 6d 70 28 26 70 2d 3e   if( memcmp(&p->
1cef0 7a 45 72 72 6d 73 67 5b 69 5d 2c 20 22 72 62 75  zErrmsg[i], "rbu
1cf00 5f 69 6d 70 5f 22 2c 20 38 29 3d 3d 30 20 29 7b  _imp_", 8)==0 ){
1cf10 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 44 65  .        int nDe
1cf20 6c 20 3d 20 38 3b 0a 20 20 20 20 20 20 20 20 77  l = 8;.        w
1cf30 68 69 6c 65 28 20 70 2d 3e 7a 45 72 72 6d 73 67  hile( p->zErrmsg
1cf40 5b 69 2b 6e 44 65 6c 5d 3e 3d 27 30 27 20 26 26  [i+nDel]>='0' &&
1cf50 20 70 2d 3e 7a 45 72 72 6d 73 67 5b 69 2b 6e 44   p->zErrmsg[i+nD
1cf60 65 6c 5d 3c 3d 27 39 27 20 29 20 6e 44 65 6c 2b  el]<='9' ) nDel+
1cf70 2b 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 6d 6f  +;.        memmo
1cf80 76 65 28 26 70 2d 3e 7a 45 72 72 6d 73 67 5b 69  ve(&p->zErrmsg[i
1cf90 5d 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 5b 69  ], &p->zErrmsg[i
1cfa0 2b 6e 44 65 6c 5d 2c 20 6e 45 72 72 6d 73 67 20  +nDel], nErrmsg 
1cfb0 2b 20 31 20 2d 20 69 20 2d 20 6e 44 65 6c 29 3b  + 1 - i - nDel);
1cfc0 0a 20 20 20 20 20 20 20 20 6e 45 72 72 6d 73 67  .        nErrmsg
1cfd0 20 2d 3d 20 6e 44 65 6c 3b 0a 20 20 20 20 20 20   -= nDel;.      
1cfe0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
1cff0 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 52  *.** Close the R
1d000 42 55 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e  BU handle..*/.in
1d010 74 20 73 71 6c 69 74 65 33 72 62 75 5f 63 6c 6f  t sqlite3rbu_clo
1d020 73 65 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70  se(sqlite3rbu *p
1d030 2c 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 6d 73  , char **pzErrms
1d040 67 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  g){.  int rc;.  
1d050 69 66 28 20 70 20 29 7b 0a 0a 20 20 20 20 2f 2a  if( p ){..    /*
1d060 20 43 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e   Commit the tran
1d070 73 61 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 2a  saction to the *
1d080 2d 6f 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  -oal file. */.  
1d090 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
1d0a0 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 65 53 74  ITE_OK && p->eSt
1d0b0 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4f  age==RBU_STAGE_O
1d0c0 41 4c 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72  AL ){.      p->r
1d0d0 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  c = sqlite3_exec
1d0e0 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 43 4f 4d  (p->dbMain, "COM
1d0f0 4d 49 54 22 2c 20 30 2c 20 30 2c 20 26 70 2d 3e  MIT", 0, 0, &p->
1d100 7a 45 72 72 6d 73 67 29 3b 0a 20 20 20 20 7d 0a  zErrmsg);.    }.
1d110 0a 20 20 20 20 72 62 75 53 61 76 65 53 74 61 74  .    rbuSaveStat
1d120 65 28 70 2c 20 70 2d 3e 65 53 74 61 67 65 29 3b  e(p, p->eStage);
1d130 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d  ..    if( p->rc=
1d140 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d  =SQLITE_OK && p-
1d150 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41  >eStage==RBU_STA
1d160 47 45 5f 4f 41 4c 20 29 7b 0a 20 20 20 20 20 20  GE_OAL ){.      
1d170 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  p->rc = sqlite3_
1d180 65 78 65 63 28 70 2d 3e 64 62 52 62 75 2c 20 22  exec(p->dbRbu, "
1d190 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 2c 20 26  COMMIT", 0, 0, &
1d1a0 70 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a 20 20 20  p->zErrmsg);.   
1d1b0 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6c 6f 73 65   }..    /* Close
1d1c0 20 61 6e 79 20 6f 70 65 6e 20 73 74 61 74 65 6d   any open statem
1d1d0 65 6e 74 20 68 61 6e 64 6c 65 73 2e 20 2a 2f 0a  ent handles. */.
1d1e0 20 20 20 20 72 62 75 4f 62 6a 49 74 65 72 46 69      rbuObjIterFi
1d1f0 6e 61 6c 69 7a 65 28 26 70 2d 3e 6f 62 6a 69 74  nalize(&p->objit
1d200 65 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  er);..    /* If 
1d210 74 68 69 73 20 69 73 20 61 6e 20 52 42 55 20 76  this is an RBU v
1d220 61 63 75 75 6d 20 68 61 6e 64 6c 65 20 61 6e 64  acuum handle and
1d230 20 74 68 65 20 76 61 63 75 75 6d 20 68 61 73 20   the vacuum has 
1d240 65 69 74 68 65 72 20 66 69 6e 69 73 68 65 64 0a  either finished.
1d250 20 20 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75      ** successfu
1d260 6c 6c 79 20 6f 72 20 65 6e 63 6f 75 6e 74 65 72  lly or encounter
1d270 65 64 20 61 6e 20 65 72 72 6f 72 2c 20 64 65 6c  ed an error, del
1d280 65 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ete the contents
1d290 20 6f 66 20 74 68 65 20 0a 20 20 20 20 2a 2a 20   of the .    ** 
1d2a0 73 74 61 74 65 20 74 61 62 6c 65 2e 20 54 68 69  state table. Thi
1d2b0 73 20 63 61 75 73 65 73 20 74 68 65 20 6e 65 78  s causes the nex
1d2c0 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  t call to sqlite
1d2d0 33 72 62 75 5f 76 61 63 75 75 6d 28 29 20 0a 20  3rbu_vacuum() . 
1d2e0 20 20 20 2a 2a 20 73 70 65 63 69 66 79 69 6e 67     ** specifying
1d2f0 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 72   the current tar
1d300 67 65 74 20 61 6e 64 20 73 74 61 74 65 20 64 61  get and state da
1d310 74 61 62 61 73 65 73 20 74 6f 20 73 74 61 72 74  tabases to start
1d320 20 61 20 6e 65 77 0a 20 20 20 20 2a 2a 20 76 61   a new.    ** va
1d330 63 75 75 6d 20 66 72 6f 6d 20 73 63 72 61 74 63  cuum from scratc
1d340 68 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  h.  */.    if( r
1d350 62 75 49 73 56 61 63 75 75 6d 28 70 29 20 26 26  buIsVacuum(p) &&
1d360 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f   p->rc!=SQLITE_O
1d370 4b 20 26 26 20 70 2d 3e 64 62 52 62 75 20 29 7b  K && p->dbRbu ){
1d380 0a 20 20 20 20 20 20 69 6e 74 20 72 63 32 20 3d  .      int rc2 =
1d390 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d   sqlite3_exec(p-
1d3a0 3e 64 62 52 62 75 2c 20 22 44 45 4c 45 54 45 20  >dbRbu, "DELETE 
1d3b0 46 52 4f 4d 20 73 74 61 74 2e 72 62 75 5f 73 74  FROM stat.rbu_st
1d3c0 61 74 65 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  ate", 0, 0, 0);.
1d3d0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
1d3e0 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 26 26 20  =SQLITE_DONE && 
1d3f0 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  rc2!=SQLITE_OK )
1d400 20 70 2d 3e 72 63 20 3d 20 72 63 32 3b 0a 20 20   p->rc = rc2;.  
1d410 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6c 6f 73    }..    /* Clos
1d420 65 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62  e the open datab
1d430 61 73 65 20 68 61 6e 64 6c 65 20 61 6e 64 20 56  ase handle and V
1d440 46 53 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20  FS object. */.  
1d450 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28    sqlite3_close(
1d460 70 2d 3e 64 62 52 62 75 29 3b 0a 20 20 20 20 73  p->dbRbu);.    s
1d470 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 2d 3e  qlite3_close(p->
1d480 64 62 4d 61 69 6e 29 3b 0a 20 20 20 20 72 62 75  dbMain);.    rbu
1d490 44 65 6c 65 74 65 56 66 73 28 70 29 3b 0a 20 20  DeleteVfs(p);.  
1d4a0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1d4b0 2d 3e 61 42 75 66 29 3b 0a 20 20 20 20 73 71 6c  ->aBuf);.    sql
1d4c0 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 46 72  ite3_free(p->aFr
1d4d0 61 6d 65 29 3b 0a 0a 20 20 20 20 72 62 75 45 64  ame);..    rbuEd
1d4e0 69 74 45 72 72 6d 73 67 28 70 29 3b 0a 20 20 20  itErrmsg(p);.   
1d4f0 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 20   rc = p->rc;.   
1d500 20 2a 70 7a 45 72 72 6d 73 67 20 3d 20 70 2d 3e   *pzErrmsg = p->
1d510 7a 45 72 72 6d 73 67 3b 0a 20 20 20 20 73 71 6c  zErrmsg;.    sql
1d520 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
1d530 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
1d540 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
1d550 20 20 2a 70 7a 45 72 72 6d 73 67 20 3d 20 30 3b    *pzErrmsg = 0;
1d560 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1d570 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1d580 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  n the total numb
1d590 65 72 20 6f 66 20 6b 65 79 2d 76 61 6c 75 65 20  er of key-value 
1d5a0 6f 70 65 72 61 74 69 6f 6e 73 20 28 69 6e 73 65  operations (inse
1d5b0 72 74 73 2c 20 64 65 6c 65 74 65 73 20 6f 72 20  rts, deletes or 
1d5c0 0a 2a 2a 20 75 70 64 61 74 65 73 29 20 74 68 61  .** updates) tha
1d5d0 74 20 68 61 76 65 20 62 65 65 6e 20 70 65 72 66  t have been perf
1d5e0 6f 72 6d 65 64 20 6f 6e 20 74 68 65 20 74 61 72  ormed on the tar
1d5f0 67 65 74 20 64 61 74 61 62 61 73 65 20 73 69 6e  get database sin
1d600 63 65 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e  ce the.** curren
1d610 74 20 52 42 55 20 75 70 64 61 74 65 20 77 61 73  t RBU update was
1d620 20 73 74 61 72 74 65 64 2e 0a 2a 2f 0a 73 71 6c   started..*/.sql
1d630 69 74 65 33 5f 69 6e 74 36 34 20 73 71 6c 69 74  ite3_int64 sqlit
1d640 65 33 72 62 75 5f 70 72 6f 67 72 65 73 73 28 73  e3rbu_progress(s
1d650 71 6c 69 74 65 33 72 62 75 20 2a 70 52 62 75 29  qlite3rbu *pRbu)
1d660 7b 0a 20 20 72 65 74 75 72 6e 20 70 52 62 75 2d  {.  return pRbu-
1d670 3e 6e 50 72 6f 67 72 65 73 73 3b 0a 7d 0a 0a 2f  >nProgress;.}../
1d680 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 70 65 72 6d  *.** Return perm
1d690 79 72 69 61 64 61 67 65 20 70 72 6f 67 72 65 73  yriadage progres
1d6a0 73 20 69 6e 64 69 63 61 74 69 6f 6e 73 20 66 6f  s indications fo
1d6b0 72 20 74 68 65 20 74 77 6f 20 6d 61 69 6e 20 73  r the two main s
1d6c0 74 61 67 65 73 20 6f 66 0a 2a 2a 20 61 6e 20 52  tages of.** an R
1d6d0 42 55 20 75 70 64 61 74 65 2e 0a 2a 2f 0a 76 6f  BU update..*/.vo
1d6e0 69 64 20 73 71 6c 69 74 65 33 72 62 75 5f 62 70  id sqlite3rbu_bp
1d6f0 5f 70 72 6f 67 72 65 73 73 28 73 71 6c 69 74 65  _progress(sqlite
1d700 33 72 62 75 20 2a 70 2c 20 69 6e 74 20 2a 70 6e  3rbu *p, int *pn
1d710 4f 6e 65 2c 20 69 6e 74 20 2a 70 6e 54 77 6f 29  One, int *pnTwo)
1d720 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 4d 41  {.  const int MA
1d730 58 5f 50 52 4f 47 52 45 53 53 20 3d 20 31 30 30  X_PROGRESS = 100
1d740 30 30 3b 0a 20 20 73 77 69 74 63 68 28 20 70 2d  00;.  switch( p-
1d750 3e 65 53 74 61 67 65 20 29 7b 0a 20 20 20 20 63  >eStage ){.    c
1d760 61 73 65 20 52 42 55 5f 53 54 41 47 45 5f 4f 41  ase RBU_STAGE_OA
1d770 4c 3a 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  L:.      if( p->
1d780 6e 50 68 61 73 65 4f 6e 65 53 74 65 70 3e 30 20  nPhaseOneStep>0 
1d790 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 6e 4f 6e  ){.        *pnOn
1d7a0 65 20 3d 20 28 69 6e 74 29 28 4d 41 58 5f 50 52  e = (int)(MAX_PR
1d7b0 4f 47 52 45 53 53 20 2a 20 28 69 36 34 29 70 2d  OGRESS * (i64)p-
1d7c0 3e 6e 50 72 6f 67 72 65 73 73 2f 28 69 36 34 29  >nProgress/(i64)
1d7d0 70 2d 3e 6e 50 68 61 73 65 4f 6e 65 53 74 65 70  p->nPhaseOneStep
1d7e0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
1d7f0 20 20 20 20 20 20 20 20 2a 70 6e 4f 6e 65 20 3d          *pnOne =
1d800 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   -1;.      }.   
1d810 20 20 20 2a 70 6e 54 77 6f 20 3d 20 30 3b 0a 20     *pnTwo = 0;. 
1d820 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
1d830 20 63 61 73 65 20 52 42 55 5f 53 54 41 47 45 5f   case RBU_STAGE_
1d840 4d 4f 56 45 3a 0a 20 20 20 20 20 20 2a 70 6e 4f  MOVE:.      *pnO
1d850 6e 65 20 3d 20 4d 41 58 5f 50 52 4f 47 52 45 53  ne = MAX_PROGRES
1d860 53 3b 0a 20 20 20 20 20 20 2a 70 6e 54 77 6f 20  S;.      *pnTwo 
1d870 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = 0;.      break
1d880 3b 0a 0a 20 20 20 20 63 61 73 65 20 52 42 55 5f  ;..    case RBU_
1d890 53 54 41 47 45 5f 43 4b 50 54 3a 0a 20 20 20 20  STAGE_CKPT:.    
1d8a0 20 20 2a 70 6e 4f 6e 65 20 3d 20 4d 41 58 5f 50    *pnOne = MAX_P
1d8b0 52 4f 47 52 45 53 53 3b 0a 20 20 20 20 20 20 2a  ROGRESS;.      *
1d8c0 70 6e 54 77 6f 20 3d 20 28 69 6e 74 29 28 4d 41  pnTwo = (int)(MA
1d8d0 58 5f 50 52 4f 47 52 45 53 53 20 2a 20 28 69 36  X_PROGRESS * (i6
1d8e0 34 29 70 2d 3e 6e 53 74 65 70 20 2f 20 28 69 36  4)p->nStep / (i6
1d8f0 34 29 70 2d 3e 6e 46 72 61 6d 65 29 3b 0a 20 20  4)p->nFrame);.  
1d900 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
1d910 63 61 73 65 20 52 42 55 5f 53 54 41 47 45 5f 44  case RBU_STAGE_D
1d920 4f 4e 45 3a 0a 20 20 20 20 20 20 2a 70 6e 4f 6e  ONE:.      *pnOn
1d930 65 20 3d 20 4d 41 58 5f 50 52 4f 47 52 45 53 53  e = MAX_PROGRESS
1d940 3b 0a 20 20 20 20 20 20 2a 70 6e 54 77 6f 20 3d  ;.      *pnTwo =
1d950 20 4d 41 58 5f 50 52 4f 47 52 45 53 53 3b 0a 20   MAX_PROGRESS;. 
1d960 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
1d970 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
1d980 61 73 73 65 72 74 28 20 30 20 29 3b 0a 20 20 7d  assert( 0 );.  }
1d990 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 72  .}..int sqlite3r
1d9a0 62 75 5f 73 61 76 65 73 74 61 74 65 28 73 71 6c  bu_savestate(sql
1d9b0 69 74 65 33 72 62 75 20 2a 70 29 7b 0a 20 20 69  ite3rbu *p){.  i
1d9c0 6e 74 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 20  nt rc = p->rc;. 
1d9d0 20 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49   .  if( rc==SQLI
1d9e0 54 45 5f 44 4f 4e 45 20 29 20 72 65 74 75 72 6e  TE_DONE ) return
1d9f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
1da00 73 73 65 72 74 28 20 70 2d 3e 65 53 74 61 67 65  ssert( p->eStage
1da10 3e 3d 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20  >=RBU_STAGE_OAL 
1da20 26 26 20 70 2d 3e 65 53 74 61 67 65 3c 3d 52 42  && p->eStage<=RB
1da30 55 5f 53 54 41 47 45 5f 44 4f 4e 45 20 29 3b 0a  U_STAGE_DONE );.
1da40 20 20 69 66 28 20 70 2d 3e 65 53 74 61 67 65 3d    if( p->eStage=
1da50 3d 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20 29  =RBU_STAGE_OAL )
1da60 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  {.    assert( rc
1da70 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  !=SQLITE_DONE );
1da80 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1da90 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 73 71  ITE_OK ) rc = sq
1daa0 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62  lite3_exec(p->db
1dab0 4d 61 69 6e 2c 20 22 43 4f 4d 4d 49 54 22 2c 20  Main, "COMMIT", 
1dac0 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20  0, 0, 0);.  }.. 
1dad0 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 72   p->rc = rc;.  r
1dae0 62 75 53 61 76 65 53 74 61 74 65 28 70 2c 20 70  buSaveState(p, p
1daf0 2d 3e 65 53 74 61 67 65 29 3b 0a 20 20 72 63 20  ->eStage);.  rc 
1db00 3d 20 70 2d 3e 72 63 3b 0a 0a 20 20 69 66 28 20  = p->rc;..  if( 
1db10 70 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53  p->eStage==RBU_S
1db20 54 41 47 45 5f 4f 41 4c 20 29 7b 0a 20 20 20 20  TAGE_OAL ){.    
1db30 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
1db40 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69  TE_DONE );.    i
1db50 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1db60 20 29 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f   ) rc = sqlite3_
1db70 65 78 65 63 28 70 2d 3e 64 62 52 62 75 2c 20 22  exec(p->dbRbu, "
1db80 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 2c 20 30  COMMIT", 0, 0, 0
1db90 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1dba0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20  QLITE_OK ) rc = 
1dbb0 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e  sqlite3_exec(p->
1dbc0 64 62 52 62 75 2c 20 22 42 45 47 49 4e 20 49 4d  dbRbu, "BEGIN IM
1dbd0 4d 45 44 49 41 54 45 22 2c 20 30 2c 20 30 2c 20  MEDIATE", 0, 0, 
1dbe0 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  0);.    if( rc==
1dbf0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d  SQLITE_OK ) rc =
1dc00 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d   sqlite3_exec(p-
1dc10 3e 64 62 4d 61 69 6e 2c 20 22 42 45 47 49 4e 20  >dbMain, "BEGIN 
1dc20 49 4d 4d 45 44 49 41 54 45 22 2c 20 30 2c 20 30  IMMEDIATE", 0, 0
1dc30 2c 30 29 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e 72  ,0);.  }..  p->r
1dc40 63 20 3d 20 72 63 3b 0a 20 20 72 65 74 75 72 6e  c = rc;.  return
1dc50 20 72 63 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a   rc;.}../*******
1dc60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1dc70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1dc80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1dc90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1dca0 2a 2a 2a 0a 2a 2a 20 42 65 67 69 6e 6e 69 6e 67  ***.** Beginning
1dcb0 20 6f 66 20 52 42 55 20 56 46 53 20 73 68 69 6d   of RBU VFS shim
1dcc0 20 6d 65 74 68 6f 64 73 2e 20 54 68 65 20 56 46   methods. The VF
1dcd0 53 20 73 68 69 6d 20 6d 6f 64 69 66 69 65 73 20  S shim modifies 
1dce0 74 68 65 20 62 65 68 61 76 69 6f 75 72 0a 2a 2a  the behaviour.**
1dcf0 20 6f 66 20 61 20 73 74 61 6e 64 61 72 64 20 56   of a standard V
1dd00 46 53 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77  FS in the follow
1dd10 69 6e 67 20 77 61 79 73 3a 0a 2a 2a 0a 2a 2a 20  ing ways:.**.** 
1dd20 31 2e 20 57 68 65 6e 65 76 65 72 20 74 68 65 20  1. Whenever the 
1dd30 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 61 20  first page of a 
1dd40 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  main database fi
1dd50 6c 65 20 69 73 20 72 65 61 64 20 6f 72 20 0a 2a  le is read or .*
1dd60 2a 20 20 20 20 77 72 69 74 74 65 6e 2c 20 74 68  *    written, th
1dd70 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 63  e value of the c
1dd80 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 63 6f  hange-counter co
1dd90 6f 6b 69 65 20 69 73 20 73 74 6f 72 65 64 20 69  okie is stored i
1dda0 6e 0a 2a 2a 20 20 20 20 72 62 75 5f 66 69 6c 65  n.**    rbu_file
1ddb0 2e 69 43 6f 6f 6b 69 65 2e 20 53 69 6d 69 6c 61  .iCookie. Simila
1ddc0 72 6c 79 2c 20 74 68 65 20 76 61 6c 75 65 20 6f  rly, the value o
1ddd0 66 20 74 68 65 20 22 77 72 69 74 65 2d 76 65 72  f the "write-ver
1dde0 73 69 6f 6e 22 0a 2a 2a 20 20 20 20 64 61 74 61  sion".**    data
1ddf0 62 61 73 65 20 68 65 61 64 65 72 20 66 69 65 6c  base header fiel
1de00 64 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 72  d is stored in r
1de10 62 75 5f 66 69 6c 65 2e 69 57 72 69 74 65 56 65  bu_file.iWriteVe
1de20 72 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73 0a  r. This ensures.
1de30 2a 2a 20 20 20 20 74 68 61 74 20 74 68 65 20 76  **    that the v
1de40 61 6c 75 65 73 20 61 72 65 20 61 6c 77 61 79 73  alues are always
1de50 20 74 72 75 73 74 77 6f 72 74 68 79 20 77 69 74   trustworthy wit
1de60 68 69 6e 20 61 6e 20 6f 70 65 6e 20 74 72 61 6e  hin an open tran
1de70 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 32  saction..**.** 2
1de80 2e 20 57 68 65 6e 65 76 65 72 20 61 6e 20 53 51  . Whenever an SQ
1de90 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 66 69  LITE_OPEN_WAL fi
1dea0 6c 65 20 69 73 20 6f 70 65 6e 65 64 2c 20 74 68  le is opened, th
1deb0 65 20 28 72 62 75 5f 66 69 6c 65 2e 70 57 61 6c  e (rbu_file.pWal
1dec0 46 64 29 0a 2a 2a 20 20 20 20 6d 65 6d 62 65 72  Fd).**    member
1ded0 20 76 61 72 69 61 62 6c 65 20 6f 66 20 74 68 65   variable of the
1dee0 20 61 73 73 6f 63 69 61 74 65 64 20 64 61 74 61   associated data
1def0 62 61 73 65 20 66 69 6c 65 20 64 65 73 63 72 69  base file descri
1df00 70 74 6f 72 20 69 73 20 73 65 74 0a 2a 2a 20 20  ptor is set.**  
1df10 20 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68    to point to th
1df20 65 20 6e 65 77 20 66 69 6c 65 2e 20 41 20 6d 75  e new file. A mu
1df30 74 65 78 20 70 72 6f 74 65 63 74 65 64 20 6c 69  tex protected li
1df40 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 61 6c 6c  nked list of all
1df50 20 6d 61 69 6e 20 0a 2a 2a 20 20 20 20 64 62 20   main .**    db 
1df60 66 64 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67  fds opened using
1df70 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 52 42   a particular RB
1df80 55 20 56 46 53 20 69 73 20 6d 61 69 6e 74 61 69  U VFS is maintai
1df90 6e 65 64 20 61 74 20 0a 2a 2a 20 20 20 20 72 62  ned at .**    rb
1dfa0 75 5f 76 66 73 2e 70 4d 61 69 6e 20 74 6f 20 66  u_vfs.pMain to f
1dfb0 61 63 69 6c 69 74 61 74 65 20 74 68 69 73 2e 0a  acilitate this..
1dfc0 2a 2a 0a 2a 2a 20 33 2e 20 55 73 69 6e 67 20 61  **.** 3. Using a
1dfd0 20 6e 65 77 20 66 69 6c 65 2d 63 6f 6e 74 72 6f   new file-contro
1dfe0 6c 20 22 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  l "SQLITE_FCNTL_
1dff0 52 42 55 22 2c 20 61 20 6d 61 69 6e 20 64 62 20  RBU", a main db 
1e000 72 62 75 5f 66 69 6c 65 20 0a 2a 2a 20 20 20 20  rbu_file .**    
1e010 6f 62 6a 65 63 74 20 63 61 6e 20 62 65 20 6d 61  object can be ma
1e020 72 6b 65 64 20 61 73 20 74 68 65 20 74 61 72 67  rked as the targ
1e030 65 74 20 64 61 74 61 62 61 73 65 20 6f 66 20 61  et database of a
1e040 6e 20 52 42 55 20 75 70 64 61 74 65 2e 20 54 68  n RBU update. Th
1e050 69 73 0a 2a 2a 20 20 20 20 74 75 72 6e 73 20 6f  is.**    turns o
1e060 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
1e070 65 78 74 72 61 20 73 70 65 63 69 61 6c 20 62 65  extra special be
1e080 68 61 76 69 6f 75 72 3a 0a 2a 2a 0a 2a 2a 20 33  haviour:.**.** 3
1e090 61 2e 20 49 66 20 78 41 63 63 65 73 73 28 29 20  a. If xAccess() 
1e0a0 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 68 65  is called to che
1e0b0 63 6b 20 69 66 20 74 68 65 72 65 20 65 78 69 73  ck if there exis
1e0c0 74 73 20 61 20 2a 2d 77 61 6c 20 66 69 6c 65 20  ts a *-wal file 
1e0d0 0a 2a 2a 20 20 20 20 20 61 73 73 6f 63 69 61 74  .**     associat
1e0e0 65 64 20 77 69 74 68 20 61 6e 20 52 42 55 20 74  ed with an RBU t
1e0f0 61 72 67 65 74 20 64 61 74 61 62 61 73 65 20 63  arget database c
1e100 75 72 72 65 6e 74 6c 79 20 69 6e 20 52 42 55 5f  urrently in RBU_
1e110 53 54 41 47 45 5f 4f 41 4c 0a 2a 2a 20 20 20 20  STAGE_OAL.**    
1e120 20 73 74 61 67 65 20 28 70 72 65 70 61 72 69 6e   stage (preparin
1e130 67 20 74 68 65 20 2a 2d 6f 61 6c 20 66 69 6c 65  g the *-oal file
1e140 29 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ), the following
1e150 20 73 70 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e   special handlin
1e160 67 0a 2a 2a 20 20 20 20 20 61 70 70 6c 69 65 73  g.**     applies
1e170 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 2a 20 69  :.**.**      * i
1e180 66 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65  f the *-wal file
1e190 20 64 6f 65 73 20 65 78 69 73 74 2c 20 72 65 74   does exist, ret
1e1a0 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  urn SQLITE_CANTO
1e1b0 50 45 4e 2e 20 41 6e 20 52 42 55 0a 2a 2a 20 20  PEN. An RBU.**  
1e1c0 20 20 20 20 20 20 74 61 72 67 65 74 20 64 61 74        target dat
1e1d0 61 62 61 73 65 20 6d 61 79 20 6e 6f 74 20 62 65  abase may not be
1e1e0 20 69 6e 20 77 61 6c 20 6d 6f 64 65 20 61 6c 72   in wal mode alr
1e1f0 65 61 64 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  eady..**.**     
1e200 20 2a 20 69 66 20 74 68 65 20 2a 2d 77 61 6c 20   * if the *-wal 
1e210 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78  file does not ex
1e220 69 73 74 2c 20 73 65 74 20 74 68 65 20 6f 75 74  ist, set the out
1e230 70 75 74 20 70 61 72 61 6d 65 74 65 72 20 74 6f  put parameter to
1e240 0a 2a 2a 20 20 20 20 20 20 20 20 6e 6f 6e 2d 7a  .**        non-z
1e250 65 72 6f 20 28 74 6f 20 74 65 6c 6c 20 53 51 4c  ero (to tell SQL
1e260 69 74 65 20 74 68 61 74 20 69 74 20 64 6f 65 73  ite that it does
1e270 20 65 78 69 73 74 29 20 61 6e 79 77 61 79 2e 0a   exist) anyway..
1e280 2a 2a 0a 2a 2a 20 20 20 20 20 54 68 65 6e 2c 20  **.**     Then, 
1e290 77 68 65 6e 20 78 4f 70 65 6e 28 29 20 69 73 20  when xOpen() is 
1e2a0 63 61 6c 6c 65 64 20 74 6f 20 6f 70 65 6e 20 74  called to open t
1e2b0 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 61 73  he *-wal file as
1e2c0 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a  sociated with.**
1e2d0 20 20 20 20 20 74 68 65 20 52 42 55 20 74 61 72       the RBU tar
1e2e0 67 65 74 20 69 6e 20 52 42 55 5f 53 54 41 47 45  get in RBU_STAGE
1e2f0 5f 4f 41 4c 20 73 74 61 67 65 2c 20 69 6e 73 74  _OAL stage, inst
1e300 65 61 64 20 6f 66 20 6f 70 65 6e 69 6e 67 20 74  ead of opening t
1e310 68 65 20 2a 2d 77 61 6c 0a 2a 2a 20 20 20 20 20  he *-wal.**     
1e320 66 69 6c 65 2c 20 74 68 65 20 72 62 75 20 76 66  file, the rbu vf
1e330 73 20 6f 70 65 6e 73 20 74 68 65 20 63 6f 72 72  s opens the corr
1e340 65 73 70 6f 6e 64 69 6e 67 20 2a 2d 6f 61 6c 20  esponding *-oal 
1e350 66 69 6c 65 20 69 6e 73 74 65 61 64 2e 20 0a 2a  file instead. .*
1e360 2a 0a 2a 2a 20 33 62 2e 20 54 68 65 20 2a 2d 73  *.** 3b. The *-s
1e370 68 6d 20 70 61 67 65 73 20 72 65 74 75 72 6e 65  hm pages returne
1e380 64 20 62 79 20 78 53 68 6d 4d 61 70 28 29 20 66  d by xShmMap() f
1e390 6f 72 20 61 20 74 61 72 67 65 74 20 64 62 20 66  or a target db f
1e3a0 69 6c 65 20 69 6e 0a 2a 2a 20 20 20 20 20 52 42  ile in.**     RB
1e3b0 55 5f 53 54 41 47 45 5f 4f 41 4c 20 6d 6f 64 65  U_STAGE_OAL mode
1e3c0 20 61 72 65 20 61 63 74 75 61 6c 6c 79 20 73 74   are actually st
1e3d0 6f 72 65 64 20 69 6e 20 68 65 61 70 20 6d 65 6d  ored in heap mem
1e3e0 6f 72 79 2e 20 54 68 69 73 20 69 73 20 74 6f 0a  ory. This is to.
1e3f0 2a 2a 20 20 20 20 20 61 76 6f 69 64 20 63 72 65  **     avoid cre
1e400 61 74 69 6e 67 20 61 20 2a 2d 73 68 6d 20 66 69  ating a *-shm fi
1e410 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 41 64 64 69  le on disk. Addi
1e420 74 69 6f 6e 61 6c 6c 79 2c 20 78 53 68 6d 4c 6f  tionally, xShmLo
1e430 63 6b 28 29 20 63 61 6c 6c 73 0a 2a 2a 20 20 20  ck() calls.**   
1e440 20 20 61 72 65 20 6e 6f 2d 6f 70 73 20 6f 6e 20    are no-ops on 
1e450 74 61 72 67 65 74 20 64 61 74 61 62 61 73 65 20  target database 
1e460 66 69 6c 65 73 20 69 6e 20 52 42 55 5f 53 54 41  files in RBU_STA
1e470 47 45 5f 4f 41 4c 20 6d 6f 64 65 2e 20 54 68 69  GE_OAL mode. Thi
1e480 73 20 69 73 0a 2a 2a 20 20 20 20 20 62 65 63 61  s is.**     beca
1e490 75 73 65 20 61 73 73 65 72 74 28 29 20 73 74 61  use assert() sta
1e4a0 74 65 6d 65 6e 74 73 20 69 6e 20 73 6f 6d 65 20  tements in some 
1e4b0 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  VFS implementati
1e4c0 6f 6e 73 20 66 61 69 6c 20 69 66 20 0a 2a 2a 20  ons fail if .** 
1e4d0 20 20 20 20 78 53 68 6d 4c 6f 63 6b 28 29 20 69      xShmLock() i
1e4e0 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20  s called before 
1e4f0 78 53 68 6d 4d 61 70 28 29 2e 0a 2a 2a 0a 2a 2a  xShmMap()..**.**
1e500 20 33 63 2e 20 49 66 20 61 6e 20 45 58 43 4c 55   3c. If an EXCLU
1e510 53 49 56 45 20 6c 6f 63 6b 20 69 73 20 61 74 74  SIVE lock is att
1e520 65 6d 70 74 65 64 20 6f 6e 20 61 20 74 61 72 67  empted on a targ
1e530 65 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  et database file
1e540 20 69 6e 20 61 6e 79 0a 2a 2a 20 20 20 20 20 6d   in any.**     m
1e550 6f 64 65 20 65 78 63 65 70 74 20 52 42 55 5f 53  ode except RBU_S
1e560 54 41 47 45 5f 44 4f 4e 45 20 28 61 6c 6c 20 77  TAGE_DONE (all w
1e570 6f 72 6b 20 63 6f 6d 70 6c 65 74 65 64 20 61 6e  ork completed an
1e580 64 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 29 2c  d checkpointed),
1e590 20 69 74 20 0a 2a 2a 20 20 20 20 20 66 61 69 6c   it .**     fail
1e5a0 73 20 77 69 74 68 20 61 6e 20 53 51 4c 49 54 45  s with an SQLITE
1e5b0 5f 42 55 53 59 20 65 72 72 6f 72 2e 20 54 68 69  _BUSY error. Thi
1e5c0 73 20 69 73 20 74 6f 20 73 74 6f 70 20 52 42 55  s is to stop RBU
1e5d0 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20   connections.** 
1e5e0 20 20 20 20 66 72 6f 6d 20 61 75 74 6f 6d 61 74      from automat
1e5f0 69 63 61 6c 6c 79 20 63 68 65 63 6b 70 6f 69 6e  ically checkpoin
1e600 74 69 6e 67 20 61 20 2a 2d 77 61 6c 20 28 6f 72  ting a *-wal (or
1e610 20 2a 2d 6f 61 6c 29 20 66 69 6c 65 20 66 72 6f   *-oal) file fro
1e620 6d 20 77 69 74 68 69 6e 0a 2a 2a 20 20 20 20 20  m within.**     
1e630 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 29 2e  sqlite3_close().
1e640 0a 2a 2a 0a 2a 2a 20 33 64 2e 20 49 6e 20 52 42  .**.** 3d. In RB
1e650 55 5f 53 54 41 47 45 5f 43 41 50 54 55 52 45 20  U_STAGE_CAPTURE 
1e660 6d 6f 64 65 2c 20 61 6c 6c 20 78 52 65 61 64 28  mode, all xRead(
1e670 29 20 63 61 6c 6c 73 20 6f 6e 20 74 68 65 20 77  ) calls on the w
1e680 61 6c 20 66 69 6c 65 2c 20 61 6e 64 0a 2a 2a 20  al file, and.** 
1e690 20 20 20 20 61 6c 6c 20 78 57 72 69 74 65 28 29      all xWrite()
1e6a0 20 63 61 6c 6c 73 20 6f 6e 20 74 68 65 20 74 61   calls on the ta
1e6b0 72 67 65 74 20 64 61 74 61 62 61 73 65 20 66 69  rget database fi
1e6c0 6c 65 20 70 65 72 66 6f 72 6d 20 6e 6f 20 49 4f  le perform no IO
1e6d0 2e 20 0a 2a 2a 20 20 20 20 20 49 6e 73 74 65 61  . .**     Instea
1e6e0 64 20 74 68 65 20 66 72 61 6d 65 20 61 6e 64 20  d the frame and 
1e6f0 70 61 67 65 20 6e 75 6d 62 65 72 73 20 74 68 61  page numbers tha
1e700 74 20 77 6f 75 6c 64 20 62 65 20 72 65 61 64 20  t would be read 
1e710 61 6e 64 20 77 72 69 74 74 65 6e 0a 2a 2a 20 20  and written.**  
1e720 20 20 20 61 72 65 20 72 65 63 6f 72 64 65 64 2e     are recorded.
1e730 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 73   Additionally, s
1e740 75 63 63 65 73 73 66 75 6c 20 61 74 74 65 6d 70  uccessful attemp
1e750 74 73 20 74 6f 20 6f 62 74 61 69 6e 20 65 78 63  ts to obtain exc
1e760 6c 75 73 69 76 65 0a 2a 2a 20 20 20 20 20 78 53  lusive.**     xS
1e770 68 6d 4c 6f 63 6b 28 29 20 57 52 49 54 45 52 2c  hmLock() WRITER,
1e780 20 43 48 45 43 4b 50 4f 49 4e 54 45 52 20 61 6e   CHECKPOINTER an
1e790 64 20 52 45 41 44 30 20 6c 6f 63 6b 73 20 6f 6e  d READ0 locks on
1e7a0 20 74 68 65 20 74 61 72 67 65 74 20 0a 2a 2a 20   the target .** 
1e7b0 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c      database fil
1e7c0 65 20 61 72 65 20 72 65 63 6f 72 64 65 64 2e 20  e are recorded. 
1e7d0 78 53 68 6d 4c 6f 63 6b 28 29 20 63 61 6c 6c 73  xShmLock() calls
1e7e0 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 73   to unlock the s
1e7f0 61 6d 65 0a 2a 2a 20 20 20 20 20 6c 6f 63 6b 73  ame.**     locks
1e800 20 61 72 65 20 6e 6f 2d 6f 70 73 20 28 73 6f 20   are no-ops (so 
1e810 74 68 61 74 20 6f 6e 63 65 20 6f 62 74 61 69 6e  that once obtain
1e820 65 64 2c 20 74 68 65 73 65 20 6c 6f 63 6b 73 20  ed, these locks 
1e830 61 72 65 20 6e 65 76 65 72 0a 2a 2a 20 20 20 20  are never.**    
1e840 20 72 65 6c 69 6e 71 75 69 73 68 65 64 29 2e 20   relinquished). 
1e850 46 69 6e 61 6c 6c 79 2c 20 63 61 6c 6c 73 20 74  Finally, calls t
1e860 6f 20 78 53 79 6e 63 28 29 20 6f 6e 20 74 68 65  o xSync() on the
1e870 20 74 61 72 67 65 74 20 64 61 74 61 62 61 73 65   target database
1e880 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20 66 61 69  .**     file fai
1e890 6c 20 77 69 74 68 20 53 51 4c 49 54 45 5f 49 4e  l with SQLITE_IN
1e8a0 54 45 52 4e 41 4c 20 65 72 72 6f 72 73 2e 0a 2a  TERNAL errors..*
1e8b0 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  /..static void r
1e8c0 62 75 55 6e 6c 6f 63 6b 53 68 6d 28 72 62 75 5f  buUnlockShm(rbu_
1e8d0 66 69 6c 65 20 2a 70 29 7b 0a 20 20 69 66 28 20  file *p){.  if( 
1e8e0 70 2d 3e 70 52 62 75 20 29 7b 0a 20 20 20 20 69  p->pRbu ){.    i
1e8f0 6e 74 20 28 2a 78 53 68 6d 4c 6f 63 6b 29 28 73  nt (*xShmLock)(s
1e900 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 69 6e 74  qlite3_file*,int
1e910 2c 69 6e 74 2c 69 6e 74 29 20 3d 20 70 2d 3e 70  ,int,int) = p->p
1e920 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e  Real->pMethods->
1e930 78 53 68 6d 4c 6f 63 6b 3b 0a 20 20 20 20 69 6e  xShmLock;.    in
1e940 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
1e950 3b 20 69 3c 53 51 4c 49 54 45 5f 53 48 4d 5f 4e  ; i<SQLITE_SHM_N
1e960 4c 4f 43 4b 3b 69 2b 2b 29 7b 0a 20 20 20 20 20  LOCK;i++){.     
1e970 20 69 66 28 20 28 31 3c 3c 69 29 20 26 20 70 2d   if( (1<<i) & p-
1e980 3e 70 52 62 75 2d 3e 6d 4c 6f 63 6b 20 29 7b 0a  >pRbu->mLock ){.
1e990 20 20 20 20 20 20 20 20 78 53 68 6d 4c 6f 63 6b          xShmLock
1e9a0 28 70 2d 3e 70 52 65 61 6c 2c 20 69 2c 20 31 2c  (p->pReal, i, 1,
1e9b0 20 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f   SQLITE_SHM_UNLO
1e9c0 43 4b 7c 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58  CK|SQLITE_SHM_EX
1e9d0 43 4c 55 53 49 56 45 29 3b 0a 20 20 20 20 20 20  CLUSIVE);.      
1e9e0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70  }.    }.    p->p
1e9f0 52 62 75 2d 3e 6d 4c 6f 63 6b 20 3d 20 30 3b 0a  Rbu->mLock = 0;.
1ea00 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f    }.}../*.** Clo
1ea10 73 65 20 61 6e 20 72 62 75 20 66 69 6c 65 2e 0a  se an rbu file..
1ea20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62  */.static int rb
1ea30 75 56 66 73 43 6c 6f 73 65 28 73 71 6c 69 74 65  uVfsClose(sqlite
1ea40 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  3_file *pFile){.
1ea50 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 20 3d 20    rbu_file *p = 
1ea60 28 72 62 75 5f 66 69 6c 65 2a 29 70 46 69 6c 65  (rbu_file*)pFile
1ea70 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  ;.  int rc;.  in
1ea80 74 20 69 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20  t i;..  /* Free 
1ea90 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
1eaa0 74 68 65 20 61 70 53 68 6d 5b 5d 20 61 72 72 61  the apShm[] arra
1eab0 79 2e 20 41 6e 64 20 74 68 65 20 61 72 72 61 79  y. And the array
1eac0 20 69 74 73 65 6c 66 2e 20 2a 2f 0a 20 20 66 6f   itself. */.  fo
1ead0 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 68 6d  r(i=0; i<p->nShm
1eae0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
1eaf0 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 70 53 68  te3_free(p->apSh
1eb00 6d 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  m[i]);.  }.  sql
1eb10 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 70 53  ite3_free(p->apS
1eb20 68 6d 29 3b 0a 20 20 70 2d 3e 61 70 53 68 6d 20  hm);.  p->apShm 
1eb30 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  = 0;.  sqlite3_f
1eb40 72 65 65 28 70 2d 3e 7a 44 65 6c 29 3b 0a 0a 20  ree(p->zDel);.. 
1eb50 20 69 66 28 20 70 2d 3e 6f 70 65 6e 46 6c 61 67   if( p->openFlag
1eb60 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
1eb70 4d 41 49 4e 5f 44 42 20 29 7b 0a 20 20 20 20 72  MAIN_DB ){.    r
1eb80 62 75 5f 66 69 6c 65 20 2a 2a 70 70 3b 0a 20 20  bu_file **pp;.  
1eb90 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1eba0 65 6e 74 65 72 28 70 2d 3e 70 52 62 75 56 66 73  enter(p->pRbuVfs
1ebb0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 66 6f  ->mutex);.    fo
1ebc0 72 28 70 70 3d 26 70 2d 3e 70 52 62 75 56 66 73  r(pp=&p->pRbuVfs
1ebd0 2d 3e 70 4d 61 69 6e 3b 20 2a 70 70 21 3d 70 3b  ->pMain; *pp!=p;
1ebe0 20 70 70 3d 26 28 28 2a 70 70 29 2d 3e 70 4d 61   pp=&((*pp)->pMa
1ebf0 69 6e 4e 65 78 74 29 29 3b 0a 20 20 20 20 2a 70  inNext));.    *p
1ec00 70 20 3d 20 70 2d 3e 70 4d 61 69 6e 4e 65 78 74  p = p->pMainNext
1ec10 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  ;.    sqlite3_mu
1ec20 74 65 78 5f 6c 65 61 76 65 28 70 2d 3e 70 52 62  tex_leave(p->pRb
1ec30 75 56 66 73 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  uVfs->mutex);.  
1ec40 20 20 72 62 75 55 6e 6c 6f 63 6b 53 68 6d 28 70    rbuUnlockShm(p
1ec50 29 3b 0a 20 20 20 20 70 2d 3e 70 52 65 61 6c 2d  );.    p->pReal-
1ec60 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53 68 6d 55  >pMethods->xShmU
1ec70 6e 6d 61 70 28 70 2d 3e 70 52 65 61 6c 2c 20 30  nmap(p->pReal, 0
1ec80 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 6f  );.  }..  /* Clo
1ec90 73 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  se the underlyin
1eca0 67 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 2a 2f  g file handle */
1ecb0 0a 20 20 72 63 20 3d 20 70 2d 3e 70 52 65 61 6c  .  rc = p->pReal
1ecc0 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 43 6c 6f  ->pMethods->xClo
1ecd0 73 65 28 70 2d 3e 70 52 65 61 6c 29 3b 0a 20 20  se(p->pReal);.  
1ece0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
1ecf0 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 64 20 72 65  *.** Read and re
1ed00 74 75 72 6e 20 61 6e 20 75 6e 73 69 67 6e 65 64  turn an unsigned
1ed10 20 33 32 2d 62 69 74 20 62 69 67 2d 65 6e 64 69   32-bit big-endi
1ed20 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f 6d 20  an integer from 
1ed30 74 68 65 20 62 75 66 66 65 72 20 0a 2a 2a 20 70  the buffer .** p
1ed40 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c  assed as the onl
1ed50 79 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73  y argument..*/.s
1ed60 74 61 74 69 63 20 75 33 32 20 72 62 75 47 65 74  tatic u32 rbuGet
1ed70 55 33 32 28 75 38 20 2a 61 42 75 66 29 7b 0a 20  U32(u8 *aBuf){. 
1ed80 20 72 65 74 75 72 6e 20 28 28 75 33 32 29 61 42   return ((u32)aB
1ed90 75 66 5b 30 5d 20 3c 3c 20 32 34 29 0a 20 20 20  uf[0] << 24).   
1eda0 20 20 20 20 2b 20 28 28 75 33 32 29 61 42 75 66      + ((u32)aBuf
1edb0 5b 31 5d 20 3c 3c 20 31 36 29 0a 20 20 20 20 20  [1] << 16).     
1edc0 20 20 2b 20 28 28 75 33 32 29 61 42 75 66 5b 32    + ((u32)aBuf[2
1edd0 5d 20 3c 3c 20 20 38 29 0a 20 20 20 20 20 20 20  ] <<  8).       
1ede0 2b 20 28 28 75 33 32 29 61 42 75 66 5b 33 5d 29  + ((u32)aBuf[3])
1edf0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
1ee00 20 61 6e 20 75 6e 73 69 67 6e 65 64 20 33 32 2d   an unsigned 32-
1ee10 62 69 74 20 76 61 6c 75 65 20 69 6e 20 62 69 67  bit value in big
1ee20 2d 65 6e 64 69 61 6e 20 66 6f 72 6d 61 74 20 74  -endian format t
1ee30 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64 0a 2a  o the supplied.*
1ee40 2a 20 62 75 66 66 65 72 2e 0a 2a 2f 0a 73 74 61  * buffer..*/.sta
1ee50 74 69 63 20 76 6f 69 64 20 72 62 75 50 75 74 55  tic void rbuPutU
1ee60 33 32 28 75 38 20 2a 61 42 75 66 2c 20 75 33 32  32(u8 *aBuf, u32
1ee70 20 69 56 61 6c 29 7b 0a 20 20 61 42 75 66 5b 30   iVal){.  aBuf[0
1ee80 5d 20 3d 20 28 69 56 61 6c 20 3e 3e 20 32 34 29  ] = (iVal >> 24)
1ee90 20 26 20 30 78 46 46 3b 0a 20 20 61 42 75 66 5b   & 0xFF;.  aBuf[
1eea0 31 5d 20 3d 20 28 69 56 61 6c 20 3e 3e 20 31 36  1] = (iVal >> 16
1eeb0 29 20 26 20 30 78 46 46 3b 0a 20 20 61 42 75 66  ) & 0xFF;.  aBuf
1eec0 5b 32 5d 20 3d 20 28 69 56 61 6c 20 3e 3e 20 20  [2] = (iVal >>  
1eed0 38 29 20 26 20 30 78 46 46 3b 0a 20 20 61 42 75  8) & 0xFF;.  aBu
1eee0 66 5b 33 5d 20 3d 20 28 69 56 61 6c 20 3e 3e 20  f[3] = (iVal >> 
1eef0 20 30 29 20 26 20 30 78 46 46 3b 0a 7d 0a 0a 73   0) & 0xFF;.}..s
1ef00 74 61 74 69 63 20 76 6f 69 64 20 72 62 75 50 75  tatic void rbuPu
1ef10 74 55 31 36 28 75 38 20 2a 61 42 75 66 2c 20 75  tU16(u8 *aBuf, u
1ef20 31 36 20 69 56 61 6c 29 7b 0a 20 20 61 42 75 66  16 iVal){.  aBuf
1ef30 5b 30 5d 20 3d 20 28 69 56 61 6c 20 3e 3e 20 20  [0] = (iVal >>  
1ef40 38 29 20 26 20 30 78 46 46 3b 0a 20 20 61 42 75  8) & 0xFF;.  aBu
1ef50 66 5b 31 5d 20 3d 20 28 69 56 61 6c 20 3e 3e 20  f[1] = (iVal >> 
1ef60 20 30 29 20 26 20 30 78 46 46 3b 0a 7d 0a 0a 2f   0) & 0xFF;.}../
1ef70 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66  *.** Read data f
1ef80 72 6f 6d 20 61 6e 20 72 62 75 56 66 73 2d 66 69  rom an rbuVfs-fi
1ef90 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
1efa0 74 20 72 62 75 56 66 73 52 65 61 64 28 0a 20 20  t rbuVfsRead(.  
1efb0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
1efc0 69 6c 65 2c 20 0a 20 20 76 6f 69 64 20 2a 7a 42  ile, .  void *zB
1efd0 75 66 2c 20 0a 20 20 69 6e 74 20 69 41 6d 74 2c  uf, .  int iAmt,
1efe0 20 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34   .  sqlite_int64
1eff0 20 69 4f 66 73 74 0a 29 7b 0a 20 20 72 62 75 5f   iOfst.){.  rbu_
1f000 66 69 6c 65 20 2a 70 20 3d 20 28 72 62 75 5f 66  file *p = (rbu_f
1f010 69 6c 65 2a 29 70 46 69 6c 65 3b 0a 20 20 73 71  ile*)pFile;.  sq
1f020 6c 69 74 65 33 72 62 75 20 2a 70 52 62 75 20 3d  lite3rbu *pRbu =
1f030 20 70 2d 3e 70 52 62 75 3b 0a 20 20 69 6e 74 20   p->pRbu;.  int 
1f040 72 63 3b 0a 0a 20 20 69 66 28 20 70 52 62 75 20  rc;..  if( pRbu 
1f050 26 26 20 70 52 62 75 2d 3e 65 53 74 61 67 65 3d  && pRbu->eStage=
1f060 3d 52 42 55 5f 53 54 41 47 45 5f 43 41 50 54 55  =RBU_STAGE_CAPTU
1f070 52 45 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  RE ){.    assert
1f080 28 20 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26  ( p->openFlags &
1f090 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c   SQLITE_OPEN_WAL
1f0a0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 72 62 75   );.    rc = rbu
1f0b0 43 61 70 74 75 72 65 57 61 6c 52 65 61 64 28 70  CaptureWalRead(p
1f0c0 2d 3e 70 52 62 75 2c 20 69 4f 66 73 74 2c 20 69  ->pRbu, iOfst, i
1f0d0 41 6d 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Amt);.  }else{. 
1f0e0 20 20 20 69 66 28 20 70 52 62 75 20 26 26 20 70     if( pRbu && p
1f0f0 52 62 75 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55  Rbu->eStage==RBU
1f100 5f 53 54 41 47 45 5f 4f 41 4c 20 0a 20 20 20 20  _STAGE_OAL .    
1f110 20 26 26 20 28 70 2d 3e 6f 70 65 6e 46 6c 61 67   && (p->openFlag
1f120 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
1f130 57 41 4c 29 20 0a 20 20 20 20 20 26 26 20 69 4f  WAL) .     && iO
1f140 66 73 74 3e 3d 70 52 62 75 2d 3e 69 4f 61 6c 53  fst>=pRbu->iOalS
1f150 7a 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  z .    ){.      
1f160 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1f170 20 20 20 20 20 20 6d 65 6d 73 65 74 28 7a 42 75        memset(zBu
1f180 66 2c 20 30 2c 20 69 41 6d 74 29 3b 0a 20 20 20  f, 0, iAmt);.   
1f190 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
1f1a0 20 3d 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65   = p->pReal->pMe
1f1b0 74 68 6f 64 73 2d 3e 78 52 65 61 64 28 70 2d 3e  thods->xRead(p->
1f1c0 70 52 65 61 6c 2c 20 7a 42 75 66 2c 20 69 41 6d  pReal, zBuf, iAm
1f1d0 74 2c 20 69 4f 66 73 74 29 3b 0a 23 69 66 20 31  t, iOfst);.#if 1
1f1e0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69  .      /* If thi
1f1f0 73 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65  s is being calle
1f200 64 20 74 6f 20 72 65 61 64 20 74 68 65 20 66 69  d to read the fi
1f210 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  rst page of the 
1f220 74 61 72 67 65 74 20 0a 20 20 20 20 20 20 2a 2a  target .      **
1f230 20 64 61 74 61 62 61 73 65 20 61 73 20 70 61 72   database as par
1f240 74 20 6f 66 20 61 6e 20 72 62 75 20 76 61 63 75  t of an rbu vacu
1f250 75 6d 20 6f 70 65 72 61 74 69 6f 6e 2c 20 73 79  um operation, sy
1f260 6e 74 68 65 73 69 7a 65 20 74 68 65 20 0a 20 20  nthesize the .  
1f270 20 20 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 73 20      ** contents 
1f280 6f 66 20 74 68 65 20 66 69 72 73 74 20 70 61 67  of the first pag
1f290 65 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74  e if it does not
1f2a0 20 79 65 74 20 65 78 69 73 74 2e 20 4f 74 68 65   yet exist. Othe
1f2b0 72 77 69 73 65 2c 0a 20 20 20 20 20 20 2a 2a 20  rwise,.      ** 
1f2c0 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e 6f 74 20  SQLite will not 
1f2d0 63 68 65 63 6b 20 66 6f 72 20 61 20 2a 2d 77 61  check for a *-wa
1f2e0 6c 20 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 20 20  l file.  */.    
1f2f0 20 20 69 66 28 20 70 52 62 75 20 26 26 20 72 62    if( pRbu && rb
1f300 75 49 73 56 61 63 75 75 6d 28 70 52 62 75 29 20  uIsVacuum(pRbu) 
1f310 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 72 63  .          && rc
1f320 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  ==SQLITE_IOERR_S
1f330 48 4f 52 54 5f 52 45 41 44 20 26 26 20 69 4f 66  HORT_READ && iOf
1f340 73 74 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  st==0.          
1f350 26 26 20 28 70 2d 3e 6f 70 65 6e 46 6c 61 67 73  && (p->openFlags
1f360 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d   & SQLITE_OPEN_M
1f370 41 49 4e 5f 44 42 29 0a 20 20 20 20 20 20 20 20  AIN_DB).        
1f380 20 20 26 26 20 70 52 62 75 2d 3e 72 63 3d 3d 53    && pRbu->rc==S
1f390 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20 29  QLITE_OK.      )
1f3a0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1f3b0 33 5f 66 69 6c 65 20 2a 70 46 64 20 3d 20 28 73  3_file *pFd = (s
1f3c0 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70 52 62  qlite3_file*)pRb
1f3d0 75 2d 3e 70 52 62 75 46 64 3b 0a 20 20 20 20 20  u->pRbuFd;.     
1f3e0 20 20 20 72 63 20 3d 20 70 46 64 2d 3e 70 4d 65     rc = pFd->pMe
1f3f0 74 68 6f 64 73 2d 3e 78 52 65 61 64 28 70 46 64  thods->xRead(pFd
1f400 2c 20 7a 42 75 66 2c 20 69 41 6d 74 2c 20 69 4f  , zBuf, iAmt, iO
1f410 66 73 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66  fst);.        if
1f420 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1f430 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 38 20  ){.          u8 
1f440 2a 61 42 75 66 20 3d 20 28 75 38 2a 29 7a 42 75  *aBuf = (u8*)zBu
1f450 66 3b 0a 20 20 20 20 20 20 20 20 20 20 75 33 32  f;.          u32
1f460 20 69 52 6f 6f 74 20 3d 20 72 62 75 47 65 74 55   iRoot = rbuGetU
1f470 33 32 28 26 61 42 75 66 5b 35 32 5d 29 20 3f 20  32(&aBuf[52]) ? 
1f480 31 20 3a 20 30 3b 0a 20 20 20 20 20 20 20 20 20  1 : 0;.         
1f490 20 72 62 75 50 75 74 55 33 32 28 26 61 42 75 66   rbuPutU32(&aBuf
1f4a0 5b 35 32 5d 2c 20 69 52 6f 6f 74 29 3b 20 20 20  [52], iRoot);   
1f4b0 20 20 20 2f 2a 20 6c 61 72 67 65 73 74 20 72 6f     /* largest ro
1f4c0 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a  ot page number *
1f4d0 2f 0a 20 20 20 20 20 20 20 20 20 20 72 62 75 50  /.          rbuP
1f4e0 75 74 55 33 32 28 26 61 42 75 66 5b 33 36 5d 2c  utU32(&aBuf[36],
1f4f0 20 30 29 3b 20 20 20 20 20 20 20 20 20 20 2f 2a   0);          /*
1f500 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 20   number of free 
1f510 70 61 67 65 73 20 2a 2f 0a 20 20 20 20 20 20 20  pages */.       
1f520 20 20 20 72 62 75 50 75 74 55 33 32 28 26 61 42     rbuPutU32(&aB
1f530 75 66 5b 33 32 5d 2c 20 30 29 3b 20 20 20 20 20  uf[32], 0);     
1f540 20 20 20 20 20 2f 2a 20 66 69 72 73 74 20 70 61       /* first pa
1f550 67 65 20 6f 6e 20 66 72 65 65 20 6c 69 73 74 20  ge on free list 
1f560 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 20  trunk */.       
1f570 20 20 20 72 62 75 50 75 74 55 33 32 28 26 61 42     rbuPutU32(&aB
1f580 75 66 5b 32 38 5d 2c 20 31 29 3b 20 20 20 20 20  uf[28], 1);     
1f590 20 20 20 20 20 2f 2a 20 73 69 7a 65 20 6f 66 20       /* size of 
1f5a0 64 62 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73  db file in pages
1f5b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 62   */.          rb
1f5c0 75 50 75 74 55 33 32 28 26 61 42 75 66 5b 32 34  uPutU32(&aBuf[24
1f5d0 5d 2c 20 70 52 62 75 2d 3e 70 52 62 75 46 64 2d  ], pRbu->pRbuFd-
1f5e0 3e 69 43 6f 6f 6b 69 65 2b 31 29 3b 20 20 2f 2a  >iCookie+1);  /*
1f5f0 20 43 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20   Change counter 
1f600 2a 2f 0a 0a 20 20 20 20 20 20 20 20 20 20 69 66  */..          if
1f610 28 20 69 41 6d 74 3e 31 30 30 20 29 7b 0a 20 20  ( iAmt>100 ){.  
1f620 20 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74            memset
1f630 28 26 61 42 75 66 5b 31 30 30 5d 2c 20 30 2c 20  (&aBuf[100], 0, 
1f640 69 41 6d 74 2d 31 30 30 29 3b 0a 20 20 20 20 20  iAmt-100);.     
1f650 20 20 20 20 20 20 20 72 62 75 50 75 74 55 31 36         rbuPutU16
1f660 28 26 61 42 75 66 5b 31 30 35 5d 2c 20 69 41 6d  (&aBuf[105], iAm
1f670 74 20 26 20 30 78 46 46 46 46 29 3b 0a 20 20 20  t & 0xFFFF);.   
1f680 20 20 20 20 20 20 20 20 20 61 42 75 66 5b 31 30           aBuf[10
1f690 30 5d 20 3d 20 30 78 30 44 3b 0a 20 20 20 20 20  0] = 0x0D;.     
1f6a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
1f6b0 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
1f6c0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
1f6d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
1f6e0 4f 66 73 74 3d 3d 30 20 26 26 20 28 70 2d 3e 6f  Ofst==0 && (p->o
1f6f0 70 65 6e 46 6c 61 67 73 20 26 20 53 51 4c 49 54  penFlags & SQLIT
1f700 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 20  E_OPEN_MAIN_DB) 
1f710 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 73  ){.      /* Thes
1f720 65 20 6c 6f 6f 6b 20 6c 69 6b 65 20 6d 61 67 69  e look like magi
1f730 63 20 6e 75 6d 62 65 72 73 2e 20 42 75 74 20 74  c numbers. But t
1f740 68 65 79 20 61 72 65 20 73 74 61 62 6c 65 2c 20  hey are stable, 
1f750 61 73 20 74 68 65 79 20 61 72 65 20 70 61 72 74  as they are part
1f760 0a 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68  .       ** of th
1f770 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66 20  e definition of 
1f780 74 68 65 20 53 51 4c 69 74 65 20 66 69 6c 65 20  the SQLite file 
1f790 66 6f 72 6d 61 74 2c 20 77 68 69 63 68 20 6d 61  format, which ma
1f7a0 79 20 6e 6f 74 20 63 68 61 6e 67 65 2e 20 2a 2f  y not change. */
1f7b0 0a 20 20 20 20 20 20 75 38 20 2a 70 42 75 66 20  .      u8 *pBuf 
1f7c0 3d 20 28 75 38 2a 29 7a 42 75 66 3b 0a 20 20 20  = (u8*)zBuf;.   
1f7d0 20 20 20 70 2d 3e 69 43 6f 6f 6b 69 65 20 3d 20     p->iCookie = 
1f7e0 72 62 75 47 65 74 55 33 32 28 26 70 42 75 66 5b  rbuGetU32(&pBuf[
1f7f0 32 34 5d 29 3b 0a 20 20 20 20 20 20 70 2d 3e 69  24]);.      p->i
1f800 57 72 69 74 65 56 65 72 20 3d 20 70 42 75 66 5b  WriteVer = pBuf[
1f810 31 39 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  19];.    }.  }. 
1f820 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1f830 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61 74 61 20  *.** Write data 
1f840 74 6f 20 61 6e 20 72 62 75 56 66 73 2d 66 69 6c  to an rbuVfs-fil
1f850 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1f860 20 72 62 75 56 66 73 57 72 69 74 65 28 0a 20 20   rbuVfsWrite(.  
1f870 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
1f880 69 6c 65 2c 20 0a 20 20 63 6f 6e 73 74 20 76 6f  ile, .  const vo
1f890 69 64 20 2a 7a 42 75 66 2c 20 0a 20 20 69 6e 74  id *zBuf, .  int
1f8a0 20 69 41 6d 74 2c 20 0a 20 20 73 71 6c 69 74 65   iAmt, .  sqlite
1f8b0 5f 69 6e 74 36 34 20 69 4f 66 73 74 0a 29 7b 0a  _int64 iOfst.){.
1f8c0 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 20 3d 20    rbu_file *p = 
1f8d0 28 72 62 75 5f 66 69 6c 65 2a 29 70 46 69 6c 65  (rbu_file*)pFile
1f8e0 3b 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20 2a  ;.  sqlite3rbu *
1f8f0 70 52 62 75 20 3d 20 70 2d 3e 70 52 62 75 3b 0a  pRbu = p->pRbu;.
1f900 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
1f910 20 70 52 62 75 20 26 26 20 70 52 62 75 2d 3e 65   pRbu && pRbu->e
1f920 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45  Stage==RBU_STAGE
1f930 5f 43 41 50 54 55 52 45 20 29 7b 0a 20 20 20 20  _CAPTURE ){.    
1f940 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 65 6e 46  assert( p->openF
1f950 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
1f960 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 3b 0a 20 20  EN_MAIN_DB );.  
1f970 20 20 72 63 20 3d 20 72 62 75 43 61 70 74 75 72    rc = rbuCaptur
1f980 65 44 62 57 72 69 74 65 28 70 2d 3e 70 52 62 75  eDbWrite(p->pRbu
1f990 2c 20 69 4f 66 73 74 29 3b 0a 20 20 7d 65 6c 73  , iOfst);.  }els
1f9a0 65 7b 0a 20 20 20 20 69 66 28 20 70 52 62 75 20  e{.    if( pRbu 
1f9b0 26 26 20 70 52 62 75 2d 3e 65 53 74 61 67 65 3d  && pRbu->eStage=
1f9c0 3d 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20 0a  =RBU_STAGE_OAL .
1f9d0 20 20 20 20 20 26 26 20 28 70 2d 3e 6f 70 65 6e       && (p->open
1f9e0 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  Flags & SQLITE_O
1f9f0 50 45 4e 5f 57 41 4c 29 20 0a 20 20 20 20 20 26  PEN_WAL) .     &
1fa00 26 20 69 4f 66 73 74 3e 3d 70 52 62 75 2d 3e 69  & iOfst>=pRbu->i
1fa10 4f 61 6c 53 7a 0a 20 20 20 20 29 7b 0a 20 20 20  OalSz.    ){.   
1fa20 20 20 20 70 52 62 75 2d 3e 69 4f 61 6c 53 7a 20     pRbu->iOalSz 
1fa30 3d 20 69 41 6d 74 20 2b 20 69 4f 66 73 74 3b 0a  = iAmt + iOfst;.
1fa40 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 70      }.    rc = p
1fa50 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64  ->pReal->pMethod
1fa60 73 2d 3e 78 57 72 69 74 65 28 70 2d 3e 70 52 65  s->xWrite(p->pRe
1fa70 61 6c 2c 20 7a 42 75 66 2c 20 69 41 6d 74 2c 20  al, zBuf, iAmt, 
1fa80 69 4f 66 73 74 29 3b 0a 20 20 20 20 69 66 28 20  iOfst);.    if( 
1fa90 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1faa0 20 69 4f 66 73 74 3d 3d 30 20 26 26 20 28 70 2d   iOfst==0 && (p-
1fab0 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20 53 51 4c  >openFlags & SQL
1fac0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
1fad0 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  ) ){.      /* Th
1fae0 65 73 65 20 6c 6f 6f 6b 20 6c 69 6b 65 20 6d 61  ese look like ma
1faf0 67 69 63 20 6e 75 6d 62 65 72 73 2e 20 42 75 74  gic numbers. But
1fb00 20 74 68 65 79 20 61 72 65 20 73 74 61 62 6c 65   they are stable
1fb10 2c 20 61 73 20 74 68 65 79 20 61 72 65 20 70 61  , as they are pa
1fb20 72 74 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74  rt.      ** of t
1fb30 68 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66  he definition of
1fb40 20 74 68 65 20 53 51 4c 69 74 65 20 66 69 6c 65   the SQLite file
1fb50 20 66 6f 72 6d 61 74 2c 20 77 68 69 63 68 20 6d   format, which m
1fb60 61 79 20 6e 6f 74 20 63 68 61 6e 67 65 2e 20 2a  ay not change. *
1fb70 2f 0a 20 20 20 20 20 20 75 38 20 2a 70 42 75 66  /.      u8 *pBuf
1fb80 20 3d 20 28 75 38 2a 29 7a 42 75 66 3b 0a 20 20   = (u8*)zBuf;.  
1fb90 20 20 20 20 70 2d 3e 69 43 6f 6f 6b 69 65 20 3d      p->iCookie =
1fba0 20 72 62 75 47 65 74 55 33 32 28 26 70 42 75 66   rbuGetU32(&pBuf
1fbb0 5b 32 34 5d 29 3b 0a 20 20 20 20 20 20 70 2d 3e  [24]);.      p->
1fbc0 69 57 72 69 74 65 56 65 72 20 3d 20 70 42 75 66  iWriteVer = pBuf
1fbd0 5b 31 39 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  [19];.    }.  }.
1fbe0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1fbf0 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 61  /*.** Truncate a
1fc00 6e 20 72 62 75 56 66 73 2d 66 69 6c 65 2e 0a 2a  n rbuVfs-file..*
1fc10 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62 75  /.static int rbu
1fc20 56 66 73 54 72 75 6e 63 61 74 65 28 73 71 6c 69  VfsTruncate(sqli
1fc30 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c  te3_file *pFile,
1fc40 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 73 69   sqlite_int64 si
1fc50 7a 65 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20  ze){.  rbu_file 
1fc60 2a 70 20 3d 20 28 72 62 75 5f 66 69 6c 65 2a 29  *p = (rbu_file*)
1fc70 70 46 69 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20  pFile;.  return 
1fc80 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f  p->pReal->pMetho
1fc90 64 73 2d 3e 78 54 72 75 6e 63 61 74 65 28 70 2d  ds->xTruncate(p-
1fca0 3e 70 52 65 61 6c 2c 20 73 69 7a 65 29 3b 0a 7d  >pReal, size);.}
1fcb0 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 61 6e 20  ../*.** Sync an 
1fcc0 72 62 75 56 66 73 2d 66 69 6c 65 2e 0a 2a 2f 0a  rbuVfs-file..*/.
1fcd0 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 56 66  static int rbuVf
1fce0 73 53 79 6e 63 28 73 71 6c 69 74 65 33 5f 66 69  sSync(sqlite3_fi
1fcf0 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20 66  le *pFile, int f
1fd00 6c 61 67 73 29 7b 0a 20 20 72 62 75 5f 66 69 6c  lags){.  rbu_fil
1fd10 65 20 2a 70 20 3d 20 28 72 62 75 5f 66 69 6c 65  e *p = (rbu_file
1fd20 20 2a 29 70 46 69 6c 65 3b 0a 20 20 69 66 28 20   *)pFile;.  if( 
1fd30 70 2d 3e 70 52 62 75 20 26 26 20 70 2d 3e 70 52  p->pRbu && p->pR
1fd40 62 75 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f  bu->eStage==RBU_
1fd50 53 54 41 47 45 5f 43 41 50 54 55 52 45 20 29 7b  STAGE_CAPTURE ){
1fd60 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 65 6e  .    if( p->open
1fd70 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  Flags & SQLITE_O
1fd80 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 7b 0a 20  PEN_MAIN_DB ){. 
1fd90 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1fda0 54 45 5f 49 4e 54 45 52 4e 41 4c 3b 0a 20 20 20  TE_INTERNAL;.   
1fdb0 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51   }.    return SQ
1fdc0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72  LITE_OK;.  }.  r
1fdd0 65 74 75 72 6e 20 70 2d 3e 70 52 65 61 6c 2d 3e  eturn p->pReal->
1fde0 70 4d 65 74 68 6f 64 73 2d 3e 78 53 79 6e 63 28  pMethods->xSync(
1fdf0 70 2d 3e 70 52 65 61 6c 2c 20 66 6c 61 67 73 29  p->pReal, flags)
1fe00 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1fe10 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 66 69  n the current fi
1fe20 6c 65 2d 73 69 7a 65 20 6f 66 20 61 6e 20 72 62  le-size of an rb
1fe30 75 56 66 73 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74  uVfs-file..*/.st
1fe40 61 74 69 63 20 69 6e 74 20 72 62 75 56 66 73 46  atic int rbuVfsF
1fe50 69 6c 65 53 69 7a 65 28 73 71 6c 69 74 65 33 5f  ileSize(sqlite3_
1fe60 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 73 71 6c  file *pFile, sql
1fe70 69 74 65 5f 69 6e 74 36 34 20 2a 70 53 69 7a 65  ite_int64 *pSize
1fe80 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a 70  ){.  rbu_file *p
1fe90 20 3d 20 28 72 62 75 5f 66 69 6c 65 20 2a 29 70   = (rbu_file *)p
1fea0 46 69 6c 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  File;.  int rc;.
1feb0 20 20 72 63 20 3d 20 70 2d 3e 70 52 65 61 6c 2d    rc = p->pReal-
1fec0 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 46 69 6c 65  >pMethods->xFile
1fed0 53 69 7a 65 28 70 2d 3e 70 52 65 61 6c 2c 20 70  Size(p->pReal, p
1fee0 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  Size);..  /* If 
1fef0 74 68 69 73 20 69 73 20 61 6e 20 52 42 55 20 76  this is an RBU v
1ff00 61 63 75 75 6d 20 6f 70 65 72 61 74 69 6f 6e 20  acuum operation 
1ff10 61 6e 64 20 74 68 69 73 20 69 73 20 74 68 65 20  and this is the 
1ff20 74 61 72 67 65 74 20 64 61 74 61 62 61 73 65 2c  target database,
1ff30 0a 20 20 2a 2a 20 70 72 65 74 65 6e 64 20 74 68  .  ** pretend th
1ff40 61 74 20 69 74 20 68 61 73 20 61 74 20 6c 65 61  at it has at lea
1ff50 73 74 20 6f 6e 65 20 70 61 67 65 2e 20 4f 74 68  st one page. Oth
1ff60 65 72 77 69 73 65 2c 20 53 51 4c 69 74 65 20 77  erwise, SQLite w
1ff70 69 6c 6c 20 6e 6f 74 0a 20 20 2a 2a 20 63 68 65  ill not.  ** che
1ff80 63 6b 20 66 6f 72 20 74 68 65 20 65 78 69 73 74  ck for the exist
1ff90 61 6e 63 65 20 6f 66 20 61 20 2a 2d 77 61 6c 20  ance of a *-wal 
1ffa0 66 69 6c 65 2e 20 72 62 75 56 66 73 52 65 61 64  file. rbuVfsRead
1ffb0 28 29 20 63 6f 6e 74 61 69 6e 73 20 0a 20 20 2a  () contains .  *
1ffc0 2a 20 73 69 6d 69 6c 61 72 20 6c 6f 67 69 63 2e  * similar logic.
1ffd0 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53    */.  if( rc==S
1ffe0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 2a 70 53 69  QLITE_OK && *pSi
1fff0 7a 65 3d 3d 30 20 0a 20 20 20 26 26 20 70 2d 3e  ze==0 .   && p->
20000 70 52 62 75 20 26 26 20 72 62 75 49 73 56 61 63  pRbu && rbuIsVac
20010 75 75 6d 28 70 2d 3e 70 52 62 75 29 20 0a 20 20  uum(p->pRbu) .  
20020 20 26 26 20 28 70 2d 3e 6f 70 65 6e 46 6c 61 67   && (p->openFlag
20030 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
20040 4d 41 49 4e 5f 44 42 29 0a 20 20 29 7b 0a 20 20  MAIN_DB).  ){.  
20050 20 20 2a 70 53 69 7a 65 20 3d 20 31 30 32 34 3b    *pSize = 1024;
20060 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
20070 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20  ;.}../*.** Lock 
20080 61 6e 20 72 62 75 56 66 73 2d 66 69 6c 65 2e 0a  an rbuVfs-file..
20090 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62  */.static int rb
200a0 75 56 66 73 4c 6f 63 6b 28 73 71 6c 69 74 65 33  uVfsLock(sqlite3
200b0 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e  _file *pFile, in
200c0 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 72 62 75 5f  t eLock){.  rbu_
200d0 66 69 6c 65 20 2a 70 20 3d 20 28 72 62 75 5f 66  file *p = (rbu_f
200e0 69 6c 65 2a 29 70 46 69 6c 65 3b 0a 20 20 73 71  ile*)pFile;.  sq
200f0 6c 69 74 65 33 72 62 75 20 2a 70 52 62 75 20 3d  lite3rbu *pRbu =
20100 20 70 2d 3e 70 52 62 75 3b 0a 20 20 69 6e 74 20   p->pRbu;.  int 
20110 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
20120 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70  .  assert( p->op
20130 65 6e 46 6c 61 67 73 20 26 20 28 53 51 4c 49 54  enFlags & (SQLIT
20140 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 7c 53  E_OPEN_MAIN_DB|S
20150 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
20160 44 42 29 20 29 3b 0a 20 20 69 66 28 20 65 4c 6f  DB) );.  if( eLo
20170 63 6b 3d 3d 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f  ck==SQLITE_LOCK_
20180 45 58 43 4c 55 53 49 56 45 20 0a 20 20 20 26 26  EXCLUSIVE .   &&
20190 20 28 70 2d 3e 62 4e 6f 6c 6f 63 6b 20 7c 7c 20   (p->bNolock || 
201a0 28 70 52 62 75 20 26 26 20 70 52 62 75 2d 3e 65  (pRbu && pRbu->e
201b0 53 74 61 67 65 21 3d 52 42 55 5f 53 54 41 47 45  Stage!=RBU_STAGE
201c0 5f 44 4f 4e 45 29 29 0a 20 20 29 7b 0a 20 20 20  _DONE)).  ){.   
201d0 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77   /* Do not allow
201e0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73   EXCLUSIVE locks
201f0 2e 20 50 72 65 76 65 6e 74 69 6e 67 20 53 51 4c  . Preventing SQL
20200 69 74 65 20 66 72 6f 6d 20 74 61 6b 69 6e 67 20  ite from taking 
20210 74 68 69 73 20 0a 20 20 20 20 2a 2a 20 70 72 65  this .    ** pre
20220 76 65 6e 74 73 20 69 74 20 66 72 6f 6d 20 63 68  vents it from ch
20230 65 63 6b 70 6f 69 6e 74 69 6e 67 20 74 68 65 20  eckpointing the 
20240 64 61 74 61 62 61 73 65 20 66 72 6f 6d 20 73 71  database from sq
20250 6c 69 74 65 33 5f 63 6c 6f 73 65 28 29 2e 20 2a  lite3_close(). *
20260 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  /.    rc = SQLIT
20270 45 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b  E_BUSY;.  }else{
20280 0a 20 20 20 20 72 63 20 3d 20 70 2d 3e 70 52 65  .    rc = p->pRe
20290 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 4c  al->pMethods->xL
202a0 6f 63 6b 28 70 2d 3e 70 52 65 61 6c 2c 20 65 4c  ock(p->pReal, eL
202b0 6f 63 6b 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  ock);.  }..  ret
202c0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
202d0 20 55 6e 6c 6f 63 6b 20 61 6e 20 72 62 75 56 66   Unlock an rbuVf
202e0 73 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  s-file..*/.stati
202f0 63 20 69 6e 74 20 72 62 75 56 66 73 55 6e 6c 6f  c int rbuVfsUnlo
20300 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
20310 2a 70 46 69 6c 65 2c 20 69 6e 74 20 65 4c 6f 63  *pFile, int eLoc
20320 6b 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a  k){.  rbu_file *
20330 70 20 3d 20 28 72 62 75 5f 66 69 6c 65 20 2a 29  p = (rbu_file *)
20340 70 46 69 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20  pFile;.  return 
20350 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f  p->pReal->pMetho
20360 64 73 2d 3e 78 55 6e 6c 6f 63 6b 28 70 2d 3e 70  ds->xUnlock(p->p
20370 52 65 61 6c 2c 20 65 4c 6f 63 6b 29 3b 0a 7d 0a  Real, eLock);.}.
20380 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 69 66 20  ./*.** Check if 
20390 61 6e 6f 74 68 65 72 20 66 69 6c 65 2d 68 61 6e  another file-han
203a0 64 6c 65 20 68 6f 6c 64 73 20 61 20 52 45 53 45  dle holds a RESE
203b0 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 61 6e 20  RVED lock on an 
203c0 72 62 75 56 66 73 2d 66 69 6c 65 2e 0a 2a 2f 0a  rbuVfs-file..*/.
203d0 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 56 66  static int rbuVf
203e0 73 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  sCheckReservedLo
203f0 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
20400 2a 70 46 69 6c 65 2c 20 69 6e 74 20 2a 70 52 65  *pFile, int *pRe
20410 73 4f 75 74 29 7b 0a 20 20 72 62 75 5f 66 69 6c  sOut){.  rbu_fil
20420 65 20 2a 70 20 3d 20 28 72 62 75 5f 66 69 6c 65  e *p = (rbu_file
20430 20 2a 29 70 46 69 6c 65 3b 0a 20 20 72 65 74 75   *)pFile;.  retu
20440 72 6e 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65  rn p->pReal->pMe
20450 74 68 6f 64 73 2d 3e 78 43 68 65 63 6b 52 65 73  thods->xCheckRes
20460 65 72 76 65 64 4c 6f 63 6b 28 70 2d 3e 70 52 65  ervedLock(p->pRe
20470 61 6c 2c 20 70 52 65 73 4f 75 74 29 3b 0a 7d 0a  al, pResOut);.}.
20480 0a 2f 2a 0a 2a 2a 20 46 69 6c 65 20 63 6f 6e 74  ./*.** File cont
20490 72 6f 6c 20 6d 65 74 68 6f 64 2e 20 46 6f 72 20  rol method. For 
204a0 63 75 73 74 6f 6d 20 6f 70 65 72 61 74 69 6f 6e  custom operation
204b0 73 20 6f 6e 20 61 6e 20 72 62 75 56 66 73 2d 66  s on an rbuVfs-f
204c0 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
204d0 6e 74 20 72 62 75 56 66 73 46 69 6c 65 43 6f 6e  nt rbuVfsFileCon
204e0 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c  trol(sqlite3_fil
204f0 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20 6f 70  e *pFile, int op
20500 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20  , void *pArg){. 
20510 20 72 62 75 5f 66 69 6c 65 20 2a 70 20 3d 20 28   rbu_file *p = (
20520 72 62 75 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65  rbu_file *)pFile
20530 3b 0a 20 20 69 6e 74 20 28 2a 78 43 6f 6e 74 72  ;.  int (*xContr
20540 6f 6c 29 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ol)(sqlite3_file
20550 2a 2c 69 6e 74 2c 76 6f 69 64 2a 29 20 3d 20 70  *,int,void*) = p
20560 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64  ->pReal->pMethod
20570 73 2d 3e 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 3b  s->xFileControl;
20580 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
20590 73 65 72 74 28 20 70 2d 3e 6f 70 65 6e 46 6c 61  sert( p->openFla
205a0 67 73 20 26 20 28 53 51 4c 49 54 45 5f 4f 50 45  gs & (SQLITE_OPE
205b0 4e 5f 4d 41 49 4e 5f 44 42 7c 53 51 4c 49 54 45  N_MAIN_DB|SQLITE
205c0 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 29 0a 20  _OPEN_TEMP_DB). 
205d0 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6f 70 65 6e        || p->open
205e0 46 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f  Flags & (SQLITE_
205f0 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44  OPEN_TRANSIENT_D
20600 42 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45  B|SQLITE_OPEN_TE
20610 4d 50 5f 4a 4f 55 52 4e 41 4c 29 0a 20 20 29 3b  MP_JOURNAL).  );
20620 0a 20 20 69 66 28 20 6f 70 3d 3d 53 51 4c 49 54  .  if( op==SQLIT
20630 45 5f 46 43 4e 54 4c 5f 52 42 55 20 29 7b 0a 20  E_FCNTL_RBU ){. 
20640 20 20 20 73 71 6c 69 74 65 33 72 62 75 20 2a 70     sqlite3rbu *p
20650 52 62 75 20 3d 20 28 73 71 6c 69 74 65 33 72 62  Rbu = (sqlite3rb
20660 75 2a 29 70 41 72 67 3b 0a 0a 20 20 20 20 2f 2a  u*)pArg;..    /*
20670 20 46 69 72 73 74 20 74 72 79 20 74 6f 20 66 69   First try to fi
20680 6e 64 20 61 6e 6f 74 68 65 72 20 52 42 55 20 76  nd another RBU v
20690 66 73 20 6c 6f 77 65 72 20 64 6f 77 6e 20 69 6e  fs lower down in
206a0 20 74 68 65 20 76 66 73 20 73 74 61 63 6b 2e 20   the vfs stack. 
206b0 49 66 0a 20 20 20 20 2a 2a 20 6f 6e 65 20 69 73  If.    ** one is
206c0 20 66 6f 75 6e 64 2c 20 74 68 69 73 20 76 66 73   found, this vfs
206d0 20 77 69 6c 6c 20 6f 70 65 72 61 74 65 20 69 6e   will operate in
206e0 20 70 61 73 73 2d 74 68 72 6f 75 67 68 20 6d 6f   pass-through mo
206f0 64 65 2e 20 54 68 65 20 6c 6f 77 65 72 0a 20 20  de. The lower.  
20700 20 20 2a 2a 20 6c 65 76 65 6c 20 76 66 73 20 77    ** level vfs w
20710 69 6c 6c 20 64 6f 20 74 68 65 20 73 70 65 63 69  ill do the speci
20720 61 6c 20 52 42 55 20 68 61 6e 64 6c 69 6e 67 2e  al RBU handling.
20730 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 78 43    */.    rc = xC
20740 6f 6e 74 72 6f 6c 28 70 2d 3e 70 52 65 61 6c 2c  ontrol(p->pReal,
20750 20 6f 70 2c 20 70 41 72 67 29 3b 0a 0a 20 20 20   op, pArg);..   
20760 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
20770 4e 4f 54 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20  NOTFOUND ){.    
20780 20 20 2f 2a 20 4e 6f 77 20 73 65 61 72 63 68 20    /* Now search 
20790 66 6f 72 20 61 20 7a 69 70 76 66 73 20 69 6e 73  for a zipvfs ins
207a0 74 61 6e 63 65 20 6c 6f 77 65 72 20 64 6f 77 6e  tance lower down
207b0 20 69 6e 20 74 68 65 20 56 46 53 20 73 74 61 63   in the VFS stac
207c0 6b 2e 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 6f  k. If.      ** o
207d0 6e 65 20 69 73 20 66 6f 75 6e 64 2c 20 74 68 69  ne is found, thi
207e0 73 20 69 73 20 61 6e 20 65 72 72 6f 72 2e 20 20  s is an error.  
207f0 2a 2f 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 64  */.      void *d
20800 75 6d 6d 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  ummy = 0;.      
20810 72 63 20 3d 20 78 43 6f 6e 74 72 6f 6c 28 70 2d  rc = xControl(p-
20820 3e 70 52 65 61 6c 2c 20 53 51 4c 49 54 45 5f 46  >pReal, SQLITE_F
20830 43 4e 54 4c 5f 5a 49 50 56 46 53 2c 20 26 64 75  CNTL_ZIPVFS, &du
20840 6d 6d 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20  mmy);.      if( 
20850 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
20860 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
20870 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
20880 20 20 20 20 70 52 62 75 2d 3e 7a 45 72 72 6d 73      pRbu->zErrms
20890 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  g = sqlite3_mpri
208a0 6e 74 66 28 22 72 62 75 2f 7a 69 70 76 66 73 20  ntf("rbu/zipvfs 
208b0 73 65 74 75 70 20 65 72 72 6f 72 22 29 3b 0a 20  setup error");. 
208c0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72       }else if( r
208d0 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  c==SQLITE_NOTFOU
208e0 4e 44 20 29 7b 0a 20 20 20 20 20 20 20 20 70 52  ND ){.        pR
208f0 62 75 2d 3e 70 54 61 72 67 65 74 46 64 20 3d 20  bu->pTargetFd = 
20900 70 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 52  p;.        p->pR
20910 62 75 20 3d 20 70 52 62 75 3b 0a 20 20 20 20 20  bu = pRbu;.     
20920 20 20 20 69 66 28 20 70 2d 3e 70 57 61 6c 46 64     if( p->pWalFd
20930 20 29 20 70 2d 3e 70 57 61 6c 46 64 2d 3e 70 52   ) p->pWalFd->pR
20940 62 75 20 3d 20 70 52 62 75 3b 0a 20 20 20 20 20  bu = pRbu;.     
20950 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
20960 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  K;.      }.    }
20970 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
20980 20 20 7d 0a 20 20 65 6c 73 65 20 69 66 28 20 6f    }.  else if( o
20990 70 3d 3d 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  p==SQLITE_FCNTL_
209a0 52 42 55 43 4e 54 20 29 7b 0a 20 20 20 20 73 71  RBUCNT ){.    sq
209b0 6c 69 74 65 33 72 62 75 20 2a 70 52 62 75 20 3d  lite3rbu *pRbu =
209c0 20 28 73 71 6c 69 74 65 33 72 62 75 2a 29 70 41   (sqlite3rbu*)pA
209d0 72 67 3b 0a 20 20 20 20 70 52 62 75 2d 3e 6e 52  rg;.    pRbu->nR
209e0 62 75 2b 2b 3b 0a 20 20 20 20 70 52 62 75 2d 3e  bu++;.    pRbu->
209f0 70 52 62 75 46 64 20 3d 20 70 3b 0a 20 20 20 20  pRbuFd = p;.    
20a00 70 2d 3e 62 4e 6f 6c 6f 63 6b 20 3d 20 31 3b 0a  p->bNolock = 1;.
20a10 20 20 7d 0a 0a 20 20 72 63 20 3d 20 78 43 6f 6e    }..  rc = xCon
20a20 74 72 6f 6c 28 70 2d 3e 70 52 65 61 6c 2c 20 6f  trol(p->pReal, o
20a30 70 2c 20 70 41 72 67 29 3b 0a 20 20 69 66 28 20  p, pArg);.  if( 
20a40 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
20a50 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 46 43 4e 54   op==SQLITE_FCNT
20a60 4c 5f 56 46 53 4e 41 4d 45 20 29 7b 0a 20 20 20  L_VFSNAME ){.   
20a70 20 72 62 75 5f 76 66 73 20 2a 70 52 62 75 56 66   rbu_vfs *pRbuVf
20a80 73 20 3d 20 70 2d 3e 70 52 62 75 56 66 73 3b 0a  s = p->pRbuVfs;.
20a90 20 20 20 20 63 68 61 72 20 2a 7a 49 6e 20 3d 20      char *zIn = 
20aa0 2a 28 63 68 61 72 2a 2a 29 70 41 72 67 3b 0a 20  *(char**)pArg;. 
20ab0 20 20 20 63 68 61 72 20 2a 7a 4f 75 74 20 3d 20     char *zOut = 
20ac0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
20ad0 22 72 62 75 28 25 73 29 2f 25 7a 22 2c 20 70 52  "rbu(%s)/%z", pR
20ae0 62 75 56 66 73 2d 3e 62 61 73 65 2e 7a 4e 61 6d  buVfs->base.zNam
20af0 65 2c 20 7a 49 6e 29 3b 0a 20 20 20 20 2a 28 63  e, zIn);.    *(c
20b00 68 61 72 2a 2a 29 70 41 72 67 20 3d 20 7a 4f 75  har**)pArg = zOu
20b10 74 3b 0a 20 20 20 20 69 66 28 20 7a 4f 75 74 3d  t;.    if( zOut=
20b20 3d 30 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45  =0 ) rc = SQLITE
20b30 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 72  _NOMEM;.  }..  r
20b40 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
20b50 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 65  ** Return the se
20b60 63 74 6f 72 2d 73 69 7a 65 20 69 6e 20 62 79 74  ctor-size in byt
20b70 65 73 20 66 6f 72 20 61 6e 20 72 62 75 56 66 73  es for an rbuVfs
20b80 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  -file..*/.static
20b90 20 69 6e 74 20 72 62 75 56 66 73 53 65 63 74 6f   int rbuVfsSecto
20ba0 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69  rSize(sqlite3_fi
20bb0 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 72 62  le *pFile){.  rb
20bc0 75 5f 66 69 6c 65 20 2a 70 20 3d 20 28 72 62 75  u_file *p = (rbu
20bd0 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20  _file *)pFile;. 
20be0 20 72 65 74 75 72 6e 20 70 2d 3e 70 52 65 61 6c   return p->pReal
20bf0 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53 65 63  ->pMethods->xSec
20c00 74 6f 72 53 69 7a 65 28 70 2d 3e 70 52 65 61 6c  torSize(p->pReal
20c10 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
20c20 72 6e 20 74 68 65 20 64 65 76 69 63 65 20 63 68  rn the device ch
20c30 61 72 61 63 74 65 72 69 73 74 69 63 20 66 6c 61  aracteristic fla
20c40 67 73 20 73 75 70 70 6f 72 74 65 64 20 62 79 20  gs supported by 
20c50 61 6e 20 72 62 75 56 66 73 2d 66 69 6c 65 2e 0a  an rbuVfs-file..
20c60 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62  */.static int rb
20c70 75 56 66 73 44 65 76 69 63 65 43 68 61 72 61 63  uVfsDeviceCharac
20c80 74 65 72 69 73 74 69 63 73 28 73 71 6c 69 74 65  teristics(sqlite
20c90 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  3_file *pFile){.
20ca0 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 20 3d 20    rbu_file *p = 
20cb0 28 72 62 75 5f 66 69 6c 65 20 2a 29 70 46 69 6c  (rbu_file *)pFil
20cc0 65 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70  e;.  return p->p
20cd0 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e  Real->pMethods->
20ce0 78 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  xDeviceCharacter
20cf0 69 73 74 69 63 73 28 70 2d 3e 70 52 65 61 6c 29  istics(p->pReal)
20d00 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 61 6b 65 20  ;.}../*.** Take 
20d10 6f 72 20 72 65 6c 65 61 73 65 20 61 20 73 68 61  or release a sha
20d20 72 65 64 2d 6d 65 6d 6f 72 79 20 6c 6f 63 6b 2e  red-memory lock.
20d30 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
20d40 62 75 56 66 73 53 68 6d 4c 6f 63 6b 28 73 71 6c  buVfsShmLock(sql
20d50 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65  ite3_file *pFile
20d60 2c 20 69 6e 74 20 6f 66 73 74 2c 20 69 6e 74 20  , int ofst, int 
20d70 6e 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  n, int flags){. 
20d80 20 72 62 75 5f 66 69 6c 65 20 2a 70 20 3d 20 28   rbu_file *p = (
20d90 72 62 75 5f 66 69 6c 65 2a 29 70 46 69 6c 65 3b  rbu_file*)pFile;
20da0 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20 2a 70  .  sqlite3rbu *p
20db0 52 62 75 20 3d 20 70 2d 3e 70 52 62 75 3b 0a 20  Rbu = p->pRbu;. 
20dc0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
20dd0 5f 4f 4b 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  _OK;..#ifdef SQL
20de0 49 54 45 5f 41 4d 41 4c 47 41 4d 41 54 49 4f 4e  ITE_AMALGAMATION
20df0 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 41 4c  .    assert( WAL
20e00 5f 43 4b 50 54 5f 4c 4f 43 4b 3d 3d 31 20 29 3b  _CKPT_LOCK==1 );
20e10 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
20e20 74 28 20 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20  t( p->openFlags 
20e30 26 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  & (SQLITE_OPEN_M
20e40 41 49 4e 5f 44 42 7c 53 51 4c 49 54 45 5f 4f 50  AIN_DB|SQLITE_OP
20e50 45 4e 5f 54 45 4d 50 5f 44 42 29 20 29 3b 0a 20  EN_TEMP_DB) );. 
20e60 20 69 66 28 20 70 52 62 75 20 26 26 20 28 70 52   if( pRbu && (pR
20e70 62 75 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f  bu->eStage==RBU_
20e80 53 54 41 47 45 5f 4f 41 4c 20 7c 7c 20 70 52 62  STAGE_OAL || pRb
20e90 75 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53  u->eStage==RBU_S
20ea0 54 41 47 45 5f 4d 4f 56 45 29 20 29 7b 0a 20 20  TAGE_MOVE) ){.  
20eb0 20 20 2f 2a 20 4d 61 67 69 63 20 6e 75 6d 62 65    /* Magic numbe
20ec0 72 20 31 20 69 73 20 74 68 65 20 57 41 4c 5f 43  r 1 is the WAL_C
20ed0 4b 50 54 5f 4c 4f 43 4b 20 6c 6f 63 6b 2e 20 50  KPT_LOCK lock. P
20ee0 72 65 76 65 6e 74 69 6e 67 20 53 51 4c 69 74 65  reventing SQLite
20ef0 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 61 6b   from.    ** tak
20f00 69 6e 67 20 74 68 69 73 20 6c 6f 63 6b 20 61 6c  ing this lock al
20f10 73 6f 20 70 72 65 76 65 6e 74 73 20 61 6e 79 20  so prevents any 
20f20 63 68 65 63 6b 70 6f 69 6e 74 73 20 66 72 6f 6d  checkpoints from
20f30 20 6f 63 63 75 72 72 69 6e 67 2e 20 0a 20 20 20   occurring. .   
20f40 20 2a 2a 20 74 6f 64 6f 3a 20 72 65 61 6c 6c 79   ** todo: really
20f50 2c 20 69 74 27 73 20 6e 6f 74 20 63 6c 65 61 72  , it's not clear
20f60 20 77 68 79 20 74 68 69 73 20 6d 69 67 68 74 20   why this might 
20f70 6f 63 63 75 72 2c 20 61 73 20 0a 20 20 20 20 2a  occur, as .    *
20f80 2a 20 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70  * wal_autocheckp
20f90 6f 69 6e 74 20 6f 75 67 68 74 20 74 6f 20 62 65  oint ought to be
20fa0 20 74 75 72 6e 65 64 20 6f 66 66 2e 20 20 2a 2f   turned off.  */
20fb0 0a 20 20 20 20 69 66 28 20 6f 66 73 74 3d 3d 57  .    if( ofst==W
20fc0 41 4c 5f 4c 4f 43 4b 5f 43 4b 50 54 20 26 26 20  AL_LOCK_CKPT && 
20fd0 6e 3d 3d 31 20 29 20 72 63 20 3d 20 53 51 4c 49  n==1 ) rc = SQLI
20fe0 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65  TE_BUSY;.  }else
20ff0 7b 0a 20 20 20 20 69 6e 74 20 62 43 61 70 74 75  {.    int bCaptu
21000 72 65 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  re = 0;.    if( 
21010 6e 3d 3d 31 20 26 26 20 28 66 6c 61 67 73 20 26  n==1 && (flags &
21020 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c   SQLITE_SHM_EXCL
21030 55 53 49 56 45 29 0a 20 20 20 20 20 26 26 20 70  USIVE).     && p
21040 52 62 75 20 26 26 20 70 52 62 75 2d 3e 65 53 74  Rbu && pRbu->eSt
21050 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 43  age==RBU_STAGE_C
21060 41 50 54 55 52 45 0a 20 20 20 20 20 26 26 20 28  APTURE.     && (
21070 6f 66 73 74 3d 3d 57 41 4c 5f 4c 4f 43 4b 5f 57  ofst==WAL_LOCK_W
21080 52 49 54 45 20 7c 7c 20 6f 66 73 74 3d 3d 57 41  RITE || ofst==WA
21090 4c 5f 4c 4f 43 4b 5f 43 4b 50 54 20 7c 7c 20 6f  L_LOCK_CKPT || o
210a0 66 73 74 3d 3d 57 41 4c 5f 4c 4f 43 4b 5f 52 45  fst==WAL_LOCK_RE
210b0 41 44 30 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  AD0).    ){.    
210c0 20 20 62 43 61 70 74 75 72 65 20 3d 20 31 3b 0a    bCapture = 1;.
210d0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 62      }..    if( b
210e0 43 61 70 74 75 72 65 3d 3d 30 20 7c 7c 20 30 3d  Capture==0 || 0=
210f0 3d 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  =(flags & SQLITE
21100 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 29 20 29 7b 0a  _SHM_UNLOCK) ){.
21110 20 20 20 20 20 20 72 63 20 3d 20 70 2d 3e 70 52        rc = p->pR
21120 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78  eal->pMethods->x
21130 53 68 6d 4c 6f 63 6b 28 70 2d 3e 70 52 65 61 6c  ShmLock(p->pReal
21140 2c 20 6f 66 73 74 2c 20 6e 2c 20 66 6c 61 67 73  , ofst, n, flags
21150 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62 43 61  );.      if( bCa
21160 70 74 75 72 65 20 26 26 20 72 63 3d 3d 53 51 4c  pture && rc==SQL
21170 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
21180 20 20 70 52 62 75 2d 3e 6d 4c 6f 63 6b 20 7c 3d    pRbu->mLock |=
21190 20 28 31 20 3c 3c 20 6f 66 73 74 29 3b 0a 20 20   (1 << ofst);.  
211a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
211b0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
211c0 0a 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 61 20  ./*.** Obtain a 
211d0 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6d 61 70  pointer to a map
211e0 70 69 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c 65  ping of a single
211f0 20 33 32 4b 69 42 20 70 61 67 65 20 6f 66 20 74   32KiB page of t
21200 68 65 20 2a 2d 73 68 6d 20 66 69 6c 65 2e 0a 2a  he *-shm file..*
21210 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62 75  /.static int rbu
21220 56 66 73 53 68 6d 4d 61 70 28 0a 20 20 73 71 6c  VfsShmMap(.  sql
21230 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65  ite3_file *pFile
21240 2c 20 0a 20 20 69 6e 74 20 69 52 65 67 69 6f 6e  , .  int iRegion
21250 2c 20 0a 20 20 69 6e 74 20 73 7a 52 65 67 69 6f  , .  int szRegio
21260 6e 2c 20 0a 20 20 69 6e 74 20 69 73 57 72 69 74  n, .  int isWrit
21270 65 2c 20 0a 20 20 76 6f 69 64 20 76 6f 6c 61 74  e, .  void volat
21280 69 6c 65 20 2a 2a 70 70 0a 29 7b 0a 20 20 72 62  ile **pp.){.  rb
21290 75 5f 66 69 6c 65 20 2a 70 20 3d 20 28 72 62 75  u_file *p = (rbu
212a0 5f 66 69 6c 65 2a 29 70 46 69 6c 65 3b 0a 20 20  _file*)pFile;.  
212b0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
212c0 4f 4b 3b 0a 20 20 69 6e 74 20 65 53 74 61 67 65  OK;.  int eStage
212d0 20 3d 20 28 70 2d 3e 70 52 62 75 20 3f 20 70 2d   = (p->pRbu ? p-
212e0 3e 70 52 62 75 2d 3e 65 53 74 61 67 65 20 3a 20  >pRbu->eStage : 
212f0 30 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 74  0);..  /* If not
21300 20 69 6e 20 52 42 55 5f 53 54 41 47 45 5f 4f 41   in RBU_STAGE_OA
21310 4c 2c 20 61 6c 6c 6f 77 20 74 68 69 73 20 63 61  L, allow this ca
21320 6c 6c 20 74 6f 20 70 61 73 73 20 74 68 72 6f 75  ll to pass throu
21330 67 68 2e 20 4f 72 2c 20 69 66 20 74 68 69 73 0a  gh. Or, if this.
21340 20 20 2a 2a 20 72 62 75 20 69 73 20 69 6e 20 74    ** rbu is in t
21350 68 65 20 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c  he RBU_STAGE_OAL
21360 20 73 74 61 74 65 2c 20 75 73 65 20 68 65 61 70   state, use heap
21370 20 6d 65 6d 6f 72 79 20 66 6f 72 20 2a 2d 73 68   memory for *-sh
21380 6d 20 73 70 61 63 65 20 0a 20 20 2a 2a 20 69 6e  m space .  ** in
21390 73 74 65 61 64 20 6f 66 20 61 20 66 69 6c 65 20  stead of a file 
213a0 6f 6e 20 64 69 73 6b 2e 20 20 2a 2f 0a 20 20 61  on disk.  */.  a
213b0 73 73 65 72 74 28 20 70 2d 3e 6f 70 65 6e 46 6c  ssert( p->openFl
213c0 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f 4f 50  ags & (SQLITE_OP
213d0 45 4e 5f 4d 41 49 4e 5f 44 42 7c 53 51 4c 49 54  EN_MAIN_DB|SQLIT
213e0 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 29 20  E_OPEN_TEMP_DB) 
213f0 29 3b 0a 20 20 69 66 28 20 65 53 74 61 67 65 3d  );.  if( eStage=
21400 3d 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20 7c  =RBU_STAGE_OAL |
21410 7c 20 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54  | eStage==RBU_ST
21420 41 47 45 5f 4d 4f 56 45 20 29 7b 0a 20 20 20 20  AGE_MOVE ){.    
21430 69 66 28 20 69 52 65 67 69 6f 6e 3c 3d 70 2d 3e  if( iRegion<=p->
21440 6e 53 68 6d 20 29 7b 0a 20 20 20 20 20 20 69 6e  nShm ){.      in
21450 74 20 6e 42 79 74 65 20 3d 20 28 69 52 65 67 69  t nByte = (iRegi
21460 6f 6e 2b 31 29 20 2a 20 73 69 7a 65 6f 66 28 63  on+1) * sizeof(c
21470 68 61 72 2a 29 3b 0a 20 20 20 20 20 20 63 68 61  har*);.      cha
21480 72 20 2a 2a 61 70 4e 65 77 20 3d 20 28 63 68 61  r **apNew = (cha
21490 72 2a 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c  r**)sqlite3_real
214a0 6c 6f 63 36 34 28 70 2d 3e 61 70 53 68 6d 2c 20  loc64(p->apShm, 
214b0 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 69 66  nByte);.      if
214c0 28 20 61 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  ( apNew==0 ){.  
214d0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
214e0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d  E_NOMEM;.      }
214f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65  else{.        me
21500 6d 73 65 74 28 26 61 70 4e 65 77 5b 70 2d 3e 6e  mset(&apNew[p->n
21510 53 68 6d 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Shm], 0, sizeof(
21520 63 68 61 72 2a 29 20 2a 20 28 31 20 2b 20 69 52  char*) * (1 + iR
21530 65 67 69 6f 6e 20 2d 20 70 2d 3e 6e 53 68 6d 29  egion - p->nShm)
21540 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 70  );.        p->ap
21550 53 68 6d 20 3d 20 61 70 4e 65 77 3b 0a 20 20 20  Shm = apNew;.   
21560 20 20 20 20 20 70 2d 3e 6e 53 68 6d 20 3d 20 69       p->nShm = i
21570 52 65 67 69 6f 6e 2b 31 3b 0a 20 20 20 20 20 20  Region+1;.      
21580 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  }.    }..    if(
21590 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
215a0 26 20 70 2d 3e 61 70 53 68 6d 5b 69 52 65 67 69  & p->apShm[iRegi
215b0 6f 6e 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  on]==0 ){.      
215c0 63 68 61 72 20 2a 70 4e 65 77 20 3d 20 28 63 68  char *pNew = (ch
215d0 61 72 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  ar*)sqlite3_mall
215e0 6f 63 36 34 28 73 7a 52 65 67 69 6f 6e 29 3b 0a  oc64(szRegion);.
215f0 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d        if( pNew==
21600 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
21610 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
21620 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
21630 20 20 20 20 20 6d 65 6d 73 65 74 28 70 4e 65 77       memset(pNew
21640 2c 20 30 2c 20 73 7a 52 65 67 69 6f 6e 29 3b 0a  , 0, szRegion);.
21650 20 20 20 20 20 20 20 20 70 2d 3e 61 70 53 68 6d          p->apShm
21660 5b 69 52 65 67 69 6f 6e 5d 20 3d 20 70 4e 65 77  [iRegion] = pNew
21670 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
21680 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
21690 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
216a0 2a 70 70 20 3d 20 70 2d 3e 61 70 53 68 6d 5b 69  *pp = p->apShm[i
216b0 52 65 67 69 6f 6e 5d 3b 0a 20 20 20 20 7d 65 6c  Region];.    }el
216c0 73 65 7b 0a 20 20 20 20 20 20 2a 70 70 20 3d 20  se{.      *pp = 
216d0 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  0;.    }.  }else
216e0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
216f0 3e 61 70 53 68 6d 3d 3d 30 20 29 3b 0a 20 20 20  >apShm==0 );.   
21700 20 72 63 20 3d 20 70 2d 3e 70 52 65 61 6c 2d 3e   rc = p->pReal->
21710 70 4d 65 74 68 6f 64 73 2d 3e 78 53 68 6d 4d 61  pMethods->xShmMa
21720 70 28 70 2d 3e 70 52 65 61 6c 2c 20 69 52 65 67  p(p->pReal, iReg
21730 69 6f 6e 2c 20 73 7a 52 65 67 69 6f 6e 2c 20 69  ion, szRegion, i
21740 73 57 72 69 74 65 2c 20 70 70 29 3b 0a 20 20 7d  sWrite, pp);.  }
21750 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
21760 0a 0a 2f 2a 0a 2a 2a 20 4d 65 6d 6f 72 79 20 62  ../*.** Memory b
21770 61 72 72 69 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  arrier..*/.stati
21780 63 20 76 6f 69 64 20 72 62 75 56 66 73 53 68 6d  c void rbuVfsShm
21790 42 61 72 72 69 65 72 28 73 71 6c 69 74 65 33 5f  Barrier(sqlite3_
217a0 66 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  file *pFile){.  
217b0 72 62 75 5f 66 69 6c 65 20 2a 70 20 3d 20 28 72  rbu_file *p = (r
217c0 62 75 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65 3b  bu_file *)pFile;
217d0 0a 20 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65  .  p->pReal->pMe
217e0 74 68 6f 64 73 2d 3e 78 53 68 6d 42 61 72 72 69  thods->xShmBarri
217f0 65 72 28 70 2d 3e 70 52 65 61 6c 29 3b 0a 7d 0a  er(p->pReal);.}.
21800 0a 2f 2a 0a 2a 2a 20 54 68 65 20 78 53 68 6d 55  ./*.** The xShmU
21810 6e 6d 61 70 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a  nmap method..*/.
21820 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 56 66  static int rbuVf
21830 73 53 68 6d 55 6e 6d 61 70 28 73 71 6c 69 74 65  sShmUnmap(sqlite
21840 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69  3_file *pFile, i
21850 6e 74 20 64 65 6c 46 6c 61 67 29 7b 0a 20 20 72  nt delFlag){.  r
21860 62 75 5f 66 69 6c 65 20 2a 70 20 3d 20 28 72 62  bu_file *p = (rb
21870 75 5f 66 69 6c 65 2a 29 70 46 69 6c 65 3b 0a 20  u_file*)pFile;. 
21880 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
21890 5f 4f 4b 3b 0a 20 20 69 6e 74 20 65 53 74 61 67  _OK;.  int eStag
218a0 65 20 3d 20 28 70 2d 3e 70 52 62 75 20 3f 20 70  e = (p->pRbu ? p
218b0 2d 3e 70 52 62 75 2d 3e 65 53 74 61 67 65 20 3a  ->pRbu->eStage :
218c0 20 30 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   0);..  assert( 
218d0 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20 28  p->openFlags & (
218e0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
218f0 5f 44 42 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  _DB|SQLITE_OPEN_
21900 54 45 4d 50 5f 44 42 29 20 29 3b 0a 20 20 69 66  TEMP_DB) );.  if
21910 28 20 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54  ( eStage==RBU_ST
21920 41 47 45 5f 4f 41 4c 20 7c 7c 20 65 53 74 61 67  AGE_OAL || eStag
21930 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4d 4f 56  e==RBU_STAGE_MOV
21940 45 20 29 7b 0a 20 20 20 20 2f 2a 20 6e 6f 2d 6f  E ){.    /* no-o
21950 70 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  p */.  }else{.  
21960 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65    /* Release the
21970 20 63 68 65 63 6b 70 6f 69 6e 74 65 72 20 61 6e   checkpointer an
21980 64 20 77 72 69 74 65 72 20 6c 6f 63 6b 73 20 2a  d writer locks *
21990 2f 0a 20 20 20 20 72 62 75 55 6e 6c 6f 63 6b 53  /.    rbuUnlockS
219a0 68 6d 28 70 29 3b 0a 20 20 20 20 72 63 20 3d 20  hm(p);.    rc = 
219b0 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f  p->pReal->pMetho
219c0 64 73 2d 3e 78 53 68 6d 55 6e 6d 61 70 28 70 2d  ds->xShmUnmap(p-
219d0 3e 70 52 65 61 6c 2c 20 64 65 6c 46 6c 61 67 29  >pReal, delFlag)
219e0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
219f0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  c;.}../*.** Give
21a00 6e 20 74 68 61 74 20 7a 57 61 6c 20 70 6f 69 6e  n that zWal poin
21a10 74 73 20 74 6f 20 61 20 62 75 66 66 65 72 20 63  ts to a buffer c
21a20 6f 6e 74 61 69 6e 69 6e 67 20 61 20 77 61 6c 20  ontaining a wal 
21a30 66 69 6c 65 20 6e 61 6d 65 20 70 61 73 73 65 64  file name passed
21a40 20 74 6f 20 0a 2a 2a 20 65 69 74 68 65 72 20 74   to .** either t
21a50 68 65 20 78 4f 70 65 6e 28 29 20 6f 72 20 78 41  he xOpen() or xA
21a60 63 63 65 73 73 28 29 20 56 46 53 20 6d 65 74 68  ccess() VFS meth
21a70 6f 64 2c 20 72 65 74 75 72 6e 20 61 20 70 6f 69  od, return a poi
21a80 6e 74 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 66  nter to the.** f
21a90 69 6c 65 2d 68 61 6e 64 6c 65 20 6f 70 65 6e 65  ile-handle opene
21aa0 64 20 62 79 20 74 68 65 20 73 61 6d 65 20 64 61  d by the same da
21ab0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
21ac0 6e 20 6f 6e 20 74 68 65 20 63 6f 72 72 65 73 70  n on the corresp
21ad0 6f 6e 64 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61  onding.** databa
21ae0 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  se file..*/.stat
21af0 69 63 20 72 62 75 5f 66 69 6c 65 20 2a 72 62 75  ic rbu_file *rbu
21b00 46 69 6e 64 4d 61 69 6e 64 62 28 72 62 75 5f 76  FindMaindb(rbu_v
21b10 66 73 20 2a 70 52 62 75 56 66 73 2c 20 63 6f 6e  fs *pRbuVfs, con
21b20 73 74 20 63 68 61 72 20 2a 7a 57 61 6c 29 7b 0a  st char *zWal){.
21b30 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 44 62 3b    rbu_file *pDb;
21b40 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
21b50 5f 65 6e 74 65 72 28 70 52 62 75 56 66 73 2d 3e  _enter(pRbuVfs->
21b60 6d 75 74 65 78 29 3b 0a 20 20 66 6f 72 28 70 44  mutex);.  for(pD
21b70 62 3d 70 52 62 75 56 66 73 2d 3e 70 4d 61 69 6e  b=pRbuVfs->pMain
21b80 3b 20 70 44 62 20 26 26 20 70 44 62 2d 3e 7a 57  ; pDb && pDb->zW
21b90 61 6c 21 3d 7a 57 61 6c 3b 20 70 44 62 3d 70 44  al!=zWal; pDb=pD
21ba0 62 2d 3e 70 4d 61 69 6e 4e 65 78 74 29 7b 7d 0a  b->pMainNext){}.
21bb0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
21bc0 6c 65 61 76 65 28 70 52 62 75 56 66 73 2d 3e 6d  leave(pRbuVfs->m
21bd0 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
21be0 70 44 62 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 41  pDb;.}../* .** A
21bf0 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 6e   main database n
21c00 61 6d 65 64 20 7a 4e 61 6d 65 20 68 61 73 20 6a  amed zName has j
21c10 75 73 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e  ust been opened.
21c20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a   The following .
21c30 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  ** function retu
21c40 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  rns a pointer to
21c50 20 61 20 62 75 66 66 65 72 20 6f 77 6e 65 64 20   a buffer owned 
21c60 62 79 20 53 51 4c 69 74 65 20 74 68 61 74 20 63  by SQLite that c
21c70 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74 68 65 20 6e  ontains.** the n
21c80 61 6d 65 20 6f 66 20 74 68 65 20 2a 2d 77 61 6c  ame of the *-wal
21c90 20 66 69 6c 65 20 74 68 69 73 20 64 62 20 63 6f   file this db co
21ca0 6e 6e 65 63 74 69 6f 6e 20 77 69 6c 6c 20 75 73  nnection will us
21cb0 65 2e 20 53 51 4c 69 74 65 0a 2a 2a 20 68 61 70  e. SQLite.** hap
21cc0 70 65 6e 73 20 74 6f 20 70 61 73 73 20 61 20 70  pens to pass a p
21cd0 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20 62  ointer to this b
21ce0 75 66 66 65 72 20 77 68 65 6e 20 75 73 69 6e 67  uffer when using
21cf0 20 78 41 63 63 65 73 73 28 29 0a 2a 2a 20 6f 72   xAccess().** or
21d00 20 78 4f 70 65 6e 28 29 20 74 6f 20 6f 70 65 72   xOpen() to oper
21d10 61 74 65 20 6f 6e 20 74 68 65 20 2a 2d 77 61 6c  ate on the *-wal
21d20 20 66 69 6c 65 2e 20 20 0a 2a 2f 0a 73 74 61 74   file.  .*/.stat
21d30 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 72  ic const char *r
21d40 62 75 4d 61 69 6e 54 6f 57 61 6c 28 63 6f 6e 73  buMainToWal(cons
21d50 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69  t char *zName, i
21d60 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74  nt flags){.  int
21d70 20 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e   n = (int)strlen
21d80 28 7a 4e 61 6d 65 29 3b 0a 20 20 63 6f 6e 73 74  (zName);.  const
21d90 20 63 68 61 72 20 2a 7a 20 3d 20 26 7a 4e 61 6d   char *z = &zNam
21da0 65 5b 6e 5d 3b 0a 20 20 69 66 28 20 66 6c 61 67  e[n];.  if( flag
21db0 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
21dc0 55 52 49 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f  URI ){.    int o
21dd0 64 64 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c  dd = 0;.    whil
21de0 65 28 20 31 20 29 7b 0a 20 20 20 20 20 20 69 66  e( 1 ){.      if
21df0 28 20 7a 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20  ( z[0]==0 ){.   
21e00 20 20 20 20 20 6f 64 64 20 3d 20 31 20 2d 20 6f       odd = 1 - o
21e10 64 64 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  dd;.        if( 
21e20 6f 64 64 20 26 26 20 7a 5b 31 5d 3d 3d 30 20 29  odd && z[1]==0 )
21e30 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
21e40 20 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 7d        z++;.    }
21e50 0a 20 20 20 20 7a 20 2b 3d 20 32 3b 0a 20 20 7d  .    z += 2;.  }
21e60 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28  else{.    while(
21e70 20 2a 7a 3d 3d 30 20 29 20 7a 2b 2b 3b 0a 20 20   *z==0 ) z++;.  
21e80 7d 0a 20 20 7a 20 2b 3d 20 28 6e 20 2b 20 38 20  }.  z += (n + 8 
21e90 2b 20 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a  + 1);.  return z
21ea0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
21eb0 61 6e 20 72 62 75 20 66 69 6c 65 20 68 61 6e 64  an rbu file hand
21ec0 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
21ed0 74 20 72 62 75 56 66 73 4f 70 65 6e 28 0a 20 20  t rbuVfsOpen(.  
21ee0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
21ef0 73 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  s,.  const char 
21f00 2a 7a 4e 61 6d 65 2c 0a 20 20 73 71 6c 69 74 65  *zName,.  sqlite
21f10 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 0a 20  3_file *pFile,. 
21f20 20 69 6e 74 20 66 6c 61 67 73 2c 0a 20 20 69 6e   int flags,.  in
21f30 74 20 2a 70 4f 75 74 46 6c 61 67 73 0a 29 7b 0a  t *pOutFlags.){.
21f40 20 20 73 74 61 74 69 63 20 73 71 6c 69 74 65 33    static sqlite3
21f50 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 72 62 75 76  _io_methods rbuv
21f60 66 73 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 3d 20  fs_io_methods = 
21f70 7b 0a 20 20 20 20 32 2c 20 20 20 20 20 20 20 20  {.    2,        
21f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f90 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20      /* iVersion 
21fa0 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 43 6c 6f  */.    rbuVfsClo
21fb0 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
21fc0 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2a       /* xClose *
21fd0 2f 0a 20 20 20 20 72 62 75 56 66 73 52 65 61 64  /.    rbuVfsRead
21fe0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
21ff0 20 20 20 20 2f 2a 20 78 52 65 61 64 20 2a 2f 0a      /* xRead */.
22000 20 20 20 20 72 62 75 56 66 73 57 72 69 74 65 2c      rbuVfsWrite,
22010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22020 20 20 2f 2a 20 78 57 72 69 74 65 20 2a 2f 0a 20    /* xWrite */. 
22030 20 20 20 72 62 75 56 66 73 54 72 75 6e 63 61 74     rbuVfsTruncat
22040 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
22050 20 2f 2a 20 78 54 72 75 6e 63 61 74 65 20 2a 2f   /* xTruncate */
22060 0a 20 20 20 20 72 62 75 56 66 73 53 79 6e 63 2c  .    rbuVfsSync,
22070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22080 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 0a 20     /* xSync */. 
22090 20 20 20 72 62 75 56 66 73 46 69 6c 65 53 69 7a     rbuVfsFileSiz
220a0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
220b0 20 2f 2a 20 78 46 69 6c 65 53 69 7a 65 20 2a 2f   /* xFileSize */
220c0 0a 20 20 20 20 72 62 75 56 66 73 4c 6f 63 6b 2c  .    rbuVfsLock,
220d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
220e0 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 0a 20     /* xLock */. 
220f0 20 20 20 72 62 75 56 66 73 55 6e 6c 6f 63 6b 2c     rbuVfsUnlock,
22100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22110 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a 2f 0a 20   /* xUnlock */. 
22120 20 20 20 72 62 75 56 66 73 43 68 65 63 6b 52 65     rbuVfsCheckRe
22130 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20 20  servedLock,     
22140 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76   /* xCheckReserv
22150 65 64 4c 6f 63 6b 20 2a 2f 0a 20 20 20 20 72 62  edLock */.    rb
22160 75 56 66 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c  uVfsFileControl,
22170 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
22180 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f 0a 20  FileControl */. 
22190 20 20 20 72 62 75 56 66 73 53 65 63 74 6f 72 53     rbuVfsSectorS
221a0 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ize,            
221b0 20 2f 2a 20 78 53 65 63 74 6f 72 53 69 7a 65 20   /* xSectorSize 
221c0 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 44 65 76  */.    rbuVfsDev
221d0 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
221e0 63 73 2c 20 20 2f 2a 20 78 44 65 76 69 63 65 43  cs,  /* xDeviceC
221f0 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 2a  haracteristics *
22200 2f 0a 20 20 20 20 72 62 75 56 66 73 53 68 6d 4d  /.    rbuVfsShmM
22210 61 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ap,             
22220 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 2a      /* xShmMap *
22230 2f 0a 20 20 20 20 72 62 75 56 66 73 53 68 6d 4c  /.    rbuVfsShmL
22240 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
22250 20 20 20 20 2f 2a 20 78 53 68 6d 4c 6f 63 6b 20      /* xShmLock 
22260 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 53 68 6d  */.    rbuVfsShm
22270 42 61 72 72 69 65 72 2c 20 20 20 20 20 20 20 20  Barrier,        
22280 20 20 20 20 20 2f 2a 20 78 53 68 6d 42 61 72 72       /* xShmBarr
22290 69 65 72 20 2a 2f 0a 20 20 20 20 72 62 75 56 66  ier */.    rbuVf
222a0 73 53 68 6d 55 6e 6d 61 70 2c 20 20 20 20 20 20  sShmUnmap,      
222b0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
222c0 55 6e 6d 61 70 20 2a 2f 0a 20 20 20 20 30 2c 20  Unmap */.    0, 
222d0 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
222e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46             /* xF
222f0 65 74 63 68 2c 20 78 55 6e 66 65 74 63 68 20 2a  etch, xUnfetch *
22300 2f 0a 20 20 7d 3b 0a 20 20 72 62 75 5f 76 66 73  /.  };.  rbu_vfs
22310 20 2a 70 52 62 75 56 66 73 20 3d 20 28 72 62 75   *pRbuVfs = (rbu
22320 5f 76 66 73 2a 29 70 56 66 73 3b 0a 20 20 73 71  _vfs*)pVfs;.  sq
22330 6c 69 74 65 33 5f 76 66 73 20 2a 70 52 65 61 6c  lite3_vfs *pReal
22340 56 66 73 20 3d 20 70 52 62 75 56 66 73 2d 3e 70  Vfs = pRbuVfs->p
22350 52 65 61 6c 56 66 73 3b 0a 20 20 72 62 75 5f 66  RealVfs;.  rbu_f
22360 69 6c 65 20 2a 70 46 64 20 3d 20 28 72 62 75 5f  ile *pFd = (rbu_
22370 66 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20  file *)pFile;.  
22380 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
22390 4f 4b 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  OK;.  const char
223a0 20 2a 7a 4f 70 65 6e 20 3d 20 7a 4e 61 6d 65 3b   *zOpen = zName;
223b0 0a 20 20 69 6e 74 20 6f 66 6c 61 67 73 20 3d 20  .  int oflags = 
223c0 66 6c 61 67 73 3b 0a 0a 20 20 6d 65 6d 73 65 74  flags;..  memset
223d0 28 70 46 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28  (pFd, 0, sizeof(
223e0 72 62 75 5f 66 69 6c 65 29 29 3b 0a 20 20 70 46  rbu_file));.  pF
223f0 64 2d 3e 70 52 65 61 6c 20 3d 20 28 73 71 6c 69  d->pReal = (sqli
22400 74 65 33 5f 66 69 6c 65 2a 29 26 70 46 64 5b 31  te3_file*)&pFd[1
22410 5d 3b 0a 20 20 70 46 64 2d 3e 70 52 62 75 56 66  ];.  pFd->pRbuVf
22420 73 20 3d 20 70 52 62 75 56 66 73 3b 0a 20 20 70  s = pRbuVfs;.  p
22430 46 64 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20  Fd->openFlags = 
22440 66 6c 61 67 73 3b 0a 20 20 69 66 28 20 7a 4e 61  flags;.  if( zNa
22450 6d 65 20 29 7b 0a 20 20 20 20 69 66 28 20 66 6c  me ){.    if( fl
22460 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
22470 4e 5f 4d 41 49 4e 5f 44 42 20 29 7b 0a 20 20 20  N_MAIN_DB ){.   
22480 20 20 20 2f 2a 20 41 20 6d 61 69 6e 20 64 61 74     /* A main dat
22490 61 62 61 73 65 20 68 61 73 20 6a 75 73 74 20 62  abase has just b
224a0 65 65 6e 20 6f 70 65 6e 65 64 2e 20 54 68 65 20  een opened. The 
224b0 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20  following block 
224c0 73 65 74 73 0a 20 20 20 20 20 20 2a 2a 20 28 70  sets.      ** (p
224d0 46 64 2d 3e 7a 57 61 6c 29 20 74 6f 20 70 6f 69  Fd->zWal) to poi
224e0 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f  nt to a buffer o
224f0 77 6e 65 64 20 62 79 20 53 51 4c 69 74 65 20 74  wned by SQLite t
22500 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20  hat contains.   
22510 20 20 20 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f     ** the name o
22520 66 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65  f the *-wal file
22530 20 74 68 69 73 20 64 62 20 63 6f 6e 6e 65 63 74   this db connect
22540 69 6f 6e 20 77 69 6c 6c 20 75 73 65 2e 20 53 51  ion will use. SQ
22550 4c 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 68 61  Lite.      ** ha
22560 70 70 65 6e 73 20 74 6f 20 70 61 73 73 20 61 20  ppens to pass a 
22570 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20  pointer to this 
22580 62 75 66 66 65 72 20 77 68 65 6e 20 75 73 69 6e  buffer when usin
22590 67 20 78 41 63 63 65 73 73 28 29 0a 20 20 20 20  g xAccess().    
225a0 20 20 2a 2a 20 6f 72 20 78 4f 70 65 6e 28 29 20    ** or xOpen() 
225b0 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68  to operate on th
225c0 65 20 2a 2d 77 61 6c 20 66 69 6c 65 2e 20 20 2a  e *-wal file.  *
225d0 2f 0a 20 20 20 20 20 20 70 46 64 2d 3e 7a 57 61  /.      pFd->zWa
225e0 6c 20 3d 20 72 62 75 4d 61 69 6e 54 6f 57 61 6c  l = rbuMainToWal
225f0 28 7a 4e 61 6d 65 2c 20 66 6c 61 67 73 29 3b 0a  (zName, flags);.
22600 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69      }.    else i
22610 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54  f( flags & SQLIT
22620 45 5f 4f 50 45 4e 5f 57 41 4c 20 29 7b 0a 20 20  E_OPEN_WAL ){.  
22630 20 20 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 44      rbu_file *pD
22640 62 20 3d 20 72 62 75 46 69 6e 64 4d 61 69 6e 64  b = rbuFindMaind
22650 62 28 70 52 62 75 56 66 73 2c 20 7a 4e 61 6d 65  b(pRbuVfs, zName
22660 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62  );.      if( pDb
22670 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
22680 70 44 62 2d 3e 70 52 62 75 20 26 26 20 70 44 62  pDb->pRbu && pDb
22690 2d 3e 70 52 62 75 2d 3e 65 53 74 61 67 65 3d 3d  ->pRbu->eStage==
226a0 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20 29 7b  RBU_STAGE_OAL ){
226b0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
226c0 69 73 20 63 61 6c 6c 20 69 73 20 74 6f 20 6f 70  is call is to op
226d0 65 6e 20 61 20 2a 2d 77 61 6c 20 66 69 6c 65 2e  en a *-wal file.
226e0 20 49 6e 74 65 61 64 2c 20 6f 70 65 6e 20 74 68   Intead, open th
226f0 65 20 2a 2d 6f 61 6c 2e 20 54 68 69 73 0a 20 20  e *-oal. This.  
22700 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 20          ** code 
22710 65 6e 73 75 72 65 73 20 74 68 61 74 20 74 68 65  ensures that the
22720 20 73 74 72 69 6e 67 20 70 61 73 73 65 64 20 74   string passed t
22730 6f 20 78 4f 70 65 6e 28 29 20 69 73 20 74 65 72  o xOpen() is ter
22740 6d 69 6e 61 74 65 64 20 62 79 20 61 0a 20 20 20  minated by a.   
22750 20 20 20 20 20 20 20 2a 2a 20 70 61 69 72 20 6f         ** pair o
22760 66 20 27 5c 30 27 20 62 79 74 65 73 20 69 6e 20  f '\0' bytes in 
22770 63 61 73 65 20 74 68 65 20 56 46 53 20 61 74 74  case the VFS att
22780 65 6d 70 74 73 20 74 6f 20 65 78 74 72 61 63 74  empts to extract
22790 20 61 20 55 52 49 20 0a 20 20 20 20 20 20 20 20   a URI .        
227a0 20 20 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 66    ** parameter f
227b0 72 6f 6d 20 69 74 2e 20 20 2a 2f 0a 20 20 20 20  rom it.  */.    
227c0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
227d0 20 2a 7a 42 61 73 65 20 3d 20 7a 4e 61 6d 65 3b   *zBase = zName;
227e0 0a 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 5f  .          size_
227f0 74 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20 20  t nCopy;.       
22800 20 20 20 63 68 61 72 20 2a 7a 43 6f 70 79 3b 0a     char *zCopy;.
22810 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 62            if( rb
22820 75 49 73 56 61 63 75 75 6d 28 70 44 62 2d 3e 70  uIsVacuum(pDb->p
22830 52 62 75 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Rbu) ){.        
22840 20 20 20 20 7a 42 61 73 65 20 3d 20 73 71 6c 69      zBase = sqli
22850 74 65 33 5f 64 62 5f 66 69 6c 65 6e 61 6d 65 28  te3_db_filename(
22860 70 44 62 2d 3e 70 52 62 75 2d 3e 64 62 52 62 75  pDb->pRbu->dbRbu
22870 2c 20 22 6d 61 69 6e 22 29 3b 0a 20 20 20 20 20  , "main");.     
22880 20 20 20 20 20 20 20 7a 42 61 73 65 20 3d 20 72         zBase = r
22890 62 75 4d 61 69 6e 54 6f 57 61 6c 28 7a 42 61 73  buMainToWal(zBas
228a0 65 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55  e, SQLITE_OPEN_U
228b0 52 49 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  RI);.          }
228c0 0a 20 20 20 20 20 20 20 20 20 20 6e 43 6f 70 79  .          nCopy
228d0 20 3d 20 73 74 72 6c 65 6e 28 7a 42 61 73 65 29   = strlen(zBase)
228e0 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 43 6f 70  ;.          zCop
228f0 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  y = sqlite3_mall
22900 6f 63 36 34 28 6e 43 6f 70 79 2b 32 29 3b 0a 20  oc64(nCopy+2);. 
22910 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 43 6f           if( zCo
22920 70 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  py ){.          
22930 20 20 6d 65 6d 63 70 79 28 7a 43 6f 70 79 2c 20    memcpy(zCopy, 
22940 7a 42 61 73 65 2c 20 6e 43 6f 70 79 29 3b 0a 20  zBase, nCopy);. 
22950 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f 70 79             zCopy
22960 5b 6e 43 6f 70 79 2d 33 5d 20 3d 20 27 6f 27 3b  [nCopy-3] = 'o';
22970 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f  .            zCo
22980 70 79 5b 6e 43 6f 70 79 5d 20 3d 20 27 5c 30 27  py[nCopy] = '\0'
22990 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 43  ;.            zC
229a0 6f 70 79 5b 6e 43 6f 70 79 2b 31 5d 20 3d 20 27  opy[nCopy+1] = '
229b0 5c 30 27 3b 0a 20 20 20 20 20 20 20 20 20 20 20  \0';.           
229c0 20 7a 4f 70 65 6e 20 3d 20 28 63 6f 6e 73 74 20   zOpen = (const 
229d0 63 68 61 72 2a 29 28 70 46 64 2d 3e 7a 44 65 6c  char*)(pFd->zDel
229e0 20 3d 20 7a 43 6f 70 79 29 3b 0a 20 20 20 20 20   = zCopy);.     
229f0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
22a00 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
22a10 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
22a20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
22a30 20 70 46 64 2d 3e 70 52 62 75 20 3d 20 70 44 62   pFd->pRbu = pDb
22a40 2d 3e 70 52 62 75 3b 0a 20 20 20 20 20 20 20 20  ->pRbu;.        
22a50 7d 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 70  }.        pDb->p
22a60 57 61 6c 46 64 20 3d 20 70 46 64 3b 0a 20 20 20  WalFd = pFd;.   
22a70 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
22a80 20 20 69 66 28 20 6f 66 6c 61 67 73 20 26 20 53    if( oflags & S
22a90 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
22aa0 44 42 20 0a 20 20 20 26 26 20 73 71 6c 69 74 65  DB .   && sqlite
22ab0 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 7a 4e  3_uri_boolean(zN
22ac0 61 6d 65 2c 20 22 72 62 75 5f 6d 65 6d 6f 72 79  ame, "rbu_memory
22ad0 22 2c 20 30 29 20 0a 20 20 29 7b 0a 20 20 20 20  ", 0) .  ){.    
22ae0 61 73 73 65 72 74 28 20 6f 66 6c 61 67 73 20 26  assert( oflags &
22af0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49   SQLITE_OPEN_MAI
22b00 4e 5f 44 42 20 29 3b 0a 20 20 20 20 6f 66 6c 61  N_DB );.    ofla
22b10 67 73 20 3d 20 20 53 51 4c 49 54 45 5f 4f 50 45  gs =  SQLITE_OPE
22b20 4e 5f 54 45 4d 50 5f 44 42 20 7c 20 53 51 4c 49  N_TEMP_DB | SQLI
22b30 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
22b40 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
22b50 43 52 45 41 54 45 20 7c 0a 20 20 20 20 20 20 20  CREATE |.       
22b60 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
22b70 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 20 53  EN_EXCLUSIVE | S
22b80 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54  QLITE_OPEN_DELET
22b90 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 20 20 7a 4f  EONCLOSE;.    zO
22ba0 70 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  pen = 0;.  }..  
22bb0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
22bc0 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 52  K ){.    rc = pR
22bd0 65 61 6c 56 66 73 2d 3e 78 4f 70 65 6e 28 70 52  ealVfs->xOpen(pR
22be0 65 61 6c 56 66 73 2c 20 7a 4f 70 65 6e 2c 20 70  ealVfs, zOpen, p
22bf0 46 64 2d 3e 70 52 65 61 6c 2c 20 6f 66 6c 61 67  Fd->pReal, oflag
22c00 73 2c 20 70 4f 75 74 46 6c 61 67 73 29 3b 0a 20  s, pOutFlags);. 
22c10 20 7d 0a 20 20 69 66 28 20 70 46 64 2d 3e 70 52   }.  if( pFd->pR
22c20 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b  eal->pMethods ){
22c30 0a 20 20 20 20 2f 2a 20 54 68 65 20 78 4f 70 65  .    /* The xOpe
22c40 6e 28 29 20 6f 70 65 72 61 74 69 6f 6e 20 68 61  n() operation ha
22c50 73 20 73 75 63 63 65 65 64 65 64 2e 20 53 65 74  s succeeded. Set
22c60 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c   the sqlite3_fil
22c70 65 2e 70 4d 65 74 68 6f 64 73 0a 20 20 20 20 2a  e.pMethods.    *
22c80 2a 20 70 6f 69 6e 74 65 72 20 61 6e 64 2c 20 69  * pointer and, i
22c90 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 61 20  f the file is a 
22ca0 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  main database fi
22cb0 6c 65 2c 20 6c 69 6e 6b 20 69 74 20 69 6e 74 6f  le, link it into
22cc0 20 74 68 65 0a 20 20 20 20 2a 2a 20 6d 75 74 65   the.    ** mute
22cd0 78 20 70 72 6f 74 65 63 74 65 64 20 6c 69 6e 6b  x protected link
22ce0 65 64 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 73  ed list of all s
22cf0 75 63 68 20 66 69 6c 65 73 2e 20 20 2a 2f 0a 20  uch files.  */. 
22d00 20 20 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f     pFile->pMetho
22d10 64 73 20 3d 20 26 72 62 75 76 66 73 5f 69 6f 5f  ds = &rbuvfs_io_
22d20 6d 65 74 68 6f 64 73 3b 0a 20 20 20 20 69 66 28  methods;.    if(
22d30 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f   flags & SQLITE_
22d40 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 7b 0a  OPEN_MAIN_DB ){.
22d50 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
22d60 74 65 78 5f 65 6e 74 65 72 28 70 52 62 75 56 66  tex_enter(pRbuVf
22d70 73 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20  s->mutex);.     
22d80 20 70 46 64 2d 3e 70 4d 61 69 6e 4e 65 78 74 20   pFd->pMainNext 
22d90 3d 20 70 52 62 75 56 66 73 2d 3e 70 4d 61 69 6e  = pRbuVfs->pMain
22da0 3b 0a 20 20 20 20 20 20 70 52 62 75 56 66 73 2d  ;.      pRbuVfs-
22db0 3e 70 4d 61 69 6e 20 3d 20 70 46 64 3b 0a 20 20  >pMain = pFd;.  
22dc0 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
22dd0 78 5f 6c 65 61 76 65 28 70 52 62 75 56 66 73 2d  x_leave(pRbuVfs-
22de0 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20  >mutex);.    }. 
22df0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
22e00 74 65 33 5f 66 72 65 65 28 70 46 64 2d 3e 7a 44  te3_free(pFd->zD
22e10 65 6c 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  el);.  }..  retu
22e20 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
22e30 44 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65 20  Delete the file 
22e40 6c 6f 63 61 74 65 64 20 61 74 20 7a 50 61 74 68  located at zPath
22e50 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
22e60 72 62 75 56 66 73 44 65 6c 65 74 65 28 73 71 6c  rbuVfsDelete(sql
22e70 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
22e80 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
22e90 68 2c 20 69 6e 74 20 64 69 72 53 79 6e 63 29 7b  h, int dirSync){
22ea0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
22eb0 70 52 65 61 6c 56 66 73 20 3d 20 28 28 72 62 75  pRealVfs = ((rbu
22ec0 5f 76 66 73 2a 29 70 56 66 73 29 2d 3e 70 52 65  _vfs*)pVfs)->pRe
22ed0 61 6c 56 66 73 3b 0a 20 20 72 65 74 75 72 6e 20  alVfs;.  return 
22ee0 70 52 65 61 6c 56 66 73 2d 3e 78 44 65 6c 65 74  pRealVfs->xDelet
22ef0 65 28 70 52 65 61 6c 56 66 73 2c 20 7a 50 61 74  e(pRealVfs, zPat
22f00 68 2c 20 64 69 72 53 79 6e 63 29 3b 0a 7d 0a 0a  h, dirSync);.}..
22f10 2f 2a 0a 2a 2a 20 54 65 73 74 20 66 6f 72 20 61  /*.** Test for a
22f20 63 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f 6e  ccess permission
22f30 73 2e 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  s. Return true i
22f40 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  f the requested 
22f50 70 65 72 6d 69 73 73 69 6f 6e 0a 2a 2a 20 69 73  permission.** is
22f60 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72 20 66   available, or f
22f70 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e 0a  alse otherwise..
22f80 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62  */.static int rb
22f90 75 56 66 73 41 63 63 65 73 73 28 0a 20 20 73 71  uVfsAccess(.  sq
22fa0 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
22fb0 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a   .  const char *
22fc0 7a 50 61 74 68 2c 20 0a 20 20 69 6e 74 20 66 6c  zPath, .  int fl
22fd0 61 67 73 2c 20 0a 20 20 69 6e 74 20 2a 70 52 65  ags, .  int *pRe
22fe0 73 4f 75 74 0a 29 7b 0a 20 20 72 62 75 5f 76 66  sOut.){.  rbu_vf
22ff0 73 20 2a 70 52 62 75 56 66 73 20 3d 20 28 72 62  s *pRbuVfs = (rb
23000 75 5f 76 66 73 2a 29 70 56 66 73 3b 0a 20 20 73  u_vfs*)pVfs;.  s
23010 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 52 65 61  qlite3_vfs *pRea
23020 6c 56 66 73 20 3d 20 70 52 62 75 56 66 73 2d 3e  lVfs = pRbuVfs->
23030 70 52 65 61 6c 56 66 73 3b 0a 20 20 69 6e 74 20  pRealVfs;.  int 
23040 72 63 3b 0a 0a 20 20 72 63 20 3d 20 70 52 65 61  rc;..  rc = pRea
23050 6c 56 66 73 2d 3e 78 41 63 63 65 73 73 28 70 52  lVfs->xAccess(pR
23060 65 61 6c 56 66 73 2c 20 7a 50 61 74 68 2c 20 66  ealVfs, zPath, f
23070 6c 61 67 73 2c 20 70 52 65 73 4f 75 74 29 3b 0a  lags, pResOut);.
23080 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 63 61  .  /* If this ca
23090 6c 6c 20 69 73 20 74 6f 20 63 68 65 63 6b 20 69  ll is to check i
230a0 66 20 61 20 2a 2d 77 61 6c 20 66 69 6c 65 20 61  f a *-wal file a
230b0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61  ssociated with a
230c0 6e 20 52 42 55 20 74 61 72 67 65 74 0a 20 20 2a  n RBU target.  *
230d0 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * database conne
230e0 63 74 69 6f 6e 20 65 78 69 73 74 73 2c 20 61 6e  ction exists, an
230f0 64 20 74 68 65 20 52 42 55 20 75 70 64 61 74 65  d the RBU update
23100 20 69 73 20 69 6e 20 52 42 55 5f 53 54 41 47 45   is in RBU_STAGE
23110 5f 4f 41 4c 2c 0a 20 20 2a 2a 20 74 68 65 20 66  _OAL,.  ** the f
23120 6f 6c 6c 6f 77 69 6e 67 20 73 70 65 63 69 61 6c  ollowing special
23130 20 68 61 6e 64 6c 69 6e 67 20 69 73 20 61 63 74   handling is act
23140 69 76 61 74 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a  ivated:.  **.  *
23150 2a 20 20 20 61 29 20 69 66 20 74 68 65 20 2a 2d  *   a) if the *-
23160 77 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 65 78  wal file does ex
23170 69 73 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ist, return SQLI
23180 54 45 5f 43 41 4e 54 4f 50 45 4e 2e 20 54 68 69  TE_CANTOPEN. Thi
23190 73 0a 20 20 2a 2a 20 20 20 20 20 20 65 6e 73 75  s.  **      ensu
231a0 72 65 73 20 74 68 61 74 20 74 68 65 20 52 42 55  res that the RBU
231b0 20 65 78 74 65 6e 73 69 6f 6e 20 6e 65 76 65 72   extension never
231c0 20 74 72 69 65 73 20 74 6f 20 75 70 64 61 74 65   tries to update
231d0 20 61 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a   a database.  **
231e0 20 20 20 20 20 20 69 6e 20 77 61 6c 20 6d 6f 64        in wal mod
231f0 65 2c 20 65 76 65 6e 20 69 66 20 74 68 65 20 66  e, even if the f
23200 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
23210 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
23220 61 73 0a 20 20 2a 2a 20 20 20 20 20 20 62 65 65  as.  **      bee
23230 6e 20 64 61 6d 61 67 65 64 2e 20 0a 20 20 2a 2a  n damaged. .  **
23240 0a 20 20 2a 2a 20 20 20 62 29 20 69 66 20 74 68  .  **   b) if th
23250 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 64 6f 65  e *-wal file doe
23260 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 63 6c 61  s not exist, cla
23270 69 6d 20 74 68 61 74 20 69 74 20 64 6f 65 73 20  im that it does 
23280 61 6e 79 77 61 79 2c 0a 20 20 2a 2a 20 20 20 20  anyway,.  **    
23290 20 20 63 61 75 73 69 6e 67 20 53 51 4c 69 74 65    causing SQLite
232a0 20 74 6f 20 63 61 6c 6c 20 78 4f 70 65 6e 28 29   to call xOpen()
232b0 20 74 6f 20 6f 70 65 6e 20 69 74 2e 20 54 68 69   to open it. Thi
232c0 73 20 63 61 6c 6c 20 77 69 6c 6c 20 61 6c 73 6f  s call will also
232d0 0a 20 20 2a 2a 20 20 20 20 20 20 62 65 20 69 6e  .  **      be in
232e0 74 65 72 63 65 70 74 65 64 20 28 73 65 65 20 74  tercepted (see t
232f0 68 65 20 72 62 75 56 66 73 4f 70 65 6e 28 29 20  he rbuVfsOpen() 
23300 66 75 6e 63 74 69 6f 6e 29 20 61 6e 64 20 74 68  function) and th
23310 65 20 2a 2d 6f 61 6c 0a 20 20 2a 2a 20 20 20 20  e *-oal.  **    
23320 20 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 69 6e    file opened in
23330 73 74 65 61 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  stead..  */.  if
23340 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
23350 26 26 20 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45  && flags==SQLITE
23360 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 20 29  _ACCESS_EXISTS )
23370 7b 0a 20 20 20 20 72 62 75 5f 66 69 6c 65 20 2a  {.    rbu_file *
23380 70 44 62 20 3d 20 72 62 75 46 69 6e 64 4d 61 69  pDb = rbuFindMai
23390 6e 64 62 28 70 52 62 75 56 66 73 2c 20 7a 50 61  ndb(pRbuVfs, zPa
233a0 74 68 29 3b 0a 20 20 20 20 69 66 28 20 70 44 62  th);.    if( pDb
233b0 20 26 26 20 70 44 62 2d 3e 70 52 62 75 20 26 26   && pDb->pRbu &&
233c0 20 70 44 62 2d 3e 70 52 62 75 2d 3e 65 53 74 61   pDb->pRbu->eSta
233d0 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4f 41  ge==RBU_STAGE_OA
233e0 4c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 2a  L ){.      if( *
233f0 70 52 65 73 4f 75 74 20 29 7b 0a 20 20 20 20 20  pResOut ){.     
23400 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
23410 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 20 20 20 7d  ANTOPEN;.      }
23420 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2a 70  else{.        *p
23430 52 65 73 4f 75 74 20 3d 20 31 3b 0a 20 20 20 20  ResOut = 1;.    
23440 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
23450 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
23460 2a 0a 2a 2a 20 50 6f 70 75 6c 61 74 65 20 62 75  *.** Populate bu
23470 66 66 65 72 20 7a 4f 75 74 20 77 69 74 68 20 74  ffer zOut with t
23480 68 65 20 66 75 6c 6c 20 63 61 6e 6f 6e 69 63 61  he full canonica
23490 6c 20 70 61 74 68 6e 61 6d 65 20 63 6f 72 72 65  l pathname corre
234a0 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 74  sponding.** to t
234b0 68 65 20 70 61 74 68 6e 61 6d 65 20 69 6e 20 7a  he pathname in z
234c0 50 61 74 68 2e 20 7a 4f 75 74 20 69 73 20 67 75  Path. zOut is gu
234d0 61 72 61 6e 74 65 65 64 20 74 6f 20 70 6f 69 6e  aranteed to poin
234e0 74 20 74 6f 20 61 20 62 75 66 66 65 72 0a 2a 2a  t to a buffer.**
234f0 20 6f 66 20 61 74 20 6c 65 61 73 74 20 28 44 45   of at least (DE
23500 56 53 59 4d 5f 4d 41 58 5f 50 41 54 48 4e 41 4d  VSYM_MAX_PATHNAM
23510 45 2b 31 29 20 62 79 74 65 73 2e 0a 2a 2f 0a 73  E+1) bytes..*/.s
23520 74 61 74 69 63 20 69 6e 74 20 72 62 75 56 66 73  tatic int rbuVfs
23530 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 0a 20 20  FullPathname(.  
23540 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
23550 73 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  s, .  const char
23560 20 2a 7a 50 61 74 68 2c 20 0a 20 20 69 6e 74 20   *zPath, .  int 
23570 6e 4f 75 74 2c 20 0a 20 20 63 68 61 72 20 2a 7a  nOut, .  char *z
23580 4f 75 74 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  Out.){.  sqlite3
23590 5f 76 66 73 20 2a 70 52 65 61 6c 56 66 73 20 3d  _vfs *pRealVfs =
235a0 20 28 28 72 62 75 5f 76 66 73 2a 29 70 56 66 73   ((rbu_vfs*)pVfs
235b0 29 2d 3e 70 52 65 61 6c 56 66 73 3b 0a 20 20 72  )->pRealVfs;.  r
235c0 65 74 75 72 6e 20 70 52 65 61 6c 56 66 73 2d 3e  eturn pRealVfs->
235d0 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 52  xFullPathname(pR
235e0 65 61 6c 56 66 73 2c 20 7a 50 61 74 68 2c 20 6e  ealVfs, zPath, n
235f0 4f 75 74 2c 20 7a 4f 75 74 29 3b 0a 7d 0a 0a 23  Out, zOut);.}..#
23600 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
23610 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f  IT_LOAD_EXTENSIO
23620 4e 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65  N./*.** Open the
23630 20 64 79 6e 61 6d 69 63 20 6c 69 62 72 61 72 79   dynamic library
23640 20 6c 6f 63 61 74 65 64 20 61 74 20 7a 50 61 74   located at zPat
23650 68 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 68  h and return a h
23660 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  andle..*/.static
23670 20 76 6f 69 64 20 2a 72 62 75 56 66 73 44 6c 4f   void *rbuVfsDlO
23680 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 20  pen(sqlite3_vfs 
23690 2a 70 56 66 73 2c 20 63 6f 6e 73 74 20 63 68 61  *pVfs, const cha
236a0 72 20 2a 7a 50 61 74 68 29 7b 0a 20 20 73 71 6c  r *zPath){.  sql
236b0 69 74 65 33 5f 76 66 73 20 2a 70 52 65 61 6c 56  ite3_vfs *pRealV
236c0 66 73 20 3d 20 28 28 72 62 75 5f 76 66 73 2a 29  fs = ((rbu_vfs*)
236d0 70 56 66 73 29 2d 3e 70 52 65 61 6c 56 66 73 3b  pVfs)->pRealVfs;
236e0 0a 20 20 72 65 74 75 72 6e 20 70 52 65 61 6c 56  .  return pRealV
236f0 66 73 2d 3e 78 44 6c 4f 70 65 6e 28 70 52 65 61  fs->xDlOpen(pRea
23700 6c 56 66 73 2c 20 7a 50 61 74 68 29 3b 0a 7d 0a  lVfs, zPath);.}.
23710 0a 2f 2a 0a 2a 2a 20 50 6f 70 75 6c 61 74 65 20  ./*.** Populate 
23720 74 68 65 20 62 75 66 66 65 72 20 7a 45 72 72 4d  the buffer zErrM
23730 73 67 20 28 73 69 7a 65 20 6e 42 79 74 65 20 62  sg (size nByte b
23740 79 74 65 73 29 20 77 69 74 68 20 61 20 68 75 6d  ytes) with a hum
23750 61 6e 20 72 65 61 64 61 62 6c 65 0a 2a 2a 20 75  an readable.** u
23760 74 66 2d 38 20 73 74 72 69 6e 67 20 64 65 73 63  tf-8 string desc
23770 72 69 62 69 6e 67 20 74 68 65 20 6d 6f 73 74 20  ribing the most 
23780 72 65 63 65 6e 74 20 65 72 72 6f 72 20 65 6e 63  recent error enc
23790 6f 75 6e 74 65 72 65 64 20 61 73 73 6f 63 69 61  ountered associa
237a0 74 65 64 20 0a 2a 2a 20 77 69 74 68 20 64 79 6e  ted .** with dyn
237b0 61 6d 69 63 20 6c 69 62 72 61 72 69 65 73 2e 0a  amic libraries..
237c0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
237d0 62 75 56 66 73 44 6c 45 72 72 6f 72 28 73 71 6c  buVfsDlError(sql
237e0 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
237f0 69 6e 74 20 6e 42 79 74 65 2c 20 63 68 61 72 20  int nByte, char 
23800 2a 7a 45 72 72 4d 73 67 29 7b 0a 20 20 73 71 6c  *zErrMsg){.  sql
23810 69 74 65 33 5f 76 66 73 20 2a 70 52 65 61 6c 56  ite3_vfs *pRealV
23820 66 73 20 3d 20 28 28 72 62 75 5f 76 66 73 2a 29  fs = ((rbu_vfs*)
23830 70 56 66 73 29 2d 3e 70 52 65 61 6c 56 66 73 3b  pVfs)->pRealVfs;
23840 0a 20 20 70 52 65 61 6c 56 66 73 2d 3e 78 44 6c  .  pRealVfs->xDl
23850 45 72 72 6f 72 28 70 52 65 61 6c 56 66 73 2c 20  Error(pRealVfs, 
23860 6e 42 79 74 65 2c 20 7a 45 72 72 4d 73 67 29 3b  nByte, zErrMsg);
23870 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
23880 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
23890 65 20 73 79 6d 62 6f 6c 20 7a 53 79 6d 62 6f 6c  e symbol zSymbol
238a0 20 69 6e 20 74 68 65 20 64 79 6e 61 6d 69 63 20   in the dynamic 
238b0 6c 69 62 72 61 72 79 20 70 48 61 6e 64 6c 65 2e  library pHandle.
238c0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
238d0 28 2a 72 62 75 56 66 73 44 6c 53 79 6d 28 0a 20  (*rbuVfsDlSym(. 
238e0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
238f0 66 73 2c 20 0a 20 20 76 6f 69 64 20 2a 70 41 72  fs, .  void *pAr
23900 67 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  g, .  const char
23910 20 2a 7a 53 79 6d 0a 29 29 28 76 6f 69 64 29 7b   *zSym.))(void){
23920 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
23930 70 52 65 61 6c 56 66 73 20 3d 20 28 28 72 62 75  pRealVfs = ((rbu
23940 5f 76 66 73 2a 29 70 56 66 73 29 2d 3e 70 52 65  _vfs*)pVfs)->pRe
23950 61 6c 56 66 73 3b 0a 20 20 72 65 74 75 72 6e 20  alVfs;.  return 
23960 70 52 65 61 6c 56 66 73 2d 3e 78 44 6c 53 79 6d  pRealVfs->xDlSym
23970 28 70 52 65 61 6c 56 66 73 2c 20 70 41 72 67 2c  (pRealVfs, pArg,
23980 20 7a 53 79 6d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   zSym);.}../*.**
23990 20 43 6c 6f 73 65 20 74 68 65 20 64 79 6e 61 6d   Close the dynam
239a0 69 63 20 6c 69 62 72 61 72 79 20 68 61 6e 64 6c  ic library handl
239b0 65 20 70 48 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74  e pHandle..*/.st
239c0 61 74 69 63 20 76 6f 69 64 20 72 62 75 56 66 73  atic void rbuVfs
239d0 44 6c 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  DlClose(sqlite3_
239e0 76 66 73 20 2a 70 56 66 73 2c 20 76 6f 69 64 20  vfs *pVfs, void 
239f0 2a 70 48 61 6e 64 6c 65 29 7b 0a 20 20 73 71 6c  *pHandle){.  sql
23a00 69 74 65 33 5f 76 66 73 20 2a 70 52 65 61 6c 56  ite3_vfs *pRealV
23a10 66 73 20 3d 20 28 28 72 62 75 5f 76 66 73 2a 29  fs = ((rbu_vfs*)
23a20 70 56 66 73 29 2d 3e 70 52 65 61 6c 56 66 73 3b  pVfs)->pRealVfs;
23a30 0a 20 20 70 52 65 61 6c 56 66 73 2d 3e 78 44 6c  .  pRealVfs->xDl
23a40 43 6c 6f 73 65 28 70 52 65 61 6c 56 66 73 2c 20  Close(pRealVfs, 
23a50 70 48 61 6e 64 6c 65 29 3b 0a 7d 0a 23 65 6e 64  pHandle);.}.#end
23a60 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
23a70 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  T_LOAD_EXTENSION
23a80 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 75 6c   */../*.** Popul
23a90 61 74 65 20 74 68 65 20 62 75 66 66 65 72 20 70  ate the buffer p
23aa0 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 42 75  ointed to by zBu
23ab0 66 4f 75 74 20 77 69 74 68 20 6e 42 79 74 65 20  fOut with nByte 
23ac0 62 79 74 65 73 20 6f 66 20 0a 2a 2a 20 72 61 6e  bytes of .** ran
23ad0 64 6f 6d 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61  dom data..*/.sta
23ae0 74 69 63 20 69 6e 74 20 72 62 75 56 66 73 52 61  tic int rbuVfsRa
23af0 6e 64 6f 6d 6e 65 73 73 28 73 71 6c 69 74 65 33  ndomness(sqlite3
23b00 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20  _vfs *pVfs, int 
23b10 6e 42 79 74 65 2c 20 63 68 61 72 20 2a 7a 42 75  nByte, char *zBu
23b20 66 4f 75 74 29 7b 0a 20 20 73 71 6c 69 74 65 33  fOut){.  sqlite3
23b30 5f 76 66 73 20 2a 70 52 65 61 6c 56 66 73 20 3d  _vfs *pRealVfs =
23b40 20 28 28 72 62 75 5f 76 66 73 2a 29 70 56 66 73   ((rbu_vfs*)pVfs
23b50 29 2d 3e 70 52 65 61 6c 56 66 73 3b 0a 20 20 72  )->pRealVfs;.  r
23b60 65 74 75 72 6e 20 70 52 65 61 6c 56 66 73 2d 3e  eturn pRealVfs->
23b70 78 52 61 6e 64 6f 6d 6e 65 73 73 28 70 52 65 61  xRandomness(pRea
23b80 6c 56 66 73 2c 20 6e 42 79 74 65 2c 20 7a 42 75  lVfs, nByte, zBu
23b90 66 4f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  fOut);.}../*.** 
23ba0 53 6c 65 65 70 20 66 6f 72 20 6e 4d 69 63 72 6f  Sleep for nMicro
23bb0 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 2e 20 52   microseconds. R
23bc0 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
23bd0 20 6f 66 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73   of microseconds
23be0 20 0a 2a 2a 20 61 63 74 75 61 6c 6c 79 20 73 6c   .** actually sl
23bf0 65 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ept..*/.static i
23c00 6e 74 20 72 62 75 56 66 73 53 6c 65 65 70 28 73  nt rbuVfsSleep(s
23c10 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
23c20 2c 20 69 6e 74 20 6e 4d 69 63 72 6f 29 7b 0a 20  , int nMicro){. 
23c30 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 52   sqlite3_vfs *pR
23c40 65 61 6c 56 66 73 20 3d 20 28 28 72 62 75 5f 76  ealVfs = ((rbu_v
23c50 66 73 2a 29 70 56 66 73 29 2d 3e 70 52 65 61 6c  fs*)pVfs)->pReal
23c60 56 66 73 3b 0a 20 20 72 65 74 75 72 6e 20 70 52  Vfs;.  return pR
23c70 65 61 6c 56 66 73 2d 3e 78 53 6c 65 65 70 28 70  ealVfs->xSleep(p
23c80 52 65 61 6c 56 66 73 2c 20 6e 4d 69 63 72 6f 29  RealVfs, nMicro)
23c90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
23ca0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69  n the current ti
23cb0 6d 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44  me as a Julian D
23cc0 61 79 20 6e 75 6d 62 65 72 20 69 6e 20 2a 70 54  ay number in *pT
23cd0 69 6d 65 4f 75 74 2e 0a 2a 2f 0a 73 74 61 74 69  imeOut..*/.stati
23ce0 63 20 69 6e 74 20 72 62 75 56 66 73 43 75 72 72  c int rbuVfsCurr
23cf0 65 6e 74 54 69 6d 65 28 73 71 6c 69 74 65 33 5f  entTime(sqlite3_
23d00 76 66 73 20 2a 70 56 66 73 2c 20 64 6f 75 62 6c  vfs *pVfs, doubl
23d10 65 20 2a 70 54 69 6d 65 4f 75 74 29 7b 0a 20 20  e *pTimeOut){.  
23d20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 52 65  sqlite3_vfs *pRe
23d30 61 6c 56 66 73 20 3d 20 28 28 72 62 75 5f 76 66  alVfs = ((rbu_vf
23d40 73 2a 29 70 56 66 73 29 2d 3e 70 52 65 61 6c 56  s*)pVfs)->pRealV
23d50 66 73 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65  fs;.  return pRe
23d60 61 6c 56 66 73 2d 3e 78 43 75 72 72 65 6e 74 54  alVfs->xCurrentT
23d70 69 6d 65 28 70 52 65 61 6c 56 66 73 2c 20 70 54  ime(pRealVfs, pT
23d80 69 6d 65 4f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  imeOut);.}../*.*
23d90 2a 20 4e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  * No-op..*/.stat
23da0 69 63 20 69 6e 74 20 72 62 75 56 66 73 47 65 74  ic int rbuVfsGet
23db0 4c 61 73 74 45 72 72 6f 72 28 73 71 6c 69 74 65  LastError(sqlite
23dc0 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74  3_vfs *pVfs, int
23dd0 20 61 2c 20 63 68 61 72 20 2a 62 29 7b 0a 20 20   a, char *b){.  
23de0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
23df0 2a 2a 20 44 65 72 65 67 69 73 74 65 72 20 61 6e  ** Deregister an
23e00 64 20 64 65 73 74 72 6f 79 20 61 6e 20 52 42 55  d destroy an RBU
23e10 20 76 66 73 20 63 72 65 61 74 65 64 20 62 79 20   vfs created by 
23e20 61 6e 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20  an earlier call 
23e30 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 72 62 75  to.** sqlite3rbu
23e40 5f 63 72 65 61 74 65 5f 76 66 73 28 29 2e 0a 2a  _create_vfs()..*
23e50 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 72 62  /.void sqlite3rb
23e60 75 5f 64 65 73 74 72 6f 79 5f 76 66 73 28 63 6f  u_destroy_vfs(co
23e70 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
23e80 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  {.  sqlite3_vfs 
23e90 2a 70 56 66 73 20 3d 20 73 71 6c 69 74 65 33 5f  *pVfs = sqlite3_
23ea0 76 66 73 5f 66 69 6e 64 28 7a 4e 61 6d 65 29 3b  vfs_find(zName);
23eb0 0a 20 20 69 66 28 20 70 56 66 73 20 26 26 20 70  .  if( pVfs && p
23ec0 56 66 73 2d 3e 78 4f 70 65 6e 3d 3d 72 62 75 56  Vfs->xOpen==rbuV
23ed0 66 73 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71  fsOpen ){.    sq
23ee0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65  lite3_mutex_free
23ef0 28 28 28 72 62 75 5f 76 66 73 2a 29 70 56 66 73  (((rbu_vfs*)pVfs
23f00 29 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 73  )->mutex);.    s
23f10 71 6c 69 74 65 33 5f 76 66 73 5f 75 6e 72 65 67  qlite3_vfs_unreg
23f20 69 73 74 65 72 28 70 56 66 73 29 3b 0a 20 20 20  ister(pVfs);.   
23f30 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 56   sqlite3_free(pV
23f40 66 73 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  fs);.  }.}../*.*
23f50 2a 20 43 72 65 61 74 65 20 61 6e 20 52 42 55 20  * Create an RBU 
23f60 56 46 53 20 6e 61 6d 65 64 20 7a 4e 61 6d 65 20  VFS named zName 
23f70 74 68 61 74 20 61 63 63 65 73 73 65 73 20 74 68  that accesses th
23f80 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 66 69 6c  e underlying fil
23f90 65 2d 73 79 73 74 65 6d 0a 2a 2a 20 76 69 61 20  e-system.** via 
23fa0 65 78 69 73 74 69 6e 67 20 56 46 53 20 7a 50 61  existing VFS zPa
23fb0 72 65 6e 74 2e 20 54 68 65 20 6e 65 77 20 6f 62  rent. The new ob
23fc0 6a 65 63 74 20 69 73 20 72 65 67 69 73 74 65 72  ject is register
23fd0 65 64 20 61 73 20 61 20 6e 6f 6e 2d 64 65 66 61  ed as a non-defa
23fe0 75 6c 74 0a 2a 2a 20 56 46 53 20 77 69 74 68 20  ult.** VFS with 
23ff0 53 51 4c 69 74 65 20 62 65 66 6f 72 65 20 72 65  SQLite before re
24000 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20  turning..*/.int 
24010 73 71 6c 69 74 65 33 72 62 75 5f 63 72 65 61 74  sqlite3rbu_creat
24020 65 5f 76 66 73 28 63 6f 6e 73 74 20 63 68 61 72  e_vfs(const char
24030 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63   *zName, const c
24040 68 61 72 20 2a 7a 50 61 72 65 6e 74 29 7b 0a 0a  har *zParent){..
24050 20 20 2f 2a 20 54 65 6d 70 6c 61 74 65 20 66 6f    /* Template fo
24060 72 20 56 46 53 20 2a 2f 0a 20 20 73 74 61 74 69  r VFS */.  stati
24070 63 20 73 71 6c 69 74 65 33 5f 76 66 73 20 76 66  c sqlite3_vfs vf
24080 73 5f 74 65 6d 70 6c 61 74 65 20 3d 20 7b 0a 20  s_template = {. 
24090 20 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20     1,           
240a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
240b0 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a   /* iVersion */.
240c0 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20      0,          
240d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
240e0 20 20 2f 2a 20 73 7a 4f 73 46 69 6c 65 20 2a 2f    /* szOsFile */
240f0 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20  .    0,         
24100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24110 20 20 20 2f 2a 20 6d 78 50 61 74 68 6e 61 6d 65     /* mxPathname
24120 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20   */.    0,      
24130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24140 20 20 20 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a        /* pNext *
24150 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20  /.    0,        
24160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24170 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a      /* zName */.
24180 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20      0,          
24190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
241a0 20 20 2f 2a 20 70 41 70 70 44 61 74 61 20 2a 2f    /* pAppData */
241b0 0a 20 20 20 20 72 62 75 56 66 73 4f 70 65 6e 2c  .    rbuVfsOpen,
241c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
241d0 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f 0a 20     /* xOpen */. 
241e0 20 20 20 72 62 75 56 66 73 44 65 6c 65 74 65 2c     rbuVfsDelete,
241f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24200 20 2f 2a 20 78 44 65 6c 65 74 65 20 2a 2f 0a 20   /* xDelete */. 
24210 20 20 20 72 62 75 56 66 73 41 63 63 65 73 73 2c     rbuVfsAccess,
24220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24230 20 2f 2a 20 78 41 63 63 65 73 73 20 2a 2f 0a 20   /* xAccess */. 
24240 20 20 20 72 62 75 56 66 73 46 75 6c 6c 50 61 74     rbuVfsFullPat
24250 68 6e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20  hname,          
24260 20 2f 2a 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d   /* xFullPathnam
24270 65 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  e */..#ifndef SQ
24280 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45  LITE_OMIT_LOAD_E
24290 58 54 45 4e 53 49 4f 4e 0a 20 20 20 20 72 62 75  XTENSION.    rbu
242a0 56 66 73 44 6c 4f 70 65 6e 2c 20 20 20 20 20 20  VfsDlOpen,      
242b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44             /* xD
242c0 6c 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 72 62 75  lOpen */.    rbu
242d0 56 66 73 44 6c 45 72 72 6f 72 2c 20 20 20 20 20  VfsDlError,     
242e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44             /* xD
242f0 6c 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20 72 62  lError */.    rb
24300 75 56 66 73 44 6c 53 79 6d 2c 20 20 20 20 20 20  uVfsDlSym,      
24310 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
24320 44 6c 53 79 6d 20 2a 2f 0a 20 20 20 20 72 62 75  DlSym */.    rbu
24330 56 66 73 44 6c 43 6c 6f 73 65 2c 20 20 20 20 20  VfsDlClose,     
24340 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44             /* xD
24350 6c 43 6c 6f 73 65 20 2a 2f 0a 23 65 6c 73 65 0a  lClose */.#else.
24360 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a      0, 0, 0, 0,.
24370 23 65 6e 64 69 66 0a 0a 20 20 20 20 72 62 75 56  #endif..    rbuV
24380 66 73 52 61 6e 64 6f 6d 6e 65 73 73 2c 20 20 20  fsRandomness,   
24390 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 61            /* xRa
243a0 6e 64 6f 6d 6e 65 73 73 20 2a 2f 0a 20 20 20 20  ndomness */.    
243b0 72 62 75 56 66 73 53 6c 65 65 70 2c 20 20 20 20  rbuVfsSleep,    
243c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
243d0 20 78 53 6c 65 65 70 20 2a 2f 0a 20 20 20 20 72   xSleep */.    r
243e0 62 75 56 66 73 43 75 72 72 65 6e 74 54 69 6d 65  buVfsCurrentTime
243f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
24400 78 43 75 72 72 65 6e 74 54 69 6d 65 20 2a 2f 0a  xCurrentTime */.
24410 20 20 20 20 72 62 75 56 66 73 47 65 74 4c 61 73      rbuVfsGetLas
24420 74 45 72 72 6f 72 2c 20 20 20 20 20 20 20 20 20  tError,         
24430 20 20 2f 2a 20 78 47 65 74 4c 61 73 74 45 72 72    /* xGetLastErr
24440 6f 72 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20  or */.    0,    
24450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24460 20 20 20 20 20 20 20 20 2f 2a 20 78 43 75 72 72          /* xCurr
24470 65 6e 74 54 69 6d 65 49 6e 74 36 34 20 28 76 65  entTimeInt64 (ve
24480 72 73 69 6f 6e 20 32 29 20 2a 2f 0a 20 20 20 20  rsion 2) */.    
24490 30 2c 20 30 2c 20 30 20 20 20 20 20 20 20 20 20  0, 0, 0         
244a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
244b0 20 55 6e 69 6d 70 6c 65 6d 65 6e 74 65 64 20 76   Unimplemented v
244c0 65 72 73 69 6f 6e 20 33 20 6d 65 74 68 6f 64 73  ersion 3 methods
244d0 20 2a 2f 0a 20 20 7d 3b 0a 0a 20 20 72 62 75 5f   */.  };..  rbu_
244e0 76 66 73 20 2a 70 4e 65 77 20 3d 20 30 3b 20 20  vfs *pNew = 0;  
244f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
24500 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 56  ewly allocated V
24510 46 53 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  FS */.  int rc =
24520 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 69   SQLITE_OK;.  si
24530 7a 65 5f 74 20 6e 4e 61 6d 65 3b 0a 20 20 73 69  ze_t nName;.  si
24540 7a 65 5f 74 20 6e 42 79 74 65 3b 0a 0a 20 20 6e  ze_t nByte;..  n
24550 4e 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a 4e  Name = strlen(zN
24560 61 6d 65 29 3b 0a 20 20 6e 42 79 74 65 20 3d 20  ame);.  nByte = 
24570 73 69 7a 65 6f 66 28 72 62 75 5f 76 66 73 29 20  sizeof(rbu_vfs) 
24580 2b 20 6e 4e 61 6d 65 20 2b 20 31 3b 0a 20 20 70  + nName + 1;.  p
24590 4e 65 77 20 3d 20 28 72 62 75 5f 76 66 73 2a 29  New = (rbu_vfs*)
245a0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
245b0 28 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 70  (nByte);.  if( p
245c0 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  New==0 ){.    rc
245d0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
245e0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
245f0 6c 69 74 65 33 5f 76 66 73 20 2a 70 50 61 72 65  lite3_vfs *pPare
24600 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  nt;           /*
24610 20 50 61 72 65 6e 74 20 56 46 53 20 2a 2f 0a 20   Parent VFS */. 
24620 20 20 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20     memset(pNew, 
24630 30 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 70  0, nByte);.    p
24640 50 61 72 65 6e 74 20 3d 20 73 71 6c 69 74 65 33  Parent = sqlite3
24650 5f 76 66 73 5f 66 69 6e 64 28 7a 50 61 72 65 6e  _vfs_find(zParen
24660 74 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 72  t);.    if( pPar
24670 65 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ent==0 ){.      
24680 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 46  rc = SQLITE_NOTF
24690 4f 55 4e 44 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  OUND;.    }else{
246a0 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 53 70  .      char *zSp
246b0 61 63 65 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  ace;.      memcp
246c0 79 28 26 70 4e 65 77 2d 3e 62 61 73 65 2c 20 26  y(&pNew->base, &
246d0 76 66 73 5f 74 65 6d 70 6c 61 74 65 2c 20 73 69  vfs_template, si
246e0 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f 76 66 73  zeof(sqlite3_vfs
246f0 29 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  ));.      pNew->
24700 62 61 73 65 2e 6d 78 50 61 74 68 6e 61 6d 65 20  base.mxPathname 
24710 3d 20 70 50 61 72 65 6e 74 2d 3e 6d 78 50 61 74  = pParent->mxPat
24720 68 6e 61 6d 65 3b 0a 20 20 20 20 20 20 70 4e 65  hname;.      pNe
24730 77 2d 3e 62 61 73 65 2e 73 7a 4f 73 46 69 6c 65  w->base.szOsFile
24740 20 3d 20 73 69 7a 65 6f 66 28 72 62 75 5f 66 69   = sizeof(rbu_fi
24750 6c 65 29 20 2b 20 70 50 61 72 65 6e 74 2d 3e 73  le) + pParent->s
24760 7a 4f 73 46 69 6c 65 3b 0a 20 20 20 20 20 20 70  zOsFile;.      p
24770 4e 65 77 2d 3e 70 52 65 61 6c 56 66 73 20 3d 20  New->pRealVfs = 
24780 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 20 20 70  pParent;.      p
24790 4e 65 77 2d 3e 62 61 73 65 2e 7a 4e 61 6d 65 20  New->base.zName 
247a0 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 28  = (const char*)(
247b0 7a 53 70 61 63 65 20 3d 20 28 63 68 61 72 2a 29  zSpace = (char*)
247c0 26 70 4e 65 77 5b 31 5d 29 3b 0a 20 20 20 20 20  &pNew[1]);.     
247d0 20 6d 65 6d 63 70 79 28 7a 53 70 61 63 65 2c 20   memcpy(zSpace, 
247e0 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 0a  zName, nName);..
247f0 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74        /* Allocat
24800 65 20 74 68 65 20 6d 75 74 65 78 20 61 6e 64 20  e the mutex and 
24810 72 65 67 69 73 74 65 72 20 74 68 65 20 6e 65 77  register the new
24820 20 56 46 53 20 28 6e 6f 74 20 61 73 20 74 68 65   VFS (not as the
24830 20 64 65 66 61 75 6c 74 29 20 2a 2f 0a 20 20 20   default) */.   
24840 20 20 20 70 4e 65 77 2d 3e 6d 75 74 65 78 20 3d     pNew->mutex =
24850 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61   sqlite3_mutex_a
24860 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
24870 58 5f 52 45 43 55 52 53 49 56 45 29 3b 0a 20 20  X_RECURSIVE);.  
24880 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 6d 75      if( pNew->mu
24890 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tex==0 ){.      
248a0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
248b0 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  MEM;.      }else
248c0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
248d0 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73  qlite3_vfs_regis
248e0 74 65 72 28 26 70 4e 65 77 2d 3e 62 61 73 65 2c  ter(&pNew->base,
248f0 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
24900 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 21 3d   }..    if( rc!=
24910 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
24920 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
24930 5f 66 72 65 65 28 70 4e 65 77 2d 3e 6d 75 74 65  _free(pNew->mute
24940 78 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  x);.      sqlite
24950 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20  3_free(pNew);.  
24960 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
24970 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a  n rc;.}.../*****
24980 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24990 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
249a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
249b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
249c0 2a 2a 2a 2a 2a 2f 0a 0a 23 65 6e 64 69 66 20 2f  *****/..#endif /
249d0 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
249e0 45 5f 43 4f 52 45 29 20 7c 7c 20 64 65 66 69 6e  E_CORE) || defin
249f0 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
24a00 5f 52 42 55 29 20 2a 2f 0a                       _RBU) */.