/ Hex Artifact Content
Login

Artifact cc44505ef06053077f35b08c4ba11dc8bcf310dc:


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 41 6e 64 43 6f 6c 6c 65 63 74  repareAndCollect
7a70: 45 72 72 6f 72 28 70 2d 3e 64 62 52 62 75 2c 20  Error(p->dbRbu, 
7a80: 26 70 49 74 65 72 2d 3e 70 54 62 6c 49 74 65 72  &pIter->pTblIter
7a90: 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 20 0a  , &p->zErrmsg, .
7aa0: 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 72 62        "SELECT rb
7ab0: 75 5f 74 61 72 67 65 74 5f 6e 61 6d 65 28 6e 61  u_target_name(na
7ac0: 6d 65 2c 20 74 79 70 65 3d 27 76 69 65 77 27 29  me, type='view')
7ad0: 20 41 53 20 74 61 72 67 65 74 2c 20 6e 61 6d 65   AS target, name
7ae0: 20 22 0a 20 20 20 20 20 20 22 46 52 4f 4d 20 73   ".      "FROM s
7af0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 22 0a 20  qlite_master ". 
7b00: 20 20 20 20 20 22 57 48 45 52 45 20 74 79 70 65       "WHERE type
7b10: 20 49 4e 20 28 27 74 61 62 6c 65 27 2c 20 27 76   IN ('table', 'v
7b20: 69 65 77 27 29 20 41 4e 44 20 74 61 72 67 65 74  iew') AND target
7b30: 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 22 0a 20   IS NOT NULL ". 
7b40: 20 20 20 20 20 22 4f 52 44 45 52 20 42 59 20 6e       "ORDER BY n
7b50: 61 6d 65 22 0a 20 20 29 3b 0a 0a 20 20 69 66 28  ame".  );..  if(
7b60: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
7b70: 7b 0a 20 20 20 20 72 63 20 3d 20 70 72 65 70 61  {.    rc = prepa
7b80: 72 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f  reAndCollectErro
7b90: 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 70 49  r(p->dbMain, &pI
7ba0: 74 65 72 2d 3e 70 49 64 78 49 74 65 72 2c 20 26  ter->pIdxIter, &
7bb0: 70 2d 3e 7a 45 72 72 6d 73 67 2c 0a 20 20 20 20  p->zErrmsg,.    
7bc0: 20 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d 65      "SELECT name
7bd0: 2c 20 72 6f 6f 74 70 61 67 65 2c 20 73 71 6c 20  , rootpage, sql 
7be0: 49 53 20 4e 55 4c 4c 20 4f 52 20 73 75 62 73 74  IS NULL OR subst
7bf0: 72 28 38 2c 20 36 29 3d 3d 27 55 4e 49 51 55 45  r(8, 6)=='UNIQUE
7c00: 27 20 22 0a 20 20 20 20 20 20 20 20 22 20 20 46  ' ".        "  F
7c10: 52 4f 4d 20 6d 61 69 6e 2e 73 71 6c 69 74 65 5f  ROM main.sqlite_
7c20: 6d 61 73 74 65 72 20 22 0a 20 20 20 20 20 20 20  master ".       
7c30: 20 22 20 20 57 48 45 52 45 20 74 79 70 65 3d 27   "  WHERE type='
7c40: 69 6e 64 65 78 27 20 41 4e 44 20 74 62 6c 5f 6e  index' AND tbl_n
7c50: 61 6d 65 20 3d 20 3f 22 0a 20 20 20 20 29 3b 0a  ame = ?".    );.
7c60: 20 20 7d 0a 0a 20 20 70 49 74 65 72 2d 3e 62 43    }..  pIter->bC
7c70: 6c 65 61 6e 75 70 20 3d 20 31 3b 0a 20 20 70 2d  leanup = 1;.  p-
7c80: 3e 72 63 20 3d 20 72 63 3b 0a 20 20 72 65 74 75  >rc = rc;.  retu
7c90: 72 6e 20 72 62 75 4f 62 6a 49 74 65 72 4e 65 78  rn rbuObjIterNex
7ca0: 74 28 70 2c 20 70 49 74 65 72 29 3b 0a 7d 0a 0a  t(p, pIter);.}..
7cb0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  /*.** This is a 
7cc0: 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 22  wrapper around "
7cd0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
7ce0: 7a 46 6d 74 2c 20 2e 2e 2e 29 22 2e 20 49 66 20  zFmt, ...)". If 
7cf0: 61 6e 20 4f 4f 4d 20 6f 63 63 75 72 73 2c 0a 2a  an OOM occurs,.*
7d00: 2a 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  * an error code 
7d10: 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  is stored in the
7d20: 20 52 42 55 20 68 61 6e 64 6c 65 20 70 61 73 73   RBU handle pass
7d30: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
7d40: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  argument..**.** 
7d50: 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20  If an error has 
7d60: 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64  already occurred
7d70: 20 28 70 2d 3e 72 63 20 69 73 20 61 6c 72 65 61   (p->rc is alrea
7d80: 64 79 20 73 65 74 20 74 6f 20 73 6f 6d 65 74 68  dy set to someth
7d90: 69 6e 67 20 6f 74 68 65 72 0a 2a 2a 20 74 68 61  ing other.** tha
7da0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 29 2c 20 74 68  n SQLITE_OK), th
7db0: 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
7dc0: 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 77 69   returns NULL wi
7dd0: 74 68 6f 75 74 20 6d 6f 64 69 66 79 69 6e 67 20  thout modifying 
7de0: 74 68 65 0a 2a 2a 20 73 74 6f 72 65 64 20 65 72  the.** stored er
7df0: 72 6f 72 20 63 6f 64 65 2e 20 49 6e 20 74 68 69  ror code. In thi
7e00: 73 20 63 61 73 65 20 69 74 20 73 74 69 6c 6c 20  s case it still 
7e10: 63 61 6c 6c 73 20 73 71 6c 69 74 65 33 5f 66 72  calls sqlite3_fr
7e20: 65 65 28 29 20 6f 6e 20 61 6e 79 20 0a 2a 2a 20  ee() on any .** 
7e30: 70 72 69 6e 74 66 28 29 20 70 61 72 61 6d 65 74  printf() paramet
7e40: 65 72 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ers associated w
7e50: 69 74 68 20 25 7a 20 63 6f 6e 76 65 72 73 69 6f  ith %z conversio
7e60: 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  ns..*/.static ch
7e70: 61 72 20 2a 72 62 75 4d 50 72 69 6e 74 66 28 73  ar *rbuMPrintf(s
7e80: 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 63 6f  qlite3rbu *p, co
7e90: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d 74 2c 20  nst char *zFmt, 
7ea0: 2e 2e 2e 29 7b 0a 20 20 63 68 61 72 20 2a 7a 53  ...){.  char *zS
7eb0: 71 6c 20 3d 20 30 3b 0a 20 20 76 61 5f 6c 69 73  ql = 0;.  va_lis
7ec0: 74 20 61 70 3b 0a 20 20 76 61 5f 73 74 61 72 74  t ap;.  va_start
7ed0: 28 61 70 2c 20 7a 46 6d 74 29 3b 0a 20 20 7a 53  (ap, zFmt);.  zS
7ee0: 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 6d 70  ql = sqlite3_vmp
7ef0: 72 69 6e 74 66 28 7a 46 6d 74 2c 20 61 70 29 3b  rintf(zFmt, ap);
7f00: 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
7f10: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
7f20: 66 28 20 7a 53 71 6c 3d 3d 30 20 29 20 70 2d 3e  f( zSql==0 ) p->
7f30: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
7f40: 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  M;.  }else{.    
7f50: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71  sqlite3_free(zSq
7f60: 6c 29 3b 0a 20 20 20 20 7a 53 71 6c 20 3d 20 30  l);.    zSql = 0
7f70: 3b 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61  ;.  }.  va_end(a
7f80: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 53 71  p);.  return zSq
7f90: 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75  l;.}../*.** Argu
7fa0: 6d 65 6e 74 20 7a 46 6d 74 20 69 73 20 61 20 73  ment zFmt is a s
7fb0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 29  qlite3_mprintf()
7fc0: 20 73 74 79 6c 65 20 66 6f 72 6d 61 74 20 73 74   style format st
7fd0: 72 69 6e 67 2e 20 54 68 65 20 74 72 61 69 6c 69  ring. The traili
7fe0: 6e 67 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20  ng.** arguments 
7ff0: 61 72 65 20 74 68 65 20 75 73 75 61 6c 20 73 75  are the usual su
8000: 62 73 69 74 75 74 69 6f 6e 20 76 61 6c 75 65 73  bsitution values
8010: 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
8020: 70 65 72 66 6f 72 6d 73 0a 2a 2a 20 74 68 65 20  performs.** the 
8030: 70 72 69 6e 74 66 28 29 20 73 74 79 6c 65 20 73  printf() style s
8040: 75 62 73 74 69 74 75 74 69 6f 6e 73 20 61 6e 64  ubstitutions and
8050: 20 65 78 65 63 75 74 65 73 20 74 68 65 20 72 65   executes the re
8060: 73 75 6c 74 20 61 73 20 61 6e 20 53 51 4c 0a 2a  sult as an SQL.*
8070: 2a 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 74  * statement on t
8080: 68 65 20 52 42 55 20 68 61 6e 64 6c 65 73 20 64  he RBU handles d
8090: 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  atabase..**.** I
80a0: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
80b0: 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  s, an error code
80c0: 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61   and error messa
80d0: 67 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  ge is stored in 
80e0: 74 68 65 0a 2a 2a 20 52 42 55 20 68 61 6e 64 6c  the.** RBU handl
80f0: 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68  e. If an error h
8100: 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72  as already occur
8110: 72 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75  red when this fu
8120: 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 63 61 6c  nction is.** cal
8130: 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d  led, it is a no-
8140: 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  op..*/.static in
8150: 74 20 72 62 75 4d 50 72 69 6e 74 66 45 78 65 63  t rbuMPrintfExec
8160: 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20  (sqlite3rbu *p, 
8170: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e  sqlite3 *db, con
8180: 73 74 20 63 68 61 72 20 2a 7a 46 6d 74 2c 20 2e  st char *zFmt, .
8190: 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61  ..){.  va_list a
81a0: 70 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b  p;.  char *zSql;
81b0: 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20  .  va_start(ap, 
81c0: 7a 46 6d 74 29 3b 0a 20 20 7a 53 71 6c 20 3d 20  zFmt);.  zSql = 
81d0: 73 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74 66  sqlite3_vmprintf
81e0: 28 7a 46 6d 74 2c 20 61 70 29 3b 0a 20 20 69 66  (zFmt, ap);.  if
81f0: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
8200: 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 7a 53  OK ){.    if( zS
8210: 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  ql==0 ){.      p
8220: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ->rc = SQLITE_NO
8230: 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  MEM;.    }else{.
8240: 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71        p->rc = sq
8250: 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20 7a  lite3_exec(db, z
8260: 53 71 6c 2c 20 30 2c 20 30 2c 20 26 70 2d 3e 7a  Sql, 0, 0, &p->z
8270: 45 72 72 6d 73 67 29 3b 0a 20 20 20 20 7d 0a 20  Errmsg);.    }. 
8280: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
8290: 65 28 7a 53 71 6c 29 3b 0a 20 20 76 61 5f 65 6e  e(zSql);.  va_en
82a0: 64 28 61 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  d(ap);.  return 
82b0: 70 2d 3e 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  p->rc;.}../*.** 
82c0: 41 74 74 65 6d 70 74 20 74 6f 20 61 6c 6c 6f 63  Attempt to alloc
82d0: 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61  ate and return a
82e0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 7a 65   pointer to a ze
82f0: 72 6f 65 64 20 62 6c 6f 63 6b 20 6f 66 20 6e 42  roed block of nB
8300: 79 74 65 20 0a 2a 2a 20 62 79 74 65 73 2e 20 0a  yte .** bytes. .
8310: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
8320: 72 20 28 69 2e 65 2e 20 61 6e 20 4f 4f 4d 20 63  r (i.e. an OOM c
8330: 6f 6e 64 69 74 69 6f 6e 29 20 6f 63 63 75 72 73  ondition) occurs
8340: 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e  , return NULL an
8350: 64 20 6c 65 61 76 65 20 61 6e 20 0a 2a 2a 20 65  d leave an .** e
8360: 72 72 6f 72 20 63 6f 64 65 20 69 6e 20 74 68 65  rror code in the
8370: 20 72 62 75 20 68 61 6e 64 6c 65 20 70 61 73 73   rbu handle pass
8380: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
8390: 61 72 67 75 6d 65 6e 74 2e 20 4f 72 2c 20 69 66  argument. Or, if
83a0: 20 61 6e 20 0a 2a 2a 20 65 72 72 6f 72 20 68 61   an .** error ha
83b0: 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72  s already occurr
83c0: 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ed when this fun
83d0: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
83e0: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 0a 2a 2a   return NULL .**
83f0: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 77 69 74   immediately wit
8400: 68 6f 75 74 20 61 74 74 65 6d 70 74 69 6e 67 20  hout attempting 
8410: 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f  the allocation o
8420: 72 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20  r modifying the 
8430: 73 74 6f 72 65 64 0a 2a 2a 20 65 72 72 6f 72 20  stored.** error 
8440: 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  code..*/.static 
8450: 76 6f 69 64 20 2a 72 62 75 4d 61 6c 6c 6f 63 28  void *rbuMalloc(
8460: 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 69  sqlite3rbu *p, i
8470: 6e 74 20 6e 42 79 74 65 29 7b 0a 20 20 76 6f 69  nt nByte){.  voi
8480: 64 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 69  d *pRet = 0;.  i
8490: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
84a0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OK ){.    asser
84b0: 74 28 20 6e 42 79 74 65 3e 30 20 29 3b 0a 20 20  t( nByte>0 );.  
84c0: 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33    pRet = sqlite3
84d0: 5f 6d 61 6c 6c 6f 63 36 34 28 6e 42 79 74 65 29  _malloc64(nByte)
84e0: 3b 0a 20 20 20 20 69 66 28 20 70 52 65 74 3d 3d  ;.    if( pRet==
84f0: 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63  0 ){.      p->rc
8500: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
8510: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
8520: 20 20 6d 65 6d 73 65 74 28 70 52 65 74 2c 20 30    memset(pRet, 0
8530: 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 7d 0a  , nByte);.    }.
8540: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65    }.  return pRe
8550: 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  t;.}.../*.** All
8560: 6f 63 61 74 65 20 61 6e 64 20 7a 65 72 6f 20 74  ocate and zero t
8570: 68 65 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43  he pIter->azTblC
8580: 6f 6c 5b 5d 20 61 6e 64 20 61 62 54 62 6c 50 6b  ol[] and abTblPk
8590: 5b 5d 20 61 72 72 61 79 73 20 73 6f 20 74 68 61  [] arrays so tha
85a0: 74 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 72 6f  t.** there is ro
85b0: 6f 6d 20 66 6f 72 20 61 74 20 6c 65 61 73 74 20  om for at least 
85c0: 6e 43 6f 6c 20 65 6c 65 6d 65 6e 74 73 2e 20 49  nCol elements. I
85d0: 66 20 61 6e 20 4f 4f 4d 20 6f 63 63 75 72 73 2c  f an OOM occurs,
85e0: 20 73 74 6f 72 65 20 61 6e 0a 2a 2a 20 65 72 72   store an.** err
85f0: 6f 72 20 63 6f 64 65 20 69 6e 20 74 68 65 20 52  or code in the R
8600: 42 55 20 68 61 6e 64 6c 65 20 70 61 73 73 65 64  BU handle passed
8610: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
8620: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  gument..*/.stati
8630: 63 20 76 6f 69 64 20 72 62 75 41 6c 6c 6f 63 61  c void rbuAlloca
8640: 74 65 49 74 65 72 41 72 72 61 79 73 28 73 71 6c  teIterArrays(sql
8650: 69 74 65 33 72 62 75 20 2a 70 2c 20 52 62 75 4f  ite3rbu *p, RbuO
8660: 62 6a 49 74 65 72 20 2a 70 49 74 65 72 2c 20 69  bjIter *pIter, i
8670: 6e 74 20 6e 43 6f 6c 29 7b 0a 20 20 69 6e 74 20  nt nCol){.  int 
8680: 6e 42 79 74 65 20 3d 20 28 32 2a 73 69 7a 65 6f  nByte = (2*sizeo
8690: 66 28 63 68 61 72 2a 29 20 2b 20 73 69 7a 65 6f  f(char*) + sizeo
86a0: 66 28 69 6e 74 29 20 2b 20 33 2a 73 69 7a 65 6f  f(int) + 3*sizeo
86b0: 66 28 75 38 29 29 20 2a 20 6e 43 6f 6c 3b 0a 20  f(u8)) * nCol;. 
86c0: 20 63 68 61 72 20 2a 2a 61 7a 4e 65 77 3b 0a 0a   char **azNew;..
86d0: 20 20 61 7a 4e 65 77 20 3d 20 28 63 68 61 72 2a    azNew = (char*
86e0: 2a 29 72 62 75 4d 61 6c 6c 6f 63 28 70 2c 20 6e  *)rbuMalloc(p, n
86f0: 42 79 74 65 29 3b 0a 20 20 69 66 28 20 61 7a 4e  Byte);.  if( azN
8700: 65 77 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d  ew ){.    pIter-
8710: 3e 61 7a 54 62 6c 43 6f 6c 20 3d 20 61 7a 4e 65  >azTblCol = azNe
8720: 77 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 61 7a  w;.    pIter->az
8730: 54 62 6c 54 79 70 65 20 3d 20 26 61 7a 4e 65 77  TblType = &azNew
8740: 5b 6e 43 6f 6c 5d 3b 0a 20 20 20 20 70 49 74 65  [nCol];.    pIte
8750: 72 2d 3e 61 69 53 72 63 4f 72 64 65 72 20 3d 20  r->aiSrcOrder = 
8760: 28 69 6e 74 2a 29 26 70 49 74 65 72 2d 3e 61 7a  (int*)&pIter->az
8770: 54 62 6c 54 79 70 65 5b 6e 43 6f 6c 5d 3b 0a 20  TblType[nCol];. 
8780: 20 20 20 70 49 74 65 72 2d 3e 61 62 54 62 6c 50     pIter->abTblP
8790: 6b 20 3d 20 28 75 38 2a 29 26 70 49 74 65 72 2d  k = (u8*)&pIter-
87a0: 3e 61 69 53 72 63 4f 72 64 65 72 5b 6e 43 6f 6c  >aiSrcOrder[nCol
87b0: 5d 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 61 62  ];.    pIter->ab
87c0: 4e 6f 74 4e 75 6c 6c 20 3d 20 28 75 38 2a 29 26  NotNull = (u8*)&
87d0: 70 49 74 65 72 2d 3e 61 62 54 62 6c 50 6b 5b 6e  pIter->abTblPk[n
87e0: 43 6f 6c 5d 3b 0a 20 20 20 20 70 49 74 65 72 2d  Col];.    pIter-
87f0: 3e 61 62 49 6e 64 65 78 65 64 20 3d 20 28 75 38  >abIndexed = (u8
8800: 2a 29 26 70 49 74 65 72 2d 3e 61 62 4e 6f 74 4e  *)&pIter->abNotN
8810: 75 6c 6c 5b 6e 43 6f 6c 5d 3b 0a 20 20 7d 0a 7d  ull[nCol];.  }.}
8820: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ../*.** The firs
8830: 74 20 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20  t argument must 
8840: 62 65 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  be a nul-termina
8850: 74 65 64 20 73 74 72 69 6e 67 2e 20 54 68 69 73  ted string. This
8860: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 72 65 74   function.** ret
8870: 75 72 6e 73 20 61 20 63 6f 70 79 20 6f 66 20 74  urns a copy of t
8880: 68 65 20 73 74 72 69 6e 67 20 69 6e 20 6d 65 6d  he string in mem
8890: 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ory obtained fro
88a0: 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
88b0: 28 29 2e 0a 2a 2a 20 49 74 20 69 73 20 74 68 65  ()..** It is the
88c0: 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
88d0: 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  of the caller to
88e0: 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65   eventually free
88f0: 20 74 68 69 73 20 6d 65 6d 6f 72 79 0a 2a 2a 20   this memory.** 
8900: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 72  using sqlite3_fr
8910: 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ee()..**.** If a
8920: 6e 20 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e 20  n OOM condition 
8930: 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 77  is encountered w
8940: 68 65 6e 20 61 74 74 65 6d 70 74 69 6e 67 20 74  hen attempting t
8950: 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72  o allocate memor
8960: 79 2c 0a 2a 2a 20 6f 75 74 70 75 74 20 76 61 72  y,.** output var
8970: 69 61 62 6c 65 20 28 2a 70 52 63 29 20 69 73 20  iable (*pRc) is 
8980: 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4e 4f  set to SQLITE_NO
8990: 4d 45 4d 20 62 65 66 6f 72 65 20 72 65 74 75 72  MEM before retur
89a0: 6e 69 6e 67 2e 20 4f 74 68 65 72 77 69 73 65 2c  ning. Otherwise,
89b0: 0a 2a 2a 20 69 66 20 74 68 65 20 61 6c 6c 6f 63  .** if the alloc
89c0: 61 74 69 6f 6e 20 73 75 63 63 65 65 64 73 2c 20  ation succeeds, 
89d0: 28 2a 70 52 63 29 20 69 73 20 6c 65 66 74 20 75  (*pRc) is left u
89e0: 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 73 74 61  nchanged..*/.sta
89f0: 74 69 63 20 63 68 61 72 20 2a 72 62 75 53 74 72  tic char *rbuStr
8a00: 6e 64 75 70 28 63 6f 6e 73 74 20 63 68 61 72 20  ndup(const char 
8a10: 2a 7a 53 74 72 2c 20 69 6e 74 20 2a 70 52 63 29  *zStr, int *pRc)
8a20: 7b 0a 20 20 63 68 61 72 20 2a 7a 52 65 74 20 3d  {.  char *zRet =
8a30: 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 2a   0;..  assert( *
8a40: 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  pRc==SQLITE_OK )
8a50: 3b 0a 20 20 69 66 28 20 7a 53 74 72 20 29 7b 0a  ;.  if( zStr ){.
8a60: 20 20 20 20 73 69 7a 65 5f 74 20 6e 43 6f 70 79      size_t nCopy
8a70: 20 3d 20 73 74 72 6c 65 6e 28 7a 53 74 72 29 20   = strlen(zStr) 
8a80: 2b 20 31 3b 0a 20 20 20 20 7a 52 65 74 20 3d 20  + 1;.    zRet = 
8a90: 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 6d  (char*)sqlite3_m
8aa0: 61 6c 6c 6f 63 36 34 28 6e 43 6f 70 79 29 3b 0a  alloc64(nCopy);.
8ab0: 20 20 20 20 69 66 28 20 7a 52 65 74 20 29 7b 0a      if( zRet ){.
8ac0: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 52 65        memcpy(zRe
8ad0: 74 2c 20 7a 53 74 72 2c 20 6e 43 6f 70 79 29 3b  t, zStr, nCopy);
8ae0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
8af0: 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f    *pRc = SQLITE_
8b00: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d  NOMEM;.    }.  }
8b10: 0a 0a 20 20 72 65 74 75 72 6e 20 7a 52 65 74 3b  ..  return zRet;
8b20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 61 6c 69  .}../*.** Finali
8b30: 7a 65 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ze the statement
8b40: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
8b50: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a  econd argument..
8b60: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 71 6c  **.** If the sql
8b70: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 29 20  ite3_finalize() 
8b80: 63 61 6c 6c 20 69 6e 64 69 63 61 74 65 73 20 74  call indicates t
8b90: 68 61 74 20 61 6e 20 65 72 72 6f 72 20 6f 63 63  hat an error occ
8ba0: 75 72 73 2c 20 61 6e 64 20 74 68 65 0a 2a 2a 20  urs, and the.** 
8bb0: 72 62 75 20 68 61 6e 64 6c 65 20 65 72 72 6f 72  rbu handle error
8bc0: 20 63 6f 64 65 20 69 73 20 6e 6f 74 20 61 6c 72   code is not alr
8bd0: 65 61 64 79 20 73 65 74 2c 20 73 65 74 20 74 68  eady set, set th
8be0: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64  e error code and
8bf0: 20 65 72 72 6f 72 0a 2a 2a 20 6d 65 73 73 61 67   error.** messag
8c00: 65 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a  e accordingly..*
8c10: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62  /.static void rb
8c20: 75 46 69 6e 61 6c 69 7a 65 28 73 71 6c 69 74 65  uFinalize(sqlite
8c30: 33 72 62 75 20 2a 70 2c 20 73 71 6c 69 74 65 33  3rbu *p, sqlite3
8c40: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 29 7b 0a 20  _stmt *pStmt){. 
8c50: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73   sqlite3 *db = s
8c60: 71 6c 69 74 65 33 5f 64 62 5f 68 61 6e 64 6c 65  qlite3_db_handle
8c70: 28 70 53 74 6d 74 29 3b 0a 20 20 69 6e 74 20 72  (pStmt);.  int r
8c80: 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  c = sqlite3_fina
8c90: 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 69  lize(pStmt);.  i
8ca0: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
8cb0: 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54  _OK && rc!=SQLIT
8cc0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d 3e 72  E_OK ){.    p->r
8cd0: 63 20 3d 20 72 63 3b 0a 20 20 20 20 70 2d 3e 7a  c = rc;.    p->z
8ce0: 45 72 72 6d 73 67 20 3d 20 73 71 6c 69 74 65 33  Errmsg = sqlite3
8cf0: 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 73  _mprintf("%s", s
8d00: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62  qlite3_errmsg(db
8d10: 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 44 65  ));.  }.}../* De
8d20: 74 65 72 6d 69 6e 65 20 74 68 65 20 74 79 70 65  termine the type
8d30: 20 6f 66 20 61 20 74 61 62 6c 65 2e 0a 2a 2a 0a   of a table..**.
8d40: 2a 2a 20 20 20 70 65 54 79 70 65 20 69 73 20 6f  **   peType is o
8d50: 66 20 74 79 70 65 20 28 69 6e 74 2a 29 2c 20 61  f type (int*), a
8d60: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f   pointer to an o
8d70: 75 74 70 75 74 20 70 61 72 61 6d 65 74 65 72 20  utput parameter 
8d80: 6f 66 20 74 79 70 65 0a 2a 2a 20 20 20 28 69 6e  of type.**   (in
8d90: 74 29 2e 20 54 68 69 73 20 63 61 6c 6c 20 73 65  t). This call se
8da0: 74 73 20 74 68 65 20 6f 75 74 70 75 74 20 70 61  ts the output pa
8db0: 72 61 6d 65 74 65 72 20 61 73 20 66 6f 6c 6c 6f  rameter as follo
8dc0: 77 73 2c 20 64 65 70 65 6e 64 69 6e 67 0a 2a 2a  ws, depending.**
8dd0: 20 20 20 6f 6e 20 74 68 65 20 74 79 70 65 20 6f     on the type o
8de0: 66 20 74 68 65 20 74 61 62 6c 65 20 73 70 65 63  f the table spec
8df0: 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74  ified by paramet
8e00: 65 72 73 20 64 62 4e 61 6d 65 20 61 6e 64 20 7a  ers dbName and z
8e10: 54 62 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52  Tbl..**.**     R
8e20: 42 55 5f 50 4b 5f 4e 4f 54 41 42 4c 45 3a 20 20  BU_PK_NOTABLE:  
8e30: 20 20 20 20 20 4e 6f 20 73 75 63 68 20 74 61 62       No such tab
8e40: 6c 65 2e 0a 2a 2a 20 20 20 20 20 52 42 55 5f 50  le..**     RBU_P
8e50: 4b 5f 4e 4f 4e 45 3a 20 20 20 20 20 20 20 20 20  K_NONE:         
8e60: 20 54 61 62 6c 65 20 68 61 73 20 61 6e 20 69 6d   Table has an im
8e70: 70 6c 69 63 69 74 20 72 6f 77 69 64 2e 0a 2a 2a  plicit rowid..**
8e80: 20 20 20 20 20 52 42 55 5f 50 4b 5f 49 50 4b 3a       RBU_PK_IPK:
8e90: 20 20 20 20 20 20 20 20 20 20 20 54 61 62 6c 65             Table
8ea0: 20 68 61 73 20 61 6e 20 65 78 70 6c 69 63 69 74   has an explicit
8eb0: 20 49 50 4b 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 20   IPK column..** 
8ec0: 20 20 20 20 52 42 55 5f 50 4b 5f 45 58 54 45 52      RBU_PK_EXTER
8ed0: 4e 41 4c 3a 20 20 20 20 20 20 54 61 62 6c 65 20  NAL:      Table 
8ee0: 68 61 73 20 61 6e 20 65 78 74 65 72 6e 61 6c 20  has an external 
8ef0: 50 4b 20 69 6e 64 65 78 2e 0a 2a 2a 20 20 20 20  PK index..**    
8f00: 20 52 42 55 5f 50 4b 5f 57 49 54 48 4f 55 54 5f   RBU_PK_WITHOUT_
8f10: 52 4f 57 49 44 3a 20 54 61 62 6c 65 20 69 73 20  ROWID: Table is 
8f20: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 2e 0a 2a  WITHOUT ROWID..*
8f30: 2a 20 20 20 20 20 52 42 55 5f 50 4b 5f 56 54 41  *     RBU_PK_VTA
8f40: 42 3a 20 20 20 20 20 20 20 20 20 20 54 61 62 6c  B:          Tabl
8f50: 65 20 69 73 20 61 20 76 69 72 74 75 61 6c 20 74  e is a virtual t
8f60: 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 41 72  able..**.**   Ar
8f70: 67 75 6d 65 6e 74 20 2a 70 69 50 6b 20 69 73 20  gument *piPk is 
8f80: 61 6c 73 6f 20 6f 66 20 74 79 70 65 20 28 69 6e  also of type (in
8f90: 74 2a 29 2c 20 61 6e 64 20 61 6c 73 6f 20 70 6f  t*), and also po
8fa0: 69 6e 74 73 20 74 6f 20 61 6e 20 6f 75 74 70 75  ints to an outpu
8fb0: 74 0a 2a 2a 20 20 20 70 61 72 61 6d 65 74 65 72  t.**   parameter
8fc0: 2e 20 55 6e 6c 65 73 73 20 74 68 65 20 74 61 62  . Unless the tab
8fd0: 6c 65 20 68 61 73 20 61 6e 20 65 78 74 65 72 6e  le has an extern
8fe0: 61 6c 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69  al primary key i
8ff0: 6e 64 65 78 20 0a 2a 2a 20 20 20 28 69 2e 65 2e  ndex .**   (i.e.
9000: 20 75 6e 6c 65 73 73 20 2a 70 65 54 79 70 65 20   unless *peType 
9010: 69 73 20 73 65 74 20 74 6f 20 33 29 2c 20 74 68  is set to 3), th
9020: 65 6e 20 2a 70 69 50 6b 20 69 73 20 73 65 74 20  en *piPk is set 
9030: 74 6f 20 7a 65 72 6f 2e 20 4f 72 2c 0a 2a 2a 20  to zero. Or,.** 
9040: 20 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 64    if the table d
9050: 6f 65 73 20 68 61 76 65 20 61 6e 20 65 78 74 65  oes have an exte
9060: 72 6e 61 6c 20 70 72 69 6d 61 72 79 20 6b 65 79  rnal primary key
9070: 20 69 6e 64 65 78 2c 20 74 68 65 6e 20 2a 70 69   index, then *pi
9080: 50 6b 0a 2a 2a 20 20 20 69 73 20 73 65 74 20 74  Pk.**   is set t
9090: 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  o the root page 
90a0: 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 72  number of the pr
90b0: 69 6d 61 72 79 20 6b 65 79 20 69 6e 64 65 78 20  imary key index 
90c0: 62 65 66 6f 72 65 0a 2a 2a 20 20 20 72 65 74 75  before.**   retu
90d0: 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 4c 47  rning..**.** ALG
90e0: 4f 52 49 54 48 4d 3a 0a 2a 2a 0a 2a 2a 20 20 20  ORITHM:.**.**   
90f0: 69 66 28 20 6e 6f 20 65 6e 74 72 79 20 65 78 69  if( no entry exi
9100: 73 74 73 20 69 6e 20 73 71 6c 69 74 65 5f 6d 61  sts in sqlite_ma
9110: 73 74 65 72 20 29 7b 0a 2a 2a 20 20 20 20 20 72  ster ){.**     r
9120: 65 74 75 72 6e 20 52 42 55 5f 50 4b 5f 4e 4f 54  eturn RBU_PK_NOT
9130: 41 42 4c 45 0a 2a 2a 20 20 20 7d 65 6c 73 65 20  ABLE.**   }else 
9140: 69 66 28 20 73 71 6c 20 66 6f 72 20 74 68 65 20  if( sql for the 
9150: 65 6e 74 72 79 20 73 74 61 72 74 73 20 77 69 74  entry starts wit
9160: 68 20 22 43 52 45 41 54 45 20 56 49 52 54 55 41  h "CREATE VIRTUA
9170: 4c 22 20 29 7b 0a 2a 2a 20 20 20 20 20 72 65 74  L" ){.**     ret
9180: 75 72 6e 20 52 42 55 5f 50 4b 5f 56 54 41 42 0a  urn RBU_PK_VTAB.
9190: 2a 2a 20 20 20 7d 65 6c 73 65 20 69 66 28 20 22  **   }else if( "
91a0: 50 52 41 47 4d 41 20 69 6e 64 65 78 5f 6c 69 73  PRAGMA index_lis
91b0: 74 28 29 22 20 66 6f 72 20 74 68 65 20 74 61 62  t()" for the tab
91c0: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 22 70  le contains a "p
91d0: 6b 22 20 69 6e 64 65 78 20 29 7b 0a 2a 2a 20 20  k" index ){.**  
91e0: 20 20 20 69 66 28 20 74 68 65 20 69 6e 64 65 78     if( the index
91f0: 20 74 68 61 74 20 69 73 20 74 68 65 20 70 6b 20   that is the pk 
9200: 65 78 69 73 74 73 20 69 6e 20 73 71 6c 69 74 65  exists in sqlite
9210: 5f 6d 61 73 74 65 72 20 29 7b 0a 2a 2a 20 20 20  _master ){.**   
9220: 20 20 20 20 2a 70 69 50 4b 20 3d 20 72 6f 6f 74      *piPK = root
9230: 70 61 67 65 20 6f 66 20 74 68 61 74 20 69 6e 64  page of that ind
9240: 65 78 2e 0a 2a 2a 20 20 20 20 20 20 20 72 65 74  ex..**       ret
9250: 75 72 6e 20 52 42 55 5f 50 4b 5f 45 58 54 45 52  urn RBU_PK_EXTER
9260: 4e 41 4c 0a 2a 2a 20 20 20 20 20 7d 65 6c 73 65  NAL.**     }else
9270: 7b 0a 2a 2a 20 20 20 20 20 20 20 72 65 74 75 72  {.**       retur
9280: 6e 20 52 42 55 5f 50 4b 5f 57 49 54 48 4f 55 54  n RBU_PK_WITHOUT
9290: 5f 52 4f 57 49 44 0a 2a 2a 20 20 20 20 20 7d 0a  _ROWID.**     }.
92a0: 2a 2a 20 20 20 7d 65 6c 73 65 20 69 66 28 20 22  **   }else if( "
92b0: 50 52 41 47 4d 41 20 74 61 62 6c 65 5f 69 6e 66  PRAGMA table_inf
92c0: 6f 28 29 22 20 6c 69 73 74 73 20 6f 6e 65 20 6f  o()" lists one o
92d0: 72 20 6d 6f 72 65 20 22 70 6b 22 20 63 6f 6c 75  r more "pk" colu
92e0: 6d 6e 73 20 29 7b 0a 2a 2a 20 20 20 20 20 72 65  mns ){.**     re
92f0: 74 75 72 6e 20 52 42 55 5f 50 4b 5f 49 50 4b 0a  turn RBU_PK_IPK.
9300: 2a 2a 20 20 20 7d 65 6c 73 65 7b 0a 2a 2a 20 20  **   }else{.**  
9310: 20 20 20 72 65 74 75 72 6e 20 52 42 55 5f 50 4b     return RBU_PK
9320: 5f 4e 4f 4e 45 0a 2a 2a 20 20 20 7d 0a 2a 2f 0a  _NONE.**   }.*/.
9330: 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75 54  static void rbuT
9340: 61 62 6c 65 54 79 70 65 28 0a 20 20 73 71 6c 69  ableType(.  sqli
9350: 74 65 33 72 62 75 20 2a 70 2c 0a 20 20 63 6f 6e  te3rbu *p,.  con
9360: 73 74 20 63 68 61 72 20 2a 7a 54 61 62 2c 0a 20  st char *zTab,. 
9370: 20 69 6e 74 20 2a 70 65 54 79 70 65 2c 0a 20 20   int *peType,.  
9380: 69 6e 74 20 2a 70 69 54 6e 75 6d 2c 0a 20 20 69  int *piTnum,.  i
9390: 6e 74 20 2a 70 69 50 6b 0a 29 7b 0a 20 20 2f 2a  nt *piPk.){.  /*
93a0: 0a 20 20 2a 2a 20 30 29 20 53 45 4c 45 43 54 20  .  ** 0) SELECT 
93b0: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 73 71  count(*) FROM sq
93c0: 6c 69 74 65 5f 6d 61 73 74 65 72 20 77 68 65 72  lite_master wher
93d0: 65 20 6e 61 6d 65 3d 25 51 20 41 4e 44 20 49 73  e name=%Q AND Is
93e0: 56 69 72 74 75 61 6c 28 25 51 29 0a 20 20 2a 2a  Virtual(%Q).  **
93f0: 20 31 29 20 50 52 41 47 4d 41 20 69 6e 64 65 78   1) PRAGMA index
9400: 5f 6c 69 73 74 20 3d 20 3f 0a 20 20 2a 2a 20 32  _list = ?.  ** 2
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 0a 20 20 2a 2a 20 33 29 20 50 52 41 47  %Q .  ** 3) PRAG
9450: 4d 41 20 74 61 62 6c 65 5f 69 6e 66 6f 20 3d 20  MA table_info = 
9460: 3f 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ?.  */.  sqlite3
9470: 5f 73 74 6d 74 20 2a 61 53 74 6d 74 5b 34 5d 20  _stmt *aStmt[4] 
9480: 3d 20 7b 30 2c 20 30 2c 20 30 2c 20 30 7d 3b 0a  = {0, 0, 0, 0};.
9490: 0a 20 20 2a 70 65 54 79 70 65 20 3d 20 52 42 55  .  *peType = RBU
94a0: 5f 50 4b 5f 4e 4f 54 41 42 4c 45 3b 0a 20 20 2a  _PK_NOTABLE;.  *
94b0: 70 69 50 6b 20 3d 20 30 3b 0a 0a 20 20 61 73 73  piPk = 0;..  ass
94c0: 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ert( p->rc==SQLI
94d0: 54 45 5f 4f 4b 20 29 3b 0a 20 20 70 2d 3e 72 63  TE_OK );.  p->rc
94e0: 20 3d 20 70 72 65 70 61 72 65 46 72 65 65 41 6e   = prepareFreeAn
94f0: 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d  dCollectError(p-
9500: 3e 64 62 4d 61 69 6e 2c 20 26 61 53 74 6d 74 5b  >dbMain, &aStmt[
9510: 30 5d 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c  0], &p->zErrmsg,
9520: 20 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70   .    sqlite3_mp
9530: 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20  rintf(.         
9540: 20 22 53 45 4c 45 43 54 20 28 73 71 6c 20 4c 49   "SELECT (sql LI
9550: 4b 45 20 27 63 72 65 61 74 65 20 76 69 72 74 75  KE 'create virtu
9560: 61 6c 25 25 27 29 2c 20 72 6f 6f 74 70 61 67 65  al%%'), rootpage
9570: 22 0a 20 20 20 20 20 20 20 20 20 20 22 20 20 46  ".          "  F
9580: 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
9590: 72 22 0a 20 20 20 20 20 20 20 20 20 20 22 20 57  r".          " W
95a0: 48 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c 20 7a  HERE name=%Q", z
95b0: 54 61 62 0a 20 20 29 29 3b 0a 20 20 69 66 28 20  Tab.  ));.  if( 
95c0: 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc!=SQLITE_OK
95d0: 20 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74 65 70   || sqlite3_step
95e0: 28 61 53 74 6d 74 5b 30 5d 29 21 3d 53 51 4c 49  (aStmt[0])!=SQLI
95f0: 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 2f 2a  TE_ROW ){.    /*
9600: 20 45 69 74 68 65 72 20 61 6e 20 65 72 72 6f 72   Either an error
9610: 2c 20 6f 72 20 6e 6f 20 73 75 63 68 20 74 61 62  , or no such tab
9620: 6c 65 2e 20 2a 2f 0a 20 20 20 20 67 6f 74 6f 20  le. */.    goto 
9630: 72 62 75 54 61 62 6c 65 54 79 70 65 5f 65 6e 64  rbuTableType_end
9640: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
9650: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 61  te3_column_int(a
9660: 53 74 6d 74 5b 30 5d 2c 20 30 29 20 29 7b 0a 20  Stmt[0], 0) ){. 
9670: 20 20 20 2a 70 65 54 79 70 65 20 3d 20 52 42 55     *peType = RBU
9680: 5f 50 4b 5f 56 54 41 42 3b 20 20 20 20 20 20 20  _PK_VTAB;       
9690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
96a0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a   virtual table *
96b0: 2f 0a 20 20 20 20 67 6f 74 6f 20 72 62 75 54 61  /.    goto rbuTa
96c0: 62 6c 65 54 79 70 65 5f 65 6e 64 3b 0a 20 20 7d  bleType_end;.  }
96d0: 0a 20 20 2a 70 69 54 6e 75 6d 20 3d 20 73 71 6c  .  *piTnum = sql
96e0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
96f0: 61 53 74 6d 74 5b 30 5d 2c 20 31 29 3b 0a 0a 20  aStmt[0], 1);.. 
9700: 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65   p->rc = prepare
9710: 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72  FreeAndCollectEr
9720: 72 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 26  ror(p->dbMain, &
9730: 61 53 74 6d 74 5b 31 5d 2c 20 26 70 2d 3e 7a 45  aStmt[1], &p->zE
9740: 72 72 6d 73 67 2c 20 0a 20 20 20 20 73 71 6c 69  rrmsg, .    sqli
9750: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 50 52 41  te3_mprintf("PRA
9760: 47 4d 41 20 69 6e 64 65 78 5f 6c 69 73 74 3d 25  GMA index_list=%
9770: 51 22 2c 7a 54 61 62 29 0a 20 20 29 3b 0a 20 20  Q",zTab).  );.  
9780: 69 66 28 20 70 2d 3e 72 63 20 29 20 67 6f 74 6f  if( p->rc ) goto
9790: 20 72 62 75 54 61 62 6c 65 54 79 70 65 5f 65 6e   rbuTableType_en
97a0: 64 3b 0a 20 20 77 68 69 6c 65 28 20 73 71 6c 69  d;.  while( sqli
97b0: 74 65 33 5f 73 74 65 70 28 61 53 74 6d 74 5b 31  te3_step(aStmt[1
97c0: 5d 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  ])==SQLITE_ROW )
97d0: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a  {.    const u8 *
97e0: 7a 4f 72 69 67 20 3d 20 73 71 6c 69 74 65 33 5f  zOrig = sqlite3_
97f0: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 61 53 74 6d  column_text(aStm
9800: 74 5b 31 5d 2c 20 33 29 3b 0a 20 20 20 20 63 6f  t[1], 3);.    co
9810: 6e 73 74 20 75 38 20 2a 7a 49 64 78 20 3d 20 73  nst u8 *zIdx = s
9820: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
9830: 78 74 28 61 53 74 6d 74 5b 31 5d 2c 20 31 29 3b  xt(aStmt[1], 1);
9840: 0a 20 20 20 20 69 66 28 20 7a 4f 72 69 67 20 26  .    if( zOrig &
9850: 26 20 7a 49 64 78 20 26 26 20 7a 4f 72 69 67 5b  & zIdx && zOrig[
9860: 30 5d 3d 3d 27 70 27 20 29 7b 0a 20 20 20 20 20  0]=='p' ){.     
9870: 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65   p->rc = prepare
9880: 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72  FreeAndCollectEr
9890: 72 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 26  ror(p->dbMain, &
98a0: 61 53 74 6d 74 5b 32 5d 2c 20 26 70 2d 3e 7a 45  aStmt[2], &p->zE
98b0: 72 72 6d 73 67 2c 20 0a 20 20 20 20 20 20 20 20  rrmsg, .        
98c0: 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74    sqlite3_mprint
98d0: 66 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  f(.            "
98e0: 53 45 4c 45 43 54 20 72 6f 6f 74 70 61 67 65 20  SELECT rootpage 
98f0: 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
9900: 65 72 20 57 48 45 52 45 20 6e 61 6d 65 20 3d 20  er WHERE name = 
9910: 25 51 22 2c 20 7a 49 64 78 0a 20 20 20 20 20 20  %Q", zIdx.      
9920: 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  ));.      if( p-
9930: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
9940: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
9950: 6c 69 74 65 33 5f 73 74 65 70 28 61 53 74 6d 74  lite3_step(aStmt
9960: 5b 32 5d 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  [2])==SQLITE_ROW
9970: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70   ){.          *p
9980: 69 50 6b 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  iPk = sqlite3_co
9990: 6c 75 6d 6e 5f 69 6e 74 28 61 53 74 6d 74 5b 32  lumn_int(aStmt[2
99a0: 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  ], 0);.         
99b0: 20 2a 70 65 54 79 70 65 20 3d 20 52 42 55 5f 50   *peType = RBU_P
99c0: 4b 5f 45 58 54 45 52 4e 41 4c 3b 0a 20 20 20 20  K_EXTERNAL;.    
99d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
99e0: 20 20 20 20 20 2a 70 65 54 79 70 65 20 3d 20 52       *peType = R
99f0: 42 55 5f 50 4b 5f 57 49 54 48 4f 55 54 5f 52 4f  BU_PK_WITHOUT_RO
9a00: 57 49 44 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  WID;.        }. 
9a10: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74       }.      got
9a20: 6f 20 72 62 75 54 61 62 6c 65 54 79 70 65 5f 65  o rbuTableType_e
9a30: 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  nd;.    }.  }.. 
9a40: 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65   p->rc = prepare
9a50: 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72  FreeAndCollectEr
9a60: 72 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 26  ror(p->dbMain, &
9a70: 61 53 74 6d 74 5b 33 5d 2c 20 26 70 2d 3e 7a 45  aStmt[3], &p->zE
9a80: 72 72 6d 73 67 2c 20 0a 20 20 20 20 73 71 6c 69  rrmsg, .    sqli
9a90: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 50 52 41  te3_mprintf("PRA
9aa0: 47 4d 41 20 74 61 62 6c 65 5f 69 6e 66 6f 3d 25  GMA table_info=%
9ab0: 51 22 2c 7a 54 61 62 29 0a 20 20 29 3b 0a 20 20  Q",zTab).  );.  
9ac0: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
9ad0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 77 68 69 6c  E_OK ){.    whil
9ae0: 65 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  e( sqlite3_step(
9af0: 61 53 74 6d 74 5b 33 5d 29 3d 3d 53 51 4c 49 54  aStmt[3])==SQLIT
9b00: 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 69  E_ROW ){.      i
9b10: 66 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  f( sqlite3_colum
9b20: 6e 5f 69 6e 74 28 61 53 74 6d 74 5b 33 5d 2c 35  n_int(aStmt[3],5
9b30: 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  )>0 ){.        *
9b40: 70 65 54 79 70 65 20 3d 20 52 42 55 5f 50 4b 5f  peType = RBU_PK_
9b50: 49 50 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  IPK;            
9b60: 20 20 20 20 2f 2a 20 65 78 70 6c 69 63 69 74 20      /* explicit 
9b70: 49 50 4b 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  IPK column */.  
9b80: 20 20 20 20 20 20 67 6f 74 6f 20 72 62 75 54 61        goto rbuTa
9b90: 62 6c 65 54 79 70 65 5f 65 6e 64 3b 0a 20 20 20  bleType_end;.   
9ba0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 2a     }.    }.    *
9bb0: 70 65 54 79 70 65 20 3d 20 52 42 55 5f 50 4b 5f  peType = RBU_PK_
9bc0: 4e 4f 4e 45 3b 0a 20 20 7d 0a 0a 72 62 75 54 61  NONE;.  }..rbuTa
9bd0: 62 6c 65 54 79 70 65 5f 65 6e 64 3a 20 7b 0a 20  bleType_end: {. 
9be0: 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20     unsigned int 
9bf0: 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
9c00: 69 3c 73 69 7a 65 6f 66 28 61 53 74 6d 74 29 2f  i<sizeof(aStmt)/
9c10: 73 69 7a 65 6f 66 28 61 53 74 6d 74 5b 30 5d 29  sizeof(aStmt[0])
9c20: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 62  ; i++){.      rb
9c30: 75 46 69 6e 61 6c 69 7a 65 28 70 2c 20 61 53 74  uFinalize(p, aSt
9c40: 6d 74 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  mt[i]);.    }.  
9c50: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
9c60: 69 73 20 61 20 68 65 6c 70 65 72 20 66 75 6e 63  is a helper func
9c70: 74 69 6f 6e 20 66 6f 72 20 72 62 75 4f 62 6a 49  tion for rbuObjI
9c80: 74 65 72 43 61 63 68 65 54 61 62 6c 65 49 6e 66  terCacheTableInf
9c90: 6f 28 29 2e 20 49 74 20 70 6f 70 75 6c 61 74 65  o(). It populate
9ca0: 73 0a 2a 2a 20 74 68 65 20 70 49 74 65 72 2d 3e  s.** the pIter->
9cb0: 61 62 49 6e 64 65 78 65 64 5b 5d 20 61 72 72 61  abIndexed[] arra
9cc0: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
9cd0: 64 20 72 62 75 4f 62 6a 49 74 65 72 43 61 63 68  d rbuObjIterCach
9ce0: 65 49 6e 64 65 78 65 64 43 6f 6c 73 28 73 71 6c  eIndexedCols(sql
9cf0: 69 74 65 33 72 62 75 20 2a 70 2c 20 52 62 75 4f  ite3rbu *p, RbuO
9d00: 62 6a 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  bjIter *pIter){.
9d10: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
9d20: 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 69 6e 74  pList = 0;.  int
9d30: 20 62 49 6e 64 65 78 20 3d 20 30 3b 0a 0a 20 20   bIndex = 0;..  
9d40: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
9d50: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6d 65 6d 63  E_OK ){.    memc
9d60: 70 79 28 70 49 74 65 72 2d 3e 61 62 49 6e 64 65  py(pIter->abInde
9d70: 78 65 64 2c 20 70 49 74 65 72 2d 3e 61 62 54 62  xed, pIter->abTb
9d80: 6c 50 6b 2c 20 73 69 7a 65 6f 66 28 75 38 29 2a  lPk, sizeof(u8)*
9d90: 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 29 3b  pIter->nTblCol);
9da0: 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 72 65  .    p->rc = pre
9db0: 70 61 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65  pareFreeAndColle
9dc0: 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 4d 61 69  ctError(p->dbMai
9dd0: 6e 2c 20 26 70 4c 69 73 74 2c 20 26 70 2d 3e 7a  n, &pList, &p->z
9de0: 45 72 72 6d 73 67 2c 0a 20 20 20 20 20 20 20 20  Errmsg,.        
9df0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
9e00: 22 50 52 41 47 4d 41 20 6d 61 69 6e 2e 69 6e 64  "PRAGMA main.ind
9e10: 65 78 5f 6c 69 73 74 20 3d 20 25 51 22 2c 20 70  ex_list = %Q", p
9e20: 49 74 65 72 2d 3e 7a 54 62 6c 29 0a 20 20 20 20  Iter->zTbl).    
9e30: 29 3b 0a 20 20 7d 0a 0a 20 20 70 49 74 65 72 2d  );.  }..  pIter-
9e40: 3e 6e 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 77  >nIndex = 0;.  w
9e50: 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  hile( p->rc==SQL
9e60: 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45  ITE_OK && SQLITE
9e70: 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74  _ROW==sqlite3_st
9e80: 65 70 28 70 4c 69 73 74 29 20 29 7b 0a 20 20 20  ep(pList) ){.   
9e90: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64   const char *zId
9ea0: 78 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  x = (const char*
9eb0: 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
9ec0: 74 65 78 74 28 70 4c 69 73 74 2c 20 31 29 3b 0a  text(pList, 1);.
9ed0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
9ee0: 20 2a 70 58 49 6e 66 6f 20 3d 20 30 3b 0a 20 20   *pXInfo = 0;.  
9ef0: 20 20 69 66 28 20 7a 49 64 78 3d 3d 30 20 29 20    if( zIdx==0 ) 
9f00: 62 72 65 61 6b 3b 0a 20 20 20 20 70 2d 3e 72 63  break;.    p->rc
9f10: 20 3d 20 70 72 65 70 61 72 65 46 72 65 65 41 6e   = prepareFreeAn
9f20: 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d  dCollectError(p-
9f30: 3e 64 62 4d 61 69 6e 2c 20 26 70 58 49 6e 66 6f  >dbMain, &pXInfo
9f40: 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 0a 20  , &p->zErrmsg,. 
9f50: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d         sqlite3_m
9f60: 70 72 69 6e 74 66 28 22 50 52 41 47 4d 41 20 6d  printf("PRAGMA m
9f70: 61 69 6e 2e 69 6e 64 65 78 5f 78 69 6e 66 6f 20  ain.index_xinfo 
9f80: 3d 20 25 51 22 2c 20 7a 49 64 78 29 0a 20 20 20  = %Q", zIdx).   
9f90: 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70   );.    while( p
9fa0: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
9fb0: 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  && SQLITE_ROW==s
9fc0: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 58 49 6e  qlite3_step(pXIn
9fd0: 66 6f 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  fo) ){.      int
9fe0: 20 69 43 69 64 20 3d 20 73 71 6c 69 74 65 33 5f   iCid = sqlite3_
9ff0: 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 58 49 6e 66  column_int(pXInf
a000: 6f 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28  o, 1);.      if(
a010: 20 69 43 69 64 3e 3d 30 20 29 20 70 49 74 65 72   iCid>=0 ) pIter
a020: 2d 3e 61 62 49 6e 64 65 78 65 64 5b 69 43 69 64  ->abIndexed[iCid
a030: 5d 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  ] = 1;.    }.   
a040: 20 72 62 75 46 69 6e 61 6c 69 7a 65 28 70 2c 20   rbuFinalize(p, 
a050: 70 58 49 6e 66 6f 29 3b 0a 20 20 20 20 62 49 6e  pXInfo);.    bIn
a060: 64 65 78 20 3d 20 31 3b 0a 20 20 20 20 70 49 74  dex = 1;.    pIt
a070: 65 72 2d 3e 6e 49 6e 64 65 78 2b 2b 3b 0a 20 20  er->nIndex++;.  
a080: 7d 0a 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e  }..  if( pIter->
a090: 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 57 49  eType==RBU_PK_WI
a0a0: 54 48 4f 55 54 5f 52 4f 57 49 44 20 29 7b 0a 20  THOUT_ROWID ){. 
a0b0: 20 20 20 2f 2a 20 22 50 52 41 47 4d 41 20 69 6e     /* "PRAGMA in
a0c0: 64 65 78 5f 6c 69 73 74 22 20 69 6e 63 6c 75 64  dex_list" includ
a0d0: 65 73 20 74 68 65 20 6d 61 69 6e 20 50 4b 20 62  es the main PK b
a0e0: 2d 74 72 65 65 20 2a 2f 0a 20 20 20 20 70 49 74  -tree */.    pIt
a0f0: 65 72 2d 3e 6e 49 6e 64 65 78 2d 2d 3b 0a 20 20  er->nIndex--;.  
a100: 7d 0a 0a 20 20 72 62 75 46 69 6e 61 6c 69 7a 65  }..  rbuFinalize
a110: 28 70 2c 20 70 4c 69 73 74 29 3b 0a 20 20 69 66  (p, pList);.  if
a120: 28 20 62 49 6e 64 65 78 3d 3d 30 20 29 20 70 49  ( bIndex==0 ) pI
a130: 74 65 72 2d 3e 61 62 49 6e 64 65 78 65 64 20 3d  ter->abIndexed =
a140: 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66   0;.}.../*.** If
a150: 20 74 68 65 79 20 61 72 65 20 6e 6f 74 20 61 6c   they are not al
a160: 72 65 61 64 79 20 70 6f 70 75 6c 61 74 65 64 2c  ready populated,
a170: 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 70 49   populate the pI
a180: 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 5d 2c  ter->azTblCol[],
a190: 0a 2a 2a 20 70 49 74 65 72 2d 3e 61 62 54 62 6c  .** pIter->abTbl
a1a0: 50 6b 5b 5d 2c 20 70 49 74 65 72 2d 3e 6e 54 62  Pk[], pIter->nTb
a1b0: 6c 43 6f 6c 20 61 6e 64 20 70 49 74 65 72 2d 3e  lCol and pIter->
a1c0: 62 52 6f 77 69 64 20 76 61 72 69 61 62 6c 65 73  bRowid variables
a1d0: 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 0a 2a 2a   according to.**
a1e0: 20 74 68 65 20 74 61 62 6c 65 20 28 6e 6f 74 20   the table (not 
a1f0: 69 6e 64 65 78 29 20 74 68 61 74 20 74 68 65 20  index) that the 
a200: 69 74 65 72 61 74 6f 72 20 63 75 72 72 65 6e 74  iterator current
a210: 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2a  ly points to..**
a220: 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
a230: 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66  E_OK if successf
a240: 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65  ul, or an SQLite
a250: 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65   error code othe
a260: 72 77 69 73 65 2e 20 49 66 0a 2a 2a 20 61 6e 20  rwise. If.** an 
a270: 65 72 72 6f 72 20 64 6f 65 73 20 6f 63 63 75 72  error does occur
a280: 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  , an error code 
a290: 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67  and error messag
a2a0: 65 20 61 72 65 20 61 6c 73 6f 20 6c 65 66 74 20  e are also left 
a2b0: 69 6e 20 0a 2a 2a 20 74 68 65 20 52 42 55 20 68  in .** the RBU h
a2c0: 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  andle..*/.static
a2d0: 20 69 6e 74 20 72 62 75 4f 62 6a 49 74 65 72 43   int rbuObjIterC
a2e0: 61 63 68 65 54 61 62 6c 65 49 6e 66 6f 28 73 71  acheTableInfo(sq
a2f0: 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 52 62 75  lite3rbu *p, Rbu
a300: 4f 62 6a 49 74 65 72 20 2a 70 49 74 65 72 29 7b  ObjIter *pIter){
a310: 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 61 7a  .  if( pIter->az
a320: 54 62 6c 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20  TblCol==0 ){.   
a330: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
a340: 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e  Stmt = 0;.    in
a350: 74 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  t nCol = 0;.    
a360: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
a370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a380: 20 66 6f 72 28 29 20 6c 6f 6f 70 20 69 74 65 72   for() loop iter
a390: 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f  ator variable */
a3a0: 0a 20 20 20 20 69 6e 74 20 62 52 62 75 52 6f 77  .    int bRbuRow
a3b0: 69 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  id = 0;         
a3c0: 20 20 20 2f 2a 20 49 66 20 69 6e 70 75 74 20 74     /* If input t
a3d0: 61 62 6c 65 20 68 61 73 20 63 6f 6c 75 6d 6e 20  able has column 
a3e0: 22 72 62 75 5f 72 6f 77 69 64 22 20 2a 2f 0a 20  "rbu_rowid" */. 
a3f0: 20 20 20 69 6e 74 20 69 4f 72 64 65 72 20 3d 20     int iOrder = 
a400: 30 3b 0a 20 20 20 20 69 6e 74 20 69 54 6e 75 6d  0;.    int iTnum
a410: 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 46 69   = 0;..    /* Fi
a420: 67 75 72 65 20 6f 75 74 20 74 68 65 20 74 79 70  gure out the typ
a430: 65 20 6f 66 20 74 61 62 6c 65 20 74 68 69 73 20  e of table this 
a440: 73 74 65 70 20 77 69 6c 6c 20 64 65 61 6c 20 77  step will deal w
a450: 69 74 68 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  ith. */.    asse
a460: 72 74 28 20 70 49 74 65 72 2d 3e 65 54 79 70 65  rt( pIter->eType
a470: 3d 3d 30 20 29 3b 0a 20 20 20 20 72 62 75 54 61  ==0 );.    rbuTa
a480: 62 6c 65 54 79 70 65 28 70 2c 20 70 49 74 65 72  bleType(p, pIter
a490: 2d 3e 7a 54 62 6c 2c 20 26 70 49 74 65 72 2d 3e  ->zTbl, &pIter->
a4a0: 65 54 79 70 65 2c 20 26 69 54 6e 75 6d 2c 20 26  eType, &iTnum, &
a4b0: 70 49 74 65 72 2d 3e 69 50 6b 54 6e 75 6d 29 3b  pIter->iPkTnum);
a4c0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  .    if( p->rc==
a4d0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 49 74  SQLITE_OK && pIt
a4e0: 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50  er->eType==RBU_P
a4f0: 4b 5f 4e 4f 54 41 42 4c 45 20 29 7b 0a 20 20 20  K_NOTABLE ){.   
a500: 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
a510: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 70  E_ERROR;.      p
a520: 2d 3e 7a 45 72 72 6d 73 67 20 3d 20 73 71 6c 69  ->zErrmsg = sqli
a530: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 6e 6f 20  te3_mprintf("no 
a540: 73 75 63 68 20 74 61 62 6c 65 3a 20 25 73 22 2c  such table: %s",
a550: 20 70 49 74 65 72 2d 3e 7a 54 62 6c 29 3b 0a 20   pIter->zTbl);. 
a560: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e     }.    if( p->
a570: 72 63 20 29 20 72 65 74 75 72 6e 20 70 2d 3e 72  rc ) return p->r
a580: 63 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72  c;.    if( pIter
a590: 2d 3e 7a 49 64 78 3d 3d 30 20 29 20 70 49 74 65  ->zIdx==0 ) pIte
a5a0: 72 2d 3e 69 54 6e 75 6d 20 3d 20 69 54 6e 75 6d  r->iTnum = iTnum
a5b0: 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ;..    assert( p
a5c0: 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55  Iter->eType==RBU
a5d0: 5f 50 4b 5f 4e 4f 4e 45 20 7c 7c 20 70 49 74 65  _PK_NONE || pIte
a5e0: 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b  r->eType==RBU_PK
a5f0: 5f 49 50 4b 20 0a 20 20 20 20 20 20 20 20 20 7c  _IPK .         |
a600: 7c 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d  | pIter->eType==
a610: 52 42 55 5f 50 4b 5f 45 58 54 45 52 4e 41 4c 20  RBU_PK_EXTERNAL 
a620: 7c 7c 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d  || pIter->eType=
a630: 3d 52 42 55 5f 50 4b 5f 57 49 54 48 4f 55 54 5f  =RBU_PK_WITHOUT_
a640: 52 4f 57 49 44 0a 20 20 20 20 20 20 20 20 20 7c  ROWID.         |
a650: 7c 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d  | pIter->eType==
a660: 52 42 55 5f 50 4b 5f 56 54 41 42 0a 20 20 20 20  RBU_PK_VTAB.    
a670: 29 3b 0a 0a 20 20 20 20 2f 2a 20 50 6f 70 75 6c  );..    /* Popul
a680: 61 74 65 20 74 68 65 20 61 7a 54 62 6c 43 6f 6c  ate the azTblCol
a690: 5b 5d 20 61 6e 64 20 6e 54 62 6c 43 6f 6c 20 76  [] and nTblCol v
a6a0: 61 72 69 61 62 6c 65 73 20 62 61 73 65 64 20 6f  ariables based o
a6b0: 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 73 0a 20 20  n the columns.  
a6c0: 20 20 2a 2a 20 6f 66 20 74 68 65 20 69 6e 70 75    ** of the inpu
a6d0: 74 20 74 61 62 6c 65 2e 20 49 67 6e 6f 72 65 20  t table. Ignore 
a6e0: 61 6e 79 20 69 6e 70 75 74 20 74 61 62 6c 65 20  any input table 
a6f0: 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 62 65 67  columns that beg
a700: 69 6e 20 77 69 74 68 0a 20 20 20 20 2a 2a 20 22  in with.    ** "
a710: 72 62 75 5f 22 2e 20 20 2a 2f 0a 20 20 20 20 70  rbu_".  */.    p
a720: 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65 46 72  ->rc = prepareFr
a730: 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f  eeAndCollectErro
a740: 72 28 70 2d 3e 64 62 52 62 75 2c 20 26 70 53 74  r(p->dbRbu, &pSt
a750: 6d 74 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c  mt, &p->zErrmsg,
a760: 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65   .        sqlite
a770: 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43  3_mprintf("SELEC
a780: 54 20 2a 20 46 52 4f 4d 20 27 25 71 27 22 2c 20  T * FROM '%q'", 
a790: 70 49 74 65 72 2d 3e 7a 44 61 74 61 54 62 6c 29  pIter->zDataTbl)
a7a0: 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
a7b0: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
a7c0: 20 29 7b 0a 20 20 20 20 20 20 6e 43 6f 6c 20 3d   ){.      nCol =
a7d0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
a7e0: 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20  count(pStmt);.  
a7f0: 20 20 20 20 72 62 75 41 6c 6c 6f 63 61 74 65 49      rbuAllocateI
a800: 74 65 72 41 72 72 61 79 73 28 70 2c 20 70 49 74  terArrays(p, pIt
a810: 65 72 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 7d  er, nCol);.    }
a820: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 70 2d  .    for(i=0; p-
a830: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
a840: 26 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  & i<nCol; i++){.
a850: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
a860: 20 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74   *zName = (const
a870: 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63   char*)sqlite3_c
a880: 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53 74 6d 74  olumn_name(pStmt
a890: 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , i);.      if( 
a8a0: 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70  sqlite3_strnicmp
a8b0: 28 22 72 62 75 5f 22 2c 20 7a 4e 61 6d 65 2c 20  ("rbu_", zName, 
a8c0: 34 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  4) ){.        ch
a8d0: 61 72 20 2a 7a 43 6f 70 79 20 3d 20 72 62 75 53  ar *zCopy = rbuS
a8e0: 74 72 6e 64 75 70 28 7a 4e 61 6d 65 2c 20 26 70  trndup(zName, &p
a8f0: 2d 3e 72 63 29 3b 0a 20 20 20 20 20 20 20 20 70  ->rc);.        p
a900: 49 74 65 72 2d 3e 61 69 53 72 63 4f 72 64 65 72  Iter->aiSrcOrder
a910: 5b 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 5d  [pIter->nTblCol]
a920: 20 3d 20 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f   = pIter->nTblCo
a930: 6c 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65 72  l;.        pIter
a940: 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 70 49 74 65 72  ->azTblCol[pIter
a950: 2d 3e 6e 54 62 6c 43 6f 6c 2b 2b 5d 20 3d 20 7a  ->nTblCol++] = z
a960: 43 6f 70 79 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Copy;.      }.  
a970: 20 20 20 20 65 6c 73 65 20 69 66 28 20 30 3d 3d      else if( 0==
a980: 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
a990: 22 72 62 75 5f 72 6f 77 69 64 22 2c 20 7a 4e 61  "rbu_rowid", zNa
a9a0: 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62  me) ){.        b
a9b0: 52 62 75 52 6f 77 69 64 20 3d 20 31 3b 0a 20 20  RbuRowid = 1;.  
a9c0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
a9d0: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
a9e0: 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 70 53 74  (pStmt);.    pSt
a9f0: 6d 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28  mt = 0;..    if(
aa00: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
aa10: 4b 0a 20 20 20 20 20 26 26 20 72 62 75 49 73 56  K.     && rbuIsV
aa20: 61 63 75 75 6d 28 70 29 3d 3d 30 0a 20 20 20 20  acuum(p)==0.    
aa30: 20 26 26 20 62 52 62 75 52 6f 77 69 64 21 3d 28   && bRbuRowid!=(
aa40: 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42  pIter->eType==RB
aa50: 55 5f 50 4b 5f 56 54 41 42 20 7c 7c 20 70 49 74  U_PK_VTAB || pIt
aa60: 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50  er->eType==RBU_P
aa70: 4b 5f 4e 4f 4e 45 29 0a 20 20 20 20 29 7b 0a 20  K_NONE).    ){. 
aa80: 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c       p->rc = SQL
aa90: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
aaa0: 20 70 2d 3e 7a 45 72 72 6d 73 67 20 3d 20 73 71   p->zErrmsg = sq
aab0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20  lite3_mprintf(. 
aac0: 20 20 20 20 20 20 20 20 20 22 74 61 62 6c 65 20           "table 
aad0: 25 71 20 25 73 20 72 62 75 5f 72 6f 77 69 64 20  %q %s rbu_rowid 
aae0: 63 6f 6c 75 6d 6e 22 2c 20 70 49 74 65 72 2d 3e  column", pIter->
aaf0: 7a 44 61 74 61 54 62 6c 2c 0a 20 20 20 20 20 20  zDataTbl,.      
ab00: 20 20 20 20 28 62 52 62 75 52 6f 77 69 64 20 3f      (bRbuRowid ?
ab10: 20 22 6d 61 79 20 6e 6f 74 20 68 61 76 65 22 20   "may not have" 
ab20: 3a 20 22 72 65 71 75 69 72 65 73 22 29 0a 20 20  : "requires").  
ab30: 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20      );.    }..  
ab40: 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
ab50: 61 6c 6c 20 6e 6f 6e 2d 48 49 44 44 45 4e 20 63  all non-HIDDEN c
ab60: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 64 65  olumns in the de
ab70: 73 74 69 6e 61 74 69 6f 6e 20 74 61 62 6c 65 20  stination table 
ab80: 61 72 65 20 61 6c 73 6f 0a 20 20 20 20 2a 2a 20  are also.    ** 
ab90: 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 69  present in the i
aba0: 6e 70 75 74 20 74 61 62 6c 65 2e 20 50 6f 70 75  nput table. Popu
abb0: 6c 61 74 65 20 74 68 65 20 61 62 54 62 6c 50 6b  late the abTblPk
abc0: 5b 5d 2c 20 61 7a 54 62 6c 54 79 70 65 5b 5d 20  [], azTblType[] 
abd0: 61 6e 64 0a 20 20 20 20 2a 2a 20 61 69 54 62 6c  and.    ** aiTbl
abe0: 4f 72 64 65 72 5b 5d 20 61 72 72 61 79 73 20 61  Order[] arrays a
abf0: 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e  t the same time.
ac00: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e    */.    if( p->
ac10: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
ac20: 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 70  .      p->rc = p
ac30: 72 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f 6c  repareFreeAndCol
ac40: 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 4d  lectError(p->dbM
ac50: 61 69 6e 2c 20 26 70 53 74 6d 74 2c 20 26 70 2d  ain, &pStmt, &p-
ac60: 3e 7a 45 72 72 6d 73 67 2c 20 0a 20 20 20 20 20  >zErrmsg, .     
ac70: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72       sqlite3_mpr
ac80: 69 6e 74 66 28 22 50 52 41 47 4d 41 20 74 61 62  intf("PRAGMA tab
ac90: 6c 65 5f 69 6e 66 6f 28 25 51 29 22 2c 20 70 49  le_info(%Q)", pI
aca0: 74 65 72 2d 3e 7a 54 62 6c 29 0a 20 20 20 20 20  ter->zTbl).     
acb0: 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68   );.    }.    wh
acc0: 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ile( p->rc==SQLI
acd0: 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f  TE_OK && SQLITE_
ace0: 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW==sqlite3_ste
acf0: 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20  p(pStmt) ){.    
ad00: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
ad10: 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ame = (const cha
ad20: 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
ad30: 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31 29  n_text(pStmt, 1)
ad40: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d  ;.      if( zNam
ad50: 65 3d 3d 30 20 29 20 62 72 65 61 6b 3b 20 20 2f  e==0 ) break;  /
ad60: 2a 20 41 6e 20 4f 4f 4d 20 2d 20 66 69 6e 61 6c  * An OOM - final
ad70: 69 7a 65 28 29 20 62 65 6c 6f 77 20 72 65 74 75  ize() below retu
ad80: 72 6e 73 20 53 5f 4e 4f 4d 45 4d 20 2a 2f 0a 20  rns S_NOMEM */. 
ad90: 20 20 20 20 20 66 6f 72 28 69 3d 69 4f 72 64 65       for(i=iOrde
ada0: 72 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 54 62 6c  r; i<pIter->nTbl
adb0: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
adc0: 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63 6d 70     if( 0==strcmp
add0: 28 7a 4e 61 6d 65 2c 20 70 49 74 65 72 2d 3e 61  (zName, pIter->a
ade0: 7a 54 62 6c 43 6f 6c 5b 69 5d 29 20 29 20 62 72  zTblCol[i]) ) br
adf0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
ae00: 20 20 20 69 66 28 20 69 3d 3d 70 49 74 65 72 2d     if( i==pIter-
ae10: 3e 6e 54 62 6c 43 6f 6c 20 29 7b 0a 20 20 20 20  >nTblCol ){.    
ae20: 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
ae30: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
ae40: 20 20 70 2d 3e 7a 45 72 72 6d 73 67 20 3d 20 73    p->zErrmsg = s
ae50: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
ae60: 63 6f 6c 75 6d 6e 20 6d 69 73 73 69 6e 67 20 66  column missing f
ae70: 72 6f 6d 20 25 71 3a 20 25 73 22 2c 0a 20 20 20  rom %q: %s",.   
ae80: 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e           pIter->
ae90: 7a 44 61 74 61 54 62 6c 2c 20 7a 4e 61 6d 65 0a  zDataTbl, zName.
aea0: 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
aeb0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
aec0: 69 6e 74 20 69 50 6b 20 3d 20 73 71 6c 69 74 65  int iPk = sqlite
aed0: 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74  3_column_int(pSt
aee0: 6d 74 2c 20 35 29 3b 0a 20 20 20 20 20 20 20 20  mt, 5);.        
aef0: 69 6e 74 20 62 4e 6f 74 4e 75 6c 6c 20 3d 20 73  int bNotNull = s
af00: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
af10: 74 28 70 53 74 6d 74 2c 20 33 29 3b 0a 20 20 20  t(pStmt, 3);.   
af20: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
af30: 2a 7a 54 79 70 65 20 3d 20 28 63 6f 6e 73 74 20  *zType = (const 
af40: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
af50: 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
af60: 20 32 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 66   2);..        if
af70: 28 20 69 21 3d 69 4f 72 64 65 72 20 29 7b 0a 20  ( i!=iOrder ){. 
af80: 20 20 20 20 20 20 20 20 20 53 57 41 50 28 69 6e           SWAP(in
af90: 74 2c 20 70 49 74 65 72 2d 3e 61 69 53 72 63 4f  t, pIter->aiSrcO
afa0: 72 64 65 72 5b 69 5d 2c 20 70 49 74 65 72 2d 3e  rder[i], pIter->
afb0: 61 69 53 72 63 4f 72 64 65 72 5b 69 4f 72 64 65  aiSrcOrder[iOrde
afc0: 72 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 53  r]);.          S
afd0: 57 41 50 28 63 68 61 72 2a 2c 20 70 49 74 65 72  WAP(char*, pIter
afe0: 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69 5d 2c 20 70  ->azTblCol[i], p
aff0: 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69  Iter->azTblCol[i
b000: 4f 72 64 65 72 5d 29 3b 0a 20 20 20 20 20 20 20  Order]);.       
b010: 20 7d 0a 0a 20 20 20 20 20 20 20 20 70 49 74 65   }..        pIte
b020: 72 2d 3e 61 7a 54 62 6c 54 79 70 65 5b 69 4f 72  r->azTblType[iOr
b030: 64 65 72 5d 20 3d 20 72 62 75 53 74 72 6e 64 75  der] = rbuStrndu
b040: 70 28 7a 54 79 70 65 2c 20 26 70 2d 3e 72 63 29  p(zType, &p->rc)
b050: 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d  ;.        pIter-
b060: 3e 61 62 54 62 6c 50 6b 5b 69 4f 72 64 65 72 5d  >abTblPk[iOrder]
b070: 20 3d 20 28 69 50 6b 21 3d 30 29 3b 0a 20 20 20   = (iPk!=0);.   
b080: 20 20 20 20 20 70 49 74 65 72 2d 3e 61 62 4e 6f       pIter->abNo
b090: 74 4e 75 6c 6c 5b 69 4f 72 64 65 72 5d 20 3d 20  tNull[iOrder] = 
b0a0: 28 75 38 29 62 4e 6f 74 4e 75 6c 6c 20 7c 7c 20  (u8)bNotNull || 
b0b0: 28 69 50 6b 21 3d 30 29 3b 0a 20 20 20 20 20 20  (iPk!=0);.      
b0c0: 20 20 69 4f 72 64 65 72 2b 2b 3b 0a 20 20 20 20    iOrder++;.    
b0d0: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72    }.    }..    r
b0e0: 62 75 46 69 6e 61 6c 69 7a 65 28 70 2c 20 70 53  buFinalize(p, pS
b0f0: 74 6d 74 29 3b 0a 20 20 20 20 72 62 75 4f 62 6a  tmt);.    rbuObj
b100: 49 74 65 72 43 61 63 68 65 49 6e 64 65 78 65 64  IterCacheIndexed
b110: 43 6f 6c 73 28 70 2c 20 70 49 74 65 72 29 3b 0a  Cols(p, pIter);.
b120: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
b130: 72 2d 3e 65 54 79 70 65 21 3d 52 42 55 5f 50 4b  r->eType!=RBU_PK
b140: 5f 56 54 41 42 20 7c 7c 20 70 49 74 65 72 2d 3e  _VTAB || pIter->
b150: 61 62 49 6e 64 65 78 65 64 3d 3d 30 20 29 3b 0a  abIndexed==0 );.
b160: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
b170: 72 2d 3e 65 54 79 70 65 21 3d 52 42 55 5f 50 4b  r->eType!=RBU_PK
b180: 5f 56 54 41 42 20 7c 7c 20 70 49 74 65 72 2d 3e  _VTAB || pIter->
b190: 6e 49 6e 64 65 78 3d 3d 30 20 29 3b 0a 20 20 7d  nIndex==0 );.  }
b1a0: 0a 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63  ..  return p->rc
b1b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
b1c0: 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 73 74 72 75  function constru
b1d0: 63 74 73 20 61 6e 64 20 72 65 74 75 72 6e 73 20  cts and returns 
b1e0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e  a pointer to a n
b1f0: 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 0a 2a  ul-terminated .*
b200: 2a 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e  * string contain
b210: 69 6e 67 20 73 6f 6d 65 20 53 51 4c 20 63 6c 61  ing some SQL cla
b220: 75 73 65 20 6f 72 20 6c 69 73 74 20 62 61 73 65  use or list base
b230: 64 20 6f 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  d on one or more
b240: 20 6f 66 20 74 68 65 20 0a 2a 2a 20 63 6f 6c 75   of the .** colu
b250: 6d 6e 20 6e 61 6d 65 73 20 63 75 72 72 65 6e 74  mn names current
b260: 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ly stored in the
b270: 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c   pIter->azTblCol
b280: 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61  [] array..*/.sta
b290: 74 69 63 20 63 68 61 72 20 2a 72 62 75 4f 62 6a  tic char *rbuObj
b2a0: 49 74 65 72 47 65 74 43 6f 6c 6c 69 73 74 28 0a  IterGetCollist(.
b2b0: 20 20 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c    sqlite3rbu *p,
b2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b2d0: 20 20 2f 2a 20 52 42 55 20 6f 62 6a 65 63 74 20    /* RBU object 
b2e0: 2a 2f 0a 20 20 52 62 75 4f 62 6a 49 74 65 72 20  */.  RbuObjIter 
b2f0: 2a 70 49 74 65 72 20 20 20 20 20 20 20 20 20 20  *pIter          
b300: 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 69       /* Object i
b310: 74 65 72 61 74 6f 72 20 66 6f 72 20 63 6f 6c 75  terator for colu
b320: 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 29 7b 0a 20  mn names */.){. 
b330: 20 63 68 61 72 20 2a 7a 4c 69 73 74 20 3d 20 30   char *zList = 0
b340: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
b350: 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20 69 6e 74  zSep = "";.  int
b360: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
b370: 3c 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 3b  <pIter->nTblCol;
b380: 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74   i++){.    const
b390: 20 63 68 61 72 20 2a 7a 20 3d 20 70 49 74 65 72   char *z = pIter
b3a0: 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69 5d 3b 0a 20  ->azTblCol[i];. 
b3b0: 20 20 20 7a 4c 69 73 74 20 3d 20 72 62 75 4d 50     zList = rbuMP
b3c0: 72 69 6e 74 66 28 70 2c 20 22 25 7a 25 73 5c 22  rintf(p, "%z%s\"
b3d0: 25 77 5c 22 22 2c 20 7a 4c 69 73 74 2c 20 7a 53  %w\"", zList, zS
b3e0: 65 70 2c 20 7a 29 3b 0a 20 20 20 20 7a 53 65 70  ep, z);.    zSep
b3f0: 20 3d 20 22 2c 20 22 3b 0a 20 20 7d 0a 20 20 72   = ", ";.  }.  r
b400: 65 74 75 72 6e 20 7a 4c 69 73 74 3b 0a 7d 0a 0a  eturn zList;.}..
b410: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
b420: 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 63  ion is used to c
b430: 72 65 61 74 65 20 61 20 53 45 4c 45 43 54 20 6c  reate a SELECT l
b440: 69 73 74 20 28 74 68 65 20 6c 69 73 74 20 6f 66  ist (the list of
b450: 20 53 51 4c 20 0a 2a 2a 20 65 78 70 72 65 73 73   SQL .** express
b460: 69 6f 6e 73 20 74 68 61 74 20 66 6f 6c 6c 6f 77  ions that follow
b470: 73 20 61 20 53 45 4c 45 43 54 20 6b 65 79 77 6f  s a SELECT keywo
b480: 72 64 29 20 66 6f 72 20 61 20 53 45 4c 45 43 54  rd) for a SELECT
b490: 20 73 74 61 74 65 6d 65 6e 74 20 0a 2a 2a 20 75   statement .** u
b4a0: 73 65 64 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  sed to read from
b4b0: 20 61 6e 20 64 61 74 61 5f 78 78 78 20 6f 72 20   an data_xxx or 
b4c0: 72 62 75 5f 74 6d 70 5f 78 78 78 20 74 61 62 6c  rbu_tmp_xxx tabl
b4d0: 65 20 77 68 69 6c 65 20 75 70 64 61 74 69 6e 67  e while updating
b4e0: 20 74 68 65 20 0a 2a 2a 20 69 6e 64 65 78 20 6f   the .** index o
b4f0: 62 6a 65 63 74 20 63 75 72 72 65 6e 74 6c 79 20  bject currently 
b500: 69 6e 64 69 63 61 74 65 64 20 62 79 20 74 68 65  indicated by the
b510: 20 69 74 65 72 61 74 6f 72 20 6f 62 6a 65 63 74   iterator object
b520: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 0a   passed as the .
b530: 2a 2a 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  ** second argume
b540: 6e 74 2e 20 41 20 22 50 52 41 47 4d 41 20 69 6e  nt. A "PRAGMA in
b550: 64 65 78 5f 78 69 6e 66 6f 20 3d 20 3c 69 64 78  dex_xinfo = <idx
b560: 6e 61 6d 65 3e 22 20 73 74 61 74 65 6d 65 6e 74  name>" statement
b570: 20 69 73 20 75 73 65 64 20 0a 2a 2a 20 74 6f 20   is used .** to 
b580: 6f 62 74 61 69 6e 20 74 68 65 20 72 65 71 75 69  obtain the requi
b590: 72 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  red information.
b5a0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e  .**.** If the in
b5b0: 64 65 78 20 69 73 20 6f 66 20 74 68 65 20 66 6f  dex is of the fo
b5c0: 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 3a 0a 2a 2a  llowing form:.**
b5d0: 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44  .**   CREATE IND
b5e0: 45 58 20 69 31 20 4f 4e 20 74 31 28 63 2c 20 62  EX i1 ON t1(c, b
b5f0: 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 29   COLLATE nocase)
b600: 3b 0a 2a 2a 0a 2a 2a 20 61 6e 64 20 22 74 31 22  ;.**.** and "t1"
b610: 20 69 73 20 61 20 74 61 62 6c 65 20 77 69 74 68   is a table with
b620: 20 61 6e 20 65 78 70 6c 69 63 69 74 20 49 4e 54   an explicit INT
b630: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
b640: 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 22 69 70 6b   column .** "ipk
b650: 22 2c 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  ", the returned 
b660: 73 74 72 69 6e 67 20 69 73 3a 0a 2a 2a 0a 2a 2a  string is:.**.**
b670: 20 20 20 22 60 63 60 20 43 4f 4c 4c 41 54 45 20     "`c` COLLATE 
b680: 27 42 49 4e 41 52 59 27 2c 20 60 62 60 20 43 4f  'BINARY', `b` CO
b690: 4c 4c 41 54 45 20 27 4e 4f 43 41 53 45 27 2c 20  LLATE 'NOCASE', 
b6a0: 60 69 70 6b 60 20 43 4f 4c 4c 41 54 45 20 27 42  `ipk` COLLATE 'B
b6b0: 49 4e 41 52 59 27 22 0a 2a 2a 0a 2a 2a 20 41 73  INARY'".**.** As
b6c0: 20 77 65 6c 6c 20 61 73 20 74 68 65 20 72 65 74   well as the ret
b6d0: 75 72 6e 65 64 20 73 74 72 69 6e 67 2c 20 74 68  urned string, th
b6e0: 72 65 65 20 6f 74 68 65 72 20 6d 61 6c 6c 6f 63  ree other malloc
b6f0: 27 64 20 73 74 72 69 6e 67 73 20 61 72 65 20 0a  'd strings are .
b700: 2a 2a 20 72 65 74 75 72 6e 65 64 20 76 69 61 20  ** returned via 
b710: 6f 75 74 70 75 74 20 70 61 72 61 6d 65 74 65 72  output parameter
b720: 73 2e 20 41 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  s. As follows:.*
b730: 2a 0a 2a 2a 20 20 20 70 7a 49 6d 70 6f 73 74 65  *.**   pzImposte
b740: 72 43 6f 6c 73 3a 20 2e 2e 2e 0a 2a 2a 20 20 20  rCols: ....**   
b750: 70 7a 49 6d 70 6f 73 74 65 72 50 6b 3a 20 2e 2e  pzImposterPk: ..
b760: 2e 0a 2a 2a 20 20 20 70 7a 57 68 65 72 65 3a 20  ..**   pzWhere: 
b770: 2e 2e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  ....*/.static ch
b780: 61 72 20 2a 72 62 75 4f 62 6a 49 74 65 72 47 65  ar *rbuObjIterGe
b790: 74 49 6e 64 65 78 43 6f 6c 73 28 0a 20 20 73 71  tIndexCols(.  sq
b7a0: 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 20 20 20  lite3rbu *p,    
b7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b7c0: 20 52 42 55 20 6f 62 6a 65 63 74 20 2a 2f 0a 20   RBU object */. 
b7d0: 20 52 62 75 4f 62 6a 49 74 65 72 20 2a 70 49 74   RbuObjIter *pIt
b7e0: 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
b7f0: 20 2f 2a 20 4f 62 6a 65 63 74 20 69 74 65 72 61   /* Object itera
b800: 74 6f 72 20 66 6f 72 20 63 6f 6c 75 6d 6e 20 6e  tor for column n
b810: 61 6d 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ames */.  char *
b820: 2a 70 7a 49 6d 70 6f 73 74 65 72 43 6f 6c 73 2c  *pzImposterCols,
b830: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
b840: 3a 20 43 6f 6c 75 6d 6e 73 20 66 6f 72 20 69 6d  : Columns for im
b850: 70 6f 73 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a  poster table */.
b860: 20 20 63 68 61 72 20 2a 2a 70 7a 49 6d 70 6f 73    char **pzImpos
b870: 74 65 72 50 6b 2c 20 20 20 20 20 20 20 20 20 20  terPk,          
b880: 20 20 2f 2a 20 4f 55 54 3a 20 49 6d 70 6f 73 74    /* OUT: Impost
b890: 65 72 20 50 4b 20 63 6c 61 75 73 65 20 2a 2f 0a  er PK clause */.
b8a0: 20 20 63 68 61 72 20 2a 2a 70 7a 57 68 65 72 65    char **pzWhere
b8b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
b8c0: 20 20 2f 2a 20 4f 55 54 3a 20 57 48 45 52 45 20    /* OUT: WHERE 
b8d0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
b8e0: 2a 70 6e 42 69 6e 64 20 20 20 20 20 20 20 20 20  *pnBind         
b8f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
b900: 55 54 3a 20 54 72 62 75 6c 20 6e 75 6d 62 65 72  UT: Trbul number
b910: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 29   of columns */.)
b920: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 2d 3e  {.  int rc = p->
b930: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
b940: 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64      /* Error cod
b950: 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 32 3b 20  e */.  int rc2; 
b960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b970: 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
b980: 33 5f 66 69 6e 61 6c 69 7a 65 28 29 20 72 65 74  3_finalize() ret
b990: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 63 68  urn code */.  ch
b9a0: 61 72 20 2a 7a 52 65 74 20 3d 20 30 3b 20 20 20  ar *zRet = 0;   
b9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b9c0: 20 53 74 72 69 6e 67 20 74 6f 20 72 65 74 75 72   String to retur
b9d0: 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 49 6d  n */.  char *zIm
b9e0: 70 43 6f 6c 73 20 3d 20 30 3b 20 20 20 20 20 20  pCols = 0;      
b9f0: 20 20 20 20 20 20 20 2f 2a 20 53 74 72 69 6e 67         /* String
ba00: 20 74 6f 20 72 65 74 75 72 6e 20 76 69 61 20 2a   to return via *
ba10: 70 7a 49 6d 70 6f 73 74 65 72 43 6f 6c 73 20 2a  pzImposterCols *
ba20: 2f 0a 20 20 63 68 61 72 20 2a 7a 49 6d 70 50 4b  /.  char *zImpPK
ba30: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
ba40: 20 20 20 20 2f 2a 20 53 74 72 69 6e 67 20 74 6f      /* String to
ba50: 20 72 65 74 75 72 6e 20 76 69 61 20 2a 70 7a 49   return via *pzI
ba60: 6d 70 6f 73 74 65 72 50 4b 20 2a 2f 0a 20 20 63  mposterPK */.  c
ba70: 68 61 72 20 2a 7a 57 68 65 72 65 20 3d 20 30 3b  har *zWhere = 0;
ba80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ba90: 2a 20 53 74 72 69 6e 67 20 74 6f 20 72 65 74 75  * String to retu
baa0: 72 6e 20 76 69 61 20 2a 70 7a 57 68 65 72 65 20  rn via *pzWhere 
bab0: 2a 2f 0a 20 20 69 6e 74 20 6e 42 69 6e 64 20 3d  */.  int nBind =
bac0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
bad0: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f       /* Value to
bae0: 20 72 65 74 75 72 6e 20 76 69 61 20 2a 70 6e 42   return via *pnB
baf0: 69 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ind */.  const c
bb00: 68 61 72 20 2a 7a 43 6f 6d 20 3d 20 22 22 3b 20  har *zCom = ""; 
bb10: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20           /* Set 
bb20: 74 6f 20 22 2c 20 22 20 6c 61 74 65 72 20 6f 6e  to ", " later on
bb30: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
bb40: 20 2a 7a 41 6e 64 20 3d 20 22 22 3b 20 20 20 20   *zAnd = "";    
bb50: 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20        /* Set to 
bb60: 22 20 41 4e 44 20 22 20 6c 61 74 65 72 20 6f 6e  " AND " later on
bb70: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
bb80: 6d 74 20 2a 70 58 49 6e 66 6f 20 3d 20 30 3b 20  mt *pXInfo = 0; 
bb90: 20 20 20 20 20 20 2f 2a 20 50 52 41 47 4d 41 20        /* PRAGMA 
bba0: 69 6e 64 65 78 5f 78 69 6e 66 6f 20 3d 20 3f 20  index_xinfo = ? 
bbb0: 2a 2f 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  */..  if( rc==SQ
bbc0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61  LITE_OK ){.    a
bbd0: 73 73 65 72 74 28 20 70 2d 3e 7a 45 72 72 6d 73  ssert( p->zErrms
bbe0: 67 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d  g==0 );.    rc =
bbf0: 20 70 72 65 70 61 72 65 46 72 65 65 41 6e 64 43   prepareFreeAndC
bc00: 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64  ollectError(p->d
bc10: 62 4d 61 69 6e 2c 20 26 70 58 49 6e 66 6f 2c 20  bMain, &pXInfo, 
bc20: 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 0a 20 20 20  &p->zErrmsg,.   
bc30: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72       sqlite3_mpr
bc40: 69 6e 74 66 28 22 50 52 41 47 4d 41 20 6d 61 69  intf("PRAGMA mai
bc50: 6e 2e 69 6e 64 65 78 5f 78 69 6e 66 6f 20 3d 20  n.index_xinfo = 
bc60: 25 51 22 2c 20 70 49 74 65 72 2d 3e 7a 49 64 78  %Q", pIter->zIdx
bc70: 29 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20  ).    );.  }..  
bc80: 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
bc90: 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52  E_OK && SQLITE_R
bca0: 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
bcb0: 28 70 58 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20  (pXInfo) ){.    
bcc0: 69 6e 74 20 69 43 69 64 20 3d 20 73 71 6c 69 74  int iCid = sqlit
bcd0: 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 58  e3_column_int(pX
bce0: 49 6e 66 6f 2c 20 31 29 3b 0a 20 20 20 20 69 6e  Info, 1);.    in
bcf0: 74 20 62 44 65 73 63 20 3d 20 73 71 6c 69 74 65  t bDesc = sqlite
bd00: 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 58 49  3_column_int(pXI
bd10: 6e 66 6f 2c 20 33 29 3b 0a 20 20 20 20 63 6f 6e  nfo, 3);.    con
bd20: 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 61 74  st char *zCollat
bd30: 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  e = (const char*
bd40: 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
bd50: 74 65 78 74 28 70 58 49 6e 66 6f 2c 20 34 29 3b  text(pXInfo, 4);
bd60: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
bd70: 2a 7a 43 6f 6c 3b 0a 20 20 20 20 63 6f 6e 73 74  *zCol;.    const
bd80: 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 0a 20   char *zType;.. 
bd90: 20 20 20 69 66 28 20 69 43 69 64 3c 30 20 29 7b     if( iCid<0 ){
bda0: 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 74  .      /* An int
bdb0: 65 67 65 72 20 70 72 69 6d 61 72 79 20 6b 65 79  eger primary key
bdc0: 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 68  . If the table h
bdd0: 61 73 20 61 6e 20 65 78 70 6c 69 63 69 74 20 49  as an explicit I
bde0: 50 4b 2c 20 75 73 65 0a 20 20 20 20 20 20 2a 2a  PK, use.      **
bdf0: 20 69 74 73 20 6e 61 6d 65 2e 20 4f 74 68 65 72   its name. Other
be00: 77 69 73 65 2c 20 75 73 65 20 22 72 62 75 5f 72  wise, use "rbu_r
be10: 6f 77 69 64 22 2e 20 20 2a 2f 0a 20 20 20 20 20  owid".  */.     
be20: 20 69 66 28 20 70 49 74 65 72 2d 3e 65 54 79 70   if( pIter->eTyp
be30: 65 3d 3d 52 42 55 5f 50 4b 5f 49 50 4b 20 29 7b  e==RBU_PK_IPK ){
be40: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  .        int i;.
be50: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
be60: 20 70 49 74 65 72 2d 3e 61 62 54 62 6c 50 6b 5b   pIter->abTblPk[
be70: 69 5d 3d 3d 30 3b 20 69 2b 2b 29 3b 0a 20 20 20  i]==0; i++);.   
be80: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 70       assert( i<p
be90: 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 20 29 3b  Iter->nTblCol );
bea0: 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20  .        zCol = 
beb0: 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b  pIter->azTblCol[
bec0: 69 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  i];.      }else 
bed0: 69 66 28 20 72 62 75 49 73 56 61 63 75 75 6d 28  if( rbuIsVacuum(
bee0: 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 43  p) ){.        zC
bef0: 6f 6c 20 3d 20 22 5f 72 6f 77 69 64 5f 22 3b 0a  ol = "_rowid_";.
bf00: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
bf10: 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22 72 62 75       zCol = "rbu
bf20: 5f 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 7d  _rowid";.      }
bf30: 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22  .      zType = "
bf40: 49 4e 54 45 47 45 52 22 3b 0a 20 20 20 20 7d 65  INTEGER";.    }e
bf50: 6c 73 65 7b 0a 20 20 20 20 20 20 7a 43 6f 6c 20  lse{.      zCol 
bf60: 3d 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f  = pIter->azTblCo
bf70: 6c 5b 69 43 69 64 5d 3b 0a 20 20 20 20 20 20 7a  l[iCid];.      z
bf80: 54 79 70 65 20 3d 20 70 49 74 65 72 2d 3e 61 7a  Type = pIter->az
bf90: 54 62 6c 54 79 70 65 5b 69 43 69 64 5d 3b 0a 20  TblType[iCid];. 
bfa0: 20 20 20 7d 0a 0a 20 20 20 20 7a 52 65 74 20 3d     }..    zRet =
bfb0: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
bfc0: 28 22 25 7a 25 73 5c 22 25 77 5c 22 20 43 4f 4c  ("%z%s\"%w\" COL
bfd0: 4c 41 54 45 20 25 51 22 2c 20 7a 52 65 74 2c 20  LATE %Q", zRet, 
bfe0: 7a 43 6f 6d 2c 20 7a 43 6f 6c 2c 20 7a 43 6f 6c  zCom, zCol, zCol
bff0: 6c 61 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70  late);.    if( p
c000: 49 74 65 72 2d 3e 62 55 6e 69 71 75 65 3d 3d 30  Iter->bUnique==0
c010: 20 7c 7c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75   || sqlite3_colu
c020: 6d 6e 5f 69 6e 74 28 70 58 49 6e 66 6f 2c 20 35  mn_int(pXInfo, 5
c030: 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  ) ){.      const
c040: 20 63 68 61 72 20 2a 7a 4f 72 64 65 72 20 3d 20   char *zOrder = 
c050: 28 62 44 65 73 63 20 3f 20 22 20 44 45 53 43 22  (bDesc ? " DESC"
c060: 20 3a 20 22 22 29 3b 0a 20 20 20 20 20 20 7a 49   : "");.      zI
c070: 6d 70 50 4b 20 3d 20 73 71 6c 69 74 65 33 5f 6d  mpPK = sqlite3_m
c080: 70 72 69 6e 74 66 28 22 25 7a 25 73 5c 22 72 62  printf("%z%s\"rb
c090: 75 5f 69 6d 70 5f 25 64 25 77 5c 22 25 73 22 2c  u_imp_%d%w\"%s",
c0a0: 20 0a 20 20 20 20 20 20 20 20 20 20 7a 49 6d 70   .          zImp
c0b0: 50 4b 2c 20 7a 43 6f 6d 2c 20 6e 42 69 6e 64 2c  PK, zCom, nBind,
c0c0: 20 7a 43 6f 6c 2c 20 7a 4f 72 64 65 72 0a 20 20   zCol, zOrder.  
c0d0: 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20      );.    }.   
c0e0: 20 7a 49 6d 70 43 6f 6c 73 20 3d 20 73 71 6c 69   zImpCols = sqli
c0f0: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a 25  te3_mprintf("%z%
c100: 73 5c 22 72 62 75 5f 69 6d 70 5f 25 64 25 77 5c  s\"rbu_imp_%d%w\
c110: 22 20 25 73 20 43 4f 4c 4c 41 54 45 20 25 51 22  " %s COLLATE %Q"
c120: 2c 20 0a 20 20 20 20 20 20 20 20 7a 49 6d 70 43  , .        zImpC
c130: 6f 6c 73 2c 20 7a 43 6f 6d 2c 20 6e 42 69 6e 64  ols, zCom, nBind
c140: 2c 20 7a 43 6f 6c 2c 20 7a 54 79 70 65 2c 20 7a  , zCol, zType, z
c150: 43 6f 6c 6c 61 74 65 0a 20 20 20 20 29 3b 0a 20  Collate.    );. 
c160: 20 20 20 7a 57 68 65 72 65 20 3d 20 73 71 6c 69     zWhere = sqli
c170: 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20  te3_mprintf(.   
c180: 20 20 20 20 20 22 25 7a 25 73 5c 22 72 62 75 5f       "%z%s\"rbu_
c190: 69 6d 70 5f 25 64 25 77 5c 22 20 49 53 20 3f 22  imp_%d%w\" IS ?"
c1a0: 2c 20 7a 57 68 65 72 65 2c 20 7a 41 6e 64 2c 20  , zWhere, zAnd, 
c1b0: 6e 42 69 6e 64 2c 20 7a 43 6f 6c 0a 20 20 20 20  nBind, zCol.    
c1c0: 29 3b 0a 20 20 20 20 69 66 28 20 7a 52 65 74 3d  );.    if( zRet=
c1d0: 3d 30 20 7c 7c 20 7a 49 6d 70 50 4b 3d 3d 30 20  =0 || zImpPK==0 
c1e0: 7c 7c 20 7a 49 6d 70 43 6f 6c 73 3d 3d 30 20 7c  || zImpCols==0 |
c1f0: 7c 20 7a 57 68 65 72 65 3d 3d 30 20 29 20 72 63  | zWhere==0 ) rc
c200: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
c210: 0a 20 20 20 20 7a 43 6f 6d 20 3d 20 22 2c 20 22  .    zCom = ", "
c220: 3b 0a 20 20 20 20 7a 41 6e 64 20 3d 20 22 20 41  ;.    zAnd = " A
c230: 4e 44 20 22 3b 0a 20 20 20 20 6e 42 69 6e 64 2b  ND ";.    nBind+
c240: 2b 3b 0a 20 20 7d 0a 0a 20 20 72 63 32 20 3d 20  +;.  }..  rc2 = 
c250: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
c260: 28 70 58 49 6e 66 6f 29 3b 0a 20 20 69 66 28 20  (pXInfo);.  if( 
c270: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
c280: 72 63 20 3d 20 72 63 32 3b 0a 0a 20 20 69 66 28  rc = rc2;..  if(
c290: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
c2a0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
c2b0: 65 65 28 7a 52 65 74 29 3b 0a 20 20 20 20 73 71  ee(zRet);.    sq
c2c0: 6c 69 74 65 33 5f 66 72 65 65 28 7a 49 6d 70 43  lite3_free(zImpC
c2d0: 6f 6c 73 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ols);.    sqlite
c2e0: 33 5f 66 72 65 65 28 7a 49 6d 70 50 4b 29 3b 0a  3_free(zImpPK);.
c2f0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
c300: 28 7a 57 68 65 72 65 29 3b 0a 20 20 20 20 7a 52  (zWhere);.    zR
c310: 65 74 20 3d 20 30 3b 0a 20 20 20 20 7a 49 6d 70  et = 0;.    zImp
c320: 43 6f 6c 73 20 3d 20 30 3b 0a 20 20 20 20 7a 49  Cols = 0;.    zI
c330: 6d 70 50 4b 20 3d 20 30 3b 0a 20 20 20 20 7a 57  mpPK = 0;.    zW
c340: 68 65 72 65 20 3d 20 30 3b 0a 20 20 20 20 70 2d  here = 0;.    p-
c350: 3e 72 63 20 3d 20 72 63 3b 0a 20 20 7d 0a 0a 20  >rc = rc;.  }.. 
c360: 20 2a 70 7a 49 6d 70 6f 73 74 65 72 43 6f 6c 73   *pzImposterCols
c370: 20 3d 20 7a 49 6d 70 43 6f 6c 73 3b 0a 20 20 2a   = zImpCols;.  *
c380: 70 7a 49 6d 70 6f 73 74 65 72 50 6b 20 3d 20 7a  pzImposterPk = z
c390: 49 6d 70 50 4b 3b 0a 20 20 2a 70 7a 57 68 65 72  ImpPK;.  *pzWher
c3a0: 65 20 3d 20 7a 57 68 65 72 65 3b 0a 20 20 2a 70  e = zWhere;.  *p
c3b0: 6e 42 69 6e 64 20 3d 20 6e 42 69 6e 64 3b 0a 20  nBind = nBind;. 
c3c0: 20 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a   return zRet;.}.
c3d0: 0a 2f 2a 0a 2a 2a 20 41 73 73 75 6d 69 6e 67 20  ./*.** Assuming 
c3e0: 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c  the current tabl
c3f0: 65 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 22 61  e columns are "a
c400: 22 2c 20 22 62 22 20 61 6e 64 20 22 63 22 2c 20  ", "b" and "c", 
c410: 61 6e 64 20 74 68 65 20 7a 4f 62 6a 0a 2a 2a 20  and the zObj.** 
c420: 70 61 72 61 6d 74 65 72 20 69 73 20 70 61 73 73  paramter is pass
c430: 65 64 20 22 6f 6c 64 22 2c 20 72 65 74 75 72 6e  ed "old", return
c440: 20 61 20 73 74 72 69 6e 67 20 6f 66 20 74 68 65   a string of the
c450: 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   form:.**.**    
c460: 20 22 6f 6c 64 2e 61 2c 20 6f 6c 64 2e 62 2c 20   "old.a, old.b, 
c470: 6f 6c 64 2e 62 22 0a 2a 2a 0a 2a 2a 20 57 69 74  old.b".**.** Wit
c480: 68 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  h the column nam
c490: 65 73 20 65 73 63 61 70 65 64 2e 0a 2a 2a 0a 2a  es escaped..**.*
c4a0: 2a 20 46 6f 72 20 74 61 62 6c 65 73 20 77 69 74  * For tables wit
c4b0: 68 20 69 6d 70 6c 69 63 69 74 20 72 6f 77 69 64  h implicit rowid
c4c0: 73 20 2d 20 52 42 55 5f 50 4b 5f 45 58 54 45 52  s - RBU_PK_EXTER
c4d0: 4e 41 4c 20 61 6e 64 20 52 42 55 5f 50 4b 5f 4e  NAL and RBU_PK_N
c4e0: 4f 4e 45 2c 20 61 70 70 65 6e 64 0a 2a 2a 20 74  ONE, append.** t
c4f0: 68 65 20 74 65 78 74 20 22 2c 20 6f 6c 64 2e 5f  he text ", old._
c500: 72 6f 77 69 64 5f 22 20 74 6f 20 74 68 65 20 72  rowid_" to the r
c510: 65 74 75 72 6e 65 64 20 76 61 6c 75 65 2e 0a 2a  eturned value..*
c520: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 72  /.static char *r
c530: 62 75 4f 62 6a 49 74 65 72 47 65 74 4f 6c 64 6c  buObjIterGetOldl
c540: 69 73 74 28 0a 20 20 73 71 6c 69 74 65 33 72 62  ist(.  sqlite3rb
c550: 75 20 2a 70 2c 20 0a 20 20 52 62 75 4f 62 6a 49  u *p, .  RbuObjI
c560: 74 65 72 20 2a 70 49 74 65 72 2c 0a 20 20 63 6f  ter *pIter,.  co
c570: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 62 6a 0a 29  nst char *zObj.)
c580: 7b 0a 20 20 63 68 61 72 20 2a 7a 4c 69 73 74 20  {.  char *zList 
c590: 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63  = 0;.  if( p->rc
c5a0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
c5b0: 49 74 65 72 2d 3e 61 62 49 6e 64 65 78 65 64 20  Iter->abIndexed 
c5c0: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
c5d0: 72 20 2a 7a 53 20 3d 20 22 22 3b 0a 20 20 20 20  r *zS = "";.    
c5e0: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
c5f0: 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 54 62  =0; i<pIter->nTb
c600: 6c 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lCol; i++){.    
c610: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 61 62 49    if( pIter->abI
c620: 6e 64 65 78 65 64 5b 69 5d 20 29 7b 0a 20 20 20  ndexed[i] ){.   
c630: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
c640: 2a 7a 43 6f 6c 20 3d 20 70 49 74 65 72 2d 3e 61  *zCol = pIter->a
c650: 7a 54 62 6c 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20  zTblCol[i];.    
c660: 20 20 20 20 7a 4c 69 73 74 20 3d 20 73 71 6c 69      zList = sqli
c670: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a 25  te3_mprintf("%z%
c680: 73 25 73 2e 5c 22 25 77 5c 22 22 2c 20 7a 4c 69  s%s.\"%w\"", zLi
c690: 73 74 2c 20 7a 53 2c 20 7a 4f 62 6a 2c 20 7a 43  st, zS, zObj, zC
c6a0: 6f 6c 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ol);.      }else
c6b0: 7b 0a 20 20 20 20 20 20 20 20 7a 4c 69 73 74 20  {.        zList 
c6c0: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
c6d0: 66 28 22 25 7a 25 73 4e 55 4c 4c 22 2c 20 7a 4c  f("%z%sNULL", zL
c6e0: 69 73 74 2c 20 7a 53 29 3b 0a 20 20 20 20 20 20  ist, zS);.      
c6f0: 7d 0a 20 20 20 20 20 20 7a 53 20 3d 20 22 2c 20  }.      zS = ", 
c700: 22 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 4c 69  ";.      if( zLi
c710: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  st==0 ){.       
c720: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
c730: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 62  NOMEM;.        b
c740: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
c750: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 6f 72 20    }..    /* For 
c760: 61 20 74 61 62 6c 65 20 77 69 74 68 20 69 6d 70  a table with imp
c770: 6c 69 63 69 74 20 72 6f 77 69 64 73 2c 20 61 70  licit rowids, ap
c780: 70 65 6e 64 20 22 6f 6c 64 2e 5f 72 6f 77 69 64  pend "old._rowid
c790: 5f 22 20 74 6f 20 74 68 65 20 6c 69 73 74 2e 20  _" to the list. 
c7a0: 2a 2f 0a 20 20 20 20 69 66 28 20 70 49 74 65 72  */.    if( pIter
c7b0: 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f  ->eType==RBU_PK_
c7c0: 45 58 54 45 52 4e 41 4c 20 7c 7c 20 70 49 74 65  EXTERNAL || pIte
c7d0: 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b  r->eType==RBU_PK
c7e0: 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 7a  _NONE ){.      z
c7f0: 4c 69 73 74 20 3d 20 72 62 75 4d 50 72 69 6e 74  List = rbuMPrint
c800: 66 28 70 2c 20 22 25 7a 2c 20 25 73 2e 5f 72 6f  f(p, "%z, %s._ro
c810: 77 69 64 5f 22 2c 20 7a 4c 69 73 74 2c 20 7a 4f  wid_", zList, zO
c820: 62 6a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  bj);.    }.  }. 
c830: 20 72 65 74 75 72 6e 20 7a 4c 69 73 74 3b 0a 7d   return zList;.}
c840: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
c850: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  n expression tha
c860: 74 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 6e  t can be used in
c870: 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20   a WHERE clause 
c880: 74 6f 20 6d 61 74 63 68 20 74 68 65 0a 2a 2a 20  to match the.** 
c890: 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 66 20 74  primary key of t
c8a0: 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65  he current table
c8b0: 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69  . For example, i
c8c0: 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 3a 0a  f the table is:.
c8d0: 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 54  **.**   CREATE T
c8e0: 41 42 4c 45 20 74 31 28 61 2c 20 62 2c 20 63 2c  ABLE t1(a, b, c,
c8f0: 20 50 52 49 4d 41 52 59 20 4b 45 59 28 62 2c 20   PRIMARY KEY(b, 
c900: 63 29 29 3b 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  c));.**.** Retur
c910: 6e 20 74 68 65 20 73 74 72 69 6e 67 3a 0a 2a 2a  n the string:.**
c920: 0a 2a 2a 20 20 20 22 62 20 3d 20 3f 31 20 41 4e  .**   "b = ?1 AN
c930: 44 20 63 20 3d 20 3f 32 22 0a 2a 2f 0a 73 74 61  D c = ?2".*/.sta
c940: 74 69 63 20 63 68 61 72 20 2a 72 62 75 4f 62 6a  tic char *rbuObj
c950: 49 74 65 72 47 65 74 57 68 65 72 65 28 0a 20 20  IterGetWhere(.  
c960: 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 0a  sqlite3rbu *p, .
c970: 20 20 52 62 75 4f 62 6a 49 74 65 72 20 2a 70 49    RbuObjIter *pI
c980: 74 65 72 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a  ter.){.  char *z
c990: 4c 69 73 74 20 3d 20 30 3b 0a 20 20 69 66 28 20  List = 0;.  if( 
c9a0: 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42  pIter->eType==RB
c9b0: 55 5f 50 4b 5f 56 54 41 42 20 7c 7c 20 70 49 74  U_PK_VTAB || pIt
c9c0: 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50  er->eType==RBU_P
c9d0: 4b 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 7a 4c  K_NONE ){.    zL
c9e0: 69 73 74 20 3d 20 72 62 75 4d 50 72 69 6e 74 66  ist = rbuMPrintf
c9f0: 28 70 2c 20 22 5f 72 6f 77 69 64 5f 20 3d 20 3f  (p, "_rowid_ = ?
ca00: 25 64 22 2c 20 70 49 74 65 72 2d 3e 6e 54 62 6c  %d", pIter->nTbl
ca10: 43 6f 6c 2b 31 29 3b 0a 20 20 7d 65 6c 73 65 20  Col+1);.  }else 
ca20: 69 66 28 20 70 49 74 65 72 2d 3e 65 54 79 70 65  if( pIter->eType
ca30: 3d 3d 52 42 55 5f 50 4b 5f 45 58 54 45 52 4e 41  ==RBU_PK_EXTERNA
ca40: 4c 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  L ){.    const c
ca50: 68 61 72 20 2a 7a 53 65 70 20 3d 20 22 22 3b 0a  har *zSep = "";.
ca60: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
ca70: 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d  or(i=0; i<pIter-
ca80: 3e 6e 54 62 6c 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  >nTblCol; i++){.
ca90: 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d        if( pIter-
caa0: 3e 61 62 54 62 6c 50 6b 5b 69 5d 20 29 7b 0a 20  >abTblPk[i] ){. 
cab0: 20 20 20 20 20 20 20 7a 4c 69 73 74 20 3d 20 72         zList = r
cac0: 62 75 4d 50 72 69 6e 74 66 28 70 2c 20 22 25 7a  buMPrintf(p, "%z
cad0: 25 73 63 25 64 3d 3f 25 64 22 2c 20 7a 4c 69 73  %sc%d=?%d", zLis
cae0: 74 2c 20 7a 53 65 70 2c 20 69 2c 20 69 2b 31 29  t, zSep, i, i+1)
caf0: 3b 0a 20 20 20 20 20 20 20 20 7a 53 65 70 20 3d  ;.        zSep =
cb00: 20 22 20 41 4e 44 20 22 3b 0a 20 20 20 20 20 20   " AND ";.      
cb10: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4c 69 73  }.    }.    zLis
cb20: 74 20 3d 20 72 62 75 4d 50 72 69 6e 74 66 28 70  t = rbuMPrintf(p
cb30: 2c 20 0a 20 20 20 20 20 20 20 20 22 5f 72 6f 77  , .        "_row
cb40: 69 64 5f 20 3d 20 28 53 45 4c 45 43 54 20 69 64  id_ = (SELECT id
cb50: 20 46 52 4f 4d 20 72 62 75 5f 69 6d 70 6f 73 74   FROM rbu_impost
cb60: 65 72 32 20 57 48 45 52 45 20 25 7a 29 22 2c 20  er2 WHERE %z)", 
cb70: 7a 4c 69 73 74 0a 20 20 20 20 29 3b 0a 0a 20 20  zList.    );..  
cb80: 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e 73 74  }else{.    const
cb90: 20 63 68 61 72 20 2a 7a 53 65 70 20 3d 20 22 22   char *zSep = ""
cba0: 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
cbb0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65   for(i=0; i<pIte
cbc0: 72 2d 3e 6e 54 62 6c 43 6f 6c 3b 20 69 2b 2b 29  r->nTblCol; i++)
cbd0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  {.      if( pIte
cbe0: 72 2d 3e 61 62 54 62 6c 50 6b 5b 69 5d 20 29 7b  r->abTblPk[i] ){
cbf0: 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
cc00: 68 61 72 20 2a 7a 43 6f 6c 20 3d 20 70 49 74 65  har *zCol = pIte
cc10: 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69 5d 3b 0a  r->azTblCol[i];.
cc20: 20 20 20 20 20 20 20 20 7a 4c 69 73 74 20 3d 20          zList = 
cc30: 72 62 75 4d 50 72 69 6e 74 66 28 70 2c 20 22 25  rbuMPrintf(p, "%
cc40: 7a 25 73 5c 22 25 77 5c 22 3d 3f 25 64 22 2c 20  z%s\"%w\"=?%d", 
cc50: 7a 4c 69 73 74 2c 20 7a 53 65 70 2c 20 7a 43 6f  zList, zSep, zCo
cc60: 6c 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 20  l, i+1);.       
cc70: 20 7a 53 65 70 20 3d 20 22 20 41 4e 44 20 22 3b   zSep = " AND ";
cc80: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
cc90: 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4c 69 73   }.  return zLis
cca0: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  t;.}../*.** The 
ccb0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
ccc0: 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75   iterating throu
ccd0: 67 68 20 74 68 65 20 6b 65 79 73 20 66 6f 72 20  gh the keys for 
cce0: 74 68 65 20 63 75 72 72 65 6e 74 20 6f 62 6a 65  the current obje
ccf0: 63 74 0a 2a 2a 20 28 70 2d 3e 6f 62 6a 69 74 65  ct.** (p->objite
cd00: 72 2e 70 53 65 6c 65 63 74 29 20 63 75 72 72 65  r.pSelect) curre
cd10: 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 61  ntly points to a
cd20: 20 76 61 6c 69 64 20 72 6f 77 2e 20 48 6f 77 65   valid row. Howe
cd30: 76 65 72 2c 20 74 68 65 72 65 0a 2a 2a 20 69 73  ver, there.** is
cd40: 20 73 6f 6d 65 74 68 69 6e 67 20 77 72 6f 6e 67   something wrong
cd50: 20 77 69 74 68 20 74 68 65 20 72 62 75 5f 63 6f   with the rbu_co
cd60: 6e 74 72 6f 6c 20 76 61 6c 75 65 20 69 6e 20 74  ntrol value in t
cd70: 68 65 20 72 62 75 5f 63 6f 6e 74 72 6f 6c 20 76  he rbu_control v
cd80: 61 6c 75 65 0a 2a 2a 20 73 74 6f 72 65 64 20 69  alue.** stored i
cd90: 6e 20 74 68 65 20 28 70 2d 3e 6e 43 6f 6c 2b 31  n the (p->nCol+1
cda0: 29 27 74 68 20 63 6f 6c 75 6d 6e 2e 20 53 65 74  )'th column. Set
cdb0: 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
cdc0: 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67  and error messag
cdd0: 65 0a 2a 2a 20 6f 66 20 74 68 65 20 52 42 55 20  e.** of the RBU 
cde0: 68 61 6e 64 6c 65 20 74 6f 20 73 6f 6d 65 74 68  handle to someth
cdf0: 69 6e 67 20 72 65 66 6c 65 63 74 69 6e 67 20 74  ing reflecting t
ce00: 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  his..*/.static v
ce10: 6f 69 64 20 72 62 75 42 61 64 43 6f 6e 74 72 6f  oid rbuBadContro
ce20: 6c 45 72 72 6f 72 28 73 71 6c 69 74 65 33 72 62  lError(sqlite3rb
ce30: 75 20 2a 70 29 7b 0a 20 20 70 2d 3e 72 63 20 3d  u *p){.  p->rc =
ce40: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
ce50: 20 70 2d 3e 7a 45 72 72 6d 73 67 20 3d 20 73 71   p->zErrmsg = sq
ce60: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 69  lite3_mprintf("i
ce70: 6e 76 61 6c 69 64 20 72 62 75 5f 63 6f 6e 74 72  nvalid rbu_contr
ce80: 6f 6c 20 76 61 6c 75 65 22 29 3b 0a 7d 0a 0a 0a  ol value");.}...
ce90: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 6e  /*.** Return a n
cea0: 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74  ul-terminated st
ceb0: 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ring containing 
cec0: 74 68 65 20 63 6f 6d 6d 61 20 73 65 70 61 72 61  the comma separa
ced0: 74 65 64 20 6c 69 73 74 20 6f 66 0a 2a 2a 20 61  ted list of.** a
cee0: 73 73 69 67 6e 6d 65 6e 74 73 20 74 68 61 74 20  ssignments that 
cef0: 73 68 6f 75 6c 64 20 62 65 20 69 6e 63 6c 75 64  should be includ
cf00: 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ed following the
cf10: 20 22 53 45 54 22 20 6b 65 79 77 6f 72 64 20 6f   "SET" keyword o
cf20: 66 0a 2a 2a 20 61 6e 20 55 50 44 41 54 45 20 73  f.** an UPDATE s
cf30: 74 61 74 65 6d 65 6e 74 20 75 73 65 64 20 74 6f  tatement used to
cf40: 20 75 70 64 61 74 65 20 74 68 65 20 74 61 62 6c   update the tabl
cf50: 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20 74 68  e object that th
cf60: 65 20 69 74 65 72 61 74 6f 72 0a 2a 2a 20 70 61  e iterator.** pa
cf70: 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
cf80: 6e 64 20 61 72 67 75 6d 65 6e 74 20 63 75 72 72  nd argument curr
cf90: 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20  ently points to 
cfa0: 69 66 20 74 68 65 20 72 62 75 5f 63 6f 6e 74 72  if the rbu_contr
cfb0: 6f 6c 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6f 66 20  ol.** column of 
cfc0: 74 68 65 20 64 61 74 61 5f 78 78 78 20 74 61 62  the data_xxx tab
cfd0: 6c 65 20 65 6e 74 72 79 20 69 73 20 73 65 74 20  le entry is set 
cfe0: 74 6f 20 7a 4d 61 73 6b 2e 0a 2a 2a 0a 2a 2a 20  to zMask..**.** 
cff0: 54 68 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74  The memory for t
d000: 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69  he returned stri
d010: 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  ng is obtained f
d020: 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
d030: 6f 63 28 29 2e 0a 2a 2a 20 49 74 20 69 73 20 74  oc()..** It is t
d040: 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  he responsibilit
d050: 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20  y of the caller 
d060: 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72  to eventually fr
d070: 65 65 20 69 74 20 75 73 69 6e 67 0a 2a 2a 20 73  ee it using.** s
d080: 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 20 0a  qlite3_free(). .
d090: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20  **.** If an OOM 
d0a0: 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74  error is encount
d0b0: 65 72 65 64 20 77 68 65 6e 20 61 6c 6c 6f 63 61  ered when alloca
d0c0: 74 69 6e 67 20 73 70 61 63 65 20 66 6f 72 20 74  ting space for t
d0d0: 68 65 20 6e 65 77 0a 2a 2a 20 73 74 72 69 6e 67  he new.** string
d0e0: 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  , an error code 
d0f0: 69 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20 72  is left in the r
d100: 62 75 20 68 61 6e 64 6c 65 20 70 61 73 73 65 64  bu handle passed
d110: 20 61 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a   as the first.**
d120: 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 4e 55   argument and NU
d130: 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  LL is returned. 
d140: 4f 72 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20  Or, if an error 
d150: 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75  has already occu
d160: 72 72 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 69  rred.** when thi
d170: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
d180: 6c 6c 65 64 2c 20 4e 55 4c 4c 20 69 73 20 72 65  lled, NULL is re
d190: 74 75 72 6e 65 64 20 69 6d 6d 65 64 69 61 74 65  turned immediate
d1a0: 6c 79 2c 20 77 69 74 68 6f 75 74 0a 2a 2a 20 61  ly, without.** a
d1b0: 74 74 65 6d 70 74 69 6e 67 20 74 68 65 20 61 6c  ttempting the al
d1c0: 6c 6f 63 61 74 69 6f 6e 20 6f 72 20 6d 6f 64 69  location or modi
d1d0: 66 79 69 6e 67 20 74 68 65 20 73 74 6f 72 65 64  fying the stored
d1e0: 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a   error code..*/.
d1f0: 73 74 61 74 69 63 20 63 68 61 72 20 2a 72 62 75  static char *rbu
d200: 4f 62 6a 49 74 65 72 47 65 74 53 65 74 6c 69 73  ObjIterGetSetlis
d210: 74 28 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20  t(.  sqlite3rbu 
d220: 2a 70 2c 0a 20 20 52 62 75 4f 62 6a 49 74 65 72  *p,.  RbuObjIter
d230: 20 2a 70 49 74 65 72 2c 0a 20 20 63 6f 6e 73 74   *pIter,.  const
d240: 20 63 68 61 72 20 2a 7a 4d 61 73 6b 0a 29 7b 0a   char *zMask.){.
d250: 20 20 63 68 61 72 20 2a 7a 4c 69 73 74 20 3d 20    char *zList = 
d260: 30 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  0;.  if( p->rc==
d270: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
d280: 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20 69 66 28   int i;..    if(
d290: 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 4d 61   (int)strlen(zMa
d2a0: 73 6b 29 21 3d 70 49 74 65 72 2d 3e 6e 54 62 6c  sk)!=pIter->nTbl
d2b0: 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 72 62 75  Col ){.      rbu
d2c0: 42 61 64 43 6f 6e 74 72 6f 6c 45 72 72 6f 72 28  BadControlError(
d2d0: 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  p);.    }else{. 
d2e0: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
d2f0: 2a 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20 20 20  *zSep = "";.    
d300: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74    for(i=0; i<pIt
d310: 65 72 2d 3e 6e 54 62 6c 43 6f 6c 3b 20 69 2b 2b  er->nTblCol; i++
d320: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
d330: 63 20 3d 20 7a 4d 61 73 6b 5b 70 49 74 65 72 2d  c = zMask[pIter-
d340: 3e 61 69 53 72 63 4f 72 64 65 72 5b 69 5d 5d 3b  >aiSrcOrder[i]];
d350: 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d  .        if( c==
d360: 27 78 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20  'x' ){.         
d370: 20 7a 4c 69 73 74 20 3d 20 72 62 75 4d 50 72 69   zList = rbuMPri
d380: 6e 74 66 28 70 2c 20 22 25 7a 25 73 5c 22 25 77  ntf(p, "%z%s\"%w
d390: 5c 22 3d 3f 25 64 22 2c 20 0a 20 20 20 20 20 20  \"=?%d", .      
d3a0: 20 20 20 20 20 20 20 20 7a 4c 69 73 74 2c 20 7a          zList, z
d3b0: 53 65 70 2c 20 70 49 74 65 72 2d 3e 61 7a 54 62  Sep, pIter->azTb
d3c0: 6c 43 6f 6c 5b 69 5d 2c 20 69 2b 31 0a 20 20 20  lCol[i], i+1.   
d3d0: 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
d3e0: 20 20 20 20 7a 53 65 70 20 3d 20 22 2c 20 22 3b      zSep = ", ";
d3f0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
d400: 20 20 20 65 6c 73 65 20 69 66 28 20 63 3d 3d 27     else if( c=='
d410: 64 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  d' ){.          
d420: 7a 4c 69 73 74 20 3d 20 72 62 75 4d 50 72 69 6e  zList = rbuMPrin
d430: 74 66 28 70 2c 20 22 25 7a 25 73 5c 22 25 77 5c  tf(p, "%z%s\"%w\
d440: 22 3d 72 62 75 5f 64 65 6c 74 61 28 5c 22 25 77  "=rbu_delta(\"%w
d450: 5c 22 2c 20 3f 25 64 29 22 2c 20 0a 20 20 20 20  \", ?%d)", .    
d460: 20 20 20 20 20 20 20 20 20 20 7a 4c 69 73 74 2c            zList,
d470: 20 7a 53 65 70 2c 20 70 49 74 65 72 2d 3e 61 7a   zSep, pIter->az
d480: 54 62 6c 43 6f 6c 5b 69 5d 2c 20 70 49 74 65 72  TblCol[i], pIter
d490: 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69 5d 2c 20 69  ->azTblCol[i], i
d4a0: 2b 31 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a  +1.          );.
d4b0: 20 20 20 20 20 20 20 20 20 20 7a 53 65 70 20 3d            zSep =
d4c0: 20 22 2c 20 22 3b 0a 20 20 20 20 20 20 20 20 7d   ", ";.        }
d4d0: 0a 20 20 20 20 20 20 20 20 65 6c 73 65 20 69 66  .        else if
d4e0: 28 20 63 3d 3d 27 66 27 20 29 7b 0a 20 20 20 20  ( c=='f' ){.    
d4f0: 20 20 20 20 20 20 7a 4c 69 73 74 20 3d 20 72 62        zList = rb
d500: 75 4d 50 72 69 6e 74 66 28 70 2c 20 22 25 7a 25  uMPrintf(p, "%z%
d510: 73 5c 22 25 77 5c 22 3d 72 62 75 5f 66 6f 73 73  s\"%w\"=rbu_foss
d520: 69 6c 5f 64 65 6c 74 61 28 5c 22 25 77 5c 22 2c  il_delta(\"%w\",
d530: 20 3f 25 64 29 22 2c 20 0a 20 20 20 20 20 20 20   ?%d)", .       
d540: 20 20 20 20 20 20 20 7a 4c 69 73 74 2c 20 7a 53         zList, zS
d550: 65 70 2c 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c  ep, pIter->azTbl
d560: 43 6f 6c 5b 69 5d 2c 20 70 49 74 65 72 2d 3e 61  Col[i], pIter->a
d570: 7a 54 62 6c 43 6f 6c 5b 69 5d 2c 20 69 2b 31 0a  zTblCol[i], i+1.
d580: 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20            );.   
d590: 20 20 20 20 20 20 20 7a 53 65 70 20 3d 20 22 2c         zSep = ",
d5a0: 20 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   ";.        }.  
d5b0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
d5c0: 20 20 72 65 74 75 72 6e 20 7a 4c 69 73 74 3b 0a    return zList;.
d5d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
d5e0: 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64  a nul-terminated
d5f0: 20 73 74 72 69 6e 67 20 63 6f 6e 73 69 73 74 69   string consisti
d600: 6e 67 20 6f 66 20 6e 42 79 74 65 20 63 6f 6d 6d  ng of nByte comm
d610: 61 20 73 65 70 61 72 61 74 65 64 0a 2a 2a 20 22  a separated.** "
d620: 3f 22 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 20  ?" expressions. 
d630: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20  For example, if 
d640: 6e 42 79 74 65 20 69 73 20 33 2c 20 72 65 74 75  nByte is 3, retu
d650: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 0a  rn a pointer to.
d660: 2a 2a 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74  ** a buffer cont
d670: 61 69 6e 69 6e 67 20 74 68 65 20 73 74 72 69 6e  aining the strin
d680: 67 20 22 3f 2c 3f 2c 3f 22 2e 0a 2a 2a 0a 2a 2a  g "?,?,?"..**.**
d690: 20 54 68 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20   The memory for 
d6a0: 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72  the returned str
d6b0: 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ing is obtained 
d6c0: 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  from sqlite3_mal
d6d0: 6c 6f 63 28 29 2e 0a 2a 2a 20 49 74 20 69 73 20  loc()..** It is 
d6e0: 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  the responsibili
d6f0: 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72  ty of the caller
d700: 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 66   to eventually f
d710: 72 65 65 20 69 74 20 75 73 69 6e 67 0a 2a 2a 20  ree it using.** 
d720: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 20  sqlite3_free(). 
d730: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d  .**.** If an OOM
d740: 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e   error is encoun
d750: 74 65 72 65 64 20 77 68 65 6e 20 61 6c 6c 6f 63  tered when alloc
d760: 61 74 69 6e 67 20 73 70 61 63 65 20 66 6f 72 20  ating space for 
d770: 74 68 65 20 6e 65 77 0a 2a 2a 20 73 74 72 69 6e  the new.** strin
d780: 67 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  g, an error code
d790: 20 69 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20   is left in the 
d7a0: 72 62 75 20 68 61 6e 64 6c 65 20 70 61 73 73 65  rbu handle passe
d7b0: 64 20 61 73 20 74 68 65 20 66 69 72 73 74 0a 2a  d as the first.*
d7c0: 2a 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 4e  * argument and N
d7d0: 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ULL is returned.
d7e0: 20 4f 72 2c 20 69 66 20 61 6e 20 65 72 72 6f 72   Or, if an error
d7f0: 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63   has already occ
d800: 75 72 72 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68  urred.** when th
d810: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
d820: 61 6c 6c 65 64 2c 20 4e 55 4c 4c 20 69 73 20 72  alled, NULL is r
d830: 65 74 75 72 6e 65 64 20 69 6d 6d 65 64 69 61 74  eturned immediat
d840: 65 6c 79 2c 20 77 69 74 68 6f 75 74 0a 2a 2a 20  ely, without.** 
d850: 61 74 74 65 6d 70 74 69 6e 67 20 74 68 65 20 61  attempting the a
d860: 6c 6c 6f 63 61 74 69 6f 6e 20 6f 72 20 6d 6f 64  llocation or mod
d870: 69 66 79 69 6e 67 20 74 68 65 20 73 74 6f 72 65  ifying the store
d880: 64 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f  d error code..*/
d890: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 72 62  .static char *rb
d8a0: 75 4f 62 6a 49 74 65 72 47 65 74 42 69 6e 64 6c  uObjIterGetBindl
d8b0: 69 73 74 28 73 71 6c 69 74 65 33 72 62 75 20 2a  ist(sqlite3rbu *
d8c0: 70 2c 20 69 6e 74 20 6e 42 69 6e 64 29 7b 0a 20  p, int nBind){. 
d8d0: 20 63 68 61 72 20 2a 7a 52 65 74 20 3d 20 30 3b   char *zRet = 0;
d8e0: 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 6e  .  int nByte = n
d8f0: 42 69 6e 64 2a 32 20 2b 20 31 3b 0a 0a 20 20 7a  Bind*2 + 1;..  z
d900: 52 65 74 20 3d 20 28 63 68 61 72 2a 29 72 62 75  Ret = (char*)rbu
d910: 4d 61 6c 6c 6f 63 28 70 2c 20 6e 42 79 74 65 29  Malloc(p, nByte)
d920: 3b 0a 20 20 69 66 28 20 7a 52 65 74 20 29 7b 0a  ;.  if( zRet ){.
d930: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
d940: 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 69 6e 64 3b  or(i=0; i<nBind;
d950: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 52 65   i++){.      zRe
d960: 74 5b 69 2a 32 5d 20 3d 20 27 3f 27 3b 0a 20 20  t[i*2] = '?';.  
d970: 20 20 20 20 7a 52 65 74 5b 69 2a 32 2b 31 5d 20      zRet[i*2+1] 
d980: 3d 20 28 69 2b 31 3d 3d 6e 42 69 6e 64 29 20 3f  = (i+1==nBind) ?
d990: 20 27 5c 30 27 20 3a 20 27 2c 27 3b 0a 20 20 20   '\0' : ',';.   
d9a0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
d9b0: 7a 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  zRet;.}../*.** T
d9c0: 68 65 20 69 74 65 72 61 74 6f 72 20 63 75 72 72  he iterator curr
d9d0: 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20  ently points to 
d9e0: 61 20 74 61 62 6c 65 20 28 6e 6f 74 20 69 6e 64  a table (not ind
d9f0: 65 78 29 20 6f 66 20 74 79 70 65 20 0a 2a 2a 20  ex) of type .** 
da00: 52 42 55 5f 50 4b 5f 57 49 54 48 4f 55 54 5f 52  RBU_PK_WITHOUT_R
da10: 4f 57 49 44 2e 20 54 68 69 73 20 66 75 6e 63 74  OWID. This funct
da20: 69 6f 6e 20 63 72 65 61 74 65 73 20 74 68 65 20  ion creates the 
da30: 50 52 49 4d 41 52 59 20 4b 45 59 20 0a 2a 2a 20  PRIMARY KEY .** 
da40: 64 65 63 6c 61 72 61 74 69 6f 6e 20 66 6f 72 20  declaration for 
da50: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
da60: 67 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65  g imposter table
da70: 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 0a 2a  . For example,.*
da80: 2a 20 69 66 20 74 68 65 20 69 74 65 72 61 74 6f  * if the iterato
da90: 72 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 74 61  r points to a ta
daa0: 62 6c 65 20 63 72 65 61 74 65 64 20 61 73 3a 0a  ble created as:.
dab0: 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 54  **.**   CREATE T
dac0: 41 42 4c 45 20 74 31 28 61 2c 20 62 2c 20 63 2c  ABLE t1(a, b, c,
dad0: 20 50 52 49 4d 41 52 59 20 4b 45 59 28 62 2c 20   PRIMARY KEY(b, 
dae0: 61 20 44 45 53 43 29 29 20 57 49 54 48 4f 55 54  a DESC)) WITHOUT
daf0: 20 52 4f 57 49 44 0a 2a 2a 0a 2a 2a 20 74 68 69   ROWID.**.** thi
db00: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
db10: 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 52 49 4d  ns:.**.**   PRIM
db20: 41 52 59 20 4b 45 59 28 22 62 22 2c 20 22 61 22  ARY KEY("b", "a"
db30: 20 44 45 53 43 29 0a 2a 2f 0a 73 74 61 74 69 63   DESC).*/.static
db40: 20 63 68 61 72 20 2a 72 62 75 57 69 74 68 6f 75   char *rbuWithou
db50: 74 52 6f 77 69 64 50 4b 28 73 71 6c 69 74 65 33  tRowidPK(sqlite3
db60: 72 62 75 20 2a 70 2c 20 52 62 75 4f 62 6a 49 74  rbu *p, RbuObjIt
db70: 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 63 68  er *pIter){.  ch
db80: 61 72 20 2a 7a 20 3d 20 30 3b 0a 20 20 61 73 73  ar *z = 0;.  ass
db90: 65 72 74 28 20 70 49 74 65 72 2d 3e 7a 49 64 78  ert( pIter->zIdx
dba0: 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  ==0 );.  if( p->
dbb0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
dbc0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
dbd0: 2a 7a 53 65 70 20 3d 20 22 50 52 49 4d 41 52 59  *zSep = "PRIMARY
dbe0: 20 4b 45 59 28 22 3b 0a 20 20 20 20 73 71 6c 69   KEY(";.    sqli
dbf0: 74 65 33 5f 73 74 6d 74 20 2a 70 58 4c 69 73 74  te3_stmt *pXList
dc00: 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 50 52 41   = 0;     /* PRA
dc10: 47 4d 41 20 69 6e 64 65 78 5f 6c 69 73 74 20 3d  GMA index_list =
dc20: 20 28 70 49 74 65 72 2d 3e 7a 54 62 6c 29 20 2a   (pIter->zTbl) *
dc30: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  /.    sqlite3_st
dc40: 6d 74 20 2a 70 58 49 6e 66 6f 20 3d 20 30 3b 20  mt *pXInfo = 0; 
dc50: 20 20 20 20 2f 2a 20 50 52 41 47 4d 41 20 69 6e      /* PRAGMA in
dc60: 64 65 78 5f 78 69 6e 66 6f 20 3d 20 3c 70 6b 2d  dex_xinfo = <pk-
dc70: 69 6e 64 65 78 3e 20 2a 2f 0a 20 20 20 0a 20 20  index> */.   .  
dc80: 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72    p->rc = prepar
dc90: 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45  eFreeAndCollectE
dca0: 72 72 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20  rror(p->dbMain, 
dcb0: 26 70 58 4c 69 73 74 2c 20 26 70 2d 3e 7a 45 72  &pXList, &p->zEr
dcc0: 72 6d 73 67 2c 0a 20 20 20 20 20 20 20 20 73 71  rmsg,.        sq
dcd0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 50  lite3_mprintf("P
dce0: 52 41 47 4d 41 20 6d 61 69 6e 2e 69 6e 64 65 78  RAGMA main.index
dcf0: 5f 6c 69 73 74 20 3d 20 25 51 22 2c 20 70 49 74  _list = %Q", pIt
dd00: 65 72 2d 3e 7a 54 62 6c 29 0a 20 20 20 20 29 3b  er->zTbl).    );
dd10: 0a 20 20 20 20 77 68 69 6c 65 28 20 70 2d 3e 72  .    while( p->r
dd20: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
dd30: 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69  SQLITE_ROW==sqli
dd40: 74 65 33 5f 73 74 65 70 28 70 58 4c 69 73 74 29  te3_step(pXList)
dd50: 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   ){.      const 
dd60: 63 68 61 72 20 2a 7a 4f 72 69 67 20 3d 20 28 63  char *zOrig = (c
dd70: 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
dd80: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
dd90: 58 4c 69 73 74 2c 33 29 3b 0a 20 20 20 20 20 20  XList,3);.      
dda0: 69 66 28 20 7a 4f 72 69 67 20 26 26 20 73 74 72  if( zOrig && str
ddb0: 63 6d 70 28 7a 4f 72 69 67 2c 20 22 70 6b 22 29  cmp(zOrig, "pk")
ddc0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ==0 ){.        c
ddd0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 78 20  onst char *zIdx 
dde0: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
ddf0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
de00: 78 74 28 70 58 4c 69 73 74 2c 31 29 3b 0a 20 20  xt(pXList,1);.  
de10: 20 20 20 20 20 20 69 66 28 20 7a 49 64 78 20 29        if( zIdx )
de20: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72  {.          p->r
de30: 63 20 3d 20 70 72 65 70 61 72 65 46 72 65 65 41  c = prepareFreeA
de40: 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70  ndCollectError(p
de50: 2d 3e 64 62 4d 61 69 6e 2c 20 26 70 58 49 6e 66  ->dbMain, &pXInf
de60: 6f 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 0a  o, &p->zErrmsg,.
de70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
de80: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 50  lite3_mprintf("P
de90: 52 41 47 4d 41 20 6d 61 69 6e 2e 69 6e 64 65 78  RAGMA main.index
dea0: 5f 78 69 6e 66 6f 20 3d 20 25 51 22 2c 20 7a 49  _xinfo = %Q", zI
deb0: 64 78 29 0a 20 20 20 20 20 20 20 20 20 20 29 3b  dx).          );
dec0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
ded0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
dee0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 62 75 46  }.    }.    rbuF
def0: 69 6e 61 6c 69 7a 65 28 70 2c 20 70 58 4c 69 73  inalize(p, pXLis
df00: 74 29 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20  t);..    while( 
df10: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
df20: 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d   && SQLITE_ROW==
df30: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 58 49  sqlite3_step(pXI
df40: 6e 66 6f 29 20 29 7b 0a 20 20 20 20 20 20 69 66  nfo) ){.      if
df50: 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  ( sqlite3_column
df60: 5f 69 6e 74 28 70 58 49 6e 66 6f 2c 20 35 29 20  _int(pXInfo, 5) 
df70: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 69 6e  ){.        /* in
df80: 74 20 69 43 69 64 20 3d 20 73 71 6c 69 74 65 33  t iCid = sqlite3
df90: 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 58 49 6e  _column_int(pXIn
dfa0: 66 6f 2c 20 30 29 3b 20 2a 2f 0a 20 20 20 20 20  fo, 0); */.     
dfb0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
dfc0: 43 6f 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  Col = (const cha
dfd0: 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
dfe0: 6e 5f 74 65 78 74 28 70 58 49 6e 66 6f 2c 20 32  n_text(pXInfo, 2
dff0: 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  );.        const
e000: 20 63 68 61 72 20 2a 7a 44 65 73 63 20 3d 20 73   char *zDesc = s
e010: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
e020: 74 28 70 58 49 6e 66 6f 2c 20 33 29 20 3f 20 22  t(pXInfo, 3) ? "
e030: 20 44 45 53 43 22 20 3a 20 22 22 3b 0a 20 20 20   DESC" : "";.   
e040: 20 20 20 20 20 7a 20 3d 20 72 62 75 4d 50 72 69       z = rbuMPri
e050: 6e 74 66 28 70 2c 20 22 25 7a 25 73 5c 22 25 77  ntf(p, "%z%s\"%w
e060: 5c 22 25 73 22 2c 20 7a 2c 20 7a 53 65 70 2c 20  \"%s", z, zSep, 
e070: 7a 43 6f 6c 2c 20 7a 44 65 73 63 29 3b 0a 20 20  zCol, zDesc);.  
e080: 20 20 20 20 20 20 7a 53 65 70 20 3d 20 22 2c 20        zSep = ", 
e090: 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ";.      }.    }
e0a0: 0a 20 20 20 20 7a 20 3d 20 72 62 75 4d 50 72 69  .    z = rbuMPri
e0b0: 6e 74 66 28 70 2c 20 22 25 7a 29 22 2c 20 7a 29  ntf(p, "%z)", z)
e0c0: 3b 0a 20 20 20 20 72 62 75 46 69 6e 61 6c 69 7a  ;.    rbuFinaliz
e0d0: 65 28 70 2c 20 70 58 49 6e 66 6f 29 3b 0a 20 20  e(p, pXInfo);.  
e0e0: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a  }.  return z;.}.
e0f0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
e100: 74 69 6f 6e 20 63 72 65 61 74 65 73 20 74 68 65  tion creates the
e110: 20 73 65 63 6f 6e 64 20 69 6d 70 6f 73 74 65 72   second imposter
e120: 20 74 61 62 6c 65 20 75 73 65 64 20 77 68 65 6e   table used when
e130: 20 77 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 61   writing to.** a
e140: 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20 77 68   table b-tree wh
e150: 65 72 65 20 74 68 65 20 74 61 62 6c 65 20 68 61  ere the table ha
e160: 73 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 70 72  s an external pr
e170: 69 6d 61 72 79 20 6b 65 79 2e 20 49 66 20 74 68  imary key. If th
e180: 65 0a 2a 2a 20 69 74 65 72 61 74 6f 72 20 70 61  e.** iterator pa
e190: 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
e1a0: 6e 64 20 61 72 67 75 6d 65 6e 74 20 64 6f 65 73  nd argument does
e1b0: 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 70   not currently p
e1c0: 6f 69 6e 74 20 74 6f 0a 2a 2a 20 61 20 74 61 62  oint to.** a tab
e1d0: 6c 65 20 28 6e 6f 74 20 69 6e 64 65 78 29 20 77  le (not index) w
e1e0: 69 74 68 20 61 6e 20 65 78 74 65 72 6e 61 6c 20  ith an external 
e1f0: 70 72 69 6d 61 72 79 20 6b 65 79 2c 20 74 68 69  primary key, thi
e200: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 0a  s function is a.
e210: 2a 2a 20 6e 6f 2d 6f 70 2e 20 0a 2a 2a 0a 2a 2a  ** no-op. .**.**
e220: 20 41 73 73 75 6d 69 6e 67 20 74 68 65 20 69 74   Assuming the it
e230: 65 72 61 74 6f 72 20 64 6f 65 73 20 70 6f 69 6e  erator does poin
e240: 74 20 74 6f 20 61 20 74 61 62 6c 65 20 77 69 74  t to a table wit
e250: 68 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 50 4b  h an external PK
e260: 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  , this.** functi
e270: 6f 6e 20 63 72 65 61 74 65 73 20 61 20 57 49 54  on creates a WIT
e280: 48 4f 55 54 20 52 4f 57 49 44 20 69 6d 70 6f 73  HOUT ROWID impos
e290: 74 65 72 20 74 61 62 6c 65 20 6e 61 6d 65 64 20  ter table named 
e2a0: 22 72 62 75 5f 69 6d 70 6f 73 74 65 72 32 22 0a  "rbu_imposter2".
e2b0: 2a 2a 20 75 73 65 64 20 74 6f 20 61 63 63 65 73  ** used to acces
e2c0: 73 20 74 68 61 74 20 50 4b 20 69 6e 64 65 78 2e  s that PK index.
e2d0: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66   For example, if
e2e0: 20 74 68 65 20 74 61 72 67 65 74 20 74 61 62 6c   the target tabl
e2f0: 65 20 69 73 0a 2a 2a 20 64 65 63 6c 61 72 65 64  e is.** declared
e300: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
e310: 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  **   CREATE TABL
e320: 45 20 74 31 28 61 2c 20 62 20 54 45 58 54 2c 20  E t1(a, b TEXT, 
e330: 63 20 52 45 41 4c 2c 20 50 52 49 4d 41 52 59 20  c REAL, PRIMARY 
e340: 4b 45 59 28 62 2c 20 63 29 29 3b 0a 2a 2a 0a 2a  KEY(b, c));.**.*
e350: 2a 20 74 68 65 6e 20 74 68 65 20 69 6d 70 6f 73  * then the impos
e360: 74 65 72 20 74 61 62 6c 65 20 73 63 68 65 6d 61  ter table schema
e370: 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45   is:.**.**   CRE
e380: 41 54 45 20 54 41 42 4c 45 20 72 62 75 5f 69 6d  ATE TABLE rbu_im
e390: 70 6f 73 74 65 72 32 28 63 31 20 54 45 58 54 2c  poster2(c1 TEXT,
e3a0: 20 63 32 20 52 45 41 4c 2c 20 69 64 20 49 4e 54   c2 REAL, id INT
e3b0: 45 47 45 52 29 20 57 49 54 48 4f 55 54 20 52 4f  EGER) WITHOUT RO
e3c0: 57 49 44 3b 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69  WID;.**.*/.stati
e3d0: 63 20 76 6f 69 64 20 72 62 75 43 72 65 61 74 65  c void rbuCreate
e3e0: 49 6d 70 6f 73 74 65 72 54 61 62 6c 65 32 28 73  ImposterTable2(s
e3f0: 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 52 62  qlite3rbu *p, Rb
e400: 75 4f 62 6a 49 74 65 72 20 2a 70 49 74 65 72 29  uObjIter *pIter)
e410: 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  {.  if( p->rc==S
e420: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 49 74 65  QLITE_OK && pIte
e430: 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b  r->eType==RBU_PK
e440: 5f 45 58 54 45 52 4e 41 4c 20 29 7b 0a 20 20 20  _EXTERNAL ){.   
e450: 20 69 6e 74 20 74 6e 75 6d 20 3d 20 70 49 74 65   int tnum = pIte
e460: 72 2d 3e 69 50 6b 54 6e 75 6d 3b 20 20 20 20 2f  r->iPkTnum;    /
e470: 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 50  * Root page of P
e480: 4b 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 73  K index */.    s
e490: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 51 75  qlite3_stmt *pQu
e4a0: 65 72 79 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  ery = 0;     /* 
e4b0: 53 45 4c 45 43 54 20 6e 61 6d 65 20 2e 2e 2e 20  SELECT name ... 
e4c0: 57 48 45 52 45 20 72 6f 6f 74 70 61 67 65 20 3d  WHERE rootpage =
e4d0: 20 24 74 6e 75 6d 20 2a 2f 0a 20 20 20 20 63 6f   $tnum */.    co
e4e0: 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 78 20 3d  nst char *zIdx =
e4f0: 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e   0;         /* N
e500: 61 6d 65 20 6f 66 20 50 4b 20 69 6e 64 65 78 20  ame of PK index 
e510: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  */.    sqlite3_s
e520: 74 6d 74 20 2a 70 58 49 6e 66 6f 20 3d 20 30 3b  tmt *pXInfo = 0;
e530: 20 20 20 20 20 2f 2a 20 50 52 41 47 4d 41 20 6d       /* PRAGMA m
e540: 61 69 6e 2e 69 6e 64 65 78 5f 78 69 6e 66 6f 20  ain.index_xinfo 
e550: 3d 20 24 7a 49 64 78 20 2a 2f 0a 20 20 20 20 63  = $zIdx */.    c
e560: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6d 6d  onst char *zComm
e570: 61 20 3d 20 22 22 3b 0a 20 20 20 20 63 68 61 72  a = "";.    char
e580: 20 2a 7a 43 6f 6c 73 20 3d 20 30 3b 20 20 20 20   *zCols = 0;    
e590: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
e5a0: 64 20 74 6f 20 62 75 69 6c 64 20 75 70 20 6c 69  d to build up li
e5b0: 73 74 20 6f 66 20 74 61 62 6c 65 20 63 6f 6c 73  st of table cols
e5c0: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 50   */.    char *zP
e5d0: 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  k = 0;          
e5e0: 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
e5f0: 20 62 75 69 6c 64 20 75 70 20 74 61 62 6c 65 20   build up table 
e600: 50 4b 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a  PK declaration *
e610: 2f 0a 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65  /..    /* Figure
e620: 20 6f 75 74 20 74 68 65 20 6e 61 6d 65 20 6f 66   out the name of
e630: 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79   the primary key
e640: 20 69 6e 64 65 78 20 66 6f 72 20 74 68 65 20 63   index for the c
e650: 75 72 72 65 6e 74 20 74 61 62 6c 65 2e 0a 20 20  urrent table..  
e660: 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e 65 65    ** This is nee
e670: 64 65 64 20 66 6f 72 20 74 68 65 20 61 72 67 75  ded for the argu
e680: 6d 65 6e 74 20 74 6f 20 22 50 52 41 47 4d 41 20  ment to "PRAGMA 
e690: 69 6e 64 65 78 5f 78 69 6e 66 6f 22 2e 20 53 65  index_xinfo". Se
e6a0: 74 0a 20 20 20 20 2a 2a 20 7a 49 64 78 20 74 6f  t.    ** zIdx to
e6b0: 20 70 6f 69 6e 74 20 74 6f 20 61 20 6e 75 6c 2d   point to a nul-
e6c0: 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e  terminated strin
e6d0: 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69  g containing thi
e6e0: 73 20 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 70  s name. */.    p
e6f0: 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65 41 6e  ->rc = prepareAn
e700: 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d  dCollectError(p-
e710: 3e 64 62 4d 61 69 6e 2c 20 26 70 51 75 65 72 79  >dbMain, &pQuery
e720: 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 20 0a  , &p->zErrmsg, .
e730: 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
e740: 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74 65  name FROM sqlite
e750: 5f 6d 61 73 74 65 72 20 57 48 45 52 45 20 72 6f  _master WHERE ro
e760: 6f 74 70 61 67 65 20 3d 20 3f 22 0a 20 20 20 20  otpage = ?".    
e770: 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  );.    if( p->rc
e780: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
e790: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
e7a0: 64 5f 69 6e 74 28 70 51 75 65 72 79 2c 20 31 2c  d_int(pQuery, 1,
e7b0: 20 74 6e 75 6d 29 3b 0a 20 20 20 20 20 20 69 66   tnum);.      if
e7c0: 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71  ( SQLITE_ROW==sq
e7d0: 6c 69 74 65 33 5f 73 74 65 70 28 70 51 75 65 72  lite3_step(pQuer
e7e0: 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 49  y) ){.        zI
e7f0: 64 78 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  dx = (const char
e800: 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
e810: 5f 74 65 78 74 28 70 51 75 65 72 79 2c 20 30 29  _text(pQuery, 0)
e820: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
e830: 20 20 20 20 69 66 28 20 7a 49 64 78 20 29 7b 0a      if( zIdx ){.
e840: 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 72        p->rc = pr
e850: 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c  epareFreeAndColl
e860: 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 4d 61  ectError(p->dbMa
e870: 69 6e 2c 20 26 70 58 49 6e 66 6f 2c 20 26 70 2d  in, &pXInfo, &p-
e880: 3e 7a 45 72 72 6d 73 67 2c 0a 20 20 20 20 20 20  >zErrmsg,.      
e890: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69      sqlite3_mpri
e8a0: 6e 74 66 28 22 50 52 41 47 4d 41 20 6d 61 69 6e  ntf("PRAGMA main
e8b0: 2e 69 6e 64 65 78 5f 78 69 6e 66 6f 20 3d 20 25  .index_xinfo = %
e8c0: 51 22 2c 20 7a 49 64 78 29 0a 20 20 20 20 20 20  Q", zIdx).      
e8d0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 62 75  );.    }.    rbu
e8e0: 46 69 6e 61 6c 69 7a 65 28 70 2c 20 70 51 75 65  Finalize(p, pQue
e8f0: 72 79 29 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28  ry);..    while(
e900: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
e910: 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d  K && SQLITE_ROW=
e920: 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 58  =sqlite3_step(pX
e930: 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 20 20 69  Info) ){.      i
e940: 6e 74 20 62 4b 65 79 20 3d 20 73 71 6c 69 74 65  nt bKey = sqlite
e950: 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 58 49  3_column_int(pXI
e960: 6e 66 6f 2c 20 35 29 3b 0a 20 20 20 20 20 20 69  nfo, 5);.      i
e970: 66 28 20 62 4b 65 79 20 29 7b 0a 20 20 20 20 20  f( bKey ){.     
e980: 20 20 20 69 6e 74 20 69 43 69 64 20 3d 20 73 71     int iCid = sq
e990: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
e9a0: 28 70 58 49 6e 66 6f 2c 20 31 29 3b 0a 20 20 20  (pXInfo, 1);.   
e9b0: 20 20 20 20 20 69 6e 74 20 62 44 65 73 63 20 3d       int bDesc =
e9c0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
e9d0: 69 6e 74 28 70 58 49 6e 66 6f 2c 20 33 29 3b 0a  int(pXInfo, 3);.
e9e0: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
e9f0: 61 72 20 2a 7a 43 6f 6c 6c 61 74 65 20 3d 20 28  ar *zCollate = (
ea00: 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
ea10: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
ea20: 70 58 49 6e 66 6f 2c 20 34 29 3b 0a 20 20 20 20  pXInfo, 4);.    
ea30: 20 20 20 20 7a 43 6f 6c 73 20 3d 20 72 62 75 4d      zCols = rbuM
ea40: 50 72 69 6e 74 66 28 70 2c 20 22 25 7a 25 73 63  Printf(p, "%z%sc
ea50: 25 64 20 25 73 20 43 4f 4c 4c 41 54 45 20 25 73  %d %s COLLATE %s
ea60: 22 2c 20 7a 43 6f 6c 73 2c 20 7a 43 6f 6d 6d 61  ", zCols, zComma
ea70: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  , .            i
ea80: 43 69 64 2c 20 70 49 74 65 72 2d 3e 61 7a 54 62  Cid, pIter->azTb
ea90: 6c 54 79 70 65 5b 69 43 69 64 5d 2c 20 7a 43 6f  lType[iCid], zCo
eaa0: 6c 6c 61 74 65 0a 20 20 20 20 20 20 20 20 29 3b  llate.        );
eab0: 0a 20 20 20 20 20 20 20 20 7a 50 6b 20 3d 20 72  .        zPk = r
eac0: 62 75 4d 50 72 69 6e 74 66 28 70 2c 20 22 25 7a  buMPrintf(p, "%z
ead0: 25 73 63 25 64 25 73 22 2c 20 7a 50 6b 2c 20 7a  %sc%d%s", zPk, z
eae0: 43 6f 6d 6d 61 2c 20 69 43 69 64 2c 20 62 44 65  Comma, iCid, bDe
eaf0: 73 63 3f 22 20 44 45 53 43 22 3a 22 22 29 3b 0a  sc?" DESC":"");.
eb00: 20 20 20 20 20 20 20 20 7a 43 6f 6d 6d 61 20 3d          zComma =
eb10: 20 22 2c 20 22 3b 0a 20 20 20 20 20 20 7d 0a 20   ", ";.      }. 
eb20: 20 20 20 7d 0a 20 20 20 20 7a 43 6f 6c 73 20 3d     }.    zCols =
eb30: 20 72 62 75 4d 50 72 69 6e 74 66 28 70 2c 20 22   rbuMPrintf(p, "
eb40: 25 7a 2c 20 69 64 20 49 4e 54 45 47 45 52 22 2c  %z, id INTEGER",
eb50: 20 7a 43 6f 6c 73 29 3b 0a 20 20 20 20 72 62 75   zCols);.    rbu
eb60: 46 69 6e 61 6c 69 7a 65 28 70 2c 20 70 58 49 6e  Finalize(p, pXIn
eb70: 66 6f 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65  fo);..    sqlite
eb80: 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
eb90: 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49  QLITE_TESTCTRL_I
eba0: 4d 50 4f 53 54 45 52 2c 20 70 2d 3e 64 62 4d 61  MPOSTER, p->dbMa
ebb0: 69 6e 2c 20 22 6d 61 69 6e 22 2c 20 31 2c 20 74  in, "main", 1, t
ebc0: 6e 75 6d 29 3b 0a 20 20 20 20 72 62 75 4d 50 72  num);.    rbuMPr
ebd0: 69 6e 74 66 45 78 65 63 28 70 2c 20 70 2d 3e 64  intfExec(p, p->d
ebe0: 62 4d 61 69 6e 2c 0a 20 20 20 20 20 20 20 20 22  bMain,.        "
ebf0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 72 62 75  CREATE TABLE rbu
ec00: 5f 69 6d 70 6f 73 74 65 72 32 28 25 7a 2c 20 50  _imposter2(%z, P
ec10: 52 49 4d 41 52 59 20 4b 45 59 28 25 7a 29 29 20  RIMARY KEY(%z)) 
ec20: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 22 2c 20  WITHOUT ROWID", 
ec30: 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 73 2c 20  .        zCols, 
ec40: 7a 50 6b 0a 20 20 20 20 29 3b 0a 20 20 20 20 73  zPk.    );.    s
ec50: 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
ec60: 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
ec70: 54 52 4c 5f 49 4d 50 4f 53 54 45 52 2c 20 70 2d  TRL_IMPOSTER, p-
ec80: 3e 64 62 4d 61 69 6e 2c 20 22 6d 61 69 6e 22 2c  >dbMain, "main",
ec90: 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f   0, 0);.  }.}../
eca0: 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
ecb0: 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63   has already occ
ecc0: 75 72 72 65 64 20 77 68 65 6e 20 74 68 69 73 20  urred when this 
ecd0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
ece0: 65 64 2c 20 69 74 20 0a 2a 2a 20 69 6d 6d 65 64  ed, it .** immed
ecf0: 69 61 74 65 6c 79 20 72 65 74 75 72 6e 73 20 7a  iately returns z
ed00: 65 72 6f 20 28 77 69 74 68 6f 75 74 20 64 6f 69  ero (without doi
ed10: 6e 67 20 61 6e 79 20 77 6f 72 6b 29 2e 20 4f 72  ng any work). Or
ed20: 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 0a 2a 2a  , if an error.**
ed30: 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 74   occurs during t
ed40: 68 65 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20  he execution of 
ed50: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 69  this function, i
ed60: 74 20 73 65 74 73 20 74 68 65 20 65 72 72 6f 72  t sets the error
ed70: 20 63 6f 64 65 0a 2a 2a 20 69 6e 20 74 68 65 20   code.** in the 
ed80: 73 71 6c 69 74 65 33 72 62 75 20 6f 62 6a 65 63  sqlite3rbu objec
ed90: 74 20 69 6e 64 69 63 61 74 65 64 20 62 79 20 74  t indicated by t
eda0: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
edb0: 74 20 61 6e 64 20 72 65 74 75 72 6e 73 0a 2a 2a  t and returns.**
edc0: 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   zero..**.** The
edd0: 20 69 74 65 72 61 74 6f 72 20 70 61 73 73 65 64   iterator passed
ede0: 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
edf0: 72 67 75 6d 65 6e 74 20 69 73 20 67 75 61 72 61  rgument is guara
ee00: 6e 74 65 65 64 20 74 6f 20 70 6f 69 6e 74 20 74  nteed to point t
ee10: 6f 0a 2a 2a 20 61 20 74 61 62 6c 65 20 28 6e 6f  o.** a table (no
ee20: 74 20 61 6e 20 69 6e 64 65 78 29 20 77 68 65 6e  t an index) when
ee30: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
ee40: 73 20 63 61 6c 6c 65 64 2e 20 54 68 69 73 20 66  s called. This f
ee50: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 74 74 65 6d  unction.** attem
ee60: 70 74 73 20 74 6f 20 63 72 65 61 74 65 20 61 6e  pts to create an
ee70: 79 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65  y imposter table
ee80: 20 72 65 71 75 69 72 65 64 20 74 6f 20 77 72 69   required to wri
ee90: 74 65 20 74 6f 20 74 68 65 20 6d 61 69 6e 0a 2a  te to the main.*
eea0: 2a 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20 6f  * table b-tree o
eeb0: 66 20 74 68 65 20 74 61 62 6c 65 20 62 65 66 6f  f the table befo
eec0: 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 4e 6f  re returning. No
eed0: 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e  n-zero is return
eee0: 65 64 20 69 66 0a 2a 2a 20 61 6e 20 69 6d 70 6f  ed if.** an impo
eef0: 73 74 65 72 20 74 61 62 6c 65 20 61 72 65 20 63  ster table are c
ef00: 72 65 61 74 65 64 2c 20 6f 72 20 7a 65 72 6f 20  reated, or zero 
ef10: 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a  otherwise..**.**
ef20: 20 41 6e 20 69 6d 70 6f 73 74 65 72 20 74 61 62   An imposter tab
ef30: 6c 65 20 69 73 20 72 65 71 75 69 72 65 64 20 69  le is required i
ef40: 6e 20 61 6c 6c 20 63 61 73 65 73 20 65 78 63 65  n all cases exce
ef50: 70 74 20 52 42 55 5f 50 4b 5f 56 54 41 42 2e 20  pt RBU_PK_VTAB. 
ef60: 4f 6e 6c 79 0a 2a 2a 20 76 69 72 74 75 61 6c 20  Only.** virtual 
ef70: 74 61 62 6c 65 73 20 61 72 65 20 77 72 69 74 74  tables are writt
ef80: 65 6e 20 74 6f 20 64 69 72 65 63 74 6c 79 2e 20  en to directly. 
ef90: 54 68 65 20 69 6d 70 6f 73 74 65 72 20 74 61 62  The imposter tab
efa0: 6c 65 20 68 61 73 20 74 68 65 20 0a 2a 2a 20 73  le has the .** s
efb0: 61 6d 65 20 73 63 68 65 6d 61 20 61 73 20 74 68  ame schema as th
efc0: 65 20 61 63 74 75 61 6c 20 74 61 72 67 65 74 20  e actual target 
efd0: 74 61 62 6c 65 20 28 6c 65 73 73 20 61 6e 79 20  table (less any 
efe0: 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e  UNIQUE constrain
eff0: 74 73 29 2e 20 0a 2a 2a 20 4d 6f 72 65 20 70 72  ts). .** More pr
f000: 65 63 69 73 65 6c 79 2c 20 74 68 65 20 22 73 61  ecisely, the "sa
f010: 6d 65 20 73 63 68 65 6d 61 22 20 6d 65 61 6e 73  me schema" means
f020: 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 75 6d 6e   the same column
f030: 73 2c 20 74 79 70 65 73 2c 20 0a 2a 2a 20 63 6f  s, types, .** co
f040: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
f050: 73 2e 20 46 6f 72 20 74 61 62 6c 65 73 20 74 68  s. For tables th
f060: 61 74 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 61  at do not have a
f070: 6e 20 65 78 74 65 72 6e 61 6c 20 50 52 49 4d 41  n external PRIMA
f080: 52 59 0a 2a 2a 20 4b 45 59 2c 20 69 74 20 61 6c  RY.** KEY, it al
f090: 73 6f 20 6d 65 61 6e 73 20 74 68 65 20 73 61 6d  so means the sam
f0a0: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 64 65  e PRIMARY KEY de
f0b0: 63 6c 61 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  claration..*/.st
f0c0: 61 74 69 63 20 76 6f 69 64 20 72 62 75 43 72 65  atic void rbuCre
f0d0: 61 74 65 49 6d 70 6f 73 74 65 72 54 61 62 6c 65  ateImposterTable
f0e0: 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20  (sqlite3rbu *p, 
f0f0: 52 62 75 4f 62 6a 49 74 65 72 20 2a 70 49 74 65  RbuObjIter *pIte
f100: 72 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  r){.  if( p->rc=
f110: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 49  =SQLITE_OK && pI
f120: 74 65 72 2d 3e 65 54 79 70 65 21 3d 52 42 55 5f  ter->eType!=RBU_
f130: 50 4b 5f 56 54 41 42 20 29 7b 0a 20 20 20 20 69  PK_VTAB ){.    i
f140: 6e 74 20 74 6e 75 6d 20 3d 20 70 49 74 65 72 2d  nt tnum = pIter-
f150: 3e 69 54 6e 75 6d 3b 0a 20 20 20 20 63 6f 6e 73  >iTnum;.    cons
f160: 74 20 63 68 61 72 20 2a 7a 43 6f 6d 6d 61 20 3d  t char *zComma =
f170: 20 22 22 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a   "";.    char *z
f180: 53 71 6c 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  Sql = 0;.    int
f190: 20 69 43 6f 6c 3b 0a 20 20 20 20 73 71 6c 69 74   iCol;.    sqlit
f1a0: 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
f1b0: 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
f1c0: 49 4d 50 4f 53 54 45 52 2c 20 70 2d 3e 64 62 4d  IMPOSTER, p->dbM
f1d0: 61 69 6e 2c 20 22 6d 61 69 6e 22 2c 20 30 2c 20  ain, "main", 0, 
f1e0: 31 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 43 6f  1);..    for(iCo
f1f0: 6c 3d 30 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  l=0; p->rc==SQLI
f200: 54 45 5f 4f 4b 20 26 26 20 69 43 6f 6c 3c 70 49  TE_OK && iCol<pI
f210: 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 3b 20 69 43  ter->nTblCol; iC
f220: 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 63 6f 6e  ol++){.      con
f230: 73 74 20 63 68 61 72 20 2a 7a 50 6b 20 3d 20 22  st char *zPk = "
f240: 22 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ";.      const c
f250: 68 61 72 20 2a 7a 43 6f 6c 20 3d 20 70 49 74 65  har *zCol = pIte
f260: 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69 43 6f 6c  r->azTblCol[iCol
f270: 5d 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ];.      const c
f280: 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 30 3b 0a  har *zColl = 0;.
f290: 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73  .      p->rc = s
f2a0: 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c  qlite3_table_col
f2b0: 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28 0a 20 20  umn_metadata(.  
f2c0: 20 20 20 20 20 20 20 20 70 2d 3e 64 62 4d 61 69          p->dbMai
f2d0: 6e 2c 20 22 6d 61 69 6e 22 2c 20 70 49 74 65 72  n, "main", pIter
f2e0: 2d 3e 7a 54 62 6c 2c 20 7a 43 6f 6c 2c 20 30 2c  ->zTbl, zCol, 0,
f2f0: 20 26 7a 43 6f 6c 6c 2c 20 30 2c 20 30 2c 20 30   &zColl, 0, 0, 0
f300: 0a 20 20 20 20 20 20 29 3b 0a 0a 20 20 20 20 20  .      );..     
f310: 20 69 66 28 20 70 49 74 65 72 2d 3e 65 54 79 70   if( pIter->eTyp
f320: 65 3d 3d 52 42 55 5f 50 4b 5f 49 50 4b 20 26 26  e==RBU_PK_IPK &&
f330: 20 70 49 74 65 72 2d 3e 61 62 54 62 6c 50 6b 5b   pIter->abTblPk[
f340: 69 43 6f 6c 5d 20 29 7b 0a 20 20 20 20 20 20 20  iCol] ){.       
f350: 20 2f 2a 20 49 66 20 74 68 65 20 74 61 72 67 65   /* If the targe
f360: 74 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 69  t table column i
f370: 73 20 61 6e 20 22 49 4e 54 45 47 45 52 20 50 52  s an "INTEGER PR
f380: 49 4d 41 52 59 20 4b 45 59 22 2c 20 61 64 64 0a  IMARY KEY", add.
f390: 20 20 20 20 20 20 20 20 2a 2a 20 22 50 52 49 4d          ** "PRIM
f3a0: 41 52 59 20 4b 45 59 22 20 74 6f 20 74 68 65 20  ARY KEY" to the 
f3b0: 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 20 63  imposter table c
f3c0: 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f  olumn declaratio
f3d0: 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 7a 50  n. */.        zP
f3e0: 6b 20 3d 20 22 50 52 49 4d 41 52 59 20 4b 45 59  k = "PRIMARY KEY
f3f0: 20 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   ";.      }.    
f400: 20 20 7a 53 71 6c 20 3d 20 72 62 75 4d 50 72 69    zSql = rbuMPri
f410: 6e 74 66 28 70 2c 20 22 25 7a 25 73 5c 22 25 77  ntf(p, "%z%s\"%w
f420: 5c 22 20 25 73 20 25 73 43 4f 4c 4c 41 54 45 20  \" %s %sCOLLATE 
f430: 25 73 25 73 22 2c 20 0a 20 20 20 20 20 20 20 20  %s%s", .        
f440: 20 20 7a 53 71 6c 2c 20 7a 43 6f 6d 6d 61 2c 20    zSql, zComma, 
f450: 7a 43 6f 6c 2c 20 70 49 74 65 72 2d 3e 61 7a 54  zCol, pIter->azT
f460: 62 6c 54 79 70 65 5b 69 43 6f 6c 5d 2c 20 7a 50  blType[iCol], zP
f470: 6b 2c 20 7a 43 6f 6c 6c 2c 0a 20 20 20 20 20 20  k, zColl,.      
f480: 20 20 20 20 28 70 49 74 65 72 2d 3e 61 62 4e 6f      (pIter->abNo
f490: 74 4e 75 6c 6c 5b 69 43 6f 6c 5d 20 3f 20 22 20  tNull[iCol] ? " 
f4a0: 4e 4f 54 20 4e 55 4c 4c 22 20 3a 20 22 22 29 0a  NOT NULL" : "").
f4b0: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7a        );.      z
f4c0: 43 6f 6d 6d 61 20 3d 20 22 2c 20 22 3b 0a 20 20  Comma = ", ";.  
f4d0: 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 49 74    }..    if( pIt
f4e0: 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50  er->eType==RBU_P
f4f0: 4b 5f 57 49 54 48 4f 55 54 5f 52 4f 57 49 44 20  K_WITHOUT_ROWID 
f500: 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
f510: 50 6b 20 3d 20 72 62 75 57 69 74 68 6f 75 74 52  Pk = rbuWithoutR
f520: 6f 77 69 64 50 4b 28 70 2c 20 70 49 74 65 72 29  owidPK(p, pIter)
f530: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50 6b 20  ;.      if( zPk 
f540: 29 7b 0a 20 20 20 20 20 20 20 20 7a 53 71 6c 20  ){.        zSql 
f550: 3d 20 72 62 75 4d 50 72 69 6e 74 66 28 70 2c 20  = rbuMPrintf(p, 
f560: 22 25 7a 2c 20 25 7a 22 2c 20 7a 53 71 6c 2c 20  "%z, %z", zSql, 
f570: 7a 50 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  zPk);.      }.  
f580: 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33    }..    sqlite3
f590: 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
f5a0: 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d  LITE_TESTCTRL_IM
f5b0: 50 4f 53 54 45 52 2c 20 70 2d 3e 64 62 4d 61 69  POSTER, p->dbMai
f5c0: 6e 2c 20 22 6d 61 69 6e 22 2c 20 31 2c 20 74 6e  n, "main", 1, tn
f5d0: 75 6d 29 3b 0a 20 20 20 20 72 62 75 4d 50 72 69  um);.    rbuMPri
f5e0: 6e 74 66 45 78 65 63 28 70 2c 20 70 2d 3e 64 62  ntfExec(p, p->db
f5f0: 4d 61 69 6e 2c 20 22 43 52 45 41 54 45 20 54 41  Main, "CREATE TA
f600: 42 4c 45 20 5c 22 72 62 75 5f 69 6d 70 5f 25 77  BLE \"rbu_imp_%w
f610: 5c 22 28 25 7a 29 25 73 22 2c 20 0a 20 20 20 20  \"(%z)%s", .    
f620: 20 20 20 20 70 49 74 65 72 2d 3e 7a 54 62 6c 2c      pIter->zTbl,
f630: 20 7a 53 71 6c 2c 20 0a 20 20 20 20 20 20 20 20   zSql, .        
f640: 28 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52  (pIter->eType==R
f650: 42 55 5f 50 4b 5f 57 49 54 48 4f 55 54 5f 52 4f  BU_PK_WITHOUT_RO
f660: 57 49 44 20 3f 20 22 20 57 49 54 48 4f 55 54 20  WID ? " WITHOUT 
f670: 52 4f 57 49 44 22 20 3a 20 22 22 29 0a 20 20 20  ROWID" : "").   
f680: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   );.    sqlite3_
f690: 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
f6a0: 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50  ITE_TESTCTRL_IMP
f6b0: 4f 53 54 45 52 2c 20 70 2d 3e 64 62 4d 61 69 6e  OSTER, p->dbMain
f6c0: 2c 20 22 6d 61 69 6e 22 2c 20 30 2c 20 30 29 3b  , "main", 0, 0);
f6d0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72  .  }.}../*.** Pr
f6e0: 65 70 61 72 65 20 61 20 73 74 61 74 65 6d 65 6e  epare a statemen
f6f0: 74 20 75 73 65 64 20 74 6f 20 69 6e 73 65 72 74  t used to insert
f700: 20 72 6f 77 73 20 69 6e 74 6f 20 74 68 65 20 22   rows into the "
f710: 72 62 75 5f 74 6d 70 5f 78 78 78 22 20 74 61 62  rbu_tmp_xxx" tab
f720: 6c 65 2e 0a 2a 2a 20 53 70 65 63 69 66 69 63 61  le..** Specifica
f730: 6c 6c 79 20 61 20 73 74 61 74 65 6d 65 6e 74 20  lly a statement 
f740: 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a  of the form:.**.
f750: 2a 2a 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  **     INSERT IN
f760: 54 4f 20 72 62 75 5f 74 6d 70 5f 78 78 78 20 56  TO rbu_tmp_xxx V
f770: 41 4c 55 45 53 28 3f 2c 20 3f 2c 20 3f 20 2e 2e  ALUES(?, ?, ? ..
f780: 2e 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 75  .);.**.** The nu
f790: 6d 62 65 72 20 6f 66 20 62 6f 75 6e 64 20 76 61  mber of bound va
f7a0: 72 69 61 62 6c 65 73 20 69 73 20 65 71 75 61 6c  riables is equal
f7b0: 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
f7c0: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 0a 2a 2a 20  f columns in.** 
f7d0: 74 68 65 20 74 61 72 67 65 74 20 74 61 62 6c 65  the target table
f7e0: 2c 20 70 6c 75 73 20 6f 6e 65 20 28 66 6f 72 20  , plus one (for 
f7f0: 74 68 65 20 72 62 75 5f 63 6f 6e 74 72 6f 6c 20  the rbu_control 
f800: 63 6f 6c 75 6d 6e 29 2c 20 70 6c 75 73 20 6f 6e  column), plus on
f810: 65 20 6d 6f 72 65 20 0a 2a 2a 20 28 66 6f 72 20  e more .** (for 
f820: 74 68 65 20 72 62 75 5f 72 6f 77 69 64 20 63 6f  the rbu_rowid co
f830: 6c 75 6d 6e 29 20 69 66 20 74 68 65 20 74 61 72  lumn) if the tar
f840: 67 65 74 20 74 61 62 6c 65 20 69 73 20 61 6e 20  get table is an 
f850: 69 6d 70 6c 69 63 69 74 20 49 50 4b 20 6f 72 20  implicit IPK or 
f860: 0a 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c  .** virtual tabl
f870: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
f880: 64 20 72 62 75 4f 62 6a 49 74 65 72 50 72 65 70  d rbuObjIterPrep
f890: 61 72 65 54 6d 70 49 6e 73 65 72 74 28 0a 20 20  areTmpInsert(.  
f8a0: 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 0a  sqlite3rbu *p, .
f8b0: 20 20 52 62 75 4f 62 6a 49 74 65 72 20 2a 70 49    RbuObjIter *pI
f8c0: 74 65 72 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  ter,.  const cha
f8d0: 72 20 2a 7a 43 6f 6c 6c 69 73 74 2c 0a 20 20 63  r *zCollist,.  c
f8e0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 62 75 52  onst char *zRbuR
f8f0: 6f 77 69 64 0a 29 7b 0a 20 20 69 6e 74 20 62 52  owid.){.  int bR
f900: 62 75 52 6f 77 69 64 20 3d 20 28 70 49 74 65 72  buRowid = (pIter
f910: 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f  ->eType==RBU_PK_
f920: 45 58 54 45 52 4e 41 4c 20 7c 7c 20 70 49 74 65  EXTERNAL || pIte
f930: 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b  r->eType==RBU_PK
f940: 5f 4e 4f 4e 45 29 3b 0a 20 20 63 68 61 72 20 2a  _NONE);.  char *
f950: 7a 42 69 6e 64 20 3d 20 72 62 75 4f 62 6a 49 74  zBind = rbuObjIt
f960: 65 72 47 65 74 42 69 6e 64 6c 69 73 74 28 70 2c  erGetBindlist(p,
f970: 20 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 20   pIter->nTblCol 
f980: 2b 20 31 20 2b 20 62 52 62 75 52 6f 77 69 64 29  + 1 + bRbuRowid)
f990: 3b 0a 20 20 69 66 28 20 7a 42 69 6e 64 20 29 7b  ;.  if( zBind ){
f9a0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
f9b0: 65 72 2d 3e 70 54 6d 70 49 6e 73 65 72 74 3d 3d  er->pTmpInsert==
f9c0: 30 20 29 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  0 );.    p->rc =
f9d0: 20 70 72 65 70 61 72 65 46 72 65 65 41 6e 64 43   prepareFreeAndC
f9e0: 6f 6c 6c 65 63 74 45 72 72 6f 72 28 0a 20 20 20  ollectError(.   
f9f0: 20 20 20 20 20 70 2d 3e 64 62 52 62 75 2c 20 26       p->dbRbu, &
fa00: 70 49 74 65 72 2d 3e 70 54 6d 70 49 6e 73 65 72  pIter->pTmpInser
fa10: 74 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 20  t, &p->zErrmsg, 
fa20: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
fa30: 0a 20 20 20 20 20 20 20 20 20 20 22 49 4e 53 45  .          "INSE
fa40: 52 54 20 49 4e 54 4f 20 25 73 2e 27 72 62 75 5f  RT INTO %s.'rbu_
fa50: 74 6d 70 5f 25 71 27 28 72 62 75 5f 63 6f 6e 74  tmp_%q'(rbu_cont
fa60: 72 6f 6c 2c 25 73 25 73 29 20 56 41 4c 55 45 53  rol,%s%s) VALUES
fa70: 28 25 7a 29 22 2c 20 0a 20 20 20 20 20 20 20 20  (%z)", .        
fa80: 20 20 70 2d 3e 7a 53 74 61 74 65 44 62 2c 20 70    p->zStateDb, p
fa90: 49 74 65 72 2d 3e 7a 44 61 74 61 54 62 6c 2c 20  Iter->zDataTbl, 
faa0: 7a 43 6f 6c 6c 69 73 74 2c 20 7a 52 62 75 52 6f  zCollist, zRbuRo
fab0: 77 69 64 2c 20 7a 42 69 6e 64 0a 20 20 20 20 29  wid, zBind.    )
fac0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63  );.  }.}..static
fad0: 20 76 6f 69 64 20 72 62 75 54 6d 70 49 6e 73 65   void rbuTmpInse
fae0: 72 74 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  rtFunc(.  sqlite
faf0: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
fb00: 20 0a 20 20 69 6e 74 20 6e 56 61 6c 2c 0a 20 20   .  int nVal,.  
fb10: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
fb20: 61 70 56 61 6c 0a 29 7b 0a 20 20 73 71 6c 69 74  apVal.){.  sqlit
fb30: 65 33 72 62 75 20 2a 70 20 3d 20 73 71 6c 69 74  e3rbu *p = sqlit
fb40: 65 33 5f 75 73 65 72 5f 64 61 74 61 28 70 43 74  e3_user_data(pCt
fb50: 78 29 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  x);.  int rc = S
fb60: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
fb70: 69 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  i;..  assert( sq
fb80: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28  lite3_value_int(
fb90: 61 70 56 61 6c 5b 30 5d 29 21 3d 30 0a 20 20 20  apVal[0])!=0.   
fba0: 20 20 20 7c 7c 20 70 2d 3e 6f 62 6a 69 74 65 72     || p->objiter
fbb0: 2e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 45  .eType==RBU_PK_E
fbc0: 58 54 45 52 4e 41 4c 20 0a 20 20 20 20 20 20 7c  XTERNAL .      |
fbd0: 7c 20 70 2d 3e 6f 62 6a 69 74 65 72 2e 65 54 79  | p->objiter.eTy
fbe0: 70 65 3d 3d 52 42 55 5f 50 4b 5f 4e 4f 4e 45 20  pe==RBU_PK_NONE 
fbf0: 0a 20 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  .  );.  if( sqli
fc00: 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 70  te3_value_int(ap
fc10: 56 61 6c 5b 30 5d 29 21 3d 30 20 29 7b 0a 20 20  Val[0])!=0 ){.  
fc20: 20 20 70 2d 3e 6e 50 68 61 73 65 4f 6e 65 53 74    p->nPhaseOneSt
fc30: 65 70 20 2b 3d 20 70 2d 3e 6f 62 6a 69 74 65 72  ep += p->objiter
fc40: 2e 6e 49 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20  .nIndex;.  }..  
fc50: 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  for(i=0; rc==SQL
fc60: 49 54 45 5f 4f 4b 20 26 26 20 69 3c 6e 56 61 6c  ITE_OK && i<nVal
fc70: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 63 20 3d  ; i++){.    rc =
fc80: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 76 61   sqlite3_bind_va
fc90: 6c 75 65 28 70 2d 3e 6f 62 6a 69 74 65 72 2e 70  lue(p->objiter.p
fca0: 54 6d 70 49 6e 73 65 72 74 2c 20 69 2b 31 2c 20  TmpInsert, i+1, 
fcb0: 61 70 56 61 6c 5b 69 5d 29 3b 0a 20 20 7d 0a 20  apVal[i]);.  }. 
fcc0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
fcd0: 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
fce0: 33 5f 73 74 65 70 28 70 2d 3e 6f 62 6a 69 74 65  3_step(p->objite
fcf0: 72 2e 70 54 6d 70 49 6e 73 65 72 74 29 3b 0a 20  r.pTmpInsert);. 
fd00: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
fd10: 72 65 73 65 74 28 70 2d 3e 6f 62 6a 69 74 65 72  reset(p->objiter
fd20: 2e 70 54 6d 70 49 6e 73 65 72 74 29 3b 0a 20 20  .pTmpInsert);.  
fd30: 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  }..  if( rc!=SQL
fd40: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
fd50: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
fd60: 6f 72 5f 63 6f 64 65 28 70 43 74 78 2c 20 72 63  or_code(pCtx, rc
fd70: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
fd80: 45 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  Ensure that the 
fd90: 53 51 4c 69 74 65 20 73 74 61 74 65 6d 65 6e 74  SQLite statement
fda0: 20 68 61 6e 64 6c 65 73 20 72 65 71 75 69 72 65   handles require
fdb0: 64 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20  d to update the 
fdc0: 0a 2a 2a 20 74 61 72 67 65 74 20 64 61 74 61 62  .** target datab
fdd0: 61 73 65 20 6f 62 6a 65 63 74 20 63 75 72 72 65  ase object curre
fde0: 6e 74 6c 79 20 69 6e 64 69 63 61 74 65 64 20 62  ntly indicated b
fdf0: 79 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70  y the iterator p
fe00: 61 73 73 65 64 20 0a 2a 2a 20 61 73 20 74 68 65  assed .** as the
fe10: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
fe20: 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2e 0a   are available..
fe30: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62  */.static int rb
fe40: 75 4f 62 6a 49 74 65 72 50 72 65 70 61 72 65 41  uObjIterPrepareA
fe50: 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33 72 62 75  ll(.  sqlite3rbu
fe60: 20 2a 70 2c 20 0a 20 20 52 62 75 4f 62 6a 49 74   *p, .  RbuObjIt
fe70: 65 72 20 2a 70 49 74 65 72 2c 0a 20 20 69 6e 74  er *pIter,.  int
fe80: 20 6e 4f 66 66 73 65 74 20 20 20 20 20 20 20 20   nOffset        
fe90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fea0: 41 64 64 20 22 4c 49 4d 49 54 20 2d 31 20 4f 46  Add "LIMIT -1 OF
feb0: 46 53 45 54 20 24 6e 4f 66 66 73 65 74 22 20 74  FSET $nOffset" t
fec0: 6f 20 53 45 4c 45 43 54 20 2a 2f 0a 29 7b 0a 20  o SELECT */.){. 
fed0: 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
fee0: 62 43 6c 65 61 6e 75 70 3d 3d 30 20 29 3b 0a 20  bCleanup==0 );. 
fef0: 20 69 66 28 20 70 49 74 65 72 2d 3e 70 53 65 6c   if( pIter->pSel
ff00: 65 63 74 3d 3d 30 20 26 26 20 72 62 75 4f 62 6a  ect==0 && rbuObj
ff10: 49 74 65 72 43 61 63 68 65 54 61 62 6c 65 49 6e  IterCacheTableIn
ff20: 66 6f 28 70 2c 20 70 49 74 65 72 29 3d 3d 53 51  fo(p, pIter)==SQ
ff30: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 63  LITE_OK ){.    c
ff40: 6f 6e 73 74 20 69 6e 74 20 74 6e 75 6d 20 3d 20  onst int tnum = 
ff50: 70 49 74 65 72 2d 3e 69 54 6e 75 6d 3b 0a 20 20  pIter->iTnum;.  
ff60: 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 69 73 74    char *zCollist
ff70: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
ff80: 2f 2a 20 4c 69 73 74 20 6f 66 20 69 6e 64 65 78  /* List of index
ff90: 65 64 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  ed columns */.  
ffa0: 20 20 63 68 61 72 20 2a 2a 70 7a 20 3d 20 26 70    char **pz = &p
ffb0: 2d 3e 7a 45 72 72 6d 73 67 3b 0a 20 20 20 20 63  ->zErrmsg;.    c
ffc0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 78 20  onst char *zIdx 
ffd0: 3d 20 70 49 74 65 72 2d 3e 7a 49 64 78 3b 0a 20  = pIter->zIdx;. 
ffe0: 20 20 20 63 68 61 72 20 2a 7a 4c 69 6d 69 74 20     char *zLimit 
fff0: 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 6e 4f  = 0;..    if( nO
10000 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20 7a  ffset ){.      z
10010 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 5f  Limit = sqlite3_
10020 6d 70 72 69 6e 74 66 28 22 20 4c 49 4d 49 54 20  mprintf(" LIMIT 
10030 2d 31 20 4f 46 46 53 45 54 20 25 64 22 2c 20 6e  -1 OFFSET %d", n
10040 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 69  Offset);.      i
10050 66 28 20 21 7a 4c 69 6d 69 74 20 29 20 70 2d 3e  f( !zLimit ) p->
10060 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
10070 4d 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  M;.    }..    if
10080 28 20 7a 49 64 78 20 29 7b 0a 20 20 20 20 20 20  ( zIdx ){.      
10090 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 62 6c  const char *zTbl
100a0 20 3d 20 70 49 74 65 72 2d 3e 7a 54 62 6c 3b 0a   = pIter->zTbl;.
100b0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 49 6d 70        char *zImp
100c0 6f 73 74 65 72 43 6f 6c 73 20 3d 20 30 3b 20 20  osterCols = 0;  
100d0 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 66 6f 72    /* Columns for
100e0 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 20   imposter table 
100f0 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  */.      char *z
10100 49 6d 70 6f 73 74 65 72 50 4b 20 3d 20 30 3b 20  ImposterPK = 0; 
10110 20 20 20 20 20 2f 2a 20 50 72 69 6d 61 72 79 20       /* Primary 
10120 6b 65 79 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  key declaration 
10130 66 6f 72 20 69 6d 70 6f 73 74 65 72 20 2a 2f 0a  for imposter */.
10140 20 20 20 20 20 20 63 68 61 72 20 2a 7a 57 68 65        char *zWhe
10150 72 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  re = 0;         
10160 20 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73    /* WHERE claus
10170 65 20 6f 6e 20 50 4b 20 63 6f 6c 75 6d 6e 73 20  e on PK columns 
10180 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  */.      char *z
10190 42 69 6e 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  Bind = 0;.      
101a0 69 6e 74 20 6e 42 69 6e 64 20 3d 20 30 3b 0a 0a  int nBind = 0;..
101b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
101c0 74 65 72 2d 3e 65 54 79 70 65 21 3d 52 42 55 5f  ter->eType!=RBU_
101d0 50 4b 5f 56 54 41 42 20 29 3b 0a 20 20 20 20 20  PK_VTAB );.     
101e0 20 7a 43 6f 6c 6c 69 73 74 20 3d 20 72 62 75 4f   zCollist = rbuO
101f0 62 6a 49 74 65 72 47 65 74 49 6e 64 65 78 43 6f  bjIterGetIndexCo
10200 6c 73 28 0a 20 20 20 20 20 20 20 20 20 20 70 2c  ls(.          p,
10210 20 70 49 74 65 72 2c 20 26 7a 49 6d 70 6f 73 74   pIter, &zImpost
10220 65 72 43 6f 6c 73 2c 20 26 7a 49 6d 70 6f 73 74  erCols, &zImpost
10230 65 72 50 4b 2c 20 26 7a 57 68 65 72 65 2c 20 26  erPK, &zWhere, &
10240 6e 42 69 6e 64 0a 20 20 20 20 20 20 29 3b 0a 20  nBind.      );. 
10250 20 20 20 20 20 7a 42 69 6e 64 20 3d 20 72 62 75       zBind = rbu
10260 4f 62 6a 49 74 65 72 47 65 74 42 69 6e 64 6c 69  ObjIterGetBindli
10270 73 74 28 70 2c 20 6e 42 69 6e 64 29 3b 0a 0a 20  st(p, nBind);.. 
10280 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74       /* Create t
10290 68 65 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c  he imposter tabl
102a0 65 20 75 73 65 64 20 74 6f 20 77 72 69 74 65 20  e used to write 
102b0 74 6f 20 74 68 69 73 20 69 6e 64 65 78 2e 20 2a  to this index. *
102c0 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  /.      sqlite3_
102d0 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
102e0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50  ITE_TESTCTRL_IMP
102f0 4f 53 54 45 52 2c 20 70 2d 3e 64 62 4d 61 69 6e  OSTER, p->dbMain
10300 2c 20 22 6d 61 69 6e 22 2c 20 30 2c 20 31 29 3b  , "main", 0, 1);
10310 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74  .      sqlite3_t
10320 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
10330 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f  TE_TESTCTRL_IMPO
10340 53 54 45 52 2c 20 70 2d 3e 64 62 4d 61 69 6e 2c  STER, p->dbMain,
10350 20 22 6d 61 69 6e 22 2c 20 31 2c 74 6e 75 6d 29   "main", 1,tnum)
10360 3b 0a 20 20 20 20 20 20 72 62 75 4d 50 72 69 6e  ;.      rbuMPrin
10370 74 66 45 78 65 63 28 70 2c 20 70 2d 3e 64 62 4d  tfExec(p, p->dbM
10380 61 69 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 22  ain,.          "
10390 43 52 45 41 54 45 20 54 41 42 4c 45 20 5c 22 72  CREATE TABLE \"r
103a0 62 75 5f 69 6d 70 5f 25 77 5c 22 28 20 25 73 2c  bu_imp_%w\"( %s,
103b0 20 50 52 49 4d 41 52 59 20 4b 45 59 28 20 25 73   PRIMARY KEY( %s
103c0 20 29 20 29 20 57 49 54 48 4f 55 54 20 52 4f 57   ) ) WITHOUT ROW
103d0 49 44 22 2c 0a 20 20 20 20 20 20 20 20 20 20 7a  ID",.          z
103e0 54 62 6c 2c 20 7a 49 6d 70 6f 73 74 65 72 43 6f  Tbl, zImposterCo
103f0 6c 73 2c 20 7a 49 6d 70 6f 73 74 65 72 50 4b 0a  ls, zImposterPK.
10400 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 73        );.      s
10410 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
10420 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
10430 54 52 4c 5f 49 4d 50 4f 53 54 45 52 2c 20 70 2d  TRL_IMPOSTER, p-
10440 3e 64 62 4d 61 69 6e 2c 20 22 6d 61 69 6e 22 2c  >dbMain, "main",
10450 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20 20 20 2f   0, 0);..      /
10460 2a 20 43 72 65 61 74 65 20 74 68 65 20 73 74 61  * Create the sta
10470 74 65 6d 65 6e 74 20 74 6f 20 69 6e 73 65 72 74  tement to insert
10480 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20 2a   index entries *
10490 2f 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 6e  /.      pIter->n
104a0 43 6f 6c 20 3d 20 6e 42 69 6e 64 3b 0a 20 20 20  Col = nBind;.   
104b0 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
104c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
104d0 20 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61     p->rc = prepa
104e0 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74  reFreeAndCollect
104f0 45 72 72 6f 72 28 0a 20 20 20 20 20 20 20 20 20  Error(.         
10500 20 20 20 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 70     p->dbMain, &p
10510 49 74 65 72 2d 3e 70 49 6e 73 65 72 74 2c 20 26  Iter->pInsert, &
10520 70 2d 3e 7a 45 72 72 6d 73 67 2c 0a 20 20 20 20  p->zErrmsg,.    
10530 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70        sqlite3_mp
10540 72 69 6e 74 66 28 22 49 4e 53 45 52 54 20 49 4e  rintf("INSERT IN
10550 54 4f 20 5c 22 72 62 75 5f 69 6d 70 5f 25 77 5c  TO \"rbu_imp_%w\
10560 22 20 56 41 4c 55 45 53 28 25 73 29 22 2c 20 7a  " VALUES(%s)", z
10570 54 62 6c 2c 20 7a 42 69 6e 64 29 0a 20 20 20 20  Tbl, zBind).    
10580 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a      );.      }..
10590 20 20 20 20 20 20 2f 2a 20 41 6e 64 20 74 6f 20        /* And to 
105a0 64 65 6c 65 74 65 20 69 6e 64 65 78 20 65 6e 74  delete index ent
105b0 72 69 65 73 20 2a 2f 0a 20 20 20 20 20 20 69 66  ries */.      if
105c0 28 20 72 62 75 49 73 56 61 63 75 75 6d 28 70 29  ( rbuIsVacuum(p)
105d0 3d 3d 30 20 26 26 20 70 2d 3e 72 63 3d 3d 53 51  ==0 && p->rc==SQ
105e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
105f0 20 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61     p->rc = prepa
10600 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74  reFreeAndCollect
10610 45 72 72 6f 72 28 0a 20 20 20 20 20 20 20 20 20  Error(.         
10620 20 20 20 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 70     p->dbMain, &p
10630 49 74 65 72 2d 3e 70 44 65 6c 65 74 65 2c 20 26  Iter->pDelete, &
10640 70 2d 3e 7a 45 72 72 6d 73 67 2c 0a 20 20 20 20  p->zErrmsg,.    
10650 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70        sqlite3_mp
10660 72 69 6e 74 66 28 22 44 45 4c 45 54 45 20 46 52  rintf("DELETE FR
10670 4f 4d 20 5c 22 72 62 75 5f 69 6d 70 5f 25 77 5c  OM \"rbu_imp_%w\
10680 22 20 57 48 45 52 45 20 25 73 22 2c 20 7a 54 62  " WHERE %s", zTb
10690 6c 2c 20 7a 57 68 65 72 65 29 0a 20 20 20 20 20  l, zWhere).     
106a0 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20     );.      }.. 
106b0 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74       /* Create t
106c0 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
106d0 65 6e 74 20 74 6f 20 72 65 61 64 20 6b 65 79 73  ent to read keys
106e0 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72   in sorted order
106f0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 2d   */.      if( p-
10700 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
10710 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
10720 7a 53 71 6c 3b 0a 20 20 20 20 20 20 20 20 69 66  zSql;.        if
10730 28 20 72 62 75 49 73 56 61 63 75 75 6d 28 70 29  ( rbuIsVacuum(p)
10740 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 53   ){.          zS
10750 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ql = sqlite3_mpr
10760 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20  intf(.          
10770 20 20 20 20 22 53 45 4c 45 43 54 20 25 73 2c 20      "SELECT %s, 
10780 30 20 41 53 20 72 62 75 5f 63 6f 6e 74 72 6f 6c  0 AS rbu_control
10790 20 46 52 4f 4d 20 27 25 71 27 20 4f 52 44 45 52   FROM '%q' ORDER
107a0 20 42 59 20 25 73 25 73 22 2c 0a 20 20 20 20 20   BY %s%s",.     
107b0 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 6c 69 73           zCollis
107c0 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  t, .            
107d0 20 20 70 49 74 65 72 2d 3e 7a 44 61 74 61 54 62    pIter->zDataTb
107e0 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l,.             
107f0 20 7a 43 6f 6c 6c 69 73 74 2c 20 7a 4c 69 6d 69   zCollist, zLimi
10800 74 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20  t.          );. 
10810 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20         }else..  
10820 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d        if( pIter-
10830 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 45  >eType==RBU_PK_E
10840 58 54 45 52 4e 41 4c 20 7c 7c 20 70 49 74 65 72  XTERNAL || pIter
10850 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f  ->eType==RBU_PK_
10860 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20  NONE ){.        
10870 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
10880 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20  _mprintf(.      
10890 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
108a0 25 73 2c 20 72 62 75 5f 63 6f 6e 74 72 6f 6c 20  %s, rbu_control 
108b0 46 52 4f 4d 20 25 73 2e 27 72 62 75 5f 74 6d 70  FROM %s.'rbu_tmp
108c0 5f 25 71 27 20 4f 52 44 45 52 20 42 59 20 25 73  _%q' ORDER BY %s
108d0 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %s",.           
108e0 20 20 20 7a 43 6f 6c 6c 69 73 74 2c 20 70 2d 3e     zCollist, p->
108f0 7a 53 74 61 74 65 44 62 2c 20 70 49 74 65 72 2d  zStateDb, pIter-
10900 3e 7a 44 61 74 61 54 62 6c 2c 0a 20 20 20 20 20  >zDataTbl,.     
10910 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 6c 69 73           zCollis
10920 74 2c 20 7a 4c 69 6d 69 74 0a 20 20 20 20 20 20  t, zLimit.      
10930 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7d      );.        }
10940 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
10950 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
10960 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  printf(.        
10970 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 25 73        "SELECT %s
10980 2c 20 72 62 75 5f 63 6f 6e 74 72 6f 6c 20 46 52  , rbu_control FR
10990 4f 4d 20 25 73 2e 27 72 62 75 5f 74 6d 70 5f 25  OM %s.'rbu_tmp_%
109a0 71 27 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  q' ".           
109b0 20 20 20 22 55 4e 49 4f 4e 20 41 4c 4c 20 22 0a     "UNION ALL ".
109c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 53                "S
109d0 45 4c 45 43 54 20 25 73 2c 20 72 62 75 5f 63 6f  ELECT %s, rbu_co
109e0 6e 74 72 6f 6c 20 46 52 4f 4d 20 27 25 71 27 20  ntrol FROM '%q' 
109f0 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
10a00 22 57 48 45 52 45 20 74 79 70 65 6f 66 28 72 62  "WHERE typeof(rb
10a10 75 5f 63 6f 6e 74 72 6f 6c 29 3d 27 69 6e 74 65  u_control)='inte
10a20 67 65 72 27 20 41 4e 44 20 72 62 75 5f 63 6f 6e  ger' AND rbu_con
10a30 74 72 6f 6c 21 3d 31 20 22 0a 20 20 20 20 20 20  trol!=1 ".      
10a40 20 20 20 20 20 20 20 20 22 4f 52 44 45 52 20 42          "ORDER B
10a50 59 20 25 73 25 73 22 2c 0a 20 20 20 20 20 20 20  Y %s%s",.       
10a60 20 20 20 20 20 20 20 7a 43 6f 6c 6c 69 73 74 2c         zCollist,
10a70 20 70 2d 3e 7a 53 74 61 74 65 44 62 2c 20 70 49   p->zStateDb, pI
10a80 74 65 72 2d 3e 7a 44 61 74 61 54 62 6c 2c 20 0a  ter->zDataTbl, .
10a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 43                zC
10aa0 6f 6c 6c 69 73 74 2c 20 70 49 74 65 72 2d 3e 7a  ollist, pIter->z
10ab0 44 61 74 61 54 62 6c 2c 20 0a 20 20 20 20 20 20  DataTbl, .      
10ac0 20 20 20 20 20 20 20 20 7a 43 6f 6c 6c 69 73 74          zCollist
10ad0 2c 20 7a 4c 69 6d 69 74 0a 20 20 20 20 20 20 20  , zLimit.       
10ae0 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a     );.        }.
10af0 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
10b00 70 72 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f  prepareFreeAndCo
10b10 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62  llectError(p->db
10b20 52 62 75 2c 20 26 70 49 74 65 72 2d 3e 70 53 65  Rbu, &pIter->pSe
10b30 6c 65 63 74 2c 20 70 7a 2c 20 7a 53 71 6c 29 3b  lect, pz, zSql);
10b40 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
10b50 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 49 6d  sqlite3_free(zIm
10b60 70 6f 73 74 65 72 43 6f 6c 73 29 3b 0a 20 20 20  posterCols);.   
10b70 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
10b80 7a 49 6d 70 6f 73 74 65 72 50 4b 29 3b 0a 20 20  zImposterPK);.  
10b90 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
10ba0 28 7a 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20  (zWhere);.      
10bb0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 69  sqlite3_free(zBi
10bc0 6e 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  nd);.    }else{.
10bd0 20 20 20 20 20 20 69 6e 74 20 62 52 62 75 52 6f        int bRbuRo
10be0 77 69 64 20 3d 20 28 70 49 74 65 72 2d 3e 65 54  wid = (pIter->eT
10bf0 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 56 54 41 42  ype==RBU_PK_VTAB
10c00 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
10c10 20 20 20 20 20 20 7c 7c 28 70 49 74 65 72 2d 3e        ||(pIter->
10c20 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 4e 4f  eType==RBU_PK_NO
10c30 4e 45 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  NE).            
10c40 20 20 20 20 20 20 20 20 7c 7c 28 70 49 74 65 72          ||(pIter
10c50 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f  ->eType==RBU_PK_
10c60 45 58 54 45 52 4e 41 4c 20 26 26 20 72 62 75 49  EXTERNAL && rbuI
10c70 73 56 61 63 75 75 6d 28 70 29 29 3b 0a 20 20 20  sVacuum(p));.   
10c80 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
10c90 54 62 6c 20 3d 20 70 49 74 65 72 2d 3e 7a 54 62  Tbl = pIter->zTb
10ca0 6c 3b 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c  l;       /* Tabl
10cb0 65 20 74 68 69 73 20 73 74 65 70 20 61 70 70 6c  e this step appl
10cc0 69 65 73 20 74 6f 20 2a 2f 0a 20 20 20 20 20 20  ies to */.      
10cd0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 57 72 69  const char *zWri
10ce0 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
10cf0 20 20 20 20 20 20 2f 2a 20 49 6d 70 6f 73 74 65        /* Imposte
10d00 72 20 74 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a  r table name */.
10d10 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 42 69  .      char *zBi
10d20 6e 64 69 6e 67 73 20 3d 20 72 62 75 4f 62 6a 49  ndings = rbuObjI
10d30 74 65 72 47 65 74 42 69 6e 64 6c 69 73 74 28 70  terGetBindlist(p
10d40 2c 20 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c  , pIter->nTblCol
10d50 20 2b 20 62 52 62 75 52 6f 77 69 64 29 3b 0a 20   + bRbuRowid);. 
10d60 20 20 20 20 20 63 68 61 72 20 2a 7a 57 68 65 72       char *zWher
10d70 65 20 3d 20 72 62 75 4f 62 6a 49 74 65 72 47 65  e = rbuObjIterGe
10d80 74 57 68 65 72 65 28 70 2c 20 70 49 74 65 72 29  tWhere(p, pIter)
10d90 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4f  ;.      char *zO
10da0 6c 64 6c 69 73 74 20 3d 20 72 62 75 4f 62 6a 49  ldlist = rbuObjI
10db0 74 65 72 47 65 74 4f 6c 64 6c 69 73 74 28 70 2c  terGetOldlist(p,
10dc0 20 70 49 74 65 72 2c 20 22 6f 6c 64 22 29 3b 0a   pIter, "old");.
10dd0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 65 77        char *zNew
10de0 6c 69 73 74 20 3d 20 72 62 75 4f 62 6a 49 74 65  list = rbuObjIte
10df0 72 47 65 74 4f 6c 64 6c 69 73 74 28 70 2c 20 70  rGetOldlist(p, p
10e00 49 74 65 72 2c 20 22 6e 65 77 22 29 3b 0a 0a 20  Iter, "new");.. 
10e10 20 20 20 20 20 7a 43 6f 6c 6c 69 73 74 20 3d 20       zCollist = 
10e20 72 62 75 4f 62 6a 49 74 65 72 47 65 74 43 6f 6c  rbuObjIterGetCol
10e30 6c 69 73 74 28 70 2c 20 70 49 74 65 72 29 3b 0a  list(p, pIter);.
10e40 20 20 20 20 20 20 70 49 74 65 72 2d 3e 6e 43 6f        pIter->nCo
10e50 6c 20 3d 20 70 49 74 65 72 2d 3e 6e 54 62 6c 43  l = pIter->nTblC
10e60 6f 6c 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 72  ol;..      /* Cr
10e70 65 61 74 65 20 74 68 65 20 69 6d 70 6f 73 74 65  eate the imposte
10e80 72 20 74 61 62 6c 65 20 6f 72 20 74 61 62 6c 65  r table or table
10e90 73 20 28 69 66 20 72 65 71 75 69 72 65 64 29 2e  s (if required).
10ea0 20 2a 2f 0a 20 20 20 20 20 20 72 62 75 43 72 65   */.      rbuCre
10eb0 61 74 65 49 6d 70 6f 73 74 65 72 54 61 62 6c 65  ateImposterTable
10ec0 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  (p, pIter);.    
10ed0 20 20 72 62 75 43 72 65 61 74 65 49 6d 70 6f 73    rbuCreateImpos
10ee0 74 65 72 54 61 62 6c 65 32 28 70 2c 20 70 49 74  terTable2(p, pIt
10ef0 65 72 29 3b 0a 20 20 20 20 20 20 7a 57 72 69 74  er);.      zWrit
10f00 65 20 3d 20 28 70 49 74 65 72 2d 3e 65 54 79 70  e = (pIter->eTyp
10f10 65 3d 3d 52 42 55 5f 50 4b 5f 56 54 41 42 20 3f  e==RBU_PK_VTAB ?
10f20 20 22 22 20 3a 20 22 72 62 75 5f 69 6d 70 5f 22   "" : "rbu_imp_"
10f30 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 72 65  );..      /* Cre
10f40 61 74 65 20 74 68 65 20 49 4e 53 45 52 54 20 73  ate the INSERT s
10f50 74 61 74 65 6d 65 6e 74 20 74 6f 20 77 72 69 74  tatement to writ
10f60 65 20 74 6f 20 74 68 65 20 74 61 72 67 65 74 20  e to the target 
10f70 50 4b 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 20  PK b-tree */.   
10f80 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
10f90 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
10fa0 20 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61     p->rc = prepa
10fb0 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74  reFreeAndCollect
10fc0 45 72 72 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c  Error(p->dbMain,
10fd0 20 26 70 49 74 65 72 2d 3e 70 49 6e 73 65 72 74   &pIter->pInsert
10fe0 2c 20 70 7a 2c 0a 20 20 20 20 20 20 20 20 20 20  , pz,.          
10ff0 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74    sqlite3_mprint
11000 66 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  f(.             
11010 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 5c 22   "INSERT INTO \"
11020 25 73 25 77 5c 22 28 25 73 25 73 29 20 56 41 4c  %s%w\"(%s%s) VAL
11030 55 45 53 28 25 73 29 22 2c 20 0a 20 20 20 20 20  UES(%s)", .     
11040 20 20 20 20 20 20 20 20 20 7a 57 72 69 74 65 2c           zWrite,
11050 20 7a 54 62 6c 2c 20 7a 43 6f 6c 6c 69 73 74 2c   zTbl, zCollist,
11060 20 28 62 52 62 75 52 6f 77 69 64 20 3f 20 22 2c   (bRbuRowid ? ",
11070 20 5f 72 6f 77 69 64 5f 22 20 3a 20 22 22 29 2c   _rowid_" : ""),
11080 20 7a 42 69 6e 64 69 6e 67 73 0a 20 20 20 20 20   zBindings.     
11090 20 20 20 20 20 20 20 29 0a 20 20 20 20 20 20 20         ).       
110a0 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20   );.      }..   
110b0 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65     /* Create the
110c0 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e   DELETE statemen
110d0 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68  t to write to th
110e0 65 20 74 61 72 67 65 74 20 50 4b 20 62 2d 74 72  e target PK b-tr
110f0 65 65 2e 0a 20 20 20 20 20 20 2a 2a 20 42 65 63  ee..      ** Bec
11100 61 75 73 65 20 69 74 20 6f 6e 6c 79 20 70 65 72  ause it only per
11110 66 6f 72 6d 73 20 49 4e 53 45 52 54 20 6f 70 65  forms INSERT ope
11120 72 61 74 69 6f 6e 73 2c 20 74 68 69 73 20 69 73  rations, this is
11130 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20 66 6f   not required fo
11140 72 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20 72 62  r.      ** an rb
11150 75 20 76 61 63 75 75 6d 20 68 61 6e 64 6c 65 2e  u vacuum handle.
11160 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 72    */.      if( r
11170 62 75 49 73 56 61 63 75 75 6d 28 70 29 3d 3d 30  buIsVacuum(p)==0
11180 20 26 26 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54   && p->rc==SQLIT
11190 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
111a0 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65 46  p->rc = prepareF
111b0 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72  reeAndCollectErr
111c0 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 70  or(p->dbMain, &p
111d0 49 74 65 72 2d 3e 70 44 65 6c 65 74 65 2c 20 70  Iter->pDelete, p
111e0 7a 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  z,.            s
111f0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a  qlite3_mprintf(.
11200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 44                "D
11210 45 4c 45 54 45 20 46 52 4f 4d 20 5c 22 25 73 25  ELETE FROM \"%s%
11220 77 5c 22 20 57 48 45 52 45 20 25 73 22 2c 20 7a  w\" WHERE %s", z
11230 57 72 69 74 65 2c 20 7a 54 62 6c 2c 20 7a 57 68  Write, zTbl, zWh
11240 65 72 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  ere.            
11250 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  ).        );.   
11260 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
11270 72 62 75 49 73 56 61 63 75 75 6d 28 70 29 3d 3d  rbuIsVacuum(p)==
11280 30 20 26 26 20 70 49 74 65 72 2d 3e 61 62 49 6e  0 && pIter->abIn
11290 64 65 78 65 64 20 29 7b 0a 20 20 20 20 20 20 20  dexed ){.       
112a0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 62   const char *zRb
112b0 75 52 6f 77 69 64 20 3d 20 22 22 3b 0a 20 20 20  uRowid = "";.   
112c0 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e       if( pIter->
112d0 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 45 58  eType==RBU_PK_EX
112e0 54 45 52 4e 41 4c 20 7c 7c 20 70 49 74 65 72 2d  TERNAL || pIter-
112f0 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 4e  >eType==RBU_PK_N
11300 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ONE ){.         
11310 20 7a 52 62 75 52 6f 77 69 64 20 3d 20 22 2c 20   zRbuRowid = ", 
11320 72 62 75 5f 72 6f 77 69 64 22 3b 0a 20 20 20 20  rbu_rowid";.    
11330 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
11340 2a 20 43 72 65 61 74 65 20 74 68 65 20 72 62 75  * Create the rbu
11350 5f 74 6d 70 5f 78 78 78 20 74 61 62 6c 65 20 61  _tmp_xxx table a
11360 6e 64 20 74 68 65 20 74 72 69 67 67 65 72 73 20  nd the triggers 
11370 74 6f 20 70 6f 70 75 6c 61 74 65 20 69 74 2e 20  to populate it. 
11380 2a 2f 0a 20 20 20 20 20 20 20 20 72 62 75 4d 50  */.        rbuMP
11390 72 69 6e 74 66 45 78 65 63 28 70 2c 20 70 2d 3e  rintfExec(p, p->
113a0 64 62 52 62 75 2c 0a 20 20 20 20 20 20 20 20 20  dbRbu,.         
113b0 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45     "CREATE TABLE
113c0 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20 25   IF NOT EXISTS %
113d0 73 2e 27 72 62 75 5f 74 6d 70 5f 25 71 27 20 41  s.'rbu_tmp_%q' A
113e0 53 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  S ".            
113f0 22 53 45 4c 45 43 54 20 2a 25 73 20 46 52 4f 4d  "SELECT *%s FROM
11400 20 27 25 71 27 20 57 48 45 52 45 20 30 3b 22 0a   '%q' WHERE 0;".
11410 20 20 20 20 20 20 20 20 20 20 20 20 2c 20 70 2d              , p-
11420 3e 7a 53 74 61 74 65 44 62 2c 20 70 49 74 65 72  >zStateDb, pIter
11430 2d 3e 7a 44 61 74 61 54 62 6c 0a 20 20 20 20 20  ->zDataTbl.     
11440 20 20 20 20 20 20 20 2c 20 28 70 49 74 65 72 2d         , (pIter-
11450 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 45  >eType==RBU_PK_E
11460 58 54 45 52 4e 41 4c 20 3f 20 22 2c 20 30 20 41  XTERNAL ? ", 0 A
11470 53 20 72 62 75 5f 72 6f 77 69 64 22 20 3a 20 22  S rbu_rowid" : "
11480 22 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 2c  ").            ,
11490 20 70 49 74 65 72 2d 3e 7a 44 61 74 61 54 62 6c   pIter->zDataTbl
114a0 0a 20 20 20 20 20 20 20 20 29 3b 0a 0a 20 20 20  .        );..   
114b0 20 20 20 20 20 72 62 75 4d 50 72 69 6e 74 66 45       rbuMPrintfE
114c0 78 65 63 28 70 2c 20 70 2d 3e 64 62 4d 61 69 6e  xec(p, p->dbMain
114d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 43  ,.            "C
114e0 52 45 41 54 45 20 54 45 4d 50 20 54 52 49 47 47  REATE TEMP TRIGG
114f0 45 52 20 72 62 75 5f 64 65 6c 65 74 65 5f 74 72  ER rbu_delete_tr
11500 20 42 45 46 4f 52 45 20 44 45 4c 45 54 45 20 4f   BEFORE DELETE O
11510 4e 20 5c 22 25 73 25 77 5c 22 20 22 0a 20 20 20  N \"%s%w\" ".   
11520 20 20 20 20 20 20 20 20 20 22 42 45 47 49 4e 20           "BEGIN 
11530 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 20  ".            " 
11540 20 53 45 4c 45 43 54 20 72 62 75 5f 74 6d 70 5f   SELECT rbu_tmp_
11550 69 6e 73 65 72 74 28 33 2c 20 25 73 29 3b 22 0a  insert(3, %s);".
11560 20 20 20 20 20 20 20 20 20 20 20 20 22 45 4e 44              "END
11570 3b 22 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20  ;"..            
11580 22 43 52 45 41 54 45 20 54 45 4d 50 20 54 52 49  "CREATE TEMP TRI
11590 47 47 45 52 20 72 62 75 5f 75 70 64 61 74 65 31  GGER rbu_update1
115a0 5f 74 72 20 42 45 46 4f 52 45 20 55 50 44 41 54  _tr BEFORE UPDAT
115b0 45 20 4f 4e 20 5c 22 25 73 25 77 5c 22 20 22 0a  E ON \"%s%w\" ".
115c0 20 20 20 20 20 20 20 20 20 20 20 20 22 42 45 47              "BEG
115d0 49 4e 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  IN ".           
115e0 20 22 20 20 53 45 4c 45 43 54 20 72 62 75 5f 74   "  SELECT rbu_t
115f0 6d 70 5f 69 6e 73 65 72 74 28 33 2c 20 25 73 29  mp_insert(3, %s)
11600 3b 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  ;".            "
11610 45 4e 44 3b 22 0a 0a 20 20 20 20 20 20 20 20 20  END;"..         
11620 20 20 20 22 43 52 45 41 54 45 20 54 45 4d 50 20     "CREATE TEMP 
11630 54 52 49 47 47 45 52 20 72 62 75 5f 75 70 64 61  TRIGGER rbu_upda
11640 74 65 32 5f 74 72 20 41 46 54 45 52 20 55 50 44  te2_tr AFTER UPD
11650 41 54 45 20 4f 4e 20 5c 22 25 73 25 77 5c 22 20  ATE ON \"%s%w\" 
11660 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 42  ".            "B
11670 45 47 49 4e 20 22 0a 20 20 20 20 20 20 20 20 20  EGIN ".         
11680 20 20 20 22 20 20 53 45 4c 45 43 54 20 72 62 75     "  SELECT rbu
11690 5f 74 6d 70 5f 69 6e 73 65 72 74 28 34 2c 20 25  _tmp_insert(4, %
116a0 73 29 3b 22 0a 20 20 20 20 20 20 20 20 20 20 20  s);".           
116b0 20 22 45 4e 44 3b 22 2c 0a 20 20 20 20 20 20 20   "END;",.       
116c0 20 20 20 20 20 7a 57 72 69 74 65 2c 20 7a 54 62       zWrite, zTb
116d0 6c 2c 20 7a 4f 6c 64 6c 69 73 74 2c 0a 20 20 20  l, zOldlist,.   
116e0 20 20 20 20 20 20 20 20 20 7a 57 72 69 74 65 2c           zWrite,
116f0 20 7a 54 62 6c 2c 20 7a 4f 6c 64 6c 69 73 74 2c   zTbl, zOldlist,
11700 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 57 72  .            zWr
11710 69 74 65 2c 20 7a 54 62 6c 2c 20 7a 4e 65 77 6c  ite, zTbl, zNewl
11720 69 73 74 0a 20 20 20 20 20 20 20 20 29 3b 0a 0a  ist.        );..
11730 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65          if( pIte
11740 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b  r->eType==RBU_PK
11750 5f 45 58 54 45 52 4e 41 4c 20 7c 7c 20 70 49 74  _EXTERNAL || pIt
11760 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50  er->eType==RBU_P
11770 4b 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  K_NONE ){.      
11780 20 20 20 20 72 62 75 4d 50 72 69 6e 74 66 45 78      rbuMPrintfEx
11790 65 63 28 70 2c 20 70 2d 3e 64 62 4d 61 69 6e 2c  ec(p, p->dbMain,
117a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
117b0 43 52 45 41 54 45 20 54 45 4d 50 20 54 52 49 47  CREATE TEMP TRIG
117c0 47 45 52 20 72 62 75 5f 69 6e 73 65 72 74 5f 74  GER rbu_insert_t
117d0 72 20 41 46 54 45 52 20 49 4e 53 45 52 54 20 4f  r AFTER INSERT O
117e0 4e 20 5c 22 25 73 25 77 5c 22 20 22 0a 20 20 20  N \"%s%w\" ".   
117f0 20 20 20 20 20 20 20 20 20 20 20 22 42 45 47 49             "BEGI
11800 4e 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  N ".            
11810 20 20 22 20 20 53 45 4c 45 43 54 20 72 62 75 5f    "  SELECT rbu_
11820 74 6d 70 5f 69 6e 73 65 72 74 28 30 2c 20 25 73  tmp_insert(0, %s
11830 29 3b 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  );".            
11840 20 20 22 45 4e 44 3b 22 2c 0a 20 20 20 20 20 20    "END;",.      
11850 20 20 20 20 20 20 20 20 7a 57 72 69 74 65 2c 20          zWrite, 
11860 7a 54 62 6c 2c 20 7a 4e 65 77 6c 69 73 74 0a 20  zTbl, zNewlist. 
11870 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
11880 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 72      }..        r
11890 62 75 4f 62 6a 49 74 65 72 50 72 65 70 61 72 65  buObjIterPrepare
118a0 54 6d 70 49 6e 73 65 72 74 28 70 2c 20 70 49 74  TmpInsert(p, pIt
118b0 65 72 2c 20 7a 43 6f 6c 6c 69 73 74 2c 20 7a 52  er, zCollist, zR
118c0 62 75 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  buRowid);.      
118d0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 72 65 61  }..      /* Crea
118e0 74 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  te the SELECT st
118f0 61 74 65 6d 65 6e 74 20 74 6f 20 72 65 61 64 20  atement to read 
11900 6b 65 79 73 20 66 72 6f 6d 20 64 61 74 61 5f 78  keys from data_x
11910 78 78 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  xx */.      if( 
11920 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
11930 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73   ){.        cons
11940 74 20 63 68 61 72 20 2a 7a 52 62 75 52 6f 77 69  t char *zRbuRowi
11950 64 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 20 20  d = "";.        
11960 69 66 28 20 62 52 62 75 52 6f 77 69 64 20 29 7b  if( bRbuRowid ){
11970 0a 20 20 20 20 20 20 20 20 20 20 7a 52 62 75 52  .          zRbuR
11980 6f 77 69 64 20 3d 20 72 62 75 49 73 56 61 63 75  owid = rbuIsVacu
11990 75 6d 28 70 29 20 3f 20 22 2c 5f 72 6f 77 69 64  um(p) ? ",_rowid
119a0 5f 20 22 20 3a 20 22 2c 72 62 75 5f 72 6f 77 69  _ " : ",rbu_rowi
119b0 64 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  d";.        }.  
119c0 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 72        p->rc = pr
119d0 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c  epareFreeAndColl
119e0 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 52 62  ectError(p->dbRb
119f0 75 2c 20 26 70 49 74 65 72 2d 3e 70 53 65 6c 65  u, &pIter->pSele
11a00 63 74 2c 20 70 7a 2c 0a 20 20 20 20 20 20 20 20  ct, pz,.        
11a10 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69      sqlite3_mpri
11a20 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 20  ntf(.           
11a30 20 20 20 22 53 45 4c 45 43 54 20 25 73 2c 25 73     "SELECT %s,%s
11a40 20 72 62 75 5f 63 6f 6e 74 72 6f 6c 25 73 20 46   rbu_control%s F
11a50 52 4f 4d 20 27 25 71 27 25 73 22 2c 20 0a 20 20  ROM '%q'%s", .  
11a60 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c              zCol
11a70 6c 69 73 74 2c 20 0a 20 20 20 20 20 20 20 20 20  list, .         
11a80 20 20 20 20 20 28 72 62 75 49 73 56 61 63 75 75       (rbuIsVacuu
11a90 6d 28 70 29 20 3f 20 22 30 20 41 53 20 22 20 3a  m(p) ? "0 AS " :
11aa0 20 22 22 29 2c 0a 20 20 20 20 20 20 20 20 20 20   ""),.          
11ab0 20 20 20 20 7a 52 62 75 52 6f 77 69 64 2c 0a 20      zRbuRowid,. 
11ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74               pIt
11ad0 65 72 2d 3e 7a 44 61 74 61 54 62 6c 2c 20 7a 4c  er->zDataTbl, zL
11ae0 69 6d 69 74 0a 20 20 20 20 20 20 20 20 20 20 20  imit.           
11af0 20 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20   ).        );.  
11b00 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 73 71 6c      }..      sql
11b10 69 74 65 33 5f 66 72 65 65 28 7a 57 68 65 72 65  ite3_free(zWhere
11b20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
11b30 5f 66 72 65 65 28 7a 4f 6c 64 6c 69 73 74 29 3b  _free(zOldlist);
11b40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
11b50 72 65 65 28 7a 4e 65 77 6c 69 73 74 29 3b 0a 20  ree(zNewlist);. 
11b60 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
11b70 65 28 7a 42 69 6e 64 69 6e 67 73 29 3b 0a 20 20  e(zBindings);.  
11b80 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
11b90 66 72 65 65 28 7a 43 6f 6c 6c 69 73 74 29 3b 0a  free(zCollist);.
11ba0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
11bb0 28 7a 4c 69 6d 69 74 29 3b 0a 20 20 7d 0a 20 20  (zLimit);.  }.  
11bc0 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 3b  .  return p->rc;
11bd0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 6f 75  .}../*.** Set ou
11be0 74 70 75 74 20 76 61 72 69 61 62 6c 65 20 2a 70  tput variable *p
11bf0 70 53 74 6d 74 20 74 6f 20 70 6f 69 6e 74 20 74  pStmt to point t
11c00 6f 20 61 6e 20 55 50 44 41 54 45 20 73 74 61 74  o an UPDATE stat
11c10 65 6d 65 6e 74 20 74 68 61 74 20 6d 61 79 0a 2a  ement that may.*
11c20 2a 20 62 65 20 75 73 65 64 20 74 6f 20 75 70 64  * be used to upd
11c30 61 74 65 20 74 68 65 20 69 6d 70 6f 73 74 65 72  ate the imposter
11c40 20 74 61 62 6c 65 20 66 6f 72 20 74 68 65 20 6d   table for the m
11c50 61 69 6e 20 74 61 62 6c 65 20 62 2d 74 72 65 65  ain table b-tree
11c60 20 6f 66 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65   of the.** table
11c70 20 6f 62 6a 65 63 74 20 74 68 61 74 20 70 49 74   object that pIt
11c80 65 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  er currently poi
11c90 6e 74 73 20 74 6f 2c 20 61 73 73 75 6d 69 6e 67  nts to, assuming
11ca0 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 72 62   that the .** rb
11cb0 75 5f 63 6f 6e 74 72 6f 6c 20 63 6f 6c 75 6d 6e  u_control column
11cc0 20 6f 66 20 74 68 65 20 64 61 74 61 5f 78 79 7a   of the data_xyz
11cd0 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20   table contains 
11ce0 7a 4d 61 73 6b 2e 0a 2a 2a 20 0a 2a 2a 20 49 66  zMask..** .** If
11cf0 20 74 68 65 20 7a 4d 61 73 6b 20 73 74 72 69 6e   the zMask strin
11d00 67 20 64 6f 65 73 20 6e 6f 74 20 73 70 65 63 69  g does not speci
11d10 66 79 20 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 74  fy any columns t
11d20 6f 20 75 70 64 61 74 65 2c 20 74 68 65 6e 20 74  o update, then t
11d30 68 69 73 0a 2a 2a 20 69 73 20 6e 6f 74 20 61 6e  his.** is not an
11d40 20 65 72 72 6f 72 2e 20 4f 75 74 70 75 74 20 76   error. Output v
11d50 61 72 69 61 62 6c 65 20 2a 70 70 53 74 6d 74 20  ariable *ppStmt 
11d60 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69  is set to NULL i
11d70 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a  n this case..*/.
11d80 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 47 65  static int rbuGe
11d90 74 55 70 64 61 74 65 53 74 6d 74 28 0a 20 20 73  tUpdateStmt(.  s
11da0 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 20 20  qlite3rbu *p,   
11db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11dc0 2a 20 52 42 55 20 68 61 6e 64 6c 65 20 2a 2f 0a  * RBU handle */.
11dd0 20 20 52 62 75 4f 62 6a 49 74 65 72 20 2a 70 49    RbuObjIter *pI
11de0 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ter,            
11df0 20 20 2f 2a 20 4f 62 6a 65 63 74 20 69 74 65 72    /* Object iter
11e00 61 74 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ator */.  const 
11e10 63 68 61 72 20 2a 7a 4d 61 73 6b 2c 20 20 20 20  char *zMask,    
11e20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72 62 75            /* rbu
11e30 5f 63 6f 6e 74 72 6f 6c 20 76 61 6c 75 65 20 28  _control value (
11e40 27 78 2e 78 2e 27 29 20 2a 2f 0a 20 20 73 71 6c  'x.x.') */.  sql
11e50 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74  ite3_stmt **ppSt
11e60 6d 74 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  mt           /* 
11e70 4f 55 54 3a 20 55 50 44 41 54 45 20 73 74 61 74  OUT: UPDATE stat
11e80 65 6d 65 6e 74 20 68 61 6e 64 6c 65 20 2a 2f 0a  ement handle */.
11e90 29 7b 0a 20 20 52 62 75 55 70 64 61 74 65 53 74  ){.  RbuUpdateSt
11ea0 6d 74 20 2a 2a 70 70 3b 0a 20 20 52 62 75 55 70  mt **pp;.  RbuUp
11eb0 64 61 74 65 53 74 6d 74 20 2a 70 55 70 20 3d 20  dateStmt *pUp = 
11ec0 30 3b 0a 20 20 69 6e 74 20 6e 55 70 20 3d 20 30  0;.  int nUp = 0
11ed0 3b 0a 0a 20 20 2f 2a 20 49 6e 20 63 61 73 65 20  ;..  /* In case 
11ee0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
11ef0 2a 2f 0a 20 20 2a 70 70 53 74 6d 74 20 3d 20 30  */.  *ppStmt = 0
11f00 3b 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20 66  ;..  /* Search f
11f10 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20 73  or an existing s
11f20 74 61 74 65 6d 65 6e 74 2e 20 49 66 20 6f 6e 65  tatement. If one
11f30 20 69 73 20 66 6f 75 6e 64 2c 20 73 68 69 66 74   is found, shift
11f40 20 69 74 20 74 6f 20 74 68 65 20 66 72 6f 6e 74   it to the front
11f50 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 4c 52 55  .  ** of the LRU
11f60 20 71 75 65 75 65 20 61 6e 64 20 72 65 74 75 72   queue and retur
11f70 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 4f  n immediately. O
11f80 74 68 65 72 77 69 73 65 2c 20 6c 65 61 76 65 20  therwise, leave 
11f90 6e 55 70 20 70 6f 69 6e 74 69 6e 67 0a 20 20 2a  nUp pointing.  *
11fa0 2a 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  * to the number 
11fb0 6f 66 20 73 74 61 74 65 6d 65 6e 74 73 20 63 75  of statements cu
11fc0 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 63  rrently in the c
11fd0 61 63 68 65 20 61 6e 64 20 70 55 70 20 74 6f 20  ache and pUp to 
11fe0 74 68 65 0a 20 20 2a 2a 20 6c 61 73 74 20 6f 62  the.  ** last ob
11ff0 6a 65 63 74 20 69 6e 20 74 68 65 20 6c 69 73 74  ject in the list
12000 2e 20 20 2a 2f 0a 20 20 66 6f 72 28 70 70 3d 26  .  */.  for(pp=&
12010 70 49 74 65 72 2d 3e 70 52 62 75 55 70 64 61 74  pIter->pRbuUpdat
12020 65 3b 20 2a 70 70 3b 20 70 70 3d 26 28 28 2a 70  e; *pp; pp=&((*p
12030 70 29 2d 3e 70 4e 65 78 74 29 29 7b 0a 20 20 20  p)->pNext)){.   
12040 20 70 55 70 20 3d 20 2a 70 70 3b 0a 20 20 20 20   pUp = *pp;.    
12050 69 66 28 20 73 74 72 63 6d 70 28 70 55 70 2d 3e  if( strcmp(pUp->
12060 7a 4d 61 73 6b 2c 20 7a 4d 61 73 6b 29 3d 3d 30  zMask, zMask)==0
12070 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 20 3d 20   ){.      *pp = 
12080 70 55 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  pUp->pNext;.    
12090 20 20 70 55 70 2d 3e 70 4e 65 78 74 20 3d 20 70    pUp->pNext = p
120a0 49 74 65 72 2d 3e 70 52 62 75 55 70 64 61 74 65  Iter->pRbuUpdate
120b0 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70  ;.      pIter->p
120c0 52 62 75 55 70 64 61 74 65 20 3d 20 70 55 70 3b  RbuUpdate = pUp;
120d0 0a 20 20 20 20 20 20 2a 70 70 53 74 6d 74 20 3d  .      *ppStmt =
120e0 20 70 55 70 2d 3e 70 55 70 64 61 74 65 3b 20 0a   pUp->pUpdate; .
120f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
12100 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
12110 20 20 6e 55 70 2b 2b 3b 0a 20 20 7d 0a 20 20 61    nUp++;.  }.  a
12120 73 73 65 72 74 28 20 70 55 70 3d 3d 30 20 7c 7c  ssert( pUp==0 ||
12130 20 70 55 70 2d 3e 70 4e 65 78 74 3d 3d 30 20 29   pUp->pNext==0 )
12140 3b 0a 0a 20 20 69 66 28 20 6e 55 70 3e 3d 53 51  ;..  if( nUp>=SQ
12150 4c 49 54 45 5f 52 42 55 5f 55 50 44 41 54 45 5f  LITE_RBU_UPDATE_
12160 43 41 43 48 45 53 49 5a 45 20 29 7b 0a 20 20 20  CACHESIZE ){.   
12170 20 66 6f 72 28 70 70 3d 26 70 49 74 65 72 2d 3e   for(pp=&pIter->
12180 70 52 62 75 55 70 64 61 74 65 3b 20 2a 70 70 21  pRbuUpdate; *pp!
12190 3d 70 55 70 3b 20 70 70 3d 26 28 28 2a 70 70 29  =pUp; pp=&((*pp)
121a0 2d 3e 70 4e 65 78 74 29 29 3b 0a 20 20 20 20 2a  ->pNext));.    *
121b0 70 70 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  pp = 0;.    sqli
121c0 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 55 70  te3_finalize(pUp
121d0 2d 3e 70 55 70 64 61 74 65 29 3b 0a 20 20 20 20  ->pUpdate);.    
121e0 70 55 70 2d 3e 70 55 70 64 61 74 65 20 3d 20 30  pUp->pUpdate = 0
121f0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
12200 55 70 20 3d 20 28 52 62 75 55 70 64 61 74 65 53  Up = (RbuUpdateS
12210 74 6d 74 2a 29 72 62 75 4d 61 6c 6c 6f 63 28 70  tmt*)rbuMalloc(p
12220 2c 20 73 69 7a 65 6f 66 28 52 62 75 55 70 64 61  , sizeof(RbuUpda
12230 74 65 53 74 6d 74 29 2b 70 49 74 65 72 2d 3e 6e  teStmt)+pIter->n
12240 54 62 6c 43 6f 6c 2b 31 29 3b 0a 20 20 7d 0a 0a  TblCol+1);.  }..
12250 20 20 69 66 28 20 70 55 70 20 29 7b 0a 20 20 20    if( pUp ){.   
12260 20 63 68 61 72 20 2a 7a 57 68 65 72 65 20 3d 20   char *zWhere = 
12270 72 62 75 4f 62 6a 49 74 65 72 47 65 74 57 68 65  rbuObjIterGetWhe
12280 72 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  re(p, pIter);.  
12290 20 20 63 68 61 72 20 2a 7a 53 65 74 20 3d 20 72    char *zSet = r
122a0 62 75 4f 62 6a 49 74 65 72 47 65 74 53 65 74 6c  buObjIterGetSetl
122b0 69 73 74 28 70 2c 20 70 49 74 65 72 2c 20 7a 4d  ist(p, pIter, zM
122c0 61 73 6b 29 3b 0a 20 20 20 20 63 68 61 72 20 2a  ask);.    char *
122d0 7a 55 70 64 61 74 65 20 3d 20 30 3b 0a 0a 20 20  zUpdate = 0;..  
122e0 20 20 70 55 70 2d 3e 7a 4d 61 73 6b 20 3d 20 28    pUp->zMask = (
122f0 63 68 61 72 2a 29 26 70 55 70 5b 31 5d 3b 0a 20  char*)&pUp[1];. 
12300 20 20 20 6d 65 6d 63 70 79 28 70 55 70 2d 3e 7a     memcpy(pUp->z
12310 4d 61 73 6b 2c 20 7a 4d 61 73 6b 2c 20 70 49 74  Mask, zMask, pIt
12320 65 72 2d 3e 6e 54 62 6c 43 6f 6c 29 3b 0a 20 20  er->nTblCol);.  
12330 20 20 70 55 70 2d 3e 70 4e 65 78 74 20 3d 20 70    pUp->pNext = p
12340 49 74 65 72 2d 3e 70 52 62 75 55 70 64 61 74 65  Iter->pRbuUpdate
12350 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70 52 62  ;.    pIter->pRb
12360 75 55 70 64 61 74 65 20 3d 20 70 55 70 3b 0a 0a  uUpdate = pUp;..
12370 20 20 20 20 69 66 28 20 7a 53 65 74 20 29 7b 0a      if( zSet ){.
12380 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
12390 20 2a 7a 50 72 65 66 69 78 20 3d 20 22 22 3b 0a   *zPrefix = "";.
123a0 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72  .      if( pIter
123b0 2d 3e 65 54 79 70 65 21 3d 52 42 55 5f 50 4b 5f  ->eType!=RBU_PK_
123c0 56 54 41 42 20 29 20 7a 50 72 65 66 69 78 20 3d  VTAB ) zPrefix =
123d0 20 22 72 62 75 5f 69 6d 70 5f 22 3b 0a 20 20 20   "rbu_imp_";.   
123e0 20 20 20 7a 55 70 64 61 74 65 20 3d 20 73 71 6c     zUpdate = sql
123f0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 55 50  ite3_mprintf("UP
12400 44 41 54 45 20 5c 22 25 73 25 77 5c 22 20 53 45  DATE \"%s%w\" SE
12410 54 20 25 73 20 57 48 45 52 45 20 25 73 22 2c 20  T %s WHERE %s", 
12420 0a 20 20 20 20 20 20 20 20 20 20 7a 50 72 65 66  .          zPref
12430 69 78 2c 20 70 49 74 65 72 2d 3e 7a 54 62 6c 2c  ix, pIter->zTbl,
12440 20 7a 53 65 74 2c 20 7a 57 68 65 72 65 0a 20 20   zSet, zWhere.  
12450 20 20 20 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e      );.      p->
12460 72 63 20 3d 20 70 72 65 70 61 72 65 46 72 65 65  rc = prepareFree
12470 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28  AndCollectError(
12480 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 64 62  .          p->db
12490 4d 61 69 6e 2c 20 26 70 55 70 2d 3e 70 55 70 64  Main, &pUp->pUpd
124a0 61 74 65 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67  ate, &p->zErrmsg
124b0 2c 20 7a 55 70 64 61 74 65 0a 20 20 20 20 20 20  , zUpdate.      
124c0 29 3b 0a 20 20 20 20 20 20 2a 70 70 53 74 6d 74  );.      *ppStmt
124d0 20 3d 20 70 55 70 2d 3e 70 55 70 64 61 74 65 3b   = pUp->pUpdate;
124e0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
124f0 65 33 5f 66 72 65 65 28 7a 57 68 65 72 65 29 3b  e3_free(zWhere);
12500 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
12510 65 28 7a 53 65 74 29 3b 0a 20 20 7d 0a 0a 20 20  e(zSet);.  }..  
12520 72 65 74 75 72 6e 20 70 2d 3e 72 63 3b 0a 7d 0a  return p->rc;.}.
12530 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 20  .static sqlite3 
12540 2a 72 62 75 4f 70 65 6e 44 62 68 61 6e 64 6c 65  *rbuOpenDbhandle
12550 28 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20 2a  (.  sqlite3rbu *
12560 70 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  p, .  const char
12570 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 69 6e 74 20   *zName, .  int 
12580 62 55 73 65 56 66 73 0a 29 7b 0a 20 20 73 71 6c  bUseVfs.){.  sql
12590 69 74 65 33 20 2a 64 62 20 3d 20 30 3b 0a 20 20  ite3 *db = 0;.  
125a0 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
125b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 6f 6e 73  E_OK ){.    cons
125c0 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 53 51  t int flags = SQ
125d0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
125e0 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ITE|SQLITE_OPEN_
125f0 43 52 45 41 54 45 7c 53 51 4c 49 54 45 5f 4f 50  CREATE|SQLITE_OP
12600 45 4e 5f 55 52 49 3b 0a 20 20 20 20 70 2d 3e 72  EN_URI;.    p->r
12610 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  c = sqlite3_open
12620 5f 76 32 28 7a 4e 61 6d 65 2c 20 26 64 62 2c 20  _v2(zName, &db, 
12630 66 6c 61 67 73 2c 20 62 55 73 65 56 66 73 20 3f  flags, bUseVfs ?
12640 20 70 2d 3e 7a 56 66 73 4e 61 6d 65 20 3a 20 30   p->zVfsName : 0
12650 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  );.    if( p->rc
12660 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 7a 45 72   ){.      p->zEr
12670 72 6d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  rmsg = sqlite3_m
12680 70 72 69 6e 74 66 28 22 25 73 22 2c 20 73 71 6c  printf("%s", sql
12690 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29  ite3_errmsg(db))
126a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
126b0 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20 20 20 20  close(db);.     
126c0 20 64 62 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20   db = 0;.    }. 
126d0 20 7d 0a 20 20 72 65 74 75 72 6e 20 64 62 3b 0a   }.  return db;.
126e0 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e  }../*.** Free an
126f0 20 52 62 75 53 74 61 74 65 20 6f 62 6a 65 63 74   RbuState object
12700 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 72 62   allocated by rb
12710 75 4c 6f 61 64 53 74 61 74 65 28 29 2e 0a 2a 2f  uLoadState()..*/
12720 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75  .static void rbu
12730 46 72 65 65 53 74 61 74 65 28 52 62 75 53 74 61  FreeState(RbuSta
12740 74 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20  te *p){.  if( p 
12750 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
12760 72 65 65 28 70 2d 3e 7a 54 62 6c 29 3b 0a 20 20  ree(p->zTbl);.  
12770 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
12780 2d 3e 7a 49 64 78 29 3b 0a 20 20 20 20 73 71 6c  ->zIdx);.    sql
12790 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
127a0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  }.}../*.** Alloc
127b0 61 74 65 20 61 6e 20 52 62 75 53 74 61 74 65 20  ate an RbuState 
127c0 6f 62 6a 65 63 74 20 61 6e 64 20 6c 6f 61 64 20  object and load 
127d0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
127e0 74 68 65 20 72 62 75 5f 73 74 61 74 65 20 0a 2a  the rbu_state .*
127f0 2a 20 74 61 62 6c 65 20 69 6e 74 6f 20 69 74 2e  * table into it.
12800 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
12810 72 20 74 6f 20 74 68 65 20 6e 65 77 20 6f 62 6a  r to the new obj
12820 65 63 74 2e 20 49 74 20 69 73 20 74 68 65 20 0a  ect. It is the .
12830 2a 2a 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  ** responsibilit
12840 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20  y of the caller 
12850 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72  to eventually fr
12860 65 65 20 74 68 65 20 6f 62 6a 65 63 74 20 75 73  ee the object us
12870 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66  ing.** sqlite3_f
12880 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ree()..**.** If 
12890 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
128a0 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
128b0 63 6f 64 65 20 61 6e 64 20 6d 65 73 73 61 67 65  code and message
128c0 20 69 6e 20 74 68 65 20 72 62 75 20 68 61 6e 64   in the rbu hand
128d0 6c 65 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e  le.** and return
128e0 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63   NULL..*/.static
128f0 20 52 62 75 53 74 61 74 65 20 2a 72 62 75 4c 6f   RbuState *rbuLo
12900 61 64 53 74 61 74 65 28 73 71 6c 69 74 65 33 72  adState(sqlite3r
12910 62 75 20 2a 70 29 7b 0a 20 20 52 62 75 53 74 61  bu *p){.  RbuSta
12920 74 65 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20  te *pRet = 0;.  
12930 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
12940 74 6d 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  tmt = 0;.  int r
12950 63 3b 0a 20 20 69 6e 74 20 72 63 32 3b 0a 0a 20  c;.  int rc2;.. 
12960 20 70 52 65 74 20 3d 20 28 52 62 75 53 74 61 74   pRet = (RbuStat
12970 65 2a 29 72 62 75 4d 61 6c 6c 6f 63 28 70 2c 20  e*)rbuMalloc(p, 
12980 73 69 7a 65 6f 66 28 52 62 75 53 74 61 74 65 29  sizeof(RbuState)
12990 29 3b 0a 20 20 69 66 28 20 70 52 65 74 3d 3d 30  );.  if( pRet==0
129a0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
129b0 72 63 20 3d 20 70 72 65 70 61 72 65 46 72 65 65  rc = prepareFree
129c0 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28  AndCollectError(
129d0 70 2d 3e 64 62 52 62 75 2c 20 26 70 53 74 6d 74  p->dbRbu, &pStmt
129e0 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 20 0a  , &p->zErrmsg, .
129f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70        sqlite3_mp
12a00 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20 6b 2c  rintf("SELECT k,
12a10 20 76 20 46 52 4f 4d 20 25 73 2e 72 62 75 5f 73   v FROM %s.rbu_s
12a20 74 61 74 65 22 2c 20 70 2d 3e 7a 53 74 61 74 65  tate", p->zState
12a30 44 62 29 0a 20 20 29 3b 0a 20 20 77 68 69 6c 65  Db).  );.  while
12a40 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
12a50 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  && SQLITE_ROW==s
12a60 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
12a70 74 29 20 29 7b 0a 20 20 20 20 73 77 69 74 63 68  t) ){.    switch
12a80 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  ( sqlite3_column
12a90 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30 29 20 29  _int(pStmt, 0) )
12aa0 7b 0a 20 20 20 20 20 20 63 61 73 65 20 52 42 55  {.      case RBU
12ab0 5f 53 54 41 54 45 5f 53 54 41 47 45 3a 0a 20 20  _STATE_STAGE:.  
12ac0 20 20 20 20 20 20 70 52 65 74 2d 3e 65 53 74 61        pRet->eSta
12ad0 67 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ge = sqlite3_col
12ae0 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 31  umn_int(pStmt, 1
12af0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
12b00 52 65 74 2d 3e 65 53 74 61 67 65 21 3d 52 42 55  Ret->eStage!=RBU
12b10 5f 53 54 41 47 45 5f 4f 41 4c 0a 20 20 20 20 20  _STAGE_OAL.     
12b20 20 20 20 20 26 26 20 70 52 65 74 2d 3e 65 53 74      && pRet->eSt
12b30 61 67 65 21 3d 52 42 55 5f 53 54 41 47 45 5f 4d  age!=RBU_STAGE_M
12b40 4f 56 45 0a 20 20 20 20 20 20 20 20 20 26 26 20  OVE.         && 
12b50 70 52 65 74 2d 3e 65 53 74 61 67 65 21 3d 52 42  pRet->eStage!=RB
12b60 55 5f 53 54 41 47 45 5f 43 4b 50 54 0a 20 20 20  U_STAGE_CKPT.   
12b70 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
12b80 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
12b90 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20  _CORRUPT;.      
12ba0 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
12bb0 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20 52  k;..      case R
12bc0 42 55 5f 53 54 41 54 45 5f 54 42 4c 3a 0a 20 20  BU_STATE_TBL:.  
12bd0 20 20 20 20 20 20 70 52 65 74 2d 3e 7a 54 62 6c        pRet->zTbl
12be0 20 3d 20 72 62 75 53 74 72 6e 64 75 70 28 28 63   = rbuStrndup((c
12bf0 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
12c00 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  umn_text(pStmt, 
12c10 31 29 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20  1), &rc);.      
12c20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20    break;..      
12c30 63 61 73 65 20 52 42 55 5f 53 54 41 54 45 5f 49  case RBU_STATE_I
12c40 44 58 3a 0a 20 20 20 20 20 20 20 20 70 52 65 74  DX:.        pRet
12c50 2d 3e 7a 49 64 78 20 3d 20 72 62 75 53 74 72 6e  ->zIdx = rbuStrn
12c60 64 75 70 28 28 63 68 61 72 2a 29 73 71 6c 69 74  dup((char*)sqlit
12c70 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
12c80 53 74 6d 74 2c 20 31 29 2c 20 26 72 63 29 3b 0a  Stmt, 1), &rc);.
12c90 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a          break;..
12ca0 20 20 20 20 20 20 63 61 73 65 20 52 42 55 5f 53        case RBU_S
12cb0 54 41 54 45 5f 52 4f 57 3a 0a 20 20 20 20 20 20  TATE_ROW:.      
12cc0 20 20 70 52 65 74 2d 3e 6e 52 6f 77 20 3d 20 73    pRet->nRow = s
12cd0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
12ce0 74 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20  t(pStmt, 1);.   
12cf0 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
12d00 20 20 20 63 61 73 65 20 52 42 55 5f 53 54 41 54     case RBU_STAT
12d10 45 5f 50 52 4f 47 52 45 53 53 3a 0a 20 20 20 20  E_PROGRESS:.    
12d20 20 20 20 20 70 52 65 74 2d 3e 6e 50 72 6f 67 72      pRet->nProgr
12d30 65 73 73 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  ess = sqlite3_co
12d40 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74  lumn_int64(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 43 4b 50 54 3a   RBU_STATE_CKPT:
12d80 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e 69  .        pRet->i
12d90 57 61 6c 43 6b 73 75 6d 20 3d 20 73 71 6c 69 74  WalCksum = sqlit
12da0 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28  e3_column_int64(
12db0 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20 20  pStmt, 1);.     
12dc0 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20     break;..     
12dd0 20 63 61 73 65 20 52 42 55 5f 53 54 41 54 45 5f   case RBU_STATE_
12de0 43 4f 4f 4b 49 45 3a 0a 20 20 20 20 20 20 20 20  COOKIE:.        
12df0 70 52 65 74 2d 3e 69 43 6f 6f 6b 69 65 20 3d 20  pRet->iCookie = 
12e00 28 75 33 32 29 73 71 6c 69 74 65 33 5f 63 6f 6c  (u32)sqlite3_col
12e10 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c  umn_int64(pStmt,
12e20 20 31 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65   1);.        bre
12e30 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20  ak;..      case 
12e40 52 42 55 5f 53 54 41 54 45 5f 4f 41 4c 53 5a 3a  RBU_STATE_OALSZ:
12e50 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e 69  .        pRet->i
12e60 4f 61 6c 53 7a 20 3d 20 28 75 33 32 29 73 71 6c  OalSz = (u32)sql
12e70 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36  ite3_column_int6
12e80 34 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20  4(pStmt, 1);.   
12e90 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
12ea0 20 20 20 63 61 73 65 20 52 42 55 5f 53 54 41 54     case RBU_STAT
12eb0 45 5f 50 48 41 53 45 4f 4e 45 53 54 45 50 3a 0a  E_PHASEONESTEP:.
12ec0 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e 6e 50          pRet->nP
12ed0 68 61 73 65 4f 6e 65 53 74 65 70 20 3d 20 73 71  haseOneStep = sq
12ee0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
12ef0 36 34 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20  64(pStmt, 1);.  
12f00 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
12f10 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
12f20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
12f30 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20  _CORRUPT;.      
12f40 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
12f50 20 7d 0a 20 20 72 63 32 20 3d 20 73 71 6c 69 74   }.  rc2 = sqlit
12f60 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
12f70 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  t);.  if( rc==SQ
12f80 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72  LITE_OK ) rc = r
12f90 63 32 3b 0a 0a 20 20 70 2d 3e 72 63 20 3d 20 72  c2;..  p->rc = r
12fa0 63 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74  c;.  return pRet
12fb0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  ;.}.../*.** Open
12fc0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
12fd0 6e 64 6c 65 20 61 6e 64 20 61 74 74 61 63 68 20  ndle and attach 
12fe0 74 68 65 20 52 42 55 20 64 61 74 61 62 61 73 65  the RBU database
12ff0 20 61 73 20 22 72 62 75 22 2e 20 49 66 20 61 6e   as "rbu". If an
13000 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73  .** error occurs
13010 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  , leave an error
13020 20 63 6f 64 65 20 61 6e 64 20 6d 65 73 73 61 67   code and messag
13030 65 20 69 6e 20 74 68 65 20 52 42 55 20 68 61 6e  e in the RBU han
13040 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  dle..*/.static v
13050 6f 69 64 20 72 62 75 4f 70 65 6e 44 61 74 61 62  oid rbuOpenDatab
13060 61 73 65 28 73 71 6c 69 74 65 33 72 62 75 20 2a  ase(sqlite3rbu *
13070 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  p){.  assert( p-
13080 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
13090 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64  ;.  assert( p->d
130a0 62 4d 61 69 6e 3d 3d 30 20 26 26 20 70 2d 3e 64  bMain==0 && p->d
130b0 62 52 62 75 3d 3d 30 20 29 3b 0a 20 20 61 73 73  bRbu==0 );.  ass
130c0 65 72 74 28 20 72 62 75 49 73 56 61 63 75 75 6d  ert( rbuIsVacuum
130d0 28 70 29 20 7c 7c 20 70 2d 3e 7a 54 61 72 67 65  (p) || p->zTarge
130e0 74 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 4f 70  t!=0 );..  /* Op
130f0 65 6e 20 74 68 65 20 52 42 55 20 64 61 74 61 62  en the RBU datab
13100 61 73 65 20 2a 2f 0a 20 20 70 2d 3e 64 62 52 62  ase */.  p->dbRb
13110 75 20 3d 20 72 62 75 4f 70 65 6e 44 62 68 61 6e  u = rbuOpenDbhan
13120 64 6c 65 28 70 2c 20 70 2d 3e 7a 52 62 75 2c 20  dle(p, p->zRbu, 
13130 31 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63  1);..  if( p->rc
13140 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72  ==SQLITE_OK && r
13150 62 75 49 73 56 61 63 75 75 6d 28 70 29 20 29 7b  buIsVacuum(p) ){
13160 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  .    sqlite3_fil
13170 65 5f 63 6f 6e 74 72 6f 6c 28 70 2d 3e 64 62 52  e_control(p->dbR
13180 62 75 2c 20 22 6d 61 69 6e 22 2c 20 53 51 4c 49  bu, "main", SQLI
13190 54 45 5f 46 43 4e 54 4c 5f 52 42 55 43 4e 54 2c  TE_FCNTL_RBUCNT,
131a0 20 28 76 6f 69 64 2a 29 70 29 3b 0a 20 20 7d 0a   (void*)p);.  }.
131b0 0a 20 20 2f 2a 20 49 66 20 75 73 69 6e 67 20 73  .  /* If using s
131c0 65 70 61 72 61 74 65 20 52 42 55 20 61 6e 64 20  eparate RBU and 
131d0 73 74 61 74 65 20 64 61 74 61 62 61 73 65 73 2c  state databases,
131e0 20 61 74 74 61 63 68 20 74 68 65 20 73 74 61 74   attach the stat
131f0 65 20 64 61 74 61 62 61 73 65 20 74 6f 0a 20 20  e database to.  
13200 2a 2a 20 74 68 65 20 52 42 55 20 64 62 20 68 61  ** the RBU db ha
13210 6e 64 6c 65 20 6e 6f 77 2e 20 20 2a 2f 0a 20 20  ndle now.  */.  
13220 69 66 28 20 70 2d 3e 7a 53 74 61 74 65 20 29 7b  if( p->zState ){
13230 0a 20 20 20 20 72 62 75 4d 50 72 69 6e 74 66 45  .    rbuMPrintfE
13240 78 65 63 28 70 2c 20 70 2d 3e 64 62 52 62 75 2c  xec(p, p->dbRbu,
13250 20 22 41 54 54 41 43 48 20 25 51 20 41 53 20 73   "ATTACH %Q AS s
13260 74 61 74 22 2c 20 70 2d 3e 7a 53 74 61 74 65 29  tat", p->zState)
13270 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e  ;.    memcpy(p->
13280 7a 53 74 61 74 65 44 62 2c 20 22 73 74 61 74 22  zStateDb, "stat"
13290 2c 20 34 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  , 4);.  }else{. 
132a0 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e 7a 53 74     memcpy(p->zSt
132b0 61 74 65 44 62 2c 20 22 6d 61 69 6e 22 2c 20 34  ateDb, "main", 4
132c0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
132d0 69 74 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61  it has not alrea
132e0 64 79 20 62 65 65 6e 20 63 72 65 61 74 65 64 2c  dy been created,
132f0 20 63 72 65 61 74 65 20 74 68 65 20 72 62 75 5f   create the rbu_
13300 73 74 61 74 65 20 74 61 62 6c 65 20 2a 2f 0a 20  state table */. 
13310 20 72 62 75 4d 50 72 69 6e 74 66 45 78 65 63 28   rbuMPrintfExec(
13320 70 2c 20 70 2d 3e 64 62 52 62 75 2c 20 52 42 55  p, p->dbRbu, RBU
13330 5f 43 52 45 41 54 45 5f 53 54 41 54 45 2c 20 70  _CREATE_STATE, p
13340 2d 3e 7a 53 74 61 74 65 44 62 29 3b 0a 0a 20 20  ->zStateDb);..  
13350 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
13360 45 5f 4f 4b 20 26 26 20 72 62 75 49 73 56 61 63  E_OK && rbuIsVac
13370 75 75 6d 28 70 29 20 29 7b 0a 20 20 20 20 69 6e  uum(p) ){.    in
13380 74 20 62 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20  t bOpen = 0;.   
13390 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 70 2d 3e   int rc;.    p->
133a0 6e 52 62 75 20 3d 20 30 3b 0a 20 20 20 20 70 2d  nRbu = 0;.    p-
133b0 3e 70 52 62 75 46 64 20 3d 20 30 3b 0a 20 20 20  >pRbuFd = 0;.   
133c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69   rc = sqlite3_fi
133d0 6c 65 5f 63 6f 6e 74 72 6f 6c 28 70 2d 3e 64 62  le_control(p->db
133e0 52 62 75 2c 20 22 6d 61 69 6e 22 2c 20 53 51 4c  Rbu, "main", SQL
133f0 49 54 45 5f 46 43 4e 54 4c 5f 52 42 55 43 4e 54  ITE_FCNTL_RBUCNT
13400 2c 20 28 76 6f 69 64 2a 29 70 29 3b 0a 20 20 20  , (void*)p);.   
13410 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
13420 4e 4f 54 46 4f 55 4e 44 20 29 20 70 2d 3e 72 63  NOTFOUND ) p->rc
13430 20 3d 20 72 63 3b 0a 20 20 20 20 69 66 28 20 70   = rc;.    if( p
13440 2d 3e 65 53 74 61 67 65 3e 3d 52 42 55 5f 53 54  ->eStage>=RBU_ST
13450 41 47 45 5f 4d 4f 56 45 20 29 7b 0a 20 20 20 20  AGE_MOVE ){.    
13460 20 20 62 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20    bOpen = 1;.   
13470 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 52 62   }else{.      Rb
13480 75 53 74 61 74 65 20 2a 70 53 74 61 74 65 20 3d  uState *pState =
13490 20 72 62 75 4c 6f 61 64 53 74 61 74 65 28 70 29   rbuLoadState(p)
134a0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 74 61  ;.      if( pSta
134b0 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 62 4f  te ){.        bO
134c0 70 65 6e 20 3d 20 28 70 53 74 61 74 65 2d 3e 65  pen = (pState->e
134d0 53 74 61 67 65 3e 52 42 55 5f 53 54 41 47 45 5f  Stage>RBU_STAGE_
134e0 4d 4f 56 45 29 3b 0a 20 20 20 20 20 20 20 20 72  MOVE);.        r
134f0 62 75 46 72 65 65 53 74 61 74 65 28 70 53 74 61  buFreeState(pSta
13500 74 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  te);.      }.   
13510 20 7d 0a 20 20 20 20 69 66 28 20 62 4f 70 65 6e   }.    if( bOpen
13520 20 29 20 70 2d 3e 64 62 4d 61 69 6e 20 3d 20 72   ) p->dbMain = r
13530 62 75 4f 70 65 6e 44 62 68 61 6e 64 6c 65 28 70  buOpenDbhandle(p
13540 2c 20 70 2d 3e 7a 52 62 75 2c 20 70 2d 3e 6e 52  , p->zRbu, p->nR
13550 62 75 3c 3d 31 29 3b 0a 20 20 7d 0a 0a 20 20 70  bu<=1);.  }..  p
13560 2d 3e 65 53 74 61 67 65 20 3d 20 30 3b 0a 20 20  ->eStage = 0;.  
13570 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
13580 45 5f 4f 4b 20 26 26 20 70 2d 3e 64 62 4d 61 69  E_OK && p->dbMai
13590 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  n==0 ){.    if( 
135a0 21 72 62 75 49 73 56 61 63 75 75 6d 28 70 29 20  !rbuIsVacuum(p) 
135b0 29 7b 0a 20 20 20 20 20 20 70 2d 3e 64 62 4d 61  ){.      p->dbMa
135c0 69 6e 20 3d 20 72 62 75 4f 70 65 6e 44 62 68 61  in = rbuOpenDbha
135d0 6e 64 6c 65 28 70 2c 20 70 2d 3e 7a 54 61 72 67  ndle(p, p->zTarg
135e0 65 74 2c 20 31 29 3b 0a 20 20 20 20 7d 65 6c 73  et, 1);.    }els
135f0 65 20 69 66 28 20 70 2d 3e 70 52 62 75 46 64 2d  e if( p->pRbuFd-
13600 3e 70 57 61 6c 46 64 20 29 7b 0a 20 20 20 20 20  >pWalFd ){.     
13610 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
13620 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 70 2d 3e  ERROR;.      p->
13630 7a 45 72 72 6d 73 67 20 3d 20 73 71 6c 69 74 65  zErrmsg = sqlite
13640 33 5f 6d 70 72 69 6e 74 66 28 22 63 61 6e 6e 6f  3_mprintf("canno
13650 74 20 76 61 63 75 75 6d 20 77 61 6c 20 6d 6f 64  t vacuum wal mod
13660 65 20 64 61 74 61 62 61 73 65 22 29 3b 0a 20 20  e database");.  
13670 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
13680 68 61 72 20 2a 7a 54 61 72 67 65 74 3b 0a 20 20  har *zTarget;.  
13690 20 20 20 20 63 68 61 72 20 2a 7a 45 78 74 72 61      char *zExtra
136a0 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
136b0 73 74 72 6c 65 6e 28 70 2d 3e 7a 52 62 75 29 3e  strlen(p->zRbu)>
136c0 3d 35 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28  =5 && 0==memcmp(
136d0 22 66 69 6c 65 3a 22 2c 20 70 2d 3e 7a 52 62 75  "file:", p->zRbu
136e0 2c 20 35 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 5) ){.        
136f0 7a 45 78 74 72 61 20 3d 20 26 70 2d 3e 7a 52 62  zExtra = &p->zRb
13700 75 5b 35 5d 3b 0a 20 20 20 20 20 20 20 20 77 68  u[5];.        wh
13710 69 6c 65 28 20 2a 7a 45 78 74 72 61 20 29 7b 0a  ile( *zExtra ){.
13720 20 20 20 20 20 20 20 20 20 20 69 66 28 20 2a 7a            if( *z
13730 45 78 74 72 61 2b 2b 3d 3d 27 3f 27 20 29 20 62  Extra++=='?' ) b
13740 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
13750 20 20 20 20 20 20 20 20 69 66 28 20 2a 7a 45 78          if( *zEx
13760 74 72 61 3d 3d 27 5c 30 27 20 29 20 7a 45 78 74  tra=='\0' ) zExt
13770 72 61 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ra = 0;.      }.
13780 0a 20 20 20 20 20 20 7a 54 61 72 67 65 74 20 3d  .      zTarget =
13790 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
137a0 28 22 66 69 6c 65 3a 25 73 2d 76 61 63 75 75 6d  ("file:%s-vacuum
137b0 3f 72 62 75 5f 6d 65 6d 6f 72 79 3d 31 25 73 25  ?rbu_memory=1%s%
137c0 73 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73  s", .          s
137d0 71 6c 69 74 65 33 5f 64 62 5f 66 69 6c 65 6e 61  qlite3_db_filena
137e0 6d 65 28 70 2d 3e 64 62 52 62 75 2c 20 22 6d 61  me(p->dbRbu, "ma
137f0 69 6e 22 29 2c 0a 20 20 20 20 20 20 20 20 20 20  in"),.          
13800 28 7a 45 78 74 72 61 3d 3d 30 20 3f 20 22 22 20  (zExtra==0 ? "" 
13810 3a 20 22 26 22 29 2c 20 28 7a 45 78 74 72 61 3d  : "&"), (zExtra=
13820 3d 30 20 3f 20 22 22 20 3a 20 7a 45 78 74 72 61  =0 ? "" : zExtra
13830 29 0a 20 20 20 20 20 20 29 3b 0a 0a 20 20 20 20  ).      );..    
13840 20 20 69 66 28 20 7a 54 61 72 67 65 74 3d 3d 30    if( zTarget==0
13850 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72   ){.        p->r
13860 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
13870 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
13880 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
13890 70 2d 3e 64 62 4d 61 69 6e 20 3d 20 72 62 75 4f  p->dbMain = rbuO
138a0 70 65 6e 44 62 68 61 6e 64 6c 65 28 70 2c 20 7a  penDbhandle(p, z
138b0 54 61 72 67 65 74 2c 20 70 2d 3e 6e 52 62 75 3c  Target, p->nRbu<
138c0 3d 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  =1);.      sqlit
138d0 65 33 5f 66 72 65 65 28 7a 54 61 72 67 65 74 29  e3_free(zTarget)
138e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
138f0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
13900 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63  _OK ){.    p->rc
13910 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
13920 65 5f 66 75 6e 63 74 69 6f 6e 28 70 2d 3e 64 62  e_function(p->db
13930 4d 61 69 6e 2c 20 0a 20 20 20 20 20 20 20 20 22  Main, .        "
13940 72 62 75 5f 74 6d 70 5f 69 6e 73 65 72 74 22 2c  rbu_tmp_insert",
13950 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38   -1, SQLITE_UTF8
13960 2c 20 28 76 6f 69 64 2a 29 70 2c 20 72 62 75 54  , (void*)p, rbuT
13970 6d 70 49 6e 73 65 72 74 46 75 6e 63 2c 20 30 2c  mpInsertFunc, 0,
13980 20 30 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20   0.    );.  }.. 
13990 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
139a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d 3e  TE_OK ){.    p->
139b0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
139c0 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70 2d 3e  ate_function(p->
139d0 64 62 4d 61 69 6e 2c 20 0a 20 20 20 20 20 20 20  dbMain, .       
139e0 20 22 72 62 75 5f 66 6f 73 73 69 6c 5f 64 65 6c   "rbu_fossil_del
139f0 74 61 22 2c 20 32 2c 20 53 51 4c 49 54 45 5f 55  ta", 2, SQLITE_U
13a00 54 46 38 2c 20 30 2c 20 72 62 75 46 6f 73 73 69  TF8, 0, rbuFossi
13a10 6c 44 65 6c 74 61 46 75 6e 63 2c 20 30 2c 20 30  lDeltaFunc, 0, 0
13a20 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 69  .    );.  }..  i
13a30 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
13a40 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63  _OK ){.    p->rc
13a50 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
13a60 65 5f 66 75 6e 63 74 69 6f 6e 28 70 2d 3e 64 62  e_function(p->db
13a70 52 62 75 2c 20 0a 20 20 20 20 20 20 20 20 22 72  Rbu, .        "r
13a80 62 75 5f 74 61 72 67 65 74 5f 6e 61 6d 65 22 2c  bu_target_name",
13a90 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38   -1, SQLITE_UTF8
13aa0 2c 20 28 76 6f 69 64 2a 29 70 2c 20 72 62 75 54  , (void*)p, rbuT
13ab0 61 72 67 65 74 4e 61 6d 65 46 75 6e 63 2c 20 30  argetNameFunc, 0
13ac0 2c 20 30 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a  , 0.    );.  }..
13ad0 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
13ae0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d  ITE_OK ){.    p-
13af0 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69  >rc = sqlite3_fi
13b00 6c 65 5f 63 6f 6e 74 72 6f 6c 28 70 2d 3e 64 62  le_control(p->db
13b10 4d 61 69 6e 2c 20 22 6d 61 69 6e 22 2c 20 53 51  Main, "main", SQ
13b20 4c 49 54 45 5f 46 43 4e 54 4c 5f 52 42 55 2c 20  LITE_FCNTL_RBU, 
13b30 28 76 6f 69 64 2a 29 70 29 3b 0a 20 20 7d 0a 20  (void*)p);.  }. 
13b40 20 72 62 75 4d 50 72 69 6e 74 66 45 78 65 63 28   rbuMPrintfExec(
13b50 70 2c 20 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 53  p, p->dbMain, "S
13b60 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c  ELECT * FROM sql
13b70 69 74 65 5f 6d 61 73 74 65 72 22 29 3b 0a 0a 20  ite_master");.. 
13b80 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 64 61 74   /* Mark the dat
13b90 61 62 61 73 65 20 66 69 6c 65 20 6a 75 73 74 20  abase file just 
13ba0 6f 70 65 6e 65 64 20 61 73 20 61 6e 20 52 42 55  opened as an RBU
13bb0 20 74 61 72 67 65 74 20 64 61 74 61 62 61 73 65   target database
13bc0 2e 20 49 66 20 0a 20 20 2a 2a 20 74 68 69 73 20  . If .  ** this 
13bd0 63 61 6c 6c 20 72 65 74 75 72 6e 73 20 53 51 4c  call returns SQL
13be0 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 2c 20 74 68  ITE_NOTFOUND, th
13bf0 65 6e 20 74 68 65 20 52 42 55 20 76 66 73 20 69  en the RBU vfs i
13c00 73 20 6e 6f 74 20 69 6e 20 75 73 65 2e 0a 20 20  s not in use..  
13c10 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 65 72  ** This is an er
13c20 72 6f 72 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70  ror.  */.  if( p
13c30 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
13c40 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73  ){.    p->rc = s
13c50 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
13c60 72 6f 6c 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 22  rol(p->dbMain, "
13c70 6d 61 69 6e 22 2c 20 53 51 4c 49 54 45 5f 46 43  main", SQLITE_FC
13c80 4e 54 4c 5f 52 42 55 2c 20 28 76 6f 69 64 2a 29  NTL_RBU, (void*)
13c90 70 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  p);.  }..  if( p
13ca0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54  ->rc==SQLITE_NOT
13cb0 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 70 2d 3e  FOUND ){.    p->
13cc0 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
13cd0 52 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72 6d 73  R;.    p->zErrms
13ce0 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  g = sqlite3_mpri
13cf0 6e 74 66 28 22 72 62 75 20 76 66 73 20 6e 6f 74  ntf("rbu vfs not
13d00 20 66 6f 75 6e 64 22 29 3b 0a 20 20 7d 0a 7d 0a   found");.  }.}.
13d10 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
13d20 69 6e 65 20 69 73 20 61 20 63 6f 70 79 20 6f 66  ine is a copy of
13d30 20 74 68 65 20 73 71 6c 69 74 65 33 46 69 6c 65   the sqlite3File
13d40 53 75 66 66 69 78 33 28 29 20 72 6f 75 74 69 6e  Suffix3() routin
13d50 65 20 66 72 6f 6d 20 74 68 65 20 63 6f 72 65 2e  e from the core.
13d60 0a 2a 2a 20 49 74 20 69 73 20 61 20 6e 6f 2d 6f  .** It is a no-o
13d70 70 20 75 6e 6c 65 73 73 20 53 51 4c 49 54 45 5f  p unless SQLITE_
13d80 45 4e 41 42 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53  ENABLE_8_3_NAMES
13d90 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a   is defined..**.
13da0 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 45 4e 41  ** If SQLITE_ENA
13db0 42 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53 20 69 73  BLE_8_3_NAMES is
13dc0 20 73 65 74 20 61 74 20 63 6f 6d 70 69 6c 65 2d   set at compile-
13dd0 74 69 6d 65 20 61 6e 64 20 69 66 20 74 68 65 20  time and if the 
13de0 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65  database.** file
13df0 6e 61 6d 65 20 69 6e 20 7a 42 61 73 65 46 69 6c  name in zBaseFil
13e00 65 6e 61 6d 65 20 69 73 20 61 20 55 52 49 20 77  ename is a URI w
13e10 69 74 68 20 74 68 65 20 22 38 5f 33 5f 6e 61 6d  ith the "8_3_nam
13e20 65 73 3d 31 22 20 70 61 72 61 6d 65 74 65 72 20  es=1" parameter 
13e30 61 6e 64 0a 2a 2a 20 69 66 20 66 69 6c 65 6e 61  and.** if filena
13e40 6d 65 20 69 6e 20 7a 5b 5d 20 68 61 73 20 61 20  me in z[] has a 
13e50 73 75 66 66 69 78 20 28 61 2e 6b 2e 61 2e 20 22  suffix (a.k.a. "
13e60 65 78 74 65 6e 73 69 6f 6e 22 29 20 74 68 61 74  extension") that
13e70 20 69 73 20 6c 6f 6e 67 65 72 20 74 68 61 6e 0a   is longer than.
13e80 2a 2a 20 74 68 72 65 65 20 63 68 61 72 61 63 74  ** three charact
13e90 65 72 73 2c 20 74 68 65 6e 20 73 68 6f 72 74 65  ers, then shorte
13ea0 6e 20 74 68 65 20 73 75 66 66 69 78 20 6f 6e 20  n the suffix on 
13eb0 7a 5b 5d 20 74 6f 20 62 65 20 74 68 65 20 6c 61  z[] to be the la
13ec0 73 74 20 74 68 72 65 65 0a 2a 2a 20 63 68 61 72  st three.** char
13ed0 61 63 74 65 72 73 20 6f 66 20 74 68 65 20 6f 72  acters of the or
13ee0 69 67 69 6e 61 6c 20 73 75 66 66 69 78 2e 0a 2a  iginal suffix..*
13ef0 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 45  *.** If SQLITE_E
13f00 4e 41 42 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53 20  NABLE_8_3_NAMES 
13f10 69 73 20 73 65 74 20 74 6f 20 32 20 61 74 20 63  is set to 2 at c
13f20 6f 6d 70 69 6c 65 2d 74 69 6d 65 2c 20 74 68 65  ompile-time, the
13f30 6e 20 61 6c 77 61 79 73 0a 2a 2a 20 64 6f 20 74  n always.** do t
13f40 68 65 20 73 75 66 66 69 78 20 73 68 6f 72 74 65  he suffix shorte
13f50 6e 69 6e 67 20 72 65 67 61 72 64 6c 65 73 73 20  ning regardless 
13f60 6f 66 20 55 52 49 20 70 61 72 61 6d 65 74 65 72  of URI parameter
13f70 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 73  ..**.** Examples
13f80 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 74 65 73 74  :.**.**     test
13f90 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 20 20 20 3d  .db-journal    =
13fa0 3e 20 20 20 74 65 73 74 2e 6e 61 6c 0a 2a 2a 20  >   test.nal.** 
13fb0 20 20 20 20 74 65 73 74 2e 64 62 2d 77 61 6c 20      test.db-wal 
13fc0 20 20 20 20 20 20 20 3d 3e 20 20 20 74 65 73 74         =>   test
13fd0 2e 77 61 6c 0a 2a 2a 20 20 20 20 20 74 65 73 74  .wal.**     test
13fe0 2e 64 62 2d 73 68 6d 20 20 20 20 20 20 20 20 3d  .db-shm        =
13ff0 3e 20 20 20 74 65 73 74 2e 73 68 6d 0a 2a 2a 20  >   test.shm.** 
14000 20 20 20 20 74 65 73 74 2e 64 62 2d 6d 6a 37 66      test.db-mj7f
14010 33 33 31 39 66 61 20 3d 3e 20 20 20 74 65 73 74  3319fa =>   test
14020 2e 39 66 61 0a 2a 2f 0a 73 74 61 74 69 63 20 76  .9fa.*/.static v
14030 6f 69 64 20 72 62 75 46 69 6c 65 53 75 66 66 69  oid rbuFileSuffi
14040 78 33 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  x3(const char *z
14050 42 61 73 65 2c 20 63 68 61 72 20 2a 7a 29 7b 0a  Base, char *z){.
14060 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
14070 41 42 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53 0a 23  ABLE_8_3_NAMES.#
14080 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
14090 5f 38 5f 33 5f 4e 41 4d 45 53 3c 32 0a 20 20 69  _8_3_NAMES<2.  i
140a0 66 28 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62  f( sqlite3_uri_b
140b0 6f 6f 6c 65 61 6e 28 7a 42 61 73 65 2c 20 22 38  oolean(zBase, "8
140c0 5f 33 5f 6e 61 6d 65 73 22 2c 20 30 29 20 29 0a  _3_names", 0) ).
140d0 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 69  #endif.  {.    i
140e0 6e 74 20 69 2c 20 73 7a 3b 0a 20 20 20 20 73 7a  nt i, sz;.    sz
140f0 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
14100 33 30 28 7a 29 3b 0a 20 20 20 20 66 6f 72 28 69  30(z);.    for(i
14110 3d 73 7a 2d 31 3b 20 69 3e 30 20 26 26 20 7a 5b  =sz-1; i>0 && z[
14120 69 5d 21 3d 27 2f 27 20 26 26 20 7a 5b 69 5d 21  i]!='/' && z[i]!
14130 3d 27 2e 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20 20  ='.'; i--){}.   
14140 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 2e 27 20 26   if( z[i]=='.' &
14150 26 20 41 4c 57 41 59 53 28 73 7a 3e 69 2b 34 29  & ALWAYS(sz>i+4)
14160 20 29 20 6d 65 6d 6d 6f 76 65 28 26 7a 5b 69 2b   ) memmove(&z[i+
14170 31 5d 2c 20 26 7a 5b 73 7a 2d 33 5d 2c 20 34 29  1], &z[sz-3], 4)
14180 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ;.  }.#endif.}..
14190 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
141a0 20 63 75 72 72 65 6e 74 20 77 61 6c 2d 69 6e 64   current wal-ind
141b0 65 78 20 68 65 61 64 65 72 20 63 68 65 63 6b 73  ex header checks
141c0 75 6d 20 66 6f 72 20 74 68 65 20 74 61 72 67 65  um for the targe
141d0 74 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 61  t database .** a
141e0 73 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65 67  s a 64-bit integ
141f0 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 68  er..**.** The ch
14200 65 63 6b 73 75 6d 20 69 73 20 73 74 6f 72 65 20  ecksum is store 
14210 69 6e 20 74 68 65 20 66 69 72 73 74 20 70 61 67  in the first pag
14220 65 20 6f 66 20 78 53 68 6d 4d 61 70 20 6d 65 6d  e of xShmMap mem
14230 6f 72 79 20 61 73 20 61 6e 20 38 2d 62 79 74 65  ory as an 8-byte
14240 20 0a 2a 2a 20 62 6c 6f 62 20 73 74 61 72 74 69   .** blob starti
14250 6e 67 20 61 74 20 62 79 74 65 20 6f 66 66 73 65  ng at byte offse
14260 74 20 34 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  t 40..*/.static 
14270 69 36 34 20 72 62 75 53 68 6d 43 68 65 63 6b 73  i64 rbuShmChecks
14280 75 6d 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70  um(sqlite3rbu *p
14290 29 7b 0a 20 20 69 36 34 20 69 52 65 74 20 3d 20  ){.  i64 iRet = 
142a0 30 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  0;.  if( p->rc==
142b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
142c0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
142d0 44 62 20 3d 20 70 2d 3e 70 54 61 72 67 65 74 46  Db = p->pTargetF
142e0 64 2d 3e 70 52 65 61 6c 3b 0a 20 20 20 20 75 33  d->pReal;.    u3
142f0 32 20 76 6f 6c 61 74 69 6c 65 20 2a 70 74 72 3b  2 volatile *ptr;
14300 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 44 62  .    p->rc = pDb
14310 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53 68 6d  ->pMethods->xShm
14320 4d 61 70 28 70 44 62 2c 20 30 2c 20 33 32 2a 31  Map(pDb, 0, 32*1
14330 30 32 34 2c 20 30 2c 20 28 76 6f 69 64 20 76 6f  024, 0, (void vo
14340 6c 61 74 69 6c 65 2a 2a 29 26 70 74 72 29 3b 0a  latile**)&ptr);.
14350 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
14360 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
14370 20 20 69 52 65 74 20 3d 20 28 28 69 36 34 29 70    iRet = ((i64)p
14380 74 72 5b 31 30 5d 20 3c 3c 20 33 32 29 20 2b 20  tr[10] << 32) + 
14390 70 74 72 5b 31 31 5d 3b 0a 20 20 20 20 7d 0a 20  ptr[11];.    }. 
143a0 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 52 65 74   }.  return iRet
143b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
143c0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
143d0 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 69 6e  ed as part of in
143e0 69 74 69 61 6c 69 7a 69 6e 67 20 6f 72 20 72 65  itializing or re
143f0 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 6e 0a  initializing an.
14400 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 63  ** incremental c
14410 68 65 63 6b 70 6f 69 6e 74 2e 20 0a 2a 2a 0a 2a  heckpoint. .**.*
14420 2a 20 49 74 20 70 6f 70 75 6c 61 74 65 73 20 74  * It populates t
14430 68 65 20 73 71 6c 69 74 65 33 72 62 75 2e 61 46  he sqlite3rbu.aF
14440 72 61 6d 65 5b 5d 20 61 72 72 61 79 20 77 69 74  rame[] array wit
14450 68 20 74 68 65 20 73 65 74 20 6f 66 20 0a 2a 2a  h the set of .**
14460 20 28 77 61 6c 20 66 72 61 6d 65 20 2d 3e 20 64   (wal frame -> d
14470 62 20 70 61 67 65 29 20 63 6f 70 79 20 6f 70 65  b page) copy ope
14480 72 61 74 69 6f 6e 73 20 72 65 71 75 69 72 65 64  rations required
14490 20 74 6f 20 63 68 65 63 6b 70 6f 69 6e 74 20 74   to checkpoint t
144a0 68 65 20 0a 2a 2a 20 63 75 72 72 65 6e 74 20 77  he .** current w
144b0 61 6c 20 66 69 6c 65 2c 20 61 6e 64 20 6f 62 74  al file, and obt
144c0 61 69 6e 73 20 74 68 65 20 73 65 74 20 6f 66 20  ains the set of 
144d0 73 68 6d 20 6c 6f 63 6b 73 20 72 65 71 75 69 72  shm locks requir
144e0 65 64 20 74 6f 20 73 61 66 65 6c 79 20 0a 2a 2a  ed to safely .**
144f0 20 70 65 72 66 6f 72 6d 20 74 68 65 20 63 6f 70   perform the cop
14500 79 20 6f 70 65 72 61 74 69 6f 6e 73 20 64 69 72  y operations dir
14510 65 63 74 6c 79 20 6f 6e 20 74 68 65 20 66 69 6c  ectly on the fil
14520 65 2d 73 79 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20  e-system..**.** 
14530 49 66 20 61 72 67 75 6d 65 6e 74 20 70 53 74 61  If argument pSta
14540 74 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  te is not NULL, 
14550 74 68 65 6e 20 74 68 65 20 69 6e 63 72 65 6d 65  then the increme
14560 6e 74 61 6c 20 63 68 65 63 6b 70 6f 69 6e 74 20  ntal checkpoint 
14570 69 73 0a 2a 2a 20 62 65 69 6e 67 20 72 65 73 75  is.** being resu
14580 6d 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  med. In this cas
14590 65 2c 20 69 66 20 74 68 65 20 63 68 65 63 6b 73  e, if the checks
145a0 75 6d 20 6f 66 20 74 68 65 20 77 61 6c 2d 69 6e  um of the wal-in
145b0 64 65 78 2d 68 65 61 64 65 72 0a 2a 2a 20 66 6f  dex-header.** fo
145c0 6c 6c 6f 77 69 6e 67 20 72 65 63 6f 76 65 72 79  llowing recovery
145d0 20 69 73 20 6e 6f 74 20 74 68 65 20 73 61 6d 65   is not the same
145e0 20 61 73 20 74 68 65 20 63 68 65 63 6b 73 75 6d   as the checksum
145f0 20 73 61 76 65 64 20 69 6e 20 74 68 65 20 52 62   saved in the Rb
14600 75 53 74 61 74 65 0a 2a 2a 20 6f 62 6a 65 63 74  uState.** object
14610 2c 20 74 68 65 6e 20 74 68 65 20 72 62 75 20 68  , then the rbu h
14620 61 6e 64 6c 65 20 69 73 20 73 65 74 20 74 6f 20  andle is set to 
14630 44 4f 4e 45 20 73 74 61 74 65 2e 20 54 68 69 73  DONE state. This
14640 20 6f 63 63 75 72 73 20 69 66 20 73 6f 6d 65 0a   occurs if some.
14650 2a 2a 20 6f 74 68 65 72 20 63 6c 69 65 6e 74 20  ** other client 
14660 61 70 70 65 6e 64 73 20 61 20 74 72 61 6e 73 61  appends a transa
14670 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 77 61 6c  ction to the wal
14680 20 66 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64   file in the mid
14690 64 6c 65 20 6f 66 0a 2a 2a 20 61 6e 20 69 6e 63  dle of.** an inc
146a0 72 65 6d 65 6e 74 61 6c 20 63 68 65 63 6b 70 6f  remental checkpo
146b0 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  int..*/.static v
146c0 6f 69 64 20 72 62 75 53 65 74 75 70 43 68 65 63  oid rbuSetupChec
146d0 6b 70 6f 69 6e 74 28 73 71 6c 69 74 65 33 72 62  kpoint(sqlite3rb
146e0 75 20 2a 70 2c 20 52 62 75 53 74 61 74 65 20 2a  u *p, RbuState *
146f0 70 53 74 61 74 65 29 7b 0a 0a 20 20 2f 2a 20 49  pState){..  /* I
14700 66 20 70 53 74 61 74 65 20 69 73 20 4e 55 4c 4c  f pState is NULL
14710 2c 20 74 68 65 6e 20 74 68 65 20 77 61 6c 20 66  , then the wal f
14720 69 6c 65 20 6d 61 79 20 6e 6f 74 20 68 61 76 65  ile may not have
14730 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 61 6e 64   been opened and
14740 0a 20 20 2a 2a 20 72 65 63 6f 76 65 72 65 64 2e  .  ** recovered.
14750 20 52 75 6e 6e 69 6e 67 20 61 20 72 65 61 64 2d   Running a read-
14760 73 74 61 74 65 6d 65 6e 74 20 68 65 72 65 20 74  statement here t
14770 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 64 6f  o ensure that do
14780 69 6e 67 20 73 6f 0a 20 20 2a 2a 20 64 6f 65 73  ing so.  ** does
14790 20 6e 6f 74 20 69 6e 74 65 72 66 65 72 65 20 77   not interfere w
147a0 69 74 68 20 74 68 65 20 22 63 61 70 74 75 72 65  ith the "capture
147b0 22 20 70 72 6f 63 65 73 73 20 62 65 6c 6f 77 2e  " process below.
147c0 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 74 61 74    */.  if( pStat
147d0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 65  e==0 ){.    p->e
147e0 53 74 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 69  Stage = 0;.    i
147f0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
14800 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  _OK ){.      p->
14810 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65  rc = sqlite3_exe
14820 63 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 53 45  c(p->dbMain, "SE
14830 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69  LECT * FROM sqli
14840 74 65 5f 6d 61 73 74 65 72 22 2c 20 30 2c 20 30  te_master", 0, 0
14850 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , 0);.    }.  }.
14860 0a 20 20 2f 2a 20 41 73 73 75 6d 69 6e 67 20 6e  .  /* Assuming n
14870 6f 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75  o error has occu
14880 72 72 65 64 2c 20 72 75 6e 20 61 20 22 72 65 73  rred, run a "res
14890 74 61 72 74 22 20 63 68 65 63 6b 70 6f 69 6e 74  tart" checkpoint
148a0 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73   with the.  ** s
148b0 71 6c 69 74 65 33 72 62 75 2e 65 53 74 61 67 65  qlite3rbu.eStage
148c0 20 76 61 72 69 61 62 6c 65 20 73 65 74 20 74 6f   variable set to
148d0 20 43 41 50 54 55 52 45 2e 20 54 68 69 73 20 74   CAPTURE. This t
148e0 75 72 6e 73 20 6f 6e 20 74 68 65 20 66 6f 6c 6c  urns on the foll
148f0 6f 77 69 6e 67 0a 20 20 2a 2a 20 73 70 65 63 69  owing.  ** speci
14900 61 6c 20 62 65 68 61 76 69 6f 75 72 20 69 6e 20  al behaviour in 
14910 74 68 65 20 72 62 75 20 56 46 53 3a 0a 20 20 2a  the rbu VFS:.  *
14920 2a 0a 20 20 2a 2a 20 20 20 2a 20 49 66 20 74 68  *.  **   * If th
14930 65 20 65 78 63 6c 75 73 69 76 65 20 73 68 6d 20  e exclusive shm 
14940 57 52 49 54 45 52 20 6f 72 20 52 45 41 44 30 20  WRITER or READ0 
14950 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20 6f  lock cannot be o
14960 62 74 61 69 6e 65 64 2c 0a 20 20 2a 2a 20 20 20  btained,.  **   
14970 20 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74    the checkpoint
14980 20 66 61 69 6c 73 20 77 69 74 68 20 53 51 4c 49   fails with SQLI
14990 54 45 5f 42 55 53 59 20 28 6e 6f 72 6d 61 6c 6c  TE_BUSY (normall
149a0 79 20 53 51 4c 69 74 65 20 77 6f 75 6c 64 0a 20  y SQLite would. 
149b0 20 2a 2a 20 20 20 20 20 70 72 6f 63 65 65 64 20   **     proceed 
149c0 77 69 74 68 20 72 75 6e 6e 69 6e 67 20 61 20 70  with running a p
149d0 61 73 73 69 76 65 20 63 68 65 63 6b 70 6f 69 6e  assive checkpoin
149e0 74 20 69 6e 73 74 65 61 64 20 6f 66 20 66 61 69  t instead of fai
149f0 6c 69 6e 67 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  ling)..  **.  **
14a00 20 20 20 2a 20 41 74 74 65 6d 70 74 73 20 74 6f     * Attempts to
14a10 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 2a   read from the *
14a20 2d 77 61 6c 20 66 69 6c 65 20 6f 72 20 77 72 69  -wal file or wri
14a30 74 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  te to the databa
14a40 73 65 20 66 69 6c 65 0a 20 20 2a 2a 20 20 20 20  se file.  **    
14a50 20 64 6f 20 6e 6f 74 20 70 65 72 66 6f 72 6d 20   do not perform 
14a60 61 6e 79 20 49 4f 2e 20 49 6e 73 74 65 61 64 2c  any IO. Instead,
14a70 20 74 68 65 20 66 72 61 6d 65 2f 70 61 67 65 20   the frame/page 
14a80 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 74 68 61  combinations tha
14a90 74 0a 20 20 2a 2a 20 20 20 20 20 77 6f 75 6c 64  t.  **     would
14aa0 20 62 65 20 72 65 61 64 2f 77 72 69 74 74 65 6e   be read/written
14ab0 20 61 72 65 20 72 65 63 6f 72 64 65 64 20 69 6e   are recorded in
14ac0 20 74 68 65 20 73 71 6c 69 74 65 33 72 62 75 2e   the sqlite3rbu.
14ad0 61 46 72 61 6d 65 5b 5d 0a 20 20 2a 2a 20 20 20  aFrame[].  **   
14ae0 20 20 61 72 72 61 79 2e 0a 20 20 2a 2a 0a 20 20    array..  **.  
14af0 2a 2a 20 20 20 2a 20 43 61 6c 6c 73 20 74 6f 20  **   * Calls to 
14b00 78 53 68 6d 4c 6f 63 6b 28 55 4e 4c 4f 43 4b 29  xShmLock(UNLOCK)
14b10 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68 65 20   to release the 
14b20 65 78 63 6c 75 73 69 76 65 20 73 68 6d 20 57 52  exclusive shm WR
14b30 49 54 45 52 2c 20 0a 20 20 2a 2a 20 20 20 20 20  ITER, .  **     
14b40 52 45 41 44 30 20 61 6e 64 20 43 48 45 43 4b 50  READ0 and CHECKP
14b50 4f 49 4e 54 20 6c 6f 63 6b 73 20 74 61 6b 65 6e  OINT locks taken
14b60 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   as part of the 
14b70 63 68 65 63 6b 70 6f 69 6e 74 20 61 72 65 0a 20  checkpoint are. 
14b80 20 2a 2a 20 20 20 20 20 6e 6f 2d 6f 70 73 2e 20   **     no-ops. 
14b90 54 68 65 73 65 20 6c 6f 63 6b 73 20 77 69 6c 6c  These locks will
14ba0 20 6e 6f 74 20 62 65 20 72 65 6c 65 61 73 65 64   not be released
14bb0 20 75 6e 74 69 6c 20 74 68 65 20 63 6f 6e 6e 65   until the conne
14bc0 63 74 69 6f 6e 0a 20 20 2a 2a 20 20 20 20 20 69  ction.  **     i
14bd0 73 20 63 6c 6f 73 65 64 2e 0a 20 20 2a 2a 0a 20  s closed..  **. 
14be0 20 2a 2a 20 20 20 2a 20 41 74 74 65 6d 70 74 69   **   * Attempti
14bf0 6e 67 20 74 6f 20 78 53 79 6e 63 28 29 20 74 68  ng to xSync() th
14c00 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
14c10 63 61 75 73 65 73 20 61 6e 20 53 51 4c 49 54 45  causes an SQLITE
14c20 5f 49 4e 54 45 52 4e 41 4c 20 0a 20 20 2a 2a 20  _INTERNAL .  ** 
14c30 20 20 20 20 65 72 72 6f 72 2e 0a 20 20 2a 2a 0a      error..  **.
14c40 20 20 2a 2a 20 41 73 20 61 20 72 65 73 75 6c 74    ** As a result
14c50 2c 20 75 6e 6c 65 73 73 20 61 6e 20 65 72 72 6f  , unless an erro
14c60 72 20 28 69 2e 65 2e 20 4f 4f 4d 20 6f 72 20 53  r (i.e. OOM or S
14c70 51 4c 49 54 45 5f 42 55 53 59 29 20 6f 63 63 75  QLITE_BUSY) occu
14c80 72 73 2c 20 74 68 65 0a 20 20 2a 2a 20 63 68 65  rs, the.  ** che
14c90 63 6b 70 6f 69 6e 74 20 62 65 6c 6f 77 20 66 61  ckpoint below fa
14ca0 69 6c 73 20 77 69 74 68 20 53 51 4c 49 54 45 5f  ils with SQLITE_
14cb0 49 4e 54 45 52 4e 41 4c 2c 20 61 6e 64 20 6c 65  INTERNAL, and le
14cc0 61 76 65 73 20 74 68 65 20 61 46 72 61 6d 65 5b  aves the aFrame[
14cd0 5d 0a 20 20 2a 2a 20 61 72 72 61 79 20 70 6f 70  ].  ** array pop
14ce0 75 6c 61 74 65 64 20 77 69 74 68 20 61 20 73 65  ulated with a se
14cf0 74 20 6f 66 20 28 66 72 61 6d 65 20 2d 3e 20 70  t of (frame -> p
14d00 61 67 65 29 20 6d 61 70 70 69 6e 67 73 2e 20 42  age) mappings. B
14d10 65 63 61 75 73 65 20 74 68 65 20 0a 20 20 2a 2a  ecause the .  **
14d20 20 57 52 49 54 45 52 2c 20 43 48 45 43 4b 50 4f   WRITER, CHECKPO
14d30 49 4e 54 20 61 6e 64 20 52 45 41 44 30 20 6c 6f  INT and READ0 lo
14d40 63 6b 73 20 61 72 65 20 73 74 69 6c 6c 20 68 65  cks are still he
14d50 6c 64 2c 20 69 74 20 69 73 20 73 61 66 65 20 74  ld, it is safe t
14d60 6f 20 63 6f 70 79 20 0a 20 20 2a 2a 20 64 61 74  o copy .  ** dat
14d70 61 20 66 72 6f 6d 20 74 68 65 20 77 61 6c 20 66  a from the wal f
14d80 69 6c 65 20 69 6e 74 6f 20 74 68 65 20 64 61 74  ile into the dat
14d90 61 62 61 73 65 20 66 69 6c 65 20 61 63 63 6f 72  abase file accor
14da0 64 69 6e 67 20 74 6f 20 74 68 65 20 0a 20 20 2a  ding to the .  *
14db0 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 46  * contents of aF
14dc0 72 61 6d 65 5b 5d 2e 0a 20 20 2a 2f 0a 20 20 69  rame[]..  */.  i
14dd0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
14de0 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  _OK ){.    int r
14df0 63 32 3b 0a 20 20 20 20 70 2d 3e 65 53 74 61 67  c2;.    p->eStag
14e00 65 20 3d 20 52 42 55 5f 53 54 41 47 45 5f 43 41  e = RBU_STAGE_CA
14e10 50 54 55 52 45 3b 0a 20 20 20 20 72 63 32 20 3d  PTURE;.    rc2 =
14e20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d   sqlite3_exec(p-
14e30 3e 64 62 4d 61 69 6e 2c 20 22 50 52 41 47 4d 41  >dbMain, "PRAGMA
14e40 20 6d 61 69 6e 2e 77 61 6c 5f 63 68 65 63 6b 70   main.wal_checkp
14e50 6f 69 6e 74 3d 72 65 73 74 61 72 74 22 2c 20 30  oint=restart", 0
14e60 2c 20 30 2c 30 29 3b 0a 20 20 20 20 69 66 28 20  , 0,0);.    if( 
14e70 72 63 32 21 3d 53 51 4c 49 54 45 5f 49 4e 54 45  rc2!=SQLITE_INTE
14e80 52 4e 41 4c 20 29 20 70 2d 3e 72 63 20 3d 20 72  RNAL ) p->rc = r
14e90 63 32 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  c2;.  }..  if( p
14ea0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
14eb0 29 7b 0a 20 20 20 20 70 2d 3e 65 53 74 61 67 65  ){.    p->eStage
14ec0 20 3d 20 52 42 55 5f 53 54 41 47 45 5f 43 4b 50   = RBU_STAGE_CKP
14ed0 54 3b 0a 20 20 20 20 70 2d 3e 6e 53 74 65 70 20  T;.    p->nStep 
14ee0 3d 20 28 70 53 74 61 74 65 20 3f 20 70 53 74 61  = (pState ? pSta
14ef0 74 65 2d 3e 6e 52 6f 77 20 3a 20 30 29 3b 0a 20  te->nRow : 0);. 
14f00 20 20 20 70 2d 3e 61 42 75 66 20 3d 20 72 62 75     p->aBuf = rbu
14f10 4d 61 6c 6c 6f 63 28 70 2c 20 70 2d 3e 70 67 73  Malloc(p, p->pgs
14f20 7a 29 3b 0a 20 20 20 20 70 2d 3e 69 57 61 6c 43  z);.    p->iWalC
14f30 6b 73 75 6d 20 3d 20 72 62 75 53 68 6d 43 68 65  ksum = rbuShmChe
14f40 63 6b 73 75 6d 28 70 29 3b 0a 20 20 7d 0a 0a 20  cksum(p);.  }.. 
14f50 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
14f60 54 45 5f 4f 4b 20 26 26 20 70 53 74 61 74 65 20  TE_OK && pState 
14f70 26 26 20 70 53 74 61 74 65 2d 3e 69 57 61 6c 43  && pState->iWalC
14f80 6b 73 75 6d 21 3d 70 2d 3e 69 57 61 6c 43 6b 73  ksum!=p->iWalCks
14f90 75 6d 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  um ){.    p->rc 
14fa0 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  = SQLITE_DONE;. 
14fb0 20 20 20 70 2d 3e 65 53 74 61 67 65 20 3d 20 52     p->eStage = R
14fc0 42 55 5f 53 54 41 47 45 5f 44 4f 4e 45 3b 0a 20  BU_STAGE_DONE;. 
14fd0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c   }.}../*.** Call
14fe0 65 64 20 77 68 65 6e 20 69 41 6d 74 20 62 79 74  ed when iAmt byt
14ff0 65 73 20 61 72 65 20 72 65 61 64 20 66 72 6f 6d  es are read from
15000 20 6f 66 66 73 65 74 20 69 4f 66 66 20 6f 66 20   offset iOff of 
15010 74 68 65 20 77 61 6c 20 66 69 6c 65 20 77 68 69  the wal file whi
15020 6c 65 0a 2a 2a 20 74 68 65 20 72 62 75 20 6f 62  le.** the rbu ob
15030 6a 65 63 74 20 69 73 20 69 6e 20 63 61 70 74 75  ject is in captu
15040 72 65 20 6d 6f 64 65 2e 20 52 65 63 6f 72 64 20  re mode. Record 
15050 74 68 65 20 66 72 61 6d 65 20 6e 75 6d 62 65 72  the frame number
15060 20 6f 66 20 74 68 65 20 66 72 61 6d 65 0a 2a 2a   of the frame.**
15070 20 62 65 69 6e 67 20 72 65 61 64 20 69 6e 20 74   being read in t
15080 68 65 20 61 46 72 61 6d 65 5b 5d 20 61 72 72 61  he aFrame[] arra
15090 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
150a0 20 72 62 75 43 61 70 74 75 72 65 57 61 6c 52 65   rbuCaptureWalRe
150b0 61 64 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70  ad(sqlite3rbu *p
150c0 52 62 75 2c 20 69 36 34 20 69 4f 66 66 2c 20 69  Rbu, i64 iOff, i
150d0 6e 74 20 69 41 6d 74 29 7b 0a 20 20 63 6f 6e 73  nt iAmt){.  cons
150e0 74 20 75 33 32 20 6d 52 65 71 20 3d 20 28 31 3c  t u32 mReq = (1<
150f0 3c 57 41 4c 5f 4c 4f 43 4b 5f 57 52 49 54 45 29  <WAL_LOCK_WRITE)
15100 7c 28 31 3c 3c 57 41 4c 5f 4c 4f 43 4b 5f 43 4b  |(1<<WAL_LOCK_CK
15110 50 54 29 7c 28 31 3c 3c 57 41 4c 5f 4c 4f 43 4b  PT)|(1<<WAL_LOCK
15120 5f 52 45 41 44 30 29 3b 0a 20 20 75 33 32 20 69  _READ0);.  u32 i
15130 46 72 61 6d 65 3b 0a 0a 20 20 69 66 28 20 70 52  Frame;..  if( pR
15140 62 75 2d 3e 6d 4c 6f 63 6b 21 3d 6d 52 65 71 20  bu->mLock!=mReq 
15150 29 7b 0a 20 20 20 20 70 52 62 75 2d 3e 72 63 20  ){.    pRbu->rc 
15160 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
15170 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
15180 5f 49 4e 54 45 52 4e 41 4c 3b 0a 20 20 7d 0a 0a  _INTERNAL;.  }..
15190 20 20 70 52 62 75 2d 3e 70 67 73 7a 20 3d 20 69    pRbu->pgsz = i
151a0 41 6d 74 3b 0a 20 20 69 66 28 20 70 52 62 75 2d  Amt;.  if( pRbu-
151b0 3e 6e 46 72 61 6d 65 3d 3d 70 52 62 75 2d 3e 6e  >nFrame==pRbu->n
151c0 46 72 61 6d 65 41 6c 6c 6f 63 20 29 7b 0a 20 20  FrameAlloc ){.  
151d0 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 28 70 52    int nNew = (pR
151e0 62 75 2d 3e 6e 46 72 61 6d 65 41 6c 6c 6f 63 20  bu->nFrameAlloc 
151f0 3f 20 70 52 62 75 2d 3e 6e 46 72 61 6d 65 41 6c  ? pRbu->nFrameAl
15200 6c 6f 63 20 3a 20 36 34 29 20 2a 20 32 3b 0a 20  loc : 64) * 2;. 
15210 20 20 20 52 62 75 46 72 61 6d 65 20 2a 61 4e 65     RbuFrame *aNe
15220 77 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20 28 52  w;.    aNew = (R
15230 62 75 46 72 61 6d 65 2a 29 73 71 6c 69 74 65 33  buFrame*)sqlite3
15240 5f 72 65 61 6c 6c 6f 63 36 34 28 70 52 62 75 2d  _realloc64(pRbu-
15250 3e 61 46 72 61 6d 65 2c 20 6e 4e 65 77 20 2a 20  >aFrame, nNew * 
15260 73 69 7a 65 6f 66 28 52 62 75 46 72 61 6d 65 29  sizeof(RbuFrame)
15270 29 3b 0a 20 20 20 20 69 66 28 20 61 4e 65 77 3d  );.    if( aNew=
15280 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
15290 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 70 52  TE_NOMEM;.    pR
152a0 62 75 2d 3e 61 46 72 61 6d 65 20 3d 20 61 4e 65  bu->aFrame = aNe
152b0 77 3b 0a 20 20 20 20 70 52 62 75 2d 3e 6e 46 72  w;.    pRbu->nFr
152c0 61 6d 65 41 6c 6c 6f 63 20 3d 20 6e 4e 65 77 3b  ameAlloc = nNew;
152d0 0a 20 20 7d 0a 0a 20 20 69 46 72 61 6d 65 20 3d  .  }..  iFrame =
152e0 20 28 75 33 32 29 28 28 69 4f 66 66 2d 33 32 29   (u32)((iOff-32)
152f0 20 2f 20 28 69 36 34 29 28 69 41 6d 74 2b 32 34   / (i64)(iAmt+24
15300 29 29 20 2b 20 31 3b 0a 20 20 69 66 28 20 70 52  )) + 1;.  if( pR
15310 62 75 2d 3e 69 4d 61 78 46 72 61 6d 65 3c 69 46  bu->iMaxFrame<iF
15320 72 61 6d 65 20 29 20 70 52 62 75 2d 3e 69 4d 61  rame ) pRbu->iMa
15330 78 46 72 61 6d 65 20 3d 20 69 46 72 61 6d 65 3b  xFrame = iFrame;
15340 0a 20 20 70 52 62 75 2d 3e 61 46 72 61 6d 65 5b  .  pRbu->aFrame[
15350 70 52 62 75 2d 3e 6e 46 72 61 6d 65 5d 2e 69 57  pRbu->nFrame].iW
15360 61 6c 46 72 61 6d 65 20 3d 20 69 46 72 61 6d 65  alFrame = iFrame
15370 3b 0a 20 20 70 52 62 75 2d 3e 61 46 72 61 6d 65  ;.  pRbu->aFrame
15380 5b 70 52 62 75 2d 3e 6e 46 72 61 6d 65 5d 2e 69  [pRbu->nFrame].i
15390 44 62 50 61 67 65 20 3d 20 30 3b 0a 20 20 70 52  DbPage = 0;.  pR
153a0 62 75 2d 3e 6e 46 72 61 6d 65 2b 2b 3b 0a 20 20  bu->nFrame++;.  
153b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
153c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 65  ;.}../*.** Calle
153d0 64 20 77 68 65 6e 20 61 20 70 61 67 65 20 6f 66  d when a page of
153e0 20 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e   data is written
153f0 20 74 6f 20 6f 66 66 73 65 74 20 69 4f 66 66 20   to offset iOff 
15400 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  of the database.
15410 2a 2a 20 66 69 6c 65 20 77 68 69 6c 65 20 74 68  ** file while th
15420 65 20 72 62 75 20 68 61 6e 64 6c 65 20 69 73 20  e rbu handle is 
15430 69 6e 20 63 61 70 74 75 72 65 20 6d 6f 64 65 2e  in capture mode.
15440 20 52 65 63 6f 72 64 20 74 68 65 20 70 61 67 65   Record the page
15450 20 6e 75 6d 62 65 72 20 0a 2a 2a 20 6f 66 20 74   number .** of t
15460 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 77 72  he page being wr
15470 69 74 74 65 6e 20 69 6e 20 74 68 65 20 61 46 72  itten in the aFr
15480 61 6d 65 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a  ame[] array..*/.
15490 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 43 61  static int rbuCa
154a0 70 74 75 72 65 44 62 57 72 69 74 65 28 73 71 6c  ptureDbWrite(sql
154b0 69 74 65 33 72 62 75 20 2a 70 52 62 75 2c 20 69  ite3rbu *pRbu, i
154c0 36 34 20 69 4f 66 66 29 7b 0a 20 20 70 52 62 75  64 iOff){.  pRbu
154d0 2d 3e 61 46 72 61 6d 65 5b 70 52 62 75 2d 3e 6e  ->aFrame[pRbu->n
154e0 46 72 61 6d 65 2d 31 5d 2e 69 44 62 50 61 67 65  Frame-1].iDbPage
154f0 20 3d 20 28 75 33 32 29 28 69 4f 66 66 20 2f 20   = (u32)(iOff / 
15500 70 52 62 75 2d 3e 70 67 73 7a 29 20 2b 20 31 3b  pRbu->pgsz) + 1;
15510 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
15520 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
15530 69 73 20 69 73 20 63 61 6c 6c 65 64 20 61 73 20  is is called as 
15540 70 61 72 74 20 6f 66 20 61 6e 20 69 6e 63 72 65  part of an incre
15550 6d 65 6e 74 61 6c 20 63 68 65 63 6b 70 6f 69 6e  mental checkpoin
15560 74 20 6f 70 65 72 61 74 69 6f 6e 2e 20 43 6f 70  t operation. Cop
15570 79 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 66 72  y.** a single fr
15580 61 6d 65 20 6f 66 20 64 61 74 61 20 66 72 6f 6d  ame of data from
15590 20 74 68 65 20 77 61 6c 20 66 69 6c 65 20 69 6e   the wal file in
155a0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
155b0 66 69 6c 65 2c 20 61 73 0a 2a 2a 20 69 6e 64 69  file, as.** indi
155c0 63 61 74 65 64 20 62 79 20 74 68 65 20 52 62 75  cated by the Rbu
155d0 46 72 61 6d 65 20 6f 62 6a 65 63 74 2e 0a 2a 2f  Frame object..*/
155e0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75  .static void rbu
155f0 43 68 65 63 6b 70 6f 69 6e 74 46 72 61 6d 65 28  CheckpointFrame(
15600 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 52  sqlite3rbu *p, R
15610 62 75 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 29  buFrame *pFrame)
15620 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  {.  sqlite3_file
15630 20 2a 70 57 61 6c 20 3d 20 70 2d 3e 70 54 61 72   *pWal = p->pTar
15640 67 65 74 46 64 2d 3e 70 57 61 6c 46 64 2d 3e 70  getFd->pWalFd->p
15650 52 65 61 6c 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Real;.  sqlite3_
15660 66 69 6c 65 20 2a 70 44 62 20 3d 20 70 2d 3e 70  file *pDb = p->p
15670 54 61 72 67 65 74 46 64 2d 3e 70 52 65 61 6c 3b  TargetFd->pReal;
15680 0a 20 20 69 36 34 20 69 4f 66 66 3b 0a 0a 20 20  .  i64 iOff;..  
15690 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53  assert( p->rc==S
156a0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 4f  QLITE_OK );.  iO
156b0 66 66 20 3d 20 28 69 36 34 29 28 70 46 72 61 6d  ff = (i64)(pFram
156c0 65 2d 3e 69 57 61 6c 46 72 61 6d 65 2d 31 29 20  e->iWalFrame-1) 
156d0 2a 20 28 70 2d 3e 70 67 73 7a 20 2b 20 32 34 29  * (p->pgsz + 24)
156e0 20 2b 20 33 32 20 2b 20 32 34 3b 0a 20 20 70 2d   + 32 + 24;.  p-
156f0 3e 72 63 20 3d 20 70 57 61 6c 2d 3e 70 4d 65 74  >rc = pWal->pMet
15700 68 6f 64 73 2d 3e 78 52 65 61 64 28 70 57 61 6c  hods->xRead(pWal
15710 2c 20 70 2d 3e 61 42 75 66 2c 20 70 2d 3e 70 67  , p->aBuf, p->pg
15720 73 7a 2c 20 69 4f 66 66 29 3b 0a 20 20 69 66 28  sz, iOff);.  if(
15730 20 70 2d 3e 72 63 20 29 20 72 65 74 75 72 6e 3b   p->rc ) return;
15740 0a 0a 20 20 69 4f 66 66 20 3d 20 28 69 36 34 29  ..  iOff = (i64)
15750 28 70 46 72 61 6d 65 2d 3e 69 44 62 50 61 67 65  (pFrame->iDbPage
15760 2d 31 29 20 2a 20 70 2d 3e 70 67 73 7a 3b 0a 20  -1) * p->pgsz;. 
15770 20 70 2d 3e 72 63 20 3d 20 70 44 62 2d 3e 70 4d   p->rc = pDb->pM
15780 65 74 68 6f 64 73 2d 3e 78 57 72 69 74 65 28 70  ethods->xWrite(p
15790 44 62 2c 20 70 2d 3e 61 42 75 66 2c 20 70 2d 3e  Db, p->aBuf, p->
157a0 70 67 73 7a 2c 20 69 4f 66 66 29 3b 0a 7d 0a 0a  pgsz, iOff);.}..
157b0 0a 2f 2a 0a 2a 2a 20 54 61 6b 65 20 61 6e 20 45  ./*.** Take an E
157c0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
157d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
157e0 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  le..*/.static vo
157f0 69 64 20 72 62 75 4c 6f 63 6b 44 61 74 61 62 61  id rbuLockDataba
15800 73 65 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70  se(sqlite3rbu *p
15810 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  ){.  sqlite3_fil
15820 65 20 2a 70 52 65 61 6c 20 3d 20 70 2d 3e 70 54  e *pReal = p->pT
15830 61 72 67 65 74 46 64 2d 3e 70 52 65 61 6c 3b 0a  argetFd->pReal;.
15840 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d    assert( p->rc=
15850 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
15860 70 2d 3e 72 63 20 3d 20 70 52 65 61 6c 2d 3e 70  p->rc = pReal->p
15870 4d 65 74 68 6f 64 73 2d 3e 78 4c 6f 63 6b 28 70  Methods->xLock(p
15880 52 65 61 6c 2c 20 53 51 4c 49 54 45 5f 4c 4f 43  Real, SQLITE_LOC
15890 4b 5f 53 48 41 52 45 44 29 3b 0a 20 20 69 66 28  K_SHARED);.  if(
158a0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
158b0 4b 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  K ){.    p->rc =
158c0 20 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73   pReal->pMethods
158d0 2d 3e 78 4c 6f 63 6b 28 70 52 65 61 6c 2c 20 53  ->xLock(pReal, S
158e0 51 4c 49 54 45 5f 4c 4f 43 4b 5f 45 58 43 4c 55  QLITE_LOCK_EXCLU
158f0 53 49 56 45 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69  SIVE);.  }.}..#i
15900 66 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32  f defined(_WIN32
15910 5f 57 43 45 29 0a 73 74 61 74 69 63 20 4c 50 57  _WCE).static LPW
15920 53 54 52 20 72 62 75 57 69 6e 55 74 66 38 54 6f  STR rbuWinUtf8To
15930 55 6e 69 63 6f 64 65 28 63 6f 6e 73 74 20 63 68  Unicode(const ch
15940 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a  ar *zFilename){.
15950 20 20 69 6e 74 20 6e 43 68 61 72 3b 0a 20 20 4c    int nChar;.  L
15960 50 57 53 54 52 20 7a 57 69 64 65 46 69 6c 65 6e  PWSTR zWideFilen
15970 61 6d 65 3b 0a 0a 20 20 6e 43 68 61 72 20 3d 20  ame;..  nChar = 
15980 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43  MultiByteToWideC
15990 68 61 72 28 43 50 5f 55 54 46 38 2c 20 30 2c 20  har(CP_UTF8, 0, 
159a0 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 4e  zFilename, -1, N
159b0 55 4c 4c 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e  ULL, 0);.  if( n
159c0 43 68 61 72 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Char==0 ){.    r
159d0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a  eturn 0;.  }.  z
159e0 57 69 64 65 46 69 6c 65 6e 61 6d 65 20 3d 20 73  WideFilename = s
159f0 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28  qlite3_malloc64(
15a00 20 6e 43 68 61 72 2a 73 69 7a 65 6f 66 28 7a 57   nChar*sizeof(zW
15a10 69 64 65 46 69 6c 65 6e 61 6d 65 5b 30 5d 29 20  ideFilename[0]) 
15a20 29 3b 0a 20 20 69 66 28 20 7a 57 69 64 65 46 69  );.  if( zWideFi
15a30 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  lename==0 ){.   
15a40 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
15a50 20 6d 65 6d 73 65 74 28 7a 57 69 64 65 46 69 6c   memset(zWideFil
15a60 65 6e 61 6d 65 2c 20 30 2c 20 6e 43 68 61 72 2a  ename, 0, nChar*
15a70 73 69 7a 65 6f 66 28 7a 57 69 64 65 46 69 6c 65  sizeof(zWideFile
15a80 6e 61 6d 65 5b 30 5d 29 29 3b 0a 20 20 6e 43 68  name[0]));.  nCh
15a90 61 72 20 3d 20 4d 75 6c 74 69 42 79 74 65 54 6f  ar = MultiByteTo
15aa0 57 69 64 65 43 68 61 72 28 43 50 5f 55 54 46 38  WideChar(CP_UTF8
15ab0 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20  , 0, zFilename, 
15ac0 2d 31 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d  -1, zWideFilenam
15ad0 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
15ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15af0 20 20 20 6e 43 68 61 72 29 3b 0a 20 20 69 66 28     nChar);.  if(
15b00 20 6e 43 68 61 72 3d 3d 30 20 29 7b 0a 20 20 20   nChar==0 ){.   
15b10 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 57   sqlite3_free(zW
15b20 69 64 65 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  ideFilename);.  
15b30 20 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 20    zWideFilename 
15b40 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
15b50 6e 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 3b  n zWideFilename;
15b60 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
15b70 20 54 68 65 20 52 42 55 20 68 61 6e 64 6c 65 20   The RBU handle 
15b80 69 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  is currently in 
15b90 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20 73 74  RBU_STAGE_OAL st
15ba0 61 74 65 2c 20 77 69 74 68 20 61 20 53 48 41 52  ate, with a SHAR
15bb0 45 44 20 6c 6f 63 6b 0a 2a 2a 20 6f 6e 20 74 68  ED lock.** on th
15bc0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
15bd0 20 54 68 69 73 20 70 72 6f 63 20 6d 6f 76 65 73   This proc moves
15be0 20 74 68 65 20 2a 2d 6f 61 6c 20 66 69 6c 65 20   the *-oal file 
15bf0 74 6f 20 74 68 65 20 2a 2d 77 61 6c 20 70 61 74  to the *-wal pat
15c00 68 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 6f 70 65  h,.** then reope
15c10 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ns the database 
15c20 66 69 6c 65 20 28 74 68 69 73 20 74 69 6d 65 20  file (this time 
15c30 69 6e 20 76 61 6e 69 6c 6c 61 2c 20 6e 6f 6e 2d  in vanilla, non-
15c40 6f 61 6c 2c 20 57 41 4c 20 6d 6f 64 65 29 2e 0a  oal, WAL mode)..
15c50 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
15c60 63 63 75 72 73 2c 20 6c 65 61 76 65 20 61 6e 20  ccurs, leave an 
15c70 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 65  error code and e
15c80 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20  rror message in 
15c90 74 68 65 20 72 62 75 20 0a 2a 2a 20 68 61 6e 64  the rbu .** hand
15ca0 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  le..*/.static vo
15cb0 69 64 20 72 62 75 4d 6f 76 65 4f 61 6c 46 69 6c  id rbuMoveOalFil
15cc0 65 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 29  e(sqlite3rbu *p)
15cd0 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
15ce0 7a 42 61 73 65 20 3d 20 73 71 6c 69 74 65 33 5f  zBase = sqlite3_
15cf0 64 62 5f 66 69 6c 65 6e 61 6d 65 28 70 2d 3e 64  db_filename(p->d
15d00 62 4d 61 69 6e 2c 20 22 6d 61 69 6e 22 29 3b 0a  bMain, "main");.
15d10 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d    const char *zM
15d20 6f 76 65 20 3d 20 7a 42 61 73 65 3b 0a 20 20 63  ove = zBase;.  c
15d30 68 61 72 20 2a 7a 4f 61 6c 3b 0a 20 20 63 68 61  har *zOal;.  cha
15d40 72 20 2a 7a 57 61 6c 3b 0a 0a 20 20 69 66 28 20  r *zWal;..  if( 
15d50 72 62 75 49 73 56 61 63 75 75 6d 28 70 29 20 29  rbuIsVacuum(p) )
15d60 7b 0a 20 20 20 20 7a 4d 6f 76 65 20 3d 20 73 71  {.    zMove = sq
15d70 6c 69 74 65 33 5f 64 62 5f 66 69 6c 65 6e 61 6d  lite3_db_filenam
15d80 65 28 70 2d 3e 64 62 52 62 75 2c 20 22 6d 61 69  e(p->dbRbu, "mai
15d90 6e 22 29 3b 0a 20 20 7d 0a 20 20 7a 4f 61 6c 20  n");.  }.  zOal 
15da0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
15db0 66 28 22 25 73 2d 6f 61 6c 22 2c 20 7a 4d 6f 76  f("%s-oal", zMov
15dc0 65 29 3b 0a 20 20 7a 57 61 6c 20 3d 20 73 71 6c  e);.  zWal = sql
15dd0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
15de0 2d 77 61 6c 22 2c 20 7a 4d 6f 76 65 29 3b 0a 0a  -wal", zMove);..
15df0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 53 74    assert( p->eSt
15e00 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4d  age==RBU_STAGE_M
15e10 4f 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OVE );.  assert(
15e20 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
15e30 4b 20 26 26 20 70 2d 3e 7a 45 72 72 6d 73 67 3d  K && p->zErrmsg=
15e40 3d 30 20 29 3b 0a 20 20 69 66 28 20 7a 57 61 6c  =0 );.  if( zWal
15e50 3d 3d 30 20 7c 7c 20 7a 4f 61 6c 3d 3d 30 20 29  ==0 || zOal==0 )
15e60 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51  {.    p->rc = SQ
15e70 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65  LITE_NOMEM;.  }e
15e80 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4d 6f 76 65  lse{.    /* Move
15e90 20 74 68 65 20 2a 2d 6f 61 6c 20 66 69 6c 65 20   the *-oal file 
15ea0 74 6f 20 2a 2d 77 61 6c 2e 20 41 74 20 74 68 69  to *-wal. At thi
15eb0 73 20 70 6f 69 6e 74 20 63 6f 6e 6e 65 63 74 69  s point connecti
15ec0 6f 6e 20 70 2d 3e 64 62 20 69 73 0a 20 20 20 20  on p->db is.    
15ed0 2a 2a 20 68 6f 6c 64 69 6e 67 20 61 20 53 48 41  ** holding a SHA
15ee0 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  RED lock on the 
15ef0 74 61 72 67 65 74 20 64 61 74 61 62 61 73 65 20  target database 
15f00 66 69 6c 65 20 28 62 65 63 61 75 73 65 20 69 74  file (because it
15f10 20 69 73 0a 20 20 20 20 2a 2a 20 69 6e 20 57 41   is.    ** in WA
15f20 4c 20 6d 6f 64 65 29 2e 20 53 6f 20 6e 6f 20 6f  L mode). So no o
15f30 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ther connection 
15f40 6d 61 79 20 62 65 20 77 72 69 74 69 6e 67 20 74  may be writing t
15f50 68 65 20 64 62 2e 20 0a 20 20 20 20 2a 2a 0a 20  he db. .    **. 
15f60 20 20 20 2a 2a 20 49 6e 20 6f 72 64 65 72 20 74     ** In order t
15f70 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68  o ensure that th
15f80 65 72 65 20 61 72 65 20 6e 6f 20 64 61 74 61 62  ere are no datab
15f90 61 73 65 20 72 65 61 64 65 72 73 2c 20 61 6e 20  ase readers, an 
15fa0 45 58 43 4c 55 53 49 56 45 0a 20 20 20 20 2a 2a  EXCLUSIVE.    **
15fb0 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65   lock is obtaine
15fc0 64 20 68 65 72 65 20 62 65 66 6f 72 65 20 74 68  d here before th
15fd0 65 20 2a 2d 6f 61 6c 20 69 73 20 6d 6f 76 65 64  e *-oal is moved
15fe0 20 74 6f 20 2a 2d 77 61 6c 2e 0a 20 20 20 20 2a   to *-wal..    *
15ff0 2f 0a 20 20 20 20 72 62 75 4c 6f 63 6b 44 61 74  /.    rbuLockDat
16000 61 62 61 73 65 28 70 29 3b 0a 20 20 20 20 69 66  abase(p);.    if
16010 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
16020 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 62 75 46  OK ){.      rbuF
16030 69 6c 65 53 75 66 66 69 78 33 28 7a 42 61 73 65  ileSuffix3(zBase
16040 2c 20 7a 57 61 6c 29 3b 0a 20 20 20 20 20 20 72  , zWal);.      r
16050 62 75 46 69 6c 65 53 75 66 66 69 78 33 28 7a 42  buFileSuffix3(zB
16060 61 73 65 2c 20 7a 4f 61 6c 29 3b 0a 0a 20 20 20  ase, zOal);..   
16070 20 20 20 2f 2a 20 52 65 2d 6f 70 65 6e 20 74 68     /* Re-open th
16080 65 20 64 61 74 61 62 61 73 65 73 2e 20 2a 2f 0a  e databases. */.
16090 20 20 20 20 20 20 72 62 75 4f 62 6a 49 74 65 72        rbuObjIter
160a0 46 69 6e 61 6c 69 7a 65 28 26 70 2d 3e 6f 62 6a  Finalize(&p->obj
160b0 69 74 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  iter);.      sql
160c0 69 74 65 33 5f 63 6c 6f 73 65 28 70 2d 3e 64 62  ite3_close(p->db
160d0 52 62 75 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Rbu);.      sqli
160e0 74 65 33 5f 63 6c 6f 73 65 28 70 2d 3e 64 62 4d  te3_close(p->dbM
160f0 61 69 6e 29 3b 0a 20 20 20 20 20 20 70 2d 3e 64  ain);.      p->d
16100 62 4d 61 69 6e 20 3d 20 30 3b 0a 20 20 20 20 20  bMain = 0;.     
16110 20 70 2d 3e 64 62 52 62 75 20 3d 20 30 3b 0a 0a   p->dbRbu = 0;..
16120 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57 49 4e  #if defined(_WIN
16130 33 32 5f 57 43 45 29 0a 20 20 20 20 20 20 7b 0a  32_WCE).      {.
16140 20 20 20 20 20 20 20 20 4c 50 57 53 54 52 20 7a          LPWSTR z
16150 57 69 64 65 4f 61 6c 3b 0a 20 20 20 20 20 20 20  WideOal;.       
16160 20 4c 50 57 53 54 52 20 7a 57 69 64 65 57 61 6c   LPWSTR zWideWal
16170 3b 0a 0a 20 20 20 20 20 20 20 20 7a 57 69 64 65  ;..        zWide
16180 4f 61 6c 20 3d 20 72 62 75 57 69 6e 55 74 66 38  Oal = rbuWinUtf8
16190 54 6f 55 6e 69 63 6f 64 65 28 7a 4f 61 6c 29 3b  ToUnicode(zOal);
161a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 57 69  .        if( zWi
161b0 64 65 4f 61 6c 20 29 7b 0a 20 20 20 20 20 20 20  deOal ){.       
161c0 20 20 20 7a 57 69 64 65 57 61 6c 20 3d 20 72 62     zWideWal = rb
161d0 75 57 69 6e 55 74 66 38 54 6f 55 6e 69 63 6f 64  uWinUtf8ToUnicod
161e0 65 28 7a 57 61 6c 29 3b 0a 20 20 20 20 20 20 20  e(zWal);.       
161f0 20 20 20 69 66 28 20 7a 57 69 64 65 57 61 6c 20     if( zWideWal 
16200 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
16210 66 28 20 4d 6f 76 65 46 69 6c 65 57 28 7a 57 69  f( MoveFileW(zWi
16220 64 65 4f 61 6c 2c 20 7a 57 69 64 65 57 61 6c 29  deOal, zWideWal)
16230 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
16240 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
16250 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  _OK;.           
16260 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
16270 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51        p->rc = SQ
16280 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20  LITE_IOERR;.    
16290 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
162a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
162b0 65 65 28 7a 57 69 64 65 57 61 6c 29 3b 0a 20 20  ee(zWideWal);.  
162c0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
162d0 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63             p->rc
162e0 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
162f0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20  NOMEM;.         
16300 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c   }.          sql
16310 69 74 65 33 5f 66 72 65 65 28 7a 57 69 64 65 4f  ite3_free(zWideO
16320 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  al);.        }el
16330 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d  se{.          p-
16340 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45  >rc = SQLITE_IOE
16350 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  RR_NOMEM;.      
16360 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6c 73    }.      }.#els
16370 65 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20  e.      p->rc = 
16380 72 65 6e 61 6d 65 28 7a 4f 61 6c 2c 20 7a 57 61  rename(zOal, zWa
16390 6c 29 20 3f 20 53 51 4c 49 54 45 5f 49 4f 45 52  l) ? SQLITE_IOER
163a0 52 20 3a 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23  R : SQLITE_OK;.#
163b0 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 69 66 28  endif..      if(
163c0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
163d0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 62 75  K ){.        rbu
163e0 4f 70 65 6e 44 61 74 61 62 61 73 65 28 70 29 3b  OpenDatabase(p);
163f0 0a 20 20 20 20 20 20 20 20 72 62 75 53 65 74 75  .        rbuSetu
16400 70 43 68 65 63 6b 70 6f 69 6e 74 28 70 2c 20 30  pCheckpoint(p, 0
16410 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
16420 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f  .  }..  sqlite3_
16430 66 72 65 65 28 7a 57 61 6c 29 3b 0a 20 20 73 71  free(zWal);.  sq
16440 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 61 6c 29  lite3_free(zOal)
16450 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 53  ;.}../*.** The S
16460 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
16470 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67  iterating throug
16480 68 20 74 68 65 20 6b 65 79 73 20 66 6f 72 20 74  h the keys for t
16490 68 65 20 63 75 72 72 65 6e 74 20 6f 62 6a 65 63  he current objec
164a0 74 0a 2a 2a 20 28 70 2d 3e 6f 62 6a 69 74 65 72  t.** (p->objiter
164b0 2e 70 53 65 6c 65 63 74 29 20 63 75 72 72 65 6e  .pSelect) curren
164c0 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  tly points to a 
164d0 76 61 6c 69 64 20 72 6f 77 2e 20 54 68 69 73 20  valid row. This 
164e0 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 64 65 74 65  function.** dete
164f0 72 6d 69 6e 65 73 20 74 68 65 20 74 79 70 65 20  rmines the type 
16500 6f 66 20 6f 70 65 72 61 74 69 6f 6e 20 72 65 71  of operation req
16510 75 65 73 74 65 64 20 62 79 20 74 68 69 73 20 72  uested by this r
16520 6f 77 20 61 6e 64 20 72 65 74 75 72 6e 73 0a 2a  ow and returns.*
16530 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c  * one of the fol
16540 6c 6f 77 69 6e 67 20 76 61 6c 75 65 73 20 74 6f  lowing values to
16550 20 69 6e 64 69 63 61 74 65 20 74 68 65 20 72 65   indicate the re
16560 73 75 6c 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  sult:.**.**     
16570 2a 20 52 42 55 5f 49 4e 53 45 52 54 0a 2a 2a 20  * RBU_INSERT.** 
16580 20 20 20 20 2a 20 52 42 55 5f 44 45 4c 45 54 45      * RBU_DELETE
16590 0a 2a 2a 20 20 20 20 20 2a 20 52 42 55 5f 49 44  .**     * RBU_ID
165a0 58 5f 44 45 4c 45 54 45 0a 2a 2a 20 20 20 20 20  X_DELETE.**     
165b0 2a 20 52 42 55 5f 55 50 44 41 54 45 0a 2a 2a 0a  * RBU_UPDATE.**.
165c0 2a 2a 20 49 66 20 52 42 55 5f 55 50 44 41 54 45  ** If RBU_UPDATE
165d0 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68   is returned, th
165e0 65 6e 20 6f 75 74 70 75 74 20 76 61 72 69 61 62  en output variab
165f0 6c 65 20 2a 70 7a 4d 61 73 6b 20 69 73 20 73 65  le *pzMask is se
16600 74 20 74 6f 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f  t to.** point to
16610 20 74 68 65 20 74 65 78 74 20 76 61 6c 75 65 20   the text value 
16620 69 6e 64 69 63 61 74 69 6e 67 20 74 68 65 20 63  indicating the c
16630 6f 6c 75 6d 6e 73 20 74 6f 20 75 70 64 61 74 65  olumns to update
16640 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72  ..**.** If the r
16650 62 75 5f 63 6f 6e 74 72 6f 6c 20 66 69 65 6c 64  bu_control field
16660 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6e 76   contains an inv
16670 61 6c 69 64 20 76 61 6c 75 65 2c 20 61 6e 20 65  alid value, an e
16680 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 0a 2a 2a  rror code and.**
16690 20 6d 65 73 73 61 67 65 20 61 72 65 20 6c 65 66   message are lef
166a0 74 20 69 6e 20 74 68 65 20 52 42 55 20 68 61 6e  t in the RBU han
166b0 64 6c 65 20 61 6e 64 20 7a 65 72 6f 20 72 65 74  dle and zero ret
166c0 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
166d0 20 69 6e 74 20 72 62 75 53 74 65 70 54 79 70 65   int rbuStepType
166e0 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20  (sqlite3rbu *p, 
166f0 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4d  const char **pzM
16700 61 73 6b 29 7b 0a 20 20 69 6e 74 20 69 43 6f 6c  ask){.  int iCol
16710 20 3d 20 70 2d 3e 6f 62 6a 69 74 65 72 2e 6e 43   = p->objiter.nC
16720 6f 6c 3b 20 20 20 20 20 2f 2a 20 49 6e 64 65 78  ol;     /* Index
16730 20 6f 66 20 72 62 75 5f 63 6f 6e 74 72 6f 6c 20   of rbu_control 
16740 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20  column */.  int 
16750 72 65 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20  res = 0;        
16760 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
16770 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a  eturn value */..
16780 20 20 73 77 69 74 63 68 28 20 73 71 6c 69 74 65    switch( sqlite
16790 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 2d  3_column_type(p-
167a0 3e 6f 62 6a 69 74 65 72 2e 70 53 65 6c 65 63 74  >objiter.pSelect
167b0 2c 20 69 43 6f 6c 29 20 29 7b 0a 20 20 20 20 63  , iCol) ){.    c
167c0 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47  ase SQLITE_INTEG
167d0 45 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  ER: {.      int 
167e0 69 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63  iVal = sqlite3_c
167f0 6f 6c 75 6d 6e 5f 69 6e 74 28 70 2d 3e 6f 62 6a  olumn_int(p->obj
16800 69 74 65 72 2e 70 53 65 6c 65 63 74 2c 20 69 43  iter.pSelect, iC
16810 6f 6c 29 3b 0a 20 20 20 20 20 20 73 77 69 74 63  ol);.      switc
16820 68 28 20 69 56 61 6c 20 29 7b 0a 20 20 20 20 20  h( iVal ){.     
16830 20 20 20 63 61 73 65 20 30 3a 20 72 65 73 20 3d     case 0: res =
16840 20 52 42 55 5f 49 4e 53 45 52 54 3b 20 20 20 20   RBU_INSERT;    
16850 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
16860 63 61 73 65 20 31 3a 20 72 65 73 20 3d 20 52 42  case 1: res = RB
16870 55 5f 44 45 4c 45 54 45 3b 20 20 20 20 20 62 72  U_DELETE;     br
16880 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73  eak;.        cas
16890 65 20 32 3a 20 72 65 73 20 3d 20 52 42 55 5f 52  e 2: res = RBU_R
168a0 45 50 4c 41 43 45 3b 20 20 20 20 62 72 65 61 6b  EPLACE;    break
168b0 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 33  ;.        case 3
168c0 3a 20 72 65 73 20 3d 20 52 42 55 5f 49 44 58 5f  : res = RBU_IDX_
168d0 44 45 4c 45 54 45 3b 20 62 72 65 61 6b 3b 0a 20  DELETE; break;. 
168e0 20 20 20 20 20 20 20 63 61 73 65 20 34 3a 20 72         case 4: r
168f0 65 73 20 3d 20 52 42 55 5f 49 44 58 5f 49 4e 53  es = RBU_IDX_INS
16900 45 52 54 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  ERT; break;.    
16910 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
16920 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65  .    }..    case
16930 20 53 51 4c 49 54 45 5f 54 45 58 54 3a 20 7b 0a   SQLITE_TEXT: {.
16940 20 20 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69        const unsi
16950 67 6e 65 64 20 63 68 61 72 20 2a 7a 20 3d 20 73  gned char *z = s
16960 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
16970 78 74 28 70 2d 3e 6f 62 6a 69 74 65 72 2e 70 53  xt(p->objiter.pS
16980 65 6c 65 63 74 2c 20 69 43 6f 6c 29 3b 0a 20 20  elect, iCol);.  
16990 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a      if( z==0 ){.
169a0 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
169b0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
169c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
169d0 20 20 20 2a 70 7a 4d 61 73 6b 20 3d 20 28 63 6f     *pzMask = (co
169e0 6e 73 74 20 63 68 61 72 2a 29 7a 3b 0a 20 20 20  nst char*)z;.   
169f0 20 20 20 7d 0a 20 20 20 20 20 20 72 65 73 20 3d     }.      res =
16a00 20 52 42 55 5f 55 50 44 41 54 45 3b 0a 0a 20 20   RBU_UPDATE;..  
16a10 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
16a20 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20  ..    default:. 
16a30 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a       break;.  }.
16a40 0a 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b  .  if( res==0 ){
16a50 0a 20 20 20 20 72 62 75 42 61 64 43 6f 6e 74 72  .    rbuBadContr
16a60 6f 6c 45 72 72 6f 72 28 70 29 3b 0a 20 20 7d 0a  olError(p);.  }.
16a70 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a    return res;.}.
16a80 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
16a90 45 42 55 47 0a 2f 2a 0a 2a 2a 20 41 73 73 65 72  EBUG./*.** Asser
16aa0 74 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 69 43  t that column iC
16ab0 6f 6c 20 6f 66 20 73 74 61 74 65 6d 65 6e 74 20  ol of statement 
16ac0 70 53 74 6d 74 20 69 73 20 6e 61 6d 65 64 20 7a  pStmt is named z
16ad0 4e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Name..*/.static 
16ae0 76 6f 69 64 20 61 73 73 65 72 74 43 6f 6c 75 6d  void assertColum
16af0 6e 4e 61 6d 65 28 73 71 6c 69 74 65 33 5f 73 74  nName(sqlite3_st
16b00 6d 74 20 2a 70 53 74 6d 74 2c 20 69 6e 74 20 69  mt *pStmt, int i
16b10 43 6f 6c 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  Col, const char 
16b20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 63 6f 6e 73 74  *zName){.  const
16b30 20 63 68 61 72 20 2a 7a 43 6f 6c 20 3d 20 73 71   char *zCol = sq
16b40 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d  lite3_column_nam
16b50 65 28 70 53 74 6d 74 2c 20 69 43 6f 6c 29 3b 0a  e(pStmt, iCol);.
16b60 20 20 61 73 73 65 72 74 28 20 30 3d 3d 73 71 6c    assert( 0==sql
16b70 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 4e 61  ite3_stricmp(zNa
16b80 6d 65 2c 20 7a 43 6f 6c 29 20 29 3b 0a 7d 0a 23  me, zCol) );.}.#
16b90 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 61 73  else.# define as
16ba0 73 65 72 74 43 6f 6c 75 6d 6e 4e 61 6d 65 28 78  sertColumnName(x
16bb0 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ,y,z).#endif../*
16bc0 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 65 54 79  .** Argument eTy
16bd0 70 65 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f  pe must be one o
16be0 66 20 52 42 55 5f 49 4e 53 45 52 54 2c 20 52 42  f RBU_INSERT, RB
16bf0 55 5f 44 45 4c 45 54 45 2c 20 52 42 55 5f 49 44  U_DELETE, RBU_ID
16c00 58 5f 49 4e 53 45 52 54 20 6f 72 0a 2a 2a 20 52  X_INSERT or.** R
16c10 42 55 5f 49 44 58 5f 44 45 4c 45 54 45 2e 20 54  BU_IDX_DELETE. T
16c20 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 70 65 72  his function per
16c30 66 6f 72 6d 73 20 74 68 65 20 77 6f 72 6b 20 6f  forms the work o
16c40 66 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 73 71  f a single.** sq
16c50 6c 69 74 65 33 72 62 75 5f 73 74 65 70 28 29 20  lite3rbu_step() 
16c60 63 61 6c 6c 20 66 6f 72 20 74 68 65 20 74 79 70  call for the typ
16c70 65 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 20 73  e of operation s
16c80 70 65 63 69 66 69 65 64 20 62 79 20 65 54 79 70  pecified by eTyp
16c90 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
16ca0 64 20 72 62 75 53 74 65 70 4f 6e 65 4f 70 28 73  d rbuStepOneOp(s
16cb0 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 69 6e  qlite3rbu *p, in
16cc0 74 20 65 54 79 70 65 29 7b 0a 20 20 52 62 75 4f  t eType){.  RbuO
16cd0 62 6a 49 74 65 72 20 2a 70 49 74 65 72 20 3d 20  bjIter *pIter = 
16ce0 26 70 2d 3e 6f 62 6a 69 74 65 72 3b 0a 20 20 73  &p->objiter;.  s
16cf0 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56  qlite3_value *pV
16d00 61 6c 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  al;.  sqlite3_st
16d10 6d 74 20 2a 70 57 72 69 74 65 72 3b 0a 20 20 69  mt *pWriter;.  i
16d20 6e 74 20 69 3b 0a 0a 20 20 61 73 73 65 72 74 28  nt i;..  assert(
16d30 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
16d40 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  K );.  assert( e
16d50 54 79 70 65 21 3d 52 42 55 5f 44 45 4c 45 54 45  Type!=RBU_DELETE
16d60 20 7c 7c 20 70 49 74 65 72 2d 3e 7a 49 64 78 3d   || pIter->zIdx=
16d70 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
16d80 65 54 79 70 65 3d 3d 52 42 55 5f 44 45 4c 45 54  eType==RBU_DELET
16d90 45 20 7c 7c 20 65 54 79 70 65 3d 3d 52 42 55 5f  E || eType==RBU_
16da0 49 44 58 5f 44 45 4c 45 54 45 0a 20 20 20 20 20  IDX_DELETE.     
16db0 20 20 7c 7c 20 65 54 79 70 65 3d 3d 52 42 55 5f    || eType==RBU_
16dc0 49 4e 53 45 52 54 20 7c 7c 20 65 54 79 70 65 3d  INSERT || eType=
16dd0 3d 52 42 55 5f 49 44 58 5f 49 4e 53 45 52 54 0a  =RBU_IDX_INSERT.
16de0 20 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68    );..  /* If th
16df0 69 73 20 69 73 20 61 20 64 65 6c 65 74 65 2c 20  is is a delete, 
16e00 64 65 63 72 65 6d 65 6e 74 20 6e 50 68 61 73 65  decrement nPhase
16e10 4f 6e 65 53 74 65 70 20 62 79 20 6e 49 6e 64 65  OneStep by nInde
16e20 78 2e 20 49 66 20 74 68 65 20 44 45 4c 45 54 45  x. If the DELETE
16e30 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  .  ** statement 
16e40 62 65 6c 6f 77 20 64 6f 65 73 20 61 63 74 75 61  below does actua
16e50 6c 6c 79 20 64 65 6c 65 74 65 20 61 20 72 6f 77  lly delete a row
16e60 2c 20 6e 50 68 61 73 65 4f 6e 65 53 74 65 70 20  , nPhaseOneStep 
16e70 77 69 6c 6c 20 62 65 0a 20 20 2a 2a 20 69 6e 63  will be.  ** inc
16e80 72 65 6d 65 6e 74 65 64 20 62 79 20 74 68 65 20  remented by the 
16e90 73 61 6d 65 20 61 6d 6f 75 6e 74 20 77 68 65 6e  same amount when
16ea0 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 72 62   SQL function rb
16eb0 75 5f 74 6d 70 5f 69 6e 73 65 72 74 28 29 0a 20  u_tmp_insert(). 
16ec0 20 2a 2a 20 69 73 20 69 6e 76 6f 6b 65 64 20 62   ** is invoked b
16ed0 79 20 74 68 65 20 74 72 69 67 67 65 72 2e 20 20  y the trigger.  
16ee0 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d  */.  if( eType==
16ef0 52 42 55 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20  RBU_DELETE ){.  
16f00 20 20 70 2d 3e 6e 50 68 61 73 65 4f 6e 65 53 74    p->nPhaseOneSt
16f10 65 70 20 2d 3d 20 70 2d 3e 6f 62 6a 69 74 65 72  ep -= p->objiter
16f20 2e 6e 49 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20  .nIndex;.  }..  
16f30 69 66 28 20 65 54 79 70 65 3d 3d 52 42 55 5f 49  if( eType==RBU_I
16f40 44 58 5f 44 45 4c 45 54 45 20 7c 7c 20 65 54 79  DX_DELETE || eTy
16f50 70 65 3d 3d 52 42 55 5f 44 45 4c 45 54 45 20 29  pe==RBU_DELETE )
16f60 7b 0a 20 20 20 20 70 57 72 69 74 65 72 20 3d 20  {.    pWriter = 
16f70 70 49 74 65 72 2d 3e 70 44 65 6c 65 74 65 3b 0a  pIter->pDelete;.
16f80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 57 72    }else{.    pWr
16f90 69 74 65 72 20 3d 20 70 49 74 65 72 2d 3e 70 49  iter = pIter->pI
16fa0 6e 73 65 72 74 3b 0a 20 20 7d 0a 0a 20 20 66 6f  nsert;.  }..  fo
16fb0 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e  r(i=0; i<pIter->
16fc0 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
16fd0 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  /* If this is an
16fe0 20 49 4e 53 45 52 54 20 69 6e 74 6f 20 61 20 74   INSERT into a t
16ff0 61 62 6c 65 20 62 2d 74 72 65 65 20 61 6e 64 20  able b-tree and 
17000 74 68 65 20 74 61 62 6c 65 20 68 61 73 20 61 6e  the table has an
17010 0a 20 20 20 20 2a 2a 20 65 78 70 6c 69 63 69 74  .    ** explicit
17020 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
17030 20 4b 45 59 2c 20 63 68 65 63 6b 20 74 68 61 74   KEY, check that
17040 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 6e 20   this is not an 
17050 61 74 74 65 6d 70 74 0a 20 20 20 20 2a 2a 20 74  attempt.    ** t
17060 6f 20 77 72 69 74 65 20 61 20 4e 55 4c 4c 20 69  o write a NULL i
17070 6e 74 6f 20 74 68 65 20 49 50 4b 20 63 6f 6c 75  nto the IPK colu
17080 6d 6e 2e 20 54 68 61 74 20 69 73 20 6e 6f 74 20  mn. That is not 
17090 70 65 72 6d 69 74 74 65 64 2e 20 20 2a 2f 0a 20  permitted.  */. 
170a0 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 52 42     if( eType==RB
170b0 55 5f 49 4e 53 45 52 54 20 0a 20 20 20 20 20 26  U_INSERT .     &
170c0 26 20 70 49 74 65 72 2d 3e 7a 49 64 78 3d 3d 30  & pIter->zIdx==0
170d0 20 26 26 20 70 49 74 65 72 2d 3e 65 54 79 70 65   && pIter->eType
170e0 3d 3d 52 42 55 5f 50 4b 5f 49 50 4b 20 26 26 20  ==RBU_PK_IPK && 
170f0 70 49 74 65 72 2d 3e 61 62 54 62 6c 50 6b 5b 69  pIter->abTblPk[i
17100 5d 20 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74  ] .     && sqlit
17110 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70  e3_column_type(p
17120 49 74 65 72 2d 3e 70 53 65 6c 65 63 74 2c 20 69  Iter->pSelect, i
17130 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 0a 20  )==SQLITE_NULL. 
17140 20 20 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72     ){.      p->r
17150 63 20 3d 20 53 51 4c 49 54 45 5f 4d 49 53 4d 41  c = SQLITE_MISMA
17160 54 43 48 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 45  TCH;.      p->zE
17170 72 72 6d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f  rrmsg = sqlite3_
17180 6d 70 72 69 6e 74 66 28 22 64 61 74 61 74 79 70  mprintf("datatyp
17190 65 20 6d 69 73 6d 61 74 63 68 22 29 3b 0a 20 20  e mismatch");.  
171a0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
171b0 7d 0a 0a 20 20 20 20 69 66 28 20 65 54 79 70 65  }..    if( eType
171c0 3d 3d 52 42 55 5f 44 45 4c 45 54 45 20 26 26 20  ==RBU_DELETE && 
171d0 70 49 74 65 72 2d 3e 61 62 54 62 6c 50 6b 5b 69  pIter->abTblPk[i
171e0 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f  ]==0 ){.      co
171f0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20  ntinue;.    }.. 
17200 20 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65     pVal = sqlite
17210 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28 70  3_column_value(p
17220 49 74 65 72 2d 3e 70 53 65 6c 65 63 74 2c 20 69  Iter->pSelect, i
17230 29 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73  );.    p->rc = s
17240 71 6c 69 74 65 33 5f 62 69 6e 64 5f 76 61 6c 75  qlite3_bind_valu
17250 65 28 70 57 72 69 74 65 72 2c 20 69 2b 31 2c 20  e(pWriter, i+1, 
17260 70 56 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 70  pVal);.    if( p
17270 2d 3e 72 63 20 29 20 72 65 74 75 72 6e 3b 0a 20  ->rc ) return;. 
17280 20 7d 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e   }.  if( pIter->
17290 7a 49 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20 69  zIdx==0 ){.    i
172a0 66 28 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d  f( pIter->eType=
172b0 3d 52 42 55 5f 50 4b 5f 56 54 41 42 20 0a 20 20  =RBU_PK_VTAB .  
172c0 20 20 20 7c 7c 20 70 49 74 65 72 2d 3e 65 54 79     || pIter->eTy
172d0 70 65 3d 3d 52 42 55 5f 50 4b 5f 4e 4f 4e 45 20  pe==RBU_PK_NONE 
172e0 0a 20 20 20 20 20 7c 7c 20 28 70 49 74 65 72 2d  .     || (pIter-
172f0 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 45  >eType==RBU_PK_E
17300 58 54 45 52 4e 41 4c 20 26 26 20 72 62 75 49 73  XTERNAL && rbuIs
17310 56 61 63 75 75 6d 28 70 29 29 20 0a 20 20 20 20  Vacuum(p)) .    
17320 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20  ){.      /* For 
17330 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2c  a virtual table,
17340 20 6f 72 20 61 20 74 61 62 6c 65 20 77 69 74 68   or a table with
17350 20 6e 6f 20 70 72 69 6d 61 72 79 20 6b 65 79 2c   no primary key,
17360 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 53   the .      ** S
17370 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
17380 69 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  is:.      **.   
17390 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 3c     **   SELECT <
173a0 63 6f 6c 73 3e 2c 20 72 62 75 5f 63 6f 6e 74 72  cols>, rbu_contr
173b0 6f 6c 2c 20 72 62 75 5f 72 6f 77 69 64 20 46 52  ol, rbu_rowid FR
173c0 4f 4d 20 2e 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a  OM .....      **
173d0 0a 20 20 20 20 20 20 2a 2a 20 48 65 6e 63 65 20  .      ** Hence 
173e0 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28 70 49 74  column_value(pIt
173f0 65 72 2d 3e 6e 43 6f 6c 2b 31 29 2e 0a 20 20 20  er->nCol+1)..   
17400 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65     */.      asse
17410 72 74 43 6f 6c 75 6d 6e 4e 61 6d 65 28 70 49 74  rtColumnName(pIt
17420 65 72 2d 3e 70 53 65 6c 65 63 74 2c 20 70 49 74  er->pSelect, pIt
17430 65 72 2d 3e 6e 43 6f 6c 2b 31 2c 20 0a 20 20 20  er->nCol+1, .   
17440 20 20 20 20 20 20 20 72 62 75 49 73 56 61 63 75         rbuIsVacu
17450 75 6d 28 70 29 20 3f 20 22 72 6f 77 69 64 22 20  um(p) ? "rowid" 
17460 3a 20 22 72 62 75 5f 72 6f 77 69 64 22 0a 20 20  : "rbu_rowid".  
17470 20 20 20 20 29 3b 0a 20 20 20 20 20 20 70 56 61      );.      pVa
17480 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  l = sqlite3_colu
17490 6d 6e 5f 76 61 6c 75 65 28 70 49 74 65 72 2d 3e  mn_value(pIter->
174a0 70 53 65 6c 65 63 74 2c 20 70 49 74 65 72 2d 3e  pSelect, pIter->
174b0 6e 43 6f 6c 2b 31 29 3b 0a 20 20 20 20 20 20 70  nCol+1);.      p
174c0 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62  ->rc = sqlite3_b
174d0 69 6e 64 5f 76 61 6c 75 65 28 70 57 72 69 74 65  ind_value(pWrite
174e0 72 2c 20 70 49 74 65 72 2d 3e 6e 43 6f 6c 2b 31  r, pIter->nCol+1
174f0 2c 20 70 56 61 6c 29 3b 0a 20 20 20 20 7d 0a 20  , pVal);.    }. 
17500 20 7d 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d   }.  if( p->rc==
17510 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
17520 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 57   sqlite3_step(pW
17530 72 69 74 65 72 29 3b 0a 20 20 20 20 70 2d 3e 72  riter);.    p->r
17540 63 20 3d 20 72 65 73 65 74 41 6e 64 43 6f 6c 6c  c = resetAndColl
17550 65 63 74 45 72 72 6f 72 28 70 57 72 69 74 65 72  ectError(pWriter
17560 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a  , &p->zErrmsg);.
17570 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
17580 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  s function does 
17590 74 68 65 20 77 6f 72 6b 20 66 6f 72 20 61 6e 20  the work for an 
175a0 73 71 6c 69 74 65 33 72 62 75 5f 73 74 65 70 28  sqlite3rbu_step(
175b0 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68  ) call..**.** Th
175c0 65 20 6f 62 6a 65 63 74 2d 69 74 65 72 61 74 6f  e object-iterato
175d0 72 20 28 70 2d 3e 6f 62 6a 69 74 65 72 29 20 63  r (p->objiter) c
175e0 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20  urrently points 
175f0 74 6f 20 61 20 76 61 6c 69 64 20 6f 62 6a 65 63  to a valid objec
17600 74 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20 69 6e  t,.** and the in
17610 70 75 74 20 63 75 72 73 6f 72 20 28 70 2d 3e 6f  put cursor (p->o
17620 62 6a 69 74 65 72 2e 70 53 65 6c 65 63 74 29 20  bjiter.pSelect) 
17630 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73  currently points
17640 20 74 6f 20 61 20 76 61 6c 69 64 0a 2a 2a 20 69   to a valid.** i
17650 6e 70 75 74 20 72 6f 77 2e 20 50 65 72 66 6f 72  nput row. Perfor
17660 6d 20 77 68 61 74 65 76 65 72 20 70 72 6f 63 65  m whatever proce
17670 73 73 69 6e 67 20 69 73 20 72 65 71 75 69 72 65  ssing is require
17680 64 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 2a 2a  d and return..**
17690 0a 2a 2a 20 49 66 20 6e 6f 20 20 65 72 72 6f 72  .** If no  error
176a0 20 6f 63 63 75 72 73 2c 20 53 51 4c 49 54 45 5f   occurs, SQLITE_
176b0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
176c0 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20 65 72  Otherwise, an er
176d0 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 61 6e 64 20  ror code.** and 
176e0 6d 65 73 73 61 67 65 20 69 73 20 6c 65 66 74 20  message is left 
176f0 69 6e 20 74 68 65 20 52 42 55 20 68 61 6e 64 6c  in the RBU handl
17700 65 20 61 6e 64 20 61 20 63 6f 70 79 20 6f 66 20  e and a copy of 
17710 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a  the error code.*
17720 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  * returned..*/.s
17730 74 61 74 69 63 20 69 6e 74 20 72 62 75 53 74 65  tatic int rbuSte
17740 70 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 29  p(sqlite3rbu *p)
17750 7b 0a 20 20 52 62 75 4f 62 6a 49 74 65 72 20 2a  {.  RbuObjIter *
17760 70 49 74 65 72 20 3d 20 26 70 2d 3e 6f 62 6a 69  pIter = &p->obji
17770 74 65 72 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ter;.  const cha
17780 72 20 2a 7a 4d 61 73 6b 20 3d 20 30 3b 0a 20 20  r *zMask = 0;.  
17790 69 6e 74 20 65 54 79 70 65 20 3d 20 72 62 75 53  int eType = rbuS
177a0 74 65 70 54 79 70 65 28 70 2c 20 26 7a 4d 61 73  tepType(p, &zMas
177b0 6b 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70 65  k);..  if( eType
177c0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
177d0 65 54 79 70 65 3d 3d 52 42 55 5f 49 4e 53 45 52  eType==RBU_INSER
177e0 54 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d  T     || eType==
177f0 52 42 55 5f 44 45 4c 45 54 45 0a 20 20 20 20 20  RBU_DELETE.     
17800 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 52 42      || eType==RB
17810 55 5f 52 45 50 4c 41 43 45 20 20 20 20 7c 7c 20  U_REPLACE    || 
17820 65 54 79 70 65 3d 3d 52 42 55 5f 49 44 58 5f 44  eType==RBU_IDX_D
17830 45 4c 45 54 45 0a 20 20 20 20 20 20 20 20 20 7c  ELETE.         |
17840 7c 20 65 54 79 70 65 3d 3d 52 42 55 5f 49 44 58  | eType==RBU_IDX
17850 5f 49 4e 53 45 52 54 20 7c 7c 20 65 54 79 70 65  _INSERT || eType
17860 3d 3d 52 42 55 5f 55 50 44 41 54 45 0a 20 20 20  ==RBU_UPDATE.   
17870 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
17880 65 54 79 70 65 21 3d 52 42 55 5f 55 50 44 41 54  eType!=RBU_UPDAT
17890 45 20 7c 7c 20 70 49 74 65 72 2d 3e 7a 49 64 78  E || pIter->zIdx
178a0 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 69 66 28 20  ==0 );..    if( 
178b0 70 49 74 65 72 2d 3e 7a 49 64 78 3d 3d 30 20 26  pIter->zIdx==0 &
178c0 26 20 28 65 54 79 70 65 3d 3d 52 42 55 5f 49 44  & (eType==RBU_ID
178d0 58 5f 44 45 4c 45 54 45 20 7c 7c 20 65 54 79 70  X_DELETE || eTyp
178e0 65 3d 3d 52 42 55 5f 49 44 58 5f 49 4e 53 45 52  e==RBU_IDX_INSER
178f0 54 29 20 29 7b 0a 20 20 20 20 20 20 72 62 75 42  T) ){.      rbuB
17900 61 64 43 6f 6e 74 72 6f 6c 45 72 72 6f 72 28 70  adControlError(p
17910 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73  );.    }.    els
17920 65 20 69 66 28 20 65 54 79 70 65 3d 3d 52 42 55  e if( eType==RBU
17930 5f 52 45 50 4c 41 43 45 20 29 7b 0a 20 20 20 20  _REPLACE ){.    
17940 20 20 69 66 28 20 70 49 74 65 72 2d 3e 7a 49 64    if( pIter->zId
17950 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  x==0 ){.        
17960 70 2d 3e 6e 50 68 61 73 65 4f 6e 65 53 74 65 70  p->nPhaseOneStep
17970 20 2b 3d 20 70 2d 3e 6f 62 6a 69 74 65 72 2e 6e   += p->objiter.n
17980 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 20 20 72  Index;.        r
17990 62 75 53 74 65 70 4f 6e 65 4f 70 28 70 2c 20 52  buStepOneOp(p, R
179a0 42 55 5f 44 45 4c 45 54 45 29 3b 0a 20 20 20 20  BU_DELETE);.    
179b0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d    }.      if( p-
179c0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
179d0 20 72 62 75 53 74 65 70 4f 6e 65 4f 70 28 70 2c   rbuStepOneOp(p,
179e0 20 52 42 55 5f 49 4e 53 45 52 54 29 3b 0a 20 20   RBU_INSERT);.  
179f0 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69 66 28    }.    else if(
17a00 20 65 54 79 70 65 21 3d 52 42 55 5f 55 50 44 41   eType!=RBU_UPDA
17a10 54 45 20 29 7b 0a 20 20 20 20 20 20 72 62 75 53  TE ){.      rbuS
17a20 74 65 70 4f 6e 65 4f 70 28 70 2c 20 65 54 79 70  tepOneOp(p, eTyp
17a30 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c  e);.    }.    el
17a40 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
17a50 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20  3_value *pVal;. 
17a60 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d       sqlite3_stm
17a70 74 20 2a 70 55 70 64 61 74 65 20 3d 20 30 3b 0a  t *pUpdate = 0;.
17a80 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65 54        assert( eT
17a90 79 70 65 3d 3d 52 42 55 5f 55 50 44 41 54 45 20  ype==RBU_UPDATE 
17aa0 29 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 50 68 61  );.      p->nPha
17ab0 73 65 4f 6e 65 53 74 65 70 20 2d 3d 20 70 2d 3e  seOneStep -= p->
17ac0 6f 62 6a 69 74 65 72 2e 6e 49 6e 64 65 78 3b 0a  objiter.nIndex;.
17ad0 20 20 20 20 20 20 72 62 75 47 65 74 55 70 64 61        rbuGetUpda
17ae0 74 65 53 74 6d 74 28 70 2c 20 70 49 74 65 72 2c  teStmt(p, pIter,
17af0 20 7a 4d 61 73 6b 2c 20 26 70 55 70 64 61 74 65   zMask, &pUpdate
17b00 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 55 70  );.      if( pUp
17b10 64 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  date ){.        
17b20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 66  int i;.        f
17b30 6f 72 28 69 3d 30 3b 20 70 2d 3e 72 63 3d 3d 53  or(i=0; p->rc==S
17b40 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70 49  QLITE_OK && i<pI
17b50 74 65 72 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  ter->nCol; i++){
17b60 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20  .          char 
17b70 63 20 3d 20 7a 4d 61 73 6b 5b 70 49 74 65 72 2d  c = zMask[pIter-
17b80 3e 61 69 53 72 63 4f 72 64 65 72 5b 69 5d 5d 3b  >aiSrcOrder[i]];
17b90 0a 20 20 20 20 20 20 20 20 20 20 70 56 61 6c 20  .          pVal 
17ba0 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
17bb0 5f 76 61 6c 75 65 28 70 49 74 65 72 2d 3e 70 53  _value(pIter->pS
17bc0 65 6c 65 63 74 2c 20 69 29 3b 0a 20 20 20 20 20  elect, i);.     
17bd0 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e       if( pIter->
17be0 61 62 54 62 6c 50 6b 5b 69 5d 20 7c 7c 20 63 21  abTblPk[i] || c!
17bf0 3d 27 2e 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='.' ){.        
17c00 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69      p->rc = sqli
17c10 74 65 33 5f 62 69 6e 64 5f 76 61 6c 75 65 28 70  te3_bind_value(p
17c20 55 70 64 61 74 65 2c 20 69 2b 31 2c 20 70 56 61  Update, i+1, pVa
17c30 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  l);.          }.
17c40 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
17c50 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
17c60 49 54 45 5f 4f 4b 20 0a 20 20 20 20 20 20 20 20  ITE_OK .        
17c70 20 26 26 20 28 70 49 74 65 72 2d 3e 65 54 79 70   && (pIter->eTyp
17c80 65 3d 3d 52 42 55 5f 50 4b 5f 56 54 41 42 20 7c  e==RBU_PK_VTAB |
17c90 7c 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d  | pIter->eType==
17ca0 52 42 55 5f 50 4b 5f 4e 4f 4e 45 29 20 0a 20 20  RBU_PK_NONE) .  
17cb0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
17cc0 20 20 20 2f 2a 20 42 69 6e 64 20 74 68 65 20 72     /* Bind the r
17cd0 62 75 5f 72 6f 77 69 64 20 76 61 6c 75 65 20 74  bu_rowid value t
17ce0 6f 20 63 6f 6c 75 6d 6e 20 5f 72 6f 77 69 64 5f  o column _rowid_
17cf0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73   */.          as
17d00 73 65 72 74 43 6f 6c 75 6d 6e 4e 61 6d 65 28 70  sertColumnName(p
17d10 49 74 65 72 2d 3e 70 53 65 6c 65 63 74 2c 20 70  Iter->pSelect, p
17d20 49 74 65 72 2d 3e 6e 43 6f 6c 2b 31 2c 20 22 72  Iter->nCol+1, "r
17d30 62 75 5f 72 6f 77 69 64 22 29 3b 0a 20 20 20 20  bu_rowid");.    
17d40 20 20 20 20 20 20 70 56 61 6c 20 3d 20 73 71 6c        pVal = sql
17d50 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75  ite3_column_valu
17d60 65 28 70 49 74 65 72 2d 3e 70 53 65 6c 65 63 74  e(pIter->pSelect
17d70 2c 20 70 49 74 65 72 2d 3e 6e 43 6f 6c 2b 31 29  , pIter->nCol+1)
17d80 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72  ;.          p->r
17d90 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  c = sqlite3_bind
17da0 5f 76 61 6c 75 65 28 70 55 70 64 61 74 65 2c 20  _value(pUpdate, 
17db0 70 49 74 65 72 2d 3e 6e 43 6f 6c 2b 31 2c 20 70  pIter->nCol+1, p
17dc0 56 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Val);.        }.
17dd0 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72          if( p->r
17de0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
17df0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
17e00 33 5f 73 74 65 70 28 70 55 70 64 61 74 65 29 3b  3_step(pUpdate);
17e10 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63  .          p->rc
17e20 20 3d 20 72 65 73 65 74 41 6e 64 43 6f 6c 6c 65   = resetAndColle
17e30 63 74 45 72 72 6f 72 28 70 55 70 64 61 74 65 2c  ctError(pUpdate,
17e40 20 26 70 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a 20   &p->zErrmsg);. 
17e50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
17e60 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
17e70 75 72 6e 20 70 2d 3e 72 63 3b 0a 7d 0a 0a 2f 2a  urn p->rc;.}../*
17e80 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68  .** Increment th
17e90 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20  e schema cookie 
17ea0 6f 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  of the main data
17eb0 62 61 73 65 20 6f 70 65 6e 65 64 20 62 79 20 70  base opened by p
17ec0 2d 3e 64 62 4d 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20  ->dbMain..**.** 
17ed0 4f 72 2c 20 69 66 20 74 68 69 73 20 69 73 20 61  Or, if this is a
17ee0 6e 20 52 42 55 20 76 61 63 75 75 6d 2c 20 73 65  n RBU vacuum, se
17ef0 74 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f  t the schema coo
17f00 6b 69 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  kie of the main 
17f10 64 62 0a 2a 2a 20 6f 70 65 6e 65 64 20 62 79 20  db.** opened by 
17f20 70 2d 3e 64 62 4d 61 69 6e 20 74 6f 20 6f 6e 65  p->dbMain to one
17f30 20 6d 6f 72 65 20 74 68 61 6e 20 74 68 65 20 73   more than the s
17f40 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 6f 66 20  chema cookie of 
17f50 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 64 62 20 6f  the main.** db o
17f60 70 65 6e 65 64 20 62 79 20 70 2d 3e 64 62 52 62  pened by p->dbRb
17f70 75 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  u..*/.static voi
17f80 64 20 72 62 75 49 6e 63 72 53 63 68 65 6d 61 43  d rbuIncrSchemaC
17f90 6f 6f 6b 69 65 28 73 71 6c 69 74 65 33 72 62 75  ookie(sqlite3rbu
17fa0 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72   *p){.  if( p->r
17fb0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
17fc0 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 72      sqlite3 *dbr
17fd0 65 61 64 20 3d 20 28 72 62 75 49 73 56 61 63 75  ead = (rbuIsVacu
17fe0 75 6d 28 70 29 20 3f 20 70 2d 3e 64 62 52 62 75  um(p) ? p->dbRbu
17ff0 20 3a 20 70 2d 3e 64 62 4d 61 69 6e 29 3b 0a 20   : p->dbMain);. 
18000 20 20 20 69 6e 74 20 69 43 6f 6f 6b 69 65 20 3d     int iCookie =
18010 20 31 30 30 30 30 30 30 3b 0a 20 20 20 20 73 71   1000000;.    sq
18020 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
18030 74 3b 0a 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20  t;..    p->rc = 
18040 70 72 65 70 61 72 65 41 6e 64 43 6f 6c 6c 65 63  prepareAndCollec
18050 74 45 72 72 6f 72 28 64 62 72 65 61 64 2c 20 26  tError(dbread, &
18060 70 53 74 6d 74 2c 20 26 70 2d 3e 7a 45 72 72 6d  pStmt, &p->zErrm
18070 73 67 2c 20 0a 20 20 20 20 20 20 20 20 22 50 52  sg, .        "PR
18080 41 47 4d 41 20 73 63 68 65 6d 61 5f 76 65 72 73  AGMA schema_vers
18090 69 6f 6e 22 0a 20 20 20 20 29 3b 0a 20 20 20 20  ion".    );.    
180a0 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
180b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a  E_OK ){.      /*
180c0 20 43 6f 76 65 72 61 67 65 3a 20 69 74 20 6d 61   Coverage: it ma
180d0 79 20 62 65 20 74 68 61 74 20 74 68 69 73 20 73  y be that this s
180e0 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 63 61  qlite3_step() ca
180f0 6e 6e 6f 74 20 66 61 69 6c 2e 20 54 68 65 72 65  nnot fail. There
18100 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 61 6c 72  .      ** is alr
18110 65 61 64 79 20 61 20 74 72 61 6e 73 61 63 74 69  eady a transacti
18120 6f 6e 20 6f 70 65 6e 2c 20 73 6f 20 74 68 65 20  on open, so the 
18130 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
18140 6e 74 20 63 61 6e 6e 6f 74 0a 20 20 20 20 20 20  nt cannot.      
18150 2a 2a 20 74 68 72 6f 77 20 61 6e 20 53 51 4c 49  ** throw an SQLI
18160 54 45 5f 53 43 48 45 4d 41 20 65 78 63 65 70 74  TE_SCHEMA except
18170 69 6f 6e 2e 20 54 68 65 20 6f 6e 6c 79 20 64 61  ion. The only da
18180 74 61 62 61 73 65 20 70 61 67 65 20 74 68 65 0a  tabase page the.
18190 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65        ** stateme
181a0 6e 74 20 72 65 61 64 73 20 69 73 20 70 61 67 65  nt reads is page
181b0 20 31 2c 20 77 68 69 63 68 20 69 73 20 67 75 61   1, which is gua
181c0 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 69 6e  ranteed to be in
181d0 20 74 68 65 20 63 61 63 68 65 2e 0a 20 20 20 20   the cache..    
181e0 20 20 2a 2a 20 41 6e 64 20 6e 6f 20 6d 65 6d 6f    ** And no memo
181f0 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 61  ry allocations a
18200 72 65 20 72 65 71 75 69 72 65 64 2e 20 20 2a 2f  re required.  */
18210 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54  .      if( SQLIT
18220 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73  E_ROW==sqlite3_s
18230 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20  tep(pStmt) ){.  
18240 20 20 20 20 20 20 69 43 6f 6f 6b 69 65 20 3d 20        iCookie = 
18250 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
18260 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  nt(pStmt, 0);.  
18270 20 20 20 20 7d 0a 20 20 20 20 20 20 72 62 75 46      }.      rbuF
18280 69 6e 61 6c 69 7a 65 28 70 2c 20 70 53 74 6d 74  inalize(p, pStmt
18290 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
182a0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
182b0 4b 20 29 7b 0a 20 20 20 20 20 20 72 62 75 4d 50  K ){.      rbuMP
182c0 72 69 6e 74 66 45 78 65 63 28 70 2c 20 70 2d 3e  rintfExec(p, p->
182d0 64 62 4d 61 69 6e 2c 20 22 50 52 41 47 4d 41 20  dbMain, "PRAGMA 
182e0 73 63 68 65 6d 61 5f 76 65 72 73 69 6f 6e 20 3d  schema_version =
182f0 20 25 64 22 2c 20 69 43 6f 6f 6b 69 65 2b 31 29   %d", iCookie+1)
18300 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
18310 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74 68 65 20  *.** Update the 
18320 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
18330 72 62 75 5f 73 74 61 74 65 20 74 61 62 6c 65 20  rbu_state table 
18340 77 69 74 68 69 6e 20 74 68 65 20 72 62 75 20 64  within the rbu d
18350 61 74 61 62 61 73 65 2e 20 54 68 65 0a 2a 2a 20  atabase. The.** 
18360 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20  value stored in 
18370 74 68 65 20 52 42 55 5f 53 54 41 54 45 5f 53 54  the RBU_STATE_ST
18380 41 47 45 20 63 6f 6c 75 6d 6e 20 69 73 20 65 53  AGE column is eS
18390 74 61 67 65 2e 20 41 6c 6c 20 6f 74 68 65 72 20  tage. All other 
183a0 76 61 6c 75 65 73 0a 2a 2a 20 61 72 65 20 64 65  values.** are de
183b0 74 65 72 6d 69 6e 65 64 20 62 79 20 69 6e 73 70  termined by insp
183c0 65 63 74 69 6e 67 20 74 68 65 20 72 62 75 20 68  ecting the rbu h
183d0 61 6e 64 6c 65 20 70 61 73 73 65 64 20 61 73 20  andle passed as 
183e0 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
183f0 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nt..*/.static vo
18400 69 64 20 72 62 75 53 61 76 65 53 74 61 74 65 28  id rbuSaveState(
18410 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 69  sqlite3rbu *p, i
18420 6e 74 20 65 53 74 61 67 65 29 7b 0a 20 20 69 66  nt eStage){.  if
18430 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
18440 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c  OK || p->rc==SQL
18450 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
18460 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 49  sqlite3_stmt *pI
18470 6e 73 65 72 74 20 3d 20 30 3b 0a 20 20 20 20 72  nsert = 0;.    r
18480 62 75 5f 66 69 6c 65 20 2a 70 46 64 20 3d 20 28  bu_file *pFd = (
18490 72 62 75 49 73 56 61 63 75 75 6d 28 70 29 20 3f  rbuIsVacuum(p) ?
184a0 20 70 2d 3e 70 52 62 75 46 64 20 3a 20 70 2d 3e   p->pRbuFd : p->
184b0 70 54 61 72 67 65 74 46 64 29 3b 0a 20 20 20 20  pTargetFd);.    
184c0 69 6e 74 20 72 63 3b 0a 0a 20 20 20 20 61 73 73  int rc;..    ass
184d0 65 72 74 28 20 70 2d 3e 7a 45 72 72 6d 73 67 3d  ert( p->zErrmsg=
184e0 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70  =0 );.    rc = p
184f0 72 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f 6c  repareFreeAndCol
18500 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 52  lectError(p->dbR
18510 62 75 2c 20 26 70 49 6e 73 65 72 74 2c 20 26 70  bu, &pInsert, &p
18520 2d 3e 7a 45 72 72 6d 73 67 2c 20 0a 20 20 20 20  ->zErrmsg, .    
18530 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69      sqlite3_mpri
18540 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 22  ntf(.          "
18550 49 4e 53 45 52 54 20 4f 52 20 52 45 50 4c 41 43  INSERT OR REPLAC
18560 45 20 49 4e 54 4f 20 25 73 2e 72 62 75 5f 73 74  E INTO %s.rbu_st
18570 61 74 65 28 6b 2c 20 76 29 20 56 41 4c 55 45 53  ate(k, v) VALUES
18580 20 22 0a 20 20 20 20 20 20 20 20 20 20 22 28 25   ".          "(%
18590 64 2c 20 25 64 29 2c 20 22 0a 20 20 20 20 20 20  d, %d), ".      
185a0 20 20 20 20 22 28 25 64 2c 20 25 51 29 2c 20 22      "(%d, %Q), "
185b0 0a 20 20 20 20 20 20 20 20 20 20 22 28 25 64 2c  .          "(%d,
185c0 20 25 51 29 2c 20 22 0a 20 20 20 20 20 20 20 20   %Q), ".        
185d0 20 20 22 28 25 64 2c 20 25 64 29 2c 20 22 0a 20    "(%d, %d), ". 
185e0 20 20 20 20 20 20 20 20 20 22 28 25 64 2c 20 25           "(%d, %
185f0 64 29 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20  d), ".          
18600 22 28 25 64 2c 20 25 6c 6c 64 29 2c 20 22 0a 20  "(%d, %lld), ". 
18610 20 20 20 20 20 20 20 20 20 22 28 25 64 2c 20 25           "(%d, %
18620 6c 6c 64 29 2c 20 22 0a 20 20 20 20 20 20 20 20  lld), ".        
18630 20 20 22 28 25 64 2c 20 25 6c 6c 64 29 2c 20 22    "(%d, %lld), "
18640 0a 20 20 20 20 20 20 20 20 20 20 22 28 25 64 2c  .          "(%d,
18650 20 25 6c 6c 64 29 20 22 2c 0a 20 20 20 20 20 20   %lld) ",.      
18660 20 20 20 20 70 2d 3e 7a 53 74 61 74 65 44 62 2c      p->zStateDb,
18670 0a 20 20 20 20 20 20 20 20 20 20 52 42 55 5f 53  .          RBU_S
18680 54 41 54 45 5f 53 54 41 47 45 2c 20 65 53 74 61  TATE_STAGE, eSta
18690 67 65 2c 0a 20 20 20 20 20 20 20 20 20 20 52 42  ge,.          RB
186a0 55 5f 53 54 41 54 45 5f 54 42 4c 2c 20 70 2d 3e  U_STATE_TBL, p->
186b0 6f 62 6a 69 74 65 72 2e 7a 54 62 6c 2c 20 0a 20  objiter.zTbl, . 
186c0 20 20 20 20 20 20 20 20 20 52 42 55 5f 53 54 41           RBU_STA
186d0 54 45 5f 49 44 58 2c 20 70 2d 3e 6f 62 6a 69 74  TE_IDX, p->objit
186e0 65 72 2e 7a 49 64 78 2c 20 0a 20 20 20 20 20 20  er.zIdx, .      
186f0 20 20 20 20 52 42 55 5f 53 54 41 54 45 5f 52 4f      RBU_STATE_RO
18700 57 2c 20 70 2d 3e 6e 53 74 65 70 2c 20 0a 20 20  W, p->nStep, .  
18710 20 20 20 20 20 20 20 20 52 42 55 5f 53 54 41 54          RBU_STAT
18720 45 5f 50 52 4f 47 52 45 53 53 2c 20 70 2d 3e 6e  E_PROGRESS, p->n
18730 50 72 6f 67 72 65 73 73 2c 0a 20 20 20 20 20 20  Progress,.      
18740 20 20 20 20 52 42 55 5f 53 54 41 54 45 5f 43 4b      RBU_STATE_CK
18750 50 54 2c 20 70 2d 3e 69 57 61 6c 43 6b 73 75 6d  PT, p->iWalCksum
18760 2c 0a 20 20 20 20 20 20 20 20 20 20 52 42 55 5f  ,.          RBU_
18770 53 54 41 54 45 5f 43 4f 4f 4b 49 45 2c 20 28 69  STATE_COOKIE, (i
18780 36 34 29 70 46 64 2d 3e 69 43 6f 6f 6b 69 65 2c  64)pFd->iCookie,
18790 0a 20 20 20 20 20 20 20 20 20 20 52 42 55 5f 53  .          RBU_S
187a0 54 41 54 45 5f 4f 41 4c 53 5a 2c 20 70 2d 3e 69  TATE_OALSZ, p->i
187b0 4f 61 6c 53 7a 2c 0a 20 20 20 20 20 20 20 20 20  OalSz,.         
187c0 20 52 42 55 5f 53 54 41 54 45 5f 50 48 41 53 45   RBU_STATE_PHASE
187d0 4f 4e 45 53 54 45 50 2c 20 70 2d 3e 6e 50 68 61  ONESTEP, p->nPha
187e0 73 65 4f 6e 65 53 74 65 70 0a 20 20 20 20 20 20  seOneStep.      
187f0 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 61 73 73  ).    );.    ass
18800 65 72 74 28 20 70 49 6e 73 65 72 74 3d 3d 30 20  ert( pInsert==0 
18810 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  || rc==SQLITE_OK
18820 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d   );..    if( rc=
18830 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18840 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70      sqlite3_step
18850 28 70 49 6e 73 65 72 74 29 3b 0a 20 20 20 20 20  (pInsert);.     
18860 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69   rc = sqlite3_fi
18870 6e 61 6c 69 7a 65 28 70 49 6e 73 65 72 74 29 3b  nalize(pInsert);
18880 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
18890 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70  c!=SQLITE_OK ) p
188a0 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 7d 0a 7d  ->rc = rc;.  }.}
188b0 0a 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74 68  .../*.** Step th
188c0 65 20 52 42 55 20 6f 62 6a 65 63 74 2e 0a 2a 2f  e RBU object..*/
188d0 0a 69 6e 74 20 73 71 6c 69 74 65 33 72 62 75 5f  .int sqlite3rbu_
188e0 73 74 65 70 28 73 71 6c 69 74 65 33 72 62 75 20  step(sqlite3rbu 
188f0 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a  *p){.  if( p ){.
18900 20 20 20 20 73 77 69 74 63 68 28 20 70 2d 3e 65      switch( p->e
18910 53 74 61 67 65 20 29 7b 0a 20 20 20 20 20 20 63  Stage ){.      c
18920 61 73 65 20 52 42 55 5f 53 54 41 47 45 5f 4f 41  ase RBU_STAGE_OA
18930 4c 3a 20 7b 0a 20 20 20 20 20 20 20 20 52 62 75  L: {.        Rbu
18940 4f 62 6a 49 74 65 72 20 2a 70 49 74 65 72 20 3d  ObjIter *pIter =
18950 20 26 70 2d 3e 6f 62 6a 69 74 65 72 3b 0a 20 20   &p->objiter;.  
18960 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 2d 3e        while( p->
18970 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
18980 20 70 49 74 65 72 2d 3e 7a 54 62 6c 20 29 7b 0a   pIter->zTbl ){.
18990 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
189a0 49 74 65 72 2d 3e 62 43 6c 65 61 6e 75 70 20 29  Iter->bCleanup )
189b0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
189c0 20 43 6c 65 61 6e 20 75 70 20 74 68 65 20 72 62   Clean up the rb
189d0 75 5f 74 6d 70 5f 78 78 78 20 74 61 62 6c 65 20  u_tmp_xxx table 
189e0 66 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75 73  for the previous
189f0 20 74 61 62 6c 65 2e 20 49 74 20 0a 20 20 20 20   table. It .    
18a00 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6e 6e 6f          ** canno
18a10 74 20 62 65 20 64 72 6f 70 70 65 64 20 61 73 20  t be dropped as 
18a20 74 68 65 72 65 20 61 72 65 20 63 75 72 72 65 6e  there are curren
18a30 74 6c 79 20 61 63 74 69 76 65 20 53 51 4c 20 73  tly active SQL s
18a40 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 20 20 20  tatements..     
18a50 20 20 20 20 20 20 20 2a 2a 20 42 75 74 20 74 68         ** But th
18a60 65 20 63 6f 6e 74 65 6e 74 73 20 63 61 6e 20 62  e contents can b
18a70 65 20 64 65 6c 65 74 65 64 2e 20 20 2a 2f 0a 20  e deleted.  */. 
18a80 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
18a90 62 75 49 73 56 61 63 75 75 6d 28 70 29 3d 3d 30  buIsVacuum(p)==0
18aa0 20 26 26 20 70 49 74 65 72 2d 3e 61 62 49 6e 64   && pIter->abInd
18ab0 65 78 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  exed ){.        
18ac0 20 20 20 20 20 20 72 62 75 4d 50 72 69 6e 74 66        rbuMPrintf
18ad0 45 78 65 63 28 70 2c 20 70 2d 3e 64 62 52 62 75  Exec(p, p->dbRbu
18ae0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
18af0 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f       "DELETE FRO
18b00 4d 20 25 73 2e 27 72 62 75 5f 74 6d 70 5f 25 71  M %s.'rbu_tmp_%q
18b10 27 22 2c 20 70 2d 3e 7a 53 74 61 74 65 44 62 2c  '", p->zStateDb,
18b20 20 70 49 74 65 72 2d 3e 7a 44 61 74 61 54 62 6c   pIter->zDataTbl
18b30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29  .              )
18b40 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
18b50 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
18b60 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 62 75  .            rbu
18b70 4f 62 6a 49 74 65 72 50 72 65 70 61 72 65 41 6c  ObjIterPrepareAl
18b80 6c 28 70 2c 20 70 49 74 65 72 2c 20 30 29 3b 0a  l(p, pIter, 0);.
18b90 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
18ba0 41 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e  Advance to the n
18bb0 65 78 74 20 72 6f 77 20 74 6f 20 70 72 6f 63 65  ext row to proce
18bc0 73 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ss. */.         
18bd0 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
18be0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
18bf0 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 63 20           int rc 
18c00 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  = sqlite3_step(p
18c10 49 74 65 72 2d 3e 70 53 65 6c 65 63 74 29 3b 0a  Iter->pSelect);.
18c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
18c30 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  ( rc==SQLITE_ROW
18c40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
18c50 20 20 20 20 70 2d 3e 6e 50 72 6f 67 72 65 73 73      p->nProgress
18c60 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
18c70 20 20 20 20 70 2d 3e 6e 53 74 65 70 2b 2b 3b 0a      p->nStep++;.
18c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c90 72 65 74 75 72 6e 20 72 62 75 53 74 65 70 28 70  return rbuStep(p
18ca0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
18cb0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
18cc0 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33   p->rc = sqlite3
18cd0 5f 72 65 73 65 74 28 70 49 74 65 72 2d 3e 70 53  _reset(pIter->pS
18ce0 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20  elect);.        
18cf0 20 20 20 20 20 20 70 2d 3e 6e 53 74 65 70 20 3d        p->nStep =
18d00 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
18d10 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20  }.          }.. 
18d20 20 20 20 20 20 20 20 20 20 72 62 75 4f 62 6a 49           rbuObjI
18d30 74 65 72 4e 65 78 74 28 70 2c 20 70 49 74 65 72  terNext(p, pIter
18d40 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  );.        }..  
18d50 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
18d60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18d70 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
18d80 70 49 74 65 72 2d 3e 7a 54 62 6c 3d 3d 30 20 29  pIter->zTbl==0 )
18d90 3b 0a 20 20 20 20 20 20 20 20 20 20 72 62 75 53  ;.          rbuS
18da0 61 76 65 53 74 61 74 65 28 70 2c 20 52 42 55 5f  aveState(p, RBU_
18db0 53 54 41 47 45 5f 4d 4f 56 45 29 3b 0a 20 20 20  STAGE_MOVE);.   
18dc0 20 20 20 20 20 20 20 72 62 75 49 6e 63 72 53 63         rbuIncrSc
18dd0 68 65 6d 61 43 6f 6f 6b 69 65 28 70 29 3b 0a 20  hemaCookie(p);. 
18de0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e           if( p->
18df0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
18e00 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  .            p->
18e10 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65  rc = sqlite3_exe
18e20 63 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 43 4f  c(p->dbMain, "CO
18e30 4d 4d 49 54 22 2c 20 30 2c 20 30 2c 20 26 70 2d  MMIT", 0, 0, &p-
18e40 3e 7a 45 72 72 6d 73 67 29 3b 0a 20 20 20 20 20  >zErrmsg);.     
18e50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
18e60 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
18e70 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
18e80 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c       p->rc = sql
18e90 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 52  ite3_exec(p->dbR
18ea0 62 75 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c  bu, "COMMIT", 0,
18eb0 20 30 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 29   0, &p->zErrmsg)
18ec0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
18ed0 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 67          p->eStag
18ee0 65 20 3d 20 52 42 55 5f 53 54 41 47 45 5f 4d 4f  e = RBU_STAGE_MO
18ef0 56 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  VE;.        }.  
18f00 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
18f10 20 20 20 7d 0a 0a 20 20 20 20 20 20 63 61 73 65     }..      case
18f20 20 52 42 55 5f 53 54 41 47 45 5f 4d 4f 56 45 3a   RBU_STAGE_MOVE:
18f30 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   {.        if( p
18f40 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
18f50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 62 75  ){.          rbu
18f60 4d 6f 76 65 4f 61 6c 46 69 6c 65 28 70 29 3b 0a  MoveOalFile(p);.
18f70 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 50 72            p->nPr
18f80 6f 67 72 65 73 73 2b 2b 3b 0a 20 20 20 20 20 20  ogress++;.      
18f90 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
18fa0 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
18fb0 20 20 63 61 73 65 20 52 42 55 5f 53 54 41 47 45    case RBU_STAGE
18fc0 5f 43 4b 50 54 3a 20 7b 0a 20 20 20 20 20 20 20  _CKPT: {.       
18fd0 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
18fe0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
18ff0 20 20 20 69 66 28 20 70 2d 3e 6e 53 74 65 70 3e     if( p->nStep>
19000 3d 70 2d 3e 6e 46 72 61 6d 65 20 29 7b 0a 20 20  =p->nFrame ){.  
19010 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
19020 33 5f 66 69 6c 65 20 2a 70 44 62 20 3d 20 70 2d  3_file *pDb = p-
19030 3e 70 54 61 72 67 65 74 46 64 2d 3e 70 52 65 61  >pTargetFd->pRea
19040 6c 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20  l;.  .          
19050 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 64 62    /* Sync the db
19060 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20   file */.       
19070 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 44 62       p->rc = pDb
19080 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53 79 6e  ->pMethods->xSyn
19090 63 28 70 44 62 2c 20 53 51 4c 49 54 45 5f 53 59  c(pDb, SQLITE_SY
190a0 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20 0a 20  NC_NORMAL);.  . 
190b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 70             /* Up
190c0 64 61 74 65 20 6e 42 61 63 6b 66 69 6c 6c 20 2a  date nBackfill *
190d0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  /.            if
190e0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
190f0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
19100 20 20 20 20 76 6f 69 64 20 76 6f 6c 61 74 69 6c      void volatil
19110 65 20 2a 70 74 72 3b 0a 20 20 20 20 20 20 20 20  e *ptr;.        
19120 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 44        p->rc = pD
19130 62 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53 68  b->pMethods->xSh
19140 6d 4d 61 70 28 70 44 62 2c 20 30 2c 20 33 32 2a  mMap(pDb, 0, 32*
19150 31 30 32 34 2c 20 30 2c 20 26 70 74 72 29 3b 0a  1024, 0, &ptr);.
19160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
19170 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
19180 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
19190 20 20 20 20 20 20 28 28 75 33 32 20 76 6f 6c 61        ((u32 vola
191a0 74 69 6c 65 2a 29 70 74 72 29 5b 32 34 5d 20 3d  tile*)ptr)[24] =
191b0 20 70 2d 3e 69 4d 61 78 46 72 61 6d 65 3b 0a 20   p->iMaxFrame;. 
191c0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
191d0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 0a             }.  .
191e0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
191f0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
19200 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
19210 20 20 70 2d 3e 65 53 74 61 67 65 20 3d 20 52 42    p->eStage = RB
19220 55 5f 53 54 41 47 45 5f 44 4f 4e 45 3b 0a 20 20  U_STAGE_DONE;.  
19230 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72              p->r
19240 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  c = SQLITE_DONE;
19250 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
19260 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
19270 20 20 20 20 20 20 20 20 20 20 20 20 52 62 75 46              RbuF
19280 72 61 6d 65 20 2a 70 46 72 61 6d 65 20 3d 20 26  rame *pFrame = &
19290 70 2d 3e 61 46 72 61 6d 65 5b 70 2d 3e 6e 53 74  p->aFrame[p->nSt
192a0 65 70 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ep];.           
192b0 20 72 62 75 43 68 65 63 6b 70 6f 69 6e 74 46 72   rbuCheckpointFr
192c0 61 6d 65 28 70 2c 20 70 46 72 61 6d 65 29 3b 0a  ame(p, pFrame);.
192d0 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e              p->n
192e0 53 74 65 70 2b 2b 3b 0a 20 20 20 20 20 20 20 20  Step++;.        
192f0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d    }.          p-
19300 3e 6e 50 72 6f 67 72 65 73 73 2b 2b 3b 0a 20 20  >nProgress++;.  
19310 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
19320 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a  break;.      }..
19330 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20        default:. 
19340 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
19350 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 70    }.    return p
19360 2d 3e 72 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ->rc;.  }else{. 
19370 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
19380 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 7d 0a 0a 2f  _NOMEM;.  }.}../
19390 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 73 74 72  *.** Compare str
193a0 69 6e 67 73 20 7a 31 20 61 6e 64 20 7a 32 2c 20  ings z1 and z2, 
193b0 72 65 74 75 72 6e 69 6e 67 20 30 20 69 66 20 74  returning 0 if t
193c0 68 65 79 20 61 72 65 20 69 64 65 6e 74 69 63 61  hey are identica
193d0 6c 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a  l, or non-zero.*
193e0 2a 20 6f 74 68 65 72 77 69 73 65 2e 20 45 69 74  * otherwise. Eit
193f0 68 65 72 20 6f 72 20 62 6f 74 68 20 61 72 67 75  her or both argu
19400 6d 65 6e 74 20 6d 61 79 20 62 65 20 4e 55 4c 4c  ment may be NULL
19410 2e 20 54 77 6f 20 4e 55 4c 4c 20 76 61 6c 75 65  . Two NULL value
19420 73 20 61 72 65 0a 2a 2a 20 63 6f 6e 73 69 64 65  s are.** conside
19430 72 65 64 20 65 71 75 61 6c 2c 20 61 6e 64 20 4e  red equal, and N
19440 55 4c 4c 20 69 73 20 63 6f 6e 73 69 64 65 72 65  ULL is considere
19450 64 20 64 69 73 74 69 6e 63 74 20 66 72 6f 6d 20  d distinct from 
19460 61 6c 6c 20 6f 74 68 65 72 20 76 61 6c 75 65 73  all other values
19470 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
19480 72 62 75 53 74 72 43 6f 6d 70 61 72 65 28 63 6f  rbuStrCompare(co
19490 6e 73 74 20 63 68 61 72 20 2a 7a 31 2c 20 63 6f  nst char *z1, co
194a0 6e 73 74 20 63 68 61 72 20 2a 7a 32 29 7b 0a 20  nst char *z2){. 
194b0 20 69 66 28 20 7a 31 3d 3d 30 20 26 26 20 7a 32   if( z1==0 && z2
194c0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
194d0 20 20 69 66 28 20 7a 31 3d 3d 30 20 7c 7c 20 7a    if( z1==0 || z
194e0 32 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  2==0 ) return 1;
194f0 0a 20 20 72 65 74 75 72 6e 20 28 73 71 6c 69 74  .  return (sqlit
19500 65 33 5f 73 74 72 69 63 6d 70 28 7a 31 2c 20 7a  e3_stricmp(z1, z
19510 32 29 21 3d 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  2)!=0);.}../*.**
19520 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
19530 73 20 63 61 6c 6c 65 64 20 61 73 20 70 61 72 74  s called as part
19540 20 6f 66 20 73 71 6c 69 74 65 33 72 62 75 5f 6f   of sqlite3rbu_o
19550 70 65 6e 28 29 20 77 68 65 6e 20 69 6e 69 74 69  pen() when initi
19560 61 6c 69 7a 69 6e 67 0a 2a 2a 20 61 6e 20 72 62  alizing.** an rb
19570 75 20 68 61 6e 64 6c 65 20 69 6e 20 4f 41 4c 20  u handle in OAL 
19580 73 74 61 67 65 2e 20 49 66 20 74 68 65 20 72 62  stage. If the rb
19590 75 20 75 70 64 61 74 65 20 68 61 73 20 6e 6f 74  u update has not
195a0 20 73 74 61 72 74 65 64 20 28 69 2e 65 2e 0a 2a   started (i.e..*
195b0 2a 20 74 68 65 20 72 62 75 5f 73 74 61 74 65 20  * the rbu_state 
195c0 74 61 62 6c 65 20 77 61 73 20 65 6d 70 74 79 29  table was empty)
195d0 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20   it is a no-op. 
195e0 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 61 72  Otherwise, it ar
195f0 72 61 6e 67 65 73 0a 2a 2a 20 74 68 69 6e 67 73  ranges.** things
19600 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65 78   so that the nex
19610 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  t call to sqlite
19620 33 72 62 75 5f 73 74 65 70 28 29 20 63 6f 6e 74  3rbu_step() cont
19630 69 6e 75 65 73 20 6f 6e 20 66 72 6f 6d 0a 2a 2a  inues on from.**
19640 20 77 68 65 72 65 20 74 68 65 20 70 72 65 76 69   where the previ
19650 6f 75 73 20 72 62 75 20 68 61 6e 64 6c 65 20 6c  ous rbu handle l
19660 65 66 74 20 6f 66 66 2e 0a 2a 2a 0a 2a 2a 20 49  eft off..**.** I
19670 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
19680 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  s, an error code
19690 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61   and error messa
196a0 67 65 20 61 72 65 20 6c 65 66 74 20 69 6e 20 74  ge are left in t
196b0 68 65 0a 2a 2a 20 72 62 75 20 68 61 6e 64 6c 65  he.** rbu handle
196c0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
196d0 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  irst argument..*
196e0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62  /.static void rb
196f0 75 53 65 74 75 70 4f 61 6c 28 73 71 6c 69 74 65  uSetupOal(sqlite
19700 33 72 62 75 20 2a 70 2c 20 52 62 75 53 74 61 74  3rbu *p, RbuStat
19710 65 20 2a 70 53 74 61 74 65 29 7b 0a 20 20 61 73  e *pState){.  as
19720 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  sert( p->rc==SQL
19730 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20  ITE_OK );.  if( 
19740 70 53 74 61 74 65 2d 3e 7a 54 62 6c 20 29 7b 0a  pState->zTbl ){.
19750 20 20 20 20 52 62 75 4f 62 6a 49 74 65 72 20 2a      RbuObjIter *
19760 70 49 74 65 72 20 3d 20 26 70 2d 3e 6f 62 6a 69  pIter = &p->obji
19770 74 65 72 3b 0a 20 20 20 20 69 6e 74 20 72 63 20  ter;.    int rc 
19780 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
19790 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
197a0 49 54 45 5f 4f 4b 20 26 26 20 70 49 74 65 72 2d  ITE_OK && pIter-
197b0 3e 7a 54 62 6c 20 26 26 20 28 70 49 74 65 72 2d  >zTbl && (pIter-
197c0 3e 62 43 6c 65 61 6e 75 70 20 0a 20 20 20 20 20  >bCleanup .     
197d0 20 20 7c 7c 20 72 62 75 53 74 72 43 6f 6d 70 61    || rbuStrCompa
197e0 72 65 28 70 49 74 65 72 2d 3e 7a 49 64 78 2c 20  re(pIter->zIdx, 
197f0 70 53 74 61 74 65 2d 3e 7a 49 64 78 29 0a 20 20  pState->zIdx).  
19800 20 20 20 20 20 7c 7c 20 72 62 75 53 74 72 43 6f       || rbuStrCo
19810 6d 70 61 72 65 28 70 49 74 65 72 2d 3e 7a 54 62  mpare(pIter->zTb
19820 6c 2c 20 70 53 74 61 74 65 2d 3e 7a 54 62 6c 29  l, pState->zTbl)
19830 20 0a 20 20 20 20 29 29 7b 0a 20 20 20 20 20 20   .    )){.      
19840 72 63 20 3d 20 72 62 75 4f 62 6a 49 74 65 72 4e  rc = rbuObjIterN
19850 65 78 74 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  ext(p, pIter);. 
19860 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63     }..    if( rc
19870 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21  ==SQLITE_OK && !
19880 70 49 74 65 72 2d 3e 7a 54 62 6c 20 29 7b 0a 20  pIter->zTbl ){. 
19890 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
198a0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 70 2d  _ERROR;.      p-
198b0 3e 7a 45 72 72 6d 73 67 20 3d 20 73 71 6c 69 74  >zErrmsg = sqlit
198c0 65 33 5f 6d 70 72 69 6e 74 66 28 22 72 62 75 5f  e3_mprintf("rbu_
198d0 73 74 61 74 65 20 6d 69 73 6d 61 74 63 68 20 65  state mismatch e
198e0 72 72 6f 72 22 29 3b 0a 20 20 20 20 7d 0a 0a 20  rror");.    }.. 
198f0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
19900 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d  E_OK ){.      p-
19910 3e 6e 53 74 65 70 20 3d 20 70 53 74 61 74 65 2d  >nStep = pState-
19920 3e 6e 52 6f 77 3b 0a 20 20 20 20 20 20 72 63 20  >nRow;.      rc 
19930 3d 20 72 62 75 4f 62 6a 49 74 65 72 50 72 65 70  = rbuObjIterPrep
19940 61 72 65 41 6c 6c 28 70 2c 20 26 70 2d 3e 6f 62  areAll(p, &p->ob
19950 6a 69 74 65 72 2c 20 70 2d 3e 6e 53 74 65 70 29  jiter, p->nStep)
19960 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 2d 3e  ;.    }..    p->
19970 72 63 20 3d 20 72 63 3b 0a 20 20 7d 0a 7d 0a 0a  rc = rc;.  }.}..
19980 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69  /*.** If there i
19990 73 20 61 20 22 2a 2d 6f 61 6c 22 20 66 69 6c 65  s a "*-oal" file
199a0 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73   in the file-sys
199b0 74 65 6d 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  tem correspondin
199c0 67 20 74 6f 20 74 68 65 0a 2a 2a 20 74 61 72 67  g to the.** targ
199d0 65 74 20 64 61 74 61 62 61 73 65 20 69 6e 20 74  et database in t
199e0 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20  he file-system, 
199f0 64 65 6c 65 74 65 20 69 74 2e 20 49 66 20 61 6e  delete it. If an
19a00 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 0a 2a   error occurs,.*
19a10 2a 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  * leave an error
19a20 20 63 6f 64 65 20 61 6e 64 20 65 72 72 6f 72 20   code and error 
19a30 6d 65 73 73 61 67 65 20 69 6e 20 74 68 65 20 72  message in the r
19a40 62 75 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74  bu handle..*/.st
19a50 61 74 69 63 20 76 6f 69 64 20 72 62 75 44 65 6c  atic void rbuDel
19a60 65 74 65 4f 61 6c 46 69 6c 65 28 73 71 6c 69 74  eteOalFile(sqlit
19a70 65 33 72 62 75 20 2a 70 29 7b 0a 20 20 63 68 61  e3rbu *p){.  cha
19a80 72 20 2a 7a 4f 61 6c 20 3d 20 72 62 75 4d 50 72  r *zOal = rbuMPr
19a90 69 6e 74 66 28 70 2c 20 22 25 73 2d 6f 61 6c 22  intf(p, "%s-oal"
19aa0 2c 20 70 2d 3e 7a 54 61 72 67 65 74 29 3b 0a 20  , p->zTarget);. 
19ab0 20 69 66 28 20 7a 4f 61 6c 20 29 7b 0a 20 20 20   if( zOal ){.   
19ac0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
19ad0 66 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73  fs = sqlite3_vfs
19ae0 5f 66 69 6e 64 28 30 29 3b 0a 20 20 20 20 61 73  _find(0);.    as
19af0 73 65 72 74 28 20 70 56 66 73 20 26 26 20 70 2d  sert( pVfs && p-
19b00 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
19b10 26 20 70 2d 3e 7a 45 72 72 6d 73 67 3d 3d 30 20  & p->zErrmsg==0 
19b20 29 3b 0a 20 20 20 20 70 56 66 73 2d 3e 78 44 65  );.    pVfs->xDe
19b30 6c 65 74 65 28 70 56 66 73 2c 20 7a 4f 61 6c 2c  lete(pVfs, zOal,
19b40 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
19b50 5f 66 72 65 65 28 7a 4f 61 6c 29 3b 0a 20 20 7d  _free(zOal);.  }
19b60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
19b70 74 65 20 61 20 70 72 69 76 61 74 65 20 72 62 75  te a private rbu
19b80 20 56 46 53 20 66 6f 72 20 74 68 65 20 72 62 75   VFS for the rbu
19b90 20 68 61 6e 64 6c 65 20 70 61 73 73 65 64 20 61   handle passed a
19ba0 73 20 74 68 65 20 6f 6e 6c 79 0a 2a 2a 20 61 72  s the only.** ar
19bb0 67 75 6d 65 6e 74 2e 20 54 68 69 73 20 56 46 53  gument. This VFS
19bc0 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 75 6e   will be used un
19bd0 6c 65 73 73 20 74 68 65 20 63 61 6c 6c 20 74 6f  less the call to
19be0 20 73 71 6c 69 74 65 33 72 62 75 5f 6f 70 65 6e   sqlite3rbu_open
19bf0 28 29 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20  ().** specified 
19c00 61 20 55 52 49 20 77 69 74 68 20 61 20 76 66 73  a URI with a vfs
19c10 3d 3f 20 6f 70 74 69 6f 6e 20 69 6e 20 70 6c 61  =? option in pla
19c20 63 65 20 6f 66 20 61 20 74 61 72 67 65 74 20 64  ce of a target d
19c30 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20  atabase.** file 
19c40 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  name..*/.static 
19c50 76 6f 69 64 20 72 62 75 43 72 65 61 74 65 56 66  void rbuCreateVf
19c60 73 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 29  s(sqlite3rbu *p)
19c70 7b 0a 20 20 69 6e 74 20 72 6e 64 3b 0a 20 20 63  {.  int rnd;.  c
19c80 68 61 72 20 7a 52 6e 64 5b 36 34 5d 3b 0a 0a 20  har zRnd[64];.. 
19c90 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d   assert( p->rc==
19ca0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 73  SQLITE_OK );.  s
19cb0 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73  qlite3_randomnes
19cc0 73 28 73 69 7a 65 6f 66 28 69 6e 74 29 2c 20 28  s(sizeof(int), (
19cd0 76 6f 69 64 2a 29 26 72 6e 64 29 3b 0a 20 20 73  void*)&rnd);.  s
19ce0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
19cf0 73 69 7a 65 6f 66 28 7a 52 6e 64 29 2c 20 7a 52  sizeof(zRnd), zR
19d00 6e 64 2c 20 22 72 62 75 5f 76 66 73 5f 25 64 22  nd, "rbu_vfs_%d"
19d10 2c 20 72 6e 64 29 3b 0a 20 20 70 2d 3e 72 63 20  , rnd);.  p->rc 
19d20 3d 20 73 71 6c 69 74 65 33 72 62 75 5f 63 72 65  = sqlite3rbu_cre
19d30 61 74 65 5f 76 66 73 28 7a 52 6e 64 2c 20 30 29  ate_vfs(zRnd, 0)
19d40 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ;.  if( p->rc==S
19d50 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19d60 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
19d70 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  s = sqlite3_vfs_
19d80 66 69 6e 64 28 7a 52 6e 64 29 3b 0a 20 20 20 20  find(zRnd);.    
19d90 61 73 73 65 72 74 28 20 70 56 66 73 20 29 3b 0a  assert( pVfs );.
19da0 20 20 20 20 70 2d 3e 7a 56 66 73 4e 61 6d 65 20      p->zVfsName 
19db0 3d 20 70 56 66 73 2d 3e 7a 4e 61 6d 65 3b 0a 20  = pVfs->zName;. 
19dc0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 74   }.}../*.** Dest
19dd0 72 6f 79 20 74 68 65 20 70 72 69 76 61 74 65 20  roy the private 
19de0 56 46 53 20 63 72 65 61 74 65 64 20 66 6f 72 20  VFS created for 
19df0 74 68 65 20 72 62 75 20 68 61 6e 64 6c 65 20 70  the rbu handle p
19e00 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c  assed as the onl
19e10 79 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 62 79  y.** argument by
19e20 20 61 6e 20 65 61 72 6c 69 65 72 20 63 61 6c 6c   an earlier call
19e30 20 74 6f 20 72 62 75 43 72 65 61 74 65 56 66 73   to rbuCreateVfs
19e40 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ()..*/.static vo
19e50 69 64 20 72 62 75 44 65 6c 65 74 65 56 66 73 28  id rbuDeleteVfs(
19e60 73 71 6c 69 74 65 33 72 62 75 20 2a 70 29 7b 0a  sqlite3rbu *p){.
19e70 20 20 69 66 28 20 70 2d 3e 7a 56 66 73 4e 61 6d    if( p->zVfsNam
19e80 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
19e90 72 62 75 5f 64 65 73 74 72 6f 79 5f 76 66 73 28  rbu_destroy_vfs(
19ea0 70 2d 3e 7a 56 66 73 4e 61 6d 65 29 3b 0a 20 20  p->zVfsName);.  
19eb0 20 20 70 2d 3e 7a 56 66 73 4e 61 6d 65 20 3d 20    p->zVfsName = 
19ec0 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
19ed0 54 68 69 73 20 75 73 65 72 2d 64 65 66 69 6e 65  This user-define
19ee0 64 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 69  d SQL function i
19ef0 73 20 69 6e 76 6f 6b 65 64 20 77 69 74 68 20 61  s invoked with a
19f00 20 73 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74   single argument
19f10 20 2d 20 74 68 65 0a 2a 2a 20 6e 61 6d 65 20 6f   - the.** name o
19f20 66 20 61 20 74 61 62 6c 65 20 65 78 70 65 63 74  f a table expect
19f30 65 64 20 74 6f 20 61 70 70 65 61 72 20 69 6e 20  ed to appear in 
19f40 74 68 65 20 74 61 72 67 65 74 20 64 61 74 61 62  the target datab
19f50 61 73 65 2e 20 49 74 20 72 65 74 75 72 6e 73 0a  ase. It returns.
19f60 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** the number of
19f70 20 61 75 78 69 6c 6c 69 61 72 79 20 69 6e 64 65   auxilliary inde
19f80 78 65 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  xes on the table
19f90 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
19fa0 20 72 62 75 49 6e 64 65 78 43 6e 74 46 75 6e 63   rbuIndexCntFunc
19fb0 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
19fc0 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e  ext *pCtx, .  in
19fd0 74 20 6e 56 61 6c 2c 0a 20 20 73 71 6c 69 74 65  t nVal,.  sqlite
19fe0 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 0a  3_value **apVal.
19ff0 29 7b 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20  ){.  sqlite3rbu 
1a000 2a 70 20 3d 20 28 73 71 6c 69 74 65 33 72 62 75  *p = (sqlite3rbu
1a010 2a 29 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64  *)sqlite3_user_d
1a020 61 74 61 28 70 43 74 78 29 3b 0a 20 20 73 71 6c  ata(pCtx);.  sql
1a030 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
1a040 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 45   = 0;.  char *zE
1a050 72 72 6d 73 67 20 3d 20 30 3b 0a 20 20 69 6e 74  rrmsg = 0;.  int
1a060 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
1a070 6e 56 61 6c 3d 3d 31 20 29 3b 0a 20 20 0a 20 20  nVal==1 );.  .  
1a080 72 63 20 3d 20 70 72 65 70 61 72 65 46 72 65 65  rc = prepareFree
1a090 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28  AndCollectError(
1a0a0 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 70 53 74 6d  p->dbMain, &pStm
1a0b0 74 2c 20 26 7a 45 72 72 6d 73 67 2c 20 0a 20 20  t, &zErrmsg, .  
1a0c0 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69      sqlite3_mpri
1a0d0 6e 74 66 28 22 53 45 4c 45 43 54 20 63 6f 75 6e  ntf("SELECT coun
1a0e0 74 28 2a 29 20 46 52 4f 4d 20 73 71 6c 69 74 65  t(*) FROM sqlite
1a0f0 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20 20 20  _master ".      
1a100 20 20 22 57 48 45 52 45 20 74 79 70 65 3d 27 69    "WHERE type='i
1a110 6e 64 65 78 27 20 41 4e 44 20 74 62 6c 5f 6e 61  ndex' AND tbl_na
1a120 6d 65 20 3d 20 25 51 22 2c 20 73 71 6c 69 74 65  me = %Q", sqlite
1a130 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 70 56  3_value_text(apV
1a140 61 6c 5b 30 5d 29 29 0a 20 20 29 3b 0a 20 20 69  al[0])).  );.  i
1a150 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1a160 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
1a170 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 70 43 74  result_error(pCt
1a180 78 2c 20 7a 45 72 72 6d 73 67 2c 20 2d 31 29 3b  x, zErrmsg, -1);
1a190 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
1a1a0 74 20 6e 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20  t nIndex = 0;.  
1a1b0 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57    if( SQLITE_ROW
1a1c0 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ==sqlite3_step(p
1a1d0 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20 20 6e  Stmt) ){.      n
1a1e0 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 5f  Index = sqlite3_
1a1f0 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74  column_int(pStmt
1a200 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
1a210 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e  rc = sqlite3_fin
1a220 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
1a230 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1a240 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
1a250 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28  ite3_result_int(
1a260 70 43 74 78 2c 20 6e 49 6e 64 65 78 29 3b 0a 20  pCtx, nIndex);. 
1a270 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1a280 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
1a290 72 72 6f 72 28 70 43 74 78 2c 20 73 71 6c 69 74  rror(pCtx, sqlit
1a2a0 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 4d  e3_errmsg(p->dbM
1a2b0 61 69 6e 29 2c 20 2d 31 29 3b 0a 20 20 20 20 7d  ain), -1);.    }
1a2c0 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f  .  }..  sqlite3_
1a2d0 66 72 65 65 28 7a 45 72 72 6d 73 67 29 3b 0a 7d  free(zErrmsg);.}
1a2e0 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 52  ../*.** If the R
1a2f0 42 55 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  BU database cont
1a300 61 69 6e 73 20 74 68 65 20 72 62 75 5f 63 6f 75  ains the rbu_cou
1a310 6e 74 20 74 61 62 6c 65 2c 20 75 73 65 20 69 74  nt table, use it
1a320 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 0a 2a   to initialize.*
1a330 2a 20 74 68 65 20 73 71 6c 69 74 65 33 72 62 75  * the sqlite3rbu
1a340 2e 6e 50 68 61 73 65 4f 6e 65 53 74 65 70 20 76  .nPhaseOneStep v
1a350 61 72 69 61 62 6c 65 2e 20 54 68 65 20 73 63 68  ariable. The sch
1a360 65 6d 61 20 6f 66 20 74 68 65 20 72 62 75 5f 63  ema of the rbu_c
1a370 6f 75 6e 74 20 74 61 62 6c 65 0a 2a 2a 20 69 73  ount table.** is
1a380 20 61 73 73 75 6d 65 64 20 74 6f 20 63 6f 6e 74   assumed to cont
1a390 61 69 6e 20 74 68 65 20 73 61 6d 65 20 63 6f 6c  ain the same col
1a3a0 75 6d 6e 73 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20  umns as:.**.**  
1a3b0 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 72 62   CREATE TABLE rb
1a3c0 75 5f 63 6f 75 6e 74 28 74 62 6c 20 54 45 58 54  u_count(tbl TEXT
1a3d0 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 63 6e   PRIMARY KEY, cn
1a3e0 74 20 49 4e 54 45 47 45 52 29 20 57 49 54 48 4f  t INTEGER) WITHO
1a3f0 55 54 20 52 4f 57 49 44 3b 0a 2a 2a 0a 2a 2a 20  UT ROWID;.**.** 
1a400 54 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20  There should be 
1a410 6f 6e 65 20 72 6f 77 20 69 6e 20 74 68 65 20 74  one row in the t
1a420 61 62 6c 65 20 66 6f 72 20 65 61 63 68 20 64 61  able for each da
1a430 74 61 5f 78 78 78 20 74 61 62 6c 65 20 69 6e 20  ta_xxx table in 
1a440 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e  the.** database.
1a450 20 54 68 65 20 27 74 62 6c 27 20 63 6f 6c 75 6d   The 'tbl' colum
1a460 6e 20 73 68 6f 75 6c 64 20 63 6f 6e 74 61 69 6e  n should contain
1a470 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 64   the name of a d
1a480 61 74 61 5f 78 78 78 20 74 61 62 6c 65 2c 0a 2a  ata_xxx table,.*
1a490 2a 20 61 6e 64 20 74 68 65 20 63 6e 74 20 63 6f  * and the cnt co
1a4a0 6c 75 6d 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  lumn the number 
1a4b0 6f 66 20 72 6f 77 73 20 69 74 20 63 6f 6e 74 61  of rows it conta
1a4c0 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74  ins..**.** sqlit
1a4d0 65 33 72 62 75 2e 6e 50 68 61 73 65 4f 6e 65 53  e3rbu.nPhaseOneS
1a4e0 74 65 70 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  tep is initializ
1a4f0 65 64 20 74 6f 20 74 68 65 20 73 75 6d 20 6f 66  ed to the sum of
1a500 20 28 31 20 2b 20 6e 49 6e 64 65 78 29 20 2a 20   (1 + nIndex) * 
1a510 63 6e 74 0a 2a 2a 20 66 6f 72 20 61 6c 6c 20 72  cnt.** for all r
1a520 6f 77 73 20 69 6e 20 74 68 65 20 72 62 75 5f 63  ows in the rbu_c
1a530 6f 75 6e 74 20 74 61 62 6c 65 2c 20 77 68 65 72  ount table, wher
1a540 65 20 6e 49 6e 64 65 78 20 69 73 20 74 68 65 20  e nIndex is the 
1a550 6e 75 6d 62 65 72 20 6f 66 20 0a 2a 2a 20 69 6e  number of .** in
1a560 64 65 78 65 73 20 6f 6e 20 74 68 65 20 63 6f 72  dexes on the cor
1a570 72 65 73 70 6f 6e 64 69 6e 67 20 74 61 72 67 65  responding targe
1a580 74 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65  t database table
1a590 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1a5a0 20 72 62 75 49 6e 69 74 50 68 61 73 65 4f 6e 65   rbuInitPhaseOne
1a5b0 53 74 65 70 73 28 73 71 6c 69 74 65 33 72 62 75  Steps(sqlite3rbu
1a5c0 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72   *p){.  if( p->r
1a5d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1a5e0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
1a5f0 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20   *pStmt = 0;.   
1a600 20 69 6e 74 20 62 45 78 69 73 74 73 20 3d 20 30   int bExists = 0
1a610 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1a620 20 2f 2a 20 54 72 75 65 20 69 66 20 72 62 75 5f   /* True if rbu_
1a630 63 6f 75 6e 74 20 65 78 69 73 74 73 20 2a 2f 0a  count exists */.
1a640 0a 20 20 20 20 70 2d 3e 6e 50 68 61 73 65 4f 6e  .    p->nPhaseOn
1a650 65 53 74 65 70 20 3d 20 2d 31 3b 0a 0a 20 20 20  eStep = -1;..   
1a660 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33   p->rc = sqlite3
1a670 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
1a680 28 70 2d 3e 64 62 52 62 75 2c 20 0a 20 20 20 20  (p->dbRbu, .    
1a690 20 20 20 20 22 72 62 75 5f 69 6e 64 65 78 5f 63      "rbu_index_c
1a6a0 6e 74 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55  nt", 1, SQLITE_U
1a6b0 54 46 38 2c 20 28 76 6f 69 64 2a 29 70 2c 20 72  TF8, (void*)p, r
1a6c0 62 75 49 6e 64 65 78 43 6e 74 46 75 6e 63 2c 20  buIndexCntFunc, 
1a6d0 30 2c 20 30 0a 20 20 20 20 29 3b 0a 20 20 0a 20  0, 0.    );.  . 
1a6e0 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20     /* Check for 
1a6f0 74 68 65 20 72 62 75 5f 63 6f 75 6e 74 20 74 61  the rbu_count ta
1a700 62 6c 65 2e 20 49 66 20 69 74 20 64 6f 65 73 20  ble. If it does 
1a710 6e 6f 74 20 65 78 69 73 74 2c 20 6f 72 20 69 66  not exist, or if
1a720 20 61 6e 20 65 72 72 6f 72 0a 20 20 20 20 2a 2a   an error.    **
1a730 20 6f 63 63 75 72 73 2c 20 6e 50 68 61 73 65 4f   occurs, nPhaseO
1a740 6e 65 53 74 65 70 20 77 69 6c 6c 20 62 65 20 6c  neStep will be l
1a750 65 66 74 20 73 65 74 20 74 6f 20 2d 31 2e 20 2a  eft set to -1. *
1a760 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d  /.    if( p->rc=
1a770 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1a780 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70      p->rc = prep
1a790 61 72 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72  areAndCollectErr
1a7a0 6f 72 28 70 2d 3e 64 62 52 62 75 2c 20 26 70 53  or(p->dbRbu, &pS
1a7b0 74 6d 74 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67  tmt, &p->zErrmsg
1a7c0 2c 0a 20 20 20 20 20 20 20 20 20 20 22 53 45 4c  ,.          "SEL
1a7d0 45 43 54 20 31 20 46 52 4f 4d 20 73 71 6c 69 74  ECT 1 FROM sqlit
1a7e0 65 5f 6d 61 73 74 65 72 20 57 48 45 52 45 20 74  e_master WHERE t
1a7f0 62 6c 5f 6e 61 6d 65 20 3d 20 27 72 62 75 5f 63  bl_name = 'rbu_c
1a800 6f 75 6e 74 27 22 0a 20 20 20 20 20 20 29 3b 0a  ount'".      );.
1a810 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d      }.    if( p-
1a820 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
1a830 7b 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49  {.      if( SQLI
1a840 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
1a850 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20  step(pStmt) ){. 
1a860 20 20 20 20 20 20 20 62 45 78 69 73 74 73 20 3d         bExists =
1a870 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
1a880 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65    p->rc = sqlite
1a890 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
1a8a0 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  );.    }.  .    
1a8b0 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
1a8c0 45 5f 4f 4b 20 26 26 20 62 45 78 69 73 74 73 20  E_OK && bExists 
1a8d0 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  ){.      p->rc =
1a8e0 20 70 72 65 70 61 72 65 41 6e 64 43 6f 6c 6c 65   prepareAndColle
1a8f0 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 52 62 75  ctError(p->dbRbu
1a900 2c 20 26 70 53 74 6d 74 2c 20 26 70 2d 3e 7a 45  , &pStmt, &p->zE
1a910 72 72 6d 73 67 2c 0a 20 20 20 20 20 20 20 20 20  rrmsg,.         
1a920 20 22 53 45 4c 45 43 54 20 73 75 6d 28 63 6e 74   "SELECT sum(cnt
1a930 20 2a 20 28 31 20 2b 20 72 62 75 5f 69 6e 64 65   * (1 + rbu_inde
1a940 78 5f 63 6e 74 28 72 62 75 5f 74 61 72 67 65 74  x_cnt(rbu_target
1a950 5f 6e 61 6d 65 28 74 62 6c 29 29 29 29 22 0a 20  _name(tbl))))". 
1a960 20 20 20 20 20 20 20 20 20 22 46 52 4f 4d 20 72           "FROM r
1a970 62 75 5f 63 6f 75 6e 74 22 0a 20 20 20 20 20 20  bu_count".      
1a980 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  );.      if( p->
1a990 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1a9a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 53 51 4c  .        if( SQL
1a9b0 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
1a9c0 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a  _step(pStmt) ){.
1a9d0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 50 68            p->nPh
1a9e0 61 73 65 4f 6e 65 53 74 65 70 20 3d 20 73 71 6c  aseOneStep = sql
1a9f0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36  ite3_column_int6
1aa00 34 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20  4(pStmt, 0);.   
1aa10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
1aa20 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66  ->rc = sqlite3_f
1aa30 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
1aa40 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1aa50 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73  }.}../*.** The s
1aa60 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 70  econd argument p
1aa70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75  assed to this fu
1aa80 6e 63 74 69 6f 6e 20 69 73 20 74 68 65 20 6e 61  nction is the na
1aa90 6d 65 20 6f 66 20 61 20 50 52 41 47 4d 41 20 0a  me of a PRAGMA .
1aaa0 2a 2a 20 73 65 74 74 69 6e 67 20 2d 20 22 70 61  ** setting - "pa
1aab0 67 65 5f 73 69 7a 65 22 2c 20 22 61 75 74 6f 5f  ge_size", "auto_
1aac0 76 61 63 75 75 6d 22 2c 20 22 75 73 65 72 5f 76  vacuum", "user_v
1aad0 65 72 73 69 6f 6e 22 20 6f 72 20 22 61 70 70 6c  ersion" or "appl
1aae0 69 63 61 74 69 6f 6e 5f 69 64 22 2e 0a 2a 2a 20  ication_id"..** 
1aaf0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 65 78  This function ex
1ab00 65 63 75 74 65 73 20 74 68 65 20 66 6f 6c 6c 6f  ecutes the follo
1ab10 77 69 6e 67 20 6f 6e 20 73 71 6c 69 74 65 33 72  wing on sqlite3r
1ab20 62 75 2e 64 62 52 62 75 3a 0a 2a 2a 0a 2a 2a 20  bu.dbRbu:.**.** 
1ab30 20 20 22 50 52 41 47 4d 41 20 6d 61 69 6e 2e 24    "PRAGMA main.$
1ab40 7a 50 72 61 67 6d 61 22 0a 2a 2a 0a 2a 2a 20 77  zPragma".**.** w
1ab50 68 65 72 65 20 24 7a 50 72 61 67 6d 61 20 69 73  here $zPragma is
1ab60 20 74 68 65 20 73 74 72 69 6e 67 20 70 61 73 73   the string pass
1ab70 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
1ab80 20 61 72 67 75 6d 65 6e 74 2c 20 74 68 65 6e 0a   argument, then.
1ab90 2a 2a 20 6f 6e 20 73 71 6c 69 74 65 33 72 62 75  ** on sqlite3rbu
1aba0 2e 64 62 4d 61 69 6e 3a 0a 2a 2a 0a 2a 2a 20 20  .dbMain:.**.**  
1abb0 20 22 50 52 41 47 4d 41 20 6d 61 69 6e 2e 24 7a   "PRAGMA main.$z
1abc0 50 72 61 67 6d 61 20 3d 20 24 76 61 6c 22 0a 2a  Pragma = $val".*
1abd0 2a 0a 2a 2a 20 77 68 65 72 65 20 24 76 61 6c 20  *.** where $val 
1abe0 69 73 20 74 68 65 20 76 61 6c 75 65 20 72 65 74  is the value ret
1abf0 75 72 6e 65 64 20 62 79 20 74 68 65 20 66 69 72  urned by the fir
1ac00 73 74 20 50 52 41 47 4d 41 20 69 6e 76 6f 63 61  st PRAGMA invoca
1ac10 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 73  tion..**.** In s
1ac20 68 6f 72 74 2c 20 69 74 20 63 6f 70 69 65 73 20  hort, it copies 
1ac30 74 68 65 20 76 61 6c 75 65 20 20 6f 66 20 74 68  the value  of th
1ac40 65 20 73 70 65 63 69 66 69 65 64 20 50 52 41 47  e specified PRAG
1ac50 4d 41 20 73 65 74 74 69 6e 67 20 66 72 6f 6d 0a  MA setting from.
1ac60 2a 2a 20 64 62 52 62 75 20 74 6f 20 64 62 4d 61  ** dbRbu to dbMa
1ac70 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  in..*/.static vo
1ac80 69 64 20 72 62 75 43 6f 70 79 50 72 61 67 6d 61  id rbuCopyPragma
1ac90 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20  (sqlite3rbu *p, 
1aca0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 72 61  const char *zPra
1acb0 67 6d 61 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72  gma){.  if( p->r
1acc0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1acd0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
1ace0 20 2a 70 50 72 61 67 6d 61 20 3d 20 30 3b 0a 20   *pPragma = 0;. 
1acf0 20 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61     p->rc = prepa
1ad00 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74  reFreeAndCollect
1ad10 45 72 72 6f 72 28 70 2d 3e 64 62 52 62 75 2c 20  Error(p->dbRbu, 
1ad20 26 70 50 72 61 67 6d 61 2c 20 26 70 2d 3e 7a 45  &pPragma, &p->zE
1ad30 72 72 6d 73 67 2c 20 0a 20 20 20 20 20 20 20 20  rrmsg, .        
1ad40 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
1ad50 22 50 52 41 47 4d 41 20 6d 61 69 6e 2e 25 73 22  "PRAGMA main.%s"
1ad60 2c 20 7a 50 72 61 67 6d 61 29 0a 20 20 20 20 29  , zPragma).    )
1ad70 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d  ;.    if( p->rc=
1ad80 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51  =SQLITE_OK && SQ
1ad90 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65  LITE_ROW==sqlite
1ada0 33 5f 73 74 65 70 28 70 50 72 61 67 6d 61 29 20  3_step(pPragma) 
1adb0 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  ){.      p->rc =
1adc0 20 72 62 75 4d 50 72 69 6e 74 66 45 78 65 63 28   rbuMPrintfExec(
1add0 70 2c 20 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 50  p, p->dbMain, "P
1ade0 52 41 47 4d 41 20 6d 61 69 6e 2e 25 73 20 3d 20  RAGMA main.%s = 
1adf0 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 7a  %d",.          z
1ae00 50 72 61 67 6d 61 2c 20 73 71 6c 69 74 65 33 5f  Pragma, sqlite3_
1ae10 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 50 72 61 67  column_int(pPrag
1ae20 6d 61 2c 20 30 29 0a 20 20 20 20 20 20 29 3b 0a  ma, 0).      );.
1ae30 20 20 20 20 7d 0a 20 20 20 20 72 62 75 46 69 6e      }.    rbuFin
1ae40 61 6c 69 7a 65 28 70 2c 20 70 50 72 61 67 6d 61  alize(p, pPragma
1ae50 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
1ae60 54 68 65 20 52 42 55 20 68 61 6e 64 6c 65 20 70  The RBU handle p
1ae70 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c  assed as the onl
1ae80 79 20 61 72 67 75 6d 65 6e 74 20 68 61 73 20 6a  y argument has j
1ae90 75 73 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 20  ust been opened 
1aea0 61 6e 64 20 0a 2a 2a 20 74 68 65 20 73 74 61 74  and .** the stat
1aeb0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 65 6d  e database is em
1aec0 70 74 79 2e 20 49 66 20 74 68 69 73 20 52 42 55  pty. If this RBU
1aed0 20 68 61 6e 64 6c 65 20 77 61 73 20 6f 70 65 6e   handle was open
1aee0 65 64 20 66 6f 72 20 61 6e 0a 2a 2a 20 52 42 55  ed for an.** RBU
1aef0 20 76 61 63 75 75 6d 20 6f 70 65 72 61 74 69 6f   vacuum operatio
1af00 6e 2c 20 63 72 65 61 74 65 20 74 68 65 20 73 63  n, create the sc
1af10 68 65 6d 61 20 69 6e 20 74 68 65 20 74 61 72 67  hema in the targ
1af20 65 74 20 64 62 2e 0a 2a 2f 0a 73 74 61 74 69 63  et db..*/.static
1af30 20 76 6f 69 64 20 72 62 75 43 72 65 61 74 65 54   void rbuCreateT
1af40 61 72 67 65 74 53 63 68 65 6d 61 28 73 71 6c 69  argetSchema(sqli
1af50 74 65 33 72 62 75 20 2a 70 29 7b 0a 20 20 73 71  te3rbu *p){.  sq
1af60 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 71 6c  lite3_stmt *pSql
1af70 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
1af80 73 74 6d 74 20 2a 70 49 6e 73 65 72 74 20 3d 20  stmt *pInsert = 
1af90 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 72 62  0;..  assert( rb
1afa0 75 49 73 56 61 63 75 75 6d 28 70 29 20 29 3b 0a  uIsVacuum(p) );.
1afb0 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65    p->rc = sqlite
1afc0 33 5f 65 78 65 63 28 70 2d 3e 64 62 4d 61 69 6e  3_exec(p->dbMain
1afd0 2c 20 22 50 52 41 47 4d 41 20 77 72 69 74 61 62  , "PRAGMA writab
1afe0 6c 65 5f 73 63 68 65 6d 61 3d 31 22 2c 20 30 2c  le_schema=1", 0,
1aff0 30 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 29 3b  0, &p->zErrmsg);
1b000 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
1b010 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
1b020 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65 41 6e  ->rc = prepareAn
1b030 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d  dCollectError(p-
1b040 3e 64 62 52 62 75 2c 20 26 70 53 71 6c 2c 20 26  >dbRbu, &pSql, &
1b050 70 2d 3e 7a 45 72 72 6d 73 67 2c 20 0a 20 20 20  p->zErrmsg, .   
1b060 20 20 20 22 53 45 4c 45 43 54 20 73 71 6c 20 46     "SELECT sql F
1b070 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
1b080 72 20 57 48 45 52 45 20 73 71 6c 21 3d 27 27 20  r WHERE sql!='' 
1b090 41 4e 44 20 72 6f 6f 74 70 61 67 65 21 3d 30 22  AND rootpage!=0"
1b0a0 0a 20 20 20 20 20 20 22 20 41 4e 44 20 6e 61 6d  .      " AND nam
1b0b0 65 21 3d 27 73 71 6c 69 74 65 5f 73 65 71 75 65  e!='sqlite_seque
1b0c0 6e 63 65 27 20 22 0a 20 20 20 20 20 20 22 20 4f  nce' ".      " O
1b0d0 52 44 45 52 20 42 59 20 74 79 70 65 20 44 45 53  RDER BY type DES
1b0e0 43 22 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20  C".    );.  }.. 
1b0f0 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53   while( p->rc==S
1b100 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 71 6c 69  QLITE_OK && sqli
1b110 74 65 33 5f 73 74 65 70 28 70 53 71 6c 29 3d 3d  te3_step(pSql)==
1b120 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
1b130 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
1b140 71 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  ql = (const char
1b150 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
1b160 5f 74 65 78 74 28 70 53 71 6c 2c 20 30 29 3b 0a  _text(pSql, 0);.
1b170 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69      p->rc = sqli
1b180 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 4d 61  te3_exec(p->dbMa
1b190 69 6e 2c 20 7a 53 71 6c 2c 20 30 2c 20 30 2c 20  in, zSql, 0, 0, 
1b1a0 26 70 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a 20 20  &p->zErrmsg);.  
1b1b0 7d 0a 20 20 72 62 75 46 69 6e 61 6c 69 7a 65 28  }.  rbuFinalize(
1b1c0 70 2c 20 70 53 71 6c 29 3b 0a 20 20 69 66 28 20  p, pSql);.  if( 
1b1d0 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc!=SQLITE_OK
1b1e0 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66   ) return;..  if
1b1f0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
1b200 4f 4b 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  OK ){.    p->rc 
1b210 3d 20 70 72 65 70 61 72 65 41 6e 64 43 6f 6c 6c  = prepareAndColl
1b220 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 52 62  ectError(p->dbRb
1b230 75 2c 20 26 70 53 71 6c 2c 20 26 70 2d 3e 7a 45  u, &pSql, &p->zE
1b240 72 72 6d 73 67 2c 20 0a 20 20 20 20 20 20 20 20  rrmsg, .        
1b250 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73  "SELECT * FROM s
1b260 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 57 48 45  qlite_master WHE
1b270 52 45 20 72 6f 6f 74 70 61 67 65 3d 30 20 4f 52  RE rootpage=0 OR
1b280 20 72 6f 6f 74 70 61 67 65 20 49 53 20 4e 55 4c   rootpage IS NUL
1b290 4c 22 20 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a  L" .    );.  }..
1b2a0 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
1b2b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d  ITE_OK ){.    p-
1b2c0 3e 72 63 20 3d 20 70 72 65 70 61 72 65 41 6e 64  >rc = prepareAnd
1b2d0 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e  CollectError(p->
1b2e0 64 62 4d 61 69 6e 2c 20 26 70 49 6e 73 65 72 74  dbMain, &pInsert
1b2f0 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 20 0a  , &p->zErrmsg, .
1b300 20 20 20 20 20 20 20 20 22 49 4e 53 45 52 54 20          "INSERT 
1b310 49 4e 54 4f 20 73 71 6c 69 74 65 5f 6d 61 73 74  INTO sqlite_mast
1b320 65 72 20 56 41 4c 55 45 53 28 3f 2c 3f 2c 3f 2c  er VALUES(?,?,?,
1b330 3f 2c 3f 29 22 0a 20 20 20 20 29 3b 0a 20 20 7d  ?,?)".    );.  }
1b340 0a 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63  ..  while( p->rc
1b350 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73  ==SQLITE_OK && s
1b360 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 71 6c  qlite3_step(pSql
1b370 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  )==SQLITE_ROW ){
1b380 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
1b390 66 6f 72 28 69 3d 30 3b 20 69 3c 35 3b 20 69 2b  for(i=0; i<5; i+
1b3a0 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
1b3b0 33 5f 62 69 6e 64 5f 76 61 6c 75 65 28 70 49 6e  3_bind_value(pIn
1b3c0 73 65 72 74 2c 20 69 2b 31 2c 20 73 71 6c 69 74  sert, i+1, sqlit
1b3d0 65 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28  e3_column_value(
1b3e0 70 53 71 6c 2c 20 69 29 29 3b 0a 20 20 20 20 7d  pSql, i));.    }
1b3f0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65  .    sqlite3_ste
1b400 70 28 70 49 6e 73 65 72 74 29 3b 0a 20 20 20 20  p(pInsert);.    
1b410 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  p->rc = sqlite3_
1b420 72 65 73 65 74 28 70 49 6e 73 65 72 74 29 3b 0a  reset(pInsert);.
1b430 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d    }.  if( p->rc=
1b440 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1b450 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65    p->rc = sqlite
1b460 33 5f 65 78 65 63 28 70 2d 3e 64 62 4d 61 69 6e  3_exec(p->dbMain
1b470 2c 20 22 50 52 41 47 4d 41 20 77 72 69 74 61 62  , "PRAGMA writab
1b480 6c 65 5f 73 63 68 65 6d 61 3d 30 22 2c 30 2c 30  le_schema=0",0,0
1b490 2c 26 70 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a 20  ,&p->zErrmsg);. 
1b4a0 20 7d 0a 0a 20 20 72 62 75 46 69 6e 61 6c 69 7a   }..  rbuFinaliz
1b4b0 65 28 70 2c 20 70 53 71 6c 29 3b 0a 20 20 72 62  e(p, pSql);.  rb
1b4c0 75 46 69 6e 61 6c 69 7a 65 28 70 2c 20 70 49 6e  uFinalize(p, pIn
1b4d0 73 65 72 74 29 3b 0a 7d 0a 0a 0a 73 74 61 74 69  sert);.}...stati
1b4e0 63 20 73 71 6c 69 74 65 33 72 62 75 20 2a 6f 70  c sqlite3rbu *op
1b4f0 65 6e 52 62 75 48 61 6e 64 6c 65 28 0a 20 20 63  enRbuHandle(.  c
1b500 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 72 67  onst char *zTarg
1b510 65 74 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61  et, .  const cha
1b520 72 20 2a 7a 52 62 75 2c 0a 20 20 63 6f 6e 73 74  r *zRbu,.  const
1b530 20 63 68 61 72 20 2a 7a 53 74 61 74 65 0a 29 7b   char *zState.){
1b540 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20 2a 70  .  sqlite3rbu *p
1b550 3b 0a 20 20 73 69 7a 65 5f 74 20 6e 54 61 72 67  ;.  size_t nTarg
1b560 65 74 20 3d 20 7a 54 61 72 67 65 74 20 3f 20 73  et = zTarget ? s
1b570 74 72 6c 65 6e 28 7a 54 61 72 67 65 74 29 20 3a  trlen(zTarget) :
1b580 20 30 3b 0a 20 20 73 69 7a 65 5f 74 20 6e 52 62   0;.  size_t nRb
1b590 75 20 3d 20 73 74 72 6c 65 6e 28 7a 52 62 75 29  u = strlen(zRbu)
1b5a0 3b 0a 20 20 73 69 7a 65 5f 74 20 6e 53 74 61 74  ;.  size_t nStat
1b5b0 65 20 3d 20 7a 53 74 61 74 65 20 3f 20 73 74 72  e = zState ? str
1b5c0 6c 65 6e 28 7a 53 74 61 74 65 29 20 3a 20 30 3b  len(zState) : 0;
1b5d0 0a 20 20 73 69 7a 65 5f 74 20 6e 42 79 74 65 20  .  size_t nByte 
1b5e0 3d 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33  = sizeof(sqlite3
1b5f0 72 62 75 29 20 2b 20 6e 54 61 72 67 65 74 2b 31  rbu) + nTarget+1
1b600 20 2b 20 6e 52 62 75 2b 31 2b 20 6e 53 74 61 74   + nRbu+1+ nStat
1b610 65 2b 31 3b 0a 0a 20 20 70 20 3d 20 28 73 71 6c  e+1;..  p = (sql
1b620 69 74 65 33 72 62 75 2a 29 73 71 6c 69 74 65 33  ite3rbu*)sqlite3
1b630 5f 6d 61 6c 6c 6f 63 36 34 28 6e 42 79 74 65 29  _malloc64(nByte)
1b640 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
1b650 20 52 62 75 53 74 61 74 65 20 2a 70 53 74 61 74   RbuState *pStat
1b660 65 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 43  e = 0;..    /* C
1b670 72 65 61 74 65 20 74 68 65 20 63 75 73 74 6f 6d  reate the custom
1b680 20 56 46 53 2e 20 2a 2f 0a 20 20 20 20 6d 65 6d   VFS. */.    mem
1b690 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66  set(p, 0, sizeof
1b6a0 28 73 71 6c 69 74 65 33 72 62 75 29 29 3b 0a 20  (sqlite3rbu));. 
1b6b0 20 20 20 72 62 75 43 72 65 61 74 65 56 66 73 28     rbuCreateVfs(
1b6c0 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e  p);..    /* Open
1b6d0 20 74 68 65 20 74 61 72 67 65 74 2c 20 52 42 55   the target, RBU
1b6e0 20 61 6e 64 20 73 74 61 74 65 20 64 61 74 61 62   and state datab
1b6f0 61 73 65 73 20 2a 2f 0a 20 20 20 20 69 66 28 20  ases */.    if( 
1b700 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
1b710 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
1b720 70 43 73 72 20 3d 20 28 63 68 61 72 2a 29 26 70  pCsr = (char*)&p
1b730 5b 31 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  [1];.      if( z
1b740 54 61 72 67 65 74 20 29 7b 0a 20 20 20 20 20 20  Target ){.      
1b750 20 20 70 2d 3e 7a 54 61 72 67 65 74 20 3d 20 70    p->zTarget = p
1b760 43 73 72 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  Csr;.        mem
1b770 63 70 79 28 70 2d 3e 7a 54 61 72 67 65 74 2c 20  cpy(p->zTarget, 
1b780 7a 54 61 72 67 65 74 2c 20 6e 54 61 72 67 65 74  zTarget, nTarget
1b790 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 70 43 73  +1);.        pCs
1b7a0 72 20 2b 3d 20 6e 54 61 72 67 65 74 2b 31 3b 0a  r += nTarget+1;.
1b7b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d        }.      p-
1b7c0 3e 7a 52 62 75 20 3d 20 70 43 73 72 3b 0a 20 20  >zRbu = pCsr;.  
1b7d0 20 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e 7a 52      memcpy(p->zR
1b7e0 62 75 2c 20 7a 52 62 75 2c 20 6e 52 62 75 2b 31  bu, zRbu, nRbu+1
1b7f0 29 3b 0a 20 20 20 20 20 20 70 43 73 72 20 2b 3d  );.      pCsr +=
1b800 20 6e 52 62 75 2b 31 3b 0a 20 20 20 20 20 20 69   nRbu+1;.      i
1b810 66 28 20 7a 53 74 61 74 65 20 29 7b 0a 20 20 20  f( zState ){.   
1b820 20 20 20 20 20 70 2d 3e 7a 53 74 61 74 65 20 3d       p->zState =
1b830 20 70 43 73 72 3b 0a 20 20 20 20 20 20 20 20 6d   pCsr;.        m
1b840 65 6d 63 70 79 28 70 2d 3e 7a 53 74 61 74 65 2c  emcpy(p->zState,
1b850 20 7a 53 74 61 74 65 2c 20 6e 53 74 61 74 65 2b   zState, nState+
1b860 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1);.      }.    
1b870 20 20 72 62 75 4f 70 65 6e 44 61 74 61 62 61 73    rbuOpenDatabas
1b880 65 28 70 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  e(p);.    }..   
1b890 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
1b8a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
1b8b0 53 74 61 74 65 20 3d 20 72 62 75 4c 6f 61 64 53  State = rbuLoadS
1b8c0 74 61 74 65 28 70 29 3b 0a 20 20 20 20 20 20 61  tate(p);.      a
1b8d0 73 73 65 72 74 28 20 70 53 74 61 74 65 20 7c 7c  ssert( pState ||
1b8e0 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f   p->rc!=SQLITE_O
1b8f0 4b 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  K );.      if( p
1b900 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
1b910 29 7b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20  ){..        if( 
1b920 70 53 74 61 74 65 2d 3e 65 53 74 61 67 65 3d 3d  pState->eStage==
1b930 30 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20  0 ){ .          
1b940 72 62 75 44 65 6c 65 74 65 4f 61 6c 46 69 6c 65  rbuDeleteOalFile
1b950 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  (p);.          r
1b960 62 75 49 6e 69 74 50 68 61 73 65 4f 6e 65 53 74  buInitPhaseOneSt
1b970 65 70 73 28 70 29 3b 0a 20 20 20 20 20 20 20 20  eps(p);.        
1b980 20 20 70 2d 3e 65 53 74 61 67 65 20 3d 20 52 42    p->eStage = RB
1b990 55 5f 53 54 41 47 45 5f 4f 41 4c 3b 0a 20 20 20  U_STAGE_OAL;.   
1b9a0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1b9b0 20 20 20 20 20 20 70 2d 3e 65 53 74 61 67 65 20        p->eStage 
1b9c0 3d 20 70 53 74 61 74 65 2d 3e 65 53 74 61 67 65  = pState->eStage
1b9d0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e  ;.          p->n
1b9e0 50 68 61 73 65 4f 6e 65 53 74 65 70 20 3d 20 70  PhaseOneStep = p
1b9f0 53 74 61 74 65 2d 3e 6e 50 68 61 73 65 4f 6e 65  State->nPhaseOne
1ba00 53 74 65 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Step;.        }.
1ba10 20 20 20 20 20 20 20 20 70 2d 3e 6e 50 72 6f 67          p->nProg
1ba20 72 65 73 73 20 3d 20 70 53 74 61 74 65 2d 3e 6e  ress = pState->n
1ba30 50 72 6f 67 72 65 73 73 3b 0a 20 20 20 20 20 20  Progress;.      
1ba40 20 20 70 2d 3e 69 4f 61 6c 53 7a 20 3d 20 70 53    p->iOalSz = pS
1ba50 74 61 74 65 2d 3e 69 4f 61 6c 53 7a 3b 0a 20 20  tate->iOalSz;.  
1ba60 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1ba70 61 73 73 65 72 74 28 20 70 2d 3e 72 63 21 3d 53  assert( p->rc!=S
1ba80 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 65  QLITE_OK || p->e
1ba90 53 74 61 67 65 21 3d 30 20 29 3b 0a 0a 20 20 20  Stage!=0 );..   
1baa0 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
1bab0 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 70 54 61 72  TE_OK && p->pTar
1bac0 67 65 74 46 64 2d 3e 70 57 61 6c 46 64 20 29 7b  getFd->pWalFd ){
1bad0 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65 53  .      if( p->eS
1bae0 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f  tage==RBU_STAGE_
1baf0 4f 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 70  OAL ){.        p
1bb00 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52  ->rc = SQLITE_ER
1bb10 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  ROR;.        p->
1bb20 7a 45 72 72 6d 73 67 20 3d 20 73 71 6c 69 74 65  zErrmsg = sqlite
1bb30 33 5f 6d 70 72 69 6e 74 66 28 22 63 61 6e 6e 6f  3_mprintf("canno
1bb40 74 20 75 70 64 61 74 65 20 77 61 6c 20 6d 6f 64  t update wal mod
1bb50 65 20 64 61 74 61 62 61 73 65 22 29 3b 0a 20 20  e database");.  
1bb60 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d      }else if( p-
1bb70 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41  >eStage==RBU_STA
1bb80 47 45 5f 4d 4f 56 45 20 29 7b 0a 20 20 20 20 20  GE_MOVE ){.     
1bb90 20 20 20 70 2d 3e 65 53 74 61 67 65 20 3d 20 52     p->eStage = R
1bba0 42 55 5f 53 54 41 47 45 5f 43 4b 50 54 3b 0a 20  BU_STAGE_CKPT;. 
1bbb0 20 20 20 20 20 20 20 70 2d 3e 6e 53 74 65 70 20         p->nStep 
1bbc0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
1bbd0 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 72   }..    if( p->r
1bbe0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a 20 20  c==SQLITE_OK .  
1bbf0 20 20 20 26 26 20 28 70 2d 3e 65 53 74 61 67 65     && (p->eStage
1bc00 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20  ==RBU_STAGE_OAL 
1bc10 7c 7c 20 70 2d 3e 65 53 74 61 67 65 3d 3d 52 42  || p->eStage==RB
1bc20 55 5f 53 54 41 47 45 5f 4d 4f 56 45 29 0a 20 20  U_STAGE_MOVE).  
1bc30 20 20 20 26 26 20 70 53 74 61 74 65 2d 3e 65 53     && pState->eS
1bc40 74 61 67 65 21 3d 30 0a 20 20 20 20 29 7b 0a 20  tage!=0.    ){. 
1bc50 20 20 20 20 20 72 62 75 5f 66 69 6c 65 20 2a 70       rbu_file *p
1bc60 46 64 20 3d 20 28 72 62 75 49 73 56 61 63 75 75  Fd = (rbuIsVacuu
1bc70 6d 28 70 29 20 3f 20 70 2d 3e 70 52 62 75 46 64  m(p) ? p->pRbuFd
1bc80 20 3a 20 70 2d 3e 70 54 61 72 67 65 74 46 64 29   : p->pTargetFd)
1bc90 3b 0a 20 20 20 20 20 20 69 66 28 20 70 46 64 2d  ;.      if( pFd-
1bca0 3e 69 43 6f 6f 6b 69 65 21 3d 70 53 74 61 74 65  >iCookie!=pState
1bcb0 2d 3e 69 43 6f 6f 6b 69 65 20 29 7b 20 20 20 0a  ->iCookie ){   .
1bcc0 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20 74 68          /* At th
1bcd0 69 73 20 70 6f 69 6e 74 20 28 70 54 61 72 67 65  is point (pTarge
1bce0 74 46 64 2d 3e 69 43 6f 6f 6b 69 65 29 20 63 6f  tFd->iCookie) co
1bcf0 6e 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75 65  ntains the value
1bd00 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20   of the.        
1bd10 2a 2a 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  ** change-counte
1bd20 72 20 63 6f 6f 6b 69 65 20 28 74 68 65 20 74 68  r cookie (the th
1bd30 69 6e 67 20 74 68 61 74 20 67 65 74 73 20 69 6e  ing that gets in
1bd40 63 72 65 6d 65 6e 74 65 64 20 77 68 65 6e 20 61  cremented when a
1bd50 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 61   .        ** tra
1bd60 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
1bd70 69 74 74 65 64 20 69 6e 20 72 6f 6c 6c 62 61 63  itted in rollbac
1bd80 6b 20 6d 6f 64 65 29 20 63 75 72 72 65 6e 74 6c  k mode) currentl
1bd90 79 20 73 74 6f 72 65 64 20 6f 6e 20 0a 20 20 20  y stored on .   
1bda0 20 20 20 20 20 2a 2a 20 70 61 67 65 20 31 20 6f       ** page 1 o
1bdb0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
1bdc0 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ile. */.        
1bdd0 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 42  p->rc = SQLITE_B
1bde0 55 53 59 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  USY;.        p->
1bdf0 7a 45 72 72 6d 73 67 20 3d 20 73 71 6c 69 74 65  zErrmsg = sqlite
1be00 33 5f 6d 70 72 69 6e 74 66 28 22 64 61 74 61 62  3_mprintf("datab
1be10 61 73 65 20 6d 6f 64 69 66 69 65 64 20 64 75 72  ase modified dur
1be20 69 6e 67 20 72 62 75 20 25 73 22 2c 0a 20 20 20  ing rbu %s",.   
1be30 20 20 20 20 20 20 20 20 20 28 72 62 75 49 73 56           (rbuIsV
1be40 61 63 75 75 6d 28 70 29 20 3f 20 22 76 61 63 75  acuum(p) ? "vacu
1be50 75 6d 22 20 3a 20 22 75 70 64 61 74 65 22 29 0a  um" : "update").
1be60 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
1be70 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66   }.    }..    if
1be80 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
1be90 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  OK ){.      if( 
1bea0 70 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53  p->eStage==RBU_S
1beb0 54 41 47 45 5f 4f 41 4c 20 29 7b 0a 20 20 20 20  TAGE_OAL ){.    
1bec0 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
1bed0 3d 20 70 2d 3e 64 62 4d 61 69 6e 3b 0a 0a 20 20  = p->dbMain;..  
1bee0 20 20 20 20 20 20 69 66 28 20 70 53 74 61 74 65        if( pState
1bef0 2d 3e 65 53 74 61 67 65 3d 3d 30 20 26 26 20 72  ->eStage==0 && r
1bf00 62 75 49 73 56 61 63 75 75 6d 28 70 29 20 29 7b  buIsVacuum(p) ){
1bf10 0a 20 20 20 20 20 20 20 20 20 20 72 62 75 43 6f  .          rbuCo
1bf20 70 79 50 72 61 67 6d 61 28 70 2c 20 22 70 61 67  pyPragma(p, "pag
1bf30 65 5f 73 69 7a 65 22 29 3b 0a 20 20 20 20 20 20  e_size");.      
1bf40 20 20 20 20 72 62 75 43 6f 70 79 50 72 61 67 6d      rbuCopyPragm
1bf50 61 28 70 2c 20 22 61 75 74 6f 5f 76 61 63 75 75  a(p, "auto_vacuu
1bf60 6d 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  m");.        }..
1bf70 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20          /* Open 
1bf80 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 62 6f 74  transactions bot
1bf90 68 20 64 61 74 61 62 61 73 65 73 2e 20 54 68 65  h databases. The
1bfa0 20 2a 2d 6f 61 6c 20 66 69 6c 65 20 69 73 20 6f   *-oal file is o
1bfb0 70 65 6e 65 64 20 6f 72 0a 20 20 20 20 20 20 20  pened or.       
1bfc0 20 2a 2a 20 63 72 65 61 74 65 64 20 61 74 20 74   ** created at t
1bfd0 68 69 73 20 70 6f 69 6e 74 2e 20 2a 2f 0a 20 20  his point. */.  
1bfe0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
1bff0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1c000 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
1c010 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c  sqlite3_exec(db,
1c020 20 22 42 45 47 49 4e 20 49 4d 4d 45 44 49 41 54   "BEGIN IMMEDIAT
1c030 45 22 2c 20 30 2c 20 30 2c 20 26 70 2d 3e 7a 45  E", 0, 0, &p->zE
1c040 72 72 6d 73 67 29 3b 0a 20 20 20 20 20 20 20 20  rrmsg);.        
1c050 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  }.        if( p-
1c060 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
1c070 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72  {.          p->r
1c080 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  c = sqlite3_exec
1c090 28 70 2d 3e 64 62 52 62 75 2c 20 22 42 45 47 49  (p->dbRbu, "BEGI
1c0a0 4e 22 2c 20 30 2c 20 30 2c 20 26 70 2d 3e 7a 45  N", 0, 0, &p->zE
1c0b0 72 72 6d 73 67 29 3b 0a 20 20 20 20 20 20 20 20  rrmsg);.        
1c0c0 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68  }..        /* Ch
1c0d0 65 63 6b 20 69 66 20 74 68 65 20 6d 61 69 6e 20  eck if the main 
1c0e0 64 61 74 61 62 61 73 65 20 69 73 20 61 20 7a 69  database is a zi
1c0f0 70 76 66 73 20 64 62 2e 20 49 66 20 69 74 20 69  pvfs db. If it i
1c100 73 2c 20 73 65 74 20 74 68 65 20 75 70 70 65 72  s, set the upper
1c110 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 65 76 65  .        ** leve
1c120 6c 20 70 61 67 65 72 20 74 6f 20 75 73 65 20 22  l pager to use "
1c130 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6f 66 66  journal_mode=off
1c140 22 2e 20 54 68 69 73 20 70 72 65 76 65 6e 74 73  ". This prevents
1c150 20 69 74 20 66 72 6f 6d 20 0a 20 20 20 20 20 20   it from .      
1c160 20 20 2a 2a 20 67 65 6e 65 72 61 74 69 6e 67 20    ** generating 
1c170 61 20 6c 61 72 67 65 20 6a 6f 75 72 6e 61 6c 20  a large journal 
1c180 75 73 69 6e 67 20 61 20 74 65 6d 70 20 66 69 6c  using a temp fil
1c190 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  e.  */.        i
1c1a0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
1c1b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1c1c0 20 69 6e 74 20 66 72 63 20 3d 20 73 71 6c 69 74   int frc = sqlit
1c1d0 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28  e3_file_control(
1c1e0 64 62 2c 20 22 6d 61 69 6e 22 2c 20 53 51 4c 49  db, "main", SQLI
1c1f0 54 45 5f 46 43 4e 54 4c 5f 5a 49 50 56 46 53 2c  TE_FCNTL_ZIPVFS,
1c200 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69   0);.          i
1c210 66 28 20 66 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  f( frc==SQLITE_O
1c220 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
1c230 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33   p->rc = sqlite3
1c240 5f 65 78 65 63 28 64 62 2c 20 22 50 52 41 47 4d  _exec(db, "PRAGM
1c250 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6f  A journal_mode=o
1c260 66 66 22 2c 30 2c 30 2c 26 70 2d 3e 7a 45 72 72  ff",0,0,&p->zErr
1c270 6d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  msg);.          
1c280 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  }.        }..   
1c290 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20       /* If this 
1c2a0 69 73 20 61 6e 20 52 42 55 20 76 61 63 75 75 6d  is an RBU vacuum
1c2b0 20 6f 70 65 72 61 74 69 6f 6e 20 61 6e 64 20 74   operation and t
1c2c0 68 65 20 73 74 61 74 65 20 74 61 62 6c 65 20 77  he state table w
1c2d0 61 73 20 65 6d 70 74 79 0a 20 20 20 20 20 20 20  as empty.       
1c2e0 20 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 68 61   ** when this ha
1c2f0 6e 64 6c 65 20 77 61 73 20 6f 70 65 6e 65 64 2c  ndle was opened,
1c300 20 63 72 65 61 74 65 20 74 68 65 20 74 61 72 67   create the targ
1c310 65 74 20 64 61 74 61 62 61 73 65 20 73 63 68 65  et database sche
1c320 6d 61 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ma. */.        i
1c330 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
1c340 5f 4f 4b 20 26 26 20 70 53 74 61 74 65 2d 3e 65  _OK && pState->e
1c350 53 74 61 67 65 3d 3d 30 20 26 26 20 72 62 75 49  Stage==0 && rbuI
1c360 73 56 61 63 75 75 6d 28 70 29 20 29 7b 0a 20 20  sVacuum(p) ){.  
1c370 20 20 20 20 20 20 20 20 72 62 75 43 72 65 61 74          rbuCreat
1c380 65 54 61 72 67 65 74 53 63 68 65 6d 61 28 70 29  eTargetSchema(p)
1c390 3b 0a 20 20 20 20 20 20 20 20 20 20 72 62 75 43  ;.          rbuC
1c3a0 6f 70 79 50 72 61 67 6d 61 28 70 2c 20 22 75 73  opyPragma(p, "us
1c3b0 65 72 5f 76 65 72 73 69 6f 6e 22 29 3b 0a 20 20  er_version");.  
1c3c0 20 20 20 20 20 20 20 20 72 62 75 43 6f 70 79 50          rbuCopyP
1c3d0 72 61 67 6d 61 28 70 2c 20 22 61 70 70 6c 69 63  ragma(p, "applic
1c3e0 61 74 69 6f 6e 5f 69 64 22 29 3b 0a 20 20 20 20  ation_id");.    
1c3f0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
1c400 2a 20 50 6f 69 6e 74 20 74 68 65 20 6f 62 6a 65  * Point the obje
1c410 63 74 20 69 74 65 72 61 74 6f 72 20 61 74 20 74  ct iterator at t
1c420 68 65 20 66 69 72 73 74 20 6f 62 6a 65 63 74 20  he first object 
1c430 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  */.        if( p
1c440 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
1c450 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ){.          p->
1c460 72 63 20 3d 20 72 62 75 4f 62 6a 49 74 65 72 46  rc = rbuObjIterF
1c470 69 72 73 74 28 70 2c 20 26 70 2d 3e 6f 62 6a 69  irst(p, &p->obji
1c480 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ter);.        }.
1c490 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74  .        /* If t
1c4a0 68 65 20 52 42 55 20 64 61 74 61 62 61 73 65 20  he RBU database 
1c4b0 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74 61  contains no data
1c4c0 5f 78 78 78 20 74 61 62 6c 65 73 2c 20 64 65 63  _xxx tables, dec
1c4d0 6c 61 72 65 20 74 68 65 20 52 42 55 0a 20 20 20  lare the RBU.   
1c4e0 20 20 20 20 20 2a 2a 20 75 70 64 61 74 65 20 66       ** update f
1c4f0 69 6e 69 73 68 65 64 2e 20 20 2a 2f 0a 20 20 20  inished.  */.   
1c500 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
1c510 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e  SQLITE_OK && p->
1c520 6f 62 6a 69 74 65 72 2e 7a 54 62 6c 3d 3d 30 20  objiter.zTbl==0 
1c530 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ){.          p->
1c540 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
1c550 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
1c560 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
1c570 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1c580 20 20 20 20 20 20 20 72 62 75 53 65 74 75 70 4f         rbuSetupO
1c590 61 6c 28 70 2c 20 70 53 74 61 74 65 29 3b 0a 20  al(p, pState);. 
1c5a0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
1c5b0 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 65 53 74  }else if( p->eSt
1c5c0 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4d  age==RBU_STAGE_M
1c5d0 4f 56 45 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  OVE ){.        /
1c5e0 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20  * no-op */.     
1c5f0 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 65 53   }else if( p->eS
1c600 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f  tage==RBU_STAGE_
1c610 43 4b 50 54 20 29 7b 0a 20 20 20 20 20 20 20 20  CKPT ){.        
1c620 72 62 75 53 65 74 75 70 43 68 65 63 6b 70 6f 69  rbuSetupCheckpoi
1c630 6e 74 28 70 2c 20 70 53 74 61 74 65 29 3b 0a 20  nt(p, pState);. 
1c640 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
1c650 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54  ->eStage==RBU_ST
1c660 41 47 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  AGE_DONE ){.    
1c670 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
1c680 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20 7d  TE_DONE;.      }
1c690 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 2d  else{.        p-
1c6a0 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52  >rc = SQLITE_COR
1c6b0 52 55 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RUPT;.      }.  
1c6c0 20 20 7d 0a 0a 20 20 20 20 72 62 75 46 72 65 65    }..    rbuFree
1c6d0 53 74 61 74 65 28 70 53 74 61 74 65 29 3b 0a 20  State(pState);. 
1c6e0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a   }..  return p;.
1c6f0 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 6e  }../*.** Open an
1c700 64 20 72 65 74 75 72 6e 20 61 20 6e 65 77 20 52  d return a new R
1c710 42 55 20 68 61 6e 64 6c 65 2e 20 0a 2a 2f 0a 73  BU handle. .*/.s
1c720 71 6c 69 74 65 33 72 62 75 20 2a 73 71 6c 69 74  qlite3rbu *sqlit
1c730 65 33 72 62 75 5f 6f 70 65 6e 28 0a 20 20 63 6f  e3rbu_open(.  co
1c740 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 72 67 65  nst char *zTarge
1c750 74 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  t, .  const char
1c760 20 2a 7a 52 62 75 2c 0a 20 20 63 6f 6e 73 74 20   *zRbu,.  const 
1c770 63 68 61 72 20 2a 7a 53 74 61 74 65 0a 29 7b 0a  char *zState.){.
1c780 20 20 2f 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b    /* TODO: Check
1c790 20 74 68 61 74 20 7a 54 61 72 67 65 74 20 61 6e   that zTarget an
1c7a0 64 20 7a 52 62 75 20 61 72 65 20 6e 6f 6e 2d 4e  d zRbu are non-N
1c7b0 55 4c 4c 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ULL */.  return 
1c7c0 6f 70 65 6e 52 62 75 48 61 6e 64 6c 65 28 7a 54  openRbuHandle(zT
1c7d0 61 72 67 65 74 2c 20 7a 52 62 75 2c 20 7a 53 74  arget, zRbu, zSt
1c7e0 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  ate);.}../*.** O
1c7f0 70 65 6e 20 61 20 68 61 6e 64 6c 65 20 74 6f 20  pen a handle to 
1c800 62 65 67 69 6e 20 6f 72 20 72 65 73 75 6d 65 20  begin or resume 
1c810 61 6e 20 52 42 55 20 56 41 43 55 55 4d 20 6f 70  an RBU VACUUM op
1c820 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 71 6c 69  eration..*/.sqli
1c830 74 65 33 72 62 75 20 2a 73 71 6c 69 74 65 33 72  te3rbu *sqlite3r
1c840 62 75 5f 76 61 63 75 75 6d 28 0a 20 20 63 6f 6e  bu_vacuum(.  con
1c850 73 74 20 63 68 61 72 20 2a 7a 54 61 72 67 65 74  st char *zTarget
1c860 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  , .  const char 
1c870 2a 7a 53 74 61 74 65 0a 29 7b 0a 20 20 2f 2a 20  *zState.){.  /* 
1c880 54 4f 44 4f 3a 20 43 68 65 63 6b 20 74 68 61 74  TODO: Check that
1c890 20 62 6f 74 68 20 61 72 67 75 6d 65 6e 74 73 20   both arguments 
1c8a0 61 72 65 20 6e 6f 6e 2d 4e 55 4c 4c 20 2a 2f 0a  are non-NULL */.
1c8b0 20 20 72 65 74 75 72 6e 20 6f 70 65 6e 52 62 75    return openRbu
1c8c0 48 61 6e 64 6c 65 28 30 2c 20 7a 54 61 72 67 65  Handle(0, zTarge
1c8d0 74 2c 20 7a 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f  t, zState);.}../
1c8e0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1c8f0 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
1c900 75 73 65 64 20 62 79 20 70 52 62 75 2e 0a 2a 2f  used by pRbu..*/
1c910 0a 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65  .sqlite3 *sqlite
1c920 33 72 62 75 5f 64 62 28 73 71 6c 69 74 65 33 72  3rbu_db(sqlite3r
1c930 62 75 20 2a 70 52 62 75 2c 20 69 6e 74 20 62 52  bu *pRbu, int bR
1c940 62 75 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  bu){.  sqlite3 *
1c950 64 62 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 52  db = 0;.  if( pR
1c960 62 75 20 29 7b 0a 20 20 20 20 64 62 20 3d 20 28  bu ){.    db = (
1c970 62 52 62 75 20 3f 20 70 52 62 75 2d 3e 64 62 52  bRbu ? pRbu->dbR
1c980 62 75 20 3a 20 70 52 62 75 2d 3e 64 62 4d 61 69  bu : pRbu->dbMai
1c990 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  n);.  }.  return
1c9a0 20 64 62 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49   db;.}.../*.** I
1c9b0 66 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  f the error code
1c9c0 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65   currently store
1c9d0 64 20 69 6e 20 74 68 65 20 52 42 55 20 68 61 6e  d in the RBU han
1c9e0 64 6c 65 20 69 73 20 53 51 4c 49 54 45 5f 43 4f  dle is SQLITE_CO
1c9f0 4e 53 54 52 41 49 4e 54 2c 0a 2a 2a 20 74 68 65  NSTRAINT,.** the
1ca00 6e 20 65 64 69 74 20 61 6e 79 20 65 72 72 6f 72  n edit any error
1ca10 20 6d 65 73 73 61 67 65 20 73 74 72 69 6e 67 20   message string 
1ca20 73 6f 20 61 73 20 74 6f 20 72 65 6d 6f 76 65 20  so as to remove 
1ca30 61 6c 6c 20 6f 63 63 75 72 72 65 6e 63 65 73 20  all occurrences 
1ca40 6f 66 0a 2a 2a 20 74 68 65 20 70 61 74 74 65 72  of.** the patter
1ca50 6e 20 22 72 62 75 5f 69 6d 70 5f 5b 30 2d 39 5d  n "rbu_imp_[0-9]
1ca60 2a 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  *"..*/.static vo
1ca70 69 64 20 72 62 75 45 64 69 74 45 72 72 6d 73 67  id rbuEditErrmsg
1ca80 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 29 7b  (sqlite3rbu *p){
1ca90 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
1caa0 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20  LITE_CONSTRAINT 
1cab0 26 26 20 70 2d 3e 7a 45 72 72 6d 73 67 20 29 7b  && p->zErrmsg ){
1cac0 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  .    unsigned in
1cad0 74 20 69 3b 0a 20 20 20 20 73 69 7a 65 5f 74 20  t i;.    size_t 
1cae0 6e 45 72 72 6d 73 67 20 3d 20 73 74 72 6c 65 6e  nErrmsg = strlen
1caf0 28 70 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a 20 20  (p->zErrmsg);.  
1cb00 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 28 6e 45    for(i=0; i<(nE
1cb10 72 72 6d 73 67 2d 38 29 3b 20 69 2b 2b 29 7b 0a  rrmsg-8); i++){.
1cb20 20 20 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70        if( memcmp
1cb30 28 26 70 2d 3e 7a 45 72 72 6d 73 67 5b 69 5d 2c  (&p->zErrmsg[i],
1cb40 20 22 72 62 75 5f 69 6d 70 5f 22 2c 20 38 29 3d   "rbu_imp_", 8)=
1cb50 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  =0 ){.        in
1cb60 74 20 6e 44 65 6c 20 3d 20 38 3b 0a 20 20 20 20  t nDel = 8;.    
1cb70 20 20 20 20 77 68 69 6c 65 28 20 70 2d 3e 7a 45      while( p->zE
1cb80 72 72 6d 73 67 5b 69 2b 6e 44 65 6c 5d 3e 3d 27  rrmsg[i+nDel]>='
1cb90 30 27 20 26 26 20 70 2d 3e 7a 45 72 72 6d 73 67  0' && p->zErrmsg
1cba0 5b 69 2b 6e 44 65 6c 5d 3c 3d 27 39 27 20 29 20  [i+nDel]<='9' ) 
1cbb0 6e 44 65 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nDel++;.        
1cbc0 6d 65 6d 6d 6f 76 65 28 26 70 2d 3e 7a 45 72 72  memmove(&p->zErr
1cbd0 6d 73 67 5b 69 5d 2c 20 26 70 2d 3e 7a 45 72 72  msg[i], &p->zErr
1cbe0 6d 73 67 5b 69 2b 6e 44 65 6c 5d 2c 20 6e 45 72  msg[i+nDel], nEr
1cbf0 72 6d 73 67 20 2b 20 31 20 2d 20 69 20 2d 20 6e  rmsg + 1 - i - n
1cc00 44 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 6e 45  Del);.        nE
1cc10 72 72 6d 73 67 20 2d 3d 20 6e 44 65 6c 3b 0a 20  rrmsg -= nDel;. 
1cc20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1cc30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
1cc40 74 68 65 20 52 42 55 20 68 61 6e 64 6c 65 2e 0a  the RBU handle..
1cc50 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 72 62  */.int sqlite3rb
1cc60 75 5f 63 6c 6f 73 65 28 73 71 6c 69 74 65 33 72  u_close(sqlite3r
1cc70 62 75 20 2a 70 2c 20 63 68 61 72 20 2a 2a 70 7a  bu *p, char **pz
1cc80 45 72 72 6d 73 67 29 7b 0a 20 20 69 6e 74 20 72  Errmsg){.  int r
1cc90 63 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 0a 20  c;.  if( p ){.. 
1cca0 20 20 20 2f 2a 20 43 6f 6d 6d 69 74 20 74 68 65     /* Commit the
1ccb0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20   transaction to 
1ccc0 74 68 65 20 2a 2d 6f 61 6c 20 66 69 6c 65 2e 20  the *-oal file. 
1ccd0 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  */.    if( p->rc
1cce0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
1ccf0 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54  ->eStage==RBU_ST
1cd00 41 47 45 5f 4f 41 4c 20 29 7b 0a 20 20 20 20 20  AGE_OAL ){.     
1cd10 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33   p->rc = sqlite3
1cd20 5f 65 78 65 63 28 70 2d 3e 64 62 4d 61 69 6e 2c  _exec(p->dbMain,
1cd30 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 2c   "COMMIT", 0, 0,
1cd40 20 26 70 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a 20   &p->zErrmsg);. 
1cd50 20 20 20 7d 0a 0a 20 20 20 20 72 62 75 53 61 76     }..    rbuSav
1cd60 65 53 74 61 74 65 28 70 2c 20 70 2d 3e 65 53 74  eState(p, p->eSt
1cd70 61 67 65 29 3b 0a 0a 20 20 20 20 69 66 28 20 70  age);..    if( p
1cd80 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
1cd90 26 26 20 70 2d 3e 65 53 74 61 67 65 3d 3d 52 42  && p->eStage==RB
1cda0 55 5f 53 54 41 47 45 5f 4f 41 4c 20 29 7b 0a 20  U_STAGE_OAL ){. 
1cdb0 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c       p->rc = sql
1cdc0 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 52  ite3_exec(p->dbR
1cdd0 62 75 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c  bu, "COMMIT", 0,
1cde0 20 30 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 29   0, &p->zErrmsg)
1cdf0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1ce00 43 6c 6f 73 65 20 61 6e 79 20 6f 70 65 6e 20 73  Close any open s
1ce10 74 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65 73  tatement handles
1ce20 2e 20 2a 2f 0a 20 20 20 20 72 62 75 4f 62 6a 49  . */.    rbuObjI
1ce30 74 65 72 46 69 6e 61 6c 69 7a 65 28 26 70 2d 3e  terFinalize(&p->
1ce40 6f 62 6a 69 74 65 72 29 3b 0a 0a 20 20 20 20 2f  objiter);..    /
1ce50 2a 20 43 6c 6f 73 65 20 74 68 65 20 6f 70 65 6e  * Close the open
1ce60 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
1ce70 20 61 6e 64 20 56 46 53 20 6f 62 6a 65 63 74 2e   and VFS object.
1ce80 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   */.    sqlite3_
1ce90 63 6c 6f 73 65 28 70 2d 3e 64 62 52 62 75 29 3b  close(p->dbRbu);
1cea0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f  .    sqlite3_clo
1ceb0 73 65 28 70 2d 3e 64 62 4d 61 69 6e 29 3b 0a 20  se(p->dbMain);. 
1cec0 20 20 20 72 62 75 44 65 6c 65 74 65 56 66 73 28     rbuDeleteVfs(
1ced0 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  p);.    sqlite3_
1cee0 66 72 65 65 28 70 2d 3e 61 42 75 66 29 3b 0a 20  free(p->aBuf);. 
1cef0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1cf00 70 2d 3e 61 46 72 61 6d 65 29 3b 0a 0a 20 20 20  p->aFrame);..   
1cf10 20 72 62 75 45 64 69 74 45 72 72 6d 73 67 28 70   rbuEditErrmsg(p
1cf20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 2d 3e 72  );.    rc = p->r
1cf30 63 3b 0a 20 20 20 20 2a 70 7a 45 72 72 6d 73 67  c;.    *pzErrmsg
1cf40 20 3d 20 70 2d 3e 7a 45 72 72 6d 73 67 3b 0a 20   = p->zErrmsg;. 
1cf50 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1cf60 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  p);.  }else{.   
1cf70 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
1cf80 45 4d 3b 0a 20 20 20 20 2a 70 7a 45 72 72 6d 73  EM;.    *pzErrms
1cf90 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  g = 0;.  }.  ret
1cfa0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1cfb0 20 52 65 74 75 72 6e 20 74 68 65 20 74 6f 74 61   Return the tota
1cfc0 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6b 65 79 2d  l number of key-
1cfd0 76 61 6c 75 65 20 6f 70 65 72 61 74 69 6f 6e 73  value operations
1cfe0 20 28 69 6e 73 65 72 74 73 2c 20 64 65 6c 65 74   (inserts, delet
1cff0 65 73 20 6f 72 20 0a 2a 2a 20 75 70 64 61 74 65  es or .** update
1d000 73 29 20 74 68 61 74 20 68 61 76 65 20 62 65 65  s) that have bee
1d010 6e 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e 20 74  n performed on t
1d020 68 65 20 74 61 72 67 65 74 20 64 61 74 61 62 61  he target databa
1d030 73 65 20 73 69 6e 63 65 20 74 68 65 0a 2a 2a 20  se since the.** 
1d040 63 75 72 72 65 6e 74 20 52 42 55 20 75 70 64 61  current RBU upda
1d050 74 65 20 77 61 73 20 73 74 61 72 74 65 64 2e 0a  te was started..
1d060 2a 2f 0a 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  */.sqlite3_int64
1d070 20 73 71 6c 69 74 65 33 72 62 75 5f 70 72 6f 67   sqlite3rbu_prog
1d080 72 65 73 73 28 73 71 6c 69 74 65 33 72 62 75 20  ress(sqlite3rbu 
1d090 2a 70 52 62 75 29 7b 0a 20 20 72 65 74 75 72 6e  *pRbu){.  return
1d0a0 20 70 52 62 75 2d 3e 6e 50 72 6f 67 72 65 73 73   pRbu->nProgress
1d0b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1d0c0 6e 20 70 65 72 6d 79 72 69 61 64 61 67 65 20 70  n permyriadage p
1d0d0 72 6f 67 72 65 73 73 20 69 6e 64 69 63 61 74 69  rogress indicati
1d0e0 6f 6e 73 20 66 6f 72 20 74 68 65 20 74 77 6f 20  ons for the two 
1d0f0 6d 61 69 6e 20 73 74 61 67 65 73 20 6f 66 0a 2a  main stages of.*
1d100 2a 20 61 6e 20 52 42 55 20 75 70 64 61 74 65 2e  * an RBU update.
1d110 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1d120 72 62 75 5f 62 70 5f 70 72 6f 67 72 65 73 73 28  rbu_bp_progress(
1d130 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 69  sqlite3rbu *p, i
1d140 6e 74 20 2a 70 6e 4f 6e 65 2c 20 69 6e 74 20 2a  nt *pnOne, int *
1d150 70 6e 54 77 6f 29 7b 0a 20 20 63 6f 6e 73 74 20  pnTwo){.  const 
1d160 69 6e 74 20 4d 41 58 5f 50 52 4f 47 52 45 53 53  int MAX_PROGRESS
1d170 20 3d 20 31 30 30 30 30 3b 0a 20 20 73 77 69 74   = 10000;.  swit
1d180 63 68 28 20 70 2d 3e 65 53 74 61 67 65 20 29 7b  ch( p->eStage ){
1d190 0a 20 20 20 20 63 61 73 65 20 52 42 55 5f 53 54  .    case RBU_ST
1d1a0 41 47 45 5f 4f 41 4c 3a 0a 20 20 20 20 20 20 69  AGE_OAL:.      i
1d1b0 66 28 20 70 2d 3e 6e 50 68 61 73 65 4f 6e 65 53  f( p->nPhaseOneS
1d1c0 74 65 70 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  tep>0 ){.       
1d1d0 20 2a 70 6e 4f 6e 65 20 3d 20 28 69 6e 74 29 28   *pnOne = (int)(
1d1e0 4d 41 58 5f 50 52 4f 47 52 45 53 53 20 2a 20 28  MAX_PROGRESS * (
1d1f0 69 36 34 29 70 2d 3e 6e 50 72 6f 67 72 65 73 73  i64)p->nProgress
1d200 2f 28 69 36 34 29 70 2d 3e 6e 50 68 61 73 65 4f  /(i64)p->nPhaseO
1d210 6e 65 53 74 65 70 29 3b 0a 20 20 20 20 20 20 7d  neStep);.      }
1d220 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2a 70  else{.        *p
1d230 6e 4f 6e 65 20 3d 20 2d 31 3b 0a 20 20 20 20 20  nOne = -1;.     
1d240 20 7d 0a 20 20 20 20 20 20 2a 70 6e 54 77 6f 20   }.      *pnTwo 
1d250 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = 0;.      break
1d260 3b 0a 0a 20 20 20 20 63 61 73 65 20 52 42 55 5f  ;..    case RBU_
1d270 53 54 41 47 45 5f 4d 4f 56 45 3a 0a 20 20 20 20  STAGE_MOVE:.    
1d280 20 20 2a 70 6e 4f 6e 65 20 3d 20 4d 41 58 5f 50    *pnOne = MAX_P
1d290 52 4f 47 52 45 53 53 3b 0a 20 20 20 20 20 20 2a  ROGRESS;.      *
1d2a0 70 6e 54 77 6f 20 3d 20 30 3b 0a 20 20 20 20 20  pnTwo = 0;.     
1d2b0 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73   break;..    cas
1d2c0 65 20 52 42 55 5f 53 54 41 47 45 5f 43 4b 50 54  e RBU_STAGE_CKPT
1d2d0 3a 0a 20 20 20 20 20 20 2a 70 6e 4f 6e 65 20 3d  :.      *pnOne =
1d2e0 20 4d 41 58 5f 50 52 4f 47 52 45 53 53 3b 0a 20   MAX_PROGRESS;. 
1d2f0 20 20 20 20 20 2a 70 6e 54 77 6f 20 3d 20 28 69       *pnTwo = (i
1d300 6e 74 29 28 4d 41 58 5f 50 52 4f 47 52 45 53 53  nt)(MAX_PROGRESS
1d310 20 2a 20 28 69 36 34 29 70 2d 3e 6e 53 74 65 70   * (i64)p->nStep
1d320 20 2f 20 28 69 36 34 29 70 2d 3e 6e 46 72 61 6d   / (i64)p->nFram
1d330 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
1d340 0a 0a 20 20 20 20 63 61 73 65 20 52 42 55 5f 53  ..    case RBU_S
1d350 54 41 47 45 5f 44 4f 4e 45 3a 0a 20 20 20 20 20  TAGE_DONE:.     
1d360 20 2a 70 6e 4f 6e 65 20 3d 20 4d 41 58 5f 50 52   *pnOne = MAX_PR
1d370 4f 47 52 45 53 53 3b 0a 20 20 20 20 20 20 2a 70  OGRESS;.      *p
1d380 6e 54 77 6f 20 3d 20 4d 41 58 5f 50 52 4f 47 52  nTwo = MAX_PROGR
1d390 45 53 53 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ESS;.      break
1d3a0 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  ;..    default:.
1d3b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 30 20        assert( 0 
1d3c0 29 3b 0a 20 20 7d 0a 7d 0a 0a 69 6e 74 20 73 71  );.  }.}..int sq
1d3d0 6c 69 74 65 33 72 62 75 5f 73 61 76 65 73 74 61  lite3rbu_savesta
1d3e0 74 65 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70  te(sqlite3rbu *p
1d3f0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 2d  ){.  int rc = p-
1d400 3e 72 63 3b 0a 20 20 0a 20 20 69 66 28 20 72 63  >rc;.  .  if( rc
1d410 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 20  ==SQLITE_DONE ) 
1d420 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1d430 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ;..  assert( p->
1d440 65 53 74 61 67 65 3e 3d 52 42 55 5f 53 54 41 47  eStage>=RBU_STAG
1d450 45 5f 4f 41 4c 20 26 26 20 70 2d 3e 65 53 74 61  E_OAL && p->eSta
1d460 67 65 3c 3d 52 42 55 5f 53 54 41 47 45 5f 44 4f  ge<=RBU_STAGE_DO
1d470 4e 45 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 65  NE );.  if( p->e
1d480 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45  Stage==RBU_STAGE
1d490 5f 4f 41 4c 20 29 7b 0a 20 20 20 20 61 73 73 65  _OAL ){.    asse
1d4a0 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
1d4b0 4f 4e 45 20 29 3b 0a 20 20 20 20 69 66 28 20 72  ONE );.    if( r
1d4c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c==SQLITE_OK ) r
1d4d0 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  c = sqlite3_exec
1d4e0 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 43 4f 4d  (p->dbMain, "COM
1d4f0 4d 49 54 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  MIT", 0, 0, 0);.
1d500 20 20 7d 0a 0a 20 20 70 2d 3e 72 63 20 3d 20 72    }..  p->rc = r
1d510 63 3b 0a 20 20 72 62 75 53 61 76 65 53 74 61 74  c;.  rbuSaveStat
1d520 65 28 70 2c 20 70 2d 3e 65 53 74 61 67 65 29 3b  e(p, p->eStage);
1d530 0a 20 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 0a  .  rc = p->rc;..
1d540 20 20 69 66 28 20 70 2d 3e 65 53 74 61 67 65 3d    if( p->eStage=
1d550 3d 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20 29  =RBU_STAGE_OAL )
1d560 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  {.    assert( rc
1d570 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  !=SQLITE_DONE );
1d580 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1d590 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 73 71  ITE_OK ) rc = sq
1d5a0 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62  lite3_exec(p->db
1d5b0 52 62 75 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30  Rbu, "COMMIT", 0
1d5c0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 0, 0);.    if(
1d5d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1d5e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78   rc = sqlite3_ex
1d5f0 65 63 28 70 2d 3e 64 62 52 62 75 2c 20 22 42 45  ec(p->dbRbu, "BE
1d600 47 49 4e 20 49 4d 4d 45 44 49 41 54 45 22 2c 20  GIN IMMEDIATE", 
1d610 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  0, 0, 0);.    if
1d620 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1d630 29 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65  ) rc = sqlite3_e
1d640 78 65 63 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 22  xec(p->dbMain, "
1d650 42 45 47 49 4e 20 49 4d 4d 45 44 49 41 54 45 22  BEGIN IMMEDIATE"
1d660 2c 20 30 2c 20 30 2c 30 29 3b 0a 20 20 7d 0a 0a  , 0, 0,0);.  }..
1d670 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20    p->rc = rc;.  
1d680 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1d690 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1d6a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1d6b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1d6c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1d6d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 42 65 67  *********.** Beg
1d6e0 69 6e 6e 69 6e 67 20 6f 66 20 52 42 55 20 56 46  inning of RBU VF
1d6f0 53 20 73 68 69 6d 20 6d 65 74 68 6f 64 73 2e 20  S shim methods. 
1d700 54 68 65 20 56 46 53 20 73 68 69 6d 20 6d 6f 64  The VFS shim mod
1d710 69 66 69 65 73 20 74 68 65 20 62 65 68 61 76 69  ifies the behavi
1d720 6f 75 72 0a 2a 2a 20 6f 66 20 61 20 73 74 61 6e  our.** of a stan
1d730 64 61 72 64 20 56 46 53 20 69 6e 20 74 68 65 20  dard VFS in the 
1d740 66 6f 6c 6c 6f 77 69 6e 67 20 77 61 79 73 3a 0a  following ways:.
1d750 2a 2a 0a 2a 2a 20 31 2e 20 57 68 65 6e 65 76 65  **.** 1. Wheneve
1d760 72 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  r the first page
1d770 20 6f 66 20 61 20 6d 61 69 6e 20 64 61 74 61 62   of a main datab
1d780 61 73 65 20 66 69 6c 65 20 69 73 20 72 65 61 64  ase file is read
1d790 20 6f 72 20 0a 2a 2a 20 20 20 20 77 72 69 74 74   or .**    writt
1d7a0 65 6e 2c 20 74 68 65 20 76 61 6c 75 65 20 6f 66  en, the value of
1d7b0 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
1d7c0 74 65 72 20 63 6f 6f 6b 69 65 20 69 73 20 73 74  ter cookie is st
1d7d0 6f 72 65 64 20 69 6e 0a 2a 2a 20 20 20 20 72 62  ored in.**    rb
1d7e0 75 5f 66 69 6c 65 2e 69 43 6f 6f 6b 69 65 2e 20  u_file.iCookie. 
1d7f0 53 69 6d 69 6c 61 72 6c 79 2c 20 74 68 65 20 76  Similarly, the v
1d800 61 6c 75 65 20 6f 66 20 74 68 65 20 22 77 72 69  alue of the "wri
1d810 74 65 2d 76 65 72 73 69 6f 6e 22 0a 2a 2a 20 20  te-version".**  
1d820 20 20 64 61 74 61 62 61 73 65 20 68 65 61 64 65    database heade
1d830 72 20 66 69 65 6c 64 20 69 73 20 73 74 6f 72 65  r field is store
1d840 64 20 69 6e 20 72 62 75 5f 66 69 6c 65 2e 69 57  d in rbu_file.iW
1d850 72 69 74 65 56 65 72 2e 20 54 68 69 73 20 65 6e  riteVer. This en
1d860 73 75 72 65 73 0a 2a 2a 20 20 20 20 74 68 61 74  sures.**    that
1d870 20 74 68 65 20 76 61 6c 75 65 73 20 61 72 65 20   the values are 
1d880 61 6c 77 61 79 73 20 74 72 75 73 74 77 6f 72 74  always trustwort
1d890 68 79 20 77 69 74 68 69 6e 20 61 6e 20 6f 70 65  hy within an ope
1d8a0 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  n transaction..*
1d8b0 2a 0a 2a 2a 20 32 2e 20 57 68 65 6e 65 76 65 72  *.** 2. Whenever
1d8c0 20 61 6e 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   an SQLITE_OPEN_
1d8d0 57 41 4c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e  WAL file is open
1d8e0 65 64 2c 20 74 68 65 20 28 72 62 75 5f 66 69 6c  ed, the (rbu_fil
1d8f0 65 2e 70 57 61 6c 46 64 29 0a 2a 2a 20 20 20 20  e.pWalFd).**    
1d900 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c 65 20  member variable 
1d910 6f 66 20 74 68 65 20 61 73 73 6f 63 69 61 74 65  of the associate
1d920 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  d database file 
1d930 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 73 65  descriptor is se
1d940 74 0a 2a 2a 20 20 20 20 74 6f 20 70 6f 69 6e 74  t.**    to point
1d950 20 74 6f 20 74 68 65 20 6e 65 77 20 66 69 6c 65   to the new file
1d960 2e 20 41 20 6d 75 74 65 78 20 70 72 6f 74 65 63  . A mutex protec
1d970 74 65 64 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  ted linked list 
1d980 6f 66 20 61 6c 6c 20 6d 61 69 6e 20 0a 2a 2a 20  of all main .** 
1d990 20 20 20 64 62 20 66 64 73 20 6f 70 65 6e 65 64     db fds opened
1d9a0 20 75 73 69 6e 67 20 61 20 70 61 72 74 69 63 75   using a particu
1d9b0 6c 61 72 20 52 42 55 20 56 46 53 20 69 73 20 6d  lar RBU VFS is m
1d9c0 61 69 6e 74 61 69 6e 65 64 20 61 74 20 0a 2a 2a  aintained at .**
1d9d0 20 20 20 20 72 62 75 5f 76 66 73 2e 70 4d 61 69      rbu_vfs.pMai
1d9e0 6e 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65 20  n to facilitate 
1d9f0 74 68 69 73 2e 0a 2a 2a 0a 2a 2a 20 33 2e 20 55  this..**.** 3. U
1da00 73 69 6e 67 20 61 20 6e 65 77 20 66 69 6c 65 2d  sing a new file-
1da10 63 6f 6e 74 72 6f 6c 20 22 53 51 4c 49 54 45 5f  control "SQLITE_
1da20 46 43 4e 54 4c 5f 52 42 55 22 2c 20 61 20 6d 61  FCNTL_RBU", a ma
1da30 69 6e 20 64 62 20 72 62 75 5f 66 69 6c 65 20 0a  in db rbu_file .
1da40 2a 2a 20 20 20 20 6f 62 6a 65 63 74 20 63 61 6e  **    object can
1da50 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20 74 68   be marked as th
1da60 65 20 74 61 72 67 65 74 20 64 61 74 61 62 61 73  e target databas
1da70 65 20 6f 66 20 61 6e 20 52 42 55 20 75 70 64 61  e of an RBU upda
1da80 74 65 2e 20 54 68 69 73 0a 2a 2a 20 20 20 20 74  te. This.**    t
1da90 75 72 6e 73 20 6f 6e 20 74 68 65 20 66 6f 6c 6c  urns on the foll
1daa0 6f 77 69 6e 67 20 65 78 74 72 61 20 73 70 65 63  owing extra spec
1dab0 69 61 6c 20 62 65 68 61 76 69 6f 75 72 3a 0a 2a  ial behaviour:.*
1dac0 2a 0a 2a 2a 20 33 61 2e 20 49 66 20 78 41 63 63  *.** 3a. If xAcc
1dad0 65 73 73 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ess() is called 
1dae0 74 6f 20 63 68 65 63 6b 20 69 66 20 74 68 65 72  to check if ther
1daf0 65 20 65 78 69 73 74 73 20 61 20 2a 2d 77 61 6c  e exists a *-wal
1db00 20 66 69 6c 65 20 0a 2a 2a 20 20 20 20 20 61 73   file .**     as
1db10 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 6e  sociated with an
1db20 20 52 42 55 20 74 61 72 67 65 74 20 64 61 74 61   RBU target data
1db30 62 61 73 65 20 63 75 72 72 65 6e 74 6c 79 20 69  base currently i
1db40 6e 20 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 0a  n RBU_STAGE_OAL.
1db50 2a 2a 20 20 20 20 20 73 74 61 67 65 20 28 70 72  **     stage (pr
1db60 65 70 61 72 69 6e 67 20 74 68 65 20 2a 2d 6f 61  eparing the *-oa
1db70 6c 20 66 69 6c 65 29 2c 20 74 68 65 20 66 6f 6c  l file), the fol
1db80 6c 6f 77 69 6e 67 20 73 70 65 63 69 61 6c 20 68  lowing special h
1db90 61 6e 64 6c 69 6e 67 0a 2a 2a 20 20 20 20 20 61  andling.**     a
1dba0 70 70 6c 69 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  pplies:.**.**   
1dbb0 20 20 20 2a 20 69 66 20 74 68 65 20 2a 2d 77 61     * if the *-wa
1dbc0 6c 20 66 69 6c 65 20 64 6f 65 73 20 65 78 69 73  l file does exis
1dbd0 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  t, return SQLITE
1dbe0 5f 43 41 4e 54 4f 50 45 4e 2e 20 41 6e 20 52 42  _CANTOPEN. An RB
1dbf0 55 0a 2a 2a 20 20 20 20 20 20 20 20 74 61 72 67  U.**        targ
1dc00 65 74 20 64 61 74 61 62 61 73 65 20 6d 61 79 20  et database may 
1dc10 6e 6f 74 20 62 65 20 69 6e 20 77 61 6c 20 6d 6f  not be in wal mo
1dc20 64 65 20 61 6c 72 65 61 64 79 2e 0a 2a 2a 0a 2a  de already..**.*
1dc30 2a 20 20 20 20 20 20 2a 20 69 66 20 74 68 65 20  *      * if the 
1dc40 2a 2d 77 61 6c 20 66 69 6c 65 20 64 6f 65 73 20  *-wal file does 
1dc50 6e 6f 74 20 65 78 69 73 74 2c 20 73 65 74 20 74  not exist, set t
1dc60 68 65 20 6f 75 74 70 75 74 20 70 61 72 61 6d 65  he output parame
1dc70 74 65 72 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20  ter to.**       
1dc80 20 6e 6f 6e 2d 7a 65 72 6f 20 28 74 6f 20 74 65   non-zero (to te
1dc90 6c 6c 20 53 51 4c 69 74 65 20 74 68 61 74 20 69  ll SQLite that i
1dca0 74 20 64 6f 65 73 20 65 78 69 73 74 29 20 61 6e  t does exist) an
1dcb0 79 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  yway..**.**     
1dcc0 54 68 65 6e 2c 20 77 68 65 6e 20 78 4f 70 65 6e  Then, when xOpen
1dcd0 28 29 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  () is called to 
1dce0 6f 70 65 6e 20 74 68 65 20 2a 2d 77 61 6c 20 66  open the *-wal f
1dcf0 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ile associated w
1dd00 69 74 68 0a 2a 2a 20 20 20 20 20 74 68 65 20 52  ith.**     the R
1dd10 42 55 20 74 61 72 67 65 74 20 69 6e 20 52 42 55  BU target in RBU
1dd20 5f 53 54 41 47 45 5f 4f 41 4c 20 73 74 61 67 65  _STAGE_OAL stage
1dd30 2c 20 69 6e 73 74 65 61 64 20 6f 66 20 6f 70 65  , instead of ope
1dd40 6e 69 6e 67 20 74 68 65 20 2a 2d 77 61 6c 0a 2a  ning the *-wal.*
1dd50 2a 20 20 20 20 20 66 69 6c 65 2c 20 74 68 65 20  *     file, the 
1dd60 72 62 75 20 76 66 73 20 6f 70 65 6e 73 20 74 68  rbu vfs opens th
1dd70 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
1dd80 2a 2d 6f 61 6c 20 66 69 6c 65 20 69 6e 73 74 65  *-oal file inste
1dd90 61 64 2e 20 0a 2a 2a 0a 2a 2a 20 33 62 2e 20 54  ad. .**.** 3b. T
1dda0 68 65 20 2a 2d 73 68 6d 20 70 61 67 65 73 20 72  he *-shm pages r
1ddb0 65 74 75 72 6e 65 64 20 62 79 20 78 53 68 6d 4d  eturned by xShmM
1ddc0 61 70 28 29 20 66 6f 72 20 61 20 74 61 72 67 65  ap() for a targe
1ddd0 74 20 64 62 20 66 69 6c 65 20 69 6e 0a 2a 2a 20  t db file in.** 
1dde0 20 20 20 20 52 42 55 5f 53 54 41 47 45 5f 4f 41      RBU_STAGE_OA
1ddf0 4c 20 6d 6f 64 65 20 61 72 65 20 61 63 74 75 61  L mode are actua
1de00 6c 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 68 65  lly stored in he
1de10 61 70 20 6d 65 6d 6f 72 79 2e 20 54 68 69 73 20  ap memory. This 
1de20 69 73 20 74 6f 0a 2a 2a 20 20 20 20 20 61 76 6f  is to.**     avo
1de30 69 64 20 63 72 65 61 74 69 6e 67 20 61 20 2a 2d  id creating a *-
1de40 73 68 6d 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  shm file on disk
1de50 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20  . Additionally, 
1de60 78 53 68 6d 4c 6f 63 6b 28 29 20 63 61 6c 6c 73  xShmLock() calls
1de70 0a 2a 2a 20 20 20 20 20 61 72 65 20 6e 6f 2d 6f  .**     are no-o
1de80 70 73 20 6f 6e 20 74 61 72 67 65 74 20 64 61 74  ps on target dat
1de90 61 62 61 73 65 20 66 69 6c 65 73 20 69 6e 20 52  abase files in R
1dea0 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20 6d 6f 64  BU_STAGE_OAL mod
1deb0 65 2e 20 54 68 69 73 20 69 73 0a 2a 2a 20 20 20  e. This is.**   
1dec0 20 20 62 65 63 61 75 73 65 20 61 73 73 65 72 74    because assert
1ded0 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  () statements in
1dee0 20 73 6f 6d 65 20 56 46 53 20 69 6d 70 6c 65 6d   some VFS implem
1def0 65 6e 74 61 74 69 6f 6e 73 20 66 61 69 6c 20 69  entations fail i
1df00 66 20 0a 2a 2a 20 20 20 20 20 78 53 68 6d 4c 6f  f .**     xShmLo
1df10 63 6b 28 29 20 69 73 20 63 61 6c 6c 65 64 20 62  ck() is called b
1df20 65 66 6f 72 65 20 78 53 68 6d 4d 61 70 28 29 2e  efore xShmMap().
1df30 0a 2a 2a 0a 2a 2a 20 33 63 2e 20 49 66 20 61 6e  .**.** 3c. If an
1df40 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
1df50 69 73 20 61 74 74 65 6d 70 74 65 64 20 6f 6e 20  is attempted on 
1df60 61 20 74 61 72 67 65 74 20 64 61 74 61 62 61 73  a target databas
1df70 65 20 66 69 6c 65 20 69 6e 20 61 6e 79 0a 2a 2a  e file in any.**
1df80 20 20 20 20 20 6d 6f 64 65 20 65 78 63 65 70 74       mode except
1df90 20 52 42 55 5f 53 54 41 47 45 5f 44 4f 4e 45 20   RBU_STAGE_DONE 
1dfa0 28 61 6c 6c 20 77 6f 72 6b 20 63 6f 6d 70 6c 65  (all work comple
1dfb0 74 65 64 20 61 6e 64 20 63 68 65 63 6b 70 6f 69  ted and checkpoi
1dfc0 6e 74 65 64 29 2c 20 69 74 20 0a 2a 2a 20 20 20  nted), it .**   
1dfd0 20 20 66 61 69 6c 73 20 77 69 74 68 20 61 6e 20    fails with an 
1dfe0 53 51 4c 49 54 45 5f 42 55 53 59 20 65 72 72 6f  SQLITE_BUSY erro
1dff0 72 2e 20 54 68 69 73 20 69 73 20 74 6f 20 73 74  r. This is to st
1e000 6f 70 20 52 42 55 20 63 6f 6e 6e 65 63 74 69 6f  op RBU connectio
1e010 6e 73 0a 2a 2a 20 20 20 20 20 66 72 6f 6d 20 61  ns.**     from a
1e020 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 68 65  utomatically che
1e030 63 6b 70 6f 69 6e 74 69 6e 67 20 61 20 2a 2d 77  ckpointing a *-w
1e040 61 6c 20 28 6f 72 20 2a 2d 6f 61 6c 29 20 66 69  al (or *-oal) fi
1e050 6c 65 20 66 72 6f 6d 20 77 69 74 68 69 6e 0a 2a  le from within.*
1e060 2a 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c  *     sqlite3_cl
1e070 6f 73 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 33 64 2e  ose()..**.** 3d.
1e080 20 49 6e 20 52 42 55 5f 53 54 41 47 45 5f 43 41   In RBU_STAGE_CA
1e090 50 54 55 52 45 20 6d 6f 64 65 2c 20 61 6c 6c 20  PTURE mode, all 
1e0a0 78 52 65 61 64 28 29 20 63 61 6c 6c 73 20 6f 6e  xRead() calls on
1e0b0 20 74 68 65 20 77 61 6c 20 66 69 6c 65 2c 20 61   the wal file, a
1e0c0 6e 64 0a 2a 2a 20 20 20 20 20 61 6c 6c 20 78 57  nd.**     all xW
1e0d0 72 69 74 65 28 29 20 63 61 6c 6c 73 20 6f 6e 20  rite() calls on 
1e0e0 74 68 65 20 74 61 72 67 65 74 20 64 61 74 61 62  the target datab
1e0f0 61 73 65 20 66 69 6c 65 20 70 65 72 66 6f 72 6d  ase file perform
1e100 20 6e 6f 20 49 4f 2e 20 0a 2a 2a 20 20 20 20 20   no IO. .**     
1e110 49 6e 73 74 65 61 64 20 74 68 65 20 66 72 61 6d  Instead the fram
1e120 65 20 61 6e 64 20 70 61 67 65 20 6e 75 6d 62 65  e and page numbe
1e130 72 73 20 74 68 61 74 20 77 6f 75 6c 64 20 62 65  rs that would be
1e140 20 72 65 61 64 20 61 6e 64 20 77 72 69 74 74 65   read and writte
1e150 6e 0a 2a 2a 20 20 20 20 20 61 72 65 20 72 65 63  n.**     are rec
1e160 6f 72 64 65 64 2e 20 41 64 64 69 74 69 6f 6e 61  orded. Additiona
1e170 6c 6c 79 2c 20 73 75 63 63 65 73 73 66 75 6c 20  lly, successful 
1e180 61 74 74 65 6d 70 74 73 20 74 6f 20 6f 62 74 61  attempts to obta
1e190 69 6e 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20  in exclusive.** 
1e1a0 20 20 20 20 78 53 68 6d 4c 6f 63 6b 28 29 20 57      xShmLock() W
1e1b0 52 49 54 45 52 2c 20 43 48 45 43 4b 50 4f 49 4e  RITER, CHECKPOIN
1e1c0 54 45 52 20 61 6e 64 20 52 45 41 44 30 20 6c 6f  TER and READ0 lo
1e1d0 63 6b 73 20 6f 6e 20 74 68 65 20 74 61 72 67 65  cks on the targe
1e1e0 74 20 0a 2a 2a 20 20 20 20 20 64 61 74 61 62 61  t .**     databa
1e1f0 73 65 20 66 69 6c 65 20 61 72 65 20 72 65 63 6f  se file are reco
1e200 72 64 65 64 2e 20 78 53 68 6d 4c 6f 63 6b 28 29  rded. xShmLock()
1e210 20 63 61 6c 6c 73 20 74 6f 20 75 6e 6c 6f 63 6b   calls to unlock
1e220 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 20 20 20   the same.**    
1e230 20 6c 6f 63 6b 73 20 61 72 65 20 6e 6f 2d 6f 70   locks are no-op
1e240 73 20 28 73 6f 20 74 68 61 74 20 6f 6e 63 65 20  s (so that once 
1e250 6f 62 74 61 69 6e 65 64 2c 20 74 68 65 73 65 20  obtained, these 
1e260 6c 6f 63 6b 73 20 61 72 65 20 6e 65 76 65 72 0a  locks are never.
1e270 2a 2a 20 20 20 20 20 72 65 6c 69 6e 71 75 69 73  **     relinquis
1e280 68 65 64 29 2e 20 46 69 6e 61 6c 6c 79 2c 20 63  hed). Finally, c
1e290 61 6c 6c 73 20 74 6f 20 78 53 79 6e 63 28 29 20  alls to xSync() 
1e2a0 6f 6e 20 74 68 65 20 74 61 72 67 65 74 20 64 61  on the target da
1e2b0 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 66 69  tabase.**     fi
1e2c0 6c 65 20 66 61 69 6c 20 77 69 74 68 20 53 51 4c  le fail with SQL
1e2d0 49 54 45 5f 49 4e 54 45 52 4e 41 4c 20 65 72 72  ITE_INTERNAL err
1e2e0 6f 72 73 2e 0a 2a 2f 0a 0a 73 74 61 74 69 63 20  ors..*/..static 
1e2f0 76 6f 69 64 20 72 62 75 55 6e 6c 6f 63 6b 53 68  void rbuUnlockSh
1e300 6d 28 72 62 75 5f 66 69 6c 65 20 2a 70 29 7b 0a  m(rbu_file *p){.
1e310 20 20 69 66 28 20 70 2d 3e 70 52 62 75 20 29 7b    if( p->pRbu ){
1e320 0a 20 20 20 20 69 6e 74 20 28 2a 78 53 68 6d 4c  .    int (*xShmL
1e330 6f 63 6b 29 28 73 71 6c 69 74 65 33 5f 66 69 6c  ock)(sqlite3_fil
1e340 65 2a 2c 69 6e 74 2c 69 6e 74 2c 69 6e 74 29 20  e*,int,int,int) 
1e350 3d 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74  = p->pReal->pMet
1e360 68 6f 64 73 2d 3e 78 53 68 6d 4c 6f 63 6b 3b 0a  hods->xShmLock;.
1e370 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
1e380 6f 72 28 69 3d 30 3b 20 69 3c 53 51 4c 49 54 45  or(i=0; i<SQLITE
1e390 5f 53 48 4d 5f 4e 4c 4f 43 4b 3b 69 2b 2b 29 7b  _SHM_NLOCK;i++){
1e3a0 0a 20 20 20 20 20 20 69 66 28 20 28 31 3c 3c 69  .      if( (1<<i
1e3b0 29 20 26 20 70 2d 3e 70 52 62 75 2d 3e 6d 4c 6f  ) & p->pRbu->mLo
1e3c0 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 78 53  ck ){.        xS
1e3d0 68 6d 4c 6f 63 6b 28 70 2d 3e 70 52 65 61 6c 2c  hmLock(p->pReal,
1e3e0 20 69 2c 20 31 2c 20 53 51 4c 49 54 45 5f 53 48   i, 1, SQLITE_SH
1e3f0 4d 5f 55 4e 4c 4f 43 4b 7c 53 51 4c 49 54 45 5f  M_UNLOCK|SQLITE_
1e400 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 3b 0a  SHM_EXCLUSIVE);.
1e410 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1e420 20 20 70 2d 3e 70 52 62 75 2d 3e 6d 4c 6f 63 6b    p->pRbu->mLock
1e430 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 0;.  }.}../*.
1e440 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 72 62 75 20  ** Close an rbu 
1e450 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
1e460 69 6e 74 20 72 62 75 56 66 73 43 6c 6f 73 65 28  int rbuVfsClose(
1e470 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
1e480 69 6c 65 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65  ile){.  rbu_file
1e490 20 2a 70 20 3d 20 28 72 62 75 5f 66 69 6c 65 2a   *p = (rbu_file*
1e4a0 29 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20 72 63  )pFile;.  int rc
1e4b0 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a  ;.  int i;..  /*
1e4c0 20 46 72 65 65 20 74 68 65 20 63 6f 6e 74 65 6e   Free the conten
1e4d0 74 73 20 6f 66 20 74 68 65 20 61 70 53 68 6d 5b  ts of the apShm[
1e4e0 5d 20 61 72 72 61 79 2e 20 41 6e 64 20 74 68 65  ] array. And the
1e4f0 20 61 72 72 61 79 20 69 74 73 65 6c 66 2e 20 2a   array itself. *
1e500 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  /.  for(i=0; i<p
1e510 2d 3e 6e 53 68 6d 3b 20 69 2b 2b 29 7b 0a 20 20  ->nShm; i++){.  
1e520 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1e530 2d 3e 61 70 53 68 6d 5b 69 5d 29 3b 0a 20 20 7d  ->apShm[i]);.  }
1e540 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
1e550 70 2d 3e 61 70 53 68 6d 29 3b 0a 20 20 70 2d 3e  p->apShm);.  p->
1e560 61 70 53 68 6d 20 3d 20 30 3b 0a 20 20 73 71 6c  apShm = 0;.  sql
1e570 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 44 65  ite3_free(p->zDe
1e580 6c 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 6f 70  l);..  if( p->op
1e590 65 6e 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  enFlags & SQLITE
1e5a0 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 7b  _OPEN_MAIN_DB ){
1e5b0 0a 20 20 20 20 72 62 75 5f 66 69 6c 65 20 2a 2a  .    rbu_file **
1e5c0 70 70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  pp;.    sqlite3_
1e5d0 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 2d 3e 70  mutex_enter(p->p
1e5e0 52 62 75 56 66 73 2d 3e 6d 75 74 65 78 29 3b 0a  RbuVfs->mutex);.
1e5f0 20 20 20 20 66 6f 72 28 70 70 3d 26 70 2d 3e 70      for(pp=&p->p
1e600 52 62 75 56 66 73 2d 3e 70 4d 61 69 6e 3b 20 2a  RbuVfs->pMain; *
1e610 70 70 21 3d 70 3b 20 70 70 3d 26 28 28 2a 70 70  pp!=p; pp=&((*pp
1e620 29 2d 3e 70 4d 61 69 6e 4e 65 78 74 29 29 3b 0a  )->pMainNext));.
1e630 20 20 20 20 2a 70 70 20 3d 20 70 2d 3e 70 4d 61      *pp = p->pMa
1e640 69 6e 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c 69  inNext;.    sqli
1e650 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
1e660 70 2d 3e 70 52 62 75 56 66 73 2d 3e 6d 75 74 65  p->pRbuVfs->mute
1e670 78 29 3b 0a 20 20 20 20 72 62 75 55 6e 6c 6f 63  x);.    rbuUnloc
1e680 6b 53 68 6d 28 70 29 3b 0a 20 20 20 20 70 2d 3e  kShm(p);.    p->
1e690 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d  pReal->pMethods-
1e6a0 3e 78 53 68 6d 55 6e 6d 61 70 28 70 2d 3e 70 52  >xShmUnmap(p->pR
1e6b0 65 61 6c 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  eal, 0);.  }..  
1e6c0 2f 2a 20 43 6c 6f 73 65 20 74 68 65 20 75 6e 64  /* Close the und
1e6d0 65 72 6c 79 69 6e 67 20 66 69 6c 65 20 68 61 6e  erlying file han
1e6e0 64 6c 65 20 2a 2f 0a 20 20 72 63 20 3d 20 70 2d  dle */.  rc = p-
1e6f0 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73  >pReal->pMethods
1e700 2d 3e 78 43 6c 6f 73 65 28 70 2d 3e 70 52 65 61  ->xClose(p->pRea
1e710 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  l);.  return rc;
1e720 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  .}.../*.** Read 
1e730 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 75 6e  and return an un
1e740 73 69 67 6e 65 64 20 33 32 2d 62 69 74 20 62 69  signed 32-bit bi
1e750 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
1e760 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72   from the buffer
1e770 20 0a 2a 2a 20 70 61 73 73 65 64 20 61 73 20 74   .** passed as t
1e780 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74  he only argument
1e790 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20  ..*/.static u32 
1e7a0 72 62 75 47 65 74 55 33 32 28 75 38 20 2a 61 42  rbuGetU32(u8 *aB
1e7b0 75 66 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 28  uf){.  return ((
1e7c0 75 33 32 29 61 42 75 66 5b 30 5d 20 3c 3c 20 32  u32)aBuf[0] << 2
1e7d0 34 29 0a 20 20 20 20 20 20 20 2b 20 28 28 75 33  4).       + ((u3
1e7e0 32 29 61 42 75 66 5b 31 5d 20 3c 3c 20 31 36 29  2)aBuf[1] << 16)
1e7f0 0a 20 20 20 20 20 20 20 2b 20 28 28 75 33 32 29  .       + ((u32)
1e800 61 42 75 66 5b 32 5d 20 3c 3c 20 20 38 29 0a 20  aBuf[2] <<  8). 
1e810 20 20 20 20 20 20 2b 20 28 28 75 33 32 29 61 42        + ((u32)aB
1e820 75 66 5b 33 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  uf[3]);.}../*.**
1e830 20 57 72 69 74 65 20 61 6e 20 75 6e 73 69 67 6e   Write an unsign
1e840 65 64 20 33 32 2d 62 69 74 20 76 61 6c 75 65 20  ed 32-bit value 
1e850 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e 20 66 6f  in big-endian fo
1e860 72 6d 61 74 20 74 6f 20 74 68 65 20 73 75 70 70  rmat to the supp
1e870 6c 69 65 64 0a 2a 2a 20 62 75 66 66 65 72 2e 0a  lied.** buffer..
1e880 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
1e890 62 75 50 75 74 55 33 32 28 75 38 20 2a 61 42 75  buPutU32(u8 *aBu
1e8a0 66 2c 20 75 33 32 20 69 56 61 6c 29 7b 0a 20 20  f, u32 iVal){.  
1e8b0 61 42 75 66 5b 30 5d 20 3d 20 28 69 56 61 6c 20  aBuf[0] = (iVal 
1e8c0 3e 3e 20 32 34 29 20 26 20 30 78 46 46 3b 0a 20  >> 24) & 0xFF;. 
1e8d0 20 61 42 75 66 5b 31 5d 20 3d 20 28 69 56 61 6c   aBuf[1] = (iVal
1e8e0 20 3e 3e 20 31 36 29 20 26 20 30 78 46 46 3b 0a   >> 16) & 0xFF;.
1e8f0 20 20 61 42 75 66 5b 32 5d 20 3d 20 28 69 56 61    aBuf[2] = (iVa
1e900 6c 20 3e 3e 20 20 38 29 20 26 20 30 78 46 46 3b  l >>  8) & 0xFF;
1e910 0a 20 20 61 42 75 66 5b 33 5d 20 3d 20 28 69 56  .  aBuf[3] = (iV
1e920 61 6c 20 3e 3e 20 20 30 29 20 26 20 30 78 46 46  al >>  0) & 0xFF
1e930 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
1e940 20 72 62 75 50 75 74 55 31 36 28 75 38 20 2a 61   rbuPutU16(u8 *a
1e950 42 75 66 2c 20 75 31 36 20 69 56 61 6c 29 7b 0a  Buf, u16 iVal){.
1e960 20 20 61 42 75 66 5b 30 5d 20 3d 20 28 69 56 61    aBuf[0] = (iVa
1e970 6c 20 3e 3e 20 20 38 29 20 26 20 30 78 46 46 3b  l >>  8) & 0xFF;
1e980 0a 20 20 61 42 75 66 5b 31 5d 20 3d 20 28 69 56  .  aBuf[1] = (iV
1e990 61 6c 20 3e 3e 20 20 30 29 20 26 20 30 78 46 46  al >>  0) & 0xFF
1e9a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
1e9b0 64 61 74 61 20 66 72 6f 6d 20 61 6e 20 72 62 75  data from an rbu
1e9c0 56 66 73 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  Vfs-file..*/.sta
1e9d0 74 69 63 20 69 6e 74 20 72 62 75 56 66 73 52 65  tic int rbuVfsRe
1e9e0 61 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  ad(.  sqlite3_fi
1e9f0 6c 65 20 2a 70 46 69 6c 65 2c 20 0a 20 20 76 6f  le *pFile, .  vo
1ea00 69 64 20 2a 7a 42 75 66 2c 20 0a 20 20 69 6e 74  id *zBuf, .  int
1ea10 20 69 41 6d 74 2c 20 0a 20 20 73 71 6c 69 74 65   iAmt, .  sqlite
1ea20 5f 69 6e 74 36 34 20 69 4f 66 73 74 0a 29 7b 0a  _int64 iOfst.){.
1ea30 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 20 3d 20    rbu_file *p = 
1ea40 28 72 62 75 5f 66 69 6c 65 2a 29 70 46 69 6c 65  (rbu_file*)pFile
1ea50 3b 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20 2a  ;.  sqlite3rbu *
1ea60 70 52 62 75 20 3d 20 70 2d 3e 70 52 62 75 3b 0a  pRbu = p->pRbu;.
1ea70 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
1ea80 20 70 52 62 75 20 26 26 20 70 52 62 75 2d 3e 65   pRbu && pRbu->e
1ea90 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45  Stage==RBU_STAGE
1eaa0 5f 43 41 50 54 55 52 45 20 29 7b 0a 20 20 20 20  _CAPTURE ){.    
1eab0 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 65 6e 46  assert( p->openF
1eac0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
1ead0 45 4e 5f 57 41 4c 20 29 3b 0a 20 20 20 20 72 63  EN_WAL );.    rc
1eae0 20 3d 20 72 62 75 43 61 70 74 75 72 65 57 61 6c   = rbuCaptureWal
1eaf0 52 65 61 64 28 70 2d 3e 70 52 62 75 2c 20 69 4f  Read(p->pRbu, iO
1eb00 66 73 74 2c 20 69 41 6d 74 29 3b 0a 20 20 7d 65  fst, iAmt);.  }e
1eb10 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 52 62  lse{.    if( pRb
1eb20 75 20 26 26 20 70 52 62 75 2d 3e 65 53 74 61 67  u && pRbu->eStag
1eb30 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c  e==RBU_STAGE_OAL
1eb40 20 0a 20 20 20 20 20 26 26 20 28 70 2d 3e 6f 70   .     && (p->op
1eb50 65 6e 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  enFlags & SQLITE
1eb60 5f 4f 50 45 4e 5f 57 41 4c 29 20 0a 20 20 20 20  _OPEN_WAL) .    
1eb70 20 26 26 20 69 4f 66 73 74 3e 3d 70 52 62 75 2d   && iOfst>=pRbu-
1eb80 3e 69 4f 61 6c 53 7a 20 0a 20 20 20 20 29 7b 0a  >iOalSz .    ){.
1eb90 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1eba0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 6d 65 6d 73  E_OK;.      mems
1ebb0 65 74 28 7a 42 75 66 2c 20 30 2c 20 69 41 6d 74  et(zBuf, 0, iAmt
1ebc0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1ebd0 20 20 20 20 72 63 20 3d 20 70 2d 3e 70 52 65 61      rc = p->pRea
1ebe0 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 52 65  l->pMethods->xRe
1ebf0 61 64 28 70 2d 3e 70 52 65 61 6c 2c 20 7a 42 75  ad(p->pReal, zBu
1ec00 66 2c 20 69 41 6d 74 2c 20 69 4f 66 73 74 29 3b  f, iAmt, iOfst);
1ec10 0a 23 69 66 20 31 0a 20 20 20 20 20 20 2f 2a 20  .#if 1.      /* 
1ec20 49 66 20 74 68 69 73 20 69 73 20 62 65 69 6e 67  If this is being
1ec30 20 63 61 6c 6c 65 64 20 74 6f 20 72 65 61 64 20   called to read 
1ec40 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
1ec50 66 20 74 68 65 20 74 61 72 67 65 74 20 0a 20 20  f the target .  
1ec60 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
1ec70 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20 72 62  as part of an rb
1ec80 75 20 76 61 63 75 75 6d 20 6f 70 65 72 61 74 69  u vacuum operati
1ec90 6f 6e 2c 20 73 79 6e 74 68 65 73 69 7a 65 20 74  on, synthesize t
1eca0 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e  he .      ** con
1ecb0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 66 69 72  tents of the fir
1ecc0 73 74 20 70 61 67 65 20 69 66 20 69 74 20 64 6f  st page if it do
1ecd0 65 73 20 6e 6f 74 20 79 65 74 20 65 78 69 73 74  es not yet exist
1ece0 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20 20  . Otherwise,.   
1ecf0 20 20 20 2a 2a 20 53 51 4c 69 74 65 20 77 69 6c     ** SQLite wil
1ed00 6c 20 6e 6f 74 20 63 68 65 63 6b 20 66 6f 72 20  l not check for 
1ed10 61 20 2a 2d 77 61 6c 20 66 69 6c 65 2e 20 20 2a  a *-wal file.  *
1ed20 2f 0a 20 20 20 20 20 20 69 66 28 20 70 52 62 75  /.      if( pRbu
1ed30 20 26 26 20 72 62 75 49 73 56 61 63 75 75 6d 28   && rbuIsVacuum(
1ed40 70 52 62 75 29 20 0a 20 20 20 20 20 20 20 20 20  pRbu) .         
1ed50 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49   && rc==SQLITE_I
1ed60 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20  OERR_SHORT_READ 
1ed70 26 26 20 69 4f 66 73 74 3d 3d 30 0a 20 20 20 20  && iOfst==0.    
1ed80 20 20 20 20 20 20 26 26 20 28 70 2d 3e 6f 70 65        && (p->ope
1ed90 6e 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  nFlags & SQLITE_
1eda0 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 0a 20 20  OPEN_MAIN_DB).  
1edb0 20 20 20 20 20 20 20 20 26 26 20 70 52 62 75 2d          && pRbu-
1edc0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20  >rc==SQLITE_OK. 
1edd0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
1ede0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
1edf0 64 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c  d = (sqlite3_fil
1ee00 65 2a 29 70 52 62 75 2d 3e 70 52 62 75 46 64 3b  e*)pRbu->pRbuFd;
1ee10 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 46  .        rc = pF
1ee20 64 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 52 65  d->pMethods->xRe
1ee30 61 64 28 70 46 64 2c 20 7a 42 75 66 2c 20 69 41  ad(pFd, zBuf, iA
1ee40 6d 74 2c 20 69 4f 66 73 74 29 3b 0a 20 20 20 20  mt, iOfst);.    
1ee50 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1ee60 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1ee70 20 20 20 75 38 20 2a 61 42 75 66 20 3d 20 28 75     u8 *aBuf = (u
1ee80 38 2a 29 7a 42 75 66 3b 0a 20 20 20 20 20 20 20  8*)zBuf;.       
1ee90 20 20 20 75 33 32 20 69 52 6f 6f 74 20 3d 20 72     u32 iRoot = r
1eea0 62 75 47 65 74 55 33 32 28 26 61 42 75 66 5b 35  buGetU32(&aBuf[5
1eeb0 32 5d 29 20 3f 20 31 20 3a 20 30 3b 0a 20 20 20  2]) ? 1 : 0;.   
1eec0 20 20 20 20 20 20 20 72 62 75 50 75 74 55 33 32         rbuPutU32
1eed0 28 26 61 42 75 66 5b 35 32 5d 2c 20 69 52 6f 6f  (&aBuf[52], iRoo
1eee0 74 29 3b 20 20 20 20 20 20 2f 2a 20 6c 61 72 67  t);      /* larg
1eef0 65 73 74 20 72 6f 6f 74 20 70 61 67 65 20 6e 75  est root page nu
1ef00 6d 62 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  mber */.        
1ef10 20 20 72 62 75 50 75 74 55 33 32 28 26 61 42 75    rbuPutU32(&aBu
1ef20 66 5b 33 36 5d 2c 20 30 29 3b 20 20 20 20 20 20  f[36], 0);      
1ef30 20 20 20 20 2f 2a 20 6e 75 6d 62 65 72 20 6f 66      /* number of
1ef40 20 66 72 65 65 20 70 61 67 65 73 20 2a 2f 0a 20   free pages */. 
1ef50 20 20 20 20 20 20 20 20 20 72 62 75 50 75 74 55           rbuPutU
1ef60 33 32 28 26 61 42 75 66 5b 33 32 5d 2c 20 30 29  32(&aBuf[32], 0)
1ef70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69  ;          /* fi
1ef80 72 73 74 20 70 61 67 65 20 6f 6e 20 66 72 65 65  rst page on free
1ef90 20 6c 69 73 74 20 74 72 75 6e 6b 20 2a 2f 0a 20   list trunk */. 
1efa0 20 20 20 20 20 20 20 20 20 72 62 75 50 75 74 55           rbuPutU
1efb0 33 32 28 26 61 42 75 66 5b 32 38 5d 2c 20 31 29  32(&aBuf[28], 1)
1efc0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 69  ;          /* si
1efd0 7a 65 20 6f 66 20 64 62 20 66 69 6c 65 20 69 6e  ze of db file in
1efe0 20 70 61 67 65 73 20 2a 2f 0a 20 20 20 20 20 20   pages */.      
1eff0 20 20 20 20 72 62 75 50 75 74 55 33 32 28 26 61      rbuPutU32(&a
1f000 42 75 66 5b 32 34 5d 2c 20 70 52 62 75 2d 3e 70  Buf[24], pRbu->p
1f010 52 62 75 46 64 2d 3e 69 43 6f 6f 6b 69 65 2b 31  RbuFd->iCookie+1
1f020 29 3b 20 20 2f 2a 20 43 68 61 6e 67 65 20 63 6f  );  /* Change co
1f030 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 20 20 20 20  unter */..      
1f040 20 20 20 20 69 66 28 20 69 41 6d 74 3e 31 30 30      if( iAmt>100
1f050 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1f060 61 73 73 65 72 74 28 20 69 41 6d 74 3e 3d 31 30  assert( iAmt>=10
1f070 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  1 );.           
1f080 20 6d 65 6d 73 65 74 28 26 61 42 75 66 5b 31 30   memset(&aBuf[10
1f090 31 5d 2c 20 30 2c 20 69 41 6d 74 2d 31 30 31 29  1], 0, iAmt-101)
1f0a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 62  ;.            rb
1f0b0 75 50 75 74 55 31 36 28 26 61 42 75 66 5b 31 30  uPutU16(&aBuf[10
1f0c0 35 5d 2c 20 69 41 6d 74 20 26 20 30 78 46 46 46  5], iAmt & 0xFFF
1f0d0 46 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  F);.          }.
1f0e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1f0f0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  }.#endif.    }. 
1f100 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1f110 45 5f 4f 4b 20 26 26 20 69 4f 66 73 74 3d 3d 30  E_OK && iOfst==0
1f120 20 26 26 20 28 70 2d 3e 6f 70 65 6e 46 6c 61 67   && (p->openFlag
1f130 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
1f140 4d 41 49 4e 5f 44 42 29 20 29 7b 0a 20 20 20 20  MAIN_DB) ){.    
1f150 20 20 2f 2a 20 54 68 65 73 65 20 6c 6f 6f 6b 20    /* These look 
1f160 6c 69 6b 65 20 6d 61 67 69 63 20 6e 75 6d 62 65  like magic numbe
1f170 72 73 2e 20 42 75 74 20 74 68 65 79 20 61 72 65  rs. But they are
1f180 20 73 74 61 62 6c 65 2c 20 61 73 20 74 68 65 79   stable, as they
1f190 20 61 72 65 20 70 61 72 74 0a 20 20 20 20 20 20   are part.      
1f1a0 20 2a 2a 20 6f 66 20 74 68 65 20 64 65 66 69 6e   ** of the defin
1f1b0 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 53 51 4c  ition of the SQL
1f1c0 69 74 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2c  ite file format,
1f1d0 20 77 68 69 63 68 20 6d 61 79 20 6e 6f 74 20 63   which may not c
1f1e0 68 61 6e 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20  hange. */.      
1f1f0 75 38 20 2a 70 42 75 66 20 3d 20 28 75 38 2a 29  u8 *pBuf = (u8*)
1f200 7a 42 75 66 3b 0a 20 20 20 20 20 20 70 2d 3e 69  zBuf;.      p->i
1f210 43 6f 6f 6b 69 65 20 3d 20 72 62 75 47 65 74 55  Cookie = rbuGetU
1f220 33 32 28 26 70 42 75 66 5b 32 34 5d 29 3b 0a 20  32(&pBuf[24]);. 
1f230 20 20 20 20 20 70 2d 3e 69 57 72 69 74 65 56 65       p->iWriteVe
1f240 72 20 3d 20 70 42 75 66 5b 31 39 5d 3b 0a 20 20  r = pBuf[19];.  
1f250 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1f260 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72   rc;.}../*.** Wr
1f270 69 74 65 20 64 61 74 61 20 74 6f 20 61 6e 20 72  ite data to an r
1f280 62 75 56 66 73 2d 66 69 6c 65 2e 0a 2a 2f 0a 73  buVfs-file..*/.s
1f290 74 61 74 69 63 20 69 6e 74 20 72 62 75 56 66 73  tatic int rbuVfs
1f2a0 57 72 69 74 65 28 0a 20 20 73 71 6c 69 74 65 33  Write(.  sqlite3
1f2b0 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 0a 20  _file *pFile, . 
1f2c0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 42 75   const void *zBu
1f2d0 66 2c 20 0a 20 20 69 6e 74 20 69 41 6d 74 2c 20  f, .  int iAmt, 
1f2e0 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20  .  sqlite_int64 
1f2f0 69 4f 66 73 74 0a 29 7b 0a 20 20 72 62 75 5f 66  iOfst.){.  rbu_f
1f300 69 6c 65 20 2a 70 20 3d 20 28 72 62 75 5f 66 69  ile *p = (rbu_fi
1f310 6c 65 2a 29 70 46 69 6c 65 3b 0a 20 20 73 71 6c  le*)pFile;.  sql
1f320 69 74 65 33 72 62 75 20 2a 70 52 62 75 20 3d 20  ite3rbu *pRbu = 
1f330 70 2d 3e 70 52 62 75 3b 0a 20 20 69 6e 74 20 72  p->pRbu;.  int r
1f340 63 3b 0a 0a 20 20 69 66 28 20 70 52 62 75 20 26  c;..  if( pRbu &
1f350 26 20 70 52 62 75 2d 3e 65 53 74 61 67 65 3d 3d  & pRbu->eStage==
1f360 52 42 55 5f 53 54 41 47 45 5f 43 41 50 54 55 52  RBU_STAGE_CAPTUR
1f370 45 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  E ){.    assert(
1f380 20 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20   p->openFlags & 
1f390 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
1f3a0 5f 44 42 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  _DB );.    rc = 
1f3b0 72 62 75 43 61 70 74 75 72 65 44 62 57 72 69 74  rbuCaptureDbWrit
1f3c0 65 28 70 2d 3e 70 52 62 75 2c 20 69 4f 66 73 74  e(p->pRbu, iOfst
1f3d0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1f3e0 69 66 28 20 70 52 62 75 20 26 26 20 70 52 62 75  if( pRbu && pRbu
1f3f0 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54  ->eStage==RBU_ST
1f400 41 47 45 5f 4f 41 4c 20 0a 20 20 20 20 20 26 26  AGE_OAL .     &&
1f410 20 28 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26   (p->openFlags &
1f420 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c   SQLITE_OPEN_WAL
1f430 29 20 0a 20 20 20 20 20 26 26 20 69 4f 66 73 74  ) .     && iOfst
1f440 3e 3d 70 52 62 75 2d 3e 69 4f 61 6c 53 7a 0a 20  >=pRbu->iOalSz. 
1f450 20 20 20 29 7b 0a 20 20 20 20 20 20 70 52 62 75     ){.      pRbu
1f460 2d 3e 69 4f 61 6c 53 7a 20 3d 20 69 41 6d 74 20  ->iOalSz = iAmt 
1f470 2b 20 69 4f 66 73 74 3b 0a 20 20 20 20 7d 0a 20  + iOfst;.    }. 
1f480 20 20 20 72 63 20 3d 20 70 2d 3e 70 52 65 61 6c     rc = p->pReal
1f490 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 57 72 69  ->pMethods->xWri
1f4a0 74 65 28 70 2d 3e 70 52 65 61 6c 2c 20 7a 42 75  te(p->pReal, zBu
1f4b0 66 2c 20 69 41 6d 74 2c 20 69 4f 66 73 74 29 3b  f, iAmt, iOfst);
1f4c0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1f4d0 49 54 45 5f 4f 4b 20 26 26 20 69 4f 66 73 74 3d  ITE_OK && iOfst=
1f4e0 3d 30 20 26 26 20 28 70 2d 3e 6f 70 65 6e 46 6c  =0 && (p->openFl
1f4f0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
1f500 4e 5f 4d 41 49 4e 5f 44 42 29 20 29 7b 0a 20 20  N_MAIN_DB) ){.  
1f510 20 20 20 20 2f 2a 20 54 68 65 73 65 20 6c 6f 6f      /* These loo
1f520 6b 20 6c 69 6b 65 20 6d 61 67 69 63 20 6e 75 6d  k like magic num
1f530 62 65 72 73 2e 20 42 75 74 20 74 68 65 79 20 61  bers. But they a
1f540 72 65 20 73 74 61 62 6c 65 2c 20 61 73 20 74 68  re stable, as th
1f550 65 79 20 61 72 65 20 70 61 72 74 0a 20 20 20 20  ey are part.    
1f560 20 20 2a 2a 20 6f 66 20 74 68 65 20 64 65 66 69    ** of the defi
1f570 6e 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 53 51  nition of the SQ
1f580 4c 69 74 65 20 66 69 6c 65 20 66 6f 72 6d 61 74  Lite file format
1f590 2c 20 77 68 69 63 68 20 6d 61 79 20 6e 6f 74 20  , which may not 
1f5a0 63 68 61 6e 67 65 2e 20 2a 2f 0a 20 20 20 20 20  change. */.     
1f5b0 20 75 38 20 2a 70 42 75 66 20 3d 20 28 75 38 2a   u8 *pBuf = (u8*
1f5c0 29 7a 42 75 66 3b 0a 20 20 20 20 20 20 70 2d 3e  )zBuf;.      p->
1f5d0 69 43 6f 6f 6b 69 65 20 3d 20 72 62 75 47 65 74  iCookie = rbuGet
1f5e0 55 33 32 28 26 70 42 75 66 5b 32 34 5d 29 3b 0a  U32(&pBuf[24]);.
1f5f0 20 20 20 20 20 20 70 2d 3e 69 57 72 69 74 65 56        p->iWriteV
1f600 65 72 20 3d 20 70 42 75 66 5b 31 39 5d 3b 0a 20  er = pBuf[19];. 
1f610 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1f620 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
1f630 72 75 6e 63 61 74 65 20 61 6e 20 72 62 75 56 66  runcate an rbuVf
1f640 73 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  s-file..*/.stati
1f650 63 20 69 6e 74 20 72 62 75 56 66 73 54 72 75 6e  c int rbuVfsTrun
1f660 63 61 74 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  cate(sqlite3_fil
1f670 65 20 2a 70 46 69 6c 65 2c 20 73 71 6c 69 74 65  e *pFile, sqlite
1f680 5f 69 6e 74 36 34 20 73 69 7a 65 29 7b 0a 20 20  _int64 size){.  
1f690 72 62 75 5f 66 69 6c 65 20 2a 70 20 3d 20 28 72  rbu_file *p = (r
1f6a0 62 75 5f 66 69 6c 65 2a 29 70 46 69 6c 65 3b 0a  bu_file*)pFile;.
1f6b0 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 52 65 61    return p->pRea
1f6c0 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 54 72  l->pMethods->xTr
1f6d0 75 6e 63 61 74 65 28 70 2d 3e 70 52 65 61 6c 2c  uncate(p->pReal,
1f6e0 20 73 69 7a 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   size);.}../*.**
1f6f0 20 53 79 6e 63 20 61 6e 20 72 62 75 56 66 73 2d   Sync an rbuVfs-
1f700 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
1f710 69 6e 74 20 72 62 75 56 66 73 53 79 6e 63 28 73  int rbuVfsSync(s
1f720 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
1f730 6c 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  le, int flags){.
1f740 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 20 3d 20    rbu_file *p = 
1f750 28 72 62 75 5f 66 69 6c 65 20 2a 29 70 46 69 6c  (rbu_file *)pFil
1f760 65 3b 0a 20 20 69 66 28 20 70 2d 3e 70 52 62 75  e;.  if( p->pRbu
1f770 20 26 26 20 70 2d 3e 70 52 62 75 2d 3e 65 53 74   && p->pRbu->eSt
1f780 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 43  age==RBU_STAGE_C
1f790 41 50 54 55 52 45 20 29 7b 0a 20 20 20 20 69 66  APTURE ){.    if
1f7a0 28 20 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26  ( p->openFlags &
1f7b0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49   SQLITE_OPEN_MAI
1f7c0 4e 5f 44 42 20 29 7b 0a 20 20 20 20 20 20 72 65  N_DB ){.      re
1f7d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4e 54 45  turn SQLITE_INTE
1f7e0 52 4e 41 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RNAL;.    }.    
1f7f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1f800 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
1f810 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64  ->pReal->pMethod
1f820 73 2d 3e 78 53 79 6e 63 28 70 2d 3e 70 52 65 61  s->xSync(p->pRea
1f830 6c 2c 20 66 6c 61 67 73 29 3b 0a 7d 0a 0a 2f 2a  l, flags);.}../*
1f840 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63  .** Return the c
1f850 75 72 72 65 6e 74 20 66 69 6c 65 2d 73 69 7a 65  urrent file-size
1f860 20 6f 66 20 61 6e 20 72 62 75 56 66 73 2d 66 69   of an rbuVfs-fi
1f870 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
1f880 74 20 72 62 75 56 66 73 46 69 6c 65 53 69 7a 65  t rbuVfsFileSize
1f890 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70  (sqlite3_file *p
1f8a0 46 69 6c 65 2c 20 73 71 6c 69 74 65 5f 69 6e 74  File, sqlite_int
1f8b0 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 72 62  64 *pSize){.  rb
1f8c0 75 5f 66 69 6c 65 20 2a 70 20 3d 20 28 72 62 75  u_file *p = (rbu
1f8d0 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20  _file *)pFile;. 
1f8e0 20 69 6e 74 20 72 63 3b 0a 20 20 72 63 20 3d 20   int rc;.  rc = 
1f8f0 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f  p->pReal->pMetho
1f900 64 73 2d 3e 78 46 69 6c 65 53 69 7a 65 28 70 2d  ds->xFileSize(p-
1f910 3e 70 52 65 61 6c 2c 20 70 53 69 7a 65 29 3b 0a  >pReal, pSize);.
1f920 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
1f930 20 61 6e 20 52 42 55 20 76 61 63 75 75 6d 20 6f   an RBU vacuum o
1f940 70 65 72 61 74 69 6f 6e 20 61 6e 64 20 74 68 69  peration and thi
1f950 73 20 69 73 20 74 68 65 20 74 61 72 67 65 74 20  s is the target 
1f960 64 61 74 61 62 61 73 65 2c 0a 20 20 2a 2a 20 70  database,.  ** p
1f970 72 65 74 65 6e 64 20 74 68 61 74 20 69 74 20 68  retend that it h
1f980 61 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  as at least one 
1f990 70 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  page. Otherwise,
1f9a0 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e 6f 74   SQLite will not
1f9b0 0a 20 20 2a 2a 20 63 68 65 63 6b 20 66 6f 72 20  .  ** check for 
1f9c0 74 68 65 20 65 78 69 73 74 61 6e 63 65 20 6f 66  the existance of
1f9d0 20 61 20 2a 2d 77 61 6c 20 66 69 6c 65 2e 20 72   a *-wal file. r
1f9e0 62 75 56 66 73 52 65 61 64 28 29 20 63 6f 6e 74  buVfsRead() cont
1f9f0 61 69 6e 73 20 0a 20 20 2a 2a 20 73 69 6d 69 6c  ains .  ** simil
1fa00 61 72 20 6c 6f 67 69 63 2e 20 20 2a 2f 0a 20 20  ar logic.  */.  
1fa10 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1fa20 4b 20 26 26 20 2a 70 53 69 7a 65 3d 3d 30 20 0a  K && *pSize==0 .
1fa30 20 20 20 26 26 20 70 2d 3e 70 52 62 75 20 26 26     && p->pRbu &&
1fa40 20 72 62 75 49 73 56 61 63 75 75 6d 28 70 2d 3e   rbuIsVacuum(p->
1fa50 70 52 62 75 29 20 0a 20 20 20 26 26 20 28 70 2d  pRbu) .   && (p-
1fa60 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20 53 51 4c  >openFlags & SQL
1fa70 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
1fa80 29 0a 20 20 29 7b 0a 20 20 20 20 2a 70 53 69 7a  ).  ){.    *pSiz
1fa90 65 20 3d 20 31 30 32 34 3b 0a 20 20 7d 0a 20 20  e = 1024;.  }.  
1faa0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1fab0 0a 2a 2a 20 4c 6f 63 6b 20 61 6e 20 72 62 75 56  .** Lock an rbuV
1fac0 66 73 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  fs-file..*/.stat
1fad0 69 63 20 69 6e 74 20 72 62 75 56 66 73 4c 6f 63  ic int rbuVfsLoc
1fae0 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
1faf0 70 46 69 6c 65 2c 20 69 6e 74 20 65 4c 6f 63 6b  pFile, int eLock
1fb00 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a 70  ){.  rbu_file *p
1fb10 20 3d 20 28 72 62 75 5f 66 69 6c 65 2a 29 70 46   = (rbu_file*)pF
1fb20 69 6c 65 3b 0a 20 20 73 71 6c 69 74 65 33 72 62  ile;.  sqlite3rb
1fb30 75 20 2a 70 52 62 75 20 3d 20 70 2d 3e 70 52 62  u *pRbu = p->pRb
1fb40 75 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  u;.  int rc = SQ
1fb50 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65  LITE_OK;..  asse
1fb60 72 74 28 20 70 2d 3e 6f 70 65 6e 46 6c 61 67 73  rt( p->openFlags
1fb70 20 26 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   & (SQLITE_OPEN_
1fb80 4d 41 49 4e 5f 44 42 7c 53 51 4c 49 54 45 5f 4f  MAIN_DB|SQLITE_O
1fb90 50 45 4e 5f 54 45 4d 50 5f 44 42 29 20 29 3b 0a  PEN_TEMP_DB) );.
1fba0 20 20 69 66 28 20 65 4c 6f 63 6b 3d 3d 53 51 4c    if( eLock==SQL
1fbb0 49 54 45 5f 4c 4f 43 4b 5f 45 58 43 4c 55 53 49  ITE_LOCK_EXCLUSI
1fbc0 56 45 20 0a 20 20 20 26 26 20 28 70 2d 3e 62 4e  VE .   && (p->bN
1fbd0 6f 6c 6f 63 6b 20 7c 7c 20 28 70 52 62 75 20 26  olock || (pRbu &
1fbe0 26 20 70 52 62 75 2d 3e 65 53 74 61 67 65 21 3d  & pRbu->eStage!=
1fbf0 52 42 55 5f 53 54 41 47 45 5f 44 4f 4e 45 29 29  RBU_STAGE_DONE))
1fc00 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 44 6f 20  .  ){.    /* Do 
1fc10 6e 6f 74 20 61 6c 6c 6f 77 20 45 58 43 4c 55 53  not allow EXCLUS
1fc20 49 56 45 20 6c 6f 63 6b 73 2e 20 50 72 65 76 65  IVE locks. Preve
1fc30 6e 74 69 6e 67 20 53 51 4c 69 74 65 20 66 72 6f  nting SQLite fro
1fc40 6d 20 74 61 6b 69 6e 67 20 74 68 69 73 20 0a 20  m taking this . 
1fc50 20 20 20 2a 2a 20 70 72 65 76 65 6e 74 73 20 69     ** prevents i
1fc60 74 20 66 72 6f 6d 20 63 68 65 63 6b 70 6f 69 6e  t from checkpoin
1fc70 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ting the databas
1fc80 65 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 63  e from sqlite3_c
1fc90 6c 6f 73 65 28 29 2e 20 2a 2f 0a 20 20 20 20 72  lose(). */.    r
1fca0 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
1fcb0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
1fcc0 20 3d 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65   = p->pReal->pMe
1fcd0 74 68 6f 64 73 2d 3e 78 4c 6f 63 6b 28 70 2d 3e  thods->xLock(p->
1fce0 70 52 65 61 6c 2c 20 65 4c 6f 63 6b 29 3b 0a 20  pReal, eLock);. 
1fcf0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
1fd00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b  .}../*.** Unlock
1fd10 20 61 6e 20 72 62 75 56 66 73 2d 66 69 6c 65 2e   an rbuVfs-file.
1fd20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
1fd30 62 75 56 66 73 55 6e 6c 6f 63 6b 28 73 71 6c 69  buVfsUnlock(sqli
1fd40 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c  te3_file *pFile,
1fd50 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 72   int eLock){.  r
1fd60 62 75 5f 66 69 6c 65 20 2a 70 20 3d 20 28 72 62  bu_file *p = (rb
1fd70 75 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a  u_file *)pFile;.
1fd80 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 52 65 61    return p->pRea
1fd90 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 55 6e  l->pMethods->xUn
1fda0 6c 6f 63 6b 28 70 2d 3e 70 52 65 61 6c 2c 20 65  lock(p->pReal, e
1fdb0 4c 6f 63 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Lock);.}../*.** 
1fdc0 43 68 65 63 6b 20 69 66 20 61 6e 6f 74 68 65 72  Check if another
1fdd0 20 66 69 6c 65 2d 68 61 6e 64 6c 65 20 68 6f 6c   file-handle hol
1fde0 64 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  ds a RESERVED lo
1fdf0 63 6b 20 6f 6e 20 61 6e 20 72 62 75 56 66 73 2d  ck on an rbuVfs-
1fe00 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
1fe10 69 6e 74 20 72 62 75 56 66 73 43 68 65 63 6b 52  int rbuVfsCheckR
1fe20 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69  eservedLock(sqli
1fe30 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c  te3_file *pFile,
1fe40 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a   int *pResOut){.
1fe50 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 20 3d 20    rbu_file *p = 
1fe60 28 72 62 75 5f 66 69 6c 65 20 2a 29 70 46 69 6c  (rbu_file *)pFil
1fe70 65 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70  e;.  return p->p
1fe80 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e  Real->pMethods->
1fe90 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
1fea0 63 6b 28 70 2d 3e 70 52 65 61 6c 2c 20 70 52 65  ck(p->pReal, pRe
1feb0 73 4f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  sOut);.}../*.** 
1fec0 46 69 6c 65 20 63 6f 6e 74 72 6f 6c 20 6d 65 74  File control met
1fed0 68 6f 64 2e 20 46 6f 72 20 63 75 73 74 6f 6d 20  hod. For custom 
1fee0 6f 70 65 72 61 74 69 6f 6e 73 20 6f 6e 20 61 6e  operations on an
1fef0 20 72 62 75 56 66 73 2d 66 69 6c 65 2e 0a 2a 2f   rbuVfs-file..*/
1ff00 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 56  .static int rbuV
1ff10 66 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71  fsFileControl(sq
1ff20 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
1ff30 65 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20  e, int op, void 
1ff40 2a 70 41 72 67 29 7b 0a 20 20 72 62 75 5f 66 69  *pArg){.  rbu_fi
1ff50 6c 65 20 2a 70 20 3d 20 28 72 62 75 5f 66 69 6c  le *p = (rbu_fil
1ff60 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 69 6e 74  e *)pFile;.  int
1ff70 20 28 2a 78 43 6f 6e 74 72 6f 6c 29 28 73 71 6c   (*xControl)(sql
1ff80 69 74 65 33 5f 66 69 6c 65 2a 2c 69 6e 74 2c 76  ite3_file*,int,v
1ff90 6f 69 64 2a 29 20 3d 20 70 2d 3e 70 52 65 61 6c  oid*) = p->pReal
1ffa0 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 46 69 6c  ->pMethods->xFil
1ffb0 65 43 6f 6e 74 72 6f 6c 3b 0a 20 20 69 6e 74 20  eControl;.  int 
1ffc0 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  rc;..  assert( p
1ffd0 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20 28 53  ->openFlags & (S
1ffe0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
1fff0 44 42 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54  DB|SQLITE_OPEN_T
20000 45 4d 50 5f 44 42 29 0a 20 20 20 20 20 20 20 7c  EMP_DB).       |
20010 7c 20 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26  | p->openFlags &
20020 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52   (SQLITE_OPEN_TR
20030 41 4e 53 49 45 4e 54 5f 44 42 7c 53 51 4c 49 54  ANSIENT_DB|SQLIT
20040 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52  E_OPEN_TEMP_JOUR
20050 4e 41 4c 29 0a 20 20 29 3b 0a 20 20 69 66 28 20  NAL).  );.  if( 
20060 6f 70 3d 3d 53 51 4c 49 54 45 5f 46 43 4e 54 4c  op==SQLITE_FCNTL
20070 5f 52 42 55 20 29 7b 0a 20 20 20 20 73 71 6c 69  _RBU ){.    sqli
20080 74 65 33 72 62 75 20 2a 70 52 62 75 20 3d 20 28  te3rbu *pRbu = (
20090 73 71 6c 69 74 65 33 72 62 75 2a 29 70 41 72 67  sqlite3rbu*)pArg
200a0 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 72 73 74 20  ;..    /* First 
200b0 74 72 79 20 74 6f 20 66 69 6e 64 20 61 6e 6f 74  try to find anot
200c0 68 65 72 20 52 42 55 20 76 66 73 20 6c 6f 77 65  her RBU vfs lowe
200d0 72 20 64 6f 77 6e 20 69 6e 20 74 68 65 20 76 66  r down in the vf
200e0 73 20 73 74 61 63 6b 2e 20 49 66 0a 20 20 20 20  s stack. If.    
200f0 2a 2a 20 6f 6e 65 20 69 73 20 66 6f 75 6e 64 2c  ** one is found,
20100 20 74 68 69 73 20 76 66 73 20 77 69 6c 6c 20 6f   this vfs will o
20110 70 65 72 61 74 65 20 69 6e 20 70 61 73 73 2d 74  perate in pass-t
20120 68 72 6f 75 67 68 20 6d 6f 64 65 2e 20 54 68 65  hrough mode. The
20130 20 6c 6f 77 65 72 0a 20 20 20 20 2a 2a 20 6c 65   lower.    ** le
20140 76 65 6c 20 76 66 73 20 77 69 6c 6c 20 64 6f 20  vel vfs will do 
20150 74 68 65 20 73 70 65 63 69 61 6c 20 52 42 55 20  the special RBU 
20160 68 61 6e 64 6c 69 6e 67 2e 20 20 2a 2f 0a 20 20  handling.  */.  
20170 20 20 72 63 20 3d 20 78 43 6f 6e 74 72 6f 6c 28    rc = xControl(
20180 70 2d 3e 70 52 65 61 6c 2c 20 6f 70 2c 20 70 41  p->pReal, op, pA
20190 72 67 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63  rg);..    if( rc
201a0 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  ==SQLITE_NOTFOUN
201b0 44 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f  D ){.      /* No
201c0 77 20 73 65 61 72 63 68 20 66 6f 72 20 61 20 7a  w search for a z
201d0 69 70 76 66 73 20 69 6e 73 74 61 6e 63 65 20 6c  ipvfs instance l
201e0 6f 77 65 72 20 64 6f 77 6e 20 69 6e 20 74 68 65  ower down in the
201f0 20 56 46 53 20 73 74 61 63 6b 2e 20 49 66 0a 20   VFS stack. If. 
20200 20 20 20 20 20 2a 2a 20 6f 6e 65 20 69 73 20 66       ** one is f
20210 6f 75 6e 64 2c 20 74 68 69 73 20 69 73 20 61 6e  ound, this is an
20220 20 65 72 72 6f 72 2e 20 20 2a 2f 0a 20 20 20 20   error.  */.    
20230 20 20 76 6f 69 64 20 2a 64 75 6d 6d 79 20 3d 20    void *dummy = 
20240 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 78 43  0;.      rc = xC
20250 6f 6e 74 72 6f 6c 28 70 2d 3e 70 52 65 61 6c 2c  ontrol(p->pReal,
20260 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 5a 49   SQLITE_FCNTL_ZI
20270 50 56 46 53 2c 20 26 64 75 6d 6d 79 29 3b 0a 20  PVFS, &dummy);. 
20280 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
20290 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
202a0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
202b0 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 70 52 62  ROR;.        pRb
202c0 75 2d 3e 7a 45 72 72 6d 73 67 20 3d 20 73 71 6c  u->zErrmsg = sql
202d0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 72 62  ite3_mprintf("rb
202e0 75 2f 7a 69 70 76 66 73 20 73 65 74 75 70 20 65  u/zipvfs setup e
202f0 72 72 6f 72 22 29 3b 0a 20 20 20 20 20 20 7d 65  rror");.      }e
20300 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  lse if( rc==SQLI
20310 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 7b 0a 20  TE_NOTFOUND ){. 
20320 20 20 20 20 20 20 20 70 52 62 75 2d 3e 70 54 61         pRbu->pTa
20330 72 67 65 74 46 64 20 3d 20 70 3b 0a 20 20 20 20  rgetFd = p;.    
20340 20 20 20 20 70 2d 3e 70 52 62 75 20 3d 20 70 52      p->pRbu = pR
20350 62 75 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  bu;.        if( 
20360 70 2d 3e 70 57 61 6c 46 64 20 29 20 70 2d 3e 70  p->pWalFd ) p->p
20370 57 61 6c 46 64 2d 3e 70 52 62 75 20 3d 20 70 52  WalFd->pRbu = pR
20380 62 75 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  bu;.        rc =
20390 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
203a0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65    }.    }.    re
203b0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 65  turn rc;.  }.  e
203c0 6c 73 65 20 69 66 28 20 6f 70 3d 3d 53 51 4c 49  lse if( op==SQLI
203d0 54 45 5f 46 43 4e 54 4c 5f 52 42 55 43 4e 54 20  TE_FCNTL_RBUCNT 
203e0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 72 62  ){.    sqlite3rb
203f0 75 20 2a 70 52 62 75 20 3d 20 28 73 71 6c 69 74  u *pRbu = (sqlit
20400 65 33 72 62 75 2a 29 70 41 72 67 3b 0a 20 20 20  e3rbu*)pArg;.   
20410 20 70 52 62 75 2d 3e 6e 52 62 75 2b 2b 3b 0a 20   pRbu->nRbu++;. 
20420 20 20 20 70 52 62 75 2d 3e 70 52 62 75 46 64 20     pRbu->pRbuFd 
20430 3d 20 70 3b 0a 20 20 20 20 70 2d 3e 62 4e 6f 6c  = p;.    p->bNol
20440 6f 63 6b 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20  ock = 1;.  }..  
20450 72 63 20 3d 20 78 43 6f 6e 74 72 6f 6c 28 70 2d  rc = xControl(p-
20460 3e 70 52 65 61 6c 2c 20 6f 70 2c 20 70 41 72 67  >pReal, op, pArg
20470 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
20480 49 54 45 5f 4f 4b 20 26 26 20 6f 70 3d 3d 53 51  ITE_OK && op==SQ
20490 4c 49 54 45 5f 46 43 4e 54 4c 5f 56 46 53 4e 41  LITE_FCNTL_VFSNA
204a0 4d 45 20 29 7b 0a 20 20 20 20 72 62 75 5f 76 66  ME ){.    rbu_vf
204b0 73 20 2a 70 52 62 75 56 66 73 20 3d 20 70 2d 3e  s *pRbuVfs = p->
204c0 70 52 62 75 56 66 73 3b 0a 20 20 20 20 63 68 61  pRbuVfs;.    cha
204d0 72 20 2a 7a 49 6e 20 3d 20 2a 28 63 68 61 72 2a  r *zIn = *(char*
204e0 2a 29 70 41 72 67 3b 0a 20 20 20 20 63 68 61 72  *)pArg;.    char
204f0 20 2a 7a 4f 75 74 20 3d 20 73 71 6c 69 74 65 33   *zOut = sqlite3
20500 5f 6d 70 72 69 6e 74 66 28 22 72 62 75 28 25 73  _mprintf("rbu(%s
20510 29 2f 25 7a 22 2c 20 70 52 62 75 56 66 73 2d 3e  )/%z", pRbuVfs->
20520 62 61 73 65 2e 7a 4e 61 6d 65 2c 20 7a 49 6e 29  base.zName, zIn)
20530 3b 0a 20 20 20 20 2a 28 63 68 61 72 2a 2a 29 70  ;.    *(char**)p
20540 41 72 67 20 3d 20 7a 4f 75 74 3b 0a 20 20 20 20  Arg = zOut;.    
20550 69 66 28 20 7a 4f 75 74 3d 3d 30 20 29 20 72 63  if( zOut==0 ) rc
20560 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
20570 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
20580 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
20590 72 6e 20 74 68 65 20 73 65 63 74 6f 72 2d 73 69  rn the sector-si
205a0 7a 65 20 69 6e 20 62 79 74 65 73 20 66 6f 72 20  ze in bytes for 
205b0 61 6e 20 72 62 75 56 66 73 2d 66 69 6c 65 2e 0a  an rbuVfs-file..
205c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62  */.static int rb
205d0 75 56 66 73 53 65 63 74 6f 72 53 69 7a 65 28 73  uVfsSectorSize(s
205e0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
205f0 6c 65 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20  le){.  rbu_file 
20600 2a 70 20 3d 20 28 72 62 75 5f 66 69 6c 65 20 2a  *p = (rbu_file *
20610 29 70 46 69 6c 65 3b 0a 20 20 72 65 74 75 72 6e  )pFile;.  return
20620 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68   p->pReal->pMeth
20630 6f 64 73 2d 3e 78 53 65 63 74 6f 72 53 69 7a 65  ods->xSectorSize
20640 28 70 2d 3e 70 52 65 61 6c 29 3b 0a 7d 0a 0a 2f  (p->pReal);.}../
20650 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
20660 64 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72  device character
20670 69 73 74 69 63 20 66 6c 61 67 73 20 73 75 70 70  istic flags supp
20680 6f 72 74 65 64 20 62 79 20 61 6e 20 72 62 75 56  orted by an rbuV
20690 66 73 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  fs-file..*/.stat
206a0 69 63 20 69 6e 74 20 72 62 75 56 66 73 44 65 76  ic int rbuVfsDev
206b0 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
206c0 63 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  cs(sqlite3_file 
206d0 2a 70 46 69 6c 65 29 7b 0a 20 20 72 62 75 5f 66  *pFile){.  rbu_f
206e0 69 6c 65 20 2a 70 20 3d 20 28 72 62 75 5f 66 69  ile *p = (rbu_fi
206f0 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 72 65  le *)pFile;.  re
20700 74 75 72 6e 20 70 2d 3e 70 52 65 61 6c 2d 3e 70  turn p->pReal->p
20710 4d 65 74 68 6f 64 73 2d 3e 78 44 65 76 69 63 65  Methods->xDevice
20720 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
20730 70 2d 3e 70 52 65 61 6c 29 3b 0a 7d 0a 0a 2f 2a  p->pReal);.}../*
20740 0a 2a 2a 20 54 61 6b 65 20 6f 72 20 72 65 6c 65  .** Take or rele
20750 61 73 65 20 61 20 73 68 61 72 65 64 2d 6d 65 6d  ase a shared-mem
20760 6f 72 79 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61  ory lock..*/.sta
20770 74 69 63 20 69 6e 74 20 72 62 75 56 66 73 53 68  tic int rbuVfsSh
20780 6d 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  mLock(sqlite3_fi
20790 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20 6f  le *pFile, int o
207a0 66 73 74 2c 20 69 6e 74 20 6e 2c 20 69 6e 74 20  fst, int n, int 
207b0 66 6c 61 67 73 29 7b 0a 20 20 72 62 75 5f 66 69  flags){.  rbu_fi
207c0 6c 65 20 2a 70 20 3d 20 28 72 62 75 5f 66 69 6c  le *p = (rbu_fil
207d0 65 2a 29 70 46 69 6c 65 3b 0a 20 20 73 71 6c 69  e*)pFile;.  sqli
207e0 74 65 33 72 62 75 20 2a 70 52 62 75 20 3d 20 70  te3rbu *pRbu = p
207f0 2d 3e 70 52 62 75 3b 0a 20 20 69 6e 74 20 72 63  ->pRbu;.  int rc
20800 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 23   = SQLITE_OK;..#
20810 69 66 64 65 66 20 53 51 4c 49 54 45 5f 41 4d 41  ifdef SQLITE_AMA
20820 4c 47 41 4d 41 54 49 4f 4e 0a 20 20 20 20 61 73  LGAMATION.    as
20830 73 65 72 74 28 20 57 41 4c 5f 43 4b 50 54 5f 4c  sert( WAL_CKPT_L
20840 4f 43 4b 3d 3d 31 20 29 3b 0a 23 65 6e 64 69 66  OCK==1 );.#endif
20850 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f  ..  assert( p->o
20860 70 65 6e 46 6c 61 67 73 20 26 20 28 53 51 4c 49  penFlags & (SQLI
20870 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 7c  TE_OPEN_MAIN_DB|
20880 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
20890 5f 44 42 29 20 29 3b 0a 20 20 69 66 28 20 70 52  _DB) );.  if( pR
208a0 62 75 20 26 26 20 28 70 52 62 75 2d 3e 65 53 74  bu && (pRbu->eSt
208b0 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4f  age==RBU_STAGE_O
208c0 41 4c 20 7c 7c 20 70 52 62 75 2d 3e 65 53 74 61  AL || pRbu->eSta
208d0 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4d 4f  ge==RBU_STAGE_MO
208e0 56 45 29 20 29 7b 0a 20 20 20 20 2f 2a 20 4d 61  VE) ){.    /* Ma
208f0 67 69 63 20 6e 75 6d 62 65 72 20 31 20 69 73 20  gic number 1 is 
20900 74 68 65 20 57 41 4c 5f 43 4b 50 54 5f 4c 4f 43  the WAL_CKPT_LOC
20910 4b 20 6c 6f 63 6b 2e 20 50 72 65 76 65 6e 74 69  K lock. Preventi
20920 6e 67 20 53 51 4c 69 74 65 20 66 72 6f 6d 0a 20  ng SQLite from. 
20930 20 20 20 2a 2a 20 74 61 6b 69 6e 67 20 74 68 69     ** taking thi
20940 73 20 6c 6f 63 6b 20 61 6c 73 6f 20 70 72 65 76  s lock also prev
20950 65 6e 74 73 20 61 6e 79 20 63 68 65 63 6b 70 6f  ents any checkpo
20960 69 6e 74 73 20 66 72 6f 6d 20 6f 63 63 75 72 72  ints from occurr
20970 69 6e 67 2e 20 0a 20 20 20 20 2a 2a 20 74 6f 64  ing. .    ** tod
20980 6f 3a 20 72 65 61 6c 6c 79 2c 20 69 74 27 73 20  o: really, it's 
20990 6e 6f 74 20 63 6c 65 61 72 20 77 68 79 20 74 68  not clear why th
209a0 69 73 20 6d 69 67 68 74 20 6f 63 63 75 72 2c 20  is might occur, 
209b0 61 73 20 0a 20 20 20 20 2a 2a 20 77 61 6c 5f 61  as .    ** wal_a
209c0 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 20 6f 75  utocheckpoint ou
209d0 67 68 74 20 74 6f 20 62 65 20 74 75 72 6e 65 64  ght to be turned
209e0 20 6f 66 66 2e 20 20 2a 2f 0a 20 20 20 20 69 66   off.  */.    if
209f0 28 20 6f 66 73 74 3d 3d 57 41 4c 5f 4c 4f 43 4b  ( ofst==WAL_LOCK
20a00 5f 43 4b 50 54 20 26 26 20 6e 3d 3d 31 20 29 20  _CKPT && n==1 ) 
20a10 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
20a20 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
20a30 6e 74 20 62 43 61 70 74 75 72 65 20 3d 20 30 3b  nt bCapture = 0;
20a40 0a 20 20 20 20 69 66 28 20 6e 3d 3d 31 20 26 26  .    if( n==1 &&
20a50 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
20a60 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 0a  _SHM_EXCLUSIVE).
20a70 20 20 20 20 20 26 26 20 70 52 62 75 20 26 26 20       && pRbu && 
20a80 70 52 62 75 2d 3e 65 53 74 61 67 65 3d 3d 52 42  pRbu->eStage==RB
20a90 55 5f 53 54 41 47 45 5f 43 41 50 54 55 52 45 0a  U_STAGE_CAPTURE.
20aa0 20 20 20 20 20 26 26 20 28 6f 66 73 74 3d 3d 57       && (ofst==W
20ab0 41 4c 5f 4c 4f 43 4b 5f 57 52 49 54 45 20 7c 7c  AL_LOCK_WRITE ||
20ac0 20 6f 66 73 74 3d 3d 57 41 4c 5f 4c 4f 43 4b 5f   ofst==WAL_LOCK_
20ad0 43 4b 50 54 20 7c 7c 20 6f 66 73 74 3d 3d 57 41  CKPT || ofst==WA
20ae0 4c 5f 4c 4f 43 4b 5f 52 45 41 44 30 29 0a 20 20  L_LOCK_READ0).  
20af0 20 20 29 7b 0a 20 20 20 20 20 20 62 43 61 70 74    ){.      bCapt
20b00 75 72 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a  ure = 1;.    }..
20b10 20 20 20 20 69 66 28 20 62 43 61 70 74 75 72 65      if( bCapture
20b20 3d 3d 30 20 7c 7c 20 30 3d 3d 28 66 6c 61 67 73  ==0 || 0==(flags
20b30 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e   & SQLITE_SHM_UN
20b40 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 20 20 72  LOCK) ){.      r
20b50 63 20 3d 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d  c = p->pReal->pM
20b60 65 74 68 6f 64 73 2d 3e 78 53 68 6d 4c 6f 63 6b  ethods->xShmLock
20b70 28 70 2d 3e 70 52 65 61 6c 2c 20 6f 66 73 74 2c  (p->pReal, ofst,
20b80 20 6e 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20   n, flags);.    
20b90 20 20 69 66 28 20 62 43 61 70 74 75 72 65 20 26    if( bCapture &
20ba0 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
20bb0 29 7b 0a 20 20 20 20 20 20 20 20 70 52 62 75 2d  ){.        pRbu-
20bc0 3e 6d 4c 6f 63 6b 20 7c 3d 20 28 31 20 3c 3c 20  >mLock |= (1 << 
20bd0 6f 66 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ofst);.      }. 
20be0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
20bf0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
20c00 4f 62 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72  Obtain a pointer
20c10 20 74 6f 20 61 20 6d 61 70 70 69 6e 67 20 6f 66   to a mapping of
20c20 20 61 20 73 69 6e 67 6c 65 20 33 32 4b 69 42 20   a single 32KiB 
20c30 70 61 67 65 20 6f 66 20 74 68 65 20 2a 2d 73 68  page of the *-sh
20c40 6d 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  m file..*/.stati
20c50 63 20 69 6e 74 20 72 62 75 56 66 73 53 68 6d 4d  c int rbuVfsShmM
20c60 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  ap(.  sqlite3_fi
20c70 6c 65 20 2a 70 46 69 6c 65 2c 20 0a 20 20 69 6e  le *pFile, .  in
20c80 74 20 69 52 65 67 69 6f 6e 2c 20 0a 20 20 69 6e  t iRegion, .  in
20c90 74 20 73 7a 52 65 67 69 6f 6e 2c 20 0a 20 20 69  t szRegion, .  i
20ca0 6e 74 20 69 73 57 72 69 74 65 2c 20 0a 20 20 76  nt isWrite, .  v
20cb0 6f 69 64 20 76 6f 6c 61 74 69 6c 65 20 2a 2a 70  oid volatile **p
20cc0 70 0a 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20  p.){.  rbu_file 
20cd0 2a 70 20 3d 20 28 72 62 75 5f 66 69 6c 65 2a 29  *p = (rbu_file*)
20ce0 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20 72 63 20  pFile;.  int rc 
20cf0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
20d00 6e 74 20 65 53 74 61 67 65 20 3d 20 28 70 2d 3e  nt eStage = (p->
20d10 70 52 62 75 20 3f 20 70 2d 3e 70 52 62 75 2d 3e  pRbu ? p->pRbu->
20d20 65 53 74 61 67 65 20 3a 20 30 29 3b 0a 0a 20 20  eStage : 0);..  
20d30 2f 2a 20 49 66 20 6e 6f 74 20 69 6e 20 52 42 55  /* If not in RBU
20d40 5f 53 54 41 47 45 5f 4f 41 4c 2c 20 61 6c 6c 6f  _STAGE_OAL, allo
20d50 77 20 74 68 69 73 20 63 61 6c 6c 20 74 6f 20 70  w this call to p
20d60 61 73 73 20 74 68 72 6f 75 67 68 2e 20 4f 72 2c  ass through. Or,
20d70 20 69 66 20 74 68 69 73 0a 20 20 2a 2a 20 72 62   if this.  ** rb
20d80 75 20 69 73 20 69 6e 20 74 68 65 20 52 42 55 5f  u is in the RBU_
20d90 53 54 41 47 45 5f 4f 41 4c 20 73 74 61 74 65 2c  STAGE_OAL state,
20da0 20 75 73 65 20 68 65 61 70 20 6d 65 6d 6f 72 79   use heap memory
20db0 20 66 6f 72 20 2a 2d 73 68 6d 20 73 70 61 63 65   for *-shm space
20dc0 20 0a 20 20 2a 2a 20 69 6e 73 74 65 61 64 20 6f   .  ** instead o
20dd0 66 20 61 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  f a file on disk
20de0 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
20df0 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20 28  p->openFlags & (
20e00 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
20e10 5f 44 42 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  _DB|SQLITE_OPEN_
20e20 54 45 4d 50 5f 44 42 29 20 29 3b 0a 20 20 69 66  TEMP_DB) );.  if
20e30 28 20 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54  ( eStage==RBU_ST
20e40 41 47 45 5f 4f 41 4c 20 7c 7c 20 65 53 74 61 67  AGE_OAL || eStag
20e50 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4d 4f 56  e==RBU_STAGE_MOV
20e60 45 20 29 7b 0a 20 20 20 20 69 66 28 20 69 52 65  E ){.    if( iRe
20e70 67 69 6f 6e 3c 3d 70 2d 3e 6e 53 68 6d 20 29 7b  gion<=p->nShm ){
20e80 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65  .      int nByte
20e90 20 3d 20 28 69 52 65 67 69 6f 6e 2b 31 29 20 2a   = (iRegion+1) *
20ea0 20 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 3b 0a   sizeof(char*);.
20eb0 20 20 20 20 20 20 63 68 61 72 20 2a 2a 61 70 4e        char **apN
20ec0 65 77 20 3d 20 28 63 68 61 72 2a 2a 29 73 71 6c  ew = (char**)sql
20ed0 69 74 65 33 5f 72 65 61 6c 6c 6f 63 36 34 28 70  ite3_realloc64(p
20ee0 2d 3e 61 70 53 68 6d 2c 20 6e 42 79 74 65 29 3b  ->apShm, nByte);
20ef0 0a 20 20 20 20 20 20 69 66 28 20 61 70 4e 65 77  .      if( apNew
20f00 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
20f10 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
20f20 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
20f30 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 61         memset(&a
20f40 70 4e 65 77 5b 70 2d 3e 6e 53 68 6d 5d 2c 20 30  pNew[p->nShm], 0
20f50 2c 20 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 20  , sizeof(char*) 
20f60 2a 20 28 31 20 2b 20 69 52 65 67 69 6f 6e 20 2d  * (1 + iRegion -
20f70 20 70 2d 3e 6e 53 68 6d 29 29 3b 0a 20 20 20 20   p->nShm));.    
20f80 20 20 20 20 70 2d 3e 61 70 53 68 6d 20 3d 20 61      p->apShm = a
20f90 70 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 70 2d  pNew;.        p-
20fa0 3e 6e 53 68 6d 20 3d 20 69 52 65 67 69 6f 6e 2b  >nShm = iRegion+
20fb0 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
20fc0 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ..    if( rc==SQ
20fd0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 61 70  LITE_OK && p->ap
20fe0 53 68 6d 5b 69 52 65 67 69 6f 6e 5d 3d 3d 30 20  Shm[iRegion]==0 
20ff0 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70  ){.      char *p
21000 4e 65 77 20 3d 20 28 63 68 61 72 2a 29 73 71 6c  New = (char*)sql
21010 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 73 7a  ite3_malloc64(sz
21020 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 69  Region);.      i
21030 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
21040 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
21050 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d  E_NOMEM;.      }
21060 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65  else{.        me
21070 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 7a  mset(pNew, 0, sz
21080 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20  Region);.       
21090 20 70 2d 3e 61 70 53 68 6d 5b 69 52 65 67 69 6f   p->apShm[iRegio
210a0 6e 5d 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20  n] = pNew;.     
210b0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66   }.    }..    if
210c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
210d0 29 7b 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 70  ){.      *pp = p
210e0 2d 3e 61 70 53 68 6d 5b 69 52 65 67 69 6f 6e 5d  ->apShm[iRegion]
210f0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
21100 20 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20 20 20     *pp = 0;.    
21110 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  }.  }else{.    a
21120 73 73 65 72 74 28 20 70 2d 3e 61 70 53 68 6d 3d  ssert( p->apShm=
21130 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70  =0 );.    rc = p
21140 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64  ->pReal->pMethod
21150 73 2d 3e 78 53 68 6d 4d 61 70 28 70 2d 3e 70 52  s->xShmMap(p->pR
21160 65 61 6c 2c 20 69 52 65 67 69 6f 6e 2c 20 73 7a  eal, iRegion, sz
21170 52 65 67 69 6f 6e 2c 20 69 73 57 72 69 74 65 2c  Region, isWrite,
21180 20 70 70 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74   pp);.  }..  ret
21190 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
211a0 20 4d 65 6d 6f 72 79 20 62 61 72 72 69 65 72 2e   Memory barrier.
211b0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
211c0 72 62 75 56 66 73 53 68 6d 42 61 72 72 69 65 72  rbuVfsShmBarrier
211d0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70  (sqlite3_file *p
211e0 46 69 6c 65 29 7b 0a 20 20 72 62 75 5f 66 69 6c  File){.  rbu_fil
211f0 65 20 2a 70 20 3d 20 28 72 62 75 5f 66 69 6c 65  e *p = (rbu_file
21200 20 2a 29 70 46 69 6c 65 3b 0a 20 20 70 2d 3e 70   *)pFile;.  p->p
21210 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e  Real->pMethods->
21220 78 53 68 6d 42 61 72 72 69 65 72 28 70 2d 3e 70  xShmBarrier(p->p
21230 52 65 61 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Real);.}../*.** 
21240 54 68 65 20 78 53 68 6d 55 6e 6d 61 70 20 6d 65  The xShmUnmap me
21250 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  thod..*/.static 
21260 69 6e 74 20 72 62 75 56 66 73 53 68 6d 55 6e 6d  int rbuVfsShmUnm
21270 61 70 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ap(sqlite3_file 
21280 2a 70 46 69 6c 65 2c 20 69 6e 74 20 64 65 6c 46  *pFile, int delF
21290 6c 61 67 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65  lag){.  rbu_file
212a0 20 2a 70 20 3d 20 28 72 62 75 5f 66 69 6c 65 2a   *p = (rbu_file*
212b0 29 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20 72 63  )pFile;.  int rc
212c0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
212d0 69 6e 74 20 65 53 74 61 67 65 20 3d 20 28 70 2d  int eStage = (p-
212e0 3e 70 52 62 75 20 3f 20 70 2d 3e 70 52 62 75 2d  >pRbu ? p->pRbu-
212f0 3e 65 53 74 61 67 65 20 3a 20 30 29 3b 0a 0a 20  >eStage : 0);.. 
21300 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 65 6e   assert( p->open
21310 46 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f  Flags & (SQLITE_
21320 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 7c 53 51 4c  OPEN_MAIN_DB|SQL
21330 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42  ITE_OPEN_TEMP_DB
21340 29 20 29 3b 0a 20 20 69 66 28 20 65 53 74 61 67  ) );.  if( eStag
21350 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c  e==RBU_STAGE_OAL
21360 20 7c 7c 20 65 53 74 61 67 65 3d 3d 52 42 55 5f   || eStage==RBU_
21370 53 54 41 47 45 5f 4d 4f 56 45 20 29 7b 0a 20 20  STAGE_MOVE ){.  
21380 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20    /* no-op */.  
21390 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 52 65  }else{.    /* Re
213a0 6c 65 61 73 65 20 74 68 65 20 63 68 65 63 6b 70  lease the checkp
213b0 6f 69 6e 74 65 72 20 61 6e 64 20 77 72 69 74 65  ointer and write
213c0 72 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 72  r locks */.    r
213d0 62 75 55 6e 6c 6f 63 6b 53 68 6d 28 70 29 3b 0a  buUnlockShm(p);.
213e0 20 20 20 20 72 63 20 3d 20 70 2d 3e 70 52 65 61      rc = p->pRea
213f0 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53 68  l->pMethods->xSh
21400 6d 55 6e 6d 61 70 28 70 2d 3e 70 52 65 61 6c 2c  mUnmap(p->pReal,
21410 20 64 65 6c 46 6c 61 67 29 3b 0a 20 20 7d 0a 20   delFlag);.  }. 
21420 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
21430 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 61 74 20  *.** Given that 
21440 7a 57 61 6c 20 70 6f 69 6e 74 73 20 74 6f 20 61  zWal points to a
21450 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
21460 6e 67 20 61 20 77 61 6c 20 66 69 6c 65 20 6e 61  ng a wal file na
21470 6d 65 20 70 61 73 73 65 64 20 74 6f 20 0a 2a 2a  me passed to .**
21480 20 65 69 74 68 65 72 20 74 68 65 20 78 4f 70 65   either the xOpe
21490 6e 28 29 20 6f 72 20 78 41 63 63 65 73 73 28 29  n() or xAccess()
214a0 20 56 46 53 20 6d 65 74 68 6f 64 2c 20 72 65 74   VFS method, ret
214b0 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
214c0 20 74 68 65 0a 2a 2a 20 66 69 6c 65 2d 68 61 6e   the.** file-han
214d0 64 6c 65 20 6f 70 65 6e 65 64 20 62 79 20 74 68  dle opened by th
214e0 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20  e same database 
214f0 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 6e 20 74 68  connection on th
21500 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a  e corresponding.
21510 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
21520 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 72 62 75 5f  ..*/.static rbu_
21530 66 69 6c 65 20 2a 72 62 75 46 69 6e 64 4d 61 69  file *rbuFindMai
21540 6e 64 62 28 72 62 75 5f 76 66 73 20 2a 70 52 62  ndb(rbu_vfs *pRb
21550 75 56 66 73 2c 20 63 6f 6e 73 74 20 63 68 61 72  uVfs, const char
21560 20 2a 7a 57 61 6c 29 7b 0a 20 20 72 62 75 5f 66   *zWal){.  rbu_f
21570 69 6c 65 20 2a 70 44 62 3b 0a 20 20 73 71 6c 69  ile *pDb;.  sqli
21580 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
21590 70 52 62 75 56 66 73 2d 3e 6d 75 74 65 78 29 3b  pRbuVfs->mutex);
215a0 0a 20 20 66 6f 72 28 70 44 62 3d 70 52 62 75 56  .  for(pDb=pRbuV
215b0 66 73 2d 3e 70 4d 61 69 6e 3b 20 70 44 62 20 26  fs->pMain; pDb &
215c0 26 20 70 44 62 2d 3e 7a 57 61 6c 21 3d 7a 57 61  & pDb->zWal!=zWa
215d0 6c 3b 20 70 44 62 3d 70 44 62 2d 3e 70 4d 61 69  l; pDb=pDb->pMai
215e0 6e 4e 65 78 74 29 7b 7d 0a 20 20 73 71 6c 69 74  nNext){}.  sqlit
215f0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
21600 52 62 75 56 66 73 2d 3e 6d 75 74 65 78 29 3b 0a  RbuVfs->mutex);.
21610 20 20 72 65 74 75 72 6e 20 70 44 62 3b 0a 7d 0a    return pDb;.}.
21620 0a 2f 2a 20 0a 2a 2a 20 41 20 6d 61 69 6e 20 64  ./* .** A main d
21630 61 74 61 62 61 73 65 20 6e 61 6d 65 64 20 7a 4e  atabase named zN
21640 61 6d 65 20 68 61 73 20 6a 75 73 74 20 62 65 65  ame has just bee
21650 6e 20 6f 70 65 6e 65 64 2e 20 54 68 65 20 66 6f  n opened. The fo
21660 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20 66 75 6e 63  llowing .** func
21670 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 70  tion returns a p
21680 6f 69 6e 74 65 72 20 74 6f 20 61 20 62 75 66 66  ointer to a buff
21690 65 72 20 6f 77 6e 65 64 20 62 79 20 53 51 4c 69  er owned by SQLi
216a0 74 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  te that contains
216b0 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  .** the name of 
216c0 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 74  the *-wal file t
216d0 68 69 73 20 64 62 20 63 6f 6e 6e 65 63 74 69 6f  his db connectio
216e0 6e 20 77 69 6c 6c 20 75 73 65 2e 20 53 51 4c 69  n will use. SQLi
216f0 74 65 0a 2a 2a 20 68 61 70 70 65 6e 73 20 74 6f  te.** happens to
21700 20 70 61 73 73 20 61 20 70 6f 69 6e 74 65 72 20   pass a pointer 
21710 74 6f 20 74 68 69 73 20 62 75 66 66 65 72 20 77  to this buffer w
21720 68 65 6e 20 75 73 69 6e 67 20 78 41 63 63 65 73  hen using xAcces
21730 73 28 29 0a 2a 2a 20 6f 72 20 78 4f 70 65 6e 28  s().** or xOpen(
21740 29 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20  ) to operate on 
21750 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 2e 20  the *-wal file. 
21760 20 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73   .*/.static cons
21770 74 20 63 68 61 72 20 2a 72 62 75 4d 61 69 6e 54  t char *rbuMainT
21780 6f 57 61 6c 28 63 6f 6e 73 74 20 63 68 61 72 20  oWal(const char 
21790 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 66 6c 61 67  *zName, int flag
217a0 73 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 28 69  s){.  int n = (i
217b0 6e 74 29 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29  nt)strlen(zName)
217c0 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
217d0 7a 20 3d 20 26 7a 4e 61 6d 65 5b 6e 5d 3b 0a 20  z = &zName[n];. 
217e0 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c   if( flags & SQL
217f0 49 54 45 5f 4f 50 45 4e 5f 55 52 49 20 29 7b 0a  ITE_OPEN_URI ){.
21800 20 20 20 20 69 6e 74 20 6f 64 64 20 3d 20 30 3b      int odd = 0;
21810 0a 20 20 20 20 77 68 69 6c 65 28 20 31 20 29 7b  .    while( 1 ){
21820 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d  .      if( z[0]=
21830 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 64  =0 ){.        od
21840 64 20 3d 20 31 20 2d 20 6f 64 64 3b 0a 20 20 20  d = 1 - odd;.   
21850 20 20 20 20 20 69 66 28 20 6f 64 64 20 26 26 20       if( odd && 
21860 7a 5b 31 5d 3d 3d 30 20 29 20 62 72 65 61 6b 3b  z[1]==0 ) break;
21870 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
21880 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 20  ++;.    }.    z 
21890 2b 3d 20 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  += 2;.  }else{. 
218a0 20 20 20 77 68 69 6c 65 28 20 2a 7a 3d 3d 30 20     while( *z==0 
218b0 29 20 7a 2b 2b 3b 0a 20 20 7d 0a 20 20 7a 20 2b  ) z++;.  }.  z +
218c0 3d 20 28 6e 20 2b 20 38 20 2b 20 31 29 3b 0a 20  = (n + 8 + 1);. 
218d0 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a   return z;.}../*
218e0 0a 2a 2a 20 4f 70 65 6e 20 61 6e 20 72 62 75 20  .** Open an rbu 
218f0 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a  file handle..*/.
21900 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 56 66  static int rbuVf
21910 73 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33  sOpen(.  sqlite3
21920 5f 76 66 73 20 2a 70 56 66 73 2c 0a 20 20 63 6f  _vfs *pVfs,.  co
21930 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
21940 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
21950 2a 70 46 69 6c 65 2c 0a 20 20 69 6e 74 20 66 6c  *pFile,.  int fl
21960 61 67 73 2c 0a 20 20 69 6e 74 20 2a 70 4f 75 74  ags,.  int *pOut
21970 46 6c 61 67 73 0a 29 7b 0a 20 20 73 74 61 74 69  Flags.){.  stati
21980 63 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  c sqlite3_io_met
21990 68 6f 64 73 20 72 62 75 76 66 73 5f 69 6f 5f 6d  hods rbuvfs_io_m
219a0 65 74 68 6f 64 73 20 3d 20 7b 0a 20 20 20 20 32  ethods = {.    2
219b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
219c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
219d0 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 20 20  iVersion */.    
219e0 72 62 75 56 66 73 43 6c 6f 73 65 2c 20 20 20 20  rbuVfsClose,    
219f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21a00 20 78 43 6c 6f 73 65 20 2a 2f 0a 20 20 20 20 72   xClose */.    r
21a10 62 75 56 66 73 52 65 61 64 2c 20 20 20 20 20 20  buVfsRead,      
21a20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21a30 78 52 65 61 64 20 2a 2f 0a 20 20 20 20 72 62 75  xRead */.    rbu
21a40 56 66 73 57 72 69 74 65 2c 20 20 20 20 20 20 20  VfsWrite,       
21a50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 57             /* xW
21a60 72 69 74 65 20 2a 2f 0a 20 20 20 20 72 62 75 56  rite */.    rbuV
21a70 66 73 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20  fsTruncate,     
21a80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 54 72            /* xTr
21a90 75 6e 63 61 74 65 20 2a 2f 0a 20 20 20 20 72 62  uncate */.    rb
21aa0 75 56 66 73 53 79 6e 63 2c 20 20 20 20 20 20 20  uVfsSync,       
21ab0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
21ac0 53 79 6e 63 20 2a 2f 0a 20 20 20 20 72 62 75 56  Sync */.    rbuV
21ad0 66 73 46 69 6c 65 53 69 7a 65 2c 20 20 20 20 20  fsFileSize,     
21ae0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69            /* xFi
21af0 6c 65 53 69 7a 65 20 2a 2f 0a 20 20 20 20 72 62  leSize */.    rb
21b00 75 56 66 73 4c 6f 63 6b 2c 20 20 20 20 20 20 20  uVfsLock,       
21b10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
21b20 4c 6f 63 6b 20 2a 2f 0a 20 20 20 20 72 62 75 56  Lock */.    rbuV
21b30 66 73 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20  fsUnlock,       
21b40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
21b50 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 72 62 75 56  lock */.    rbuV
21b60 66 73 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  fsCheckReservedL
21b70 6f 63 6b 2c 20 20 20 20 20 20 2f 2a 20 78 43 68  ock,      /* xCh
21b80 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
21b90 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 46 69 6c  */.    rbuVfsFil
21ba0 65 43 6f 6e 74 72 6f 6c 2c 20 20 20 20 20 20 20  eControl,       
21bb0 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 43 6f 6e       /* xFileCon
21bc0 74 72 6f 6c 20 2a 2f 0a 20 20 20 20 72 62 75 56  trol */.    rbuV
21bd0 66 73 53 65 63 74 6f 72 53 69 7a 65 2c 20 20 20  fsSectorSize,   
21be0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 65            /* xSe
21bf0 63 74 6f 72 53 69 7a 65 20 2a 2f 0a 20 20 20 20  ctorSize */.    
21c00 72 62 75 56 66 73 44 65 76 69 63 65 43 68 61 72  rbuVfsDeviceChar
21c10 61 63 74 65 72 69 73 74 69 63 73 2c 20 20 2f 2a  acteristics,  /*
21c20 20 78 44 65 76 69 63 65 43 68 61 72 61 63 74 65   xDeviceCharacte
21c30 72 69 73 74 69 63 73 20 2a 2f 0a 20 20 20 20 72  ristics */.    r
21c40 62 75 56 66 73 53 68 6d 4d 61 70 2c 20 20 20 20  buVfsShmMap,    
21c50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21c60 78 53 68 6d 4d 61 70 20 2a 2f 0a 20 20 20 20 72  xShmMap */.    r
21c70 62 75 56 66 73 53 68 6d 4c 6f 63 6b 2c 20 20 20  buVfsShmLock,   
21c80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21c90 78 53 68 6d 4c 6f 63 6b 20 2a 2f 0a 20 20 20 20  xShmLock */.    
21ca0 72 62 75 56 66 73 53 68 6d 42 61 72 72 69 65 72  rbuVfsShmBarrier
21cb0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
21cc0 20 78 53 68 6d 42 61 72 72 69 65 72 20 2a 2f 0a   xShmBarrier */.
21cd0 20 20 20 20 72 62 75 56 66 73 53 68 6d 55 6e 6d      rbuVfsShmUnm
21ce0 61 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ap,             
21cf0 20 20 2f 2a 20 78 53 68 6d 55 6e 6d 61 70 20 2a    /* xShmUnmap *
21d00 2f 0a 20 20 20 20 30 2c 20 30 20 20 20 20 20 20  /.    0, 0      
21d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21d20 20 20 20 20 2f 2a 20 78 46 65 74 63 68 2c 20 78      /* xFetch, x
21d30 55 6e 66 65 74 63 68 20 2a 2f 0a 20 20 7d 3b 0a  Unfetch */.  };.
21d40 20 20 72 62 75 5f 76 66 73 20 2a 70 52 62 75 56    rbu_vfs *pRbuV
21d50 66 73 20 3d 20 28 72 62 75 5f 76 66 73 2a 29 70  fs = (rbu_vfs*)p
21d60 56 66 73 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76  Vfs;.  sqlite3_v
21d70 66 73 20 2a 70 52 65 61 6c 56 66 73 20 3d 20 70  fs *pRealVfs = p
21d80 52 62 75 56 66 73 2d 3e 70 52 65 61 6c 56 66 73  RbuVfs->pRealVfs
21d90 3b 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 46  ;.  rbu_file *pF
21da0 64 20 3d 20 28 72 62 75 5f 66 69 6c 65 20 2a 29  d = (rbu_file *)
21db0 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20 72 63 20  pFile;.  int rc 
21dc0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63  = SQLITE_OK;.  c
21dd0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 65 6e  onst char *zOpen
21de0 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 69 6e 74 20   = zName;.  int 
21df0 6f 66 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a  oflags = flags;.
21e00 0a 20 20 6d 65 6d 73 65 74 28 70 46 64 2c 20 30  .  memset(pFd, 0
21e10 2c 20 73 69 7a 65 6f 66 28 72 62 75 5f 66 69 6c  , sizeof(rbu_fil
21e20 65 29 29 3b 0a 20 20 70 46 64 2d 3e 70 52 65 61  e));.  pFd->pRea
21e30 6c 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c  l = (sqlite3_fil
21e40 65 2a 29 26 70 46 64 5b 31 5d 3b 0a 20 20 70 46  e*)&pFd[1];.  pF
21e50 64 2d 3e 70 52 62 75 56 66 73 20 3d 20 70 52 62  d->pRbuVfs = pRb
21e60 75 56 66 73 3b 0a 20 20 70 46 64 2d 3e 6f 70 65  uVfs;.  pFd->ope
21e70 6e 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a  nFlags = flags;.
21e80 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20    if( zName ){. 
21e90 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 53     if( flags & S
21ea0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
21eb0 44 42 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  DB ){.      /* A
21ec0 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 68   main database h
21ed0 61 73 20 6a 75 73 74 20 62 65 65 6e 20 6f 70 65  as just been ope
21ee0 6e 65 64 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ned. The followi
21ef0 6e 67 20 62 6c 6f 63 6b 20 73 65 74 73 0a 20 20  ng block sets.  
21f00 20 20 20 20 2a 2a 20 28 70 46 64 2d 3e 7a 57 61      ** (pFd->zWa
21f10 6c 29 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61  l) to point to a
21f20 20 62 75 66 66 65 72 20 6f 77 6e 65 64 20 62 79   buffer owned by
21f30 20 53 51 4c 69 74 65 20 74 68 61 74 20 63 6f 6e   SQLite that con
21f40 74 61 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20 74  tains.      ** t
21f50 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 2a  he name of the *
21f60 2d 77 61 6c 20 66 69 6c 65 20 74 68 69 73 20 64  -wal file this d
21f70 62 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 6c  b connection wil
21f80 6c 20 75 73 65 2e 20 53 51 4c 69 74 65 0a 20 20  l use. SQLite.  
21f90 20 20 20 20 2a 2a 20 68 61 70 70 65 6e 73 20 74      ** happens t
21fa0 6f 20 70 61 73 73 20 61 20 70 6f 69 6e 74 65 72  o pass a pointer
21fb0 20 74 6f 20 74 68 69 73 20 62 75 66 66 65 72 20   to this buffer 
21fc0 77 68 65 6e 20 75 73 69 6e 67 20 78 41 63 63 65  when using xAcce
21fd0 73 73 28 29 0a 20 20 20 20 20 20 2a 2a 20 6f 72  ss().      ** or
21fe0 20 78 4f 70 65 6e 28 29 20 74 6f 20 6f 70 65 72   xOpen() to oper
21ff0 61 74 65 20 6f 6e 20 74 68 65 20 2a 2d 77 61 6c  ate on the *-wal
22000 20 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 20   file.  */.     
22010 20 70 46 64 2d 3e 7a 57 61 6c 20 3d 20 72 62 75   pFd->zWal = rbu
22020 4d 61 69 6e 54 6f 57 61 6c 28 7a 4e 61 6d 65 2c  MainToWal(zName,
22030 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 20   flags);.    }. 
22040 20 20 20 65 6c 73 65 20 69 66 28 20 66 6c 61 67     else if( flag
22050 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
22060 57 41 4c 20 29 7b 0a 20 20 20 20 20 20 72 62 75  WAL ){.      rbu
22070 5f 66 69 6c 65 20 2a 70 44 62 20 3d 20 72 62 75  _file *pDb = rbu
22080 46 69 6e 64 4d 61 69 6e 64 62 28 70 52 62 75 56  FindMaindb(pRbuV
22090 66 73 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  fs, zName);.    
220a0 20 20 69 66 28 20 70 44 62 20 29 7b 0a 20 20 20    if( pDb ){.   
220b0 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 52       if( pDb->pR
220c0 62 75 20 26 26 20 70 44 62 2d 3e 70 52 62 75 2d  bu && pDb->pRbu-
220d0 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41  >eStage==RBU_STA
220e0 47 45 5f 4f 41 4c 20 29 7b 0a 20 20 20 20 20 20  GE_OAL ){.      
220f0 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c      /* This call
22100 20 69 73 20 74 6f 20 6f 70 65 6e 20 61 20 2a 2d   is to open a *-
22110 77 61 6c 20 66 69 6c 65 2e 20 49 6e 74 65 61 64  wal file. Intead
22120 2c 20 6f 70 65 6e 20 74 68 65 20 2a 2d 6f 61 6c  , open the *-oal
22130 2e 20 54 68 69 73 0a 20 20 20 20 20 20 20 20 20  . This.         
22140 20 2a 2a 20 63 6f 64 65 20 65 6e 73 75 72 65 73   ** code ensures
22150 20 74 68 61 74 20 74 68 65 20 73 74 72 69 6e 67   that the string
22160 20 70 61 73 73 65 64 20 74 6f 20 78 4f 70 65 6e   passed to xOpen
22170 28 29 20 69 73 20 74 65 72 6d 69 6e 61 74 65 64  () is terminated
22180 20 62 79 20 61 0a 20 20 20 20 20 20 20 20 20 20   by a.          
22190 2a 2a 20 70 61 69 72 20 6f 66 20 27 5c 30 27 20  ** pair of '\0' 
221a0 62 79 74 65 73 20 69 6e 20 63 61 73 65 20 74 68  bytes in case th
221b0 65 20 56 46 53 20 61 74 74 65 6d 70 74 73 20 74  e VFS attempts t
221c0 6f 20 65 78 74 72 61 63 74 20 61 20 55 52 49 20  o extract a URI 
221d0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61  .          ** pa
221e0 72 61 6d 65 74 65 72 20 66 72 6f 6d 20 69 74 2e  rameter from it.
221f0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 63    */.          c
22200 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 61 73 65  onst char *zBase
22210 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20   = zName;.      
22220 20 20 20 20 73 69 7a 65 5f 74 20 6e 43 6f 70 79      size_t nCopy
22230 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72  ;.          char
22240 20 2a 7a 43 6f 70 79 3b 0a 20 20 20 20 20 20 20   *zCopy;.       
22250 20 20 20 69 66 28 20 72 62 75 49 73 56 61 63 75     if( rbuIsVacu
22260 75 6d 28 70 44 62 2d 3e 70 52 62 75 29 20 29 7b  um(pDb->pRbu) ){
22270 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 42 61  .            zBa
22280 73 65 20 3d 20 73 71 6c 69 74 65 33 5f 64 62 5f  se = sqlite3_db_
22290 66 69 6c 65 6e 61 6d 65 28 70 44 62 2d 3e 70 52  filename(pDb->pR
222a0 62 75 2d 3e 64 62 52 62 75 2c 20 22 6d 61 69 6e  bu->dbRbu, "main
222b0 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ");.            
222c0 7a 42 61 73 65 20 3d 20 72 62 75 4d 61 69 6e 54  zBase = rbuMainT
222d0 6f 57 61 6c 28 7a 42 61 73 65 2c 20 53 51 4c 49  oWal(zBase, SQLI
222e0 54 45 5f 4f 50 45 4e 5f 55 52 49 29 3b 0a 20 20  TE_OPEN_URI);.  
222f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
22300 20 20 20 20 6e 43 6f 70 79 20 3d 20 73 74 72 6c      nCopy = strl
22310 65 6e 28 7a 42 61 73 65 29 3b 0a 20 20 20 20 20  en(zBase);.     
22320 20 20 20 20 20 7a 43 6f 70 79 20 3d 20 73 71 6c       zCopy = sql
22330 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 43  ite3_malloc64(nC
22340 6f 70 79 2b 32 29 3b 0a 20 20 20 20 20 20 20 20  opy+2);.        
22350 20 20 69 66 28 20 7a 43 6f 70 79 20 29 7b 0a 20    if( zCopy ){. 
22360 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
22370 79 28 7a 43 6f 70 79 2c 20 7a 42 61 73 65 2c 20  y(zCopy, zBase, 
22380 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 20 20  nCopy);.        
22390 20 20 20 20 7a 43 6f 70 79 5b 6e 43 6f 70 79 2d      zCopy[nCopy-
223a0 33 5d 20 3d 20 27 6f 27 3b 0a 20 20 20 20 20 20  3] = 'o';.      
223b0 20 20 20 20 20 20 7a 43 6f 70 79 5b 6e 43 6f 70        zCopy[nCop
223c0 79 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20  y] = '\0';.     
223d0 20 20 20 20 20 20 20 7a 43 6f 70 79 5b 6e 43 6f         zCopy[nCo
223e0 70 79 2b 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  py+1] = '\0';.  
223f0 20 20 20 20 20 20 20 20 20 20 7a 4f 70 65 6e 20            zOpen 
22400 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 28  = (const char*)(
22410 70 46 64 2d 3e 7a 44 65 6c 20 3d 20 7a 43 6f 70  pFd->zDel = zCop
22420 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  y);.          }e
22430 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
22440 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
22450 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  EM;.          }.
22460 20 20 20 20 20 20 20 20 20 20 70 46 64 2d 3e 70            pFd->p
22470 52 62 75 20 3d 20 70 44 62 2d 3e 70 52 62 75 3b  Rbu = pDb->pRbu;
22480 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
22490 20 20 20 70 44 62 2d 3e 70 57 61 6c 46 64 20 3d     pDb->pWalFd =
224a0 20 70 46 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20   pFd;.      }.  
224b0 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6f    }.  }..  if( o
224c0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
224d0 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 0a 20 20 20  PEN_MAIN_DB .   
224e0 26 26 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62  && sqlite3_uri_b
224f0 6f 6f 6c 65 61 6e 28 7a 4e 61 6d 65 2c 20 22 72  oolean(zName, "r
22500 62 75 5f 6d 65 6d 6f 72 79 22 2c 20 30 29 20 0a  bu_memory", 0) .
22510 20 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28    ){.    assert(
22520 20 6f 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   oflags & SQLITE
22530 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 3b  _OPEN_MAIN_DB );
22540 0a 20 20 20 20 6f 66 6c 61 67 73 20 3d 20 20 53  .    oflags =  S
22550 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
22560 44 42 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  DB | SQLITE_OPEN
22570 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c  _READWRITE | SQL
22580 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20  ITE_OPEN_CREATE 
22590 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
225a0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c  SQLITE_OPEN_EXCL
225b0 55 53 49 56 45 20 7c 20 53 51 4c 49 54 45 5f 4f  USIVE | SQLITE_O
225c0 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
225d0 45 3b 0a 20 20 20 20 7a 4f 70 65 6e 20 3d 20 30  E;.    zOpen = 0
225e0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d  ;.  }..  if( rc=
225f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
22600 20 20 72 63 20 3d 20 70 52 65 61 6c 56 66 73 2d    rc = pRealVfs-
22610 3e 78 4f 70 65 6e 28 70 52 65 61 6c 56 66 73 2c  >xOpen(pRealVfs,
22620 20 7a 4f 70 65 6e 2c 20 70 46 64 2d 3e 70 52 65   zOpen, pFd->pRe
22630 61 6c 2c 20 6f 66 6c 61 67 73 2c 20 70 4f 75 74  al, oflags, pOut
22640 46 6c 61 67 73 29 3b 0a 20 20 7d 0a 20 20 69 66  Flags);.  }.  if
22650 28 20 70 46 64 2d 3e 70 52 65 61 6c 2d 3e 70 4d  ( pFd->pReal->pM
22660 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a  ethods ){.    /*
22670 20 54 68 65 20 78 4f 70 65 6e 28 29 20 6f 70 65   The xOpen() ope
22680 72 61 74 69 6f 6e 20 68 61 73 20 73 75 63 63 65  ration has succe
22690 65 64 65 64 2e 20 53 65 74 20 74 68 65 20 73 71  eded. Set the sq
226a0 6c 69 74 65 33 5f 66 69 6c 65 2e 70 4d 65 74 68  lite3_file.pMeth
226b0 6f 64 73 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74  ods.    ** point
226c0 65 72 20 61 6e 64 2c 20 69 66 20 74 68 65 20 66  er and, if the f
226d0 69 6c 65 20 69 73 20 61 20 6d 61 69 6e 20 64 61  ile is a main da
226e0 74 61 62 61 73 65 20 66 69 6c 65 2c 20 6c 69 6e  tabase file, lin
226f0 6b 20 69 74 20 69 6e 74 6f 20 74 68 65 0a 20 20  k it into the.  
22700 20 20 2a 2a 20 6d 75 74 65 78 20 70 72 6f 74 65    ** mutex prote
22710 63 74 65 64 20 6c 69 6e 6b 65 64 20 6c 69 73 74  cted linked list
22720 20 6f 66 20 61 6c 6c 20 73 75 63 68 20 66 69 6c   of all such fil
22730 65 73 2e 20 20 2a 2f 0a 20 20 20 20 70 46 69 6c  es.  */.    pFil
22740 65 2d 3e 70 4d 65 74 68 6f 64 73 20 3d 20 26 72  e->pMethods = &r
22750 62 75 76 66 73 5f 69 6f 5f 6d 65 74 68 6f 64 73  buvfs_io_methods
22760 3b 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73 20  ;.    if( flags 
22770 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  & SQLITE_OPEN_MA
22780 49 4e 5f 44 42 20 29 7b 0a 20 20 20 20 20 20 73  IN_DB ){.      s
22790 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
227a0 65 72 28 70 52 62 75 56 66 73 2d 3e 6d 75 74 65  er(pRbuVfs->mute
227b0 78 29 3b 0a 20 20 20 20 20 20 70 46 64 2d 3e 70  x);.      pFd->p
227c0 4d 61 69 6e 4e 65 78 74 20 3d 20 70 52 62 75 56  MainNext = pRbuV
227d0 66 73 2d 3e 70 4d 61 69 6e 3b 0a 20 20 20 20 20  fs->pMain;.     
227e0 20 70 52 62 75 56 66 73 2d 3e 70 4d 61 69 6e 20   pRbuVfs->pMain 
227f0 3d 20 70 46 64 3b 0a 20 20 20 20 20 20 73 71 6c  = pFd;.      sql
22800 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
22810 28 70 52 62 75 56 66 73 2d 3e 6d 75 74 65 78 29  (pRbuVfs->mutex)
22820 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
22830 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
22840 65 28 70 46 64 2d 3e 7a 44 65 6c 29 3b 0a 20 20  e(pFd->zDel);.  
22850 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
22860 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
22870 74 68 65 20 66 69 6c 65 20 6c 6f 63 61 74 65 64  the file located
22880 20 61 74 20 7a 50 61 74 68 2e 0a 2a 2f 0a 73 74   at zPath..*/.st
22890 61 74 69 63 20 69 6e 74 20 72 62 75 56 66 73 44  atic int rbuVfsD
228a0 65 6c 65 74 65 28 73 71 6c 69 74 65 33 5f 76 66  elete(sqlite3_vf
228b0 73 20 2a 70 56 66 73 2c 20 63 6f 6e 73 74 20 63  s *pVfs, const c
228c0 68 61 72 20 2a 7a 50 61 74 68 2c 20 69 6e 74 20  har *zPath, int 
228d0 64 69 72 53 79 6e 63 29 7b 0a 20 20 73 71 6c 69  dirSync){.  sqli
228e0 74 65 33 5f 76 66 73 20 2a 70 52 65 61 6c 56 66  te3_vfs *pRealVf
228f0 73 20 3d 20 28 28 72 62 75 5f 76 66 73 2a 29 70  s = ((rbu_vfs*)p
22900 56 66 73 29 2d 3e 70 52 65 61 6c 56 66 73 3b 0a  Vfs)->pRealVfs;.
22910 20 20 72 65 74 75 72 6e 20 70 52 65 61 6c 56 66    return pRealVf
22920 73 2d 3e 78 44 65 6c 65 74 65 28 70 52 65 61 6c  s->xDelete(pReal
22930 56 66 73 2c 20 7a 50 61 74 68 2c 20 64 69 72 53  Vfs, zPath, dirS
22940 79 6e 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ync);.}../*.** T
22950 65 73 74 20 66 6f 72 20 61 63 63 65 73 73 20 70  est for access p
22960 65 72 6d 69 73 73 69 6f 6e 73 2e 20 52 65 74 75  ermissions. Retu
22970 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 72  rn true if the r
22980 65 71 75 65 73 74 65 64 20 70 65 72 6d 69 73 73  equested permiss
22990 69 6f 6e 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61  ion.** is availa
229a0 62 6c 65 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74  ble, or false ot
229b0 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74  herwise..*/.stat
229c0 69 63 20 69 6e 74 20 72 62 75 56 66 73 41 63 63  ic int rbuVfsAcc
229d0 65 73 73 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  ess(.  sqlite3_v
229e0 66 73 20 2a 70 56 66 73 2c 20 0a 20 20 63 6f 6e  fs *pVfs, .  con
229f0 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20  st char *zPath, 
22a00 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 0a 20  .  int flags, . 
22a10 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 0a 29 7b   int *pResOut.){
22a20 0a 20 20 72 62 75 5f 76 66 73 20 2a 70 52 62 75  .  rbu_vfs *pRbu
22a30 56 66 73 20 3d 20 28 72 62 75 5f 76 66 73 2a 29  Vfs = (rbu_vfs*)
22a40 70 56 66 73 3b 0a 20 20 73 71 6c 69 74 65 33 5f  pVfs;.  sqlite3_
22a50 76 66 73 20 2a 70 52 65 61 6c 56 66 73 20 3d 20  vfs *pRealVfs = 
22a60 70 52 62 75 56 66 73 2d 3e 70 52 65 61 6c 56 66  pRbuVfs->pRealVf
22a70 73 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  s;.  int rc;..  
22a80 72 63 20 3d 20 70 52 65 61 6c 56 66 73 2d 3e 78  rc = pRealVfs->x
22a90 41 63 63 65 73 73 28 70 52 65 61 6c 56 66 73 2c  Access(pRealVfs,
22aa0 20 7a 50 61 74 68 2c 20 66 6c 61 67 73 2c 20 70   zPath, flags, p
22ab0 52 65 73 4f 75 74 29 3b 0a 0a 20 20 2f 2a 20 49  ResOut);..  /* I
22ac0 66 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 74  f this call is t
22ad0 6f 20 63 68 65 63 6b 20 69 66 20 61 20 2a 2d 77  o check if a *-w
22ae0 61 6c 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74  al file associat
22af0 65 64 20 77 69 74 68 20 61 6e 20 52 42 55 20 74  ed with an RBU t
22b00 61 72 67 65 74 0a 20 20 2a 2a 20 64 61 74 61 62  arget.  ** datab
22b10 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 65  ase connection e
22b20 78 69 73 74 73 2c 20 61 6e 64 20 74 68 65 20 52  xists, and the R
22b30 42 55 20 75 70 64 61 74 65 20 69 73 20 69 6e 20  BU update is in 
22b40 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 2c 0a 20  RBU_STAGE_OAL,. 
22b50 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   ** the followin
22b60 67 20 73 70 65 63 69 61 6c 20 68 61 6e 64 6c 69  g special handli
22b70 6e 67 20 69 73 20 61 63 74 69 76 61 74 65 64 3a  ng is activated:
22b80 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 61 29 20  .  **.  **   a) 
22b90 69 66 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c  if the *-wal fil
22ba0 65 20 64 6f 65 73 20 65 78 69 73 74 2c 20 72 65  e does exist, re
22bb0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54  turn SQLITE_CANT
22bc0 4f 50 45 4e 2e 20 54 68 69 73 0a 20 20 2a 2a 20  OPEN. This.  ** 
22bd0 20 20 20 20 20 65 6e 73 75 72 65 73 20 74 68 61       ensures tha
22be0 74 20 74 68 65 20 52 42 55 20 65 78 74 65 6e 73  t the RBU extens
22bf0 69 6f 6e 20 6e 65 76 65 72 20 74 72 69 65 73 20  ion never tries 
22c00 74 6f 20 75 70 64 61 74 65 20 61 20 64 61 74 61  to update a data
22c10 62 61 73 65 0a 20 20 2a 2a 20 20 20 20 20 20 69  base.  **      i
22c20 6e 20 77 61 6c 20 6d 6f 64 65 2c 20 65 76 65 6e  n wal mode, even
22c30 20 69 66 20 74 68 65 20 66 69 72 73 74 20 70 61   if the first pa
22c40 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ge of the databa
22c50 73 65 20 66 69 6c 65 20 68 61 73 0a 20 20 2a 2a  se file has.  **
22c60 20 20 20 20 20 20 62 65 65 6e 20 64 61 6d 61 67        been damag
22c70 65 64 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ed. .  **.  **  
22c80 20 62 29 20 69 66 20 74 68 65 20 2a 2d 77 61 6c   b) if the *-wal
22c90 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65   file does not e
22ca0 78 69 73 74 2c 20 63 6c 61 69 6d 20 74 68 61 74  xist, claim that
22cb0 20 69 74 20 64 6f 65 73 20 61 6e 79 77 61 79 2c   it does anyway,
22cc0 0a 20 20 2a 2a 20 20 20 20 20 20 63 61 75 73 69  .  **      causi
22cd0 6e 67 20 53 51 4c 69 74 65 20 74 6f 20 63 61 6c  ng SQLite to cal
22ce0 6c 20 78 4f 70 65 6e 28 29 20 74 6f 20 6f 70 65  l xOpen() to ope
22cf0 6e 20 69 74 2e 20 54 68 69 73 20 63 61 6c 6c 20  n it. This call 
22d00 77 69 6c 6c 20 61 6c 73 6f 0a 20 20 2a 2a 20 20  will also.  **  
22d10 20 20 20 20 62 65 20 69 6e 74 65 72 63 65 70 74      be intercept
22d20 65 64 20 28 73 65 65 20 74 68 65 20 72 62 75 56  ed (see the rbuV
22d30 66 73 4f 70 65 6e 28 29 20 66 75 6e 63 74 69 6f  fsOpen() functio
22d40 6e 29 20 61 6e 64 20 74 68 65 20 2a 2d 6f 61 6c  n) and the *-oal
22d50 0a 20 20 2a 2a 20 20 20 20 20 20 66 69 6c 65 20  .  **      file 
22d60 6f 70 65 6e 65 64 20 69 6e 73 74 65 61 64 2e 0a  opened instead..
22d70 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53    */.  if( rc==S
22d80 51 4c 49 54 45 5f 4f 4b 20 26 26 20 66 6c 61 67  QLITE_OK && flag
22d90 73 3d 3d 53 51 4c 49 54 45 5f 41 43 43 45 53 53  s==SQLITE_ACCESS
22da0 5f 45 58 49 53 54 53 20 29 7b 0a 20 20 20 20 72  _EXISTS ){.    r
22db0 62 75 5f 66 69 6c 65 20 2a 70 44 62 20 3d 20 72  bu_file *pDb = r
22dc0 62 75 46 69 6e 64 4d 61 69 6e 64 62 28 70 52 62  buFindMaindb(pRb
22dd0 75 56 66 73 2c 20 7a 50 61 74 68 29 3b 0a 20 20  uVfs, zPath);.  
22de0 20 20 69 66 28 20 70 44 62 20 26 26 20 70 44 62    if( pDb && pDb
22df0 2d 3e 70 52 62 75 20 26 26 20 70 44 62 2d 3e 70  ->pRbu && pDb->p
22e00 52 62 75 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55  Rbu->eStage==RBU
22e10 5f 53 54 41 47 45 5f 4f 41 4c 20 29 7b 0a 20 20  _STAGE_OAL ){.  
22e20 20 20 20 20 69 66 28 20 2a 70 52 65 73 4f 75 74      if( *pResOut
22e30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
22e40 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
22e50 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
22e60 20 20 20 20 20 20 20 2a 70 52 65 73 4f 75 74 20         *pResOut 
22e70 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
22e80 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
22e90 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f   rc;.}../*.** Po
22ea0 70 75 6c 61 74 65 20 62 75 66 66 65 72 20 7a 4f  pulate buffer zO
22eb0 75 74 20 77 69 74 68 20 74 68 65 20 66 75 6c 6c  ut with the full
22ec0 20 63 61 6e 6f 6e 69 63 61 6c 20 70 61 74 68 6e   canonical pathn
22ed0 61 6d 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ame correspondin
22ee0 67 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61 74 68  g.** to the path
22ef0 6e 61 6d 65 20 69 6e 20 7a 50 61 74 68 2e 20 7a  name in zPath. z
22f00 4f 75 74 20 69 73 20 67 75 61 72 61 6e 74 65 65  Out is guarantee
22f10 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20  d to point to a 
22f20 62 75 66 66 65 72 0a 2a 2a 20 6f 66 20 61 74 20  buffer.** of at 
22f30 6c 65 61 73 74 20 28 44 45 56 53 59 4d 5f 4d 41  least (DEVSYM_MA
22f40 58 5f 50 41 54 48 4e 41 4d 45 2b 31 29 20 62 79  X_PATHNAME+1) by
22f50 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  tes..*/.static i
22f60 6e 74 20 72 62 75 56 66 73 46 75 6c 6c 50 61 74  nt rbuVfsFullPat
22f70 68 6e 61 6d 65 28 0a 20 20 73 71 6c 69 74 65 33  hname(.  sqlite3
22f80 5f 76 66 73 20 2a 70 56 66 73 2c 20 0a 20 20 63  _vfs *pVfs, .  c
22f90 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
22fa0 2c 20 0a 20 20 69 6e 74 20 6e 4f 75 74 2c 20 0a  , .  int nOut, .
22fb0 20 20 63 68 61 72 20 2a 7a 4f 75 74 0a 29 7b 0a    char *zOut.){.
22fc0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
22fd0 52 65 61 6c 56 66 73 20 3d 20 28 28 72 62 75 5f  RealVfs = ((rbu_
22fe0 76 66 73 2a 29 70 56 66 73 29 2d 3e 70 52 65 61  vfs*)pVfs)->pRea
22ff0 6c 56 66 73 3b 0a 20 20 72 65 74 75 72 6e 20 70  lVfs;.  return p
23000 52 65 61 6c 56 66 73 2d 3e 78 46 75 6c 6c 50 61  RealVfs->xFullPa
23010 74 68 6e 61 6d 65 28 70 52 65 61 6c 56 66 73 2c  thname(pRealVfs,
23020 20 7a 50 61 74 68 2c 20 6e 4f 75 74 2c 20 7a 4f   zPath, nOut, zO
23030 75 74 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  ut);.}..#ifndef 
23040 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44  SQLITE_OMIT_LOAD
23050 5f 45 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a  _EXTENSION./*.**
23060 20 4f 70 65 6e 20 74 68 65 20 64 79 6e 61 6d 69   Open the dynami
23070 63 20 6c 69 62 72 61 72 79 20 6c 6f 63 61 74 65  c library locate
23080 64 20 61 74 20 7a 50 61 74 68 20 61 6e 64 20 72  d at zPath and r
23090 65 74 75 72 6e 20 61 20 68 61 6e 64 6c 65 2e 0a  eturn a handle..
230a0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a  */.static void *
230b0 72 62 75 56 66 73 44 6c 4f 70 65 6e 28 73 71 6c  rbuVfsDlOpen(sql
230c0 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
230d0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
230e0 68 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  h){.  sqlite3_vf
230f0 73 20 2a 70 52 65 61 6c 56 66 73 20 3d 20 28 28  s *pRealVfs = ((
23100 72 62 75 5f 76 66 73 2a 29 70 56 66 73 29 2d 3e  rbu_vfs*)pVfs)->
23110 70 52 65 61 6c 56 66 73 3b 0a 20 20 72 65 74 75  pRealVfs;.  retu
23120 72 6e 20 70 52 65 61 6c 56 66 73 2d 3e 78 44 6c  rn pRealVfs->xDl
23130 4f 70 65 6e 28 70 52 65 61 6c 56 66 73 2c 20 7a  Open(pRealVfs, z
23140 50 61 74 68 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Path);.}../*.** 
23150 50 6f 70 75 6c 61 74 65 20 74 68 65 20 62 75 66  Populate the buf
23160 66 65 72 20 7a 45 72 72 4d 73 67 20 28 73 69 7a  fer zErrMsg (siz
23170 65 20 6e 42 79 74 65 20 62 79 74 65 73 29 20 77  e nByte bytes) w
23180 69 74 68 20 61 20 68 75 6d 61 6e 20 72 65 61 64  ith a human read
23190 61 62 6c 65 0a 2a 2a 20 75 74 66 2d 38 20 73 74  able.** utf-8 st
231a0 72 69 6e 67 20 64 65 73 63 72 69 62 69 6e 67 20  ring describing 
231b0 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
231c0 65 72 72 6f 72 20 65 6e 63 6f 75 6e 74 65 72 65  error encountere
231d0 64 20 61 73 73 6f 63 69 61 74 65 64 20 0a 2a 2a  d associated .**
231e0 20 77 69 74 68 20 64 79 6e 61 6d 69 63 20 6c 69   with dynamic li
231f0 62 72 61 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74  braries..*/.stat
23200 69 63 20 76 6f 69 64 20 72 62 75 56 66 73 44 6c  ic void rbuVfsDl
23210 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66  Error(sqlite3_vf
23220 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 79  s *pVfs, int nBy
23230 74 65 2c 20 63 68 61 72 20 2a 7a 45 72 72 4d 73  te, char *zErrMs
23240 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  g){.  sqlite3_vf
23250 73 20 2a 70 52 65 61 6c 56 66 73 20 3d 20 28 28  s *pRealVfs = ((
23260 72 62 75 5f 76 66 73 2a 29 70 56 66 73 29 2d 3e  rbu_vfs*)pVfs)->
23270 70 52 65 61 6c 56 66 73 3b 0a 20 20 70 52 65 61  pRealVfs;.  pRea
23280 6c 56 66 73 2d 3e 78 44 6c 45 72 72 6f 72 28 70  lVfs->xDlError(p
23290 52 65 61 6c 56 66 73 2c 20 6e 42 79 74 65 2c 20  RealVfs, nByte, 
232a0 7a 45 72 72 4d 73 67 29 3b 0a 7d 0a 0a 2f 2a 0a  zErrMsg);.}../*.
232b0 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
232c0 74 65 72 20 74 6f 20 74 68 65 20 73 79 6d 62 6f  ter to the symbo
232d0 6c 20 7a 53 79 6d 62 6f 6c 20 69 6e 20 74 68 65  l zSymbol in the
232e0 20 64 79 6e 61 6d 69 63 20 6c 69 62 72 61 72 79   dynamic library
232f0 20 70 48 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61   pHandle..*/.sta
23300 74 69 63 20 76 6f 69 64 20 28 2a 72 62 75 56 66  tic void (*rbuVf
23310 73 44 6c 53 79 6d 28 0a 20 20 73 71 6c 69 74 65  sDlSym(.  sqlite
23320 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 0a 20 20  3_vfs *pVfs, .  
23330 76 6f 69 64 20 2a 70 41 72 67 2c 20 0a 20 20 63  void *pArg, .  c
23340 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 79 6d 0a  onst char *zSym.
23350 29 29 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69  ))(void){.  sqli
23360 74 65 33 5f 76 66 73 20 2a 70 52 65 61 6c 56 66  te3_vfs *pRealVf
23370 73 20 3d 20 28 28 72 62 75 5f 76 66 73 2a 29 70  s = ((rbu_vfs*)p
23380 56 66 73 29 2d 3e 70 52 65 61 6c 56 66 73 3b 0a  Vfs)->pRealVfs;.
23390 20 20 72 65 74 75 72 6e 20 70 52 65 61 6c 56 66    return pRealVf
233a0 73 2d 3e 78 44 6c 53 79 6d 28 70 52 65 61 6c 56  s->xDlSym(pRealV
233b0 66 73 2c 20 70 41 72 67 2c 20 7a 53 79 6d 29 3b  fs, pArg, zSym);
233c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
233d0 74 68 65 20 64 79 6e 61 6d 69 63 20 6c 69 62 72  the dynamic libr
233e0 61 72 79 20 68 61 6e 64 6c 65 20 70 48 61 6e 64  ary handle pHand
233f0 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  le..*/.static vo
23400 69 64 20 72 62 75 56 66 73 44 6c 43 6c 6f 73 65  id rbuVfsDlClose
23410 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
23420 66 73 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c  fs, void *pHandl
23430 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  e){.  sqlite3_vf
23440 73 20 2a 70 52 65 61 6c 56 66 73 20 3d 20 28 28  s *pRealVfs = ((
23450 72 62 75 5f 76 66 73 2a 29 70 56 66 73 29 2d 3e  rbu_vfs*)pVfs)->
23460 70 52 65 61 6c 56 66 73 3b 0a 20 20 70 52 65 61  pRealVfs;.  pRea
23470 6c 56 66 73 2d 3e 78 44 6c 43 6c 6f 73 65 28 70  lVfs->xDlClose(p
23480 52 65 61 6c 56 66 73 2c 20 70 48 61 6e 64 6c 65  RealVfs, pHandle
23490 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  );.}.#endif /* S
234a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
234b0 45 58 54 45 4e 53 49 4f 4e 20 2a 2f 0a 0a 2f 2a  EXTENSION */../*
234c0 0a 2a 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65  .** Populate the
234d0 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20   buffer pointed 
234e0 74 6f 20 62 79 20 7a 42 75 66 4f 75 74 20 77 69  to by zBufOut wi
234f0 74 68 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f  th nByte bytes o
23500 66 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20 64 61 74  f .** random dat
23510 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  a..*/.static int
23520 20 72 62 75 56 66 73 52 61 6e 64 6f 6d 6e 65 73   rbuVfsRandomnes
23530 73 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  s(sqlite3_vfs *p
23540 56 66 73 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20  Vfs, int nByte, 
23550 63 68 61 72 20 2a 7a 42 75 66 4f 75 74 29 7b 0a  char *zBufOut){.
23560 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
23570 52 65 61 6c 56 66 73 20 3d 20 28 28 72 62 75 5f  RealVfs = ((rbu_
23580 76 66 73 2a 29 70 56 66 73 29 2d 3e 70 52 65 61  vfs*)pVfs)->pRea
23590 6c 56 66 73 3b 0a 20 20 72 65 74 75 72 6e 20 70  lVfs;.  return p
235a0 52 65 61 6c 56 66 73 2d 3e 78 52 61 6e 64 6f 6d  RealVfs->xRandom
235b0 6e 65 73 73 28 70 52 65 61 6c 56 66 73 2c 20 6e  ness(pRealVfs, n
235c0 42 79 74 65 2c 20 7a 42 75 66 4f 75 74 29 3b 0a  Byte, zBufOut);.
235d0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66  }../*.** Sleep f
235e0 6f 72 20 6e 4d 69 63 72 6f 20 6d 69 63 72 6f 73  or nMicro micros
235f0 65 63 6f 6e 64 73 2e 20 52 65 74 75 72 6e 20 74  econds. Return t
23600 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 63  he number of mic
23610 72 6f 73 65 63 6f 6e 64 73 20 0a 2a 2a 20 61 63  roseconds .** ac
23620 74 75 61 6c 6c 79 20 73 6c 65 70 74 2e 0a 2a 2f  tually slept..*/
23630 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 56  .static int rbuV
23640 66 73 53 6c 65 65 70 28 73 71 6c 69 74 65 33 5f  fsSleep(sqlite3_
23650 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e  vfs *pVfs, int n
23660 4d 69 63 72 6f 29 7b 0a 20 20 73 71 6c 69 74 65  Micro){.  sqlite
23670 33 5f 76 66 73 20 2a 70 52 65 61 6c 56 66 73 20  3_vfs *pRealVfs 
23680 3d 20 28 28 72 62 75 5f 76 66 73 2a 29 70 56 66  = ((rbu_vfs*)pVf
23690 73 29 2d 3e 70 52 65 61 6c 56 66 73 3b 0a 20 20  s)->pRealVfs;.  
236a0 72 65 74 75 72 6e 20 70 52 65 61 6c 56 66 73 2d  return pRealVfs-
236b0 3e 78 53 6c 65 65 70 28 70 52 65 61 6c 56 66 73  >xSleep(pRealVfs
236c0 2c 20 6e 4d 69 63 72 6f 29 3b 0a 7d 0a 0a 2f 2a  , nMicro);.}../*
236d0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63  .** Return the c
236e0 75 72 72 65 6e 74 20 74 69 6d 65 20 61 73 20 61  urrent time as a
236f0 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62   Julian Day numb
23700 65 72 20 69 6e 20 2a 70 54 69 6d 65 4f 75 74 2e  er in *pTimeOut.
23710 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
23720 62 75 56 66 73 43 75 72 72 65 6e 74 54 69 6d 65  buVfsCurrentTime
23730 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
23740 66 73 2c 20 64 6f 75 62 6c 65 20 2a 70 54 69 6d  fs, double *pTim
23750 65 4f 75 74 29 7b 0a 20 20 73 71 6c 69 74 65 33  eOut){.  sqlite3
23760 5f 76 66 73 20 2a 70 52 65 61 6c 56 66 73 20 3d  _vfs *pRealVfs =
23770 20 28 28 72 62 75 5f 76 66 73 2a 29 70 56 66 73   ((rbu_vfs*)pVfs
23780 29 2d 3e 70 52 65 61 6c 56 66 73 3b 0a 20 20 72  )->pRealVfs;.  r
23790 65 74 75 72 6e 20 70 52 65 61 6c 56 66 73 2d 3e  eturn pRealVfs->
237a0 78 43 75 72 72 65 6e 74 54 69 6d 65 28 70 52 65  xCurrentTime(pRe
237b0 61 6c 56 66 73 2c 20 70 54 69 6d 65 4f 75 74 29  alVfs, pTimeOut)
237c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70  ;.}../*.** No-op
237d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
237e0 72 62 75 56 66 73 47 65 74 4c 61 73 74 45 72 72  rbuVfsGetLastErr
237f0 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  or(sqlite3_vfs *
23800 70 56 66 73 2c 20 69 6e 74 20 61 2c 20 63 68 61  pVfs, int a, cha
23810 72 20 2a 62 29 7b 0a 20 20 72 65 74 75 72 6e 20  r *b){.  return 
23820 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 72 65  0;.}../*.** Dere
23830 67 69 73 74 65 72 20 61 6e 64 20 64 65 73 74 72  gister and destr
23840 6f 79 20 61 6e 20 52 42 55 20 76 66 73 20 63 72  oy an RBU vfs cr
23850 65 61 74 65 64 20 62 79 20 61 6e 20 65 61 72 6c  eated by an earl
23860 69 65 72 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 73  ier call to.** s
23870 71 6c 69 74 65 33 72 62 75 5f 63 72 65 61 74 65  qlite3rbu_create
23880 5f 76 66 73 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  _vfs()..*/.void 
23890 73 71 6c 69 74 65 33 72 62 75 5f 64 65 73 74 72  sqlite3rbu_destr
238a0 6f 79 5f 76 66 73 28 63 6f 6e 73 74 20 63 68 61  oy_vfs(const cha
238b0 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 73 71 6c  r *zName){.  sql
238c0 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d  ite3_vfs *pVfs =
238d0 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e   sqlite3_vfs_fin
238e0 64 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  d(zName);.  if( 
238f0 70 56 66 73 20 26 26 20 70 56 66 73 2d 3e 78 4f  pVfs && pVfs->xO
23900 70 65 6e 3d 3d 72 62 75 56 66 73 4f 70 65 6e 20  pen==rbuVfsOpen 
23910 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  ){.    sqlite3_m
23920 75 74 65 78 5f 66 72 65 65 28 28 28 72 62 75 5f  utex_free(((rbu_
23930 76 66 73 2a 29 70 56 66 73 29 2d 3e 6d 75 74 65  vfs*)pVfs)->mute
23940 78 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  x);.    sqlite3_
23950 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72 28 70  vfs_unregister(p
23960 56 66 73 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Vfs);.    sqlite
23970 33 5f 66 72 65 65 28 70 56 66 73 29 3b 0a 20 20  3_free(pVfs);.  
23980 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  }.}../*.** Creat
23990 65 20 61 6e 20 52 42 55 20 56 46 53 20 6e 61 6d  e an RBU VFS nam
239a0 65 64 20 7a 4e 61 6d 65 20 74 68 61 74 20 61 63  ed zName that ac
239b0 63 65 73 73 65 73 20 74 68 65 20 75 6e 64 65 72  cesses the under
239c0 6c 79 69 6e 67 20 66 69 6c 65 2d 73 79 73 74 65  lying file-syste
239d0 6d 0a 2a 2a 20 76 69 61 20 65 78 69 73 74 69 6e  m.** via existin
239e0 67 20 56 46 53 20 7a 50 61 72 65 6e 74 2e 20 54  g VFS zParent. T
239f0 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 69 73  he new object is
23a00 20 72 65 67 69 73 74 65 72 65 64 20 61 73 20 61   registered as a
23a10 20 6e 6f 6e 2d 64 65 66 61 75 6c 74 0a 2a 2a 20   non-default.** 
23a20 56 46 53 20 77 69 74 68 20 53 51 4c 69 74 65 20  VFS with SQLite 
23a30 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
23a40 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
23a50 72 62 75 5f 63 72 65 61 74 65 5f 76 66 73 28 63  rbu_create_vfs(c
23a60 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
23a70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50  , const char *zP
23a80 61 72 65 6e 74 29 7b 0a 0a 20 20 2f 2a 20 54 65  arent){..  /* Te
23a90 6d 70 6c 61 74 65 20 66 6f 72 20 56 46 53 20 2a  mplate for VFS *
23aa0 2f 0a 20 20 73 74 61 74 69 63 20 73 71 6c 69 74  /.  static sqlit
23ab0 65 33 5f 76 66 73 20 76 66 73 5f 74 65 6d 70 6c  e3_vfs vfs_templ
23ac0 61 74 65 20 3d 20 7b 0a 20 20 20 20 31 2c 20 20  ate = {.    1,  
23ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ae0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65            /* iVe
23af0 72 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 30 2c 20  rsion */.    0, 
23b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 7a             /* sz
23b20 4f 73 46 69 6c 65 20 2a 2f 0a 20 20 20 20 30 2c  OsFile */.    0,
23b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6d              /* m
23b50 78 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20  xPathname */.   
23b60 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
23b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23b80 2a 20 70 4e 65 78 74 20 2a 2f 0a 20 20 20 20 30  * pNext */.    0
23b90 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
23ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23bb0 7a 4e 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20  zName */.    0, 
23bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23bd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 41             /* pA
23be0 70 70 44 61 74 61 20 2a 2f 0a 20 20 20 20 72 62  ppData */.    rb
23bf0 75 56 66 73 4f 70 65 6e 2c 20 20 20 20 20 20 20  uVfsOpen,       
23c00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
23c10 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 72 62 75 56  Open */.    rbuV
23c20 66 73 44 65 6c 65 74 65 2c 20 20 20 20 20 20 20  fsDelete,       
23c30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 65            /* xDe
23c40 6c 65 74 65 20 2a 2f 0a 20 20 20 20 72 62 75 56  lete */.    rbuV
23c50 66 73 41 63 63 65 73 73 2c 20 20 20 20 20 20 20  fsAccess,       
23c60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 41 63            /* xAc
23c70 63 65 73 73 20 2a 2f 0a 20 20 20 20 72 62 75 56  cess */.    rbuV
23c80 66 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20  fsFullPathname, 
23c90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 75            /* xFu
23ca0 6c 6c 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 0a 23  llPathname */..#
23cb0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
23cc0 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f  IT_LOAD_EXTENSIO
23cd0 4e 0a 20 20 20 20 72 62 75 56 66 73 44 6c 4f 70  N.    rbuVfsDlOp
23ce0 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  en,             
23cf0 20 20 20 20 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a      /* xDlOpen *
23d00 2f 0a 20 20 20 20 72 62 75 56 66 73 44 6c 45 72  /.    rbuVfsDlEr
23d10 72 6f 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ror,            
23d20 20 20 20 20 2f 2a 20 78 44 6c 45 72 72 6f 72 20      /* xDlError 
23d30 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 44 6c 53  */.    rbuVfsDlS
23d40 79 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ym,             
23d50 20 20 20 20 20 2f 2a 20 78 44 6c 53 79 6d 20 2a       /* xDlSym *
23d60 2f 0a 20 20 20 20 72 62 75 56 66 73 44 6c 43 6c  /.    rbuVfsDlCl
23d70 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
23d80 20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f 73 65 20      /* xDlClose 
23d90 2a 2f 0a 23 65 6c 73 65 0a 20 20 20 20 30 2c 20  */.#else.    0, 
23da0 30 2c 20 30 2c 20 30 2c 0a 23 65 6e 64 69 66 0a  0, 0, 0,.#endif.
23db0 0a 20 20 20 20 72 62 75 56 66 73 52 61 6e 64 6f  .    rbuVfsRando
23dc0 6d 6e 65 73 73 2c 20 20 20 20 20 20 20 20 20 20  mness,          
23dd0 20 20 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65 73     /* xRandomnes
23de0 73 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 53  s */.    rbuVfsS
23df0 6c 65 65 70 2c 20 20 20 20 20 20 20 20 20 20 20  leep,           
23e00 20 20 20 20 20 20 20 2f 2a 20 78 53 6c 65 65 70         /* xSleep
23e10 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 43 75   */.    rbuVfsCu
23e20 72 72 65 6e 74 54 69 6d 65 2c 20 20 20 20 20 20  rrentTime,      
23e30 20 20 20 20 20 20 2f 2a 20 78 43 75 72 72 65 6e        /* xCurren
23e40 74 54 69 6d 65 20 2a 2f 0a 20 20 20 20 72 62 75  tTime */.    rbu
23e50 56 66 73 47 65 74 4c 61 73 74 45 72 72 6f 72 2c  VfsGetLastError,
23e60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 47             /* xG
23e70 65 74 4c 61 73 74 45 72 72 6f 72 20 2a 2f 0a 20  etLastError */. 
23e80 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20     0,           
23e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ea0 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65   /* xCurrentTime
23eb0 49 6e 74 36 34 20 28 76 65 72 73 69 6f 6e 20 32  Int64 (version 2
23ec0 29 20 2a 2f 0a 20 20 20 20 30 2c 20 30 2c 20 30  ) */.    0, 0, 0
23ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ee0 20 20 20 20 20 20 20 2f 2a 20 55 6e 69 6d 70 6c         /* Unimpl
23ef0 65 6d 65 6e 74 65 64 20 76 65 72 73 69 6f 6e 20  emented version 
23f00 33 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 20 20 7d  3 methods */.  }
23f10 3b 0a 0a 20 20 72 62 75 5f 76 66 73 20 2a 70 4e  ;..  rbu_vfs *pN
23f20 65 77 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ew = 0;         
23f30 20 20 20 20 20 2f 2a 20 4e 65 77 6c 79 20 61 6c       /* Newly al
23f40 6c 6f 63 61 74 65 64 20 56 46 53 20 2a 2f 0a 20  located VFS */. 
23f50 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
23f60 5f 4f 4b 3b 0a 20 20 73 69 7a 65 5f 74 20 6e 4e  _OK;.  size_t nN
23f70 61 6d 65 3b 0a 20 20 73 69 7a 65 5f 74 20 6e 42  ame;.  size_t nB
23f80 79 74 65 3b 0a 0a 20 20 6e 4e 61 6d 65 20 3d 20  yte;..  nName = 
23f90 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20  strlen(zName);. 
23fa0 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28   nByte = sizeof(
23fb0 72 62 75 5f 76 66 73 29 20 2b 20 6e 4e 61 6d 65  rbu_vfs) + nName
23fc0 20 2b 20 31 3b 0a 20 20 70 4e 65 77 20 3d 20 28   + 1;.  pNew = (
23fd0 72 62 75 5f 76 66 73 2a 29 73 71 6c 69 74 65 33  rbu_vfs*)sqlite3
23fe0 5f 6d 61 6c 6c 6f 63 36 34 28 6e 42 79 74 65 29  _malloc64(nByte)
23ff0 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
24000 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
24010 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73  TE_NOMEM;.  }els
24020 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76  e{.    sqlite3_v
24030 66 73 20 2a 70 50 61 72 65 6e 74 3b 20 20 20 20  fs *pParent;    
24040 20 20 20 20 20 20 20 2f 2a 20 50 61 72 65 6e 74         /* Parent
24050 20 56 46 53 20 2a 2f 0a 20 20 20 20 6d 65 6d 73   VFS */.    mems
24060 65 74 28 70 4e 65 77 2c 20 30 2c 20 6e 42 79 74  et(pNew, 0, nByt
24070 65 29 3b 0a 20 20 20 20 70 50 61 72 65 6e 74 20  e);.    pParent 
24080 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  = sqlite3_vfs_fi
24090 6e 64 28 7a 50 61 72 65 6e 74 29 3b 0a 20 20 20  nd(zParent);.   
240a0 20 69 66 28 20 70 50 61 72 65 6e 74 3d 3d 30 20   if( pParent==0 
240b0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
240c0 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20  LITE_NOTFOUND;. 
240d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
240e0 63 68 61 72 20 2a 7a 53 70 61 63 65 3b 0a 20 20  char *zSpace;.  
240f0 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77      memcpy(&pNew
24100 2d 3e 62 61 73 65 2c 20 26 76 66 73 5f 74 65 6d  ->base, &vfs_tem
24110 70 6c 61 74 65 2c 20 73 69 7a 65 6f 66 28 73 71  plate, sizeof(sq
24120 6c 69 74 65 33 5f 76 66 73 29 29 3b 0a 20 20 20  lite3_vfs));.   
24130 20 20 20 70 4e 65 77 2d 3e 62 61 73 65 2e 6d 78     pNew->base.mx
24140 50 61 74 68 6e 61 6d 65 20 3d 20 70 50 61 72 65  Pathname = pPare
24150 6e 74 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 3b 0a  nt->mxPathname;.
24160 20 20 20 20 20 20 70 4e 65 77 2d 3e 62 61 73 65        pNew->base
24170 2e 73 7a 4f 73 46 69 6c 65 20 3d 20 73 69 7a 65  .szOsFile = size
24180 6f 66 28 72 62 75 5f 66 69 6c 65 29 20 2b 20 70  of(rbu_file) + p
24190 50 61 72 65 6e 74 2d 3e 73 7a 4f 73 46 69 6c 65  Parent->szOsFile
241a0 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 52  ;.      pNew->pR
241b0 65 61 6c 56 66 73 20 3d 20 70 50 61 72 65 6e 74  ealVfs = pParent
241c0 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 62 61  ;.      pNew->ba
241d0 73 65 2e 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73  se.zName = (cons
241e0 74 20 63 68 61 72 2a 29 28 7a 53 70 61 63 65 20  t char*)(zSpace 
241f0 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31  = (char*)&pNew[1
24200 5d 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  ]);.      memcpy
24210 28 7a 53 70 61 63 65 2c 20 7a 4e 61 6d 65 2c 20  (zSpace, zName, 
24220 6e 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 20 20 2f  nName);..      /
24230 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 6d  * Allocate the m
24240 75 74 65 78 20 61 6e 64 20 72 65 67 69 73 74 65  utex and registe
24250 72 20 74 68 65 20 6e 65 77 20 56 46 53 20 28 6e  r the new VFS (n
24260 6f 74 20 61 73 20 74 68 65 20 64 65 66 61 75 6c  ot as the defaul
24270 74 29 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77  t) */.      pNew
24280 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65  ->mutex = sqlite
24290 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51  3_mutex_alloc(SQ
242a0 4c 49 54 45 5f 4d 55 54 45 58 5f 52 45 43 55 52  LITE_MUTEX_RECUR
242b0 53 49 56 45 29 3b 0a 20 20 20 20 20 20 69 66 28  SIVE);.      if(
242c0 20 70 4e 65 77 2d 3e 6d 75 74 65 78 3d 3d 30 20   pNew->mutex==0 
242d0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
242e0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
242f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
24300 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
24310 76 66 73 5f 72 65 67 69 73 74 65 72 28 26 70 4e  vfs_register(&pN
24320 65 77 2d 3e 62 61 73 65 2c 20 30 29 3b 0a 20 20  ew->base, 0);.  
24330 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
24340 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
24350 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
24360 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70  te3_mutex_free(p
24370 4e 65 77 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20  New->mutex);.   
24380 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
24390 70 4e 65 77 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pNew);.    }.  }
243a0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
243b0 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .../************
243c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
243d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
243e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
243f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
24400 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
24410 6e 65 64 28 53 51 4c 49 54 45 5f 43 4f 52 45 29  ned(SQLITE_CORE)
24420 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
24430 54 45 5f 45 4e 41 42 4c 45 5f 52 42 55 29 20 2a  TE_ENABLE_RBU) *
24440 2f 0a                                            /.