/ Hex Artifact Content
Login

Artifact ac4621fc62e0bc3e9e92fceb483c0207af25addf:


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 0a 0a 20    u8 bNolock;.. 
3cf0: 20 69 6e 74 20 6e 53 68 6d 3b 20 20 20 20 20 20   int nShm;      
3d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d10: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e   /* Number of en
3d20: 74 72 69 65 73 20 69 6e 20 61 70 53 68 6d 5b 5d  tries in apShm[]
3d30: 20 61 72 72 61 79 20 2a 2f 0a 20 20 63 68 61 72   array */.  char
3d40: 20 2a 2a 61 70 53 68 6d 3b 20 20 20 20 20 20 20   **apShm;       
3d50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
3d60: 72 72 61 79 20 6f 66 20 6d 6d 61 70 27 64 20 2a  rray of mmap'd *
3d70: 2d 73 68 6d 20 72 65 67 69 6f 6e 73 20 2a 2f 0a  -shm regions */.
3d80: 20 20 63 68 61 72 20 2a 7a 44 65 6c 3b 20 20 20    char *zDel;   
3d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3da0: 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 69 73    /* Delete this
3db0: 20 77 68 65 6e 20 63 6c 6f 73 69 6e 67 20 66 69   when closing fi
3dc0: 6c 65 20 2a 2f 0a 0a 20 20 63 6f 6e 73 74 20 63  le */..  const c
3dd0: 68 61 72 20 2a 7a 57 61 6c 3b 20 20 20 20 20 20  har *zWal;      
3de0: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 61 6c 20           /* Wal 
3df0: 66 69 6c 65 6e 61 6d 65 20 66 6f 72 20 74 68 69  filename for thi
3e00: 73 20 6d 61 69 6e 20 64 62 20 66 69 6c 65 20 2a  s main db file *
3e10: 2f 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 57  /.  rbu_file *pW
3e20: 61 6c 46 64 3b 20 20 20 20 20 20 20 20 20 20 20  alFd;           
3e30: 20 20 20 20 2f 2a 20 57 61 6c 20 66 69 6c 65 20      /* Wal file 
3e40: 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74  descriptor for t
3e50: 68 69 73 20 6d 61 69 6e 20 64 62 20 2a 2f 0a 20  his main db */. 
3e60: 20 72 62 75 5f 66 69 6c 65 20 2a 70 4d 61 69 6e   rbu_file *pMain
3e70: 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20  Next;           
3e80: 20 2f 2a 20 4e 65 78 74 20 4d 41 49 4e 5f 44 42   /* Next MAIN_DB
3e90: 20 66 69 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a   file */.};../*.
3ea0: 2a 2a 20 54 72 75 65 20 66 6f 72 20 61 6e 20 52  ** True for an R
3eb0: 42 55 20 76 61 63 75 75 6d 20 68 61 6e 64 6c 65  BU vacuum handle
3ec0: 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72  , or false other
3ed0: 77 69 73 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  wise..*/.#define
3ee0: 20 72 62 75 49 73 56 61 63 75 75 6d 28 70 29 20   rbuIsVacuum(p) 
3ef0: 28 28 70 29 2d 3e 7a 54 61 72 67 65 74 3d 3d 30  ((p)->zTarget==0
3f00: 29 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ).../***********
3f10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3f20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3f30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3f40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
3f50: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
3f60: 74 68 72 65 65 20 66 75 6e 63 74 69 6f 6e 73 2c  three functions,
3f70: 20 66 6f 75 6e 64 20 62 65 6c 6f 77 3a 0a 2a 2a   found below:.**
3f80: 0a 2a 2a 20 20 20 72 62 75 44 65 6c 74 61 47 65  .**   rbuDeltaGe
3f90: 74 49 6e 74 28 29 0a 2a 2a 20 20 20 72 62 75 44  tInt().**   rbuD
3fa0: 65 6c 74 61 43 68 65 63 6b 73 75 6d 28 29 0a 2a  eltaChecksum().*
3fb0: 2a 20 20 20 72 62 75 44 65 6c 74 61 41 70 70 6c  *   rbuDeltaAppl
3fc0: 79 28 29 0a 2a 2a 0a 2a 2a 20 61 72 65 20 6c 69  y().**.** are li
3fd0: 66 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 6f  fted from the fo
3fe0: 73 73 69 6c 20 73 6f 75 72 63 65 20 63 6f 64 65  ssil source code
3ff0: 20 28 68 74 74 70 3a 2f 2f 66 6f 73 73 69 6c 2d   (http://fossil-
4000: 73 63 6d 2e 6f 72 67 29 2e 20 54 68 65 79 0a 2a  scm.org). They.*
4010: 2a 20 61 72 65 20 75 73 65 64 20 74 6f 20 69 6d  * are used to im
4020: 70 6c 65 6d 65 6e 74 20 74 68 65 20 73 63 61 6c  plement the scal
4030: 61 72 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20  ar SQL function 
4040: 72 62 75 5f 66 6f 73 73 69 6c 5f 64 65 6c 74 61  rbu_fossil_delta
4050: 28 29 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  ()..*/../*.** Re
4060: 61 64 20 62 79 74 65 73 20 66 72 6f 6d 20 2a 70  ad bytes from *p
4070: 7a 20 61 6e 64 20 63 6f 6e 76 65 72 74 20 74 68  z and convert th
4080: 65 6d 20 69 6e 74 6f 20 61 20 70 6f 73 69 74 69  em into a positi
4090: 76 65 20 69 6e 74 65 67 65 72 2e 20 20 57 68 65  ve integer.  Whe
40a0: 6e 0a 2a 2a 20 66 69 6e 69 73 68 65 64 2c 20 6c  n.** finished, l
40b0: 65 61 76 65 20 2a 70 7a 20 70 6f 69 6e 74 69 6e  eave *pz pointin
40c0: 67 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 63  g to the first c
40d0: 68 61 72 61 63 74 65 72 20 70 61 73 74 20 74 68  haracter past th
40e0: 65 20 65 6e 64 20 6f 66 0a 2a 2a 20 74 68 65 20  e end of.** the 
40f0: 69 6e 74 65 67 65 72 2e 20 20 54 68 65 20 2a 70  integer.  The *p
4100: 4c 65 6e 20 70 61 72 61 6d 65 74 65 72 20 68 6f  Len parameter ho
4110: 6c 64 73 20 74 68 65 20 6c 65 6e 67 74 68 20 6f  lds the length o
4120: 66 20 74 68 65 20 73 74 72 69 6e 67 0a 2a 2a 20  f the string.** 
4130: 69 6e 20 2a 70 7a 20 61 6e 64 20 69 73 20 64 65  in *pz and is de
4140: 63 72 65 6d 65 6e 74 65 64 20 6f 6e 63 65 20 66  cremented once f
4150: 6f 72 20 65 61 63 68 20 63 68 61 72 61 63 74 65  or each characte
4160: 72 20 69 6e 20 74 68 65 20 69 6e 74 65 67 65 72  r in the integer
4170: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 6e 73 69  ..*/.static unsi
4180: 67 6e 65 64 20 69 6e 74 20 72 62 75 44 65 6c 74  gned int rbuDelt
4190: 61 47 65 74 49 6e 74 28 63 6f 6e 73 74 20 63 68  aGetInt(const ch
41a0: 61 72 20 2a 2a 70 7a 2c 20 69 6e 74 20 2a 70 4c  ar **pz, int *pL
41b0: 65 6e 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f  en){.  static co
41c0: 6e 73 74 20 73 69 67 6e 65 64 20 63 68 61 72 20  nst signed char 
41d0: 7a 56 61 6c 75 65 5b 5d 20 3d 20 7b 0a 20 20 20  zValue[] = {.   
41e0: 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c   -1, -1, -1, -1,
41f0: 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c   -1, -1, -1, -1,
4200: 20 20 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d     -1, -1, -1, -
4210: 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d  1, -1, -1, -1, -
4220: 31 2c 0a 20 20 20 20 2d 31 2c 20 2d 31 2c 20 2d  1,.    -1, -1, -
4230: 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d  1, -1, -1, -1, -
4240: 31 2c 20 2d 31 2c 20 20 20 2d 31 2c 20 2d 31 2c  1, -1,   -1, -1,
4250: 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c   -1, -1, -1, -1,
4260: 20 2d 31 2c 20 2d 31 2c 0a 20 20 20 20 2d 31 2c   -1, -1,.    -1,
4270: 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c   -1, -1, -1, -1,
4280: 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 20 20 2d   -1, -1, -1,   -
4290: 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d  1, -1, -1, -1, -
42a0: 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 0a 20  1, -1, -1, -1,. 
42b0: 20 20 20 20 30 2c 20 20 31 2c 20 20 32 2c 20 20      0,  1,  2,  
42c0: 33 2c 20 20 34 2c 20 20 35 2c 20 20 36 2c 20 20  3,  4,  5,  6,  
42d0: 37 2c 20 20 20 20 38 2c 20 20 39 2c 20 2d 31 2c  7,    8,  9, -1,
42e0: 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c   -1, -1, -1, -1,
42f0: 20 2d 31 2c 0a 20 20 20 20 2d 31 2c 20 31 30 2c   -1,.    -1, 10,
4300: 20 31 31 2c 20 31 32 2c 20 31 33 2c 20 31 34 2c   11, 12, 13, 14,
4310: 20 31 35 2c 20 31 36 2c 20 20 20 31 37 2c 20 31   15, 16,   17, 1
4320: 38 2c 20 31 39 2c 20 32 30 2c 20 32 31 2c 20 32  8, 19, 20, 21, 2
4330: 32 2c 20 32 33 2c 20 32 34 2c 0a 20 20 20 20 32  2, 23, 24,.    2
4340: 35 2c 20 32 36 2c 20 32 37 2c 20 32 38 2c 20 32  5, 26, 27, 28, 2
4350: 39 2c 20 33 30 2c 20 33 31 2c 20 33 32 2c 20 20  9, 30, 31, 32,  
4360: 20 33 33 2c 20 33 34 2c 20 33 35 2c 20 2d 31 2c   33, 34, 35, -1,
4370: 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 33 36 2c   -1, -1, -1, 36,
4380: 0a 20 20 20 20 2d 31 2c 20 33 37 2c 20 33 38 2c  .    -1, 37, 38,
4390: 20 33 39 2c 20 34 30 2c 20 34 31 2c 20 34 32 2c   39, 40, 41, 42,
43a0: 20 34 33 2c 20 20 20 34 34 2c 20 34 35 2c 20 34   43,   44, 45, 4
43b0: 36 2c 20 34 37 2c 20 34 38 2c 20 34 39 2c 20 35  6, 47, 48, 49, 5
43c0: 30 2c 20 35 31 2c 0a 20 20 20 20 35 32 2c 20 35  0, 51,.    52, 5
43d0: 33 2c 20 35 34 2c 20 35 35 2c 20 35 36 2c 20 35  3, 54, 55, 56, 5
43e0: 37 2c 20 35 38 2c 20 35 39 2c 20 20 20 36 30 2c  7, 58, 59,   60,
43f0: 20 36 31 2c 20 36 32 2c 20 2d 31 2c 20 2d 31 2c   61, 62, -1, -1,
4400: 20 2d 31 2c 20 36 33 2c 20 2d 31 2c 0a 20 20 7d   -1, 63, -1,.  }
4410: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  ;.  unsigned int
4420: 20 76 20 3d 20 30 3b 0a 20 20 69 6e 74 20 63 3b   v = 0;.  int c;
4430: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
4440: 20 2a 7a 20 3d 20 28 75 6e 73 69 67 6e 65 64 20   *z = (unsigned 
4450: 63 68 61 72 2a 29 2a 70 7a 3b 0a 20 20 75 6e 73  char*)*pz;.  uns
4460: 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 53 74 61  igned char *zSta
4470: 72 74 20 3d 20 7a 3b 0a 20 20 77 68 69 6c 65 28  rt = z;.  while(
4480: 20 28 63 20 3d 20 7a 56 61 6c 75 65 5b 30 78 37   (c = zValue[0x7
4490: 66 26 2a 28 7a 2b 2b 29 5d 29 3e 3d 30 20 29 7b  f&*(z++)])>=0 ){
44a0: 0a 20 20 20 20 20 76 20 3d 20 28 76 3c 3c 36 29  .     v = (v<<6)
44b0: 20 2b 20 63 3b 0a 20 20 7d 0a 20 20 7a 2d 2d 3b   + c;.  }.  z--;
44c0: 0a 20 20 2a 70 4c 65 6e 20 2d 3d 20 7a 20 2d 20  .  *pLen -= z - 
44d0: 7a 53 74 61 72 74 3b 0a 20 20 2a 70 7a 20 3d 20  zStart;.  *pz = 
44e0: 28 63 68 61 72 2a 29 7a 3b 0a 20 20 72 65 74 75  (char*)z;.  retu
44f0: 72 6e 20 76 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn v;.}../*.** C
4500: 6f 6d 70 75 74 65 20 61 20 33 32 2d 62 69 74 20  ompute a 32-bit 
4510: 63 68 65 63 6b 73 75 6d 20 6f 6e 20 74 68 65 20  checksum on the 
4520: 4e 2d 62 79 74 65 20 62 75 66 66 65 72 2e 20 20  N-byte buffer.  
4530: 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c  Return the resul
4540: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 6e 73  t..*/.static uns
4550: 69 67 6e 65 64 20 69 6e 74 20 72 62 75 44 65 6c  igned int rbuDel
4560: 74 61 43 68 65 63 6b 73 75 6d 28 63 6f 6e 73 74  taChecksum(const
4570: 20 63 68 61 72 20 2a 7a 49 6e 2c 20 73 69 7a 65   char *zIn, size
4580: 5f 74 20 4e 29 7b 0a 20 20 63 6f 6e 73 74 20 75  _t N){.  const u
4590: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 20  nsigned char *z 
45a0: 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  = (const unsigne
45b0: 64 20 63 68 61 72 20 2a 29 7a 49 6e 3b 0a 20 20  d char *)zIn;.  
45c0: 75 6e 73 69 67 6e 65 64 20 73 75 6d 30 20 3d 20  unsigned sum0 = 
45d0: 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 73 75  0;.  unsigned su
45e0: 6d 31 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67 6e  m1 = 0;.  unsign
45f0: 65 64 20 73 75 6d 32 20 3d 20 30 3b 0a 20 20 75  ed sum2 = 0;.  u
4600: 6e 73 69 67 6e 65 64 20 73 75 6d 33 20 3d 20 30  nsigned sum3 = 0
4610: 3b 0a 20 20 77 68 69 6c 65 28 4e 20 3e 3d 20 31  ;.  while(N >= 1
4620: 36 29 7b 0a 20 20 20 20 73 75 6d 30 20 2b 3d 20  6){.    sum0 += 
4630: 28 28 75 6e 73 69 67 6e 65 64 29 7a 5b 30 5d 20  ((unsigned)z[0] 
4640: 2b 20 7a 5b 34 5d 20 2b 20 7a 5b 38 5d 20 2b 20  + z[4] + z[8] + 
4650: 7a 5b 31 32 5d 29 3b 0a 20 20 20 20 73 75 6d 31  z[12]);.    sum1
4660: 20 2b 3d 20 28 28 75 6e 73 69 67 6e 65 64 29 7a   += ((unsigned)z
4670: 5b 31 5d 20 2b 20 7a 5b 35 5d 20 2b 20 7a 5b 39  [1] + z[5] + z[9
4680: 5d 20 2b 20 7a 5b 31 33 5d 29 3b 0a 20 20 20 20  ] + z[13]);.    
4690: 73 75 6d 32 20 2b 3d 20 28 28 75 6e 73 69 67 6e  sum2 += ((unsign
46a0: 65 64 29 7a 5b 32 5d 20 2b 20 7a 5b 36 5d 20 2b  ed)z[2] + z[6] +
46b0: 20 7a 5b 31 30 5d 2b 20 7a 5b 31 34 5d 29 3b 0a   z[10]+ z[14]);.
46c0: 20 20 20 20 73 75 6d 33 20 2b 3d 20 28 28 75 6e      sum3 += ((un
46d0: 73 69 67 6e 65 64 29 7a 5b 33 5d 20 2b 20 7a 5b  signed)z[3] + z[
46e0: 37 5d 20 2b 20 7a 5b 31 31 5d 2b 20 7a 5b 31 35  7] + z[11]+ z[15
46f0: 5d 29 3b 0a 20 20 20 20 7a 20 2b 3d 20 31 36 3b  ]);.    z += 16;
4700: 0a 20 20 20 20 4e 20 2d 3d 20 31 36 3b 0a 20 20  .    N -= 16;.  
4710: 7d 0a 20 20 77 68 69 6c 65 28 4e 20 3e 3d 20 34  }.  while(N >= 4
4720: 29 7b 0a 20 20 20 20 73 75 6d 30 20 2b 3d 20 7a  ){.    sum0 += z
4730: 5b 30 5d 3b 0a 20 20 20 20 73 75 6d 31 20 2b 3d  [0];.    sum1 +=
4740: 20 7a 5b 31 5d 3b 0a 20 20 20 20 73 75 6d 32 20   z[1];.    sum2 
4750: 2b 3d 20 7a 5b 32 5d 3b 0a 20 20 20 20 73 75 6d  += z[2];.    sum
4760: 33 20 2b 3d 20 7a 5b 33 5d 3b 0a 20 20 20 20 7a  3 += z[3];.    z
4770: 20 2b 3d 20 34 3b 0a 20 20 20 20 4e 20 2d 3d 20   += 4;.    N -= 
4780: 34 3b 0a 20 20 7d 0a 20 20 73 75 6d 33 20 2b 3d  4;.  }.  sum3 +=
4790: 20 28 73 75 6d 32 20 3c 3c 20 38 29 20 2b 20 28   (sum2 << 8) + (
47a0: 73 75 6d 31 20 3c 3c 20 31 36 29 20 2b 20 28 73  sum1 << 16) + (s
47b0: 75 6d 30 20 3c 3c 20 32 34 29 3b 0a 20 20 73 77  um0 << 24);.  sw
47c0: 69 74 63 68 28 4e 29 7b 0a 20 20 20 20 63 61 73  itch(N){.    cas
47d0: 65 20 33 3a 20 20 20 73 75 6d 33 20 2b 3d 20 28  e 3:   sum3 += (
47e0: 7a 5b 32 5d 20 3c 3c 20 38 29 3b 0a 20 20 20 20  z[2] << 8);.    
47f0: 63 61 73 65 20 32 3a 20 20 20 73 75 6d 33 20 2b  case 2:   sum3 +
4800: 3d 20 28 7a 5b 31 5d 20 3c 3c 20 31 36 29 3b 0a  = (z[1] << 16);.
4810: 20 20 20 20 63 61 73 65 20 31 3a 20 20 20 73 75      case 1:   su
4820: 6d 33 20 2b 3d 20 28 7a 5b 30 5d 20 3c 3c 20 32  m3 += (z[0] << 2
4830: 34 29 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  4);.    default:
4840: 20 20 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    ;.  }.  return
4850: 20 73 75 6d 33 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   sum3;.}../*.** 
4860: 41 70 70 6c 79 20 61 20 64 65 6c 74 61 2e 0a 2a  Apply a delta..*
4870: 2a 0a 2a 2a 20 54 68 65 20 6f 75 74 70 75 74 20  *.** The output 
4880: 62 75 66 66 65 72 20 73 68 6f 75 6c 64 20 62 65  buffer should be
4890: 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68   big enough to h
48a0: 6f 6c 64 20 74 68 65 20 77 68 6f 6c 65 20 6f 75  old the whole ou
48b0: 74 70 75 74 0a 2a 2a 20 66 69 6c 65 20 61 6e 64  tput.** file and
48c0: 20 61 20 4e 55 4c 20 74 65 72 6d 69 6e 61 74 6f   a NUL terminato
48d0: 72 20 61 74 20 74 68 65 20 65 6e 64 2e 20 20 54  r at the end.  T
48e0: 68 65 20 64 65 6c 74 61 5f 6f 75 74 70 75 74 5f  he delta_output_
48f0: 73 69 7a 65 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  size().** routin
4900: 65 20 77 69 6c 6c 20 64 65 74 65 72 6d 69 6e 65  e will determine
4910: 20 74 68 69 73 20 73 69 7a 65 20 66 6f 72 20 79   this size for y
4920: 6f 75 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65  ou..**.** The de
4930: 6c 74 61 20 73 74 72 69 6e 67 20 73 68 6f 75 6c  lta string shoul
4940: 64 20 62 65 20 6e 75 6c 6c 2d 74 65 72 6d 69 6e  d be null-termin
4950: 61 74 65 64 2e 20 20 42 75 74 20 74 68 65 20 64  ated.  But the d
4960: 65 6c 74 61 20 73 74 72 69 6e 67 0a 2a 2a 20 6d  elta string.** m
4970: 61 79 20 63 6f 6e 74 61 69 6e 20 65 6d 62 65 64  ay contain embed
4980: 64 65 64 20 4e 55 4c 20 63 68 61 72 61 63 74 65  ded NUL characte
4990: 72 73 20 28 69 66 20 74 68 65 20 69 6e 70 75 74  rs (if the input
49a0: 20 61 6e 64 20 6f 75 74 70 75 74 20 61 72 65 0a   and output are.
49b0: 2a 2a 20 62 69 6e 61 72 79 20 66 69 6c 65 73 29  ** binary files)
49c0: 20 73 6f 20 77 65 20 61 6c 73 6f 20 68 61 76 65   so we also have
49d0: 20 74 6f 20 70 61 73 73 20 69 6e 20 74 68 65 20   to pass in the 
49e0: 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 64 65  length of the de
49f0: 6c 74 61 20 69 6e 0a 2a 2a 20 74 68 65 20 6c 65  lta in.** the le
4a00: 6e 44 65 6c 74 61 20 70 61 72 61 6d 65 74 65 72  nDelta parameter
4a10: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
4a20: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68  ction returns th
4a30: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6f 75  e size of the ou
4a40: 74 70 75 74 20 66 69 6c 65 20 69 6e 20 62 79 74  tput file in byt
4a50: 65 73 20 28 65 78 63 6c 75 64 69 6e 67 0a 2a 2a  es (excluding.**
4a60: 20 74 68 65 20 66 69 6e 61 6c 20 4e 55 4c 20 74   the final NUL t
4a70: 65 72 6d 69 6e 61 74 6f 72 20 63 68 61 72 61 63  erminator charac
4a80: 74 65 72 29 2e 20 20 45 78 63 65 70 74 2c 20 69  ter).  Except, i
4a90: 66 20 74 68 65 20 64 65 6c 74 61 20 73 74 72 69  f the delta stri
4aa0: 6e 67 20 69 73 0a 2a 2a 20 6d 61 6c 66 6f 72 6d  ng is.** malform
4ab0: 65 64 20 6f 72 20 69 6e 74 65 6e 64 65 64 20 66  ed or intended f
4ac0: 6f 72 20 75 73 65 20 77 69 74 68 20 61 20 73 6f  or use with a so
4ad0: 75 72 63 65 20 66 69 6c 65 20 6f 74 68 65 72 20  urce file other 
4ae0: 74 68 61 6e 20 7a 53 72 63 2c 0a 2a 2a 20 74 68  than zSrc,.** th
4af0: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
4b00: 72 65 74 75 72 6e 73 20 2d 31 2e 0a 2a 2a 0a 2a  returns -1..**.*
4b10: 2a 20 52 65 66 65 72 20 74 6f 20 74 68 65 20 64  * Refer to the d
4b20: 65 6c 74 61 5f 63 72 65 61 74 65 28 29 20 64 6f  elta_create() do
4b30: 63 75 6d 65 6e 74 61 74 69 6f 6e 20 61 62 6f 76  cumentation abov
4b40: 65 20 66 6f 72 20 61 20 64 65 73 63 72 69 70 74  e for a descript
4b50: 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 64 65  ion.** of the de
4b60: 6c 74 61 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e  lta file format.
4b70: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
4b80: 62 75 44 65 6c 74 61 41 70 70 6c 79 28 0a 20 20  buDeltaApply(.  
4b90: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 72 63  const char *zSrc
4ba0: 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 6f  ,      /* The so
4bb0: 75 72 63 65 20 6f 72 20 70 61 74 74 65 72 6e 20  urce or pattern 
4bc0: 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6c 65  file */.  int le
4bd0: 6e 53 72 63 2c 20 20 20 20 20 20 20 20 20 20 20  nSrc,           
4be0: 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74 68   /* Length of th
4bf0: 65 20 73 6f 75 72 63 65 20 66 69 6c 65 20 2a 2f  e source file */
4c00: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
4c10: 44 65 6c 74 61 2c 20 20 20 20 2f 2a 20 44 65 6c  Delta,    /* Del
4c20: 74 61 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 74  ta to apply to t
4c30: 68 65 20 70 61 74 74 65 72 6e 20 2a 2f 0a 20 20  he pattern */.  
4c40: 69 6e 74 20 6c 65 6e 44 65 6c 74 61 2c 20 20 20  int lenDelta,   
4c50: 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68         /* Length
4c60: 20 6f 66 20 74 68 65 20 64 65 6c 74 61 20 2a 2f   of the delta */
4c70: 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 20 20 20  .  char *zOut   
4c80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
4c90: 74 65 20 74 68 65 20 6f 75 74 70 75 74 20 69 6e  te the output in
4ca0: 74 6f 20 74 68 69 73 20 70 72 65 61 6c 6c 6f 63  to this prealloc
4cb0: 61 74 65 64 20 62 75 66 66 65 72 20 2a 2f 0a 29  ated buffer */.)
4cc0: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  {.  unsigned int
4cd0: 20 6c 69 6d 69 74 3b 0a 20 20 75 6e 73 69 67 6e   limit;.  unsign
4ce0: 65 64 20 69 6e 74 20 74 6f 74 61 6c 20 3d 20 30  ed int total = 0
4cf0: 3b 0a 23 69 66 6e 64 65 66 20 46 4f 53 53 49 4c  ;.#ifndef FOSSIL
4d00: 5f 4f 4d 49 54 5f 44 45 4c 54 41 5f 43 4b 53 55  _OMIT_DELTA_CKSU
4d10: 4d 5f 54 45 53 54 0a 20 20 63 68 61 72 20 2a 7a  M_TEST.  char *z
4d20: 4f 72 69 67 4f 75 74 20 3d 20 7a 4f 75 74 3b 0a  OrigOut = zOut;.
4d30: 23 65 6e 64 69 66 0a 0a 20 20 6c 69 6d 69 74 20  #endif..  limit 
4d40: 3d 20 72 62 75 44 65 6c 74 61 47 65 74 49 6e 74  = rbuDeltaGetInt
4d50: 28 26 7a 44 65 6c 74 61 2c 20 26 6c 65 6e 44 65  (&zDelta, &lenDe
4d60: 6c 74 61 29 3b 0a 20 20 69 66 28 20 2a 7a 44 65  lta);.  if( *zDe
4d70: 6c 74 61 21 3d 27 5c 6e 27 20 29 7b 0a 20 20 20  lta!='\n' ){.   
4d80: 20 2f 2a 20 45 52 52 4f 52 3a 20 73 69 7a 65 20   /* ERROR: size 
4d90: 69 6e 74 65 67 65 72 20 6e 6f 74 20 74 65 72 6d  integer not term
4da0: 69 6e 61 74 65 64 20 62 79 20 22 5c 6e 22 20 2a  inated by "\n" *
4db0: 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b  /.    return -1;
4dc0: 0a 20 20 7d 0a 20 20 7a 44 65 6c 74 61 2b 2b 3b  .  }.  zDelta++;
4dd0: 20 6c 65 6e 44 65 6c 74 61 2d 2d 3b 0a 20 20 77   lenDelta--;.  w
4de0: 68 69 6c 65 28 20 2a 7a 44 65 6c 74 61 20 26 26  hile( *zDelta &&
4df0: 20 6c 65 6e 44 65 6c 74 61 3e 30 20 29 7b 0a 20   lenDelta>0 ){. 
4e00: 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20     unsigned int 
4e10: 63 6e 74 2c 20 6f 66 73 74 3b 0a 20 20 20 20 63  cnt, ofst;.    c
4e20: 6e 74 20 3d 20 72 62 75 44 65 6c 74 61 47 65 74  nt = rbuDeltaGet
4e30: 49 6e 74 28 26 7a 44 65 6c 74 61 2c 20 26 6c 65  Int(&zDelta, &le
4e40: 6e 44 65 6c 74 61 29 3b 0a 20 20 20 20 73 77 69  nDelta);.    swi
4e50: 74 63 68 28 20 7a 44 65 6c 74 61 5b 30 5d 20 29  tch( zDelta[0] )
4e60: 7b 0a 20 20 20 20 20 20 63 61 73 65 20 27 40 27  {.      case '@'
4e70: 3a 20 7b 0a 20 20 20 20 20 20 20 20 7a 44 65 6c  : {.        zDel
4e80: 74 61 2b 2b 3b 20 6c 65 6e 44 65 6c 74 61 2d 2d  ta++; lenDelta--
4e90: 3b 0a 20 20 20 20 20 20 20 20 6f 66 73 74 20 3d  ;.        ofst =
4ea0: 20 72 62 75 44 65 6c 74 61 47 65 74 49 6e 74 28   rbuDeltaGetInt(
4eb0: 26 7a 44 65 6c 74 61 2c 20 26 6c 65 6e 44 65 6c  &zDelta, &lenDel
4ec0: 74 61 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ta);.        if(
4ed0: 20 6c 65 6e 44 65 6c 74 61 3e 30 20 26 26 20 7a   lenDelta>0 && z
4ee0: 44 65 6c 74 61 5b 30 5d 21 3d 27 2c 27 20 29 7b  Delta[0]!=',' ){
4ef0: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 52  .          /* ER
4f00: 52 4f 52 3a 20 63 6f 70 79 20 63 6f 6d 6d 61 6e  ROR: copy comman
4f10: 64 20 6e 6f 74 20 74 65 72 6d 69 6e 61 74 65 64  d not terminated
4f20: 20 62 79 20 27 2c 27 20 2a 2f 0a 20 20 20 20 20   by ',' */.     
4f30: 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a       return -1;.
4f40: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
4f50: 20 20 7a 44 65 6c 74 61 2b 2b 3b 20 6c 65 6e 44    zDelta++; lenD
4f60: 65 6c 74 61 2d 2d 3b 0a 20 20 20 20 20 20 20 20  elta--;.        
4f70: 74 6f 74 61 6c 20 2b 3d 20 63 6e 74 3b 0a 20 20  total += cnt;.  
4f80: 20 20 20 20 20 20 69 66 28 20 74 6f 74 61 6c 3e        if( total>
4f90: 6c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20  limit ){.       
4fa0: 20 20 20 2f 2a 20 45 52 52 4f 52 3a 20 63 6f 70     /* ERROR: cop
4fb0: 79 20 65 78 63 65 65 64 73 20 6f 75 74 70 75 74  y exceeds output
4fc0: 20 66 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20   file size */.  
4fd0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d          return -
4fe0: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
4ff0: 20 20 20 20 20 69 66 28 20 28 69 6e 74 29 28 6f       if( (int)(o
5000: 66 73 74 2b 63 6e 74 29 20 3e 20 6c 65 6e 53 72  fst+cnt) > lenSr
5010: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  c ){.          /
5020: 2a 20 45 52 52 4f 52 3a 20 63 6f 70 79 20 65 78  * ERROR: copy ex
5030: 74 65 6e 64 73 20 70 61 73 74 20 65 6e 64 20 6f  tends past end o
5040: 66 20 69 6e 70 75 74 20 2a 2f 0a 20 20 20 20 20  f input */.     
5050: 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a       return -1;.
5060: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5070: 20 20 6d 65 6d 63 70 79 28 7a 4f 75 74 2c 20 26    memcpy(zOut, &
5080: 7a 53 72 63 5b 6f 66 73 74 5d 2c 20 63 6e 74 29  zSrc[ofst], cnt)
5090: 3b 0a 20 20 20 20 20 20 20 20 7a 4f 75 74 20 2b  ;.        zOut +
50a0: 3d 20 63 6e 74 3b 0a 20 20 20 20 20 20 20 20 62  = cnt;.        b
50b0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
50c0: 20 20 20 20 63 61 73 65 20 27 3a 27 3a 20 7b 0a      case ':': {.
50d0: 20 20 20 20 20 20 20 20 7a 44 65 6c 74 61 2b 2b          zDelta++
50e0: 3b 20 6c 65 6e 44 65 6c 74 61 2d 2d 3b 0a 20 20  ; lenDelta--;.  
50f0: 20 20 20 20 20 20 74 6f 74 61 6c 20 2b 3d 20 63        total += c
5100: 6e 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  nt;.        if( 
5110: 74 6f 74 61 6c 3e 6c 69 6d 69 74 20 29 7b 0a 20  total>limit ){. 
5120: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 52 52 4f           /* ERRO
5130: 52 3a 20 20 69 6e 73 65 72 74 20 63 6f 6d 6d 61  R:  insert comma
5140: 6e 64 20 67 69 76 65 73 20 61 6e 20 6f 75 74 70  nd gives an outp
5150: 75 74 20 6c 61 72 67 65 72 20 74 68 61 6e 20 70  ut larger than p
5160: 72 65 64 69 63 74 65 64 20 2a 2f 0a 20 20 20 20  redicted */.    
5170: 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b        return -1;
5180: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5190: 20 20 20 69 66 28 20 28 69 6e 74 29 63 6e 74 3e     if( (int)cnt>
51a0: 6c 65 6e 44 65 6c 74 61 20 29 7b 0a 20 20 20 20  lenDelta ){.    
51b0: 20 20 20 20 20 20 2f 2a 20 45 52 52 4f 52 3a 20        /* ERROR: 
51c0: 69 6e 73 65 72 74 20 63 6f 75 6e 74 20 65 78 63  insert count exc
51d0: 65 65 64 73 20 73 69 7a 65 20 6f 66 20 64 65 6c  eeds size of del
51e0: 74 61 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ta */.          
51f0: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20  return -1;.     
5200: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6d 65 6d     }.        mem
5210: 63 70 79 28 7a 4f 75 74 2c 20 7a 44 65 6c 74 61  cpy(zOut, zDelta
5220: 2c 20 63 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  , cnt);.        
5230: 7a 4f 75 74 20 2b 3d 20 63 6e 74 3b 0a 20 20 20  zOut += cnt;.   
5240: 20 20 20 20 20 7a 44 65 6c 74 61 20 2b 3d 20 63       zDelta += c
5250: 6e 74 3b 0a 20 20 20 20 20 20 20 20 6c 65 6e 44  nt;.        lenD
5260: 65 6c 74 61 20 2d 3d 20 63 6e 74 3b 0a 20 20 20  elta -= cnt;.   
5270: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5280: 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 27    }.      case '
5290: 3b 27 3a 20 7b 0a 20 20 20 20 20 20 20 20 7a 44  ;': {.        zD
52a0: 65 6c 74 61 2b 2b 3b 20 6c 65 6e 44 65 6c 74 61  elta++; lenDelta
52b0: 2d 2d 3b 0a 20 20 20 20 20 20 20 20 7a 4f 75 74  --;.        zOut
52c0: 5b 30 5d 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66  [0] = 0;.#ifndef
52d0: 20 46 4f 53 53 49 4c 5f 4f 4d 49 54 5f 44 45 4c   FOSSIL_OMIT_DEL
52e0: 54 41 5f 43 4b 53 55 4d 5f 54 45 53 54 0a 20 20  TA_CKSUM_TEST.  
52f0: 20 20 20 20 20 20 69 66 28 20 63 6e 74 21 3d 72        if( cnt!=r
5300: 62 75 44 65 6c 74 61 43 68 65 63 6b 73 75 6d 28  buDeltaChecksum(
5310: 7a 4f 72 69 67 4f 75 74 2c 20 74 6f 74 61 6c 29  zOrigOut, total)
5320: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
5330: 20 45 52 52 4f 52 3a 20 20 62 61 64 20 63 68 65   ERROR:  bad che
5340: 63 6b 73 75 6d 20 2a 2f 0a 20 20 20 20 20 20 20  cksum */.       
5350: 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
5360: 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
5370: 20 20 20 20 20 20 20 69 66 28 20 74 6f 74 61 6c         if( total
5380: 21 3d 6c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20  !=limit ){.     
5390: 20 20 20 20 20 2f 2a 20 45 52 52 4f 52 3a 20 67       /* ERROR: g
53a0: 65 6e 65 72 61 74 65 64 20 73 69 7a 65 20 64 6f  enerated size do
53b0: 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 70 72 65  es not match pre
53c0: 64 69 63 74 65 64 20 73 69 7a 65 20 2a 2f 0a 20  dicted size */. 
53d0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
53e0: 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  -1;.        }.  
53f0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 6f 74        return tot
5400: 61 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  al;.      }.    
5410: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
5420: 20 20 20 20 20 2f 2a 20 45 52 52 4f 52 3a 20 75       /* ERROR: u
5430: 6e 6b 6e 6f 77 6e 20 64 65 6c 74 61 20 6f 70 65  nknown delta ope
5440: 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20  rator */.       
5450: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
5460: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
5470: 2f 2a 20 45 52 52 4f 52 3a 20 75 6e 74 65 72 6d  /* ERROR: unterm
5480: 69 6e 61 74 65 64 20 64 65 6c 74 61 20 2a 2f 0a  inated delta */.
5490: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a    return -1;.}..
54a0: 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 44 65  static int rbuDe
54b0: 6c 74 61 4f 75 74 70 75 74 53 69 7a 65 28 63 6f  ltaOutputSize(co
54c0: 6e 73 74 20 63 68 61 72 20 2a 7a 44 65 6c 74 61  nst char *zDelta
54d0: 2c 20 69 6e 74 20 6c 65 6e 44 65 6c 74 61 29 7b  , int lenDelta){
54e0: 0a 20 20 69 6e 74 20 73 69 7a 65 3b 0a 20 20 73  .  int size;.  s
54f0: 69 7a 65 20 3d 20 72 62 75 44 65 6c 74 61 47 65  ize = rbuDeltaGe
5500: 74 49 6e 74 28 26 7a 44 65 6c 74 61 2c 20 26 6c  tInt(&zDelta, &l
5510: 65 6e 44 65 6c 74 61 29 3b 0a 20 20 69 66 28 20  enDelta);.  if( 
5520: 2a 7a 44 65 6c 74 61 21 3d 27 5c 6e 27 20 29 7b  *zDelta!='\n' ){
5530: 0a 20 20 20 20 2f 2a 20 45 52 52 4f 52 3a 20 73  .    /* ERROR: s
5540: 69 7a 65 20 69 6e 74 65 67 65 72 20 6e 6f 74 20  ize integer not 
5550: 74 65 72 6d 69 6e 61 74 65 64 20 62 79 20 22 5c  terminated by "\
5560: 6e 22 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  n" */.    return
5570: 20 2d 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   -1;.  }.  retur
5580: 6e 20 73 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n size;.}../*.**
5590: 20 45 6e 64 20 6f 66 20 63 6f 64 65 20 74 61 6b   End of code tak
55a0: 65 6e 20 66 72 6f 6d 20 66 6f 73 73 69 6c 2e 0a  en from fossil..
55b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
55c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
55d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
55e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
55f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a  *********/../*.*
5600: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
5610: 20 6f 66 20 53 51 4c 20 73 63 61 6c 61 72 20 66   of SQL scalar f
5620: 75 6e 63 74 69 6f 6e 20 72 62 75 5f 66 6f 73 73  unction rbu_foss
5630: 69 6c 5f 64 65 6c 74 61 28 29 2e 0a 2a 2a 0a 2a  il_delta()..**.*
5640: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
5650: 61 70 70 6c 69 65 73 20 61 20 66 6f 73 73 69 6c  applies a fossil
5660: 20 64 65 6c 74 61 20 70 61 74 63 68 20 74 6f 20   delta patch to 
5670: 61 20 62 6c 6f 62 2e 20 45 78 61 63 74 6c 79 20  a blob. Exactly 
5680: 74 77 6f 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73  two.** arguments
5690: 20 6d 75 73 74 20 62 65 20 70 61 73 73 65 64 20   must be passed 
56a0: 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
56b0: 2e 20 54 68 65 20 66 69 72 73 74 20 69 73 20 74  . The first is t
56c0: 68 65 20 62 6c 6f 62 20 74 6f 0a 2a 2a 20 70 61  he blob to.** pa
56d0: 74 63 68 20 61 6e 64 20 74 68 65 20 73 65 63 6f  tch and the seco
56e0: 6e 64 20 74 68 65 20 70 61 74 63 68 20 74 6f 20  nd the patch to 
56f0: 61 70 70 6c 79 2e 20 49 66 20 6e 6f 20 65 72 72  apply. If no err
5700: 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 69 73 0a  or occurs, this.
5710: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  ** function retu
5720: 72 6e 73 20 74 68 65 20 70 61 74 63 68 65 64 20  rns the patched 
5730: 62 6c 6f 62 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  blob..*/.static 
5740: 76 6f 69 64 20 72 62 75 46 6f 73 73 69 6c 44 65  void rbuFossilDe
5750: 6c 74 61 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  ltaFunc(.  sqlit
5760: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
5770: 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  ext,.  int argc,
5780: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
5790: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63 6f 6e   **argv.){.  con
57a0: 73 74 20 63 68 61 72 20 2a 61 44 65 6c 74 61 3b  st char *aDelta;
57b0: 0a 20 20 69 6e 74 20 6e 44 65 6c 74 61 3b 0a 20  .  int nDelta;. 
57c0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 4f 72   const char *aOr
57d0: 69 67 3b 0a 20 20 69 6e 74 20 6e 4f 72 69 67 3b  ig;.  int nOrig;
57e0: 0a 0a 20 20 69 6e 74 20 6e 4f 75 74 3b 0a 20 20  ..  int nOut;.  
57f0: 69 6e 74 20 6e 4f 75 74 32 3b 0a 20 20 63 68 61  int nOut2;.  cha
5800: 72 20 2a 61 4f 75 74 3b 0a 0a 20 20 61 73 73 65  r *aOut;..  asse
5810: 72 74 28 20 61 72 67 63 3d 3d 32 20 29 3b 0a 0a  rt( argc==2 );..
5820: 20 20 6e 4f 72 69 67 20 3d 20 73 71 6c 69 74 65    nOrig = sqlite
5830: 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72  3_value_bytes(ar
5840: 67 76 5b 30 5d 29 3b 0a 20 20 61 4f 72 69 67 20  gv[0]);.  aOrig 
5850: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
5860: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f  qlite3_value_blo
5870: 62 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 6e 44  b(argv[0]);.  nD
5880: 65 6c 74 61 20 3d 20 73 71 6c 69 74 65 33 5f 76  elta = sqlite3_v
5890: 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b  alue_bytes(argv[
58a0: 31 5d 29 3b 0a 20 20 61 44 65 6c 74 61 20 3d 20  1]);.  aDelta = 
58b0: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
58c0: 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28  ite3_value_blob(
58d0: 61 72 67 76 5b 31 5d 29 3b 0a 0a 20 20 2f 2a 20  argv[1]);..  /* 
58e0: 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 73  Figure out the s
58f0: 69 7a 65 20 6f 66 20 74 68 65 20 6f 75 74 70 75  ize of the outpu
5900: 74 20 2a 2f 0a 20 20 6e 4f 75 74 20 3d 20 72 62  t */.  nOut = rb
5910: 75 44 65 6c 74 61 4f 75 74 70 75 74 53 69 7a 65  uDeltaOutputSize
5920: 28 61 44 65 6c 74 61 2c 20 6e 44 65 6c 74 61 29  (aDelta, nDelta)
5930: 3b 0a 20 20 69 66 28 20 6e 4f 75 74 3c 30 20 29  ;.  if( nOut<0 )
5940: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
5950: 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65  sult_error(conte
5960: 78 74 2c 20 22 63 6f 72 72 75 70 74 20 66 6f 73  xt, "corrupt fos
5970: 73 69 6c 20 64 65 6c 74 61 22 2c 20 2d 31 29 3b  sil delta", -1);
5980: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
5990: 0a 0a 20 20 61 4f 75 74 20 3d 20 73 71 6c 69 74  ..  aOut = sqlit
59a0: 65 33 5f 6d 61 6c 6c 6f 63 28 6e 4f 75 74 2b 31  e3_malloc(nOut+1
59b0: 29 3b 0a 20 20 69 66 28 20 61 4f 75 74 3d 3d 30  );.  if( aOut==0
59c0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
59d0: 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d  result_error_nom
59e0: 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 7d  em(context);.  }
59f0: 65 6c 73 65 7b 0a 20 20 20 20 6e 4f 75 74 32 20  else{.    nOut2 
5a00: 3d 20 72 62 75 44 65 6c 74 61 41 70 70 6c 79 28  = rbuDeltaApply(
5a10: 61 4f 72 69 67 2c 20 6e 4f 72 69 67 2c 20 61 44  aOrig, nOrig, aD
5a20: 65 6c 74 61 2c 20 6e 44 65 6c 74 61 2c 20 61 4f  elta, nDelta, aO
5a30: 75 74 29 3b 0a 20 20 20 20 69 66 28 20 6e 4f 75  ut);.    if( nOu
5a40: 74 32 21 3d 6e 4f 75 74 20 29 7b 0a 20 20 20 20  t2!=nOut ){.    
5a50: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
5a60: 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20  _error(context, 
5a70: 22 63 6f 72 72 75 70 74 20 66 6f 73 73 69 6c 20  "corrupt fossil 
5a80: 64 65 6c 74 61 22 2c 20 2d 31 29 3b 0a 20 20 20  delta", -1);.   
5a90: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
5aa0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f  lite3_result_blo
5ab0: 62 28 63 6f 6e 74 65 78 74 2c 20 61 4f 75 74 2c  b(context, aOut,
5ac0: 20 6e 4f 75 74 2c 20 73 71 6c 69 74 65 33 5f 66   nOut, sqlite3_f
5ad0: 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ree);.    }.  }.
5ae0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72  }.../*.** Prepar
5af0: 65 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  e the SQL statem
5b00: 65 6e 74 20 69 6e 20 62 75 66 66 65 72 20 7a 53  ent in buffer zS
5b10: 71 6c 20 61 67 61 69 6e 73 74 20 64 61 74 61 62  ql against datab
5b20: 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a  ase handle db..*
5b30: 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
5b40: 20 73 65 74 20 2a 70 70 53 74 6d 74 20 74 6f 20   set *ppStmt to 
5b50: 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77  point to the new
5b60: 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 72   statement and r
5b70: 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f  eturn.** SQLITE_
5b80: 4f 4b 2e 20 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  OK. .**.** Other
5b90: 77 69 73 65 2c 20 69 66 20 61 6e 20 65 72 72 6f  wise, if an erro
5ba0: 72 20 64 6f 65 73 20 6f 63 63 75 72 2c 20 73 65  r does occur, se
5bb0: 74 20 2a 70 70 53 74 6d 74 20 74 6f 20 4e 55 4c  t *ppStmt to NUL
5bc0: 4c 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20  L and return.** 
5bd0: 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
5be0: 63 6f 64 65 2e 20 41 64 64 69 74 69 6f 6e 61 6c  code. Additional
5bf0: 6c 79 2c 20 73 65 74 20 6f 75 74 70 75 74 20 76  ly, set output v
5c00: 61 72 69 61 62 6c 65 20 2a 70 7a 45 72 72 6d 73  ariable *pzErrms
5c10: 67 20 74 6f 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f  g to.** point to
5c20: 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69   a buffer contai
5c30: 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 6d 65  ning an error me
5c40: 73 73 61 67 65 2e 20 49 74 20 69 73 20 74 68 65  ssage. It is the
5c50: 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 0a   responsibility.
5c60: 2a 2a 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72  ** of the caller
5c70: 20 74 6f 20 28 65 76 65 6e 74 75 61 6c 6c 79 29   to (eventually)
5c80: 20 66 72 65 65 20 74 68 69 73 20 62 75 66 66 65   free this buffe
5c90: 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f  r using sqlite3_
5ca0: 66 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  free()..*/.stati
5cb0: 63 20 69 6e 74 20 70 72 65 70 61 72 65 41 6e 64  c int prepareAnd
5cc0: 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 0a 20 20  CollectError(.  
5cd0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20  sqlite3 *db, .  
5ce0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70  sqlite3_stmt **p
5cf0: 70 53 74 6d 74 2c 0a 20 20 63 68 61 72 20 2a 2a  pStmt,.  char **
5d00: 70 7a 45 72 72 6d 73 67 2c 0a 20 20 63 6f 6e 73  pzErrmsg,.  cons
5d10: 74 20 63 68 61 72 20 2a 7a 53 71 6c 0a 29 7b 0a  t char *zSql.){.
5d20: 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
5d30: 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62  e3_prepare_v2(db
5d40: 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 70 70 53 74  , zSql, -1, ppSt
5d50: 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  mt, 0);.  if( rc
5d60: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
5d70: 20 20 20 2a 70 7a 45 72 72 6d 73 67 20 3d 20 73     *pzErrmsg = s
5d80: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
5d90: 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  %s", sqlite3_err
5da0: 6d 73 67 28 64 62 29 29 3b 0a 20 20 20 20 2a 70  msg(db));.    *p
5db0: 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20  pStmt = 0;.  }. 
5dc0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
5dd0: 2a 0a 2a 2a 20 52 65 73 65 74 20 74 68 65 20 53  *.** Reset the S
5de0: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73  QL statement pas
5df0: 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
5e00: 20 61 72 67 75 6d 65 6e 74 2e 20 52 65 74 75 72   argument. Retur
5e10: 6e 20 61 20 63 6f 70 79 0a 2a 2a 20 6f 66 20 74  n a copy.** of t
5e20: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
5e30: 64 20 62 79 20 73 71 6c 69 74 65 33 5f 72 65 73  d by sqlite3_res
5e40: 65 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  et()..**.** If a
5e50: 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75  n error has occu
5e60: 72 72 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a  rred, then set *
5e70: 70 7a 45 72 72 6d 73 67 20 74 6f 20 70 6f 69 6e  pzErrmsg to poin
5e80: 74 20 74 6f 20 61 20 62 75 66 66 65 72 0a 2a 2a  t to a buffer.**
5e90: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6e 20 65   containing an e
5ea0: 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 20 49 74  rror message. It
5eb0: 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
5ec0: 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
5ed0: 6c 6c 65 72 0a 2a 2a 20 74 6f 20 65 76 65 6e 74  ller.** to event
5ee0: 75 61 6c 6c 79 20 66 72 65 65 20 74 68 69 73 20  ually free this 
5ef0: 62 75 66 66 65 72 20 75 73 69 6e 67 20 73 71 6c  buffer using sql
5f00: 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a  ite3_free()..*/.
5f10: 73 74 61 74 69 63 20 69 6e 74 20 72 65 73 65 74  static int reset
5f20: 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28  AndCollectError(
5f30: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
5f40: 74 6d 74 2c 20 63 68 61 72 20 2a 2a 70 7a 45 72  tmt, char **pzEr
5f50: 72 6d 73 67 29 7b 0a 20 20 69 6e 74 20 72 63 20  rmsg){.  int rc 
5f60: 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
5f70: 70 53 74 6d 74 29 3b 0a 20 20 69 66 28 20 72 63  pStmt);.  if( rc
5f80: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
5f90: 20 20 20 2a 70 7a 45 72 72 6d 73 67 20 3d 20 73     *pzErrmsg = s
5fa0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
5fb0: 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  %s", sqlite3_err
5fc0: 6d 73 67 28 73 71 6c 69 74 65 33 5f 64 62 5f 68  msg(sqlite3_db_h
5fd0: 61 6e 64 6c 65 28 70 53 74 6d 74 29 29 29 3b 0a  andle(pStmt)));.
5fe0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
5ff0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73  .}../*.** Unless
6000: 20 69 74 20 69 73 20 4e 55 4c 4c 2c 20 61 72 67   it is NULL, arg
6010: 75 6d 65 6e 74 20 7a 53 71 6c 20 70 6f 69 6e 74  ument zSql point
6020: 73 20 74 6f 20 61 20 62 75 66 66 65 72 20 61 6c  s to a buffer al
6030: 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 0a 2a 2a  located using.**
6040: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 20   sqlite3_malloc 
6050: 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6e 20 53 51  containing an SQ
6060: 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69  L statement. Thi
6070: 73 20 66 75 6e 63 74 69 6f 6e 20 70 72 65 70 61  s function prepa
6080: 72 65 73 20 74 68 65 20 53 51 4c 0a 2a 2a 20 73  res the SQL.** s
6090: 74 61 74 65 6d 65 6e 74 20 61 67 61 69 6e 73 74  tatement against
60a0: 20 64 61 74 61 62 61 73 65 20 64 62 20 61 6e 64   database db and
60b0: 20 66 72 65 65 73 20 74 68 65 20 62 75 66 66 65   frees the buffe
60c0: 72 2e 20 49 66 20 73 74 61 74 65 6d 65 6e 74 20  r. If statement 
60d0: 0a 2a 2a 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 20  .** compilation 
60e0: 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 2a  is successful, *
60f0: 70 70 53 74 6d 74 20 69 73 20 73 65 74 20 74 6f  ppStmt is set to
6100: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65   point to the ne
6110: 77 20 73 74 61 74 65 6d 65 6e 74 20 0a 2a 2a 20  w statement .** 
6120: 68 61 6e 64 6c 65 20 61 6e 64 20 53 51 4c 49 54  handle and SQLIT
6130: 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
6140: 2e 20 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  . .**.** Otherwi
6150: 73 65 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20  se, if an error 
6160: 6f 63 63 75 72 73 2c 20 2a 70 70 53 74 6d 74 20  occurs, *ppStmt 
6170: 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61  is set to NULL a
6180: 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  nd an error code
6190: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20 49 6e  .** returned. In
61a0: 20 74 68 69 73 20 63 61 73 65 2c 20 2a 70 7a 45   this case, *pzE
61b0: 72 72 6d 73 67 20 6d 61 79 20 61 6c 73 6f 20 62  rrmsg may also b
61c0: 65 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  e set to point t
61d0: 6f 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 6d 65  o an error.** me
61e0: 73 73 61 67 65 2e 20 49 74 20 69 73 20 74 68 65  ssage. It is the
61f0: 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
6200: 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  of the caller to
6210: 20 66 72 65 65 20 74 68 69 73 20 65 72 72 6f 72   free this error
6220: 20 6d 65 73 73 61 67 65 0a 2a 2a 20 62 75 66 66   message.** buff
6230: 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  er using sqlite3
6240: 5f 66 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49  _free()..**.** I
6250: 66 20 61 72 67 75 6d 65 6e 74 20 7a 53 71 6c 20  f argument zSql 
6260: 69 73 20 4e 55 4c 4c 2c 20 74 68 69 73 20 66 75  is NULL, this fu
6270: 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74  nction assumes t
6280: 68 61 74 20 61 6e 20 4f 4f 4d 20 68 61 73 20 6f  hat an OOM has o
6290: 63 63 75 72 72 65 64 2e 0a 2a 2a 20 49 6e 20 74  ccurred..** In t
62a0: 68 69 73 20 63 61 73 65 20 53 51 4c 49 54 45 5f  his case SQLITE_
62b0: 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65  NOMEM is returne
62c0: 64 20 61 6e 64 20 2a 70 70 53 74 6d 74 20 73 65  d and *ppStmt se
62d0: 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74  t to NULL..*/.st
62e0: 61 74 69 63 20 69 6e 74 20 70 72 65 70 61 72 65  atic int prepare
62f0: 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72  FreeAndCollectEr
6300: 72 6f 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ror(.  sqlite3 *
6310: 64 62 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 73  db, .  sqlite3_s
6320: 74 6d 74 20 2a 2a 70 70 53 74 6d 74 2c 0a 20 20  tmt **ppStmt,.  
6330: 63 68 61 72 20 2a 2a 70 7a 45 72 72 6d 73 67 2c  char **pzErrmsg,
6340: 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 0a 29 7b  .  char *zSql.){
6350: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73  .  int rc;.  ass
6360: 65 72 74 28 20 2a 70 7a 45 72 72 6d 73 67 3d 3d  ert( *pzErrmsg==
6370: 30 20 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d  0 );.  if( zSql=
6380: 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  =0 ){.    rc = S
6390: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
63a0: 20 2a 70 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20   *ppStmt = 0;.  
63b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
63c0: 70 72 65 70 61 72 65 41 6e 64 43 6f 6c 6c 65 63  prepareAndCollec
63d0: 74 45 72 72 6f 72 28 64 62 2c 20 70 70 53 74 6d  tError(db, ppStm
63e0: 74 2c 20 70 7a 45 72 72 6d 73 67 2c 20 7a 53 71  t, pzErrmsg, zSq
63f0: 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  l);.    sqlite3_
6400: 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 7d 0a  free(zSql);.  }.
6410: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
6420: 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 52  /*.** Free the R
6430: 62 75 4f 62 6a 49 74 65 72 2e 61 7a 54 62 6c 43  buObjIter.azTblC
6440: 6f 6c 5b 5d 20 61 6e 64 20 52 62 75 4f 62 6a 49  ol[] and RbuObjI
6450: 74 65 72 2e 61 62 54 62 6c 50 6b 5b 5d 20 61 72  ter.abTblPk[] ar
6460: 72 61 79 73 20 61 6c 6c 6f 63 61 74 65 64 0a 2a  rays allocated.*
6470: 2a 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20  * by an earlier 
6480: 63 61 6c 6c 20 74 6f 20 72 62 75 4f 62 6a 49 74  call to rbuObjIt
6490: 65 72 43 61 63 68 65 54 61 62 6c 65 49 6e 66 6f  erCacheTableInfo
64a0: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ()..*/.static vo
64b0: 69 64 20 72 62 75 4f 62 6a 49 74 65 72 46 72 65  id rbuObjIterFre
64c0: 65 43 6f 6c 73 28 52 62 75 4f 62 6a 49 74 65 72  eCols(RbuObjIter
64d0: 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e 74 20   *pIter){.  int 
64e0: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
64f0: 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 3b 20  pIter->nTblCol; 
6500: 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
6510: 33 5f 66 72 65 65 28 70 49 74 65 72 2d 3e 61 7a  3_free(pIter->az
6520: 54 62 6c 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20  TblCol[i]);.    
6530: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 74  sqlite3_free(pIt
6540: 65 72 2d 3e 61 7a 54 62 6c 54 79 70 65 5b 69 5d  er->azTblType[i]
6550: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
6560: 5f 66 72 65 65 28 70 49 74 65 72 2d 3e 61 7a 54  _free(pIter->azT
6570: 62 6c 43 6f 6c 29 3b 0a 20 20 70 49 74 65 72 2d  blCol);.  pIter-
6580: 3e 61 7a 54 62 6c 43 6f 6c 20 3d 20 30 3b 0a 20  >azTblCol = 0;. 
6590: 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 54 79 70   pIter->azTblTyp
65a0: 65 20 3d 20 30 3b 0a 20 20 70 49 74 65 72 2d 3e  e = 0;.  pIter->
65b0: 61 69 53 72 63 4f 72 64 65 72 20 3d 20 30 3b 0a  aiSrcOrder = 0;.
65c0: 20 20 70 49 74 65 72 2d 3e 61 62 54 62 6c 50 6b    pIter->abTblPk
65d0: 20 3d 20 30 3b 0a 20 20 70 49 74 65 72 2d 3e 61   = 0;.  pIter->a
65e0: 62 4e 6f 74 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20  bNotNull = 0;.  
65f0: 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 20 3d  pIter->nTblCol =
6600: 20 30 3b 0a 20 20 70 49 74 65 72 2d 3e 65 54 79   0;.  pIter->eTy
6610: 70 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  pe = 0;         
6620: 20 20 20 20 20 20 2f 2a 20 49 6e 76 61 6c 69 64        /* Invalid
6630: 20 76 61 6c 75 65 20 2a 2f 0a 7d 0a 0a 2f 2a 0a   value */.}../*.
6640: 2a 2a 20 46 69 6e 61 6c 69 7a 65 20 61 6c 6c 20  ** Finalize all 
6650: 73 74 61 74 65 6d 65 6e 74 73 20 61 6e 64 20 66  statements and f
6660: 72 65 65 20 61 6c 6c 20 61 6c 6c 6f 63 61 74 69  ree all allocati
6670: 6f 6e 73 20 74 68 61 74 20 61 72 65 20 73 70 65  ons that are spe
6680: 63 69 66 69 63 20 74 6f 0a 2a 2a 20 74 68 65 20  cific to.** the 
6690: 63 75 72 72 65 6e 74 20 6f 62 6a 65 63 74 20 28  current object (
66a0: 74 61 62 6c 65 2f 69 6e 64 65 78 20 70 61 69 72  table/index pair
66b0: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
66c0: 64 20 72 62 75 4f 62 6a 49 74 65 72 43 6c 65 61  d rbuObjIterClea
66d0: 72 53 74 61 74 65 6d 65 6e 74 73 28 52 62 75 4f  rStatements(RbuO
66e0: 62 6a 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  bjIter *pIter){.
66f0: 20 20 52 62 75 55 70 64 61 74 65 53 74 6d 74 20    RbuUpdateStmt 
6700: 2a 70 55 70 3b 0a 0a 20 20 73 71 6c 69 74 65 33  *pUp;..  sqlite3
6710: 5f 66 69 6e 61 6c 69 7a 65 28 70 49 74 65 72 2d  _finalize(pIter-
6720: 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c  >pSelect);.  sql
6730: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 49  ite3_finalize(pI
6740: 74 65 72 2d 3e 70 49 6e 73 65 72 74 29 3b 0a 20  ter->pInsert);. 
6750: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
6760: 65 28 70 49 74 65 72 2d 3e 70 44 65 6c 65 74 65  e(pIter->pDelete
6770: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  );.  sqlite3_fin
6780: 61 6c 69 7a 65 28 70 49 74 65 72 2d 3e 70 54 6d  alize(pIter->pTm
6790: 70 49 6e 73 65 72 74 29 3b 0a 20 20 70 55 70 20  pInsert);.  pUp 
67a0: 3d 20 70 49 74 65 72 2d 3e 70 52 62 75 55 70 64  = pIter->pRbuUpd
67b0: 61 74 65 3b 0a 20 20 77 68 69 6c 65 28 20 70 55  ate;.  while( pU
67c0: 70 20 29 7b 0a 20 20 20 20 52 62 75 55 70 64 61  p ){.    RbuUpda
67d0: 74 65 53 74 6d 74 20 2a 70 54 6d 70 20 3d 20 70  teStmt *pTmp = p
67e0: 55 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 73  Up->pNext;.    s
67f0: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
6800: 70 55 70 2d 3e 70 55 70 64 61 74 65 29 3b 0a 20  pUp->pUpdate);. 
6810: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
6820: 70 55 70 29 3b 0a 20 20 20 20 70 55 70 20 3d 20  pUp);.    pUp = 
6830: 70 54 6d 70 3b 0a 20 20 7d 0a 20 20 0a 20 20 70  pTmp;.  }.  .  p
6840: 49 74 65 72 2d 3e 70 53 65 6c 65 63 74 20 3d 20  Iter->pSelect = 
6850: 30 3b 0a 20 20 70 49 74 65 72 2d 3e 70 49 6e 73  0;.  pIter->pIns
6860: 65 72 74 20 3d 20 30 3b 0a 20 20 70 49 74 65 72  ert = 0;.  pIter
6870: 2d 3e 70 44 65 6c 65 74 65 20 3d 20 30 3b 0a 20  ->pDelete = 0;. 
6880: 20 70 49 74 65 72 2d 3e 70 52 62 75 55 70 64 61   pIter->pRbuUpda
6890: 74 65 20 3d 20 30 3b 0a 20 20 70 49 74 65 72 2d  te = 0;.  pIter-
68a0: 3e 70 54 6d 70 49 6e 73 65 72 74 20 3d 20 30 3b  >pTmpInsert = 0;
68b0: 0a 20 20 70 49 74 65 72 2d 3e 6e 43 6f 6c 20 3d  .  pIter->nCol =
68c0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65   0;.}../*.** Cle
68d0: 61 6e 20 75 70 20 61 6e 79 20 72 65 73 6f 75 72  an up any resour
68e0: 63 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 73  ces allocated as
68f0: 20 70 61 72 74 20 6f 66 20 74 68 65 20 69 74 65   part of the ite
6900: 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 70 61 73  rator object pas
6910: 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 6f 6e  sed.** as the on
6920: 6c 79 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  ly argument..*/.
6930: 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75 4f  static void rbuO
6940: 62 6a 49 74 65 72 46 69 6e 61 6c 69 7a 65 28 52  bjIterFinalize(R
6950: 62 75 4f 62 6a 49 74 65 72 20 2a 70 49 74 65 72  buObjIter *pIter
6960: 29 7b 0a 20 20 72 62 75 4f 62 6a 49 74 65 72 43  ){.  rbuObjIterC
6970: 6c 65 61 72 53 74 61 74 65 6d 65 6e 74 73 28 70  learStatements(p
6980: 49 74 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  Iter);.  sqlite3
6990: 5f 66 69 6e 61 6c 69 7a 65 28 70 49 74 65 72 2d  _finalize(pIter-
69a0: 3e 70 54 62 6c 49 74 65 72 29 3b 0a 20 20 73 71  >pTblIter);.  sq
69b0: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
69c0: 49 74 65 72 2d 3e 70 49 64 78 49 74 65 72 29 3b  Iter->pIdxIter);
69d0: 0a 20 20 72 62 75 4f 62 6a 49 74 65 72 46 72 65  .  rbuObjIterFre
69e0: 65 43 6f 6c 73 28 70 49 74 65 72 29 3b 0a 20 20  eCols(pIter);.  
69f0: 6d 65 6d 73 65 74 28 70 49 74 65 72 2c 20 30 2c  memset(pIter, 0,
6a00: 20 73 69 7a 65 6f 66 28 52 62 75 4f 62 6a 49 74   sizeof(RbuObjIt
6a10: 65 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  er));.}../*.** A
6a20: 64 76 61 6e 63 65 20 74 68 65 20 69 74 65 72 61  dvance the itera
6a30: 74 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20  tor to the next 
6a40: 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  position..**.** 
6a50: 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  If no error occu
6a60: 72 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  rs, SQLITE_OK is
6a70: 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68   returned and th
6a80: 65 20 69 74 65 72 61 74 6f 72 20 69 73 20 6c 65  e iterator is le
6a90: 66 74 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20  ft .** pointing 
6aa0: 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72  to the next entr
6ab0: 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e  y. Otherwise, an
6ac0: 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20   error code and 
6ad0: 6d 65 73 73 61 67 65 20 69 73 20 0a 2a 2a 20 6c  message is .** l
6ae0: 65 66 74 20 69 6e 20 74 68 65 20 52 42 55 20 68  eft in the RBU h
6af0: 61 6e 64 6c 65 20 70 61 73 73 65 64 20 61 73 20  andle passed as 
6b00: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
6b10: 6e 74 2e 20 41 20 63 6f 70 79 20 6f 66 20 74 68  nt. A copy of th
6b20: 65 20 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65  e .** error code
6b30: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
6b40: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 4f  .static int rbuO
6b50: 62 6a 49 74 65 72 4e 65 78 74 28 73 71 6c 69 74  bjIterNext(sqlit
6b60: 65 33 72 62 75 20 2a 70 2c 20 52 62 75 4f 62 6a  e3rbu *p, RbuObj
6b70: 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
6b80: 69 6e 74 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a  int rc = p->rc;.
6b90: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
6ba0: 5f 4f 4b 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 46  _OK ){..    /* F
6bb0: 72 65 65 20 61 6e 79 20 53 51 4c 69 74 65 20 73  ree any SQLite s
6bc0: 74 61 74 65 6d 65 6e 74 73 20 75 73 65 64 20 77  tatements used w
6bd0: 68 69 6c 65 20 70 72 6f 63 65 73 73 69 6e 67 20  hile processing 
6be0: 74 68 65 20 70 72 65 76 69 6f 75 73 20 6f 62 6a  the previous obj
6bf0: 65 63 74 20 2a 2f 20 0a 20 20 20 20 72 62 75 4f  ect */ .    rbuO
6c00: 62 6a 49 74 65 72 43 6c 65 61 72 53 74 61 74 65  bjIterClearState
6c10: 6d 65 6e 74 73 28 70 49 74 65 72 29 3b 0a 20 20  ments(pIter);.  
6c20: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 7a 49 64    if( pIter->zId
6c30: 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  x==0 ){.      rc
6c40: 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28   = sqlite3_exec(
6c50: 70 2d 3e 64 62 4d 61 69 6e 2c 0a 20 20 20 20 20  p->dbMain,.     
6c60: 20 20 20 20 20 22 44 52 4f 50 20 54 52 49 47 47       "DROP TRIGG
6c70: 45 52 20 49 46 20 45 58 49 53 54 53 20 74 65 6d  ER IF EXISTS tem
6c80: 70 2e 72 62 75 5f 69 6e 73 65 72 74 5f 74 72 3b  p.rbu_insert_tr;
6c90: 22 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 75 70 64  STS temp.rbu_upd
6cc0: 61 74 65 31 5f 74 72 3b 22 0a 20 20 20 20 20 20  ate1_tr;".      
6cd0: 20 20 20 20 22 44 52 4f 50 20 54 52 49 47 47 45      "DROP TRIGGE
6ce0: 52 20 49 46 20 45 58 49 53 54 53 20 74 65 6d 70  R IF EXISTS temp
6cf0: 2e 72 62 75 5f 75 70 64 61 74 65 32 5f 74 72 3b  .rbu_update2_tr;
6d00: 22 0a 20 20 20 20 20 20 20 20 20 20 22 44 52 4f  ".          "DRO
6d10: 50 20 54 52 49 47 47 45 52 20 49 46 20 45 58 49  P TRIGGER IF EXI
6d20: 53 54 53 20 74 65 6d 70 2e 72 62 75 5f 64 65 6c  STS temp.rbu_del
6d30: 65 74 65 5f 74 72 3b 22 0a 20 20 20 20 20 20 20  ete_tr;".       
6d40: 20 20 20 2c 20 30 2c 20 30 2c 20 26 70 2d 3e 7a     , 0, 0, &p->z
6d50: 45 72 72 6d 73 67 0a 20 20 20 20 20 20 29 3b 0a  Errmsg.      );.
6d60: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72      }..    if( r
6d70: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
6d80: 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d        if( pIter-
6d90: 3e 62 43 6c 65 61 6e 75 70 20 29 7b 0a 20 20 20  >bCleanup ){.   
6da0: 20 20 20 20 20 72 62 75 4f 62 6a 49 74 65 72 46       rbuObjIterF
6db0: 72 65 65 43 6f 6c 73 28 70 49 74 65 72 29 3b 0a  reeCols(pIter);.
6dc0: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 62          pIter->b
6dd0: 43 6c 65 61 6e 75 70 20 3d 20 30 3b 0a 20 20 20  Cleanup = 0;.   
6de0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
6df0: 33 5f 73 74 65 70 28 70 49 74 65 72 2d 3e 70 54  3_step(pIter->pT
6e00: 62 6c 49 74 65 72 29 3b 0a 20 20 20 20 20 20 20  blIter);.       
6e10: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
6e20: 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ROW ){.         
6e30: 20 72 63 20 3d 20 72 65 73 65 74 41 6e 64 43 6f   rc = resetAndCo
6e40: 6c 6c 65 63 74 45 72 72 6f 72 28 70 49 74 65 72  llectError(pIter
6e50: 2d 3e 70 54 62 6c 49 74 65 72 2c 20 26 70 2d 3e  ->pTblIter, &p->
6e60: 7a 45 72 72 6d 73 67 29 3b 0a 20 20 20 20 20 20  zErrmsg);.      
6e70: 20 20 20 20 70 49 74 65 72 2d 3e 7a 54 62 6c 20      pIter->zTbl 
6e80: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 0;.        }el
6e90: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49  se{.          pI
6ea0: 74 65 72 2d 3e 7a 54 62 6c 20 3d 20 28 63 6f 6e  ter->zTbl = (con
6eb0: 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
6ec0: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 49 74  _column_text(pIt
6ed0: 65 72 2d 3e 70 54 62 6c 49 74 65 72 2c 20 30 29  er->pTblIter, 0)
6ee0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65  ;.          pIte
6ef0: 72 2d 3e 7a 44 61 74 61 54 62 6c 20 3d 20 28 63  r->zDataTbl = (c
6f00: 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
6f10: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
6f20: 49 74 65 72 2d 3e 70 54 62 6c 49 74 65 72 2c 31  Iter->pTblIter,1
6f30: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
6f40: 3d 20 28 70 49 74 65 72 2d 3e 7a 44 61 74 61 54  = (pIter->zDataT
6f50: 62 6c 20 26 26 20 70 49 74 65 72 2d 3e 7a 54 62  bl && pIter->zTb
6f60: 6c 29 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a  l) ? SQLITE_OK :
6f70: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
6f80: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
6f90: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66  else{.        if
6fa0: 28 20 70 49 74 65 72 2d 3e 7a 49 64 78 3d 3d 30  ( pIter->zIdx==0
6fb0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
6fc0: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 49 64 78  lite3_stmt *pIdx
6fd0: 20 3d 20 70 49 74 65 72 2d 3e 70 49 64 78 49 74   = pIter->pIdxIt
6fe0: 65 72 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  er;.          rc
6ff0: 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f   = sqlite3_bind_
7000: 74 65 78 74 28 70 49 64 78 2c 20 31 2c 20 70 49  text(pIdx, 1, pI
7010: 74 65 72 2d 3e 7a 54 62 6c 2c 20 2d 31 2c 20 53  ter->zTbl, -1, S
7020: 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
7030: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7040: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
7050: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
7060: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65  rc = sqlite3_ste
7070: 70 28 70 49 74 65 72 2d 3e 70 49 64 78 49 74 65  p(pIter->pIdxIte
7080: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  r);.          if
7090: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 52 4f 57  ( rc!=SQLITE_ROW
70a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
70b0: 72 63 20 3d 20 72 65 73 65 74 41 6e 64 43 6f 6c  rc = resetAndCol
70c0: 6c 65 63 74 45 72 72 6f 72 28 70 49 74 65 72 2d  lectError(pIter-
70d0: 3e 70 49 64 78 49 74 65 72 2c 20 26 70 2d 3e 7a  >pIdxIter, &p->z
70e0: 45 72 72 6d 73 67 29 3b 0a 20 20 20 20 20 20 20  Errmsg);.       
70f0: 20 20 20 20 20 70 49 74 65 72 2d 3e 62 43 6c 65       pIter->bCle
7100: 61 6e 75 70 20 3d 20 31 3b 0a 20 20 20 20 20 20  anup = 1;.      
7110: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 7a 49 64        pIter->zId
7120: 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  x = 0;.         
7130: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
7140: 20 20 20 20 70 49 74 65 72 2d 3e 7a 49 64 78 20      pIter->zIdx 
7150: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
7160: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
7170: 78 74 28 70 49 74 65 72 2d 3e 70 49 64 78 49 74  xt(pIter->pIdxIt
7180: 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  er, 0);.        
7190: 20 20 20 20 70 49 74 65 72 2d 3e 69 54 6e 75 6d      pIter->iTnum
71a0: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
71b0: 6e 5f 69 6e 74 28 70 49 74 65 72 2d 3e 70 49 64  n_int(pIter->pId
71c0: 78 49 74 65 72 2c 20 31 29 3b 0a 20 20 20 20 20  xIter, 1);.     
71d0: 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 62 55         pIter->bU
71e0: 6e 69 71 75 65 20 3d 20 73 71 6c 69 74 65 33 5f  nique = sqlite3_
71f0: 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 49 74 65 72  column_int(pIter
7200: 2d 3e 70 49 64 78 49 74 65 72 2c 20 32 29 3b 0a  ->pIdxIter, 2);.
7210: 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
7220: 20 70 49 74 65 72 2d 3e 7a 49 64 78 20 3f 20 53   pIter->zIdx ? S
7230: 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49 54  QLITE_OK : SQLIT
7240: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
7250: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
7260: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
7270: 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ..  if( rc!=SQLI
7280: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 62 75  TE_OK ){.    rbu
7290: 4f 62 6a 49 74 65 72 46 69 6e 61 6c 69 7a 65 28  ObjIterFinalize(
72a0: 70 49 74 65 72 29 3b 0a 20 20 20 20 70 2d 3e 72  pIter);.    p->r
72b0: 63 20 3d 20 72 63 3b 0a 20 20 7d 0a 20 20 72 65  c = rc;.  }.  re
72c0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
72d0: 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74  ** The implement
72e0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 72 62 75  ation of the rbu
72f0: 5f 74 61 72 67 65 74 5f 6e 61 6d 65 28 29 20 53  _target_name() S
7300: 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 69  QL function. Thi
7310: 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 63  s function.** ac
7320: 63 65 70 74 73 20 6f 6e 65 20 6f 72 20 74 77 6f  cepts one or two
7330: 20 61 72 67 75 6d 65 6e 74 73 2e 20 54 68 65 20   arguments. The 
7340: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
7350: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  s the name of a 
7360: 74 61 62 6c 65 20 2d 0a 2a 2a 20 74 68 65 20 6e  table -.** the n
7370: 61 6d 65 20 6f 66 20 61 20 74 61 62 6c 65 20 69  ame of a table i
7380: 6e 20 74 68 65 20 52 42 55 20 64 61 74 61 62 61  n the RBU databa
7390: 73 65 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 2c  se.  The second,
73a0: 20 69 66 20 69 74 20 69 73 20 70 72 65 73 65 6e   if it is presen
73b0: 74 2c 20 69 73 20 31 0a 2a 2a 20 66 6f 72 20 61  t, is 1.** for a
73c0: 20 76 69 65 77 20 6f 72 20 30 20 66 6f 72 20 61   view or 0 for a
73d0: 20 74 61 62 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 46   table. .**.** F
73e0: 6f 72 20 61 20 6e 6f 6e 2d 76 61 63 75 75 6d 20  or a non-vacuum 
73f0: 52 42 55 20 68 61 6e 64 6c 65 2c 20 69 66 20 74  RBU handle, if t
7400: 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 6d 61  he table name ma
7410: 74 63 68 65 73 20 74 68 65 20 70 61 74 74 65 72  tches the patter
7420: 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 64 61 74  n:.**.**     dat
7430: 61 5b 30 2d 39 5d 5f 3c 6e 61 6d 65 3e 0a 2a 2a  a[0-9]_<name>.**
7440: 0a 2a 2a 20 77 68 65 72 65 20 3c 6e 61 6d 65 3e  .** where <name>
7450: 20 69 73 20 61 6e 79 20 73 65 71 75 65 6e 63 65   is any sequence
7460: 20 6f 66 20 31 20 6f 72 20 6d 6f 72 65 20 63 68   of 1 or more ch
7470: 61 72 61 63 74 65 72 73 2c 20 3c 6e 61 6d 65 3e  aracters, <name>
7480: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
7490: 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74   Otherwise, if t
74a0: 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74  he only argument
74b0: 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20   does not match 
74c0: 74 68 65 20 61 62 6f 76 65 20 70 61 74 74 65 72  the above patter
74d0: 6e 2c 20 61 6e 20 53 51 4c 0a 2a 2a 20 4e 55 4c  n, an SQL.** NUL
74e0: 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  L is returned..*
74f0: 2a 0a 2a 2a 20 20 20 20 20 22 64 61 74 61 5f 74  *.**     "data_t
7500: 31 22 20 20 20 20 20 2d 3e 20 22 74 31 22 0a 2a  1"     -> "t1".*
7510: 2a 20 20 20 20 20 22 64 61 74 61 30 31 32 33 5f  *     "data0123_
7520: 74 32 22 20 2d 3e 20 22 74 32 22 0a 2a 2a 20 20  t2" -> "t2".**  
7530: 20 20 20 22 64 61 74 61 41 42 5f 74 33 22 20 20     "dataAB_t3"  
7540: 20 2d 3e 20 4e 55 4c 4c 0a 2a 2a 0a 2a 2a 20 46   -> NULL.**.** F
7550: 6f 72 20 61 6e 20 72 62 75 20 76 61 63 75 75 6d  or an rbu vacuum
7560: 20 68 61 6e 64 6c 65 2c 20 61 20 63 6f 70 79 20   handle, a copy 
7570: 6f 66 20 74 68 65 20 66 69 72 73 74 20 61 72 67  of the first arg
7580: 75 6d 65 6e 74 20 69 73 20 72 65 74 75 72 6e 65  ument is returne
7590: 64 20 69 66 0a 2a 2a 20 74 68 65 20 73 65 63 6f  d if.** the seco
75a0: 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 65  nd argument is e
75b0: 69 74 68 65 72 20 6d 69 73 73 69 6e 67 20 6f 72  ither missing or
75c0: 20 30 20 28 6e 6f 74 20 61 20 76 69 65 77 29 2e   0 (not a view).
75d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
75e0: 72 62 75 54 61 72 67 65 74 4e 61 6d 65 46 75 6e  rbuTargetNameFun
75f0: 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  c(.  sqlite3_con
7600: 74 65 78 74 20 2a 70 43 74 78 2c 0a 20 20 69 6e  text *pCtx,.  in
7610: 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65  t argc,.  sqlite
7620: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
7630: 7b 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20 2a  {.  sqlite3rbu *
7640: 70 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72  p = sqlite3_user
7650: 5f 64 61 74 61 28 70 43 74 78 29 3b 0a 20 20 63  _data(pCtx);.  c
7660: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 3b 0a  onst char *zIn;.
7670: 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d    assert( argc==
7680: 31 20 7c 7c 20 61 72 67 63 3d 3d 32 20 29 3b 0a  1 || argc==2 );.
7690: 0a 20 20 7a 49 6e 20 3d 20 28 63 6f 6e 73 74 20  .  zIn = (const 
76a0: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
76b0: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d  lue_text(argv[0]
76c0: 29 3b 0a 20 20 69 66 28 20 7a 49 6e 20 29 7b 0a  );.  if( zIn ){.
76d0: 20 20 20 20 69 66 28 20 72 62 75 49 73 56 61 63      if( rbuIsVac
76e0: 75 75 6d 28 70 29 20 29 7b 0a 20 20 20 20 20 20  uum(p) ){.      
76f0: 69 66 28 20 61 72 67 63 3d 3d 31 20 7c 7c 20 30  if( argc==1 || 0
7700: 3d 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ==sqlite3_value_
7710: 69 6e 74 28 61 72 67 76 5b 31 5d 29 20 29 7b 0a  int(argv[1]) ){.
7720: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
7730: 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43 74 78  result_text(pCtx
7740: 2c 20 7a 49 6e 2c 20 2d 31 2c 20 53 51 4c 49 54  , zIn, -1, SQLIT
7750: 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  E_STATIC);.     
7760: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
7770: 20 20 20 20 69 66 28 20 73 74 72 6c 65 6e 28 7a      if( strlen(z
7780: 49 6e 29 3e 34 20 26 26 20 6d 65 6d 63 6d 70 28  In)>4 && memcmp(
7790: 22 64 61 74 61 22 2c 20 7a 49 6e 2c 20 34 29 3d  "data", zIn, 4)=
77a0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  =0 ){.        in
77b0: 74 20 69 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  t i;.        for
77c0: 28 69 3d 34 3b 20 7a 49 6e 5b 69 5d 3e 3d 27 30  (i=4; zIn[i]>='0
77d0: 27 20 26 26 20 7a 49 6e 5b 69 5d 3c 3d 27 39 27  ' && zIn[i]<='9'
77e0: 3b 20 69 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20  ; i++);.        
77f0: 69 66 28 20 7a 49 6e 5b 69 5d 3d 3d 27 5f 27 20  if( zIn[i]=='_' 
7800: 26 26 20 7a 49 6e 5b 69 2b 31 5d 20 29 7b 0a 20  && zIn[i+1] ){. 
7810: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
7820: 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43 74  _result_text(pCt
7830: 78 2c 20 26 7a 49 6e 5b 69 2b 31 5d 2c 20 2d 31  x, &zIn[i+1], -1
7840: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
7850: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
7860: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
7870: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
7880: 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 73  e the iterator s
7890: 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20  tructure passed 
78a0: 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
78b0: 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  gument..**.** If
78c0: 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
78d0: 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
78e0: 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20  eturned and the 
78f0: 69 74 65 72 61 74 6f 72 20 69 73 20 6c 65 66 74  iterator is left
7900: 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74 6f   .** pointing to
7910: 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
7920: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20  . Otherwise, an 
7930: 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 6d  error code and m
7940: 65 73 73 61 67 65 20 69 73 20 0a 2a 2a 20 6c 65  essage is .** le
7950: 66 74 20 69 6e 20 74 68 65 20 52 42 55 20 68 61  ft in the RBU ha
7960: 6e 64 6c 65 20 70 61 73 73 65 64 20 61 73 20 74  ndle passed as t
7970: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
7980: 74 2e 20 41 20 63 6f 70 79 20 6f 66 20 74 68 65  t. A copy of the
7990: 20 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20   .** error code 
79a0: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
79b0: 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 4f 62  static int rbuOb
79c0: 6a 49 74 65 72 46 69 72 73 74 28 73 71 6c 69 74  jIterFirst(sqlit
79d0: 65 33 72 62 75 20 2a 70 2c 20 52 62 75 4f 62 6a  e3rbu *p, RbuObj
79e0: 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
79f0: 69 6e 74 20 72 63 3b 0a 20 20 6d 65 6d 73 65 74  int rc;.  memset
7a00: 28 70 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f  (pIter, 0, sizeo
7a10: 66 28 52 62 75 4f 62 6a 49 74 65 72 29 29 3b 0a  f(RbuObjIter));.
7a20: 0a 20 20 72 63 20 3d 20 70 72 65 70 61 72 65 41  .  rc = prepareA
7a30: 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70  ndCollectError(p
7a40: 2d 3e 64 62 52 62 75 2c 20 26 70 49 74 65 72 2d  ->dbRbu, &pIter-
7a50: 3e 70 54 62 6c 49 74 65 72 2c 20 26 70 2d 3e 7a  >pTblIter, &p->z
7a60: 45 72 72 6d 73 67 2c 20 0a 20 20 20 20 20 20 22  Errmsg, .      "
7a70: 53 45 4c 45 43 54 20 72 62 75 5f 74 61 72 67 65  SELECT rbu_targe
7a80: 74 5f 6e 61 6d 65 28 6e 61 6d 65 2c 20 74 79 70  t_name(name, typ
7a90: 65 3d 27 76 69 65 77 27 29 20 41 53 20 74 61 72  e='view') AS tar
7aa0: 67 65 74 2c 20 6e 61 6d 65 20 22 0a 20 20 20 20  get, name ".    
7ab0: 20 20 22 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d    "FROM sqlite_m
7ac0: 61 73 74 65 72 20 22 0a 20 20 20 20 20 20 22 57  aster ".      "W
7ad0: 48 45 52 45 20 74 79 70 65 20 49 4e 20 28 27 74  HERE type IN ('t
7ae0: 61 62 6c 65 27 2c 20 27 76 69 65 77 27 29 20 41  able', 'view') A
7af0: 4e 44 20 74 61 72 67 65 74 20 49 53 20 4e 4f 54  ND target IS NOT
7b00: 20 4e 55 4c 4c 20 22 0a 20 20 20 20 20 20 22 4f   NULL ".      "O
7b10: 52 44 45 52 20 42 59 20 6e 61 6d 65 22 0a 20 20  RDER BY name".  
7b20: 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  );..  if( rc==SQ
7b30: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
7b40: 63 20 3d 20 70 72 65 70 61 72 65 41 6e 64 43 6f  c = prepareAndCo
7b50: 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62  llectError(p->db
7b60: 4d 61 69 6e 2c 20 26 70 49 74 65 72 2d 3e 70 49  Main, &pIter->pI
7b70: 64 78 49 74 65 72 2c 20 26 70 2d 3e 7a 45 72 72  dxIter, &p->zErr
7b80: 6d 73 67 2c 0a 20 20 20 20 20 20 20 20 22 53 45  msg,.        "SE
7b90: 4c 45 43 54 20 6e 61 6d 65 2c 20 72 6f 6f 74 70  LECT name, rootp
7ba0: 61 67 65 2c 20 73 71 6c 20 49 53 20 4e 55 4c 4c  age, sql IS NULL
7bb0: 20 4f 52 20 73 75 62 73 74 72 28 38 2c 20 36 29   OR substr(8, 6)
7bc0: 3d 3d 27 55 4e 49 51 55 45 27 20 22 0a 20 20 20  =='UNIQUE' ".   
7bd0: 20 20 20 20 20 22 20 20 46 52 4f 4d 20 6d 61 69       "  FROM mai
7be0: 6e 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  n.sqlite_master 
7bf0: 22 0a 20 20 20 20 20 20 20 20 22 20 20 57 48 45  ".        "  WHE
7c00: 52 45 20 74 79 70 65 3d 27 69 6e 64 65 78 27 20  RE type='index' 
7c10: 41 4e 44 20 74 62 6c 5f 6e 61 6d 65 20 3d 20 3f  AND tbl_name = ?
7c20: 22 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20  ".    );.  }..  
7c30: 70 49 74 65 72 2d 3e 62 43 6c 65 61 6e 75 70 20  pIter->bCleanup 
7c40: 3d 20 31 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 72  = 1;.  p->rc = r
7c50: 63 3b 0a 20 20 72 65 74 75 72 6e 20 72 62 75 4f  c;.  return rbuO
7c60: 62 6a 49 74 65 72 4e 65 78 74 28 70 2c 20 70 49  bjIterNext(p, pI
7c70: 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ter);.}../*.** T
7c80: 68 69 73 20 69 73 20 61 20 77 72 61 70 70 65 72  his is a wrapper
7c90: 20 61 72 6f 75 6e 64 20 22 73 71 6c 69 74 65 33   around "sqlite3
7ca0: 5f 6d 70 72 69 6e 74 66 28 7a 46 6d 74 2c 20 2e  _mprintf(zFmt, .
7cb0: 2e 2e 29 22 2e 20 49 66 20 61 6e 20 4f 4f 4d 20  ..)". If an OOM 
7cc0: 6f 63 63 75 72 73 2c 0a 2a 2a 20 61 6e 20 65 72  occurs,.** an er
7cd0: 72 6f 72 20 63 6f 64 65 20 69 73 20 73 74 6f 72  ror code is stor
7ce0: 65 64 20 69 6e 20 74 68 65 20 52 42 55 20 68 61  ed in the RBU ha
7cf0: 6e 64 6c 65 20 70 61 73 73 65 64 20 61 73 20 74  ndle passed as t
7d00: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
7d10: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  t..**.** If an e
7d20: 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79  rror has already
7d30: 20 6f 63 63 75 72 72 65 64 20 28 70 2d 3e 72 63   occurred (p->rc
7d40: 20 69 73 20 61 6c 72 65 61 64 79 20 73 65 74 20   is already set 
7d50: 74 6f 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68  to something oth
7d60: 65 72 0a 2a 2a 20 74 68 61 6e 20 53 51 4c 49 54  er.** than SQLIT
7d70: 45 5f 4f 4b 29 2c 20 74 68 65 6e 20 74 68 69 73  E_OK), then this
7d80: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
7d90: 73 20 4e 55 4c 4c 20 77 69 74 68 6f 75 74 20 6d  s NULL without m
7da0: 6f 64 69 66 79 69 6e 67 20 74 68 65 0a 2a 2a 20  odifying the.** 
7db0: 73 74 6f 72 65 64 20 65 72 72 6f 72 20 63 6f 64  stored error cod
7dc0: 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  e. In this case 
7dd0: 69 74 20 73 74 69 6c 6c 20 63 61 6c 6c 73 20 73  it still calls s
7de0: 71 6c 69 74 65 33 5f 66 72 65 65 28 29 20 6f 6e  qlite3_free() on
7df0: 20 61 6e 79 20 0a 2a 2a 20 70 72 69 6e 74 66 28   any .** printf(
7e00: 29 20 70 61 72 61 6d 65 74 65 72 73 20 61 73 73  ) parameters ass
7e10: 6f 63 69 61 74 65 64 20 77 69 74 68 20 25 7a 20  ociated with %z 
7e20: 63 6f 6e 76 65 72 73 69 6f 6e 73 2e 0a 2a 2f 0a  conversions..*/.
7e30: 73 74 61 74 69 63 20 63 68 61 72 20 2a 72 62 75  static char *rbu
7e40: 4d 50 72 69 6e 74 66 28 73 71 6c 69 74 65 33 72  MPrintf(sqlite3r
7e50: 62 75 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  bu *p, const cha
7e60: 72 20 2a 7a 46 6d 74 2c 20 2e 2e 2e 29 7b 0a 20  r *zFmt, ...){. 
7e70: 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 30 3b   char *zSql = 0;
7e80: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
7e90: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46   va_start(ap, zF
7ea0: 6d 74 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71  mt);.  zSql = sq
7eb0: 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a  lite3_vmprintf(z
7ec0: 46 6d 74 2c 20 61 70 29 3b 0a 20 20 69 66 28 20  Fmt, ap);.  if( 
7ed0: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
7ee0: 20 29 7b 0a 20 20 20 20 69 66 28 20 7a 53 71 6c   ){.    if( zSql
7ef0: 3d 3d 30 20 29 20 70 2d 3e 72 63 20 3d 20 53 51  ==0 ) p->rc = SQ
7f00: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65  LITE_NOMEM;.  }e
7f10: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
7f20: 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20  _free(zSql);.   
7f30: 20 7a 53 71 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20   zSql = 0;.  }. 
7f40: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72   va_end(ap);.  r
7f50: 65 74 75 72 6e 20 7a 53 71 6c 3b 0a 7d 0a 0a 2f  eturn zSql;.}../
7f60: 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 7a 46  *.** Argument zF
7f70: 6d 74 20 69 73 20 61 20 73 71 6c 69 74 65 33 5f  mt is a sqlite3_
7f80: 6d 70 72 69 6e 74 66 28 29 20 73 74 79 6c 65 20  mprintf() style 
7f90: 66 6f 72 6d 61 74 20 73 74 72 69 6e 67 2e 20 54  format string. T
7fa0: 68 65 20 74 72 61 69 6c 69 6e 67 0a 2a 2a 20 61  he trailing.** a
7fb0: 72 67 75 6d 65 6e 74 73 20 61 72 65 20 74 68 65  rguments are the
7fc0: 20 75 73 75 61 6c 20 73 75 62 73 69 74 75 74 69   usual subsituti
7fd0: 6f 6e 20 76 61 6c 75 65 73 2e 20 54 68 69 73 20  on values. This 
7fe0: 66 75 6e 63 74 69 6f 6e 20 70 65 72 66 6f 72 6d  function perform
7ff0: 73 0a 2a 2a 20 74 68 65 20 70 72 69 6e 74 66 28  s.** the printf(
8000: 29 20 73 74 79 6c 65 20 73 75 62 73 74 69 74 75  ) style substitu
8010: 74 69 6f 6e 73 20 61 6e 64 20 65 78 65 63 75 74  tions and execut
8020: 65 73 20 74 68 65 20 72 65 73 75 6c 74 20 61 73  es the result as
8030: 20 61 6e 20 53 51 4c 0a 2a 2a 20 73 74 61 74 65   an SQL.** state
8040: 6d 65 6e 74 20 6f 6e 20 74 68 65 20 52 42 55 20  ment on the RBU 
8050: 68 61 6e 64 6c 65 73 20 64 61 74 61 62 61 73 65  handles database
8060: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
8070: 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65  ror occurs, an e
8080: 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 65 72  rror code and er
8090: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 73  ror message is s
80a0: 74 6f 72 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20  tored in the.** 
80b0: 52 42 55 20 68 61 6e 64 6c 65 2e 20 49 66 20 61  RBU handle. If a
80c0: 6e 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65  n error has alre
80d0: 61 64 79 20 6f 63 63 75 72 72 65 64 20 77 68 65  ady occurred whe
80e0: 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
80f0: 69 73 0a 2a 2a 20 63 61 6c 6c 65 64 2c 20 69 74  is.** called, it
8100: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
8110: 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 4d 50  static int rbuMP
8120: 72 69 6e 74 66 45 78 65 63 28 73 71 6c 69 74 65  rintfExec(sqlite
8130: 33 72 62 75 20 2a 70 2c 20 73 71 6c 69 74 65 33  3rbu *p, sqlite3
8140: 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72   *db, const char
8150: 20 2a 7a 46 6d 74 2c 20 2e 2e 2e 29 7b 0a 20 20   *zFmt, ...){.  
8160: 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63 68  va_list ap;.  ch
8170: 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 76 61 5f 73  ar *zSql;.  va_s
8180: 74 61 72 74 28 61 70 2c 20 7a 46 6d 74 29 3b 0a  tart(ap, zFmt);.
8190: 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
81a0: 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6d 74 2c 20  _vmprintf(zFmt, 
81b0: 61 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63  ap);.  if( p->rc
81c0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
81d0: 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29     if( zSql==0 )
81e0: 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20  {.      p->rc = 
81f0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
8200: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
8210: 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65  ->rc = sqlite3_e
8220: 78 65 63 28 64 62 2c 20 7a 53 71 6c 2c 20 30 2c  xec(db, zSql, 0,
8230: 20 30 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 29   0, &p->zErrmsg)
8240: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
8250: 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29  lite3_free(zSql)
8260: 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a  ;.  va_end(ap);.
8270: 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 3b 0a    return p->rc;.
8280: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  }../*.** Attempt
8290: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64   to allocate and
82a0: 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
82b0: 72 20 74 6f 20 61 20 7a 65 72 6f 65 64 20 62 6c  r to a zeroed bl
82c0: 6f 63 6b 20 6f 66 20 6e 42 79 74 65 20 0a 2a 2a  ock of nByte .**
82d0: 20 62 79 74 65 73 2e 20 0a 2a 2a 0a 2a 2a 20 49   bytes. .**.** I
82e0: 66 20 61 6e 20 65 72 72 6f 72 20 28 69 2e 65 2e  f an error (i.e.
82f0: 20 61 6e 20 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f   an OOM conditio
8300: 6e 29 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  n) occurs, retur
8310: 6e 20 4e 55 4c 4c 20 61 6e 64 20 6c 65 61 76 65  n NULL and leave
8320: 20 61 6e 20 0a 2a 2a 20 65 72 72 6f 72 20 63 6f   an .** error co
8330: 64 65 20 69 6e 20 74 68 65 20 72 62 75 20 68 61  de in the rbu ha
8340: 6e 64 6c 65 20 70 61 73 73 65 64 20 61 73 20 74  ndle passed as t
8350: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
8360: 74 2e 20 4f 72 2c 20 69 66 20 61 6e 20 0a 2a 2a  t. Or, if an .**
8370: 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61   error has alrea
8380: 64 79 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e  dy occurred when
8390: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
83a0: 73 20 63 61 6c 6c 65 64 2c 20 72 65 74 75 72 6e  s called, return
83b0: 20 4e 55 4c 4c 20 0a 2a 2a 20 69 6d 6d 65 64 69   NULL .** immedi
83c0: 61 74 65 6c 79 20 77 69 74 68 6f 75 74 20 61 74  ately without at
83d0: 74 65 6d 70 74 69 6e 67 20 74 68 65 20 61 6c 6c  tempting the all
83e0: 6f 63 61 74 69 6f 6e 20 6f 72 20 6d 6f 64 69 66  ocation or modif
83f0: 79 69 6e 67 20 74 68 65 20 73 74 6f 72 65 64 0a  ying the stored.
8400: 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  ** error code..*
8410: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 72  /.static void *r
8420: 62 75 4d 61 6c 6c 6f 63 28 73 71 6c 69 74 65 33  buMalloc(sqlite3
8430: 72 62 75 20 2a 70 2c 20 69 6e 74 20 6e 42 79 74  rbu *p, int nByt
8440: 65 29 7b 0a 20 20 76 6f 69 64 20 2a 70 52 65 74  e){.  void *pRet
8450: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 72   = 0;.  if( p->r
8460: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
8470: 20 20 20 20 61 73 73 65 72 74 28 20 6e 42 79 74      assert( nByt
8480: 65 3e 30 20 29 3b 0a 20 20 20 20 70 52 65 74 20  e>0 );.    pRet 
8490: 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
84a0: 36 34 28 6e 42 79 74 65 29 3b 0a 20 20 20 20 69  64(nByte);.    i
84b0: 66 28 20 70 52 65 74 3d 3d 30 20 29 7b 0a 20 20  f( pRet==0 ){.  
84c0: 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
84d0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65  TE_NOMEM;.    }e
84e0: 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65  lse{.      memse
84f0: 74 28 70 52 65 74 2c 20 30 2c 20 6e 42 79 74 65  t(pRet, 0, nByte
8500: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
8510: 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 0a  eturn pRet;.}...
8520: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
8530: 6e 64 20 7a 65 72 6f 20 74 68 65 20 70 49 74 65  nd zero the pIte
8540: 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 5d 20 61 6e  r->azTblCol[] an
8550: 64 20 61 62 54 62 6c 50 6b 5b 5d 20 61 72 72 61  d abTblPk[] arra
8560: 79 73 20 73 6f 20 74 68 61 74 0a 2a 2a 20 74 68  ys so that.** th
8570: 65 72 65 20 69 73 20 72 6f 6f 6d 20 66 6f 72 20  ere is room for 
8580: 61 74 20 6c 65 61 73 74 20 6e 43 6f 6c 20 65 6c  at least nCol el
8590: 65 6d 65 6e 74 73 2e 20 49 66 20 61 6e 20 4f 4f  ements. If an OO
85a0: 4d 20 6f 63 63 75 72 73 2c 20 73 74 6f 72 65 20  M occurs, store 
85b0: 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65  an.** error code
85c0: 20 69 6e 20 74 68 65 20 52 42 55 20 68 61 6e 64   in the RBU hand
85d0: 6c 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  le passed as the
85e0: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
85f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
8600: 72 62 75 41 6c 6c 6f 63 61 74 65 49 74 65 72 41  rbuAllocateIterA
8610: 72 72 61 79 73 28 73 71 6c 69 74 65 33 72 62 75  rrays(sqlite3rbu
8620: 20 2a 70 2c 20 52 62 75 4f 62 6a 49 74 65 72 20   *p, RbuObjIter 
8630: 2a 70 49 74 65 72 2c 20 69 6e 74 20 6e 43 6f 6c  *pIter, int nCol
8640: 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d  ){.  int nByte =
8650: 20 28 32 2a 73 69 7a 65 6f 66 28 63 68 61 72 2a   (2*sizeof(char*
8660: 29 20 2b 20 73 69 7a 65 6f 66 28 69 6e 74 29 20  ) + sizeof(int) 
8670: 2b 20 33 2a 73 69 7a 65 6f 66 28 75 38 29 29 20  + 3*sizeof(u8)) 
8680: 2a 20 6e 43 6f 6c 3b 0a 20 20 63 68 61 72 20 2a  * nCol;.  char *
8690: 2a 61 7a 4e 65 77 3b 0a 0a 20 20 61 7a 4e 65 77  *azNew;..  azNew
86a0: 20 3d 20 28 63 68 61 72 2a 2a 29 72 62 75 4d 61   = (char**)rbuMa
86b0: 6c 6c 6f 63 28 70 2c 20 6e 42 79 74 65 29 3b 0a  lloc(p, nByte);.
86c0: 20 20 69 66 28 20 61 7a 4e 65 77 20 29 7b 0a 20    if( azNew ){. 
86d0: 20 20 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43     pIter->azTblC
86e0: 6f 6c 20 3d 20 61 7a 4e 65 77 3b 0a 20 20 20 20  ol = azNew;.    
86f0: 70 49 74 65 72 2d 3e 61 7a 54 62 6c 54 79 70 65  pIter->azTblType
8700: 20 3d 20 26 61 7a 4e 65 77 5b 6e 43 6f 6c 5d 3b   = &azNew[nCol];
8710: 0a 20 20 20 20 70 49 74 65 72 2d 3e 61 69 53 72  .    pIter->aiSr
8720: 63 4f 72 64 65 72 20 3d 20 28 69 6e 74 2a 29 26  cOrder = (int*)&
8730: 70 49 74 65 72 2d 3e 61 7a 54 62 6c 54 79 70 65  pIter->azTblType
8740: 5b 6e 43 6f 6c 5d 3b 0a 20 20 20 20 70 49 74 65  [nCol];.    pIte
8750: 72 2d 3e 61 62 54 62 6c 50 6b 20 3d 20 28 75 38  r->abTblPk = (u8
8760: 2a 29 26 70 49 74 65 72 2d 3e 61 69 53 72 63 4f  *)&pIter->aiSrcO
8770: 72 64 65 72 5b 6e 43 6f 6c 5d 3b 0a 20 20 20 20  rder[nCol];.    
8780: 70 49 74 65 72 2d 3e 61 62 4e 6f 74 4e 75 6c 6c  pIter->abNotNull
8790: 20 3d 20 28 75 38 2a 29 26 70 49 74 65 72 2d 3e   = (u8*)&pIter->
87a0: 61 62 54 62 6c 50 6b 5b 6e 43 6f 6c 5d 3b 0a 20  abTblPk[nCol];. 
87b0: 20 20 20 70 49 74 65 72 2d 3e 61 62 49 6e 64 65     pIter->abInde
87c0: 78 65 64 20 3d 20 28 75 38 2a 29 26 70 49 74 65  xed = (u8*)&pIte
87d0: 72 2d 3e 61 62 4e 6f 74 4e 75 6c 6c 5b 6e 43 6f  r->abNotNull[nCo
87e0: 6c 5d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  l];.  }.}../*.**
87f0: 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   The first argum
8800: 65 6e 74 20 6d 75 73 74 20 62 65 20 61 20 6e 75  ent must be a nu
8810: 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72  l-terminated str
8820: 69 6e 67 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ing. This functi
8830: 6f 6e 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61 20  on.** returns a 
8840: 63 6f 70 79 20 6f 66 20 74 68 65 20 73 74 72 69  copy of the stri
8850: 6e 67 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74  ng in memory obt
8860: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
8870: 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20  e3_malloc()..** 
8880: 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e  It is the respon
8890: 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
88a0: 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75  caller to eventu
88b0: 61 6c 6c 79 20 66 72 65 65 20 74 68 69 73 20 6d  ally free this m
88c0: 65 6d 6f 72 79 0a 2a 2a 20 75 73 69 6e 67 20 73  emory.** using s
88d0: 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a  qlite3_free()..*
88e0: 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 63  *.** If an OOM c
88f0: 6f 6e 64 69 74 69 6f 6e 20 69 73 20 65 6e 63 6f  ondition is enco
8900: 75 6e 74 65 72 65 64 20 77 68 65 6e 20 61 74 74  untered when att
8910: 65 6d 70 74 69 6e 67 20 74 6f 20 61 6c 6c 6f 63  empting to alloc
8920: 61 74 65 20 6d 65 6d 6f 72 79 2c 0a 2a 2a 20 6f  ate memory,.** o
8930: 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 20 28  utput variable (
8940: 2a 70 52 63 29 20 69 73 20 73 65 74 20 74 6f 20  *pRc) is set to 
8950: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 62 65 66  SQLITE_NOMEM bef
8960: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 4f  ore returning. O
8970: 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 69 66 20  therwise,.** if 
8980: 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73  the allocation s
8990: 75 63 63 65 65 64 73 2c 20 28 2a 70 52 63 29 20  ucceeds, (*pRc) 
89a0: 69 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65  is left unchange
89b0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  d..*/.static cha
89c0: 72 20 2a 72 62 75 53 74 72 6e 64 75 70 28 63 6f  r *rbuStrndup(co
89d0: 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 72 2c 20  nst char *zStr, 
89e0: 69 6e 74 20 2a 70 52 63 29 7b 0a 20 20 63 68 61  int *pRc){.  cha
89f0: 72 20 2a 7a 52 65 74 20 3d 20 30 3b 0a 0a 20 20  r *zRet = 0;..  
8a00: 61 73 73 65 72 74 28 20 2a 70 52 63 3d 3d 53 51  assert( *pRc==SQ
8a10: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28  LITE_OK );.  if(
8a20: 20 7a 53 74 72 20 29 7b 0a 20 20 20 20 73 69 7a   zStr ){.    siz
8a30: 65 5f 74 20 6e 43 6f 70 79 20 3d 20 73 74 72 6c  e_t nCopy = strl
8a40: 65 6e 28 7a 53 74 72 29 20 2b 20 31 3b 0a 20 20  en(zStr) + 1;.  
8a50: 20 20 7a 52 65 74 20 3d 20 28 63 68 61 72 2a 29    zRet = (char*)
8a60: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
8a70: 28 6e 43 6f 70 79 29 3b 0a 20 20 20 20 69 66 28  (nCopy);.    if(
8a80: 20 7a 52 65 74 20 29 7b 0a 20 20 20 20 20 20 6d   zRet ){.      m
8a90: 65 6d 63 70 79 28 7a 52 65 74 2c 20 7a 53 74 72  emcpy(zRet, zStr
8aa0: 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20 7d 65  , nCopy);.    }e
8ab0: 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 52 63 20  lse{.      *pRc 
8ac0: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
8ad0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
8ae0: 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a  urn zRet;.}../*.
8af0: 2a 2a 20 46 69 6e 61 6c 69 7a 65 20 74 68 65 20  ** Finalize the 
8b00: 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64  statement passed
8b10: 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
8b20: 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49  rgument..**.** I
8b30: 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69  f the sqlite3_fi
8b40: 6e 61 6c 69 7a 65 28 29 20 63 61 6c 6c 20 69 6e  nalize() call in
8b50: 64 69 63 61 74 65 73 20 74 68 61 74 20 61 6e 20  dicates that an 
8b60: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e  error occurs, an
8b70: 64 20 74 68 65 0a 2a 2a 20 72 62 75 20 68 61 6e  d the.** rbu han
8b80: 64 6c 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  dle error code i
8b90: 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 73 65  s not already se
8ba0: 74 2c 20 73 65 74 20 74 68 65 20 65 72 72 6f 72  t, set the error
8bb0: 20 63 6f 64 65 20 61 6e 64 20 65 72 72 6f 72 0a   code and error.
8bc0: 2a 2a 20 6d 65 73 73 61 67 65 20 61 63 63 6f 72  ** message accor
8bd0: 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  dingly..*/.stati
8be0: 63 20 76 6f 69 64 20 72 62 75 46 69 6e 61 6c 69  c void rbuFinali
8bf0: 7a 65 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70  ze(sqlite3rbu *p
8c00: 2c 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a  , sqlite3_stmt *
8c10: 70 53 74 6d 74 29 7b 0a 20 20 73 71 6c 69 74 65  pStmt){.  sqlite
8c20: 33 20 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f  3 *db = sqlite3_
8c30: 64 62 5f 68 61 6e 64 6c 65 28 70 53 74 6d 74 29  db_handle(pStmt)
8c40: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c  ;.  int rc = sql
8c50: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
8c60: 74 6d 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72  tmt);.  if( p->r
8c70: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
8c80: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
8c90: 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b  .    p->rc = rc;
8ca0: 0a 20 20 20 20 70 2d 3e 7a 45 72 72 6d 73 67 20  .    p->zErrmsg 
8cb0: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
8cc0: 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f  f("%s", sqlite3_
8cd0: 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 7d  errmsg(db));.  }
8ce0: 0a 7d 0a 0a 2f 2a 20 44 65 74 65 72 6d 69 6e 65  .}../* Determine
8cf0: 20 74 68 65 20 74 79 70 65 20 6f 66 20 61 20 74   the type of a t
8d00: 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 70 65  able..**.**   pe
8d10: 54 79 70 65 20 69 73 20 6f 66 20 74 79 70 65 20  Type is of type 
8d20: 28 69 6e 74 2a 29 2c 20 61 20 70 6f 69 6e 74 65  (int*), a pointe
8d30: 72 20 74 6f 20 61 6e 20 6f 75 74 70 75 74 20 70  r to an output p
8d40: 61 72 61 6d 65 74 65 72 20 6f 66 20 74 79 70 65  arameter of type
8d50: 0a 2a 2a 20 20 20 28 69 6e 74 29 2e 20 54 68 69  .**   (int). Thi
8d60: 73 20 63 61 6c 6c 20 73 65 74 73 20 74 68 65 20  s call sets the 
8d70: 6f 75 74 70 75 74 20 70 61 72 61 6d 65 74 65 72  output parameter
8d80: 20 61 73 20 66 6f 6c 6c 6f 77 73 2c 20 64 65 70   as follows, dep
8d90: 65 6e 64 69 6e 67 0a 2a 2a 20 20 20 6f 6e 20 74  ending.**   on t
8da0: 68 65 20 74 79 70 65 20 6f 66 20 74 68 65 20 74  he type of the t
8db0: 61 62 6c 65 20 73 70 65 63 69 66 69 65 64 20 62  able specified b
8dc0: 79 20 70 61 72 61 6d 65 74 65 72 73 20 64 62 4e  y parameters dbN
8dd0: 61 6d 65 20 61 6e 64 20 7a 54 62 6c 2e 0a 2a 2a  ame and zTbl..**
8de0: 0a 2a 2a 20 20 20 20 20 52 42 55 5f 50 4b 5f 4e  .**     RBU_PK_N
8df0: 4f 54 41 42 4c 45 3a 20 20 20 20 20 20 20 4e 6f  OTABLE:       No
8e00: 20 73 75 63 68 20 74 61 62 6c 65 2e 0a 2a 2a 20   such table..** 
8e10: 20 20 20 20 52 42 55 5f 50 4b 5f 4e 4f 4e 45 3a      RBU_PK_NONE:
8e20: 20 20 20 20 20 20 20 20 20 20 54 61 62 6c 65 20            Table 
8e30: 68 61 73 20 61 6e 20 69 6d 70 6c 69 63 69 74 20  has an implicit 
8e40: 72 6f 77 69 64 2e 0a 2a 2a 20 20 20 20 20 52 42  rowid..**     RB
8e50: 55 5f 50 4b 5f 49 50 4b 3a 20 20 20 20 20 20 20  U_PK_IPK:       
8e60: 20 20 20 20 54 61 62 6c 65 20 68 61 73 20 61 6e      Table has an
8e70: 20 65 78 70 6c 69 63 69 74 20 49 50 4b 20 63 6f   explicit IPK co
8e80: 6c 75 6d 6e 2e 0a 2a 2a 20 20 20 20 20 52 42 55  lumn..**     RBU
8e90: 5f 50 4b 5f 45 58 54 45 52 4e 41 4c 3a 20 20 20  _PK_EXTERNAL:   
8ea0: 20 20 20 54 61 62 6c 65 20 68 61 73 20 61 6e 20     Table has an 
8eb0: 65 78 74 65 72 6e 61 6c 20 50 4b 20 69 6e 64 65  external PK inde
8ec0: 78 2e 0a 2a 2a 20 20 20 20 20 52 42 55 5f 50 4b  x..**     RBU_PK
8ed0: 5f 57 49 54 48 4f 55 54 5f 52 4f 57 49 44 3a 20  _WITHOUT_ROWID: 
8ee0: 54 61 62 6c 65 20 69 73 20 57 49 54 48 4f 55 54  Table is WITHOUT
8ef0: 20 52 4f 57 49 44 2e 0a 2a 2a 20 20 20 20 20 52   ROWID..**     R
8f00: 42 55 5f 50 4b 5f 56 54 41 42 3a 20 20 20 20 20  BU_PK_VTAB:     
8f10: 20 20 20 20 20 54 61 62 6c 65 20 69 73 20 61 20       Table is a 
8f20: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a  virtual table..*
8f30: 2a 0a 2a 2a 20 20 20 41 72 67 75 6d 65 6e 74 20  *.**   Argument 
8f40: 2a 70 69 50 6b 20 69 73 20 61 6c 73 6f 20 6f 66  *piPk is also of
8f50: 20 74 79 70 65 20 28 69 6e 74 2a 29 2c 20 61 6e   type (int*), an
8f60: 64 20 61 6c 73 6f 20 70 6f 69 6e 74 73 20 74 6f  d also points to
8f70: 20 61 6e 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20   an output.**   
8f80: 70 61 72 61 6d 65 74 65 72 2e 20 55 6e 6c 65 73  parameter. Unles
8f90: 73 20 74 68 65 20 74 61 62 6c 65 20 68 61 73 20  s the table has 
8fa0: 61 6e 20 65 78 74 65 72 6e 61 6c 20 70 72 69 6d  an external prim
8fb0: 61 72 79 20 6b 65 79 20 69 6e 64 65 78 20 0a 2a  ary key index .*
8fc0: 2a 20 20 20 28 69 2e 65 2e 20 75 6e 6c 65 73 73  *   (i.e. unless
8fd0: 20 2a 70 65 54 79 70 65 20 69 73 20 73 65 74 20   *peType is set 
8fe0: 74 6f 20 33 29 2c 20 74 68 65 6e 20 2a 70 69 50  to 3), then *piP
8ff0: 6b 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  k is set to zero
9000: 2e 20 4f 72 2c 0a 2a 2a 20 20 20 69 66 20 74 68  . Or,.**   if th
9010: 65 20 74 61 62 6c 65 20 64 6f 65 73 20 68 61 76  e table does hav
9020: 65 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 70 72  e an external pr
9030: 69 6d 61 72 79 20 6b 65 79 20 69 6e 64 65 78 2c  imary key index,
9040: 20 74 68 65 6e 20 2a 70 69 50 6b 0a 2a 2a 20 20   then *piPk.**  
9050: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 72   is set to the r
9060: 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  oot page number 
9070: 6f 66 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b  of the primary k
9080: 65 79 20 69 6e 64 65 78 20 62 65 66 6f 72 65 0a  ey index before.
9090: 2a 2a 20 20 20 72 65 74 75 72 6e 69 6e 67 2e 0a  **   returning..
90a0: 2a 2a 0a 2a 2a 20 41 4c 47 4f 52 49 54 48 4d 3a  **.** ALGORITHM:
90b0: 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 6e 6f 20  .**.**   if( no 
90c0: 65 6e 74 72 79 20 65 78 69 73 74 73 20 69 6e 20  entry exists in 
90d0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 29 7b  sqlite_master ){
90e0: 0a 2a 2a 20 20 20 20 20 72 65 74 75 72 6e 20 52  .**     return R
90f0: 42 55 5f 50 4b 5f 4e 4f 54 41 42 4c 45 0a 2a 2a  BU_PK_NOTABLE.**
9100: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c     }else if( sql
9110: 20 66 6f 72 20 74 68 65 20 65 6e 74 72 79 20 73   for the entry s
9120: 74 61 72 74 73 20 77 69 74 68 20 22 43 52 45 41  tarts with "CREA
9130: 54 45 20 56 49 52 54 55 41 4c 22 20 29 7b 0a 2a  TE VIRTUAL" ){.*
9140: 2a 20 20 20 20 20 72 65 74 75 72 6e 20 52 42 55  *     return RBU
9150: 5f 50 4b 5f 56 54 41 42 0a 2a 2a 20 20 20 7d 65  _PK_VTAB.**   }e
9160: 6c 73 65 20 69 66 28 20 22 50 52 41 47 4d 41 20  lse if( "PRAGMA 
9170: 69 6e 64 65 78 5f 6c 69 73 74 28 29 22 20 66 6f  index_list()" fo
9180: 72 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6e 74  r the table cont
9190: 61 69 6e 73 20 61 20 22 70 6b 22 20 69 6e 64 65  ains a "pk" inde
91a0: 78 20 29 7b 0a 2a 2a 20 20 20 20 20 69 66 28 20  x ){.**     if( 
91b0: 74 68 65 20 69 6e 64 65 78 20 74 68 61 74 20 69  the index that i
91c0: 73 20 74 68 65 20 70 6b 20 65 78 69 73 74 73 20  s the pk exists 
91d0: 69 6e 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  in sqlite_master
91e0: 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 2a 70 69   ){.**       *pi
91f0: 50 4b 20 3d 20 72 6f 6f 74 70 61 67 65 20 6f 66  PK = rootpage of
9200: 20 74 68 61 74 20 69 6e 64 65 78 2e 0a 2a 2a 20   that index..** 
9210: 20 20 20 20 20 20 72 65 74 75 72 6e 20 52 42 55        return RBU
9220: 5f 50 4b 5f 45 58 54 45 52 4e 41 4c 0a 2a 2a 20  _PK_EXTERNAL.** 
9230: 20 20 20 20 7d 65 6c 73 65 7b 0a 2a 2a 20 20 20      }else{.**   
9240: 20 20 20 20 72 65 74 75 72 6e 20 52 42 55 5f 50      return RBU_P
9250: 4b 5f 57 49 54 48 4f 55 54 5f 52 4f 57 49 44 0a  K_WITHOUT_ROWID.
9260: 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20 7d 65  **     }.**   }e
9270: 6c 73 65 20 69 66 28 20 22 50 52 41 47 4d 41 20  lse if( "PRAGMA 
9280: 74 61 62 6c 65 5f 69 6e 66 6f 28 29 22 20 6c 69  table_info()" li
9290: 73 74 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  sts one or more 
92a0: 22 70 6b 22 20 63 6f 6c 75 6d 6e 73 20 29 7b 0a  "pk" columns ){.
92b0: 2a 2a 20 20 20 20 20 72 65 74 75 72 6e 20 52 42  **     return RB
92c0: 55 5f 50 4b 5f 49 50 4b 0a 2a 2a 20 20 20 7d 65  U_PK_IPK.**   }e
92d0: 6c 73 65 7b 0a 2a 2a 20 20 20 20 20 72 65 74 75  lse{.**     retu
92e0: 72 6e 20 52 42 55 5f 50 4b 5f 4e 4f 4e 45 0a 2a  rn RBU_PK_NONE.*
92f0: 2a 20 20 20 7d 0a 2a 2f 0a 73 74 61 74 69 63 20  *   }.*/.static 
9300: 76 6f 69 64 20 72 62 75 54 61 62 6c 65 54 79 70  void rbuTableTyp
9310: 65 28 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20  e(.  sqlite3rbu 
9320: 2a 70 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  *p,.  const char
9330: 20 2a 7a 54 61 62 2c 0a 20 20 69 6e 74 20 2a 70   *zTab,.  int *p
9340: 65 54 79 70 65 2c 0a 20 20 69 6e 74 20 2a 70 69  eType,.  int *pi
9350: 54 6e 75 6d 2c 0a 20 20 69 6e 74 20 2a 70 69 50  Tnum,.  int *piP
9360: 6b 0a 29 7b 0a 20 20 2f 2a 0a 20 20 2a 2a 20 30  k.){.  /*.  ** 0
9370: 29 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a  ) SELECT count(*
9380: 29 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  ) FROM sqlite_ma
9390: 73 74 65 72 20 77 68 65 72 65 20 6e 61 6d 65 3d  ster where name=
93a0: 25 51 20 41 4e 44 20 49 73 56 69 72 74 75 61 6c  %Q AND IsVirtual
93b0: 28 25 51 29 0a 20 20 2a 2a 20 31 29 20 50 52 41  (%Q).  ** 1) PRA
93c0: 47 4d 41 20 69 6e 64 65 78 5f 6c 69 73 74 20 3d  GMA index_list =
93d0: 20 3f 0a 20 20 2a 2a 20 32 29 20 53 45 4c 45 43   ?.  ** 2) SELEC
93e0: 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
93f0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 77 68  sqlite_master wh
9400: 65 72 65 20 6e 61 6d 65 3d 25 51 20 0a 20 20 2a  ere name=%Q .  *
9410: 2a 20 33 29 20 50 52 41 47 4d 41 20 74 61 62 6c  * 3) PRAGMA tabl
9420: 65 5f 69 6e 66 6f 20 3d 20 3f 0a 20 20 2a 2f 0a  e_info = ?.  */.
9430: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
9440: 61 53 74 6d 74 5b 34 5d 20 3d 20 7b 30 2c 20 30  aStmt[4] = {0, 0
9450: 2c 20 30 2c 20 30 7d 3b 0a 0a 20 20 2a 70 65 54  , 0, 0};..  *peT
9460: 79 70 65 20 3d 20 52 42 55 5f 50 4b 5f 4e 4f 54  ype = RBU_PK_NOT
9470: 41 42 4c 45 3b 0a 20 20 2a 70 69 50 6b 20 3d 20  ABLE;.  *piPk = 
9480: 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  0;..  assert( p-
9490: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
94a0: 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70  ;.  p->rc = prep
94b0: 61 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63  areFreeAndCollec
94c0: 74 45 72 72 6f 72 28 70 2d 3e 64 62 4d 61 69 6e  tError(p->dbMain
94d0: 2c 20 26 61 53 74 6d 74 5b 30 5d 2c 20 26 70 2d  , &aStmt[0], &p-
94e0: 3e 7a 45 72 72 6d 73 67 2c 20 0a 20 20 20 20 73  >zErrmsg, .    s
94f0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a  qlite3_mprintf(.
9500: 20 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43            "SELEC
9510: 54 20 28 73 71 6c 20 4c 49 4b 45 20 27 63 72 65  T (sql LIKE 'cre
9520: 61 74 65 20 76 69 72 74 75 61 6c 25 25 27 29 2c  ate virtual%%'),
9530: 20 72 6f 6f 74 70 61 67 65 22 0a 20 20 20 20 20   rootpage".     
9540: 20 20 20 20 20 22 20 20 46 52 4f 4d 20 73 71 6c       "  FROM sql
9550: 69 74 65 5f 6d 61 73 74 65 72 22 0a 20 20 20 20  ite_master".    
9560: 20 20 20 20 20 20 22 20 57 48 45 52 45 20 6e 61        " WHERE na
9570: 6d 65 3d 25 51 22 2c 20 7a 54 61 62 0a 20 20 29  me=%Q", zTab.  )
9580: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 21 3d  );.  if( p->rc!=
9590: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c  SQLITE_OK || sql
95a0: 69 74 65 33 5f 73 74 65 70 28 61 53 74 6d 74 5b  ite3_step(aStmt[
95b0: 30 5d 29 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20  0])!=SQLITE_ROW 
95c0: 29 7b 0a 20 20 20 20 2f 2a 20 45 69 74 68 65 72  ){.    /* Either
95d0: 20 61 6e 20 65 72 72 6f 72 2c 20 6f 72 20 6e 6f   an error, or no
95e0: 20 73 75 63 68 20 74 61 62 6c 65 2e 20 2a 2f 0a   such table. */.
95f0: 20 20 20 20 67 6f 74 6f 20 72 62 75 54 61 62 6c      goto rbuTabl
9600: 65 54 79 70 65 5f 65 6e 64 3b 0a 20 20 7d 0a 20  eType_end;.  }. 
9610: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c   if( sqlite3_col
9620: 75 6d 6e 5f 69 6e 74 28 61 53 74 6d 74 5b 30 5d  umn_int(aStmt[0]
9630: 2c 20 30 29 20 29 7b 0a 20 20 20 20 2a 70 65 54  , 0) ){.    *peT
9640: 79 70 65 20 3d 20 52 42 55 5f 50 4b 5f 56 54 41  ype = RBU_PK_VTA
9650: 42 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  B;              
9660: 20 20 20 20 20 20 20 2f 2a 20 76 69 72 74 75 61         /* virtua
9670: 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 67  l table */.    g
9680: 6f 74 6f 20 72 62 75 54 61 62 6c 65 54 79 70 65  oto rbuTableType
9690: 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 2a 70 69 54  _end;.  }.  *piT
96a0: 6e 75 6d 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  num = sqlite3_co
96b0: 6c 75 6d 6e 5f 69 6e 74 28 61 53 74 6d 74 5b 30  lumn_int(aStmt[0
96c0: 5d 2c 20 31 29 3b 0a 0a 20 20 70 2d 3e 72 63 20  ], 1);..  p->rc 
96d0: 3d 20 70 72 65 70 61 72 65 46 72 65 65 41 6e 64  = prepareFreeAnd
96e0: 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e  CollectError(p->
96f0: 64 62 4d 61 69 6e 2c 20 26 61 53 74 6d 74 5b 31  dbMain, &aStmt[1
9700: 5d 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 20  ], &p->zErrmsg, 
9710: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72  .    sqlite3_mpr
9720: 69 6e 74 66 28 22 50 52 41 47 4d 41 20 69 6e 64  intf("PRAGMA ind
9730: 65 78 5f 6c 69 73 74 3d 25 51 22 2c 7a 54 61 62  ex_list=%Q",zTab
9740: 29 0a 20 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  ).  );.  if( p->
9750: 72 63 20 29 20 67 6f 74 6f 20 72 62 75 54 61 62  rc ) goto rbuTab
9760: 6c 65 54 79 70 65 5f 65 6e 64 3b 0a 20 20 77 68  leType_end;.  wh
9770: 69 6c 65 28 20 73 71 6c 69 74 65 33 5f 73 74 65  ile( sqlite3_ste
9780: 70 28 61 53 74 6d 74 5b 31 5d 29 3d 3d 53 51 4c  p(aStmt[1])==SQL
9790: 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 63  ITE_ROW ){.    c
97a0: 6f 6e 73 74 20 75 38 20 2a 7a 4f 72 69 67 20 3d  onst u8 *zOrig =
97b0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
97c0: 74 65 78 74 28 61 53 74 6d 74 5b 31 5d 2c 20 33  text(aStmt[1], 3
97d0: 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 38 20  );.    const u8 
97e0: 2a 7a 49 64 78 20 3d 20 73 71 6c 69 74 65 33 5f  *zIdx = 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 31 29 3b 0a 20 20 20 20 69 66  t[1], 1);.    if
9810: 28 20 7a 4f 72 69 67 20 26 26 20 7a 49 64 78 20  ( zOrig && zIdx 
9820: 26 26 20 7a 4f 72 69 67 5b 30 5d 3d 3d 27 70 27  && zOrig[0]=='p'
9830: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20   ){.      p->rc 
9840: 3d 20 70 72 65 70 61 72 65 46 72 65 65 41 6e 64  = prepareFreeAnd
9850: 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e  CollectError(p->
9860: 64 62 4d 61 69 6e 2c 20 26 61 53 74 6d 74 5b 32  dbMain, &aStmt[2
9870: 5d 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 20  ], &p->zErrmsg, 
9880: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
9890: 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20  e3_mprintf(.    
98a0: 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
98b0: 72 6f 6f 74 70 61 67 65 20 46 52 4f 4d 20 73 71  rootpage FROM sq
98c0: 6c 69 74 65 5f 6d 61 73 74 65 72 20 57 48 45 52  lite_master WHER
98d0: 45 20 6e 61 6d 65 20 3d 20 25 51 22 2c 20 7a 49  E name = %Q", zI
98e0: 64 78 0a 20 20 20 20 20 20 29 29 3b 0a 20 20 20  dx.      ));.   
98f0: 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
9900: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
9910: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
9920: 74 65 70 28 61 53 74 6d 74 5b 32 5d 29 3d 3d 53  tep(aStmt[2])==S
9930: 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20  QLITE_ROW ){.   
9940: 20 20 20 20 20 20 20 2a 70 69 50 6b 20 3d 20 73         *piPk = s
9950: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
9960: 74 28 61 53 74 6d 74 5b 32 5d 2c 20 30 29 3b 0a  t(aStmt[2], 0);.
9970: 20 20 20 20 20 20 20 20 20 20 2a 70 65 54 79 70            *peTyp
9980: 65 20 3d 20 52 42 55 5f 50 4b 5f 45 58 54 45 52  e = RBU_PK_EXTER
9990: 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  NAL;.        }el
99a0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70  se{.          *p
99b0: 65 54 79 70 65 20 3d 20 52 42 55 5f 50 4b 5f 57  eType = RBU_PK_W
99c0: 49 54 48 4f 55 54 5f 52 4f 57 49 44 3b 0a 20 20  ITHOUT_ROWID;.  
99d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
99e0: 20 20 20 20 20 20 67 6f 74 6f 20 72 62 75 54 61        goto rbuTa
99f0: 62 6c 65 54 79 70 65 5f 65 6e 64 3b 0a 20 20 20  bleType_end;.   
9a00: 20 7d 0a 20 20 7d 0a 0a 20 20 70 2d 3e 72 63 20   }.  }..  p->rc 
9a10: 3d 20 70 72 65 70 61 72 65 46 72 65 65 41 6e 64  = prepareFreeAnd
9a20: 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e  CollectError(p->
9a30: 64 62 4d 61 69 6e 2c 20 26 61 53 74 6d 74 5b 33  dbMain, &aStmt[3
9a40: 5d 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 20  ], &p->zErrmsg, 
9a50: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72  .    sqlite3_mpr
9a60: 69 6e 74 66 28 22 50 52 41 47 4d 41 20 74 61 62  intf("PRAGMA tab
9a70: 6c 65 5f 69 6e 66 6f 3d 25 51 22 2c 7a 54 61 62  le_info=%Q",zTab
9a80: 29 0a 20 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  ).  );.  if( p->
9a90: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
9aa0: 0a 20 20 20 20 77 68 69 6c 65 28 20 73 71 6c 69  .    while( sqli
9ab0: 74 65 33 5f 73 74 65 70 28 61 53 74 6d 74 5b 33  te3_step(aStmt[3
9ac0: 5d 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  ])==SQLITE_ROW )
9ad0: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
9ae0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 61  te3_column_int(a
9af0: 53 74 6d 74 5b 33 5d 2c 35 29 3e 30 20 29 7b 0a  Stmt[3],5)>0 ){.
9b00: 20 20 20 20 20 20 20 20 2a 70 65 54 79 70 65 20          *peType 
9b10: 3d 20 52 42 55 5f 50 4b 5f 49 50 4b 3b 20 20 20  = RBU_PK_IPK;   
9b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9b30: 65 78 70 6c 69 63 69 74 20 49 50 4b 20 63 6f 6c  explicit IPK col
9b40: 75 6d 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 67  umn */.        g
9b50: 6f 74 6f 20 72 62 75 54 61 62 6c 65 54 79 70 65  oto rbuTableType
9b60: 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _end;.      }.  
9b70: 20 20 7d 0a 20 20 20 20 2a 70 65 54 79 70 65 20    }.    *peType 
9b80: 3d 20 52 42 55 5f 50 4b 5f 4e 4f 4e 45 3b 0a 20  = RBU_PK_NONE;. 
9b90: 20 7d 0a 0a 72 62 75 54 61 62 6c 65 54 79 70 65   }..rbuTableType
9ba0: 5f 65 6e 64 3a 20 7b 0a 20 20 20 20 75 6e 73 69  _end: {.    unsi
9bb0: 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20 20 20  gned int i;.    
9bc0: 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
9bd0: 66 28 61 53 74 6d 74 29 2f 73 69 7a 65 6f 66 28  f(aStmt)/sizeof(
9be0: 61 53 74 6d 74 5b 30 5d 29 3b 20 69 2b 2b 29 7b  aStmt[0]); i++){
9bf0: 0a 20 20 20 20 20 20 72 62 75 46 69 6e 61 6c 69  .      rbuFinali
9c00: 7a 65 28 70 2c 20 61 53 74 6d 74 5b 69 5d 29 3b  ze(p, aStmt[i]);
9c10: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
9c20: 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 68 65  .** This is a he
9c30: 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 20 66 6f  lper function fo
9c40: 72 20 72 62 75 4f 62 6a 49 74 65 72 43 61 63 68  r rbuObjIterCach
9c50: 65 54 61 62 6c 65 49 6e 66 6f 28 29 2e 20 49 74  eTableInfo(). It
9c60: 20 70 6f 70 75 6c 61 74 65 73 0a 2a 2a 20 74 68   populates.** th
9c70: 65 20 70 49 74 65 72 2d 3e 61 62 49 6e 64 65 78  e pIter->abIndex
9c80: 65 64 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73  ed[] array..*/.s
9c90: 74 61 74 69 63 20 76 6f 69 64 20 72 62 75 4f 62  tatic void rbuOb
9ca0: 6a 49 74 65 72 43 61 63 68 65 49 6e 64 65 78 65  jIterCacheIndexe
9cb0: 64 43 6f 6c 73 28 73 71 6c 69 74 65 33 72 62 75  dCols(sqlite3rbu
9cc0: 20 2a 70 2c 20 52 62 75 4f 62 6a 49 74 65 72 20   *p, RbuObjIter 
9cd0: 2a 70 49 74 65 72 29 7b 0a 20 20 73 71 6c 69 74  *pIter){.  sqlit
9ce0: 65 33 5f 73 74 6d 74 20 2a 70 4c 69 73 74 20 3d  e3_stmt *pList =
9cf0: 20 30 3b 0a 20 20 69 6e 74 20 62 49 6e 64 65 78   0;.  int bIndex
9d00: 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e   = 0;..  if( p->
9d10: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
9d20: 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 49 74 65  .    memcpy(pIte
9d30: 72 2d 3e 61 62 49 6e 64 65 78 65 64 2c 20 70 49  r->abIndexed, pI
9d40: 74 65 72 2d 3e 61 62 54 62 6c 50 6b 2c 20 73 69  ter->abTblPk, si
9d50: 7a 65 6f 66 28 75 38 29 2a 70 49 74 65 72 2d 3e  zeof(u8)*pIter->
9d60: 6e 54 62 6c 43 6f 6c 29 3b 0a 20 20 20 20 70 2d  nTblCol);.    p-
9d70: 3e 72 63 20 3d 20 70 72 65 70 61 72 65 46 72 65  >rc = prepareFre
9d80: 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72  eAndCollectError
9d90: 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 70 4c 69  (p->dbMain, &pLi
9da0: 73 74 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c  st, &p->zErrmsg,
9db0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
9dc0: 5f 6d 70 72 69 6e 74 66 28 22 50 52 41 47 4d 41  _mprintf("PRAGMA
9dd0: 20 6d 61 69 6e 2e 69 6e 64 65 78 5f 6c 69 73 74   main.index_list
9de0: 20 3d 20 25 51 22 2c 20 70 49 74 65 72 2d 3e 7a   = %Q", pIter->z
9df0: 54 62 6c 29 0a 20 20 20 20 29 3b 0a 20 20 7d 0a  Tbl).    );.  }.
9e00: 0a 20 20 70 49 74 65 72 2d 3e 6e 49 6e 64 65 78  .  pIter->nIndex
9e10: 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 70   = 0;.  while( p
9e20: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
9e30: 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  && SQLITE_ROW==s
9e40: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 4c 69 73  qlite3_step(pLis
9e50: 74 29 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  t) ){.    const 
9e60: 63 68 61 72 20 2a 7a 49 64 78 20 3d 20 28 63 6f  char *zIdx = (co
9e70: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
9e80: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 4c  3_column_text(pL
9e90: 69 73 74 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c  ist, 1);.    sql
9ea0: 69 74 65 33 5f 73 74 6d 74 20 2a 70 58 49 6e 66  ite3_stmt *pXInf
9eb0: 6f 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 7a  o = 0;.    if( z
9ec0: 49 64 78 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  Idx==0 ) break;.
9ed0: 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70      p->rc = prep
9ee0: 61 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63  areFreeAndCollec
9ef0: 74 45 72 72 6f 72 28 70 2d 3e 64 62 4d 61 69 6e  tError(p->dbMain
9f00: 2c 20 26 70 58 49 6e 66 6f 2c 20 26 70 2d 3e 7a  , &pXInfo, &p->z
9f10: 45 72 72 6d 73 67 2c 0a 20 20 20 20 20 20 20 20  Errmsg,.        
9f20: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
9f30: 22 50 52 41 47 4d 41 20 6d 61 69 6e 2e 69 6e 64  "PRAGMA main.ind
9f40: 65 78 5f 78 69 6e 66 6f 20 3d 20 25 51 22 2c 20  ex_xinfo = %Q", 
9f50: 7a 49 64 78 29 0a 20 20 20 20 29 3b 0a 20 20 20  zIdx).    );.   
9f60: 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53   while( p->rc==S
9f70: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49  QLITE_OK && SQLI
9f80: 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
9f90: 73 74 65 70 28 70 58 49 6e 66 6f 29 20 29 7b 0a  step(pXInfo) ){.
9fa0: 20 20 20 20 20 20 69 6e 74 20 69 43 69 64 20 3d        int iCid =
9fb0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
9fc0: 69 6e 74 28 70 58 49 6e 66 6f 2c 20 31 29 3b 0a  int(pXInfo, 1);.
9fd0: 20 20 20 20 20 20 69 66 28 20 69 43 69 64 3e 3d        if( iCid>=
9fe0: 30 20 29 20 70 49 74 65 72 2d 3e 61 62 49 6e 64  0 ) pIter->abInd
9ff0: 65 78 65 64 5b 69 43 69 64 5d 20 3d 20 31 3b 0a  exed[iCid] = 1;.
a000: 20 20 20 20 7d 0a 20 20 20 20 72 62 75 46 69 6e      }.    rbuFin
a010: 61 6c 69 7a 65 28 70 2c 20 70 58 49 6e 66 6f 29  alize(p, pXInfo)
a020: 3b 0a 20 20 20 20 62 49 6e 64 65 78 20 3d 20 31  ;.    bIndex = 1
a030: 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 6e 49 6e  ;.    pIter->nIn
a040: 64 65 78 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 69 66  dex++;.  }..  if
a050: 28 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d  ( pIter->eType==
a060: 52 42 55 5f 50 4b 5f 57 49 54 48 4f 55 54 5f 52  RBU_PK_WITHOUT_R
a070: 4f 57 49 44 20 29 7b 0a 20 20 20 20 2f 2a 20 22  OWID ){.    /* "
a080: 50 52 41 47 4d 41 20 69 6e 64 65 78 5f 6c 69 73  PRAGMA index_lis
a090: 74 22 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20  t" includes the 
a0a0: 6d 61 69 6e 20 50 4b 20 62 2d 74 72 65 65 20 2a  main PK b-tree *
a0b0: 2f 0a 20 20 20 20 70 49 74 65 72 2d 3e 6e 49 6e  /.    pIter->nIn
a0c0: 64 65 78 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 72 62  dex--;.  }..  rb
a0d0: 75 46 69 6e 61 6c 69 7a 65 28 70 2c 20 70 4c 69  uFinalize(p, pLi
a0e0: 73 74 29 3b 0a 20 20 69 66 28 20 62 49 6e 64 65  st);.  if( bInde
a0f0: 78 3d 3d 30 20 29 20 70 49 74 65 72 2d 3e 61 62  x==0 ) pIter->ab
a100: 49 6e 64 65 78 65 64 20 3d 20 30 3b 0a 7d 0a 0a  Indexed = 0;.}..
a110: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 79 20 61  ./*.** If they a
a120: 72 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 70  re not already p
a130: 6f 70 75 6c 61 74 65 64 2c 20 70 6f 70 75 6c 61  opulated, popula
a140: 74 65 20 74 68 65 20 70 49 74 65 72 2d 3e 61 7a  te the pIter->az
a150: 54 62 6c 43 6f 6c 5b 5d 2c 0a 2a 2a 20 70 49 74  TblCol[],.** pIt
a160: 65 72 2d 3e 61 62 54 62 6c 50 6b 5b 5d 2c 20 70  er->abTblPk[], p
a170: 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 20 61 6e  Iter->nTblCol an
a180: 64 20 70 49 74 65 72 2d 3e 62 52 6f 77 69 64 20  d pIter->bRowid 
a190: 76 61 72 69 61 62 6c 65 73 20 61 63 63 6f 72 64  variables accord
a1a0: 69 6e 67 20 74 6f 0a 2a 2a 20 74 68 65 20 74 61  ing to.** the ta
a1b0: 62 6c 65 20 28 6e 6f 74 20 69 6e 64 65 78 29 20  ble (not index) 
a1c0: 74 68 61 74 20 74 68 65 20 69 74 65 72 61 74 6f  that the iterato
a1d0: 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  r currently poin
a1e0: 74 73 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  ts to..**.** Ret
a1f0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
a200: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20   successful, or 
a210: 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
a220: 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 20  code otherwise. 
a230: 49 66 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 64  If.** an error d
a240: 6f 65 73 20 6f 63 63 75 72 2c 20 61 6e 20 65 72  oes occur, an er
a250: 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 65 72 72  ror code and err
a260: 6f 72 20 6d 65 73 73 61 67 65 20 61 72 65 20 61  or message are a
a270: 6c 73 6f 20 6c 65 66 74 20 69 6e 20 0a 2a 2a 20  lso left in .** 
a280: 74 68 65 20 52 42 55 20 68 61 6e 64 6c 65 2e 0a  the RBU handle..
a290: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62  */.static int rb
a2a0: 75 4f 62 6a 49 74 65 72 43 61 63 68 65 54 61 62  uObjIterCacheTab
a2b0: 6c 65 49 6e 66 6f 28 73 71 6c 69 74 65 33 72 62  leInfo(sqlite3rb
a2c0: 75 20 2a 70 2c 20 52 62 75 4f 62 6a 49 74 65 72  u *p, RbuObjIter
a2d0: 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20   *pIter){.  if( 
a2e0: 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 3d  pIter->azTblCol=
a2f0: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
a300: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
a310: 30 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 20  0;.    int nCol 
a320: 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 3b 20  = 0;.    int i; 
a330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a340: 20 20 20 20 20 20 20 2f 2a 20 66 6f 72 28 29 20         /* for() 
a350: 6c 6f 6f 70 20 69 74 65 72 61 74 6f 72 20 76 61  loop iterator va
a360: 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e  riable */.    in
a370: 74 20 62 52 62 75 52 6f 77 69 64 20 3d 20 30 3b  t bRbuRowid = 0;
a380: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
a390: 66 20 69 6e 70 75 74 20 74 61 62 6c 65 20 68 61  f input table ha
a3a0: 73 20 63 6f 6c 75 6d 6e 20 22 72 62 75 5f 72 6f  s column "rbu_ro
a3b0: 77 69 64 22 20 2a 2f 0a 20 20 20 20 69 6e 74 20  wid" */.    int 
a3c0: 69 4f 72 64 65 72 20 3d 20 30 3b 0a 20 20 20 20  iOrder = 0;.    
a3d0: 69 6e 74 20 69 54 6e 75 6d 20 3d 20 30 3b 0a 0a  int iTnum = 0;..
a3e0: 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75      /* Figure ou
a3f0: 74 20 74 68 65 20 74 79 70 65 20 6f 66 20 74 61  t the type of ta
a400: 62 6c 65 20 74 68 69 73 20 73 74 65 70 20 77 69  ble this step wi
a410: 6c 6c 20 64 65 61 6c 20 77 69 74 68 2e 20 2a 2f  ll deal with. */
a420: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
a430: 65 72 2d 3e 65 54 79 70 65 3d 3d 30 20 29 3b 0a  er->eType==0 );.
a440: 20 20 20 20 72 62 75 54 61 62 6c 65 54 79 70 65      rbuTableType
a450: 28 70 2c 20 70 49 74 65 72 2d 3e 7a 54 62 6c 2c  (p, pIter->zTbl,
a460: 20 26 70 49 74 65 72 2d 3e 65 54 79 70 65 2c 20   &pIter->eType, 
a470: 26 69 54 6e 75 6d 2c 20 26 70 49 74 65 72 2d 3e  &iTnum, &pIter->
a480: 69 50 6b 54 6e 75 6d 29 3b 0a 20 20 20 20 69 66  iPkTnum);.    if
a490: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
a4a0: 4f 4b 20 26 26 20 70 49 74 65 72 2d 3e 65 54 79  OK && pIter->eTy
a4b0: 70 65 3d 3d 52 42 55 5f 50 4b 5f 4e 4f 54 41 42  pe==RBU_PK_NOTAB
a4c0: 4c 45 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72  LE ){.      p->r
a4d0: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
a4e0: 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 45 72 72 6d  ;.      p->zErrm
a4f0: 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  sg = sqlite3_mpr
a500: 69 6e 74 66 28 22 6e 6f 20 73 75 63 68 20 74 61  intf("no such ta
a510: 62 6c 65 3a 20 25 73 22 2c 20 70 49 74 65 72 2d  ble: %s", pIter-
a520: 3e 7a 54 62 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  >zTbl);.    }.  
a530: 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20 72 65    if( p->rc ) re
a540: 74 75 72 6e 20 70 2d 3e 72 63 3b 0a 20 20 20 20  turn p->rc;.    
a550: 69 66 28 20 70 49 74 65 72 2d 3e 7a 49 64 78 3d  if( pIter->zIdx=
a560: 3d 30 20 29 20 70 49 74 65 72 2d 3e 69 54 6e 75  =0 ) pIter->iTnu
a570: 6d 20 3d 20 69 54 6e 75 6d 3b 0a 0a 20 20 20 20  m = iTnum;..    
a580: 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 65  assert( pIter->e
a590: 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 4e 4f 4e  Type==RBU_PK_NON
a5a0: 45 20 7c 7c 20 70 49 74 65 72 2d 3e 65 54 79 70  E || pIter->eTyp
a5b0: 65 3d 3d 52 42 55 5f 50 4b 5f 49 50 4b 20 0a 20  e==RBU_PK_IPK . 
a5c0: 20 20 20 20 20 20 20 20 7c 7c 20 70 49 74 65 72          || pIter
a5d0: 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f  ->eType==RBU_PK_
a5e0: 45 58 54 45 52 4e 41 4c 20 7c 7c 20 70 49 74 65  EXTERNAL || pIte
a5f0: 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b  r->eType==RBU_PK
a600: 5f 57 49 54 48 4f 55 54 5f 52 4f 57 49 44 0a 20  _WITHOUT_ROWID. 
a610: 20 20 20 20 20 20 20 20 7c 7c 20 70 49 74 65 72          || pIter
a620: 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f  ->eType==RBU_PK_
a630: 56 54 41 42 0a 20 20 20 20 29 3b 0a 0a 20 20 20  VTAB.    );..   
a640: 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65   /* Populate the
a650: 20 61 7a 54 62 6c 43 6f 6c 5b 5d 20 61 6e 64 20   azTblCol[] and 
a660: 6e 54 62 6c 43 6f 6c 20 76 61 72 69 61 62 6c 65  nTblCol variable
a670: 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63  s based on the c
a680: 6f 6c 75 6d 6e 73 0a 20 20 20 20 2a 2a 20 6f 66  olumns.    ** of
a690: 20 74 68 65 20 69 6e 70 75 74 20 74 61 62 6c 65   the input table
a6a0: 2e 20 49 67 6e 6f 72 65 20 61 6e 79 20 69 6e 70  . Ignore any inp
a6b0: 75 74 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73  ut table columns
a6c0: 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74 68   that begin with
a6d0: 0a 20 20 20 20 2a 2a 20 22 72 62 75 5f 22 2e 20  .    ** "rbu_". 
a6e0: 20 2a 2f 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   */.    p->rc = 
a6f0: 70 72 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f  prepareFreeAndCo
a700: 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62  llectError(p->db
a710: 52 62 75 2c 20 26 70 53 74 6d 74 2c 20 26 70 2d  Rbu, &pStmt, &p-
a720: 3e 7a 45 72 72 6d 73 67 2c 20 0a 20 20 20 20 20  >zErrmsg, .     
a730: 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e     sqlite3_mprin
a740: 74 66 28 22 53 45 4c 45 43 54 20 2a 20 46 52 4f  tf("SELECT * FRO
a750: 4d 20 27 25 71 27 22 2c 20 70 49 74 65 72 2d 3e  M '%q'", pIter->
a760: 7a 44 61 74 61 54 62 6c 29 0a 20 20 20 20 29 3b  zDataTbl).    );
a770: 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  .    if( p->rc==
a780: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
a790: 20 20 20 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65     nCol = sqlite
a7a0: 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70  3_column_count(p
a7b0: 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 72 62 75  Stmt);.      rbu
a7c0: 41 6c 6c 6f 63 61 74 65 49 74 65 72 41 72 72 61  AllocateIterArra
a7d0: 79 73 28 70 2c 20 70 49 74 65 72 2c 20 6e 43 6f  ys(p, pIter, nCo
a7e0: 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  l);.    }.    fo
a7f0: 72 28 69 3d 30 3b 20 70 2d 3e 72 63 3d 3d 53 51  r(i=0; p->rc==SQ
a800: 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 6e 43 6f  LITE_OK && i<nCo
a810: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63  l; i++){.      c
a820: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
a830: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
a840: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e  sqlite3_column_n
a850: 61 6d 65 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20  ame(pStmt, i);. 
a860: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
a870: 5f 73 74 72 6e 69 63 6d 70 28 22 72 62 75 5f 22  _strnicmp("rbu_"
a880: 2c 20 7a 4e 61 6d 65 2c 20 34 29 20 29 7b 0a 20  , zName, 4) ){. 
a890: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f         char *zCo
a8a0: 70 79 20 3d 20 72 62 75 53 74 72 6e 64 75 70 28  py = rbuStrndup(
a8b0: 7a 4e 61 6d 65 2c 20 26 70 2d 3e 72 63 29 3b 0a  zName, &p->rc);.
a8c0: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 61          pIter->a
a8d0: 69 53 72 63 4f 72 64 65 72 5b 70 49 74 65 72 2d  iSrcOrder[pIter-
a8e0: 3e 6e 54 62 6c 43 6f 6c 5d 20 3d 20 70 49 74 65  >nTblCol] = pIte
a8f0: 72 2d 3e 6e 54 62 6c 43 6f 6c 3b 0a 20 20 20 20  r->nTblCol;.    
a900: 20 20 20 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c      pIter->azTbl
a910: 43 6f 6c 5b 70 49 74 65 72 2d 3e 6e 54 62 6c 43  Col[pIter->nTblC
a920: 6f 6c 2b 2b 5d 20 3d 20 7a 43 6f 70 79 3b 0a 20  ol++] = zCopy;. 
a930: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65 6c 73       }.      els
a940: 65 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33  e if( 0==sqlite3
a950: 5f 73 74 72 69 63 6d 70 28 22 72 62 75 5f 72 6f  _stricmp("rbu_ro
a960: 77 69 64 22 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a  wid", zName) ){.
a970: 20 20 20 20 20 20 20 20 62 52 62 75 52 6f 77 69          bRbuRowi
a980: 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  d = 1;.      }. 
a990: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
a9a0: 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
a9b0: 3b 0a 20 20 20 20 70 53 74 6d 74 20 3d 20 30 3b  ;.    pStmt = 0;
a9c0: 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d  ..    if( p->rc=
a9d0: 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20  =SQLITE_OK.     
a9e0: 26 26 20 72 62 75 49 73 56 61 63 75 75 6d 28 70  && rbuIsVacuum(p
a9f0: 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 62 52 62  )==0.     && bRb
aa00: 75 52 6f 77 69 64 21 3d 28 70 49 74 65 72 2d 3e  uRowid!=(pIter->
aa10: 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 56 54  eType==RBU_PK_VT
aa20: 41 42 20 7c 7c 20 70 49 74 65 72 2d 3e 65 54 79  AB || pIter->eTy
aa30: 70 65 3d 3d 52 42 55 5f 50 4b 5f 4e 4f 4e 45 29  pe==RBU_PK_NONE)
aa40: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70 2d  .    ){.      p-
aa50: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52  >rc = SQLITE_ERR
aa60: 4f 52 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 45 72  OR;.      p->zEr
aa70: 72 6d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  rmsg = sqlite3_m
aa80: 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  printf(.        
aa90: 20 20 22 74 61 62 6c 65 20 25 71 20 25 73 20 72    "table %q %s r
aaa0: 62 75 5f 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 22  bu_rowid column"
aab0: 2c 20 70 49 74 65 72 2d 3e 7a 44 61 74 61 54 62  , pIter->zDataTb
aac0: 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 28 62 52  l,.          (bR
aad0: 62 75 52 6f 77 69 64 20 3f 20 22 6d 61 79 20 6e  buRowid ? "may n
aae0: 6f 74 20 68 61 76 65 22 20 3a 20 22 72 65 71 75  ot have" : "requ
aaf0: 69 72 65 73 22 29 0a 20 20 20 20 20 20 29 3b 0a  ires").      );.
ab00: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68      }..    /* Ch
ab10: 65 63 6b 20 74 68 61 74 20 61 6c 6c 20 6e 6f 6e  eck that all non
ab20: 2d 48 49 44 44 45 4e 20 63 6f 6c 75 6d 6e 73 20  -HIDDEN columns 
ab30: 69 6e 20 74 68 65 20 64 65 73 74 69 6e 61 74 69  in the destinati
ab40: 6f 6e 20 74 61 62 6c 65 20 61 72 65 20 61 6c 73  on table are als
ab50: 6f 0a 20 20 20 20 2a 2a 20 70 72 65 73 65 6e 74  o.    ** present
ab60: 20 69 6e 20 74 68 65 20 69 6e 70 75 74 20 74 61   in the input ta
ab70: 62 6c 65 2e 20 50 6f 70 75 6c 61 74 65 20 74 68  ble. Populate th
ab80: 65 20 61 62 54 62 6c 50 6b 5b 5d 2c 20 61 7a 54  e abTblPk[], azT
ab90: 62 6c 54 79 70 65 5b 5d 20 61 6e 64 0a 20 20 20  blType[] and.   
aba0: 20 2a 2a 20 61 69 54 62 6c 4f 72 64 65 72 5b 5d   ** aiTblOrder[]
abb0: 20 61 72 72 61 79 73 20 61 74 20 74 68 65 20 73   arrays at the s
abc0: 61 6d 65 20 74 69 6d 65 2e 20 20 2a 2f 0a 20 20  ame time.  */.  
abd0: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
abe0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
abf0: 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65 46  p->rc = prepareF
ac00: 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72  reeAndCollectErr
ac10: 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 70  or(p->dbMain, &p
ac20: 53 74 6d 74 2c 20 26 70 2d 3e 7a 45 72 72 6d 73  Stmt, &p->zErrms
ac30: 67 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73 71  g, .          sq
ac40: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 50  lite3_mprintf("P
ac50: 52 41 47 4d 41 20 74 61 62 6c 65 5f 69 6e 66 6f  RAGMA table_info
ac60: 28 25 51 29 22 2c 20 70 49 74 65 72 2d 3e 7a 54  (%Q)", pIter->zT
ac70: 62 6c 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  bl).      );.   
ac80: 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 70 2d   }.    while( p-
ac90: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
aca0: 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71  & SQLITE_ROW==sq
acb0: 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
acc0: 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  ) ){.      const
acd0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 28   char *zName = (
ace0: 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
acf0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
ad00: 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20 20  pStmt, 1);.     
ad10: 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20   if( zName==0 ) 
ad20: 62 72 65 61 6b 3b 20 20 2f 2a 20 41 6e 20 4f 4f  break;  /* An OO
ad30: 4d 20 2d 20 66 69 6e 61 6c 69 7a 65 28 29 20 62  M - finalize() b
ad40: 65 6c 6f 77 20 72 65 74 75 72 6e 73 20 53 5f 4e  elow returns S_N
ad50: 4f 4d 45 4d 20 2a 2f 0a 20 20 20 20 20 20 66 6f  OMEM */.      fo
ad60: 72 28 69 3d 69 4f 72 64 65 72 3b 20 69 3c 70 49  r(i=iOrder; i<pI
ad70: 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 3b 20 69 2b  ter->nTblCol; i+
ad80: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
ad90: 30 3d 3d 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c  0==strcmp(zName,
ada0: 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c   pIter->azTblCol
adb0: 5b 69 5d 29 20 29 20 62 72 65 61 6b 3b 0a 20 20  [i]) ) break;.  
adc0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
add0: 69 3d 3d 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f  i==pIter->nTblCo
ade0: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  l ){.        p->
adf0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
ae00: 52 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 7a 45  R;.        p->zE
ae10: 72 72 6d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f  rrmsg = sqlite3_
ae20: 6d 70 72 69 6e 74 66 28 22 63 6f 6c 75 6d 6e 20  mprintf("column 
ae30: 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20 25 71 3a  missing from %q:
ae40: 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20   %s",.          
ae50: 20 20 70 49 74 65 72 2d 3e 7a 44 61 74 61 54 62    pIter->zDataTb
ae60: 6c 2c 20 7a 4e 61 6d 65 0a 20 20 20 20 20 20 20  l, zName.       
ae70: 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   );.      }else{
ae80: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 50 6b  .        int iPk
ae90: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
aea0: 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 35 29 3b  n_int(pStmt, 5);
aeb0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 62 4e 6f  .        int bNo
aec0: 74 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 5f  tNull = sqlite3_
aed0: 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74  column_int(pStmt
aee0: 2c 20 33 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  , 3);.        co
aef0: 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 20  nst char *zType 
af00: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
af10: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
af20: 78 74 28 70 53 74 6d 74 2c 20 32 29 3b 0a 0a 20  xt(pStmt, 2);.. 
af30: 20 20 20 20 20 20 20 69 66 28 20 69 21 3d 69 4f         if( i!=iO
af40: 72 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  rder ){.        
af50: 20 20 53 57 41 50 28 69 6e 74 2c 20 70 49 74 65    SWAP(int, pIte
af60: 72 2d 3e 61 69 53 72 63 4f 72 64 65 72 5b 69 5d  r->aiSrcOrder[i]
af70: 2c 20 70 49 74 65 72 2d 3e 61 69 53 72 63 4f 72  , pIter->aiSrcOr
af80: 64 65 72 5b 69 4f 72 64 65 72 5d 29 3b 0a 20 20  der[iOrder]);.  
af90: 20 20 20 20 20 20 20 20 53 57 41 50 28 63 68 61          SWAP(cha
afa0: 72 2a 2c 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c  r*, pIter->azTbl
afb0: 43 6f 6c 5b 69 5d 2c 20 70 49 74 65 72 2d 3e 61  Col[i], pIter->a
afc0: 7a 54 62 6c 43 6f 6c 5b 69 4f 72 64 65 72 5d 29  zTblCol[iOrder])
afd0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
afe0: 20 20 20 20 20 70 49 74 65 72 2d 3e 61 7a 54 62       pIter->azTb
aff0: 6c 54 79 70 65 5b 69 4f 72 64 65 72 5d 20 3d 20  lType[iOrder] = 
b000: 72 62 75 53 74 72 6e 64 75 70 28 7a 54 79 70 65  rbuStrndup(zType
b010: 2c 20 26 70 2d 3e 72 63 29 3b 0a 20 20 20 20 20  , &p->rc);.     
b020: 20 20 20 70 49 74 65 72 2d 3e 61 62 54 62 6c 50     pIter->abTblP
b030: 6b 5b 69 4f 72 64 65 72 5d 20 3d 20 28 69 50 6b  k[iOrder] = (iPk
b040: 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 70 49  !=0);.        pI
b050: 74 65 72 2d 3e 61 62 4e 6f 74 4e 75 6c 6c 5b 69  ter->abNotNull[i
b060: 4f 72 64 65 72 5d 20 3d 20 28 75 38 29 62 4e 6f  Order] = (u8)bNo
b070: 74 4e 75 6c 6c 20 7c 7c 20 28 69 50 6b 21 3d 30  tNull || (iPk!=0
b080: 29 3b 0a 20 20 20 20 20 20 20 20 69 4f 72 64 65  );.        iOrde
b090: 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  r++;.      }.   
b0a0: 20 7d 0a 0a 20 20 20 20 72 62 75 46 69 6e 61 6c   }..    rbuFinal
b0b0: 69 7a 65 28 70 2c 20 70 53 74 6d 74 29 3b 0a 20  ize(p, pStmt);. 
b0c0: 20 20 20 72 62 75 4f 62 6a 49 74 65 72 43 61 63     rbuObjIterCac
b0d0: 68 65 49 6e 64 65 78 65 64 43 6f 6c 73 28 70 2c  heIndexedCols(p,
b0e0: 20 70 49 74 65 72 29 3b 0a 20 20 20 20 61 73 73   pIter);.    ass
b0f0: 65 72 74 28 20 70 49 74 65 72 2d 3e 65 54 79 70  ert( pIter->eTyp
b100: 65 21 3d 52 42 55 5f 50 4b 5f 56 54 41 42 20 7c  e!=RBU_PK_VTAB |
b110: 7c 20 70 49 74 65 72 2d 3e 61 62 49 6e 64 65 78  | pIter->abIndex
b120: 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ed==0 );.    ass
b130: 65 72 74 28 20 70 49 74 65 72 2d 3e 65 54 79 70  ert( pIter->eTyp
b140: 65 21 3d 52 42 55 5f 50 4b 5f 56 54 41 42 20 7c  e!=RBU_PK_VTAB |
b150: 7c 20 70 49 74 65 72 2d 3e 6e 49 6e 64 65 78 3d  | pIter->nIndex=
b160: 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  =0 );.  }..  ret
b170: 75 72 6e 20 70 2d 3e 72 63 3b 0a 7d 0a 0a 2f 2a  urn p->rc;.}../*
b180: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
b190: 6e 20 63 6f 6e 73 74 72 75 63 74 73 20 61 6e 64  n constructs and
b1a0: 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74   returns a point
b1b0: 65 72 20 74 6f 20 61 20 6e 75 6c 2d 74 65 72 6d  er to a nul-term
b1c0: 69 6e 61 74 65 64 20 0a 2a 2a 20 73 74 72 69 6e  inated .** strin
b1d0: 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 73 6f 6d  g containing som
b1e0: 65 20 53 51 4c 20 63 6c 61 75 73 65 20 6f 72 20  e SQL clause or 
b1f0: 6c 69 73 74 20 62 61 73 65 64 20 6f 6e 20 6f 6e  list based on on
b200: 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65  e or more of the
b210: 20 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   .** column name
b220: 73 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72  s currently stor
b230: 65 64 20 69 6e 20 74 68 65 20 70 49 74 65 72 2d  ed in the pIter-
b240: 3e 61 7a 54 62 6c 43 6f 6c 5b 5d 20 61 72 72 61  >azTblCol[] arra
b250: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  y..*/.static cha
b260: 72 20 2a 72 62 75 4f 62 6a 49 74 65 72 47 65 74  r *rbuObjIterGet
b270: 43 6f 6c 6c 69 73 74 28 0a 20 20 73 71 6c 69 74  Collist(.  sqlit
b280: 65 33 72 62 75 20 2a 70 2c 20 20 20 20 20 20 20  e3rbu *p,       
b290: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 42             /* RB
b2a0: 55 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 52 62  U object */.  Rb
b2b0: 75 4f 62 6a 49 74 65 72 20 2a 70 49 74 65 72 20  uObjIter *pIter 
b2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b2d0: 20 4f 62 6a 65 63 74 20 69 74 65 72 61 74 6f 72   Object iterator
b2e0: 20 66 6f 72 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   for column name
b2f0: 73 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a  s */.){.  char *
b300: 7a 4c 69 73 74 20 3d 20 30 3b 0a 20 20 63 6f 6e  zList = 0;.  con
b310: 73 74 20 63 68 61 72 20 2a 7a 53 65 70 20 3d 20  st char *zSep = 
b320: 22 22 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  "";.  int i;.  f
b330: 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d  or(i=0; i<pIter-
b340: 3e 6e 54 62 6c 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  >nTblCol; i++){.
b350: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
b360: 7a 20 3d 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c  z = pIter->azTbl
b370: 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 7a 4c 69 73  Col[i];.    zLis
b380: 74 20 3d 20 72 62 75 4d 50 72 69 6e 74 66 28 70  t = rbuMPrintf(p
b390: 2c 20 22 25 7a 25 73 5c 22 25 77 5c 22 22 2c 20  , "%z%s\"%w\"", 
b3a0: 7a 4c 69 73 74 2c 20 7a 53 65 70 2c 20 7a 29 3b  zList, zSep, z);
b3b0: 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 2c 20 22  .    zSep = ", "
b3c0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
b3d0: 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  List;.}../*.** T
b3e0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
b3f0: 75 73 65 64 20 74 6f 20 63 72 65 61 74 65 20 61  used to create a
b400: 20 53 45 4c 45 43 54 20 6c 69 73 74 20 28 74 68   SELECT list (th
b410: 65 20 6c 69 73 74 20 6f 66 20 53 51 4c 20 0a 2a  e list of SQL .*
b420: 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68  * expressions th
b430: 61 74 20 66 6f 6c 6c 6f 77 73 20 61 20 53 45 4c  at follows a SEL
b440: 45 43 54 20 6b 65 79 77 6f 72 64 29 20 66 6f 72  ECT keyword) for
b450: 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
b460: 65 6e 74 20 0a 2a 2a 20 75 73 65 64 20 74 6f 20  ent .** used to 
b470: 72 65 61 64 20 66 72 6f 6d 20 61 6e 20 64 61 74  read from an dat
b480: 61 5f 78 78 78 20 6f 72 20 72 62 75 5f 74 6d 70  a_xxx or rbu_tmp
b490: 5f 78 78 78 20 74 61 62 6c 65 20 77 68 69 6c 65  _xxx table while
b4a0: 20 75 70 64 61 74 69 6e 67 20 74 68 65 20 0a 2a   updating the .*
b4b0: 2a 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 20 63  * index object c
b4c0: 75 72 72 65 6e 74 6c 79 20 69 6e 64 69 63 61 74  urrently indicat
b4d0: 65 64 20 62 79 20 74 68 65 20 69 74 65 72 61 74  ed by the iterat
b4e0: 6f 72 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64  or object passed
b4f0: 20 61 73 20 74 68 65 20 0a 2a 2a 20 73 65 63 6f   as the .** seco
b500: 6e 64 20 61 72 67 75 6d 65 6e 74 2e 20 41 20 22  nd argument. A "
b510: 50 52 41 47 4d 41 20 69 6e 64 65 78 5f 78 69 6e  PRAGMA index_xin
b520: 66 6f 20 3d 20 3c 69 64 78 6e 61 6d 65 3e 22 20  fo = <idxname>" 
b530: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 75 73 65  statement is use
b540: 64 20 0a 2a 2a 20 74 6f 20 6f 62 74 61 69 6e 20  d .** to obtain 
b550: 74 68 65 20 72 65 71 75 69 72 65 64 20 69 6e 66  the required inf
b560: 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  ormation..**.** 
b570: 49 66 20 74 68 65 20 69 6e 64 65 78 20 69 73 20  If the index is 
b580: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
b590: 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 43   form:.**.**   C
b5a0: 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f  REATE INDEX i1 O
b5b0: 4e 20 74 31 28 63 2c 20 62 20 43 4f 4c 4c 41 54  N t1(c, b COLLAT
b5c0: 45 20 6e 6f 63 61 73 65 29 3b 0a 2a 2a 0a 2a 2a  E nocase);.**.**
b5d0: 20 61 6e 64 20 22 74 31 22 20 69 73 20 61 20 74   and "t1" is a t
b5e0: 61 62 6c 65 20 77 69 74 68 20 61 6e 20 65 78 70  able with an exp
b5f0: 6c 69 63 69 74 20 49 4e 54 45 47 45 52 20 50 52  licit INTEGER PR
b600: 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e  IMARY KEY column
b610: 20 0a 2a 2a 20 22 69 70 6b 22 2c 20 74 68 65 20   .** "ipk", the 
b620: 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20  returned string 
b630: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 60 63 60  is:.**.**   "`c`
b640: 20 43 4f 4c 4c 41 54 45 20 27 42 49 4e 41 52 59   COLLATE 'BINARY
b650: 27 2c 20 60 62 60 20 43 4f 4c 4c 41 54 45 20 27  ', `b` COLLATE '
b660: 4e 4f 43 41 53 45 27 2c 20 60 69 70 6b 60 20 43  NOCASE', `ipk` C
b670: 4f 4c 4c 41 54 45 20 27 42 49 4e 41 52 59 27 22  OLLATE 'BINARY'"
b680: 0a 2a 2a 0a 2a 2a 20 41 73 20 77 65 6c 6c 20 61  .**.** As well a
b690: 73 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73  s the returned s
b6a0: 74 72 69 6e 67 2c 20 74 68 72 65 65 20 6f 74 68  tring, three oth
b6b0: 65 72 20 6d 61 6c 6c 6f 63 27 64 20 73 74 72 69  er malloc'd stri
b6c0: 6e 67 73 20 61 72 65 20 0a 2a 2a 20 72 65 74 75  ngs are .** retu
b6d0: 72 6e 65 64 20 76 69 61 20 6f 75 74 70 75 74 20  rned via output 
b6e0: 70 61 72 61 6d 65 74 65 72 73 2e 20 41 73 20 66  parameters. As f
b6f0: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
b700: 70 7a 49 6d 70 6f 73 74 65 72 43 6f 6c 73 3a 20  pzImposterCols: 
b710: 2e 2e 2e 0a 2a 2a 20 20 20 70 7a 49 6d 70 6f 73  ....**   pzImpos
b720: 74 65 72 50 6b 3a 20 2e 2e 2e 0a 2a 2a 20 20 20  terPk: ....**   
b730: 70 7a 57 68 65 72 65 3a 20 2e 2e 2e 0a 2a 2f 0a  pzWhere: ....*/.
b740: 73 74 61 74 69 63 20 63 68 61 72 20 2a 72 62 75  static char *rbu
b750: 4f 62 6a 49 74 65 72 47 65 74 49 6e 64 65 78 43  ObjIterGetIndexC
b760: 6f 6c 73 28 0a 20 20 73 71 6c 69 74 65 33 72 62  ols(.  sqlite3rb
b770: 75 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  u *p,           
b780: 20 20 20 20 20 20 20 2f 2a 20 52 42 55 20 6f 62         /* RBU ob
b790: 6a 65 63 74 20 2a 2f 0a 20 20 52 62 75 4f 62 6a  ject */.  RbuObj
b7a0: 49 74 65 72 20 2a 70 49 74 65 72 2c 20 20 20 20  Iter *pIter,    
b7b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a            /* Obj
b7c0: 65 63 74 20 69 74 65 72 61 74 6f 72 20 66 6f 72  ect iterator for
b7d0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f   column names */
b7e0: 0a 20 20 63 68 61 72 20 2a 2a 70 7a 49 6d 70 6f  .  char **pzImpo
b7f0: 73 74 65 72 43 6f 6c 73 2c 20 20 20 20 20 20 20  sterCols,       
b800: 20 20 20 2f 2a 20 4f 55 54 3a 20 43 6f 6c 75 6d     /* OUT: Colum
b810: 6e 73 20 66 6f 72 20 69 6d 70 6f 73 74 65 72 20  ns for imposter 
b820: 74 61 62 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20  table */.  char 
b830: 2a 2a 70 7a 49 6d 70 6f 73 74 65 72 50 6b 2c 20  **pzImposterPk, 
b840: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
b850: 54 3a 20 49 6d 70 6f 73 74 65 72 20 50 4b 20 63  T: Imposter PK c
b860: 6c 61 75 73 65 20 2a 2f 0a 20 20 63 68 61 72 20  lause */.  char 
b870: 2a 2a 70 7a 57 68 65 72 65 2c 20 20 20 20 20 20  **pzWhere,      
b880: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
b890: 54 3a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  T: WHERE clause 
b8a0: 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 42 69 6e 64  */.  int *pnBind
b8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b8c0: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54 72 62       /* OUT: Trb
b8d0: 75 6c 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  ul number of col
b8e0: 75 6d 6e 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  umns */.){.  int
b8f0: 20 72 63 20 3d 20 70 2d 3e 72 63 3b 20 20 20 20   rc = p->rc;    
b900: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b910: 45 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20  Error code */.  
b920: 69 6e 74 20 72 63 32 3b 20 20 20 20 20 20 20 20  int rc2;        
b930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b940: 2f 2a 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c  /* sqlite3_final
b950: 69 7a 65 28 29 20 72 65 74 75 72 6e 20 63 6f 64  ize() return cod
b960: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 52 65  e */.  char *zRe
b970: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
b980: 20 20 20 20 20 20 20 2f 2a 20 53 74 72 69 6e 67         /* String
b990: 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20   to return */.  
b9a0: 63 68 61 72 20 2a 7a 49 6d 70 43 6f 6c 73 20 3d  char *zImpCols =
b9b0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
b9c0: 2f 2a 20 53 74 72 69 6e 67 20 74 6f 20 72 65 74  /* String to ret
b9d0: 75 72 6e 20 76 69 61 20 2a 70 7a 49 6d 70 6f 73  urn via *pzImpos
b9e0: 74 65 72 43 6f 6c 73 20 2a 2f 0a 20 20 63 68 61  terCols */.  cha
b9f0: 72 20 2a 7a 49 6d 70 50 4b 20 3d 20 30 3b 20 20  r *zImpPK = 0;  
ba00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ba10: 53 74 72 69 6e 67 20 74 6f 20 72 65 74 75 72 6e  String to return
ba20: 20 76 69 61 20 2a 70 7a 49 6d 70 6f 73 74 65 72   via *pzImposter
ba30: 50 4b 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 57  PK */.  char *zW
ba40: 68 65 72 65 20 3d 20 30 3b 20 20 20 20 20 20 20  here = 0;       
ba50: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 72 69 6e          /* Strin
ba60: 67 20 74 6f 20 72 65 74 75 72 6e 20 76 69 61 20  g to return via 
ba70: 2a 70 7a 57 68 65 72 65 20 2a 2f 0a 20 20 69 6e  *pzWhere */.  in
ba80: 74 20 6e 42 69 6e 64 20 3d 20 30 3b 20 20 20 20  t nBind = 0;    
ba90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
baa0: 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e   Value to return
bab0: 20 76 69 61 20 2a 70 6e 42 69 6e 64 20 2a 2f 0a   via *pnBind */.
bac0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
bad0: 6f 6d 20 3d 20 22 22 3b 20 20 20 20 20 20 20 20  om = "";        
bae0: 20 20 2f 2a 20 53 65 74 20 74 6f 20 22 2c 20 22    /* Set to ", "
baf0: 20 6c 61 74 65 72 20 6f 6e 20 2a 2f 0a 20 20 63   later on */.  c
bb00: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 6e 64 20  onst char *zAnd 
bb10: 3d 20 22 22 3b 20 20 20 20 20 20 20 20 20 20 2f  = "";          /
bb20: 2a 20 53 65 74 20 74 6f 20 22 20 41 4e 44 20 22  * Set to " AND "
bb30: 20 6c 61 74 65 72 20 6f 6e 20 2a 2f 0a 20 20 73   later on */.  s
bb40: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 58 49  qlite3_stmt *pXI
bb50: 6e 66 6f 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  nfo = 0;       /
bb60: 2a 20 50 52 41 47 4d 41 20 69 6e 64 65 78 5f 78  * PRAGMA index_x
bb70: 69 6e 66 6f 20 3d 20 3f 20 2a 2f 0a 0a 20 20 69  info = ? */..  i
bb80: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
bb90: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
bba0: 70 2d 3e 7a 45 72 72 6d 73 67 3d 3d 30 20 29 3b  p->zErrmsg==0 );
bbb0: 0a 20 20 20 20 72 63 20 3d 20 70 72 65 70 61 72  .    rc = prepar
bbc0: 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45  eFreeAndCollectE
bbd0: 72 72 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20  rror(p->dbMain, 
bbe0: 26 70 58 49 6e 66 6f 2c 20 26 70 2d 3e 7a 45 72  &pXInfo, &p->zEr
bbf0: 72 6d 73 67 2c 0a 20 20 20 20 20 20 20 20 73 71  rmsg,.        sq
bc00: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 50  lite3_mprintf("P
bc10: 52 41 47 4d 41 20 6d 61 69 6e 2e 69 6e 64 65 78  RAGMA main.index
bc20: 5f 78 69 6e 66 6f 20 3d 20 25 51 22 2c 20 70 49  _xinfo = %Q", pI
bc30: 74 65 72 2d 3e 7a 49 64 78 29 0a 20 20 20 20 29  ter->zIdx).    )
bc40: 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20  ;.  }..  while( 
bc50: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
bc60: 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
bc70: 69 74 65 33 5f 73 74 65 70 28 70 58 49 6e 66 6f  ite3_step(pXInfo
bc80: 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 43 69  ) ){.    int iCi
bc90: 64 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  d = sqlite3_colu
bca0: 6d 6e 5f 69 6e 74 28 70 58 49 6e 66 6f 2c 20 31  mn_int(pXInfo, 1
bcb0: 29 3b 0a 20 20 20 20 69 6e 74 20 62 44 65 73 63  );.    int bDesc
bcc0: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
bcd0: 6e 5f 69 6e 74 28 70 58 49 6e 66 6f 2c 20 33 29  n_int(pXInfo, 3)
bce0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
bcf0: 20 2a 7a 43 6f 6c 6c 61 74 65 20 3d 20 28 63 6f   *zCollate = (co
bd00: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
bd10: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 58  3_column_text(pX
bd20: 49 6e 66 6f 2c 20 34 29 3b 0a 20 20 20 20 63 6f  Info, 4);.    co
bd30: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a  nst char *zCol;.
bd40: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
bd50: 7a 54 79 70 65 3b 0a 0a 20 20 20 20 69 66 28 20  zType;..    if( 
bd60: 69 43 69 64 3c 30 20 29 7b 0a 20 20 20 20 20 20  iCid<0 ){.      
bd70: 2f 2a 20 41 6e 20 69 6e 74 65 67 65 72 20 70 72  /* An integer pr
bd80: 69 6d 61 72 79 20 6b 65 79 2e 20 49 66 20 74 68  imary key. If th
bd90: 65 20 74 61 62 6c 65 20 68 61 73 20 61 6e 20 65  e table has an e
bda0: 78 70 6c 69 63 69 74 20 49 50 4b 2c 20 75 73 65  xplicit IPK, use
bdb0: 0a 20 20 20 20 20 20 2a 2a 20 69 74 73 20 6e 61  .      ** its na
bdc0: 6d 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 75  me. Otherwise, u
bdd0: 73 65 20 22 72 62 75 5f 72 6f 77 69 64 22 2e 20  se "rbu_rowid". 
bde0: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 49   */.      if( pI
bdf0: 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f  ter->eType==RBU_
be00: 50 4b 5f 49 50 4b 20 29 7b 0a 20 20 20 20 20 20  PK_IPK ){.      
be10: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20    int i;.       
be20: 20 66 6f 72 28 69 3d 30 3b 20 70 49 74 65 72 2d   for(i=0; pIter-
be30: 3e 61 62 54 62 6c 50 6b 5b 69 5d 3d 3d 30 3b 20  >abTblPk[i]==0; 
be40: 69 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20 61 73  i++);.        as
be50: 73 65 72 74 28 20 69 3c 70 49 74 65 72 2d 3e 6e  sert( i<pIter->n
be60: 54 62 6c 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20  TblCol );.      
be70: 20 20 7a 43 6f 6c 20 3d 20 70 49 74 65 72 2d 3e    zCol = pIter->
be80: 61 7a 54 62 6c 43 6f 6c 5b 69 5d 3b 0a 20 20 20  azTblCol[i];.   
be90: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 62 75     }else if( rbu
bea0: 49 73 56 61 63 75 75 6d 28 70 29 20 29 7b 0a 20  IsVacuum(p) ){. 
beb0: 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22 5f         zCol = "_
bec0: 72 6f 77 69 64 5f 22 3b 0a 20 20 20 20 20 20 7d  rowid_";.      }
bed0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 43  else{.        zC
bee0: 6f 6c 20 3d 20 22 72 62 75 5f 72 6f 77 69 64 22  ol = "rbu_rowid"
bef0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
bf00: 7a 54 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52  zType = "INTEGER
bf10: 22 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  ";.    }else{.  
bf20: 20 20 20 20 7a 43 6f 6c 20 3d 20 70 49 74 65 72      zCol = pIter
bf30: 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69 43 69 64 5d  ->azTblCol[iCid]
bf40: 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20  ;.      zType = 
bf50: 70 49 74 65 72 2d 3e 61 7a 54 62 6c 54 79 70 65  pIter->azTblType
bf60: 5b 69 43 69 64 5d 3b 0a 20 20 20 20 7d 0a 0a 20  [iCid];.    }.. 
bf70: 20 20 20 7a 52 65 74 20 3d 20 73 71 6c 69 74 65     zRet = sqlite
bf80: 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a 25 73 5c  3_mprintf("%z%s\
bf90: 22 25 77 5c 22 20 43 4f 4c 4c 41 54 45 20 25 51  "%w\" COLLATE %Q
bfa0: 22 2c 20 7a 52 65 74 2c 20 7a 43 6f 6d 2c 20 7a  ", zRet, zCom, z
bfb0: 43 6f 6c 2c 20 7a 43 6f 6c 6c 61 74 65 29 3b 0a  Col, zCollate);.
bfc0: 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 62      if( pIter->b
bfd0: 55 6e 69 71 75 65 3d 3d 30 20 7c 7c 20 73 71 6c  Unique==0 || sql
bfe0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
bff0: 70 58 49 6e 66 6f 2c 20 35 29 20 29 7b 0a 20 20  pXInfo, 5) ){.  
c000: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
c010: 7a 4f 72 64 65 72 20 3d 20 28 62 44 65 73 63 20  zOrder = (bDesc 
c020: 3f 20 22 20 44 45 53 43 22 20 3a 20 22 22 29 3b  ? " DESC" : "");
c030: 0a 20 20 20 20 20 20 7a 49 6d 70 50 4b 20 3d 20  .      zImpPK = 
c040: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
c050: 22 25 7a 25 73 5c 22 72 62 75 5f 69 6d 70 5f 25  "%z%s\"rbu_imp_%
c060: 64 25 77 5c 22 25 73 22 2c 20 0a 20 20 20 20 20  d%w\"%s", .     
c070: 20 20 20 20 20 7a 49 6d 70 50 4b 2c 20 7a 43 6f       zImpPK, zCo
c080: 6d 2c 20 6e 42 69 6e 64 2c 20 7a 43 6f 6c 2c 20  m, nBind, zCol, 
c090: 7a 4f 72 64 65 72 0a 20 20 20 20 20 20 29 3b 0a  zOrder.      );.
c0a0: 20 20 20 20 7d 0a 20 20 20 20 7a 49 6d 70 43 6f      }.    zImpCo
c0b0: 6c 73 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ls = sqlite3_mpr
c0c0: 69 6e 74 66 28 22 25 7a 25 73 5c 22 72 62 75 5f  intf("%z%s\"rbu_
c0d0: 69 6d 70 5f 25 64 25 77 5c 22 20 25 73 20 43 4f  imp_%d%w\" %s CO
c0e0: 4c 4c 41 54 45 20 25 51 22 2c 20 0a 20 20 20 20  LLATE %Q", .    
c0f0: 20 20 20 20 7a 49 6d 70 43 6f 6c 73 2c 20 7a 43      zImpCols, zC
c100: 6f 6d 2c 20 6e 42 69 6e 64 2c 20 7a 43 6f 6c 2c  om, nBind, zCol,
c110: 20 7a 54 79 70 65 2c 20 7a 43 6f 6c 6c 61 74 65   zType, zCollate
c120: 0a 20 20 20 20 29 3b 0a 20 20 20 20 7a 57 68 65  .    );.    zWhe
c130: 72 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  re = sqlite3_mpr
c140: 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 22 25  intf(.        "%
c150: 7a 25 73 5c 22 72 62 75 5f 69 6d 70 5f 25 64 25  z%s\"rbu_imp_%d%
c160: 77 5c 22 20 49 53 20 3f 22 2c 20 7a 57 68 65 72  w\" IS ?", zWher
c170: 65 2c 20 7a 41 6e 64 2c 20 6e 42 69 6e 64 2c 20  e, zAnd, nBind, 
c180: 7a 43 6f 6c 0a 20 20 20 20 29 3b 0a 20 20 20 20  zCol.    );.    
c190: 69 66 28 20 7a 52 65 74 3d 3d 30 20 7c 7c 20 7a  if( zRet==0 || z
c1a0: 49 6d 70 50 4b 3d 3d 30 20 7c 7c 20 7a 49 6d 70  ImpPK==0 || zImp
c1b0: 43 6f 6c 73 3d 3d 30 20 7c 7c 20 7a 57 68 65 72  Cols==0 || zWher
c1c0: 65 3d 3d 30 20 29 20 72 63 20 3d 20 53 51 4c 49  e==0 ) rc = SQLI
c1d0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7a 43  TE_NOMEM;.    zC
c1e0: 6f 6d 20 3d 20 22 2c 20 22 3b 0a 20 20 20 20 7a  om = ", ";.    z
c1f0: 41 6e 64 20 3d 20 22 20 41 4e 44 20 22 3b 0a 20  And = " AND ";. 
c200: 20 20 20 6e 42 69 6e 64 2b 2b 3b 0a 20 20 7d 0a     nBind++;.  }.
c210: 0a 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33  .  rc2 = sqlite3
c220: 5f 66 69 6e 61 6c 69 7a 65 28 70 58 49 6e 66 6f  _finalize(pXInfo
c230: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
c240: 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63  ITE_OK ) rc = rc
c250: 32 3b 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51  2;..  if( rc!=SQ
c260: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
c270: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 52 65 74  qlite3_free(zRet
c280: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
c290: 72 65 65 28 7a 49 6d 70 43 6f 6c 73 29 3b 0a 20  ree(zImpCols);. 
c2a0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
c2b0: 7a 49 6d 70 50 4b 29 3b 0a 20 20 20 20 73 71 6c  zImpPK);.    sql
c2c0: 69 74 65 33 5f 66 72 65 65 28 7a 57 68 65 72 65  ite3_free(zWhere
c2d0: 29 3b 0a 20 20 20 20 7a 52 65 74 20 3d 20 30 3b  );.    zRet = 0;
c2e0: 0a 20 20 20 20 7a 49 6d 70 43 6f 6c 73 20 3d 20  .    zImpCols = 
c2f0: 30 3b 0a 20 20 20 20 7a 49 6d 70 50 4b 20 3d 20  0;.    zImpPK = 
c300: 30 3b 0a 20 20 20 20 7a 57 68 65 72 65 20 3d 20  0;.    zWhere = 
c310: 30 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 72  0;.    p->rc = r
c320: 63 3b 0a 20 20 7d 0a 0a 20 20 2a 70 7a 49 6d 70  c;.  }..  *pzImp
c330: 6f 73 74 65 72 43 6f 6c 73 20 3d 20 7a 49 6d 70  osterCols = zImp
c340: 43 6f 6c 73 3b 0a 20 20 2a 70 7a 49 6d 70 6f 73  Cols;.  *pzImpos
c350: 74 65 72 50 6b 20 3d 20 7a 49 6d 70 50 4b 3b 0a  terPk = zImpPK;.
c360: 20 20 2a 70 7a 57 68 65 72 65 20 3d 20 7a 57 68    *pzWhere = zWh
c370: 65 72 65 3b 0a 20 20 2a 70 6e 42 69 6e 64 20 3d  ere;.  *pnBind =
c380: 20 6e 42 69 6e 64 3b 0a 20 20 72 65 74 75 72 6e   nBind;.  return
c390: 20 7a 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   zRet;.}../*.** 
c3a0: 41 73 73 75 6d 69 6e 67 20 74 68 65 20 63 75 72  Assuming the cur
c3b0: 72 65 6e 74 20 74 61 62 6c 65 20 63 6f 6c 75 6d  rent table colum
c3c0: 6e 73 20 61 72 65 20 22 61 22 2c 20 22 62 22 20  ns are "a", "b" 
c3d0: 61 6e 64 20 22 63 22 2c 20 61 6e 64 20 74 68 65  and "c", and the
c3e0: 20 7a 4f 62 6a 0a 2a 2a 20 70 61 72 61 6d 74 65   zObj.** paramte
c3f0: 72 20 69 73 20 70 61 73 73 65 64 20 22 6f 6c 64  r is passed "old
c400: 22 2c 20 72 65 74 75 72 6e 20 61 20 73 74 72 69  ", return a stri
c410: 6e 67 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  ng of the form:.
c420: 2a 2a 0a 2a 2a 20 20 20 20 20 22 6f 6c 64 2e 61  **.**     "old.a
c430: 2c 20 6f 6c 64 2e 62 2c 20 6f 6c 64 2e 62 22 0a  , old.b, old.b".
c440: 2a 2a 0a 2a 2a 20 57 69 74 68 20 74 68 65 20 63  **.** With the c
c450: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 65 73 63 61  olumn names esca
c460: 70 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74  ped..**.** For t
c470: 61 62 6c 65 73 20 77 69 74 68 20 69 6d 70 6c 69  ables with impli
c480: 63 69 74 20 72 6f 77 69 64 73 20 2d 20 52 42 55  cit rowids - RBU
c490: 5f 50 4b 5f 45 58 54 45 52 4e 41 4c 20 61 6e 64  _PK_EXTERNAL and
c4a0: 20 52 42 55 5f 50 4b 5f 4e 4f 4e 45 2c 20 61 70   RBU_PK_NONE, ap
c4b0: 70 65 6e 64 0a 2a 2a 20 74 68 65 20 74 65 78 74  pend.** the text
c4c0: 20 22 2c 20 6f 6c 64 2e 5f 72 6f 77 69 64 5f 22   ", old._rowid_"
c4d0: 20 74 6f 20 74 68 65 20 72 65 74 75 72 6e 65 64   to the returned
c4e0: 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69   value..*/.stati
c4f0: 63 20 63 68 61 72 20 2a 72 62 75 4f 62 6a 49 74  c char *rbuObjIt
c500: 65 72 47 65 74 4f 6c 64 6c 69 73 74 28 0a 20 20  erGetOldlist(.  
c510: 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 0a  sqlite3rbu *p, .
c520: 20 20 52 62 75 4f 62 6a 49 74 65 72 20 2a 70 49    RbuObjIter *pI
c530: 74 65 72 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  ter,.  const cha
c540: 72 20 2a 7a 4f 62 6a 0a 29 7b 0a 20 20 63 68 61  r *zObj.){.  cha
c550: 72 20 2a 7a 4c 69 73 74 20 3d 20 30 3b 0a 20 20  r *zList = 0;.  
c560: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
c570: 45 5f 4f 4b 20 26 26 20 70 49 74 65 72 2d 3e 61  E_OK && pIter->a
c580: 62 49 6e 64 65 78 65 64 20 29 7b 0a 20 20 20 20  bIndexed ){.    
c590: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 20 3d  const char *zS =
c5a0: 20 22 22 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a   "";.    int i;.
c5b0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
c5c0: 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 3b 20 69  Iter->nTblCol; i
c5d0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
c5e0: 49 74 65 72 2d 3e 61 62 49 6e 64 65 78 65 64 5b  Iter->abIndexed[
c5f0: 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  i] ){.        co
c600: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 20 3d  nst char *zCol =
c610: 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c   pIter->azTblCol
c620: 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 7a 4c 69  [i];.        zLi
c630: 73 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  st = sqlite3_mpr
c640: 69 6e 74 66 28 22 25 7a 25 73 25 73 2e 5c 22 25  intf("%z%s%s.\"%
c650: 77 5c 22 22 2c 20 7a 4c 69 73 74 2c 20 7a 53 2c  w\"", zList, zS,
c660: 20 7a 4f 62 6a 2c 20 7a 43 6f 6c 29 3b 0a 20 20   zObj, zCol);.  
c670: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c680: 20 20 20 7a 4c 69 73 74 20 3d 20 73 71 6c 69 74     zList = sqlit
c690: 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a 25 73  e3_mprintf("%z%s
c6a0: 4e 55 4c 4c 22 2c 20 7a 4c 69 73 74 2c 20 7a 53  NULL", zList, zS
c6b0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
c6c0: 20 7a 53 20 3d 20 22 2c 20 22 3b 0a 20 20 20 20   zS = ", ";.    
c6d0: 20 20 69 66 28 20 7a 4c 69 73 74 3d 3d 30 20 29    if( zList==0 )
c6e0: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20  {.        p->rc 
c6f0: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
c700: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
c710: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
c720: 20 20 2f 2a 20 46 6f 72 20 61 20 74 61 62 6c 65    /* For a table
c730: 20 77 69 74 68 20 69 6d 70 6c 69 63 69 74 20 72   with implicit r
c740: 6f 77 69 64 73 2c 20 61 70 70 65 6e 64 20 22 6f  owids, append "o
c750: 6c 64 2e 5f 72 6f 77 69 64 5f 22 20 74 6f 20 74  ld._rowid_" to t
c760: 68 65 20 6c 69 73 74 2e 20 2a 2f 0a 20 20 20 20  he list. */.    
c770: 69 66 28 20 70 49 74 65 72 2d 3e 65 54 79 70 65  if( pIter->eType
c780: 3d 3d 52 42 55 5f 50 4b 5f 45 58 54 45 52 4e 41  ==RBU_PK_EXTERNA
c790: 4c 20 7c 7c 20 70 49 74 65 72 2d 3e 65 54 79 70  L || pIter->eTyp
c7a0: 65 3d 3d 52 42 55 5f 50 4b 5f 4e 4f 4e 45 20 29  e==RBU_PK_NONE )
c7b0: 7b 0a 20 20 20 20 20 20 7a 4c 69 73 74 20 3d 20  {.      zList = 
c7c0: 72 62 75 4d 50 72 69 6e 74 66 28 70 2c 20 22 25  rbuMPrintf(p, "%
c7d0: 7a 2c 20 25 73 2e 5f 72 6f 77 69 64 5f 22 2c 20  z, %s._rowid_", 
c7e0: 7a 4c 69 73 74 2c 20 7a 4f 62 6a 29 3b 0a 20 20  zList, zObj);.  
c7f0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
c800: 20 7a 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   zList;.}../*.**
c810: 20 52 65 74 75 72 6e 20 61 6e 20 65 78 70 72 65   Return an expre
c820: 73 73 69 6f 6e 20 74 68 61 74 20 63 61 6e 20 62  ssion that can b
c830: 65 20 75 73 65 64 20 69 6e 20 61 20 57 48 45 52  e used in a WHER
c840: 45 20 63 6c 61 75 73 65 20 74 6f 20 6d 61 74 63  E clause to matc
c850: 68 20 74 68 65 0a 2a 2a 20 70 72 69 6d 61 72 79  h the.** primary
c860: 20 6b 65 79 20 6f 66 20 74 68 65 20 63 75 72 72   key of the curr
c870: 65 6e 74 20 74 61 62 6c 65 2e 20 46 6f 72 20 65  ent table. For e
c880: 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 74  xample, if the t
c890: 61 62 6c 65 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  able is:.**.**  
c8a0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
c8b0: 28 61 2c 20 62 2c 20 63 2c 20 50 52 49 4d 41 52  (a, b, c, PRIMAR
c8c0: 59 20 4b 45 59 28 62 2c 20 63 29 29 3b 0a 2a 2a  Y KEY(b, c));.**
c8d0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
c8e0: 74 72 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 22  tring:.**.**   "
c8f0: 62 20 3d 20 3f 31 20 41 4e 44 20 63 20 3d 20 3f  b = ?1 AND c = ?
c900: 32 22 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  2".*/.static cha
c910: 72 20 2a 72 62 75 4f 62 6a 49 74 65 72 47 65 74  r *rbuObjIterGet
c920: 57 68 65 72 65 28 0a 20 20 73 71 6c 69 74 65 33  Where(.  sqlite3
c930: 72 62 75 20 2a 70 2c 20 0a 20 20 52 62 75 4f 62  rbu *p, .  RbuOb
c940: 6a 49 74 65 72 20 2a 70 49 74 65 72 0a 29 7b 0a  jIter *pIter.){.
c950: 20 20 63 68 61 72 20 2a 7a 4c 69 73 74 20 3d 20    char *zList = 
c960: 30 3b 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e  0;.  if( pIter->
c970: 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 56 54  eType==RBU_PK_VT
c980: 41 42 20 7c 7c 20 70 49 74 65 72 2d 3e 65 54 79  AB || pIter->eTy
c990: 70 65 3d 3d 52 42 55 5f 50 4b 5f 4e 4f 4e 45 20  pe==RBU_PK_NONE 
c9a0: 29 7b 0a 20 20 20 20 7a 4c 69 73 74 20 3d 20 72  ){.    zList = r
c9b0: 62 75 4d 50 72 69 6e 74 66 28 70 2c 20 22 5f 72  buMPrintf(p, "_r
c9c0: 6f 77 69 64 5f 20 3d 20 3f 25 64 22 2c 20 70 49  owid_ = ?%d", pI
c9d0: 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 2b 31 29 3b  ter->nTblCol+1);
c9e0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 49 74  .  }else if( pIt
c9f0: 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50  er->eType==RBU_P
ca00: 4b 5f 45 58 54 45 52 4e 41 4c 20 29 7b 0a 20 20  K_EXTERNAL ){.  
ca10: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
ca20: 65 70 20 3d 20 22 22 3b 0a 20 20 20 20 69 6e 74  ep = "";.    int
ca30: 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
ca40: 20 69 3c 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f   i<pIter->nTblCo
ca50: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  l; i++){.      i
ca60: 66 28 20 70 49 74 65 72 2d 3e 61 62 54 62 6c 50  f( pIter->abTblP
ca70: 6b 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  k[i] ){.        
ca80: 7a 4c 69 73 74 20 3d 20 72 62 75 4d 50 72 69 6e  zList = rbuMPrin
ca90: 74 66 28 70 2c 20 22 25 7a 25 73 63 25 64 3d 3f  tf(p, "%z%sc%d=?
caa0: 25 64 22 2c 20 7a 4c 69 73 74 2c 20 7a 53 65 70  %d", zList, zSep
cab0: 2c 20 69 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20  , i, i+1);.     
cac0: 20 20 20 7a 53 65 70 20 3d 20 22 20 41 4e 44 20     zSep = " AND 
cad0: 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ";.      }.    }
cae0: 0a 20 20 20 20 7a 4c 69 73 74 20 3d 20 72 62 75  .    zList = rbu
caf0: 4d 50 72 69 6e 74 66 28 70 2c 20 0a 20 20 20 20  MPrintf(p, .    
cb00: 20 20 20 20 22 5f 72 6f 77 69 64 5f 20 3d 20 28      "_rowid_ = (
cb10: 53 45 4c 45 43 54 20 69 64 20 46 52 4f 4d 20 72  SELECT id FROM r
cb20: 62 75 5f 69 6d 70 6f 73 74 65 72 32 20 57 48 45  bu_imposter2 WHE
cb30: 52 45 20 25 7a 29 22 2c 20 7a 4c 69 73 74 0a 20  RE %z)", zList. 
cb40: 20 20 20 29 3b 0a 0a 20 20 7d 65 6c 73 65 7b 0a     );..  }else{.
cb50: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
cb60: 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20 20 20 69  zSep = "";.    i
cb70: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
cb80: 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 54 62 6c  0; i<pIter->nTbl
cb90: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
cba0: 20 69 66 28 20 70 49 74 65 72 2d 3e 61 62 54 62   if( pIter->abTb
cbb0: 6c 50 6b 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20  lPk[i] ){.      
cbc0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
cbd0: 6f 6c 20 3d 20 70 49 74 65 72 2d 3e 61 7a 54 62  ol = pIter->azTb
cbe0: 6c 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20  lCol[i];.       
cbf0: 20 7a 4c 69 73 74 20 3d 20 72 62 75 4d 50 72 69   zList = rbuMPri
cc00: 6e 74 66 28 70 2c 20 22 25 7a 25 73 5c 22 25 77  ntf(p, "%z%s\"%w
cc10: 5c 22 3d 3f 25 64 22 2c 20 7a 4c 69 73 74 2c 20  \"=?%d", zList, 
cc20: 7a 53 65 70 2c 20 7a 43 6f 6c 2c 20 69 2b 31 29  zSep, zCol, i+1)
cc30: 3b 0a 20 20 20 20 20 20 20 20 7a 53 65 70 20 3d  ;.        zSep =
cc40: 20 22 20 41 4e 44 20 22 3b 0a 20 20 20 20 20 20   " AND ";.      
cc50: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
cc60: 74 75 72 6e 20 7a 4c 69 73 74 3b 0a 7d 0a 0a 2f  turn zList;.}../
cc70: 2a 0a 2a 2a 20 54 68 65 20 53 45 4c 45 43 54 20  *.** The SELECT 
cc80: 73 74 61 74 65 6d 65 6e 74 20 69 74 65 72 61 74  statement iterat
cc90: 69 6e 67 20 74 68 72 6f 75 67 68 20 74 68 65 20  ing through the 
cca0: 6b 65 79 73 20 66 6f 72 20 74 68 65 20 63 75 72  keys for the cur
ccb0: 72 65 6e 74 20 6f 62 6a 65 63 74 0a 2a 2a 20 28  rent object.** (
ccc0: 70 2d 3e 6f 62 6a 69 74 65 72 2e 70 53 65 6c 65  p->objiter.pSele
ccd0: 63 74 29 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  ct) currently po
cce0: 69 6e 74 73 20 74 6f 20 61 20 76 61 6c 69 64 20  ints to a valid 
ccf0: 72 6f 77 2e 20 48 6f 77 65 76 65 72 2c 20 74 68  row. However, th
cd00: 65 72 65 0a 2a 2a 20 69 73 20 73 6f 6d 65 74 68  ere.** is someth
cd10: 69 6e 67 20 77 72 6f 6e 67 20 77 69 74 68 20 74  ing wrong with t
cd20: 68 65 20 72 62 75 5f 63 6f 6e 74 72 6f 6c 20 76  he rbu_control v
cd30: 61 6c 75 65 20 69 6e 20 74 68 65 20 72 62 75 5f  alue in the rbu_
cd40: 63 6f 6e 74 72 6f 6c 20 76 61 6c 75 65 0a 2a 2a  control value.**
cd50: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 28   stored in the (
cd60: 70 2d 3e 6e 43 6f 6c 2b 31 29 27 74 68 20 63 6f  p->nCol+1)'th co
cd70: 6c 75 6d 6e 2e 20 53 65 74 20 74 68 65 20 65 72  lumn. Set the er
cd80: 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 65 72 72  ror code and err
cd90: 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 6f 66  or message.** of
cda0: 20 74 68 65 20 52 42 55 20 68 61 6e 64 6c 65 20   the RBU handle 
cdb0: 74 6f 20 73 6f 6d 65 74 68 69 6e 67 20 72 65 66  to something ref
cdc0: 6c 65 63 74 69 6e 67 20 74 68 69 73 2e 0a 2a 2f  lecting this..*/
cdd0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75  .static void rbu
cde0: 42 61 64 43 6f 6e 74 72 6f 6c 45 72 72 6f 72 28  BadControlError(
cdf0: 73 71 6c 69 74 65 33 72 62 75 20 2a 70 29 7b 0a  sqlite3rbu *p){.
ce00: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
ce10: 5f 45 52 52 4f 52 3b 0a 20 20 70 2d 3e 7a 45 72  _ERROR;.  p->zEr
ce20: 72 6d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  rmsg = sqlite3_m
ce30: 70 72 69 6e 74 66 28 22 69 6e 76 61 6c 69 64 20  printf("invalid 
ce40: 72 62 75 5f 63 6f 6e 74 72 6f 6c 20 76 61 6c 75  rbu_control valu
ce50: 65 22 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52  e");.}.../*.** R
ce60: 65 74 75 72 6e 20 61 20 6e 75 6c 2d 74 65 72 6d  eturn a nul-term
ce70: 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20 63 6f  inated string co
ce80: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 6f 6d  ntaining the com
ce90: 6d 61 20 73 65 70 61 72 61 74 65 64 20 6c 69 73  ma separated lis
cea0: 74 20 6f 66 0a 2a 2a 20 61 73 73 69 67 6e 6d 65  t of.** assignme
ceb0: 6e 74 73 20 74 68 61 74 20 73 68 6f 75 6c 64 20  nts that should 
cec0: 62 65 20 69 6e 63 6c 75 64 65 64 20 66 6f 6c 6c  be included foll
ced0: 6f 77 69 6e 67 20 74 68 65 20 22 53 45 54 22 20  owing the "SET" 
cee0: 6b 65 79 77 6f 72 64 20 6f 66 0a 2a 2a 20 61 6e  keyword of.** an
cef0: 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e   UPDATE statemen
cf00: 74 20 75 73 65 64 20 74 6f 20 75 70 64 61 74 65  t used to update
cf10: 20 74 68 65 20 74 61 62 6c 65 20 6f 62 6a 65 63   the table objec
cf20: 74 20 74 68 61 74 20 74 68 65 20 69 74 65 72 61  t that the itera
cf30: 74 6f 72 0a 2a 2a 20 70 61 73 73 65 64 20 61 73  tor.** passed as
cf40: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
cf50: 6d 65 6e 74 20 63 75 72 72 65 6e 74 6c 79 20 70  ment currently p
cf60: 6f 69 6e 74 73 20 74 6f 20 69 66 20 74 68 65 20  oints to if the 
cf70: 72 62 75 5f 63 6f 6e 74 72 6f 6c 0a 2a 2a 20 63  rbu_control.** c
cf80: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 64 61 74  olumn of the dat
cf90: 61 5f 78 78 78 20 74 61 62 6c 65 20 65 6e 74 72  a_xxx table entr
cfa0: 79 20 69 73 20 73 65 74 20 74 6f 20 7a 4d 61 73  y is set to zMas
cfb0: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 65 6d  k..**.** The mem
cfc0: 6f 72 79 20 66 6f 72 20 74 68 65 20 72 65 74 75  ory for the retu
cfd0: 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f  rned string is o
cfe0: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
cff0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a  ite3_malloc()..*
d000: 2a 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70  * It is the resp
d010: 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
d020: 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e  e caller to even
d030: 74 75 61 6c 6c 79 20 66 72 65 65 20 69 74 20 75  tually free it u
d040: 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  sing.** sqlite3_
d050: 66 72 65 65 28 29 2e 20 0a 2a 2a 0a 2a 2a 20 49  free(). .**.** I
d060: 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 69  f an OOM error i
d070: 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 77 68  s encountered wh
d080: 65 6e 20 61 6c 6c 6f 63 61 74 69 6e 67 20 73 70  en allocating sp
d090: 61 63 65 20 66 6f 72 20 74 68 65 20 6e 65 77 0a  ace for the new.
d0a0: 2a 2a 20 73 74 72 69 6e 67 2c 20 61 6e 20 65 72  ** string, an er
d0b0: 72 6f 72 20 63 6f 64 65 20 69 73 20 6c 65 66 74  ror code is left
d0c0: 20 69 6e 20 74 68 65 20 72 62 75 20 68 61 6e 64   in the rbu hand
d0d0: 6c 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  le passed as the
d0e0: 20 66 69 72 73 74 0a 2a 2a 20 61 72 67 75 6d 65   first.** argume
d0f0: 6e 74 20 61 6e 64 20 4e 55 4c 4c 20 69 73 20 72  nt and NULL is r
d100: 65 74 75 72 6e 65 64 2e 20 4f 72 2c 20 69 66 20  eturned. Or, if 
d110: 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72  an error has alr
d120: 65 61 64 79 20 6f 63 63 75 72 72 65 64 0a 2a 2a  eady occurred.**
d130: 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
d140: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 4e  ion is called, N
d150: 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20  ULL is returned 
d160: 69 6d 6d 65 64 69 61 74 65 6c 79 2c 20 77 69 74  immediately, wit
d170: 68 6f 75 74 0a 2a 2a 20 61 74 74 65 6d 70 74 69  hout.** attempti
d180: 6e 67 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f  ng the allocatio
d190: 6e 20 6f 72 20 6d 6f 64 69 66 79 69 6e 67 20 74  n or modifying t
d1a0: 68 65 20 73 74 6f 72 65 64 20 65 72 72 6f 72 20  he stored error 
d1b0: 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  code..*/.static 
d1c0: 63 68 61 72 20 2a 72 62 75 4f 62 6a 49 74 65 72  char *rbuObjIter
d1d0: 47 65 74 53 65 74 6c 69 73 74 28 0a 20 20 73 71  GetSetlist(.  sq
d1e0: 6c 69 74 65 33 72 62 75 20 2a 70 2c 0a 20 20 52  lite3rbu *p,.  R
d1f0: 62 75 4f 62 6a 49 74 65 72 20 2a 70 49 74 65 72  buObjIter *pIter
d200: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
d210: 7a 4d 61 73 6b 0a 29 7b 0a 20 20 63 68 61 72 20  zMask.){.  char 
d220: 2a 7a 4c 69 73 74 20 3d 20 30 3b 0a 20 20 69 66  *zList = 0;.  if
d230: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
d240: 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  OK ){.    int i;
d250: 0a 0a 20 20 20 20 69 66 28 20 28 69 6e 74 29 73  ..    if( (int)s
d260: 74 72 6c 65 6e 28 7a 4d 61 73 6b 29 21 3d 70 49  trlen(zMask)!=pI
d270: 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 20 29 7b 0a  ter->nTblCol ){.
d280: 20 20 20 20 20 20 72 62 75 42 61 64 43 6f 6e 74        rbuBadCont
d290: 72 6f 6c 45 72 72 6f 72 28 70 29 3b 0a 20 20 20  rolError(p);.   
d2a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f   }else{.      co
d2b0: 6e 73 74 20 63 68 61 72 20 2a 7a 53 65 70 20 3d  nst char *zSep =
d2c0: 20 22 22 3b 0a 20 20 20 20 20 20 66 6f 72 28 69   "";.      for(i
d2d0: 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 54 62  =0; i<pIter->nTb
d2e0: 6c 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lCol; i++){.    
d2f0: 20 20 20 20 63 68 61 72 20 63 20 3d 20 7a 4d 61      char c = zMa
d300: 73 6b 5b 70 49 74 65 72 2d 3e 61 69 53 72 63 4f  sk[pIter->aiSrcO
d310: 72 64 65 72 5b 69 5d 5d 3b 0a 20 20 20 20 20 20  rder[i]];.      
d320: 20 20 69 66 28 20 63 3d 3d 27 78 27 20 29 7b 0a    if( c=='x' ){.
d330: 20 20 20 20 20 20 20 20 20 20 7a 4c 69 73 74 20            zList 
d340: 3d 20 72 62 75 4d 50 72 69 6e 74 66 28 70 2c 20  = rbuMPrintf(p, 
d350: 22 25 7a 25 73 5c 22 25 77 5c 22 3d 3f 25 64 22  "%z%s\"%w\"=?%d"
d360: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
d370: 20 7a 4c 69 73 74 2c 20 7a 53 65 70 2c 20 70 49   zList, zSep, pI
d380: 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69 5d  ter->azTblCol[i]
d390: 2c 20 69 2b 31 0a 20 20 20 20 20 20 20 20 20 20  , i+1.          
d3a0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 53 65  );.          zSe
d3b0: 70 20 3d 20 22 2c 20 22 3b 0a 20 20 20 20 20 20  p = ", ";.      
d3c0: 20 20 7d 0a 20 20 20 20 20 20 20 20 65 6c 73 65    }.        else
d3d0: 20 69 66 28 20 63 3d 3d 27 64 27 20 29 7b 0a 20   if( c=='d' ){. 
d3e0: 20 20 20 20 20 20 20 20 20 7a 4c 69 73 74 20 3d           zList =
d3f0: 20 72 62 75 4d 50 72 69 6e 74 66 28 70 2c 20 22   rbuMPrintf(p, "
d400: 25 7a 25 73 5c 22 25 77 5c 22 3d 72 62 75 5f 64  %z%s\"%w\"=rbu_d
d410: 65 6c 74 61 28 5c 22 25 77 5c 22 2c 20 3f 25 64  elta(\"%w\", ?%d
d420: 29 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  )", .           
d430: 20 20 20 7a 4c 69 73 74 2c 20 7a 53 65 70 2c 20     zList, zSep, 
d440: 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b  pIter->azTblCol[
d450: 69 5d 2c 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c  i], pIter->azTbl
d460: 43 6f 6c 5b 69 5d 2c 20 69 2b 31 0a 20 20 20 20  Col[i], i+1.    
d470: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
d480: 20 20 20 7a 53 65 70 20 3d 20 22 2c 20 22 3b 0a     zSep = ", ";.
d490: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d4a0: 20 20 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 66    else if( c=='f
d4b0: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  ' ){.          z
d4c0: 4c 69 73 74 20 3d 20 72 62 75 4d 50 72 69 6e 74  List = rbuMPrint
d4d0: 66 28 70 2c 20 22 25 7a 25 73 5c 22 25 77 5c 22  f(p, "%z%s\"%w\"
d4e0: 3d 72 62 75 5f 66 6f 73 73 69 6c 5f 64 65 6c 74  =rbu_fossil_delt
d4f0: 61 28 5c 22 25 77 5c 22 2c 20 3f 25 64 29 22 2c  a(\"%w\", ?%d)",
d500: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
d510: 7a 4c 69 73 74 2c 20 7a 53 65 70 2c 20 70 49 74  zList, zSep, pIt
d520: 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69 5d 2c  er->azTblCol[i],
d530: 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c   pIter->azTblCol
d540: 5b 69 5d 2c 20 69 2b 31 0a 20 20 20 20 20 20 20  [i], i+1.       
d550: 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20     );.          
d560: 7a 53 65 70 20 3d 20 22 2c 20 22 3b 0a 20 20 20  zSep = ", ";.   
d570: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
d580: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
d590: 6e 20 7a 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  n zList;.}../*.*
d5a0: 2a 20 52 65 74 75 72 6e 20 61 20 6e 75 6c 2d 74  * Return a nul-t
d5b0: 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67  erminated string
d5c0: 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20 6e   consisting of n
d5d0: 42 79 74 65 20 63 6f 6d 6d 61 20 73 65 70 61 72  Byte comma separ
d5e0: 61 74 65 64 0a 2a 2a 20 22 3f 22 20 65 78 70 72  ated.** "?" expr
d5f0: 65 73 73 69 6f 6e 73 2e 20 46 6f 72 20 65 78 61  essions. For exa
d600: 6d 70 6c 65 2c 20 69 66 20 6e 42 79 74 65 20 69  mple, if nByte i
d610: 73 20 33 2c 20 72 65 74 75 72 6e 20 61 20 70 6f  s 3, return a po
d620: 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 61 20 62 75  inter to.** a bu
d630: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
d640: 74 68 65 20 73 74 72 69 6e 67 20 22 3f 2c 3f 2c  the string "?,?,
d650: 3f 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 65  ?"..**.** The me
d660: 6d 6f 72 79 20 66 6f 72 20 74 68 65 20 72 65 74  mory for the ret
d670: 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20  urned string is 
d680: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
d690: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a  lite3_malloc()..
d6a0: 2a 2a 20 49 74 20 69 73 20 74 68 65 20 72 65 73  ** It is the res
d6b0: 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
d6c0: 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65  he caller to eve
d6d0: 6e 74 75 61 6c 6c 79 20 66 72 65 65 20 69 74 20  ntually free it 
d6e0: 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33  using.** sqlite3
d6f0: 5f 66 72 65 65 28 29 2e 20 0a 2a 2a 0a 2a 2a 20  _free(). .**.** 
d700: 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20  If an OOM error 
d710: 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 77  is encountered w
d720: 68 65 6e 20 61 6c 6c 6f 63 61 74 69 6e 67 20 73  hen allocating s
d730: 70 61 63 65 20 66 6f 72 20 74 68 65 20 6e 65 77  pace for the new
d740: 0a 2a 2a 20 73 74 72 69 6e 67 2c 20 61 6e 20 65  .** string, an e
d750: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 6c 65 66  rror code is lef
d760: 74 20 69 6e 20 74 68 65 20 72 62 75 20 68 61 6e  t in the rbu han
d770: 64 6c 65 20 70 61 73 73 65 64 20 61 73 20 74 68  dle passed as th
d780: 65 20 66 69 72 73 74 0a 2a 2a 20 61 72 67 75 6d  e first.** argum
d790: 65 6e 74 20 61 6e 64 20 4e 55 4c 4c 20 69 73 20  ent and NULL is 
d7a0: 72 65 74 75 72 6e 65 64 2e 20 4f 72 2c 20 69 66  returned. Or, if
d7b0: 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61 6c   an error has al
d7c0: 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 0a 2a  ready occurred.*
d7d0: 2a 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  * when this func
d7e0: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
d7f0: 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
d800: 20 69 6d 6d 65 64 69 61 74 65 6c 79 2c 20 77 69   immediately, wi
d810: 74 68 6f 75 74 0a 2a 2a 20 61 74 74 65 6d 70 74  thout.** attempt
d820: 69 6e 67 20 74 68 65 20 61 6c 6c 6f 63 61 74 69  ing the allocati
d830: 6f 6e 20 6f 72 20 6d 6f 64 69 66 79 69 6e 67 20  on or modifying 
d840: 74 68 65 20 73 74 6f 72 65 64 20 65 72 72 6f 72  the stored error
d850: 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   code..*/.static
d860: 20 63 68 61 72 20 2a 72 62 75 4f 62 6a 49 74 65   char *rbuObjIte
d870: 72 47 65 74 42 69 6e 64 6c 69 73 74 28 73 71 6c  rGetBindlist(sql
d880: 69 74 65 33 72 62 75 20 2a 70 2c 20 69 6e 74 20  ite3rbu *p, int 
d890: 6e 42 69 6e 64 29 7b 0a 20 20 63 68 61 72 20 2a  nBind){.  char *
d8a0: 7a 52 65 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20  zRet = 0;.  int 
d8b0: 6e 42 79 74 65 20 3d 20 6e 42 69 6e 64 2a 32 20  nByte = nBind*2 
d8c0: 2b 20 31 3b 0a 0a 20 20 7a 52 65 74 20 3d 20 28  + 1;..  zRet = (
d8d0: 63 68 61 72 2a 29 72 62 75 4d 61 6c 6c 6f 63 28  char*)rbuMalloc(
d8e0: 70 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28  p, nByte);.  if(
d8f0: 20 7a 52 65 74 20 29 7b 0a 20 20 20 20 69 6e 74   zRet ){.    int
d900: 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
d910: 20 69 3c 6e 42 69 6e 64 3b 20 69 2b 2b 29 7b 0a   i<nBind; i++){.
d920: 20 20 20 20 20 20 7a 52 65 74 5b 69 2a 32 5d 20        zRet[i*2] 
d930: 3d 20 27 3f 27 3b 0a 20 20 20 20 20 20 7a 52 65  = '?';.      zRe
d940: 74 5b 69 2a 32 2b 31 5d 20 3d 20 28 69 2b 31 3d  t[i*2+1] = (i+1=
d950: 3d 6e 42 69 6e 64 29 20 3f 20 27 5c 30 27 20 3a  =nBind) ? '\0' :
d960: 20 27 2c 27 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   ',';.    }.  }.
d970: 20 20 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d    return zRet;.}
d980: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 74 65 72  ../*.** The iter
d990: 61 74 6f 72 20 63 75 72 72 65 6e 74 6c 79 20 70  ator currently p
d9a0: 6f 69 6e 74 73 20 74 6f 20 61 20 74 61 62 6c 65  oints to a table
d9b0: 20 28 6e 6f 74 20 69 6e 64 65 78 29 20 6f 66 20   (not index) of 
d9c0: 74 79 70 65 20 0a 2a 2a 20 52 42 55 5f 50 4b 5f  type .** RBU_PK_
d9d0: 57 49 54 48 4f 55 54 5f 52 4f 57 49 44 2e 20 54  WITHOUT_ROWID. T
d9e0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 72 65  his function cre
d9f0: 61 74 65 73 20 74 68 65 20 50 52 49 4d 41 52 59  ates the PRIMARY
da00: 20 4b 45 59 20 0a 2a 2a 20 64 65 63 6c 61 72 61   KEY .** declara
da10: 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 63 6f 72  tion for the cor
da20: 72 65 73 70 6f 6e 64 69 6e 67 20 69 6d 70 6f 73  responding impos
da30: 74 65 72 20 74 61 62 6c 65 2e 20 46 6f 72 20 65  ter table. For e
da40: 78 61 6d 70 6c 65 2c 0a 2a 2a 20 69 66 20 74 68  xample,.** if th
da50: 65 20 69 74 65 72 61 74 6f 72 20 70 6f 69 6e 74  e iterator point
da60: 73 20 74 6f 20 61 20 74 61 62 6c 65 20 63 72 65  s to a table cre
da70: 61 74 65 64 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20  ated as:.**.**  
da80: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
da90: 28 61 2c 20 62 2c 20 63 2c 20 50 52 49 4d 41 52  (a, b, c, PRIMAR
daa0: 59 20 4b 45 59 28 62 2c 20 61 20 44 45 53 43 29  Y KEY(b, a DESC)
dab0: 29 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 0a  ) WITHOUT ROWID.
dac0: 2a 2a 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74  **.** this funct
dad0: 69 6f 6e 20 72 65 74 75 72 6e 73 3a 0a 2a 2a 0a  ion returns:.**.
dae0: 2a 2a 20 20 20 50 52 49 4d 41 52 59 20 4b 45 59  **   PRIMARY KEY
daf0: 28 22 62 22 2c 20 22 61 22 20 44 45 53 43 29 0a  ("b", "a" DESC).
db00: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
db10: 72 62 75 57 69 74 68 6f 75 74 52 6f 77 69 64 50  rbuWithoutRowidP
db20: 4b 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c  K(sqlite3rbu *p,
db30: 20 52 62 75 4f 62 6a 49 74 65 72 20 2a 70 49 74   RbuObjIter *pIt
db40: 65 72 29 7b 0a 20 20 63 68 61 72 20 2a 7a 20 3d  er){.  char *z =
db50: 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49   0;.  assert( pI
db60: 74 65 72 2d 3e 7a 49 64 78 3d 3d 30 20 29 3b 0a  ter->zIdx==0 );.
db70: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
db80: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 6f  ITE_OK ){.    co
db90: 6e 73 74 20 63 68 61 72 20 2a 7a 53 65 70 20 3d  nst char *zSep =
dba0: 20 22 50 52 49 4d 41 52 59 20 4b 45 59 28 22 3b   "PRIMARY KEY(";
dbb0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  .    sqlite3_stm
dbc0: 74 20 2a 70 58 4c 69 73 74 20 3d 20 30 3b 20 20  t *pXList = 0;  
dbd0: 20 20 20 2f 2a 20 50 52 41 47 4d 41 20 69 6e 64     /* PRAGMA ind
dbe0: 65 78 5f 6c 69 73 74 20 3d 20 28 70 49 74 65 72  ex_list = (pIter
dbf0: 2d 3e 7a 54 62 6c 29 20 2a 2f 0a 20 20 20 20 73  ->zTbl) */.    s
dc00: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 58 49  qlite3_stmt *pXI
dc10: 6e 66 6f 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  nfo = 0;     /* 
dc20: 50 52 41 47 4d 41 20 69 6e 64 65 78 5f 78 69 6e  PRAGMA index_xin
dc30: 66 6f 20 3d 20 3c 70 6b 2d 69 6e 64 65 78 3e 20  fo = <pk-index> 
dc40: 2a 2f 0a 20 20 20 0a 20 20 20 20 70 2d 3e 72 63  */.   .    p->rc
dc50: 20 3d 20 70 72 65 70 61 72 65 46 72 65 65 41 6e   = prepareFreeAn
dc60: 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d  dCollectError(p-
dc70: 3e 64 62 4d 61 69 6e 2c 20 26 70 58 4c 69 73 74  >dbMain, &pXList
dc80: 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 0a 20  , &p->zErrmsg,. 
dc90: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d         sqlite3_m
dca0: 70 72 69 6e 74 66 28 22 50 52 41 47 4d 41 20 6d  printf("PRAGMA m
dcb0: 61 69 6e 2e 69 6e 64 65 78 5f 6c 69 73 74 20 3d  ain.index_list =
dcc0: 20 25 51 22 2c 20 70 49 74 65 72 2d 3e 7a 54 62   %Q", pIter->zTb
dcd0: 6c 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 77 68  l).    );.    wh
dce0: 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ile( p->rc==SQLI
dcf0: 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f  TE_OK && SQLITE_
dd00: 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW==sqlite3_ste
dd10: 70 28 70 58 4c 69 73 74 29 20 29 7b 0a 20 20 20  p(pXList) ){.   
dd20: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
dd30: 4f 72 69 67 20 3d 20 28 63 6f 6e 73 74 20 63 68  Orig = (const ch
dd40: 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
dd50: 6d 6e 5f 74 65 78 74 28 70 58 4c 69 73 74 2c 33  mn_text(pXList,3
dd60: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 4f 72  );.      if( zOr
dd70: 69 67 20 26 26 20 73 74 72 63 6d 70 28 7a 4f 72  ig && strcmp(zOr
dd80: 69 67 2c 20 22 70 6b 22 29 3d 3d 30 20 29 7b 0a  ig, "pk")==0 ){.
dd90: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
dda0: 61 72 20 2a 7a 49 64 78 20 3d 20 28 63 6f 6e 73  ar *zIdx = (cons
ddb0: 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
ddc0: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 58 4c 69  column_text(pXLi
ddd0: 73 74 2c 31 29 3b 0a 20 20 20 20 20 20 20 20 69  st,1);.        i
dde0: 66 28 20 7a 49 64 78 20 29 7b 0a 20 20 20 20 20  f( zIdx ){.     
ddf0: 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 72 65       p->rc = pre
de00: 70 61 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65  pareFreeAndColle
de10: 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 4d 61 69  ctError(p->dbMai
de20: 6e 2c 20 26 70 58 49 6e 66 6f 2c 20 26 70 2d 3e  n, &pXInfo, &p->
de30: 7a 45 72 72 6d 73 67 2c 0a 20 20 20 20 20 20 20  zErrmsg,.       
de40: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d         sqlite3_m
de50: 70 72 69 6e 74 66 28 22 50 52 41 47 4d 41 20 6d  printf("PRAGMA m
de60: 61 69 6e 2e 69 6e 64 65 78 5f 78 69 6e 66 6f 20  ain.index_xinfo 
de70: 3d 20 25 51 22 2c 20 7a 49 64 78 29 0a 20 20 20  = %Q", zIdx).   
de80: 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
de90: 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
dea0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
deb0: 0a 20 20 20 20 72 62 75 46 69 6e 61 6c 69 7a 65  .    rbuFinalize
dec0: 28 70 2c 20 70 58 4c 69 73 74 29 3b 0a 0a 20 20  (p, pXList);..  
ded0: 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d    while( p->rc==
dee0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c  SQLITE_OK && SQL
def0: 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
df00: 5f 73 74 65 70 28 70 58 49 6e 66 6f 29 20 29 7b  _step(pXInfo) ){
df10: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
df20: 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 58  e3_column_int(pX
df30: 49 6e 66 6f 2c 20 35 29 20 29 7b 0a 20 20 20 20  Info, 5) ){.    
df40: 20 20 20 20 2f 2a 20 69 6e 74 20 69 43 69 64 20      /* int iCid 
df50: 3d 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 30 29 3b  _int(pXInfo, 0);
df70: 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 73   */.        cons
df80: 74 20 63 68 61 72 20 2a 7a 43 6f 6c 20 3d 20 28  t char *zCol = (
df90: 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
dfa0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
dfb0: 70 58 49 6e 66 6f 2c 20 32 29 3b 0a 20 20 20 20  pXInfo, 2);.    
dfc0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
dfd0: 7a 44 65 73 63 20 3d 20 73 71 6c 69 74 65 33 5f  zDesc = sqlite3_
dfe0: 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 58 49 6e 66  column_int(pXInf
dff0: 6f 2c 20 33 29 20 3f 20 22 20 44 45 53 43 22 20  o, 3) ? " DESC" 
e000: 3a 20 22 22 3b 0a 20 20 20 20 20 20 20 20 7a 20  : "";.        z 
e010: 3d 20 72 62 75 4d 50 72 69 6e 74 66 28 70 2c 20  = rbuMPrintf(p, 
e020: 22 25 7a 25 73 5c 22 25 77 5c 22 25 73 22 2c 20  "%z%s\"%w\"%s", 
e030: 7a 2c 20 7a 53 65 70 2c 20 7a 43 6f 6c 2c 20 7a  z, zSep, zCol, z
e040: 44 65 73 63 29 3b 0a 20 20 20 20 20 20 20 20 7a  Desc);.        z
e050: 53 65 70 20 3d 20 22 2c 20 22 3b 0a 20 20 20 20  Sep = ", ";.    
e060: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 20    }.    }.    z 
e070: 3d 20 72 62 75 4d 50 72 69 6e 74 66 28 70 2c 20  = rbuMPrintf(p, 
e080: 22 25 7a 29 22 2c 20 7a 29 3b 0a 20 20 20 20 72  "%z)", z);.    r
e090: 62 75 46 69 6e 61 6c 69 7a 65 28 70 2c 20 70 58  buFinalize(p, pX
e0a0: 49 6e 66 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Info);.  }.  ret
e0b0: 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn z;.}../*.** 
e0c0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 72  This function cr
e0d0: 65 61 74 65 73 20 74 68 65 20 73 65 63 6f 6e 64  eates the second
e0e0: 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 20   imposter table 
e0f0: 75 73 65 64 20 77 68 65 6e 20 77 72 69 74 69 6e  used when writin
e100: 67 20 74 6f 0a 2a 2a 20 61 20 74 61 62 6c 65 20  g to.** a table 
e110: 62 2d 74 72 65 65 20 77 68 65 72 65 20 74 68 65  b-tree where the
e120: 20 74 61 62 6c 65 20 68 61 73 20 61 6e 20 65 78   table has an ex
e130: 74 65 72 6e 61 6c 20 70 72 69 6d 61 72 79 20 6b  ternal primary k
e140: 65 79 2e 20 49 66 20 74 68 65 0a 2a 2a 20 69 74  ey. If the.** it
e150: 65 72 61 74 6f 72 20 70 61 73 73 65 64 20 61 73  erator passed as
e160: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
e170: 6d 65 6e 74 20 64 6f 65 73 20 6e 6f 74 20 63 75  ment does not cu
e180: 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 20 74 6f  rrently point to
e190: 0a 2a 2a 20 61 20 74 61 62 6c 65 20 28 6e 6f 74  .** a table (not
e1a0: 20 69 6e 64 65 78 29 20 77 69 74 68 20 61 6e 20   index) with an 
e1b0: 65 78 74 65 72 6e 61 6c 20 70 72 69 6d 61 72 79  external primary
e1c0: 20 6b 65 79 2c 20 74 68 69 73 20 66 75 6e 63 74   key, this funct
e1d0: 69 6f 6e 20 69 73 20 61 0a 2a 2a 20 6e 6f 2d 6f  ion is a.** no-o
e1e0: 70 2e 20 0a 2a 2a 0a 2a 2a 20 41 73 73 75 6d 69  p. .**.** Assumi
e1f0: 6e 67 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  ng the iterator 
e200: 64 6f 65 73 20 70 6f 69 6e 74 20 74 6f 20 61 20  does point to a 
e210: 74 61 62 6c 65 20 77 69 74 68 20 61 6e 20 65 78  table with an ex
e220: 74 65 72 6e 61 6c 20 50 4b 2c 20 74 68 69 73 0a  ternal PK, this.
e230: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 63 72 65 61  ** function crea
e240: 74 65 73 20 61 20 57 49 54 48 4f 55 54 20 52 4f  tes a WITHOUT RO
e250: 57 49 44 20 69 6d 70 6f 73 74 65 72 20 74 61 62  WID imposter tab
e260: 6c 65 20 6e 61 6d 65 64 20 22 72 62 75 5f 69 6d  le named "rbu_im
e270: 70 6f 73 74 65 72 32 22 0a 2a 2a 20 75 73 65 64  poster2".** used
e280: 20 74 6f 20 61 63 63 65 73 73 20 74 68 61 74 20   to access that 
e290: 50 4b 20 69 6e 64 65 78 2e 20 46 6f 72 20 65 78  PK index. For ex
e2a0: 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 74 61  ample, if the ta
e2b0: 72 67 65 74 20 74 61 62 6c 65 20 69 73 0a 2a 2a  rget table is.**
e2c0: 20 64 65 63 6c 61 72 65 64 20 61 73 20 66 6f 6c   declared as fol
e2d0: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52  lows:.**.**   CR
e2e0: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
e2f0: 20 62 20 54 45 58 54 2c 20 63 20 52 45 41 4c 2c   b TEXT, c REAL,
e300: 20 50 52 49 4d 41 52 59 20 4b 45 59 28 62 2c 20   PRIMARY KEY(b, 
e310: 63 29 29 3b 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20  c));.**.** then 
e320: 74 68 65 20 69 6d 70 6f 73 74 65 72 20 74 61 62  the imposter tab
e330: 6c 65 20 73 63 68 65 6d 61 20 69 73 3a 0a 2a 2a  le schema is:.**
e340: 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42  .**   CREATE TAB
e350: 4c 45 20 72 62 75 5f 69 6d 70 6f 73 74 65 72 32  LE rbu_imposter2
e360: 28 63 31 20 54 45 58 54 2c 20 63 32 20 52 45 41  (c1 TEXT, c2 REA
e370: 4c 2c 20 69 64 20 49 4e 54 45 47 45 52 29 20 57  L, id INTEGER) W
e380: 49 54 48 4f 55 54 20 52 4f 57 49 44 3b 0a 2a 2a  ITHOUT ROWID;.**
e390: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
e3a0: 72 62 75 43 72 65 61 74 65 49 6d 70 6f 73 74 65  rbuCreateImposte
e3b0: 72 54 61 62 6c 65 32 28 73 71 6c 69 74 65 33 72  rTable2(sqlite3r
e3c0: 62 75 20 2a 70 2c 20 52 62 75 4f 62 6a 49 74 65  bu *p, RbuObjIte
e3d0: 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28  r *pIter){.  if(
e3e0: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
e3f0: 4b 20 26 26 20 70 49 74 65 72 2d 3e 65 54 79 70  K && pIter->eTyp
e400: 65 3d 3d 52 42 55 5f 50 4b 5f 45 58 54 45 52 4e  e==RBU_PK_EXTERN
e410: 41 4c 20 29 7b 0a 20 20 20 20 69 6e 74 20 74 6e  AL ){.    int tn
e420: 75 6d 20 3d 20 70 49 74 65 72 2d 3e 69 50 6b 54  um = pIter->iPkT
e430: 6e 75 6d 3b 20 20 20 20 2f 2a 20 52 6f 6f 74 20  num;    /* Root 
e440: 70 61 67 65 20 6f 66 20 50 4b 20 69 6e 64 65 78  page of PK index
e450: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   */.    sqlite3_
e460: 73 74 6d 74 20 2a 70 51 75 65 72 79 20 3d 20 30  stmt *pQuery = 0
e470: 3b 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20  ;     /* SELECT 
e480: 6e 61 6d 65 20 2e 2e 2e 20 57 48 45 52 45 20 72  name ... WHERE r
e490: 6f 6f 74 70 61 67 65 20 3d 20 24 74 6e 75 6d 20  ootpage = $tnum 
e4a0: 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  */.    const cha
e4b0: 72 20 2a 7a 49 64 78 20 3d 20 30 3b 20 20 20 20  r *zIdx = 0;    
e4c0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
e4d0: 50 4b 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  PK index */.    
e4e0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 58  sqlite3_stmt *pX
e4f0: 49 6e 66 6f 20 3d 20 30 3b 20 20 20 20 20 2f 2a  Info = 0;     /*
e500: 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e 69 6e 64   PRAGMA main.ind
e510: 65 78 5f 78 69 6e 66 6f 20 3d 20 24 7a 49 64 78  ex_xinfo = $zIdx
e520: 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   */.    const ch
e530: 61 72 20 2a 7a 43 6f 6d 6d 61 20 3d 20 22 22 3b  ar *zComma = "";
e540: 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 73  .    char *zCols
e550: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
e560: 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 62 75     /* Used to bu
e570: 69 6c 64 20 75 70 20 6c 69 73 74 20 6f 66 20 74  ild up list of t
e580: 61 62 6c 65 20 63 6f 6c 73 20 2a 2f 0a 20 20 20  able cols */.   
e590: 20 63 68 61 72 20 2a 7a 50 6b 20 3d 20 30 3b 20   char *zPk = 0; 
e5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e5b0: 2a 20 55 73 65 64 20 74 6f 20 62 75 69 6c 64 20  * Used to build 
e5c0: 75 70 20 74 61 62 6c 65 20 50 4b 20 64 65 63 6c  up table PK decl
e5d0: 61 72 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20 20 20  aration */..    
e5e0: 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74 68  /* Figure out th
e5f0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 70 72  e name of the pr
e600: 69 6d 61 72 79 20 6b 65 79 20 69 6e 64 65 78 20  imary key index 
e610: 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
e620: 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20 54 68  table..    ** Th
e630: 69 73 20 69 73 20 6e 65 65 64 65 64 20 66 6f 72  is is needed for
e640: 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f   the argument to
e650: 20 22 50 52 41 47 4d 41 20 69 6e 64 65 78 5f 78   "PRAGMA index_x
e660: 69 6e 66 6f 22 2e 20 53 65 74 0a 20 20 20 20 2a  info". Set.    *
e670: 2a 20 7a 49 64 78 20 74 6f 20 70 6f 69 6e 74 20  * zIdx to point 
e680: 74 6f 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  to a nul-termina
e690: 74 65 64 20 73 74 72 69 6e 67 20 63 6f 6e 74 61  ted string conta
e6a0: 69 6e 69 6e 67 20 74 68 69 73 20 6e 61 6d 65 2e  ining this name.
e6b0: 20 2a 2f 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   */.    p->rc = 
e6c0: 70 72 65 70 61 72 65 41 6e 64 43 6f 6c 6c 65 63  prepareAndCollec
e6d0: 74 45 72 72 6f 72 28 70 2d 3e 64 62 4d 61 69 6e  tError(p->dbMain
e6e0: 2c 20 26 70 51 75 65 72 79 2c 20 26 70 2d 3e 7a  , &pQuery, &p->z
e6f0: 45 72 72 6d 73 67 2c 20 0a 20 20 20 20 20 20 20  Errmsg, .       
e700: 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52   "SELECT name FR
e710: 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  OM sqlite_master
e720: 20 57 48 45 52 45 20 72 6f 6f 74 70 61 67 65 20   WHERE rootpage 
e730: 3d 20 3f 22 0a 20 20 20 20 29 3b 0a 20 20 20 20  = ?".    );.    
e740: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
e750: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
e760: 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70  lite3_bind_int(p
e770: 51 75 65 72 79 2c 20 31 2c 20 74 6e 75 6d 29 3b  Query, 1, tnum);
e780: 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54  .      if( SQLIT
e790: 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73  E_ROW==sqlite3_s
e7a0: 74 65 70 28 70 51 75 65 72 79 29 20 29 7b 0a 20  tep(pQuery) ){. 
e7b0: 20 20 20 20 20 20 20 7a 49 64 78 20 3d 20 28 63         zIdx = (c
e7c0: 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
e7d0: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
e7e0: 51 75 65 72 79 2c 20 30 29 3b 0a 20 20 20 20 20  Query, 0);.     
e7f0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
e800: 20 7a 49 64 78 20 29 7b 0a 20 20 20 20 20 20 70   zIdx ){.      p
e810: 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65 46 72  ->rc = prepareFr
e820: 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f  eeAndCollectErro
e830: 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 70 58  r(p->dbMain, &pX
e840: 49 6e 66 6f 2c 20 26 70 2d 3e 7a 45 72 72 6d 73  Info, &p->zErrms
e850: 67 2c 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  g,.          sql
e860: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 50 52  ite3_mprintf("PR
e870: 41 47 4d 41 20 6d 61 69 6e 2e 69 6e 64 65 78 5f  AGMA main.index_
e880: 78 69 6e 66 6f 20 3d 20 25 51 22 2c 20 7a 49 64  xinfo = %Q", zId
e890: 78 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  x).      );.    
e8a0: 7d 0a 20 20 20 20 72 62 75 46 69 6e 61 6c 69 7a  }.    rbuFinaliz
e8b0: 65 28 70 2c 20 70 51 75 65 72 79 29 3b 0a 0a 20  e(p, pQuery);.. 
e8c0: 20 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d     while( p->rc=
e8d0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51  =SQLITE_OK && SQ
e8e0: 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65  LITE_ROW==sqlite
e8f0: 33 5f 73 74 65 70 28 70 58 49 6e 66 6f 29 20 29  3_step(pXInfo) )
e900: 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 4b 65 79  {.      int bKey
e910: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
e920: 6e 5f 69 6e 74 28 70 58 49 6e 66 6f 2c 20 35 29  n_int(pXInfo, 5)
e930: 3b 0a 20 20 20 20 20 20 69 66 28 20 62 4b 65 79  ;.      if( bKey
e940: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
e950: 69 43 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 63  iCid = sqlite3_c
e960: 6f 6c 75 6d 6e 5f 69 6e 74 28 70 58 49 6e 66 6f  olumn_int(pXInfo
e970: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 6e  , 1);.        in
e980: 74 20 62 44 65 73 63 20 3d 20 73 71 6c 69 74 65  t bDesc = sqlite
e990: 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 58 49  3_column_int(pXI
e9a0: 6e 66 6f 2c 20 33 29 3b 0a 20 20 20 20 20 20 20  nfo, 3);.       
e9b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
e9c0: 6c 6c 61 74 65 20 3d 20 28 63 6f 6e 73 74 20 63  llate = (const c
e9d0: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
e9e0: 75 6d 6e 5f 74 65 78 74 28 70 58 49 6e 66 6f 2c  umn_text(pXInfo,
e9f0: 20 34 29 3b 0a 20 20 20 20 20 20 20 20 7a 43 6f   4);.        zCo
ea00: 6c 73 20 3d 20 72 62 75 4d 50 72 69 6e 74 66 28  ls = rbuMPrintf(
ea10: 70 2c 20 22 25 7a 25 73 63 25 64 20 25 73 20 43  p, "%z%sc%d %s C
ea20: 4f 4c 4c 41 54 45 20 25 73 22 2c 20 7a 43 6f 6c  OLLATE %s", zCol
ea30: 73 2c 20 7a 43 6f 6d 6d 61 2c 20 0a 20 20 20 20  s, zComma, .    
ea40: 20 20 20 20 20 20 20 20 69 43 69 64 2c 20 70 49          iCid, pI
ea50: 74 65 72 2d 3e 61 7a 54 62 6c 54 79 70 65 5b 69  ter->azTblType[i
ea60: 43 69 64 5d 2c 20 7a 43 6f 6c 6c 61 74 65 0a 20  Cid], zCollate. 
ea70: 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
ea80: 20 20 7a 50 6b 20 3d 20 72 62 75 4d 50 72 69 6e    zPk = rbuMPrin
ea90: 74 66 28 70 2c 20 22 25 7a 25 73 63 25 64 25 73  tf(p, "%z%sc%d%s
eaa0: 22 2c 20 7a 50 6b 2c 20 7a 43 6f 6d 6d 61 2c 20  ", zPk, zComma, 
eab0: 69 43 69 64 2c 20 62 44 65 73 63 3f 22 20 44 45  iCid, bDesc?" DE
eac0: 53 43 22 3a 22 22 29 3b 0a 20 20 20 20 20 20 20  SC":"");.       
ead0: 20 7a 43 6f 6d 6d 61 20 3d 20 22 2c 20 22 3b 0a   zComma = ", ";.
eae0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
eaf0: 20 20 7a 43 6f 6c 73 20 3d 20 72 62 75 4d 50 72    zCols = rbuMPr
eb00: 69 6e 74 66 28 70 2c 20 22 25 7a 2c 20 69 64 20  intf(p, "%z, id 
eb10: 49 4e 54 45 47 45 52 22 2c 20 7a 43 6f 6c 73 29  INTEGER", zCols)
eb20: 3b 0a 20 20 20 20 72 62 75 46 69 6e 61 6c 69 7a  ;.    rbuFinaliz
eb30: 65 28 70 2c 20 70 58 49 6e 66 6f 29 3b 0a 0a 20  e(p, pXInfo);.. 
eb40: 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f     sqlite3_test_
eb50: 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
eb60: 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52  ESTCTRL_IMPOSTER
eb70: 2c 20 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 6d 61  , p->dbMain, "ma
eb80: 69 6e 22 2c 20 31 2c 20 74 6e 75 6d 29 3b 0a 20  in", 1, tnum);. 
eb90: 20 20 20 72 62 75 4d 50 72 69 6e 74 66 45 78 65     rbuMPrintfExe
eba0: 63 28 70 2c 20 70 2d 3e 64 62 4d 61 69 6e 2c 0a  c(p, p->dbMain,.
ebb0: 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20          "CREATE 
ebc0: 54 41 42 4c 45 20 72 62 75 5f 69 6d 70 6f 73 74  TABLE rbu_impost
ebd0: 65 72 32 28 25 7a 2c 20 50 52 49 4d 41 52 59 20  er2(%z, PRIMARY 
ebe0: 4b 45 59 28 25 7a 29 29 20 57 49 54 48 4f 55 54  KEY(%z)) WITHOUT
ebf0: 20 52 4f 57 49 44 22 2c 20 0a 20 20 20 20 20 20   ROWID", .      
ec00: 20 20 7a 43 6f 6c 73 2c 20 7a 50 6b 0a 20 20 20    zCols, zPk.   
ec10: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   );.    sqlite3_
ec20: 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
ec30: 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50  ITE_TESTCTRL_IMP
ec40: 4f 53 54 45 52 2c 20 70 2d 3e 64 62 4d 61 69 6e  OSTER, p->dbMain
ec50: 2c 20 22 6d 61 69 6e 22 2c 20 30 2c 20 30 29 3b  , "main", 0, 0);
ec60: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  .  }.}../*.** If
ec70: 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61 6c   an error has al
ec80: 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 20 77  ready occurred w
ec90: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
eca0: 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20  n is called, it 
ecb0: 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  .** immediately 
ecc0: 72 65 74 75 72 6e 73 20 7a 65 72 6f 20 28 77 69  returns zero (wi
ecd0: 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 20  thout doing any 
ece0: 77 6f 72 6b 29 2e 20 4f 72 2c 20 69 66 20 61 6e  work). Or, if an
ecf0: 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75 72 73   error.** occurs
ed00: 20 64 75 72 69 6e 67 20 74 68 65 20 65 78 65 63   during the exec
ed10: 75 74 69 6f 6e 20 6f 66 20 74 68 69 73 20 66 75  ution of this fu
ed20: 6e 63 74 69 6f 6e 2c 20 69 74 20 73 65 74 73 20  nction, it sets 
ed30: 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a  the error code.*
ed40: 2a 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 33  * in the sqlite3
ed50: 72 62 75 20 6f 62 6a 65 63 74 20 69 6e 64 69 63  rbu object indic
ed60: 61 74 65 64 20 62 79 20 74 68 65 20 66 69 72 73  ated by the firs
ed70: 74 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 72  t argument and r
ed80: 65 74 75 72 6e 73 0a 2a 2a 20 7a 65 72 6f 2e 0a  eturns.** zero..
ed90: 2a 2a 0a 2a 2a 20 54 68 65 20 69 74 65 72 61 74  **.** The iterat
eda0: 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65  or passed as the
edb0: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
edc0: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
edd0: 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 61 20  o point to.** a 
ede0: 74 61 62 6c 65 20 28 6e 6f 74 20 61 6e 20 69 6e  table (not an in
edf0: 64 65 78 29 20 77 68 65 6e 20 74 68 69 73 20 66  dex) when this f
ee00: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
ee10: 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  d. This function
ee20: 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20  .** attempts to 
ee30: 63 72 65 61 74 65 20 61 6e 79 20 69 6d 70 6f 73  create any impos
ee40: 74 65 72 20 74 61 62 6c 65 20 72 65 71 75 69 72  ter table requir
ee50: 65 64 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74  ed to write to t
ee60: 68 65 20 6d 61 69 6e 0a 2a 2a 20 74 61 62 6c 65  he main.** table
ee70: 20 62 2d 74 72 65 65 20 6f 66 20 74 68 65 20 74   b-tree of the t
ee80: 61 62 6c 65 20 62 65 66 6f 72 65 20 72 65 74 75  able before retu
ee90: 72 6e 69 6e 67 2e 20 4e 6f 6e 2d 7a 65 72 6f 20  rning. Non-zero 
eea0: 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 0a 2a  is returned if.*
eeb0: 2a 20 61 6e 20 69 6d 70 6f 73 74 65 72 20 74 61  * an imposter ta
eec0: 62 6c 65 20 61 72 65 20 63 72 65 61 74 65 64 2c  ble are created,
eed0: 20 6f 72 20 7a 65 72 6f 20 6f 74 68 65 72 77 69   or zero otherwi
eee0: 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6d 70  se..**.** An imp
eef0: 6f 73 74 65 72 20 74 61 62 6c 65 20 69 73 20 72  oster table is r
ef00: 65 71 75 69 72 65 64 20 69 6e 20 61 6c 6c 20 63  equired in all c
ef10: 61 73 65 73 20 65 78 63 65 70 74 20 52 42 55 5f  ases except RBU_
ef20: 50 4b 5f 56 54 41 42 2e 20 4f 6e 6c 79 0a 2a 2a  PK_VTAB. Only.**
ef30: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20   virtual tables 
ef40: 61 72 65 20 77 72 69 74 74 65 6e 20 74 6f 20 64  are written to d
ef50: 69 72 65 63 74 6c 79 2e 20 54 68 65 20 69 6d 70  irectly. The imp
ef60: 6f 73 74 65 72 20 74 61 62 6c 65 20 68 61 73 20  oster table has 
ef70: 74 68 65 20 0a 2a 2a 20 73 61 6d 65 20 73 63 68  the .** same sch
ef80: 65 6d 61 20 61 73 20 74 68 65 20 61 63 74 75 61  ema as the actua
ef90: 6c 20 74 61 72 67 65 74 20 74 61 62 6c 65 20 28  l target table (
efa0: 6c 65 73 73 20 61 6e 79 20 55 4e 49 51 55 45 20  less any UNIQUE 
efb0: 63 6f 6e 73 74 72 61 69 6e 74 73 29 2e 20 0a 2a  constraints). .*
efc0: 2a 20 4d 6f 72 65 20 70 72 65 63 69 73 65 6c 79  * More precisely
efd0: 2c 20 74 68 65 20 22 73 61 6d 65 20 73 63 68 65  , the "same sche
efe0: 6d 61 22 20 6d 65 61 6e 73 20 74 68 65 20 73 61  ma" means the sa
eff0: 6d 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 79 70 65  me columns, type
f000: 73 2c 20 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e  s, .** collation
f010: 20 73 65 71 75 65 6e 63 65 73 2e 20 46 6f 72 20   sequences. For 
f020: 74 61 62 6c 65 73 20 74 68 61 74 20 64 6f 20 6e  tables that do n
f030: 6f 74 20 68 61 76 65 20 61 6e 20 65 78 74 65 72  ot have an exter
f040: 6e 61 6c 20 50 52 49 4d 41 52 59 0a 2a 2a 20 4b  nal PRIMARY.** K
f050: 45 59 2c 20 69 74 20 61 6c 73 6f 20 6d 65 61 6e  EY, it also mean
f060: 73 20 74 68 65 20 73 61 6d 65 20 50 52 49 4d 41  s the same PRIMA
f070: 52 59 20 4b 45 59 20 64 65 63 6c 61 72 61 74 69  RY KEY declarati
f080: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
f090: 69 64 20 72 62 75 43 72 65 61 74 65 49 6d 70 6f  id rbuCreateImpo
f0a0: 73 74 65 72 54 61 62 6c 65 28 73 71 6c 69 74 65  sterTable(sqlite
f0b0: 33 72 62 75 20 2a 70 2c 20 52 62 75 4f 62 6a 49  3rbu *p, RbuObjI
f0c0: 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69  ter *pIter){.  i
f0d0: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
f0e0: 5f 4f 4b 20 26 26 20 70 49 74 65 72 2d 3e 65 54  _OK && pIter->eT
f0f0: 79 70 65 21 3d 52 42 55 5f 50 4b 5f 56 54 41 42  ype!=RBU_PK_VTAB
f100: 20 29 7b 0a 20 20 20 20 69 6e 74 20 74 6e 75 6d   ){.    int tnum
f110: 20 3d 20 70 49 74 65 72 2d 3e 69 54 6e 75 6d 3b   = pIter->iTnum;
f120: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
f130: 2a 7a 43 6f 6d 6d 61 20 3d 20 22 22 3b 0a 20 20  *zComma = "";.  
f140: 20 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 30    char *zSql = 0
f150: 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b 0a  ;.    int iCol;.
f160: 20 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74      sqlite3_test
f170: 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
f180: 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45  TESTCTRL_IMPOSTE
f190: 52 2c 20 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 6d  R, p->dbMain, "m
f1a0: 61 69 6e 22 2c 20 30 2c 20 31 29 3b 0a 0a 20 20  ain", 0, 1);..  
f1b0: 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 70 2d    for(iCol=0; p-
f1c0: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
f1d0: 26 20 69 43 6f 6c 3c 70 49 74 65 72 2d 3e 6e 54  & iCol<pIter->nT
f1e0: 62 6c 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a  blCol; iCol++){.
f1f0: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
f200: 20 2a 7a 50 6b 20 3d 20 22 22 3b 0a 20 20 20 20   *zPk = "";.    
f210: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
f220: 6f 6c 20 3d 20 70 49 74 65 72 2d 3e 61 7a 54 62  ol = pIter->azTb
f230: 6c 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20  lCol[iCol];.    
f240: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
f250: 6f 6c 6c 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20  oll = 0;..      
f260: 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  p->rc = sqlite3_
f270: 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74  table_column_met
f280: 61 64 61 74 61 28 0a 20 20 20 20 20 20 20 20 20  adata(.         
f290: 20 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 6d 61 69   p->dbMain, "mai
f2a0: 6e 22 2c 20 70 49 74 65 72 2d 3e 7a 54 62 6c 2c  n", pIter->zTbl,
f2b0: 20 7a 43 6f 6c 2c 20 30 2c 20 26 7a 43 6f 6c 6c   zCol, 0, &zColl
f2c0: 2c 20 30 2c 20 30 2c 20 30 0a 20 20 20 20 20 20  , 0, 0, 0.      
f2d0: 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 49  );..      if( pI
f2e0: 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f  ter->eType==RBU_
f2f0: 50 4b 5f 49 50 4b 20 26 26 20 70 49 74 65 72 2d  PK_IPK && pIter-
f300: 3e 61 62 54 62 6c 50 6b 5b 69 43 6f 6c 5d 20 29  >abTblPk[iCol] )
f310: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
f320: 74 68 65 20 74 61 72 67 65 74 20 74 61 62 6c 65  the target table
f330: 20 63 6f 6c 75 6d 6e 20 69 73 20 61 6e 20 22 49   column is an "I
f340: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
f350: 45 59 22 2c 20 61 64 64 0a 20 20 20 20 20 20 20  EY", add.       
f360: 20 2a 2a 20 22 50 52 49 4d 41 52 59 20 4b 45 59   ** "PRIMARY KEY
f370: 22 20 74 6f 20 74 68 65 20 69 6d 70 6f 73 74 65  " to the imposte
f380: 72 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 64  r table column d
f390: 65 63 6c 61 72 61 74 69 6f 6e 2e 20 2a 2f 0a 20  eclaration. */. 
f3a0: 20 20 20 20 20 20 20 7a 50 6b 20 3d 20 22 50 52         zPk = "PR
f3b0: 49 4d 41 52 59 20 4b 45 59 20 22 3b 0a 20 20 20  IMARY KEY ";.   
f3c0: 20 20 20 7d 0a 20 20 20 20 20 20 7a 53 71 6c 20     }.      zSql 
f3d0: 3d 20 72 62 75 4d 50 72 69 6e 74 66 28 70 2c 20  = rbuMPrintf(p, 
f3e0: 22 25 7a 25 73 5c 22 25 77 5c 22 20 25 73 20 25  "%z%s\"%w\" %s %
f3f0: 73 43 4f 4c 4c 41 54 45 20 25 73 25 73 22 2c 20  sCOLLATE %s%s", 
f400: 0a 20 20 20 20 20 20 20 20 20 20 7a 53 71 6c 2c  .          zSql,
f410: 20 7a 43 6f 6d 6d 61 2c 20 7a 43 6f 6c 2c 20 70   zComma, zCol, p
f420: 49 74 65 72 2d 3e 61 7a 54 62 6c 54 79 70 65 5b  Iter->azTblType[
f430: 69 43 6f 6c 5d 2c 20 7a 50 6b 2c 20 7a 43 6f 6c  iCol], zPk, zCol
f440: 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 28 70 49  l,.          (pI
f450: 74 65 72 2d 3e 61 62 4e 6f 74 4e 75 6c 6c 5b 69  ter->abNotNull[i
f460: 43 6f 6c 5d 20 3f 20 22 20 4e 4f 54 20 4e 55 4c  Col] ? " NOT NUL
f470: 4c 22 20 3a 20 22 22 29 0a 20 20 20 20 20 20 29  L" : "").      )
f480: 3b 0a 20 20 20 20 20 20 7a 43 6f 6d 6d 61 20 3d  ;.      zComma =
f490: 20 22 2c 20 22 3b 0a 20 20 20 20 7d 0a 0a 20 20   ", ";.    }..  
f4a0: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 65 54 79    if( pIter->eTy
f4b0: 70 65 3d 3d 52 42 55 5f 50 4b 5f 57 49 54 48 4f  pe==RBU_PK_WITHO
f4c0: 55 54 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20  UT_ROWID ){.    
f4d0: 20 20 63 68 61 72 20 2a 7a 50 6b 20 3d 20 72 62    char *zPk = rb
f4e0: 75 57 69 74 68 6f 75 74 52 6f 77 69 64 50 4b 28  uWithoutRowidPK(
f4f0: 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20  p, pIter);.     
f500: 20 69 66 28 20 7a 50 6b 20 29 7b 0a 20 20 20 20   if( zPk ){.    
f510: 20 20 20 20 7a 53 71 6c 20 3d 20 72 62 75 4d 50      zSql = rbuMP
f520: 72 69 6e 74 66 28 70 2c 20 22 25 7a 2c 20 25 7a  rintf(p, "%z, %z
f530: 22 2c 20 7a 53 71 6c 2c 20 7a 50 6b 29 3b 0a 20  ", zSql, zPk);. 
f540: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
f550: 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
f560: 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
f570: 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52 2c  STCTRL_IMPOSTER,
f580: 20 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 6d 61 69   p->dbMain, "mai
f590: 6e 22 2c 20 31 2c 20 74 6e 75 6d 29 3b 0a 20 20  n", 1, tnum);.  
f5a0: 20 20 72 62 75 4d 50 72 69 6e 74 66 45 78 65 63    rbuMPrintfExec
f5b0: 28 70 2c 20 70 2d 3e 64 62 4d 61 69 6e 2c 20 22  (p, p->dbMain, "
f5c0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 5c 22 72  CREATE TABLE \"r
f5d0: 62 75 5f 69 6d 70 5f 25 77 5c 22 28 25 7a 29 25  bu_imp_%w\"(%z)%
f5e0: 73 22 2c 20 0a 20 20 20 20 20 20 20 20 70 49 74  s", .        pIt
f5f0: 65 72 2d 3e 7a 54 62 6c 2c 20 7a 53 71 6c 2c 20  er->zTbl, zSql, 
f600: 0a 20 20 20 20 20 20 20 20 28 70 49 74 65 72 2d  .        (pIter-
f610: 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 57  >eType==RBU_PK_W
f620: 49 54 48 4f 55 54 5f 52 4f 57 49 44 20 3f 20 22  ITHOUT_ROWID ? "
f630: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 22 20   WITHOUT ROWID" 
f640: 3a 20 22 22 29 0a 20 20 20 20 29 3b 0a 20 20 20  : "").    );.   
f650: 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
f660: 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
f670: 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52 2c 20  TCTRL_IMPOSTER, 
f680: 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 6d 61 69 6e  p->dbMain, "main
f690: 22 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a  ", 0, 0);.  }.}.
f6a0: 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20 61  ./*.** Prepare a
f6b0: 20 73 74 61 74 65 6d 65 6e 74 20 75 73 65 64 20   statement used 
f6c0: 74 6f 20 69 6e 73 65 72 74 20 72 6f 77 73 20 69  to insert rows i
f6d0: 6e 74 6f 20 74 68 65 20 22 72 62 75 5f 74 6d 70  nto the "rbu_tmp
f6e0: 5f 78 78 78 22 20 74 61 62 6c 65 2e 0a 2a 2a 20  _xxx" table..** 
f6f0: 53 70 65 63 69 66 69 63 61 6c 6c 79 20 61 20 73  Specifically a s
f700: 74 61 74 65 6d 65 6e 74 20 6f 66 20 74 68 65 20  tatement of the 
f710: 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  form:.**.**     
f720: 49 4e 53 45 52 54 20 49 4e 54 4f 20 72 62 75 5f  INSERT INTO rbu_
f730: 74 6d 70 5f 78 78 78 20 56 41 4c 55 45 53 28 3f  tmp_xxx VALUES(?
f740: 2c 20 3f 2c 20 3f 20 2e 2e 2e 29 3b 0a 2a 2a 0a  , ?, ? ...);.**.
f750: 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** The number of
f760: 20 62 6f 75 6e 64 20 76 61 72 69 61 62 6c 65 73   bound variables
f770: 20 69 73 20 65 71 75 61 6c 20 74 6f 20 74 68 65   is equal to the
f780: 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
f790: 6e 73 20 69 6e 0a 2a 2a 20 74 68 65 20 74 61 72  ns in.** the tar
f7a0: 67 65 74 20 74 61 62 6c 65 2c 20 70 6c 75 73 20  get table, plus 
f7b0: 6f 6e 65 20 28 66 6f 72 20 74 68 65 20 72 62 75  one (for the rbu
f7c0: 5f 63 6f 6e 74 72 6f 6c 20 63 6f 6c 75 6d 6e 29  _control column)
f7d0: 2c 20 70 6c 75 73 20 6f 6e 65 20 6d 6f 72 65 20  , plus one more 
f7e0: 0a 2a 2a 20 28 66 6f 72 20 74 68 65 20 72 62 75  .** (for the rbu
f7f0: 5f 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 29 20 69  _rowid column) i
f800: 66 20 74 68 65 20 74 61 72 67 65 74 20 74 61 62  f the target tab
f810: 6c 65 20 69 73 20 61 6e 20 69 6d 70 6c 69 63 69  le is an implici
f820: 74 20 49 50 4b 20 6f 72 20 0a 2a 2a 20 76 69 72  t IPK or .** vir
f830: 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73  tual table..*/.s
f840: 74 61 74 69 63 20 76 6f 69 64 20 72 62 75 4f 62  tatic void rbuOb
f850: 6a 49 74 65 72 50 72 65 70 61 72 65 54 6d 70 49  jIterPrepareTmpI
f860: 6e 73 65 72 74 28 0a 20 20 73 71 6c 69 74 65 33  nsert(.  sqlite3
f870: 72 62 75 20 2a 70 2c 20 0a 20 20 52 62 75 4f 62  rbu *p, .  RbuOb
f880: 6a 49 74 65 72 20 2a 70 49 74 65 72 2c 0a 20 20  jIter *pIter,.  
f890: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
f8a0: 6c 69 73 74 2c 0a 20 20 63 6f 6e 73 74 20 63 68  list,.  const ch
f8b0: 61 72 20 2a 7a 52 62 75 52 6f 77 69 64 0a 29 7b  ar *zRbuRowid.){
f8c0: 0a 20 20 69 6e 74 20 62 52 62 75 52 6f 77 69 64  .  int bRbuRowid
f8d0: 20 3d 20 28 70 49 74 65 72 2d 3e 65 54 79 70 65   = (pIter->eType
f8e0: 3d 3d 52 42 55 5f 50 4b 5f 45 58 54 45 52 4e 41  ==RBU_PK_EXTERNA
f8f0: 4c 20 7c 7c 20 70 49 74 65 72 2d 3e 65 54 79 70  L || pIter->eTyp
f900: 65 3d 3d 52 42 55 5f 50 4b 5f 4e 4f 4e 45 29 3b  e==RBU_PK_NONE);
f910: 0a 20 20 63 68 61 72 20 2a 7a 42 69 6e 64 20 3d  .  char *zBind =
f920: 20 72 62 75 4f 62 6a 49 74 65 72 47 65 74 42 69   rbuObjIterGetBi
f930: 6e 64 6c 69 73 74 28 70 2c 20 70 49 74 65 72 2d  ndlist(p, pIter-
f940: 3e 6e 54 62 6c 43 6f 6c 20 2b 20 31 20 2b 20 62  >nTblCol + 1 + b
f950: 52 62 75 52 6f 77 69 64 29 3b 0a 20 20 69 66 28  RbuRowid);.  if(
f960: 20 7a 42 69 6e 64 20 29 7b 0a 20 20 20 20 61 73   zBind ){.    as
f970: 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70 54 6d  sert( pIter->pTm
f980: 70 49 6e 73 65 72 74 3d 3d 30 20 29 3b 0a 20 20  pInsert==0 );.  
f990: 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72    p->rc = prepar
f9a0: 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45  eFreeAndCollectE
f9b0: 72 72 6f 72 28 0a 20 20 20 20 20 20 20 20 70 2d  rror(.        p-
f9c0: 3e 64 62 52 62 75 2c 20 26 70 49 74 65 72 2d 3e  >dbRbu, &pIter->
f9d0: 70 54 6d 70 49 6e 73 65 72 74 2c 20 26 70 2d 3e  pTmpInsert, &p->
f9e0: 7a 45 72 72 6d 73 67 2c 20 73 71 6c 69 74 65 33  zErrmsg, sqlite3
f9f0: 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20  _mprintf(.      
fa00: 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f      "INSERT INTO
fa10: 20 25 73 2e 27 72 62 75 5f 74 6d 70 5f 25 71 27   %s.'rbu_tmp_%q'
fa20: 28 72 62 75 5f 63 6f 6e 74 72 6f 6c 2c 25 73 25  (rbu_control,%s%
fa30: 73 29 20 56 41 4c 55 45 53 28 25 7a 29 22 2c 20  s) VALUES(%z)", 
fa40: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 53  .          p->zS
fa50: 74 61 74 65 44 62 2c 20 70 49 74 65 72 2d 3e 7a  tateDb, pIter->z
fa60: 44 61 74 61 54 62 6c 2c 20 7a 43 6f 6c 6c 69 73  DataTbl, zCollis
fa70: 74 2c 20 7a 52 62 75 52 6f 77 69 64 2c 20 7a 42  t, zRbuRowid, zB
fa80: 69 6e 64 0a 20 20 20 20 29 29 3b 0a 20 20 7d 0a  ind.    ));.  }.
fa90: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  }..static void r
faa0: 62 75 54 6d 70 49 6e 73 65 72 74 46 75 6e 63 28  buTmpInsertFunc(
fab0: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
fac0: 78 74 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74  xt *pCtx, .  int
fad0: 20 6e 56 61 6c 2c 0a 20 20 73 71 6c 69 74 65 33   nVal,.  sqlite3
fae0: 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 0a 29  _value **apVal.)
faf0: 7b 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20 2a  {.  sqlite3rbu *
fb00: 70 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72  p = sqlite3_user
fb10: 5f 64 61 74 61 28 70 43 74 78 29 3b 0a 20 20 69  _data(pCtx);.  i
fb20: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
fb30: 4b 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61  K;.  int i;..  a
fb40: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76  ssert( sqlite3_v
fb50: 61 6c 75 65 5f 69 6e 74 28 61 70 56 61 6c 5b 30  alue_int(apVal[0
fb60: 5d 29 21 3d 30 0a 20 20 20 20 20 20 7c 7c 20 70  ])!=0.      || p
fb70: 2d 3e 6f 62 6a 69 74 65 72 2e 65 54 79 70 65 3d  ->objiter.eType=
fb80: 3d 52 42 55 5f 50 4b 5f 45 58 54 45 52 4e 41 4c  =RBU_PK_EXTERNAL
fb90: 20 0a 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6f 62   .      || p->ob
fba0: 6a 69 74 65 72 2e 65 54 79 70 65 3d 3d 52 42 55  jiter.eType==RBU
fbb0: 5f 50 4b 5f 4e 4f 4e 45 20 0a 20 20 29 3b 0a 20  _PK_NONE .  );. 
fbc0: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c   if( sqlite3_val
fbd0: 75 65 5f 69 6e 74 28 61 70 56 61 6c 5b 30 5d 29  ue_int(apVal[0])
fbe0: 21 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 50  !=0 ){.    p->nP
fbf0: 68 61 73 65 4f 6e 65 53 74 65 70 20 2b 3d 20 70  haseOneStep += p
fc00: 2d 3e 6f 62 6a 69 74 65 72 2e 6e 49 6e 64 65 78  ->objiter.nIndex
fc10: 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 3d 30  ;.  }..  for(i=0
fc20: 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
fc30: 26 26 20 69 3c 6e 56 61 6c 3b 20 69 2b 2b 29 7b  && i<nVal; i++){
fc40: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
fc50: 33 5f 62 69 6e 64 5f 76 61 6c 75 65 28 70 2d 3e  3_bind_value(p->
fc60: 6f 62 6a 69 74 65 72 2e 70 54 6d 70 49 6e 73 65  objiter.pTmpInse
fc70: 72 74 2c 20 69 2b 31 2c 20 61 70 56 61 6c 5b 69  rt, i+1, apVal[i
fc80: 5d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  ]);.  }.  if( rc
fc90: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
fca0: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28     sqlite3_step(
fcb0: 70 2d 3e 6f 62 6a 69 74 65 72 2e 70 54 6d 70 49  p->objiter.pTmpI
fcc0: 6e 73 65 72 74 29 3b 0a 20 20 20 20 72 63 20 3d  nsert);.    rc =
fcd0: 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
fce0: 2d 3e 6f 62 6a 69 74 65 72 2e 70 54 6d 70 49 6e  ->objiter.pTmpIn
fcf0: 73 65 72 74 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  sert);.  }..  if
fd00: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
fd10: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ){.    sqlite3_r
fd20: 65 73 75 6c 74 5f 65 72 72 6f 72 5f 63 6f 64 65  esult_error_code
fd30: 28 70 43 74 78 2c 20 72 63 29 3b 0a 20 20 7d 0a  (pCtx, rc);.  }.
fd40: 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 73 75 72 65 20  }../*.** Ensure 
fd50: 74 68 61 74 20 74 68 65 20 53 51 4c 69 74 65 20  that the SQLite 
fd60: 73 74 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65  statement handle
fd70: 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 75 70  s required to up
fd80: 64 61 74 65 20 74 68 65 20 0a 2a 2a 20 74 61 72  date the .** tar
fd90: 67 65 74 20 64 61 74 61 62 61 73 65 20 6f 62 6a  get database obj
fda0: 65 63 74 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  ect currently in
fdb0: 64 69 63 61 74 65 64 20 62 79 20 74 68 65 20 69  dicated by the i
fdc0: 74 65 72 61 74 6f 72 20 70 61 73 73 65 64 20 0a  terator passed .
fdd0: 2a 2a 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ** as the second
fde0: 20 61 72 67 75 6d 65 6e 74 20 61 72 65 20 61 76   argument are av
fdf0: 61 69 6c 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  ailable..*/.stat
fe00: 69 63 20 69 6e 74 20 72 62 75 4f 62 6a 49 74 65  ic int rbuObjIte
fe10: 72 50 72 65 70 61 72 65 41 6c 6c 28 0a 20 20 73  rPrepareAll(.  s
fe20: 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 0a 20  qlite3rbu *p, . 
fe30: 20 52 62 75 4f 62 6a 49 74 65 72 20 2a 70 49 74   RbuObjIter *pIt
fe40: 65 72 2c 0a 20 20 69 6e 74 20 6e 4f 66 66 73 65  er,.  int nOffse
fe50: 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
fe60: 20 20 20 20 20 20 2f 2a 20 41 64 64 20 22 4c 49        /* Add "LI
fe70: 4d 49 54 20 2d 31 20 4f 46 46 53 45 54 20 24 6e  MIT -1 OFFSET $n
fe80: 4f 66 66 73 65 74 22 20 74 6f 20 53 45 4c 45 43  Offset" to SELEC
fe90: 54 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74  T */.){.  assert
fea0: 28 20 70 49 74 65 72 2d 3e 62 43 6c 65 61 6e 75  ( pIter->bCleanu
feb0: 70 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 49  p==0 );.  if( pI
fec0: 74 65 72 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20  ter->pSelect==0 
fed0: 26 26 20 72 62 75 4f 62 6a 49 74 65 72 43 61 63  && rbuObjIterCac
fee0: 68 65 54 61 62 6c 65 49 6e 66 6f 28 70 2c 20 70  heTableInfo(p, p
fef0: 49 74 65 72 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  Iter)==SQLITE_OK
ff00: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e   ){.    const in
ff10: 74 20 74 6e 75 6d 20 3d 20 70 49 74 65 72 2d 3e  t tnum = pIter->
ff20: 69 54 6e 75 6d 3b 0a 20 20 20 20 63 68 61 72 20  iTnum;.    char 
ff30: 2a 7a 43 6f 6c 6c 69 73 74 20 3d 20 30 3b 20 20  *zCollist = 0;  
ff40: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
ff50: 20 6f 66 20 69 6e 64 65 78 65 64 20 63 6f 6c 75   of indexed colu
ff60: 6d 6e 73 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  mns */.    char 
ff70: 2a 2a 70 7a 20 3d 20 26 70 2d 3e 7a 45 72 72 6d  **pz = &p->zErrm
ff80: 73 67 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  sg;.    const ch
ff90: 61 72 20 2a 7a 49 64 78 20 3d 20 70 49 74 65 72  ar *zIdx = pIter
ffa0: 2d 3e 7a 49 64 78 3b 0a 20 20 20 20 63 68 61 72  ->zIdx;.    char
ffb0: 20 2a 7a 4c 69 6d 69 74 20 3d 20 30 3b 0a 0a 20   *zLimit = 0;.. 
ffc0: 20 20 20 69 66 28 20 6e 4f 66 66 73 65 74 20 29     if( nOffset )
ffd0: 7b 0a 20 20 20 20 20 20 7a 4c 69 6d 69 74 20 3d  {.      zLimit =
ffe0: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
fff0: 28 22 20 4c 49 4d 49 54 20 2d 31 20 4f 46 46 53  (" LIMIT -1 OFFS
10000 45 54 20 25 64 22 2c 20 6e 4f 66 66 73 65 74 29  ET %d", nOffset)
10010 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 4c 69  ;.      if( !zLi
10020 6d 69 74 20 29 20 70 2d 3e 72 63 20 3d 20 53 51  mit ) p->rc = SQ
10030 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
10040 7d 0a 0a 20 20 20 20 69 66 28 20 7a 49 64 78 20  }..    if( zIdx 
10050 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
10060 68 61 72 20 2a 7a 54 62 6c 20 3d 20 70 49 74 65  har *zTbl = pIte
10070 72 2d 3e 7a 54 62 6c 3b 0a 20 20 20 20 20 20 63  r->zTbl;.      c
10080 68 61 72 20 2a 7a 49 6d 70 6f 73 74 65 72 43 6f  har *zImposterCo
10090 6c 73 20 3d 20 30 3b 20 20 20 20 2f 2a 20 43 6f  ls = 0;    /* Co
100a0 6c 75 6d 6e 73 20 66 6f 72 20 69 6d 70 6f 73 74  lumns for impost
100b0 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  er table */.    
100c0 20 20 63 68 61 72 20 2a 7a 49 6d 70 6f 73 74 65    char *zImposte
100d0 72 50 4b 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  rPK = 0;      /*
100e0 20 50 72 69 6d 61 72 79 20 6b 65 79 20 64 65 63   Primary key dec
100f0 6c 61 72 61 74 69 6f 6e 20 66 6f 72 20 69 6d 70  laration for imp
10100 6f 73 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 63  oster */.      c
10110 68 61 72 20 2a 7a 57 68 65 72 65 20 3d 20 30 3b  har *zWhere = 0;
10120 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 48             /* WH
10130 45 52 45 20 63 6c 61 75 73 65 20 6f 6e 20 50 4b  ERE clause on PK
10140 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20   columns */.    
10150 20 20 63 68 61 72 20 2a 7a 42 69 6e 64 20 3d 20    char *zBind = 
10160 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 69  0;.      int nBi
10170 6e 64 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 61  nd = 0;..      a
10180 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 65 54  ssert( pIter->eT
10190 79 70 65 21 3d 52 42 55 5f 50 4b 5f 56 54 41 42  ype!=RBU_PK_VTAB
101a0 20 29 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 69   );.      zColli
101b0 73 74 20 3d 20 72 62 75 4f 62 6a 49 74 65 72 47  st = rbuObjIterG
101c0 65 74 49 6e 64 65 78 43 6f 6c 73 28 0a 20 20 20  etIndexCols(.   
101d0 20 20 20 20 20 20 20 70 2c 20 70 49 74 65 72 2c         p, pIter,
101e0 20 26 7a 49 6d 70 6f 73 74 65 72 43 6f 6c 73 2c   &zImposterCols,
101f0 20 26 7a 49 6d 70 6f 73 74 65 72 50 4b 2c 20 26   &zImposterPK, &
10200 7a 57 68 65 72 65 2c 20 26 6e 42 69 6e 64 0a 20  zWhere, &nBind. 
10210 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7a 42       );.      zB
10220 69 6e 64 20 3d 20 72 62 75 4f 62 6a 49 74 65 72  ind = rbuObjIter
10230 47 65 74 42 69 6e 64 6c 69 73 74 28 70 2c 20 6e  GetBindlist(p, n
10240 42 69 6e 64 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  Bind);..      /*
10250 20 43 72 65 61 74 65 20 74 68 65 20 69 6d 70 6f   Create the impo
10260 73 74 65 72 20 74 61 62 6c 65 20 75 73 65 64 20  ster table used 
10270 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 69 73  to write to this
10280 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20 20 20 20   index. */.     
10290 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
102a0 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
102b0 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52 2c 20  TCTRL_IMPOSTER, 
102c0 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 6d 61 69 6e  p->dbMain, "main
102d0 22 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20 20 20  ", 0, 1);.      
102e0 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
102f0 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
10300 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52 2c 20 70  CTRL_IMPOSTER, p
10310 2d 3e 64 62 4d 61 69 6e 2c 20 22 6d 61 69 6e 22  ->dbMain, "main"
10320 2c 20 31 2c 74 6e 75 6d 29 3b 0a 20 20 20 20 20  , 1,tnum);.     
10330 20 72 62 75 4d 50 72 69 6e 74 66 45 78 65 63 28   rbuMPrintfExec(
10340 70 2c 20 70 2d 3e 64 62 4d 61 69 6e 2c 0a 20 20  p, p->dbMain,.  
10350 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20          "CREATE 
10360 54 41 42 4c 45 20 5c 22 72 62 75 5f 69 6d 70 5f  TABLE \"rbu_imp_
10370 25 77 5c 22 28 20 25 73 2c 20 50 52 49 4d 41 52  %w\"( %s, PRIMAR
10380 59 20 4b 45 59 28 20 25 73 20 29 20 29 20 57 49  Y KEY( %s ) ) WI
10390 54 48 4f 55 54 20 52 4f 57 49 44 22 2c 0a 20 20  THOUT ROWID",.  
103a0 20 20 20 20 20 20 20 20 7a 54 62 6c 2c 20 7a 49          zTbl, zI
103b0 6d 70 6f 73 74 65 72 43 6f 6c 73 2c 20 7a 49 6d  mposterCols, zIm
103c0 70 6f 73 74 65 72 50 4b 0a 20 20 20 20 20 20 29  posterPK.      )
103d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
103e0 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
103f0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50  ITE_TESTCTRL_IMP
10400 4f 53 54 45 52 2c 20 70 2d 3e 64 62 4d 61 69 6e  OSTER, p->dbMain
10410 2c 20 22 6d 61 69 6e 22 2c 20 30 2c 20 30 29 3b  , "main", 0, 0);
10420 0a 0a 20 20 20 20 20 20 2f 2a 20 43 72 65 61 74  ..      /* Creat
10430 65 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  e the statement 
10440 74 6f 20 69 6e 73 65 72 74 20 69 6e 64 65 78 20  to insert index 
10450 65 6e 74 72 69 65 73 20 2a 2f 0a 20 20 20 20 20  entries */.     
10460 20 70 49 74 65 72 2d 3e 6e 43 6f 6c 20 3d 20 6e   pIter->nCol = n
10470 42 69 6e 64 3b 0a 20 20 20 20 20 20 69 66 28 20  Bind;.      if( 
10480 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
10490 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72   ){.        p->r
104a0 63 20 3d 20 70 72 65 70 61 72 65 46 72 65 65 41  c = prepareFreeA
104b0 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 0a  ndCollectError(.
104c0 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 64              p->d
104d0 62 4d 61 69 6e 2c 20 26 70 49 74 65 72 2d 3e 70  bMain, &pIter->p
104e0 49 6e 73 65 72 74 2c 20 26 70 2d 3e 7a 45 72 72  Insert, &p->zErr
104f0 6d 73 67 2c 0a 20 20 20 20 20 20 20 20 20 20 73  msg,.          s
10500 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
10510 49 4e 53 45 52 54 20 49 4e 54 4f 20 5c 22 72 62  INSERT INTO \"rb
10520 75 5f 69 6d 70 5f 25 77 5c 22 20 56 41 4c 55 45  u_imp_%w\" VALUE
10530 53 28 25 73 29 22 2c 20 7a 54 62 6c 2c 20 7a 42  S(%s)", zTbl, zB
10540 69 6e 64 29 0a 20 20 20 20 20 20 20 20 29 3b 0a  ind).        );.
10550 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
10560 2a 20 41 6e 64 20 74 6f 20 64 65 6c 65 74 65 20  * And to delete 
10570 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20 2a 2f  index entries */
10580 0a 20 20 20 20 20 20 69 66 28 20 72 62 75 49 73  .      if( rbuIs
10590 56 61 63 75 75 6d 28 70 29 3d 3d 30 20 26 26 20  Vacuum(p)==0 && 
105a0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
105b0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72   ){.        p->r
105c0 63 20 3d 20 70 72 65 70 61 72 65 46 72 65 65 41  c = prepareFreeA
105d0 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 0a  ndCollectError(.
105e0 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 64              p->d
105f0 62 4d 61 69 6e 2c 20 26 70 49 74 65 72 2d 3e 70  bMain, &pIter->p
10600 44 65 6c 65 74 65 2c 20 26 70 2d 3e 7a 45 72 72  Delete, &p->zErr
10610 6d 73 67 2c 0a 20 20 20 20 20 20 20 20 20 20 73  msg,.          s
10620 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
10630 44 45 4c 45 54 45 20 46 52 4f 4d 20 5c 22 72 62  DELETE FROM \"rb
10640 75 5f 69 6d 70 5f 25 77 5c 22 20 57 48 45 52 45  u_imp_%w\" WHERE
10650 20 25 73 22 2c 20 7a 54 62 6c 2c 20 7a 57 68 65   %s", zTbl, zWhe
10660 72 65 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  re).        );. 
10670 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
10680 20 43 72 65 61 74 65 20 74 68 65 20 53 45 4c 45   Create the SELE
10690 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20  CT statement to 
106a0 72 65 61 64 20 6b 65 79 73 20 69 6e 20 73 6f 72  read keys in sor
106b0 74 65 64 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20  ted order */.   
106c0 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
106d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
106e0 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20     char *zSql;. 
106f0 20 20 20 20 20 20 20 69 66 28 20 72 62 75 49 73         if( rbuIs
10700 56 61 63 75 75 6d 28 70 29 20 29 7b 0a 20 20 20  Vacuum(p) ){.   
10710 20 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73 71         zSql = sq
10720 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20  lite3_mprintf(. 
10730 20 20 20 20 20 20 20 20 20 20 20 20 20 22 53 45               "SE
10740 4c 45 43 54 20 25 73 2c 20 30 20 41 53 20 72 62  LECT %s, 0 AS rb
10750 75 5f 63 6f 6e 74 72 6f 6c 20 46 52 4f 4d 20 27  u_control FROM '
10760 25 71 27 20 4f 52 44 45 52 20 42 59 20 25 73 25  %q' ORDER BY %s%
10770 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s",.            
10780 20 20 7a 43 6f 6c 6c 69 73 74 2c 20 0a 20 20 20    zCollist, .   
10790 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72             pIter
107a0 2d 3e 7a 44 61 74 61 54 62 6c 2c 0a 20 20 20 20  ->zDataTbl,.    
107b0 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 6c 69            zColli
107c0 73 74 2c 20 7a 4c 69 6d 69 74 0a 20 20 20 20 20  st, zLimit.     
107d0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
107e0 7d 65 6c 73 65 0a 0a 20 20 20 20 20 20 20 20 69  }else..        i
107f0 66 28 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d  f( pIter->eType=
10800 3d 52 42 55 5f 50 4b 5f 45 58 54 45 52 4e 41 4c  =RBU_PK_EXTERNAL
10810 20 7c 7c 20 70 49 74 65 72 2d 3e 65 54 79 70 65   || pIter->eType
10820 3d 3d 52 42 55 5f 50 4b 5f 4e 4f 4e 45 20 29 7b  ==RBU_PK_NONE ){
10830 0a 20 20 20 20 20 20 20 20 20 20 7a 53 71 6c 20  .          zSql 
10840 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
10850 66 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  f(.             
10860 20 22 53 45 4c 45 43 54 20 25 73 2c 20 72 62 75   "SELECT %s, rbu
10870 5f 63 6f 6e 74 72 6f 6c 20 46 52 4f 4d 20 25 73  _control FROM %s
10880 2e 27 72 62 75 5f 74 6d 70 5f 25 71 27 20 4f 52  .'rbu_tmp_%q' OR
10890 44 45 52 20 42 59 20 25 73 25 73 22 2c 0a 20 20  DER BY %s%s",.  
108a0 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c              zCol
108b0 6c 69 73 74 2c 20 70 2d 3e 7a 53 74 61 74 65 44  list, p->zStateD
108c0 62 2c 20 70 49 74 65 72 2d 3e 7a 44 61 74 61 54  b, pIter->zDataT
108d0 62 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  bl,.            
108e0 20 20 7a 43 6f 6c 6c 69 73 74 2c 20 7a 4c 69 6d    zCollist, zLim
108f0 69 74 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a  it.          );.
10900 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
10910 20 20 20 20 20 20 20 20 20 7a 53 71 6c 20 3d 20           zSql = 
10920 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
10930 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
10940 53 45 4c 45 43 54 20 25 73 2c 20 72 62 75 5f 63  SELECT %s, rbu_c
10950 6f 6e 74 72 6f 6c 20 46 52 4f 4d 20 25 73 2e 27  ontrol FROM %s.'
10960 72 62 75 5f 74 6d 70 5f 25 71 27 20 22 0a 20 20  rbu_tmp_%q' ".  
10970 20 20 20 20 20 20 20 20 20 20 20 20 22 55 4e 49              "UNI
10980 4f 4e 20 41 4c 4c 20 22 0a 20 20 20 20 20 20 20  ON ALL ".       
10990 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 25         "SELECT %
109a0 73 2c 20 72 62 75 5f 63 6f 6e 74 72 6f 6c 20 46  s, rbu_control F
109b0 52 4f 4d 20 27 25 71 27 20 22 0a 20 20 20 20 20  ROM '%q' ".     
109c0 20 20 20 20 20 20 20 20 20 22 57 48 45 52 45 20           "WHERE 
109d0 74 79 70 65 6f 66 28 72 62 75 5f 63 6f 6e 74 72  typeof(rbu_contr
109e0 6f 6c 29 3d 27 69 6e 74 65 67 65 72 27 20 41 4e  ol)='integer' AN
109f0 44 20 72 62 75 5f 63 6f 6e 74 72 6f 6c 21 3d 31  D rbu_control!=1
10a00 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ".             
10a10 20 22 4f 52 44 45 52 20 42 59 20 25 73 25 73 22   "ORDER BY %s%s"
10a20 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
10a30 7a 43 6f 6c 6c 69 73 74 2c 20 70 2d 3e 7a 53 74  zCollist, p->zSt
10a40 61 74 65 44 62 2c 20 70 49 74 65 72 2d 3e 7a 44  ateDb, pIter->zD
10a50 61 74 61 54 62 6c 2c 20 0a 20 20 20 20 20 20 20  ataTbl, .       
10a60 20 20 20 20 20 20 20 7a 43 6f 6c 6c 69 73 74 2c         zCollist,
10a70 20 70 49 74 65 72 2d 3e 7a 44 61 74 61 54 62 6c   pIter->zDataTbl
10a80 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
10a90 20 7a 43 6f 6c 6c 69 73 74 2c 20 7a 4c 69 6d 69   zCollist, zLimi
10aa0 74 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20  t.          );. 
10ab0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
10ac0 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65   p->rc = prepare
10ad0 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72  FreeAndCollectEr
10ae0 72 6f 72 28 70 2d 3e 64 62 52 62 75 2c 20 26 70  ror(p->dbRbu, &p
10af0 49 74 65 72 2d 3e 70 53 65 6c 65 63 74 2c 20 70  Iter->pSelect, p
10b00 7a 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20  z, zSql);.      
10b10 7d 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  }..      sqlite3
10b20 5f 66 72 65 65 28 7a 49 6d 70 6f 73 74 65 72 43  _free(zImposterC
10b30 6f 6c 73 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ols);.      sqli
10b40 74 65 33 5f 66 72 65 65 28 7a 49 6d 70 6f 73 74  te3_free(zImpost
10b50 65 72 50 4b 29 3b 0a 20 20 20 20 20 20 73 71 6c  erPK);.      sql
10b60 69 74 65 33 5f 66 72 65 65 28 7a 57 68 65 72 65  ite3_free(zWhere
10b70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10b80 5f 66 72 65 65 28 7a 42 69 6e 64 29 3b 0a 20 20  _free(zBind);.  
10b90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
10ba0 6e 74 20 62 52 62 75 52 6f 77 69 64 20 3d 20 28  nt bRbuRowid = (
10bb0 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42  pIter->eType==RB
10bc0 55 5f 50 4b 5f 56 54 41 42 29 0a 20 20 20 20 20  U_PK_VTAB).     
10bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
10be0 7c 28 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d  |(pIter->eType==
10bf0 52 42 55 5f 50 4b 5f 4e 4f 4e 45 29 0a 20 20 20  RBU_PK_NONE).   
10c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c10 20 7c 7c 28 70 49 74 65 72 2d 3e 65 54 79 70 65   ||(pIter->eType
10c20 3d 3d 52 42 55 5f 50 4b 5f 45 58 54 45 52 4e 41  ==RBU_PK_EXTERNA
10c30 4c 20 26 26 20 72 62 75 49 73 56 61 63 75 75 6d  L && rbuIsVacuum
10c40 28 70 29 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73  (p));.      cons
10c50 74 20 63 68 61 72 20 2a 7a 54 62 6c 20 3d 20 70  t char *zTbl = p
10c60 49 74 65 72 2d 3e 7a 54 62 6c 3b 20 20 20 20 20  Iter->zTbl;     
10c70 20 20 2f 2a 20 54 61 62 6c 65 20 74 68 69 73 20    /* Table this 
10c80 73 74 65 70 20 61 70 70 6c 69 65 73 20 74 6f 20  step applies to 
10c90 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  */.      const c
10ca0 68 61 72 20 2a 7a 57 72 69 74 65 3b 20 20 20 20  har *zWrite;    
10cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10cc0 2a 20 49 6d 70 6f 73 74 65 72 20 74 61 62 6c 65  * Imposter table
10cd0 20 6e 61 6d 65 20 2a 2f 0a 0a 20 20 20 20 20 20   name */..      
10ce0 63 68 61 72 20 2a 7a 42 69 6e 64 69 6e 67 73 20  char *zBindings 
10cf0 3d 20 72 62 75 4f 62 6a 49 74 65 72 47 65 74 42  = rbuObjIterGetB
10d00 69 6e 64 6c 69 73 74 28 70 2c 20 70 49 74 65 72  indlist(p, pIter
10d10 2d 3e 6e 54 62 6c 43 6f 6c 20 2b 20 62 52 62 75  ->nTblCol + bRbu
10d20 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 63 68  Rowid);.      ch
10d30 61 72 20 2a 7a 57 68 65 72 65 20 3d 20 72 62 75  ar *zWhere = rbu
10d40 4f 62 6a 49 74 65 72 47 65 74 57 68 65 72 65 28  ObjIterGetWhere(
10d50 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20  p, pIter);.     
10d60 20 63 68 61 72 20 2a 7a 4f 6c 64 6c 69 73 74 20   char *zOldlist 
10d70 3d 20 72 62 75 4f 62 6a 49 74 65 72 47 65 74 4f  = rbuObjIterGetO
10d80 6c 64 6c 69 73 74 28 70 2c 20 70 49 74 65 72 2c  ldlist(p, pIter,
10d90 20 22 6f 6c 64 22 29 3b 0a 20 20 20 20 20 20 63   "old");.      c
10da0 68 61 72 20 2a 7a 4e 65 77 6c 69 73 74 20 3d 20  har *zNewlist = 
10db0 72 62 75 4f 62 6a 49 74 65 72 47 65 74 4f 6c 64  rbuObjIterGetOld
10dc0 6c 69 73 74 28 70 2c 20 70 49 74 65 72 2c 20 22  list(p, pIter, "
10dd0 6e 65 77 22 29 3b 0a 0a 20 20 20 20 20 20 7a 43  new");..      zC
10de0 6f 6c 6c 69 73 74 20 3d 20 72 62 75 4f 62 6a 49  ollist = rbuObjI
10df0 74 65 72 47 65 74 43 6f 6c 6c 69 73 74 28 70 2c  terGetCollist(p,
10e00 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 70   pIter);.      p
10e10 49 74 65 72 2d 3e 6e 43 6f 6c 20 3d 20 70 49 74  Iter->nCol = pIt
10e20 65 72 2d 3e 6e 54 62 6c 43 6f 6c 3b 0a 0a 20 20  er->nTblCol;..  
10e30 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68      /* Create th
10e40 65 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65  e imposter table
10e50 20 6f 72 20 74 61 62 6c 65 73 20 28 69 66 20 72   or tables (if r
10e60 65 71 75 69 72 65 64 29 2e 20 2a 2f 0a 20 20 20  equired). */.   
10e70 20 20 20 72 62 75 43 72 65 61 74 65 49 6d 70 6f     rbuCreateImpo
10e80 73 74 65 72 54 61 62 6c 65 28 70 2c 20 70 49 74  sterTable(p, pIt
10e90 65 72 29 3b 0a 20 20 20 20 20 20 72 62 75 43 72  er);.      rbuCr
10ea0 65 61 74 65 49 6d 70 6f 73 74 65 72 54 61 62 6c  eateImposterTabl
10eb0 65 32 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  e2(p, pIter);.  
10ec0 20 20 20 20 7a 57 72 69 74 65 20 3d 20 28 70 49      zWrite = (pI
10ed0 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f  ter->eType==RBU_
10ee0 50 4b 5f 56 54 41 42 20 3f 20 22 22 20 3a 20 22  PK_VTAB ? "" : "
10ef0 72 62 75 5f 69 6d 70 5f 22 29 3b 0a 0a 20 20 20  rbu_imp_");..   
10f00 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65     /* Create the
10f10 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65 6e   INSERT statemen
10f20 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68  t to write to th
10f30 65 20 74 61 72 67 65 74 20 50 4b 20 62 2d 74 72  e target PK b-tr
10f40 65 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ee */.      if( 
10f50 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
10f60 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72   ){.        p->r
10f70 63 20 3d 20 70 72 65 70 61 72 65 46 72 65 65 41  c = prepareFreeA
10f80 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70  ndCollectError(p
10f90 2d 3e 64 62 4d 61 69 6e 2c 20 26 70 49 74 65 72  ->dbMain, &pIter
10fa0 2d 3e 70 49 6e 73 65 72 74 2c 20 70 7a 2c 0a 20  ->pInsert, pz,. 
10fb0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
10fc0 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20  e3_mprintf(.    
10fd0 20 20 20 20 20 20 20 20 20 20 22 49 4e 53 45 52            "INSER
10fe0 54 20 49 4e 54 4f 20 5c 22 25 73 25 77 5c 22 28  T INTO \"%s%w\"(
10ff0 25 73 25 73 29 20 56 41 4c 55 45 53 28 25 73 29  %s%s) VALUES(%s)
11000 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ", .            
11010 20 20 7a 57 72 69 74 65 2c 20 7a 54 62 6c 2c 20    zWrite, zTbl, 
11020 7a 43 6f 6c 6c 69 73 74 2c 20 28 62 52 62 75 52  zCollist, (bRbuR
11030 6f 77 69 64 20 3f 20 22 2c 20 5f 72 6f 77 69 64  owid ? ", _rowid
11040 5f 22 20 3a 20 22 22 29 2c 20 7a 42 69 6e 64 69  _" : ""), zBindi
11050 6e 67 73 0a 20 20 20 20 20 20 20 20 20 20 20 20  ngs.            
11060 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  ).        );.   
11070 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43     }..      /* C
11080 72 65 61 74 65 20 74 68 65 20 44 45 4c 45 54 45  reate the DELETE
11090 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 77 72   statement to wr
110a0 69 74 65 20 74 6f 20 74 68 65 20 74 61 72 67 65  ite to the targe
110b0 74 20 50 4b 20 62 2d 74 72 65 65 2e 0a 20 20 20  t PK b-tree..   
110c0 20 20 20 2a 2a 20 42 65 63 61 75 73 65 20 69 74     ** Because it
110d0 20 6f 6e 6c 79 20 70 65 72 66 6f 72 6d 73 20 49   only performs I
110e0 4e 53 45 52 54 20 6f 70 65 72 61 74 69 6f 6e 73  NSERT operations
110f0 2c 20 74 68 69 73 20 69 73 20 6e 6f 74 20 72 65  , this is not re
11100 71 75 69 72 65 64 20 66 6f 72 0a 20 20 20 20 20  quired for.     
11110 20 2a 2a 20 61 6e 20 72 62 75 20 76 61 63 75 75   ** an rbu vacuu
11120 6d 20 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20  m handle.  */.  
11130 20 20 20 20 69 66 28 20 72 62 75 49 73 56 61 63      if( rbuIsVac
11140 75 75 6d 28 70 29 3d 3d 30 20 26 26 20 70 2d 3e  uum(p)==0 && p->
11150 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
11160 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  .        p->rc =
11170 20 70 72 65 70 61 72 65 46 72 65 65 41 6e 64 43   prepareFreeAndC
11180 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64  ollectError(p->d
11190 62 4d 61 69 6e 2c 20 26 70 49 74 65 72 2d 3e 70  bMain, &pIter->p
111a0 44 65 6c 65 74 65 2c 20 70 7a 2c 0a 20 20 20 20  Delete, pz,.    
111b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
111c0 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20  mprintf(.       
111d0 20 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46         "DELETE F
111e0 52 4f 4d 20 5c 22 25 73 25 77 5c 22 20 57 48 45  ROM \"%s%w\" WHE
111f0 52 45 20 25 73 22 2c 20 7a 57 72 69 74 65 2c 20  RE %s", zWrite, 
11200 7a 54 62 6c 2c 20 7a 57 68 65 72 65 0a 20 20 20  zTbl, zWhere.   
11210 20 20 20 20 20 20 20 20 20 29 0a 20 20 20 20 20           ).     
11220 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20     );.      }.. 
11230 20 20 20 20 20 69 66 28 20 72 62 75 49 73 56 61       if( rbuIsVa
11240 63 75 75 6d 28 70 29 3d 3d 30 20 26 26 20 70 49  cuum(p)==0 && pI
11250 74 65 72 2d 3e 61 62 49 6e 64 65 78 65 64 20 29  ter->abIndexed )
11260 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
11270 63 68 61 72 20 2a 7a 52 62 75 52 6f 77 69 64 20  char *zRbuRowid 
11280 3d 20 22 22 3b 0a 20 20 20 20 20 20 20 20 69 66  = "";.        if
11290 28 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d  ( pIter->eType==
112a0 52 42 55 5f 50 4b 5f 45 58 54 45 52 4e 41 4c 20  RBU_PK_EXTERNAL 
112b0 7c 7c 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d  || pIter->eType=
112c0 3d 52 42 55 5f 50 4b 5f 4e 4f 4e 45 20 29 7b 0a  =RBU_PK_NONE ){.
112d0 20 20 20 20 20 20 20 20 20 20 7a 52 62 75 52 6f            zRbuRo
112e0 77 69 64 20 3d 20 22 2c 20 72 62 75 5f 72 6f 77  wid = ", rbu_row
112f0 69 64 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  id";.        }..
11300 20 20 20 20 20 20 20 20 2f 2a 20 43 72 65 61 74          /* Creat
11310 65 20 74 68 65 20 72 62 75 5f 74 6d 70 5f 78 78  e the rbu_tmp_xx
11320 78 20 74 61 62 6c 65 20 61 6e 64 20 74 68 65 20  x table and the 
11330 74 72 69 67 67 65 72 73 20 74 6f 20 70 6f 70 75  triggers to popu
11340 6c 61 74 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20  late it. */.    
11350 20 20 20 20 72 62 75 4d 50 72 69 6e 74 66 45 78      rbuMPrintfEx
11360 65 63 28 70 2c 20 70 2d 3e 64 62 52 62 75 2c 0a  ec(p, p->dbRbu,.
11370 20 20 20 20 20 20 20 20 20 20 20 20 22 43 52 45              "CRE
11380 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54  ATE TABLE IF NOT
11390 20 45 58 49 53 54 53 20 25 73 2e 27 72 62 75 5f   EXISTS %s.'rbu_
113a0 74 6d 70 5f 25 71 27 20 41 53 20 22 0a 20 20 20  tmp_%q' AS ".   
113b0 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54           "SELECT
113c0 20 2a 25 73 20 46 52 4f 4d 20 27 25 71 27 20 57   *%s FROM '%q' W
113d0 48 45 52 45 20 30 3b 22 0a 20 20 20 20 20 20 20  HERE 0;".       
113e0 20 20 20 20 20 2c 20 70 2d 3e 7a 53 74 61 74 65       , p->zState
113f0 44 62 2c 20 70 49 74 65 72 2d 3e 7a 44 61 74 61  Db, pIter->zData
11400 54 62 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20  Tbl.            
11410 2c 20 28 70 49 74 65 72 2d 3e 65 54 79 70 65 3d  , (pIter->eType=
11420 3d 52 42 55 5f 50 4b 5f 45 58 54 45 52 4e 41 4c  =RBU_PK_EXTERNAL
11430 20 3f 20 22 2c 20 30 20 41 53 20 72 62 75 5f 72   ? ", 0 AS rbu_r
11440 6f 77 69 64 22 20 3a 20 22 22 29 0a 20 20 20 20  owid" : "").    
11450 20 20 20 20 20 20 20 20 2c 20 70 49 74 65 72 2d          , pIter-
11460 3e 7a 44 61 74 61 54 62 6c 0a 20 20 20 20 20 20  >zDataTbl.      
11470 20 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 72 62    );..        rb
11480 75 4d 50 72 69 6e 74 66 45 78 65 63 28 70 2c 20  uMPrintfExec(p, 
11490 70 2d 3e 64 62 4d 61 69 6e 2c 0a 20 20 20 20 20  p->dbMain,.     
114a0 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20 54         "CREATE T
114b0 45 4d 50 20 54 52 49 47 47 45 52 20 72 62 75 5f  EMP TRIGGER rbu_
114c0 64 65 6c 65 74 65 5f 74 72 20 42 45 46 4f 52 45  delete_tr BEFORE
114d0 20 44 45 4c 45 54 45 20 4f 4e 20 5c 22 25 73 25   DELETE ON \"%s%
114e0 77 5c 22 20 22 0a 20 20 20 20 20 20 20 20 20 20  w\" ".          
114f0 20 20 22 42 45 47 49 4e 20 22 0a 20 20 20 20 20    "BEGIN ".     
11500 20 20 20 20 20 20 20 22 20 20 53 45 4c 45 43 54         "  SELECT
11510 20 72 62 75 5f 74 6d 70 5f 69 6e 73 65 72 74 28   rbu_tmp_insert(
11520 33 2c 20 25 73 29 3b 22 0a 20 20 20 20 20 20 20  3, %s);".       
11530 20 20 20 20 20 22 45 4e 44 3b 22 0a 0a 20 20 20       "END;"..   
11540 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45           "CREATE
11550 20 54 45 4d 50 20 54 52 49 47 47 45 52 20 72 62   TEMP TRIGGER rb
11560 75 5f 75 70 64 61 74 65 31 5f 74 72 20 42 45 46  u_update1_tr BEF
11570 4f 52 45 20 55 50 44 41 54 45 20 4f 4e 20 5c 22  ORE UPDATE ON \"
11580 25 73 25 77 5c 22 20 22 0a 20 20 20 20 20 20 20  %s%w\" ".       
11590 20 20 20 20 20 22 42 45 47 49 4e 20 22 0a 20 20       "BEGIN ".  
115a0 20 20 20 20 20 20 20 20 20 20 22 20 20 53 45 4c            "  SEL
115b0 45 43 54 20 72 62 75 5f 74 6d 70 5f 69 6e 73 65  ECT rbu_tmp_inse
115c0 72 74 28 33 2c 20 25 73 29 3b 22 0a 20 20 20 20  rt(3, %s);".    
115d0 20 20 20 20 20 20 20 20 22 45 4e 44 3b 22 0a 0a          "END;"..
115e0 20 20 20 20 20 20 20 20 20 20 20 20 22 43 52 45              "CRE
115f0 41 54 45 20 54 45 4d 50 20 54 52 49 47 47 45 52  ATE TEMP TRIGGER
11600 20 72 62 75 5f 75 70 64 61 74 65 32 5f 74 72 20   rbu_update2_tr 
11610 41 46 54 45 52 20 55 50 44 41 54 45 20 4f 4e 20  AFTER UPDATE ON 
11620 5c 22 25 73 25 77 5c 22 20 22 0a 20 20 20 20 20  \"%s%w\" ".     
11630 20 20 20 20 20 20 20 22 42 45 47 49 4e 20 22 0a         "BEGIN ".
11640 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20 53              "  S
11650 45 4c 45 43 54 20 72 62 75 5f 74 6d 70 5f 69 6e  ELECT rbu_tmp_in
11660 73 65 72 74 28 34 2c 20 25 73 29 3b 22 0a 20 20  sert(4, %s);".  
11670 20 20 20 20 20 20 20 20 20 20 22 45 4e 44 3b 22            "END;"
11680 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 57  ,.            zW
11690 72 69 74 65 2c 20 7a 54 62 6c 2c 20 7a 4f 6c 64  rite, zTbl, zOld
116a0 6c 69 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20  list,.          
116b0 20 20 7a 57 72 69 74 65 2c 20 7a 54 62 6c 2c 20    zWrite, zTbl, 
116c0 7a 4f 6c 64 6c 69 73 74 2c 0a 20 20 20 20 20 20  zOldlist,.      
116d0 20 20 20 20 20 20 7a 57 72 69 74 65 2c 20 7a 54        zWrite, zT
116e0 62 6c 2c 20 7a 4e 65 77 6c 69 73 74 0a 20 20 20  bl, zNewlist.   
116f0 20 20 20 20 20 29 3b 0a 0a 20 20 20 20 20 20 20       );..       
11700 20 69 66 28 20 70 49 74 65 72 2d 3e 65 54 79 70   if( pIter->eTyp
11710 65 3d 3d 52 42 55 5f 50 4b 5f 45 58 54 45 52 4e  e==RBU_PK_EXTERN
11720 41 4c 20 7c 7c 20 70 49 74 65 72 2d 3e 65 54 79  AL || pIter->eTy
11730 70 65 3d 3d 52 42 55 5f 50 4b 5f 4e 4f 4e 45 20  pe==RBU_PK_NONE 
11740 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 62 75  ){.          rbu
11750 4d 50 72 69 6e 74 66 45 78 65 63 28 70 2c 20 70  MPrintfExec(p, p
11760 2d 3e 64 62 4d 61 69 6e 2c 0a 20 20 20 20 20 20  ->dbMain,.      
11770 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20          "CREATE 
11780 54 45 4d 50 20 54 52 49 47 47 45 52 20 72 62 75  TEMP TRIGGER rbu
11790 5f 69 6e 73 65 72 74 5f 74 72 20 41 46 54 45 52  _insert_tr AFTER
117a0 20 49 4e 53 45 52 54 20 4f 4e 20 5c 22 25 73 25   INSERT ON \"%s%
117b0 77 5c 22 20 22 0a 20 20 20 20 20 20 20 20 20 20  w\" ".          
117c0 20 20 20 20 22 42 45 47 49 4e 20 22 0a 20 20 20      "BEGIN ".   
117d0 20 20 20 20 20 20 20 20 20 20 20 22 20 20 53 45             "  SE
117e0 4c 45 43 54 20 72 62 75 5f 74 6d 70 5f 69 6e 73  LECT rbu_tmp_ins
117f0 65 72 74 28 30 2c 20 25 73 29 3b 22 0a 20 20 20  ert(0, %s);".   
11800 20 20 20 20 20 20 20 20 20 20 20 22 45 4e 44 3b             "END;
11810 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
11820 20 7a 57 72 69 74 65 2c 20 7a 54 62 6c 2c 20 7a   zWrite, zTbl, z
11830 4e 65 77 6c 69 73 74 0a 20 20 20 20 20 20 20 20  Newlist.        
11840 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a    );.        }..
11850 20 20 20 20 20 20 20 20 72 62 75 4f 62 6a 49 74          rbuObjIt
11860 65 72 50 72 65 70 61 72 65 54 6d 70 49 6e 73 65  erPrepareTmpInse
11870 72 74 28 70 2c 20 70 49 74 65 72 2c 20 7a 43 6f  rt(p, pIter, zCo
11880 6c 6c 69 73 74 2c 20 7a 52 62 75 52 6f 77 69 64  llist, zRbuRowid
11890 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
118a0 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20    /* Create the 
118b0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
118c0 20 74 6f 20 72 65 61 64 20 6b 65 79 73 20 66 72   to read keys fr
118d0 6f 6d 20 64 61 74 61 5f 78 78 78 20 2a 2f 0a 20  om data_xxx */. 
118e0 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
118f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
11900 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
11910 2a 7a 52 62 75 52 6f 77 69 64 20 3d 20 22 22 3b  *zRbuRowid = "";
11920 0a 20 20 20 20 20 20 20 20 69 66 28 20 62 52 62  .        if( bRb
11930 75 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20  uRowid ){.      
11940 20 20 20 20 7a 52 62 75 52 6f 77 69 64 20 3d 20      zRbuRowid = 
11950 72 62 75 49 73 56 61 63 75 75 6d 28 70 29 20 3f  rbuIsVacuum(p) ?
11960 20 22 2c 5f 72 6f 77 69 64 5f 20 22 20 3a 20 22   ",_rowid_ " : "
11970 2c 72 62 75 5f 72 6f 77 69 64 22 3b 0a 20 20 20  ,rbu_rowid";.   
11980 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
11990 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65 46 72  ->rc = prepareFr
119a0 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f  eeAndCollectErro
119b0 72 28 70 2d 3e 64 62 52 62 75 2c 20 26 70 49 74  r(p->dbRbu, &pIt
119c0 65 72 2d 3e 70 53 65 6c 65 63 74 2c 20 70 7a 2c  er->pSelect, pz,
119d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
119e0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20  ite3_mprintf(.  
119f0 20 20 20 20 20 20 20 20 20 20 20 20 22 53 45 4c              "SEL
11a00 45 43 54 20 25 73 2c 25 73 20 72 62 75 5f 63 6f  ECT %s,%s rbu_co
11a10 6e 74 72 6f 6c 25 73 20 46 52 4f 4d 20 27 25 71  ntrol%s FROM '%q
11a20 27 25 73 22 2c 20 0a 20 20 20 20 20 20 20 20 20  '%s", .         
11a30 20 20 20 20 20 7a 43 6f 6c 6c 69 73 74 2c 20 0a       zCollist, .
11a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 72                (r
11a50 62 75 49 73 56 61 63 75 75 6d 28 70 29 20 3f 20  buIsVacuum(p) ? 
11a60 22 30 20 41 53 20 22 20 3a 20 22 22 29 2c 0a 20  "0 AS " : ""),. 
11a70 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 52 62               zRb
11a80 75 52 6f 77 69 64 2c 0a 20 20 20 20 20 20 20 20  uRowid,.        
11a90 20 20 20 20 20 20 70 49 74 65 72 2d 3e 7a 44 61        pIter->zDa
11aa0 74 61 54 62 6c 2c 20 7a 4c 69 6d 69 74 0a 20 20  taTbl, zLimit.  
11ab0 20 20 20 20 20 20 20 20 20 20 29 0a 20 20 20 20            ).    
11ac0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a      );.      }..
11ad0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
11ae0 65 65 28 7a 57 68 65 72 65 29 3b 0a 20 20 20 20  ee(zWhere);.    
11af0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
11b00 4f 6c 64 6c 69 73 74 29 3b 0a 20 20 20 20 20 20  Oldlist);.      
11b10 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e 65  sqlite3_free(zNe
11b20 77 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 73 71  wlist);.      sq
11b30 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 69 6e 64  lite3_free(zBind
11b40 69 6e 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ings);.    }.   
11b50 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
11b60 6f 6c 6c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c  ollist);.    sql
11b70 69 74 65 33 5f 66 72 65 65 28 7a 4c 69 6d 69 74  ite3_free(zLimit
11b80 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 72 65 74 75  );.  }.  .  retu
11b90 72 6e 20 70 2d 3e 72 63 3b 0a 7d 0a 0a 2f 2a 0a  rn p->rc;.}../*.
11ba0 2a 2a 20 53 65 74 20 6f 75 74 70 75 74 20 76 61  ** Set output va
11bb0 72 69 61 62 6c 65 20 2a 70 70 53 74 6d 74 20 74  riable *ppStmt t
11bc0 6f 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 55 50  o point to an UP
11bd0 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20 74  DATE statement t
11be0 68 61 74 20 6d 61 79 0a 2a 2a 20 62 65 20 75 73  hat may.** be us
11bf0 65 64 20 74 6f 20 75 70 64 61 74 65 20 74 68 65  ed to update the
11c00 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 20   imposter table 
11c10 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 74 61 62  for the main tab
11c20 6c 65 20 62 2d 74 72 65 65 20 6f 66 20 74 68 65  le b-tree of the
11c30 0a 2a 2a 20 74 61 62 6c 65 20 6f 62 6a 65 63 74  .** table object
11c40 20 74 68 61 74 20 70 49 74 65 72 20 63 75 72 72   that pIter curr
11c50 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2c  ently points to,
11c60 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20 74   assuming that t
11c70 68 65 20 0a 2a 2a 20 72 62 75 5f 63 6f 6e 74 72  he .** rbu_contr
11c80 6f 6c 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  ol column of the
11c90 20 64 61 74 61 5f 78 79 7a 20 74 61 62 6c 65 20   data_xyz table 
11ca0 63 6f 6e 74 61 69 6e 73 20 7a 4d 61 73 6b 2e 0a  contains zMask..
11cb0 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 7a 4d  ** .** If the zM
11cc0 61 73 6b 20 73 74 72 69 6e 67 20 64 6f 65 73 20  ask string does 
11cd0 6e 6f 74 20 73 70 65 63 69 66 79 20 61 6e 79 20  not specify any 
11ce0 63 6f 6c 75 6d 6e 73 20 74 6f 20 75 70 64 61 74  columns to updat
11cf0 65 2c 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20  e, then this.** 
11d00 69 73 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72 2e  is not an error.
11d10 20 4f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65   Output variable
11d20 20 2a 70 70 53 74 6d 74 20 69 73 20 73 65 74 20   *ppStmt is set 
11d30 74 6f 20 4e 55 4c 4c 20 69 6e 20 74 68 69 73 20  to NULL in this 
11d40 63 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  case..*/.static 
11d50 69 6e 74 20 72 62 75 47 65 74 55 70 64 61 74 65  int rbuGetUpdate
11d60 53 74 6d 74 28 0a 20 20 73 71 6c 69 74 65 33 72  Stmt(.  sqlite3r
11d70 62 75 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  bu *p,          
11d80 20 20 20 20 20 20 20 20 2f 2a 20 52 42 55 20 68          /* RBU h
11d90 61 6e 64 6c 65 20 2a 2f 0a 20 20 52 62 75 4f 62  andle */.  RbuOb
11da0 6a 49 74 65 72 20 2a 70 49 74 65 72 2c 20 20 20  jIter *pIter,   
11db0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62             /* Ob
11dc0 6a 65 63 74 20 69 74 65 72 61 74 6f 72 20 2a 2f  ject iterator */
11dd0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
11de0 4d 61 73 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Mask,           
11df0 20 20 20 2f 2a 20 72 62 75 5f 63 6f 6e 74 72 6f     /* rbu_contro
11e00 6c 20 76 61 6c 75 65 20 28 27 78 2e 78 2e 27 29  l value ('x.x.')
11e10 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
11e20 6d 74 20 2a 2a 70 70 53 74 6d 74 20 20 20 20 20  mt **ppStmt     
11e30 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 55 50        /* OUT: UP
11e40 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20 68  DATE statement h
11e50 61 6e 64 6c 65 20 2a 2f 0a 29 7b 0a 20 20 52 62  andle */.){.  Rb
11e60 75 55 70 64 61 74 65 53 74 6d 74 20 2a 2a 70 70  uUpdateStmt **pp
11e70 3b 0a 20 20 52 62 75 55 70 64 61 74 65 53 74 6d  ;.  RbuUpdateStm
11e80 74 20 2a 70 55 70 20 3d 20 30 3b 0a 20 20 69 6e  t *pUp = 0;.  in
11e90 74 20 6e 55 70 20 3d 20 30 3b 0a 0a 20 20 2f 2a  t nUp = 0;..  /*
11ea0 20 49 6e 20 63 61 73 65 20 61 6e 20 65 72 72 6f   In case an erro
11eb0 72 20 6f 63 63 75 72 73 20 2a 2f 0a 20 20 2a 70  r occurs */.  *p
11ec0 70 53 74 6d 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a  pStmt = 0;..  /*
11ed0 20 53 65 61 72 63 68 20 66 6f 72 20 61 6e 20 65   Search for an e
11ee0 78 69 73 74 69 6e 67 20 73 74 61 74 65 6d 65 6e  xisting statemen
11ef0 74 2e 20 49 66 20 6f 6e 65 20 69 73 20 66 6f 75  t. If one is fou
11f00 6e 64 2c 20 73 68 69 66 74 20 69 74 20 74 6f 20  nd, shift it to 
11f10 74 68 65 20 66 72 6f 6e 74 0a 20 20 2a 2a 20 6f  the front.  ** o
11f20 66 20 74 68 65 20 4c 52 55 20 71 75 65 75 65 20  f the LRU queue 
11f30 61 6e 64 20 72 65 74 75 72 6e 20 69 6d 6d 65 64  and return immed
11f40 69 61 74 65 6c 79 2e 20 4f 74 68 65 72 77 69 73  iately. Otherwis
11f50 65 2c 20 6c 65 61 76 65 20 6e 55 70 20 70 6f 69  e, leave nUp poi
11f60 6e 74 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 74 68  nting.  ** to th
11f70 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 74 61 74  e number of stat
11f80 65 6d 65 6e 74 73 20 63 75 72 72 65 6e 74 6c 79  ements currently
11f90 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 61 6e   in the cache an
11fa0 64 20 70 55 70 20 74 6f 20 74 68 65 0a 20 20 2a  d pUp to the.  *
11fb0 2a 20 6c 61 73 74 20 6f 62 6a 65 63 74 20 69 6e  * last object in
11fc0 20 74 68 65 20 6c 69 73 74 2e 20 20 2a 2f 0a 20   the list.  */. 
11fd0 20 66 6f 72 28 70 70 3d 26 70 49 74 65 72 2d 3e   for(pp=&pIter->
11fe0 70 52 62 75 55 70 64 61 74 65 3b 20 2a 70 70 3b  pRbuUpdate; *pp;
11ff0 20 70 70 3d 26 28 28 2a 70 70 29 2d 3e 70 4e 65   pp=&((*pp)->pNe
12000 78 74 29 29 7b 0a 20 20 20 20 70 55 70 20 3d 20  xt)){.    pUp = 
12010 2a 70 70 3b 0a 20 20 20 20 69 66 28 20 73 74 72  *pp;.    if( str
12020 63 6d 70 28 70 55 70 2d 3e 7a 4d 61 73 6b 2c 20  cmp(pUp->zMask, 
12030 7a 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20  zMask)==0 ){.   
12040 20 20 20 2a 70 70 20 3d 20 70 55 70 2d 3e 70 4e     *pp = pUp->pN
12050 65 78 74 3b 0a 20 20 20 20 20 20 70 55 70 2d 3e  ext;.      pUp->
12060 70 4e 65 78 74 20 3d 20 70 49 74 65 72 2d 3e 70  pNext = pIter->p
12070 52 62 75 55 70 64 61 74 65 3b 0a 20 20 20 20 20  RbuUpdate;.     
12080 20 70 49 74 65 72 2d 3e 70 52 62 75 55 70 64 61   pIter->pRbuUpda
12090 74 65 20 3d 20 70 55 70 3b 0a 20 20 20 20 20 20  te = pUp;.      
120a0 2a 70 70 53 74 6d 74 20 3d 20 70 55 70 2d 3e 70  *ppStmt = pUp->p
120b0 55 70 64 61 74 65 3b 20 0a 20 20 20 20 20 20 72  Update; .      r
120c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
120d0 0a 20 20 20 20 7d 0a 20 20 20 20 6e 55 70 2b 2b  .    }.    nUp++
120e0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
120f0 70 55 70 3d 3d 30 20 7c 7c 20 70 55 70 2d 3e 70  pUp==0 || pUp->p
12100 4e 65 78 74 3d 3d 30 20 29 3b 0a 0a 20 20 69 66  Next==0 );..  if
12110 28 20 6e 55 70 3e 3d 53 51 4c 49 54 45 5f 52 42  ( nUp>=SQLITE_RB
12120 55 5f 55 50 44 41 54 45 5f 43 41 43 48 45 53 49  U_UPDATE_CACHESI
12130 5a 45 20 29 7b 0a 20 20 20 20 66 6f 72 28 70 70  ZE ){.    for(pp
12140 3d 26 70 49 74 65 72 2d 3e 70 52 62 75 55 70 64  =&pIter->pRbuUpd
12150 61 74 65 3b 20 2a 70 70 21 3d 70 55 70 3b 20 70  ate; *pp!=pUp; p
12160 70 3d 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74  p=&((*pp)->pNext
12170 29 29 3b 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b  ));.    *pp = 0;
12180 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  .    sqlite3_fin
12190 61 6c 69 7a 65 28 70 55 70 2d 3e 70 55 70 64 61  alize(pUp->pUpda
121a0 74 65 29 3b 0a 20 20 20 20 70 55 70 2d 3e 70 55  te);.    pUp->pU
121b0 70 64 61 74 65 20 3d 20 30 3b 0a 20 20 7d 65 6c  pdate = 0;.  }el
121c0 73 65 7b 0a 20 20 20 20 70 55 70 20 3d 20 28 52  se{.    pUp = (R
121d0 62 75 55 70 64 61 74 65 53 74 6d 74 2a 29 72 62  buUpdateStmt*)rb
121e0 75 4d 61 6c 6c 6f 63 28 70 2c 20 73 69 7a 65 6f  uMalloc(p, sizeo
121f0 66 28 52 62 75 55 70 64 61 74 65 53 74 6d 74 29  f(RbuUpdateStmt)
12200 2b 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 2b  +pIter->nTblCol+
12210 31 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  1);.  }..  if( p
12220 55 70 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  Up ){.    char *
12230 7a 57 68 65 72 65 20 3d 20 72 62 75 4f 62 6a 49  zWhere = rbuObjI
12240 74 65 72 47 65 74 57 68 65 72 65 28 70 2c 20 70  terGetWhere(p, p
12250 49 74 65 72 29 3b 0a 20 20 20 20 63 68 61 72 20  Iter);.    char 
12260 2a 7a 53 65 74 20 3d 20 72 62 75 4f 62 6a 49 74  *zSet = rbuObjIt
12270 65 72 47 65 74 53 65 74 6c 69 73 74 28 70 2c 20  erGetSetlist(p, 
12280 70 49 74 65 72 2c 20 7a 4d 61 73 6b 29 3b 0a 20  pIter, zMask);. 
12290 20 20 20 63 68 61 72 20 2a 7a 55 70 64 61 74 65     char *zUpdate
122a0 20 3d 20 30 3b 0a 0a 20 20 20 20 70 55 70 2d 3e   = 0;..    pUp->
122b0 7a 4d 61 73 6b 20 3d 20 28 63 68 61 72 2a 29 26  zMask = (char*)&
122c0 70 55 70 5b 31 5d 3b 0a 20 20 20 20 6d 65 6d 63  pUp[1];.    memc
122d0 70 79 28 70 55 70 2d 3e 7a 4d 61 73 6b 2c 20 7a  py(pUp->zMask, z
122e0 4d 61 73 6b 2c 20 70 49 74 65 72 2d 3e 6e 54 62  Mask, pIter->nTb
122f0 6c 43 6f 6c 29 3b 0a 20 20 20 20 70 55 70 2d 3e  lCol);.    pUp->
12300 70 4e 65 78 74 20 3d 20 70 49 74 65 72 2d 3e 70  pNext = pIter->p
12310 52 62 75 55 70 64 61 74 65 3b 0a 20 20 20 20 70  RbuUpdate;.    p
12320 49 74 65 72 2d 3e 70 52 62 75 55 70 64 61 74 65  Iter->pRbuUpdate
12330 20 3d 20 70 55 70 3b 0a 0a 20 20 20 20 69 66 28   = pUp;..    if(
12340 20 7a 53 65 74 20 29 7b 0a 20 20 20 20 20 20 63   zSet ){.      c
12350 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 72 65 66  onst char *zPref
12360 69 78 20 3d 20 22 22 3b 0a 0a 20 20 20 20 20 20  ix = "";..      
12370 69 66 28 20 70 49 74 65 72 2d 3e 65 54 79 70 65  if( pIter->eType
12380 21 3d 52 42 55 5f 50 4b 5f 56 54 41 42 20 29 20  !=RBU_PK_VTAB ) 
12390 7a 50 72 65 66 69 78 20 3d 20 22 72 62 75 5f 69  zPrefix = "rbu_i
123a0 6d 70 5f 22 3b 0a 20 20 20 20 20 20 7a 55 70 64  mp_";.      zUpd
123b0 61 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ate = sqlite3_mp
123c0 72 69 6e 74 66 28 22 55 50 44 41 54 45 20 5c 22  rintf("UPDATE \"
123d0 25 73 25 77 5c 22 20 53 45 54 20 25 73 20 57 48  %s%w\" SET %s WH
123e0 45 52 45 20 25 73 22 2c 20 0a 20 20 20 20 20 20  ERE %s", .      
123f0 20 20 20 20 7a 50 72 65 66 69 78 2c 20 70 49 74      zPrefix, pIt
12400 65 72 2d 3e 7a 54 62 6c 2c 20 7a 53 65 74 2c 20  er->zTbl, zSet, 
12410 7a 57 68 65 72 65 0a 20 20 20 20 20 20 29 3b 0a  zWhere.      );.
12420 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 72        p->rc = pr
12430 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c  epareFreeAndColl
12440 65 63 74 45 72 72 6f 72 28 0a 20 20 20 20 20 20  ectError(.      
12450 20 20 20 20 70 2d 3e 64 62 4d 61 69 6e 2c 20 26      p->dbMain, &
12460 70 55 70 2d 3e 70 55 70 64 61 74 65 2c 20 26 70  pUp->pUpdate, &p
12470 2d 3e 7a 45 72 72 6d 73 67 2c 20 7a 55 70 64 61  ->zErrmsg, zUpda
12480 74 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  te.      );.    
12490 20 20 2a 70 70 53 74 6d 74 20 3d 20 70 55 70 2d    *ppStmt = pUp-
124a0 3e 70 55 70 64 61 74 65 3b 0a 20 20 20 20 7d 0a  >pUpdate;.    }.
124b0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
124c0 28 7a 57 68 65 72 65 29 3b 0a 20 20 20 20 73 71  (zWhere);.    sq
124d0 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 65 74 29  lite3_free(zSet)
124e0 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
124f0 70 2d 3e 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63  p->rc;.}..static
12500 20 73 71 6c 69 74 65 33 20 2a 72 62 75 4f 70 65   sqlite3 *rbuOpe
12510 6e 44 62 68 61 6e 64 6c 65 28 0a 20 20 73 71 6c  nDbhandle(.  sql
12520 69 74 65 33 72 62 75 20 2a 70 2c 20 0a 20 20 63  ite3rbu *p, .  c
12530 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
12540 2c 20 0a 20 20 69 6e 74 20 62 55 73 65 56 66 73  , .  int bUseVfs
12550 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
12560 62 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e  b = 0;.  if( p->
12570 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
12580 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 66  .    const int f
12590 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50  lags = SQLITE_OP
125a0 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c  EN_READWRITE|SQL
125b0 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c  ITE_OPEN_CREATE|
125c0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 3b  SQLITE_OPEN_URI;
125d0 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c  .    p->rc = sql
125e0 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 7a 4e 61  ite3_open_v2(zNa
125f0 6d 65 2c 20 26 64 62 2c 20 66 6c 61 67 73 2c 20  me, &db, flags, 
12600 62 55 73 65 56 66 73 20 3f 20 70 2d 3e 7a 56 66  bUseVfs ? p->zVf
12610 73 4e 61 6d 65 20 3a 20 30 29 3b 0a 20 20 20 20  sName : 0);.    
12620 69 66 28 20 70 2d 3e 72 63 20 29 7b 0a 20 20 20  if( p->rc ){.   
12630 20 20 20 70 2d 3e 7a 45 72 72 6d 73 67 20 3d 20     p->zErrmsg = 
12640 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
12650 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 65 72  "%s", sqlite3_er
12660 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 20 20 20  rmsg(db));.     
12670 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64   sqlite3_close(d
12680 62 29 3b 0a 20 20 20 20 20 20 64 62 20 3d 20 30  b);.      db = 0
12690 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
126a0 74 75 72 6e 20 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn db;.}../*.*
126b0 2a 20 46 72 65 65 20 61 6e 20 52 62 75 53 74 61  * Free an RbuSta
126c0 74 65 20 6f 62 6a 65 63 74 20 61 6c 6c 6f 63 61  te object alloca
126d0 74 65 64 20 62 79 20 72 62 75 4c 6f 61 64 53 74  ted by rbuLoadSt
126e0 61 74 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ate()..*/.static
126f0 20 76 6f 69 64 20 72 62 75 46 72 65 65 53 74 61   void rbuFreeSta
12700 74 65 28 52 62 75 53 74 61 74 65 20 2a 70 29 7b  te(RbuState *p){
12710 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
12720 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
12730 7a 54 62 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74  zTbl);.    sqlit
12740 65 33 5f 66 72 65 65 28 70 2d 3e 7a 49 64 78 29  e3_free(p->zIdx)
12750 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
12760 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ee(p);.  }.}../*
12770 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 20  .** Allocate an 
12780 52 62 75 53 74 61 74 65 20 6f 62 6a 65 63 74 20  RbuState object 
12790 61 6e 64 20 6c 6f 61 64 20 74 68 65 20 63 6f 6e  and load the con
127a0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 72 62 75  tents of the rbu
127b0 5f 73 74 61 74 65 20 0a 2a 2a 20 74 61 62 6c 65  _state .** table
127c0 20 69 6e 74 6f 20 69 74 2e 20 52 65 74 75 72 6e   into it. Return
127d0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
127e0 65 20 6e 65 77 20 6f 62 6a 65 63 74 2e 20 49 74  e new object. It
127f0 20 69 73 20 74 68 65 20 0a 2a 2a 20 72 65 73 70   is the .** resp
12800 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
12810 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e  e caller to even
12820 74 75 61 6c 6c 79 20 66 72 65 65 20 74 68 65 20  tually free the 
12830 6f 62 6a 65 63 74 20 75 73 69 6e 67 0a 2a 2a 20  object using.** 
12840 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a  sqlite3_free()..
12850 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
12860 72 20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65 20  r occurs, leave 
12870 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e  an error code an
12880 64 20 6d 65 73 73 61 67 65 20 69 6e 20 74 68 65  d message in the
12890 20 72 62 75 20 68 61 6e 64 6c 65 0a 2a 2a 20 61   rbu handle.** a
128a0 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a  nd return NULL..
128b0 2a 2f 0a 73 74 61 74 69 63 20 52 62 75 53 74 61  */.static RbuSta
128c0 74 65 20 2a 72 62 75 4c 6f 61 64 53 74 61 74 65  te *rbuLoadState
128d0 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 29 7b  (sqlite3rbu *p){
128e0 0a 20 20 52 62 75 53 74 61 74 65 20 2a 70 52 65  .  RbuState *pRe
128f0 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  t = 0;.  sqlite3
12900 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30  _stmt *pStmt = 0
12910 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  ;.  int rc;.  in
12920 74 20 72 63 32 3b 0a 0a 20 20 70 52 65 74 20 3d  t rc2;..  pRet =
12930 20 28 52 62 75 53 74 61 74 65 2a 29 72 62 75 4d   (RbuState*)rbuM
12940 61 6c 6c 6f 63 28 70 2c 20 73 69 7a 65 6f 66 28  alloc(p, sizeof(
12950 52 62 75 53 74 61 74 65 29 29 3b 0a 20 20 69 66  RbuState));.  if
12960 28 20 70 52 65 74 3d 3d 30 20 29 20 72 65 74 75  ( pRet==0 ) retu
12970 72 6e 20 30 3b 0a 0a 20 20 72 63 20 3d 20 70 72  rn 0;..  rc = pr
12980 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c  epareFreeAndColl
12990 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 52 62  ectError(p->dbRb
129a0 75 2c 20 26 70 53 74 6d 74 2c 20 26 70 2d 3e 7a  u, &pStmt, &p->z
129b0 45 72 72 6d 73 67 2c 20 0a 20 20 20 20 20 20 73  Errmsg, .      s
129c0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
129d0 53 45 4c 45 43 54 20 6b 2c 20 76 20 46 52 4f 4d  SELECT k, v FROM
129e0 20 25 73 2e 72 62 75 5f 73 74 61 74 65 22 2c 20   %s.rbu_state", 
129f0 70 2d 3e 7a 53 74 61 74 65 44 62 29 0a 20 20 29  p->zStateDb).  )
12a00 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53  ;.  while( rc==S
12a10 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49  QLITE_OK && SQLI
12a20 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
12a30 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20  step(pStmt) ){. 
12a40 20 20 20 73 77 69 74 63 68 28 20 73 71 6c 69 74     switch( sqlit
12a50 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53  e3_column_int(pS
12a60 74 6d 74 2c 20 30 29 20 29 7b 0a 20 20 20 20 20  tmt, 0) ){.     
12a70 20 63 61 73 65 20 52 42 55 5f 53 54 41 54 45 5f   case RBU_STATE_
12a80 53 54 41 47 45 3a 0a 20 20 20 20 20 20 20 20 70  STAGE:.        p
12a90 52 65 74 2d 3e 65 53 74 61 67 65 20 3d 20 73 71  Ret->eStage = sq
12aa0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
12ab0 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20  (pStmt, 1);.    
12ac0 20 20 20 20 69 66 28 20 70 52 65 74 2d 3e 65 53      if( pRet->eS
12ad0 74 61 67 65 21 3d 52 42 55 5f 53 54 41 47 45 5f  tage!=RBU_STAGE_
12ae0 4f 41 4c 0a 20 20 20 20 20 20 20 20 20 26 26 20  OAL.         && 
12af0 70 52 65 74 2d 3e 65 53 74 61 67 65 21 3d 52 42  pRet->eStage!=RB
12b00 55 5f 53 54 41 47 45 5f 4d 4f 56 45 0a 20 20 20  U_STAGE_MOVE.   
12b10 20 20 20 20 20 20 26 26 20 70 52 65 74 2d 3e 65        && pRet->e
12b20 53 74 61 67 65 21 3d 52 42 55 5f 53 54 41 47 45  Stage!=RBU_STAGE
12b30 5f 43 4b 50 54 0a 20 20 20 20 20 20 20 20 29 7b  _CKPT.        ){
12b40 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63  .          p->rc
12b50 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
12b60 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  T;.        }.   
12b70 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
12b80 20 20 20 63 61 73 65 20 52 42 55 5f 53 54 41 54     case RBU_STAT
12b90 45 5f 54 42 4c 3a 0a 20 20 20 20 20 20 20 20 70  E_TBL:.        p
12ba0 52 65 74 2d 3e 7a 54 62 6c 20 3d 20 72 62 75 53  Ret->zTbl = rbuS
12bb0 74 72 6e 64 75 70 28 28 63 68 61 72 2a 29 73 71  trndup((char*)sq
12bc0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
12bd0 74 28 70 53 74 6d 74 2c 20 31 29 2c 20 26 72 63  t(pStmt, 1), &rc
12be0 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
12bf0 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20 52 42  ;..      case RB
12c00 55 5f 53 54 41 54 45 5f 49 44 58 3a 0a 20 20 20  U_STATE_IDX:.   
12c10 20 20 20 20 20 70 52 65 74 2d 3e 7a 49 64 78 20       pRet->zIdx 
12c20 3d 20 72 62 75 53 74 72 6e 64 75 70 28 28 63 68  = rbuStrndup((ch
12c30 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
12c40 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31  mn_text(pStmt, 1
12c50 29 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20  ), &rc);.       
12c60 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 63   break;..      c
12c70 61 73 65 20 52 42 55 5f 53 54 41 54 45 5f 52 4f  ase RBU_STATE_RO
12c80 57 3a 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d  W:.        pRet-
12c90 3e 6e 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 5f  >nRow = sqlite3_
12ca0 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74  column_int(pStmt
12cb0 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 62 72  , 1);.        br
12cc0 65 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73 65  eak;..      case
12cd0 20 52 42 55 5f 53 54 41 54 45 5f 50 52 4f 47 52   RBU_STATE_PROGR
12ce0 45 53 53 3a 0a 20 20 20 20 20 20 20 20 70 52 65  ESS:.        pRe
12cf0 74 2d 3e 6e 50 72 6f 67 72 65 73 73 20 3d 20 73  t->nProgress = s
12d00 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
12d10 74 36 34 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20  t64(pStmt, 1);. 
12d20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20         break;.. 
12d30 20 20 20 20 20 63 61 73 65 20 52 42 55 5f 53 54       case RBU_ST
12d40 41 54 45 5f 43 4b 50 54 3a 0a 20 20 20 20 20 20  ATE_CKPT:.      
12d50 20 20 70 52 65 74 2d 3e 69 57 61 6c 43 6b 73 75    pRet->iWalCksu
12d60 6d 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  m = sqlite3_colu
12d70 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20  mn_int64(pStmt, 
12d80 31 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  1);.        brea
12d90 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20 52  k;..      case R
12da0 42 55 5f 53 54 41 54 45 5f 43 4f 4f 4b 49 45 3a  BU_STATE_COOKIE:
12db0 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e 69  .        pRet->i
12dc0 43 6f 6f 6b 69 65 20 3d 20 28 75 33 32 29 73 71  Cookie = (u32)sq
12dd0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
12de0 36 34 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20  64(pStmt, 1);.  
12df0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
12e00 20 20 20 20 63 61 73 65 20 52 42 55 5f 53 54 41      case RBU_STA
12e10 54 45 5f 4f 41 4c 53 5a 3a 0a 20 20 20 20 20 20  TE_OALSZ:.      
12e20 20 20 70 52 65 74 2d 3e 69 4f 61 6c 53 7a 20 3d    pRet->iOalSz =
12e30 20 28 75 33 32 29 73 71 6c 69 74 65 33 5f 63 6f   (u32)sqlite3_co
12e40 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74  lumn_int64(pStmt
12e50 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 62 72  , 1);.        br
12e60 65 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73 65  eak;..      case
12e70 20 52 42 55 5f 53 54 41 54 45 5f 50 48 41 53 45   RBU_STATE_PHASE
12e80 4f 4e 45 53 54 45 50 3a 0a 20 20 20 20 20 20 20  ONESTEP:.       
12e90 20 70 52 65 74 2d 3e 6e 50 68 61 73 65 4f 6e 65   pRet->nPhaseOne
12ea0 53 74 65 70 20 3d 20 73 71 6c 69 74 65 33 5f 63  Step = sqlite3_c
12eb0 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d  olumn_int64(pStm
12ec0 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 62  t, 1);.        b
12ed0 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 64 65 66  reak;..      def
12ee0 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 72 63  ault:.        rc
12ef0 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
12f00 54 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  T;.        break
12f10 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 63  ;.    }.  }.  rc
12f20 32 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  2 = sqlite3_fina
12f30 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 69  lize(pStmt);.  i
12f40 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
12f50 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 0a 20 20   ) rc = rc2;..  
12f60 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 72 65  p->rc = rc;.  re
12f70 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 0a 2f  turn pRet;.}.../
12f80 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 64 61  *.** Open the da
12f90 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 61 6e  tabase handle an
12fa0 64 20 61 74 74 61 63 68 20 74 68 65 20 52 42 55  d attach the RBU
12fb0 20 64 61 74 61 62 61 73 65 20 61 73 20 22 72 62   database as "rb
12fc0 75 22 2e 20 49 66 20 61 6e 0a 2a 2a 20 65 72 72  u". If an.** err
12fd0 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65  or occurs, leave
12fe0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 61   an error code a
12ff0 6e 64 20 6d 65 73 73 61 67 65 20 69 6e 20 74 68  nd message in th
13000 65 20 52 42 55 20 68 61 6e 64 6c 65 2e 0a 2a 2f  e RBU handle..*/
13010 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75  .static void rbu
13020 4f 70 65 6e 44 61 74 61 62 61 73 65 28 73 71 6c  OpenDatabase(sql
13030 69 74 65 33 72 62 75 20 2a 70 29 7b 0a 20 20 61  ite3rbu *p){.  a
13040 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51  ssert( p->rc==SQ
13050 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 61 73 73  LITE_OK );.  ass
13060 65 72 74 28 20 70 2d 3e 64 62 4d 61 69 6e 3d 3d  ert( p->dbMain==
13070 30 20 26 26 20 70 2d 3e 64 62 52 62 75 3d 3d 30  0 && p->dbRbu==0
13080 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 62   );.  assert( rb
13090 75 49 73 56 61 63 75 75 6d 28 70 29 20 7c 7c 20  uIsVacuum(p) || 
130a0 70 2d 3e 7a 54 61 72 67 65 74 21 3d 30 20 29 3b  p->zTarget!=0 );
130b0 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20  ..  /* Open the 
130c0 52 42 55 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  RBU database */.
130d0 20 20 70 2d 3e 64 62 52 62 75 20 3d 20 72 62 75    p->dbRbu = rbu
130e0 4f 70 65 6e 44 62 68 61 6e 64 6c 65 28 70 2c 20  OpenDbhandle(p, 
130f0 70 2d 3e 7a 52 62 75 2c 20 31 29 3b 0a 0a 20 20  p->zRbu, 1);..  
13100 69 66 28 20 72 62 75 49 73 56 61 63 75 75 6d 28  if( rbuIsVacuum(
13110 70 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  p) ){.    sqlite
13120 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 70  3_file_control(p
13130 2d 3e 64 62 52 62 75 2c 20 22 6d 61 69 6e 22 2c  ->dbRbu, "main",
13140 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 52 42   SQLITE_FCNTL_RB
13150 55 43 4e 54 2c 20 28 76 6f 69 64 2a 29 70 29 3b  UCNT, (void*)p);
13160 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 75 73  .  }..  /* If us
13170 69 6e 67 20 73 65 70 61 72 61 74 65 20 52 42 55  ing separate RBU
13180 20 61 6e 64 20 73 74 61 74 65 20 64 61 74 61 62   and state datab
13190 61 73 65 73 2c 20 61 74 74 61 63 68 20 74 68 65  ases, attach the
131a0 20 73 74 61 74 65 20 64 61 74 61 62 61 73 65 20   state database 
131b0 74 6f 0a 20 20 2a 2a 20 74 68 65 20 52 42 55 20  to.  ** the RBU 
131c0 64 62 20 68 61 6e 64 6c 65 20 6e 6f 77 2e 20 20  db handle now.  
131d0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 7a 53 74 61  */.  if( p->zSta
131e0 74 65 20 29 7b 0a 20 20 20 20 72 62 75 4d 50 72  te ){.    rbuMPr
131f0 69 6e 74 66 45 78 65 63 28 70 2c 20 70 2d 3e 64  intfExec(p, p->d
13200 62 52 62 75 2c 20 22 41 54 54 41 43 48 20 25 51  bRbu, "ATTACH %Q
13210 20 41 53 20 73 74 61 74 22 2c 20 70 2d 3e 7a 53   AS stat", p->zS
13220 74 61 74 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70  tate);.    memcp
13230 79 28 70 2d 3e 7a 53 74 61 74 65 44 62 2c 20 22  y(p->zStateDb, "
13240 73 74 61 74 22 2c 20 34 29 3b 0a 20 20 7d 65 6c  stat", 4);.  }el
13250 73 65 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  se{.    memcpy(p
13260 2d 3e 7a 53 74 61 74 65 44 62 2c 20 22 6d 61 69  ->zStateDb, "mai
13270 6e 22 2c 20 34 29 3b 0a 20 20 7d 0a 0a 20 20 2f  n", 4);.  }..  /
13280 2a 20 49 66 20 69 74 20 68 61 73 20 6e 6f 74 20  * If it has not 
13290 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 72 65  already been cre
132a0 61 74 65 64 2c 20 63 72 65 61 74 65 20 74 68 65  ated, create the
132b0 20 72 62 75 5f 73 74 61 74 65 20 74 61 62 6c 65   rbu_state table
132c0 20 2a 2f 0a 20 20 72 62 75 4d 50 72 69 6e 74 66   */.  rbuMPrintf
132d0 45 78 65 63 28 70 2c 20 70 2d 3e 64 62 52 62 75  Exec(p, p->dbRbu
132e0 2c 20 52 42 55 5f 43 52 45 41 54 45 5f 53 54 41  , RBU_CREATE_STA
132f0 54 45 2c 20 70 2d 3e 7a 53 74 61 74 65 44 62 29  TE, p->zStateDb)
13300 3b 0a 0a 20 20 69 66 28 20 72 62 75 49 73 56 61  ;..  if( rbuIsVa
13310 63 75 75 6d 28 70 29 20 29 7b 0a 20 20 20 20 69  cuum(p) ){.    i
13320 6e 74 20 62 4f 70 65 6e 20 3d 20 30 3b 0a 20 20  nt bOpen = 0;.  
13330 20 20 70 2d 3e 6e 52 62 75 20 3d 20 30 3b 0a 20    p->nRbu = 0;. 
13340 20 20 20 70 2d 3e 70 52 62 75 46 64 20 3d 20 30     p->pRbuFd = 0
13350 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  ;.    sqlite3_fi
13360 6c 65 5f 63 6f 6e 74 72 6f 6c 28 70 2d 3e 64 62  le_control(p->db
13370 52 62 75 2c 20 22 6d 61 69 6e 22 2c 20 53 51 4c  Rbu, "main", SQL
13380 49 54 45 5f 46 43 4e 54 4c 5f 52 42 55 43 4e 54  ITE_FCNTL_RBUCNT
13390 2c 20 28 76 6f 69 64 2a 29 70 29 3b 0a 20 20 20  , (void*)p);.   
133a0 20 69 66 28 20 70 2d 3e 65 53 74 61 67 65 3e 3d   if( p->eStage>=
133b0 52 42 55 5f 53 54 41 47 45 5f 4d 4f 56 45 20 29  RBU_STAGE_MOVE )
133c0 7b 0a 20 20 20 20 20 20 62 4f 70 65 6e 20 3d 20  {.      bOpen = 
133d0 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
133e0 20 20 20 20 52 62 75 53 74 61 74 65 20 2a 70 53      RbuState *pS
133f0 74 61 74 65 20 3d 20 72 62 75 4c 6f 61 64 53 74  tate = rbuLoadSt
13400 61 74 65 28 70 29 3b 0a 20 20 20 20 20 20 69 66  ate(p);.      if
13410 28 20 70 53 74 61 74 65 20 29 7b 0a 20 20 20 20  ( pState ){.    
13420 20 20 20 20 62 4f 70 65 6e 20 3d 20 28 70 53 74      bOpen = (pSt
13430 61 74 65 2d 3e 65 53 74 61 67 65 3e 52 42 55 5f  ate->eStage>RBU_
13440 53 54 41 47 45 5f 4d 4f 56 45 29 3b 0a 20 20 20  STAGE_MOVE);.   
13450 20 20 20 20 20 72 62 75 46 72 65 65 53 74 61 74       rbuFreeStat
13460 65 28 70 53 74 61 74 65 29 3b 0a 20 20 20 20 20  e(pState);.     
13470 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
13480 20 62 4f 70 65 6e 20 29 20 70 2d 3e 64 62 4d 61   bOpen ) p->dbMa
13490 69 6e 20 3d 20 72 62 75 4f 70 65 6e 44 62 68 61  in = rbuOpenDbha
134a0 6e 64 6c 65 28 70 2c 20 70 2d 3e 7a 52 62 75 2c  ndle(p, p->zRbu,
134b0 20 70 2d 3e 6e 52 62 75 3c 3d 31 29 3b 0a 20 20   p->nRbu<=1);.  
134c0 7d 0a 0a 20 20 70 2d 3e 65 53 74 61 67 65 20 3d  }..  p->eStage =
134d0 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 4d   0;.  if( p->dbM
134e0 61 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  ain==0 ){.    if
134f0 28 20 21 72 62 75 49 73 56 61 63 75 75 6d 28 70  ( !rbuIsVacuum(p
13500 29 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 64 62  ) ){.      p->db
13510 4d 61 69 6e 20 3d 20 72 62 75 4f 70 65 6e 44 62  Main = rbuOpenDb
13520 68 61 6e 64 6c 65 28 70 2c 20 70 2d 3e 7a 54 61  handle(p, p->zTa
13530 72 67 65 74 2c 20 31 29 3b 0a 20 20 20 20 7d 65  rget, 1);.    }e
13540 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20  lse{.      char 
13550 2a 7a 54 61 72 67 65 74 20 3d 20 73 71 6c 69 74  *zTarget = sqlit
13560 65 33 5f 6d 70 72 69 6e 74 66 28 22 66 69 6c 65  e3_mprintf("file
13570 3a 25 73 2d 76 61 63 75 75 6d 3f 72 62 75 5f 6d  :%s-vacuum?rbu_m
13580 65 6d 6f 72 79 3d 31 22 2c 20 70 2d 3e 7a 52 62  emory=1", p->zRb
13590 75 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 54  u);.      if( zT
135a0 61 72 67 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20  arget==0 ){.    
135b0 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
135c0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
135d0 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
135e0 7d 0a 20 20 20 20 20 20 70 2d 3e 64 62 4d 61 69  }.      p->dbMai
135f0 6e 20 3d 20 72 62 75 4f 70 65 6e 44 62 68 61 6e  n = rbuOpenDbhan
13600 64 6c 65 28 70 2c 20 7a 54 61 72 67 65 74 2c 20  dle(p, zTarget, 
13610 70 2d 3e 6e 52 62 75 3c 3d 31 29 3b 0a 20 20 20  p->nRbu<=1);.   
13620 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
13630 7a 54 61 72 67 65 74 29 3b 0a 20 20 20 20 7d 0a  zTarget);.    }.
13640 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63    }..  if( p->rc
13650 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
13660 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74     p->rc = sqlit
13670 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
13680 6f 6e 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 0a 20  on(p->dbMain, . 
13690 20 20 20 20 20 20 20 22 72 62 75 5f 74 6d 70 5f         "rbu_tmp_
136a0 69 6e 73 65 72 74 22 2c 20 2d 31 2c 20 53 51 4c  insert", -1, SQL
136b0 49 54 45 5f 55 54 46 38 2c 20 28 76 6f 69 64 2a  ITE_UTF8, (void*
136c0 29 70 2c 20 72 62 75 54 6d 70 49 6e 73 65 72 74  )p, rbuTmpInsert
136d0 46 75 6e 63 2c 20 30 2c 20 30 0a 20 20 20 20 29  Func, 0, 0.    )
136e0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e  ;.  }..  if( p->
136f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
13700 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c  .    p->rc = sql
13710 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
13720 74 69 6f 6e 28 70 2d 3e 64 62 4d 61 69 6e 2c 20  tion(p->dbMain, 
13730 0a 20 20 20 20 20 20 20 20 22 72 62 75 5f 66 6f  .        "rbu_fo
13740 73 73 69 6c 5f 64 65 6c 74 61 22 2c 20 32 2c 20  ssil_delta", 2, 
13750 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20  SQLITE_UTF8, 0, 
13760 72 62 75 46 6f 73 73 69 6c 44 65 6c 74 61 46 75  rbuFossilDeltaFu
13770 6e 63 2c 20 30 2c 20 30 0a 20 20 20 20 29 3b 0a  nc, 0, 0.    );.
13780 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63    }..  if( p->rc
13790 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
137a0 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74     p->rc = sqlit
137b0 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
137c0 6f 6e 28 70 2d 3e 64 62 52 62 75 2c 20 0a 20 20  on(p->dbRbu, .  
137d0 20 20 20 20 20 20 22 72 62 75 5f 74 61 72 67 65        "rbu_targe
137e0 74 5f 6e 61 6d 65 22 2c 20 2d 31 2c 20 53 51 4c  t_name", -1, SQL
137f0 49 54 45 5f 55 54 46 38 2c 20 28 76 6f 69 64 2a  ITE_UTF8, (void*
13800 29 70 2c 20 72 62 75 54 61 72 67 65 74 4e 61 6d  )p, rbuTargetNam
13810 65 46 75 6e 63 2c 20 30 2c 20 30 0a 20 20 20 20  eFunc, 0, 0.    
13820 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d  );.  }..  if( p-
13830 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
13840 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71  {.    p->rc = sq
13850 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
13860 6f 6c 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 6d  ol(p->dbMain, "m
13870 61 69 6e 22 2c 20 53 51 4c 49 54 45 5f 46 43 4e  ain", SQLITE_FCN
13880 54 4c 5f 52 42 55 2c 20 28 76 6f 69 64 2a 29 70  TL_RBU, (void*)p
13890 29 3b 0a 20 20 7d 0a 20 20 72 62 75 4d 50 72 69  );.  }.  rbuMPri
138a0 6e 74 66 45 78 65 63 28 70 2c 20 70 2d 3e 64 62  ntfExec(p, p->db
138b0 4d 61 69 6e 2c 20 22 53 45 4c 45 43 54 20 2a 20  Main, "SELECT * 
138c0 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
138d0 65 72 22 29 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b  er");..  /* Mark
138e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
138f0 6c 65 20 6a 75 73 74 20 6f 70 65 6e 65 64 20 61  le just opened a
13900 73 20 61 6e 20 52 42 55 20 74 61 72 67 65 74 20  s an RBU target 
13910 64 61 74 61 62 61 73 65 2e 20 49 66 20 0a 20 20  database. If .  
13920 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 72 65 74  ** this call ret
13930 75 72 6e 73 20 53 51 4c 49 54 45 5f 4e 4f 54 46  urns SQLITE_NOTF
13940 4f 55 4e 44 2c 20 74 68 65 6e 20 74 68 65 20 52  OUND, then the R
13950 42 55 20 76 66 73 20 69 73 20 6e 6f 74 20 69 6e  BU vfs is not in
13960 20 75 73 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20   use..  ** This 
13970 69 73 20 61 6e 20 65 72 72 6f 72 2e 20 20 2a 2f  is an error.  */
13980 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
13990 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
139a0 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66  ->rc = sqlite3_f
139b0 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 70 2d 3e 64  ile_control(p->d
139c0 62 4d 61 69 6e 2c 20 22 6d 61 69 6e 22 2c 20 53  bMain, "main", S
139d0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 52 42 55 2c  QLITE_FCNTL_RBU,
139e0 20 28 76 6f 69 64 2a 29 70 29 3b 0a 20 20 7d 0a   (void*)p);.  }.
139f0 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
13a00 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 7b  LITE_NOTFOUND ){
13a10 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  .    p->rc = SQL
13a20 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 70  ITE_ERROR;.    p
13a30 2d 3e 7a 45 72 72 6d 73 67 20 3d 20 73 71 6c 69  ->zErrmsg = sqli
13a40 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 72 62 75  te3_mprintf("rbu
13a50 20 76 66 73 20 6e 6f 74 20 66 6f 75 6e 64 22 29   vfs not found")
13a60 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
13a70 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
13a80 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 71 6c   copy of the sql
13a90 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33 28  ite3FileSuffix3(
13aa0 29 20 72 6f 75 74 69 6e 65 20 66 72 6f 6d 20 74  ) routine from t
13ab0 68 65 20 63 6f 72 65 2e 0a 2a 2a 20 49 74 20 69  he core..** It i
13ac0 73 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73  s a no-op unless
13ad0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 38   SQLITE_ENABLE_8
13ae0 5f 33 5f 4e 41 4d 45 53 20 69 73 20 64 65 66 69  _3_NAMES is defi
13af0 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51  ned..**.** If SQ
13b00 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 38 5f 33 5f  LITE_ENABLE_8_3_
13b10 4e 41 4d 45 53 20 69 73 20 73 65 74 20 61 74 20  NAMES is set at 
13b20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 61 6e 64  compile-time and
13b30 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
13b40 0a 2a 2a 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20  .** filename in 
13b50 7a 42 61 73 65 46 69 6c 65 6e 61 6d 65 20 69 73  zBaseFilename is
13b60 20 61 20 55 52 49 20 77 69 74 68 20 74 68 65 20   a URI with the 
13b70 22 38 5f 33 5f 6e 61 6d 65 73 3d 31 22 20 70 61  "8_3_names=1" pa
13b80 72 61 6d 65 74 65 72 20 61 6e 64 0a 2a 2a 20 69  rameter and.** i
13b90 66 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 7a 5b  f filename in z[
13ba0 5d 20 68 61 73 20 61 20 73 75 66 66 69 78 20 28  ] has a suffix (
13bb0 61 2e 6b 2e 61 2e 20 22 65 78 74 65 6e 73 69 6f  a.k.a. "extensio
13bc0 6e 22 29 20 74 68 61 74 20 69 73 20 6c 6f 6e 67  n") that is long
13bd0 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 72 65 65  er than.** three
13be0 20 63 68 61 72 61 63 74 65 72 73 2c 20 74 68 65   characters, the
13bf0 6e 20 73 68 6f 72 74 65 6e 20 74 68 65 20 73 75  n shorten the su
13c00 66 66 69 78 20 6f 6e 20 7a 5b 5d 20 74 6f 20 62  ffix on z[] to b
13c10 65 20 74 68 65 20 6c 61 73 74 20 74 68 72 65 65  e the last three
13c20 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 73 20 6f  .** characters o
13c30 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 73  f the original s
13c40 75 66 66 69 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  uffix..**.** If 
13c50 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 38 5f  SQLITE_ENABLE_8_
13c60 33 5f 4e 41 4d 45 53 20 69 73 20 73 65 74 20 74  3_NAMES is set t
13c70 6f 20 32 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74  o 2 at compile-t
13c80 69 6d 65 2c 20 74 68 65 6e 20 61 6c 77 61 79 73  ime, then always
13c90 0a 2a 2a 20 64 6f 20 74 68 65 20 73 75 66 66 69  .** do the suffi
13ca0 78 20 73 68 6f 72 74 65 6e 69 6e 67 20 72 65 67  x shortening reg
13cb0 61 72 64 6c 65 73 73 20 6f 66 20 55 52 49 20 70  ardless of URI p
13cc0 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  arameter..**.** 
13cd0 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20  Examples:.**.** 
13ce0 20 20 20 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72      test.db-jour
13cf0 6e 61 6c 20 20 20 20 3d 3e 20 20 20 74 65 73 74  nal    =>   test
13d00 2e 6e 61 6c 0a 2a 2a 20 20 20 20 20 74 65 73 74  .nal.**     test
13d10 2e 64 62 2d 77 61 6c 20 20 20 20 20 20 20 20 3d  .db-wal        =
13d20 3e 20 20 20 74 65 73 74 2e 77 61 6c 0a 2a 2a 20  >   test.wal.** 
13d30 20 20 20 20 74 65 73 74 2e 64 62 2d 73 68 6d 20      test.db-shm 
13d40 20 20 20 20 20 20 20 3d 3e 20 20 20 74 65 73 74         =>   test
13d50 2e 73 68 6d 0a 2a 2a 20 20 20 20 20 74 65 73 74  .shm.**     test
13d60 2e 64 62 2d 6d 6a 37 66 33 33 31 39 66 61 20 3d  .db-mj7f3319fa =
13d70 3e 20 20 20 74 65 73 74 2e 39 66 61 0a 2a 2f 0a  >   test.9fa.*/.
13d80 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75 46  static void rbuF
13d90 69 6c 65 53 75 66 66 69 78 33 28 63 6f 6e 73 74  ileSuffix3(const
13da0 20 63 68 61 72 20 2a 7a 42 61 73 65 2c 20 63 68   char *zBase, ch
13db0 61 72 20 2a 7a 29 7b 0a 23 69 66 64 65 66 20 53  ar *z){.#ifdef S
13dc0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 38 5f 33  QLITE_ENABLE_8_3
13dd0 5f 4e 41 4d 45 53 0a 23 69 66 20 53 51 4c 49 54  _NAMES.#if SQLIT
13de0 45 5f 45 4e 41 42 4c 45 5f 38 5f 33 5f 4e 41 4d  E_ENABLE_8_3_NAM
13df0 45 53 3c 32 0a 20 20 69 66 28 20 73 71 6c 69 74  ES<2.  if( sqlit
13e00 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 7a  e3_uri_boolean(z
13e10 42 61 73 65 2c 20 22 38 5f 33 5f 6e 61 6d 65 73  Base, "8_3_names
13e20 22 2c 20 30 29 20 29 0a 23 65 6e 64 69 66 0a 20  ", 0) ).#endif. 
13e30 20 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 73 7a   {.    int i, sz
13e40 3b 0a 20 20 20 20 73 7a 20 3d 20 73 71 6c 69 74  ;.    sz = sqlit
13e50 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20  e3Strlen30(z);. 
13e60 20 20 20 66 6f 72 28 69 3d 73 7a 2d 31 3b 20 69     for(i=sz-1; i
13e70 3e 30 20 26 26 20 7a 5b 69 5d 21 3d 27 2f 27 20  >0 && z[i]!='/' 
13e80 26 26 20 7a 5b 69 5d 21 3d 27 2e 27 3b 20 69 2d  && z[i]!='.'; i-
13e90 2d 29 7b 7d 0a 20 20 20 20 69 66 28 20 7a 5b 69  -){}.    if( z[i
13ea0 5d 3d 3d 27 2e 27 20 26 26 20 41 4c 57 41 59 53  ]=='.' && ALWAYS
13eb0 28 73 7a 3e 69 2b 34 29 20 29 20 6d 65 6d 6d 6f  (sz>i+4) ) memmo
13ec0 76 65 28 26 7a 5b 69 2b 31 5d 2c 20 26 7a 5b 73  ve(&z[i+1], &z[s
13ed0 7a 2d 33 5d 2c 20 34 29 3b 0a 20 20 7d 0a 23 65  z-3], 4);.  }.#e
13ee0 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ndif.}../*.** Re
13ef0 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74  turn the current
13f00 20 77 61 6c 2d 69 6e 64 65 78 20 68 65 61 64 65   wal-index heade
13f10 72 20 63 68 65 63 6b 73 75 6d 20 66 6f 72 20 74  r checksum for t
13f20 68 65 20 74 61 72 67 65 74 20 64 61 74 61 62 61  he target databa
13f30 73 65 20 0a 2a 2a 20 61 73 20 61 20 36 34 2d 62  se .** as a 64-b
13f40 69 74 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a  it integer..**.*
13f50 2a 20 54 68 65 20 63 68 65 63 6b 73 75 6d 20 69  * The checksum i
13f60 73 20 73 74 6f 72 65 20 69 6e 20 74 68 65 20 66  s store in the f
13f70 69 72 73 74 20 70 61 67 65 20 6f 66 20 78 53 68  irst page of xSh
13f80 6d 4d 61 70 20 6d 65 6d 6f 72 79 20 61 73 20 61  mMap memory as a
13f90 6e 20 38 2d 62 79 74 65 20 0a 2a 2a 20 62 6c 6f  n 8-byte .** blo
13fa0 62 20 73 74 61 72 74 69 6e 67 20 61 74 20 62 79  b starting at by
13fb0 74 65 20 6f 66 66 73 65 74 20 34 30 2e 0a 2a 2f  te offset 40..*/
13fc0 0a 73 74 61 74 69 63 20 69 36 34 20 72 62 75 53  .static i64 rbuS
13fd0 68 6d 43 68 65 63 6b 73 75 6d 28 73 71 6c 69 74  hmChecksum(sqlit
13fe0 65 33 72 62 75 20 2a 70 29 7b 0a 20 20 69 36 34  e3rbu *p){.  i64
13ff0 20 69 52 65 74 20 3d 20 30 3b 0a 20 20 69 66 28   iRet = 0;.  if(
14000 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
14010 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
14020 5f 66 69 6c 65 20 2a 70 44 62 20 3d 20 70 2d 3e  _file *pDb = p->
14030 70 54 61 72 67 65 74 46 64 2d 3e 70 52 65 61 6c  pTargetFd->pReal
14040 3b 0a 20 20 20 20 75 33 32 20 76 6f 6c 61 74 69  ;.    u32 volati
14050 6c 65 20 2a 70 74 72 3b 0a 20 20 20 20 70 2d 3e  le *ptr;.    p->
14060 72 63 20 3d 20 70 44 62 2d 3e 70 4d 65 74 68 6f  rc = pDb->pMetho
14070 64 73 2d 3e 78 53 68 6d 4d 61 70 28 70 44 62 2c  ds->xShmMap(pDb,
14080 20 30 2c 20 33 32 2a 31 30 32 34 2c 20 30 2c 20   0, 32*1024, 0, 
14090 28 76 6f 69 64 20 76 6f 6c 61 74 69 6c 65 2a 2a  (void volatile**
140a0 29 26 70 74 72 29 3b 0a 20 20 20 20 69 66 28 20  )&ptr);.    if( 
140b0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
140c0 20 29 7b 0a 20 20 20 20 20 20 69 52 65 74 20 3d   ){.      iRet =
140d0 20 28 28 69 36 34 29 70 74 72 5b 31 30 5d 20 3c   ((i64)ptr[10] <
140e0 3c 20 33 32 29 20 2b 20 70 74 72 5b 31 31 5d 3b  < 32) + ptr[11];
140f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
14100 75 72 6e 20 69 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a  urn iRet;.}../*.
14110 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
14120 20 69 73 20 63 61 6c 6c 65 64 20 61 73 20 70 61   is called as pa
14130 72 74 20 6f 66 20 69 6e 69 74 69 61 6c 69 7a 69  rt of initializi
14140 6e 67 20 6f 72 20 72 65 69 6e 69 74 69 61 6c 69  ng or reinitiali
14150 7a 69 6e 67 20 61 6e 0a 2a 2a 20 69 6e 63 72 65  zing an.** incre
14160 6d 65 6e 74 61 6c 20 63 68 65 63 6b 70 6f 69 6e  mental checkpoin
14170 74 2e 20 0a 2a 2a 0a 2a 2a 20 49 74 20 70 6f 70  t. .**.** It pop
14180 75 6c 61 74 65 73 20 74 68 65 20 73 71 6c 69 74  ulates the sqlit
14190 65 33 72 62 75 2e 61 46 72 61 6d 65 5b 5d 20 61  e3rbu.aFrame[] a
141a0 72 72 61 79 20 77 69 74 68 20 74 68 65 20 73 65  rray with the se
141b0 74 20 6f 66 20 0a 2a 2a 20 28 77 61 6c 20 66 72  t of .** (wal fr
141c0 61 6d 65 20 2d 3e 20 64 62 20 70 61 67 65 29 20  ame -> db page) 
141d0 63 6f 70 79 20 6f 70 65 72 61 74 69 6f 6e 73 20  copy operations 
141e0 72 65 71 75 69 72 65 64 20 74 6f 20 63 68 65 63  required to chec
141f0 6b 70 6f 69 6e 74 20 74 68 65 20 0a 2a 2a 20 63  kpoint the .** c
14200 75 72 72 65 6e 74 20 77 61 6c 20 66 69 6c 65 2c  urrent wal file,
14210 20 61 6e 64 20 6f 62 74 61 69 6e 73 20 74 68 65   and obtains the
14220 20 73 65 74 20 6f 66 20 73 68 6d 20 6c 6f 63 6b   set of shm lock
14230 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 73 61  s required to sa
14240 66 65 6c 79 20 0a 2a 2a 20 70 65 72 66 6f 72 6d  fely .** perform
14250 20 74 68 65 20 63 6f 70 79 20 6f 70 65 72 61 74   the copy operat
14260 69 6f 6e 73 20 64 69 72 65 63 74 6c 79 20 6f 6e  ions directly on
14270 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
14280 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d  ..**.** If argum
14290 65 6e 74 20 70 53 74 61 74 65 20 69 73 20 6e 6f  ent pState is no
142a0 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65  t NULL, then the
142b0 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 63 68 65   incremental che
142c0 63 6b 70 6f 69 6e 74 20 69 73 0a 2a 2a 20 62 65  ckpoint is.** be
142d0 69 6e 67 20 72 65 73 75 6d 65 64 2e 20 49 6e 20  ing resumed. In 
142e0 74 68 69 73 20 63 61 73 65 2c 20 69 66 20 74 68  this case, if th
142f0 65 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 74 68  e checksum of th
14300 65 20 77 61 6c 2d 69 6e 64 65 78 2d 68 65 61 64  e wal-index-head
14310 65 72 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  er.** following 
14320 72 65 63 6f 76 65 72 79 20 69 73 20 6e 6f 74 20  recovery is not 
14330 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
14340 63 68 65 63 6b 73 75 6d 20 73 61 76 65 64 20 69  checksum saved i
14350 6e 20 74 68 65 20 52 62 75 53 74 61 74 65 0a 2a  n the RbuState.*
14360 2a 20 6f 62 6a 65 63 74 2c 20 74 68 65 6e 20 74  * object, then t
14370 68 65 20 72 62 75 20 68 61 6e 64 6c 65 20 69 73  he rbu handle is
14380 20 73 65 74 20 74 6f 20 44 4f 4e 45 20 73 74 61   set to DONE sta
14390 74 65 2e 20 54 68 69 73 20 6f 63 63 75 72 73 20  te. This occurs 
143a0 69 66 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72  if some.** other
143b0 20 63 6c 69 65 6e 74 20 61 70 70 65 6e 64 73 20   client appends 
143c0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f  a transaction to
143d0 20 74 68 65 20 77 61 6c 20 66 69 6c 65 20 69 6e   the wal file in
143e0 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a   the middle of.*
143f0 2a 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  * an incremental
14400 20 63 68 65 63 6b 70 6f 69 6e 74 2e 0a 2a 2f 0a   checkpoint..*/.
14410 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75 53  static void rbuS
14420 65 74 75 70 43 68 65 63 6b 70 6f 69 6e 74 28 73  etupCheckpoint(s
14430 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 52 62  qlite3rbu *p, Rb
14440 75 53 74 61 74 65 20 2a 70 53 74 61 74 65 29 7b  uState *pState){
14450 0a 0a 20 20 2f 2a 20 49 66 20 70 53 74 61 74 65  ..  /* If pState
14460 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74   is NULL, then t
14470 68 65 20 77 61 6c 20 66 69 6c 65 20 6d 61 79 20  he wal file may 
14480 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70  not have been op
14490 65 6e 65 64 20 61 6e 64 0a 20 20 2a 2a 20 72 65  ened and.  ** re
144a0 63 6f 76 65 72 65 64 2e 20 52 75 6e 6e 69 6e 67  covered. Running
144b0 20 61 20 72 65 61 64 2d 73 74 61 74 65 6d 65 6e   a read-statemen
144c0 74 20 68 65 72 65 20 74 6f 20 65 6e 73 75 72 65  t here to ensure
144d0 20 74 68 61 74 20 64 6f 69 6e 67 20 73 6f 0a 20   that doing so. 
144e0 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 69 6e 74   ** does not int
144f0 65 72 66 65 72 65 20 77 69 74 68 20 74 68 65 20  erfere with the 
14500 22 63 61 70 74 75 72 65 22 20 70 72 6f 63 65 73  "capture" proces
14510 73 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20 69  s below.  */.  i
14520 66 28 20 70 53 74 61 74 65 3d 3d 30 20 29 7b 0a  f( pState==0 ){.
14530 20 20 20 20 70 2d 3e 65 53 74 61 67 65 20 3d 20      p->eStage = 
14540 30 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  0;.    if( p->rc
14550 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
14560 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c       p->rc = sql
14570 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 4d  ite3_exec(p->dbM
14580 61 69 6e 2c 20 22 53 45 4c 45 43 54 20 2a 20 46  ain, "SELECT * F
14590 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
145a0 72 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  r", 0, 0, 0);.  
145b0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 73    }.  }..  /* As
145c0 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72 20  suming no error 
145d0 68 61 73 20 6f 63 63 75 72 72 65 64 2c 20 72 75  has occurred, ru
145e0 6e 20 61 20 22 72 65 73 74 61 72 74 22 20 63 68  n a "restart" ch
145f0 65 63 6b 70 6f 69 6e 74 20 77 69 74 68 20 74 68  eckpoint with th
14600 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 72 62  e.  ** sqlite3rb
14610 75 2e 65 53 74 61 67 65 20 76 61 72 69 61 62 6c  u.eStage variabl
14620 65 20 73 65 74 20 74 6f 20 43 41 50 54 55 52 45  e set to CAPTURE
14630 2e 20 54 68 69 73 20 74 75 72 6e 73 20 6f 6e 20  . This turns on 
14640 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20  the following.  
14650 2a 2a 20 73 70 65 63 69 61 6c 20 62 65 68 61 76  ** special behav
14660 69 6f 75 72 20 69 6e 20 74 68 65 20 72 62 75 20  iour in the rbu 
14670 56 46 53 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  VFS:.  **.  **  
14680 20 2a 20 49 66 20 74 68 65 20 65 78 63 6c 75 73   * If the exclus
14690 69 76 65 20 73 68 6d 20 57 52 49 54 45 52 20 6f  ive shm WRITER o
146a0 72 20 52 45 41 44 30 20 6c 6f 63 6b 20 63 61 6e  r READ0 lock can
146b0 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2c  not be obtained,
146c0 0a 20 20 2a 2a 20 20 20 20 20 74 68 65 20 63 68  .  **     the ch
146d0 65 63 6b 70 6f 69 6e 74 20 66 61 69 6c 73 20 77  eckpoint fails w
146e0 69 74 68 20 53 51 4c 49 54 45 5f 42 55 53 59 20  ith SQLITE_BUSY 
146f0 28 6e 6f 72 6d 61 6c 6c 79 20 53 51 4c 69 74 65  (normally SQLite
14700 20 77 6f 75 6c 64 0a 20 20 2a 2a 20 20 20 20 20   would.  **     
14710 70 72 6f 63 65 65 64 20 77 69 74 68 20 72 75 6e  proceed with run
14720 6e 69 6e 67 20 61 20 70 61 73 73 69 76 65 20 63  ning a passive c
14730 68 65 63 6b 70 6f 69 6e 74 20 69 6e 73 74 65 61  heckpoint instea
14740 64 20 6f 66 20 66 61 69 6c 69 6e 67 29 2e 0a 20  d of failing).. 
14750 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 41 74 74   **.  **   * Att
14760 65 6d 70 74 73 20 74 6f 20 72 65 61 64 20 66 72  empts to read fr
14770 6f 6d 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c  om the *-wal fil
14780 65 20 6f 72 20 77 72 69 74 65 20 74 6f 20 74 68  e or write to th
14790 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a  e database file.
147a0 20 20 2a 2a 20 20 20 20 20 64 6f 20 6e 6f 74 20    **     do not 
147b0 70 65 72 66 6f 72 6d 20 61 6e 79 20 49 4f 2e 20  perform any IO. 
147c0 49 6e 73 74 65 61 64 2c 20 74 68 65 20 66 72 61  Instead, the fra
147d0 6d 65 2f 70 61 67 65 20 63 6f 6d 62 69 6e 61 74  me/page combinat
147e0 69 6f 6e 73 20 74 68 61 74 0a 20 20 2a 2a 20 20  ions that.  **  
147f0 20 20 20 77 6f 75 6c 64 20 62 65 20 72 65 61 64     would be read
14800 2f 77 72 69 74 74 65 6e 20 61 72 65 20 72 65 63  /written are rec
14810 6f 72 64 65 64 20 69 6e 20 74 68 65 20 73 71 6c  orded in the sql
14820 69 74 65 33 72 62 75 2e 61 46 72 61 6d 65 5b 5d  ite3rbu.aFrame[]
14830 0a 20 20 2a 2a 20 20 20 20 20 61 72 72 61 79 2e  .  **     array.
14840 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 43  .  **.  **   * C
14850 61 6c 6c 73 20 74 6f 20 78 53 68 6d 4c 6f 63 6b  alls to xShmLock
14860 28 55 4e 4c 4f 43 4b 29 20 74 6f 20 72 65 6c 65  (UNLOCK) to rele
14870 61 73 65 20 74 68 65 20 65 78 63 6c 75 73 69 76  ase the exclusiv
14880 65 20 73 68 6d 20 57 52 49 54 45 52 2c 20 0a 20  e shm WRITER, . 
14890 20 2a 2a 20 20 20 20 20 52 45 41 44 30 20 61 6e   **     READ0 an
148a0 64 20 43 48 45 43 4b 50 4f 49 4e 54 20 6c 6f 63  d CHECKPOINT loc
148b0 6b 73 20 74 61 6b 65 6e 20 61 73 20 70 61 72 74  ks taken as part
148c0 20 6f 66 20 74 68 65 20 63 68 65 63 6b 70 6f 69   of the checkpoi
148d0 6e 74 20 61 72 65 0a 20 20 2a 2a 20 20 20 20 20  nt are.  **     
148e0 6e 6f 2d 6f 70 73 2e 20 54 68 65 73 65 20 6c 6f  no-ops. These lo
148f0 63 6b 73 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  cks will not be 
14900 72 65 6c 65 61 73 65 64 20 75 6e 74 69 6c 20 74  released until t
14910 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20  he connection.  
14920 2a 2a 20 20 20 20 20 69 73 20 63 6c 6f 73 65 64  **     is closed
14930 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20  ..  **.  **   * 
14940 41 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 78 53  Attempting to xS
14950 79 6e 63 28 29 20 74 68 65 20 64 61 74 61 62 61  ync() the databa
14960 73 65 20 66 69 6c 65 20 63 61 75 73 65 73 20 61  se file causes a
14970 6e 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41  n SQLITE_INTERNA
14980 4c 20 0a 20 20 2a 2a 20 20 20 20 20 65 72 72 6f  L .  **     erro
14990 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 73 20  r..  **.  ** As 
149a0 61 20 72 65 73 75 6c 74 2c 20 75 6e 6c 65 73 73  a result, unless
149b0 20 61 6e 20 65 72 72 6f 72 20 28 69 2e 65 2e 20   an error (i.e. 
149c0 4f 4f 4d 20 6f 72 20 53 51 4c 49 54 45 5f 42 55  OOM or SQLITE_BU
149d0 53 59 29 20 6f 63 63 75 72 73 2c 20 74 68 65 0a  SY) occurs, the.
149e0 20 20 2a 2a 20 63 68 65 63 6b 70 6f 69 6e 74 20    ** checkpoint 
149f0 62 65 6c 6f 77 20 66 61 69 6c 73 20 77 69 74 68  below fails with
14a00 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c   SQLITE_INTERNAL
14a10 2c 20 61 6e 64 20 6c 65 61 76 65 73 20 74 68 65  , and leaves the
14a20 20 61 46 72 61 6d 65 5b 5d 0a 20 20 2a 2a 20 61   aFrame[].  ** a
14a30 72 72 61 79 20 70 6f 70 75 6c 61 74 65 64 20 77  rray populated w
14a40 69 74 68 20 61 20 73 65 74 20 6f 66 20 28 66 72  ith a set of (fr
14a50 61 6d 65 20 2d 3e 20 70 61 67 65 29 20 6d 61 70  ame -> page) map
14a60 70 69 6e 67 73 2e 20 42 65 63 61 75 73 65 20 74  pings. Because t
14a70 68 65 20 0a 20 20 2a 2a 20 57 52 49 54 45 52 2c  he .  ** WRITER,
14a80 20 43 48 45 43 4b 50 4f 49 4e 54 20 61 6e 64 20   CHECKPOINT and 
14a90 52 45 41 44 30 20 6c 6f 63 6b 73 20 61 72 65 20  READ0 locks are 
14aa0 73 74 69 6c 6c 20 68 65 6c 64 2c 20 69 74 20 69  still held, it i
14ab0 73 20 73 61 66 65 20 74 6f 20 63 6f 70 79 20 0a  s safe to copy .
14ac0 20 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74    ** data from t
14ad0 68 65 20 77 61 6c 20 66 69 6c 65 20 69 6e 74 6f  he wal file into
14ae0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
14af0 6c 65 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  le according to 
14b00 74 68 65 20 0a 20 20 2a 2a 20 63 6f 6e 74 65 6e  the .  ** conten
14b10 74 73 20 6f 66 20 61 46 72 61 6d 65 5b 5d 2e 0a  ts of aFrame[]..
14b20 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 72 63    */.  if( p->rc
14b30 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
14b40 20 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 20 20     int rc2;.    
14b50 70 2d 3e 65 53 74 61 67 65 20 3d 20 52 42 55 5f  p->eStage = RBU_
14b60 53 54 41 47 45 5f 43 41 50 54 55 52 45 3b 0a 20  STAGE_CAPTURE;. 
14b70 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33     rc2 = sqlite3
14b80 5f 65 78 65 63 28 70 2d 3e 64 62 4d 61 69 6e 2c  _exec(p->dbMain,
14b90 20 22 50 52 41 47 4d 41 20 6d 61 69 6e 2e 77 61   "PRAGMA main.wa
14ba0 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 3d 72 65 73  l_checkpoint=res
14bb0 74 61 72 74 22 2c 20 30 2c 20 30 2c 30 29 3b 0a  tart", 0, 0,0);.
14bc0 20 20 20 20 69 66 28 20 72 63 32 21 3d 53 51 4c      if( rc2!=SQL
14bd0 49 54 45 5f 49 4e 54 45 52 4e 41 4c 20 29 20 70  ITE_INTERNAL ) p
14be0 2d 3e 72 63 20 3d 20 72 63 32 3b 0a 20 20 7d 0a  ->rc = rc2;.  }.
14bf0 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
14c00 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
14c10 2d 3e 65 53 74 61 67 65 20 3d 20 52 42 55 5f 53  ->eStage = RBU_S
14c20 54 41 47 45 5f 43 4b 50 54 3b 0a 20 20 20 20 70  TAGE_CKPT;.    p
14c30 2d 3e 6e 53 74 65 70 20 3d 20 28 70 53 74 61 74  ->nStep = (pStat
14c40 65 20 3f 20 70 53 74 61 74 65 2d 3e 6e 52 6f 77  e ? pState->nRow
14c50 20 3a 20 30 29 3b 0a 20 20 20 20 70 2d 3e 61 42   : 0);.    p->aB
14c60 75 66 20 3d 20 72 62 75 4d 61 6c 6c 6f 63 28 70  uf = rbuMalloc(p
14c70 2c 20 70 2d 3e 70 67 73 7a 29 3b 0a 20 20 20 20  , p->pgsz);.    
14c80 70 2d 3e 69 57 61 6c 43 6b 73 75 6d 20 3d 20 72  p->iWalCksum = r
14c90 62 75 53 68 6d 43 68 65 63 6b 73 75 6d 28 70 29  buShmChecksum(p)
14ca0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e  ;.  }..  if( p->
14cb0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
14cc0 20 70 53 74 61 74 65 20 26 26 20 70 53 74 61 74   pState && pStat
14cd0 65 2d 3e 69 57 61 6c 43 6b 73 75 6d 21 3d 70 2d  e->iWalCksum!=p-
14ce0 3e 69 57 61 6c 43 6b 73 75 6d 20 29 7b 0a 20 20  >iWalCksum ){.  
14cf0 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
14d00 5f 44 4f 4e 45 3b 0a 20 20 20 20 70 2d 3e 65 53  _DONE;.    p->eS
14d10 74 61 67 65 20 3d 20 52 42 55 5f 53 54 41 47 45  tage = RBU_STAGE
14d20 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  _DONE;.  }.}../*
14d30 0a 2a 2a 20 43 61 6c 6c 65 64 20 77 68 65 6e 20  .** Called when 
14d40 69 41 6d 74 20 62 79 74 65 73 20 61 72 65 20 72  iAmt bytes are r
14d50 65 61 64 20 66 72 6f 6d 20 6f 66 66 73 65 74 20  ead from offset 
14d60 69 4f 66 66 20 6f 66 20 74 68 65 20 77 61 6c 20  iOff of the wal 
14d70 66 69 6c 65 20 77 68 69 6c 65 0a 2a 2a 20 74 68  file while.** th
14d80 65 20 72 62 75 20 6f 62 6a 65 63 74 20 69 73 20  e rbu object is 
14d90 69 6e 20 63 61 70 74 75 72 65 20 6d 6f 64 65 2e  in capture mode.
14da0 20 52 65 63 6f 72 64 20 74 68 65 20 66 72 61 6d   Record the fram
14db0 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
14dc0 66 72 61 6d 65 0a 2a 2a 20 62 65 69 6e 67 20 72  frame.** being r
14dd0 65 61 64 20 69 6e 20 74 68 65 20 61 46 72 61 6d  ead in the aFram
14de0 65 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74  e[] array..*/.st
14df0 61 74 69 63 20 69 6e 74 20 72 62 75 43 61 70 74  atic int rbuCapt
14e00 75 72 65 57 61 6c 52 65 61 64 28 73 71 6c 69 74  ureWalRead(sqlit
14e10 65 33 72 62 75 20 2a 70 52 62 75 2c 20 69 36 34  e3rbu *pRbu, i64
14e20 20 69 4f 66 66 2c 20 69 6e 74 20 69 41 6d 74 29   iOff, int iAmt)
14e30 7b 0a 20 20 63 6f 6e 73 74 20 75 33 32 20 6d 52  {.  const u32 mR
14e40 65 71 20 3d 20 28 31 3c 3c 57 41 4c 5f 4c 4f 43  eq = (1<<WAL_LOC
14e50 4b 5f 57 52 49 54 45 29 7c 28 31 3c 3c 57 41 4c  K_WRITE)|(1<<WAL
14e60 5f 4c 4f 43 4b 5f 43 4b 50 54 29 7c 28 31 3c 3c  _LOCK_CKPT)|(1<<
14e70 57 41 4c 5f 4c 4f 43 4b 5f 52 45 41 44 30 29 3b  WAL_LOCK_READ0);
14e80 0a 20 20 75 33 32 20 69 46 72 61 6d 65 3b 0a 0a  .  u32 iFrame;..
14e90 20 20 69 66 28 20 70 52 62 75 2d 3e 6d 4c 6f 63    if( pRbu->mLoc
14ea0 6b 21 3d 6d 52 65 71 20 29 7b 0a 20 20 20 20 70  k!=mReq ){.    p
14eb0 52 62 75 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45  Rbu->rc = SQLITE
14ec0 5f 42 55 53 59 3b 0a 20 20 20 20 72 65 74 75 72  _BUSY;.    retur
14ed0 6e 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41  n SQLITE_INTERNA
14ee0 4c 3b 0a 20 20 7d 0a 0a 20 20 70 52 62 75 2d 3e  L;.  }..  pRbu->
14ef0 70 67 73 7a 20 3d 20 69 41 6d 74 3b 0a 20 20 69  pgsz = iAmt;.  i
14f00 66 28 20 70 52 62 75 2d 3e 6e 46 72 61 6d 65 3d  f( pRbu->nFrame=
14f10 3d 70 52 62 75 2d 3e 6e 46 72 61 6d 65 41 6c 6c  =pRbu->nFrameAll
14f20 6f 63 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 4e  oc ){.    int nN
14f30 65 77 20 3d 20 28 70 52 62 75 2d 3e 6e 46 72 61  ew = (pRbu->nFra
14f40 6d 65 41 6c 6c 6f 63 20 3f 20 70 52 62 75 2d 3e  meAlloc ? pRbu->
14f50 6e 46 72 61 6d 65 41 6c 6c 6f 63 20 3a 20 36 34  nFrameAlloc : 64
14f60 29 20 2a 20 32 3b 0a 20 20 20 20 52 62 75 46 72  ) * 2;.    RbuFr
14f70 61 6d 65 20 2a 61 4e 65 77 3b 0a 20 20 20 20 61  ame *aNew;.    a
14f80 4e 65 77 20 3d 20 28 52 62 75 46 72 61 6d 65 2a  New = (RbuFrame*
14f90 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63  )sqlite3_realloc
14fa0 36 34 28 70 52 62 75 2d 3e 61 46 72 61 6d 65 2c  64(pRbu->aFrame,
14fb0 20 6e 4e 65 77 20 2a 20 73 69 7a 65 6f 66 28 52   nNew * sizeof(R
14fc0 62 75 46 72 61 6d 65 29 29 3b 0a 20 20 20 20 69  buFrame));.    i
14fd0 66 28 20 61 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( aNew==0 ) ret
14fe0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
14ff0 3b 0a 20 20 20 20 70 52 62 75 2d 3e 61 46 72 61  ;.    pRbu->aFra
15000 6d 65 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 70  me = aNew;.    p
15010 52 62 75 2d 3e 6e 46 72 61 6d 65 41 6c 6c 6f 63  Rbu->nFrameAlloc
15020 20 3d 20 6e 4e 65 77 3b 0a 20 20 7d 0a 0a 20 20   = nNew;.  }..  
15030 69 46 72 61 6d 65 20 3d 20 28 75 33 32 29 28 28  iFrame = (u32)((
15040 69 4f 66 66 2d 33 32 29 20 2f 20 28 69 36 34 29  iOff-32) / (i64)
15050 28 69 41 6d 74 2b 32 34 29 29 20 2b 20 31 3b 0a  (iAmt+24)) + 1;.
15060 20 20 69 66 28 20 70 52 62 75 2d 3e 69 4d 61 78    if( pRbu->iMax
15070 46 72 61 6d 65 3c 69 46 72 61 6d 65 20 29 20 70  Frame<iFrame ) p
15080 52 62 75 2d 3e 69 4d 61 78 46 72 61 6d 65 20 3d  Rbu->iMaxFrame =
15090 20 69 46 72 61 6d 65 3b 0a 20 20 70 52 62 75 2d   iFrame;.  pRbu-
150a0 3e 61 46 72 61 6d 65 5b 70 52 62 75 2d 3e 6e 46  >aFrame[pRbu->nF
150b0 72 61 6d 65 5d 2e 69 57 61 6c 46 72 61 6d 65 20  rame].iWalFrame 
150c0 3d 20 69 46 72 61 6d 65 3b 0a 20 20 70 52 62 75  = iFrame;.  pRbu
150d0 2d 3e 61 46 72 61 6d 65 5b 70 52 62 75 2d 3e 6e  ->aFrame[pRbu->n
150e0 46 72 61 6d 65 5d 2e 69 44 62 50 61 67 65 20 3d  Frame].iDbPage =
150f0 20 30 3b 0a 20 20 70 52 62 75 2d 3e 6e 46 72 61   0;.  pRbu->nFra
15100 6d 65 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20 53  me++;.  return S
15110 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
15120 2a 2a 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 61  ** Called when a
15130 20 70 61 67 65 20 6f 66 20 64 61 74 61 20 69 73   page of data is
15140 20 77 72 69 74 74 65 6e 20 74 6f 20 6f 66 66 73   written to offs
15150 65 74 20 69 4f 66 66 20 6f 66 20 74 68 65 20 64  et iOff of the d
15160 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20  atabase.** file 
15170 77 68 69 6c 65 20 74 68 65 20 72 62 75 20 68 61  while the rbu ha
15180 6e 64 6c 65 20 69 73 20 69 6e 20 63 61 70 74 75  ndle is in captu
15190 72 65 20 6d 6f 64 65 2e 20 52 65 63 6f 72 64 20  re mode. Record 
151a0 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
151b0 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20  .** of the page 
151c0 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 69 6e  being written in
151d0 20 74 68 65 20 61 46 72 61 6d 65 5b 5d 20 61 72   the aFrame[] ar
151e0 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ray..*/.static i
151f0 6e 74 20 72 62 75 43 61 70 74 75 72 65 44 62 57  nt rbuCaptureDbW
15200 72 69 74 65 28 73 71 6c 69 74 65 33 72 62 75 20  rite(sqlite3rbu 
15210 2a 70 52 62 75 2c 20 69 36 34 20 69 4f 66 66 29  *pRbu, i64 iOff)
15220 7b 0a 20 20 70 52 62 75 2d 3e 61 46 72 61 6d 65  {.  pRbu->aFrame
15230 5b 70 52 62 75 2d 3e 6e 46 72 61 6d 65 2d 31 5d  [pRbu->nFrame-1]
15240 2e 69 44 62 50 61 67 65 20 3d 20 28 75 33 32 29  .iDbPage = (u32)
15250 28 69 4f 66 66 20 2f 20 70 52 62 75 2d 3e 70 67  (iOff / pRbu->pg
15260 73 7a 29 20 2b 20 31 3b 0a 20 20 72 65 74 75 72  sz) + 1;.  retur
15270 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
15280 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 61  /*.** This is ca
15290 6c 6c 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  lled as part of 
152a0 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 63  an incremental c
152b0 68 65 63 6b 70 6f 69 6e 74 20 6f 70 65 72 61 74  heckpoint operat
152c0 69 6f 6e 2e 20 43 6f 70 79 0a 2a 2a 20 61 20 73  ion. Copy.** a s
152d0 69 6e 67 6c 65 20 66 72 61 6d 65 20 6f 66 20 64  ingle frame of d
152e0 61 74 61 20 66 72 6f 6d 20 74 68 65 20 77 61 6c  ata from the wal
152f0 20 66 69 6c 65 20 69 6e 74 6f 20 74 68 65 20 64   file into the d
15300 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 61 73  atabase file, as
15310 0a 2a 2a 20 69 6e 64 69 63 61 74 65 64 20 62 79  .** indicated by
15320 20 74 68 65 20 52 62 75 46 72 61 6d 65 20 6f 62   the RbuFrame ob
15330 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ject..*/.static 
15340 76 6f 69 64 20 72 62 75 43 68 65 63 6b 70 6f 69  void rbuCheckpoi
15350 6e 74 46 72 61 6d 65 28 73 71 6c 69 74 65 33 72  ntFrame(sqlite3r
15360 62 75 20 2a 70 2c 20 52 62 75 46 72 61 6d 65 20  bu *p, RbuFrame 
15370 2a 70 46 72 61 6d 65 29 7b 0a 20 20 73 71 6c 69  *pFrame){.  sqli
15380 74 65 33 5f 66 69 6c 65 20 2a 70 57 61 6c 20 3d  te3_file *pWal =
15390 20 70 2d 3e 70 54 61 72 67 65 74 46 64 2d 3e 70   p->pTargetFd->p
153a0 57 61 6c 46 64 2d 3e 70 52 65 61 6c 3b 0a 20 20  WalFd->pReal;.  
153b0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 44  sqlite3_file *pD
153c0 62 20 3d 20 70 2d 3e 70 54 61 72 67 65 74 46 64  b = p->pTargetFd
153d0 2d 3e 70 52 65 61 6c 3b 0a 20 20 69 36 34 20 69  ->pReal;.  i64 i
153e0 4f 66 66 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  Off;..  assert( 
153f0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
15400 20 29 3b 0a 20 20 69 4f 66 66 20 3d 20 28 69 36   );.  iOff = (i6
15410 34 29 28 70 46 72 61 6d 65 2d 3e 69 57 61 6c 46  4)(pFrame->iWalF
15420 72 61 6d 65 2d 31 29 20 2a 20 28 70 2d 3e 70 67  rame-1) * (p->pg
15430 73 7a 20 2b 20 32 34 29 20 2b 20 33 32 20 2b 20  sz + 24) + 32 + 
15440 32 34 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 70 57  24;.  p->rc = pW
15450 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 52  al->pMethods->xR
15460 65 61 64 28 70 57 61 6c 2c 20 70 2d 3e 61 42 75  ead(pWal, p->aBu
15470 66 2c 20 70 2d 3e 70 67 73 7a 2c 20 69 4f 66 66  f, p->pgsz, iOff
15480 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 20 29  );.  if( p->rc )
15490 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 4f 66 66   return;..  iOff
154a0 20 3d 20 28 69 36 34 29 28 70 46 72 61 6d 65 2d   = (i64)(pFrame-
154b0 3e 69 44 62 50 61 67 65 2d 31 29 20 2a 20 70 2d  >iDbPage-1) * p-
154c0 3e 70 67 73 7a 3b 0a 20 20 70 2d 3e 72 63 20 3d  >pgsz;.  p->rc =
154d0 20 70 44 62 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e   pDb->pMethods->
154e0 78 57 72 69 74 65 28 70 44 62 2c 20 70 2d 3e 61  xWrite(pDb, p->a
154f0 42 75 66 2c 20 70 2d 3e 70 67 73 7a 2c 20 69 4f  Buf, p->pgsz, iO
15500 66 66 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  ff);.}.../*.** T
15510 61 6b 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ake an EXCLUSIVE
15520 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
15530 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73  abase file..*/.s
15540 74 61 74 69 63 20 76 6f 69 64 20 72 62 75 4c 6f  tatic void rbuLo
15550 63 6b 44 61 74 61 62 61 73 65 28 73 71 6c 69 74  ckDatabase(sqlit
15560 65 33 72 62 75 20 2a 70 29 7b 0a 20 20 73 71 6c  e3rbu *p){.  sql
15570 69 74 65 33 5f 66 69 6c 65 20 2a 70 52 65 61 6c  ite3_file *pReal
15580 20 3d 20 70 2d 3e 70 54 61 72 67 65 74 46 64 2d   = p->pTargetFd-
15590 3e 70 52 65 61 6c 3b 0a 20 20 61 73 73 65 72 74  >pReal;.  assert
155a0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
155b0 4f 4b 20 29 3b 0a 20 20 70 2d 3e 72 63 20 3d 20  OK );.  p->rc = 
155c0 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d  pReal->pMethods-
155d0 3e 78 4c 6f 63 6b 28 70 52 65 61 6c 2c 20 53 51  >xLock(pReal, SQ
155e0 4c 49 54 45 5f 4c 4f 43 4b 5f 53 48 41 52 45 44  LITE_LOCK_SHARED
155f0 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  );.  if( p->rc==
15600 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15610 20 70 2d 3e 72 63 20 3d 20 70 52 65 61 6c 2d 3e   p->rc = pReal->
15620 70 4d 65 74 68 6f 64 73 2d 3e 78 4c 6f 63 6b 28  pMethods->xLock(
15630 70 52 65 61 6c 2c 20 53 51 4c 49 54 45 5f 4c 4f  pReal, SQLITE_LO
15640 43 4b 5f 45 58 43 4c 55 53 49 56 45 29 3b 0a 20  CK_EXCLUSIVE);. 
15650 20 7d 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65   }.}..#if define
15660 64 28 5f 57 49 4e 33 32 5f 57 43 45 29 0a 73 74  d(_WIN32_WCE).st
15670 61 74 69 63 20 4c 50 57 53 54 52 20 72 62 75 57  atic LPWSTR rbuW
15680 69 6e 55 74 66 38 54 6f 55 6e 69 63 6f 64 65 28  inUtf8ToUnicode(
15690 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
156a0 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e 43  ename){.  int nC
156b0 68 61 72 3b 0a 20 20 4c 50 57 53 54 52 20 7a 57  har;.  LPWSTR zW
156c0 69 64 65 46 69 6c 65 6e 61 6d 65 3b 0a 0a 20 20  ideFilename;..  
156d0 6e 43 68 61 72 20 3d 20 4d 75 6c 74 69 42 79 74  nChar = MultiByt
156e0 65 54 6f 57 69 64 65 43 68 61 72 28 43 50 5f 55  eToWideChar(CP_U
156f0 54 46 38 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d  TF8, 0, zFilenam
15700 65 2c 20 2d 31 2c 20 4e 55 4c 4c 2c 20 30 29 3b  e, -1, NULL, 0);
15710 0a 20 20 69 66 28 20 6e 43 68 61 72 3d 3d 30 20  .  if( nChar==0 
15720 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
15730 0a 20 20 7d 0a 20 20 7a 57 69 64 65 46 69 6c 65  .  }.  zWideFile
15740 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d  name = sqlite3_m
15750 61 6c 6c 6f 63 36 34 28 20 6e 43 68 61 72 2a 73  alloc64( nChar*s
15760 69 7a 65 6f 66 28 7a 57 69 64 65 46 69 6c 65 6e  izeof(zWideFilen
15770 61 6d 65 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28  ame[0]) );.  if(
15780 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 3d 3d   zWideFilename==
15790 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
157a0 30 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28  0;.  }.  memset(
157b0 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c 20 30  zWideFilename, 0
157c0 2c 20 6e 43 68 61 72 2a 73 69 7a 65 6f 66 28 7a  , nChar*sizeof(z
157d0 57 69 64 65 46 69 6c 65 6e 61 6d 65 5b 30 5d 29  WideFilename[0])
157e0 29 3b 0a 20 20 6e 43 68 61 72 20 3d 20 4d 75 6c  );.  nChar = Mul
157f0 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72  tiByteToWideChar
15800 28 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 46 69  (CP_UTF8, 0, zFi
15810 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 57 69 64  lename, -1, zWid
15820 65 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20  eFilename,.     
15830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15840 20 20 20 20 20 20 20 20 20 20 20 6e 43 68 61 72             nChar
15850 29 3b 0a 20 20 69 66 28 20 6e 43 68 61 72 3d 3d  );.  if( nChar==
15860 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
15870 5f 66 72 65 65 28 7a 57 69 64 65 46 69 6c 65 6e  _free(zWideFilen
15880 61 6d 65 29 3b 0a 20 20 20 20 7a 57 69 64 65 46  ame);.    zWideF
15890 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d  ilename = 0;.  }
158a0 0a 20 20 72 65 74 75 72 6e 20 7a 57 69 64 65 46  .  return zWideF
158b0 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 23 65 6e 64 69  ilename;.}.#endi
158c0 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 52 42 55  f../*.** The RBU
158d0 20 68 61 6e 64 6c 65 20 69 73 20 63 75 72 72 65   handle is curre
158e0 6e 74 6c 79 20 69 6e 20 52 42 55 5f 53 54 41 47  ntly in RBU_STAG
158f0 45 5f 4f 41 4c 20 73 74 61 74 65 2c 20 77 69 74  E_OAL state, wit
15900 68 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 0a  h a SHARED lock.
15910 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ** on the databa
15920 73 65 20 66 69 6c 65 2e 20 54 68 69 73 20 70 72  se file. This pr
15930 6f 63 20 6d 6f 76 65 73 20 74 68 65 20 2a 2d 6f  oc moves the *-o
15940 61 6c 20 66 69 6c 65 20 74 6f 20 74 68 65 20 2a  al file to the *
15950 2d 77 61 6c 20 70 61 74 68 2c 0a 2a 2a 20 74 68  -wal path,.** th
15960 65 6e 20 72 65 6f 70 65 6e 73 20 74 68 65 20 64  en reopens the d
15970 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 74 68  atabase file (th
15980 69 73 20 74 69 6d 65 20 69 6e 20 76 61 6e 69 6c  is time in vanil
15990 6c 61 2c 20 6e 6f 6e 2d 6f 61 6c 2c 20 57 41 4c  la, non-oal, WAL
159a0 20 6d 6f 64 65 29 2e 0a 2a 2a 20 49 66 20 61 6e   mode)..** If an
159b0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c   error occurs, l
159c0 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 63 6f  eave an error co
159d0 64 65 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73  de and error mes
159e0 73 61 67 65 20 69 6e 20 74 68 65 20 72 62 75 20  sage in the rbu 
159f0 0a 2a 2a 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73  .** handle..*/.s
15a00 74 61 74 69 63 20 76 6f 69 64 20 72 62 75 4d 6f  tatic void rbuMo
15a10 76 65 4f 61 6c 46 69 6c 65 28 73 71 6c 69 74 65  veOalFile(sqlite
15a20 33 72 62 75 20 2a 70 29 7b 0a 20 20 63 6f 6e 73  3rbu *p){.  cons
15a30 74 20 63 68 61 72 20 2a 7a 42 61 73 65 20 3d 20  t char *zBase = 
15a40 73 71 6c 69 74 65 33 5f 64 62 5f 66 69 6c 65 6e  sqlite3_db_filen
15a50 61 6d 65 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 22  ame(p->dbMain, "
15a60 6d 61 69 6e 22 29 3b 0a 20 20 63 6f 6e 73 74 20  main");.  const 
15a70 63 68 61 72 20 2a 7a 4d 6f 76 65 20 3d 20 7a 42  char *zMove = zB
15a80 61 73 65 3b 0a 20 20 63 68 61 72 20 2a 7a 4f 61  ase;.  char *zOa
15a90 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 57 61 6c 3b  l;.  char *zWal;
15aa0 0a 0a 20 20 69 66 28 20 72 62 75 49 73 56 61 63  ..  if( rbuIsVac
15ab0 75 75 6d 28 70 29 20 29 7b 0a 20 20 20 20 7a 4d  uum(p) ){.    zM
15ac0 6f 76 65 20 3d 20 73 71 6c 69 74 65 33 5f 64 62  ove = sqlite3_db
15ad0 5f 66 69 6c 65 6e 61 6d 65 28 70 2d 3e 64 62 52  _filename(p->dbR
15ae0 62 75 2c 20 22 6d 61 69 6e 22 29 3b 0a 20 20 7d  bu, "main");.  }
15af0 0a 20 20 7a 4f 61 6c 20 3d 20 73 71 6c 69 74 65  .  zOal = sqlite
15b00 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 2d 6f 61  3_mprintf("%s-oa
15b10 6c 22 2c 20 7a 4d 6f 76 65 29 3b 0a 20 20 7a 57  l", zMove);.  zW
15b20 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  al = sqlite3_mpr
15b30 69 6e 74 66 28 22 25 73 2d 77 61 6c 22 2c 20 7a  intf("%s-wal", z
15b40 4d 6f 76 65 29 3b 0a 0a 20 20 61 73 73 65 72 74  Move);..  assert
15b50 28 20 70 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55  ( p->eStage==RBU
15b60 5f 53 54 41 47 45 5f 4d 4f 56 45 20 29 3b 0a 20  _STAGE_MOVE );. 
15b70 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d   assert( p->rc==
15b80 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e  SQLITE_OK && p->
15b90 7a 45 72 72 6d 73 67 3d 3d 30 20 29 3b 0a 20 20  zErrmsg==0 );.  
15ba0 69 66 28 20 7a 57 61 6c 3d 3d 30 20 7c 7c 20 7a  if( zWal==0 || z
15bb0 4f 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d  Oal==0 ){.    p-
15bc0 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  >rc = SQLITE_NOM
15bd0 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  EM;.  }else{.   
15be0 20 2f 2a 20 4d 6f 76 65 20 74 68 65 20 2a 2d 6f   /* Move the *-o
15bf0 61 6c 20 66 69 6c 65 20 74 6f 20 2a 2d 77 61 6c  al file to *-wal
15c00 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  . At this point 
15c10 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 2d 3e 64 62  connection p->db
15c20 20 69 73 0a 20 20 20 20 2a 2a 20 68 6f 6c 64 69   is.    ** holdi
15c30 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  ng a SHARED lock
15c40 20 6f 6e 20 74 68 65 20 74 61 72 67 65 74 20 64   on the target d
15c50 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 62 65  atabase file (be
15c60 63 61 75 73 65 20 69 74 20 69 73 0a 20 20 20 20  cause it is.    
15c70 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f 64 65 29 2e  ** in WAL mode).
15c80 20 53 6f 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e   So no other con
15c90 6e 65 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 77  nection may be w
15ca0 72 69 74 69 6e 67 20 74 68 65 20 64 62 2e 20 0a  riting the db. .
15cb0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 6e      **.    ** In
15cc0 20 6f 72 64 65 72 20 74 6f 20 65 6e 73 75 72 65   order to ensure
15cd0 20 74 68 61 74 20 74 68 65 72 65 20 61 72 65 20   that there are 
15ce0 6e 6f 20 64 61 74 61 62 61 73 65 20 72 65 61 64  no database read
15cf0 65 72 73 2c 20 61 6e 20 45 58 43 4c 55 53 49 56  ers, an EXCLUSIV
15d00 45 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 69 73  E.    ** lock is
15d10 20 6f 62 74 61 69 6e 65 64 20 68 65 72 65 20 62   obtained here b
15d20 65 66 6f 72 65 20 74 68 65 20 2a 2d 6f 61 6c 20  efore the *-oal 
15d30 69 73 20 6d 6f 76 65 64 20 74 6f 20 2a 2d 77 61  is moved to *-wa
15d40 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 62  l..    */.    rb
15d50 75 4c 6f 63 6b 44 61 74 61 62 61 73 65 28 70 29  uLockDatabase(p)
15d60 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d  ;.    if( p->rc=
15d70 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15d80 20 20 20 20 72 62 75 46 69 6c 65 53 75 66 66 69      rbuFileSuffi
15d90 78 33 28 7a 42 61 73 65 2c 20 7a 57 61 6c 29 3b  x3(zBase, zWal);
15da0 0a 20 20 20 20 20 20 72 62 75 46 69 6c 65 53 75  .      rbuFileSu
15db0 66 66 69 78 33 28 7a 42 61 73 65 2c 20 7a 4f 61  ffix3(zBase, zOa
15dc0 6c 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 52 65  l);..      /* Re
15dd0 2d 6f 70 65 6e 20 74 68 65 20 64 61 74 61 62 61  -open the databa
15de0 73 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 72 62  ses. */.      rb
15df0 75 4f 62 6a 49 74 65 72 46 69 6e 61 6c 69 7a 65  uObjIterFinalize
15e00 28 26 70 2d 3e 6f 62 6a 69 74 65 72 29 3b 0a 20  (&p->objiter);. 
15e10 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f       sqlite3_clo
15e20 73 65 28 70 2d 3e 64 62 52 62 75 29 3b 0a 20 20  se(p->dbRbu);.  
15e30 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73      sqlite3_clos
15e40 65 28 70 2d 3e 64 62 4d 61 69 6e 29 3b 0a 20 20  e(p->dbMain);.  
15e50 20 20 20 20 70 2d 3e 64 62 4d 61 69 6e 20 3d 20      p->dbMain = 
15e60 30 3b 0a 20 20 20 20 20 20 70 2d 3e 64 62 52 62  0;.      p->dbRb
15e70 75 20 3d 20 30 3b 0a 0a 23 69 66 20 64 65 66 69  u = 0;..#if defi
15e80 6e 65 64 28 5f 57 49 4e 33 32 5f 57 43 45 29 0a  ned(_WIN32_WCE).
15e90 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
15ea0 4c 50 57 53 54 52 20 7a 57 69 64 65 4f 61 6c 3b  LPWSTR zWideOal;
15eb0 0a 20 20 20 20 20 20 20 20 4c 50 57 53 54 52 20  .        LPWSTR 
15ec0 7a 57 69 64 65 57 61 6c 3b 0a 0a 20 20 20 20 20  zWideWal;..     
15ed0 20 20 20 7a 57 69 64 65 4f 61 6c 20 3d 20 72 62     zWideOal = rb
15ee0 75 57 69 6e 55 74 66 38 54 6f 55 6e 69 63 6f 64  uWinUtf8ToUnicod
15ef0 65 28 7a 4f 61 6c 29 3b 0a 20 20 20 20 20 20 20  e(zOal);.       
15f00 20 69 66 28 20 7a 57 69 64 65 4f 61 6c 20 29 7b   if( zWideOal ){
15f10 0a 20 20 20 20 20 20 20 20 20 20 7a 57 69 64 65  .          zWide
15f20 57 61 6c 20 3d 20 72 62 75 57 69 6e 55 74 66 38  Wal = rbuWinUtf8
15f30 54 6f 55 6e 69 63 6f 64 65 28 7a 57 61 6c 29 3b  ToUnicode(zWal);
15f40 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a  .          if( z
15f50 57 69 64 65 57 61 6c 20 29 7b 0a 20 20 20 20 20  WideWal ){.     
15f60 20 20 20 20 20 20 20 69 66 28 20 4d 6f 76 65 46         if( MoveF
15f70 69 6c 65 57 28 7a 57 69 64 65 4f 61 6c 2c 20 7a  ileW(zWideOal, z
15f80 57 69 64 65 57 61 6c 29 20 29 7b 0a 20 20 20 20  WideWal) ){.    
15f90 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20            p->rc 
15fa0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
15fb0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
15fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
15fd0 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45  >rc = SQLITE_IOE
15fe0 52 52 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  RR;.            
15ff0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  }.            sq
16000 6c 69 74 65 33 5f 66 72 65 65 28 7a 57 69 64 65  lite3_free(zWide
16010 57 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Wal);.          
16020 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
16030 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
16040 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20  E_IOERR_NOMEM;. 
16050 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
16060 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
16070 65 28 7a 57 69 64 65 4f 61 6c 29 3b 0a 20 20 20  e(zWideOal);.   
16080 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
16090 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51        p->rc = SQ
160a0 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
160b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
160c0 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20 20    }.#else.      
160d0 70 2d 3e 72 63 20 3d 20 72 65 6e 61 6d 65 28 7a  p->rc = rename(z
160e0 4f 61 6c 2c 20 7a 57 61 6c 29 20 3f 20 53 51 4c  Oal, zWal) ? SQL
160f0 49 54 45 5f 49 4f 45 52 52 20 3a 20 53 51 4c 49  ITE_IOERR : SQLI
16100 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a 20  TE_OK;.#endif.. 
16110 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
16120 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16130 20 20 20 20 20 72 62 75 4f 70 65 6e 44 61 74 61       rbuOpenData
16140 62 61 73 65 28 70 29 3b 0a 20 20 20 20 20 20 20  base(p);.       
16150 20 72 62 75 53 65 74 75 70 43 68 65 63 6b 70 6f   rbuSetupCheckpo
16160 69 6e 74 28 70 2c 20 30 29 3b 0a 20 20 20 20 20  int(p, 0);.     
16170 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
16180 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 57 61  sqlite3_free(zWa
16190 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  l);.  sqlite3_fr
161a0 65 65 28 7a 4f 61 6c 29 3b 0a 7d 0a 0a 2f 2a 0a  ee(zOal);.}../*.
161b0 2a 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74  ** The SELECT st
161c0 61 74 65 6d 65 6e 74 20 69 74 65 72 61 74 69 6e  atement iteratin
161d0 67 20 74 68 72 6f 75 67 68 20 74 68 65 20 6b 65  g through the ke
161e0 79 73 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  ys for the curre
161f0 6e 74 20 6f 62 6a 65 63 74 0a 2a 2a 20 28 70 2d  nt object.** (p-
16200 3e 6f 62 6a 69 74 65 72 2e 70 53 65 6c 65 63 74  >objiter.pSelect
16210 29 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  ) currently poin
16220 74 73 20 74 6f 20 61 20 76 61 6c 69 64 20 72 6f  ts to a valid ro
16230 77 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  w. This function
16240 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 73 20 74  .** determines t
16250 68 65 20 74 79 70 65 20 6f 66 20 6f 70 65 72 61  he type of opera
16260 74 69 6f 6e 20 72 65 71 75 65 73 74 65 64 20 62  tion requested b
16270 79 20 74 68 69 73 20 72 6f 77 20 61 6e 64 20 72  y this row and r
16280 65 74 75 72 6e 73 0a 2a 2a 20 6f 6e 65 20 6f 66  eturns.** one of
16290 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76   the following v
162a0 61 6c 75 65 73 20 74 6f 20 69 6e 64 69 63 61 74  alues to indicat
162b0 65 20 74 68 65 20 72 65 73 75 6c 74 3a 0a 2a 2a  e the result:.**
162c0 0a 2a 2a 20 20 20 20 20 2a 20 52 42 55 5f 49 4e  .**     * RBU_IN
162d0 53 45 52 54 0a 2a 2a 20 20 20 20 20 2a 20 52 42  SERT.**     * RB
162e0 55 5f 44 45 4c 45 54 45 0a 2a 2a 20 20 20 20 20  U_DELETE.**     
162f0 2a 20 52 42 55 5f 49 44 58 5f 44 45 4c 45 54 45  * RBU_IDX_DELETE
16300 0a 2a 2a 20 20 20 20 20 2a 20 52 42 55 5f 55 50  .**     * RBU_UP
16310 44 41 54 45 0a 2a 2a 0a 2a 2a 20 49 66 20 52 42  DATE.**.** If RB
16320 55 5f 55 50 44 41 54 45 20 69 73 20 72 65 74 75  U_UPDATE is retu
16330 72 6e 65 64 2c 20 74 68 65 6e 20 6f 75 74 70 75  rned, then outpu
16340 74 20 76 61 72 69 61 62 6c 65 20 2a 70 7a 4d 61  t variable *pzMa
16350 73 6b 20 69 73 20 73 65 74 20 74 6f 0a 2a 2a 20  sk is set to.** 
16360 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 74 65 78  point to the tex
16370 74 20 76 61 6c 75 65 20 69 6e 64 69 63 61 74 69  t value indicati
16380 6e 67 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 74  ng the columns t
16390 6f 20 75 70 64 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  o update..**.** 
163a0 49 66 20 74 68 65 20 72 62 75 5f 63 6f 6e 74 72  If the rbu_contr
163b0 6f 6c 20 66 69 65 6c 64 20 63 6f 6e 74 61 69 6e  ol field contain
163c0 73 20 61 6e 20 69 6e 76 61 6c 69 64 20 76 61 6c  s an invalid val
163d0 75 65 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  ue, an error cod
163e0 65 20 61 6e 64 0a 2a 2a 20 6d 65 73 73 61 67 65  e and.** message
163f0 20 61 72 65 20 6c 65 66 74 20 69 6e 20 74 68 65   are left in the
16400 20 52 42 55 20 68 61 6e 64 6c 65 20 61 6e 64 20   RBU handle and 
16410 7a 65 72 6f 20 72 65 74 75 72 6e 65 64 2e 0a 2a  zero returned..*
16420 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62 75  /.static int rbu
16430 53 74 65 70 54 79 70 65 28 73 71 6c 69 74 65 33  StepType(sqlite3
16440 72 62 75 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  rbu *p, const ch
16450 61 72 20 2a 2a 70 7a 4d 61 73 6b 29 7b 0a 20 20  ar **pzMask){.  
16460 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 6f 62  int iCol = p->ob
16470 6a 69 74 65 72 2e 6e 43 6f 6c 3b 20 20 20 20 20  jiter.nCol;     
16480 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72 62 75 5f  /* Index of rbu_
16490 63 6f 6e 74 72 6f 6c 20 63 6f 6c 75 6d 6e 20 2a  control column *
164a0 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 30 3b  /.  int res = 0;
164b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
164c0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61      /* Return va
164d0 6c 75 65 20 2a 2f 0a 0a 20 20 73 77 69 74 63 68  lue */..  switch
164e0 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  ( sqlite3_column
164f0 5f 74 79 70 65 28 70 2d 3e 6f 62 6a 69 74 65 72  _type(p->objiter
16500 2e 70 53 65 6c 65 63 74 2c 20 69 43 6f 6c 29 20  .pSelect, iCol) 
16510 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  ){.    case SQLI
16520 54 45 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20  TE_INTEGER: {.  
16530 20 20 20 20 69 6e 74 20 69 56 61 6c 20 3d 20 73      int iVal = s
16540 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
16550 74 28 70 2d 3e 6f 62 6a 69 74 65 72 2e 70 53 65  t(p->objiter.pSe
16560 6c 65 63 74 2c 20 69 43 6f 6c 29 3b 0a 20 20 20  lect, iCol);.   
16570 20 20 20 73 77 69 74 63 68 28 20 69 56 61 6c 20     switch( iVal 
16580 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  ){.        case 
16590 30 3a 20 72 65 73 20 3d 20 52 42 55 5f 49 4e 53  0: res = RBU_INS
165a0 45 52 54 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  ERT;     break;.
165b0 20 20 20 20 20 20 20 20 63 61 73 65 20 31 3a 20          case 1: 
165c0 72 65 73 20 3d 20 52 42 55 5f 44 45 4c 45 54 45  res = RBU_DELETE
165d0 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
165e0 20 20 20 20 20 63 61 73 65 20 32 3a 20 72 65 73       case 2: res
165f0 20 3d 20 52 42 55 5f 52 45 50 4c 41 43 45 3b 20   = RBU_REPLACE; 
16600 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
16610 20 20 63 61 73 65 20 33 3a 20 72 65 73 20 3d 20    case 3: res = 
16620 52 42 55 5f 49 44 58 5f 44 45 4c 45 54 45 3b 20  RBU_IDX_DELETE; 
16630 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63  break;.        c
16640 61 73 65 20 34 3a 20 72 65 73 20 3d 20 52 42 55  ase 4: res = RBU
16650 5f 49 44 58 5f 49 4e 53 45 52 54 3b 20 62 72 65  _IDX_INSERT; bre
16660 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
16670 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
16680 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
16690 54 45 58 54 3a 20 7b 0a 20 20 20 20 20 20 63 6f  TEXT: {.      co
166a0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
166b0 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f 63  r *z = sqlite3_c
166c0 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 2d 3e 6f 62  olumn_text(p->ob
166d0 6a 69 74 65 72 2e 70 53 65 6c 65 63 74 2c 20 69  jiter.pSelect, i
166e0 43 6f 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Col);.      if( 
166f0 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  z==0 ){.        
16700 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  p->rc = SQLITE_N
16710 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73  OMEM;.      }els
16720 65 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a 4d 61  e{.        *pzMa
16730 73 6b 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  sk = (const char
16740 2a 29 7a 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  *)z;.      }.   
16750 20 20 20 72 65 73 20 3d 20 52 42 55 5f 55 50 44     res = RBU_UPD
16760 41 54 45 3b 0a 0a 20 20 20 20 20 20 62 72 65 61  ATE;..      brea
16770 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 65  k;.    }..    de
16780 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 62 72 65  fault:.      bre
16790 61 6b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72  ak;.  }..  if( r
167a0 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 72 62 75  es==0 ){.    rbu
167b0 42 61 64 43 6f 6e 74 72 6f 6c 45 72 72 6f 72 28  BadControlError(
167c0 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
167d0 20 72 65 73 3b 0a 7d 0a 0a 23 69 66 64 65 66 20   res;.}..#ifdef 
167e0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
167f0 2a 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 63  ** Assert that c
16800 6f 6c 75 6d 6e 20 69 43 6f 6c 20 6f 66 20 73 74  olumn iCol of st
16810 61 74 65 6d 65 6e 74 20 70 53 74 6d 74 20 69 73  atement pStmt is
16820 20 6e 61 6d 65 64 20 7a 4e 61 6d 65 2e 0a 2a 2f   named zName..*/
16830 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73  .static void ass
16840 65 72 74 43 6f 6c 75 6d 6e 4e 61 6d 65 28 73 71  ertColumnName(sq
16850 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
16860 74 2c 20 69 6e 74 20 69 43 6f 6c 2c 20 63 6f 6e  t, int iCol, con
16870 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b  st char *zName){
16880 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
16890 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  Col = sqlite3_co
168a0 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53 74 6d 74 2c  lumn_name(pStmt,
168b0 20 69 43 6f 6c 29 3b 0a 20 20 61 73 73 65 72 74   iCol);.  assert
168c0 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72  ( 0==sqlite3_str
168d0 69 63 6d 70 28 7a 4e 61 6d 65 2c 20 7a 43 6f 6c  icmp(zName, zCol
168e0 29 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  ) );.}.#else.# d
168f0 65 66 69 6e 65 20 61 73 73 65 72 74 43 6f 6c 75  efine assertColu
16900 6d 6e 4e 61 6d 65 28 78 2c 79 2c 7a 29 0a 23 65  mnName(x,y,z).#e
16910 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75  ndif../*.** Argu
16920 6d 65 6e 74 20 65 54 79 70 65 20 6d 75 73 74 20  ment eType must 
16930 62 65 20 6f 6e 65 20 6f 66 20 52 42 55 5f 49 4e  be one of RBU_IN
16940 53 45 52 54 2c 20 52 42 55 5f 44 45 4c 45 54 45  SERT, RBU_DELETE
16950 2c 20 52 42 55 5f 49 44 58 5f 49 4e 53 45 52 54  , RBU_IDX_INSERT
16960 20 6f 72 0a 2a 2a 20 52 42 55 5f 49 44 58 5f 44   or.** RBU_IDX_D
16970 45 4c 45 54 45 2e 20 54 68 69 73 20 66 75 6e 63  ELETE. This func
16980 74 69 6f 6e 20 70 65 72 66 6f 72 6d 73 20 74 68  tion performs th
16990 65 20 77 6f 72 6b 20 6f 66 20 61 20 73 69 6e 67  e work of a sing
169a0 6c 65 0a 2a 2a 20 73 71 6c 69 74 65 33 72 62 75  le.** sqlite3rbu
169b0 5f 73 74 65 70 28 29 20 63 61 6c 6c 20 66 6f 72  _step() call for
169c0 20 74 68 65 20 74 79 70 65 20 6f 66 20 6f 70 65   the type of ope
169d0 72 61 74 69 6f 6e 20 73 70 65 63 69 66 69 65 64  ration specified
169e0 20 62 79 20 65 54 79 70 65 2e 0a 2a 2f 0a 73 74   by eType..*/.st
169f0 61 74 69 63 20 76 6f 69 64 20 72 62 75 53 74 65  atic void rbuSte
16a00 70 4f 6e 65 4f 70 28 73 71 6c 69 74 65 33 72 62  pOneOp(sqlite3rb
16a10 75 20 2a 70 2c 20 69 6e 74 20 65 54 79 70 65 29  u *p, int eType)
16a20 7b 0a 20 20 52 62 75 4f 62 6a 49 74 65 72 20 2a  {.  RbuObjIter *
16a30 70 49 74 65 72 20 3d 20 26 70 2d 3e 6f 62 6a 69  pIter = &p->obji
16a40 74 65 72 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76  ter;.  sqlite3_v
16a50 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 73 71  alue *pVal;.  sq
16a60 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 57 72 69  lite3_stmt *pWri
16a70 74 65 72 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20  ter;.  int i;.. 
16a80 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d   assert( p->rc==
16a90 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 61  SQLITE_OK );.  a
16aa0 73 73 65 72 74 28 20 65 54 79 70 65 21 3d 52 42  ssert( eType!=RB
16ab0 55 5f 44 45 4c 45 54 45 20 7c 7c 20 70 49 74 65  U_DELETE || pIte
16ac0 72 2d 3e 7a 49 64 78 3d 3d 30 20 29 3b 0a 20 20  r->zIdx==0 );.  
16ad0 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 52  assert( eType==R
16ae0 42 55 5f 44 45 4c 45 54 45 20 7c 7c 20 65 54 79  BU_DELETE || eTy
16af0 70 65 3d 3d 52 42 55 5f 49 44 58 5f 44 45 4c 45  pe==RBU_IDX_DELE
16b00 54 45 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79  TE.       || eTy
16b10 70 65 3d 3d 52 42 55 5f 49 4e 53 45 52 54 20 7c  pe==RBU_INSERT |
16b20 7c 20 65 54 79 70 65 3d 3d 52 42 55 5f 49 44 58  | eType==RBU_IDX
16b30 5f 49 4e 53 45 52 54 0a 20 20 29 3b 0a 0a 20 20  _INSERT.  );..  
16b40 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  /* If this is a 
16b50 64 65 6c 65 74 65 2c 20 64 65 63 72 65 6d 65 6e  delete, decremen
16b60 74 20 6e 50 68 61 73 65 4f 6e 65 53 74 65 70 20  t nPhaseOneStep 
16b70 62 79 20 6e 49 6e 64 65 78 2e 20 49 66 20 74 68  by nIndex. If th
16b80 65 20 44 45 4c 45 54 45 0a 20 20 2a 2a 20 73 74  e DELETE.  ** st
16b90 61 74 65 6d 65 6e 74 20 62 65 6c 6f 77 20 64 6f  atement below do
16ba0 65 73 20 61 63 74 75 61 6c 6c 79 20 64 65 6c 65  es actually dele
16bb0 74 65 20 61 20 72 6f 77 2c 20 6e 50 68 61 73 65  te a row, nPhase
16bc0 4f 6e 65 53 74 65 70 20 77 69 6c 6c 20 62 65 0a  OneStep will be.
16bd0 20 20 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 65 64    ** incremented
16be0 20 62 79 20 74 68 65 20 73 61 6d 65 20 61 6d 6f   by the same amo
16bf0 75 6e 74 20 77 68 65 6e 20 53 51 4c 20 66 75 6e  unt when SQL fun
16c00 63 74 69 6f 6e 20 72 62 75 5f 74 6d 70 5f 69 6e  ction rbu_tmp_in
16c10 73 65 72 74 28 29 0a 20 20 2a 2a 20 69 73 20 69  sert().  ** is i
16c20 6e 76 6f 6b 65 64 20 62 79 20 74 68 65 20 74 72  nvoked by the tr
16c30 69 67 67 65 72 2e 20 20 2a 2f 0a 20 20 69 66 28  igger.  */.  if(
16c40 20 65 54 79 70 65 3d 3d 52 42 55 5f 44 45 4c 45   eType==RBU_DELE
16c50 54 45 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 50 68  TE ){.    p->nPh
16c60 61 73 65 4f 6e 65 53 74 65 70 20 2d 3d 20 70 2d  aseOneStep -= p-
16c70 3e 6f 62 6a 69 74 65 72 2e 6e 49 6e 64 65 78 3b  >objiter.nIndex;
16c80 0a 20 20 7d 0a 0a 20 20 69 66 28 20 65 54 79 70  .  }..  if( eTyp
16c90 65 3d 3d 52 42 55 5f 49 44 58 5f 44 45 4c 45 54  e==RBU_IDX_DELET
16ca0 45 20 7c 7c 20 65 54 79 70 65 3d 3d 52 42 55 5f  E || eType==RBU_
16cb0 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 70 57  DELETE ){.    pW
16cc0 72 69 74 65 72 20 3d 20 70 49 74 65 72 2d 3e 70  riter = pIter->p
16cd0 44 65 6c 65 74 65 3b 0a 20 20 7d 65 6c 73 65 7b  Delete;.  }else{
16ce0 0a 20 20 20 20 70 57 72 69 74 65 72 20 3d 20 70  .    pWriter = p
16cf0 49 74 65 72 2d 3e 70 49 6e 73 65 72 74 3b 0a 20  Iter->pInsert;. 
16d00 20 7d 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   }..  for(i=0; i
16d10 3c 70 49 74 65 72 2d 3e 6e 43 6f 6c 3b 20 69 2b  <pIter->nCol; i+
16d20 2b 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  +){.    /* If th
16d30 69 73 20 69 73 20 61 6e 20 49 4e 53 45 52 54 20  is is an INSERT 
16d40 69 6e 74 6f 20 61 20 74 61 62 6c 65 20 62 2d 74  into a table b-t
16d50 72 65 65 20 61 6e 64 20 74 68 65 20 74 61 62 6c  ree and the tabl
16d60 65 20 68 61 73 20 61 6e 0a 20 20 20 20 2a 2a 20  e has an.    ** 
16d70 65 78 70 6c 69 63 69 74 20 49 4e 54 45 47 45 52  explicit INTEGER
16d80 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 63 68   PRIMARY KEY, ch
16d90 65 63 6b 20 74 68 61 74 20 74 68 69 73 20 69 73  eck that this is
16da0 20 6e 6f 74 20 61 6e 20 61 74 74 65 6d 70 74 0a   not an attempt.
16db0 20 20 20 20 2a 2a 20 74 6f 20 77 72 69 74 65 20      ** to write 
16dc0 61 20 4e 55 4c 4c 20 69 6e 74 6f 20 74 68 65 20  a NULL into the 
16dd0 49 50 4b 20 63 6f 6c 75 6d 6e 2e 20 54 68 61 74  IPK column. That
16de0 20 69 73 20 6e 6f 74 20 70 65 72 6d 69 74 74 65   is not permitte
16df0 64 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65  d.  */.    if( e
16e00 54 79 70 65 3d 3d 52 42 55 5f 49 4e 53 45 52 54  Type==RBU_INSERT
16e10 20 0a 20 20 20 20 20 26 26 20 70 49 74 65 72 2d   .     && pIter-
16e20 3e 7a 49 64 78 3d 3d 30 20 26 26 20 70 49 74 65  >zIdx==0 && pIte
16e30 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b  r->eType==RBU_PK
16e40 5f 49 50 4b 20 26 26 20 70 49 74 65 72 2d 3e 61  _IPK && pIter->a
16e50 62 54 62 6c 50 6b 5b 69 5d 20 0a 20 20 20 20 20  bTblPk[i] .     
16e60 26 26 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  && sqlite3_colum
16e70 6e 5f 74 79 70 65 28 70 49 74 65 72 2d 3e 70 53  n_type(pIter->pS
16e80 65 6c 65 63 74 2c 20 69 29 3d 3d 53 51 4c 49 54  elect, i)==SQLIT
16e90 45 5f 4e 55 4c 4c 0a 20 20 20 20 29 7b 0a 20 20  E_NULL.    ){.  
16ea0 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
16eb0 54 45 5f 4d 49 53 4d 41 54 43 48 3b 0a 20 20 20  TE_MISMATCH;.   
16ec0 20 20 20 70 2d 3e 7a 45 72 72 6d 73 67 20 3d 20     p->zErrmsg = 
16ed0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
16ee0 22 64 61 74 61 74 79 70 65 20 6d 69 73 6d 61 74  "datatype mismat
16ef0 63 68 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ch");.      retu
16f00 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  rn;.    }..    i
16f10 66 28 20 65 54 79 70 65 3d 3d 52 42 55 5f 44 45  f( eType==RBU_DE
16f20 4c 45 54 45 20 26 26 20 70 49 74 65 72 2d 3e 61  LETE && pIter->a
16f30 62 54 62 6c 50 6b 5b 69 5d 3d 3d 30 20 29 7b 0a  bTblPk[i]==0 ){.
16f40 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
16f50 20 20 20 20 7d 0a 0a 20 20 20 20 70 56 61 6c 20      }..    pVal 
16f60 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
16f70 5f 76 61 6c 75 65 28 70 49 74 65 72 2d 3e 70 53  _value(pIter->pS
16f80 65 6c 65 63 74 2c 20 69 29 3b 0a 20 20 20 20 70  elect, i);.    p
16f90 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62  ->rc = sqlite3_b
16fa0 69 6e 64 5f 76 61 6c 75 65 28 70 57 72 69 74 65  ind_value(pWrite
16fb0 72 2c 20 69 2b 31 2c 20 70 56 61 6c 29 3b 0a 20  r, i+1, pVal);. 
16fc0 20 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20 72     if( p->rc ) r
16fd0 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
16fe0 20 70 49 74 65 72 2d 3e 7a 49 64 78 3d 3d 30 20   pIter->zIdx==0 
16ff0 29 7b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72  ){.    if( pIter
17000 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f  ->eType==RBU_PK_
17010 56 54 41 42 20 0a 20 20 20 20 20 7c 7c 20 70 49  VTAB .     || pI
17020 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f  ter->eType==RBU_
17030 50 4b 5f 4e 4f 4e 45 20 0a 20 20 20 20 20 7c 7c  PK_NONE .     ||
17040 20 28 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d   (pIter->eType==
17050 52 42 55 5f 50 4b 5f 45 58 54 45 52 4e 41 4c 20  RBU_PK_EXTERNAL 
17060 26 26 20 72 62 75 49 73 56 61 63 75 75 6d 28 70  && rbuIsVacuum(p
17070 29 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  )) .    ){.     
17080 20 2f 2a 20 46 6f 72 20 61 20 76 69 72 74 75 61   /* For a virtua
17090 6c 20 74 61 62 6c 65 2c 20 6f 72 20 61 20 74 61  l table, or a ta
170a0 62 6c 65 20 77 69 74 68 20 6e 6f 20 70 72 69 6d  ble with no prim
170b0 61 72 79 20 6b 65 79 2c 20 74 68 65 20 0a 20 20  ary key, the .  
170c0 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74      ** SELECT st
170d0 61 74 65 6d 65 6e 74 20 69 73 3a 0a 20 20 20 20  atement is:.    
170e0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20    **.      **   
170f0 53 45 4c 45 43 54 20 3c 63 6f 6c 73 3e 2c 20 72  SELECT <cols>, r
17100 62 75 5f 63 6f 6e 74 72 6f 6c 2c 20 72 62 75 5f  bu_control, rbu_
17110 72 6f 77 69 64 20 46 52 4f 4d 20 2e 2e 2e 2e 0a  rowid FROM .....
17120 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
17130 2a 20 48 65 6e 63 65 20 63 6f 6c 75 6d 6e 5f 76  * Hence column_v
17140 61 6c 75 65 28 70 49 74 65 72 2d 3e 6e 43 6f 6c  alue(pIter->nCol
17150 2b 31 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  +1)..      */.  
17160 20 20 20 20 61 73 73 65 72 74 43 6f 6c 75 6d 6e      assertColumn
17170 4e 61 6d 65 28 70 49 74 65 72 2d 3e 70 53 65 6c  Name(pIter->pSel
17180 65 63 74 2c 20 70 49 74 65 72 2d 3e 6e 43 6f 6c  ect, pIter->nCol
17190 2b 31 2c 20 0a 20 20 20 20 20 20 20 20 20 20 72  +1, .          r
171a0 62 75 49 73 56 61 63 75 75 6d 28 70 29 20 3f 20  buIsVacuum(p) ? 
171b0 22 72 6f 77 69 64 22 20 3a 20 22 72 62 75 5f 72  "rowid" : "rbu_r
171c0 6f 77 69 64 22 0a 20 20 20 20 20 20 29 3b 0a 20  owid".      );. 
171d0 20 20 20 20 20 70 56 61 6c 20 3d 20 73 71 6c 69       pVal = sqli
171e0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65  te3_column_value
171f0 28 70 49 74 65 72 2d 3e 70 53 65 6c 65 63 74 2c  (pIter->pSelect,
17200 20 70 49 74 65 72 2d 3e 6e 43 6f 6c 2b 31 29 3b   pIter->nCol+1);
17210 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73  .      p->rc = s
17220 71 6c 69 74 65 33 5f 62 69 6e 64 5f 76 61 6c 75  qlite3_bind_valu
17230 65 28 70 57 72 69 74 65 72 2c 20 70 49 74 65 72  e(pWriter, pIter
17240 2d 3e 6e 43 6f 6c 2b 31 2c 20 70 56 61 6c 29 3b  ->nCol+1, pVal);
17250 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
17260 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
17270 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
17280 5f 73 74 65 70 28 70 57 72 69 74 65 72 29 3b 0a  _step(pWriter);.
17290 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 65 73 65      p->rc = rese
172a0 74 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72  tAndCollectError
172b0 28 70 57 72 69 74 65 72 2c 20 26 70 2d 3e 7a 45  (pWriter, &p->zE
172c0 72 72 6d 73 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  rrmsg);.  }.}../
172d0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
172e0 6f 6e 20 64 6f 65 73 20 74 68 65 20 77 6f 72 6b  on does the work
172f0 20 66 6f 72 20 61 6e 20 73 71 6c 69 74 65 33 72   for an sqlite3r
17300 62 75 5f 73 74 65 70 28 29 20 63 61 6c 6c 2e 0a  bu_step() call..
17310 2a 2a 0a 2a 2a 20 54 68 65 20 6f 62 6a 65 63 74  **.** The object
17320 2d 69 74 65 72 61 74 6f 72 20 28 70 2d 3e 6f 62  -iterator (p->ob
17330 6a 69 74 65 72 29 20 63 75 72 72 65 6e 74 6c 79  jiter) currently
17340 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 76 61 6c   points to a val
17350 69 64 20 6f 62 6a 65 63 74 2c 0a 2a 2a 20 61 6e  id object,.** an
17360 64 20 74 68 65 20 69 6e 70 75 74 20 63 75 72 73  d the input curs
17370 6f 72 20 28 70 2d 3e 6f 62 6a 69 74 65 72 2e 70  or (p->objiter.p
17380 53 65 6c 65 63 74 29 20 63 75 72 72 65 6e 74 6c  Select) currentl
17390 79 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 76 61  y points to a va
173a0 6c 69 64 0a 2a 2a 20 69 6e 70 75 74 20 72 6f 77  lid.** input row
173b0 2e 20 50 65 72 66 6f 72 6d 20 77 68 61 74 65 76  . Perform whatev
173c0 65 72 20 70 72 6f 63 65 73 73 69 6e 67 20 69 73  er processing is
173d0 20 72 65 71 75 69 72 65 64 20 61 6e 64 20 72 65   required and re
173e0 74 75 72 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  turn..**.** If n
173f0 6f 20 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  o  error occurs,
17400 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
17410 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
17420 65 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  e, an error code
17430 0a 2a 2a 20 61 6e 64 20 6d 65 73 73 61 67 65 20  .** and message 
17440 69 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20 52  is left in the R
17450 42 55 20 68 61 6e 64 6c 65 20 61 6e 64 20 61 20  BU handle and a 
17460 63 6f 70 79 20 6f 66 20 74 68 65 20 65 72 72 6f  copy of the erro
17470 72 20 63 6f 64 65 0a 2a 2a 20 72 65 74 75 72 6e  r code.** return
17480 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
17490 74 20 72 62 75 53 74 65 70 28 73 71 6c 69 74 65  t rbuStep(sqlite
174a0 33 72 62 75 20 2a 70 29 7b 0a 20 20 52 62 75 4f  3rbu *p){.  RbuO
174b0 62 6a 49 74 65 72 20 2a 70 49 74 65 72 20 3d 20  bjIter *pIter = 
174c0 26 70 2d 3e 6f 62 6a 69 74 65 72 3b 0a 20 20 63  &p->objiter;.  c
174d0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 6b  onst char *zMask
174e0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 65 54 79 70   = 0;.  int eTyp
174f0 65 20 3d 20 72 62 75 53 74 65 70 54 79 70 65 28  e = rbuStepType(
17500 70 2c 20 26 7a 4d 61 73 6b 29 3b 0a 0a 20 20 69  p, &zMask);..  i
17510 66 28 20 65 54 79 70 65 20 29 7b 0a 20 20 20 20  f( eType ){.    
17520 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 52  assert( eType==R
17530 42 55 5f 49 4e 53 45 52 54 20 20 20 20 20 7c 7c  BU_INSERT     ||
17540 20 65 54 79 70 65 3d 3d 52 42 55 5f 44 45 4c 45   eType==RBU_DELE
17550 54 45 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 65  TE.         || e
17560 54 79 70 65 3d 3d 52 42 55 5f 52 45 50 4c 41 43  Type==RBU_REPLAC
17570 45 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 52  E    || eType==R
17580 42 55 5f 49 44 58 5f 44 45 4c 45 54 45 0a 20 20  BU_IDX_DELETE.  
17590 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d         || eType=
175a0 3d 52 42 55 5f 49 44 58 5f 49 4e 53 45 52 54 20  =RBU_IDX_INSERT 
175b0 7c 7c 20 65 54 79 70 65 3d 3d 52 42 55 5f 55 50  || eType==RBU_UP
175c0 44 41 54 45 0a 20 20 20 20 29 3b 0a 20 20 20 20  DATE.    );.    
175d0 61 73 73 65 72 74 28 20 65 54 79 70 65 21 3d 52  assert( eType!=R
175e0 42 55 5f 55 50 44 41 54 45 20 7c 7c 20 70 49 74  BU_UPDATE || pIt
175f0 65 72 2d 3e 7a 49 64 78 3d 3d 30 20 29 3b 0a 0a  er->zIdx==0 );..
17600 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 7a      if( pIter->z
17610 49 64 78 3d 3d 30 20 26 26 20 28 65 54 79 70 65  Idx==0 && (eType
17620 3d 3d 52 42 55 5f 49 44 58 5f 44 45 4c 45 54 45  ==RBU_IDX_DELETE
17630 20 7c 7c 20 65 54 79 70 65 3d 3d 52 42 55 5f 49   || eType==RBU_I
17640 44 58 5f 49 4e 53 45 52 54 29 20 29 7b 0a 20 20  DX_INSERT) ){.  
17650 20 20 20 20 72 62 75 42 61 64 43 6f 6e 74 72 6f      rbuBadContro
17660 6c 45 72 72 6f 72 28 70 29 3b 0a 20 20 20 20 7d  lError(p);.    }
17670 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 65 54  .    else if( eT
17680 79 70 65 3d 3d 52 42 55 5f 52 45 50 4c 41 43 45  ype==RBU_REPLACE
17690 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49   ){.      if( pI
176a0 74 65 72 2d 3e 7a 49 64 78 3d 3d 30 20 29 7b 0a  ter->zIdx==0 ){.
176b0 20 20 20 20 20 20 20 20 70 2d 3e 6e 50 68 61 73          p->nPhas
176c0 65 4f 6e 65 53 74 65 70 20 2b 3d 20 70 2d 3e 6f  eOneStep += p->o
176d0 62 6a 69 74 65 72 2e 6e 49 6e 64 65 78 3b 0a 20  bjiter.nIndex;. 
176e0 20 20 20 20 20 20 20 72 62 75 53 74 65 70 4f 6e         rbuStepOn
176f0 65 4f 70 28 70 2c 20 52 42 55 5f 44 45 4c 45 54  eOp(p, RBU_DELET
17700 45 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  E);.      }.    
17710 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
17720 49 54 45 5f 4f 4b 20 29 20 72 62 75 53 74 65 70  ITE_OK ) rbuStep
17730 4f 6e 65 4f 70 28 70 2c 20 52 42 55 5f 49 4e 53  OneOp(p, RBU_INS
17740 45 52 54 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ERT);.    }.    
17750 65 6c 73 65 20 69 66 28 20 65 54 79 70 65 21 3d  else if( eType!=
17760 52 42 55 5f 55 50 44 41 54 45 20 29 7b 0a 20 20  RBU_UPDATE ){.  
17770 20 20 20 20 72 62 75 53 74 65 70 4f 6e 65 4f 70      rbuStepOneOp
17780 28 70 2c 20 65 54 79 70 65 29 3b 0a 20 20 20 20  (p, eType);.    
17790 7d 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20  }.    else{.    
177a0 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
177b0 2a 70 56 61 6c 3b 0a 20 20 20 20 20 20 73 71 6c  *pVal;.      sql
177c0 69 74 65 33 5f 73 74 6d 74 20 2a 70 55 70 64 61  ite3_stmt *pUpda
177d0 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73  te = 0;.      as
177e0 73 65 72 74 28 20 65 54 79 70 65 3d 3d 52 42 55  sert( eType==RBU
177f0 5f 55 50 44 41 54 45 20 29 3b 0a 20 20 20 20 20  _UPDATE );.     
17800 20 70 2d 3e 6e 50 68 61 73 65 4f 6e 65 53 74 65   p->nPhaseOneSte
17810 70 20 2d 3d 20 70 2d 3e 6f 62 6a 69 74 65 72 2e  p -= p->objiter.
17820 6e 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 72 62  nIndex;.      rb
17830 75 47 65 74 55 70 64 61 74 65 53 74 6d 74 28 70  uGetUpdateStmt(p
17840 2c 20 70 49 74 65 72 2c 20 7a 4d 61 73 6b 2c 20  , pIter, zMask, 
17850 26 70 55 70 64 61 74 65 29 3b 0a 20 20 20 20 20  &pUpdate);.     
17860 20 69 66 28 20 70 55 70 64 61 74 65 20 29 7b 0a   if( pUpdate ){.
17870 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20          int i;. 
17880 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
17890 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
178a0 20 26 26 20 69 3c 70 49 74 65 72 2d 3e 6e 43 6f   && i<pIter->nCo
178b0 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; i++){.       
178c0 20 20 20 63 68 61 72 20 63 20 3d 20 7a 4d 61 73     char c = zMas
178d0 6b 5b 70 49 74 65 72 2d 3e 61 69 53 72 63 4f 72  k[pIter->aiSrcOr
178e0 64 65 72 5b 69 5d 5d 3b 0a 20 20 20 20 20 20 20  der[i]];.       
178f0 20 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65     pVal = sqlite
17900 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28 70  3_column_value(p
17910 49 74 65 72 2d 3e 70 53 65 6c 65 63 74 2c 20 69  Iter->pSelect, i
17920 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
17930 20 70 49 74 65 72 2d 3e 61 62 54 62 6c 50 6b 5b   pIter->abTblPk[
17940 69 5d 20 7c 7c 20 63 21 3d 27 2e 27 20 29 7b 0a  i] || c!='.' ){.
17950 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72              p->r
17960 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  c = sqlite3_bind
17970 5f 76 61 6c 75 65 28 70 55 70 64 61 74 65 2c 20  _value(pUpdate, 
17980 69 2b 31 2c 20 70 56 61 6c 29 3b 0a 20 20 20 20  i+1, pVal);.    
17990 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
179a0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  }.        if( p-
179b0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a  >rc==SQLITE_OK .
179c0 20 20 20 20 20 20 20 20 20 26 26 20 28 70 49 74           && (pIt
179d0 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50  er->eType==RBU_P
179e0 4b 5f 56 54 41 42 20 7c 7c 20 70 49 74 65 72 2d  K_VTAB || pIter-
179f0 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 4e  >eType==RBU_PK_N
17a00 4f 4e 45 29 20 0a 20 20 20 20 20 20 20 20 29 7b  ONE) .        ){
17a10 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69  .          /* Bi
17a20 6e 64 20 74 68 65 20 72 62 75 5f 72 6f 77 69 64  nd the rbu_rowid
17a30 20 76 61 6c 75 65 20 74 6f 20 63 6f 6c 75 6d 6e   value to column
17a40 20 5f 72 6f 77 69 64 5f 20 2a 2f 0a 20 20 20 20   _rowid_ */.    
17a50 20 20 20 20 20 20 61 73 73 65 72 74 43 6f 6c 75        assertColu
17a60 6d 6e 4e 61 6d 65 28 70 49 74 65 72 2d 3e 70 53  mnName(pIter->pS
17a70 65 6c 65 63 74 2c 20 70 49 74 65 72 2d 3e 6e 43  elect, pIter->nC
17a80 6f 6c 2b 31 2c 20 22 72 62 75 5f 72 6f 77 69 64  ol+1, "rbu_rowid
17a90 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 56  ");.          pV
17aa0 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  al = sqlite3_col
17ab0 75 6d 6e 5f 76 61 6c 75 65 28 70 49 74 65 72 2d  umn_value(pIter-
17ac0 3e 70 53 65 6c 65 63 74 2c 20 70 49 74 65 72 2d  >pSelect, pIter-
17ad0 3e 6e 43 6f 6c 2b 31 29 3b 0a 20 20 20 20 20 20  >nCol+1);.      
17ae0 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69      p->rc = sqli
17af0 74 65 33 5f 62 69 6e 64 5f 76 61 6c 75 65 28 70  te3_bind_value(p
17b00 55 70 64 61 74 65 2c 20 70 49 74 65 72 2d 3e 6e  Update, pIter->n
17b10 43 6f 6c 2b 31 2c 20 70 56 61 6c 29 3b 0a 20 20  Col+1, pVal);.  
17b20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
17b30 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
17b40 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
17b50 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70    sqlite3_step(p
17b60 55 70 64 61 74 65 29 3b 0a 20 20 20 20 20 20 20  Update);.       
17b70 20 20 20 70 2d 3e 72 63 20 3d 20 72 65 73 65 74     p->rc = reset
17b80 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28  AndCollectError(
17b90 70 55 70 64 61 74 65 2c 20 26 70 2d 3e 7a 45 72  pUpdate, &p->zEr
17ba0 72 6d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 7d  rmsg);.        }
17bb0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
17bc0 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72   }.  return p->r
17bd0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72  c;.}../*.** Incr
17be0 65 6d 65 6e 74 20 74 68 65 20 73 63 68 65 6d 61  ement the schema
17bf0 20 63 6f 6f 6b 69 65 20 6f 66 20 74 68 65 20 6d   cookie of the m
17c00 61 69 6e 20 64 61 74 61 62 61 73 65 20 6f 70 65  ain database ope
17c10 6e 65 64 20 62 79 20 70 2d 3e 64 62 4d 61 69 6e  ned by p->dbMain
17c20 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 74  ..**.** Or, if t
17c30 68 69 73 20 69 73 20 61 6e 20 52 42 55 20 76 61  his is an RBU va
17c40 63 75 75 6d 2c 20 73 65 74 20 74 68 65 20 73 63  cuum, set the sc
17c50 68 65 6d 61 20 63 6f 6f 6b 69 65 20 6f 66 20 74  hema cookie of t
17c60 68 65 20 6d 61 69 6e 20 64 62 0a 2a 2a 20 6f 70  he main db.** op
17c70 65 6e 65 64 20 62 79 20 70 2d 3e 64 62 4d 61 69  ened by p->dbMai
17c80 6e 20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20 74 68  n to one more th
17c90 61 6e 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f  an the schema co
17ca0 6f 6b 69 65 20 6f 66 20 74 68 65 20 6d 61 69 6e  okie of the main
17cb0 0a 2a 2a 20 64 62 20 6f 70 65 6e 65 64 20 62 79  .** db opened by
17cc0 20 70 2d 3e 64 62 52 62 75 2e 0a 2a 2f 0a 73 74   p->dbRbu..*/.st
17cd0 61 74 69 63 20 76 6f 69 64 20 72 62 75 49 6e 63  atic void rbuInc
17ce0 72 53 63 68 65 6d 61 43 6f 6f 6b 69 65 28 73 71  rSchemaCookie(sq
17cf0 6c 69 74 65 33 72 62 75 20 2a 70 29 7b 0a 20 20  lite3rbu *p){.  
17d00 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
17d10 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
17d20 74 65 33 20 2a 64 62 72 65 61 64 20 3d 20 28 72  te3 *dbread = (r
17d30 62 75 49 73 56 61 63 75 75 6d 28 70 29 20 3f 20  buIsVacuum(p) ? 
17d40 70 2d 3e 64 62 52 62 75 20 3a 20 70 2d 3e 64 62  p->dbRbu : p->db
17d50 4d 61 69 6e 29 3b 0a 20 20 20 20 69 6e 74 20 69  Main);.    int i
17d60 43 6f 6f 6b 69 65 20 3d 20 31 30 30 30 30 30 30  Cookie = 1000000
17d70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  ;.    sqlite3_st
17d80 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 20 20  mt *pStmt;..    
17d90 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65 41  p->rc = prepareA
17da0 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 64  ndCollectError(d
17db0 62 72 65 61 64 2c 20 26 70 53 74 6d 74 2c 20 26  bread, &pStmt, &
17dc0 70 2d 3e 7a 45 72 72 6d 73 67 2c 20 0a 20 20 20  p->zErrmsg, .   
17dd0 20 20 20 20 20 22 50 52 41 47 4d 41 20 73 63 68       "PRAGMA sch
17de0 65 6d 61 5f 76 65 72 73 69 6f 6e 22 0a 20 20 20  ema_version".   
17df0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72   );.    if( p->r
17e00 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
17e10 20 20 20 20 20 20 2f 2a 20 43 6f 76 65 72 61 67        /* Coverag
17e20 65 3a 20 69 74 20 6d 61 79 20 62 65 20 74 68 61  e: it may be tha
17e30 74 20 74 68 69 73 20 73 71 6c 69 74 65 33 5f 73  t this sqlite3_s
17e40 74 65 70 28 29 20 63 61 6e 6e 6f 74 20 66 61 69  tep() cannot fai
17e50 6c 2e 20 54 68 65 72 65 0a 20 20 20 20 20 20 2a  l. There.      *
17e60 2a 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 74  * is already a t
17e70 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c  ransaction open,
17e80 20 73 6f 20 74 68 65 20 70 72 65 70 61 72 65 64   so the prepared
17e90 20 73 74 61 74 65 6d 65 6e 74 20 63 61 6e 6e 6f   statement canno
17ea0 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 72 6f 77  t.      ** throw
17eb0 20 61 6e 20 53 51 4c 49 54 45 5f 53 43 48 45 4d   an SQLITE_SCHEM
17ec0 41 20 65 78 63 65 70 74 69 6f 6e 2e 20 54 68 65  A exception. The
17ed0 20 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 70   only database p
17ee0 61 67 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  age the.      **
17ef0 20 73 74 61 74 65 6d 65 6e 74 20 72 65 61 64 73   statement reads
17f00 20 69 73 20 70 61 67 65 20 31 2c 20 77 68 69 63   is page 1, whic
17f10 68 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  h is guaranteed 
17f20 74 6f 20 62 65 20 69 6e 20 74 68 65 20 63 61 63  to be in the cac
17f30 68 65 2e 0a 20 20 20 20 20 20 2a 2a 20 41 6e 64  he..      ** And
17f40 20 6e 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63   no memory alloc
17f50 61 74 69 6f 6e 73 20 61 72 65 20 72 65 71 75 69  ations are requi
17f60 72 65 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69  red.  */.      i
17f70 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  f( SQLITE_ROW==s
17f80 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
17f90 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 43  t) ){.        iC
17fa0 6f 6f 6b 69 65 20 3d 20 73 71 6c 69 74 65 33 5f  ookie = sqlite3_
17fb0 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74  column_int(pStmt
17fc0 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
17fd0 20 20 20 20 72 62 75 46 69 6e 61 6c 69 7a 65 28      rbuFinalize(
17fe0 70 2c 20 70 53 74 6d 74 29 3b 0a 20 20 20 20 7d  p, pStmt);.    }
17ff0 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  .    if( p->rc==
18000 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18010 20 20 20 72 62 75 4d 50 72 69 6e 74 66 45 78 65     rbuMPrintfExe
18020 63 28 70 2c 20 70 2d 3e 64 62 4d 61 69 6e 2c 20  c(p, p->dbMain, 
18030 22 50 52 41 47 4d 41 20 73 63 68 65 6d 61 5f 76  "PRAGMA schema_v
18040 65 72 73 69 6f 6e 20 3d 20 25 64 22 2c 20 69 43  ersion = %d", iC
18050 6f 6f 6b 69 65 2b 31 29 3b 0a 20 20 20 20 7d 0a  ookie+1);.    }.
18060 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64    }.}../*.** Upd
18070 61 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ate the contents
18080 20 6f 66 20 74 68 65 20 72 62 75 5f 73 74 61 74   of the rbu_stat
18090 65 20 74 61 62 6c 65 20 77 69 74 68 69 6e 20 74  e table within t
180a0 68 65 20 72 62 75 20 64 61 74 61 62 61 73 65 2e  he rbu database.
180b0 20 54 68 65 0a 2a 2a 20 76 61 6c 75 65 20 73 74   The.** value st
180c0 6f 72 65 64 20 69 6e 20 74 68 65 20 52 42 55 5f  ored in the RBU_
180d0 53 54 41 54 45 5f 53 54 41 47 45 20 63 6f 6c 75  STATE_STAGE colu
180e0 6d 6e 20 69 73 20 65 53 74 61 67 65 2e 20 41 6c  mn is eStage. Al
180f0 6c 20 6f 74 68 65 72 20 76 61 6c 75 65 73 0a 2a  l other values.*
18100 2a 20 61 72 65 20 64 65 74 65 72 6d 69 6e 65 64  * are determined
18110 20 62 79 20 69 6e 73 70 65 63 74 69 6e 67 20 74   by inspecting t
18120 68 65 20 72 62 75 20 68 61 6e 64 6c 65 20 70 61  he rbu handle pa
18130 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
18140 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73  t argument..*/.s
18150 74 61 74 69 63 20 76 6f 69 64 20 72 62 75 53 61  tatic void rbuSa
18160 76 65 53 74 61 74 65 28 73 71 6c 69 74 65 33 72  veState(sqlite3r
18170 62 75 20 2a 70 2c 20 69 6e 74 20 65 53 74 61 67  bu *p, int eStag
18180 65 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  e){.  if( p->rc=
18190 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d  =SQLITE_OK || p-
181a0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45  >rc==SQLITE_DONE
181b0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
181c0 73 74 6d 74 20 2a 70 49 6e 73 65 72 74 20 3d 20  stmt *pInsert = 
181d0 30 3b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 0a  0;.    int rc;..
181e0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 7a      assert( p->z
181f0 45 72 72 6d 73 67 3d 3d 30 20 29 3b 0a 20 20 20  Errmsg==0 );.   
18200 20 72 63 20 3d 20 70 72 65 70 61 72 65 46 72 65   rc = prepareFre
18210 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72  eAndCollectError
18220 28 70 2d 3e 64 62 52 62 75 2c 20 26 70 49 6e 73  (p->dbRbu, &pIns
18230 65 72 74 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67  ert, &p->zErrmsg
18240 2c 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  , .        sqlit
18250 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20  e3_mprintf(.    
18260 20 20 20 20 20 20 22 49 4e 53 45 52 54 20 4f 52        "INSERT OR
18270 20 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 25 73   REPLACE INTO %s
18280 2e 72 62 75 5f 73 74 61 74 65 28 6b 2c 20 76 29  .rbu_state(k, v)
18290 20 56 41 4c 55 45 53 20 22 0a 20 20 20 20 20 20   VALUES ".      
182a0 20 20 20 20 22 28 25 64 2c 20 25 64 29 2c 20 22      "(%d, %d), "
182b0 0a 20 20 20 20 20 20 20 20 20 20 22 28 25 64 2c  .          "(%d,
182c0 20 25 51 29 2c 20 22 0a 20 20 20 20 20 20 20 20   %Q), ".        
182d0 20 20 22 28 25 64 2c 20 25 51 29 2c 20 22 0a 20    "(%d, %Q), ". 
182e0 20 20 20 20 20 20 20 20 20 22 28 25 64 2c 20 25           "(%d, %
182f0 64 29 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20  d), ".          
18300 22 28 25 64 2c 20 25 64 29 2c 20 22 0a 20 20 20  "(%d, %d), ".   
18310 20 20 20 20 20 20 20 22 28 25 64 2c 20 25 6c 6c         "(%d, %ll
18320 64 29 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20  d), ".          
18330 22 28 25 64 2c 20 25 6c 6c 64 29 2c 20 22 0a 20  "(%d, %lld), ". 
18340 20 20 20 20 20 20 20 20 20 22 28 25 64 2c 20 25           "(%d, %
18350 6c 6c 64 29 2c 20 22 0a 20 20 20 20 20 20 20 20  lld), ".        
18360 20 20 22 28 25 64 2c 20 25 6c 6c 64 29 20 22 2c    "(%d, %lld) ",
18370 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 53  .          p->zS
18380 74 61 74 65 44 62 2c 0a 20 20 20 20 20 20 20 20  tateDb,.        
18390 20 20 52 42 55 5f 53 54 41 54 45 5f 53 54 41 47    RBU_STATE_STAG
183a0 45 2c 20 65 53 74 61 67 65 2c 0a 20 20 20 20 20  E, eStage,.     
183b0 20 20 20 20 20 52 42 55 5f 53 54 41 54 45 5f 54       RBU_STATE_T
183c0 42 4c 2c 20 70 2d 3e 6f 62 6a 69 74 65 72 2e 7a  BL, p->objiter.z
183d0 54 62 6c 2c 20 0a 20 20 20 20 20 20 20 20 20 20  Tbl, .          
183e0 52 42 55 5f 53 54 41 54 45 5f 49 44 58 2c 20 70  RBU_STATE_IDX, p
183f0 2d 3e 6f 62 6a 69 74 65 72 2e 7a 49 64 78 2c 20  ->objiter.zIdx, 
18400 0a 20 20 20 20 20 20 20 20 20 20 52 42 55 5f 53  .          RBU_S
18410 54 41 54 45 5f 52 4f 57 2c 20 70 2d 3e 6e 53 74  TATE_ROW, p->nSt
18420 65 70 2c 20 0a 20 20 20 20 20 20 20 20 20 20 52  ep, .          R
18430 42 55 5f 53 54 41 54 45 5f 50 52 4f 47 52 45 53  BU_STATE_PROGRES
18440 53 2c 20 70 2d 3e 6e 50 72 6f 67 72 65 73 73 2c  S, p->nProgress,
18450 0a 20 20 20 20 20 20 20 20 20 20 52 42 55 5f 53  .          RBU_S
18460 54 41 54 45 5f 43 4b 50 54 2c 20 70 2d 3e 69 57  TATE_CKPT, p->iW
18470 61 6c 43 6b 73 75 6d 2c 0a 20 20 20 20 20 20 20  alCksum,.       
18480 20 20 20 52 42 55 5f 53 54 41 54 45 5f 43 4f 4f     RBU_STATE_COO
18490 4b 49 45 2c 20 28 69 36 34 29 70 2d 3e 70 54 61  KIE, (i64)p->pTa
184a0 72 67 65 74 46 64 2d 3e 69 43 6f 6f 6b 69 65 2c  rgetFd->iCookie,
184b0 0a 20 20 20 20 20 20 20 20 20 20 52 42 55 5f 53  .          RBU_S
184c0 54 41 54 45 5f 4f 41 4c 53 5a 2c 20 70 2d 3e 69  TATE_OALSZ, p->i
184d0 4f 61 6c 53 7a 2c 0a 20 20 20 20 20 20 20 20 20  OalSz,.         
184e0 20 52 42 55 5f 53 54 41 54 45 5f 50 48 41 53 45   RBU_STATE_PHASE
184f0 4f 4e 45 53 54 45 50 2c 20 70 2d 3e 6e 50 68 61  ONESTEP, p->nPha
18500 73 65 4f 6e 65 53 74 65 70 0a 20 20 20 20 20 20  seOneStep.      
18510 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 61 73 73  ).    );.    ass
18520 65 72 74 28 20 70 49 6e 73 65 72 74 3d 3d 30 20  ert( pInsert==0 
18530 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  || rc==SQLITE_OK
18540 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d   );..    if( rc=
18550 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18560 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70      sqlite3_step
18570 28 70 49 6e 73 65 72 74 29 3b 0a 20 20 20 20 20  (pInsert);.     
18580 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69   rc = sqlite3_fi
18590 6e 61 6c 69 7a 65 28 70 49 6e 73 65 72 74 29 3b  nalize(pInsert);
185a0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
185b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70  c!=SQLITE_OK ) p
185c0 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 7d 0a 7d  ->rc = rc;.  }.}
185d0 0a 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74 68  .../*.** Step th
185e0 65 20 52 42 55 20 6f 62 6a 65 63 74 2e 0a 2a 2f  e RBU object..*/
185f0 0a 69 6e 74 20 73 71 6c 69 74 65 33 72 62 75 5f  .int sqlite3rbu_
18600 73 74 65 70 28 73 71 6c 69 74 65 33 72 62 75 20  step(sqlite3rbu 
18610 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a  *p){.  if( p ){.
18620 20 20 20 20 73 77 69 74 63 68 28 20 70 2d 3e 65      switch( p->e
18630 53 74 61 67 65 20 29 7b 0a 20 20 20 20 20 20 63  Stage ){.      c
18640 61 73 65 20 52 42 55 5f 53 54 41 47 45 5f 4f 41  ase RBU_STAGE_OA
18650 4c 3a 20 7b 0a 20 20 20 20 20 20 20 20 52 62 75  L: {.        Rbu
18660 4f 62 6a 49 74 65 72 20 2a 70 49 74 65 72 20 3d  ObjIter *pIter =
18670 20 26 70 2d 3e 6f 62 6a 69 74 65 72 3b 0a 20 20   &p->objiter;.  
18680 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 2d 3e        while( p->
18690 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
186a0 20 70 49 74 65 72 2d 3e 7a 54 62 6c 20 29 7b 0a   pIter->zTbl ){.
186b0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
186c0 49 74 65 72 2d 3e 62 43 6c 65 61 6e 75 70 20 29  Iter->bCleanup )
186d0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
186e0 20 43 6c 65 61 6e 20 75 70 20 74 68 65 20 72 62   Clean up the rb
186f0 75 5f 74 6d 70 5f 78 78 78 20 74 61 62 6c 65 20  u_tmp_xxx table 
18700 66 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75 73  for the previous
18710 20 74 61 62 6c 65 2e 20 49 74 20 0a 20 20 20 20   table. It .    
18720 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6e 6e 6f          ** canno
18730 74 20 62 65 20 64 72 6f 70 70 65 64 20 61 73 20  t be dropped as 
18740 74 68 65 72 65 20 61 72 65 20 63 75 72 72 65 6e  there are curren
18750 74 6c 79 20 61 63 74 69 76 65 20 53 51 4c 20 73  tly active SQL s
18760 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 20 20 20  tatements..     
18770 20 20 20 20 20 20 20 2a 2a 20 42 75 74 20 74 68         ** But th
18780 65 20 63 6f 6e 74 65 6e 74 73 20 63 61 6e 20 62  e contents can b
18790 65 20 64 65 6c 65 74 65 64 2e 20 20 2a 2f 0a 20  e deleted.  */. 
187a0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
187b0 62 75 49 73 56 61 63 75 75 6d 28 70 29 3d 3d 30  buIsVacuum(p)==0
187c0 20 26 26 20 70 49 74 65 72 2d 3e 61 62 49 6e 64   && pIter->abInd
187d0 65 78 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  exed ){.        
187e0 20 20 20 20 20 20 72 62 75 4d 50 72 69 6e 74 66        rbuMPrintf
187f0 45 78 65 63 28 70 2c 20 70 2d 3e 64 62 52 62 75  Exec(p, p->dbRbu
18800 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
18810 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f       "DELETE FRO
18820 4d 20 25 73 2e 27 72 62 75 5f 74 6d 70 5f 25 71  M %s.'rbu_tmp_%q
18830 27 22 2c 20 70 2d 3e 7a 53 74 61 74 65 44 62 2c  '", p->zStateDb,
18840 20 70 49 74 65 72 2d 3e 7a 44 61 74 61 54 62 6c   pIter->zDataTbl
18850 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29  .              )
18860 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
18870 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
18880 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 62 75  .            rbu
18890 4f 62 6a 49 74 65 72 50 72 65 70 61 72 65 41 6c  ObjIterPrepareAl
188a0 6c 28 70 2c 20 70 49 74 65 72 2c 20 30 29 3b 0a  l(p, pIter, 0);.
188b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
188c0 41 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e  Advance to the n
188d0 65 78 74 20 72 6f 77 20 74 6f 20 70 72 6f 63 65  ext row to proce
188e0 73 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ss. */.         
188f0 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
18900 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
18910 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 63 20           int rc 
18920 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  = sqlite3_step(p
18930 49 74 65 72 2d 3e 70 53 65 6c 65 63 74 29 3b 0a  Iter->pSelect);.
18940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
18950 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  ( rc==SQLITE_ROW
18960 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
18970 20 20 20 20 70 2d 3e 6e 50 72 6f 67 72 65 73 73      p->nProgress
18980 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
18990 20 20 20 20 70 2d 3e 6e 53 74 65 70 2b 2b 3b 0a      p->nStep++;.
189a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
189b0 72 65 74 75 72 6e 20 72 62 75 53 74 65 70 28 70  return rbuStep(p
189c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
189d0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
189e0 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33   p->rc = sqlite3
189f0 5f 72 65 73 65 74 28 70 49 74 65 72 2d 3e 70 53  _reset(pIter->pS
18a00 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20  elect);.        
18a10 20 20 20 20 20 20 70 2d 3e 6e 53 74 65 70 20 3d        p->nStep =
18a20 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
18a30 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20  }.          }.. 
18a40 20 20 20 20 20 20 20 20 20 72 62 75 4f 62 6a 49           rbuObjI
18a50 74 65 72 4e 65 78 74 28 70 2c 20 70 49 74 65 72  terNext(p, pIter
18a60 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  );.        }..  
18a70 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
18a80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18a90 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
18aa0 70 49 74 65 72 2d 3e 7a 54 62 6c 3d 3d 30 20 29  pIter->zTbl==0 )
18ab0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 62 75 53  ;.          rbuS
18ac0 61 76 65 53 74 61 74 65 28 70 2c 20 52 42 55 5f  aveState(p, RBU_
18ad0 53 54 41 47 45 5f 4d 4f 56 45 29 3b 0a 20 20 20  STAGE_MOVE);.   
18ae0 20 20 20 20 20 20 20 72 62 75 49 6e 63 72 53 63         rbuIncrSc
18af0 68 65 6d 61 43 6f 6f 6b 69 65 28 70 29 3b 0a 20  hemaCookie(p);. 
18b00 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e           if( p->
18b10 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
18b20 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  .            p->
18b30 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65  rc = sqlite3_exe
18b40 63 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 43 4f  c(p->dbMain, "CO
18b50 4d 4d 49 54 22 2c 20 30 2c 20 30 2c 20 26 70 2d  MMIT", 0, 0, &p-
18b60 3e 7a 45 72 72 6d 73 67 29 3b 0a 20 20 20 20 20  >zErrmsg);.     
18b70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
18b80 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
18b90 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
18ba0 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c       p->rc = sql
18bb0 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 52  ite3_exec(p->dbR
18bc0 62 75 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c  bu, "COMMIT", 0,
18bd0 20 30 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 29   0, &p->zErrmsg)
18be0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
18bf0 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 67          p->eStag
18c00 65 20 3d 20 52 42 55 5f 53 54 41 47 45 5f 4d 4f  e = RBU_STAGE_MO
18c10 56 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  VE;.        }.  
18c20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
18c30 20 20 20 7d 0a 0a 20 20 20 20 20 20 63 61 73 65     }..      case
18c40 20 52 42 55 5f 53 54 41 47 45 5f 4d 4f 56 45 3a   RBU_STAGE_MOVE:
18c50 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   {.        if( p
18c60 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
18c70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 62 75  ){.          rbu
18c80 4d 6f 76 65 4f 61 6c 46 69 6c 65 28 70 29 3b 0a  MoveOalFile(p);.
18c90 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 50 72            p->nPr
18ca0 6f 67 72 65 73 73 2b 2b 3b 0a 20 20 20 20 20 20  ogress++;.      
18cb0 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
18cc0 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
18cd0 20 20 63 61 73 65 20 52 42 55 5f 53 54 41 47 45    case RBU_STAGE
18ce0 5f 43 4b 50 54 3a 20 7b 0a 20 20 20 20 20 20 20  _CKPT: {.       
18cf0 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
18d00 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
18d10 20 20 20 69 66 28 20 70 2d 3e 6e 53 74 65 70 3e     if( p->nStep>
18d20 3d 70 2d 3e 6e 46 72 61 6d 65 20 29 7b 0a 20 20  =p->nFrame ){.  
18d30 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
18d40 33 5f 66 69 6c 65 20 2a 70 44 62 20 3d 20 70 2d  3_file *pDb = p-
18d50 3e 70 54 61 72 67 65 74 46 64 2d 3e 70 52 65 61  >pTargetFd->pRea
18d60 6c 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20  l;.  .          
18d70 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 64 62    /* Sync the db
18d80 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20   file */.       
18d90 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 44 62       p->rc = pDb
18da0 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53 79 6e  ->pMethods->xSyn
18db0 63 28 70 44 62 2c 20 53 51 4c 49 54 45 5f 53 59  c(pDb, SQLITE_SY
18dc0 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20 0a 20  NC_NORMAL);.  . 
18dd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 70             /* Up
18de0 64 61 74 65 20 6e 42 61 63 6b 66 69 6c 6c 20 2a  date nBackfill *
18df0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  /.            if
18e00 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
18e10 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
18e20 20 20 20 20 76 6f 69 64 20 76 6f 6c 61 74 69 6c      void volatil
18e30 65 20 2a 70 74 72 3b 0a 20 20 20 20 20 20 20 20  e *ptr;.        
18e40 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 44        p->rc = pD
18e50 62 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53 68  b->pMethods->xSh
18e60 6d 4d 61 70 28 70 44 62 2c 20 30 2c 20 33 32 2a  mMap(pDb, 0, 32*
18e70 31 30 32 34 2c 20 30 2c 20 26 70 74 72 29 3b 0a  1024, 0, &ptr);.
18e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
18e90 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
18ea0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
18eb0 20 20 20 20 20 20 28 28 75 33 32 20 76 6f 6c 61        ((u32 vola
18ec0 74 69 6c 65 2a 29 70 74 72 29 5b 32 34 5d 20 3d  tile*)ptr)[24] =
18ed0 20 70 2d 3e 69 4d 61 78 46 72 61 6d 65 3b 0a 20   p->iMaxFrame;. 
18ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
18ef0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 0a             }.  .
18f00 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
18f10 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
18f20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
18f30 20 20 70 2d 3e 65 53 74 61 67 65 20 3d 20 52 42    p->eStage = RB
18f40 55 5f 53 54 41 47 45 5f 44 4f 4e 45 3b 0a 20 20  U_STAGE_DONE;.  
18f50 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72              p->r
18f60 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  c = SQLITE_DONE;
18f70 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
18f80 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
18f90 20 20 20 20 20 20 20 20 20 20 20 20 52 62 75 46              RbuF
18fa0 72 61 6d 65 20 2a 70 46 72 61 6d 65 20 3d 20 26  rame *pFrame = &
18fb0 70 2d 3e 61 46 72 61 6d 65 5b 70 2d 3e 6e 53 74  p->aFrame[p->nSt
18fc0 65 70 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ep];.           
18fd0 20 72 62 75 43 68 65 63 6b 70 6f 69 6e 74 46 72   rbuCheckpointFr
18fe0 61 6d 65 28 70 2c 20 70 46 72 61 6d 65 29 3b 0a  ame(p, pFrame);.
18ff0 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e              p->n
19000 53 74 65 70 2b 2b 3b 0a 20 20 20 20 20 20 20 20  Step++;.        
19010 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d    }.          p-
19020 3e 6e 50 72 6f 67 72 65 73 73 2b 2b 3b 0a 20 20  >nProgress++;.  
19030 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
19040 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a  break;.      }..
19050 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20        default:. 
19060 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
19070 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 70    }.    return p
19080 2d 3e 72 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ->rc;.  }else{. 
19090 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
190a0 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 7d 0a 0a 2f  _NOMEM;.  }.}../
190b0 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 73 74 72  *.** Compare str
190c0 69 6e 67 73 20 7a 31 20 61 6e 64 20 7a 32 2c 20  ings z1 and z2, 
190d0 72 65 74 75 72 6e 69 6e 67 20 30 20 69 66 20 74  returning 0 if t
190e0 68 65 79 20 61 72 65 20 69 64 65 6e 74 69 63 61  hey are identica
190f0 6c 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a  l, or non-zero.*
19100 2a 20 6f 74 68 65 72 77 69 73 65 2e 20 45 69 74  * otherwise. Eit
19110 68 65 72 20 6f 72 20 62 6f 74 68 20 61 72 67 75  her or both argu
19120 6d 65 6e 74 20 6d 61 79 20 62 65 20 4e 55 4c 4c  ment may be NULL
19130 2e 20 54 77 6f 20 4e 55 4c 4c 20 76 61 6c 75 65  . Two NULL value
19140 73 20 61 72 65 0a 2a 2a 20 63 6f 6e 73 69 64 65  s are.** conside
19150 72 65 64 20 65 71 75 61 6c 2c 20 61 6e 64 20 4e  red equal, and N
19160 55 4c 4c 20 69 73 20 63 6f 6e 73 69 64 65 72 65  ULL is considere
19170 64 20 64 69 73 74 69 6e 63 74 20 66 72 6f 6d 20  d distinct from 
19180 61 6c 6c 20 6f 74 68 65 72 20 76 61 6c 75 65 73  all other values
19190 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
191a0 72 62 75 53 74 72 43 6f 6d 70 61 72 65 28 63 6f  rbuStrCompare(co
191b0 6e 73 74 20 63 68 61 72 20 2a 7a 31 2c 20 63 6f  nst char *z1, co
191c0 6e 73 74 20 63 68 61 72 20 2a 7a 32 29 7b 0a 20  nst char *z2){. 
191d0 20 69 66 28 20 7a 31 3d 3d 30 20 26 26 20 7a 32   if( z1==0 && z2
191e0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
191f0 20 20 69 66 28 20 7a 31 3d 3d 30 20 7c 7c 20 7a    if( z1==0 || z
19200 32 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  2==0 ) return 1;
19210 0a 20 20 72 65 74 75 72 6e 20 28 73 71 6c 69 74  .  return (sqlit
19220 65 33 5f 73 74 72 69 63 6d 70 28 7a 31 2c 20 7a  e3_stricmp(z1, z
19230 32 29 21 3d 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  2)!=0);.}../*.**
19240 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
19250 73 20 63 61 6c 6c 65 64 20 61 73 20 70 61 72 74  s called as part
19260 20 6f 66 20 73 71 6c 69 74 65 33 72 62 75 5f 6f   of sqlite3rbu_o
19270 70 65 6e 28 29 20 77 68 65 6e 20 69 6e 69 74 69  pen() when initi
19280 61 6c 69 7a 69 6e 67 0a 2a 2a 20 61 6e 20 72 62  alizing.** an rb
19290 75 20 68 61 6e 64 6c 65 20 69 6e 20 4f 41 4c 20  u handle in OAL 
192a0 73 74 61 67 65 2e 20 49 66 20 74 68 65 20 72 62  stage. If the rb
192b0 75 20 75 70 64 61 74 65 20 68 61 73 20 6e 6f 74  u update has not
192c0 20 73 74 61 72 74 65 64 20 28 69 2e 65 2e 0a 2a   started (i.e..*
192d0 2a 20 74 68 65 20 72 62 75 5f 73 74 61 74 65 20  * the rbu_state 
192e0 74 61 62 6c 65 20 77 61 73 20 65 6d 70 74 79 29  table was empty)
192f0 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20   it is a no-op. 
19300 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 61 72  Otherwise, it ar
19310 72 61 6e 67 65 73 0a 2a 2a 20 74 68 69 6e 67 73  ranges.** things
19320 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65 78   so that the nex
19330 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  t call to sqlite
19340 33 72 62 75 5f 73 74 65 70 28 29 20 63 6f 6e 74  3rbu_step() cont
19350 69 6e 75 65 73 20 6f 6e 20 66 72 6f 6d 0a 2a 2a  inues on from.**
19360 20 77 68 65 72 65 20 74 68 65 20 70 72 65 76 69   where the previ
19370 6f 75 73 20 72 62 75 20 68 61 6e 64 6c 65 20 6c  ous rbu handle l
19380 65 66 74 20 6f 66 66 2e 0a 2a 2a 0a 2a 2a 20 49  eft off..**.** I
19390 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
193a0 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  s, an error code
193b0 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61   and error messa
193c0 67 65 20 61 72 65 20 6c 65 66 74 20 69 6e 20 74  ge are left in t
193d0 68 65 0a 2a 2a 20 72 62 75 20 68 61 6e 64 6c 65  he.** rbu handle
193e0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
193f0 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  irst argument..*
19400 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62  /.static void rb
19410 75 53 65 74 75 70 4f 61 6c 28 73 71 6c 69 74 65  uSetupOal(sqlite
19420 33 72 62 75 20 2a 70 2c 20 52 62 75 53 74 61 74  3rbu *p, RbuStat
19430 65 20 2a 70 53 74 61 74 65 29 7b 0a 20 20 61 73  e *pState){.  as
19440 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  sert( p->rc==SQL
19450 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20  ITE_OK );.  if( 
19460 70 53 74 61 74 65 2d 3e 7a 54 62 6c 20 29 7b 0a  pState->zTbl ){.
19470 20 20 20 20 52 62 75 4f 62 6a 49 74 65 72 20 2a      RbuObjIter *
19480 70 49 74 65 72 20 3d 20 26 70 2d 3e 6f 62 6a 69  pIter = &p->obji
19490 74 65 72 3b 0a 20 20 20 20 69 6e 74 20 72 63 20  ter;.    int rc 
194a0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
194b0 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
194c0 49 54 45 5f 4f 4b 20 26 26 20 70 49 74 65 72 2d  ITE_OK && pIter-
194d0 3e 7a 54 62 6c 20 26 26 20 28 70 49 74 65 72 2d  >zTbl && (pIter-
194e0 3e 62 43 6c 65 61 6e 75 70 20 0a 20 20 20 20 20  >bCleanup .     
194f0 20 20 7c 7c 20 72 62 75 53 74 72 43 6f 6d 70 61    || rbuStrCompa
19500 72 65 28 70 49 74 65 72 2d 3e 7a 49 64 78 2c 20  re(pIter->zIdx, 
19510 70 53 74 61 74 65 2d 3e 7a 49 64 78 29 0a 20 20  pState->zIdx).  
19520 20 20 20 20 20 7c 7c 20 72 62 75 53 74 72 43 6f       || rbuStrCo
19530 6d 70 61 72 65 28 70 49 74 65 72 2d 3e 7a 54 62  mpare(pIter->zTb
19540 6c 2c 20 70 53 74 61 74 65 2d 3e 7a 54 62 6c 29  l, pState->zTbl)
19550 20 0a 20 20 20 20 29 29 7b 0a 20 20 20 20 20 20   .    )){.      
19560 72 63 20 3d 20 72 62 75 4f 62 6a 49 74 65 72 4e  rc = rbuObjIterN
19570 65 78 74 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  ext(p, pIter);. 
19580 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63     }..    if( rc
19590 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21  ==SQLITE_OK && !
195a0 70 49 74 65 72 2d 3e 7a 54 62 6c 20 29 7b 0a 20  pIter->zTbl ){. 
195b0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
195c0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 70 2d  _ERROR;.      p-
195d0 3e 7a 45 72 72 6d 73 67 20 3d 20 73 71 6c 69 74  >zErrmsg = sqlit
195e0 65 33 5f 6d 70 72 69 6e 74 66 28 22 72 62 75 5f  e3_mprintf("rbu_
195f0 73 74 61 74 65 20 6d 69 73 6d 61 74 63 68 20 65  state mismatch e
19600 72 72 6f 72 22 29 3b 0a 20 20 20 20 7d 0a 0a 20  rror");.    }.. 
19610 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
19620 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d  E_OK ){.      p-
19630 3e 6e 53 74 65 70 20 3d 20 70 53 74 61 74 65 2d  >nStep = pState-
19640 3e 6e 52 6f 77 3b 0a 20 20 20 20 20 20 72 63 20  >nRow;.      rc 
19650 3d 20 72 62 75 4f 62 6a 49 74 65 72 50 72 65 70  = rbuObjIterPrep
19660 61 72 65 41 6c 6c 28 70 2c 20 26 70 2d 3e 6f 62  areAll(p, &p->ob
19670 6a 69 74 65 72 2c 20 70 2d 3e 6e 53 74 65 70 29  jiter, p->nStep)
19680 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 2d 3e  ;.    }..    p->
19690 72 63 20 3d 20 72 63 3b 0a 20 20 7d 0a 7d 0a 0a  rc = rc;.  }.}..
196a0 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69  /*.** If there i
196b0 73 20 61 20 22 2a 2d 6f 61 6c 22 20 66 69 6c 65  s a "*-oal" file
196c0 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73   in the file-sys
196d0 74 65 6d 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  tem correspondin
196e0 67 20 74 6f 20 74 68 65 0a 2a 2a 20 74 61 72 67  g to the.** targ
196f0 65 74 20 64 61 74 61 62 61 73 65 20 69 6e 20 74  et database in t
19700 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20  he file-system, 
19710 64 65 6c 65 74 65 20 69 74 2e 20 49 66 20 61 6e  delete it. If an
19720 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 0a 2a   error occurs,.*
19730 2a 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  * leave an error
19740 20 63 6f 64 65 20 61 6e 64 20 65 72 72 6f 72 20   code and error 
19750 6d 65 73 73 61 67 65 20 69 6e 20 74 68 65 20 72  message in the r
19760 62 75 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74  bu handle..*/.st
19770 61 74 69 63 20 76 6f 69 64 20 72 62 75 44 65 6c  atic void rbuDel
19780 65 74 65 4f 61 6c 46 69 6c 65 28 73 71 6c 69 74  eteOalFile(sqlit
19790 65 33 72 62 75 20 2a 70 29 7b 0a 20 20 63 68 61  e3rbu *p){.  cha
197a0 72 20 2a 7a 4f 61 6c 20 3d 20 72 62 75 4d 50 72  r *zOal = rbuMPr
197b0 69 6e 74 66 28 70 2c 20 22 25 73 2d 6f 61 6c 22  intf(p, "%s-oal"
197c0 2c 20 70 2d 3e 7a 54 61 72 67 65 74 29 3b 0a 20  , p->zTarget);. 
197d0 20 69 66 28 20 7a 4f 61 6c 20 29 7b 0a 20 20 20   if( zOal ){.   
197e0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
197f0 66 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73  fs = sqlite3_vfs
19800 5f 66 69 6e 64 28 30 29 3b 0a 20 20 20 20 61 73  _find(0);.    as
19810 73 65 72 74 28 20 70 56 66 73 20 26 26 20 70 2d  sert( pVfs && p-
19820 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
19830 26 20 70 2d 3e 7a 45 72 72 6d 73 67 3d 3d 30 20  & p->zErrmsg==0 
19840 29 3b 0a 20 20 20 20 70 56 66 73 2d 3e 78 44 65  );.    pVfs->xDe
19850 6c 65 74 65 28 70 56 66 73 2c 20 7a 4f 61 6c 2c  lete(pVfs, zOal,
19860 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
19870 5f 66 72 65 65 28 7a 4f 61 6c 29 3b 0a 20 20 7d  _free(zOal);.  }
19880 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
19890 74 65 20 61 20 70 72 69 76 61 74 65 20 72 62 75  te a private rbu
198a0 20 56 46 53 20 66 6f 72 20 74 68 65 20 72 62 75   VFS for the rbu
198b0 20 68 61 6e 64 6c 65 20 70 61 73 73 65 64 20 61   handle passed a
198c0 73 20 74 68 65 20 6f 6e 6c 79 0a 2a 2a 20 61 72  s the only.** ar
198d0 67 75 6d 65 6e 74 2e 20 54 68 69 73 20 56 46 53  gument. This VFS
198e0 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 75 6e   will be used un
198f0 6c 65 73 73 20 74 68 65 20 63 61 6c 6c 20 74 6f  less the call to
19900 20 73 71 6c 69 74 65 33 72 62 75 5f 6f 70 65 6e   sqlite3rbu_open
19910 28 29 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20  ().** specified 
19920 61 20 55 52 49 20 77 69 74 68 20 61 20 76 66 73  a URI with a vfs
19930 3d 3f 20 6f 70 74 69 6f 6e 20 69 6e 20 70 6c 61  =? option in pla
19940 63 65 20 6f 66 20 61 20 74 61 72 67 65 74 20 64  ce of a target d
19950 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20  atabase.** file 
19960 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  name..*/.static 
19970 76 6f 69 64 20 72 62 75 43 72 65 61 74 65 56 66  void rbuCreateVf
19980 73 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 29  s(sqlite3rbu *p)
19990 7b 0a 20 20 69 6e 74 20 72 6e 64 3b 0a 20 20 63  {.  int rnd;.  c
199a0 68 61 72 20 7a 52 6e 64 5b 36 34 5d 3b 0a 0a 20  har zRnd[64];.. 
199b0 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d   assert( p->rc==
199c0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 73  SQLITE_OK );.  s
199d0 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73  qlite3_randomnes
199e0 73 28 73 69 7a 65 6f 66 28 69 6e 74 29 2c 20 28  s(sizeof(int), (
199f0 76 6f 69 64 2a 29 26 72 6e 64 29 3b 0a 20 20 73  void*)&rnd);.  s
19a00 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
19a10 73 69 7a 65 6f 66 28 7a 52 6e 64 29 2c 20 7a 52  sizeof(zRnd), zR
19a20 6e 64 2c 20 22 72 62 75 5f 76 66 73 5f 25 64 22  nd, "rbu_vfs_%d"
19a30 2c 20 72 6e 64 29 3b 0a 20 20 70 2d 3e 72 63 20  , rnd);.  p->rc 
19a40 3d 20 73 71 6c 69 74 65 33 72 62 75 5f 63 72 65  = sqlite3rbu_cre
19a50 61 74 65 5f 76 66 73 28 7a 52 6e 64 2c 20 30 29  ate_vfs(zRnd, 0)
19a60 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ;.  if( p->rc==S
19a70 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19a80 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
19a90 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  s = sqlite3_vfs_
19aa0 66 69 6e 64 28 7a 52 6e 64 29 3b 0a 20 20 20 20  find(zRnd);.    
19ab0 61 73 73 65 72 74 28 20 70 56 66 73 20 29 3b 0a  assert( pVfs );.
19ac0 20 20 20 20 70 2d 3e 7a 56 66 73 4e 61 6d 65 20      p->zVfsName 
19ad0 3d 20 70 56 66 73 2d 3e 7a 4e 61 6d 65 3b 0a 20  = pVfs->zName;. 
19ae0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 74   }.}../*.** Dest
19af0 72 6f 79 20 74 68 65 20 70 72 69 76 61 74 65 20  roy the private 
19b00 56 46 53 20 63 72 65 61 74 65 64 20 66 6f 72 20  VFS created for 
19b10 74 68 65 20 72 62 75 20 68 61 6e 64 6c 65 20 70  the rbu handle p
19b20 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c  assed as the onl
19b30 79 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 62 79  y.** argument by
19b40 20 61 6e 20 65 61 72 6c 69 65 72 20 63 61 6c 6c   an earlier call
19b50 20 74 6f 20 72 62 75 43 72 65 61 74 65 56 66 73   to rbuCreateVfs
19b60 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ()..*/.static vo
19b70 69 64 20 72 62 75 44 65 6c 65 74 65 56 66 73 28  id rbuDeleteVfs(
19b80 73 71 6c 69 74 65 33 72 62 75 20 2a 70 29 7b 0a  sqlite3rbu *p){.
19b90 20 20 69 66 28 20 70 2d 3e 7a 56 66 73 4e 61 6d    if( p->zVfsNam
19ba0 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
19bb0 72 62 75 5f 64 65 73 74 72 6f 79 5f 76 66 73 28  rbu_destroy_vfs(
19bc0 70 2d 3e 7a 56 66 73 4e 61 6d 65 29 3b 0a 20 20  p->zVfsName);.  
19bd0 20 20 70 2d 3e 7a 56 66 73 4e 61 6d 65 20 3d 20    p->zVfsName = 
19be0 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
19bf0 54 68 69 73 20 75 73 65 72 2d 64 65 66 69 6e 65  This user-define
19c00 64 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 69  d SQL function i
19c10 73 20 69 6e 76 6f 6b 65 64 20 77 69 74 68 20 61  s invoked with a
19c20 20 73 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74   single argument
19c30 20 2d 20 74 68 65 0a 2a 2a 20 6e 61 6d 65 20 6f   - the.** name o
19c40 66 20 61 20 74 61 62 6c 65 20 65 78 70 65 63 74  f a table expect
19c50 65 64 20 74 6f 20 61 70 70 65 61 72 20 69 6e 20  ed to appear in 
19c60 74 68 65 20 74 61 72 67 65 74 20 64 61 74 61 62  the target datab
19c70 61 73 65 2e 20 49 74 20 72 65 74 75 72 6e 73 0a  ase. It returns.
19c80 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** the number of
19c90 20 61 75 78 69 6c 6c 69 61 72 79 20 69 6e 64 65   auxilliary inde
19ca0 78 65 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  xes on the table
19cb0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
19cc0 20 72 62 75 49 6e 64 65 78 43 6e 74 46 75 6e 63   rbuIndexCntFunc
19cd0 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
19ce0 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e  ext *pCtx, .  in
19cf0 74 20 6e 56 61 6c 2c 0a 20 20 73 71 6c 69 74 65  t nVal,.  sqlite
19d00 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 0a  3_value **apVal.
19d10 29 7b 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20  ){.  sqlite3rbu 
19d20 2a 70 20 3d 20 28 73 71 6c 69 74 65 33 72 62 75  *p = (sqlite3rbu
19d30 2a 29 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64  *)sqlite3_user_d
19d40 61 74 61 28 70 43 74 78 29 3b 0a 20 20 73 71 6c  ata(pCtx);.  sql
19d50 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
19d60 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 45   = 0;.  char *zE
19d70 72 72 6d 73 67 20 3d 20 30 3b 0a 20 20 69 6e 74  rrmsg = 0;.  int
19d80 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
19d90 6e 56 61 6c 3d 3d 31 20 29 3b 0a 20 20 0a 20 20  nVal==1 );.  .  
19da0 72 63 20 3d 20 70 72 65 70 61 72 65 46 72 65 65  rc = prepareFree
19db0 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28  AndCollectError(
19dc0 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 70 53 74 6d  p->dbMain, &pStm
19dd0 74 2c 20 26 7a 45 72 72 6d 73 67 2c 20 0a 20 20  t, &zErrmsg, .  
19de0 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69      sqlite3_mpri
19df0 6e 74 66 28 22 53 45 4c 45 43 54 20 63 6f 75 6e  ntf("SELECT coun
19e00 74 28 2a 29 20 46 52 4f 4d 20 73 71 6c 69 74 65  t(*) FROM sqlite
19e10 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20 20 20  _master ".      
19e20 20 20 22 57 48 45 52 45 20 74 79 70 65 3d 27 69    "WHERE type='i
19e30 6e 64 65 78 27 20 41 4e 44 20 74 62 6c 5f 6e 61  ndex' AND tbl_na
19e40 6d 65 20 3d 20 25 51 22 2c 20 73 71 6c 69 74 65  me = %Q", sqlite
19e50 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 70 56  3_value_text(apV
19e60 61 6c 5b 30 5d 29 29 0a 20 20 29 3b 0a 20 20 69  al[0])).  );.  i
19e70 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
19e80 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
19e90 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 70 43 74  result_error(pCt
19ea0 78 2c 20 7a 45 72 72 6d 73 67 2c 20 2d 31 29 3b  x, zErrmsg, -1);
19eb0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
19ec0 74 20 6e 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20  t nIndex = 0;.  
19ed0 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57    if( SQLITE_ROW
19ee0 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ==sqlite3_step(p
19ef0 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20 20 6e  Stmt) ){.      n
19f00 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 5f  Index = sqlite3_
19f10 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74  column_int(pStmt
19f20 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
19f30 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e  rc = sqlite3_fin
19f40 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
19f50 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
19f60 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
19f70 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28  ite3_result_int(
19f80 70 43 74 78 2c 20 6e 49 6e 64 65 78 29 3b 0a 20  pCtx, nIndex);. 
19f90 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19fa0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
19fb0 72 72 6f 72 28 70 43 74 78 2c 20 73 71 6c 69 74  rror(pCtx, sqlit
19fc0 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 4d  e3_errmsg(p->dbM
19fd0 61 69 6e 29 2c 20 2d 31 29 3b 0a 20 20 20 20 7d  ain), -1);.    }
19fe0 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f  .  }..  sqlite3_
19ff0 66 72 65 65 28 7a 45 72 72 6d 73 67 29 3b 0a 7d  free(zErrmsg);.}
1a000 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 52  ../*.** If the R
1a010 42 55 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  BU database cont
1a020 61 69 6e 73 20 74 68 65 20 72 62 75 5f 63 6f 75  ains the rbu_cou
1a030 6e 74 20 74 61 62 6c 65 2c 20 75 73 65 20 69 74  nt table, use it
1a040 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 0a 2a   to initialize.*
1a050 2a 20 74 68 65 20 73 71 6c 69 74 65 33 72 62 75  * the sqlite3rbu
1a060 2e 6e 50 68 61 73 65 4f 6e 65 53 74 65 70 20 76  .nPhaseOneStep v
1a070 61 72 69 61 62 6c 65 2e 20 54 68 65 20 73 63 68  ariable. The sch
1a080 65 6d 61 20 6f 66 20 74 68 65 20 72 62 75 5f 63  ema of the rbu_c
1a090 6f 75 6e 74 20 74 61 62 6c 65 0a 2a 2a 20 69 73  ount table.** is
1a0a0 20 61 73 73 75 6d 65 64 20 74 6f 20 63 6f 6e 74   assumed to cont
1a0b0 61 69 6e 20 74 68 65 20 73 61 6d 65 20 63 6f 6c  ain the same col
1a0c0 75 6d 6e 73 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20  umns as:.**.**  
1a0d0 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 72 62   CREATE TABLE rb
1a0e0 75 5f 63 6f 75 6e 74 28 74 62 6c 20 54 45 58 54  u_count(tbl TEXT
1a0f0 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 63 6e   PRIMARY KEY, cn
1a100 74 20 49 4e 54 45 47 45 52 29 20 57 49 54 48 4f  t INTEGER) WITHO
1a110 55 54 20 52 4f 57 49 44 3b 0a 2a 2a 0a 2a 2a 20  UT ROWID;.**.** 
1a120 54 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20  There should be 
1a130 6f 6e 65 20 72 6f 77 20 69 6e 20 74 68 65 20 74  one row in the t
1a140 61 62 6c 65 20 66 6f 72 20 65 61 63 68 20 64 61  able for each da
1a150 74 61 5f 78 78 78 20 74 61 62 6c 65 20 69 6e 20  ta_xxx table in 
1a160 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e  the.** database.
1a170 20 54 68 65 20 27 74 62 6c 27 20 63 6f 6c 75 6d   The 'tbl' colum
1a180 6e 20 73 68 6f 75 6c 64 20 63 6f 6e 74 61 69 6e  n should contain
1a190 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 64   the name of a d
1a1a0 61 74 61 5f 78 78 78 20 74 61 62 6c 65 2c 0a 2a  ata_xxx table,.*
1a1b0 2a 20 61 6e 64 20 74 68 65 20 63 6e 74 20 63 6f  * and the cnt co
1a1c0 6c 75 6d 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  lumn the number 
1a1d0 6f 66 20 72 6f 77 73 20 69 74 20 63 6f 6e 74 61  of rows it conta
1a1e0 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74  ins..**.** sqlit
1a1f0 65 33 72 62 75 2e 6e 50 68 61 73 65 4f 6e 65 53  e3rbu.nPhaseOneS
1a200 74 65 70 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  tep is initializ
1a210 65 64 20 74 6f 20 74 68 65 20 73 75 6d 20 6f 66  ed to the sum of
1a220 20 28 31 20 2b 20 6e 49 6e 64 65 78 29 20 2a 20   (1 + nIndex) * 
1a230 63 6e 74 0a 2a 2a 20 66 6f 72 20 61 6c 6c 20 72  cnt.** for all r
1a240 6f 77 73 20 69 6e 20 74 68 65 20 72 62 75 5f 63  ows in the rbu_c
1a250 6f 75 6e 74 20 74 61 62 6c 65 2c 20 77 68 65 72  ount table, wher
1a260 65 20 6e 49 6e 64 65 78 20 69 73 20 74 68 65 20  e nIndex is the 
1a270 6e 75 6d 62 65 72 20 6f 66 20 0a 2a 2a 20 69 6e  number of .** in
1a280 64 65 78 65 73 20 6f 6e 20 74 68 65 20 63 6f 72  dexes on the cor
1a290 72 65 73 70 6f 6e 64 69 6e 67 20 74 61 72 67 65  responding targe
1a2a0 74 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65  t database table
1a2b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1a2c0 20 72 62 75 49 6e 69 74 50 68 61 73 65 4f 6e 65   rbuInitPhaseOne
1a2d0 53 74 65 70 73 28 73 71 6c 69 74 65 33 72 62 75  Steps(sqlite3rbu
1a2e0 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72   *p){.  if( p->r
1a2f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1a300 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
1a310 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20   *pStmt = 0;.   
1a320 20 69 6e 74 20 62 45 78 69 73 74 73 20 3d 20 30   int bExists = 0
1a330 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1a340 20 2f 2a 20 54 72 75 65 20 69 66 20 72 62 75 5f   /* True if rbu_
1a350 63 6f 75 6e 74 20 65 78 69 73 74 73 20 2a 2f 0a  count exists */.
1a360 0a 20 20 20 20 70 2d 3e 6e 50 68 61 73 65 4f 6e  .    p->nPhaseOn
1a370 65 53 74 65 70 20 3d 20 2d 31 3b 0a 0a 20 20 20  eStep = -1;..   
1a380 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33   p->rc = sqlite3
1a390 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
1a3a0 28 70 2d 3e 64 62 52 62 75 2c 20 0a 20 20 20 20  (p->dbRbu, .    
1a3b0 20 20 20 20 22 72 62 75 5f 69 6e 64 65 78 5f 63      "rbu_index_c
1a3c0 6e 74 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55  nt", 1, SQLITE_U
1a3d0 54 46 38 2c 20 28 76 6f 69 64 2a 29 70 2c 20 72  TF8, (void*)p, r
1a3e0 62 75 49 6e 64 65 78 43 6e 74 46 75 6e 63 2c 20  buIndexCntFunc, 
1a3f0 30 2c 20 30 0a 20 20 20 20 29 3b 0a 20 20 0a 20  0, 0.    );.  . 
1a400 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20     /* Check for 
1a410 74 68 65 20 72 62 75 5f 63 6f 75 6e 74 20 74 61  the rbu_count ta
1a420 62 6c 65 2e 20 49 66 20 69 74 20 64 6f 65 73 20  ble. If it does 
1a430 6e 6f 74 20 65 78 69 73 74 2c 20 6f 72 20 69 66  not exist, or if
1a440 20 61 6e 20 65 72 72 6f 72 0a 20 20 20 20 2a 2a   an error.    **
1a450 20 6f 63 63 75 72 73 2c 20 6e 50 68 61 73 65 4f   occurs, nPhaseO
1a460 6e 65 53 74 65 70 20 77 69 6c 6c 20 62 65 20 6c  neStep will be l
1a470 65 66 74 20 73 65 74 20 74 6f 20 2d 31 2e 20 2a  eft set to -1. *
1a480 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d  /.    if( p->rc=
1a490 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1a4a0 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70      p->rc = prep
1a4b0 61 72 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72  areAndCollectErr
1a4c0 6f 72 28 70 2d 3e 64 62 52 62 75 2c 20 26 70 53  or(p->dbRbu, &pS
1a4d0 74 6d 74 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67  tmt, &p->zErrmsg
1a4e0 2c 0a 20 20 20 20 20 20 20 20 20 20 22 53 45 4c  ,.          "SEL
1a4f0 45 43 54 20 31 20 46 52 4f 4d 20 73 71 6c 69 74  ECT 1 FROM sqlit
1a500 65 5f 6d 61 73 74 65 72 20 57 48 45 52 45 20 74  e_master WHERE t
1a510 62 6c 5f 6e 61 6d 65 20 3d 20 27 72 62 75 5f 63  bl_name = 'rbu_c
1a520 6f 75 6e 74 27 22 0a 20 20 20 20 20 20 29 3b 0a  ount'".      );.
1a530 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d      }.    if( p-
1a540 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
1a550 7b 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49  {.      if( SQLI
1a560 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
1a570 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20  step(pStmt) ){. 
1a580 20 20 20 20 20 20 20 62 45 78 69 73 74 73 20 3d         bExists =
1a590 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
1a5a0 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65    p->rc = sqlite
1a5b0 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
1a5c0 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  );.    }.  .    
1a5d0 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
1a5e0 45 5f 4f 4b 20 26 26 20 62 45 78 69 73 74 73 20  E_OK && bExists 
1a5f0 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  ){.      p->rc =
1a600 20 70 72 65 70 61 72 65 41 6e 64 43 6f 6c 6c 65   prepareAndColle
1a610 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 52 62 75  ctError(p->dbRbu
1a620 2c 20 26 70 53 74 6d 74 2c 20 26 70 2d 3e 7a 45  , &pStmt, &p->zE
1a630 72 72 6d 73 67 2c 0a 20 20 20 20 20 20 20 20 20  rrmsg,.         
1a640 20 22 53 45 4c 45 43 54 20 73 75 6d 28 63 6e 74   "SELECT sum(cnt
1a650 20 2a 20 28 31 20 2b 20 72 62 75 5f 69 6e 64 65   * (1 + rbu_inde
1a660 78 5f 63 6e 74 28 72 62 75 5f 74 61 72 67 65 74  x_cnt(rbu_target
1a670 5f 6e 61 6d 65 28 74 62 6c 29 29 29 29 22 0a 20  _name(tbl))))". 
1a680 20 20 20 20 20 20 20 20 20 22 46 52 4f 4d 20 72           "FROM r
1a690 62 75 5f 63 6f 75 6e 74 22 0a 20 20 20 20 20 20  bu_count".      
1a6a0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  );.      if( p->
1a6b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1a6c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 53 51 4c  .        if( SQL
1a6d0 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
1a6e0 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a  _step(pStmt) ){.
1a6f0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 50 68            p->nPh
1a700 61 73 65 4f 6e 65 53 74 65 70 20 3d 20 73 71 6c  aseOneStep = sql
1a710 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36  ite3_column_int6
1a720 34 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20  4(pStmt, 0);.   
1a730 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
1a740 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66  ->rc = sqlite3_f
1a750 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
1a760 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1a770 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 52  }.}../*.** The R
1a780 42 55 20 68 61 6e 64 6c 65 20 70 61 73 73 65 64  BU handle passed
1a790 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67   as the only arg
1a7a0 75 6d 65 6e 74 20 68 61 73 20 6a 75 73 74 20 62  ument has just b
1a7b0 65 65 6e 20 6f 70 65 6e 65 64 20 61 6e 64 20 0a  een opened and .
1a7c0 2a 2a 20 74 68 65 20 73 74 61 74 65 20 64 61 74  ** the state dat
1a7d0 61 62 61 73 65 20 69 73 20 65 6d 70 74 79 2e 20  abase is empty. 
1a7e0 49 66 20 74 68 69 73 20 52 42 55 20 68 61 6e 64  If this RBU hand
1a7f0 6c 65 20 77 61 73 20 6f 70 65 6e 65 64 20 66 6f  le was opened fo
1a800 72 20 61 6e 0a 2a 2a 20 52 42 55 20 76 61 63 75  r an.** RBU vacu
1a810 75 6d 20 6f 70 65 72 61 74 69 6f 6e 2c 20 63 72  um operation, cr
1a820 65 61 74 65 20 74 68 65 20 73 63 68 65 6d 61 20  eate the schema 
1a830 69 6e 20 74 68 65 20 74 61 72 67 65 74 20 64 62  in the target db
1a840 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1a850 20 72 62 75 43 72 65 61 74 65 54 61 72 67 65 74   rbuCreateTarget
1a860 53 63 68 65 6d 61 28 73 71 6c 69 74 65 33 72 62  Schema(sqlite3rb
1a870 75 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33  u *p){.  sqlite3
1a880 5f 73 74 6d 74 20 2a 70 53 71 6c 20 3d 20 30 3b  _stmt *pSql = 0;
1a890 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
1a8a0 2a 70 49 6e 73 65 72 74 20 3d 20 30 3b 0a 0a 20  *pInsert = 0;.. 
1a8b0 20 61 73 73 65 72 74 28 20 72 62 75 49 73 56 61   assert( rbuIsVa
1a8c0 63 75 75 6d 28 70 29 20 29 3b 0a 0a 20 20 70 2d  cuum(p) );..  p-
1a8d0 3e 72 63 20 3d 20 70 72 65 70 61 72 65 41 6e 64  >rc = prepareAnd
1a8e0 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e  CollectError(p->
1a8f0 64 62 52 62 75 2c 20 26 70 53 71 6c 2c 20 26 70  dbRbu, &pSql, &p
1a900 2d 3e 7a 45 72 72 6d 73 67 2c 20 0a 20 20 20 20  ->zErrmsg, .    
1a910 22 53 45 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d  "SELECT sql FROM
1a920 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 57   sqlite_master W
1a930 48 45 52 45 20 73 71 6c 21 3d 27 27 20 41 4e 44  HERE sql!='' AND
1a940 20 72 6f 6f 74 70 61 67 65 21 3d 30 22 0a 20 20   rootpage!=0".  
1a950 20 20 22 20 4f 52 44 45 52 20 42 59 20 74 79 70    " ORDER BY typ
1a960 65 20 44 45 53 43 22 0a 20 20 29 3b 0a 20 20 77  e DESC".  );.  w
1a970 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  hile( p->rc==SQL
1a980 49 54 45 5f 4f 4b 20 26 26 20 73 71 6c 69 74 65  ITE_OK && sqlite
1a990 33 5f 73 74 65 70 28 70 53 71 6c 29 3d 3d 53 51  3_step(pSql)==SQ
1a9a0 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20  LITE_ROW ){.    
1a9b0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
1a9c0 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
1a9d0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
1a9e0 65 78 74 28 70 53 71 6c 2c 20 30 29 3b 0a 20 20  ext(pSql, 0);.  
1a9f0 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65    p->rc = sqlite
1aa00 33 5f 65 78 65 63 28 70 2d 3e 64 62 4d 61 69 6e  3_exec(p->dbMain
1aa10 2c 20 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 26 70  , zSql, 0, 0, &p
1aa20 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a 20 20 7d 0a  ->zErrmsg);.  }.
1aa30 20 20 72 62 75 46 69 6e 61 6c 69 7a 65 28 70 2c    rbuFinalize(p,
1aa40 20 70 53 71 6c 29 3b 0a 20 20 69 66 28 20 70 2d   pSql);.  if( p-
1aa50 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc!=SQLITE_OK )
1aa60 20 72 65 74 75 72 6e 3b 0a 0a 20 20 70 2d 3e 72   return;..  p->r
1aa70 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  c = sqlite3_exec
1aa80 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 50 52 41  (p->dbMain, "PRA
1aa90 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68  GMA writable_sch
1aaa0 65 6d 61 3d 31 22 2c 20 30 2c 30 2c 20 26 70 2d  ema=1", 0,0, &p-
1aab0 3e 7a 45 72 72 6d 73 67 29 3b 0a 0a 20 20 69 66  >zErrmsg);..  if
1aac0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
1aad0 4f 4b 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  OK ){.    p->rc 
1aae0 3d 20 70 72 65 70 61 72 65 41 6e 64 43 6f 6c 6c  = prepareAndColl
1aaf0 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 52 62  ectError(p->dbRb
1ab00 75 2c 20 26 70 53 71 6c 2c 20 26 70 2d 3e 7a 45  u, &pSql, &p->zE
1ab10 72 72 6d 73 67 2c 20 0a 20 20 20 20 20 20 20 20  rrmsg, .        
1ab20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73  "SELECT * FROM s
1ab30 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 57 48 45  qlite_master WHE
1ab40 52 45 20 72 6f 6f 74 70 61 67 65 3d 30 20 4f 52  RE rootpage=0 OR
1ab50 20 72 6f 6f 74 70 61 67 65 20 49 53 20 4e 55 4c   rootpage IS NUL
1ab60 4c 22 20 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a  L" .    );.  }..
1ab70 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
1ab80 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d  ITE_OK ){.    p-
1ab90 3e 72 63 20 3d 20 70 72 65 70 61 72 65 41 6e 64  >rc = prepareAnd
1aba0 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e  CollectError(p->
1abb0 64 62 4d 61 69 6e 2c 20 26 70 49 6e 73 65 72 74  dbMain, &pInsert
1abc0 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 20 0a  , &p->zErrmsg, .
1abd0 20 20 20 20 20 20 20 20 22 49 4e 53 45 52 54 20          "INSERT 
1abe0 49 4e 54 4f 20 73 71 6c 69 74 65 5f 6d 61 73 74  INTO sqlite_mast
1abf0 65 72 20 56 41 4c 55 45 53 28 3f 2c 3f 2c 3f 2c  er VALUES(?,?,?,
1ac00 3f 2c 3f 29 22 0a 20 20 20 20 29 3b 0a 20 20 7d  ?,?)".    );.  }
1ac10 0a 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63  ..  while( p->rc
1ac20 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73  ==SQLITE_OK && s
1ac30 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 71 6c  qlite3_step(pSql
1ac40 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  )==SQLITE_ROW ){
1ac50 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
1ac60 66 6f 72 28 69 3d 30 3b 20 69 3c 35 3b 20 69 2b  for(i=0; i<5; i+
1ac70 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
1ac80 33 5f 62 69 6e 64 5f 76 61 6c 75 65 28 70 49 6e  3_bind_value(pIn
1ac90 73 65 72 74 2c 20 69 2b 31 2c 20 73 71 6c 69 74  sert, i+1, sqlit
1aca0 65 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28  e3_column_value(
1acb0 70 53 71 6c 2c 20 69 29 29 3b 0a 20 20 20 20 7d  pSql, i));.    }
1acc0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65  .    sqlite3_ste
1acd0 70 28 70 49 6e 73 65 72 74 29 3b 0a 20 20 20 20  p(pInsert);.    
1ace0 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  p->rc = sqlite3_
1acf0 72 65 73 65 74 28 70 49 6e 73 65 72 74 29 3b 0a  reset(pInsert);.
1ad00 20 20 7d 0a 0a 20 20 72 62 75 46 69 6e 61 6c 69    }..  rbuFinali
1ad10 7a 65 28 70 2c 20 70 53 71 6c 29 3b 0a 20 20 72  ze(p, pSql);.  r
1ad20 62 75 46 69 6e 61 6c 69 7a 65 28 70 2c 20 70 49  buFinalize(p, pI
1ad30 6e 73 65 72 74 29 3b 0a 7d 0a 0a 0a 73 74 61 74  nsert);.}...stat
1ad40 69 63 20 73 71 6c 69 74 65 33 72 62 75 20 2a 6f  ic sqlite3rbu *o
1ad50 70 65 6e 52 62 75 48 61 6e 64 6c 65 28 0a 20 20  penRbuHandle(.  
1ad60 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 72  const char *zTar
1ad70 67 65 74 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68  get, .  const ch
1ad80 61 72 20 2a 7a 52 62 75 2c 0a 20 20 63 6f 6e 73  ar *zRbu,.  cons
1ad90 74 20 63 68 61 72 20 2a 7a 53 74 61 74 65 0a 29  t char *zState.)
1ada0 7b 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20 2a  {.  sqlite3rbu *
1adb0 70 3b 0a 20 20 73 69 7a 65 5f 74 20 6e 54 61 72  p;.  size_t nTar
1adc0 67 65 74 20 3d 20 7a 54 61 72 67 65 74 20 3f 20  get = zTarget ? 
1add0 73 74 72 6c 65 6e 28 7a 54 61 72 67 65 74 29 20  strlen(zTarget) 
1ade0 3a 20 30 3b 0a 20 20 73 69 7a 65 5f 74 20 6e 52  : 0;.  size_t nR
1adf0 62 75 20 3d 20 73 74 72 6c 65 6e 28 7a 52 62 75  bu = strlen(zRbu
1ae00 29 3b 0a 20 20 73 69 7a 65 5f 74 20 6e 53 74 61  );.  size_t nSta
1ae10 74 65 20 3d 20 7a 53 74 61 74 65 20 3f 20 73 74  te = zState ? st
1ae20 72 6c 65 6e 28 7a 53 74 61 74 65 29 20 3a 20 30  rlen(zState) : 0
1ae30 3b 0a 20 20 73 69 7a 65 5f 74 20 6e 42 79 74 65  ;.  size_t nByte
1ae40 20 3d 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65   = sizeof(sqlite
1ae50 33 72 62 75 29 20 2b 20 6e 54 61 72 67 65 74 2b  3rbu) + nTarget+
1ae60 31 20 2b 20 6e 52 62 75 2b 31 2b 20 6e 53 74 61  1 + nRbu+1+ nSta
1ae70 74 65 2b 31 3b 0a 0a 20 20 70 20 3d 20 28 73 71  te+1;..  p = (sq
1ae80 6c 69 74 65 33 72 62 75 2a 29 73 71 6c 69 74 65  lite3rbu*)sqlite
1ae90 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 42 79 74 65  3_malloc64(nByte
1aea0 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  );.  if( p ){.  
1aeb0 20 20 52 62 75 53 74 61 74 65 20 2a 70 53 74 61    RbuState *pSta
1aec0 74 65 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20  te = 0;..    /* 
1aed0 43 72 65 61 74 65 20 74 68 65 20 63 75 73 74 6f  Create the custo
1aee0 6d 20 56 46 53 2e 20 2a 2f 0a 20 20 20 20 6d 65  m VFS. */.    me
1aef0 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f  mset(p, 0, sizeo
1af00 66 28 73 71 6c 69 74 65 33 72 62 75 29 29 3b 0a  f(sqlite3rbu));.
1af10 20 20 20 20 72 62 75 43 72 65 61 74 65 56 66 73      rbuCreateVfs
1af20 28 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65  (p);..    /* Ope
1af30 6e 20 74 68 65 20 74 61 72 67 65 74 2c 20 52 42  n the target, RB
1af40 55 20 61 6e 64 20 73 74 61 74 65 20 64 61 74 61  U and state data
1af50 62 61 73 65 73 20 2a 2f 0a 20 20 20 20 69 66 28  bases */.    if(
1af60 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1af70 4b 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  K ){.      char 
1af80 2a 70 43 73 72 20 3d 20 28 63 68 61 72 2a 29 26  *pCsr = (char*)&
1af90 70 5b 31 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  p[1];.      if( 
1afa0 7a 54 61 72 67 65 74 20 29 7b 0a 20 20 20 20 20  zTarget ){.     
1afb0 20 20 20 70 2d 3e 7a 54 61 72 67 65 74 20 3d 20     p->zTarget = 
1afc0 70 43 73 72 3b 0a 20 20 20 20 20 20 20 20 6d 65  pCsr;.        me
1afd0 6d 63 70 79 28 70 2d 3e 7a 54 61 72 67 65 74 2c  mcpy(p->zTarget,
1afe0 20 7a 54 61 72 67 65 74 2c 20 6e 54 61 72 67 65   zTarget, nTarge
1aff0 74 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 70 43  t+1);.        pC
1b000 73 72 20 2b 3d 20 6e 54 61 72 67 65 74 2b 31 3b  sr += nTarget+1;
1b010 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
1b020 2d 3e 7a 52 62 75 20 3d 20 70 43 73 72 3b 0a 20  ->zRbu = pCsr;. 
1b030 20 20 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e 7a       memcpy(p->z
1b040 52 62 75 2c 20 7a 52 62 75 2c 20 6e 52 62 75 2b  Rbu, zRbu, nRbu+
1b050 31 29 3b 0a 20 20 20 20 20 20 70 43 73 72 20 2b  1);.      pCsr +
1b060 3d 20 6e 52 62 75 2b 31 3b 0a 20 20 20 20 20 20  = nRbu+1;.      
1b070 69 66 28 20 7a 53 74 61 74 65 20 29 7b 0a 20 20  if( zState ){.  
1b080 20 20 20 20 20 20 70 2d 3e 7a 53 74 61 74 65 20        p->zState 
1b090 3d 20 70 43 73 72 3b 0a 20 20 20 20 20 20 20 20  = pCsr;.        
1b0a0 6d 65 6d 63 70 79 28 70 2d 3e 7a 53 74 61 74 65  memcpy(p->zState
1b0b0 2c 20 7a 53 74 61 74 65 2c 20 6e 53 74 61 74 65  , zState, nState
1b0c0 2b 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  +1);.      }.   
1b0d0 20 20 20 72 62 75 4f 70 65 6e 44 61 74 61 62 61     rbuOpenDataba
1b0e0 73 65 28 70 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  se(p);.    }..  
1b0f0 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
1b100 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1b110 70 53 74 61 74 65 20 3d 20 72 62 75 4c 6f 61 64  pState = rbuLoad
1b120 53 74 61 74 65 28 70 29 3b 0a 20 20 20 20 20 20  State(p);.      
1b130 61 73 73 65 72 74 28 20 70 53 74 61 74 65 20 7c  assert( pState |
1b140 7c 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f  | p->rc!=SQLITE_
1b150 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OK );.      if( 
1b160 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
1b170 20 29 7b 0a 0a 20 20 20 20 20 20 20 20 69 66 28   ){..        if(
1b180 20 70 53 74 61 74 65 2d 3e 65 53 74 61 67 65 3d   pState->eStage=
1b190 3d 30 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20  =0 ){ .         
1b1a0 20 72 62 75 44 65 6c 65 74 65 4f 61 6c 46 69 6c   rbuDeleteOalFil
1b1b0 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(p);.          
1b1c0 72 62 75 49 6e 69 74 50 68 61 73 65 4f 6e 65 53  rbuInitPhaseOneS
1b1d0 74 65 70 73 28 70 29 3b 0a 20 20 20 20 20 20 20  teps(p);.       
1b1e0 20 20 20 70 2d 3e 65 53 74 61 67 65 20 3d 20 52     p->eStage = R
1b1f0 42 55 5f 53 54 41 47 45 5f 4f 41 4c 3b 0a 20 20  BU_STAGE_OAL;.  
1b200 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1b210 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 67 65         p->eStage
1b220 20 3d 20 70 53 74 61 74 65 2d 3e 65 53 74 61 67   = pState->eStag
1b230 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  e;.          p->
1b240 6e 50 68 61 73 65 4f 6e 65 53 74 65 70 20 3d 20  nPhaseOneStep = 
1b250 70 53 74 61 74 65 2d 3e 6e 50 68 61 73 65 4f 6e  pState->nPhaseOn
1b260 65 53 74 65 70 3b 0a 20 20 20 20 20 20 20 20 7d  eStep;.        }
1b270 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 50 72 6f  .        p->nPro
1b280 67 72 65 73 73 20 3d 20 70 53 74 61 74 65 2d 3e  gress = pState->
1b290 6e 50 72 6f 67 72 65 73 73 3b 0a 20 20 20 20 20  nProgress;.     
1b2a0 20 20 20 70 2d 3e 69 4f 61 6c 53 7a 20 3d 20 70     p->iOalSz = p
1b2b0 53 74 61 74 65 2d 3e 69 4f 61 6c 53 7a 3b 0a 20  State->iOalSz;. 
1b2c0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1b2d0 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 21 3d   assert( p->rc!=
1b2e0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e  SQLITE_OK || p->
1b2f0 65 53 74 61 67 65 21 3d 30 20 29 3b 0a 0a 20 20  eStage!=0 );..  
1b300 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
1b310 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 70 54 61  ITE_OK && p->pTa
1b320 72 67 65 74 46 64 2d 3e 70 57 61 6c 46 64 20 29  rgetFd->pWalFd )
1b330 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65  {.      if( p->e
1b340 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45  Stage==RBU_STAGE
1b350 5f 4f 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  _OAL ){.        
1b360 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45  p->rc = SQLITE_E
1b370 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 70 2d  RROR;.        p-
1b380 3e 7a 45 72 72 6d 73 67 20 3d 20 73 71 6c 69 74  >zErrmsg = sqlit
1b390 65 33 5f 6d 70 72 69 6e 74 66 28 22 63 61 6e 6e  e3_mprintf("cann
1b3a0 6f 74 20 75 70 64 61 74 65 20 77 61 6c 20 6d 6f  ot update wal mo
1b3b0 64 65 20 64 61 74 61 62 61 73 65 22 29 3b 0a 20  de database");. 
1b3c0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
1b3d0 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54  ->eStage==RBU_ST
1b3e0 41 47 45 5f 4d 4f 56 45 20 29 7b 0a 20 20 20 20  AGE_MOVE ){.    
1b3f0 20 20 20 20 70 2d 3e 65 53 74 61 67 65 20 3d 20      p->eStage = 
1b400 52 42 55 5f 53 54 41 47 45 5f 43 4b 50 54 3b 0a  RBU_STAGE_CKPT;.
1b410 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 74 65 70          p->nStep
1b420 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
1b430 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e    }..    if( p->
1b440 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  rc==SQLITE_OK.  
1b450 20 20 20 26 26 20 21 72 62 75 49 73 56 61 63 75     && !rbuIsVacu
1b460 75 6d 28 70 29 0a 20 20 20 20 20 26 26 20 28 70  um(p).     && (p
1b470 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54  ->eStage==RBU_ST
1b480 41 47 45 5f 4f 41 4c 20 7c 7c 20 70 2d 3e 65 53  AGE_OAL || p->eS
1b490 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f  tage==RBU_STAGE_
1b4a0 4d 4f 56 45 29 0a 20 20 20 20 20 26 26 20 70 53  MOVE).     && pS
1b4b0 74 61 74 65 2d 3e 65 53 74 61 67 65 21 3d 30 20  tate->eStage!=0 
1b4c0 26 26 20 70 2d 3e 70 54 61 72 67 65 74 46 64 2d  && p->pTargetFd-
1b4d0 3e 69 43 6f 6f 6b 69 65 21 3d 70 53 74 61 74 65  >iCookie!=pState
1b4e0 2d 3e 69 43 6f 6f 6b 69 65 0a 20 20 20 20 29 7b  ->iCookie.    ){
1b4f0 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 41 74 20     .      /* At 
1b500 74 68 69 73 20 70 6f 69 6e 74 20 28 70 54 61 72  this point (pTar
1b510 67 65 74 46 64 2d 3e 69 43 6f 6f 6b 69 65 29 20  getFd->iCookie) 
1b520 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61 6c  contains the val
1b530 75 65 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20  ue of the.      
1b540 2a 2a 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  ** change-counte
1b550 72 20 63 6f 6f 6b 69 65 20 28 74 68 65 20 74 68  r cookie (the th
1b560 69 6e 67 20 74 68 61 74 20 67 65 74 73 20 69 6e  ing that gets in
1b570 63 72 65 6d 65 6e 74 65 64 20 77 68 65 6e 20 61  cremented when a
1b580 20 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73   .      ** trans
1b590 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74  action is commit
1b5a0 74 65 64 20 69 6e 20 72 6f 6c 6c 62 61 63 6b 20  ted in rollback 
1b5b0 6d 6f 64 65 29 20 63 75 72 72 65 6e 74 6c 79 20  mode) currently 
1b5c0 73 74 6f 72 65 64 20 6f 6e 20 0a 20 20 20 20 20  stored on .     
1b5d0 20 2a 2a 20 70 61 67 65 20 31 20 6f 66 20 74 68   ** page 1 of th
1b5e0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1b5f0 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 72 63 20   */.      p->rc 
1b600 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
1b610 20 20 20 20 20 70 2d 3e 7a 45 72 72 6d 73 67 20       p->zErrmsg 
1b620 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
1b630 66 28 22 64 61 74 61 62 61 73 65 20 6d 6f 64 69  f("database modi
1b640 66 69 65 64 20 64 75 72 69 6e 67 20 72 62 75 20  fied during rbu 
1b650 75 70 64 61 74 65 22 29 3b 0a 20 20 20 20 7d 0a  update");.    }.
1b660 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  .    if( p->rc==
1b670 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1b680 20 20 20 69 66 28 20 70 2d 3e 65 53 74 61 67 65     if( p->eStage
1b690 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20  ==RBU_STAGE_OAL 
1b6a0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1b6b0 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 4d 61  e3 *db = p->dbMa
1b6c0 69 6e 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  in;..        /* 
1b6d0 4f 70 65 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e  Open transaction
1b6e0 73 20 62 6f 74 68 20 64 61 74 61 62 61 73 65 73  s both databases
1b6f0 2e 20 54 68 65 20 2a 2d 6f 61 6c 20 66 69 6c 65  . The *-oal file
1b700 20 69 73 20 6f 70 65 6e 65 64 20 6f 72 0a 20 20   is opened or.  
1b710 20 20 20 20 20 20 2a 2a 20 63 72 65 61 74 65 64        ** created
1b720 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2e 20   at this point. 
1b730 2a 2f 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63  */.        p->rc
1b740 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28   = sqlite3_exec(
1b750 64 62 2c 20 22 42 45 47 49 4e 20 49 4d 4d 45 44  db, "BEGIN IMMED
1b760 49 41 54 45 22 2c 20 30 2c 20 30 2c 20 26 70 2d  IATE", 0, 0, &p-
1b770 3e 7a 45 72 72 6d 73 67 29 3b 0a 20 20 20 20 20  >zErrmsg);.     
1b780 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
1b790 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1b7a0 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c       p->rc = sql
1b7b0 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 52  ite3_exec(p->dbR
1b7c0 62 75 2c 20 22 42 45 47 49 4e 22 2c 20 30 2c 20  bu, "BEGIN", 0, 
1b7d0 30 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 29 3b  0, &p->zErrmsg);
1b7e0 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
1b7f0 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20      /* Check if 
1b800 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
1b810 65 20 69 73 20 61 20 7a 69 70 76 66 73 20 64 62  e is a zipvfs db
1b820 2e 20 49 66 20 69 74 20 69 73 2c 20 73 65 74 20  . If it is, set 
1b830 74 68 65 20 75 70 70 65 72 0a 20 20 20 20 20 20  the upper.      
1b840 20 20 2a 2a 20 6c 65 76 65 6c 20 70 61 67 65 72    ** level pager
1b850 20 74 6f 20 75 73 65 20 22 6a 6f 75 72 6e 61 6c   to use "journal
1b860 5f 6d 6f 64 65 3d 6f 66 66 22 2e 20 54 68 69 73  _mode=off". This
1b870 20 70 72 65 76 65 6e 74 73 20 69 74 20 66 72 6f   prevents it fro
1b880 6d 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 67 65  m .        ** ge
1b890 6e 65 72 61 74 69 6e 67 20 61 20 6c 61 72 67 65  nerating a large
1b8a0 20 6a 6f 75 72 6e 61 6c 20 75 73 69 6e 67 20 61   journal using a
1b8b0 20 74 65 6d 70 20 66 69 6c 65 2e 20 20 2a 2f 0a   temp file.  */.
1b8c0 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72          if( p->r
1b8d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1b8e0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66 72            int fr
1b8f0 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  c = sqlite3_file
1b900 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 22 6d 61  _control(db, "ma
1b910 69 6e 22 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54  in", SQLITE_FCNT
1b920 4c 5f 5a 49 50 56 46 53 2c 20 30 29 3b 0a 20 20  L_ZIPVFS, 0);.  
1b930 20 20 20 20 20 20 20 20 69 66 28 20 66 72 63 3d          if( frc=
1b940 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1b950 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20            p->rc 
1b960 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64  = sqlite3_exec(d
1b970 62 2c 20 22 50 52 41 47 4d 41 20 6a 6f 75 72 6e  b, "PRAGMA journ
1b980 61 6c 5f 6d 6f 64 65 3d 6f 66 66 22 2c 30 2c 30  al_mode=off",0,0
1b990 2c 26 70 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a 20  ,&p->zErrmsg);. 
1b9a0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1b9b0 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
1b9c0 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 52   If this is an R
1b9d0 42 55 20 76 61 63 75 75 6d 20 6f 70 65 72 61 74  BU vacuum operat
1b9e0 69 6f 6e 20 61 6e 64 20 74 68 65 20 73 74 61 74  ion and the stat
1b9f0 65 20 74 61 62 6c 65 20 77 61 73 20 65 6d 70 74  e table was empt
1ba00 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 68 65  y.        ** whe
1ba10 6e 20 74 68 69 73 20 68 61 6e 64 6c 65 20 77 61  n this handle wa
1ba20 73 20 6f 70 65 6e 65 64 2c 20 63 72 65 61 74 65  s opened, create
1ba30 20 74 68 65 20 74 61 72 67 65 74 20 64 61 74 61   the target data
1ba40 62 61 73 65 20 73 63 68 65 6d 61 2e 20 2a 2f 0a  base schema. */.
1ba50 20 20 20 20 20 20 20 20 69 66 28 20 70 53 74 61          if( pSta
1ba60 74 65 2d 3e 65 53 74 61 67 65 3d 3d 30 20 26 26  te->eStage==0 &&
1ba70 20 72 62 75 49 73 56 61 63 75 75 6d 28 70 29 20   rbuIsVacuum(p) 
1ba80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 62 75  ){.          rbu
1ba90 43 72 65 61 74 65 54 61 72 67 65 74 53 63 68 65  CreateTargetSche
1baa0 6d 61 28 70 29 3b 0a 20 20 20 20 20 20 20 20 7d  ma(p);.        }
1bab0 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69  ..        /* Poi
1bac0 6e 74 20 74 68 65 20 6f 62 6a 65 63 74 20 69 74  nt the object it
1bad0 65 72 61 74 6f 72 20 61 74 20 74 68 65 20 66 69  erator at the fi
1bae0 72 73 74 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  rst object */.  
1baf0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
1bb00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1bb10 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
1bb20 72 62 75 4f 62 6a 49 74 65 72 46 69 72 73 74 28  rbuObjIterFirst(
1bb30 70 2c 20 26 70 2d 3e 6f 62 6a 69 74 65 72 29 3b  p, &p->objiter);
1bb40 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
1bb50 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 52 42      /* If the RB
1bb60 55 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61  U database conta
1bb70 69 6e 73 20 6e 6f 20 64 61 74 61 5f 78 78 78 20  ins no data_xxx 
1bb80 74 61 62 6c 65 73 2c 20 64 65 63 6c 61 72 65 20  tables, declare 
1bb90 74 68 65 20 52 42 55 0a 20 20 20 20 20 20 20 20  the RBU.        
1bba0 2a 2a 20 75 70 64 61 74 65 20 66 69 6e 69 73 68  ** update finish
1bbb0 65 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ed.  */.        
1bbc0 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
1bbd0 45 5f 4f 4b 20 26 26 20 70 2d 3e 6f 62 6a 69 74  E_OK && p->objit
1bbe0 65 72 2e 7a 54 62 6c 3d 3d 30 20 29 7b 0a 20 20  er.zTbl==0 ){.  
1bbf0 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
1bc00 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
1bc10 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
1bc20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
1bc30 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1bc40 20 20 72 62 75 53 65 74 75 70 4f 61 6c 28 70 2c    rbuSetupOal(p,
1bc50 20 70 53 74 61 74 65 29 3b 0a 20 20 20 20 20 20   pState);.      
1bc60 20 20 7d 0a 0a 20 20 20 20 20 20 7d 65 6c 73 65    }..      }else
1bc70 20 69 66 28 20 70 2d 3e 65 53 74 61 67 65 3d 3d   if( p->eStage==
1bc80 52 42 55 5f 53 54 41 47 45 5f 4d 4f 56 45 20 29  RBU_STAGE_MOVE )
1bc90 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6e 6f 2d  {.        /* no-
1bca0 6f 70 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73  op */.      }els
1bcb0 65 20 69 66 28 20 70 2d 3e 65 53 74 61 67 65 3d  e if( p->eStage=
1bcc0 3d 52 42 55 5f 53 54 41 47 45 5f 43 4b 50 54 20  =RBU_STAGE_CKPT 
1bcd0 29 7b 0a 20 20 20 20 20 20 20 20 72 62 75 53 65  ){.        rbuSe
1bce0 74 75 70 43 68 65 63 6b 70 6f 69 6e 74 28 70 2c  tupCheckpoint(p,
1bcf0 20 70 53 74 61 74 65 29 3b 0a 20 20 20 20 20 20   pState);.      
1bd00 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 65 53 74  }else if( p->eSt
1bd10 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 44  age==RBU_STAGE_D
1bd20 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ONE ){.        p
1bd30 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f  ->rc = SQLITE_DO
1bd40 4e 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  NE;.      }else{
1bd50 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  .        p->rc =
1bd60 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b   SQLITE_CORRUPT;
1bd70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1bd80 20 20 20 20 72 62 75 46 72 65 65 53 74 61 74 65      rbuFreeState
1bd90 28 70 53 74 61 74 65 29 3b 0a 20 20 7d 0a 0a 20  (pState);.  }.. 
1bda0 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
1bdb0 0a 2a 2a 20 4f 70 65 6e 20 61 6e 64 20 72 65 74  .** Open and ret
1bdc0 75 72 6e 20 61 20 6e 65 77 20 52 42 55 20 68 61  urn a new RBU ha
1bdd0 6e 64 6c 65 2e 20 0a 2a 2f 0a 73 71 6c 69 74 65  ndle. .*/.sqlite
1bde0 33 72 62 75 20 2a 73 71 6c 69 74 65 33 72 62 75  3rbu *sqlite3rbu
1bdf0 5f 6f 70 65 6e 28 0a 20 20 63 6f 6e 73 74 20 63  _open(.  const c
1be00 68 61 72 20 2a 7a 54 61 72 67 65 74 2c 20 0a 20  har *zTarget, . 
1be10 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 62   const char *zRb
1be20 75 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  u,.  const char 
1be30 2a 7a 53 74 61 74 65 0a 29 7b 0a 20 20 2f 2a 20  *zState.){.  /* 
1be40 54 4f 44 4f 3a 20 43 68 65 63 6b 20 74 68 61 74  TODO: Check that
1be50 20 7a 54 61 72 67 65 74 20 61 6e 64 20 7a 52 62   zTarget and zRb
1be60 75 20 61 72 65 20 6e 6f 6e 2d 4e 55 4c 4c 20 2a  u are non-NULL *
1be70 2f 0a 20 20 72 65 74 75 72 6e 20 6f 70 65 6e 52  /.  return openR
1be80 62 75 48 61 6e 64 6c 65 28 7a 54 61 72 67 65 74  buHandle(zTarget
1be90 2c 20 7a 52 62 75 2c 20 7a 53 74 61 74 65 29 3b  , zRbu, zState);
1bea0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  .}../*.** Open a
1beb0 20 68 61 6e 64 6c 65 20 74 6f 20 62 65 67 69 6e   handle to begin
1bec0 20 6f 72 20 72 65 73 75 6d 65 20 61 6e 20 52 42   or resume an RB
1bed0 55 20 56 41 43 55 55 4d 20 6f 70 65 72 61 74 69  U VACUUM operati
1bee0 6f 6e 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 72 62  on..*/.sqlite3rb
1bef0 75 20 2a 73 71 6c 69 74 65 33 72 62 75 5f 76 61  u *sqlite3rbu_va
1bf00 63 75 75 6d 28 0a 20 20 63 6f 6e 73 74 20 63 68  cuum(.  const ch
1bf10 61 72 20 2a 7a 54 61 72 67 65 74 2c 20 0a 20 20  ar *zTarget, .  
1bf20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 61  const char *zSta
1bf30 74 65 0a 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a  te.){.  /* TODO:
1bf40 20 43 68 65 63 6b 20 74 68 61 74 20 62 6f 74 68   Check that both
1bf50 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 6e   arguments are n
1bf60 6f 6e 2d 4e 55 4c 4c 20 2a 2f 0a 20 20 72 65 74  on-NULL */.  ret
1bf70 75 72 6e 20 6f 70 65 6e 52 62 75 48 61 6e 64 6c  urn openRbuHandl
1bf80 65 28 30 2c 20 7a 54 61 72 67 65 74 2c 20 7a 53  e(0, zTarget, zS
1bf90 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tate);.}../*.** 
1bfa0 52 65 74 75 72 6e 20 74 68 65 20 64 61 74 61 62  Return the datab
1bfb0 61 73 65 20 68 61 6e 64 6c 65 20 75 73 65 64 20  ase handle used 
1bfc0 62 79 20 70 52 62 75 2e 0a 2a 2f 0a 73 71 6c 69  by pRbu..*/.sqli
1bfd0 74 65 33 20 2a 73 71 6c 69 74 65 33 72 62 75 5f  te3 *sqlite3rbu_
1bfe0 64 62 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70  db(sqlite3rbu *p
1bff0 52 62 75 2c 20 69 6e 74 20 62 52 62 75 29 7b 0a  Rbu, int bRbu){.
1c000 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1c010 30 3b 0a 20 20 69 66 28 20 70 52 62 75 20 29 7b  0;.  if( pRbu ){
1c020 0a 20 20 20 20 64 62 20 3d 20 28 62 52 62 75 20  .    db = (bRbu 
1c030 3f 20 70 52 62 75 2d 3e 64 62 52 62 75 20 3a 20  ? pRbu->dbRbu : 
1c040 70 52 62 75 2d 3e 64 62 4d 61 69 6e 29 3b 0a 20  pRbu->dbMain);. 
1c050 20 7d 0a 20 20 72 65 74 75 72 6e 20 64 62 3b 0a   }.  return db;.
1c060 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  }.../*.** If the
1c070 20 65 72 72 6f 72 20 63 6f 64 65 20 63 75 72 72   error code curr
1c080 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20  ently stored in 
1c090 74 68 65 20 52 42 55 20 68 61 6e 64 6c 65 20 69  the RBU handle i
1c0a0 73 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  s SQLITE_CONSTRA
1c0b0 49 4e 54 2c 0a 2a 2a 20 74 68 65 6e 20 65 64 69  INT,.** then edi
1c0c0 74 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73  t any error mess
1c0d0 61 67 65 20 73 74 72 69 6e 67 20 73 6f 20 61 73  age string so as
1c0e0 20 74 6f 20 72 65 6d 6f 76 65 20 61 6c 6c 20 6f   to remove all o
1c0f0 63 63 75 72 72 65 6e 63 65 73 20 6f 66 0a 2a 2a  ccurrences of.**
1c100 20 74 68 65 20 70 61 74 74 65 72 6e 20 22 72 62   the pattern "rb
1c110 75 5f 69 6d 70 5f 5b 30 2d 39 5d 2a 22 2e 0a 2a  u_imp_[0-9]*"..*
1c120 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62  /.static void rb
1c130 75 45 64 69 74 45 72 72 6d 73 67 28 73 71 6c 69  uEditErrmsg(sqli
1c140 74 65 33 72 62 75 20 2a 70 29 7b 0a 20 20 69 66  te3rbu *p){.  if
1c150 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
1c160 43 4f 4e 53 54 52 41 49 4e 54 20 26 26 20 70 2d  CONSTRAINT && p-
1c170 3e 7a 45 72 72 6d 73 67 20 29 7b 0a 20 20 20 20  >zErrmsg ){.    
1c180 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a  unsigned int i;.
1c190 20 20 20 20 73 69 7a 65 5f 74 20 6e 45 72 72 6d      size_t nErrm
1c1a0 73 67 20 3d 20 73 74 72 6c 65 6e 28 70 2d 3e 7a  sg = strlen(p->z
1c1b0 45 72 72 6d 73 67 29 3b 0a 20 20 20 20 66 6f 72  Errmsg);.    for
1c1c0 28 69 3d 30 3b 20 69 3c 28 6e 45 72 72 6d 73 67  (i=0; i<(nErrmsg
1c1d0 2d 38 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  -8); i++){.     
1c1e0 20 69 66 28 20 6d 65 6d 63 6d 70 28 26 70 2d 3e   if( memcmp(&p->
1c1f0 7a 45 72 72 6d 73 67 5b 69 5d 2c 20 22 72 62 75  zErrmsg[i], "rbu
1c200 5f 69 6d 70 5f 22 2c 20 38 29 3d 3d 30 20 29 7b  _imp_", 8)==0 ){
1c210 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 44 65  .        int nDe
1c220 6c 20 3d 20 38 3b 0a 20 20 20 20 20 20 20 20 77  l = 8;.        w
1c230 68 69 6c 65 28 20 70 2d 3e 7a 45 72 72 6d 73 67  hile( p->zErrmsg
1c240 5b 69 2b 6e 44 65 6c 5d 3e 3d 27 30 27 20 26 26  [i+nDel]>='0' &&
1c250 20 70 2d 3e 7a 45 72 72 6d 73 67 5b 69 2b 6e 44   p->zErrmsg[i+nD
1c260 65 6c 5d 3c 3d 27 39 27 20 29 20 6e 44 65 6c 2b  el]<='9' ) nDel+
1c270 2b 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 6d 6f  +;.        memmo
1c280 76 65 28 26 70 2d 3e 7a 45 72 72 6d 73 67 5b 69  ve(&p->zErrmsg[i
1c290 5d 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 5b 69  ], &p->zErrmsg[i
1c2a0 2b 6e 44 65 6c 5d 2c 20 6e 45 72 72 6d 73 67 20  +nDel], nErrmsg 
1c2b0 2b 20 31 20 2d 20 69 20 2d 20 6e 44 65 6c 29 3b  + 1 - i - nDel);
1c2c0 0a 20 20 20 20 20 20 20 20 6e 45 72 72 6d 73 67  .        nErrmsg
1c2d0 20 2d 3d 20 6e 44 65 6c 3b 0a 20 20 20 20 20 20   -= nDel;.      
1c2e0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
1c2f0 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 52  *.** Close the R
1c300 42 55 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e  BU handle..*/.in
1c310 74 20 73 71 6c 69 74 65 33 72 62 75 5f 63 6c 6f  t sqlite3rbu_clo
1c320 73 65 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70  se(sqlite3rbu *p
1c330 2c 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 6d 73  , char **pzErrms
1c340 67 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  g){.  int rc;.  
1c350 69 66 28 20 70 20 29 7b 0a 0a 20 20 20 20 2f 2a  if( p ){..    /*
1c360 20 43 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e   Commit the tran
1c370 73 61 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 2a  saction to the *
1c380 2d 6f 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  -oal file. */.  
1c390 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
1c3a0 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 65 53 74  ITE_OK && p->eSt
1c3b0 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4f  age==RBU_STAGE_O
1c3c0 41 4c 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72  AL ){.      p->r
1c3d0 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  c = sqlite3_exec
1c3e0 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 43 4f 4d  (p->dbMain, "COM
1c3f0 4d 49 54 22 2c 20 30 2c 20 30 2c 20 26 70 2d 3e  MIT", 0, 0, &p->
1c400 7a 45 72 72 6d 73 67 29 3b 0a 20 20 20 20 7d 0a  zErrmsg);.    }.
1c410 0a 20 20 20 20 72 62 75 53 61 76 65 53 74 61 74  .    rbuSaveStat
1c420 65 28 70 2c 20 70 2d 3e 65 53 74 61 67 65 29 3b  e(p, p->eStage);
1c430 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d  ..    if( p->rc=
1c440 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d  =SQLITE_OK && p-
1c450 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41  >eStage==RBU_STA
1c460 47 45 5f 4f 41 4c 20 29 7b 0a 20 20 20 20 20 20  GE_OAL ){.      
1c470 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  p->rc = sqlite3_
1c480 65 78 65 63 28 70 2d 3e 64 62 52 62 75 2c 20 22  exec(p->dbRbu, "
1c490 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 2c 20 26  COMMIT", 0, 0, &
1c4a0 70 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a 20 20 20  p->zErrmsg);.   
1c4b0 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6c 6f 73 65   }..    /* Close
1c4c0 20 61 6e 79 20 6f 70 65 6e 20 73 74 61 74 65 6d   any open statem
1c4d0 65 6e 74 20 68 61 6e 64 6c 65 73 2e 20 2a 2f 0a  ent handles. */.
1c4e0 20 20 20 20 72 62 75 4f 62 6a 49 74 65 72 46 69      rbuObjIterFi
1c4f0 6e 61 6c 69 7a 65 28 26 70 2d 3e 6f 62 6a 69 74  nalize(&p->objit
1c500 65 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6c 6f  er);..    /* Clo
1c510 73 65 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61  se the open data
1c520 62 61 73 65 20 68 61 6e 64 6c 65 20 61 6e 64 20  base handle and 
1c530 56 46 53 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20  VFS object. */. 
1c540 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65     sqlite3_close
1c550 28 70 2d 3e 64 62 52 62 75 29 3b 0a 20 20 20 20  (p->dbRbu);.    
1c560 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 2d  sqlite3_close(p-
1c570 3e 64 62 4d 61 69 6e 29 3b 0a 20 20 20 20 72 62  >dbMain);.    rb
1c580 75 44 65 6c 65 74 65 56 66 73 28 70 29 3b 0a 20  uDeleteVfs(p);. 
1c590 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1c5a0 70 2d 3e 61 42 75 66 29 3b 0a 20 20 20 20 73 71  p->aBuf);.    sq
1c5b0 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 46  lite3_free(p->aF
1c5c0 72 61 6d 65 29 3b 0a 0a 20 20 20 20 72 62 75 45  rame);..    rbuE
1c5d0 64 69 74 45 72 72 6d 73 67 28 70 29 3b 0a 20 20  ditErrmsg(p);.  
1c5e0 20 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 20 20    rc = p->rc;.  
1c5f0 20 20 2a 70 7a 45 72 72 6d 73 67 20 3d 20 70 2d    *pzErrmsg = p-
1c600 3e 7a 45 72 72 6d 73 67 3b 0a 20 20 20 20 73 71  >zErrmsg;.    sq
1c610 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
1c620 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
1c630 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
1c640 20 20 20 2a 70 7a 45 72 72 6d 73 67 20 3d 20 30     *pzErrmsg = 0
1c650 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1c660 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
1c670 72 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  rn the total num
1c680 62 65 72 20 6f 66 20 6b 65 79 2d 76 61 6c 75 65  ber of key-value
1c690 20 6f 70 65 72 61 74 69 6f 6e 73 20 28 69 6e 73   operations (ins
1c6a0 65 72 74 73 2c 20 64 65 6c 65 74 65 73 20 6f 72  erts, deletes or
1c6b0 20 0a 2a 2a 20 75 70 64 61 74 65 73 29 20 74 68   .** updates) th
1c6c0 61 74 20 68 61 76 65 20 62 65 65 6e 20 70 65 72  at have been per
1c6d0 66 6f 72 6d 65 64 20 6f 6e 20 74 68 65 20 74 61  formed on the ta
1c6e0 72 67 65 74 20 64 61 74 61 62 61 73 65 20 73 69  rget database si
1c6f0 6e 63 65 20 74 68 65 0a 2a 2a 20 63 75 72 72 65  nce the.** curre
1c700 6e 74 20 52 42 55 20 75 70 64 61 74 65 20 77 61  nt RBU update wa
1c710 73 20 73 74 61 72 74 65 64 2e 0a 2a 2f 0a 73 71  s started..*/.sq
1c720 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 71 6c 69  lite3_int64 sqli
1c730 74 65 33 72 62 75 5f 70 72 6f 67 72 65 73 73 28  te3rbu_progress(
1c740 73 71 6c 69 74 65 33 72 62 75 20 2a 70 52 62 75  sqlite3rbu *pRbu
1c750 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 52 62 75  ){.  return pRbu
1c760 2d 3e 6e 50 72 6f 67 72 65 73 73 3b 0a 7d 0a 0a  ->nProgress;.}..
1c770 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 70 65 72  /*.** Return per
1c780 6d 79 72 69 61 64 61 67 65 20 70 72 6f 67 72 65  myriadage progre
1c790 73 73 20 69 6e 64 69 63 61 74 69 6f 6e 73 20 66  ss indications f
1c7a0 6f 72 20 74 68 65 20 74 77 6f 20 6d 61 69 6e 20  or the two main 
1c7b0 73 74 61 67 65 73 20 6f 66 0a 2a 2a 20 61 6e 20  stages of.** an 
1c7c0 52 42 55 20 75 70 64 61 74 65 2e 0a 2a 2f 0a 76  RBU update..*/.v
1c7d0 6f 69 64 20 73 71 6c 69 74 65 33 72 62 75 5f 62  oid sqlite3rbu_b
1c7e0 70 5f 70 72 6f 67 72 65 73 73 28 73 71 6c 69 74  p_progress(sqlit
1c7f0 65 33 72 62 75 20 2a 70 2c 20 69 6e 74 20 2a 70  e3rbu *p, int *p
1c800 6e 4f 6e 65 2c 20 69 6e 74 20 2a 70 6e 54 77 6f  nOne, int *pnTwo
1c810 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 4d  ){.  const int M
1c820 41 58 5f 50 52 4f 47 52 45 53 53 20 3d 20 31 30  AX_PROGRESS = 10
1c830 30 30 30 3b 0a 20 20 73 77 69 74 63 68 28 20 70  000;.  switch( p
1c840 2d 3e 65 53 74 61 67 65 20 29 7b 0a 20 20 20 20  ->eStage ){.    
1c850 63 61 73 65 20 52 42 55 5f 53 54 41 47 45 5f 4f  case RBU_STAGE_O
1c860 41 4c 3a 0a 20 20 20 20 20 20 69 66 28 20 70 2d  AL:.      if( p-
1c870 3e 6e 50 68 61 73 65 4f 6e 65 53 74 65 70 3e 30  >nPhaseOneStep>0
1c880 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 6e 4f   ){.        *pnO
1c890 6e 65 20 3d 20 28 69 6e 74 29 28 4d 41 58 5f 50  ne = (int)(MAX_P
1c8a0 52 4f 47 52 45 53 53 20 2a 20 28 69 36 34 29 70  ROGRESS * (i64)p
1c8b0 2d 3e 6e 50 72 6f 67 72 65 73 73 2f 28 69 36 34  ->nProgress/(i64
1c8c0 29 70 2d 3e 6e 50 68 61 73 65 4f 6e 65 53 74 65  )p->nPhaseOneSte
1c8d0 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  p);.      }else{
1c8e0 0a 20 20 20 20 20 20 20 20 2a 70 6e 4f 6e 65 20  .        *pnOne 
1c8f0 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  = -1;.      }.  
1c900 20 20 20 20 2a 70 6e 54 77 6f 20 3d 20 30 3b 0a      *pnTwo = 0;.
1c910 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
1c920 20 20 63 61 73 65 20 52 42 55 5f 53 54 41 47 45    case RBU_STAGE
1c930 5f 4d 4f 56 45 3a 0a 20 20 20 20 20 20 2a 70 6e  _MOVE:.      *pn
1c940 4f 6e 65 20 3d 20 4d 41 58 5f 50 52 4f 47 52 45  One = MAX_PROGRE
1c950 53 53 3b 0a 20 20 20 20 20 20 2a 70 6e 54 77 6f  SS;.      *pnTwo
1c960 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61   = 0;.      brea
1c970 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 52 42 55  k;..    case RBU
1c980 5f 53 54 41 47 45 5f 43 4b 50 54 3a 0a 20 20 20  _STAGE_CKPT:.   
1c990 20 20 20 2a 70 6e 4f 6e 65 20 3d 20 4d 41 58 5f     *pnOne = MAX_
1c9a0 50 52 4f 47 52 45 53 53 3b 0a 20 20 20 20 20 20  PROGRESS;.      
1c9b0 2a 70 6e 54 77 6f 20 3d 20 28 69 6e 74 29 28 4d  *pnTwo = (int)(M
1c9c0 41 58 5f 50 52 4f 47 52 45 53 53 20 2a 20 28 69  AX_PROGRESS * (i
1c9d0 36 34 29 70 2d 3e 6e 53 74 65 70 20 2f 20 28 69  64)p->nStep / (i
1c9e0 36 34 29 70 2d 3e 6e 46 72 61 6d 65 29 3b 0a 20  64)p->nFrame);. 
1c9f0 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
1ca00 20 63 61 73 65 20 52 42 55 5f 53 54 41 47 45 5f   case RBU_STAGE_
1ca10 44 4f 4e 45 3a 0a 20 20 20 20 20 20 2a 70 6e 4f  DONE:.      *pnO
1ca20 6e 65 20 3d 20 4d 41 58 5f 50 52 4f 47 52 45 53  ne = MAX_PROGRES
1ca30 53 3b 0a 20 20 20 20 20 20 2a 70 6e 54 77 6f 20  S;.      *pnTwo 
1ca40 3d 20 4d 41 58 5f 50 52 4f 47 52 45 53 53 3b 0a  = MAX_PROGRESS;.
1ca50 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
1ca60 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
1ca70 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 20 20   assert( 0 );.  
1ca80 7d 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33  }.}..int sqlite3
1ca90 72 62 75 5f 73 61 76 65 73 74 61 74 65 28 73 71  rbu_savestate(sq
1caa0 6c 69 74 65 33 72 62 75 20 2a 70 29 7b 0a 20 20  lite3rbu *p){.  
1cab0 69 6e 74 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a  int rc = p->rc;.
1cac0 20 20 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c    .  if( rc==SQL
1cad0 49 54 45 5f 44 4f 4e 45 20 29 20 72 65 74 75 72  ITE_DONE ) retur
1cae0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  n SQLITE_OK;..  
1caf0 61 73 73 65 72 74 28 20 70 2d 3e 65 53 74 61 67  assert( p->eStag
1cb00 65 3e 3d 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c  e>=RBU_STAGE_OAL
1cb10 20 26 26 20 70 2d 3e 65 53 74 61 67 65 3c 3d 52   && p->eStage<=R
1cb20 42 55 5f 53 54 41 47 45 5f 44 4f 4e 45 20 29 3b  BU_STAGE_DONE );
1cb30 0a 20 20 69 66 28 20 70 2d 3e 65 53 74 61 67 65  .  if( p->eStage
1cb40 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20  ==RBU_STAGE_OAL 
1cb50 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  ){.    assert( r
1cb60 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
1cb70 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
1cb80 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 73  LITE_OK ) rc = s
1cb90 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
1cba0 62 4d 61 69 6e 2c 20 22 43 4f 4d 4d 49 54 22 2c  bMain, "COMMIT",
1cbb0 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a   0, 0, 0);.  }..
1cbc0 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20    p->rc = rc;.  
1cbd0 72 62 75 53 61 76 65 53 74 61 74 65 28 70 2c 20  rbuSaveState(p, 
1cbe0 70 2d 3e 65 53 74 61 67 65 29 3b 0a 20 20 72 63  p->eStage);.  rc
1cbf0 20 3d 20 70 2d 3e 72 63 3b 0a 0a 20 20 69 66 28   = p->rc;..  if(
1cc00 20 70 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f   p->eStage==RBU_
1cc10 53 54 41 47 45 5f 4f 41 4c 20 29 7b 0a 20 20 20  STAGE_OAL ){.   
1cc20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
1cc30 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20  ITE_DONE );.    
1cc40 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1cc50 4b 20 29 20 72 63 20 3d 20 73 71 6c 69 74 65 33  K ) rc = sqlite3
1cc60 5f 65 78 65 63 28 70 2d 3e 64 62 52 62 75 2c 20  _exec(p->dbRbu, 
1cc70 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 2c 20  "COMMIT", 0, 0, 
1cc80 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  0);.    if( rc==
1cc90 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d  SQLITE_OK ) rc =
1cca0 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d   sqlite3_exec(p-
1ccb0 3e 64 62 52 62 75 2c 20 22 42 45 47 49 4e 20 49  >dbRbu, "BEGIN I
1ccc0 4d 4d 45 44 49 41 54 45 22 2c 20 30 2c 20 30 2c  MMEDIATE", 0, 0,
1ccd0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d   0);.    if( rc=
1cce0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20  =SQLITE_OK ) rc 
1ccf0 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70  = sqlite3_exec(p
1cd00 2d 3e 64 62 4d 61 69 6e 2c 20 22 42 45 47 49 4e  ->dbMain, "BEGIN
1cd10 20 49 4d 4d 45 44 49 41 54 45 22 2c 20 30 2c 20   IMMEDIATE", 0, 
1cd20 30 2c 30 29 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e  0,0);.  }..  p->
1cd30 72 63 20 3d 20 72 63 3b 0a 20 20 72 65 74 75 72  rc = rc;.  retur
1cd40 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a  n rc;.}../******
1cd50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1cd60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1cd70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1cd80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1cd90 2a 2a 2a 2a 0a 2a 2a 20 42 65 67 69 6e 6e 69 6e  ****.** Beginnin
1cda0 67 20 6f 66 20 52 42 55 20 56 46 53 20 73 68 69  g of RBU VFS shi
1cdb0 6d 20 6d 65 74 68 6f 64 73 2e 20 54 68 65 20 56  m methods. The V
1cdc0 46 53 20 73 68 69 6d 20 6d 6f 64 69 66 69 65 73  FS shim modifies
1cdd0 20 74 68 65 20 62 65 68 61 76 69 6f 75 72 0a 2a   the behaviour.*
1cde0 2a 20 6f 66 20 61 20 73 74 61 6e 64 61 72 64 20  * of a standard 
1cdf0 56 46 53 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f  VFS in the follo
1ce00 77 69 6e 67 20 77 61 79 73 3a 0a 2a 2a 0a 2a 2a  wing ways:.**.**
1ce10 20 31 2e 20 57 68 65 6e 65 76 65 72 20 74 68 65   1. Whenever the
1ce20 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 61   first page of a
1ce30 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66   main database f
1ce40 69 6c 65 20 69 73 20 72 65 61 64 20 6f 72 20 0a  ile is read or .
1ce50 2a 2a 20 20 20 20 77 72 69 74 74 65 6e 2c 20 74  **    written, t
1ce60 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
1ce70 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 63  change-counter c
1ce80 6f 6f 6b 69 65 20 69 73 20 73 74 6f 72 65 64 20  ookie is stored 
1ce90 69 6e 0a 2a 2a 20 20 20 20 72 62 75 5f 66 69 6c  in.**    rbu_fil
1cea0 65 2e 69 43 6f 6f 6b 69 65 2e 20 53 69 6d 69 6c  e.iCookie. Simil
1ceb0 61 72 6c 79 2c 20 74 68 65 20 76 61 6c 75 65 20  arly, the value 
1cec0 6f 66 20 74 68 65 20 22 77 72 69 74 65 2d 76 65  of the "write-ve
1ced0 72 73 69 6f 6e 22 0a 2a 2a 20 20 20 20 64 61 74  rsion".**    dat
1cee0 61 62 61 73 65 20 68 65 61 64 65 72 20 66 69 65  abase header fie
1cef0 6c 64 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  ld is stored in 
1cf00 72 62 75 5f 66 69 6c 65 2e 69 57 72 69 74 65 56  rbu_file.iWriteV
1cf10 65 72 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73  er. This ensures
1cf20 0a 2a 2a 20 20 20 20 74 68 61 74 20 74 68 65 20  .**    that the 
1cf30 76 61 6c 75 65 73 20 61 72 65 20 61 6c 77 61 79  values are alway
1cf40 73 20 74 72 75 73 74 77 6f 72 74 68 79 20 77 69  s trustworthy wi
1cf50 74 68 69 6e 20 61 6e 20 6f 70 65 6e 20 74 72 61  thin an open tra
1cf60 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
1cf70 32 2e 20 57 68 65 6e 65 76 65 72 20 61 6e 20 53  2. Whenever an S
1cf80 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 66  QLITE_OPEN_WAL f
1cf90 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 2c 20 74  ile is opened, t
1cfa0 68 65 20 28 72 62 75 5f 66 69 6c 65 2e 70 57 61  he (rbu_file.pWa
1cfb0 6c 46 64 29 0a 2a 2a 20 20 20 20 6d 65 6d 62 65  lFd).**    membe
1cfc0 72 20 76 61 72 69 61 62 6c 65 20 6f 66 20 74 68  r variable of th
1cfd0 65 20 61 73 73 6f 63 69 61 74 65 64 20 64 61 74  e associated dat
1cfe0 61 62 61 73 65 20 66 69 6c 65 20 64 65 73 63 72  abase file descr
1cff0 69 70 74 6f 72 20 69 73 20 73 65 74 0a 2a 2a 20  iptor is set.** 
1d000 20 20 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74     to point to t
1d010 68 65 20 6e 65 77 20 66 69 6c 65 2e 20 41 20 6d  he new file. A m
1d020 75 74 65 78 20 70 72 6f 74 65 63 74 65 64 20 6c  utex protected l
1d030 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 61 6c  inked list of al
1d040 6c 20 6d 61 69 6e 20 0a 2a 2a 20 20 20 20 64 62  l main .**    db
1d050 20 66 64 73 20 6f 70 65 6e 65 64 20 75 73 69 6e   fds opened usin
1d060 67 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 52  g a particular R
1d070 42 55 20 56 46 53 20 69 73 20 6d 61 69 6e 74 61  BU VFS is mainta
1d080 69 6e 65 64 20 61 74 20 0a 2a 2a 20 20 20 20 72  ined at .**    r
1d090 62 75 5f 76 66 73 2e 70 4d 61 69 6e 20 74 6f 20  bu_vfs.pMain to 
1d0a0 66 61 63 69 6c 69 74 61 74 65 20 74 68 69 73 2e  facilitate this.
1d0b0 0a 2a 2a 0a 2a 2a 20 33 2e 20 55 73 69 6e 67 20  .**.** 3. Using 
1d0c0 61 20 6e 65 77 20 66 69 6c 65 2d 63 6f 6e 74 72  a new file-contr
1d0d0 6f 6c 20 22 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ol "SQLITE_FCNTL
1d0e0 5f 52 42 55 22 2c 20 61 20 6d 61 69 6e 20 64 62  _RBU", a main db
1d0f0 20 72 62 75 5f 66 69 6c 65 20 0a 2a 2a 20 20 20   rbu_file .**   
1d100 20 6f 62 6a 65 63 74 20 63 61 6e 20 62 65 20 6d   object can be m
1d110 61 72 6b 65 64 20 61 73 20 74 68 65 20 74 61 72  arked as the tar
1d120 67 65 74 20 64 61 74 61 62 61 73 65 20 6f 66 20  get database of 
1d130 61 6e 20 52 42 55 20 75 70 64 61 74 65 2e 20 54  an RBU update. T
1d140 68 69 73 0a 2a 2a 20 20 20 20 74 75 72 6e 73 20  his.**    turns 
1d150 6f 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  on the following
1d160 20 65 78 74 72 61 20 73 70 65 63 69 61 6c 20 62   extra special b
1d170 65 68 61 76 69 6f 75 72 3a 0a 2a 2a 0a 2a 2a 20  ehaviour:.**.** 
1d180 33 61 2e 20 49 66 20 78 41 63 63 65 73 73 28 29  3a. If xAccess()
1d190 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 68   is called to ch
1d1a0 65 63 6b 20 69 66 20 74 68 65 72 65 20 65 78 69  eck if there exi
1d1b0 73 74 73 20 61 20 2a 2d 77 61 6c 20 66 69 6c 65  sts a *-wal file
1d1c0 20 0a 2a 2a 20 20 20 20 20 61 73 73 6f 63 69 61   .**     associa
1d1d0 74 65 64 20 77 69 74 68 20 61 6e 20 52 42 55 20  ted with an RBU 
1d1e0 74 61 72 67 65 74 20 64 61 74 61 62 61 73 65 20  target database 
1d1f0 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 52 42 55  currently in RBU
1d200 5f 53 54 41 47 45 5f 4f 41 4c 0a 2a 2a 20 20 20  _STAGE_OAL.**   
1d210 20 20 73 74 61 67 65 20 28 70 72 65 70 61 72 69    stage (prepari
1d220 6e 67 20 74 68 65 20 2a 2d 6f 61 6c 20 66 69 6c  ng the *-oal fil
1d230 65 29 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  e), the followin
1d240 67 20 73 70 65 63 69 61 6c 20 68 61 6e 64 6c 69  g special handli
1d250 6e 67 0a 2a 2a 20 20 20 20 20 61 70 70 6c 69 65  ng.**     applie
1d260 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 2a 20  s:.**.**      * 
1d270 69 66 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c  if the *-wal fil
1d280 65 20 64 6f 65 73 20 65 78 69 73 74 2c 20 72 65  e does exist, re
1d290 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54  turn SQLITE_CANT
1d2a0 4f 50 45 4e 2e 20 41 6e 20 52 42 55 0a 2a 2a 20  OPEN. An RBU.** 
1d2b0 20 20 20 20 20 20 20 74 61 72 67 65 74 20 64 61         target da
1d2c0 74 61 62 61 73 65 20 6d 61 79 20 6e 6f 74 20 62  tabase may not b
1d2d0 65 20 69 6e 20 77 61 6c 20 6d 6f 64 65 20 61 6c  e in wal mode al
1d2e0 72 65 61 64 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ready..**.**    
1d2f0 20 20 2a 20 69 66 20 74 68 65 20 2a 2d 77 61 6c    * if the *-wal
1d300 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65   file does not e
1d310 78 69 73 74 2c 20 73 65 74 20 74 68 65 20 6f 75  xist, set the ou
1d320 74 70 75 74 20 70 61 72 61 6d 65 74 65 72 20 74  tput parameter t
1d330 6f 0a 2a 2a 20 20 20 20 20 20 20 20 6e 6f 6e 2d  o.**        non-
1d340 7a 65 72 6f 20 28 74 6f 20 74 65 6c 6c 20 53 51  zero (to tell SQ
1d350 4c 69 74 65 20 74 68 61 74 20 69 74 20 64 6f 65  Lite that it doe
1d360 73 20 65 78 69 73 74 29 20 61 6e 79 77 61 79 2e  s exist) anyway.
1d370 0a 2a 2a 0a 2a 2a 20 20 20 20 20 54 68 65 6e 2c  .**.**     Then,
1d380 20 77 68 65 6e 20 78 4f 70 65 6e 28 29 20 69 73   when xOpen() is
1d390 20 63 61 6c 6c 65 64 20 74 6f 20 6f 70 65 6e 20   called to open 
1d3a0 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 61  the *-wal file a
1d3b0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a  ssociated with.*
1d3c0 2a 20 20 20 20 20 74 68 65 20 52 42 55 20 74 61  *     the RBU ta
1d3d0 72 67 65 74 20 69 6e 20 52 42 55 5f 53 54 41 47  rget in RBU_STAG
1d3e0 45 5f 4f 41 4c 20 73 74 61 67 65 2c 20 69 6e 73  E_OAL stage, ins
1d3f0 74 65 61 64 20 6f 66 20 6f 70 65 6e 69 6e 67 20  tead of opening 
1d400 74 68 65 20 2a 2d 77 61 6c 0a 2a 2a 20 20 20 20  the *-wal.**    
1d410 20 66 69 6c 65 2c 20 74 68 65 20 72 62 75 20 76   file, the rbu v
1d420 66 73 20 6f 70 65 6e 73 20 74 68 65 20 63 6f 72  fs opens the cor
1d430 72 65 73 70 6f 6e 64 69 6e 67 20 2a 2d 6f 61 6c  responding *-oal
1d440 20 66 69 6c 65 20 69 6e 73 74 65 61 64 2e 20 0a   file instead. .
1d450 2a 2a 0a 2a 2a 20 33 62 2e 20 54 68 65 20 2a 2d  **.** 3b. The *-
1d460 73 68 6d 20 70 61 67 65 73 20 72 65 74 75 72 6e  shm pages return
1d470 65 64 20 62 79 20 78 53 68 6d 4d 61 70 28 29 20  ed by xShmMap() 
1d480 66 6f 72 20 61 20 74 61 72 67 65 74 20 64 62 20  for a target db 
1d490 66 69 6c 65 20 69 6e 0a 2a 2a 20 20 20 20 20 52  file in.**     R
1d4a0 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20 6d 6f 64  BU_STAGE_OAL mod
1d4b0 65 20 61 72 65 20 61 63 74 75 61 6c 6c 79 20 73  e are actually s
1d4c0 74 6f 72 65 64 20 69 6e 20 68 65 61 70 20 6d 65  tored in heap me
1d4d0 6d 6f 72 79 2e 20 54 68 69 73 20 69 73 20 74 6f  mory. This is to
1d4e0 0a 2a 2a 20 20 20 20 20 61 76 6f 69 64 20 63 72  .**     avoid cr
1d4f0 65 61 74 69 6e 67 20 61 20 2a 2d 73 68 6d 20 66  eating a *-shm f
1d500 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 41 64 64  ile on disk. Add
1d510 69 74 69 6f 6e 61 6c 6c 79 2c 20 78 53 68 6d 4c  itionally, xShmL
1d520 6f 63 6b 28 29 20 63 61 6c 6c 73 0a 2a 2a 20 20  ock() calls.**  
1d530 20 20 20 61 72 65 20 6e 6f 2d 6f 70 73 20 6f 6e     are no-ops on
1d540 20 74 61 72 67 65 74 20 64 61 74 61 62 61 73 65   target database
1d550 20 66 69 6c 65 73 20 69 6e 20 52 42 55 5f 53 54   files in RBU_ST
1d560 41 47 45 5f 4f 41 4c 20 6d 6f 64 65 2e 20 54 68  AGE_OAL mode. Th
1d570 69 73 20 69 73 0a 2a 2a 20 20 20 20 20 62 65 63  is is.**     bec
1d580 61 75 73 65 20 61 73 73 65 72 74 28 29 20 73 74  ause assert() st
1d590 61 74 65 6d 65 6e 74 73 20 69 6e 20 73 6f 6d 65  atements in some
1d5a0 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74 61 74   VFS implementat
1d5b0 69 6f 6e 73 20 66 61 69 6c 20 69 66 20 0a 2a 2a  ions fail if .**
1d5c0 20 20 20 20 20 78 53 68 6d 4c 6f 63 6b 28 29 20       xShmLock() 
1d5d0 69 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65  is called before
1d5e0 20 78 53 68 6d 4d 61 70 28 29 2e 0a 2a 2a 0a 2a   xShmMap()..**.*
1d5f0 2a 20 33 63 2e 20 49 66 20 61 6e 20 45 58 43 4c  * 3c. If an EXCL
1d600 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20 61 74  USIVE lock is at
1d610 74 65 6d 70 74 65 64 20 6f 6e 20 61 20 74 61 72  tempted on a tar
1d620 67 65 74 20 64 61 74 61 62 61 73 65 20 66 69 6c  get database fil
1d630 65 20 69 6e 20 61 6e 79 0a 2a 2a 20 20 20 20 20  e in any.**     
1d640 6d 6f 64 65 20 65 78 63 65 70 74 20 52 42 55 5f  mode except RBU_
1d650 53 54 41 47 45 5f 44 4f 4e 45 20 28 61 6c 6c 20  STAGE_DONE (all 
1d660 77 6f 72 6b 20 63 6f 6d 70 6c 65 74 65 64 20 61  work completed a
1d670 6e 64 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 29  nd checkpointed)
1d680 2c 20 69 74 20 0a 2a 2a 20 20 20 20 20 66 61 69  , it .**     fai
1d690 6c 73 20 77 69 74 68 20 61 6e 20 53 51 4c 49 54  ls with an SQLIT
1d6a0 45 5f 42 55 53 59 20 65 72 72 6f 72 2e 20 54 68  E_BUSY error. Th
1d6b0 69 73 20 69 73 20 74 6f 20 73 74 6f 70 20 52 42  is is to stop RB
1d6c0 55 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a  U connections.**
1d6d0 20 20 20 20 20 66 72 6f 6d 20 61 75 74 6f 6d 61       from automa
1d6e0 74 69 63 61 6c 6c 79 20 63 68 65 63 6b 70 6f 69  tically checkpoi
1d6f0 6e 74 69 6e 67 20 61 20 2a 2d 77 61 6c 20 28 6f  nting a *-wal (o
1d700 72 20 2a 2d 6f 61 6c 29 20 66 69 6c 65 20 66 72  r *-oal) file fr
1d710 6f 6d 20 77 69 74 68 69 6e 0a 2a 2a 20 20 20 20  om within.**    
1d720 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 29   sqlite3_close()
1d730 2e 0a 2a 2a 0a 2a 2a 20 33 64 2e 20 49 6e 20 52  ..**.** 3d. In R
1d740 42 55 5f 53 54 41 47 45 5f 43 41 50 54 55 52 45  BU_STAGE_CAPTURE
1d750 20 6d 6f 64 65 2c 20 61 6c 6c 20 78 52 65 61 64   mode, all xRead
1d760 28 29 20 63 61 6c 6c 73 20 6f 6e 20 74 68 65 20  () calls on the 
1d770 77 61 6c 20 66 69 6c 65 2c 20 61 6e 64 0a 2a 2a  wal file, and.**
1d780 20 20 20 20 20 61 6c 6c 20 78 57 72 69 74 65 28       all xWrite(
1d790 29 20 63 61 6c 6c 73 20 6f 6e 20 74 68 65 20 74  ) calls on the t
1d7a0 61 72 67 65 74 20 64 61 74 61 62 61 73 65 20 66  arget database f
1d7b0 69 6c 65 20 70 65 72 66 6f 72 6d 20 6e 6f 20 49  ile perform no I
1d7c0 4f 2e 20 0a 2a 2a 20 20 20 20 20 49 6e 73 74 65  O. .**     Inste
1d7d0 61 64 20 74 68 65 20 66 72 61 6d 65 20 61 6e 64  ad the frame and
1d7e0 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 74 68   page numbers th
1d7f0 61 74 20 77 6f 75 6c 64 20 62 65 20 72 65 61 64  at would be read
1d800 20 61 6e 64 20 77 72 69 74 74 65 6e 0a 2a 2a 20   and written.** 
1d810 20 20 20 20 61 72 65 20 72 65 63 6f 72 64 65 64      are recorded
1d820 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20  . Additionally, 
1d830 73 75 63 63 65 73 73 66 75 6c 20 61 74 74 65 6d  successful attem
1d840 70 74 73 20 74 6f 20 6f 62 74 61 69 6e 20 65 78  pts to obtain ex
1d850 63 6c 75 73 69 76 65 0a 2a 2a 20 20 20 20 20 78  clusive.**     x
1d860 53 68 6d 4c 6f 63 6b 28 29 20 57 52 49 54 45 52  ShmLock() WRITER
1d870 2c 20 43 48 45 43 4b 50 4f 49 4e 54 45 52 20 61  , CHECKPOINTER a
1d880 6e 64 20 52 45 41 44 30 20 6c 6f 63 6b 73 20 6f  nd READ0 locks o
1d890 6e 20 74 68 65 20 74 61 72 67 65 74 20 0a 2a 2a  n the target .**
1d8a0 20 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69       database fi
1d8b0 6c 65 20 61 72 65 20 72 65 63 6f 72 64 65 64 2e  le are recorded.
1d8c0 20 78 53 68 6d 4c 6f 63 6b 28 29 20 63 61 6c 6c   xShmLock() call
1d8d0 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20  s to unlock the 
1d8e0 73 61 6d 65 0a 2a 2a 20 20 20 20 20 6c 6f 63 6b  same.**     lock
1d8f0 73 20 61 72 65 20 6e 6f 2d 6f 70 73 20 28 73 6f  s are no-ops (so
1d900 20 74 68 61 74 20 6f 6e 63 65 20 6f 62 74 61 69   that once obtai
1d910 6e 65 64 2c 20 74 68 65 73 65 20 6c 6f 63 6b 73  ned, these locks
1d920 20 61 72 65 20 6e 65 76 65 72 0a 2a 2a 20 20 20   are never.**   
1d930 20 20 72 65 6c 69 6e 71 75 69 73 68 65 64 29 2e    relinquished).
1d940 20 46 69 6e 61 6c 6c 79 2c 20 63 61 6c 6c 73 20   Finally, calls 
1d950 74 6f 20 78 53 79 6e 63 28 29 20 6f 6e 20 74 68  to xSync() on th
1d960 65 20 74 61 72 67 65 74 20 64 61 74 61 62 61 73  e target databas
1d970 65 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20 66 61  e.**     file fa
1d980 69 6c 20 77 69 74 68 20 53 51 4c 49 54 45 5f 49  il with SQLITE_I
1d990 4e 54 45 52 4e 41 4c 20 65 72 72 6f 72 73 2e 0a  NTERNAL errors..
1d9a0 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  */..static void 
1d9b0 72 62 75 55 6e 6c 6f 63 6b 53 68 6d 28 72 62 75  rbuUnlockShm(rbu
1d9c0 5f 66 69 6c 65 20 2a 70 29 7b 0a 20 20 69 66 28  _file *p){.  if(
1d9d0 20 70 2d 3e 70 52 62 75 20 29 7b 0a 20 20 20 20   p->pRbu ){.    
1d9e0 69 6e 74 20 28 2a 78 53 68 6d 4c 6f 63 6b 29 28  int (*xShmLock)(
1d9f0 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 69 6e  sqlite3_file*,in
1da00 74 2c 69 6e 74 2c 69 6e 74 29 20 3d 20 70 2d 3e  t,int,int) = p->
1da10 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d  pReal->pMethods-
1da20 3e 78 53 68 6d 4c 6f 63 6b 3b 0a 20 20 20 20 69  >xShmLock;.    i
1da30 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
1da40 30 3b 20 69 3c 53 51 4c 49 54 45 5f 53 48 4d 5f  0; i<SQLITE_SHM_
1da50 4e 4c 4f 43 4b 3b 69 2b 2b 29 7b 0a 20 20 20 20  NLOCK;i++){.    
1da60 20 20 69 66 28 20 28 31 3c 3c 69 29 20 26 20 70    if( (1<<i) & p
1da70 2d 3e 70 52 62 75 2d 3e 6d 4c 6f 63 6b 20 29 7b  ->pRbu->mLock ){
1da80 0a 20 20 20 20 20 20 20 20 78 53 68 6d 4c 6f 63  .        xShmLoc
1da90 6b 28 70 2d 3e 70 52 65 61 6c 2c 20 69 2c 20 31  k(p->pReal, i, 1
1daa0 2c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c  , SQLITE_SHM_UNL
1dab0 4f 43 4b 7c 53 51 4c 49 54 45 5f 53 48 4d 5f 45  OCK|SQLITE_SHM_E
1dac0 58 43 4c 55 53 49 56 45 29 3b 0a 20 20 20 20 20  XCLUSIVE);.     
1dad0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e   }.    }.    p->
1dae0 70 52 62 75 2d 3e 6d 4c 6f 63 6b 20 3d 20 30 3b  pRbu->mLock = 0;
1daf0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  .  }.}../*.** Cl
1db00 6f 73 65 20 61 6e 20 72 62 75 20 66 69 6c 65 2e  ose an rbu file.
1db10 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
1db20 62 75 56 66 73 43 6c 6f 73 65 28 73 71 6c 69 74  buVfsClose(sqlit
1db30 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 29 7b  e3_file *pFile){
1db40 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 20 3d  .  rbu_file *p =
1db50 20 28 72 62 75 5f 66 69 6c 65 2a 29 70 46 69 6c   (rbu_file*)pFil
1db60 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  e;.  int rc;.  i
1db70 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 46 72 65 65  nt i;..  /* Free
1db80 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
1db90 20 74 68 65 20 61 70 53 68 6d 5b 5d 20 61 72 72   the apShm[] arr
1dba0 61 79 2e 20 41 6e 64 20 74 68 65 20 61 72 72 61  ay. And the arra
1dbb0 79 20 69 74 73 65 6c 66 2e 20 2a 2f 0a 20 20 66  y itself. */.  f
1dbc0 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 68  or(i=0; i<p->nSh
1dbd0 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  m; i++){.    sql
1dbe0 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 70 53  ite3_free(p->apS
1dbf0 68 6d 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 73 71  hm[i]);.  }.  sq
1dc00 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 70  lite3_free(p->ap
1dc10 53 68 6d 29 3b 0a 20 20 70 2d 3e 61 70 53 68 6d  Shm);.  p->apShm
1dc20 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
1dc30 66 72 65 65 28 70 2d 3e 7a 44 65 6c 29 3b 0a 0a  free(p->zDel);..
1dc40 20 20 69 66 28 20 70 2d 3e 6f 70 65 6e 46 6c 61    if( p->openFla
1dc50 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
1dc60 5f 4d 41 49 4e 5f 44 42 20 29 7b 0a 20 20 20 20  _MAIN_DB ){.    
1dc70 72 62 75 5f 66 69 6c 65 20 2a 2a 70 70 3b 0a 20  rbu_file **pp;. 
1dc80 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
1dc90 5f 65 6e 74 65 72 28 70 2d 3e 70 52 62 75 56 66  _enter(p->pRbuVf
1dca0 73 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 66  s->mutex);.    f
1dcb0 6f 72 28 70 70 3d 26 70 2d 3e 70 52 62 75 56 66  or(pp=&p->pRbuVf
1dcc0 73 2d 3e 70 4d 61 69 6e 3b 20 2a 70 70 21 3d 70  s->pMain; *pp!=p
1dcd0 3b 20 70 70 3d 26 28 28 2a 70 70 29 2d 3e 70 4d  ; pp=&((*pp)->pM
1dce0 61 69 6e 4e 65 78 74 29 29 3b 0a 20 20 20 20 2a  ainNext));.    *
1dcf0 70 70 20 3d 20 70 2d 3e 70 4d 61 69 6e 4e 65 78  pp = p->pMainNex
1dd00 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  t;.    sqlite3_m
1dd10 75 74 65 78 5f 6c 65 61 76 65 28 70 2d 3e 70 52  utex_leave(p->pR
1dd20 62 75 56 66 73 2d 3e 6d 75 74 65 78 29 3b 0a 20  buVfs->mutex);. 
1dd30 20 20 20 72 62 75 55 6e 6c 6f 63 6b 53 68 6d 28     rbuUnlockShm(
1dd40 70 29 3b 0a 20 20 20 20 70 2d 3e 70 52 65 61 6c  p);.    p->pReal
1dd50 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53 68 6d  ->pMethods->xShm
1dd60 55 6e 6d 61 70 28 70 2d 3e 70 52 65 61 6c 2c 20  Unmap(p->pReal, 
1dd70 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c  0);.  }..  /* Cl
1dd80 6f 73 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69  ose the underlyi
1dd90 6e 67 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 2a  ng file handle *
1dda0 2f 0a 20 20 72 63 20 3d 20 70 2d 3e 70 52 65 61  /.  rc = p->pRea
1ddb0 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 43 6c  l->pMethods->xCl
1ddc0 6f 73 65 28 70 2d 3e 70 52 65 61 6c 29 3b 0a 20  ose(p->pReal);. 
1ddd0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
1dde0 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 64 20 72  /*.** Read and r
1ddf0 65 74 75 72 6e 20 61 6e 20 75 6e 73 69 67 6e 65  eturn an unsigne
1de00 64 20 33 32 2d 62 69 74 20 62 69 67 2d 65 6e 64  d 32-bit big-end
1de10 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f 6d  ian integer from
1de20 20 74 68 65 20 62 75 66 66 65 72 20 0a 2a 2a 20   the buffer .** 
1de30 70 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e  passed as the on
1de40 6c 79 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  ly argument..*/.
1de50 73 74 61 74 69 63 20 75 33 32 20 72 62 75 47 65  static u32 rbuGe
1de60 74 55 33 32 28 75 38 20 2a 61 42 75 66 29 7b 0a  tU32(u8 *aBuf){.
1de70 20 20 72 65 74 75 72 6e 20 28 28 75 33 32 29 61    return ((u32)a
1de80 42 75 66 5b 30 5d 20 3c 3c 20 32 34 29 0a 20 20  Buf[0] << 24).  
1de90 20 20 20 20 20 2b 20 28 28 75 33 32 29 61 42 75       + ((u32)aBu
1dea0 66 5b 31 5d 20 3c 3c 20 31 36 29 0a 20 20 20 20  f[1] << 16).    
1deb0 20 20 20 2b 20 28 28 75 33 32 29 61 42 75 66 5b     + ((u32)aBuf[
1dec0 32 5d 20 3c 3c 20 20 38 29 0a 20 20 20 20 20 20  2] <<  8).      
1ded0 20 2b 20 28 28 75 33 32 29 61 42 75 66 5b 33 5d   + ((u32)aBuf[3]
1dee0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  );.}../*.** Writ
1def0 65 20 61 6e 20 75 6e 73 69 67 6e 65 64 20 33 32  e an unsigned 32
1df00 2d 62 69 74 20 76 61 6c 75 65 20 69 6e 20 62 69  -bit value in bi
1df10 67 2d 65 6e 64 69 61 6e 20 66 6f 72 6d 61 74 20  g-endian format 
1df20 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64 0a  to the supplied.
1df30 2a 2a 20 62 75 66 66 65 72 2e 0a 2a 2f 0a 73 74  ** buffer..*/.st
1df40 61 74 69 63 20 76 6f 69 64 20 72 62 75 50 75 74  atic void rbuPut
1df50 55 33 32 28 75 38 20 2a 61 42 75 66 2c 20 75 33  U32(u8 *aBuf, u3
1df60 32 20 69 56 61 6c 29 7b 0a 20 20 61 42 75 66 5b  2 iVal){.  aBuf[
1df70 30 5d 20 3d 20 28 69 56 61 6c 20 3e 3e 20 32 34  0] = (iVal >> 24
1df80 29 20 26 20 30 78 46 46 3b 0a 20 20 61 42 75 66  ) & 0xFF;.  aBuf
1df90 5b 31 5d 20 3d 20 28 69 56 61 6c 20 3e 3e 20 31  [1] = (iVal >> 1
1dfa0 36 29 20 26 20 30 78 46 46 3b 0a 20 20 61 42 75  6) & 0xFF;.  aBu
1dfb0 66 5b 32 5d 20 3d 20 28 69 56 61 6c 20 3e 3e 20  f[2] = (iVal >> 
1dfc0 20 38 29 20 26 20 30 78 46 46 3b 0a 20 20 61 42   8) & 0xFF;.  aB
1dfd0 75 66 5b 33 5d 20 3d 20 28 69 56 61 6c 20 3e 3e  uf[3] = (iVal >>
1dfe0 20 20 30 29 20 26 20 30 78 46 46 3b 0a 7d 0a 0a    0) & 0xFF;.}..
1dff0 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75 50  static void rbuP
1e000 75 74 55 31 36 28 75 38 20 2a 61 42 75 66 2c 20  utU16(u8 *aBuf, 
1e010 75 31 36 20 69 56 61 6c 29 7b 0a 20 20 61 42 75  u16 iVal){.  aBu
1e020 66 5b 30 5d 20 3d 20 28 69 56 61 6c 20 3e 3e 20  f[0] = (iVal >> 
1e030 20 38 29 20 26 20 30 78 46 46 3b 0a 20 20 61 42   8) & 0xFF;.  aB
1e040 75 66 5b 31 5d 20 3d 20 28 69 56 61 6c 20 3e 3e  uf[1] = (iVal >>
1e050 20 20 30 29 20 26 20 30 78 46 46 3b 0a 7d 0a 0a    0) & 0xFF;.}..
1e060 2f 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74 61 20  /*.** Read data 
1e070 66 72 6f 6d 20 61 6e 20 72 62 75 56 66 73 2d 66  from an rbuVfs-f
1e080 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
1e090 6e 74 20 72 62 75 56 66 73 52 65 61 64 28 0a 20  nt rbuVfsRead(. 
1e0a0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
1e0b0 46 69 6c 65 2c 20 0a 20 20 76 6f 69 64 20 2a 7a  File, .  void *z
1e0c0 42 75 66 2c 20 0a 20 20 69 6e 74 20 69 41 6d 74  Buf, .  int iAmt
1e0d0 2c 20 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36  , .  sqlite_int6
1e0e0 34 20 69 4f 66 73 74 0a 29 7b 0a 20 20 72 62 75  4 iOfst.){.  rbu
1e0f0 5f 66 69 6c 65 20 2a 70 20 3d 20 28 72 62 75 5f  _file *p = (rbu_
1e100 66 69 6c 65 2a 29 70 46 69 6c 65 3b 0a 20 20 73  file*)pFile;.  s
1e110 71 6c 69 74 65 33 72 62 75 20 2a 70 52 62 75 20  qlite3rbu *pRbu 
1e120 3d 20 70 2d 3e 70 52 62 75 3b 0a 20 20 69 6e 74  = p->pRbu;.  int
1e130 20 72 63 3b 0a 0a 20 20 69 66 28 20 70 52 62 75   rc;..  if( pRbu
1e140 20 26 26 20 70 52 62 75 2d 3e 65 53 74 61 67 65   && pRbu->eStage
1e150 3d 3d 52 42 55 5f 53 54 41 47 45 5f 43 41 50 54  ==RBU_STAGE_CAPT
1e160 55 52 45 20 29 7b 0a 20 20 20 20 61 73 73 65 72  URE ){.    asser
1e170 74 28 20 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20  t( p->openFlags 
1e180 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41  & SQLITE_OPEN_WA
1e190 4c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 72 62  L );.    rc = rb
1e1a0 75 43 61 70 74 75 72 65 57 61 6c 52 65 61 64 28  uCaptureWalRead(
1e1b0 70 2d 3e 70 52 62 75 2c 20 69 4f 66 73 74 2c 20  p->pRbu, iOfst, 
1e1c0 69 41 6d 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  iAmt);.  }else{.
1e1d0 20 20 20 20 69 66 28 20 70 52 62 75 20 26 26 20      if( pRbu && 
1e1e0 70 52 62 75 2d 3e 65 53 74 61 67 65 3d 3d 52 42  pRbu->eStage==RB
1e1f0 55 5f 53 54 41 47 45 5f 4f 41 4c 20 0a 20 20 20  U_STAGE_OAL .   
1e200 20 20 26 26 20 28 70 2d 3e 6f 70 65 6e 46 6c 61    && (p->openFla
1e210 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
1e220 5f 57 41 4c 29 20 0a 20 20 20 20 20 26 26 20 69  _WAL) .     && i
1e230 4f 66 73 74 3e 3d 70 52 62 75 2d 3e 69 4f 61 6c  Ofst>=pRbu->iOal
1e240 53 7a 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  Sz .    ){.     
1e250 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1e260 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 7a 42  .      memset(zB
1e270 75 66 2c 20 30 2c 20 69 41 6d 74 29 3b 0a 20 20  uf, 0, iAmt);.  
1e280 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
1e290 63 20 3d 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d  c = p->pReal->pM
1e2a0 65 74 68 6f 64 73 2d 3e 78 52 65 61 64 28 70 2d  ethods->xRead(p-
1e2b0 3e 70 52 65 61 6c 2c 20 7a 42 75 66 2c 20 69 41  >pReal, zBuf, iA
1e2c0 6d 74 2c 20 69 4f 66 73 74 29 3b 0a 23 69 66 20  mt, iOfst);.#if 
1e2d0 31 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  1.      /* If th
1e2e0 69 73 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c  is is being call
1e2f0 65 64 20 74 6f 20 72 65 61 64 20 74 68 65 20 66  ed to read the f
1e300 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
1e310 20 74 61 72 67 65 74 20 0a 20 20 20 20 20 20 2a   target .      *
1e320 2a 20 64 61 74 61 62 61 73 65 20 61 73 20 70 61  * database as pa
1e330 72 74 20 6f 66 20 61 6e 20 72 62 75 20 76 61 63  rt of an rbu vac
1e340 75 75 6d 20 6f 70 65 72 61 74 69 6f 6e 2c 20 73  uum operation, s
1e350 79 6e 74 68 65 73 69 7a 65 20 74 68 65 20 0a 20  ynthesize the . 
1e360 20 20 20 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 73       ** contents
1e370 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 70 61   of the first pa
1e380 67 65 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f  ge if it does no
1e390 74 20 79 65 74 20 65 78 69 73 74 2e 20 4f 74 68  t yet exist. Oth
1e3a0 65 72 77 69 73 65 2c 0a 20 20 20 20 20 20 2a 2a  erwise,.      **
1e3b0 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e 6f 74   SQLite will not
1e3c0 20 63 68 65 63 6b 20 66 6f 72 20 61 20 2a 2d 77   check for a *-w
1e3d0 61 6c 20 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 20  al file.  */.   
1e3e0 20 20 20 69 66 28 20 70 52 62 75 20 26 26 20 72     if( pRbu && r
1e3f0 62 75 49 73 56 61 63 75 75 6d 28 70 52 62 75 29  buIsVacuum(pRbu)
1e400 20 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 72   .          && r
1e410 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c==SQLITE_IOERR_
1e420 53 48 4f 52 54 5f 52 45 41 44 20 26 26 20 69 4f  SHORT_READ && iO
1e430 66 73 74 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  fst==0.         
1e440 20 26 26 20 28 70 2d 3e 6f 70 65 6e 46 6c 61 67   && (p->openFlag
1e450 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
1e460 4d 41 49 4e 5f 44 42 29 0a 20 20 20 20 20 20 29  MAIN_DB).      )
1e470 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1e480 33 5f 66 69 6c 65 20 2a 70 46 64 20 3d 20 28 73  3_file *pFd = (s
1e490 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70 52 62  qlite3_file*)pRb
1e4a0 75 2d 3e 70 52 62 75 46 64 3b 0a 20 20 20 20 20  u->pRbuFd;.     
1e4b0 20 20 20 72 63 20 3d 20 70 46 64 2d 3e 70 4d 65     rc = pFd->pMe
1e4c0 74 68 6f 64 73 2d 3e 78 52 65 61 64 28 70 46 64  thods->xRead(pFd
1e4d0 2c 20 7a 42 75 66 2c 20 69 41 6d 74 2c 20 69 4f  , zBuf, iAmt, iO
1e4e0 66 73 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66  fst);.        if
1e4f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1e500 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 38 20  ){.          u8 
1e510 2a 61 42 75 66 20 3d 20 28 75 38 2a 29 7a 42 75  *aBuf = (u8*)zBu
1e520 66 3b 0a 20 20 20 20 20 20 20 20 20 20 72 62 75  f;.          rbu
1e530 50 75 74 55 33 32 28 26 61 42 75 66 5b 35 32 5d  PutU32(&aBuf[52]
1e540 2c 20 30 29 3b 20 20 20 20 20 20 20 20 20 20 2f  , 0);          /
1e550 2a 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 20 70  * largest root p
1e560 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  age number */.  
1e570 20 20 20 20 20 20 20 20 72 62 75 50 75 74 55 33          rbuPutU3
1e580 32 28 26 61 42 75 66 5b 33 36 5d 2c 20 30 29 3b  2(&aBuf[36], 0);
1e590 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6e 75 6d            /* num
1e5a0 62 65 72 20 6f 66 20 66 72 65 65 20 70 61 67 65  ber of free page
1e5b0 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  s */.          r
1e5c0 62 75 50 75 74 55 33 32 28 26 61 42 75 66 5b 33  buPutU32(&aBuf[3
1e5d0 32 5d 2c 20 30 29 3b 20 20 20 20 20 20 20 20 20  2], 0);         
1e5e0 20 2f 2a 20 66 69 72 73 74 20 70 61 67 65 20 6f   /* first page o
1e5f0 6e 20 66 72 65 65 20 6c 69 73 74 20 74 72 75 6e  n free list trun
1e600 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  k */.          r
1e610 62 75 50 75 74 55 33 32 28 26 61 42 75 66 5b 32  buPutU32(&aBuf[2
1e620 38 5d 2c 20 31 29 3b 20 20 20 20 20 20 20 20 20  8], 1);         
1e630 20 2f 2a 20 73 69 7a 65 20 6f 66 20 64 62 20 66   /* size of db f
1e640 69 6c 65 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a  ile in pages */.
1e650 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
1e660 41 6d 74 3e 31 30 30 20 29 7b 0a 20 20 20 20 20  Amt>100 ){.     
1e670 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
1e680 41 6d 74 3e 3d 31 30 31 20 29 3b 0a 20 20 20 20  Amt>=101 );.    
1e690 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26          memset(&
1e6a0 61 42 75 66 5b 31 30 31 5d 2c 20 30 2c 20 69 41  aBuf[101], 0, iA
1e6b0 6d 74 2d 31 30 31 29 3b 0a 20 20 20 20 20 20 20  mt-101);.       
1e6c0 20 20 20 20 20 72 62 75 50 75 74 55 31 36 28 26       rbuPutU16(&
1e6d0 61 42 75 66 5b 31 30 35 5d 2c 20 69 41 6d 74 20  aBuf[105], iAmt 
1e6e0 26 20 30 78 46 46 46 46 29 3b 0a 20 20 20 20 20  & 0xFFFF);.     
1e6f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
1e700 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
1e710 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
1e720 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
1e730 4f 66 73 74 3d 3d 30 20 26 26 20 28 70 2d 3e 6f  Ofst==0 && (p->o
1e740 70 65 6e 46 6c 61 67 73 20 26 20 53 51 4c 49 54  penFlags & SQLIT
1e750 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 20  E_OPEN_MAIN_DB) 
1e760 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 73  ){.      /* Thes
1e770 65 20 6c 6f 6f 6b 20 6c 69 6b 65 20 6d 61 67 69  e look like magi
1e780 63 20 6e 75 6d 62 65 72 73 2e 20 42 75 74 20 74  c numbers. But t
1e790 68 65 79 20 61 72 65 20 73 74 61 62 6c 65 2c 20  hey are stable, 
1e7a0 61 73 20 74 68 65 79 20 61 72 65 20 70 61 72 74  as they are part
1e7b0 0a 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68  .       ** of th
1e7c0 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66 20  e definition of 
1e7d0 74 68 65 20 53 51 4c 69 74 65 20 66 69 6c 65 20  the SQLite file 
1e7e0 66 6f 72 6d 61 74 2c 20 77 68 69 63 68 20 6d 61  format, which ma
1e7f0 79 20 6e 6f 74 20 63 68 61 6e 67 65 2e 20 2a 2f  y not change. */
1e800 0a 20 20 20 20 20 20 75 38 20 2a 70 42 75 66 20  .      u8 *pBuf 
1e810 3d 20 28 75 38 2a 29 7a 42 75 66 3b 0a 20 20 20  = (u8*)zBuf;.   
1e820 20 20 20 70 2d 3e 69 43 6f 6f 6b 69 65 20 3d 20     p->iCookie = 
1e830 72 62 75 47 65 74 55 33 32 28 26 70 42 75 66 5b  rbuGetU32(&pBuf[
1e840 32 34 5d 29 3b 0a 20 20 20 20 20 20 70 2d 3e 69  24]);.      p->i
1e850 57 72 69 74 65 56 65 72 20 3d 20 70 42 75 66 5b  WriteVer = pBuf[
1e860 31 39 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  19];.      if( p
1e870 52 62 75 20 26 26 20 72 62 75 49 73 56 61 63 75  Rbu && rbuIsVacu
1e880 75 6d 28 70 2d 3e 70 52 62 75 29 20 29 7b 0a 20  um(p->pRbu) ){. 
1e890 20 20 20 20 20 20 20 72 62 75 5f 66 69 6c 65 20         rbu_file 
1e8a0 2a 70 52 62 75 46 64 20 3d 20 30 3b 0a 20 20 20  *pRbuFd = 0;.   
1e8b0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c       sqlite3_fil
1e8c0 65 5f 63 6f 6e 74 72 6f 6c 28 70 52 62 75 2d 3e  e_control(pRbu->
1e8d0 64 62 52 62 75 2c 20 22 6d 61 69 6e 22 2c 20 0a  dbRbu, "main", .
1e8e0 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
1e8f0 54 45 5f 46 43 4e 54 4c 5f 46 49 4c 45 5f 50 4f  TE_FCNTL_FILE_PO
1e900 49 4e 54 45 52 2c 20 28 76 6f 69 64 2a 29 26 70  INTER, (void*)&p
1e910 52 62 75 46 64 0a 20 20 20 20 20 20 20 20 29 3b  RbuFd.        );
1e920 0a 20 20 20 20 20 20 20 20 72 62 75 50 75 74 55  .        rbuPutU
1e930 33 32 28 26 70 42 75 66 5b 32 34 5d 2c 20 70 52  32(&pBuf[24], pR
1e940 62 75 46 64 2d 3e 69 43 6f 6f 6b 69 65 2b 31 29  buFd->iCookie+1)
1e950 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1e960 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1e970 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
1e980 64 61 74 61 20 74 6f 20 61 6e 20 72 62 75 56 66  data to an rbuVf
1e990 73 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  s-file..*/.stati
1e9a0 63 20 69 6e 74 20 72 62 75 56 66 73 57 72 69 74  c int rbuVfsWrit
1e9b0 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  e(.  sqlite3_fil
1e9c0 65 20 2a 70 46 69 6c 65 2c 20 0a 20 20 63 6f 6e  e *pFile, .  con
1e9d0 73 74 20 76 6f 69 64 20 2a 7a 42 75 66 2c 20 0a  st void *zBuf, .
1e9e0 20 20 69 6e 74 20 69 41 6d 74 2c 20 0a 20 20 73    int iAmt, .  s
1e9f0 71 6c 69 74 65 5f 69 6e 74 36 34 20 69 4f 66 73  qlite_int64 iOfs
1ea00 74 0a 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20  t.){.  rbu_file 
1ea10 2a 70 20 3d 20 28 72 62 75 5f 66 69 6c 65 2a 29  *p = (rbu_file*)
1ea20 70 46 69 6c 65 3b 0a 20 20 73 71 6c 69 74 65 33  pFile;.  sqlite3
1ea30 72 62 75 20 2a 70 52 62 75 20 3d 20 70 2d 3e 70  rbu *pRbu = p->p
1ea40 52 62 75 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  Rbu;.  int rc;..
1ea50 20 20 69 66 28 20 70 52 62 75 20 26 26 20 70 52    if( pRbu && pR
1ea60 62 75 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f  bu->eStage==RBU_
1ea70 53 54 41 47 45 5f 43 41 50 54 55 52 45 20 29 7b  STAGE_CAPTURE ){
1ea80 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
1ea90 6f 70 65 6e 46 6c 61 67 73 20 26 20 53 51 4c 49  openFlags & SQLI
1eaa0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20  TE_OPEN_MAIN_DB 
1eab0 29 3b 0a 20 20 20 20 72 63 20 3d 20 72 62 75 43  );.    rc = rbuC
1eac0 61 70 74 75 72 65 44 62 57 72 69 74 65 28 70 2d  aptureDbWrite(p-
1ead0 3e 70 52 62 75 2c 20 69 4f 66 73 74 29 3b 0a 20  >pRbu, iOfst);. 
1eae0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
1eaf0 70 52 62 75 20 26 26 20 70 52 62 75 2d 3e 65 53  pRbu && pRbu->eS
1eb00 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f  tage==RBU_STAGE_
1eb10 4f 41 4c 20 0a 20 20 20 20 20 26 26 20 28 70 2d  OAL .     && (p-
1eb20 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20 53 51 4c  >openFlags & SQL
1eb30 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 29 20 0a 20  ITE_OPEN_WAL) . 
1eb40 20 20 20 20 26 26 20 69 4f 66 73 74 3e 3d 70 52      && iOfst>=pR
1eb50 62 75 2d 3e 69 4f 61 6c 53 7a 0a 20 20 20 20 29  bu->iOalSz.    )
1eb60 7b 0a 20 20 20 20 20 20 70 52 62 75 2d 3e 69 4f  {.      pRbu->iO
1eb70 61 6c 53 7a 20 3d 20 69 41 6d 74 20 2b 20 69 4f  alSz = iAmt + iO
1eb80 66 73 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  fst;.    }.    r
1eb90 63 20 3d 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d  c = p->pReal->pM
1eba0 65 74 68 6f 64 73 2d 3e 78 57 72 69 74 65 28 70  ethods->xWrite(p
1ebb0 2d 3e 70 52 65 61 6c 2c 20 7a 42 75 66 2c 20 69  ->pReal, zBuf, i
1ebc0 41 6d 74 2c 20 69 4f 66 73 74 29 3b 0a 20 20 20  Amt, iOfst);.   
1ebd0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1ebe0 4f 4b 20 26 26 20 69 4f 66 73 74 3d 3d 30 20 26  OK && iOfst==0 &
1ebf0 26 20 28 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20  & (p->openFlags 
1ec00 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  & SQLITE_OPEN_MA
1ec10 49 4e 5f 44 42 29 20 29 7b 0a 20 20 20 20 20 20  IN_DB) ){.      
1ec20 2f 2a 20 54 68 65 73 65 20 6c 6f 6f 6b 20 6c 69  /* These look li
1ec30 6b 65 20 6d 61 67 69 63 20 6e 75 6d 62 65 72 73  ke magic numbers
1ec40 2e 20 42 75 74 20 74 68 65 79 20 61 72 65 20 73  . But they are s
1ec50 74 61 62 6c 65 2c 20 61 73 20 74 68 65 79 20 61  table, as they a
1ec60 72 65 20 70 61 72 74 0a 20 20 20 20 20 20 2a 2a  re part.      **
1ec70 20 6f 66 20 74 68 65 20 64 65 66 69 6e 69 74 69   of the definiti
1ec80 6f 6e 20 6f 66 20 74 68 65 20 53 51 4c 69 74 65  on of the SQLite
1ec90 20 66 69 6c 65 20 66 6f 72 6d 61 74 2c 20 77 68   file format, wh
1eca0 69 63 68 20 6d 61 79 20 6e 6f 74 20 63 68 61 6e  ich may not chan
1ecb0 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 75 38 20  ge. */.      u8 
1ecc0 2a 70 42 75 66 20 3d 20 28 75 38 2a 29 7a 42 75  *pBuf = (u8*)zBu
1ecd0 66 3b 0a 20 20 20 20 20 20 70 2d 3e 69 43 6f 6f  f;.      p->iCoo
1ece0 6b 69 65 20 3d 20 72 62 75 47 65 74 55 33 32 28  kie = rbuGetU32(
1ecf0 26 70 42 75 66 5b 32 34 5d 29 3b 0a 20 20 20 20  &pBuf[24]);.    
1ed00 20 20 70 2d 3e 69 57 72 69 74 65 56 65 72 20 3d    p->iWriteVer =
1ed10 20 70 42 75 66 5b 31 39 5d 3b 0a 20 20 20 20 7d   pBuf[19];.    }
1ed20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1ed30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63  ;.}../*.** Trunc
1ed40 61 74 65 20 61 6e 20 72 62 75 56 66 73 2d 66 69  ate an rbuVfs-fi
1ed50 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
1ed60 74 20 72 62 75 56 66 73 54 72 75 6e 63 61 74 65  t rbuVfsTruncate
1ed70 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70  (sqlite3_file *p
1ed80 46 69 6c 65 2c 20 73 71 6c 69 74 65 5f 69 6e 74  File, sqlite_int
1ed90 36 34 20 73 69 7a 65 29 7b 0a 20 20 72 62 75 5f  64 size){.  rbu_
1eda0 66 69 6c 65 20 2a 70 20 3d 20 28 72 62 75 5f 66  file *p = (rbu_f
1edb0 69 6c 65 2a 29 70 46 69 6c 65 3b 0a 20 20 72 65  ile*)pFile;.  re
1edc0 74 75 72 6e 20 70 2d 3e 70 52 65 61 6c 2d 3e 70  turn p->pReal->p
1edd0 4d 65 74 68 6f 64 73 2d 3e 78 54 72 75 6e 63 61  Methods->xTrunca
1ede0 74 65 28 70 2d 3e 70 52 65 61 6c 2c 20 73 69 7a  te(p->pReal, siz
1edf0 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e  e);.}../*.** Syn
1ee00 63 20 61 6e 20 72 62 75 56 66 73 2d 66 69 6c 65  c an rbuVfs-file
1ee10 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1ee20 72 62 75 56 66 73 53 79 6e 63 28 73 71 6c 69 74  rbuVfsSync(sqlit
1ee30 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20  e3_file *pFile, 
1ee40 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 72 62  int flags){.  rb
1ee50 75 5f 66 69 6c 65 20 2a 70 20 3d 20 28 72 62 75  u_file *p = (rbu
1ee60 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20  _file *)pFile;. 
1ee70 20 69 66 28 20 70 2d 3e 70 52 62 75 20 26 26 20   if( p->pRbu && 
1ee80 70 2d 3e 70 52 62 75 2d 3e 65 53 74 61 67 65 3d  p->pRbu->eStage=
1ee90 3d 52 42 55 5f 53 54 41 47 45 5f 43 41 50 54 55  =RBU_STAGE_CAPTU
1eea0 52 45 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  RE ){.    if( p-
1eeb0 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20 53 51 4c  >openFlags & SQL
1eec0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
1eed0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1eee0 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c   SQLITE_INTERNAL
1eef0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
1ef00 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1ef10 7d 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 52  }.  return p->pR
1ef20 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78  eal->pMethods->x
1ef30 53 79 6e 63 28 70 2d 3e 70 52 65 61 6c 2c 20 66  Sync(p->pReal, f
1ef40 6c 61 67 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  lags);.}../*.** 
1ef50 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65  Return the curre
1ef60 6e 74 20 66 69 6c 65 2d 73 69 7a 65 20 6f 66 20  nt file-size of 
1ef70 61 6e 20 72 62 75 56 66 73 2d 66 69 6c 65 2e 0a  an rbuVfs-file..
1ef80 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62  */.static int rb
1ef90 75 56 66 73 46 69 6c 65 53 69 7a 65 28 73 71 6c  uVfsFileSize(sql
1efa0 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65  ite3_file *pFile
1efb0 2c 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 2a  , sqlite_int64 *
1efc0 70 53 69 7a 65 29 7b 0a 20 20 72 62 75 5f 66 69  pSize){.  rbu_fi
1efd0 6c 65 20 2a 70 20 3d 20 28 72 62 75 5f 66 69 6c  le *p = (rbu_fil
1efe0 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 69 6e 74  e *)pFile;.  int
1eff0 20 72 63 3b 0a 20 20 72 63 20 3d 20 70 2d 3e 70   rc;.  rc = p->p
1f000 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e  Real->pMethods->
1f010 78 46 69 6c 65 53 69 7a 65 28 70 2d 3e 70 52 65  xFileSize(p->pRe
1f020 61 6c 2c 20 70 53 69 7a 65 29 3b 0a 0a 20 20 2f  al, pSize);..  /
1f030 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
1f040 52 42 55 20 76 61 63 75 75 6d 20 6f 70 65 72 61  RBU vacuum opera
1f050 74 69 6f 6e 20 61 6e 64 20 74 68 69 73 20 69 73  tion and this is
1f060 20 74 68 65 20 74 61 72 67 65 74 20 64 61 74 61   the target data
1f070 62 61 73 65 2c 0a 20 20 2a 2a 20 70 72 65 74 65  base,.  ** prete
1f080 6e 64 20 74 68 61 74 20 69 74 20 68 61 73 20 61  nd that it has a
1f090 74 20 6c 65 61 73 74 20 6f 6e 65 20 70 61 67 65  t least one page
1f0a0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c  . Otherwise, SQL
1f0b0 69 74 65 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 2a  ite will not.  *
1f0c0 2a 20 63 68 65 63 6b 20 66 6f 72 20 74 68 65 20  * check for the 
1f0d0 65 78 69 73 74 61 6e 63 65 20 6f 66 20 61 20 2a  existance of a *
1f0e0 2d 77 61 6c 20 66 69 6c 65 2e 20 72 62 75 56 66  -wal file. rbuVf
1f0f0 73 52 65 61 64 28 29 20 63 6f 6e 74 61 69 6e 73  sRead() contains
1f100 20 0a 20 20 2a 2a 20 73 69 6d 69 6c 61 72 20 6c   .  ** similar l
1f110 6f 67 69 63 2e 20 20 2a 2f 0a 20 20 69 66 28 20  ogic.  */.  if( 
1f120 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1f130 20 2a 70 53 69 7a 65 3d 3d 30 20 0a 20 20 20 26   *pSize==0 .   &
1f140 26 20 70 2d 3e 70 52 62 75 20 26 26 20 72 62 75  & p->pRbu && rbu
1f150 49 73 56 61 63 75 75 6d 28 70 2d 3e 70 52 62 75  IsVacuum(p->pRbu
1f160 29 20 0a 20 20 20 26 26 20 28 70 2d 3e 6f 70 65  ) .   && (p->ope
1f170 6e 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  nFlags & SQLITE_
1f180 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 0a 20 20  OPEN_MAIN_DB).  
1f190 29 7b 0a 20 20 20 20 2a 70 53 69 7a 65 20 3d 20  ){.    *pSize = 
1f1a0 31 30 32 34 3b 0a 20 20 7d 0a 20 20 72 65 74 75  1024;.  }.  retu
1f1b0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1f1c0 4c 6f 63 6b 20 61 6e 20 72 62 75 56 66 73 2d 66  Lock an rbuVfs-f
1f1d0 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
1f1e0 6e 74 20 72 62 75 56 66 73 4c 6f 63 6b 28 73 71  nt rbuVfsLock(sq
1f1f0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
1f200 65 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20  e, int eLock){. 
1f210 20 72 62 75 5f 66 69 6c 65 20 2a 70 20 3d 20 28   rbu_file *p = (
1f220 72 62 75 5f 66 69 6c 65 2a 29 70 46 69 6c 65 3b  rbu_file*)pFile;
1f230 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20 2a 70  .  sqlite3rbu *p
1f240 52 62 75 20 3d 20 70 2d 3e 70 52 62 75 3b 0a 20  Rbu = p->pRbu;. 
1f250 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1f260 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  _OK;..  assert( 
1f270 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20 28  p->openFlags & (
1f280 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
1f290 5f 44 42 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  _DB|SQLITE_OPEN_
1f2a0 54 45 4d 50 5f 44 42 29 20 29 3b 0a 20 20 69 66  TEMP_DB) );.  if
1f2b0 28 20 65 4c 6f 63 6b 3d 3d 53 51 4c 49 54 45 5f  ( eLock==SQLITE_
1f2c0 4c 4f 43 4b 5f 45 58 43 4c 55 53 49 56 45 20 0a  LOCK_EXCLUSIVE .
1f2d0 20 20 20 26 26 20 28 70 2d 3e 62 4e 6f 6c 6f 63     && (p->bNoloc
1f2e0 6b 20 7c 7c 20 28 70 52 62 75 20 26 26 20 70 52  k || (pRbu && pR
1f2f0 62 75 2d 3e 65 53 74 61 67 65 21 3d 52 42 55 5f  bu->eStage!=RBU_
1f300 53 54 41 47 45 5f 44 4f 4e 45 29 29 0a 20 20 29  STAGE_DONE)).  )
1f310 7b 0a 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20  {.    /* Do not 
1f320 61 6c 6c 6f 77 20 45 58 43 4c 55 53 49 56 45 20  allow EXCLUSIVE 
1f330 6c 6f 63 6b 73 2e 20 50 72 65 76 65 6e 74 69 6e  locks. Preventin
1f340 67 20 53 51 4c 69 74 65 20 66 72 6f 6d 20 74 61  g SQLite from ta
1f350 6b 69 6e 67 20 74 68 69 73 20 0a 20 20 20 20 2a  king this .    *
1f360 2a 20 70 72 65 76 65 6e 74 73 20 69 74 20 66 72  * prevents it fr
1f370 6f 6d 20 63 68 65 63 6b 70 6f 69 6e 74 69 6e 67  om checkpointing
1f380 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 72   the database fr
1f390 6f 6d 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  om sqlite3_close
1f3a0 28 29 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  (). */.    rc = 
1f3b0 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
1f3c0 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 70  else{.    rc = p
1f3d0 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64  ->pReal->pMethod
1f3e0 73 2d 3e 78 4c 6f 63 6b 28 70 2d 3e 70 52 65 61  s->xLock(p->pRea
1f3f0 6c 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20 7d 0a 0a  l, eLock);.  }..
1f400 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1f410 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 61 6e 20  /*.** Unlock an 
1f420 72 62 75 56 66 73 2d 66 69 6c 65 2e 0a 2a 2f 0a  rbuVfs-file..*/.
1f430 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 56 66  static int rbuVf
1f440 73 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  sUnlock(sqlite3_
1f450 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74  file *pFile, int
1f460 20 65 4c 6f 63 6b 29 7b 0a 20 20 72 62 75 5f 66   eLock){.  rbu_f
1f470 69 6c 65 20 2a 70 20 3d 20 28 72 62 75 5f 66 69  ile *p = (rbu_fi
1f480 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 72 65  le *)pFile;.  re
1f490 74 75 72 6e 20 70 2d 3e 70 52 65 61 6c 2d 3e 70  turn p->pReal->p
1f4a0 4d 65 74 68 6f 64 73 2d 3e 78 55 6e 6c 6f 63 6b  Methods->xUnlock
1f4b0 28 70 2d 3e 70 52 65 61 6c 2c 20 65 4c 6f 63 6b  (p->pReal, eLock
1f4c0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  );.}../*.** Chec
1f4d0 6b 20 69 66 20 61 6e 6f 74 68 65 72 20 66 69 6c  k if another fil
1f4e0 65 2d 68 61 6e 64 6c 65 20 68 6f 6c 64 73 20 61  e-handle holds a
1f4f0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f   RESERVED lock o
1f500 6e 20 61 6e 20 72 62 75 56 66 73 2d 66 69 6c 65  n an rbuVfs-file
1f510 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1f520 72 62 75 56 66 73 43 68 65 63 6b 52 65 73 65 72  rbuVfsCheckReser
1f530 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  vedLock(sqlite3_
1f540 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74  file *pFile, int
1f550 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 72 62   *pResOut){.  rb
1f560 75 5f 66 69 6c 65 20 2a 70 20 3d 20 28 72 62 75  u_file *p = (rbu
1f570 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20  _file *)pFile;. 
1f580 20 72 65 74 75 72 6e 20 70 2d 3e 70 52 65 61 6c   return p->pReal
1f590 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 43 68 65  ->pMethods->xChe
1f5a0 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 70  ckReservedLock(p
1f5b0 2d 3e 70 52 65 61 6c 2c 20 70 52 65 73 4f 75 74  ->pReal, pResOut
1f5c0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c 65  );.}../*.** File
1f5d0 20 63 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64 2e   control method.
1f5e0 20 46 6f 72 20 63 75 73 74 6f 6d 20 6f 70 65 72   For custom oper
1f5f0 61 74 69 6f 6e 73 20 6f 6e 20 61 6e 20 72 62 75  ations on an rbu
1f600 56 66 73 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  Vfs-file..*/.sta
1f610 74 69 63 20 69 6e 74 20 72 62 75 56 66 73 46 69  tic int rbuVfsFi
1f620 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65  leControl(sqlite
1f630 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69  3_file *pFile, i
1f640 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72  nt op, void *pAr
1f650 67 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a  g){.  rbu_file *
1f660 70 20 3d 20 28 72 62 75 5f 66 69 6c 65 20 2a 29  p = (rbu_file *)
1f670 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20 28 2a 78  pFile;.  int (*x
1f680 43 6f 6e 74 72 6f 6c 29 28 73 71 6c 69 74 65 33  Control)(sqlite3
1f690 5f 66 69 6c 65 2a 2c 69 6e 74 2c 76 6f 69 64 2a  _file*,int,void*
1f6a0 29 20 3d 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d  ) = p->pReal->pM
1f6b0 65 74 68 6f 64 73 2d 3e 78 46 69 6c 65 43 6f 6e  ethods->xFileCon
1f6c0 74 72 6f 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  trol;.  int rc;.
1f6d0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70  .  assert( p->op
1f6e0 65 6e 46 6c 61 67 73 20 26 20 28 53 51 4c 49 54  enFlags & (SQLIT
1f6f0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 7c 53  E_OPEN_MAIN_DB|S
1f700 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
1f710 44 42 29 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d  DB).       || p-
1f720 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20 28 53 51  >openFlags & (SQ
1f730 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49  LITE_OPEN_TRANSI
1f740 45 4e 54 5f 44 42 7c 53 51 4c 49 54 45 5f 4f 50  ENT_DB|SQLITE_OP
1f750 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 29  EN_TEMP_JOURNAL)
1f760 0a 20 20 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  .  );.  if( op==
1f770 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 52 42 55  SQLITE_FCNTL_RBU
1f780 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 72   ){.    sqlite3r
1f790 62 75 20 2a 70 52 62 75 20 3d 20 28 73 71 6c 69  bu *pRbu = (sqli
1f7a0 74 65 33 72 62 75 2a 29 70 41 72 67 3b 0a 0a 20  te3rbu*)pArg;.. 
1f7b0 20 20 20 2f 2a 20 46 69 72 73 74 20 74 72 79 20     /* First try 
1f7c0 74 6f 20 66 69 6e 64 20 61 6e 6f 74 68 65 72 20  to find another 
1f7d0 52 42 55 20 76 66 73 20 6c 6f 77 65 72 20 64 6f  RBU vfs lower do
1f7e0 77 6e 20 69 6e 20 74 68 65 20 76 66 73 20 73 74  wn in the vfs st
1f7f0 61 63 6b 2e 20 49 66 0a 20 20 20 20 2a 2a 20 6f  ack. If.    ** o
1f800 6e 65 20 69 73 20 66 6f 75 6e 64 2c 20 74 68 69  ne is found, thi
1f810 73 20 76 66 73 20 77 69 6c 6c 20 6f 70 65 72 61  s vfs will opera
1f820 74 65 20 69 6e 20 70 61 73 73 2d 74 68 72 6f 75  te in pass-throu
1f830 67 68 20 6d 6f 64 65 2e 20 54 68 65 20 6c 6f 77  gh mode. The low
1f840 65 72 0a 20 20 20 20 2a 2a 20 6c 65 76 65 6c 20  er.    ** level 
1f850 76 66 73 20 77 69 6c 6c 20 64 6f 20 74 68 65 20  vfs will do the 
1f860 73 70 65 63 69 61 6c 20 52 42 55 20 68 61 6e 64  special RBU hand
1f870 6c 69 6e 67 2e 20 20 2a 2f 0a 20 20 20 20 72 63  ling.  */.    rc
1f880 20 3d 20 78 43 6f 6e 74 72 6f 6c 28 70 2d 3e 70   = xControl(p->p
1f890 52 65 61 6c 2c 20 6f 70 2c 20 70 41 72 67 29 3b  Real, op, pArg);
1f8a0 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ..    if( rc==SQ
1f8b0 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 7b  LITE_NOTFOUND ){
1f8c0 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 77 20 73 65  .      /* Now se
1f8d0 61 72 63 68 20 66 6f 72 20 61 20 7a 69 70 76 66  arch for a zipvf
1f8e0 73 20 69 6e 73 74 61 6e 63 65 20 6c 6f 77 65 72  s instance lower
1f8f0 20 64 6f 77 6e 20 69 6e 20 74 68 65 20 56 46 53   down in the VFS
1f900 20 73 74 61 63 6b 2e 20 49 66 0a 20 20 20 20 20   stack. If.     
1f910 20 2a 2a 20 6f 6e 65 20 69 73 20 66 6f 75 6e 64   ** one is found
1f920 2c 20 74 68 69 73 20 69 73 20 61 6e 20 65 72 72  , this is an err
1f930 6f 72 2e 20 20 2a 2f 0a 20 20 20 20 20 20 76 6f  or.  */.      vo
1f940 69 64 20 2a 64 75 6d 6d 79 20 3d 20 30 3b 0a 20  id *dummy = 0;. 
1f950 20 20 20 20 20 72 63 20 3d 20 78 43 6f 6e 74 72       rc = xContr
1f960 6f 6c 28 70 2d 3e 70 52 65 61 6c 2c 20 53 51 4c  ol(p->pReal, SQL
1f970 49 54 45 5f 46 43 4e 54 4c 5f 5a 49 50 56 46 53  ITE_FCNTL_ZIPVFS
1f980 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 20  , &dummy);.     
1f990 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1f9a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
1f9b0 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
1f9c0 0a 20 20 20 20 20 20 20 20 70 52 62 75 2d 3e 7a  .        pRbu->z
1f9d0 45 72 72 6d 73 67 20 3d 20 73 71 6c 69 74 65 33  Errmsg = sqlite3
1f9e0 5f 6d 70 72 69 6e 74 66 28 22 72 62 75 2f 7a 69  _mprintf("rbu/zi
1f9f0 70 76 66 73 20 73 65 74 75 70 20 65 72 72 6f 72  pvfs setup error
1fa00 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ");.      }else 
1fa10 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  if( rc==SQLITE_N
1fa20 4f 54 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20  OTFOUND ){.     
1fa30 20 20 20 70 52 62 75 2d 3e 70 54 61 72 67 65 74     pRbu->pTarget
1fa40 46 64 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20  Fd = p;.        
1fa50 70 2d 3e 70 52 62 75 20 3d 20 70 52 62 75 3b 0a  p->pRbu = pRbu;.
1fa60 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70          if( p->p
1fa70 57 61 6c 46 64 20 29 20 70 2d 3e 70 57 61 6c 46  WalFd ) p->pWalF
1fa80 64 2d 3e 70 52 62 75 20 3d 20 70 52 62 75 3b 0a  d->pRbu = pRbu;.
1fa90 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1faa0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
1fab0 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
1fac0 20 72 63 3b 0a 20 20 7d 0a 20 20 65 6c 73 65 20   rc;.  }.  else 
1fad0 69 66 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 46  if( op==SQLITE_F
1fae0 43 4e 54 4c 5f 52 42 55 43 4e 54 20 29 7b 0a 20  CNTL_RBUCNT ){. 
1faf0 20 20 20 73 71 6c 69 74 65 33 72 62 75 20 2a 70     sqlite3rbu *p
1fb00 52 62 75 20 3d 20 28 73 71 6c 69 74 65 33 72 62  Rbu = (sqlite3rb
1fb10 75 2a 29 70 41 72 67 3b 0a 20 20 20 20 70 52 62  u*)pArg;.    pRb
1fb20 75 2d 3e 6e 52 62 75 2b 2b 3b 0a 20 20 20 20 70  u->nRbu++;.    p
1fb30 52 62 75 2d 3e 70 52 62 75 46 64 20 3d 20 70 3b  Rbu->pRbuFd = p;
1fb40 0a 20 20 20 20 70 2d 3e 62 4e 6f 6c 6f 63 6b 20  .    p->bNolock 
1fb50 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  = 1;.  }..  rc =
1fb60 20 78 43 6f 6e 74 72 6f 6c 28 70 2d 3e 70 52 65   xControl(p->pRe
1fb70 61 6c 2c 20 6f 70 2c 20 70 41 72 67 29 3b 0a 20  al, op, pArg);. 
1fb80 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1fb90 4f 4b 20 26 26 20 6f 70 3d 3d 53 51 4c 49 54 45  OK && op==SQLITE
1fba0 5f 46 43 4e 54 4c 5f 56 46 53 4e 41 4d 45 20 29  _FCNTL_VFSNAME )
1fbb0 7b 0a 20 20 20 20 72 62 75 5f 76 66 73 20 2a 70  {.    rbu_vfs *p
1fbc0 52 62 75 56 66 73 20 3d 20 70 2d 3e 70 52 62 75  RbuVfs = p->pRbu
1fbd0 56 66 73 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  Vfs;.    char *z
1fbe0 49 6e 20 3d 20 2a 28 63 68 61 72 2a 2a 29 70 41  In = *(char**)pA
1fbf0 72 67 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4f  rg;.    char *zO
1fc00 75 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ut = sqlite3_mpr
1fc10 69 6e 74 66 28 22 72 62 75 28 25 73 29 2f 25 7a  intf("rbu(%s)/%z
1fc20 22 2c 20 70 52 62 75 56 66 73 2d 3e 62 61 73 65  ", pRbuVfs->base
1fc30 2e 7a 4e 61 6d 65 2c 20 7a 49 6e 29 3b 0a 20 20  .zName, zIn);.  
1fc40 20 20 2a 28 63 68 61 72 2a 2a 29 70 41 72 67 20    *(char**)pArg 
1fc50 3d 20 7a 4f 75 74 3b 0a 20 20 20 20 69 66 28 20  = zOut;.    if( 
1fc60 7a 4f 75 74 3d 3d 30 20 29 20 72 63 20 3d 20 53  zOut==0 ) rc = S
1fc70 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
1fc80 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
1fc90 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1fca0 68 65 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 69  he sector-size i
1fcb0 6e 20 62 79 74 65 73 20 66 6f 72 20 61 6e 20 72  n bytes for an r
1fcc0 62 75 56 66 73 2d 66 69 6c 65 2e 0a 2a 2f 0a 73  buVfs-file..*/.s
1fcd0 74 61 74 69 63 20 69 6e 74 20 72 62 75 56 66 73  tatic int rbuVfs
1fce0 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69 74  SectorSize(sqlit
1fcf0 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 29 7b  e3_file *pFile){
1fd00 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 20 3d  .  rbu_file *p =
1fd10 20 28 72 62 75 5f 66 69 6c 65 20 2a 29 70 46 69   (rbu_file *)pFi
1fd20 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e  le;.  return p->
1fd30 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d  pReal->pMethods-
1fd40 3e 78 53 65 63 74 6f 72 53 69 7a 65 28 70 2d 3e  >xSectorSize(p->
1fd50 70 52 65 61 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pReal);.}../*.**
1fd60 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 76 69   Return the devi
1fd70 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69  ce characteristi
1fd80 63 20 66 6c 61 67 73 20 73 75 70 70 6f 72 74 65  c flags supporte
1fd90 64 20 62 79 20 61 6e 20 72 62 75 56 66 73 2d 66  d by an rbuVfs-f
1fda0 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
1fdb0 6e 74 20 72 62 75 56 66 73 44 65 76 69 63 65 43  nt rbuVfsDeviceC
1fdc0 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 73  haracteristics(s
1fdd0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
1fde0 6c 65 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20  le){.  rbu_file 
1fdf0 2a 70 20 3d 20 28 72 62 75 5f 66 69 6c 65 20 2a  *p = (rbu_file *
1fe00 29 70 46 69 6c 65 3b 0a 20 20 72 65 74 75 72 6e  )pFile;.  return
1fe10 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68   p->pReal->pMeth
1fe20 6f 64 73 2d 3e 78 44 65 76 69 63 65 43 68 61 72  ods->xDeviceChar
1fe30 61 63 74 65 72 69 73 74 69 63 73 28 70 2d 3e 70  acteristics(p->p
1fe40 52 65 61 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Real);.}../*.** 
1fe50 54 61 6b 65 20 6f 72 20 72 65 6c 65 61 73 65 20  Take or release 
1fe60 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  a shared-memory 
1fe70 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lock..*/.static 
1fe80 69 6e 74 20 72 62 75 56 66 73 53 68 6d 4c 6f 63  int rbuVfsShmLoc
1fe90 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
1fea0 70 46 69 6c 65 2c 20 69 6e 74 20 6f 66 73 74 2c  pFile, int ofst,
1feb0 20 69 6e 74 20 6e 2c 20 69 6e 74 20 66 6c 61 67   int n, int flag
1fec0 73 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a  s){.  rbu_file *
1fed0 70 20 3d 20 28 72 62 75 5f 66 69 6c 65 2a 29 70  p = (rbu_file*)p
1fee0 46 69 6c 65 3b 0a 20 20 73 71 6c 69 74 65 33 72  File;.  sqlite3r
1fef0 62 75 20 2a 70 52 62 75 20 3d 20 70 2d 3e 70 52  bu *pRbu = p->pR
1ff00 62 75 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  bu;.  int rc = S
1ff10 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 23 69 66 64 65  QLITE_OK;..#ifde
1ff20 66 20 53 51 4c 49 54 45 5f 41 4d 41 4c 47 41 4d  f SQLITE_AMALGAM
1ff30 41 54 49 4f 4e 0a 20 20 20 20 61 73 73 65 72 74  ATION.    assert
1ff40 28 20 57 41 4c 5f 43 4b 50 54 5f 4c 4f 43 4b 3d  ( WAL_CKPT_LOCK=
1ff50 3d 31 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  =1 );.#endif..  
1ff60 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 65 6e 46  assert( p->openF
1ff70 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f 4f  lags & (SQLITE_O
1ff80 50 45 4e 5f 4d 41 49 4e 5f 44 42 7c 53 51 4c 49  PEN_MAIN_DB|SQLI
1ff90 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 29  TE_OPEN_TEMP_DB)
1ffa0 20 29 3b 0a 20 20 69 66 28 20 70 52 62 75 20 26   );.  if( pRbu &
1ffb0 26 20 28 70 52 62 75 2d 3e 65 53 74 61 67 65 3d  & (pRbu->eStage=
1ffc0 3d 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20 7c  =RBU_STAGE_OAL |
1ffd0 7c 20 70 52 62 75 2d 3e 65 53 74 61 67 65 3d 3d  | pRbu->eStage==
1ffe0 52 42 55 5f 53 54 41 47 45 5f 4d 4f 56 45 29 20  RBU_STAGE_MOVE) 
1fff0 29 7b 0a 20 20 20 20 2f 2a 20 4d 61 67 69 63 20  ){.    /* Magic 
20000 6e 75 6d 62 65 72 20 31 20 69 73 20 74 68 65 20  number 1 is the 
20010 57 41 4c 5f 43 4b 50 54 5f 4c 4f 43 4b 20 6c 6f  WAL_CKPT_LOCK lo
20020 63 6b 2e 20 50 72 65 76 65 6e 74 69 6e 67 20 53  ck. Preventing S
20030 51 4c 69 74 65 20 66 72 6f 6d 0a 20 20 20 20 2a  QLite from.    *
20040 2a 20 74 61 6b 69 6e 67 20 74 68 69 73 20 6c 6f  * taking this lo
20050 63 6b 20 61 6c 73 6f 20 70 72 65 76 65 6e 74 73  ck also prevents
20060 20 61 6e 79 20 63 68 65 63 6b 70 6f 69 6e 74 73   any checkpoints
20070 20 66 72 6f 6d 20 6f 63 63 75 72 72 69 6e 67 2e   from occurring.
20080 20 0a 20 20 20 20 2a 2a 20 74 6f 64 6f 3a 20 72   .    ** todo: r
20090 65 61 6c 6c 79 2c 20 69 74 27 73 20 6e 6f 74 20  eally, it's not 
200a0 63 6c 65 61 72 20 77 68 79 20 74 68 69 73 20 6d  clear why this m
200b0 69 67 68 74 20 6f 63 63 75 72 2c 20 61 73 20 0a  ight occur, as .
200c0 20 20 20 20 2a 2a 20 77 61 6c 5f 61 75 74 6f 63      ** wal_autoc
200d0 68 65 63 6b 70 6f 69 6e 74 20 6f 75 67 68 74 20  heckpoint ought 
200e0 74 6f 20 62 65 20 74 75 72 6e 65 64 20 6f 66 66  to be turned off
200f0 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 66  .  */.    if( of
20100 73 74 3d 3d 57 41 4c 5f 4c 4f 43 4b 5f 43 4b 50  st==WAL_LOCK_CKP
20110 54 20 26 26 20 6e 3d 3d 31 20 29 20 72 63 20 3d  T && n==1 ) rc =
20120 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
20130 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 62  }else{.    int b
20140 43 61 70 74 75 72 65 20 3d 20 30 3b 0a 20 20 20  Capture = 0;.   
20150 20 69 66 28 20 6e 3d 3d 31 20 26 26 20 28 66 6c   if( n==1 && (fl
20160 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d  ags & SQLITE_SHM
20170 5f 45 58 43 4c 55 53 49 56 45 29 0a 20 20 20 20  _EXCLUSIVE).    
20180 20 26 26 20 70 52 62 75 20 26 26 20 70 52 62 75   && pRbu && pRbu
20190 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54  ->eStage==RBU_ST
201a0 41 47 45 5f 43 41 50 54 55 52 45 0a 20 20 20 20  AGE_CAPTURE.    
201b0 20 26 26 20 28 6f 66 73 74 3d 3d 57 41 4c 5f 4c   && (ofst==WAL_L
201c0 4f 43 4b 5f 57 52 49 54 45 20 7c 7c 20 6f 66 73  OCK_WRITE || ofs
201d0 74 3d 3d 57 41 4c 5f 4c 4f 43 4b 5f 43 4b 50 54  t==WAL_LOCK_CKPT
201e0 20 7c 7c 20 6f 66 73 74 3d 3d 57 41 4c 5f 4c 4f   || ofst==WAL_LO
201f0 43 4b 5f 52 45 41 44 30 29 0a 20 20 20 20 29 7b  CK_READ0).    ){
20200 0a 20 20 20 20 20 20 62 43 61 70 74 75 72 65 20  .      bCapture 
20210 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 1;.    }..    
20220 69 66 28 20 62 43 61 70 74 75 72 65 3d 3d 30 20  if( bCapture==0 
20230 7c 7c 20 30 3d 3d 28 66 6c 61 67 73 20 26 20 53  || 0==(flags & S
20240 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b  QLITE_SHM_UNLOCK
20250 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
20260 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f  p->pReal->pMetho
20270 64 73 2d 3e 78 53 68 6d 4c 6f 63 6b 28 70 2d 3e  ds->xShmLock(p->
20280 70 52 65 61 6c 2c 20 6f 66 73 74 2c 20 6e 2c 20  pReal, ofst, n, 
20290 66 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 69 66  flags);.      if
202a0 28 20 62 43 61 70 74 75 72 65 20 26 26 20 72 63  ( bCapture && rc
202b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
202c0 20 20 20 20 20 20 20 70 52 62 75 2d 3e 6d 4c 6f         pRbu->mLo
202d0 63 6b 20 7c 3d 20 28 31 20 3c 3c 20 6f 66 73 74  ck |= (1 << ofst
202e0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
202f0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
20300 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 62 74 61  c;.}../*.** Obta
20310 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  in a pointer to 
20320 61 20 6d 61 70 70 69 6e 67 20 6f 66 20 61 20 73  a mapping of a s
20330 69 6e 67 6c 65 20 33 32 4b 69 42 20 70 61 67 65  ingle 32KiB page
20340 20 6f 66 20 74 68 65 20 2a 2d 73 68 6d 20 66 69   of the *-shm fi
20350 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
20360 74 20 72 62 75 56 66 73 53 68 6d 4d 61 70 28 0a  t rbuVfsShmMap(.
20370 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
20380 70 46 69 6c 65 2c 20 0a 20 20 69 6e 74 20 69 52  pFile, .  int iR
20390 65 67 69 6f 6e 2c 20 0a 20 20 69 6e 74 20 73 7a  egion, .  int sz
203a0 52 65 67 69 6f 6e 2c 20 0a 20 20 69 6e 74 20 69  Region, .  int i
203b0 73 57 72 69 74 65 2c 20 0a 20 20 76 6f 69 64 20  sWrite, .  void 
203c0 76 6f 6c 61 74 69 6c 65 20 2a 2a 70 70 0a 29 7b  volatile **pp.){
203d0 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 20 3d  .  rbu_file *p =
203e0 20 28 72 62 75 5f 66 69 6c 65 2a 29 70 46 69 6c   (rbu_file*)pFil
203f0 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  e;.  int rc = SQ
20400 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 65  LITE_OK;.  int e
20410 53 74 61 67 65 20 3d 20 28 70 2d 3e 70 52 62 75  Stage = (p->pRbu
20420 20 3f 20 70 2d 3e 70 52 62 75 2d 3e 65 53 74 61   ? p->pRbu->eSta
20430 67 65 20 3a 20 30 29 3b 0a 0a 20 20 2f 2a 20 49  ge : 0);..  /* I
20440 66 20 6e 6f 74 20 69 6e 20 52 42 55 5f 53 54 41  f not in RBU_STA
20450 47 45 5f 4f 41 4c 2c 20 61 6c 6c 6f 77 20 74 68  GE_OAL, allow th
20460 69 73 20 63 61 6c 6c 20 74 6f 20 70 61 73 73 20  is call to pass 
20470 74 68 72 6f 75 67 68 2e 20 4f 72 2c 20 69 66 20  through. Or, if 
20480 74 68 69 73 0a 20 20 2a 2a 20 72 62 75 20 69 73  this.  ** rbu is
20490 20 69 6e 20 74 68 65 20 52 42 55 5f 53 54 41 47   in the RBU_STAG
204a0 45 5f 4f 41 4c 20 73 74 61 74 65 2c 20 75 73 65  E_OAL state, use
204b0 20 68 65 61 70 20 6d 65 6d 6f 72 79 20 66 6f 72   heap memory for
204c0 20 2a 2d 73 68 6d 20 73 70 61 63 65 20 0a 20 20   *-shm space .  
204d0 2a 2a 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20  ** instead of a 
204e0 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 20 2a  file on disk.  *
204f0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f  /.  assert( p->o
20500 70 65 6e 46 6c 61 67 73 20 26 20 28 53 51 4c 49  penFlags & (SQLI
20510 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 7c  TE_OPEN_MAIN_DB|
20520 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
20530 5f 44 42 29 20 29 3b 0a 20 20 69 66 28 20 65 53  _DB) );.  if( eS
20540 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f  tage==RBU_STAGE_
20550 4f 41 4c 20 7c 7c 20 65 53 74 61 67 65 3d 3d 52  OAL || eStage==R
20560 42 55 5f 53 54 41 47 45 5f 4d 4f 56 45 20 29 7b  BU_STAGE_MOVE ){
20570 0a 20 20 20 20 69 66 28 20 69 52 65 67 69 6f 6e  .    if( iRegion
20580 3c 3d 70 2d 3e 6e 53 68 6d 20 29 7b 0a 20 20 20  <=p->nShm ){.   
20590 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28     int nByte = (
205a0 69 52 65 67 69 6f 6e 2b 31 29 20 2a 20 73 69 7a  iRegion+1) * siz
205b0 65 6f 66 28 63 68 61 72 2a 29 3b 0a 20 20 20 20  eof(char*);.    
205c0 20 20 63 68 61 72 20 2a 2a 61 70 4e 65 77 20 3d    char **apNew =
205d0 20 28 63 68 61 72 2a 2a 29 73 71 6c 69 74 65 33   (char**)sqlite3
205e0 5f 72 65 61 6c 6c 6f 63 36 34 28 70 2d 3e 61 70  _realloc64(p->ap
205f0 53 68 6d 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  Shm, nByte);.   
20600 20 20 20 69 66 28 20 61 70 4e 65 77 3d 3d 30 20     if( apNew==0 
20610 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
20620 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
20630 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
20640 20 20 20 6d 65 6d 73 65 74 28 26 61 70 4e 65 77     memset(&apNew
20650 5b 70 2d 3e 6e 53 68 6d 5d 2c 20 30 2c 20 73 69  [p->nShm], 0, si
20660 7a 65 6f 66 28 63 68 61 72 2a 29 20 2a 20 28 31  zeof(char*) * (1
20670 20 2b 20 69 52 65 67 69 6f 6e 20 2d 20 70 2d 3e   + iRegion - p->
20680 6e 53 68 6d 29 29 3b 0a 20 20 20 20 20 20 20 20  nShm));.        
20690 70 2d 3e 61 70 53 68 6d 20 3d 20 61 70 4e 65 77  p->apShm = apNew
206a0 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 68  ;.        p->nSh
206b0 6d 20 3d 20 69 52 65 67 69 6f 6e 2b 31 3b 0a 20  m = iRegion+1;. 
206c0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
206d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
206e0 5f 4f 4b 20 26 26 20 70 2d 3e 61 70 53 68 6d 5b  _OK && p->apShm[
206f0 69 52 65 67 69 6f 6e 5d 3d 3d 30 20 29 7b 0a 20  iRegion]==0 ){. 
20700 20 20 20 20 20 63 68 61 72 20 2a 70 4e 65 77 20       char *pNew 
20710 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  = (char*)sqlite3
20720 5f 6d 61 6c 6c 6f 63 36 34 28 73 7a 52 65 67 69  _malloc64(szRegi
20730 6f 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  on);.      if( p
20740 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
20750 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
20760 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  MEM;.      }else
20770 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  {.        memset
20780 28 70 4e 65 77 2c 20 30 2c 20 73 7a 52 65 67 69  (pNew, 0, szRegi
20790 6f 6e 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  on);.        p->
207a0 61 70 53 68 6d 5b 69 52 65 67 69 6f 6e 5d 20 3d  apShm[iRegion] =
207b0 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 7d 0a 20   pNew;.      }. 
207c0 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63     }..    if( rc
207d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
207e0 20 20 20 20 20 2a 70 70 20 3d 20 70 2d 3e 61 70       *pp = p->ap
207f0 53 68 6d 5b 69 52 65 67 69 6f 6e 5d 3b 0a 20 20  Shm[iRegion];.  
20800 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a    }else{.      *
20810 70 70 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  pp = 0;.    }.  
20820 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
20830 74 28 20 70 2d 3e 61 70 53 68 6d 3d 3d 30 20 29  t( p->apShm==0 )
20840 3b 0a 20 20 20 20 72 63 20 3d 20 70 2d 3e 70 52  ;.    rc = p->pR
20850 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78  eal->pMethods->x
20860 53 68 6d 4d 61 70 28 70 2d 3e 70 52 65 61 6c 2c  ShmMap(p->pReal,
20870 20 69 52 65 67 69 6f 6e 2c 20 73 7a 52 65 67 69   iRegion, szRegi
20880 6f 6e 2c 20 69 73 57 72 69 74 65 2c 20 70 70 29  on, isWrite, pp)
20890 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
208a0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 6d  rc;.}../*.** Mem
208b0 6f 72 79 20 62 61 72 72 69 65 72 2e 0a 2a 2f 0a  ory barrier..*/.
208c0 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75 56  static void rbuV
208d0 66 73 53 68 6d 42 61 72 72 69 65 72 28 73 71 6c  fsShmBarrier(sql
208e0 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65  ite3_file *pFile
208f0 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a 70  ){.  rbu_file *p
20900 20 3d 20 28 72 62 75 5f 66 69 6c 65 20 2a 29 70   = (rbu_file *)p
20910 46 69 6c 65 3b 0a 20 20 70 2d 3e 70 52 65 61 6c  File;.  p->pReal
20920 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53 68 6d  ->pMethods->xShm
20930 42 61 72 72 69 65 72 28 70 2d 3e 70 52 65 61 6c  Barrier(p->pReal
20940 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  );.}../*.** The 
20950 78 53 68 6d 55 6e 6d 61 70 20 6d 65 74 68 6f 64  xShmUnmap method
20960 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
20970 72 62 75 56 66 73 53 68 6d 55 6e 6d 61 70 28 73  rbuVfsShmUnmap(s
20980 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
20990 6c 65 2c 20 69 6e 74 20 64 65 6c 46 6c 61 67 29  le, int delFlag)
209a0 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 20  {.  rbu_file *p 
209b0 3d 20 28 72 62 75 5f 66 69 6c 65 2a 29 70 46 69  = (rbu_file*)pFi
209c0 6c 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  le;.  int rc = S
209d0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
209e0 65 53 74 61 67 65 20 3d 20 28 70 2d 3e 70 52 62  eStage = (p->pRb
209f0 75 20 3f 20 70 2d 3e 70 52 62 75 2d 3e 65 53 74  u ? p->pRbu->eSt
20a00 61 67 65 20 3a 20 30 29 3b 0a 0a 20 20 61 73 73  age : 0);..  ass
20a10 65 72 74 28 20 70 2d 3e 6f 70 65 6e 46 6c 61 67  ert( p->openFlag
20a20 73 20 26 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e  s & (SQLITE_OPEN
20a30 5f 4d 41 49 4e 5f 44 42 7c 53 51 4c 49 54 45 5f  _MAIN_DB|SQLITE_
20a40 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 29 20 29 3b  OPEN_TEMP_DB) );
20a50 0a 20 20 69 66 28 20 65 53 74 61 67 65 3d 3d 52  .  if( eStage==R
20a60 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20 7c 7c 20  BU_STAGE_OAL || 
20a70 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47  eStage==RBU_STAG
20a80 45 5f 4d 4f 56 45 20 29 7b 0a 20 20 20 20 2f 2a  E_MOVE ){.    /*
20a90 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 7d 65 6c 73   no-op */.  }els
20aa0 65 7b 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73  e{.    /* Releas
20ab0 65 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74  e the checkpoint
20ac0 65 72 20 61 6e 64 20 77 72 69 74 65 72 20 6c 6f  er and writer lo
20ad0 63 6b 73 20 2a 2f 0a 20 20 20 20 72 62 75 55 6e  cks */.    rbuUn
20ae0 6c 6f 63 6b 53 68 6d 28 70 29 3b 0a 20 20 20 20  lockShm(p);.    
20af0 72 63 20 3d 20 70 2d 3e 70 52 65 61 6c 2d 3e 70  rc = p->pReal->p
20b00 4d 65 74 68 6f 64 73 2d 3e 78 53 68 6d 55 6e 6d  Methods->xShmUnm
20b10 61 70 28 70 2d 3e 70 52 65 61 6c 2c 20 64 65 6c  ap(p->pReal, del
20b20 46 6c 61 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Flag);.  }.  ret
20b30 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
20b40 20 47 69 76 65 6e 20 74 68 61 74 20 7a 57 61 6c   Given that zWal
20b50 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 62 75 66   points to a buf
20b60 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61  fer containing a
20b70 20 77 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 70   wal file name p
20b80 61 73 73 65 64 20 74 6f 20 0a 2a 2a 20 65 69 74  assed to .** eit
20b90 68 65 72 20 74 68 65 20 78 4f 70 65 6e 28 29 20  her the xOpen() 
20ba0 6f 72 20 78 41 63 63 65 73 73 28 29 20 56 46 53  or xAccess() VFS
20bb0 20 6d 65 74 68 6f 64 2c 20 72 65 74 75 72 6e 20   method, return 
20bc0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
20bd0 0a 2a 2a 20 66 69 6c 65 2d 68 61 6e 64 6c 65 20  .** file-handle 
20be0 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20 73 61  opened by the sa
20bf0 6d 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  me database conn
20c00 65 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 63 6f  ection on the co
20c10 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 64  rresponding.** d
20c20 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f  atabase file..*/
20c30 0a 73 74 61 74 69 63 20 72 62 75 5f 66 69 6c 65  .static rbu_file
20c40 20 2a 72 62 75 46 69 6e 64 4d 61 69 6e 64 62 28   *rbuFindMaindb(
20c50 72 62 75 5f 76 66 73 20 2a 70 52 62 75 56 66 73  rbu_vfs *pRbuVfs
20c60 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 57  , const char *zW
20c70 61 6c 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20  al){.  rbu_file 
20c80 2a 70 44 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f  *pDb;.  sqlite3_
20c90 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 52 62 75  mutex_enter(pRbu
20ca0 56 66 73 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 66  Vfs->mutex);.  f
20cb0 6f 72 28 70 44 62 3d 70 52 62 75 56 66 73 2d 3e  or(pDb=pRbuVfs->
20cc0 70 4d 61 69 6e 3b 20 70 44 62 20 26 26 20 70 44  pMain; pDb && pD
20cd0 62 2d 3e 7a 57 61 6c 21 3d 7a 57 61 6c 3b 20 70  b->zWal!=zWal; p
20ce0 44 62 3d 70 44 62 2d 3e 70 4d 61 69 6e 4e 65 78  Db=pDb->pMainNex
20cf0 74 29 7b 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  t){}.  sqlite3_m
20d00 75 74 65 78 5f 6c 65 61 76 65 28 70 52 62 75 56  utex_leave(pRbuV
20d10 66 73 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  fs->mutex);.  re
20d20 74 75 72 6e 20 70 44 62 3b 0a 7d 0a 0a 2f 2a 20  turn pDb;.}../* 
20d30 0a 2a 2a 20 41 20 6d 61 69 6e 20 64 61 74 61 62  .** A main datab
20d40 61 73 65 20 6e 61 6d 65 64 20 7a 4e 61 6d 65 20  ase named zName 
20d50 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 6f 70  has just been op
20d60 65 6e 65 64 2e 20 54 68 65 20 66 6f 6c 6c 6f 77  ened. The follow
20d70 69 6e 67 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  ing .** function
20d80 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74   returns a point
20d90 65 72 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f  er to a buffer o
20da0 77 6e 65 64 20 62 79 20 53 51 4c 69 74 65 20 74  wned by SQLite t
20db0 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20  hat contains.** 
20dc0 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
20dd0 2a 2d 77 61 6c 20 66 69 6c 65 20 74 68 69 73 20  *-wal file this 
20de0 64 62 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69  db connection wi
20df0 6c 6c 20 75 73 65 2e 20 53 51 4c 69 74 65 0a 2a  ll use. SQLite.*
20e00 2a 20 68 61 70 70 65 6e 73 20 74 6f 20 70 61 73  * happens to pas
20e10 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
20e20 68 69 73 20 62 75 66 66 65 72 20 77 68 65 6e 20  his buffer when 
20e30 75 73 69 6e 67 20 78 41 63 63 65 73 73 28 29 0a  using xAccess().
20e40 2a 2a 20 6f 72 20 78 4f 70 65 6e 28 29 20 74 6f  ** or xOpen() to
20e50 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20   operate on the 
20e60 2a 2d 77 61 6c 20 66 69 6c 65 2e 20 20 0a 2a 2f  *-wal file.  .*/
20e70 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
20e80 61 72 20 2a 72 62 75 4d 61 69 6e 54 6f 57 61 6c  ar *rbuMainToWal
20e90 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61  (const char *zNa
20ea0 6d 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  me, int flags){.
20eb0 20 20 69 6e 74 20 6e 20 3d 20 28 69 6e 74 29 73    int n = (int)s
20ec0 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20  trlen(zName);.  
20ed0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
20ee0 26 7a 4e 61 6d 65 5b 6e 5d 3b 0a 20 20 69 66 28  &zName[n];.  if(
20ef0 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f   flags & SQLITE_
20f00 4f 50 45 4e 5f 55 52 49 20 29 7b 0a 20 20 20 20  OPEN_URI ){.    
20f10 69 6e 74 20 6f 64 64 20 3d 20 30 3b 0a 20 20 20  int odd = 0;.   
20f20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20   while( 1 ){.   
20f30 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 30 20 29     if( z[0]==0 )
20f40 7b 0a 20 20 20 20 20 20 20 20 6f 64 64 20 3d 20  {.        odd = 
20f50 31 20 2d 20 6f 64 64 3b 0a 20 20 20 20 20 20 20  1 - odd;.       
20f60 20 69 66 28 20 6f 64 64 20 26 26 20 7a 5b 31 5d   if( odd && z[1]
20f70 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
20f80 20 20 20 7d 0a 20 20 20 20 20 20 7a 2b 2b 3b 0a     }.      z++;.
20f90 20 20 20 20 7d 0a 20 20 20 20 7a 20 2b 3d 20 32      }.    z += 2
20fa0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77  ;.  }else{.    w
20fb0 68 69 6c 65 28 20 2a 7a 3d 3d 30 20 29 20 7a 2b  hile( *z==0 ) z+
20fc0 2b 3b 0a 20 20 7d 0a 20 20 7a 20 2b 3d 20 28 6e  +;.  }.  z += (n
20fd0 20 2b 20 38 20 2b 20 31 29 3b 0a 20 20 72 65 74   + 8 + 1);.  ret
20fe0 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn z;.}../*.** 
20ff0 4f 70 65 6e 20 61 6e 20 72 62 75 20 66 69 6c 65  Open an rbu file
21000 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74   handle..*/.stat
21010 69 63 20 69 6e 74 20 72 62 75 56 66 73 4f 70 65  ic int rbuVfsOpe
21020 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  n(.  sqlite3_vfs
21030 20 2a 70 56 66 73 2c 0a 20 20 63 6f 6e 73 74 20   *pVfs,.  const 
21040 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20 73  char *zName,.  s
21050 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
21060 6c 65 2c 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c  le,.  int flags,
21070 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46 6c 61 67  .  int *pOutFlag
21080 73 0a 29 7b 0a 20 20 73 74 61 74 69 63 20 73 71  s.){.  static sq
21090 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
210a0 20 72 62 75 76 66 73 5f 69 6f 5f 6d 65 74 68 6f   rbuvfs_io_metho
210b0 64 73 20 3d 20 7b 0a 20 20 20 20 32 2c 20 20 20  ds = {.    2,   
210c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
210d0 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72           /* iVer
210e0 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 72 62 75 56  sion */.    rbuV
210f0 66 73 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  fsClose,        
21100 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
21110 6f 73 65 20 2a 2f 0a 20 20 20 20 72 62 75 56 66  ose */.    rbuVf
21120 73 52 65 61 64 2c 20 20 20 20 20 20 20 20 20 20  sRead,          
21130 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65 61           /* xRea
21140 64 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 57  d */.    rbuVfsW
21150 72 69 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  rite,           
21160 20 20 20 20 20 20 20 2f 2a 20 78 57 72 69 74 65         /* xWrite
21170 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 54 72   */.    rbuVfsTr
21180 75 6e 63 61 74 65 2c 20 20 20 20 20 20 20 20 20  uncate,         
21190 20 20 20 20 20 20 2f 2a 20 78 54 72 75 6e 63 61        /* xTrunca
211a0 74 65 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73  te */.    rbuVfs
211b0 53 79 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20  Sync,           
211c0 20 20 20 20 20 20 20 20 2f 2a 20 78 53 79 6e 63          /* xSync
211d0 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 46 69   */.    rbuVfsFi
211e0 6c 65 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20  leSize,         
211f0 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 53 69        /* xFileSi
21200 7a 65 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73  ze */.    rbuVfs
21210 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
21220 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b          /* xLock
21230 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 55 6e   */.    rbuVfsUn
21240 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  lock,           
21250 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
21260 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 43 68   */.    rbuVfsCh
21270 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c  eckReservedLock,
21280 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52        /* xCheckR
21290 65 73 65 72 76 65 64 4c 6f 63 6b 20 2a 2f 0a 20  eservedLock */. 
212a0 20 20 20 72 62 75 56 66 73 46 69 6c 65 43 6f 6e     rbuVfsFileCon
212b0 74 72 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20  trol,           
212c0 20 2f 2a 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c   /* xFileControl
212d0 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 53 65   */.    rbuVfsSe
212e0 63 74 6f 72 53 69 7a 65 2c 20 20 20 20 20 20 20  ctorSize,       
212f0 20 20 20 20 20 20 2f 2a 20 78 53 65 63 74 6f 72        /* xSector
21300 53 69 7a 65 20 2a 2f 0a 20 20 20 20 72 62 75 56  Size */.    rbuV
21310 66 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  fsDeviceCharacte
21320 72 69 73 74 69 63 73 2c 20 20 2f 2a 20 78 44 65  ristics,  /* xDe
21330 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
21340 69 63 73 20 2a 2f 0a 20 20 20 20 72 62 75 56 66  ics */.    rbuVf
21350 73 53 68 6d 4d 61 70 2c 20 20 20 20 20 20 20 20  sShmMap,        
21360 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
21370 4d 61 70 20 2a 2f 0a 20 20 20 20 72 62 75 56 66  Map */.    rbuVf
21380 73 53 68 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20  sShmLock,       
21390 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
213a0 4c 6f 63 6b 20 2a 2f 0a 20 20 20 20 72 62 75 56  Lock */.    rbuV
213b0 66 73 53 68 6d 42 61 72 72 69 65 72 2c 20 20 20  fsShmBarrier,   
213c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
213d0 6d 42 61 72 72 69 65 72 20 2a 2f 0a 20 20 20 20  mBarrier */.    
213e0 72 62 75 56 66 73 53 68 6d 55 6e 6d 61 70 2c 20  rbuVfsShmUnmap, 
213f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21400 20 78 53 68 6d 55 6e 6d 61 70 20 2a 2f 0a 20 20   xShmUnmap */.  
21410 20 20 30 2c 20 30 20 20 20 20 20 20 20 20 20 20    0, 0          
21420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21430 2f 2a 20 78 46 65 74 63 68 2c 20 78 55 6e 66 65  /* xFetch, xUnfe
21440 74 63 68 20 2a 2f 0a 20 20 7d 3b 0a 20 20 72 62  tch */.  };.  rb
21450 75 5f 76 66 73 20 2a 70 52 62 75 56 66 73 20 3d  u_vfs *pRbuVfs =
21460 20 28 72 62 75 5f 76 66 73 2a 29 70 56 66 73 3b   (rbu_vfs*)pVfs;
21470 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
21480 70 52 65 61 6c 56 66 73 20 3d 20 70 52 62 75 56  pRealVfs = pRbuV
21490 66 73 2d 3e 70 52 65 61 6c 56 66 73 3b 0a 20 20  fs->pRealVfs;.  
214a0 72 62 75 5f 66 69 6c 65 20 2a 70 46 64 20 3d 20  rbu_file *pFd = 
214b0 28 72 62 75 5f 66 69 6c 65 20 2a 29 70 46 69 6c  (rbu_file *)pFil
214c0 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  e;.  int rc = SQ
214d0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63 6f 6e 73 74  LITE_OK;.  const
214e0 20 63 68 61 72 20 2a 7a 4f 70 65 6e 20 3d 20 7a   char *zOpen = z
214f0 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 6f 66 6c 61  Name;.  int ofla
21500 67 73 20 3d 20 66 6c 61 67 73 3b 0a 0a 20 20 6d  gs = flags;..  m
21510 65 6d 73 65 74 28 70 46 64 2c 20 30 2c 20 73 69  emset(pFd, 0, si
21520 7a 65 6f 66 28 72 62 75 5f 66 69 6c 65 29 29 3b  zeof(rbu_file));
21530 0a 20 20 70 46 64 2d 3e 70 52 65 61 6c 20 3d 20  .  pFd->pReal = 
21540 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 26  (sqlite3_file*)&
21550 70 46 64 5b 31 5d 3b 0a 20 20 70 46 64 2d 3e 70  pFd[1];.  pFd->p
21560 52 62 75 56 66 73 20 3d 20 70 52 62 75 56 66 73  RbuVfs = pRbuVfs
21570 3b 0a 20 20 70 46 64 2d 3e 6f 70 65 6e 46 6c 61  ;.  pFd->openFla
21580 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 69 66  gs = flags;.  if
21590 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 69  ( zName ){.    i
215a0 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54  f( flags & SQLIT
215b0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29  E_OPEN_MAIN_DB )
215c0 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 6d 61 69  {.      /* A mai
215d0 6e 20 64 61 74 61 62 61 73 65 20 68 61 73 20 6a  n database has j
215e0 75 73 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e  ust been opened.
215f0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
21600 6c 6f 63 6b 20 73 65 74 73 0a 20 20 20 20 20 20  lock sets.      
21610 2a 2a 20 28 70 46 64 2d 3e 7a 57 61 6c 29 20 74  ** (pFd->zWal) t
21620 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66  o point to a buf
21630 66 65 72 20 6f 77 6e 65 64 20 62 79 20 53 51 4c  fer owned by SQL
21640 69 74 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ite that contain
21650 73 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6e  s.      ** the n
21660 61 6d 65 20 6f 66 20 74 68 65 20 2a 2d 77 61 6c  ame of the *-wal
21670 20 66 69 6c 65 20 74 68 69 73 20 64 62 20 63 6f   file this db co
21680 6e 6e 65 63 74 69 6f 6e 20 77 69 6c 6c 20 75 73  nnection will us
21690 65 2e 20 53 51 4c 69 74 65 0a 20 20 20 20 20 20  e. SQLite.      
216a0 2a 2a 20 68 61 70 70 65 6e 73 20 74 6f 20 70 61  ** happens to pa
216b0 73 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ss a pointer to 
216c0 74 68 69 73 20 62 75 66 66 65 72 20 77 68 65 6e  this buffer when
216d0 20 75 73 69 6e 67 20 78 41 63 63 65 73 73 28 29   using xAccess()
216e0 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 78 4f 70  .      ** or xOp
216f0 65 6e 28 29 20 74 6f 20 6f 70 65 72 61 74 65 20  en() to operate 
21700 6f 6e 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c  on the *-wal fil
21710 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 70 46 64  e.  */.      pFd
21720 2d 3e 7a 57 61 6c 20 3d 20 72 62 75 4d 61 69 6e  ->zWal = rbuMain
21730 54 6f 57 61 6c 28 7a 4e 61 6d 65 2c 20 66 6c 61  ToWal(zName, fla
21740 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65  gs);.    }.    e
21750 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20  lse if( flags & 
21760 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20  SQLITE_OPEN_WAL 
21770 29 7b 0a 20 20 20 20 20 20 72 62 75 5f 66 69 6c  ){.      rbu_fil
21780 65 20 2a 70 44 62 20 3d 20 72 62 75 46 69 6e 64  e *pDb = rbuFind
21790 4d 61 69 6e 64 62 28 70 52 62 75 56 66 73 2c 20  Maindb(pRbuVfs, 
217a0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66  zName);.      if
217b0 28 20 70 44 62 20 29 7b 0a 20 20 20 20 20 20 20  ( pDb ){.       
217c0 20 69 66 28 20 70 44 62 2d 3e 70 52 62 75 20 26   if( pDb->pRbu &
217d0 26 20 70 44 62 2d 3e 70 52 62 75 2d 3e 65 53 74  & pDb->pRbu->eSt
217e0 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4f  age==RBU_STAGE_O
217f0 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  AL ){.          
21800 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 69 73 20  /* This call is 
21810 74 6f 20 6f 70 65 6e 20 61 20 2a 2d 77 61 6c 20  to open a *-wal 
21820 66 69 6c 65 2e 20 49 6e 74 65 61 64 2c 20 6f 70  file. Intead, op
21830 65 6e 20 74 68 65 20 2a 2d 6f 61 6c 2e 20 54 68  en the *-oal. Th
21840 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  is.          ** 
21850 63 6f 64 65 20 65 6e 73 75 72 65 73 20 74 68 61  code ensures tha
21860 74 20 74 68 65 20 73 74 72 69 6e 67 20 70 61 73  t the string pas
21870 73 65 64 20 74 6f 20 78 4f 70 65 6e 28 29 20 69  sed to xOpen() i
21880 73 20 74 65 72 6d 69 6e 61 74 65 64 20 62 79 20  s terminated by 
21890 61 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70  a.          ** p
218a0 61 69 72 20 6f 66 20 27 5c 30 27 20 62 79 74 65  air of '\0' byte
218b0 73 20 69 6e 20 63 61 73 65 20 74 68 65 20 56 46  s in case the VF
218c0 53 20 61 74 74 65 6d 70 74 73 20 74 6f 20 65 78  S attempts to ex
218d0 74 72 61 63 74 20 61 20 55 52 49 20 0a 20 20 20  tract a URI .   
218e0 20 20 20 20 20 20 20 2a 2a 20 70 61 72 61 6d 65         ** parame
218f0 74 65 72 20 66 72 6f 6d 20 69 74 2e 20 20 2a 2f  ter from it.  */
21900 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74  .          const
21910 20 63 68 61 72 20 2a 7a 42 61 73 65 20 3d 20 7a   char *zBase = z
21920 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Name;.          
21930 73 69 7a 65 5f 74 20 6e 43 6f 70 79 3b 0a 20 20  size_t nCopy;.  
21940 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43          char *zC
21950 6f 70 79 3b 0a 20 20 20 20 20 20 20 20 20 20 69  opy;.          i
21960 66 28 20 72 62 75 49 73 56 61 63 75 75 6d 28 70  f( rbuIsVacuum(p
21970 44 62 2d 3e 70 52 62 75 29 20 29 7b 0a 20 20 20  Db->pRbu) ){.   
21980 20 20 20 20 20 20 20 20 20 7a 42 61 73 65 20 3d           zBase =
21990 20 73 71 6c 69 74 65 33 5f 64 62 5f 66 69 6c 65   sqlite3_db_file
219a0 6e 61 6d 65 28 70 44 62 2d 3e 70 52 62 75 2d 3e  name(pDb->pRbu->
219b0 64 62 52 62 75 2c 20 22 6d 61 69 6e 22 29 3b 0a  dbRbu, "main");.
219c0 20 20 20 20 20 20 20 20 20 20 20 20 7a 42 61 73              zBas
219d0 65 20 3d 20 72 62 75 4d 61 69 6e 54 6f 57 61 6c  e = rbuMainToWal
219e0 28 7a 42 61 73 65 2c 20 53 51 4c 49 54 45 5f 4f  (zBase, SQLITE_O
219f0 50 45 4e 5f 55 52 49 29 3b 0a 20 20 20 20 20 20  PEN_URI);.      
21a00 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
21a10 6e 43 6f 70 79 20 3d 20 73 74 72 6c 65 6e 28 7a  nCopy = strlen(z
21a20 42 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Base);.         
21a30 20 7a 43 6f 70 79 20 3d 20 73 71 6c 69 74 65 33   zCopy = sqlite3
21a40 5f 6d 61 6c 6c 6f 63 36 34 28 6e 43 6f 70 79 2b  _malloc64(nCopy+
21a50 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  2);.          if
21a60 28 20 7a 43 6f 70 79 20 29 7b 0a 20 20 20 20 20  ( zCopy ){.     
21a70 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 43         memcpy(zC
21a80 6f 70 79 2c 20 7a 42 61 73 65 2c 20 6e 43 6f 70  opy, zBase, nCop
21a90 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  y);.            
21aa0 7a 43 6f 70 79 5b 6e 43 6f 70 79 2d 33 5d 20 3d  zCopy[nCopy-3] =
21ab0 20 27 6f 27 3b 0a 20 20 20 20 20 20 20 20 20 20   'o';.          
21ac0 20 20 7a 43 6f 70 79 5b 6e 43 6f 70 79 5d 20 3d    zCopy[nCopy] =
21ad0 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20 20   '\0';.         
21ae0 20 20 20 7a 43 6f 70 79 5b 6e 43 6f 70 79 2b 31     zCopy[nCopy+1
21af0 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20  ] = '\0';.      
21b00 20 20 20 20 20 20 7a 4f 70 65 6e 20 3d 20 28 63        zOpen = (c
21b10 6f 6e 73 74 20 63 68 61 72 2a 29 28 70 46 64 2d  onst char*)(pFd-
21b20 3e 7a 44 65 6c 20 3d 20 7a 43 6f 70 79 29 3b 0a  >zDel = zCopy);.
21b30 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
21b40 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
21b50 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
21b60 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
21b70 20 20 20 20 20 20 70 46 64 2d 3e 70 52 62 75 20        pFd->pRbu 
21b80 3d 20 70 44 62 2d 3e 70 52 62 75 3b 0a 20 20 20  = pDb->pRbu;.   
21b90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
21ba0 44 62 2d 3e 70 57 61 6c 46 64 20 3d 20 70 46 64  Db->pWalFd = pFd
21bb0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
21bc0 20 20 7d 0a 0a 20 20 69 66 28 20 6f 66 6c 61 67    }..  if( oflag
21bd0 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
21be0 4d 41 49 4e 5f 44 42 20 0a 20 20 20 26 26 20 73  MAIN_DB .   && s
21bf0 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65  qlite3_uri_boole
21c00 61 6e 28 7a 4e 61 6d 65 2c 20 22 72 62 75 5f 6d  an(zName, "rbu_m
21c10 65 6d 6f 72 79 22 2c 20 30 29 20 0a 20 20 29 7b  emory", 0) .  ){
21c20 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 66 6c  .    assert( ofl
21c30 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
21c40 4e 5f 4d 41 49 4e 5f 44 42 20 29 3b 0a 20 20 20  N_MAIN_DB );.   
21c50 20 6f 66 6c 61 67 73 20 3d 20 20 53 51 4c 49 54   oflags =  SQLIT
21c60 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20 7c  E_OPEN_TEMP_DB |
21c70 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
21c80 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f  DWRITE | SQLITE_
21c90 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20  OPEN_CREATE |.  
21ca0 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
21cb0 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56  TE_OPEN_EXCLUSIV
21cc0 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
21cd0 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20  DELETEONCLOSE;. 
21ce0 20 20 20 7a 4f 70 65 6e 20 3d 20 30 3b 0a 20 20     zOpen = 0;.  
21cf0 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  }..  if( rc==SQL
21d00 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
21d10 20 3d 20 70 52 65 61 6c 56 66 73 2d 3e 78 4f 70   = pRealVfs->xOp
21d20 65 6e 28 70 52 65 61 6c 56 66 73 2c 20 7a 4f 70  en(pRealVfs, zOp
21d30 65 6e 2c 20 70 46 64 2d 3e 70 52 65 61 6c 2c 20  en, pFd->pReal, 
21d40 6f 66 6c 61 67 73 2c 20 70 4f 75 74 46 6c 61 67  oflags, pOutFlag
21d50 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 46  s);.  }.  if( pF
21d60 64 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f  d->pReal->pMetho
21d70 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  ds ){.    /* The
21d80 20 78 4f 70 65 6e 28 29 20 6f 70 65 72 61 74 69   xOpen() operati
21d90 6f 6e 20 68 61 73 20 73 75 63 63 65 65 64 65 64  on has succeeded
21da0 2e 20 53 65 74 20 74 68 65 20 73 71 6c 69 74 65  . Set the sqlite
21db0 33 5f 66 69 6c 65 2e 70 4d 65 74 68 6f 64 73 0a  3_file.pMethods.
21dc0 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 61      ** pointer a
21dd0 6e 64 2c 20 69 66 20 74 68 65 20 66 69 6c 65 20  nd, if the file 
21de0 69 73 20 61 20 6d 61 69 6e 20 64 61 74 61 62 61  is a main databa
21df0 73 65 20 66 69 6c 65 2c 20 6c 69 6e 6b 20 69 74  se file, link it
21e00 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a   into the.    **
21e10 20 6d 75 74 65 78 20 70 72 6f 74 65 63 74 65 64   mutex protected
21e20 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   linked list of 
21e30 61 6c 6c 20 73 75 63 68 20 66 69 6c 65 73 2e 20  all such files. 
21e40 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70   */.    pFile->p
21e50 4d 65 74 68 6f 64 73 20 3d 20 26 72 62 75 76 66  Methods = &rbuvf
21e60 73 5f 69 6f 5f 6d 65 74 68 6f 64 73 3b 0a 20 20  s_io_methods;.  
21e70 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51    if( flags & SQ
21e80 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
21e90 42 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  B ){.      sqlit
21ea0 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
21eb0 52 62 75 56 66 73 2d 3e 6d 75 74 65 78 29 3b 0a  RbuVfs->mutex);.
21ec0 20 20 20 20 20 20 70 46 64 2d 3e 70 4d 61 69 6e        pFd->pMain
21ed0 4e 65 78 74 20 3d 20 70 52 62 75 56 66 73 2d 3e  Next = pRbuVfs->
21ee0 70 4d 61 69 6e 3b 0a 20 20 20 20 20 20 70 52 62  pMain;.      pRb
21ef0 75 56 66 73 2d 3e 70 4d 61 69 6e 20 3d 20 70 46  uVfs->pMain = pF
21f00 64 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  d;.      sqlite3
21f10 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 52 62  _mutex_leave(pRb
21f20 75 56 66 73 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  uVfs->mutex);.  
21f30 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
21f40 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46   sqlite3_free(pF
21f50 64 2d 3e 7a 44 65 6c 29 3b 0a 20 20 7d 0a 0a 20  d->zDel);.  }.. 
21f60 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
21f70 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20  *.** Delete the 
21f80 66 69 6c 65 20 6c 6f 63 61 74 65 64 20 61 74 20  file located at 
21f90 7a 50 61 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63  zPath..*/.static
21fa0 20 69 6e 74 20 72 62 75 56 66 73 44 65 6c 65 74   int rbuVfsDelet
21fb0 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  e(sqlite3_vfs *p
21fc0 56 66 73 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  Vfs, const char 
21fd0 2a 7a 50 61 74 68 2c 20 69 6e 74 20 64 69 72 53  *zPath, int dirS
21fe0 79 6e 63 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  ync){.  sqlite3_
21ff0 76 66 73 20 2a 70 52 65 61 6c 56 66 73 20 3d 20  vfs *pRealVfs = 
22000 28 28 72 62 75 5f 76 66 73 2a 29 70 56 66 73 29  ((rbu_vfs*)pVfs)
22010 2d 3e 70 52 65 61 6c 56 66 73 3b 0a 20 20 72 65  ->pRealVfs;.  re
22020 74 75 72 6e 20 70 52 65 61 6c 56 66 73 2d 3e 78  turn pRealVfs->x
22030 44 65 6c 65 74 65 28 70 52 65 61 6c 56 66 73 2c  Delete(pRealVfs,
22040 20 7a 50 61 74 68 2c 20 64 69 72 53 79 6e 63 29   zPath, dirSync)
22050 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20  ;.}../*.** Test 
22060 66 6f 72 20 61 63 63 65 73 73 20 70 65 72 6d 69  for access permi
22070 73 73 69 6f 6e 73 2e 20 52 65 74 75 72 6e 20 74  ssions. Return t
22080 72 75 65 20 69 66 20 74 68 65 20 72 65 71 75 65  rue if the reque
22090 73 74 65 64 20 70 65 72 6d 69 73 73 69 6f 6e 0a  sted permission.
220a0 2a 2a 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c  ** is available,
220b0 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77   or false otherw
220c0 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ise..*/.static i
220d0 6e 74 20 72 62 75 56 66 73 41 63 63 65 73 73 28  nt rbuVfsAccess(
220e0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
220f0 70 56 66 73 2c 20 0a 20 20 63 6f 6e 73 74 20 63  pVfs, .  const c
22100 68 61 72 20 2a 7a 50 61 74 68 2c 20 0a 20 20 69  har *zPath, .  i
22110 6e 74 20 66 6c 61 67 73 2c 20 0a 20 20 69 6e 74  nt flags, .  int
22120 20 2a 70 52 65 73 4f 75 74 0a 29 7b 0a 20 20 72   *pResOut.){.  r
22130 62 75 5f 76 66 73 20 2a 70 52 62 75 56 66 73 20  bu_vfs *pRbuVfs 
22140 3d 20 28 72 62 75 5f 76 66 73 2a 29 70 56 66 73  = (rbu_vfs*)pVfs
22150 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  ;.  sqlite3_vfs 
22160 2a 70 52 65 61 6c 56 66 73 20 3d 20 70 52 62 75  *pRealVfs = pRbu
22170 56 66 73 2d 3e 70 52 65 61 6c 56 66 73 3b 0a 20  Vfs->pRealVfs;. 
22180 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d   int rc;..  rc =
22190 20 70 52 65 61 6c 56 66 73 2d 3e 78 41 63 63 65   pRealVfs->xAcce
221a0 73 73 28 70 52 65 61 6c 56 66 73 2c 20 7a 50 61  ss(pRealVfs, zPa
221b0 74 68 2c 20 66 6c 61 67 73 2c 20 70 52 65 73 4f  th, flags, pResO
221c0 75 74 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ut);..  /* If th
221d0 69 73 20 63 61 6c 6c 20 69 73 20 74 6f 20 63 68  is call is to ch
221e0 65 63 6b 20 69 66 20 61 20 2a 2d 77 61 6c 20 66  eck if a *-wal f
221f0 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ile associated w
22200 69 74 68 20 61 6e 20 52 42 55 20 74 61 72 67 65  ith an RBU targe
22210 74 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20  t.  ** database 
22220 63 6f 6e 6e 65 63 74 69 6f 6e 20 65 78 69 73 74  connection exist
22230 73 2c 20 61 6e 64 20 74 68 65 20 52 42 55 20 75  s, and the RBU u
22240 70 64 61 74 65 20 69 73 20 69 6e 20 52 42 55 5f  pdate is in RBU_
22250 53 54 41 47 45 5f 4f 41 4c 2c 0a 20 20 2a 2a 20  STAGE_OAL,.  ** 
22260 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 70  the following sp
22270 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67 20 69  ecial handling i
22280 73 20 61 63 74 69 76 61 74 65 64 3a 0a 20 20 2a  s activated:.  *
22290 2a 0a 20 20 2a 2a 20 20 20 61 29 20 69 66 20 74  *.  **   a) if t
222a0 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 64 6f  he *-wal file do
222b0 65 73 20 65 78 69 73 74 2c 20 72 65 74 75 72 6e  es exist, return
222c0 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
222d0 2e 20 54 68 69 73 0a 20 20 2a 2a 20 20 20 20 20  . This.  **     
222e0 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 74 68   ensures that th
222f0 65 20 52 42 55 20 65 78 74 65 6e 73 69 6f 6e 20  e RBU extension 
22300 6e 65 76 65 72 20 74 72 69 65 73 20 74 6f 20 75  never tries to u
22310 70 64 61 74 65 20 61 20 64 61 74 61 62 61 73 65  pdate a database
22320 0a 20 20 2a 2a 20 20 20 20 20 20 69 6e 20 77 61  .  **      in wa
22330 6c 20 6d 6f 64 65 2c 20 65 76 65 6e 20 69 66 20  l mode, even if 
22340 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
22350 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
22360 69 6c 65 20 68 61 73 0a 20 20 2a 2a 20 20 20 20  ile has.  **    
22370 20 20 62 65 65 6e 20 64 61 6d 61 67 65 64 2e 20    been damaged. 
22380 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 62 29 20  .  **.  **   b) 
22390 69 66 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c  if the *-wal fil
223a0 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  e does not exist
223b0 2c 20 63 6c 61 69 6d 20 74 68 61 74 20 69 74 20  , claim that it 
223c0 64 6f 65 73 20 61 6e 79 77 61 79 2c 0a 20 20 2a  does anyway,.  *
223d0 2a 20 20 20 20 20 20 63 61 75 73 69 6e 67 20 53  *      causing S
223e0 51 4c 69 74 65 20 74 6f 20 63 61 6c 6c 20 78 4f  QLite to call xO
223f0 70 65 6e 28 29 20 74 6f 20 6f 70 65 6e 20 69 74  pen() to open it
22400 2e 20 54 68 69 73 20 63 61 6c 6c 20 77 69 6c 6c  . This call will
22410 20 61 6c 73 6f 0a 20 20 2a 2a 20 20 20 20 20 20   also.  **      
22420 62 65 20 69 6e 74 65 72 63 65 70 74 65 64 20 28  be intercepted (
22430 73 65 65 20 74 68 65 20 72 62 75 56 66 73 4f 70  see the rbuVfsOp
22440 65 6e 28 29 20 66 75 6e 63 74 69 6f 6e 29 20 61  en() function) a
22450 6e 64 20 74 68 65 20 2a 2d 6f 61 6c 0a 20 20 2a  nd the *-oal.  *
22460 2a 20 20 20 20 20 20 66 69 6c 65 20 6f 70 65 6e  *      file open
22470 65 64 20 69 6e 73 74 65 61 64 2e 0a 20 20 2a 2f  ed instead..  */
22480 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
22490 45 5f 4f 4b 20 26 26 20 66 6c 61 67 73 3d 3d 53  E_OK && flags==S
224a0 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
224b0 53 54 53 20 29 7b 0a 20 20 20 20 72 62 75 5f 66  STS ){.    rbu_f
224c0 69 6c 65 20 2a 70 44 62 20 3d 20 72 62 75 46 69  ile *pDb = rbuFi
224d0 6e 64 4d 61 69 6e 64 62 28 70 52 62 75 56 66 73  ndMaindb(pRbuVfs
224e0 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20 20 69 66  , zPath);.    if
224f0 28 20 70 44 62 20 26 26 20 70 44 62 2d 3e 70 52  ( pDb && pDb->pR
22500 62 75 20 26 26 20 70 44 62 2d 3e 70 52 62 75 2d  bu && pDb->pRbu-
22510 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41  >eStage==RBU_STA
22520 47 45 5f 4f 41 4c 20 29 7b 0a 20 20 20 20 20 20  GE_OAL ){.      
22530 69 66 28 20 2a 70 52 65 73 4f 75 74 20 29 7b 0a  if( *pResOut ){.
22540 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
22550 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20  ITE_CANTOPEN;.  
22560 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
22570 20 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 31 3b     *pResOut = 1;
22580 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
22590 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
225a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 75 6c 61  .}../*.** Popula
225b0 74 65 20 62 75 66 66 65 72 20 7a 4f 75 74 20 77  te buffer zOut w
225c0 69 74 68 20 74 68 65 20 66 75 6c 6c 20 63 61 6e  ith the full can
225d0 6f 6e 69 63 61 6c 20 70 61 74 68 6e 61 6d 65 20  onical pathname 
225e0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a  corresponding.**
225f0 20 74 6f 20 74 68 65 20 70 61 74 68 6e 61 6d 65   to the pathname
22600 20 69 6e 20 7a 50 61 74 68 2e 20 7a 4f 75 74 20   in zPath. zOut 
22610 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
22620 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66   point to a buff
22630 65 72 0a 2a 2a 20 6f 66 20 61 74 20 6c 65 61 73  er.** of at leas
22640 74 20 28 44 45 56 53 59 4d 5f 4d 41 58 5f 50 41  t (DEVSYM_MAX_PA
22650 54 48 4e 41 4d 45 2b 31 29 20 62 79 74 65 73 2e  THNAME+1) bytes.
22660 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
22670 62 75 56 66 73 46 75 6c 6c 50 61 74 68 6e 61 6d  buVfsFullPathnam
22680 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  e(.  sqlite3_vfs
22690 20 2a 70 56 66 73 2c 20 0a 20 20 63 6f 6e 73 74   *pVfs, .  const
226a0 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 0a 20   char *zPath, . 
226b0 20 69 6e 74 20 6e 4f 75 74 2c 20 0a 20 20 63 68   int nOut, .  ch
226c0 61 72 20 2a 7a 4f 75 74 0a 29 7b 0a 20 20 73 71  ar *zOut.){.  sq
226d0 6c 69 74 65 33 5f 76 66 73 20 2a 70 52 65 61 6c  lite3_vfs *pReal
226e0 56 66 73 20 3d 20 28 28 72 62 75 5f 76 66 73 2a  Vfs = ((rbu_vfs*
226f0 29 70 56 66 73 29 2d 3e 70 52 65 61 6c 56 66 73  )pVfs)->pRealVfs
22700 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65 61 6c  ;.  return pReal
22710 56 66 73 2d 3e 78 46 75 6c 6c 50 61 74 68 6e 61  Vfs->xFullPathna
22720 6d 65 28 70 52 65 61 6c 56 66 73 2c 20 7a 50 61  me(pRealVfs, zPa
22730 74 68 2c 20 6e 4f 75 74 2c 20 7a 4f 75 74 29 3b  th, nOut, zOut);
22740 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
22750 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54  TE_OMIT_LOAD_EXT
22760 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 4f 70 65  ENSION./*.** Ope
22770 6e 20 74 68 65 20 64 79 6e 61 6d 69 63 20 6c 69  n the dynamic li
22780 62 72 61 72 79 20 6c 6f 63 61 74 65 64 20 61 74  brary located at
22790 20 7a 50 61 74 68 20 61 6e 64 20 72 65 74 75 72   zPath and retur
227a0 6e 20 61 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73  n a handle..*/.s
227b0 74 61 74 69 63 20 76 6f 69 64 20 2a 72 62 75 56  tatic void *rbuV
227c0 66 73 44 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33  fsDlOpen(sqlite3
227d0 5f 76 66 73 20 2a 70 56 66 73 2c 20 63 6f 6e 73  _vfs *pVfs, cons
227e0 74 20 63 68 61 72 20 2a 7a 50 61 74 68 29 7b 0a  t char *zPath){.
227f0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
22800 52 65 61 6c 56 66 73 20 3d 20 28 28 72 62 75 5f  RealVfs = ((rbu_
22810 76 66 73 2a 29 70 56 66 73 29 2d 3e 70 52 65 61  vfs*)pVfs)->pRea
22820 6c 56 66 73 3b 0a 20 20 72 65 74 75 72 6e 20 70  lVfs;.  return p
22830 52 65 61 6c 56 66 73 2d 3e 78 44 6c 4f 70 65 6e  RealVfs->xDlOpen
22840 28 70 52 65 61 6c 56 66 73 2c 20 7a 50 61 74 68  (pRealVfs, zPath
22850 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 75  );.}../*.** Popu
22860 6c 61 74 65 20 74 68 65 20 62 75 66 66 65 72 20  late the buffer 
22870 7a 45 72 72 4d 73 67 20 28 73 69 7a 65 20 6e 42  zErrMsg (size nB
22880 79 74 65 20 62 79 74 65 73 29 20 77 69 74 68 20  yte bytes) with 
22890 61 20 68 75 6d 61 6e 20 72 65 61 64 61 62 6c 65  a human readable
228a0 0a 2a 2a 20 75 74 66 2d 38 20 73 74 72 69 6e 67  .** utf-8 string
228b0 20 64 65 73 63 72 69 62 69 6e 67 20 74 68 65 20   describing the 
228c0 6d 6f 73 74 20 72 65 63 65 6e 74 20 65 72 72 6f  most recent erro
228d0 72 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 73  r encountered as
228e0 73 6f 63 69 61 74 65 64 20 0a 2a 2a 20 77 69 74  sociated .** wit
228f0 68 20 64 79 6e 61 6d 69 63 20 6c 69 62 72 61 72  h dynamic librar
22900 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ies..*/.static v
22910 6f 69 64 20 72 62 75 56 66 73 44 6c 45 72 72 6f  oid rbuVfsDlErro
22920 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  r(sqlite3_vfs *p
22930 56 66 73 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20  Vfs, int nByte, 
22940 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 29 7b 0a  char *zErrMsg){.
22950 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
22960 52 65 61 6c 56 66 73 20 3d 20 28 28 72 62 75 5f  RealVfs = ((rbu_
22970 76 66 73 2a 29 70 56 66 73 29 2d 3e 70 52 65 61  vfs*)pVfs)->pRea
22980 6c 56 66 73 3b 0a 20 20 70 52 65 61 6c 56 66 73  lVfs;.  pRealVfs
22990 2d 3e 78 44 6c 45 72 72 6f 72 28 70 52 65 61 6c  ->xDlError(pReal
229a0 56 66 73 2c 20 6e 42 79 74 65 2c 20 7a 45 72 72  Vfs, nByte, zErr
229b0 4d 73 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Msg);.}../*.** R
229c0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
229d0 74 6f 20 74 68 65 20 73 79 6d 62 6f 6c 20 7a 53  to the symbol zS
229e0 79 6d 62 6f 6c 20 69 6e 20 74 68 65 20 64 79 6e  ymbol in the dyn
229f0 61 6d 69 63 20 6c 69 62 72 61 72 79 20 70 48 61  amic library pHa
22a00 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndle..*/.static 
22a10 76 6f 69 64 20 28 2a 72 62 75 56 66 73 44 6c 53  void (*rbuVfsDlS
22a20 79 6d 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  ym(.  sqlite3_vf
22a30 73 20 2a 70 56 66 73 2c 20 0a 20 20 76 6f 69 64  s *pVfs, .  void
22a40 20 2a 70 41 72 67 2c 20 0a 20 20 63 6f 6e 73 74   *pArg, .  const
22a50 20 63 68 61 72 20 2a 7a 53 79 6d 0a 29 29 28 76   char *zSym.))(v
22a60 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  oid){.  sqlite3_
22a70 76 66 73 20 2a 70 52 65 61 6c 56 66 73 20 3d 20  vfs *pRealVfs = 
22a80 28 28 72 62 75 5f 76 66 73 2a 29 70 56 66 73 29  ((rbu_vfs*)pVfs)
22a90 2d 3e 70 52 65 61 6c 56 66 73 3b 0a 20 20 72 65  ->pRealVfs;.  re
22aa0 74 75 72 6e 20 70 52 65 61 6c 56 66 73 2d 3e 78  turn pRealVfs->x
22ab0 44 6c 53 79 6d 28 70 52 65 61 6c 56 66 73 2c 20  DlSym(pRealVfs, 
22ac0 70 41 72 67 2c 20 7a 53 79 6d 29 3b 0a 7d 0a 0a  pArg, zSym);.}..
22ad0 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20  /*.** Close the 
22ae0 64 79 6e 61 6d 69 63 20 6c 69 62 72 61 72 79 20  dynamic library 
22af0 68 61 6e 64 6c 65 20 70 48 61 6e 64 6c 65 2e 0a  handle pHandle..
22b00 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
22b10 62 75 56 66 73 44 6c 43 6c 6f 73 65 28 73 71 6c  buVfsDlClose(sql
22b20 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
22b30 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65 29 7b 0a  void *pHandle){.
22b40 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
22b50 52 65 61 6c 56 66 73 20 3d 20 28 28 72 62 75 5f  RealVfs = ((rbu_
22b60 76 66 73 2a 29 70 56 66 73 29 2d 3e 70 52 65 61  vfs*)pVfs)->pRea
22b70 6c 56 66 73 3b 0a 20 20 70 52 65 61 6c 56 66 73  lVfs;.  pRealVfs
22b80 2d 3e 78 44 6c 43 6c 6f 73 65 28 70 52 65 61 6c  ->xDlClose(pReal
22b90 56 66 73 2c 20 70 48 61 6e 64 6c 65 29 3b 0a 7d  Vfs, pHandle);.}
22ba0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
22bb0 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45  E_OMIT_LOAD_EXTE
22bc0 4e 53 49 4f 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  NSION */../*.** 
22bd0 50 6f 70 75 6c 61 74 65 20 74 68 65 20 62 75 66  Populate the buf
22be0 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  fer pointed to b
22bf0 79 20 7a 42 75 66 4f 75 74 20 77 69 74 68 20 6e  y zBufOut with n
22c00 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 0a 2a  Byte bytes of .*
22c10 2a 20 72 61 6e 64 6f 6d 20 64 61 74 61 2e 0a 2a  * random data..*
22c20 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62 75  /.static int rbu
22c30 56 66 73 52 61 6e 64 6f 6d 6e 65 73 73 28 73 71  VfsRandomness(sq
22c40 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
22c50 20 69 6e 74 20 6e 42 79 74 65 2c 20 63 68 61 72   int nByte, char
22c60 20 2a 7a 42 75 66 4f 75 74 29 7b 0a 20 20 73 71   *zBufOut){.  sq
22c70 6c 69 74 65 33 5f 76 66 73 20 2a 70 52 65 61 6c  lite3_vfs *pReal
22c80 56 66 73 20 3d 20 28 28 72 62 75 5f 76 66 73 2a  Vfs = ((rbu_vfs*
22c90 29 70 56 66 73 29 2d 3e 70 52 65 61 6c 56 66 73  )pVfs)->pRealVfs
22ca0 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65 61 6c  ;.  return pReal
22cb0 56 66 73 2d 3e 78 52 61 6e 64 6f 6d 6e 65 73 73  Vfs->xRandomness
22cc0 28 70 52 65 61 6c 56 66 73 2c 20 6e 42 79 74 65  (pRealVfs, nByte
22cd0 2c 20 7a 42 75 66 4f 75 74 29 3b 0a 7d 0a 0a 2f  , zBufOut);.}../
22ce0 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 6e  *.** Sleep for n
22cf0 4d 69 63 72 6f 20 6d 69 63 72 6f 73 65 63 6f 6e  Micro microsecon
22d00 64 73 2e 20 52 65 74 75 72 6e 20 74 68 65 20 6e  ds. Return the n
22d10 75 6d 62 65 72 20 6f 66 20 6d 69 63 72 6f 73 65  umber of microse
22d20 63 6f 6e 64 73 20 0a 2a 2a 20 61 63 74 75 61 6c  conds .** actual
22d30 6c 79 20 73 6c 65 70 74 2e 0a 2a 2f 0a 73 74 61  ly slept..*/.sta
22d40 74 69 63 20 69 6e 74 20 72 62 75 56 66 73 53 6c  tic int rbuVfsSl
22d50 65 65 70 28 73 71 6c 69 74 65 33 5f 76 66 73 20  eep(sqlite3_vfs 
22d60 2a 70 56 66 73 2c 20 69 6e 74 20 6e 4d 69 63 72  *pVfs, int nMicr
22d70 6f 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  o){.  sqlite3_vf
22d80 73 20 2a 70 52 65 61 6c 56 66 73 20 3d 20 28 28  s *pRealVfs = ((
22d90 72 62 75 5f 76 66 73 2a 29 70 56 66 73 29 2d 3e  rbu_vfs*)pVfs)->
22da0 70 52 65 61 6c 56 66 73 3b 0a 20 20 72 65 74 75  pRealVfs;.  retu
22db0 72 6e 20 70 52 65 61 6c 56 66 73 2d 3e 78 53 6c  rn pRealVfs->xSl
22dc0 65 65 70 28 70 52 65 61 6c 56 66 73 2c 20 6e 4d  eep(pRealVfs, nM
22dd0 69 63 72 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  icro);.}../*.** 
22de0 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65  Return the curre
22df0 6e 74 20 74 69 6d 65 20 61 73 20 61 20 4a 75 6c  nt time as a Jul
22e00 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 69  ian Day number i
22e10 6e 20 2a 70 54 69 6d 65 4f 75 74 2e 0a 2a 2f 0a  n *pTimeOut..*/.
22e20 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 56 66  static int rbuVf
22e30 73 43 75 72 72 65 6e 74 54 69 6d 65 28 73 71 6c  sCurrentTime(sql
22e40 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
22e50 64 6f 75 62 6c 65 20 2a 70 54 69 6d 65 4f 75 74  double *pTimeOut
22e60 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
22e70 20 2a 70 52 65 61 6c 56 66 73 20 3d 20 28 28 72   *pRealVfs = ((r
22e80 62 75 5f 76 66 73 2a 29 70 56 66 73 29 2d 3e 70  bu_vfs*)pVfs)->p
22e90 52 65 61 6c 56 66 73 3b 0a 20 20 72 65 74 75 72  RealVfs;.  retur
22ea0 6e 20 70 52 65 61 6c 56 66 73 2d 3e 78 43 75 72  n pRealVfs->xCur
22eb0 72 65 6e 74 54 69 6d 65 28 70 52 65 61 6c 56 66  rentTime(pRealVf
22ec0 73 2c 20 70 54 69 6d 65 4f 75 74 29 3b 0a 7d 0a  s, pTimeOut);.}.
22ed0 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 2e 0a 2a 2f  ./*.** No-op..*/
22ee0 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 56  .static int rbuV
22ef0 66 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 73  fsGetLastError(s
22f00 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
22f10 2c 20 69 6e 74 20 61 2c 20 63 68 61 72 20 2a 62  , int a, char *b
22f20 29 7b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  ){.  return 0;.}
22f30 0a 0a 2f 2a 0a 2a 2a 20 44 65 72 65 67 69 73 74  ../*.** Deregist
22f40 65 72 20 61 6e 64 20 64 65 73 74 72 6f 79 20 61  er and destroy a
22f50 6e 20 52 42 55 20 76 66 73 20 63 72 65 61 74 65  n RBU vfs create
22f60 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20  d by an earlier 
22f70 63 61 6c 6c 20 74 6f 0a 2a 2a 20 73 71 6c 69 74  call to.** sqlit
22f80 65 33 72 62 75 5f 63 72 65 61 74 65 5f 76 66 73  e3rbu_create_vfs
22f90 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
22fa0 74 65 33 72 62 75 5f 64 65 73 74 72 6f 79 5f 76  te3rbu_destroy_v
22fb0 66 73 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  fs(const char *z
22fc0 4e 61 6d 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  Name){.  sqlite3
22fd0 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 73 71 6c  _vfs *pVfs = sql
22fe0 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 7a 4e  ite3_vfs_find(zN
22ff0 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 56 66 73  ame);.  if( pVfs
23000 20 26 26 20 70 56 66 73 2d 3e 78 4f 70 65 6e 3d   && pVfs->xOpen=
23010 3d 72 62 75 56 66 73 4f 70 65 6e 20 29 7b 0a 20  =rbuVfsOpen ){. 
23020 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
23030 5f 66 72 65 65 28 28 28 72 62 75 5f 76 66 73 2a  _free(((rbu_vfs*
23040 29 70 56 66 73 29 2d 3e 6d 75 74 65 78 29 3b 0a  )pVfs)->mutex);.
23050 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f      sqlite3_vfs_
23060 75 6e 72 65 67 69 73 74 65 72 28 70 56 66 73 29  unregister(pVfs)
23070 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
23080 65 65 28 70 56 66 73 29 3b 0a 20 20 7d 0a 7d 0a  ee(pVfs);.  }.}.
23090 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 6e  ./*.** Create an
230a0 20 52 42 55 20 56 46 53 20 6e 61 6d 65 64 20 7a   RBU VFS named z
230b0 4e 61 6d 65 20 74 68 61 74 20 61 63 63 65 73 73  Name that access
230c0 65 73 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  es the underlyin
230d0 67 20 66 69 6c 65 2d 73 79 73 74 65 6d 0a 2a 2a  g file-system.**
230e0 20 76 69 61 20 65 78 69 73 74 69 6e 67 20 56 46   via existing VF
230f0 53 20 7a 50 61 72 65 6e 74 2e 20 54 68 65 20 6e  S zParent. The n
23100 65 77 20 6f 62 6a 65 63 74 20 69 73 20 72 65 67  ew object is reg
23110 69 73 74 65 72 65 64 20 61 73 20 61 20 6e 6f 6e  istered as a non
23120 2d 64 65 66 61 75 6c 74 0a 2a 2a 20 56 46 53 20  -default.** VFS 
23130 77 69 74 68 20 53 51 4c 69 74 65 20 62 65 66 6f  with SQLite befo
23140 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f  re returning..*/
23150 0a 69 6e 74 20 73 71 6c 69 74 65 33 72 62 75 5f  .int sqlite3rbu_
23160 63 72 65 61 74 65 5f 76 66 73 28 63 6f 6e 73 74  create_vfs(const
23170 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f   char *zName, co
23180 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72 65 6e  nst char *zParen
23190 74 29 7b 0a 0a 20 20 2f 2a 20 54 65 6d 70 6c 61  t){..  /* Templa
231a0 74 65 20 66 6f 72 20 56 46 53 20 2a 2f 0a 20 20  te for VFS */.  
231b0 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 76  static sqlite3_v
231c0 66 73 20 76 66 73 5f 74 65 6d 70 6c 61 74 65 20  fs vfs_template 
231d0 3d 20 7b 0a 20 20 20 20 31 2c 20 20 20 20 20 20  = {.    1,      
231e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
231f0 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f        /* iVersio
23200 6e 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20  n */.    0,     
23210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23220 20 20 20 20 20 20 20 2f 2a 20 73 7a 4f 73 46 69         /* szOsFi
23230 6c 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20  le */.    0,    
23240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23250 20 20 20 20 20 20 20 20 2f 2a 20 6d 78 50 61 74          /* mxPat
23260 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20  hname */.    0, 
23270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23280 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e             /* pN
23290 65 78 74 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20  ext */.    0,   
232a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
232b0 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4e 61 6d           /* zNam
232c0 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20  e */.    0,     
232d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
232e0 20 20 20 20 20 20 20 2f 2a 20 70 41 70 70 44 61         /* pAppDa
232f0 74 61 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73  ta */.    rbuVfs
23300 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20  Open,           
23310 20 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e          /* xOpen
23320 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 44 65   */.    rbuVfsDe
23330 6c 65 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  lete,           
23340 20 20 20 20 20 20 2f 2a 20 78 44 65 6c 65 74 65        /* xDelete
23350 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 41 63   */.    rbuVfsAc
23360 63 65 73 73 2c 20 20 20 20 20 20 20 20 20 20 20  cess,           
23370 20 20 20 20 20 20 2f 2a 20 78 41 63 63 65 73 73        /* xAccess
23380 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 46 75   */.    rbuVfsFu
23390 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20 20 20 20  llPathname,     
233a0 20 20 20 20 20 20 2f 2a 20 78 46 75 6c 6c 50 61        /* xFullPa
233b0 74 68 6e 61 6d 65 20 2a 2f 0a 0a 23 69 66 6e 64  thname */..#ifnd
233c0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  ef SQLITE_OMIT_L
233d0 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20  OAD_EXTENSION.  
233e0 20 20 72 62 75 56 66 73 44 6c 4f 70 65 6e 2c 20    rbuVfsDlOpen, 
233f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23400 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f 0a 20 20  /* xDlOpen */.  
23410 20 20 72 62 75 56 66 73 44 6c 45 72 72 6f 72 2c    rbuVfsDlError,
23420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23430 2f 2a 20 78 44 6c 45 72 72 6f 72 20 2a 2f 0a 20  /* xDlError */. 
23440 20 20 20 72 62 75 56 66 73 44 6c 53 79 6d 2c 20     rbuVfsDlSym, 
23450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23460 20 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f 0a 20 20   /* xDlSym */.  
23470 20 20 72 62 75 56 66 73 44 6c 43 6c 6f 73 65 2c    rbuVfsDlClose,
23480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23490 2f 2a 20 78 44 6c 43 6c 6f 73 65 20 2a 2f 0a 23  /* xDlClose */.#
234a0 65 6c 73 65 0a 20 20 20 20 30 2c 20 30 2c 20 30  else.    0, 0, 0
234b0 2c 20 30 2c 0a 23 65 6e 64 69 66 0a 0a 20 20 20  , 0,.#endif..   
234c0 20 72 62 75 56 66 73 52 61 6e 64 6f 6d 6e 65 73   rbuVfsRandomnes
234d0 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  s,             /
234e0 2a 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f  * xRandomness */
234f0 0a 20 20 20 20 72 62 75 56 66 73 53 6c 65 65 70  .    rbuVfsSleep
23500 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
23510 20 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a 2f 0a     /* xSleep */.
23520 20 20 20 20 72 62 75 56 66 73 43 75 72 72 65 6e      rbuVfsCurren
23530 74 54 69 6d 65 2c 20 20 20 20 20 20 20 20 20 20  tTime,          
23540 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d    /* xCurrentTim
23550 65 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 47  e */.    rbuVfsG
23560 65 74 4c 61 73 74 45 72 72 6f 72 2c 20 20 20 20  etLastError,    
23570 20 20 20 20 20 20 20 2f 2a 20 78 47 65 74 4c 61         /* xGetLa
23580 73 74 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20 30  stError */.    0
23590 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
235a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
235b0 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36  xCurrentTimeInt6
235c0 34 20 28 76 65 72 73 69 6f 6e 20 32 29 20 2a 2f  4 (version 2) */
235d0 0a 20 20 20 20 30 2c 20 30 2c 20 30 20 20 20 20  .    0, 0, 0    
235e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
235f0 20 20 20 2f 2a 20 55 6e 69 6d 70 6c 65 6d 65 6e     /* Unimplemen
23600 74 65 64 20 76 65 72 73 69 6f 6e 20 33 20 6d 65  ted version 3 me
23610 74 68 6f 64 73 20 2a 2f 0a 20 20 7d 3b 0a 0a 20  thods */.  };.. 
23620 20 72 62 75 5f 76 66 73 20 2a 70 4e 65 77 20 3d   rbu_vfs *pNew =
23630 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
23640 20 2f 2a 20 4e 65 77 6c 79 20 61 6c 6c 6f 63 61   /* Newly alloca
23650 74 65 64 20 56 46 53 20 2a 2f 0a 20 20 69 6e 74  ted VFS */.  int
23660 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
23670 0a 20 20 73 69 7a 65 5f 74 20 6e 4e 61 6d 65 3b  .  size_t nName;
23680 0a 20 20 73 69 7a 65 5f 74 20 6e 42 79 74 65 3b  .  size_t nByte;
23690 0a 0a 20 20 6e 4e 61 6d 65 20 3d 20 73 74 72 6c  ..  nName = strl
236a0 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 6e 42 79  en(zName);.  nBy
236b0 74 65 20 3d 20 73 69 7a 65 6f 66 28 72 62 75 5f  te = sizeof(rbu_
236c0 76 66 73 29 20 2b 20 6e 4e 61 6d 65 20 2b 20 31  vfs) + nName + 1
236d0 3b 0a 20 20 70 4e 65 77 20 3d 20 28 72 62 75 5f  ;.  pNew = (rbu_
236e0 76 66 73 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c  vfs*)sqlite3_mal
236f0 6c 6f 63 36 34 28 6e 42 79 74 65 29 3b 0a 20 20  loc64(nByte);.  
23700 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
23710 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
23720 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  OMEM;.  }else{. 
23730 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a     sqlite3_vfs *
23740 70 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20  pParent;        
23750 20 20 20 2f 2a 20 50 61 72 65 6e 74 20 56 46 53     /* Parent VFS
23760 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 70   */.    memset(p
23770 4e 65 77 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a  New, 0, nByte);.
23780 20 20 20 20 70 50 61 72 65 6e 74 20 3d 20 73 71      pParent = sq
23790 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 7a  lite3_vfs_find(z
237a0 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 69 66 28  Parent);.    if(
237b0 20 70 50 61 72 65 6e 74 3d 3d 30 20 29 7b 0a 20   pParent==0 ){. 
237c0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
237d0 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20 20 20 7d  _NOTFOUND;.    }
237e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72  else{.      char
237f0 20 2a 7a 53 70 61 63 65 3b 0a 20 20 20 20 20 20   *zSpace;.      
23800 6d 65 6d 63 70 79 28 26 70 4e 65 77 2d 3e 62 61  memcpy(&pNew->ba
23810 73 65 2c 20 26 76 66 73 5f 74 65 6d 70 6c 61 74  se, &vfs_templat
23820 65 2c 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65  e, sizeof(sqlite
23830 33 5f 76 66 73 29 29 3b 0a 20 20 20 20 20 20 70  3_vfs));.      p
23840 4e 65 77 2d 3e 62 61 73 65 2e 6d 78 50 61 74 68  New->base.mxPath
23850 6e 61 6d 65 20 3d 20 70 50 61 72 65 6e 74 2d 3e  name = pParent->
23860 6d 78 50 61 74 68 6e 61 6d 65 3b 0a 20 20 20 20  mxPathname;.    
23870 20 20 70 4e 65 77 2d 3e 62 61 73 65 2e 73 7a 4f    pNew->base.szO
23880 73 46 69 6c 65 20 3d 20 73 69 7a 65 6f 66 28 72  sFile = sizeof(r
23890 62 75 5f 66 69 6c 65 29 20 2b 20 70 50 61 72 65  bu_file) + pPare
238a0 6e 74 2d 3e 73 7a 4f 73 46 69 6c 65 3b 0a 20 20  nt->szOsFile;.  
238b0 20 20 20 20 70 4e 65 77 2d 3e 70 52 65 61 6c 56      pNew->pRealV
238c0 66 73 20 3d 20 70 50 61 72 65 6e 74 3b 0a 20 20  fs = pParent;.  
238d0 20 20 20 20 70 4e 65 77 2d 3e 62 61 73 65 2e 7a      pNew->base.z
238e0 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68  Name = (const ch
238f0 61 72 2a 29 28 7a 53 70 61 63 65 20 3d 20 28 63  ar*)(zSpace = (c
23900 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 29 3b 0a  har*)&pNew[1]);.
23910 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 53 70        memcpy(zSp
23920 61 63 65 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d  ace, zName, nNam
23930 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 41 6c  e);..      /* Al
23940 6c 6f 63 61 74 65 20 74 68 65 20 6d 75 74 65 78  locate the mutex
23950 20 61 6e 64 20 72 65 67 69 73 74 65 72 20 74 68   and register th
23960 65 20 6e 65 77 20 56 46 53 20 28 6e 6f 74 20 61  e new VFS (not a
23970 73 20 74 68 65 20 64 65 66 61 75 6c 74 29 20 2a  s the default) *
23980 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6d 75  /.      pNew->mu
23990 74 65 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75  tex = sqlite3_mu
239a0 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45  tex_alloc(SQLITE
239b0 5f 4d 55 54 45 58 5f 52 45 43 55 52 53 49 56 45  _MUTEX_RECURSIVE
239c0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65  );.      if( pNe
239d0 77 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20  w->mutex==0 ){. 
239e0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
239f0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
23a00 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
23a10 63 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  c = sqlite3_vfs_
23a20 72 65 67 69 73 74 65 72 28 26 70 4e 65 77 2d 3e  register(&pNew->
23a30 62 61 73 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  base, 0);.      
23a40 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  }.    }..    if(
23a50 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
23a60 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
23a70 6d 75 74 65 78 5f 66 72 65 65 28 70 4e 65 77 2d  mutex_free(pNew-
23a80 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 73  >mutex);.      s
23a90 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77  qlite3_free(pNew
23aa0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
23ab0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
23ac0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23ad0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23ae0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23af0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23b00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 23 65 6e  **********/..#en
23b10 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
23b20 53 51 4c 49 54 45 5f 43 4f 52 45 29 20 7c 7c 20  SQLITE_CORE) || 
23b30 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
23b40 4e 41 42 4c 45 5f 52 42 55 29 20 2a 2f 0a        NABLE_RBU) */.