/ Hex Artifact Content
Login

Artifact 20922328dcebe89589638923bb46840df8bc7733:


0000: 2f 2a 0a 2a 2a 20 32 30 31 34 20 41 75 67 75 73  /*.** 2014 Augus
0010: 74 20 33 30 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  t 30.**.** The a
0020: 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20  uthor disclaims 
0030: 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74 68 69  copyright to thi
0040: 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20  s source code.  
0050: 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61  In place of.** a
0060: 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68   legal notice, h
0070: 65 72 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e  ere is a blessin
0080: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20  g:.**.**    May 
0090: 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20  you do good and 
00a0: 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20  not evil..**    
00b0: 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72  May you find for
00c0: 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75  giveness for you
00d0: 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76  rself and forgiv
00e0: 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20  e others..**    
00f0: 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20 66 72  May you share fr
0100: 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69  eely, never taki
0110: 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75  ng more than you
0120: 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a   give..**.******
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 56 45  ***.**.**.** OVE
0180: 52 56 49 45 57 20 0a 2a 2a 0a 2a 2a 20 20 54 68  RVIEW .**.**  Th
0190: 65 20 52 42 55 20 65 78 74 65 6e 73 69 6f 6e 20  e RBU extension 
01a0: 72 65 71 75 69 72 65 73 20 74 68 61 74 20 74 68  requires that th
01b0: 65 20 52 42 55 20 75 70 64 61 74 65 20 62 65 20  e RBU update be 
01c0: 70 61 63 6b 61 67 65 64 20 61 73 20 61 6e 0a 2a  packaged as an.*
01d0: 2a 20 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  *  SQLite databa
01e0: 73 65 2e 20 54 68 65 20 74 61 62 6c 65 73 20 69  se. The tables i
01f0: 74 20 65 78 70 65 63 74 73 20 74 6f 20 66 69 6e  t expects to fin
0200: 64 20 61 72 65 20 64 65 73 63 72 69 62 65 64 20  d are described 
0210: 69 6e 0a 2a 2a 20 20 73 71 6c 69 74 65 33 72 62  in.**  sqlite3rb
0220: 75 2e 68 2e 20 20 45 73 73 65 6e 74 69 61 6c 6c  u.h.  Essentiall
0230: 79 2c 20 66 6f 72 20 65 61 63 68 20 74 61 62 6c  y, for each tabl
0240: 65 20 78 79 7a 20 69 6e 20 74 68 65 20 74 61 72  e xyz in the tar
0250: 67 65 74 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  get database.** 
0260: 20 74 68 61 74 20 74 68 65 20 75 73 65 72 20 77   that the user w
0270: 69 73 68 65 73 20 74 6f 20 77 72 69 74 65 20 74  ishes to write t
0280: 6f 2c 20 61 20 63 6f 72 72 65 73 70 6f 6e 64 69  o, a correspondi
0290: 6e 67 20 64 61 74 61 5f 78 79 7a 20 74 61 62 6c  ng data_xyz tabl
02a0: 65 20 69 73 0a 2a 2a 20 20 63 72 65 61 74 65 64  e is.**  created
02b0: 20 69 6e 20 74 68 65 20 52 42 55 20 64 61 74 61   in the RBU data
02c0: 62 61 73 65 20 61 6e 64 20 70 6f 70 75 6c 61 74  base and populat
02d0: 65 64 20 77 69 74 68 20 6f 6e 65 20 72 6f 77 20  ed with one row 
02e0: 66 6f 72 20 65 61 63 68 20 72 6f 77 20 74 6f 0a  for each row to.
02f0: 2a 2a 20 20 75 70 64 61 74 65 2c 20 69 6e 73 65  **  update, inse
0300: 72 74 20 6f 72 20 64 65 6c 65 74 65 20 66 72 6f  rt or delete fro
0310: 6d 20 74 68 65 20 74 61 72 67 65 74 20 74 61 62  m the target tab
0320: 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 20 54 68 65 20  le..** .**  The 
0330: 75 70 64 61 74 65 20 70 72 6f 63 65 65 64 73 20  update proceeds 
0340: 69 6e 20 74 68 72 65 65 20 73 74 61 67 65 73 3a  in three stages:
0350: 0a 2a 2a 20 0a 2a 2a 20 20 31 29 20 54 68 65 20  .** .**  1) The 
0360: 64 61 74 61 62 61 73 65 20 69 73 20 75 70 64 61  database is upda
0370: 74 65 64 2e 20 54 68 65 20 6d 6f 64 69 66 69 65  ted. The modifie
0380: 64 20 64 61 74 61 62 61 73 65 20 70 61 67 65 73  d database pages
0390: 20 61 72 65 20 77 72 69 74 74 65 6e 0a 2a 2a 20   are written.** 
03a0: 20 20 20 20 74 6f 20 61 20 2a 2d 6f 61 6c 20 66      to a *-oal f
03b0: 69 6c 65 2e 20 41 20 2a 2d 6f 61 6c 20 66 69 6c  ile. A *-oal fil
03c0: 65 20 69 73 20 6a 75 73 74 20 6c 69 6b 65 20 61  e is just like a
03d0: 20 2a 2d 77 61 6c 20 66 69 6c 65 2c 20 65 78 63   *-wal file, exc
03e0: 65 70 74 0a 2a 2a 20 20 20 20 20 74 68 61 74 20  ept.**     that 
03f0: 69 74 20 69 73 20 6e 61 6d 65 64 20 22 3c 64 61  it is named "<da
0400: 74 61 62 61 73 65 3e 2d 6f 61 6c 22 20 69 6e 73  tabase>-oal" ins
0410: 74 65 61 64 20 6f 66 20 22 3c 64 61 74 61 62 61  tead of "<databa
0420: 73 65 3e 2d 77 61 6c 22 2e 0a 2a 2a 20 20 20 20  se>-wal"..**    
0430: 20 42 65 63 61 75 73 65 20 72 65 67 75 6c 61 72   Because regular
0440: 20 53 51 4c 69 74 65 20 63 6c 69 65 6e 74 73 20   SQLite clients 
0450: 64 6f 20 6e 6f 74 20 6c 6f 6f 6b 20 66 6f 72 20  do not look for 
0460: 66 69 6c 65 20 6e 61 6d 65 64 0a 2a 2a 20 20 20  file named.**   
0470: 20 20 22 3c 64 61 74 61 62 61 73 65 3e 2d 6f 61    "<database>-oa
0480: 6c 22 2c 20 74 68 65 79 20 67 6f 20 6f 6e 20 75  l", they go on u
0490: 73 69 6e 67 20 74 68 65 20 6f 72 69 67 69 6e 61  sing the origina
04a0: 6c 20 64 61 74 61 62 61 73 65 20 69 6e 0a 2a 2a  l database in.**
04b0: 20 20 20 20 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f       rollback mo
04c0: 64 65 20 77 68 69 6c 65 20 74 68 65 20 2a 2d 6f  de while the *-o
04d0: 61 6c 20 66 69 6c 65 20 69 73 20 62 65 69 6e 67  al file is being
04e0: 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2a 20 0a   generated..** .
04f0: 2a 2a 20 20 20 20 20 44 75 72 69 6e 67 20 74 68  **     During th
0500: 69 73 20 73 74 61 67 65 20 52 42 55 20 64 6f 65  is stage RBU doe
0510: 73 20 6e 6f 74 20 75 70 64 61 74 65 20 74 68 65  s not update the
0520: 20 64 61 74 61 62 61 73 65 20 62 79 20 77 72 69   database by wri
0530: 74 69 6e 67 0a 2a 2a 20 20 20 20 20 64 69 72 65  ting.**     dire
0540: 63 74 6c 79 20 74 6f 20 74 68 65 20 74 61 72 67  ctly to the targ
0550: 65 74 20 74 61 62 6c 65 73 2e 20 49 6e 73 74 65  et tables. Inste
0560: 61 64 20 69 74 20 63 72 65 61 74 65 73 20 22 69  ad it creates "i
0570: 6d 70 6f 73 74 65 72 22 0a 2a 2a 20 20 20 20 20  mposter".**     
0580: 74 61 62 6c 65 73 20 75 73 69 6e 67 20 74 68 65  tables using the
0590: 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
05a0: 5f 49 4d 50 4f 53 54 45 52 20 69 6e 74 65 72 66  _IMPOSTER interf
05b0: 61 63 65 20 74 68 61 74 20 69 74 20 75 73 65 73  ace that it uses
05c0: 0a 2a 2a 20 20 20 20 20 74 6f 20 75 70 64 61 74  .**     to updat
05d0: 65 20 65 61 63 68 20 62 2d 74 72 65 65 20 69 6e  e each b-tree in
05e0: 64 69 76 69 64 75 61 6c 6c 79 2e 20 41 6c 6c 20  dividually. All 
05f0: 75 70 64 61 74 65 73 20 72 65 71 75 69 72 65 64  updates required
0600: 20 62 79 20 65 61 63 68 0a 2a 2a 20 20 20 20 20   by each.**     
0610: 62 2d 74 72 65 65 20 61 72 65 20 63 6f 6d 70 6c  b-tree are compl
0620: 65 74 65 64 20 62 65 66 6f 72 65 20 6d 6f 76 69  eted before movi
0630: 6e 67 20 6f 6e 20 74 6f 20 74 68 65 20 6e 65 78  ng on to the nex
0640: 74 2c 20 61 6e 64 20 61 6c 6c 0a 2a 2a 20 20 20  t, and all.**   
0650: 20 20 75 70 64 61 74 65 73 20 61 72 65 20 64 6f    updates are do
0660: 6e 65 20 69 6e 20 73 6f 72 74 65 64 20 6b 65 79  ne in sorted key
0670: 20 6f 72 64 65 72 2e 0a 2a 2a 20 0a 2a 2a 20 20   order..** .**  
0680: 32 29 20 54 68 65 20 22 3c 64 61 74 61 62 61 73  2) The "<databas
0690: 65 3e 2d 6f 61 6c 22 20 66 69 6c 65 20 69 73 20  e>-oal" file is 
06a0: 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 65 71 75  moved to the equ
06b0: 69 76 61 6c 65 6e 74 20 22 3c 64 61 74 61 62 61  ivalent "<databa
06c0: 73 65 3e 2d 77 61 6c 22 0a 2a 2a 20 20 20 20 20  se>-wal".**     
06d0: 6c 6f 63 61 74 69 6f 6e 20 75 73 69 6e 67 20 61  location using a
06e0: 20 63 61 6c 6c 20 74 6f 20 72 65 6e 61 6d 65 28   call to rename(
06f0: 32 29 2e 20 42 65 66 6f 72 65 20 64 6f 69 6e 67  2). Before doing
0700: 20 74 68 69 73 20 74 68 65 20 52 42 55 0a 2a 2a   this the RBU.**
0710: 20 20 20 20 20 6d 6f 64 75 6c 65 20 74 61 6b 65       module take
0720: 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  s an EXCLUSIVE l
0730: 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
0740: 61 73 65 20 66 69 6c 65 2c 20 65 6e 73 75 72 69  ase file, ensuri
0750: 6e 67 0a 2a 2a 20 20 20 20 20 74 68 61 74 20 74  ng.**     that t
0760: 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 74 68 65  here are no othe
0770: 72 20 61 63 74 69 76 65 20 72 65 61 64 65 72 73  r active readers
0780: 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 4f 6e 63  ..** .**     Onc
0790: 65 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 20  e the EXCLUSIVE 
07a0: 6c 6f 63 6b 20 69 73 20 72 65 6c 65 61 73 65 64  lock is released
07b0: 2c 20 61 6e 79 20 6f 74 68 65 72 20 64 61 74 61  , any other data
07c0: 62 61 73 65 20 72 65 61 64 65 72 73 0a 2a 2a 20  base readers.** 
07d0: 20 20 20 20 64 65 74 65 63 74 20 74 68 65 20 6e      detect the n
07e0: 65 77 20 2a 2d 77 61 6c 20 66 69 6c 65 20 61 6e  ew *-wal file an
07f0: 64 20 72 65 61 64 20 74 68 65 20 64 61 74 61 62  d read the datab
0800: 61 73 65 20 69 6e 20 77 61 6c 20 6d 6f 64 65 2e  ase in wal mode.
0810: 20 41 74 0a 2a 2a 20 20 20 20 20 74 68 69 73 20   At.**     this 
0820: 70 6f 69 6e 74 20 74 68 65 79 20 73 65 65 20 74  point they see t
0830: 68 65 20 6e 65 77 20 76 65 72 73 69 6f 6e 20 6f  he new version o
0840: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2d  f the database -
0850: 20 69 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20 20 20   including.**   
0860: 20 20 74 68 65 20 75 70 64 61 74 65 73 20 6d 61    the updates ma
0870: 64 65 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  de as part of th
0880: 65 20 52 42 55 20 75 70 64 61 74 65 2e 0a 2a 2a  e RBU update..**
0890: 20 0a 2a 2a 20 20 33 29 20 54 68 65 20 6e 65 77   .**  3) The new
08a0: 20 2a 2d 77 61 6c 20 66 69 6c 65 20 69 73 20 63   *-wal file is c
08b0: 68 65 63 6b 70 6f 69 6e 74 65 64 2e 20 54 68 69  heckpointed. Thi
08c0: 73 20 70 72 6f 63 65 65 64 73 20 69 6e 20 74 68  s proceeds in th
08d0: 65 20 73 61 6d 65 20 77 61 79 20 0a 2a 2a 20 20  e same way .**  
08e0: 20 20 20 61 73 20 61 20 72 65 67 75 6c 61 72 20     as a regular 
08f0: 64 61 74 61 62 61 73 65 20 63 68 65 63 6b 70 6f  database checkpo
0900: 69 6e 74 2c 20 65 78 63 65 70 74 20 74 68 61 74  int, except that
0910: 20 61 20 73 69 6e 67 6c 65 20 66 72 61 6d 65 20   a single frame 
0920: 69 73 0a 2a 2a 20 20 20 20 20 63 68 65 63 6b 70  is.**     checkp
0930: 6f 69 6e 74 65 64 20 65 61 63 68 20 74 69 6d 65  ointed each time
0940: 20 73 71 6c 69 74 65 33 72 62 75 5f 73 74 65 70   sqlite3rbu_step
0950: 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 20 49 66  () is called. If
0960: 20 74 68 65 20 52 42 55 0a 2a 2a 20 20 20 20 20   the RBU.**     
0970: 68 61 6e 64 6c 65 20 69 73 20 63 6c 6f 73 65 64  handle is closed
0980: 20 62 65 66 6f 72 65 20 74 68 65 20 65 6e 74 69   before the enti
0990: 72 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 69 73  re *-wal file is
09a0: 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 2c 0a 2a   checkpointed,.*
09b0: 2a 20 20 20 20 20 74 68 65 20 63 68 65 63 6b 70  *     the checkp
09c0: 6f 69 6e 74 20 70 72 6f 67 72 65 73 73 20 69 73  oint progress is
09d0: 20 73 61 76 65 64 20 69 6e 20 74 68 65 20 52 42   saved in the RB
09e0: 55 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74  U database and t
09f0: 68 65 0a 2a 2a 20 20 20 20 20 63 68 65 63 6b 70  he.**     checkp
0a00: 6f 69 6e 74 20 63 61 6e 20 62 65 20 72 65 73 75  oint can be resu
0a10: 6d 65 64 20 62 79 20 61 6e 6f 74 68 65 72 20 52  med by another R
0a20: 42 55 20 63 6c 69 65 6e 74 20 61 74 20 73 6f 6d  BU client at som
0a30: 65 20 70 6f 69 6e 74 20 69 6e 0a 2a 2a 20 20 20  e point in.**   
0a40: 20 20 74 68 65 20 66 75 74 75 72 65 2e 0a 2a 2a    the future..**
0a50: 0a 2a 2a 20 50 4f 54 45 4e 54 49 41 4c 20 50 52  .** POTENTIAL PR
0a60: 4f 42 4c 45 4d 53 0a 2a 2a 20 0a 2a 2a 20 20 54  OBLEMS.** .**  T
0a70: 68 65 20 72 65 6e 61 6d 65 28 29 20 63 61 6c 6c  he rename() call
0a80: 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 70 6f   might not be po
0a90: 72 74 61 62 6c 65 2e 20 41 6e 64 20 52 42 55 20  rtable. And RBU 
0aa0: 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  is not currently
0ab0: 0a 2a 2a 20 20 73 79 6e 63 69 6e 67 20 74 68 65  .**  syncing the
0ac0: 20 64 69 72 65 63 74 6f 72 79 20 61 66 74 65 72   directory after
0ad0: 20 72 65 6e 61 6d 69 6e 67 20 74 68 65 20 66 69   renaming the fi
0ae0: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 57 68 65 6e 20  le..**.**  When 
0af0: 73 74 61 74 65 20 69 73 20 73 61 76 65 64 2c 20  state is saved, 
0b00: 61 6e 79 20 63 6f 6d 6d 69 74 20 74 6f 20 74 68  any commit to th
0b10: 65 20 2a 2d 6f 61 6c 20 66 69 6c 65 20 61 6e 64  e *-oal file and
0b20: 20 74 68 65 20 63 6f 6d 6d 69 74 20 74 6f 0a 2a   the commit to.*
0b30: 2a 20 20 74 68 65 20 52 42 55 20 75 70 64 61 74  *  the RBU updat
0b40: 65 20 64 61 74 61 62 61 73 65 20 61 72 65 20 6e  e database are n
0b50: 6f 74 20 61 74 6f 6d 69 63 2e 20 53 6f 20 69 66  ot atomic. So if
0b60: 20 74 68 65 20 70 6f 77 65 72 20 66 61 69 6c 73   the power fails
0b70: 20 61 74 20 74 68 65 0a 2a 2a 20 20 77 72 6f 6e   at the.**  wron
0b80: 67 20 6d 6f 6d 65 6e 74 20 74 68 65 79 20 6d 69  g moment they mi
0b90: 67 68 74 20 67 65 74 20 6f 75 74 20 6f 66 20 73  ght get out of s
0ba0: 79 6e 63 2e 20 41 73 20 74 68 65 20 6d 61 69 6e  ync. As the main
0bb0: 20 64 61 74 61 62 61 73 65 20 77 69 6c 6c 20 62   database will b
0bc0: 65 0a 2a 2a 20 20 63 6f 6d 6d 69 74 74 65 64 20  e.**  committed 
0bd0: 62 65 66 6f 72 65 20 74 68 65 20 52 42 55 20 75  before the RBU u
0be0: 70 64 61 74 65 20 64 61 74 61 62 61 73 65 20 74  pdate database t
0bf0: 68 69 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20  his will likely 
0c00: 65 69 74 68 65 72 20 6a 75 73 74 0a 2a 2a 20 20  either just.**  
0c10: 70 61 73 73 20 75 6e 6e 6f 74 69 63 65 64 2c 20  pass unnoticed, 
0c20: 6f 72 20 72 65 73 75 6c 74 20 69 6e 20 53 51 4c  or result in SQL
0c30: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 65  ITE_CONSTRAINT e
0c40: 72 72 6f 72 73 20 28 64 75 65 20 74 6f 20 55 4e  rrors (due to UN
0c50: 49 51 55 45 0a 2a 2a 20 20 63 6f 6e 73 74 72 61  IQUE.**  constra
0c60: 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 73 29 2e  int violations).
0c70: 0a 2a 2a 0a 2a 2a 20 20 49 66 20 73 6f 6d 65 20  .**.**  If some 
0c80: 63 6c 69 65 6e 74 20 64 6f 65 73 20 6d 6f 64 69  client does modi
0c90: 66 79 20 74 68 65 20 74 61 72 67 65 74 20 64 61  fy the target da
0ca0: 74 61 62 61 73 65 20 6d 69 64 20 52 42 55 20 75  tabase mid RBU u
0cb0: 70 64 61 74 65 2c 20 6f 72 20 73 6f 6d 65 0a 2a  pdate, or some.*
0cc0: 2a 20 20 6f 74 68 65 72 20 65 72 72 6f 72 20 6f  *  other error o
0cd0: 63 63 75 72 73 2c 20 74 68 65 20 52 42 55 20 65  ccurs, the RBU e
0ce0: 78 74 65 6e 73 69 6f 6e 20 77 69 6c 6c 20 6b 65  xtension will ke
0cf0: 65 70 20 74 68 72 6f 77 69 6e 67 20 65 72 72 6f  ep throwing erro
0d00: 72 73 2e 20 49 74 27 73 0a 2a 2a 20 20 6e 6f 74  rs. It's.**  not
0d10: 20 72 65 61 6c 6c 79 20 63 6c 65 61 72 20 68 6f   really clear ho
0d20: 77 20 74 6f 20 67 65 74 20 6f 75 74 20 6f 66 20  w to get out of 
0d30: 74 68 69 73 20 73 74 61 74 65 2e 20 54 68 65 20  this state. The 
0d40: 73 79 73 74 65 6d 20 63 6f 75 6c 64 20 6a 75 73  system could jus
0d50: 74 0a 2a 2a 20 20 62 79 20 64 65 6c 65 74 65 20  t.**  by delete 
0d60: 74 68 65 20 52 42 55 20 75 70 64 61 74 65 20 64  the RBU update d
0d70: 61 74 61 62 61 73 65 20 61 6e 64 20 2a 2d 6f 61  atabase and *-oa
0d80: 6c 20 66 69 6c 65 20 61 6e 64 20 68 61 76 65 20  l file and have 
0d90: 74 68 65 20 64 65 76 69 63 65 0a 2a 2a 20 20 64  the device.**  d
0da0: 6f 77 6e 6c 6f 61 64 20 74 68 65 20 75 70 64 61  ownload the upda
0db0: 74 65 20 61 67 61 69 6e 20 61 6e 64 20 73 74 61  te again and sta
0dc0: 72 74 20 6f 76 65 72 2e 0a 2a 2a 0a 2a 2a 20 20  rt over..**.**  
0dd0: 41 74 20 70 72 65 73 65 6e 74 2c 20 66 6f 72 20  At present, for 
0de0: 61 6e 20 55 50 44 41 54 45 2c 20 62 6f 74 68 20  an UPDATE, both 
0df0: 74 68 65 20 6e 65 77 2e 2a 20 61 6e 64 20 6f 6c  the new.* and ol
0e00: 64 2e 2a 20 72 65 63 6f 72 64 73 20 61 72 65 0a  d.* records are.
0e10: 2a 2a 20 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e  **  collected in
0e20: 20 74 68 65 20 72 62 75 5f 78 79 7a 20 74 61 62   the rbu_xyz tab
0e30: 6c 65 2e 20 41 6e 64 20 66 6f 72 20 62 6f 74 68  le. And for both
0e40: 20 55 50 44 41 54 45 73 20 61 6e 64 20 44 45 4c   UPDATEs and DEL
0e50: 45 54 45 73 20 61 6c 6c 0a 2a 2a 20 20 66 69 65  ETEs all.**  fie
0e60: 6c 64 73 20 61 72 65 20 63 6f 6c 6c 65 63 74 65  lds are collecte
0e70: 64 2e 20 20 54 68 69 73 20 6d 65 61 6e 73 20 77  d.  This means w
0e80: 65 27 72 65 20 70 72 6f 62 61 62 6c 79 20 77 72  e're probably wr
0e90: 69 74 69 6e 67 20 61 20 6c 6f 74 20 6d 6f 72 65  iting a lot more
0ea0: 0a 2a 2a 20 20 64 61 74 61 20 74 6f 20 64 69 73  .**  data to dis
0eb0: 6b 20 77 68 65 6e 20 73 61 76 69 6e 67 20 74 68  k when saving th
0ec0: 65 20 73 74 61 74 65 20 6f 66 20 61 6e 20 6f 6e  e state of an on
0ed0: 67 6f 69 6e 67 20 75 70 64 61 74 65 20 74 6f 20  going update to 
0ee0: 74 68 65 20 52 42 55 0a 2a 2a 20 20 75 70 64 61  the RBU.**  upda
0ef0: 74 65 20 64 61 74 61 62 61 73 65 20 74 68 61 6e  te database than
0f00: 20 69 73 20 73 74 72 69 63 74 6c 79 20 6e 65 63   is strictly nec
0f10: 65 73 73 61 72 79 2e 0a 2a 2a 20 0a 2a 2f 0a 0a  essary..** .*/..
0f20: 23 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74  #include <assert
0f30: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74  .h>.#include <st
0f40: 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  ring.h>.#include
0f50: 20 3c 73 74 64 69 6f 2e 68 3e 0a 0a 23 69 6e 63   <stdio.h>..#inc
0f60: 6c 75 64 65 20 22 73 71 6c 69 74 65 33 2e 68 22  lude "sqlite3.h"
0f70: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
0f80: 51 4c 49 54 45 5f 43 4f 52 45 29 20 7c 7c 20 64  QLITE_CORE) || d
0f90: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
0fa0: 41 42 4c 45 5f 52 42 55 29 0a 23 69 6e 63 6c 75  ABLE_RBU).#inclu
0fb0: 64 65 20 22 73 71 6c 69 74 65 33 72 62 75 2e 68  de "sqlite3rbu.h
0fc0: 22 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  "..#if defined(_
0fd0: 57 49 4e 33 32 5f 57 43 45 29 0a 23 69 6e 63 6c  WIN32_WCE).#incl
0fe0: 75 64 65 20 22 77 69 6e 64 6f 77 73 2e 68 22 0a  ude "windows.h".
0ff0: 23 65 6e 64 69 66 0a 0a 2f 2a 20 4d 61 78 69 6d  #endif../* Maxim
1000: 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 70 72 65  um number of pre
1010: 70 61 72 65 64 20 55 50 44 41 54 45 20 73 74 61  pared UPDATE sta
1020: 74 65 6d 65 6e 74 73 20 68 65 6c 64 20 62 79 20  tements held by 
1030: 74 68 69 73 20 6d 6f 64 75 6c 65 20 2a 2f 0a 23  this module */.#
1040: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 52 42  define SQLITE_RB
1050: 55 5f 55 50 44 41 54 45 5f 43 41 43 48 45 53 49  U_UPDATE_CACHESI
1060: 5a 45 20 31 36 0a 0a 2f 2a 0a 2a 2a 20 53 77 61  ZE 16../*.** Swa
1070: 70 20 74 77 6f 20 6f 62 6a 65 63 74 73 20 6f 66  p two objects of
1080: 20 74 79 70 65 20 54 59 50 45 2e 0a 2a 2f 0a 23   type TYPE..*/.#
1090: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
10a0: 54 45 5f 41 4d 41 4c 47 41 4d 41 54 49 4f 4e 29  TE_AMALGAMATION)
10b0: 0a 23 20 64 65 66 69 6e 65 20 53 57 41 50 28 54  .# define SWAP(T
10c0: 59 50 45 2c 41 2c 42 29 20 7b 54 59 50 45 20 74  YPE,A,B) {TYPE t
10d0: 3d 41 3b 20 41 3d 42 3b 20 42 3d 74 3b 7d 0a 23  =A; A=B; B=t;}.#
10e0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
10f0: 20 72 62 75 5f 73 74 61 74 65 20 74 61 62 6c 65   rbu_state table
1100: 20 69 73 20 75 73 65 64 20 74 6f 20 73 61 76 65   is used to save
1110: 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 61 20   the state of a 
1120: 70 61 72 74 69 61 6c 6c 79 20 61 70 70 6c 69 65  partially applie
1130: 64 0a 2a 2a 20 75 70 64 61 74 65 20 73 6f 20 74  d.** update so t
1140: 68 61 74 20 69 74 20 63 61 6e 20 62 65 20 72 65  hat it can be re
1150: 73 75 6d 65 64 20 6c 61 74 65 72 2e 20 54 68 65  sumed later. The
1160: 20 74 61 62 6c 65 20 63 6f 6e 73 69 73 74 73 20   table consists 
1170: 6f 66 20 69 6e 74 65 67 65 72 0a 2a 2a 20 6b 65  of integer.** ke
1180: 79 73 20 6d 61 70 70 65 64 20 74 6f 20 76 61 6c  ys mapped to val
1190: 75 65 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ues as follows:.
11a0: 2a 2a 0a 2a 2a 20 52 42 55 5f 53 54 41 54 45 5f  **.** RBU_STATE_
11b0: 53 54 41 47 45 3a 0a 2a 2a 20 20 20 4d 61 79 20  STAGE:.**   May 
11c0: 62 65 20 73 65 74 20 74 6f 20 69 6e 74 65 67 65  be set to intege
11d0: 72 20 76 61 6c 75 65 73 20 31 2c 20 32 2c 20 34  r values 1, 2, 4
11e0: 20 6f 72 20 35 2e 20 41 73 20 66 6f 6c 6c 6f 77   or 5. As follow
11f0: 73 3a 0a 2a 2a 20 20 20 20 20 20 20 31 3a 20 74  s:.**       1: t
1200: 68 65 20 2a 2d 72 62 75 20 66 69 6c 65 20 69 73  he *-rbu file is
1210: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
1220: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a   construction..*
1230: 2a 20 20 20 20 20 20 20 32 3a 20 74 68 65 20 2a  *       2: the *
1240: 2d 72 62 75 20 66 69 6c 65 20 68 61 73 20 62 65  -rbu file has be
1250: 65 6e 20 63 6f 6e 73 74 72 75 63 74 65 64 2c 20  en constructed, 
1260: 62 75 74 20 6e 6f 74 20 79 65 74 20 6d 6f 76 65  but not yet move
1270: 64 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 74  d .**          t
1280: 6f 20 74 68 65 20 2a 2d 77 61 6c 20 70 61 74 68  o the *-wal path
1290: 2e 0a 2a 2a 20 20 20 20 20 20 20 34 3a 20 74 68  ..**       4: th
12a0: 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 73 20  e checkpoint is 
12b0: 75 6e 64 65 72 77 61 79 2e 0a 2a 2a 20 20 20 20  underway..**    
12c0: 20 20 20 35 3a 20 74 68 65 20 72 62 75 20 75 70     5: the rbu up
12d0: 64 61 74 65 20 68 61 73 20 62 65 65 6e 20 63 68  date has been ch
12e0: 65 63 6b 70 6f 69 6e 74 65 64 2e 0a 2a 2a 0a 2a  eckpointed..**.*
12f0: 2a 20 52 42 55 5f 53 54 41 54 45 5f 54 42 4c 3a  * RBU_STATE_TBL:
1300: 0a 2a 2a 20 20 20 4f 6e 6c 79 20 76 61 6c 69 64  .**   Only valid
1310: 20 69 66 20 53 54 41 47 45 3d 3d 31 2e 20 54 68   if STAGE==1. Th
1320: 65 20 74 61 72 67 65 74 20 64 61 74 61 62 61 73  e target databas
1330: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
1340: 62 6c 65 20 0a 2a 2a 20 20 20 63 75 72 72 65 6e  ble .**   curren
1350: 74 6c 79 20 62 65 69 6e 67 20 77 72 69 74 74 65  tly being writte
1360: 6e 2e 0a 2a 2a 0a 2a 2a 20 52 42 55 5f 53 54 41  n..**.** RBU_STA
1370: 54 45 5f 49 44 58 3a 0a 2a 2a 20 20 20 4f 6e 6c  TE_IDX:.**   Onl
1380: 79 20 76 61 6c 69 64 20 69 66 20 53 54 41 47 45  y valid if STAGE
1390: 3d 3d 31 2e 20 54 68 65 20 74 61 72 67 65 74 20  ==1. The target 
13a0: 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 6f 66  database name of
13b0: 20 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20 20   the index .**  
13c0: 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67   currently being
13d0: 20 77 72 69 74 74 65 6e 2c 20 6f 72 20 4e 55 4c   written, or NUL
13e0: 4c 20 69 66 20 74 68 65 20 6d 61 69 6e 20 74 61  L if the main ta
13f0: 62 6c 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ble is currently
1400: 20 62 65 69 6e 67 0a 2a 2a 20 20 20 75 70 64 61   being.**   upda
1410: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 42 55 5f 53  ted..**.** RBU_S
1420: 54 41 54 45 5f 52 4f 57 3a 0a 2a 2a 20 20 20 4f  TATE_ROW:.**   O
1430: 6e 6c 79 20 76 61 6c 69 64 20 69 66 20 53 54 41  nly valid if STA
1440: 47 45 3d 3d 31 2e 20 4e 75 6d 62 65 72 20 6f 66  GE==1. Number of
1450: 20 72 6f 77 73 20 61 6c 72 65 61 64 79 20 70 72   rows already pr
1460: 6f 63 65 73 73 65 64 20 66 6f 72 20 74 68 65 20  ocessed for the 
1470: 63 75 72 72 65 6e 74 0a 2a 2a 20 20 20 74 61 62  current.**   tab
1480: 6c 65 2f 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20  le/index..**.** 
1490: 52 42 55 5f 53 54 41 54 45 5f 50 52 4f 47 52 45  RBU_STATE_PROGRE
14a0: 53 53 3a 0a 2a 2a 20 20 20 54 72 62 75 6c 20 6e  SS:.**   Trbul n
14b0: 75 6d 62 65 72 20 6f 66 20 73 71 6c 69 74 65 33  umber of sqlite3
14c0: 72 62 75 5f 73 74 65 70 28 29 20 63 61 6c 6c 73  rbu_step() calls
14d0: 20 6d 61 64 65 20 73 6f 20 66 61 72 20 61 73 20   made so far as 
14e0: 70 61 72 74 20 6f 66 20 74 68 69 73 0a 2a 2a 20  part of this.** 
14f0: 20 20 72 62 75 20 75 70 64 61 74 65 2e 0a 2a 2a    rbu update..**
1500: 0a 2a 2a 20 52 42 55 5f 53 54 41 54 45 5f 43 4b  .** RBU_STATE_CK
1510: 50 54 3a 0a 2a 2a 20 20 20 56 61 6c 69 64 20 69  PT:.**   Valid i
1520: 66 20 53 54 41 47 45 3d 3d 34 2e 20 54 68 65 20  f STAGE==4. The 
1530: 36 34 2d 62 69 74 20 63 68 65 63 6b 73 75 6d 20  64-bit checksum 
1540: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1550: 74 68 65 20 77 61 6c 2d 69 6e 64 65 78 0a 2a 2a  the wal-index.**
1560: 20 20 20 68 65 61 64 65 72 20 63 72 65 61 74 65     header create
1570: 64 20 62 79 20 72 65 63 6f 76 65 72 69 6e 67 20  d by recovering 
1580: 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 2e 20  the *-wal file. 
1590: 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20  This is used to 
15a0: 64 65 74 65 63 74 0a 2a 2a 20 20 20 63 61 73 65  detect.**   case
15b0: 73 20 77 68 65 6e 20 61 6e 6f 74 68 65 72 20 63  s when another c
15c0: 6c 69 65 6e 74 20 61 70 70 65 6e 64 73 20 66 72  lient appends fr
15d0: 61 6d 65 73 20 74 6f 20 74 68 65 20 2a 2d 77 61  ames to the *-wa
15e0: 6c 20 66 69 6c 65 20 69 6e 20 74 68 65 0a 2a 2a  l file in the.**
15f0: 20 20 20 6d 69 64 64 6c 65 20 6f 66 20 61 6e 20     middle of an 
1600: 69 6e 63 72 65 6d 65 6e 74 61 6c 20 63 68 65 63  incremental chec
1610: 6b 70 6f 69 6e 74 20 28 61 6e 20 69 6e 63 72 65  kpoint (an incre
1620: 6d 65 6e 74 61 6c 20 63 68 65 63 6b 70 6f 69 6e  mental checkpoin
1630: 74 20 63 61 6e 6e 6f 74 0a 2a 2a 20 20 20 62 65  t cannot.**   be
1640: 20 63 6f 6e 74 69 6e 75 65 64 20 69 66 20 74 68   continued if th
1650: 69 73 20 68 61 70 70 65 6e 73 29 2e 0a 2a 2a 0a  is happens)..**.
1660: 2a 2a 20 52 42 55 5f 53 54 41 54 45 5f 43 4f 4f  ** RBU_STATE_COO
1670: 4b 49 45 3a 0a 2a 2a 20 20 20 56 61 6c 69 64 20  KIE:.**   Valid 
1680: 69 66 20 53 54 41 47 45 3d 3d 31 2e 20 54 68 65  if STAGE==1. The
1690: 20 63 75 72 72 65 6e 74 20 63 68 61 6e 67 65 2d   current change-
16a0: 63 6f 75 6e 74 65 72 20 63 6f 6f 6b 69 65 20 76  counter cookie v
16b0: 61 6c 75 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20  alue in the .** 
16c0: 20 20 74 61 72 67 65 74 20 64 62 20 66 69 6c 65    target db file
16d0: 2e 0a 2a 2a 0a 2a 2a 20 52 42 55 5f 53 54 41 54  ..**.** RBU_STAT
16e0: 45 5f 4f 41 4c 53 5a 3a 0a 2a 2a 20 20 20 56 61  E_OALSZ:.**   Va
16f0: 6c 69 64 20 69 66 20 53 54 41 47 45 3d 3d 31 2e  lid if STAGE==1.
1700: 20 54 68 65 20 73 69 7a 65 20 69 6e 20 62 79 74   The size in byt
1710: 65 73 20 6f 66 20 74 68 65 20 2a 2d 6f 61 6c 20  es of the *-oal 
1720: 66 69 6c 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  file..*/.#define
1730: 20 52 42 55 5f 53 54 41 54 45 5f 53 54 41 47 45   RBU_STATE_STAGE
1740: 20 20 20 20 20 20 20 20 31 0a 23 64 65 66 69 6e          1.#defin
1750: 65 20 52 42 55 5f 53 54 41 54 45 5f 54 42 4c 20  e RBU_STATE_TBL 
1760: 20 20 20 20 20 20 20 20 20 32 0a 23 64 65 66 69           2.#defi
1770: 6e 65 20 52 42 55 5f 53 54 41 54 45 5f 49 44 58  ne RBU_STATE_IDX
1780: 20 20 20 20 20 20 20 20 20 20 33 0a 23 64 65 66            3.#def
1790: 69 6e 65 20 52 42 55 5f 53 54 41 54 45 5f 52 4f  ine RBU_STATE_RO
17a0: 57 20 20 20 20 20 20 20 20 20 20 34 0a 23 64 65  W          4.#de
17b0: 66 69 6e 65 20 52 42 55 5f 53 54 41 54 45 5f 50  fine RBU_STATE_P
17c0: 52 4f 47 52 45 53 53 20 20 20 20 20 35 0a 23 64  ROGRESS     5.#d
17d0: 65 66 69 6e 65 20 52 42 55 5f 53 54 41 54 45 5f  efine RBU_STATE_
17e0: 43 4b 50 54 20 20 20 20 20 20 20 20 20 36 0a 23  CKPT         6.#
17f0: 64 65 66 69 6e 65 20 52 42 55 5f 53 54 41 54 45  define RBU_STATE
1800: 5f 43 4f 4f 4b 49 45 20 20 20 20 20 20 20 37 0a  _COOKIE       7.
1810: 23 64 65 66 69 6e 65 20 52 42 55 5f 53 54 41 54  #define RBU_STAT
1820: 45 5f 4f 41 4c 53 5a 20 20 20 20 20 20 20 20 38  E_OALSZ        8
1830: 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 53 54 41  .#define RBU_STA
1840: 54 45 5f 50 48 41 53 45 4f 4e 45 53 54 45 50 20  TE_PHASEONESTEP 
1850: 39 0a 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 53  9..#define RBU_S
1860: 54 41 47 45 5f 4f 41 4c 20 20 20 20 20 20 20 20  TAGE_OAL        
1870: 20 31 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 53   1.#define RBU_S
1880: 54 41 47 45 5f 4d 4f 56 45 20 20 20 20 20 20 20  TAGE_MOVE       
1890: 20 32 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 53   2.#define RBU_S
18a0: 54 41 47 45 5f 43 41 50 54 55 52 45 20 20 20 20  TAGE_CAPTURE    
18b0: 20 33 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 53   3.#define RBU_S
18c0: 54 41 47 45 5f 43 4b 50 54 20 20 20 20 20 20 20  TAGE_CKPT       
18d0: 20 34 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 53   4.#define RBU_S
18e0: 54 41 47 45 5f 44 4f 4e 45 20 20 20 20 20 20 20  TAGE_DONE       
18f0: 20 35 0a 0a 0a 23 64 65 66 69 6e 65 20 52 42 55   5...#define RBU
1900: 5f 43 52 45 41 54 45 5f 53 54 41 54 45 20 5c 0a  _CREATE_STATE \.
1910: 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20    "CREATE TABLE 
1920: 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20 25 73  IF NOT EXISTS %s
1930: 2e 72 62 75 5f 73 74 61 74 65 28 6b 20 49 4e 54  .rbu_state(k INT
1940: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
1950: 2c 20 76 29 22 0a 0a 74 79 70 65 64 65 66 20 73  , v)"..typedef s
1960: 74 72 75 63 74 20 52 62 75 46 72 61 6d 65 20 52  truct RbuFrame R
1970: 62 75 46 72 61 6d 65 3b 0a 74 79 70 65 64 65 66  buFrame;.typedef
1980: 20 73 74 72 75 63 74 20 52 62 75 4f 62 6a 49 74   struct RbuObjIt
1990: 65 72 20 52 62 75 4f 62 6a 49 74 65 72 3b 0a 74  er RbuObjIter;.t
19a0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 52 62  ypedef struct Rb
19b0: 75 53 74 61 74 65 20 52 62 75 53 74 61 74 65 3b  uState RbuState;
19c0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
19d0: 72 62 75 5f 76 66 73 20 72 62 75 5f 76 66 73 3b  rbu_vfs rbu_vfs;
19e0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
19f0: 72 62 75 5f 66 69 6c 65 20 72 62 75 5f 66 69 6c  rbu_file rbu_fil
1a00: 65 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  e;.typedef struc
1a10: 74 20 52 62 75 55 70 64 61 74 65 53 74 6d 74 20  t RbuUpdateStmt 
1a20: 52 62 75 55 70 64 61 74 65 53 74 6d 74 3b 0a 0a  RbuUpdateStmt;..
1a30: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
1a40: 49 54 45 5f 41 4d 41 4c 47 41 4d 41 54 49 4f 4e  ITE_AMALGAMATION
1a50: 29 0a 74 79 70 65 64 65 66 20 75 6e 73 69 67 6e  ).typedef unsign
1a60: 65 64 20 69 6e 74 20 75 33 32 3b 0a 74 79 70 65  ed int u32;.type
1a70: 64 65 66 20 75 6e 73 69 67 6e 65 64 20 73 68 6f  def unsigned sho
1a80: 72 74 20 75 31 36 3b 0a 74 79 70 65 64 65 66 20  rt u16;.typedef 
1a90: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 75 38  unsigned char u8
1aa0: 3b 0a 74 79 70 65 64 65 66 20 73 71 6c 69 74 65  ;.typedef sqlite
1ab0: 33 5f 69 6e 74 36 34 20 69 36 34 3b 0a 23 65 6e  3_int64 i64;.#en
1ac0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65  dif../*.** These
1ad0: 20 76 61 6c 75 65 73 20 6d 75 73 74 20 6d 61 74   values must mat
1ae0: 63 68 20 74 68 65 20 76 61 6c 75 65 73 20 64 65  ch the values de
1af0: 66 69 6e 65 64 20 69 6e 20 77 61 6c 2e 63 20 66  fined in wal.c f
1b00: 6f 72 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e  or the equivalen
1b10: 74 0a 2a 2a 20 6c 6f 63 6b 73 2e 20 54 68 65 73  t.** locks. Thes
1b20: 65 20 61 72 65 20 6e 6f 74 20 6d 61 67 69 63 20  e are not magic 
1b30: 6e 75 6d 62 65 72 73 20 61 73 20 74 68 65 79 20  numbers as they 
1b40: 61 72 65 20 70 61 72 74 20 6f 66 20 74 68 65 20  are part of the 
1b50: 53 51 4c 69 74 65 20 66 69 6c 65 0a 2a 2a 20 66  SQLite file.** f
1b60: 6f 72 6d 61 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e  ormat..*/.#defin
1b70: 65 20 57 41 4c 5f 4c 4f 43 4b 5f 57 52 49 54 45  e WAL_LOCK_WRITE
1b80: 20 20 30 0a 23 64 65 66 69 6e 65 20 57 41 4c 5f    0.#define WAL_
1b90: 4c 4f 43 4b 5f 43 4b 50 54 20 20 20 31 0a 23 64  LOCK_CKPT   1.#d
1ba0: 65 66 69 6e 65 20 57 41 4c 5f 4c 4f 43 4b 5f 52  efine WAL_LOCK_R
1bb0: 45 41 44 30 20 20 33 0a 0a 23 64 65 66 69 6e 65  EAD0  3..#define
1bc0: 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 52 42   SQLITE_FCNTL_RB
1bd0: 55 43 4e 54 20 20 20 20 35 31 34 39 32 31 36 0a  UCNT    5149216.
1be0: 0a 2f 2a 0a 2a 2a 20 41 20 73 74 72 75 63 74 75  ./*.** A structu
1bf0: 72 65 20 74 6f 20 73 74 6f 72 65 20 76 61 6c 75  re to store valu
1c00: 65 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  es read from the
1c10: 20 72 62 75 5f 73 74 61 74 65 20 74 61 62 6c 65   rbu_state table
1c20: 20 69 6e 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73   in memory..*/.s
1c30: 74 72 75 63 74 20 52 62 75 53 74 61 74 65 20 7b  truct RbuState {
1c40: 0a 20 20 69 6e 74 20 65 53 74 61 67 65 3b 0a 20  .  int eStage;. 
1c50: 20 63 68 61 72 20 2a 7a 54 62 6c 3b 0a 20 20 63   char *zTbl;.  c
1c60: 68 61 72 20 2a 7a 49 64 78 3b 0a 20 20 69 36 34  har *zIdx;.  i64
1c70: 20 69 57 61 6c 43 6b 73 75 6d 3b 0a 20 20 69 6e   iWalCksum;.  in
1c80: 74 20 6e 52 6f 77 3b 0a 20 20 69 36 34 20 6e 50  t nRow;.  i64 nP
1c90: 72 6f 67 72 65 73 73 3b 0a 20 20 75 33 32 20 69  rogress;.  u32 i
1ca0: 43 6f 6f 6b 69 65 3b 0a 20 20 69 36 34 20 69 4f  Cookie;.  i64 iO
1cb0: 61 6c 53 7a 3b 0a 20 20 69 36 34 20 6e 50 68 61  alSz;.  i64 nPha
1cc0: 73 65 4f 6e 65 53 74 65 70 3b 0a 7d 3b 0a 0a 73  seOneStep;.};..s
1cd0: 74 72 75 63 74 20 52 62 75 55 70 64 61 74 65 53  truct RbuUpdateS
1ce0: 74 6d 74 20 7b 0a 20 20 63 68 61 72 20 2a 7a 4d  tmt {.  char *zM
1cf0: 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
1d00: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20          /* Copy 
1d10: 6f 66 20 75 70 64 61 74 65 20 6d 61 73 6b 20 75  of update mask u
1d20: 73 65 64 20 77 69 74 68 20 70 55 70 64 61 74 65  sed with pUpdate
1d30: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
1d40: 6d 74 20 2a 70 55 70 64 61 74 65 3b 20 20 20 20  mt *pUpdate;    
1d50: 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 75 70        /* Last up
1d60: 64 61 74 65 20 73 74 61 74 65 6d 65 6e 74 20 28  date statement (
1d70: 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 52 62  or NULL) */.  Rb
1d80: 75 55 70 64 61 74 65 53 74 6d 74 20 2a 70 4e 65  uUpdateStmt *pNe
1d90: 78 74 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e  xt;.};../*.** An
1da0: 20 69 74 65 72 61 74 6f 72 20 6f 66 20 74 68 69   iterator of thi
1db0: 73 20 74 79 70 65 20 69 73 20 75 73 65 64 20 74  s type is used t
1dc0: 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
1dd0: 68 20 61 6c 6c 20 6f 62 6a 65 63 74 73 20 69 6e  h all objects in
1de0: 0a 2a 2a 20 74 68 65 20 74 61 72 67 65 74 20 64  .** the target d
1df0: 61 74 61 62 61 73 65 20 74 68 61 74 20 72 65 71  atabase that req
1e00: 75 69 72 65 20 75 70 64 61 74 69 6e 67 2e 20 46  uire updating. F
1e10: 6f 72 20 65 61 63 68 20 73 75 63 68 20 74 61 62  or each such tab
1e20: 6c 65 2c 20 74 68 65 0a 2a 2a 20 69 74 65 72 61  le, the.** itera
1e30: 74 6f 72 20 76 69 73 69 74 73 2c 20 69 6e 20 6f  tor visits, in o
1e40: 72 64 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  rder:.**.**     
1e50: 2a 20 74 68 65 20 74 61 62 6c 65 20 69 74 73 65  * the table itse
1e60: 6c 66 2c 20 0a 2a 2a 20 20 20 20 20 2a 20 65 61  lf, .**     * ea
1e70: 63 68 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  ch index of the 
1e80: 74 61 62 6c 65 20 28 7a 65 72 6f 20 6f 72 20 6d  table (zero or m
1e90: 6f 72 65 20 70 6f 69 6e 74 73 20 74 6f 20 76 69  ore points to vi
1ea0: 73 69 74 29 2c 20 61 6e 64 0a 2a 2a 20 20 20 20  sit), and.**    
1eb0: 20 2a 20 61 20 73 70 65 63 69 61 6c 20 22 63 6c   * a special "cl
1ec0: 65 61 6e 75 70 20 74 61 62 6c 65 22 20 73 74 61  eanup table" sta
1ed0: 74 65 2e 0a 2a 2a 0a 2a 2a 20 61 62 49 6e 64 65  te..**.** abInde
1ee0: 78 65 64 3a 0a 2a 2a 20 20 20 49 66 20 74 68 65  xed:.**   If the
1ef0: 20 74 61 62 6c 65 20 68 61 73 20 6e 6f 20 69 6e   table has no in
1f00: 64 65 78 65 73 20 6f 6e 20 69 74 2c 20 61 62 49  dexes on it, abI
1f10: 6e 64 65 78 65 64 20 69 73 20 73 65 74 20 74 6f  ndexed is set to
1f20: 20 4e 55 4c 4c 2e 20 4f 74 68 65 72 77 69 73 65   NULL. Otherwise
1f30: 2c 0a 2a 2a 20 20 20 69 74 20 70 6f 69 6e 74 73  ,.**   it points
1f40: 20 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66 20   to an array of 
1f50: 66 6c 61 67 73 20 6e 54 62 6c 43 6f 6c 20 65 6c  flags nTblCol el
1f60: 65 6d 65 6e 74 73 20 69 6e 20 73 69 7a 65 2e 20  ements in size. 
1f70: 54 68 65 20 66 6c 61 67 20 69 73 0a 2a 2a 20 20  The flag is.**  
1f80: 20 73 65 74 20 66 6f 72 20 65 61 63 68 20 63 6f   set for each co
1f90: 6c 75 6d 6e 20 74 68 61 74 20 69 73 20 65 69 74  lumn that is eit
1fa0: 68 65 72 20 61 20 70 61 72 74 20 6f 66 20 74 68  her a part of th
1fb0: 65 20 50 4b 20 6f 72 20 61 20 70 61 72 74 20 6f  e PK or a part o
1fc0: 66 20 61 6e 0a 2a 2a 20 20 20 69 6e 64 65 78 2e  f an.**   index.
1fd0: 20 4f 72 20 63 6c 65 61 72 20 6f 74 68 65 72 77   Or clear otherw
1fe0: 69 73 65 2e 0a 2a 2a 20 20 20 0a 2a 2f 0a 73 74  ise..**   .*/.st
1ff0: 72 75 63 74 20 52 62 75 4f 62 6a 49 74 65 72 20  ruct RbuObjIter 
2000: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
2010: 20 2a 70 54 62 6c 49 74 65 72 3b 20 20 20 20 20   *pTblIter;     
2020: 20 20 20 20 2f 2a 20 49 74 65 72 61 74 65 20 74      /* Iterate t
2030: 68 72 6f 75 67 68 20 74 61 62 6c 65 73 20 2a 2f  hrough tables */
2040: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
2050: 2a 70 49 64 78 49 74 65 72 3b 20 20 20 20 20 20  *pIdxIter;      
2060: 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 74 65 72     /* Index iter
2070: 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 54  ator */.  int nT
2080: 62 6c 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20  blCol;          
2090: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
20a0: 65 20 6f 66 20 61 7a 54 62 6c 43 6f 6c 5b 5d 20  e of azTblCol[] 
20b0: 61 72 72 61 79 20 2a 2f 0a 20 20 63 68 61 72 20  array */.  char 
20c0: 2a 2a 61 7a 54 62 6c 43 6f 6c 3b 20 20 20 20 20  **azTblCol;     
20d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
20e0: 72 61 79 20 6f 66 20 75 6e 71 75 6f 74 65 64 20  ray of unquoted 
20f0: 74 61 72 67 65 74 20 63 6f 6c 75 6d 6e 20 6e 61  target column na
2100: 6d 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  mes */.  char **
2110: 61 7a 54 62 6c 54 79 70 65 3b 20 20 20 20 20 20  azTblType;      
2120: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
2130: 79 20 6f 66 20 74 61 72 67 65 74 20 63 6f 6c 75  y of target colu
2140: 6d 6e 20 74 79 70 65 73 20 2a 2f 0a 20 20 69 6e  mn types */.  in
2150: 74 20 2a 61 69 53 72 63 4f 72 64 65 72 3b 20 20  t *aiSrcOrder;  
2160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2170: 20 73 72 63 20 74 61 62 6c 65 20 63 6f 6c 20 2d   src table col -
2180: 3e 20 74 61 72 67 65 74 20 74 61 62 6c 65 20 63  > target table c
2190: 6f 6c 20 2a 2f 0a 20 20 75 38 20 2a 61 62 54 62  ol */.  u8 *abTb
21a0: 6c 50 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  lPk;            
21b0: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
21c0: 20 6f 66 20 66 6c 61 67 73 2c 20 73 65 74 20 6f   of flags, set o
21d0: 6e 20 74 61 72 67 65 74 20 50 4b 20 63 6f 6c 75  n target PK colu
21e0: 6d 6e 73 20 2a 2f 0a 20 20 75 38 20 2a 61 62 4e  mns */.  u8 *abN
21f0: 6f 74 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20 20  otNull;         
2200: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
2210: 79 20 6f 66 20 66 6c 61 67 73 2c 20 73 65 74 20  y of flags, set 
2220: 6f 6e 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75  on NOT NULL colu
2230: 6d 6e 73 20 2a 2f 0a 20 20 75 38 20 2a 61 62 49  mns */.  u8 *abI
2240: 6e 64 65 78 65 64 3b 20 20 20 20 20 20 20 20 20  ndexed;         
2250: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
2260: 79 20 6f 66 20 66 6c 61 67 73 2c 20 73 65 74 20  y of flags, set 
2270: 6f 6e 20 69 6e 64 65 78 65 64 20 26 20 50 4b 20  on indexed & PK 
2280: 63 6f 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 65 54  cols */.  int eT
2290: 79 70 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ype;            
22a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
22b0: 6c 65 20 74 79 70 65 20 2d 20 61 6e 20 52 42 55  le type - an RBU
22c0: 5f 50 4b 5f 58 58 58 20 76 61 6c 75 65 20 2a 2f  _PK_XXX value */
22d0: 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 76 61  ..  /* Output va
22e0: 72 69 61 62 6c 65 73 2e 20 7a 54 62 6c 3d 3d 30  riables. zTbl==0
22f0: 20 69 6d 70 6c 69 65 73 20 45 4f 46 2e 20 2a 2f   implies EOF. */
2300: 0a 20 20 69 6e 74 20 62 43 6c 65 61 6e 75 70 3b  .  int bCleanup;
2310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2320: 20 20 20 2f 2a 20 54 72 75 65 20 69 6e 20 22 63     /* True in "c
2330: 6c 65 61 6e 75 70 22 20 73 74 61 74 65 20 2a 2f  leanup" state */
2340: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2350: 54 62 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Tbl;            
2360: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 61     /* Name of ta
2370: 72 67 65 74 20 64 62 20 74 61 62 6c 65 20 2a 2f  rget db table */
2380: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2390: 44 61 74 61 54 62 6c 3b 20 20 20 20 20 20 20 20  DataTbl;        
23a0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 72 62     /* Name of rb
23b0: 75 20 64 62 20 74 61 62 6c 65 20 28 6f 72 20 6e  u db table (or n
23c0: 75 6c 6c 29 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ull) */.  const 
23d0: 63 68 61 72 20 2a 7a 49 64 78 3b 20 20 20 20 20  char *zIdx;     
23e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
23f0: 65 20 6f 66 20 74 61 72 67 65 74 20 64 62 20 69  e of target db i
2400: 6e 64 65 78 20 28 6f 72 20 6e 75 6c 6c 29 20 2a  ndex (or null) *
2410: 2f 0a 20 20 69 6e 74 20 69 54 6e 75 6d 3b 20 20  /.  int iTnum;  
2420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2430: 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
2440: 20 6f 66 20 63 75 72 72 65 6e 74 20 6f 62 6a 65   of current obje
2450: 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 50 6b 54  ct */.  int iPkT
2460: 6e 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  num;            
2470: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 65 54          /* If eT
2480: 79 70 65 3d 3d 45 58 54 45 52 4e 41 4c 2c 20 72  ype==EXTERNAL, r
2490: 6f 6f 74 20 6f 66 20 50 4b 20 69 6e 64 65 78 20  oot of PK index 
24a0: 2a 2f 0a 20 20 69 6e 74 20 62 55 6e 69 71 75 65  */.  int bUnique
24b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
24c0: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
24d0: 69 6e 64 65 78 20 69 73 20 75 6e 69 71 75 65 20  index is unique 
24e0: 2a 2f 0a 20 20 69 6e 74 20 6e 49 6e 64 65 78 3b  */.  int nIndex;
24f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2500: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2510: 66 20 61 75 78 2e 20 69 6e 64 65 78 65 73 20 6f  f aux. indexes o
2520: 6e 20 74 61 62 6c 65 20 7a 54 62 6c 20 2a 2f 0a  n table zTbl */.
2530: 0a 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 73  .  /* Statements
2540: 20 63 72 65 61 74 65 64 20 62 79 20 72 62 75 4f   created by rbuO
2550: 62 6a 49 74 65 72 50 72 65 70 61 72 65 41 6c 6c  bjIterPrepareAll
2560: 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c  () */.  int nCol
2570: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2580: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2590: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
25a0: 63 75 72 72 65 6e 74 20 6f 62 6a 65 63 74 20 2a  current object *
25b0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  /.  sqlite3_stmt
25c0: 20 2a 70 53 65 6c 65 63 74 3b 20 20 20 20 20 20   *pSelect;      
25d0: 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 20 64 61      /* Source da
25e0: 74 61 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ta */.  sqlite3_
25f0: 73 74 6d 74 20 2a 70 49 6e 73 65 72 74 3b 20 20  stmt *pInsert;  
2600: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 65          /* State
2610: 6d 65 6e 74 20 66 6f 72 20 49 4e 53 45 52 54 20  ment for INSERT 
2620: 6f 70 65 72 61 74 69 6f 6e 73 20 2a 2f 0a 20 20  operations */.  
2630: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 44  sqlite3_stmt *pD
2640: 65 6c 65 74 65 3b 20 20 20 20 20 20 20 20 20 20  elete;          
2650: 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20 66 6f 72  /* Statement for
2660: 20 44 45 4c 45 54 45 20 6f 70 73 20 2a 2f 0a 20   DELETE ops */. 
2670: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
2680: 54 6d 70 49 6e 73 65 72 74 3b 20 20 20 20 20 20  TmpInsert;      
2690: 20 2f 2a 20 49 6e 73 65 72 74 20 69 6e 74 6f 20   /* Insert into 
26a0: 72 62 75 5f 74 6d 70 5f 24 7a 44 61 74 61 54 62  rbu_tmp_$zDataTb
26b0: 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 4c 61 73 74 20  l */..  /* Last 
26c0: 55 50 44 41 54 45 20 75 73 65 64 20 28 66 6f 72  UPDATE used (for
26d0: 20 50 4b 20 62 2d 74 72 65 65 20 75 70 64 61 74   PK b-tree updat
26e0: 65 73 20 6f 6e 6c 79 29 2c 20 6f 72 20 4e 55 4c  es only), or NUL
26f0: 4c 2e 20 2a 2f 0a 20 20 52 62 75 55 70 64 61 74  L. */.  RbuUpdat
2700: 65 53 74 6d 74 20 2a 70 52 62 75 55 70 64 61 74  eStmt *pRbuUpdat
2710: 65 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c  e;.};../*.** Val
2720: 75 65 73 20 66 6f 72 20 52 62 75 4f 62 6a 49 74  ues for RbuObjIt
2730: 65 72 2e 65 54 79 70 65 0a 2a 2a 0a 2a 2a 20 20  er.eType.**.**  
2740: 20 20 20 30 3a 20 54 61 62 6c 65 20 64 6f 65 73     0: Table does
2750: 20 6e 6f 74 20 65 78 69 73 74 20 28 65 72 72 6f   not exist (erro
2760: 72 29 0a 2a 2a 20 20 20 20 20 31 3a 20 54 61 62  r).**     1: Tab
2770: 6c 65 20 68 61 73 20 61 6e 20 69 6d 70 6c 69 63  le has an implic
2780: 69 74 20 72 6f 77 69 64 2e 0a 2a 2a 20 20 20 20  it rowid..**    
2790: 20 32 3a 20 54 61 62 6c 65 20 68 61 73 20 61 6e   2: Table has an
27a0: 20 65 78 70 6c 69 63 69 74 20 49 50 4b 20 63 6f   explicit IPK co
27b0: 6c 75 6d 6e 2e 0a 2a 2a 20 20 20 20 20 33 3a 20  lumn..**     3: 
27c0: 54 61 62 6c 65 20 68 61 73 20 61 6e 20 65 78 74  Table has an ext
27d0: 65 72 6e 61 6c 20 50 4b 20 69 6e 64 65 78 2e 0a  ernal PK index..
27e0: 2a 2a 20 20 20 20 20 34 3a 20 54 61 62 6c 65 20  **     4: Table 
27f0: 69 73 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44  is WITHOUT ROWID
2800: 2e 0a 2a 2a 20 20 20 20 20 35 3a 20 54 61 62 6c  ..**     5: Tabl
2810: 65 20 69 73 20 61 20 76 69 72 74 75 61 6c 20 74  e is a virtual t
2820: 61 62 6c 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  able..*/.#define
2830: 20 52 42 55 5f 50 4b 5f 4e 4f 54 41 42 4c 45 20   RBU_PK_NOTABLE 
2840: 20 20 20 20 20 20 20 30 0a 23 64 65 66 69 6e 65         0.#define
2850: 20 52 42 55 5f 50 4b 5f 4e 4f 4e 45 20 20 20 20   RBU_PK_NONE    
2860: 20 20 20 20 20 20 20 31 0a 23 64 65 66 69 6e 65         1.#define
2870: 20 52 42 55 5f 50 4b 5f 49 50 4b 20 20 20 20 20   RBU_PK_IPK     
2880: 20 20 20 20 20 20 20 32 0a 23 64 65 66 69 6e 65         2.#define
2890: 20 52 42 55 5f 50 4b 5f 45 58 54 45 52 4e 41 4c   RBU_PK_EXTERNAL
28a0: 20 20 20 20 20 20 20 33 0a 23 64 65 66 69 6e 65         3.#define
28b0: 20 52 42 55 5f 50 4b 5f 57 49 54 48 4f 55 54 5f   RBU_PK_WITHOUT_
28c0: 52 4f 57 49 44 20 20 34 0a 23 64 65 66 69 6e 65  ROWID  4.#define
28d0: 20 52 42 55 5f 50 4b 5f 56 54 41 42 20 20 20 20   RBU_PK_VTAB    
28e0: 20 20 20 20 20 20 20 35 0a 0a 0a 2f 2a 0a 2a 2a         5.../*.**
28f0: 20 57 69 74 68 69 6e 20 74 68 65 20 52 42 55 5f   Within the RBU_
2900: 53 54 41 47 45 5f 4f 41 4c 20 73 74 61 67 65 2c  STAGE_OAL stage,
2910: 20 65 61 63 68 20 63 61 6c 6c 20 74 6f 20 73 71   each call to sq
2920: 6c 69 74 65 33 72 62 75 5f 73 74 65 70 28 29 20  lite3rbu_step() 
2930: 70 65 72 66 6f 72 6d 73 0a 2a 2a 20 6f 6e 65 20  performs.** one 
2940: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
2950: 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2f 0a   operations..*/.
2960: 23 64 65 66 69 6e 65 20 52 42 55 5f 49 4e 53 45  #define RBU_INSE
2970: 52 54 20 20 20 20 20 31 20 20 20 20 20 20 20 20  RT     1        
2980: 20 20 2f 2a 20 49 6e 73 65 72 74 20 6f 6e 20 61    /* Insert on a
2990: 20 6d 61 69 6e 20 74 61 62 6c 65 20 62 2d 74 72   main table b-tr
29a0: 65 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 52 42  ee */.#define RB
29b0: 55 5f 44 45 4c 45 54 45 20 20 20 20 20 32 20 20  U_DELETE     2  
29c0: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74          /* Delet
29d0: 65 20 61 20 72 6f 77 20 66 72 6f 6d 20 61 20 6d  e a row from a m
29e0: 61 69 6e 20 74 61 62 6c 65 20 62 2d 74 72 65 65  ain table b-tree
29f0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 52 42 55 5f   */.#define RBU_
2a00: 52 45 50 4c 41 43 45 20 20 20 20 33 20 20 20 20  REPLACE    3    
2a10: 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20        /* Delete 
2a20: 61 6e 64 20 74 68 65 6e 20 69 6e 73 65 72 74 20  and then insert 
2a30: 61 20 72 6f 77 20 2a 2f 0a 23 64 65 66 69 6e 65  a row */.#define
2a40: 20 52 42 55 5f 49 44 58 5f 44 45 4c 45 54 45 20   RBU_IDX_DELETE 
2a50: 34 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65  4          /* De
2a60: 6c 65 74 65 20 61 20 72 6f 77 20 66 72 6f 6d 20  lete a row from 
2a70: 61 6e 20 61 75 78 2e 20 69 6e 64 65 78 20 62 2d  an aux. index b-
2a80: 74 72 65 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  tree */.#define 
2a90: 52 42 55 5f 49 44 58 5f 49 4e 53 45 52 54 20 35  RBU_IDX_INSERT 5
2aa0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73            /* Ins
2ab0: 65 72 74 20 6f 6e 20 61 6e 20 61 75 78 2e 20 69  ert on an aux. i
2ac0: 6e 64 65 78 20 62 2d 74 72 65 65 20 2a 2f 0a 0a  ndex b-tree */..
2ad0: 23 64 65 66 69 6e 65 20 52 42 55 5f 55 50 44 41  #define RBU_UPDA
2ae0: 54 45 20 20 20 20 20 36 20 20 20 20 20 20 20 20  TE     6        
2af0: 20 20 2f 2a 20 55 70 64 61 74 65 20 61 20 72 6f    /* Update a ro
2b00: 77 20 69 6e 20 61 20 6d 61 69 6e 20 74 61 62 6c  w in a main tabl
2b10: 65 20 62 2d 74 72 65 65 20 2a 2f 0a 0a 2f 2a 0a  e b-tree */../*.
2b20: 2a 2a 20 41 20 73 69 6e 67 6c 65 20 73 74 65 70  ** A single step
2b30: 20 6f 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74   of an increment
2b40: 61 6c 20 63 68 65 63 6b 70 6f 69 6e 74 20 2d 20  al checkpoint - 
2b50: 66 72 61 6d 65 20 69 57 61 6c 46 72 61 6d 65 20  frame iWalFrame 
2b60: 6f 66 20 74 68 65 20 77 61 6c 0a 2a 2a 20 66 69  of the wal.** fi
2b70: 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 70  le should be cop
2b80: 69 65 64 20 74 6f 20 70 61 67 65 20 69 44 62 50  ied to page iDbP
2b90: 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
2ba0: 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 72  ase file..*/.str
2bb0: 75 63 74 20 52 62 75 46 72 61 6d 65 20 7b 0a 20  uct RbuFrame {. 
2bc0: 20 75 33 32 20 69 44 62 50 61 67 65 3b 0a 20 20   u32 iDbPage;.  
2bd0: 75 33 32 20 69 57 61 6c 46 72 61 6d 65 3b 0a 7d  u32 iWalFrame;.}
2be0: 3b 0a 0a 2f 2a 0a 2a 2a 20 52 42 55 20 68 61 6e  ;../*.** RBU han
2bf0: 64 6c 65 2e 0a 2a 2a 0a 2a 2a 20 6e 50 68 61 73  dle..**.** nPhas
2c00: 65 4f 6e 65 53 74 65 70 3a 0a 2a 2a 20 20 20 49  eOneStep:.**   I
2c10: 66 20 74 68 65 20 52 42 55 20 64 61 74 61 62 61  f the RBU databa
2c20: 73 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 72  se contains an r
2c30: 62 75 5f 63 6f 75 6e 74 20 74 61 62 6c 65 2c 20  bu_count table, 
2c40: 74 68 69 73 20 76 61 6c 75 65 20 69 73 20 73 65  this value is se
2c50: 74 20 74 6f 0a 2a 2a 20 20 20 61 20 72 75 6e 6e  t to.**   a runn
2c60: 69 6e 67 20 65 73 74 69 6d 61 74 65 20 6f 66 20  ing estimate of 
2c70: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 2d  the number of b-
2c80: 74 72 65 65 20 6f 70 65 72 61 74 69 6f 6e 73 20  tree operations 
2c90: 72 65 71 75 69 72 65 64 20 74 6f 20 0a 2a 2a 20  required to .** 
2ca0: 20 20 66 69 6e 69 73 68 20 70 6f 70 75 6c 61 74    finish populat
2cb0: 69 6e 67 20 74 68 65 20 2a 2d 6f 61 6c 20 66 69  ing the *-oal fi
2cc0: 6c 65 2e 20 54 68 69 73 20 61 6c 6c 6f 77 73 20  le. This allows 
2cd0: 74 68 65 20 73 71 6c 69 74 65 33 5f 62 70 5f 70  the sqlite3_bp_p
2ce0: 72 6f 67 72 65 73 73 28 29 0a 2a 2a 20 20 20 41  rogress().**   A
2cf0: 50 49 20 74 6f 20 63 61 6c 63 75 6c 61 74 65 20  PI to calculate 
2d00: 74 68 65 20 70 65 72 6d 79 72 69 61 64 61 67 65  the permyriadage
2d10: 20 70 72 6f 67 72 65 73 73 20 6f 66 20 70 6f 70   progress of pop
2d20: 75 6c 61 74 69 6e 67 20 74 68 65 20 2a 2d 6f 61  ulating the *-oa
2d30: 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 75 73 69 6e  l file.**   usin
2d40: 67 20 74 68 65 20 66 6f 72 6d 75 6c 61 3a 0a 2a  g the formula:.*
2d50: 2a 0a 2a 2a 20 20 20 20 20 70 65 72 6d 79 72 69  *.**     permyri
2d60: 61 64 61 67 65 20 3d 20 28 31 30 30 30 30 20 2a  adage = (10000 *
2d70: 20 6e 50 72 6f 67 72 65 73 73 29 20 2f 20 6e 50   nProgress) / nP
2d80: 68 61 73 65 4f 6e 65 53 74 65 70 0a 2a 2a 0a 2a  haseOneStep.**.*
2d90: 2a 20 20 20 6e 50 68 61 73 65 4f 6e 65 53 74 65  *   nPhaseOneSte
2da0: 70 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  p is initialized
2db0: 20 74 6f 20 74 68 65 20 73 75 6d 20 6f 66 3a 0a   to the sum of:.
2dc0: 2a 2a 0a 2a 2a 20 20 20 20 20 6e 52 6f 77 20 2a  **.**     nRow *
2dd0: 20 28 6e 49 6e 64 65 78 20 2b 20 31 29 0a 2a 2a   (nIndex + 1).**
2de0: 0a 2a 2a 20 20 20 66 6f 72 20 61 6c 6c 20 73 6f  .**   for all so
2df0: 75 72 63 65 20 74 61 62 6c 65 73 20 69 6e 20 74  urce tables in t
2e00: 68 65 20 52 42 55 20 64 61 74 61 62 61 73 65 2c  he RBU database,
2e10: 20 77 68 65 72 65 20 6e 52 6f 77 20 69 73 20 74   where nRow is t
2e20: 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 20 20 6f  he number.**   o
2e30: 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 73 6f  f rows in the so
2e40: 75 72 63 65 20 74 61 62 6c 65 20 61 6e 64 20 6e  urce table and n
2e50: 49 6e 64 65 78 20 74 68 65 20 6e 75 6d 62 65 72  Index the number
2e60: 20 6f 66 20 69 6e 64 65 78 65 73 20 6f 6e 20 74   of indexes on t
2e70: 68 65 0a 2a 2a 20 20 20 63 6f 72 72 65 73 70 6f  he.**   correspo
2e80: 6e 64 69 6e 67 20 74 61 72 67 65 74 20 64 61 74  nding target dat
2e90: 61 62 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a  abase table..**.
2ea0: 2a 2a 20 20 20 54 68 69 73 20 65 73 74 69 6d 61  **   This estima
2eb0: 74 65 20 69 73 20 61 63 63 75 72 61 74 65 20 69  te is accurate i
2ec0: 66 20 74 68 65 20 52 42 55 20 75 70 64 61 74 65  f the RBU update
2ed0: 20 63 6f 6e 73 69 73 74 73 20 65 6e 74 69 72 65   consists entire
2ee0: 6c 79 20 6f 66 0a 2a 2a 20 20 20 49 4e 53 45 52  ly of.**   INSER
2ef0: 54 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 48 6f  T operations. Ho
2f00: 77 65 76 65 72 2c 20 69 74 20 69 73 20 69 6e 61  wever, it is ina
2f10: 63 63 75 72 61 74 65 20 69 66 3a 0a 2a 2a 0a 2a  ccurate if:.**.*
2f20: 2a 20 20 20 20 20 2a 20 74 68 65 20 52 42 55 20  *     * the RBU 
2f30: 75 70 64 61 74 65 20 63 6f 6e 74 61 69 6e 73 20  update contains 
2f40: 61 6e 79 20 55 50 44 41 54 45 20 6f 70 65 72 61  any UPDATE opera
2f50: 74 69 6f 6e 73 2e 20 49 66 20 74 68 65 20 50 4b  tions. If the PK
2f60: 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 20 20   specified.**   
2f70: 20 20 20 20 66 6f 72 20 61 6e 20 55 50 44 41 54      for an UPDAT
2f80: 45 20 6f 70 65 72 61 74 69 6f 6e 20 64 6f 65 73  E operation does
2f90: 20 6e 6f 74 20 65 78 69 73 74 20 69 6e 20 74 68   not exist in th
2fa0: 65 20 74 61 72 67 65 74 20 74 61 62 6c 65 2c 20  e target table, 
2fb0: 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20 6e 6f  then.**       no
2fc0: 20 62 2d 74 72 65 65 20 6f 70 65 72 61 74 69 6f   b-tree operatio
2fd0: 6e 73 20 61 72 65 20 72 65 71 75 69 72 65 64 20  ns are required 
2fe0: 6f 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 73  on index b-trees
2ff0: 2e 20 4f 72 20 69 66 20 74 68 65 20 0a 2a 2a 20  . Or if the .** 
3000: 20 20 20 20 20 20 73 70 65 63 69 66 69 65 64 20        specified 
3010: 50 4b 20 64 6f 65 73 20 65 78 69 73 74 2c 20 74  PK does exist, t
3020: 68 65 6e 20 28 6e 49 6e 64 65 78 2a 32 29 20 73  hen (nIndex*2) s
3030: 75 63 68 20 6f 70 65 72 61 74 69 6f 6e 73 20 61  uch operations a
3040: 72 65 0a 2a 2a 20 20 20 20 20 20 20 72 65 71 75  re.**       requ
3050: 69 72 65 64 20 28 6f 6e 65 20 64 65 6c 65 74 65  ired (one delete
3060: 20 61 6e 64 20 6f 6e 65 20 69 6e 73 65 72 74 20   and one insert 
3070: 6f 6e 20 65 61 63 68 20 69 6e 64 65 78 20 62 2d  on each index b-
3080: 74 72 65 65 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  tree)..**.**    
3090: 20 2a 20 74 68 65 20 52 42 55 20 75 70 64 61 74   * the RBU updat
30a0: 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 44  e contains any D
30b0: 45 4c 45 54 45 20 6f 70 65 72 61 74 69 6f 6e 73  ELETE operations
30c0: 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 73   for which the s
30d0: 70 65 63 69 66 69 65 64 0a 2a 2a 20 20 20 20 20  pecified.**     
30e0: 20 20 50 4b 20 64 6f 65 73 20 6e 6f 74 20 65 78    PK does not ex
30f0: 69 73 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ist. In this cas
3100: 65 20 6e 6f 20 6f 70 65 72 61 74 69 6f 6e 73 20  e no operations 
3110: 61 72 65 20 72 65 71 75 69 72 65 64 20 6f 6e 20  are required on 
3120: 69 6e 64 65 78 0a 2a 2a 20 20 20 20 20 20 20 62  index.**       b
3130: 2d 74 72 65 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  -trees..**.**   
3140: 20 20 2a 20 74 68 65 20 52 42 55 20 75 70 64 61    * the RBU upda
3150: 74 65 20 63 6f 6e 74 61 69 6e 73 20 52 45 50 4c  te contains REPL
3160: 41 43 45 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20  ACE operations. 
3170: 54 68 65 73 65 20 61 72 65 20 73 69 6d 69 6c 61  These are simila
3180: 72 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20 55 50  r to.**       UP
3190: 44 41 54 45 20 6f 70 65 72 61 74 69 6f 6e 73 2e  DATE operations.
31a0: 0a 2a 2a 0a 2a 2a 20 20 20 6e 50 68 61 73 65 4f  .**.**   nPhaseO
31b0: 6e 65 53 74 65 70 20 69 73 20 75 70 64 61 74 65  neStep is update
31c0: 64 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72  d to account for
31d0: 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20   the conditions 
31e0: 61 62 6f 76 65 20 64 75 72 69 6e 67 20 74 68 65  above during the
31f0: 0a 2a 2a 20 20 20 66 69 72 73 74 20 70 61 73 73  .**   first pass
3200: 20 6f 66 20 65 61 63 68 20 73 6f 75 72 63 65 20   of each source 
3210: 74 61 62 6c 65 2e 20 54 68 65 20 75 70 64 61 74  table. The updat
3220: 65 64 20 6e 50 68 61 73 65 4f 6e 65 53 74 65 70  ed nPhaseOneStep
3230: 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20 20 20 73   value is.**   s
3240: 74 6f 72 65 64 20 69 6e 20 74 68 65 20 72 62 75  tored in the rbu
3250: 5f 73 74 61 74 65 20 74 61 62 6c 65 20 69 66 20  _state table if 
3260: 74 68 65 20 52 42 55 20 75 70 64 61 74 65 20 69  the RBU update i
3270: 73 20 73 75 73 70 65 6e 64 65 64 2e 0a 2a 2f 0a  s suspended..*/.
3280: 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 72 62  struct sqlite3rb
3290: 75 20 7b 0a 20 20 69 6e 74 20 65 53 74 61 67 65  u {.  int eStage
32a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
32b0: 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f        /* Value o
32c0: 66 20 52 42 55 5f 53 54 41 54 45 5f 53 54 41 47  f RBU_STATE_STAG
32d0: 45 20 66 69 65 6c 64 20 2a 2f 0a 20 20 73 71 6c  E field */.  sql
32e0: 69 74 65 33 20 2a 64 62 4d 61 69 6e 3b 20 20 20  ite3 *dbMain;   
32f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3300: 74 61 72 67 65 74 20 64 61 74 61 62 61 73 65 20  target database 
3310: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 73 71 6c 69  handle */.  sqli
3320: 74 65 33 20 2a 64 62 52 62 75 3b 20 20 20 20 20  te3 *dbRbu;     
3330: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72              /* r
3340: 62 75 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  bu database hand
3350: 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54  le */.  char *zT
3360: 61 72 67 65 74 3b 20 20 20 20 20 20 20 20 20 20  arget;          
3370: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 74 68 20          /* Path 
3380: 74 6f 20 74 61 72 67 65 74 20 64 62 20 2a 2f 0a  to target db */.
3390: 20 20 63 68 61 72 20 2a 7a 52 62 75 3b 20 20 20    char *zRbu;   
33a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33b0: 20 20 2f 2a 20 50 61 74 68 20 74 6f 20 72 62 75    /* Path to rbu
33c0: 20 64 62 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a   db */.  char *z
33d0: 53 74 61 74 65 3b 20 20 20 20 20 20 20 20 20 20  State;          
33e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 74 68           /* Path
33f0: 20 74 6f 20 73 74 61 74 65 20 64 62 20 28 6f 72   to state db (or
3400: 20 4e 55 4c 4c 20 69 66 20 7a 52 62 75 29 20 2a   NULL if zRbu) *
3410: 2f 0a 20 20 63 68 61 72 20 7a 53 74 61 74 65 44  /.  char zStateD
3420: 62 5b 35 5d 3b 20 20 20 20 20 20 20 20 20 20 20  b[5];           
3430: 20 20 20 20 2f 2a 20 44 62 20 6e 61 6d 65 20 66      /* Db name f
3440: 6f 72 20 73 74 61 74 65 20 28 22 73 74 61 74 22  or state ("stat"
3450: 20 6f 72 20 22 6d 61 69 6e 22 29 20 2a 2f 0a 20   or "main") */. 
3460: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
3470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3480: 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e   /* Value return
3490: 65 64 20 62 79 20 6c 61 73 74 20 72 62 75 5f 73  ed by last rbu_s
34a0: 74 65 70 28 29 20 63 61 6c 6c 20 2a 2f 0a 20 20  tep() call */.  
34b0: 63 68 61 72 20 2a 7a 45 72 72 6d 73 67 3b 20 20  char *zErrmsg;  
34c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34d0: 2f 2a 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65  /* Error message
34e0: 20 69 66 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f   if rc!=SQLITE_O
34f0: 4b 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 74 65 70  K */.  int nStep
3500: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3510: 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 70         /* Rows p
3520: 72 6f 63 65 73 73 65 64 20 66 6f 72 20 63 75 72  rocessed for cur
3530: 72 65 6e 74 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  rent object */. 
3540: 20 69 6e 74 20 6e 50 72 6f 67 72 65 73 73 3b 20   int nProgress; 
3550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3560: 20 2f 2a 20 52 6f 77 73 20 70 72 6f 63 65 73 73   /* Rows process
3570: 65 64 20 66 6f 72 20 61 6c 6c 20 6f 62 6a 65 63  ed for all objec
3580: 74 73 20 2a 2f 0a 20 20 52 62 75 4f 62 6a 49 74  ts */.  RbuObjIt
3590: 65 72 20 6f 62 6a 69 74 65 72 3b 20 20 20 20 20  er objiter;     
35a0: 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
35b0: 74 6f 72 20 66 6f 72 20 73 6b 69 70 70 69 6e 67  tor for skipping
35c0: 20 74 68 72 6f 75 67 68 20 74 62 6c 2f 69 64 78   through tbl/idx
35d0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
35e0: 20 2a 7a 56 66 73 4e 61 6d 65 3b 20 20 20 20 20   *zVfsName;     
35f0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
3600: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63   automatically c
3610: 72 65 61 74 65 64 20 72 62 75 20 76 66 73 20 2a  reated rbu vfs *
3620: 2f 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 54  /.  rbu_file *pT
3630: 61 72 67 65 74 46 64 3b 20 20 20 20 20 20 20 20  argetFd;        
3640: 20 20 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64      /* File hand
3650: 6c 65 20 6f 70 65 6e 20 6f 6e 20 74 61 72 67 65  le open on targe
3660: 74 20 64 62 20 2a 2f 0a 20 20 69 36 34 20 69 4f  t db */.  i64 iO
3670: 61 6c 53 7a 3b 0a 20 20 69 36 34 20 6e 50 68 61  alSz;.  i64 nPha
3680: 73 65 4f 6e 65 53 74 65 70 3b 0a 0a 20 20 2f 2a  seOneStep;..  /*
3690: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   The following s
36a0: 74 61 74 65 20 76 61 72 69 61 62 6c 65 73 20 61  tate variables a
36b0: 72 65 20 75 73 65 64 20 61 73 20 70 61 72 74 20  re used as part 
36c0: 6f 66 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74  of the increment
36d0: 61 6c 0a 20 20 2a 2a 20 63 68 65 63 6b 70 6f 69  al.  ** checkpoi
36e0: 6e 74 20 73 74 61 67 65 20 28 65 53 74 61 67 65  nt stage (eStage
36f0: 3d 3d 52 42 55 5f 53 54 41 47 45 5f 43 4b 50 54  ==RBU_STAGE_CKPT
3700: 29 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20  ). See comments 
3710: 73 75 72 72 6f 75 6e 64 69 6e 67 0a 20 20 2a 2a  surrounding.  **
3720: 20 66 75 6e 63 74 69 6f 6e 20 72 62 75 53 65 74   function rbuSet
3730: 75 70 43 68 65 63 6b 70 6f 69 6e 74 28 29 20 66  upCheckpoint() f
3740: 6f 72 20 64 65 74 61 69 6c 73 2e 20 20 2a 2f 0a  or details.  */.
3750: 20 20 75 33 32 20 69 4d 61 78 46 72 61 6d 65 3b    u32 iMaxFrame;
3760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3770: 20 20 2f 2a 20 4c 61 72 67 65 73 74 20 69 57 61    /* Largest iWa
3780: 6c 46 72 61 6d 65 20 76 61 6c 75 65 20 69 6e 20  lFrame value in 
3790: 61 46 72 61 6d 65 5b 5d 20 2a 2f 0a 20 20 75 33  aFrame[] */.  u3
37a0: 32 20 6d 4c 6f 63 6b 3b 0a 20 20 69 6e 74 20 6e  2 mLock;.  int n
37b0: 46 72 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  Frame;          
37c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e             /* En
37d0: 74 72 69 65 73 20 69 6e 20 61 46 72 61 6d 65 5b  tries in aFrame[
37e0: 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74  ] array */.  int
37f0: 20 6e 46 72 61 6d 65 41 6c 6c 6f 63 3b 20 20 20   nFrameAlloc;   
3800: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3810: 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65 20 6f  Allocated size o
3820: 66 20 61 46 72 61 6d 65 5b 5d 20 61 72 72 61 79  f aFrame[] array
3830: 20 2a 2f 0a 20 20 52 62 75 46 72 61 6d 65 20 2a   */.  RbuFrame *
3840: 61 46 72 61 6d 65 3b 0a 20 20 69 6e 74 20 70 67  aFrame;.  int pg
3850: 73 7a 3b 0a 20 20 75 38 20 2a 61 42 75 66 3b 0a  sz;.  u8 *aBuf;.
3860: 20 20 69 36 34 20 69 57 61 6c 43 6b 73 75 6d 3b    i64 iWalCksum;
3870: 0a 0a 20 20 2f 2a 20 55 73 65 64 20 69 6e 20 52  ..  /* Used in R
3880: 42 55 20 76 61 63 75 75 6d 20 6d 6f 64 65 20 6f  BU vacuum mode o
3890: 6e 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 62  nly */.  int nRb
38a0: 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  u;              
38b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
38c0: 65 72 20 6f 66 20 52 42 55 20 56 46 53 20 69 6e  er of RBU VFS in
38d0: 20 74 68 65 20 73 74 61 63 6b 20 2a 2f 0a 20 20   the stack */.  
38e0: 72 62 75 5f 66 69 6c 65 20 2a 70 52 62 75 46 64  rbu_file *pRbuFd
38f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3900: 2f 2a 20 46 64 20 66 6f 72 20 6d 61 69 6e 20 64  /* Fd for main d
3910: 62 20 6f 66 20 64 62 52 62 75 20 2a 2f 0a 7d 3b  b of dbRbu */.};
3920: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 72 62 75 20 56  ../*.** An rbu V
3930: 46 53 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  FS is implemente
3940: 64 20 75 73 69 6e 67 20 61 6e 20 69 6e 73 74 61  d using an insta
3950: 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 75  nce of this stru
3960: 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72 75 63 74  cture..*/.struct
3970: 20 72 62 75 5f 76 66 73 20 7b 0a 20 20 73 71 6c   rbu_vfs {.  sql
3980: 69 74 65 33 5f 76 66 73 20 62 61 73 65 3b 20 20  ite3_vfs base;  
3990: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
39a0: 72 62 75 20 56 46 53 20 73 68 69 6d 20 6d 65 74  rbu VFS shim met
39b0: 68 6f 64 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  hods */.  sqlite
39c0: 33 5f 76 66 73 20 2a 70 52 65 61 6c 56 66 73 3b  3_vfs *pRealVfs;
39d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 64            /* Und
39e0: 65 72 6c 79 69 6e 67 20 56 46 53 20 2a 2f 0a 20  erlying VFS */. 
39f0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
3a00: 6d 75 74 65 78 3b 20 20 20 20 20 20 20 20 20 20  mutex;          
3a10: 20 2f 2a 20 4d 75 74 65 78 20 74 6f 20 70 72 6f   /* Mutex to pro
3a20: 74 65 63 74 20 70 4d 61 69 6e 20 2a 2f 0a 20 20  tect pMain */.  
3a30: 72 62 75 5f 66 69 6c 65 20 2a 70 4d 61 69 6e 3b  rbu_file *pMain;
3a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a50: 2f 2a 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20 6f  /* Linked list o
3a60: 66 20 6d 61 69 6e 20 64 62 20 66 69 6c 65 73 20  f main db files 
3a70: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 45 61 63  */.};../*.** Eac
3a80: 68 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 62 79  h file opened by
3a90: 20 61 6e 20 72 62 75 20 56 46 53 20 69 73 20 72   an rbu VFS is r
3aa0: 65 70 72 65 73 65 6e 74 65 64 20 62 79 20 61 6e  epresented by an
3ab0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 0a 2a 2a 20   instance of.** 
3ac0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
3ad0: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72 75  ructure..*/.stru
3ae0: 63 74 20 72 62 75 5f 66 69 6c 65 20 7b 0a 20 20  ct rbu_file {.  
3af0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 62 61 73  sqlite3_file bas
3b00: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
3b10: 2f 2a 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  /* sqlite3_file 
3b20: 6d 65 74 68 6f 64 73 20 2a 2f 0a 20 20 73 71 6c  methods */.  sql
3b30: 69 74 65 33 5f 66 69 6c 65 20 2a 70 52 65 61 6c  ite3_file *pReal
3b40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
3b50: 55 6e 64 65 72 6c 79 69 6e 67 20 66 69 6c 65 20  Underlying file 
3b60: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 72 62 75 5f  handle */.  rbu_
3b70: 76 66 73 20 2a 70 52 62 75 56 66 73 3b 20 20 20  vfs *pRbuVfs;   
3b80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
3b90: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 72 62  ointer to the rb
3ba0: 75 5f 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a  u_vfs object */.
3bb0: 20 20 73 71 6c 69 74 65 33 72 62 75 20 2a 70 52    sqlite3rbu *pR
3bc0: 62 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  bu;             
3bd0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
3be0: 72 62 75 20 6f 62 6a 65 63 74 20 28 72 62 75 20  rbu object (rbu 
3bf0: 74 61 72 67 65 74 20 6f 6e 6c 79 29 20 2a 2f 0a  target only) */.
3c00: 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73  .  int openFlags
3c10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3c20: 20 20 20 2f 2a 20 46 6c 61 67 73 20 74 68 69 73     /* Flags this
3c30: 20 66 69 6c 65 20 77 61 73 20 6f 70 65 6e 65 64   file was opened
3c40: 20 77 69 74 68 20 2a 2f 0a 20 20 75 33 32 20 69   with */.  u32 i
3c50: 43 6f 6f 6b 69 65 3b 20 20 20 20 20 20 20 20 20  Cookie;         
3c60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
3c70: 6f 6b 69 65 20 76 61 6c 75 65 20 66 6f 72 20 6d  okie value for m
3c80: 61 69 6e 20 64 62 20 66 69 6c 65 73 20 2a 2f 0a  ain db files */.
3c90: 20 20 75 38 20 69 57 72 69 74 65 56 65 72 3b 20    u8 iWriteVer; 
3ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3cb0: 20 20 2f 2a 20 22 77 72 69 74 65 2d 76 65 72 73    /* "write-vers
3cc0: 69 6f 6e 22 20 76 61 6c 75 65 20 66 6f 72 20 6d  ion" value for m
3cd0: 61 69 6e 20 64 62 20 66 69 6c 65 73 20 2a 2f 0a  ain db files */.
3ce0: 20 20 75 38 20 62 4e 6f 6c 6f 63 6b 3b 20 20 20    u8 bNolock;   
3cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d00: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 66 61 69    /* True to fai
3d10: 6c 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  l EXCLUSIVE lock
3d20: 73 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 53 68 6d  s */..  int nShm
3d30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3d40: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
3d50: 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
3d60: 61 70 53 68 6d 5b 5d 20 61 72 72 61 79 20 2a 2f  apShm[] array */
3d70: 0a 20 20 63 68 61 72 20 2a 2a 61 70 53 68 6d 3b  .  char **apShm;
3d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d90: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 6d     /* Array of m
3da0: 6d 61 70 27 64 20 2a 2d 73 68 6d 20 72 65 67 69  map'd *-shm regi
3db0: 6f 6e 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ons */.  char *z
3dc0: 44 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Del;            
3dd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65           /* Dele
3de0: 74 65 20 74 68 69 73 20 77 68 65 6e 20 63 6c 6f  te this when clo
3df0: 73 69 6e 67 20 66 69 6c 65 20 2a 2f 0a 0a 20 20  sing file */..  
3e00: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 57 61 6c  const char *zWal
3e10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3e20: 2f 2a 20 57 61 6c 20 66 69 6c 65 6e 61 6d 65 20  /* Wal filename 
3e30: 66 6f 72 20 74 68 69 73 20 6d 61 69 6e 20 64 62  for this main db
3e40: 20 66 69 6c 65 20 2a 2f 0a 20 20 72 62 75 5f 66   file */.  rbu_f
3e50: 69 6c 65 20 2a 70 57 61 6c 46 64 3b 20 20 20 20  ile *pWalFd;    
3e60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 61             /* Wa
3e70: 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  l file descripto
3e80: 72 20 66 6f 72 20 74 68 69 73 20 6d 61 69 6e 20  r for this main 
3e90: 64 62 20 2a 2f 0a 20 20 72 62 75 5f 66 69 6c 65  db */.  rbu_file
3ea0: 20 2a 70 4d 61 69 6e 4e 65 78 74 3b 20 20 20 20   *pMainNext;    
3eb0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
3ec0: 4d 41 49 4e 5f 44 42 20 66 69 6c 65 20 2a 2f 0a  MAIN_DB file */.
3ed0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 65 20 66  };../*.** True f
3ee0: 6f 72 20 61 6e 20 52 42 55 20 76 61 63 75 75 6d  or an RBU vacuum
3ef0: 20 68 61 6e 64 6c 65 2c 20 6f 72 20 66 61 6c 73   handle, or fals
3f00: 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  e otherwise..*/.
3f10: 23 64 65 66 69 6e 65 20 72 62 75 49 73 56 61 63  #define rbuIsVac
3f20: 75 75 6d 28 70 29 20 28 28 70 29 2d 3e 7a 54 61  uum(p) ((p)->zTa
3f30: 72 67 65 74 3d 3d 30 29 0a 0a 0a 2f 2a 2a 2a 2a  rget==0).../****
3f40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3f50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3f60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3f70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3f80: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  *****.** The fol
3f90: 6c 6f 77 69 6e 67 20 74 68 72 65 65 20 66 75 6e  lowing three fun
3fa0: 63 74 69 6f 6e 73 2c 20 66 6f 75 6e 64 20 62 65  ctions, found be
3fb0: 6c 6f 77 3a 0a 2a 2a 0a 2a 2a 20 20 20 72 62 75  low:.**.**   rbu
3fc0: 44 65 6c 74 61 47 65 74 49 6e 74 28 29 0a 2a 2a  DeltaGetInt().**
3fd0: 20 20 20 72 62 75 44 65 6c 74 61 43 68 65 63 6b     rbuDeltaCheck
3fe0: 73 75 6d 28 29 0a 2a 2a 20 20 20 72 62 75 44 65  sum().**   rbuDe
3ff0: 6c 74 61 41 70 70 6c 79 28 29 0a 2a 2a 0a 2a 2a  ltaApply().**.**
4000: 20 61 72 65 20 6c 69 66 74 65 64 20 66 72 6f 6d   are lifted from
4010: 20 74 68 65 20 66 6f 73 73 69 6c 20 73 6f 75 72   the fossil sour
4020: 63 65 20 63 6f 64 65 20 28 68 74 74 70 3a 2f 2f  ce code (http://
4030: 66 6f 73 73 69 6c 2d 73 63 6d 2e 6f 72 67 29 2e  fossil-scm.org).
4040: 20 54 68 65 79 0a 2a 2a 20 61 72 65 20 75 73 65   They.** are use
4050: 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  d to implement t
4060: 68 65 20 73 63 61 6c 61 72 20 53 51 4c 20 66 75  he scalar SQL fu
4070: 6e 63 74 69 6f 6e 20 72 62 75 5f 66 6f 73 73 69  nction rbu_fossi
4080: 6c 5f 64 65 6c 74 61 28 29 2e 0a 2a 2f 0a 0a 2f  l_delta()..*/../
4090: 2a 0a 2a 2a 20 52 65 61 64 20 62 79 74 65 73 20  *.** Read bytes 
40a0: 66 72 6f 6d 20 2a 70 7a 20 61 6e 64 20 63 6f 6e  from *pz and con
40b0: 76 65 72 74 20 74 68 65 6d 20 69 6e 74 6f 20 61  vert them into a
40c0: 20 70 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65   positive intege
40d0: 72 2e 20 20 57 68 65 6e 0a 2a 2a 20 66 69 6e 69  r.  When.** fini
40e0: 73 68 65 64 2c 20 6c 65 61 76 65 20 2a 70 7a 20  shed, leave *pz 
40f0: 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
4100: 66 69 72 73 74 20 63 68 61 72 61 63 74 65 72 20  first character 
4110: 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 0a  past the end of.
4120: 2a 2a 20 74 68 65 20 69 6e 74 65 67 65 72 2e 20  ** the integer. 
4130: 20 54 68 65 20 2a 70 4c 65 6e 20 70 61 72 61 6d   The *pLen param
4140: 65 74 65 72 20 68 6f 6c 64 73 20 74 68 65 20 6c  eter holds the l
4150: 65 6e 67 74 68 20 6f 66 20 74 68 65 20 73 74 72  ength of the str
4160: 69 6e 67 0a 2a 2a 20 69 6e 20 2a 70 7a 20 61 6e  ing.** in *pz an
4170: 64 20 69 73 20 64 65 63 72 65 6d 65 6e 74 65 64  d is decremented
4180: 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 63   once for each c
4190: 68 61 72 61 63 74 65 72 20 69 6e 20 74 68 65 20  haracter in the 
41a0: 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 73 74 61 74  integer..*/.stat
41b0: 69 63 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  ic unsigned int 
41c0: 72 62 75 44 65 6c 74 61 47 65 74 49 6e 74 28 63  rbuDeltaGetInt(c
41d0: 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 2c 20  onst char **pz, 
41e0: 69 6e 74 20 2a 70 4c 65 6e 29 7b 0a 20 20 73 74  int *pLen){.  st
41f0: 61 74 69 63 20 63 6f 6e 73 74 20 73 69 67 6e 65  atic const signe
4200: 64 20 63 68 61 72 20 7a 56 61 6c 75 65 5b 5d 20  d char zValue[] 
4210: 3d 20 7b 0a 20 20 20 20 2d 31 2c 20 2d 31 2c 20  = {.    -1, -1, 
4220: 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20  -1, -1, -1, -1, 
4230: 2d 31 2c 20 2d 31 2c 20 20 20 2d 31 2c 20 2d 31  -1, -1,   -1, -1
4240: 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31  , -1, -1, -1, -1
4250: 2c 20 2d 31 2c 20 2d 31 2c 0a 20 20 20 20 2d 31  , -1, -1,.    -1
4260: 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31  , -1, -1, -1, -1
4270: 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 20 20  , -1, -1, -1,   
4280: 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20  -1, -1, -1, -1, 
4290: 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 0a  -1, -1, -1, -1,.
42a0: 20 20 20 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20      -1, -1, -1, 
42b0: 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20  -1, -1, -1, -1, 
42c0: 2d 31 2c 20 20 20 2d 31 2c 20 2d 31 2c 20 2d 31  -1,   -1, -1, -1
42d0: 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31  , -1, -1, -1, -1
42e0: 2c 20 2d 31 2c 0a 20 20 20 20 20 30 2c 20 20 31  , -1,.     0,  1
42f0: 2c 20 20 32 2c 20 20 33 2c 20 20 34 2c 20 20 35  ,  2,  3,  4,  5
4300: 2c 20 20 36 2c 20 20 37 2c 20 20 20 20 38 2c 20  ,  6,  7,    8, 
4310: 20 39 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20   9, -1, -1, -1, 
4320: 2d 31 2c 20 2d 31 2c 20 2d 31 2c 0a 20 20 20 20  -1, -1, -1,.    
4330: 2d 31 2c 20 31 30 2c 20 31 31 2c 20 31 32 2c 20  -1, 10, 11, 12, 
4340: 31 33 2c 20 31 34 2c 20 31 35 2c 20 31 36 2c 20  13, 14, 15, 16, 
4350: 20 20 31 37 2c 20 31 38 2c 20 31 39 2c 20 32 30    17, 18, 19, 20
4360: 2c 20 32 31 2c 20 32 32 2c 20 32 33 2c 20 32 34  , 21, 22, 23, 24
4370: 2c 0a 20 20 20 20 32 35 2c 20 32 36 2c 20 32 37  ,.    25, 26, 27
4380: 2c 20 32 38 2c 20 32 39 2c 20 33 30 2c 20 33 31  , 28, 29, 30, 31
4390: 2c 20 33 32 2c 20 20 20 33 33 2c 20 33 34 2c 20  , 32,   33, 34, 
43a0: 33 35 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20  35, -1, -1, -1, 
43b0: 2d 31 2c 20 33 36 2c 0a 20 20 20 20 2d 31 2c 20  -1, 36,.    -1, 
43c0: 33 37 2c 20 33 38 2c 20 33 39 2c 20 34 30 2c 20  37, 38, 39, 40, 
43d0: 34 31 2c 20 34 32 2c 20 34 33 2c 20 20 20 34 34  41, 42, 43,   44
43e0: 2c 20 34 35 2c 20 34 36 2c 20 34 37 2c 20 34 38  , 45, 46, 47, 48
43f0: 2c 20 34 39 2c 20 35 30 2c 20 35 31 2c 0a 20 20  , 49, 50, 51,.  
4400: 20 20 35 32 2c 20 35 33 2c 20 35 34 2c 20 35 35    52, 53, 54, 55
4410: 2c 20 35 36 2c 20 35 37 2c 20 35 38 2c 20 35 39  , 56, 57, 58, 59
4420: 2c 20 20 20 36 30 2c 20 36 31 2c 20 36 32 2c 20  ,   60, 61, 62, 
4430: 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 36 33 2c 20  -1, -1, -1, 63, 
4440: 2d 31 2c 0a 20 20 7d 3b 0a 20 20 75 6e 73 69 67  -1,.  };.  unsig
4450: 6e 65 64 20 69 6e 74 20 76 20 3d 20 30 3b 0a 20  ned int v = 0;. 
4460: 20 69 6e 74 20 63 3b 0a 20 20 75 6e 73 69 67 6e   int c;.  unsign
4470: 65 64 20 63 68 61 72 20 2a 7a 20 3d 20 28 75 6e  ed char *z = (un
4480: 73 69 67 6e 65 64 20 63 68 61 72 2a 29 2a 70 7a  signed char*)*pz
4490: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
44a0: 72 20 2a 7a 53 74 61 72 74 20 3d 20 7a 3b 0a 20  r *zStart = z;. 
44b0: 20 77 68 69 6c 65 28 20 28 63 20 3d 20 7a 56 61   while( (c = zVa
44c0: 6c 75 65 5b 30 78 37 66 26 2a 28 7a 2b 2b 29 5d  lue[0x7f&*(z++)]
44d0: 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 76 20 3d  )>=0 ){.     v =
44e0: 20 28 76 3c 3c 36 29 20 2b 20 63 3b 0a 20 20 7d   (v<<6) + c;.  }
44f0: 0a 20 20 7a 2d 2d 3b 0a 20 20 2a 70 4c 65 6e 20  .  z--;.  *pLen 
4500: 2d 3d 20 7a 20 2d 20 7a 53 74 61 72 74 3b 0a 20  -= z - zStart;. 
4510: 20 2a 70 7a 20 3d 20 28 63 68 61 72 2a 29 7a 3b   *pz = (char*)z;
4520: 0a 20 20 72 65 74 75 72 6e 20 76 3b 0a 7d 0a 0a  .  return v;.}..
4530: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20  /*.** Compute a 
4540: 33 32 2d 62 69 74 20 63 68 65 63 6b 73 75 6d 20  32-bit checksum 
4550: 6f 6e 20 74 68 65 20 4e 2d 62 79 74 65 20 62 75  on the N-byte bu
4560: 66 66 65 72 2e 20 20 52 65 74 75 72 6e 20 74 68  ffer.  Return th
4570: 65 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61  e result..*/.sta
4580: 74 69 63 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  tic unsigned int
4590: 20 72 62 75 44 65 6c 74 61 43 68 65 63 6b 73 75   rbuDeltaChecksu
45a0: 6d 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49  m(const char *zI
45b0: 6e 2c 20 73 69 7a 65 5f 74 20 4e 29 7b 0a 20 20  n, size_t N){.  
45c0: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
45d0: 68 61 72 20 2a 7a 20 3d 20 28 63 6f 6e 73 74 20  har *z = (const 
45e0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
45f0: 7a 49 6e 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  zIn;.  unsigned 
4600: 73 75 6d 30 20 3d 20 30 3b 0a 20 20 75 6e 73 69  sum0 = 0;.  unsi
4610: 67 6e 65 64 20 73 75 6d 31 20 3d 20 30 3b 0a 20  gned sum1 = 0;. 
4620: 20 75 6e 73 69 67 6e 65 64 20 73 75 6d 32 20 3d   unsigned sum2 =
4630: 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 73   0;.  unsigned s
4640: 75 6d 33 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65  um3 = 0;.  while
4650: 28 4e 20 3e 3d 20 31 36 29 7b 0a 20 20 20 20 73  (N >= 16){.    s
4660: 75 6d 30 20 2b 3d 20 28 28 75 6e 73 69 67 6e 65  um0 += ((unsigne
4670: 64 29 7a 5b 30 5d 20 2b 20 7a 5b 34 5d 20 2b 20  d)z[0] + z[4] + 
4680: 7a 5b 38 5d 20 2b 20 7a 5b 31 32 5d 29 3b 0a 20  z[8] + z[12]);. 
4690: 20 20 20 73 75 6d 31 20 2b 3d 20 28 28 75 6e 73     sum1 += ((uns
46a0: 69 67 6e 65 64 29 7a 5b 31 5d 20 2b 20 7a 5b 35  igned)z[1] + z[5
46b0: 5d 20 2b 20 7a 5b 39 5d 20 2b 20 7a 5b 31 33 5d  ] + z[9] + z[13]
46c0: 29 3b 0a 20 20 20 20 73 75 6d 32 20 2b 3d 20 28  );.    sum2 += (
46d0: 28 75 6e 73 69 67 6e 65 64 29 7a 5b 32 5d 20 2b  (unsigned)z[2] +
46e0: 20 7a 5b 36 5d 20 2b 20 7a 5b 31 30 5d 2b 20 7a   z[6] + z[10]+ z
46f0: 5b 31 34 5d 29 3b 0a 20 20 20 20 73 75 6d 33 20  [14]);.    sum3 
4700: 2b 3d 20 28 28 75 6e 73 69 67 6e 65 64 29 7a 5b  += ((unsigned)z[
4710: 33 5d 20 2b 20 7a 5b 37 5d 20 2b 20 7a 5b 31 31  3] + z[7] + z[11
4720: 5d 2b 20 7a 5b 31 35 5d 29 3b 0a 20 20 20 20 7a  ]+ z[15]);.    z
4730: 20 2b 3d 20 31 36 3b 0a 20 20 20 20 4e 20 2d 3d   += 16;.    N -=
4740: 20 31 36 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65   16;.  }.  while
4750: 28 4e 20 3e 3d 20 34 29 7b 0a 20 20 20 20 73 75  (N >= 4){.    su
4760: 6d 30 20 2b 3d 20 7a 5b 30 5d 3b 0a 20 20 20 20  m0 += z[0];.    
4770: 73 75 6d 31 20 2b 3d 20 7a 5b 31 5d 3b 0a 20 20  sum1 += z[1];.  
4780: 20 20 73 75 6d 32 20 2b 3d 20 7a 5b 32 5d 3b 0a    sum2 += z[2];.
4790: 20 20 20 20 73 75 6d 33 20 2b 3d 20 7a 5b 33 5d      sum3 += z[3]
47a0: 3b 0a 20 20 20 20 7a 20 2b 3d 20 34 3b 0a 20 20  ;.    z += 4;.  
47b0: 20 20 4e 20 2d 3d 20 34 3b 0a 20 20 7d 0a 20 20    N -= 4;.  }.  
47c0: 73 75 6d 33 20 2b 3d 20 28 73 75 6d 32 20 3c 3c  sum3 += (sum2 <<
47d0: 20 38 29 20 2b 20 28 73 75 6d 31 20 3c 3c 20 31   8) + (sum1 << 1
47e0: 36 29 20 2b 20 28 73 75 6d 30 20 3c 3c 20 32 34  6) + (sum0 << 24
47f0: 29 3b 0a 20 20 73 77 69 74 63 68 28 4e 29 7b 0a  );.  switch(N){.
4800: 20 20 20 20 63 61 73 65 20 33 3a 20 20 20 73 75      case 3:   su
4810: 6d 33 20 2b 3d 20 28 7a 5b 32 5d 20 3c 3c 20 38  m3 += (z[2] << 8
4820: 29 3b 0a 20 20 20 20 63 61 73 65 20 32 3a 20 20  );.    case 2:  
4830: 20 73 75 6d 33 20 2b 3d 20 28 7a 5b 31 5d 20 3c   sum3 += (z[1] <
4840: 3c 20 31 36 29 3b 0a 20 20 20 20 63 61 73 65 20  < 16);.    case 
4850: 31 3a 20 20 20 73 75 6d 33 20 2b 3d 20 28 7a 5b  1:   sum3 += (z[
4860: 30 5d 20 3c 3c 20 32 34 29 3b 0a 20 20 20 20 64  0] << 24);.    d
4870: 65 66 61 75 6c 74 3a 20 20 3b 0a 20 20 7d 0a 20  efault:  ;.  }. 
4880: 20 72 65 74 75 72 6e 20 73 75 6d 33 3b 0a 7d 0a   return sum3;.}.
4890: 0a 2f 2a 0a 2a 2a 20 41 70 70 6c 79 20 61 20 64  ./*.** Apply a d
48a0: 65 6c 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  elta..**.** The 
48b0: 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 73 68  output buffer sh
48c0: 6f 75 6c 64 20 62 65 20 62 69 67 20 65 6e 6f 75  ould be big enou
48d0: 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 77  gh to hold the w
48e0: 68 6f 6c 65 20 6f 75 74 70 75 74 0a 2a 2a 20 66  hole output.** f
48f0: 69 6c 65 20 61 6e 64 20 61 20 4e 55 4c 20 74 65  ile and a NUL te
4900: 72 6d 69 6e 61 74 6f 72 20 61 74 20 74 68 65 20  rminator at the 
4910: 65 6e 64 2e 20 20 54 68 65 20 64 65 6c 74 61 5f  end.  The delta_
4920: 6f 75 74 70 75 74 5f 73 69 7a 65 28 29 0a 2a 2a  output_size().**
4930: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 65   routine will de
4940: 74 65 72 6d 69 6e 65 20 74 68 69 73 20 73 69 7a  termine this siz
4950: 65 20 66 6f 72 20 79 6f 75 2e 0a 2a 2a 0a 2a 2a  e for you..**.**
4960: 20 54 68 65 20 64 65 6c 74 61 20 73 74 72 69 6e   The delta strin
4970: 67 20 73 68 6f 75 6c 64 20 62 65 20 6e 75 6c 6c  g should be null
4980: 2d 74 65 72 6d 69 6e 61 74 65 64 2e 20 20 42 75  -terminated.  Bu
4990: 74 20 74 68 65 20 64 65 6c 74 61 20 73 74 72 69  t the delta stri
49a0: 6e 67 0a 2a 2a 20 6d 61 79 20 63 6f 6e 74 61 69  ng.** may contai
49b0: 6e 20 65 6d 62 65 64 64 65 64 20 4e 55 4c 20 63  n embedded NUL c
49c0: 68 61 72 61 63 74 65 72 73 20 28 69 66 20 74 68  haracters (if th
49d0: 65 20 69 6e 70 75 74 20 61 6e 64 20 6f 75 74 70  e input and outp
49e0: 75 74 20 61 72 65 0a 2a 2a 20 62 69 6e 61 72 79  ut are.** binary
49f0: 20 66 69 6c 65 73 29 20 73 6f 20 77 65 20 61 6c   files) so we al
4a00: 73 6f 20 68 61 76 65 20 74 6f 20 70 61 73 73 20  so have to pass 
4a10: 69 6e 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66  in the length of
4a20: 20 74 68 65 20 64 65 6c 74 61 20 69 6e 0a 2a 2a   the delta in.**
4a30: 20 74 68 65 20 6c 65 6e 44 65 6c 74 61 20 70 61   the lenDelta pa
4a40: 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54  rameter..**.** T
4a50: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
4a60: 75 72 6e 73 20 74 68 65 20 73 69 7a 65 20 6f 66  urns the size of
4a70: 20 74 68 65 20 6f 75 74 70 75 74 20 66 69 6c 65   the output file
4a80: 20 69 6e 20 62 79 74 65 73 20 28 65 78 63 6c 75   in bytes (exclu
4a90: 64 69 6e 67 0a 2a 2a 20 74 68 65 20 66 69 6e 61  ding.** the fina
4aa0: 6c 20 4e 55 4c 20 74 65 72 6d 69 6e 61 74 6f 72  l NUL terminator
4ab0: 20 63 68 61 72 61 63 74 65 72 29 2e 20 20 45 78   character).  Ex
4ac0: 63 65 70 74 2c 20 69 66 20 74 68 65 20 64 65 6c  cept, if the del
4ad0: 74 61 20 73 74 72 69 6e 67 20 69 73 0a 2a 2a 20  ta string is.** 
4ae0: 6d 61 6c 66 6f 72 6d 65 64 20 6f 72 20 69 6e 74  malformed or int
4af0: 65 6e 64 65 64 20 66 6f 72 20 75 73 65 20 77 69  ended for use wi
4b00: 74 68 20 61 20 73 6f 75 72 63 65 20 66 69 6c 65  th a source file
4b10: 20 6f 74 68 65 72 20 74 68 61 6e 20 7a 53 72 63   other than zSrc
4b20: 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 72  ,.** then this r
4b30: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 2d  outine returns -
4b40: 31 2e 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72 20 74  1..**.** Refer t
4b50: 6f 20 74 68 65 20 64 65 6c 74 61 5f 63 72 65 61  o the delta_crea
4b60: 74 65 28 29 20 64 6f 63 75 6d 65 6e 74 61 74 69  te() documentati
4b70: 6f 6e 20 61 62 6f 76 65 20 66 6f 72 20 61 20 64  on above for a d
4b80: 65 73 63 72 69 70 74 69 6f 6e 0a 2a 2a 20 6f 66  escription.** of
4b90: 20 74 68 65 20 64 65 6c 74 61 20 66 69 6c 65 20   the delta file 
4ba0: 66 6f 72 6d 61 74 2e 0a 2a 2f 0a 73 74 61 74 69  format..*/.stati
4bb0: 63 20 69 6e 74 20 72 62 75 44 65 6c 74 61 41 70  c int rbuDeltaAp
4bc0: 70 6c 79 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  ply(.  const cha
4bd0: 72 20 2a 7a 53 72 63 2c 20 20 20 20 20 20 2f 2a  r *zSrc,      /*
4be0: 20 54 68 65 20 73 6f 75 72 63 65 20 6f 72 20 70   The source or p
4bf0: 61 74 74 65 72 6e 20 66 69 6c 65 20 2a 2f 0a 20  attern file */. 
4c00: 20 69 6e 74 20 6c 65 6e 53 72 63 2c 20 20 20 20   int lenSrc,    
4c10: 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74          /* Lengt
4c20: 68 20 6f 66 20 74 68 65 20 73 6f 75 72 63 65 20  h of the source 
4c30: 66 69 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  file */.  const 
4c40: 63 68 61 72 20 2a 7a 44 65 6c 74 61 2c 20 20 20  char *zDelta,   
4c50: 20 2f 2a 20 44 65 6c 74 61 20 74 6f 20 61 70 70   /* Delta to app
4c60: 6c 79 20 74 6f 20 74 68 65 20 70 61 74 74 65 72  ly to the patter
4c70: 6e 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 6e 44 65  n */.  int lenDe
4c80: 6c 74 61 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  lta,          /*
4c90: 20 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 64   Length of the d
4ca0: 65 6c 74 61 20 2a 2f 0a 20 20 63 68 61 72 20 2a  elta */.  char *
4cb0: 7a 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 20  zOut            
4cc0: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6f 75   /* Write the ou
4cd0: 74 70 75 74 20 69 6e 74 6f 20 74 68 69 73 20 70  tput into this p
4ce0: 72 65 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66  reallocated buff
4cf0: 65 72 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67  er */.){.  unsig
4d00: 6e 65 64 20 69 6e 74 20 6c 69 6d 69 74 3b 0a 20  ned int limit;. 
4d10: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 74 6f   unsigned int to
4d20: 74 61 6c 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66  tal = 0;.#ifndef
4d30: 20 46 4f 53 53 49 4c 5f 4f 4d 49 54 5f 44 45 4c   FOSSIL_OMIT_DEL
4d40: 54 41 5f 43 4b 53 55 4d 5f 54 45 53 54 0a 20 20  TA_CKSUM_TEST.  
4d50: 63 68 61 72 20 2a 7a 4f 72 69 67 4f 75 74 20 3d  char *zOrigOut =
4d60: 20 7a 4f 75 74 3b 0a 23 65 6e 64 69 66 0a 0a 20   zOut;.#endif.. 
4d70: 20 6c 69 6d 69 74 20 3d 20 72 62 75 44 65 6c 74   limit = rbuDelt
4d80: 61 47 65 74 49 6e 74 28 26 7a 44 65 6c 74 61 2c  aGetInt(&zDelta,
4d90: 20 26 6c 65 6e 44 65 6c 74 61 29 3b 0a 20 20 69   &lenDelta);.  i
4da0: 66 28 20 2a 7a 44 65 6c 74 61 21 3d 27 5c 6e 27  f( *zDelta!='\n'
4db0: 20 29 7b 0a 20 20 20 20 2f 2a 20 45 52 52 4f 52   ){.    /* ERROR
4dc0: 3a 20 73 69 7a 65 20 69 6e 74 65 67 65 72 20 6e  : size integer n
4dd0: 6f 74 20 74 65 72 6d 69 6e 61 74 65 64 20 62 79  ot terminated by
4de0: 20 22 5c 6e 22 20 2a 2f 0a 20 20 20 20 72 65 74   "\n" */.    ret
4df0: 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 7a 44  urn -1;.  }.  zD
4e00: 65 6c 74 61 2b 2b 3b 20 6c 65 6e 44 65 6c 74 61  elta++; lenDelta
4e10: 2d 2d 3b 0a 20 20 77 68 69 6c 65 28 20 2a 7a 44  --;.  while( *zD
4e20: 65 6c 74 61 20 26 26 20 6c 65 6e 44 65 6c 74 61  elta && lenDelta
4e30: 3e 30 20 29 7b 0a 20 20 20 20 75 6e 73 69 67 6e  >0 ){.    unsign
4e40: 65 64 20 69 6e 74 20 63 6e 74 2c 20 6f 66 73 74  ed int cnt, ofst
4e50: 3b 0a 20 20 20 20 63 6e 74 20 3d 20 72 62 75 44  ;.    cnt = rbuD
4e60: 65 6c 74 61 47 65 74 49 6e 74 28 26 7a 44 65 6c  eltaGetInt(&zDel
4e70: 74 61 2c 20 26 6c 65 6e 44 65 6c 74 61 29 3b 0a  ta, &lenDelta);.
4e80: 20 20 20 20 73 77 69 74 63 68 28 20 7a 44 65 6c      switch( zDel
4e90: 74 61 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 63  ta[0] ){.      c
4ea0: 61 73 65 20 27 40 27 3a 20 7b 0a 20 20 20 20 20  ase '@': {.     
4eb0: 20 20 20 7a 44 65 6c 74 61 2b 2b 3b 20 6c 65 6e     zDelta++; len
4ec0: 44 65 6c 74 61 2d 2d 3b 0a 20 20 20 20 20 20 20  Delta--;.       
4ed0: 20 6f 66 73 74 20 3d 20 72 62 75 44 65 6c 74 61   ofst = rbuDelta
4ee0: 47 65 74 49 6e 74 28 26 7a 44 65 6c 74 61 2c 20  GetInt(&zDelta, 
4ef0: 26 6c 65 6e 44 65 6c 74 61 29 3b 0a 20 20 20 20  &lenDelta);.    
4f00: 20 20 20 20 69 66 28 20 6c 65 6e 44 65 6c 74 61      if( lenDelta
4f10: 3e 30 20 26 26 20 7a 44 65 6c 74 61 5b 30 5d 21  >0 && zDelta[0]!
4f20: 3d 27 2c 27 20 29 7b 0a 20 20 20 20 20 20 20 20  =',' ){.        
4f30: 20 20 2f 2a 20 45 52 52 4f 52 3a 20 63 6f 70 79    /* ERROR: copy
4f40: 20 63 6f 6d 6d 61 6e 64 20 6e 6f 74 20 74 65 72   command not ter
4f50: 6d 69 6e 61 74 65 64 20 62 79 20 27 2c 27 20 2a  minated by ',' *
4f60: 2f 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  /.          retu
4f70: 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d  rn -1;.        }
4f80: 0a 20 20 20 20 20 20 20 20 7a 44 65 6c 74 61 2b  .        zDelta+
4f90: 2b 3b 20 6c 65 6e 44 65 6c 74 61 2d 2d 3b 0a 20  +; lenDelta--;. 
4fa0: 20 20 20 20 20 20 20 74 6f 74 61 6c 20 2b 3d 20         total += 
4fb0: 63 6e 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28  cnt;.        if(
4fc0: 20 74 6f 74 61 6c 3e 6c 69 6d 69 74 20 29 7b 0a   total>limit ){.
4fd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 52 52            /* ERR
4fe0: 4f 52 3a 20 63 6f 70 79 20 65 78 63 65 65 64 73  OR: copy exceeds
4ff0: 20 6f 75 74 70 75 74 20 66 69 6c 65 20 73 69 7a   output file siz
5000: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  e */.          r
5010: 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20  eturn -1;.      
5020: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
5030: 28 69 6e 74 29 28 6f 66 73 74 2b 63 6e 74 29 20  (int)(ofst+cnt) 
5040: 3e 20 6c 65 6e 53 72 63 20 29 7b 0a 20 20 20 20  > lenSrc ){.    
5050: 20 20 20 20 20 20 2f 2a 20 45 52 52 4f 52 3a 20        /* ERROR: 
5060: 63 6f 70 79 20 65 78 74 65 6e 64 73 20 70 61 73  copy extends pas
5070: 74 20 65 6e 64 20 6f 66 20 69 6e 70 75 74 20 2a  t end of input *
5080: 2f 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  /.          retu
5090: 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d  rn -1;.        }
50a0: 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
50b0: 7a 4f 75 74 2c 20 26 7a 53 72 63 5b 6f 66 73 74  zOut, &zSrc[ofst
50c0: 5d 2c 20 63 6e 74 29 3b 0a 20 20 20 20 20 20 20  ], cnt);.       
50d0: 20 7a 4f 75 74 20 2b 3d 20 63 6e 74 3b 0a 20 20   zOut += cnt;.  
50e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
50f0: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
5100: 27 3a 27 3a 20 7b 0a 20 20 20 20 20 20 20 20 7a  ':': {.        z
5110: 44 65 6c 74 61 2b 2b 3b 20 6c 65 6e 44 65 6c 74  Delta++; lenDelt
5120: 61 2d 2d 3b 0a 20 20 20 20 20 20 20 20 74 6f 74  a--;.        tot
5130: 61 6c 20 2b 3d 20 63 6e 74 3b 0a 20 20 20 20 20  al += cnt;.     
5140: 20 20 20 69 66 28 20 74 6f 74 61 6c 3e 6c 69 6d     if( total>lim
5150: 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  it ){.          
5160: 2f 2a 20 45 52 52 4f 52 3a 20 20 69 6e 73 65 72  /* ERROR:  inser
5170: 74 20 63 6f 6d 6d 61 6e 64 20 67 69 76 65 73 20  t command gives 
5180: 61 6e 20 6f 75 74 70 75 74 20 6c 61 72 67 65 72  an output larger
5190: 20 74 68 61 6e 20 70 72 65 64 69 63 74 65 64 20   than predicted 
51a0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  */.          ret
51b0: 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  urn -1;.        
51c0: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 69  }.        if( (i
51d0: 6e 74 29 63 6e 74 3e 6c 65 6e 44 65 6c 74 61 20  nt)cnt>lenDelta 
51e0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
51f0: 45 52 52 4f 52 3a 20 69 6e 73 65 72 74 20 63 6f  ERROR: insert co
5200: 75 6e 74 20 65 78 63 65 65 64 73 20 73 69 7a 65  unt exceeds size
5210: 20 6f 66 20 64 65 6c 74 61 20 2a 2f 0a 20 20 20   of delta */.   
5220: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31         return -1
5230: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
5240: 20 20 20 20 6d 65 6d 63 70 79 28 7a 4f 75 74 2c      memcpy(zOut,
5250: 20 7a 44 65 6c 74 61 2c 20 63 6e 74 29 3b 0a 20   zDelta, cnt);. 
5260: 20 20 20 20 20 20 20 7a 4f 75 74 20 2b 3d 20 63         zOut += c
5270: 6e 74 3b 0a 20 20 20 20 20 20 20 20 7a 44 65 6c  nt;.        zDel
5280: 74 61 20 2b 3d 20 63 6e 74 3b 0a 20 20 20 20 20  ta += cnt;.     
5290: 20 20 20 6c 65 6e 44 65 6c 74 61 20 2d 3d 20 63     lenDelta -= c
52a0: 6e 74 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  nt;.        brea
52b0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
52c0: 20 63 61 73 65 20 27 3b 27 3a 20 7b 0a 20 20 20   case ';': {.   
52d0: 20 20 20 20 20 7a 44 65 6c 74 61 2b 2b 3b 20 6c       zDelta++; l
52e0: 65 6e 44 65 6c 74 61 2d 2d 3b 0a 20 20 20 20 20  enDelta--;.     
52f0: 20 20 20 7a 4f 75 74 5b 30 5d 20 3d 20 30 3b 0a     zOut[0] = 0;.
5300: 23 69 66 6e 64 65 66 20 46 4f 53 53 49 4c 5f 4f  #ifndef FOSSIL_O
5310: 4d 49 54 5f 44 45 4c 54 41 5f 43 4b 53 55 4d 5f  MIT_DELTA_CKSUM_
5320: 54 45 53 54 0a 20 20 20 20 20 20 20 20 69 66 28  TEST.        if(
5330: 20 63 6e 74 21 3d 72 62 75 44 65 6c 74 61 43 68   cnt!=rbuDeltaCh
5340: 65 63 6b 73 75 6d 28 7a 4f 72 69 67 4f 75 74 2c  ecksum(zOrigOut,
5350: 20 74 6f 74 61 6c 29 20 29 7b 0a 20 20 20 20 20   total) ){.     
5360: 20 20 20 20 20 2f 2a 20 45 52 52 4f 52 3a 20 20       /* ERROR:  
5370: 62 61 64 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a  bad checksum */.
5380: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
5390: 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23   -1;.        }.#
53a0: 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 69 66  endif.        if
53b0: 28 20 74 6f 74 61 6c 21 3d 6c 69 6d 69 74 20 29  ( total!=limit )
53c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45  {.          /* E
53d0: 52 52 4f 52 3a 20 67 65 6e 65 72 61 74 65 64 20  RROR: generated 
53e0: 73 69 7a 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61  size does not ma
53f0: 74 63 68 20 70 72 65 64 69 63 74 65 64 20 73 69  tch predicted si
5400: 7a 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ze */.          
5410: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20  return -1;.     
5420: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 74     }.        ret
5430: 75 72 6e 20 74 6f 74 61 6c 3b 0a 20 20 20 20 20  urn total;.     
5440: 20 7d 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74   }.      default
5450: 3a 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45  : {.        /* E
5460: 52 52 4f 52 3a 20 75 6e 6b 6e 6f 77 6e 20 64 65  RROR: unknown de
5470: 6c 74 61 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  lta operator */.
5480: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d          return -
5490: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
54a0: 0a 20 20 7d 0a 20 20 2f 2a 20 45 52 52 4f 52 3a  .  }.  /* ERROR:
54b0: 20 75 6e 74 65 72 6d 69 6e 61 74 65 64 20 64 65   unterminated de
54c0: 6c 74 61 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  lta */.  return 
54d0: 2d 31 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  -1;.}..static in
54e0: 74 20 72 62 75 44 65 6c 74 61 4f 75 74 70 75 74  t rbuDeltaOutput
54f0: 53 69 7a 65 28 63 6f 6e 73 74 20 63 68 61 72 20  Size(const char 
5500: 2a 7a 44 65 6c 74 61 2c 20 69 6e 74 20 6c 65 6e  *zDelta, int len
5510: 44 65 6c 74 61 29 7b 0a 20 20 69 6e 74 20 73 69  Delta){.  int si
5520: 7a 65 3b 0a 20 20 73 69 7a 65 20 3d 20 72 62 75  ze;.  size = rbu
5530: 44 65 6c 74 61 47 65 74 49 6e 74 28 26 7a 44 65  DeltaGetInt(&zDe
5540: 6c 74 61 2c 20 26 6c 65 6e 44 65 6c 74 61 29 3b  lta, &lenDelta);
5550: 0a 20 20 69 66 28 20 2a 7a 44 65 6c 74 61 21 3d  .  if( *zDelta!=
5560: 27 5c 6e 27 20 29 7b 0a 20 20 20 20 2f 2a 20 45  '\n' ){.    /* E
5570: 52 52 4f 52 3a 20 73 69 7a 65 20 69 6e 74 65 67  RROR: size integ
5580: 65 72 20 6e 6f 74 20 74 65 72 6d 69 6e 61 74 65  er not terminate
5590: 64 20 62 79 20 22 5c 6e 22 20 2a 2f 0a 20 20 20  d by "\n" */.   
55a0: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a   return -1;.  }.
55b0: 20 20 72 65 74 75 72 6e 20 73 69 7a 65 3b 0a 7d    return size;.}
55c0: 0a 0a 2f 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20 63  ../*.** End of c
55d0: 6f 64 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 66  ode taken from f
55e0: 6f 73 73 69 6c 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ossil..*********
55f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5600: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5610: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5620: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5630: 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  /../*.** Impleme
5640: 6e 74 61 74 69 6f 6e 20 6f 66 20 53 51 4c 20 73  ntation of SQL s
5650: 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20 72  calar function r
5660: 62 75 5f 66 6f 73 73 69 6c 5f 64 65 6c 74 61 28  bu_fossil_delta(
5670: 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  )..**.** This fu
5680: 6e 63 74 69 6f 6e 20 61 70 70 6c 69 65 73 20 61  nction applies a
5690: 20 66 6f 73 73 69 6c 20 64 65 6c 74 61 20 70 61   fossil delta pa
56a0: 74 63 68 20 74 6f 20 61 20 62 6c 6f 62 2e 20 45  tch to a blob. E
56b0: 78 61 63 74 6c 79 20 74 77 6f 0a 2a 2a 20 61 72  xactly two.** ar
56c0: 67 75 6d 65 6e 74 73 20 6d 75 73 74 20 62 65 20  guments must be 
56d0: 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66  passed to this f
56e0: 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20 66 69 72  unction. The fir
56f0: 73 74 20 69 73 20 74 68 65 20 62 6c 6f 62 20 74  st is the blob t
5700: 6f 0a 2a 2a 20 70 61 74 63 68 20 61 6e 64 20 74  o.** patch and t
5710: 68 65 20 73 65 63 6f 6e 64 20 74 68 65 20 70 61  he second the pa
5720: 74 63 68 20 74 6f 20 61 70 70 6c 79 2e 20 49 66  tch to apply. If
5730: 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
5740: 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  , this.** functi
5750: 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 70  on returns the p
5760: 61 74 63 68 65 64 20 62 6c 6f 62 2e 0a 2a 2f 0a  atched blob..*/.
5770: 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75 46  static void rbuF
5780: 6f 73 73 69 6c 44 65 6c 74 61 46 75 6e 63 28 0a  ossilDeltaFunc(.
5790: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
57a0: 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e  t *context,.  in
57b0: 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65  t argc,.  sqlite
57c0: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
57d0: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
57e0: 61 44 65 6c 74 61 3b 0a 20 20 69 6e 74 20 6e 44  aDelta;.  int nD
57f0: 65 6c 74 61 3b 0a 20 20 63 6f 6e 73 74 20 63 68  elta;.  const ch
5800: 61 72 20 2a 61 4f 72 69 67 3b 0a 20 20 69 6e 74  ar *aOrig;.  int
5810: 20 6e 4f 72 69 67 3b 0a 0a 20 20 69 6e 74 20 6e   nOrig;..  int n
5820: 4f 75 74 3b 0a 20 20 69 6e 74 20 6e 4f 75 74 32  Out;.  int nOut2
5830: 3b 0a 20 20 63 68 61 72 20 2a 61 4f 75 74 3b 0a  ;.  char *aOut;.
5840: 0a 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3d  .  assert( argc=
5850: 3d 32 20 29 3b 0a 0a 20 20 6e 4f 72 69 67 20 3d  =2 );..  nOrig =
5860: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
5870: 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20  ytes(argv[0]);. 
5880: 20 61 4f 72 69 67 20 3d 20 28 63 6f 6e 73 74 20   aOrig = (const 
5890: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
58a0: 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30 5d  lue_blob(argv[0]
58b0: 29 3b 0a 20 20 6e 44 65 6c 74 61 20 3d 20 73 71  );.  nDelta = sq
58c0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
58d0: 73 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 61 44  s(argv[1]);.  aD
58e0: 65 6c 74 61 20 3d 20 28 63 6f 6e 73 74 20 63 68  elta = (const ch
58f0: 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
5900: 65 5f 62 6c 6f 62 28 61 72 67 76 5b 31 5d 29 3b  e_blob(argv[1]);
5910: 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
5920: 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  t the size of th
5930: 65 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 6e 4f  e output */.  nO
5940: 75 74 20 3d 20 72 62 75 44 65 6c 74 61 4f 75 74  ut = rbuDeltaOut
5950: 70 75 74 53 69 7a 65 28 61 44 65 6c 74 61 2c 20  putSize(aDelta, 
5960: 6e 44 65 6c 74 61 29 3b 0a 20 20 69 66 28 20 6e  nDelta);.  if( n
5970: 4f 75 74 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c  Out<0 ){.    sql
5980: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
5990: 72 28 63 6f 6e 74 65 78 74 2c 20 22 63 6f 72 72  r(context, "corr
59a0: 75 70 74 20 66 6f 73 73 69 6c 20 64 65 6c 74 61  upt fossil delta
59b0: 22 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65 74 75  ", -1);.    retu
59c0: 72 6e 3b 0a 20 20 7d 0a 0a 20 20 61 4f 75 74 20  rn;.  }..  aOut 
59d0: 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
59e0: 28 6e 4f 75 74 2b 31 29 3b 0a 20 20 69 66 28 20  (nOut+1);.  if( 
59f0: 61 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73  aOut==0 ){.    s
5a00: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
5a10: 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78  ror_nomem(contex
5a20: 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t);.  }else{.   
5a30: 20 6e 4f 75 74 32 20 3d 20 72 62 75 44 65 6c 74   nOut2 = rbuDelt
5a40: 61 41 70 70 6c 79 28 61 4f 72 69 67 2c 20 6e 4f  aApply(aOrig, nO
5a50: 72 69 67 2c 20 61 44 65 6c 74 61 2c 20 6e 44 65  rig, aDelta, nDe
5a60: 6c 74 61 2c 20 61 4f 75 74 29 3b 0a 20 20 20 20  lta, aOut);.    
5a70: 69 66 28 20 6e 4f 75 74 32 21 3d 6e 4f 75 74 20  if( nOut2!=nOut 
5a80: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
5a90: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f  _result_error(co
5aa0: 6e 74 65 78 74 2c 20 22 63 6f 72 72 75 70 74 20  ntext, "corrupt 
5ab0: 66 6f 73 73 69 6c 20 64 65 6c 74 61 22 2c 20 2d  fossil delta", -
5ac0: 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  1);.    }else{. 
5ad0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
5ae0: 75 6c 74 5f 62 6c 6f 62 28 63 6f 6e 74 65 78 74  ult_blob(context
5af0: 2c 20 61 4f 75 74 2c 20 6e 4f 75 74 2c 20 73 71  , aOut, nOut, sq
5b00: 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 20 20 20  lite3_free);.   
5b10: 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a   }.  }.}.../*.**
5b20: 20 50 72 65 70 61 72 65 20 74 68 65 20 53 51 4c   Prepare the SQL
5b30: 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 62 75   statement in bu
5b40: 66 66 65 72 20 7a 53 71 6c 20 61 67 61 69 6e 73  ffer zSql agains
5b50: 74 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  t database handl
5b60: 65 20 64 62 2e 0a 2a 2a 20 49 66 20 73 75 63 63  e db..** If succ
5b70: 65 73 73 66 75 6c 2c 20 73 65 74 20 2a 70 70 53  essful, set *ppS
5b80: 74 6d 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  tmt to point to 
5b90: 74 68 65 20 6e 65 77 20 73 74 61 74 65 6d 65 6e  the new statemen
5ba0: 74 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20  t and return.** 
5bb0: 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 0a 2a  SQLITE_OK. .**.*
5bc0: 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
5bd0: 61 6e 20 65 72 72 6f 72 20 64 6f 65 73 20 6f 63  an error does oc
5be0: 63 75 72 2c 20 73 65 74 20 2a 70 70 53 74 6d 74  cur, set *ppStmt
5bf0: 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 72 65 74   to NULL and ret
5c00: 75 72 6e 0a 2a 2a 20 61 6e 20 53 51 4c 69 74 65  urn.** an SQLite
5c10: 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 41 64 64   error code. Add
5c20: 69 74 69 6f 6e 61 6c 6c 79 2c 20 73 65 74 20 6f  itionally, set o
5c30: 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 20 2a  utput variable *
5c40: 70 7a 45 72 72 6d 73 67 20 74 6f 0a 2a 2a 20 70  pzErrmsg to.** p
5c50: 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72  oint to a buffer
5c60: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6e 20 65   containing an e
5c70: 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 20 49 74  rror message. It
5c80: 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
5c90: 62 69 6c 69 74 79 0a 2a 2a 20 6f 66 20 74 68 65  bility.** of the
5ca0: 20 63 61 6c 6c 65 72 20 74 6f 20 28 65 76 65 6e   caller to (even
5cb0: 74 75 61 6c 6c 79 29 20 66 72 65 65 20 74 68 69  tually) free thi
5cc0: 73 20 62 75 66 66 65 72 20 75 73 69 6e 67 20 73  s buffer using s
5cd0: 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a  qlite3_free()..*
5ce0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 65  /.static int pre
5cf0: 70 61 72 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72  pareAndCollectEr
5d00: 72 6f 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ror(.  sqlite3 *
5d10: 64 62 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 73  db, .  sqlite3_s
5d20: 74 6d 74 20 2a 2a 70 70 53 74 6d 74 2c 0a 20 20  tmt **ppStmt,.  
5d30: 63 68 61 72 20 2a 2a 70 7a 45 72 72 6d 73 67 2c  char **pzErrmsg,
5d40: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
5d50: 53 71 6c 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20  Sql.){.  int rc 
5d60: 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
5d70: 65 5f 76 32 28 64 62 2c 20 7a 53 71 6c 2c 20 2d  e_v2(db, zSql, -
5d80: 31 2c 20 70 70 53 74 6d 74 2c 20 30 29 3b 0a 20  1, ppStmt, 0);. 
5d90: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
5da0: 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 7a 45 72 72  OK ){.    *pzErr
5db0: 6d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  msg = sqlite3_mp
5dc0: 72 69 6e 74 66 28 22 25 73 22 2c 20 73 71 6c 69  rintf("%s", sqli
5dd0: 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b  te3_errmsg(db));
5de0: 0a 20 20 20 20 2a 70 70 53 74 6d 74 20 3d 20 30  .    *ppStmt = 0
5df0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
5e00: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65  c;.}../*.** Rese
5e10: 74 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  t the SQL statem
5e20: 65 6e 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ent passed as th
5e30: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
5e40: 2e 20 52 65 74 75 72 6e 20 61 20 63 6f 70 79 0a  . Return a copy.
5e50: 2a 2a 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20  ** of the value 
5e60: 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69  returned by sqli
5e70: 74 65 33 5f 72 65 73 65 74 28 29 2e 0a 2a 2a 0a  te3_reset()..**.
5e80: 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68  ** If an error h
5e90: 61 73 20 6f 63 63 75 72 72 65 64 2c 20 74 68 65  as occurred, the
5ea0: 6e 20 73 65 74 20 2a 70 7a 45 72 72 6d 73 67 20  n set *pzErrmsg 
5eb0: 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75  to point to a bu
5ec0: 66 66 65 72 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69  ffer.** containi
5ed0: 6e 67 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ng an error mess
5ee0: 61 67 65 2e 20 49 74 20 69 73 20 74 68 65 20 72  age. It is the r
5ef0: 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
5f00: 20 74 68 65 20 63 61 6c 6c 65 72 0a 2a 2a 20 74   the caller.** t
5f10: 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65  o eventually fre
5f20: 65 20 74 68 69 73 20 62 75 66 66 65 72 20 75 73  e this buffer us
5f30: 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ing sqlite3_free
5f40: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ()..*/.static in
5f50: 74 20 72 65 73 65 74 41 6e 64 43 6f 6c 6c 65 63  t resetAndCollec
5f60: 74 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 73  tError(sqlite3_s
5f70: 74 6d 74 20 2a 70 53 74 6d 74 2c 20 63 68 61 72  tmt *pStmt, char
5f80: 20 2a 2a 70 7a 45 72 72 6d 73 67 29 7b 0a 20 20   **pzErrmsg){.  
5f90: 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
5fa0: 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20  _reset(pStmt);. 
5fb0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
5fc0: 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 7a 45 72 72  OK ){.    *pzErr
5fd0: 6d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  msg = sqlite3_mp
5fe0: 72 69 6e 74 66 28 22 25 73 22 2c 20 73 71 6c 69  rintf("%s", sqli
5ff0: 74 65 33 5f 65 72 72 6d 73 67 28 73 71 6c 69 74  te3_errmsg(sqlit
6000: 65 33 5f 64 62 5f 68 61 6e 64 6c 65 28 70 53 74  e3_db_handle(pSt
6010: 6d 74 29 29 29 3b 0a 20 20 7d 0a 20 20 72 65 74  mt)));.  }.  ret
6020: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
6030: 20 55 6e 6c 65 73 73 20 69 74 20 69 73 20 4e 55   Unless it is NU
6040: 4c 4c 2c 20 61 72 67 75 6d 65 6e 74 20 7a 53 71  LL, argument zSq
6050: 6c 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 62 75  l points to a bu
6060: 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 75  ffer allocated u
6070: 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  sing.** sqlite3_
6080: 6d 61 6c 6c 6f 63 20 63 6f 6e 74 61 69 6e 69 6e  malloc containin
6090: 67 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65  g an SQL stateme
60a0: 6e 74 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  nt. This functio
60b0: 6e 20 70 72 65 70 61 72 65 73 20 74 68 65 20 53  n prepares the S
60c0: 51 4c 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  QL.** statement 
60d0: 61 67 61 69 6e 73 74 20 64 61 74 61 62 61 73 65  against database
60e0: 20 64 62 20 61 6e 64 20 66 72 65 65 73 20 74 68   db and frees th
60f0: 65 20 62 75 66 66 65 72 2e 20 49 66 20 73 74 61  e buffer. If sta
6100: 74 65 6d 65 6e 74 20 0a 2a 2a 20 63 6f 6d 70 69  tement .** compi
6110: 6c 61 74 69 6f 6e 20 69 73 20 73 75 63 63 65 73  lation is succes
6120: 73 66 75 6c 2c 20 2a 70 70 53 74 6d 74 20 69 73  sful, *ppStmt is
6130: 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
6140: 20 74 68 65 20 6e 65 77 20 73 74 61 74 65 6d 65   the new stateme
6150: 6e 74 20 0a 2a 2a 20 68 61 6e 64 6c 65 20 61 6e  nt .** handle an
6160: 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  d SQLITE_OK is r
6170: 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 0a 2a 2a 20  eturned. .**.** 
6180: 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 6e  Otherwise, if an
6190: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a   error occurs, *
61a0: 70 70 53 74 6d 74 20 69 73 20 73 65 74 20 74 6f  ppStmt is set to
61b0: 20 4e 55 4c 4c 20 61 6e 64 20 61 6e 20 65 72 72   NULL and an err
61c0: 6f 72 20 63 6f 64 65 0a 2a 2a 20 72 65 74 75 72  or code.** retur
61d0: 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ned. In this cas
61e0: 65 2c 20 2a 70 7a 45 72 72 6d 73 67 20 6d 61 79  e, *pzErrmsg may
61f0: 20 61 6c 73 6f 20 62 65 20 73 65 74 20 74 6f 20   also be set to 
6200: 70 6f 69 6e 74 20 74 6f 20 61 6e 20 65 72 72 6f  point to an erro
6210: 72 0a 2a 2a 20 6d 65 73 73 61 67 65 2e 20 49 74  r.** message. It
6220: 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
6230: 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
6240: 6c 6c 65 72 20 74 6f 20 66 72 65 65 20 74 68 69  ller to free thi
6250: 73 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a  s error message.
6260: 2a 2a 20 62 75 66 66 65 72 20 75 73 69 6e 67 20  ** buffer using 
6270: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a  sqlite3_free()..
6280: 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e  **.** If argumen
6290: 74 20 7a 53 71 6c 20 69 73 20 4e 55 4c 4c 2c 20  t zSql is NULL, 
62a0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73  this function as
62b0: 73 75 6d 65 73 20 74 68 61 74 20 61 6e 20 4f 4f  sumes that an OO
62c0: 4d 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e 0a  M has occurred..
62d0: 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  ** In this case 
62e0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20  SQLITE_NOMEM is 
62f0: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70  returned and *pp
6300: 53 74 6d 74 20 73 65 74 20 74 6f 20 4e 55 4c 4c  Stmt set to NULL
6310: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6320: 70 72 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f  prepareFreeAndCo
6330: 6c 6c 65 63 74 45 72 72 6f 72 28 0a 20 20 73 71  llectError(.  sq
6340: 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 73 71  lite3 *db, .  sq
6350: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53  lite3_stmt **ppS
6360: 74 6d 74 2c 0a 20 20 63 68 61 72 20 2a 2a 70 7a  tmt,.  char **pz
6370: 45 72 72 6d 73 67 2c 0a 20 20 63 68 61 72 20 2a  Errmsg,.  char *
6380: 7a 53 71 6c 0a 29 7b 0a 20 20 69 6e 74 20 72 63  zSql.){.  int rc
6390: 3b 0a 20 20 61 73 73 65 72 74 28 20 2a 70 7a 45  ;.  assert( *pzE
63a0: 72 72 6d 73 67 3d 3d 30 20 29 3b 0a 20 20 69 66  rrmsg==0 );.  if
63b0: 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20  ( zSql==0 ){.   
63c0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
63d0: 45 4d 3b 0a 20 20 20 20 2a 70 70 53 74 6d 74 20  EM;.    *ppStmt 
63e0: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
63f0: 20 20 72 63 20 3d 20 70 72 65 70 61 72 65 41 6e    rc = prepareAn
6400: 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 64 62  dCollectError(db
6410: 2c 20 70 70 53 74 6d 74 2c 20 70 7a 45 72 72 6d  , ppStmt, pzErrm
6420: 73 67 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 73  sg, zSql);.    s
6430: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c  qlite3_free(zSql
6440: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
6450: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  rc;.}../*.** Fre
6460: 65 20 74 68 65 20 52 62 75 4f 62 6a 49 74 65 72  e the RbuObjIter
6470: 2e 61 7a 54 62 6c 43 6f 6c 5b 5d 20 61 6e 64 20  .azTblCol[] and 
6480: 52 62 75 4f 62 6a 49 74 65 72 2e 61 62 54 62 6c  RbuObjIter.abTbl
6490: 50 6b 5b 5d 20 61 72 72 61 79 73 20 61 6c 6c 6f  Pk[] arrays allo
64a0: 63 61 74 65 64 0a 2a 2a 20 62 79 20 61 6e 20 65  cated.** by an e
64b0: 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20 72  arlier call to r
64c0: 62 75 4f 62 6a 49 74 65 72 43 61 63 68 65 54 61  buObjIterCacheTa
64d0: 62 6c 65 49 6e 66 6f 28 29 2e 0a 2a 2f 0a 73 74  bleInfo()..*/.st
64e0: 61 74 69 63 20 76 6f 69 64 20 72 62 75 4f 62 6a  atic void rbuObj
64f0: 49 74 65 72 46 72 65 65 43 6f 6c 73 28 52 62 75  IterFreeCols(Rbu
6500: 4f 62 6a 49 74 65 72 20 2a 70 49 74 65 72 29 7b  ObjIter *pIter){
6510: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
6520: 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 54  i=0; i<pIter->nT
6530: 62 6c 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  blCol; i++){.   
6540: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49   sqlite3_free(pI
6550: 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69 5d  ter->azTblCol[i]
6560: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
6570: 72 65 65 28 70 49 74 65 72 2d 3e 61 7a 54 62 6c  ree(pIter->azTbl
6580: 54 79 70 65 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20  Type[i]);.  }.  
6590: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 74  sqlite3_free(pIt
65a0: 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 29 3b 0a 20  er->azTblCol);. 
65b0: 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c   pIter->azTblCol
65c0: 20 3d 20 30 3b 0a 20 20 70 49 74 65 72 2d 3e 61   = 0;.  pIter->a
65d0: 7a 54 62 6c 54 79 70 65 20 3d 20 30 3b 0a 20 20  zTblType = 0;.  
65e0: 70 49 74 65 72 2d 3e 61 69 53 72 63 4f 72 64 65  pIter->aiSrcOrde
65f0: 72 20 3d 20 30 3b 0a 20 20 70 49 74 65 72 2d 3e  r = 0;.  pIter->
6600: 61 62 54 62 6c 50 6b 20 3d 20 30 3b 0a 20 20 70  abTblPk = 0;.  p
6610: 49 74 65 72 2d 3e 61 62 4e 6f 74 4e 75 6c 6c 20  Iter->abNotNull 
6620: 3d 20 30 3b 0a 20 20 70 49 74 65 72 2d 3e 6e 54  = 0;.  pIter->nT
6630: 62 6c 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 49 74  blCol = 0;.  pIt
6640: 65 72 2d 3e 65 54 79 70 65 20 3d 20 30 3b 20 20  er->eType = 0;  
6650: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6660: 49 6e 76 61 6c 69 64 20 76 61 6c 75 65 20 2a 2f  Invalid value */
6670: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 61 6c 69  .}../*.** Finali
6680: 7a 65 20 61 6c 6c 20 73 74 61 74 65 6d 65 6e 74  ze all statement
6690: 73 20 61 6e 64 20 66 72 65 65 20 61 6c 6c 20 61  s and free all a
66a0: 6c 6c 6f 63 61 74 69 6f 6e 73 20 74 68 61 74 20  llocations that 
66b0: 61 72 65 20 73 70 65 63 69 66 69 63 20 74 6f 0a  are specific to.
66c0: 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 6f  ** the current o
66d0: 62 6a 65 63 74 20 28 74 61 62 6c 65 2f 69 6e 64  bject (table/ind
66e0: 65 78 20 70 61 69 72 29 2e 0a 2a 2f 0a 73 74 61  ex pair)..*/.sta
66f0: 74 69 63 20 76 6f 69 64 20 72 62 75 4f 62 6a 49  tic void rbuObjI
6700: 74 65 72 43 6c 65 61 72 53 74 61 74 65 6d 65 6e  terClearStatemen
6710: 74 73 28 52 62 75 4f 62 6a 49 74 65 72 20 2a 70  ts(RbuObjIter *p
6720: 49 74 65 72 29 7b 0a 20 20 52 62 75 55 70 64 61  Iter){.  RbuUpda
6730: 74 65 53 74 6d 74 20 2a 70 55 70 3b 0a 0a 20 20  teStmt *pUp;..  
6740: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
6750: 28 70 49 74 65 72 2d 3e 70 53 65 6c 65 63 74 29  (pIter->pSelect)
6760: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  ;.  sqlite3_fina
6770: 6c 69 7a 65 28 70 49 74 65 72 2d 3e 70 49 6e 73  lize(pIter->pIns
6780: 65 72 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ert);.  sqlite3_
6790: 66 69 6e 61 6c 69 7a 65 28 70 49 74 65 72 2d 3e  finalize(pIter->
67a0: 70 44 65 6c 65 74 65 29 3b 0a 20 20 73 71 6c 69  pDelete);.  sqli
67b0: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 49 74  te3_finalize(pIt
67c0: 65 72 2d 3e 70 54 6d 70 49 6e 73 65 72 74 29 3b  er->pTmpInsert);
67d0: 0a 20 20 70 55 70 20 3d 20 70 49 74 65 72 2d 3e  .  pUp = pIter->
67e0: 70 52 62 75 55 70 64 61 74 65 3b 0a 20 20 77 68  pRbuUpdate;.  wh
67f0: 69 6c 65 28 20 70 55 70 20 29 7b 0a 20 20 20 20  ile( pUp ){.    
6800: 52 62 75 55 70 64 61 74 65 53 74 6d 74 20 2a 70  RbuUpdateStmt *p
6810: 54 6d 70 20 3d 20 70 55 70 2d 3e 70 4e 65 78 74  Tmp = pUp->pNext
6820: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  ;.    sqlite3_fi
6830: 6e 61 6c 69 7a 65 28 70 55 70 2d 3e 70 55 70 64  nalize(pUp->pUpd
6840: 61 74 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ate);.    sqlite
6850: 33 5f 66 72 65 65 28 70 55 70 29 3b 0a 20 20 20  3_free(pUp);.   
6860: 20 70 55 70 20 3d 20 70 54 6d 70 3b 0a 20 20 7d   pUp = pTmp;.  }
6870: 0a 20 20 0a 20 20 70 49 74 65 72 2d 3e 70 53 65  .  .  pIter->pSe
6880: 6c 65 63 74 20 3d 20 30 3b 0a 20 20 70 49 74 65  lect = 0;.  pIte
6890: 72 2d 3e 70 49 6e 73 65 72 74 20 3d 20 30 3b 0a  r->pInsert = 0;.
68a0: 20 20 70 49 74 65 72 2d 3e 70 44 65 6c 65 74 65    pIter->pDelete
68b0: 20 3d 20 30 3b 0a 20 20 70 49 74 65 72 2d 3e 70   = 0;.  pIter->p
68c0: 52 62 75 55 70 64 61 74 65 20 3d 20 30 3b 0a 20  RbuUpdate = 0;. 
68d0: 20 70 49 74 65 72 2d 3e 70 54 6d 70 49 6e 73 65   pIter->pTmpInse
68e0: 72 74 20 3d 20 30 3b 0a 20 20 70 49 74 65 72 2d  rt = 0;.  pIter-
68f0: 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  >nCol = 0;.}../*
6900: 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61 6e 79  .** Clean up any
6910: 20 72 65 73 6f 75 72 63 65 73 20 61 6c 6c 6f 63   resources alloc
6920: 61 74 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  ated as part of 
6930: 74 68 65 20 69 74 65 72 61 74 6f 72 20 6f 62 6a  the iterator obj
6940: 65 63 74 20 70 61 73 73 65 64 0a 2a 2a 20 61 73  ect passed.** as
6950: 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65   the only argume
6960: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nt..*/.static vo
6970: 69 64 20 72 62 75 4f 62 6a 49 74 65 72 46 69 6e  id rbuObjIterFin
6980: 61 6c 69 7a 65 28 52 62 75 4f 62 6a 49 74 65 72  alize(RbuObjIter
6990: 20 2a 70 49 74 65 72 29 7b 0a 20 20 72 62 75 4f   *pIter){.  rbuO
69a0: 62 6a 49 74 65 72 43 6c 65 61 72 53 74 61 74 65  bjIterClearState
69b0: 6d 65 6e 74 73 28 70 49 74 65 72 29 3b 0a 20 20  ments(pIter);.  
69c0: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
69d0: 28 70 49 74 65 72 2d 3e 70 54 62 6c 49 74 65 72  (pIter->pTblIter
69e0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  );.  sqlite3_fin
69f0: 61 6c 69 7a 65 28 70 49 74 65 72 2d 3e 70 49 64  alize(pIter->pId
6a00: 78 49 74 65 72 29 3b 0a 20 20 72 62 75 4f 62 6a  xIter);.  rbuObj
6a10: 49 74 65 72 46 72 65 65 43 6f 6c 73 28 70 49 74  IterFreeCols(pIt
6a20: 65 72 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 49  er);.  memset(pI
6a30: 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 52  ter, 0, sizeof(R
6a40: 62 75 4f 62 6a 49 74 65 72 29 29 3b 0a 7d 0a 0a  buObjIter));.}..
6a50: 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68  /*.** Advance th
6a60: 65 20 69 74 65 72 61 74 6f 72 20 74 6f 20 74 68  e iterator to th
6a70: 65 20 6e 65 78 74 20 70 6f 73 69 74 69 6f 6e 2e  e next position.
6a80: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 65 72 72  .**.** If no err
6a90: 6f 72 20 6f 63 63 75 72 73 2c 20 53 51 4c 49 54  or occurs, SQLIT
6aa0: 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
6ab0: 20 61 6e 64 20 74 68 65 20 69 74 65 72 61 74 6f   and the iterato
6ac0: 72 20 69 73 20 6c 65 66 74 20 0a 2a 2a 20 70 6f  r is left .** po
6ad0: 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6e 65  inting to the ne
6ae0: 78 74 20 65 6e 74 72 79 2e 20 4f 74 68 65 72 77  xt entry. Otherw
6af0: 69 73 65 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f  ise, an error co
6b00: 64 65 20 61 6e 64 20 6d 65 73 73 61 67 65 20 69  de and message i
6b10: 73 20 0a 2a 2a 20 6c 65 66 74 20 69 6e 20 74 68  s .** left in th
6b20: 65 20 52 42 55 20 68 61 6e 64 6c 65 20 70 61 73  e RBU handle pas
6b30: 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
6b40: 20 61 72 67 75 6d 65 6e 74 2e 20 41 20 63 6f 70   argument. A cop
6b50: 79 20 6f 66 20 74 68 65 20 0a 2a 2a 20 65 72 72  y of the .** err
6b60: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
6b70: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
6b80: 6e 74 20 72 62 75 4f 62 6a 49 74 65 72 4e 65 78  nt rbuObjIterNex
6b90: 74 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c  t(sqlite3rbu *p,
6ba0: 20 52 62 75 4f 62 6a 49 74 65 72 20 2a 70 49 74   RbuObjIter *pIt
6bb0: 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
6bc0: 70 2d 3e 72 63 3b 0a 20 20 69 66 28 20 72 63 3d  p->rc;.  if( rc=
6bd0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 0a 20  =SQLITE_OK ){.. 
6be0: 20 20 20 2f 2a 20 46 72 65 65 20 61 6e 79 20 53     /* Free any S
6bf0: 51 4c 69 74 65 20 73 74 61 74 65 6d 65 6e 74 73  QLite statements
6c00: 20 75 73 65 64 20 77 68 69 6c 65 20 70 72 6f 63   used while proc
6c10: 65 73 73 69 6e 67 20 74 68 65 20 70 72 65 76 69  essing the previ
6c20: 6f 75 73 20 6f 62 6a 65 63 74 20 2a 2f 20 0a 20  ous object */ . 
6c30: 20 20 20 72 62 75 4f 62 6a 49 74 65 72 43 6c 65     rbuObjIterCle
6c40: 61 72 53 74 61 74 65 6d 65 6e 74 73 28 70 49 74  arStatements(pIt
6c50: 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74  er);.    if( pIt
6c60: 65 72 2d 3e 7a 49 64 78 3d 3d 30 20 29 7b 0a 20  er->zIdx==0 ){. 
6c70: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
6c80: 33 5f 65 78 65 63 28 70 2d 3e 64 62 4d 61 69 6e  3_exec(p->dbMain
6c90: 2c 0a 20 20 20 20 20 20 20 20 20 20 22 44 52 4f  ,.          "DRO
6ca0: 50 20 54 52 49 47 47 45 52 20 49 46 20 45 58 49  P TRIGGER IF EXI
6cb0: 53 54 53 20 74 65 6d 70 2e 72 62 75 5f 69 6e 73  STS temp.rbu_ins
6cc0: 65 72 74 5f 74 72 3b 22 0a 20 20 20 20 20 20 20  ert_tr;".       
6cd0: 20 20 20 22 44 52 4f 50 20 54 52 49 47 47 45 52     "DROP TRIGGER
6ce0: 20 49 46 20 45 58 49 53 54 53 20 74 65 6d 70 2e   IF EXISTS temp.
6cf0: 72 62 75 5f 75 70 64 61 74 65 31 5f 74 72 3b 22  rbu_update1_tr;"
6d00: 0a 20 20 20 20 20 20 20 20 20 20 22 44 52 4f 50  .          "DROP
6d10: 20 54 52 49 47 47 45 52 20 49 46 20 45 58 49 53   TRIGGER IF EXIS
6d20: 54 53 20 74 65 6d 70 2e 72 62 75 5f 75 70 64 61  TS temp.rbu_upda
6d30: 74 65 32 5f 74 72 3b 22 0a 20 20 20 20 20 20 20  te2_tr;".       
6d40: 20 20 20 22 44 52 4f 50 20 54 52 49 47 47 45 52     "DROP TRIGGER
6d50: 20 49 46 20 45 58 49 53 54 53 20 74 65 6d 70 2e   IF EXISTS temp.
6d60: 72 62 75 5f 64 65 6c 65 74 65 5f 74 72 3b 22 0a  rbu_delete_tr;".
6d70: 20 20 20 20 20 20 20 20 20 20 2c 20 30 2c 20 30            , 0, 0
6d80: 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 0a 20 20  , &p->zErrmsg.  
6d90: 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20      );.    }..  
6da0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
6db0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  _OK ){.      if(
6dc0: 20 70 49 74 65 72 2d 3e 62 43 6c 65 61 6e 75 70   pIter->bCleanup
6dd0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 62 75 4f   ){.        rbuO
6de0: 62 6a 49 74 65 72 46 72 65 65 43 6f 6c 73 28 70  bjIterFreeCols(p
6df0: 49 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 70  Iter);.        p
6e00: 49 74 65 72 2d 3e 62 43 6c 65 61 6e 75 70 20 3d  Iter->bCleanup =
6e10: 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   0;.        rc =
6e20: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 49   sqlite3_step(pI
6e30: 74 65 72 2d 3e 70 54 62 6c 49 74 65 72 29 3b 0a  ter->pTblIter);.
6e40: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
6e50: 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
6e60: 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 65 73          rc = res
6e70: 65 74 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f  etAndCollectErro
6e80: 72 28 70 49 74 65 72 2d 3e 70 54 62 6c 49 74 65  r(pIter->pTblIte
6e90: 72 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 29 3b  r, &p->zErrmsg);
6ea0: 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72  .          pIter
6eb0: 2d 3e 7a 54 62 6c 20 3d 20 30 3b 0a 20 20 20 20  ->zTbl = 0;.    
6ec0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6ed0: 20 20 20 20 20 70 49 74 65 72 2d 3e 7a 54 62 6c       pIter->zTbl
6ee0: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
6ef0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
6f00: 65 78 74 28 70 49 74 65 72 2d 3e 70 54 62 6c 49  ext(pIter->pTblI
6f10: 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ter, 0);.       
6f20: 20 20 20 70 49 74 65 72 2d 3e 7a 44 61 74 61 54     pIter->zDataT
6f30: 62 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  bl = (const char
6f40: 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
6f50: 5f 74 65 78 74 28 70 49 74 65 72 2d 3e 70 54 62  _text(pIter->pTb
6f60: 6c 49 74 65 72 2c 31 29 3b 0a 20 20 20 20 20 20  lIter,1);.      
6f70: 20 20 20 20 72 63 20 3d 20 28 70 49 74 65 72 2d      rc = (pIter-
6f80: 3e 7a 44 61 74 61 54 62 6c 20 26 26 20 70 49 74  >zDataTbl && pIt
6f90: 65 72 2d 3e 7a 54 62 6c 29 20 3f 20 53 51 4c 49  er->zTbl) ? SQLI
6fa0: 54 45 5f 4f 4b 20 3a 20 53 51 4c 49 54 45 5f 4e  TE_OK : SQLITE_N
6fb0: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 7d 0a  OMEM;.        }.
6fc0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
6fd0: 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e       if( pIter->
6fe0: 7a 49 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  zIdx==0 ){.     
6ff0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d       sqlite3_stm
7000: 74 20 2a 70 49 64 78 20 3d 20 70 49 74 65 72 2d  t *pIdx = pIter-
7010: 3e 70 49 64 78 49 74 65 72 3b 0a 20 20 20 20 20  >pIdxIter;.     
7020: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
7030: 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 49 64 78  3_bind_text(pIdx
7040: 2c 20 31 2c 20 70 49 74 65 72 2d 3e 7a 54 62 6c  , 1, pIter->zTbl
7050: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41  , -1, SQLITE_STA
7060: 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  TIC);.        }.
7070: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
7080: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
7090: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
70a0: 74 65 33 5f 73 74 65 70 28 70 49 74 65 72 2d 3e  te3_step(pIter->
70b0: 70 49 64 78 49 74 65 72 29 3b 0a 20 20 20 20 20  pIdxIter);.     
70c0: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
70d0: 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20  ITE_ROW ){.     
70e0: 20 20 20 20 20 20 20 72 63 20 3d 20 72 65 73 65         rc = rese
70f0: 74 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72  tAndCollectError
7100: 28 70 49 74 65 72 2d 3e 70 49 64 78 49 74 65 72  (pIter->pIdxIter
7110: 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a  , &p->zErrmsg);.
7120: 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
7130: 72 2d 3e 62 43 6c 65 61 6e 75 70 20 3d 20 31 3b  r->bCleanup = 1;
7140: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74  .            pIt
7150: 65 72 2d 3e 7a 49 64 78 20 3d 20 30 3b 0a 20 20  er->zIdx = 0;.  
7160: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
7170: 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72             pIter
7180: 2d 3e 7a 49 64 78 20 3d 20 28 63 6f 6e 73 74 20  ->zIdx = (const 
7190: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
71a0: 6c 75 6d 6e 5f 74 65 78 74 28 70 49 74 65 72 2d  lumn_text(pIter-
71b0: 3e 70 49 64 78 49 74 65 72 2c 20 30 29 3b 0a 20  >pIdxIter, 0);. 
71c0: 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72             pIter
71d0: 2d 3e 69 54 6e 75 6d 20 3d 20 73 71 6c 69 74 65  ->iTnum = sqlite
71e0: 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 49 74  3_column_int(pIt
71f0: 65 72 2d 3e 70 49 64 78 49 74 65 72 2c 20 31 29  er->pIdxIter, 1)
7200: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49  ;.            pI
7210: 74 65 72 2d 3e 62 55 6e 69 71 75 65 20 3d 20 73  ter->bUnique = s
7220: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
7230: 74 28 70 49 74 65 72 2d 3e 70 49 64 78 49 74 65  t(pIter->pIdxIte
7240: 72 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20 20  r, 2);.         
7250: 20 20 20 72 63 20 3d 20 70 49 74 65 72 2d 3e 7a     rc = pIter->z
7260: 49 64 78 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20  Idx ? SQLITE_OK 
7270: 3a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  : SQLITE_NOMEM;.
7280: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
7290: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
72a0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72    }.  }..  if( r
72b0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
72c0: 20 20 20 20 72 62 75 4f 62 6a 49 74 65 72 46 69      rbuObjIterFi
72d0: 6e 61 6c 69 7a 65 28 70 49 74 65 72 29 3b 0a 20  nalize(pIter);. 
72e0: 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20     p->rc = rc;. 
72f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
7300: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6d  }.../*.** The im
7310: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
7320: 74 68 65 20 72 62 75 5f 74 61 72 67 65 74 5f 6e  the rbu_target_n
7330: 61 6d 65 28 29 20 53 51 4c 20 66 75 6e 63 74 69  ame() SQL functi
7340: 6f 6e 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  on. This functio
7350: 6e 0a 2a 2a 20 61 63 63 65 70 74 73 20 6f 6e 65  n.** accepts one
7360: 20 6f 72 20 74 77 6f 20 61 72 67 75 6d 65 6e 74   or two argument
7370: 73 2e 20 54 68 65 20 66 69 72 73 74 20 61 72 67  s. The first arg
7380: 75 6d 65 6e 74 20 69 73 20 74 68 65 20 6e 61 6d  ument is the nam
7390: 65 20 6f 66 20 61 20 74 61 62 6c 65 20 2d 0a 2a  e of a table -.*
73a0: 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  * the name of a 
73b0: 74 61 62 6c 65 20 69 6e 20 74 68 65 20 52 42 55  table in the RBU
73c0: 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20   database.  The 
73d0: 73 65 63 6f 6e 64 2c 20 69 66 20 69 74 20 69 73  second, if it is
73e0: 20 70 72 65 73 65 6e 74 2c 20 69 73 20 31 0a 2a   present, is 1.*
73f0: 2a 20 66 6f 72 20 61 20 76 69 65 77 20 6f 72 20  * for a view or 
7400: 30 20 66 6f 72 20 61 20 74 61 62 6c 65 2e 20 0a  0 for a table. .
7410: 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 6e 6f 6e 2d  **.** For a non-
7420: 76 61 63 75 75 6d 20 52 42 55 20 68 61 6e 64 6c  vacuum RBU handl
7430: 65 2c 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  e, if the table 
7440: 6e 61 6d 65 20 6d 61 74 63 68 65 73 20 74 68 65  name matches the
7450: 20 70 61 74 74 65 72 6e 3a 0a 2a 2a 0a 2a 2a 20   pattern:.**.** 
7460: 20 20 20 20 64 61 74 61 5b 30 2d 39 5d 5f 3c 6e      data[0-9]_<n
7470: 61 6d 65 3e 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65  ame>.**.** where
7480: 20 3c 6e 61 6d 65 3e 20 69 73 20 61 6e 79 20 73   <name> is any s
7490: 65 71 75 65 6e 63 65 20 6f 66 20 31 20 6f 72 20  equence of 1 or 
74a0: 6d 6f 72 65 20 63 68 61 72 61 63 74 65 72 73 2c  more characters,
74b0: 20 3c 6e 61 6d 65 3e 20 69 73 20 72 65 74 75 72   <name> is retur
74c0: 6e 65 64 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ned..** Otherwis
74d0: 65 2c 20 69 66 20 74 68 65 20 6f 6e 6c 79 20 61  e, if the only a
74e0: 72 67 75 6d 65 6e 74 20 64 6f 65 73 20 6e 6f 74  rgument does not
74f0: 20 6d 61 74 63 68 20 74 68 65 20 61 62 6f 76 65   match the above
7500: 20 70 61 74 74 65 72 6e 2c 20 61 6e 20 53 51 4c   pattern, an SQL
7510: 0a 2a 2a 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  .** NULL is retu
7520: 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  rned..**.**     
7530: 22 64 61 74 61 5f 74 31 22 20 20 20 20 20 2d 3e  "data_t1"     ->
7540: 20 22 74 31 22 0a 2a 2a 20 20 20 20 20 22 64 61   "t1".**     "da
7550: 74 61 30 31 32 33 5f 74 32 22 20 2d 3e 20 22 74  ta0123_t2" -> "t
7560: 32 22 0a 2a 2a 20 20 20 20 20 22 64 61 74 61 41  2".**     "dataA
7570: 42 5f 74 33 22 20 20 20 2d 3e 20 4e 55 4c 4c 0a  B_t3"   -> NULL.
7580: 2a 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 72 62 75  **.** For an rbu
7590: 20 76 61 63 75 75 6d 20 68 61 6e 64 6c 65 2c 20   vacuum handle, 
75a0: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 66 69  a copy of the fi
75b0: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  rst argument is 
75c0: 72 65 74 75 72 6e 65 64 20 69 66 0a 2a 2a 20 74  returned if.** t
75d0: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
75e0: 6e 74 20 69 73 20 65 69 74 68 65 72 20 6d 69 73  nt is either mis
75f0: 73 69 6e 67 20 6f 72 20 30 20 28 6e 6f 74 20 61  sing or 0 (not a
7600: 20 76 69 65 77 29 2e 0a 2a 2f 0a 73 74 61 74 69   view)..*/.stati
7610: 63 20 76 6f 69 64 20 72 62 75 54 61 72 67 65 74  c void rbuTarget
7620: 4e 61 6d 65 46 75 6e 63 28 0a 20 20 73 71 6c 69  NameFunc(.  sqli
7630: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74  te3_context *pCt
7640: 78 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  x,.  int argc,. 
7650: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
7660: 2a 61 72 67 76 0a 29 7b 0a 20 20 73 71 6c 69 74  *argv.){.  sqlit
7670: 65 33 72 62 75 20 2a 70 20 3d 20 73 71 6c 69 74  e3rbu *p = sqlit
7680: 65 33 5f 75 73 65 72 5f 64 61 74 61 28 70 43 74  e3_user_data(pCt
7690: 78 29 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  x);.  const char
76a0: 20 2a 7a 49 6e 3b 0a 20 20 61 73 73 65 72 74 28   *zIn;.  assert(
76b0: 20 61 72 67 63 3d 3d 31 20 7c 7c 20 61 72 67 63   argc==1 || argc
76c0: 3d 3d 32 20 29 3b 0a 0a 20 20 7a 49 6e 20 3d 20  ==2 );..  zIn = 
76d0: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
76e0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
76f0: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28 20  argv[0]);.  if( 
7700: 7a 49 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 72  zIn ){.    if( r
7710: 62 75 49 73 56 61 63 75 75 6d 28 70 29 20 29 7b  buIsVacuum(p) ){
7720: 0a 20 20 20 20 20 20 69 66 28 20 61 72 67 63 3d  .      if( argc=
7730: 3d 31 20 7c 7c 20 30 3d 3d 73 71 6c 69 74 65 33  =1 || 0==sqlite3
7740: 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b  _value_int(argv[
7750: 31 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  1]) ){.        s
7760: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
7770: 78 74 28 70 43 74 78 2c 20 7a 49 6e 2c 20 2d 31  xt(pCtx, zIn, -1
7780: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
7790: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
77a0: 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 73  lse{.      if( s
77b0: 74 72 6c 65 6e 28 7a 49 6e 29 3e 34 20 26 26 20  trlen(zIn)>4 && 
77c0: 6d 65 6d 63 6d 70 28 22 64 61 74 61 22 2c 20 7a  memcmp("data", z
77d0: 49 6e 2c 20 34 29 3d 3d 30 20 29 7b 0a 20 20 20  In, 4)==0 ){.   
77e0: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
77f0: 20 20 20 20 66 6f 72 28 69 3d 34 3b 20 7a 49 6e      for(i=4; zIn
7800: 5b 69 5d 3e 3d 27 30 27 20 26 26 20 7a 49 6e 5b  [i]>='0' && zIn[
7810: 69 5d 3c 3d 27 39 27 3b 20 69 2b 2b 29 3b 0a 20  i]<='9'; i++);. 
7820: 20 20 20 20 20 20 20 69 66 28 20 7a 49 6e 5b 69         if( zIn[i
7830: 5d 3d 3d 27 5f 27 20 26 26 20 7a 49 6e 5b 69 2b  ]=='_' && zIn[i+
7840: 31 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  1] ){.          
7850: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
7860: 65 78 74 28 70 43 74 78 2c 20 26 7a 49 6e 5b 69  ext(pCtx, &zIn[i
7870: 2b 31 5d 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  +1], -1, SQLITE_
7880: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20  STATIC);.       
7890: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
78a0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  .  }.}../*.** In
78b0: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 69 74 65  itialize the ite
78c0: 72 61 74 6f 72 20 73 74 72 75 63 74 75 72 65 20  rator structure 
78d0: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
78e0: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  cond argument..*
78f0: 2a 0a 2a 2a 20 49 66 20 6e 6f 20 65 72 72 6f 72  *.** If no error
7900: 20 6f 63 63 75 72 73 2c 20 53 51 4c 49 54 45 5f   occurs, SQLITE_
7910: 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  OK is returned a
7920: 6e 64 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  nd the iterator 
7930: 69 73 20 6c 65 66 74 20 0a 2a 2a 20 70 6f 69 6e  is left .** poin
7940: 74 69 6e 67 20 74 6f 20 74 68 65 20 66 69 72 73  ting to the firs
7950: 74 20 65 6e 74 72 79 2e 20 4f 74 68 65 72 77 69  t entry. Otherwi
7960: 73 65 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  se, an error cod
7970: 65 20 61 6e 64 20 6d 65 73 73 61 67 65 20 69 73  e and message is
7980: 20 0a 2a 2a 20 6c 65 66 74 20 69 6e 20 74 68 65   .** left in the
7990: 20 52 42 55 20 68 61 6e 64 6c 65 20 70 61 73 73   RBU handle pass
79a0: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
79b0: 61 72 67 75 6d 65 6e 74 2e 20 41 20 63 6f 70 79  argument. A copy
79c0: 20 6f 66 20 74 68 65 20 0a 2a 2a 20 65 72 72 6f   of the .** erro
79d0: 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
79e0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
79f0: 74 20 72 62 75 4f 62 6a 49 74 65 72 46 69 72 73  t rbuObjIterFirs
7a00: 74 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c  t(sqlite3rbu *p,
7a10: 20 52 62 75 4f 62 6a 49 74 65 72 20 2a 70 49 74   RbuObjIter *pIt
7a20: 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
7a30: 20 6d 65 6d 73 65 74 28 70 49 74 65 72 2c 20 30   memset(pIter, 0
7a40: 2c 20 73 69 7a 65 6f 66 28 52 62 75 4f 62 6a 49  , sizeof(RbuObjI
7a50: 74 65 72 29 29 3b 0a 0a 20 20 72 63 20 3d 20 70  ter));..  rc = p
7a60: 72 65 70 61 72 65 41 6e 64 43 6f 6c 6c 65 63 74  repareAndCollect
7a70: 45 72 72 6f 72 28 70 2d 3e 64 62 52 62 75 2c 20  Error(p->dbRbu, 
7a80: 26 70 49 74 65 72 2d 3e 70 54 62 6c 49 74 65 72  &pIter->pTblIter
7a90: 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 20 0a  , &p->zErrmsg, .
7aa0: 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 72 62        "SELECT rb
7ab0: 75 5f 74 61 72 67 65 74 5f 6e 61 6d 65 28 6e 61  u_target_name(na
7ac0: 6d 65 2c 20 74 79 70 65 3d 27 76 69 65 77 27 29  me, type='view')
7ad0: 20 41 53 20 74 61 72 67 65 74 2c 20 6e 61 6d 65   AS target, name
7ae0: 20 22 0a 20 20 20 20 20 20 22 46 52 4f 4d 20 73   ".      "FROM s
7af0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 22 0a 20  qlite_master ". 
7b00: 20 20 20 20 20 22 57 48 45 52 45 20 74 79 70 65       "WHERE type
7b10: 20 49 4e 20 28 27 74 61 62 6c 65 27 2c 20 27 76   IN ('table', 'v
7b20: 69 65 77 27 29 20 41 4e 44 20 74 61 72 67 65 74  iew') AND target
7b30: 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 22 0a 20   IS NOT NULL ". 
7b40: 20 20 20 20 20 22 4f 52 44 45 52 20 42 59 20 6e       "ORDER BY n
7b50: 61 6d 65 22 0a 20 20 29 3b 0a 0a 20 20 69 66 28  ame".  );..  if(
7b60: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
7b70: 7b 0a 20 20 20 20 72 63 20 3d 20 70 72 65 70 61  {.    rc = prepa
7b80: 72 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f  reAndCollectErro
7b90: 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 70 49  r(p->dbMain, &pI
7ba0: 74 65 72 2d 3e 70 49 64 78 49 74 65 72 2c 20 26  ter->pIdxIter, &
7bb0: 70 2d 3e 7a 45 72 72 6d 73 67 2c 0a 20 20 20 20  p->zErrmsg,.    
7bc0: 20 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d 65      "SELECT name
7bd0: 2c 20 72 6f 6f 74 70 61 67 65 2c 20 73 71 6c 20  , rootpage, sql 
7be0: 49 53 20 4e 55 4c 4c 20 4f 52 20 73 75 62 73 74  IS NULL OR subst
7bf0: 72 28 38 2c 20 36 29 3d 3d 27 55 4e 49 51 55 45  r(8, 6)=='UNIQUE
7c00: 27 20 22 0a 20 20 20 20 20 20 20 20 22 20 20 46  ' ".        "  F
7c10: 52 4f 4d 20 6d 61 69 6e 2e 73 71 6c 69 74 65 5f  ROM main.sqlite_
7c20: 6d 61 73 74 65 72 20 22 0a 20 20 20 20 20 20 20  master ".       
7c30: 20 22 20 20 57 48 45 52 45 20 74 79 70 65 3d 27   "  WHERE type='
7c40: 69 6e 64 65 78 27 20 41 4e 44 20 74 62 6c 5f 6e  index' AND tbl_n
7c50: 61 6d 65 20 3d 20 3f 22 0a 20 20 20 20 29 3b 0a  ame = ?".    );.
7c60: 20 20 7d 0a 0a 20 20 70 49 74 65 72 2d 3e 62 43    }..  pIter->bC
7c70: 6c 65 61 6e 75 70 20 3d 20 31 3b 0a 20 20 70 2d  leanup = 1;.  p-
7c80: 3e 72 63 20 3d 20 72 63 3b 0a 20 20 72 65 74 75  >rc = rc;.  retu
7c90: 72 6e 20 72 62 75 4f 62 6a 49 74 65 72 4e 65 78  rn rbuObjIterNex
7ca0: 74 28 70 2c 20 70 49 74 65 72 29 3b 0a 7d 0a 0a  t(p, pIter);.}..
7cb0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  /*.** This is a 
7cc0: 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 22  wrapper around "
7cd0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
7ce0: 7a 46 6d 74 2c 20 2e 2e 2e 29 22 2e 20 49 66 20  zFmt, ...)". If 
7cf0: 61 6e 20 4f 4f 4d 20 6f 63 63 75 72 73 2c 0a 2a  an OOM occurs,.*
7d00: 2a 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  * an error code 
7d10: 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  is stored in the
7d20: 20 52 42 55 20 68 61 6e 64 6c 65 20 70 61 73 73   RBU handle pass
7d30: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
7d40: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  argument..**.** 
7d50: 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20  If an error has 
7d60: 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64  already occurred
7d70: 20 28 70 2d 3e 72 63 20 69 73 20 61 6c 72 65 61   (p->rc is alrea
7d80: 64 79 20 73 65 74 20 74 6f 20 73 6f 6d 65 74 68  dy set to someth
7d90: 69 6e 67 20 6f 74 68 65 72 0a 2a 2a 20 74 68 61  ing other.** tha
7da0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 29 2c 20 74 68  n SQLITE_OK), th
7db0: 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
7dc0: 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 77 69   returns NULL wi
7dd0: 74 68 6f 75 74 20 6d 6f 64 69 66 79 69 6e 67 20  thout modifying 
7de0: 74 68 65 0a 2a 2a 20 73 74 6f 72 65 64 20 65 72  the.** stored er
7df0: 72 6f 72 20 63 6f 64 65 2e 20 49 6e 20 74 68 69  ror code. In thi
7e00: 73 20 63 61 73 65 20 69 74 20 73 74 69 6c 6c 20  s case it still 
7e10: 63 61 6c 6c 73 20 73 71 6c 69 74 65 33 5f 66 72  calls sqlite3_fr
7e20: 65 65 28 29 20 6f 6e 20 61 6e 79 20 0a 2a 2a 20  ee() on any .** 
7e30: 70 72 69 6e 74 66 28 29 20 70 61 72 61 6d 65 74  printf() paramet
7e40: 65 72 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ers associated w
7e50: 69 74 68 20 25 7a 20 63 6f 6e 76 65 72 73 69 6f  ith %z conversio
7e60: 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  ns..*/.static ch
7e70: 61 72 20 2a 72 62 75 4d 50 72 69 6e 74 66 28 73  ar *rbuMPrintf(s
7e80: 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 63 6f  qlite3rbu *p, co
7e90: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d 74 2c 20  nst char *zFmt, 
7ea0: 2e 2e 2e 29 7b 0a 20 20 63 68 61 72 20 2a 7a 53  ...){.  char *zS
7eb0: 71 6c 20 3d 20 30 3b 0a 20 20 76 61 5f 6c 69 73  ql = 0;.  va_lis
7ec0: 74 20 61 70 3b 0a 20 20 76 61 5f 73 74 61 72 74  t ap;.  va_start
7ed0: 28 61 70 2c 20 7a 46 6d 74 29 3b 0a 20 20 7a 53  (ap, zFmt);.  zS
7ee0: 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 6d 70  ql = sqlite3_vmp
7ef0: 72 69 6e 74 66 28 7a 46 6d 74 2c 20 61 70 29 3b  rintf(zFmt, ap);
7f00: 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
7f10: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
7f20: 66 28 20 7a 53 71 6c 3d 3d 30 20 29 20 70 2d 3e  f( zSql==0 ) p->
7f30: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
7f40: 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  M;.  }else{.    
7f50: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71  sqlite3_free(zSq
7f60: 6c 29 3b 0a 20 20 20 20 7a 53 71 6c 20 3d 20 30  l);.    zSql = 0
7f70: 3b 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61  ;.  }.  va_end(a
7f80: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 53 71  p);.  return zSq
7f90: 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75  l;.}../*.** Argu
7fa0: 6d 65 6e 74 20 7a 46 6d 74 20 69 73 20 61 20 73  ment zFmt is a s
7fb0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 29  qlite3_mprintf()
7fc0: 20 73 74 79 6c 65 20 66 6f 72 6d 61 74 20 73 74   style format st
7fd0: 72 69 6e 67 2e 20 54 68 65 20 74 72 61 69 6c 69  ring. The traili
7fe0: 6e 67 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20  ng.** arguments 
7ff0: 61 72 65 20 74 68 65 20 75 73 75 61 6c 20 73 75  are the usual su
8000: 62 73 69 74 75 74 69 6f 6e 20 76 61 6c 75 65 73  bsitution values
8010: 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
8020: 70 65 72 66 6f 72 6d 73 0a 2a 2a 20 74 68 65 20  performs.** the 
8030: 70 72 69 6e 74 66 28 29 20 73 74 79 6c 65 20 73  printf() style s
8040: 75 62 73 74 69 74 75 74 69 6f 6e 73 20 61 6e 64  ubstitutions and
8050: 20 65 78 65 63 75 74 65 73 20 74 68 65 20 72 65   executes the re
8060: 73 75 6c 74 20 61 73 20 61 6e 20 53 51 4c 0a 2a  sult as an SQL.*
8070: 2a 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 74  * statement on t
8080: 68 65 20 52 42 55 20 68 61 6e 64 6c 65 73 20 64  he RBU handles d
8090: 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  atabase..**.** I
80a0: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
80b0: 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  s, an error code
80c0: 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61   and error messa
80d0: 67 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  ge is stored in 
80e0: 74 68 65 0a 2a 2a 20 52 42 55 20 68 61 6e 64 6c  the.** RBU handl
80f0: 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68  e. If an error h
8100: 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72  as already occur
8110: 72 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75  red when this fu
8120: 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 63 61 6c  nction is.** cal
8130: 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d  led, it is a no-
8140: 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  op..*/.static in
8150: 74 20 72 62 75 4d 50 72 69 6e 74 66 45 78 65 63  t rbuMPrintfExec
8160: 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20  (sqlite3rbu *p, 
8170: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e  sqlite3 *db, con
8180: 73 74 20 63 68 61 72 20 2a 7a 46 6d 74 2c 20 2e  st char *zFmt, .
8190: 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61  ..){.  va_list a
81a0: 70 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b  p;.  char *zSql;
81b0: 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20  .  va_start(ap, 
81c0: 7a 46 6d 74 29 3b 0a 20 20 7a 53 71 6c 20 3d 20  zFmt);.  zSql = 
81d0: 73 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74 66  sqlite3_vmprintf
81e0: 28 7a 46 6d 74 2c 20 61 70 29 3b 0a 20 20 69 66  (zFmt, ap);.  if
81f0: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
8200: 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 7a 53  OK ){.    if( zS
8210: 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  ql==0 ){.      p
8220: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ->rc = SQLITE_NO
8230: 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  MEM;.    }else{.
8240: 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71        p->rc = sq
8250: 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20 7a  lite3_exec(db, z
8260: 53 71 6c 2c 20 30 2c 20 30 2c 20 26 70 2d 3e 7a  Sql, 0, 0, &p->z
8270: 45 72 72 6d 73 67 29 3b 0a 20 20 20 20 7d 0a 20  Errmsg);.    }. 
8280: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
8290: 65 28 7a 53 71 6c 29 3b 0a 20 20 76 61 5f 65 6e  e(zSql);.  va_en
82a0: 64 28 61 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  d(ap);.  return 
82b0: 70 2d 3e 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  p->rc;.}../*.** 
82c0: 41 74 74 65 6d 70 74 20 74 6f 20 61 6c 6c 6f 63  Attempt to alloc
82d0: 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61  ate and return a
82e0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 7a 65   pointer to a ze
82f0: 72 6f 65 64 20 62 6c 6f 63 6b 20 6f 66 20 6e 42  roed block of nB
8300: 79 74 65 20 0a 2a 2a 20 62 79 74 65 73 2e 20 0a  yte .** bytes. .
8310: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
8320: 72 20 28 69 2e 65 2e 20 61 6e 20 4f 4f 4d 20 63  r (i.e. an OOM c
8330: 6f 6e 64 69 74 69 6f 6e 29 20 6f 63 63 75 72 73  ondition) occurs
8340: 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e  , return NULL an
8350: 64 20 6c 65 61 76 65 20 61 6e 20 0a 2a 2a 20 65  d leave an .** e
8360: 72 72 6f 72 20 63 6f 64 65 20 69 6e 20 74 68 65  rror code in the
8370: 20 72 62 75 20 68 61 6e 64 6c 65 20 70 61 73 73   rbu handle pass
8380: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
8390: 61 72 67 75 6d 65 6e 74 2e 20 4f 72 2c 20 69 66  argument. Or, if
83a0: 20 61 6e 20 0a 2a 2a 20 65 72 72 6f 72 20 68 61   an .** error ha
83b0: 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72  s already occurr
83c0: 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ed when this fun
83d0: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
83e0: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 0a 2a 2a   return NULL .**
83f0: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 77 69 74   immediately wit
8400: 68 6f 75 74 20 61 74 74 65 6d 70 74 69 6e 67 20  hout attempting 
8410: 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f  the allocation o
8420: 72 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20  r modifying the 
8430: 73 74 6f 72 65 64 0a 2a 2a 20 65 72 72 6f 72 20  stored.** error 
8440: 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  code..*/.static 
8450: 76 6f 69 64 20 2a 72 62 75 4d 61 6c 6c 6f 63 28  void *rbuMalloc(
8460: 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 69  sqlite3rbu *p, i
8470: 6e 74 20 6e 42 79 74 65 29 7b 0a 20 20 76 6f 69  nt nByte){.  voi
8480: 64 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 69  d *pRet = 0;.  i
8490: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
84a0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OK ){.    asser
84b0: 74 28 20 6e 42 79 74 65 3e 30 20 29 3b 0a 20 20  t( nByte>0 );.  
84c0: 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33    pRet = sqlite3
84d0: 5f 6d 61 6c 6c 6f 63 36 34 28 6e 42 79 74 65 29  _malloc64(nByte)
84e0: 3b 0a 20 20 20 20 69 66 28 20 70 52 65 74 3d 3d  ;.    if( pRet==
84f0: 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63  0 ){.      p->rc
8500: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
8510: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
8520: 20 20 6d 65 6d 73 65 74 28 70 52 65 74 2c 20 30    memset(pRet, 0
8530: 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 7d 0a  , nByte);.    }.
8540: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65    }.  return pRe
8550: 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  t;.}.../*.** All
8560: 6f 63 61 74 65 20 61 6e 64 20 7a 65 72 6f 20 74  ocate and zero t
8570: 68 65 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43  he pIter->azTblC
8580: 6f 6c 5b 5d 20 61 6e 64 20 61 62 54 62 6c 50 6b  ol[] and abTblPk
8590: 5b 5d 20 61 72 72 61 79 73 20 73 6f 20 74 68 61  [] arrays so tha
85a0: 74 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 72 6f  t.** there is ro
85b0: 6f 6d 20 66 6f 72 20 61 74 20 6c 65 61 73 74 20  om for at least 
85c0: 6e 43 6f 6c 20 65 6c 65 6d 65 6e 74 73 2e 20 49  nCol elements. I
85d0: 66 20 61 6e 20 4f 4f 4d 20 6f 63 63 75 72 73 2c  f an OOM occurs,
85e0: 20 73 74 6f 72 65 20 61 6e 0a 2a 2a 20 65 72 72   store an.** err
85f0: 6f 72 20 63 6f 64 65 20 69 6e 20 74 68 65 20 52  or code in the R
8600: 42 55 20 68 61 6e 64 6c 65 20 70 61 73 73 65 64  BU handle passed
8610: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
8620: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  gument..*/.stati
8630: 63 20 76 6f 69 64 20 72 62 75 41 6c 6c 6f 63 61  c void rbuAlloca
8640: 74 65 49 74 65 72 41 72 72 61 79 73 28 73 71 6c  teIterArrays(sql
8650: 69 74 65 33 72 62 75 20 2a 70 2c 20 52 62 75 4f  ite3rbu *p, RbuO
8660: 62 6a 49 74 65 72 20 2a 70 49 74 65 72 2c 20 69  bjIter *pIter, i
8670: 6e 74 20 6e 43 6f 6c 29 7b 0a 20 20 69 6e 74 20  nt nCol){.  int 
8680: 6e 42 79 74 65 20 3d 20 28 32 2a 73 69 7a 65 6f  nByte = (2*sizeo
8690: 66 28 63 68 61 72 2a 29 20 2b 20 73 69 7a 65 6f  f(char*) + sizeo
86a0: 66 28 69 6e 74 29 20 2b 20 33 2a 73 69 7a 65 6f  f(int) + 3*sizeo
86b0: 66 28 75 38 29 29 20 2a 20 6e 43 6f 6c 3b 0a 20  f(u8)) * nCol;. 
86c0: 20 63 68 61 72 20 2a 2a 61 7a 4e 65 77 3b 0a 0a   char **azNew;..
86d0: 20 20 61 7a 4e 65 77 20 3d 20 28 63 68 61 72 2a    azNew = (char*
86e0: 2a 29 72 62 75 4d 61 6c 6c 6f 63 28 70 2c 20 6e  *)rbuMalloc(p, n
86f0: 42 79 74 65 29 3b 0a 20 20 69 66 28 20 61 7a 4e  Byte);.  if( azN
8700: 65 77 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d  ew ){.    pIter-
8710: 3e 61 7a 54 62 6c 43 6f 6c 20 3d 20 61 7a 4e 65  >azTblCol = azNe
8720: 77 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 61 7a  w;.    pIter->az
8730: 54 62 6c 54 79 70 65 20 3d 20 26 61 7a 4e 65 77  TblType = &azNew
8740: 5b 6e 43 6f 6c 5d 3b 0a 20 20 20 20 70 49 74 65  [nCol];.    pIte
8750: 72 2d 3e 61 69 53 72 63 4f 72 64 65 72 20 3d 20  r->aiSrcOrder = 
8760: 28 69 6e 74 2a 29 26 70 49 74 65 72 2d 3e 61 7a  (int*)&pIter->az
8770: 54 62 6c 54 79 70 65 5b 6e 43 6f 6c 5d 3b 0a 20  TblType[nCol];. 
8780: 20 20 20 70 49 74 65 72 2d 3e 61 62 54 62 6c 50     pIter->abTblP
8790: 6b 20 3d 20 28 75 38 2a 29 26 70 49 74 65 72 2d  k = (u8*)&pIter-
87a0: 3e 61 69 53 72 63 4f 72 64 65 72 5b 6e 43 6f 6c  >aiSrcOrder[nCol
87b0: 5d 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 61 62  ];.    pIter->ab
87c0: 4e 6f 74 4e 75 6c 6c 20 3d 20 28 75 38 2a 29 26  NotNull = (u8*)&
87d0: 70 49 74 65 72 2d 3e 61 62 54 62 6c 50 6b 5b 6e  pIter->abTblPk[n
87e0: 43 6f 6c 5d 3b 0a 20 20 20 20 70 49 74 65 72 2d  Col];.    pIter-
87f0: 3e 61 62 49 6e 64 65 78 65 64 20 3d 20 28 75 38  >abIndexed = (u8
8800: 2a 29 26 70 49 74 65 72 2d 3e 61 62 4e 6f 74 4e  *)&pIter->abNotN
8810: 75 6c 6c 5b 6e 43 6f 6c 5d 3b 0a 20 20 7d 0a 7d  ull[nCol];.  }.}
8820: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ../*.** The firs
8830: 74 20 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20  t argument must 
8840: 62 65 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  be a nul-termina
8850: 74 65 64 20 73 74 72 69 6e 67 2e 20 54 68 69 73  ted string. This
8860: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 72 65 74   function.** ret
8870: 75 72 6e 73 20 61 20 63 6f 70 79 20 6f 66 20 74  urns a copy of t
8880: 68 65 20 73 74 72 69 6e 67 20 69 6e 20 6d 65 6d  he string in mem
8890: 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ory obtained fro
88a0: 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
88b0: 28 29 2e 0a 2a 2a 20 49 74 20 69 73 20 74 68 65  ()..** It is the
88c0: 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
88d0: 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  of the caller to
88e0: 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65   eventually free
88f0: 20 74 68 69 73 20 6d 65 6d 6f 72 79 0a 2a 2a 20   this memory.** 
8900: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 72  using sqlite3_fr
8910: 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ee()..**.** If a
8920: 6e 20 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e 20  n OOM condition 
8930: 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 77  is encountered w
8940: 68 65 6e 20 61 74 74 65 6d 70 74 69 6e 67 20 74  hen attempting t
8950: 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72  o allocate memor
8960: 79 2c 0a 2a 2a 20 6f 75 74 70 75 74 20 76 61 72  y,.** output var
8970: 69 61 62 6c 65 20 28 2a 70 52 63 29 20 69 73 20  iable (*pRc) is 
8980: 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4e 4f  set to SQLITE_NO
8990: 4d 45 4d 20 62 65 66 6f 72 65 20 72 65 74 75 72  MEM before retur
89a0: 6e 69 6e 67 2e 20 4f 74 68 65 72 77 69 73 65 2c  ning. Otherwise,
89b0: 0a 2a 2a 20 69 66 20 74 68 65 20 61 6c 6c 6f 63  .** if the alloc
89c0: 61 74 69 6f 6e 20 73 75 63 63 65 65 64 73 2c 20  ation succeeds, 
89d0: 28 2a 70 52 63 29 20 69 73 20 6c 65 66 74 20 75  (*pRc) is left u
89e0: 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 73 74 61  nchanged..*/.sta
89f0: 74 69 63 20 63 68 61 72 20 2a 72 62 75 53 74 72  tic char *rbuStr
8a00: 6e 64 75 70 28 63 6f 6e 73 74 20 63 68 61 72 20  ndup(const char 
8a10: 2a 7a 53 74 72 2c 20 69 6e 74 20 2a 70 52 63 29  *zStr, int *pRc)
8a20: 7b 0a 20 20 63 68 61 72 20 2a 7a 52 65 74 20 3d  {.  char *zRet =
8a30: 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 2a   0;..  assert( *
8a40: 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  pRc==SQLITE_OK )
8a50: 3b 0a 20 20 69 66 28 20 7a 53 74 72 20 29 7b 0a  ;.  if( zStr ){.
8a60: 20 20 20 20 73 69 7a 65 5f 74 20 6e 43 6f 70 79      size_t nCopy
8a70: 20 3d 20 73 74 72 6c 65 6e 28 7a 53 74 72 29 20   = strlen(zStr) 
8a80: 2b 20 31 3b 0a 20 20 20 20 7a 52 65 74 20 3d 20  + 1;.    zRet = 
8a90: 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 6d  (char*)sqlite3_m
8aa0: 61 6c 6c 6f 63 36 34 28 6e 43 6f 70 79 29 3b 0a  alloc64(nCopy);.
8ab0: 20 20 20 20 69 66 28 20 7a 52 65 74 20 29 7b 0a      if( zRet ){.
8ac0: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 52 65        memcpy(zRe
8ad0: 74 2c 20 7a 53 74 72 2c 20 6e 43 6f 70 79 29 3b  t, zStr, nCopy);
8ae0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
8af0: 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f    *pRc = SQLITE_
8b00: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d  NOMEM;.    }.  }
8b10: 0a 0a 20 20 72 65 74 75 72 6e 20 7a 52 65 74 3b  ..  return zRet;
8b20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 61 6c 69  .}../*.** Finali
8b30: 7a 65 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ze the statement
8b40: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
8b50: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a  econd argument..
8b60: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 71 6c  **.** If the sql
8b70: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 29 20  ite3_finalize() 
8b80: 63 61 6c 6c 20 69 6e 64 69 63 61 74 65 73 20 74  call indicates t
8b90: 68 61 74 20 61 6e 20 65 72 72 6f 72 20 6f 63 63  hat an error occ
8ba0: 75 72 73 2c 20 61 6e 64 20 74 68 65 0a 2a 2a 20  urs, and the.** 
8bb0: 72 62 75 20 68 61 6e 64 6c 65 20 65 72 72 6f 72  rbu handle error
8bc0: 20 63 6f 64 65 20 69 73 20 6e 6f 74 20 61 6c 72   code is not alr
8bd0: 65 61 64 79 20 73 65 74 2c 20 73 65 74 20 74 68  eady set, set th
8be0: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64  e error code and
8bf0: 20 65 72 72 6f 72 0a 2a 2a 20 6d 65 73 73 61 67   error.** messag
8c00: 65 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a  e accordingly..*
8c10: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62  /.static void rb
8c20: 75 46 69 6e 61 6c 69 7a 65 28 73 71 6c 69 74 65  uFinalize(sqlite
8c30: 33 72 62 75 20 2a 70 2c 20 73 71 6c 69 74 65 33  3rbu *p, sqlite3
8c40: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 29 7b 0a 20  _stmt *pStmt){. 
8c50: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73   sqlite3 *db = s
8c60: 71 6c 69 74 65 33 5f 64 62 5f 68 61 6e 64 6c 65  qlite3_db_handle
8c70: 28 70 53 74 6d 74 29 3b 0a 20 20 69 6e 74 20 72  (pStmt);.  int r
8c80: 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  c = sqlite3_fina
8c90: 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 69  lize(pStmt);.  i
8ca0: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
8cb0: 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54  _OK && rc!=SQLIT
8cc0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d 3e 72  E_OK ){.    p->r
8cd0: 63 20 3d 20 72 63 3b 0a 20 20 20 20 70 2d 3e 7a  c = rc;.    p->z
8ce0: 45 72 72 6d 73 67 20 3d 20 73 71 6c 69 74 65 33  Errmsg = sqlite3
8cf0: 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 73  _mprintf("%s", s
8d00: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62  qlite3_errmsg(db
8d10: 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 44 65  ));.  }.}../* De
8d20: 74 65 72 6d 69 6e 65 20 74 68 65 20 74 79 70 65  termine the type
8d30: 20 6f 66 20 61 20 74 61 62 6c 65 2e 0a 2a 2a 0a   of a table..**.
8d40: 2a 2a 20 20 20 70 65 54 79 70 65 20 69 73 20 6f  **   peType is o
8d50: 66 20 74 79 70 65 20 28 69 6e 74 2a 29 2c 20 61  f type (int*), a
8d60: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f   pointer to an o
8d70: 75 74 70 75 74 20 70 61 72 61 6d 65 74 65 72 20  utput parameter 
8d80: 6f 66 20 74 79 70 65 0a 2a 2a 20 20 20 28 69 6e  of type.**   (in
8d90: 74 29 2e 20 54 68 69 73 20 63 61 6c 6c 20 73 65  t). This call se
8da0: 74 73 20 74 68 65 20 6f 75 74 70 75 74 20 70 61  ts the output pa
8db0: 72 61 6d 65 74 65 72 20 61 73 20 66 6f 6c 6c 6f  rameter as follo
8dc0: 77 73 2c 20 64 65 70 65 6e 64 69 6e 67 0a 2a 2a  ws, depending.**
8dd0: 20 20 20 6f 6e 20 74 68 65 20 74 79 70 65 20 6f     on the type o
8de0: 66 20 74 68 65 20 74 61 62 6c 65 20 73 70 65 63  f the table spec
8df0: 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74  ified by paramet
8e00: 65 72 73 20 64 62 4e 61 6d 65 20 61 6e 64 20 7a  ers dbName and z
8e10: 54 62 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52  Tbl..**.**     R
8e20: 42 55 5f 50 4b 5f 4e 4f 54 41 42 4c 45 3a 20 20  BU_PK_NOTABLE:  
8e30: 20 20 20 20 20 4e 6f 20 73 75 63 68 20 74 61 62       No such tab
8e40: 6c 65 2e 0a 2a 2a 20 20 20 20 20 52 42 55 5f 50  le..**     RBU_P
8e50: 4b 5f 4e 4f 4e 45 3a 20 20 20 20 20 20 20 20 20  K_NONE:         
8e60: 20 54 61 62 6c 65 20 68 61 73 20 61 6e 20 69 6d   Table has an im
8e70: 70 6c 69 63 69 74 20 72 6f 77 69 64 2e 0a 2a 2a  plicit rowid..**
8e80: 20 20 20 20 20 52 42 55 5f 50 4b 5f 49 50 4b 3a       RBU_PK_IPK:
8e90: 20 20 20 20 20 20 20 20 20 20 20 54 61 62 6c 65             Table
8ea0: 20 68 61 73 20 61 6e 20 65 78 70 6c 69 63 69 74   has an explicit
8eb0: 20 49 50 4b 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 20   IPK column..** 
8ec0: 20 20 20 20 52 42 55 5f 50 4b 5f 45 58 54 45 52      RBU_PK_EXTER
8ed0: 4e 41 4c 3a 20 20 20 20 20 20 54 61 62 6c 65 20  NAL:      Table 
8ee0: 68 61 73 20 61 6e 20 65 78 74 65 72 6e 61 6c 20  has an external 
8ef0: 50 4b 20 69 6e 64 65 78 2e 0a 2a 2a 20 20 20 20  PK index..**    
8f00: 20 52 42 55 5f 50 4b 5f 57 49 54 48 4f 55 54 5f   RBU_PK_WITHOUT_
8f10: 52 4f 57 49 44 3a 20 54 61 62 6c 65 20 69 73 20  ROWID: Table is 
8f20: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 2e 0a 2a  WITHOUT ROWID..*
8f30: 2a 20 20 20 20 20 52 42 55 5f 50 4b 5f 56 54 41  *     RBU_PK_VTA
8f40: 42 3a 20 20 20 20 20 20 20 20 20 20 54 61 62 6c  B:          Tabl
8f50: 65 20 69 73 20 61 20 76 69 72 74 75 61 6c 20 74  e is a virtual t
8f60: 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 41 72  able..**.**   Ar
8f70: 67 75 6d 65 6e 74 20 2a 70 69 50 6b 20 69 73 20  gument *piPk is 
8f80: 61 6c 73 6f 20 6f 66 20 74 79 70 65 20 28 69 6e  also of type (in
8f90: 74 2a 29 2c 20 61 6e 64 20 61 6c 73 6f 20 70 6f  t*), and also po
8fa0: 69 6e 74 73 20 74 6f 20 61 6e 20 6f 75 74 70 75  ints to an outpu
8fb0: 74 0a 2a 2a 20 20 20 70 61 72 61 6d 65 74 65 72  t.**   parameter
8fc0: 2e 20 55 6e 6c 65 73 73 20 74 68 65 20 74 61 62  . Unless the tab
8fd0: 6c 65 20 68 61 73 20 61 6e 20 65 78 74 65 72 6e  le has an extern
8fe0: 61 6c 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69  al primary key i
8ff0: 6e 64 65 78 20 0a 2a 2a 20 20 20 28 69 2e 65 2e  ndex .**   (i.e.
9000: 20 75 6e 6c 65 73 73 20 2a 70 65 54 79 70 65 20   unless *peType 
9010: 69 73 20 73 65 74 20 74 6f 20 33 29 2c 20 74 68  is set to 3), th
9020: 65 6e 20 2a 70 69 50 6b 20 69 73 20 73 65 74 20  en *piPk is set 
9030: 74 6f 20 7a 65 72 6f 2e 20 4f 72 2c 0a 2a 2a 20  to zero. Or,.** 
9040: 20 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 64    if the table d
9050: 6f 65 73 20 68 61 76 65 20 61 6e 20 65 78 74 65  oes have an exte
9060: 72 6e 61 6c 20 70 72 69 6d 61 72 79 20 6b 65 79  rnal primary key
9070: 20 69 6e 64 65 78 2c 20 74 68 65 6e 20 2a 70 69   index, then *pi
9080: 50 6b 0a 2a 2a 20 20 20 69 73 20 73 65 74 20 74  Pk.**   is set t
9090: 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  o the root page 
90a0: 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 72  number of the pr
90b0: 69 6d 61 72 79 20 6b 65 79 20 69 6e 64 65 78 20  imary key index 
90c0: 62 65 66 6f 72 65 0a 2a 2a 20 20 20 72 65 74 75  before.**   retu
90d0: 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 4c 47  rning..**.** ALG
90e0: 4f 52 49 54 48 4d 3a 0a 2a 2a 0a 2a 2a 20 20 20  ORITHM:.**.**   
90f0: 69 66 28 20 6e 6f 20 65 6e 74 72 79 20 65 78 69  if( no entry exi
9100: 73 74 73 20 69 6e 20 73 71 6c 69 74 65 5f 6d 61  sts in sqlite_ma
9110: 73 74 65 72 20 29 7b 0a 2a 2a 20 20 20 20 20 72  ster ){.**     r
9120: 65 74 75 72 6e 20 52 42 55 5f 50 4b 5f 4e 4f 54  eturn RBU_PK_NOT
9130: 41 42 4c 45 0a 2a 2a 20 20 20 7d 65 6c 73 65 20  ABLE.**   }else 
9140: 69 66 28 20 73 71 6c 20 66 6f 72 20 74 68 65 20  if( sql for the 
9150: 65 6e 74 72 79 20 73 74 61 72 74 73 20 77 69 74  entry starts wit
9160: 68 20 22 43 52 45 41 54 45 20 56 49 52 54 55 41  h "CREATE VIRTUA
9170: 4c 22 20 29 7b 0a 2a 2a 20 20 20 20 20 72 65 74  L" ){.**     ret
9180: 75 72 6e 20 52 42 55 5f 50 4b 5f 56 54 41 42 0a  urn RBU_PK_VTAB.
9190: 2a 2a 20 20 20 7d 65 6c 73 65 20 69 66 28 20 22  **   }else if( "
91a0: 50 52 41 47 4d 41 20 69 6e 64 65 78 5f 6c 69 73  PRAGMA index_lis
91b0: 74 28 29 22 20 66 6f 72 20 74 68 65 20 74 61 62  t()" for the tab
91c0: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 22 70  le contains a "p
91d0: 6b 22 20 69 6e 64 65 78 20 29 7b 0a 2a 2a 20 20  k" index ){.**  
91e0: 20 20 20 69 66 28 20 74 68 65 20 69 6e 64 65 78     if( the index
91f0: 20 74 68 61 74 20 69 73 20 74 68 65 20 70 6b 20   that is the pk 
9200: 65 78 69 73 74 73 20 69 6e 20 73 71 6c 69 74 65  exists in sqlite
9210: 5f 6d 61 73 74 65 72 20 29 7b 0a 2a 2a 20 20 20  _master ){.**   
9220: 20 20 20 20 2a 70 69 50 4b 20 3d 20 72 6f 6f 74      *piPK = root
9230: 70 61 67 65 20 6f 66 20 74 68 61 74 20 69 6e 64  page of that ind
9240: 65 78 2e 0a 2a 2a 20 20 20 20 20 20 20 72 65 74  ex..**       ret
9250: 75 72 6e 20 52 42 55 5f 50 4b 5f 45 58 54 45 52  urn RBU_PK_EXTER
9260: 4e 41 4c 0a 2a 2a 20 20 20 20 20 7d 65 6c 73 65  NAL.**     }else
9270: 7b 0a 2a 2a 20 20 20 20 20 20 20 72 65 74 75 72  {.**       retur
9280: 6e 20 52 42 55 5f 50 4b 5f 57 49 54 48 4f 55 54  n RBU_PK_WITHOUT
9290: 5f 52 4f 57 49 44 0a 2a 2a 20 20 20 20 20 7d 0a  _ROWID.**     }.
92a0: 2a 2a 20 20 20 7d 65 6c 73 65 20 69 66 28 20 22  **   }else if( "
92b0: 50 52 41 47 4d 41 20 74 61 62 6c 65 5f 69 6e 66  PRAGMA table_inf
92c0: 6f 28 29 22 20 6c 69 73 74 73 20 6f 6e 65 20 6f  o()" lists one o
92d0: 72 20 6d 6f 72 65 20 22 70 6b 22 20 63 6f 6c 75  r more "pk" colu
92e0: 6d 6e 73 20 29 7b 0a 2a 2a 20 20 20 20 20 72 65  mns ){.**     re
92f0: 74 75 72 6e 20 52 42 55 5f 50 4b 5f 49 50 4b 0a  turn RBU_PK_IPK.
9300: 2a 2a 20 20 20 7d 65 6c 73 65 7b 0a 2a 2a 20 20  **   }else{.**  
9310: 20 20 20 72 65 74 75 72 6e 20 52 42 55 5f 50 4b     return RBU_PK
9320: 5f 4e 4f 4e 45 0a 2a 2a 20 20 20 7d 0a 2a 2f 0a  _NONE.**   }.*/.
9330: 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75 54  static void rbuT
9340: 61 62 6c 65 54 79 70 65 28 0a 20 20 73 71 6c 69  ableType(.  sqli
9350: 74 65 33 72 62 75 20 2a 70 2c 0a 20 20 63 6f 6e  te3rbu *p,.  con
9360: 73 74 20 63 68 61 72 20 2a 7a 54 61 62 2c 0a 20  st char *zTab,. 
9370: 20 69 6e 74 20 2a 70 65 54 79 70 65 2c 0a 20 20   int *peType,.  
9380: 69 6e 74 20 2a 70 69 54 6e 75 6d 2c 0a 20 20 69  int *piTnum,.  i
9390: 6e 74 20 2a 70 69 50 6b 0a 29 7b 0a 20 20 2f 2a  nt *piPk.){.  /*
93a0: 0a 20 20 2a 2a 20 30 29 20 53 45 4c 45 43 54 20  .  ** 0) SELECT 
93b0: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 73 71  count(*) FROM sq
93c0: 6c 69 74 65 5f 6d 61 73 74 65 72 20 77 68 65 72  lite_master wher
93d0: 65 20 6e 61 6d 65 3d 25 51 20 41 4e 44 20 49 73  e name=%Q AND Is
93e0: 56 69 72 74 75 61 6c 28 25 51 29 0a 20 20 2a 2a  Virtual(%Q).  **
93f0: 20 31 29 20 50 52 41 47 4d 41 20 69 6e 64 65 78   1) PRAGMA index
9400: 5f 6c 69 73 74 20 3d 20 3f 0a 20 20 2a 2a 20 32  _list = ?.  ** 2
9410: 29 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a  ) SELECT count(*
9420: 29 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  ) FROM sqlite_ma
9430: 73 74 65 72 20 77 68 65 72 65 20 6e 61 6d 65 3d  ster where name=
9440: 25 51 20 0a 20 20 2a 2a 20 33 29 20 50 52 41 47  %Q .  ** 3) PRAG
9450: 4d 41 20 74 61 62 6c 65 5f 69 6e 66 6f 20 3d 20  MA table_info = 
9460: 3f 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ?.  */.  sqlite3
9470: 5f 73 74 6d 74 20 2a 61 53 74 6d 74 5b 34 5d 20  _stmt *aStmt[4] 
9480: 3d 20 7b 30 2c 20 30 2c 20 30 2c 20 30 7d 3b 0a  = {0, 0, 0, 0};.
9490: 0a 20 20 2a 70 65 54 79 70 65 20 3d 20 52 42 55  .  *peType = RBU
94a0: 5f 50 4b 5f 4e 4f 54 41 42 4c 45 3b 0a 20 20 2a  _PK_NOTABLE;.  *
94b0: 70 69 50 6b 20 3d 20 30 3b 0a 0a 20 20 61 73 73  piPk = 0;..  ass
94c0: 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ert( p->rc==SQLI
94d0: 54 45 5f 4f 4b 20 29 3b 0a 20 20 70 2d 3e 72 63  TE_OK );.  p->rc
94e0: 20 3d 20 70 72 65 70 61 72 65 46 72 65 65 41 6e   = prepareFreeAn
94f0: 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d  dCollectError(p-
9500: 3e 64 62 4d 61 69 6e 2c 20 26 61 53 74 6d 74 5b  >dbMain, &aStmt[
9510: 30 5d 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c  0], &p->zErrmsg,
9520: 20 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70   .    sqlite3_mp
9530: 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20  rintf(.         
9540: 20 22 53 45 4c 45 43 54 20 28 73 71 6c 20 4c 49   "SELECT (sql LI
9550: 4b 45 20 27 63 72 65 61 74 65 20 76 69 72 74 75  KE 'create virtu
9560: 61 6c 25 25 27 29 2c 20 72 6f 6f 74 70 61 67 65  al%%'), rootpage
9570: 22 0a 20 20 20 20 20 20 20 20 20 20 22 20 20 46  ".          "  F
9580: 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
9590: 72 22 0a 20 20 20 20 20 20 20 20 20 20 22 20 57  r".          " W
95a0: 48 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c 20 7a  HERE name=%Q", z
95b0: 54 61 62 0a 20 20 29 29 3b 0a 20 20 69 66 28 20  Tab.  ));.  if( 
95c0: 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc!=SQLITE_OK
95d0: 20 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74 65 70   || sqlite3_step
95e0: 28 61 53 74 6d 74 5b 30 5d 29 21 3d 53 51 4c 49  (aStmt[0])!=SQLI
95f0: 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 2f 2a  TE_ROW ){.    /*
9600: 20 45 69 74 68 65 72 20 61 6e 20 65 72 72 6f 72   Either an error
9610: 2c 20 6f 72 20 6e 6f 20 73 75 63 68 20 74 61 62  , or no such tab
9620: 6c 65 2e 20 2a 2f 0a 20 20 20 20 67 6f 74 6f 20  le. */.    goto 
9630: 72 62 75 54 61 62 6c 65 54 79 70 65 5f 65 6e 64  rbuTableType_end
9640: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
9650: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 61  te3_column_int(a
9660: 53 74 6d 74 5b 30 5d 2c 20 30 29 20 29 7b 0a 20  Stmt[0], 0) ){. 
9670: 20 20 20 2a 70 65 54 79 70 65 20 3d 20 52 42 55     *peType = RBU
9680: 5f 50 4b 5f 56 54 41 42 3b 20 20 20 20 20 20 20  _PK_VTAB;       
9690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
96a0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a   virtual table *
96b0: 2f 0a 20 20 20 20 67 6f 74 6f 20 72 62 75 54 61  /.    goto rbuTa
96c0: 62 6c 65 54 79 70 65 5f 65 6e 64 3b 0a 20 20 7d  bleType_end;.  }
96d0: 0a 20 20 2a 70 69 54 6e 75 6d 20 3d 20 73 71 6c  .  *piTnum = sql
96e0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
96f0: 61 53 74 6d 74 5b 30 5d 2c 20 31 29 3b 0a 0a 20  aStmt[0], 1);.. 
9700: 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65   p->rc = prepare
9710: 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72  FreeAndCollectEr
9720: 72 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 26  ror(p->dbMain, &
9730: 61 53 74 6d 74 5b 31 5d 2c 20 26 70 2d 3e 7a 45  aStmt[1], &p->zE
9740: 72 72 6d 73 67 2c 20 0a 20 20 20 20 73 71 6c 69  rrmsg, .    sqli
9750: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 50 52 41  te3_mprintf("PRA
9760: 47 4d 41 20 69 6e 64 65 78 5f 6c 69 73 74 3d 25  GMA index_list=%
9770: 51 22 2c 7a 54 61 62 29 0a 20 20 29 3b 0a 20 20  Q",zTab).  );.  
9780: 69 66 28 20 70 2d 3e 72 63 20 29 20 67 6f 74 6f  if( p->rc ) goto
9790: 20 72 62 75 54 61 62 6c 65 54 79 70 65 5f 65 6e   rbuTableType_en
97a0: 64 3b 0a 20 20 77 68 69 6c 65 28 20 73 71 6c 69  d;.  while( sqli
97b0: 74 65 33 5f 73 74 65 70 28 61 53 74 6d 74 5b 31  te3_step(aStmt[1
97c0: 5d 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  ])==SQLITE_ROW )
97d0: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a  {.    const u8 *
97e0: 7a 4f 72 69 67 20 3d 20 73 71 6c 69 74 65 33 5f  zOrig = sqlite3_
97f0: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 61 53 74 6d  column_text(aStm
9800: 74 5b 31 5d 2c 20 33 29 3b 0a 20 20 20 20 63 6f  t[1], 3);.    co
9810: 6e 73 74 20 75 38 20 2a 7a 49 64 78 20 3d 20 73  nst u8 *zIdx = s
9820: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
9830: 78 74 28 61 53 74 6d 74 5b 31 5d 2c 20 31 29 3b  xt(aStmt[1], 1);
9840: 0a 20 20 20 20 69 66 28 20 7a 4f 72 69 67 20 26  .    if( zOrig &
9850: 26 20 7a 49 64 78 20 26 26 20 7a 4f 72 69 67 5b  & zIdx && zOrig[
9860: 30 5d 3d 3d 27 70 27 20 29 7b 0a 20 20 20 20 20  0]=='p' ){.     
9870: 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65   p->rc = prepare
9880: 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72  FreeAndCollectEr
9890: 72 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 26  ror(p->dbMain, &
98a0: 61 53 74 6d 74 5b 32 5d 2c 20 26 70 2d 3e 7a 45  aStmt[2], &p->zE
98b0: 72 72 6d 73 67 2c 20 0a 20 20 20 20 20 20 20 20  rrmsg, .        
98c0: 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74    sqlite3_mprint
98d0: 66 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  f(.            "
98e0: 53 45 4c 45 43 54 20 72 6f 6f 74 70 61 67 65 20  SELECT rootpage 
98f0: 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
9900: 65 72 20 57 48 45 52 45 20 6e 61 6d 65 20 3d 20  er WHERE name = 
9910: 25 51 22 2c 20 7a 49 64 78 0a 20 20 20 20 20 20  %Q", zIdx.      
9920: 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  ));.      if( p-
9930: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
9940: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
9950: 6c 69 74 65 33 5f 73 74 65 70 28 61 53 74 6d 74  lite3_step(aStmt
9960: 5b 32 5d 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  [2])==SQLITE_ROW
9970: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70   ){.          *p
9980: 69 50 6b 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  iPk = sqlite3_co
9990: 6c 75 6d 6e 5f 69 6e 74 28 61 53 74 6d 74 5b 32  lumn_int(aStmt[2
99a0: 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  ], 0);.         
99b0: 20 2a 70 65 54 79 70 65 20 3d 20 52 42 55 5f 50   *peType = RBU_P
99c0: 4b 5f 45 58 54 45 52 4e 41 4c 3b 0a 20 20 20 20  K_EXTERNAL;.    
99d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
99e0: 20 20 20 20 20 2a 70 65 54 79 70 65 20 3d 20 52       *peType = R
99f0: 42 55 5f 50 4b 5f 57 49 54 48 4f 55 54 5f 52 4f  BU_PK_WITHOUT_RO
9a00: 57 49 44 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  WID;.        }. 
9a10: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74       }.      got
9a20: 6f 20 72 62 75 54 61 62 6c 65 54 79 70 65 5f 65  o rbuTableType_e
9a30: 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  nd;.    }.  }.. 
9a40: 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65   p->rc = prepare
9a50: 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72  FreeAndCollectEr
9a60: 72 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 26  ror(p->dbMain, &
9a70: 61 53 74 6d 74 5b 33 5d 2c 20 26 70 2d 3e 7a 45  aStmt[3], &p->zE
9a80: 72 72 6d 73 67 2c 20 0a 20 20 20 20 73 71 6c 69  rrmsg, .    sqli
9a90: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 50 52 41  te3_mprintf("PRA
9aa0: 47 4d 41 20 74 61 62 6c 65 5f 69 6e 66 6f 3d 25  GMA table_info=%
9ab0: 51 22 2c 7a 54 61 62 29 0a 20 20 29 3b 0a 20 20  Q",zTab).  );.  
9ac0: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
9ad0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 77 68 69 6c  E_OK ){.    whil
9ae0: 65 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  e( sqlite3_step(
9af0: 61 53 74 6d 74 5b 33 5d 29 3d 3d 53 51 4c 49 54  aStmt[3])==SQLIT
9b00: 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 69  E_ROW ){.      i
9b10: 66 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  f( sqlite3_colum
9b20: 6e 5f 69 6e 74 28 61 53 74 6d 74 5b 33 5d 2c 35  n_int(aStmt[3],5
9b30: 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  )>0 ){.        *
9b40: 70 65 54 79 70 65 20 3d 20 52 42 55 5f 50 4b 5f  peType = RBU_PK_
9b50: 49 50 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  IPK;            
9b60: 20 20 20 20 2f 2a 20 65 78 70 6c 69 63 69 74 20      /* explicit 
9b70: 49 50 4b 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  IPK column */.  
9b80: 20 20 20 20 20 20 67 6f 74 6f 20 72 62 75 54 61        goto rbuTa
9b90: 62 6c 65 54 79 70 65 5f 65 6e 64 3b 0a 20 20 20  bleType_end;.   
9ba0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 2a     }.    }.    *
9bb0: 70 65 54 79 70 65 20 3d 20 52 42 55 5f 50 4b 5f  peType = RBU_PK_
9bc0: 4e 4f 4e 45 3b 0a 20 20 7d 0a 0a 72 62 75 54 61  NONE;.  }..rbuTa
9bd0: 62 6c 65 54 79 70 65 5f 65 6e 64 3a 20 7b 0a 20  bleType_end: {. 
9be0: 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20     unsigned int 
9bf0: 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
9c00: 69 3c 73 69 7a 65 6f 66 28 61 53 74 6d 74 29 2f  i<sizeof(aStmt)/
9c10: 73 69 7a 65 6f 66 28 61 53 74 6d 74 5b 30 5d 29  sizeof(aStmt[0])
9c20: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 62  ; i++){.      rb
9c30: 75 46 69 6e 61 6c 69 7a 65 28 70 2c 20 61 53 74  uFinalize(p, aSt
9c40: 6d 74 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  mt[i]);.    }.  
9c50: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
9c60: 69 73 20 61 20 68 65 6c 70 65 72 20 66 75 6e 63  is a helper func
9c70: 74 69 6f 6e 20 66 6f 72 20 72 62 75 4f 62 6a 49  tion for rbuObjI
9c80: 74 65 72 43 61 63 68 65 54 61 62 6c 65 49 6e 66  terCacheTableInf
9c90: 6f 28 29 2e 20 49 74 20 70 6f 70 75 6c 61 74 65  o(). It populate
9ca0: 73 0a 2a 2a 20 74 68 65 20 70 49 74 65 72 2d 3e  s.** the pIter->
9cb0: 61 62 49 6e 64 65 78 65 64 5b 5d 20 61 72 72 61  abIndexed[] arra
9cc0: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
9cd0: 64 20 72 62 75 4f 62 6a 49 74 65 72 43 61 63 68  d rbuObjIterCach
9ce0: 65 49 6e 64 65 78 65 64 43 6f 6c 73 28 73 71 6c  eIndexedCols(sql
9cf0: 69 74 65 33 72 62 75 20 2a 70 2c 20 52 62 75 4f  ite3rbu *p, RbuO
9d00: 62 6a 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  bjIter *pIter){.
9d10: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
9d20: 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 69 6e 74  pList = 0;.  int
9d30: 20 62 49 6e 64 65 78 20 3d 20 30 3b 0a 0a 20 20   bIndex = 0;..  
9d40: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
9d50: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6d 65 6d 63  E_OK ){.    memc
9d60: 70 79 28 70 49 74 65 72 2d 3e 61 62 49 6e 64 65  py(pIter->abInde
9d70: 78 65 64 2c 20 70 49 74 65 72 2d 3e 61 62 54 62  xed, pIter->abTb
9d80: 6c 50 6b 2c 20 73 69 7a 65 6f 66 28 75 38 29 2a  lPk, sizeof(u8)*
9d90: 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 29 3b  pIter->nTblCol);
9da0: 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 72 65  .    p->rc = pre
9db0: 70 61 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65  pareFreeAndColle
9dc0: 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 4d 61 69  ctError(p->dbMai
9dd0: 6e 2c 20 26 70 4c 69 73 74 2c 20 26 70 2d 3e 7a  n, &pList, &p->z
9de0: 45 72 72 6d 73 67 2c 0a 20 20 20 20 20 20 20 20  Errmsg,.        
9df0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
9e00: 22 50 52 41 47 4d 41 20 6d 61 69 6e 2e 69 6e 64  "PRAGMA main.ind
9e10: 65 78 5f 6c 69 73 74 20 3d 20 25 51 22 2c 20 70  ex_list = %Q", p
9e20: 49 74 65 72 2d 3e 7a 54 62 6c 29 0a 20 20 20 20  Iter->zTbl).    
9e30: 29 3b 0a 20 20 7d 0a 0a 20 20 70 49 74 65 72 2d  );.  }..  pIter-
9e40: 3e 6e 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 77  >nIndex = 0;.  w
9e50: 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  hile( p->rc==SQL
9e60: 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45  ITE_OK && SQLITE
9e70: 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74  _ROW==sqlite3_st
9e80: 65 70 28 70 4c 69 73 74 29 20 29 7b 0a 20 20 20  ep(pList) ){.   
9e90: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64   const char *zId
9ea0: 78 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  x = (const char*
9eb0: 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
9ec0: 74 65 78 74 28 70 4c 69 73 74 2c 20 31 29 3b 0a  text(pList, 1);.
9ed0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
9ee0: 20 2a 70 58 49 6e 66 6f 20 3d 20 30 3b 0a 20 20   *pXInfo = 0;.  
9ef0: 20 20 69 66 28 20 7a 49 64 78 3d 3d 30 20 29 20    if( zIdx==0 ) 
9f00: 62 72 65 61 6b 3b 0a 20 20 20 20 70 2d 3e 72 63  break;.    p->rc
9f10: 20 3d 20 70 72 65 70 61 72 65 46 72 65 65 41 6e   = prepareFreeAn
9f20: 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d  dCollectError(p-
9f30: 3e 64 62 4d 61 69 6e 2c 20 26 70 58 49 6e 66 6f  >dbMain, &pXInfo
9f40: 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 0a 20  , &p->zErrmsg,. 
9f50: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d         sqlite3_m
9f60: 70 72 69 6e 74 66 28 22 50 52 41 47 4d 41 20 6d  printf("PRAGMA m
9f70: 61 69 6e 2e 69 6e 64 65 78 5f 78 69 6e 66 6f 20  ain.index_xinfo 
9f80: 3d 20 25 51 22 2c 20 7a 49 64 78 29 0a 20 20 20  = %Q", zIdx).   
9f90: 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70   );.    while( p
9fa0: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
9fb0: 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  && SQLITE_ROW==s
9fc0: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 58 49 6e  qlite3_step(pXIn
9fd0: 66 6f 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  fo) ){.      int
9fe0: 20 69 43 69 64 20 3d 20 73 71 6c 69 74 65 33 5f   iCid = sqlite3_
9ff0: 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 58 49 6e 66  column_int(pXInf
a000: 6f 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28  o, 1);.      if(
a010: 20 69 43 69 64 3e 3d 30 20 29 20 70 49 74 65 72   iCid>=0 ) pIter
a020: 2d 3e 61 62 49 6e 64 65 78 65 64 5b 69 43 69 64  ->abIndexed[iCid
a030: 5d 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  ] = 1;.    }.   
a040: 20 72 62 75 46 69 6e 61 6c 69 7a 65 28 70 2c 20   rbuFinalize(p, 
a050: 70 58 49 6e 66 6f 29 3b 0a 20 20 20 20 62 49 6e  pXInfo);.    bIn
a060: 64 65 78 20 3d 20 31 3b 0a 20 20 20 20 70 49 74  dex = 1;.    pIt
a070: 65 72 2d 3e 6e 49 6e 64 65 78 2b 2b 3b 0a 20 20  er->nIndex++;.  
a080: 7d 0a 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e  }..  if( pIter->
a090: 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 57 49  eType==RBU_PK_WI
a0a0: 54 48 4f 55 54 5f 52 4f 57 49 44 20 29 7b 0a 20  THOUT_ROWID ){. 
a0b0: 20 20 20 2f 2a 20 22 50 52 41 47 4d 41 20 69 6e     /* "PRAGMA in
a0c0: 64 65 78 5f 6c 69 73 74 22 20 69 6e 63 6c 75 64  dex_list" includ
a0d0: 65 73 20 74 68 65 20 6d 61 69 6e 20 50 4b 20 62  es the main PK b
a0e0: 2d 74 72 65 65 20 2a 2f 0a 20 20 20 20 70 49 74  -tree */.    pIt
a0f0: 65 72 2d 3e 6e 49 6e 64 65 78 2d 2d 3b 0a 20 20  er->nIndex--;.  
a100: 7d 0a 0a 20 20 72 62 75 46 69 6e 61 6c 69 7a 65  }..  rbuFinalize
a110: 28 70 2c 20 70 4c 69 73 74 29 3b 0a 20 20 69 66  (p, pList);.  if
a120: 28 20 62 49 6e 64 65 78 3d 3d 30 20 29 20 70 49  ( bIndex==0 ) pI
a130: 74 65 72 2d 3e 61 62 49 6e 64 65 78 65 64 20 3d  ter->abIndexed =
a140: 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66   0;.}.../*.** If
a150: 20 74 68 65 79 20 61 72 65 20 6e 6f 74 20 61 6c   they are not al
a160: 72 65 61 64 79 20 70 6f 70 75 6c 61 74 65 64 2c  ready populated,
a170: 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 70 49   populate the pI
a180: 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 5d 2c  ter->azTblCol[],
a190: 0a 2a 2a 20 70 49 74 65 72 2d 3e 61 62 54 62 6c  .** pIter->abTbl
a1a0: 50 6b 5b 5d 2c 20 70 49 74 65 72 2d 3e 6e 54 62  Pk[], pIter->nTb
a1b0: 6c 43 6f 6c 20 61 6e 64 20 70 49 74 65 72 2d 3e  lCol and pIter->
a1c0: 62 52 6f 77 69 64 20 76 61 72 69 61 62 6c 65 73  bRowid variables
a1d0: 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 0a 2a 2a   according to.**
a1e0: 20 74 68 65 20 74 61 62 6c 65 20 28 6e 6f 74 20   the table (not 
a1f0: 69 6e 64 65 78 29 20 74 68 61 74 20 74 68 65 20  index) that the 
a200: 69 74 65 72 61 74 6f 72 20 63 75 72 72 65 6e 74  iterator current
a210: 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2a  ly points to..**
a220: 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
a230: 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66  E_OK if successf
a240: 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65  ul, or an SQLite
a250: 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65   error code othe
a260: 72 77 69 73 65 2e 20 49 66 0a 2a 2a 20 61 6e 20  rwise. If.** an 
a270: 65 72 72 6f 72 20 64 6f 65 73 20 6f 63 63 75 72  error does occur
a280: 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  , an error code 
a290: 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67  and error messag
a2a0: 65 20 61 72 65 20 61 6c 73 6f 20 6c 65 66 74 20  e are also left 
a2b0: 69 6e 20 0a 2a 2a 20 74 68 65 20 52 42 55 20 68  in .** the RBU h
a2c0: 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  andle..*/.static
a2d0: 20 69 6e 74 20 72 62 75 4f 62 6a 49 74 65 72 43   int rbuObjIterC
a2e0: 61 63 68 65 54 61 62 6c 65 49 6e 66 6f 28 73 71  acheTableInfo(sq
a2f0: 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 52 62 75  lite3rbu *p, Rbu
a300: 4f 62 6a 49 74 65 72 20 2a 70 49 74 65 72 29 7b  ObjIter *pIter){
a310: 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 61 7a  .  if( pIter->az
a320: 54 62 6c 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20  TblCol==0 ){.   
a330: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
a340: 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e  Stmt = 0;.    in
a350: 74 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  t nCol = 0;.    
a360: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
a370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a380: 20 66 6f 72 28 29 20 6c 6f 6f 70 20 69 74 65 72   for() loop iter
a390: 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f  ator variable */
a3a0: 0a 20 20 20 20 69 6e 74 20 62 52 62 75 52 6f 77  .    int bRbuRow
a3b0: 69 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  id = 0;         
a3c0: 20 20 20 2f 2a 20 49 66 20 69 6e 70 75 74 20 74     /* If input t
a3d0: 61 62 6c 65 20 68 61 73 20 63 6f 6c 75 6d 6e 20  able has column 
a3e0: 22 72 62 75 5f 72 6f 77 69 64 22 20 2a 2f 0a 20  "rbu_rowid" */. 
a3f0: 20 20 20 69 6e 74 20 69 4f 72 64 65 72 20 3d 20     int iOrder = 
a400: 30 3b 0a 20 20 20 20 69 6e 74 20 69 54 6e 75 6d  0;.    int iTnum
a410: 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 46 69   = 0;..    /* Fi
a420: 67 75 72 65 20 6f 75 74 20 74 68 65 20 74 79 70  gure out the typ
a430: 65 20 6f 66 20 74 61 62 6c 65 20 74 68 69 73 20  e of table this 
a440: 73 74 65 70 20 77 69 6c 6c 20 64 65 61 6c 20 77  step will deal w
a450: 69 74 68 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  ith. */.    asse
a460: 72 74 28 20 70 49 74 65 72 2d 3e 65 54 79 70 65  rt( pIter->eType
a470: 3d 3d 30 20 29 3b 0a 20 20 20 20 72 62 75 54 61  ==0 );.    rbuTa
a480: 62 6c 65 54 79 70 65 28 70 2c 20 70 49 74 65 72  bleType(p, pIter
a490: 2d 3e 7a 54 62 6c 2c 20 26 70 49 74 65 72 2d 3e  ->zTbl, &pIter->
a4a0: 65 54 79 70 65 2c 20 26 69 54 6e 75 6d 2c 20 26  eType, &iTnum, &
a4b0: 70 49 74 65 72 2d 3e 69 50 6b 54 6e 75 6d 29 3b  pIter->iPkTnum);
a4c0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  .    if( p->rc==
a4d0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 49 74  SQLITE_OK && pIt
a4e0: 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50  er->eType==RBU_P
a4f0: 4b 5f 4e 4f 54 41 42 4c 45 20 29 7b 0a 20 20 20  K_NOTABLE ){.   
a500: 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
a510: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 70  E_ERROR;.      p
a520: 2d 3e 7a 45 72 72 6d 73 67 20 3d 20 73 71 6c 69  ->zErrmsg = sqli
a530: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 6e 6f 20  te3_mprintf("no 
a540: 73 75 63 68 20 74 61 62 6c 65 3a 20 25 73 22 2c  such table: %s",
a550: 20 70 49 74 65 72 2d 3e 7a 54 62 6c 29 3b 0a 20   pIter->zTbl);. 
a560: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e     }.    if( p->
a570: 72 63 20 29 20 72 65 74 75 72 6e 20 70 2d 3e 72  rc ) return p->r
a580: 63 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72  c;.    if( pIter
a590: 2d 3e 7a 49 64 78 3d 3d 30 20 29 20 70 49 74 65  ->zIdx==0 ) pIte
a5a0: 72 2d 3e 69 54 6e 75 6d 20 3d 20 69 54 6e 75 6d  r->iTnum = iTnum
a5b0: 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ;..    assert( p
a5c0: 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55  Iter->eType==RBU
a5d0: 5f 50 4b 5f 4e 4f 4e 45 20 7c 7c 20 70 49 74 65  _PK_NONE || pIte
a5e0: 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b  r->eType==RBU_PK
a5f0: 5f 49 50 4b 20 0a 20 20 20 20 20 20 20 20 20 7c  _IPK .         |
a600: 7c 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d  | pIter->eType==
a610: 52 42 55 5f 50 4b 5f 45 58 54 45 52 4e 41 4c 20  RBU_PK_EXTERNAL 
a620: 7c 7c 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d  || pIter->eType=
a630: 3d 52 42 55 5f 50 4b 5f 57 49 54 48 4f 55 54 5f  =RBU_PK_WITHOUT_
a640: 52 4f 57 49 44 0a 20 20 20 20 20 20 20 20 20 7c  ROWID.         |
a650: 7c 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d  | pIter->eType==
a660: 52 42 55 5f 50 4b 5f 56 54 41 42 0a 20 20 20 20  RBU_PK_VTAB.    
a670: 29 3b 0a 0a 20 20 20 20 2f 2a 20 50 6f 70 75 6c  );..    /* Popul
a680: 61 74 65 20 74 68 65 20 61 7a 54 62 6c 43 6f 6c  ate the azTblCol
a690: 5b 5d 20 61 6e 64 20 6e 54 62 6c 43 6f 6c 20 76  [] and nTblCol v
a6a0: 61 72 69 61 62 6c 65 73 20 62 61 73 65 64 20 6f  ariables based o
a6b0: 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 73 0a 20 20  n the columns.  
a6c0: 20 20 2a 2a 20 6f 66 20 74 68 65 20 69 6e 70 75    ** of the inpu
a6d0: 74 20 74 61 62 6c 65 2e 20 49 67 6e 6f 72 65 20  t table. Ignore 
a6e0: 61 6e 79 20 69 6e 70 75 74 20 74 61 62 6c 65 20  any input table 
a6f0: 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 62 65 67  columns that beg
a700: 69 6e 20 77 69 74 68 0a 20 20 20 20 2a 2a 20 22  in with.    ** "
a710: 72 62 75 5f 22 2e 20 20 2a 2f 0a 20 20 20 20 70  rbu_".  */.    p
a720: 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65 46 72  ->rc = prepareFr
a730: 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f  eeAndCollectErro
a740: 72 28 70 2d 3e 64 62 52 62 75 2c 20 26 70 53 74  r(p->dbRbu, &pSt
a750: 6d 74 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c  mt, &p->zErrmsg,
a760: 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65   .        sqlite
a770: 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43  3_mprintf("SELEC
a780: 54 20 2a 20 46 52 4f 4d 20 27 25 71 27 22 2c 20  T * FROM '%q'", 
a790: 70 49 74 65 72 2d 3e 7a 44 61 74 61 54 62 6c 29  pIter->zDataTbl)
a7a0: 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
a7b0: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
a7c0: 20 29 7b 0a 20 20 20 20 20 20 6e 43 6f 6c 20 3d   ){.      nCol =
a7d0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
a7e0: 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20  count(pStmt);.  
a7f0: 20 20 20 20 72 62 75 41 6c 6c 6f 63 61 74 65 49      rbuAllocateI
a800: 74 65 72 41 72 72 61 79 73 28 70 2c 20 70 49 74  terArrays(p, pIt
a810: 65 72 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 7d  er, nCol);.    }
a820: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 70 2d  .    for(i=0; p-
a830: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
a840: 26 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  & i<nCol; i++){.
a850: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
a860: 20 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74   *zName = (const
a870: 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63   char*)sqlite3_c
a880: 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53 74 6d 74  olumn_name(pStmt
a890: 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , i);.      if( 
a8a0: 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70  sqlite3_strnicmp
a8b0: 28 22 72 62 75 5f 22 2c 20 7a 4e 61 6d 65 2c 20  ("rbu_", zName, 
a8c0: 34 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  4) ){.        ch
a8d0: 61 72 20 2a 7a 43 6f 70 79 20 3d 20 72 62 75 53  ar *zCopy = rbuS
a8e0: 74 72 6e 64 75 70 28 7a 4e 61 6d 65 2c 20 26 70  trndup(zName, &p
a8f0: 2d 3e 72 63 29 3b 0a 20 20 20 20 20 20 20 20 70  ->rc);.        p
a900: 49 74 65 72 2d 3e 61 69 53 72 63 4f 72 64 65 72  Iter->aiSrcOrder
a910: 5b 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 5d  [pIter->nTblCol]
a920: 20 3d 20 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f   = pIter->nTblCo
a930: 6c 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65 72  l;.        pIter
a940: 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 70 49 74 65 72  ->azTblCol[pIter
a950: 2d 3e 6e 54 62 6c 43 6f 6c 2b 2b 5d 20 3d 20 7a  ->nTblCol++] = z
a960: 43 6f 70 79 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Copy;.      }.  
a970: 20 20 20 20 65 6c 73 65 20 69 66 28 20 30 3d 3d      else if( 0==
a980: 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
a990: 22 72 62 75 5f 72 6f 77 69 64 22 2c 20 7a 4e 61  "rbu_rowid", zNa
a9a0: 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62  me) ){.        b
a9b0: 52 62 75 52 6f 77 69 64 20 3d 20 31 3b 0a 20 20  RbuRowid = 1;.  
a9c0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
a9d0: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
a9e0: 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 70 53 74  (pStmt);.    pSt
a9f0: 6d 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28  mt = 0;..    if(
aa00: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
aa10: 4b 0a 20 20 20 20 20 26 26 20 72 62 75 49 73 56  K.     && rbuIsV
aa20: 61 63 75 75 6d 28 70 29 3d 3d 30 0a 20 20 20 20  acuum(p)==0.    
aa30: 20 26 26 20 62 52 62 75 52 6f 77 69 64 21 3d 28   && bRbuRowid!=(
aa40: 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42  pIter->eType==RB
aa50: 55 5f 50 4b 5f 56 54 41 42 20 7c 7c 20 70 49 74  U_PK_VTAB || pIt
aa60: 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50  er->eType==RBU_P
aa70: 4b 5f 4e 4f 4e 45 29 0a 20 20 20 20 29 7b 0a 20  K_NONE).    ){. 
aa80: 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c       p->rc = SQL
aa90: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
aaa0: 20 70 2d 3e 7a 45 72 72 6d 73 67 20 3d 20 73 71   p->zErrmsg = sq
aab0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20  lite3_mprintf(. 
aac0: 20 20 20 20 20 20 20 20 20 22 74 61 62 6c 65 20           "table 
aad0: 25 71 20 25 73 20 72 62 75 5f 72 6f 77 69 64 20  %q %s rbu_rowid 
aae0: 63 6f 6c 75 6d 6e 22 2c 20 70 49 74 65 72 2d 3e  column", pIter->
aaf0: 7a 44 61 74 61 54 62 6c 2c 0a 20 20 20 20 20 20  zDataTbl,.      
ab00: 20 20 20 20 28 62 52 62 75 52 6f 77 69 64 20 3f      (bRbuRowid ?
ab10: 20 22 6d 61 79 20 6e 6f 74 20 68 61 76 65 22 20   "may not have" 
ab20: 3a 20 22 72 65 71 75 69 72 65 73 22 29 0a 20 20  : "requires").  
ab30: 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20      );.    }..  
ab40: 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
ab50: 61 6c 6c 20 6e 6f 6e 2d 48 49 44 44 45 4e 20 63  all non-HIDDEN c
ab60: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 64 65  olumns in the de
ab70: 73 74 69 6e 61 74 69 6f 6e 20 74 61 62 6c 65 20  stination table 
ab80: 61 72 65 20 61 6c 73 6f 0a 20 20 20 20 2a 2a 20  are also.    ** 
ab90: 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 69  present in the i
aba0: 6e 70 75 74 20 74 61 62 6c 65 2e 20 50 6f 70 75  nput table. Popu
abb0: 6c 61 74 65 20 74 68 65 20 61 62 54 62 6c 50 6b  late the abTblPk
abc0: 5b 5d 2c 20 61 7a 54 62 6c 54 79 70 65 5b 5d 20  [], azTblType[] 
abd0: 61 6e 64 0a 20 20 20 20 2a 2a 20 61 69 54 62 6c  and.    ** aiTbl
abe0: 4f 72 64 65 72 5b 5d 20 61 72 72 61 79 73 20 61  Order[] arrays a
abf0: 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e  t the same time.
ac00: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e    */.    if( p->
ac10: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
ac20: 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 70  .      p->rc = p
ac30: 72 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f 6c  repareFreeAndCol
ac40: 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 4d  lectError(p->dbM
ac50: 61 69 6e 2c 20 26 70 53 74 6d 74 2c 20 26 70 2d  ain, &pStmt, &p-
ac60: 3e 7a 45 72 72 6d 73 67 2c 20 0a 20 20 20 20 20  >zErrmsg, .     
ac70: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72       sqlite3_mpr
ac80: 69 6e 74 66 28 22 50 52 41 47 4d 41 20 74 61 62  intf("PRAGMA tab
ac90: 6c 65 5f 69 6e 66 6f 28 25 51 29 22 2c 20 70 49  le_info(%Q)", pI
aca0: 74 65 72 2d 3e 7a 54 62 6c 29 0a 20 20 20 20 20  ter->zTbl).     
acb0: 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68   );.    }.    wh
acc0: 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ile( p->rc==SQLI
acd0: 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f  TE_OK && SQLITE_
ace0: 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW==sqlite3_ste
acf0: 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20  p(pStmt) ){.    
ad00: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
ad10: 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ame = (const cha
ad20: 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
ad30: 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31 29  n_text(pStmt, 1)
ad40: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d  ;.      if( zNam
ad50: 65 3d 3d 30 20 29 20 62 72 65 61 6b 3b 20 20 2f  e==0 ) break;  /
ad60: 2a 20 41 6e 20 4f 4f 4d 20 2d 20 66 69 6e 61 6c  * An OOM - final
ad70: 69 7a 65 28 29 20 62 65 6c 6f 77 20 72 65 74 75  ize() below retu
ad80: 72 6e 73 20 53 5f 4e 4f 4d 45 4d 20 2a 2f 0a 20  rns S_NOMEM */. 
ad90: 20 20 20 20 20 66 6f 72 28 69 3d 69 4f 72 64 65       for(i=iOrde
ada0: 72 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 54 62 6c  r; i<pIter->nTbl
adb0: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
adc0: 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63 6d 70     if( 0==strcmp
add0: 28 7a 4e 61 6d 65 2c 20 70 49 74 65 72 2d 3e 61  (zName, pIter->a
ade0: 7a 54 62 6c 43 6f 6c 5b 69 5d 29 20 29 20 62 72  zTblCol[i]) ) br
adf0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
ae00: 20 20 20 69 66 28 20 69 3d 3d 70 49 74 65 72 2d     if( i==pIter-
ae10: 3e 6e 54 62 6c 43 6f 6c 20 29 7b 0a 20 20 20 20  >nTblCol ){.    
ae20: 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
ae30: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
ae40: 20 20 70 2d 3e 7a 45 72 72 6d 73 67 20 3d 20 73    p->zErrmsg = s
ae50: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
ae60: 63 6f 6c 75 6d 6e 20 6d 69 73 73 69 6e 67 20 66  column missing f
ae70: 72 6f 6d 20 25 71 3a 20 25 73 22 2c 0a 20 20 20  rom %q: %s",.   
ae80: 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e           pIter->
ae90: 7a 44 61 74 61 54 62 6c 2c 20 7a 4e 61 6d 65 0a  zDataTbl, zName.
aea0: 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
aeb0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
aec0: 69 6e 74 20 69 50 6b 20 3d 20 73 71 6c 69 74 65  int iPk = sqlite
aed0: 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74  3_column_int(pSt
aee0: 6d 74 2c 20 35 29 3b 0a 20 20 20 20 20 20 20 20  mt, 5);.        
aef0: 69 6e 74 20 62 4e 6f 74 4e 75 6c 6c 20 3d 20 73  int bNotNull = s
af00: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
af10: 74 28 70 53 74 6d 74 2c 20 33 29 3b 0a 20 20 20  t(pStmt, 3);.   
af20: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
af30: 2a 7a 54 79 70 65 20 3d 20 28 63 6f 6e 73 74 20  *zType = (const 
af40: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
af50: 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
af60: 20 32 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 66   2);..        if
af70: 28 20 69 21 3d 69 4f 72 64 65 72 20 29 7b 0a 20  ( i!=iOrder ){. 
af80: 20 20 20 20 20 20 20 20 20 53 57 41 50 28 69 6e           SWAP(in
af90: 74 2c 20 70 49 74 65 72 2d 3e 61 69 53 72 63 4f  t, pIter->aiSrcO
afa0: 72 64 65 72 5b 69 5d 2c 20 70 49 74 65 72 2d 3e  rder[i], pIter->
afb0: 61 69 53 72 63 4f 72 64 65 72 5b 69 4f 72 64 65  aiSrcOrder[iOrde
afc0: 72 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 53  r]);.          S
afd0: 57 41 50 28 63 68 61 72 2a 2c 20 70 49 74 65 72  WAP(char*, pIter
afe0: 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69 5d 2c 20 70  ->azTblCol[i], p
aff0: 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69  Iter->azTblCol[i
b000: 4f 72 64 65 72 5d 29 3b 0a 20 20 20 20 20 20 20  Order]);.       
b010: 20 7d 0a 0a 20 20 20 20 20 20 20 20 70 49 74 65   }..        pIte
b020: 72 2d 3e 61 7a 54 62 6c 54 79 70 65 5b 69 4f 72  r->azTblType[iOr
b030: 64 65 72 5d 20 3d 20 72 62 75 53 74 72 6e 64 75  der] = rbuStrndu
b040: 70 28 7a 54 79 70 65 2c 20 26 70 2d 3e 72 63 29  p(zType, &p->rc)
b050: 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d  ;.        pIter-
b060: 3e 61 62 54 62 6c 50 6b 5b 69 4f 72 64 65 72 5d  >abTblPk[iOrder]
b070: 20 3d 20 28 69 50 6b 21 3d 30 29 3b 0a 20 20 20   = (iPk!=0);.   
b080: 20 20 20 20 20 70 49 74 65 72 2d 3e 61 62 4e 6f       pIter->abNo
b090: 74 4e 75 6c 6c 5b 69 4f 72 64 65 72 5d 20 3d 20  tNull[iOrder] = 
b0a0: 28 75 38 29 62 4e 6f 74 4e 75 6c 6c 20 7c 7c 20  (u8)bNotNull || 
b0b0: 28 69 50 6b 21 3d 30 29 3b 0a 20 20 20 20 20 20  (iPk!=0);.      
b0c0: 20 20 69 4f 72 64 65 72 2b 2b 3b 0a 20 20 20 20    iOrder++;.    
b0d0: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72    }.    }..    r
b0e0: 62 75 46 69 6e 61 6c 69 7a 65 28 70 2c 20 70 53  buFinalize(p, pS
b0f0: 74 6d 74 29 3b 0a 20 20 20 20 72 62 75 4f 62 6a  tmt);.    rbuObj
b100: 49 74 65 72 43 61 63 68 65 49 6e 64 65 78 65 64  IterCacheIndexed
b110: 43 6f 6c 73 28 70 2c 20 70 49 74 65 72 29 3b 0a  Cols(p, pIter);.
b120: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
b130: 72 2d 3e 65 54 79 70 65 21 3d 52 42 55 5f 50 4b  r->eType!=RBU_PK
b140: 5f 56 54 41 42 20 7c 7c 20 70 49 74 65 72 2d 3e  _VTAB || pIter->
b150: 61 62 49 6e 64 65 78 65 64 3d 3d 30 20 29 3b 0a  abIndexed==0 );.
b160: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
b170: 72 2d 3e 65 54 79 70 65 21 3d 52 42 55 5f 50 4b  r->eType!=RBU_PK
b180: 5f 56 54 41 42 20 7c 7c 20 70 49 74 65 72 2d 3e  _VTAB || pIter->
b190: 6e 49 6e 64 65 78 3d 3d 30 20 29 3b 0a 20 20 7d  nIndex==0 );.  }
b1a0: 0a 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63  ..  return p->rc
b1b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
b1c0: 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 73 74 72 75  function constru
b1d0: 63 74 73 20 61 6e 64 20 72 65 74 75 72 6e 73 20  cts and returns 
b1e0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e  a pointer to a n
b1f0: 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 0a 2a  ul-terminated .*
b200: 2a 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e  * string contain
b210: 69 6e 67 20 73 6f 6d 65 20 53 51 4c 20 63 6c 61  ing some SQL cla
b220: 75 73 65 20 6f 72 20 6c 69 73 74 20 62 61 73 65  use or list base
b230: 64 20 6f 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  d on one or more
b240: 20 6f 66 20 74 68 65 20 0a 2a 2a 20 63 6f 6c 75   of the .** colu
b250: 6d 6e 20 6e 61 6d 65 73 20 63 75 72 72 65 6e 74  mn names current
b260: 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ly stored in the
b270: 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c   pIter->azTblCol
b280: 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61  [] array..*/.sta
b290: 74 69 63 20 63 68 61 72 20 2a 72 62 75 4f 62 6a  tic char *rbuObj
b2a0: 49 74 65 72 47 65 74 43 6f 6c 6c 69 73 74 28 0a  IterGetCollist(.
b2b0: 20 20 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c    sqlite3rbu *p,
b2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b2d0: 20 20 2f 2a 20 52 42 55 20 6f 62 6a 65 63 74 20    /* RBU object 
b2e0: 2a 2f 0a 20 20 52 62 75 4f 62 6a 49 74 65 72 20  */.  RbuObjIter 
b2f0: 2a 70 49 74 65 72 20 20 20 20 20 20 20 20 20 20  *pIter          
b300: 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 69       /* Object i
b310: 74 65 72 61 74 6f 72 20 66 6f 72 20 63 6f 6c 75  terator for colu
b320: 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 29 7b 0a 20  mn names */.){. 
b330: 20 63 68 61 72 20 2a 7a 4c 69 73 74 20 3d 20 30   char *zList = 0
b340: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
b350: 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20 69 6e 74  zSep = "";.  int
b360: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
b370: 3c 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 3b  <pIter->nTblCol;
b380: 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74   i++){.    const
b390: 20 63 68 61 72 20 2a 7a 20 3d 20 70 49 74 65 72   char *z = pIter
b3a0: 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69 5d 3b 0a 20  ->azTblCol[i];. 
b3b0: 20 20 20 7a 4c 69 73 74 20 3d 20 72 62 75 4d 50     zList = rbuMP
b3c0: 72 69 6e 74 66 28 70 2c 20 22 25 7a 25 73 5c 22  rintf(p, "%z%s\"
b3d0: 25 77 5c 22 22 2c 20 7a 4c 69 73 74 2c 20 7a 53  %w\"", zList, zS
b3e0: 65 70 2c 20 7a 29 3b 0a 20 20 20 20 7a 53 65 70  ep, z);.    zSep
b3f0: 20 3d 20 22 2c 20 22 3b 0a 20 20 7d 0a 20 20 72   = ", ";.  }.  r
b400: 65 74 75 72 6e 20 7a 4c 69 73 74 3b 0a 7d 0a 0a  eturn zList;.}..
b410: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
b420: 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 63  ion is used to c
b430: 72 65 61 74 65 20 61 20 53 45 4c 45 43 54 20 6c  reate a SELECT l
b440: 69 73 74 20 28 74 68 65 20 6c 69 73 74 20 6f 66  ist (the list of
b450: 20 53 51 4c 20 0a 2a 2a 20 65 78 70 72 65 73 73   SQL .** express
b460: 69 6f 6e 73 20 74 68 61 74 20 66 6f 6c 6c 6f 77  ions that follow
b470: 73 20 61 20 53 45 4c 45 43 54 20 6b 65 79 77 6f  s a SELECT keywo
b480: 72 64 29 20 66 6f 72 20 61 20 53 45 4c 45 43 54  rd) for a SELECT
b490: 20 73 74 61 74 65 6d 65 6e 74 20 0a 2a 2a 20 75   statement .** u
b4a0: 73 65 64 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  sed to read from
b4b0: 20 61 6e 20 64 61 74 61 5f 78 78 78 20 6f 72 20   an data_xxx or 
b4c0: 72 62 75 5f 74 6d 70 5f 78 78 78 20 74 61 62 6c  rbu_tmp_xxx tabl
b4d0: 65 20 77 68 69 6c 65 20 75 70 64 61 74 69 6e 67  e while updating
b4e0: 20 74 68 65 20 0a 2a 2a 20 69 6e 64 65 78 20 6f   the .** index o
b4f0: 62 6a 65 63 74 20 63 75 72 72 65 6e 74 6c 79 20  bject currently 
b500: 69 6e 64 69 63 61 74 65 64 20 62 79 20 74 68 65  indicated by the
b510: 20 69 74 65 72 61 74 6f 72 20 6f 62 6a 65 63 74   iterator object
b520: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 0a   passed as the .
b530: 2a 2a 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  ** second argume
b540: 6e 74 2e 20 41 20 22 50 52 41 47 4d 41 20 69 6e  nt. A "PRAGMA in
b550: 64 65 78 5f 78 69 6e 66 6f 20 3d 20 3c 69 64 78  dex_xinfo = <idx
b560: 6e 61 6d 65 3e 22 20 73 74 61 74 65 6d 65 6e 74  name>" statement
b570: 20 69 73 20 75 73 65 64 20 0a 2a 2a 20 74 6f 20   is used .** to 
b580: 6f 62 74 61 69 6e 20 74 68 65 20 72 65 71 75 69  obtain the requi
b590: 72 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  red information.
b5a0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e  .**.** If the in
b5b0: 64 65 78 20 69 73 20 6f 66 20 74 68 65 20 66 6f  dex is of the fo
b5c0: 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 3a 0a 2a 2a  llowing form:.**
b5d0: 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44  .**   CREATE IND
b5e0: 45 58 20 69 31 20 4f 4e 20 74 31 28 63 2c 20 62  EX i1 ON t1(c, b
b5f0: 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 29   COLLATE nocase)
b600: 3b 0a 2a 2a 0a 2a 2a 20 61 6e 64 20 22 74 31 22  ;.**.** and "t1"
b610: 20 69 73 20 61 20 74 61 62 6c 65 20 77 69 74 68   is a table with
b620: 20 61 6e 20 65 78 70 6c 69 63 69 74 20 49 4e 54   an explicit INT
b630: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
b640: 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 22 69 70 6b   column .** "ipk
b650: 22 2c 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  ", the returned 
b660: 73 74 72 69 6e 67 20 69 73 3a 0a 2a 2a 0a 2a 2a  string is:.**.**
b670: 20 20 20 22 60 63 60 20 43 4f 4c 4c 41 54 45 20     "`c` COLLATE 
b680: 27 42 49 4e 41 52 59 27 2c 20 60 62 60 20 43 4f  'BINARY', `b` CO
b690: 4c 4c 41 54 45 20 27 4e 4f 43 41 53 45 27 2c 20  LLATE 'NOCASE', 
b6a0: 60 69 70 6b 60 20 43 4f 4c 4c 41 54 45 20 27 42  `ipk` COLLATE 'B
b6b0: 49 4e 41 52 59 27 22 0a 2a 2a 0a 2a 2a 20 41 73  INARY'".**.** As
b6c0: 20 77 65 6c 6c 20 61 73 20 74 68 65 20 72 65 74   well as the ret
b6d0: 75 72 6e 65 64 20 73 74 72 69 6e 67 2c 20 74 68  urned string, th
b6e0: 72 65 65 20 6f 74 68 65 72 20 6d 61 6c 6c 6f 63  ree other malloc
b6f0: 27 64 20 73 74 72 69 6e 67 73 20 61 72 65 20 0a  'd strings are .
b700: 2a 2a 20 72 65 74 75 72 6e 65 64 20 76 69 61 20  ** returned via 
b710: 6f 75 74 70 75 74 20 70 61 72 61 6d 65 74 65 72  output parameter
b720: 73 2e 20 41 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  s. As follows:.*
b730: 2a 0a 2a 2a 20 20 20 70 7a 49 6d 70 6f 73 74 65  *.**   pzImposte
b740: 72 43 6f 6c 73 3a 20 2e 2e 2e 0a 2a 2a 20 20 20  rCols: ....**   
b750: 70 7a 49 6d 70 6f 73 74 65 72 50 6b 3a 20 2e 2e  pzImposterPk: ..
b760: 2e 0a 2a 2a 20 20 20 70 7a 57 68 65 72 65 3a 20  ..**   pzWhere: 
b770: 2e 2e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  ....*/.static ch
b780: 61 72 20 2a 72 62 75 4f 62 6a 49 74 65 72 47 65  ar *rbuObjIterGe
b790: 74 49 6e 64 65 78 43 6f 6c 73 28 0a 20 20 73 71  tIndexCols(.  sq
b7a0: 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 20 20 20  lite3rbu *p,    
b7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b7c0: 20 52 42 55 20 6f 62 6a 65 63 74 20 2a 2f 0a 20   RBU object */. 
b7d0: 20 52 62 75 4f 62 6a 49 74 65 72 20 2a 70 49 74   RbuObjIter *pIt
b7e0: 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
b7f0: 20 2f 2a 20 4f 62 6a 65 63 74 20 69 74 65 72 61   /* Object itera
b800: 74 6f 72 20 66 6f 72 20 63 6f 6c 75 6d 6e 20 6e  tor for column n
b810: 61 6d 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ames */.  char *
b820: 2a 70 7a 49 6d 70 6f 73 74 65 72 43 6f 6c 73 2c  *pzImposterCols,
b830: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
b840: 3a 20 43 6f 6c 75 6d 6e 73 20 66 6f 72 20 69 6d  : Columns for im
b850: 70 6f 73 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a  poster table */.
b860: 20 20 63 68 61 72 20 2a 2a 70 7a 49 6d 70 6f 73    char **pzImpos
b870: 74 65 72 50 6b 2c 20 20 20 20 20 20 20 20 20 20  terPk,          
b880: 20 20 2f 2a 20 4f 55 54 3a 20 49 6d 70 6f 73 74    /* OUT: Impost
b890: 65 72 20 50 4b 20 63 6c 61 75 73 65 20 2a 2f 0a  er PK clause */.
b8a0: 20 20 63 68 61 72 20 2a 2a 70 7a 57 68 65 72 65    char **pzWhere
b8b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
b8c0: 20 20 2f 2a 20 4f 55 54 3a 20 57 48 45 52 45 20    /* OUT: WHERE 
b8d0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
b8e0: 2a 70 6e 42 69 6e 64 20 20 20 20 20 20 20 20 20  *pnBind         
b8f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
b900: 55 54 3a 20 54 72 62 75 6c 20 6e 75 6d 62 65 72  UT: Trbul number
b910: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 29   of columns */.)
b920: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 2d 3e  {.  int rc = p->
b930: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
b940: 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64      /* Error cod
b950: 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 32 3b 20  e */.  int rc2; 
b960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b970: 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
b980: 33 5f 66 69 6e 61 6c 69 7a 65 28 29 20 72 65 74  3_finalize() ret
b990: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 63 68  urn code */.  ch
b9a0: 61 72 20 2a 7a 52 65 74 20 3d 20 30 3b 20 20 20  ar *zRet = 0;   
b9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b9c0: 20 53 74 72 69 6e 67 20 74 6f 20 72 65 74 75 72   String to retur
b9d0: 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 49 6d  n */.  char *zIm
b9e0: 70 43 6f 6c 73 20 3d 20 30 3b 20 20 20 20 20 20  pCols = 0;      
b9f0: 20 20 20 20 20 20 20 2f 2a 20 53 74 72 69 6e 67         /* String
ba00: 20 74 6f 20 72 65 74 75 72 6e 20 76 69 61 20 2a   to return via *
ba10: 70 7a 49 6d 70 6f 73 74 65 72 43 6f 6c 73 20 2a  pzImposterCols *
ba20: 2f 0a 20 20 63 68 61 72 20 2a 7a 49 6d 70 50 4b  /.  char *zImpPK
ba30: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
ba40: 20 20 20 20 2f 2a 20 53 74 72 69 6e 67 20 74 6f      /* String to
ba50: 20 72 65 74 75 72 6e 20 76 69 61 20 2a 70 7a 49   return via *pzI
ba60: 6d 70 6f 73 74 65 72 50 4b 20 2a 2f 0a 20 20 63  mposterPK */.  c
ba70: 68 61 72 20 2a 7a 57 68 65 72 65 20 3d 20 30 3b  har *zWhere = 0;
ba80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ba90: 2a 20 53 74 72 69 6e 67 20 74 6f 20 72 65 74 75  * String to retu
baa0: 72 6e 20 76 69 61 20 2a 70 7a 57 68 65 72 65 20  rn via *pzWhere 
bab0: 2a 2f 0a 20 20 69 6e 74 20 6e 42 69 6e 64 20 3d  */.  int nBind =
bac0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
bad0: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f       /* Value to
bae0: 20 72 65 74 75 72 6e 20 76 69 61 20 2a 70 6e 42   return via *pnB
baf0: 69 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ind */.  const c
bb00: 68 61 72 20 2a 7a 43 6f 6d 20 3d 20 22 22 3b 20  har *zCom = ""; 
bb10: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20           /* Set 
bb20: 74 6f 20 22 2c 20 22 20 6c 61 74 65 72 20 6f 6e  to ", " later on
bb30: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
bb40: 20 2a 7a 41 6e 64 20 3d 20 22 22 3b 20 20 20 20   *zAnd = "";    
bb50: 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20        /* Set to 
bb60: 22 20 41 4e 44 20 22 20 6c 61 74 65 72 20 6f 6e  " AND " later on
bb70: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
bb80: 6d 74 20 2a 70 58 49 6e 66 6f 20 3d 20 30 3b 20  mt *pXInfo = 0; 
bb90: 20 20 20 20 20 20 2f 2a 20 50 52 41 47 4d 41 20        /* PRAGMA 
bba0: 69 6e 64 65 78 5f 78 69 6e 66 6f 20 3d 20 3f 20  index_xinfo = ? 
bbb0: 2a 2f 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  */..  if( rc==SQ
bbc0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61  LITE_OK ){.    a
bbd0: 73 73 65 72 74 28 20 70 2d 3e 7a 45 72 72 6d 73  ssert( p->zErrms
bbe0: 67 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d  g==0 );.    rc =
bbf0: 20 70 72 65 70 61 72 65 46 72 65 65 41 6e 64 43   prepareFreeAndC
bc00: 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64  ollectError(p->d
bc10: 62 4d 61 69 6e 2c 20 26 70 58 49 6e 66 6f 2c 20  bMain, &pXInfo, 
bc20: 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 0a 20 20 20  &p->zErrmsg,.   
bc30: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72       sqlite3_mpr
bc40: 69 6e 74 66 28 22 50 52 41 47 4d 41 20 6d 61 69  intf("PRAGMA mai
bc50: 6e 2e 69 6e 64 65 78 5f 78 69 6e 66 6f 20 3d 20  n.index_xinfo = 
bc60: 25 51 22 2c 20 70 49 74 65 72 2d 3e 7a 49 64 78  %Q", pIter->zIdx
bc70: 29 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20  ).    );.  }..  
bc80: 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
bc90: 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52  E_OK && SQLITE_R
bca0: 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
bcb0: 28 70 58 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20  (pXInfo) ){.    
bcc0: 69 6e 74 20 69 43 69 64 20 3d 20 73 71 6c 69 74  int iCid = sqlit
bcd0: 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 58  e3_column_int(pX
bce0: 49 6e 66 6f 2c 20 31 29 3b 0a 20 20 20 20 69 6e  Info, 1);.    in
bcf0: 74 20 62 44 65 73 63 20 3d 20 73 71 6c 69 74 65  t bDesc = sqlite
bd00: 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 58 49  3_column_int(pXI
bd10: 6e 66 6f 2c 20 33 29 3b 0a 20 20 20 20 63 6f 6e  nfo, 3);.    con
bd20: 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 61 74  st char *zCollat
bd30: 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  e = (const char*
bd40: 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
bd50: 74 65 78 74 28 70 58 49 6e 66 6f 2c 20 34 29 3b  text(pXInfo, 4);
bd60: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
bd70: 2a 7a 43 6f 6c 3b 0a 20 20 20 20 63 6f 6e 73 74  *zCol;.    const
bd80: 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 0a 20   char *zType;.. 
bd90: 20 20 20 69 66 28 20 69 43 69 64 3c 30 20 29 7b     if( iCid<0 ){
bda0: 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 74  .      /* An int
bdb0: 65 67 65 72 20 70 72 69 6d 61 72 79 20 6b 65 79  eger primary key
bdc0: 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 68  . If the table h
bdd0: 61 73 20 61 6e 20 65 78 70 6c 69 63 69 74 20 49  as an explicit I
bde0: 50 4b 2c 20 75 73 65 0a 20 20 20 20 20 20 2a 2a  PK, use.      **
bdf0: 20 69 74 73 20 6e 61 6d 65 2e 20 4f 74 68 65 72   its name. Other
be00: 77 69 73 65 2c 20 75 73 65 20 22 72 62 75 5f 72  wise, use "rbu_r
be10: 6f 77 69 64 22 2e 20 20 2a 2f 0a 20 20 20 20 20  owid".  */.     
be20: 20 69 66 28 20 70 49 74 65 72 2d 3e 65 54 79 70   if( pIter->eTyp
be30: 65 3d 3d 52 42 55 5f 50 4b 5f 49 50 4b 20 29 7b  e==RBU_PK_IPK ){
be40: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  .        int i;.
be50: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
be60: 20 70 49 74 65 72 2d 3e 61 62 54 62 6c 50 6b 5b   pIter->abTblPk[
be70: 69 5d 3d 3d 30 3b 20 69 2b 2b 29 3b 0a 20 20 20  i]==0; i++);.   
be80: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 70       assert( i<p
be90: 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 20 29 3b  Iter->nTblCol );
bea0: 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20  .        zCol = 
beb0: 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b  pIter->azTblCol[
bec0: 69 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  i];.      }else 
bed0: 69 66 28 20 72 62 75 49 73 56 61 63 75 75 6d 28  if( rbuIsVacuum(
bee0: 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 43  p) ){.        zC
bef0: 6f 6c 20 3d 20 22 5f 72 6f 77 69 64 5f 22 3b 0a  ol = "_rowid_";.
bf00: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
bf10: 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22 72 62 75       zCol = "rbu
bf20: 5f 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 7d  _rowid";.      }
bf30: 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22  .      zType = "
bf40: 49 4e 54 45 47 45 52 22 3b 0a 20 20 20 20 7d 65  INTEGER";.    }e
bf50: 6c 73 65 7b 0a 20 20 20 20 20 20 7a 43 6f 6c 20  lse{.      zCol 
bf60: 3d 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f  = pIter->azTblCo
bf70: 6c 5b 69 43 69 64 5d 3b 0a 20 20 20 20 20 20 7a  l[iCid];.      z
bf80: 54 79 70 65 20 3d 20 70 49 74 65 72 2d 3e 61 7a  Type = pIter->az
bf90: 54 62 6c 54 79 70 65 5b 69 43 69 64 5d 3b 0a 20  TblType[iCid];. 
bfa0: 20 20 20 7d 0a 0a 20 20 20 20 7a 52 65 74 20 3d     }..    zRet =
bfb0: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
bfc0: 28 22 25 7a 25 73 5c 22 25 77 5c 22 20 43 4f 4c  ("%z%s\"%w\" COL
bfd0: 4c 41 54 45 20 25 51 22 2c 20 7a 52 65 74 2c 20  LATE %Q", zRet, 
bfe0: 7a 43 6f 6d 2c 20 7a 43 6f 6c 2c 20 7a 43 6f 6c  zCom, zCol, zCol
bff0: 6c 61 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70  late);.    if( p
c000: 49 74 65 72 2d 3e 62 55 6e 69 71 75 65 3d 3d 30  Iter->bUnique==0
c010: 20 7c 7c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75   || sqlite3_colu
c020: 6d 6e 5f 69 6e 74 28 70 58 49 6e 66 6f 2c 20 35  mn_int(pXInfo, 5
c030: 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  ) ){.      const
c040: 20 63 68 61 72 20 2a 7a 4f 72 64 65 72 20 3d 20   char *zOrder = 
c050: 28 62 44 65 73 63 20 3f 20 22 20 44 45 53 43 22  (bDesc ? " DESC"
c060: 20 3a 20 22 22 29 3b 0a 20 20 20 20 20 20 7a 49   : "");.      zI
c070: 6d 70 50 4b 20 3d 20 73 71 6c 69 74 65 33 5f 6d  mpPK = sqlite3_m
c080: 70 72 69 6e 74 66 28 22 25 7a 25 73 5c 22 72 62  printf("%z%s\"rb
c090: 75 5f 69 6d 70 5f 25 64 25 77 5c 22 25 73 22 2c  u_imp_%d%w\"%s",
c0a0: 20 0a 20 20 20 20 20 20 20 20 20 20 7a 49 6d 70   .          zImp
c0b0: 50 4b 2c 20 7a 43 6f 6d 2c 20 6e 42 69 6e 64 2c  PK, zCom, nBind,
c0c0: 20 7a 43 6f 6c 2c 20 7a 4f 72 64 65 72 0a 20 20   zCol, zOrder.  
c0d0: 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20      );.    }.   
c0e0: 20 7a 49 6d 70 43 6f 6c 73 20 3d 20 73 71 6c 69   zImpCols = sqli
c0f0: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a 25  te3_mprintf("%z%
c100: 73 5c 22 72 62 75 5f 69 6d 70 5f 25 64 25 77 5c  s\"rbu_imp_%d%w\
c110: 22 20 25 73 20 43 4f 4c 4c 41 54 45 20 25 51 22  " %s COLLATE %Q"
c120: 2c 20 0a 20 20 20 20 20 20 20 20 7a 49 6d 70 43  , .        zImpC
c130: 6f 6c 73 2c 20 7a 43 6f 6d 2c 20 6e 42 69 6e 64  ols, zCom, nBind
c140: 2c 20 7a 43 6f 6c 2c 20 7a 54 79 70 65 2c 20 7a  , zCol, zType, z
c150: 43 6f 6c 6c 61 74 65 0a 20 20 20 20 29 3b 0a 20  Collate.    );. 
c160: 20 20 20 7a 57 68 65 72 65 20 3d 20 73 71 6c 69     zWhere = sqli
c170: 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20  te3_mprintf(.   
c180: 20 20 20 20 20 22 25 7a 25 73 5c 22 72 62 75 5f       "%z%s\"rbu_
c190: 69 6d 70 5f 25 64 25 77 5c 22 20 49 53 20 3f 22  imp_%d%w\" IS ?"
c1a0: 2c 20 7a 57 68 65 72 65 2c 20 7a 41 6e 64 2c 20  , zWhere, zAnd, 
c1b0: 6e 42 69 6e 64 2c 20 7a 43 6f 6c 0a 20 20 20 20  nBind, zCol.    
c1c0: 29 3b 0a 20 20 20 20 69 66 28 20 7a 52 65 74 3d  );.    if( zRet=
c1d0: 3d 30 20 7c 7c 20 7a 49 6d 70 50 4b 3d 3d 30 20  =0 || zImpPK==0 
c1e0: 7c 7c 20 7a 49 6d 70 43 6f 6c 73 3d 3d 30 20 7c  || zImpCols==0 |
c1f0: 7c 20 7a 57 68 65 72 65 3d 3d 30 20 29 20 72 63  | zWhere==0 ) rc
c200: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
c210: 0a 20 20 20 20 7a 43 6f 6d 20 3d 20 22 2c 20 22  .    zCom = ", "
c220: 3b 0a 20 20 20 20 7a 41 6e 64 20 3d 20 22 20 41  ;.    zAnd = " A
c230: 4e 44 20 22 3b 0a 20 20 20 20 6e 42 69 6e 64 2b  ND ";.    nBind+
c240: 2b 3b 0a 20 20 7d 0a 0a 20 20 72 63 32 20 3d 20  +;.  }..  rc2 = 
c250: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
c260: 28 70 58 49 6e 66 6f 29 3b 0a 20 20 69 66 28 20  (pXInfo);.  if( 
c270: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
c280: 72 63 20 3d 20 72 63 32 3b 0a 0a 20 20 69 66 28  rc = rc2;..  if(
c290: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
c2a0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
c2b0: 65 65 28 7a 52 65 74 29 3b 0a 20 20 20 20 73 71  ee(zRet);.    sq
c2c0: 6c 69 74 65 33 5f 66 72 65 65 28 7a 49 6d 70 43  lite3_free(zImpC
c2d0: 6f 6c 73 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ols);.    sqlite
c2e0: 33 5f 66 72 65 65 28 7a 49 6d 70 50 4b 29 3b 0a  3_free(zImpPK);.
c2f0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
c300: 28 7a 57 68 65 72 65 29 3b 0a 20 20 20 20 7a 52  (zWhere);.    zR
c310: 65 74 20 3d 20 30 3b 0a 20 20 20 20 7a 49 6d 70  et = 0;.    zImp
c320: 43 6f 6c 73 20 3d 20 30 3b 0a 20 20 20 20 7a 49  Cols = 0;.    zI
c330: 6d 70 50 4b 20 3d 20 30 3b 0a 20 20 20 20 7a 57  mpPK = 0;.    zW
c340: 68 65 72 65 20 3d 20 30 3b 0a 20 20 20 20 70 2d  here = 0;.    p-
c350: 3e 72 63 20 3d 20 72 63 3b 0a 20 20 7d 0a 0a 20  >rc = rc;.  }.. 
c360: 20 2a 70 7a 49 6d 70 6f 73 74 65 72 43 6f 6c 73   *pzImposterCols
c370: 20 3d 20 7a 49 6d 70 43 6f 6c 73 3b 0a 20 20 2a   = zImpCols;.  *
c380: 70 7a 49 6d 70 6f 73 74 65 72 50 6b 20 3d 20 7a  pzImposterPk = z
c390: 49 6d 70 50 4b 3b 0a 20 20 2a 70 7a 57 68 65 72  ImpPK;.  *pzWher
c3a0: 65 20 3d 20 7a 57 68 65 72 65 3b 0a 20 20 2a 70  e = zWhere;.  *p
c3b0: 6e 42 69 6e 64 20 3d 20 6e 42 69 6e 64 3b 0a 20  nBind = nBind;. 
c3c0: 20 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a   return zRet;.}.
c3d0: 0a 2f 2a 0a 2a 2a 20 41 73 73 75 6d 69 6e 67 20  ./*.** Assuming 
c3e0: 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c  the current tabl
c3f0: 65 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 22 61  e columns are "a
c400: 22 2c 20 22 62 22 20 61 6e 64 20 22 63 22 2c 20  ", "b" and "c", 
c410: 61 6e 64 20 74 68 65 20 7a 4f 62 6a 0a 2a 2a 20  and the zObj.** 
c420: 70 61 72 61 6d 74 65 72 20 69 73 20 70 61 73 73  paramter is pass
c430: 65 64 20 22 6f 6c 64 22 2c 20 72 65 74 75 72 6e  ed "old", return
c440: 20 61 20 73 74 72 69 6e 67 20 6f 66 20 74 68 65   a string of the
c450: 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   form:.**.**    
c460: 20 22 6f 6c 64 2e 61 2c 20 6f 6c 64 2e 62 2c 20   "old.a, old.b, 
c470: 6f 6c 64 2e 62 22 0a 2a 2a 0a 2a 2a 20 57 69 74  old.b".**.** Wit
c480: 68 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  h the column nam
c490: 65 73 20 65 73 63 61 70 65 64 2e 0a 2a 2a 0a 2a  es escaped..**.*
c4a0: 2a 20 46 6f 72 20 74 61 62 6c 65 73 20 77 69 74  * For tables wit
c4b0: 68 20 69 6d 70 6c 69 63 69 74 20 72 6f 77 69 64  h implicit rowid
c4c0: 73 20 2d 20 52 42 55 5f 50 4b 5f 45 58 54 45 52  s - RBU_PK_EXTER
c4d0: 4e 41 4c 20 61 6e 64 20 52 42 55 5f 50 4b 5f 4e  NAL and RBU_PK_N
c4e0: 4f 4e 45 2c 20 61 70 70 65 6e 64 0a 2a 2a 20 74  ONE, append.** t
c4f0: 68 65 20 74 65 78 74 20 22 2c 20 6f 6c 64 2e 5f  he text ", old._
c500: 72 6f 77 69 64 5f 22 20 74 6f 20 74 68 65 20 72  rowid_" to the r
c510: 65 74 75 72 6e 65 64 20 76 61 6c 75 65 2e 0a 2a  eturned value..*
c520: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 72  /.static char *r
c530: 62 75 4f 62 6a 49 74 65 72 47 65 74 4f 6c 64 6c  buObjIterGetOldl
c540: 69 73 74 28 0a 20 20 73 71 6c 69 74 65 33 72 62  ist(.  sqlite3rb
c550: 75 20 2a 70 2c 20 0a 20 20 52 62 75 4f 62 6a 49  u *p, .  RbuObjI
c560: 74 65 72 20 2a 70 49 74 65 72 2c 0a 20 20 63 6f  ter *pIter,.  co
c570: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 62 6a 0a 29  nst char *zObj.)
c580: 7b 0a 20 20 63 68 61 72 20 2a 7a 4c 69 73 74 20  {.  char *zList 
c590: 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63  = 0;.  if( p->rc
c5a0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
c5b0: 49 74 65 72 2d 3e 61 62 49 6e 64 65 78 65 64 20  Iter->abIndexed 
c5c0: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
c5d0: 72 20 2a 7a 53 20 3d 20 22 22 3b 0a 20 20 20 20  r *zS = "";.    
c5e0: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
c5f0: 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 54 62  =0; i<pIter->nTb
c600: 6c 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lCol; i++){.    
c610: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 61 62 49    if( pIter->abI
c620: 6e 64 65 78 65 64 5b 69 5d 20 29 7b 0a 20 20 20  ndexed[i] ){.   
c630: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
c640: 2a 7a 43 6f 6c 20 3d 20 70 49 74 65 72 2d 3e 61  *zCol = pIter->a
c650: 7a 54 62 6c 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20  zTblCol[i];.    
c660: 20 20 20 20 7a 4c 69 73 74 20 3d 20 73 71 6c 69      zList = sqli
c670: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a 25  te3_mprintf("%z%
c680: 73 25 73 2e 5c 22 25 77 5c 22 22 2c 20 7a 4c 69  s%s.\"%w\"", zLi
c690: 73 74 2c 20 7a 53 2c 20 7a 4f 62 6a 2c 20 7a 43  st, zS, zObj, zC
c6a0: 6f 6c 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ol);.      }else
c6b0: 7b 0a 20 20 20 20 20 20 20 20 7a 4c 69 73 74 20  {.        zList 
c6c0: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
c6d0: 66 28 22 25 7a 25 73 4e 55 4c 4c 22 2c 20 7a 4c  f("%z%sNULL", zL
c6e0: 69 73 74 2c 20 7a 53 29 3b 0a 20 20 20 20 20 20  ist, zS);.      
c6f0: 7d 0a 20 20 20 20 20 20 7a 53 20 3d 20 22 2c 20  }.      zS = ", 
c700: 22 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 4c 69  ";.      if( zLi
c710: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  st==0 ){.       
c720: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
c730: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 62  NOMEM;.        b
c740: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
c750: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 6f 72 20    }..    /* For 
c760: 61 20 74 61 62 6c 65 20 77 69 74 68 20 69 6d 70  a table with imp
c770: 6c 69 63 69 74 20 72 6f 77 69 64 73 2c 20 61 70  licit rowids, ap
c780: 70 65 6e 64 20 22 6f 6c 64 2e 5f 72 6f 77 69 64  pend "old._rowid
c790: 5f 22 20 74 6f 20 74 68 65 20 6c 69 73 74 2e 20  _" to the list. 
c7a0: 2a 2f 0a 20 20 20 20 69 66 28 20 70 49 74 65 72  */.    if( pIter
c7b0: 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f  ->eType==RBU_PK_
c7c0: 45 58 54 45 52 4e 41 4c 20 7c 7c 20 70 49 74 65  EXTERNAL || pIte
c7d0: 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b  r->eType==RBU_PK
c7e0: 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 7a  _NONE ){.      z
c7f0: 4c 69 73 74 20 3d 20 72 62 75 4d 50 72 69 6e 74  List = rbuMPrint
c800: 66 28 70 2c 20 22 25 7a 2c 20 25 73 2e 5f 72 6f  f(p, "%z, %s._ro
c810: 77 69 64 5f 22 2c 20 7a 4c 69 73 74 2c 20 7a 4f  wid_", zList, zO
c820: 62 6a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  bj);.    }.  }. 
c830: 20 72 65 74 75 72 6e 20 7a 4c 69 73 74 3b 0a 7d   return zList;.}
c840: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
c850: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  n expression tha
c860: 74 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 6e  t can be used in
c870: 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20   a WHERE clause 
c880: 74 6f 20 6d 61 74 63 68 20 74 68 65 0a 2a 2a 20  to match the.** 
c890: 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 66 20 74  primary key of t
c8a0: 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65  he current table
c8b0: 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69  . For example, i
c8c0: 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 3a 0a  f the table is:.
c8d0: 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 54  **.**   CREATE T
c8e0: 41 42 4c 45 20 74 31 28 61 2c 20 62 2c 20 63 2c  ABLE t1(a, b, c,
c8f0: 20 50 52 49 4d 41 52 59 20 4b 45 59 28 62 2c 20   PRIMARY KEY(b, 
c900: 63 29 29 3b 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  c));.**.** Retur
c910: 6e 20 74 68 65 20 73 74 72 69 6e 67 3a 0a 2a 2a  n the string:.**
c920: 0a 2a 2a 20 20 20 22 62 20 3d 20 3f 31 20 41 4e  .**   "b = ?1 AN
c930: 44 20 63 20 3d 20 3f 32 22 0a 2a 2f 0a 73 74 61  D c = ?2".*/.sta
c940: 74 69 63 20 63 68 61 72 20 2a 72 62 75 4f 62 6a  tic char *rbuObj
c950: 49 74 65 72 47 65 74 57 68 65 72 65 28 0a 20 20  IterGetWhere(.  
c960: 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 0a  sqlite3rbu *p, .
c970: 20 20 52 62 75 4f 62 6a 49 74 65 72 20 2a 70 49    RbuObjIter *pI
c980: 74 65 72 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a  ter.){.  char *z
c990: 4c 69 73 74 20 3d 20 30 3b 0a 20 20 69 66 28 20  List = 0;.  if( 
c9a0: 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42  pIter->eType==RB
c9b0: 55 5f 50 4b 5f 56 54 41 42 20 7c 7c 20 70 49 74  U_PK_VTAB || pIt
c9c0: 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50  er->eType==RBU_P
c9d0: 4b 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 7a 4c  K_NONE ){.    zL
c9e0: 69 73 74 20 3d 20 72 62 75 4d 50 72 69 6e 74 66  ist = rbuMPrintf
c9f0: 28 70 2c 20 22 5f 72 6f 77 69 64 5f 20 3d 20 3f  (p, "_rowid_ = ?
ca00: 25 64 22 2c 20 70 49 74 65 72 2d 3e 6e 54 62 6c  %d", pIter->nTbl
ca10: 43 6f 6c 2b 31 29 3b 0a 20 20 7d 65 6c 73 65 20  Col+1);.  }else 
ca20: 69 66 28 20 70 49 74 65 72 2d 3e 65 54 79 70 65  if( pIter->eType
ca30: 3d 3d 52 42 55 5f 50 4b 5f 45 58 54 45 52 4e 41  ==RBU_PK_EXTERNA
ca40: 4c 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  L ){.    const c
ca50: 68 61 72 20 2a 7a 53 65 70 20 3d 20 22 22 3b 0a  har *zSep = "";.
ca60: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
ca70: 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d  or(i=0; i<pIter-
ca80: 3e 6e 54 62 6c 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  >nTblCol; i++){.
ca90: 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d        if( pIter-
caa0: 3e 61 62 54 62 6c 50 6b 5b 69 5d 20 29 7b 0a 20  >abTblPk[i] ){. 
cab0: 20 20 20 20 20 20 20 7a 4c 69 73 74 20 3d 20 72         zList = r
cac0: 62 75 4d 50 72 69 6e 74 66 28 70 2c 20 22 25 7a  buMPrintf(p, "%z
cad0: 25 73 63 25 64 3d 3f 25 64 22 2c 20 7a 4c 69 73  %sc%d=?%d", zLis
cae0: 74 2c 20 7a 53 65 70 2c 20 69 2c 20 69 2b 31 29  t, zSep, i, i+1)
caf0: 3b 0a 20 20 20 20 20 20 20 20 7a 53 65 70 20 3d  ;.        zSep =
cb00: 20 22 20 41 4e 44 20 22 3b 0a 20 20 20 20 20 20   " AND ";.      
cb10: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4c 69 73  }.    }.    zLis
cb20: 74 20 3d 20 72 62 75 4d 50 72 69 6e 74 66 28 70  t = rbuMPrintf(p
cb30: 2c 20 0a 20 20 20 20 20 20 20 20 22 5f 72 6f 77  , .        "_row
cb40: 69 64 5f 20 3d 20 28 53 45 4c 45 43 54 20 69 64  id_ = (SELECT id
cb50: 20 46 52 4f 4d 20 72 62 75 5f 69 6d 70 6f 73 74   FROM rbu_impost
cb60: 65 72 32 20 57 48 45 52 45 20 25 7a 29 22 2c 20  er2 WHERE %z)", 
cb70: 7a 4c 69 73 74 0a 20 20 20 20 29 3b 0a 0a 20 20  zList.    );..  
cb80: 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e 73 74  }else{.    const
cb90: 20 63 68 61 72 20 2a 7a 53 65 70 20 3d 20 22 22   char *zSep = ""
cba0: 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
cbb0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65   for(i=0; i<pIte
cbc0: 72 2d 3e 6e 54 62 6c 43 6f 6c 3b 20 69 2b 2b 29  r->nTblCol; i++)
cbd0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  {.      if( pIte
cbe0: 72 2d 3e 61 62 54 62 6c 50 6b 5b 69 5d 20 29 7b  r->abTblPk[i] ){
cbf0: 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
cc00: 68 61 72 20 2a 7a 43 6f 6c 20 3d 20 70 49 74 65  har *zCol = pIte
cc10: 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69 5d 3b 0a  r->azTblCol[i];.
cc20: 20 20 20 20 20 20 20 20 7a 4c 69 73 74 20 3d 20          zList = 
cc30: 72 62 75 4d 50 72 69 6e 74 66 28 70 2c 20 22 25  rbuMPrintf(p, "%
cc40: 7a 25 73 5c 22 25 77 5c 22 3d 3f 25 64 22 2c 20  z%s\"%w\"=?%d", 
cc50: 7a 4c 69 73 74 2c 20 7a 53 65 70 2c 20 7a 43 6f  zList, zSep, zCo
cc60: 6c 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 20  l, i+1);.       
cc70: 20 7a 53 65 70 20 3d 20 22 20 41 4e 44 20 22 3b   zSep = " AND ";
cc80: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
cc90: 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4c 69 73   }.  return zLis
cca0: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  t;.}../*.** The 
ccb0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
ccc0: 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75   iterating throu
ccd0: 67 68 20 74 68 65 20 6b 65 79 73 20 66 6f 72 20  gh the keys for 
cce0: 74 68 65 20 63 75 72 72 65 6e 74 20 6f 62 6a 65  the current obje
ccf0: 63 74 0a 2a 2a 20 28 70 2d 3e 6f 62 6a 69 74 65  ct.** (p->objite
cd00: 72 2e 70 53 65 6c 65 63 74 29 20 63 75 72 72 65  r.pSelect) curre
cd10: 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 61  ntly points to a
cd20: 20 76 61 6c 69 64 20 72 6f 77 2e 20 48 6f 77 65   valid row. Howe
cd30: 76 65 72 2c 20 74 68 65 72 65 0a 2a 2a 20 69 73  ver, there.** is
cd40: 20 73 6f 6d 65 74 68 69 6e 67 20 77 72 6f 6e 67   something wrong
cd50: 20 77 69 74 68 20 74 68 65 20 72 62 75 5f 63 6f   with the rbu_co
cd60: 6e 74 72 6f 6c 20 76 61 6c 75 65 20 69 6e 20 74  ntrol value in t
cd70: 68 65 20 72 62 75 5f 63 6f 6e 74 72 6f 6c 20 76  he rbu_control v
cd80: 61 6c 75 65 0a 2a 2a 20 73 74 6f 72 65 64 20 69  alue.** stored i
cd90: 6e 20 74 68 65 20 28 70 2d 3e 6e 43 6f 6c 2b 31  n the (p->nCol+1
cda0: 29 27 74 68 20 63 6f 6c 75 6d 6e 2e 20 53 65 74  )'th column. Set
cdb0: 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
cdc0: 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67  and error messag
cdd0: 65 0a 2a 2a 20 6f 66 20 74 68 65 20 52 42 55 20  e.** of the RBU 
cde0: 68 61 6e 64 6c 65 20 74 6f 20 73 6f 6d 65 74 68  handle to someth
cdf0: 69 6e 67 20 72 65 66 6c 65 63 74 69 6e 67 20 74  ing reflecting t
ce00: 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  his..*/.static v
ce10: 6f 69 64 20 72 62 75 42 61 64 43 6f 6e 74 72 6f  oid rbuBadContro
ce20: 6c 45 72 72 6f 72 28 73 71 6c 69 74 65 33 72 62  lError(sqlite3rb
ce30: 75 20 2a 70 29 7b 0a 20 20 70 2d 3e 72 63 20 3d  u *p){.  p->rc =
ce40: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
ce50: 20 70 2d 3e 7a 45 72 72 6d 73 67 20 3d 20 73 71   p->zErrmsg = sq
ce60: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 69  lite3_mprintf("i
ce70: 6e 76 61 6c 69 64 20 72 62 75 5f 63 6f 6e 74 72  nvalid rbu_contr
ce80: 6f 6c 20 76 61 6c 75 65 22 29 3b 0a 7d 0a 0a 0a  ol value");.}...
ce90: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 6e  /*.** Return a n
cea0: 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74  ul-terminated st
ceb0: 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ring containing 
cec0: 74 68 65 20 63 6f 6d 6d 61 20 73 65 70 61 72 61  the comma separa
ced0: 74 65 64 20 6c 69 73 74 20 6f 66 0a 2a 2a 20 61  ted list of.** a
cee0: 73 73 69 67 6e 6d 65 6e 74 73 20 74 68 61 74 20  ssignments that 
cef0: 73 68 6f 75 6c 64 20 62 65 20 69 6e 63 6c 75 64  should be includ
cf00: 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ed following the
cf10: 20 22 53 45 54 22 20 6b 65 79 77 6f 72 64 20 6f   "SET" keyword o
cf20: 66 0a 2a 2a 20 61 6e 20 55 50 44 41 54 45 20 73  f.** an UPDATE s
cf30: 74 61 74 65 6d 65 6e 74 20 75 73 65 64 20 74 6f  tatement used to
cf40: 20 75 70 64 61 74 65 20 74 68 65 20 74 61 62 6c   update the tabl
cf50: 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20 74 68  e object that th
cf60: 65 20 69 74 65 72 61 74 6f 72 0a 2a 2a 20 70 61  e iterator.** pa
cf70: 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
cf80: 6e 64 20 61 72 67 75 6d 65 6e 74 20 63 75 72 72  nd argument curr
cf90: 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20  ently points to 
cfa0: 69 66 20 74 68 65 20 72 62 75 5f 63 6f 6e 74 72  if the rbu_contr
cfb0: 6f 6c 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6f 66 20  ol.** column of 
cfc0: 74 68 65 20 64 61 74 61 5f 78 78 78 20 74 61 62  the data_xxx tab
cfd0: 6c 65 20 65 6e 74 72 79 20 69 73 20 73 65 74 20  le entry is set 
cfe0: 74 6f 20 7a 4d 61 73 6b 2e 0a 2a 2a 0a 2a 2a 20  to zMask..**.** 
cff0: 54 68 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74  The memory for t
d000: 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69  he returned stri
d010: 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  ng is obtained f
d020: 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
d030: 6f 63 28 29 2e 0a 2a 2a 20 49 74 20 69 73 20 74  oc()..** It is t
d040: 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  he responsibilit
d050: 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20  y of the caller 
d060: 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72  to eventually fr
d070: 65 65 20 69 74 20 75 73 69 6e 67 0a 2a 2a 20 73  ee it using.** s
d080: 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 20 0a  qlite3_free(). .
d090: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20  **.** If an OOM 
d0a0: 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74  error is encount
d0b0: 65 72 65 64 20 77 68 65 6e 20 61 6c 6c 6f 63 61  ered when alloca
d0c0: 74 69 6e 67 20 73 70 61 63 65 20 66 6f 72 20 74  ting space for t
d0d0: 68 65 20 6e 65 77 0a 2a 2a 20 73 74 72 69 6e 67  he new.** string
d0e0: 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  , an error code 
d0f0: 69 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20 72  is left in the r
d100: 62 75 20 68 61 6e 64 6c 65 20 70 61 73 73 65 64  bu handle passed
d110: 20 61 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a   as the first.**
d120: 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 4e 55   argument and NU
d130: 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  LL is returned. 
d140: 4f 72 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20  Or, if an error 
d150: 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75  has already occu
d160: 72 72 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 69  rred.** when thi
d170: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
d180: 6c 6c 65 64 2c 20 4e 55 4c 4c 20 69 73 20 72 65  lled, NULL is re
d190: 74 75 72 6e 65 64 20 69 6d 6d 65 64 69 61 74 65  turned immediate
d1a0: 6c 79 2c 20 77 69 74 68 6f 75 74 0a 2a 2a 20 61  ly, without.** a
d1b0: 74 74 65 6d 70 74 69 6e 67 20 74 68 65 20 61 6c  ttempting the al
d1c0: 6c 6f 63 61 74 69 6f 6e 20 6f 72 20 6d 6f 64 69  location or modi
d1d0: 66 79 69 6e 67 20 74 68 65 20 73 74 6f 72 65 64  fying the stored
d1e0: 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a   error code..*/.
d1f0: 73 74 61 74 69 63 20 63 68 61 72 20 2a 72 62 75  static char *rbu
d200: 4f 62 6a 49 74 65 72 47 65 74 53 65 74 6c 69 73  ObjIterGetSetlis
d210: 74 28 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20  t(.  sqlite3rbu 
d220: 2a 70 2c 0a 20 20 52 62 75 4f 62 6a 49 74 65 72  *p,.  RbuObjIter
d230: 20 2a 70 49 74 65 72 2c 0a 20 20 63 6f 6e 73 74   *pIter,.  const
d240: 20 63 68 61 72 20 2a 7a 4d 61 73 6b 0a 29 7b 0a   char *zMask.){.
d250: 20 20 63 68 61 72 20 2a 7a 4c 69 73 74 20 3d 20    char *zList = 
d260: 30 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  0;.  if( p->rc==
d270: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
d280: 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20 69 66 28   int i;..    if(
d290: 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 4d 61   (int)strlen(zMa
d2a0: 73 6b 29 21 3d 70 49 74 65 72 2d 3e 6e 54 62 6c  sk)!=pIter->nTbl
d2b0: 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 72 62 75  Col ){.      rbu
d2c0: 42 61 64 43 6f 6e 74 72 6f 6c 45 72 72 6f 72 28  BadControlError(
d2d0: 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  p);.    }else{. 
d2e0: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
d2f0: 2a 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20 20 20  *zSep = "";.    
d300: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74    for(i=0; i<pIt
d310: 65 72 2d 3e 6e 54 62 6c 43 6f 6c 3b 20 69 2b 2b  er->nTblCol; i++
d320: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
d330: 63 20 3d 20 7a 4d 61 73 6b 5b 70 49 74 65 72 2d  c = zMask[pIter-
d340: 3e 61 69 53 72 63 4f 72 64 65 72 5b 69 5d 5d 3b  >aiSrcOrder[i]];
d350: 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d  .        if( c==
d360: 27 78 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20  'x' ){.         
d370: 20 7a 4c 69 73 74 20 3d 20 72 62 75 4d 50 72 69   zList = rbuMPri
d380: 6e 74 66 28 70 2c 20 22 25 7a 25 73 5c 22 25 77  ntf(p, "%z%s\"%w
d390: 5c 22 3d 3f 25 64 22 2c 20 0a 20 20 20 20 20 20  \"=?%d", .      
d3a0: 20 20 20 20 20 20 20 20 7a 4c 69 73 74 2c 20 7a          zList, z
d3b0: 53 65 70 2c 20 70 49 74 65 72 2d 3e 61 7a 54 62  Sep, pIter->azTb
d3c0: 6c 43 6f 6c 5b 69 5d 2c 20 69 2b 31 0a 20 20 20  lCol[i], i+1.   
d3d0: 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
d3e0: 20 20 20 20 7a 53 65 70 20 3d 20 22 2c 20 22 3b      zSep = ", ";
d3f0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
d400: 20 20 20 65 6c 73 65 20 69 66 28 20 63 3d 3d 27     else if( c=='
d410: 64 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  d' ){.          
d420: 7a 4c 69 73 74 20 3d 20 72 62 75 4d 50 72 69 6e  zList = rbuMPrin
d430: 74 66 28 70 2c 20 22 25 7a 25 73 5c 22 25 77 5c  tf(p, "%z%s\"%w\
d440: 22 3d 72 62 75 5f 64 65 6c 74 61 28 5c 22 25 77  "=rbu_delta(\"%w
d450: 5c 22 2c 20 3f 25 64 29 22 2c 20 0a 20 20 20 20  \", ?%d)", .    
d460: 20 20 20 20 20 20 20 20 20 20 7a 4c 69 73 74 2c            zList,
d470: 20 7a 53 65 70 2c 20 70 49 74 65 72 2d 3e 61 7a   zSep, pIter->az
d480: 54 62 6c 43 6f 6c 5b 69 5d 2c 20 70 49 74 65 72  TblCol[i], pIter
d490: 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69 5d 2c 20 69  ->azTblCol[i], i
d4a0: 2b 31 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a  +1.          );.
d4b0: 20 20 20 20 20 20 20 20 20 20 7a 53 65 70 20 3d            zSep =
d4c0: 20 22 2c 20 22 3b 0a 20 20 20 20 20 20 20 20 7d   ", ";.        }
d4d0: 0a 20 20 20 20 20 20 20 20 65 6c 73 65 20 69 66  .        else if
d4e0: 28 20 63 3d 3d 27 66 27 20 29 7b 0a 20 20 20 20  ( c=='f' ){.    
d4f0: 20 20 20 20 20 20 7a 4c 69 73 74 20 3d 20 72 62        zList = rb
d500: 75 4d 50 72 69 6e 74 66 28 70 2c 20 22 25 7a 25  uMPrintf(p, "%z%
d510: 73 5c 22 25 77 5c 22 3d 72 62 75 5f 66 6f 73 73  s\"%w\"=rbu_foss
d520: 69 6c 5f 64 65 6c 74 61 28 5c 22 25 77 5c 22 2c  il_delta(\"%w\",
d530: 20 3f 25 64 29 22 2c 20 0a 20 20 20 20 20 20 20   ?%d)", .       
d540: 20 20 20 20 20 20 20 7a 4c 69 73 74 2c 20 7a 53         zList, zS
d550: 65 70 2c 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c  ep, pIter->azTbl
d560: 43 6f 6c 5b 69 5d 2c 20 70 49 74 65 72 2d 3e 61  Col[i], pIter->a
d570: 7a 54 62 6c 43 6f 6c 5b 69 5d 2c 20 69 2b 31 0a  zTblCol[i], i+1.
d580: 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20            );.   
d590: 20 20 20 20 20 20 20 7a 53 65 70 20 3d 20 22 2c         zSep = ",
d5a0: 20 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   ";.        }.  
d5b0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
d5c0: 20 20 72 65 74 75 72 6e 20 7a 4c 69 73 74 3b 0a    return zList;.
d5d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
d5e0: 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64  a nul-terminated
d5f0: 20 73 74 72 69 6e 67 20 63 6f 6e 73 69 73 74 69   string consisti
d600: 6e 67 20 6f 66 20 6e 42 79 74 65 20 63 6f 6d 6d  ng of nByte comm
d610: 61 20 73 65 70 61 72 61 74 65 64 0a 2a 2a 20 22  a separated.** "
d620: 3f 22 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 20  ?" expressions. 
d630: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20  For example, if 
d640: 6e 42 79 74 65 20 69 73 20 33 2c 20 72 65 74 75  nByte is 3, retu
d650: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 0a  rn a pointer to.
d660: 2a 2a 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74  ** a buffer cont
d670: 61 69 6e 69 6e 67 20 74 68 65 20 73 74 72 69 6e  aining the strin
d680: 67 20 22 3f 2c 3f 2c 3f 22 2e 0a 2a 2a 0a 2a 2a  g "?,?,?"..**.**
d690: 20 54 68 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20   The memory for 
d6a0: 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72  the returned str
d6b0: 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ing is obtained 
d6c0: 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  from sqlite3_mal
d6d0: 6c 6f 63 28 29 2e 0a 2a 2a 20 49 74 20 69 73 20  loc()..** It is 
d6e0: 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  the responsibili
d6f0: 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72  ty of the caller
d700: 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 66   to eventually f
d710: 72 65 65 20 69 74 20 75 73 69 6e 67 0a 2a 2a 20  ree it using.** 
d720: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 20  sqlite3_free(). 
d730: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d  .**.** If an OOM
d740: 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e   error is encoun
d750: 74 65 72 65 64 20 77 68 65 6e 20 61 6c 6c 6f 63  tered when alloc
d760: 61 74 69 6e 67 20 73 70 61 63 65 20 66 6f 72 20  ating space for 
d770: 74 68 65 20 6e 65 77 0a 2a 2a 20 73 74 72 69 6e  the new.** strin
d780: 67 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  g, an error code
d790: 20 69 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20   is left in the 
d7a0: 72 62 75 20 68 61 6e 64 6c 65 20 70 61 73 73 65  rbu handle passe
d7b0: 64 20 61 73 20 74 68 65 20 66 69 72 73 74 0a 2a  d as the first.*
d7c0: 2a 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 4e  * argument and N
d7d0: 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ULL is returned.
d7e0: 20 4f 72 2c 20 69 66 20 61 6e 20 65 72 72 6f 72   Or, if an error
d7f0: 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63   has already occ
d800: 75 72 72 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68  urred.** when th
d810: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
d820: 61 6c 6c 65 64 2c 20 4e 55 4c 4c 20 69 73 20 72  alled, NULL is r
d830: 65 74 75 72 6e 65 64 20 69 6d 6d 65 64 69 61 74  eturned immediat
d840: 65 6c 79 2c 20 77 69 74 68 6f 75 74 0a 2a 2a 20  ely, without.** 
d850: 61 74 74 65 6d 70 74 69 6e 67 20 74 68 65 20 61  attempting the a
d860: 6c 6c 6f 63 61 74 69 6f 6e 20 6f 72 20 6d 6f 64  llocation or mod
d870: 69 66 79 69 6e 67 20 74 68 65 20 73 74 6f 72 65  ifying the store
d880: 64 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f  d error code..*/
d890: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 72 62  .static char *rb
d8a0: 75 4f 62 6a 49 74 65 72 47 65 74 42 69 6e 64 6c  uObjIterGetBindl
d8b0: 69 73 74 28 73 71 6c 69 74 65 33 72 62 75 20 2a  ist(sqlite3rbu *
d8c0: 70 2c 20 69 6e 74 20 6e 42 69 6e 64 29 7b 0a 20  p, int nBind){. 
d8d0: 20 63 68 61 72 20 2a 7a 52 65 74 20 3d 20 30 3b   char *zRet = 0;
d8e0: 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 6e  .  int nByte = n
d8f0: 42 69 6e 64 2a 32 20 2b 20 31 3b 0a 0a 20 20 7a  Bind*2 + 1;..  z
d900: 52 65 74 20 3d 20 28 63 68 61 72 2a 29 72 62 75  Ret = (char*)rbu
d910: 4d 61 6c 6c 6f 63 28 70 2c 20 6e 42 79 74 65 29  Malloc(p, nByte)
d920: 3b 0a 20 20 69 66 28 20 7a 52 65 74 20 29 7b 0a  ;.  if( zRet ){.
d930: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
d940: 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 69 6e 64 3b  or(i=0; i<nBind;
d950: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 52 65   i++){.      zRe
d960: 74 5b 69 2a 32 5d 20 3d 20 27 3f 27 3b 0a 20 20  t[i*2] = '?';.  
d970: 20 20 20 20 7a 52 65 74 5b 69 2a 32 2b 31 5d 20      zRet[i*2+1] 
d980: 3d 20 28 69 2b 31 3d 3d 6e 42 69 6e 64 29 20 3f  = (i+1==nBind) ?
d990: 20 27 5c 30 27 20 3a 20 27 2c 27 3b 0a 20 20 20   '\0' : ',';.   
d9a0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
d9b0: 7a 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  zRet;.}../*.** T
d9c0: 68 65 20 69 74 65 72 61 74 6f 72 20 63 75 72 72  he iterator curr
d9d0: 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20  ently points to 
d9e0: 61 20 74 61 62 6c 65 20 28 6e 6f 74 20 69 6e 64  a table (not ind
d9f0: 65 78 29 20 6f 66 20 74 79 70 65 20 0a 2a 2a 20  ex) of type .** 
da00: 52 42 55 5f 50 4b 5f 57 49 54 48 4f 55 54 5f 52  RBU_PK_WITHOUT_R
da10: 4f 57 49 44 2e 20 54 68 69 73 20 66 75 6e 63 74  OWID. This funct
da20: 69 6f 6e 20 63 72 65 61 74 65 73 20 74 68 65 20  ion creates the 
da30: 50 52 49 4d 41 52 59 20 4b 45 59 20 0a 2a 2a 20  PRIMARY KEY .** 
da40: 64 65 63 6c 61 72 61 74 69 6f 6e 20 66 6f 72 20  declaration for 
da50: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
da60: 67 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65  g imposter table
da70: 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 0a 2a  . For example,.*
da80: 2a 20 69 66 20 74 68 65 20 69 74 65 72 61 74 6f  * if the iterato
da90: 72 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 74 61  r points to a ta
daa0: 62 6c 65 20 63 72 65 61 74 65 64 20 61 73 3a 0a  ble created as:.
dab0: 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 54  **.**   CREATE T
dac0: 41 42 4c 45 20 74 31 28 61 2c 20 62 2c 20 63 2c  ABLE t1(a, b, c,
dad0: 20 50 52 49 4d 41 52 59 20 4b 45 59 28 62 2c 20   PRIMARY KEY(b, 
dae0: 61 20 44 45 53 43 29 29 20 57 49 54 48 4f 55 54  a DESC)) WITHOUT
daf0: 20 52 4f 57 49 44 0a 2a 2a 0a 2a 2a 20 74 68 69   ROWID.**.** thi
db00: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
db10: 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 52 49 4d  ns:.**.**   PRIM
db20: 41 52 59 20 4b 45 59 28 22 62 22 2c 20 22 61 22  ARY KEY("b", "a"
db30: 20 44 45 53 43 29 0a 2a 2f 0a 73 74 61 74 69 63   DESC).*/.static
db40: 20 63 68 61 72 20 2a 72 62 75 57 69 74 68 6f 75   char *rbuWithou
db50: 74 52 6f 77 69 64 50 4b 28 73 71 6c 69 74 65 33  tRowidPK(sqlite3
db60: 72 62 75 20 2a 70 2c 20 52 62 75 4f 62 6a 49 74  rbu *p, RbuObjIt
db70: 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 63 68  er *pIter){.  ch
db80: 61 72 20 2a 7a 20 3d 20 30 3b 0a 20 20 61 73 73  ar *z = 0;.  ass
db90: 65 72 74 28 20 70 49 74 65 72 2d 3e 7a 49 64 78  ert( pIter->zIdx
dba0: 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  ==0 );.  if( p->
dbb0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
dbc0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
dbd0: 2a 7a 53 65 70 20 3d 20 22 50 52 49 4d 41 52 59  *zSep = "PRIMARY
dbe0: 20 4b 45 59 28 22 3b 0a 20 20 20 20 73 71 6c 69   KEY(";.    sqli
dbf0: 74 65 33 5f 73 74 6d 74 20 2a 70 58 4c 69 73 74  te3_stmt *pXList
dc00: 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 50 52 41   = 0;     /* PRA
dc10: 47 4d 41 20 69 6e 64 65 78 5f 6c 69 73 74 20 3d  GMA index_list =
dc20: 20 28 70 49 74 65 72 2d 3e 7a 54 62 6c 29 20 2a   (pIter->zTbl) *
dc30: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  /.    sqlite3_st
dc40: 6d 74 20 2a 70 58 49 6e 66 6f 20 3d 20 30 3b 20  mt *pXInfo = 0; 
dc50: 20 20 20 20 2f 2a 20 50 52 41 47 4d 41 20 69 6e      /* PRAGMA in
dc60: 64 65 78 5f 78 69 6e 66 6f 20 3d 20 3c 70 6b 2d  dex_xinfo = <pk-
dc70: 69 6e 64 65 78 3e 20 2a 2f 0a 20 20 20 0a 20 20  index> */.   .  
dc80: 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72    p->rc = prepar
dc90: 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45  eFreeAndCollectE
dca0: 72 72 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20  rror(p->dbMain, 
dcb0: 26 70 58 4c 69 73 74 2c 20 26 70 2d 3e 7a 45 72  &pXList, &p->zEr
dcc0: 72 6d 73 67 2c 0a 20 20 20 20 20 20 20 20 73 71  rmsg,.        sq
dcd0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 50  lite3_mprintf("P
dce0: 52 41 47 4d 41 20 6d 61 69 6e 2e 69 6e 64 65 78  RAGMA main.index
dcf0: 5f 6c 69 73 74 20 3d 20 25 51 22 2c 20 70 49 74  _list = %Q", pIt
dd00: 65 72 2d 3e 7a 54 62 6c 29 0a 20 20 20 20 29 3b  er->zTbl).    );
dd10: 0a 20 20 20 20 77 68 69 6c 65 28 20 70 2d 3e 72  .    while( p->r
dd20: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
dd30: 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69  SQLITE_ROW==sqli
dd40: 74 65 33 5f 73 74 65 70 28 70 58 4c 69 73 74 29  te3_step(pXList)
dd50: 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   ){.      const 
dd60: 63 68 61 72 20 2a 7a 4f 72 69 67 20 3d 20 28 63  char *zOrig = (c
dd70: 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
dd80: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
dd90: 58 4c 69 73 74 2c 33 29 3b 0a 20 20 20 20 20 20  XList,3);.      
dda0: 69 66 28 20 7a 4f 72 69 67 20 26 26 20 73 74 72  if( zOrig && str
ddb0: 63 6d 70 28 7a 4f 72 69 67 2c 20 22 70 6b 22 29  cmp(zOrig, "pk")
ddc0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ==0 ){.        c
ddd0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 78 20  onst char *zIdx 
dde0: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
ddf0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
de00: 78 74 28 70 58 4c 69 73 74 2c 31 29 3b 0a 20 20  xt(pXList,1);.  
de10: 20 20 20 20 20 20 69 66 28 20 7a 49 64 78 20 29        if( zIdx )
de20: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72  {.          p->r
de30: 63 20 3d 20 70 72 65 70 61 72 65 46 72 65 65 41  c = prepareFreeA
de40: 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70  ndCollectError(p
de50: 2d 3e 64 62 4d 61 69 6e 2c 20 26 70 58 49 6e 66  ->dbMain, &pXInf
de60: 6f 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 0a  o, &p->zErrmsg,.
de70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
de80: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 50  lite3_mprintf("P
de90: 52 41 47 4d 41 20 6d 61 69 6e 2e 69 6e 64 65 78  RAGMA main.index
dea0: 5f 78 69 6e 66 6f 20 3d 20 25 51 22 2c 20 7a 49  _xinfo = %Q", zI
deb0: 64 78 29 0a 20 20 20 20 20 20 20 20 20 20 29 3b  dx).          );
dec0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
ded0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
dee0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 62 75 46  }.    }.    rbuF
def0: 69 6e 61 6c 69 7a 65 28 70 2c 20 70 58 4c 69 73  inalize(p, pXLis
df00: 74 29 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20  t);..    while( 
df10: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
df20: 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d   && SQLITE_ROW==
df30: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 58 49  sqlite3_step(pXI
df40: 6e 66 6f 29 20 29 7b 0a 20 20 20 20 20 20 69 66  nfo) ){.      if
df50: 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  ( sqlite3_column
df60: 5f 69 6e 74 28 70 58 49 6e 66 6f 2c 20 35 29 20  _int(pXInfo, 5) 
df70: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 69 6e  ){.        /* in
df80: 74 20 69 43 69 64 20 3d 20 73 71 6c 69 74 65 33  t iCid = sqlite3
df90: 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 58 49 6e  _column_int(pXIn
dfa0: 66 6f 2c 20 30 29 3b 20 2a 2f 0a 20 20 20 20 20  fo, 0); */.     
dfb0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
dfc0: 43 6f 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  Col = (const cha
dfd0: 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
dfe0: 6e 5f 74 65 78 74 28 70 58 49 6e 66 6f 2c 20 32  n_text(pXInfo, 2
dff0: 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  );.        const
e000: 20 63 68 61 72 20 2a 7a 44 65 73 63 20 3d 20 73   char *zDesc = s
e010: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
e020: 74 28 70 58 49 6e 66 6f 2c 20 33 29 20 3f 20 22  t(pXInfo, 3) ? "
e030: 20 44 45 53 43 22 20 3a 20 22 22 3b 0a 20 20 20   DESC" : "";.   
e040: 20 20 20 20 20 7a 20 3d 20 72 62 75 4d 50 72 69       z = rbuMPri
e050: 6e 74 66 28 70 2c 20 22 25 7a 25 73 5c 22 25 77  ntf(p, "%z%s\"%w
e060: 5c 22 25 73 22 2c 20 7a 2c 20 7a 53 65 70 2c 20  \"%s", z, zSep, 
e070: 7a 43 6f 6c 2c 20 7a 44 65 73 63 29 3b 0a 20 20  zCol, zDesc);.  
e080: 20 20 20 20 20 20 7a 53 65 70 20 3d 20 22 2c 20        zSep = ", 
e090: 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ";.      }.    }
e0a0: 0a 20 20 20 20 7a 20 3d 20 72 62 75 4d 50 72 69  .    z = rbuMPri
e0b0: 6e 74 66 28 70 2c 20 22 25 7a 29 22 2c 20 7a 29  ntf(p, "%z)", z)
e0c0: 3b 0a 20 20 20 20 72 62 75 46 69 6e 61 6c 69 7a  ;.    rbuFinaliz
e0d0: 65 28 70 2c 20 70 58 49 6e 66 6f 29 3b 0a 20 20  e(p, pXInfo);.  
e0e0: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a  }.  return z;.}.
e0f0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
e100: 74 69 6f 6e 20 63 72 65 61 74 65 73 20 74 68 65  tion creates the
e110: 20 73 65 63 6f 6e 64 20 69 6d 70 6f 73 74 65 72   second imposter
e120: 20 74 61 62 6c 65 20 75 73 65 64 20 77 68 65 6e   table used when
e130: 20 77 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 61   writing to.** a
e140: 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20 77 68   table b-tree wh
e150: 65 72 65 20 74 68 65 20 74 61 62 6c 65 20 68 61  ere the table ha
e160: 73 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 70 72  s an external pr
e170: 69 6d 61 72 79 20 6b 65 79 2e 20 49 66 20 74 68  imary key. If th
e180: 65 0a 2a 2a 20 69 74 65 72 61 74 6f 72 20 70 61  e.** iterator pa
e190: 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
e1a0: 6e 64 20 61 72 67 75 6d 65 6e 74 20 64 6f 65 73  nd argument does
e1b0: 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 70   not currently p
e1c0: 6f 69 6e 74 20 74 6f 0a 2a 2a 20 61 20 74 61 62  oint to.** a tab
e1d0: 6c 65 20 28 6e 6f 74 20 69 6e 64 65 78 29 20 77  le (not index) w
e1e0: 69 74 68 20 61 6e 20 65 78 74 65 72 6e 61 6c 20  ith an external 
e1f0: 70 72 69 6d 61 72 79 20 6b 65 79 2c 20 74 68 69  primary key, thi
e200: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 0a  s function is a.
e210: 2a 2a 20 6e 6f 2d 6f 70 2e 20 0a 2a 2a 0a 2a 2a  ** no-op. .**.**
e220: 20 41 73 73 75 6d 69 6e 67 20 74 68 65 20 69 74   Assuming the it
e230: 65 72 61 74 6f 72 20 64 6f 65 73 20 70 6f 69 6e  erator does poin
e240: 74 20 74 6f 20 61 20 74 61 62 6c 65 20 77 69 74  t to a table wit
e250: 68 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 50 4b  h an external PK
e260: 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  , this.** functi
e270: 6f 6e 20 63 72 65 61 74 65 73 20 61 20 57 49 54  on creates a WIT
e280: 48 4f 55 54 20 52 4f 57 49 44 20 69 6d 70 6f 73  HOUT ROWID impos
e290: 74 65 72 20 74 61 62 6c 65 20 6e 61 6d 65 64 20  ter table named 
e2a0: 22 72 62 75 5f 69 6d 70 6f 73 74 65 72 32 22 0a  "rbu_imposter2".
e2b0: 2a 2a 20 75 73 65 64 20 74 6f 20 61 63 63 65 73  ** used to acces
e2c0: 73 20 74 68 61 74 20 50 4b 20 69 6e 64 65 78 2e  s that PK index.
e2d0: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66   For example, if
e2e0: 20 74 68 65 20 74 61 72 67 65 74 20 74 61 62 6c   the target tabl
e2f0: 65 20 69 73 0a 2a 2a 20 64 65 63 6c 61 72 65 64  e is.** declared
e300: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
e310: 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  **   CREATE TABL
e320: 45 20 74 31 28 61 2c 20 62 20 54 45 58 54 2c 20  E t1(a, b TEXT, 
e330: 63 20 52 45 41 4c 2c 20 50 52 49 4d 41 52 59 20  c REAL, PRIMARY 
e340: 4b 45 59 28 62 2c 20 63 29 29 3b 0a 2a 2a 0a 2a  KEY(b, c));.**.*
e350: 2a 20 74 68 65 6e 20 74 68 65 20 69 6d 70 6f 73  * then the impos
e360: 74 65 72 20 74 61 62 6c 65 20 73 63 68 65 6d 61  ter table schema
e370: 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45   is:.**.**   CRE
e380: 41 54 45 20 54 41 42 4c 45 20 72 62 75 5f 69 6d  ATE TABLE rbu_im
e390: 70 6f 73 74 65 72 32 28 63 31 20 54 45 58 54 2c  poster2(c1 TEXT,
e3a0: 20 63 32 20 52 45 41 4c 2c 20 69 64 20 49 4e 54   c2 REAL, id INT
e3b0: 45 47 45 52 29 20 57 49 54 48 4f 55 54 20 52 4f  EGER) WITHOUT RO
e3c0: 57 49 44 3b 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69  WID;.**.*/.stati
e3d0: 63 20 76 6f 69 64 20 72 62 75 43 72 65 61 74 65  c void rbuCreate
e3e0: 49 6d 70 6f 73 74 65 72 54 61 62 6c 65 32 28 73  ImposterTable2(s
e3f0: 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 52 62  qlite3rbu *p, Rb
e400: 75 4f 62 6a 49 74 65 72 20 2a 70 49 74 65 72 29  uObjIter *pIter)
e410: 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  {.  if( p->rc==S
e420: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 49 74 65  QLITE_OK && pIte
e430: 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b  r->eType==RBU_PK
e440: 5f 45 58 54 45 52 4e 41 4c 20 29 7b 0a 20 20 20  _EXTERNAL ){.   
e450: 20 69 6e 74 20 74 6e 75 6d 20 3d 20 70 49 74 65   int tnum = pIte
e460: 72 2d 3e 69 50 6b 54 6e 75 6d 3b 20 20 20 20 2f  r->iPkTnum;    /
e470: 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 50  * Root page of P
e480: 4b 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 73  K index */.    s
e490: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 51 75  qlite3_stmt *pQu
e4a0: 65 72 79 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  ery = 0;     /* 
e4b0: 53 45 4c 45 43 54 20 6e 61 6d 65 20 2e 2e 2e 20  SELECT name ... 
e4c0: 57 48 45 52 45 20 72 6f 6f 74 70 61 67 65 20 3d  WHERE rootpage =
e4d0: 20 24 74 6e 75 6d 20 2a 2f 0a 20 20 20 20 63 6f   $tnum */.    co
e4e0: 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 78 20 3d  nst char *zIdx =
e4f0: 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e   0;         /* N
e500: 61 6d 65 20 6f 66 20 50 4b 20 69 6e 64 65 78 20  ame of PK index 
e510: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  */.    sqlite3_s
e520: 74 6d 74 20 2a 70 58 49 6e 66 6f 20 3d 20 30 3b  tmt *pXInfo = 0;
e530: 20 20 20 20 20 2f 2a 20 50 52 41 47 4d 41 20 6d       /* PRAGMA m
e540: 61 69 6e 2e 69 6e 64 65 78 5f 78 69 6e 66 6f 20  ain.index_xinfo 
e550: 3d 20 24 7a 49 64 78 20 2a 2f 0a 20 20 20 20 63  = $zIdx */.    c
e560: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6d 6d  onst char *zComm
e570: 61 20 3d 20 22 22 3b 0a 20 20 20 20 63 68 61 72  a = "";.    char
e580: 20 2a 7a 43 6f 6c 73 20 3d 20 30 3b 20 20 20 20   *zCols = 0;    
e590: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
e5a0: 64 20 74 6f 20 62 75 69 6c 64 20 75 70 20 6c 69  d to build up li
e5b0: 73 74 20 6f 66 20 74 61 62 6c 65 20 63 6f 6c 73  st of table cols
e5c0: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 50   */.    char *zP
e5d0: 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  k = 0;          
e5e0: 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
e5f0: 20 62 75 69 6c 64 20 75 70 20 74 61 62 6c 65 20   build up table 
e600: 50 4b 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a  PK declaration *
e610: 2f 0a 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65  /..    /* Figure
e620: 20 6f 75 74 20 74 68 65 20 6e 61 6d 65 20 6f 66   out the name of
e630: 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79   the primary key
e640: 20 69 6e 64 65 78 20 66 6f 72 20 74 68 65 20 63   index for the c
e650: 75 72 72 65 6e 74 20 74 61 62 6c 65 2e 0a 20 20  urrent table..  
e660: 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e 65 65    ** This is nee
e670: 64 65 64 20 66 6f 72 20 74 68 65 20 61 72 67 75  ded for the argu
e680: 6d 65 6e 74 20 74 6f 20 22 50 52 41 47 4d 41 20  ment to "PRAGMA 
e690: 69 6e 64 65 78 5f 78 69 6e 66 6f 22 2e 20 53 65  index_xinfo". Se
e6a0: 74 0a 20 20 20 20 2a 2a 20 7a 49 64 78 20 74 6f  t.    ** zIdx to
e6b0: 20 70 6f 69 6e 74 20 74 6f 20 61 20 6e 75 6c 2d   point to a nul-
e6c0: 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e  terminated strin
e6d0: 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69  g containing thi
e6e0: 73 20 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 70  s name. */.    p
e6f0: 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65 41 6e  ->rc = prepareAn
e700: 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d  dCollectError(p-
e710: 3e 64 62 4d 61 69 6e 2c 20 26 70 51 75 65 72 79  >dbMain, &pQuery
e720: 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 20 0a  , &p->zErrmsg, .
e730: 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
e740: 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74 65  name FROM sqlite
e750: 5f 6d 61 73 74 65 72 20 57 48 45 52 45 20 72 6f  _master WHERE ro
e760: 6f 74 70 61 67 65 20 3d 20 3f 22 0a 20 20 20 20  otpage = ?".    
e770: 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  );.    if( p->rc
e780: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
e790: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
e7a0: 64 5f 69 6e 74 28 70 51 75 65 72 79 2c 20 31 2c  d_int(pQuery, 1,
e7b0: 20 74 6e 75 6d 29 3b 0a 20 20 20 20 20 20 69 66   tnum);.      if
e7c0: 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71  ( SQLITE_ROW==sq
e7d0: 6c 69 74 65 33 5f 73 74 65 70 28 70 51 75 65 72  lite3_step(pQuer
e7e0: 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 49  y) ){.        zI
e7f0: 64 78 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  dx = (const char
e800: 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
e810: 5f 74 65 78 74 28 70 51 75 65 72 79 2c 20 30 29  _text(pQuery, 0)
e820: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
e830: 20 20 20 20 69 66 28 20 7a 49 64 78 20 29 7b 0a      if( zIdx ){.
e840: 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 72        p->rc = pr
e850: 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c  epareFreeAndColl
e860: 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 4d 61  ectError(p->dbMa
e870: 69 6e 2c 20 26 70 58 49 6e 66 6f 2c 20 26 70 2d  in, &pXInfo, &p-
e880: 3e 7a 45 72 72 6d 73 67 2c 0a 20 20 20 20 20 20  >zErrmsg,.      
e890: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69      sqlite3_mpri
e8a0: 6e 74 66 28 22 50 52 41 47 4d 41 20 6d 61 69 6e  ntf("PRAGMA main
e8b0: 2e 69 6e 64 65 78 5f 78 69 6e 66 6f 20 3d 20 25  .index_xinfo = %
e8c0: 51 22 2c 20 7a 49 64 78 29 0a 20 20 20 20 20 20  Q", zIdx).      
e8d0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 62 75  );.    }.    rbu
e8e0: 46 69 6e 61 6c 69 7a 65 28 70 2c 20 70 51 75 65  Finalize(p, pQue
e8f0: 72 79 29 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28  ry);..    while(
e900: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
e910: 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d  K && SQLITE_ROW=
e920: 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 58  =sqlite3_step(pX
e930: 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 20 20 69  Info) ){.      i
e940: 6e 74 20 62 4b 65 79 20 3d 20 73 71 6c 69 74 65  nt bKey = sqlite
e950: 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 58 49  3_column_int(pXI
e960: 6e 66 6f 2c 20 35 29 3b 0a 20 20 20 20 20 20 69  nfo, 5);.      i
e970: 66 28 20 62 4b 65 79 20 29 7b 0a 20 20 20 20 20  f( bKey ){.     
e980: 20 20 20 69 6e 74 20 69 43 69 64 20 3d 20 73 71     int iCid = sq
e990: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
e9a0: 28 70 58 49 6e 66 6f 2c 20 31 29 3b 0a 20 20 20  (pXInfo, 1);.   
e9b0: 20 20 20 20 20 69 6e 74 20 62 44 65 73 63 20 3d       int bDesc =
e9c0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
e9d0: 69 6e 74 28 70 58 49 6e 66 6f 2c 20 33 29 3b 0a  int(pXInfo, 3);.
e9e0: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
e9f0: 61 72 20 2a 7a 43 6f 6c 6c 61 74 65 20 3d 20 28  ar *zCollate = (
ea00: 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
ea10: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
ea20: 70 58 49 6e 66 6f 2c 20 34 29 3b 0a 20 20 20 20  pXInfo, 4);.    
ea30: 20 20 20 20 7a 43 6f 6c 73 20 3d 20 72 62 75 4d      zCols = rbuM
ea40: 50 72 69 6e 74 66 28 70 2c 20 22 25 7a 25 73 63  Printf(p, "%z%sc
ea50: 25 64 20 25 73 20 43 4f 4c 4c 41 54 45 20 25 73  %d %s COLLATE %s
ea60: 22 2c 20 7a 43 6f 6c 73 2c 20 7a 43 6f 6d 6d 61  ", zCols, zComma
ea70: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  , .            i
ea80: 43 69 64 2c 20 70 49 74 65 72 2d 3e 61 7a 54 62  Cid, pIter->azTb
ea90: 6c 54 79 70 65 5b 69 43 69 64 5d 2c 20 7a 43 6f  lType[iCid], zCo
eaa0: 6c 6c 61 74 65 0a 20 20 20 20 20 20 20 20 29 3b  llate.        );
eab0: 0a 20 20 20 20 20 20 20 20 7a 50 6b 20 3d 20 72  .        zPk = r
eac0: 62 75 4d 50 72 69 6e 74 66 28 70 2c 20 22 25 7a  buMPrintf(p, "%z
ead0: 25 73 63 25 64 25 73 22 2c 20 7a 50 6b 2c 20 7a  %sc%d%s", zPk, z
eae0: 43 6f 6d 6d 61 2c 20 69 43 69 64 2c 20 62 44 65  Comma, iCid, bDe
eaf0: 73 63 3f 22 20 44 45 53 43 22 3a 22 22 29 3b 0a  sc?" DESC":"");.
eb00: 20 20 20 20 20 20 20 20 7a 43 6f 6d 6d 61 20 3d          zComma =
eb10: 20 22 2c 20 22 3b 0a 20 20 20 20 20 20 7d 0a 20   ", ";.      }. 
eb20: 20 20 20 7d 0a 20 20 20 20 7a 43 6f 6c 73 20 3d     }.    zCols =
eb30: 20 72 62 75 4d 50 72 69 6e 74 66 28 70 2c 20 22   rbuMPrintf(p, "
eb40: 25 7a 2c 20 69 64 20 49 4e 54 45 47 45 52 22 2c  %z, id INTEGER",
eb50: 20 7a 43 6f 6c 73 29 3b 0a 20 20 20 20 72 62 75   zCols);.    rbu
eb60: 46 69 6e 61 6c 69 7a 65 28 70 2c 20 70 58 49 6e  Finalize(p, pXIn
eb70: 66 6f 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65  fo);..    sqlite
eb80: 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
eb90: 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49  QLITE_TESTCTRL_I
eba0: 4d 50 4f 53 54 45 52 2c 20 70 2d 3e 64 62 4d 61  MPOSTER, p->dbMa
ebb0: 69 6e 2c 20 22 6d 61 69 6e 22 2c 20 31 2c 20 74  in, "main", 1, t
ebc0: 6e 75 6d 29 3b 0a 20 20 20 20 72 62 75 4d 50 72  num);.    rbuMPr
ebd0: 69 6e 74 66 45 78 65 63 28 70 2c 20 70 2d 3e 64  intfExec(p, p->d
ebe0: 62 4d 61 69 6e 2c 0a 20 20 20 20 20 20 20 20 22  bMain,.        "
ebf0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 72 62 75  CREATE TABLE rbu
ec00: 5f 69 6d 70 6f 73 74 65 72 32 28 25 7a 2c 20 50  _imposter2(%z, P
ec10: 52 49 4d 41 52 59 20 4b 45 59 28 25 7a 29 29 20  RIMARY KEY(%z)) 
ec20: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 22 2c 20  WITHOUT ROWID", 
ec30: 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 73 2c 20  .        zCols, 
ec40: 7a 50 6b 0a 20 20 20 20 29 3b 0a 20 20 20 20 73  zPk.    );.    s
ec50: 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
ec60: 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
ec70: 54 52 4c 5f 49 4d 50 4f 53 54 45 52 2c 20 70 2d  TRL_IMPOSTER, p-
ec80: 3e 64 62 4d 61 69 6e 2c 20 22 6d 61 69 6e 22 2c  >dbMain, "main",
ec90: 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f   0, 0);.  }.}../
eca0: 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
ecb0: 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63   has already occ
ecc0: 75 72 72 65 64 20 77 68 65 6e 20 74 68 69 73 20  urred when this 
ecd0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
ece0: 65 64 2c 20 69 74 20 0a 2a 2a 20 69 6d 6d 65 64  ed, it .** immed
ecf0: 69 61 74 65 6c 79 20 72 65 74 75 72 6e 73 20 7a  iately returns z
ed00: 65 72 6f 20 28 77 69 74 68 6f 75 74 20 64 6f 69  ero (without doi
ed10: 6e 67 20 61 6e 79 20 77 6f 72 6b 29 2e 20 4f 72  ng any work). Or
ed20: 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 0a 2a 2a  , if an error.**
ed30: 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 74   occurs during t
ed40: 68 65 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20  he execution of 
ed50: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 69  this function, i
ed60: 74 20 73 65 74 73 20 74 68 65 20 65 72 72 6f 72  t sets the error
ed70: 20 63 6f 64 65 0a 2a 2a 20 69 6e 20 74 68 65 20   code.** in the 
ed80: 73 71 6c 69 74 65 33 72 62 75 20 6f 62 6a 65 63  sqlite3rbu objec
ed90: 74 20 69 6e 64 69 63 61 74 65 64 20 62 79 20 74  t indicated by t
eda0: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
edb0: 74 20 61 6e 64 20 72 65 74 75 72 6e 73 0a 2a 2a  t and returns.**
edc0: 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   zero..**.** The
edd0: 20 69 74 65 72 61 74 6f 72 20 70 61 73 73 65 64   iterator passed
ede0: 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
edf0: 72 67 75 6d 65 6e 74 20 69 73 20 67 75 61 72 61  rgument is guara
ee00: 6e 74 65 65 64 20 74 6f 20 70 6f 69 6e 74 20 74  nteed to point t
ee10: 6f 0a 2a 2a 20 61 20 74 61 62 6c 65 20 28 6e 6f  o.** a table (no
ee20: 74 20 61 6e 20 69 6e 64 65 78 29 20 77 68 65 6e  t an index) when
ee30: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
ee40: 73 20 63 61 6c 6c 65 64 2e 20 54 68 69 73 20 66  s called. This f
ee50: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 74 74 65 6d  unction.** attem
ee60: 70 74 73 20 74 6f 20 63 72 65 61 74 65 20 61 6e  pts to create an
ee70: 79 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65  y imposter table
ee80: 20 72 65 71 75 69 72 65 64 20 74 6f 20 77 72 69   required to wri
ee90: 74 65 20 74 6f 20 74 68 65 20 6d 61 69 6e 0a 2a  te to the main.*
eea0: 2a 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20 6f  * table b-tree o
eeb0: 66 20 74 68 65 20 74 61 62 6c 65 20 62 65 66 6f  f the table befo
eec0: 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 4e 6f  re returning. No
eed0: 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e  n-zero is return
eee0: 65 64 20 69 66 0a 2a 2a 20 61 6e 20 69 6d 70 6f  ed if.** an impo
eef0: 73 74 65 72 20 74 61 62 6c 65 20 61 72 65 20 63  ster table are c
ef00: 72 65 61 74 65 64 2c 20 6f 72 20 7a 65 72 6f 20  reated, or zero 
ef10: 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a  otherwise..**.**
ef20: 20 41 6e 20 69 6d 70 6f 73 74 65 72 20 74 61 62   An imposter tab
ef30: 6c 65 20 69 73 20 72 65 71 75 69 72 65 64 20 69  le is required i
ef40: 6e 20 61 6c 6c 20 63 61 73 65 73 20 65 78 63 65  n all cases exce
ef50: 70 74 20 52 42 55 5f 50 4b 5f 56 54 41 42 2e 20  pt RBU_PK_VTAB. 
ef60: 4f 6e 6c 79 0a 2a 2a 20 76 69 72 74 75 61 6c 20  Only.** virtual 
ef70: 74 61 62 6c 65 73 20 61 72 65 20 77 72 69 74 74  tables are writt
ef80: 65 6e 20 74 6f 20 64 69 72 65 63 74 6c 79 2e 20  en to directly. 
ef90: 54 68 65 20 69 6d 70 6f 73 74 65 72 20 74 61 62  The imposter tab
efa0: 6c 65 20 68 61 73 20 74 68 65 20 0a 2a 2a 20 73  le has the .** s
efb0: 61 6d 65 20 73 63 68 65 6d 61 20 61 73 20 74 68  ame schema as th
efc0: 65 20 61 63 74 75 61 6c 20 74 61 72 67 65 74 20  e actual target 
efd0: 74 61 62 6c 65 20 28 6c 65 73 73 20 61 6e 79 20  table (less any 
efe0: 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e  UNIQUE constrain
eff0: 74 73 29 2e 20 0a 2a 2a 20 4d 6f 72 65 20 70 72  ts). .** More pr
f000: 65 63 69 73 65 6c 79 2c 20 74 68 65 20 22 73 61  ecisely, the "sa
f010: 6d 65 20 73 63 68 65 6d 61 22 20 6d 65 61 6e 73  me schema" means
f020: 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 75 6d 6e   the same column
f030: 73 2c 20 74 79 70 65 73 2c 20 0a 2a 2a 20 63 6f  s, types, .** co
f040: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
f050: 73 2e 20 46 6f 72 20 74 61 62 6c 65 73 20 74 68  s. For tables th
f060: 61 74 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 61  at do not have a
f070: 6e 20 65 78 74 65 72 6e 61 6c 20 50 52 49 4d 41  n external PRIMA
f080: 52 59 0a 2a 2a 20 4b 45 59 2c 20 69 74 20 61 6c  RY.** KEY, it al
f090: 73 6f 20 6d 65 61 6e 73 20 74 68 65 20 73 61 6d  so means the sam
f0a0: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 64 65  e PRIMARY KEY de
f0b0: 63 6c 61 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  claration..*/.st
f0c0: 61 74 69 63 20 76 6f 69 64 20 72 62 75 43 72 65  atic void rbuCre
f0d0: 61 74 65 49 6d 70 6f 73 74 65 72 54 61 62 6c 65  ateImposterTable
f0e0: 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20  (sqlite3rbu *p, 
f0f0: 52 62 75 4f 62 6a 49 74 65 72 20 2a 70 49 74 65  RbuObjIter *pIte
f100: 72 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  r){.  if( p->rc=
f110: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 49  =SQLITE_OK && pI
f120: 74 65 72 2d 3e 65 54 79 70 65 21 3d 52 42 55 5f  ter->eType!=RBU_
f130: 50 4b 5f 56 54 41 42 20 29 7b 0a 20 20 20 20 69  PK_VTAB ){.    i
f140: 6e 74 20 74 6e 75 6d 20 3d 20 70 49 74 65 72 2d  nt tnum = pIter-
f150: 3e 69 54 6e 75 6d 3b 0a 20 20 20 20 63 6f 6e 73  >iTnum;.    cons
f160: 74 20 63 68 61 72 20 2a 7a 43 6f 6d 6d 61 20 3d  t char *zComma =
f170: 20 22 22 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a   "";.    char *z
f180: 53 71 6c 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  Sql = 0;.    int
f190: 20 69 43 6f 6c 3b 0a 20 20 20 20 73 71 6c 69 74   iCol;.    sqlit
f1a0: 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
f1b0: 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
f1c0: 49 4d 50 4f 53 54 45 52 2c 20 70 2d 3e 64 62 4d  IMPOSTER, p->dbM
f1d0: 61 69 6e 2c 20 22 6d 61 69 6e 22 2c 20 30 2c 20  ain, "main", 0, 
f1e0: 31 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 43 6f  1);..    for(iCo
f1f0: 6c 3d 30 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  l=0; p->rc==SQLI
f200: 54 45 5f 4f 4b 20 26 26 20 69 43 6f 6c 3c 70 49  TE_OK && iCol<pI
f210: 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 3b 20 69 43  ter->nTblCol; iC
f220: 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 63 6f 6e  ol++){.      con
f230: 73 74 20 63 68 61 72 20 2a 7a 50 6b 20 3d 20 22  st char *zPk = "
f240: 22 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ";.      const c
f250: 68 61 72 20 2a 7a 43 6f 6c 20 3d 20 70 49 74 65  har *zCol = pIte
f260: 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69 43 6f 6c  r->azTblCol[iCol
f270: 5d 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ];.      const c
f280: 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 30 3b 0a  har *zColl = 0;.
f290: 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73  .      p->rc = s
f2a0: 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c  qlite3_table_col
f2b0: 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28 0a 20 20  umn_metadata(.  
f2c0: 20 20 20 20 20 20 20 20 70 2d 3e 64 62 4d 61 69          p->dbMai
f2d0: 6e 2c 20 22 6d 61 69 6e 22 2c 20 70 49 74 65 72  n, "main", pIter
f2e0: 2d 3e 7a 54 62 6c 2c 20 7a 43 6f 6c 2c 20 30 2c  ->zTbl, zCol, 0,
f2f0: 20 26 7a 43 6f 6c 6c 2c 20 30 2c 20 30 2c 20 30   &zColl, 0, 0, 0
f300: 0a 20 20 20 20 20 20 29 3b 0a 0a 20 20 20 20 20  .      );..     
f310: 20 69 66 28 20 70 49 74 65 72 2d 3e 65 54 79 70   if( pIter->eTyp
f320: 65 3d 3d 52 42 55 5f 50 4b 5f 49 50 4b 20 26 26  e==RBU_PK_IPK &&
f330: 20 70 49 74 65 72 2d 3e 61 62 54 62 6c 50 6b 5b   pIter->abTblPk[
f340: 69 43 6f 6c 5d 20 29 7b 0a 20 20 20 20 20 20 20  iCol] ){.       
f350: 20 2f 2a 20 49 66 20 74 68 65 20 74 61 72 67 65   /* If the targe
f360: 74 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 69  t table column i
f370: 73 20 61 6e 20 22 49 4e 54 45 47 45 52 20 50 52  s an "INTEGER PR
f380: 49 4d 41 52 59 20 4b 45 59 22 2c 20 61 64 64 0a  IMARY KEY", add.
f390: 20 20 20 20 20 20 20 20 2a 2a 20 22 50 52 49 4d          ** "PRIM
f3a0: 41 52 59 20 4b 45 59 22 20 74 6f 20 74 68 65 20  ARY KEY" to the 
f3b0: 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 20 63  imposter table c
f3c0: 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f  olumn declaratio
f3d0: 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 7a 50  n. */.        zP
f3e0: 6b 20 3d 20 22 50 52 49 4d 41 52 59 20 4b 45 59  k = "PRIMARY KEY
f3f0: 20 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   ";.      }.    
f400: 20 20 7a 53 71 6c 20 3d 20 72 62 75 4d 50 72 69    zSql = rbuMPri
f410: 6e 74 66 28 70 2c 20 22 25 7a 25 73 5c 22 25 77  ntf(p, "%z%s\"%w
f420: 5c 22 20 25 73 20 25 73 43 4f 4c 4c 41 54 45 20  \" %s %sCOLLATE 
f430: 25 73 25 73 22 2c 20 0a 20 20 20 20 20 20 20 20  %s%s", .        
f440: 20 20 7a 53 71 6c 2c 20 7a 43 6f 6d 6d 61 2c 20    zSql, zComma, 
f450: 7a 43 6f 6c 2c 20 70 49 74 65 72 2d 3e 61 7a 54  zCol, pIter->azT
f460: 62 6c 54 79 70 65 5b 69 43 6f 6c 5d 2c 20 7a 50  blType[iCol], zP
f470: 6b 2c 20 7a 43 6f 6c 6c 2c 0a 20 20 20 20 20 20  k, zColl,.      
f480: 20 20 20 20 28 70 49 74 65 72 2d 3e 61 62 4e 6f      (pIter->abNo
f490: 74 4e 75 6c 6c 5b 69 43 6f 6c 5d 20 3f 20 22 20  tNull[iCol] ? " 
f4a0: 4e 4f 54 20 4e 55 4c 4c 22 20 3a 20 22 22 29 0a  NOT NULL" : "").
f4b0: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7a        );.      z
f4c0: 43 6f 6d 6d 61 20 3d 20 22 2c 20 22 3b 0a 20 20  Comma = ", ";.  
f4d0: 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 49 74    }..    if( pIt
f4e0: 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50  er->eType==RBU_P
f4f0: 4b 5f 57 49 54 48 4f 55 54 5f 52 4f 57 49 44 20  K_WITHOUT_ROWID 
f500: 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
f510: 50 6b 20 3d 20 72 62 75 57 69 74 68 6f 75 74 52  Pk = rbuWithoutR
f520: 6f 77 69 64 50 4b 28 70 2c 20 70 49 74 65 72 29  owidPK(p, pIter)
f530: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50 6b 20  ;.      if( zPk 
f540: 29 7b 0a 20 20 20 20 20 20 20 20 7a 53 71 6c 20  ){.        zSql 
f550: 3d 20 72 62 75 4d 50 72 69 6e 74 66 28 70 2c 20  = rbuMPrintf(p, 
f560: 22 25 7a 2c 20 25 7a 22 2c 20 7a 53 71 6c 2c 20  "%z, %z", zSql, 
f570: 7a 50 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  zPk);.      }.  
f580: 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33    }..    sqlite3
f590: 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
f5a0: 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d  LITE_TESTCTRL_IM
f5b0: 50 4f 53 54 45 52 2c 20 70 2d 3e 64 62 4d 61 69  POSTER, p->dbMai
f5c0: 6e 2c 20 22 6d 61 69 6e 22 2c 20 31 2c 20 74 6e  n, "main", 1, tn
f5d0: 75 6d 29 3b 0a 20 20 20 20 72 62 75 4d 50 72 69  um);.    rbuMPri
f5e0: 6e 74 66 45 78 65 63 28 70 2c 20 70 2d 3e 64 62  ntfExec(p, p->db
f5f0: 4d 61 69 6e 2c 20 22 43 52 45 41 54 45 20 54 41  Main, "CREATE TA
f600: 42 4c 45 20 5c 22 72 62 75 5f 69 6d 70 5f 25 77  BLE \"rbu_imp_%w
f610: 5c 22 28 25 7a 29 25 73 22 2c 20 0a 20 20 20 20  \"(%z)%s", .    
f620: 20 20 20 20 70 49 74 65 72 2d 3e 7a 54 62 6c 2c      pIter->zTbl,
f630: 20 7a 53 71 6c 2c 20 0a 20 20 20 20 20 20 20 20   zSql, .        
f640: 28 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52  (pIter->eType==R
f650: 42 55 5f 50 4b 5f 57 49 54 48 4f 55 54 5f 52 4f  BU_PK_WITHOUT_RO
f660: 57 49 44 20 3f 20 22 20 57 49 54 48 4f 55 54 20  WID ? " WITHOUT 
f670: 52 4f 57 49 44 22 20 3a 20 22 22 29 0a 20 20 20  ROWID" : "").   
f680: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   );.    sqlite3_
f690: 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
f6a0: 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50  ITE_TESTCTRL_IMP
f6b0: 4f 53 54 45 52 2c 20 70 2d 3e 64 62 4d 61 69 6e  OSTER, p->dbMain
f6c0: 2c 20 22 6d 61 69 6e 22 2c 20 30 2c 20 30 29 3b  , "main", 0, 0);
f6d0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72  .  }.}../*.** Pr
f6e0: 65 70 61 72 65 20 61 20 73 74 61 74 65 6d 65 6e  epare a statemen
f6f0: 74 20 75 73 65 64 20 74 6f 20 69 6e 73 65 72 74  t used to insert
f700: 20 72 6f 77 73 20 69 6e 74 6f 20 74 68 65 20 22   rows into the "
f710: 72 62 75 5f 74 6d 70 5f 78 78 78 22 20 74 61 62  rbu_tmp_xxx" tab
f720: 6c 65 2e 0a 2a 2a 20 53 70 65 63 69 66 69 63 61  le..** Specifica
f730: 6c 6c 79 20 61 20 73 74 61 74 65 6d 65 6e 74 20  lly a statement 
f740: 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a  of the form:.**.
f750: 2a 2a 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  **     INSERT IN
f760: 54 4f 20 72 62 75 5f 74 6d 70 5f 78 78 78 20 56  TO rbu_tmp_xxx V
f770: 41 4c 55 45 53 28 3f 2c 20 3f 2c 20 3f 20 2e 2e  ALUES(?, ?, ? ..
f780: 2e 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 75  .);.**.** The nu
f790: 6d 62 65 72 20 6f 66 20 62 6f 75 6e 64 20 76 61  mber of bound va
f7a0: 72 69 61 62 6c 65 73 20 69 73 20 65 71 75 61 6c  riables is equal
f7b0: 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
f7c0: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 0a 2a 2a 20  f columns in.** 
f7d0: 74 68 65 20 74 61 72 67 65 74 20 74 61 62 6c 65  the target table
f7e0: 2c 20 70 6c 75 73 20 6f 6e 65 20 28 66 6f 72 20  , plus one (for 
f7f0: 74 68 65 20 72 62 75 5f 63 6f 6e 74 72 6f 6c 20  the rbu_control 
f800: 63 6f 6c 75 6d 6e 29 2c 20 70 6c 75 73 20 6f 6e  column), plus on
f810: 65 20 6d 6f 72 65 20 0a 2a 2a 20 28 66 6f 72 20  e more .** (for 
f820: 74 68 65 20 72 62 75 5f 72 6f 77 69 64 20 63 6f  the rbu_rowid co
f830: 6c 75 6d 6e 29 20 69 66 20 74 68 65 20 74 61 72  lumn) if the tar
f840: 67 65 74 20 74 61 62 6c 65 20 69 73 20 61 6e 20  get table is an 
f850: 69 6d 70 6c 69 63 69 74 20 49 50 4b 20 6f 72 20  implicit IPK or 
f860: 0a 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c  .** virtual tabl
f870: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
f880: 64 20 72 62 75 4f 62 6a 49 74 65 72 50 72 65 70  d rbuObjIterPrep
f890: 61 72 65 54 6d 70 49 6e 73 65 72 74 28 0a 20 20  areTmpInsert(.  
f8a0: 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 0a  sqlite3rbu *p, .
f8b0: 20 20 52 62 75 4f 62 6a 49 74 65 72 20 2a 70 49    RbuObjIter *pI
f8c0: 74 65 72 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  ter,.  const cha
f8d0: 72 20 2a 7a 43 6f 6c 6c 69 73 74 2c 0a 20 20 63  r *zCollist,.  c
f8e0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 62 75 52  onst char *zRbuR
f8f0: 6f 77 69 64 0a 29 7b 0a 20 20 69 6e 74 20 62 52  owid.){.  int bR
f900: 62 75 52 6f 77 69 64 20 3d 20 28 70 49 74 65 72  buRowid = (pIter
f910: 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f  ->eType==RBU_PK_
f920: 45 58 54 45 52 4e 41 4c 20 7c 7c 20 70 49 74 65  EXTERNAL || pIte
f930: 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b  r->eType==RBU_PK
f940: 5f 4e 4f 4e 45 29 3b 0a 20 20 63 68 61 72 20 2a  _NONE);.  char *
f950: 7a 42 69 6e 64 20 3d 20 72 62 75 4f 62 6a 49 74  zBind = rbuObjIt
f960: 65 72 47 65 74 42 69 6e 64 6c 69 73 74 28 70 2c  erGetBindlist(p,
f970: 20 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 20   pIter->nTblCol 
f980: 2b 20 31 20 2b 20 62 52 62 75 52 6f 77 69 64 29  + 1 + bRbuRowid)
f990: 3b 0a 20 20 69 66 28 20 7a 42 69 6e 64 20 29 7b  ;.  if( zBind ){
f9a0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
f9b0: 65 72 2d 3e 70 54 6d 70 49 6e 73 65 72 74 3d 3d  er->pTmpInsert==
f9c0: 30 20 29 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  0 );.    p->rc =
f9d0: 20 70 72 65 70 61 72 65 46 72 65 65 41 6e 64 43   prepareFreeAndC
f9e0: 6f 6c 6c 65 63 74 45 72 72 6f 72 28 0a 20 20 20  ollectError(.   
f9f0: 20 20 20 20 20 70 2d 3e 64 62 52 62 75 2c 20 26       p->dbRbu, &
fa00: 70 49 74 65 72 2d 3e 70 54 6d 70 49 6e 73 65 72  pIter->pTmpInser
fa10: 74 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 20  t, &p->zErrmsg, 
fa20: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
fa30: 0a 20 20 20 20 20 20 20 20 20 20 22 49 4e 53 45  .          "INSE
fa40: 52 54 20 49 4e 54 4f 20 25 73 2e 27 72 62 75 5f  RT INTO %s.'rbu_
fa50: 74 6d 70 5f 25 71 27 28 72 62 75 5f 63 6f 6e 74  tmp_%q'(rbu_cont
fa60: 72 6f 6c 2c 25 73 25 73 29 20 56 41 4c 55 45 53  rol,%s%s) VALUES
fa70: 28 25 7a 29 22 2c 20 0a 20 20 20 20 20 20 20 20  (%z)", .        
fa80: 20 20 70 2d 3e 7a 53 74 61 74 65 44 62 2c 20 70    p->zStateDb, p
fa90: 49 74 65 72 2d 3e 7a 44 61 74 61 54 62 6c 2c 20  Iter->zDataTbl, 
faa0: 7a 43 6f 6c 6c 69 73 74 2c 20 7a 52 62 75 52 6f  zCollist, zRbuRo
fab0: 77 69 64 2c 20 7a 42 69 6e 64 0a 20 20 20 20 29  wid, zBind.    )
fac0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63  );.  }.}..static
fad0: 20 76 6f 69 64 20 72 62 75 54 6d 70 49 6e 73 65   void rbuTmpInse
fae0: 72 74 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  rtFunc(.  sqlite
faf0: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
fb00: 20 0a 20 20 69 6e 74 20 6e 56 61 6c 2c 0a 20 20   .  int nVal,.  
fb10: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
fb20: 61 70 56 61 6c 0a 29 7b 0a 20 20 73 71 6c 69 74  apVal.){.  sqlit
fb30: 65 33 72 62 75 20 2a 70 20 3d 20 73 71 6c 69 74  e3rbu *p = sqlit
fb40: 65 33 5f 75 73 65 72 5f 64 61 74 61 28 70 43 74  e3_user_data(pCt
fb50: 78 29 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  x);.  int rc = S
fb60: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
fb70: 69 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  i;..  assert( sq
fb80: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28  lite3_value_int(
fb90: 61 70 56 61 6c 5b 30 5d 29 21 3d 30 0a 20 20 20  apVal[0])!=0.   
fba0: 20 20 20 7c 7c 20 70 2d 3e 6f 62 6a 69 74 65 72     || p->objiter
fbb0: 2e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 45  .eType==RBU_PK_E
fbc0: 58 54 45 52 4e 41 4c 20 0a 20 20 20 20 20 20 7c  XTERNAL .      |
fbd0: 7c 20 70 2d 3e 6f 62 6a 69 74 65 72 2e 65 54 79  | p->objiter.eTy
fbe0: 70 65 3d 3d 52 42 55 5f 50 4b 5f 4e 4f 4e 45 20  pe==RBU_PK_NONE 
fbf0: 0a 20 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  .  );.  if( sqli
fc00: 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 70  te3_value_int(ap
fc10: 56 61 6c 5b 30 5d 29 21 3d 30 20 29 7b 0a 20 20  Val[0])!=0 ){.  
fc20: 20 20 70 2d 3e 6e 50 68 61 73 65 4f 6e 65 53 74    p->nPhaseOneSt
fc30: 65 70 20 2b 3d 20 70 2d 3e 6f 62 6a 69 74 65 72  ep += p->objiter
fc40: 2e 6e 49 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20  .nIndex;.  }..  
fc50: 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  for(i=0; rc==SQL
fc60: 49 54 45 5f 4f 4b 20 26 26 20 69 3c 6e 56 61 6c  ITE_OK && i<nVal
fc70: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 63 20 3d  ; i++){.    rc =
fc80: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 76 61   sqlite3_bind_va
fc90: 6c 75 65 28 70 2d 3e 6f 62 6a 69 74 65 72 2e 70  lue(p->objiter.p
fca0: 54 6d 70 49 6e 73 65 72 74 2c 20 69 2b 31 2c 20  TmpInsert, i+1, 
fcb0: 61 70 56 61 6c 5b 69 5d 29 3b 0a 20 20 7d 0a 20  apVal[i]);.  }. 
fcc0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
fcd0: 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
fce0: 33 5f 73 74 65 70 28 70 2d 3e 6f 62 6a 69 74 65  3_step(p->objite
fcf0: 72 2e 70 54 6d 70 49 6e 73 65 72 74 29 3b 0a 20  r.pTmpInsert);. 
fd00: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
fd10: 72 65 73 65 74 28 70 2d 3e 6f 62 6a 69 74 65 72  reset(p->objiter
fd20: 2e 70 54 6d 70 49 6e 73 65 72 74 29 3b 0a 20 20  .pTmpInsert);.  
fd30: 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  }..  if( rc!=SQL
fd40: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
fd50: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
fd60: 6f 72 5f 63 6f 64 65 28 70 43 74 78 2c 20 72 63  or_code(pCtx, rc
fd70: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
fd80: 45 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  Ensure that the 
fd90: 53 51 4c 69 74 65 20 73 74 61 74 65 6d 65 6e 74  SQLite statement
fda0: 20 68 61 6e 64 6c 65 73 20 72 65 71 75 69 72 65   handles require
fdb0: 64 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20  d to update the 
fdc0: 0a 2a 2a 20 74 61 72 67 65 74 20 64 61 74 61 62  .** target datab
fdd0: 61 73 65 20 6f 62 6a 65 63 74 20 63 75 72 72 65  ase object curre
fde0: 6e 74 6c 79 20 69 6e 64 69 63 61 74 65 64 20 62  ntly indicated b
fdf0: 79 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70  y the iterator p
fe00: 61 73 73 65 64 20 0a 2a 2a 20 61 73 20 74 68 65  assed .** as the
fe10: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
fe20: 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2e 0a   are available..
fe30: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62  */.static int rb
fe40: 75 4f 62 6a 49 74 65 72 50 72 65 70 61 72 65 41  uObjIterPrepareA
fe50: 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33 72 62 75  ll(.  sqlite3rbu
fe60: 20 2a 70 2c 20 0a 20 20 52 62 75 4f 62 6a 49 74   *p, .  RbuObjIt
fe70: 65 72 20 2a 70 49 74 65 72 2c 0a 20 20 69 6e 74  er *pIter,.  int
fe80: 20 6e 4f 66 66 73 65 74 20 20 20 20 20 20 20 20   nOffset        
fe90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fea0: 41 64 64 20 22 4c 49 4d 49 54 20 2d 31 20 4f 46  Add "LIMIT -1 OF
feb0: 46 53 45 54 20 24 6e 4f 66 66 73 65 74 22 20 74  FSET $nOffset" t
fec0: 6f 20 53 45 4c 45 43 54 20 2a 2f 0a 29 7b 0a 20  o SELECT */.){. 
fed0: 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
fee0: 62 43 6c 65 61 6e 75 70 3d 3d 30 20 29 3b 0a 20  bCleanup==0 );. 
fef0: 20 69 66 28 20 70 49 74 65 72 2d 3e 70 53 65 6c   if( pIter->pSel
ff00: 65 63 74 3d 3d 30 20 26 26 20 72 62 75 4f 62 6a  ect==0 && rbuObj
ff10: 49 74 65 72 43 61 63 68 65 54 61 62 6c 65 49 6e  IterCacheTableIn
ff20: 66 6f 28 70 2c 20 70 49 74 65 72 29 3d 3d 53 51  fo(p, pIter)==SQ
ff30: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 63  LITE_OK ){.    c
ff40: 6f 6e 73 74 20 69 6e 74 20 74 6e 75 6d 20 3d 20  onst int tnum = 
ff50: 70 49 74 65 72 2d 3e 69 54 6e 75 6d 3b 0a 20 20  pIter->iTnum;.  
ff60: 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 69 73 74    char *zCollist
ff70: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
ff80: 2f 2a 20 4c 69 73 74 20 6f 66 20 69 6e 64 65 78  /* List of index
ff90: 65 64 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  ed columns */.  
ffa0: 20 20 63 68 61 72 20 2a 2a 70 7a 20 3d 20 26 70    char **pz = &p
ffb0: 2d 3e 7a 45 72 72 6d 73 67 3b 0a 20 20 20 20 63  ->zErrmsg;.    c
ffc0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 78 20  onst char *zIdx 
ffd0: 3d 20 70 49 74 65 72 2d 3e 7a 49 64 78 3b 0a 20  = pIter->zIdx;. 
ffe0: 20 20 20 63 68 61 72 20 2a 7a 4c 69 6d 69 74 20     char *zLimit 
fff0: 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 6e 4f  = 0;..    if( nO
10000 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20 7a  ffset ){.      z
10010 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 5f  Limit = sqlite3_
10020 6d 70 72 69 6e 74 66 28 22 20 4c 49 4d 49 54 20  mprintf(" LIMIT 
10030 2d 31 20 4f 46 46 53 45 54 20 25 64 22 2c 20 6e  -1 OFFSET %d", n
10040 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 69  Offset);.      i
10050 66 28 20 21 7a 4c 69 6d 69 74 20 29 20 70 2d 3e  f( !zLimit ) p->
10060 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
10070 4d 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  M;.    }..    if
10080 28 20 7a 49 64 78 20 29 7b 0a 20 20 20 20 20 20  ( zIdx ){.      
10090 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 62 6c  const char *zTbl
100a0 20 3d 20 70 49 74 65 72 2d 3e 7a 54 62 6c 3b 0a   = pIter->zTbl;.
100b0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 49 6d 70        char *zImp
100c0 6f 73 74 65 72 43 6f 6c 73 20 3d 20 30 3b 20 20  osterCols = 0;  
100d0 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 66 6f 72    /* Columns for
100e0 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 20   imposter table 
100f0 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  */.      char *z
10100 49 6d 70 6f 73 74 65 72 50 4b 20 3d 20 30 3b 20  ImposterPK = 0; 
10110 20 20 20 20 20 2f 2a 20 50 72 69 6d 61 72 79 20       /* Primary 
10120 6b 65 79 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  key declaration 
10130 66 6f 72 20 69 6d 70 6f 73 74 65 72 20 2a 2f 0a  for imposter */.
10140 20 20 20 20 20 20 63 68 61 72 20 2a 7a 57 68 65        char *zWhe
10150 72 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  re = 0;         
10160 20 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73    /* WHERE claus
10170 65 20 6f 6e 20 50 4b 20 63 6f 6c 75 6d 6e 73 20  e on PK columns 
10180 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  */.      char *z
10190 42 69 6e 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  Bind = 0;.      
101a0 69 6e 74 20 6e 42 69 6e 64 20 3d 20 30 3b 0a 0a  int nBind = 0;..
101b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
101c0 74 65 72 2d 3e 65 54 79 70 65 21 3d 52 42 55 5f  ter->eType!=RBU_
101d0 50 4b 5f 56 54 41 42 20 29 3b 0a 20 20 20 20 20  PK_VTAB );.     
101e0 20 7a 43 6f 6c 6c 69 73 74 20 3d 20 72 62 75 4f   zCollist = rbuO
101f0 62 6a 49 74 65 72 47 65 74 49 6e 64 65 78 43 6f  bjIterGetIndexCo
10200 6c 73 28 0a 20 20 20 20 20 20 20 20 20 20 70 2c  ls(.          p,
10210 20 70 49 74 65 72 2c 20 26 7a 49 6d 70 6f 73 74   pIter, &zImpost
10220 65 72 43 6f 6c 73 2c 20 26 7a 49 6d 70 6f 73 74  erCols, &zImpost
10230 65 72 50 4b 2c 20 26 7a 57 68 65 72 65 2c 20 26  erPK, &zWhere, &
10240 6e 42 69 6e 64 0a 20 20 20 20 20 20 29 3b 0a 20  nBind.      );. 
10250 20 20 20 20 20 7a 42 69 6e 64 20 3d 20 72 62 75       zBind = rbu
10260 4f 62 6a 49 74 65 72 47 65 74 42 69 6e 64 6c 69  ObjIterGetBindli
10270 73 74 28 70 2c 20 6e 42 69 6e 64 29 3b 0a 0a 20  st(p, nBind);.. 
10280 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74       /* Create t
10290 68 65 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c  he imposter tabl
102a0 65 20 75 73 65 64 20 74 6f 20 77 72 69 74 65 20  e used to write 
102b0 74 6f 20 74 68 69 73 20 69 6e 64 65 78 2e 20 2a  to this index. *
102c0 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  /.      sqlite3_
102d0 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
102e0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50  ITE_TESTCTRL_IMP
102f0 4f 53 54 45 52 2c 20 70 2d 3e 64 62 4d 61 69 6e  OSTER, p->dbMain
10300 2c 20 22 6d 61 69 6e 22 2c 20 30 2c 20 31 29 3b  , "main", 0, 1);
10310 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74  .      sqlite3_t
10320 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
10330 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f  TE_TESTCTRL_IMPO
10340 53 54 45 52 2c 20 70 2d 3e 64 62 4d 61 69 6e 2c  STER, p->dbMain,
10350 20 22 6d 61 69 6e 22 2c 20 31 2c 74 6e 75 6d 29   "main", 1,tnum)
10360 3b 0a 20 20 20 20 20 20 72 62 75 4d 50 72 69 6e  ;.      rbuMPrin
10370 74 66 45 78 65 63 28 70 2c 20 70 2d 3e 64 62 4d  tfExec(p, p->dbM
10380 61 69 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 22  ain,.          "
10390 43 52 45 41 54 45 20 54 41 42 4c 45 20 5c 22 72  CREATE TABLE \"r
103a0 62 75 5f 69 6d 70 5f 25 77 5c 22 28 20 25 73 2c  bu_imp_%w\"( %s,
103b0 20 50 52 49 4d 41 52 59 20 4b 45 59 28 20 25 73   PRIMARY KEY( %s
103c0 20 29 20 29 20 57 49 54 48 4f 55 54 20 52 4f 57   ) ) WITHOUT ROW
103d0 49 44 22 2c 0a 20 20 20 20 20 20 20 20 20 20 7a  ID",.          z
103e0 54 62 6c 2c 20 7a 49 6d 70 6f 73 74 65 72 43 6f  Tbl, zImposterCo
103f0 6c 73 2c 20 7a 49 6d 70 6f 73 74 65 72 50 4b 0a  ls, zImposterPK.
10400 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 73        );.      s
10410 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
10420 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
10430 54 52 4c 5f 49 4d 50 4f 53 54 45 52 2c 20 70 2d  TRL_IMPOSTER, p-
10440 3e 64 62 4d 61 69 6e 2c 20 22 6d 61 69 6e 22 2c  >dbMain, "main",
10450 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20 20 20 2f   0, 0);..      /
10460 2a 20 43 72 65 61 74 65 20 74 68 65 20 73 74 61  * Create the sta
10470 74 65 6d 65 6e 74 20 74 6f 20 69 6e 73 65 72 74  tement to insert
10480 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20 2a   index entries *
10490 2f 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 6e  /.      pIter->n
104a0 43 6f 6c 20 3d 20 6e 42 69 6e 64 3b 0a 20 20 20  Col = nBind;.   
104b0 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
104c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
104d0 20 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61     p->rc = prepa
104e0 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74  reFreeAndCollect
104f0 45 72 72 6f 72 28 0a 20 20 20 20 20 20 20 20 20  Error(.         
10500 20 20 20 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 70     p->dbMain, &p
10510 49 74 65 72 2d 3e 70 49 6e 73 65 72 74 2c 20 26  Iter->pInsert, &
10520 70 2d 3e 7a 45 72 72 6d 73 67 2c 0a 20 20 20 20  p->zErrmsg,.    
10530 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70        sqlite3_mp
10540 72 69 6e 74 66 28 22 49 4e 53 45 52 54 20 49 4e  rintf("INSERT IN
10550 54 4f 20 5c 22 72 62 75 5f 69 6d 70 5f 25 77 5c  TO \"rbu_imp_%w\
10560 22 20 56 41 4c 55 45 53 28 25 73 29 22 2c 20 7a  " VALUES(%s)", z
10570 54 62 6c 2c 20 7a 42 69 6e 64 29 0a 20 20 20 20  Tbl, zBind).    
10580 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a      );.      }..
10590 20 20 20 20 20 20 2f 2a 20 41 6e 64 20 74 6f 20        /* And to 
105a0 64 65 6c 65 74 65 20 69 6e 64 65 78 20 65 6e 74  delete index ent
105b0 72 69 65 73 20 2a 2f 0a 20 20 20 20 20 20 69 66  ries */.      if
105c0 28 20 72 62 75 49 73 56 61 63 75 75 6d 28 70 29  ( rbuIsVacuum(p)
105d0 3d 3d 30 20 26 26 20 70 2d 3e 72 63 3d 3d 53 51  ==0 && p->rc==SQ
105e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
105f0 20 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61     p->rc = prepa
10600 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74  reFreeAndCollect
10610 45 72 72 6f 72 28 0a 20 20 20 20 20 20 20 20 20  Error(.         
10620 20 20 20 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 70     p->dbMain, &p
10630 49 74 65 72 2d 3e 70 44 65 6c 65 74 65 2c 20 26  Iter->pDelete, &
10640 70 2d 3e 7a 45 72 72 6d 73 67 2c 0a 20 20 20 20  p->zErrmsg,.    
10650 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70        sqlite3_mp
10660 72 69 6e 74 66 28 22 44 45 4c 45 54 45 20 46 52  rintf("DELETE FR
10670 4f 4d 20 5c 22 72 62 75 5f 69 6d 70 5f 25 77 5c  OM \"rbu_imp_%w\
10680 22 20 57 48 45 52 45 20 25 73 22 2c 20 7a 54 62  " WHERE %s", zTb
10690 6c 2c 20 7a 57 68 65 72 65 29 0a 20 20 20 20 20  l, zWhere).     
106a0 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20     );.      }.. 
106b0 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74       /* Create t
106c0 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
106d0 65 6e 74 20 74 6f 20 72 65 61 64 20 6b 65 79 73  ent to read keys
106e0 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72   in sorted order
106f0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 2d   */.      if( p-
10700 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
10710 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
10720 7a 53 71 6c 3b 0a 20 20 20 20 20 20 20 20 69 66  zSql;.        if
10730 28 20 72 62 75 49 73 56 61 63 75 75 6d 28 70 29  ( rbuIsVacuum(p)
10740 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 53   ){.          zS
10750 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ql = sqlite3_mpr
10760 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20  intf(.          
10770 20 20 20 20 22 53 45 4c 45 43 54 20 25 73 2c 20      "SELECT %s, 
10780 30 20 41 53 20 72 62 75 5f 63 6f 6e 74 72 6f 6c  0 AS rbu_control
10790 20 46 52 4f 4d 20 27 25 71 27 20 4f 52 44 45 52   FROM '%q' ORDER
107a0 20 42 59 20 25 73 25 73 22 2c 0a 20 20 20 20 20   BY %s%s",.     
107b0 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 6c 69 73           zCollis
107c0 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  t, .            
107d0 20 20 70 49 74 65 72 2d 3e 7a 44 61 74 61 54 62    pIter->zDataTb
107e0 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l,.             
107f0 20 7a 43 6f 6c 6c 69 73 74 2c 20 7a 4c 69 6d 69   zCollist, zLimi
10800 74 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20  t.          );. 
10810 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20         }else..  
10820 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d        if( pIter-
10830 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 45  >eType==RBU_PK_E
10840 58 54 45 52 4e 41 4c 20 7c 7c 20 70 49 74 65 72  XTERNAL || pIter
10850 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f  ->eType==RBU_PK_
10860 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20  NONE ){.        
10870 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
10880 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20  _mprintf(.      
10890 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
108a0 25 73 2c 20 72 62 75 5f 63 6f 6e 74 72 6f 6c 20  %s, rbu_control 
108b0 46 52 4f 4d 20 25 73 2e 27 72 62 75 5f 74 6d 70  FROM %s.'rbu_tmp
108c0 5f 25 71 27 20 4f 52 44 45 52 20 42 59 20 25 73  _%q' ORDER BY %s
108d0 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %s",.           
108e0 20 20 20 7a 43 6f 6c 6c 69 73 74 2c 20 70 2d 3e     zCollist, p->
108f0 7a 53 74 61 74 65 44 62 2c 20 70 49 74 65 72 2d  zStateDb, pIter-
10900 3e 7a 44 61 74 61 54 62 6c 2c 0a 20 20 20 20 20  >zDataTbl,.     
10910 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 6c 69 73           zCollis
10920 74 2c 20 7a 4c 69 6d 69 74 0a 20 20 20 20 20 20  t, zLimit.      
10930 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7d      );.        }
10940 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
10950 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
10960 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  printf(.        
10970 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 25 73        "SELECT %s
10980 2c 20 72 62 75 5f 63 6f 6e 74 72 6f 6c 20 46 52  , rbu_control FR
10990 4f 4d 20 25 73 2e 27 72 62 75 5f 74 6d 70 5f 25  OM %s.'rbu_tmp_%
109a0 71 27 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  q' ".           
109b0 20 20 20 22 55 4e 49 4f 4e 20 41 4c 4c 20 22 0a     "UNION ALL ".
109c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 53                "S
109d0 45 4c 45 43 54 20 25 73 2c 20 72 62 75 5f 63 6f  ELECT %s, rbu_co
109e0 6e 74 72 6f 6c 20 46 52 4f 4d 20 27 25 71 27 20  ntrol FROM '%q' 
109f0 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
10a00 22 57 48 45 52 45 20 74 79 70 65 6f 66 28 72 62  "WHERE typeof(rb
10a10 75 5f 63 6f 6e 74 72 6f 6c 29 3d 27 69 6e 74 65  u_control)='inte
10a20 67 65 72 27 20 41 4e 44 20 72 62 75 5f 63 6f 6e  ger' AND rbu_con
10a30 74 72 6f 6c 21 3d 31 20 22 0a 20 20 20 20 20 20  trol!=1 ".      
10a40 20 20 20 20 20 20 20 20 22 4f 52 44 45 52 20 42          "ORDER B
10a50 59 20 25 73 25 73 22 2c 0a 20 20 20 20 20 20 20  Y %s%s",.       
10a60 20 20 20 20 20 20 20 7a 43 6f 6c 6c 69 73 74 2c         zCollist,
10a70 20 70 2d 3e 7a 53 74 61 74 65 44 62 2c 20 70 49   p->zStateDb, pI
10a80 74 65 72 2d 3e 7a 44 61 74 61 54 62 6c 2c 20 0a  ter->zDataTbl, .
10a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 43                zC
10aa0 6f 6c 6c 69 73 74 2c 20 70 49 74 65 72 2d 3e 7a  ollist, pIter->z
10ab0 44 61 74 61 54 62 6c 2c 20 0a 20 20 20 20 20 20  DataTbl, .      
10ac0 20 20 20 20 20 20 20 20 7a 43 6f 6c 6c 69 73 74          zCollist
10ad0 2c 20 7a 4c 69 6d 69 74 0a 20 20 20 20 20 20 20  , zLimit.       
10ae0 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a     );.        }.
10af0 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
10b00 70 72 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f  prepareFreeAndCo
10b10 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62  llectError(p->db
10b20 52 62 75 2c 20 26 70 49 74 65 72 2d 3e 70 53 65  Rbu, &pIter->pSe
10b30 6c 65 63 74 2c 20 70 7a 2c 20 7a 53 71 6c 29 3b  lect, pz, zSql);
10b40 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
10b50 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 49 6d  sqlite3_free(zIm
10b60 70 6f 73 74 65 72 43 6f 6c 73 29 3b 0a 20 20 20  posterCols);.   
10b70 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
10b80 7a 49 6d 70 6f 73 74 65 72 50 4b 29 3b 0a 20 20  zImposterPK);.  
10b90 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
10ba0 28 7a 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20  (zWhere);.      
10bb0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 69  sqlite3_free(zBi
10bc0 6e 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  nd);.    }else{.
10bd0 20 20 20 20 20 20 69 6e 74 20 62 52 62 75 52 6f        int bRbuRo
10be0 77 69 64 20 3d 20 28 70 49 74 65 72 2d 3e 65 54  wid = (pIter->eT
10bf0 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 56 54 41 42  ype==RBU_PK_VTAB
10c00 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
10c10 20 20 20 20 20 20 7c 7c 28 70 49 74 65 72 2d 3e        ||(pIter->
10c20 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 4e 4f  eType==RBU_PK_NO
10c30 4e 45 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  NE).            
10c40 20 20 20 20 20 20 20 20 7c 7c 28 70 49 74 65 72          ||(pIter
10c50 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f  ->eType==RBU_PK_
10c60 45 58 54 45 52 4e 41 4c 20 26 26 20 72 62 75 49  EXTERNAL && rbuI
10c70 73 56 61 63 75 75 6d 28 70 29 29 3b 0a 20 20 20  sVacuum(p));.   
10c80 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
10c90 54 62 6c 20 3d 20 70 49 74 65 72 2d 3e 7a 54 62  Tbl = pIter->zTb
10ca0 6c 3b 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c  l;       /* Tabl
10cb0 65 20 74 68 69 73 20 73 74 65 70 20 61 70 70 6c  e this step appl
10cc0 69 65 73 20 74 6f 20 2a 2f 0a 20 20 20 20 20 20  ies to */.      
10cd0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 57 72 69  const char *zWri
10ce0 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
10cf0 20 20 20 20 20 20 2f 2a 20 49 6d 70 6f 73 74 65        /* Imposte
10d00 72 20 74 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a  r table name */.
10d10 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 42 69  .      char *zBi
10d20 6e 64 69 6e 67 73 20 3d 20 72 62 75 4f 62 6a 49  ndings = rbuObjI
10d30 74 65 72 47 65 74 42 69 6e 64 6c 69 73 74 28 70  terGetBindlist(p
10d40 2c 20 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c  , pIter->nTblCol
10d50 20 2b 20 62 52 62 75 52 6f 77 69 64 29 3b 0a 20   + bRbuRowid);. 
10d60 20 20 20 20 20 63 68 61 72 20 2a 7a 57 68 65 72       char *zWher
10d70 65 20 3d 20 72 62 75 4f 62 6a 49 74 65 72 47 65  e = rbuObjIterGe
10d80 74 57 68 65 72 65 28 70 2c 20 70 49 74 65 72 29  tWhere(p, pIter)
10d90 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4f  ;.      char *zO
10da0 6c 64 6c 69 73 74 20 3d 20 72 62 75 4f 62 6a 49  ldlist = rbuObjI
10db0 74 65 72 47 65 74 4f 6c 64 6c 69 73 74 28 70 2c  terGetOldlist(p,
10dc0 20 70 49 74 65 72 2c 20 22 6f 6c 64 22 29 3b 0a   pIter, "old");.
10dd0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 65 77        char *zNew
10de0 6c 69 73 74 20 3d 20 72 62 75 4f 62 6a 49 74 65  list = rbuObjIte
10df0 72 47 65 74 4f 6c 64 6c 69 73 74 28 70 2c 20 70  rGetOldlist(p, p
10e00 49 74 65 72 2c 20 22 6e 65 77 22 29 3b 0a 0a 20  Iter, "new");.. 
10e10 20 20 20 20 20 7a 43 6f 6c 6c 69 73 74 20 3d 20       zCollist = 
10e20 72 62 75 4f 62 6a 49 74 65 72 47 65 74 43 6f 6c  rbuObjIterGetCol
10e30 6c 69 73 74 28 70 2c 20 70 49 74 65 72 29 3b 0a  list(p, pIter);.
10e40 20 20 20 20 20 20 70 49 74 65 72 2d 3e 6e 43 6f        pIter->nCo
10e50 6c 20 3d 20 70 49 74 65 72 2d 3e 6e 54 62 6c 43  l = pIter->nTblC
10e60 6f 6c 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 72  ol;..      /* Cr
10e70 65 61 74 65 20 74 68 65 20 69 6d 70 6f 73 74 65  eate the imposte
10e80 72 20 74 61 62 6c 65 20 6f 72 20 74 61 62 6c 65  r table or table
10e90 73 20 28 69 66 20 72 65 71 75 69 72 65 64 29 2e  s (if required).
10ea0 20 2a 2f 0a 20 20 20 20 20 20 72 62 75 43 72 65   */.      rbuCre
10eb0 61 74 65 49 6d 70 6f 73 74 65 72 54 61 62 6c 65  ateImposterTable
10ec0 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  (p, pIter);.    
10ed0 20 20 72 62 75 43 72 65 61 74 65 49 6d 70 6f 73    rbuCreateImpos
10ee0 74 65 72 54 61 62 6c 65 32 28 70 2c 20 70 49 74  terTable2(p, pIt
10ef0 65 72 29 3b 0a 20 20 20 20 20 20 7a 57 72 69 74  er);.      zWrit
10f00 65 20 3d 20 28 70 49 74 65 72 2d 3e 65 54 79 70  e = (pIter->eTyp
10f10 65 3d 3d 52 42 55 5f 50 4b 5f 56 54 41 42 20 3f  e==RBU_PK_VTAB ?
10f20 20 22 22 20 3a 20 22 72 62 75 5f 69 6d 70 5f 22   "" : "rbu_imp_"
10f30 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 72 65  );..      /* Cre
10f40 61 74 65 20 74 68 65 20 49 4e 53 45 52 54 20 73  ate the INSERT s
10f50 74 61 74 65 6d 65 6e 74 20 74 6f 20 77 72 69 74  tatement to writ
10f60 65 20 74 6f 20 74 68 65 20 74 61 72 67 65 74 20  e to the target 
10f70 50 4b 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 20  PK b-tree */.   
10f80 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
10f90 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
10fa0 20 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61     p->rc = prepa
10fb0 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74  reFreeAndCollect
10fc0 45 72 72 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c  Error(p->dbMain,
10fd0 20 26 70 49 74 65 72 2d 3e 70 49 6e 73 65 72 74   &pIter->pInsert
10fe0 2c 20 70 7a 2c 0a 20 20 20 20 20 20 20 20 20 20  , pz,.          
10ff0 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74    sqlite3_mprint
11000 66 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  f(.             
11010 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 5c 22   "INSERT INTO \"
11020 25 73 25 77 5c 22 28 25 73 25 73 29 20 56 41 4c  %s%w\"(%s%s) VAL
11030 55 45 53 28 25 73 29 22 2c 20 0a 20 20 20 20 20  UES(%s)", .     
11040 20 20 20 20 20 20 20 20 20 7a 57 72 69 74 65 2c           zWrite,
11050 20 7a 54 62 6c 2c 20 7a 43 6f 6c 6c 69 73 74 2c   zTbl, zCollist,
11060 20 28 62 52 62 75 52 6f 77 69 64 20 3f 20 22 2c   (bRbuRowid ? ",
11070 20 5f 72 6f 77 69 64 5f 22 20 3a 20 22 22 29 2c   _rowid_" : ""),
11080 20 7a 42 69 6e 64 69 6e 67 73 0a 20 20 20 20 20   zBindings.     
11090 20 20 20 20 20 20 20 29 0a 20 20 20 20 20 20 20         ).       
110a0 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20   );.      }..   
110b0 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65     /* Create the
110c0 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e   DELETE statemen
110d0 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68  t to write to th
110e0 65 20 74 61 72 67 65 74 20 50 4b 20 62 2d 74 72  e target PK b-tr
110f0 65 65 2e 0a 20 20 20 20 20 20 2a 2a 20 42 65 63  ee..      ** Bec
11100 61 75 73 65 20 69 74 20 6f 6e 6c 79 20 70 65 72  ause it only per
11110 66 6f 72 6d 73 20 49 4e 53 45 52 54 20 6f 70 65  forms INSERT ope
11120 72 61 74 69 6f 6e 73 2c 20 74 68 69 73 20 69 73  rations, this is
11130 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20 66 6f   not required fo
11140 72 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20 72 62  r.      ** an rb
11150 75 20 76 61 63 75 75 6d 20 68 61 6e 64 6c 65 2e  u vacuum handle.
11160 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 72    */.      if( r
11170 62 75 49 73 56 61 63 75 75 6d 28 70 29 3d 3d 30  buIsVacuum(p)==0
11180 20 26 26 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54   && p->rc==SQLIT
11190 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
111a0 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65 46  p->rc = prepareF
111b0 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72  reeAndCollectErr
111c0 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 70  or(p->dbMain, &p
111d0 49 74 65 72 2d 3e 70 44 65 6c 65 74 65 2c 20 70  Iter->pDelete, p
111e0 7a 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  z,.            s
111f0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a  qlite3_mprintf(.
11200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 44                "D
11210 45 4c 45 54 45 20 46 52 4f 4d 20 5c 22 25 73 25  ELETE FROM \"%s%
11220 77 5c 22 20 57 48 45 52 45 20 25 73 22 2c 20 7a  w\" WHERE %s", z
11230 57 72 69 74 65 2c 20 7a 54 62 6c 2c 20 7a 57 68  Write, zTbl, zWh
11240 65 72 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  ere.            
11250 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  ).        );.   
11260 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
11270 72 62 75 49 73 56 61 63 75 75 6d 28 70 29 3d 3d  rbuIsVacuum(p)==
11280 30 20 26 26 20 70 49 74 65 72 2d 3e 61 62 49 6e  0 && pIter->abIn
11290 64 65 78 65 64 20 29 7b 0a 20 20 20 20 20 20 20  dexed ){.       
112a0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 62   const char *zRb
112b0 75 52 6f 77 69 64 20 3d 20 22 22 3b 0a 20 20 20  uRowid = "";.   
112c0 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e       if( pIter->
112d0 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 45 58  eType==RBU_PK_EX
112e0 54 45 52 4e 41 4c 20 7c 7c 20 70 49 74 65 72 2d  TERNAL || pIter-
112f0 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 4e  >eType==RBU_PK_N
11300 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ONE ){.         
11310 20 7a 52 62 75 52 6f 77 69 64 20 3d 20 22 2c 20   zRbuRowid = ", 
11320 72 62 75 5f 72 6f 77 69 64 22 3b 0a 20 20 20 20  rbu_rowid";.    
11330 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
11340 2a 20 43 72 65 61 74 65 20 74 68 65 20 72 62 75  * Create the rbu
11350 5f 74 6d 70 5f 78 78 78 20 74 61 62 6c 65 20 61  _tmp_xxx table a
11360 6e 64 20 74 68 65 20 74 72 69 67 67 65 72 73 20  nd the triggers 
11370 74 6f 20 70 6f 70 75 6c 61 74 65 20 69 74 2e 20  to populate it. 
11380 2a 2f 0a 20 20 20 20 20 20 20 20 72 62 75 4d 50  */.        rbuMP
11390 72 69 6e 74 66 45 78 65 63 28 70 2c 20 70 2d 3e  rintfExec(p, p->
113a0 64 62 52 62 75 2c 0a 20 20 20 20 20 20 20 20 20  dbRbu,.         
113b0 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45     "CREATE TABLE
113c0 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20 25   IF NOT EXISTS %
113d0 73 2e 27 72 62 75 5f 74 6d 70 5f 25 71 27 20 41  s.'rbu_tmp_%q' A
113e0 53 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  S ".            
113f0 22 53 45 4c 45 43 54 20 2a 25 73 20 46 52 4f 4d  "SELECT *%s FROM
11400 20 27 25 71 27 20 57 48 45 52 45 20 30 3b 22 0a   '%q' WHERE 0;".
11410 20 20 20 20 20 20 20 20 20 20 20 20 2c 20 70 2d              , p-
11420 3e 7a 53 74 61 74 65 44 62 2c 20 70 49 74 65 72  >zStateDb, pIter
11430 2d 3e 7a 44 61 74 61 54 62 6c 0a 20 20 20 20 20  ->zDataTbl.     
11440 20 20 20 20 20 20 20 2c 20 28 70 49 74 65 72 2d         , (pIter-
11450 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 45  >eType==RBU_PK_E
11460 58 54 45 52 4e 41 4c 20 3f 20 22 2c 20 30 20 41  XTERNAL ? ", 0 A
11470 53 20 72 62 75 5f 72 6f 77 69 64 22 20 3a 20 22  S rbu_rowid" : "
11480 22 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 2c  ").            ,
11490 20 70 49 74 65 72 2d 3e 7a 44 61 74 61 54 62 6c   pIter->zDataTbl
114a0 0a 20 20 20 20 20 20 20 20 29 3b 0a 0a 20 20 20  .        );..   
114b0 20 20 20 20 20 72 62 75 4d 50 72 69 6e 74 66 45       rbuMPrintfE
114c0 78 65 63 28 70 2c 20 70 2d 3e 64 62 4d 61 69 6e  xec(p, p->dbMain
114d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 43  ,.            "C
114e0 52 45 41 54 45 20 54 45 4d 50 20 54 52 49 47 47  REATE TEMP TRIGG
114f0 45 52 20 72 62 75 5f 64 65 6c 65 74 65 5f 74 72  ER rbu_delete_tr
11500 20 42 45 46 4f 52 45 20 44 45 4c 45 54 45 20 4f   BEFORE DELETE O
11510 4e 20 5c 22 25 73 25 77 5c 22 20 22 0a 20 20 20  N \"%s%w\" ".   
11520 20 20 20 20 20 20 20 20 20 22 42 45 47 49 4e 20           "BEGIN 
11530 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 20  ".            " 
11540 20 53 45 4c 45 43 54 20 72 62 75 5f 74 6d 70 5f   SELECT rbu_tmp_
11550 69 6e 73 65 72 74 28 33 2c 20 25 73 29 3b 22 0a  insert(3, %s);".
11560 20 20 20 20 20 20 20 20 20 20 20 20 22 45 4e 44              "END
11570 3b 22 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20  ;"..            
11580 22 43 52 45 41 54 45 20 54 45 4d 50 20 54 52 49  "CREATE TEMP TRI
11590 47 47 45 52 20 72 62 75 5f 75 70 64 61 74 65 31  GGER rbu_update1
115a0 5f 74 72 20 42 45 46 4f 52 45 20 55 50 44 41 54  _tr BEFORE UPDAT
115b0 45 20 4f 4e 20 5c 22 25 73 25 77 5c 22 20 22 0a  E ON \"%s%w\" ".
115c0 20 20 20 20 20 20 20 20 20 20 20 20 22 42 45 47              "BEG
115d0 49 4e 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  IN ".           
115e0 20 22 20 20 53 45 4c 45 43 54 20 72 62 75 5f 74   "  SELECT rbu_t
115f0 6d 70 5f 69 6e 73 65 72 74 28 33 2c 20 25 73 29  mp_insert(3, %s)
11600 3b 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  ;".            "
11610 45 4e 44 3b 22 0a 0a 20 20 20 20 20 20 20 20 20  END;"..         
11620 20 20 20 22 43 52 45 41 54 45 20 54 45 4d 50 20     "CREATE TEMP 
11630 54 52 49 47 47 45 52 20 72 62 75 5f 75 70 64 61  TRIGGER rbu_upda
11640 74 65 32 5f 74 72 20 41 46 54 45 52 20 55 50 44  te2_tr AFTER UPD
11650 41 54 45 20 4f 4e 20 5c 22 25 73 25 77 5c 22 20  ATE ON \"%s%w\" 
11660 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 42  ".            "B
11670 45 47 49 4e 20 22 0a 20 20 20 20 20 20 20 20 20  EGIN ".         
11680 20 20 20 22 20 20 53 45 4c 45 43 54 20 72 62 75     "  SELECT rbu
11690 5f 74 6d 70 5f 69 6e 73 65 72 74 28 34 2c 20 25  _tmp_insert(4, %
116a0 73 29 3b 22 0a 20 20 20 20 20 20 20 20 20 20 20  s);".           
116b0 20 22 45 4e 44 3b 22 2c 0a 20 20 20 20 20 20 20   "END;",.       
116c0 20 20 20 20 20 7a 57 72 69 74 65 2c 20 7a 54 62       zWrite, zTb
116d0 6c 2c 20 7a 4f 6c 64 6c 69 73 74 2c 0a 20 20 20  l, zOldlist,.   
116e0 20 20 20 20 20 20 20 20 20 7a 57 72 69 74 65 2c           zWrite,
116f0 20 7a 54 62 6c 2c 20 7a 4f 6c 64 6c 69 73 74 2c   zTbl, zOldlist,
11700 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 57 72  .            zWr
11710 69 74 65 2c 20 7a 54 62 6c 2c 20 7a 4e 65 77 6c  ite, zTbl, zNewl
11720 69 73 74 0a 20 20 20 20 20 20 20 20 29 3b 0a 0a  ist.        );..
11730 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65          if( pIte
11740 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b  r->eType==RBU_PK
11750 5f 45 58 54 45 52 4e 41 4c 20 7c 7c 20 70 49 74  _EXTERNAL || pIt
11760 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50  er->eType==RBU_P
11770 4b 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  K_NONE ){.      
11780 20 20 20 20 72 62 75 4d 50 72 69 6e 74 66 45 78      rbuMPrintfEx
11790 65 63 28 70 2c 20 70 2d 3e 64 62 4d 61 69 6e 2c  ec(p, p->dbMain,
117a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
117b0 43 52 45 41 54 45 20 54 45 4d 50 20 54 52 49 47  CREATE TEMP TRIG
117c0 47 45 52 20 72 62 75 5f 69 6e 73 65 72 74 5f 74  GER rbu_insert_t
117d0 72 20 41 46 54 45 52 20 49 4e 53 45 52 54 20 4f  r AFTER INSERT O
117e0 4e 20 5c 22 25 73 25 77 5c 22 20 22 0a 20 20 20  N \"%s%w\" ".   
117f0 20 20 20 20 20 20 20 20 20 20 20 22 42 45 47 49             "BEGI
11800 4e 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  N ".            
11810 20 20 22 20 20 53 45 4c 45 43 54 20 72 62 75 5f    "  SELECT rbu_
11820 74 6d 70 5f 69 6e 73 65 72 74 28 30 2c 20 25 73  tmp_insert(0, %s
11830 29 3b 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  );".            
11840 20 20 22 45 4e 44 3b 22 2c 0a 20 20 20 20 20 20    "END;",.      
11850 20 20 20 20 20 20 20 20 7a 57 72 69 74 65 2c 20          zWrite, 
11860 7a 54 62 6c 2c 20 7a 4e 65 77 6c 69 73 74 0a 20  zTbl, zNewlist. 
11870 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
11880 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 72      }..        r
11890 62 75 4f 62 6a 49 74 65 72 50 72 65 70 61 72 65  buObjIterPrepare
118a0 54 6d 70 49 6e 73 65 72 74 28 70 2c 20 70 49 74  TmpInsert(p, pIt
118b0 65 72 2c 20 7a 43 6f 6c 6c 69 73 74 2c 20 7a 52  er, zCollist, zR
118c0 62 75 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  buRowid);.      
118d0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 72 65 61  }..      /* Crea
118e0 74 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  te the SELECT st
118f0 61 74 65 6d 65 6e 74 20 74 6f 20 72 65 61 64 20  atement to read 
11900 6b 65 79 73 20 66 72 6f 6d 20 64 61 74 61 5f 78  keys from data_x
11910 78 78 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  xx */.      if( 
11920 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
11930 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73   ){.        cons
11940 74 20 63 68 61 72 20 2a 7a 52 62 75 52 6f 77 69  t char *zRbuRowi
11950 64 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 20 20  d = "";.        
11960 69 66 28 20 62 52 62 75 52 6f 77 69 64 20 29 7b  if( bRbuRowid ){
11970 0a 20 20 20 20 20 20 20 20 20 20 7a 52 62 75 52  .          zRbuR
11980 6f 77 69 64 20 3d 20 72 62 75 49 73 56 61 63 75  owid = rbuIsVacu
11990 75 6d 28 70 29 20 3f 20 22 2c 5f 72 6f 77 69 64  um(p) ? ",_rowid
119a0 5f 20 22 20 3a 20 22 2c 72 62 75 5f 72 6f 77 69  _ " : ",rbu_rowi
119b0 64 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  d";.        }.  
119c0 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 72        p->rc = pr
119d0 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c  epareFreeAndColl
119e0 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 52 62  ectError(p->dbRb
119f0 75 2c 20 26 70 49 74 65 72 2d 3e 70 53 65 6c 65  u, &pIter->pSele
11a00 63 74 2c 20 70 7a 2c 0a 20 20 20 20 20 20 20 20  ct, pz,.        
11a10 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69      sqlite3_mpri
11a20 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 20  ntf(.           
11a30 20 20 20 22 53 45 4c 45 43 54 20 25 73 2c 25 73     "SELECT %s,%s
11a40 20 72 62 75 5f 63 6f 6e 74 72 6f 6c 25 73 20 46   rbu_control%s F
11a50 52 4f 4d 20 27 25 71 27 25 73 22 2c 20 0a 20 20  ROM '%q'%s", .  
11a60 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c              zCol
11a70 6c 69 73 74 2c 20 0a 20 20 20 20 20 20 20 20 20  list, .         
11a80 20 20 20 20 20 28 72 62 75 49 73 56 61 63 75 75       (rbuIsVacuu
11a90 6d 28 70 29 20 3f 20 22 30 20 41 53 20 22 20 3a  m(p) ? "0 AS " :
11aa0 20 22 22 29 2c 0a 20 20 20 20 20 20 20 20 20 20   ""),.          
11ab0 20 20 20 20 7a 52 62 75 52 6f 77 69 64 2c 0a 20      zRbuRowid,. 
11ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74               pIt
11ad0 65 72 2d 3e 7a 44 61 74 61 54 62 6c 2c 20 7a 4c  er->zDataTbl, zL
11ae0 69 6d 69 74 0a 20 20 20 20 20 20 20 20 20 20 20  imit.           
11af0 20 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20   ).        );.  
11b00 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 73 71 6c      }..      sql
11b10 69 74 65 33 5f 66 72 65 65 28 7a 57 68 65 72 65  ite3_free(zWhere
11b20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
11b30 5f 66 72 65 65 28 7a 4f 6c 64 6c 69 73 74 29 3b  _free(zOldlist);
11b40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
11b50 72 65 65 28 7a 4e 65 77 6c 69 73 74 29 3b 0a 20  ree(zNewlist);. 
11b60 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
11b70 65 28 7a 42 69 6e 64 69 6e 67 73 29 3b 0a 20 20  e(zBindings);.  
11b80 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
11b90 66 72 65 65 28 7a 43 6f 6c 6c 69 73 74 29 3b 0a  free(zCollist);.
11ba0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
11bb0 28 7a 4c 69 6d 69 74 29 3b 0a 20 20 7d 0a 20 20  (zLimit);.  }.  
11bc0 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 3b  .  return p->rc;
11bd0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 6f 75  .}../*.** Set ou
11be0 74 70 75 74 20 76 61 72 69 61 62 6c 65 20 2a 70  tput variable *p
11bf0 70 53 74 6d 74 20 74 6f 20 70 6f 69 6e 74 20 74  pStmt to point t
11c00 6f 20 61 6e 20 55 50 44 41 54 45 20 73 74 61 74  o an UPDATE stat
11c10 65 6d 65 6e 74 20 74 68 61 74 20 6d 61 79 0a 2a  ement that may.*
11c20 2a 20 62 65 20 75 73 65 64 20 74 6f 20 75 70 64  * be used to upd
11c30 61 74 65 20 74 68 65 20 69 6d 70 6f 73 74 65 72  ate the imposter
11c40 20 74 61 62 6c 65 20 66 6f 72 20 74 68 65 20 6d   table for the m
11c50 61 69 6e 20 74 61 62 6c 65 20 62 2d 74 72 65 65  ain table b-tree
11c60 20 6f 66 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65   of the.** table
11c70 20 6f 62 6a 65 63 74 20 74 68 61 74 20 70 49 74   object that pIt
11c80 65 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  er currently poi
11c90 6e 74 73 20 74 6f 2c 20 61 73 73 75 6d 69 6e 67  nts to, assuming
11ca0 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 72 62   that the .** rb
11cb0 75 5f 63 6f 6e 74 72 6f 6c 20 63 6f 6c 75 6d 6e  u_control column
11cc0 20 6f 66 20 74 68 65 20 64 61 74 61 5f 78 79 7a   of the data_xyz
11cd0 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20   table contains 
11ce0 7a 4d 61 73 6b 2e 0a 2a 2a 20 0a 2a 2a 20 49 66  zMask..** .** If
11cf0 20 74 68 65 20 7a 4d 61 73 6b 20 73 74 72 69 6e   the zMask strin
11d00 67 20 64 6f 65 73 20 6e 6f 74 20 73 70 65 63 69  g does not speci
11d10 66 79 20 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 74  fy any columns t
11d20 6f 20 75 70 64 61 74 65 2c 20 74 68 65 6e 20 74  o update, then t
11d30 68 69 73 0a 2a 2a 20 69 73 20 6e 6f 74 20 61 6e  his.** is not an
11d40 20 65 72 72 6f 72 2e 20 4f 75 74 70 75 74 20 76   error. Output v
11d50 61 72 69 61 62 6c 65 20 2a 70 70 53 74 6d 74 20  ariable *ppStmt 
11d60 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69  is set to NULL i
11d70 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a  n this case..*/.
11d80 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 47 65  static int rbuGe
11d90 74 55 70 64 61 74 65 53 74 6d 74 28 0a 20 20 73  tUpdateStmt(.  s
11da0 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 20 20  qlite3rbu *p,   
11db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11dc0 2a 20 52 42 55 20 68 61 6e 64 6c 65 20 2a 2f 0a  * RBU handle */.
11dd0 20 20 52 62 75 4f 62 6a 49 74 65 72 20 2a 70 49    RbuObjIter *pI
11de0 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ter,            
11df0 20 20 2f 2a 20 4f 62 6a 65 63 74 20 69 74 65 72    /* Object iter
11e00 61 74 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ator */.  const 
11e10 63 68 61 72 20 2a 7a 4d 61 73 6b 2c 20 20 20 20  char *zMask,    
11e20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72 62 75            /* rbu
11e30 5f 63 6f 6e 74 72 6f 6c 20 76 61 6c 75 65 20 28  _control value (
11e40 27 78 2e 78 2e 27 29 20 2a 2f 0a 20 20 73 71 6c  'x.x.') */.  sql
11e50 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74  ite3_stmt **ppSt
11e60 6d 74 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  mt           /* 
11e70 4f 55 54 3a 20 55 50 44 41 54 45 20 73 74 61 74  OUT: UPDATE stat
11e80 65 6d 65 6e 74 20 68 61 6e 64 6c 65 20 2a 2f 0a  ement handle */.
11e90 29 7b 0a 20 20 52 62 75 55 70 64 61 74 65 53 74  ){.  RbuUpdateSt
11ea0 6d 74 20 2a 2a 70 70 3b 0a 20 20 52 62 75 55 70  mt **pp;.  RbuUp
11eb0 64 61 74 65 53 74 6d 74 20 2a 70 55 70 20 3d 20  dateStmt *pUp = 
11ec0 30 3b 0a 20 20 69 6e 74 20 6e 55 70 20 3d 20 30  0;.  int nUp = 0
11ed0 3b 0a 0a 20 20 2f 2a 20 49 6e 20 63 61 73 65 20  ;..  /* In case 
11ee0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
11ef0 2a 2f 0a 20 20 2a 70 70 53 74 6d 74 20 3d 20 30  */.  *ppStmt = 0
11f00 3b 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20 66  ;..  /* Search f
11f10 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20 73  or an existing s
11f20 74 61 74 65 6d 65 6e 74 2e 20 49 66 20 6f 6e 65  tatement. If one
11f30 20 69 73 20 66 6f 75 6e 64 2c 20 73 68 69 66 74   is found, shift
11f40 20 69 74 20 74 6f 20 74 68 65 20 66 72 6f 6e 74   it to the front
11f50 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 4c 52 55  .  ** of the LRU
11f60 20 71 75 65 75 65 20 61 6e 64 20 72 65 74 75 72   queue and retur
11f70 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 4f  n immediately. O
11f80 74 68 65 72 77 69 73 65 2c 20 6c 65 61 76 65 20  therwise, leave 
11f90 6e 55 70 20 70 6f 69 6e 74 69 6e 67 0a 20 20 2a  nUp pointing.  *
11fa0 2a 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  * to the number 
11fb0 6f 66 20 73 74 61 74 65 6d 65 6e 74 73 20 63 75  of statements cu
11fc0 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 63  rrently in the c
11fd0 61 63 68 65 20 61 6e 64 20 70 55 70 20 74 6f 20  ache and pUp to 
11fe0 74 68 65 0a 20 20 2a 2a 20 6c 61 73 74 20 6f 62  the.  ** last ob
11ff0 6a 65 63 74 20 69 6e 20 74 68 65 20 6c 69 73 74  ject in the list
12000 2e 20 20 2a 2f 0a 20 20 66 6f 72 28 70 70 3d 26  .  */.  for(pp=&
12010 70 49 74 65 72 2d 3e 70 52 62 75 55 70 64 61 74  pIter->pRbuUpdat
12020 65 3b 20 2a 70 70 3b 20 70 70 3d 26 28 28 2a 70  e; *pp; pp=&((*p
12030 70 29 2d 3e 70 4e 65 78 74 29 29 7b 0a 20 20 20  p)->pNext)){.   
12040 20 70 55 70 20 3d 20 2a 70 70 3b 0a 20 20 20 20   pUp = *pp;.    
12050 69 66 28 20 73 74 72 63 6d 70 28 70 55 70 2d 3e  if( strcmp(pUp->
12060 7a 4d 61 73 6b 2c 20 7a 4d 61 73 6b 29 3d 3d 30  zMask, zMask)==0
12070 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 20 3d 20   ){.      *pp = 
12080 70 55 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  pUp->pNext;.    
12090 20 20 70 55 70 2d 3e 70 4e 65 78 74 20 3d 20 70    pUp->pNext = p
120a0 49 74 65 72 2d 3e 70 52 62 75 55 70 64 61 74 65  Iter->pRbuUpdate
120b0 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70  ;.      pIter->p
120c0 52 62 75 55 70 64 61 74 65 20 3d 20 70 55 70 3b  RbuUpdate = pUp;
120d0 0a 20 20 20 20 20 20 2a 70 70 53 74 6d 74 20 3d  .      *ppStmt =
120e0 20 70 55 70 2d 3e 70 55 70 64 61 74 65 3b 20 0a   pUp->pUpdate; .
120f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
12100 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
12110 20 20 6e 55 70 2b 2b 3b 0a 20 20 7d 0a 20 20 61    nUp++;.  }.  a
12120 73 73 65 72 74 28 20 70 55 70 3d 3d 30 20 7c 7c  ssert( pUp==0 ||
12130 20 70 55 70 2d 3e 70 4e 65 78 74 3d 3d 30 20 29   pUp->pNext==0 )
12140 3b 0a 0a 20 20 69 66 28 20 6e 55 70 3e 3d 53 51  ;..  if( nUp>=SQ
12150 4c 49 54 45 5f 52 42 55 5f 55 50 44 41 54 45 5f  LITE_RBU_UPDATE_
12160 43 41 43 48 45 53 49 5a 45 20 29 7b 0a 20 20 20  CACHESIZE ){.   
12170 20 66 6f 72 28 70 70 3d 26 70 49 74 65 72 2d 3e   for(pp=&pIter->
12180 70 52 62 75 55 70 64 61 74 65 3b 20 2a 70 70 21  pRbuUpdate; *pp!
12190 3d 70 55 70 3b 20 70 70 3d 26 28 28 2a 70 70 29  =pUp; pp=&((*pp)
121a0 2d 3e 70 4e 65 78 74 29 29 3b 0a 20 20 20 20 2a  ->pNext));.    *
121b0 70 70 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  pp = 0;.    sqli
121c0 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 55 70  te3_finalize(pUp
121d0 2d 3e 70 55 70 64 61 74 65 29 3b 0a 20 20 20 20  ->pUpdate);.    
121e0 70 55 70 2d 3e 70 55 70 64 61 74 65 20 3d 20 30  pUp->pUpdate = 0
121f0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
12200 55 70 20 3d 20 28 52 62 75 55 70 64 61 74 65 53  Up = (RbuUpdateS
12210 74 6d 74 2a 29 72 62 75 4d 61 6c 6c 6f 63 28 70  tmt*)rbuMalloc(p
12220 2c 20 73 69 7a 65 6f 66 28 52 62 75 55 70 64 61  , sizeof(RbuUpda
12230 74 65 53 74 6d 74 29 2b 70 49 74 65 72 2d 3e 6e  teStmt)+pIter->n
12240 54 62 6c 43 6f 6c 2b 31 29 3b 0a 20 20 7d 0a 0a  TblCol+1);.  }..
12250 20 20 69 66 28 20 70 55 70 20 29 7b 0a 20 20 20    if( pUp ){.   
12260 20 63 68 61 72 20 2a 7a 57 68 65 72 65 20 3d 20   char *zWhere = 
12270 72 62 75 4f 62 6a 49 74 65 72 47 65 74 57 68 65  rbuObjIterGetWhe
12280 72 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  re(p, pIter);.  
12290 20 20 63 68 61 72 20 2a 7a 53 65 74 20 3d 20 72    char *zSet = r
122a0 62 75 4f 62 6a 49 74 65 72 47 65 74 53 65 74 6c  buObjIterGetSetl
122b0 69 73 74 28 70 2c 20 70 49 74 65 72 2c 20 7a 4d  ist(p, pIter, zM
122c0 61 73 6b 29 3b 0a 20 20 20 20 63 68 61 72 20 2a  ask);.    char *
122d0 7a 55 70 64 61 74 65 20 3d 20 30 3b 0a 0a 20 20  zUpdate = 0;..  
122e0 20 20 70 55 70 2d 3e 7a 4d 61 73 6b 20 3d 20 28    pUp->zMask = (
122f0 63 68 61 72 2a 29 26 70 55 70 5b 31 5d 3b 0a 20  char*)&pUp[1];. 
12300 20 20 20 6d 65 6d 63 70 79 28 70 55 70 2d 3e 7a     memcpy(pUp->z
12310 4d 61 73 6b 2c 20 7a 4d 61 73 6b 2c 20 70 49 74  Mask, zMask, pIt
12320 65 72 2d 3e 6e 54 62 6c 43 6f 6c 29 3b 0a 20 20  er->nTblCol);.  
12330 20 20 70 55 70 2d 3e 70 4e 65 78 74 20 3d 20 70    pUp->pNext = p
12340 49 74 65 72 2d 3e 70 52 62 75 55 70 64 61 74 65  Iter->pRbuUpdate
12350 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70 52 62  ;.    pIter->pRb
12360 75 55 70 64 61 74 65 20 3d 20 70 55 70 3b 0a 0a  uUpdate = pUp;..
12370 20 20 20 20 69 66 28 20 7a 53 65 74 20 29 7b 0a      if( zSet ){.
12380 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
12390 20 2a 7a 50 72 65 66 69 78 20 3d 20 22 22 3b 0a   *zPrefix = "";.
123a0 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72  .      if( pIter
123b0 2d 3e 65 54 79 70 65 21 3d 52 42 55 5f 50 4b 5f  ->eType!=RBU_PK_
123c0 56 54 41 42 20 29 20 7a 50 72 65 66 69 78 20 3d  VTAB ) zPrefix =
123d0 20 22 72 62 75 5f 69 6d 70 5f 22 3b 0a 20 20 20   "rbu_imp_";.   
123e0 20 20 20 7a 55 70 64 61 74 65 20 3d 20 73 71 6c     zUpdate = sql
123f0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 55 50  ite3_mprintf("UP
12400 44 41 54 45 20 5c 22 25 73 25 77 5c 22 20 53 45  DATE \"%s%w\" SE
12410 54 20 25 73 20 57 48 45 52 45 20 25 73 22 2c 20  T %s WHERE %s", 
12420 0a 20 20 20 20 20 20 20 20 20 20 7a 50 72 65 66  .          zPref
12430 69 78 2c 20 70 49 74 65 72 2d 3e 7a 54 62 6c 2c  ix, pIter->zTbl,
12440 20 7a 53 65 74 2c 20 7a 57 68 65 72 65 0a 20 20   zSet, zWhere.  
12450 20 20 20 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e      );.      p->
12460 72 63 20 3d 20 70 72 65 70 61 72 65 46 72 65 65  rc = prepareFree
12470 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28  AndCollectError(
12480 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 64 62  .          p->db
12490 4d 61 69 6e 2c 20 26 70 55 70 2d 3e 70 55 70 64  Main, &pUp->pUpd
124a0 61 74 65 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67  ate, &p->zErrmsg
124b0 2c 20 7a 55 70 64 61 74 65 0a 20 20 20 20 20 20  , zUpdate.      
124c0 29 3b 0a 20 20 20 20 20 20 2a 70 70 53 74 6d 74  );.      *ppStmt
124d0 20 3d 20 70 55 70 2d 3e 70 55 70 64 61 74 65 3b   = pUp->pUpdate;
124e0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
124f0 65 33 5f 66 72 65 65 28 7a 57 68 65 72 65 29 3b  e3_free(zWhere);
12500 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
12510 65 28 7a 53 65 74 29 3b 0a 20 20 7d 0a 0a 20 20  e(zSet);.  }..  
12520 72 65 74 75 72 6e 20 70 2d 3e 72 63 3b 0a 7d 0a  return p->rc;.}.
12530 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 20  .static sqlite3 
12540 2a 72 62 75 4f 70 65 6e 44 62 68 61 6e 64 6c 65  *rbuOpenDbhandle
12550 28 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20 2a  (.  sqlite3rbu *
12560 70 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  p, .  const char
12570 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 69 6e 74 20   *zName, .  int 
12580 62 55 73 65 56 66 73 0a 29 7b 0a 20 20 73 71 6c  bUseVfs.){.  sql
12590 69 74 65 33 20 2a 64 62 20 3d 20 30 3b 0a 20 20  ite3 *db = 0;.  
125a0 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
125b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 6f 6e 73  E_OK ){.    cons
125c0 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 53 51  t int flags = SQ
125d0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
125e0 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ITE|SQLITE_OPEN_
125f0 43 52 45 41 54 45 7c 53 51 4c 49 54 45 5f 4f 50  CREATE|SQLITE_OP
12600 45 4e 5f 55 52 49 3b 0a 20 20 20 20 70 2d 3e 72  EN_URI;.    p->r
12610 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  c = sqlite3_open
12620 5f 76 32 28 7a 4e 61 6d 65 2c 20 26 64 62 2c 20  _v2(zName, &db, 
12630 66 6c 61 67 73 2c 20 62 55 73 65 56 66 73 20 3f  flags, bUseVfs ?
12640 20 70 2d 3e 7a 56 66 73 4e 61 6d 65 20 3a 20 30   p->zVfsName : 0
12650 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  );.    if( p->rc
12660 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 7a 45 72   ){.      p->zEr
12670 72 6d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  rmsg = sqlite3_m
12680 70 72 69 6e 74 66 28 22 25 73 22 2c 20 73 71 6c  printf("%s", sql
12690 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29  ite3_errmsg(db))
126a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
126b0 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20 20 20 20  close(db);.     
126c0 20 64 62 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20   db = 0;.    }. 
126d0 20 7d 0a 20 20 72 65 74 75 72 6e 20 64 62 3b 0a   }.  return db;.
126e0 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e  }../*.** Free an
126f0 20 52 62 75 53 74 61 74 65 20 6f 62 6a 65 63 74   RbuState object
12700 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 72 62   allocated by rb
12710 75 4c 6f 61 64 53 74 61 74 65 28 29 2e 0a 2a 2f  uLoadState()..*/
12720 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75  .static void rbu
12730 46 72 65 65 53 74 61 74 65 28 52 62 75 53 74 61  FreeState(RbuSta
12740 74 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20  te *p){.  if( p 
12750 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
12760 72 65 65 28 70 2d 3e 7a 54 62 6c 29 3b 0a 20 20  ree(p->zTbl);.  
12770 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
12780 2d 3e 7a 49 64 78 29 3b 0a 20 20 20 20 73 71 6c  ->zIdx);.    sql
12790 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
127a0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  }.}../*.** Alloc
127b0 61 74 65 20 61 6e 20 52 62 75 53 74 61 74 65 20  ate an RbuState 
127c0 6f 62 6a 65 63 74 20 61 6e 64 20 6c 6f 61 64 20  object and load 
127d0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
127e0 74 68 65 20 72 62 75 5f 73 74 61 74 65 20 0a 2a  the rbu_state .*
127f0 2a 20 74 61 62 6c 65 20 69 6e 74 6f 20 69 74 2e  * table into it.
12800 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
12810 72 20 74 6f 20 74 68 65 20 6e 65 77 20 6f 62 6a  r to the new obj
12820 65 63 74 2e 20 49 74 20 69 73 20 74 68 65 20 0a  ect. It is the .
12830 2a 2a 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  ** responsibilit
12840 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20  y of the caller 
12850 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72  to eventually fr
12860 65 65 20 74 68 65 20 6f 62 6a 65 63 74 20 75 73  ee the object us
12870 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66  ing.** sqlite3_f
12880 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ree()..**.** If 
12890 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
128a0 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
128b0 63 6f 64 65 20 61 6e 64 20 6d 65 73 73 61 67 65  code and message
128c0 20 69 6e 20 74 68 65 20 72 62 75 20 68 61 6e 64   in the rbu hand
128d0 6c 65 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e  le.** and return
128e0 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63   NULL..*/.static
128f0 20 52 62 75 53 74 61 74 65 20 2a 72 62 75 4c 6f   RbuState *rbuLo
12900 61 64 53 74 61 74 65 28 73 71 6c 69 74 65 33 72  adState(sqlite3r
12910 62 75 20 2a 70 29 7b 0a 20 20 52 62 75 53 74 61  bu *p){.  RbuSta
12920 74 65 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20  te *pRet = 0;.  
12930 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
12940 74 6d 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  tmt = 0;.  int r
12950 63 3b 0a 20 20 69 6e 74 20 72 63 32 3b 0a 0a 20  c;.  int rc2;.. 
12960 20 70 52 65 74 20 3d 20 28 52 62 75 53 74 61 74   pRet = (RbuStat
12970 65 2a 29 72 62 75 4d 61 6c 6c 6f 63 28 70 2c 20  e*)rbuMalloc(p, 
12980 73 69 7a 65 6f 66 28 52 62 75 53 74 61 74 65 29  sizeof(RbuState)
12990 29 3b 0a 20 20 69 66 28 20 70 52 65 74 3d 3d 30  );.  if( pRet==0
129a0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
129b0 72 63 20 3d 20 70 72 65 70 61 72 65 46 72 65 65  rc = prepareFree
129c0 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28  AndCollectError(
129d0 70 2d 3e 64 62 52 62 75 2c 20 26 70 53 74 6d 74  p->dbRbu, &pStmt
129e0 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 20 0a  , &p->zErrmsg, .
129f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70        sqlite3_mp
12a00 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20 6b 2c  rintf("SELECT k,
12a10 20 76 20 46 52 4f 4d 20 25 73 2e 72 62 75 5f 73   v FROM %s.rbu_s
12a20 74 61 74 65 22 2c 20 70 2d 3e 7a 53 74 61 74 65  tate", p->zState
12a30 44 62 29 0a 20 20 29 3b 0a 20 20 77 68 69 6c 65  Db).  );.  while
12a40 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
12a50 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  && SQLITE_ROW==s
12a60 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
12a70 74 29 20 29 7b 0a 20 20 20 20 73 77 69 74 63 68  t) ){.    switch
12a80 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  ( sqlite3_column
12a90 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30 29 20 29  _int(pStmt, 0) )
12aa0 7b 0a 20 20 20 20 20 20 63 61 73 65 20 52 42 55  {.      case RBU
12ab0 5f 53 54 41 54 45 5f 53 54 41 47 45 3a 0a 20 20  _STATE_STAGE:.  
12ac0 20 20 20 20 20 20 70 52 65 74 2d 3e 65 53 74 61        pRet->eSta
12ad0 67 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ge = sqlite3_col
12ae0 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 31  umn_int(pStmt, 1
12af0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
12b00 52 65 74 2d 3e 65 53 74 61 67 65 21 3d 52 42 55  Ret->eStage!=RBU
12b10 5f 53 54 41 47 45 5f 4f 41 4c 0a 20 20 20 20 20  _STAGE_OAL.     
12b20 20 20 20 20 26 26 20 70 52 65 74 2d 3e 65 53 74      && pRet->eSt
12b30 61 67 65 21 3d 52 42 55 5f 53 54 41 47 45 5f 4d  age!=RBU_STAGE_M
12b40 4f 56 45 0a 20 20 20 20 20 20 20 20 20 26 26 20  OVE.         && 
12b50 70 52 65 74 2d 3e 65 53 74 61 67 65 21 3d 52 42  pRet->eStage!=RB
12b60 55 5f 53 54 41 47 45 5f 43 4b 50 54 0a 20 20 20  U_STAGE_CKPT.   
12b70 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
12b80 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
12b90 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20  _CORRUPT;.      
12ba0 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
12bb0 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20 52  k;..      case R
12bc0 42 55 5f 53 54 41 54 45 5f 54 42 4c 3a 0a 20 20  BU_STATE_TBL:.  
12bd0 20 20 20 20 20 20 70 52 65 74 2d 3e 7a 54 62 6c        pRet->zTbl
12be0 20 3d 20 72 62 75 53 74 72 6e 64 75 70 28 28 63   = rbuStrndup((c
12bf0 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
12c00 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  umn_text(pStmt, 
12c10 31 29 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20  1), &rc);.      
12c20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20    break;..      
12c30 63 61 73 65 20 52 42 55 5f 53 54 41 54 45 5f 49  case RBU_STATE_I
12c40 44 58 3a 0a 20 20 20 20 20 20 20 20 70 52 65 74  DX:.        pRet
12c50 2d 3e 7a 49 64 78 20 3d 20 72 62 75 53 74 72 6e  ->zIdx = rbuStrn
12c60 64 75 70 28 28 63 68 61 72 2a 29 73 71 6c 69 74  dup((char*)sqlit
12c70 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
12c80 53 74 6d 74 2c 20 31 29 2c 20 26 72 63 29 3b 0a  Stmt, 1), &rc);.
12c90 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a          break;..
12ca0 20 20 20 20 20 20 63 61 73 65 20 52 42 55 5f 53        case RBU_S
12cb0 54 41 54 45 5f 52 4f 57 3a 0a 20 20 20 20 20 20  TATE_ROW:.      
12cc0 20 20 70 52 65 74 2d 3e 6e 52 6f 77 20 3d 20 73    pRet->nRow = s
12cd0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
12ce0 74 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20  t(pStmt, 1);.   
12cf0 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
12d00 20 20 20 63 61 73 65 20 52 42 55 5f 53 54 41 54     case RBU_STAT
12d10 45 5f 50 52 4f 47 52 45 53 53 3a 0a 20 20 20 20  E_PROGRESS:.    
12d20 20 20 20 20 70 52 65 74 2d 3e 6e 50 72 6f 67 72      pRet->nProgr
12d30 65 73 73 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  ess = sqlite3_co
12d40 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74  lumn_int64(pStmt
12d50 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 62 72  , 1);.        br
12d60 65 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73 65  eak;..      case
12d70 20 52 42 55 5f 53 54 41 54 45 5f 43 4b 50 54 3a   RBU_STATE_CKPT:
12d80 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e 69  .        pRet->i
12d90 57 61 6c 43 6b 73 75 6d 20 3d 20 73 71 6c 69 74  WalCksum = sqlit
12da0 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28  e3_column_int64(
12db0 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20 20  pStmt, 1);.     
12dc0 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20     break;..     
12dd0 20 63 61 73 65 20 52 42 55 5f 53 54 41 54 45 5f   case RBU_STATE_
12de0 43 4f 4f 4b 49 45 3a 0a 20 20 20 20 20 20 20 20  COOKIE:.        
12df0 70 52 65 74 2d 3e 69 43 6f 6f 6b 69 65 20 3d 20  pRet->iCookie = 
12e00 28 75 33 32 29 73 71 6c 69 74 65 33 5f 63 6f 6c  (u32)sqlite3_col
12e10 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c  umn_int64(pStmt,
12e20 20 31 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65   1);.        bre
12e30 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20  ak;..      case 
12e40 52 42 55 5f 53 54 41 54 45 5f 4f 41 4c 53 5a 3a  RBU_STATE_OALSZ:
12e50 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e 69  .        pRet->i
12e60 4f 61 6c 53 7a 20 3d 20 28 75 33 32 29 73 71 6c  OalSz = (u32)sql
12e70 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36  ite3_column_int6
12e80 34 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20  4(pStmt, 1);.   
12e90 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
12ea0 20 20 20 63 61 73 65 20 52 42 55 5f 53 54 41 54     case RBU_STAT
12eb0 45 5f 50 48 41 53 45 4f 4e 45 53 54 45 50 3a 0a  E_PHASEONESTEP:.
12ec0 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e 6e 50          pRet->nP
12ed0 68 61 73 65 4f 6e 65 53 74 65 70 20 3d 20 73 71  haseOneStep = sq
12ee0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
12ef0 36 34 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20  64(pStmt, 1);.  
12f00 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
12f10 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
12f20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
12f30 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20  _CORRUPT;.      
12f40 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
12f50 20 7d 0a 20 20 72 63 32 20 3d 20 73 71 6c 69 74   }.  rc2 = sqlit
12f60 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
12f70 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  t);.  if( rc==SQ
12f80 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72  LITE_OK ) rc = r
12f90 63 32 3b 0a 0a 20 20 70 2d 3e 72 63 20 3d 20 72  c2;..  p->rc = r
12fa0 63 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74  c;.  return pRet
12fb0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  ;.}.../*.** Open
12fc0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
12fd0 6e 64 6c 65 20 61 6e 64 20 61 74 74 61 63 68 20  ndle and attach 
12fe0 74 68 65 20 52 42 55 20 64 61 74 61 62 61 73 65  the RBU database
12ff0 20 61 73 20 22 72 62 75 22 2e 20 49 66 20 61 6e   as "rbu". If an
13000 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73  .** error occurs
13010 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  , leave an error
13020 20 63 6f 64 65 20 61 6e 64 20 6d 65 73 73 61 67   code and messag
13030 65 20 69 6e 20 74 68 65 20 52 42 55 20 68 61 6e  e in the RBU han
13040 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  dle..*/.static v
13050 6f 69 64 20 72 62 75 4f 70 65 6e 44 61 74 61 62  oid rbuOpenDatab
13060 61 73 65 28 73 71 6c 69 74 65 33 72 62 75 20 2a  ase(sqlite3rbu *
13070 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  p){.  assert( p-
13080 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
13090 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64  ;.  assert( p->d
130a0 62 4d 61 69 6e 3d 3d 30 20 26 26 20 70 2d 3e 64  bMain==0 && p->d
130b0 62 52 62 75 3d 3d 30 20 29 3b 0a 20 20 61 73 73  bRbu==0 );.  ass
130c0 65 72 74 28 20 72 62 75 49 73 56 61 63 75 75 6d  ert( rbuIsVacuum
130d0 28 70 29 20 7c 7c 20 70 2d 3e 7a 54 61 72 67 65  (p) || p->zTarge
130e0 74 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 4f 70  t!=0 );..  /* Op
130f0 65 6e 20 74 68 65 20 52 42 55 20 64 61 74 61 62  en the RBU datab
13100 61 73 65 20 2a 2f 0a 20 20 70 2d 3e 64 62 52 62  ase */.  p->dbRb
13110 75 20 3d 20 72 62 75 4f 70 65 6e 44 62 68 61 6e  u = rbuOpenDbhan
13120 64 6c 65 28 70 2c 20 70 2d 3e 7a 52 62 75 2c 20  dle(p, p->zRbu, 
13130 31 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63  1);..  if( p->rc
13140 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72  ==SQLITE_OK && r
13150 62 75 49 73 56 61 63 75 75 6d 28 70 29 20 29 7b  buIsVacuum(p) ){
13160 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  .    sqlite3_fil
13170 65 5f 63 6f 6e 74 72 6f 6c 28 70 2d 3e 64 62 52  e_control(p->dbR
13180 62 75 2c 20 22 6d 61 69 6e 22 2c 20 53 51 4c 49  bu, "main", SQLI
13190 54 45 5f 46 43 4e 54 4c 5f 52 42 55 43 4e 54 2c  TE_FCNTL_RBUCNT,
131a0 20 28 76 6f 69 64 2a 29 70 29 3b 0a 20 20 7d 0a   (void*)p);.  }.
131b0 0a 20 20 2f 2a 20 49 66 20 75 73 69 6e 67 20 73  .  /* If using s
131c0 65 70 61 72 61 74 65 20 52 42 55 20 61 6e 64 20  eparate RBU and 
131d0 73 74 61 74 65 20 64 61 74 61 62 61 73 65 73 2c  state databases,
131e0 20 61 74 74 61 63 68 20 74 68 65 20 73 74 61 74   attach the stat
131f0 65 20 64 61 74 61 62 61 73 65 20 74 6f 0a 20 20  e database to.  
13200 2a 2a 20 74 68 65 20 52 42 55 20 64 62 20 68 61  ** the RBU db ha
13210 6e 64 6c 65 20 6e 6f 77 2e 20 20 2a 2f 0a 20 20  ndle now.  */.  
13220 69 66 28 20 70 2d 3e 7a 53 74 61 74 65 20 29 7b  if( p->zState ){
13230 0a 20 20 20 20 72 62 75 4d 50 72 69 6e 74 66 45  .    rbuMPrintfE
13240 78 65 63 28 70 2c 20 70 2d 3e 64 62 52 62 75 2c  xec(p, p->dbRbu,
13250 20 22 41 54 54 41 43 48 20 25 51 20 41 53 20 73   "ATTACH %Q AS s
13260 74 61 74 22 2c 20 70 2d 3e 7a 53 74 61 74 65 29  tat", p->zState)
13270 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e  ;.    memcpy(p->
13280 7a 53 74 61 74 65 44 62 2c 20 22 73 74 61 74 22  zStateDb, "stat"
13290 2c 20 34 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  , 4);.  }else{. 
132a0 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e 7a 53 74     memcpy(p->zSt
132b0 61 74 65 44 62 2c 20 22 6d 61 69 6e 22 2c 20 34  ateDb, "main", 4
132c0 29 3b 0a 20 20 7d 0a 0a 23 69 66 20 30 0a 20 20  );.  }..#if 0.  
132d0 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
132e0 45 5f 4f 4b 20 26 26 20 72 62 75 49 73 56 61 63  E_OK && rbuIsVac
132f0 75 75 6d 28 70 29 20 29 7b 0a 20 20 20 20 70 2d  uum(p) ){.    p-
13300 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78  >rc = sqlite3_ex
13310 65 63 28 70 2d 3e 64 62 52 62 75 2c 20 22 42 45  ec(p->dbRbu, "BE
13320 47 49 4e 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  GIN", 0, 0, 0);.
13330 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
13340 20 49 66 20 69 74 20 68 61 73 20 6e 6f 74 20 61   If it has not a
13350 6c 72 65 61 64 79 20 62 65 65 6e 20 63 72 65 61  lready been crea
13360 74 65 64 2c 20 63 72 65 61 74 65 20 74 68 65 20  ted, create the 
13370 72 62 75 5f 73 74 61 74 65 20 74 61 62 6c 65 20  rbu_state table 
13380 2a 2f 0a 20 20 72 62 75 4d 50 72 69 6e 74 66 45  */.  rbuMPrintfE
13390 78 65 63 28 70 2c 20 70 2d 3e 64 62 52 62 75 2c  xec(p, p->dbRbu,
133a0 20 52 42 55 5f 43 52 45 41 54 45 5f 53 54 41 54   RBU_CREATE_STAT
133b0 45 2c 20 70 2d 3e 7a 53 74 61 74 65 44 62 29 3b  E, p->zStateDb);
133c0 0a 0a 23 69 66 20 30 0a 20 20 69 66 28 20 72 62  ..#if 0.  if( rb
133d0 75 49 73 56 61 63 75 75 6d 28 70 29 20 29 7b 0a  uIsVacuum(p) ){.
133e0 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
133f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
13400 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 20 20 20    int rc2;.     
13410 20 69 6e 74 20 62 4f 6b 20 3d 20 30 3b 0a 20 20   int bOk = 0;.  
13420 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
13430 20 2a 70 43 6e 74 20 3d 20 30 3b 0a 20 20 20 20   *pCnt = 0;.    
13440 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72    p->rc = prepar
13450 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72  eAndCollectError
13460 28 70 2d 3e 64 62 52 62 75 2c 20 26 70 43 6e 74  (p->dbRbu, &pCnt
13470 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 0a 20  , &p->zErrmsg,. 
13480 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54           "SELECT
13490 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 73   count(*) FROM s
134a0 74 61 74 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65  tat.sqlite_maste
134b0 72 22 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  r".      );.    
134c0 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
134d0 49 54 45 5f 4f 4b 20 0a 20 20 20 20 20 20 20 26  ITE_OK .       &
134e0 26 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  & sqlite3_step(p
134f0 43 6e 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  Cnt)==SQLITE_ROW
13500 0a 20 20 20 20 20 20 20 26 26 20 31 3d 3d 73 71  .       && 1==sq
13510 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
13520 28 70 43 6e 74 2c 20 30 29 0a 20 20 20 20 20 20  (pCnt, 0).      
13530 29 7b 0a 20 20 20 20 20 20 20 20 62 4f 6b 20 3d  ){.        bOk =
13540 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
13550 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f    rc2 = sqlite3_
13560 66 69 6e 61 6c 69 7a 65 28 70 43 6e 74 29 3b 0a  finalize(pCnt);.
13570 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
13580 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 2d 3e  =SQLITE_OK ) p->
13590 72 63 20 3d 20 72 63 32 3b 0a 0a 20 20 20 20 20  rc = rc2;..     
135a0 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
135b0 54 45 5f 4f 4b 20 26 26 20 62 4f 6b 3d 3d 30 20  TE_OK && bOk==0 
135c0 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63  ){.        p->rc
135d0 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
135e0 0a 20 20 20 20 20 20 20 20 70 2d 3e 7a 45 72 72  .        p->zErr
135f0 6d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  msg = sqlite3_mp
13600 72 69 6e 74 66 28 22 69 6e 76 61 6c 69 64 20 73  rintf("invalid s
13610 74 61 74 65 20 64 61 74 61 62 61 73 65 22 29 3b  tate database");
13620 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 0a 20 20  .      }.    .  
13630 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
13640 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
13650 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69      p->rc = sqli
13660 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 52 62  te3_exec(p->dbRb
13670 75 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20  u, "COMMIT", 0, 
13680 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  0, 0);.      }. 
13690 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
136a0 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
136b0 4c 49 54 45 5f 4f 4b 20 26 26 20 72 62 75 49 73  LITE_OK && rbuIs
136c0 56 61 63 75 75 6d 28 70 29 20 29 7b 0a 20 20 20  Vacuum(p) ){.   
136d0 20 69 6e 74 20 62 4f 70 65 6e 20 3d 20 30 3b 0a   int bOpen = 0;.
136e0 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
136f0 70 2d 3e 6e 52 62 75 20 3d 20 30 3b 0a 20 20 20  p->nRbu = 0;.   
13700 20 70 2d 3e 70 52 62 75 46 64 20 3d 20 30 3b 0a   p->pRbuFd = 0;.
13710 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
13720 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 70 2d  _file_control(p-
13730 3e 64 62 52 62 75 2c 20 22 6d 61 69 6e 22 2c 20  >dbRbu, "main", 
13740 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 52 42 55  SQLITE_FCNTL_RBU
13750 43 4e 54 2c 20 28 76 6f 69 64 2a 29 70 29 3b 0a  CNT, (void*)p);.
13760 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
13770 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 20 70 2d  TE_NOTFOUND ) p-
13780 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 69 66  >rc = rc;.    if
13790 28 20 70 2d 3e 65 53 74 61 67 65 3e 3d 52 42 55  ( p->eStage>=RBU
137a0 5f 53 54 41 47 45 5f 4d 4f 56 45 20 29 7b 0a 20  _STAGE_MOVE ){. 
137b0 20 20 20 20 20 62 4f 70 65 6e 20 3d 20 31 3b 0a       bOpen = 1;.
137c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
137d0 20 52 62 75 53 74 61 74 65 20 2a 70 53 74 61 74   RbuState *pStat
137e0 65 20 3d 20 72 62 75 4c 6f 61 64 53 74 61 74 65  e = rbuLoadState
137f0 28 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  (p);.      if( p
13800 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20  State ){.       
13810 20 62 4f 70 65 6e 20 3d 20 28 70 53 74 61 74 65   bOpen = (pState
13820 2d 3e 65 53 74 61 67 65 3e 52 42 55 5f 53 54 41  ->eStage>RBU_STA
13830 47 45 5f 4d 4f 56 45 29 3b 0a 20 20 20 20 20 20  GE_MOVE);.      
13840 20 20 72 62 75 46 72 65 65 53 74 61 74 65 28 70    rbuFreeState(p
13850 53 74 61 74 65 29 3b 0a 20 20 20 20 20 20 7d 0a  State);.      }.
13860 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 62 4f      }.    if( bO
13870 70 65 6e 20 29 20 70 2d 3e 64 62 4d 61 69 6e 20  pen ) p->dbMain 
13880 3d 20 72 62 75 4f 70 65 6e 44 62 68 61 6e 64 6c  = rbuOpenDbhandl
13890 65 28 70 2c 20 70 2d 3e 7a 52 62 75 2c 20 70 2d  e(p, p->zRbu, p-
138a0 3e 6e 52 62 75 3c 3d 31 29 3b 0a 20 20 7d 0a 0a  >nRbu<=1);.  }..
138b0 20 20 70 2d 3e 65 53 74 61 67 65 20 3d 20 30 3b    p->eStage = 0;
138c0 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
138d0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 64 62  LITE_OK && p->db
138e0 4d 61 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 69  Main==0 ){.    i
138f0 66 28 20 21 72 62 75 49 73 56 61 63 75 75 6d 28  f( !rbuIsVacuum(
13900 70 29 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 64  p) ){.      p->d
13910 62 4d 61 69 6e 20 3d 20 72 62 75 4f 70 65 6e 44  bMain = rbuOpenD
13920 62 68 61 6e 64 6c 65 28 70 2c 20 70 2d 3e 7a 54  bhandle(p, p->zT
13930 61 72 67 65 74 2c 20 31 29 3b 0a 20 20 20 20 7d  arget, 1);.    }
13940 65 6c 73 65 20 69 66 28 20 70 2d 3e 70 52 62 75  else if( p->pRbu
13950 46 64 2d 3e 70 57 61 6c 46 64 20 29 7b 0a 20 20  Fd->pWalFd ){.  
13960 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
13970 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
13980 70 2d 3e 7a 45 72 72 6d 73 67 20 3d 20 73 71 6c  p->zErrmsg = sql
13990 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 63 61  ite3_mprintf("ca
139a0 6e 6e 6f 74 20 76 61 63 75 75 6d 20 77 61 6c 20  nnot vacuum wal 
139b0 6d 6f 64 65 20 64 61 74 61 62 61 73 65 22 29 3b  mode database");
139c0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
139d0 20 20 63 68 61 72 20 2a 7a 54 61 72 67 65 74 3b    char *zTarget;
139e0 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 45 78  .      char *zEx
139f0 74 72 61 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  tra = 0;.      i
13a00 66 28 20 73 74 72 6c 65 6e 28 70 2d 3e 7a 52 62  f( strlen(p->zRb
13a10 75 29 3e 3d 35 20 26 26 20 30 3d 3d 6d 65 6d 63  u)>=5 && 0==memc
13a20 6d 70 28 22 66 69 6c 65 3a 22 2c 20 70 2d 3e 7a  mp("file:", p->z
13a30 52 62 75 2c 20 35 29 20 29 7b 0a 20 20 20 20 20  Rbu, 5) ){.     
13a40 20 20 20 7a 45 78 74 72 61 20 3d 20 26 70 2d 3e     zExtra = &p->
13a50 7a 52 62 75 5b 35 5d 3b 0a 20 20 20 20 20 20 20  zRbu[5];.       
13a60 20 77 68 69 6c 65 28 20 2a 7a 45 78 74 72 61 20   while( *zExtra 
13a70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
13a80 20 2a 7a 45 78 74 72 61 2b 2b 3d 3d 27 3f 27 20   *zExtra++=='?' 
13a90 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
13aa0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 2a   }.        if( *
13ab0 7a 45 78 74 72 61 3d 3d 27 5c 30 27 20 29 20 7a  zExtra=='\0' ) z
13ac0 45 78 74 72 61 20 3d 20 30 3b 0a 20 20 20 20 20  Extra = 0;.     
13ad0 20 7d 0a 0a 20 20 20 20 20 20 7a 54 61 72 67 65   }..      zTarge
13ae0 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  t = sqlite3_mpri
13af0 6e 74 66 28 22 66 69 6c 65 3a 25 73 2d 76 61 63  ntf("file:%s-vac
13b00 75 75 6d 3f 72 62 75 5f 6d 65 6d 6f 72 79 3d 31  uum?rbu_memory=1
13b10 25 73 25 73 22 2c 20 0a 20 20 20 20 20 20 20 20  %s%s", .        
13b20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 66 69 6c    sqlite3_db_fil
13b30 65 6e 61 6d 65 28 70 2d 3e 64 62 52 62 75 2c 20  ename(p->dbRbu, 
13b40 22 6d 61 69 6e 22 29 2c 0a 20 20 20 20 20 20 20  "main"),.       
13b50 20 20 20 28 7a 45 78 74 72 61 3d 3d 30 20 3f 20     (zExtra==0 ? 
13b60 22 22 20 3a 20 22 26 22 29 2c 20 28 7a 45 78 74  "" : "&"), (zExt
13b70 72 61 3d 3d 30 20 3f 20 22 22 20 3a 20 7a 45 78  ra==0 ? "" : zEx
13b80 74 72 61 29 0a 20 20 20 20 20 20 29 3b 0a 0a 20  tra).      );.. 
13b90 20 20 20 20 20 69 66 28 20 7a 54 61 72 67 65 74       if( zTarget
13ba0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
13bb0 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ->rc = SQLITE_NO
13bc0 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 72 65 74  MEM;.        ret
13bd0 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  urn;.      }.   
13be0 20 20 20 70 2d 3e 64 62 4d 61 69 6e 20 3d 20 72     p->dbMain = r
13bf0 62 75 4f 70 65 6e 44 62 68 61 6e 64 6c 65 28 70  buOpenDbhandle(p
13c00 2c 20 7a 54 61 72 67 65 74 2c 20 70 2d 3e 6e 52  , zTarget, p->nR
13c10 62 75 3c 3d 31 29 3b 0a 20 20 20 20 20 20 73 71  bu<=1);.      sq
13c20 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 61 72 67  lite3_free(zTarg
13c30 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  et);.    }.  }..
13c40 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
13c50 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d  ITE_OK ){.    p-
13c60 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72  >rc = sqlite3_cr
13c70 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70 2d  eate_function(p-
13c80 3e 64 62 4d 61 69 6e 2c 20 0a 20 20 20 20 20 20  >dbMain, .      
13c90 20 20 22 72 62 75 5f 74 6d 70 5f 69 6e 73 65 72    "rbu_tmp_inser
13ca0 74 22 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55  t", -1, SQLITE_U
13cb0 54 46 38 2c 20 28 76 6f 69 64 2a 29 70 2c 20 72  TF8, (void*)p, r
13cc0 62 75 54 6d 70 49 6e 73 65 72 74 46 75 6e 63 2c  buTmpInsertFunc,
13cd0 20 30 2c 20 30 0a 20 20 20 20 29 3b 0a 20 20 7d   0, 0.    );.  }
13ce0 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ..  if( p->rc==S
13cf0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
13d00 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  p->rc = sqlite3_
13d10 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
13d20 70 2d 3e 64 62 4d 61 69 6e 2c 20 0a 20 20 20 20  p->dbMain, .    
13d30 20 20 20 20 22 72 62 75 5f 66 6f 73 73 69 6c 5f      "rbu_fossil_
13d40 64 65 6c 74 61 22 2c 20 32 2c 20 53 51 4c 49 54  delta", 2, SQLIT
13d50 45 5f 55 54 46 38 2c 20 30 2c 20 72 62 75 46 6f  E_UTF8, 0, rbuFo
13d60 73 73 69 6c 44 65 6c 74 61 46 75 6e 63 2c 20 30  ssilDeltaFunc, 0
13d70 2c 20 30 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a  , 0.    );.  }..
13d80 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
13d90 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d  ITE_OK ){.    p-
13da0 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72  >rc = sqlite3_cr
13db0 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70 2d  eate_function(p-
13dc0 3e 64 62 52 62 75 2c 20 0a 20 20 20 20 20 20 20  >dbRbu, .       
13dd0 20 22 72 62 75 5f 74 61 72 67 65 74 5f 6e 61 6d   "rbu_target_nam
13de0 65 22 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55  e", -1, SQLITE_U
13df0 54 46 38 2c 20 28 76 6f 69 64 2a 29 70 2c 20 72  TF8, (void*)p, r
13e00 62 75 54 61 72 67 65 74 4e 61 6d 65 46 75 6e 63  buTargetNameFunc
13e10 2c 20 30 2c 20 30 0a 20 20 20 20 29 3b 0a 20 20  , 0, 0.    );.  
13e20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  }..  if( p->rc==
13e30 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
13e40 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33   p->rc = sqlite3
13e50 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 70 2d  _file_control(p-
13e60 3e 64 62 4d 61 69 6e 2c 20 22 6d 61 69 6e 22 2c  >dbMain, "main",
13e70 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 52 42   SQLITE_FCNTL_RB
13e80 55 2c 20 28 76 6f 69 64 2a 29 70 29 3b 0a 20 20  U, (void*)p);.  
13e90 7d 0a 20 20 72 62 75 4d 50 72 69 6e 74 66 45 78  }.  rbuMPrintfEx
13ea0 65 63 28 70 2c 20 70 2d 3e 64 62 4d 61 69 6e 2c  ec(p, p->dbMain,
13eb0 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   "SELECT * FROM 
13ec0 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 29 3b  sqlite_master");
13ed0 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20  ..  /* Mark the 
13ee0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6a 75  database file ju
13ef0 73 74 20 6f 70 65 6e 65 64 20 61 73 20 61 6e 20  st opened as an 
13f00 52 42 55 20 74 61 72 67 65 74 20 64 61 74 61 62  RBU target datab
13f10 61 73 65 2e 20 49 66 20 0a 20 20 2a 2a 20 74 68  ase. If .  ** th
13f20 69 73 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 20  is call returns 
13f30 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 2c  SQLITE_NOTFOUND,
13f40 20 74 68 65 6e 20 74 68 65 20 52 42 55 20 76 66   then the RBU vf
13f50 73 20 69 73 20 6e 6f 74 20 69 6e 20 75 73 65 2e  s is not in use.
13f60 0a 20 20 2a 2a 20 54 68 69 73 20 69 73 20 61 6e  .  ** This is an
13f70 20 65 72 72 6f 72 2e 20 20 2a 2f 0a 20 20 69 66   error.  */.  if
13f80 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
13f90 4f 4b 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  OK ){.    p->rc 
13fa0 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63  = sqlite3_file_c
13fb0 6f 6e 74 72 6f 6c 28 70 2d 3e 64 62 4d 61 69 6e  ontrol(p->dbMain
13fc0 2c 20 22 6d 61 69 6e 22 2c 20 53 51 4c 49 54 45  , "main", SQLITE
13fd0 5f 46 43 4e 54 4c 5f 52 42 55 2c 20 28 76 6f 69  _FCNTL_RBU, (voi
13fe0 64 2a 29 70 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  d*)p);.  }..  if
13ff0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
14000 4e 4f 54 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20  NOTFOUND ){.    
14010 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45  p->rc = SQLITE_E
14020 52 52 4f 52 3b 0a 20 20 20 20 70 2d 3e 7a 45 72  RROR;.    p->zEr
14030 72 6d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  rmsg = sqlite3_m
14040 70 72 69 6e 74 66 28 22 72 62 75 20 76 66 73 20  printf("rbu vfs 
14050 6e 6f 74 20 66 6f 75 6e 64 22 29 3b 0a 20 20 7d  not found");.  }
14060 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
14070 6f 75 74 69 6e 65 20 69 73 20 61 20 63 6f 70 79  outine is a copy
14080 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 46   of the sqlite3F
14090 69 6c 65 53 75 66 66 69 78 33 28 29 20 72 6f 75  ileSuffix3() rou
140a0 74 69 6e 65 20 66 72 6f 6d 20 74 68 65 20 63 6f  tine from the co
140b0 72 65 2e 0a 2a 2a 20 49 74 20 69 73 20 61 20 6e  re..** It is a n
140c0 6f 2d 6f 70 20 75 6e 6c 65 73 73 20 53 51 4c 49  o-op unless SQLI
140d0 54 45 5f 45 4e 41 42 4c 45 5f 38 5f 33 5f 4e 41  TE_ENABLE_8_3_NA
140e0 4d 45 53 20 69 73 20 64 65 66 69 6e 65 64 2e 0a  MES is defined..
140f0 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f  **.** If SQLITE_
14100 45 4e 41 42 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53  ENABLE_8_3_NAMES
14110 20 69 73 20 73 65 74 20 61 74 20 63 6f 6d 70 69   is set at compi
14120 6c 65 2d 74 69 6d 65 20 61 6e 64 20 69 66 20 74  le-time and if t
14130 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66  he database.** f
14140 69 6c 65 6e 61 6d 65 20 69 6e 20 7a 42 61 73 65  ilename in zBase
14150 46 69 6c 65 6e 61 6d 65 20 69 73 20 61 20 55 52  Filename is a UR
14160 49 20 77 69 74 68 20 74 68 65 20 22 38 5f 33 5f  I with the "8_3_
14170 6e 61 6d 65 73 3d 31 22 20 70 61 72 61 6d 65 74  names=1" paramet
14180 65 72 20 61 6e 64 0a 2a 2a 20 69 66 20 66 69 6c  er and.** if fil
14190 65 6e 61 6d 65 20 69 6e 20 7a 5b 5d 20 68 61 73  ename in z[] has
141a0 20 61 20 73 75 66 66 69 78 20 28 61 2e 6b 2e 61   a suffix (a.k.a
141b0 2e 20 22 65 78 74 65 6e 73 69 6f 6e 22 29 20 74  . "extension") t
141c0 68 61 74 20 69 73 20 6c 6f 6e 67 65 72 20 74 68  hat is longer th
141d0 61 6e 0a 2a 2a 20 74 68 72 65 65 20 63 68 61 72  an.** three char
141e0 61 63 74 65 72 73 2c 20 74 68 65 6e 20 73 68 6f  acters, then sho
141f0 72 74 65 6e 20 74 68 65 20 73 75 66 66 69 78 20  rten the suffix 
14200 6f 6e 20 7a 5b 5d 20 74 6f 20 62 65 20 74 68 65  on z[] to be the
14210 20 6c 61 73 74 20 74 68 72 65 65 0a 2a 2a 20 63   last three.** c
14220 68 61 72 61 63 74 65 72 73 20 6f 66 20 74 68 65  haracters of the
14230 20 6f 72 69 67 69 6e 61 6c 20 73 75 66 66 69 78   original suffix
14240 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54  ..**.** If SQLIT
14250 45 5f 45 4e 41 42 4c 45 5f 38 5f 33 5f 4e 41 4d  E_ENABLE_8_3_NAM
14260 45 53 20 69 73 20 73 65 74 20 74 6f 20 32 20 61  ES is set to 2 a
14270 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2c 20  t compile-time, 
14280 74 68 65 6e 20 61 6c 77 61 79 73 0a 2a 2a 20 64  then always.** d
14290 6f 20 74 68 65 20 73 75 66 66 69 78 20 73 68 6f  o the suffix sho
142a0 72 74 65 6e 69 6e 67 20 72 65 67 61 72 64 6c 65  rtening regardle
142b0 73 73 20 6f 66 20 55 52 49 20 70 61 72 61 6d 65  ss of URI parame
142c0 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70  ter..**.** Examp
142d0 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 74  les:.**.**     t
142e0 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 20  est.db-journal  
142f0 20 20 3d 3e 20 20 20 74 65 73 74 2e 6e 61 6c 0a    =>   test.nal.
14300 2a 2a 20 20 20 20 20 74 65 73 74 2e 64 62 2d 77  **     test.db-w
14310 61 6c 20 20 20 20 20 20 20 20 3d 3e 20 20 20 74  al        =>   t
14320 65 73 74 2e 77 61 6c 0a 2a 2a 20 20 20 20 20 74  est.wal.**     t
14330 65 73 74 2e 64 62 2d 73 68 6d 20 20 20 20 20 20  est.db-shm      
14340 20 20 3d 3e 20 20 20 74 65 73 74 2e 73 68 6d 0a    =>   test.shm.
14350 2a 2a 20 20 20 20 20 74 65 73 74 2e 64 62 2d 6d  **     test.db-m
14360 6a 37 66 33 33 31 39 66 61 20 3d 3e 20 20 20 74  j7f3319fa =>   t
14370 65 73 74 2e 39 66 61 0a 2a 2f 0a 73 74 61 74 69  est.9fa.*/.stati
14380 63 20 76 6f 69 64 20 72 62 75 46 69 6c 65 53 75  c void rbuFileSu
14390 66 66 69 78 33 28 63 6f 6e 73 74 20 63 68 61 72  ffix3(const char
143a0 20 2a 7a 42 61 73 65 2c 20 63 68 61 72 20 2a 7a   *zBase, char *z
143b0 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
143c0 5f 45 4e 41 42 4c 45 5f 38 5f 33 5f 4e 41 4d 45  _ENABLE_8_3_NAME
143d0 53 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  S.#if SQLITE_ENA
143e0 42 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53 3c 32 0a  BLE_8_3_NAMES<2.
143f0 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 75 72    if( sqlite3_ur
14400 69 5f 62 6f 6f 6c 65 61 6e 28 7a 42 61 73 65 2c  i_boolean(zBase,
14410 20 22 38 5f 33 5f 6e 61 6d 65 73 22 2c 20 30 29   "8_3_names", 0)
14420 20 29 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20   ).#endif.  {.  
14430 20 20 69 6e 74 20 69 2c 20 73 7a 3b 0a 20 20 20    int i, sz;.   
14440 20 73 7a 20 3d 20 73 71 6c 69 74 65 33 53 74 72   sz = sqlite3Str
14450 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20 66 6f  len30(z);.    fo
14460 72 28 69 3d 73 7a 2d 31 3b 20 69 3e 30 20 26 26  r(i=sz-1; i>0 &&
14470 20 7a 5b 69 5d 21 3d 27 2f 27 20 26 26 20 7a 5b   z[i]!='/' && z[
14480 69 5d 21 3d 27 2e 27 3b 20 69 2d 2d 29 7b 7d 0a  i]!='.'; i--){}.
14490 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 2e      if( z[i]=='.
144a0 27 20 26 26 20 41 4c 57 41 59 53 28 73 7a 3e 69  ' && ALWAYS(sz>i
144b0 2b 34 29 20 29 20 6d 65 6d 6d 6f 76 65 28 26 7a  +4) ) memmove(&z
144c0 5b 69 2b 31 5d 2c 20 26 7a 5b 73 7a 2d 33 5d 2c  [i+1], &z[sz-3],
144d0 20 34 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   4);.  }.#endif.
144e0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
144f0 74 68 65 20 63 75 72 72 65 6e 74 20 77 61 6c 2d  the current wal-
14500 69 6e 64 65 78 20 68 65 61 64 65 72 20 63 68 65  index header che
14510 63 6b 73 75 6d 20 66 6f 72 20 74 68 65 20 74 61  cksum for the ta
14520 72 67 65 74 20 64 61 74 61 62 61 73 65 20 0a 2a  rget database .*
14530 2a 20 61 73 20 61 20 36 34 2d 62 69 74 20 69 6e  * as a 64-bit in
14540 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  teger..**.** The
14550 20 63 68 65 63 6b 73 75 6d 20 69 73 20 73 74 6f   checksum is sto
14560 72 65 20 69 6e 20 74 68 65 20 66 69 72 73 74 20  re in the first 
14570 70 61 67 65 20 6f 66 20 78 53 68 6d 4d 61 70 20  page of xShmMap 
14580 6d 65 6d 6f 72 79 20 61 73 20 61 6e 20 38 2d 62  memory as an 8-b
14590 79 74 65 20 0a 2a 2a 20 62 6c 6f 62 20 73 74 61  yte .** blob sta
145a0 72 74 69 6e 67 20 61 74 20 62 79 74 65 20 6f 66  rting at byte of
145b0 66 73 65 74 20 34 30 2e 0a 2a 2f 0a 73 74 61 74  fset 40..*/.stat
145c0 69 63 20 69 36 34 20 72 62 75 53 68 6d 43 68 65  ic i64 rbuShmChe
145d0 63 6b 73 75 6d 28 73 71 6c 69 74 65 33 72 62 75  cksum(sqlite3rbu
145e0 20 2a 70 29 7b 0a 20 20 69 36 34 20 69 52 65 74   *p){.  i64 iRet
145f0 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 72   = 0;.  if( p->r
14600 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
14610 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65      sqlite3_file
14620 20 2a 70 44 62 20 3d 20 70 2d 3e 70 54 61 72 67   *pDb = p->pTarg
14630 65 74 46 64 2d 3e 70 52 65 61 6c 3b 0a 20 20 20  etFd->pReal;.   
14640 20 75 33 32 20 76 6f 6c 61 74 69 6c 65 20 2a 70   u32 volatile *p
14650 74 72 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20  tr;.    p->rc = 
14660 70 44 62 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78  pDb->pMethods->x
14670 53 68 6d 4d 61 70 28 70 44 62 2c 20 30 2c 20 33  ShmMap(pDb, 0, 3
14680 32 2a 31 30 32 34 2c 20 30 2c 20 28 76 6f 69 64  2*1024, 0, (void
14690 20 76 6f 6c 61 74 69 6c 65 2a 2a 29 26 70 74 72   volatile**)&ptr
146a0 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  );.    if( p->rc
146b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
146c0 20 20 20 20 20 69 52 65 74 20 3d 20 28 28 69 36       iRet = ((i6
146d0 34 29 70 74 72 5b 31 30 5d 20 3c 3c 20 33 32 29  4)ptr[10] << 32)
146e0 20 2b 20 70 74 72 5b 31 31 5d 3b 0a 20 20 20 20   + ptr[11];.    
146f0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69  }.  }.  return i
14700 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  Ret;.}../*.** Th
14710 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
14720 61 6c 6c 65 64 20 61 73 20 70 61 72 74 20 6f 66  alled as part of
14730 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 6f 72   initializing or
14740 20 72 65 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20   reinitializing 
14750 61 6e 0a 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 61  an.** incrementa
14760 6c 20 63 68 65 63 6b 70 6f 69 6e 74 2e 20 0a 2a  l checkpoint. .*
14770 2a 0a 2a 2a 20 49 74 20 70 6f 70 75 6c 61 74 65  *.** It populate
14780 73 20 74 68 65 20 73 71 6c 69 74 65 33 72 62 75  s the sqlite3rbu
14790 2e 61 46 72 61 6d 65 5b 5d 20 61 72 72 61 79 20  .aFrame[] array 
147a0 77 69 74 68 20 74 68 65 20 73 65 74 20 6f 66 20  with the set of 
147b0 0a 2a 2a 20 28 77 61 6c 20 66 72 61 6d 65 20 2d  .** (wal frame -
147c0 3e 20 64 62 20 70 61 67 65 29 20 63 6f 70 79 20  > db page) copy 
147d0 6f 70 65 72 61 74 69 6f 6e 73 20 72 65 71 75 69  operations requi
147e0 72 65 64 20 74 6f 20 63 68 65 63 6b 70 6f 69 6e  red to checkpoin
147f0 74 20 74 68 65 20 0a 2a 2a 20 63 75 72 72 65 6e  t the .** curren
14800 74 20 77 61 6c 20 66 69 6c 65 2c 20 61 6e 64 20  t wal file, and 
14810 6f 62 74 61 69 6e 73 20 74 68 65 20 73 65 74 20  obtains the set 
14820 6f 66 20 73 68 6d 20 6c 6f 63 6b 73 20 72 65 71  of shm locks req
14830 75 69 72 65 64 20 74 6f 20 73 61 66 65 6c 79 20  uired to safely 
14840 0a 2a 2a 20 70 65 72 66 6f 72 6d 20 74 68 65 20  .** perform the 
14850 63 6f 70 79 20 6f 70 65 72 61 74 69 6f 6e 73 20  copy operations 
14860 64 69 72 65 63 74 6c 79 20 6f 6e 20 74 68 65 20  directly on the 
14870 66 69 6c 65 2d 73 79 73 74 65 6d 2e 0a 2a 2a 0a  file-system..**.
14880 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 70  ** If argument p
14890 53 74 61 74 65 20 69 73 20 6e 6f 74 20 4e 55 4c  State is not NUL
148a0 4c 2c 20 74 68 65 6e 20 74 68 65 20 69 6e 63 72  L, then the incr
148b0 65 6d 65 6e 74 61 6c 20 63 68 65 63 6b 70 6f 69  emental checkpoi
148c0 6e 74 20 69 73 0a 2a 2a 20 62 65 69 6e 67 20 72  nt is.** being r
148d0 65 73 75 6d 65 64 2e 20 49 6e 20 74 68 69 73 20  esumed. In this 
148e0 63 61 73 65 2c 20 69 66 20 74 68 65 20 63 68 65  case, if the che
148f0 63 6b 73 75 6d 20 6f 66 20 74 68 65 20 77 61 6c  cksum of the wal
14900 2d 69 6e 64 65 78 2d 68 65 61 64 65 72 0a 2a 2a  -index-header.**
14910 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65 63 6f 76   following recov
14920 65 72 79 20 69 73 20 6e 6f 74 20 74 68 65 20 73  ery is not the s
14930 61 6d 65 20 61 73 20 74 68 65 20 63 68 65 63 6b  ame as the check
14940 73 75 6d 20 73 61 76 65 64 20 69 6e 20 74 68 65  sum saved in the
14950 20 52 62 75 53 74 61 74 65 0a 2a 2a 20 6f 62 6a   RbuState.** obj
14960 65 63 74 2c 20 74 68 65 6e 20 74 68 65 20 72 62  ect, then the rb
14970 75 20 68 61 6e 64 6c 65 20 69 73 20 73 65 74 20  u handle is set 
14980 74 6f 20 44 4f 4e 45 20 73 74 61 74 65 2e 20 54  to DONE state. T
14990 68 69 73 20 6f 63 63 75 72 73 20 69 66 20 73 6f  his occurs if so
149a0 6d 65 0a 2a 2a 20 6f 74 68 65 72 20 63 6c 69 65  me.** other clie
149b0 6e 74 20 61 70 70 65 6e 64 73 20 61 20 74 72 61  nt appends a tra
149c0 6e 73 61 63 74 69 6f 6e 20 74 6f 20 74 68 65 20  nsaction to the 
149d0 77 61 6c 20 66 69 6c 65 20 69 6e 20 74 68 65 20  wal file in the 
149e0 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 61 6e 20  middle of.** an 
149f0 69 6e 63 72 65 6d 65 6e 74 61 6c 20 63 68 65 63  incremental chec
14a00 6b 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  kpoint..*/.stati
14a10 63 20 76 6f 69 64 20 72 62 75 53 65 74 75 70 43  c void rbuSetupC
14a20 68 65 63 6b 70 6f 69 6e 74 28 73 71 6c 69 74 65  heckpoint(sqlite
14a30 33 72 62 75 20 2a 70 2c 20 52 62 75 53 74 61 74  3rbu *p, RbuStat
14a40 65 20 2a 70 53 74 61 74 65 29 7b 0a 0a 20 20 2f  e *pState){..  /
14a50 2a 20 49 66 20 70 53 74 61 74 65 20 69 73 20 4e  * If pState is N
14a60 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 77 61  ULL, then the wa
14a70 6c 20 66 69 6c 65 20 6d 61 79 20 6e 6f 74 20 68  l file may not h
14a80 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20  ave been opened 
14a90 61 6e 64 0a 20 20 2a 2a 20 72 65 63 6f 76 65 72  and.  ** recover
14aa0 65 64 2e 20 52 75 6e 6e 69 6e 67 20 61 20 72 65  ed. Running a re
14ab0 61 64 2d 73 74 61 74 65 6d 65 6e 74 20 68 65 72  ad-statement her
14ac0 65 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74  e to ensure that
14ad0 20 64 6f 69 6e 67 20 73 6f 0a 20 20 2a 2a 20 64   doing so.  ** d
14ae0 6f 65 73 20 6e 6f 74 20 69 6e 74 65 72 66 65 72  oes not interfer
14af0 65 20 77 69 74 68 20 74 68 65 20 22 63 61 70 74  e with the "capt
14b00 75 72 65 22 20 70 72 6f 63 65 73 73 20 62 65 6c  ure" process bel
14b10 6f 77 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 53  ow.  */.  if( pS
14b20 74 61 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70  tate==0 ){.    p
14b30 2d 3e 65 53 74 61 67 65 20 3d 20 30 3b 0a 20 20  ->eStage = 0;.  
14b40 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
14b50 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
14b60 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  p->rc = sqlite3_
14b70 65 78 65 63 28 70 2d 3e 64 62 4d 61 69 6e 2c 20  exec(p->dbMain, 
14b80 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73  "SELECT * FROM s
14b90 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 2c 20 30  qlite_master", 0
14ba0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  , 0, 0);.    }. 
14bb0 20 7d 0a 0a 20 20 2f 2a 20 41 73 73 75 6d 69 6e   }..  /* Assumin
14bc0 67 20 6e 6f 20 65 72 72 6f 72 20 68 61 73 20 6f  g no error has o
14bd0 63 63 75 72 72 65 64 2c 20 72 75 6e 20 61 20 22  ccurred, run a "
14be0 72 65 73 74 61 72 74 22 20 63 68 65 63 6b 70 6f  restart" checkpo
14bf0 69 6e 74 20 77 69 74 68 20 74 68 65 0a 20 20 2a  int with the.  *
14c00 2a 20 73 71 6c 69 74 65 33 72 62 75 2e 65 53 74  * sqlite3rbu.eSt
14c10 61 67 65 20 76 61 72 69 61 62 6c 65 20 73 65 74  age variable set
14c20 20 74 6f 20 43 41 50 54 55 52 45 2e 20 54 68 69   to CAPTURE. Thi
14c30 73 20 74 75 72 6e 73 20 6f 6e 20 74 68 65 20 66  s turns on the f
14c40 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 73 70  ollowing.  ** sp
14c50 65 63 69 61 6c 20 62 65 68 61 76 69 6f 75 72 20  ecial behaviour 
14c60 69 6e 20 74 68 65 20 72 62 75 20 56 46 53 3a 0a  in the rbu VFS:.
14c70 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 49 66    **.  **   * If
14c80 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 73   the exclusive s
14c90 68 6d 20 57 52 49 54 45 52 20 6f 72 20 52 45 41  hm WRITER or REA
14ca0 44 30 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62  D0 lock cannot b
14cb0 65 20 6f 62 74 61 69 6e 65 64 2c 0a 20 20 2a 2a  e obtained,.  **
14cc0 20 20 20 20 20 74 68 65 20 63 68 65 63 6b 70 6f       the checkpo
14cd0 69 6e 74 20 66 61 69 6c 73 20 77 69 74 68 20 53  int fails with S
14ce0 51 4c 49 54 45 5f 42 55 53 59 20 28 6e 6f 72 6d  QLITE_BUSY (norm
14cf0 61 6c 6c 79 20 53 51 4c 69 74 65 20 77 6f 75 6c  ally SQLite woul
14d00 64 0a 20 20 2a 2a 20 20 20 20 20 70 72 6f 63 65  d.  **     proce
14d10 65 64 20 77 69 74 68 20 72 75 6e 6e 69 6e 67 20  ed with running 
14d20 61 20 70 61 73 73 69 76 65 20 63 68 65 63 6b 70  a passive checkp
14d30 6f 69 6e 74 20 69 6e 73 74 65 61 64 20 6f 66 20  oint instead of 
14d40 66 61 69 6c 69 6e 67 29 2e 0a 20 20 2a 2a 0a 20  failing)..  **. 
14d50 20 2a 2a 20 20 20 2a 20 41 74 74 65 6d 70 74 73   **   * Attempts
14d60 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 74 68   to read from th
14d70 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 6f 72 20  e *-wal file or 
14d80 77 72 69 74 65 20 74 6f 20 74 68 65 20 64 61 74  write to the dat
14d90 61 62 61 73 65 20 66 69 6c 65 0a 20 20 2a 2a 20  abase file.  ** 
14da0 20 20 20 20 64 6f 20 6e 6f 74 20 70 65 72 66 6f      do not perfo
14db0 72 6d 20 61 6e 79 20 49 4f 2e 20 49 6e 73 74 65  rm any IO. Inste
14dc0 61 64 2c 20 74 68 65 20 66 72 61 6d 65 2f 70 61  ad, the frame/pa
14dd0 67 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20  ge combinations 
14de0 74 68 61 74 0a 20 20 2a 2a 20 20 20 20 20 77 6f  that.  **     wo
14df0 75 6c 64 20 62 65 20 72 65 61 64 2f 77 72 69 74  uld be read/writ
14e00 74 65 6e 20 61 72 65 20 72 65 63 6f 72 64 65 64  ten are recorded
14e10 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 33 72   in the sqlite3r
14e20 62 75 2e 61 46 72 61 6d 65 5b 5d 0a 20 20 2a 2a  bu.aFrame[].  **
14e30 20 20 20 20 20 61 72 72 61 79 2e 0a 20 20 2a 2a       array..  **
14e40 0a 20 20 2a 2a 20 20 20 2a 20 43 61 6c 6c 73 20  .  **   * Calls 
14e50 74 6f 20 78 53 68 6d 4c 6f 63 6b 28 55 4e 4c 4f  to xShmLock(UNLO
14e60 43 4b 29 20 74 6f 20 72 65 6c 65 61 73 65 20 74  CK) to release t
14e70 68 65 20 65 78 63 6c 75 73 69 76 65 20 73 68 6d  he exclusive shm
14e80 20 57 52 49 54 45 52 2c 20 0a 20 20 2a 2a 20 20   WRITER, .  **  
14e90 20 20 20 52 45 41 44 30 20 61 6e 64 20 43 48 45     READ0 and CHE
14ea0 43 4b 50 4f 49 4e 54 20 6c 6f 63 6b 73 20 74 61  CKPOINT locks ta
14eb0 6b 65 6e 20 61 73 20 70 61 72 74 20 6f 66 20 74  ken as part of t
14ec0 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 61 72  he checkpoint ar
14ed0 65 0a 20 20 2a 2a 20 20 20 20 20 6e 6f 2d 6f 70  e.  **     no-op
14ee0 73 2e 20 54 68 65 73 65 20 6c 6f 63 6b 73 20 77  s. These locks w
14ef0 69 6c 6c 20 6e 6f 74 20 62 65 20 72 65 6c 65 61  ill not be relea
14f00 73 65 64 20 75 6e 74 69 6c 20 74 68 65 20 63 6f  sed until the co
14f10 6e 6e 65 63 74 69 6f 6e 0a 20 20 2a 2a 20 20 20  nnection.  **   
14f20 20 20 69 73 20 63 6c 6f 73 65 64 2e 0a 20 20 2a    is closed..  *
14f30 2a 0a 20 20 2a 2a 20 20 20 2a 20 41 74 74 65 6d  *.  **   * Attem
14f40 70 74 69 6e 67 20 74 6f 20 78 53 79 6e 63 28 29  pting to xSync()
14f50 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
14f60 6c 65 20 63 61 75 73 65 73 20 61 6e 20 53 51 4c  le causes an SQL
14f70 49 54 45 5f 49 4e 54 45 52 4e 41 4c 20 0a 20 20  ITE_INTERNAL .  
14f80 2a 2a 20 20 20 20 20 65 72 72 6f 72 2e 0a 20 20  **     error..  
14f90 2a 2a 0a 20 20 2a 2a 20 41 73 20 61 20 72 65 73  **.  ** As a res
14fa0 75 6c 74 2c 20 75 6e 6c 65 73 73 20 61 6e 20 65  ult, unless an e
14fb0 72 72 6f 72 20 28 69 2e 65 2e 20 4f 4f 4d 20 6f  rror (i.e. OOM o
14fc0 72 20 53 51 4c 49 54 45 5f 42 55 53 59 29 20 6f  r SQLITE_BUSY) o
14fd0 63 63 75 72 73 2c 20 74 68 65 0a 20 20 2a 2a 20  ccurs, the.  ** 
14fe0 63 68 65 63 6b 70 6f 69 6e 74 20 62 65 6c 6f 77  checkpoint below
14ff0 20 66 61 69 6c 73 20 77 69 74 68 20 53 51 4c 49   fails with SQLI
15000 54 45 5f 49 4e 54 45 52 4e 41 4c 2c 20 61 6e 64  TE_INTERNAL, and
15010 20 6c 65 61 76 65 73 20 74 68 65 20 61 46 72 61   leaves the aFra
15020 6d 65 5b 5d 0a 20 20 2a 2a 20 61 72 72 61 79 20  me[].  ** array 
15030 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 61  populated with a
15040 20 73 65 74 20 6f 66 20 28 66 72 61 6d 65 20 2d   set of (frame -
15050 3e 20 70 61 67 65 29 20 6d 61 70 70 69 6e 67 73  > page) mappings
15060 2e 20 42 65 63 61 75 73 65 20 74 68 65 20 0a 20  . Because the . 
15070 20 2a 2a 20 57 52 49 54 45 52 2c 20 43 48 45 43   ** WRITER, CHEC
15080 4b 50 4f 49 4e 54 20 61 6e 64 20 52 45 41 44 30  KPOINT and READ0
15090 20 6c 6f 63 6b 73 20 61 72 65 20 73 74 69 6c 6c   locks are still
150a0 20 68 65 6c 64 2c 20 69 74 20 69 73 20 73 61 66   held, it is saf
150b0 65 20 74 6f 20 63 6f 70 79 20 0a 20 20 2a 2a 20  e to copy .  ** 
150c0 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 77 61  data from the wa
150d0 6c 20 66 69 6c 65 20 69 6e 74 6f 20 74 68 65 20  l file into the 
150e0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 63  database file ac
150f0 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 0a  cording to the .
15100 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66    ** contents of
15110 20 61 46 72 61 6d 65 5b 5d 2e 0a 20 20 2a 2f 0a   aFrame[]..  */.
15120 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
15130 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e  ITE_OK ){.    in
15140 74 20 72 63 32 3b 0a 20 20 20 20 70 2d 3e 65 53  t rc2;.    p->eS
15150 74 61 67 65 20 3d 20 52 42 55 5f 53 54 41 47 45  tage = RBU_STAGE
15160 5f 43 41 50 54 55 52 45 3b 0a 20 20 20 20 72 63  _CAPTURE;.    rc
15170 32 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  2 = sqlite3_exec
15180 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 50 52 41  (p->dbMain, "PRA
15190 47 4d 41 20 6d 61 69 6e 2e 77 61 6c 5f 63 68 65  GMA main.wal_che
151a0 63 6b 70 6f 69 6e 74 3d 72 65 73 74 61 72 74 22  ckpoint=restart"
151b0 2c 20 30 2c 20 30 2c 30 29 3b 0a 20 20 20 20 69  , 0, 0,0);.    i
151c0 66 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 49  f( rc2!=SQLITE_I
151d0 4e 54 45 52 4e 41 4c 20 29 20 70 2d 3e 72 63 20  NTERNAL ) p->rc 
151e0 3d 20 72 63 32 3b 0a 20 20 7d 0a 0a 20 20 69 66  = rc2;.  }..  if
151f0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
15200 4f 4b 20 29 7b 0a 20 20 20 20 70 2d 3e 65 53 74  OK ){.    p->eSt
15210 61 67 65 20 3d 20 52 42 55 5f 53 54 41 47 45 5f  age = RBU_STAGE_
15220 43 4b 50 54 3b 0a 20 20 20 20 70 2d 3e 6e 53 74  CKPT;.    p->nSt
15230 65 70 20 3d 20 28 70 53 74 61 74 65 20 3f 20 70  ep = (pState ? p
15240 53 74 61 74 65 2d 3e 6e 52 6f 77 20 3a 20 30 29  State->nRow : 0)
15250 3b 0a 20 20 20 20 70 2d 3e 61 42 75 66 20 3d 20  ;.    p->aBuf = 
15260 72 62 75 4d 61 6c 6c 6f 63 28 70 2c 20 70 2d 3e  rbuMalloc(p, p->
15270 70 67 73 7a 29 3b 0a 20 20 20 20 70 2d 3e 69 57  pgsz);.    p->iW
15280 61 6c 43 6b 73 75 6d 20 3d 20 72 62 75 53 68 6d  alCksum = rbuShm
15290 43 68 65 63 6b 73 75 6d 28 70 29 3b 0a 20 20 7d  Checksum(p);.  }
152a0 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ..  if( p->rc==S
152b0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 53 74 61  QLITE_OK && pSta
152c0 74 65 20 26 26 20 70 53 74 61 74 65 2d 3e 69 57  te && pState->iW
152d0 61 6c 43 6b 73 75 6d 21 3d 70 2d 3e 69 57 61 6c  alCksum!=p->iWal
152e0 43 6b 73 75 6d 20 29 7b 0a 20 20 20 20 70 2d 3e  Cksum ){.    p->
152f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
15300 3b 0a 20 20 20 20 70 2d 3e 65 53 74 61 67 65 20  ;.    p->eStage 
15310 3d 20 52 42 55 5f 53 54 41 47 45 5f 44 4f 4e 45  = RBU_STAGE_DONE
15320 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
15330 61 6c 6c 65 64 20 77 68 65 6e 20 69 41 6d 74 20  alled when iAmt 
15340 62 79 74 65 73 20 61 72 65 20 72 65 61 64 20 66  bytes are read f
15350 72 6f 6d 20 6f 66 66 73 65 74 20 69 4f 66 66 20  rom offset iOff 
15360 6f 66 20 74 68 65 20 77 61 6c 20 66 69 6c 65 20  of the wal file 
15370 77 68 69 6c 65 0a 2a 2a 20 74 68 65 20 72 62 75  while.** the rbu
15380 20 6f 62 6a 65 63 74 20 69 73 20 69 6e 20 63 61   object is in ca
15390 70 74 75 72 65 20 6d 6f 64 65 2e 20 52 65 63 6f  pture mode. Reco
153a0 72 64 20 74 68 65 20 66 72 61 6d 65 20 6e 75 6d  rd the frame num
153b0 62 65 72 20 6f 66 20 74 68 65 20 66 72 61 6d 65  ber of the frame
153c0 0a 2a 2a 20 62 65 69 6e 67 20 72 65 61 64 20 69  .** being read i
153d0 6e 20 74 68 65 20 61 46 72 61 6d 65 5b 5d 20 61  n the aFrame[] a
153e0 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rray..*/.static 
153f0 69 6e 74 20 72 62 75 43 61 70 74 75 72 65 57 61  int rbuCaptureWa
15400 6c 52 65 61 64 28 73 71 6c 69 74 65 33 72 62 75  lRead(sqlite3rbu
15410 20 2a 70 52 62 75 2c 20 69 36 34 20 69 4f 66 66   *pRbu, i64 iOff
15420 2c 20 69 6e 74 20 69 41 6d 74 29 7b 0a 20 20 63  , int iAmt){.  c
15430 6f 6e 73 74 20 75 33 32 20 6d 52 65 71 20 3d 20  onst u32 mReq = 
15440 28 31 3c 3c 57 41 4c 5f 4c 4f 43 4b 5f 57 52 49  (1<<WAL_LOCK_WRI
15450 54 45 29 7c 28 31 3c 3c 57 41 4c 5f 4c 4f 43 4b  TE)|(1<<WAL_LOCK
15460 5f 43 4b 50 54 29 7c 28 31 3c 3c 57 41 4c 5f 4c  _CKPT)|(1<<WAL_L
15470 4f 43 4b 5f 52 45 41 44 30 29 3b 0a 20 20 75 33  OCK_READ0);.  u3
15480 32 20 69 46 72 61 6d 65 3b 0a 0a 20 20 69 66 28  2 iFrame;..  if(
15490 20 70 52 62 75 2d 3e 6d 4c 6f 63 6b 21 3d 6d 52   pRbu->mLock!=mR
154a0 65 71 20 29 7b 0a 20 20 20 20 70 52 62 75 2d 3e  eq ){.    pRbu->
154b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
154c0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
154d0 49 54 45 5f 49 4e 54 45 52 4e 41 4c 3b 0a 20 20  ITE_INTERNAL;.  
154e0 7d 0a 0a 20 20 70 52 62 75 2d 3e 70 67 73 7a 20  }..  pRbu->pgsz 
154f0 3d 20 69 41 6d 74 3b 0a 20 20 69 66 28 20 70 52  = iAmt;.  if( pR
15500 62 75 2d 3e 6e 46 72 61 6d 65 3d 3d 70 52 62 75  bu->nFrame==pRbu
15510 2d 3e 6e 46 72 61 6d 65 41 6c 6c 6f 63 20 29 7b  ->nFrameAlloc ){
15520 0a 20 20 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20  .    int nNew = 
15530 28 70 52 62 75 2d 3e 6e 46 72 61 6d 65 41 6c 6c  (pRbu->nFrameAll
15540 6f 63 20 3f 20 70 52 62 75 2d 3e 6e 46 72 61 6d  oc ? pRbu->nFram
15550 65 41 6c 6c 6f 63 20 3a 20 36 34 29 20 2a 20 32  eAlloc : 64) * 2
15560 3b 0a 20 20 20 20 52 62 75 46 72 61 6d 65 20 2a  ;.    RbuFrame *
15570 61 4e 65 77 3b 0a 20 20 20 20 61 4e 65 77 20 3d  aNew;.    aNew =
15580 20 28 52 62 75 46 72 61 6d 65 2a 29 73 71 6c 69   (RbuFrame*)sqli
15590 74 65 33 5f 72 65 61 6c 6c 6f 63 36 34 28 70 52  te3_realloc64(pR
155a0 62 75 2d 3e 61 46 72 61 6d 65 2c 20 6e 4e 65 77  bu->aFrame, nNew
155b0 20 2a 20 73 69 7a 65 6f 66 28 52 62 75 46 72 61   * sizeof(RbuFra
155c0 6d 65 29 29 3b 0a 20 20 20 20 69 66 28 20 61 4e  me));.    if( aN
155d0 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ew==0 ) return S
155e0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
155f0 20 70 52 62 75 2d 3e 61 46 72 61 6d 65 20 3d 20   pRbu->aFrame = 
15600 61 4e 65 77 3b 0a 20 20 20 20 70 52 62 75 2d 3e  aNew;.    pRbu->
15610 6e 46 72 61 6d 65 41 6c 6c 6f 63 20 3d 20 6e 4e  nFrameAlloc = nN
15620 65 77 3b 0a 20 20 7d 0a 0a 20 20 69 46 72 61 6d  ew;.  }..  iFram
15630 65 20 3d 20 28 75 33 32 29 28 28 69 4f 66 66 2d  e = (u32)((iOff-
15640 33 32 29 20 2f 20 28 69 36 34 29 28 69 41 6d 74  32) / (i64)(iAmt
15650 2b 32 34 29 29 20 2b 20 31 3b 0a 20 20 69 66 28  +24)) + 1;.  if(
15660 20 70 52 62 75 2d 3e 69 4d 61 78 46 72 61 6d 65   pRbu->iMaxFrame
15670 3c 69 46 72 61 6d 65 20 29 20 70 52 62 75 2d 3e  <iFrame ) pRbu->
15680 69 4d 61 78 46 72 61 6d 65 20 3d 20 69 46 72 61  iMaxFrame = iFra
15690 6d 65 3b 0a 20 20 70 52 62 75 2d 3e 61 46 72 61  me;.  pRbu->aFra
156a0 6d 65 5b 70 52 62 75 2d 3e 6e 46 72 61 6d 65 5d  me[pRbu->nFrame]
156b0 2e 69 57 61 6c 46 72 61 6d 65 20 3d 20 69 46 72  .iWalFrame = iFr
156c0 61 6d 65 3b 0a 20 20 70 52 62 75 2d 3e 61 46 72  ame;.  pRbu->aFr
156d0 61 6d 65 5b 70 52 62 75 2d 3e 6e 46 72 61 6d 65  ame[pRbu->nFrame
156e0 5d 2e 69 44 62 50 61 67 65 20 3d 20 30 3b 0a 20  ].iDbPage = 0;. 
156f0 20 70 52 62 75 2d 3e 6e 46 72 61 6d 65 2b 2b 3b   pRbu->nFrame++;
15700 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
15710 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61  _OK;.}../*.** Ca
15720 6c 6c 65 64 20 77 68 65 6e 20 61 20 70 61 67 65  lled when a page
15730 20 6f 66 20 64 61 74 61 20 69 73 20 77 72 69 74   of data is writ
15740 74 65 6e 20 74 6f 20 6f 66 66 73 65 74 20 69 4f  ten to offset iO
15750 66 66 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ff of the databa
15760 73 65 0a 2a 2a 20 66 69 6c 65 20 77 68 69 6c 65  se.** file while
15770 20 74 68 65 20 72 62 75 20 68 61 6e 64 6c 65 20   the rbu handle 
15780 69 73 20 69 6e 20 63 61 70 74 75 72 65 20 6d 6f  is in capture mo
15790 64 65 2e 20 52 65 63 6f 72 64 20 74 68 65 20 70  de. Record the p
157a0 61 67 65 20 6e 75 6d 62 65 72 20 0a 2a 2a 20 6f  age number .** o
157b0 66 20 74 68 65 20 70 61 67 65 20 62 65 69 6e 67  f the page being
157c0 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68 65 20   written in the 
157d0 61 46 72 61 6d 65 5b 5d 20 61 72 72 61 79 2e 0a  aFrame[] array..
157e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62  */.static int rb
157f0 75 43 61 70 74 75 72 65 44 62 57 72 69 74 65 28  uCaptureDbWrite(
15800 73 71 6c 69 74 65 33 72 62 75 20 2a 70 52 62 75  sqlite3rbu *pRbu
15810 2c 20 69 36 34 20 69 4f 66 66 29 7b 0a 20 20 70  , i64 iOff){.  p
15820 52 62 75 2d 3e 61 46 72 61 6d 65 5b 70 52 62 75  Rbu->aFrame[pRbu
15830 2d 3e 6e 46 72 61 6d 65 2d 31 5d 2e 69 44 62 50  ->nFrame-1].iDbP
15840 61 67 65 20 3d 20 28 75 33 32 29 28 69 4f 66 66  age = (u32)(iOff
15850 20 2f 20 70 52 62 75 2d 3e 70 67 73 7a 29 20 2b   / pRbu->pgsz) +
15860 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   1;.  return SQL
15870 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
15880 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20   This is called 
15890 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20 69 6e  as part of an in
158a0 63 72 65 6d 65 6e 74 61 6c 20 63 68 65 63 6b 70  cremental checkp
158b0 6f 69 6e 74 20 6f 70 65 72 61 74 69 6f 6e 2e 20  oint operation. 
158c0 43 6f 70 79 0a 2a 2a 20 61 20 73 69 6e 67 6c 65  Copy.** a single
158d0 20 66 72 61 6d 65 20 6f 66 20 64 61 74 61 20 66   frame of data f
158e0 72 6f 6d 20 74 68 65 20 77 61 6c 20 66 69 6c 65  rom the wal file
158f0 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
15900 73 65 20 66 69 6c 65 2c 20 61 73 0a 2a 2a 20 69  se file, as.** i
15910 6e 64 69 63 61 74 65 64 20 62 79 20 74 68 65 20  ndicated by the 
15920 52 62 75 46 72 61 6d 65 20 6f 62 6a 65 63 74 2e  RbuFrame object.
15930 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
15940 72 62 75 43 68 65 63 6b 70 6f 69 6e 74 46 72 61  rbuCheckpointFra
15950 6d 65 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70  me(sqlite3rbu *p
15960 2c 20 52 62 75 46 72 61 6d 65 20 2a 70 46 72 61  , RbuFrame *pFra
15970 6d 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66  me){.  sqlite3_f
15980 69 6c 65 20 2a 70 57 61 6c 20 3d 20 70 2d 3e 70  ile *pWal = p->p
15990 54 61 72 67 65 74 46 64 2d 3e 70 57 61 6c 46 64  TargetFd->pWalFd
159a0 2d 3e 70 52 65 61 6c 3b 0a 20 20 73 71 6c 69 74  ->pReal;.  sqlit
159b0 65 33 5f 66 69 6c 65 20 2a 70 44 62 20 3d 20 70  e3_file *pDb = p
159c0 2d 3e 70 54 61 72 67 65 74 46 64 2d 3e 70 52 65  ->pTargetFd->pRe
159d0 61 6c 3b 0a 20 20 69 36 34 20 69 4f 66 66 3b 0a  al;.  i64 iOff;.
159e0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63  .  assert( p->rc
159f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
15a00 20 69 4f 66 66 20 3d 20 28 69 36 34 29 28 70 46   iOff = (i64)(pF
15a10 72 61 6d 65 2d 3e 69 57 61 6c 46 72 61 6d 65 2d  rame->iWalFrame-
15a20 31 29 20 2a 20 28 70 2d 3e 70 67 73 7a 20 2b 20  1) * (p->pgsz + 
15a30 32 34 29 20 2b 20 33 32 20 2b 20 32 34 3b 0a 20  24) + 32 + 24;. 
15a40 20 70 2d 3e 72 63 20 3d 20 70 57 61 6c 2d 3e 70   p->rc = pWal->p
15a50 4d 65 74 68 6f 64 73 2d 3e 78 52 65 61 64 28 70  Methods->xRead(p
15a60 57 61 6c 2c 20 70 2d 3e 61 42 75 66 2c 20 70 2d  Wal, p->aBuf, p-
15a70 3e 70 67 73 7a 2c 20 69 4f 66 66 29 3b 0a 20 20  >pgsz, iOff);.  
15a80 69 66 28 20 70 2d 3e 72 63 20 29 20 72 65 74 75  if( p->rc ) retu
15a90 72 6e 3b 0a 0a 20 20 69 4f 66 66 20 3d 20 28 69  rn;..  iOff = (i
15aa0 36 34 29 28 70 46 72 61 6d 65 2d 3e 69 44 62 50  64)(pFrame->iDbP
15ab0 61 67 65 2d 31 29 20 2a 20 70 2d 3e 70 67 73 7a  age-1) * p->pgsz
15ac0 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 70 44 62 2d  ;.  p->rc = pDb-
15ad0 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 57 72 69 74  >pMethods->xWrit
15ae0 65 28 70 44 62 2c 20 70 2d 3e 61 42 75 66 2c 20  e(pDb, p->aBuf, 
15af0 70 2d 3e 70 67 73 7a 2c 20 69 4f 66 66 29 3b 0a  p->pgsz, iOff);.
15b00 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 61 6b 65 20 61  }.../*.** Take a
15b10 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
15b20 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
15b30 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
15b40 20 76 6f 69 64 20 72 62 75 4c 6f 63 6b 44 61 74   void rbuLockDat
15b50 61 62 61 73 65 28 73 71 6c 69 74 65 33 72 62 75  abase(sqlite3rbu
15b60 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f   *p){.  sqlite3_
15b70 66 69 6c 65 20 2a 70 52 65 61 6c 20 3d 20 70 2d  file *pReal = p-
15b80 3e 70 54 61 72 67 65 74 46 64 2d 3e 70 52 65 61  >pTargetFd->pRea
15b90 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  l;.  assert( p->
15ba0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
15bb0 0a 20 20 70 2d 3e 72 63 20 3d 20 70 52 65 61 6c  .  p->rc = pReal
15bc0 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 4c 6f 63  ->pMethods->xLoc
15bd0 6b 28 70 52 65 61 6c 2c 20 53 51 4c 49 54 45 5f  k(pReal, SQLITE_
15be0 4c 4f 43 4b 5f 53 48 41 52 45 44 29 3b 0a 20 20  LOCK_SHARED);.  
15bf0 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
15c00 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d 3e 72  E_OK ){.    p->r
15c10 63 20 3d 20 70 52 65 61 6c 2d 3e 70 4d 65 74 68  c = pReal->pMeth
15c20 6f 64 73 2d 3e 78 4c 6f 63 6b 28 70 52 65 61 6c  ods->xLock(pReal
15c30 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 45 58  , SQLITE_LOCK_EX
15c40 43 4c 55 53 49 56 45 29 3b 0a 20 20 7d 0a 7d 0a  CLUSIVE);.  }.}.
15c50 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57 49  .#if defined(_WI
15c60 4e 33 32 5f 57 43 45 29 0a 73 74 61 74 69 63 20  N32_WCE).static 
15c70 4c 50 57 53 54 52 20 72 62 75 57 69 6e 55 74 66  LPWSTR rbuWinUtf
15c80 38 54 6f 55 6e 69 63 6f 64 65 28 63 6f 6e 73 74  8ToUnicode(const
15c90 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
15ca0 29 7b 0a 20 20 69 6e 74 20 6e 43 68 61 72 3b 0a  ){.  int nChar;.
15cb0 20 20 4c 50 57 53 54 52 20 7a 57 69 64 65 46 69    LPWSTR zWideFi
15cc0 6c 65 6e 61 6d 65 3b 0a 0a 20 20 6e 43 68 61 72  lename;..  nChar
15cd0 20 3d 20 4d 75 6c 74 69 42 79 74 65 54 6f 57 69   = MultiByteToWi
15ce0 64 65 43 68 61 72 28 43 50 5f 55 54 46 38 2c 20  deChar(CP_UTF8, 
15cf0 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31  0, zFilename, -1
15d00 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a 20 20 69 66  , NULL, 0);.  if
15d10 28 20 6e 43 68 61 72 3d 3d 30 20 29 7b 0a 20 20  ( nChar==0 ){.  
15d20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
15d30 20 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 20    zWideFilename 
15d40 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
15d50 36 34 28 20 6e 43 68 61 72 2a 73 69 7a 65 6f 66  64( nChar*sizeof
15d60 28 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 5b 30  (zWideFilename[0
15d70 5d 29 20 29 3b 0a 20 20 69 66 28 20 7a 57 69 64  ]) );.  if( zWid
15d80 65 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a  eFilename==0 ){.
15d90 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
15da0 7d 0a 20 20 6d 65 6d 73 65 74 28 7a 57 69 64 65  }.  memset(zWide
15db0 46 69 6c 65 6e 61 6d 65 2c 20 30 2c 20 6e 43 68  Filename, 0, nCh
15dc0 61 72 2a 73 69 7a 65 6f 66 28 7a 57 69 64 65 46  ar*sizeof(zWideF
15dd0 69 6c 65 6e 61 6d 65 5b 30 5d 29 29 3b 0a 20 20  ilename[0]));.  
15de0 6e 43 68 61 72 20 3d 20 4d 75 6c 74 69 42 79 74  nChar = MultiByt
15df0 65 54 6f 57 69 64 65 43 68 61 72 28 43 50 5f 55  eToWideChar(CP_U
15e00 54 46 38 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d  TF8, 0, zFilenam
15e10 65 2c 20 2d 31 2c 20 7a 57 69 64 65 46 69 6c 65  e, -1, zWideFile
15e20 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  name,.          
15e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e40 20 20 20 20 20 20 6e 43 68 61 72 29 3b 0a 20 20        nChar);.  
15e50 69 66 28 20 6e 43 68 61 72 3d 3d 30 20 29 7b 0a  if( nChar==0 ){.
15e60 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
15e70 28 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 29 3b  (zWideFilename);
15e80 0a 20 20 20 20 7a 57 69 64 65 46 69 6c 65 6e 61  .    zWideFilena
15e90 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  me = 0;.  }.  re
15ea0 74 75 72 6e 20 7a 57 69 64 65 46 69 6c 65 6e 61  turn zWideFilena
15eb0 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  me;.}.#endif../*
15ec0 0a 2a 2a 20 54 68 65 20 52 42 55 20 68 61 6e 64  .** The RBU hand
15ed0 6c 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  le is currently 
15ee0 69 6e 20 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c  in RBU_STAGE_OAL
15ef0 20 73 74 61 74 65 2c 20 77 69 74 68 20 61 20 53   state, with a S
15f00 48 41 52 45 44 20 6c 6f 63 6b 0a 2a 2a 20 6f 6e  HARED lock.** on
15f10 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
15f20 6c 65 2e 20 54 68 69 73 20 70 72 6f 63 20 6d 6f  le. This proc mo
15f30 76 65 73 20 74 68 65 20 2a 2d 6f 61 6c 20 66 69  ves the *-oal fi
15f40 6c 65 20 74 6f 20 74 68 65 20 2a 2d 77 61 6c 20  le to the *-wal 
15f50 70 61 74 68 2c 0a 2a 2a 20 74 68 65 6e 20 72 65  path,.** then re
15f60 6f 70 65 6e 73 20 74 68 65 20 64 61 74 61 62 61  opens the databa
15f70 73 65 20 66 69 6c 65 20 28 74 68 69 73 20 74 69  se file (this ti
15f80 6d 65 20 69 6e 20 76 61 6e 69 6c 6c 61 2c 20 6e  me in vanilla, n
15f90 6f 6e 2d 6f 61 6c 2c 20 57 41 4c 20 6d 6f 64 65  on-oal, WAL mode
15fa0 29 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  )..** If an erro
15fb0 72 20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65 20  r occurs, leave 
15fc0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e  an error code an
15fd0 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  d error message 
15fe0 69 6e 20 74 68 65 20 72 62 75 20 0a 2a 2a 20 68  in the rbu .** h
15ff0 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  andle..*/.static
16000 20 76 6f 69 64 20 72 62 75 4d 6f 76 65 4f 61 6c   void rbuMoveOal
16010 46 69 6c 65 28 73 71 6c 69 74 65 33 72 62 75 20  File(sqlite3rbu 
16020 2a 70 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  *p){.  const cha
16030 72 20 2a 7a 42 61 73 65 20 3d 20 73 71 6c 69 74  r *zBase = sqlit
16040 65 33 5f 64 62 5f 66 69 6c 65 6e 61 6d 65 28 70  e3_db_filename(p
16050 2d 3e 64 62 4d 61 69 6e 2c 20 22 6d 61 69 6e 22  ->dbMain, "main"
16060 29 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  );.  const char 
16070 2a 7a 4d 6f 76 65 20 3d 20 7a 42 61 73 65 3b 0a  *zMove = zBase;.
16080 20 20 63 68 61 72 20 2a 7a 4f 61 6c 3b 0a 20 20    char *zOal;.  
16090 63 68 61 72 20 2a 7a 57 61 6c 3b 0a 0a 20 20 69  char *zWal;..  i
160a0 66 28 20 72 62 75 49 73 56 61 63 75 75 6d 28 70  f( rbuIsVacuum(p
160b0 29 20 29 7b 0a 20 20 20 20 7a 4d 6f 76 65 20 3d  ) ){.    zMove =
160c0 20 73 71 6c 69 74 65 33 5f 64 62 5f 66 69 6c 65   sqlite3_db_file
160d0 6e 61 6d 65 28 70 2d 3e 64 62 52 62 75 2c 20 22  name(p->dbRbu, "
160e0 6d 61 69 6e 22 29 3b 0a 20 20 7d 0a 20 20 7a 4f  main");.  }.  zO
160f0 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  al = sqlite3_mpr
16100 69 6e 74 66 28 22 25 73 2d 6f 61 6c 22 2c 20 7a  intf("%s-oal", z
16110 4d 6f 76 65 29 3b 0a 20 20 7a 57 61 6c 20 3d 20  Move);.  zWal = 
16120 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
16130 22 25 73 2d 77 61 6c 22 2c 20 7a 4d 6f 76 65 29  "%s-wal", zMove)
16140 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ;..  assert( p->
16150 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47  eStage==RBU_STAG
16160 45 5f 4d 4f 56 45 20 29 3b 0a 20 20 61 73 73 65  E_MOVE );.  asse
16170 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rt( p->rc==SQLIT
16180 45 5f 4f 4b 20 26 26 20 70 2d 3e 7a 45 72 72 6d  E_OK && p->zErrm
16190 73 67 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 7a  sg==0 );.  if( z
161a0 57 61 6c 3d 3d 30 20 7c 7c 20 7a 4f 61 6c 3d 3d  Wal==0 || zOal==
161b0 30 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  0 ){.    p->rc =
161c0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
161d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4d   }else{.    /* M
161e0 6f 76 65 20 74 68 65 20 2a 2d 6f 61 6c 20 66 69  ove the *-oal fi
161f0 6c 65 20 74 6f 20 2a 2d 77 61 6c 2e 20 41 74 20  le to *-wal. At 
16200 74 68 69 73 20 70 6f 69 6e 74 20 63 6f 6e 6e 65  this point conne
16210 63 74 69 6f 6e 20 70 2d 3e 64 62 20 69 73 0a 20  ction p->db is. 
16220 20 20 20 2a 2a 20 68 6f 6c 64 69 6e 67 20 61 20     ** holding a 
16230 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SHARED lock on t
16240 68 65 20 74 61 72 67 65 74 20 64 61 74 61 62 61  he target databa
16250 73 65 20 66 69 6c 65 20 28 62 65 63 61 75 73 65  se file (because
16260 20 69 74 20 69 73 0a 20 20 20 20 2a 2a 20 69 6e   it is.    ** in
16270 20 57 41 4c 20 6d 6f 64 65 29 2e 20 53 6f 20 6e   WAL mode). So n
16280 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  o other connecti
16290 6f 6e 20 6d 61 79 20 62 65 20 77 72 69 74 69 6e  on may be writin
162a0 67 20 74 68 65 20 64 62 2e 20 0a 20 20 20 20 2a  g the db. .    *
162b0 2a 0a 20 20 20 20 2a 2a 20 49 6e 20 6f 72 64 65  *.    ** In orde
162c0 72 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74  r to ensure that
162d0 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 64 61   there are no da
162e0 74 61 62 61 73 65 20 72 65 61 64 65 72 73 2c 20  tabase readers, 
162f0 61 6e 20 45 58 43 4c 55 53 49 56 45 0a 20 20 20  an EXCLUSIVE.   
16300 20 2a 2a 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61   ** lock is obta
16310 69 6e 65 64 20 68 65 72 65 20 62 65 66 6f 72 65  ined here before
16320 20 74 68 65 20 2a 2d 6f 61 6c 20 69 73 20 6d 6f   the *-oal is mo
16330 76 65 64 20 74 6f 20 2a 2d 77 61 6c 2e 0a 20 20  ved to *-wal..  
16340 20 20 2a 2f 0a 20 20 20 20 72 62 75 4c 6f 63 6b    */.    rbuLock
16350 44 61 74 61 62 61 73 65 28 70 29 3b 0a 20 20 20  Database(p);.   
16360 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
16370 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
16380 62 75 46 69 6c 65 53 75 66 66 69 78 33 28 7a 42  buFileSuffix3(zB
16390 61 73 65 2c 20 7a 57 61 6c 29 3b 0a 20 20 20 20  ase, zWal);.    
163a0 20 20 72 62 75 46 69 6c 65 53 75 66 66 69 78 33    rbuFileSuffix3
163b0 28 7a 42 61 73 65 2c 20 7a 4f 61 6c 29 3b 0a 0a  (zBase, zOal);..
163c0 20 20 20 20 20 20 2f 2a 20 52 65 2d 6f 70 65 6e        /* Re-open
163d0 20 74 68 65 20 64 61 74 61 62 61 73 65 73 2e 20   the databases. 
163e0 2a 2f 0a 20 20 20 20 20 20 72 62 75 4f 62 6a 49  */.      rbuObjI
163f0 74 65 72 46 69 6e 61 6c 69 7a 65 28 26 70 2d 3e  terFinalize(&p->
16400 6f 62 6a 69 74 65 72 29 3b 0a 20 20 20 20 20 20  objiter);.      
16410 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 2d  sqlite3_close(p-
16420 3e 64 62 52 62 75 29 3b 0a 20 20 20 20 20 20 73  >dbRbu);.      s
16430 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 2d 3e  qlite3_close(p->
16440 64 62 4d 61 69 6e 29 3b 0a 20 20 20 20 20 20 70  dbMain);.      p
16450 2d 3e 64 62 4d 61 69 6e 20 3d 20 30 3b 0a 20 20  ->dbMain = 0;.  
16460 20 20 20 20 70 2d 3e 64 62 52 62 75 20 3d 20 30      p->dbRbu = 0
16470 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  ;..#if defined(_
16480 57 49 4e 33 32 5f 57 43 45 29 0a 20 20 20 20 20  WIN32_WCE).     
16490 20 7b 0a 20 20 20 20 20 20 20 20 4c 50 57 53 54   {.        LPWST
164a0 52 20 7a 57 69 64 65 4f 61 6c 3b 0a 20 20 20 20  R zWideOal;.    
164b0 20 20 20 20 4c 50 57 53 54 52 20 7a 57 69 64 65      LPWSTR zWide
164c0 57 61 6c 3b 0a 0a 20 20 20 20 20 20 20 20 7a 57  Wal;..        zW
164d0 69 64 65 4f 61 6c 20 3d 20 72 62 75 57 69 6e 55  ideOal = rbuWinU
164e0 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a 4f 61  tf8ToUnicode(zOa
164f0 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  l);.        if( 
16500 7a 57 69 64 65 4f 61 6c 20 29 7b 0a 20 20 20 20  zWideOal ){.    
16510 20 20 20 20 20 20 7a 57 69 64 65 57 61 6c 20 3d        zWideWal =
16520 20 72 62 75 57 69 6e 55 74 66 38 54 6f 55 6e 69   rbuWinUtf8ToUni
16530 63 6f 64 65 28 7a 57 61 6c 29 3b 0a 20 20 20 20  code(zWal);.    
16540 20 20 20 20 20 20 69 66 28 20 7a 57 69 64 65 57        if( zWideW
16550 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  al ){.          
16560 20 20 69 66 28 20 4d 6f 76 65 46 69 6c 65 57 28    if( MoveFileW(
16570 7a 57 69 64 65 4f 61 6c 2c 20 7a 57 69 64 65 57  zWideOal, zWideW
16580 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  al) ){.         
16590 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c       p->rc = SQL
165a0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
165b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
165c0 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d           p->rc =
165d0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
165e0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
165f0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
16600 5f 66 72 65 65 28 7a 57 69 64 65 57 61 6c 29 3b  _free(zWideWal);
16610 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
16620 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d  {.            p-
16630 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45  >rc = SQLITE_IOE
16640 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  RR_NOMEM;.      
16650 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
16660 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 57 69  sqlite3_free(zWi
16670 64 65 4f 61 6c 29 3b 0a 20 20 20 20 20 20 20 20  deOal);.        
16680 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
16690 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
166a0 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  IOERR_NOMEM;.   
166b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23       }.      }.#
166c0 65 6c 73 65 0a 20 20 20 20 20 20 70 2d 3e 72 63  else.      p->rc
166d0 20 3d 20 72 65 6e 61 6d 65 28 7a 4f 61 6c 2c 20   = rename(zOal, 
166e0 7a 57 61 6c 29 20 3f 20 53 51 4c 49 54 45 5f 49  zWal) ? SQLITE_I
166f0 4f 45 52 52 20 3a 20 53 51 4c 49 54 45 5f 4f 4b  OERR : SQLITE_OK
16700 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20  ;.#endif..      
16710 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
16720 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
16730 72 62 75 4f 70 65 6e 44 61 74 61 62 61 73 65 28  rbuOpenDatabase(
16740 70 29 3b 0a 20 20 20 20 20 20 20 20 72 62 75 53  p);.        rbuS
16750 65 74 75 70 43 68 65 63 6b 70 6f 69 6e 74 28 70  etupCheckpoint(p
16760 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
16770 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74    }.  }..  sqlit
16780 65 33 5f 66 72 65 65 28 7a 57 61 6c 29 3b 0a 20  e3_free(zWal);. 
16790 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f   sqlite3_free(zO
167a0 61 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  al);.}../*.** Th
167b0 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
167c0 6e 74 20 69 74 65 72 61 74 69 6e 67 20 74 68 72  nt iterating thr
167d0 6f 75 67 68 20 74 68 65 20 6b 65 79 73 20 66 6f  ough the keys fo
167e0 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 6f 62  r the current ob
167f0 6a 65 63 74 0a 2a 2a 20 28 70 2d 3e 6f 62 6a 69  ject.** (p->obji
16800 74 65 72 2e 70 53 65 6c 65 63 74 29 20 63 75 72  ter.pSelect) cur
16810 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f  rently points to
16820 20 61 20 76 61 6c 69 64 20 72 6f 77 2e 20 54 68   a valid row. Th
16830 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 64  is function.** d
16840 65 74 65 72 6d 69 6e 65 73 20 74 68 65 20 74 79  etermines the ty
16850 70 65 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 20  pe of operation 
16860 72 65 71 75 65 73 74 65 64 20 62 79 20 74 68 69  requested by thi
16870 73 20 72 6f 77 20 61 6e 64 20 72 65 74 75 72 6e  s row and return
16880 73 0a 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20  s.** one of the 
16890 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 6c 75 65 73  following values
168a0 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 65   to indicate the
168b0 20 72 65 73 75 6c 74 3a 0a 2a 2a 0a 2a 2a 20 20   result:.**.**  
168c0 20 20 20 2a 20 52 42 55 5f 49 4e 53 45 52 54 0a     * RBU_INSERT.
168d0 2a 2a 20 20 20 20 20 2a 20 52 42 55 5f 44 45 4c  **     * RBU_DEL
168e0 45 54 45 0a 2a 2a 20 20 20 20 20 2a 20 52 42 55  ETE.**     * RBU
168f0 5f 49 44 58 5f 44 45 4c 45 54 45 0a 2a 2a 20 20  _IDX_DELETE.**  
16900 20 20 20 2a 20 52 42 55 5f 55 50 44 41 54 45 0a     * RBU_UPDATE.
16910 2a 2a 0a 2a 2a 20 49 66 20 52 42 55 5f 55 50 44  **.** If RBU_UPD
16920 41 54 45 20 69 73 20 72 65 74 75 72 6e 65 64 2c  ATE is returned,
16930 20 74 68 65 6e 20 6f 75 74 70 75 74 20 76 61 72   then output var
16940 69 61 62 6c 65 20 2a 70 7a 4d 61 73 6b 20 69 73  iable *pzMask is
16950 20 73 65 74 20 74 6f 0a 2a 2a 20 70 6f 69 6e 74   set to.** point
16960 20 74 6f 20 74 68 65 20 74 65 78 74 20 76 61 6c   to the text val
16970 75 65 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68  ue indicating th
16980 65 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 75 70 64  e columns to upd
16990 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ate..**.** If th
169a0 65 20 72 62 75 5f 63 6f 6e 74 72 6f 6c 20 66 69  e rbu_control fi
169b0 65 6c 64 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20  eld contains an 
169c0 69 6e 76 61 6c 69 64 20 76 61 6c 75 65 2c 20 61  invalid value, a
169d0 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64  n error code and
169e0 0a 2a 2a 20 6d 65 73 73 61 67 65 20 61 72 65 20  .** message are 
169f0 6c 65 66 74 20 69 6e 20 74 68 65 20 52 42 55 20  left in the RBU 
16a00 68 61 6e 64 6c 65 20 61 6e 64 20 7a 65 72 6f 20  handle and zero 
16a10 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
16a20 74 69 63 20 69 6e 74 20 72 62 75 53 74 65 70 54  tic int rbuStepT
16a30 79 70 65 28 73 71 6c 69 74 65 33 72 62 75 20 2a  ype(sqlite3rbu *
16a40 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a  p, const char **
16a50 70 7a 4d 61 73 6b 29 7b 0a 20 20 69 6e 74 20 69  pzMask){.  int i
16a60 43 6f 6c 20 3d 20 70 2d 3e 6f 62 6a 69 74 65 72  Col = p->objiter
16a70 2e 6e 43 6f 6c 3b 20 20 20 20 20 2f 2a 20 49 6e  .nCol;     /* In
16a80 64 65 78 20 6f 66 20 72 62 75 5f 63 6f 6e 74 72  dex of rbu_contr
16a90 6f 6c 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69  ol column */.  i
16aa0 6e 74 20 72 65 73 20 3d 20 30 3b 20 20 20 20 20  nt res = 0;     
16ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16ac0 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a  * Return value *
16ad0 2f 0a 0a 20 20 73 77 69 74 63 68 28 20 73 71 6c  /..  switch( sql
16ae0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65  ite3_column_type
16af0 28 70 2d 3e 6f 62 6a 69 74 65 72 2e 70 53 65 6c  (p->objiter.pSel
16b00 65 63 74 2c 20 69 43 6f 6c 29 20 29 7b 0a 20 20  ect, iCol) ){.  
16b10 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e    case SQLITE_IN
16b20 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 69  TEGER: {.      i
16b30 6e 74 20 69 56 61 6c 20 3d 20 73 71 6c 69 74 65  nt iVal = sqlite
16b40 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 2d 3e  3_column_int(p->
16b50 6f 62 6a 69 74 65 72 2e 70 53 65 6c 65 63 74 2c  objiter.pSelect,
16b60 20 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 73 77   iCol);.      sw
16b70 69 74 63 68 28 20 69 56 61 6c 20 29 7b 0a 20 20  itch( iVal ){.  
16b80 20 20 20 20 20 20 63 61 73 65 20 30 3a 20 72 65        case 0: re
16b90 73 20 3d 20 52 42 55 5f 49 4e 53 45 52 54 3b 20  s = RBU_INSERT; 
16ba0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
16bb0 20 20 20 63 61 73 65 20 31 3a 20 72 65 73 20 3d     case 1: res =
16bc0 20 52 42 55 5f 44 45 4c 45 54 45 3b 20 20 20 20   RBU_DELETE;    
16bd0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
16be0 63 61 73 65 20 32 3a 20 72 65 73 20 3d 20 52 42  case 2: res = RB
16bf0 55 5f 52 45 50 4c 41 43 45 3b 20 20 20 20 62 72  U_REPLACE;    br
16c00 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73  eak;.        cas
16c10 65 20 33 3a 20 72 65 73 20 3d 20 52 42 55 5f 49  e 3: res = RBU_I
16c20 44 58 5f 44 45 4c 45 54 45 3b 20 62 72 65 61 6b  DX_DELETE; break
16c30 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 34  ;.        case 4
16c40 3a 20 72 65 73 20 3d 20 52 42 55 5f 49 44 58 5f  : res = RBU_IDX_
16c50 49 4e 53 45 52 54 3b 20 62 72 65 61 6b 3b 0a 20  INSERT; break;. 
16c60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
16c70 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63  ak;.    }..    c
16c80 61 73 65 20 53 51 4c 49 54 45 5f 54 45 58 54 3a  ase SQLITE_TEXT:
16c90 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75   {.      const u
16ca0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 20  nsigned char *z 
16cb0 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
16cc0 5f 74 65 78 74 28 70 2d 3e 6f 62 6a 69 74 65 72  _text(p->objiter
16cd0 2e 70 53 65 6c 65 63 74 2c 20 69 43 6f 6c 29 3b  .pSelect, iCol);
16ce0 0a 20 20 20 20 20 20 69 66 28 20 7a 3d 3d 30 20  .      if( z==0 
16cf0 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63  ){.        p->rc
16d00 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
16d10 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
16d20 20 20 20 20 20 20 2a 70 7a 4d 61 73 6b 20 3d 20        *pzMask = 
16d30 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a 3b 0a  (const char*)z;.
16d40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
16d50 73 20 3d 20 52 42 55 5f 55 50 44 41 54 45 3b 0a  s = RBU_UPDATE;.
16d60 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
16d70 20 20 7d 0a 0a 20 20 20 20 64 65 66 61 75 6c 74    }..    default
16d80 3a 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  :.      break;. 
16d90 20 7d 0a 0a 20 20 69 66 28 20 72 65 73 3d 3d 30   }..  if( res==0
16da0 20 29 7b 0a 20 20 20 20 72 62 75 42 61 64 43 6f   ){.    rbuBadCo
16db0 6e 74 72 6f 6c 45 72 72 6f 72 28 70 29 3b 0a 20  ntrolError(p);. 
16dc0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b   }.  return res;
16dd0 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
16de0 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 41 73  E_DEBUG./*.** As
16df0 73 65 72 74 20 74 68 61 74 20 63 6f 6c 75 6d 6e  sert that column
16e00 20 69 43 6f 6c 20 6f 66 20 73 74 61 74 65 6d 65   iCol of stateme
16e10 6e 74 20 70 53 74 6d 74 20 69 73 20 6e 61 6d 65  nt pStmt is name
16e20 64 20 7a 4e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74  d zName..*/.stat
16e30 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 43 6f  ic void assertCo
16e40 6c 75 6d 6e 4e 61 6d 65 28 73 71 6c 69 74 65 33  lumnName(sqlite3
16e50 5f 73 74 6d 74 20 2a 70 53 74 6d 74 2c 20 69 6e  _stmt *pStmt, in
16e60 74 20 69 43 6f 6c 2c 20 63 6f 6e 73 74 20 63 68  t iCol, const ch
16e70 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 63 6f  ar *zName){.  co
16e80 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 20 3d  nst char *zCol =
16e90 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
16ea0 6e 61 6d 65 28 70 53 74 6d 74 2c 20 69 43 6f 6c  name(pStmt, iCol
16eb0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d  );.  assert( 0==
16ec0 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
16ed0 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 20 29 3b 0a  zName, zCol) );.
16ee0 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
16ef0 20 61 73 73 65 72 74 43 6f 6c 75 6d 6e 4e 61 6d   assertColumnNam
16f00 65 28 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 0a  e(x,y,z).#endif.
16f10 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  ./*.** Argument 
16f20 65 54 79 70 65 20 6d 75 73 74 20 62 65 20 6f 6e  eType must be on
16f30 65 20 6f 66 20 52 42 55 5f 49 4e 53 45 52 54 2c  e of RBU_INSERT,
16f40 20 52 42 55 5f 44 45 4c 45 54 45 2c 20 52 42 55   RBU_DELETE, RBU
16f50 5f 49 44 58 5f 49 4e 53 45 52 54 20 6f 72 0a 2a  _IDX_INSERT or.*
16f60 2a 20 52 42 55 5f 49 44 58 5f 44 45 4c 45 54 45  * RBU_IDX_DELETE
16f70 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
16f80 70 65 72 66 6f 72 6d 73 20 74 68 65 20 77 6f 72  performs the wor
16f90 6b 20 6f 66 20 61 20 73 69 6e 67 6c 65 0a 2a 2a  k of a single.**
16fa0 20 73 71 6c 69 74 65 33 72 62 75 5f 73 74 65 70   sqlite3rbu_step
16fb0 28 29 20 63 61 6c 6c 20 66 6f 72 20 74 68 65 20  () call for the 
16fc0 74 79 70 65 20 6f 66 20 6f 70 65 72 61 74 69 6f  type of operatio
16fd0 6e 20 73 70 65 63 69 66 69 65 64 20 62 79 20 65  n specified by e
16fe0 54 79 70 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Type..*/.static 
16ff0 76 6f 69 64 20 72 62 75 53 74 65 70 4f 6e 65 4f  void rbuStepOneO
17000 70 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c  p(sqlite3rbu *p,
17010 20 69 6e 74 20 65 54 79 70 65 29 7b 0a 20 20 52   int eType){.  R
17020 62 75 4f 62 6a 49 74 65 72 20 2a 70 49 74 65 72  buObjIter *pIter
17030 20 3d 20 26 70 2d 3e 6f 62 6a 69 74 65 72 3b 0a   = &p->objiter;.
17040 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
17050 2a 70 56 61 6c 3b 0a 20 20 73 71 6c 69 74 65 33  *pVal;.  sqlite3
17060 5f 73 74 6d 74 20 2a 70 57 72 69 74 65 72 3b 0a  _stmt *pWriter;.
17070 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61 73 73 65    int i;..  asse
17080 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rt( p->rc==SQLIT
17090 45 5f 4f 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  E_OK );.  assert
170a0 28 20 65 54 79 70 65 21 3d 52 42 55 5f 44 45 4c  ( eType!=RBU_DEL
170b0 45 54 45 20 7c 7c 20 70 49 74 65 72 2d 3e 7a 49  ETE || pIter->zI
170c0 64 78 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  dx==0 );.  asser
170d0 74 28 20 65 54 79 70 65 3d 3d 52 42 55 5f 44 45  t( eType==RBU_DE
170e0 4c 45 54 45 20 7c 7c 20 65 54 79 70 65 3d 3d 52  LETE || eType==R
170f0 42 55 5f 49 44 58 5f 44 45 4c 45 54 45 0a 20 20  BU_IDX_DELETE.  
17100 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 52       || eType==R
17110 42 55 5f 49 4e 53 45 52 54 20 7c 7c 20 65 54 79  BU_INSERT || eTy
17120 70 65 3d 3d 52 42 55 5f 49 44 58 5f 49 4e 53 45  pe==RBU_IDX_INSE
17130 52 54 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  RT.  );..  /* If
17140 20 74 68 69 73 20 69 73 20 61 20 64 65 6c 65 74   this is a delet
17150 65 2c 20 64 65 63 72 65 6d 65 6e 74 20 6e 50 68  e, decrement nPh
17160 61 73 65 4f 6e 65 53 74 65 70 20 62 79 20 6e 49  aseOneStep by nI
17170 6e 64 65 78 2e 20 49 66 20 74 68 65 20 44 45 4c  ndex. If the DEL
17180 45 54 45 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65  ETE.  ** stateme
17190 6e 74 20 62 65 6c 6f 77 20 64 6f 65 73 20 61 63  nt below does ac
171a0 74 75 61 6c 6c 79 20 64 65 6c 65 74 65 20 61 20  tually delete a 
171b0 72 6f 77 2c 20 6e 50 68 61 73 65 4f 6e 65 53 74  row, nPhaseOneSt
171c0 65 70 20 77 69 6c 6c 20 62 65 0a 20 20 2a 2a 20  ep will be.  ** 
171d0 69 6e 63 72 65 6d 65 6e 74 65 64 20 62 79 20 74  incremented by t
171e0 68 65 20 73 61 6d 65 20 61 6d 6f 75 6e 74 20 77  he same amount w
171f0 68 65 6e 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  hen SQL function
17200 20 72 62 75 5f 74 6d 70 5f 69 6e 73 65 72 74 28   rbu_tmp_insert(
17210 29 0a 20 20 2a 2a 20 69 73 20 69 6e 76 6f 6b 65  ).  ** is invoke
17220 64 20 62 79 20 74 68 65 20 74 72 69 67 67 65 72  d by the trigger
17230 2e 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70  .  */.  if( eTyp
17240 65 3d 3d 52 42 55 5f 44 45 4c 45 54 45 20 29 7b  e==RBU_DELETE ){
17250 0a 20 20 20 20 70 2d 3e 6e 50 68 61 73 65 4f 6e  .    p->nPhaseOn
17260 65 53 74 65 70 20 2d 3d 20 70 2d 3e 6f 62 6a 69  eStep -= p->obji
17270 74 65 72 2e 6e 49 6e 64 65 78 3b 0a 20 20 7d 0a  ter.nIndex;.  }.
17280 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 52 42  .  if( eType==RB
17290 55 5f 49 44 58 5f 44 45 4c 45 54 45 20 7c 7c 20  U_IDX_DELETE || 
172a0 65 54 79 70 65 3d 3d 52 42 55 5f 44 45 4c 45 54  eType==RBU_DELET
172b0 45 20 29 7b 0a 20 20 20 20 70 57 72 69 74 65 72  E ){.    pWriter
172c0 20 3d 20 70 49 74 65 72 2d 3e 70 44 65 6c 65 74   = pIter->pDelet
172d0 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
172e0 70 57 72 69 74 65 72 20 3d 20 70 49 74 65 72 2d  pWriter = pIter-
172f0 3e 70 49 6e 73 65 72 74 3b 0a 20 20 7d 0a 0a 20  >pInsert;.  }.. 
17300 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65   for(i=0; i<pIte
17310 72 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  r->nCol; i++){. 
17320 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
17330 20 61 6e 20 49 4e 53 45 52 54 20 69 6e 74 6f 20   an INSERT into 
17340 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20 61  a table b-tree a
17350 6e 64 20 74 68 65 20 74 61 62 6c 65 20 68 61 73  nd the table has
17360 20 61 6e 0a 20 20 20 20 2a 2a 20 65 78 70 6c 69   an.    ** expli
17370 63 69 74 20 49 4e 54 45 47 45 52 20 50 52 49 4d  cit INTEGER PRIM
17380 41 52 59 20 4b 45 59 2c 20 63 68 65 63 6b 20 74  ARY KEY, check t
17390 68 61 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20  hat this is not 
173a0 61 6e 20 61 74 74 65 6d 70 74 0a 20 20 20 20 2a  an attempt.    *
173b0 2a 20 74 6f 20 77 72 69 74 65 20 61 20 4e 55 4c  * to write a NUL
173c0 4c 20 69 6e 74 6f 20 74 68 65 20 49 50 4b 20 63  L into the IPK c
173d0 6f 6c 75 6d 6e 2e 20 54 68 61 74 20 69 73 20 6e  olumn. That is n
173e0 6f 74 20 70 65 72 6d 69 74 74 65 64 2e 20 20 2a  ot permitted.  *
173f0 2f 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d  /.    if( eType=
17400 3d 52 42 55 5f 49 4e 53 45 52 54 20 0a 20 20 20  =RBU_INSERT .   
17410 20 20 26 26 20 70 49 74 65 72 2d 3e 7a 49 64 78    && pIter->zIdx
17420 3d 3d 30 20 26 26 20 70 49 74 65 72 2d 3e 65 54  ==0 && pIter->eT
17430 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 49 50 4b 20  ype==RBU_PK_IPK 
17440 26 26 20 70 49 74 65 72 2d 3e 61 62 54 62 6c 50  && pIter->abTblP
17450 6b 5b 69 5d 20 0a 20 20 20 20 20 26 26 20 73 71  k[i] .     && sq
17460 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70  lite3_column_typ
17470 65 28 70 49 74 65 72 2d 3e 70 53 65 6c 65 63 74  e(pIter->pSelect
17480 2c 20 69 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c  , i)==SQLITE_NUL
17490 4c 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70  L.    ){.      p
174a0 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4d 49  ->rc = SQLITE_MI
174b0 53 4d 41 54 43 48 3b 0a 20 20 20 20 20 20 70 2d  SMATCH;.      p-
174c0 3e 7a 45 72 72 6d 73 67 20 3d 20 73 71 6c 69 74  >zErrmsg = sqlit
174d0 65 33 5f 6d 70 72 69 6e 74 66 28 22 64 61 74 61  e3_mprintf("data
174e0 74 79 70 65 20 6d 69 73 6d 61 74 63 68 22 29 3b  type mismatch");
174f0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
17500 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 65 54     }..    if( eT
17510 79 70 65 3d 3d 52 42 55 5f 44 45 4c 45 54 45 20  ype==RBU_DELETE 
17520 26 26 20 70 49 74 65 72 2d 3e 61 62 54 62 6c 50  && pIter->abTblP
17530 6b 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  k[i]==0 ){.     
17540 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
17550 0a 0a 20 20 20 20 70 56 61 6c 20 3d 20 73 71 6c  ..    pVal = sql
17560 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75  ite3_column_valu
17570 65 28 70 49 74 65 72 2d 3e 70 53 65 6c 65 63 74  e(pIter->pSelect
17580 2c 20 69 29 3b 0a 20 20 20 20 70 2d 3e 72 63 20  , i);.    p->rc 
17590 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 76  = sqlite3_bind_v
175a0 61 6c 75 65 28 70 57 72 69 74 65 72 2c 20 69 2b  alue(pWriter, i+
175b0 31 2c 20 70 56 61 6c 29 3b 0a 20 20 20 20 69 66  1, pVal);.    if
175c0 28 20 70 2d 3e 72 63 20 29 20 72 65 74 75 72 6e  ( p->rc ) return
175d0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 74 65  ;.  }.  if( pIte
175e0 72 2d 3e 7a 49 64 78 3d 3d 30 20 29 7b 0a 20 20  r->zIdx==0 ){.  
175f0 20 20 69 66 28 20 70 49 74 65 72 2d 3e 65 54 79    if( pIter->eTy
17600 70 65 3d 3d 52 42 55 5f 50 4b 5f 56 54 41 42 20  pe==RBU_PK_VTAB 
17610 0a 20 20 20 20 20 7c 7c 20 70 49 74 65 72 2d 3e  .     || pIter->
17620 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 4e 4f  eType==RBU_PK_NO
17630 4e 45 20 0a 20 20 20 20 20 7c 7c 20 28 70 49 74  NE .     || (pIt
17640 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50  er->eType==RBU_P
17650 4b 5f 45 58 54 45 52 4e 41 4c 20 26 26 20 72 62  K_EXTERNAL && rb
17660 75 49 73 56 61 63 75 75 6d 28 70 29 29 20 0a 20  uIsVacuum(p)) . 
17670 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46     ){.      /* F
17680 6f 72 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  or a virtual tab
17690 6c 65 2c 20 6f 72 20 61 20 74 61 62 6c 65 20 77  le, or a table w
176a0 69 74 68 20 6e 6f 20 70 72 69 6d 61 72 79 20 6b  ith no primary k
176b0 65 79 2c 20 74 68 65 20 0a 20 20 20 20 20 20 2a  ey, the .      *
176c0 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
176d0 6e 74 20 69 73 3a 0a 20 20 20 20 20 20 2a 2a 0a  nt is:.      **.
176e0 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43        **   SELEC
176f0 54 20 3c 63 6f 6c 73 3e 2c 20 72 62 75 5f 63 6f  T <cols>, rbu_co
17700 6e 74 72 6f 6c 2c 20 72 62 75 5f 72 6f 77 69 64  ntrol, rbu_rowid
17710 20 46 52 4f 4d 20 2e 2e 2e 2e 0a 20 20 20 20 20   FROM .....     
17720 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 48 65 6e   **.      ** Hen
17730 63 65 20 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28  ce column_value(
17740 70 49 74 65 72 2d 3e 6e 43 6f 6c 2b 31 29 2e 0a  pIter->nCol+1)..
17750 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
17760 73 73 65 72 74 43 6f 6c 75 6d 6e 4e 61 6d 65 28  ssertColumnName(
17770 70 49 74 65 72 2d 3e 70 53 65 6c 65 63 74 2c 20  pIter->pSelect, 
17780 70 49 74 65 72 2d 3e 6e 43 6f 6c 2b 31 2c 20 0a  pIter->nCol+1, .
17790 20 20 20 20 20 20 20 20 20 20 72 62 75 49 73 56            rbuIsV
177a0 61 63 75 75 6d 28 70 29 20 3f 20 22 72 6f 77 69  acuum(p) ? "rowi
177b0 64 22 20 3a 20 22 72 62 75 5f 72 6f 77 69 64 22  d" : "rbu_rowid"
177c0 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
177d0 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63  pVal = sqlite3_c
177e0 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28 70 49 74 65  olumn_value(pIte
177f0 72 2d 3e 70 53 65 6c 65 63 74 2c 20 70 49 74 65  r->pSelect, pIte
17800 72 2d 3e 6e 43 6f 6c 2b 31 29 3b 0a 20 20 20 20  r->nCol+1);.    
17810 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65    p->rc = sqlite
17820 33 5f 62 69 6e 64 5f 76 61 6c 75 65 28 70 57 72  3_bind_value(pWr
17830 69 74 65 72 2c 20 70 49 74 65 72 2d 3e 6e 43 6f  iter, pIter->nCo
17840 6c 2b 31 2c 20 70 56 61 6c 29 3b 0a 20 20 20 20  l+1, pVal);.    
17850 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 72  }.  }.  if( p->r
17860 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
17870 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70      sqlite3_step
17880 28 70 57 72 69 74 65 72 29 3b 0a 20 20 20 20 70  (pWriter);.    p
17890 2d 3e 72 63 20 3d 20 72 65 73 65 74 41 6e 64 43  ->rc = resetAndC
178a0 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 57 72 69  ollectError(pWri
178b0 74 65 72 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67  ter, &p->zErrmsg
178c0 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
178d0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f  This function do
178e0 65 73 20 74 68 65 20 77 6f 72 6b 20 66 6f 72 20  es the work for 
178f0 61 6e 20 73 71 6c 69 74 65 33 72 62 75 5f 73 74  an sqlite3rbu_st
17900 65 70 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a  ep() call..**.**
17910 20 54 68 65 20 6f 62 6a 65 63 74 2d 69 74 65 72   The object-iter
17920 61 74 6f 72 20 28 70 2d 3e 6f 62 6a 69 74 65 72  ator (p->objiter
17930 29 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  ) currently poin
17940 74 73 20 74 6f 20 61 20 76 61 6c 69 64 20 6f 62  ts to a valid ob
17950 6a 65 63 74 2c 0a 2a 2a 20 61 6e 64 20 74 68 65  ject,.** and the
17960 20 69 6e 70 75 74 20 63 75 72 73 6f 72 20 28 70   input cursor (p
17970 2d 3e 6f 62 6a 69 74 65 72 2e 70 53 65 6c 65 63  ->objiter.pSelec
17980 74 29 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  t) currently poi
17990 6e 74 73 20 74 6f 20 61 20 76 61 6c 69 64 0a 2a  nts to a valid.*
179a0 2a 20 69 6e 70 75 74 20 72 6f 77 2e 20 50 65 72  * input row. Per
179b0 66 6f 72 6d 20 77 68 61 74 65 76 65 72 20 70 72  form whatever pr
179c0 6f 63 65 73 73 69 6e 67 20 69 73 20 72 65 71 75  ocessing is requ
179d0 69 72 65 64 20 61 6e 64 20 72 65 74 75 72 6e 2e  ired and return.
179e0 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 20 65 72  .**.** If no  er
179f0 72 6f 72 20 6f 63 63 75 72 73 2c 20 53 51 4c 49  ror occurs, SQLI
17a00 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
17a10 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e  d. Otherwise, an
17a20 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 61   error code.** a
17a30 6e 64 20 6d 65 73 73 61 67 65 20 69 73 20 6c 65  nd message is le
17a40 66 74 20 69 6e 20 74 68 65 20 52 42 55 20 68 61  ft in the RBU ha
17a50 6e 64 6c 65 20 61 6e 64 20 61 20 63 6f 70 79 20  ndle and a copy 
17a60 6f 66 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  of the error cod
17a70 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e.** returned..*
17a80 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62 75  /.static int rbu
17a90 53 74 65 70 28 73 71 6c 69 74 65 33 72 62 75 20  Step(sqlite3rbu 
17aa0 2a 70 29 7b 0a 20 20 52 62 75 4f 62 6a 49 74 65  *p){.  RbuObjIte
17ab0 72 20 2a 70 49 74 65 72 20 3d 20 26 70 2d 3e 6f  r *pIter = &p->o
17ac0 62 6a 69 74 65 72 3b 0a 20 20 63 6f 6e 73 74 20  bjiter;.  const 
17ad0 63 68 61 72 20 2a 7a 4d 61 73 6b 20 3d 20 30 3b  char *zMask = 0;
17ae0 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20 72  .  int eType = r
17af0 62 75 53 74 65 70 54 79 70 65 28 70 2c 20 26 7a  buStepType(p, &z
17b00 4d 61 73 6b 29 3b 0a 0a 20 20 69 66 28 20 65 54  Mask);..  if( eT
17b10 79 70 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ype ){.    asser
17b20 74 28 20 65 54 79 70 65 3d 3d 52 42 55 5f 49 4e  t( eType==RBU_IN
17b30 53 45 52 54 20 20 20 20 20 7c 7c 20 65 54 79 70  SERT     || eTyp
17b40 65 3d 3d 52 42 55 5f 44 45 4c 45 54 45 0a 20 20  e==RBU_DELETE.  
17b50 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d         || eType=
17b60 3d 52 42 55 5f 52 45 50 4c 41 43 45 20 20 20 20  =RBU_REPLACE    
17b70 7c 7c 20 65 54 79 70 65 3d 3d 52 42 55 5f 49 44  || eType==RBU_ID
17b80 58 5f 44 45 4c 45 54 45 0a 20 20 20 20 20 20 20  X_DELETE.       
17b90 20 20 7c 7c 20 65 54 79 70 65 3d 3d 52 42 55 5f    || eType==RBU_
17ba0 49 44 58 5f 49 4e 53 45 52 54 20 7c 7c 20 65 54  IDX_INSERT || eT
17bb0 79 70 65 3d 3d 52 42 55 5f 55 50 44 41 54 45 0a  ype==RBU_UPDATE.
17bc0 20 20 20 20 29 3b 0a 20 20 20 20 61 73 73 65 72      );.    asser
17bd0 74 28 20 65 54 79 70 65 21 3d 52 42 55 5f 55 50  t( eType!=RBU_UP
17be0 44 41 54 45 20 7c 7c 20 70 49 74 65 72 2d 3e 7a  DATE || pIter->z
17bf0 49 64 78 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 69  Idx==0 );..    i
17c00 66 28 20 70 49 74 65 72 2d 3e 7a 49 64 78 3d 3d  f( pIter->zIdx==
17c10 30 20 26 26 20 28 65 54 79 70 65 3d 3d 52 42 55  0 && (eType==RBU
17c20 5f 49 44 58 5f 44 45 4c 45 54 45 20 7c 7c 20 65  _IDX_DELETE || e
17c30 54 79 70 65 3d 3d 52 42 55 5f 49 44 58 5f 49 4e  Type==RBU_IDX_IN
17c40 53 45 52 54 29 20 29 7b 0a 20 20 20 20 20 20 72  SERT) ){.      r
17c50 62 75 42 61 64 43 6f 6e 74 72 6f 6c 45 72 72 6f  buBadControlErro
17c60 72 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  r(p);.    }.    
17c70 65 6c 73 65 20 69 66 28 20 65 54 79 70 65 3d 3d  else if( eType==
17c80 52 42 55 5f 52 45 50 4c 41 43 45 20 29 7b 0a 20  RBU_REPLACE ){. 
17c90 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e       if( pIter->
17ca0 7a 49 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  zIdx==0 ){.     
17cb0 20 20 20 70 2d 3e 6e 50 68 61 73 65 4f 6e 65 53     p->nPhaseOneS
17cc0 74 65 70 20 2b 3d 20 70 2d 3e 6f 62 6a 69 74 65  tep += p->objite
17cd0 72 2e 6e 49 6e 64 65 78 3b 0a 20 20 20 20 20 20  r.nIndex;.      
17ce0 20 20 72 62 75 53 74 65 70 4f 6e 65 4f 70 28 70    rbuStepOneOp(p
17cf0 2c 20 52 42 55 5f 44 45 4c 45 54 45 29 3b 0a 20  , RBU_DELETE);. 
17d00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
17d10 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
17d20 4b 20 29 20 72 62 75 53 74 65 70 4f 6e 65 4f 70  K ) rbuStepOneOp
17d30 28 70 2c 20 52 42 55 5f 49 4e 53 45 52 54 29 3b  (p, RBU_INSERT);
17d40 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20  .    }.    else 
17d50 69 66 28 20 65 54 79 70 65 21 3d 52 42 55 5f 55  if( eType!=RBU_U
17d60 50 44 41 54 45 20 29 7b 0a 20 20 20 20 20 20 72  PDATE ){.      r
17d70 62 75 53 74 65 70 4f 6e 65 4f 70 28 70 2c 20 65  buStepOneOp(p, e
17d80 54 79 70 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Type);.    }.   
17d90 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c   else{.      sql
17da0 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c  ite3_value *pVal
17db0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
17dc0 73 74 6d 74 20 2a 70 55 70 64 61 74 65 20 3d 20  stmt *pUpdate = 
17dd0 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  0;.      assert(
17de0 20 65 54 79 70 65 3d 3d 52 42 55 5f 55 50 44 41   eType==RBU_UPDA
17df0 54 45 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 6e  TE );.      p->n
17e00 50 68 61 73 65 4f 6e 65 53 74 65 70 20 2d 3d 20  PhaseOneStep -= 
17e10 70 2d 3e 6f 62 6a 69 74 65 72 2e 6e 49 6e 64 65  p->objiter.nInde
17e20 78 3b 0a 20 20 20 20 20 20 72 62 75 47 65 74 55  x;.      rbuGetU
17e30 70 64 61 74 65 53 74 6d 74 28 70 2c 20 70 49 74  pdateStmt(p, pIt
17e40 65 72 2c 20 7a 4d 61 73 6b 2c 20 26 70 55 70 64  er, zMask, &pUpd
17e50 61 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ate);.      if( 
17e60 70 55 70 64 61 74 65 20 29 7b 0a 20 20 20 20 20  pUpdate ){.     
17e70 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
17e80 20 20 66 6f 72 28 69 3d 30 3b 20 70 2d 3e 72 63    for(i=0; p->rc
17e90 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
17ea0 3c 70 49 74 65 72 2d 3e 6e 43 6f 6c 3b 20 69 2b  <pIter->nCol; i+
17eb0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 68  +){.          ch
17ec0 61 72 20 63 20 3d 20 7a 4d 61 73 6b 5b 70 49 74  ar c = zMask[pIt
17ed0 65 72 2d 3e 61 69 53 72 63 4f 72 64 65 72 5b 69  er->aiSrcOrder[i
17ee0 5d 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 70 56  ]];.          pV
17ef0 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  al = sqlite3_col
17f00 75 6d 6e 5f 76 61 6c 75 65 28 70 49 74 65 72 2d  umn_value(pIter-
17f10 3e 70 53 65 6c 65 63 74 2c 20 69 29 3b 0a 20 20  >pSelect, i);.  
17f20 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65          if( pIte
17f30 72 2d 3e 61 62 54 62 6c 50 6b 5b 69 5d 20 7c 7c  r->abTblPk[i] ||
17f40 20 63 21 3d 27 2e 27 20 29 7b 0a 20 20 20 20 20   c!='.' ){.     
17f50 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73         p->rc = s
17f60 71 6c 69 74 65 33 5f 62 69 6e 64 5f 76 61 6c 75  qlite3_bind_valu
17f70 65 28 70 55 70 64 61 74 65 2c 20 69 2b 31 2c 20  e(pUpdate, i+1, 
17f80 70 56 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 20  pVal);.         
17f90 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
17fa0 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
17fb0 53 51 4c 49 54 45 5f 4f 4b 20 0a 20 20 20 20 20  SQLITE_OK .     
17fc0 20 20 20 20 26 26 20 28 70 49 74 65 72 2d 3e 65      && (pIter->e
17fd0 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 56 54 41  Type==RBU_PK_VTA
17fe0 42 20 7c 7c 20 70 49 74 65 72 2d 3e 65 54 79 70  B || pIter->eTyp
17ff0 65 3d 3d 52 42 55 5f 50 4b 5f 4e 4f 4e 45 29 20  e==RBU_PK_NONE) 
18000 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
18010 20 20 20 20 20 20 2f 2a 20 42 69 6e 64 20 74 68        /* Bind th
18020 65 20 72 62 75 5f 72 6f 77 69 64 20 76 61 6c 75  e rbu_rowid valu
18030 65 20 74 6f 20 63 6f 6c 75 6d 6e 20 5f 72 6f 77  e to column _row
18040 69 64 5f 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  id_ */.         
18050 20 61 73 73 65 72 74 43 6f 6c 75 6d 6e 4e 61 6d   assertColumnNam
18060 65 28 70 49 74 65 72 2d 3e 70 53 65 6c 65 63 74  e(pIter->pSelect
18070 2c 20 70 49 74 65 72 2d 3e 6e 43 6f 6c 2b 31 2c  , pIter->nCol+1,
18080 20 22 72 62 75 5f 72 6f 77 69 64 22 29 3b 0a 20   "rbu_rowid");. 
18090 20 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20           pVal = 
180a0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 76  sqlite3_column_v
180b0 61 6c 75 65 28 70 49 74 65 72 2d 3e 70 53 65 6c  alue(pIter->pSel
180c0 65 63 74 2c 20 70 49 74 65 72 2d 3e 6e 43 6f 6c  ect, pIter->nCol
180d0 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  +1);.          p
180e0 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62  ->rc = sqlite3_b
180f0 69 6e 64 5f 76 61 6c 75 65 28 70 55 70 64 61 74  ind_value(pUpdat
18100 65 2c 20 70 49 74 65 72 2d 3e 6e 43 6f 6c 2b 31  e, pIter->nCol+1
18110 2c 20 70 56 61 6c 29 3b 0a 20 20 20 20 20 20 20  , pVal);.       
18120 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
18130 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
18140 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
18150 69 74 65 33 5f 73 74 65 70 28 70 55 70 64 61 74  ite3_step(pUpdat
18160 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d  e);.          p-
18170 3e 72 63 20 3d 20 72 65 73 65 74 41 6e 64 43 6f  >rc = resetAndCo
18180 6c 6c 65 63 74 45 72 72 6f 72 28 70 55 70 64 61  llectError(pUpda
18190 74 65 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 29  te, &p->zErrmsg)
181a0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
181b0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
181c0 72 65 74 75 72 6e 20 70 2d 3e 72 63 3b 0a 7d 0a  return p->rc;.}.
181d0 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74  ./*.** Increment
181e0 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b   the schema cook
181f0 69 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 64  ie of the main d
18200 61 74 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62  atabase opened b
18210 79 20 70 2d 3e 64 62 4d 61 69 6e 2e 0a 2a 2a 0a  y p->dbMain..**.
18220 2a 2a 20 4f 72 2c 20 69 66 20 74 68 69 73 20 69  ** Or, if this i
18230 73 20 61 6e 20 52 42 55 20 76 61 63 75 75 6d 2c  s an RBU vacuum,
18240 20 73 65 74 20 74 68 65 20 73 63 68 65 6d 61 20   set the schema 
18250 63 6f 6f 6b 69 65 20 6f 66 20 74 68 65 20 6d 61  cookie of the ma
18260 69 6e 20 64 62 0a 2a 2a 20 6f 70 65 6e 65 64 20  in db.** opened 
18270 62 79 20 70 2d 3e 64 62 4d 61 69 6e 20 74 6f 20  by p->dbMain to 
18280 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 20 74 68  one more than th
18290 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20  e schema cookie 
182a0 6f 66 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 64  of the main.** d
182b0 62 20 6f 70 65 6e 65 64 20 62 79 20 70 2d 3e 64  b opened by p->d
182c0 62 52 62 75 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  bRbu..*/.static 
182d0 76 6f 69 64 20 72 62 75 49 6e 63 72 53 63 68 65  void rbuIncrSche
182e0 6d 61 43 6f 6f 6b 69 65 28 73 71 6c 69 74 65 33  maCookie(sqlite3
182f0 72 62 75 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  rbu *p){.  if( p
18300 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
18310 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a  ){.    sqlite3 *
18320 64 62 72 65 61 64 20 3d 20 28 72 62 75 49 73 56  dbread = (rbuIsV
18330 61 63 75 75 6d 28 70 29 20 3f 20 70 2d 3e 64 62  acuum(p) ? p->db
18340 52 62 75 20 3a 20 70 2d 3e 64 62 4d 61 69 6e 29  Rbu : p->dbMain)
18350 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6f 6b 69  ;.    int iCooki
18360 65 20 3d 20 31 30 30 30 30 30 30 3b 0a 20 20 20  e = 1000000;.   
18370 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
18380 53 74 6d 74 3b 0a 0a 20 20 20 20 70 2d 3e 72 63  Stmt;..    p->rc
18390 20 3d 20 70 72 65 70 61 72 65 41 6e 64 43 6f 6c   = prepareAndCol
183a0 6c 65 63 74 45 72 72 6f 72 28 64 62 72 65 61 64  lectError(dbread
183b0 2c 20 26 70 53 74 6d 74 2c 20 26 70 2d 3e 7a 45  , &pStmt, &p->zE
183c0 72 72 6d 73 67 2c 20 0a 20 20 20 20 20 20 20 20  rrmsg, .        
183d0 22 50 52 41 47 4d 41 20 73 63 68 65 6d 61 5f 76  "PRAGMA schema_v
183e0 65 72 73 69 6f 6e 22 0a 20 20 20 20 29 3b 0a 20  ersion".    );. 
183f0 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
18400 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
18410 20 2f 2a 20 43 6f 76 65 72 61 67 65 3a 20 69 74   /* Coverage: it
18420 20 6d 61 79 20 62 65 20 74 68 61 74 20 74 68 69   may be that thi
18430 73 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  s sqlite3_step()
18440 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 54 68   cannot fail. Th
18450 65 72 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  ere.      ** is 
18460 61 6c 72 65 61 64 79 20 61 20 74 72 61 6e 73 61  already a transa
18470 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 73 6f 20 74  ction open, so t
18480 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
18490 65 6d 65 6e 74 20 63 61 6e 6e 6f 74 0a 20 20 20  ement cannot.   
184a0 20 20 20 2a 2a 20 74 68 72 6f 77 20 61 6e 20 53     ** throw an S
184b0 51 4c 49 54 45 5f 53 43 48 45 4d 41 20 65 78 63  QLITE_SCHEMA exc
184c0 65 70 74 69 6f 6e 2e 20 54 68 65 20 6f 6e 6c 79  eption. The only
184d0 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 74   database page t
184e0 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74  he.      ** stat
184f0 65 6d 65 6e 74 20 72 65 61 64 73 20 69 73 20 70  ement reads is p
18500 61 67 65 20 31 2c 20 77 68 69 63 68 20 69 73 20  age 1, which is 
18510 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65  guaranteed to be
18520 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e 0a 20   in the cache.. 
18530 20 20 20 20 20 2a 2a 20 41 6e 64 20 6e 6f 20 6d       ** And no m
18540 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
18550 73 20 61 72 65 20 72 65 71 75 69 72 65 64 2e 20  s are required. 
18560 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 53 51   */.      if( SQ
18570 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65  LITE_ROW==sqlite
18580 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b  3_step(pStmt) ){
18590 0a 20 20 20 20 20 20 20 20 69 43 6f 6f 6b 69 65  .        iCookie
185a0 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
185b0 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b  n_int(pStmt, 0);
185c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
185d0 62 75 46 69 6e 61 6c 69 7a 65 28 70 2c 20 70 53  buFinalize(p, pS
185e0 74 6d 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  tmt);.    }.    
185f0 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
18600 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 62  E_OK ){.      rb
18610 75 4d 50 72 69 6e 74 66 45 78 65 63 28 70 2c 20  uMPrintfExec(p, 
18620 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 50 52 41 47  p->dbMain, "PRAG
18630 4d 41 20 73 63 68 65 6d 61 5f 76 65 72 73 69 6f  MA schema_versio
18640 6e 20 3d 20 25 64 22 2c 20 69 43 6f 6f 6b 69 65  n = %d", iCookie
18650 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  +1);.    }.  }.}
18660 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74  ../*.** Update t
18670 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
18680 68 65 20 72 62 75 5f 73 74 61 74 65 20 74 61 62  he rbu_state tab
18690 6c 65 20 77 69 74 68 69 6e 20 74 68 65 20 72 62  le within the rb
186a0 75 20 64 61 74 61 62 61 73 65 2e 20 54 68 65 0a  u database. The.
186b0 2a 2a 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20  ** value stored 
186c0 69 6e 20 74 68 65 20 52 42 55 5f 53 54 41 54 45  in the RBU_STATE
186d0 5f 53 54 41 47 45 20 63 6f 6c 75 6d 6e 20 69 73  _STAGE column is
186e0 20 65 53 74 61 67 65 2e 20 41 6c 6c 20 6f 74 68   eStage. All oth
186f0 65 72 20 76 61 6c 75 65 73 0a 2a 2a 20 61 72 65  er values.** are
18700 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 69   determined by i
18710 6e 73 70 65 63 74 69 6e 67 20 74 68 65 20 72 62  nspecting the rb
18720 75 20 68 61 6e 64 6c 65 20 70 61 73 73 65 64 20  u handle passed 
18730 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
18740 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ument..*/.static
18750 20 76 6f 69 64 20 72 62 75 53 61 76 65 53 74 61   void rbuSaveSta
18760 74 65 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70  te(sqlite3rbu *p
18770 2c 20 69 6e 74 20 65 53 74 61 67 65 29 7b 0a 20  , int eStage){. 
18780 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
18790 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d  TE_OK || p->rc==
187a0 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20  SQLITE_DONE ){. 
187b0 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20     sqlite3_stmt 
187c0 2a 70 49 6e 73 65 72 74 20 3d 20 30 3b 0a 20 20  *pInsert = 0;.  
187d0 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 46 64 20    rbu_file *pFd 
187e0 3d 20 28 72 62 75 49 73 56 61 63 75 75 6d 28 70  = (rbuIsVacuum(p
187f0 29 20 3f 20 70 2d 3e 70 52 62 75 46 64 20 3a 20  ) ? p->pRbuFd : 
18800 70 2d 3e 70 54 61 72 67 65 74 46 64 29 3b 0a 20  p->pTargetFd);. 
18810 20 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 20 20     int rc;..    
18820 61 73 73 65 72 74 28 20 70 2d 3e 7a 45 72 72 6d  assert( p->zErrm
18830 73 67 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20  sg==0 );.    rc 
18840 3d 20 70 72 65 70 61 72 65 46 72 65 65 41 6e 64  = prepareFreeAnd
18850 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e  CollectError(p->
18860 64 62 52 62 75 2c 20 26 70 49 6e 73 65 72 74 2c  dbRbu, &pInsert,
18870 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 20 0a 20   &p->zErrmsg, . 
18880 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d         sqlite3_m
18890 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  printf(.        
188a0 20 20 22 49 4e 53 45 52 54 20 4f 52 20 52 45 50    "INSERT OR REP
188b0 4c 41 43 45 20 49 4e 54 4f 20 25 73 2e 72 62 75  LACE INTO %s.rbu
188c0 5f 73 74 61 74 65 28 6b 2c 20 76 29 20 56 41 4c  _state(k, v) VAL
188d0 55 45 53 20 22 0a 20 20 20 20 20 20 20 20 20 20  UES ".          
188e0 22 28 25 64 2c 20 25 64 29 2c 20 22 0a 20 20 20  "(%d, %d), ".   
188f0 20 20 20 20 20 20 20 22 28 25 64 2c 20 25 51 29         "(%d, %Q)
18900 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 22 28  , ".          "(
18910 25 64 2c 20 25 51 29 2c 20 22 0a 20 20 20 20 20  %d, %Q), ".     
18920 20 20 20 20 20 22 28 25 64 2c 20 25 64 29 2c 20       "(%d, %d), 
18930 22 0a 20 20 20 20 20 20 20 20 20 20 22 28 25 64  ".          "(%d
18940 2c 20 25 64 29 2c 20 22 0a 20 20 20 20 20 20 20  , %d), ".       
18950 20 20 20 22 28 25 64 2c 20 25 6c 6c 64 29 2c 20     "(%d, %lld), 
18960 22 0a 20 20 20 20 20 20 20 20 20 20 22 28 25 64  ".          "(%d
18970 2c 20 25 6c 6c 64 29 2c 20 22 0a 20 20 20 20 20  , %lld), ".     
18980 20 20 20 20 20 22 28 25 64 2c 20 25 6c 6c 64 29       "(%d, %lld)
18990 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 22 28  , ".          "(
189a0 25 64 2c 20 25 6c 6c 64 29 20 22 2c 0a 20 20 20  %d, %lld) ",.   
189b0 20 20 20 20 20 20 20 70 2d 3e 7a 53 74 61 74 65         p->zState
189c0 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 52 42  Db,.          RB
189d0 55 5f 53 54 41 54 45 5f 53 54 41 47 45 2c 20 65  U_STATE_STAGE, e
189e0 53 74 61 67 65 2c 0a 20 20 20 20 20 20 20 20 20  Stage,.         
189f0 20 52 42 55 5f 53 54 41 54 45 5f 54 42 4c 2c 20   RBU_STATE_TBL, 
18a00 70 2d 3e 6f 62 6a 69 74 65 72 2e 7a 54 62 6c 2c  p->objiter.zTbl,
18a10 20 0a 20 20 20 20 20 20 20 20 20 20 52 42 55 5f   .          RBU_
18a20 53 54 41 54 45 5f 49 44 58 2c 20 70 2d 3e 6f 62  STATE_IDX, p->ob
18a30 6a 69 74 65 72 2e 7a 49 64 78 2c 20 0a 20 20 20  jiter.zIdx, .   
18a40 20 20 20 20 20 20 20 52 42 55 5f 53 54 41 54 45         RBU_STATE
18a50 5f 52 4f 57 2c 20 70 2d 3e 6e 53 74 65 70 2c 20  _ROW, p->nStep, 
18a60 0a 20 20 20 20 20 20 20 20 20 20 52 42 55 5f 53  .          RBU_S
18a70 54 41 54 45 5f 50 52 4f 47 52 45 53 53 2c 20 70  TATE_PROGRESS, p
18a80 2d 3e 6e 50 72 6f 67 72 65 73 73 2c 0a 20 20 20  ->nProgress,.   
18a90 20 20 20 20 20 20 20 52 42 55 5f 53 54 41 54 45         RBU_STATE
18aa0 5f 43 4b 50 54 2c 20 70 2d 3e 69 57 61 6c 43 6b  _CKPT, p->iWalCk
18ab0 73 75 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 52  sum,.          R
18ac0 42 55 5f 53 54 41 54 45 5f 43 4f 4f 4b 49 45 2c  BU_STATE_COOKIE,
18ad0 20 28 69 36 34 29 70 46 64 2d 3e 69 43 6f 6f 6b   (i64)pFd->iCook
18ae0 69 65 2c 0a 20 20 20 20 20 20 20 20 20 20 52 42  ie,.          RB
18af0 55 5f 53 54 41 54 45 5f 4f 41 4c 53 5a 2c 20 70  U_STATE_OALSZ, p
18b00 2d 3e 69 4f 61 6c 53 7a 2c 0a 20 20 20 20 20 20  ->iOalSz,.      
18b10 20 20 20 20 52 42 55 5f 53 54 41 54 45 5f 50 48      RBU_STATE_PH
18b20 41 53 45 4f 4e 45 53 54 45 50 2c 20 70 2d 3e 6e  ASEONESTEP, p->n
18b30 50 68 61 73 65 4f 6e 65 53 74 65 70 0a 20 20 20  PhaseOneStep.   
18b40 20 20 20 29 0a 20 20 20 20 29 3b 0a 20 20 20 20     ).    );.    
18b50 61 73 73 65 72 74 28 20 70 49 6e 73 65 72 74 3d  assert( pInsert=
18b60 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  =0 || rc==SQLITE
18b70 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 69 66 28 20  _OK );..    if( 
18b80 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
18b90 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
18ba0 74 65 70 28 70 49 6e 73 65 72 74 29 3b 0a 20 20  tep(pInsert);.  
18bb0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
18bc0 5f 66 69 6e 61 6c 69 7a 65 28 70 49 6e 73 65 72  _finalize(pInser
18bd0 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  t);.    }.    if
18be0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
18bf0 29 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20  ) p->rc = rc;.  
18c00 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70  }.}.../*.** Step
18c10 20 74 68 65 20 52 42 55 20 6f 62 6a 65 63 74 2e   the RBU object.
18c20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 72  .*/.int sqlite3r
18c30 62 75 5f 73 74 65 70 28 73 71 6c 69 74 65 33 72  bu_step(sqlite3r
18c40 62 75 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20  bu *p){.  if( p 
18c50 29 7b 0a 20 20 20 20 73 77 69 74 63 68 28 20 70  ){.    switch( p
18c60 2d 3e 65 53 74 61 67 65 20 29 7b 0a 20 20 20 20  ->eStage ){.    
18c70 20 20 63 61 73 65 20 52 42 55 5f 53 54 41 47 45    case RBU_STAGE
18c80 5f 4f 41 4c 3a 20 7b 0a 20 20 20 20 20 20 20 20  _OAL: {.        
18c90 52 62 75 4f 62 6a 49 74 65 72 20 2a 70 49 74 65  RbuObjIter *pIte
18ca0 72 20 3d 20 26 70 2d 3e 6f 62 6a 69 74 65 72 3b  r = &p->objiter;
18cb0 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
18cc0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
18cd0 20 26 26 20 70 49 74 65 72 2d 3e 7a 54 62 6c 20   && pIter->zTbl 
18ce0 29 7b 0a 0a 20 20 20 20 20 20 20 20 20 20 69 66  ){..          if
18cf0 28 20 70 49 74 65 72 2d 3e 62 43 6c 65 61 6e 75  ( pIter->bCleanu
18d00 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  p ){.           
18d10 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 74 68 65   /* Clean up the
18d20 20 72 62 75 5f 74 6d 70 5f 78 78 78 20 74 61 62   rbu_tmp_xxx tab
18d30 6c 65 20 66 6f 72 20 74 68 65 20 70 72 65 76 69  le for the previ
18d40 6f 75 73 20 74 61 62 6c 65 2e 20 49 74 20 0a 20  ous table. It . 
18d50 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61             ** ca
18d60 6e 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64 20  nnot be dropped 
18d70 61 73 20 74 68 65 72 65 20 61 72 65 20 63 75 72  as there are cur
18d80 72 65 6e 74 6c 79 20 61 63 74 69 76 65 20 53 51  rently active SQ
18d90 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20  L statements..  
18da0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 42 75 74            ** But
18db0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 63 61   the contents ca
18dc0 6e 20 62 65 20 64 65 6c 65 74 65 64 2e 20 20 2a  n be deleted.  *
18dd0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  /.            if
18de0 28 20 72 62 75 49 73 56 61 63 75 75 6d 28 70 29  ( rbuIsVacuum(p)
18df0 3d 3d 30 20 26 26 20 70 49 74 65 72 2d 3e 61 62  ==0 && pIter->ab
18e00 49 6e 64 65 78 65 64 20 29 7b 0a 20 20 20 20 20  Indexed ){.     
18e10 20 20 20 20 20 20 20 20 20 72 62 75 4d 50 72 69           rbuMPri
18e20 6e 74 66 45 78 65 63 28 70 2c 20 70 2d 3e 64 62  ntfExec(p, p->db
18e30 52 62 75 2c 20 0a 20 20 20 20 20 20 20 20 20 20  Rbu, .          
18e40 20 20 20 20 20 20 20 20 22 44 45 4c 45 54 45 20          "DELETE 
18e50 46 52 4f 4d 20 25 73 2e 27 72 62 75 5f 74 6d 70  FROM %s.'rbu_tmp
18e60 5f 25 71 27 22 2c 20 70 2d 3e 7a 53 74 61 74 65  _%q'", p->zState
18e70 44 62 2c 20 70 49 74 65 72 2d 3e 7a 44 61 74 61  Db, pIter->zData
18e80 54 62 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20  Tbl.            
18e90 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20    );.           
18ea0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c   }.          }el
18eb0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
18ec0 72 62 75 4f 62 6a 49 74 65 72 50 72 65 70 61 72  rbuObjIterPrepar
18ed0 65 41 6c 6c 28 70 2c 20 70 49 74 65 72 2c 20 30  eAll(p, pIter, 0
18ee0 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20  );..            
18ef0 2f 2a 20 41 64 76 61 6e 63 65 20 74 6f 20 74 68  /* Advance to th
18f00 65 20 6e 65 78 74 20 72 6f 77 20 74 6f 20 70 72  e next row to pr
18f10 6f 63 65 73 73 2e 20 2a 2f 0a 20 20 20 20 20 20  ocess. */.      
18f20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
18f30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18f40 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
18f50 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65  rc = sqlite3_ste
18f60 70 28 70 49 74 65 72 2d 3e 70 53 65 6c 65 63 74  p(pIter->pSelect
18f70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
18f80 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
18f90 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ROW ){.         
18fa0 20 20 20 20 20 20 20 70 2d 3e 6e 50 72 6f 67 72         p->nProgr
18fb0 65 73 73 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  ess++;.         
18fc0 20 20 20 20 20 20 20 70 2d 3e 6e 53 74 65 70 2b         p->nStep+
18fd0 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  +;.             
18fe0 20 20 20 72 65 74 75 72 6e 20 72 62 75 53 74 65     return rbuSte
18ff0 70 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  p(p);.          
19000 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
19010 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69      p->rc = sqli
19020 74 65 33 5f 72 65 73 65 74 28 70 49 74 65 72 2d  te3_reset(pIter-
19030 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20  >pSelect);.     
19040 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 74 65           p->nSte
19050 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  p = 0;.         
19060 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
19070 0a 0a 20 20 20 20 20 20 20 20 20 20 72 62 75 4f  ..          rbuO
19080 62 6a 49 74 65 72 4e 65 78 74 28 70 2c 20 70 49  bjIterNext(p, pI
19090 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ter);.        }.
190a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
190b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
190c0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
190d0 74 28 20 70 49 74 65 72 2d 3e 7a 54 62 6c 3d 3d  t( pIter->zTbl==
190e0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  0 );.          r
190f0 62 75 53 61 76 65 53 74 61 74 65 28 70 2c 20 52  buSaveState(p, R
19100 42 55 5f 53 54 41 47 45 5f 4d 4f 56 45 29 3b 0a  BU_STAGE_MOVE);.
19110 20 20 20 20 20 20 20 20 20 20 72 62 75 49 6e 63            rbuInc
19120 72 53 63 68 65 6d 61 43 6f 6f 6b 69 65 28 70 29  rSchemaCookie(p)
19130 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
19140 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
19150 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
19160 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  p->rc = sqlite3_
19170 65 78 65 63 28 70 2d 3e 64 62 4d 61 69 6e 2c 20  exec(p->dbMain, 
19180 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 2c 20  "COMMIT", 0, 0, 
19190 26 70 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a 20 20  &p->zErrmsg);.  
191a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
191b0 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
191c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
191d0 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
191e0 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e  sqlite3_exec(p->
191f0 64 62 52 62 75 2c 20 22 43 4f 4d 4d 49 54 22 2c  dbRbu, "COMMIT",
19200 20 30 2c 20 30 2c 20 26 70 2d 3e 7a 45 72 72 6d   0, 0, &p->zErrm
19210 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  sg);.          }
19220 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 65 53  .          p->eS
19230 74 61 67 65 20 3d 20 52 42 55 5f 53 54 41 47 45  tage = RBU_STAGE
19240 5f 4d 4f 56 45 3b 0a 20 20 20 20 20 20 20 20 7d  _MOVE;.        }
19250 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
19260 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 63        }..      c
19270 61 73 65 20 52 42 55 5f 53 54 41 47 45 5f 4d 4f  ase RBU_STAGE_MO
19280 56 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66  VE: {.        if
19290 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
192a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
192b0 72 62 75 4d 6f 76 65 4f 61 6c 46 69 6c 65 28 70  rbuMoveOalFile(p
192c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  );.          p->
192d0 6e 50 72 6f 67 72 65 73 73 2b 2b 3b 0a 20 20 20  nProgress++;.   
192e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62       }.        b
192f0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  reak;.      }.. 
19300 20 20 20 20 20 63 61 73 65 20 52 42 55 5f 53 54       case RBU_ST
19310 41 47 45 5f 43 4b 50 54 3a 20 7b 0a 20 20 20 20  AGE_CKPT: {.    
19320 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
19330 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19340 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 74        if( p->nSt
19350 65 70 3e 3d 70 2d 3e 6e 46 72 61 6d 65 20 29 7b  ep>=p->nFrame ){
19360 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
19370 69 74 65 33 5f 66 69 6c 65 20 2a 70 44 62 20 3d  ite3_file *pDb =
19380 20 70 2d 3e 70 54 61 72 67 65 74 46 64 2d 3e 70   p->pTargetFd->p
19390 52 65 61 6c 3b 0a 20 20 0a 20 20 20 20 20 20 20  Real;.  .       
193a0 20 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65       /* Sync the
193b0 20 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20   db file */.    
193c0 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
193d0 70 44 62 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78  pDb->pMethods->x
193e0 53 79 6e 63 28 70 44 62 2c 20 53 51 4c 49 54 45  Sync(pDb, SQLITE
193f0 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20  _SYNC_NORMAL);. 
19400 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a   .            /*
19410 20 55 70 64 61 74 65 20 6e 42 61 63 6b 66 69 6c   Update nBackfil
19420 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  l */.           
19430 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
19440 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
19450 20 20 20 20 20 20 20 76 6f 69 64 20 76 6f 6c 61         void vola
19460 74 69 6c 65 20 2a 70 74 72 3b 0a 20 20 20 20 20  tile *ptr;.     
19470 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d           p->rc =
19480 20 70 44 62 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e   pDb->pMethods->
19490 78 53 68 6d 4d 61 70 28 70 44 62 2c 20 30 2c 20  xShmMap(pDb, 0, 
194a0 33 32 2a 31 30 32 34 2c 20 30 2c 20 26 70 74 72  32*1024, 0, &ptr
194b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
194c0 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
194d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
194e0 20 20 20 20 20 20 20 20 20 28 28 75 33 32 20 76           ((u32 v
194f0 6f 6c 61 74 69 6c 65 2a 29 70 74 72 29 5b 32 34  olatile*)ptr)[24
19500 5d 20 3d 20 70 2d 3e 69 4d 61 78 46 72 61 6d 65  ] = p->iMaxFrame
19510 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
19520 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
19530 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 69    .            i
19540 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
19550 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
19560 20 20 20 20 20 70 2d 3e 65 53 74 61 67 65 20 3d       p->eStage =
19570 20 52 42 55 5f 53 54 41 47 45 5f 44 4f 4e 45 3b   RBU_STAGE_DONE;
19580 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
19590 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f  ->rc = SQLITE_DO
195a0 4e 45 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  NE;.            
195b0 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  }.          }els
195c0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 52  e{.            R
195d0 62 75 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 20  buFrame *pFrame 
195e0 3d 20 26 70 2d 3e 61 46 72 61 6d 65 5b 70 2d 3e  = &p->aFrame[p->
195f0 6e 53 74 65 70 5d 3b 0a 20 20 20 20 20 20 20 20  nStep];.        
19600 20 20 20 20 72 62 75 43 68 65 63 6b 70 6f 69 6e      rbuCheckpoin
19610 74 46 72 61 6d 65 28 70 2c 20 70 46 72 61 6d 65  tFrame(p, pFrame
19620 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
19630 2d 3e 6e 53 74 65 70 2b 2b 3b 0a 20 20 20 20 20  ->nStep++;.     
19640 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
19650 20 70 2d 3e 6e 50 72 6f 67 72 65 73 73 2b 2b 3b   p->nProgress++;
19660 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
19670 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
19680 7d 0a 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74  }..      default
19690 3a 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  :.        break;
196a0 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
196b0 6e 20 70 2d 3e 72 63 3b 0a 20 20 7d 65 6c 73 65  n p->rc;.  }else
196c0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
196d0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 7d  ITE_NOMEM;.  }.}
196e0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20  ../*.** Compare 
196f0 73 74 72 69 6e 67 73 20 7a 31 20 61 6e 64 20 7a  strings z1 and z
19700 32 2c 20 72 65 74 75 72 6e 69 6e 67 20 30 20 69  2, returning 0 i
19710 66 20 74 68 65 79 20 61 72 65 20 69 64 65 6e 74  f they are ident
19720 69 63 61 6c 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72  ical, or non-zer
19730 6f 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 2e 20  o.** otherwise. 
19740 45 69 74 68 65 72 20 6f 72 20 62 6f 74 68 20 61  Either or both a
19750 72 67 75 6d 65 6e 74 20 6d 61 79 20 62 65 20 4e  rgument may be N
19760 55 4c 4c 2e 20 54 77 6f 20 4e 55 4c 4c 20 76 61  ULL. Two NULL va
19770 6c 75 65 73 20 61 72 65 0a 2a 2a 20 63 6f 6e 73  lues are.** cons
19780 69 64 65 72 65 64 20 65 71 75 61 6c 2c 20 61 6e  idered equal, an
19790 64 20 4e 55 4c 4c 20 69 73 20 63 6f 6e 73 69 64  d NULL is consid
197a0 65 72 65 64 20 64 69 73 74 69 6e 63 74 20 66 72  ered distinct fr
197b0 6f 6d 20 61 6c 6c 20 6f 74 68 65 72 20 76 61 6c  om all other val
197c0 75 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ues..*/.static i
197d0 6e 74 20 72 62 75 53 74 72 43 6f 6d 70 61 72 65  nt rbuStrCompare
197e0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 31 2c  (const char *z1,
197f0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32 29   const char *z2)
19800 7b 0a 20 20 69 66 28 20 7a 31 3d 3d 30 20 26 26  {.  if( z1==0 &&
19810 20 7a 32 3d 3d 30 20 29 20 72 65 74 75 72 6e 20   z2==0 ) return 
19820 30 3b 0a 20 20 69 66 28 20 7a 31 3d 3d 30 20 7c  0;.  if( z1==0 |
19830 7c 20 7a 32 3d 3d 30 20 29 20 72 65 74 75 72 6e  | z2==0 ) return
19840 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 28 73 71   1;.  return (sq
19850 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 31  lite3_stricmp(z1
19860 2c 20 7a 32 29 21 3d 30 29 3b 0a 7d 0a 0a 2f 2a  , z2)!=0);.}../*
19870 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
19880 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 73 20 70  n is called as p
19890 61 72 74 20 6f 66 20 73 71 6c 69 74 65 33 72 62  art of sqlite3rb
198a0 75 5f 6f 70 65 6e 28 29 20 77 68 65 6e 20 69 6e  u_open() when in
198b0 69 74 69 61 6c 69 7a 69 6e 67 0a 2a 2a 20 61 6e  itializing.** an
198c0 20 72 62 75 20 68 61 6e 64 6c 65 20 69 6e 20 4f   rbu handle in O
198d0 41 4c 20 73 74 61 67 65 2e 20 49 66 20 74 68 65  AL stage. If the
198e0 20 72 62 75 20 75 70 64 61 74 65 20 68 61 73 20   rbu update has 
198f0 6e 6f 74 20 73 74 61 72 74 65 64 20 28 69 2e 65  not started (i.e
19900 2e 0a 2a 2a 20 74 68 65 20 72 62 75 5f 73 74 61  ..** the rbu_sta
19910 74 65 20 74 61 62 6c 65 20 77 61 73 20 65 6d 70  te table was emp
19920 74 79 29 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f  ty) it is a no-o
19930 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  p. Otherwise, it
19940 20 61 72 72 61 6e 67 65 73 0a 2a 2a 20 74 68 69   arranges.** thi
19950 6e 67 73 20 73 6f 20 74 68 61 74 20 74 68 65 20  ngs so that the 
19960 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c  next call to sql
19970 69 74 65 33 72 62 75 5f 73 74 65 70 28 29 20 63  ite3rbu_step() c
19980 6f 6e 74 69 6e 75 65 73 20 6f 6e 20 66 72 6f 6d  ontinues on from
19990 0a 2a 2a 20 77 68 65 72 65 20 74 68 65 20 70 72  .** where the pr
199a0 65 76 69 6f 75 73 20 72 62 75 20 68 61 6e 64 6c  evious rbu handl
199b0 65 20 6c 65 66 74 20 6f 66 66 2e 0a 2a 2a 0a 2a  e left off..**.*
199c0 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
199d0 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63  curs, an error c
199e0 6f 64 65 20 61 6e 64 20 65 72 72 6f 72 20 6d 65  ode and error me
199f0 73 73 61 67 65 20 61 72 65 20 6c 65 66 74 20 69  ssage are left i
19a00 6e 20 74 68 65 0a 2a 2a 20 72 62 75 20 68 61 6e  n the.** rbu han
19a10 64 6c 65 20 70 61 73 73 65 64 20 61 73 20 74 68  dle passed as th
19a20 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
19a30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
19a40 20 72 62 75 53 65 74 75 70 4f 61 6c 28 73 71 6c   rbuSetupOal(sql
19a50 69 74 65 33 72 62 75 20 2a 70 2c 20 52 62 75 53  ite3rbu *p, RbuS
19a60 74 61 74 65 20 2a 70 53 74 61 74 65 29 7b 0a 20  tate *pState){. 
19a70 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d   assert( p->rc==
19a80 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69  SQLITE_OK );.  i
19a90 66 28 20 70 53 74 61 74 65 2d 3e 7a 54 62 6c 20  f( pState->zTbl 
19aa0 29 7b 0a 20 20 20 20 52 62 75 4f 62 6a 49 74 65  ){.    RbuObjIte
19ab0 72 20 2a 70 49 74 65 72 20 3d 20 26 70 2d 3e 6f  r *pIter = &p->o
19ac0 62 6a 69 74 65 72 3b 0a 20 20 20 20 69 6e 74 20  bjiter;.    int 
19ad0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
19ae0 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  .    while( rc==
19af0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 49 74  SQLITE_OK && pIt
19b00 65 72 2d 3e 7a 54 62 6c 20 26 26 20 28 70 49 74  er->zTbl && (pIt
19b10 65 72 2d 3e 62 43 6c 65 61 6e 75 70 20 0a 20 20  er->bCleanup .  
19b20 20 20 20 20 20 7c 7c 20 72 62 75 53 74 72 43 6f       || rbuStrCo
19b30 6d 70 61 72 65 28 70 49 74 65 72 2d 3e 7a 49 64  mpare(pIter->zId
19b40 78 2c 20 70 53 74 61 74 65 2d 3e 7a 49 64 78 29  x, pState->zIdx)
19b50 0a 20 20 20 20 20 20 20 7c 7c 20 72 62 75 53 74  .       || rbuSt
19b60 72 43 6f 6d 70 61 72 65 28 70 49 74 65 72 2d 3e  rCompare(pIter->
19b70 7a 54 62 6c 2c 20 70 53 74 61 74 65 2d 3e 7a 54  zTbl, pState->zT
19b80 62 6c 29 20 0a 20 20 20 20 29 29 7b 0a 20 20 20  bl) .    )){.   
19b90 20 20 20 72 63 20 3d 20 72 62 75 4f 62 6a 49 74     rc = rbuObjIt
19ba0 65 72 4e 65 78 74 28 70 2c 20 70 49 74 65 72 29  erNext(p, pIter)
19bb0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
19bc0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
19bd0 26 20 21 70 49 74 65 72 2d 3e 7a 54 62 6c 20 29  & !pIter->zTbl )
19be0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
19bf0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
19c00 20 70 2d 3e 7a 45 72 72 6d 73 67 20 3d 20 73 71   p->zErrmsg = sq
19c10 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 72  lite3_mprintf("r
19c20 62 75 5f 73 74 61 74 65 20 6d 69 73 6d 61 74 63  bu_state mismatc
19c30 68 20 65 72 72 6f 72 22 29 3b 0a 20 20 20 20 7d  h error");.    }
19c40 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ..    if( rc==SQ
19c50 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
19c60 20 70 2d 3e 6e 53 74 65 70 20 3d 20 70 53 74 61   p->nStep = pSta
19c70 74 65 2d 3e 6e 52 6f 77 3b 0a 20 20 20 20 20 20  te->nRow;.      
19c80 72 63 20 3d 20 72 62 75 4f 62 6a 49 74 65 72 50  rc = rbuObjIterP
19c90 72 65 70 61 72 65 41 6c 6c 28 70 2c 20 26 70 2d  repareAll(p, &p-
19ca0 3e 6f 62 6a 69 74 65 72 2c 20 70 2d 3e 6e 53 74  >objiter, p->nSt
19cb0 65 70 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ep);.    }..    
19cc0 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 7d 0a  p->rc = rc;.  }.
19cd0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 72  }../*.** If ther
19ce0 65 20 69 73 20 61 20 22 2a 2d 6f 61 6c 22 20 66  e is a "*-oal" f
19cf0 69 6c 65 20 69 6e 20 74 68 65 20 66 69 6c 65 2d  ile in the file-
19d00 73 79 73 74 65 6d 20 63 6f 72 72 65 73 70 6f 6e  system correspon
19d10 64 69 6e 67 20 74 6f 20 74 68 65 0a 2a 2a 20 74  ding to the.** t
19d20 61 72 67 65 74 20 64 61 74 61 62 61 73 65 20 69  arget database i
19d30 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  n the file-syste
19d40 6d 2c 20 64 65 6c 65 74 65 20 69 74 2e 20 49 66  m, delete it. If
19d50 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
19d60 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65 72  ,.** leave an er
19d70 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 65 72 72  ror code and err
19d80 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 74 68  or message in th
19d90 65 20 72 62 75 20 68 61 6e 64 6c 65 2e 0a 2a 2f  e rbu handle..*/
19da0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75  .static void rbu
19db0 44 65 6c 65 74 65 4f 61 6c 46 69 6c 65 28 73 71  DeleteOalFile(sq
19dc0 6c 69 74 65 33 72 62 75 20 2a 70 29 7b 0a 20 20  lite3rbu *p){.  
19dd0 63 68 61 72 20 2a 7a 4f 61 6c 20 3d 20 72 62 75  char *zOal = rbu
19de0 4d 50 72 69 6e 74 66 28 70 2c 20 22 25 73 2d 6f  MPrintf(p, "%s-o
19df0 61 6c 22 2c 20 70 2d 3e 7a 54 61 72 67 65 74 29  al", p->zTarget)
19e00 3b 0a 20 20 69 66 28 20 7a 4f 61 6c 20 29 7b 0a  ;.  if( zOal ){.
19e10 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20      sqlite3_vfs 
19e20 2a 70 56 66 73 20 3d 20 73 71 6c 69 74 65 33 5f  *pVfs = sqlite3_
19e30 76 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20 20  vfs_find(0);.   
19e40 20 61 73 73 65 72 74 28 20 70 56 66 73 20 26 26   assert( pVfs &&
19e50 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
19e60 4b 20 26 26 20 70 2d 3e 7a 45 72 72 6d 73 67 3d  K && p->zErrmsg=
19e70 3d 30 20 29 3b 0a 20 20 20 20 70 56 66 73 2d 3e  =0 );.    pVfs->
19e80 78 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4f  xDelete(pVfs, zO
19e90 61 6c 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  al, 0);.    sqli
19ea0 74 65 33 5f 66 72 65 65 28 7a 4f 61 6c 29 3b 0a  te3_free(zOal);.
19eb0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c    }.}../*.** All
19ec0 6f 63 61 74 65 20 61 20 70 72 69 76 61 74 65 20  ocate a private 
19ed0 72 62 75 20 56 46 53 20 66 6f 72 20 74 68 65 20  rbu VFS for the 
19ee0 72 62 75 20 68 61 6e 64 6c 65 20 70 61 73 73 65  rbu handle passe
19ef0 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 0a 2a 2a  d as the only.**
19f00 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 69 73 20   argument. This 
19f10 56 46 53 20 77 69 6c 6c 20 62 65 20 75 73 65 64  VFS will be used
19f20 20 75 6e 6c 65 73 73 20 74 68 65 20 63 61 6c 6c   unless the call
19f30 20 74 6f 20 73 71 6c 69 74 65 33 72 62 75 5f 6f   to sqlite3rbu_o
19f40 70 65 6e 28 29 0a 2a 2a 20 73 70 65 63 69 66 69  pen().** specifi
19f50 65 64 20 61 20 55 52 49 20 77 69 74 68 20 61 20  ed a URI with a 
19f60 76 66 73 3d 3f 20 6f 70 74 69 6f 6e 20 69 6e 20  vfs=? option in 
19f70 70 6c 61 63 65 20 6f 66 20 61 20 74 61 72 67 65  place of a targe
19f80 74 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69  t database.** fi
19f90 6c 65 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74  le name..*/.stat
19fa0 69 63 20 76 6f 69 64 20 72 62 75 43 72 65 61 74  ic void rbuCreat
19fb0 65 56 66 73 28 73 71 6c 69 74 65 33 72 62 75 20  eVfs(sqlite3rbu 
19fc0 2a 70 29 7b 0a 20 20 69 6e 74 20 72 6e 64 3b 0a  *p){.  int rnd;.
19fd0 20 20 63 68 61 72 20 7a 52 6e 64 5b 36 34 5d 3b    char zRnd[64];
19fe0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72  ..  assert( p->r
19ff0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
1a000 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d    sqlite3_random
1a010 6e 65 73 73 28 73 69 7a 65 6f 66 28 69 6e 74 29  ness(sizeof(int)
1a020 2c 20 28 76 6f 69 64 2a 29 26 72 6e 64 29 3b 0a  , (void*)&rnd);.
1a030 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
1a040 74 66 28 73 69 7a 65 6f 66 28 7a 52 6e 64 29 2c  tf(sizeof(zRnd),
1a050 20 7a 52 6e 64 2c 20 22 72 62 75 5f 76 66 73 5f   zRnd, "rbu_vfs_
1a060 25 64 22 2c 20 72 6e 64 29 3b 0a 20 20 70 2d 3e  %d", rnd);.  p->
1a070 72 63 20 3d 20 73 71 6c 69 74 65 33 72 62 75 5f  rc = sqlite3rbu_
1a080 63 72 65 61 74 65 5f 76 66 73 28 7a 52 6e 64 2c  create_vfs(zRnd,
1a090 20 30 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63   0);.  if( p->rc
1a0a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1a0b0 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a     sqlite3_vfs *
1a0c0 70 56 66 73 20 3d 20 73 71 6c 69 74 65 33 5f 76  pVfs = sqlite3_v
1a0d0 66 73 5f 66 69 6e 64 28 7a 52 6e 64 29 3b 0a 20  fs_find(zRnd);. 
1a0e0 20 20 20 61 73 73 65 72 74 28 20 70 56 66 73 20     assert( pVfs 
1a0f0 29 3b 0a 20 20 20 20 70 2d 3e 7a 56 66 73 4e 61  );.    p->zVfsNa
1a100 6d 65 20 3d 20 70 56 66 73 2d 3e 7a 4e 61 6d 65  me = pVfs->zName
1a110 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ;.  }.}../*.** D
1a120 65 73 74 72 6f 79 20 74 68 65 20 70 72 69 76 61  estroy the priva
1a130 74 65 20 56 46 53 20 63 72 65 61 74 65 64 20 66  te VFS created f
1a140 6f 72 20 74 68 65 20 72 62 75 20 68 61 6e 64 6c  or the rbu handl
1a150 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
1a160 6f 6e 6c 79 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  only.** argument
1a170 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20 63   by an earlier c
1a180 61 6c 6c 20 74 6f 20 72 62 75 43 72 65 61 74 65  all to rbuCreate
1a190 56 66 73 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  Vfs()..*/.static
1a1a0 20 76 6f 69 64 20 72 62 75 44 65 6c 65 74 65 56   void rbuDeleteV
1a1b0 66 73 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70  fs(sqlite3rbu *p
1a1c0 29 7b 0a 20 20 69 66 28 20 70 2d 3e 7a 56 66 73  ){.  if( p->zVfs
1a1d0 4e 61 6d 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  Name ){.    sqli
1a1e0 74 65 33 72 62 75 5f 64 65 73 74 72 6f 79 5f 76  te3rbu_destroy_v
1a1f0 66 73 28 70 2d 3e 7a 56 66 73 4e 61 6d 65 29 3b  fs(p->zVfsName);
1a200 0a 20 20 20 20 70 2d 3e 7a 56 66 73 4e 61 6d 65  .    p->zVfsName
1a210 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 0;.  }.}../*.
1a220 2a 2a 20 54 68 69 73 20 75 73 65 72 2d 64 65 66  ** This user-def
1a230 69 6e 65 64 20 53 51 4c 20 66 75 6e 63 74 69 6f  ined SQL functio
1a240 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 77 69 74  n is invoked wit
1a250 68 20 61 20 73 69 6e 67 6c 65 20 61 72 67 75 6d  h a single argum
1a260 65 6e 74 20 2d 20 74 68 65 0a 2a 2a 20 6e 61 6d  ent - the.** nam
1a270 65 20 6f 66 20 61 20 74 61 62 6c 65 20 65 78 70  e of a table exp
1a280 65 63 74 65 64 20 74 6f 20 61 70 70 65 61 72 20  ected to appear 
1a290 69 6e 20 74 68 65 20 74 61 72 67 65 74 20 64 61  in the target da
1a2a0 74 61 62 61 73 65 2e 20 49 74 20 72 65 74 75 72  tabase. It retur
1a2b0 6e 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72  ns.** the number
1a2c0 20 6f 66 20 61 75 78 69 6c 6c 69 61 72 79 20 69   of auxilliary i
1a2d0 6e 64 65 78 65 73 20 6f 6e 20 74 68 65 20 74 61  ndexes on the ta
1a2e0 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ble..*/.static v
1a2f0 6f 69 64 20 72 62 75 49 6e 64 65 78 43 6e 74 46  oid rbuIndexCntF
1a300 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
1a310 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20  ontext *pCtx, . 
1a320 20 69 6e 74 20 6e 56 61 6c 2c 0a 20 20 73 71 6c   int nVal,.  sql
1a330 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56  ite3_value **apV
1a340 61 6c 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 72  al.){.  sqlite3r
1a350 62 75 20 2a 70 20 3d 20 28 73 71 6c 69 74 65 33  bu *p = (sqlite3
1a360 72 62 75 2a 29 73 71 6c 69 74 65 33 5f 75 73 65  rbu*)sqlite3_use
1a370 72 5f 64 61 74 61 28 70 43 74 78 29 3b 0a 20 20  r_data(pCtx);.  
1a380 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
1a390 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  tmt = 0;.  char 
1a3a0 2a 7a 45 72 72 6d 73 67 20 3d 20 30 3b 0a 20 20  *zErrmsg = 0;.  
1a3b0 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
1a3c0 74 28 20 6e 56 61 6c 3d 3d 31 20 29 3b 0a 20 20  t( nVal==1 );.  
1a3d0 0a 20 20 72 63 20 3d 20 70 72 65 70 61 72 65 46  .  rc = prepareF
1a3e0 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72  reeAndCollectErr
1a3f0 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 70  or(p->dbMain, &p
1a400 53 74 6d 74 2c 20 26 7a 45 72 72 6d 73 67 2c 20  Stmt, &zErrmsg, 
1a410 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
1a420 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20 63  printf("SELECT c
1a430 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 73 71 6c  ount(*) FROM sql
1a440 69 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20 20  ite_master ".   
1a450 20 20 20 20 20 22 57 48 45 52 45 20 74 79 70 65       "WHERE type
1a460 3d 27 69 6e 64 65 78 27 20 41 4e 44 20 74 62 6c  ='index' AND tbl
1a470 5f 6e 61 6d 65 20 3d 20 25 51 22 2c 20 73 71 6c  _name = %Q", sql
1a480 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
1a490 61 70 56 61 6c 5b 30 5d 29 29 0a 20 20 29 3b 0a  apVal[0])).  );.
1a4a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1a4b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
1a4c0 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28  e3_result_error(
1a4d0 70 43 74 78 2c 20 7a 45 72 72 6d 73 67 2c 20 2d  pCtx, zErrmsg, -
1a4e0 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  1);.  }else{.   
1a4f0 20 69 6e 74 20 6e 49 6e 64 65 78 20 3d 20 30 3b   int nIndex = 0;
1a500 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
1a510 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW==sqlite3_ste
1a520 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20  p(pStmt) ){.    
1a530 20 20 6e 49 6e 64 65 78 20 3d 20 73 71 6c 69 74    nIndex = sqlit
1a540 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53  e3_column_int(pS
1a550 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  tmt, 0);.    }. 
1a560 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
1a570 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
1a580 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1a590 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1a5a0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
1a5b0 6e 74 28 70 43 74 78 2c 20 6e 49 6e 64 65 78 29  nt(pCtx, nIndex)
1a5c0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1a5d0 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
1a5e0 74 5f 65 72 72 6f 72 28 70 43 74 78 2c 20 73 71  t_error(pCtx, sq
1a5f0 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e  lite3_errmsg(p->
1a600 64 62 4d 61 69 6e 29 2c 20 2d 31 29 3b 0a 20 20  dbMain), -1);.  
1a610 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74    }.  }..  sqlit
1a620 65 33 5f 66 72 65 65 28 7a 45 72 72 6d 73 67 29  e3_free(zErrmsg)
1a630 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  ;.}../*.** If th
1a640 65 20 52 42 55 20 64 61 74 61 62 61 73 65 20 63  e RBU database c
1a650 6f 6e 74 61 69 6e 73 20 74 68 65 20 72 62 75 5f  ontains the rbu_
1a660 63 6f 75 6e 74 20 74 61 62 6c 65 2c 20 75 73 65  count table, use
1a670 20 69 74 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a   it to initializ
1a680 65 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33  e.** the sqlite3
1a690 72 62 75 2e 6e 50 68 61 73 65 4f 6e 65 53 74 65  rbu.nPhaseOneSte
1a6a0 70 20 76 61 72 69 61 62 6c 65 2e 20 54 68 65 20  p variable. The 
1a6b0 73 63 68 65 6d 61 20 6f 66 20 74 68 65 20 72 62  schema of the rb
1a6c0 75 5f 63 6f 75 6e 74 20 74 61 62 6c 65 0a 2a 2a  u_count table.**
1a6d0 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 63   is assumed to c
1a6e0 6f 6e 74 61 69 6e 20 74 68 65 20 73 61 6d 65 20  ontain the same 
1a6f0 63 6f 6c 75 6d 6e 73 20 61 73 3a 0a 2a 2a 0a 2a  columns as:.**.*
1a700 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  *   CREATE TABLE
1a710 20 72 62 75 5f 63 6f 75 6e 74 28 74 62 6c 20 54   rbu_count(tbl T
1a720 45 58 54 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  EXT PRIMARY KEY,
1a730 20 63 6e 74 20 49 4e 54 45 47 45 52 29 20 57 49   cnt INTEGER) WI
1a740 54 48 4f 55 54 20 52 4f 57 49 44 3b 0a 2a 2a 0a  THOUT ROWID;.**.
1a750 2a 2a 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20  ** There should 
1a760 62 65 20 6f 6e 65 20 72 6f 77 20 69 6e 20 74 68  be one row in th
1a770 65 20 74 61 62 6c 65 20 66 6f 72 20 65 61 63 68  e table for each
1a780 20 64 61 74 61 5f 78 78 78 20 74 61 62 6c 65 20   data_xxx table 
1a790 69 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  in the.** databa
1a7a0 73 65 2e 20 54 68 65 20 27 74 62 6c 27 20 63 6f  se. The 'tbl' co
1a7b0 6c 75 6d 6e 20 73 68 6f 75 6c 64 20 63 6f 6e 74  lumn should cont
1a7c0 61 69 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ain the name of 
1a7d0 61 20 64 61 74 61 5f 78 78 78 20 74 61 62 6c 65  a data_xxx table
1a7e0 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20 63 6e 74  ,.** and the cnt
1a7f0 20 63 6f 6c 75 6d 6e 20 74 68 65 20 6e 75 6d 62   column the numb
1a800 65 72 20 6f 66 20 72 6f 77 73 20 69 74 20 63 6f  er of rows it co
1a810 6e 74 61 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 73 71  ntains..**.** sq
1a820 6c 69 74 65 33 72 62 75 2e 6e 50 68 61 73 65 4f  lite3rbu.nPhaseO
1a830 6e 65 53 74 65 70 20 69 73 20 69 6e 69 74 69 61  neStep is initia
1a840 6c 69 7a 65 64 20 74 6f 20 74 68 65 20 73 75 6d  lized to the sum
1a850 20 6f 66 20 28 31 20 2b 20 6e 49 6e 64 65 78 29   of (1 + nIndex)
1a860 20 2a 20 63 6e 74 0a 2a 2a 20 66 6f 72 20 61 6c   * cnt.** for al
1a870 6c 20 72 6f 77 73 20 69 6e 20 74 68 65 20 72 62  l rows in the rb
1a880 75 5f 63 6f 75 6e 74 20 74 61 62 6c 65 2c 20 77  u_count table, w
1a890 68 65 72 65 20 6e 49 6e 64 65 78 20 69 73 20 74  here nIndex is t
1a8a0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 0a 2a 2a  he number of .**
1a8b0 20 69 6e 64 65 78 65 73 20 6f 6e 20 74 68 65 20   indexes on the 
1a8c0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61  corresponding ta
1a8d0 72 67 65 74 20 64 61 74 61 62 61 73 65 20 74 61  rget database ta
1a8e0 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ble..*/.static v
1a8f0 6f 69 64 20 72 62 75 49 6e 69 74 50 68 61 73 65  oid rbuInitPhase
1a900 4f 6e 65 53 74 65 70 73 28 73 71 6c 69 74 65 33  OneSteps(sqlite3
1a910 72 62 75 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  rbu *p){.  if( p
1a920 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
1a930 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
1a940 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a  tmt *pStmt = 0;.
1a950 20 20 20 20 69 6e 74 20 62 45 78 69 73 74 73 20      int bExists 
1a960 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1a970 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72      /* True if r
1a980 62 75 5f 63 6f 75 6e 74 20 65 78 69 73 74 73 20  bu_count exists 
1a990 2a 2f 0a 0a 20 20 20 20 70 2d 3e 6e 50 68 61 73  */..    p->nPhas
1a9a0 65 4f 6e 65 53 74 65 70 20 3d 20 2d 31 3b 0a 0a  eOneStep = -1;..
1a9b0 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69      p->rc = sqli
1a9c0 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
1a9d0 69 6f 6e 28 70 2d 3e 64 62 52 62 75 2c 20 0a 20  ion(p->dbRbu, . 
1a9e0 20 20 20 20 20 20 20 22 72 62 75 5f 69 6e 64 65         "rbu_inde
1a9f0 78 5f 63 6e 74 22 2c 20 31 2c 20 53 51 4c 49 54  x_cnt", 1, SQLIT
1aa00 45 5f 55 54 46 38 2c 20 28 76 6f 69 64 2a 29 70  E_UTF8, (void*)p
1aa10 2c 20 72 62 75 49 6e 64 65 78 43 6e 74 46 75 6e  , rbuIndexCntFun
1aa20 63 2c 20 30 2c 20 30 0a 20 20 20 20 29 3b 0a 20  c, 0, 0.    );. 
1aa30 20 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66   .    /* Check f
1aa40 6f 72 20 74 68 65 20 72 62 75 5f 63 6f 75 6e 74  or the rbu_count
1aa50 20 74 61 62 6c 65 2e 20 49 66 20 69 74 20 64 6f   table. If it do
1aa60 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 6f 72  es not exist, or
1aa70 20 69 66 20 61 6e 20 65 72 72 6f 72 0a 20 20 20   if an error.   
1aa80 20 2a 2a 20 6f 63 63 75 72 73 2c 20 6e 50 68 61   ** occurs, nPha
1aa90 73 65 4f 6e 65 53 74 65 70 20 77 69 6c 6c 20 62  seOneStep will b
1aaa0 65 20 6c 65 66 74 20 73 65 74 20 74 6f 20 2d 31  e left set to -1
1aab0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e  . */.    if( p->
1aac0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1aad0 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 70  .      p->rc = p
1aae0 72 65 70 61 72 65 41 6e 64 43 6f 6c 6c 65 63 74  repareAndCollect
1aaf0 45 72 72 6f 72 28 70 2d 3e 64 62 52 62 75 2c 20  Error(p->dbRbu, 
1ab00 26 70 53 74 6d 74 2c 20 26 70 2d 3e 7a 45 72 72  &pStmt, &p->zErr
1ab10 6d 73 67 2c 0a 20 20 20 20 20 20 20 20 20 20 22  msg,.          "
1ab20 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20 73 71  SELECT 1 FROM sq
1ab30 6c 69 74 65 5f 6d 61 73 74 65 72 20 57 48 45 52  lite_master WHER
1ab40 45 20 74 62 6c 5f 6e 61 6d 65 20 3d 20 27 72 62  E tbl_name = 'rb
1ab50 75 5f 63 6f 75 6e 74 27 22 0a 20 20 20 20 20 20  u_count'".      
1ab60 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
1ab70 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1ab80 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 53  K ){.      if( S
1ab90 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74  QLITE_ROW==sqlit
1aba0 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29  e3_step(pStmt) )
1abb0 7b 0a 20 20 20 20 20 20 20 20 62 45 78 69 73 74  {.        bExist
1abc0 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  s = 1;.      }. 
1abd0 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c       p->rc = sql
1abe0 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
1abf0 74 6d 74 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  tmt);.    }.  . 
1ac00 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
1ac10 4c 49 54 45 5f 4f 4b 20 26 26 20 62 45 78 69 73  LITE_OK && bExis
1ac20 74 73 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72  ts ){.      p->r
1ac30 63 20 3d 20 70 72 65 70 61 72 65 41 6e 64 43 6f  c = prepareAndCo
1ac40 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62  llectError(p->db
1ac50 52 62 75 2c 20 26 70 53 74 6d 74 2c 20 26 70 2d  Rbu, &pStmt, &p-
1ac60 3e 7a 45 72 72 6d 73 67 2c 0a 20 20 20 20 20 20  >zErrmsg,.      
1ac70 20 20 20 20 22 53 45 4c 45 43 54 20 73 75 6d 28      "SELECT sum(
1ac80 63 6e 74 20 2a 20 28 31 20 2b 20 72 62 75 5f 69  cnt * (1 + rbu_i
1ac90 6e 64 65 78 5f 63 6e 74 28 72 62 75 5f 74 61 72  ndex_cnt(rbu_tar
1aca0 67 65 74 5f 6e 61 6d 65 28 74 62 6c 29 29 29 29  get_name(tbl))))
1acb0 22 0a 20 20 20 20 20 20 20 20 20 20 22 46 52 4f  ".          "FRO
1acc0 4d 20 72 62 75 5f 63 6f 75 6e 74 22 0a 20 20 20  M rbu_count".   
1acd0 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20     );.      if( 
1ace0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
1acf0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
1ad00 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69  SQLITE_ROW==sqli
1ad10 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20  te3_step(pStmt) 
1ad20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ){.          p->
1ad30 6e 50 68 61 73 65 4f 6e 65 53 74 65 70 20 3d 20  nPhaseOneStep = 
1ad40 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
1ad50 6e 74 36 34 28 70 53 74 6d 74 2c 20 30 29 3b 0a  nt64(pStmt, 0);.
1ad60 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1ad70 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65    p->rc = sqlite
1ad80 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
1ad90 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1ada0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
1adb0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
1adc0 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73  t passed to this
1add0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 74 68 65   function is the
1ade0 20 6e 61 6d 65 20 6f 66 20 61 20 50 52 41 47 4d   name of a PRAGM
1adf0 41 20 0a 2a 2a 20 73 65 74 74 69 6e 67 20 2d 20  A .** setting - 
1ae00 22 70 61 67 65 5f 73 69 7a 65 22 2c 20 22 61 75  "page_size", "au
1ae10 74 6f 5f 76 61 63 75 75 6d 22 2c 20 22 75 73 65  to_vacuum", "use
1ae20 72 5f 76 65 72 73 69 6f 6e 22 20 6f 72 20 22 61  r_version" or "a
1ae30 70 70 6c 69 63 61 74 69 6f 6e 5f 69 64 22 2e 0a  pplication_id"..
1ae40 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1ae50 20 65 78 65 63 75 74 65 73 20 74 68 65 20 66 6f   executes the fo
1ae60 6c 6c 6f 77 69 6e 67 20 6f 6e 20 73 71 6c 69 74  llowing on sqlit
1ae70 65 33 72 62 75 2e 64 62 52 62 75 3a 0a 2a 2a 0a  e3rbu.dbRbu:.**.
1ae80 2a 2a 20 20 20 22 50 52 41 47 4d 41 20 6d 61 69  **   "PRAGMA mai
1ae90 6e 2e 24 7a 50 72 61 67 6d 61 22 0a 2a 2a 0a 2a  n.$zPragma".**.*
1aea0 2a 20 77 68 65 72 65 20 24 7a 50 72 61 67 6d 61  * where $zPragma
1aeb0 20 69 73 20 74 68 65 20 73 74 72 69 6e 67 20 70   is the string p
1aec0 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
1aed0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20 74 68  ond argument, th
1aee0 65 6e 0a 2a 2a 20 6f 6e 20 73 71 6c 69 74 65 33  en.** on sqlite3
1aef0 72 62 75 2e 64 62 4d 61 69 6e 3a 0a 2a 2a 0a 2a  rbu.dbMain:.**.*
1af00 2a 20 20 20 22 50 52 41 47 4d 41 20 6d 61 69 6e  *   "PRAGMA main
1af10 2e 24 7a 50 72 61 67 6d 61 20 3d 20 24 76 61 6c  .$zPragma = $val
1af20 22 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 24 76  ".**.** where $v
1af30 61 6c 20 69 73 20 74 68 65 20 76 61 6c 75 65 20  al is the value 
1af40 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20  returned by the 
1af50 66 69 72 73 74 20 50 52 41 47 4d 41 20 69 6e 76  first PRAGMA inv
1af60 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  ocation..**.** I
1af70 6e 20 73 68 6f 72 74 2c 20 69 74 20 63 6f 70 69  n short, it copi
1af80 65 73 20 74 68 65 20 76 61 6c 75 65 20 20 6f 66  es the value  of
1af90 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 50   the specified P
1afa0 52 41 47 4d 41 20 73 65 74 74 69 6e 67 20 66 72  RAGMA setting fr
1afb0 6f 6d 0a 2a 2a 20 64 62 52 62 75 20 74 6f 20 64  om.** dbRbu to d
1afc0 62 4d 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  bMain..*/.static
1afd0 20 76 6f 69 64 20 72 62 75 43 6f 70 79 50 72 61   void rbuCopyPra
1afe0 67 6d 61 28 73 71 6c 69 74 65 33 72 62 75 20 2a  gma(sqlite3rbu *
1aff0 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  p, const char *z
1b000 50 72 61 67 6d 61 29 7b 0a 20 20 69 66 28 20 70  Pragma){.  if( p
1b010 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
1b020 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
1b030 74 6d 74 20 2a 70 50 72 61 67 6d 61 20 3d 20 30  tmt *pPragma = 0
1b040 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 72  ;.    p->rc = pr
1b050 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c  epareFreeAndColl
1b060 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 52 62  ectError(p->dbRb
1b070 75 2c 20 26 70 50 72 61 67 6d 61 2c 20 26 70 2d  u, &pPragma, &p-
1b080 3e 7a 45 72 72 6d 73 67 2c 20 0a 20 20 20 20 20  >zErrmsg, .     
1b090 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e     sqlite3_mprin
1b0a0 74 66 28 22 50 52 41 47 4d 41 20 6d 61 69 6e 2e  tf("PRAGMA main.
1b0b0 25 73 22 2c 20 7a 50 72 61 67 6d 61 29 0a 20 20  %s", zPragma).  
1b0c0 20 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e    );.    if( p->
1b0d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1b0e0 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
1b0f0 69 74 65 33 5f 73 74 65 70 28 70 50 72 61 67 6d  ite3_step(pPragm
1b100 61 29 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72  a) ){.      p->r
1b110 63 20 3d 20 72 62 75 4d 50 72 69 6e 74 66 45 78  c = rbuMPrintfEx
1b120 65 63 28 70 2c 20 70 2d 3e 64 62 4d 61 69 6e 2c  ec(p, p->dbMain,
1b130 20 22 50 52 41 47 4d 41 20 6d 61 69 6e 2e 25 73   "PRAGMA main.%s
1b140 20 3d 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20   = %d",.        
1b150 20 20 7a 50 72 61 67 6d 61 2c 20 73 71 6c 69 74    zPragma, sqlit
1b160 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 50  e3_column_int(pP
1b170 72 61 67 6d 61 2c 20 30 29 0a 20 20 20 20 20 20  ragma, 0).      
1b180 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 62 75  );.    }.    rbu
1b190 46 69 6e 61 6c 69 7a 65 28 70 2c 20 70 50 72 61  Finalize(p, pPra
1b1a0 67 6d 61 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  gma);.  }.}../*.
1b1b0 2a 2a 20 54 68 65 20 52 42 55 20 68 61 6e 64 6c  ** The RBU handl
1b1c0 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
1b1d0 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20 68 61  only argument ha
1b1e0 73 20 6a 75 73 74 20 62 65 65 6e 20 6f 70 65 6e  s just been open
1b1f0 65 64 20 61 6e 64 20 0a 2a 2a 20 74 68 65 20 73  ed and .** the s
1b200 74 61 74 65 20 64 61 74 61 62 61 73 65 20 69 73  tate database is
1b210 20 65 6d 70 74 79 2e 20 49 66 20 74 68 69 73 20   empty. If this 
1b220 52 42 55 20 68 61 6e 64 6c 65 20 77 61 73 20 6f  RBU handle was o
1b230 70 65 6e 65 64 20 66 6f 72 20 61 6e 0a 2a 2a 20  pened for an.** 
1b240 52 42 55 20 76 61 63 75 75 6d 20 6f 70 65 72 61  RBU vacuum opera
1b250 74 69 6f 6e 2c 20 63 72 65 61 74 65 20 74 68 65  tion, create the
1b260 20 73 63 68 65 6d 61 20 69 6e 20 74 68 65 20 74   schema in the t
1b270 61 72 67 65 74 20 64 62 2e 0a 2a 2f 0a 73 74 61  arget db..*/.sta
1b280 74 69 63 20 76 6f 69 64 20 72 62 75 43 72 65 61  tic void rbuCrea
1b290 74 65 54 61 72 67 65 74 53 63 68 65 6d 61 28 73  teTargetSchema(s
1b2a0 71 6c 69 74 65 33 72 62 75 20 2a 70 29 7b 0a 20  qlite3rbu *p){. 
1b2b0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
1b2c0 53 71 6c 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  Sql = 0;.  sqlit
1b2d0 65 33 5f 73 74 6d 74 20 2a 70 49 6e 73 65 72 74  e3_stmt *pInsert
1b2e0 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
1b2f0 20 72 62 75 49 73 56 61 63 75 75 6d 28 70 29 20   rbuIsVacuum(p) 
1b300 29 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c  );.  p->rc = sql
1b310 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 4d  ite3_exec(p->dbM
1b320 61 69 6e 2c 20 22 50 52 41 47 4d 41 20 77 72 69  ain, "PRAGMA wri
1b330 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d 31 22 2c  table_schema=1",
1b340 20 30 2c 30 2c 20 26 70 2d 3e 7a 45 72 72 6d 73   0,0, &p->zErrms
1b350 67 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  g);.  if( p->rc=
1b360 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1b370 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72    p->rc = prepar
1b380 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72  eAndCollectError
1b390 28 70 2d 3e 64 62 52 62 75 2c 20 26 70 53 71 6c  (p->dbRbu, &pSql
1b3a0 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 20 0a  , &p->zErrmsg, .
1b3b0 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 73 71        "SELECT sq
1b3c0 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  l FROM sqlite_ma
1b3d0 73 74 65 72 20 57 48 45 52 45 20 73 71 6c 21 3d  ster WHERE sql!=
1b3e0 27 27 20 41 4e 44 20 72 6f 6f 74 70 61 67 65 21  '' AND rootpage!
1b3f0 3d 30 22 0a 20 20 20 20 20 20 22 20 41 4e 44 20  =0".      " AND 
1b400 6e 61 6d 65 21 3d 27 73 71 6c 69 74 65 5f 73 65  name!='sqlite_se
1b410 71 75 65 6e 63 65 27 20 22 0a 20 20 20 20 20 20  quence' ".      
1b420 22 20 4f 52 44 45 52 20 42 59 20 74 79 70 65 20  " ORDER BY type 
1b430 44 45 53 43 22 0a 20 20 20 20 29 3b 0a 20 20 7d  DESC".    );.  }
1b440 0a 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63  ..  while( p->rc
1b450 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73  ==SQLITE_OK && s
1b460 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 71 6c  qlite3_step(pSql
1b470 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  )==SQLITE_ROW ){
1b480 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
1b490 2a 7a 53 71 6c 20 3d 20 28 63 6f 6e 73 74 20 63  *zSql = (const c
1b4a0 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
1b4b0 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 30  umn_text(pSql, 0
1b4c0 29 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73  );.    p->rc = s
1b4d0 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
1b4e0 62 4d 61 69 6e 2c 20 7a 53 71 6c 2c 20 30 2c 20  bMain, zSql, 0, 
1b4f0 30 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 29 3b  0, &p->zErrmsg);
1b500 0a 20 20 7d 0a 20 20 72 62 75 46 69 6e 61 6c 69  .  }.  rbuFinali
1b510 7a 65 28 70 2c 20 70 53 71 6c 29 3b 0a 20 20 69  ze(p, pSql);.  i
1b520 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45  f( p->rc!=SQLITE
1b530 5f 4f 4b 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  _OK ) return;.. 
1b540 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
1b550 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d 3e  TE_OK ){.    p->
1b560 72 63 20 3d 20 70 72 65 70 61 72 65 41 6e 64 43  rc = prepareAndC
1b570 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64  ollectError(p->d
1b580 62 52 62 75 2c 20 26 70 53 71 6c 2c 20 26 70 2d  bRbu, &pSql, &p-
1b590 3e 7a 45 72 72 6d 73 67 2c 20 0a 20 20 20 20 20  >zErrmsg, .     
1b5a0 20 20 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f     "SELECT * FRO
1b5b0 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  M sqlite_master 
1b5c0 57 48 45 52 45 20 72 6f 6f 74 70 61 67 65 3d 30  WHERE rootpage=0
1b5d0 20 4f 52 20 72 6f 6f 74 70 61 67 65 20 49 53 20   OR rootpage IS 
1b5e0 4e 55 4c 4c 22 20 0a 20 20 20 20 29 3b 0a 20 20  NULL" .    );.  
1b5f0 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  }..  if( p->rc==
1b600 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1b610 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65   p->rc = prepare
1b620 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28  AndCollectError(
1b630 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 70 49 6e 73  p->dbMain, &pIns
1b640 65 72 74 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67  ert, &p->zErrmsg
1b650 2c 20 0a 20 20 20 20 20 20 20 20 22 49 4e 53 45  , .        "INSE
1b660 52 54 20 49 4e 54 4f 20 73 71 6c 69 74 65 5f 6d  RT INTO sqlite_m
1b670 61 73 74 65 72 20 56 41 4c 55 45 53 28 3f 2c 3f  aster VALUES(?,?
1b680 2c 3f 2c 3f 2c 3f 29 22 0a 20 20 20 20 29 3b 0a  ,?,?,?)".    );.
1b690 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 70 2d    }..  while( p-
1b6a0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
1b6b0 26 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  & sqlite3_step(p
1b6c0 53 71 6c 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  Sql)==SQLITE_ROW
1b6d0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
1b6e0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 35 3b     for(i=0; i<5;
1b6f0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
1b700 69 74 65 33 5f 62 69 6e 64 5f 76 61 6c 75 65 28  ite3_bind_value(
1b710 70 49 6e 73 65 72 74 2c 20 69 2b 31 2c 20 73 71  pInsert, i+1, sq
1b720 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c  lite3_column_val
1b730 75 65 28 70 53 71 6c 2c 20 69 29 29 3b 0a 20 20  ue(pSql, i));.  
1b740 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
1b750 73 74 65 70 28 70 49 6e 73 65 72 74 29 3b 0a 20  step(pInsert);. 
1b760 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74     p->rc = sqlit
1b770 65 33 5f 72 65 73 65 74 28 70 49 6e 73 65 72 74  e3_reset(pInsert
1b780 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
1b790 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1b7a0 0a 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 4d  ite3_exec(p->dbM
1b7c0 61 69 6e 2c 20 22 50 52 41 47 4d 41 20 77 72 69  ain, "PRAGMA wri
1b7d0 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d 30 22 2c  table_schema=0",
1b7e0 30 2c 30 2c 26 70 2d 3e 7a 45 72 72 6d 73 67 29  0,0,&p->zErrmsg)
1b7f0 3b 0a 20 20 7d 0a 0a 20 20 72 62 75 46 69 6e 61  ;.  }..  rbuFina
1b800 6c 69 7a 65 28 70 2c 20 70 53 71 6c 29 3b 0a 20  lize(p, pSql);. 
1b810 20 72 62 75 46 69 6e 61 6c 69 7a 65 28 70 2c 20   rbuFinalize(p, 
1b820 70 49 6e 73 65 72 74 29 3b 0a 7d 0a 0a 0a 73 74  pInsert);.}...st
1b830 61 74 69 63 20 73 71 6c 69 74 65 33 72 62 75 20  atic sqlite3rbu 
1b840 2a 6f 70 65 6e 52 62 75 48 61 6e 64 6c 65 28 0a  *openRbuHandle(.
1b850 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
1b860 61 72 67 65 74 2c 20 0a 20 20 63 6f 6e 73 74 20  arget, .  const 
1b870 63 68 61 72 20 2a 7a 52 62 75 2c 0a 20 20 63 6f  char *zRbu,.  co
1b880 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 61 74 65  nst char *zState
1b890 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 72 62 75  .){.  sqlite3rbu
1b8a0 20 2a 70 3b 0a 20 20 73 69 7a 65 5f 74 20 6e 54   *p;.  size_t nT
1b8b0 61 72 67 65 74 20 3d 20 7a 54 61 72 67 65 74 20  arget = zTarget 
1b8c0 3f 20 73 74 72 6c 65 6e 28 7a 54 61 72 67 65 74  ? strlen(zTarget
1b8d0 29 20 3a 20 30 3b 0a 20 20 73 69 7a 65 5f 74 20  ) : 0;.  size_t 
1b8e0 6e 52 62 75 20 3d 20 73 74 72 6c 65 6e 28 7a 52  nRbu = strlen(zR
1b8f0 62 75 29 3b 0a 20 20 73 69 7a 65 5f 74 20 6e 53  bu);.  size_t nS
1b900 74 61 74 65 20 3d 20 7a 53 74 61 74 65 20 3f 20  tate = zState ? 
1b910 73 74 72 6c 65 6e 28 7a 53 74 61 74 65 29 20 3a  strlen(zState) :
1b920 20 30 3b 0a 20 20 73 69 7a 65 5f 74 20 6e 42 79   0;.  size_t nBy
1b930 74 65 20 3d 20 73 69 7a 65 6f 66 28 73 71 6c 69  te = sizeof(sqli
1b940 74 65 33 72 62 75 29 20 2b 20 6e 54 61 72 67 65  te3rbu) + nTarge
1b950 74 2b 31 20 2b 20 6e 52 62 75 2b 31 2b 20 6e 53  t+1 + nRbu+1+ nS
1b960 74 61 74 65 2b 31 3b 0a 0a 20 20 70 20 3d 20 28  tate+1;..  p = (
1b970 73 71 6c 69 74 65 33 72 62 75 2a 29 73 71 6c 69  sqlite3rbu*)sqli
1b980 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 42 79  te3_malloc64(nBy
1b990 74 65 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a  te);.  if( p ){.
1b9a0 20 20 20 20 52 62 75 53 74 61 74 65 20 2a 70 53      RbuState *pS
1b9b0 74 61 74 65 20 3d 20 30 3b 0a 0a 20 20 20 20 2f  tate = 0;..    /
1b9c0 2a 20 43 72 65 61 74 65 20 74 68 65 20 63 75 73  * Create the cus
1b9d0 74 6f 6d 20 56 46 53 2e 20 2a 2f 0a 20 20 20 20  tom VFS. */.    
1b9e0 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a  memset(p, 0, siz
1b9f0 65 6f 66 28 73 71 6c 69 74 65 33 72 62 75 29 29  eof(sqlite3rbu))
1ba00 3b 0a 20 20 20 20 72 62 75 43 72 65 61 74 65 56  ;.    rbuCreateV
1ba10 66 73 28 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f  fs(p);..    /* O
1ba20 70 65 6e 20 74 68 65 20 74 61 72 67 65 74 2c 20  pen the target, 
1ba30 52 42 55 20 61 6e 64 20 73 74 61 74 65 20 64 61  RBU and state da
1ba40 74 61 62 61 73 65 73 20 2a 2f 0a 20 20 20 20 69  tabases */.    i
1ba50 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
1ba60 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 63 68 61  _OK ){.      cha
1ba70 72 20 2a 70 43 73 72 20 3d 20 28 63 68 61 72 2a  r *pCsr = (char*
1ba80 29 26 70 5b 31 5d 3b 0a 20 20 20 20 20 20 69 66  )&p[1];.      if
1ba90 28 20 7a 54 61 72 67 65 74 20 29 7b 0a 20 20 20  ( zTarget ){.   
1baa0 20 20 20 20 20 70 2d 3e 7a 54 61 72 67 65 74 20       p->zTarget 
1bab0 3d 20 70 43 73 72 3b 0a 20 20 20 20 20 20 20 20  = pCsr;.        
1bac0 6d 65 6d 63 70 79 28 70 2d 3e 7a 54 61 72 67 65  memcpy(p->zTarge
1bad0 74 2c 20 7a 54 61 72 67 65 74 2c 20 6e 54 61 72  t, zTarget, nTar
1bae0 67 65 74 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  get+1);.        
1baf0 70 43 73 72 20 2b 3d 20 6e 54 61 72 67 65 74 2b  pCsr += nTarget+
1bb00 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
1bb10 20 70 2d 3e 7a 52 62 75 20 3d 20 70 43 73 72 3b   p->zRbu = pCsr;
1bb20 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 2d  .      memcpy(p-
1bb30 3e 7a 52 62 75 2c 20 7a 52 62 75 2c 20 6e 52 62  >zRbu, zRbu, nRb
1bb40 75 2b 31 29 3b 0a 20 20 20 20 20 20 70 43 73 72  u+1);.      pCsr
1bb50 20 2b 3d 20 6e 52 62 75 2b 31 3b 0a 20 20 20 20   += nRbu+1;.    
1bb60 20 20 69 66 28 20 7a 53 74 61 74 65 20 29 7b 0a    if( zState ){.
1bb70 20 20 20 20 20 20 20 20 70 2d 3e 7a 53 74 61 74          p->zStat
1bb80 65 20 3d 20 70 43 73 72 3b 0a 20 20 20 20 20 20  e = pCsr;.      
1bb90 20 20 6d 65 6d 63 70 79 28 70 2d 3e 7a 53 74 61    memcpy(p->zSta
1bba0 74 65 2c 20 7a 53 74 61 74 65 2c 20 6e 53 74 61  te, zState, nSta
1bbb0 74 65 2b 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  te+1);.      }. 
1bbc0 20 20 20 20 20 72 62 75 4f 70 65 6e 44 61 74 61       rbuOpenData
1bbd0 62 61 73 65 28 70 29 3b 0a 20 20 20 20 7d 0a 0a  base(p);.    }..
1bbe0 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
1bbf0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1bc00 20 20 70 53 74 61 74 65 20 3d 20 72 62 75 4c 6f    pState = rbuLo
1bc10 61 64 53 74 61 74 65 28 70 29 3b 0a 20 20 20 20  adState(p);.    
1bc20 20 20 61 73 73 65 72 74 28 20 70 53 74 61 74 65    assert( pState
1bc30 20 7c 7c 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54   || p->rc!=SQLIT
1bc40 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69 66  E_OK );.      if
1bc50 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
1bc60 4f 4b 20 29 7b 0a 0a 20 20 20 20 20 20 20 20 69  OK ){..        i
1bc70 66 28 20 70 53 74 61 74 65 2d 3e 65 53 74 61 67  f( pState->eStag
1bc80 65 3d 3d 30 20 29 7b 20 0a 20 20 20 20 20 20 20  e==0 ){ .       
1bc90 20 20 20 72 62 75 44 65 6c 65 74 65 4f 61 6c 46     rbuDeleteOalF
1bca0 69 6c 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ile(p);.        
1bcb0 20 20 72 62 75 49 6e 69 74 50 68 61 73 65 4f 6e    rbuInitPhaseOn
1bcc0 65 53 74 65 70 73 28 70 29 3b 0a 20 20 20 20 20  eSteps(p);.     
1bcd0 20 20 20 20 20 70 2d 3e 65 53 74 61 67 65 20 3d       p->eStage =
1bce0 20 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 3b 0a   RBU_STAGE_OAL;.
1bcf0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1bd00 20 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61           p->eSta
1bd10 67 65 20 3d 20 70 53 74 61 74 65 2d 3e 65 53 74  ge = pState->eSt
1bd20 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70  age;.          p
1bd30 2d 3e 6e 50 68 61 73 65 4f 6e 65 53 74 65 70 20  ->nPhaseOneStep 
1bd40 3d 20 70 53 74 61 74 65 2d 3e 6e 50 68 61 73 65  = pState->nPhase
1bd50 4f 6e 65 53 74 65 70 3b 0a 20 20 20 20 20 20 20  OneStep;.       
1bd60 20 7d 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 50   }.        p->nP
1bd70 72 6f 67 72 65 73 73 20 3d 20 70 53 74 61 74 65  rogress = pState
1bd80 2d 3e 6e 50 72 6f 67 72 65 73 73 3b 0a 20 20 20  ->nProgress;.   
1bd90 20 20 20 20 20 70 2d 3e 69 4f 61 6c 53 7a 20 3d       p->iOalSz =
1bda0 20 70 53 74 61 74 65 2d 3e 69 4f 61 6c 53 7a 3b   pState->iOalSz;
1bdb0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1bdc0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63     assert( p->rc
1bdd0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  !=SQLITE_OK || p
1bde0 2d 3e 65 53 74 61 67 65 21 3d 30 20 29 3b 0a 0a  ->eStage!=0 );..
1bdf0 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
1be00 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 70  QLITE_OK && p->p
1be10 54 61 72 67 65 74 46 64 2d 3e 70 57 61 6c 46 64  TargetFd->pWalFd
1be20 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   ){.      if( p-
1be30 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41  >eStage==RBU_STA
1be40 47 45 5f 4f 41 4c 20 29 7b 0a 20 20 20 20 20 20  GE_OAL ){.      
1be50 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
1be60 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
1be70 70 2d 3e 7a 45 72 72 6d 73 67 20 3d 20 73 71 6c  p->zErrmsg = sql
1be80 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 63 61  ite3_mprintf("ca
1be90 6e 6e 6f 74 20 75 70 64 61 74 65 20 77 61 6c 20  nnot update wal 
1bea0 6d 6f 64 65 20 64 61 74 61 62 61 73 65 22 29 3b  mode database");
1beb0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1bec0 20 70 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f   p->eStage==RBU_
1bed0 53 54 41 47 45 5f 4d 4f 56 45 20 29 7b 0a 20 20  STAGE_MOVE ){.  
1bee0 20 20 20 20 20 20 70 2d 3e 65 53 74 61 67 65 20        p->eStage 
1bef0 3d 20 52 42 55 5f 53 54 41 47 45 5f 43 4b 50 54  = RBU_STAGE_CKPT
1bf00 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 74  ;.        p->nSt
1bf10 65 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ep = 0;.      }.
1bf20 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70      }..    if( p
1bf30 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
1bf40 0a 20 20 20 20 20 26 26 20 28 70 2d 3e 65 53 74  .     && (p->eSt
1bf50 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4f  age==RBU_STAGE_O
1bf60 41 4c 20 7c 7c 20 70 2d 3e 65 53 74 61 67 65 3d  AL || p->eStage=
1bf70 3d 52 42 55 5f 53 54 41 47 45 5f 4d 4f 56 45 29  =RBU_STAGE_MOVE)
1bf80 0a 20 20 20 20 20 26 26 20 70 53 74 61 74 65 2d  .     && pState-
1bf90 3e 65 53 74 61 67 65 21 3d 30 0a 20 20 20 20 29  >eStage!=0.    )
1bfa0 7b 0a 20 20 20 20 20 20 72 62 75 5f 66 69 6c 65  {.      rbu_file
1bfb0 20 2a 70 46 64 20 3d 20 28 72 62 75 49 73 56 61   *pFd = (rbuIsVa
1bfc0 63 75 75 6d 28 70 29 20 3f 20 70 2d 3e 70 52 62  cuum(p) ? p->pRb
1bfd0 75 46 64 20 3a 20 70 2d 3e 70 54 61 72 67 65 74  uFd : p->pTarget
1bfe0 46 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  Fd);.      if( p
1bff0 46 64 2d 3e 69 43 6f 6f 6b 69 65 21 3d 70 53 74  Fd->iCookie!=pSt
1c000 61 74 65 2d 3e 69 43 6f 6f 6b 69 65 20 29 7b 20  ate->iCookie ){ 
1c010 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74    .        /* At
1c020 20 74 68 69 73 20 70 6f 69 6e 74 20 28 70 54 61   this point (pTa
1c030 72 67 65 74 46 64 2d 3e 69 43 6f 6f 6b 69 65 29  rgetFd->iCookie)
1c040 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61   contains the va
1c050 6c 75 65 20 6f 66 20 74 68 65 0a 20 20 20 20 20  lue of the.     
1c060 20 20 20 2a 2a 20 63 68 61 6e 67 65 2d 63 6f 75     ** change-cou
1c070 6e 74 65 72 20 63 6f 6f 6b 69 65 20 28 74 68 65  nter cookie (the
1c080 20 74 68 69 6e 67 20 74 68 61 74 20 67 65 74 73   thing that gets
1c090 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 68 65   incremented whe
1c0a0 6e 20 61 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  n a .        ** 
1c0b0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
1c0c0 6f 6d 6d 69 74 74 65 64 20 69 6e 20 72 6f 6c 6c  ommitted in roll
1c0d0 62 61 63 6b 20 6d 6f 64 65 29 20 63 75 72 72 65  back mode) curre
1c0e0 6e 74 6c 79 20 73 74 6f 72 65 64 20 6f 6e 20 0a  ntly stored on .
1c0f0 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20          ** page 
1c100 31 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  1 of the databas
1c110 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20  e file. */.     
1c120 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
1c130 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20  E_BUSY;.        
1c140 70 2d 3e 7a 45 72 72 6d 73 67 20 3d 20 73 71 6c  p->zErrmsg = sql
1c150 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 64 61  ite3_mprintf("da
1c160 74 61 62 61 73 65 20 6d 6f 64 69 66 69 65 64 20  tabase modified 
1c170 64 75 72 69 6e 67 20 72 62 75 20 25 73 22 2c 0a  during rbu %s",.
1c180 20 20 20 20 20 20 20 20 20 20 20 20 28 72 62 75              (rbu
1c190 49 73 56 61 63 75 75 6d 28 70 29 20 3f 20 22 76  IsVacuum(p) ? "v
1c1a0 61 63 75 75 6d 22 20 3a 20 22 75 70 64 61 74 65  acuum" : "update
1c1b0 22 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  ").        );.  
1c1c0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1c1d0 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
1c1e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
1c1f0 66 28 20 70 2d 3e 65 53 74 61 67 65 3d 3d 52 42  f( p->eStage==RB
1c200 55 5f 53 54 41 47 45 5f 4f 41 4c 20 29 7b 0a 20  U_STAGE_OAL ){. 
1c210 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a         sqlite3 *
1c220 64 62 20 3d 20 70 2d 3e 64 62 4d 61 69 6e 3b 0a  db = p->dbMain;.
1c230 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53 74  .        if( pSt
1c240 61 74 65 2d 3e 65 53 74 61 67 65 3d 3d 30 20 26  ate->eStage==0 &
1c250 26 20 72 62 75 49 73 56 61 63 75 75 6d 28 70 29  & rbuIsVacuum(p)
1c260 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 62   ){.          rb
1c270 75 43 6f 70 79 50 72 61 67 6d 61 28 70 2c 20 22  uCopyPragma(p, "
1c280 70 61 67 65 5f 73 69 7a 65 22 29 3b 0a 20 20 20  page_size");.   
1c290 20 20 20 20 20 20 20 72 62 75 43 6f 70 79 50 72         rbuCopyPr
1c2a0 61 67 6d 61 28 70 2c 20 22 61 75 74 6f 5f 76 61  agma(p, "auto_va
1c2b0 63 75 75 6d 22 29 3b 0a 20 20 20 20 20 20 20 20  cuum");.        
1c2c0 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 70  }..        /* Op
1c2d0 65 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  en transactions 
1c2e0 62 6f 74 68 20 64 61 74 61 62 61 73 65 73 2e 20  both databases. 
1c2f0 54 68 65 20 2a 2d 6f 61 6c 20 66 69 6c 65 20 69  The *-oal file i
1c300 73 20 6f 70 65 6e 65 64 20 6f 72 0a 20 20 20 20  s opened or.    
1c310 20 20 20 20 2a 2a 20 63 72 65 61 74 65 64 20 61      ** created a
1c320 74 20 74 68 69 73 20 70 6f 69 6e 74 2e 20 2a 2f  t this point. */
1c330 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
1c340 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1c350 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63  .          p->rc
1c360 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28   = sqlite3_exec(
1c370 64 62 2c 20 22 42 45 47 49 4e 20 49 4d 4d 45 44  db, "BEGIN IMMED
1c380 49 41 54 45 22 2c 20 30 2c 20 30 2c 20 26 70 2d  IATE", 0, 0, &p-
1c390 3e 7a 45 72 72 6d 73 67 29 3b 0a 20 20 20 20 20  >zErrmsg);.     
1c3a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
1c3b0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1c3c0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  K ){.          p
1c3d0 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65  ->rc = sqlite3_e
1c3e0 78 65 63 28 70 2d 3e 64 62 52 62 75 2c 20 22 42  xec(p->dbRbu, "B
1c3f0 45 47 49 4e 22 2c 20 30 2c 20 30 2c 20 26 70 2d  EGIN", 0, 0, &p-
1c400 3e 7a 45 72 72 6d 73 67 29 3b 0a 20 20 20 20 20  >zErrmsg);.     
1c410 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
1c420 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 6d 61   Check if the ma
1c430 69 6e 20 64 61 74 61 62 61 73 65 20 69 73 20 61  in database is a
1c440 20 7a 69 70 76 66 73 20 64 62 2e 20 49 66 20 69   zipvfs db. If i
1c450 74 20 69 73 2c 20 73 65 74 20 74 68 65 20 75 70  t is, set the up
1c460 70 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c  per.        ** l
1c470 65 76 65 6c 20 70 61 67 65 72 20 74 6f 20 75 73  evel pager to us
1c480 65 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  e "journal_mode=
1c490 6f 66 66 22 2e 20 54 68 69 73 20 70 72 65 76 65  off". This preve
1c4a0 6e 74 73 20 69 74 20 66 72 6f 6d 20 0a 20 20 20  nts it from .   
1c4b0 20 20 20 20 20 2a 2a 20 67 65 6e 65 72 61 74 69       ** generati
1c4c0 6e 67 20 61 20 6c 61 72 67 65 20 6a 6f 75 72 6e  ng a large journ
1c4d0 61 6c 20 75 73 69 6e 67 20 61 20 74 65 6d 70 20  al using a temp 
1c4e0 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20  file.  */.      
1c4f0 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
1c500 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1c510 20 20 20 20 69 6e 74 20 66 72 63 20 3d 20 73 71      int frc = sq
1c520 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
1c530 6f 6c 28 64 62 2c 20 22 6d 61 69 6e 22 2c 20 53  ol(db, "main", S
1c540 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 5a 49 50 56  QLITE_FCNTL_ZIPV
1c550 46 53 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  FS, 0);.        
1c560 20 20 69 66 28 20 66 72 63 3d 3d 53 51 4c 49 54    if( frc==SQLIT
1c570 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1c580 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69      p->rc = sqli
1c590 74 65 33 5f 65 78 65 63 28 64 62 2c 20 22 50 52  te3_exec(db, "PR
1c5a0 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
1c5b0 65 3d 6f 66 66 22 2c 30 2c 30 2c 26 70 2d 3e 7a  e=off",0,0,&p->z
1c5c0 45 72 72 6d 73 67 29 3b 0a 20 20 20 20 20 20 20  Errmsg);.       
1c5d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a     }.        }..
1c5e0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
1c5f0 69 73 20 69 73 20 61 6e 20 52 42 55 20 76 61 63  is is an RBU vac
1c600 75 75 6d 20 6f 70 65 72 61 74 69 6f 6e 20 61 6e  uum operation an
1c610 64 20 74 68 65 20 73 74 61 74 65 20 74 61 62 6c  d the state tabl
1c620 65 20 77 61 73 20 65 6d 70 74 79 0a 20 20 20 20  e was empty.    
1c630 20 20 20 20 2a 2a 20 77 68 65 6e 20 74 68 69 73      ** when this
1c640 20 68 61 6e 64 6c 65 20 77 61 73 20 6f 70 65 6e   handle was open
1c650 65 64 2c 20 63 72 65 61 74 65 20 74 68 65 20 74  ed, create the t
1c660 61 72 67 65 74 20 64 61 74 61 62 61 73 65 20 73  arget database s
1c670 63 68 65 6d 61 2e 20 2a 2f 0a 20 20 20 20 20 20  chema. */.      
1c680 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
1c690 49 54 45 5f 4f 4b 20 26 26 20 70 53 74 61 74 65  ITE_OK && pState
1c6a0 2d 3e 65 53 74 61 67 65 3d 3d 30 20 26 26 20 72  ->eStage==0 && r
1c6b0 62 75 49 73 56 61 63 75 75 6d 28 70 29 20 29 7b  buIsVacuum(p) ){
1c6c0 0a 20 20 20 20 20 20 20 20 20 20 72 62 75 43 72  .          rbuCr
1c6d0 65 61 74 65 54 61 72 67 65 74 53 63 68 65 6d 61  eateTargetSchema
1c6e0 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  (p);.          r
1c6f0 62 75 43 6f 70 79 50 72 61 67 6d 61 28 70 2c 20  buCopyPragma(p, 
1c700 22 75 73 65 72 5f 76 65 72 73 69 6f 6e 22 29 3b  "user_version");
1c710 0a 20 20 20 20 20 20 20 20 20 20 72 62 75 43 6f  .          rbuCo
1c720 70 79 50 72 61 67 6d 61 28 70 2c 20 22 61 70 70  pyPragma(p, "app
1c730 6c 69 63 61 74 69 6f 6e 5f 69 64 22 29 3b 0a 20  lication_id");. 
1c740 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
1c750 20 20 2f 2a 20 50 6f 69 6e 74 20 74 68 65 20 6f    /* Point the o
1c760 62 6a 65 63 74 20 69 74 65 72 61 74 6f 72 20 61  bject iterator a
1c770 74 20 74 68 65 20 66 69 72 73 74 20 6f 62 6a 65  t the first obje
1c780 63 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  ct */.        if
1c790 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
1c7a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
1c7b0 70 2d 3e 72 63 20 3d 20 72 62 75 4f 62 6a 49 74  p->rc = rbuObjIt
1c7c0 65 72 46 69 72 73 74 28 70 2c 20 26 70 2d 3e 6f  erFirst(p, &p->o
1c7d0 62 6a 69 74 65 72 29 3b 0a 20 20 20 20 20 20 20  bjiter);.       
1c7e0 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   }..        /* I
1c7f0 66 20 74 68 65 20 52 42 55 20 64 61 74 61 62 61  f the RBU databa
1c800 73 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64  se contains no d
1c810 61 74 61 5f 78 78 78 20 74 61 62 6c 65 73 2c 20  ata_xxx tables, 
1c820 64 65 63 6c 61 72 65 20 74 68 65 20 52 42 55 0a  declare the RBU.
1c830 20 20 20 20 20 20 20 20 2a 2a 20 75 70 64 61 74          ** updat
1c840 65 20 66 69 6e 69 73 68 65 64 2e 20 20 2a 2f 0a  e finished.  */.
1c850 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72          if( p->r
1c860 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1c870 70 2d 3e 6f 62 6a 69 74 65 72 2e 7a 54 62 6c 3d  p->objiter.zTbl=
1c880 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1c890 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 44  p->rc = SQLITE_D
1c8a0 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  ONE;.        }..
1c8b0 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72          if( p->r
1c8c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1c8d0 20 20 20 20 20 20 20 20 20 20 72 62 75 53 65 74            rbuSet
1c8e0 75 70 4f 61 6c 28 70 2c 20 70 53 74 61 74 65 29  upOal(p, pState)
1c8f0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
1c900 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e     }else if( p->
1c910 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47  eStage==RBU_STAG
1c920 45 5f 4d 4f 56 45 20 29 7b 0a 20 20 20 20 20 20  E_MOVE ){.      
1c930 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20    /* no-op */.  
1c940 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d      }else if( p-
1c950 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41  >eStage==RBU_STA
1c960 47 45 5f 43 4b 50 54 20 29 7b 0a 20 20 20 20 20  GE_CKPT ){.     
1c970 20 20 20 72 62 75 53 65 74 75 70 43 68 65 63 6b     rbuSetupCheck
1c980 70 6f 69 6e 74 28 70 2c 20 70 53 74 61 74 65 29  point(p, pState)
1c990 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
1c9a0 28 20 70 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55  ( p->eStage==RBU
1c9b0 5f 53 54 41 47 45 5f 44 4f 4e 45 20 29 7b 0a 20  _STAGE_DONE ){. 
1c9c0 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53         p->rc = S
1c9d0 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
1c9e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1c9f0 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
1ca00 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 7d  CORRUPT;.      }
1ca10 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 62 75 46  .    }..    rbuF
1ca20 72 65 65 53 74 61 74 65 28 70 53 74 61 74 65 29  reeState(pState)
1ca30 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
1ca40 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  p;.}../*.** Open
1ca50 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 6e 65   and return a ne
1ca60 77 20 52 42 55 20 68 61 6e 64 6c 65 2e 20 0a 2a  w RBU handle. .*
1ca70 2f 0a 73 71 6c 69 74 65 33 72 62 75 20 2a 73 71  /.sqlite3rbu *sq
1ca80 6c 69 74 65 33 72 62 75 5f 6f 70 65 6e 28 0a 20  lite3rbu_open(. 
1ca90 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
1caa0 72 67 65 74 2c 20 0a 20 20 63 6f 6e 73 74 20 63  rget, .  const c
1cab0 68 61 72 20 2a 7a 52 62 75 2c 0a 20 20 63 6f 6e  har *zRbu,.  con
1cac0 73 74 20 63 68 61 72 20 2a 7a 53 74 61 74 65 0a  st char *zState.
1cad0 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 43 68  ){.  /* TODO: Ch
1cae0 65 63 6b 20 74 68 61 74 20 7a 54 61 72 67 65 74  eck that zTarget
1caf0 20 61 6e 64 20 7a 52 62 75 20 61 72 65 20 6e 6f   and zRbu are no
1cb00 6e 2d 4e 55 4c 4c 20 2a 2f 0a 20 20 72 65 74 75  n-NULL */.  retu
1cb10 72 6e 20 6f 70 65 6e 52 62 75 48 61 6e 64 6c 65  rn openRbuHandle
1cb20 28 7a 54 61 72 67 65 74 2c 20 7a 52 62 75 2c 20  (zTarget, zRbu, 
1cb30 7a 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  zState);.}../*.*
1cb40 2a 20 4f 70 65 6e 20 61 20 68 61 6e 64 6c 65 20  * Open a handle 
1cb50 74 6f 20 62 65 67 69 6e 20 6f 72 20 72 65 73 75  to begin or resu
1cb60 6d 65 20 61 6e 20 52 42 55 20 56 41 43 55 55 4d  me an RBU VACUUM
1cb70 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73   operation..*/.s
1cb80 71 6c 69 74 65 33 72 62 75 20 2a 73 71 6c 69 74  qlite3rbu *sqlit
1cb90 65 33 72 62 75 5f 76 61 63 75 75 6d 28 0a 20 20  e3rbu_vacuum(.  
1cba0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 72  const char *zTar
1cbb0 67 65 74 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68  get, .  const ch
1cbc0 61 72 20 2a 7a 53 74 61 74 65 0a 29 7b 0a 20 20  ar *zState.){.  
1cbd0 2f 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20 74  /* TODO: Check t
1cbe0 68 61 74 20 62 6f 74 68 20 61 72 67 75 6d 65 6e  hat both argumen
1cbf0 74 73 20 61 72 65 20 6e 6f 6e 2d 4e 55 4c 4c 20  ts are non-NULL 
1cc00 2a 2f 0a 20 20 72 65 74 75 72 6e 20 6f 70 65 6e  */.  return open
1cc10 52 62 75 48 61 6e 64 6c 65 28 30 2c 20 7a 54 61  RbuHandle(0, zTa
1cc20 72 67 65 74 2c 20 7a 53 74 61 74 65 29 3b 0a 7d  rget, zState);.}
1cc30 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1cc40 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
1cc50 6c 65 20 75 73 65 64 20 62 79 20 70 52 62 75 2e  le used by pRbu.
1cc60 0a 2a 2f 0a 73 71 6c 69 74 65 33 20 2a 73 71 6c  .*/.sqlite3 *sql
1cc70 69 74 65 33 72 62 75 5f 64 62 28 73 71 6c 69 74  ite3rbu_db(sqlit
1cc80 65 33 72 62 75 20 2a 70 52 62 75 2c 20 69 6e 74  e3rbu *pRbu, int
1cc90 20 62 52 62 75 29 7b 0a 20 20 73 71 6c 69 74 65   bRbu){.  sqlite
1cca0 33 20 2a 64 62 20 3d 20 30 3b 0a 20 20 69 66 28  3 *db = 0;.  if(
1ccb0 20 70 52 62 75 20 29 7b 0a 20 20 20 20 64 62 20   pRbu ){.    db 
1ccc0 3d 20 28 62 52 62 75 20 3f 20 70 52 62 75 2d 3e  = (bRbu ? pRbu->
1ccd0 64 62 52 62 75 20 3a 20 70 52 62 75 2d 3e 64 62  dbRbu : pRbu->db
1cce0 4d 61 69 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Main);.  }.  ret
1ccf0 75 72 6e 20 64 62 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn db;.}.../*.*
1cd00 2a 20 49 66 20 74 68 65 20 65 72 72 6f 72 20 63  * If the error c
1cd10 6f 64 65 20 63 75 72 72 65 6e 74 6c 79 20 73 74  ode currently st
1cd20 6f 72 65 64 20 69 6e 20 74 68 65 20 52 42 55 20  ored in the RBU 
1cd30 68 61 6e 64 6c 65 20 69 73 20 53 51 4c 49 54 45  handle is SQLITE
1cd40 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 0a 2a 2a 20  _CONSTRAINT,.** 
1cd50 74 68 65 6e 20 65 64 69 74 20 61 6e 79 20 65 72  then edit any er
1cd60 72 6f 72 20 6d 65 73 73 61 67 65 20 73 74 72 69  ror message stri
1cd70 6e 67 20 73 6f 20 61 73 20 74 6f 20 72 65 6d 6f  ng so as to remo
1cd80 76 65 20 61 6c 6c 20 6f 63 63 75 72 72 65 6e 63  ve all occurrenc
1cd90 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 70 61 74  es of.** the pat
1cda0 74 65 72 6e 20 22 72 62 75 5f 69 6d 70 5f 5b 30  tern "rbu_imp_[0
1cdb0 2d 39 5d 2a 22 2e 0a 2a 2f 0a 73 74 61 74 69 63  -9]*"..*/.static
1cdc0 20 76 6f 69 64 20 72 62 75 45 64 69 74 45 72 72   void rbuEditErr
1cdd0 6d 73 67 28 73 71 6c 69 74 65 33 72 62 75 20 2a  msg(sqlite3rbu *
1cde0 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  p){.  if( p->rc=
1cdf0 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  =SQLITE_CONSTRAI
1ce00 4e 54 20 26 26 20 70 2d 3e 7a 45 72 72 6d 73 67  NT && p->zErrmsg
1ce10 20 29 7b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64   ){.    unsigned
1ce20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 69 7a 65   int i;.    size
1ce30 5f 74 20 6e 45 72 72 6d 73 67 20 3d 20 73 74 72  _t nErrmsg = str
1ce40 6c 65 6e 28 70 2d 3e 7a 45 72 72 6d 73 67 29 3b  len(p->zErrmsg);
1ce50 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
1ce60 28 6e 45 72 72 6d 73 67 2d 38 29 3b 20 69 2b 2b  (nErrmsg-8); i++
1ce70 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6d 65 6d  ){.      if( mem
1ce80 63 6d 70 28 26 70 2d 3e 7a 45 72 72 6d 73 67 5b  cmp(&p->zErrmsg[
1ce90 69 5d 2c 20 22 72 62 75 5f 69 6d 70 5f 22 2c 20  i], "rbu_imp_", 
1cea0 38 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  8)==0 ){.       
1ceb0 20 69 6e 74 20 6e 44 65 6c 20 3d 20 38 3b 0a 20   int nDel = 8;. 
1cec0 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 2d         while( p-
1ced0 3e 7a 45 72 72 6d 73 67 5b 69 2b 6e 44 65 6c 5d  >zErrmsg[i+nDel]
1cee0 3e 3d 27 30 27 20 26 26 20 70 2d 3e 7a 45 72 72  >='0' && p->zErr
1cef0 6d 73 67 5b 69 2b 6e 44 65 6c 5d 3c 3d 27 39 27  msg[i+nDel]<='9'
1cf00 20 29 20 6e 44 65 6c 2b 2b 3b 0a 20 20 20 20 20   ) nDel++;.     
1cf10 20 20 20 6d 65 6d 6d 6f 76 65 28 26 70 2d 3e 7a     memmove(&p->z
1cf20 45 72 72 6d 73 67 5b 69 5d 2c 20 26 70 2d 3e 7a  Errmsg[i], &p->z
1cf30 45 72 72 6d 73 67 5b 69 2b 6e 44 65 6c 5d 2c 20  Errmsg[i+nDel], 
1cf40 6e 45 72 72 6d 73 67 20 2b 20 31 20 2d 20 69 20  nErrmsg + 1 - i 
1cf50 2d 20 6e 44 65 6c 29 3b 0a 20 20 20 20 20 20 20  - nDel);.       
1cf60 20 6e 45 72 72 6d 73 67 20 2d 3d 20 6e 44 65 6c   nErrmsg -= nDel
1cf70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1cf80 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f    }.}../*.** Clo
1cf90 73 65 20 74 68 65 20 52 42 55 20 68 61 6e 64 6c  se the RBU handl
1cfa0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
1cfb0 33 72 62 75 5f 63 6c 6f 73 65 28 73 71 6c 69 74  3rbu_close(sqlit
1cfc0 65 33 72 62 75 20 2a 70 2c 20 63 68 61 72 20 2a  e3rbu *p, char *
1cfd0 2a 70 7a 45 72 72 6d 73 67 29 7b 0a 20 20 69 6e  *pzErrmsg){.  in
1cfe0 74 20 72 63 3b 0a 20 20 69 66 28 20 70 20 29 7b  t rc;.  if( p ){
1cff0 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 6d 69 74 20  ..    /* Commit 
1d000 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1d010 74 6f 20 74 68 65 20 2a 2d 6f 61 6c 20 66 69 6c  to the *-oal fil
1d020 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d  e. */.    if( p-
1d030 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
1d040 26 20 70 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55  & p->eStage==RBU
1d050 5f 53 54 41 47 45 5f 4f 41 4c 20 29 7b 0a 20 20  _STAGE_OAL ){.  
1d060 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69      p->rc = sqli
1d070 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 4d 61  te3_exec(p->dbMa
1d080 69 6e 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c  in, "COMMIT", 0,
1d090 20 30 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 29   0, &p->zErrmsg)
1d0a0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 62 75  ;.    }..    rbu
1d0b0 53 61 76 65 53 74 61 74 65 28 70 2c 20 70 2d 3e  SaveState(p, p->
1d0c0 65 53 74 61 67 65 29 3b 0a 0a 20 20 20 20 69 66  eStage);..    if
1d0d0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
1d0e0 4f 4b 20 26 26 20 70 2d 3e 65 53 74 61 67 65 3d  OK && p->eStage=
1d0f0 3d 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20 29  =RBU_STAGE_OAL )
1d100 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20  {.      p->rc = 
1d110 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e  sqlite3_exec(p->
1d120 64 62 52 62 75 2c 20 22 43 4f 4d 4d 49 54 22 2c  dbRbu, "COMMIT",
1d130 20 30 2c 20 30 2c 20 26 70 2d 3e 7a 45 72 72 6d   0, 0, &p->zErrm
1d140 73 67 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  sg);.    }..    
1d150 2f 2a 20 43 6c 6f 73 65 20 61 6e 79 20 6f 70 65  /* Close any ope
1d160 6e 20 73 74 61 74 65 6d 65 6e 74 20 68 61 6e 64  n statement hand
1d170 6c 65 73 2e 20 2a 2f 0a 20 20 20 20 72 62 75 4f  les. */.    rbuO
1d180 62 6a 49 74 65 72 46 69 6e 61 6c 69 7a 65 28 26  bjIterFinalize(&
1d190 70 2d 3e 6f 62 6a 69 74 65 72 29 3b 0a 0a 20 20  p->objiter);..  
1d1a0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
1d1b0 61 6e 20 52 42 55 20 76 61 63 75 75 6d 20 68 61  an RBU vacuum ha
1d1c0 6e 64 6c 65 20 61 6e 64 20 74 68 65 20 76 61 63  ndle and the vac
1d1d0 75 75 6d 20 68 61 73 20 65 69 74 68 65 72 20 66  uum has either f
1d1e0 69 6e 69 73 68 65 64 0a 20 20 20 20 2a 2a 20 73  inished.    ** s
1d1f0 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 72 20 65  uccessfully or e
1d200 6e 63 6f 75 6e 74 65 72 65 64 20 61 6e 20 65 72  ncountered an er
1d210 72 6f 72 2c 20 64 65 6c 65 74 65 20 74 68 65 20  ror, delete the 
1d220 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
1d230 0a 20 20 20 20 2a 2a 20 73 74 61 74 65 20 74 61  .    ** state ta
1d240 62 6c 65 2e 20 54 68 69 73 20 63 61 75 73 65 73  ble. This causes
1d250 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74   the next call t
1d260 6f 20 73 71 6c 69 74 65 33 72 62 75 5f 76 61 63  o sqlite3rbu_vac
1d270 75 75 6d 28 29 20 0a 20 20 20 20 2a 2a 20 73 70  uum() .    ** sp
1d280 65 63 69 66 79 69 6e 67 20 74 68 65 20 63 75 72  ecifying the cur
1d290 72 65 6e 74 20 74 61 72 67 65 74 20 61 6e 64 20  rent target and 
1d2a0 73 74 61 74 65 20 64 61 74 61 62 61 73 65 73 20  state databases 
1d2b0 74 6f 20 73 74 61 72 74 20 61 20 6e 65 77 0a 20  to start a new. 
1d2c0 20 20 20 2a 2a 20 76 61 63 75 75 6d 20 66 72 6f     ** vacuum fro
1d2d0 6d 20 73 63 72 61 74 63 68 2e 20 20 2a 2f 0a 20  m scratch.  */. 
1d2e0 20 20 20 69 66 28 20 72 62 75 49 73 56 61 63 75     if( rbuIsVacu
1d2f0 75 6d 28 70 29 20 26 26 20 70 2d 3e 72 63 21 3d  um(p) && p->rc!=
1d300 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e  SQLITE_OK && p->
1d310 64 62 52 62 75 20 29 7b 0a 20 20 20 20 20 20 69  dbRbu ){.      i
1d320 6e 74 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33  nt rc2 = sqlite3
1d330 5f 65 78 65 63 28 70 2d 3e 64 62 52 62 75 2c 20  _exec(p->dbRbu, 
1d340 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 73 74 61  "DELETE FROM sta
1d350 74 2e 72 62 75 5f 73 74 61 74 65 22 2c 20 30 2c  t.rbu_state", 0,
1d360 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66   0, 0);.      if
1d370 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
1d380 44 4f 4e 45 20 26 26 20 72 63 32 21 3d 53 51 4c  DONE && rc2!=SQL
1d390 49 54 45 5f 4f 4b 20 29 20 70 2d 3e 72 63 20 3d  ITE_OK ) p->rc =
1d3a0 20 72 63 32 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   rc2;.    }..   
1d3b0 20 2f 2a 20 43 6c 6f 73 65 20 74 68 65 20 6f 70   /* Close the op
1d3c0 65 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  en database hand
1d3d0 6c 65 20 61 6e 64 20 56 46 53 20 6f 62 6a 65 63  le and VFS objec
1d3e0 74 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  t. */.    sqlite
1d3f0 33 5f 63 6c 6f 73 65 28 70 2d 3e 64 62 52 62 75  3_close(p->dbRbu
1d400 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
1d410 6c 6f 73 65 28 70 2d 3e 64 62 4d 61 69 6e 29 3b  lose(p->dbMain);
1d420 0a 20 20 20 20 72 62 75 44 65 6c 65 74 65 56 66  .    rbuDeleteVf
1d430 73 28 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  s(p);.    sqlite
1d440 33 5f 66 72 65 65 28 70 2d 3e 61 42 75 66 29 3b  3_free(p->aBuf);
1d450 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
1d460 65 28 70 2d 3e 61 46 72 61 6d 65 29 3b 0a 0a 20  e(p->aFrame);.. 
1d470 20 20 20 72 62 75 45 64 69 74 45 72 72 6d 73 67     rbuEditErrmsg
1d480 28 70 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 2d  (p);.    rc = p-
1d490 3e 72 63 3b 0a 20 20 20 20 2a 70 7a 45 72 72 6d  >rc;.    *pzErrm
1d4a0 73 67 20 3d 20 70 2d 3e 7a 45 72 72 6d 73 67 3b  sg = p->zErrmsg;
1d4b0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
1d4c0 65 28 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  e(p);.  }else{. 
1d4d0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
1d4e0 4f 4d 45 4d 3b 0a 20 20 20 20 2a 70 7a 45 72 72  OMEM;.    *pzErr
1d4f0 6d 73 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  msg = 0;.  }.  r
1d500 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1d510 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74 6f  ** Return the to
1d520 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6b 65  tal number of ke
1d530 79 2d 76 61 6c 75 65 20 6f 70 65 72 61 74 69 6f  y-value operatio
1d540 6e 73 20 28 69 6e 73 65 72 74 73 2c 20 64 65 6c  ns (inserts, del
1d550 65 74 65 73 20 6f 72 20 0a 2a 2a 20 75 70 64 61  etes or .** upda
1d560 74 65 73 29 20 74 68 61 74 20 68 61 76 65 20 62  tes) that have b
1d570 65 65 6e 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e  een performed on
1d580 20 74 68 65 20 74 61 72 67 65 74 20 64 61 74 61   the target data
1d590 62 61 73 65 20 73 69 6e 63 65 20 74 68 65 0a 2a  base since the.*
1d5a0 2a 20 63 75 72 72 65 6e 74 20 52 42 55 20 75 70  * current RBU up
1d5b0 64 61 74 65 20 77 61 73 20 73 74 61 72 74 65 64  date was started
1d5c0 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 69 6e 74  ..*/.sqlite3_int
1d5d0 36 34 20 73 71 6c 69 74 65 33 72 62 75 5f 70 72  64 sqlite3rbu_pr
1d5e0 6f 67 72 65 73 73 28 73 71 6c 69 74 65 33 72 62  ogress(sqlite3rb
1d5f0 75 20 2a 70 52 62 75 29 7b 0a 20 20 72 65 74 75  u *pRbu){.  retu
1d600 72 6e 20 70 52 62 75 2d 3e 6e 50 72 6f 67 72 65  rn pRbu->nProgre
1d610 73 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ss;.}../*.** Ret
1d620 75 72 6e 20 70 65 72 6d 79 72 69 61 64 61 67 65  urn permyriadage
1d630 20 70 72 6f 67 72 65 73 73 20 69 6e 64 69 63 61   progress indica
1d640 74 69 6f 6e 73 20 66 6f 72 20 74 68 65 20 74 77  tions for the tw
1d650 6f 20 6d 61 69 6e 20 73 74 61 67 65 73 20 6f 66  o main stages of
1d660 0a 2a 2a 20 61 6e 20 52 42 55 20 75 70 64 61 74  .** an RBU updat
1d670 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
1d680 65 33 72 62 75 5f 62 70 5f 70 72 6f 67 72 65 73  e3rbu_bp_progres
1d690 73 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c  s(sqlite3rbu *p,
1d6a0 20 69 6e 74 20 2a 70 6e 4f 6e 65 2c 20 69 6e 74   int *pnOne, int
1d6b0 20 2a 70 6e 54 77 6f 29 7b 0a 20 20 63 6f 6e 73   *pnTwo){.  cons
1d6c0 74 20 69 6e 74 20 4d 41 58 5f 50 52 4f 47 52 45  t int MAX_PROGRE
1d6d0 53 53 20 3d 20 31 30 30 30 30 3b 0a 20 20 73 77  SS = 10000;.  sw
1d6e0 69 74 63 68 28 20 70 2d 3e 65 53 74 61 67 65 20  itch( p->eStage 
1d6f0 29 7b 0a 20 20 20 20 63 61 73 65 20 52 42 55 5f  ){.    case RBU_
1d700 53 54 41 47 45 5f 4f 41 4c 3a 0a 20 20 20 20 20  STAGE_OAL:.     
1d710 20 69 66 28 20 70 2d 3e 6e 50 68 61 73 65 4f 6e   if( p->nPhaseOn
1d720 65 53 74 65 70 3e 30 20 29 7b 0a 20 20 20 20 20  eStep>0 ){.     
1d730 20 20 20 2a 70 6e 4f 6e 65 20 3d 20 28 69 6e 74     *pnOne = (int
1d740 29 28 4d 41 58 5f 50 52 4f 47 52 45 53 53 20 2a  )(MAX_PROGRESS *
1d750 20 28 69 36 34 29 70 2d 3e 6e 50 72 6f 67 72 65   (i64)p->nProgre
1d760 73 73 2f 28 69 36 34 29 70 2d 3e 6e 50 68 61 73  ss/(i64)p->nPhas
1d770 65 4f 6e 65 53 74 65 70 29 3b 0a 20 20 20 20 20  eOneStep);.     
1d780 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1d790 2a 70 6e 4f 6e 65 20 3d 20 2d 31 3b 0a 20 20 20  *pnOne = -1;.   
1d7a0 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 6e 54 77     }.      *pnTw
1d7b0 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65  o = 0;.      bre
1d7c0 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 52 42  ak;..    case RB
1d7d0 55 5f 53 54 41 47 45 5f 4d 4f 56 45 3a 0a 20 20  U_STAGE_MOVE:.  
1d7e0 20 20 20 20 2a 70 6e 4f 6e 65 20 3d 20 4d 41 58      *pnOne = MAX
1d7f0 5f 50 52 4f 47 52 45 53 53 3b 0a 20 20 20 20 20  _PROGRESS;.     
1d800 20 2a 70 6e 54 77 6f 20 3d 20 30 3b 0a 20 20 20   *pnTwo = 0;.   
1d810 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63     break;..    c
1d820 61 73 65 20 52 42 55 5f 53 54 41 47 45 5f 43 4b  ase RBU_STAGE_CK
1d830 50 54 3a 0a 20 20 20 20 20 20 2a 70 6e 4f 6e 65  PT:.      *pnOne
1d840 20 3d 20 4d 41 58 5f 50 52 4f 47 52 45 53 53 3b   = MAX_PROGRESS;
1d850 0a 20 20 20 20 20 20 2a 70 6e 54 77 6f 20 3d 20  .      *pnTwo = 
1d860 28 69 6e 74 29 28 4d 41 58 5f 50 52 4f 47 52 45  (int)(MAX_PROGRE
1d870 53 53 20 2a 20 28 69 36 34 29 70 2d 3e 6e 53 74  SS * (i64)p->nSt
1d880 65 70 20 2f 20 28 69 36 34 29 70 2d 3e 6e 46 72  ep / (i64)p->nFr
1d890 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ame);.      brea
1d8a0 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 52 42 55  k;..    case RBU
1d8b0 5f 53 54 41 47 45 5f 44 4f 4e 45 3a 0a 20 20 20  _STAGE_DONE:.   
1d8c0 20 20 20 2a 70 6e 4f 6e 65 20 3d 20 4d 41 58 5f     *pnOne = MAX_
1d8d0 50 52 4f 47 52 45 53 53 3b 0a 20 20 20 20 20 20  PROGRESS;.      
1d8e0 2a 70 6e 54 77 6f 20 3d 20 4d 41 58 5f 50 52 4f  *pnTwo = MAX_PRO
1d8f0 47 52 45 53 53 3b 0a 20 20 20 20 20 20 62 72 65  GRESS;.      bre
1d900 61 6b 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c 74  ak;..    default
1d910 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  :.      assert( 
1d920 30 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 69 6e 74 20  0 );.  }.}..int 
1d930 73 71 6c 69 74 65 33 72 62 75 5f 73 61 76 65 73  sqlite3rbu_saves
1d940 74 61 74 65 28 73 71 6c 69 74 65 33 72 62 75 20  tate(sqlite3rbu 
1d950 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  *p){.  int rc = 
1d960 70 2d 3e 72 63 3b 0a 20 20 0a 20 20 69 66 28 20  p->rc;.  .  if( 
1d970 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
1d980 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
1d990 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  OK;..  assert( p
1d9a0 2d 3e 65 53 74 61 67 65 3e 3d 52 42 55 5f 53 54  ->eStage>=RBU_ST
1d9b0 41 47 45 5f 4f 41 4c 20 26 26 20 70 2d 3e 65 53  AGE_OAL && p->eS
1d9c0 74 61 67 65 3c 3d 52 42 55 5f 53 54 41 47 45 5f  tage<=RBU_STAGE_
1d9d0 44 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 70 2d  DONE );.  if( p-
1d9e0 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41  >eStage==RBU_STA
1d9f0 47 45 5f 4f 41 4c 20 29 7b 0a 20 20 20 20 61 73  GE_OAL ){.    as
1da00 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
1da10 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69 66 28  _DONE );.    if(
1da20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1da30 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78   rc = sqlite3_ex
1da40 65 63 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 43  ec(p->dbMain, "C
1da50 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 2c 20 30 29  OMMIT", 0, 0, 0)
1da60 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e 72 63 20 3d  ;.  }..  p->rc =
1da70 20 72 63 3b 0a 20 20 72 62 75 53 61 76 65 53 74   rc;.  rbuSaveSt
1da80 61 74 65 28 70 2c 20 70 2d 3e 65 53 74 61 67 65  ate(p, p->eStage
1da90 29 3b 0a 20 20 72 63 20 3d 20 70 2d 3e 72 63 3b  );.  rc = p->rc;
1daa0 0a 0a 20 20 69 66 28 20 70 2d 3e 65 53 74 61 67  ..  if( p->eStag
1dab0 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c  e==RBU_STAGE_OAL
1dac0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1dad0 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
1dae0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1daf0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20  QLITE_OK ) rc = 
1db00 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e  sqlite3_exec(p->
1db10 64 62 52 62 75 2c 20 22 43 4f 4d 4d 49 54 22 2c  dbRbu, "COMMIT",
1db20 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69   0, 0, 0);.    i
1db30 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1db40 20 29 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f   ) rc = sqlite3_
1db50 65 78 65 63 28 70 2d 3e 64 62 52 62 75 2c 20 22  exec(p->dbRbu, "
1db60 42 45 47 49 4e 20 49 4d 4d 45 44 49 41 54 45 22  BEGIN IMMEDIATE"
1db70 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
1db80 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1db90 4b 20 29 20 72 63 20 3d 20 73 71 6c 69 74 65 33  K ) rc = sqlite3
1dba0 5f 65 78 65 63 28 70 2d 3e 64 62 4d 61 69 6e 2c  _exec(p->dbMain,
1dbb0 20 22 42 45 47 49 4e 20 49 4d 4d 45 44 49 41 54   "BEGIN IMMEDIAT
1dbc0 45 22 2c 20 30 2c 20 30 2c 30 29 3b 0a 20 20 7d  E", 0, 0,0);.  }
1dbd0 0a 0a 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a  ..  p->rc = rc;.
1dbe0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1dbf0 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
1dc00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1dc10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1dc20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1dc30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 42  ***********.** B
1dc40 65 67 69 6e 6e 69 6e 67 20 6f 66 20 52 42 55 20  eginning of RBU 
1dc50 56 46 53 20 73 68 69 6d 20 6d 65 74 68 6f 64 73  VFS shim methods
1dc60 2e 20 54 68 65 20 56 46 53 20 73 68 69 6d 20 6d  . The VFS shim m
1dc70 6f 64 69 66 69 65 73 20 74 68 65 20 62 65 68 61  odifies the beha
1dc80 76 69 6f 75 72 0a 2a 2a 20 6f 66 20 61 20 73 74  viour.** of a st
1dc90 61 6e 64 61 72 64 20 56 46 53 20 69 6e 20 74 68  andard VFS in th
1dca0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 61 79 73  e following ways
1dcb0 3a 0a 2a 2a 0a 2a 2a 20 31 2e 20 57 68 65 6e 65  :.**.** 1. Whene
1dcc0 76 65 72 20 74 68 65 20 66 69 72 73 74 20 70 61  ver the first pa
1dcd0 67 65 20 6f 66 20 61 20 6d 61 69 6e 20 64 61 74  ge of a main dat
1dce0 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 72 65  abase file is re
1dcf0 61 64 20 6f 72 20 0a 2a 2a 20 20 20 20 77 72 69  ad or .**    wri
1dd00 74 74 65 6e 2c 20 74 68 65 20 76 61 6c 75 65 20  tten, the value 
1dd10 6f 66 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  of the change-co
1dd20 75 6e 74 65 72 20 63 6f 6f 6b 69 65 20 69 73 20  unter cookie is 
1dd30 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 20 20 20  stored in.**    
1dd40 72 62 75 5f 66 69 6c 65 2e 69 43 6f 6f 6b 69 65  rbu_file.iCookie
1dd50 2e 20 53 69 6d 69 6c 61 72 6c 79 2c 20 74 68 65  . Similarly, the
1dd60 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 22 77   value of the "w
1dd70 72 69 74 65 2d 76 65 72 73 69 6f 6e 22 0a 2a 2a  rite-version".**
1dd80 20 20 20 20 64 61 74 61 62 61 73 65 20 68 65 61      database hea
1dd90 64 65 72 20 66 69 65 6c 64 20 69 73 20 73 74 6f  der field is sto
1dda0 72 65 64 20 69 6e 20 72 62 75 5f 66 69 6c 65 2e  red in rbu_file.
1ddb0 69 57 72 69 74 65 56 65 72 2e 20 54 68 69 73 20  iWriteVer. This 
1ddc0 65 6e 73 75 72 65 73 0a 2a 2a 20 20 20 20 74 68  ensures.**    th
1ddd0 61 74 20 74 68 65 20 76 61 6c 75 65 73 20 61 72  at the values ar
1dde0 65 20 61 6c 77 61 79 73 20 74 72 75 73 74 77 6f  e always trustwo
1ddf0 72 74 68 79 20 77 69 74 68 69 6e 20 61 6e 20 6f  rthy within an o
1de00 70 65 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  pen transaction.
1de10 0a 2a 2a 0a 2a 2a 20 32 2e 20 57 68 65 6e 65 76  .**.** 2. Whenev
1de20 65 72 20 61 6e 20 53 51 4c 49 54 45 5f 4f 50 45  er an SQLITE_OPE
1de30 4e 5f 57 41 4c 20 66 69 6c 65 20 69 73 20 6f 70  N_WAL file is op
1de40 65 6e 65 64 2c 20 74 68 65 20 28 72 62 75 5f 66  ened, the (rbu_f
1de50 69 6c 65 2e 70 57 61 6c 46 64 29 0a 2a 2a 20 20  ile.pWalFd).**  
1de60 20 20 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c    member variabl
1de70 65 20 6f 66 20 74 68 65 20 61 73 73 6f 63 69 61  e of the associa
1de80 74 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c  ted database fil
1de90 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
1dea0 73 65 74 0a 2a 2a 20 20 20 20 74 6f 20 70 6f 69  set.**    to poi
1deb0 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20 66 69  nt to the new fi
1dec0 6c 65 2e 20 41 20 6d 75 74 65 78 20 70 72 6f 74  le. A mutex prot
1ded0 65 63 74 65 64 20 6c 69 6e 6b 65 64 20 6c 69 73  ected linked lis
1dee0 74 20 6f 66 20 61 6c 6c 20 6d 61 69 6e 20 0a 2a  t of all main .*
1def0 2a 20 20 20 20 64 62 20 66 64 73 20 6f 70 65 6e  *    db fds open
1df00 65 64 20 75 73 69 6e 67 20 61 20 70 61 72 74 69  ed using a parti
1df10 63 75 6c 61 72 20 52 42 55 20 56 46 53 20 69 73  cular RBU VFS is
1df20 20 6d 61 69 6e 74 61 69 6e 65 64 20 61 74 20 0a   maintained at .
1df30 2a 2a 20 20 20 20 72 62 75 5f 76 66 73 2e 70 4d  **    rbu_vfs.pM
1df40 61 69 6e 20 74 6f 20 66 61 63 69 6c 69 74 61 74  ain to facilitat
1df50 65 20 74 68 69 73 2e 0a 2a 2a 0a 2a 2a 20 33 2e  e this..**.** 3.
1df60 20 55 73 69 6e 67 20 61 20 6e 65 77 20 66 69 6c   Using a new fil
1df70 65 2d 63 6f 6e 74 72 6f 6c 20 22 53 51 4c 49 54  e-control "SQLIT
1df80 45 5f 46 43 4e 54 4c 5f 52 42 55 22 2c 20 61 20  E_FCNTL_RBU", a 
1df90 6d 61 69 6e 20 64 62 20 72 62 75 5f 66 69 6c 65  main db rbu_file
1dfa0 20 0a 2a 2a 20 20 20 20 6f 62 6a 65 63 74 20 63   .**    object c
1dfb0 61 6e 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20  an be marked as 
1dfc0 74 68 65 20 74 61 72 67 65 74 20 64 61 74 61 62  the target datab
1dfd0 61 73 65 20 6f 66 20 61 6e 20 52 42 55 20 75 70  ase of an RBU up
1dfe0 64 61 74 65 2e 20 54 68 69 73 0a 2a 2a 20 20 20  date. This.**   
1dff0 20 74 75 72 6e 73 20 6f 6e 20 74 68 65 20 66 6f   turns on the fo
1e000 6c 6c 6f 77 69 6e 67 20 65 78 74 72 61 20 73 70  llowing extra sp
1e010 65 63 69 61 6c 20 62 65 68 61 76 69 6f 75 72 3a  ecial behaviour:
1e020 0a 2a 2a 0a 2a 2a 20 33 61 2e 20 49 66 20 78 41  .**.** 3a. If xA
1e030 63 63 65 73 73 28 29 20 69 73 20 63 61 6c 6c 65  ccess() is calle
1e040 64 20 74 6f 20 63 68 65 63 6b 20 69 66 20 74 68  d to check if th
1e050 65 72 65 20 65 78 69 73 74 73 20 61 20 2a 2d 77  ere exists a *-w
1e060 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 20 20 20 20  al file .**     
1e070 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1e080 61 6e 20 52 42 55 20 74 61 72 67 65 74 20 64 61  an RBU target da
1e090 74 61 62 61 73 65 20 63 75 72 72 65 6e 74 6c 79  tabase currently
1e0a0 20 69 6e 20 52 42 55 5f 53 54 41 47 45 5f 4f 41   in RBU_STAGE_OA
1e0b0 4c 0a 2a 2a 20 20 20 20 20 73 74 61 67 65 20 28  L.**     stage (
1e0c0 70 72 65 70 61 72 69 6e 67 20 74 68 65 20 2a 2d  preparing the *-
1e0d0 6f 61 6c 20 66 69 6c 65 29 2c 20 74 68 65 20 66  oal file), the f
1e0e0 6f 6c 6c 6f 77 69 6e 67 20 73 70 65 63 69 61 6c  ollowing special
1e0f0 20 68 61 6e 64 6c 69 6e 67 0a 2a 2a 20 20 20 20   handling.**    
1e100 20 61 70 70 6c 69 65 73 3a 0a 2a 2a 0a 2a 2a 20   applies:.**.** 
1e110 20 20 20 20 20 2a 20 69 66 20 74 68 65 20 2a 2d       * if the *-
1e120 77 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 65 78  wal file does ex
1e130 69 73 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ist, return SQLI
1e140 54 45 5f 43 41 4e 54 4f 50 45 4e 2e 20 41 6e 20  TE_CANTOPEN. An 
1e150 52 42 55 0a 2a 2a 20 20 20 20 20 20 20 20 74 61  RBU.**        ta
1e160 72 67 65 74 20 64 61 74 61 62 61 73 65 20 6d 61  rget database ma
1e170 79 20 6e 6f 74 20 62 65 20 69 6e 20 77 61 6c 20  y not be in wal 
1e180 6d 6f 64 65 20 61 6c 72 65 61 64 79 2e 0a 2a 2a  mode already..**
1e190 0a 2a 2a 20 20 20 20 20 20 2a 20 69 66 20 74 68  .**      * if th
1e1a0 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 64 6f 65  e *-wal file doe
1e1b0 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 73 65 74  s not exist, set
1e1c0 20 74 68 65 20 6f 75 74 70 75 74 20 70 61 72 61   the output para
1e1d0 6d 65 74 65 72 20 74 6f 0a 2a 2a 20 20 20 20 20  meter to.**     
1e1e0 20 20 20 6e 6f 6e 2d 7a 65 72 6f 20 28 74 6f 20     non-zero (to 
1e1f0 74 65 6c 6c 20 53 51 4c 69 74 65 20 74 68 61 74  tell SQLite that
1e200 20 69 74 20 64 6f 65 73 20 65 78 69 73 74 29 20   it does exist) 
1e210 61 6e 79 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 20 20  anyway..**.**   
1e220 20 20 54 68 65 6e 2c 20 77 68 65 6e 20 78 4f 70    Then, when xOp
1e230 65 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 20 74  en() is called t
1e240 6f 20 6f 70 65 6e 20 74 68 65 20 2a 2d 77 61 6c  o open the *-wal
1e250 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64   file associated
1e260 20 77 69 74 68 0a 2a 2a 20 20 20 20 20 74 68 65   with.**     the
1e270 20 52 42 55 20 74 61 72 67 65 74 20 69 6e 20 52   RBU target in R
1e280 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20 73 74 61  BU_STAGE_OAL sta
1e290 67 65 2c 20 69 6e 73 74 65 61 64 20 6f 66 20 6f  ge, instead of o
1e2a0 70 65 6e 69 6e 67 20 74 68 65 20 2a 2d 77 61 6c  pening the *-wal
1e2b0 0a 2a 2a 20 20 20 20 20 66 69 6c 65 2c 20 74 68  .**     file, th
1e2c0 65 20 72 62 75 20 76 66 73 20 6f 70 65 6e 73 20  e rbu vfs opens 
1e2d0 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
1e2e0 67 20 2a 2d 6f 61 6c 20 66 69 6c 65 20 69 6e 73  g *-oal file ins
1e2f0 74 65 61 64 2e 20 0a 2a 2a 0a 2a 2a 20 33 62 2e  tead. .**.** 3b.
1e300 20 54 68 65 20 2a 2d 73 68 6d 20 70 61 67 65 73   The *-shm pages
1e310 20 72 65 74 75 72 6e 65 64 20 62 79 20 78 53 68   returned by xSh
1e320 6d 4d 61 70 28 29 20 66 6f 72 20 61 20 74 61 72  mMap() for a tar
1e330 67 65 74 20 64 62 20 66 69 6c 65 20 69 6e 0a 2a  get db file in.*
1e340 2a 20 20 20 20 20 52 42 55 5f 53 54 41 47 45 5f  *     RBU_STAGE_
1e350 4f 41 4c 20 6d 6f 64 65 20 61 72 65 20 61 63 74  OAL mode are act
1e360 75 61 6c 6c 79 20 73 74 6f 72 65 64 20 69 6e 20  ually stored in 
1e370 68 65 61 70 20 6d 65 6d 6f 72 79 2e 20 54 68 69  heap memory. Thi
1e380 73 20 69 73 20 74 6f 0a 2a 2a 20 20 20 20 20 61  s is to.**     a
1e390 76 6f 69 64 20 63 72 65 61 74 69 6e 67 20 61 20  void creating a 
1e3a0 2a 2d 73 68 6d 20 66 69 6c 65 20 6f 6e 20 64 69  *-shm file on di
1e3b0 73 6b 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79  sk. Additionally
1e3c0 2c 20 78 53 68 6d 4c 6f 63 6b 28 29 20 63 61 6c  , xShmLock() cal
1e3d0 6c 73 0a 2a 2a 20 20 20 20 20 61 72 65 20 6e 6f  ls.**     are no
1e3e0 2d 6f 70 73 20 6f 6e 20 74 61 72 67 65 74 20 64  -ops on target d
1e3f0 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 69 6e  atabase files in
1e400 20 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20 6d   RBU_STAGE_OAL m
1e410 6f 64 65 2e 20 54 68 69 73 20 69 73 0a 2a 2a 20  ode. This is.** 
1e420 20 20 20 20 62 65 63 61 75 73 65 20 61 73 73 65      because asse
1e430 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
1e440 69 6e 20 73 6f 6d 65 20 56 46 53 20 69 6d 70 6c  in some VFS impl
1e450 65 6d 65 6e 74 61 74 69 6f 6e 73 20 66 61 69 6c  ementations fail
1e460 20 69 66 20 0a 2a 2a 20 20 20 20 20 78 53 68 6d   if .**     xShm
1e470 4c 6f 63 6b 28 29 20 69 73 20 63 61 6c 6c 65 64  Lock() is called
1e480 20 62 65 66 6f 72 65 20 78 53 68 6d 4d 61 70 28   before xShmMap(
1e490 29 2e 0a 2a 2a 0a 2a 2a 20 33 63 2e 20 49 66 20  )..**.** 3c. If 
1e4a0 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
1e4b0 6b 20 69 73 20 61 74 74 65 6d 70 74 65 64 20 6f  k is attempted o
1e4c0 6e 20 61 20 74 61 72 67 65 74 20 64 61 74 61 62  n a target datab
1e4d0 61 73 65 20 66 69 6c 65 20 69 6e 20 61 6e 79 0a  ase file in any.
1e4e0 2a 2a 20 20 20 20 20 6d 6f 64 65 20 65 78 63 65  **     mode exce
1e4f0 70 74 20 52 42 55 5f 53 54 41 47 45 5f 44 4f 4e  pt RBU_STAGE_DON
1e500 45 20 28 61 6c 6c 20 77 6f 72 6b 20 63 6f 6d 70  E (all work comp
1e510 6c 65 74 65 64 20 61 6e 64 20 63 68 65 63 6b 70  leted and checkp
1e520 6f 69 6e 74 65 64 29 2c 20 69 74 20 0a 2a 2a 20  ointed), it .** 
1e530 20 20 20 20 66 61 69 6c 73 20 77 69 74 68 20 61      fails with a
1e540 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20 65 72  n SQLITE_BUSY er
1e550 72 6f 72 2e 20 54 68 69 73 20 69 73 20 74 6f 20  ror. This is to 
1e560 73 74 6f 70 20 52 42 55 20 63 6f 6e 6e 65 63 74  stop RBU connect
1e570 69 6f 6e 73 0a 2a 2a 20 20 20 20 20 66 72 6f 6d  ions.**     from
1e580 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63   automatically c
1e590 68 65 63 6b 70 6f 69 6e 74 69 6e 67 20 61 20 2a  heckpointing a *
1e5a0 2d 77 61 6c 20 28 6f 72 20 2a 2d 6f 61 6c 29 20  -wal (or *-oal) 
1e5b0 66 69 6c 65 20 66 72 6f 6d 20 77 69 74 68 69 6e  file from within
1e5c0 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 5f  .**     sqlite3_
1e5d0 63 6c 6f 73 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 33  close()..**.** 3
1e5e0 64 2e 20 49 6e 20 52 42 55 5f 53 54 41 47 45 5f  d. In RBU_STAGE_
1e5f0 43 41 50 54 55 52 45 20 6d 6f 64 65 2c 20 61 6c  CAPTURE mode, al
1e600 6c 20 78 52 65 61 64 28 29 20 63 61 6c 6c 73 20  l xRead() calls 
1e610 6f 6e 20 74 68 65 20 77 61 6c 20 66 69 6c 65 2c  on the wal file,
1e620 20 61 6e 64 0a 2a 2a 20 20 20 20 20 61 6c 6c 20   and.**     all 
1e630 78 57 72 69 74 65 28 29 20 63 61 6c 6c 73 20 6f  xWrite() calls o
1e640 6e 20 74 68 65 20 74 61 72 67 65 74 20 64 61 74  n the target dat
1e650 61 62 61 73 65 20 66 69 6c 65 20 70 65 72 66 6f  abase file perfo
1e660 72 6d 20 6e 6f 20 49 4f 2e 20 0a 2a 2a 20 20 20  rm no IO. .**   
1e670 20 20 49 6e 73 74 65 61 64 20 74 68 65 20 66 72    Instead the fr
1e680 61 6d 65 20 61 6e 64 20 70 61 67 65 20 6e 75 6d  ame and page num
1e690 62 65 72 73 20 74 68 61 74 20 77 6f 75 6c 64 20  bers that would 
1e6a0 62 65 20 72 65 61 64 20 61 6e 64 20 77 72 69 74  be read and writ
1e6b0 74 65 6e 0a 2a 2a 20 20 20 20 20 61 72 65 20 72  ten.**     are r
1e6c0 65 63 6f 72 64 65 64 2e 20 41 64 64 69 74 69 6f  ecorded. Additio
1e6d0 6e 61 6c 6c 79 2c 20 73 75 63 63 65 73 73 66 75  nally, successfu
1e6e0 6c 20 61 74 74 65 6d 70 74 73 20 74 6f 20 6f 62  l attempts to ob
1e6f0 74 61 69 6e 20 65 78 63 6c 75 73 69 76 65 0a 2a  tain exclusive.*
1e700 2a 20 20 20 20 20 78 53 68 6d 4c 6f 63 6b 28 29  *     xShmLock()
1e710 20 57 52 49 54 45 52 2c 20 43 48 45 43 4b 50 4f   WRITER, CHECKPO
1e720 49 4e 54 45 52 20 61 6e 64 20 52 45 41 44 30 20  INTER and READ0 
1e730 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 74 61 72  locks on the tar
1e740 67 65 74 20 0a 2a 2a 20 20 20 20 20 64 61 74 61  get .**     data
1e750 62 61 73 65 20 66 69 6c 65 20 61 72 65 20 72 65  base file are re
1e760 63 6f 72 64 65 64 2e 20 78 53 68 6d 4c 6f 63 6b  corded. xShmLock
1e770 28 29 20 63 61 6c 6c 73 20 74 6f 20 75 6e 6c 6f  () calls to unlo
1e780 63 6b 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 20  ck the same.**  
1e790 20 20 20 6c 6f 63 6b 73 20 61 72 65 20 6e 6f 2d     locks are no-
1e7a0 6f 70 73 20 28 73 6f 20 74 68 61 74 20 6f 6e 63  ops (so that onc
1e7b0 65 20 6f 62 74 61 69 6e 65 64 2c 20 74 68 65 73  e obtained, thes
1e7c0 65 20 6c 6f 63 6b 73 20 61 72 65 20 6e 65 76 65  e locks are neve
1e7d0 72 0a 2a 2a 20 20 20 20 20 72 65 6c 69 6e 71 75  r.**     relinqu
1e7e0 69 73 68 65 64 29 2e 20 46 69 6e 61 6c 6c 79 2c  ished). Finally,
1e7f0 20 63 61 6c 6c 73 20 74 6f 20 78 53 79 6e 63 28   calls to xSync(
1e800 29 20 6f 6e 20 74 68 65 20 74 61 72 67 65 74 20  ) on the target 
1e810 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20  database.**     
1e820 66 69 6c 65 20 66 61 69 6c 20 77 69 74 68 20 53  file fail with S
1e830 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c 20 65  QLITE_INTERNAL e
1e840 72 72 6f 72 73 2e 0a 2a 2f 0a 0a 73 74 61 74 69  rrors..*/..stati
1e850 63 20 76 6f 69 64 20 72 62 75 55 6e 6c 6f 63 6b  c void rbuUnlock
1e860 53 68 6d 28 72 62 75 5f 66 69 6c 65 20 2a 70 29  Shm(rbu_file *p)
1e870 7b 0a 20 20 69 66 28 20 70 2d 3e 70 52 62 75 20  {.  if( p->pRbu 
1e880 29 7b 0a 20 20 20 20 69 6e 74 20 28 2a 78 53 68  ){.    int (*xSh
1e890 6d 4c 6f 63 6b 29 28 73 71 6c 69 74 65 33 5f 66  mLock)(sqlite3_f
1e8a0 69 6c 65 2a 2c 69 6e 74 2c 69 6e 74 2c 69 6e 74  ile*,int,int,int
1e8b0 29 20 3d 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d  ) = p->pReal->pM
1e8c0 65 74 68 6f 64 73 2d 3e 78 53 68 6d 4c 6f 63 6b  ethods->xShmLock
1e8d0 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
1e8e0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 53 51 4c 49   for(i=0; i<SQLI
1e8f0 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 3b 69 2b 2b  TE_SHM_NLOCK;i++
1e900 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 31 3c  ){.      if( (1<
1e910 3c 69 29 20 26 20 70 2d 3e 70 52 62 75 2d 3e 6d  <i) & p->pRbu->m
1e920 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  Lock ){.        
1e930 78 53 68 6d 4c 6f 63 6b 28 70 2d 3e 70 52 65 61  xShmLock(p->pRea
1e940 6c 2c 20 69 2c 20 31 2c 20 53 51 4c 49 54 45 5f  l, i, 1, SQLITE_
1e950 53 48 4d 5f 55 4e 4c 4f 43 4b 7c 53 51 4c 49 54  SHM_UNLOCK|SQLIT
1e960 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29  E_SHM_EXCLUSIVE)
1e970 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1e980 20 20 20 20 70 2d 3e 70 52 62 75 2d 3e 6d 4c 6f      p->pRbu->mLo
1e990 63 6b 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ck = 0;.  }.}../
1e9a0 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 72 62  *.** Close an rb
1e9b0 75 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  u file..*/.stati
1e9c0 63 20 69 6e 74 20 72 62 75 56 66 73 43 6c 6f 73  c int rbuVfsClos
1e9d0 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
1e9e0 70 46 69 6c 65 29 7b 0a 20 20 72 62 75 5f 66 69  pFile){.  rbu_fi
1e9f0 6c 65 20 2a 70 20 3d 20 28 72 62 75 5f 66 69 6c  le *p = (rbu_fil
1ea00 65 2a 29 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20  e*)pFile;.  int 
1ea10 72 63 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  rc;.  int i;..  
1ea20 2f 2a 20 46 72 65 65 20 74 68 65 20 63 6f 6e 74  /* Free the cont
1ea30 65 6e 74 73 20 6f 66 20 74 68 65 20 61 70 53 68  ents of the apSh
1ea40 6d 5b 5d 20 61 72 72 61 79 2e 20 41 6e 64 20 74  m[] array. And t
1ea50 68 65 20 61 72 72 61 79 20 69 74 73 65 6c 66 2e  he array itself.
1ea60 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
1ea70 3c 70 2d 3e 6e 53 68 6d 3b 20 69 2b 2b 29 7b 0a  <p->nShm; i++){.
1ea80 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1ea90 28 70 2d 3e 61 70 53 68 6d 5b 69 5d 29 3b 0a 20  (p->apShm[i]);. 
1eaa0 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
1eab0 65 28 70 2d 3e 61 70 53 68 6d 29 3b 0a 20 20 70  e(p->apShm);.  p
1eac0 2d 3e 61 70 53 68 6d 20 3d 20 30 3b 0a 20 20 73  ->apShm = 0;.  s
1ead0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a  qlite3_free(p->z
1eae0 44 65 6c 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  Del);..  if( p->
1eaf0 6f 70 65 6e 46 6c 61 67 73 20 26 20 53 51 4c 49  openFlags & SQLI
1eb00 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20  TE_OPEN_MAIN_DB 
1eb10 29 7b 0a 20 20 20 20 72 62 75 5f 66 69 6c 65 20  ){.    rbu_file 
1eb20 2a 2a 70 70 3b 0a 20 20 20 20 73 71 6c 69 74 65  **pp;.    sqlite
1eb30 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 2d  3_mutex_enter(p-
1eb40 3e 70 52 62 75 56 66 73 2d 3e 6d 75 74 65 78 29  >pRbuVfs->mutex)
1eb50 3b 0a 20 20 20 20 66 6f 72 28 70 70 3d 26 70 2d  ;.    for(pp=&p-
1eb60 3e 70 52 62 75 56 66 73 2d 3e 70 4d 61 69 6e 3b  >pRbuVfs->pMain;
1eb70 20 2a 70 70 21 3d 70 3b 20 70 70 3d 26 28 28 2a   *pp!=p; pp=&((*
1eb80 70 70 29 2d 3e 70 4d 61 69 6e 4e 65 78 74 29 29  pp)->pMainNext))
1eb90 3b 0a 20 20 20 20 2a 70 70 20 3d 20 70 2d 3e 70  ;.    *pp = p->p
1eba0 4d 61 69 6e 4e 65 78 74 3b 0a 20 20 20 20 73 71  MainNext;.    sq
1ebb0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
1ebc0 65 28 70 2d 3e 70 52 62 75 56 66 73 2d 3e 6d 75  e(p->pRbuVfs->mu
1ebd0 74 65 78 29 3b 0a 20 20 20 20 72 62 75 55 6e 6c  tex);.    rbuUnl
1ebe0 6f 63 6b 53 68 6d 28 70 29 3b 0a 20 20 20 20 70  ockShm(p);.    p
1ebf0 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64  ->pReal->pMethod
1ec00 73 2d 3e 78 53 68 6d 55 6e 6d 61 70 28 70 2d 3e  s->xShmUnmap(p->
1ec10 70 52 65 61 6c 2c 20 30 29 3b 0a 20 20 7d 0a 0a  pReal, 0);.  }..
1ec20 20 20 2f 2a 20 43 6c 6f 73 65 20 74 68 65 20 75    /* Close the u
1ec30 6e 64 65 72 6c 79 69 6e 67 20 66 69 6c 65 20 68  nderlying file h
1ec40 61 6e 64 6c 65 20 2a 2f 0a 20 20 72 63 20 3d 20  andle */.  rc = 
1ec50 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f  p->pReal->pMetho
1ec60 64 73 2d 3e 78 43 6c 6f 73 65 28 70 2d 3e 70 52  ds->xClose(p->pR
1ec70 65 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  eal);.  return r
1ec80 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  c;.}.../*.** Rea
1ec90 64 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20  d and return an 
1eca0 75 6e 73 69 67 6e 65 64 20 33 32 2d 62 69 74 20  unsigned 32-bit 
1ecb0 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
1ecc0 65 72 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66  er from the buff
1ecd0 65 72 20 0a 2a 2a 20 70 61 73 73 65 64 20 61 73  er .** passed as
1ece0 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65   the only argume
1ecf0 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33  nt..*/.static u3
1ed00 32 20 72 62 75 47 65 74 55 33 32 28 75 38 20 2a  2 rbuGetU32(u8 *
1ed10 61 42 75 66 29 7b 0a 20 20 72 65 74 75 72 6e 20  aBuf){.  return 
1ed20 28 28 75 33 32 29 61 42 75 66 5b 30 5d 20 3c 3c  ((u32)aBuf[0] <<
1ed30 20 32 34 29 0a 20 20 20 20 20 20 20 2b 20 28 28   24).       + ((
1ed40 75 33 32 29 61 42 75 66 5b 31 5d 20 3c 3c 20 31  u32)aBuf[1] << 1
1ed50 36 29 0a 20 20 20 20 20 20 20 2b 20 28 28 75 33  6).       + ((u3
1ed60 32 29 61 42 75 66 5b 32 5d 20 3c 3c 20 20 38 29  2)aBuf[2] <<  8)
1ed70 0a 20 20 20 20 20 20 20 2b 20 28 28 75 33 32 29  .       + ((u32)
1ed80 61 42 75 66 5b 33 5d 29 3b 0a 7d 0a 0a 2f 2a 0a  aBuf[3]);.}../*.
1ed90 2a 2a 20 57 72 69 74 65 20 61 6e 20 75 6e 73 69  ** Write an unsi
1eda0 67 6e 65 64 20 33 32 2d 62 69 74 20 76 61 6c 75  gned 32-bit valu
1edb0 65 20 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e 20  e in big-endian 
1edc0 66 6f 72 6d 61 74 20 74 6f 20 74 68 65 20 73 75  format to the su
1edd0 70 70 6c 69 65 64 0a 2a 2a 20 62 75 66 66 65 72  pplied.** buffer
1ede0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1edf0 20 72 62 75 50 75 74 55 33 32 28 75 38 20 2a 61   rbuPutU32(u8 *a
1ee00 42 75 66 2c 20 75 33 32 20 69 56 61 6c 29 7b 0a  Buf, u32 iVal){.
1ee10 20 20 61 42 75 66 5b 30 5d 20 3d 20 28 69 56 61    aBuf[0] = (iVa
1ee20 6c 20 3e 3e 20 32 34 29 20 26 20 30 78 46 46 3b  l >> 24) & 0xFF;
1ee30 0a 20 20 61 42 75 66 5b 31 5d 20 3d 20 28 69 56  .  aBuf[1] = (iV
1ee40 61 6c 20 3e 3e 20 31 36 29 20 26 20 30 78 46 46  al >> 16) & 0xFF
1ee50 3b 0a 20 20 61 42 75 66 5b 32 5d 20 3d 20 28 69  ;.  aBuf[2] = (i
1ee60 56 61 6c 20 3e 3e 20 20 38 29 20 26 20 30 78 46  Val >>  8) & 0xF
1ee70 46 3b 0a 20 20 61 42 75 66 5b 33 5d 20 3d 20 28  F;.  aBuf[3] = (
1ee80 69 56 61 6c 20 3e 3e 20 20 30 29 20 26 20 30 78  iVal >>  0) & 0x
1ee90 46 46 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  FF;.}..static vo
1eea0 69 64 20 72 62 75 50 75 74 55 31 36 28 75 38 20  id rbuPutU16(u8 
1eeb0 2a 61 42 75 66 2c 20 75 31 36 20 69 56 61 6c 29  *aBuf, u16 iVal)
1eec0 7b 0a 20 20 61 42 75 66 5b 30 5d 20 3d 20 28 69  {.  aBuf[0] = (i
1eed0 56 61 6c 20 3e 3e 20 20 38 29 20 26 20 30 78 46  Val >>  8) & 0xF
1eee0 46 3b 0a 20 20 61 42 75 66 5b 31 5d 20 3d 20 28  F;.  aBuf[1] = (
1eef0 69 56 61 6c 20 3e 3e 20 20 30 29 20 26 20 30 78  iVal >>  0) & 0x
1ef00 46 46 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  FF;.}../*.** Rea
1ef10 64 20 64 61 74 61 20 66 72 6f 6d 20 61 6e 20 72  d data from an r
1ef20 62 75 56 66 73 2d 66 69 6c 65 2e 0a 2a 2f 0a 73  buVfs-file..*/.s
1ef30 74 61 74 69 63 20 69 6e 74 20 72 62 75 56 66 73  tatic int rbuVfs
1ef40 52 65 61 64 28 0a 20 20 73 71 6c 69 74 65 33 5f  Read(.  sqlite3_
1ef50 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 0a 20 20  file *pFile, .  
1ef60 76 6f 69 64 20 2a 7a 42 75 66 2c 20 0a 20 20 69  void *zBuf, .  i
1ef70 6e 74 20 69 41 6d 74 2c 20 0a 20 20 73 71 6c 69  nt iAmt, .  sqli
1ef80 74 65 5f 69 6e 74 36 34 20 69 4f 66 73 74 0a 29  te_int64 iOfst.)
1ef90 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 20  {.  rbu_file *p 
1efa0 3d 20 28 72 62 75 5f 66 69 6c 65 2a 29 70 46 69  = (rbu_file*)pFi
1efb0 6c 65 3b 0a 20 20 73 71 6c 69 74 65 33 72 62 75  le;.  sqlite3rbu
1efc0 20 2a 70 52 62 75 20 3d 20 70 2d 3e 70 52 62 75   *pRbu = p->pRbu
1efd0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
1efe0 66 28 20 70 52 62 75 20 26 26 20 70 52 62 75 2d  f( pRbu && pRbu-
1eff0 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41  >eStage==RBU_STA
1f000 47 45 5f 43 41 50 54 55 52 45 20 29 7b 0a 20 20  GE_CAPTURE ){.  
1f010 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 65    assert( p->ope
1f020 6e 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  nFlags & SQLITE_
1f030 4f 50 45 4e 5f 57 41 4c 20 29 3b 0a 20 20 20 20  OPEN_WAL );.    
1f040 72 63 20 3d 20 72 62 75 43 61 70 74 75 72 65 57  rc = rbuCaptureW
1f050 61 6c 52 65 61 64 28 70 2d 3e 70 52 62 75 2c 20  alRead(p->pRbu, 
1f060 69 4f 66 73 74 2c 20 69 41 6d 74 29 3b 0a 20 20  iOfst, iAmt);.  
1f070 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70  }else{.    if( p
1f080 52 62 75 20 26 26 20 70 52 62 75 2d 3e 65 53 74  Rbu && pRbu->eSt
1f090 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4f  age==RBU_STAGE_O
1f0a0 41 4c 20 0a 20 20 20 20 20 26 26 20 28 70 2d 3e  AL .     && (p->
1f0b0 6f 70 65 6e 46 6c 61 67 73 20 26 20 53 51 4c 49  openFlags & SQLI
1f0c0 54 45 5f 4f 50 45 4e 5f 57 41 4c 29 20 0a 20 20  TE_OPEN_WAL) .  
1f0d0 20 20 20 26 26 20 69 4f 66 73 74 3e 3d 70 52 62     && iOfst>=pRb
1f0e0 75 2d 3e 69 4f 61 6c 53 7a 20 0a 20 20 20 20 29  u->iOalSz .    )
1f0f0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
1f100 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 6d 65  ITE_OK;.      me
1f110 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c 20 69 41  mset(zBuf, 0, iA
1f120 6d 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  mt);.    }else{.
1f130 20 20 20 20 20 20 72 63 20 3d 20 70 2d 3e 70 52        rc = p->pR
1f140 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78  eal->pMethods->x
1f150 52 65 61 64 28 70 2d 3e 70 52 65 61 6c 2c 20 7a  Read(p->pReal, z
1f160 42 75 66 2c 20 69 41 6d 74 2c 20 69 4f 66 73 74  Buf, iAmt, iOfst
1f170 29 3b 0a 23 69 66 20 31 0a 20 20 20 20 20 20 2f  );.#if 1.      /
1f180 2a 20 49 66 20 74 68 69 73 20 69 73 20 62 65 69  * If this is bei
1f190 6e 67 20 63 61 6c 6c 65 64 20 74 6f 20 72 65 61  ng called to rea
1f1a0 64 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  d the first page
1f1b0 20 6f 66 20 74 68 65 20 74 61 72 67 65 74 20 0a   of the target .
1f1c0 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73        ** databas
1f1d0 65 20 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20  e as part of an 
1f1e0 72 62 75 20 76 61 63 75 75 6d 20 6f 70 65 72 61  rbu vacuum opera
1f1f0 74 69 6f 6e 2c 20 73 79 6e 74 68 65 73 69 7a 65  tion, synthesize
1f200 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 63   the .      ** c
1f210 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 66  ontents of the f
1f220 69 72 73 74 20 70 61 67 65 20 69 66 20 69 74 20  irst page if it 
1f230 64 6f 65 73 20 6e 6f 74 20 79 65 74 20 65 78 69  does not yet exi
1f240 73 74 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 20  st. Otherwise,. 
1f250 20 20 20 20 20 2a 2a 20 53 51 4c 69 74 65 20 77       ** SQLite w
1f260 69 6c 6c 20 6e 6f 74 20 63 68 65 63 6b 20 66 6f  ill not check fo
1f270 72 20 61 20 2a 2d 77 61 6c 20 66 69 6c 65 2e 20  r a *-wal file. 
1f280 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 52   */.      if( pR
1f290 62 75 20 26 26 20 72 62 75 49 73 56 61 63 75 75  bu && rbuIsVacuu
1f2a0 6d 28 70 52 62 75 29 20 0a 20 20 20 20 20 20 20  m(pRbu) .       
1f2b0 20 20 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45     && rc==SQLITE
1f2c0 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
1f2d0 44 20 26 26 20 69 4f 66 73 74 3d 3d 30 0a 20 20  D && iOfst==0.  
1f2e0 20 20 20 20 20 20 20 20 26 26 20 28 70 2d 3e 6f          && (p->o
1f2f0 70 65 6e 46 6c 61 67 73 20 26 20 53 51 4c 49 54  penFlags & SQLIT
1f300 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 0a  E_OPEN_MAIN_DB).
1f310 20 20 20 20 20 20 20 20 20 20 26 26 20 70 52 62            && pRb
1f320 75 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  u->rc==SQLITE_OK
1f330 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
1f340 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
1f350 70 46 64 20 3d 20 28 73 71 6c 69 74 65 33 5f 66  pFd = (sqlite3_f
1f360 69 6c 65 2a 29 70 52 62 75 2d 3e 70 52 62 75 46  ile*)pRbu->pRbuF
1f370 64 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  d;.        rc = 
1f380 70 46 64 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78  pFd->pMethods->x
1f390 52 65 61 64 28 70 46 64 2c 20 7a 42 75 66 2c 20  Read(pFd, zBuf, 
1f3a0 69 41 6d 74 2c 20 69 4f 66 73 74 29 3b 0a 20 20  iAmt, iOfst);.  
1f3b0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1f3c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1f3d0 20 20 20 20 20 75 38 20 2a 61 42 75 66 20 3d 20       u8 *aBuf = 
1f3e0 28 75 38 2a 29 7a 42 75 66 3b 0a 20 20 20 20 20  (u8*)zBuf;.     
1f3f0 20 20 20 20 20 75 33 32 20 69 52 6f 6f 74 20 3d       u32 iRoot =
1f400 20 72 62 75 47 65 74 55 33 32 28 26 61 42 75 66   rbuGetU32(&aBuf
1f410 5b 35 32 5d 29 20 3f 20 31 20 3a 20 30 3b 0a 20  [52]) ? 1 : 0;. 
1f420 20 20 20 20 20 20 20 20 20 72 62 75 50 75 74 55           rbuPutU
1f430 33 32 28 26 61 42 75 66 5b 35 32 5d 2c 20 69 52  32(&aBuf[52], iR
1f440 6f 6f 74 29 3b 20 20 20 20 20 20 2f 2a 20 6c 61  oot);      /* la
1f450 72 67 65 73 74 20 72 6f 6f 74 20 70 61 67 65 20  rgest root page 
1f460 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 20 20  number */.      
1f470 20 20 20 20 72 62 75 50 75 74 55 33 32 28 26 61      rbuPutU32(&a
1f480 42 75 66 5b 33 36 5d 2c 20 30 29 3b 20 20 20 20  Buf[36], 0);    
1f490 20 20 20 20 20 20 2f 2a 20 6e 75 6d 62 65 72 20        /* number 
1f4a0 6f 66 20 66 72 65 65 20 70 61 67 65 73 20 2a 2f  of free pages */
1f4b0 0a 20 20 20 20 20 20 20 20 20 20 72 62 75 50 75  .          rbuPu
1f4c0 74 55 33 32 28 26 61 42 75 66 5b 33 32 5d 2c 20  tU32(&aBuf[32], 
1f4d0 30 29 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0);          /* 
1f4e0 66 69 72 73 74 20 70 61 67 65 20 6f 6e 20 66 72  first page on fr
1f4f0 65 65 20 6c 69 73 74 20 74 72 75 6e 6b 20 2a 2f  ee list trunk */
1f500 0a 20 20 20 20 20 20 20 20 20 20 72 62 75 50 75  .          rbuPu
1f510 74 55 33 32 28 26 61 42 75 66 5b 32 38 5d 2c 20  tU32(&aBuf[28], 
1f520 31 29 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  1);          /* 
1f530 73 69 7a 65 20 6f 66 20 64 62 20 66 69 6c 65 20  size of db file 
1f540 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20 20 20  in pages */.    
1f550 20 20 20 20 20 20 72 62 75 50 75 74 55 33 32 28        rbuPutU32(
1f560 26 61 42 75 66 5b 32 34 5d 2c 20 70 52 62 75 2d  &aBuf[24], pRbu-
1f570 3e 70 52 62 75 46 64 2d 3e 69 43 6f 6f 6b 69 65  >pRbuFd->iCookie
1f580 2b 31 29 3b 20 20 2f 2a 20 43 68 61 6e 67 65 20  +1);  /* Change 
1f590 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 20 20  counter */..    
1f5a0 20 20 20 20 20 20 69 66 28 20 69 41 6d 74 3e 31        if( iAmt>1
1f5b0 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  00 ){.          
1f5c0 20 20 6d 65 6d 73 65 74 28 26 61 42 75 66 5b 31    memset(&aBuf[1
1f5d0 30 30 5d 2c 20 30 2c 20 69 41 6d 74 2d 31 30 30  00], 0, iAmt-100
1f5e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
1f5f0 62 75 50 75 74 55 31 36 28 26 61 42 75 66 5b 31  buPutU16(&aBuf[1
1f600 30 35 5d 2c 20 69 41 6d 74 20 26 20 30 78 46 46  05], iAmt & 0xFF
1f610 46 46 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  FF);.           
1f620 20 61 42 75 66 5b 31 30 30 5d 20 3d 20 30 78 30   aBuf[100] = 0x0
1f630 44 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  D;.          }. 
1f640 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1f650 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
1f660 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1f670 5f 4f 4b 20 26 26 20 69 4f 66 73 74 3d 3d 30 20  _OK && iOfst==0 
1f680 26 26 20 28 70 2d 3e 6f 70 65 6e 46 6c 61 67 73  && (p->openFlags
1f690 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d   & SQLITE_OPEN_M
1f6a0 41 49 4e 5f 44 42 29 20 29 7b 0a 20 20 20 20 20  AIN_DB) ){.     
1f6b0 20 2f 2a 20 54 68 65 73 65 20 6c 6f 6f 6b 20 6c   /* These look l
1f6c0 69 6b 65 20 6d 61 67 69 63 20 6e 75 6d 62 65 72  ike magic number
1f6d0 73 2e 20 42 75 74 20 74 68 65 79 20 61 72 65 20  s. But they are 
1f6e0 73 74 61 62 6c 65 2c 20 61 73 20 74 68 65 79 20  stable, as they 
1f6f0 61 72 65 20 70 61 72 74 0a 20 20 20 20 20 20 20  are part.       
1f700 2a 2a 20 6f 66 20 74 68 65 20 64 65 66 69 6e 69  ** of the defini
1f710 74 69 6f 6e 20 6f 66 20 74 68 65 20 53 51 4c 69  tion of the SQLi
1f720 74 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2c 20  te file format, 
1f730 77 68 69 63 68 20 6d 61 79 20 6e 6f 74 20 63 68  which may not ch
1f740 61 6e 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 75  ange. */.      u
1f750 38 20 2a 70 42 75 66 20 3d 20 28 75 38 2a 29 7a  8 *pBuf = (u8*)z
1f760 42 75 66 3b 0a 20 20 20 20 20 20 70 2d 3e 69 43  Buf;.      p->iC
1f770 6f 6f 6b 69 65 20 3d 20 72 62 75 47 65 74 55 33  ookie = rbuGetU3
1f780 32 28 26 70 42 75 66 5b 32 34 5d 29 3b 0a 20 20  2(&pBuf[24]);.  
1f790 20 20 20 20 70 2d 3e 69 57 72 69 74 65 56 65 72      p->iWriteVer
1f7a0 20 3d 20 70 42 75 66 5b 31 39 5d 3b 0a 20 20 20   = pBuf[19];.   
1f7b0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1f7c0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  rc;.}../*.** Wri
1f7d0 74 65 20 64 61 74 61 20 74 6f 20 61 6e 20 72 62  te data to an rb
1f7e0 75 56 66 73 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74  uVfs-file..*/.st
1f7f0 61 74 69 63 20 69 6e 74 20 72 62 75 56 66 73 57  atic int rbuVfsW
1f800 72 69 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f  rite(.  sqlite3_
1f810 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 0a 20 20  file *pFile, .  
1f820 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 42 75 66  const void *zBuf
1f830 2c 20 0a 20 20 69 6e 74 20 69 41 6d 74 2c 20 0a  , .  int iAmt, .
1f840 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 69    sqlite_int64 i
1f850 4f 66 73 74 0a 29 7b 0a 20 20 72 62 75 5f 66 69  Ofst.){.  rbu_fi
1f860 6c 65 20 2a 70 20 3d 20 28 72 62 75 5f 66 69 6c  le *p = (rbu_fil
1f870 65 2a 29 70 46 69 6c 65 3b 0a 20 20 73 71 6c 69  e*)pFile;.  sqli
1f880 74 65 33 72 62 75 20 2a 70 52 62 75 20 3d 20 70  te3rbu *pRbu = p
1f890 2d 3e 70 52 62 75 3b 0a 20 20 69 6e 74 20 72 63  ->pRbu;.  int rc
1f8a0 3b 0a 0a 20 20 69 66 28 20 70 52 62 75 20 26 26  ;..  if( pRbu &&
1f8b0 20 70 52 62 75 2d 3e 65 53 74 61 67 65 3d 3d 52   pRbu->eStage==R
1f8c0 42 55 5f 53 54 41 47 45 5f 43 41 50 54 55 52 45  BU_STAGE_CAPTURE
1f8d0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1f8e0 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20 53  p->openFlags & S
1f8f0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
1f900 44 42 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 72  DB );.    rc = r
1f910 62 75 43 61 70 74 75 72 65 44 62 57 72 69 74 65  buCaptureDbWrite
1f920 28 70 2d 3e 70 52 62 75 2c 20 69 4f 66 73 74 29  (p->pRbu, iOfst)
1f930 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
1f940 66 28 20 70 52 62 75 20 26 26 20 70 52 62 75 2d  f( pRbu && pRbu-
1f950 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41  >eStage==RBU_STA
1f960 47 45 5f 4f 41 4c 20 0a 20 20 20 20 20 26 26 20  GE_OAL .     && 
1f970 28 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20  (p->openFlags & 
1f980 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 29  SQLITE_OPEN_WAL)
1f990 20 0a 20 20 20 20 20 26 26 20 69 4f 66 73 74 3e   .     && iOfst>
1f9a0 3d 70 52 62 75 2d 3e 69 4f 61 6c 53 7a 0a 20 20  =pRbu->iOalSz.  
1f9b0 20 20 29 7b 0a 20 20 20 20 20 20 70 52 62 75 2d    ){.      pRbu-
1f9c0 3e 69 4f 61 6c 53 7a 20 3d 20 69 41 6d 74 20 2b  >iOalSz = iAmt +
1f9d0 20 69 4f 66 73 74 3b 0a 20 20 20 20 7d 0a 20 20   iOfst;.    }.  
1f9e0 20 20 72 63 20 3d 20 70 2d 3e 70 52 65 61 6c 2d    rc = p->pReal-
1f9f0 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 57 72 69 74  >pMethods->xWrit
1fa00 65 28 70 2d 3e 70 52 65 61 6c 2c 20 7a 42 75 66  e(p->pReal, zBuf
1fa10 2c 20 69 41 6d 74 2c 20 69 4f 66 73 74 29 3b 0a  , iAmt, iOfst);.
1fa20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1fa30 54 45 5f 4f 4b 20 26 26 20 69 4f 66 73 74 3d 3d  TE_OK && iOfst==
1fa40 30 20 26 26 20 28 70 2d 3e 6f 70 65 6e 46 6c 61  0 && (p->openFla
1fa50 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
1fa60 5f 4d 41 49 4e 5f 44 42 29 20 29 7b 0a 20 20 20  _MAIN_DB) ){.   
1fa70 20 20 20 2f 2a 20 54 68 65 73 65 20 6c 6f 6f 6b     /* These look
1fa80 20 6c 69 6b 65 20 6d 61 67 69 63 20 6e 75 6d 62   like magic numb
1fa90 65 72 73 2e 20 42 75 74 20 74 68 65 79 20 61 72  ers. But they ar
1faa0 65 20 73 74 61 62 6c 65 2c 20 61 73 20 74 68 65  e stable, as the
1fab0 79 20 61 72 65 20 70 61 72 74 0a 20 20 20 20 20  y are part.     
1fac0 20 2a 2a 20 6f 66 20 74 68 65 20 64 65 66 69 6e   ** of the defin
1fad0 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 53 51 4c  ition of the SQL
1fae0 69 74 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2c  ite file format,
1faf0 20 77 68 69 63 68 20 6d 61 79 20 6e 6f 74 20 63   which may not c
1fb00 68 61 6e 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20  hange. */.      
1fb10 75 38 20 2a 70 42 75 66 20 3d 20 28 75 38 2a 29  u8 *pBuf = (u8*)
1fb20 7a 42 75 66 3b 0a 20 20 20 20 20 20 70 2d 3e 69  zBuf;.      p->i
1fb30 43 6f 6f 6b 69 65 20 3d 20 72 62 75 47 65 74 55  Cookie = rbuGetU
1fb40 33 32 28 26 70 42 75 66 5b 32 34 5d 29 3b 0a 20  32(&pBuf[24]);. 
1fb50 20 20 20 20 20 70 2d 3e 69 57 72 69 74 65 56 65       p->iWriteVe
1fb60 72 20 3d 20 70 42 75 66 5b 31 39 5d 3b 0a 20 20  r = pBuf[19];.  
1fb70 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1fb80 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72   rc;.}../*.** Tr
1fb90 75 6e 63 61 74 65 20 61 6e 20 72 62 75 56 66 73  uncate an rbuVfs
1fba0 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  -file..*/.static
1fbb0 20 69 6e 74 20 72 62 75 56 66 73 54 72 75 6e 63   int rbuVfsTrunc
1fbc0 61 74 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ate(sqlite3_file
1fbd0 20 2a 70 46 69 6c 65 2c 20 73 71 6c 69 74 65 5f   *pFile, sqlite_
1fbe0 69 6e 74 36 34 20 73 69 7a 65 29 7b 0a 20 20 72  int64 size){.  r
1fbf0 62 75 5f 66 69 6c 65 20 2a 70 20 3d 20 28 72 62  bu_file *p = (rb
1fc00 75 5f 66 69 6c 65 2a 29 70 46 69 6c 65 3b 0a 20  u_file*)pFile;. 
1fc10 20 72 65 74 75 72 6e 20 70 2d 3e 70 52 65 61 6c   return p->pReal
1fc20 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 54 72 75  ->pMethods->xTru
1fc30 6e 63 61 74 65 28 70 2d 3e 70 52 65 61 6c 2c 20  ncate(p->pReal, 
1fc40 73 69 7a 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  size);.}../*.** 
1fc50 53 79 6e 63 20 61 6e 20 72 62 75 56 66 73 2d 66  Sync an rbuVfs-f
1fc60 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
1fc70 6e 74 20 72 62 75 56 66 73 53 79 6e 63 28 73 71  nt rbuVfsSync(sq
1fc80 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
1fc90 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  e, int flags){. 
1fca0 20 72 62 75 5f 66 69 6c 65 20 2a 70 20 3d 20 28   rbu_file *p = (
1fcb0 72 62 75 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65  rbu_file *)pFile
1fcc0 3b 0a 20 20 69 66 28 20 70 2d 3e 70 52 62 75 20  ;.  if( p->pRbu 
1fcd0 26 26 20 70 2d 3e 70 52 62 75 2d 3e 65 53 74 61  && p->pRbu->eSta
1fce0 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 43 41  ge==RBU_STAGE_CA
1fcf0 50 54 55 52 45 20 29 7b 0a 20 20 20 20 69 66 28  PTURE ){.    if(
1fd00 20 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20   p->openFlags & 
1fd10 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
1fd20 5f 44 42 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _DB ){.      ret
1fd30 75 72 6e 20 53 51 4c 49 54 45 5f 49 4e 54 45 52  urn SQLITE_INTER
1fd40 4e 41 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  NAL;.    }.    r
1fd50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1fd60 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 2d  .  }.  return p-
1fd70 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73  >pReal->pMethods
1fd80 2d 3e 78 53 79 6e 63 28 70 2d 3e 70 52 65 61 6c  ->xSync(p->pReal
1fd90 2c 20 66 6c 61 67 73 29 3b 0a 7d 0a 0a 2f 2a 0a  , flags);.}../*.
1fda0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75  ** Return the cu
1fdb0 72 72 65 6e 74 20 66 69 6c 65 2d 73 69 7a 65 20  rrent file-size 
1fdc0 6f 66 20 61 6e 20 72 62 75 56 66 73 2d 66 69 6c  of an rbuVfs-fil
1fdd0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1fde0 20 72 62 75 56 66 73 46 69 6c 65 53 69 7a 65 28   rbuVfsFileSize(
1fdf0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
1fe00 69 6c 65 2c 20 73 71 6c 69 74 65 5f 69 6e 74 36  ile, sqlite_int6
1fe10 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 72 62 75  4 *pSize){.  rbu
1fe20 5f 66 69 6c 65 20 2a 70 20 3d 20 28 72 62 75 5f  _file *p = (rbu_
1fe30 66 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20  file *)pFile;.  
1fe40 69 6e 74 20 72 63 3b 0a 20 20 72 63 20 3d 20 70  int rc;.  rc = p
1fe50 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64  ->pReal->pMethod
1fe60 73 2d 3e 78 46 69 6c 65 53 69 7a 65 28 70 2d 3e  s->xFileSize(p->
1fe70 70 52 65 61 6c 2c 20 70 53 69 7a 65 29 3b 0a 0a  pReal, pSize);..
1fe80 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
1fe90 61 6e 20 52 42 55 20 76 61 63 75 75 6d 20 6f 70  an RBU vacuum op
1fea0 65 72 61 74 69 6f 6e 20 61 6e 64 20 74 68 69 73  eration and this
1feb0 20 69 73 20 74 68 65 20 74 61 72 67 65 74 20 64   is the target d
1fec0 61 74 61 62 61 73 65 2c 0a 20 20 2a 2a 20 70 72  atabase,.  ** pr
1fed0 65 74 65 6e 64 20 74 68 61 74 20 69 74 20 68 61  etend that it ha
1fee0 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 70  s at least one p
1fef0 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  age. Otherwise, 
1ff00 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e 6f 74 0a  SQLite will not.
1ff10 20 20 2a 2a 20 63 68 65 63 6b 20 66 6f 72 20 74    ** check for t
1ff20 68 65 20 65 78 69 73 74 61 6e 63 65 20 6f 66 20  he existance of 
1ff30 61 20 2a 2d 77 61 6c 20 66 69 6c 65 2e 20 72 62  a *-wal file. rb
1ff40 75 56 66 73 52 65 61 64 28 29 20 63 6f 6e 74 61  uVfsRead() conta
1ff50 69 6e 73 20 0a 20 20 2a 2a 20 73 69 6d 69 6c 61  ins .  ** simila
1ff60 72 20 6c 6f 67 69 63 2e 20 20 2a 2f 0a 20 20 69  r logic.  */.  i
1ff70 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1ff80 20 26 26 20 2a 70 53 69 7a 65 3d 3d 30 20 0a 20   && *pSize==0 . 
1ff90 20 20 26 26 20 70 2d 3e 70 52 62 75 20 26 26 20    && p->pRbu && 
1ffa0 72 62 75 49 73 56 61 63 75 75 6d 28 70 2d 3e 70  rbuIsVacuum(p->p
1ffb0 52 62 75 29 20 0a 20 20 20 26 26 20 28 70 2d 3e  Rbu) .   && (p->
1ffc0 6f 70 65 6e 46 6c 61 67 73 20 26 20 53 51 4c 49  openFlags & SQLI
1ffd0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29  TE_OPEN_MAIN_DB)
1ffe0 0a 20 20 29 7b 0a 20 20 20 20 2a 70 53 69 7a 65  .  ){.    *pSize
1fff0 20 3d 20 31 30 32 34 3b 0a 20 20 7d 0a 20 20 72   = 1024;.  }.  r
20000 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
20010 2a 2a 20 4c 6f 63 6b 20 61 6e 20 72 62 75 56 66  ** Lock an rbuVf
20020 73 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  s-file..*/.stati
20030 63 20 69 6e 74 20 72 62 75 56 66 73 4c 6f 63 6b  c int rbuVfsLock
20040 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70  (sqlite3_file *p
20050 46 69 6c 65 2c 20 69 6e 74 20 65 4c 6f 63 6b 29  File, int eLock)
20060 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 20  {.  rbu_file *p 
20070 3d 20 28 72 62 75 5f 66 69 6c 65 2a 29 70 46 69  = (rbu_file*)pFi
20080 6c 65 3b 0a 20 20 73 71 6c 69 74 65 33 72 62 75  le;.  sqlite3rbu
20090 20 2a 70 52 62 75 20 3d 20 70 2d 3e 70 52 62 75   *pRbu = p->pRbu
200a0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
200b0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
200c0 74 28 20 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20  t( p->openFlags 
200d0 26 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  & (SQLITE_OPEN_M
200e0 41 49 4e 5f 44 42 7c 53 51 4c 49 54 45 5f 4f 50  AIN_DB|SQLITE_OP
200f0 45 4e 5f 54 45 4d 50 5f 44 42 29 20 29 3b 0a 20  EN_TEMP_DB) );. 
20100 20 69 66 28 20 65 4c 6f 63 6b 3d 3d 53 51 4c 49   if( eLock==SQLI
20110 54 45 5f 4c 4f 43 4b 5f 45 58 43 4c 55 53 49 56  TE_LOCK_EXCLUSIV
20120 45 20 0a 20 20 20 26 26 20 28 70 2d 3e 62 4e 6f  E .   && (p->bNo
20130 6c 6f 63 6b 20 7c 7c 20 28 70 52 62 75 20 26 26  lock || (pRbu &&
20140 20 70 52 62 75 2d 3e 65 53 74 61 67 65 21 3d 52   pRbu->eStage!=R
20150 42 55 5f 53 54 41 47 45 5f 44 4f 4e 45 29 29 0a  BU_STAGE_DONE)).
20160 20 20 29 7b 0a 20 20 20 20 2f 2a 20 44 6f 20 6e    ){.    /* Do n
20170 6f 74 20 61 6c 6c 6f 77 20 45 58 43 4c 55 53 49  ot allow EXCLUSI
20180 56 45 20 6c 6f 63 6b 73 2e 20 50 72 65 76 65 6e  VE locks. Preven
20190 74 69 6e 67 20 53 51 4c 69 74 65 20 66 72 6f 6d  ting SQLite from
201a0 20 74 61 6b 69 6e 67 20 74 68 69 73 20 0a 20 20   taking this .  
201b0 20 20 2a 2a 20 70 72 65 76 65 6e 74 73 20 69 74    ** prevents it
201c0 20 66 72 6f 6d 20 63 68 65 63 6b 70 6f 69 6e 74   from checkpoint
201d0 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
201e0 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 63 6c   from sqlite3_cl
201f0 6f 73 65 28 29 2e 20 2a 2f 0a 20 20 20 20 72 63  ose(). */.    rc
20200 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
20210 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
20220 3d 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74  = p->pReal->pMet
20230 68 6f 64 73 2d 3e 78 4c 6f 63 6b 28 70 2d 3e 70  hods->xLock(p->p
20240 52 65 61 6c 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20  Real, eLock);.  
20250 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
20260 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20  }../*.** Unlock 
20270 61 6e 20 72 62 75 56 66 73 2d 66 69 6c 65 2e 0a  an rbuVfs-file..
20280 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62  */.static int rb
20290 75 56 66 73 55 6e 6c 6f 63 6b 28 73 71 6c 69 74  uVfsUnlock(sqlit
202a0 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20  e3_file *pFile, 
202b0 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 72 62  int eLock){.  rb
202c0 75 5f 66 69 6c 65 20 2a 70 20 3d 20 28 72 62 75  u_file *p = (rbu
202d0 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20  _file *)pFile;. 
202e0 20 72 65 74 75 72 6e 20 70 2d 3e 70 52 65 61 6c   return p->pReal
202f0 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 55 6e 6c  ->pMethods->xUnl
20300 6f 63 6b 28 70 2d 3e 70 52 65 61 6c 2c 20 65 4c  ock(p->pReal, eL
20310 6f 63 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ock);.}../*.** C
20320 68 65 63 6b 20 69 66 20 61 6e 6f 74 68 65 72 20  heck if another 
20330 66 69 6c 65 2d 68 61 6e 64 6c 65 20 68 6f 6c 64  file-handle hold
20340 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  s a RESERVED loc
20350 6b 20 6f 6e 20 61 6e 20 72 62 75 56 66 73 2d 66  k on an rbuVfs-f
20360 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
20370 6e 74 20 72 62 75 56 66 73 43 68 65 63 6b 52 65  nt rbuVfsCheckRe
20380 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
20390 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20  e3_file *pFile, 
203a0 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20  int *pResOut){. 
203b0 20 72 62 75 5f 66 69 6c 65 20 2a 70 20 3d 20 28   rbu_file *p = (
203c0 72 62 75 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65  rbu_file *)pFile
203d0 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 52  ;.  return p->pR
203e0 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78  eal->pMethods->x
203f0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
20400 6b 28 70 2d 3e 70 52 65 61 6c 2c 20 70 52 65 73  k(p->pReal, pRes
20410 4f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  Out);.}../*.** F
20420 69 6c 65 20 63 6f 6e 74 72 6f 6c 20 6d 65 74 68  ile control meth
20430 6f 64 2e 20 46 6f 72 20 63 75 73 74 6f 6d 20 6f  od. For custom o
20440 70 65 72 61 74 69 6f 6e 73 20 6f 6e 20 61 6e 20  perations on an 
20450 72 62 75 56 66 73 2d 66 69 6c 65 2e 0a 2a 2f 0a  rbuVfs-file..*/.
20460 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 56 66  static int rbuVf
20470 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c  sFileControl(sql
20480 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65  ite3_file *pFile
20490 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a  , int op, void *
204a0 70 41 72 67 29 7b 0a 20 20 72 62 75 5f 66 69 6c  pArg){.  rbu_fil
204b0 65 20 2a 70 20 3d 20 28 72 62 75 5f 66 69 6c 65  e *p = (rbu_file
204c0 20 2a 29 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20   *)pFile;.  int 
204d0 28 2a 78 43 6f 6e 74 72 6f 6c 29 28 73 71 6c 69  (*xControl)(sqli
204e0 74 65 33 5f 66 69 6c 65 2a 2c 69 6e 74 2c 76 6f  te3_file*,int,vo
204f0 69 64 2a 29 20 3d 20 70 2d 3e 70 52 65 61 6c 2d  id*) = p->pReal-
20500 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 46 69 6c 65  >pMethods->xFile
20510 43 6f 6e 74 72 6f 6c 3b 0a 20 20 69 6e 74 20 72  Control;.  int r
20520 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  c;..  assert( p-
20530 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20 28 53 51  >openFlags & (SQ
20540 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
20550 42 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45  B|SQLITE_OPEN_TE
20560 4d 50 5f 44 42 29 0a 20 20 20 20 20 20 20 7c 7c  MP_DB).       ||
20570 20 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20   p->openFlags & 
20580 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41  (SQLITE_OPEN_TRA
20590 4e 53 49 45 4e 54 5f 44 42 7c 53 51 4c 49 54 45  NSIENT_DB|SQLITE
205a0 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e  _OPEN_TEMP_JOURN
205b0 41 4c 29 0a 20 20 29 3b 0a 20 20 69 66 28 20 6f  AL).  );.  if( o
205c0 70 3d 3d 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  p==SQLITE_FCNTL_
205d0 52 42 55 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  RBU ){.    sqlit
205e0 65 33 72 62 75 20 2a 70 52 62 75 20 3d 20 28 73  e3rbu *pRbu = (s
205f0 71 6c 69 74 65 33 72 62 75 2a 29 70 41 72 67 3b  qlite3rbu*)pArg;
20600 0a 0a 20 20 20 20 2f 2a 20 46 69 72 73 74 20 74  ..    /* First t
20610 72 79 20 74 6f 20 66 69 6e 64 20 61 6e 6f 74 68  ry to find anoth
20620 65 72 20 52 42 55 20 76 66 73 20 6c 6f 77 65 72  er RBU vfs lower
20630 20 64 6f 77 6e 20 69 6e 20 74 68 65 20 76 66 73   down in the vfs
20640 20 73 74 61 63 6b 2e 20 49 66 0a 20 20 20 20 2a   stack. If.    *
20650 2a 20 6f 6e 65 20 69 73 20 66 6f 75 6e 64 2c 20  * one is found, 
20660 74 68 69 73 20 76 66 73 20 77 69 6c 6c 20 6f 70  this vfs will op
20670 65 72 61 74 65 20 69 6e 20 70 61 73 73 2d 74 68  erate in pass-th
20680 72 6f 75 67 68 20 6d 6f 64 65 2e 20 54 68 65 20  rough mode. The 
20690 6c 6f 77 65 72 0a 20 20 20 20 2a 2a 20 6c 65 76  lower.    ** lev
206a0 65 6c 20 76 66 73 20 77 69 6c 6c 20 64 6f 20 74  el vfs will do t
206b0 68 65 20 73 70 65 63 69 61 6c 20 52 42 55 20 68  he special RBU h
206c0 61 6e 64 6c 69 6e 67 2e 20 20 2a 2f 0a 20 20 20  andling.  */.   
206d0 20 72 63 20 3d 20 78 43 6f 6e 74 72 6f 6c 28 70   rc = xControl(p
206e0 2d 3e 70 52 65 61 6c 2c 20 6f 70 2c 20 70 41 72  ->pReal, op, pAr
206f0 67 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d  g);..    if( rc=
20700 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44  =SQLITE_NOTFOUND
20710 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 77   ){.      /* Now
20720 20 73 65 61 72 63 68 20 66 6f 72 20 61 20 7a 69   search for a zi
20730 70 76 66 73 20 69 6e 73 74 61 6e 63 65 20 6c 6f  pvfs instance lo
20740 77 65 72 20 64 6f 77 6e 20 69 6e 20 74 68 65 20  wer down in the 
20750 56 46 53 20 73 74 61 63 6b 2e 20 49 66 0a 20 20  VFS stack. If.  
20760 20 20 20 20 2a 2a 20 6f 6e 65 20 69 73 20 66 6f      ** one is fo
20770 75 6e 64 2c 20 74 68 69 73 20 69 73 20 61 6e 20  und, this is an 
20780 65 72 72 6f 72 2e 20 20 2a 2f 0a 20 20 20 20 20  error.  */.     
20790 20 76 6f 69 64 20 2a 64 75 6d 6d 79 20 3d 20 30   void *dummy = 0
207a0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 78 43 6f  ;.      rc = xCo
207b0 6e 74 72 6f 6c 28 70 2d 3e 70 52 65 61 6c 2c 20  ntrol(p->pReal, 
207c0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 5a 49 50  SQLITE_FCNTL_ZIP
207d0 56 46 53 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20  VFS, &dummy);.  
207e0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
207f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
20800 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
20810 4f 52 3b 0a 20 20 20 20 20 20 20 20 70 52 62 75  OR;.        pRbu
20820 2d 3e 7a 45 72 72 6d 73 67 20 3d 20 73 71 6c 69  ->zErrmsg = sqli
20830 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 72 62 75  te3_mprintf("rbu
20840 2f 7a 69 70 76 66 73 20 73 65 74 75 70 20 65 72  /zipvfs setup er
20850 72 6f 72 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ror");.      }el
20860 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  se if( rc==SQLIT
20870 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 7b 0a 20 20  E_NOTFOUND ){.  
20880 20 20 20 20 20 20 70 52 62 75 2d 3e 70 54 61 72        pRbu->pTar
20890 67 65 74 46 64 20 3d 20 70 3b 0a 20 20 20 20 20  getFd = p;.     
208a0 20 20 20 70 2d 3e 70 52 62 75 20 3d 20 70 52 62     p->pRbu = pRb
208b0 75 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  u;.        if( p
208c0 2d 3e 70 57 61 6c 46 64 20 29 20 70 2d 3e 70 57  ->pWalFd ) p->pW
208d0 61 6c 46 64 2d 3e 70 52 62 75 20 3d 20 70 52 62  alFd->pRbu = pRb
208e0 75 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  u;.        rc = 
208f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
20900 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74   }.    }.    ret
20910 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 65 6c  urn rc;.  }.  el
20920 73 65 20 69 66 28 20 6f 70 3d 3d 53 51 4c 49 54  se if( op==SQLIT
20930 45 5f 46 43 4e 54 4c 5f 52 42 55 43 4e 54 20 29  E_FCNTL_RBUCNT )
20940 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 72 62 75  {.    sqlite3rbu
20950 20 2a 70 52 62 75 20 3d 20 28 73 71 6c 69 74 65   *pRbu = (sqlite
20960 33 72 62 75 2a 29 70 41 72 67 3b 0a 20 20 20 20  3rbu*)pArg;.    
20970 70 52 62 75 2d 3e 6e 52 62 75 2b 2b 3b 0a 20 20  pRbu->nRbu++;.  
20980 20 20 70 52 62 75 2d 3e 70 52 62 75 46 64 20 3d    pRbu->pRbuFd =
20990 20 70 3b 0a 20 20 20 20 70 2d 3e 62 4e 6f 6c 6f   p;.    p->bNolo
209a0 63 6b 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 72  ck = 1;.  }..  r
209b0 63 20 3d 20 78 43 6f 6e 74 72 6f 6c 28 70 2d 3e  c = xControl(p->
209c0 70 52 65 61 6c 2c 20 6f 70 2c 20 70 41 72 67 29  pReal, op, pArg)
209d0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
209e0 54 45 5f 4f 4b 20 26 26 20 6f 70 3d 3d 53 51 4c  TE_OK && op==SQL
209f0 49 54 45 5f 46 43 4e 54 4c 5f 56 46 53 4e 41 4d  ITE_FCNTL_VFSNAM
20a00 45 20 29 7b 0a 20 20 20 20 72 62 75 5f 76 66 73  E ){.    rbu_vfs
20a10 20 2a 70 52 62 75 56 66 73 20 3d 20 70 2d 3e 70   *pRbuVfs = p->p
20a20 52 62 75 56 66 73 3b 0a 20 20 20 20 63 68 61 72  RbuVfs;.    char
20a30 20 2a 7a 49 6e 20 3d 20 2a 28 63 68 61 72 2a 2a   *zIn = *(char**
20a40 29 70 41 72 67 3b 0a 20 20 20 20 63 68 61 72 20  )pArg;.    char 
20a50 2a 7a 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 5f  *zOut = sqlite3_
20a60 6d 70 72 69 6e 74 66 28 22 72 62 75 28 25 73 29  mprintf("rbu(%s)
20a70 2f 25 7a 22 2c 20 70 52 62 75 56 66 73 2d 3e 62  /%z", pRbuVfs->b
20a80 61 73 65 2e 7a 4e 61 6d 65 2c 20 7a 49 6e 29 3b  ase.zName, zIn);
20a90 0a 20 20 20 20 2a 28 63 68 61 72 2a 2a 29 70 41  .    *(char**)pA
20aa0 72 67 20 3d 20 7a 4f 75 74 3b 0a 20 20 20 20 69  rg = zOut;.    i
20ab0 66 28 20 7a 4f 75 74 3d 3d 30 20 29 20 72 63 20  f( zOut==0 ) rc 
20ac0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
20ad0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
20ae0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
20af0 6e 20 74 68 65 20 73 65 63 74 6f 72 2d 73 69 7a  n the sector-siz
20b00 65 20 69 6e 20 62 79 74 65 73 20 66 6f 72 20 61  e in bytes for a
20b10 6e 20 72 62 75 56 66 73 2d 66 69 6c 65 2e 0a 2a  n rbuVfs-file..*
20b20 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62 75  /.static int rbu
20b30 56 66 73 53 65 63 74 6f 72 53 69 7a 65 28 73 71  VfsSectorSize(sq
20b40 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
20b50 65 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a  e){.  rbu_file *
20b60 70 20 3d 20 28 72 62 75 5f 66 69 6c 65 20 2a 29  p = (rbu_file *)
20b70 70 46 69 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20  pFile;.  return 
20b80 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f  p->pReal->pMetho
20b90 64 73 2d 3e 78 53 65 63 74 6f 72 53 69 7a 65 28  ds->xSectorSize(
20ba0 70 2d 3e 70 52 65 61 6c 29 3b 0a 7d 0a 0a 2f 2a  p->pReal);.}../*
20bb0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64  .** Return the d
20bc0 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69  evice characteri
20bd0 73 74 69 63 20 66 6c 61 67 73 20 73 75 70 70 6f  stic flags suppo
20be0 72 74 65 64 20 62 79 20 61 6e 20 72 62 75 56 66  rted by an rbuVf
20bf0 73 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  s-file..*/.stati
20c00 63 20 69 6e 74 20 72 62 75 56 66 73 44 65 76 69  c int rbuVfsDevi
20c10 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
20c20 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  s(sqlite3_file *
20c30 70 46 69 6c 65 29 7b 0a 20 20 72 62 75 5f 66 69  pFile){.  rbu_fi
20c40 6c 65 20 2a 70 20 3d 20 28 72 62 75 5f 66 69 6c  le *p = (rbu_fil
20c50 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 72 65 74  e *)pFile;.  ret
20c60 75 72 6e 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d  urn p->pReal->pM
20c70 65 74 68 6f 64 73 2d 3e 78 44 65 76 69 63 65 43  ethods->xDeviceC
20c80 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
20c90 2d 3e 70 52 65 61 6c 29 3b 0a 7d 0a 0a 2f 2a 0a  ->pReal);.}../*.
20ca0 2a 2a 20 54 61 6b 65 20 6f 72 20 72 65 6c 65 61  ** Take or relea
20cb0 73 65 20 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f  se a shared-memo
20cc0 72 79 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74  ry lock..*/.stat
20cd0 69 63 20 69 6e 74 20 72 62 75 56 66 73 53 68 6d  ic int rbuVfsShm
20ce0 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
20cf0 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20 6f 66  e *pFile, int of
20d00 73 74 2c 20 69 6e 74 20 6e 2c 20 69 6e 74 20 66  st, int n, int f
20d10 6c 61 67 73 29 7b 0a 20 20 72 62 75 5f 66 69 6c  lags){.  rbu_fil
20d20 65 20 2a 70 20 3d 20 28 72 62 75 5f 66 69 6c 65  e *p = (rbu_file
20d30 2a 29 70 46 69 6c 65 3b 0a 20 20 73 71 6c 69 74  *)pFile;.  sqlit
20d40 65 33 72 62 75 20 2a 70 52 62 75 20 3d 20 70 2d  e3rbu *pRbu = p-
20d50 3e 70 52 62 75 3b 0a 20 20 69 6e 74 20 72 63 20  >pRbu;.  int rc 
20d60 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 23 69  = SQLITE_OK;..#i
20d70 66 64 65 66 20 53 51 4c 49 54 45 5f 41 4d 41 4c  fdef SQLITE_AMAL
20d80 47 41 4d 41 54 49 4f 4e 0a 20 20 20 20 61 73 73  GAMATION.    ass
20d90 65 72 74 28 20 57 41 4c 5f 43 4b 50 54 5f 4c 4f  ert( WAL_CKPT_LO
20da0 43 4b 3d 3d 31 20 29 3b 0a 23 65 6e 64 69 66 0a  CK==1 );.#endif.
20db0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70  .  assert( p->op
20dc0 65 6e 46 6c 61 67 73 20 26 20 28 53 51 4c 49 54  enFlags & (SQLIT
20dd0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 7c 53  E_OPEN_MAIN_DB|S
20de0 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
20df0 44 42 29 20 29 3b 0a 20 20 69 66 28 20 70 52 62  DB) );.  if( pRb
20e00 75 20 26 26 20 28 70 52 62 75 2d 3e 65 53 74 61  u && (pRbu->eSta
20e10 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4f 41  ge==RBU_STAGE_OA
20e20 4c 20 7c 7c 20 70 52 62 75 2d 3e 65 53 74 61 67  L || pRbu->eStag
20e30 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4d 4f 56  e==RBU_STAGE_MOV
20e40 45 29 20 29 7b 0a 20 20 20 20 2f 2a 20 4d 61 67  E) ){.    /* Mag
20e50 69 63 20 6e 75 6d 62 65 72 20 31 20 69 73 20 74  ic number 1 is t
20e60 68 65 20 57 41 4c 5f 43 4b 50 54 5f 4c 4f 43 4b  he WAL_CKPT_LOCK
20e70 20 6c 6f 63 6b 2e 20 50 72 65 76 65 6e 74 69 6e   lock. Preventin
20e80 67 20 53 51 4c 69 74 65 20 66 72 6f 6d 0a 20 20  g SQLite from.  
20e90 20 20 2a 2a 20 74 61 6b 69 6e 67 20 74 68 69 73    ** taking this
20ea0 20 6c 6f 63 6b 20 61 6c 73 6f 20 70 72 65 76 65   lock also preve
20eb0 6e 74 73 20 61 6e 79 20 63 68 65 63 6b 70 6f 69  nts any checkpoi
20ec0 6e 74 73 20 66 72 6f 6d 20 6f 63 63 75 72 72 69  nts from occurri
20ed0 6e 67 2e 20 0a 20 20 20 20 2a 2a 20 74 6f 64 6f  ng. .    ** todo
20ee0 3a 20 72 65 61 6c 6c 79 2c 20 69 74 27 73 20 6e  : really, it's n
20ef0 6f 74 20 63 6c 65 61 72 20 77 68 79 20 74 68 69  ot clear why thi
20f00 73 20 6d 69 67 68 74 20 6f 63 63 75 72 2c 20 61  s might occur, a
20f10 73 20 0a 20 20 20 20 2a 2a 20 77 61 6c 5f 61 75  s .    ** wal_au
20f20 74 6f 63 68 65 63 6b 70 6f 69 6e 74 20 6f 75 67  tocheckpoint oug
20f30 68 74 20 74 6f 20 62 65 20 74 75 72 6e 65 64 20  ht to be turned 
20f40 6f 66 66 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  off.  */.    if(
20f50 20 6f 66 73 74 3d 3d 57 41 4c 5f 4c 4f 43 4b 5f   ofst==WAL_LOCK_
20f60 43 4b 50 54 20 26 26 20 6e 3d 3d 31 20 29 20 72  CKPT && n==1 ) r
20f70 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
20f80 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
20f90 74 20 62 43 61 70 74 75 72 65 20 3d 20 30 3b 0a  t bCapture = 0;.
20fa0 20 20 20 20 69 66 28 20 6e 3d 3d 31 20 26 26 20      if( n==1 && 
20fb0 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
20fc0 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 0a 20  SHM_EXCLUSIVE). 
20fd0 20 20 20 20 26 26 20 70 52 62 75 20 26 26 20 70      && pRbu && p
20fe0 52 62 75 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55  Rbu->eStage==RBU
20ff0 5f 53 54 41 47 45 5f 43 41 50 54 55 52 45 0a 20  _STAGE_CAPTURE. 
21000 20 20 20 20 26 26 20 28 6f 66 73 74 3d 3d 57 41      && (ofst==WA
21010 4c 5f 4c 4f 43 4b 5f 57 52 49 54 45 20 7c 7c 20  L_LOCK_WRITE || 
21020 6f 66 73 74 3d 3d 57 41 4c 5f 4c 4f 43 4b 5f 43  ofst==WAL_LOCK_C
21030 4b 50 54 20 7c 7c 20 6f 66 73 74 3d 3d 57 41 4c  KPT || ofst==WAL
21040 5f 4c 4f 43 4b 5f 52 45 41 44 30 29 0a 20 20 20  _LOCK_READ0).   
21050 20 29 7b 0a 20 20 20 20 20 20 62 43 61 70 74 75   ){.      bCaptu
21060 72 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20  re = 1;.    }.. 
21070 20 20 20 69 66 28 20 62 43 61 70 74 75 72 65 3d     if( bCapture=
21080 3d 30 20 7c 7c 20 30 3d 3d 28 66 6c 61 67 73 20  =0 || 0==(flags 
21090 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c  & SQLITE_SHM_UNL
210a0 4f 43 4b 29 20 29 7b 0a 20 20 20 20 20 20 72 63  OCK) ){.      rc
210b0 20 3d 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65   = p->pReal->pMe
210c0 74 68 6f 64 73 2d 3e 78 53 68 6d 4c 6f 63 6b 28  thods->xShmLock(
210d0 70 2d 3e 70 52 65 61 6c 2c 20 6f 66 73 74 2c 20  p->pReal, ofst, 
210e0 6e 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 20  n, flags);.     
210f0 20 69 66 28 20 62 43 61 70 74 75 72 65 20 26 26   if( bCapture &&
21100 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
21110 7b 0a 20 20 20 20 20 20 20 20 70 52 62 75 2d 3e  {.        pRbu->
21120 6d 4c 6f 63 6b 20 7c 3d 20 28 31 20 3c 3c 20 6f  mLock |= (1 << o
21130 66 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  fst);.      }.  
21140 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
21150 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  n rc;.}../*.** O
21160 62 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20  btain a pointer 
21170 74 6f 20 61 20 6d 61 70 70 69 6e 67 20 6f 66 20  to a mapping of 
21180 61 20 73 69 6e 67 6c 65 20 33 32 4b 69 42 20 70  a single 32KiB p
21190 61 67 65 20 6f 66 20 74 68 65 20 2a 2d 73 68 6d  age of the *-shm
211a0 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
211b0 20 69 6e 74 20 72 62 75 56 66 73 53 68 6d 4d 61   int rbuVfsShmMa
211c0 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  p(.  sqlite3_fil
211d0 65 20 2a 70 46 69 6c 65 2c 20 0a 20 20 69 6e 74  e *pFile, .  int
211e0 20 69 52 65 67 69 6f 6e 2c 20 0a 20 20 69 6e 74   iRegion, .  int
211f0 20 73 7a 52 65 67 69 6f 6e 2c 20 0a 20 20 69 6e   szRegion, .  in
21200 74 20 69 73 57 72 69 74 65 2c 20 0a 20 20 76 6f  t isWrite, .  vo
21210 69 64 20 76 6f 6c 61 74 69 6c 65 20 2a 2a 70 70  id volatile **pp
21220 0a 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a  .){.  rbu_file *
21230 70 20 3d 20 28 72 62 75 5f 66 69 6c 65 2a 29 70  p = (rbu_file*)p
21240 46 69 6c 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d  File;.  int rc =
21250 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
21260 74 20 65 53 74 61 67 65 20 3d 20 28 70 2d 3e 70  t eStage = (p->p
21270 52 62 75 20 3f 20 70 2d 3e 70 52 62 75 2d 3e 65  Rbu ? p->pRbu->e
21280 53 74 61 67 65 20 3a 20 30 29 3b 0a 0a 20 20 2f  Stage : 0);..  /
21290 2a 20 49 66 20 6e 6f 74 20 69 6e 20 52 42 55 5f  * If not in RBU_
212a0 53 54 41 47 45 5f 4f 41 4c 2c 20 61 6c 6c 6f 77  STAGE_OAL, allow
212b0 20 74 68 69 73 20 63 61 6c 6c 20 74 6f 20 70 61   this call to pa
212c0 73 73 20 74 68 72 6f 75 67 68 2e 20 4f 72 2c 20  ss through. Or, 
212d0 69 66 20 74 68 69 73 0a 20 20 2a 2a 20 72 62 75  if this.  ** rbu
212e0 20 69 73 20 69 6e 20 74 68 65 20 52 42 55 5f 53   is in the RBU_S
212f0 54 41 47 45 5f 4f 41 4c 20 73 74 61 74 65 2c 20  TAGE_OAL state, 
21300 75 73 65 20 68 65 61 70 20 6d 65 6d 6f 72 79 20  use heap memory 
21310 66 6f 72 20 2a 2d 73 68 6d 20 73 70 61 63 65 20  for *-shm space 
21320 0a 20 20 2a 2a 20 69 6e 73 74 65 61 64 20 6f 66  .  ** instead of
21330 20 61 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e   a file on disk.
21340 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
21350 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20 28 53  ->openFlags & (S
21360 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
21370 44 42 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54  DB|SQLITE_OPEN_T
21380 45 4d 50 5f 44 42 29 20 29 3b 0a 20 20 69 66 28  EMP_DB) );.  if(
21390 20 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41   eStage==RBU_STA
213a0 47 45 5f 4f 41 4c 20 7c 7c 20 65 53 74 61 67 65  GE_OAL || eStage
213b0 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4d 4f 56 45  ==RBU_STAGE_MOVE
213c0 20 29 7b 0a 20 20 20 20 69 66 28 20 69 52 65 67   ){.    if( iReg
213d0 69 6f 6e 3c 3d 70 2d 3e 6e 53 68 6d 20 29 7b 0a  ion<=p->nShm ){.
213e0 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20        int nByte 
213f0 3d 20 28 69 52 65 67 69 6f 6e 2b 31 29 20 2a 20  = (iRegion+1) * 
21400 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 3b 0a 20  sizeof(char*);. 
21410 20 20 20 20 20 63 68 61 72 20 2a 2a 61 70 4e 65       char **apNe
21420 77 20 3d 20 28 63 68 61 72 2a 2a 29 73 71 6c 69  w = (char**)sqli
21430 74 65 33 5f 72 65 61 6c 6c 6f 63 36 34 28 70 2d  te3_realloc64(p-
21440 3e 61 70 53 68 6d 2c 20 6e 42 79 74 65 29 3b 0a  >apShm, nByte);.
21450 20 20 20 20 20 20 69 66 28 20 61 70 4e 65 77 3d        if( apNew=
21460 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
21470 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
21480 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
21490 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 61 70        memset(&ap
214a0 4e 65 77 5b 70 2d 3e 6e 53 68 6d 5d 2c 20 30 2c  New[p->nShm], 0,
214b0 20 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 20 2a   sizeof(char*) *
214c0 20 28 31 20 2b 20 69 52 65 67 69 6f 6e 20 2d 20   (1 + iRegion - 
214d0 70 2d 3e 6e 53 68 6d 29 29 3b 0a 20 20 20 20 20  p->nShm));.     
214e0 20 20 20 70 2d 3e 61 70 53 68 6d 20 3d 20 61 70     p->apShm = ap
214f0 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  New;.        p->
21500 6e 53 68 6d 20 3d 20 69 52 65 67 69 6f 6e 2b 31  nShm = iRegion+1
21510 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
21520 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
21530 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 61 70 53  ITE_OK && p->apS
21540 68 6d 5b 69 52 65 67 69 6f 6e 5d 3d 3d 30 20 29  hm[iRegion]==0 )
21550 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70 4e  {.      char *pN
21560 65 77 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69  ew = (char*)sqli
21570 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 73 7a 52  te3_malloc64(szR
21580 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 69 66  egion);.      if
21590 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( pNew==0 ){.   
215a0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
215b0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65  _NOMEM;.      }e
215c0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  lse{.        mem
215d0 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 7a 52  set(pNew, 0, szR
215e0 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20 20  egion);.        
215f0 70 2d 3e 61 70 53 68 6d 5b 69 52 65 67 69 6f 6e  p->apShm[iRegion
21600 5d 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20  ] = pNew;.      
21610 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  }.    }..    if(
21620 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
21630 7b 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 70 2d  {.      *pp = p-
21640 3e 61 70 53 68 6d 5b 69 52 65 67 69 6f 6e 5d 3b  >apShm[iRegion];
21650 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
21660 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20 20 20 7d    *pp = 0;.    }
21670 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
21680 73 65 72 74 28 20 70 2d 3e 61 70 53 68 6d 3d 3d  sert( p->apShm==
21690 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 2d  0 );.    rc = p-
216a0 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73  >pReal->pMethods
216b0 2d 3e 78 53 68 6d 4d 61 70 28 70 2d 3e 70 52 65  ->xShmMap(p->pRe
216c0 61 6c 2c 20 69 52 65 67 69 6f 6e 2c 20 73 7a 52  al, iRegion, szR
216d0 65 67 69 6f 6e 2c 20 69 73 57 72 69 74 65 2c 20  egion, isWrite, 
216e0 70 70 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  pp);.  }..  retu
216f0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
21700 4d 65 6d 6f 72 79 20 62 61 72 72 69 65 72 2e 0a  Memory barrier..
21710 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
21720 62 75 56 66 73 53 68 6d 42 61 72 72 69 65 72 28  buVfsShmBarrier(
21730 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
21740 69 6c 65 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65  ile){.  rbu_file
21750 20 2a 70 20 3d 20 28 72 62 75 5f 66 69 6c 65 20   *p = (rbu_file 
21760 2a 29 70 46 69 6c 65 3b 0a 20 20 70 2d 3e 70 52  *)pFile;.  p->pR
21770 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78  eal->pMethods->x
21780 53 68 6d 42 61 72 72 69 65 72 28 70 2d 3e 70 52  ShmBarrier(p->pR
21790 65 61 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  eal);.}../*.** T
217a0 68 65 20 78 53 68 6d 55 6e 6d 61 70 20 6d 65 74  he xShmUnmap met
217b0 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  hod..*/.static i
217c0 6e 74 20 72 62 75 56 66 73 53 68 6d 55 6e 6d 61  nt rbuVfsShmUnma
217d0 70 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  p(sqlite3_file *
217e0 70 46 69 6c 65 2c 20 69 6e 74 20 64 65 6c 46 6c  pFile, int delFl
217f0 61 67 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20  ag){.  rbu_file 
21800 2a 70 20 3d 20 28 72 62 75 5f 66 69 6c 65 2a 29  *p = (rbu_file*)
21810 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20 72 63 20  pFile;.  int rc 
21820 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
21830 6e 74 20 65 53 74 61 67 65 20 3d 20 28 70 2d 3e  nt eStage = (p->
21840 70 52 62 75 20 3f 20 70 2d 3e 70 52 62 75 2d 3e  pRbu ? p->pRbu->
21850 65 53 74 61 67 65 20 3a 20 30 29 3b 0a 0a 20 20  eStage : 0);..  
21860 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 65 6e 46  assert( p->openF
21870 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f 4f  lags & (SQLITE_O
21880 50 45 4e 5f 4d 41 49 4e 5f 44 42 7c 53 51 4c 49  PEN_MAIN_DB|SQLI
21890 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 29  TE_OPEN_TEMP_DB)
218a0 20 29 3b 0a 20 20 69 66 28 20 65 53 74 61 67 65   );.  if( eStage
218b0 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20  ==RBU_STAGE_OAL 
218c0 7c 7c 20 65 53 74 61 67 65 3d 3d 52 42 55 5f 53  || eStage==RBU_S
218d0 54 41 47 45 5f 4d 4f 56 45 20 29 7b 0a 20 20 20  TAGE_MOVE ){.   
218e0 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 7d   /* no-op */.  }
218f0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 52 65 6c  else{.    /* Rel
21900 65 61 73 65 20 74 68 65 20 63 68 65 63 6b 70 6f  ease the checkpo
21910 69 6e 74 65 72 20 61 6e 64 20 77 72 69 74 65 72  inter and writer
21920 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 72 62   locks */.    rb
21930 75 55 6e 6c 6f 63 6b 53 68 6d 28 70 29 3b 0a 20  uUnlockShm(p);. 
21940 20 20 20 72 63 20 3d 20 70 2d 3e 70 52 65 61 6c     rc = p->pReal
21950 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53 68 6d  ->pMethods->xShm
21960 55 6e 6d 61 70 28 70 2d 3e 70 52 65 61 6c 2c 20  Unmap(p->pReal, 
21970 64 65 6c 46 6c 61 67 29 3b 0a 20 20 7d 0a 20 20  delFlag);.  }.  
21980 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
21990 0a 2a 2a 20 47 69 76 65 6e 20 74 68 61 74 20 7a  .** Given that z
219a0 57 61 6c 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  Wal points to a 
219b0 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
219c0 67 20 61 20 77 61 6c 20 66 69 6c 65 20 6e 61 6d  g a wal file nam
219d0 65 20 70 61 73 73 65 64 20 74 6f 20 0a 2a 2a 20  e passed to .** 
219e0 65 69 74 68 65 72 20 74 68 65 20 78 4f 70 65 6e  either the xOpen
219f0 28 29 20 6f 72 20 78 41 63 63 65 73 73 28 29 20  () or xAccess() 
21a00 56 46 53 20 6d 65 74 68 6f 64 2c 20 72 65 74 75  VFS method, retu
21a10 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
21a20 74 68 65 0a 2a 2a 20 66 69 6c 65 2d 68 61 6e 64  the.** file-hand
21a30 6c 65 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65  le opened by the
21a40 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 63   same database c
21a50 6f 6e 6e 65 63 74 69 6f 6e 20 6f 6e 20 74 68 65  onnection on the
21a60 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a   corresponding.*
21a70 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  * database file.
21a80 0a 2a 2f 0a 73 74 61 74 69 63 20 72 62 75 5f 66  .*/.static rbu_f
21a90 69 6c 65 20 2a 72 62 75 46 69 6e 64 4d 61 69 6e  ile *rbuFindMain
21aa0 64 62 28 72 62 75 5f 76 66 73 20 2a 70 52 62 75  db(rbu_vfs *pRbu
21ab0 56 66 73 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  Vfs, const char 
21ac0 2a 7a 57 61 6c 29 7b 0a 20 20 72 62 75 5f 66 69  *zWal){.  rbu_fi
21ad0 6c 65 20 2a 70 44 62 3b 0a 20 20 73 71 6c 69 74  le *pDb;.  sqlit
21ae0 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
21af0 52 62 75 56 66 73 2d 3e 6d 75 74 65 78 29 3b 0a  RbuVfs->mutex);.
21b00 20 20 66 6f 72 28 70 44 62 3d 70 52 62 75 56 66    for(pDb=pRbuVf
21b10 73 2d 3e 70 4d 61 69 6e 3b 20 70 44 62 20 26 26  s->pMain; pDb &&
21b20 20 70 44 62 2d 3e 7a 57 61 6c 21 3d 7a 57 61 6c   pDb->zWal!=zWal
21b30 3b 20 70 44 62 3d 70 44 62 2d 3e 70 4d 61 69 6e  ; pDb=pDb->pMain
21b40 4e 65 78 74 29 7b 7d 0a 20 20 73 71 6c 69 74 65  Next){}.  sqlite
21b50 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 52  3_mutex_leave(pR
21b60 62 75 56 66 73 2d 3e 6d 75 74 65 78 29 3b 0a 20  buVfs->mutex);. 
21b70 20 72 65 74 75 72 6e 20 70 44 62 3b 0a 7d 0a 0a   return pDb;.}..
21b80 2f 2a 20 0a 2a 2a 20 41 20 6d 61 69 6e 20 64 61  /* .** A main da
21b90 74 61 62 61 73 65 20 6e 61 6d 65 64 20 7a 4e 61  tabase named zNa
21ba0 6d 65 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  me has just been
21bb0 20 6f 70 65 6e 65 64 2e 20 54 68 65 20 66 6f 6c   opened. The fol
21bc0 6c 6f 77 69 6e 67 20 0a 2a 2a 20 66 75 6e 63 74  lowing .** funct
21bd0 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 70 6f  ion returns a po
21be0 69 6e 74 65 72 20 74 6f 20 61 20 62 75 66 66 65  inter to a buffe
21bf0 72 20 6f 77 6e 65 64 20 62 79 20 53 51 4c 69 74  r owned by SQLit
21c00 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a  e that contains.
21c10 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  ** the name of t
21c20 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 74 68  he *-wal file th
21c30 69 73 20 64 62 20 63 6f 6e 6e 65 63 74 69 6f 6e  is db connection
21c40 20 77 69 6c 6c 20 75 73 65 2e 20 53 51 4c 69 74   will use. SQLit
21c50 65 0a 2a 2a 20 68 61 70 70 65 6e 73 20 74 6f 20  e.** happens to 
21c60 70 61 73 73 20 61 20 70 6f 69 6e 74 65 72 20 74  pass a pointer t
21c70 6f 20 74 68 69 73 20 62 75 66 66 65 72 20 77 68  o this buffer wh
21c80 65 6e 20 75 73 69 6e 67 20 78 41 63 63 65 73 73  en using xAccess
21c90 28 29 0a 2a 2a 20 6f 72 20 78 4f 70 65 6e 28 29  ().** or xOpen()
21ca0 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74   to operate on t
21cb0 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 2e 20 20  he *-wal file.  
21cc0 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
21cd0 20 63 68 61 72 20 2a 72 62 75 4d 61 69 6e 54 6f   char *rbuMainTo
21ce0 57 61 6c 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  Wal(const char *
21cf0 7a 4e 61 6d 65 2c 20 69 6e 74 20 66 6c 61 67 73  zName, int flags
21d00 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 28 69 6e  ){.  int n = (in
21d10 74 29 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b  t)strlen(zName);
21d20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
21d30 20 3d 20 26 7a 4e 61 6d 65 5b 6e 5d 3b 0a 20 20   = &zName[n];.  
21d40 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49  if( flags & SQLI
21d50 54 45 5f 4f 50 45 4e 5f 55 52 49 20 29 7b 0a 20  TE_OPEN_URI ){. 
21d60 20 20 20 69 6e 74 20 6f 64 64 20 3d 20 30 3b 0a     int odd = 0;.
21d70 20 20 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a      while( 1 ){.
21d80 20 20 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d        if( z[0]==
21d90 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 64 64  0 ){.        odd
21da0 20 3d 20 31 20 2d 20 6f 64 64 3b 0a 20 20 20 20   = 1 - odd;.    
21db0 20 20 20 20 69 66 28 20 6f 64 64 20 26 26 20 7a      if( odd && z
21dc0 5b 31 5d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  [1]==0 ) break;.
21dd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 2b        }.      z+
21de0 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 20 2b  +;.    }.    z +
21df0 3d 20 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 2;.  }else{.  
21e00 20 20 77 68 69 6c 65 28 20 2a 7a 3d 3d 30 20 29    while( *z==0 )
21e10 20 7a 2b 2b 3b 0a 20 20 7d 0a 20 20 7a 20 2b 3d   z++;.  }.  z +=
21e20 20 28 6e 20 2b 20 38 20 2b 20 31 29 3b 0a 20 20   (n + 8 + 1);.  
21e30 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 0a  return z;.}../*.
21e40 2a 2a 20 4f 70 65 6e 20 61 6e 20 72 62 75 20 66  ** Open an rbu f
21e50 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73  ile handle..*/.s
21e60 74 61 74 69 63 20 69 6e 74 20 72 62 75 56 66 73  tatic int rbuVfs
21e70 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f  Open(.  sqlite3_
21e80 76 66 73 20 2a 70 56 66 73 2c 0a 20 20 63 6f 6e  vfs *pVfs,.  con
21e90 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a  st char *zName,.
21ea0 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
21eb0 70 46 69 6c 65 2c 0a 20 20 69 6e 74 20 66 6c 61  pFile,.  int fla
21ec0 67 73 2c 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46  gs,.  int *pOutF
21ed0 6c 61 67 73 0a 29 7b 0a 20 20 73 74 61 74 69 63  lags.){.  static
21ee0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
21ef0 6f 64 73 20 72 62 75 76 66 73 5f 69 6f 5f 6d 65  ods rbuvfs_io_me
21f00 74 68 6f 64 73 20 3d 20 7b 0a 20 20 20 20 32 2c  thods = {.    2,
21f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69              /* i
21f30 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 72  Version */.    r
21f40 62 75 56 66 73 43 6c 6f 73 65 2c 20 20 20 20 20  buVfsClose,     
21f50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21f60 78 43 6c 6f 73 65 20 2a 2f 0a 20 20 20 20 72 62  xClose */.    rb
21f70 75 56 66 73 52 65 61 64 2c 20 20 20 20 20 20 20  uVfsRead,       
21f80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
21f90 52 65 61 64 20 2a 2f 0a 20 20 20 20 72 62 75 56  Read */.    rbuV
21fa0 66 73 57 72 69 74 65 2c 20 20 20 20 20 20 20 20  fsWrite,        
21fb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 57 72            /* xWr
21fc0 69 74 65 20 2a 2f 0a 20 20 20 20 72 62 75 56 66  ite */.    rbuVf
21fd0 73 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20 20  sTruncate,      
21fe0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 54 72 75           /* xTru
21ff0 6e 63 61 74 65 20 2a 2f 0a 20 20 20 20 72 62 75  ncate */.    rbu
22000 56 66 73 53 79 6e 63 2c 20 20 20 20 20 20 20 20  VfsSync,        
22010 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
22020 79 6e 63 20 2a 2f 0a 20 20 20 20 72 62 75 56 66  ync */.    rbuVf
22030 73 46 69 6c 65 53 69 7a 65 2c 20 20 20 20 20 20  sFileSize,      
22040 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c           /* xFil
22050 65 53 69 7a 65 20 2a 2f 0a 20 20 20 20 72 62 75  eSize */.    rbu
22060 56 66 73 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  VfsLock,        
22070 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
22080 6f 63 6b 20 2a 2f 0a 20 20 20 20 72 62 75 56 66  ock */.    rbuVf
22090 73 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20  sUnlock,        
220a0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c           /* xUnl
220b0 6f 63 6b 20 2a 2f 0a 20 20 20 20 72 62 75 56 66  ock */.    rbuVf
220c0 73 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  sCheckReservedLo
220d0 63 6b 2c 20 20 20 20 20 20 2f 2a 20 78 43 68 65  ck,      /* xChe
220e0 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 2a  ckReservedLock *
220f0 2f 0a 20 20 20 20 72 62 75 56 66 73 46 69 6c 65  /.    rbuVfsFile
22100 43 6f 6e 74 72 6f 6c 2c 20 20 20 20 20 20 20 20  Control,        
22110 20 20 20 20 2f 2a 20 78 46 69 6c 65 43 6f 6e 74      /* xFileCont
22120 72 6f 6c 20 2a 2f 0a 20 20 20 20 72 62 75 56 66  rol */.    rbuVf
22130 73 53 65 63 74 6f 72 53 69 7a 65 2c 20 20 20 20  sSectorSize,    
22140 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 65 63           /* xSec
22150 74 6f 72 53 69 7a 65 20 2a 2f 0a 20 20 20 20 72  torSize */.    r
22160 62 75 56 66 73 44 65 76 69 63 65 43 68 61 72 61  buVfsDeviceChara
22170 63 74 65 72 69 73 74 69 63 73 2c 20 20 2f 2a 20  cteristics,  /* 
22180 78 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  xDeviceCharacter
22190 69 73 74 69 63 73 20 2a 2f 0a 20 20 20 20 72 62  istics */.    rb
221a0 75 56 66 73 53 68 6d 4d 61 70 2c 20 20 20 20 20  uVfsShmMap,     
221b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
221c0 53 68 6d 4d 61 70 20 2a 2f 0a 20 20 20 20 72 62  ShmMap */.    rb
221d0 75 56 66 73 53 68 6d 4c 6f 63 6b 2c 20 20 20 20  uVfsShmLock,    
221e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
221f0 53 68 6d 4c 6f 63 6b 20 2a 2f 0a 20 20 20 20 72  ShmLock */.    r
22200 62 75 56 66 73 53 68 6d 42 61 72 72 69 65 72 2c  buVfsShmBarrier,
22210 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22220 78 53 68 6d 42 61 72 72 69 65 72 20 2a 2f 0a 20  xShmBarrier */. 
22230 20 20 20 72 62 75 56 66 73 53 68 6d 55 6e 6d 61     rbuVfsShmUnma
22240 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
22250 20 2f 2a 20 78 53 68 6d 55 6e 6d 61 70 20 2a 2f   /* xShmUnmap */
22260 0a 20 20 20 20 30 2c 20 30 20 20 20 20 20 20 20  .    0, 0       
22270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22280 20 20 20 2f 2a 20 78 46 65 74 63 68 2c 20 78 55     /* xFetch, xU
22290 6e 66 65 74 63 68 20 2a 2f 0a 20 20 7d 3b 0a 20  nfetch */.  };. 
222a0 20 72 62 75 5f 76 66 73 20 2a 70 52 62 75 56 66   rbu_vfs *pRbuVf
222b0 73 20 3d 20 28 72 62 75 5f 76 66 73 2a 29 70 56  s = (rbu_vfs*)pV
222c0 66 73 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  fs;.  sqlite3_vf
222d0 73 20 2a 70 52 65 61 6c 56 66 73 20 3d 20 70 52  s *pRealVfs = pR
222e0 62 75 56 66 73 2d 3e 70 52 65 61 6c 56 66 73 3b  buVfs->pRealVfs;
222f0 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 46 64  .  rbu_file *pFd
22300 20 3d 20 28 72 62 75 5f 66 69 6c 65 20 2a 29 70   = (rbu_file *)p
22310 46 69 6c 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d  File;.  int rc =
22320 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63 6f   SQLITE_OK;.  co
22330 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 65 6e 20  nst char *zOpen 
22340 3d 20 7a 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 6f  = zName;.  int o
22350 66 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 0a  flags = flags;..
22360 20 20 6d 65 6d 73 65 74 28 70 46 64 2c 20 30 2c    memset(pFd, 0,
22370 20 73 69 7a 65 6f 66 28 72 62 75 5f 66 69 6c 65   sizeof(rbu_file
22380 29 29 3b 0a 20 20 70 46 64 2d 3e 70 52 65 61 6c  ));.  pFd->pReal
22390 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65   = (sqlite3_file
223a0 2a 29 26 70 46 64 5b 31 5d 3b 0a 20 20 70 46 64  *)&pFd[1];.  pFd
223b0 2d 3e 70 52 62 75 56 66 73 20 3d 20 70 52 62 75  ->pRbuVfs = pRbu
223c0 56 66 73 3b 0a 20 20 70 46 64 2d 3e 6f 70 65 6e  Vfs;.  pFd->open
223d0 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20  Flags = flags;. 
223e0 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20   if( zName ){.  
223f0 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51    if( flags & SQ
22400 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
22410 42 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20  B ){.      /* A 
22420 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 68 61  main database ha
22430 73 20 6a 75 73 74 20 62 65 65 6e 20 6f 70 65 6e  s just been open
22440 65 64 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  ed. The followin
22450 67 20 62 6c 6f 63 6b 20 73 65 74 73 0a 20 20 20  g block sets.   
22460 20 20 20 2a 2a 20 28 70 46 64 2d 3e 7a 57 61 6c     ** (pFd->zWal
22470 29 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20  ) to point to a 
22480 62 75 66 66 65 72 20 6f 77 6e 65 64 20 62 79 20  buffer owned by 
22490 53 51 4c 69 74 65 20 74 68 61 74 20 63 6f 6e 74  SQLite that cont
224a0 61 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20 74 68  ains.      ** th
224b0 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 2a 2d  e name of the *-
224c0 77 61 6c 20 66 69 6c 65 20 74 68 69 73 20 64 62  wal file this db
224d0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 6c 6c   connection will
224e0 20 75 73 65 2e 20 53 51 4c 69 74 65 0a 20 20 20   use. SQLite.   
224f0 20 20 20 2a 2a 20 68 61 70 70 65 6e 73 20 74 6f     ** happens to
22500 20 70 61 73 73 20 61 20 70 6f 69 6e 74 65 72 20   pass a pointer 
22510 74 6f 20 74 68 69 73 20 62 75 66 66 65 72 20 77  to this buffer w
22520 68 65 6e 20 75 73 69 6e 67 20 78 41 63 63 65 73  hen using xAcces
22530 73 28 29 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20  s().      ** or 
22540 78 4f 70 65 6e 28 29 20 74 6f 20 6f 70 65 72 61  xOpen() to opera
22550 74 65 20 6f 6e 20 74 68 65 20 2a 2d 77 61 6c 20  te on the *-wal 
22560 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20  file.  */.      
22570 70 46 64 2d 3e 7a 57 61 6c 20 3d 20 72 62 75 4d  pFd->zWal = rbuM
22580 61 69 6e 54 6f 57 61 6c 28 7a 4e 61 6d 65 2c 20  ainToWal(zName, 
22590 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20  flags);.    }.  
225a0 20 20 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73    else if( flags
225b0 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57   & SQLITE_OPEN_W
225c0 41 4c 20 29 7b 0a 20 20 20 20 20 20 72 62 75 5f  AL ){.      rbu_
225d0 66 69 6c 65 20 2a 70 44 62 20 3d 20 72 62 75 46  file *pDb = rbuF
225e0 69 6e 64 4d 61 69 6e 64 62 28 70 52 62 75 56 66  indMaindb(pRbuVf
225f0 73 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  s, zName);.     
22600 20 69 66 28 20 70 44 62 20 29 7b 0a 20 20 20 20   if( pDb ){.    
22610 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 52 62      if( pDb->pRb
22620 75 20 26 26 20 70 44 62 2d 3e 70 52 62 75 2d 3e  u && pDb->pRbu->
22630 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47  eStage==RBU_STAG
22640 45 5f 4f 41 4c 20 29 7b 0a 20 20 20 20 20 20 20  E_OAL ){.       
22650 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20     /* This call 
22660 69 73 20 74 6f 20 6f 70 65 6e 20 61 20 2a 2d 77  is to open a *-w
22670 61 6c 20 66 69 6c 65 2e 20 49 6e 74 65 61 64 2c  al file. Intead,
22680 20 6f 70 65 6e 20 74 68 65 20 2a 2d 6f 61 6c 2e   open the *-oal.
22690 20 54 68 69 73 0a 20 20 20 20 20 20 20 20 20 20   This.          
226a0 2a 2a 20 63 6f 64 65 20 65 6e 73 75 72 65 73 20  ** code ensures 
226b0 74 68 61 74 20 74 68 65 20 73 74 72 69 6e 67 20  that the string 
226c0 70 61 73 73 65 64 20 74 6f 20 78 4f 70 65 6e 28  passed to xOpen(
226d0 29 20 69 73 20 74 65 72 6d 69 6e 61 74 65 64 20  ) is terminated 
226e0 62 79 20 61 0a 20 20 20 20 20 20 20 20 20 20 2a  by a.          *
226f0 2a 20 70 61 69 72 20 6f 66 20 27 5c 30 27 20 62  * pair of '\0' b
22700 79 74 65 73 20 69 6e 20 63 61 73 65 20 74 68 65  ytes in case the
22710 20 56 46 53 20 61 74 74 65 6d 70 74 73 20 74 6f   VFS attempts to
22720 20 65 78 74 72 61 63 74 20 61 20 55 52 49 20 0a   extract a URI .
22730 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61 72            ** par
22740 61 6d 65 74 65 72 20 66 72 6f 6d 20 69 74 2e 20  ameter from it. 
22750 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 63 6f   */.          co
22760 6e 73 74 20 63 68 61 72 20 2a 7a 42 61 73 65 20  nst char *zBase 
22770 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  = zName;.       
22780 20 20 20 73 69 7a 65 5f 74 20 6e 43 6f 70 79 3b     size_t nCopy;
22790 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20  .          char 
227a0 2a 7a 43 6f 70 79 3b 0a 20 20 20 20 20 20 20 20  *zCopy;.        
227b0 20 20 69 66 28 20 72 62 75 49 73 56 61 63 75 75    if( rbuIsVacuu
227c0 6d 28 70 44 62 2d 3e 70 52 62 75 29 20 29 7b 0a  m(pDb->pRbu) ){.
227d0 20 20 20 20 20 20 20 20 20 20 20 20 7a 42 61 73              zBas
227e0 65 20 3d 20 73 71 6c 69 74 65 33 5f 64 62 5f 66  e = sqlite3_db_f
227f0 69 6c 65 6e 61 6d 65 28 70 44 62 2d 3e 70 52 62  ilename(pDb->pRb
22800 75 2d 3e 64 62 52 62 75 2c 20 22 6d 61 69 6e 22  u->dbRbu, "main"
22810 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  );.            z
22820 42 61 73 65 20 3d 20 72 62 75 4d 61 69 6e 54 6f  Base = rbuMainTo
22830 57 61 6c 28 7a 42 61 73 65 2c 20 53 51 4c 49 54  Wal(zBase, SQLIT
22840 45 5f 4f 50 45 4e 5f 55 52 49 29 3b 0a 20 20 20  E_OPEN_URI);.   
22850 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
22860 20 20 20 6e 43 6f 70 79 20 3d 20 73 74 72 6c 65     nCopy = strle
22870 6e 28 7a 42 61 73 65 29 3b 0a 20 20 20 20 20 20  n(zBase);.      
22880 20 20 20 20 7a 43 6f 70 79 20 3d 20 73 71 6c 69      zCopy = sqli
22890 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 43 6f  te3_malloc64(nCo
228a0 70 79 2b 32 29 3b 0a 20 20 20 20 20 20 20 20 20  py+2);.         
228b0 20 69 66 28 20 7a 43 6f 70 79 20 29 7b 0a 20 20   if( zCopy ){.  
228c0 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
228d0 28 7a 43 6f 70 79 2c 20 7a 42 61 73 65 2c 20 6e  (zCopy, zBase, n
228e0 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 20 20 20  Copy);.         
228f0 20 20 20 7a 43 6f 70 79 5b 6e 43 6f 70 79 2d 33     zCopy[nCopy-3
22900 5d 20 3d 20 27 6f 27 3b 0a 20 20 20 20 20 20 20  ] = 'o';.       
22910 20 20 20 20 20 7a 43 6f 70 79 5b 6e 43 6f 70 79       zCopy[nCopy
22920 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20  ] = '\0';.      
22930 20 20 20 20 20 20 7a 43 6f 70 79 5b 6e 43 6f 70        zCopy[nCop
22940 79 2b 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20  y+1] = '\0';.   
22950 20 20 20 20 20 20 20 20 20 7a 4f 70 65 6e 20 3d           zOpen =
22960 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 28 70   (const char*)(p
22970 46 64 2d 3e 7a 44 65 6c 20 3d 20 7a 43 6f 70 79  Fd->zDel = zCopy
22980 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
22990 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
229a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
229b0 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  M;.          }. 
229c0 20 20 20 20 20 20 20 20 20 70 46 64 2d 3e 70 52           pFd->pR
229d0 62 75 20 3d 20 70 44 62 2d 3e 70 52 62 75 3b 0a  bu = pDb->pRbu;.
229e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
229f0 20 20 70 44 62 2d 3e 70 57 61 6c 46 64 20 3d 20    pDb->pWalFd = 
22a00 70 46 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  pFd;.      }.   
22a10 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6f 66   }.  }..  if( of
22a20 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
22a30 45 4e 5f 4d 41 49 4e 5f 44 42 20 0a 20 20 20 26  EN_MAIN_DB .   &
22a40 26 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f  & sqlite3_uri_bo
22a50 6f 6c 65 61 6e 28 7a 4e 61 6d 65 2c 20 22 72 62  olean(zName, "rb
22a60 75 5f 6d 65 6d 6f 72 79 22 2c 20 30 29 20 0a 20  u_memory", 0) . 
22a70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
22a80 6f 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  oflags & SQLITE_
22a90 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 3b 0a  OPEN_MAIN_DB );.
22aa0 20 20 20 20 6f 66 6c 61 67 73 20 3d 20 20 53 51      oflags =  SQ
22ab0 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44  LITE_OPEN_TEMP_D
22ac0 42 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  B | SQLITE_OPEN_
22ad0 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49  READWRITE | SQLI
22ae0 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c  TE_OPEN_CREATE |
22af0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53  .              S
22b00 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
22b10 53 49 56 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  SIVE | SQLITE_OP
22b20 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  EN_DELETEONCLOSE
22b30 3b 0a 20 20 20 20 7a 4f 70 65 6e 20 3d 20 30 3b  ;.    zOpen = 0;
22b40 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
22b50 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
22b60 20 72 63 20 3d 20 70 52 65 61 6c 56 66 73 2d 3e   rc = pRealVfs->
22b70 78 4f 70 65 6e 28 70 52 65 61 6c 56 66 73 2c 20  xOpen(pRealVfs, 
22b80 7a 4f 70 65 6e 2c 20 70 46 64 2d 3e 70 52 65 61  zOpen, pFd->pRea
22b90 6c 2c 20 6f 66 6c 61 67 73 2c 20 70 4f 75 74 46  l, oflags, pOutF
22ba0 6c 61 67 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28  lags);.  }.  if(
22bb0 20 70 46 64 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65   pFd->pReal->pMe
22bc0 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20  thods ){.    /* 
22bd0 54 68 65 20 78 4f 70 65 6e 28 29 20 6f 70 65 72  The xOpen() oper
22be0 61 74 69 6f 6e 20 68 61 73 20 73 75 63 63 65 65  ation has succee
22bf0 64 65 64 2e 20 53 65 74 20 74 68 65 20 73 71 6c  ded. Set the sql
22c00 69 74 65 33 5f 66 69 6c 65 2e 70 4d 65 74 68 6f  ite3_file.pMetho
22c10 64 73 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65  ds.    ** pointe
22c20 72 20 61 6e 64 2c 20 69 66 20 74 68 65 20 66 69  r and, if the fi
22c30 6c 65 20 69 73 20 61 20 6d 61 69 6e 20 64 61 74  le is a main dat
22c40 61 62 61 73 65 20 66 69 6c 65 2c 20 6c 69 6e 6b  abase file, link
22c50 20 69 74 20 69 6e 74 6f 20 74 68 65 0a 20 20 20   it into the.   
22c60 20 2a 2a 20 6d 75 74 65 78 20 70 72 6f 74 65 63   ** mutex protec
22c70 74 65 64 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  ted linked list 
22c80 6f 66 20 61 6c 6c 20 73 75 63 68 20 66 69 6c 65  of all such file
22c90 73 2e 20 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65  s.  */.    pFile
22ca0 2d 3e 70 4d 65 74 68 6f 64 73 20 3d 20 26 72 62  ->pMethods = &rb
22cb0 75 76 66 73 5f 69 6f 5f 6d 65 74 68 6f 64 73 3b  uvfs_io_methods;
22cc0 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73 20 26  .    if( flags &
22cd0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49   SQLITE_OPEN_MAI
22ce0 4e 5f 44 42 20 29 7b 0a 20 20 20 20 20 20 73 71  N_DB ){.      sq
22cf0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
22d00 72 28 70 52 62 75 56 66 73 2d 3e 6d 75 74 65 78  r(pRbuVfs->mutex
22d10 29 3b 0a 20 20 20 20 20 20 70 46 64 2d 3e 70 4d  );.      pFd->pM
22d20 61 69 6e 4e 65 78 74 20 3d 20 70 52 62 75 56 66  ainNext = pRbuVf
22d30 73 2d 3e 70 4d 61 69 6e 3b 0a 20 20 20 20 20 20  s->pMain;.      
22d40 70 52 62 75 56 66 73 2d 3e 70 4d 61 69 6e 20 3d  pRbuVfs->pMain =
22d50 20 70 46 64 3b 0a 20 20 20 20 20 20 73 71 6c 69   pFd;.      sqli
22d60 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
22d70 70 52 62 75 56 66 73 2d 3e 6d 75 74 65 78 29 3b  pRbuVfs->mutex);
22d80 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
22d90 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
22da0 28 70 46 64 2d 3e 7a 44 65 6c 29 3b 0a 20 20 7d  (pFd->zDel);.  }
22db0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
22dc0 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74  ../*.** Delete t
22dd0 68 65 20 66 69 6c 65 20 6c 6f 63 61 74 65 64 20  he file located 
22de0 61 74 20 7a 50 61 74 68 2e 0a 2a 2f 0a 73 74 61  at zPath..*/.sta
22df0 74 69 63 20 69 6e 74 20 72 62 75 56 66 73 44 65  tic int rbuVfsDe
22e00 6c 65 74 65 28 73 71 6c 69 74 65 33 5f 76 66 73  lete(sqlite3_vfs
22e10 20 2a 70 56 66 73 2c 20 63 6f 6e 73 74 20 63 68   *pVfs, const ch
22e20 61 72 20 2a 7a 50 61 74 68 2c 20 69 6e 74 20 64  ar *zPath, int d
22e30 69 72 53 79 6e 63 29 7b 0a 20 20 73 71 6c 69 74  irSync){.  sqlit
22e40 65 33 5f 76 66 73 20 2a 70 52 65 61 6c 56 66 73  e3_vfs *pRealVfs
22e50 20 3d 20 28 28 72 62 75 5f 76 66 73 2a 29 70 56   = ((rbu_vfs*)pV
22e60 66 73 29 2d 3e 70 52 65 61 6c 56 66 73 3b 0a 20  fs)->pRealVfs;. 
22e70 20 72 65 74 75 72 6e 20 70 52 65 61 6c 56 66 73   return pRealVfs
22e80 2d 3e 78 44 65 6c 65 74 65 28 70 52 65 61 6c 56  ->xDelete(pRealV
22e90 66 73 2c 20 7a 50 61 74 68 2c 20 64 69 72 53 79  fs, zPath, dirSy
22ea0 6e 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65  nc);.}../*.** Te
22eb0 73 74 20 66 6f 72 20 61 63 63 65 73 73 20 70 65  st for access pe
22ec0 72 6d 69 73 73 69 6f 6e 73 2e 20 52 65 74 75 72  rmissions. Retur
22ed0 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 72 65  n true if the re
22ee0 71 75 65 73 74 65 64 20 70 65 72 6d 69 73 73 69  quested permissi
22ef0 6f 6e 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62  on.** is availab
22f00 6c 65 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68  le, or false oth
22f10 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  erwise..*/.stati
22f20 63 20 69 6e 74 20 72 62 75 56 66 73 41 63 63 65  c int rbuVfsAcce
22f30 73 73 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  ss(.  sqlite3_vf
22f40 73 20 2a 70 56 66 73 2c 20 0a 20 20 63 6f 6e 73  s *pVfs, .  cons
22f50 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 0a  t char *zPath, .
22f60 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 0a 20 20    int flags, .  
22f70 69 6e 74 20 2a 70 52 65 73 4f 75 74 0a 29 7b 0a  int *pResOut.){.
22f80 20 20 72 62 75 5f 76 66 73 20 2a 70 52 62 75 56    rbu_vfs *pRbuV
22f90 66 73 20 3d 20 28 72 62 75 5f 76 66 73 2a 29 70  fs = (rbu_vfs*)p
22fa0 56 66 73 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76  Vfs;.  sqlite3_v
22fb0 66 73 20 2a 70 52 65 61 6c 56 66 73 20 3d 20 70  fs *pRealVfs = p
22fc0 52 62 75 56 66 73 2d 3e 70 52 65 61 6c 56 66 73  RbuVfs->pRealVfs
22fd0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72  ;.  int rc;..  r
22fe0 63 20 3d 20 70 52 65 61 6c 56 66 73 2d 3e 78 41  c = pRealVfs->xA
22ff0 63 63 65 73 73 28 70 52 65 61 6c 56 66 73 2c 20  ccess(pRealVfs, 
23000 7a 50 61 74 68 2c 20 66 6c 61 67 73 2c 20 70 52  zPath, flags, pR
23010 65 73 4f 75 74 29 3b 0a 0a 20 20 2f 2a 20 49 66  esOut);..  /* If
23020 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 74 6f   this call is to
23030 20 63 68 65 63 6b 20 69 66 20 61 20 2a 2d 77 61   check if a *-wa
23040 6c 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65  l file associate
23050 64 20 77 69 74 68 20 61 6e 20 52 42 55 20 74 61  d with an RBU ta
23060 72 67 65 74 0a 20 20 2a 2a 20 64 61 74 61 62 61  rget.  ** databa
23070 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 65 78  se connection ex
23080 69 73 74 73 2c 20 61 6e 64 20 74 68 65 20 52 42  ists, and the RB
23090 55 20 75 70 64 61 74 65 20 69 73 20 69 6e 20 52  U update is in R
230a0 42 55 5f 53 54 41 47 45 5f 4f 41 4c 2c 0a 20 20  BU_STAGE_OAL,.  
230b0 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** the following
230c0 20 73 70 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e   special handlin
230d0 67 20 69 73 20 61 63 74 69 76 61 74 65 64 3a 0a  g is activated:.
230e0 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 61 29 20 69    **.  **   a) i
230f0 66 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65  f the *-wal file
23100 20 64 6f 65 73 20 65 78 69 73 74 2c 20 72 65 74   does exist, ret
23110 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  urn SQLITE_CANTO
23120 50 45 4e 2e 20 54 68 69 73 0a 20 20 2a 2a 20 20  PEN. This.  **  
23130 20 20 20 20 65 6e 73 75 72 65 73 20 74 68 61 74      ensures that
23140 20 74 68 65 20 52 42 55 20 65 78 74 65 6e 73 69   the RBU extensi
23150 6f 6e 20 6e 65 76 65 72 20 74 72 69 65 73 20 74  on never tries t
23160 6f 20 75 70 64 61 74 65 20 61 20 64 61 74 61 62  o update a datab
23170 61 73 65 0a 20 20 2a 2a 20 20 20 20 20 20 69 6e  ase.  **      in
23180 20 77 61 6c 20 6d 6f 64 65 2c 20 65 76 65 6e 20   wal mode, even 
23190 69 66 20 74 68 65 20 66 69 72 73 74 20 70 61 67  if the first pag
231a0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
231b0 65 20 66 69 6c 65 20 68 61 73 0a 20 20 2a 2a 20  e file has.  ** 
231c0 20 20 20 20 20 62 65 65 6e 20 64 61 6d 61 67 65       been damage
231d0 64 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  d. .  **.  **   
231e0 62 29 20 69 66 20 74 68 65 20 2a 2d 77 61 6c 20  b) if the *-wal 
231f0 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78  file does not ex
23200 69 73 74 2c 20 63 6c 61 69 6d 20 74 68 61 74 20  ist, claim that 
23210 69 74 20 64 6f 65 73 20 61 6e 79 77 61 79 2c 0a  it does anyway,.
23220 20 20 2a 2a 20 20 20 20 20 20 63 61 75 73 69 6e    **      causin
23230 67 20 53 51 4c 69 74 65 20 74 6f 20 63 61 6c 6c  g SQLite to call
23240 20 78 4f 70 65 6e 28 29 20 74 6f 20 6f 70 65 6e   xOpen() to open
23250 20 69 74 2e 20 54 68 69 73 20 63 61 6c 6c 20 77   it. This call w
23260 69 6c 6c 20 61 6c 73 6f 0a 20 20 2a 2a 20 20 20  ill also.  **   
23270 20 20 20 62 65 20 69 6e 74 65 72 63 65 70 74 65     be intercepte
23280 64 20 28 73 65 65 20 74 68 65 20 72 62 75 56 66  d (see the rbuVf
23290 73 4f 70 65 6e 28 29 20 66 75 6e 63 74 69 6f 6e  sOpen() function
232a0 29 20 61 6e 64 20 74 68 65 20 2a 2d 6f 61 6c 0a  ) and the *-oal.
232b0 20 20 2a 2a 20 20 20 20 20 20 66 69 6c 65 20 6f    **      file o
232c0 70 65 6e 65 64 20 69 6e 73 74 65 61 64 2e 0a 20  pened instead.. 
232d0 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
232e0 4c 49 54 45 5f 4f 4b 20 26 26 20 66 6c 61 67 73  LITE_OK && flags
232f0 3d 3d 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  ==SQLITE_ACCESS_
23300 45 58 49 53 54 53 20 29 7b 0a 20 20 20 20 72 62  EXISTS ){.    rb
23310 75 5f 66 69 6c 65 20 2a 70 44 62 20 3d 20 72 62  u_file *pDb = rb
23320 75 46 69 6e 64 4d 61 69 6e 64 62 28 70 52 62 75  uFindMaindb(pRbu
23330 56 66 73 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20  Vfs, zPath);.   
23340 20 69 66 28 20 70 44 62 20 26 26 20 70 44 62 2d   if( pDb && pDb-
23350 3e 70 52 62 75 20 26 26 20 70 44 62 2d 3e 70 52  >pRbu && pDb->pR
23360 62 75 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f  bu->eStage==RBU_
23370 53 54 41 47 45 5f 4f 41 4c 20 29 7b 0a 20 20 20  STAGE_OAL ){.   
23380 20 20 20 69 66 28 20 2a 70 52 65 73 4f 75 74 20     if( *pResOut 
23390 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
233a0 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b  SQLITE_CANTOPEN;
233b0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
233c0 20 20 20 20 20 20 2a 70 52 65 73 4f 75 74 20 3d        *pResOut =
233d0 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
233e0 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
233f0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70  rc;.}../*.** Pop
23400 75 6c 61 74 65 20 62 75 66 66 65 72 20 7a 4f 75  ulate buffer zOu
23410 74 20 77 69 74 68 20 74 68 65 20 66 75 6c 6c 20  t with the full 
23420 63 61 6e 6f 6e 69 63 61 6c 20 70 61 74 68 6e 61  canonical pathna
23430 6d 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  me corresponding
23440 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61 74 68 6e  .** to the pathn
23450 61 6d 65 20 69 6e 20 7a 50 61 74 68 2e 20 7a 4f  ame in zPath. zO
23460 75 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  ut is guaranteed
23470 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62   to point to a b
23480 75 66 66 65 72 0a 2a 2a 20 6f 66 20 61 74 20 6c  uffer.** of at l
23490 65 61 73 74 20 28 44 45 56 53 59 4d 5f 4d 41 58  east (DEVSYM_MAX
234a0 5f 50 41 54 48 4e 41 4d 45 2b 31 29 20 62 79 74  _PATHNAME+1) byt
234b0 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es..*/.static in
234c0 74 20 72 62 75 56 66 73 46 75 6c 6c 50 61 74 68  t rbuVfsFullPath
234d0 6e 61 6d 65 28 0a 20 20 73 71 6c 69 74 65 33 5f  name(.  sqlite3_
234e0 76 66 73 20 2a 70 56 66 73 2c 20 0a 20 20 63 6f  vfs *pVfs, .  co
234f0 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c  nst char *zPath,
23500 20 0a 20 20 69 6e 74 20 6e 4f 75 74 2c 20 0a 20   .  int nOut, . 
23510 20 63 68 61 72 20 2a 7a 4f 75 74 0a 29 7b 0a 20   char *zOut.){. 
23520 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 52   sqlite3_vfs *pR
23530 65 61 6c 56 66 73 20 3d 20 28 28 72 62 75 5f 76  ealVfs = ((rbu_v
23540 66 73 2a 29 70 56 66 73 29 2d 3e 70 52 65 61 6c  fs*)pVfs)->pReal
23550 56 66 73 3b 0a 20 20 72 65 74 75 72 6e 20 70 52  Vfs;.  return pR
23560 65 61 6c 56 66 73 2d 3e 78 46 75 6c 6c 50 61 74  ealVfs->xFullPat
23570 68 6e 61 6d 65 28 70 52 65 61 6c 56 66 73 2c 20  hname(pRealVfs, 
23580 7a 50 61 74 68 2c 20 6e 4f 75 74 2c 20 7a 4f 75  zPath, nOut, zOu
23590 74 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  t);.}..#ifndef S
235a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
235b0 45 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20  EXTENSION./*.** 
235c0 4f 70 65 6e 20 74 68 65 20 64 79 6e 61 6d 69 63  Open the dynamic
235d0 20 6c 69 62 72 61 72 79 20 6c 6f 63 61 74 65 64   library located
235e0 20 61 74 20 7a 50 61 74 68 20 61 6e 64 20 72 65   at zPath and re
235f0 74 75 72 6e 20 61 20 68 61 6e 64 6c 65 2e 0a 2a  turn a handle..*
23600 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 72  /.static void *r
23610 62 75 56 66 73 44 6c 4f 70 65 6e 28 73 71 6c 69  buVfsDlOpen(sqli
23620 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 63  te3_vfs *pVfs, c
23630 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
23640 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
23650 20 2a 70 52 65 61 6c 56 66 73 20 3d 20 28 28 72   *pRealVfs = ((r
23660 62 75 5f 76 66 73 2a 29 70 56 66 73 29 2d 3e 70  bu_vfs*)pVfs)->p
23670 52 65 61 6c 56 66 73 3b 0a 20 20 72 65 74 75 72  RealVfs;.  retur
23680 6e 20 70 52 65 61 6c 56 66 73 2d 3e 78 44 6c 4f  n pRealVfs->xDlO
23690 70 65 6e 28 70 52 65 61 6c 56 66 73 2c 20 7a 50  pen(pRealVfs, zP
236a0 61 74 68 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  ath);.}../*.** P
236b0 6f 70 75 6c 61 74 65 20 74 68 65 20 62 75 66 66  opulate the buff
236c0 65 72 20 7a 45 72 72 4d 73 67 20 28 73 69 7a 65  er zErrMsg (size
236d0 20 6e 42 79 74 65 20 62 79 74 65 73 29 20 77 69   nByte bytes) wi
236e0 74 68 20 61 20 68 75 6d 61 6e 20 72 65 61 64 61  th a human reada
236f0 62 6c 65 0a 2a 2a 20 75 74 66 2d 38 20 73 74 72  ble.** utf-8 str
23700 69 6e 67 20 64 65 73 63 72 69 62 69 6e 67 20 74  ing describing t
23710 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 65  he most recent e
23720 72 72 6f 72 20 65 6e 63 6f 75 6e 74 65 72 65 64  rror encountered
23730 20 61 73 73 6f 63 69 61 74 65 64 20 0a 2a 2a 20   associated .** 
23740 77 69 74 68 20 64 79 6e 61 6d 69 63 20 6c 69 62  with dynamic lib
23750 72 61 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  raries..*/.stati
23760 63 20 76 6f 69 64 20 72 62 75 56 66 73 44 6c 45  c void rbuVfsDlE
23770 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73  rror(sqlite3_vfs
23780 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 79 74   *pVfs, int nByt
23790 65 2c 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67  e, char *zErrMsg
237a0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
237b0 20 2a 70 52 65 61 6c 56 66 73 20 3d 20 28 28 72   *pRealVfs = ((r
237c0 62 75 5f 76 66 73 2a 29 70 56 66 73 29 2d 3e 70  bu_vfs*)pVfs)->p
237d0 52 65 61 6c 56 66 73 3b 0a 20 20 70 52 65 61 6c  RealVfs;.  pReal
237e0 56 66 73 2d 3e 78 44 6c 45 72 72 6f 72 28 70 52  Vfs->xDlError(pR
237f0 65 61 6c 56 66 73 2c 20 6e 42 79 74 65 2c 20 7a  ealVfs, nByte, z
23800 45 72 72 4d 73 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ErrMsg);.}../*.*
23810 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
23820 65 72 20 74 6f 20 74 68 65 20 73 79 6d 62 6f 6c  er to the symbol
23830 20 7a 53 79 6d 62 6f 6c 20 69 6e 20 74 68 65 20   zSymbol in the 
23840 64 79 6e 61 6d 69 63 20 6c 69 62 72 61 72 79 20  dynamic library 
23850 70 48 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74  pHandle..*/.stat
23860 69 63 20 76 6f 69 64 20 28 2a 72 62 75 56 66 73  ic void (*rbuVfs
23870 44 6c 53 79 6d 28 0a 20 20 73 71 6c 69 74 65 33  DlSym(.  sqlite3
23880 5f 76 66 73 20 2a 70 56 66 73 2c 20 0a 20 20 76  _vfs *pVfs, .  v
23890 6f 69 64 20 2a 70 41 72 67 2c 20 0a 20 20 63 6f  oid *pArg, .  co
238a0 6e 73 74 20 63 68 61 72 20 2a 7a 53 79 6d 0a 29  nst char *zSym.)
238b0 29 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74  )(void){.  sqlit
238c0 65 33 5f 76 66 73 20 2a 70 52 65 61 6c 56 66 73  e3_vfs *pRealVfs
238d0 20 3d 20 28 28 72 62 75 5f 76 66 73 2a 29 70 56   = ((rbu_vfs*)pV
238e0 66 73 29 2d 3e 70 52 65 61 6c 56 66 73 3b 0a 20  fs)->pRealVfs;. 
238f0 20 72 65 74 75 72 6e 20 70 52 65 61 6c 56 66 73   return pRealVfs
23900 2d 3e 78 44 6c 53 79 6d 28 70 52 65 61 6c 56 66  ->xDlSym(pRealVf
23910 73 2c 20 70 41 72 67 2c 20 7a 53 79 6d 29 3b 0a  s, pArg, zSym);.
23920 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74  }../*.** Close t
23930 68 65 20 64 79 6e 61 6d 69 63 20 6c 69 62 72 61  he dynamic libra
23940 72 79 20 68 61 6e 64 6c 65 20 70 48 61 6e 64 6c  ry handle pHandl
23950 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
23960 64 20 72 62 75 56 66 73 44 6c 43 6c 6f 73 65 28  d rbuVfsDlClose(
23970 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
23980 73 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65  s, void *pHandle
23990 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
239a0 20 2a 70 52 65 61 6c 56 66 73 20 3d 20 28 28 72   *pRealVfs = ((r
239b0 62 75 5f 76 66 73 2a 29 70 56 66 73 29 2d 3e 70  bu_vfs*)pVfs)->p
239c0 52 65 61 6c 56 66 73 3b 0a 20 20 70 52 65 61 6c  RealVfs;.  pReal
239d0 56 66 73 2d 3e 78 44 6c 43 6c 6f 73 65 28 70 52  Vfs->xDlClose(pR
239e0 65 61 6c 56 66 73 2c 20 70 48 61 6e 64 6c 65 29  ealVfs, pHandle)
239f0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
23a00 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45  LITE_OMIT_LOAD_E
23a10 58 54 45 4e 53 49 4f 4e 20 2a 2f 0a 0a 2f 2a 0a  XTENSION */../*.
23a20 2a 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20  ** Populate the 
23a30 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74  buffer pointed t
23a40 6f 20 62 79 20 7a 42 75 66 4f 75 74 20 77 69 74  o by zBufOut wit
23a50 68 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66  h nByte bytes of
23a60 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20 64 61 74 61   .** random data
23a70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
23a80 72 62 75 56 66 73 52 61 6e 64 6f 6d 6e 65 73 73  rbuVfsRandomness
23a90 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
23aa0 66 73 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 63  fs, int nByte, c
23ab0 68 61 72 20 2a 7a 42 75 66 4f 75 74 29 7b 0a 20  har *zBufOut){. 
23ac0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 52   sqlite3_vfs *pR
23ad0 65 61 6c 56 66 73 20 3d 20 28 28 72 62 75 5f 76  ealVfs = ((rbu_v
23ae0 66 73 2a 29 70 56 66 73 29 2d 3e 70 52 65 61 6c  fs*)pVfs)->pReal
23af0 56 66 73 3b 0a 20 20 72 65 74 75 72 6e 20 70 52  Vfs;.  return pR
23b00 65 61 6c 56 66 73 2d 3e 78 52 61 6e 64 6f 6d 6e  ealVfs->xRandomn
23b10 65 73 73 28 70 52 65 61 6c 56 66 73 2c 20 6e 42  ess(pRealVfs, nB
23b20 79 74 65 2c 20 7a 42 75 66 4f 75 74 29 3b 0a 7d  yte, zBufOut);.}
23b30 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f  ../*.** Sleep fo
23b40 72 20 6e 4d 69 63 72 6f 20 6d 69 63 72 6f 73 65  r nMicro microse
23b50 63 6f 6e 64 73 2e 20 52 65 74 75 72 6e 20 74 68  conds. Return th
23b60 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 63 72  e number of micr
23b70 6f 73 65 63 6f 6e 64 73 20 0a 2a 2a 20 61 63 74  oseconds .** act
23b80 75 61 6c 6c 79 20 73 6c 65 70 74 2e 0a 2a 2f 0a  ually slept..*/.
23b90 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 56 66  static int rbuVf
23ba0 73 53 6c 65 65 70 28 73 71 6c 69 74 65 33 5f 76  sSleep(sqlite3_v
23bb0 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 4d  fs *pVfs, int nM
23bc0 69 63 72 6f 29 7b 0a 20 20 73 71 6c 69 74 65 33  icro){.  sqlite3
23bd0 5f 76 66 73 20 2a 70 52 65 61 6c 56 66 73 20 3d  _vfs *pRealVfs =
23be0 20 28 28 72 62 75 5f 76 66 73 2a 29 70 56 66 73   ((rbu_vfs*)pVfs
23bf0 29 2d 3e 70 52 65 61 6c 56 66 73 3b 0a 20 20 72  )->pRealVfs;.  r
23c00 65 74 75 72 6e 20 70 52 65 61 6c 56 66 73 2d 3e  eturn pRealVfs->
23c10 78 53 6c 65 65 70 28 70 52 65 61 6c 56 66 73 2c  xSleep(pRealVfs,
23c20 20 6e 4d 69 63 72 6f 29 3b 0a 7d 0a 0a 2f 2a 0a   nMicro);.}../*.
23c30 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75  ** Return the cu
23c40 72 72 65 6e 74 20 74 69 6d 65 20 61 73 20 61 20  rrent time as a 
23c50 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65  Julian Day numbe
23c60 72 20 69 6e 20 2a 70 54 69 6d 65 4f 75 74 2e 0a  r in *pTimeOut..
23c70 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62  */.static int rb
23c80 75 56 66 73 43 75 72 72 65 6e 74 54 69 6d 65 28  uVfsCurrentTime(
23c90 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
23ca0 73 2c 20 64 6f 75 62 6c 65 20 2a 70 54 69 6d 65  s, double *pTime
23cb0 4f 75 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  Out){.  sqlite3_
23cc0 76 66 73 20 2a 70 52 65 61 6c 56 66 73 20 3d 20  vfs *pRealVfs = 
23cd0 28 28 72 62 75 5f 76 66 73 2a 29 70 56 66 73 29  ((rbu_vfs*)pVfs)
23ce0 2d 3e 70 52 65 61 6c 56 66 73 3b 0a 20 20 72 65  ->pRealVfs;.  re
23cf0 74 75 72 6e 20 70 52 65 61 6c 56 66 73 2d 3e 78  turn pRealVfs->x
23d00 43 75 72 72 65 6e 74 54 69 6d 65 28 70 52 65 61  CurrentTime(pRea
23d10 6c 56 66 73 2c 20 70 54 69 6d 65 4f 75 74 29 3b  lVfs, pTimeOut);
23d20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 2e  .}../*.** No-op.
23d30 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
23d40 62 75 56 66 73 47 65 74 4c 61 73 74 45 72 72 6f  buVfsGetLastErro
23d50 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  r(sqlite3_vfs *p
23d60 56 66 73 2c 20 69 6e 74 20 61 2c 20 63 68 61 72  Vfs, int a, char
23d70 20 2a 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 30   *b){.  return 0
23d80 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 72 65 67  ;.}../*.** Dereg
23d90 69 73 74 65 72 20 61 6e 64 20 64 65 73 74 72 6f  ister and destro
23da0 79 20 61 6e 20 52 42 55 20 76 66 73 20 63 72 65  y an RBU vfs cre
23db0 61 74 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69  ated by an earli
23dc0 65 72 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 73 71  er call to.** sq
23dd0 6c 69 74 65 33 72 62 75 5f 63 72 65 61 74 65 5f  lite3rbu_create_
23de0 76 66 73 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  vfs()..*/.void s
23df0 71 6c 69 74 65 33 72 62 75 5f 64 65 73 74 72 6f  qlite3rbu_destro
23e00 79 5f 76 66 73 28 63 6f 6e 73 74 20 63 68 61 72  y_vfs(const char
23e10 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 73 71 6c 69   *zName){.  sqli
23e20 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20  te3_vfs *pVfs = 
23e30 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
23e40 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70  (zName);.  if( p
23e50 56 66 73 20 26 26 20 70 56 66 73 2d 3e 78 4f 70  Vfs && pVfs->xOp
23e60 65 6e 3d 3d 72 62 75 56 66 73 4f 70 65 6e 20 29  en==rbuVfsOpen )
23e70 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  {.    sqlite3_mu
23e80 74 65 78 5f 66 72 65 65 28 28 28 72 62 75 5f 76  tex_free(((rbu_v
23e90 66 73 2a 29 70 56 66 73 29 2d 3e 6d 75 74 65 78  fs*)pVfs)->mutex
23ea0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76  );.    sqlite3_v
23eb0 66 73 5f 75 6e 72 65 67 69 73 74 65 72 28 70 56  fs_unregister(pV
23ec0 66 73 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  fs);.    sqlite3
23ed0 5f 66 72 65 65 28 70 56 66 73 29 3b 0a 20 20 7d  _free(pVfs);.  }
23ee0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
23ef0 20 61 6e 20 52 42 55 20 56 46 53 20 6e 61 6d 65   an RBU VFS name
23f00 64 20 7a 4e 61 6d 65 20 74 68 61 74 20 61 63 63  d zName that acc
23f10 65 73 73 65 73 20 74 68 65 20 75 6e 64 65 72 6c  esses the underl
23f20 79 69 6e 67 20 66 69 6c 65 2d 73 79 73 74 65 6d  ying file-system
23f30 0a 2a 2a 20 76 69 61 20 65 78 69 73 74 69 6e 67  .** via existing
23f40 20 56 46 53 20 7a 50 61 72 65 6e 74 2e 20 54 68   VFS zParent. Th
23f50 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 69 73 20  e new object is 
23f60 72 65 67 69 73 74 65 72 65 64 20 61 73 20 61 20  registered as a 
23f70 6e 6f 6e 2d 64 65 66 61 75 6c 74 0a 2a 2a 20 56  non-default.** V
23f80 46 53 20 77 69 74 68 20 53 51 4c 69 74 65 20 62  FS with SQLite b
23f90 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
23fa0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 72  .*/.int sqlite3r
23fb0 62 75 5f 63 72 65 61 74 65 5f 76 66 73 28 63 6f  bu_create_vfs(co
23fc0 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
23fd0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
23fe0 72 65 6e 74 29 7b 0a 0a 20 20 2f 2a 20 54 65 6d  rent){..  /* Tem
23ff0 70 6c 61 74 65 20 66 6f 72 20 56 46 53 20 2a 2f  plate for VFS */
24000 0a 20 20 73 74 61 74 69 63 20 73 71 6c 69 74 65  .  static sqlite
24010 33 5f 76 66 73 20 76 66 73 5f 74 65 6d 70 6c 61  3_vfs vfs_templa
24020 74 65 20 3d 20 7b 0a 20 20 20 20 31 2c 20 20 20  te = {.    1,   
24030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24040 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72           /* iVer
24050 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 30 2c 20 20  sion */.    0,  
24060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24070 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 7a 4f            /* szO
24080 73 46 69 6c 65 20 2a 2f 0a 20 20 20 20 30 2c 20  sFile */.    0, 
24090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
240a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6d 78             /* mx
240b0 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  Pathname */.    
240c0 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
240d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
240e0 20 70 4e 65 78 74 20 2a 2f 0a 20 20 20 20 30 2c   pNext */.    0,
240f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24100 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a              /* z
24110 4e 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20  Name */.    0,  
24120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24130 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 41 70            /* pAp
24140 70 44 61 74 61 20 2a 2f 0a 20 20 20 20 72 62 75  pData */.    rbu
24150 56 66 73 4f 70 65 6e 2c 20 20 20 20 20 20 20 20  VfsOpen,        
24160 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4f             /* xO
24170 70 65 6e 20 2a 2f 0a 20 20 20 20 72 62 75 56 66  pen */.    rbuVf
24180 73 44 65 6c 65 74 65 2c 20 20 20 20 20 20 20 20  sDelete,        
24190 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 65 6c           /* xDel
241a0 65 74 65 20 2a 2f 0a 20 20 20 20 72 62 75 56 66  ete */.    rbuVf
241b0 73 41 63 63 65 73 73 2c 20 20 20 20 20 20 20 20  sAccess,        
241c0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 41 63 63           /* xAcc
241d0 65 73 73 20 2a 2f 0a 20 20 20 20 72 62 75 56 66  ess */.    rbuVf
241e0 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20  sFullPathname,  
241f0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 75 6c           /* xFul
24200 6c 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 0a 23 69  lPathname */..#i
24210 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
24220 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  T_LOAD_EXTENSION
24230 0a 20 20 20 20 72 62 75 56 66 73 44 6c 4f 70 65  .    rbuVfsDlOpe
24240 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
24250 20 20 20 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f     /* xDlOpen */
24260 0a 20 20 20 20 72 62 75 56 66 73 44 6c 45 72 72  .    rbuVfsDlErr
24270 6f 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  or,             
24280 20 20 20 2f 2a 20 78 44 6c 45 72 72 6f 72 20 2a     /* xDlError *
24290 2f 0a 20 20 20 20 72 62 75 56 66 73 44 6c 53 79  /.    rbuVfsDlSy
242a0 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m,              
242b0 20 20 20 20 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f      /* xDlSym */
242c0 0a 20 20 20 20 72 62 75 56 66 73 44 6c 43 6c 6f  .    rbuVfsDlClo
242d0 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
242e0 20 20 20 2f 2a 20 78 44 6c 43 6c 6f 73 65 20 2a     /* xDlClose *
242f0 2f 0a 23 65 6c 73 65 0a 20 20 20 20 30 2c 20 30  /.#else.    0, 0
24300 2c 20 30 2c 20 30 2c 0a 23 65 6e 64 69 66 0a 0a  , 0, 0,.#endif..
24310 20 20 20 20 72 62 75 56 66 73 52 61 6e 64 6f 6d      rbuVfsRandom
24320 6e 65 73 73 2c 20 20 20 20 20 20 20 20 20 20 20  ness,           
24330 20 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65 73 73    /* xRandomness
24340 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 53 6c   */.    rbuVfsSl
24350 65 65 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  eep,            
24360 20 20 20 20 20 20 2f 2a 20 78 53 6c 65 65 70 20        /* xSleep 
24370 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 43 75 72  */.    rbuVfsCur
24380 72 65 6e 74 54 69 6d 65 2c 20 20 20 20 20 20 20  rentTime,       
24390 20 20 20 20 20 2f 2a 20 78 43 75 72 72 65 6e 74       /* xCurrent
243a0 54 69 6d 65 20 2a 2f 0a 20 20 20 20 72 62 75 56  Time */.    rbuV
243b0 66 73 47 65 74 4c 61 73 74 45 72 72 6f 72 2c 20  fsGetLastError, 
243c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 47 65            /* xGe
243d0 74 4c 61 73 74 45 72 72 6f 72 20 2a 2f 0a 20 20  tLastError */.  
243e0 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
243f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24400 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65 49  /* xCurrentTimeI
24410 6e 74 36 34 20 28 76 65 72 73 69 6f 6e 20 32 29  nt64 (version 2)
24420 20 2a 2f 0a 20 20 20 20 30 2c 20 30 2c 20 30 20   */.    0, 0, 0 
24430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24440 20 20 20 20 20 20 2f 2a 20 55 6e 69 6d 70 6c 65        /* Unimple
24450 6d 65 6e 74 65 64 20 76 65 72 73 69 6f 6e 20 33  mented version 3
24460 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 20 20 7d 3b   methods */.  };
24470 0a 0a 20 20 72 62 75 5f 76 66 73 20 2a 70 4e 65  ..  rbu_vfs *pNe
24480 77 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  w = 0;          
24490 20 20 20 20 2f 2a 20 4e 65 77 6c 79 20 61 6c 6c      /* Newly all
244a0 6f 63 61 74 65 64 20 56 46 53 20 2a 2f 0a 20 20  ocated VFS */.  
244b0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
244c0 4f 4b 3b 0a 20 20 73 69 7a 65 5f 74 20 6e 4e 61  OK;.  size_t nNa
244d0 6d 65 3b 0a 20 20 73 69 7a 65 5f 74 20 6e 42 79  me;.  size_t nBy
244e0 74 65 3b 0a 0a 20 20 6e 4e 61 6d 65 20 3d 20 73  te;..  nName = s
244f0 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20  trlen(zName);.  
24500 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 72  nByte = sizeof(r
24510 62 75 5f 76 66 73 29 20 2b 20 6e 4e 61 6d 65 20  bu_vfs) + nName 
24520 2b 20 31 3b 0a 20 20 70 4e 65 77 20 3d 20 28 72  + 1;.  pNew = (r
24530 62 75 5f 76 66 73 2a 29 73 71 6c 69 74 65 33 5f  bu_vfs*)sqlite3_
24540 6d 61 6c 6c 6f 63 36 34 28 6e 42 79 74 65 29 3b  malloc64(nByte);
24550 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
24560 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
24570 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65  E_NOMEM;.  }else
24580 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66  {.    sqlite3_vf
24590 73 20 2a 70 50 61 72 65 6e 74 3b 20 20 20 20 20  s *pParent;     
245a0 20 20 20 20 20 20 2f 2a 20 50 61 72 65 6e 74 20        /* Parent 
245b0 56 46 53 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65  VFS */.    memse
245c0 74 28 70 4e 65 77 2c 20 30 2c 20 6e 42 79 74 65  t(pNew, 0, nByte
245d0 29 3b 0a 20 20 20 20 70 50 61 72 65 6e 74 20 3d  );.    pParent =
245e0 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e   sqlite3_vfs_fin
245f0 64 28 7a 50 61 72 65 6e 74 29 3b 0a 20 20 20 20  d(zParent);.    
24600 69 66 28 20 70 50 61 72 65 6e 74 3d 3d 30 20 29  if( pParent==0 )
24610 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
24620 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20  ITE_NOTFOUND;.  
24630 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
24640 68 61 72 20 2a 7a 53 70 61 63 65 3b 0a 20 20 20  har *zSpace;.   
24650 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 2d     memcpy(&pNew-
24660 3e 62 61 73 65 2c 20 26 76 66 73 5f 74 65 6d 70  >base, &vfs_temp
24670 6c 61 74 65 2c 20 73 69 7a 65 6f 66 28 73 71 6c  late, sizeof(sql
24680 69 74 65 33 5f 76 66 73 29 29 3b 0a 20 20 20 20  ite3_vfs));.    
24690 20 20 70 4e 65 77 2d 3e 62 61 73 65 2e 6d 78 50    pNew->base.mxP
246a0 61 74 68 6e 61 6d 65 20 3d 20 70 50 61 72 65 6e  athname = pParen
246b0 74 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 3b 0a 20  t->mxPathname;. 
246c0 20 20 20 20 20 70 4e 65 77 2d 3e 62 61 73 65 2e       pNew->base.
246d0 73 7a 4f 73 46 69 6c 65 20 3d 20 73 69 7a 65 6f  szOsFile = sizeo
246e0 66 28 72 62 75 5f 66 69 6c 65 29 20 2b 20 70 50  f(rbu_file) + pP
246f0 61 72 65 6e 74 2d 3e 73 7a 4f 73 46 69 6c 65 3b  arent->szOsFile;
24700 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 52 65  .      pNew->pRe
24710 61 6c 56 66 73 20 3d 20 70 50 61 72 65 6e 74 3b  alVfs = pParent;
24720 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 62 61 73  .      pNew->bas
24730 65 2e 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74  e.zName = (const
24740 20 63 68 61 72 2a 29 28 7a 53 70 61 63 65 20 3d   char*)(zSpace =
24750 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d   (char*)&pNew[1]
24760 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
24770 7a 53 70 61 63 65 2c 20 7a 4e 61 6d 65 2c 20 6e  zSpace, zName, n
24780 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  Name);..      /*
24790 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 6d 75   Allocate the mu
247a0 74 65 78 20 61 6e 64 20 72 65 67 69 73 74 65 72  tex and register
247b0 20 74 68 65 20 6e 65 77 20 56 46 53 20 28 6e 6f   the new VFS (no
247c0 74 20 61 73 20 74 68 65 20 64 65 66 61 75 6c 74  t as the default
247d0 29 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d  ) */.      pNew-
247e0 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33  >mutex = sqlite3
247f0 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c  _mutex_alloc(SQL
24800 49 54 45 5f 4d 55 54 45 58 5f 52 45 43 55 52 53  ITE_MUTEX_RECURS
24810 49 56 45 29 3b 0a 20 20 20 20 20 20 69 66 28 20  IVE);.      if( 
24820 70 4e 65 77 2d 3e 6d 75 74 65 78 3d 3d 30 20 29  pNew->mutex==0 )
24830 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
24840 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
24850 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
24860 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 76    rc = sqlite3_v
24870 66 73 5f 72 65 67 69 73 74 65 72 28 26 70 4e 65  fs_register(&pNe
24880 77 2d 3e 62 61 73 65 2c 20 30 29 3b 0a 20 20 20  w->base, 0);.   
24890 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
248a0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
248b0 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
248c0 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 4e  e3_mutex_free(pN
248d0 65 77 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20  ew->mutex);.    
248e0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
248f0 4e 65 77 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  New);.    }.  }.
24900 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
24910 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
24920 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24930 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24940 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24950 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
24960 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
24970 65 64 28 53 51 4c 49 54 45 5f 43 4f 52 45 29 20  ed(SQLITE_CORE) 
24980 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
24990 45 5f 45 4e 41 42 4c 45 5f 52 42 55 29 20 2a 2f  E_ENABLE_RBU) */
249a0 0a                                               .