/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 03d4acabf6a51e0714eb4119379e06464f0158ca1d6a0ebd73769b82e7477a11:


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 20 44 65 6c 74 61 20  ZE 16../* Delta 
1070: 63 68 65 63 6b 73 75 6d 73 20 64 69 73 61 62 6c  checksums disabl
1080: 65 64 20 62 79 20 64 65 66 61 75 6c 74 2e 20 20  ed by default.  
1090: 43 6f 6d 70 69 6c 65 20 77 69 74 68 20 2d 44 52  Compile with -DR
10a0: 42 55 5f 45 4e 41 42 4c 45 5f 44 45 4c 54 41 5f  BU_ENABLE_DELTA_
10b0: 43 4b 53 55 4d 0a 2a 2a 20 74 6f 20 65 6e 61 62  CKSUM.** to enab
10c0: 6c 65 20 63 68 65 63 6b 73 75 6d 20 76 65 72 69  le checksum veri
10d0: 66 69 63 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66  fication..*/.#if
10e0: 6e 64 65 66 20 52 42 55 5f 45 4e 41 42 4c 45 5f  ndef RBU_ENABLE_
10f0: 44 45 4c 54 41 5f 43 4b 53 55 4d 0a 23 20 64 65  DELTA_CKSUM.# de
1100: 66 69 6e 65 20 52 42 55 5f 45 4e 41 42 4c 45 5f  fine RBU_ENABLE_
1110: 44 45 4c 54 41 5f 43 4b 53 55 4d 20 30 0a 23 65  DELTA_CKSUM 0.#e
1120: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 77 61 70  ndif../*.** Swap
1130: 20 74 77 6f 20 6f 62 6a 65 63 74 73 20 6f 66 20   two objects of 
1140: 74 79 70 65 20 54 59 50 45 2e 0a 2a 2f 0a 23 69  type TYPE..*/.#i
1150: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
1160: 45 5f 41 4d 41 4c 47 41 4d 41 54 49 4f 4e 29 0a  E_AMALGAMATION).
1170: 23 20 64 65 66 69 6e 65 20 53 57 41 50 28 54 59  # define SWAP(TY
1180: 50 45 2c 41 2c 42 29 20 7b 54 59 50 45 20 74 3d  PE,A,B) {TYPE t=
1190: 41 3b 20 41 3d 42 3b 20 42 3d 74 3b 7d 0a 23 65  A; A=B; B=t;}.#e
11a0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
11b0: 72 62 75 5f 73 74 61 74 65 20 74 61 62 6c 65 20  rbu_state table 
11c0: 69 73 20 75 73 65 64 20 74 6f 20 73 61 76 65 20  is used to save 
11d0: 74 68 65 20 73 74 61 74 65 20 6f 66 20 61 20 70  the state of a p
11e0: 61 72 74 69 61 6c 6c 79 20 61 70 70 6c 69 65 64  artially applied
11f0: 0a 2a 2a 20 75 70 64 61 74 65 20 73 6f 20 74 68  .** update so th
1200: 61 74 20 69 74 20 63 61 6e 20 62 65 20 72 65 73  at it can be res
1210: 75 6d 65 64 20 6c 61 74 65 72 2e 20 54 68 65 20  umed later. The 
1220: 74 61 62 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f  table consists o
1230: 66 20 69 6e 74 65 67 65 72 0a 2a 2a 20 6b 65 79  f integer.** key
1240: 73 20 6d 61 70 70 65 64 20 74 6f 20 76 61 6c 75  s mapped to valu
1250: 65 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  es as follows:.*
1260: 2a 0a 2a 2a 20 52 42 55 5f 53 54 41 54 45 5f 53  *.** RBU_STATE_S
1270: 54 41 47 45 3a 0a 2a 2a 20 20 20 4d 61 79 20 62  TAGE:.**   May b
1280: 65 20 73 65 74 20 74 6f 20 69 6e 74 65 67 65 72  e set to integer
1290: 20 76 61 6c 75 65 73 20 31 2c 20 32 2c 20 34 20   values 1, 2, 4 
12a0: 6f 72 20 35 2e 20 41 73 20 66 6f 6c 6c 6f 77 73  or 5. As follows
12b0: 3a 0a 2a 2a 20 20 20 20 20 20 20 31 3a 20 74 68  :.**       1: th
12c0: 65 20 2a 2d 72 62 75 20 66 69 6c 65 20 69 73 20  e *-rbu file is 
12d0: 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
12e0: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a  construction..**
12f0: 20 20 20 20 20 20 20 32 3a 20 74 68 65 20 2a 2d         2: the *-
1300: 72 62 75 20 66 69 6c 65 20 68 61 73 20 62 65 65  rbu file has bee
1310: 6e 20 63 6f 6e 73 74 72 75 63 74 65 64 2c 20 62  n constructed, b
1320: 75 74 20 6e 6f 74 20 79 65 74 20 6d 6f 76 65 64  ut not yet moved
1330: 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 74 6f   .**          to
1340: 20 74 68 65 20 2a 2d 77 61 6c 20 70 61 74 68 2e   the *-wal path.
1350: 0a 2a 2a 20 20 20 20 20 20 20 34 3a 20 74 68 65  .**       4: the
1360: 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 73 20 75   checkpoint is u
1370: 6e 64 65 72 77 61 79 2e 0a 2a 2a 20 20 20 20 20  nderway..**     
1380: 20 20 35 3a 20 74 68 65 20 72 62 75 20 75 70 64    5: the rbu upd
1390: 61 74 65 20 68 61 73 20 62 65 65 6e 20 63 68 65  ate has been che
13a0: 63 6b 70 6f 69 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a  ckpointed..**.**
13b0: 20 52 42 55 5f 53 54 41 54 45 5f 54 42 4c 3a 0a   RBU_STATE_TBL:.
13c0: 2a 2a 20 20 20 4f 6e 6c 79 20 76 61 6c 69 64 20  **   Only valid 
13d0: 69 66 20 53 54 41 47 45 3d 3d 31 2e 20 54 68 65  if STAGE==1. The
13e0: 20 74 61 72 67 65 74 20 64 61 74 61 62 61 73 65   target database
13f0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
1400: 6c 65 20 0a 2a 2a 20 20 20 63 75 72 72 65 6e 74  le .**   current
1410: 6c 79 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  ly being written
1420: 2e 0a 2a 2a 0a 2a 2a 20 52 42 55 5f 53 54 41 54  ..**.** RBU_STAT
1430: 45 5f 49 44 58 3a 0a 2a 2a 20 20 20 4f 6e 6c 79  E_IDX:.**   Only
1440: 20 76 61 6c 69 64 20 69 66 20 53 54 41 47 45 3d   valid if STAGE=
1450: 3d 31 2e 20 54 68 65 20 74 61 72 67 65 74 20 64  =1. The target d
1460: 61 74 61 62 61 73 65 20 6e 61 6d 65 20 6f 66 20  atabase name of 
1470: 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20 20 20  the index .**   
1480: 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20  currently being 
1490: 77 72 69 74 74 65 6e 2c 20 6f 72 20 4e 55 4c 4c  written, or NULL
14a0: 20 69 66 20 74 68 65 20 6d 61 69 6e 20 74 61 62   if the main tab
14b0: 6c 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  le is currently 
14c0: 62 65 69 6e 67 0a 2a 2a 20 20 20 75 70 64 61 74  being.**   updat
14d0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 42 55 5f 53 54  ed..**.** RBU_ST
14e0: 41 54 45 5f 52 4f 57 3a 0a 2a 2a 20 20 20 4f 6e  ATE_ROW:.**   On
14f0: 6c 79 20 76 61 6c 69 64 20 69 66 20 53 54 41 47  ly valid if STAG
1500: 45 3d 3d 31 2e 20 4e 75 6d 62 65 72 20 6f 66 20  E==1. Number of 
1510: 72 6f 77 73 20 61 6c 72 65 61 64 79 20 70 72 6f  rows already pro
1520: 63 65 73 73 65 64 20 66 6f 72 20 74 68 65 20 63  cessed for the c
1530: 75 72 72 65 6e 74 0a 2a 2a 20 20 20 74 61 62 6c  urrent.**   tabl
1540: 65 2f 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 52  e/index..**.** R
1550: 42 55 5f 53 54 41 54 45 5f 50 52 4f 47 52 45 53  BU_STATE_PROGRES
1560: 53 3a 0a 2a 2a 20 20 20 54 72 62 75 6c 20 6e 75  S:.**   Trbul nu
1570: 6d 62 65 72 20 6f 66 20 73 71 6c 69 74 65 33 72  mber of sqlite3r
1580: 62 75 5f 73 74 65 70 28 29 20 63 61 6c 6c 73 20  bu_step() calls 
1590: 6d 61 64 65 20 73 6f 20 66 61 72 20 61 73 20 70  made so far as p
15a0: 61 72 74 20 6f 66 20 74 68 69 73 0a 2a 2a 20 20  art of this.**  
15b0: 20 72 62 75 20 75 70 64 61 74 65 2e 0a 2a 2a 0a   rbu update..**.
15c0: 2a 2a 20 52 42 55 5f 53 54 41 54 45 5f 43 4b 50  ** RBU_STATE_CKP
15d0: 54 3a 0a 2a 2a 20 20 20 56 61 6c 69 64 20 69 66  T:.**   Valid if
15e0: 20 53 54 41 47 45 3d 3d 34 2e 20 54 68 65 20 36   STAGE==4. The 6
15f0: 34 2d 62 69 74 20 63 68 65 63 6b 73 75 6d 20 61  4-bit checksum a
1600: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
1610: 68 65 20 77 61 6c 2d 69 6e 64 65 78 0a 2a 2a 20  he wal-index.** 
1620: 20 20 68 65 61 64 65 72 20 63 72 65 61 74 65 64    header created
1630: 20 62 79 20 72 65 63 6f 76 65 72 69 6e 67 20 74   by recovering t
1640: 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 2e 20 54  he *-wal file. T
1650: 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 64  his is used to d
1660: 65 74 65 63 74 0a 2a 2a 20 20 20 63 61 73 65 73  etect.**   cases
1670: 20 77 68 65 6e 20 61 6e 6f 74 68 65 72 20 63 6c   when another cl
1680: 69 65 6e 74 20 61 70 70 65 6e 64 73 20 66 72 61  ient appends fra
1690: 6d 65 73 20 74 6f 20 74 68 65 20 2a 2d 77 61 6c  mes to the *-wal
16a0: 20 66 69 6c 65 20 69 6e 20 74 68 65 0a 2a 2a 20   file in the.** 
16b0: 20 20 6d 69 64 64 6c 65 20 6f 66 20 61 6e 20 69    middle of an i
16c0: 6e 63 72 65 6d 65 6e 74 61 6c 20 63 68 65 63 6b  ncremental check
16d0: 70 6f 69 6e 74 20 28 61 6e 20 69 6e 63 72 65 6d  point (an increm
16e0: 65 6e 74 61 6c 20 63 68 65 63 6b 70 6f 69 6e 74  ental checkpoint
16f0: 20 63 61 6e 6e 6f 74 0a 2a 2a 20 20 20 62 65 20   cannot.**   be 
1700: 63 6f 6e 74 69 6e 75 65 64 20 69 66 20 74 68 69  continued if thi
1710: 73 20 68 61 70 70 65 6e 73 29 2e 0a 2a 2a 0a 2a  s happens)..**.*
1720: 2a 20 52 42 55 5f 53 54 41 54 45 5f 43 4f 4f 4b  * RBU_STATE_COOK
1730: 49 45 3a 0a 2a 2a 20 20 20 56 61 6c 69 64 20 69  IE:.**   Valid i
1740: 66 20 53 54 41 47 45 3d 3d 31 2e 20 54 68 65 20  f STAGE==1. The 
1750: 63 75 72 72 65 6e 74 20 63 68 61 6e 67 65 2d 63  current change-c
1760: 6f 75 6e 74 65 72 20 63 6f 6f 6b 69 65 20 76 61  ounter cookie va
1770: 6c 75 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 20  lue in the .**  
1780: 20 74 61 72 67 65 74 20 64 62 20 66 69 6c 65 2e   target db file.
1790: 0a 2a 2a 0a 2a 2a 20 52 42 55 5f 53 54 41 54 45  .**.** RBU_STATE
17a0: 5f 4f 41 4c 53 5a 3a 0a 2a 2a 20 20 20 56 61 6c  _OALSZ:.**   Val
17b0: 69 64 20 69 66 20 53 54 41 47 45 3d 3d 31 2e 20  id if STAGE==1. 
17c0: 54 68 65 20 73 69 7a 65 20 69 6e 20 62 79 74 65  The size in byte
17d0: 73 20 6f 66 20 74 68 65 20 2a 2d 6f 61 6c 20 66  s of the *-oal f
17e0: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 52 42 55 5f 53  ile..**.** RBU_S
17f0: 54 41 54 45 5f 44 41 54 41 54 42 4c 3a 0a 2a 2a  TATE_DATATBL:.**
1800: 20 20 20 4f 6e 6c 79 20 76 61 6c 69 64 20 69 66     Only valid if
1810: 20 53 54 41 47 45 3d 3d 31 2e 20 54 68 65 20 52   STAGE==1. The R
1820: 42 55 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  BU database name
1830: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 0a 2a   of the table .*
1840: 2a 20 20 20 63 75 72 72 65 6e 74 6c 79 20 62 65  *   currently be
1850: 69 6e 67 20 72 65 61 64 2e 0a 2a 2f 0a 23 64 65  ing read..*/.#de
1860: 66 69 6e 65 20 52 42 55 5f 53 54 41 54 45 5f 53  fine RBU_STATE_S
1870: 54 41 47 45 20 20 20 20 20 20 20 20 31 0a 23 64  TAGE        1.#d
1880: 65 66 69 6e 65 20 52 42 55 5f 53 54 41 54 45 5f  efine RBU_STATE_
1890: 54 42 4c 20 20 20 20 20 20 20 20 20 20 32 0a 23  TBL          2.#
18a0: 64 65 66 69 6e 65 20 52 42 55 5f 53 54 41 54 45  define RBU_STATE
18b0: 5f 49 44 58 20 20 20 20 20 20 20 20 20 20 33 0a  _IDX          3.
18c0: 23 64 65 66 69 6e 65 20 52 42 55 5f 53 54 41 54  #define RBU_STAT
18d0: 45 5f 52 4f 57 20 20 20 20 20 20 20 20 20 20 34  E_ROW          4
18e0: 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 53 54 41  .#define RBU_STA
18f0: 54 45 5f 50 52 4f 47 52 45 53 53 20 20 20 20 20  TE_PROGRESS     
1900: 35 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 53 54  5.#define RBU_ST
1910: 41 54 45 5f 43 4b 50 54 20 20 20 20 20 20 20 20  ATE_CKPT        
1920: 20 36 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 53   6.#define RBU_S
1930: 54 41 54 45 5f 43 4f 4f 4b 49 45 20 20 20 20 20  TATE_COOKIE     
1940: 20 20 37 0a 23 64 65 66 69 6e 65 20 52 42 55 5f    7.#define RBU_
1950: 53 54 41 54 45 5f 4f 41 4c 53 5a 20 20 20 20 20  STATE_OALSZ     
1960: 20 20 20 38 0a 23 64 65 66 69 6e 65 20 52 42 55     8.#define RBU
1970: 5f 53 54 41 54 45 5f 50 48 41 53 45 4f 4e 45 53  _STATE_PHASEONES
1980: 54 45 50 20 39 0a 23 64 65 66 69 6e 65 20 52 42  TEP 9.#define RB
1990: 55 5f 53 54 41 54 45 5f 44 41 54 41 54 42 4c 20  U_STATE_DATATBL 
19a0: 20 20 20 20 31 30 0a 0a 23 64 65 66 69 6e 65 20      10..#define 
19b0: 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20 20 20  RBU_STAGE_OAL   
19c0: 20 20 20 20 20 20 31 0a 23 64 65 66 69 6e 65 20        1.#define 
19d0: 52 42 55 5f 53 54 41 47 45 5f 4d 4f 56 45 20 20  RBU_STAGE_MOVE  
19e0: 20 20 20 20 20 20 32 0a 23 64 65 66 69 6e 65 20        2.#define 
19f0: 52 42 55 5f 53 54 41 47 45 5f 43 41 50 54 55 52  RBU_STAGE_CAPTUR
1a00: 45 20 20 20 20 20 33 0a 23 64 65 66 69 6e 65 20  E     3.#define 
1a10: 52 42 55 5f 53 54 41 47 45 5f 43 4b 50 54 20 20  RBU_STAGE_CKPT  
1a20: 20 20 20 20 20 20 34 0a 23 64 65 66 69 6e 65 20        4.#define 
1a30: 52 42 55 5f 53 54 41 47 45 5f 44 4f 4e 45 20 20  RBU_STAGE_DONE  
1a40: 20 20 20 20 20 20 35 0a 0a 0a 23 64 65 66 69 6e        5...#defin
1a50: 65 20 52 42 55 5f 43 52 45 41 54 45 5f 53 54 41  e RBU_CREATE_STA
1a60: 54 45 20 5c 0a 20 20 22 43 52 45 41 54 45 20 54  TE \.  "CREATE T
1a70: 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53  ABLE IF NOT EXIS
1a80: 54 53 20 25 73 2e 72 62 75 5f 73 74 61 74 65 28  TS %s.rbu_state(
1a90: 6b 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  k INTEGER PRIMAR
1aa0: 59 20 4b 45 59 2c 20 76 29 22 0a 0a 74 79 70 65  Y KEY, v)"..type
1ab0: 64 65 66 20 73 74 72 75 63 74 20 52 62 75 46 72  def struct RbuFr
1ac0: 61 6d 65 20 52 62 75 46 72 61 6d 65 3b 0a 74 79  ame RbuFrame;.ty
1ad0: 70 65 64 65 66 20 73 74 72 75 63 74 20 52 62 75  pedef struct Rbu
1ae0: 4f 62 6a 49 74 65 72 20 52 62 75 4f 62 6a 49 74  ObjIter RbuObjIt
1af0: 65 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  er;.typedef stru
1b00: 63 74 20 52 62 75 53 74 61 74 65 20 52 62 75 53  ct RbuState RbuS
1b10: 74 61 74 65 3b 0a 74 79 70 65 64 65 66 20 73 74  tate;.typedef st
1b20: 72 75 63 74 20 72 62 75 5f 76 66 73 20 72 62 75  ruct rbu_vfs rbu
1b30: 5f 76 66 73 3b 0a 74 79 70 65 64 65 66 20 73 74  _vfs;.typedef st
1b40: 72 75 63 74 20 72 62 75 5f 66 69 6c 65 20 72 62  ruct rbu_file rb
1b50: 75 5f 66 69 6c 65 3b 0a 74 79 70 65 64 65 66 20  u_file;.typedef 
1b60: 73 74 72 75 63 74 20 52 62 75 55 70 64 61 74 65  struct RbuUpdate
1b70: 53 74 6d 74 20 52 62 75 55 70 64 61 74 65 53 74  Stmt RbuUpdateSt
1b80: 6d 74 3b 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  mt;..#if !define
1b90: 64 28 53 51 4c 49 54 45 5f 41 4d 41 4c 47 41 4d  d(SQLITE_AMALGAM
1ba0: 41 54 49 4f 4e 29 0a 74 79 70 65 64 65 66 20 75  ATION).typedef u
1bb0: 6e 73 69 67 6e 65 64 20 69 6e 74 20 75 33 32 3b  nsigned int u32;
1bc0: 0a 74 79 70 65 64 65 66 20 75 6e 73 69 67 6e 65  .typedef unsigne
1bd0: 64 20 73 68 6f 72 74 20 75 31 36 3b 0a 74 79 70  d short u16;.typ
1be0: 65 64 65 66 20 75 6e 73 69 67 6e 65 64 20 63 68  edef unsigned ch
1bf0: 61 72 20 75 38 3b 0a 74 79 70 65 64 65 66 20 73  ar u8;.typedef s
1c00: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 36 34  qlite3_int64 i64
1c10: 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ;.#endif../*.** 
1c20: 54 68 65 73 65 20 76 61 6c 75 65 73 20 6d 75 73  These values mus
1c30: 74 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75  t match the valu
1c40: 65 73 20 64 65 66 69 6e 65 64 20 69 6e 20 77 61  es defined in wa
1c50: 6c 2e 63 20 66 6f 72 20 74 68 65 20 65 71 75 69  l.c for the equi
1c60: 76 61 6c 65 6e 74 0a 2a 2a 20 6c 6f 63 6b 73 2e  valent.** locks.
1c70: 20 54 68 65 73 65 20 61 72 65 20 6e 6f 74 20 6d   These are not m
1c80: 61 67 69 63 20 6e 75 6d 62 65 72 73 20 61 73 20  agic numbers as 
1c90: 74 68 65 79 20 61 72 65 20 70 61 72 74 20 6f 66  they are part of
1ca0: 20 74 68 65 20 53 51 4c 69 74 65 20 66 69 6c 65   the SQLite file
1cb0: 0a 2a 2a 20 66 6f 72 6d 61 74 2e 0a 2a 2f 0a 23  .** format..*/.#
1cc0: 64 65 66 69 6e 65 20 57 41 4c 5f 4c 4f 43 4b 5f  define WAL_LOCK_
1cd0: 57 52 49 54 45 20 20 30 0a 23 64 65 66 69 6e 65  WRITE  0.#define
1ce0: 20 57 41 4c 5f 4c 4f 43 4b 5f 43 4b 50 54 20 20   WAL_LOCK_CKPT  
1cf0: 20 31 0a 23 64 65 66 69 6e 65 20 57 41 4c 5f 4c   1.#define WAL_L
1d00: 4f 43 4b 5f 52 45 41 44 30 20 20 33 0a 0a 23 64  OCK_READ0  3..#d
1d10: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 46 43 4e  efine SQLITE_FCN
1d20: 54 4c 5f 52 42 55 43 4e 54 20 20 20 20 35 31 34  TL_RBUCNT    514
1d30: 39 32 31 36 0a 0a 2f 2a 0a 2a 2a 20 41 20 73 74  9216../*.** A st
1d40: 72 75 63 74 75 72 65 20 74 6f 20 73 74 6f 72 65  ructure to store
1d50: 20 76 61 6c 75 65 73 20 72 65 61 64 20 66 72 6f   values read fro
1d60: 6d 20 74 68 65 20 72 62 75 5f 73 74 61 74 65 20  m the rbu_state 
1d70: 74 61 62 6c 65 20 69 6e 20 6d 65 6d 6f 72 79 2e  table in memory.
1d80: 0a 2a 2f 0a 73 74 72 75 63 74 20 52 62 75 53 74  .*/.struct RbuSt
1d90: 61 74 65 20 7b 0a 20 20 69 6e 74 20 65 53 74 61  ate {.  int eSta
1da0: 67 65 3b 0a 20 20 63 68 61 72 20 2a 7a 54 62 6c  ge;.  char *zTbl
1db0: 3b 0a 20 20 63 68 61 72 20 2a 7a 44 61 74 61 54  ;.  char *zDataT
1dc0: 62 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 49 64 78  bl;.  char *zIdx
1dd0: 3b 0a 20 20 69 36 34 20 69 57 61 6c 43 6b 73 75  ;.  i64 iWalCksu
1de0: 6d 3b 0a 20 20 69 6e 74 20 6e 52 6f 77 3b 0a 20  m;.  int nRow;. 
1df0: 20 69 36 34 20 6e 50 72 6f 67 72 65 73 73 3b 0a   i64 nProgress;.
1e00: 20 20 75 33 32 20 69 43 6f 6f 6b 69 65 3b 0a 20    u32 iCookie;. 
1e10: 20 69 36 34 20 69 4f 61 6c 53 7a 3b 0a 20 20 69   i64 iOalSz;.  i
1e20: 36 34 20 6e 50 68 61 73 65 4f 6e 65 53 74 65 70  64 nPhaseOneStep
1e30: 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 52 62 75  ;.};..struct Rbu
1e40: 55 70 64 61 74 65 53 74 6d 74 20 7b 0a 20 20 63  UpdateStmt {.  c
1e50: 68 61 72 20 2a 7a 4d 61 73 6b 3b 20 20 20 20 20  har *zMask;     
1e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e70: 2a 20 43 6f 70 79 20 6f 66 20 75 70 64 61 74 65  * Copy of update
1e80: 20 6d 61 73 6b 20 75 73 65 64 20 77 69 74 68 20   mask used with 
1e90: 70 55 70 64 61 74 65 20 2a 2f 0a 20 20 73 71 6c  pUpdate */.  sql
1ea0: 69 74 65 33 5f 73 74 6d 74 20 2a 70 55 70 64 61  ite3_stmt *pUpda
1eb0: 74 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  te;          /* 
1ec0: 4c 61 73 74 20 75 70 64 61 74 65 20 73 74 61 74  Last update stat
1ed0: 65 6d 65 6e 74 20 28 6f 72 20 4e 55 4c 4c 29 20  ement (or NULL) 
1ee0: 2a 2f 0a 20 20 52 62 75 55 70 64 61 74 65 53 74  */.  RbuUpdateSt
1ef0: 6d 74 20 2a 70 4e 65 78 74 3b 0a 7d 3b 0a 0a 2f  mt *pNext;.};../
1f00: 2a 0a 2a 2a 20 41 6e 20 69 74 65 72 61 74 6f 72  *.** An iterator
1f10: 20 6f 66 20 74 68 69 73 20 74 79 70 65 20 69 73   of this type is
1f20: 20 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   used to iterate
1f30: 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 6f 62 6a   through all obj
1f40: 65 63 74 73 20 69 6e 0a 2a 2a 20 74 68 65 20 74  ects in.** the t
1f50: 61 72 67 65 74 20 64 61 74 61 62 61 73 65 20 74  arget database t
1f60: 68 61 74 20 72 65 71 75 69 72 65 20 75 70 64 61  hat require upda
1f70: 74 69 6e 67 2e 20 46 6f 72 20 65 61 63 68 20 73  ting. For each s
1f80: 75 63 68 20 74 61 62 6c 65 2c 20 74 68 65 0a 2a  uch table, the.*
1f90: 2a 20 69 74 65 72 61 74 6f 72 20 76 69 73 69 74  * iterator visit
1fa0: 73 2c 20 69 6e 20 6f 72 64 65 72 3a 0a 2a 2a 0a  s, in order:.**.
1fb0: 2a 2a 20 20 20 20 20 2a 20 74 68 65 20 74 61 62  **     * the tab
1fc0: 6c 65 20 69 74 73 65 6c 66 2c 20 0a 2a 2a 20 20  le itself, .**  
1fd0: 20 20 20 2a 20 65 61 63 68 20 69 6e 64 65 78 20     * each index 
1fe0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 28 7a 65  of the table (ze
1ff0: 72 6f 20 6f 72 20 6d 6f 72 65 20 70 6f 69 6e 74  ro or more point
2000: 73 20 74 6f 20 76 69 73 69 74 29 2c 20 61 6e 64  s to visit), and
2010: 0a 2a 2a 20 20 20 20 20 2a 20 61 20 73 70 65 63  .**     * a spec
2020: 69 61 6c 20 22 63 6c 65 61 6e 75 70 20 74 61 62  ial "cleanup tab
2030: 6c 65 22 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  le" state..**.**
2040: 20 61 62 49 6e 64 65 78 65 64 3a 0a 2a 2a 20 20   abIndexed:.**  
2050: 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 68 61   If the table ha
2060: 73 20 6e 6f 20 69 6e 64 65 78 65 73 20 6f 6e 20  s no indexes on 
2070: 69 74 2c 20 61 62 49 6e 64 65 78 65 64 20 69 73  it, abIndexed is
2080: 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 20 4f 74   set to NULL. Ot
2090: 68 65 72 77 69 73 65 2c 0a 2a 2a 20 20 20 69 74  herwise,.**   it
20a0: 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 61 72   points to an ar
20b0: 72 61 79 20 6f 66 20 66 6c 61 67 73 20 6e 54 62  ray of flags nTb
20c0: 6c 43 6f 6c 20 65 6c 65 6d 65 6e 74 73 20 69 6e  lCol elements in
20d0: 20 73 69 7a 65 2e 20 54 68 65 20 66 6c 61 67 20   size. The flag 
20e0: 69 73 0a 2a 2a 20 20 20 73 65 74 20 66 6f 72 20  is.**   set for 
20f0: 65 61 63 68 20 63 6f 6c 75 6d 6e 20 74 68 61 74  each column that
2100: 20 69 73 20 65 69 74 68 65 72 20 61 20 70 61 72   is either a par
2110: 74 20 6f 66 20 74 68 65 20 50 4b 20 6f 72 20 61  t of the PK or a
2120: 20 70 61 72 74 20 6f 66 20 61 6e 0a 2a 2a 20 20   part of an.**  
2130: 20 69 6e 64 65 78 2e 20 4f 72 20 63 6c 65 61 72   index. Or clear
2140: 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a   otherwise..**.*
2150: 2a 20 20 20 49 66 20 74 68 65 72 65 20 61 72 65  *   If there are
2160: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 70 61 72   one or more par
2170: 74 69 61 6c 20 69 6e 64 65 78 65 73 20 6f 6e 20  tial indexes on 
2180: 74 68 65 20 74 61 62 6c 65 2c 20 61 6c 6c 20 66  the table, all f
2190: 69 65 6c 64 73 20 6f 66 0a 2a 2a 20 20 20 74 68  ields of.**   th
21a0: 69 73 20 61 72 72 61 79 20 73 65 74 20 73 65 74  is array set set
21b0: 20 74 6f 20 31 2e 20 54 68 69 73 20 69 73 20 62   to 1. This is b
21c0: 65 63 61 75 73 65 20 69 6e 20 74 68 61 74 20 63  ecause in that c
21d0: 61 73 65 2c 20 74 68 65 20 6d 6f 64 75 6c 65 20  ase, the module 
21e0: 68 61 73 0a 2a 2a 20 20 20 6e 6f 20 77 61 79 20  has.**   no way 
21f0: 74 6f 20 74 65 6c 6c 20 77 68 69 63 68 20 66 69  to tell which fi
2200: 65 6c 64 73 20 77 69 6c 6c 20 62 65 20 72 65 71  elds will be req
2210: 75 69 72 65 64 20 74 6f 20 61 64 64 20 61 6e 64  uired to add and
2220: 20 72 65 6d 6f 76 65 20 65 6e 74 72 69 65 73 0a   remove entries.
2230: 2a 2a 20 20 20 66 72 6f 6d 20 74 68 65 20 70 61  **   from the pa
2240: 72 74 69 61 6c 20 69 6e 64 65 78 65 73 2e 0a 2a  rtial indexes..*
2250: 2a 20 20 20 0a 2a 2f 0a 73 74 72 75 63 74 20 52  *   .*/.struct R
2260: 62 75 4f 62 6a 49 74 65 72 20 7b 0a 20 20 73 71  buObjIter {.  sq
2270: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 54 62 6c  lite3_stmt *pTbl
2280: 49 74 65 72 3b 20 20 20 20 20 20 20 20 20 2f 2a  Iter;         /*
2290: 20 49 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   Iterate through
22a0: 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 73 71 6c   tables */.  sql
22b0: 69 74 65 33 5f 73 74 6d 74 20 2a 70 49 64 78 49  ite3_stmt *pIdxI
22c0: 74 65 72 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ter;         /* 
22d0: 49 6e 64 65 78 20 69 74 65 72 61 74 6f 72 20 2a  Index iterator *
22e0: 2f 0a 20 20 69 6e 74 20 6e 54 62 6c 43 6f 6c 3b  /.  int nTblCol;
22f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2300: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61      /* Size of a
2310: 7a 54 62 6c 43 6f 6c 5b 5d 20 61 72 72 61 79 20  zTblCol[] array 
2320: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a 54 62  */.  char **azTb
2330: 6c 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  lCol;           
2340: 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
2350: 20 75 6e 71 75 6f 74 65 64 20 74 61 72 67 65 74   unquoted target
2360: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f   column names */
2370: 0a 20 20 63 68 61 72 20 2a 2a 61 7a 54 62 6c 54  .  char **azTblT
2380: 79 70 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ype;            
2390: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 74     /* Array of t
23a0: 61 72 67 65 74 20 63 6f 6c 75 6d 6e 20 74 79 70  arget column typ
23b0: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 69 53  es */.  int *aiS
23c0: 72 63 4f 72 64 65 72 3b 20 20 20 20 20 20 20 20  rcOrder;        
23d0: 20 20 20 20 20 20 20 20 2f 2a 20 73 72 63 20 74          /* src t
23e0: 61 62 6c 65 20 63 6f 6c 20 2d 3e 20 74 61 72 67  able col -> targ
23f0: 65 74 20 74 61 62 6c 65 20 63 6f 6c 20 2a 2f 0a  et table col */.
2400: 20 20 75 38 20 2a 61 62 54 62 6c 50 6b 3b 20 20    u8 *abTblPk;  
2410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2420: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 66 6c    /* Array of fl
2430: 61 67 73 2c 20 73 65 74 20 6f 6e 20 74 61 72 67  ags, set on targ
2440: 65 74 20 50 4b 20 63 6f 6c 75 6d 6e 73 20 2a 2f  et PK columns */
2450: 0a 20 20 75 38 20 2a 61 62 4e 6f 74 4e 75 6c 6c  .  u8 *abNotNull
2460: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2470: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 66     /* Array of f
2480: 6c 61 67 73 2c 20 73 65 74 20 6f 6e 20 4e 4f 54  lags, set on NOT
2490: 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73 20 2a 2f   NULL columns */
24a0: 0a 20 20 75 38 20 2a 61 62 49 6e 64 65 78 65 64  .  u8 *abIndexed
24b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
24c0: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 66     /* Array of f
24d0: 6c 61 67 73 2c 20 73 65 74 20 6f 6e 20 69 6e 64  lags, set on ind
24e0: 65 78 65 64 20 26 20 50 4b 20 63 6f 6c 73 20 2a  exed & PK cols *
24f0: 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 3b 20 20  /.  int eType;  
2500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2510: 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 79 70      /* Table typ
2520: 65 20 2d 20 61 6e 20 52 42 55 5f 50 4b 5f 58 58  e - an RBU_PK_XX
2530: 58 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 2f 2a  X value */..  /*
2540: 20 4f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65   Output variable
2550: 73 2e 20 7a 54 62 6c 3d 3d 30 20 69 6d 70 6c 69  s. zTbl==0 impli
2560: 65 73 20 45 4f 46 2e 20 2a 2f 0a 20 20 69 6e 74  es EOF. */.  int
2570: 20 62 43 6c 65 61 6e 75 70 3b 20 20 20 20 20 20   bCleanup;      
2580: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2590: 54 72 75 65 20 69 6e 20 22 63 6c 65 61 6e 75 70  True in "cleanup
25a0: 22 20 73 74 61 74 65 20 2a 2f 0a 20 20 63 6f 6e  " state */.  con
25b0: 73 74 20 63 68 61 72 20 2a 7a 54 62 6c 3b 20 20  st char *zTbl;  
25c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25d0: 4e 61 6d 65 20 6f 66 20 74 61 72 67 65 74 20 64  Name of target d
25e0: 62 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63 6f 6e  b table */.  con
25f0: 73 74 20 63 68 61 72 20 2a 7a 44 61 74 61 54 62  st char *zDataTb
2600: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  l;           /* 
2610: 4e 61 6d 65 20 6f 66 20 72 62 75 20 64 62 20 74  Name of rbu db t
2620: 61 62 6c 65 20 28 6f 72 20 6e 75 6c 6c 29 20 2a  able (or null) *
2630: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
2640: 7a 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  zIdx;           
2650: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
2660: 61 72 67 65 74 20 64 62 20 69 6e 64 65 78 20 28  arget db index (
2670: 6f 72 20 6e 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e  or null) */.  in
2680: 74 20 69 54 6e 75 6d 3b 20 20 20 20 20 20 20 20  t iTnum;        
2690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26a0: 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 63 75   Root page of cu
26b0: 72 72 65 6e 74 20 6f 62 6a 65 63 74 20 2a 2f 0a  rrent object */.
26c0: 20 20 69 6e 74 20 69 50 6b 54 6e 75 6d 3b 20 20    int iPkTnum;  
26d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e0: 20 20 2f 2a 20 49 66 20 65 54 79 70 65 3d 3d 45    /* If eType==E
26f0: 58 54 45 52 4e 41 4c 2c 20 72 6f 6f 74 20 6f 66  XTERNAL, root of
2700: 20 50 4b 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69   PK index */.  i
2710: 6e 74 20 62 55 6e 69 71 75 65 3b 20 20 20 20 20  nt bUnique;     
2720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2730: 2a 20 43 75 72 72 65 6e 74 20 69 6e 64 65 78 20  * Current index 
2740: 69 73 20 75 6e 69 71 75 65 20 2a 2f 0a 20 20 69  is unique */.  i
2750: 6e 74 20 6e 49 6e 64 65 78 3b 20 20 20 20 20 20  nt nIndex;      
2760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2770: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 75 78 2e  * Number of aux.
2780: 20 69 6e 64 65 78 65 73 20 6f 6e 20 74 61 62 6c   indexes on tabl
2790: 65 20 7a 54 62 6c 20 2a 2f 0a 0a 20 20 2f 2a 20  e zTbl */..  /* 
27a0: 53 74 61 74 65 6d 65 6e 74 73 20 63 72 65 61 74  Statements creat
27b0: 65 64 20 62 79 20 72 62 75 4f 62 6a 49 74 65 72  ed by rbuObjIter
27c0: 50 72 65 70 61 72 65 41 6c 6c 28 29 20 2a 2f 0a  PrepareAll() */.
27d0: 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20    int nCol;     
27e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27f0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
2800: 6f 6c 75 6d 6e 73 20 69 6e 20 63 75 72 72 65 6e  olumns in curren
2810: 74 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71  t object */.  sq
2820: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 65 6c  lite3_stmt *pSel
2830: 65 63 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ect;          /*
2840: 20 53 6f 75 72 63 65 20 64 61 74 61 20 2a 2f 0a   Source data */.
2850: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
2860: 70 49 6e 73 65 72 74 3b 20 20 20 20 20 20 20 20  pInsert;        
2870: 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20 66    /* Statement f
2880: 6f 72 20 49 4e 53 45 52 54 20 6f 70 65 72 61 74  or INSERT operat
2890: 69 6f 6e 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ions */.  sqlite
28a0: 33 5f 73 74 6d 74 20 2a 70 44 65 6c 65 74 65 3b  3_stmt *pDelete;
28b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61            /* Sta
28c0: 74 65 6d 65 6e 74 20 66 6f 72 20 44 45 4c 45 54  tement for DELET
28d0: 45 20 6f 70 73 20 2a 2f 0a 20 20 73 71 6c 69 74  E ops */.  sqlit
28e0: 65 33 5f 73 74 6d 74 20 2a 70 54 6d 70 49 6e 73  e3_stmt *pTmpIns
28f0: 65 72 74 3b 20 20 20 20 20 20 20 2f 2a 20 49 6e  ert;       /* In
2900: 73 65 72 74 20 69 6e 74 6f 20 72 62 75 5f 74 6d  sert into rbu_tm
2910: 70 5f 24 7a 44 61 74 61 54 62 6c 20 2a 2f 0a 0a  p_$zDataTbl */..
2920: 20 20 2f 2a 20 4c 61 73 74 20 55 50 44 41 54 45    /* Last UPDATE
2930: 20 75 73 65 64 20 28 66 6f 72 20 50 4b 20 62 2d   used (for PK b-
2940: 74 72 65 65 20 75 70 64 61 74 65 73 20 6f 6e 6c  tree updates onl
2950: 79 29 2c 20 6f 72 20 4e 55 4c 4c 2e 20 2a 2f 0a  y), or NULL. */.
2960: 20 20 52 62 75 55 70 64 61 74 65 53 74 6d 74 20    RbuUpdateStmt 
2970: 2a 70 52 62 75 55 70 64 61 74 65 3b 0a 7d 3b 0a  *pRbuUpdate;.};.
2980: 0a 2f 2a 0a 2a 2a 20 56 61 6c 75 65 73 20 66 6f  ./*.** Values fo
2990: 72 20 52 62 75 4f 62 6a 49 74 65 72 2e 65 54 79  r RbuObjIter.eTy
29a0: 70 65 0a 2a 2a 0a 2a 2a 20 20 20 20 20 30 3a 20  pe.**.**     0: 
29b0: 54 61 62 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65  Table does not e
29c0: 78 69 73 74 20 28 65 72 72 6f 72 29 0a 2a 2a 20  xist (error).** 
29d0: 20 20 20 20 31 3a 20 54 61 62 6c 65 20 68 61 73      1: Table has
29e0: 20 61 6e 20 69 6d 70 6c 69 63 69 74 20 72 6f 77   an implicit row
29f0: 69 64 2e 0a 2a 2a 20 20 20 20 20 32 3a 20 54 61  id..**     2: Ta
2a00: 62 6c 65 20 68 61 73 20 61 6e 20 65 78 70 6c 69  ble has an expli
2a10: 63 69 74 20 49 50 4b 20 63 6f 6c 75 6d 6e 2e 0a  cit IPK column..
2a20: 2a 2a 20 20 20 20 20 33 3a 20 54 61 62 6c 65 20  **     3: Table 
2a30: 68 61 73 20 61 6e 20 65 78 74 65 72 6e 61 6c 20  has an external 
2a40: 50 4b 20 69 6e 64 65 78 2e 0a 2a 2a 20 20 20 20  PK index..**    
2a50: 20 34 3a 20 54 61 62 6c 65 20 69 73 20 57 49 54   4: Table is WIT
2a60: 48 4f 55 54 20 52 4f 57 49 44 2e 0a 2a 2a 20 20  HOUT ROWID..**  
2a70: 20 20 20 35 3a 20 54 61 62 6c 65 20 69 73 20 61     5: Table is a
2a80: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a   virtual table..
2a90: 2a 2f 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 50  */.#define RBU_P
2aa0: 4b 5f 4e 4f 54 41 42 4c 45 20 20 20 20 20 20 20  K_NOTABLE       
2ab0: 20 30 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 50   0.#define RBU_P
2ac0: 4b 5f 4e 4f 4e 45 20 20 20 20 20 20 20 20 20 20  K_NONE          
2ad0: 20 31 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 50   1.#define RBU_P
2ae0: 4b 5f 49 50 4b 20 20 20 20 20 20 20 20 20 20 20  K_IPK           
2af0: 20 32 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 50   2.#define RBU_P
2b00: 4b 5f 45 58 54 45 52 4e 41 4c 20 20 20 20 20 20  K_EXTERNAL      
2b10: 20 33 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 50   3.#define RBU_P
2b20: 4b 5f 57 49 54 48 4f 55 54 5f 52 4f 57 49 44 20  K_WITHOUT_ROWID 
2b30: 20 34 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 50   4.#define RBU_P
2b40: 4b 5f 56 54 41 42 20 20 20 20 20 20 20 20 20 20  K_VTAB          
2b50: 20 35 0a 0a 0a 2f 2a 0a 2a 2a 20 57 69 74 68 69   5.../*.** Withi
2b60: 6e 20 74 68 65 20 52 42 55 5f 53 54 41 47 45 5f  n the RBU_STAGE_
2b70: 4f 41 4c 20 73 74 61 67 65 2c 20 65 61 63 68 20  OAL stage, each 
2b80: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 72  call to sqlite3r
2b90: 62 75 5f 73 74 65 70 28 29 20 70 65 72 66 6f 72  bu_step() perfor
2ba0: 6d 73 0a 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65  ms.** one of the
2bb0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70 65 72 61   following opera
2bc0: 74 69 6f 6e 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e  tions..*/.#defin
2bd0: 65 20 52 42 55 5f 49 4e 53 45 52 54 20 20 20 20  e RBU_INSERT    
2be0: 20 31 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49   1          /* I
2bf0: 6e 73 65 72 74 20 6f 6e 20 61 20 6d 61 69 6e 20  nsert on a main 
2c00: 74 61 62 6c 65 20 62 2d 74 72 65 65 20 2a 2f 0a  table b-tree */.
2c10: 23 64 65 66 69 6e 65 20 52 42 55 5f 44 45 4c 45  #define RBU_DELE
2c20: 54 45 20 20 20 20 20 32 20 20 20 20 20 20 20 20  TE     2        
2c30: 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 20 72 6f    /* Delete a ro
2c40: 77 20 66 72 6f 6d 20 61 20 6d 61 69 6e 20 74 61  w from a main ta
2c50: 62 6c 65 20 62 2d 74 72 65 65 20 2a 2f 0a 23 64  ble b-tree */.#d
2c60: 65 66 69 6e 65 20 52 42 55 5f 52 45 50 4c 41 43  efine RBU_REPLAC
2c70: 45 20 20 20 20 33 20 20 20 20 20 20 20 20 20 20  E    3          
2c80: 2f 2a 20 44 65 6c 65 74 65 20 61 6e 64 20 74 68  /* Delete and th
2c90: 65 6e 20 69 6e 73 65 72 74 20 61 20 72 6f 77 20  en insert a row 
2ca0: 2a 2f 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 49  */.#define RBU_I
2cb0: 44 58 5f 44 45 4c 45 54 45 20 34 20 20 20 20 20  DX_DELETE 4     
2cc0: 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 61       /* Delete a
2cd0: 20 72 6f 77 20 66 72 6f 6d 20 61 6e 20 61 75 78   row from an aux
2ce0: 2e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20 2a  . index b-tree *
2cf0: 2f 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 49 44  /.#define RBU_ID
2d00: 58 5f 49 4e 53 45 52 54 20 35 20 20 20 20 20 20  X_INSERT 5      
2d10: 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 6f 6e      /* Insert on
2d20: 20 61 6e 20 61 75 78 2e 20 69 6e 64 65 78 20 62   an aux. index b
2d30: 2d 74 72 65 65 20 2a 2f 0a 0a 23 64 65 66 69 6e  -tree */..#defin
2d40: 65 20 52 42 55 5f 55 50 44 41 54 45 20 20 20 20  e RBU_UPDATE    
2d50: 20 36 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55   6          /* U
2d60: 70 64 61 74 65 20 61 20 72 6f 77 20 69 6e 20 61  pdate a row in a
2d70: 20 6d 61 69 6e 20 74 61 62 6c 65 20 62 2d 74 72   main table b-tr
2d80: 65 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 20 73  ee */../*.** A s
2d90: 69 6e 67 6c 65 20 73 74 65 70 20 6f 66 20 61 6e  ingle step of an
2da0: 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 63 68 65   incremental che
2db0: 63 6b 70 6f 69 6e 74 20 2d 20 66 72 61 6d 65 20  ckpoint - frame 
2dc0: 69 57 61 6c 46 72 61 6d 65 20 6f 66 20 74 68 65  iWalFrame of the
2dd0: 20 77 61 6c 0a 2a 2a 20 66 69 6c 65 20 73 68 6f   wal.** file sho
2de0: 75 6c 64 20 62 65 20 63 6f 70 69 65 64 20 74 6f  uld be copied to
2df0: 20 70 61 67 65 20 69 44 62 50 61 67 65 20 6f 66   page iDbPage of
2e00: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2e10: 6c 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 52 62  le..*/.struct Rb
2e20: 75 46 72 61 6d 65 20 7b 0a 20 20 75 33 32 20 69  uFrame {.  u32 i
2e30: 44 62 50 61 67 65 3b 0a 20 20 75 33 32 20 69 57  DbPage;.  u32 iW
2e40: 61 6c 46 72 61 6d 65 3b 0a 7d 3b 0a 0a 2f 2a 0a  alFrame;.};../*.
2e50: 2a 2a 20 52 42 55 20 68 61 6e 64 6c 65 2e 0a 2a  ** RBU handle..*
2e60: 2a 0a 2a 2a 20 6e 50 68 61 73 65 4f 6e 65 53 74  *.** nPhaseOneSt
2e70: 65 70 3a 0a 2a 2a 20 20 20 49 66 20 74 68 65 20  ep:.**   If the 
2e80: 52 42 55 20 64 61 74 61 62 61 73 65 20 63 6f 6e  RBU database con
2e90: 74 61 69 6e 73 20 61 6e 20 72 62 75 5f 63 6f 75  tains an rbu_cou
2ea0: 6e 74 20 74 61 62 6c 65 2c 20 74 68 69 73 20 76  nt table, this v
2eb0: 61 6c 75 65 20 69 73 20 73 65 74 20 74 6f 0a 2a  alue is set to.*
2ec0: 2a 20 20 20 61 20 72 75 6e 6e 69 6e 67 20 65 73  *   a running es
2ed0: 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75  timate of the nu
2ee0: 6d 62 65 72 20 6f 66 20 62 2d 74 72 65 65 20 6f  mber of b-tree o
2ef0: 70 65 72 61 74 69 6f 6e 73 20 72 65 71 75 69 72  perations requir
2f00: 65 64 20 74 6f 20 0a 2a 2a 20 20 20 66 69 6e 69  ed to .**   fini
2f10: 73 68 20 70 6f 70 75 6c 61 74 69 6e 67 20 74 68  sh populating th
2f20: 65 20 2a 2d 6f 61 6c 20 66 69 6c 65 2e 20 54 68  e *-oal file. Th
2f30: 69 73 20 61 6c 6c 6f 77 73 20 74 68 65 20 73 71  is allows the sq
2f40: 6c 69 74 65 33 5f 62 70 5f 70 72 6f 67 72 65 73  lite3_bp_progres
2f50: 73 28 29 0a 2a 2a 20 20 20 41 50 49 20 74 6f 20  s().**   API to 
2f60: 63 61 6c 63 75 6c 61 74 65 20 74 68 65 20 70 65  calculate the pe
2f70: 72 6d 79 72 69 61 64 61 67 65 20 70 72 6f 67 72  rmyriadage progr
2f80: 65 73 73 20 6f 66 20 70 6f 70 75 6c 61 74 69 6e  ess of populatin
2f90: 67 20 74 68 65 20 2a 2d 6f 61 6c 20 66 69 6c 65  g the *-oal file
2fa0: 0a 2a 2a 20 20 20 75 73 69 6e 67 20 74 68 65 20  .**   using the 
2fb0: 66 6f 72 6d 75 6c 61 3a 0a 2a 2a 0a 2a 2a 20 20  formula:.**.**  
2fc0: 20 20 20 70 65 72 6d 79 72 69 61 64 61 67 65 20     permyriadage 
2fd0: 3d 20 28 31 30 30 30 30 20 2a 20 6e 50 72 6f 67  = (10000 * nProg
2fe0: 72 65 73 73 29 20 2f 20 6e 50 68 61 73 65 4f 6e  ress) / nPhaseOn
2ff0: 65 53 74 65 70 0a 2a 2a 0a 2a 2a 20 20 20 6e 50  eStep.**.**   nP
3000: 68 61 73 65 4f 6e 65 53 74 65 70 20 69 73 20 69  haseOneStep is i
3010: 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 74 68  nitialized to th
3020: 65 20 73 75 6d 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20  e sum of:.**.** 
3030: 20 20 20 20 6e 52 6f 77 20 2a 20 28 6e 49 6e 64      nRow * (nInd
3040: 65 78 20 2b 20 31 29 0a 2a 2a 0a 2a 2a 20 20 20  ex + 1).**.**   
3050: 66 6f 72 20 61 6c 6c 20 73 6f 75 72 63 65 20 74  for all source t
3060: 61 62 6c 65 73 20 69 6e 20 74 68 65 20 52 42 55  ables in the RBU
3070: 20 64 61 74 61 62 61 73 65 2c 20 77 68 65 72 65   database, where
3080: 20 6e 52 6f 77 20 69 73 20 74 68 65 20 6e 75 6d   nRow is the num
3090: 62 65 72 0a 2a 2a 20 20 20 6f 66 20 72 6f 77 73  ber.**   of rows
30a0: 20 69 6e 20 74 68 65 20 73 6f 75 72 63 65 20 74   in the source t
30b0: 61 62 6c 65 20 61 6e 64 20 6e 49 6e 64 65 78 20  able and nIndex 
30c0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e  the number of in
30d0: 64 65 78 65 73 20 6f 6e 20 74 68 65 0a 2a 2a 20  dexes on the.** 
30e0: 20 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20    corresponding 
30f0: 74 61 72 67 65 74 20 64 61 74 61 62 61 73 65 20  target database 
3100: 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 54  table..**.**   T
3110: 68 69 73 20 65 73 74 69 6d 61 74 65 20 69 73 20  his estimate is 
3120: 61 63 63 75 72 61 74 65 20 69 66 20 74 68 65 20  accurate if the 
3130: 52 42 55 20 75 70 64 61 74 65 20 63 6f 6e 73 69  RBU update consi
3140: 73 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 66 0a  sts entirely of.
3150: 2a 2a 20 20 20 49 4e 53 45 52 54 20 6f 70 65 72  **   INSERT oper
3160: 61 74 69 6f 6e 73 2e 20 48 6f 77 65 76 65 72 2c  ations. However,
3170: 20 69 74 20 69 73 20 69 6e 61 63 63 75 72 61 74   it is inaccurat
3180: 65 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  e if:.**.**     
3190: 2a 20 74 68 65 20 52 42 55 20 75 70 64 61 74 65  * the RBU update
31a0: 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 55 50   contains any UP
31b0: 44 41 54 45 20 6f 70 65 72 61 74 69 6f 6e 73 2e  DATE operations.
31c0: 20 49 66 20 74 68 65 20 50 4b 20 73 70 65 63 69   If the PK speci
31d0: 66 69 65 64 0a 2a 2a 20 20 20 20 20 20 20 66 6f  fied.**       fo
31e0: 72 20 61 6e 20 55 50 44 41 54 45 20 6f 70 65 72  r an UPDATE oper
31f0: 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65  ation does not e
3200: 78 69 73 74 20 69 6e 20 74 68 65 20 74 61 72 67  xist in the targ
3210: 65 74 20 74 61 62 6c 65 2c 20 74 68 65 6e 0a 2a  et table, then.*
3220: 2a 20 20 20 20 20 20 20 6e 6f 20 62 2d 74 72 65  *       no b-tre
3230: 65 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 72 65  e operations are
3240: 20 72 65 71 75 69 72 65 64 20 6f 6e 20 69 6e 64   required on ind
3250: 65 78 20 62 2d 74 72 65 65 73 2e 20 4f 72 20 69  ex b-trees. Or i
3260: 66 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 20  f the .**       
3270: 73 70 65 63 69 66 69 65 64 20 50 4b 20 64 6f 65  specified PK doe
3280: 73 20 65 78 69 73 74 2c 20 74 68 65 6e 20 28 6e  s exist, then (n
3290: 49 6e 64 65 78 2a 32 29 20 73 75 63 68 20 6f 70  Index*2) such op
32a0: 65 72 61 74 69 6f 6e 73 20 61 72 65 0a 2a 2a 20  erations are.** 
32b0: 20 20 20 20 20 20 72 65 71 75 69 72 65 64 20 28        required (
32c0: 6f 6e 65 20 64 65 6c 65 74 65 20 61 6e 64 20 6f  one delete and o
32d0: 6e 65 20 69 6e 73 65 72 74 20 6f 6e 20 65 61 63  ne insert on eac
32e0: 68 20 69 6e 64 65 78 20 62 2d 74 72 65 65 29 2e  h index b-tree).
32f0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 74 68 65  .**.**     * the
3300: 20 52 42 55 20 75 70 64 61 74 65 20 63 6f 6e 74   RBU update cont
3310: 61 69 6e 73 20 61 6e 79 20 44 45 4c 45 54 45 20  ains any DELETE 
3320: 6f 70 65 72 61 74 69 6f 6e 73 20 66 6f 72 20 77  operations for w
3330: 68 69 63 68 20 74 68 65 20 73 70 65 63 69 66 69  hich the specifi
3340: 65 64 0a 2a 2a 20 20 20 20 20 20 20 50 4b 20 64  ed.**       PK d
3350: 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 20 49  oes not exist. I
3360: 6e 20 74 68 69 73 20 63 61 73 65 20 6e 6f 20 6f  n this case no o
3370: 70 65 72 61 74 69 6f 6e 73 20 61 72 65 20 72 65  perations are re
3380: 71 75 69 72 65 64 20 6f 6e 20 69 6e 64 65 78 0a  quired on index.
3390: 2a 2a 20 20 20 20 20 20 20 62 2d 74 72 65 65 73  **       b-trees
33a0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 74 68  ..**.**     * th
33b0: 65 20 52 42 55 20 75 70 64 61 74 65 20 63 6f 6e  e RBU update con
33c0: 74 61 69 6e 73 20 52 45 50 4c 41 43 45 20 6f 70  tains REPLACE op
33d0: 65 72 61 74 69 6f 6e 73 2e 20 54 68 65 73 65 20  erations. These 
33e0: 61 72 65 20 73 69 6d 69 6c 61 72 20 74 6f 0a 2a  are similar to.*
33f0: 2a 20 20 20 20 20 20 20 55 50 44 41 54 45 20 6f  *       UPDATE o
3400: 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a  perations..**.**
3410: 20 20 20 6e 50 68 61 73 65 4f 6e 65 53 74 65 70     nPhaseOneStep
3420: 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 61   is updated to a
3430: 63 63 6f 75 6e 74 20 66 6f 72 20 74 68 65 20 63  ccount for the c
3440: 6f 6e 64 69 74 69 6f 6e 73 20 61 62 6f 76 65 20  onditions above 
3450: 64 75 72 69 6e 67 20 74 68 65 0a 2a 2a 20 20 20  during the.**   
3460: 66 69 72 73 74 20 70 61 73 73 20 6f 66 20 65 61  first pass of ea
3470: 63 68 20 73 6f 75 72 63 65 20 74 61 62 6c 65 2e  ch source table.
3480: 20 54 68 65 20 75 70 64 61 74 65 64 20 6e 50 68   The updated nPh
3490: 61 73 65 4f 6e 65 53 74 65 70 20 76 61 6c 75 65  aseOneStep value
34a0: 20 69 73 0a 2a 2a 20 20 20 73 74 6f 72 65 64 20   is.**   stored 
34b0: 69 6e 20 74 68 65 20 72 62 75 5f 73 74 61 74 65  in the rbu_state
34c0: 20 74 61 62 6c 65 20 69 66 20 74 68 65 20 52 42   table if the RB
34d0: 55 20 75 70 64 61 74 65 20 69 73 20 73 75 73 70  U update is susp
34e0: 65 6e 64 65 64 2e 0a 2a 2f 0a 73 74 72 75 63 74  ended..*/.struct
34f0: 20 73 71 6c 69 74 65 33 72 62 75 20 7b 0a 20 20   sqlite3rbu {.  
3500: 69 6e 74 20 65 53 74 61 67 65 3b 20 20 20 20 20  int eStage;     
3510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3520: 2f 2a 20 56 61 6c 75 65 20 6f 66 20 52 42 55 5f  /* Value of RBU_
3530: 53 54 41 54 45 5f 53 54 41 47 45 20 66 69 65 6c  STATE_STAGE fiel
3540: 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  d */.  sqlite3 *
3550: 64 62 4d 61 69 6e 3b 20 20 20 20 20 20 20 20 20  dbMain;         
3560: 20 20 20 20 20 20 20 2f 2a 20 74 61 72 67 65 74         /* target
3570: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
3580: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
3590: 62 52 62 75 3b 20 20 20 20 20 20 20 20 20 20 20  bRbu;           
35a0: 20 20 20 20 20 20 2f 2a 20 72 62 75 20 64 61 74        /* rbu dat
35b0: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  abase handle */.
35c0: 20 20 63 68 61 72 20 2a 7a 54 61 72 67 65 74 3b    char *zTarget;
35d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35e0: 20 20 2f 2a 20 50 61 74 68 20 74 6f 20 74 61 72    /* Path to tar
35f0: 67 65 74 20 64 62 20 2a 2f 0a 20 20 63 68 61 72  get db */.  char
3600: 20 2a 7a 52 62 75 3b 20 20 20 20 20 20 20 20 20   *zRbu;         
3610: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
3620: 61 74 68 20 74 6f 20 72 62 75 20 64 62 20 2a 2f  ath to rbu db */
3630: 0a 20 20 63 68 61 72 20 2a 7a 53 74 61 74 65 3b  .  char *zState;
3640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3650: 20 20 20 2f 2a 20 50 61 74 68 20 74 6f 20 73 74     /* Path to st
3660: 61 74 65 20 64 62 20 28 6f 72 20 4e 55 4c 4c 20  ate db (or NULL 
3670: 69 66 20 7a 52 62 75 29 20 2a 2f 0a 20 20 63 68  if zRbu) */.  ch
3680: 61 72 20 7a 53 74 61 74 65 44 62 5b 35 5d 3b 20  ar zStateDb[5]; 
3690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
36a0: 20 44 62 20 6e 61 6d 65 20 66 6f 72 20 73 74 61   Db name for sta
36b0: 74 65 20 28 22 73 74 61 74 22 20 6f 72 20 22 6d  te ("stat" or "m
36c0: 61 69 6e 22 29 20 2a 2f 0a 20 20 69 6e 74 20 72  ain") */.  int r
36d0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
36e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
36f0: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
3700: 6c 61 73 74 20 72 62 75 5f 73 74 65 70 28 29 20  last rbu_step() 
3710: 63 61 6c 6c 20 2a 2f 0a 20 20 63 68 61 72 20 2a  call */.  char *
3720: 7a 45 72 72 6d 73 67 3b 20 20 20 20 20 20 20 20  zErrmsg;        
3730: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72            /* Err
3740: 6f 72 20 6d 65 73 73 61 67 65 20 69 66 20 72 63  or message if rc
3750: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 2a 2f 0a 20  !=SQLITE_OK */. 
3760: 20 69 6e 74 20 6e 53 74 65 70 3b 20 20 20 20 20   int nStep;     
3770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3780: 20 2f 2a 20 52 6f 77 73 20 70 72 6f 63 65 73 73   /* Rows process
3790: 65 64 20 66 6f 72 20 63 75 72 72 65 6e 74 20 6f  ed for current o
37a0: 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  bject */.  int n
37b0: 50 72 6f 67 72 65 73 73 3b 20 20 20 20 20 20 20  Progress;       
37c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
37d0: 77 73 20 70 72 6f 63 65 73 73 65 64 20 66 6f 72  ws processed for
37e0: 20 61 6c 6c 20 6f 62 6a 65 63 74 73 20 2a 2f 0a   all objects */.
37f0: 20 20 52 62 75 4f 62 6a 49 74 65 72 20 6f 62 6a    RbuObjIter obj
3800: 69 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  iter;           
3810: 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 66 6f    /* Iterator fo
3820: 72 20 73 6b 69 70 70 69 6e 67 20 74 68 72 6f 75  r skipping throu
3830: 67 68 20 74 62 6c 2f 69 64 78 20 2a 2f 0a 20 20  gh tbl/idx */.  
3840: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73  const char *zVfs
3850: 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  Name;           
3860: 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 75 74 6f 6d  /* Name of autom
3870: 61 74 69 63 61 6c 6c 79 20 63 72 65 61 74 65 64  atically created
3880: 20 72 62 75 20 76 66 73 20 2a 2f 0a 20 20 72 62   rbu vfs */.  rb
3890: 75 5f 66 69 6c 65 20 2a 70 54 61 72 67 65 74 46  u_file *pTargetF
38a0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  d;            /*
38b0: 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 6f 70 65   File handle ope
38c0: 6e 20 6f 6e 20 74 61 72 67 65 74 20 64 62 20 2a  n on target db *
38d0: 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 50 65 72  /.  int nPagePer
38e0: 53 65 63 74 6f 72 3b 20 20 20 20 20 20 20 20 20  Sector;         
38f0: 20 20 20 20 2f 2a 20 50 61 67 65 73 20 70 65 72      /* Pages per
3900: 20 73 65 63 74 6f 72 20 66 6f 72 20 70 54 61 72   sector for pTar
3910: 67 65 74 46 64 20 2a 2f 0a 20 20 69 36 34 20 69  getFd */.  i64 i
3920: 4f 61 6c 53 7a 3b 0a 20 20 69 36 34 20 6e 50 68  OalSz;.  i64 nPh
3930: 61 73 65 4f 6e 65 53 74 65 70 3b 0a 0a 20 20 2f  aseOneStep;..  /
3940: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
3950: 73 74 61 74 65 20 76 61 72 69 61 62 6c 65 73 20  state variables 
3960: 61 72 65 20 75 73 65 64 20 61 73 20 70 61 72 74  are used as part
3970: 20 6f 66 20 74 68 65 20 69 6e 63 72 65 6d 65 6e   of the incremen
3980: 74 61 6c 0a 20 20 2a 2a 20 63 68 65 63 6b 70 6f  tal.  ** checkpo
3990: 69 6e 74 20 73 74 61 67 65 20 28 65 53 74 61 67  int stage (eStag
39a0: 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 43 4b 50  e==RBU_STAGE_CKP
39b0: 54 29 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73  T). See comments
39c0: 20 73 75 72 72 6f 75 6e 64 69 6e 67 0a 20 20 2a   surrounding.  *
39d0: 2a 20 66 75 6e 63 74 69 6f 6e 20 72 62 75 53 65  * function rbuSe
39e0: 74 75 70 43 68 65 63 6b 70 6f 69 6e 74 28 29 20  tupCheckpoint() 
39f0: 66 6f 72 20 64 65 74 61 69 6c 73 2e 20 20 2a 2f  for details.  */
3a00: 0a 20 20 75 33 32 20 69 4d 61 78 46 72 61 6d 65  .  u32 iMaxFrame
3a10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3a20: 20 20 20 2f 2a 20 4c 61 72 67 65 73 74 20 69 57     /* Largest iW
3a30: 61 6c 46 72 61 6d 65 20 76 61 6c 75 65 20 69 6e  alFrame value in
3a40: 20 61 46 72 61 6d 65 5b 5d 20 2a 2f 0a 20 20 75   aFrame[] */.  u
3a50: 33 32 20 6d 4c 6f 63 6b 3b 0a 20 20 69 6e 74 20  32 mLock;.  int 
3a60: 6e 46 72 61 6d 65 3b 20 20 20 20 20 20 20 20 20  nFrame;         
3a70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
3a80: 6e 74 72 69 65 73 20 69 6e 20 61 46 72 61 6d 65  ntries in aFrame
3a90: 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e  [] array */.  in
3aa0: 74 20 6e 46 72 61 6d 65 41 6c 6c 6f 63 3b 20 20  t nFrameAlloc;  
3ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3ac0: 20 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65 20   Allocated size 
3ad0: 6f 66 20 61 46 72 61 6d 65 5b 5d 20 61 72 72 61  of aFrame[] arra
3ae0: 79 20 2a 2f 0a 20 20 52 62 75 46 72 61 6d 65 20  y */.  RbuFrame 
3af0: 2a 61 46 72 61 6d 65 3b 0a 20 20 69 6e 74 20 70  *aFrame;.  int p
3b00: 67 73 7a 3b 0a 20 20 75 38 20 2a 61 42 75 66 3b  gsz;.  u8 *aBuf;
3b10: 0a 20 20 69 36 34 20 69 57 61 6c 43 6b 73 75 6d  .  i64 iWalCksum
3b20: 3b 0a 20 20 69 36 34 20 73 7a 54 65 6d 70 3b 20  ;.  i64 szTemp; 
3b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b40: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73      /* Current s
3b50: 69 7a 65 20 6f 66 20 61 6c 6c 20 74 65 6d 70 20  ize of all temp 
3b60: 66 69 6c 65 73 20 69 6e 20 75 73 65 20 2a 2f 0a  files in use */.
3b70: 20 20 69 36 34 20 73 7a 54 65 6d 70 4c 69 6d 69    i64 szTempLimi
3b80: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
3b90: 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20    /* Total size 
3ba0: 6c 69 6d 69 74 20 66 6f 72 20 74 65 6d 70 20 66  limit for temp f
3bb0: 69 6c 65 73 20 2a 2f 0a 0a 20 20 2f 2a 20 55 73  iles */..  /* Us
3bc0: 65 64 20 69 6e 20 52 42 55 20 76 61 63 75 75 6d  ed in RBU vacuum
3bd0: 20 6d 6f 64 65 20 6f 6e 6c 79 20 2a 2f 0a 20 20   mode only */.  
3be0: 69 6e 74 20 6e 52 62 75 3b 20 20 20 20 20 20 20  int nRbu;       
3bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c00: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 42 55  /* Number of RBU
3c10: 20 56 46 53 20 69 6e 20 74 68 65 20 73 74 61 63   VFS in the stac
3c20: 6b 20 2a 2f 0a 20 20 72 62 75 5f 66 69 6c 65 20  k */.  rbu_file 
3c30: 2a 70 52 62 75 46 64 3b 20 20 20 20 20 20 20 20  *pRbuFd;        
3c40: 20 20 20 20 20 20 20 2f 2a 20 46 64 20 66 6f 72         /* Fd for
3c50: 20 6d 61 69 6e 20 64 62 20 6f 66 20 64 62 52 62   main db of dbRb
3c60: 75 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  u */.};../*.** A
3c70: 6e 20 72 62 75 20 56 46 53 20 69 73 20 69 6d 70  n rbu VFS is imp
3c80: 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e 67 20 61  lemented using a
3c90: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
3ca0: 69 73 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  is structure..**
3cb0: 0a 2a 2a 20 56 61 72 69 61 62 6c 65 20 70 52 62  .** Variable pRb
3cc0: 75 20 69 73 20 6f 6e 6c 79 20 6e 6f 6e 2d 4e 55  u is only non-NU
3cd0: 4c 4c 20 66 6f 72 20 61 75 74 6f 6d 61 74 69 63  LL for automatic
3ce0: 61 6c 6c 79 20 63 72 65 61 74 65 64 20 52 42 55  ally created RBU
3cf0: 20 56 46 53 20 6f 62 6a 65 63 74 73 2e 0a 2a 2a   VFS objects..**
3d00: 20 49 74 20 69 73 20 4e 55 4c 4c 20 66 6f 72 20   It is NULL for 
3d10: 52 42 55 20 56 46 53 20 6f 62 6a 65 63 74 73 20  RBU VFS objects 
3d20: 63 72 65 61 74 65 64 20 65 78 70 6c 69 63 69 74  created explicit
3d30: 6c 79 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69  ly using.** sqli
3d40: 74 65 33 72 62 75 5f 63 72 65 61 74 65 5f 76 66  te3rbu_create_vf
3d50: 73 28 29 2e 20 49 74 20 69 73 20 75 73 65 64 20  s(). It is used 
3d60: 74 6f 20 74 72 61 63 6b 20 74 68 65 20 74 6f 74  to track the tot
3d70: 61 6c 20 61 6d 6f 75 6e 74 20 6f 66 20 74 65 6d  al amount of tem
3d80: 70 0a 2a 2a 20 73 70 61 63 65 20 75 73 65 64 20  p.** space used 
3d90: 62 79 20 74 68 65 20 52 42 55 20 68 61 6e 64 6c  by the RBU handl
3da0: 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 72 62 75  e..*/.struct rbu
3db0: 5f 76 66 73 20 7b 0a 20 20 73 71 6c 69 74 65 33  _vfs {.  sqlite3
3dc0: 5f 76 66 73 20 62 61 73 65 3b 20 20 20 20 20 20  _vfs base;      
3dd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 72 62 75 20           /* rbu 
3de0: 56 46 53 20 73 68 69 6d 20 6d 65 74 68 6f 64 73  VFS shim methods
3df0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66   */.  sqlite3_vf
3e00: 73 20 2a 70 52 65 61 6c 56 66 73 3b 20 20 20 20  s *pRealVfs;    
3e10: 20 20 20 20 20 20 2f 2a 20 55 6e 64 65 72 6c 79        /* Underly
3e20: 69 6e 67 20 56 46 53 20 2a 2f 0a 20 20 73 71 6c  ing VFS */.  sql
3e30: 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65  ite3_mutex *mute
3e40: 78 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  x;           /* 
3e50: 4d 75 74 65 78 20 74 6f 20 70 72 6f 74 65 63 74  Mutex to protect
3e60: 20 70 4d 61 69 6e 20 2a 2f 0a 20 20 73 71 6c 69   pMain */.  sqli
3e70: 74 65 33 72 62 75 20 2a 70 52 62 75 3b 20 20 20  te3rbu *pRbu;   
3e80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
3e90: 77 6e 65 72 20 52 42 55 20 6f 62 6a 65 63 74 20  wner RBU object 
3ea0: 2a 2f 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a 70  */.  rbu_file *p
3eb0: 4d 61 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20  Main;           
3ec0: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
3ed0: 6d 61 69 6e 20 64 62 20 66 69 6c 65 73 20 2a 2f  main db files */
3ee0: 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 4d 61  .  rbu_file *pMa
3ef0: 69 6e 52 62 75 3b 20 20 20 20 20 20 20 20 20 20  inRbu;          
3f00: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 6d 61     /* List of ma
3f10: 69 6e 20 64 62 20 66 69 6c 65 73 20 77 69 74 68  in db files with
3f20: 20 70 52 62 75 21 3d 30 20 2a 2f 0a 7d 3b 0a 0a   pRbu!=0 */.};..
3f30: 2f 2a 0a 2a 2a 20 45 61 63 68 20 66 69 6c 65 20  /*.** Each file 
3f40: 6f 70 65 6e 65 64 20 62 79 20 61 6e 20 72 62 75  opened by an rbu
3f50: 20 56 46 53 20 69 73 20 72 65 70 72 65 73 65 6e   VFS is represen
3f60: 74 65 64 20 62 79 20 61 6e 20 69 6e 73 74 61 6e  ted by an instan
3f70: 63 65 20 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 6c  ce of.** the fol
3f80: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
3f90: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20  ..**.** If this 
3fa0: 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  is a temporary f
3fb0: 69 6c 65 20 28 70 52 62 75 21 3d 30 20 26 26 20  ile (pRbu!=0 && 
3fc0: 66 6c 61 67 73 26 44 45 4c 45 54 45 5f 4f 4e 5f  flags&DELETE_ON_
3fd0: 43 4c 4f 53 45 29 2c 20 76 61 72 69 61 62 6c 65  CLOSE), variable
3fe0: 0a 2a 2a 20 22 73 7a 22 20 69 73 20 73 65 74 20  .** "sz" is set 
3ff0: 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  to the current s
4000: 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
4010: 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 72  ase file..*/.str
4020: 75 63 74 20 72 62 75 5f 66 69 6c 65 20 7b 0a 20  uct rbu_file {. 
4030: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 62 61   sqlite3_file ba
4040: 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
4050: 20 2f 2a 20 73 71 6c 69 74 65 33 5f 66 69 6c 65   /* sqlite3_file
4060: 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 20 20 73 71   methods */.  sq
4070: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 52 65 61  lite3_file *pRea
4080: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  l;            /*
4090: 20 55 6e 64 65 72 6c 79 69 6e 67 20 66 69 6c 65   Underlying file
40a0: 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 72 62 75   handle */.  rbu
40b0: 5f 76 66 73 20 2a 70 52 62 75 56 66 73 3b 20 20  _vfs *pRbuVfs;  
40c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
40d0: 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 72  Pointer to the r
40e0: 62 75 5f 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f  bu_vfs object */
40f0: 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20 2a 70  .  sqlite3rbu *p
4100: 52 62 75 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rbu;            
4110: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
4120: 20 72 62 75 20 6f 62 6a 65 63 74 20 28 72 62 75   rbu object (rbu
4130: 20 74 61 72 67 65 74 20 6f 6e 6c 79 29 20 2a 2f   target only) */
4140: 0a 20 20 69 36 34 20 73 7a 3b 20 20 20 20 20 20  .  i64 sz;      
4150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4160: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 66 69     /* Size of fi
4170: 6c 65 20 69 6e 20 62 79 74 65 73 20 28 74 65 6d  le in bytes (tem
4180: 70 20 6f 6e 6c 79 29 20 2a 2f 0a 0a 20 20 69 6e  p only) */..  in
4190: 74 20 6f 70 65 6e 46 6c 61 67 73 3b 20 20 20 20  t openFlags;    
41a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
41b0: 20 46 6c 61 67 73 20 74 68 69 73 20 66 69 6c 65   Flags this file
41c0: 20 77 61 73 20 6f 70 65 6e 65 64 20 77 69 74 68   was opened with
41d0: 20 2a 2f 0a 20 20 75 33 32 20 69 43 6f 6f 6b 69   */.  u32 iCooki
41e0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
41f0: 20 20 20 20 20 20 2f 2a 20 43 6f 6f 6b 69 65 20        /* Cookie 
4200: 76 61 6c 75 65 20 66 6f 72 20 6d 61 69 6e 20 64  value for main d
4210: 62 20 66 69 6c 65 73 20 2a 2f 0a 20 20 75 38 20  b files */.  u8 
4220: 69 57 72 69 74 65 56 65 72 3b 20 20 20 20 20 20  iWriteVer;      
4230: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4240: 22 77 72 69 74 65 2d 76 65 72 73 69 6f 6e 22 20  "write-version" 
4250: 76 61 6c 75 65 20 66 6f 72 20 6d 61 69 6e 20 64  value for main d
4260: 62 20 66 69 6c 65 73 20 2a 2f 0a 20 20 75 38 20  b files */.  u8 
4270: 62 4e 6f 6c 6f 63 6b 3b 20 20 20 20 20 20 20 20  bNolock;        
4280: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4290: 54 72 75 65 20 74 6f 20 66 61 69 6c 20 45 58 43  True to fail EXC
42a0: 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20 2a 2f 0a  LUSIVE locks */.
42b0: 0a 20 20 69 6e 74 20 6e 53 68 6d 3b 20 20 20 20  .  int nShm;    
42c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
42d0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
42e0: 65 6e 74 72 69 65 73 20 69 6e 20 61 70 53 68 6d  entries in apShm
42f0: 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 63 68  [] array */.  ch
4300: 61 72 20 2a 2a 61 70 53 68 6d 3b 20 20 20 20 20  ar **apShm;     
4310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4320: 20 41 72 72 61 79 20 6f 66 20 6d 6d 61 70 27 64   Array of mmap'd
4330: 20 2a 2d 73 68 6d 20 72 65 67 69 6f 6e 73 20 2a   *-shm regions *
4340: 2f 0a 20 20 63 68 61 72 20 2a 7a 44 65 6c 3b 20  /.  char *zDel; 
4350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4360: 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68      /* Delete th
4370: 69 73 20 77 68 65 6e 20 63 6c 6f 73 69 6e 67 20  is when closing 
4380: 66 69 6c 65 20 2a 2f 0a 0a 20 20 63 6f 6e 73 74  file */..  const
4390: 20 63 68 61 72 20 2a 7a 57 61 6c 3b 20 20 20 20   char *zWal;    
43a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 61             /* Wa
43b0: 6c 20 66 69 6c 65 6e 61 6d 65 20 66 6f 72 20 74  l filename for t
43c0: 68 69 73 20 6d 61 69 6e 20 64 62 20 66 69 6c 65  his main db file
43d0: 20 2a 2f 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a   */.  rbu_file *
43e0: 70 57 61 6c 46 64 3b 20 20 20 20 20 20 20 20 20  pWalFd;         
43f0: 20 20 20 20 20 20 2f 2a 20 57 61 6c 20 66 69 6c        /* Wal fil
4400: 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
4410: 20 74 68 69 73 20 6d 61 69 6e 20 64 62 20 2a 2f   this main db */
4420: 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 4d 61  .  rbu_file *pMa
4430: 69 6e 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20  inNext;         
4440: 20 20 20 2f 2a 20 4e 65 78 74 20 4d 41 49 4e 5f     /* Next MAIN_
4450: 44 42 20 66 69 6c 65 20 2a 2f 0a 20 20 72 62 75  DB file */.  rbu
4460: 5f 66 69 6c 65 20 2a 70 4d 61 69 6e 52 62 75 4e  _file *pMainRbuN
4470: 65 78 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ext;         /* 
4480: 4e 65 78 74 20 4d 41 49 4e 5f 44 42 20 66 69 6c  Next MAIN_DB fil
4490: 65 20 77 69 74 68 20 70 52 62 75 21 3d 30 20 2a  e with pRbu!=0 *
44a0: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 65  /.};../*.** True
44b0: 20 66 6f 72 20 61 6e 20 52 42 55 20 76 61 63 75   for an RBU vacu
44c0: 75 6d 20 68 61 6e 64 6c 65 2c 20 6f 72 20 66 61  um handle, or fa
44d0: 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  lse otherwise..*
44e0: 2f 0a 23 64 65 66 69 6e 65 20 72 62 75 49 73 56  /.#define rbuIsV
44f0: 61 63 75 75 6d 28 70 29 20 28 28 70 29 2d 3e 7a  acuum(p) ((p)->z
4500: 54 61 72 67 65 74 3d 3d 30 29 0a 0a 0a 2f 2a 2a  Target==0).../**
4510: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4520: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4530: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4540: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4550: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 66  *******.** The f
4560: 6f 6c 6c 6f 77 69 6e 67 20 74 68 72 65 65 20 66  ollowing three f
4570: 75 6e 63 74 69 6f 6e 73 2c 20 66 6f 75 6e 64 20  unctions, found 
4580: 62 65 6c 6f 77 3a 0a 2a 2a 0a 2a 2a 20 20 20 72  below:.**.**   r
4590: 62 75 44 65 6c 74 61 47 65 74 49 6e 74 28 29 0a  buDeltaGetInt().
45a0: 2a 2a 20 20 20 72 62 75 44 65 6c 74 61 43 68 65  **   rbuDeltaChe
45b0: 63 6b 73 75 6d 28 29 0a 2a 2a 20 20 20 72 62 75  cksum().**   rbu
45c0: 44 65 6c 74 61 41 70 70 6c 79 28 29 0a 2a 2a 0a  DeltaApply().**.
45d0: 2a 2a 20 61 72 65 20 6c 69 66 74 65 64 20 66 72  ** are lifted fr
45e0: 6f 6d 20 74 68 65 20 66 6f 73 73 69 6c 20 73 6f  om the fossil so
45f0: 75 72 63 65 20 63 6f 64 65 20 28 68 74 74 70 3a  urce code (http:
4600: 2f 2f 66 6f 73 73 69 6c 2d 73 63 6d 2e 6f 72 67  //fossil-scm.org
4610: 29 2e 20 54 68 65 79 0a 2a 2a 20 61 72 65 20 75  ). They.** are u
4620: 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
4630: 20 74 68 65 20 73 63 61 6c 61 72 20 53 51 4c 20   the scalar SQL 
4640: 66 75 6e 63 74 69 6f 6e 20 72 62 75 5f 66 6f 73  function rbu_fos
4650: 73 69 6c 5f 64 65 6c 74 61 28 29 2e 0a 2a 2f 0a  sil_delta()..*/.
4660: 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 62 79 74 65  ./*.** Read byte
4670: 73 20 66 72 6f 6d 20 2a 70 7a 20 61 6e 64 20 63  s from *pz and c
4680: 6f 6e 76 65 72 74 20 74 68 65 6d 20 69 6e 74 6f  onvert them into
4690: 20 61 20 70 6f 73 69 74 69 76 65 20 69 6e 74 65   a positive inte
46a0: 67 65 72 2e 20 20 57 68 65 6e 0a 2a 2a 20 66 69  ger.  When.** fi
46b0: 6e 69 73 68 65 64 2c 20 6c 65 61 76 65 20 2a 70  nished, leave *p
46c0: 7a 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  z pointing to th
46d0: 65 20 66 69 72 73 74 20 63 68 61 72 61 63 74 65  e first characte
46e0: 72 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  r past the end o
46f0: 66 0a 2a 2a 20 74 68 65 20 69 6e 74 65 67 65 72  f.** the integer
4700: 2e 20 20 54 68 65 20 2a 70 4c 65 6e 20 70 61 72  .  The *pLen par
4710: 61 6d 65 74 65 72 20 68 6f 6c 64 73 20 74 68 65  ameter holds the
4720: 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 73   length of the s
4730: 74 72 69 6e 67 0a 2a 2a 20 69 6e 20 2a 70 7a 20  tring.** in *pz 
4740: 61 6e 64 20 69 73 20 64 65 63 72 65 6d 65 6e 74  and is decrement
4750: 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ed once for each
4760: 20 63 68 61 72 61 63 74 65 72 20 69 6e 20 74 68   character in th
4770: 65 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 73 74  e integer..*/.st
4780: 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20 69 6e  atic unsigned in
4790: 74 20 72 62 75 44 65 6c 74 61 47 65 74 49 6e 74  t rbuDeltaGetInt
47a0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a  (const char **pz
47b0: 2c 20 69 6e 74 20 2a 70 4c 65 6e 29 7b 0a 20 20  , int *pLen){.  
47c0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 69 67  static const sig
47d0: 6e 65 64 20 63 68 61 72 20 7a 56 61 6c 75 65 5b  ned char zValue[
47e0: 5d 20 3d 20 7b 0a 20 20 20 20 2d 31 2c 20 2d 31  ] = {.    -1, -1
47f0: 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31  , -1, -1, -1, -1
4800: 2c 20 2d 31 2c 20 2d 31 2c 20 20 20 2d 31 2c 20  , -1, -1,   -1, 
4810: 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20  -1, -1, -1, -1, 
4820: 2d 31 2c 20 2d 31 2c 20 2d 31 2c 0a 20 20 20 20  -1, -1, -1,.    
4830: 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20  -1, -1, -1, -1, 
4840: 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20  -1, -1, -1, -1, 
4850: 20 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31    -1, -1, -1, -1
4860: 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31  , -1, -1, -1, -1
4870: 2c 0a 20 20 20 20 2d 31 2c 20 2d 31 2c 20 2d 31  ,.    -1, -1, -1
4880: 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31  , -1, -1, -1, -1
4890: 2c 20 2d 31 2c 20 20 20 2d 31 2c 20 2d 31 2c 20  , -1,   -1, -1, 
48a0: 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20  -1, -1, -1, -1, 
48b0: 2d 31 2c 20 2d 31 2c 0a 20 20 20 20 20 30 2c 20  -1, -1,.     0, 
48c0: 20 31 2c 20 20 32 2c 20 20 33 2c 20 20 34 2c 20   1,  2,  3,  4, 
48d0: 20 35 2c 20 20 36 2c 20 20 37 2c 20 20 20 20 38   5,  6,  7,    8
48e0: 2c 20 20 39 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31  ,  9, -1, -1, -1
48f0: 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 0a 20 20  , -1, -1, -1,.  
4900: 20 20 2d 31 2c 20 31 30 2c 20 31 31 2c 20 31 32    -1, 10, 11, 12
4910: 2c 20 31 33 2c 20 31 34 2c 20 31 35 2c 20 31 36  , 13, 14, 15, 16
4920: 2c 20 20 20 31 37 2c 20 31 38 2c 20 31 39 2c 20  ,   17, 18, 19, 
4930: 32 30 2c 20 32 31 2c 20 32 32 2c 20 32 33 2c 20  20, 21, 22, 23, 
4940: 32 34 2c 0a 20 20 20 20 32 35 2c 20 32 36 2c 20  24,.    25, 26, 
4950: 32 37 2c 20 32 38 2c 20 32 39 2c 20 33 30 2c 20  27, 28, 29, 30, 
4960: 33 31 2c 20 33 32 2c 20 20 20 33 33 2c 20 33 34  31, 32,   33, 34
4970: 2c 20 33 35 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31  , 35, -1, -1, -1
4980: 2c 20 2d 31 2c 20 33 36 2c 0a 20 20 20 20 2d 31  , -1, 36,.    -1
4990: 2c 20 33 37 2c 20 33 38 2c 20 33 39 2c 20 34 30  , 37, 38, 39, 40
49a0: 2c 20 34 31 2c 20 34 32 2c 20 34 33 2c 20 20 20  , 41, 42, 43,   
49b0: 34 34 2c 20 34 35 2c 20 34 36 2c 20 34 37 2c 20  44, 45, 46, 47, 
49c0: 34 38 2c 20 34 39 2c 20 35 30 2c 20 35 31 2c 0a  48, 49, 50, 51,.
49d0: 20 20 20 20 35 32 2c 20 35 33 2c 20 35 34 2c 20      52, 53, 54, 
49e0: 35 35 2c 20 35 36 2c 20 35 37 2c 20 35 38 2c 20  55, 56, 57, 58, 
49f0: 35 39 2c 20 20 20 36 30 2c 20 36 31 2c 20 36 32  59,   60, 61, 62
4a00: 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 36 33  , -1, -1, -1, 63
4a10: 2c 20 2d 31 2c 0a 20 20 7d 3b 0a 20 20 75 6e 73  , -1,.  };.  uns
4a20: 69 67 6e 65 64 20 69 6e 74 20 76 20 3d 20 30 3b  igned int v = 0;
4a30: 0a 20 20 69 6e 74 20 63 3b 0a 20 20 75 6e 73 69  .  int c;.  unsi
4a40: 67 6e 65 64 20 63 68 61 72 20 2a 7a 20 3d 20 28  gned char *z = (
4a50: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 2a  unsigned char*)*
4a60: 70 7a 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  pz;.  unsigned c
4a70: 68 61 72 20 2a 7a 53 74 61 72 74 20 3d 20 7a 3b  har *zStart = z;
4a80: 0a 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20 7a  .  while( (c = z
4a90: 56 61 6c 75 65 5b 30 78 37 66 26 2a 28 7a 2b 2b  Value[0x7f&*(z++
4aa0: 29 5d 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 76  )])>=0 ){.     v
4ab0: 20 3d 20 28 76 3c 3c 36 29 20 2b 20 63 3b 0a 20   = (v<<6) + c;. 
4ac0: 20 7d 0a 20 20 7a 2d 2d 3b 0a 20 20 2a 70 4c 65   }.  z--;.  *pLe
4ad0: 6e 20 2d 3d 20 7a 20 2d 20 7a 53 74 61 72 74 3b  n -= z - zStart;
4ae0: 0a 20 20 2a 70 7a 20 3d 20 28 63 68 61 72 2a 29  .  *pz = (char*)
4af0: 7a 3b 0a 20 20 72 65 74 75 72 6e 20 76 3b 0a 7d  z;.  return v;.}
4b00: 0a 0a 23 69 66 20 52 42 55 5f 45 4e 41 42 4c 45  ..#if RBU_ENABLE
4b10: 5f 44 45 4c 54 41 5f 43 4b 53 55 4d 0a 2f 2a 0a  _DELTA_CKSUM./*.
4b20: 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 33 32 2d  ** Compute a 32-
4b30: 62 69 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20  bit checksum on 
4b40: 74 68 65 20 4e 2d 62 79 74 65 20 62 75 66 66 65  the N-byte buffe
4b50: 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 72  r.  Return the r
4b60: 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  esult..*/.static
4b70: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 72 62   unsigned int rb
4b80: 75 44 65 6c 74 61 43 68 65 63 6b 73 75 6d 28 63  uDeltaChecksum(c
4b90: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 2c 20  onst char *zIn, 
4ba0: 73 69 7a 65 5f 74 20 4e 29 7b 0a 20 20 63 6f 6e  size_t N){.  con
4bb0: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
4bc0: 20 2a 7a 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73   *z = (const uns
4bd0: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 7a 49 6e  igned char *)zIn
4be0: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 73 75 6d  ;.  unsigned sum
4bf0: 30 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65  0 = 0;.  unsigne
4c00: 64 20 73 75 6d 31 20 3d 20 30 3b 0a 20 20 75 6e  d sum1 = 0;.  un
4c10: 73 69 67 6e 65 64 20 73 75 6d 32 20 3d 20 30 3b  signed sum2 = 0;
4c20: 0a 20 20 75 6e 73 69 67 6e 65 64 20 73 75 6d 33  .  unsigned sum3
4c30: 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 4e 20   = 0;.  while(N 
4c40: 3e 3d 20 31 36 29 7b 0a 20 20 20 20 73 75 6d 30  >= 16){.    sum0
4c50: 20 2b 3d 20 28 28 75 6e 73 69 67 6e 65 64 29 7a   += ((unsigned)z
4c60: 5b 30 5d 20 2b 20 7a 5b 34 5d 20 2b 20 7a 5b 38  [0] + z[4] + z[8
4c70: 5d 20 2b 20 7a 5b 31 32 5d 29 3b 0a 20 20 20 20  ] + z[12]);.    
4c80: 73 75 6d 31 20 2b 3d 20 28 28 75 6e 73 69 67 6e  sum1 += ((unsign
4c90: 65 64 29 7a 5b 31 5d 20 2b 20 7a 5b 35 5d 20 2b  ed)z[1] + z[5] +
4ca0: 20 7a 5b 39 5d 20 2b 20 7a 5b 31 33 5d 29 3b 0a   z[9] + z[13]);.
4cb0: 20 20 20 20 73 75 6d 32 20 2b 3d 20 28 28 75 6e      sum2 += ((un
4cc0: 73 69 67 6e 65 64 29 7a 5b 32 5d 20 2b 20 7a 5b  signed)z[2] + z[
4cd0: 36 5d 20 2b 20 7a 5b 31 30 5d 2b 20 7a 5b 31 34  6] + z[10]+ z[14
4ce0: 5d 29 3b 0a 20 20 20 20 73 75 6d 33 20 2b 3d 20  ]);.    sum3 += 
4cf0: 28 28 75 6e 73 69 67 6e 65 64 29 7a 5b 33 5d 20  ((unsigned)z[3] 
4d00: 2b 20 7a 5b 37 5d 20 2b 20 7a 5b 31 31 5d 2b 20  + z[7] + z[11]+ 
4d10: 7a 5b 31 35 5d 29 3b 0a 20 20 20 20 7a 20 2b 3d  z[15]);.    z +=
4d20: 20 31 36 3b 0a 20 20 20 20 4e 20 2d 3d 20 31 36   16;.    N -= 16
4d30: 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 4e 20  ;.  }.  while(N 
4d40: 3e 3d 20 34 29 7b 0a 20 20 20 20 73 75 6d 30 20  >= 4){.    sum0 
4d50: 2b 3d 20 7a 5b 30 5d 3b 0a 20 20 20 20 73 75 6d  += z[0];.    sum
4d60: 31 20 2b 3d 20 7a 5b 31 5d 3b 0a 20 20 20 20 73  1 += z[1];.    s
4d70: 75 6d 32 20 2b 3d 20 7a 5b 32 5d 3b 0a 20 20 20  um2 += z[2];.   
4d80: 20 73 75 6d 33 20 2b 3d 20 7a 5b 33 5d 3b 0a 20   sum3 += z[3];. 
4d90: 20 20 20 7a 20 2b 3d 20 34 3b 0a 20 20 20 20 4e     z += 4;.    N
4da0: 20 2d 3d 20 34 3b 0a 20 20 7d 0a 20 20 73 75 6d   -= 4;.  }.  sum
4db0: 33 20 2b 3d 20 28 73 75 6d 32 20 3c 3c 20 38 29  3 += (sum2 << 8)
4dc0: 20 2b 20 28 73 75 6d 31 20 3c 3c 20 31 36 29 20   + (sum1 << 16) 
4dd0: 2b 20 28 73 75 6d 30 20 3c 3c 20 32 34 29 3b 0a  + (sum0 << 24);.
4de0: 20 20 73 77 69 74 63 68 28 4e 29 7b 0a 20 20 20    switch(N){.   
4df0: 20 63 61 73 65 20 33 3a 20 20 20 73 75 6d 33 20   case 3:   sum3 
4e00: 2b 3d 20 28 7a 5b 32 5d 20 3c 3c 20 38 29 3b 0a  += (z[2] << 8);.
4e10: 20 20 20 20 63 61 73 65 20 32 3a 20 20 20 73 75      case 2:   su
4e20: 6d 33 20 2b 3d 20 28 7a 5b 31 5d 20 3c 3c 20 31  m3 += (z[1] << 1
4e30: 36 29 3b 0a 20 20 20 20 63 61 73 65 20 31 3a 20  6);.    case 1: 
4e40: 20 20 73 75 6d 33 20 2b 3d 20 28 7a 5b 30 5d 20    sum3 += (z[0] 
4e50: 3c 3c 20 32 34 29 3b 0a 20 20 20 20 64 65 66 61  << 24);.    defa
4e60: 75 6c 74 3a 20 20 3b 0a 20 20 7d 0a 20 20 72 65  ult:  ;.  }.  re
4e70: 74 75 72 6e 20 73 75 6d 33 3b 0a 7d 0a 23 65 6e  turn sum3;.}.#en
4e80: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 6c 79  dif../*.** Apply
4e90: 20 61 20 64 65 6c 74 61 2e 0a 2a 2a 0a 2a 2a 20   a delta..**.** 
4ea0: 54 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65  The output buffe
4eb0: 72 20 73 68 6f 75 6c 64 20 62 65 20 62 69 67 20  r should be big 
4ec0: 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74  enough to hold t
4ed0: 68 65 20 77 68 6f 6c 65 20 6f 75 74 70 75 74 0a  he whole output.
4ee0: 2a 2a 20 66 69 6c 65 20 61 6e 64 20 61 20 4e 55  ** file and a NU
4ef0: 4c 20 74 65 72 6d 69 6e 61 74 6f 72 20 61 74 20  L terminator at 
4f00: 74 68 65 20 65 6e 64 2e 20 20 54 68 65 20 64 65  the end.  The de
4f10: 6c 74 61 5f 6f 75 74 70 75 74 5f 73 69 7a 65 28  lta_output_size(
4f20: 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69 6c  ).** routine wil
4f30: 6c 20 64 65 74 65 72 6d 69 6e 65 20 74 68 69 73  l determine this
4f40: 20 73 69 7a 65 20 66 6f 72 20 79 6f 75 2e 0a 2a   size for you..*
4f50: 2a 0a 2a 2a 20 54 68 65 20 64 65 6c 74 61 20 73  *.** The delta s
4f60: 74 72 69 6e 67 20 73 68 6f 75 6c 64 20 62 65 20  tring should be 
4f70: 6e 75 6c 6c 2d 74 65 72 6d 69 6e 61 74 65 64 2e  null-terminated.
4f80: 20 20 42 75 74 20 74 68 65 20 64 65 6c 74 61 20    But the delta 
4f90: 73 74 72 69 6e 67 0a 2a 2a 20 6d 61 79 20 63 6f  string.** may co
4fa0: 6e 74 61 69 6e 20 65 6d 62 65 64 64 65 64 20 4e  ntain embedded N
4fb0: 55 4c 20 63 68 61 72 61 63 74 65 72 73 20 28 69  UL characters (i
4fc0: 66 20 74 68 65 20 69 6e 70 75 74 20 61 6e 64 20  f the input and 
4fd0: 6f 75 74 70 75 74 20 61 72 65 0a 2a 2a 20 62 69  output are.** bi
4fe0: 6e 61 72 79 20 66 69 6c 65 73 29 20 73 6f 20 77  nary files) so w
4ff0: 65 20 61 6c 73 6f 20 68 61 76 65 20 74 6f 20 70  e also have to p
5000: 61 73 73 20 69 6e 20 74 68 65 20 6c 65 6e 67 74  ass in the lengt
5010: 68 20 6f 66 20 74 68 65 20 64 65 6c 74 61 20 69  h of the delta i
5020: 6e 0a 2a 2a 20 74 68 65 20 6c 65 6e 44 65 6c 74  n.** the lenDelt
5030: 61 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a  a parameter..**.
5040: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
5050: 20 72 65 74 75 72 6e 73 20 74 68 65 20 73 69 7a   returns the siz
5060: 65 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74 20  e of the output 
5070: 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 28 65  file in bytes (e
5080: 78 63 6c 75 64 69 6e 67 0a 2a 2a 20 74 68 65 20  xcluding.** the 
5090: 66 69 6e 61 6c 20 4e 55 4c 20 74 65 72 6d 69 6e  final NUL termin
50a0: 61 74 6f 72 20 63 68 61 72 61 63 74 65 72 29 2e  ator character).
50b0: 20 20 45 78 63 65 70 74 2c 20 69 66 20 74 68 65    Except, if the
50c0: 20 64 65 6c 74 61 20 73 74 72 69 6e 67 20 69 73   delta string is
50d0: 0a 2a 2a 20 6d 61 6c 66 6f 72 6d 65 64 20 6f 72  .** malformed or
50e0: 20 69 6e 74 65 6e 64 65 64 20 66 6f 72 20 75 73   intended for us
50f0: 65 20 77 69 74 68 20 61 20 73 6f 75 72 63 65 20  e with a source 
5100: 66 69 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20  file other than 
5110: 7a 53 72 63 2c 0a 2a 2a 20 74 68 65 6e 20 74 68  zSrc,.** then th
5120: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
5130: 6e 73 20 2d 31 2e 0a 2a 2a 0a 2a 2a 20 52 65 66  ns -1..**.** Ref
5140: 65 72 20 74 6f 20 74 68 65 20 64 65 6c 74 61 5f  er to the delta_
5150: 63 72 65 61 74 65 28 29 20 64 6f 63 75 6d 65 6e  create() documen
5160: 74 61 74 69 6f 6e 20 61 62 6f 76 65 20 66 6f 72  tation above for
5170: 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e 0a 2a   a description.*
5180: 2a 20 6f 66 20 74 68 65 20 64 65 6c 74 61 20 66  * of the delta f
5190: 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 2a 2f 0a 73  ile format..*/.s
51a0: 74 61 74 69 63 20 69 6e 74 20 72 62 75 44 65 6c  tatic int rbuDel
51b0: 74 61 41 70 70 6c 79 28 0a 20 20 63 6f 6e 73 74  taApply(.  const
51c0: 20 63 68 61 72 20 2a 7a 53 72 63 2c 20 20 20 20   char *zSrc,    
51d0: 20 20 2f 2a 20 54 68 65 20 73 6f 75 72 63 65 20    /* The source 
51e0: 6f 72 20 70 61 74 74 65 72 6e 20 66 69 6c 65 20  or pattern file 
51f0: 2a 2f 0a 20 20 69 6e 74 20 6c 65 6e 53 72 63 2c  */.  int lenSrc,
5200: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
5210: 65 6e 67 74 68 20 6f 66 20 74 68 65 20 73 6f 75  ength of the sou
5220: 72 63 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63 6f  rce file */.  co
5230: 6e 73 74 20 63 68 61 72 20 2a 7a 44 65 6c 74 61  nst char *zDelta
5240: 2c 20 20 20 20 2f 2a 20 44 65 6c 74 61 20 74 6f  ,    /* Delta to
5250: 20 61 70 70 6c 79 20 74 6f 20 74 68 65 20 70 61   apply to the pa
5260: 74 74 65 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 6c  ttern */.  int l
5270: 65 6e 44 65 6c 74 61 2c 20 20 20 20 20 20 20 20  enDelta,        
5280: 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74    /* Length of t
5290: 68 65 20 64 65 6c 74 61 20 2a 2f 0a 20 20 63 68  he delta */.  ch
52a0: 61 72 20 2a 7a 4f 75 74 20 20 20 20 20 20 20 20  ar *zOut        
52b0: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
52c0: 65 20 6f 75 74 70 75 74 20 69 6e 74 6f 20 74 68  e output into th
52d0: 69 73 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20  is preallocated 
52e0: 62 75 66 66 65 72 20 2a 2f 0a 29 7b 0a 20 20 75  buffer */.){.  u
52f0: 6e 73 69 67 6e 65 64 20 69 6e 74 20 6c 69 6d 69  nsigned int limi
5300: 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  t;.  unsigned in
5310: 74 20 74 6f 74 61 6c 20 3d 20 30 3b 0a 23 69 66  t total = 0;.#if
5320: 20 52 42 55 5f 45 4e 41 42 4c 45 5f 44 45 4c 54   RBU_ENABLE_DELT
5330: 41 5f 43 4b 53 55 4d 0a 20 20 63 68 61 72 20 2a  A_CKSUM.  char *
5340: 7a 4f 72 69 67 4f 75 74 20 3d 20 7a 4f 75 74 3b  zOrigOut = zOut;
5350: 0a 23 65 6e 64 69 66 0a 0a 20 20 6c 69 6d 69 74  .#endif..  limit
5360: 20 3d 20 72 62 75 44 65 6c 74 61 47 65 74 49 6e   = rbuDeltaGetIn
5370: 74 28 26 7a 44 65 6c 74 61 2c 20 26 6c 65 6e 44  t(&zDelta, &lenD
5380: 65 6c 74 61 29 3b 0a 20 20 69 66 28 20 2a 7a 44  elta);.  if( *zD
5390: 65 6c 74 61 21 3d 27 5c 6e 27 20 29 7b 0a 20 20  elta!='\n' ){.  
53a0: 20 20 2f 2a 20 45 52 52 4f 52 3a 20 73 69 7a 65    /* ERROR: size
53b0: 20 69 6e 74 65 67 65 72 20 6e 6f 74 20 74 65 72   integer not ter
53c0: 6d 69 6e 61 74 65 64 20 62 79 20 22 5c 6e 22 20  minated by "\n" 
53d0: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31  */.    return -1
53e0: 3b 0a 20 20 7d 0a 20 20 7a 44 65 6c 74 61 2b 2b  ;.  }.  zDelta++
53f0: 3b 20 6c 65 6e 44 65 6c 74 61 2d 2d 3b 0a 20 20  ; lenDelta--;.  
5400: 77 68 69 6c 65 28 20 2a 7a 44 65 6c 74 61 20 26  while( *zDelta &
5410: 26 20 6c 65 6e 44 65 6c 74 61 3e 30 20 29 7b 0a  & lenDelta>0 ){.
5420: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74      unsigned int
5430: 20 63 6e 74 2c 20 6f 66 73 74 3b 0a 20 20 20 20   cnt, ofst;.    
5440: 63 6e 74 20 3d 20 72 62 75 44 65 6c 74 61 47 65  cnt = rbuDeltaGe
5450: 74 49 6e 74 28 26 7a 44 65 6c 74 61 2c 20 26 6c  tInt(&zDelta, &l
5460: 65 6e 44 65 6c 74 61 29 3b 0a 20 20 20 20 73 77  enDelta);.    sw
5470: 69 74 63 68 28 20 7a 44 65 6c 74 61 5b 30 5d 20  itch( zDelta[0] 
5480: 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 27 40  ){.      case '@
5490: 27 3a 20 7b 0a 20 20 20 20 20 20 20 20 7a 44 65  ': {.        zDe
54a0: 6c 74 61 2b 2b 3b 20 6c 65 6e 44 65 6c 74 61 2d  lta++; lenDelta-
54b0: 2d 3b 0a 20 20 20 20 20 20 20 20 6f 66 73 74 20  -;.        ofst 
54c0: 3d 20 72 62 75 44 65 6c 74 61 47 65 74 49 6e 74  = rbuDeltaGetInt
54d0: 28 26 7a 44 65 6c 74 61 2c 20 26 6c 65 6e 44 65  (&zDelta, &lenDe
54e0: 6c 74 61 29 3b 0a 20 20 20 20 20 20 20 20 69 66  lta);.        if
54f0: 28 20 6c 65 6e 44 65 6c 74 61 3e 30 20 26 26 20  ( lenDelta>0 && 
5500: 7a 44 65 6c 74 61 5b 30 5d 21 3d 27 2c 27 20 29  zDelta[0]!=',' )
5510: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45  {.          /* E
5520: 52 52 4f 52 3a 20 63 6f 70 79 20 63 6f 6d 6d 61  RROR: copy comma
5530: 6e 64 20 6e 6f 74 20 74 65 72 6d 69 6e 61 74 65  nd not terminate
5540: 64 20 62 79 20 27 2c 27 20 2a 2f 0a 20 20 20 20  d by ',' */.    
5550: 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b        return -1;
5560: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5570: 20 20 20 7a 44 65 6c 74 61 2b 2b 3b 20 6c 65 6e     zDelta++; len
5580: 44 65 6c 74 61 2d 2d 3b 0a 20 20 20 20 20 20 20  Delta--;.       
5590: 20 74 6f 74 61 6c 20 2b 3d 20 63 6e 74 3b 0a 20   total += cnt;. 
55a0: 20 20 20 20 20 20 20 69 66 28 20 74 6f 74 61 6c         if( total
55b0: 3e 6c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  >limit ){.      
55c0: 20 20 20 20 2f 2a 20 45 52 52 4f 52 3a 20 63 6f      /* ERROR: co
55d0: 70 79 20 65 78 63 65 65 64 73 20 6f 75 74 70 75  py exceeds outpu
55e0: 74 20 66 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20  t file size */. 
55f0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
5600: 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  -1;.        }.  
5610: 20 20 20 20 20 20 69 66 28 20 28 69 6e 74 29 28        if( (int)(
5620: 6f 66 73 74 2b 63 6e 74 29 20 3e 20 6c 65 6e 53  ofst+cnt) > lenS
5630: 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
5640: 2f 2a 20 45 52 52 4f 52 3a 20 63 6f 70 79 20 65  /* ERROR: copy e
5650: 78 74 65 6e 64 73 20 70 61 73 74 20 65 6e 64 20  xtends past end 
5660: 6f 66 20 69 6e 70 75 74 20 2a 2f 0a 20 20 20 20  of input */.    
5670: 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b        return -1;
5680: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5690: 20 20 20 6d 65 6d 63 70 79 28 7a 4f 75 74 2c 20     memcpy(zOut, 
56a0: 26 7a 53 72 63 5b 6f 66 73 74 5d 2c 20 63 6e 74  &zSrc[ofst], cnt
56b0: 29 3b 0a 20 20 20 20 20 20 20 20 7a 4f 75 74 20  );.        zOut 
56c0: 2b 3d 20 63 6e 74 3b 0a 20 20 20 20 20 20 20 20  += cnt;.        
56d0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
56e0: 20 20 20 20 20 63 61 73 65 20 27 3a 27 3a 20 7b       case ':': {
56f0: 0a 20 20 20 20 20 20 20 20 7a 44 65 6c 74 61 2b  .        zDelta+
5700: 2b 3b 20 6c 65 6e 44 65 6c 74 61 2d 2d 3b 0a 20  +; lenDelta--;. 
5710: 20 20 20 20 20 20 20 74 6f 74 61 6c 20 2b 3d 20         total += 
5720: 63 6e 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28  cnt;.        if(
5730: 20 74 6f 74 61 6c 3e 6c 69 6d 69 74 20 29 7b 0a   total>limit ){.
5740: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 52 52            /* ERR
5750: 4f 52 3a 20 20 69 6e 73 65 72 74 20 63 6f 6d 6d  OR:  insert comm
5760: 61 6e 64 20 67 69 76 65 73 20 61 6e 20 6f 75 74  and gives an out
5770: 70 75 74 20 6c 61 72 67 65 72 20 74 68 61 6e 20  put larger than 
5780: 70 72 65 64 69 63 74 65 64 20 2a 2f 0a 20 20 20  predicted */.   
5790: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31         return -1
57a0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
57b0: 20 20 20 20 69 66 28 20 28 69 6e 74 29 63 6e 74      if( (int)cnt
57c0: 3e 6c 65 6e 44 65 6c 74 61 20 29 7b 0a 20 20 20  >lenDelta ){.   
57d0: 20 20 20 20 20 20 20 2f 2a 20 45 52 52 4f 52 3a         /* ERROR:
57e0: 20 69 6e 73 65 72 74 20 63 6f 75 6e 74 20 65 78   insert count ex
57f0: 63 65 65 64 73 20 73 69 7a 65 20 6f 66 20 64 65  ceeds size of de
5800: 6c 74 61 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  lta */.         
5810: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
5820: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6d 65      }.        me
5830: 6d 63 70 79 28 7a 4f 75 74 2c 20 7a 44 65 6c 74  mcpy(zOut, zDelt
5840: 61 2c 20 63 6e 74 29 3b 0a 20 20 20 20 20 20 20  a, cnt);.       
5850: 20 7a 4f 75 74 20 2b 3d 20 63 6e 74 3b 0a 20 20   zOut += cnt;.  
5860: 20 20 20 20 20 20 7a 44 65 6c 74 61 20 2b 3d 20        zDelta += 
5870: 63 6e 74 3b 0a 20 20 20 20 20 20 20 20 6c 65 6e  cnt;.        len
5880: 44 65 6c 74 61 20 2d 3d 20 63 6e 74 3b 0a 20 20  Delta -= cnt;.  
5890: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
58a0: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
58b0: 27 3b 27 3a 20 7b 0a 20 20 20 20 20 20 20 20 7a  ';': {.        z
58c0: 44 65 6c 74 61 2b 2b 3b 20 6c 65 6e 44 65 6c 74  Delta++; lenDelt
58d0: 61 2d 2d 3b 0a 20 20 20 20 20 20 20 20 7a 4f 75  a--;.        zOu
58e0: 74 5b 30 5d 20 3d 20 30 3b 0a 23 69 66 20 52 42  t[0] = 0;.#if RB
58f0: 55 5f 45 4e 41 42 4c 45 5f 44 45 4c 54 41 5f 43  U_ENABLE_DELTA_C
5900: 4b 53 55 4d 0a 20 20 20 20 20 20 20 20 69 66 28  KSUM.        if(
5910: 20 63 6e 74 21 3d 72 62 75 44 65 6c 74 61 43 68   cnt!=rbuDeltaCh
5920: 65 63 6b 73 75 6d 28 7a 4f 72 69 67 4f 75 74 2c  ecksum(zOrigOut,
5930: 20 74 6f 74 61 6c 29 20 29 7b 0a 20 20 20 20 20   total) ){.     
5940: 20 20 20 20 20 2f 2a 20 45 52 52 4f 52 3a 20 20       /* ERROR:  
5950: 62 61 64 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a  bad checksum */.
5960: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
5970: 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23   -1;.        }.#
5980: 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 69 66  endif.        if
5990: 28 20 74 6f 74 61 6c 21 3d 6c 69 6d 69 74 20 29  ( total!=limit )
59a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45  {.          /* E
59b0: 52 52 4f 52 3a 20 67 65 6e 65 72 61 74 65 64 20  RROR: generated 
59c0: 73 69 7a 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61  size does not ma
59d0: 74 63 68 20 70 72 65 64 69 63 74 65 64 20 73 69  tch predicted si
59e0: 7a 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ze */.          
59f0: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20  return -1;.     
5a00: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 74     }.        ret
5a10: 75 72 6e 20 74 6f 74 61 6c 3b 0a 20 20 20 20 20  urn total;.     
5a20: 20 7d 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74   }.      default
5a30: 3a 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45  : {.        /* E
5a40: 52 52 4f 52 3a 20 75 6e 6b 6e 6f 77 6e 20 64 65  RROR: unknown de
5a50: 6c 74 61 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  lta operator */.
5a60: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d          return -
5a70: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
5a80: 0a 20 20 7d 0a 20 20 2f 2a 20 45 52 52 4f 52 3a  .  }.  /* ERROR:
5a90: 20 75 6e 74 65 72 6d 69 6e 61 74 65 64 20 64 65   unterminated de
5aa0: 6c 74 61 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  lta */.  return 
5ab0: 2d 31 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  -1;.}..static in
5ac0: 74 20 72 62 75 44 65 6c 74 61 4f 75 74 70 75 74  t rbuDeltaOutput
5ad0: 53 69 7a 65 28 63 6f 6e 73 74 20 63 68 61 72 20  Size(const char 
5ae0: 2a 7a 44 65 6c 74 61 2c 20 69 6e 74 20 6c 65 6e  *zDelta, int len
5af0: 44 65 6c 74 61 29 7b 0a 20 20 69 6e 74 20 73 69  Delta){.  int si
5b00: 7a 65 3b 0a 20 20 73 69 7a 65 20 3d 20 72 62 75  ze;.  size = rbu
5b10: 44 65 6c 74 61 47 65 74 49 6e 74 28 26 7a 44 65  DeltaGetInt(&zDe
5b20: 6c 74 61 2c 20 26 6c 65 6e 44 65 6c 74 61 29 3b  lta, &lenDelta);
5b30: 0a 20 20 69 66 28 20 2a 7a 44 65 6c 74 61 21 3d  .  if( *zDelta!=
5b40: 27 5c 6e 27 20 29 7b 0a 20 20 20 20 2f 2a 20 45  '\n' ){.    /* E
5b50: 52 52 4f 52 3a 20 73 69 7a 65 20 69 6e 74 65 67  RROR: size integ
5b60: 65 72 20 6e 6f 74 20 74 65 72 6d 69 6e 61 74 65  er not terminate
5b70: 64 20 62 79 20 22 5c 6e 22 20 2a 2f 0a 20 20 20  d by "\n" */.   
5b80: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a   return -1;.  }.
5b90: 20 20 72 65 74 75 72 6e 20 73 69 7a 65 3b 0a 7d    return size;.}
5ba0: 0a 0a 2f 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20 63  ../*.** End of c
5bb0: 6f 64 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 66  ode taken from f
5bc0: 6f 73 73 69 6c 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ossil..*********
5bd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5be0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5bf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5c00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5c10: 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  /../*.** Impleme
5c20: 6e 74 61 74 69 6f 6e 20 6f 66 20 53 51 4c 20 73  ntation of SQL s
5c30: 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20 72  calar function r
5c40: 62 75 5f 66 6f 73 73 69 6c 5f 64 65 6c 74 61 28  bu_fossil_delta(
5c50: 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  )..**.** This fu
5c60: 6e 63 74 69 6f 6e 20 61 70 70 6c 69 65 73 20 61  nction applies a
5c70: 20 66 6f 73 73 69 6c 20 64 65 6c 74 61 20 70 61   fossil delta pa
5c80: 74 63 68 20 74 6f 20 61 20 62 6c 6f 62 2e 20 45  tch to a blob. E
5c90: 78 61 63 74 6c 79 20 74 77 6f 0a 2a 2a 20 61 72  xactly two.** ar
5ca0: 67 75 6d 65 6e 74 73 20 6d 75 73 74 20 62 65 20  guments must be 
5cb0: 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66  passed to this f
5cc0: 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20 66 69 72  unction. The fir
5cd0: 73 74 20 69 73 20 74 68 65 20 62 6c 6f 62 20 74  st is the blob t
5ce0: 6f 0a 2a 2a 20 70 61 74 63 68 20 61 6e 64 20 74  o.** patch and t
5cf0: 68 65 20 73 65 63 6f 6e 64 20 74 68 65 20 70 61  he second the pa
5d00: 74 63 68 20 74 6f 20 61 70 70 6c 79 2e 20 49 66  tch to apply. If
5d10: 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
5d20: 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  , this.** functi
5d30: 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 70  on returns the p
5d40: 61 74 63 68 65 64 20 62 6c 6f 62 2e 0a 2a 2f 0a  atched blob..*/.
5d50: 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75 46  static void rbuF
5d60: 6f 73 73 69 6c 44 65 6c 74 61 46 75 6e 63 28 0a  ossilDeltaFunc(.
5d70: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
5d80: 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e  t *context,.  in
5d90: 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65  t argc,.  sqlite
5da0: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
5db0: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
5dc0: 61 44 65 6c 74 61 3b 0a 20 20 69 6e 74 20 6e 44  aDelta;.  int nD
5dd0: 65 6c 74 61 3b 0a 20 20 63 6f 6e 73 74 20 63 68  elta;.  const ch
5de0: 61 72 20 2a 61 4f 72 69 67 3b 0a 20 20 69 6e 74  ar *aOrig;.  int
5df0: 20 6e 4f 72 69 67 3b 0a 0a 20 20 69 6e 74 20 6e   nOrig;..  int n
5e00: 4f 75 74 3b 0a 20 20 69 6e 74 20 6e 4f 75 74 32  Out;.  int nOut2
5e10: 3b 0a 20 20 63 68 61 72 20 2a 61 4f 75 74 3b 0a  ;.  char *aOut;.
5e20: 0a 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3d  .  assert( argc=
5e30: 3d 32 20 29 3b 0a 0a 20 20 6e 4f 72 69 67 20 3d  =2 );..  nOrig =
5e40: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
5e50: 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20  ytes(argv[0]);. 
5e60: 20 61 4f 72 69 67 20 3d 20 28 63 6f 6e 73 74 20   aOrig = (const 
5e70: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
5e80: 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30 5d  lue_blob(argv[0]
5e90: 29 3b 0a 20 20 6e 44 65 6c 74 61 20 3d 20 73 71  );.  nDelta = sq
5ea0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
5eb0: 73 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 61 44  s(argv[1]);.  aD
5ec0: 65 6c 74 61 20 3d 20 28 63 6f 6e 73 74 20 63 68  elta = (const ch
5ed0: 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
5ee0: 65 5f 62 6c 6f 62 28 61 72 67 76 5b 31 5d 29 3b  e_blob(argv[1]);
5ef0: 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
5f00: 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  t the size of th
5f10: 65 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 6e 4f  e output */.  nO
5f20: 75 74 20 3d 20 72 62 75 44 65 6c 74 61 4f 75 74  ut = rbuDeltaOut
5f30: 70 75 74 53 69 7a 65 28 61 44 65 6c 74 61 2c 20  putSize(aDelta, 
5f40: 6e 44 65 6c 74 61 29 3b 0a 20 20 69 66 28 20 6e  nDelta);.  if( n
5f50: 4f 75 74 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c  Out<0 ){.    sql
5f60: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
5f70: 72 28 63 6f 6e 74 65 78 74 2c 20 22 63 6f 72 72  r(context, "corr
5f80: 75 70 74 20 66 6f 73 73 69 6c 20 64 65 6c 74 61  upt fossil delta
5f90: 22 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65 74 75  ", -1);.    retu
5fa0: 72 6e 3b 0a 20 20 7d 0a 0a 20 20 61 4f 75 74 20  rn;.  }..  aOut 
5fb0: 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
5fc0: 28 6e 4f 75 74 2b 31 29 3b 0a 20 20 69 66 28 20  (nOut+1);.  if( 
5fd0: 61 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73  aOut==0 ){.    s
5fe0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
5ff0: 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78  ror_nomem(contex
6000: 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t);.  }else{.   
6010: 20 6e 4f 75 74 32 20 3d 20 72 62 75 44 65 6c 74   nOut2 = rbuDelt
6020: 61 41 70 70 6c 79 28 61 4f 72 69 67 2c 20 6e 4f  aApply(aOrig, nO
6030: 72 69 67 2c 20 61 44 65 6c 74 61 2c 20 6e 44 65  rig, aDelta, nDe
6040: 6c 74 61 2c 20 61 4f 75 74 29 3b 0a 20 20 20 20  lta, aOut);.    
6050: 69 66 28 20 6e 4f 75 74 32 21 3d 6e 4f 75 74 20  if( nOut2!=nOut 
6060: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
6070: 5f 66 72 65 65 28 61 4f 75 74 29 3b 0a 20 20 20  _free(aOut);.   
6080: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
6090: 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c  t_error(context,
60a0: 20 22 63 6f 72 72 75 70 74 20 66 6f 73 73 69 6c   "corrupt fossil
60b0: 20 64 65 6c 74 61 22 2c 20 2d 31 29 3b 0a 20 20   delta", -1);.  
60c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
60d0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c  qlite3_result_bl
60e0: 6f 62 28 63 6f 6e 74 65 78 74 2c 20 61 4f 75 74  ob(context, aOut
60f0: 2c 20 6e 4f 75 74 2c 20 73 71 6c 69 74 65 33 5f  , nOut, sqlite3_
6100: 66 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  free);.    }.  }
6110: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61  .}.../*.** Prepa
6120: 72 65 20 74 68 65 20 53 51 4c 20 73 74 61 74 65  re the SQL state
6130: 6d 65 6e 74 20 69 6e 20 62 75 66 66 65 72 20 7a  ment in buffer z
6140: 53 71 6c 20 61 67 61 69 6e 73 74 20 64 61 74 61  Sql against data
6150: 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a  base handle db..
6160: 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
6170: 2c 20 73 65 74 20 2a 70 70 53 74 6d 74 20 74 6f  , set *ppStmt to
6180: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65   point to the ne
6190: 77 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20  w statement and 
61a0: 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45  return.** SQLITE
61b0: 5f 4f 4b 2e 20 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  _OK. .**.** Othe
61c0: 72 77 69 73 65 2c 20 69 66 20 61 6e 20 65 72 72  rwise, if an err
61d0: 6f 72 20 64 6f 65 73 20 6f 63 63 75 72 2c 20 73  or does occur, s
61e0: 65 74 20 2a 70 70 53 74 6d 74 20 74 6f 20 4e 55  et *ppStmt to NU
61f0: 4c 4c 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a  LL and return.**
6200: 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
6210: 20 63 6f 64 65 2e 20 41 64 64 69 74 69 6f 6e 61   code. Additiona
6220: 6c 6c 79 2c 20 73 65 74 20 6f 75 74 70 75 74 20  lly, set output 
6230: 76 61 72 69 61 62 6c 65 20 2a 70 7a 45 72 72 6d  variable *pzErrm
6240: 73 67 20 74 6f 0a 2a 2a 20 70 6f 69 6e 74 20 74  sg to.** point t
6250: 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61  o a buffer conta
6260: 69 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 6d  ining an error m
6270: 65 73 73 61 67 65 2e 20 49 74 20 69 73 20 74 68  essage. It is th
6280: 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
6290: 0a 2a 2a 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  .** of the calle
62a0: 72 20 74 6f 20 28 65 76 65 6e 74 75 61 6c 6c 79  r to (eventually
62b0: 29 20 66 72 65 65 20 74 68 69 73 20 62 75 66 66  ) free this buff
62c0: 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  er using sqlite3
62d0: 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  _free()..*/.stat
62e0: 69 63 20 69 6e 74 20 70 72 65 70 61 72 65 41 6e  ic int prepareAn
62f0: 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 0a 20  dCollectError(. 
6300: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20   sqlite3 *db, . 
6310: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a   sqlite3_stmt **
6320: 70 70 53 74 6d 74 2c 0a 20 20 63 68 61 72 20 2a  ppStmt,.  char *
6330: 2a 70 7a 45 72 72 6d 73 67 2c 0a 20 20 63 6f 6e  *pzErrmsg,.  con
6340: 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 0a 29 7b  st char *zSql.){
6350: 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69  .  int rc = sqli
6360: 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64  te3_prepare_v2(d
6370: 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 70 70 53  b, zSql, -1, ppS
6380: 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  tmt, 0);.  if( r
6390: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
63a0: 20 20 20 20 2a 70 7a 45 72 72 6d 73 67 20 3d 20      *pzErrmsg = 
63b0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
63c0: 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 65 72  "%s", sqlite3_er
63d0: 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 20 20 2a  rmsg(db));.    *
63e0: 70 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a  ppStmt = 0;.  }.
63f0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
6400: 2f 2a 0a 2a 2a 20 52 65 73 65 74 20 74 68 65 20  /*.** Reset the 
6410: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 70 61  SQL statement pa
6420: 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
6430: 74 20 61 72 67 75 6d 65 6e 74 2e 20 52 65 74 75  t argument. Retu
6440: 72 6e 20 61 20 63 6f 70 79 0a 2a 2a 20 6f 66 20  rn a copy.** of 
6450: 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
6460: 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f 72 65  ed by sqlite3_re
6470: 73 65 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  set()..**.** If 
6480: 61 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63  an error has occ
6490: 75 72 72 65 64 2c 20 74 68 65 6e 20 73 65 74 20  urred, then set 
64a0: 2a 70 7a 45 72 72 6d 73 67 20 74 6f 20 70 6f 69  *pzErrmsg to poi
64b0: 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 0a 2a  nt to a buffer.*
64c0: 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6e 20  * containing an 
64d0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 20 49  error message. I
64e0: 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73  t is the respons
64f0: 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
6500: 61 6c 6c 65 72 0a 2a 2a 20 74 6f 20 65 76 65 6e  aller.** to even
6510: 74 75 61 6c 6c 79 20 66 72 65 65 20 74 68 69 73  tually free this
6520: 20 62 75 66 66 65 72 20 75 73 69 6e 67 20 73 71   buffer using sq
6530: 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f  lite3_free()..*/
6540: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 73 65  .static int rese
6550: 74 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72  tAndCollectError
6560: 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70  (sqlite3_stmt *p
6570: 53 74 6d 74 2c 20 63 68 61 72 20 2a 2a 70 7a 45  Stmt, char **pzE
6580: 72 72 6d 73 67 29 7b 0a 20 20 69 6e 74 20 72 63  rrmsg){.  int rc
6590: 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
65a0: 28 70 53 74 6d 74 29 3b 0a 20 20 69 66 28 20 72  (pStmt);.  if( r
65b0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
65c0: 20 20 20 20 2a 70 7a 45 72 72 6d 73 67 20 3d 20      *pzErrmsg = 
65d0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
65e0: 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 65 72  "%s", sqlite3_er
65f0: 72 6d 73 67 28 73 71 6c 69 74 65 33 5f 64 62 5f  rmsg(sqlite3_db_
6600: 68 61 6e 64 6c 65 28 70 53 74 6d 74 29 29 29 3b  handle(pStmt)));
6610: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
6620: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73  ;.}../*.** Unles
6630: 73 20 69 74 20 69 73 20 4e 55 4c 4c 2c 20 61 72  s it is NULL, ar
6640: 67 75 6d 65 6e 74 20 7a 53 71 6c 20 70 6f 69 6e  gument zSql poin
6650: 74 73 20 74 6f 20 61 20 62 75 66 66 65 72 20 61  ts to a buffer a
6660: 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 0a 2a  llocated using.*
6670: 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  * sqlite3_malloc
6680: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6e 20 53   containing an S
6690: 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68  QL statement. Th
66a0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 70 72 65 70  is function prep
66b0: 61 72 65 73 20 74 68 65 20 53 51 4c 0a 2a 2a 20  ares the SQL.** 
66c0: 73 74 61 74 65 6d 65 6e 74 20 61 67 61 69 6e 73  statement agains
66d0: 74 20 64 61 74 61 62 61 73 65 20 64 62 20 61 6e  t database db an
66e0: 64 20 66 72 65 65 73 20 74 68 65 20 62 75 66 66  d frees the buff
66f0: 65 72 2e 20 49 66 20 73 74 61 74 65 6d 65 6e 74  er. If statement
6700: 20 0a 2a 2a 20 63 6f 6d 70 69 6c 61 74 69 6f 6e   .** compilation
6710: 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20   is successful, 
6720: 2a 70 70 53 74 6d 74 20 69 73 20 73 65 74 20 74  *ppStmt is set t
6730: 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e  o point to the n
6740: 65 77 20 73 74 61 74 65 6d 65 6e 74 20 0a 2a 2a  ew statement .**
6750: 20 68 61 6e 64 6c 65 20 61 6e 64 20 53 51 4c 49   handle and SQLI
6760: 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
6770: 64 2e 20 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  d. .**.** Otherw
6780: 69 73 65 2c 20 69 66 20 61 6e 20 65 72 72 6f 72  ise, if an error
6790: 20 6f 63 63 75 72 73 2c 20 2a 70 70 53 74 6d 74   occurs, *ppStmt
67a0: 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20   is set to NULL 
67b0: 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  and an error cod
67c0: 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20 49  e.** returned. I
67d0: 6e 20 74 68 69 73 20 63 61 73 65 2c 20 2a 70 7a  n this case, *pz
67e0: 45 72 72 6d 73 67 20 6d 61 79 20 61 6c 73 6f 20  Errmsg may also 
67f0: 62 65 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  be set to point 
6800: 74 6f 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 6d  to an error.** m
6810: 65 73 73 61 67 65 2e 20 49 74 20 69 73 20 74 68  essage. It is th
6820: 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
6830: 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74   of the caller t
6840: 6f 20 66 72 65 65 20 74 68 69 73 20 65 72 72 6f  o free this erro
6850: 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 62 75 66  r message.** buf
6860: 66 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65  fer using sqlite
6870: 33 5f 66 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  3_free()..**.** 
6880: 49 66 20 61 72 67 75 6d 65 6e 74 20 7a 53 71 6c  If argument zSql
6890: 20 69 73 20 4e 55 4c 4c 2c 20 74 68 69 73 20 66   is NULL, this f
68a0: 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20  unction assumes 
68b0: 74 68 61 74 20 61 6e 20 4f 4f 4d 20 68 61 73 20  that an OOM has 
68c0: 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 20 49 6e 20  occurred..** In 
68d0: 74 68 69 73 20 63 61 73 65 20 53 51 4c 49 54 45  this case SQLITE
68e0: 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e  _NOMEM is return
68f0: 65 64 20 61 6e 64 20 2a 70 70 53 74 6d 74 20 73  ed and *ppStmt s
6900: 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73  et to NULL..*/.s
6910: 74 61 74 69 63 20 69 6e 74 20 70 72 65 70 61 72  tatic int prepar
6920: 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45  eFreeAndCollectE
6930: 72 72 6f 72 28 0a 20 20 73 71 6c 69 74 65 33 20  rror(.  sqlite3 
6940: 2a 64 62 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f  *db, .  sqlite3_
6950: 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 2c 0a 20  stmt **ppStmt,. 
6960: 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 6d 73 67   char **pzErrmsg
6970: 2c 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 0a 29  ,.  char *zSql.)
6980: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73  {.  int rc;.  as
6990: 73 65 72 74 28 20 2a 70 7a 45 72 72 6d 73 67 3d  sert( *pzErrmsg=
69a0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c  =0 );.  if( zSql
69b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
69c0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
69d0: 20 20 2a 70 70 53 74 6d 74 20 3d 20 30 3b 0a 20    *ppStmt = 0;. 
69e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
69f0: 20 70 72 65 70 61 72 65 41 6e 64 43 6f 6c 6c 65   prepareAndColle
6a00: 63 74 45 72 72 6f 72 28 64 62 2c 20 70 70 53 74  ctError(db, ppSt
6a10: 6d 74 2c 20 70 7a 45 72 72 6d 73 67 2c 20 7a 53  mt, pzErrmsg, zS
6a20: 71 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ql);.    sqlite3
6a30: 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 7d  _free(zSql);.  }
6a40: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
6a50: 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20  ./*.** Free the 
6a60: 52 62 75 4f 62 6a 49 74 65 72 2e 61 7a 54 62 6c  RbuObjIter.azTbl
6a70: 43 6f 6c 5b 5d 20 61 6e 64 20 52 62 75 4f 62 6a  Col[] and RbuObj
6a80: 49 74 65 72 2e 61 62 54 62 6c 50 6b 5b 5d 20 61  Iter.abTblPk[] a
6a90: 72 72 61 79 73 20 61 6c 6c 6f 63 61 74 65 64 0a  rrays allocated.
6aa0: 2a 2a 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72  ** by an earlier
6ab0: 20 63 61 6c 6c 20 74 6f 20 72 62 75 4f 62 6a 49   call to rbuObjI
6ac0: 74 65 72 43 61 63 68 65 54 61 62 6c 65 49 6e 66  terCacheTableInf
6ad0: 6f 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  o()..*/.static v
6ae0: 6f 69 64 20 72 62 75 4f 62 6a 49 74 65 72 46 72  oid rbuObjIterFr
6af0: 65 65 43 6f 6c 73 28 52 62 75 4f 62 6a 49 74 65  eeCols(RbuObjIte
6b00: 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e 74  r *pIter){.  int
6b10: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
6b20: 3c 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 3b  <pIter->nTblCol;
6b30: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
6b40: 65 33 5f 66 72 65 65 28 70 49 74 65 72 2d 3e 61  e3_free(pIter->a
6b50: 7a 54 62 6c 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20  zTblCol[i]);.   
6b60: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49   sqlite3_free(pI
6b70: 74 65 72 2d 3e 61 7a 54 62 6c 54 79 70 65 5b 69  ter->azTblType[i
6b80: 5d 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ]);.  }.  sqlite
6b90: 33 5f 66 72 65 65 28 70 49 74 65 72 2d 3e 61 7a  3_free(pIter->az
6ba0: 54 62 6c 43 6f 6c 29 3b 0a 20 20 70 49 74 65 72  TblCol);.  pIter
6bb0: 2d 3e 61 7a 54 62 6c 43 6f 6c 20 3d 20 30 3b 0a  ->azTblCol = 0;.
6bc0: 20 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 54 79    pIter->azTblTy
6bd0: 70 65 20 3d 20 30 3b 0a 20 20 70 49 74 65 72 2d  pe = 0;.  pIter-
6be0: 3e 61 69 53 72 63 4f 72 64 65 72 20 3d 20 30 3b  >aiSrcOrder = 0;
6bf0: 0a 20 20 70 49 74 65 72 2d 3e 61 62 54 62 6c 50  .  pIter->abTblP
6c00: 6b 20 3d 20 30 3b 0a 20 20 70 49 74 65 72 2d 3e  k = 0;.  pIter->
6c10: 61 62 4e 6f 74 4e 75 6c 6c 20 3d 20 30 3b 0a 20  abNotNull = 0;. 
6c20: 20 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 20   pIter->nTblCol 
6c30: 3d 20 30 3b 0a 20 20 70 49 74 65 72 2d 3e 65 54  = 0;.  pIter->eT
6c40: 79 70 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ype = 0;        
6c50: 20 20 20 20 20 20 20 2f 2a 20 49 6e 76 61 6c 69         /* Invali
6c60: 64 20 76 61 6c 75 65 20 2a 2f 0a 7d 0a 0a 2f 2a  d value */.}../*
6c70: 0a 2a 2a 20 46 69 6e 61 6c 69 7a 65 20 61 6c 6c  .** Finalize all
6c80: 20 73 74 61 74 65 6d 65 6e 74 73 20 61 6e 64 20   statements and 
6c90: 66 72 65 65 20 61 6c 6c 20 61 6c 6c 6f 63 61 74  free all allocat
6ca0: 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20 73 70  ions that are sp
6cb0: 65 63 69 66 69 63 20 74 6f 0a 2a 2a 20 74 68 65  ecific to.** the
6cc0: 20 63 75 72 72 65 6e 74 20 6f 62 6a 65 63 74 20   current object 
6cd0: 28 74 61 62 6c 65 2f 69 6e 64 65 78 20 70 61 69  (table/index pai
6ce0: 72 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  r)..*/.static vo
6cf0: 69 64 20 72 62 75 4f 62 6a 49 74 65 72 43 6c 65  id rbuObjIterCle
6d00: 61 72 53 74 61 74 65 6d 65 6e 74 73 28 52 62 75  arStatements(Rbu
6d10: 4f 62 6a 49 74 65 72 20 2a 70 49 74 65 72 29 7b  ObjIter *pIter){
6d20: 0a 20 20 52 62 75 55 70 64 61 74 65 53 74 6d 74  .  RbuUpdateStmt
6d30: 20 2a 70 55 70 3b 0a 0a 20 20 73 71 6c 69 74 65   *pUp;..  sqlite
6d40: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 49 74 65 72  3_finalize(pIter
6d50: 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 73 71  ->pSelect);.  sq
6d60: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
6d70: 49 74 65 72 2d 3e 70 49 6e 73 65 72 74 29 3b 0a  Iter->pInsert);.
6d80: 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
6d90: 7a 65 28 70 49 74 65 72 2d 3e 70 44 65 6c 65 74  ze(pIter->pDelet
6da0: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  e);.  sqlite3_fi
6db0: 6e 61 6c 69 7a 65 28 70 49 74 65 72 2d 3e 70 54  nalize(pIter->pT
6dc0: 6d 70 49 6e 73 65 72 74 29 3b 0a 20 20 70 55 70  mpInsert);.  pUp
6dd0: 20 3d 20 70 49 74 65 72 2d 3e 70 52 62 75 55 70   = pIter->pRbuUp
6de0: 64 61 74 65 3b 0a 20 20 77 68 69 6c 65 28 20 70  date;.  while( p
6df0: 55 70 20 29 7b 0a 20 20 20 20 52 62 75 55 70 64  Up ){.    RbuUpd
6e00: 61 74 65 53 74 6d 74 20 2a 70 54 6d 70 20 3d 20  ateStmt *pTmp = 
6e10: 70 55 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  pUp->pNext;.    
6e20: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
6e30: 28 70 55 70 2d 3e 70 55 70 64 61 74 65 29 3b 0a  (pUp->pUpdate);.
6e40: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
6e50: 28 70 55 70 29 3b 0a 20 20 20 20 70 55 70 20 3d  (pUp);.    pUp =
6e60: 20 70 54 6d 70 3b 0a 20 20 7d 0a 20 20 0a 20 20   pTmp;.  }.  .  
6e70: 70 49 74 65 72 2d 3e 70 53 65 6c 65 63 74 20 3d  pIter->pSelect =
6e80: 20 30 3b 0a 20 20 70 49 74 65 72 2d 3e 70 49 6e   0;.  pIter->pIn
6e90: 73 65 72 74 20 3d 20 30 3b 0a 20 20 70 49 74 65  sert = 0;.  pIte
6ea0: 72 2d 3e 70 44 65 6c 65 74 65 20 3d 20 30 3b 0a  r->pDelete = 0;.
6eb0: 20 20 70 49 74 65 72 2d 3e 70 52 62 75 55 70 64    pIter->pRbuUpd
6ec0: 61 74 65 20 3d 20 30 3b 0a 20 20 70 49 74 65 72  ate = 0;.  pIter
6ed0: 2d 3e 70 54 6d 70 49 6e 73 65 72 74 20 3d 20 30  ->pTmpInsert = 0
6ee0: 3b 0a 20 20 70 49 74 65 72 2d 3e 6e 43 6f 6c 20  ;.  pIter->nCol 
6ef0: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  = 0;.}../*.** Cl
6f00: 65 61 6e 20 75 70 20 61 6e 79 20 72 65 73 6f 75  ean up any resou
6f10: 72 63 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 61  rces allocated a
6f20: 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 69 74  s part of the it
6f30: 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 70 61  erator object pa
6f40: 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 6f  ssed.** as the o
6f50: 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  nly argument..*/
6f60: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75  .static void rbu
6f70: 4f 62 6a 49 74 65 72 46 69 6e 61 6c 69 7a 65 28  ObjIterFinalize(
6f80: 52 62 75 4f 62 6a 49 74 65 72 20 2a 70 49 74 65  RbuObjIter *pIte
6f90: 72 29 7b 0a 20 20 72 62 75 4f 62 6a 49 74 65 72  r){.  rbuObjIter
6fa0: 43 6c 65 61 72 53 74 61 74 65 6d 65 6e 74 73 28  ClearStatements(
6fb0: 70 49 74 65 72 29 3b 0a 20 20 73 71 6c 69 74 65  pIter);.  sqlite
6fc0: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 49 74 65 72  3_finalize(pIter
6fd0: 2d 3e 70 54 62 6c 49 74 65 72 29 3b 0a 20 20 73  ->pTblIter);.  s
6fe0: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
6ff0: 70 49 74 65 72 2d 3e 70 49 64 78 49 74 65 72 29  pIter->pIdxIter)
7000: 3b 0a 20 20 72 62 75 4f 62 6a 49 74 65 72 46 72  ;.  rbuObjIterFr
7010: 65 65 43 6f 6c 73 28 70 49 74 65 72 29 3b 0a 20  eeCols(pIter);. 
7020: 20 6d 65 6d 73 65 74 28 70 49 74 65 72 2c 20 30   memset(pIter, 0
7030: 2c 20 73 69 7a 65 6f 66 28 52 62 75 4f 62 6a 49  , sizeof(RbuObjI
7040: 74 65 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ter));.}../*.** 
7050: 41 64 76 61 6e 63 65 20 74 68 65 20 69 74 65 72  Advance the iter
7060: 61 74 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74  ator to the next
7070: 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   position..**.**
7080: 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63   If no error occ
7090: 75 72 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  urs, SQLITE_OK i
70a0: 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74  s returned and t
70b0: 68 65 20 69 74 65 72 61 74 6f 72 20 69 73 20 6c  he iterator is l
70c0: 65 66 74 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67  eft .** pointing
70d0: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74   to the next ent
70e0: 72 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61  ry. Otherwise, a
70f0: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64  n error code and
7100: 20 6d 65 73 73 61 67 65 20 69 73 20 0a 2a 2a 20   message is .** 
7110: 6c 65 66 74 20 69 6e 20 74 68 65 20 52 42 55 20  left in the RBU 
7120: 68 61 6e 64 6c 65 20 70 61 73 73 65 64 20 61 73  handle passed as
7130: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
7140: 65 6e 74 2e 20 41 20 63 6f 70 79 20 6f 66 20 74  ent. A copy of t
7150: 68 65 20 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64  he .** error cod
7160: 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
7170: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62 75  /.static int rbu
7180: 4f 62 6a 49 74 65 72 4e 65 78 74 28 73 71 6c 69  ObjIterNext(sqli
7190: 74 65 33 72 62 75 20 2a 70 2c 20 52 62 75 4f 62  te3rbu *p, RbuOb
71a0: 6a 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  jIter *pIter){. 
71b0: 20 69 6e 74 20 72 63 20 3d 20 70 2d 3e 72 63 3b   int rc = p->rc;
71c0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
71d0: 45 5f 4f 4b 20 29 7b 0a 0a 20 20 20 20 2f 2a 20  E_OK ){..    /* 
71e0: 46 72 65 65 20 61 6e 79 20 53 51 4c 69 74 65 20  Free any SQLite 
71f0: 73 74 61 74 65 6d 65 6e 74 73 20 75 73 65 64 20  statements used 
7200: 77 68 69 6c 65 20 70 72 6f 63 65 73 73 69 6e 67  while processing
7210: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 6f 62   the previous ob
7220: 6a 65 63 74 20 2a 2f 20 0a 20 20 20 20 72 62 75  ject */ .    rbu
7230: 4f 62 6a 49 74 65 72 43 6c 65 61 72 53 74 61 74  ObjIterClearStat
7240: 65 6d 65 6e 74 73 28 70 49 74 65 72 29 3b 0a 20  ements(pIter);. 
7250: 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 7a 49     if( pIter->zI
7260: 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  dx==0 ){.      r
7270: 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  c = sqlite3_exec
7280: 28 70 2d 3e 64 62 4d 61 69 6e 2c 0a 20 20 20 20  (p->dbMain,.    
7290: 20 20 20 20 20 20 22 44 52 4f 50 20 54 52 49 47        "DROP TRIG
72a0: 47 45 52 20 49 46 20 45 58 49 53 54 53 20 74 65  GER IF EXISTS te
72b0: 6d 70 2e 72 62 75 5f 69 6e 73 65 72 74 5f 74 72  mp.rbu_insert_tr
72c0: 3b 22 0a 20 20 20 20 20 20 20 20 20 20 22 44 52  ;".          "DR
72d0: 4f 50 20 54 52 49 47 47 45 52 20 49 46 20 45 58  OP TRIGGER IF EX
72e0: 49 53 54 53 20 74 65 6d 70 2e 72 62 75 5f 75 70  ISTS temp.rbu_up
72f0: 64 61 74 65 31 5f 74 72 3b 22 0a 20 20 20 20 20  date1_tr;".     
7300: 20 20 20 20 20 22 44 52 4f 50 20 54 52 49 47 47       "DROP TRIGG
7310: 45 52 20 49 46 20 45 58 49 53 54 53 20 74 65 6d  ER IF EXISTS tem
7320: 70 2e 72 62 75 5f 75 70 64 61 74 65 32 5f 74 72  p.rbu_update2_tr
7330: 3b 22 0a 20 20 20 20 20 20 20 20 20 20 22 44 52  ;".          "DR
7340: 4f 50 20 54 52 49 47 47 45 52 20 49 46 20 45 58  OP TRIGGER IF EX
7350: 49 53 54 53 20 74 65 6d 70 2e 72 62 75 5f 64 65  ISTS temp.rbu_de
7360: 6c 65 74 65 5f 74 72 3b 22 0a 20 20 20 20 20 20  lete_tr;".      
7370: 20 20 20 20 2c 20 30 2c 20 30 2c 20 26 70 2d 3e      , 0, 0, &p->
7380: 7a 45 72 72 6d 73 67 0a 20 20 20 20 20 20 29 3b  zErrmsg.      );
7390: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
73a0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
73b0: 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72  .      if( pIter
73c0: 2d 3e 62 43 6c 65 61 6e 75 70 20 29 7b 0a 20 20  ->bCleanup ){.  
73d0: 20 20 20 20 20 20 72 62 75 4f 62 6a 49 74 65 72        rbuObjIter
73e0: 46 72 65 65 43 6f 6c 73 28 70 49 74 65 72 29 3b  FreeCols(pIter);
73f0: 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e  .        pIter->
7400: 62 43 6c 65 61 6e 75 70 20 3d 20 30 3b 0a 20 20  bCleanup = 0;.  
7410: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
7420: 65 33 5f 73 74 65 70 28 70 49 74 65 72 2d 3e 70  e3_step(pIter->p
7430: 54 62 6c 49 74 65 72 29 3b 0a 20 20 20 20 20 20  TblIter);.      
7440: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
7450: 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 20 20  _ROW ){.        
7460: 20 20 72 63 20 3d 20 72 65 73 65 74 41 6e 64 43    rc = resetAndC
7470: 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 49 74 65  ollectError(pIte
7480: 72 2d 3e 70 54 62 6c 49 74 65 72 2c 20 26 70 2d  r->pTblIter, &p-
7490: 3e 7a 45 72 72 6d 73 67 29 3b 0a 20 20 20 20 20  >zErrmsg);.     
74a0: 20 20 20 20 20 70 49 74 65 72 2d 3e 7a 54 62 6c       pIter->zTbl
74b0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 0;.        }e
74c0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
74d0: 49 74 65 72 2d 3e 7a 54 62 6c 20 3d 20 28 63 6f  Iter->zTbl = (co
74e0: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
74f0: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 49  3_column_text(pI
7500: 74 65 72 2d 3e 70 54 62 6c 49 74 65 72 2c 20 30  ter->pTblIter, 0
7510: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74  );.          pIt
7520: 65 72 2d 3e 7a 44 61 74 61 54 62 6c 20 3d 20 28  er->zDataTbl = (
7530: 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
7540: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
7550: 70 49 74 65 72 2d 3e 70 54 62 6c 49 74 65 72 2c  pIter->pTblIter,
7560: 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  1);.          rc
7570: 20 3d 20 28 70 49 74 65 72 2d 3e 7a 44 61 74 61   = (pIter->zData
7580: 54 62 6c 20 26 26 20 70 49 74 65 72 2d 3e 7a 54  Tbl && pIter->zT
7590: 62 6c 29 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20  bl) ? SQLITE_OK 
75a0: 3a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  : SQLITE_NOMEM;.
75b0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
75c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
75d0: 66 28 20 70 49 74 65 72 2d 3e 7a 49 64 78 3d 3d  f( pIter->zIdx==
75e0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
75f0: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 49 64  qlite3_stmt *pId
7600: 78 20 3d 20 70 49 74 65 72 2d 3e 70 49 64 78 49  x = pIter->pIdxI
7610: 74 65 72 3b 0a 20 20 20 20 20 20 20 20 20 20 72  ter;.          r
7620: 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  c = sqlite3_bind
7630: 5f 74 65 78 74 28 70 49 64 78 2c 20 31 2c 20 70  _text(pIdx, 1, p
7640: 49 74 65 72 2d 3e 7a 54 62 6c 2c 20 2d 31 2c 20  Iter->zTbl, -1, 
7650: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
7660: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7670: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
7680: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
7690: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74   rc = sqlite3_st
76a0: 65 70 28 70 49 74 65 72 2d 3e 70 49 64 78 49 74  ep(pIter->pIdxIt
76b0: 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  er);.          i
76c0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 52 4f  f( rc!=SQLITE_RO
76d0: 57 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  W ){.           
76e0: 20 72 63 20 3d 20 72 65 73 65 74 41 6e 64 43 6f   rc = resetAndCo
76f0: 6c 6c 65 63 74 45 72 72 6f 72 28 70 49 74 65 72  llectError(pIter
7700: 2d 3e 70 49 64 78 49 74 65 72 2c 20 26 70 2d 3e  ->pIdxIter, &p->
7710: 7a 45 72 72 6d 73 67 29 3b 0a 20 20 20 20 20 20  zErrmsg);.      
7720: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 62 43 6c        pIter->bCl
7730: 65 61 6e 75 70 20 3d 20 31 3b 0a 20 20 20 20 20  eanup = 1;.     
7740: 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 7a 49         pIter->zI
7750: 64 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  dx = 0;.        
7760: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
7770: 20 20 20 20 20 70 49 74 65 72 2d 3e 7a 49 64 78       pIter->zIdx
7780: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
7790: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
77a0: 65 78 74 28 70 49 74 65 72 2d 3e 70 49 64 78 49  ext(pIter->pIdxI
77b0: 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ter, 0);.       
77c0: 20 20 20 20 20 70 49 74 65 72 2d 3e 69 54 6e 75       pIter->iTnu
77d0: 6d 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  m = sqlite3_colu
77e0: 6d 6e 5f 69 6e 74 28 70 49 74 65 72 2d 3e 70 49  mn_int(pIter->pI
77f0: 64 78 49 74 65 72 2c 20 31 29 3b 0a 20 20 20 20  dxIter, 1);.    
7800: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 62          pIter->b
7810: 55 6e 69 71 75 65 20 3d 20 73 71 6c 69 74 65 33  Unique = sqlite3
7820: 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 49 74 65  _column_int(pIte
7830: 72 2d 3e 70 49 64 78 49 74 65 72 2c 20 32 29 3b  r->pIdxIter, 2);
7840: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
7850: 3d 20 70 49 74 65 72 2d 3e 7a 49 64 78 20 3f 20  = pIter->zIdx ? 
7860: 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49  SQLITE_OK : SQLI
7870: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
7880: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
7890: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
78a0: 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  }..  if( rc!=SQL
78b0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 62  ITE_OK ){.    rb
78c0: 75 4f 62 6a 49 74 65 72 46 69 6e 61 6c 69 7a 65  uObjIterFinalize
78d0: 28 70 49 74 65 72 29 3b 0a 20 20 20 20 70 2d 3e  (pIter);.    p->
78e0: 72 63 20 3d 20 72 63 3b 0a 20 20 7d 0a 20 20 72  rc = rc;.  }.  r
78f0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
7900: 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e  .** The implemen
7910: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 72 62  tation of the rb
7920: 75 5f 74 61 72 67 65 74 5f 6e 61 6d 65 28 29 20  u_target_name() 
7930: 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68  SQL function. Th
7940: 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61  is function.** a
7950: 63 63 65 70 74 73 20 6f 6e 65 20 6f 72 20 74 77  ccepts one or tw
7960: 6f 20 61 72 67 75 6d 65 6e 74 73 2e 20 54 68 65  o arguments. The
7970: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
7980: 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  is the name of a
7990: 20 74 61 62 6c 65 20 2d 0a 2a 2a 20 74 68 65 20   table -.** the 
79a0: 6e 61 6d 65 20 6f 66 20 61 20 74 61 62 6c 65 20  name of a table 
79b0: 69 6e 20 74 68 65 20 52 42 55 20 64 61 74 61 62  in the RBU datab
79c0: 61 73 65 2e 20 20 54 68 65 20 73 65 63 6f 6e 64  ase.  The second
79d0: 2c 20 69 66 20 69 74 20 69 73 20 70 72 65 73 65  , if it is prese
79e0: 6e 74 2c 20 69 73 20 31 0a 2a 2a 20 66 6f 72 20  nt, is 1.** for 
79f0: 61 20 76 69 65 77 20 6f 72 20 30 20 66 6f 72 20  a view or 0 for 
7a00: 61 20 74 61 62 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20  a table. .**.** 
7a10: 46 6f 72 20 61 20 6e 6f 6e 2d 76 61 63 75 75 6d  For a non-vacuum
7a20: 20 52 42 55 20 68 61 6e 64 6c 65 2c 20 69 66 20   RBU handle, if 
7a30: 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 6d  the table name m
7a40: 61 74 63 68 65 73 20 74 68 65 20 70 61 74 74 65  atches the patte
7a50: 72 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 64 61  rn:.**.**     da
7a60: 74 61 5b 30 2d 39 5d 5f 3c 6e 61 6d 65 3e 0a 2a  ta[0-9]_<name>.*
7a70: 2a 0a 2a 2a 20 77 68 65 72 65 20 3c 6e 61 6d 65  *.** where <name
7a80: 3e 20 69 73 20 61 6e 79 20 73 65 71 75 65 6e 63  > is any sequenc
7a90: 65 20 6f 66 20 31 20 6f 72 20 6d 6f 72 65 20 63  e of 1 or more c
7aa0: 68 61 72 61 63 74 65 72 73 2c 20 3c 6e 61 6d 65  haracters, <name
7ab0: 3e 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  > is returned..*
7ac0: 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
7ad0: 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e  the only argumen
7ae0: 74 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  t does not match
7af0: 20 74 68 65 20 61 62 6f 76 65 20 70 61 74 74 65   the above patte
7b00: 72 6e 2c 20 61 6e 20 53 51 4c 0a 2a 2a 20 4e 55  rn, an SQL.** NU
7b10: 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  LL is returned..
7b20: 2a 2a 0a 2a 2a 20 20 20 20 20 22 64 61 74 61 5f  **.**     "data_
7b30: 74 31 22 20 20 20 20 20 2d 3e 20 22 74 31 22 0a  t1"     -> "t1".
7b40: 2a 2a 20 20 20 20 20 22 64 61 74 61 30 31 32 33  **     "data0123
7b50: 5f 74 32 22 20 2d 3e 20 22 74 32 22 0a 2a 2a 20  _t2" -> "t2".** 
7b60: 20 20 20 20 22 64 61 74 61 41 42 5f 74 33 22 20      "dataAB_t3" 
7b70: 20 20 2d 3e 20 4e 55 4c 4c 0a 2a 2a 0a 2a 2a 20    -> NULL.**.** 
7b80: 46 6f 72 20 61 6e 20 72 62 75 20 76 61 63 75 75  For an rbu vacuu
7b90: 6d 20 68 61 6e 64 6c 65 2c 20 61 20 63 6f 70 79  m handle, a copy
7ba0: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 61 72   of the first ar
7bb0: 67 75 6d 65 6e 74 20 69 73 20 72 65 74 75 72 6e  gument is return
7bc0: 65 64 20 69 66 0a 2a 2a 20 74 68 65 20 73 65 63  ed if.** the sec
7bd0: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
7be0: 65 69 74 68 65 72 20 6d 69 73 73 69 6e 67 20 6f  either missing o
7bf0: 72 20 30 20 28 6e 6f 74 20 61 20 76 69 65 77 29  r 0 (not a view)
7c00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
7c10: 20 72 62 75 54 61 72 67 65 74 4e 61 6d 65 46 75   rbuTargetNameFu
7c20: 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  nc(.  sqlite3_co
7c30: 6e 74 65 78 74 20 2a 70 43 74 78 2c 0a 20 20 69  ntext *pCtx,.  i
7c40: 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74  nt argc,.  sqlit
7c50: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
7c60: 29 7b 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20  ){.  sqlite3rbu 
7c70: 2a 70 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65  *p = sqlite3_use
7c80: 72 5f 64 61 74 61 28 70 43 74 78 29 3b 0a 20 20  r_data(pCtx);.  
7c90: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 3b  const char *zIn;
7ca0: 0a 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3d  .  assert( argc=
7cb0: 3d 31 20 7c 7c 20 61 72 67 63 3d 3d 32 20 29 3b  =1 || argc==2 );
7cc0: 0a 0a 20 20 7a 49 6e 20 3d 20 28 63 6f 6e 73 74  ..  zIn = (const
7cd0: 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76   char*)sqlite3_v
7ce0: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
7cf0: 5d 29 3b 0a 20 20 69 66 28 20 7a 49 6e 20 29 7b  ]);.  if( zIn ){
7d00: 0a 20 20 20 20 69 66 28 20 72 62 75 49 73 56 61  .    if( rbuIsVa
7d10: 63 75 75 6d 28 70 29 20 29 7b 0a 20 20 20 20 20  cuum(p) ){.     
7d20: 20 69 66 28 20 61 72 67 63 3d 3d 31 20 7c 7c 20   if( argc==1 || 
7d30: 30 3d 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  0==sqlite3_value
7d40: 5f 69 6e 74 28 61 72 67 76 5b 31 5d 29 20 29 7b  _int(argv[1]) ){
7d50: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7d60: 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43 74  _result_text(pCt
7d70: 78 2c 20 7a 49 6e 2c 20 2d 31 2c 20 53 51 4c 49  x, zIn, -1, SQLI
7d80: 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
7d90: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
7da0: 20 20 20 20 20 69 66 28 20 73 74 72 6c 65 6e 28       if( strlen(
7db0: 7a 49 6e 29 3e 34 20 26 26 20 6d 65 6d 63 6d 70  zIn)>4 && memcmp
7dc0: 28 22 64 61 74 61 22 2c 20 7a 49 6e 2c 20 34 29  ("data", zIn, 4)
7dd0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
7de0: 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 66 6f  nt i;.        fo
7df0: 72 28 69 3d 34 3b 20 7a 49 6e 5b 69 5d 3e 3d 27  r(i=4; zIn[i]>='
7e00: 30 27 20 26 26 20 7a 49 6e 5b 69 5d 3c 3d 27 39  0' && zIn[i]<='9
7e10: 27 3b 20 69 2b 2b 29 3b 0a 20 20 20 20 20 20 20  '; i++);.       
7e20: 20 69 66 28 20 7a 49 6e 5b 69 5d 3d 3d 27 5f 27   if( zIn[i]=='_'
7e30: 20 26 26 20 7a 49 6e 5b 69 2b 31 5d 20 29 7b 0a   && zIn[i+1] ){.
7e40: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
7e50: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43  3_result_text(pC
7e60: 74 78 2c 20 26 7a 49 6e 5b 69 2b 31 5d 2c 20 2d  tx, &zIn[i+1], -
7e70: 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  1, SQLITE_STATIC
7e80: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
7e90: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
7ea0: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
7eb0: 7a 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  ze the iterator 
7ec0: 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64  structure passed
7ed0: 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
7ee0: 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49  rgument..**.** I
7ef0: 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  f no error occur
7f00: 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  s, SQLITE_OK is 
7f10: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65  returned and the
7f20: 20 69 74 65 72 61 74 6f 72 20 69 73 20 6c 65 66   iterator is lef
7f30: 74 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74  t .** pointing t
7f40: 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  o the first entr
7f50: 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e  y. Otherwise, an
7f60: 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20   error code and 
7f70: 6d 65 73 73 61 67 65 20 69 73 20 0a 2a 2a 20 6c  message is .** l
7f80: 65 66 74 20 69 6e 20 74 68 65 20 52 42 55 20 68  eft in the RBU h
7f90: 61 6e 64 6c 65 20 70 61 73 73 65 64 20 61 73 20  andle passed as 
7fa0: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
7fb0: 6e 74 2e 20 41 20 63 6f 70 79 20 6f 66 20 74 68  nt. A copy of th
7fc0: 65 20 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65  e .** error code
7fd0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
7fe0: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 4f  .static int rbuO
7ff0: 62 6a 49 74 65 72 46 69 72 73 74 28 73 71 6c 69  bjIterFirst(sqli
8000: 74 65 33 72 62 75 20 2a 70 2c 20 52 62 75 4f 62  te3rbu *p, RbuOb
8010: 6a 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  jIter *pIter){. 
8020: 20 69 6e 74 20 72 63 3b 0a 20 20 6d 65 6d 73 65   int rc;.  memse
8030: 74 28 70 49 74 65 72 2c 20 30 2c 20 73 69 7a 65  t(pIter, 0, size
8040: 6f 66 28 52 62 75 4f 62 6a 49 74 65 72 29 29 3b  of(RbuObjIter));
8050: 0a 0a 20 20 72 63 20 3d 20 70 72 65 70 61 72 65  ..  rc = prepare
8060: 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72  FreeAndCollectEr
8070: 72 6f 72 28 70 2d 3e 64 62 52 62 75 2c 20 26 70  ror(p->dbRbu, &p
8080: 49 74 65 72 2d 3e 70 54 62 6c 49 74 65 72 2c 20  Iter->pTblIter, 
8090: 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 20 0a 20 20  &p->zErrmsg, .  
80a0: 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74    sqlite3_mprint
80b0: 66 28 0a 20 20 20 20 20 20 22 53 45 4c 45 43 54  f(.      "SELECT
80c0: 20 72 62 75 5f 74 61 72 67 65 74 5f 6e 61 6d 65   rbu_target_name
80d0: 28 6e 61 6d 65 2c 20 74 79 70 65 3d 27 76 69 65  (name, type='vie
80e0: 77 27 29 20 41 53 20 74 61 72 67 65 74 2c 20 6e  w') AS target, n
80f0: 61 6d 65 20 22 0a 20 20 20 20 20 20 22 46 52 4f  ame ".      "FRO
8100: 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  M sqlite_master 
8110: 22 0a 20 20 20 20 20 20 22 57 48 45 52 45 20 74  ".      "WHERE t
8120: 79 70 65 20 49 4e 20 28 27 74 61 62 6c 65 27 2c  ype IN ('table',
8130: 20 27 76 69 65 77 27 29 20 41 4e 44 20 74 61 72   'view') AND tar
8140: 67 65 74 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20  get IS NOT NULL 
8150: 22 0a 20 20 20 20 20 20 22 20 25 73 20 22 0a 20  ".      " %s ". 
8160: 20 20 20 20 20 22 4f 52 44 45 52 20 42 59 20 6e       "ORDER BY n
8170: 61 6d 65 22 0a 20 20 2c 20 72 62 75 49 73 56 61  ame".  , rbuIsVa
8180: 63 75 75 6d 28 70 29 20 3f 20 22 41 4e 44 20 72  cuum(p) ? "AND r
8190: 6f 6f 74 70 61 67 65 21 3d 30 20 41 4e 44 20 72  ootpage!=0 AND r
81a0: 6f 6f 74 70 61 67 65 20 49 53 20 4e 4f 54 20 4e  ootpage IS NOT N
81b0: 55 4c 4c 22 20 3a 20 22 22 29 29 3b 0a 0a 20 20  ULL" : ""));..  
81c0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
81d0: 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 72  K ){.    rc = pr
81e0: 65 70 61 72 65 41 6e 64 43 6f 6c 6c 65 63 74 45  epareAndCollectE
81f0: 72 72 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20  rror(p->dbMain, 
8200: 26 70 49 74 65 72 2d 3e 70 49 64 78 49 74 65 72  &pIter->pIdxIter
8210: 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 0a 20  , &p->zErrmsg,. 
8220: 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 6e         "SELECT n
8230: 61 6d 65 2c 20 72 6f 6f 74 70 61 67 65 2c 20 73  ame, rootpage, s
8240: 71 6c 20 49 53 20 4e 55 4c 4c 20 4f 52 20 73 75  ql IS NULL OR su
8250: 62 73 74 72 28 38 2c 20 36 29 3d 3d 27 55 4e 49  bstr(8, 6)=='UNI
8260: 51 55 45 27 20 22 0a 20 20 20 20 20 20 20 20 22  QUE' ".        "
8270: 20 20 46 52 4f 4d 20 6d 61 69 6e 2e 73 71 6c 69    FROM main.sqli
8280: 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20  te_master ".    
8290: 20 20 20 20 22 20 20 57 48 45 52 45 20 74 79 70      "  WHERE typ
82a0: 65 3d 27 69 6e 64 65 78 27 20 41 4e 44 20 74 62  e='index' AND tb
82b0: 6c 5f 6e 61 6d 65 20 3d 20 3f 22 0a 20 20 20 20  l_name = ?".    
82c0: 29 3b 0a 20 20 7d 0a 0a 20 20 70 49 74 65 72 2d  );.  }..  pIter-
82d0: 3e 62 43 6c 65 61 6e 75 70 20 3d 20 31 3b 0a 20  >bCleanup = 1;. 
82e0: 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 72   p->rc = rc;.  r
82f0: 65 74 75 72 6e 20 72 62 75 4f 62 6a 49 74 65 72  eturn rbuObjIter
8300: 4e 65 78 74 28 70 2c 20 70 49 74 65 72 29 3b 0a  Next(p, pIter);.
8310: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  }../*.** This is
8320: 20 61 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e   a wrapper aroun
8330: 64 20 22 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  d "sqlite3_mprin
8340: 74 66 28 7a 46 6d 74 2c 20 2e 2e 2e 29 22 2e 20  tf(zFmt, ...)". 
8350: 49 66 20 61 6e 20 4f 4f 4d 20 6f 63 63 75 72 73  If an OOM occurs
8360: 2c 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 63 6f  ,.** an error co
8370: 64 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  de is stored in 
8380: 74 68 65 20 52 42 55 20 68 61 6e 64 6c 65 20 70  the RBU handle p
8390: 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
83a0: 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a  st argument..**.
83b0: 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68  ** If an error h
83c0: 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72  as already occur
83d0: 72 65 64 20 28 70 2d 3e 72 63 20 69 73 20 61 6c  red (p->rc is al
83e0: 72 65 61 64 79 20 73 65 74 20 74 6f 20 73 6f 6d  ready set to som
83f0: 65 74 68 69 6e 67 20 6f 74 68 65 72 0a 2a 2a 20  ething other.** 
8400: 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 29 2c  than SQLITE_OK),
8410: 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   then this funct
8420: 69 6f 6e 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c  ion returns NULL
8430: 20 77 69 74 68 6f 75 74 20 6d 6f 64 69 66 79 69   without modifyi
8440: 6e 67 20 74 68 65 0a 2a 2a 20 73 74 6f 72 65 64  ng the.** stored
8450: 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 6e 20   error code. In 
8460: 74 68 69 73 20 63 61 73 65 20 69 74 20 73 74 69  this case it sti
8470: 6c 6c 20 63 61 6c 6c 73 20 73 71 6c 69 74 65 33  ll calls sqlite3
8480: 5f 66 72 65 65 28 29 20 6f 6e 20 61 6e 79 20 0a  _free() on any .
8490: 2a 2a 20 70 72 69 6e 74 66 28 29 20 70 61 72 61  ** printf() para
84a0: 6d 65 74 65 72 73 20 61 73 73 6f 63 69 61 74 65  meters associate
84b0: 64 20 77 69 74 68 20 25 7a 20 63 6f 6e 76 65 72  d with %z conver
84c0: 73 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  sions..*/.static
84d0: 20 63 68 61 72 20 2a 72 62 75 4d 50 72 69 6e 74   char *rbuMPrint
84e0: 66 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c  f(sqlite3rbu *p,
84f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d   const char *zFm
8500: 74 2c 20 2e 2e 2e 29 7b 0a 20 20 63 68 61 72 20  t, ...){.  char 
8510: 2a 7a 53 71 6c 20 3d 20 30 3b 0a 20 20 76 61 5f  *zSql = 0;.  va_
8520: 6c 69 73 74 20 61 70 3b 0a 20 20 76 61 5f 73 74  list ap;.  va_st
8530: 61 72 74 28 61 70 2c 20 7a 46 6d 74 29 3b 0a 20  art(ap, zFmt);. 
8540: 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
8550: 76 6d 70 72 69 6e 74 66 28 7a 46 6d 74 2c 20 61  vmprintf(zFmt, a
8560: 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  p);.  if( p->rc=
8570: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
8580: 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 20    if( zSql==0 ) 
8590: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  p->rc = SQLITE_N
85a0: 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  OMEM;.  }else{. 
85b0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
85c0: 7a 53 71 6c 29 3b 0a 20 20 20 20 7a 53 71 6c 20  zSql);.    zSql 
85d0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 76 61 5f 65 6e  = 0;.  }.  va_en
85e0: 64 28 61 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  d(ap);.  return 
85f0: 7a 53 71 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  zSql;.}../*.** A
8600: 72 67 75 6d 65 6e 74 20 7a 46 6d 74 20 69 73 20  rgument zFmt is 
8610: 61 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  a sqlite3_mprint
8620: 66 28 29 20 73 74 79 6c 65 20 66 6f 72 6d 61 74  f() style format
8630: 20 73 74 72 69 6e 67 2e 20 54 68 65 20 74 72 61   string. The tra
8640: 69 6c 69 6e 67 0a 2a 2a 20 61 72 67 75 6d 65 6e  iling.** argumen
8650: 74 73 20 61 72 65 20 74 68 65 20 75 73 75 61 6c  ts are the usual
8660: 20 73 75 62 73 69 74 75 74 69 6f 6e 20 76 61 6c   subsitution val
8670: 75 65 73 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ues. This functi
8680: 6f 6e 20 70 65 72 66 6f 72 6d 73 0a 2a 2a 20 74  on performs.** t
8690: 68 65 20 70 72 69 6e 74 66 28 29 20 73 74 79 6c  he printf() styl
86a0: 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e 73 20  e substitutions 
86b0: 61 6e 64 20 65 78 65 63 75 74 65 73 20 74 68 65  and executes the
86c0: 20 72 65 73 75 6c 74 20 61 73 20 61 6e 20 53 51   result as an SQ
86d0: 4c 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 6f  L.** statement o
86e0: 6e 20 74 68 65 20 52 42 55 20 68 61 6e 64 6c 65  n the RBU handle
86f0: 73 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  s database..**.*
8700: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
8710: 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63  curs, an error c
8720: 6f 64 65 20 61 6e 64 20 65 72 72 6f 72 20 6d 65  ode and error me
8730: 73 73 61 67 65 20 69 73 20 73 74 6f 72 65 64 20  ssage is stored 
8740: 69 6e 20 74 68 65 0a 2a 2a 20 52 42 55 20 68 61  in the.** RBU ha
8750: 6e 64 6c 65 2e 20 49 66 20 61 6e 20 65 72 72 6f  ndle. If an erro
8760: 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63  r has already oc
8770: 63 75 72 72 65 64 20 77 68 65 6e 20 74 68 69 73  curred when this
8780: 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20   function is.** 
8790: 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20  called, it is a 
87a0: 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
87b0: 20 69 6e 74 20 72 62 75 4d 50 72 69 6e 74 66 45   int rbuMPrintfE
87c0: 78 65 63 28 73 71 6c 69 74 65 33 72 62 75 20 2a  xec(sqlite3rbu *
87d0: 70 2c 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  p, sqlite3 *db, 
87e0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d 74  const char *zFmt
87f0: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
8800: 74 20 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 53  t ap;.  char *zS
8810: 71 6c 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61  ql;.  va_start(a
8820: 70 2c 20 7a 46 6d 74 29 3b 0a 20 20 7a 53 71 6c  p, zFmt);.  zSql
8830: 20 3d 20 73 71 6c 69 74 65 33 5f 76 6d 70 72 69   = sqlite3_vmpri
8840: 6e 74 66 28 7a 46 6d 74 2c 20 61 70 29 3b 0a 20  ntf(zFmt, ap);. 
8850: 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
8860: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
8870: 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20   zSql==0 ){.    
8880: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
8890: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73  _NOMEM;.    }els
88a0: 65 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  e{.      p->rc =
88b0: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62   sqlite3_exec(db
88c0: 2c 20 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 26 70  , zSql, 0, 0, &p
88d0: 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a 20 20 20 20  ->zErrmsg);.    
88e0: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  }.  }.  sqlite3_
88f0: 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 76 61  free(zSql);.  va
8900: 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72 65 74 75  _end(ap);.  retu
8910: 72 6e 20 70 2d 3e 72 63 3b 0a 7d 0a 0a 2f 2a 0a  rn p->rc;.}../*.
8920: 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 61 6c  ** Attempt to al
8930: 6c 6f 63 61 74 65 20 61 6e 64 20 72 65 74 75 72  locate and retur
8940: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
8950: 20 7a 65 72 6f 65 64 20 62 6c 6f 63 6b 20 6f 66   zeroed block of
8960: 20 6e 42 79 74 65 20 0a 2a 2a 20 62 79 74 65 73   nByte .** bytes
8970: 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  . .**.** If an e
8980: 72 72 6f 72 20 28 69 2e 65 2e 20 61 6e 20 4f 4f  rror (i.e. an OO
8990: 4d 20 63 6f 6e 64 69 74 69 6f 6e 29 20 6f 63 63  M condition) occ
89a0: 75 72 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c  urs, return NULL
89b0: 20 61 6e 64 20 6c 65 61 76 65 20 61 6e 20 0a 2a   and leave an .*
89c0: 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 6e 20  * error code in 
89d0: 74 68 65 20 72 62 75 20 68 61 6e 64 6c 65 20 70  the rbu handle p
89e0: 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
89f0: 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 4f 72 2c  st argument. Or,
8a00: 20 69 66 20 61 6e 20 0a 2a 2a 20 65 72 72 6f 72   if an .** error
8a10: 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63   has already occ
8a20: 75 72 72 65 64 20 77 68 65 6e 20 74 68 69 73 20  urred when this 
8a30: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
8a40: 65 64 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20  ed, return NULL 
8a50: 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  .** immediately 
8a60: 77 69 74 68 6f 75 74 20 61 74 74 65 6d 70 74 69  without attempti
8a70: 6e 67 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f  ng the allocatio
8a80: 6e 20 6f 72 20 6d 6f 64 69 66 79 69 6e 67 20 74  n or modifying t
8a90: 68 65 20 73 74 6f 72 65 64 0a 2a 2a 20 65 72 72  he stored.** err
8aa0: 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  or code..*/.stat
8ab0: 69 63 20 76 6f 69 64 20 2a 72 62 75 4d 61 6c 6c  ic void *rbuMall
8ac0: 6f 63 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70  oc(sqlite3rbu *p
8ad0: 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  , sqlite3_int64 
8ae0: 6e 42 79 74 65 29 7b 0a 20 20 76 6f 69 64 20 2a  nByte){.  void *
8af0: 70 52 65 74 20 3d 20 30 3b 0a 20 20 69 66 28 20  pRet = 0;.  if( 
8b00: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
8b10: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
8b20: 6e 42 79 74 65 3e 30 20 29 3b 0a 20 20 20 20 70  nByte>0 );.    p
8b30: 52 65 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  Ret = sqlite3_ma
8b40: 6c 6c 6f 63 36 34 28 6e 42 79 74 65 29 3b 0a 20  lloc64(nByte);. 
8b50: 20 20 20 69 66 28 20 70 52 65 74 3d 3d 30 20 29     if( pRet==0 )
8b60: 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20  {.      p->rc = 
8b70: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
8b80: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d    }else{.      m
8b90: 65 6d 73 65 74 28 70 52 65 74 2c 20 30 2c 20 6e  emset(pRet, 0, n
8ba0: 42 79 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Byte);.    }.  }
8bb0: 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
8bc0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  }.../*.** Alloca
8bd0: 74 65 20 61 6e 64 20 7a 65 72 6f 20 74 68 65 20  te and zero the 
8be0: 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b  pIter->azTblCol[
8bf0: 5d 20 61 6e 64 20 61 62 54 62 6c 50 6b 5b 5d 20  ] and abTblPk[] 
8c00: 61 72 72 61 79 73 20 73 6f 20 74 68 61 74 0a 2a  arrays so that.*
8c10: 2a 20 74 68 65 72 65 20 69 73 20 72 6f 6f 6d 20  * there is room 
8c20: 66 6f 72 20 61 74 20 6c 65 61 73 74 20 6e 43 6f  for at least nCo
8c30: 6c 20 65 6c 65 6d 65 6e 74 73 2e 20 49 66 20 61  l elements. If a
8c40: 6e 20 4f 4f 4d 20 6f 63 63 75 72 73 2c 20 73 74  n OOM occurs, st
8c50: 6f 72 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20  ore an.** error 
8c60: 63 6f 64 65 20 69 6e 20 74 68 65 20 52 42 55 20  code in the RBU 
8c70: 68 61 6e 64 6c 65 20 70 61 73 73 65 64 20 61 73  handle passed as
8c80: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
8c90: 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ent..*/.static v
8ca0: 6f 69 64 20 72 62 75 41 6c 6c 6f 63 61 74 65 49  oid rbuAllocateI
8cb0: 74 65 72 41 72 72 61 79 73 28 73 71 6c 69 74 65  terArrays(sqlite
8cc0: 33 72 62 75 20 2a 70 2c 20 52 62 75 4f 62 6a 49  3rbu *p, RbuObjI
8cd0: 74 65 72 20 2a 70 49 74 65 72 2c 20 69 6e 74 20  ter *pIter, int 
8ce0: 6e 43 6f 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33  nCol){.  sqlite3
8cf0: 5f 69 6e 74 36 34 20 6e 42 79 74 65 20 3d 20 28  _int64 nByte = (
8d00: 32 2a 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 20  2*sizeof(char*) 
8d10: 2b 20 73 69 7a 65 6f 66 28 69 6e 74 29 20 2b 20  + sizeof(int) + 
8d20: 33 2a 73 69 7a 65 6f 66 28 75 38 29 29 20 2a 20  3*sizeof(u8)) * 
8d30: 6e 43 6f 6c 3b 0a 20 20 63 68 61 72 20 2a 2a 61  nCol;.  char **a
8d40: 7a 4e 65 77 3b 0a 0a 20 20 61 7a 4e 65 77 20 3d  zNew;..  azNew =
8d50: 20 28 63 68 61 72 2a 2a 29 72 62 75 4d 61 6c 6c   (char**)rbuMall
8d60: 6f 63 28 70 2c 20 6e 42 79 74 65 29 3b 0a 20 20  oc(p, nByte);.  
8d70: 69 66 28 20 61 7a 4e 65 77 20 29 7b 0a 20 20 20  if( azNew ){.   
8d80: 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c   pIter->azTblCol
8d90: 20 3d 20 61 7a 4e 65 77 3b 0a 20 20 20 20 70 49   = azNew;.    pI
8da0: 74 65 72 2d 3e 61 7a 54 62 6c 54 79 70 65 20 3d  ter->azTblType =
8db0: 20 26 61 7a 4e 65 77 5b 6e 43 6f 6c 5d 3b 0a 20   &azNew[nCol];. 
8dc0: 20 20 20 70 49 74 65 72 2d 3e 61 69 53 72 63 4f     pIter->aiSrcO
8dd0: 72 64 65 72 20 3d 20 28 69 6e 74 2a 29 26 70 49  rder = (int*)&pI
8de0: 74 65 72 2d 3e 61 7a 54 62 6c 54 79 70 65 5b 6e  ter->azTblType[n
8df0: 43 6f 6c 5d 3b 0a 20 20 20 20 70 49 74 65 72 2d  Col];.    pIter-
8e00: 3e 61 62 54 62 6c 50 6b 20 3d 20 28 75 38 2a 29  >abTblPk = (u8*)
8e10: 26 70 49 74 65 72 2d 3e 61 69 53 72 63 4f 72 64  &pIter->aiSrcOrd
8e20: 65 72 5b 6e 43 6f 6c 5d 3b 0a 20 20 20 20 70 49  er[nCol];.    pI
8e30: 74 65 72 2d 3e 61 62 4e 6f 74 4e 75 6c 6c 20 3d  ter->abNotNull =
8e40: 20 28 75 38 2a 29 26 70 49 74 65 72 2d 3e 61 62   (u8*)&pIter->ab
8e50: 54 62 6c 50 6b 5b 6e 43 6f 6c 5d 3b 0a 20 20 20  TblPk[nCol];.   
8e60: 20 70 49 74 65 72 2d 3e 61 62 49 6e 64 65 78 65   pIter->abIndexe
8e70: 64 20 3d 20 28 75 38 2a 29 26 70 49 74 65 72 2d  d = (u8*)&pIter-
8e80: 3e 61 62 4e 6f 74 4e 75 6c 6c 5b 6e 43 6f 6c 5d  >abNotNull[nCol]
8e90: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
8ea0: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
8eb0: 74 20 6d 75 73 74 20 62 65 20 61 20 6e 75 6c 2d  t must be a nul-
8ec0: 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e  terminated strin
8ed0: 67 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  g. This function
8ee0: 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61 20 63 6f  .** returns a co
8ef0: 70 79 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67  py of the string
8f00: 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69   in memory obtai
8f10: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
8f20: 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 49 74  _malloc()..** It
8f30: 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
8f40: 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
8f50: 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c  ller to eventual
8f60: 6c 79 20 66 72 65 65 20 74 68 69 73 20 6d 65 6d  ly free this mem
8f70: 6f 72 79 0a 2a 2a 20 75 73 69 6e 67 20 73 71 6c  ory.** using sql
8f80: 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2a 0a  ite3_free()..**.
8f90: 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 63 6f 6e  ** If an OOM con
8fa0: 64 69 74 69 6f 6e 20 69 73 20 65 6e 63 6f 75 6e  dition is encoun
8fb0: 74 65 72 65 64 20 77 68 65 6e 20 61 74 74 65 6d  tered when attem
8fc0: 70 74 69 6e 67 20 74 6f 20 61 6c 6c 6f 63 61 74  pting to allocat
8fd0: 65 20 6d 65 6d 6f 72 79 2c 0a 2a 2a 20 6f 75 74  e memory,.** out
8fe0: 70 75 74 20 76 61 72 69 61 62 6c 65 20 28 2a 70  put variable (*p
8ff0: 52 63 29 20 69 73 20 73 65 74 20 74 6f 20 53 51  Rc) is set to SQ
9000: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 62 65 66 6f 72  LITE_NOMEM befor
9010: 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 4f 74 68  e returning. Oth
9020: 65 72 77 69 73 65 2c 0a 2a 2a 20 69 66 20 74 68  erwise,.** if th
9030: 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 75 63  e allocation suc
9040: 63 65 65 64 73 2c 20 28 2a 70 52 63 29 20 69 73  ceeds, (*pRc) is
9050: 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e   left unchanged.
9060: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
9070: 2a 72 62 75 53 74 72 6e 64 75 70 28 63 6f 6e 73  *rbuStrndup(cons
9080: 74 20 63 68 61 72 20 2a 7a 53 74 72 2c 20 69 6e  t char *zStr, in
9090: 74 20 2a 70 52 63 29 7b 0a 20 20 63 68 61 72 20  t *pRc){.  char 
90a0: 2a 7a 52 65 74 20 3d 20 30 3b 0a 0a 20 20 61 73  *zRet = 0;..  as
90b0: 73 65 72 74 28 20 2a 70 52 63 3d 3d 53 51 4c 49  sert( *pRc==SQLI
90c0: 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 7a  TE_OK );.  if( z
90d0: 53 74 72 20 29 7b 0a 20 20 20 20 73 69 7a 65 5f  Str ){.    size_
90e0: 74 20 6e 43 6f 70 79 20 3d 20 73 74 72 6c 65 6e  t nCopy = strlen
90f0: 28 7a 53 74 72 29 20 2b 20 31 3b 0a 20 20 20 20  (zStr) + 1;.    
9100: 7a 52 65 74 20 3d 20 28 63 68 61 72 2a 29 73 71  zRet = (char*)sq
9110: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e  lite3_malloc64(n
9120: 43 6f 70 79 29 3b 0a 20 20 20 20 69 66 28 20 7a  Copy);.    if( z
9130: 52 65 74 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  Ret ){.      mem
9140: 63 70 79 28 7a 52 65 74 2c 20 7a 53 74 72 2c 20  cpy(zRet, zStr, 
9150: 6e 43 6f 70 79 29 3b 0a 20 20 20 20 7d 65 6c 73  nCopy);.    }els
9160: 65 7b 0a 20 20 20 20 20 20 2a 70 52 63 20 3d 20  e{.      *pRc = 
9170: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
9180: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
9190: 6e 20 7a 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n zRet;.}../*.**
91a0: 20 46 69 6e 61 6c 69 7a 65 20 74 68 65 20 73 74   Finalize the st
91b0: 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61  atement passed a
91c0: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
91d0: 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ument..**.** If 
91e0: 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  the sqlite3_fina
91f0: 6c 69 7a 65 28 29 20 63 61 6c 6c 20 69 6e 64 69  lize() call indi
9200: 63 61 74 65 73 20 74 68 61 74 20 61 6e 20 65 72  cates that an er
9210: 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 64 20  ror occurs, and 
9220: 74 68 65 0a 2a 2a 20 72 62 75 20 68 61 6e 64 6c  the.** rbu handl
9230: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
9240: 6e 6f 74 20 61 6c 72 65 61 64 79 20 73 65 74 2c  not already set,
9250: 20 73 65 74 20 74 68 65 20 65 72 72 6f 72 20 63   set the error c
9260: 6f 64 65 20 61 6e 64 20 65 72 72 6f 72 0a 2a 2a  ode and error.**
9270: 20 6d 65 73 73 61 67 65 20 61 63 63 6f 72 64 69   message accordi
9280: 6e 67 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ngly..*/.static 
9290: 76 6f 69 64 20 72 62 75 46 69 6e 61 6c 69 7a 65  void rbuFinalize
92a0: 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20  (sqlite3rbu *p, 
92b0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
92c0: 74 6d 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  tmt){.  sqlite3 
92d0: 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 64 62  *db = sqlite3_db
92e0: 5f 68 61 6e 64 6c 65 28 70 53 74 6d 74 29 3b 0a  _handle(pStmt);.
92f0: 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
9300: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
9310: 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  t);.  if( p->rc=
9320: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63  =SQLITE_OK && rc
9330: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
9340: 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20     p->rc = rc;. 
9350: 20 20 20 70 2d 3e 7a 45 72 72 6d 73 67 20 3d 20     p->zErrmsg = 
9360: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
9370: 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 65 72  "%s", sqlite3_er
9380: 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 7d 0a 7d  rmsg(db));.  }.}
9390: 0a 0a 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 74  ../* Determine t
93a0: 68 65 20 74 79 70 65 20 6f 66 20 61 20 74 61 62  he type of a tab
93b0: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 70 65 54 79  le..**.**   peTy
93c0: 70 65 20 69 73 20 6f 66 20 74 79 70 65 20 28 69  pe is of type (i
93d0: 6e 74 2a 29 2c 20 61 20 70 6f 69 6e 74 65 72 20  nt*), a pointer 
93e0: 74 6f 20 61 6e 20 6f 75 74 70 75 74 20 70 61 72  to an output par
93f0: 61 6d 65 74 65 72 20 6f 66 20 74 79 70 65 0a 2a  ameter of type.*
9400: 2a 20 20 20 28 69 6e 74 29 2e 20 54 68 69 73 20  *   (int). This 
9410: 63 61 6c 6c 20 73 65 74 73 20 74 68 65 20 6f 75  call sets the ou
9420: 74 70 75 74 20 70 61 72 61 6d 65 74 65 72 20 61  tput parameter a
9430: 73 20 66 6f 6c 6c 6f 77 73 2c 20 64 65 70 65 6e  s follows, depen
9440: 64 69 6e 67 0a 2a 2a 20 20 20 6f 6e 20 74 68 65  ding.**   on the
9450: 20 74 79 70 65 20 6f 66 20 74 68 65 20 74 61 62   type of the tab
9460: 6c 65 20 73 70 65 63 69 66 69 65 64 20 62 79 20  le specified by 
9470: 70 61 72 61 6d 65 74 65 72 73 20 64 62 4e 61 6d  parameters dbNam
9480: 65 20 61 6e 64 20 7a 54 62 6c 2e 0a 2a 2a 0a 2a  e and zTbl..**.*
9490: 2a 20 20 20 20 20 52 42 55 5f 50 4b 5f 4e 4f 54  *     RBU_PK_NOT
94a0: 41 42 4c 45 3a 20 20 20 20 20 20 20 4e 6f 20 73  ABLE:       No s
94b0: 75 63 68 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20  uch table..**   
94c0: 20 20 52 42 55 5f 50 4b 5f 4e 4f 4e 45 3a 20 20    RBU_PK_NONE:  
94d0: 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 68 61          Table ha
94e0: 73 20 61 6e 20 69 6d 70 6c 69 63 69 74 20 72 6f  s an implicit ro
94f0: 77 69 64 2e 0a 2a 2a 20 20 20 20 20 52 42 55 5f  wid..**     RBU_
9500: 50 4b 5f 49 50 4b 3a 20 20 20 20 20 20 20 20 20  PK_IPK:         
9510: 20 20 54 61 62 6c 65 20 68 61 73 20 61 6e 20 65    Table has an e
9520: 78 70 6c 69 63 69 74 20 49 50 4b 20 63 6f 6c 75  xplicit IPK colu
9530: 6d 6e 2e 0a 2a 2a 20 20 20 20 20 52 42 55 5f 50  mn..**     RBU_P
9540: 4b 5f 45 58 54 45 52 4e 41 4c 3a 20 20 20 20 20  K_EXTERNAL:     
9550: 20 54 61 62 6c 65 20 68 61 73 20 61 6e 20 65 78   Table has an ex
9560: 74 65 72 6e 61 6c 20 50 4b 20 69 6e 64 65 78 2e  ternal PK index.
9570: 0a 2a 2a 20 20 20 20 20 52 42 55 5f 50 4b 5f 57  .**     RBU_PK_W
9580: 49 54 48 4f 55 54 5f 52 4f 57 49 44 3a 20 54 61  ITHOUT_ROWID: Ta
9590: 62 6c 65 20 69 73 20 57 49 54 48 4f 55 54 20 52  ble is WITHOUT R
95a0: 4f 57 49 44 2e 0a 2a 2a 20 20 20 20 20 52 42 55  OWID..**     RBU
95b0: 5f 50 4b 5f 56 54 41 42 3a 20 20 20 20 20 20 20  _PK_VTAB:       
95c0: 20 20 20 54 61 62 6c 65 20 69 73 20 61 20 76 69     Table is a vi
95d0: 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a  rtual table..**.
95e0: 2a 2a 20 20 20 41 72 67 75 6d 65 6e 74 20 2a 70  **   Argument *p
95f0: 69 50 6b 20 69 73 20 61 6c 73 6f 20 6f 66 20 74  iPk is also of t
9600: 79 70 65 20 28 69 6e 74 2a 29 2c 20 61 6e 64 20  ype (int*), and 
9610: 61 6c 73 6f 20 70 6f 69 6e 74 73 20 74 6f 20 61  also points to a
9620: 6e 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20 70 61  n output.**   pa
9630: 72 61 6d 65 74 65 72 2e 20 55 6e 6c 65 73 73 20  rameter. Unless 
9640: 74 68 65 20 74 61 62 6c 65 20 68 61 73 20 61 6e  the table has an
9650: 20 65 78 74 65 72 6e 61 6c 20 70 72 69 6d 61 72   external primar
9660: 79 20 6b 65 79 20 69 6e 64 65 78 20 0a 2a 2a 20  y key index .** 
9670: 20 20 28 69 2e 65 2e 20 75 6e 6c 65 73 73 20 2a    (i.e. unless *
9680: 70 65 54 79 70 65 20 69 73 20 73 65 74 20 74 6f  peType is set to
9690: 20 33 29 2c 20 74 68 65 6e 20 2a 70 69 50 6b 20   3), then *piPk 
96a0: 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20  is set to zero. 
96b0: 4f 72 2c 0a 2a 2a 20 20 20 69 66 20 74 68 65 20  Or,.**   if the 
96c0: 74 61 62 6c 65 20 64 6f 65 73 20 68 61 76 65 20  table does have 
96d0: 61 6e 20 65 78 74 65 72 6e 61 6c 20 70 72 69 6d  an external prim
96e0: 61 72 79 20 6b 65 79 20 69 6e 64 65 78 2c 20 74  ary key index, t
96f0: 68 65 6e 20 2a 70 69 50 6b 0a 2a 2a 20 20 20 69  hen *piPk.**   i
9700: 73 20 73 65 74 20 74 6f 20 74 68 65 20 72 6f 6f  s set to the roo
9710: 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  t page number of
9720: 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79   the primary key
9730: 20 69 6e 64 65 78 20 62 65 66 6f 72 65 0a 2a 2a   index before.**
9740: 20 20 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a     returning..**
9750: 0a 2a 2a 20 41 4c 47 4f 52 49 54 48 4d 3a 0a 2a  .** ALGORITHM:.*
9760: 2a 0a 2a 2a 20 20 20 69 66 28 20 6e 6f 20 65 6e  *.**   if( no en
9770: 74 72 79 20 65 78 69 73 74 73 20 69 6e 20 73 71  try exists in sq
9780: 6c 69 74 65 5f 6d 61 73 74 65 72 20 29 7b 0a 2a  lite_master ){.*
9790: 2a 20 20 20 20 20 72 65 74 75 72 6e 20 52 42 55  *     return RBU
97a0: 5f 50 4b 5f 4e 4f 54 41 42 4c 45 0a 2a 2a 20 20  _PK_NOTABLE.**  
97b0: 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 20 66   }else if( sql f
97c0: 6f 72 20 74 68 65 20 65 6e 74 72 79 20 73 74 61  or the entry sta
97d0: 72 74 73 20 77 69 74 68 20 22 43 52 45 41 54 45  rts with "CREATE
97e0: 20 56 49 52 54 55 41 4c 22 20 29 7b 0a 2a 2a 20   VIRTUAL" ){.** 
97f0: 20 20 20 20 72 65 74 75 72 6e 20 52 42 55 5f 50      return RBU_P
9800: 4b 5f 56 54 41 42 0a 2a 2a 20 20 20 7d 65 6c 73  K_VTAB.**   }els
9810: 65 20 69 66 28 20 22 50 52 41 47 4d 41 20 69 6e  e if( "PRAGMA in
9820: 64 65 78 5f 6c 69 73 74 28 29 22 20 66 6f 72 20  dex_list()" for 
9830: 74 68 65 20 74 61 62 6c 65 20 63 6f 6e 74 61 69  the table contai
9840: 6e 73 20 61 20 22 70 6b 22 20 69 6e 64 65 78 20  ns a "pk" index 
9850: 29 7b 0a 2a 2a 20 20 20 20 20 69 66 28 20 74 68  ){.**     if( th
9860: 65 20 69 6e 64 65 78 20 74 68 61 74 20 69 73 20  e index that is 
9870: 74 68 65 20 70 6b 20 65 78 69 73 74 73 20 69 6e  the pk exists in
9880: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 29   sqlite_master )
9890: 7b 0a 2a 2a 20 20 20 20 20 20 20 2a 70 69 50 4b  {.**       *piPK
98a0: 20 3d 20 72 6f 6f 74 70 61 67 65 20 6f 66 20 74   = rootpage of t
98b0: 68 61 74 20 69 6e 64 65 78 2e 0a 2a 2a 20 20 20  hat index..**   
98c0: 20 20 20 20 72 65 74 75 72 6e 20 52 42 55 5f 50      return RBU_P
98d0: 4b 5f 45 58 54 45 52 4e 41 4c 0a 2a 2a 20 20 20  K_EXTERNAL.**   
98e0: 20 20 7d 65 6c 73 65 7b 0a 2a 2a 20 20 20 20 20    }else{.**     
98f0: 20 20 72 65 74 75 72 6e 20 52 42 55 5f 50 4b 5f    return RBU_PK_
9900: 57 49 54 48 4f 55 54 5f 52 4f 57 49 44 0a 2a 2a  WITHOUT_ROWID.**
9910: 20 20 20 20 20 7d 0a 2a 2a 20 20 20 7d 65 6c 73       }.**   }els
9920: 65 20 69 66 28 20 22 50 52 41 47 4d 41 20 74 61  e if( "PRAGMA ta
9930: 62 6c 65 5f 69 6e 66 6f 28 29 22 20 6c 69 73 74  ble_info()" list
9940: 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 22 70  s one or more "p
9950: 6b 22 20 63 6f 6c 75 6d 6e 73 20 29 7b 0a 2a 2a  k" columns ){.**
9960: 20 20 20 20 20 72 65 74 75 72 6e 20 52 42 55 5f       return RBU_
9970: 50 4b 5f 49 50 4b 0a 2a 2a 20 20 20 7d 65 6c 73  PK_IPK.**   }els
9980: 65 7b 0a 2a 2a 20 20 20 20 20 72 65 74 75 72 6e  e{.**     return
9990: 20 52 42 55 5f 50 4b 5f 4e 4f 4e 45 0a 2a 2a 20   RBU_PK_NONE.** 
99a0: 20 20 7d 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f    }.*/.static vo
99b0: 69 64 20 72 62 75 54 61 62 6c 65 54 79 70 65 28  id rbuTableType(
99c0: 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20 2a 70  .  sqlite3rbu *p
99d0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
99e0: 7a 54 61 62 2c 0a 20 20 69 6e 74 20 2a 70 65 54  zTab,.  int *peT
99f0: 79 70 65 2c 0a 20 20 69 6e 74 20 2a 70 69 54 6e  ype,.  int *piTn
9a00: 75 6d 2c 0a 20 20 69 6e 74 20 2a 70 69 50 6b 0a  um,.  int *piPk.
9a10: 29 7b 0a 20 20 2f 2a 0a 20 20 2a 2a 20 30 29 20  ){.  /*.  ** 0) 
9a20: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
9a30: 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
9a40: 65 72 20 77 68 65 72 65 20 6e 61 6d 65 3d 25 51  er where name=%Q
9a50: 20 41 4e 44 20 49 73 56 69 72 74 75 61 6c 28 25   AND IsVirtual(%
9a60: 51 29 0a 20 20 2a 2a 20 31 29 20 50 52 41 47 4d  Q).  ** 1) PRAGM
9a70: 41 20 69 6e 64 65 78 5f 6c 69 73 74 20 3d 20 3f  A index_list = ?
9a80: 0a 20 20 2a 2a 20 32 29 20 53 45 4c 45 43 54 20  .  ** 2) SELECT 
9a90: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 73 71  count(*) FROM sq
9aa0: 6c 69 74 65 5f 6d 61 73 74 65 72 20 77 68 65 72  lite_master wher
9ab0: 65 20 6e 61 6d 65 3d 25 51 20 0a 20 20 2a 2a 20  e name=%Q .  ** 
9ac0: 33 29 20 50 52 41 47 4d 41 20 74 61 62 6c 65 5f  3) PRAGMA table_
9ad0: 69 6e 66 6f 20 3d 20 3f 0a 20 20 2a 2f 0a 20 20  info = ?.  */.  
9ae0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 61 53  sqlite3_stmt *aS
9af0: 74 6d 74 5b 34 5d 20 3d 20 7b 30 2c 20 30 2c 20  tmt[4] = {0, 0, 
9b00: 30 2c 20 30 7d 3b 0a 0a 20 20 2a 70 65 54 79 70  0, 0};..  *peTyp
9b10: 65 20 3d 20 52 42 55 5f 50 4b 5f 4e 4f 54 41 42  e = RBU_PK_NOTAB
9b20: 4c 45 3b 0a 20 20 2a 70 69 50 6b 20 3d 20 30 3b  LE;.  *piPk = 0;
9b30: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72  ..  assert( p->r
9b40: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
9b50: 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72    p->rc = prepar
9b60: 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45  eFreeAndCollectE
9b70: 72 72 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20  rror(p->dbMain, 
9b80: 26 61 53 74 6d 74 5b 30 5d 2c 20 26 70 2d 3e 7a  &aStmt[0], &p->z
9b90: 45 72 72 6d 73 67 2c 20 0a 20 20 20 20 73 71 6c  Errmsg, .    sql
9ba0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20  ite3_mprintf(.  
9bb0: 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
9bc0: 28 73 71 6c 20 4c 49 4b 45 20 27 63 72 65 61 74  (sql LIKE 'creat
9bd0: 65 20 76 69 72 74 75 61 6c 25 25 27 29 2c 20 72  e virtual%%'), r
9be0: 6f 6f 74 70 61 67 65 22 0a 20 20 20 20 20 20 20  ootpage".       
9bf0: 20 20 20 22 20 20 46 52 4f 4d 20 73 71 6c 69 74     "  FROM sqlit
9c00: 65 5f 6d 61 73 74 65 72 22 0a 20 20 20 20 20 20  e_master".      
9c10: 20 20 20 20 22 20 57 48 45 52 45 20 6e 61 6d 65      " WHERE name
9c20: 3d 25 51 22 2c 20 7a 54 61 62 0a 20 20 29 29 3b  =%Q", zTab.  ));
9c30: 0a 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51  .  if( p->rc!=SQ
9c40: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74  LITE_OK || sqlit
9c50: 65 33 5f 73 74 65 70 28 61 53 74 6d 74 5b 30 5d  e3_step(aStmt[0]
9c60: 29 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  )!=SQLITE_ROW ){
9c70: 0a 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20 61  .    /* Either a
9c80: 6e 20 65 72 72 6f 72 2c 20 6f 72 20 6e 6f 20 73  n error, or no s
9c90: 75 63 68 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20  uch table. */.  
9ca0: 20 20 67 6f 74 6f 20 72 62 75 54 61 62 6c 65 54    goto rbuTableT
9cb0: 79 70 65 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69  ype_end;.  }.  i
9cc0: 66 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  f( sqlite3_colum
9cd0: 6e 5f 69 6e 74 28 61 53 74 6d 74 5b 30 5d 2c 20  n_int(aStmt[0], 
9ce0: 30 29 20 29 7b 0a 20 20 20 20 2a 70 65 54 79 70  0) ){.    *peTyp
9cf0: 65 20 3d 20 52 42 55 5f 50 4b 5f 56 54 41 42 3b  e = RBU_PK_VTAB;
9d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d10: 20 20 20 20 20 2f 2a 20 76 69 72 74 75 61 6c 20       /* virtual 
9d20: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 67 6f 74  table */.    got
9d30: 6f 20 72 62 75 54 61 62 6c 65 54 79 70 65 5f 65  o rbuTableType_e
9d40: 6e 64 3b 0a 20 20 7d 0a 20 20 2a 70 69 54 6e 75  nd;.  }.  *piTnu
9d50: 6d 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  m = sqlite3_colu
9d60: 6d 6e 5f 69 6e 74 28 61 53 74 6d 74 5b 30 5d 2c  mn_int(aStmt[0],
9d70: 20 31 29 3b 0a 0a 20 20 70 2d 3e 72 63 20 3d 20   1);..  p->rc = 
9d80: 70 72 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f  prepareFreeAndCo
9d90: 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62  llectError(p->db
9da0: 4d 61 69 6e 2c 20 26 61 53 74 6d 74 5b 31 5d 2c  Main, &aStmt[1],
9db0: 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 20 0a 20   &p->zErrmsg, . 
9dc0: 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e     sqlite3_mprin
9dd0: 74 66 28 22 50 52 41 47 4d 41 20 69 6e 64 65 78  tf("PRAGMA index
9de0: 5f 6c 69 73 74 3d 25 51 22 2c 7a 54 61 62 29 0a  _list=%Q",zTab).
9df0: 20 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63    );.  if( p->rc
9e00: 20 29 20 67 6f 74 6f 20 72 62 75 54 61 62 6c 65   ) goto rbuTable
9e10: 54 79 70 65 5f 65 6e 64 3b 0a 20 20 77 68 69 6c  Type_end;.  whil
9e20: 65 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  e( sqlite3_step(
9e30: 61 53 74 6d 74 5b 31 5d 29 3d 3d 53 51 4c 49 54  aStmt[1])==SQLIT
9e40: 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 63 6f 6e  E_ROW ){.    con
9e50: 73 74 20 75 38 20 2a 7a 4f 72 69 67 20 3d 20 73  st u8 *zOrig = s
9e60: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
9e70: 78 74 28 61 53 74 6d 74 5b 31 5d 2c 20 33 29 3b  xt(aStmt[1], 3);
9e80: 0a 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 7a  .    const u8 *z
9e90: 49 64 78 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  Idx = sqlite3_co
9ea0: 6c 75 6d 6e 5f 74 65 78 74 28 61 53 74 6d 74 5b  lumn_text(aStmt[
9eb0: 31 5d 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20  1], 1);.    if( 
9ec0: 7a 4f 72 69 67 20 26 26 20 7a 49 64 78 20 26 26  zOrig && zIdx &&
9ed0: 20 7a 4f 72 69 67 5b 30 5d 3d 3d 27 70 27 20 29   zOrig[0]=='p' )
9ee0: 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20  {.      p->rc = 
9ef0: 70 72 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f  prepareFreeAndCo
9f00: 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62  llectError(p->db
9f10: 4d 61 69 6e 2c 20 26 61 53 74 6d 74 5b 32 5d 2c  Main, &aStmt[2],
9f20: 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 20 0a 20   &p->zErrmsg, . 
9f30: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
9f40: 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20  _mprintf(.      
9f50: 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 72 6f        "SELECT ro
9f60: 6f 74 70 61 67 65 20 46 52 4f 4d 20 73 71 6c 69  otpage FROM sqli
9f70: 74 65 5f 6d 61 73 74 65 72 20 57 48 45 52 45 20  te_master WHERE 
9f80: 6e 61 6d 65 20 3d 20 25 51 22 2c 20 7a 49 64 78  name = %Q", zIdx
9f90: 0a 20 20 20 20 20 20 29 29 3b 0a 20 20 20 20 20  .      ));.     
9fa0: 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
9fb0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
9fc0: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 65   if( sqlite3_ste
9fd0: 70 28 61 53 74 6d 74 5b 32 5d 29 3d 3d 53 51 4c  p(aStmt[2])==SQL
9fe0: 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20  ITE_ROW ){.     
9ff0: 20 20 20 20 20 2a 70 69 50 6b 20 3d 20 73 71 6c       *piPk = sql
a000: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
a010: 61 53 74 6d 74 5b 32 5d 2c 20 30 29 3b 0a 20 20  aStmt[2], 0);.  
a020: 20 20 20 20 20 20 20 20 2a 70 65 54 79 70 65 20          *peType 
a030: 3d 20 52 42 55 5f 50 4b 5f 45 58 54 45 52 4e 41  = RBU_PK_EXTERNA
a040: 4c 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  L;.        }else
a050: 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 65 54  {.          *peT
a060: 79 70 65 20 3d 20 52 42 55 5f 50 4b 5f 57 49 54  ype = RBU_PK_WIT
a070: 48 4f 55 54 5f 52 4f 57 49 44 3b 0a 20 20 20 20  HOUT_ROWID;.    
a080: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
a090: 20 20 20 20 67 6f 74 6f 20 72 62 75 54 61 62 6c      goto rbuTabl
a0a0: 65 54 79 70 65 5f 65 6e 64 3b 0a 20 20 20 20 7d  eType_end;.    }
a0b0: 0a 20 20 7d 0a 0a 20 20 70 2d 3e 72 63 20 3d 20  .  }..  p->rc = 
a0c0: 70 72 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f  prepareFreeAndCo
a0d0: 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62  llectError(p->db
a0e0: 4d 61 69 6e 2c 20 26 61 53 74 6d 74 5b 33 5d 2c  Main, &aStmt[3],
a0f0: 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 20 0a 20   &p->zErrmsg, . 
a100: 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e     sqlite3_mprin
a110: 74 66 28 22 50 52 41 47 4d 41 20 74 61 62 6c 65  tf("PRAGMA table
a120: 5f 69 6e 66 6f 3d 25 51 22 2c 7a 54 61 62 29 0a  _info=%Q",zTab).
a130: 20 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63    );.  if( p->rc
a140: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
a150: 20 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65     while( sqlite
a160: 33 5f 73 74 65 70 28 61 53 74 6d 74 5b 33 5d 29  3_step(aStmt[3])
a170: 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
a180: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
a190: 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 61 53 74  3_column_int(aSt
a1a0: 6d 74 5b 33 5d 2c 35 29 3e 30 20 29 7b 0a 20 20  mt[3],5)>0 ){.  
a1b0: 20 20 20 20 20 20 2a 70 65 54 79 70 65 20 3d 20        *peType = 
a1c0: 52 42 55 5f 50 4b 5f 49 50 4b 3b 20 20 20 20 20  RBU_PK_IPK;     
a1d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 65 78             /* ex
a1e0: 70 6c 69 63 69 74 20 49 50 4b 20 63 6f 6c 75 6d  plicit IPK colum
a1f0: 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 6f 74  n */.        got
a200: 6f 20 72 62 75 54 61 62 6c 65 54 79 70 65 5f 65  o rbuTableType_e
a210: 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nd;.      }.    
a220: 7d 0a 20 20 20 20 2a 70 65 54 79 70 65 20 3d 20  }.    *peType = 
a230: 52 42 55 5f 50 4b 5f 4e 4f 4e 45 3b 0a 20 20 7d  RBU_PK_NONE;.  }
a240: 0a 0a 72 62 75 54 61 62 6c 65 54 79 70 65 5f 65  ..rbuTableType_e
a250: 6e 64 3a 20 7b 0a 20 20 20 20 75 6e 73 69 67 6e  nd: {.    unsign
a260: 65 64 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f  ed int i;.    fo
a270: 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
a280: 61 53 74 6d 74 29 2f 73 69 7a 65 6f 66 28 61 53  aStmt)/sizeof(aS
a290: 74 6d 74 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20  tmt[0]); i++){. 
a2a0: 20 20 20 20 20 72 62 75 46 69 6e 61 6c 69 7a 65       rbuFinalize
a2b0: 28 70 2c 20 61 53 74 6d 74 5b 69 5d 29 3b 0a 20  (p, aStmt[i]);. 
a2c0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
a2d0: 2a 20 54 68 69 73 20 69 73 20 61 20 68 65 6c 70  * This is a help
a2e0: 65 72 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20  er function for 
a2f0: 72 62 75 4f 62 6a 49 74 65 72 43 61 63 68 65 54  rbuObjIterCacheT
a300: 61 62 6c 65 49 6e 66 6f 28 29 2e 20 49 74 20 70  ableInfo(). It p
a310: 6f 70 75 6c 61 74 65 73 0a 2a 2a 20 74 68 65 20  opulates.** the 
a320: 70 49 74 65 72 2d 3e 61 62 49 6e 64 65 78 65 64  pIter->abIndexed
a330: 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61  [] array..*/.sta
a340: 74 69 63 20 76 6f 69 64 20 72 62 75 4f 62 6a 49  tic void rbuObjI
a350: 74 65 72 43 61 63 68 65 49 6e 64 65 78 65 64 43  terCacheIndexedC
a360: 6f 6c 73 28 73 71 6c 69 74 65 33 72 62 75 20 2a  ols(sqlite3rbu *
a370: 70 2c 20 52 62 75 4f 62 6a 49 74 65 72 20 2a 70  p, RbuObjIter *p
a380: 49 74 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33  Iter){.  sqlite3
a390: 5f 73 74 6d 74 20 2a 70 4c 69 73 74 20 3d 20 30  _stmt *pList = 0
a3a0: 3b 0a 20 20 69 6e 74 20 62 49 6e 64 65 78 20 3d  ;.  int bIndex =
a3b0: 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63   0;..  if( p->rc
a3c0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
a3d0: 20 20 20 6d 65 6d 63 70 79 28 70 49 74 65 72 2d     memcpy(pIter-
a3e0: 3e 61 62 49 6e 64 65 78 65 64 2c 20 70 49 74 65  >abIndexed, pIte
a3f0: 72 2d 3e 61 62 54 62 6c 50 6b 2c 20 73 69 7a 65  r->abTblPk, size
a400: 6f 66 28 75 38 29 2a 70 49 74 65 72 2d 3e 6e 54  of(u8)*pIter->nT
a410: 62 6c 43 6f 6c 29 3b 0a 20 20 20 20 70 2d 3e 72  blCol);.    p->r
a420: 63 20 3d 20 70 72 65 70 61 72 65 46 72 65 65 41  c = prepareFreeA
a430: 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70  ndCollectError(p
a440: 2d 3e 64 62 4d 61 69 6e 2c 20 26 70 4c 69 73 74  ->dbMain, &pList
a450: 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 0a 20  , &p->zErrmsg,. 
a460: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d         sqlite3_m
a470: 70 72 69 6e 74 66 28 22 50 52 41 47 4d 41 20 6d  printf("PRAGMA m
a480: 61 69 6e 2e 69 6e 64 65 78 5f 6c 69 73 74 20 3d  ain.index_list =
a490: 20 25 51 22 2c 20 70 49 74 65 72 2d 3e 7a 54 62   %Q", pIter->zTb
a4a0: 6c 29 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20  l).    );.  }.. 
a4b0: 20 70 49 74 65 72 2d 3e 6e 49 6e 64 65 78 20 3d   pIter->nIndex =
a4c0: 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e   0;.  while( p->
a4d0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
a4e0: 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
a4f0: 69 74 65 33 5f 73 74 65 70 28 70 4c 69 73 74 29  ite3_step(pList)
a500: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
a510: 61 72 20 2a 7a 49 64 78 20 3d 20 28 63 6f 6e 73  ar *zIdx = (cons
a520: 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
a530: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 4c 69 73  column_text(pLis
a540: 74 2c 20 31 29 3b 0a 20 20 20 20 69 6e 74 20 62  t, 1);.    int b
a550: 50 61 72 74 69 61 6c 20 3d 20 73 71 6c 69 74 65  Partial = sqlite
a560: 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 4c 69  3_column_int(pLi
a570: 73 74 2c 20 34 29 3b 0a 20 20 20 20 73 71 6c 69  st, 4);.    sqli
a580: 74 65 33 5f 73 74 6d 74 20 2a 70 58 49 6e 66 6f  te3_stmt *pXInfo
a590: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 7a 49   = 0;.    if( zI
a5a0: 64 78 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  dx==0 ) break;. 
a5b0: 20 20 20 69 66 28 20 62 50 61 72 74 69 61 6c 20     if( bPartial 
a5c0: 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  ){.      memset(
a5d0: 70 49 74 65 72 2d 3e 61 62 49 6e 64 65 78 65 64  pIter->abIndexed
a5e0: 2c 20 30 78 30 31 2c 20 73 69 7a 65 6f 66 28 75  , 0x01, sizeof(u
a5f0: 38 29 2a 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f  8)*pIter->nTblCo
a600: 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  l);.    }.    p-
a610: 3e 72 63 20 3d 20 70 72 65 70 61 72 65 46 72 65  >rc = prepareFre
a620: 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72  eAndCollectError
a630: 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 70 58 49  (p->dbMain, &pXI
a640: 6e 66 6f 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67  nfo, &p->zErrmsg
a650: 2c 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ,.        sqlite
a660: 33 5f 6d 70 72 69 6e 74 66 28 22 50 52 41 47 4d  3_mprintf("PRAGM
a670: 41 20 6d 61 69 6e 2e 69 6e 64 65 78 5f 78 69 6e  A main.index_xin
a680: 66 6f 20 3d 20 25 51 22 2c 20 7a 49 64 78 29 0a  fo = %Q", zIdx).
a690: 20 20 20 20 29 3b 0a 20 20 20 20 77 68 69 6c 65      );.    while
a6a0: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
a6b0: 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57  OK && SQLITE_ROW
a6c0: 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ==sqlite3_step(p
a6d0: 58 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 20 20  XInfo) ){.      
a6e0: 69 6e 74 20 69 43 69 64 20 3d 20 73 71 6c 69 74  int iCid = sqlit
a6f0: 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 58  e3_column_int(pX
a700: 49 6e 66 6f 2c 20 31 29 3b 0a 20 20 20 20 20 20  Info, 1);.      
a710: 69 66 28 20 69 43 69 64 3e 3d 30 20 29 20 70 49  if( iCid>=0 ) pI
a720: 74 65 72 2d 3e 61 62 49 6e 64 65 78 65 64 5b 69  ter->abIndexed[i
a730: 43 69 64 5d 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  Cid] = 1;.    }.
a740: 20 20 20 20 72 62 75 46 69 6e 61 6c 69 7a 65 28      rbuFinalize(
a750: 70 2c 20 70 58 49 6e 66 6f 29 3b 0a 20 20 20 20  p, pXInfo);.    
a760: 62 49 6e 64 65 78 20 3d 20 31 3b 0a 20 20 20 20  bIndex = 1;.    
a770: 70 49 74 65 72 2d 3e 6e 49 6e 64 65 78 2b 2b 3b  pIter->nIndex++;
a780: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 49 74 65  .  }..  if( pIte
a790: 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b  r->eType==RBU_PK
a7a0: 5f 57 49 54 48 4f 55 54 5f 52 4f 57 49 44 20 29  _WITHOUT_ROWID )
a7b0: 7b 0a 20 20 20 20 2f 2a 20 22 50 52 41 47 4d 41  {.    /* "PRAGMA
a7c0: 20 69 6e 64 65 78 5f 6c 69 73 74 22 20 69 6e 63   index_list" inc
a7d0: 6c 75 64 65 73 20 74 68 65 20 6d 61 69 6e 20 50  ludes the main P
a7e0: 4b 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 20 20  K b-tree */.    
a7f0: 70 49 74 65 72 2d 3e 6e 49 6e 64 65 78 2d 2d 3b  pIter->nIndex--;
a800: 0a 20 20 7d 0a 0a 20 20 72 62 75 46 69 6e 61 6c  .  }..  rbuFinal
a810: 69 7a 65 28 70 2c 20 70 4c 69 73 74 29 3b 0a 20  ize(p, pList);. 
a820: 20 69 66 28 20 62 49 6e 64 65 78 3d 3d 30 20 29   if( bIndex==0 )
a830: 20 70 49 74 65 72 2d 3e 61 62 49 6e 64 65 78 65   pIter->abIndexe
a840: 64 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  d = 0;.}.../*.**
a850: 20 49 66 20 74 68 65 79 20 61 72 65 20 6e 6f 74   If they are not
a860: 20 61 6c 72 65 61 64 79 20 70 6f 70 75 6c 61 74   already populat
a870: 65 64 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65  ed, populate the
a880: 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c   pIter->azTblCol
a890: 5b 5d 2c 0a 2a 2a 20 70 49 74 65 72 2d 3e 61 62  [],.** pIter->ab
a8a0: 54 62 6c 50 6b 5b 5d 2c 20 70 49 74 65 72 2d 3e  TblPk[], pIter->
a8b0: 6e 54 62 6c 43 6f 6c 20 61 6e 64 20 70 49 74 65  nTblCol and pIte
a8c0: 72 2d 3e 62 52 6f 77 69 64 20 76 61 72 69 61 62  r->bRowid variab
a8d0: 6c 65 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  les according to
a8e0: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 28 6e  .** the table (n
a8f0: 6f 74 20 69 6e 64 65 78 29 20 74 68 61 74 20 74  ot index) that t
a900: 68 65 20 69 74 65 72 61 74 6f 72 20 63 75 72 72  he iterator curr
a910: 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e  ently points to.
a920: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
a930: 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65  LITE_OK if succe
a940: 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c  ssful, or an SQL
a950: 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f  ite error code o
a960: 74 68 65 72 77 69 73 65 2e 20 49 66 0a 2a 2a 20  therwise. If.** 
a970: 61 6e 20 65 72 72 6f 72 20 64 6f 65 73 20 6f 63  an error does oc
a980: 63 75 72 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f  cur, an error co
a990: 64 65 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73  de and error mes
a9a0: 73 61 67 65 20 61 72 65 20 61 6c 73 6f 20 6c 65  sage are also le
a9b0: 66 74 20 69 6e 20 0a 2a 2a 20 74 68 65 20 52 42  ft in .** the RB
a9c0: 55 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61  U handle..*/.sta
a9d0: 74 69 63 20 69 6e 74 20 72 62 75 4f 62 6a 49 74  tic int rbuObjIt
a9e0: 65 72 43 61 63 68 65 54 61 62 6c 65 49 6e 66 6f  erCacheTableInfo
a9f0: 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20  (sqlite3rbu *p, 
aa00: 52 62 75 4f 62 6a 49 74 65 72 20 2a 70 49 74 65  RbuObjIter *pIte
aa10: 72 29 7b 0a 20 20 69 66 28 20 70 49 74 65 72 2d  r){.  if( pIter-
aa20: 3e 61 7a 54 62 6c 43 6f 6c 3d 3d 30 20 29 7b 0a  >azTblCol==0 ){.
aa30: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
aa40: 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20   *pStmt = 0;.   
aa50: 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20   int nCol = 0;. 
aa60: 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20     int i;       
aa70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa80: 20 2f 2a 20 66 6f 72 28 29 20 6c 6f 6f 70 20 69   /* for() loop i
aa90: 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65  terator variable
aaa0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 52 62 75   */.    int bRbu
aab0: 52 6f 77 69 64 20 3d 20 30 3b 20 20 20 20 20 20  Rowid = 0;      
aac0: 20 20 20 20 20 20 2f 2a 20 49 66 20 69 6e 70 75        /* If inpu
aad0: 74 20 74 61 62 6c 65 20 68 61 73 20 63 6f 6c 75  t table has colu
aae0: 6d 6e 20 22 72 62 75 5f 72 6f 77 69 64 22 20 2a  mn "rbu_rowid" *
aaf0: 2f 0a 20 20 20 20 69 6e 74 20 69 4f 72 64 65 72  /.    int iOrder
ab00: 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 54   = 0;.    int iT
ab10: 6e 75 6d 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a  num = 0;..    /*
ab20: 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20   Figure out the 
ab30: 74 79 70 65 20 6f 66 20 74 61 62 6c 65 20 74 68  type of table th
ab40: 69 73 20 73 74 65 70 20 77 69 6c 6c 20 64 65 61  is step will dea
ab50: 6c 20 77 69 74 68 2e 20 2a 2f 0a 20 20 20 20 61  l with. */.    a
ab60: 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 65 54  ssert( pIter->eT
ab70: 79 70 65 3d 3d 30 20 29 3b 0a 20 20 20 20 72 62  ype==0 );.    rb
ab80: 75 54 61 62 6c 65 54 79 70 65 28 70 2c 20 70 49  uTableType(p, pI
ab90: 74 65 72 2d 3e 7a 54 62 6c 2c 20 26 70 49 74 65  ter->zTbl, &pIte
aba0: 72 2d 3e 65 54 79 70 65 2c 20 26 69 54 6e 75 6d  r->eType, &iTnum
abb0: 2c 20 26 70 49 74 65 72 2d 3e 69 50 6b 54 6e 75  , &pIter->iPkTnu
abc0: 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72  m);.    if( p->r
abd0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
abe0: 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42  pIter->eType==RB
abf0: 55 5f 50 4b 5f 4e 4f 54 41 42 4c 45 20 29 7b 0a  U_PK_NOTABLE ){.
ac00: 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51        p->rc = SQ
ac10: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
ac20: 20 20 70 2d 3e 7a 45 72 72 6d 73 67 20 3d 20 73    p->zErrmsg = s
ac30: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
ac40: 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 25  no such table: %
ac50: 73 22 2c 20 70 49 74 65 72 2d 3e 7a 54 62 6c 29  s", pIter->zTbl)
ac60: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
ac70: 70 2d 3e 72 63 20 29 20 72 65 74 75 72 6e 20 70  p->rc ) return p
ac80: 2d 3e 72 63 3b 0a 20 20 20 20 69 66 28 20 70 49  ->rc;.    if( pI
ac90: 74 65 72 2d 3e 7a 49 64 78 3d 3d 30 20 29 20 70  ter->zIdx==0 ) p
aca0: 49 74 65 72 2d 3e 69 54 6e 75 6d 20 3d 20 69 54  Iter->iTnum = iT
acb0: 6e 75 6d 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  num;..    assert
acc0: 28 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d  ( pIter->eType==
acd0: 52 42 55 5f 50 4b 5f 4e 4f 4e 45 20 7c 7c 20 70  RBU_PK_NONE || p
ace0: 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55  Iter->eType==RBU
acf0: 5f 50 4b 5f 49 50 4b 20 0a 20 20 20 20 20 20 20  _PK_IPK .       
ad00: 20 20 7c 7c 20 70 49 74 65 72 2d 3e 65 54 79 70    || pIter->eTyp
ad10: 65 3d 3d 52 42 55 5f 50 4b 5f 45 58 54 45 52 4e  e==RBU_PK_EXTERN
ad20: 41 4c 20 7c 7c 20 70 49 74 65 72 2d 3e 65 54 79  AL || pIter->eTy
ad30: 70 65 3d 3d 52 42 55 5f 50 4b 5f 57 49 54 48 4f  pe==RBU_PK_WITHO
ad40: 55 54 5f 52 4f 57 49 44 0a 20 20 20 20 20 20 20  UT_ROWID.       
ad50: 20 20 7c 7c 20 70 49 74 65 72 2d 3e 65 54 79 70    || pIter->eTyp
ad60: 65 3d 3d 52 42 55 5f 50 4b 5f 56 54 41 42 0a 20  e==RBU_PK_VTAB. 
ad70: 20 20 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 50 6f     );..    /* Po
ad80: 70 75 6c 61 74 65 20 74 68 65 20 61 7a 54 62 6c  pulate the azTbl
ad90: 43 6f 6c 5b 5d 20 61 6e 64 20 6e 54 62 6c 43 6f  Col[] and nTblCo
ada0: 6c 20 76 61 72 69 61 62 6c 65 73 20 62 61 73 65  l variables base
adb0: 64 20 6f 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 73  d on the columns
adc0: 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 69  .    ** of the i
add0: 6e 70 75 74 20 74 61 62 6c 65 2e 20 49 67 6e 6f  nput table. Igno
ade0: 72 65 20 61 6e 79 20 69 6e 70 75 74 20 74 61 62  re any input tab
adf0: 6c 65 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20  le columns that 
ae00: 62 65 67 69 6e 20 77 69 74 68 0a 20 20 20 20 2a  begin with.    *
ae10: 2a 20 22 72 62 75 5f 22 2e 20 20 2a 2f 0a 20 20  * "rbu_".  */.  
ae20: 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72    p->rc = prepar
ae30: 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45  eFreeAndCollectE
ae40: 72 72 6f 72 28 70 2d 3e 64 62 52 62 75 2c 20 26  rror(p->dbRbu, &
ae50: 70 53 74 6d 74 2c 20 26 70 2d 3e 7a 45 72 72 6d  pStmt, &p->zErrm
ae60: 73 67 2c 20 0a 20 20 20 20 20 20 20 20 73 71 6c  sg, .        sql
ae70: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45  ite3_mprintf("SE
ae80: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 27 25 71 27  LECT * FROM '%q'
ae90: 22 2c 20 70 49 74 65 72 2d 3e 7a 44 61 74 61 54  ", pIter->zDataT
aea0: 62 6c 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  bl).    );.    i
aeb0: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
aec0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e 43 6f  _OK ){.      nCo
aed0: 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  l = sqlite3_colu
aee0: 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b  mn_count(pStmt);
aef0: 0a 20 20 20 20 20 20 72 62 75 41 6c 6c 6f 63 61  .      rbuAlloca
af00: 74 65 49 74 65 72 41 72 72 61 79 73 28 70 2c 20  teIterArrays(p, 
af10: 70 49 74 65 72 2c 20 6e 43 6f 6c 29 3b 0a 20 20  pIter, nCol);.  
af20: 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
af30: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
af40: 4b 20 26 26 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  K && i<nCol; i++
af50: 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
af60: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f  har *zName = (co
af70: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
af80: 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53  3_column_name(pS
af90: 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 69  tmt, i);.      i
afa0: 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69  f( sqlite3_strni
afb0: 63 6d 70 28 22 72 62 75 5f 22 2c 20 7a 4e 61 6d  cmp("rbu_", zNam
afc0: 65 2c 20 34 29 20 29 7b 0a 20 20 20 20 20 20 20  e, 4) ){.       
afd0: 20 63 68 61 72 20 2a 7a 43 6f 70 79 20 3d 20 72   char *zCopy = r
afe0: 62 75 53 74 72 6e 64 75 70 28 7a 4e 61 6d 65 2c  buStrndup(zName,
aff0: 20 26 70 2d 3e 72 63 29 3b 0a 20 20 20 20 20 20   &p->rc);.      
b000: 20 20 70 49 74 65 72 2d 3e 61 69 53 72 63 4f 72    pIter->aiSrcOr
b010: 64 65 72 5b 70 49 74 65 72 2d 3e 6e 54 62 6c 43  der[pIter->nTblC
b020: 6f 6c 5d 20 3d 20 70 49 74 65 72 2d 3e 6e 54 62  ol] = pIter->nTb
b030: 6c 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70 49  lCol;.        pI
b040: 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 70 49  ter->azTblCol[pI
b050: 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 2b 2b 5d 20  ter->nTblCol++] 
b060: 3d 20 7a 43 6f 70 79 3b 0a 20 20 20 20 20 20 7d  = zCopy;.      }
b070: 0a 20 20 20 20 20 20 65 6c 73 65 20 69 66 28 20  .      else if( 
b080: 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 69 63  0==sqlite3_stric
b090: 6d 70 28 22 72 62 75 5f 72 6f 77 69 64 22 2c 20  mp("rbu_rowid", 
b0a0: 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20  zName) ){.      
b0b0: 20 20 62 52 62 75 52 6f 77 69 64 20 3d 20 31 3b    bRbuRowid = 1;
b0c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
b0d0: 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
b0e0: 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
b0f0: 70 53 74 6d 74 20 3d 20 30 3b 0a 0a 20 20 20 20  pStmt = 0;..    
b100: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
b110: 45 5f 4f 4b 0a 20 20 20 20 20 26 26 20 72 62 75  E_OK.     && rbu
b120: 49 73 56 61 63 75 75 6d 28 70 29 3d 3d 30 0a 20  IsVacuum(p)==0. 
b130: 20 20 20 20 26 26 20 62 52 62 75 52 6f 77 69 64      && bRbuRowid
b140: 21 3d 28 70 49 74 65 72 2d 3e 65 54 79 70 65 3d  !=(pIter->eType=
b150: 3d 52 42 55 5f 50 4b 5f 56 54 41 42 20 7c 7c 20  =RBU_PK_VTAB || 
b160: 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42  pIter->eType==RB
b170: 55 5f 50 4b 5f 4e 4f 4e 45 29 0a 20 20 20 20 29  U_PK_NONE).    )
b180: 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20  {.      p->rc = 
b190: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
b1a0: 20 20 20 20 70 2d 3e 7a 45 72 72 6d 73 67 20 3d      p->zErrmsg =
b1b0: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
b1c0: 28 0a 20 20 20 20 20 20 20 20 20 20 22 74 61 62  (.          "tab
b1d0: 6c 65 20 25 71 20 25 73 20 72 62 75 5f 72 6f 77  le %q %s rbu_row
b1e0: 69 64 20 63 6f 6c 75 6d 6e 22 2c 20 70 49 74 65  id column", pIte
b1f0: 72 2d 3e 7a 44 61 74 61 54 62 6c 2c 0a 20 20 20  r->zDataTbl,.   
b200: 20 20 20 20 20 20 20 28 62 52 62 75 52 6f 77 69         (bRbuRowi
b210: 64 20 3f 20 22 6d 61 79 20 6e 6f 74 20 68 61 76  d ? "may not hav
b220: 65 22 20 3a 20 22 72 65 71 75 69 72 65 73 22 29  e" : "requires")
b230: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
b240: 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  .    /* Check th
b250: 61 74 20 61 6c 6c 20 6e 6f 6e 2d 48 49 44 44 45  at all non-HIDDE
b260: 4e 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  N columns in the
b270: 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 74 61 62   destination tab
b280: 6c 65 20 61 72 65 20 61 6c 73 6f 0a 20 20 20 20  le are also.    
b290: 2a 2a 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68  ** present in th
b2a0: 65 20 69 6e 70 75 74 20 74 61 62 6c 65 2e 20 50  e input table. P
b2b0: 6f 70 75 6c 61 74 65 20 74 68 65 20 61 62 54 62  opulate the abTb
b2c0: 6c 50 6b 5b 5d 2c 20 61 7a 54 62 6c 54 79 70 65  lPk[], azTblType
b2d0: 5b 5d 20 61 6e 64 0a 20 20 20 20 2a 2a 20 61 69  [] and.    ** ai
b2e0: 54 62 6c 4f 72 64 65 72 5b 5d 20 61 72 72 61 79  TblOrder[] array
b2f0: 73 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69  s at the same ti
b300: 6d 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  me.  */.    if( 
b310: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
b320: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20   ){.      p->rc 
b330: 3d 20 70 72 65 70 61 72 65 46 72 65 65 41 6e 64  = prepareFreeAnd
b340: 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e  CollectError(p->
b350: 64 62 4d 61 69 6e 2c 20 26 70 53 74 6d 74 2c 20  dbMain, &pStmt, 
b360: 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 20 0a 20 20  &p->zErrmsg, .  
b370: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
b380: 6d 70 72 69 6e 74 66 28 22 50 52 41 47 4d 41 20  mprintf("PRAGMA 
b390: 74 61 62 6c 65 5f 69 6e 66 6f 28 25 51 29 22 2c  table_info(%Q)",
b3a0: 20 70 49 74 65 72 2d 3e 7a 54 62 6c 29 0a 20 20   pIter->zTbl).  
b3b0: 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20      );.    }.   
b3c0: 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53   while( p->rc==S
b3d0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49  QLITE_OK && SQLI
b3e0: 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
b3f0: 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20  step(pStmt) ){. 
b400: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
b410: 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20  *zName = (const 
b420: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
b430: 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
b440: 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a   1);.      if( z
b450: 4e 61 6d 65 3d 3d 30 20 29 20 62 72 65 61 6b 3b  Name==0 ) break;
b460: 20 20 2f 2a 20 41 6e 20 4f 4f 4d 20 2d 20 66 69    /* An OOM - fi
b470: 6e 61 6c 69 7a 65 28 29 20 62 65 6c 6f 77 20 72  nalize() below r
b480: 65 74 75 72 6e 73 20 53 5f 4e 4f 4d 45 4d 20 2a  eturns S_NOMEM *
b490: 2f 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 69 4f  /.      for(i=iO
b4a0: 72 64 65 72 3b 20 69 3c 70 49 74 65 72 2d 3e 6e  rder; i<pIter->n
b4b0: 54 62 6c 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  TblCol; i++){.  
b4c0: 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72        if( 0==str
b4d0: 63 6d 70 28 7a 4e 61 6d 65 2c 20 70 49 74 65 72  cmp(zName, pIter
b4e0: 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69 5d 29 20 29  ->azTblCol[i]) )
b4f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
b500: 20 20 20 20 20 20 69 66 28 20 69 3d 3d 70 49 74        if( i==pIt
b510: 65 72 2d 3e 6e 54 62 6c 43 6f 6c 20 29 7b 0a 20  er->nTblCol ){. 
b520: 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53         p->rc = S
b530: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
b540: 20 20 20 20 20 70 2d 3e 7a 45 72 72 6d 73 67 20       p->zErrmsg 
b550: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
b560: 66 28 22 63 6f 6c 75 6d 6e 20 6d 69 73 73 69 6e  f("column missin
b570: 67 20 66 72 6f 6d 20 25 71 3a 20 25 73 22 2c 0a  g from %q: %s",.
b580: 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
b590: 72 2d 3e 7a 44 61 74 61 54 62 6c 2c 20 7a 4e 61  r->zDataTbl, zNa
b5a0: 6d 65 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  me.        );.  
b5b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
b5c0: 20 20 20 69 6e 74 20 69 50 6b 20 3d 20 73 71 6c     int iPk = sql
b5d0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
b5e0: 70 53 74 6d 74 2c 20 35 29 3b 0a 20 20 20 20 20  pStmt, 5);.     
b5f0: 20 20 20 69 6e 74 20 62 4e 6f 74 4e 75 6c 6c 20     int bNotNull 
b600: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
b610: 5f 69 6e 74 28 70 53 74 6d 74 2c 20 33 29 3b 0a  _int(pStmt, 3);.
b620: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
b630: 61 72 20 2a 7a 54 79 70 65 20 3d 20 28 63 6f 6e  ar *zType = (con
b640: 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
b650: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74  _column_text(pSt
b660: 6d 74 2c 20 32 29 3b 0a 0a 20 20 20 20 20 20 20  mt, 2);..       
b670: 20 69 66 28 20 69 21 3d 69 4f 72 64 65 72 20 29   if( i!=iOrder )
b680: 7b 0a 20 20 20 20 20 20 20 20 20 20 53 57 41 50  {.          SWAP
b690: 28 69 6e 74 2c 20 70 49 74 65 72 2d 3e 61 69 53  (int, pIter->aiS
b6a0: 72 63 4f 72 64 65 72 5b 69 5d 2c 20 70 49 74 65  rcOrder[i], pIte
b6b0: 72 2d 3e 61 69 53 72 63 4f 72 64 65 72 5b 69 4f  r->aiSrcOrder[iO
b6c0: 72 64 65 72 5d 29 3b 0a 20 20 20 20 20 20 20 20  rder]);.        
b6d0: 20 20 53 57 41 50 28 63 68 61 72 2a 2c 20 70 49    SWAP(char*, pI
b6e0: 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69 5d  ter->azTblCol[i]
b6f0: 2c 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f  , pIter->azTblCo
b700: 6c 5b 69 4f 72 64 65 72 5d 29 3b 0a 20 20 20 20  l[iOrder]);.    
b710: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 70      }..        p
b720: 49 74 65 72 2d 3e 61 7a 54 62 6c 54 79 70 65 5b  Iter->azTblType[
b730: 69 4f 72 64 65 72 5d 20 3d 20 72 62 75 53 74 72  iOrder] = rbuStr
b740: 6e 64 75 70 28 7a 54 79 70 65 2c 20 26 70 2d 3e  ndup(zType, &p->
b750: 72 63 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  rc);.        ass
b760: 65 72 74 28 20 69 50 6b 3e 3d 30 20 29 3b 0a 20  ert( iPk>=0 );. 
b770: 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 61 62         pIter->ab
b780: 54 62 6c 50 6b 5b 69 4f 72 64 65 72 5d 20 3d 20  TblPk[iOrder] = 
b790: 28 75 38 29 69 50 6b 3b 0a 20 20 20 20 20 20 20  (u8)iPk;.       
b7a0: 20 70 49 74 65 72 2d 3e 61 62 4e 6f 74 4e 75 6c   pIter->abNotNul
b7b0: 6c 5b 69 4f 72 64 65 72 5d 20 3d 20 28 75 38 29  l[iOrder] = (u8)
b7c0: 62 4e 6f 74 4e 75 6c 6c 20 7c 7c 20 28 69 50 6b  bNotNull || (iPk
b7d0: 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 69 4f  !=0);.        iO
b7e0: 72 64 65 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  rder++;.      }.
b7f0: 20 20 20 20 7d 0a 0a 20 20 20 20 72 62 75 46 69      }..    rbuFi
b800: 6e 61 6c 69 7a 65 28 70 2c 20 70 53 74 6d 74 29  nalize(p, pStmt)
b810: 3b 0a 20 20 20 20 72 62 75 4f 62 6a 49 74 65 72  ;.    rbuObjIter
b820: 43 61 63 68 65 49 6e 64 65 78 65 64 43 6f 6c 73  CacheIndexedCols
b830: 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  (p, pIter);.    
b840: 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 65  assert( pIter->e
b850: 54 79 70 65 21 3d 52 42 55 5f 50 4b 5f 56 54 41  Type!=RBU_PK_VTA
b860: 42 20 7c 7c 20 70 49 74 65 72 2d 3e 61 62 49 6e  B || pIter->abIn
b870: 64 65 78 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20  dexed==0 );.    
b880: 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 65  assert( pIter->e
b890: 54 79 70 65 21 3d 52 42 55 5f 50 4b 5f 56 54 41  Type!=RBU_PK_VTA
b8a0: 42 20 7c 7c 20 70 49 74 65 72 2d 3e 6e 49 6e 64  B || pIter->nInd
b8b0: 65 78 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20  ex==0 );.  }..  
b8c0: 72 65 74 75 72 6e 20 70 2d 3e 72 63 3b 0a 7d 0a  return p->rc;.}.
b8d0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
b8e0: 74 69 6f 6e 20 63 6f 6e 73 74 72 75 63 74 73 20  tion constructs 
b8f0: 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20 70 6f  and returns a po
b900: 69 6e 74 65 72 20 74 6f 20 61 20 6e 75 6c 2d 74  inter to a nul-t
b910: 65 72 6d 69 6e 61 74 65 64 20 0a 2a 2a 20 73 74  erminated .** st
b920: 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ring containing 
b930: 73 6f 6d 65 20 53 51 4c 20 63 6c 61 75 73 65 20  some SQL clause 
b940: 6f 72 20 6c 69 73 74 20 62 61 73 65 64 20 6f 6e  or list based on
b950: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20   one or more of 
b960: 74 68 65 20 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6e  the .** column n
b970: 61 6d 65 73 20 63 75 72 72 65 6e 74 6c 79 20 73  ames currently s
b980: 74 6f 72 65 64 20 69 6e 20 74 68 65 20 70 49 74  tored in the pIt
b990: 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 5d 20 61  er->azTblCol[] a
b9a0: 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rray..*/.static 
b9b0: 63 68 61 72 20 2a 72 62 75 4f 62 6a 49 74 65 72  char *rbuObjIter
b9c0: 47 65 74 43 6f 6c 6c 69 73 74 28 0a 20 20 73 71  GetCollist(.  sq
b9d0: 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 20 20 20  lite3rbu *p,    
b9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b9f0: 20 52 42 55 20 6f 62 6a 65 63 74 20 2a 2f 0a 20   RBU object */. 
ba00: 20 52 62 75 4f 62 6a 49 74 65 72 20 2a 70 49 74   RbuObjIter *pIt
ba10: 65 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  er              
ba20: 20 2f 2a 20 4f 62 6a 65 63 74 20 69 74 65 72 61   /* Object itera
ba30: 74 6f 72 20 66 6f 72 20 63 6f 6c 75 6d 6e 20 6e  tor for column n
ba40: 61 6d 65 73 20 2a 2f 0a 29 7b 0a 20 20 63 68 61  ames */.){.  cha
ba50: 72 20 2a 7a 4c 69 73 74 20 3d 20 30 3b 0a 20 20  r *zList = 0;.  
ba60: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 65 70  const char *zSep
ba70: 20 3d 20 22 22 3b 0a 20 20 69 6e 74 20 69 3b 0a   = "";.  int i;.
ba80: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74    for(i=0; i<pIt
ba90: 65 72 2d 3e 6e 54 62 6c 43 6f 6c 3b 20 69 2b 2b  er->nTblCol; i++
baa0: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
bab0: 72 20 2a 7a 20 3d 20 70 49 74 65 72 2d 3e 61 7a  r *z = pIter->az
bac0: 54 62 6c 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 7a  TblCol[i];.    z
bad0: 4c 69 73 74 20 3d 20 72 62 75 4d 50 72 69 6e 74  List = rbuMPrint
bae0: 66 28 70 2c 20 22 25 7a 25 73 5c 22 25 77 5c 22  f(p, "%z%s\"%w\"
baf0: 22 2c 20 7a 4c 69 73 74 2c 20 7a 53 65 70 2c 20  ", zList, zSep, 
bb00: 7a 29 3b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22  z);.    zSep = "
bb10: 2c 20 22 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  , ";.  }.  retur
bb20: 6e 20 7a 4c 69 73 74 3b 0a 7d 0a 0a 73 74 61 74  n zList;.}..stat
bb30: 69 63 20 63 68 61 72 20 2a 72 62 75 4f 62 6a 49  ic char *rbuObjI
bb40: 74 65 72 47 65 74 50 6b 4c 69 73 74 28 0a 20 20  terGetPkList(.  
bb50: 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 20  sqlite3rbu *p,  
bb60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb70: 2f 2a 20 52 42 55 20 6f 62 6a 65 63 74 20 2a 2f  /* RBU object */
bb80: 0a 20 20 52 62 75 4f 62 6a 49 74 65 72 20 2a 70  .  RbuObjIter *p
bb90: 49 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  Iter,           
bba0: 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 69 74 65     /* Object ite
bbb0: 72 61 74 6f 72 20 66 6f 72 20 63 6f 6c 75 6d 6e  rator for column
bbc0: 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 63 6f 6e 73   names */.  cons
bbd0: 74 20 63 68 61 72 20 2a 7a 45 78 74 72 61 0a 29  t char *zExtra.)
bbe0: 7b 0a 20 20 69 6e 74 20 69 50 6b 20 3d 20 31 3b  {.  int iPk = 1;
bbf0: 0a 20 20 63 68 61 72 20 2a 7a 52 65 74 20 3d 20  .  char *zRet = 
bc00: 30 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  0;.  const char 
bc10: 2a 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20 77 68  *zSep = "";.  wh
bc20: 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 69 6e  ile( 1 ){.    in
bc30: 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
bc40: 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 54 62 6c 43  ; i<pIter->nTblC
bc50: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
bc60: 69 66 28 20 28 69 6e 74 29 70 49 74 65 72 2d 3e  if( (int)pIter->
bc70: 61 62 54 62 6c 50 6b 5b 69 5d 3d 3d 69 50 6b 20  abTblPk[i]==iPk 
bc80: 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
bc90: 20 63 68 61 72 20 2a 7a 43 6f 6c 20 3d 20 70 49   char *zCol = pI
bca0: 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69 5d  ter->azTblCol[i]
bcb0: 3b 0a 20 20 20 20 20 20 20 20 7a 52 65 74 20 3d  ;.        zRet =
bcc0: 20 72 62 75 4d 50 72 69 6e 74 66 28 70 2c 20 22   rbuMPrintf(p, "
bcd0: 25 7a 25 73 5c 22 25 77 5c 22 25 73 22 2c 20 7a  %z%s\"%w\"%s", z
bce0: 52 65 74 2c 20 7a 53 65 70 2c 20 7a 43 6f 6c 2c  Ret, zSep, zCol,
bcf0: 20 7a 45 78 74 72 61 29 3b 0a 20 20 20 20 20 20   zExtra);.      
bd00: 20 20 7a 53 65 70 20 3d 20 22 2c 20 22 3b 0a 20    zSep = ", ";. 
bd10: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
bd20: 20 69 66 28 20 69 3d 3d 70 49 74 65 72 2d 3e 6e   if( i==pIter->n
bd30: 54 62 6c 43 6f 6c 20 29 20 62 72 65 61 6b 3b 0a  TblCol ) break;.
bd40: 20 20 20 20 69 50 6b 2b 2b 3b 0a 20 20 7d 0a 20      iPk++;.  }. 
bd50: 20 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a   return zRet;.}.
bd60: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 72 62  .static char *rb
bd70: 75 56 61 63 75 75 6d 54 61 62 6c 65 53 74 61 72  uVacuumTableStar
bd80: 74 28 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20  t(.  sqlite3rbu 
bd90: 2a 70 2c 20 0a 20 20 52 62 75 4f 62 6a 49 74 65  *p, .  RbuObjIte
bda0: 72 20 2a 70 49 74 65 72 2c 0a 20 20 69 6e 74 20  r *pIter,.  int 
bdb0: 62 52 6f 77 69 64 2c 0a 20 20 63 6f 6e 73 74 20  bRowid,.  const 
bdc0: 63 68 61 72 20 2a 7a 57 72 69 74 65 0a 29 7b 0a  char *zWrite.){.
bdd0: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
bde0: 70 4d 61 78 20 3d 20 30 3b 0a 20 20 63 68 61 72  pMax = 0;.  char
bdf0: 20 2a 7a 52 65 74 20 3d 20 30 3b 0a 20 20 69 66   *zRet = 0;.  if
be00: 28 20 62 52 6f 77 69 64 20 29 7b 0a 20 20 20 20  ( bRowid ){.    
be10: 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65 46  p->rc = prepareF
be20: 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72  reeAndCollectErr
be30: 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 70  or(p->dbMain, &p
be40: 4d 61 78 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67  Max, &p->zErrmsg
be50: 2c 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  , .        sqlit
be60: 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20  e3_mprintf(.    
be70: 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 6d 61        "SELECT ma
be80: 78 28 5f 72 6f 77 69 64 5f 29 20 46 52 4f 4d 20  x(_rowid_) FROM 
be90: 5c 22 25 73 25 77 5c 22 22 2c 20 7a 57 72 69 74  \"%s%w\"", zWrit
bea0: 65 2c 20 70 49 74 65 72 2d 3e 7a 54 62 6c 0a 20  e, pIter->zTbl. 
beb0: 20 20 20 20 20 20 20 29 0a 20 20 20 20 29 3b 0a         ).    );.
bec0: 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
bed0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49  QLITE_OK && SQLI
bee0: 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
bef0: 73 74 65 70 28 70 4d 61 78 29 20 29 7b 0a 20 20  step(pMax) ){.  
bf00: 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
bf10: 34 20 69 4d 61 78 20 3d 20 73 71 6c 69 74 65 33  4 iMax = sqlite3
bf20: 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 4d  _column_int64(pM
bf30: 61 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 7a 52  ax, 0);.      zR
bf40: 65 74 20 3d 20 72 62 75 4d 50 72 69 6e 74 66 28  et = rbuMPrintf(
bf50: 70 2c 20 22 20 57 48 45 52 45 20 5f 72 6f 77 69  p, " WHERE _rowi
bf60: 64 5f 20 3e 20 25 6c 6c 64 20 22 2c 20 69 4d 61  d_ > %lld ", iMa
bf70: 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 62  x);.    }.    rb
bf80: 75 46 69 6e 61 6c 69 7a 65 28 70 2c 20 70 4d 61  uFinalize(p, pMa
bf90: 78 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  x);.  }else{.   
bfa0: 20 63 68 61 72 20 2a 7a 4f 72 64 65 72 20 3d 20   char *zOrder = 
bfb0: 30 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 65  0;.    char *zSe
bfc0: 6c 65 63 74 20 3d 20 30 3b 0a 20 20 20 20 63 68  lect = 0;.    ch
bfd0: 61 72 20 2a 7a 4c 69 73 74 20 3d 20 30 3b 0a 20  ar *zList = 0;. 
bfe0: 20 20 20 69 6e 74 20 69 50 6b 20 3d 20 31 3b 0a     int iPk = 1;.
bff0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
c000: 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20 20 20 63  zSep = "";.    c
c010: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 65 70 32  onst char *zSep2
c020: 20 3d 20 22 22 3b 0a 20 20 20 20 77 68 69 6c 65   = "";.    while
c030: 28 20 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ( 1 ){.      int
c040: 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   i;.      for(i=
c050: 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 54 62 6c  0; i<pIter->nTbl
c060: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
c070: 20 20 20 69 66 28 20 28 69 6e 74 29 70 49 74 65     if( (int)pIte
c080: 72 2d 3e 61 62 54 62 6c 50 6b 5b 69 5d 3d 3d 69  r->abTblPk[i]==i
c090: 50 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Pk ){.          
c0a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
c0b0: 20 3d 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43   = pIter->azTblC
c0c0: 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20  ol[i];.         
c0d0: 20 7a 4f 72 64 65 72 20 3d 20 72 62 75 4d 50 72   zOrder = rbuMPr
c0e0: 69 6e 74 66 28 70 2c 20 22 25 7a 25 73 5c 22 25  intf(p, "%z%s\"%
c0f0: 77 5c 22 20 44 45 53 43 22 2c 20 7a 4f 72 64 65  w\" DESC", zOrde
c100: 72 2c 20 7a 53 65 70 2c 20 7a 43 6f 6c 29 3b 0a  r, zSep, zCol);.
c110: 20 20 20 20 20 20 20 20 20 20 7a 4c 69 73 74 20            zList 
c120: 3d 20 72 62 75 4d 50 72 69 6e 74 66 28 70 2c 20  = rbuMPrintf(p, 
c130: 22 25 7a 25 73 5c 22 25 77 5c 22 22 2c 20 7a 4c  "%z%s\"%w\"", zL
c140: 69 73 74 2c 20 7a 53 65 70 2c 20 7a 43 6f 6c 29  ist, zSep, zCol)
c150: 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 53 65 6c  ;.          zSel
c160: 65 63 74 20 3d 20 72 62 75 4d 50 72 69 6e 74 66  ect = rbuMPrintf
c170: 28 70 2c 20 22 25 7a 25 73 71 75 6f 74 65 28 5c  (p, "%z%squote(\
c180: 22 25 77 5c 22 29 22 2c 20 7a 53 65 6c 65 63 74  "%w\")", zSelect
c190: 2c 20 7a 53 65 70 32 2c 20 7a 43 6f 6c 29 3b 0a  , zSep2, zCol);.
c1a0: 20 20 20 20 20 20 20 20 20 20 7a 53 65 70 20 3d            zSep =
c1b0: 20 22 2c 20 22 3b 0a 20 20 20 20 20 20 20 20 20   ", ";.         
c1c0: 20 7a 53 65 70 32 20 3d 20 22 7c 7c 27 2c 27 7c   zSep2 = "||','|
c1d0: 7c 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  |";.        }.  
c1e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
c1f0: 69 3d 3d 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f  i==pIter->nTblCo
c200: 6c 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  l ) break;.     
c210: 20 69 50 6b 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20   iPk++;.    }.. 
c220: 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
c230: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
c240: 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65   p->rc = prepare
c250: 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72  FreeAndCollectEr
c260: 72 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 26  ror(p->dbMain, &
c270: 70 4d 61 78 2c 20 26 70 2d 3e 7a 45 72 72 6d 73  pMax, &p->zErrms
c280: 67 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73 71  g, .          sq
c290: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20  lite3_mprintf(. 
c2a0: 20 20 20 20 20 20 20 20 20 20 20 22 53 45 4c 45             "SELE
c2b0: 43 54 20 25 73 20 46 52 4f 4d 20 5c 22 25 73 25  CT %s FROM \"%s%
c2c0: 77 5c 22 20 4f 52 44 45 52 20 42 59 20 25 73 20  w\" ORDER BY %s 
c2d0: 4c 49 4d 49 54 20 31 22 2c 20 0a 20 20 20 20 20  LIMIT 1", .     
c2e0: 20 20 20 20 20 20 20 20 20 20 20 7a 53 65 6c 65             zSele
c2f0: 63 74 2c 20 7a 57 72 69 74 65 2c 20 70 49 74 65  ct, zWrite, pIte
c300: 72 2d 3e 7a 54 62 6c 2c 20 7a 4f 72 64 65 72 0a  r->zTbl, zOrder.
c310: 20 20 20 20 20 20 20 20 20 20 29 0a 20 20 20 20            ).    
c320: 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70    );.      if( p
c330: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
c340: 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  && SQLITE_ROW==s
c350: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 4d 61 78  qlite3_step(pMax
c360: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  ) ){.        con
c370: 73 74 20 63 68 61 72 20 2a 7a 56 61 6c 20 3d 20  st char *zVal = 
c380: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
c390: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
c3a0: 28 70 4d 61 78 2c 20 30 29 3b 0a 20 20 20 20 20  (pMax, 0);.     
c3b0: 20 20 20 7a 52 65 74 20 3d 20 72 62 75 4d 50 72     zRet = rbuMPr
c3c0: 69 6e 74 66 28 70 2c 20 22 20 57 48 45 52 45 20  intf(p, " WHERE 
c3d0: 28 25 73 29 20 3e 20 28 25 73 29 20 22 2c 20 7a  (%s) > (%s) ", z
c3e0: 4c 69 73 74 2c 20 7a 56 61 6c 29 3b 0a 20 20 20  List, zVal);.   
c3f0: 20 20 20 7d 0a 20 20 20 20 20 20 72 62 75 46 69     }.      rbuFi
c400: 6e 61 6c 69 7a 65 28 70 2c 20 70 4d 61 78 29 3b  nalize(p, pMax);
c410: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69  .    }..    sqli
c420: 74 65 33 5f 66 72 65 65 28 7a 4f 72 64 65 72 29  te3_free(zOrder)
c430: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
c440: 65 65 28 7a 53 65 6c 65 63 74 29 3b 0a 20 20 20  ee(zSelect);.   
c450: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4c   sqlite3_free(zL
c460: 69 73 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ist);.  }.  retu
c470: 72 6e 20 7a 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn zRet;.}../*.*
c480: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
c490: 69 73 20 75 73 65 64 20 74 6f 20 63 72 65 61 74  is used to creat
c4a0: 65 20 61 20 53 45 4c 45 43 54 20 6c 69 73 74 20  e a SELECT list 
c4b0: 28 74 68 65 20 6c 69 73 74 20 6f 66 20 53 51 4c  (the list of SQL
c4c0: 20 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73   .** expressions
c4d0: 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 61 20   that follows a 
c4e0: 53 45 4c 45 43 54 20 6b 65 79 77 6f 72 64 29 20  SELECT keyword) 
c4f0: 66 6f 72 20 61 20 53 45 4c 45 43 54 20 73 74 61  for a SELECT sta
c500: 74 65 6d 65 6e 74 20 0a 2a 2a 20 75 73 65 64 20  tement .** used 
c510: 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 61 6e 20  to read from an 
c520: 64 61 74 61 5f 78 78 78 20 6f 72 20 72 62 75 5f  data_xxx or rbu_
c530: 74 6d 70 5f 78 78 78 20 74 61 62 6c 65 20 77 68  tmp_xxx table wh
c540: 69 6c 65 20 75 70 64 61 74 69 6e 67 20 74 68 65  ile updating the
c550: 20 0a 2a 2a 20 69 6e 64 65 78 20 6f 62 6a 65 63   .** index objec
c560: 74 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 64 69  t currently indi
c570: 63 61 74 65 64 20 62 79 20 74 68 65 20 69 74 65  cated by the ite
c580: 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 70 61 73  rator object pas
c590: 73 65 64 20 61 73 20 74 68 65 20 0a 2a 2a 20 73  sed as the .** s
c5a0: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 20  econd argument. 
c5b0: 41 20 22 50 52 41 47 4d 41 20 69 6e 64 65 78 5f  A "PRAGMA index_
c5c0: 78 69 6e 66 6f 20 3d 20 3c 69 64 78 6e 61 6d 65  xinfo = <idxname
c5d0: 3e 22 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  >" statement is 
c5e0: 75 73 65 64 20 0a 2a 2a 20 74 6f 20 6f 62 74 61  used .** to obta
c5f0: 69 6e 20 74 68 65 20 72 65 71 75 69 72 65 64 20  in the required 
c600: 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a  information..**.
c610: 2a 2a 20 49 66 20 74 68 65 20 69 6e 64 65 78 20  ** If the index 
c620: 69 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  is of the follow
c630: 69 6e 67 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20  ing form:.**.** 
c640: 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69    CREATE INDEX i
c650: 31 20 4f 4e 20 74 31 28 63 2c 20 62 20 43 4f 4c  1 ON t1(c, b COL
c660: 4c 41 54 45 20 6e 6f 63 61 73 65 29 3b 0a 2a 2a  LATE nocase);.**
c670: 0a 2a 2a 20 61 6e 64 20 22 74 31 22 20 69 73 20  .** and "t1" is 
c680: 61 20 74 61 62 6c 65 20 77 69 74 68 20 61 6e 20  a table with an 
c690: 65 78 70 6c 69 63 69 74 20 49 4e 54 45 47 45 52  explicit INTEGER
c6a0: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c   PRIMARY KEY col
c6b0: 75 6d 6e 20 0a 2a 2a 20 22 69 70 6b 22 2c 20 74  umn .** "ipk", t
c6c0: 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69  he returned stri
c6d0: 6e 67 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 22  ng is:.**.**   "
c6e0: 60 63 60 20 43 4f 4c 4c 41 54 45 20 27 42 49 4e  `c` COLLATE 'BIN
c6f0: 41 52 59 27 2c 20 60 62 60 20 43 4f 4c 4c 41 54  ARY', `b` COLLAT
c700: 45 20 27 4e 4f 43 41 53 45 27 2c 20 60 69 70 6b  E 'NOCASE', `ipk
c710: 60 20 43 4f 4c 4c 41 54 45 20 27 42 49 4e 41 52  ` COLLATE 'BINAR
c720: 59 27 22 0a 2a 2a 0a 2a 2a 20 41 73 20 77 65 6c  Y'".**.** As wel
c730: 6c 20 61 73 20 74 68 65 20 72 65 74 75 72 6e 65  l as the returne
c740: 64 20 73 74 72 69 6e 67 2c 20 74 68 72 65 65 20  d string, three 
c750: 6f 74 68 65 72 20 6d 61 6c 6c 6f 63 27 64 20 73  other malloc'd s
c760: 74 72 69 6e 67 73 20 61 72 65 20 0a 2a 2a 20 72  trings are .** r
c770: 65 74 75 72 6e 65 64 20 76 69 61 20 6f 75 74 70  eturned via outp
c780: 75 74 20 70 61 72 61 6d 65 74 65 72 73 2e 20 41  ut parameters. A
c790: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
c7a0: 20 20 20 70 7a 49 6d 70 6f 73 74 65 72 43 6f 6c     pzImposterCol
c7b0: 73 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 70 7a 49 6d  s: ....**   pzIm
c7c0: 70 6f 73 74 65 72 50 6b 3a 20 2e 2e 2e 0a 2a 2a  posterPk: ....**
c7d0: 20 20 20 70 7a 57 68 65 72 65 3a 20 2e 2e 2e 0a     pzWhere: ....
c7e0: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
c7f0: 72 62 75 4f 62 6a 49 74 65 72 47 65 74 49 6e 64  rbuObjIterGetInd
c800: 65 78 43 6f 6c 73 28 0a 20 20 73 71 6c 69 74 65  exCols(.  sqlite
c810: 33 72 62 75 20 2a 70 2c 20 20 20 20 20 20 20 20  3rbu *p,        
c820: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 42 55            /* RBU
c830: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 52 62 75   object */.  Rbu
c840: 4f 62 6a 49 74 65 72 20 2a 70 49 74 65 72 2c 20  ObjIter *pIter, 
c850: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c860: 4f 62 6a 65 63 74 20 69 74 65 72 61 74 6f 72 20  Object iterator 
c870: 66 6f 72 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  for column names
c880: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 49   */.  char **pzI
c890: 6d 70 6f 73 74 65 72 43 6f 6c 73 2c 20 20 20 20  mposterCols,    
c8a0: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 43 6f        /* OUT: Co
c8b0: 6c 75 6d 6e 73 20 66 6f 72 20 69 6d 70 6f 73 74  lumns for impost
c8c0: 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63 68  er table */.  ch
c8d0: 61 72 20 2a 2a 70 7a 49 6d 70 6f 73 74 65 72 50  ar **pzImposterP
c8e0: 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  k,            /*
c8f0: 20 4f 55 54 3a 20 49 6d 70 6f 73 74 65 72 20 50   OUT: Imposter P
c900: 4b 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 63 68  K clause */.  ch
c910: 61 72 20 2a 2a 70 7a 57 68 65 72 65 2c 20 20 20  ar **pzWhere,   
c920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c930: 20 4f 55 54 3a 20 57 48 45 52 45 20 63 6c 61 75   OUT: WHERE clau
c940: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 42  se */.  int *pnB
c950: 69 6e 64 20 20 20 20 20 20 20 20 20 20 20 20 20  ind             
c960: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
c970: 54 72 62 75 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Trbul number of 
c980: 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 29 7b 0a 20 20  columns */.){.  
c990: 69 6e 74 20 72 63 20 3d 20 70 2d 3e 72 63 3b 20  int rc = p->rc; 
c9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c9b0: 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 2a 2f  /* Error code */
c9c0: 0a 20 20 69 6e 74 20 72 63 32 3b 20 20 20 20 20  .  int rc2;     
c9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c9e0: 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 66 69     /* sqlite3_fi
c9f0: 6e 61 6c 69 7a 65 28 29 20 72 65 74 75 72 6e 20  nalize() return 
ca00: 63 6f 64 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  code */.  char *
ca10: 7a 52 65 74 20 3d 20 30 3b 20 20 20 20 20 20 20  zRet = 0;       
ca20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 72            /* Str
ca30: 69 6e 67 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  ing to return */
ca40: 0a 20 20 63 68 61 72 20 2a 7a 49 6d 70 43 6f 6c  .  char *zImpCol
ca50: 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  s = 0;          
ca60: 20 20 20 2f 2a 20 53 74 72 69 6e 67 20 74 6f 20     /* String to 
ca70: 72 65 74 75 72 6e 20 76 69 61 20 2a 70 7a 49 6d  return via *pzIm
ca80: 70 6f 73 74 65 72 43 6f 6c 73 20 2a 2f 0a 20 20  posterCols */.  
ca90: 63 68 61 72 20 2a 7a 49 6d 70 50 4b 20 3d 20 30  char *zImpPK = 0
caa0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
cab0: 2f 2a 20 53 74 72 69 6e 67 20 74 6f 20 72 65 74  /* String to ret
cac0: 75 72 6e 20 76 69 61 20 2a 70 7a 49 6d 70 6f 73  urn via *pzImpos
cad0: 74 65 72 50 4b 20 2a 2f 0a 20 20 63 68 61 72 20  terPK */.  char 
cae0: 2a 7a 57 68 65 72 65 20 3d 20 30 3b 20 20 20 20  *zWhere = 0;    
caf0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
cb00: 72 69 6e 67 20 74 6f 20 72 65 74 75 72 6e 20 76  ring to return v
cb10: 69 61 20 2a 70 7a 57 68 65 72 65 20 2a 2f 0a 20  ia *pzWhere */. 
cb20: 20 69 6e 74 20 6e 42 69 6e 64 20 3d 20 30 3b 20   int nBind = 0; 
cb30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb40: 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74   /* Value to ret
cb50: 75 72 6e 20 76 69 61 20 2a 70 6e 42 69 6e 64 20  urn via *pnBind 
cb60: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
cb70: 2a 7a 43 6f 6d 20 3d 20 22 22 3b 20 20 20 20 20  *zCom = "";     
cb80: 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 22       /* Set to "
cb90: 2c 20 22 20 6c 61 74 65 72 20 6f 6e 20 2a 2f 0a  , " later on */.
cba0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41    const char *zA
cbb0: 6e 64 20 3d 20 22 22 3b 20 20 20 20 20 20 20 20  nd = "";        
cbc0: 20 20 2f 2a 20 53 65 74 20 74 6f 20 22 20 41 4e    /* Set to " AN
cbd0: 44 20 22 20 6c 61 74 65 72 20 6f 6e 20 2a 2f 0a  D " later on */.
cbe0: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
cbf0: 70 58 49 6e 66 6f 20 3d 20 30 3b 20 20 20 20 20  pXInfo = 0;     
cc00: 20 20 2f 2a 20 50 52 41 47 4d 41 20 69 6e 64 65    /* PRAGMA inde
cc10: 78 5f 78 69 6e 66 6f 20 3d 20 3f 20 2a 2f 0a 0a  x_xinfo = ? */..
cc20: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
cc30: 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OK ){.    asser
cc40: 74 28 20 70 2d 3e 7a 45 72 72 6d 73 67 3d 3d 30  t( p->zErrmsg==0
cc50: 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 72 65   );.    rc = pre
cc60: 70 61 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65  pareFreeAndColle
cc70: 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 4d 61 69  ctError(p->dbMai
cc80: 6e 2c 20 26 70 58 49 6e 66 6f 2c 20 26 70 2d 3e  n, &pXInfo, &p->
cc90: 7a 45 72 72 6d 73 67 2c 0a 20 20 20 20 20 20 20  zErrmsg,.       
cca0: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
ccb0: 28 22 50 52 41 47 4d 41 20 6d 61 69 6e 2e 69 6e  ("PRAGMA main.in
ccc0: 64 65 78 5f 78 69 6e 66 6f 20 3d 20 25 51 22 2c  dex_xinfo = %Q",
ccd0: 20 70 49 74 65 72 2d 3e 7a 49 64 78 29 0a 20 20   pIter->zIdx).  
cce0: 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c    );.  }..  whil
ccf0: 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
cd00: 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d   && SQLITE_ROW==
cd10: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 58 49  sqlite3_step(pXI
cd20: 6e 66 6f 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  nfo) ){.    int 
cd30: 69 43 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 63  iCid = sqlite3_c
cd40: 6f 6c 75 6d 6e 5f 69 6e 74 28 70 58 49 6e 66 6f  olumn_int(pXInfo
cd50: 2c 20 31 29 3b 0a 20 20 20 20 69 6e 74 20 62 44  , 1);.    int bD
cd60: 65 73 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  esc = sqlite3_co
cd70: 6c 75 6d 6e 5f 69 6e 74 28 70 58 49 6e 66 6f 2c  lumn_int(pXInfo,
cd80: 20 33 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63   3);.    const c
cd90: 68 61 72 20 2a 7a 43 6f 6c 6c 61 74 65 20 3d 20  har *zCollate = 
cda0: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
cdb0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
cdc0: 28 70 58 49 6e 66 6f 2c 20 34 29 3b 0a 20 20 20  (pXInfo, 4);.   
cdd0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
cde0: 6c 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  l;.    const cha
cdf0: 72 20 2a 7a 54 79 70 65 3b 0a 0a 20 20 20 20 69  r *zType;..    i
ce00: 66 28 20 69 43 69 64 3c 30 20 29 7b 0a 20 20 20  f( iCid<0 ){.   
ce10: 20 20 20 2f 2a 20 41 6e 20 69 6e 74 65 67 65 72     /* An integer
ce20: 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 49 66   primary key. If
ce30: 20 74 68 65 20 74 61 62 6c 65 20 68 61 73 20 61   the table has a
ce40: 6e 20 65 78 70 6c 69 63 69 74 20 49 50 4b 2c 20  n explicit IPK, 
ce50: 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 69 74 73  use.      ** its
ce60: 20 6e 61 6d 65 2e 20 4f 74 68 65 72 77 69 73 65   name. Otherwise
ce70: 2c 20 75 73 65 20 22 72 62 75 5f 72 6f 77 69 64  , use "rbu_rowid
ce80: 22 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ".  */.      if(
ce90: 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52   pIter->eType==R
cea0: 42 55 5f 50 4b 5f 49 50 4b 20 29 7b 0a 20 20 20  BU_PK_IPK ){.   
ceb0: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
cec0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 70 49 74      for(i=0; pIt
ced0: 65 72 2d 3e 61 62 54 62 6c 50 6b 5b 69 5d 3d 3d  er->abTblPk[i]==
cee0: 30 3b 20 69 2b 2b 29 3b 0a 20 20 20 20 20 20 20  0; i++);.       
cef0: 20 61 73 73 65 72 74 28 20 69 3c 70 49 74 65 72   assert( i<pIter
cf00: 2d 3e 6e 54 62 6c 43 6f 6c 20 29 3b 0a 20 20 20  ->nTblCol );.   
cf10: 20 20 20 20 20 7a 43 6f 6c 20 3d 20 70 49 74 65       zCol = pIte
cf20: 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69 5d 3b 0a  r->azTblCol[i];.
cf30: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
cf40: 72 62 75 49 73 56 61 63 75 75 6d 28 70 29 20 29  rbuIsVacuum(p) )
cf50: 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d  {.        zCol =
cf60: 20 22 5f 72 6f 77 69 64 5f 22 3b 0a 20 20 20 20   "_rowid_";.    
cf70: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
cf80: 20 7a 43 6f 6c 20 3d 20 22 72 62 75 5f 72 6f 77   zCol = "rbu_row
cf90: 69 64 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  id";.      }.   
cfa0: 20 20 20 7a 54 79 70 65 20 3d 20 22 49 4e 54 45     zType = "INTE
cfb0: 47 45 52 22 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  GER";.    }else{
cfc0: 0a 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 70 49  .      zCol = pI
cfd0: 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69 43  ter->azTblCol[iC
cfe0: 69 64 5d 3b 0a 20 20 20 20 20 20 7a 54 79 70 65  id];.      zType
cff0: 20 3d 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 54   = pIter->azTblT
d000: 79 70 65 5b 69 43 69 64 5d 3b 0a 20 20 20 20 7d  ype[iCid];.    }
d010: 0a 0a 20 20 20 20 7a 52 65 74 20 3d 20 73 71 6c  ..    zRet = sql
d020: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a  ite3_mprintf("%z
d030: 25 73 5c 22 25 77 5c 22 20 43 4f 4c 4c 41 54 45  %s\"%w\" COLLATE
d040: 20 25 51 22 2c 20 7a 52 65 74 2c 20 7a 43 6f 6d   %Q", zRet, zCom
d050: 2c 20 7a 43 6f 6c 2c 20 7a 43 6f 6c 6c 61 74 65  , zCol, zCollate
d060: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72  );.    if( pIter
d070: 2d 3e 62 55 6e 69 71 75 65 3d 3d 30 20 7c 7c 20  ->bUnique==0 || 
d080: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
d090: 6e 74 28 70 58 49 6e 66 6f 2c 20 35 29 20 29 7b  nt(pXInfo, 5) ){
d0a0: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
d0b0: 72 20 2a 7a 4f 72 64 65 72 20 3d 20 28 62 44 65  r *zOrder = (bDe
d0c0: 73 63 20 3f 20 22 20 44 45 53 43 22 20 3a 20 22  sc ? " DESC" : "
d0d0: 22 29 3b 0a 20 20 20 20 20 20 7a 49 6d 70 50 4b  ");.      zImpPK
d0e0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
d0f0: 74 66 28 22 25 7a 25 73 5c 22 72 62 75 5f 69 6d  tf("%z%s\"rbu_im
d100: 70 5f 25 64 25 77 5c 22 25 73 22 2c 20 0a 20 20  p_%d%w\"%s", .  
d110: 20 20 20 20 20 20 20 20 7a 49 6d 70 50 4b 2c 20          zImpPK, 
d120: 7a 43 6f 6d 2c 20 6e 42 69 6e 64 2c 20 7a 43 6f  zCom, nBind, zCo
d130: 6c 2c 20 7a 4f 72 64 65 72 0a 20 20 20 20 20 20  l, zOrder.      
d140: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 49 6d  );.    }.    zIm
d150: 70 43 6f 6c 73 20 3d 20 73 71 6c 69 74 65 33 5f  pCols = sqlite3_
d160: 6d 70 72 69 6e 74 66 28 22 25 7a 25 73 5c 22 72  mprintf("%z%s\"r
d170: 62 75 5f 69 6d 70 5f 25 64 25 77 5c 22 20 25 73  bu_imp_%d%w\" %s
d180: 20 43 4f 4c 4c 41 54 45 20 25 51 22 2c 20 0a 20   COLLATE %Q", . 
d190: 20 20 20 20 20 20 20 7a 49 6d 70 43 6f 6c 73 2c         zImpCols,
d1a0: 20 7a 43 6f 6d 2c 20 6e 42 69 6e 64 2c 20 7a 43   zCom, nBind, zC
d1b0: 6f 6c 2c 20 7a 54 79 70 65 2c 20 7a 43 6f 6c 6c  ol, zType, zColl
d1c0: 61 74 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 7a  ate.    );.    z
d1d0: 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 5f  Where = sqlite3_
d1e0: 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20  mprintf(.       
d1f0: 20 22 25 7a 25 73 5c 22 72 62 75 5f 69 6d 70 5f   "%z%s\"rbu_imp_
d200: 25 64 25 77 5c 22 20 49 53 20 3f 22 2c 20 7a 57  %d%w\" IS ?", zW
d210: 68 65 72 65 2c 20 7a 41 6e 64 2c 20 6e 42 69 6e  here, zAnd, nBin
d220: 64 2c 20 7a 43 6f 6c 0a 20 20 20 20 29 3b 0a 20  d, zCol.    );. 
d230: 20 20 20 69 66 28 20 7a 52 65 74 3d 3d 30 20 7c     if( zRet==0 |
d240: 7c 20 7a 49 6d 70 50 4b 3d 3d 30 20 7c 7c 20 7a  | zImpPK==0 || z
d250: 49 6d 70 43 6f 6c 73 3d 3d 30 20 7c 7c 20 7a 57  ImpCols==0 || zW
d260: 68 65 72 65 3d 3d 30 20 29 20 72 63 20 3d 20 53  here==0 ) rc = S
d270: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
d280: 20 7a 43 6f 6d 20 3d 20 22 2c 20 22 3b 0a 20 20   zCom = ", ";.  
d290: 20 20 7a 41 6e 64 20 3d 20 22 20 41 4e 44 20 22    zAnd = " AND "
d2a0: 3b 0a 20 20 20 20 6e 42 69 6e 64 2b 2b 3b 0a 20  ;.    nBind++;. 
d2b0: 20 7d 0a 0a 20 20 72 63 32 20 3d 20 73 71 6c 69   }..  rc2 = sqli
d2c0: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 58 49  te3_finalize(pXI
d2d0: 6e 66 6f 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  nfo);.  if( rc==
d2e0: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d  SQLITE_OK ) rc =
d2f0: 20 72 63 32 3b 0a 0a 20 20 69 66 28 20 72 63 21   rc2;..  if( rc!
d300: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
d310: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
d320: 52 65 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Ret);.    sqlite
d330: 33 5f 66 72 65 65 28 7a 49 6d 70 43 6f 6c 73 29  3_free(zImpCols)
d340: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
d350: 65 65 28 7a 49 6d 70 50 4b 29 3b 0a 20 20 20 20  ee(zImpPK);.    
d360: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 57 68  sqlite3_free(zWh
d370: 65 72 65 29 3b 0a 20 20 20 20 7a 52 65 74 20 3d  ere);.    zRet =
d380: 20 30 3b 0a 20 20 20 20 7a 49 6d 70 43 6f 6c 73   0;.    zImpCols
d390: 20 3d 20 30 3b 0a 20 20 20 20 7a 49 6d 70 50 4b   = 0;.    zImpPK
d3a0: 20 3d 20 30 3b 0a 20 20 20 20 7a 57 68 65 72 65   = 0;.    zWhere
d3b0: 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 72 63 20   = 0;.    p->rc 
d3c0: 3d 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2a 70 7a  = rc;.  }..  *pz
d3d0: 49 6d 70 6f 73 74 65 72 43 6f 6c 73 20 3d 20 7a  ImposterCols = z
d3e0: 49 6d 70 43 6f 6c 73 3b 0a 20 20 2a 70 7a 49 6d  ImpCols;.  *pzIm
d3f0: 70 6f 73 74 65 72 50 6b 20 3d 20 7a 49 6d 70 50  posterPk = zImpP
d400: 4b 3b 0a 20 20 2a 70 7a 57 68 65 72 65 20 3d 20  K;.  *pzWhere = 
d410: 7a 57 68 65 72 65 3b 0a 20 20 2a 70 6e 42 69 6e  zWhere;.  *pnBin
d420: 64 20 3d 20 6e 42 69 6e 64 3b 0a 20 20 72 65 74  d = nBind;.  ret
d430: 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a  urn zRet;.}../*.
d440: 2a 2a 20 41 73 73 75 6d 69 6e 67 20 74 68 65 20  ** Assuming the 
d450: 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20 63 6f  current table co
d460: 6c 75 6d 6e 73 20 61 72 65 20 22 61 22 2c 20 22  lumns are "a", "
d470: 62 22 20 61 6e 64 20 22 63 22 2c 20 61 6e 64 20  b" and "c", and 
d480: 74 68 65 20 7a 4f 62 6a 0a 2a 2a 20 70 61 72 61  the zObj.** para
d490: 6d 74 65 72 20 69 73 20 70 61 73 73 65 64 20 22  mter is passed "
d4a0: 6f 6c 64 22 2c 20 72 65 74 75 72 6e 20 61 20 73  old", return a s
d4b0: 74 72 69 6e 67 20 6f 66 20 74 68 65 20 66 6f 72  tring of the for
d4c0: 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 22 6f 6c  m:.**.**     "ol
d4d0: 64 2e 61 2c 20 6f 6c 64 2e 62 2c 20 6f 6c 64 2e  d.a, old.b, old.
d4e0: 62 22 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 74 68  b".**.** With th
d4f0: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 65  e column names e
d500: 73 63 61 70 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f  scaped..**.** Fo
d510: 72 20 74 61 62 6c 65 73 20 77 69 74 68 20 69 6d  r tables with im
d520: 70 6c 69 63 69 74 20 72 6f 77 69 64 73 20 2d 20  plicit rowids - 
d530: 52 42 55 5f 50 4b 5f 45 58 54 45 52 4e 41 4c 20  RBU_PK_EXTERNAL 
d540: 61 6e 64 20 52 42 55 5f 50 4b 5f 4e 4f 4e 45 2c  and RBU_PK_NONE,
d550: 20 61 70 70 65 6e 64 0a 2a 2a 20 74 68 65 20 74   append.** the t
d560: 65 78 74 20 22 2c 20 6f 6c 64 2e 5f 72 6f 77 69  ext ", old._rowi
d570: 64 5f 22 20 74 6f 20 74 68 65 20 72 65 74 75 72  d_" to the retur
d580: 6e 65 64 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74  ned value..*/.st
d590: 61 74 69 63 20 63 68 61 72 20 2a 72 62 75 4f 62  atic char *rbuOb
d5a0: 6a 49 74 65 72 47 65 74 4f 6c 64 6c 69 73 74 28  jIterGetOldlist(
d5b0: 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20 2a 70  .  sqlite3rbu *p
d5c0: 2c 20 0a 20 20 52 62 75 4f 62 6a 49 74 65 72 20  , .  RbuObjIter 
d5d0: 2a 70 49 74 65 72 2c 0a 20 20 63 6f 6e 73 74 20  *pIter,.  const 
d5e0: 63 68 61 72 20 2a 7a 4f 62 6a 0a 29 7b 0a 20 20  char *zObj.){.  
d5f0: 63 68 61 72 20 2a 7a 4c 69 73 74 20 3d 20 30 3b  char *zList = 0;
d600: 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
d610: 4c 49 54 45 5f 4f 4b 20 26 26 20 70 49 74 65 72  LITE_OK && pIter
d620: 2d 3e 61 62 49 6e 64 65 78 65 64 20 29 7b 0a 20  ->abIndexed ){. 
d630: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
d640: 53 20 3d 20 22 22 3b 0a 20 20 20 20 69 6e 74 20  S = "";.    int 
d650: 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
d660: 69 3c 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c  i<pIter->nTblCol
d670: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
d680: 28 20 70 49 74 65 72 2d 3e 61 62 49 6e 64 65 78  ( pIter->abIndex
d690: 65 64 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20  ed[i] ){.       
d6a0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
d6b0: 6c 20 3d 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c  l = pIter->azTbl
d6c0: 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  Col[i];.        
d6d0: 7a 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 5f  zList = sqlite3_
d6e0: 6d 70 72 69 6e 74 66 28 22 25 7a 25 73 25 73 2e  mprintf("%z%s%s.
d6f0: 5c 22 25 77 5c 22 22 2c 20 7a 4c 69 73 74 2c 20  \"%w\"", zList, 
d700: 7a 53 2c 20 7a 4f 62 6a 2c 20 7a 43 6f 6c 29 3b  zS, zObj, zCol);
d710: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
d720: 20 20 20 20 20 20 7a 4c 69 73 74 20 3d 20 73 71        zList = sq
d730: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
d740: 7a 25 73 4e 55 4c 4c 22 2c 20 7a 4c 69 73 74 2c  z%sNULL", zList,
d750: 20 7a 53 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20   zS);.      }.  
d760: 20 20 20 20 7a 53 20 3d 20 22 2c 20 22 3b 0a 20      zS = ", ";. 
d770: 20 20 20 20 20 69 66 28 20 7a 4c 69 73 74 3d 3d       if( zList==
d780: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  0 ){.        p->
d790: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
d7a0: 4d 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  M;.        break
d7b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
d7c0: 0a 20 20 20 20 2f 2a 20 46 6f 72 20 61 20 74 61  .    /* For a ta
d7d0: 62 6c 65 20 77 69 74 68 20 69 6d 70 6c 69 63 69  ble with implici
d7e0: 74 20 72 6f 77 69 64 73 2c 20 61 70 70 65 6e 64  t rowids, append
d7f0: 20 22 6f 6c 64 2e 5f 72 6f 77 69 64 5f 22 20 74   "old._rowid_" t
d800: 6f 20 74 68 65 20 6c 69 73 74 2e 20 2a 2f 0a 20  o the list. */. 
d810: 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 65 54     if( pIter->eT
d820: 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 45 58 54 45  ype==RBU_PK_EXTE
d830: 52 4e 41 4c 20 7c 7c 20 70 49 74 65 72 2d 3e 65  RNAL || pIter->e
d840: 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 4e 4f 4e  Type==RBU_PK_NON
d850: 45 20 29 7b 0a 20 20 20 20 20 20 7a 4c 69 73 74  E ){.      zList
d860: 20 3d 20 72 62 75 4d 50 72 69 6e 74 66 28 70 2c   = rbuMPrintf(p,
d870: 20 22 25 7a 2c 20 25 73 2e 5f 72 6f 77 69 64 5f   "%z, %s._rowid_
d880: 22 2c 20 7a 4c 69 73 74 2c 20 7a 4f 62 6a 29 3b  ", zList, zObj);
d890: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
d8a0: 75 72 6e 20 7a 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a  urn zList;.}../*
d8b0: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 65 78  .** Return an ex
d8c0: 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63 61  pression that ca
d8d0: 6e 20 62 65 20 75 73 65 64 20 69 6e 20 61 20 57  n be used in a W
d8e0: 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 6d  HERE clause to m
d8f0: 61 74 63 68 20 74 68 65 0a 2a 2a 20 70 72 69 6d  atch the.** prim
d900: 61 72 79 20 6b 65 79 20 6f 66 20 74 68 65 20 63  ary key of the c
d910: 75 72 72 65 6e 74 20 74 61 62 6c 65 2e 20 46 6f  urrent table. Fo
d920: 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68  r example, if th
d930: 65 20 74 61 62 6c 65 20 69 73 3a 0a 2a 2a 0a 2a  e table is:.**.*
d940: 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  *   CREATE TABLE
d950: 20 74 31 28 61 2c 20 62 2c 20 63 2c 20 50 52 49   t1(a, b, c, PRI
d960: 4d 41 52 59 20 4b 45 59 28 62 2c 20 63 29 29 3b  MARY KEY(b, c));
d970: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
d980: 65 20 73 74 72 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  e string:.**.** 
d990: 20 20 22 62 20 3d 20 3f 31 20 41 4e 44 20 63 20    "b = ?1 AND c 
d9a0: 3d 20 3f 32 22 0a 2a 2f 0a 73 74 61 74 69 63 20  = ?2".*/.static 
d9b0: 63 68 61 72 20 2a 72 62 75 4f 62 6a 49 74 65 72  char *rbuObjIter
d9c0: 47 65 74 57 68 65 72 65 28 0a 20 20 73 71 6c 69  GetWhere(.  sqli
d9d0: 74 65 33 72 62 75 20 2a 70 2c 20 0a 20 20 52 62  te3rbu *p, .  Rb
d9e0: 75 4f 62 6a 49 74 65 72 20 2a 70 49 74 65 72 0a  uObjIter *pIter.
d9f0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4c 69 73 74  ){.  char *zList
da00: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 49 74 65   = 0;.  if( pIte
da10: 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b  r->eType==RBU_PK
da20: 5f 56 54 41 42 20 7c 7c 20 70 49 74 65 72 2d 3e  _VTAB || pIter->
da30: 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 4e 4f  eType==RBU_PK_NO
da40: 4e 45 20 29 7b 0a 20 20 20 20 7a 4c 69 73 74 20  NE ){.    zList 
da50: 3d 20 72 62 75 4d 50 72 69 6e 74 66 28 70 2c 20  = rbuMPrintf(p, 
da60: 22 5f 72 6f 77 69 64 5f 20 3d 20 3f 25 64 22 2c  "_rowid_ = ?%d",
da70: 20 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 2b   pIter->nTblCol+
da80: 31 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  1);.  }else if( 
da90: 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42  pIter->eType==RB
daa0: 55 5f 50 4b 5f 45 58 54 45 52 4e 41 4c 20 29 7b  U_PK_EXTERNAL ){
dab0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
dac0: 2a 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20 20 20  *zSep = "";.    
dad0: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
dae0: 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 54 62  =0; i<pIter->nTb
daf0: 6c 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lCol; i++){.    
db00: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 61 62 54    if( pIter->abT
db10: 62 6c 50 6b 5b 69 5d 20 29 7b 0a 20 20 20 20 20  blPk[i] ){.     
db20: 20 20 20 7a 4c 69 73 74 20 3d 20 72 62 75 4d 50     zList = rbuMP
db30: 72 69 6e 74 66 28 70 2c 20 22 25 7a 25 73 63 25  rintf(p, "%z%sc%
db40: 64 3d 3f 25 64 22 2c 20 7a 4c 69 73 74 2c 20 7a  d=?%d", zList, z
db50: 53 65 70 2c 20 69 2c 20 69 2b 31 29 3b 0a 20 20  Sep, i, i+1);.  
db60: 20 20 20 20 20 20 7a 53 65 70 20 3d 20 22 20 41        zSep = " A
db70: 4e 44 20 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ND ";.      }.  
db80: 20 20 7d 0a 20 20 20 20 7a 4c 69 73 74 20 3d 20    }.    zList = 
db90: 72 62 75 4d 50 72 69 6e 74 66 28 70 2c 20 0a 20  rbuMPrintf(p, . 
dba0: 20 20 20 20 20 20 20 22 5f 72 6f 77 69 64 5f 20         "_rowid_ 
dbb0: 3d 20 28 53 45 4c 45 43 54 20 69 64 20 46 52 4f  = (SELECT id FRO
dbc0: 4d 20 72 62 75 5f 69 6d 70 6f 73 74 65 72 32 20  M rbu_imposter2 
dbd0: 57 48 45 52 45 20 25 7a 29 22 2c 20 7a 4c 69 73  WHERE %z)", zLis
dbe0: 74 0a 20 20 20 20 29 3b 0a 0a 20 20 7d 65 6c 73  t.    );..  }els
dbf0: 65 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e{.    const cha
dc00: 72 20 2a 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20  r *zSep = "";.  
dc10: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
dc20: 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e  (i=0; i<pIter->n
dc30: 54 62 6c 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  TblCol; i++){.  
dc40: 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 61      if( pIter->a
dc50: 62 54 62 6c 50 6b 5b 69 5d 20 29 7b 0a 20 20 20  bTblPk[i] ){.   
dc60: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
dc70: 2a 7a 43 6f 6c 20 3d 20 70 49 74 65 72 2d 3e 61  *zCol = pIter->a
dc80: 7a 54 62 6c 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20  zTblCol[i];.    
dc90: 20 20 20 20 7a 4c 69 73 74 20 3d 20 72 62 75 4d      zList = rbuM
dca0: 50 72 69 6e 74 66 28 70 2c 20 22 25 7a 25 73 5c  Printf(p, "%z%s\
dcb0: 22 25 77 5c 22 3d 3f 25 64 22 2c 20 7a 4c 69 73  "%w\"=?%d", zLis
dcc0: 74 2c 20 7a 53 65 70 2c 20 7a 43 6f 6c 2c 20 69  t, zSep, zCol, i
dcd0: 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 7a 53 65  +1);.        zSe
dce0: 70 20 3d 20 22 20 41 4e 44 20 22 3b 0a 20 20 20  p = " AND ";.   
dcf0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
dd00: 20 72 65 74 75 72 6e 20 7a 4c 69 73 74 3b 0a 7d   return zList;.}
dd10: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 53 45 4c 45  ../*.** The SELE
dd20: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 74 65  CT statement ite
dd30: 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20 74  rating through t
dd40: 68 65 20 6b 65 79 73 20 66 6f 72 20 74 68 65 20  he keys for the 
dd50: 63 75 72 72 65 6e 74 20 6f 62 6a 65 63 74 0a 2a  current object.*
dd60: 2a 20 28 70 2d 3e 6f 62 6a 69 74 65 72 2e 70 53  * (p->objiter.pS
dd70: 65 6c 65 63 74 29 20 63 75 72 72 65 6e 74 6c 79  elect) currently
dd80: 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 76 61 6c   points to a val
dd90: 69 64 20 72 6f 77 2e 20 48 6f 77 65 76 65 72 2c  id row. However,
dda0: 20 74 68 65 72 65 0a 2a 2a 20 69 73 20 73 6f 6d   there.** is som
ddb0: 65 74 68 69 6e 67 20 77 72 6f 6e 67 20 77 69 74  ething wrong wit
ddc0: 68 20 74 68 65 20 72 62 75 5f 63 6f 6e 74 72 6f  h the rbu_contro
ddd0: 6c 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 72  l value in the r
dde0: 62 75 5f 63 6f 6e 74 72 6f 6c 20 76 61 6c 75 65  bu_control value
ddf0: 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 74 68  .** stored in th
de00: 65 20 28 70 2d 3e 6e 43 6f 6c 2b 31 29 27 74 68  e (p->nCol+1)'th
de10: 20 63 6f 6c 75 6d 6e 2e 20 53 65 74 20 74 68 65   column. Set the
de20: 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20   error code and 
de30: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a  error message.**
de40: 20 6f 66 20 74 68 65 20 52 42 55 20 68 61 6e 64   of the RBU hand
de50: 6c 65 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 20  le to something 
de60: 72 65 66 6c 65 63 74 69 6e 67 20 74 68 69 73 2e  reflecting this.
de70: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
de80: 72 62 75 42 61 64 43 6f 6e 74 72 6f 6c 45 72 72  rbuBadControlErr
de90: 6f 72 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70  or(sqlite3rbu *p
dea0: 29 7b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  ){.  p->rc = SQL
deb0: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 70 2d 3e  ITE_ERROR;.  p->
dec0: 7a 45 72 72 6d 73 67 20 3d 20 73 71 6c 69 74 65  zErrmsg = sqlite
ded0: 33 5f 6d 70 72 69 6e 74 66 28 22 69 6e 76 61 6c  3_mprintf("inval
dee0: 69 64 20 72 62 75 5f 63 6f 6e 74 72 6f 6c 20 76  id rbu_control v
def0: 61 6c 75 65 22 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  alue");.}.../*.*
df00: 2a 20 52 65 74 75 72 6e 20 61 20 6e 75 6c 2d 74  * Return a nul-t
df10: 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67  erminated string
df20: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
df30: 63 6f 6d 6d 61 20 73 65 70 61 72 61 74 65 64 20  comma separated 
df40: 6c 69 73 74 20 6f 66 0a 2a 2a 20 61 73 73 69 67  list of.** assig
df50: 6e 6d 65 6e 74 73 20 74 68 61 74 20 73 68 6f 75  nments that shou
df60: 6c 64 20 62 65 20 69 6e 63 6c 75 64 65 64 20 66  ld be included f
df70: 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 22 53 45  ollowing the "SE
df80: 54 22 20 6b 65 79 77 6f 72 64 20 6f 66 0a 2a 2a  T" keyword of.**
df90: 20 61 6e 20 55 50 44 41 54 45 20 73 74 61 74 65   an UPDATE state
dfa0: 6d 65 6e 74 20 75 73 65 64 20 74 6f 20 75 70 64  ment used to upd
dfb0: 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 6f 62  ate the table ob
dfc0: 6a 65 63 74 20 74 68 61 74 20 74 68 65 20 69 74  ject that the it
dfd0: 65 72 61 74 6f 72 0a 2a 2a 20 70 61 73 73 65 64  erator.** passed
dfe0: 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
dff0: 72 67 75 6d 65 6e 74 20 63 75 72 72 65 6e 74 6c  rgument currentl
e000: 79 20 70 6f 69 6e 74 73 20 74 6f 20 69 66 20 74  y points to if t
e010: 68 65 20 72 62 75 5f 63 6f 6e 74 72 6f 6c 0a 2a  he rbu_control.*
e020: 2a 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  * column of the 
e030: 64 61 74 61 5f 78 78 78 20 74 61 62 6c 65 20 65  data_xxx table e
e040: 6e 74 72 79 20 69 73 20 73 65 74 20 74 6f 20 7a  ntry is set to z
e050: 4d 61 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  Mask..**.** The 
e060: 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68 65 20 72  memory for the r
e070: 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69  eturned string i
e080: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
e090: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
e0a0: 2e 0a 2a 2a 20 49 74 20 69 73 20 74 68 65 20 72  ..** It is the r
e0b0: 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
e0c0: 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65   the caller to e
e0d0: 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 20 69  ventually free i
e0e0: 74 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74  t using.** sqlit
e0f0: 65 33 5f 66 72 65 65 28 29 2e 20 0a 2a 2a 0a 2a  e3_free(). .**.*
e100: 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f  * If an OOM erro
e110: 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
e120: 20 77 68 65 6e 20 61 6c 6c 6f 63 61 74 69 6e 67   when allocating
e130: 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 6e   space for the n
e140: 65 77 0a 2a 2a 20 73 74 72 69 6e 67 2c 20 61 6e  ew.** string, an
e150: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 6c   error code is l
e160: 65 66 74 20 69 6e 20 74 68 65 20 72 62 75 20 68  eft in the rbu h
e170: 61 6e 64 6c 65 20 70 61 73 73 65 64 20 61 73 20  andle passed as 
e180: 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 61 72 67  the first.** arg
e190: 75 6d 65 6e 74 20 61 6e 64 20 4e 55 4c 4c 20 69  ument and NULL i
e1a0: 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 72 2c 20  s returned. Or, 
e1b0: 69 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20  if an error has 
e1c0: 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64  already occurred
e1d0: 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 66 75  .** when this fu
e1e0: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
e1f0: 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  , NULL is return
e200: 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2c 20  ed immediately, 
e210: 77 69 74 68 6f 75 74 0a 2a 2a 20 61 74 74 65 6d  without.** attem
e220: 70 74 69 6e 67 20 74 68 65 20 61 6c 6c 6f 63 61  pting the alloca
e230: 74 69 6f 6e 20 6f 72 20 6d 6f 64 69 66 79 69 6e  tion or modifyin
e240: 67 20 74 68 65 20 73 74 6f 72 65 64 20 65 72 72  g the stored err
e250: 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  or code..*/.stat
e260: 69 63 20 63 68 61 72 20 2a 72 62 75 4f 62 6a 49  ic char *rbuObjI
e270: 74 65 72 47 65 74 53 65 74 6c 69 73 74 28 0a 20  terGetSetlist(. 
e280: 20 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 0a   sqlite3rbu *p,.
e290: 20 20 52 62 75 4f 62 6a 49 74 65 72 20 2a 70 49    RbuObjIter *pI
e2a0: 74 65 72 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  ter,.  const cha
e2b0: 72 20 2a 7a 4d 61 73 6b 0a 29 7b 0a 20 20 63 68  r *zMask.){.  ch
e2c0: 61 72 20 2a 7a 4c 69 73 74 20 3d 20 30 3b 0a 20  ar *zList = 0;. 
e2d0: 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
e2e0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74  TE_OK ){.    int
e2f0: 20 69 3b 0a 0a 20 20 20 20 69 66 28 20 28 69 6e   i;..    if( (in
e300: 74 29 73 74 72 6c 65 6e 28 7a 4d 61 73 6b 29 21  t)strlen(zMask)!
e310: 3d 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 20  =pIter->nTblCol 
e320: 29 7b 0a 20 20 20 20 20 20 72 62 75 42 61 64 43  ){.      rbuBadC
e330: 6f 6e 74 72 6f 6c 45 72 72 6f 72 28 70 29 3b 0a  ontrolError(p);.
e340: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e350: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 65   const char *zSe
e360: 70 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 66 6f  p = "";.      fo
e370: 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e  r(i=0; i<pIter->
e380: 6e 54 62 6c 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  nTblCol; i++){. 
e390: 20 20 20 20 20 20 20 63 68 61 72 20 63 20 3d 20         char c = 
e3a0: 7a 4d 61 73 6b 5b 70 49 74 65 72 2d 3e 61 69 53  zMask[pIter->aiS
e3b0: 72 63 4f 72 64 65 72 5b 69 5d 5d 3b 0a 20 20 20  rcOrder[i]];.   
e3c0: 20 20 20 20 20 69 66 28 20 63 3d 3d 27 78 27 20       if( c=='x' 
e3d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 4c 69  ){.          zLi
e3e0: 73 74 20 3d 20 72 62 75 4d 50 72 69 6e 74 66 28  st = rbuMPrintf(
e3f0: 70 2c 20 22 25 7a 25 73 5c 22 25 77 5c 22 3d 3f  p, "%z%s\"%w\"=?
e400: 25 64 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  %d", .          
e410: 20 20 20 20 7a 4c 69 73 74 2c 20 7a 53 65 70 2c      zList, zSep,
e420: 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c   pIter->azTblCol
e430: 5b 69 5d 2c 20 69 2b 31 0a 20 20 20 20 20 20 20  [i], i+1.       
e440: 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20     );.          
e450: 7a 53 65 70 20 3d 20 22 2c 20 22 3b 0a 20 20 20  zSep = ", ";.   
e460: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 65       }.        e
e470: 6c 73 65 20 69 66 28 20 63 3d 3d 27 64 27 20 29  lse if( c=='d' )
e480: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 4c 69 73  {.          zLis
e490: 74 20 3d 20 72 62 75 4d 50 72 69 6e 74 66 28 70  t = rbuMPrintf(p
e4a0: 2c 20 22 25 7a 25 73 5c 22 25 77 5c 22 3d 72 62  , "%z%s\"%w\"=rb
e4b0: 75 5f 64 65 6c 74 61 28 5c 22 25 77 5c 22 2c 20  u_delta(\"%w\", 
e4c0: 3f 25 64 29 22 2c 20 0a 20 20 20 20 20 20 20 20  ?%d)", .        
e4d0: 20 20 20 20 20 20 7a 4c 69 73 74 2c 20 7a 53 65        zList, zSe
e4e0: 70 2c 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43  p, pIter->azTblC
e4f0: 6f 6c 5b 69 5d 2c 20 70 49 74 65 72 2d 3e 61 7a  ol[i], pIter->az
e500: 54 62 6c 43 6f 6c 5b 69 5d 2c 20 69 2b 31 0a 20  TblCol[i], i+1. 
e510: 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
e520: 20 20 20 20 20 20 7a 53 65 70 20 3d 20 22 2c 20        zSep = ", 
e530: 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ";.        }.   
e540: 20 20 20 20 20 65 6c 73 65 20 69 66 28 20 63 3d       else if( c=
e550: 3d 27 66 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='f' ){.        
e560: 20 20 7a 4c 69 73 74 20 3d 20 72 62 75 4d 50 72    zList = rbuMPr
e570: 69 6e 74 66 28 70 2c 20 22 25 7a 25 73 5c 22 25  intf(p, "%z%s\"%
e580: 77 5c 22 3d 72 62 75 5f 66 6f 73 73 69 6c 5f 64  w\"=rbu_fossil_d
e590: 65 6c 74 61 28 5c 22 25 77 5c 22 2c 20 3f 25 64  elta(\"%w\", ?%d
e5a0: 29 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  )", .           
e5b0: 20 20 20 7a 4c 69 73 74 2c 20 7a 53 65 70 2c 20     zList, zSep, 
e5c0: 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b  pIter->azTblCol[
e5d0: 69 5d 2c 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c  i], pIter->azTbl
e5e0: 43 6f 6c 5b 69 5d 2c 20 69 2b 31 0a 20 20 20 20  Col[i], i+1.    
e5f0: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
e600: 20 20 20 7a 53 65 70 20 3d 20 22 2c 20 22 3b 0a     zSep = ", ";.
e610: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
e620: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
e630: 74 75 72 6e 20 7a 4c 69 73 74 3b 0a 7d 0a 0a 2f  turn zList;.}../
e640: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 6e 75  *.** Return a nu
e650: 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72  l-terminated str
e660: 69 6e 67 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f  ing consisting o
e670: 66 20 6e 42 79 74 65 20 63 6f 6d 6d 61 20 73 65  f nByte comma se
e680: 70 61 72 61 74 65 64 0a 2a 2a 20 22 3f 22 20 65  parated.** "?" e
e690: 78 70 72 65 73 73 69 6f 6e 73 2e 20 46 6f 72 20  xpressions. For 
e6a0: 65 78 61 6d 70 6c 65 2c 20 69 66 20 6e 42 79 74  example, if nByt
e6b0: 65 20 69 73 20 33 2c 20 72 65 74 75 72 6e 20 61  e is 3, return a
e6c0: 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 61   pointer to.** a
e6d0: 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
e6e0: 6e 67 20 74 68 65 20 73 74 72 69 6e 67 20 22 3f  ng the string "?
e6f0: 2c 3f 2c 3f 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ,?,?"..**.** The
e700: 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68 65 20   memory for the 
e710: 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20  returned string 
e720: 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  is obtained from
e730: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
e740: 29 2e 0a 2a 2a 20 49 74 20 69 73 20 74 68 65 20  )..** It is the 
e750: 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
e760: 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  f the caller to 
e770: 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 20  eventually free 
e780: 69 74 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69  it using.** sqli
e790: 74 65 33 5f 66 72 65 65 28 29 2e 20 0a 2a 2a 0a  te3_free(). .**.
e7a0: 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72  ** If an OOM err
e7b0: 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  or is encountere
e7c0: 64 20 77 68 65 6e 20 61 6c 6c 6f 63 61 74 69 6e  d when allocatin
e7d0: 67 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20  g space for the 
e7e0: 6e 65 77 0a 2a 2a 20 73 74 72 69 6e 67 2c 20 61  new.** string, a
e7f0: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
e800: 6c 65 66 74 20 69 6e 20 74 68 65 20 72 62 75 20  left in the rbu 
e810: 68 61 6e 64 6c 65 20 70 61 73 73 65 64 20 61 73  handle passed as
e820: 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 61 72   the first.** ar
e830: 67 75 6d 65 6e 74 20 61 6e 64 20 4e 55 4c 4c 20  gument and NULL 
e840: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 72 2c  is returned. Or,
e850: 20 69 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73   if an error has
e860: 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65   already occurre
e870: 64 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 66  d.** when this f
e880: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
e890: 64 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  d, NULL is retur
e8a0: 6e 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2c  ned immediately,
e8b0: 20 77 69 74 68 6f 75 74 0a 2a 2a 20 61 74 74 65   without.** atte
e8c0: 6d 70 74 69 6e 67 20 74 68 65 20 61 6c 6c 6f 63  mpting the alloc
e8d0: 61 74 69 6f 6e 20 6f 72 20 6d 6f 64 69 66 79 69  ation or modifyi
e8e0: 6e 67 20 74 68 65 20 73 74 6f 72 65 64 20 65 72  ng the stored er
e8f0: 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61  ror code..*/.sta
e900: 74 69 63 20 63 68 61 72 20 2a 72 62 75 4f 62 6a  tic char *rbuObj
e910: 49 74 65 72 47 65 74 42 69 6e 64 6c 69 73 74 28  IterGetBindlist(
e920: 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 69  sqlite3rbu *p, i
e930: 6e 74 20 6e 42 69 6e 64 29 7b 0a 20 20 63 68 61  nt nBind){.  cha
e940: 72 20 2a 7a 52 65 74 20 3d 20 30 3b 0a 20 20 73  r *zRet = 0;.  s
e950: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 42 79  qlite3_int64 nBy
e960: 74 65 20 3d 20 32 2a 28 73 71 6c 69 74 65 33 5f  te = 2*(sqlite3_
e970: 69 6e 74 36 34 29 6e 42 69 6e 64 20 2b 20 31 3b  int64)nBind + 1;
e980: 0a 0a 20 20 7a 52 65 74 20 3d 20 28 63 68 61 72  ..  zRet = (char
e990: 2a 29 72 62 75 4d 61 6c 6c 6f 63 28 70 2c 20 6e  *)rbuMalloc(p, n
e9a0: 42 79 74 65 29 3b 0a 20 20 69 66 28 20 7a 52 65  Byte);.  if( zRe
e9b0: 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  t ){.    int i;.
e9c0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
e9d0: 42 69 6e 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Bind; i++){.    
e9e0: 20 20 7a 52 65 74 5b 69 2a 32 5d 20 3d 20 27 3f    zRet[i*2] = '?
e9f0: 27 3b 0a 20 20 20 20 20 20 7a 52 65 74 5b 69 2a  ';.      zRet[i*
ea00: 32 2b 31 5d 20 3d 20 28 69 2b 31 3d 3d 6e 42 69  2+1] = (i+1==nBi
ea10: 6e 64 29 20 3f 20 27 5c 30 27 20 3a 20 27 2c 27  nd) ? '\0' : ','
ea20: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
ea30: 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 0a 2f 2a  turn zRet;.}../*
ea40: 0a 2a 2a 20 54 68 65 20 69 74 65 72 61 74 6f 72  .** The iterator
ea50: 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
ea60: 73 20 74 6f 20 61 20 74 61 62 6c 65 20 28 6e 6f  s to a table (no
ea70: 74 20 69 6e 64 65 78 29 20 6f 66 20 74 79 70 65  t index) of type
ea80: 20 0a 2a 2a 20 52 42 55 5f 50 4b 5f 57 49 54 48   .** RBU_PK_WITH
ea90: 4f 55 54 5f 52 4f 57 49 44 2e 20 54 68 69 73 20  OUT_ROWID. This 
eaa0: 66 75 6e 63 74 69 6f 6e 20 63 72 65 61 74 65 73  function creates
eab0: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
eac0: 20 0a 2a 2a 20 64 65 63 6c 61 72 61 74 69 6f 6e   .** declaration
ead0: 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65 73 70   for the corresp
eae0: 6f 6e 64 69 6e 67 20 69 6d 70 6f 73 74 65 72 20  onding imposter 
eaf0: 74 61 62 6c 65 2e 20 46 6f 72 20 65 78 61 6d 70  table. For examp
eb00: 6c 65 2c 0a 2a 2a 20 69 66 20 74 68 65 20 69 74  le,.** if the it
eb10: 65 72 61 74 6f 72 20 70 6f 69 6e 74 73 20 74 6f  erator points to
eb20: 20 61 20 74 61 62 6c 65 20 63 72 65 61 74 65 64   a table created
eb30: 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45   as:.**.**   CRE
eb40: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
eb50: 62 2c 20 63 2c 20 50 52 49 4d 41 52 59 20 4b 45  b, c, PRIMARY KE
eb60: 59 28 62 2c 20 61 20 44 45 53 43 29 29 20 57 49  Y(b, a DESC)) WI
eb70: 54 48 4f 55 54 20 52 4f 57 49 44 0a 2a 2a 0a 2a  THOUT ROWID.**.*
eb80: 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
eb90: 72 65 74 75 72 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20  returns:.**.**  
eba0: 20 50 52 49 4d 41 52 59 20 4b 45 59 28 22 62 22   PRIMARY KEY("b"
ebb0: 2c 20 22 61 22 20 44 45 53 43 29 0a 2a 2f 0a 73  , "a" DESC).*/.s
ebc0: 74 61 74 69 63 20 63 68 61 72 20 2a 72 62 75 57  tatic char *rbuW
ebd0: 69 74 68 6f 75 74 52 6f 77 69 64 50 4b 28 73 71  ithoutRowidPK(sq
ebe0: 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 52 62 75  lite3rbu *p, Rbu
ebf0: 4f 62 6a 49 74 65 72 20 2a 70 49 74 65 72 29 7b  ObjIter *pIter){
ec00: 0a 20 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b 0a  .  char *z = 0;.
ec10: 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
ec20: 3e 7a 49 64 78 3d 3d 30 20 29 3b 0a 20 20 69 66  >zIdx==0 );.  if
ec30: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
ec40: 4f 4b 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  OK ){.    const 
ec50: 63 68 61 72 20 2a 7a 53 65 70 20 3d 20 22 50 52  char *zSep = "PR
ec60: 49 4d 41 52 59 20 4b 45 59 28 22 3b 0a 20 20 20  IMARY KEY(";.   
ec70: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
ec80: 58 4c 69 73 74 20 3d 20 30 3b 20 20 20 20 20 2f  XList = 0;     /
ec90: 2a 20 50 52 41 47 4d 41 20 69 6e 64 65 78 5f 6c  * PRAGMA index_l
eca0: 69 73 74 20 3d 20 28 70 49 74 65 72 2d 3e 7a 54  ist = (pIter->zT
ecb0: 62 6c 29 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  bl) */.    sqlit
ecc0: 65 33 5f 73 74 6d 74 20 2a 70 58 49 6e 66 6f 20  e3_stmt *pXInfo 
ecd0: 3d 20 30 3b 20 20 20 20 20 2f 2a 20 50 52 41 47  = 0;     /* PRAG
ece0: 4d 41 20 69 6e 64 65 78 5f 78 69 6e 66 6f 20 3d  MA index_xinfo =
ecf0: 20 3c 70 6b 2d 69 6e 64 65 78 3e 20 2a 2f 0a 20   <pk-index> */. 
ed00: 20 20 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 70    .    p->rc = p
ed10: 72 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f 6c  repareFreeAndCol
ed20: 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 4d  lectError(p->dbM
ed30: 61 69 6e 2c 20 26 70 58 4c 69 73 74 2c 20 26 70  ain, &pXList, &p
ed40: 2d 3e 7a 45 72 72 6d 73 67 2c 0a 20 20 20 20 20  ->zErrmsg,.     
ed50: 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e     sqlite3_mprin
ed60: 74 66 28 22 50 52 41 47 4d 41 20 6d 61 69 6e 2e  tf("PRAGMA main.
ed70: 69 6e 64 65 78 5f 6c 69 73 74 20 3d 20 25 51 22  index_list = %Q"
ed80: 2c 20 70 49 74 65 72 2d 3e 7a 54 62 6c 29 0a 20  , pIter->zTbl). 
ed90: 20 20 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28     );.    while(
eda0: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
edb0: 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d  K && SQLITE_ROW=
edc0: 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 58  =sqlite3_step(pX
edd0: 4c 69 73 74 29 20 29 7b 0a 20 20 20 20 20 20 63  List) ){.      c
ede0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67  onst char *zOrig
edf0: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
ee00: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
ee10: 65 78 74 28 70 58 4c 69 73 74 2c 33 29 3b 0a 20  ext(pXList,3);. 
ee20: 20 20 20 20 20 69 66 28 20 7a 4f 72 69 67 20 26       if( zOrig &
ee30: 26 20 73 74 72 63 6d 70 28 7a 4f 72 69 67 2c 20  & strcmp(zOrig, 
ee40: 22 70 6b 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  "pk")==0 ){.    
ee50: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
ee60: 7a 49 64 78 20 3d 20 28 63 6f 6e 73 74 20 63 68  zIdx = (const ch
ee70: 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
ee80: 6d 6e 5f 74 65 78 74 28 70 58 4c 69 73 74 2c 31  mn_text(pXList,1
ee90: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  );.        if( z
eea0: 49 64 78 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Idx ){.         
eeb0: 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65   p->rc = prepare
eec0: 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72  FreeAndCollectEr
eed0: 72 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 26  ror(p->dbMain, &
eee0: 70 58 49 6e 66 6f 2c 20 26 70 2d 3e 7a 45 72 72  pXInfo, &p->zErr
eef0: 6d 73 67 2c 0a 20 20 20 20 20 20 20 20 20 20 20  msg,.           
ef00: 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e     sqlite3_mprin
ef10: 74 66 28 22 50 52 41 47 4d 41 20 6d 61 69 6e 2e  tf("PRAGMA main.
ef20: 69 6e 64 65 78 5f 78 69 6e 66 6f 20 3d 20 25 51  index_xinfo = %Q
ef30: 22 2c 20 7a 49 64 78 29 0a 20 20 20 20 20 20 20  ", zIdx).       
ef40: 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a     );.        }.
ef50: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
ef60: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
ef70: 20 72 62 75 46 69 6e 61 6c 69 7a 65 28 70 2c 20   rbuFinalize(p, 
ef80: 70 58 4c 69 73 74 29 3b 0a 0a 20 20 20 20 77 68  pXList);..    wh
ef90: 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ile( p->rc==SQLI
efa0: 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f  TE_OK && SQLITE_
efb0: 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW==sqlite3_ste
efc0: 70 28 70 58 49 6e 66 6f 29 20 29 7b 0a 20 20 20  p(pXInfo) ){.   
efd0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63     if( sqlite3_c
efe0: 6f 6c 75 6d 6e 5f 69 6e 74 28 70 58 49 6e 66 6f  olumn_int(pXInfo
eff0: 2c 20 35 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 5) ){.        
f000: 2f 2a 20 69 6e 74 20 69 43 69 64 20 3d 20 73 71  /* int iCid = sq
f010: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
f020: 28 70 58 49 6e 66 6f 2c 20 30 29 3b 20 2a 2f 0a  (pXInfo, 0); */.
f030: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
f040: 61 72 20 2a 7a 43 6f 6c 20 3d 20 28 63 6f 6e 73  ar *zCol = (cons
f050: 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
f060: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 58 49 6e  column_text(pXIn
f070: 66 6f 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20  fo, 2);.        
f080: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 65 73  const char *zDes
f090: 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  c = sqlite3_colu
f0a0: 6d 6e 5f 69 6e 74 28 70 58 49 6e 66 6f 2c 20 33  mn_int(pXInfo, 3
f0b0: 29 20 3f 20 22 20 44 45 53 43 22 20 3a 20 22 22  ) ? " DESC" : ""
f0c0: 3b 0a 20 20 20 20 20 20 20 20 7a 20 3d 20 72 62  ;.        z = rb
f0d0: 75 4d 50 72 69 6e 74 66 28 70 2c 20 22 25 7a 25  uMPrintf(p, "%z%
f0e0: 73 5c 22 25 77 5c 22 25 73 22 2c 20 7a 2c 20 7a  s\"%w\"%s", z, z
f0f0: 53 65 70 2c 20 7a 43 6f 6c 2c 20 7a 44 65 73 63  Sep, zCol, zDesc
f100: 29 3b 0a 20 20 20 20 20 20 20 20 7a 53 65 70 20  );.        zSep 
f110: 3d 20 22 2c 20 22 3b 0a 20 20 20 20 20 20 7d 0a  = ", ";.      }.
f120: 20 20 20 20 7d 0a 20 20 20 20 7a 20 3d 20 72 62      }.    z = rb
f130: 75 4d 50 72 69 6e 74 66 28 70 2c 20 22 25 7a 29  uMPrintf(p, "%z)
f140: 22 2c 20 7a 29 3b 0a 20 20 20 20 72 62 75 46 69  ", z);.    rbuFi
f150: 6e 61 6c 69 7a 65 28 70 2c 20 70 58 49 6e 66 6f  nalize(p, pXInfo
f160: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
f170: 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  z;.}../*.** This
f180: 20 66 75 6e 63 74 69 6f 6e 20 63 72 65 61 74 65   function create
f190: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 69 6d 70  s the second imp
f1a0: 6f 73 74 65 72 20 74 61 62 6c 65 20 75 73 65 64  oster table used
f1b0: 20 77 68 65 6e 20 77 72 69 74 69 6e 67 20 74 6f   when writing to
f1c0: 0a 2a 2a 20 61 20 74 61 62 6c 65 20 62 2d 74 72  .** a table b-tr
f1d0: 65 65 20 77 68 65 72 65 20 74 68 65 20 74 61 62  ee where the tab
f1e0: 6c 65 20 68 61 73 20 61 6e 20 65 78 74 65 72 6e  le has an extern
f1f0: 61 6c 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20  al primary key. 
f200: 49 66 20 74 68 65 0a 2a 2a 20 69 74 65 72 61 74  If the.** iterat
f210: 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65  or passed as the
f220: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
f230: 20 64 6f 65 73 20 6e 6f 74 20 63 75 72 72 65 6e   does not curren
f240: 74 6c 79 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20  tly point to.** 
f250: 61 20 74 61 62 6c 65 20 28 6e 6f 74 20 69 6e 64  a table (not ind
f260: 65 78 29 20 77 69 74 68 20 61 6e 20 65 78 74 65  ex) with an exte
f270: 72 6e 61 6c 20 70 72 69 6d 61 72 79 20 6b 65 79  rnal primary key
f280: 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
f290: 69 73 20 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20 0a  is a.** no-op. .
f2a0: 2a 2a 0a 2a 2a 20 41 73 73 75 6d 69 6e 67 20 74  **.** Assuming t
f2b0: 68 65 20 69 74 65 72 61 74 6f 72 20 64 6f 65 73  he iterator does
f2c0: 20 70 6f 69 6e 74 20 74 6f 20 61 20 74 61 62 6c   point to a tabl
f2d0: 65 20 77 69 74 68 20 61 6e 20 65 78 74 65 72 6e  e with an extern
f2e0: 61 6c 20 50 4b 2c 20 74 68 69 73 0a 2a 2a 20 66  al PK, this.** f
f2f0: 75 6e 63 74 69 6f 6e 20 63 72 65 61 74 65 73 20  unction creates 
f300: 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20  a WITHOUT ROWID 
f310: 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 20 6e  imposter table n
f320: 61 6d 65 64 20 22 72 62 75 5f 69 6d 70 6f 73 74  amed "rbu_impost
f330: 65 72 32 22 0a 2a 2a 20 75 73 65 64 20 74 6f 20  er2".** used to 
f340: 61 63 63 65 73 73 20 74 68 61 74 20 50 4b 20 69  access that PK i
f350: 6e 64 65 78 2e 20 46 6f 72 20 65 78 61 6d 70 6c  ndex. For exampl
f360: 65 2c 20 69 66 20 74 68 65 20 74 61 72 67 65 74  e, if the target
f370: 20 74 61 62 6c 65 20 69 73 0a 2a 2a 20 64 65 63   table is.** dec
f380: 6c 61 72 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73  lared as follows
f390: 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45  :.**.**   CREATE
f3a0: 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 20 54   TABLE t1(a, b T
f3b0: 45 58 54 2c 20 63 20 52 45 41 4c 2c 20 50 52 49  EXT, c REAL, PRI
f3c0: 4d 41 52 59 20 4b 45 59 28 62 2c 20 63 29 29 3b  MARY KEY(b, c));
f3d0: 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20  .**.** then the 
f3e0: 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 20 73  imposter table s
f3f0: 63 68 65 6d 61 20 69 73 3a 0a 2a 2a 0a 2a 2a 20  chema is:.**.** 
f400: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 72    CREATE TABLE r
f410: 62 75 5f 69 6d 70 6f 73 74 65 72 32 28 63 31 20  bu_imposter2(c1 
f420: 54 45 58 54 2c 20 63 32 20 52 45 41 4c 2c 20 69  TEXT, c2 REAL, i
f430: 64 20 49 4e 54 45 47 45 52 29 20 57 49 54 48 4f  d INTEGER) WITHO
f440: 55 54 20 52 4f 57 49 44 3b 0a 2a 2a 0a 2a 2f 0a  UT ROWID;.**.*/.
f450: 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75 43  static void rbuC
f460: 72 65 61 74 65 49 6d 70 6f 73 74 65 72 54 61 62  reateImposterTab
f470: 6c 65 32 28 73 71 6c 69 74 65 33 72 62 75 20 2a  le2(sqlite3rbu *
f480: 70 2c 20 52 62 75 4f 62 6a 49 74 65 72 20 2a 70  p, RbuObjIter *p
f490: 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70 2d 3e  Iter){.  if( p->
f4a0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
f4b0: 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52   pIter->eType==R
f4c0: 42 55 5f 50 4b 5f 45 58 54 45 52 4e 41 4c 20 29  BU_PK_EXTERNAL )
f4d0: 7b 0a 20 20 20 20 69 6e 74 20 74 6e 75 6d 20 3d  {.    int tnum =
f4e0: 20 70 49 74 65 72 2d 3e 69 50 6b 54 6e 75 6d 3b   pIter->iPkTnum;
f4f0: 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
f500: 20 6f 66 20 50 4b 20 69 6e 64 65 78 20 2a 2f 0a   of PK index */.
f510: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
f520: 20 2a 70 51 75 65 72 79 20 3d 20 30 3b 20 20 20   *pQuery = 0;   
f530: 20 20 2f 2a 20 53 45 4c 45 43 54 20 6e 61 6d 65    /* SELECT name
f540: 20 2e 2e 2e 20 57 48 45 52 45 20 72 6f 6f 74 70   ... WHERE rootp
f550: 61 67 65 20 3d 20 24 74 6e 75 6d 20 2a 2f 0a 20  age = $tnum */. 
f560: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
f570: 49 64 78 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Idx = 0;        
f580: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 50 4b 20 69   /* Name of PK i
f590: 6e 64 65 78 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ndex */.    sqli
f5a0: 74 65 33 5f 73 74 6d 74 20 2a 70 58 49 6e 66 6f  te3_stmt *pXInfo
f5b0: 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 50 52 41   = 0;     /* PRA
f5c0: 47 4d 41 20 6d 61 69 6e 2e 69 6e 64 65 78 5f 78  GMA main.index_x
f5d0: 69 6e 66 6f 20 3d 20 24 7a 49 64 78 20 2a 2f 0a  info = $zIdx */.
f5e0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
f5f0: 7a 43 6f 6d 6d 61 20 3d 20 22 22 3b 0a 20 20 20  zComma = "";.   
f600: 20 63 68 61 72 20 2a 7a 43 6f 6c 73 20 3d 20 30   char *zCols = 0
f610: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
f620: 2a 20 55 73 65 64 20 74 6f 20 62 75 69 6c 64 20  * Used to build 
f630: 75 70 20 6c 69 73 74 20 6f 66 20 74 61 62 6c 65  up list of table
f640: 20 63 6f 6c 73 20 2a 2f 0a 20 20 20 20 63 68 61   cols */.    cha
f650: 72 20 2a 7a 50 6b 20 3d 20 30 3b 20 20 20 20 20  r *zPk = 0;     
f660: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
f670: 65 64 20 74 6f 20 62 75 69 6c 64 20 75 70 20 74  ed to build up t
f680: 61 62 6c 65 20 50 4b 20 64 65 63 6c 61 72 61 74  able PK declarat
f690: 69 6f 6e 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46  ion */..    /* F
f6a0: 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 6e 61  igure out the na
f6b0: 6d 65 20 6f 66 20 74 68 65 20 70 72 69 6d 61 72  me of the primar
f6c0: 79 20 6b 65 79 20 69 6e 64 65 78 20 66 6f 72 20  y key index for 
f6d0: 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c  the current tabl
f6e0: 65 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69  e..    ** This i
f6f0: 73 20 6e 65 65 64 65 64 20 66 6f 72 20 74 68 65  s needed for the
f700: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 22 50 52   argument to "PR
f710: 41 47 4d 41 20 69 6e 64 65 78 5f 78 69 6e 66 6f  AGMA index_xinfo
f720: 22 2e 20 53 65 74 0a 20 20 20 20 2a 2a 20 7a 49  ". Set.    ** zI
f730: 64 78 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61  dx to point to a
f740: 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20   nul-terminated 
f750: 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e  string containin
f760: 67 20 74 68 69 73 20 6e 61 6d 65 2e 20 2a 2f 0a  g this name. */.
f770: 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70      p->rc = prep
f780: 61 72 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72  areAndCollectErr
f790: 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 70  or(p->dbMain, &p
f7a0: 51 75 65 72 79 2c 20 26 70 2d 3e 7a 45 72 72 6d  Query, &p->zErrm
f7b0: 73 67 2c 20 0a 20 20 20 20 20 20 20 20 22 53 45  sg, .        "SE
f7c0: 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 73  LECT name FROM s
f7d0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 57 48 45  qlite_master WHE
f7e0: 52 45 20 72 6f 6f 74 70 61 67 65 20 3d 20 3f 22  RE rootpage = ?"
f7f0: 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
f800: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
f810: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
f820: 33 5f 62 69 6e 64 5f 69 6e 74 28 70 51 75 65 72  3_bind_int(pQuer
f830: 79 2c 20 31 2c 20 74 6e 75 6d 29 3b 0a 20 20 20  y, 1, tnum);.   
f840: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f     if( SQLITE_RO
f850: 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28  W==sqlite3_step(
f860: 70 51 75 65 72 79 29 20 29 7b 0a 20 20 20 20 20  pQuery) ){.     
f870: 20 20 20 7a 49 64 78 20 3d 20 28 63 6f 6e 73 74     zIdx = (const
f880: 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63   char*)sqlite3_c
f890: 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 51 75 65 72  olumn_text(pQuer
f8a0: 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  y, 0);.      }. 
f8b0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 49 64     }.    if( zId
f8c0: 78 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63  x ){.      p->rc
f8d0: 20 3d 20 70 72 65 70 61 72 65 46 72 65 65 41 6e   = prepareFreeAn
f8e0: 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d  dCollectError(p-
f8f0: 3e 64 62 4d 61 69 6e 2c 20 26 70 58 49 6e 66 6f  >dbMain, &pXInfo
f900: 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 0a 20  , &p->zErrmsg,. 
f910: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
f920: 5f 6d 70 72 69 6e 74 66 28 22 50 52 41 47 4d 41  _mprintf("PRAGMA
f930: 20 6d 61 69 6e 2e 69 6e 64 65 78 5f 78 69 6e 66   main.index_xinf
f940: 6f 20 3d 20 25 51 22 2c 20 7a 49 64 78 29 0a 20  o = %Q", zIdx). 
f950: 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20       );.    }.  
f960: 20 20 72 62 75 46 69 6e 61 6c 69 7a 65 28 70 2c    rbuFinalize(p,
f970: 20 70 51 75 65 72 79 29 3b 0a 0a 20 20 20 20 77   pQuery);..    w
f980: 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  hile( p->rc==SQL
f990: 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45  ITE_OK && SQLITE
f9a0: 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74  _ROW==sqlite3_st
f9b0: 65 70 28 70 58 49 6e 66 6f 29 20 29 7b 0a 20 20  ep(pXInfo) ){.  
f9c0: 20 20 20 20 69 6e 74 20 62 4b 65 79 20 3d 20 73      int bKey = s
f9d0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
f9e0: 74 28 70 58 49 6e 66 6f 2c 20 35 29 3b 0a 20 20  t(pXInfo, 5);.  
f9f0: 20 20 20 20 69 66 28 20 62 4b 65 79 20 29 7b 0a      if( bKey ){.
fa00: 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 69 64          int iCid
fa10: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
fa20: 6e 5f 69 6e 74 28 70 58 49 6e 66 6f 2c 20 31 29  n_int(pXInfo, 1)
fa30: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 62 44  ;.        int bD
fa40: 65 73 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  esc = sqlite3_co
fa50: 6c 75 6d 6e 5f 69 6e 74 28 70 58 49 6e 66 6f 2c  lumn_int(pXInfo,
fa60: 20 33 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e   3);.        con
fa70: 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 61 74  st char *zCollat
fa80: 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  e = (const char*
fa90: 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
faa0: 74 65 78 74 28 70 58 49 6e 66 6f 2c 20 34 29 3b  text(pXInfo, 4);
fab0: 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 73 20 3d  .        zCols =
fac0: 20 72 62 75 4d 50 72 69 6e 74 66 28 70 2c 20 22   rbuMPrintf(p, "
fad0: 25 7a 25 73 63 25 64 20 25 73 20 43 4f 4c 4c 41  %z%sc%d %s COLLA
fae0: 54 45 20 25 51 22 2c 20 7a 43 6f 6c 73 2c 20 7a  TE %Q", zCols, z
faf0: 43 6f 6d 6d 61 2c 20 0a 20 20 20 20 20 20 20 20  Comma, .        
fb00: 20 20 20 20 69 43 69 64 2c 20 70 49 74 65 72 2d      iCid, pIter-
fb10: 3e 61 7a 54 62 6c 54 79 70 65 5b 69 43 69 64 5d  >azTblType[iCid]
fb20: 2c 20 7a 43 6f 6c 6c 61 74 65 0a 20 20 20 20 20  , zCollate.     
fb30: 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7a 50     );.        zP
fb40: 6b 20 3d 20 72 62 75 4d 50 72 69 6e 74 66 28 70  k = rbuMPrintf(p
fb50: 2c 20 22 25 7a 25 73 63 25 64 25 73 22 2c 20 7a  , "%z%sc%d%s", z
fb60: 50 6b 2c 20 7a 43 6f 6d 6d 61 2c 20 69 43 69 64  Pk, zComma, iCid
fb70: 2c 20 62 44 65 73 63 3f 22 20 44 45 53 43 22 3a  , bDesc?" DESC":
fb80: 22 22 29 3b 0a 20 20 20 20 20 20 20 20 7a 43 6f  "");.        zCo
fb90: 6d 6d 61 20 3d 20 22 2c 20 22 3b 0a 20 20 20 20  mma = ", ";.    
fba0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 43    }.    }.    zC
fbb0: 6f 6c 73 20 3d 20 72 62 75 4d 50 72 69 6e 74 66  ols = rbuMPrintf
fbc0: 28 70 2c 20 22 25 7a 2c 20 69 64 20 49 4e 54 45  (p, "%z, id INTE
fbd0: 47 45 52 22 2c 20 7a 43 6f 6c 73 29 3b 0a 20 20  GER", zCols);.  
fbe0: 20 20 72 62 75 46 69 6e 61 6c 69 7a 65 28 70 2c    rbuFinalize(p,
fbf0: 20 70 58 49 6e 66 6f 29 3b 0a 0a 20 20 20 20 73   pXInfo);..    s
fc00: 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
fc10: 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
fc20: 54 52 4c 5f 49 4d 50 4f 53 54 45 52 2c 20 70 2d  TRL_IMPOSTER, p-
fc30: 3e 64 62 4d 61 69 6e 2c 20 22 6d 61 69 6e 22 2c  >dbMain, "main",
fc40: 20 31 2c 20 74 6e 75 6d 29 3b 0a 20 20 20 20 72   1, tnum);.    r
fc50: 62 75 4d 50 72 69 6e 74 66 45 78 65 63 28 70 2c  buMPrintfExec(p,
fc60: 20 70 2d 3e 64 62 4d 61 69 6e 2c 0a 20 20 20 20   p->dbMain,.    
fc70: 20 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c      "CREATE TABL
fc80: 45 20 72 62 75 5f 69 6d 70 6f 73 74 65 72 32 28  E rbu_imposter2(
fc90: 25 7a 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28  %z, PRIMARY KEY(
fca0: 25 7a 29 29 20 57 49 54 48 4f 55 54 20 52 4f 57  %z)) WITHOUT ROW
fcb0: 49 44 22 2c 20 0a 20 20 20 20 20 20 20 20 7a 43  ID", .        zC
fcc0: 6f 6c 73 2c 20 7a 50 6b 0a 20 20 20 20 29 3b 0a  ols, zPk.    );.
fcd0: 20 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74      sqlite3_test
fce0: 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
fcf0: 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45  TESTCTRL_IMPOSTE
fd00: 52 2c 20 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 6d  R, p->dbMain, "m
fd10: 61 69 6e 22 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  ain", 0, 0);.  }
fd20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 6e 20  .}../*.** If an 
fd30: 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64  error has alread
fd40: 79 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e 20  y occurred when 
fd50: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
fd60: 20 63 61 6c 6c 65 64 2c 20 69 74 20 0a 2a 2a 20   called, it .** 
fd70: 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 74 75  immediately retu
fd80: 72 6e 73 20 7a 65 72 6f 20 28 77 69 74 68 6f 75  rns zero (withou
fd90: 74 20 64 6f 69 6e 67 20 61 6e 79 20 77 6f 72 6b  t doing any work
fda0: 29 2e 20 4f 72 2c 20 69 66 20 61 6e 20 65 72 72  ). Or, if an err
fdb0: 6f 72 0a 2a 2a 20 6f 63 63 75 72 73 20 64 75 72  or.** occurs dur
fdc0: 69 6e 67 20 74 68 65 20 65 78 65 63 75 74 69 6f  ing the executio
fdd0: 6e 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  n of this functi
fde0: 6f 6e 2c 20 69 74 20 73 65 74 73 20 74 68 65 20  on, it sets the 
fdf0: 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 69 6e  error code.** in
fe00: 20 74 68 65 20 73 71 6c 69 74 65 33 72 62 75 20   the sqlite3rbu 
fe10: 6f 62 6a 65 63 74 20 69 6e 64 69 63 61 74 65 64  object indicated
fe20: 20 62 79 20 74 68 65 20 66 69 72 73 74 20 61 72   by the first ar
fe30: 67 75 6d 65 6e 74 20 61 6e 64 20 72 65 74 75 72  gument and retur
fe40: 6e 73 0a 2a 2a 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a  ns.** zero..**.*
fe50: 2a 20 54 68 65 20 69 74 65 72 61 74 6f 72 20 70  * The iterator p
fe60: 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
fe70: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
fe80: 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 70 6f  guaranteed to po
fe90: 69 6e 74 20 74 6f 0a 2a 2a 20 61 20 74 61 62 6c  int to.** a tabl
fea0: 65 20 28 6e 6f 74 20 61 6e 20 69 6e 64 65 78 29  e (not an index)
feb0: 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
fec0: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 20 54  ion is called. T
fed0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
fee0: 61 74 74 65 6d 70 74 73 20 74 6f 20 63 72 65 61  attempts to crea
fef0: 74 65 20 61 6e 79 20 69 6d 70 6f 73 74 65 72 20  te any imposter 
ff00: 74 61 62 6c 65 20 72 65 71 75 69 72 65 64 20 74  table required t
ff10: 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6d  o write to the m
ff20: 61 69 6e 0a 2a 2a 20 74 61 62 6c 65 20 62 2d 74  ain.** table b-t
ff30: 72 65 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ree of the table
ff40: 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
ff50: 67 2e 20 4e 6f 6e 2d 7a 65 72 6f 20 69 73 20 72  g. Non-zero is r
ff60: 65 74 75 72 6e 65 64 20 69 66 0a 2a 2a 20 61 6e  eturned if.** an
ff70: 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 20   imposter table 
ff80: 61 72 65 20 63 72 65 61 74 65 64 2c 20 6f 72 20  are created, or 
ff90: 7a 65 72 6f 20 6f 74 68 65 72 77 69 73 65 2e 0a  zero otherwise..
ffa0: 2a 2a 0a 2a 2a 20 41 6e 20 69 6d 70 6f 73 74 65  **.** An imposte
ffb0: 72 20 74 61 62 6c 65 20 69 73 20 72 65 71 75 69  r table is requi
ffc0: 72 65 64 20 69 6e 20 61 6c 6c 20 63 61 73 65 73  red in all cases
ffd0: 20 65 78 63 65 70 74 20 52 42 55 5f 50 4b 5f 56   except RBU_PK_V
ffe0: 54 41 42 2e 20 4f 6e 6c 79 0a 2a 2a 20 76 69 72  TAB. Only.** vir
fff0: 74 75 61 6c 20 74 61 62 6c 65 73 20 61 72 65 20  tual tables are 
10000 77 72 69 74 74 65 6e 20 74 6f 20 64 69 72 65 63  written to direc
10010 74 6c 79 2e 20 54 68 65 20 69 6d 70 6f 73 74 65  tly. The imposte
10020 72 20 74 61 62 6c 65 20 68 61 73 20 74 68 65 20  r table has the 
10030 0a 2a 2a 20 73 61 6d 65 20 73 63 68 65 6d 61 20  .** same schema 
10040 61 73 20 74 68 65 20 61 63 74 75 61 6c 20 74 61  as the actual ta
10050 72 67 65 74 20 74 61 62 6c 65 20 28 6c 65 73 73  rget table (less
10060 20 61 6e 79 20 55 4e 49 51 55 45 20 63 6f 6e 73   any UNIQUE cons
10070 74 72 61 69 6e 74 73 29 2e 20 0a 2a 2a 20 4d 6f  traints). .** Mo
10080 72 65 20 70 72 65 63 69 73 65 6c 79 2c 20 74 68  re precisely, th
10090 65 20 22 73 61 6d 65 20 73 63 68 65 6d 61 22 20  e "same schema" 
100a0 6d 65 61 6e 73 20 74 68 65 20 73 61 6d 65 20 63  means the same c
100b0 6f 6c 75 6d 6e 73 2c 20 74 79 70 65 73 2c 20 0a  olumns, types, .
100c0 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ** collation seq
100d0 75 65 6e 63 65 73 2e 20 46 6f 72 20 74 61 62 6c  uences. For tabl
100e0 65 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 68  es that do not h
100f0 61 76 65 20 61 6e 20 65 78 74 65 72 6e 61 6c 20  ave an external 
10100 50 52 49 4d 41 52 59 0a 2a 2a 20 4b 45 59 2c 20  PRIMARY.** KEY, 
10110 69 74 20 61 6c 73 6f 20 6d 65 61 6e 73 20 74 68  it also means th
10120 65 20 73 61 6d 65 20 50 52 49 4d 41 52 59 20 4b  e same PRIMARY K
10130 45 59 20 64 65 63 6c 61 72 61 74 69 6f 6e 2e 0a  EY declaration..
10140 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
10150 62 75 43 72 65 61 74 65 49 6d 70 6f 73 74 65 72  buCreateImposter
10160 54 61 62 6c 65 28 73 71 6c 69 74 65 33 72 62 75  Table(sqlite3rbu
10170 20 2a 70 2c 20 52 62 75 4f 62 6a 49 74 65 72 20   *p, RbuObjIter 
10180 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70  *pIter){.  if( p
10190 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
101a0 26 26 20 70 49 74 65 72 2d 3e 65 54 79 70 65 21  && pIter->eType!
101b0 3d 52 42 55 5f 50 4b 5f 56 54 41 42 20 29 7b 0a  =RBU_PK_VTAB ){.
101c0 20 20 20 20 69 6e 74 20 74 6e 75 6d 20 3d 20 70      int tnum = p
101d0 49 74 65 72 2d 3e 69 54 6e 75 6d 3b 0a 20 20 20  Iter->iTnum;.   
101e0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
101f0 6d 6d 61 20 3d 20 22 22 3b 0a 20 20 20 20 63 68  mma = "";.    ch
10200 61 72 20 2a 7a 53 71 6c 20 3d 20 30 3b 0a 20 20  ar *zSql = 0;.  
10210 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20    int iCol;.    
10220 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
10230 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
10240 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52 2c 20 70  CTRL_IMPOSTER, p
10250 2d 3e 64 62 4d 61 69 6e 2c 20 22 6d 61 69 6e 22  ->dbMain, "main"
10260 2c 20 30 2c 20 31 29 3b 0a 0a 20 20 20 20 66 6f  , 0, 1);..    fo
10270 72 28 69 43 6f 6c 3d 30 3b 20 70 2d 3e 72 63 3d  r(iCol=0; p->rc=
10280 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 43  =SQLITE_OK && iC
10290 6f 6c 3c 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f  ol<pIter->nTblCo
102a0 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  l; iCol++){.    
102b0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
102c0 6b 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 63 6f  k = "";.      co
102d0 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 20 3d  nst char *zCol =
102e0 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c   pIter->azTblCol
102f0 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 20 20 63 6f  [iCol];.      co
10300 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20  nst char *zColl 
10310 3d 20 30 3b 0a 0a 20 20 20 20 20 20 70 2d 3e 72  = 0;..      p->r
10320 63 20 3d 20 73 71 6c 69 74 65 33 5f 74 61 62 6c  c = sqlite3_tabl
10330 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74  e_column_metadat
10340 61 28 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  a(.          p->
10350 64 62 4d 61 69 6e 2c 20 22 6d 61 69 6e 22 2c 20  dbMain, "main", 
10360 70 49 74 65 72 2d 3e 7a 54 62 6c 2c 20 7a 43 6f  pIter->zTbl, zCo
10370 6c 2c 20 30 2c 20 26 7a 43 6f 6c 6c 2c 20 30 2c  l, 0, &zColl, 0,
10380 20 30 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a 0a   0, 0.      );..
10390 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d        if( pIter-
103a0 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 49  >eType==RBU_PK_I
103b0 50 4b 20 26 26 20 70 49 74 65 72 2d 3e 61 62 54  PK && pIter->abT
103c0 62 6c 50 6b 5b 69 43 6f 6c 5d 20 29 7b 0a 20 20  blPk[iCol] ){.  
103d0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
103e0 74 61 72 67 65 74 20 74 61 62 6c 65 20 63 6f 6c  target table col
103f0 75 6d 6e 20 69 73 20 61 6e 20 22 49 4e 54 45 47  umn is an "INTEG
10400 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 22 2c  ER PRIMARY KEY",
10410 20 61 64 64 0a 20 20 20 20 20 20 20 20 2a 2a 20   add.        ** 
10420 22 50 52 49 4d 41 52 59 20 4b 45 59 22 20 74 6f  "PRIMARY KEY" to
10430 20 74 68 65 20 69 6d 70 6f 73 74 65 72 20 74 61   the imposter ta
10440 62 6c 65 20 63 6f 6c 75 6d 6e 20 64 65 63 6c 61  ble column decla
10450 72 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20  ration. */.     
10460 20 20 20 7a 50 6b 20 3d 20 22 50 52 49 4d 41 52     zPk = "PRIMAR
10470 59 20 4b 45 59 20 22 3b 0a 20 20 20 20 20 20 7d  Y KEY ";.      }
10480 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 72 62  .      zSql = rb
10490 75 4d 50 72 69 6e 74 66 28 70 2c 20 22 25 7a 25  uMPrintf(p, "%z%
104a0 73 5c 22 25 77 5c 22 20 25 73 20 25 73 43 4f 4c  s\"%w\" %s %sCOL
104b0 4c 41 54 45 20 25 51 25 73 22 2c 20 0a 20 20 20  LATE %Q%s", .   
104c0 20 20 20 20 20 20 20 7a 53 71 6c 2c 20 7a 43 6f         zSql, zCo
104d0 6d 6d 61 2c 20 7a 43 6f 6c 2c 20 70 49 74 65 72  mma, zCol, pIter
104e0 2d 3e 61 7a 54 62 6c 54 79 70 65 5b 69 43 6f 6c  ->azTblType[iCol
104f0 5d 2c 20 7a 50 6b 2c 20 7a 43 6f 6c 6c 2c 0a 20  ], zPk, zColl,. 
10500 20 20 20 20 20 20 20 20 20 28 70 49 74 65 72 2d           (pIter-
10510 3e 61 62 4e 6f 74 4e 75 6c 6c 5b 69 43 6f 6c 5d  >abNotNull[iCol]
10520 20 3f 20 22 20 4e 4f 54 20 4e 55 4c 4c 22 20 3a   ? " NOT NULL" :
10530 20 22 22 29 0a 20 20 20 20 20 20 29 3b 0a 20 20   "").      );.  
10540 20 20 20 20 7a 43 6f 6d 6d 61 20 3d 20 22 2c 20      zComma = ", 
10550 22 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  ";.    }..    if
10560 28 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d  ( pIter->eType==
10570 52 42 55 5f 50 4b 5f 57 49 54 48 4f 55 54 5f 52  RBU_PK_WITHOUT_R
10580 4f 57 49 44 20 29 7b 0a 20 20 20 20 20 20 63 68  OWID ){.      ch
10590 61 72 20 2a 7a 50 6b 20 3d 20 72 62 75 57 69 74  ar *zPk = rbuWit
105a0 68 6f 75 74 52 6f 77 69 64 50 4b 28 70 2c 20 70  houtRowidPK(p, p
105b0 49 74 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  Iter);.      if(
105c0 20 7a 50 6b 20 29 7b 0a 20 20 20 20 20 20 20 20   zPk ){.        
105d0 7a 53 71 6c 20 3d 20 72 62 75 4d 50 72 69 6e 74  zSql = rbuMPrint
105e0 66 28 70 2c 20 22 25 7a 2c 20 25 7a 22 2c 20 7a  f(p, "%z, %z", z
105f0 53 71 6c 2c 20 7a 50 6b 29 3b 0a 20 20 20 20 20  Sql, zPk);.     
10600 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71   }.    }..    sq
10610 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
10620 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
10630 52 4c 5f 49 4d 50 4f 53 54 45 52 2c 20 70 2d 3e  RL_IMPOSTER, p->
10640 64 62 4d 61 69 6e 2c 20 22 6d 61 69 6e 22 2c 20  dbMain, "main", 
10650 31 2c 20 74 6e 75 6d 29 3b 0a 20 20 20 20 72 62  1, tnum);.    rb
10660 75 4d 50 72 69 6e 74 66 45 78 65 63 28 70 2c 20  uMPrintfExec(p, 
10670 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 43 52 45 41  p->dbMain, "CREA
10680 54 45 20 54 41 42 4c 45 20 5c 22 72 62 75 5f 69  TE TABLE \"rbu_i
10690 6d 70 5f 25 77 5c 22 28 25 7a 29 25 73 22 2c 20  mp_%w\"(%z)%s", 
106a0 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e  .        pIter->
106b0 7a 54 62 6c 2c 20 7a 53 71 6c 2c 20 0a 20 20 20  zTbl, zSql, .   
106c0 20 20 20 20 20 28 70 49 74 65 72 2d 3e 65 54 79       (pIter->eTy
106d0 70 65 3d 3d 52 42 55 5f 50 4b 5f 57 49 54 48 4f  pe==RBU_PK_WITHO
106e0 55 54 5f 52 4f 57 49 44 20 3f 20 22 20 57 49 54  UT_ROWID ? " WIT
106f0 48 4f 55 54 20 52 4f 57 49 44 22 20 3a 20 22 22  HOUT ROWID" : ""
10700 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c  ).    );.    sql
10710 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
10720 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
10730 4c 5f 49 4d 50 4f 53 54 45 52 2c 20 70 2d 3e 64  L_IMPOSTER, p->d
10740 62 4d 61 69 6e 2c 20 22 6d 61 69 6e 22 2c 20 30  bMain, "main", 0
10750 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  , 0);.  }.}../*.
10760 2a 2a 20 50 72 65 70 61 72 65 20 61 20 73 74 61  ** Prepare a sta
10770 74 65 6d 65 6e 74 20 75 73 65 64 20 74 6f 20 69  tement used to i
10780 6e 73 65 72 74 20 72 6f 77 73 20 69 6e 74 6f 20  nsert rows into 
10790 74 68 65 20 22 72 62 75 5f 74 6d 70 5f 78 78 78  the "rbu_tmp_xxx
107a0 22 20 74 61 62 6c 65 2e 0a 2a 2a 20 53 70 65 63  " table..** Spec
107b0 69 66 69 63 61 6c 6c 79 20 61 20 73 74 61 74 65  ifically a state
107c0 6d 65 6e 74 20 6f 66 20 74 68 65 20 66 6f 72 6d  ment of the form
107d0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 49 4e 53 45  :.**.**     INSE
107e0 52 54 20 49 4e 54 4f 20 72 62 75 5f 74 6d 70 5f  RT INTO rbu_tmp_
107f0 78 78 78 20 56 41 4c 55 45 53 28 3f 2c 20 3f 2c  xxx VALUES(?, ?,
10800 20 3f 20 2e 2e 2e 29 3b 0a 2a 2a 0a 2a 2a 20 54   ? ...);.**.** T
10810 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 6f 75  he number of bou
10820 6e 64 20 76 61 72 69 61 62 6c 65 73 20 69 73 20  nd variables is 
10830 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6e 75 6d  equal to the num
10840 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
10850 6e 0a 2a 2a 20 74 68 65 20 74 61 72 67 65 74 20  n.** the target 
10860 74 61 62 6c 65 2c 20 70 6c 75 73 20 6f 6e 65 20  table, plus one 
10870 28 66 6f 72 20 74 68 65 20 72 62 75 5f 63 6f 6e  (for the rbu_con
10880 74 72 6f 6c 20 63 6f 6c 75 6d 6e 29 2c 20 70 6c  trol column), pl
10890 75 73 20 6f 6e 65 20 6d 6f 72 65 20 0a 2a 2a 20  us one more .** 
108a0 28 66 6f 72 20 74 68 65 20 72 62 75 5f 72 6f 77  (for the rbu_row
108b0 69 64 20 63 6f 6c 75 6d 6e 29 20 69 66 20 74 68  id column) if th
108c0 65 20 74 61 72 67 65 74 20 74 61 62 6c 65 20 69  e target table i
108d0 73 20 61 6e 20 69 6d 70 6c 69 63 69 74 20 49 50  s an implicit IP
108e0 4b 20 6f 72 20 0a 2a 2a 20 76 69 72 74 75 61 6c  K or .** virtual
108f0 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69   table..*/.stati
10900 63 20 76 6f 69 64 20 72 62 75 4f 62 6a 49 74 65  c void rbuObjIte
10910 72 50 72 65 70 61 72 65 54 6d 70 49 6e 73 65 72  rPrepareTmpInser
10920 74 28 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20  t(.  sqlite3rbu 
10930 2a 70 2c 20 0a 20 20 52 62 75 4f 62 6a 49 74 65  *p, .  RbuObjIte
10940 72 20 2a 70 49 74 65 72 2c 0a 20 20 63 6f 6e 73  r *pIter,.  cons
10950 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 69 73 74  t char *zCollist
10960 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
10970 7a 52 62 75 52 6f 77 69 64 0a 29 7b 0a 20 20 69  zRbuRowid.){.  i
10980 6e 74 20 62 52 62 75 52 6f 77 69 64 20 3d 20 28  nt bRbuRowid = (
10990 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42  pIter->eType==RB
109a0 55 5f 50 4b 5f 45 58 54 45 52 4e 41 4c 20 7c 7c  U_PK_EXTERNAL ||
109b0 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52   pIter->eType==R
109c0 42 55 5f 50 4b 5f 4e 4f 4e 45 29 3b 0a 20 20 63  BU_PK_NONE);.  c
109d0 68 61 72 20 2a 7a 42 69 6e 64 20 3d 20 72 62 75  har *zBind = rbu
109e0 4f 62 6a 49 74 65 72 47 65 74 42 69 6e 64 6c 69  ObjIterGetBindli
109f0 73 74 28 70 2c 20 70 49 74 65 72 2d 3e 6e 54 62  st(p, pIter->nTb
10a00 6c 43 6f 6c 20 2b 20 31 20 2b 20 62 52 62 75 52  lCol + 1 + bRbuR
10a10 6f 77 69 64 29 3b 0a 20 20 69 66 28 20 7a 42 69  owid);.  if( zBi
10a20 6e 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  nd ){.    assert
10a30 28 20 70 49 74 65 72 2d 3e 70 54 6d 70 49 6e 73  ( pIter->pTmpIns
10a40 65 72 74 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d  ert==0 );.    p-
10a50 3e 72 63 20 3d 20 70 72 65 70 61 72 65 46 72 65  >rc = prepareFre
10a60 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72  eAndCollectError
10a70 28 0a 20 20 20 20 20 20 20 20 70 2d 3e 64 62 52  (.        p->dbR
10a80 62 75 2c 20 26 70 49 74 65 72 2d 3e 70 54 6d 70  bu, &pIter->pTmp
10a90 49 6e 73 65 72 74 2c 20 26 70 2d 3e 7a 45 72 72  Insert, &p->zErr
10aa0 6d 73 67 2c 20 73 71 6c 69 74 65 33 5f 6d 70 72  msg, sqlite3_mpr
10ab0 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20  intf(.          
10ac0 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 25 73 2e  "INSERT INTO %s.
10ad0 27 72 62 75 5f 74 6d 70 5f 25 71 27 28 72 62 75  'rbu_tmp_%q'(rbu
10ae0 5f 63 6f 6e 74 72 6f 6c 2c 25 73 25 73 29 20 56  _control,%s%s) V
10af0 41 4c 55 45 53 28 25 7a 29 22 2c 20 0a 20 20 20  ALUES(%z)", .   
10b00 20 20 20 20 20 20 20 70 2d 3e 7a 53 74 61 74 65         p->zState
10b10 44 62 2c 20 70 49 74 65 72 2d 3e 7a 44 61 74 61  Db, pIter->zData
10b20 54 62 6c 2c 20 7a 43 6f 6c 6c 69 73 74 2c 20 7a  Tbl, zCollist, z
10b30 52 62 75 52 6f 77 69 64 2c 20 7a 42 69 6e 64 0a  RbuRowid, zBind.
10b40 20 20 20 20 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 73      ));.  }.}..s
10b50 74 61 74 69 63 20 76 6f 69 64 20 72 62 75 54 6d  tatic void rbuTm
10b60 70 49 6e 73 65 72 74 46 75 6e 63 28 0a 20 20 73  pInsertFunc(.  s
10b70 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
10b80 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 56 61  pCtx, .  int nVa
10b90 6c 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  l,.  sqlite3_val
10ba0 75 65 20 2a 2a 61 70 56 61 6c 0a 29 7b 0a 20 20  ue **apVal.){.  
10bb0 73 71 6c 69 74 65 33 72 62 75 20 2a 70 20 3d 20  sqlite3rbu *p = 
10bc0 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74  sqlite3_user_dat
10bd0 61 28 70 43 74 78 29 3b 0a 20 20 69 6e 74 20 72  a(pCtx);.  int r
10be0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
10bf0 20 69 6e 74 20 69 3b 0a 0a 20 20 61 73 73 65 72   int i;..  asser
10c00 74 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  t( sqlite3_value
10c10 5f 69 6e 74 28 61 70 56 61 6c 5b 30 5d 29 21 3d  _int(apVal[0])!=
10c20 30 0a 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6f 62  0.      || p->ob
10c30 6a 69 74 65 72 2e 65 54 79 70 65 3d 3d 52 42 55  jiter.eType==RBU
10c40 5f 50 4b 5f 45 58 54 45 52 4e 41 4c 20 0a 20 20  _PK_EXTERNAL .  
10c50 20 20 20 20 7c 7c 20 70 2d 3e 6f 62 6a 69 74 65      || p->objite
10c60 72 2e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f  r.eType==RBU_PK_
10c70 4e 4f 4e 45 20 0a 20 20 29 3b 0a 20 20 69 66 28  NONE .  );.  if(
10c80 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
10c90 6e 74 28 61 70 56 61 6c 5b 30 5d 29 21 3d 30 20  nt(apVal[0])!=0 
10ca0 29 7b 0a 20 20 20 20 70 2d 3e 6e 50 68 61 73 65  ){.    p->nPhase
10cb0 4f 6e 65 53 74 65 70 20 2b 3d 20 70 2d 3e 6f 62  OneStep += p->ob
10cc0 6a 69 74 65 72 2e 6e 49 6e 64 65 78 3b 0a 20 20  jiter.nIndex;.  
10cd0 7d 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63  }..  for(i=0; rc
10ce0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
10cf0 3c 6e 56 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nVal; i++){.   
10d00 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69   rc = sqlite3_bi
10d10 6e 64 5f 76 61 6c 75 65 28 70 2d 3e 6f 62 6a 69  nd_value(p->obji
10d20 74 65 72 2e 70 54 6d 70 49 6e 73 65 72 74 2c 20  ter.pTmpInsert, 
10d30 69 2b 31 2c 20 61 70 56 61 6c 5b 69 5d 29 3b 0a  i+1, apVal[i]);.
10d40 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
10d50 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
10d60 71 6c 69 74 65 33 5f 73 74 65 70 28 70 2d 3e 6f  qlite3_step(p->o
10d70 62 6a 69 74 65 72 2e 70 54 6d 70 49 6e 73 65 72  bjiter.pTmpInser
10d80 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  t);.    rc = sql
10d90 69 74 65 33 5f 72 65 73 65 74 28 70 2d 3e 6f 62  ite3_reset(p->ob
10da0 6a 69 74 65 72 2e 70 54 6d 70 49 6e 73 65 72 74  jiter.pTmpInsert
10db0 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63  );.  }..  if( rc
10dc0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
10dd0 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
10de0 74 5f 65 72 72 6f 72 5f 63 6f 64 65 28 70 43 74  t_error_code(pCt
10df0 78 2c 20 72 63 29 3b 0a 20 20 7d 0a 7d 0a 0a 73  x, rc);.  }.}..s
10e00 74 61 74 69 63 20 63 68 61 72 20 2a 72 62 75 4f  tatic char *rbuO
10e10 62 6a 49 74 65 72 47 65 74 49 6e 64 65 78 57 68  bjIterGetIndexWh
10e20 65 72 65 28 73 71 6c 69 74 65 33 72 62 75 20 2a  ere(sqlite3rbu *
10e30 70 2c 20 52 62 75 4f 62 6a 49 74 65 72 20 2a 70  p, RbuObjIter *p
10e40 49 74 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33  Iter){.  sqlite3
10e50 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30  _stmt *pStmt = 0
10e60 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 2d 3e  ;.  int rc = p->
10e70 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 52 65 74  rc;.  char *zRet
10e80 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 72 63 3d   = 0;..  if( rc=
10e90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
10ea0 20 20 72 63 20 3d 20 70 72 65 70 61 72 65 41 6e    rc = prepareAn
10eb0 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d  dCollectError(p-
10ec0 3e 64 62 4d 61 69 6e 2c 20 26 70 53 74 6d 74 2c  >dbMain, &pStmt,
10ed0 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 0a 20 20   &p->zErrmsg,.  
10ee0 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 74 72        "SELECT tr
10ef0 69 6d 28 73 71 6c 29 20 46 52 4f 4d 20 73 71 6c  im(sql) FROM sql
10f00 69 74 65 5f 6d 61 73 74 65 72 20 57 48 45 52 45  ite_master WHERE
10f10 20 74 79 70 65 3d 27 69 6e 64 65 78 27 20 41 4e   type='index' AN
10f20 44 20 6e 61 6d 65 3d 3f 22 0a 20 20 20 20 29 3b  D name=?".    );
10f30 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
10f40 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
10f50 69 6e 74 20 72 63 32 3b 0a 20 20 20 20 72 63 20  int rc2;.    rc 
10f60 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74  = sqlite3_bind_t
10f70 65 78 74 28 70 53 74 6d 74 2c 20 31 2c 20 70 49  ext(pStmt, 1, pI
10f80 74 65 72 2d 3e 7a 49 64 78 2c 20 2d 31 2c 20 53  ter->zIdx, -1, S
10f90 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
10fa0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
10fb0 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52  E_OK && SQLITE_R
10fc0 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
10fd0 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20  (pStmt) ){.     
10fe0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71   const char *zSq
10ff0 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  l = (const char*
11000 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
11010 74 65 78 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a  text(pStmt, 0);.
11020 20 20 20 20 20 20 69 66 28 20 7a 53 71 6c 20 29        if( zSql )
11030 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 50  {.        int nP
11040 61 72 65 6e 20 3d 20 30 3b 20 20 20 20 20 20 20  aren = 0;       
11050 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
11060 20 6f 70 65 6e 20 70 61 72 65 6e 74 68 65 73 69   open parenthesi
11070 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  s */.        int
11080 20 69 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   i;.        for(
11090 69 3d 30 3b 20 7a 53 71 6c 5b 69 5d 3b 20 69 2b  i=0; zSql[i]; i+
110a0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 68  +){.          ch
110b0 61 72 20 63 20 3d 20 7a 53 71 6c 5b 69 5d 3b 0a  ar c = zSql[i];.
110c0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63 3d            if( c=
110d0 3d 27 28 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='(' ){.        
110e0 20 20 20 20 6e 50 61 72 65 6e 2b 2b 3b 0a 20 20      nParen++;.  
110f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
11100 20 20 20 20 65 6c 73 65 20 69 66 28 20 63 3d 3d      else if( c==
11110 27 29 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ')' ){.         
11120 20 20 20 6e 50 61 72 65 6e 2d 2d 3b 0a 20 20 20     nParen--;.   
11130 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 50 61           if( nPa
11140 72 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ren==0 ){.      
11150 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20          i++;.   
11160 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
11170 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
11180 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20            }else 
11190 69 66 28 20 63 3d 3d 27 22 27 20 7c 7c 20 63 3d  if( c=='"' || c=
111a0 3d 27 5c 27 27 20 7c 7c 20 63 3d 3d 27 60 27 20  ='\'' || c=='`' 
111b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  ){.            f
111c0 6f 72 28 69 2b 2b 3b 20 31 3b 20 69 2b 2b 29 7b  or(i++; 1; i++){
111d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
111e0 66 28 20 7a 53 71 6c 5b 69 5d 3d 3d 63 20 29 7b  f( zSql[i]==c ){
111f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11200 20 69 66 28 20 7a 53 71 6c 5b 69 2b 31 5d 21 3d   if( zSql[i+1]!=
11210 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  c ) break;.     
11220 20 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a             i++;.
11230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
11240 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
11250 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
11260 28 20 63 3d 3d 27 5b 27 20 29 7b 0a 20 20 20 20  ( c=='[' ){.    
11270 20 20 20 20 20 20 20 20 66 6f 72 28 69 2b 2b 3b          for(i++;
11280 20 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20   1; i++){.      
11290 20 20 20 20 20 20 20 20 69 66 28 20 7a 53 71 6c          if( zSql
112a0 5b 69 5d 3d 3d 27 5d 27 20 29 20 62 72 65 61 6b  [i]==']' ) break
112b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
112c0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
112d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
112e0 28 20 7a 53 71 6c 5b 69 5d 20 29 7b 0a 20 20 20  ( zSql[i] ){.   
112f0 20 20 20 20 20 20 20 7a 52 65 74 20 3d 20 72 62         zRet = rb
11300 75 53 74 72 6e 64 75 70 28 26 7a 53 71 6c 5b 69  uStrndup(&zSql[i
11310 5d 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20  ], &rc);.       
11320 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
11330 0a 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69  ..    rc2 = sqli
11340 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
11350 6d 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  mt);.    if( rc=
11360 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20  =SQLITE_OK ) rc 
11370 3d 20 72 63 32 3b 0a 20 20 7d 0a 0a 20 20 70 2d  = rc2;.  }..  p-
11380 3e 72 63 20 3d 20 72 63 3b 0a 20 20 72 65 74 75  >rc = rc;.  retu
11390 72 6e 20 7a 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn zRet;.}../*.*
113a0 2a 20 45 6e 73 75 72 65 20 74 68 61 74 20 74 68  * Ensure that th
113b0 65 20 53 51 4c 69 74 65 20 73 74 61 74 65 6d 65  e SQLite stateme
113c0 6e 74 20 68 61 6e 64 6c 65 73 20 72 65 71 75 69  nt handles requi
113d0 72 65 64 20 74 6f 20 75 70 64 61 74 65 20 74 68  red to update th
113e0 65 20 0a 2a 2a 20 74 61 72 67 65 74 20 64 61 74  e .** target dat
113f0 61 62 61 73 65 20 6f 62 6a 65 63 74 20 63 75 72  abase object cur
11400 72 65 6e 74 6c 79 20 69 6e 64 69 63 61 74 65 64  rently indicated
11410 20 62 79 20 74 68 65 20 69 74 65 72 61 74 6f 72   by the iterator
11420 20 70 61 73 73 65 64 20 0a 2a 2a 20 61 73 20 74   passed .** as t
11430 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
11440 6e 74 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65  nt are available
11450 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
11460 72 62 75 4f 62 6a 49 74 65 72 50 72 65 70 61 72  rbuObjIterPrepar
11470 65 41 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33 72  eAll(.  sqlite3r
11480 62 75 20 2a 70 2c 20 0a 20 20 52 62 75 4f 62 6a  bu *p, .  RbuObj
11490 49 74 65 72 20 2a 70 49 74 65 72 2c 0a 20 20 69  Iter *pIter,.  i
114a0 6e 74 20 6e 4f 66 66 73 65 74 20 20 20 20 20 20  nt nOffset      
114b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
114c0 2a 20 41 64 64 20 22 4c 49 4d 49 54 20 2d 31 20  * Add "LIMIT -1 
114d0 4f 46 46 53 45 54 20 24 6e 4f 66 66 73 65 74 22  OFFSET $nOffset"
114e0 20 74 6f 20 53 45 4c 45 43 54 20 2a 2f 0a 29 7b   to SELECT */.){
114f0 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72  .  assert( pIter
11500 2d 3e 62 43 6c 65 61 6e 75 70 3d 3d 30 20 29 3b  ->bCleanup==0 );
11510 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 53  .  if( pIter->pS
11520 65 6c 65 63 74 3d 3d 30 20 26 26 20 72 62 75 4f  elect==0 && rbuO
11530 62 6a 49 74 65 72 43 61 63 68 65 54 61 62 6c 65  bjIterCacheTable
11540 49 6e 66 6f 28 70 2c 20 70 49 74 65 72 29 3d 3d  Info(p, pIter)==
11550 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
11560 20 63 6f 6e 73 74 20 69 6e 74 20 74 6e 75 6d 20   const int tnum 
11570 3d 20 70 49 74 65 72 2d 3e 69 54 6e 75 6d 3b 0a  = pIter->iTnum;.
11580 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 69      char *zColli
11590 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  st = 0;         
115a0 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 69 6e 64    /* List of ind
115b0 65 78 65 64 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  exed columns */.
115c0 20 20 20 20 63 68 61 72 20 2a 2a 70 7a 20 3d 20      char **pz = 
115d0 26 70 2d 3e 7a 45 72 72 6d 73 67 3b 0a 20 20 20  &p->zErrmsg;.   
115e0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64   const char *zId
115f0 78 20 3d 20 70 49 74 65 72 2d 3e 7a 49 64 78 3b  x = pIter->zIdx;
11600 0a 20 20 20 20 63 68 61 72 20 2a 7a 4c 69 6d 69  .    char *zLimi
11610 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20  t = 0;..    if( 
11620 6e 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20  nOffset ){.     
11630 20 7a 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65   zLimit = sqlite
11640 33 5f 6d 70 72 69 6e 74 66 28 22 20 4c 49 4d 49  3_mprintf(" LIMI
11650 54 20 2d 31 20 4f 46 46 53 45 54 20 25 64 22 2c  T -1 OFFSET %d",
11660 20 6e 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20   nOffset);.     
11670 20 69 66 28 20 21 7a 4c 69 6d 69 74 20 29 20 70   if( !zLimit ) p
11680 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ->rc = SQLITE_NO
11690 4d 45 4d 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  MEM;.    }..    
116a0 69 66 28 20 7a 49 64 78 20 29 7b 0a 20 20 20 20  if( zIdx ){.    
116b0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
116c0 62 6c 20 3d 20 70 49 74 65 72 2d 3e 7a 54 62 6c  bl = pIter->zTbl
116d0 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 49  ;.      char *zI
116e0 6d 70 6f 73 74 65 72 43 6f 6c 73 20 3d 20 30 3b  mposterCols = 0;
116f0 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 66      /* Columns f
11700 6f 72 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c  or imposter tabl
11710 65 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20  e */.      char 
11720 2a 7a 49 6d 70 6f 73 74 65 72 50 4b 20 3d 20 30  *zImposterPK = 0
11730 3b 20 20 20 20 20 20 2f 2a 20 50 72 69 6d 61 72  ;      /* Primar
11740 79 20 6b 65 79 20 64 65 63 6c 61 72 61 74 69 6f  y key declaratio
11750 6e 20 66 6f 72 20 69 6d 70 6f 73 74 65 72 20 2a  n for imposter *
11760 2f 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 57  /.      char *zW
11770 68 65 72 65 20 3d 20 30 3b 20 20 20 20 20 20 20  here = 0;       
11780 20 20 20 20 2f 2a 20 57 48 45 52 45 20 63 6c 61      /* WHERE cla
11790 75 73 65 20 6f 6e 20 50 4b 20 63 6f 6c 75 6d 6e  use on PK column
117a0 73 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20  s */.      char 
117b0 2a 7a 42 69 6e 64 20 3d 20 30 3b 0a 20 20 20 20  *zBind = 0;.    
117c0 20 20 63 68 61 72 20 2a 7a 50 61 72 74 20 3d 20    char *zPart = 
117d0 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 69  0;.      int nBi
117e0 6e 64 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 61  nd = 0;..      a
117f0 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 65 54  ssert( pIter->eT
11800 79 70 65 21 3d 52 42 55 5f 50 4b 5f 56 54 41 42  ype!=RBU_PK_VTAB
11810 20 29 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 69   );.      zColli
11820 73 74 20 3d 20 72 62 75 4f 62 6a 49 74 65 72 47  st = rbuObjIterG
11830 65 74 49 6e 64 65 78 43 6f 6c 73 28 0a 20 20 20  etIndexCols(.   
11840 20 20 20 20 20 20 20 70 2c 20 70 49 74 65 72 2c         p, pIter,
11850 20 26 7a 49 6d 70 6f 73 74 65 72 43 6f 6c 73 2c   &zImposterCols,
11860 20 26 7a 49 6d 70 6f 73 74 65 72 50 4b 2c 20 26   &zImposterPK, &
11870 7a 57 68 65 72 65 2c 20 26 6e 42 69 6e 64 0a 20  zWhere, &nBind. 
11880 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7a 42       );.      zB
11890 69 6e 64 20 3d 20 72 62 75 4f 62 6a 49 74 65 72  ind = rbuObjIter
118a0 47 65 74 42 69 6e 64 6c 69 73 74 28 70 2c 20 6e  GetBindlist(p, n
118b0 42 69 6e 64 29 3b 0a 20 20 20 20 20 20 7a 50 61  Bind);.      zPa
118c0 72 74 20 3d 20 72 62 75 4f 62 6a 49 74 65 72 47  rt = rbuObjIterG
118d0 65 74 49 6e 64 65 78 57 68 65 72 65 28 70 2c 20  etIndexWhere(p, 
118e0 70 49 74 65 72 29 3b 0a 0a 20 20 20 20 20 20 2f  pIter);..      /
118f0 2a 20 43 72 65 61 74 65 20 74 68 65 20 69 6d 70  * Create the imp
11900 6f 73 74 65 72 20 74 61 62 6c 65 20 75 73 65 64  oster table used
11910 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 69   to write to thi
11920 73 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20 20 20  s index. */.    
11930 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
11940 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
11950 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52 2c  STCTRL_IMPOSTER,
11960 20 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 6d 61 69   p->dbMain, "mai
11970 6e 22 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20 20  n", 0, 1);.     
11980 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
11990 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
119a0 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52 2c 20  TCTRL_IMPOSTER, 
119b0 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 6d 61 69 6e  p->dbMain, "main
119c0 22 2c 20 31 2c 74 6e 75 6d 29 3b 0a 20 20 20 20  ", 1,tnum);.    
119d0 20 20 72 62 75 4d 50 72 69 6e 74 66 45 78 65 63    rbuMPrintfExec
119e0 28 70 2c 20 70 2d 3e 64 62 4d 61 69 6e 2c 0a 20  (p, p->dbMain,. 
119f0 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45           "CREATE
11a00 20 54 41 42 4c 45 20 5c 22 72 62 75 5f 69 6d 70   TABLE \"rbu_imp
11a10 5f 25 77 5c 22 28 20 25 73 2c 20 50 52 49 4d 41  _%w\"( %s, PRIMA
11a20 52 59 20 4b 45 59 28 20 25 73 20 29 20 29 20 57  RY KEY( %s ) ) W
11a30 49 54 48 4f 55 54 20 52 4f 57 49 44 22 2c 0a 20  ITHOUT ROWID",. 
11a40 20 20 20 20 20 20 20 20 20 7a 54 62 6c 2c 20 7a           zTbl, z
11a50 49 6d 70 6f 73 74 65 72 43 6f 6c 73 2c 20 7a 49  ImposterCols, zI
11a60 6d 70 6f 73 74 65 72 50 4b 0a 20 20 20 20 20 20  mposterPK.      
11a70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
11a80 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
11a90 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d  LITE_TESTCTRL_IM
11aa0 50 4f 53 54 45 52 2c 20 70 2d 3e 64 62 4d 61 69  POSTER, p->dbMai
11ab0 6e 2c 20 22 6d 61 69 6e 22 2c 20 30 2c 20 30 29  n, "main", 0, 0)
11ac0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 72 65 61  ;..      /* Crea
11ad0 74 65 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  te the statement
11ae0 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 64 65 78   to insert index
11af0 20 65 6e 74 72 69 65 73 20 2a 2f 0a 20 20 20 20   entries */.    
11b00 20 20 70 49 74 65 72 2d 3e 6e 43 6f 6c 20 3d 20    pIter->nCol = 
11b10 6e 42 69 6e 64 3b 0a 20 20 20 20 20 20 69 66 28  nBind;.      if(
11b20 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
11b30 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  K ){.        p->
11b40 72 63 20 3d 20 70 72 65 70 61 72 65 46 72 65 65  rc = prepareFree
11b50 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28  AndCollectError(
11b60 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  .            p->
11b70 64 62 4d 61 69 6e 2c 20 26 70 49 74 65 72 2d 3e  dbMain, &pIter->
11b80 70 49 6e 73 65 72 74 2c 20 26 70 2d 3e 7a 45 72  pInsert, &p->zEr
11b90 72 6d 73 67 2c 0a 20 20 20 20 20 20 20 20 20 20  rmsg,.          
11ba0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
11bb0 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 5c 22 72  "INSERT INTO \"r
11bc0 62 75 5f 69 6d 70 5f 25 77 5c 22 20 56 41 4c 55  bu_imp_%w\" VALU
11bd0 45 53 28 25 73 29 22 2c 20 7a 54 62 6c 2c 20 7a  ES(%s)", zTbl, z
11be0 42 69 6e 64 29 0a 20 20 20 20 20 20 20 20 29 3b  Bind).        );
11bf0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
11c00 2f 2a 20 41 6e 64 20 74 6f 20 64 65 6c 65 74 65  /* And to delete
11c10 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20 2a   index entries *
11c20 2f 0a 20 20 20 20 20 20 69 66 28 20 72 62 75 49  /.      if( rbuI
11c30 73 56 61 63 75 75 6d 28 70 29 3d 3d 30 20 26 26  sVacuum(p)==0 &&
11c40 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
11c50 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  K ){.        p->
11c60 72 63 20 3d 20 70 72 65 70 61 72 65 46 72 65 65  rc = prepareFree
11c70 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28  AndCollectError(
11c80 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  .            p->
11c90 64 62 4d 61 69 6e 2c 20 26 70 49 74 65 72 2d 3e  dbMain, &pIter->
11ca0 70 44 65 6c 65 74 65 2c 20 26 70 2d 3e 7a 45 72  pDelete, &p->zEr
11cb0 72 6d 73 67 2c 0a 20 20 20 20 20 20 20 20 20 20  rmsg,.          
11cc0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
11cd0 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 5c 22 72  "DELETE FROM \"r
11ce0 62 75 5f 69 6d 70 5f 25 77 5c 22 20 57 48 45 52  bu_imp_%w\" WHER
11cf0 45 20 25 73 22 2c 20 7a 54 62 6c 2c 20 7a 57 68  E %s", zTbl, zWh
11d00 65 72 65 29 0a 20 20 20 20 20 20 20 20 29 3b 0a  ere).        );.
11d10 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
11d20 2a 20 43 72 65 61 74 65 20 74 68 65 20 53 45 4c  * Create the SEL
11d30 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 6f  ECT statement to
11d40 20 72 65 61 64 20 6b 65 79 73 20 69 6e 20 73 6f   read keys in so
11d50 72 74 65 64 20 6f 72 64 65 72 20 2a 2f 0a 20 20  rted order */.  
11d60 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
11d70 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
11d80 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a      char *zSql;.
11d90 20 20 20 20 20 20 20 20 69 66 28 20 72 62 75 49          if( rbuI
11da0 73 56 61 63 75 75 6d 28 70 29 20 29 7b 0a 20 20  sVacuum(p) ){.  
11db0 20 20 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73          zSql = s
11dc0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a  qlite3_mprintf(.
11dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 53                "S
11de0 45 4c 45 43 54 20 25 73 2c 20 30 20 41 53 20 72  ELECT %s, 0 AS r
11df0 62 75 5f 63 6f 6e 74 72 6f 6c 20 46 52 4f 4d 20  bu_control FROM 
11e00 27 25 71 27 20 25 73 20 4f 52 44 45 52 20 42 59  '%q' %s ORDER BY
11e10 20 25 73 25 73 22 2c 0a 20 20 20 20 20 20 20 20   %s%s",.        
11e20 20 20 20 20 20 20 7a 43 6f 6c 6c 69 73 74 2c 20        zCollist, 
11e30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
11e40 49 74 65 72 2d 3e 7a 44 61 74 61 54 62 6c 2c 0a  Iter->zDataTbl,.
11e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 50                zP
11e60 61 72 74 2c 20 7a 43 6f 6c 6c 69 73 74 2c 20 7a  art, zCollist, z
11e70 4c 69 6d 69 74 0a 20 20 20 20 20 20 20 20 20 20  Limit.          
11e80 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
11e90 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  ..        if( pI
11ea0 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f  ter->eType==RBU_
11eb0 50 4b 5f 45 58 54 45 52 4e 41 4c 20 7c 7c 20 70  PK_EXTERNAL || p
11ec0 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55  Iter->eType==RBU
11ed0 5f 50 4b 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  _PK_NONE ){.    
11ee0 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c        zSql = sql
11ef0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20  ite3_mprintf(.  
11f00 20 20 20 20 20 20 20 20 20 20 20 20 22 53 45 4c              "SEL
11f10 45 43 54 20 25 73 2c 20 72 62 75 5f 63 6f 6e 74  ECT %s, rbu_cont
11f20 72 6f 6c 20 46 52 4f 4d 20 25 73 2e 27 72 62 75  rol FROM %s.'rbu
11f30 5f 74 6d 70 5f 25 71 27 20 25 73 20 4f 52 44 45  _tmp_%q' %s ORDE
11f40 52 20 42 59 20 25 73 25 73 22 2c 0a 20 20 20 20  R BY %s%s",.    
11f50 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 6c 69            zColli
11f60 73 74 2c 20 70 2d 3e 7a 53 74 61 74 65 44 62 2c  st, p->zStateDb,
11f70 20 70 49 74 65 72 2d 3e 7a 44 61 74 61 54 62 6c   pIter->zDataTbl
11f80 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
11f90 7a 50 61 72 74 2c 20 7a 43 6f 6c 6c 69 73 74 2c  zPart, zCollist,
11fa0 20 7a 4c 69 6d 69 74 0a 20 20 20 20 20 20 20 20   zLimit.        
11fb0 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c    );.        }el
11fc0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 53  se{.          zS
11fd0 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ql = sqlite3_mpr
11fe0 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20  intf(.          
11ff0 20 20 20 20 22 53 45 4c 45 43 54 20 25 73 2c 20      "SELECT %s, 
12000 72 62 75 5f 63 6f 6e 74 72 6f 6c 20 46 52 4f 4d  rbu_control FROM
12010 20 25 73 2e 27 72 62 75 5f 74 6d 70 5f 25 71 27   %s.'rbu_tmp_%q'
12020 20 25 73 20 22 0a 20 20 20 20 20 20 20 20 20 20   %s ".          
12030 20 20 20 20 22 55 4e 49 4f 4e 20 41 4c 4c 20 22      "UNION ALL "
12040 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
12050 53 45 4c 45 43 54 20 25 73 2c 20 72 62 75 5f 63  SELECT %s, rbu_c
12060 6f 6e 74 72 6f 6c 20 46 52 4f 4d 20 27 25 71 27  ontrol FROM '%q'
12070 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ".             
12080 20 22 25 73 20 25 73 20 74 79 70 65 6f 66 28 72   "%s %s typeof(r
12090 62 75 5f 63 6f 6e 74 72 6f 6c 29 3d 27 69 6e 74  bu_control)='int
120a0 65 67 65 72 27 20 41 4e 44 20 72 62 75 5f 63 6f  eger' AND rbu_co
120b0 6e 74 72 6f 6c 21 3d 31 20 22 0a 20 20 20 20 20  ntrol!=1 ".     
120c0 20 20 20 20 20 20 20 20 20 22 4f 52 44 45 52 20           "ORDER 
120d0 42 59 20 25 73 25 73 22 2c 0a 20 20 20 20 20 20  BY %s%s",.      
120e0 20 20 20 20 20 20 20 20 7a 43 6f 6c 6c 69 73 74          zCollist
120f0 2c 20 70 2d 3e 7a 53 74 61 74 65 44 62 2c 20 70  , p->zStateDb, p
12100 49 74 65 72 2d 3e 7a 44 61 74 61 54 62 6c 2c 20  Iter->zDataTbl, 
12110 7a 50 61 72 74 2c 0a 20 20 20 20 20 20 20 20 20  zPart,.         
12120 20 20 20 20 20 7a 43 6f 6c 6c 69 73 74 2c 20 70       zCollist, p
12130 49 74 65 72 2d 3e 7a 44 61 74 61 54 62 6c 2c 20  Iter->zDataTbl, 
12140 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  .              z
12150 50 61 72 74 2c 0a 20 20 20 20 20 20 20 20 20 20  Part,.          
12160 20 20 20 20 28 7a 50 61 72 74 20 3f 20 22 41 4e      (zPart ? "AN
12170 44 22 20 3a 20 22 57 48 45 52 45 22 29 2c 0a 20  D" : "WHERE"),. 
12180 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f               zCo
12190 6c 6c 69 73 74 2c 20 7a 4c 69 6d 69 74 0a 20 20  llist, zLimit.  
121a0 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
121b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 2d 3e     }.        p->
121c0 72 63 20 3d 20 70 72 65 70 61 72 65 46 72 65 65  rc = prepareFree
121d0 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28  AndCollectError(
121e0 70 2d 3e 64 62 52 62 75 2c 20 26 70 49 74 65 72  p->dbRbu, &pIter
121f0 2d 3e 70 53 65 6c 65 63 74 2c 20 70 7a 2c 20 7a  ->pSelect, pz, z
12200 53 71 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  Sql);.      }.. 
12210 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
12220 65 28 7a 49 6d 70 6f 73 74 65 72 43 6f 6c 73 29  e(zImposterCols)
12230 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
12240 66 72 65 65 28 7a 49 6d 70 6f 73 74 65 72 50 4b  free(zImposterPK
12250 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
12260 5f 66 72 65 65 28 7a 57 68 65 72 65 29 3b 0a 20  _free(zWhere);. 
12270 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
12280 65 28 7a 42 69 6e 64 29 3b 0a 20 20 20 20 20 20  e(zBind);.      
12290 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61  sqlite3_free(zPa
122a0 72 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  rt);.    }else{.
122b0 20 20 20 20 20 20 69 6e 74 20 62 52 62 75 52 6f        int bRbuRo
122c0 77 69 64 20 3d 20 28 70 49 74 65 72 2d 3e 65 54  wid = (pIter->eT
122d0 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 56 54 41 42  ype==RBU_PK_VTAB
122e0 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
122f0 20 20 20 20 20 20 7c 7c 28 70 49 74 65 72 2d 3e        ||(pIter->
12300 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 4e 4f  eType==RBU_PK_NO
12310 4e 45 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  NE).            
12320 20 20 20 20 20 20 20 20 7c 7c 28 70 49 74 65 72          ||(pIter
12330 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f  ->eType==RBU_PK_
12340 45 58 54 45 52 4e 41 4c 20 26 26 20 72 62 75 49  EXTERNAL && rbuI
12350 73 56 61 63 75 75 6d 28 70 29 29 3b 0a 20 20 20  sVacuum(p));.   
12360 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
12370 54 62 6c 20 3d 20 70 49 74 65 72 2d 3e 7a 54 62  Tbl = pIter->zTb
12380 6c 3b 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c  l;       /* Tabl
12390 65 20 74 68 69 73 20 73 74 65 70 20 61 70 70 6c  e this step appl
123a0 69 65 73 20 74 6f 20 2a 2f 0a 20 20 20 20 20 20  ies to */.      
123b0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 57 72 69  const char *zWri
123c0 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
123d0 20 20 20 20 20 20 2f 2a 20 49 6d 70 6f 73 74 65        /* Imposte
123e0 72 20 74 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a  r table name */.
123f0 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 42 69  .      char *zBi
12400 6e 64 69 6e 67 73 20 3d 20 72 62 75 4f 62 6a 49  ndings = rbuObjI
12410 74 65 72 47 65 74 42 69 6e 64 6c 69 73 74 28 70  terGetBindlist(p
12420 2c 20 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c  , pIter->nTblCol
12430 20 2b 20 62 52 62 75 52 6f 77 69 64 29 3b 0a 20   + bRbuRowid);. 
12440 20 20 20 20 20 63 68 61 72 20 2a 7a 57 68 65 72       char *zWher
12450 65 20 3d 20 72 62 75 4f 62 6a 49 74 65 72 47 65  e = rbuObjIterGe
12460 74 57 68 65 72 65 28 70 2c 20 70 49 74 65 72 29  tWhere(p, pIter)
12470 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4f  ;.      char *zO
12480 6c 64 6c 69 73 74 20 3d 20 72 62 75 4f 62 6a 49  ldlist = rbuObjI
12490 74 65 72 47 65 74 4f 6c 64 6c 69 73 74 28 70 2c  terGetOldlist(p,
124a0 20 70 49 74 65 72 2c 20 22 6f 6c 64 22 29 3b 0a   pIter, "old");.
124b0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 65 77        char *zNew
124c0 6c 69 73 74 20 3d 20 72 62 75 4f 62 6a 49 74 65  list = rbuObjIte
124d0 72 47 65 74 4f 6c 64 6c 69 73 74 28 70 2c 20 70  rGetOldlist(p, p
124e0 49 74 65 72 2c 20 22 6e 65 77 22 29 3b 0a 0a 20  Iter, "new");.. 
124f0 20 20 20 20 20 7a 43 6f 6c 6c 69 73 74 20 3d 20       zCollist = 
12500 72 62 75 4f 62 6a 49 74 65 72 47 65 74 43 6f 6c  rbuObjIterGetCol
12510 6c 69 73 74 28 70 2c 20 70 49 74 65 72 29 3b 0a  list(p, pIter);.
12520 20 20 20 20 20 20 70 49 74 65 72 2d 3e 6e 43 6f        pIter->nCo
12530 6c 20 3d 20 70 49 74 65 72 2d 3e 6e 54 62 6c 43  l = pIter->nTblC
12540 6f 6c 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 72  ol;..      /* Cr
12550 65 61 74 65 20 74 68 65 20 69 6d 70 6f 73 74 65  eate the imposte
12560 72 20 74 61 62 6c 65 20 6f 72 20 74 61 62 6c 65  r table or table
12570 73 20 28 69 66 20 72 65 71 75 69 72 65 64 29 2e  s (if required).
12580 20 2a 2f 0a 20 20 20 20 20 20 72 62 75 43 72 65   */.      rbuCre
12590 61 74 65 49 6d 70 6f 73 74 65 72 54 61 62 6c 65  ateImposterTable
125a0 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  (p, pIter);.    
125b0 20 20 72 62 75 43 72 65 61 74 65 49 6d 70 6f 73    rbuCreateImpos
125c0 74 65 72 54 61 62 6c 65 32 28 70 2c 20 70 49 74  terTable2(p, pIt
125d0 65 72 29 3b 0a 20 20 20 20 20 20 7a 57 72 69 74  er);.      zWrit
125e0 65 20 3d 20 28 70 49 74 65 72 2d 3e 65 54 79 70  e = (pIter->eTyp
125f0 65 3d 3d 52 42 55 5f 50 4b 5f 56 54 41 42 20 3f  e==RBU_PK_VTAB ?
12600 20 22 22 20 3a 20 22 72 62 75 5f 69 6d 70 5f 22   "" : "rbu_imp_"
12610 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 72 65  );..      /* Cre
12620 61 74 65 20 74 68 65 20 49 4e 53 45 52 54 20 73  ate the INSERT s
12630 74 61 74 65 6d 65 6e 74 20 74 6f 20 77 72 69 74  tatement to writ
12640 65 20 74 6f 20 74 68 65 20 74 61 72 67 65 74 20  e to the target 
12650 50 4b 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 20  PK b-tree */.   
12660 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
12670 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
12680 20 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61     p->rc = prepa
12690 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74  reFreeAndCollect
126a0 45 72 72 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c  Error(p->dbMain,
126b0 20 26 70 49 74 65 72 2d 3e 70 49 6e 73 65 72 74   &pIter->pInsert
126c0 2c 20 70 7a 2c 0a 20 20 20 20 20 20 20 20 20 20  , pz,.          
126d0 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74    sqlite3_mprint
126e0 66 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  f(.             
126f0 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 5c 22   "INSERT INTO \"
12700 25 73 25 77 5c 22 28 25 73 25 73 29 20 56 41 4c  %s%w\"(%s%s) VAL
12710 55 45 53 28 25 73 29 22 2c 20 0a 20 20 20 20 20  UES(%s)", .     
12720 20 20 20 20 20 20 20 20 20 7a 57 72 69 74 65 2c           zWrite,
12730 20 7a 54 62 6c 2c 20 7a 43 6f 6c 6c 69 73 74 2c   zTbl, zCollist,
12740 20 28 62 52 62 75 52 6f 77 69 64 20 3f 20 22 2c   (bRbuRowid ? ",
12750 20 5f 72 6f 77 69 64 5f 22 20 3a 20 22 22 29 2c   _rowid_" : ""),
12760 20 7a 42 69 6e 64 69 6e 67 73 0a 20 20 20 20 20   zBindings.     
12770 20 20 20 20 20 20 20 29 0a 20 20 20 20 20 20 20         ).       
12780 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20   );.      }..   
12790 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65     /* Create the
127a0 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e   DELETE statemen
127b0 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68  t to write to th
127c0 65 20 74 61 72 67 65 74 20 50 4b 20 62 2d 74 72  e target PK b-tr
127d0 65 65 2e 0a 20 20 20 20 20 20 2a 2a 20 42 65 63  ee..      ** Bec
127e0 61 75 73 65 20 69 74 20 6f 6e 6c 79 20 70 65 72  ause it only per
127f0 66 6f 72 6d 73 20 49 4e 53 45 52 54 20 6f 70 65  forms INSERT ope
12800 72 61 74 69 6f 6e 73 2c 20 74 68 69 73 20 69 73  rations, this is
12810 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20 66 6f   not required fo
12820 72 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20 72 62  r.      ** an rb
12830 75 20 76 61 63 75 75 6d 20 68 61 6e 64 6c 65 2e  u vacuum handle.
12840 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 72    */.      if( r
12850 62 75 49 73 56 61 63 75 75 6d 28 70 29 3d 3d 30  buIsVacuum(p)==0
12860 20 26 26 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54   && p->rc==SQLIT
12870 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
12880 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65 46  p->rc = prepareF
12890 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72  reeAndCollectErr
128a0 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 70  or(p->dbMain, &p
128b0 49 74 65 72 2d 3e 70 44 65 6c 65 74 65 2c 20 70  Iter->pDelete, p
128c0 7a 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  z,.            s
128d0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a  qlite3_mprintf(.
128e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 44                "D
128f0 45 4c 45 54 45 20 46 52 4f 4d 20 5c 22 25 73 25  ELETE FROM \"%s%
12900 77 5c 22 20 57 48 45 52 45 20 25 73 22 2c 20 7a  w\" WHERE %s", z
12910 57 72 69 74 65 2c 20 7a 54 62 6c 2c 20 7a 57 68  Write, zTbl, zWh
12920 65 72 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  ere.            
12930 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  ).        );.   
12940 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
12950 72 62 75 49 73 56 61 63 75 75 6d 28 70 29 3d 3d  rbuIsVacuum(p)==
12960 30 20 26 26 20 70 49 74 65 72 2d 3e 61 62 49 6e  0 && pIter->abIn
12970 64 65 78 65 64 20 29 7b 0a 20 20 20 20 20 20 20  dexed ){.       
12980 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 62   const char *zRb
12990 75 52 6f 77 69 64 20 3d 20 22 22 3b 0a 20 20 20  uRowid = "";.   
129a0 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e       if( pIter->
129b0 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 45 58  eType==RBU_PK_EX
129c0 54 45 52 4e 41 4c 20 7c 7c 20 70 49 74 65 72 2d  TERNAL || pIter-
129d0 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 4e  >eType==RBU_PK_N
129e0 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ONE ){.         
129f0 20 7a 52 62 75 52 6f 77 69 64 20 3d 20 22 2c 20   zRbuRowid = ", 
12a00 72 62 75 5f 72 6f 77 69 64 22 3b 0a 20 20 20 20  rbu_rowid";.    
12a10 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
12a20 2a 20 43 72 65 61 74 65 20 74 68 65 20 72 62 75  * Create the rbu
12a30 5f 74 6d 70 5f 78 78 78 20 74 61 62 6c 65 20 61  _tmp_xxx table a
12a40 6e 64 20 74 68 65 20 74 72 69 67 67 65 72 73 20  nd the triggers 
12a50 74 6f 20 70 6f 70 75 6c 61 74 65 20 69 74 2e 20  to populate it. 
12a60 2a 2f 0a 20 20 20 20 20 20 20 20 72 62 75 4d 50  */.        rbuMP
12a70 72 69 6e 74 66 45 78 65 63 28 70 2c 20 70 2d 3e  rintfExec(p, p->
12a80 64 62 52 62 75 2c 0a 20 20 20 20 20 20 20 20 20  dbRbu,.         
12a90 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45     "CREATE TABLE
12aa0 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20 25   IF NOT EXISTS %
12ab0 73 2e 27 72 62 75 5f 74 6d 70 5f 25 71 27 20 41  s.'rbu_tmp_%q' A
12ac0 53 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  S ".            
12ad0 22 53 45 4c 45 43 54 20 2a 25 73 20 46 52 4f 4d  "SELECT *%s FROM
12ae0 20 27 25 71 27 20 57 48 45 52 45 20 30 3b 22 0a   '%q' WHERE 0;".
12af0 20 20 20 20 20 20 20 20 20 20 20 20 2c 20 70 2d              , p-
12b00 3e 7a 53 74 61 74 65 44 62 2c 20 70 49 74 65 72  >zStateDb, pIter
12b10 2d 3e 7a 44 61 74 61 54 62 6c 0a 20 20 20 20 20  ->zDataTbl.     
12b20 20 20 20 20 20 20 20 2c 20 28 70 49 74 65 72 2d         , (pIter-
12b30 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 45  >eType==RBU_PK_E
12b40 58 54 45 52 4e 41 4c 20 3f 20 22 2c 20 30 20 41  XTERNAL ? ", 0 A
12b50 53 20 72 62 75 5f 72 6f 77 69 64 22 20 3a 20 22  S rbu_rowid" : "
12b60 22 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 2c  ").            ,
12b70 20 70 49 74 65 72 2d 3e 7a 44 61 74 61 54 62 6c   pIter->zDataTbl
12b80 0a 20 20 20 20 20 20 20 20 29 3b 0a 0a 20 20 20  .        );..   
12b90 20 20 20 20 20 72 62 75 4d 50 72 69 6e 74 66 45       rbuMPrintfE
12ba0 78 65 63 28 70 2c 20 70 2d 3e 64 62 4d 61 69 6e  xec(p, p->dbMain
12bb0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 43  ,.            "C
12bc0 52 45 41 54 45 20 54 45 4d 50 20 54 52 49 47 47  REATE TEMP TRIGG
12bd0 45 52 20 72 62 75 5f 64 65 6c 65 74 65 5f 74 72  ER rbu_delete_tr
12be0 20 42 45 46 4f 52 45 20 44 45 4c 45 54 45 20 4f   BEFORE DELETE O
12bf0 4e 20 5c 22 25 73 25 77 5c 22 20 22 0a 20 20 20  N \"%s%w\" ".   
12c00 20 20 20 20 20 20 20 20 20 22 42 45 47 49 4e 20           "BEGIN 
12c10 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 20  ".            " 
12c20 20 53 45 4c 45 43 54 20 72 62 75 5f 74 6d 70 5f   SELECT rbu_tmp_
12c30 69 6e 73 65 72 74 28 33 2c 20 25 73 29 3b 22 0a  insert(3, %s);".
12c40 20 20 20 20 20 20 20 20 20 20 20 20 22 45 4e 44              "END
12c50 3b 22 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20  ;"..            
12c60 22 43 52 45 41 54 45 20 54 45 4d 50 20 54 52 49  "CREATE TEMP TRI
12c70 47 47 45 52 20 72 62 75 5f 75 70 64 61 74 65 31  GGER rbu_update1
12c80 5f 74 72 20 42 45 46 4f 52 45 20 55 50 44 41 54  _tr BEFORE UPDAT
12c90 45 20 4f 4e 20 5c 22 25 73 25 77 5c 22 20 22 0a  E ON \"%s%w\" ".
12ca0 20 20 20 20 20 20 20 20 20 20 20 20 22 42 45 47              "BEG
12cb0 49 4e 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  IN ".           
12cc0 20 22 20 20 53 45 4c 45 43 54 20 72 62 75 5f 74   "  SELECT rbu_t
12cd0 6d 70 5f 69 6e 73 65 72 74 28 33 2c 20 25 73 29  mp_insert(3, %s)
12ce0 3b 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  ;".            "
12cf0 45 4e 44 3b 22 0a 0a 20 20 20 20 20 20 20 20 20  END;"..         
12d00 20 20 20 22 43 52 45 41 54 45 20 54 45 4d 50 20     "CREATE TEMP 
12d10 54 52 49 47 47 45 52 20 72 62 75 5f 75 70 64 61  TRIGGER rbu_upda
12d20 74 65 32 5f 74 72 20 41 46 54 45 52 20 55 50 44  te2_tr AFTER UPD
12d30 41 54 45 20 4f 4e 20 5c 22 25 73 25 77 5c 22 20  ATE ON \"%s%w\" 
12d40 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 42  ".            "B
12d50 45 47 49 4e 20 22 0a 20 20 20 20 20 20 20 20 20  EGIN ".         
12d60 20 20 20 22 20 20 53 45 4c 45 43 54 20 72 62 75     "  SELECT rbu
12d70 5f 74 6d 70 5f 69 6e 73 65 72 74 28 34 2c 20 25  _tmp_insert(4, %
12d80 73 29 3b 22 0a 20 20 20 20 20 20 20 20 20 20 20  s);".           
12d90 20 22 45 4e 44 3b 22 2c 0a 20 20 20 20 20 20 20   "END;",.       
12da0 20 20 20 20 20 7a 57 72 69 74 65 2c 20 7a 54 62       zWrite, zTb
12db0 6c 2c 20 7a 4f 6c 64 6c 69 73 74 2c 0a 20 20 20  l, zOldlist,.   
12dc0 20 20 20 20 20 20 20 20 20 7a 57 72 69 74 65 2c           zWrite,
12dd0 20 7a 54 62 6c 2c 20 7a 4f 6c 64 6c 69 73 74 2c   zTbl, zOldlist,
12de0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 57 72  .            zWr
12df0 69 74 65 2c 20 7a 54 62 6c 2c 20 7a 4e 65 77 6c  ite, zTbl, zNewl
12e00 69 73 74 0a 20 20 20 20 20 20 20 20 29 3b 0a 0a  ist.        );..
12e10 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65          if( pIte
12e20 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b  r->eType==RBU_PK
12e30 5f 45 58 54 45 52 4e 41 4c 20 7c 7c 20 70 49 74  _EXTERNAL || pIt
12e40 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50  er->eType==RBU_P
12e50 4b 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  K_NONE ){.      
12e60 20 20 20 20 72 62 75 4d 50 72 69 6e 74 66 45 78      rbuMPrintfEx
12e70 65 63 28 70 2c 20 70 2d 3e 64 62 4d 61 69 6e 2c  ec(p, p->dbMain,
12e80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
12e90 43 52 45 41 54 45 20 54 45 4d 50 20 54 52 49 47  CREATE TEMP TRIG
12ea0 47 45 52 20 72 62 75 5f 69 6e 73 65 72 74 5f 74  GER rbu_insert_t
12eb0 72 20 41 46 54 45 52 20 49 4e 53 45 52 54 20 4f  r AFTER INSERT O
12ec0 4e 20 5c 22 25 73 25 77 5c 22 20 22 0a 20 20 20  N \"%s%w\" ".   
12ed0 20 20 20 20 20 20 20 20 20 20 20 22 42 45 47 49             "BEGI
12ee0 4e 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  N ".            
12ef0 20 20 22 20 20 53 45 4c 45 43 54 20 72 62 75 5f    "  SELECT rbu_
12f00 74 6d 70 5f 69 6e 73 65 72 74 28 30 2c 20 25 73  tmp_insert(0, %s
12f10 29 3b 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  );".            
12f20 20 20 22 45 4e 44 3b 22 2c 0a 20 20 20 20 20 20    "END;",.      
12f30 20 20 20 20 20 20 20 20 7a 57 72 69 74 65 2c 20          zWrite, 
12f40 7a 54 62 6c 2c 20 7a 4e 65 77 6c 69 73 74 0a 20  zTbl, zNewlist. 
12f50 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
12f60 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 72      }..        r
12f70 62 75 4f 62 6a 49 74 65 72 50 72 65 70 61 72 65  buObjIterPrepare
12f80 54 6d 70 49 6e 73 65 72 74 28 70 2c 20 70 49 74  TmpInsert(p, pIt
12f90 65 72 2c 20 7a 43 6f 6c 6c 69 73 74 2c 20 7a 52  er, zCollist, zR
12fa0 62 75 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  buRowid);.      
12fb0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 72 65 61  }..      /* Crea
12fc0 74 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  te the SELECT st
12fd0 61 74 65 6d 65 6e 74 20 74 6f 20 72 65 61 64 20  atement to read 
12fe0 6b 65 79 73 20 66 72 6f 6d 20 64 61 74 61 5f 78  keys from data_x
12ff0 78 78 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  xx */.      if( 
13000 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
13010 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73   ){.        cons
13020 74 20 63 68 61 72 20 2a 7a 52 62 75 52 6f 77 69  t char *zRbuRowi
13030 64 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 20 20  d = "";.        
13040 63 68 61 72 20 2a 7a 53 74 61 72 74 20 3d 20 30  char *zStart = 0
13050 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  ;.        char *
13060 7a 4f 72 64 65 72 20 3d 20 30 3b 0a 20 20 20 20  zOrder = 0;.    
13070 20 20 20 20 69 66 28 20 62 52 62 75 52 6f 77 69      if( bRbuRowi
13080 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  d ){.          z
13090 52 62 75 52 6f 77 69 64 20 3d 20 72 62 75 49 73  RbuRowid = rbuIs
130a0 56 61 63 75 75 6d 28 70 29 20 3f 20 22 2c 5f 72  Vacuum(p) ? ",_r
130b0 6f 77 69 64 5f 20 22 20 3a 20 22 2c 72 62 75 5f  owid_ " : ",rbu_
130c0 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 20 20  rowid";.        
130d0 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  }..        if( r
130e0 62 75 49 73 56 61 63 75 75 6d 28 70 29 20 29 7b  buIsVacuum(p) ){
130f0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e  .          if( n
13100 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20  Offset ){.      
13110 20 20 20 20 20 20 7a 53 74 61 72 74 20 3d 20 72        zStart = r
13120 62 75 56 61 63 75 75 6d 54 61 62 6c 65 53 74 61  buVacuumTableSta
13130 72 74 28 70 2c 20 70 49 74 65 72 2c 20 62 52 62  rt(p, pIter, bRb
13140 75 52 6f 77 69 64 2c 20 7a 57 72 69 74 65 29 3b  uRowid, zWrite);
13150 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
13160 20 7a 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20   zStart ){.     
13170 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
13180 5f 66 72 65 65 28 7a 4c 69 6d 69 74 29 3b 0a 20  _free(zLimit);. 
13190 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4c 69               zLi
131a0 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  mit = 0;.       
131b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
131c0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
131d0 20 62 52 62 75 52 6f 77 69 64 20 29 7b 0a 20 20   bRbuRowid ){.  
131e0 20 20 20 20 20 20 20 20 20 20 7a 4f 72 64 65 72            zOrder
131f0 20 3d 20 72 62 75 4d 50 72 69 6e 74 66 28 70 2c   = rbuMPrintf(p,
13200 20 22 5f 72 6f 77 69 64 5f 22 29 3b 0a 20 20 20   "_rowid_");.   
13210 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
13220 20 20 20 20 20 20 20 20 20 20 7a 4f 72 64 65 72            zOrder
13230 20 3d 20 72 62 75 4f 62 6a 49 74 65 72 47 65 74   = rbuObjIterGet
13240 50 6b 4c 69 73 74 28 70 2c 20 70 49 74 65 72 2c  PkList(p, pIter,
13250 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20   "");.          
13260 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  }.        }..   
13270 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
13280 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
13290 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 70         p->rc = p
132a0 72 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f 6c  repareFreeAndCol
132b0 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 52  lectError(p->dbR
132c0 62 75 2c 20 26 70 49 74 65 72 2d 3e 70 53 65 6c  bu, &pIter->pSel
132d0 65 63 74 2c 20 70 7a 2c 0a 20 20 20 20 20 20 20  ect, pz,.       
132e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d         sqlite3_m
132f0 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  printf(.        
13300 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
13310 25 73 2c 25 73 20 72 62 75 5f 63 6f 6e 74 72 6f  %s,%s rbu_contro
13320 6c 25 73 20 46 52 4f 4d 20 27 25 71 27 25 73 20  l%s FROM '%q'%s 
13330 25 73 20 25 73 20 25 73 22 2c 0a 20 20 20 20 20  %s %s %s",.     
13340 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 6c             zColl
13350 69 73 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ist, .          
13360 20 20 20 20 20 20 28 72 62 75 49 73 56 61 63 75        (rbuIsVacu
13370 75 6d 28 70 29 20 3f 20 22 30 20 41 53 20 22 20  um(p) ? "0 AS " 
13380 3a 20 22 22 29 2c 0a 20 20 20 20 20 20 20 20 20  : ""),.         
13390 20 20 20 20 20 20 20 7a 52 62 75 52 6f 77 69 64         zRbuRowid
133a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
133b0 20 20 70 49 74 65 72 2d 3e 7a 44 61 74 61 54 62    pIter->zDataTb
133c0 6c 2c 20 28 7a 53 74 61 72 74 20 3f 20 7a 53 74  l, (zStart ? zSt
133d0 61 72 74 20 3a 20 22 22 29 2c 20 0a 20 20 20 20  art : ""), .    
133e0 20 20 20 20 20 20 20 20 20 20 20 20 28 7a 4f 72              (zOr
133f0 64 65 72 20 3f 20 22 4f 52 44 45 52 20 42 59 22  der ? "ORDER BY"
13400 20 3a 20 22 22 29 2c 20 7a 4f 72 64 65 72 2c 0a   : ""), zOrder,.
13410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13420 7a 4c 69 6d 69 74 0a 20 20 20 20 20 20 20 20 20  zLimit.         
13430 20 20 20 20 20 29 0a 20 20 20 20 20 20 20 20 20       ).         
13440 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   );.        }.  
13450 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
13460 65 65 28 7a 53 74 61 72 74 29 3b 0a 20 20 20 20  ee(zStart);.    
13470 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
13480 28 7a 4f 72 64 65 72 29 3b 0a 20 20 20 20 20 20  (zOrder);.      
13490 7d 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  }..      sqlite3
134a0 5f 66 72 65 65 28 7a 57 68 65 72 65 29 3b 0a 20  _free(zWhere);. 
134b0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
134c0 65 28 7a 4f 6c 64 6c 69 73 74 29 3b 0a 20 20 20  e(zOldlist);.   
134d0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
134e0 7a 4e 65 77 6c 69 73 74 29 3b 0a 20 20 20 20 20  zNewlist);.     
134f0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42   sqlite3_free(zB
13500 69 6e 64 69 6e 67 73 29 3b 0a 20 20 20 20 7d 0a  indings);.    }.
13510 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
13520 28 7a 43 6f 6c 6c 69 73 74 29 3b 0a 20 20 20 20  (zCollist);.    
13530 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4c 69  sqlite3_free(zLi
13540 6d 69 74 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 72  mit);.  }.  .  r
13550 65 74 75 72 6e 20 70 2d 3e 72 63 3b 0a 7d 0a 0a  eturn p->rc;.}..
13560 2f 2a 0a 2a 2a 20 53 65 74 20 6f 75 74 70 75 74  /*.** Set output
13570 20 76 61 72 69 61 62 6c 65 20 2a 70 70 53 74 6d   variable *ppStm
13580 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 6e  t to point to an
13590 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e   UPDATE statemen
135a0 74 20 74 68 61 74 20 6d 61 79 0a 2a 2a 20 62 65  t that may.** be
135b0 20 75 73 65 64 20 74 6f 20 75 70 64 61 74 65 20   used to update 
135c0 74 68 65 20 69 6d 70 6f 73 74 65 72 20 74 61 62  the imposter tab
135d0 6c 65 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20  le for the main 
135e0 74 61 62 6c 65 20 62 2d 74 72 65 65 20 6f 66 20  table b-tree of 
135f0 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 6f 62 6a  the.** table obj
13600 65 63 74 20 74 68 61 74 20 70 49 74 65 72 20 63  ect that pIter c
13610 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20  urrently points 
13620 74 6f 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61  to, assuming tha
13630 74 20 74 68 65 20 0a 2a 2a 20 72 62 75 5f 63 6f  t the .** rbu_co
13640 6e 74 72 6f 6c 20 63 6f 6c 75 6d 6e 20 6f 66 20  ntrol column of 
13650 74 68 65 20 64 61 74 61 5f 78 79 7a 20 74 61 62  the data_xyz tab
13660 6c 65 20 63 6f 6e 74 61 69 6e 73 20 7a 4d 61 73  le contains zMas
13670 6b 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65  k..** .** If the
13680 20 7a 4d 61 73 6b 20 73 74 72 69 6e 67 20 64 6f   zMask string do
13690 65 73 20 6e 6f 74 20 73 70 65 63 69 66 79 20 61  es not specify a
136a0 6e 79 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 75 70  ny columns to up
136b0 64 61 74 65 2c 20 74 68 65 6e 20 74 68 69 73 0a  date, then this.
136c0 2a 2a 20 69 73 20 6e 6f 74 20 61 6e 20 65 72 72  ** is not an err
136d0 6f 72 2e 20 4f 75 74 70 75 74 20 76 61 72 69 61  or. Output varia
136e0 62 6c 65 20 2a 70 70 53 74 6d 74 20 69 73 20 73  ble *ppStmt is s
136f0 65 74 20 74 6f 20 4e 55 4c 4c 20 69 6e 20 74 68  et to NULL in th
13700 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 73 74 61 74  is case..*/.stat
13710 69 63 20 69 6e 74 20 72 62 75 47 65 74 55 70 64  ic int rbuGetUpd
13720 61 74 65 53 74 6d 74 28 0a 20 20 73 71 6c 69 74  ateStmt(.  sqlit
13730 65 33 72 62 75 20 2a 70 2c 20 20 20 20 20 20 20  e3rbu *p,       
13740 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 42             /* RB
13750 55 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 52 62  U handle */.  Rb
13760 75 4f 62 6a 49 74 65 72 20 2a 70 49 74 65 72 2c  uObjIter *pIter,
13770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13780 20 4f 62 6a 65 63 74 20 69 74 65 72 61 74 6f 72   Object iterator
13790 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
137a0 20 2a 7a 4d 61 73 6b 2c 20 20 20 20 20 20 20 20   *zMask,        
137b0 20 20 20 20 20 20 2f 2a 20 72 62 75 5f 63 6f 6e        /* rbu_con
137c0 74 72 6f 6c 20 76 61 6c 75 65 20 28 27 78 2e 78  trol value ('x.x
137d0 2e 27 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  .') */.  sqlite3
137e0 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 20 20  _stmt **ppStmt  
137f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
13800 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e   UPDATE statemen
13810 74 20 68 61 6e 64 6c 65 20 2a 2f 0a 29 7b 0a 20  t handle */.){. 
13820 20 52 62 75 55 70 64 61 74 65 53 74 6d 74 20 2a   RbuUpdateStmt *
13830 2a 70 70 3b 0a 20 20 52 62 75 55 70 64 61 74 65  *pp;.  RbuUpdate
13840 53 74 6d 74 20 2a 70 55 70 20 3d 20 30 3b 0a 20  Stmt *pUp = 0;. 
13850 20 69 6e 74 20 6e 55 70 20 3d 20 30 3b 0a 0a 20   int nUp = 0;.. 
13860 20 2f 2a 20 49 6e 20 63 61 73 65 20 61 6e 20 65   /* In case an e
13870 72 72 6f 72 20 6f 63 63 75 72 73 20 2a 2f 0a 20  rror occurs */. 
13880 20 2a 70 70 53 74 6d 74 20 3d 20 30 3b 0a 0a 20   *ppStmt = 0;.. 
13890 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61   /* Search for a
138a0 6e 20 65 78 69 73 74 69 6e 67 20 73 74 61 74 65  n existing state
138b0 6d 65 6e 74 2e 20 49 66 20 6f 6e 65 20 69 73 20  ment. If one is 
138c0 66 6f 75 6e 64 2c 20 73 68 69 66 74 20 69 74 20  found, shift it 
138d0 74 6f 20 74 68 65 20 66 72 6f 6e 74 0a 20 20 2a  to the front.  *
138e0 2a 20 6f 66 20 74 68 65 20 4c 52 55 20 71 75 65  * of the LRU que
138f0 75 65 20 61 6e 64 20 72 65 74 75 72 6e 20 69 6d  ue and return im
13900 6d 65 64 69 61 74 65 6c 79 2e 20 4f 74 68 65 72  mediately. Other
13910 77 69 73 65 2c 20 6c 65 61 76 65 20 6e 55 70 20  wise, leave nUp 
13920 70 6f 69 6e 74 69 6e 67 0a 20 20 2a 2a 20 74 6f  pointing.  ** to
13930 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73   the number of s
13940 74 61 74 65 6d 65 6e 74 73 20 63 75 72 72 65 6e  tatements curren
13950 74 6c 79 20 69 6e 20 74 68 65 20 63 61 63 68 65  tly in the cache
13960 20 61 6e 64 20 70 55 70 20 74 6f 20 74 68 65 0a   and pUp to the.
13970 20 20 2a 2a 20 6c 61 73 74 20 6f 62 6a 65 63 74    ** last object
13980 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 20 20 2a   in the list.  *
13990 2f 0a 20 20 66 6f 72 28 70 70 3d 26 70 49 74 65  /.  for(pp=&pIte
139a0 72 2d 3e 70 52 62 75 55 70 64 61 74 65 3b 20 2a  r->pRbuUpdate; *
139b0 70 70 3b 20 70 70 3d 26 28 28 2a 70 70 29 2d 3e  pp; pp=&((*pp)->
139c0 70 4e 65 78 74 29 29 7b 0a 20 20 20 20 70 55 70  pNext)){.    pUp
139d0 20 3d 20 2a 70 70 3b 0a 20 20 20 20 69 66 28 20   = *pp;.    if( 
139e0 73 74 72 63 6d 70 28 70 55 70 2d 3e 7a 4d 61 73  strcmp(pUp->zMas
139f0 6b 2c 20 7a 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a  k, zMask)==0 ){.
13a00 20 20 20 20 20 20 2a 70 70 20 3d 20 70 55 70 2d        *pp = pUp-
13a10 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 70 55  >pNext;.      pU
13a20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 49 74 65 72  p->pNext = pIter
13a30 2d 3e 70 52 62 75 55 70 64 61 74 65 3b 0a 20 20  ->pRbuUpdate;.  
13a40 20 20 20 20 70 49 74 65 72 2d 3e 70 52 62 75 55      pIter->pRbuU
13a50 70 64 61 74 65 20 3d 20 70 55 70 3b 0a 20 20 20  pdate = pUp;.   
13a60 20 20 20 2a 70 70 53 74 6d 74 20 3d 20 70 55 70     *ppStmt = pUp
13a70 2d 3e 70 55 70 64 61 74 65 3b 20 0a 20 20 20 20  ->pUpdate; .    
13a80 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13a90 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 55  OK;.    }.    nU
13aa0 70 2b 2b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  p++;.  }.  asser
13ab0 74 28 20 70 55 70 3d 3d 30 20 7c 7c 20 70 55 70  t( pUp==0 || pUp
13ac0 2d 3e 70 4e 65 78 74 3d 3d 30 20 29 3b 0a 0a 20  ->pNext==0 );.. 
13ad0 20 69 66 28 20 6e 55 70 3e 3d 53 51 4c 49 54 45   if( nUp>=SQLITE
13ae0 5f 52 42 55 5f 55 50 44 41 54 45 5f 43 41 43 48  _RBU_UPDATE_CACH
13af0 45 53 49 5a 45 20 29 7b 0a 20 20 20 20 66 6f 72  ESIZE ){.    for
13b00 28 70 70 3d 26 70 49 74 65 72 2d 3e 70 52 62 75  (pp=&pIter->pRbu
13b10 55 70 64 61 74 65 3b 20 2a 70 70 21 3d 70 55 70  Update; *pp!=pUp
13b20 3b 20 70 70 3d 26 28 28 2a 70 70 29 2d 3e 70 4e  ; pp=&((*pp)->pN
13b30 65 78 74 29 29 3b 0a 20 20 20 20 2a 70 70 20 3d  ext));.    *pp =
13b40 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   0;.    sqlite3_
13b50 66 69 6e 61 6c 69 7a 65 28 70 55 70 2d 3e 70 55  finalize(pUp->pU
13b60 70 64 61 74 65 29 3b 0a 20 20 20 20 70 55 70 2d  pdate);.    pUp-
13b70 3e 70 55 70 64 61 74 65 20 3d 20 30 3b 0a 20 20  >pUpdate = 0;.  
13b80 7d 65 6c 73 65 7b 0a 20 20 20 20 70 55 70 20 3d  }else{.    pUp =
13b90 20 28 52 62 75 55 70 64 61 74 65 53 74 6d 74 2a   (RbuUpdateStmt*
13ba0 29 72 62 75 4d 61 6c 6c 6f 63 28 70 2c 20 73 69  )rbuMalloc(p, si
13bb0 7a 65 6f 66 28 52 62 75 55 70 64 61 74 65 53 74  zeof(RbuUpdateSt
13bc0 6d 74 29 2b 70 49 74 65 72 2d 3e 6e 54 62 6c 43  mt)+pIter->nTblC
13bd0 6f 6c 2b 31 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  ol+1);.  }..  if
13be0 28 20 70 55 70 20 29 7b 0a 20 20 20 20 63 68 61  ( pUp ){.    cha
13bf0 72 20 2a 7a 57 68 65 72 65 20 3d 20 72 62 75 4f  r *zWhere = rbuO
13c00 62 6a 49 74 65 72 47 65 74 57 68 65 72 65 28 70  bjIterGetWhere(p
13c10 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 63 68  , pIter);.    ch
13c20 61 72 20 2a 7a 53 65 74 20 3d 20 72 62 75 4f 62  ar *zSet = rbuOb
13c30 6a 49 74 65 72 47 65 74 53 65 74 6c 69 73 74 28  jIterGetSetlist(
13c40 70 2c 20 70 49 74 65 72 2c 20 7a 4d 61 73 6b 29  p, pIter, zMask)
13c50 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 55 70 64  ;.    char *zUpd
13c60 61 74 65 20 3d 20 30 3b 0a 0a 20 20 20 20 70 55  ate = 0;..    pU
13c70 70 2d 3e 7a 4d 61 73 6b 20 3d 20 28 63 68 61 72  p->zMask = (char
13c80 2a 29 26 70 55 70 5b 31 5d 3b 0a 20 20 20 20 6d  *)&pUp[1];.    m
13c90 65 6d 63 70 79 28 70 55 70 2d 3e 7a 4d 61 73 6b  emcpy(pUp->zMask
13ca0 2c 20 7a 4d 61 73 6b 2c 20 70 49 74 65 72 2d 3e  , zMask, pIter->
13cb0 6e 54 62 6c 43 6f 6c 29 3b 0a 20 20 20 20 70 55  nTblCol);.    pU
13cc0 70 2d 3e 70 4e 65 78 74 20 3d 20 70 49 74 65 72  p->pNext = pIter
13cd0 2d 3e 70 52 62 75 55 70 64 61 74 65 3b 0a 20 20  ->pRbuUpdate;.  
13ce0 20 20 70 49 74 65 72 2d 3e 70 52 62 75 55 70 64    pIter->pRbuUpd
13cf0 61 74 65 20 3d 20 70 55 70 3b 0a 0a 20 20 20 20  ate = pUp;..    
13d00 69 66 28 20 7a 53 65 74 20 29 7b 0a 20 20 20 20  if( zSet ){.    
13d10 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
13d20 72 65 66 69 78 20 3d 20 22 22 3b 0a 0a 20 20 20  refix = "";..   
13d30 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 65 54     if( pIter->eT
13d40 79 70 65 21 3d 52 42 55 5f 50 4b 5f 56 54 41 42  ype!=RBU_PK_VTAB
13d50 20 29 20 7a 50 72 65 66 69 78 20 3d 20 22 72 62   ) zPrefix = "rb
13d60 75 5f 69 6d 70 5f 22 3b 0a 20 20 20 20 20 20 7a  u_imp_";.      z
13d70 55 70 64 61 74 65 20 3d 20 73 71 6c 69 74 65 33  Update = sqlite3
13d80 5f 6d 70 72 69 6e 74 66 28 22 55 50 44 41 54 45  _mprintf("UPDATE
13d90 20 5c 22 25 73 25 77 5c 22 20 53 45 54 20 25 73   \"%s%w\" SET %s
13da0 20 57 48 45 52 45 20 25 73 22 2c 20 0a 20 20 20   WHERE %s", .   
13db0 20 20 20 20 20 20 20 7a 50 72 65 66 69 78 2c 20         zPrefix, 
13dc0 70 49 74 65 72 2d 3e 7a 54 62 6c 2c 20 7a 53 65  pIter->zTbl, zSe
13dd0 74 2c 20 7a 57 68 65 72 65 0a 20 20 20 20 20 20  t, zWhere.      
13de0 29 3b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  );.      p->rc =
13df0 20 70 72 65 70 61 72 65 46 72 65 65 41 6e 64 43   prepareFreeAndC
13e00 6f 6c 6c 65 63 74 45 72 72 6f 72 28 0a 20 20 20  ollectError(.   
13e10 20 20 20 20 20 20 20 70 2d 3e 64 62 4d 61 69 6e         p->dbMain
13e20 2c 20 26 70 55 70 2d 3e 70 55 70 64 61 74 65 2c  , &pUp->pUpdate,
13e30 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 20 7a 55   &p->zErrmsg, zU
13e40 70 64 61 74 65 0a 20 20 20 20 20 20 29 3b 0a 20  pdate.      );. 
13e50 20 20 20 20 20 2a 70 70 53 74 6d 74 20 3d 20 70       *ppStmt = p
13e60 55 70 2d 3e 70 55 70 64 61 74 65 3b 0a 20 20 20  Up->pUpdate;.   
13e70 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
13e80 72 65 65 28 7a 57 68 65 72 65 29 3b 0a 20 20 20  ree(zWhere);.   
13e90 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53   sqlite3_free(zS
13ea0 65 74 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  et);.  }..  retu
13eb0 72 6e 20 70 2d 3e 72 63 3b 0a 7d 0a 0a 73 74 61  rn p->rc;.}..sta
13ec0 74 69 63 20 73 71 6c 69 74 65 33 20 2a 72 62 75  tic sqlite3 *rbu
13ed0 4f 70 65 6e 44 62 68 61 6e 64 6c 65 28 0a 20 20  OpenDbhandle(.  
13ee0 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 0a  sqlite3rbu *p, .
13ef0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
13f00 61 6d 65 2c 20 0a 20 20 69 6e 74 20 62 55 73 65  ame, .  int bUse
13f10 56 66 73 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  Vfs.){.  sqlite3
13f20 20 2a 64 62 20 3d 20 30 3b 0a 20 20 69 66 28 20   *db = 0;.  if( 
13f30 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
13f40 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e   ){.    const in
13f50 74 20 66 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  t flags = SQLITE
13f60 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c  _OPEN_READWRITE|
13f70 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
13f80 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55  TE|SQLITE_OPEN_U
13f90 52 49 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20  RI;.    p->rc = 
13fa0 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28  sqlite3_open_v2(
13fb0 7a 4e 61 6d 65 2c 20 26 64 62 2c 20 66 6c 61 67  zName, &db, flag
13fc0 73 2c 20 62 55 73 65 56 66 73 20 3f 20 70 2d 3e  s, bUseVfs ? p->
13fd0 7a 56 66 73 4e 61 6d 65 20 3a 20 30 29 3b 0a 20  zVfsName : 0);. 
13fe0 20 20 20 69 66 28 20 70 2d 3e 72 63 20 29 7b 0a     if( p->rc ){.
13ff0 20 20 20 20 20 20 70 2d 3e 7a 45 72 72 6d 73 67        p->zErrmsg
14000 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
14010 74 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65 33  tf("%s", sqlite3
14020 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20  _errmsg(db));.  
14030 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73      sqlite3_clos
14040 65 28 64 62 29 3b 0a 20 20 20 20 20 20 64 62 20  e(db);.      db 
14050 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 0;.    }.  }. 
14060 20 72 65 74 75 72 6e 20 64 62 3b 0a 7d 0a 0a 2f   return db;.}../
14070 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 20 52 62 75  *.** Free an Rbu
14080 53 74 61 74 65 20 6f 62 6a 65 63 74 20 61 6c 6c  State object all
14090 6f 63 61 74 65 64 20 62 79 20 72 62 75 4c 6f 61  ocated by rbuLoa
140a0 64 53 74 61 74 65 28 29 2e 0a 2a 2f 0a 73 74 61  dState()..*/.sta
140b0 74 69 63 20 76 6f 69 64 20 72 62 75 46 72 65 65  tic void rbuFree
140c0 53 74 61 74 65 28 52 62 75 53 74 61 74 65 20 2a  State(RbuState *
140d0 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  p){.  if( p ){. 
140e0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
140f0 70 2d 3e 7a 54 62 6c 29 3b 0a 20 20 20 20 73 71  p->zTbl);.    sq
14100 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 44  lite3_free(p->zD
14110 61 74 61 54 62 6c 29 3b 0a 20 20 20 20 73 71 6c  ataTbl);.    sql
14120 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 49 64  ite3_free(p->zId
14130 78 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  x);.    sqlite3_
14140 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a  free(p);.  }.}..
14150 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
14160 6e 20 52 62 75 53 74 61 74 65 20 6f 62 6a 65 63  n RbuState objec
14170 74 20 61 6e 64 20 6c 6f 61 64 20 74 68 65 20 63  t and load the c
14180 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 72  ontents of the r
14190 62 75 5f 73 74 61 74 65 20 0a 2a 2a 20 74 61 62  bu_state .** tab
141a0 6c 65 20 69 6e 74 6f 20 69 74 2e 20 52 65 74 75  le into it. Retu
141b0 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
141c0 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 2e 20  the new object. 
141d0 49 74 20 69 73 20 74 68 65 20 0a 2a 2a 20 72 65  It is the .** re
141e0 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
141f0 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76  the caller to ev
14200 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 20 74 68  entually free th
14210 65 20 6f 62 6a 65 63 74 20 75 73 69 6e 67 0a 2a  e object using.*
14220 2a 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29  * sqlite3_free()
14230 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
14240 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65 61 76  ror occurs, leav
14250 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  e an error code 
14260 61 6e 64 20 6d 65 73 73 61 67 65 20 69 6e 20 74  and message in t
14270 68 65 20 72 62 75 20 68 61 6e 64 6c 65 0a 2a 2a  he rbu handle.**
14280 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c   and return NULL
14290 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 52 62 75 53  ..*/.static RbuS
142a0 74 61 74 65 20 2a 72 62 75 4c 6f 61 64 53 74 61  tate *rbuLoadSta
142b0 74 65 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70  te(sqlite3rbu *p
142c0 29 7b 0a 20 20 52 62 75 53 74 61 74 65 20 2a 70  ){.  RbuState *p
142d0 52 65 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  Ret = 0;.  sqlit
142e0 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d  e3_stmt *pStmt =
142f0 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   0;.  int rc;.  
14300 69 6e 74 20 72 63 32 3b 0a 0a 20 20 70 52 65 74  int rc2;..  pRet
14310 20 3d 20 28 52 62 75 53 74 61 74 65 2a 29 72 62   = (RbuState*)rb
14320 75 4d 61 6c 6c 6f 63 28 70 2c 20 73 69 7a 65 6f  uMalloc(p, sizeo
14330 66 28 52 62 75 53 74 61 74 65 29 29 3b 0a 20 20  f(RbuState));.  
14340 69 66 28 20 70 52 65 74 3d 3d 30 20 29 20 72 65  if( pRet==0 ) re
14350 74 75 72 6e 20 30 3b 0a 0a 20 20 72 63 20 3d 20  turn 0;..  rc = 
14360 70 72 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f  prepareFreeAndCo
14370 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62  llectError(p->db
14380 52 62 75 2c 20 26 70 53 74 6d 74 2c 20 26 70 2d  Rbu, &pStmt, &p-
14390 3e 7a 45 72 72 6d 73 67 2c 20 0a 20 20 20 20 20  >zErrmsg, .     
143a0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
143b0 28 22 53 45 4c 45 43 54 20 6b 2c 20 76 20 46 52  ("SELECT k, v FR
143c0 4f 4d 20 25 73 2e 72 62 75 5f 73 74 61 74 65 22  OM %s.rbu_state"
143d0 2c 20 70 2d 3e 7a 53 74 61 74 65 44 62 29 0a 20  , p->zStateDb). 
143e0 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d   );.  while( rc=
143f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51  =SQLITE_OK && SQ
14400 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65  LITE_ROW==sqlite
14410 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b  3_step(pStmt) ){
14420 0a 20 20 20 20 73 77 69 74 63 68 28 20 73 71 6c  .    switch( sql
14430 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
14440 70 53 74 6d 74 2c 20 30 29 20 29 7b 0a 20 20 20  pStmt, 0) ){.   
14450 20 20 20 63 61 73 65 20 52 42 55 5f 53 54 41 54     case RBU_STAT
14460 45 5f 53 54 41 47 45 3a 0a 20 20 20 20 20 20 20  E_STAGE:.       
14470 20 70 52 65 74 2d 3e 65 53 74 61 67 65 20 3d 20   pRet->eStage = 
14480 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
14490 6e 74 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20  nt(pStmt, 1);.  
144a0 20 20 20 20 20 20 69 66 28 20 70 52 65 74 2d 3e        if( pRet->
144b0 65 53 74 61 67 65 21 3d 52 42 55 5f 53 54 41 47  eStage!=RBU_STAG
144c0 45 5f 4f 41 4c 0a 20 20 20 20 20 20 20 20 20 26  E_OAL.         &
144d0 26 20 70 52 65 74 2d 3e 65 53 74 61 67 65 21 3d  & pRet->eStage!=
144e0 52 42 55 5f 53 54 41 47 45 5f 4d 4f 56 45 0a 20  RBU_STAGE_MOVE. 
144f0 20 20 20 20 20 20 20 20 26 26 20 70 52 65 74 2d          && pRet-
14500 3e 65 53 74 61 67 65 21 3d 52 42 55 5f 53 54 41  >eStage!=RBU_STA
14510 47 45 5f 43 4b 50 54 0a 20 20 20 20 20 20 20 20  GE_CKPT.        
14520 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ){.          p->
14530 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
14540 55 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  UPT;.        }. 
14550 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20         break;.. 
14560 20 20 20 20 20 63 61 73 65 20 52 42 55 5f 53 54       case RBU_ST
14570 41 54 45 5f 54 42 4c 3a 0a 20 20 20 20 20 20 20  ATE_TBL:.       
14580 20 70 52 65 74 2d 3e 7a 54 62 6c 20 3d 20 72 62   pRet->zTbl = rb
14590 75 53 74 72 6e 64 75 70 28 28 63 68 61 72 2a 29  uStrndup((char*)
145a0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
145b0 65 78 74 28 70 53 74 6d 74 2c 20 31 29 2c 20 26  ext(pStmt, 1), &
145c0 72 63 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  rc);.        bre
145d0 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20  ak;..      case 
145e0 52 42 55 5f 53 54 41 54 45 5f 49 44 58 3a 0a 20  RBU_STATE_IDX:. 
145f0 20 20 20 20 20 20 20 70 52 65 74 2d 3e 7a 49 64         pRet->zId
14600 78 20 3d 20 72 62 75 53 74 72 6e 64 75 70 28 28  x = rbuStrndup((
14610 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
14620 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
14630 20 31 29 2c 20 26 72 63 29 3b 0a 20 20 20 20 20   1), &rc);.     
14640 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20     break;..     
14650 20 63 61 73 65 20 52 42 55 5f 53 54 41 54 45 5f   case RBU_STATE_
14660 52 4f 57 3a 0a 20 20 20 20 20 20 20 20 70 52 65  ROW:.        pRe
14670 74 2d 3e 6e 52 6f 77 20 3d 20 73 71 6c 69 74 65  t->nRow = sqlite
14680 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74  3_column_int(pSt
14690 6d 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  mt, 1);.        
146a0 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61  break;..      ca
146b0 73 65 20 52 42 55 5f 53 54 41 54 45 5f 50 52 4f  se RBU_STATE_PRO
146c0 47 52 45 53 53 3a 0a 20 20 20 20 20 20 20 20 70  GRESS:.        p
146d0 52 65 74 2d 3e 6e 50 72 6f 67 72 65 73 73 20 3d  Ret->nProgress =
146e0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
146f0 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 31 29 3b  int64(pStmt, 1);
14700 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
14710 0a 20 20 20 20 20 20 63 61 73 65 20 52 42 55 5f  .      case RBU_
14720 53 54 41 54 45 5f 43 4b 50 54 3a 0a 20 20 20 20  STATE_CKPT:.    
14730 20 20 20 20 70 52 65 74 2d 3e 69 57 61 6c 43 6b      pRet->iWalCk
14740 73 75 6d 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  sum = sqlite3_co
14750 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74  lumn_int64(pStmt
14760 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 62 72  , 1);.        br
14770 65 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73 65  eak;..      case
14780 20 52 42 55 5f 53 54 41 54 45 5f 43 4f 4f 4b 49   RBU_STATE_COOKI
14790 45 3a 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d  E:.        pRet-
147a0 3e 69 43 6f 6f 6b 69 65 20 3d 20 28 75 33 32 29  >iCookie = (u32)
147b0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
147c0 6e 74 36 34 28 70 53 74 6d 74 2c 20 31 29 3b 0a  nt64(pStmt, 1);.
147d0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a          break;..
147e0 20 20 20 20 20 20 63 61 73 65 20 52 42 55 5f 53        case RBU_S
147f0 54 41 54 45 5f 4f 41 4c 53 5a 3a 0a 20 20 20 20  TATE_OALSZ:.    
14800 20 20 20 20 70 52 65 74 2d 3e 69 4f 61 6c 53 7a      pRet->iOalSz
14810 20 3d 20 28 75 33 32 29 73 71 6c 69 74 65 33 5f   = (u32)sqlite3_
14820 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74  column_int64(pSt
14830 6d 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  mt, 1);.        
14840 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61  break;..      ca
14850 73 65 20 52 42 55 5f 53 54 41 54 45 5f 50 48 41  se RBU_STATE_PHA
14860 53 45 4f 4e 45 53 54 45 50 3a 0a 20 20 20 20 20  SEONESTEP:.     
14870 20 20 20 70 52 65 74 2d 3e 6e 50 68 61 73 65 4f     pRet->nPhaseO
14880 6e 65 53 74 65 70 20 3d 20 73 71 6c 69 74 65 33  neStep = sqlite3
14890 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53  _column_int64(pS
148a0 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  tmt, 1);.       
148b0 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 63   break;..      c
148c0 61 73 65 20 52 42 55 5f 53 54 41 54 45 5f 44 41  ase RBU_STATE_DA
148d0 54 41 54 42 4c 3a 0a 20 20 20 20 20 20 20 20 70  TATBL:.        p
148e0 52 65 74 2d 3e 7a 44 61 74 61 54 62 6c 20 3d 20  Ret->zDataTbl = 
148f0 72 62 75 53 74 72 6e 64 75 70 28 28 63 68 61 72  rbuStrndup((char
14900 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
14910 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31 29 2c  _text(pStmt, 1),
14920 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20 62   &rc);.        b
14930 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 64 65 66  reak;..      def
14940 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 72 63  ault:.        rc
14950 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
14960 54 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  T;.        break
14970 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 63  ;.    }.  }.  rc
14980 32 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  2 = sqlite3_fina
14990 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 69  lize(pStmt);.  i
149a0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
149b0 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 0a 20 20   ) rc = rc2;..  
149c0 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 72 65  p->rc = rc;.  re
149d0 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 0a 2f  turn pRet;.}.../
149e0 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 64 61  *.** Open the da
149f0 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 61 6e  tabase handle an
14a00 64 20 61 74 74 61 63 68 20 74 68 65 20 52 42 55  d attach the RBU
14a10 20 64 61 74 61 62 61 73 65 20 61 73 20 22 72 62   database as "rb
14a20 75 22 2e 20 49 66 20 61 6e 0a 2a 2a 20 65 72 72  u". If an.** err
14a30 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65  or occurs, leave
14a40 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 61   an error code a
14a50 6e 64 20 6d 65 73 73 61 67 65 20 69 6e 20 74 68  nd message in th
14a60 65 20 52 42 55 20 68 61 6e 64 6c 65 2e 0a 2a 2f  e RBU handle..*/
14a70 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75  .static void rbu
14a80 4f 70 65 6e 44 61 74 61 62 61 73 65 28 73 71 6c  OpenDatabase(sql
14a90 69 74 65 33 72 62 75 20 2a 70 2c 20 69 6e 74 20  ite3rbu *p, int 
14aa0 2a 70 62 52 65 74 72 79 29 7b 0a 20 20 61 73 73  *pbRetry){.  ass
14ab0 65 72 74 28 20 70 2d 3e 72 63 20 7c 7c 20 28 70  ert( p->rc || (p
14ac0 2d 3e 64 62 4d 61 69 6e 3d 3d 30 20 26 26 20 70  ->dbMain==0 && p
14ad0 2d 3e 64 62 52 62 75 3d 3d 30 29 20 29 3b 0a 20  ->dbRbu==0) );. 
14ae0 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 20 7c   assert( p->rc |
14af0 7c 20 72 62 75 49 73 56 61 63 75 75 6d 28 70 29  | rbuIsVacuum(p)
14b00 20 7c 7c 20 70 2d 3e 7a 54 61 72 67 65 74 21 3d   || p->zTarget!=
14b10 30 20 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  0 );..  /* Open 
14b20 74 68 65 20 52 42 55 20 64 61 74 61 62 61 73 65  the RBU database
14b30 20 2a 2f 0a 20 20 70 2d 3e 64 62 52 62 75 20 3d   */.  p->dbRbu =
14b40 20 72 62 75 4f 70 65 6e 44 62 68 61 6e 64 6c 65   rbuOpenDbhandle
14b50 28 70 2c 20 70 2d 3e 7a 52 62 75 2c 20 31 29 3b  (p, p->zRbu, 1);
14b60 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ..  if( p->rc==S
14b70 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 62 75 49  QLITE_OK && rbuI
14b80 73 56 61 63 75 75 6d 28 70 29 20 29 7b 0a 20 20  sVacuum(p) ){.  
14b90 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63    sqlite3_file_c
14ba0 6f 6e 74 72 6f 6c 28 70 2d 3e 64 62 52 62 75 2c  ontrol(p->dbRbu,
14bb0 20 22 6d 61 69 6e 22 2c 20 53 51 4c 49 54 45 5f   "main", SQLITE_
14bc0 46 43 4e 54 4c 5f 52 42 55 43 4e 54 2c 20 28 76  FCNTL_RBUCNT, (v
14bd0 6f 69 64 2a 29 70 29 3b 0a 20 20 20 20 69 66 28  oid*)p);.    if(
14be0 20 70 2d 3e 7a 53 74 61 74 65 3d 3d 30 20 29 7b   p->zState==0 ){
14bf0 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
14c00 72 20 2a 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74  r *zFile = sqlit
14c10 65 33 5f 64 62 5f 66 69 6c 65 6e 61 6d 65 28 70  e3_db_filename(p
14c20 2d 3e 64 62 52 62 75 2c 20 22 6d 61 69 6e 22 29  ->dbRbu, "main")
14c30 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 53 74 61 74  ;.      p->zStat
14c40 65 20 3d 20 72 62 75 4d 50 72 69 6e 74 66 28 70  e = rbuMPrintf(p
14c50 2c 20 22 66 69 6c 65 3a 2f 2f 25 73 2d 76 61 63  , "file://%s-vac
14c60 75 75 6d 3f 6d 6f 64 65 6f 66 3d 25 73 22 2c 20  uum?modeof=%s", 
14c70 7a 46 69 6c 65 2c 20 7a 46 69 6c 65 29 3b 0a 20  zFile, zFile);. 
14c80 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
14c90 66 20 75 73 69 6e 67 20 73 65 70 61 72 61 74 65  f using separate
14ca0 20 52 42 55 20 61 6e 64 20 73 74 61 74 65 20 64   RBU and state d
14cb0 61 74 61 62 61 73 65 73 2c 20 61 74 74 61 63 68  atabases, attach
14cc0 20 74 68 65 20 73 74 61 74 65 20 64 61 74 61 62   the state datab
14cd0 61 73 65 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20  ase to.  ** the 
14ce0 52 42 55 20 64 62 20 68 61 6e 64 6c 65 20 6e 6f  RBU db handle no
14cf0 77 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  w.  */.  if( p->
14d00 7a 53 74 61 74 65 20 29 7b 0a 20 20 20 20 72 62  zState ){.    rb
14d10 75 4d 50 72 69 6e 74 66 45 78 65 63 28 70 2c 20  uMPrintfExec(p, 
14d20 70 2d 3e 64 62 52 62 75 2c 20 22 41 54 54 41 43  p->dbRbu, "ATTAC
14d30 48 20 25 51 20 41 53 20 73 74 61 74 22 2c 20 70  H %Q AS stat", p
14d40 2d 3e 7a 53 74 61 74 65 29 3b 0a 20 20 20 20 6d  ->zState);.    m
14d50 65 6d 63 70 79 28 70 2d 3e 7a 53 74 61 74 65 44  emcpy(p->zStateD
14d60 62 2c 20 22 73 74 61 74 22 2c 20 34 29 3b 0a 20  b, "stat", 4);. 
14d70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 63   }else{.    memc
14d80 70 79 28 70 2d 3e 7a 53 74 61 74 65 44 62 2c 20  py(p->zStateDb, 
14d90 22 6d 61 69 6e 22 2c 20 34 29 3b 0a 20 20 7d 0a  "main", 4);.  }.
14da0 0a 23 69 66 20 30 0a 20 20 69 66 28 20 70 2d 3e  .#if 0.  if( p->
14db0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
14dc0 20 72 62 75 49 73 56 61 63 75 75 6d 28 70 29 20   rbuIsVacuum(p) 
14dd0 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73  ){.    p->rc = s
14de0 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
14df0 62 52 62 75 2c 20 22 42 45 47 49 4e 22 2c 20 30  bRbu, "BEGIN", 0
14e00 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e  , 0, 0);.  }.#en
14e10 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 69 74 20  dif..  /* If it 
14e20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  has not already 
14e30 62 65 65 6e 20 63 72 65 61 74 65 64 2c 20 63 72  been created, cr
14e40 65 61 74 65 20 74 68 65 20 72 62 75 5f 73 74 61  eate the rbu_sta
14e50 74 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 72 62  te table */.  rb
14e60 75 4d 50 72 69 6e 74 66 45 78 65 63 28 70 2c 20  uMPrintfExec(p, 
14e70 70 2d 3e 64 62 52 62 75 2c 20 52 42 55 5f 43 52  p->dbRbu, RBU_CR
14e80 45 41 54 45 5f 53 54 41 54 45 2c 20 70 2d 3e 7a  EATE_STATE, p->z
14e90 53 74 61 74 65 44 62 29 3b 0a 0a 23 69 66 20 30  StateDb);..#if 0
14ea0 0a 20 20 69 66 28 20 72 62 75 49 73 56 61 63 75  .  if( rbuIsVacu
14eb0 75 6d 28 70 29 20 29 7b 0a 20 20 20 20 69 66 28  um(p) ){.    if(
14ec0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
14ed0 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  K ){.      int r
14ee0 63 32 3b 0a 20 20 20 20 20 20 69 6e 74 20 62 4f  c2;.      int bO
14ef0 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c  k = 0;.      sql
14f00 69 74 65 33 5f 73 74 6d 74 20 2a 70 43 6e 74 20  ite3_stmt *pCnt 
14f10 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 72 63  = 0;.      p->rc
14f20 20 3d 20 70 72 65 70 61 72 65 41 6e 64 43 6f 6c   = prepareAndCol
14f30 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 52  lectError(p->dbR
14f40 62 75 2c 20 26 70 43 6e 74 2c 20 26 70 2d 3e 7a  bu, &pCnt, &p->z
14f50 45 72 72 6d 73 67 2c 0a 20 20 20 20 20 20 20 20  Errmsg,.        
14f60 20 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28    "SELECT count(
14f70 2a 29 20 46 52 4f 4d 20 73 74 61 74 2e 73 71 6c  *) FROM stat.sql
14f80 69 74 65 5f 6d 61 73 74 65 72 22 0a 20 20 20 20  ite_master".    
14f90 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70    );.      if( p
14fa0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
14fb0 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74  .       && sqlit
14fc0 65 33 5f 73 74 65 70 28 70 43 6e 74 29 3d 3d 53  e3_step(pCnt)==S
14fd0 51 4c 49 54 45 5f 52 4f 57 0a 20 20 20 20 20 20  QLITE_ROW.      
14fe0 20 26 26 20 31 3d 3d 73 71 6c 69 74 65 33 5f 63   && 1==sqlite3_c
14ff0 6f 6c 75 6d 6e 5f 69 6e 74 28 70 43 6e 74 2c 20  olumn_int(pCnt, 
15000 30 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  0).      ){.    
15010 20 20 20 20 62 4f 6b 20 3d 20 31 3b 0a 20 20 20      bOk = 1;.   
15020 20 20 20 7d 0a 20 20 20 20 20 20 72 63 32 20 3d     }.      rc2 =
15030 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
15040 65 28 70 43 6e 74 29 3b 0a 20 20 20 20 20 20 69  e(pCnt);.      i
15050 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
15060 5f 4f 4b 20 29 20 70 2d 3e 72 63 20 3d 20 72 63  _OK ) p->rc = rc
15070 32 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 2d  2;..      if( p-
15080 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
15090 26 20 62 4f 6b 3d 3d 30 20 29 7b 0a 20 20 20 20  & bOk==0 ){.    
150a0 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
150b0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
150c0 20 20 70 2d 3e 7a 45 72 72 6d 73 67 20 3d 20 73    p->zErrmsg = s
150d0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
150e0 69 6e 76 61 6c 69 64 20 73 74 61 74 65 20 64 61  invalid state da
150f0 74 61 62 61 73 65 22 29 3b 0a 20 20 20 20 20 20  tabase");.      
15100 7d 0a 20 20 20 20 0a 20 20 20 20 20 20 69 66 28  }.    .      if(
15110 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
15120 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  K ){.        p->
15130 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65  rc = sqlite3_exe
15140 63 28 70 2d 3e 64 62 52 62 75 2c 20 22 43 4f 4d  c(p->dbRbu, "COM
15150 4d 49 54 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  MIT", 0, 0, 0);.
15160 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
15170 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  }.#endif..  if( 
15180 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
15190 20 26 26 20 72 62 75 49 73 56 61 63 75 75 6d 28   && rbuIsVacuum(
151a0 70 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 4f  p) ){.    int bO
151b0 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  pen = 0;.    int
151c0 20 72 63 3b 0a 20 20 20 20 70 2d 3e 6e 52 62 75   rc;.    p->nRbu
151d0 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 52 62   = 0;.    p->pRb
151e0 75 46 64 20 3d 20 30 3b 0a 20 20 20 20 72 63 20  uFd = 0;.    rc 
151f0 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63  = sqlite3_file_c
15200 6f 6e 74 72 6f 6c 28 70 2d 3e 64 62 52 62 75 2c  ontrol(p->dbRbu,
15210 20 22 6d 61 69 6e 22 2c 20 53 51 4c 49 54 45 5f   "main", SQLITE_
15220 46 43 4e 54 4c 5f 52 42 55 43 4e 54 2c 20 28 76  FCNTL_RBUCNT, (v
15230 6f 69 64 2a 29 70 29 3b 0a 20 20 20 20 69 66 28  oid*)p);.    if(
15240 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 54 46   rc!=SQLITE_NOTF
15250 4f 55 4e 44 20 29 20 70 2d 3e 72 63 20 3d 20 72  OUND ) p->rc = r
15260 63 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 53  c;.    if( p->eS
15270 74 61 67 65 3e 3d 52 42 55 5f 53 54 41 47 45 5f  tage>=RBU_STAGE_
15280 4d 4f 56 45 20 29 7b 0a 20 20 20 20 20 20 62 4f  MOVE ){.      bO
15290 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  pen = 1;.    }el
152a0 73 65 7b 0a 20 20 20 20 20 20 52 62 75 53 74 61  se{.      RbuSta
152b0 74 65 20 2a 70 53 74 61 74 65 20 3d 20 72 62 75  te *pState = rbu
152c0 4c 6f 61 64 53 74 61 74 65 28 70 29 3b 0a 20 20  LoadState(p);.  
152d0 20 20 20 20 69 66 28 20 70 53 74 61 74 65 20 29      if( pState )
152e0 7b 0a 20 20 20 20 20 20 20 20 62 4f 70 65 6e 20  {.        bOpen 
152f0 3d 20 28 70 53 74 61 74 65 2d 3e 65 53 74 61 67  = (pState->eStag
15300 65 3e 3d 52 42 55 5f 53 54 41 47 45 5f 4d 4f 56  e>=RBU_STAGE_MOV
15310 45 29 3b 0a 20 20 20 20 20 20 20 20 72 62 75 46  E);.        rbuF
15320 72 65 65 53 74 61 74 65 28 70 53 74 61 74 65 29  reeState(pState)
15330 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
15340 20 20 20 20 69 66 28 20 62 4f 70 65 6e 20 29 20      if( bOpen ) 
15350 70 2d 3e 64 62 4d 61 69 6e 20 3d 20 72 62 75 4f  p->dbMain = rbuO
15360 70 65 6e 44 62 68 61 6e 64 6c 65 28 70 2c 20 70  penDbhandle(p, p
15370 2d 3e 7a 52 62 75 2c 20 70 2d 3e 6e 52 62 75 3c  ->zRbu, p->nRbu<
15380 3d 31 29 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e 65  =1);.  }..  p->e
15390 53 74 61 67 65 20 3d 20 30 3b 0a 20 20 69 66 28  Stage = 0;.  if(
153a0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
153b0 4b 20 26 26 20 70 2d 3e 64 62 4d 61 69 6e 3d 3d  K && p->dbMain==
153c0 30 20 29 7b 0a 20 20 20 20 69 66 28 20 21 72 62  0 ){.    if( !rb
153d0 75 49 73 56 61 63 75 75 6d 28 70 29 20 29 7b 0a  uIsVacuum(p) ){.
153e0 20 20 20 20 20 20 70 2d 3e 64 62 4d 61 69 6e 20        p->dbMain 
153f0 3d 20 72 62 75 4f 70 65 6e 44 62 68 61 6e 64 6c  = rbuOpenDbhandl
15400 65 28 70 2c 20 70 2d 3e 7a 54 61 72 67 65 74 2c  e(p, p->zTarget,
15410 20 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69   1);.    }else i
15420 66 28 20 70 2d 3e 70 52 62 75 46 64 2d 3e 70 57  f( p->pRbuFd->pW
15430 61 6c 46 64 20 29 7b 0a 20 20 20 20 20 20 69 66  alFd ){.      if
15440 28 20 70 62 52 65 74 72 79 20 29 7b 0a 20 20 20  ( pbRetry ){.   
15450 20 20 20 20 20 70 2d 3e 70 52 62 75 46 64 2d 3e       p->pRbuFd->
15460 62 4e 6f 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20  bNolock = 0;.   
15470 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f       sqlite3_clo
15480 73 65 28 70 2d 3e 64 62 52 62 75 29 3b 0a 20 20  se(p->dbRbu);.  
15490 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c        sqlite3_cl
154a0 6f 73 65 28 70 2d 3e 64 62 4d 61 69 6e 29 3b 0a  ose(p->dbMain);.
154b0 20 20 20 20 20 20 20 20 70 2d 3e 64 62 4d 61 69          p->dbMai
154c0 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  n = 0;.        p
154d0 2d 3e 64 62 52 62 75 20 3d 20 30 3b 0a 20 20 20  ->dbRbu = 0;.   
154e0 20 20 20 20 20 2a 70 62 52 65 74 72 79 20 3d 20       *pbRetry = 
154f0 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  1;.        retur
15500 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  n;.      }.     
15510 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
15520 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 70 2d 3e  ERROR;.      p->
15530 7a 45 72 72 6d 73 67 20 3d 20 73 71 6c 69 74 65  zErrmsg = sqlite
15540 33 5f 6d 70 72 69 6e 74 66 28 22 63 61 6e 6e 6f  3_mprintf("canno
15550 74 20 76 61 63 75 75 6d 20 77 61 6c 20 6d 6f 64  t vacuum wal mod
15560 65 20 64 61 74 61 62 61 73 65 22 29 3b 0a 20 20  e database");.  
15570 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
15580 68 61 72 20 2a 7a 54 61 72 67 65 74 3b 0a 20 20  har *zTarget;.  
15590 20 20 20 20 63 68 61 72 20 2a 7a 45 78 74 72 61      char *zExtra
155a0 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
155b0 73 74 72 6c 65 6e 28 70 2d 3e 7a 52 62 75 29 3e  strlen(p->zRbu)>
155c0 3d 35 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28  =5 && 0==memcmp(
155d0 22 66 69 6c 65 3a 22 2c 20 70 2d 3e 7a 52 62 75  "file:", p->zRbu
155e0 2c 20 35 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 5) ){.        
155f0 7a 45 78 74 72 61 20 3d 20 26 70 2d 3e 7a 52 62  zExtra = &p->zRb
15600 75 5b 35 5d 3b 0a 20 20 20 20 20 20 20 20 77 68  u[5];.        wh
15610 69 6c 65 28 20 2a 7a 45 78 74 72 61 20 29 7b 0a  ile( *zExtra ){.
15620 20 20 20 20 20 20 20 20 20 20 69 66 28 20 2a 7a            if( *z
15630 45 78 74 72 61 2b 2b 3d 3d 27 3f 27 20 29 20 62  Extra++=='?' ) b
15640 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
15650 20 20 20 20 20 20 20 20 69 66 28 20 2a 7a 45 78          if( *zEx
15660 74 72 61 3d 3d 27 5c 30 27 20 29 20 7a 45 78 74  tra=='\0' ) zExt
15670 72 61 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ra = 0;.      }.
15680 0a 20 20 20 20 20 20 7a 54 61 72 67 65 74 20 3d  .      zTarget =
15690 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
156a0 28 22 66 69 6c 65 3a 25 73 2d 76 61 63 74 6d 70  ("file:%s-vactmp
156b0 3f 72 62 75 5f 6d 65 6d 6f 72 79 3d 31 25 73 25  ?rbu_memory=1%s%
156c0 73 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73  s", .          s
156d0 71 6c 69 74 65 33 5f 64 62 5f 66 69 6c 65 6e 61  qlite3_db_filena
156e0 6d 65 28 70 2d 3e 64 62 52 62 75 2c 20 22 6d 61  me(p->dbRbu, "ma
156f0 69 6e 22 29 2c 0a 20 20 20 20 20 20 20 20 20 20  in"),.          
15700 28 7a 45 78 74 72 61 3d 3d 30 20 3f 20 22 22 20  (zExtra==0 ? "" 
15710 3a 20 22 26 22 29 2c 20 28 7a 45 78 74 72 61 3d  : "&"), (zExtra=
15720 3d 30 20 3f 20 22 22 20 3a 20 7a 45 78 74 72 61  =0 ? "" : zExtra
15730 29 0a 20 20 20 20 20 20 29 3b 0a 0a 20 20 20 20  ).      );..    
15740 20 20 69 66 28 20 7a 54 61 72 67 65 74 3d 3d 30    if( zTarget==0
15750 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72   ){.        p->r
15760 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
15770 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
15780 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
15790 70 2d 3e 64 62 4d 61 69 6e 20 3d 20 72 62 75 4f  p->dbMain = rbuO
157a0 70 65 6e 44 62 68 61 6e 64 6c 65 28 70 2c 20 7a  penDbhandle(p, z
157b0 54 61 72 67 65 74 2c 20 70 2d 3e 6e 52 62 75 3c  Target, p->nRbu<
157c0 3d 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  =1);.      sqlit
157d0 65 33 5f 66 72 65 65 28 7a 54 61 72 67 65 74 29  e3_free(zTarget)
157e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
157f0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
15800 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63  _OK ){.    p->rc
15810 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
15820 65 5f 66 75 6e 63 74 69 6f 6e 28 70 2d 3e 64 62  e_function(p->db
15830 4d 61 69 6e 2c 20 0a 20 20 20 20 20 20 20 20 22  Main, .        "
15840 72 62 75 5f 74 6d 70 5f 69 6e 73 65 72 74 22 2c  rbu_tmp_insert",
15850 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38   -1, SQLITE_UTF8
15860 2c 20 28 76 6f 69 64 2a 29 70 2c 20 72 62 75 54  , (void*)p, rbuT
15870 6d 70 49 6e 73 65 72 74 46 75 6e 63 2c 20 30 2c  mpInsertFunc, 0,
15880 20 30 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20   0.    );.  }.. 
15890 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
158a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d 3e  TE_OK ){.    p->
158b0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
158c0 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70 2d 3e  ate_function(p->
158d0 64 62 4d 61 69 6e 2c 20 0a 20 20 20 20 20 20 20  dbMain, .       
158e0 20 22 72 62 75 5f 66 6f 73 73 69 6c 5f 64 65 6c   "rbu_fossil_del
158f0 74 61 22 2c 20 32 2c 20 53 51 4c 49 54 45 5f 55  ta", 2, SQLITE_U
15900 54 46 38 2c 20 30 2c 20 72 62 75 46 6f 73 73 69  TF8, 0, rbuFossi
15910 6c 44 65 6c 74 61 46 75 6e 63 2c 20 30 2c 20 30  lDeltaFunc, 0, 0
15920 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 69  .    );.  }..  i
15930 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
15940 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63  _OK ){.    p->rc
15950 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
15960 65 5f 66 75 6e 63 74 69 6f 6e 28 70 2d 3e 64 62  e_function(p->db
15970 52 62 75 2c 20 0a 20 20 20 20 20 20 20 20 22 72  Rbu, .        "r
15980 62 75 5f 74 61 72 67 65 74 5f 6e 61 6d 65 22 2c  bu_target_name",
15990 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38   -1, SQLITE_UTF8
159a0 2c 20 28 76 6f 69 64 2a 29 70 2c 20 72 62 75 54  , (void*)p, rbuT
159b0 61 72 67 65 74 4e 61 6d 65 46 75 6e 63 2c 20 30  argetNameFunc, 0
159c0 2c 20 30 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a  , 0.    );.  }..
159d0 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
159e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d  ITE_OK ){.    p-
159f0 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69  >rc = sqlite3_fi
15a00 6c 65 5f 63 6f 6e 74 72 6f 6c 28 70 2d 3e 64 62  le_control(p->db
15a10 4d 61 69 6e 2c 20 22 6d 61 69 6e 22 2c 20 53 51  Main, "main", SQ
15a20 4c 49 54 45 5f 46 43 4e 54 4c 5f 52 42 55 2c 20  LITE_FCNTL_RBU, 
15a30 28 76 6f 69 64 2a 29 70 29 3b 0a 20 20 7d 0a 20  (void*)p);.  }. 
15a40 20 72 62 75 4d 50 72 69 6e 74 66 45 78 65 63 28   rbuMPrintfExec(
15a50 70 2c 20 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 53  p, p->dbMain, "S
15a60 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c  ELECT * FROM sql
15a70 69 74 65 5f 6d 61 73 74 65 72 22 29 3b 0a 0a 20  ite_master");.. 
15a80 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 64 61 74   /* Mark the dat
15a90 61 62 61 73 65 20 66 69 6c 65 20 6a 75 73 74 20  abase file just 
15aa0 6f 70 65 6e 65 64 20 61 73 20 61 6e 20 52 42 55  opened as an RBU
15ab0 20 74 61 72 67 65 74 20 64 61 74 61 62 61 73 65   target database
15ac0 2e 20 49 66 20 0a 20 20 2a 2a 20 74 68 69 73 20  . If .  ** this 
15ad0 63 61 6c 6c 20 72 65 74 75 72 6e 73 20 53 51 4c  call returns SQL
15ae0 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 2c 20 74 68  ITE_NOTFOUND, th
15af0 65 6e 20 74 68 65 20 52 42 55 20 76 66 73 20 69  en the RBU vfs i
15b00 73 20 6e 6f 74 20 69 6e 20 75 73 65 2e 0a 20 20  s not in use..  
15b10 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 65 72  ** This is an er
15b20 72 6f 72 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70  ror.  */.  if( p
15b30 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
15b40 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73  ){.    p->rc = s
15b50 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
15b60 72 6f 6c 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 22  rol(p->dbMain, "
15b70 6d 61 69 6e 22 2c 20 53 51 4c 49 54 45 5f 46 43  main", SQLITE_FC
15b80 4e 54 4c 5f 52 42 55 2c 20 28 76 6f 69 64 2a 29  NTL_RBU, (void*)
15b90 70 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  p);.  }..  if( p
15ba0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54  ->rc==SQLITE_NOT
15bb0 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 70 2d 3e  FOUND ){.    p->
15bc0 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
15bd0 52 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72 6d 73  R;.    p->zErrms
15be0 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  g = sqlite3_mpri
15bf0 6e 74 66 28 22 72 62 75 20 76 66 73 20 6e 6f 74  ntf("rbu vfs not
15c00 20 66 6f 75 6e 64 22 29 3b 0a 20 20 7d 0a 7d 0a   found");.  }.}.
15c10 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
15c20 69 6e 65 20 69 73 20 61 20 63 6f 70 79 20 6f 66  ine is a copy of
15c30 20 74 68 65 20 73 71 6c 69 74 65 33 46 69 6c 65   the sqlite3File
15c40 53 75 66 66 69 78 33 28 29 20 72 6f 75 74 69 6e  Suffix3() routin
15c50 65 20 66 72 6f 6d 20 74 68 65 20 63 6f 72 65 2e  e from the core.
15c60 0a 2a 2a 20 49 74 20 69 73 20 61 20 6e 6f 2d 6f  .** It is a no-o
15c70 70 20 75 6e 6c 65 73 73 20 53 51 4c 49 54 45 5f  p unless SQLITE_
15c80 45 4e 41 42 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53  ENABLE_8_3_NAMES
15c90 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a   is defined..**.
15ca0 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 45 4e 41  ** If SQLITE_ENA
15cb0 42 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53 20 69 73  BLE_8_3_NAMES is
15cc0 20 73 65 74 20 61 74 20 63 6f 6d 70 69 6c 65 2d   set at compile-
15cd0 74 69 6d 65 20 61 6e 64 20 69 66 20 74 68 65 20  time and if the 
15ce0 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65  database.** file
15cf0 6e 61 6d 65 20 69 6e 20 7a 42 61 73 65 46 69 6c  name in zBaseFil
15d00 65 6e 61 6d 65 20 69 73 20 61 20 55 52 49 20 77  ename is a URI w
15d10 69 74 68 20 74 68 65 20 22 38 5f 33 5f 6e 61 6d  ith the "8_3_nam
15d20 65 73 3d 31 22 20 70 61 72 61 6d 65 74 65 72 20  es=1" parameter 
15d30 61 6e 64 0a 2a 2a 20 69 66 20 66 69 6c 65 6e 61  and.** if filena
15d40 6d 65 20 69 6e 20 7a 5b 5d 20 68 61 73 20 61 20  me in z[] has a 
15d50 73 75 66 66 69 78 20 28 61 2e 6b 2e 61 2e 20 22  suffix (a.k.a. "
15d60 65 78 74 65 6e 73 69 6f 6e 22 29 20 74 68 61 74  extension") that
15d70 20 69 73 20 6c 6f 6e 67 65 72 20 74 68 61 6e 0a   is longer than.
15d80 2a 2a 20 74 68 72 65 65 20 63 68 61 72 61 63 74  ** three charact
15d90 65 72 73 2c 20 74 68 65 6e 20 73 68 6f 72 74 65  ers, then shorte
15da0 6e 20 74 68 65 20 73 75 66 66 69 78 20 6f 6e 20  n the suffix on 
15db0 7a 5b 5d 20 74 6f 20 62 65 20 74 68 65 20 6c 61  z[] to be the la
15dc0 73 74 20 74 68 72 65 65 0a 2a 2a 20 63 68 61 72  st three.** char
15dd0 61 63 74 65 72 73 20 6f 66 20 74 68 65 20 6f 72  acters of the or
15de0 69 67 69 6e 61 6c 20 73 75 66 66 69 78 2e 0a 2a  iginal suffix..*
15df0 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 45  *.** If SQLITE_E
15e00 4e 41 42 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53 20  NABLE_8_3_NAMES 
15e10 69 73 20 73 65 74 20 74 6f 20 32 20 61 74 20 63  is set to 2 at c
15e20 6f 6d 70 69 6c 65 2d 74 69 6d 65 2c 20 74 68 65  ompile-time, the
15e30 6e 20 61 6c 77 61 79 73 0a 2a 2a 20 64 6f 20 74  n always.** do t
15e40 68 65 20 73 75 66 66 69 78 20 73 68 6f 72 74 65  he suffix shorte
15e50 6e 69 6e 67 20 72 65 67 61 72 64 6c 65 73 73 20  ning regardless 
15e60 6f 66 20 55 52 49 20 70 61 72 61 6d 65 74 65 72  of URI parameter
15e70 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 73  ..**.** Examples
15e80 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 74 65 73 74  :.**.**     test
15e90 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 20 20 20 3d  .db-journal    =
15ea0 3e 20 20 20 74 65 73 74 2e 6e 61 6c 0a 2a 2a 20  >   test.nal.** 
15eb0 20 20 20 20 74 65 73 74 2e 64 62 2d 77 61 6c 20      test.db-wal 
15ec0 20 20 20 20 20 20 20 3d 3e 20 20 20 74 65 73 74         =>   test
15ed0 2e 77 61 6c 0a 2a 2a 20 20 20 20 20 74 65 73 74  .wal.**     test
15ee0 2e 64 62 2d 73 68 6d 20 20 20 20 20 20 20 20 3d  .db-shm        =
15ef0 3e 20 20 20 74 65 73 74 2e 73 68 6d 0a 2a 2a 20  >   test.shm.** 
15f00 20 20 20 20 74 65 73 74 2e 64 62 2d 6d 6a 37 66      test.db-mj7f
15f10 33 33 31 39 66 61 20 3d 3e 20 20 20 74 65 73 74  3319fa =>   test
15f20 2e 39 66 61 0a 2a 2f 0a 73 74 61 74 69 63 20 76  .9fa.*/.static v
15f30 6f 69 64 20 72 62 75 46 69 6c 65 53 75 66 66 69  oid rbuFileSuffi
15f40 78 33 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  x3(const char *z
15f50 42 61 73 65 2c 20 63 68 61 72 20 2a 7a 29 7b 0a  Base, char *z){.
15f60 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
15f70 41 42 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53 0a 23  ABLE_8_3_NAMES.#
15f80 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
15f90 5f 38 5f 33 5f 4e 41 4d 45 53 3c 32 0a 20 20 69  _8_3_NAMES<2.  i
15fa0 66 28 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62  f( sqlite3_uri_b
15fb0 6f 6f 6c 65 61 6e 28 7a 42 61 73 65 2c 20 22 38  oolean(zBase, "8
15fc0 5f 33 5f 6e 61 6d 65 73 22 2c 20 30 29 20 29 0a  _3_names", 0) ).
15fd0 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 69  #endif.  {.    i
15fe0 6e 74 20 69 2c 20 73 7a 3b 0a 20 20 20 20 73 7a  nt i, sz;.    sz
15ff0 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a   = (int)strlen(z
16000 29 26 30 78 66 66 66 66 66 66 3b 0a 20 20 20 20  )&0xffffff;.    
16010 66 6f 72 28 69 3d 73 7a 2d 31 3b 20 69 3e 30 20  for(i=sz-1; i>0 
16020 26 26 20 7a 5b 69 5d 21 3d 27 2f 27 20 26 26 20  && z[i]!='/' && 
16030 7a 5b 69 5d 21 3d 27 2e 27 3b 20 69 2d 2d 29 7b  z[i]!='.'; i--){
16040 7d 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d  }.    if( z[i]==
16050 27 2e 27 20 26 26 20 73 7a 3e 69 2b 34 20 29 20  '.' && sz>i+4 ) 
16060 6d 65 6d 6d 6f 76 65 28 26 7a 5b 69 2b 31 5d 2c  memmove(&z[i+1],
16070 20 26 7a 5b 73 7a 2d 33 5d 2c 20 34 29 3b 0a 20   &z[sz-3], 4);. 
16080 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a   }.#endif.}../*.
16090 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75  ** Return the cu
160a0 72 72 65 6e 74 20 77 61 6c 2d 69 6e 64 65 78 20  rrent wal-index 
160b0 68 65 61 64 65 72 20 63 68 65 63 6b 73 75 6d 20  header checksum 
160c0 66 6f 72 20 74 68 65 20 74 61 72 67 65 74 20 64  for the target d
160d0 61 74 61 62 61 73 65 20 0a 2a 2a 20 61 73 20 61  atabase .** as a
160e0 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 2e   64-bit integer.
160f0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 68 65 63 6b  .**.** The check
16100 73 75 6d 20 69 73 20 73 74 6f 72 65 20 69 6e 20  sum is store in 
16110 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
16120 66 20 78 53 68 6d 4d 61 70 20 6d 65 6d 6f 72 79  f xShmMap memory
16130 20 61 73 20 61 6e 20 38 2d 62 79 74 65 20 0a 2a   as an 8-byte .*
16140 2a 20 62 6c 6f 62 20 73 74 61 72 74 69 6e 67 20  * blob starting 
16150 61 74 20 62 79 74 65 20 6f 66 66 73 65 74 20 34  at byte offset 4
16160 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36 34  0..*/.static i64
16170 20 72 62 75 53 68 6d 43 68 65 63 6b 73 75 6d 28   rbuShmChecksum(
16180 73 71 6c 69 74 65 33 72 62 75 20 2a 70 29 7b 0a  sqlite3rbu *p){.
16190 20 20 69 36 34 20 69 52 65 74 20 3d 20 30 3b 0a    i64 iRet = 0;.
161a0 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
161b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
161c0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 44 62 20  lite3_file *pDb 
161d0 3d 20 70 2d 3e 70 54 61 72 67 65 74 46 64 2d 3e  = p->pTargetFd->
161e0 70 52 65 61 6c 3b 0a 20 20 20 20 75 33 32 20 76  pReal;.    u32 v
161f0 6f 6c 61 74 69 6c 65 20 2a 70 74 72 3b 0a 20 20  olatile *ptr;.  
16200 20 20 70 2d 3e 72 63 20 3d 20 70 44 62 2d 3e 70    p->rc = pDb->p
16210 4d 65 74 68 6f 64 73 2d 3e 78 53 68 6d 4d 61 70  Methods->xShmMap
16220 28 70 44 62 2c 20 30 2c 20 33 32 2a 31 30 32 34  (pDb, 0, 32*1024
16230 2c 20 30 2c 20 28 76 6f 69 64 20 76 6f 6c 61 74  , 0, (void volat
16240 69 6c 65 2a 2a 29 26 70 74 72 29 3b 0a 20 20 20  ile**)&ptr);.   
16250 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
16260 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
16270 52 65 74 20 3d 20 28 28 69 36 34 29 70 74 72 5b  Ret = ((i64)ptr[
16280 31 30 5d 20 3c 3c 20 33 32 29 20 2b 20 70 74 72  10] << 32) + ptr
16290 5b 31 31 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  [11];.    }.  }.
162a0 20 20 72 65 74 75 72 6e 20 69 52 65 74 3b 0a 7d    return iRet;.}
162b0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
162c0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
162d0 61 73 20 70 61 72 74 20 6f 66 20 69 6e 69 74 69  as part of initi
162e0 61 6c 69 7a 69 6e 67 20 6f 72 20 72 65 69 6e 69  alizing or reini
162f0 74 69 61 6c 69 7a 69 6e 67 20 61 6e 0a 2a 2a 20  tializing an.** 
16300 69 6e 63 72 65 6d 65 6e 74 61 6c 20 63 68 65 63  incremental chec
16310 6b 70 6f 69 6e 74 2e 20 0a 2a 2a 0a 2a 2a 20 49  kpoint. .**.** I
16320 74 20 70 6f 70 75 6c 61 74 65 73 20 74 68 65 20  t populates the 
16330 73 71 6c 69 74 65 33 72 62 75 2e 61 46 72 61 6d  sqlite3rbu.aFram
16340 65 5b 5d 20 61 72 72 61 79 20 77 69 74 68 20 74  e[] array with t
16350 68 65 20 73 65 74 20 6f 66 20 0a 2a 2a 20 28 77  he set of .** (w
16360 61 6c 20 66 72 61 6d 65 20 2d 3e 20 64 62 20 70  al frame -> db p
16370 61 67 65 29 20 63 6f 70 79 20 6f 70 65 72 61 74  age) copy operat
16380 69 6f 6e 73 20 72 65 71 75 69 72 65 64 20 74 6f  ions required to
16390 20 63 68 65 63 6b 70 6f 69 6e 74 20 74 68 65 20   checkpoint the 
163a0 0a 2a 2a 20 63 75 72 72 65 6e 74 20 77 61 6c 20  .** current wal 
163b0 66 69 6c 65 2c 20 61 6e 64 20 6f 62 74 61 69 6e  file, and obtain
163c0 73 20 74 68 65 20 73 65 74 20 6f 66 20 73 68 6d  s the set of shm
163d0 20 6c 6f 63 6b 73 20 72 65 71 75 69 72 65 64 20   locks required 
163e0 74 6f 20 73 61 66 65 6c 79 20 0a 2a 2a 20 70 65  to safely .** pe
163f0 72 66 6f 72 6d 20 74 68 65 20 63 6f 70 79 20 6f  rform the copy o
16400 70 65 72 61 74 69 6f 6e 73 20 64 69 72 65 63 74  perations direct
16410 6c 79 20 6f 6e 20 74 68 65 20 66 69 6c 65 2d 73  ly on the file-s
16420 79 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ystem..**.** If 
16430 61 72 67 75 6d 65 6e 74 20 70 53 74 61 74 65 20  argument pState 
16440 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  is not NULL, the
16450 6e 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61  n the incrementa
16460 6c 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 73 0a  l checkpoint is.
16470 2a 2a 20 62 65 69 6e 67 20 72 65 73 75 6d 65 64  ** being resumed
16480 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
16490 69 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  if the checksum 
164a0 6f 66 20 74 68 65 20 77 61 6c 2d 69 6e 64 65 78  of the wal-index
164b0 2d 68 65 61 64 65 72 0a 2a 2a 20 66 6f 6c 6c 6f  -header.** follo
164c0 77 69 6e 67 20 72 65 63 6f 76 65 72 79 20 69 73  wing recovery is
164d0 20 6e 6f 74 20 74 68 65 20 73 61 6d 65 20 61 73   not the same as
164e0 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 73 61   the checksum sa
164f0 76 65 64 20 69 6e 20 74 68 65 20 52 62 75 53 74  ved in the RbuSt
16500 61 74 65 0a 2a 2a 20 6f 62 6a 65 63 74 2c 20 74  ate.** object, t
16510 68 65 6e 20 74 68 65 20 72 62 75 20 68 61 6e 64  hen the rbu hand
16520 6c 65 20 69 73 20 73 65 74 20 74 6f 20 44 4f 4e  le is set to DON
16530 45 20 73 74 61 74 65 2e 20 54 68 69 73 20 6f 63  E state. This oc
16540 63 75 72 73 20 69 66 20 73 6f 6d 65 0a 2a 2a 20  curs if some.** 
16550 6f 74 68 65 72 20 63 6c 69 65 6e 74 20 61 70 70  other client app
16560 65 6e 64 73 20 61 20 74 72 61 6e 73 61 63 74 69  ends a transacti
16570 6f 6e 20 74 6f 20 74 68 65 20 77 61 6c 20 66 69  on to the wal fi
16580 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65  le in the middle
16590 20 6f 66 0a 2a 2a 20 61 6e 20 69 6e 63 72 65 6d   of.** an increm
165a0 65 6e 74 61 6c 20 63 68 65 63 6b 70 6f 69 6e 74  ental checkpoint
165b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
165c0 20 72 62 75 53 65 74 75 70 43 68 65 63 6b 70 6f   rbuSetupCheckpo
165d0 69 6e 74 28 73 71 6c 69 74 65 33 72 62 75 20 2a  int(sqlite3rbu *
165e0 70 2c 20 52 62 75 53 74 61 74 65 20 2a 70 53 74  p, RbuState *pSt
165f0 61 74 65 29 7b 0a 0a 20 20 2f 2a 20 49 66 20 70  ate){..  /* If p
16600 53 74 61 74 65 20 69 73 20 4e 55 4c 4c 2c 20 74  State is NULL, t
16610 68 65 6e 20 74 68 65 20 77 61 6c 20 66 69 6c 65  hen the wal file
16620 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 62 65   may not have be
16630 65 6e 20 6f 70 65 6e 65 64 20 61 6e 64 0a 20 20  en opened and.  
16640 2a 2a 20 72 65 63 6f 76 65 72 65 64 2e 20 52 75  ** recovered. Ru
16650 6e 6e 69 6e 67 20 61 20 72 65 61 64 2d 73 74 61  nning a read-sta
16660 74 65 6d 65 6e 74 20 68 65 72 65 20 74 6f 20 65  tement here to e
16670 6e 73 75 72 65 20 74 68 61 74 20 64 6f 69 6e 67  nsure that doing
16680 20 73 6f 0a 20 20 2a 2a 20 64 6f 65 73 20 6e 6f   so.  ** does no
16690 74 20 69 6e 74 65 72 66 65 72 65 20 77 69 74 68  t interfere with
166a0 20 74 68 65 20 22 63 61 70 74 75 72 65 22 20 70   the "capture" p
166b0 72 6f 63 65 73 73 20 62 65 6c 6f 77 2e 20 20 2a  rocess below.  *
166c0 2f 0a 20 20 69 66 28 20 70 53 74 61 74 65 3d 3d  /.  if( pState==
166d0 30 20 29 7b 0a 20 20 20 20 70 2d 3e 65 53 74 61  0 ){.    p->eSta
166e0 67 65 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  ge = 0;.    if( 
166f0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
16700 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20   ){.      p->rc 
16710 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70  = sqlite3_exec(p
16720 2d 3e 64 62 4d 61 69 6e 2c 20 22 53 45 4c 45 43  ->dbMain, "SELEC
16730 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  T * FROM sqlite_
16740 6d 61 73 74 65 72 22 2c 20 30 2c 20 30 2c 20 30  master", 0, 0, 0
16750 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
16760 2f 2a 20 41 73 73 75 6d 69 6e 67 20 6e 6f 20 65  /* Assuming no e
16770 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65  rror has occurre
16780 64 2c 20 72 75 6e 20 61 20 22 72 65 73 74 61 72  d, run a "restar
16790 74 22 20 63 68 65 63 6b 70 6f 69 6e 74 20 77 69  t" checkpoint wi
167a0 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69  th the.  ** sqli
167b0 74 65 33 72 62 75 2e 65 53 74 61 67 65 20 76 61  te3rbu.eStage va
167c0 72 69 61 62 6c 65 20 73 65 74 20 74 6f 20 43 41  riable set to CA
167d0 50 54 55 52 45 2e 20 54 68 69 73 20 74 75 72 6e  PTURE. This turn
167e0 73 20 6f 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  s on the followi
167f0 6e 67 0a 20 20 2a 2a 20 73 70 65 63 69 61 6c 20  ng.  ** special 
16800 62 65 68 61 76 69 6f 75 72 20 69 6e 20 74 68 65  behaviour in the
16810 20 72 62 75 20 56 46 53 3a 0a 20 20 2a 2a 0a 20   rbu VFS:.  **. 
16820 20 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 65   **   * If the e
16830 78 63 6c 75 73 69 76 65 20 73 68 6d 20 57 52 49  xclusive shm WRI
16840 54 45 52 20 6f 72 20 52 45 41 44 30 20 6c 6f 63  TER or READ0 loc
16850 6b 20 63 61 6e 6e 6f 74 20 62 65 20 6f 62 74 61  k cannot be obta
16860 69 6e 65 64 2c 0a 20 20 2a 2a 20 20 20 20 20 74  ined,.  **     t
16870 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 66 61  he checkpoint fa
16880 69 6c 73 20 77 69 74 68 20 53 51 4c 49 54 45 5f  ils with SQLITE_
16890 42 55 53 59 20 28 6e 6f 72 6d 61 6c 6c 79 20 53  BUSY (normally S
168a0 51 4c 69 74 65 20 77 6f 75 6c 64 0a 20 20 2a 2a  QLite would.  **
168b0 20 20 20 20 20 70 72 6f 63 65 65 64 20 77 69 74       proceed wit
168c0 68 20 72 75 6e 6e 69 6e 67 20 61 20 70 61 73 73  h running a pass
168d0 69 76 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 69  ive checkpoint i
168e0 6e 73 74 65 61 64 20 6f 66 20 66 61 69 6c 69 6e  nstead of failin
168f0 67 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  g)..  **.  **   
16900 2a 20 41 74 74 65 6d 70 74 73 20 74 6f 20 72 65  * Attempts to re
16910 61 64 20 66 72 6f 6d 20 74 68 65 20 2a 2d 77 61  ad from the *-wa
16920 6c 20 66 69 6c 65 20 6f 72 20 77 72 69 74 65 20  l file or write 
16930 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
16940 66 69 6c 65 0a 20 20 2a 2a 20 20 20 20 20 64 6f  file.  **     do
16950 20 6e 6f 74 20 70 65 72 66 6f 72 6d 20 61 6e 79   not perform any
16960 20 49 4f 2e 20 49 6e 73 74 65 61 64 2c 20 74 68   IO. Instead, th
16970 65 20 66 72 61 6d 65 2f 70 61 67 65 20 63 6f 6d  e frame/page com
16980 62 69 6e 61 74 69 6f 6e 73 20 74 68 61 74 0a 20  binations that. 
16990 20 2a 2a 20 20 20 20 20 77 6f 75 6c 64 20 62 65   **     would be
169a0 20 72 65 61 64 2f 77 72 69 74 74 65 6e 20 61 72   read/written ar
169b0 65 20 72 65 63 6f 72 64 65 64 20 69 6e 20 74 68  e recorded in th
169c0 65 20 73 71 6c 69 74 65 33 72 62 75 2e 61 46 72  e sqlite3rbu.aFr
169d0 61 6d 65 5b 5d 0a 20 20 2a 2a 20 20 20 20 20 61  ame[].  **     a
169e0 72 72 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rray..  **.  ** 
169f0 20 20 2a 20 43 61 6c 6c 73 20 74 6f 20 78 53 68    * Calls to xSh
16a00 6d 4c 6f 63 6b 28 55 4e 4c 4f 43 4b 29 20 74 6f  mLock(UNLOCK) to
16a10 20 72 65 6c 65 61 73 65 20 74 68 65 20 65 78 63   release the exc
16a20 6c 75 73 69 76 65 20 73 68 6d 20 57 52 49 54 45  lusive shm WRITE
16a30 52 2c 20 0a 20 20 2a 2a 20 20 20 20 20 52 45 41  R, .  **     REA
16a40 44 30 20 61 6e 64 20 43 48 45 43 4b 50 4f 49 4e  D0 and CHECKPOIN
16a50 54 20 6c 6f 63 6b 73 20 74 61 6b 65 6e 20 61 73  T locks taken as
16a60 20 70 61 72 74 20 6f 66 20 74 68 65 20 63 68 65   part of the che
16a70 63 6b 70 6f 69 6e 74 20 61 72 65 0a 20 20 2a 2a  ckpoint are.  **
16a80 20 20 20 20 20 6e 6f 2d 6f 70 73 2e 20 54 68 65       no-ops. The
16a90 73 65 20 6c 6f 63 6b 73 20 77 69 6c 6c 20 6e 6f  se locks will no
16aa0 74 20 62 65 20 72 65 6c 65 61 73 65 64 20 75 6e  t be released un
16ab0 74 69 6c 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  til the connecti
16ac0 6f 6e 0a 20 20 2a 2a 20 20 20 20 20 69 73 20 63  on.  **     is c
16ad0 6c 6f 73 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  losed..  **.  **
16ae0 20 20 20 2a 20 41 74 74 65 6d 70 74 69 6e 67 20     * Attempting 
16af0 74 6f 20 78 53 79 6e 63 28 29 20 74 68 65 20 64  to xSync() the d
16b00 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 61 75  atabase file cau
16b10 73 65 73 20 61 6e 20 53 51 4c 49 54 45 5f 49 4e  ses an SQLITE_IN
16b20 54 45 52 4e 41 4c 20 0a 20 20 2a 2a 20 20 20 20  TERNAL .  **    
16b30 20 65 72 72 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a   error..  **.  *
16b40 2a 20 41 73 20 61 20 72 65 73 75 6c 74 2c 20 75  * As a result, u
16b50 6e 6c 65 73 73 20 61 6e 20 65 72 72 6f 72 20 28  nless an error (
16b60 69 2e 65 2e 20 4f 4f 4d 20 6f 72 20 53 51 4c 49  i.e. OOM or SQLI
16b70 54 45 5f 42 55 53 59 29 20 6f 63 63 75 72 73 2c  TE_BUSY) occurs,
16b80 20 74 68 65 0a 20 20 2a 2a 20 63 68 65 63 6b 70   the.  ** checkp
16b90 6f 69 6e 74 20 62 65 6c 6f 77 20 66 61 69 6c 73  oint below fails
16ba0 20 77 69 74 68 20 53 51 4c 49 54 45 5f 49 4e 54   with SQLITE_INT
16bb0 45 52 4e 41 4c 2c 20 61 6e 64 20 6c 65 61 76 65  ERNAL, and leave
16bc0 73 20 74 68 65 20 61 46 72 61 6d 65 5b 5d 0a 20  s the aFrame[]. 
16bd0 20 2a 2a 20 61 72 72 61 79 20 70 6f 70 75 6c 61   ** array popula
16be0 74 65 64 20 77 69 74 68 20 61 20 73 65 74 20 6f  ted with a set o
16bf0 66 20 28 66 72 61 6d 65 20 2d 3e 20 70 61 67 65  f (frame -> page
16c00 29 20 6d 61 70 70 69 6e 67 73 2e 20 42 65 63 61  ) mappings. Beca
16c10 75 73 65 20 74 68 65 20 0a 20 20 2a 2a 20 57 52  use the .  ** WR
16c20 49 54 45 52 2c 20 43 48 45 43 4b 50 4f 49 4e 54  ITER, CHECKPOINT
16c30 20 61 6e 64 20 52 45 41 44 30 20 6c 6f 63 6b 73   and READ0 locks
16c40 20 61 72 65 20 73 74 69 6c 6c 20 68 65 6c 64 2c   are still held,
16c50 20 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 63   it is safe to c
16c60 6f 70 79 20 0a 20 20 2a 2a 20 64 61 74 61 20 66  opy .  ** data f
16c70 72 6f 6d 20 74 68 65 20 77 61 6c 20 66 69 6c 65  rom the wal file
16c80 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
16c90 73 65 20 66 69 6c 65 20 61 63 63 6f 72 64 69 6e  se file accordin
16ca0 67 20 74 6f 20 74 68 65 20 0a 20 20 2a 2a 20 63  g to the .  ** c
16cb0 6f 6e 74 65 6e 74 73 20 6f 66 20 61 46 72 61 6d  ontents of aFram
16cc0 65 5b 5d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  e[]..  */.  if( 
16cd0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
16ce0 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b   ){.    int rc2;
16cf0 0a 20 20 20 20 70 2d 3e 65 53 74 61 67 65 20 3d  .    p->eStage =
16d00 20 52 42 55 5f 53 54 41 47 45 5f 43 41 50 54 55   RBU_STAGE_CAPTU
16d10 52 45 3b 0a 20 20 20 20 72 63 32 20 3d 20 73 71  RE;.    rc2 = sq
16d20 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62  lite3_exec(p->db
16d30 4d 61 69 6e 2c 20 22 50 52 41 47 4d 41 20 6d 61  Main, "PRAGMA ma
16d40 69 6e 2e 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  in.wal_checkpoin
16d50 74 3d 72 65 73 74 61 72 74 22 2c 20 30 2c 20 30  t=restart", 0, 0
16d60 2c 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 32  ,0);.    if( rc2
16d70 21 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41  !=SQLITE_INTERNA
16d80 4c 20 29 20 70 2d 3e 72 63 20 3d 20 72 63 32 3b  L ) p->rc = rc2;
16d90 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72  .  }..  if( p->r
16da0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
16db0 70 2d 3e 6e 46 72 61 6d 65 3e 30 20 29 7b 0a 20  p->nFrame>0 ){. 
16dc0 20 20 20 70 2d 3e 65 53 74 61 67 65 20 3d 20 52     p->eStage = R
16dd0 42 55 5f 53 54 41 47 45 5f 43 4b 50 54 3b 0a 20  BU_STAGE_CKPT;. 
16de0 20 20 20 70 2d 3e 6e 53 74 65 70 20 3d 20 28 70     p->nStep = (p
16df0 53 74 61 74 65 20 3f 20 70 53 74 61 74 65 2d 3e  State ? pState->
16e00 6e 52 6f 77 20 3a 20 30 29 3b 0a 20 20 20 20 70  nRow : 0);.    p
16e10 2d 3e 61 42 75 66 20 3d 20 72 62 75 4d 61 6c 6c  ->aBuf = rbuMall
16e20 6f 63 28 70 2c 20 70 2d 3e 70 67 73 7a 29 3b 0a  oc(p, p->pgsz);.
16e30 20 20 20 20 70 2d 3e 69 57 61 6c 43 6b 73 75 6d      p->iWalCksum
16e40 20 3d 20 72 62 75 53 68 6d 43 68 65 63 6b 73 75   = rbuShmChecksu
16e50 6d 28 70 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  m(p);.  }..  if(
16e60 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
16e70 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  K ){.    if( p->
16e80 6e 46 72 61 6d 65 3d 3d 30 20 7c 7c 20 28 70 53  nFrame==0 || (pS
16e90 74 61 74 65 20 26 26 20 70 53 74 61 74 65 2d 3e  tate && pState->
16ea0 69 57 61 6c 43 6b 73 75 6d 21 3d 70 2d 3e 69 57  iWalCksum!=p->iW
16eb0 61 6c 43 6b 73 75 6d 29 20 29 7b 0a 20 20 20 20  alCksum) ){.    
16ec0 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
16ed0 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20 70 2d 3e  _DONE;.      p->
16ee0 65 53 74 61 67 65 20 3d 20 52 42 55 5f 53 54 41  eStage = RBU_STA
16ef0 47 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 65 6c  GE_DONE;.    }el
16f00 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 53  se{.      int nS
16f10 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20 20  ectorSize;.     
16f20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
16f30 44 62 20 3d 20 70 2d 3e 70 54 61 72 67 65 74 46  Db = p->pTargetF
16f40 64 2d 3e 70 52 65 61 6c 3b 0a 20 20 20 20 20 20  d->pReal;.      
16f50 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 57  sqlite3_file *pW
16f60 61 6c 20 3d 20 70 2d 3e 70 54 61 72 67 65 74 46  al = p->pTargetF
16f70 64 2d 3e 70 57 61 6c 46 64 2d 3e 70 52 65 61 6c  d->pWalFd->pReal
16f80 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
16f90 70 2d 3e 6e 50 61 67 65 50 65 72 53 65 63 74 6f  p->nPagePerSecto
16fa0 72 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e 53  r==0 );.      nS
16fb0 65 63 74 6f 72 53 69 7a 65 20 3d 20 70 44 62 2d  ectorSize = pDb-
16fc0 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53 65 63 74  >pMethods->xSect
16fd0 6f 72 53 69 7a 65 28 70 44 62 29 3b 0a 20 20 20  orSize(pDb);.   
16fe0 20 20 20 69 66 28 20 6e 53 65 63 74 6f 72 53 69     if( nSectorSi
16ff0 7a 65 3e 70 2d 3e 70 67 73 7a 20 29 7b 0a 20 20  ze>p->pgsz ){.  
17000 20 20 20 20 20 20 70 2d 3e 6e 50 61 67 65 50 65        p->nPagePe
17010 72 53 65 63 74 6f 72 20 3d 20 6e 53 65 63 74 6f  rSector = nSecto
17020 72 53 69 7a 65 20 2f 20 70 2d 3e 70 67 73 7a 3b  rSize / p->pgsz;
17030 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
17040 20 20 20 20 20 20 70 2d 3e 6e 50 61 67 65 50 65        p->nPagePe
17050 72 53 65 63 74 6f 72 20 3d 20 31 3b 0a 20 20 20  rSector = 1;.   
17060 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43     }..      /* C
17070 61 6c 6c 20 78 53 79 6e 63 28 29 20 6f 6e 20 74  all xSync() on t
17080 68 65 20 77 61 6c 20 66 69 6c 65 2e 20 54 68 69  he wal file. Thi
17090 73 20 63 61 75 73 65 73 20 53 51 4c 69 74 65 20  s causes SQLite 
170a0 74 6f 20 73 79 6e 63 20 74 68 65 20 0a 20 20 20  to sync the .   
170b0 20 20 20 2a 2a 20 64 69 72 65 63 74 6f 72 79 20     ** directory 
170c0 69 6e 20 77 68 69 63 68 20 74 68 65 20 74 61 72  in which the tar
170d0 67 65 74 20 64 61 74 61 62 61 73 65 20 61 6e 64  get database and
170e0 20 74 68 65 20 77 61 6c 20 66 69 6c 65 20 72 65   the wal file re
170f0 73 69 64 65 2c 20 69 6e 20 0a 20 20 20 20 20 20  side, in .      
17100 2a 2a 20 63 61 73 65 20 69 74 20 68 61 73 20 6e  ** case it has n
17110 6f 74 20 62 65 65 6e 20 73 79 6e 63 65 64 20 73  ot been synced s
17120 69 6e 63 65 20 74 68 65 20 72 65 6e 61 6d 65 28  ince the rename(
17130 29 20 63 61 6c 6c 20 69 6e 20 0a 20 20 20 20 20  ) call in .     
17140 20 2a 2a 20 72 62 75 4d 6f 76 65 4f 61 6c 46 69   ** rbuMoveOalFi
17150 6c 65 28 29 2e 20 2a 2f 0a 20 20 20 20 20 20 70  le(). */.      p
17160 2d 3e 72 63 20 3d 20 70 57 61 6c 2d 3e 70 4d 65  ->rc = pWal->pMe
17170 74 68 6f 64 73 2d 3e 78 53 79 6e 63 28 70 57 61  thods->xSync(pWa
17180 6c 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e  l, SQLITE_SYNC_N
17190 4f 52 4d 41 4c 29 3b 0a 20 20 20 20 7d 0a 20 20  ORMAL);.    }.  
171a0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 65  }.}../*.** Calle
171b0 64 20 77 68 65 6e 20 69 41 6d 74 20 62 79 74 65  d when iAmt byte
171c0 73 20 61 72 65 20 72 65 61 64 20 66 72 6f 6d 20  s are read from 
171d0 6f 66 66 73 65 74 20 69 4f 66 66 20 6f 66 20 74  offset iOff of t
171e0 68 65 20 77 61 6c 20 66 69 6c 65 20 77 68 69 6c  he wal file whil
171f0 65 0a 2a 2a 20 74 68 65 20 72 62 75 20 6f 62 6a  e.** the rbu obj
17200 65 63 74 20 69 73 20 69 6e 20 63 61 70 74 75 72  ect is in captur
17210 65 20 6d 6f 64 65 2e 20 52 65 63 6f 72 64 20 74  e mode. Record t
17220 68 65 20 66 72 61 6d 65 20 6e 75 6d 62 65 72 20  he frame number 
17230 6f 66 20 74 68 65 20 66 72 61 6d 65 0a 2a 2a 20  of the frame.** 
17240 62 65 69 6e 67 20 72 65 61 64 20 69 6e 20 74 68  being read in th
17250 65 20 61 46 72 61 6d 65 5b 5d 20 61 72 72 61 79  e aFrame[] array
17260 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
17270 72 62 75 43 61 70 74 75 72 65 57 61 6c 52 65 61  rbuCaptureWalRea
17280 64 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 52  d(sqlite3rbu *pR
17290 62 75 2c 20 69 36 34 20 69 4f 66 66 2c 20 69 6e  bu, i64 iOff, in
172a0 74 20 69 41 6d 74 29 7b 0a 20 20 63 6f 6e 73 74  t iAmt){.  const
172b0 20 75 33 32 20 6d 52 65 71 20 3d 20 28 31 3c 3c   u32 mReq = (1<<
172c0 57 41 4c 5f 4c 4f 43 4b 5f 57 52 49 54 45 29 7c  WAL_LOCK_WRITE)|
172d0 28 31 3c 3c 57 41 4c 5f 4c 4f 43 4b 5f 43 4b 50  (1<<WAL_LOCK_CKP
172e0 54 29 7c 28 31 3c 3c 57 41 4c 5f 4c 4f 43 4b 5f  T)|(1<<WAL_LOCK_
172f0 52 45 41 44 30 29 3b 0a 20 20 75 33 32 20 69 46  READ0);.  u32 iF
17300 72 61 6d 65 3b 0a 0a 20 20 69 66 28 20 70 52 62  rame;..  if( pRb
17310 75 2d 3e 6d 4c 6f 63 6b 21 3d 6d 52 65 71 20 29  u->mLock!=mReq )
17320 7b 0a 20 20 20 20 70 52 62 75 2d 3e 72 63 20 3d  {.    pRbu->rc =
17330 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
17340 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
17350 49 4e 54 45 52 4e 41 4c 3b 0a 20 20 7d 0a 0a 20  INTERNAL;.  }.. 
17360 20 70 52 62 75 2d 3e 70 67 73 7a 20 3d 20 69 41   pRbu->pgsz = iA
17370 6d 74 3b 0a 20 20 69 66 28 20 70 52 62 75 2d 3e  mt;.  if( pRbu->
17380 6e 46 72 61 6d 65 3d 3d 70 52 62 75 2d 3e 6e 46  nFrame==pRbu->nF
17390 72 61 6d 65 41 6c 6c 6f 63 20 29 7b 0a 20 20 20  rameAlloc ){.   
173a0 20 69 6e 74 20 6e 4e 65 77 20 3d 20 28 70 52 62   int nNew = (pRb
173b0 75 2d 3e 6e 46 72 61 6d 65 41 6c 6c 6f 63 20 3f  u->nFrameAlloc ?
173c0 20 70 52 62 75 2d 3e 6e 46 72 61 6d 65 41 6c 6c   pRbu->nFrameAll
173d0 6f 63 20 3a 20 36 34 29 20 2a 20 32 3b 0a 20 20  oc : 64) * 2;.  
173e0 20 20 52 62 75 46 72 61 6d 65 20 2a 61 4e 65 77    RbuFrame *aNew
173f0 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20 28 52 62  ;.    aNew = (Rb
17400 75 46 72 61 6d 65 2a 29 73 71 6c 69 74 65 33 5f  uFrame*)sqlite3_
17410 72 65 61 6c 6c 6f 63 36 34 28 70 52 62 75 2d 3e  realloc64(pRbu->
17420 61 46 72 61 6d 65 2c 20 6e 4e 65 77 20 2a 20 73  aFrame, nNew * s
17430 69 7a 65 6f 66 28 52 62 75 46 72 61 6d 65 29 29  izeof(RbuFrame))
17440 3b 0a 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d  ;.    if( aNew==
17450 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
17460 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 70 52 62  E_NOMEM;.    pRb
17470 75 2d 3e 61 46 72 61 6d 65 20 3d 20 61 4e 65 77  u->aFrame = aNew
17480 3b 0a 20 20 20 20 70 52 62 75 2d 3e 6e 46 72 61  ;.    pRbu->nFra
17490 6d 65 41 6c 6c 6f 63 20 3d 20 6e 4e 65 77 3b 0a  meAlloc = nNew;.
174a0 20 20 7d 0a 0a 20 20 69 46 72 61 6d 65 20 3d 20    }..  iFrame = 
174b0 28 75 33 32 29 28 28 69 4f 66 66 2d 33 32 29 20  (u32)((iOff-32) 
174c0 2f 20 28 69 36 34 29 28 69 41 6d 74 2b 32 34 29  / (i64)(iAmt+24)
174d0 29 20 2b 20 31 3b 0a 20 20 69 66 28 20 70 52 62  ) + 1;.  if( pRb
174e0 75 2d 3e 69 4d 61 78 46 72 61 6d 65 3c 69 46 72  u->iMaxFrame<iFr
174f0 61 6d 65 20 29 20 70 52 62 75 2d 3e 69 4d 61 78  ame ) pRbu->iMax
17500 46 72 61 6d 65 20 3d 20 69 46 72 61 6d 65 3b 0a  Frame = iFrame;.
17510 20 20 70 52 62 75 2d 3e 61 46 72 61 6d 65 5b 70    pRbu->aFrame[p
17520 52 62 75 2d 3e 6e 46 72 61 6d 65 5d 2e 69 57 61  Rbu->nFrame].iWa
17530 6c 46 72 61 6d 65 20 3d 20 69 46 72 61 6d 65 3b  lFrame = iFrame;
17540 0a 20 20 70 52 62 75 2d 3e 61 46 72 61 6d 65 5b  .  pRbu->aFrame[
17550 70 52 62 75 2d 3e 6e 46 72 61 6d 65 5d 2e 69 44  pRbu->nFrame].iD
17560 62 50 61 67 65 20 3d 20 30 3b 0a 20 20 70 52 62  bPage = 0;.  pRb
17570 75 2d 3e 6e 46 72 61 6d 65 2b 2b 3b 0a 20 20 72  u->nFrame++;.  r
17580 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
17590 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 65 64  .}../*.** Called
175a0 20 77 68 65 6e 20 61 20 70 61 67 65 20 6f 66 20   when a page of 
175b0 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20  data is written 
175c0 74 6f 20 6f 66 66 73 65 74 20 69 4f 66 66 20 6f  to offset iOff o
175d0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  f the database.*
175e0 2a 20 66 69 6c 65 20 77 68 69 6c 65 20 74 68 65  * file while the
175f0 20 72 62 75 20 68 61 6e 64 6c 65 20 69 73 20 69   rbu handle is i
17600 6e 20 63 61 70 74 75 72 65 20 6d 6f 64 65 2e 20  n capture mode. 
17610 52 65 63 6f 72 64 20 74 68 65 20 70 61 67 65 20  Record the page 
17620 6e 75 6d 62 65 72 20 0a 2a 2a 20 6f 66 20 74 68  number .** of th
17630 65 20 70 61 67 65 20 62 65 69 6e 67 20 77 72 69  e page being wri
17640 74 74 65 6e 20 69 6e 20 74 68 65 20 61 46 72 61  tten in the aFra
17650 6d 65 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73  me[] array..*/.s
17660 74 61 74 69 63 20 69 6e 74 20 72 62 75 43 61 70  tatic int rbuCap
17670 74 75 72 65 44 62 57 72 69 74 65 28 73 71 6c 69  tureDbWrite(sqli
17680 74 65 33 72 62 75 20 2a 70 52 62 75 2c 20 69 36  te3rbu *pRbu, i6
17690 34 20 69 4f 66 66 29 7b 0a 20 20 70 52 62 75 2d  4 iOff){.  pRbu-
176a0 3e 61 46 72 61 6d 65 5b 70 52 62 75 2d 3e 6e 46  >aFrame[pRbu->nF
176b0 72 61 6d 65 2d 31 5d 2e 69 44 62 50 61 67 65 20  rame-1].iDbPage 
176c0 3d 20 28 75 33 32 29 28 69 4f 66 66 20 2f 20 70  = (u32)(iOff / p
176d0 52 62 75 2d 3e 70 67 73 7a 29 20 2b 20 31 3b 0a  Rbu->pgsz) + 1;.
176e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
176f0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  OK;.}../*.** Thi
17700 73 20 69 73 20 63 61 6c 6c 65 64 20 61 73 20 70  s is called as p
17710 61 72 74 20 6f 66 20 61 6e 20 69 6e 63 72 65 6d  art of an increm
17720 65 6e 74 61 6c 20 63 68 65 63 6b 70 6f 69 6e 74  ental checkpoint
17730 20 6f 70 65 72 61 74 69 6f 6e 2e 20 43 6f 70 79   operation. Copy
17740 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 66 72 61  .** a single fra
17750 6d 65 20 6f 66 20 64 61 74 61 20 66 72 6f 6d 20  me of data from 
17760 74 68 65 20 77 61 6c 20 66 69 6c 65 20 69 6e 74  the wal file int
17770 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
17780 69 6c 65 2c 20 61 73 0a 2a 2a 20 69 6e 64 69 63  ile, as.** indic
17790 61 74 65 64 20 62 79 20 74 68 65 20 52 62 75 46  ated by the RbuF
177a0 72 61 6d 65 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  rame object..*/.
177b0 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75 43  static void rbuC
177c0 68 65 63 6b 70 6f 69 6e 74 46 72 61 6d 65 28 73  heckpointFrame(s
177d0 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 52 62  qlite3rbu *p, Rb
177e0 75 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 29 7b  uFrame *pFrame){
177f0 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
17800 2a 70 57 61 6c 20 3d 20 70 2d 3e 70 54 61 72 67  *pWal = p->pTarg
17810 65 74 46 64 2d 3e 70 57 61 6c 46 64 2d 3e 70 52  etFd->pWalFd->pR
17820 65 61 6c 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  eal;.  sqlite3_f
17830 69 6c 65 20 2a 70 44 62 20 3d 20 70 2d 3e 70 54  ile *pDb = p->pT
17840 61 72 67 65 74 46 64 2d 3e 70 52 65 61 6c 3b 0a  argetFd->pReal;.
17850 20 20 69 36 34 20 69 4f 66 66 3b 0a 0a 20 20 61    i64 iOff;..  a
17860 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51  ssert( p->rc==SQ
17870 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 4f 66  LITE_OK );.  iOf
17880 66 20 3d 20 28 69 36 34 29 28 70 46 72 61 6d 65  f = (i64)(pFrame
17890 2d 3e 69 57 61 6c 46 72 61 6d 65 2d 31 29 20 2a  ->iWalFrame-1) *
178a0 20 28 70 2d 3e 70 67 73 7a 20 2b 20 32 34 29 20   (p->pgsz + 24) 
178b0 2b 20 33 32 20 2b 20 32 34 3b 0a 20 20 70 2d 3e  + 32 + 24;.  p->
178c0 72 63 20 3d 20 70 57 61 6c 2d 3e 70 4d 65 74 68  rc = pWal->pMeth
178d0 6f 64 73 2d 3e 78 52 65 61 64 28 70 57 61 6c 2c  ods->xRead(pWal,
178e0 20 70 2d 3e 61 42 75 66 2c 20 70 2d 3e 70 67 73   p->aBuf, p->pgs
178f0 7a 2c 20 69 4f 66 66 29 3b 0a 20 20 69 66 28 20  z, iOff);.  if( 
17900 70 2d 3e 72 63 20 29 20 72 65 74 75 72 6e 3b 0a  p->rc ) return;.
17910 0a 20 20 69 4f 66 66 20 3d 20 28 69 36 34 29 28  .  iOff = (i64)(
17920 70 46 72 61 6d 65 2d 3e 69 44 62 50 61 67 65 2d  pFrame->iDbPage-
17930 31 29 20 2a 20 70 2d 3e 70 67 73 7a 3b 0a 20 20  1) * p->pgsz;.  
17940 70 2d 3e 72 63 20 3d 20 70 44 62 2d 3e 70 4d 65  p->rc = pDb->pMe
17950 74 68 6f 64 73 2d 3e 78 57 72 69 74 65 28 70 44  thods->xWrite(pD
17960 62 2c 20 70 2d 3e 61 42 75 66 2c 20 70 2d 3e 70  b, p->aBuf, p->p
17970 67 73 7a 2c 20 69 4f 66 66 29 3b 0a 7d 0a 0a 0a  gsz, iOff);.}...
17980 2f 2a 0a 2a 2a 20 54 61 6b 65 20 61 6e 20 45 58  /*.** Take an EX
17990 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
179a0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
179b0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
179c0 64 20 72 62 75 4c 6f 63 6b 44 61 74 61 62 61 73  d rbuLockDatabas
179d0 65 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 29  e(sqlite3rbu *p)
179e0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  {.  sqlite3_file
179f0 20 2a 70 52 65 61 6c 20 3d 20 70 2d 3e 70 54 61   *pReal = p->pTa
17a00 72 67 65 74 46 64 2d 3e 70 52 65 61 6c 3b 0a 20  rgetFd->pReal;. 
17a10 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d   assert( p->rc==
17a20 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 70  SQLITE_OK );.  p
17a30 2d 3e 72 63 20 3d 20 70 52 65 61 6c 2d 3e 70 4d  ->rc = pReal->pM
17a40 65 74 68 6f 64 73 2d 3e 78 4c 6f 63 6b 28 70 52  ethods->xLock(pR
17a50 65 61 6c 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  eal, SQLITE_LOCK
17a60 5f 53 48 41 52 45 44 29 3b 0a 20 20 69 66 28 20  _SHARED);.  if( 
17a70 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
17a80 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
17a90 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d  pReal->pMethods-
17aa0 3e 78 4c 6f 63 6b 28 70 52 65 61 6c 2c 20 53 51  >xLock(pReal, SQ
17ab0 4c 49 54 45 5f 4c 4f 43 4b 5f 45 58 43 4c 55 53  LITE_LOCK_EXCLUS
17ac0 49 56 45 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  IVE);.  }.}..#if
17ad0 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 5f   defined(_WIN32_
17ae0 57 43 45 29 0a 73 74 61 74 69 63 20 4c 50 57 53  WCE).static LPWS
17af0 54 52 20 72 62 75 57 69 6e 55 74 66 38 54 6f 55  TR rbuWinUtf8ToU
17b00 6e 69 63 6f 64 65 28 63 6f 6e 73 74 20 63 68 61  nicode(const cha
17b10 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20  r *zFilename){. 
17b20 20 69 6e 74 20 6e 43 68 61 72 3b 0a 20 20 4c 50   int nChar;.  LP
17b30 57 53 54 52 20 7a 57 69 64 65 46 69 6c 65 6e 61  WSTR zWideFilena
17b40 6d 65 3b 0a 0a 20 20 6e 43 68 61 72 20 3d 20 4d  me;..  nChar = M
17b50 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68  ultiByteToWideCh
17b60 61 72 28 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a  ar(CP_UTF8, 0, z
17b70 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 4e 55  Filename, -1, NU
17b80 4c 4c 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e 43  LL, 0);.  if( nC
17b90 68 61 72 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  har==0 ){.    re
17ba0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 57  turn 0;.  }.  zW
17bb0 69 64 65 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71  ideFilename = sq
17bc0 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20  lite3_malloc64( 
17bd0 6e 43 68 61 72 2a 73 69 7a 65 6f 66 28 7a 57 69  nChar*sizeof(zWi
17be0 64 65 46 69 6c 65 6e 61 6d 65 5b 30 5d 29 20 29  deFilename[0]) )
17bf0 3b 0a 20 20 69 66 28 20 7a 57 69 64 65 46 69 6c  ;.  if( zWideFil
17c00 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  ename==0 ){.    
17c10 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
17c20 6d 65 6d 73 65 74 28 7a 57 69 64 65 46 69 6c 65  memset(zWideFile
17c30 6e 61 6d 65 2c 20 30 2c 20 6e 43 68 61 72 2a 73  name, 0, nChar*s
17c40 69 7a 65 6f 66 28 7a 57 69 64 65 46 69 6c 65 6e  izeof(zWideFilen
17c50 61 6d 65 5b 30 5d 29 29 3b 0a 20 20 6e 43 68 61  ame[0]));.  nCha
17c60 72 20 3d 20 4d 75 6c 74 69 42 79 74 65 54 6f 57  r = MultiByteToW
17c70 69 64 65 43 68 61 72 28 43 50 5f 55 54 46 38 2c  ideChar(CP_UTF8,
17c80 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d   0, zFilename, -
17c90 31 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  1, zWideFilename
17ca0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
17cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17cc0 20 20 6e 43 68 61 72 29 3b 0a 20 20 69 66 28 20    nChar);.  if( 
17cd0 6e 43 68 61 72 3d 3d 30 20 29 7b 0a 20 20 20 20  nChar==0 ){.    
17ce0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 57 69  sqlite3_free(zWi
17cf0 64 65 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  deFilename);.   
17d00 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 20 3d   zWideFilename =
17d10 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
17d20 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 3b 0a   zWideFilename;.
17d30 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
17d40 54 68 65 20 52 42 55 20 68 61 6e 64 6c 65 20 69  The RBU handle i
17d50 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 52  s currently in R
17d60 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20 73 74 61  BU_STAGE_OAL sta
17d70 74 65 2c 20 77 69 74 68 20 61 20 53 48 41 52 45  te, with a SHARE
17d80 44 20 6c 6f 63 6b 0a 2a 2a 20 6f 6e 20 74 68 65  D lock.** on the
17d90 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
17da0 54 68 69 73 20 70 72 6f 63 20 6d 6f 76 65 73 20  This proc moves 
17db0 74 68 65 20 2a 2d 6f 61 6c 20 66 69 6c 65 20 74  the *-oal file t
17dc0 6f 20 74 68 65 20 2a 2d 77 61 6c 20 70 61 74 68  o the *-wal path
17dd0 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 6f 70 65 6e  ,.** then reopen
17de0 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  s the database f
17df0 69 6c 65 20 28 74 68 69 73 20 74 69 6d 65 20 69  ile (this time i
17e00 6e 20 76 61 6e 69 6c 6c 61 2c 20 6e 6f 6e 2d 6f  n vanilla, non-o
17e10 61 6c 2c 20 57 41 4c 20 6d 6f 64 65 29 2e 0a 2a  al, WAL mode)..*
17e20 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
17e30 63 75 72 73 2c 20 6c 65 61 76 65 20 61 6e 20 65  curs, leave an e
17e40 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 65 72  rror code and er
17e50 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 74  ror message in t
17e60 68 65 20 72 62 75 20 0a 2a 2a 20 68 61 6e 64 6c  he rbu .** handl
17e70 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
17e80 64 20 72 62 75 4d 6f 76 65 4f 61 6c 46 69 6c 65  d rbuMoveOalFile
17e90 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 29 7b  (sqlite3rbu *p){
17ea0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
17eb0 42 61 73 65 20 3d 20 73 71 6c 69 74 65 33 5f 64  Base = sqlite3_d
17ec0 62 5f 66 69 6c 65 6e 61 6d 65 28 70 2d 3e 64 62  b_filename(p->db
17ed0 4d 61 69 6e 2c 20 22 6d 61 69 6e 22 29 3b 0a 20  Main, "main");. 
17ee0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 6f   const char *zMo
17ef0 76 65 20 3d 20 7a 42 61 73 65 3b 0a 20 20 63 68  ve = zBase;.  ch
17f00 61 72 20 2a 7a 4f 61 6c 3b 0a 20 20 63 68 61 72  ar *zOal;.  char
17f10 20 2a 7a 57 61 6c 3b 0a 0a 20 20 69 66 28 20 72   *zWal;..  if( r
17f20 62 75 49 73 56 61 63 75 75 6d 28 70 29 20 29 7b  buIsVacuum(p) ){
17f30 0a 20 20 20 20 7a 4d 6f 76 65 20 3d 20 73 71 6c  .    zMove = sql
17f40 69 74 65 33 5f 64 62 5f 66 69 6c 65 6e 61 6d 65  ite3_db_filename
17f50 28 70 2d 3e 64 62 52 62 75 2c 20 22 6d 61 69 6e  (p->dbRbu, "main
17f60 22 29 3b 0a 20 20 7d 0a 20 20 7a 4f 61 6c 20 3d  ");.  }.  zOal =
17f70 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
17f80 28 22 25 73 2d 6f 61 6c 22 2c 20 7a 4d 6f 76 65  ("%s-oal", zMove
17f90 29 3b 0a 20 20 7a 57 61 6c 20 3d 20 73 71 6c 69  );.  zWal = sqli
17fa0 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 2d  te3_mprintf("%s-
17fb0 77 61 6c 22 2c 20 7a 4d 6f 76 65 29 3b 0a 0a 20  wal", zMove);.. 
17fc0 20 61 73 73 65 72 74 28 20 70 2d 3e 65 53 74 61   assert( p->eSta
17fd0 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4d 4f  ge==RBU_STAGE_MO
17fe0 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  VE );.  assert( 
17ff0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
18000 20 26 26 20 70 2d 3e 7a 45 72 72 6d 73 67 3d 3d   && p->zErrmsg==
18010 30 20 29 3b 0a 20 20 69 66 28 20 7a 57 61 6c 3d  0 );.  if( zWal=
18020 3d 30 20 7c 7c 20 7a 4f 61 6c 3d 3d 30 20 29 7b  =0 || zOal==0 ){
18030 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  .    p->rc = SQL
18040 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c  ITE_NOMEM;.  }el
18050 73 65 7b 0a 20 20 20 20 2f 2a 20 4d 6f 76 65 20  se{.    /* Move 
18060 74 68 65 20 2a 2d 6f 61 6c 20 66 69 6c 65 20 74  the *-oal file t
18070 6f 20 2a 2d 77 61 6c 2e 20 41 74 20 74 68 69 73  o *-wal. At this
18080 20 70 6f 69 6e 74 20 63 6f 6e 6e 65 63 74 69 6f   point connectio
18090 6e 20 70 2d 3e 64 62 20 69 73 0a 20 20 20 20 2a  n p->db is.    *
180a0 2a 20 68 6f 6c 64 69 6e 67 20 61 20 53 48 41 52  * holding a SHAR
180b0 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74  ED lock on the t
180c0 61 72 67 65 74 20 64 61 74 61 62 61 73 65 20 66  arget database f
180d0 69 6c 65 20 28 62 65 63 61 75 73 65 20 69 74 20  ile (because it 
180e0 69 73 0a 20 20 20 20 2a 2a 20 69 6e 20 57 41 4c  is.    ** in WAL
180f0 20 6d 6f 64 65 29 2e 20 53 6f 20 6e 6f 20 6f 74   mode). So no ot
18100 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d  her connection m
18110 61 79 20 62 65 20 77 72 69 74 69 6e 67 20 74 68  ay be writing th
18120 65 20 64 62 2e 20 0a 20 20 20 20 2a 2a 0a 20 20  e db. .    **.  
18130 20 20 2a 2a 20 49 6e 20 6f 72 64 65 72 20 74 6f    ** In order to
18140 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
18150 72 65 20 61 72 65 20 6e 6f 20 64 61 74 61 62 61  re are no databa
18160 73 65 20 72 65 61 64 65 72 73 2c 20 61 6e 20 45  se readers, an E
18170 58 43 4c 55 53 49 56 45 0a 20 20 20 20 2a 2a 20  XCLUSIVE.    ** 
18180 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64  lock is obtained
18190 20 68 65 72 65 20 62 65 66 6f 72 65 20 74 68 65   here before the
181a0 20 2a 2d 6f 61 6c 20 69 73 20 6d 6f 76 65 64 20   *-oal is moved 
181b0 74 6f 20 2a 2d 77 61 6c 2e 0a 20 20 20 20 2a 2f  to *-wal..    */
181c0 0a 20 20 20 20 72 62 75 4c 6f 63 6b 44 61 74 61  .    rbuLockData
181d0 62 61 73 65 28 70 29 3b 0a 20 20 20 20 69 66 28  base(p);.    if(
181e0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
181f0 4b 20 29 7b 0a 20 20 20 20 20 20 72 62 75 46 69  K ){.      rbuFi
18200 6c 65 53 75 66 66 69 78 33 28 7a 42 61 73 65 2c  leSuffix3(zBase,
18210 20 7a 57 61 6c 29 3b 0a 20 20 20 20 20 20 72 62   zWal);.      rb
18220 75 46 69 6c 65 53 75 66 66 69 78 33 28 7a 42 61  uFileSuffix3(zBa
18230 73 65 2c 20 7a 4f 61 6c 29 3b 0a 0a 20 20 20 20  se, zOal);..    
18240 20 20 2f 2a 20 52 65 2d 6f 70 65 6e 20 74 68 65    /* Re-open the
18250 20 64 61 74 61 62 61 73 65 73 2e 20 2a 2f 0a 20   databases. */. 
18260 20 20 20 20 20 72 62 75 4f 62 6a 49 74 65 72 46       rbuObjIterF
18270 69 6e 61 6c 69 7a 65 28 26 70 2d 3e 6f 62 6a 69  inalize(&p->obji
18280 74 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ter);.      sqli
18290 74 65 33 5f 63 6c 6f 73 65 28 70 2d 3e 64 62 52  te3_close(p->dbR
182a0 62 75 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  bu);.      sqlit
182b0 65 33 5f 63 6c 6f 73 65 28 70 2d 3e 64 62 4d 61  e3_close(p->dbMa
182c0 69 6e 29 3b 0a 20 20 20 20 20 20 70 2d 3e 64 62  in);.      p->db
182d0 4d 61 69 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  Main = 0;.      
182e0 70 2d 3e 64 62 52 62 75 20 3d 20 30 3b 0a 0a 23  p->dbRbu = 0;..#
182f0 69 66 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33  if defined(_WIN3
18300 32 5f 57 43 45 29 0a 20 20 20 20 20 20 7b 0a 20  2_WCE).      {. 
18310 20 20 20 20 20 20 20 4c 50 57 53 54 52 20 7a 57         LPWSTR zW
18320 69 64 65 4f 61 6c 3b 0a 20 20 20 20 20 20 20 20  ideOal;.        
18330 4c 50 57 53 54 52 20 7a 57 69 64 65 57 61 6c 3b  LPWSTR zWideWal;
18340 0a 0a 20 20 20 20 20 20 20 20 7a 57 69 64 65 4f  ..        zWideO
18350 61 6c 20 3d 20 72 62 75 57 69 6e 55 74 66 38 54  al = rbuWinUtf8T
18360 6f 55 6e 69 63 6f 64 65 28 7a 4f 61 6c 29 3b 0a  oUnicode(zOal);.
18370 20 20 20 20 20 20 20 20 69 66 28 20 7a 57 69 64          if( zWid
18380 65 4f 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  eOal ){.        
18390 20 20 7a 57 69 64 65 57 61 6c 20 3d 20 72 62 75    zWideWal = rbu
183a0 57 69 6e 55 74 66 38 54 6f 55 6e 69 63 6f 64 65  WinUtf8ToUnicode
183b0 28 7a 57 61 6c 29 3b 0a 20 20 20 20 20 20 20 20  (zWal);.        
183c0 20 20 69 66 28 20 7a 57 69 64 65 57 61 6c 20 29    if( zWideWal )
183d0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
183e0 28 20 4d 6f 76 65 46 69 6c 65 57 28 7a 57 69 64  ( MoveFileW(zWid
183f0 65 4f 61 6c 2c 20 7a 57 69 64 65 57 61 6c 29 20  eOal, zWideWal) 
18400 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
18410 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
18420 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  OK;.            
18430 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
18440 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c       p->rc = SQL
18450 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 20  ITE_IOERR;.     
18460 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
18470 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
18480 65 28 7a 57 69 64 65 57 61 6c 29 3b 0a 20 20 20  e(zWideWal);.   
18490 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
184a0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20            p->rc 
184b0 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  = SQLITE_IOERR_N
184c0 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20  OMEM;.          
184d0 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  }.          sqli
184e0 74 65 33 5f 66 72 65 65 28 7a 57 69 64 65 4f 61  te3_free(zWideOa
184f0 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  l);.        }els
18500 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  e{.          p->
18510 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
18520 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  R_NOMEM;.       
18530 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6c 73 65   }.      }.#else
18540 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72  .      p->rc = r
18550 65 6e 61 6d 65 28 7a 4f 61 6c 2c 20 7a 57 61 6c  ename(zOal, zWal
18560 29 20 3f 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ) ? SQLITE_IOERR
18570 20 3a 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65   : SQLITE_OK;.#e
18580 6e 64 69 66 0a 0a 20 20 20 20 20 20 69 66 28 20  ndif..      if( 
18590 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
185a0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 62 75 4f   ){.        rbuO
185b0 70 65 6e 44 61 74 61 62 61 73 65 28 70 2c 20 30  penDatabase(p, 0
185c0 29 3b 0a 20 20 20 20 20 20 20 20 72 62 75 53 65  );.        rbuSe
185d0 74 75 70 43 68 65 63 6b 70 6f 69 6e 74 28 70 2c  tupCheckpoint(p,
185e0 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
185f0 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65   }.  }..  sqlite
18600 33 5f 66 72 65 65 28 7a 57 61 6c 29 3b 0a 20 20  3_free(zWal);.  
18610 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 61  sqlite3_free(zOa
18620 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  l);.}../*.** The
18630 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
18640 74 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f  t iterating thro
18650 75 67 68 20 74 68 65 20 6b 65 79 73 20 66 6f 72  ugh the keys for
18660 20 74 68 65 20 63 75 72 72 65 6e 74 20 6f 62 6a   the current obj
18670 65 63 74 0a 2a 2a 20 28 70 2d 3e 6f 62 6a 69 74  ect.** (p->objit
18680 65 72 2e 70 53 65 6c 65 63 74 29 20 63 75 72 72  er.pSelect) curr
18690 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20  ently points to 
186a0 61 20 76 61 6c 69 64 20 72 6f 77 2e 20 54 68 69  a valid row. Thi
186b0 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 64 65  s function.** de
186c0 74 65 72 6d 69 6e 65 73 20 74 68 65 20 74 79 70  termines the typ
186d0 65 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 20 72  e of operation r
186e0 65 71 75 65 73 74 65 64 20 62 79 20 74 68 69 73  equested by this
186f0 20 72 6f 77 20 61 6e 64 20 72 65 74 75 72 6e 73   row and returns
18700 0a 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 66  .** one of the f
18710 6f 6c 6c 6f 77 69 6e 67 20 76 61 6c 75 65 73 20  ollowing values 
18720 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 65 20  to indicate the 
18730 72 65 73 75 6c 74 3a 0a 2a 2a 0a 2a 2a 20 20 20  result:.**.**   
18740 20 20 2a 20 52 42 55 5f 49 4e 53 45 52 54 0a 2a    * RBU_INSERT.*
18750 2a 20 20 20 20 20 2a 20 52 42 55 5f 44 45 4c 45  *     * RBU_DELE
18760 54 45 0a 2a 2a 20 20 20 20 20 2a 20 52 42 55 5f  TE.**     * RBU_
18770 49 44 58 5f 44 45 4c 45 54 45 0a 2a 2a 20 20 20  IDX_DELETE.**   
18780 20 20 2a 20 52 42 55 5f 55 50 44 41 54 45 0a 2a    * RBU_UPDATE.*
18790 2a 0a 2a 2a 20 49 66 20 52 42 55 5f 55 50 44 41  *.** If RBU_UPDA
187a0 54 45 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  TE is returned, 
187b0 74 68 65 6e 20 6f 75 74 70 75 74 20 76 61 72 69  then output vari
187c0 61 62 6c 65 20 2a 70 7a 4d 61 73 6b 20 69 73 20  able *pzMask is 
187d0 73 65 74 20 74 6f 0a 2a 2a 20 70 6f 69 6e 74 20  set to.** point 
187e0 74 6f 20 74 68 65 20 74 65 78 74 20 76 61 6c 75  to the text valu
187f0 65 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 65  e indicating the
18800 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 75 70 64 61   columns to upda
18810 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  te..**.** If the
18820 20 72 62 75 5f 63 6f 6e 74 72 6f 6c 20 66 69 65   rbu_control fie
18830 6c 64 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69  ld contains an i
18840 6e 76 61 6c 69 64 20 76 61 6c 75 65 2c 20 61 6e  nvalid value, an
18850 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 0a   error code and.
18860 2a 2a 20 6d 65 73 73 61 67 65 20 61 72 65 20 6c  ** message are l
18870 65 66 74 20 69 6e 20 74 68 65 20 52 42 55 20 68  eft in the RBU h
18880 61 6e 64 6c 65 20 61 6e 64 20 7a 65 72 6f 20 72  andle and zero r
18890 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
188a0 69 63 20 69 6e 74 20 72 62 75 53 74 65 70 54 79  ic int rbuStepTy
188b0 70 65 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70  pe(sqlite3rbu *p
188c0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70  , const char **p
188d0 7a 4d 61 73 6b 29 7b 0a 20 20 69 6e 74 20 69 43  zMask){.  int iC
188e0 6f 6c 20 3d 20 70 2d 3e 6f 62 6a 69 74 65 72 2e  ol = p->objiter.
188f0 6e 43 6f 6c 3b 20 20 20 20 20 2f 2a 20 49 6e 64  nCol;     /* Ind
18900 65 78 20 6f 66 20 72 62 75 5f 63 6f 6e 74 72 6f  ex of rbu_contro
18910 6c 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e  l column */.  in
18920 74 20 72 65 73 20 3d 20 30 3b 20 20 20 20 20 20  t res = 0;      
18930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18940 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f   Return value */
18950 0a 0a 20 20 73 77 69 74 63 68 28 20 73 71 6c 69  ..  switch( sqli
18960 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28  te3_column_type(
18970 70 2d 3e 6f 62 6a 69 74 65 72 2e 70 53 65 6c 65  p->objiter.pSele
18980 63 74 2c 20 69 43 6f 6c 29 20 29 7b 0a 20 20 20  ct, iCol) ){.   
18990 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54   case SQLITE_INT
189a0 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e  EGER: {.      in
189b0 74 20 69 56 61 6c 20 3d 20 73 71 6c 69 74 65 33  t iVal = sqlite3
189c0 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 2d 3e 6f  _column_int(p->o
189d0 62 6a 69 74 65 72 2e 70 53 65 6c 65 63 74 2c 20  bjiter.pSelect, 
189e0 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 73 77 69  iCol);.      swi
189f0 74 63 68 28 20 69 56 61 6c 20 29 7b 0a 20 20 20  tch( iVal ){.   
18a00 20 20 20 20 20 63 61 73 65 20 30 3a 20 72 65 73       case 0: res
18a10 20 3d 20 52 42 55 5f 49 4e 53 45 52 54 3b 20 20   = RBU_INSERT;  
18a20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
18a30 20 20 63 61 73 65 20 31 3a 20 72 65 73 20 3d 20    case 1: res = 
18a40 52 42 55 5f 44 45 4c 45 54 45 3b 20 20 20 20 20  RBU_DELETE;     
18a50 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63  break;.        c
18a60 61 73 65 20 32 3a 20 72 65 73 20 3d 20 52 42 55  ase 2: res = RBU
18a70 5f 52 45 50 4c 41 43 45 3b 20 20 20 20 62 72 65  _REPLACE;    bre
18a80 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65  ak;.        case
18a90 20 33 3a 20 72 65 73 20 3d 20 52 42 55 5f 49 44   3: res = RBU_ID
18aa0 58 5f 44 45 4c 45 54 45 3b 20 62 72 65 61 6b 3b  X_DELETE; break;
18ab0 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 34 3a  .        case 4:
18ac0 20 72 65 73 20 3d 20 52 42 55 5f 49 44 58 5f 49   res = RBU_IDX_I
18ad0 4e 53 45 52 54 3b 20 62 72 65 61 6b 3b 0a 20 20  NSERT; break;.  
18ae0 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
18af0 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61  k;.    }..    ca
18b00 73 65 20 53 51 4c 49 54 45 5f 54 45 58 54 3a 20  se SQLITE_TEXT: 
18b10 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75 6e  {.      const un
18b20 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 20 3d  signed char *z =
18b30 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
18b40 74 65 78 74 28 70 2d 3e 6f 62 6a 69 74 65 72 2e  text(p->objiter.
18b50 70 53 65 6c 65 63 74 2c 20 69 43 6f 6c 29 3b 0a  pSelect, iCol);.
18b60 20 20 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29        if( z==0 )
18b70 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20  {.        p->rc 
18b80 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
18b90 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
18ba0 20 20 20 20 20 2a 70 7a 4d 61 73 6b 20 3d 20 28       *pzMask = (
18bb0 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a 3b 0a 20  const char*)z;. 
18bc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 73       }.      res
18bd0 20 3d 20 52 42 55 5f 55 50 44 41 54 45 3b 0a 0a   = RBU_UPDATE;..
18be0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
18bf0 20 7d 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a   }..    default:
18c00 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
18c10 7d 0a 0a 20 20 69 66 28 20 72 65 73 3d 3d 30 20  }..  if( res==0 
18c20 29 7b 0a 20 20 20 20 72 62 75 42 61 64 43 6f 6e  ){.    rbuBadCon
18c30 74 72 6f 6c 45 72 72 6f 72 28 70 29 3b 0a 20 20  trolError(p);.  
18c40 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a  }.  return res;.
18c50 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
18c60 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 41 73 73  _DEBUG./*.** Ass
18c70 65 72 74 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20  ert that column 
18c80 69 43 6f 6c 20 6f 66 20 73 74 61 74 65 6d 65 6e  iCol of statemen
18c90 74 20 70 53 74 6d 74 20 69 73 20 6e 61 6d 65 64  t pStmt is named
18ca0 20 7a 4e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69   zName..*/.stati
18cb0 63 20 76 6f 69 64 20 61 73 73 65 72 74 43 6f 6c  c void assertCol
18cc0 75 6d 6e 4e 61 6d 65 28 73 71 6c 69 74 65 33 5f  umnName(sqlite3_
18cd0 73 74 6d 74 20 2a 70 53 74 6d 74 2c 20 69 6e 74  stmt *pStmt, int
18ce0 20 69 43 6f 6c 2c 20 63 6f 6e 73 74 20 63 68 61   iCol, const cha
18cf0 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 63 6f 6e  r *zName){.  con
18d00 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 20 3d 20  st char *zCol = 
18d10 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e  sqlite3_column_n
18d20 61 6d 65 28 70 53 74 6d 74 2c 20 69 43 6f 6c 29  ame(pStmt, iCol)
18d30 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 73  ;.  assert( 0==s
18d40 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a  qlite3_stricmp(z
18d50 4e 61 6d 65 2c 20 7a 43 6f 6c 29 20 29 3b 0a 7d  Name, zCol) );.}
18d60 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
18d70 61 73 73 65 72 74 43 6f 6c 75 6d 6e 4e 61 6d 65  assertColumnName
18d80 28 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a  (x,y,z).#endif..
18d90 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 65  /*.** Argument e
18da0 54 79 70 65 20 6d 75 73 74 20 62 65 20 6f 6e 65  Type must be one
18db0 20 6f 66 20 52 42 55 5f 49 4e 53 45 52 54 2c 20   of RBU_INSERT, 
18dc0 52 42 55 5f 44 45 4c 45 54 45 2c 20 52 42 55 5f  RBU_DELETE, RBU_
18dd0 49 44 58 5f 49 4e 53 45 52 54 20 6f 72 0a 2a 2a  IDX_INSERT or.**
18de0 20 52 42 55 5f 49 44 58 5f 44 45 4c 45 54 45 2e   RBU_IDX_DELETE.
18df0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 70   This function p
18e00 65 72 66 6f 72 6d 73 20 74 68 65 20 77 6f 72 6b  erforms the work
18e10 20 6f 66 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20   of a single.** 
18e20 73 71 6c 69 74 65 33 72 62 75 5f 73 74 65 70 28  sqlite3rbu_step(
18e30 29 20 63 61 6c 6c 20 66 6f 72 20 74 68 65 20 74  ) call for the t
18e40 79 70 65 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e  ype of operation
18e50 20 73 70 65 63 69 66 69 65 64 20 62 79 20 65 54   specified by eT
18e60 79 70 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ype..*/.static v
18e70 6f 69 64 20 72 62 75 53 74 65 70 4f 6e 65 4f 70  oid rbuStepOneOp
18e80 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20  (sqlite3rbu *p, 
18e90 69 6e 74 20 65 54 79 70 65 29 7b 0a 20 20 52 62  int eType){.  Rb
18ea0 75 4f 62 6a 49 74 65 72 20 2a 70 49 74 65 72 20  uObjIter *pIter 
18eb0 3d 20 26 70 2d 3e 6f 62 6a 69 74 65 72 3b 0a 20  = &p->objiter;. 
18ec0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
18ed0 70 56 61 6c 3b 0a 20 20 73 71 6c 69 74 65 33 5f  pVal;.  sqlite3_
18ee0 73 74 6d 74 20 2a 70 57 72 69 74 65 72 3b 0a 20  stmt *pWriter;. 
18ef0 20 69 6e 74 20 69 3b 0a 0a 20 20 61 73 73 65 72   int i;..  asser
18f00 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  t( p->rc==SQLITE
18f10 5f 4f 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _OK );.  assert(
18f20 20 65 54 79 70 65 21 3d 52 42 55 5f 44 45 4c 45   eType!=RBU_DELE
18f30 54 45 20 7c 7c 20 70 49 74 65 72 2d 3e 7a 49 64  TE || pIter->zId
18f40 78 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  x==0 );.  assert
18f50 28 20 65 54 79 70 65 3d 3d 52 42 55 5f 44 45 4c  ( eType==RBU_DEL
18f60 45 54 45 20 7c 7c 20 65 54 79 70 65 3d 3d 52 42  ETE || eType==RB
18f70 55 5f 49 44 58 5f 44 45 4c 45 54 45 0a 20 20 20  U_IDX_DELETE.   
18f80 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 52 42      || eType==RB
18f90 55 5f 49 4e 53 45 52 54 20 7c 7c 20 65 54 79 70  U_INSERT || eTyp
18fa0 65 3d 3d 52 42 55 5f 49 44 58 5f 49 4e 53 45 52  e==RBU_IDX_INSER
18fb0 54 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  T.  );..  /* If 
18fc0 74 68 69 73 20 69 73 20 61 20 64 65 6c 65 74 65  this is a delete
18fd0 2c 20 64 65 63 72 65 6d 65 6e 74 20 6e 50 68 61  , decrement nPha
18fe0 73 65 4f 6e 65 53 74 65 70 20 62 79 20 6e 49 6e  seOneStep by nIn
18ff0 64 65 78 2e 20 49 66 20 74 68 65 20 44 45 4c 45  dex. If the DELE
19000 54 45 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e  TE.  ** statemen
19010 74 20 62 65 6c 6f 77 20 64 6f 65 73 20 61 63 74  t below does act
19020 75 61 6c 6c 79 20 64 65 6c 65 74 65 20 61 20 72  ually delete a r
19030 6f 77 2c 20 6e 50 68 61 73 65 4f 6e 65 53 74 65  ow, nPhaseOneSte
19040 70 20 77 69 6c 6c 20 62 65 0a 20 20 2a 2a 20 69  p will be.  ** i
19050 6e 63 72 65 6d 65 6e 74 65 64 20 62 79 20 74 68  ncremented by th
19060 65 20 73 61 6d 65 20 61 6d 6f 75 6e 74 20 77 68  e same amount wh
19070 65 6e 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20  en SQL function 
19080 72 62 75 5f 74 6d 70 5f 69 6e 73 65 72 74 28 29  rbu_tmp_insert()
19090 0a 20 20 2a 2a 20 69 73 20 69 6e 76 6f 6b 65 64  .  ** is invoked
190a0 20 62 79 20 74 68 65 20 74 72 69 67 67 65 72 2e   by the trigger.
190b0 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65    */.  if( eType
190c0 3d 3d 52 42 55 5f 44 45 4c 45 54 45 20 29 7b 0a  ==RBU_DELETE ){.
190d0 20 20 20 20 70 2d 3e 6e 50 68 61 73 65 4f 6e 65      p->nPhaseOne
190e0 53 74 65 70 20 2d 3d 20 70 2d 3e 6f 62 6a 69 74  Step -= p->objit
190f0 65 72 2e 6e 49 6e 64 65 78 3b 0a 20 20 7d 0a 0a  er.nIndex;.  }..
19100 20 20 69 66 28 20 65 54 79 70 65 3d 3d 52 42 55    if( eType==RBU
19110 5f 49 44 58 5f 44 45 4c 45 54 45 20 7c 7c 20 65  _IDX_DELETE || e
19120 54 79 70 65 3d 3d 52 42 55 5f 44 45 4c 45 54 45  Type==RBU_DELETE
19130 20 29 7b 0a 20 20 20 20 70 57 72 69 74 65 72 20   ){.    pWriter 
19140 3d 20 70 49 74 65 72 2d 3e 70 44 65 6c 65 74 65  = pIter->pDelete
19150 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
19160 57 72 69 74 65 72 20 3d 20 70 49 74 65 72 2d 3e  Writer = pIter->
19170 70 49 6e 73 65 72 74 3b 0a 20 20 7d 0a 0a 20 20  pInsert;.  }..  
19180 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72  for(i=0; i<pIter
19190 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCol; i++){.  
191a0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
191b0 61 6e 20 49 4e 53 45 52 54 20 69 6e 74 6f 20 61  an INSERT into a
191c0 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20 61 6e   table b-tree an
191d0 64 20 74 68 65 20 74 61 62 6c 65 20 68 61 73 20  d the table has 
191e0 61 6e 0a 20 20 20 20 2a 2a 20 65 78 70 6c 69 63  an.    ** explic
191f0 69 74 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  it INTEGER PRIMA
19200 52 59 20 4b 45 59 2c 20 63 68 65 63 6b 20 74 68  RY KEY, check th
19210 61 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61  at this is not a
19220 6e 20 61 74 74 65 6d 70 74 0a 20 20 20 20 2a 2a  n attempt.    **
19230 20 74 6f 20 77 72 69 74 65 20 61 20 4e 55 4c 4c   to write a NULL
19240 20 69 6e 74 6f 20 74 68 65 20 49 50 4b 20 63 6f   into the IPK co
19250 6c 75 6d 6e 2e 20 54 68 61 74 20 69 73 20 6e 6f  lumn. That is no
19260 74 20 70 65 72 6d 69 74 74 65 64 2e 20 20 2a 2f  t permitted.  */
19270 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d  .    if( eType==
19280 52 42 55 5f 49 4e 53 45 52 54 20 0a 20 20 20 20  RBU_INSERT .    
19290 20 26 26 20 70 49 74 65 72 2d 3e 7a 49 64 78 3d   && pIter->zIdx=
192a0 3d 30 20 26 26 20 70 49 74 65 72 2d 3e 65 54 79  =0 && pIter->eTy
192b0 70 65 3d 3d 52 42 55 5f 50 4b 5f 49 50 4b 20 26  pe==RBU_PK_IPK &
192c0 26 20 70 49 74 65 72 2d 3e 61 62 54 62 6c 50 6b  & pIter->abTblPk
192d0 5b 69 5d 20 0a 20 20 20 20 20 26 26 20 73 71 6c  [i] .     && sql
192e0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65  ite3_column_type
192f0 28 70 49 74 65 72 2d 3e 70 53 65 6c 65 63 74 2c  (pIter->pSelect,
19300 20 69 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c   i)==SQLITE_NULL
19310 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70 2d  .    ){.      p-
19320 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4d 49 53  >rc = SQLITE_MIS
19330 4d 41 54 43 48 3b 0a 20 20 20 20 20 20 70 2d 3e  MATCH;.      p->
19340 7a 45 72 72 6d 73 67 20 3d 20 73 71 6c 69 74 65  zErrmsg = sqlite
19350 33 5f 6d 70 72 69 6e 74 66 28 22 64 61 74 61 74  3_mprintf("datat
19360 79 70 65 20 6d 69 73 6d 61 74 63 68 22 29 3b 0a  ype mismatch");.
19370 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
19380 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 65 54 79    }..    if( eTy
19390 70 65 3d 3d 52 42 55 5f 44 45 4c 45 54 45 20 26  pe==RBU_DELETE &
193a0 26 20 70 49 74 65 72 2d 3e 61 62 54 62 6c 50 6b  & pIter->abTblPk
193b0 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  [i]==0 ){.      
193c0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
193d0 0a 20 20 20 20 70 56 61 6c 20 3d 20 73 71 6c 69  .    pVal = sqli
193e0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65  te3_column_value
193f0 28 70 49 74 65 72 2d 3e 70 53 65 6c 65 63 74 2c  (pIter->pSelect,
19400 20 69 29 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d   i);.    p->rc =
19410 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 76 61   sqlite3_bind_va
19420 6c 75 65 28 70 57 72 69 74 65 72 2c 20 69 2b 31  lue(pWriter, i+1
19430 2c 20 70 56 61 6c 29 3b 0a 20 20 20 20 69 66 28  , pVal);.    if(
19440 20 70 2d 3e 72 63 20 29 20 72 65 74 75 72 6e 3b   p->rc ) return;
19450 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 74 65 72  .  }.  if( pIter
19460 2d 3e 7a 49 64 78 3d 3d 30 20 29 7b 0a 20 20 20  ->zIdx==0 ){.   
19470 20 69 66 28 20 70 49 74 65 72 2d 3e 65 54 79 70   if( pIter->eTyp
19480 65 3d 3d 52 42 55 5f 50 4b 5f 56 54 41 42 20 0a  e==RBU_PK_VTAB .
19490 20 20 20 20 20 7c 7c 20 70 49 74 65 72 2d 3e 65       || pIter->e
194a0 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 4e 4f 4e  Type==RBU_PK_NON
194b0 45 20 0a 20 20 20 20 20 7c 7c 20 28 70 49 74 65  E .     || (pIte
194c0 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b  r->eType==RBU_PK
194d0 5f 45 58 54 45 52 4e 41 4c 20 26 26 20 72 62 75  _EXTERNAL && rbu
194e0 49 73 56 61 63 75 75 6d 28 70 29 29 20 0a 20 20  IsVacuum(p)) .  
194f0 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 6f    ){.      /* Fo
19500 72 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  r a virtual tabl
19510 65 2c 20 6f 72 20 61 20 74 61 62 6c 65 20 77 69  e, or a table wi
19520 74 68 20 6e 6f 20 70 72 69 6d 61 72 79 20 6b 65  th no primary ke
19530 79 2c 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a  y, the .      **
19540 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
19550 74 20 69 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20  t is:.      **. 
19560 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54       **   SELECT
19570 20 3c 63 6f 6c 73 3e 2c 20 72 62 75 5f 63 6f 6e   <cols>, rbu_con
19580 74 72 6f 6c 2c 20 72 62 75 5f 72 6f 77 69 64 20  trol, rbu_rowid 
19590 46 52 4f 4d 20 2e 2e 2e 2e 0a 20 20 20 20 20 20  FROM .....      
195a0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 48 65 6e 63  **.      ** Henc
195b0 65 20 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28 70  e column_value(p
195c0 49 74 65 72 2d 3e 6e 43 6f 6c 2b 31 29 2e 0a 20  Iter->nCol+1).. 
195d0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
195e0 73 65 72 74 43 6f 6c 75 6d 6e 4e 61 6d 65 28 70  sertColumnName(p
195f0 49 74 65 72 2d 3e 70 53 65 6c 65 63 74 2c 20 70  Iter->pSelect, p
19600 49 74 65 72 2d 3e 6e 43 6f 6c 2b 31 2c 20 0a 20  Iter->nCol+1, . 
19610 20 20 20 20 20 20 20 20 20 72 62 75 49 73 56 61           rbuIsVa
19620 63 75 75 6d 28 70 29 20 3f 20 22 72 6f 77 69 64  cuum(p) ? "rowid
19630 22 20 3a 20 22 72 62 75 5f 72 6f 77 69 64 22 0a  " : "rbu_rowid".
19640 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 70        );.      p
19650 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  Val = sqlite3_co
19660 6c 75 6d 6e 5f 76 61 6c 75 65 28 70 49 74 65 72  lumn_value(pIter
19670 2d 3e 70 53 65 6c 65 63 74 2c 20 70 49 74 65 72  ->pSelect, pIter
19680 2d 3e 6e 43 6f 6c 2b 31 29 3b 0a 20 20 20 20 20  ->nCol+1);.     
19690 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33   p->rc = sqlite3
196a0 5f 62 69 6e 64 5f 76 61 6c 75 65 28 70 57 72 69  _bind_value(pWri
196b0 74 65 72 2c 20 70 49 74 65 72 2d 3e 6e 43 6f 6c  ter, pIter->nCol
196c0 2b 31 2c 20 70 56 61 6c 29 3b 0a 20 20 20 20 7d  +1, pVal);.    }
196d0 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 72 63  .  }.  if( p->rc
196e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
196f0 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28     sqlite3_step(
19700 70 57 72 69 74 65 72 29 3b 0a 20 20 20 20 70 2d  pWriter);.    p-
19710 3e 72 63 20 3d 20 72 65 73 65 74 41 6e 64 43 6f  >rc = resetAndCo
19720 6c 6c 65 63 74 45 72 72 6f 72 28 70 57 72 69 74  llectError(pWrit
19730 65 72 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 29  er, &p->zErrmsg)
19740 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
19750 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  his function doe
19760 73 20 74 68 65 20 77 6f 72 6b 20 66 6f 72 20 61  s the work for a
19770 6e 20 73 71 6c 69 74 65 33 72 62 75 5f 73 74 65  n sqlite3rbu_ste
19780 70 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20  p() call..**.** 
19790 54 68 65 20 6f 62 6a 65 63 74 2d 69 74 65 72 61  The object-itera
197a0 74 6f 72 20 28 70 2d 3e 6f 62 6a 69 74 65 72 29  tor (p->objiter)
197b0 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
197c0 73 20 74 6f 20 61 20 76 61 6c 69 64 20 6f 62 6a  s to a valid obj
197d0 65 63 74 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20  ect,.** and the 
197e0 69 6e 70 75 74 20 63 75 72 73 6f 72 20 28 70 2d  input cursor (p-
197f0 3e 6f 62 6a 69 74 65 72 2e 70 53 65 6c 65 63 74  >objiter.pSelect
19800 29 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  ) currently poin
19810 74 73 20 74 6f 20 61 20 76 61 6c 69 64 0a 2a 2a  ts to a valid.**
19820 20 69 6e 70 75 74 20 72 6f 77 2e 20 50 65 72 66   input row. Perf
19830 6f 72 6d 20 77 68 61 74 65 76 65 72 20 70 72 6f  orm whatever pro
19840 63 65 73 73 69 6e 67 20 69 73 20 72 65 71 75 69  cessing is requi
19850 72 65 64 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a  red and return..
19860 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 20 65 72 72  **.** If no  err
19870 6f 72 20 6f 63 63 75 72 73 2c 20 53 51 4c 49 54  or occurs, SQLIT
19880 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
19890 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20  . Otherwise, an 
198a0 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 61 6e  error code.** an
198b0 64 20 6d 65 73 73 61 67 65 20 69 73 20 6c 65 66  d message is lef
198c0 74 20 69 6e 20 74 68 65 20 52 42 55 20 68 61 6e  t in the RBU han
198d0 64 6c 65 20 61 6e 64 20 61 20 63 6f 70 79 20 6f  dle and a copy o
198e0 66 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  f the error code
198f0 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f  .** returned..*/
19900 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 53  .static int rbuS
19910 74 65 70 28 73 71 6c 69 74 65 33 72 62 75 20 2a  tep(sqlite3rbu *
19920 70 29 7b 0a 20 20 52 62 75 4f 62 6a 49 74 65 72  p){.  RbuObjIter
19930 20 2a 70 49 74 65 72 20 3d 20 26 70 2d 3e 6f 62   *pIter = &p->ob
19940 6a 69 74 65 72 3b 0a 20 20 63 6f 6e 73 74 20 63  jiter;.  const c
19950 68 61 72 20 2a 7a 4d 61 73 6b 20 3d 20 30 3b 0a  har *zMask = 0;.
19960 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20 72 62    int eType = rb
19970 75 53 74 65 70 54 79 70 65 28 70 2c 20 26 7a 4d  uStepType(p, &zM
19980 61 73 6b 29 3b 0a 0a 20 20 69 66 28 20 65 54 79  ask);..  if( eTy
19990 70 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  pe ){.    assert
199a0 28 20 65 54 79 70 65 3d 3d 52 42 55 5f 49 4e 53  ( eType==RBU_INS
199b0 45 52 54 20 20 20 20 20 7c 7c 20 65 54 79 70 65  ERT     || eType
199c0 3d 3d 52 42 55 5f 44 45 4c 45 54 45 0a 20 20 20  ==RBU_DELETE.   
199d0 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d        || eType==
199e0 52 42 55 5f 52 45 50 4c 41 43 45 20 20 20 20 7c  RBU_REPLACE    |
199f0 7c 20 65 54 79 70 65 3d 3d 52 42 55 5f 49 44 58  | eType==RBU_IDX
19a00 5f 44 45 4c 45 54 45 0a 20 20 20 20 20 20 20 20  _DELETE.        
19a10 20 7c 7c 20 65 54 79 70 65 3d 3d 52 42 55 5f 49   || eType==RBU_I
19a20 44 58 5f 49 4e 53 45 52 54 20 7c 7c 20 65 54 79  DX_INSERT || eTy
19a30 70 65 3d 3d 52 42 55 5f 55 50 44 41 54 45 0a 20  pe==RBU_UPDATE. 
19a40 20 20 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74     );.    assert
19a50 28 20 65 54 79 70 65 21 3d 52 42 55 5f 55 50 44  ( eType!=RBU_UPD
19a60 41 54 45 20 7c 7c 20 70 49 74 65 72 2d 3e 7a 49  ATE || pIter->zI
19a70 64 78 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 69 66  dx==0 );..    if
19a80 28 20 70 49 74 65 72 2d 3e 7a 49 64 78 3d 3d 30  ( pIter->zIdx==0
19a90 20 26 26 20 28 65 54 79 70 65 3d 3d 52 42 55 5f   && (eType==RBU_
19aa0 49 44 58 5f 44 45 4c 45 54 45 20 7c 7c 20 65 54  IDX_DELETE || eT
19ab0 79 70 65 3d 3d 52 42 55 5f 49 44 58 5f 49 4e 53  ype==RBU_IDX_INS
19ac0 45 52 54 29 20 29 7b 0a 20 20 20 20 20 20 72 62  ERT) ){.      rb
19ad0 75 42 61 64 43 6f 6e 74 72 6f 6c 45 72 72 6f 72  uBadControlError
19ae0 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65  (p);.    }.    e
19af0 6c 73 65 20 69 66 28 20 65 54 79 70 65 3d 3d 52  lse if( eType==R
19b00 42 55 5f 52 45 50 4c 41 43 45 20 29 7b 0a 20 20  BU_REPLACE ){.  
19b10 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 7a      if( pIter->z
19b20 49 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Idx==0 ){.      
19b30 20 20 70 2d 3e 6e 50 68 61 73 65 4f 6e 65 53 74    p->nPhaseOneSt
19b40 65 70 20 2b 3d 20 70 2d 3e 6f 62 6a 69 74 65 72  ep += p->objiter
19b50 2e 6e 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 20  .nIndex;.       
19b60 20 72 62 75 53 74 65 70 4f 6e 65 4f 70 28 70 2c   rbuStepOneOp(p,
19b70 20 52 42 55 5f 44 45 4c 45 54 45 29 3b 0a 20 20   RBU_DELETE);.  
19b80 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
19b90 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
19ba0 20 29 20 72 62 75 53 74 65 70 4f 6e 65 4f 70 28   ) rbuStepOneOp(
19bb0 70 2c 20 52 42 55 5f 49 4e 53 45 52 54 29 3b 0a  p, RBU_INSERT);.
19bc0 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69      }.    else i
19bd0 66 28 20 65 54 79 70 65 21 3d 52 42 55 5f 55 50  f( eType!=RBU_UP
19be0 44 41 54 45 20 29 7b 0a 20 20 20 20 20 20 72 62  DATE ){.      rb
19bf0 75 53 74 65 70 4f 6e 65 4f 70 28 70 2c 20 65 54  uStepOneOp(p, eT
19c00 79 70 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ype);.    }.    
19c10 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
19c20 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b  te3_value *pVal;
19c30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
19c40 74 6d 74 20 2a 70 55 70 64 61 74 65 20 3d 20 30  tmt *pUpdate = 0
19c50 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
19c60 65 54 79 70 65 3d 3d 52 42 55 5f 55 50 44 41 54  eType==RBU_UPDAT
19c70 45 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 50  E );.      p->nP
19c80 68 61 73 65 4f 6e 65 53 74 65 70 20 2d 3d 20 70  haseOneStep -= p
19c90 2d 3e 6f 62 6a 69 74 65 72 2e 6e 49 6e 64 65 78  ->objiter.nIndex
19ca0 3b 0a 20 20 20 20 20 20 72 62 75 47 65 74 55 70  ;.      rbuGetUp
19cb0 64 61 74 65 53 74 6d 74 28 70 2c 20 70 49 74 65  dateStmt(p, pIte
19cc0 72 2c 20 7a 4d 61 73 6b 2c 20 26 70 55 70 64 61  r, zMask, &pUpda
19cd0 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  te);.      if( p
19ce0 55 70 64 61 74 65 20 29 7b 0a 20 20 20 20 20 20  Update ){.      
19cf0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20    int i;.       
19d00 20 66 6f 72 28 69 3d 30 3b 20 70 2d 3e 72 63 3d   for(i=0; p->rc=
19d10 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
19d20 70 49 74 65 72 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  pIter->nCol; i++
19d30 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61  ){.          cha
19d40 72 20 63 20 3d 20 7a 4d 61 73 6b 5b 70 49 74 65  r c = zMask[pIte
19d50 72 2d 3e 61 69 53 72 63 4f 72 64 65 72 5b 69 5d  r->aiSrcOrder[i]
19d60 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 70 56 61  ];.          pVa
19d70 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  l = sqlite3_colu
19d80 6d 6e 5f 76 61 6c 75 65 28 70 49 74 65 72 2d 3e  mn_value(pIter->
19d90 70 53 65 6c 65 63 74 2c 20 69 29 3b 0a 20 20 20  pSelect, i);.   
19da0 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72         if( pIter
19db0 2d 3e 61 62 54 62 6c 50 6b 5b 69 5d 20 7c 7c 20  ->abTblPk[i] || 
19dc0 63 21 3d 27 2e 27 20 29 7b 0a 20 20 20 20 20 20  c!='.' ){.      
19dd0 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71        p->rc = sq
19de0 6c 69 74 65 33 5f 62 69 6e 64 5f 76 61 6c 75 65  lite3_bind_value
19df0 28 70 55 70 64 61 74 65 2c 20 69 2b 31 2c 20 70  (pUpdate, i+1, p
19e00 56 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Val);.          
19e10 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
19e20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
19e30 51 4c 49 54 45 5f 4f 4b 20 0a 20 20 20 20 20 20  QLITE_OK .      
19e40 20 20 20 26 26 20 28 70 49 74 65 72 2d 3e 65 54     && (pIter->eT
19e50 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 56 54 41 42  ype==RBU_PK_VTAB
19e60 20 7c 7c 20 70 49 74 65 72 2d 3e 65 54 79 70 65   || pIter->eType
19e70 3d 3d 52 42 55 5f 50 4b 5f 4e 4f 4e 45 29 20 0a  ==RBU_PK_NONE) .
19e80 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
19e90 20 20 20 20 20 2f 2a 20 42 69 6e 64 20 74 68 65       /* Bind the
19ea0 20 72 62 75 5f 72 6f 77 69 64 20 76 61 6c 75 65   rbu_rowid value
19eb0 20 74 6f 20 63 6f 6c 75 6d 6e 20 5f 72 6f 77 69   to column _rowi
19ec0 64 5f 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  d_ */.          
19ed0 61 73 73 65 72 74 43 6f 6c 75 6d 6e 4e 61 6d 65  assertColumnName
19ee0 28 70 49 74 65 72 2d 3e 70 53 65 6c 65 63 74 2c  (pIter->pSelect,
19ef0 20 70 49 74 65 72 2d 3e 6e 43 6f 6c 2b 31 2c 20   pIter->nCol+1, 
19f00 22 72 62 75 5f 72 6f 77 69 64 22 29 3b 0a 20 20  "rbu_rowid");.  
19f10 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20 73          pVal = s
19f20 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 76 61  qlite3_column_va
19f30 6c 75 65 28 70 49 74 65 72 2d 3e 70 53 65 6c 65  lue(pIter->pSele
19f40 63 74 2c 20 70 49 74 65 72 2d 3e 6e 43 6f 6c 2b  ct, pIter->nCol+
19f50 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d  1);.          p-
19f60 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69  >rc = sqlite3_bi
19f70 6e 64 5f 76 61 6c 75 65 28 70 55 70 64 61 74 65  nd_value(pUpdate
19f80 2c 20 70 49 74 65 72 2d 3e 6e 43 6f 6c 2b 31 2c  , pIter->nCol+1,
19f90 20 70 56 61 6c 29 3b 0a 20 20 20 20 20 20 20 20   pVal);.        
19fa0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  }.        if( p-
19fb0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
19fc0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
19fd0 74 65 33 5f 73 74 65 70 28 70 55 70 64 61 74 65  te3_step(pUpdate
19fe0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  );.          p->
19ff0 72 63 20 3d 20 72 65 73 65 74 41 6e 64 43 6f 6c  rc = resetAndCol
1a000 6c 65 63 74 45 72 72 6f 72 28 70 55 70 64 61 74  lectError(pUpdat
1a010 65 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 29 3b  e, &p->zErrmsg);
1a020 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1a030 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
1a040 65 74 75 72 6e 20 70 2d 3e 72 63 3b 0a 7d 0a 0a  eturn p->rc;.}..
1a050 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20  /*.** Increment 
1a060 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69  the schema cooki
1a070 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 64 61  e of the main da
1a080 74 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62 79  tabase opened by
1a090 20 70 2d 3e 64 62 4d 61 69 6e 2e 0a 2a 2a 0a 2a   p->dbMain..**.*
1a0a0 2a 20 4f 72 2c 20 69 66 20 74 68 69 73 20 69 73  * Or, if this is
1a0b0 20 61 6e 20 52 42 55 20 76 61 63 75 75 6d 2c 20   an RBU vacuum, 
1a0c0 73 65 74 20 74 68 65 20 73 63 68 65 6d 61 20 63  set the schema c
1a0d0 6f 6f 6b 69 65 20 6f 66 20 74 68 65 20 6d 61 69  ookie of the mai
1a0e0 6e 20 64 62 0a 2a 2a 20 6f 70 65 6e 65 64 20 62  n db.** opened b
1a0f0 79 20 70 2d 3e 64 62 4d 61 69 6e 20 74 6f 20 6f  y p->dbMain to o
1a100 6e 65 20 6d 6f 72 65 20 74 68 61 6e 20 74 68 65  ne more than the
1a110 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 6f   schema cookie o
1a120 66 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 64 62  f the main.** db
1a130 20 6f 70 65 6e 65 64 20 62 79 20 70 2d 3e 64 62   opened by p->db
1a140 52 62 75 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  Rbu..*/.static v
1a150 6f 69 64 20 72 62 75 49 6e 63 72 53 63 68 65 6d  oid rbuIncrSchem
1a160 61 43 6f 6f 6b 69 65 28 73 71 6c 69 74 65 33 72  aCookie(sqlite3r
1a170 62 75 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  bu *p){.  if( p-
1a180 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
1a190 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  {.    sqlite3 *d
1a1a0 62 72 65 61 64 20 3d 20 28 72 62 75 49 73 56 61  bread = (rbuIsVa
1a1b0 63 75 75 6d 28 70 29 20 3f 20 70 2d 3e 64 62 52  cuum(p) ? p->dbR
1a1c0 62 75 20 3a 20 70 2d 3e 64 62 4d 61 69 6e 29 3b  bu : p->dbMain);
1a1d0 0a 20 20 20 20 69 6e 74 20 69 43 6f 6f 6b 69 65  .    int iCookie
1a1e0 20 3d 20 31 30 30 30 30 30 30 3b 0a 20 20 20 20   = 1000000;.    
1a1f0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
1a200 74 6d 74 3b 0a 0a 20 20 20 20 70 2d 3e 72 63 20  tmt;..    p->rc 
1a210 3d 20 70 72 65 70 61 72 65 41 6e 64 43 6f 6c 6c  = prepareAndColl
1a220 65 63 74 45 72 72 6f 72 28 64 62 72 65 61 64 2c  ectError(dbread,
1a230 20 26 70 53 74 6d 74 2c 20 26 70 2d 3e 7a 45 72   &pStmt, &p->zEr
1a240 72 6d 73 67 2c 20 0a 20 20 20 20 20 20 20 20 22  rmsg, .        "
1a250 50 52 41 47 4d 41 20 73 63 68 65 6d 61 5f 76 65  PRAGMA schema_ve
1a260 72 73 69 6f 6e 22 0a 20 20 20 20 29 3b 0a 20 20  rsion".    );.  
1a270 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
1a280 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1a290 2f 2a 20 43 6f 76 65 72 61 67 65 3a 20 69 74 20  /* Coverage: it 
1a2a0 6d 61 79 20 62 65 20 74 68 61 74 20 74 68 69 73  may be that this
1a2b0 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20   sqlite3_step() 
1a2c0 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 54 68 65  cannot fail. The
1a2d0 72 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 61  re.      ** is a
1a2e0 6c 72 65 61 64 79 20 61 20 74 72 61 6e 73 61 63  lready a transac
1a2f0 74 69 6f 6e 20 6f 70 65 6e 2c 20 73 6f 20 74 68  tion open, so th
1a300 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
1a310 6d 65 6e 74 20 63 61 6e 6e 6f 74 0a 20 20 20 20  ment cannot.    
1a320 20 20 2a 2a 20 74 68 72 6f 77 20 61 6e 20 53 51    ** throw an SQ
1a330 4c 49 54 45 5f 53 43 48 45 4d 41 20 65 78 63 65  LITE_SCHEMA exce
1a340 70 74 69 6f 6e 2e 20 54 68 65 20 6f 6e 6c 79 20  ption. The only 
1a350 64 61 74 61 62 61 73 65 20 70 61 67 65 20 74 68  database page th
1a360 65 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65  e.      ** state
1a370 6d 65 6e 74 20 72 65 61 64 73 20 69 73 20 70 61  ment reads is pa
1a380 67 65 20 31 2c 20 77 68 69 63 68 20 69 73 20 67  ge 1, which is g
1a390 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20  uaranteed to be 
1a3a0 69 6e 20 74 68 65 20 63 61 63 68 65 2e 0a 20 20  in the cache..  
1a3b0 20 20 20 20 2a 2a 20 41 6e 64 20 6e 6f 20 6d 65      ** And no me
1a3c0 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73  mory allocations
1a3d0 20 61 72 65 20 72 65 71 75 69 72 65 64 2e 20 20   are required.  
1a3e0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c  */.      if( SQL
1a3f0 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
1a400 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a  _step(pStmt) ){.
1a410 20 20 20 20 20 20 20 20 69 43 6f 6f 6b 69 65 20          iCookie 
1a420 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
1a430 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a  _int(pStmt, 0);.
1a440 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 62        }.      rb
1a450 75 46 69 6e 61 6c 69 7a 65 28 70 2c 20 70 53 74  uFinalize(p, pSt
1a460 6d 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  mt);.    }.    i
1a470 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
1a480 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 62 75  _OK ){.      rbu
1a490 4d 50 72 69 6e 74 66 45 78 65 63 28 70 2c 20 70  MPrintfExec(p, p
1a4a0 2d 3e 64 62 4d 61 69 6e 2c 20 22 50 52 41 47 4d  ->dbMain, "PRAGM
1a4b0 41 20 73 63 68 65 6d 61 5f 76 65 72 73 69 6f 6e  A schema_version
1a4c0 20 3d 20 25 64 22 2c 20 69 43 6f 6f 6b 69 65 2b   = %d", iCookie+
1a4d0 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  1);.    }.  }.}.
1a4e0 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74 68  ./*.** Update th
1a4f0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
1a500 65 20 72 62 75 5f 73 74 61 74 65 20 74 61 62 6c  e rbu_state tabl
1a510 65 20 77 69 74 68 69 6e 20 74 68 65 20 72 62 75  e within the rbu
1a520 20 64 61 74 61 62 61 73 65 2e 20 54 68 65 0a 2a   database. The.*
1a530 2a 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69  * value stored i
1a540 6e 20 74 68 65 20 52 42 55 5f 53 54 41 54 45 5f  n the RBU_STATE_
1a550 53 54 41 47 45 20 63 6f 6c 75 6d 6e 20 69 73 20  STAGE column is 
1a560 65 53 74 61 67 65 2e 20 41 6c 6c 20 6f 74 68 65  eStage. All othe
1a570 72 20 76 61 6c 75 65 73 0a 2a 2a 20 61 72 65 20  r values.** are 
1a580 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 69 6e  determined by in
1a590 73 70 65 63 74 69 6e 67 20 74 68 65 20 72 62 75  specting the rbu
1a5a0 20 68 61 6e 64 6c 65 20 70 61 73 73 65 64 20 61   handle passed a
1a5b0 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
1a5c0 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
1a5d0 76 6f 69 64 20 72 62 75 53 61 76 65 53 74 61 74  void rbuSaveStat
1a5e0 65 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c  e(sqlite3rbu *p,
1a5f0 20 69 6e 74 20 65 53 74 61 67 65 29 7b 0a 20 20   int eStage){.  
1a600 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
1a610 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53  E_OK || p->rc==S
1a620 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20  QLITE_DONE ){.  
1a630 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
1a640 70 49 6e 73 65 72 74 20 3d 20 30 3b 0a 20 20 20  pInsert = 0;.   
1a650 20 72 62 75 5f 66 69 6c 65 20 2a 70 46 64 20 3d   rbu_file *pFd =
1a660 20 28 72 62 75 49 73 56 61 63 75 75 6d 28 70 29   (rbuIsVacuum(p)
1a670 20 3f 20 70 2d 3e 70 52 62 75 46 64 20 3a 20 70   ? p->pRbuFd : p
1a680 2d 3e 70 54 61 72 67 65 74 46 64 29 3b 0a 20 20  ->pTargetFd);.  
1a690 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 20 20 61    int rc;..    a
1a6a0 73 73 65 72 74 28 20 70 2d 3e 7a 45 72 72 6d 73  ssert( p->zErrms
1a6b0 67 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d  g==0 );.    rc =
1a6c0 20 70 72 65 70 61 72 65 46 72 65 65 41 6e 64 43   prepareFreeAndC
1a6d0 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64  ollectError(p->d
1a6e0 62 52 62 75 2c 20 26 70 49 6e 73 65 72 74 2c 20  bRbu, &pInsert, 
1a6f0 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 20 0a 20 20  &p->zErrmsg, .  
1a700 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70        sqlite3_mp
1a710 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20  rintf(.         
1a720 20 22 49 4e 53 45 52 54 20 4f 52 20 52 45 50 4c   "INSERT OR REPL
1a730 41 43 45 20 49 4e 54 4f 20 25 73 2e 72 62 75 5f  ACE INTO %s.rbu_
1a740 73 74 61 74 65 28 6b 2c 20 76 29 20 56 41 4c 55  state(k, v) VALU
1a750 45 53 20 22 0a 20 20 20 20 20 20 20 20 20 20 22  ES ".          "
1a760 28 25 64 2c 20 25 64 29 2c 20 22 0a 20 20 20 20  (%d, %d), ".    
1a770 20 20 20 20 20 20 22 28 25 64 2c 20 25 51 29 2c        "(%d, %Q),
1a780 20 22 0a 20 20 20 20 20 20 20 20 20 20 22 28 25   ".          "(%
1a790 64 2c 20 25 51 29 2c 20 22 0a 20 20 20 20 20 20  d, %Q), ".      
1a7a0 20 20 20 20 22 28 25 64 2c 20 25 64 29 2c 20 22      "(%d, %d), "
1a7b0 0a 20 20 20 20 20 20 20 20 20 20 22 28 25 64 2c  .          "(%d,
1a7c0 20 25 64 29 2c 20 22 0a 20 20 20 20 20 20 20 20   %d), ".        
1a7d0 20 20 22 28 25 64 2c 20 25 6c 6c 64 29 2c 20 22    "(%d, %lld), "
1a7e0 0a 20 20 20 20 20 20 20 20 20 20 22 28 25 64 2c  .          "(%d,
1a7f0 20 25 6c 6c 64 29 2c 20 22 0a 20 20 20 20 20 20   %lld), ".      
1a800 20 20 20 20 22 28 25 64 2c 20 25 6c 6c 64 29 2c      "(%d, %lld),
1a810 20 22 0a 20 20 20 20 20 20 20 20 20 20 22 28 25   ".          "(%
1a820 64 2c 20 25 6c 6c 64 29 2c 20 22 0a 20 20 20 20  d, %lld), ".    
1a830 20 20 20 20 20 20 22 28 25 64 2c 20 25 51 29 20        "(%d, %Q) 
1a840 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70 2d   ",.          p-
1a850 3e 7a 53 74 61 74 65 44 62 2c 0a 20 20 20 20 20  >zStateDb,.     
1a860 20 20 20 20 20 52 42 55 5f 53 54 41 54 45 5f 53       RBU_STATE_S
1a870 54 41 47 45 2c 20 65 53 74 61 67 65 2c 0a 20 20  TAGE, eStage,.  
1a880 20 20 20 20 20 20 20 20 52 42 55 5f 53 54 41 54          RBU_STAT
1a890 45 5f 54 42 4c 2c 20 70 2d 3e 6f 62 6a 69 74 65  E_TBL, p->objite
1a8a0 72 2e 7a 54 62 6c 2c 20 0a 20 20 20 20 20 20 20  r.zTbl, .       
1a8b0 20 20 20 52 42 55 5f 53 54 41 54 45 5f 49 44 58     RBU_STATE_IDX
1a8c0 2c 20 70 2d 3e 6f 62 6a 69 74 65 72 2e 7a 49 64  , p->objiter.zId
1a8d0 78 2c 20 0a 20 20 20 20 20 20 20 20 20 20 52 42  x, .          RB
1a8e0 55 5f 53 54 41 54 45 5f 52 4f 57 2c 20 70 2d 3e  U_STATE_ROW, p->
1a8f0 6e 53 74 65 70 2c 20 0a 20 20 20 20 20 20 20 20  nStep, .        
1a900 20 20 52 42 55 5f 53 54 41 54 45 5f 50 52 4f 47    RBU_STATE_PROG
1a910 52 45 53 53 2c 20 70 2d 3e 6e 50 72 6f 67 72 65  RESS, p->nProgre
1a920 73 73 2c 0a 20 20 20 20 20 20 20 20 20 20 52 42  ss,.          RB
1a930 55 5f 53 54 41 54 45 5f 43 4b 50 54 2c 20 70 2d  U_STATE_CKPT, p-
1a940 3e 69 57 61 6c 43 6b 73 75 6d 2c 0a 20 20 20 20  >iWalCksum,.    
1a950 20 20 20 20 20 20 52 42 55 5f 53 54 41 54 45 5f        RBU_STATE_
1a960 43 4f 4f 4b 49 45 2c 20 28 69 36 34 29 70 46 64  COOKIE, (i64)pFd
1a970 2d 3e 69 43 6f 6f 6b 69 65 2c 0a 20 20 20 20 20  ->iCookie,.     
1a980 20 20 20 20 20 52 42 55 5f 53 54 41 54 45 5f 4f       RBU_STATE_O
1a990 41 4c 53 5a 2c 20 70 2d 3e 69 4f 61 6c 53 7a 2c  ALSZ, p->iOalSz,
1a9a0 0a 20 20 20 20 20 20 20 20 20 20 52 42 55 5f 53  .          RBU_S
1a9b0 54 41 54 45 5f 50 48 41 53 45 4f 4e 45 53 54 45  TATE_PHASEONESTE
1a9c0 50 2c 20 70 2d 3e 6e 50 68 61 73 65 4f 6e 65 53  P, p->nPhaseOneS
1a9d0 74 65 70 2c 0a 20 20 20 20 20 20 20 20 20 20 52  tep,.          R
1a9e0 42 55 5f 53 54 41 54 45 5f 44 41 54 41 54 42 4c  BU_STATE_DATATBL
1a9f0 2c 20 70 2d 3e 6f 62 6a 69 74 65 72 2e 7a 44 61  , p->objiter.zDa
1aa00 74 61 54 62 6c 0a 20 20 20 20 20 20 29 0a 20 20  taTbl.      ).  
1aa10 20 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28    );.    assert(
1aa20 20 70 49 6e 73 65 72 74 3d 3d 30 20 7c 7c 20 72   pInsert==0 || r
1aa30 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
1aa40 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1aa50 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1aa60 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 49 6e  sqlite3_step(pIn
1aa70 73 65 72 74 29 3b 0a 20 20 20 20 20 20 72 63 20  sert);.      rc 
1aa80 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69  = sqlite3_finali
1aa90 7a 65 28 70 49 6e 73 65 72 74 29 3b 0a 20 20 20  ze(pInsert);.   
1aaa0 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
1aab0 51 4c 49 54 45 5f 4f 4b 20 29 20 70 2d 3e 72 63  QLITE_OK ) p->rc
1aac0 20 3d 20 72 63 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f   = rc;.  }.}.../
1aad0 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20  *.** The second 
1aae0 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20  argument passed 
1aaf0 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
1ab00 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
1ab10 61 20 50 52 41 47 4d 41 20 0a 2a 2a 20 73 65 74  a PRAGMA .** set
1ab20 74 69 6e 67 20 2d 20 22 70 61 67 65 5f 73 69 7a  ting - "page_siz
1ab30 65 22 2c 20 22 61 75 74 6f 5f 76 61 63 75 75 6d  e", "auto_vacuum
1ab40 22 2c 20 22 75 73 65 72 5f 76 65 72 73 69 6f 6e  ", "user_version
1ab50 22 20 6f 72 20 22 61 70 70 6c 69 63 61 74 69 6f  " or "applicatio
1ab60 6e 5f 69 64 22 2e 0a 2a 2a 20 54 68 69 73 20 66  n_id"..** This f
1ab70 75 6e 63 74 69 6f 6e 20 65 78 65 63 75 74 65 73  unction executes
1ab80 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f   the following o
1ab90 6e 20 73 71 6c 69 74 65 33 72 62 75 2e 64 62 52  n sqlite3rbu.dbR
1aba0 62 75 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 50 52 41  bu:.**.**   "PRA
1abb0 47 4d 41 20 6d 61 69 6e 2e 24 7a 50 72 61 67 6d  GMA main.$zPragm
1abc0 61 22 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 24  a".**.** where $
1abd0 7a 50 72 61 67 6d 61 20 69 73 20 74 68 65 20 73  zPragma is the s
1abe0 74 72 69 6e 67 20 70 61 73 73 65 64 20 61 73 20  tring passed as 
1abf0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
1ac00 65 6e 74 2c 20 74 68 65 6e 0a 2a 2a 20 6f 6e 20  ent, then.** on 
1ac10 73 71 6c 69 74 65 33 72 62 75 2e 64 62 4d 61 69  sqlite3rbu.dbMai
1ac20 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 50 52 41 47  n:.**.**   "PRAG
1ac30 4d 41 20 6d 61 69 6e 2e 24 7a 50 72 61 67 6d 61  MA main.$zPragma
1ac40 20 3d 20 24 76 61 6c 22 0a 2a 2a 0a 2a 2a 20 77   = $val".**.** w
1ac50 68 65 72 65 20 24 76 61 6c 20 69 73 20 74 68 65  here $val is the
1ac60 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
1ac70 62 79 20 74 68 65 20 66 69 72 73 74 20 50 52 41  by the first PRA
1ac80 47 4d 41 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 0a  GMA invocation..
1ac90 2a 2a 0a 2a 2a 20 49 6e 20 73 68 6f 72 74 2c 20  **.** In short, 
1aca0 69 74 20 63 6f 70 69 65 73 20 74 68 65 20 76 61  it copies the va
1acb0 6c 75 65 20 20 6f 66 20 74 68 65 20 73 70 65 63  lue  of the spec
1acc0 69 66 69 65 64 20 50 52 41 47 4d 41 20 73 65 74  ified PRAGMA set
1acd0 74 69 6e 67 20 66 72 6f 6d 0a 2a 2a 20 64 62 52  ting from.** dbR
1ace0 62 75 20 74 6f 20 64 62 4d 61 69 6e 2e 0a 2a 2f  bu to dbMain..*/
1acf0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75  .static void rbu
1ad00 43 6f 70 79 50 72 61 67 6d 61 28 73 71 6c 69 74  CopyPragma(sqlit
1ad10 65 33 72 62 75 20 2a 70 2c 20 63 6f 6e 73 74 20  e3rbu *p, const 
1ad20 63 68 61 72 20 2a 7a 50 72 61 67 6d 61 29 7b 0a  char *zPragma){.
1ad30 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
1ad40 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
1ad50 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 50 72 61  lite3_stmt *pPra
1ad60 67 6d 61 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  gma = 0;.    p->
1ad70 72 63 20 3d 20 70 72 65 70 61 72 65 46 72 65 65  rc = prepareFree
1ad80 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28  AndCollectError(
1ad90 70 2d 3e 64 62 52 62 75 2c 20 26 70 50 72 61 67  p->dbRbu, &pPrag
1ada0 6d 61 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c  ma, &p->zErrmsg,
1adb0 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65   .        sqlite
1adc0 33 5f 6d 70 72 69 6e 74 66 28 22 50 52 41 47 4d  3_mprintf("PRAGM
1add0 41 20 6d 61 69 6e 2e 25 73 22 2c 20 7a 50 72 61  A main.%s", zPra
1ade0 67 6d 61 29 0a 20 20 20 20 29 3b 0a 20 20 20 20  gma).    );.    
1adf0 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
1ae00 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52  E_OK && SQLITE_R
1ae10 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
1ae20 28 70 50 72 61 67 6d 61 29 20 29 7b 0a 20 20 20  (pPragma) ){.   
1ae30 20 20 20 70 2d 3e 72 63 20 3d 20 72 62 75 4d 50     p->rc = rbuMP
1ae40 72 69 6e 74 66 45 78 65 63 28 70 2c 20 70 2d 3e  rintfExec(p, p->
1ae50 64 62 4d 61 69 6e 2c 20 22 50 52 41 47 4d 41 20  dbMain, "PRAGMA 
1ae60 6d 61 69 6e 2e 25 73 20 3d 20 25 64 22 2c 0a 20  main.%s = %d",. 
1ae70 20 20 20 20 20 20 20 20 20 7a 50 72 61 67 6d 61           zPragma
1ae80 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  , sqlite3_column
1ae90 5f 69 6e 74 28 70 50 72 61 67 6d 61 2c 20 30 29  _int(pPragma, 0)
1aea0 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
1aeb0 20 20 20 20 72 62 75 46 69 6e 61 6c 69 7a 65 28      rbuFinalize(
1aec0 70 2c 20 70 50 72 61 67 6d 61 29 3b 0a 20 20 7d  p, pPragma);.  }
1aed0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 52 42  .}../*.** The RB
1aee0 55 20 68 61 6e 64 6c 65 20 70 61 73 73 65 64 20  U handle passed 
1aef0 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75  as the only argu
1af00 6d 65 6e 74 20 68 61 73 20 6a 75 73 74 20 62 65  ment has just be
1af10 65 6e 20 6f 70 65 6e 65 64 20 61 6e 64 20 0a 2a  en opened and .*
1af20 2a 20 74 68 65 20 73 74 61 74 65 20 64 61 74 61  * the state data
1af30 62 61 73 65 20 69 73 20 65 6d 70 74 79 2e 20 49  base is empty. I
1af40 66 20 74 68 69 73 20 52 42 55 20 68 61 6e 64 6c  f this RBU handl
1af50 65 20 77 61 73 20 6f 70 65 6e 65 64 20 66 6f 72  e was opened for
1af60 20 61 6e 0a 2a 2a 20 52 42 55 20 76 61 63 75 75   an.** RBU vacuu
1af70 6d 20 6f 70 65 72 61 74 69 6f 6e 2c 20 63 72 65  m operation, cre
1af80 61 74 65 20 74 68 65 20 73 63 68 65 6d 61 20 69  ate the schema i
1af90 6e 20 74 68 65 20 74 61 72 67 65 74 20 64 62 2e  n the target db.
1afa0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1afb0 72 62 75 43 72 65 61 74 65 54 61 72 67 65 74 53  rbuCreateTargetS
1afc0 63 68 65 6d 61 28 73 71 6c 69 74 65 33 72 62 75  chema(sqlite3rbu
1afd0 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f   *p){.  sqlite3_
1afe0 73 74 6d 74 20 2a 70 53 71 6c 20 3d 20 30 3b 0a  stmt *pSql = 0;.
1aff0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
1b000 70 49 6e 73 65 72 74 20 3d 20 30 3b 0a 0a 20 20  pInsert = 0;..  
1b010 61 73 73 65 72 74 28 20 72 62 75 49 73 56 61 63  assert( rbuIsVac
1b020 75 75 6d 28 70 29 20 29 3b 0a 20 20 70 2d 3e 72  uum(p) );.  p->r
1b030 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  c = sqlite3_exec
1b040 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 50 52 41  (p->dbMain, "PRA
1b050 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68  GMA writable_sch
1b060 65 6d 61 3d 31 22 2c 20 30 2c 30 2c 20 26 70 2d  ema=1", 0,0, &p-
1b070 3e 7a 45 72 72 6d 73 67 29 3b 0a 20 20 69 66 28  >zErrmsg);.  if(
1b080 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1b090 4b 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  K ){.    p->rc =
1b0a0 20 70 72 65 70 61 72 65 41 6e 64 43 6f 6c 6c 65   prepareAndColle
1b0b0 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 52 62 75  ctError(p->dbRbu
1b0c0 2c 20 26 70 53 71 6c 2c 20 26 70 2d 3e 7a 45 72  , &pSql, &p->zEr
1b0d0 72 6d 73 67 2c 20 0a 20 20 20 20 20 20 22 53 45  rmsg, .      "SE
1b0e0 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d 20 73 71  LECT sql FROM sq
1b0f0 6c 69 74 65 5f 6d 61 73 74 65 72 20 57 48 45 52  lite_master WHER
1b100 45 20 73 71 6c 21 3d 27 27 20 41 4e 44 20 72 6f  E sql!='' AND ro
1b110 6f 74 70 61 67 65 21 3d 30 22 0a 20 20 20 20 20  otpage!=0".     
1b120 20 22 20 41 4e 44 20 6e 61 6d 65 21 3d 27 73 71   " AND name!='sq
1b130 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 27 20 22  lite_sequence' "
1b140 0a 20 20 20 20 20 20 22 20 4f 52 44 45 52 20 42  .      " ORDER B
1b150 59 20 74 79 70 65 20 44 45 53 43 22 0a 20 20 20  Y type DESC".   
1b160 20 29 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65   );.  }..  while
1b170 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
1b180 4f 4b 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74  OK && sqlite3_st
1b190 65 70 28 70 53 71 6c 29 3d 3d 53 51 4c 49 54 45  ep(pSql)==SQLITE
1b1a0 5f 52 4f 57 20 29 7b 0a 20 20 20 20 63 6f 6e 73  _ROW ){.    cons
1b1b0 74 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 28  t char *zSql = (
1b1c0 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
1b1d0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
1b1e0 70 53 71 6c 2c 20 30 29 3b 0a 20 20 20 20 70 2d  pSql, 0);.    p-
1b1f0 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78  >rc = sqlite3_ex
1b200 65 63 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 7a 53  ec(p->dbMain, zS
1b210 71 6c 2c 20 30 2c 20 30 2c 20 26 70 2d 3e 7a 45  ql, 0, 0, &p->zE
1b220 72 72 6d 73 67 29 3b 0a 20 20 7d 0a 20 20 72 62  rrmsg);.  }.  rb
1b230 75 46 69 6e 61 6c 69 7a 65 28 70 2c 20 70 53 71  uFinalize(p, pSq
1b240 6c 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 21  l);.  if( p->rc!
1b250 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
1b260 75 72 6e 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72  urn;..  if( p->r
1b270 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1b280 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70      p->rc = prep
1b290 61 72 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72  areAndCollectErr
1b2a0 6f 72 28 70 2d 3e 64 62 52 62 75 2c 20 26 70 53  or(p->dbRbu, &pS
1b2b0 71 6c 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c  ql, &p->zErrmsg,
1b2c0 20 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45 43   .        "SELEC
1b2d0 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  T * FROM sqlite_
1b2e0 6d 61 73 74 65 72 20 57 48 45 52 45 20 72 6f 6f  master WHERE roo
1b2f0 74 70 61 67 65 3d 30 20 4f 52 20 72 6f 6f 74 70  tpage=0 OR rootp
1b300 61 67 65 20 49 53 20 4e 55 4c 4c 22 20 0a 20 20  age IS NULL" .  
1b310 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20    );.  }..  if( 
1b320 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
1b330 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
1b340 70 72 65 70 61 72 65 41 6e 64 43 6f 6c 6c 65 63  prepareAndCollec
1b350 74 45 72 72 6f 72 28 70 2d 3e 64 62 4d 61 69 6e  tError(p->dbMain
1b360 2c 20 26 70 49 6e 73 65 72 74 2c 20 26 70 2d 3e  , &pInsert, &p->
1b370 7a 45 72 72 6d 73 67 2c 20 0a 20 20 20 20 20 20  zErrmsg, .      
1b380 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 73    "INSERT INTO s
1b390 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 56 41 4c  qlite_master VAL
1b3a0 55 45 53 28 3f 2c 3f 2c 3f 2c 3f 2c 3f 29 22 0a  UES(?,?,?,?,?)".
1b3b0 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 77 68      );.  }..  wh
1b3c0 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ile( p->rc==SQLI
1b3d0 54 45 5f 4f 4b 20 26 26 20 73 71 6c 69 74 65 33  TE_OK && sqlite3
1b3e0 5f 73 74 65 70 28 70 53 71 6c 29 3d 3d 53 51 4c  _step(pSql)==SQL
1b3f0 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 69  ITE_ROW ){.    i
1b400 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
1b410 30 3b 20 69 3c 35 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<5; i++){.  
1b420 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
1b430 5f 76 61 6c 75 65 28 70 49 6e 73 65 72 74 2c 20  _value(pInsert, 
1b440 69 2b 31 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c  i+1, sqlite3_col
1b450 75 6d 6e 5f 76 61 6c 75 65 28 70 53 71 6c 2c 20  umn_value(pSql, 
1b460 69 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  i));.    }.    s
1b470 71 6c 69 74 65 33 5f 73 74 65 70 28 70 49 6e 73  qlite3_step(pIns
1b480 65 72 74 29 3b 0a 20 20 20 20 70 2d 3e 72 63 20  ert);.    p->rc 
1b490 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
1b4a0 70 49 6e 73 65 72 74 29 3b 0a 20 20 7d 0a 20 20  pInsert);.  }.  
1b4b0 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
1b4c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d 3e 72  E_OK ){.    p->r
1b4d0 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  c = sqlite3_exec
1b4e0 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 50 52 41  (p->dbMain, "PRA
1b4f0 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68  GMA writable_sch
1b500 65 6d 61 3d 30 22 2c 30 2c 30 2c 26 70 2d 3e 7a  ema=0",0,0,&p->z
1b510 45 72 72 6d 73 67 29 3b 0a 20 20 7d 0a 0a 20 20  Errmsg);.  }..  
1b520 72 62 75 46 69 6e 61 6c 69 7a 65 28 70 2c 20 70  rbuFinalize(p, p
1b530 53 71 6c 29 3b 0a 20 20 72 62 75 46 69 6e 61 6c  Sql);.  rbuFinal
1b540 69 7a 65 28 70 2c 20 70 49 6e 73 65 72 74 29 3b  ize(p, pInsert);
1b550 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74  .}../*.** Step t
1b560 68 65 20 52 42 55 20 6f 62 6a 65 63 74 2e 0a 2a  he RBU object..*
1b570 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 72 62 75  /.int sqlite3rbu
1b580 5f 73 74 65 70 28 73 71 6c 69 74 65 33 72 62 75  _step(sqlite3rbu
1b590 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b   *p){.  if( p ){
1b5a0 0a 20 20 20 20 73 77 69 74 63 68 28 20 70 2d 3e  .    switch( p->
1b5b0 65 53 74 61 67 65 20 29 7b 0a 20 20 20 20 20 20  eStage ){.      
1b5c0 63 61 73 65 20 52 42 55 5f 53 54 41 47 45 5f 4f  case RBU_STAGE_O
1b5d0 41 4c 3a 20 7b 0a 20 20 20 20 20 20 20 20 52 62  AL: {.        Rb
1b5e0 75 4f 62 6a 49 74 65 72 20 2a 70 49 74 65 72 20  uObjIter *pIter 
1b5f0 3d 20 26 70 2d 3e 6f 62 6a 69 74 65 72 3b 0a 0a  = &p->objiter;..
1b600 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
1b610 69 73 20 69 73 20 61 6e 20 52 42 55 20 76 61 63  is is an RBU vac
1b620 75 75 6d 20 6f 70 65 72 61 74 69 6f 6e 20 61 6e  uum operation an
1b630 64 20 74 68 65 20 73 74 61 74 65 20 74 61 62 6c  d the state tabl
1b640 65 20 77 61 73 20 65 6d 70 74 79 0a 20 20 20 20  e was empty.    
1b650 20 20 20 20 2a 2a 20 77 68 65 6e 20 74 68 69 73      ** when this
1b660 20 68 61 6e 64 6c 65 20 77 61 73 20 6f 70 65 6e   handle was open
1b670 65 64 2c 20 63 72 65 61 74 65 20 74 68 65 20 74  ed, create the t
1b680 61 72 67 65 74 20 64 61 74 61 62 61 73 65 20 73  arget database s
1b690 63 68 65 6d 61 2e 20 2a 2f 0a 20 20 20 20 20 20  chema. */.      
1b6a0 20 20 69 66 28 20 72 62 75 49 73 56 61 63 75 75    if( rbuIsVacuu
1b6b0 6d 28 70 29 20 26 26 20 70 2d 3e 6e 50 72 6f 67  m(p) && p->nProg
1b6c0 72 65 73 73 3d 3d 30 20 26 26 20 70 2d 3e 72 63  ress==0 && p->rc
1b6d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1b6e0 20 20 20 20 20 20 20 20 20 72 62 75 43 72 65 61           rbuCrea
1b6f0 74 65 54 61 72 67 65 74 53 63 68 65 6d 61 28 70  teTargetSchema(p
1b700 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 62 75  );.          rbu
1b710 43 6f 70 79 50 72 61 67 6d 61 28 70 2c 20 22 75  CopyPragma(p, "u
1b720 73 65 72 5f 76 65 72 73 69 6f 6e 22 29 3b 0a 20  ser_version");. 
1b730 20 20 20 20 20 20 20 20 20 72 62 75 43 6f 70 79           rbuCopy
1b740 50 72 61 67 6d 61 28 70 2c 20 22 61 70 70 6c 69  Pragma(p, "appli
1b750 63 61 74 69 6f 6e 5f 69 64 22 29 3b 0a 20 20 20  cation_id");.   
1b760 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
1b770 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51  while( p->rc==SQ
1b780 4c 49 54 45 5f 4f 4b 20 26 26 20 70 49 74 65 72  LITE_OK && pIter
1b790 2d 3e 7a 54 62 6c 20 29 7b 0a 0a 20 20 20 20 20  ->zTbl ){..     
1b7a0 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e       if( pIter->
1b7b0 62 43 6c 65 61 6e 75 70 20 29 7b 0a 20 20 20 20  bCleanup ){.    
1b7c0 20 20 20 20 20 20 20 20 2f 2a 20 43 6c 65 61 6e          /* Clean
1b7d0 20 75 70 20 74 68 65 20 72 62 75 5f 74 6d 70 5f   up the rbu_tmp_
1b7e0 78 78 78 20 74 61 62 6c 65 20 66 6f 72 20 74 68  xxx table for th
1b7f0 65 20 70 72 65 76 69 6f 75 73 20 74 61 62 6c 65  e previous table
1b800 2e 20 49 74 20 0a 20 20 20 20 20 20 20 20 20 20  . It .          
1b810 20 20 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 64    ** cannot be d
1b820 72 6f 70 70 65 64 20 61 73 20 74 68 65 72 65 20  ropped as there 
1b830 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 61 63  are currently ac
1b840 74 69 76 65 20 53 51 4c 20 73 74 61 74 65 6d 65  tive SQL stateme
1b850 6e 74 73 2e 0a 20 20 20 20 20 20 20 20 20 20 20  nts..           
1b860 20 2a 2a 20 42 75 74 20 74 68 65 20 63 6f 6e 74   ** But the cont
1b870 65 6e 74 73 20 63 61 6e 20 62 65 20 64 65 6c 65  ents can be dele
1b880 74 65 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  ted.  */.       
1b890 20 20 20 20 20 69 66 28 20 72 62 75 49 73 56 61       if( rbuIsVa
1b8a0 63 75 75 6d 28 70 29 3d 3d 30 20 26 26 20 70 49  cuum(p)==0 && pI
1b8b0 74 65 72 2d 3e 61 62 49 6e 64 65 78 65 64 20 29  ter->abIndexed )
1b8c0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1b8d0 72 62 75 4d 50 72 69 6e 74 66 45 78 65 63 28 70  rbuMPrintfExec(p
1b8e0 2c 20 70 2d 3e 64 62 52 62 75 2c 20 0a 20 20 20  , p->dbRbu, .   
1b8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1b900 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 73 2e 27  DELETE FROM %s.'
1b910 72 62 75 5f 74 6d 70 5f 25 71 27 22 2c 20 70 2d  rbu_tmp_%q'", p-
1b920 3e 7a 53 74 61 74 65 44 62 2c 20 70 49 74 65 72  >zStateDb, pIter
1b930 2d 3e 7a 44 61 74 61 54 62 6c 0a 20 20 20 20 20  ->zDataTbl.     
1b940 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
1b950 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1b960 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1b970 20 20 20 20 20 20 20 72 62 75 4f 62 6a 49 74 65         rbuObjIte
1b980 72 50 72 65 70 61 72 65 41 6c 6c 28 70 2c 20 70  rPrepareAll(p, p
1b990 49 74 65 72 2c 20 30 29 3b 0a 0a 20 20 20 20 20  Iter, 0);..     
1b9a0 20 20 20 20 20 20 20 2f 2a 20 41 64 76 61 6e 63         /* Advanc
1b9b0 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 72 6f  e to the next ro
1b9c0 77 20 74 6f 20 70 72 6f 63 65 73 73 2e 20 2a 2f  w to process. */
1b9d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
1b9e0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1b9f0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
1ba00 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69     int rc = sqli
1ba10 74 65 33 5f 73 74 65 70 28 70 49 74 65 72 2d 3e  te3_step(pIter->
1ba20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  pSelect);.      
1ba30 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
1ba40 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
1ba50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
1ba60 3e 6e 50 72 6f 67 72 65 73 73 2b 2b 3b 0a 20 20  >nProgress++;.  
1ba70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
1ba80 3e 6e 53 74 65 70 2b 2b 3b 0a 20 20 20 20 20 20  >nStep++;.      
1ba90 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1baa0 20 72 62 75 53 74 65 70 28 70 29 3b 0a 20 20 20   rbuStep(p);.   
1bab0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1bac0 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63             p->rc
1bad0 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
1bae0 28 70 49 74 65 72 2d 3e 70 53 65 6c 65 63 74 29  (pIter->pSelect)
1baf0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1bb00 70 2d 3e 6e 53 74 65 70 20 3d 20 30 3b 0a 20 20  p->nStep = 0;.  
1bb10 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1bb20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
1bb30 20 20 20 72 62 75 4f 62 6a 49 74 65 72 4e 65 78     rbuObjIterNex
1bb40 74 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20  t(p, pIter);.   
1bb50 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
1bb60 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
1bb70 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1bb80 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
1bb90 3e 7a 54 62 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  >zTbl==0 );.    
1bba0 20 20 20 20 20 20 72 62 75 53 61 76 65 53 74 61        rbuSaveSta
1bbb0 74 65 28 70 2c 20 52 42 55 5f 53 54 41 47 45 5f  te(p, RBU_STAGE_
1bbc0 4d 4f 56 45 29 3b 0a 20 20 20 20 20 20 20 20 20  MOVE);.         
1bbd0 20 72 62 75 49 6e 63 72 53 63 68 65 6d 61 43 6f   rbuIncrSchemaCo
1bbe0 6f 6b 69 65 28 70 29 3b 0a 20 20 20 20 20 20 20  okie(p);.       
1bbf0 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
1bc00 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1bc10 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73         p->rc = s
1bc20 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
1bc30 62 4d 61 69 6e 2c 20 22 43 4f 4d 4d 49 54 22 2c  bMain, "COMMIT",
1bc40 20 30 2c 20 30 2c 20 26 70 2d 3e 7a 45 72 72 6d   0, 0, &p->zErrm
1bc50 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  sg);.          }
1bc60 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
1bc70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
1bc80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
1bc90 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65  ->rc = sqlite3_e
1bca0 78 65 63 28 70 2d 3e 64 62 52 62 75 2c 20 22 43  xec(p->dbRbu, "C
1bcb0 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 2c 20 26 70  OMMIT", 0, 0, &p
1bcc0 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a 20 20 20 20  ->zErrmsg);.    
1bcd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1bce0 20 20 70 2d 3e 65 53 74 61 67 65 20 3d 20 52 42    p->eStage = RB
1bcf0 55 5f 53 54 41 47 45 5f 4d 4f 56 45 3b 0a 20 20  U_STAGE_MOVE;.  
1bd00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1bd10 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a  break;.      }..
1bd20 20 20 20 20 20 20 63 61 73 65 20 52 42 55 5f 53        case RBU_S
1bd30 54 41 47 45 5f 4d 4f 56 45 3a 20 7b 0a 20 20 20  TAGE_MOVE: {.   
1bd40 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
1bd50 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1bd60 20 20 20 20 20 20 20 72 62 75 4d 6f 76 65 4f 61         rbuMoveOa
1bd70 6c 46 69 6c 65 28 70 29 3b 0a 20 20 20 20 20 20  lFile(p);.      
1bd80 20 20 20 20 70 2d 3e 6e 50 72 6f 67 72 65 73 73      p->nProgress
1bd90 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ++;.        }.  
1bda0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1bdb0 20 20 20 7d 0a 0a 20 20 20 20 20 20 63 61 73 65     }..      case
1bdc0 20 52 42 55 5f 53 54 41 47 45 5f 43 4b 50 54 3a   RBU_STAGE_CKPT:
1bdd0 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   {.        if( p
1bde0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
1bdf0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
1be00 20 70 2d 3e 6e 53 74 65 70 3e 3d 70 2d 3e 6e 46   p->nStep>=p->nF
1be10 72 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20  rame ){.        
1be20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65      sqlite3_file
1be30 20 2a 70 44 62 20 3d 20 70 2d 3e 70 54 61 72 67   *pDb = p->pTarg
1be40 65 74 46 64 2d 3e 70 52 65 61 6c 3b 0a 20 20 0a  etFd->pReal;.  .
1be50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1be60 79 6e 63 20 74 68 65 20 64 62 20 66 69 6c 65 20  ync the db file 
1be70 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  */.            p
1be80 2d 3e 72 63 20 3d 20 70 44 62 2d 3e 70 4d 65 74  ->rc = pDb->pMet
1be90 68 6f 64 73 2d 3e 78 53 79 6e 63 28 70 44 62 2c  hods->xSync(pDb,
1bea0 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
1beb0 4d 41 4c 29 3b 0a 20 20 0a 20 20 20 20 20 20 20  MAL);.  .       
1bec0 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 6e       /* Update n
1bed0 42 61 63 6b 66 69 6c 6c 20 2a 2f 0a 20 20 20 20  Backfill */.    
1bee0 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72          if( p->r
1bef0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1bf00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 76 6f                vo
1bf10 69 64 20 76 6f 6c 61 74 69 6c 65 20 2a 70 74 72  id volatile *ptr
1bf20 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1bf30 70 2d 3e 72 63 20 3d 20 70 44 62 2d 3e 70 4d 65  p->rc = pDb->pMe
1bf40 74 68 6f 64 73 2d 3e 78 53 68 6d 4d 61 70 28 70  thods->xShmMap(p
1bf50 44 62 2c 20 30 2c 20 33 32 2a 31 30 32 34 2c 20  Db, 0, 32*1024, 
1bf60 30 2c 20 26 70 74 72 29 3b 0a 20 20 20 20 20 20  0, &ptr);.      
1bf70 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72          if( p->r
1bf80 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1bf90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bfa0 28 28 75 33 32 20 76 6f 6c 61 74 69 6c 65 2a 29  ((u32 volatile*)
1bfb0 70 74 72 29 5b 32 34 5d 20 3d 20 70 2d 3e 69 4d  ptr)[24] = p->iM
1bfc0 61 78 46 72 61 6d 65 3b 0a 20 20 20 20 20 20 20  axFrame;.       
1bfd0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1bfe0 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20       }.  .      
1bff0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
1c000 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1c010 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 65              p->e
1c020 53 74 61 67 65 20 3d 20 52 42 55 5f 53 54 41 47  Stage = RBU_STAG
1c030 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20  E_DONE;.        
1c040 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51        p->rc = SQ
1c050 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20  LITE_DONE;.     
1c060 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1c070 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1c080 20 20 20 20 20 20 2f 2a 20 41 74 20 6f 6e 65 20        /* At one 
1c090 70 6f 69 6e 74 20 74 68 65 20 66 6f 6c 6c 6f 77  point the follow
1c0a0 69 6e 67 20 62 6c 6f 63 6b 20 63 6f 70 69 65 64  ing block copied
1c0b0 20 61 20 73 69 6e 67 6c 65 20 66 72 61 6d 65 20   a single frame 
1c0c0 66 72 6f 6d 20 74 68 65 0a 20 20 20 20 20 20 20  from the.       
1c0d0 20 20 20 20 20 2a 2a 20 77 61 6c 20 66 69 6c 65       ** wal file
1c0e0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1c0f0 20 66 69 6c 65 2e 20 53 6f 20 74 68 61 74 20 6f   file. So that o
1c100 6e 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  ne call to sqlit
1c110 65 33 72 62 75 5f 73 74 65 70 28 29 0a 20 20 20  e3rbu_step().   
1c120 20 20 20 20 20 20 20 20 20 2a 2a 20 63 68 65 63           ** chec
1c130 6b 70 6f 69 6e 74 65 64 20 61 20 73 69 6e 67 6c  kpointed a singl
1c140 65 20 66 72 61 6d 65 2e 20 0a 20 20 20 20 20 20  e frame. .      
1c150 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
1c160 20 20 20 20 20 2a 2a 20 48 6f 77 65 76 65 72 2c       ** However,
1c170 20 69 66 20 74 68 65 20 73 65 63 74 6f 72 2d 73   if the sector-s
1c180 69 7a 65 20 69 73 20 6c 61 72 67 65 72 20 74 68  ize is larger th
1c190 61 6e 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  an the page-size
1c1a0 2c 20 61 6e 64 20 74 68 65 0a 20 20 20 20 20 20  , and the.      
1c1b0 20 20 20 20 20 20 2a 2a 20 61 70 70 6c 69 63 61        ** applica
1c1c0 74 69 6f 6e 20 63 61 6c 6c 73 20 73 71 6c 69 74  tion calls sqlit
1c1d0 65 33 72 62 75 5f 73 61 76 65 73 74 61 74 65 28  e3rbu_savestate(
1c1e0 29 20 6f 72 20 63 6c 6f 73 65 28 29 20 69 6d 6d  ) or close() imm
1c1f0 65 64 69 61 74 65 6c 79 0a 20 20 20 20 20 20 20  ediately.       
1c200 20 20 20 20 20 2a 2a 20 61 66 74 65 72 20 74 68       ** after th
1c210 69 73 20 73 74 65 70 2c 20 74 68 65 6e 20 72 62  is step, then rb
1c220 75 5f 73 74 65 70 28 29 20 61 67 61 69 6e 2c 20  u_step() again, 
1c230 74 68 65 6e 20 61 20 70 6f 77 65 72 20 66 61 69  then a power fai
1c240 6c 75 72 65 20 6f 63 63 75 72 73 2c 0a 20 20 20  lure occurs,.   
1c250 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e           ** then
1c260 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70 61   the database pa
1c270 67 65 20 77 72 69 74 74 65 6e 20 68 65 72 65 20  ge written here 
1c280 6d 61 79 20 62 65 20 64 61 6d 61 67 65 64 2e 20  may be damaged. 
1c290 57 6f 72 6b 20 61 72 6f 75 6e 64 0a 20 20 20 20  Work around.    
1c2a0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20          ** this 
1c2b0 62 79 20 63 68 65 63 6b 70 6f 69 6e 74 69 6e 67  by checkpointing
1c2c0 20 66 72 61 6d 65 73 20 75 6e 74 69 6c 20 74 68   frames until th
1c2d0 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74  e next page in t
1c2e0 68 65 20 61 46 72 61 6d 65 5b 5d 0a 20 20 20 20  he aFrame[].    
1c2f0 20 20 20 20 20 20 20 20 2a 2a 20 6c 69 65 73 20          ** lies 
1c300 6f 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 64  on a different d
1c310 69 73 6b 20 73 65 63 74 6f 72 20 74 6f 20 74 68  isk sector to th
1c320 65 20 63 75 72 72 65 6e 74 20 6f 6e 65 2e 20 2a  e current one. *
1c330 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 33  /.            u3
1c340 32 20 69 53 65 63 74 6f 72 3b 0a 20 20 20 20 20  2 iSector;.     
1c350 20 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20         do{.     
1c360 20 20 20 20 20 20 20 20 20 52 62 75 46 72 61 6d           RbuFram
1c370 65 20 2a 70 46 72 61 6d 65 20 3d 20 26 70 2d 3e  e *pFrame = &p->
1c380 61 46 72 61 6d 65 5b 70 2d 3e 6e 53 74 65 70 5d  aFrame[p->nStep]
1c390 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1c3a0 69 53 65 63 74 6f 72 20 3d 20 28 70 46 72 61 6d  iSector = (pFram
1c3b0 65 2d 3e 69 44 62 50 61 67 65 2d 31 29 20 2f 20  e->iDbPage-1) / 
1c3c0 70 2d 3e 6e 50 61 67 65 50 65 72 53 65 63 74 6f  p->nPagePerSecto
1c3d0 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r;.             
1c3e0 20 72 62 75 43 68 65 63 6b 70 6f 69 6e 74 46 72   rbuCheckpointFr
1c3f0 61 6d 65 28 70 2c 20 70 46 72 61 6d 65 29 3b 0a  ame(p, pFrame);.
1c400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
1c410 3e 6e 53 74 65 70 2b 2b 3b 0a 20 20 20 20 20 20  >nStep++;.      
1c420 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 70 2d        }while( p-
1c430 3e 6e 53 74 65 70 3c 70 2d 3e 6e 46 72 61 6d 65  >nStep<p->nFrame
1c440 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
1c450 20 20 20 26 26 20 69 53 65 63 74 6f 72 3d 3d 28     && iSector==(
1c460 28 70 2d 3e 61 46 72 61 6d 65 5b 70 2d 3e 6e 53  (p->aFrame[p->nS
1c470 74 65 70 5d 2e 69 44 62 50 61 67 65 2d 31 29 20  tep].iDbPage-1) 
1c480 2f 20 70 2d 3e 6e 50 61 67 65 50 65 72 53 65 63  / p->nPagePerSec
1c490 74 6f 72 29 0a 20 20 20 20 20 20 20 20 20 20 20  tor).           
1c4a0 20 20 20 20 20 20 26 26 20 70 2d 3e 72 63 3d 3d        && p->rc==
1c4b0 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20  SQLITE_OK.      
1c4c0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
1c4d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
1c4e0 2d 3e 6e 50 72 6f 67 72 65 73 73 2b 2b 3b 0a 20  ->nProgress++;. 
1c4f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1c500 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
1c510 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  .      default:.
1c520 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1c530 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
1c540 70 2d 3e 72 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a  p->rc;.  }else{.
1c550 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1c560 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 7d 0a 0a  E_NOMEM;.  }.}..
1c570 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 73 74  /*.** Compare st
1c580 72 69 6e 67 73 20 7a 31 20 61 6e 64 20 7a 32 2c  rings z1 and z2,
1c590 20 72 65 74 75 72 6e 69 6e 67 20 30 20 69 66 20   returning 0 if 
1c5a0 74 68 65 79 20 61 72 65 20 69 64 65 6e 74 69 63  they are identic
1c5b0 61 6c 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 0a  al, or non-zero.
1c5c0 2a 2a 20 6f 74 68 65 72 77 69 73 65 2e 20 45 69  ** otherwise. Ei
1c5d0 74 68 65 72 20 6f 72 20 62 6f 74 68 20 61 72 67  ther or both arg
1c5e0 75 6d 65 6e 74 20 6d 61 79 20 62 65 20 4e 55 4c  ument may be NUL
1c5f0 4c 2e 20 54 77 6f 20 4e 55 4c 4c 20 76 61 6c 75  L. Two NULL valu
1c600 65 73 20 61 72 65 0a 2a 2a 20 63 6f 6e 73 69 64  es are.** consid
1c610 65 72 65 64 20 65 71 75 61 6c 2c 20 61 6e 64 20  ered equal, and 
1c620 4e 55 4c 4c 20 69 73 20 63 6f 6e 73 69 64 65 72  NULL is consider
1c630 65 64 20 64 69 73 74 69 6e 63 74 20 66 72 6f 6d  ed distinct from
1c640 20 61 6c 6c 20 6f 74 68 65 72 20 76 61 6c 75 65   all other value
1c650 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
1c660 20 72 62 75 53 74 72 43 6f 6d 70 61 72 65 28 63   rbuStrCompare(c
1c670 6f 6e 73 74 20 63 68 61 72 20 2a 7a 31 2c 20 63  onst char *z1, c
1c680 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32 29 7b 0a  onst char *z2){.
1c690 20 20 69 66 28 20 7a 31 3d 3d 30 20 26 26 20 7a    if( z1==0 && z
1c6a0 32 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  2==0 ) return 0;
1c6b0 0a 20 20 69 66 28 20 7a 31 3d 3d 30 20 7c 7c 20  .  if( z1==0 || 
1c6c0 7a 32 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  z2==0 ) return 1
1c6d0 3b 0a 20 20 72 65 74 75 72 6e 20 28 73 71 6c 69  ;.  return (sqli
1c6e0 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 31 2c 20  te3_stricmp(z1, 
1c6f0 7a 32 29 21 3d 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  z2)!=0);.}../*.*
1c700 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1c710 69 73 20 63 61 6c 6c 65 64 20 61 73 20 70 61 72  is called as par
1c720 74 20 6f 66 20 73 71 6c 69 74 65 33 72 62 75 5f  t of sqlite3rbu_
1c730 6f 70 65 6e 28 29 20 77 68 65 6e 20 69 6e 69 74  open() when init
1c740 69 61 6c 69 7a 69 6e 67 0a 2a 2a 20 61 6e 20 72  ializing.** an r
1c750 62 75 20 68 61 6e 64 6c 65 20 69 6e 20 4f 41 4c  bu handle in OAL
1c760 20 73 74 61 67 65 2e 20 49 66 20 74 68 65 20 72   stage. If the r
1c770 62 75 20 75 70 64 61 74 65 20 68 61 73 20 6e 6f  bu update has no
1c780 74 20 73 74 61 72 74 65 64 20 28 69 2e 65 2e 0a  t started (i.e..
1c790 2a 2a 20 74 68 65 20 72 62 75 5f 73 74 61 74 65  ** the rbu_state
1c7a0 20 74 61 62 6c 65 20 77 61 73 20 65 6d 70 74 79   table was empty
1c7b0 29 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  ) it is a no-op.
1c7c0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 61   Otherwise, it a
1c7d0 72 72 61 6e 67 65 73 0a 2a 2a 20 74 68 69 6e 67  rranges.** thing
1c7e0 73 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65  s so that the ne
1c7f0 78 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  xt call to sqlit
1c800 65 33 72 62 75 5f 73 74 65 70 28 29 20 63 6f 6e  e3rbu_step() con
1c810 74 69 6e 75 65 73 20 6f 6e 20 66 72 6f 6d 0a 2a  tinues on from.*
1c820 2a 20 77 68 65 72 65 20 74 68 65 20 70 72 65 76  * where the prev
1c830 69 6f 75 73 20 72 62 75 20 68 61 6e 64 6c 65 20  ious rbu handle 
1c840 6c 65 66 74 20 6f 66 66 2e 0a 2a 2a 0a 2a 2a 20  left off..**.** 
1c850 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
1c860 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  rs, an error cod
1c870 65 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73  e and error mess
1c880 61 67 65 20 61 72 65 20 6c 65 66 74 20 69 6e 20  age are left in 
1c890 74 68 65 0a 2a 2a 20 72 62 75 20 68 61 6e 64 6c  the.** rbu handl
1c8a0 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
1c8b0 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a  first argument..
1c8c0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
1c8d0 62 75 53 65 74 75 70 4f 61 6c 28 73 71 6c 69 74  buSetupOal(sqlit
1c8e0 65 33 72 62 75 20 2a 70 2c 20 52 62 75 53 74 61  e3rbu *p, RbuSta
1c8f0 74 65 20 2a 70 53 74 61 74 65 29 7b 0a 20 20 61  te *pState){.  a
1c900 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51  ssert( p->rc==SQ
1c910 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28  LITE_OK );.  if(
1c920 20 70 53 74 61 74 65 2d 3e 7a 54 62 6c 20 29 7b   pState->zTbl ){
1c930 0a 20 20 20 20 52 62 75 4f 62 6a 49 74 65 72 20  .    RbuObjIter 
1c940 2a 70 49 74 65 72 20 3d 20 26 70 2d 3e 6f 62 6a  *pIter = &p->obj
1c950 69 74 65 72 3b 0a 20 20 20 20 69 6e 74 20 72 63  iter;.    int rc
1c960 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
1c970 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51     while( rc==SQ
1c980 4c 49 54 45 5f 4f 4b 20 26 26 20 70 49 74 65 72  LITE_OK && pIter
1c990 2d 3e 7a 54 62 6c 20 26 26 20 28 70 49 74 65 72  ->zTbl && (pIter
1c9a0 2d 3e 62 43 6c 65 61 6e 75 70 20 0a 20 20 20 20  ->bCleanup .    
1c9b0 20 20 20 7c 7c 20 72 62 75 53 74 72 43 6f 6d 70     || rbuStrComp
1c9c0 61 72 65 28 70 49 74 65 72 2d 3e 7a 49 64 78 2c  are(pIter->zIdx,
1c9d0 20 70 53 74 61 74 65 2d 3e 7a 49 64 78 29 0a 20   pState->zIdx). 
1c9e0 20 20 20 20 20 20 7c 7c 20 28 70 53 74 61 74 65        || (pState
1c9f0 2d 3e 7a 44 61 74 61 54 62 6c 3d 3d 30 20 26 26  ->zDataTbl==0 &&
1ca00 20 72 62 75 53 74 72 43 6f 6d 70 61 72 65 28 70   rbuStrCompare(p
1ca10 49 74 65 72 2d 3e 7a 54 62 6c 2c 20 70 53 74 61  Iter->zTbl, pSta
1ca20 74 65 2d 3e 7a 54 62 6c 29 29 0a 20 20 20 20 20  te->zTbl)).     
1ca30 20 20 7c 7c 20 28 70 53 74 61 74 65 2d 3e 7a 44    || (pState->zD
1ca40 61 74 61 54 62 6c 20 26 26 20 72 62 75 53 74 72  ataTbl && rbuStr
1ca50 43 6f 6d 70 61 72 65 28 70 49 74 65 72 2d 3e 7a  Compare(pIter->z
1ca60 44 61 74 61 54 62 6c 2c 20 70 53 74 61 74 65 2d  DataTbl, pState-
1ca70 3e 7a 44 61 74 61 54 62 6c 29 29 0a 20 20 20 20  >zDataTbl)).    
1ca80 29 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72  )){.      rc = r
1ca90 62 75 4f 62 6a 49 74 65 72 4e 65 78 74 28 70 2c  buObjIterNext(p,
1caa0 20 70 49 74 65 72 29 3b 0a 20 20 20 20 7d 0a 0a   pIter);.    }..
1cab0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1cac0 54 45 5f 4f 4b 20 26 26 20 21 70 49 74 65 72 2d  TE_OK && !pIter-
1cad0 3e 7a 54 62 6c 20 29 7b 0a 20 20 20 20 20 20 72  >zTbl ){.      r
1cae0 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
1caf0 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 45 72 72 6d  ;.      p->zErrm
1cb00 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  sg = sqlite3_mpr
1cb10 69 6e 74 66 28 22 72 62 75 5f 73 74 61 74 65 20  intf("rbu_state 
1cb20 6d 69 73 6d 61 74 63 68 20 65 72 72 6f 72 22 29  mismatch error")
1cb30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
1cb40 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1cb50 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 74 65 70  {.      p->nStep
1cb60 20 3d 20 70 53 74 61 74 65 2d 3e 6e 52 6f 77 3b   = pState->nRow;
1cb70 0a 20 20 20 20 20 20 72 63 20 3d 20 72 62 75 4f  .      rc = rbuO
1cb80 62 6a 49 74 65 72 50 72 65 70 61 72 65 41 6c 6c  bjIterPrepareAll
1cb90 28 70 2c 20 26 70 2d 3e 6f 62 6a 69 74 65 72 2c  (p, &p->objiter,
1cba0 20 70 2d 3e 6e 53 74 65 70 29 3b 0a 20 20 20 20   p->nStep);.    
1cbb0 7d 0a 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 72  }..    p->rc = r
1cbc0 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  c;.  }.}../*.** 
1cbd0 49 66 20 74 68 65 72 65 20 69 73 20 61 20 22 2a  If there is a "*
1cbe0 2d 6f 61 6c 22 20 66 69 6c 65 20 69 6e 20 74 68  -oal" file in th
1cbf0 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 63 6f  e file-system co
1cc00 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74  rresponding to t
1cc10 68 65 0a 2a 2a 20 74 61 72 67 65 74 20 64 61 74  he.** target dat
1cc20 61 62 61 73 65 20 69 6e 20 74 68 65 20 66 69 6c  abase in the fil
1cc30 65 2d 73 79 73 74 65 6d 2c 20 64 65 6c 65 74 65  e-system, delete
1cc40 20 69 74 2e 20 49 66 20 61 6e 20 65 72 72 6f 72   it. If an error
1cc50 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 6c 65 61 76   occurs,.** leav
1cc60 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  e an error code 
1cc70 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67  and error messag
1cc80 65 20 69 6e 20 74 68 65 20 72 62 75 20 68 61 6e  e in the rbu han
1cc90 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  dle..*/.static v
1cca0 6f 69 64 20 72 62 75 44 65 6c 65 74 65 4f 61 6c  oid rbuDeleteOal
1ccb0 46 69 6c 65 28 73 71 6c 69 74 65 33 72 62 75 20  File(sqlite3rbu 
1ccc0 2a 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4f 61  *p){.  char *zOa
1ccd0 6c 20 3d 20 72 62 75 4d 50 72 69 6e 74 66 28 70  l = rbuMPrintf(p
1cce0 2c 20 22 25 73 2d 6f 61 6c 22 2c 20 70 2d 3e 7a  , "%s-oal", p->z
1ccf0 54 61 72 67 65 74 29 3b 0a 20 20 69 66 28 20 7a  Target);.  if( z
1cd00 4f 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Oal ){.    sqlit
1cd10 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 73  e3_vfs *pVfs = s
1cd20 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
1cd30 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  0);.    assert( 
1cd40 70 56 66 73 20 26 26 20 70 2d 3e 72 63 3d 3d 53  pVfs && p->rc==S
1cd50 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 7a  QLITE_OK && p->z
1cd60 45 72 72 6d 73 67 3d 3d 30 20 29 3b 0a 20 20 20  Errmsg==0 );.   
1cd70 20 70 56 66 73 2d 3e 78 44 65 6c 65 74 65 28 70   pVfs->xDelete(p
1cd80 56 66 73 2c 20 7a 4f 61 6c 2c 20 30 29 3b 0a 20  Vfs, zOal, 0);. 
1cd90 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1cda0 7a 4f 61 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  zOal);.  }.}../*
1cdb0 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 70  .** Allocate a p
1cdc0 72 69 76 61 74 65 20 72 62 75 20 56 46 53 20 66  rivate rbu VFS f
1cdd0 6f 72 20 74 68 65 20 72 62 75 20 68 61 6e 64 6c  or the rbu handl
1cde0 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
1cdf0 6f 6e 6c 79 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  only.** argument
1ce00 2e 20 54 68 69 73 20 56 46 53 20 77 69 6c 6c 20  . This VFS will 
1ce10 62 65 20 75 73 65 64 20 75 6e 6c 65 73 73 20 74  be used unless t
1ce20 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  he call to sqlit
1ce30 65 33 72 62 75 5f 6f 70 65 6e 28 29 0a 2a 2a 20  e3rbu_open().** 
1ce40 73 70 65 63 69 66 69 65 64 20 61 20 55 52 49 20  specified a URI 
1ce50 77 69 74 68 20 61 20 76 66 73 3d 3f 20 6f 70 74  with a vfs=? opt
1ce60 69 6f 6e 20 69 6e 20 70 6c 61 63 65 20 6f 66 20  ion in place of 
1ce70 61 20 74 61 72 67 65 74 20 64 61 74 61 62 61 73  a target databas
1ce80 65 0a 2a 2a 20 66 69 6c 65 20 6e 61 6d 65 2e 0a  e.** file name..
1ce90 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
1cea0 62 75 43 72 65 61 74 65 56 66 73 28 73 71 6c 69  buCreateVfs(sqli
1ceb0 74 65 33 72 62 75 20 2a 70 29 7b 0a 20 20 69 6e  te3rbu *p){.  in
1cec0 74 20 72 6e 64 3b 0a 20 20 63 68 61 72 20 7a 52  t rnd;.  char zR
1ced0 6e 64 5b 36 34 5d 3b 0a 0a 20 20 61 73 73 65 72  nd[64];..  asser
1cee0 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  t( p->rc==SQLITE
1cef0 5f 4f 4b 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  _OK );.  sqlite3
1cf00 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65  _randomness(size
1cf10 6f 66 28 69 6e 74 29 2c 20 28 76 6f 69 64 2a 29  of(int), (void*)
1cf20 26 72 6e 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  &rnd);.  sqlite3
1cf30 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
1cf40 28 7a 52 6e 64 29 2c 20 7a 52 6e 64 2c 20 22 72  (zRnd), zRnd, "r
1cf50 62 75 5f 76 66 73 5f 25 64 22 2c 20 72 6e 64 29  bu_vfs_%d", rnd)
1cf60 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69  ;.  p->rc = sqli
1cf70 74 65 33 72 62 75 5f 63 72 65 61 74 65 5f 76 66  te3rbu_create_vf
1cf80 73 28 7a 52 6e 64 2c 20 30 29 3b 0a 20 20 69 66  s(zRnd, 0);.  if
1cf90 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
1cfa0 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
1cfb0 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 73 71  3_vfs *pVfs = sq
1cfc0 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 7a  lite3_vfs_find(z
1cfd0 52 6e 64 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Rnd);.    assert
1cfe0 28 20 70 56 66 73 20 29 3b 0a 20 20 20 20 70 2d  ( pVfs );.    p-
1cff0 3e 7a 56 66 73 4e 61 6d 65 20 3d 20 70 56 66 73  >zVfsName = pVfs
1d000 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 28 28 72  ->zName;.    ((r
1d010 62 75 5f 76 66 73 2a 29 70 56 66 73 29 2d 3e 70  bu_vfs*)pVfs)->p
1d020 52 62 75 20 3d 20 70 3b 0a 20 20 7d 0a 7d 0a 0a  Rbu = p;.  }.}..
1d030 2f 2a 0a 2a 2a 20 44 65 73 74 72 6f 79 20 74 68  /*.** Destroy th
1d040 65 20 70 72 69 76 61 74 65 20 56 46 53 20 63 72  e private VFS cr
1d050 65 61 74 65 64 20 66 6f 72 20 74 68 65 20 72 62  eated for the rb
1d060 75 20 68 61 6e 64 6c 65 20 70 61 73 73 65 64 20  u handle passed 
1d070 61 73 20 74 68 65 20 6f 6e 6c 79 0a 2a 2a 20 61  as the only.** a
1d080 72 67 75 6d 65 6e 74 20 62 79 20 61 6e 20 65 61  rgument by an ea
1d090 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20 72 62  rlier call to rb
1d0a0 75 43 72 65 61 74 65 56 66 73 28 29 2e 0a 2a 2f  uCreateVfs()..*/
1d0b0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75  .static void rbu
1d0c0 44 65 6c 65 74 65 56 66 73 28 73 71 6c 69 74 65  DeleteVfs(sqlite
1d0d0 33 72 62 75 20 2a 70 29 7b 0a 20 20 69 66 28 20  3rbu *p){.  if( 
1d0e0 70 2d 3e 7a 56 66 73 4e 61 6d 65 20 29 7b 0a 20  p->zVfsName ){. 
1d0f0 20 20 20 73 71 6c 69 74 65 33 72 62 75 5f 64 65     sqlite3rbu_de
1d100 73 74 72 6f 79 5f 76 66 73 28 70 2d 3e 7a 56 66  stroy_vfs(p->zVf
1d110 73 4e 61 6d 65 29 3b 0a 20 20 20 20 70 2d 3e 7a  sName);.    p->z
1d120 56 66 73 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d  VfsName = 0;.  }
1d130 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 75  .}../*.** This u
1d140 73 65 72 2d 64 65 66 69 6e 65 64 20 53 51 4c 20  ser-defined SQL 
1d150 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f  function is invo
1d160 6b 65 64 20 77 69 74 68 20 61 20 73 69 6e 67 6c  ked with a singl
1d170 65 20 61 72 67 75 6d 65 6e 74 20 2d 20 74 68 65  e argument - the
1d180 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 61 20 74 61  .** name of a ta
1d190 62 6c 65 20 65 78 70 65 63 74 65 64 20 74 6f 20  ble expected to 
1d1a0 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 74 61  appear in the ta
1d1b0 72 67 65 74 20 64 61 74 61 62 61 73 65 2e 20 49  rget database. I
1d1c0 74 20 72 65 74 75 72 6e 73 0a 2a 2a 20 74 68 65  t returns.** the
1d1d0 20 6e 75 6d 62 65 72 20 6f 66 20 61 75 78 69 6c   number of auxil
1d1e0 6c 69 61 72 79 20 69 6e 64 65 78 65 73 20 6f 6e  liary indexes on
1d1f0 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73   the table..*/.s
1d200 74 61 74 69 63 20 76 6f 69 64 20 72 62 75 49 6e  tatic void rbuIn
1d210 64 65 78 43 6e 74 46 75 6e 63 28 0a 20 20 73 71  dexCntFunc(.  sq
1d220 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70  lite3_context *p
1d230 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 56 61 6c  Ctx, .  int nVal
1d240 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
1d250 65 20 2a 2a 61 70 56 61 6c 0a 29 7b 0a 20 20 73  e **apVal.){.  s
1d260 71 6c 69 74 65 33 72 62 75 20 2a 70 20 3d 20 28  qlite3rbu *p = (
1d270 73 71 6c 69 74 65 33 72 62 75 2a 29 73 71 6c 69  sqlite3rbu*)sqli
1d280 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28 70 43  te3_user_data(pC
1d290 74 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  tx);.  sqlite3_s
1d2a0 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a  tmt *pStmt = 0;.
1d2b0 20 20 63 68 61 72 20 2a 7a 45 72 72 6d 73 67 20    char *zErrmsg 
1d2c0 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  = 0;.  int rc;..
1d2d0 20 20 61 73 73 65 72 74 28 20 6e 56 61 6c 3d 3d    assert( nVal==
1d2e0 31 20 29 3b 0a 20 20 0a 20 20 72 63 20 3d 20 70  1 );.  .  rc = p
1d2f0 72 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f 6c  repareFreeAndCol
1d300 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 4d  lectError(p->dbM
1d310 61 69 6e 2c 20 26 70 53 74 6d 74 2c 20 26 7a 45  ain, &pStmt, &zE
1d320 72 72 6d 73 67 2c 20 0a 20 20 20 20 20 20 73 71  rrmsg, .      sq
1d330 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53  lite3_mprintf("S
1d340 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
1d350 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
1d360 72 20 22 0a 20 20 20 20 20 20 20 20 22 57 48 45  r ".        "WHE
1d370 52 45 20 74 79 70 65 3d 27 69 6e 64 65 78 27 20  RE type='index' 
1d380 41 4e 44 20 74 62 6c 5f 6e 61 6d 65 20 3d 20 25  AND tbl_name = %
1d390 51 22 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  Q", sqlite3_valu
1d3a0 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 30 5d 29  e_text(apVal[0])
1d3b0 29 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 21  ).  );.  if( rc!
1d3c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1d3d0 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
1d3e0 5f 65 72 72 6f 72 28 70 43 74 78 2c 20 7a 45 72  _error(pCtx, zEr
1d3f0 72 6d 73 67 2c 20 2d 31 29 3b 0a 20 20 7d 65 6c  rmsg, -1);.  }el
1d400 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 49 6e 64  se{.    int nInd
1d410 65 78 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  ex = 0;.    if( 
1d420 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69  SQLITE_ROW==sqli
1d430 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20  te3_step(pStmt) 
1d440 29 7b 0a 20 20 20 20 20 20 6e 49 6e 64 65 78 20  ){.      nIndex 
1d450 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
1d460 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a  _int(pStmt, 0);.
1d470 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
1d480 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
1d490 70 53 74 6d 74 29 3b 0a 20 20 20 20 69 66 28 20  pStmt);.    if( 
1d4a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1d4b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
1d4c0 65 73 75 6c 74 5f 69 6e 74 28 70 43 74 78 2c 20  esult_int(pCtx, 
1d4d0 6e 49 6e 64 65 78 29 3b 0a 20 20 20 20 7d 65 6c  nIndex);.    }el
1d4e0 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
1d4f0 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 70  3_result_error(p
1d500 43 74 78 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  Ctx, sqlite3_err
1d510 6d 73 67 28 70 2d 3e 64 62 4d 61 69 6e 29 2c 20  msg(p->dbMain), 
1d520 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  -1);.    }.  }..
1d530 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
1d540 45 72 72 6d 73 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Errmsg);.}../*.*
1d550 2a 20 49 66 20 74 68 65 20 52 42 55 20 64 61 74  * If the RBU dat
1d560 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 73 20 74  abase contains t
1d570 68 65 20 72 62 75 5f 63 6f 75 6e 74 20 74 61 62  he rbu_count tab
1d580 6c 65 2c 20 75 73 65 20 69 74 20 74 6f 20 69 6e  le, use it to in
1d590 69 74 69 61 6c 69 7a 65 0a 2a 2a 20 74 68 65 20  itialize.** the 
1d5a0 73 71 6c 69 74 65 33 72 62 75 2e 6e 50 68 61 73  sqlite3rbu.nPhas
1d5b0 65 4f 6e 65 53 74 65 70 20 76 61 72 69 61 62 6c  eOneStep variabl
1d5c0 65 2e 20 54 68 65 20 73 63 68 65 6d 61 20 6f 66  e. The schema of
1d5d0 20 74 68 65 20 72 62 75 5f 63 6f 75 6e 74 20 74   the rbu_count t
1d5e0 61 62 6c 65 0a 2a 2a 20 69 73 20 61 73 73 75 6d  able.** is assum
1d5f0 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68  ed to contain th
1d600 65 20 73 61 6d 65 20 63 6f 6c 75 6d 6e 73 20 61  e same columns a
1d610 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54  s:.**.**   CREAT
1d620 45 20 54 41 42 4c 45 20 72 62 75 5f 63 6f 75 6e  E TABLE rbu_coun
1d630 74 28 74 62 6c 20 54 45 58 54 20 50 52 49 4d 41  t(tbl TEXT PRIMA
1d640 52 59 20 4b 45 59 2c 20 63 6e 74 20 49 4e 54 45  RY KEY, cnt INTE
1d650 47 45 52 29 20 57 49 54 48 4f 55 54 20 52 4f 57  GER) WITHOUT ROW
1d660 49 44 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  ID;.**.** There 
1d670 73 68 6f 75 6c 64 20 62 65 20 6f 6e 65 20 72 6f  should be one ro
1d680 77 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 66  w in the table f
1d690 6f 72 20 65 61 63 68 20 64 61 74 61 5f 78 78 78  or each data_xxx
1d6a0 20 74 61 62 6c 65 20 69 6e 20 74 68 65 0a 2a 2a   table in the.**
1d6b0 20 64 61 74 61 62 61 73 65 2e 20 54 68 65 20 27   database. The '
1d6c0 74 62 6c 27 20 63 6f 6c 75 6d 6e 20 73 68 6f 75  tbl' column shou
1d6d0 6c 64 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e  ld contain the n
1d6e0 61 6d 65 20 6f 66 20 61 20 64 61 74 61 5f 78 78  ame of a data_xx
1d6f0 78 20 74 61 62 6c 65 2c 0a 2a 2a 20 61 6e 64 20  x table,.** and 
1d700 74 68 65 20 63 6e 74 20 63 6f 6c 75 6d 6e 20 74  the cnt column t
1d710 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
1d720 73 20 69 74 20 63 6f 6e 74 61 69 6e 73 2e 0a 2a  s it contains..*
1d730 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 72 62 75 2e  *.** sqlite3rbu.
1d740 6e 50 68 61 73 65 4f 6e 65 53 74 65 70 20 69 73  nPhaseOneStep is
1d750 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
1d760 74 68 65 20 73 75 6d 20 6f 66 20 28 31 20 2b 20  the sum of (1 + 
1d770 6e 49 6e 64 65 78 29 20 2a 20 63 6e 74 0a 2a 2a  nIndex) * cnt.**
1d780 20 66 6f 72 20 61 6c 6c 20 72 6f 77 73 20 69 6e   for all rows in
1d790 20 74 68 65 20 72 62 75 5f 63 6f 75 6e 74 20 74   the rbu_count t
1d7a0 61 62 6c 65 2c 20 77 68 65 72 65 20 6e 49 6e 64  able, where nInd
1d7b0 65 78 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ex is the number
1d7c0 20 6f 66 20 0a 2a 2a 20 69 6e 64 65 78 65 73 20   of .** indexes 
1d7d0 6f 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  on the correspon
1d7e0 64 69 6e 67 20 74 61 72 67 65 74 20 64 61 74 61  ding target data
1d7f0 62 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73  base table..*/.s
1d800 74 61 74 69 63 20 76 6f 69 64 20 72 62 75 49 6e  tatic void rbuIn
1d810 69 74 50 68 61 73 65 4f 6e 65 53 74 65 70 73 28  itPhaseOneSteps(
1d820 73 71 6c 69 74 65 33 72 62 75 20 2a 70 29 7b 0a  sqlite3rbu *p){.
1d830 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
1d840 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
1d850 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
1d860 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 62  t = 0;.    int b
1d870 45 78 69 73 74 73 20 3d 20 30 3b 20 20 20 20 20  Exists = 0;     
1d880 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1d890 75 65 20 69 66 20 72 62 75 5f 63 6f 75 6e 74 20  ue if rbu_count 
1d8a0 65 78 69 73 74 73 20 2a 2f 0a 0a 20 20 20 20 70  exists */..    p
1d8b0 2d 3e 6e 50 68 61 73 65 4f 6e 65 53 74 65 70 20  ->nPhaseOneStep 
1d8c0 3d 20 2d 31 3b 0a 0a 20 20 20 20 70 2d 3e 72 63  = -1;..    p->rc
1d8d0 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
1d8e0 65 5f 66 75 6e 63 74 69 6f 6e 28 70 2d 3e 64 62  e_function(p->db
1d8f0 52 62 75 2c 20 0a 20 20 20 20 20 20 20 20 22 72  Rbu, .        "r
1d900 62 75 5f 69 6e 64 65 78 5f 63 6e 74 22 2c 20 31  bu_index_cnt", 1
1d910 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 28  , SQLITE_UTF8, (
1d920 76 6f 69 64 2a 29 70 2c 20 72 62 75 49 6e 64 65  void*)p, rbuInde
1d930 78 43 6e 74 46 75 6e 63 2c 20 30 2c 20 30 0a 20  xCntFunc, 0, 0. 
1d940 20 20 20 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20     );.  .    /* 
1d950 43 68 65 63 6b 20 66 6f 72 20 74 68 65 20 72 62  Check for the rb
1d960 75 5f 63 6f 75 6e 74 20 74 61 62 6c 65 2e 20 49  u_count table. I
1d970 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78  f it does not ex
1d980 69 73 74 2c 20 6f 72 20 69 66 20 61 6e 20 65 72  ist, or if an er
1d990 72 6f 72 0a 20 20 20 20 2a 2a 20 6f 63 63 75 72  ror.    ** occur
1d9a0 73 2c 20 6e 50 68 61 73 65 4f 6e 65 53 74 65 70  s, nPhaseOneStep
1d9b0 20 77 69 6c 6c 20 62 65 20 6c 65 66 74 20 73 65   will be left se
1d9c0 74 20 74 6f 20 2d 31 2e 20 2a 2f 0a 20 20 20 20  t to -1. */.    
1d9d0 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
1d9e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d  E_OK ){.      p-
1d9f0 3e 72 63 20 3d 20 70 72 65 70 61 72 65 41 6e 64  >rc = prepareAnd
1da00 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e  CollectError(p->
1da10 64 62 52 62 75 2c 20 26 70 53 74 6d 74 2c 20 26  dbRbu, &pStmt, &
1da20 70 2d 3e 7a 45 72 72 6d 73 67 2c 0a 20 20 20 20  p->zErrmsg,.    
1da30 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 31 20        "SELECT 1 
1da40 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
1da50 65 72 20 57 48 45 52 45 20 74 62 6c 5f 6e 61 6d  er WHERE tbl_nam
1da60 65 20 3d 20 27 72 62 75 5f 63 6f 75 6e 74 27 22  e = 'rbu_count'"
1da70 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
1da80 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
1da90 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1daa0 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57    if( SQLITE_ROW
1dab0 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ==sqlite3_step(p
1dac0 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20 20 20  Stmt) ){.       
1dad0 20 62 45 78 69 73 74 73 20 3d 20 31 3b 0a 20 20   bExists = 1;.  
1dae0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 72      }.      p->r
1daf0 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  c = sqlite3_fina
1db00 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
1db10 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 70 2d   }.  .    if( p-
1db20 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
1db30 26 20 62 45 78 69 73 74 73 20 29 7b 0a 20 20 20  & bExists ){.   
1db40 20 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61     p->rc = prepa
1db50 72 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f  reAndCollectErro
1db60 72 28 70 2d 3e 64 62 52 62 75 2c 20 26 70 53 74  r(p->dbRbu, &pSt
1db70 6d 74 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c  mt, &p->zErrmsg,
1db80 0a 20 20 20 20 20 20 20 20 20 20 22 53 45 4c 45  .          "SELE
1db90 43 54 20 73 75 6d 28 63 6e 74 20 2a 20 28 31 20  CT sum(cnt * (1 
1dba0 2b 20 72 62 75 5f 69 6e 64 65 78 5f 63 6e 74 28  + rbu_index_cnt(
1dbb0 72 62 75 5f 74 61 72 67 65 74 5f 6e 61 6d 65 28  rbu_target_name(
1dbc0 74 62 6c 29 29 29 29 22 0a 20 20 20 20 20 20 20  tbl))))".       
1dbd0 20 20 20 22 46 52 4f 4d 20 72 62 75 5f 63 6f 75     "FROM rbu_cou
1dbe0 6e 74 22 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  nt".      );.   
1dbf0 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
1dc00 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1dc10 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f     if( SQLITE_RO
1dc20 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28  W==sqlite3_step(
1dc30 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20 20  pStmt) ){.      
1dc40 20 20 20 20 70 2d 3e 6e 50 68 61 73 65 4f 6e 65      p->nPhaseOne
1dc50 53 74 65 70 20 3d 20 73 71 6c 69 74 65 33 5f 63  Step = sqlite3_c
1dc60 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d  olumn_int64(pStm
1dc70 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d  t, 0);.        }
1dc80 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  .        p->rc =
1dc90 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
1dca0 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  e(pStmt);.      
1dcb0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a  }.    }.  }.}...
1dcc0 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 72 62  static sqlite3rb
1dcd0 75 20 2a 6f 70 65 6e 52 62 75 48 61 6e 64 6c 65  u *openRbuHandle
1dce0 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
1dcf0 7a 54 61 72 67 65 74 2c 20 0a 20 20 63 6f 6e 73  zTarget, .  cons
1dd00 74 20 63 68 61 72 20 2a 7a 52 62 75 2c 0a 20 20  t char *zRbu,.  
1dd10 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 61  const char *zSta
1dd20 74 65 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 72  te.){.  sqlite3r
1dd30 62 75 20 2a 70 3b 0a 20 20 73 69 7a 65 5f 74 20  bu *p;.  size_t 
1dd40 6e 54 61 72 67 65 74 20 3d 20 7a 54 61 72 67 65  nTarget = zTarge
1dd50 74 20 3f 20 73 74 72 6c 65 6e 28 7a 54 61 72 67  t ? strlen(zTarg
1dd60 65 74 29 20 3a 20 30 3b 0a 20 20 73 69 7a 65 5f  et) : 0;.  size_
1dd70 74 20 6e 52 62 75 20 3d 20 73 74 72 6c 65 6e 28  t nRbu = strlen(
1dd80 7a 52 62 75 29 3b 0a 20 20 73 69 7a 65 5f 74 20  zRbu);.  size_t 
1dd90 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 73  nByte = sizeof(s
1dda0 71 6c 69 74 65 33 72 62 75 29 20 2b 20 6e 54 61  qlite3rbu) + nTa
1ddb0 72 67 65 74 2b 31 20 2b 20 6e 52 62 75 2b 31 3b  rget+1 + nRbu+1;
1ddc0 0a 0a 20 20 70 20 3d 20 28 73 71 6c 69 74 65 33  ..  p = (sqlite3
1ddd0 72 62 75 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c  rbu*)sqlite3_mal
1dde0 6c 6f 63 36 34 28 6e 42 79 74 65 29 3b 0a 20 20  loc64(nByte);.  
1ddf0 69 66 28 20 70 20 29 7b 0a 20 20 20 20 52 62 75  if( p ){.    Rbu
1de00 53 74 61 74 65 20 2a 70 53 74 61 74 65 20 3d 20  State *pState = 
1de10 30 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74  0;..    /* Creat
1de20 65 20 74 68 65 20 63 75 73 74 6f 6d 20 56 46 53  e the custom VFS
1de30 2e 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28  . */.    memset(
1de40 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 71 6c  p, 0, sizeof(sql
1de50 69 74 65 33 72 62 75 29 29 3b 0a 20 20 20 20 72  ite3rbu));.    r
1de60 62 75 43 72 65 61 74 65 56 66 73 28 70 29 3b 0a  buCreateVfs(p);.
1de70 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65  .    /* Open the
1de80 20 74 61 72 67 65 74 2c 20 52 42 55 20 61 6e 64   target, RBU and
1de90 20 73 74 61 74 65 20 64 61 74 61 62 61 73 65 73   state databases
1dea0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 72   */.    if( p->r
1deb0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1dec0 20 20 20 20 20 20 63 68 61 72 20 2a 70 43 73 72        char *pCsr
1ded0 20 3d 20 28 63 68 61 72 2a 29 26 70 5b 31 5d 3b   = (char*)&p[1];
1dee0 0a 20 20 20 20 20 20 69 6e 74 20 62 52 65 74 72  .      int bRetr
1def0 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  y = 0;.      if(
1df00 20 7a 54 61 72 67 65 74 20 29 7b 0a 20 20 20 20   zTarget ){.    
1df10 20 20 20 20 70 2d 3e 7a 54 61 72 67 65 74 20 3d      p->zTarget =
1df20 20 70 43 73 72 3b 0a 20 20 20 20 20 20 20 20 6d   pCsr;.        m
1df30 65 6d 63 70 79 28 70 2d 3e 7a 54 61 72 67 65 74  emcpy(p->zTarget
1df40 2c 20 7a 54 61 72 67 65 74 2c 20 6e 54 61 72 67  , zTarget, nTarg
1df50 65 74 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 70  et+1);.        p
1df60 43 73 72 20 2b 3d 20 6e 54 61 72 67 65 74 2b 31  Csr += nTarget+1
1df70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1df80 70 2d 3e 7a 52 62 75 20 3d 20 70 43 73 72 3b 0a  p->zRbu = pCsr;.
1df90 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e        memcpy(p->
1dfa0 7a 52 62 75 2c 20 7a 52 62 75 2c 20 6e 52 62 75  zRbu, zRbu, nRbu
1dfb0 2b 31 29 3b 0a 20 20 20 20 20 20 70 43 73 72 20  +1);.      pCsr 
1dfc0 2b 3d 20 6e 52 62 75 2b 31 3b 0a 20 20 20 20 20  += nRbu+1;.     
1dfd0 20 69 66 28 20 7a 53 74 61 74 65 20 29 7b 0a 20   if( zState ){. 
1dfe0 20 20 20 20 20 20 20 70 2d 3e 7a 53 74 61 74 65         p->zState
1dff0 20 3d 20 72 62 75 4d 50 72 69 6e 74 66 28 70 2c   = rbuMPrintf(p,
1e000 20 22 25 73 22 2c 20 7a 53 74 61 74 65 29 3b 0a   "%s", zState);.
1e010 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
1e020 2a 20 49 66 20 74 68 65 20 66 69 72 73 74 20 61  * If the first a
1e030 74 74 65 6d 70 74 20 74 6f 20 6f 70 65 6e 20 74  ttempt to open t
1e040 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1e050 20 66 61 69 6c 73 20 61 6e 64 20 74 68 65 20 62   fails and the b
1e060 52 65 74 72 79 0a 20 20 20 20 20 20 2a 2a 20 66  Retry.      ** f
1e070 6c 61 67 20 69 74 20 73 65 74 2c 20 74 68 69 73  lag it set, this
1e080 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
1e090 64 62 20 77 61 73 20 6e 6f 74 20 6f 70 65 6e 65  db was not opene
1e0a0 64 20 62 65 63 61 75 73 65 20 69 74 20 73 65 65  d because it see
1e0b0 6d 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  med.      ** to 
1e0c0 62 65 20 61 20 77 61 6c 2d 6d 6f 64 65 20 64 62  be a wal-mode db
1e0d0 2e 20 42 75 74 2c 20 74 68 69 73 20 6d 61 79 20  . But, this may 
1e0e0 68 61 76 65 20 68 61 70 70 65 6e 65 64 20 64 75  have happened du
1e0f0 65 20 74 6f 20 61 6e 20 65 61 72 6c 69 65 72 0a  e to an earlier.
1e100 20 20 20 20 20 20 2a 2a 20 52 42 55 20 76 61 63        ** RBU vac
1e110 75 75 6d 20 6f 70 65 72 61 74 69 6f 6e 20 6c 65  uum operation le
1e120 61 76 69 6e 67 20 61 6e 20 6f 6c 64 20 77 61 6c  aving an old wal
1e130 20 66 69 6c 65 20 69 6e 20 74 68 65 20 64 69 72   file in the dir
1e140 65 63 74 6f 72 79 2e 0a 20 20 20 20 20 20 2a 2a  ectory..      **
1e150 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
1e160 63 61 73 65 2c 20 69 74 20 77 69 6c 6c 20 68 61  case, it will ha
1e170 76 65 20 62 65 65 6e 20 63 68 65 63 6b 70 6f 69  ve been checkpoi
1e180 6e 74 65 64 20 61 6e 64 20 64 65 6c 65 74 65 64  nted and deleted
1e190 0a 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 74  .      ** when t
1e1a0 68 65 20 68 61 6e 64 6c 65 20 77 61 73 20 63 6c  he handle was cl
1e1b0 6f 73 65 64 20 61 6e 64 20 61 20 73 65 63 6f 6e  osed and a secon
1e1c0 64 20 61 74 74 65 6d 70 74 20 74 6f 20 6f 70 65  d attempt to ope
1e1d0 6e 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  n the .      ** 
1e1e0 64 61 74 61 62 61 73 65 20 6d 61 79 20 73 75 63  database may suc
1e1f0 63 65 65 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20  ceed.  */.      
1e200 72 62 75 4f 70 65 6e 44 61 74 61 62 61 73 65 28  rbuOpenDatabase(
1e210 70 2c 20 26 62 52 65 74 72 79 29 3b 0a 20 20 20  p, &bRetry);.   
1e220 20 20 20 69 66 28 20 62 52 65 74 72 79 20 29 7b     if( bRetry ){
1e230 0a 20 20 20 20 20 20 20 20 72 62 75 4f 70 65 6e  .        rbuOpen
1e240 44 61 74 61 62 61 73 65 28 70 2c 20 30 29 3b 0a  Database(p, 0);.
1e250 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1e260 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
1e270 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1e280 20 70 53 74 61 74 65 20 3d 20 72 62 75 4c 6f 61   pState = rbuLoa
1e290 64 53 74 61 74 65 28 70 29 3b 0a 20 20 20 20 20  dState(p);.     
1e2a0 20 61 73 73 65 72 74 28 20 70 53 74 61 74 65 20   assert( pState 
1e2b0 7c 7c 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45  || p->rc!=SQLITE
1e2c0 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69 66 28  _OK );.      if(
1e2d0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1e2e0 4b 20 29 7b 0a 0a 20 20 20 20 20 20 20 20 69 66  K ){..        if
1e2f0 28 20 70 53 74 61 74 65 2d 3e 65 53 74 61 67 65  ( pState->eStage
1e300 3d 3d 30 20 29 7b 20 0a 20 20 20 20 20 20 20 20  ==0 ){ .        
1e310 20 20 72 62 75 44 65 6c 65 74 65 4f 61 6c 46 69    rbuDeleteOalFi
1e320 6c 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20  le(p);.         
1e330 20 72 62 75 49 6e 69 74 50 68 61 73 65 4f 6e 65   rbuInitPhaseOne
1e340 53 74 65 70 73 28 70 29 3b 0a 20 20 20 20 20 20  Steps(p);.      
1e350 20 20 20 20 70 2d 3e 65 53 74 61 67 65 20 3d 20      p->eStage = 
1e360 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 3b 0a 20  RBU_STAGE_OAL;. 
1e370 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1e380 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 67          p->eStag
1e390 65 20 3d 20 70 53 74 61 74 65 2d 3e 65 53 74 61  e = pState->eSta
1e3a0 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d  ge;.          p-
1e3b0 3e 6e 50 68 61 73 65 4f 6e 65 53 74 65 70 20 3d  >nPhaseOneStep =
1e3c0 20 70 53 74 61 74 65 2d 3e 6e 50 68 61 73 65 4f   pState->nPhaseO
1e3d0 6e 65 53 74 65 70 3b 0a 20 20 20 20 20 20 20 20  neStep;.        
1e3e0 7d 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 50 72  }.        p->nPr
1e3f0 6f 67 72 65 73 73 20 3d 20 70 53 74 61 74 65 2d  ogress = pState-
1e400 3e 6e 50 72 6f 67 72 65 73 73 3b 0a 20 20 20 20  >nProgress;.    
1e410 20 20 20 20 70 2d 3e 69 4f 61 6c 53 7a 20 3d 20      p->iOalSz = 
1e420 70 53 74 61 74 65 2d 3e 69 4f 61 6c 53 7a 3b 0a  pState->iOalSz;.
1e430 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1e440 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 21    assert( p->rc!
1e450 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d  =SQLITE_OK || p-
1e460 3e 65 53 74 61 67 65 21 3d 30 20 29 3b 0a 0a 20  >eStage!=0 );.. 
1e470 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
1e480 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 70 54  LITE_OK && p->pT
1e490 61 72 67 65 74 46 64 2d 3e 70 57 61 6c 46 64 20  argetFd->pWalFd 
1e4a0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
1e4b0 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47  eStage==RBU_STAG
1e4c0 45 5f 4f 41 4c 20 29 7b 0a 20 20 20 20 20 20 20  E_OAL ){.       
1e4d0 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
1e4e0 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 70  ERROR;.        p
1e4f0 2d 3e 7a 45 72 72 6d 73 67 20 3d 20 73 71 6c 69  ->zErrmsg = sqli
1e500 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 63 61 6e  te3_mprintf("can
1e510 6e 6f 74 20 75 70 64 61 74 65 20 77 61 6c 20 6d  not update wal m
1e520 6f 64 65 20 64 61 74 61 62 61 73 65 22 29 3b 0a  ode database");.
1e530 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1e540 70 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53  p->eStage==RBU_S
1e550 54 41 47 45 5f 4d 4f 56 45 20 29 7b 0a 20 20 20  TAGE_MOVE ){.   
1e560 20 20 20 20 20 70 2d 3e 65 53 74 61 67 65 20 3d       p->eStage =
1e570 20 52 42 55 5f 53 54 41 47 45 5f 43 4b 50 54 3b   RBU_STAGE_CKPT;
1e580 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 74 65  .        p->nSte
1e590 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  p = 0;.      }. 
1e5a0 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 2d     }..    if( p-
1e5b0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a  >rc==SQLITE_OK .
1e5c0 20 20 20 20 20 26 26 20 28 70 2d 3e 65 53 74 61       && (p->eSta
1e5d0 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4f 41  ge==RBU_STAGE_OA
1e5e0 4c 20 7c 7c 20 70 2d 3e 65 53 74 61 67 65 3d 3d  L || p->eStage==
1e5f0 52 42 55 5f 53 54 41 47 45 5f 4d 4f 56 45 29 0a  RBU_STAGE_MOVE).
1e600 20 20 20 20 20 26 26 20 70 53 74 61 74 65 2d 3e       && pState->
1e610 65 53 74 61 67 65 21 3d 30 0a 20 20 20 20 29 7b  eStage!=0.    ){
1e620 0a 20 20 20 20 20 20 72 62 75 5f 66 69 6c 65 20  .      rbu_file 
1e630 2a 70 46 64 20 3d 20 28 72 62 75 49 73 56 61 63  *pFd = (rbuIsVac
1e640 75 75 6d 28 70 29 20 3f 20 70 2d 3e 70 52 62 75  uum(p) ? p->pRbu
1e650 46 64 20 3a 20 70 2d 3e 70 54 61 72 67 65 74 46  Fd : p->pTargetF
1e660 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 46  d);.      if( pF
1e670 64 2d 3e 69 43 6f 6f 6b 69 65 21 3d 70 53 74 61  d->iCookie!=pSta
1e680 74 65 2d 3e 69 43 6f 6f 6b 69 65 20 29 7b 20 20  te->iCookie ){  
1e690 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20   .        /* At 
1e6a0 74 68 69 73 20 70 6f 69 6e 74 20 28 70 54 61 72  this point (pTar
1e6b0 67 65 74 46 64 2d 3e 69 43 6f 6f 6b 69 65 29 20  getFd->iCookie) 
1e6c0 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61 6c  contains the val
1e6d0 75 65 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20  ue of the.      
1e6e0 20 20 2a 2a 20 63 68 61 6e 67 65 2d 63 6f 75 6e    ** change-coun
1e6f0 74 65 72 20 63 6f 6f 6b 69 65 20 28 74 68 65 20  ter cookie (the 
1e700 74 68 69 6e 67 20 74 68 61 74 20 67 65 74 73 20  thing that gets 
1e710 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 68 65 6e  incremented when
1e720 20 61 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74   a .        ** t
1e730 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f  ransaction is co
1e740 6d 6d 69 74 74 65 64 20 69 6e 20 72 6f 6c 6c 62  mmitted in rollb
1e750 61 63 6b 20 6d 6f 64 65 29 20 63 75 72 72 65 6e  ack mode) curren
1e760 74 6c 79 20 73 74 6f 72 65 64 20 6f 6e 20 0a 20  tly stored on . 
1e770 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 31         ** page 1
1e780 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1e790 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20   file. */.      
1e7a0 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
1e7b0 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 70  _BUSY;.        p
1e7c0 2d 3e 7a 45 72 72 6d 73 67 20 3d 20 73 71 6c 69  ->zErrmsg = sqli
1e7d0 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 64 61 74  te3_mprintf("dat
1e7e0 61 62 61 73 65 20 6d 6f 64 69 66 69 65 64 20 64  abase modified d
1e7f0 75 72 69 6e 67 20 72 62 75 20 25 73 22 2c 0a 20  uring rbu %s",. 
1e800 20 20 20 20 20 20 20 20 20 20 20 28 72 62 75 49             (rbuI
1e810 73 56 61 63 75 75 6d 28 70 29 20 3f 20 22 76 61  sVacuum(p) ? "va
1e820 63 75 75 6d 22 20 3a 20 22 75 70 64 61 74 65 22  cuum" : "update"
1e830 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  ).        );.   
1e840 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
1e850 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
1e860 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66  E_OK ){.      if
1e870 28 20 70 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55  ( p->eStage==RBU
1e880 5f 53 54 41 47 45 5f 4f 41 4c 20 29 7b 0a 20 20  _STAGE_OAL ){.  
1e890 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64        sqlite3 *d
1e8a0 62 20 3d 20 70 2d 3e 64 62 4d 61 69 6e 3b 0a 20  b = p->dbMain;. 
1e8b0 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73         p->rc = s
1e8c0 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
1e8d0 62 52 62 75 2c 20 22 42 45 47 49 4e 22 2c 20 30  bRbu, "BEGIN", 0
1e8e0 2c 20 30 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67  , 0, &p->zErrmsg
1e8f0 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 50  );..        /* P
1e900 6f 69 6e 74 20 74 68 65 20 6f 62 6a 65 63 74 20  oint the object 
1e910 69 74 65 72 61 74 6f 72 20 61 74 20 74 68 65 20  iterator at the 
1e920 66 69 72 73 74 20 6f 62 6a 65 63 74 20 2a 2f 0a  first object */.
1e930 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72          if( p->r
1e940 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1e950 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20            p->rc 
1e960 3d 20 72 62 75 4f 62 6a 49 74 65 72 46 69 72 73  = rbuObjIterFirs
1e970 74 28 70 2c 20 26 70 2d 3e 6f 62 6a 69 74 65 72  t(p, &p->objiter
1e980 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  );.        }..  
1e990 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
1e9a0 52 42 55 20 64 61 74 61 62 61 73 65 20 63 6f 6e  RBU database con
1e9b0 74 61 69 6e 73 20 6e 6f 20 64 61 74 61 5f 78 78  tains no data_xx
1e9c0 78 20 74 61 62 6c 65 73 2c 20 64 65 63 6c 61 72  x tables, declar
1e9d0 65 20 74 68 65 20 52 42 55 0a 20 20 20 20 20 20  e the RBU.      
1e9e0 20 20 2a 2a 20 75 70 64 61 74 65 20 66 69 6e 69    ** update fini
1e9f0 73 68 65 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20  shed.  */.      
1ea00 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
1ea10 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 6f 62 6a  ITE_OK && p->obj
1ea20 69 74 65 72 2e 7a 54 62 6c 3d 3d 30 20 29 7b 0a  iter.zTbl==0 ){.
1ea30 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20            p->rc 
1ea40 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  = SQLITE_DONE;. 
1ea50 20 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61           p->eSta
1ea60 67 65 20 3d 20 52 42 55 5f 53 54 41 47 45 5f 44  ge = RBU_STAGE_D
1ea70 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ONE;.        }el
1ea80 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  se{.          if
1ea90 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
1eaa0 4f 4b 20 26 26 20 70 53 74 61 74 65 2d 3e 65 53  OK && pState->eS
1eab0 74 61 67 65 3d 3d 30 20 26 26 20 72 62 75 49 73  tage==0 && rbuIs
1eac0 56 61 63 75 75 6d 28 70 29 20 29 7b 0a 20 20 20  Vacuum(p) ){.   
1ead0 20 20 20 20 20 20 20 20 20 72 62 75 43 6f 70 79           rbuCopy
1eae0 50 72 61 67 6d 61 28 70 2c 20 22 70 61 67 65 5f  Pragma(p, "page_
1eaf0 73 69 7a 65 22 29 3b 0a 20 20 20 20 20 20 20 20  size");.        
1eb00 20 20 20 20 72 62 75 43 6f 70 79 50 72 61 67 6d      rbuCopyPragm
1eb10 61 28 70 2c 20 22 61 75 74 6f 5f 76 61 63 75 75  a(p, "auto_vacuu
1eb20 6d 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  m");.          }
1eb30 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  ..          /* O
1eb40 70 65 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  pen transactions
1eb50 20 62 6f 74 68 20 64 61 74 61 62 61 73 65 73 2e   both databases.
1eb60 20 54 68 65 20 2a 2d 6f 61 6c 20 66 69 6c 65 20   The *-oal file 
1eb70 69 73 20 6f 70 65 6e 65 64 20 6f 72 0a 20 20 20  is opened or.   
1eb80 20 20 20 20 20 20 20 2a 2a 20 63 72 65 61 74 65         ** create
1eb90 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2e  d at this point.
1eba0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
1ebb0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
1ebc0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
1ebd0 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65    p->rc = sqlite
1ebe0 33 5f 65 78 65 63 28 64 62 2c 20 22 42 45 47 49  3_exec(db, "BEGI
1ebf0 4e 20 49 4d 4d 45 44 49 41 54 45 22 2c 20 30 2c  N IMMEDIATE", 0,
1ec00 20 30 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 29   0, &p->zErrmsg)
1ec10 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20  ;.          }.. 
1ec20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63           /* Chec
1ec30 6b 20 69 66 20 74 68 65 20 6d 61 69 6e 20 64 61  k if the main da
1ec40 74 61 62 61 73 65 20 69 73 20 61 20 7a 69 70 76  tabase is a zipv
1ec50 66 73 20 64 62 2e 20 49 66 20 69 74 20 69 73 2c  fs db. If it is,
1ec60 20 73 65 74 20 74 68 65 20 75 70 70 65 72 0a 20   set the upper. 
1ec70 20 20 20 20 20 20 20 20 20 2a 2a 20 6c 65 76 65           ** leve
1ec80 6c 20 70 61 67 65 72 20 74 6f 20 75 73 65 20 22  l pager to use "
1ec90 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6f 66 66  journal_mode=off
1eca0 22 2e 20 54 68 69 73 20 70 72 65 76 65 6e 74 73  ". This prevents
1ecb0 20 69 74 20 66 72 6f 6d 20 0a 20 20 20 20 20 20   it from .      
1ecc0 20 20 20 20 2a 2a 20 67 65 6e 65 72 61 74 69 6e      ** generatin
1ecd0 67 20 61 20 6c 61 72 67 65 20 6a 6f 75 72 6e 61  g a large journa
1ece0 6c 20 75 73 69 6e 67 20 61 20 74 65 6d 70 20 66  l using a temp f
1ecf0 69 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  ile.  */.       
1ed00 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
1ed10 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1ed20 20 20 20 20 20 20 20 69 6e 74 20 66 72 63 20 3d         int frc =
1ed30 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
1ed40 6e 74 72 6f 6c 28 64 62 2c 20 22 6d 61 69 6e 22  ntrol(db, "main"
1ed50 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 5a  , SQLITE_FCNTL_Z
1ed60 49 50 56 46 53 2c 20 30 29 3b 0a 20 20 20 20 20  IPVFS, 0);.     
1ed70 20 20 20 20 20 20 20 69 66 28 20 66 72 63 3d 3d         if( frc==
1ed80 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1ed90 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63             p->rc
1eda0 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28   = sqlite3_exec(
1edb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1edc0 20 64 62 2c 20 22 50 52 41 47 4d 41 20 6a 6f 75   db, "PRAGMA jou
1edd0 72 6e 61 6c 5f 6d 6f 64 65 3d 6f 66 66 22 2c 30  rnal_mode=off",0
1ede0 2c 30 2c 26 70 2d 3e 7a 45 72 72 6d 73 67 29 3b  ,0,&p->zErrmsg);
1edf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
1ee00 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20           }..    
1ee10 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
1ee20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1ee30 20 20 20 20 20 20 20 20 20 20 72 62 75 53 65 74            rbuSet
1ee40 75 70 4f 61 6c 28 70 2c 20 70 53 74 61 74 65 29  upOal(p, pState)
1ee50 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1ee60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
1ee70 6c 73 65 20 69 66 28 20 70 2d 3e 65 53 74 61 67  lse if( p->eStag
1ee80 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4d 4f 56  e==RBU_STAGE_MOV
1ee90 45 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  E ){.        /* 
1eea0 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20 20 7d  no-op */.      }
1eeb0 65 6c 73 65 20 69 66 28 20 70 2d 3e 65 53 74 61  else if( p->eSta
1eec0 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 43 4b  ge==RBU_STAGE_CK
1eed0 50 54 20 29 7b 0a 20 20 20 20 20 20 20 20 72 62  PT ){.        rb
1eee0 75 53 65 74 75 70 43 68 65 63 6b 70 6f 69 6e 74  uSetupCheckpoint
1eef0 28 70 2c 20 70 53 74 61 74 65 29 3b 0a 20 20 20  (p, pState);.   
1ef00 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e     }else if( p->
1ef10 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47  eStage==RBU_STAG
1ef20 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  E_DONE ){.      
1ef30 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
1ef40 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 65 6c  _DONE;.      }el
1ef50 73 65 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72  se{.        p->r
1ef60 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
1ef70 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  PT;.      }.    
1ef80 7d 0a 0a 20 20 20 20 72 62 75 46 72 65 65 53 74  }..    rbuFreeSt
1ef90 61 74 65 28 70 53 74 61 74 65 29 3b 0a 20 20 7d  ate(pState);.  }
1efa0 0a 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  ..  return p;.}.
1efb0 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
1efc0 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 52 42  and return an RB
1efd0 55 20 68 61 6e 64 6c 65 20 77 69 74 68 20 61 6c  U handle with al
1efe0 6c 20 66 69 65 6c 64 73 20 7a 65 72 6f 65 64 20  l fields zeroed 
1eff0 65 78 63 65 70 74 20 66 6f 72 20 74 68 65 0a 2a  except for the.*
1f000 2a 20 65 72 72 6f 72 20 63 6f 64 65 2c 20 77 68  * error code, wh
1f010 69 63 68 20 69 73 20 73 65 74 20 74 6f 20 53 51  ich is set to SQ
1f020 4c 49 54 45 5f 4d 49 53 55 53 45 2e 0a 2a 2f 0a  LITE_MISUSE..*/.
1f030 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 72 62  static sqlite3rb
1f040 75 20 2a 72 62 75 4d 69 73 75 73 65 45 72 72 6f  u *rbuMisuseErro
1f050 72 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74  r(void){.  sqlit
1f060 65 33 72 62 75 20 2a 70 52 65 74 3b 0a 20 20 70  e3rbu *pRet;.  p
1f070 52 65 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  Ret = sqlite3_ma
1f080 6c 6c 6f 63 36 34 28 73 69 7a 65 6f 66 28 73 71  lloc64(sizeof(sq
1f090 6c 69 74 65 33 72 62 75 29 29 3b 0a 20 20 69 66  lite3rbu));.  if
1f0a0 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20 6d 65  ( pRet ){.    me
1f0b0 6d 73 65 74 28 70 52 65 74 2c 20 30 2c 20 73 69  mset(pRet, 0, si
1f0c0 7a 65 6f 66 28 73 71 6c 69 74 65 33 72 62 75 29  zeof(sqlite3rbu)
1f0d0 29 3b 0a 20 20 20 20 70 52 65 74 2d 3e 72 63 20  );.    pRet->rc 
1f0e0 3d 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b  = SQLITE_MISUSE;
1f0f0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52  .  }.  return pR
1f100 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  et;.}../*.** Ope
1f110 6e 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 6e  n and return a n
1f120 65 77 20 52 42 55 20 68 61 6e 64 6c 65 2e 20 0a  ew RBU handle. .
1f130 2a 2f 0a 73 71 6c 69 74 65 33 72 62 75 20 2a 73  */.sqlite3rbu *s
1f140 71 6c 69 74 65 33 72 62 75 5f 6f 70 65 6e 28 0a  qlite3rbu_open(.
1f150 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
1f160 61 72 67 65 74 2c 20 0a 20 20 63 6f 6e 73 74 20  arget, .  const 
1f170 63 68 61 72 20 2a 7a 52 62 75 2c 0a 20 20 63 6f  char *zRbu,.  co
1f180 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 61 74 65  nst char *zState
1f190 0a 29 7b 0a 20 20 69 66 28 20 7a 54 61 72 67 65  .){.  if( zTarge
1f1a0 74 3d 3d 30 20 7c 7c 20 7a 52 62 75 3d 3d 30 20  t==0 || zRbu==0 
1f1b0 29 7b 20 72 65 74 75 72 6e 20 72 62 75 4d 69 73  ){ return rbuMis
1f1c0 75 73 65 45 72 72 6f 72 28 29 3b 20 7d 0a 20 20  useError(); }.  
1f1d0 2f 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20 74  /* TODO: Check t
1f1e0 68 61 74 20 7a 54 61 72 67 65 74 20 61 6e 64 20  hat zTarget and 
1f1f0 7a 52 62 75 20 61 72 65 20 6e 6f 6e 2d 4e 55 4c  zRbu are non-NUL
1f200 4c 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 6f 70  L */.  return op
1f210 65 6e 52 62 75 48 61 6e 64 6c 65 28 7a 54 61 72  enRbuHandle(zTar
1f220 67 65 74 2c 20 7a 52 62 75 2c 20 7a 53 74 61 74  get, zRbu, zStat
1f230 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  e);.}../*.** Ope
1f240 6e 20 61 20 68 61 6e 64 6c 65 20 74 6f 20 62 65  n a handle to be
1f250 67 69 6e 20 6f 72 20 72 65 73 75 6d 65 20 61 6e  gin or resume an
1f260 20 52 42 55 20 56 41 43 55 55 4d 20 6f 70 65 72   RBU VACUUM oper
1f270 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 71 6c 69 74 65  ation..*/.sqlite
1f280 33 72 62 75 20 2a 73 71 6c 69 74 65 33 72 62 75  3rbu *sqlite3rbu
1f290 5f 76 61 63 75 75 6d 28 0a 20 20 63 6f 6e 73 74  _vacuum(.  const
1f2a0 20 63 68 61 72 20 2a 7a 54 61 72 67 65 74 2c 20   char *zTarget, 
1f2b0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1f2c0 53 74 61 74 65 0a 29 7b 0a 20 20 69 66 28 20 7a  State.){.  if( z
1f2d0 54 61 72 67 65 74 3d 3d 30 20 29 7b 20 72 65 74  Target==0 ){ ret
1f2e0 75 72 6e 20 72 62 75 4d 69 73 75 73 65 45 72 72  urn rbuMisuseErr
1f2f0 6f 72 28 29 3b 20 7d 0a 20 20 69 66 28 20 7a 53  or(); }.  if( zS
1f300 74 61 74 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  tate ){.    int 
1f310 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 53 74 61 74  n = strlen(zStat
1f320 65 29 3b 0a 20 20 20 20 69 66 28 20 6e 3e 3d 37  e);.    if( n>=7
1f330 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 22 2d   && 0==memcmp("-
1f340 76 61 63 74 6d 70 22 2c 20 26 7a 53 74 61 74 65  vactmp", &zState
1f350 5b 6e 2d 37 5d 2c 20 37 29 20 29 7b 0a 20 20 20  [n-7], 7) ){.   
1f360 20 20 20 72 65 74 75 72 6e 20 72 62 75 4d 69 73     return rbuMis
1f370 75 73 65 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  useError();.    
1f380 7d 0a 20 20 7d 0a 20 20 2f 2a 20 54 4f 44 4f 3a  }.  }.  /* TODO:
1f390 20 43 68 65 63 6b 20 74 68 61 74 20 62 6f 74 68   Check that both
1f3a0 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 6e   arguments are n
1f3b0 6f 6e 2d 4e 55 4c 4c 20 2a 2f 0a 20 20 72 65 74  on-NULL */.  ret
1f3c0 75 72 6e 20 6f 70 65 6e 52 62 75 48 61 6e 64 6c  urn openRbuHandl
1f3d0 65 28 30 2c 20 7a 54 61 72 67 65 74 2c 20 7a 53  e(0, zTarget, zS
1f3e0 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tate);.}../*.** 
1f3f0 52 65 74 75 72 6e 20 74 68 65 20 64 61 74 61 62  Return the datab
1f400 61 73 65 20 68 61 6e 64 6c 65 20 75 73 65 64 20  ase handle used 
1f410 62 79 20 70 52 62 75 2e 0a 2a 2f 0a 73 71 6c 69  by pRbu..*/.sqli
1f420 74 65 33 20 2a 73 71 6c 69 74 65 33 72 62 75 5f  te3 *sqlite3rbu_
1f430 64 62 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70  db(sqlite3rbu *p
1f440 52 62 75 2c 20 69 6e 74 20 62 52 62 75 29 7b 0a  Rbu, int bRbu){.
1f450 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1f460 30 3b 0a 20 20 69 66 28 20 70 52 62 75 20 29 7b  0;.  if( pRbu ){
1f470 0a 20 20 20 20 64 62 20 3d 20 28 62 52 62 75 20  .    db = (bRbu 
1f480 3f 20 70 52 62 75 2d 3e 64 62 52 62 75 20 3a 20  ? pRbu->dbRbu : 
1f490 70 52 62 75 2d 3e 64 62 4d 61 69 6e 29 3b 0a 20  pRbu->dbMain);. 
1f4a0 20 7d 0a 20 20 72 65 74 75 72 6e 20 64 62 3b 0a   }.  return db;.
1f4b0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  }.../*.** If the
1f4c0 20 65 72 72 6f 72 20 63 6f 64 65 20 63 75 72 72   error code curr
1f4d0 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20  ently stored in 
1f4e0 74 68 65 20 52 42 55 20 68 61 6e 64 6c 65 20 69  the RBU handle i
1f4f0 73 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  s SQLITE_CONSTRA
1f500 49 4e 54 2c 0a 2a 2a 20 74 68 65 6e 20 65 64 69  INT,.** then edi
1f510 74 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73  t any error mess
1f520 61 67 65 20 73 74 72 69 6e 67 20 73 6f 20 61 73  age string so as
1f530 20 74 6f 20 72 65 6d 6f 76 65 20 61 6c 6c 20 6f   to remove all o
1f540 63 63 75 72 72 65 6e 63 65 73 20 6f 66 0a 2a 2a  ccurrences of.**
1f550 20 74 68 65 20 70 61 74 74 65 72 6e 20 22 72 62   the pattern "rb
1f560 75 5f 69 6d 70 5f 5b 30 2d 39 5d 2a 22 2e 0a 2a  u_imp_[0-9]*"..*
1f570 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62  /.static void rb
1f580 75 45 64 69 74 45 72 72 6d 73 67 28 73 71 6c 69  uEditErrmsg(sqli
1f590 74 65 33 72 62 75 20 2a 70 29 7b 0a 20 20 69 66  te3rbu *p){.  if
1f5a0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
1f5b0 43 4f 4e 53 54 52 41 49 4e 54 20 26 26 20 70 2d  CONSTRAINT && p-
1f5c0 3e 7a 45 72 72 6d 73 67 20 29 7b 0a 20 20 20 20  >zErrmsg ){.    
1f5d0 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a  unsigned int i;.
1f5e0 20 20 20 20 73 69 7a 65 5f 74 20 6e 45 72 72 6d      size_t nErrm
1f5f0 73 67 20 3d 20 73 74 72 6c 65 6e 28 70 2d 3e 7a  sg = strlen(p->z
1f600 45 72 72 6d 73 67 29 3b 0a 20 20 20 20 66 6f 72  Errmsg);.    for
1f610 28 69 3d 30 3b 20 69 3c 28 6e 45 72 72 6d 73 67  (i=0; i<(nErrmsg
1f620 2d 38 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  -8); i++){.     
1f630 20 69 66 28 20 6d 65 6d 63 6d 70 28 26 70 2d 3e   if( memcmp(&p->
1f640 7a 45 72 72 6d 73 67 5b 69 5d 2c 20 22 72 62 75  zErrmsg[i], "rbu
1f650 5f 69 6d 70 5f 22 2c 20 38 29 3d 3d 30 20 29 7b  _imp_", 8)==0 ){
1f660 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 44 65  .        int nDe
1f670 6c 20 3d 20 38 3b 0a 20 20 20 20 20 20 20 20 77  l = 8;.        w
1f680 68 69 6c 65 28 20 70 2d 3e 7a 45 72 72 6d 73 67  hile( p->zErrmsg
1f690 5b 69 2b 6e 44 65 6c 5d 3e 3d 27 30 27 20 26 26  [i+nDel]>='0' &&
1f6a0 20 70 2d 3e 7a 45 72 72 6d 73 67 5b 69 2b 6e 44   p->zErrmsg[i+nD
1f6b0 65 6c 5d 3c 3d 27 39 27 20 29 20 6e 44 65 6c 2b  el]<='9' ) nDel+
1f6c0 2b 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 6d 6f  +;.        memmo
1f6d0 76 65 28 26 70 2d 3e 7a 45 72 72 6d 73 67 5b 69  ve(&p->zErrmsg[i
1f6e0 5d 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 5b 69  ], &p->zErrmsg[i
1f6f0 2b 6e 44 65 6c 5d 2c 20 6e 45 72 72 6d 73 67 20  +nDel], nErrmsg 
1f700 2b 20 31 20 2d 20 69 20 2d 20 6e 44 65 6c 29 3b  + 1 - i - nDel);
1f710 0a 20 20 20 20 20 20 20 20 6e 45 72 72 6d 73 67  .        nErrmsg
1f720 20 2d 3d 20 6e 44 65 6c 3b 0a 20 20 20 20 20 20   -= nDel;.      
1f730 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
1f740 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 52  *.** Close the R
1f750 42 55 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e  BU handle..*/.in
1f760 74 20 73 71 6c 69 74 65 33 72 62 75 5f 63 6c 6f  t sqlite3rbu_clo
1f770 73 65 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70  se(sqlite3rbu *p
1f780 2c 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 6d 73  , char **pzErrms
1f790 67 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  g){.  int rc;.  
1f7a0 69 66 28 20 70 20 29 7b 0a 0a 20 20 20 20 2f 2a  if( p ){..    /*
1f7b0 20 43 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e   Commit the tran
1f7c0 73 61 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 2a  saction to the *
1f7d0 2d 6f 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  -oal file. */.  
1f7e0 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
1f7f0 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 65 53 74  ITE_OK && p->eSt
1f800 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4f  age==RBU_STAGE_O
1f810 41 4c 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72  AL ){.      p->r
1f820 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  c = sqlite3_exec
1f830 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 43 4f 4d  (p->dbMain, "COM
1f840 4d 49 54 22 2c 20 30 2c 20 30 2c 20 26 70 2d 3e  MIT", 0, 0, &p->
1f850 7a 45 72 72 6d 73 67 29 3b 0a 20 20 20 20 7d 0a  zErrmsg);.    }.
1f860 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65  .    /* Sync the
1f870 20 64 62 20 66 69 6c 65 20 69 66 20 63 75 72 72   db file if curr
1f880 65 6e 74 6c 79 20 64 6f 69 6e 67 20 61 6e 20 69  ently doing an i
1f890 6e 63 72 65 6d 65 6e 74 61 6c 20 63 68 65 63 6b  ncremental check
1f8a0 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 69 66 28  point */.    if(
1f8b0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1f8c0 4b 20 26 26 20 70 2d 3e 65 53 74 61 67 65 3d 3d  K && p->eStage==
1f8d0 52 42 55 5f 53 54 41 47 45 5f 43 4b 50 54 20 29  RBU_STAGE_CKPT )
1f8e0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
1f8f0 66 69 6c 65 20 2a 70 44 62 20 3d 20 70 2d 3e 70  file *pDb = p->p
1f900 54 61 72 67 65 74 46 64 2d 3e 70 52 65 61 6c 3b  TargetFd->pReal;
1f910 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 70  .      p->rc = p
1f920 44 62 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53  Db->pMethods->xS
1f930 79 6e 63 28 70 44 62 2c 20 53 51 4c 49 54 45 5f  ync(pDb, SQLITE_
1f940 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20  SYNC_NORMAL);.  
1f950 20 20 7d 0a 0a 20 20 20 20 72 62 75 53 61 76 65    }..    rbuSave
1f960 53 74 61 74 65 28 70 2c 20 70 2d 3e 65 53 74 61  State(p, p->eSta
1f970 67 65 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d  ge);..    if( p-
1f980 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
1f990 26 20 70 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55  & p->eStage==RBU
1f9a0 5f 53 54 41 47 45 5f 4f 41 4c 20 29 7b 0a 20 20  _STAGE_OAL ){.  
1f9b0 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69      p->rc = sqli
1f9c0 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 52 62  te3_exec(p->dbRb
1f9d0 75 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20  u, "COMMIT", 0, 
1f9e0 30 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 29 3b  0, &p->zErrmsg);
1f9f0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
1fa00 6c 6f 73 65 20 61 6e 79 20 6f 70 65 6e 20 73 74  lose any open st
1fa10 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65 73 2e  atement handles.
1fa20 20 2a 2f 0a 20 20 20 20 72 62 75 4f 62 6a 49 74   */.    rbuObjIt
1fa30 65 72 46 69 6e 61 6c 69 7a 65 28 26 70 2d 3e 6f  erFinalize(&p->o
1fa40 62 6a 69 74 65 72 29 3b 0a 0a 20 20 20 20 2f 2a  bjiter);..    /*
1fa50 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 52   If this is an R
1fa60 42 55 20 76 61 63 75 75 6d 20 68 61 6e 64 6c 65  BU vacuum handle
1fa70 20 61 6e 64 20 74 68 65 20 76 61 63 75 75 6d 20   and the vacuum 
1fa80 68 61 73 20 65 69 74 68 65 72 20 66 69 6e 69 73  has either finis
1fa90 68 65 64 0a 20 20 20 20 2a 2a 20 73 75 63 63 65  hed.    ** succe
1faa0 73 73 66 75 6c 6c 79 20 6f 72 20 65 6e 63 6f 75  ssfully or encou
1fab0 6e 74 65 72 65 64 20 61 6e 20 65 72 72 6f 72 2c  ntered an error,
1fac0 20 64 65 6c 65 74 65 20 74 68 65 20 63 6f 6e 74   delete the cont
1fad0 65 6e 74 73 20 6f 66 20 74 68 65 20 0a 20 20 20  ents of the .   
1fae0 20 2a 2a 20 73 74 61 74 65 20 74 61 62 6c 65 2e   ** state table.
1faf0 20 54 68 69 73 20 63 61 75 73 65 73 20 74 68 65   This causes the
1fb00 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20 73 71   next call to sq
1fb10 6c 69 74 65 33 72 62 75 5f 76 61 63 75 75 6d 28  lite3rbu_vacuum(
1fb20 29 20 0a 20 20 20 20 2a 2a 20 73 70 65 63 69 66  ) .    ** specif
1fb30 79 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  ying the current
1fb40 20 74 61 72 67 65 74 20 61 6e 64 20 73 74 61 74   target and stat
1fb50 65 20 64 61 74 61 62 61 73 65 73 20 74 6f 20 73  e databases to s
1fb60 74 61 72 74 20 61 20 6e 65 77 0a 20 20 20 20 2a  tart a new.    *
1fb70 2a 20 76 61 63 75 75 6d 20 66 72 6f 6d 20 73 63  * vacuum from sc
1fb80 72 61 74 63 68 2e 20 20 2a 2f 0a 20 20 20 20 69  ratch.  */.    i
1fb90 66 28 20 72 62 75 49 73 56 61 63 75 75 6d 28 70  f( rbuIsVacuum(p
1fba0 29 20 26 26 20 70 2d 3e 72 63 21 3d 53 51 4c 49  ) && p->rc!=SQLI
1fbb0 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 64 62 52 62  TE_OK && p->dbRb
1fbc0 75 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  u ){.      int r
1fbd0 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65  c2 = sqlite3_exe
1fbe0 63 28 70 2d 3e 64 62 52 62 75 2c 20 22 44 45 4c  c(p->dbRbu, "DEL
1fbf0 45 54 45 20 46 52 4f 4d 20 73 74 61 74 2e 72 62  ETE FROM stat.rb
1fc00 75 5f 73 74 61 74 65 22 2c 20 30 2c 20 30 2c 20  u_state", 0, 0, 
1fc10 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  0);.      if( p-
1fc20 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45  >rc==SQLITE_DONE
1fc30 20 26 26 20 72 63 32 21 3d 53 51 4c 49 54 45 5f   && rc2!=SQLITE_
1fc40 4f 4b 20 29 20 70 2d 3e 72 63 20 3d 20 72 63 32  OK ) p->rc = rc2
1fc50 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1fc60 43 6c 6f 73 65 20 74 68 65 20 6f 70 65 6e 20 64  Close the open d
1fc70 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 61  atabase handle a
1fc80 6e 64 20 56 46 53 20 6f 62 6a 65 63 74 2e 20 2a  nd VFS object. *
1fc90 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c  /.    sqlite3_cl
1fca0 6f 73 65 28 70 2d 3e 64 62 52 62 75 29 3b 0a 20  ose(p->dbRbu);. 
1fcb0 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65     sqlite3_close
1fcc0 28 70 2d 3e 64 62 4d 61 69 6e 29 3b 0a 20 20 20  (p->dbMain);.   
1fcd0 20 61 73 73 65 72 74 28 20 70 2d 3e 73 7a 54 65   assert( p->szTe
1fce0 6d 70 3d 3d 30 20 29 3b 0a 20 20 20 20 72 62 75  mp==0 );.    rbu
1fcf0 44 65 6c 65 74 65 56 66 73 28 70 29 3b 0a 20 20  DeleteVfs(p);.  
1fd00 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1fd10 2d 3e 61 42 75 66 29 3b 0a 20 20 20 20 73 71 6c  ->aBuf);.    sql
1fd20 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 46 72  ite3_free(p->aFr
1fd30 61 6d 65 29 3b 0a 0a 20 20 20 20 72 62 75 45 64  ame);..    rbuEd
1fd40 69 74 45 72 72 6d 73 67 28 70 29 3b 0a 20 20 20  itErrmsg(p);.   
1fd50 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 20   rc = p->rc;.   
1fd60 20 69 66 28 20 70 7a 45 72 72 6d 73 67 20 29 7b   if( pzErrmsg ){
1fd70 0a 20 20 20 20 20 20 2a 70 7a 45 72 72 6d 73 67  .      *pzErrmsg
1fd80 20 3d 20 70 2d 3e 7a 45 72 72 6d 73 67 3b 0a 20   = p->zErrmsg;. 
1fd90 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1fda0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
1fdb0 7a 45 72 72 6d 73 67 29 3b 0a 20 20 20 20 7d 0a  zErrmsg);.    }.
1fdc0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1fdd0 28 70 2d 3e 7a 53 74 61 74 65 29 3b 0a 20 20 20  (p->zState);.   
1fde0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
1fdf0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
1fe00 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
1fe10 3b 0a 20 20 20 20 2a 70 7a 45 72 72 6d 73 67 20  ;.    *pzErrmsg 
1fe20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
1fe30 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
1fe40 65 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c 20  eturn the total 
1fe50 6e 75 6d 62 65 72 20 6f 66 20 6b 65 79 2d 76 61  number of key-va
1fe60 6c 75 65 20 6f 70 65 72 61 74 69 6f 6e 73 20 28  lue operations (
1fe70 69 6e 73 65 72 74 73 2c 20 64 65 6c 65 74 65 73  inserts, deletes
1fe80 20 6f 72 20 0a 2a 2a 20 75 70 64 61 74 65 73 29   or .** updates)
1fe90 20 74 68 61 74 20 68 61 76 65 20 62 65 65 6e 20   that have been 
1fea0 70 65 72 66 6f 72 6d 65 64 20 6f 6e 20 74 68 65  performed on the
1feb0 20 74 61 72 67 65 74 20 64 61 74 61 62 61 73 65   target database
1fec0 20 73 69 6e 63 65 20 74 68 65 0a 2a 2a 20 63 75   since the.** cu
1fed0 72 72 65 6e 74 20 52 42 55 20 75 70 64 61 74 65  rrent RBU update
1fee0 20 77 61 73 20 73 74 61 72 74 65 64 2e 0a 2a 2f   was started..*/
1fef0 0a 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73  .sqlite3_int64 s
1ff00 71 6c 69 74 65 33 72 62 75 5f 70 72 6f 67 72 65  qlite3rbu_progre
1ff10 73 73 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70  ss(sqlite3rbu *p
1ff20 52 62 75 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  Rbu){.  return p
1ff30 52 62 75 2d 3e 6e 50 72 6f 67 72 65 73 73 3b 0a  Rbu->nProgress;.
1ff40 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1ff50 70 65 72 6d 79 72 69 61 64 61 67 65 20 70 72 6f  permyriadage pro
1ff60 67 72 65 73 73 20 69 6e 64 69 63 61 74 69 6f 6e  gress indication
1ff70 73 20 66 6f 72 20 74 68 65 20 74 77 6f 20 6d 61  s for the two ma
1ff80 69 6e 20 73 74 61 67 65 73 20 6f 66 0a 2a 2a 20  in stages of.** 
1ff90 61 6e 20 52 42 55 20 75 70 64 61 74 65 2e 0a 2a  an RBU update..*
1ffa0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 72 62  /.void sqlite3rb
1ffb0 75 5f 62 70 5f 70 72 6f 67 72 65 73 73 28 73 71  u_bp_progress(sq
1ffc0 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 69 6e 74  lite3rbu *p, int
1ffd0 20 2a 70 6e 4f 6e 65 2c 20 69 6e 74 20 2a 70 6e   *pnOne, int *pn
1ffe0 54 77 6f 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e  Two){.  const in
1fff0 74 20 4d 41 58 5f 50 52 4f 47 52 45 53 53 20 3d  t MAX_PROGRESS =
20000 20 31 30 30 30 30 3b 0a 20 20 73 77 69 74 63 68   10000;.  switch
20010 28 20 70 2d 3e 65 53 74 61 67 65 20 29 7b 0a 20  ( p->eStage ){. 
20020 20 20 20 63 61 73 65 20 52 42 55 5f 53 54 41 47     case RBU_STAG
20030 45 5f 4f 41 4c 3a 0a 20 20 20 20 20 20 69 66 28  E_OAL:.      if(
20040 20 70 2d 3e 6e 50 68 61 73 65 4f 6e 65 53 74 65   p->nPhaseOneSte
20050 70 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  p>0 ){.        *
20060 70 6e 4f 6e 65 20 3d 20 28 69 6e 74 29 28 4d 41  pnOne = (int)(MA
20070 58 5f 50 52 4f 47 52 45 53 53 20 2a 20 28 69 36  X_PROGRESS * (i6
20080 34 29 70 2d 3e 6e 50 72 6f 67 72 65 73 73 2f 28  4)p->nProgress/(
20090 69 36 34 29 70 2d 3e 6e 50 68 61 73 65 4f 6e 65  i64)p->nPhaseOne
200a0 53 74 65 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Step);.      }el
200b0 73 65 7b 0a 20 20 20 20 20 20 20 20 2a 70 6e 4f  se{.        *pnO
200c0 6e 65 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d  ne = -1;.      }
200d0 0a 20 20 20 20 20 20 2a 70 6e 54 77 6f 20 3d 20  .      *pnTwo = 
200e0 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  0;.      break;.
200f0 0a 20 20 20 20 63 61 73 65 20 52 42 55 5f 53 54  .    case RBU_ST
20100 41 47 45 5f 4d 4f 56 45 3a 0a 20 20 20 20 20 20  AGE_MOVE:.      
20110 2a 70 6e 4f 6e 65 20 3d 20 4d 41 58 5f 50 52 4f  *pnOne = MAX_PRO
20120 47 52 45 53 53 3b 0a 20 20 20 20 20 20 2a 70 6e  GRESS;.      *pn
20130 54 77 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 62  Two = 0;.      b
20140 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
20150 52 42 55 5f 53 54 41 47 45 5f 43 4b 50 54 3a 0a  RBU_STAGE_CKPT:.
20160 20 20 20 20 20 20 2a 70 6e 4f 6e 65 20 3d 20 4d        *pnOne = M
20170 41 58 5f 50 52 4f 47 52 45 53 53 3b 0a 20 20 20  AX_PROGRESS;.   
20180 20 20 20 2a 70 6e 54 77 6f 20 3d 20 28 69 6e 74     *pnTwo = (int
20190 29 28 4d 41 58 5f 50 52 4f 47 52 45 53 53 20 2a  )(MAX_PROGRESS *
201a0 20 28 69 36 34 29 70 2d 3e 6e 53 74 65 70 20 2f   (i64)p->nStep /
201b0 20 28 69 36 34 29 70 2d 3e 6e 46 72 61 6d 65 29   (i64)p->nFrame)
201c0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a  ;.      break;..
201d0 20 20 20 20 63 61 73 65 20 52 42 55 5f 53 54 41      case RBU_STA
201e0 47 45 5f 44 4f 4e 45 3a 0a 20 20 20 20 20 20 2a  GE_DONE:.      *
201f0 70 6e 4f 6e 65 20 3d 20 4d 41 58 5f 50 52 4f 47  pnOne = MAX_PROG
20200 52 45 53 53 3b 0a 20 20 20 20 20 20 2a 70 6e 54  RESS;.      *pnT
20210 77 6f 20 3d 20 4d 41 58 5f 50 52 4f 47 52 45 53  wo = MAX_PROGRES
20220 53 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  S;.      break;.
20230 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20  .    default:.  
20240 20 20 20 20 61 73 73 65 72 74 28 20 30 20 29 3b      assert( 0 );
20250 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
20260 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74  turn the current
20270 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 52 42   state of the RB
20280 55 20 76 61 63 75 75 6d 20 6f 72 20 75 70 64 61  U vacuum or upda
20290 74 65 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f  te operation..*/
202a0 0a 69 6e 74 20 73 71 6c 69 74 65 33 72 62 75 5f  .int sqlite3rbu_
202b0 73 74 61 74 65 28 73 71 6c 69 74 65 33 72 62 75  state(sqlite3rbu
202c0 20 2a 70 29 7b 0a 20 20 69 6e 74 20 61 52 65 73   *p){.  int aRes
202d0 5b 5d 20 3d 20 7b 0a 20 20 20 20 30 2c 20 53 51  [] = {.    0, SQ
202e0 4c 49 54 45 5f 52 42 55 5f 53 54 41 54 45 5f 4f  LITE_RBU_STATE_O
202f0 41 4c 2c 20 53 51 4c 49 54 45 5f 52 42 55 5f 53  AL, SQLITE_RBU_S
20300 54 41 54 45 5f 4d 4f 56 45 2c 0a 20 20 20 20 30  TATE_MOVE,.    0
20310 2c 20 53 51 4c 49 54 45 5f 52 42 55 5f 53 54 41  , SQLITE_RBU_STA
20320 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 2c 20 53  TE_CHECKPOINT, S
20330 51 4c 49 54 45 5f 52 42 55 5f 53 54 41 54 45 5f  QLITE_RBU_STATE_
20340 44 4f 4e 45 0a 20 20 7d 3b 0a 0a 20 20 61 73 73  DONE.  };..  ass
20350 65 72 74 28 20 52 42 55 5f 53 54 41 47 45 5f 4f  ert( RBU_STAGE_O
20360 41 4c 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  AL==1 );.  asser
20370 74 28 20 52 42 55 5f 53 54 41 47 45 5f 4d 4f 56  t( RBU_STAGE_MOV
20380 45 3d 3d 32 20 29 3b 0a 20 20 61 73 73 65 72 74  E==2 );.  assert
20390 28 20 52 42 55 5f 53 54 41 47 45 5f 43 4b 50 54  ( RBU_STAGE_CKPT
203a0 3d 3d 34 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==4 );.  assert(
203b0 20 52 42 55 5f 53 54 41 47 45 5f 44 4f 4e 45 3d   RBU_STAGE_DONE=
203c0 3d 35 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =5 );.  assert( 
203d0 61 52 65 73 5b 52 42 55 5f 53 54 41 47 45 5f 4f  aRes[RBU_STAGE_O
203e0 41 4c 5d 3d 3d 53 51 4c 49 54 45 5f 52 42 55 5f  AL]==SQLITE_RBU_
203f0 53 54 41 54 45 5f 4f 41 4c 20 29 3b 0a 20 20 61  STATE_OAL );.  a
20400 73 73 65 72 74 28 20 61 52 65 73 5b 52 42 55 5f  ssert( aRes[RBU_
20410 53 54 41 47 45 5f 4d 4f 56 45 5d 3d 3d 53 51 4c  STAGE_MOVE]==SQL
20420 49 54 45 5f 52 42 55 5f 53 54 41 54 45 5f 4d 4f  ITE_RBU_STATE_MO
20430 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  VE );.  assert( 
20440 61 52 65 73 5b 52 42 55 5f 53 54 41 47 45 5f 43  aRes[RBU_STAGE_C
20450 4b 50 54 5d 3d 3d 53 51 4c 49 54 45 5f 52 42 55  KPT]==SQLITE_RBU
20460 5f 53 54 41 54 45 5f 43 48 45 43 4b 50 4f 49 4e  _STATE_CHECKPOIN
20470 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  T );.  assert( a
20480 52 65 73 5b 52 42 55 5f 53 54 41 47 45 5f 44 4f  Res[RBU_STAGE_DO
20490 4e 45 5d 3d 3d 53 51 4c 49 54 45 5f 52 42 55 5f  NE]==SQLITE_RBU_
204a0 53 54 41 54 45 5f 44 4f 4e 45 20 29 3b 0a 0a 20  STATE_DONE );.. 
204b0 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49   if( p->rc!=SQLI
204c0 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 72 63 21 3d  TE_OK && p->rc!=
204d0 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20  SQLITE_DONE ){. 
204e0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
204f0 5f 52 42 55 5f 53 54 41 54 45 5f 45 52 52 4f 52  _RBU_STATE_ERROR
20500 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
20510 73 73 65 72 74 28 20 70 2d 3e 72 63 21 3d 53 51  ssert( p->rc!=SQ
20520 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c 20 70 2d 3e  LITE_DONE || p->
20530 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47  eStage==RBU_STAG
20540 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 61 73  E_DONE );.    as
20550 73 65 72 74 28 20 70 2d 3e 65 53 74 61 67 65 3d  sert( p->eStage=
20560 3d 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 0a 20  =RBU_STAGE_OAL. 
20570 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53          || p->eS
20580 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f  tage==RBU_STAGE_
20590 4d 4f 56 45 0a 20 20 20 20 20 20 20 20 20 7c 7c  MOVE.         ||
205a0 20 70 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f   p->eStage==RBU_
205b0 53 54 41 47 45 5f 43 4b 50 54 0a 20 20 20 20 20  STAGE_CKPT.     
205c0 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 67 65      || p->eStage
205d0 3d 3d 52 42 55 5f 53 54 41 47 45 5f 44 4f 4e 45  ==RBU_STAGE_DONE
205e0 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 65 74 75  .    );.    retu
205f0 72 6e 20 61 52 65 73 5b 70 2d 3e 65 53 74 61 67  rn aRes[p->eStag
20600 65 5d 3b 0a 20 20 7d 0a 7d 0a 0a 69 6e 74 20 73  e];.  }.}..int s
20610 71 6c 69 74 65 33 72 62 75 5f 73 61 76 65 73 74  qlite3rbu_savest
20620 61 74 65 28 73 71 6c 69 74 65 33 72 62 75 20 2a  ate(sqlite3rbu *
20630 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70  p){.  int rc = p
20640 2d 3e 72 63 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ->rc;.  if( rc==
20650 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 20 72 65  SQLITE_DONE ) re
20660 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
20670 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 53  .  assert( p->eS
20680 74 61 67 65 3e 3d 52 42 55 5f 53 54 41 47 45 5f  tage>=RBU_STAGE_
20690 4f 41 4c 20 26 26 20 70 2d 3e 65 53 74 61 67 65  OAL && p->eStage
206a0 3c 3d 52 42 55 5f 53 54 41 47 45 5f 44 4f 4e 45  <=RBU_STAGE_DONE
206b0 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 65 53 74   );.  if( p->eSt
206c0 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4f  age==RBU_STAGE_O
206d0 41 4c 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  AL ){.    assert
206e0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
206f0 45 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  E );.    if( rc=
20700 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20  =SQLITE_OK ) rc 
20710 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70  = sqlite3_exec(p
20720 2d 3e 64 62 4d 61 69 6e 2c 20 22 43 4f 4d 4d 49  ->dbMain, "COMMI
20730 54 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  T", 0, 0, 0);.  
20740 7d 0a 0a 20 20 2f 2a 20 53 79 6e 63 20 74 68 65  }..  /* Sync the
20750 20 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20 69 66   db file */.  if
20760 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
20770 26 26 20 70 2d 3e 65 53 74 61 67 65 3d 3d 52 42  && p->eStage==RB
20780 55 5f 53 54 41 47 45 5f 43 4b 50 54 20 29 7b 0a  U_STAGE_CKPT ){.
20790 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65      sqlite3_file
207a0 20 2a 70 44 62 20 3d 20 70 2d 3e 70 54 61 72 67   *pDb = p->pTarg
207b0 65 74 46 64 2d 3e 70 52 65 61 6c 3b 0a 20 20 20  etFd->pReal;.   
207c0 20 72 63 20 3d 20 70 44 62 2d 3e 70 4d 65 74 68   rc = pDb->pMeth
207d0 6f 64 73 2d 3e 78 53 79 6e 63 28 70 44 62 2c 20  ods->xSync(pDb, 
207e0 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
207f0 41 4c 29 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e 72  AL);.  }..  p->r
20800 63 20 3d 20 72 63 3b 0a 20 20 72 62 75 53 61 76  c = rc;.  rbuSav
20810 65 53 74 61 74 65 28 70 2c 20 70 2d 3e 65 53 74  eState(p, p->eSt
20820 61 67 65 29 3b 0a 20 20 72 63 20 3d 20 70 2d 3e  age);.  rc = p->
20830 72 63 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 65 53  rc;..  if( p->eS
20840 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f  tage==RBU_STAGE_
20850 4f 41 4c 20 29 7b 0a 20 20 20 20 61 73 73 65 72  OAL ){.    asser
20860 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  t( rc!=SQLITE_DO
20870 4e 45 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  NE );.    if( rc
20880 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63  ==SQLITE_OK ) rc
20890 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28   = sqlite3_exec(
208a0 70 2d 3e 64 62 52 62 75 2c 20 22 43 4f 4d 4d 49  p->dbRbu, "COMMI
208b0 54 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  T", 0, 0, 0);.  
208c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
208d0 5f 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20 63 6f  _OK ){ .      co
208e0 6e 73 74 20 63 68 61 72 20 2a 7a 42 65 67 69 6e  nst char *zBegin
208f0 20 3d 20 72 62 75 49 73 56 61 63 75 75 6d 28 70   = rbuIsVacuum(p
20900 29 20 3f 20 22 42 45 47 49 4e 22 20 3a 20 22 42  ) ? "BEGIN" : "B
20910 45 47 49 4e 20 49 4d 4d 45 44 49 41 54 45 22 3b  EGIN IMMEDIATE";
20920 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
20930 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 52 62  te3_exec(p->dbRb
20940 75 2c 20 7a 42 65 67 69 6e 2c 20 30 2c 20 30 2c  u, zBegin, 0, 0,
20950 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   0);.    }.    i
20960 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
20970 20 29 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f   ) rc = sqlite3_
20980 65 78 65 63 28 70 2d 3e 64 62 4d 61 69 6e 2c 20  exec(p->dbMain, 
20990 22 42 45 47 49 4e 20 49 4d 4d 45 44 49 41 54 45  "BEGIN IMMEDIATE
209a0 22 2c 20 30 2c 20 30 2c 30 29 3b 0a 20 20 7d 0a  ", 0, 0,0);.  }.
209b0 0a 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20  .  p->rc = rc;. 
209c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
209d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
209e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
209f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20a00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20a10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 42 65  **********.** Be
20a20 67 69 6e 6e 69 6e 67 20 6f 66 20 52 42 55 20 56  ginning of RBU V
20a30 46 53 20 73 68 69 6d 20 6d 65 74 68 6f 64 73 2e  FS shim methods.
20a40 20 54 68 65 20 56 46 53 20 73 68 69 6d 20 6d 6f   The VFS shim mo
20a50 64 69 66 69 65 73 20 74 68 65 20 62 65 68 61 76  difies the behav
20a60 69 6f 75 72 0a 2a 2a 20 6f 66 20 61 20 73 74 61  iour.** of a sta
20a70 6e 64 61 72 64 20 56 46 53 20 69 6e 20 74 68 65  ndard VFS in the
20a80 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 61 79 73 3a   following ways:
20a90 0a 2a 2a 0a 2a 2a 20 31 2e 20 57 68 65 6e 65 76  .**.** 1. Whenev
20aa0 65 72 20 74 68 65 20 66 69 72 73 74 20 70 61 67  er the first pag
20ab0 65 20 6f 66 20 61 20 6d 61 69 6e 20 64 61 74 61  e of a main data
20ac0 62 61 73 65 20 66 69 6c 65 20 69 73 20 72 65 61  base file is rea
20ad0 64 20 6f 72 20 0a 2a 2a 20 20 20 20 77 72 69 74  d or .**    writ
20ae0 74 65 6e 2c 20 74 68 65 20 76 61 6c 75 65 20 6f  ten, the value o
20af0 66 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  f the change-cou
20b00 6e 74 65 72 20 63 6f 6f 6b 69 65 20 69 73 20 73  nter cookie is s
20b10 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 20 20 20 72  tored in.**    r
20b20 62 75 5f 66 69 6c 65 2e 69 43 6f 6f 6b 69 65 2e  bu_file.iCookie.
20b30 20 53 69 6d 69 6c 61 72 6c 79 2c 20 74 68 65 20   Similarly, the 
20b40 76 61 6c 75 65 20 6f 66 20 74 68 65 20 22 77 72  value of the "wr
20b50 69 74 65 2d 76 65 72 73 69 6f 6e 22 0a 2a 2a 20  ite-version".** 
20b60 20 20 20 64 61 74 61 62 61 73 65 20 68 65 61 64     database head
20b70 65 72 20 66 69 65 6c 64 20 69 73 20 73 74 6f 72  er field is stor
20b80 65 64 20 69 6e 20 72 62 75 5f 66 69 6c 65 2e 69  ed in rbu_file.i
20b90 57 72 69 74 65 56 65 72 2e 20 54 68 69 73 20 65  WriteVer. This e
20ba0 6e 73 75 72 65 73 0a 2a 2a 20 20 20 20 74 68 61  nsures.**    tha
20bb0 74 20 74 68 65 20 76 61 6c 75 65 73 20 61 72 65  t the values are
20bc0 20 61 6c 77 61 79 73 20 74 72 75 73 74 77 6f 72   always trustwor
20bd0 74 68 79 20 77 69 74 68 69 6e 20 61 6e 20 6f 70  thy within an op
20be0 65 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  en transaction..
20bf0 2a 2a 0a 2a 2a 20 32 2e 20 57 68 65 6e 65 76 65  **.** 2. Wheneve
20c00 72 20 61 6e 20 53 51 4c 49 54 45 5f 4f 50 45 4e  r an SQLITE_OPEN
20c10 5f 57 41 4c 20 66 69 6c 65 20 69 73 20 6f 70 65  _WAL file is ope
20c20 6e 65 64 2c 20 74 68 65 20 28 72 62 75 5f 66 69  ned, the (rbu_fi
20c30 6c 65 2e 70 57 61 6c 46 64 29 0a 2a 2a 20 20 20  le.pWalFd).**   
20c40 20 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c 65   member variable
20c50 20 6f 66 20 74 68 65 20 61 73 73 6f 63 69 61 74   of the associat
20c60 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ed database file
20c70 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 73   descriptor is s
20c80 65 74 0a 2a 2a 20 20 20 20 74 6f 20 70 6f 69 6e  et.**    to poin
20c90 74 20 74 6f 20 74 68 65 20 6e 65 77 20 66 69 6c  t to the new fil
20ca0 65 2e 20 41 20 6d 75 74 65 78 20 70 72 6f 74 65  e. A mutex prote
20cb0 63 74 65 64 20 6c 69 6e 6b 65 64 20 6c 69 73 74  cted linked list
20cc0 20 6f 66 20 61 6c 6c 20 6d 61 69 6e 20 0a 2a 2a   of all main .**
20cd0 20 20 20 20 64 62 20 66 64 73 20 6f 70 65 6e 65      db fds opene
20ce0 64 20 75 73 69 6e 67 20 61 20 70 61 72 74 69 63  d using a partic
20cf0 75 6c 61 72 20 52 42 55 20 56 46 53 20 69 73 20  ular RBU VFS is 
20d00 6d 61 69 6e 74 61 69 6e 65 64 20 61 74 20 0a 2a  maintained at .*
20d10 2a 20 20 20 20 72 62 75 5f 76 66 73 2e 70 4d 61  *    rbu_vfs.pMa
20d20 69 6e 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65  in to facilitate
20d30 20 74 68 69 73 2e 0a 2a 2a 0a 2a 2a 20 33 2e 20   this..**.** 3. 
20d40 55 73 69 6e 67 20 61 20 6e 65 77 20 66 69 6c 65  Using a new file
20d50 2d 63 6f 6e 74 72 6f 6c 20 22 53 51 4c 49 54 45  -control "SQLITE
20d60 5f 46 43 4e 54 4c 5f 52 42 55 22 2c 20 61 20 6d  _FCNTL_RBU", a m
20d70 61 69 6e 20 64 62 20 72 62 75 5f 66 69 6c 65 20  ain db rbu_file 
20d80 0a 2a 2a 20 20 20 20 6f 62 6a 65 63 74 20 63 61  .**    object ca
20d90 6e 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20 74  n be marked as t
20da0 68 65 20 74 61 72 67 65 74 20 64 61 74 61 62 61  he target databa
20db0 73 65 20 6f 66 20 61 6e 20 52 42 55 20 75 70 64  se of an RBU upd
20dc0 61 74 65 2e 20 54 68 69 73 0a 2a 2a 20 20 20 20  ate. This.**    
20dd0 74 75 72 6e 73 20 6f 6e 20 74 68 65 20 66 6f 6c  turns on the fol
20de0 6c 6f 77 69 6e 67 20 65 78 74 72 61 20 73 70 65  lowing extra spe
20df0 63 69 61 6c 20 62 65 68 61 76 69 6f 75 72 3a 0a  cial behaviour:.
20e00 2a 2a 0a 2a 2a 20 33 61 2e 20 49 66 20 78 41 63  **.** 3a. If xAc
20e10 63 65 73 73 28 29 20 69 73 20 63 61 6c 6c 65 64  cess() is called
20e20 20 74 6f 20 63 68 65 63 6b 20 69 66 20 74 68 65   to check if the
20e30 72 65 20 65 78 69 73 74 73 20 61 20 2a 2d 77 61  re exists a *-wa
20e40 6c 20 66 69 6c 65 20 0a 2a 2a 20 20 20 20 20 61  l file .**     a
20e50 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61  ssociated with a
20e60 6e 20 52 42 55 20 74 61 72 67 65 74 20 64 61 74  n RBU target dat
20e70 61 62 61 73 65 20 63 75 72 72 65 6e 74 6c 79 20  abase currently 
20e80 69 6e 20 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c  in RBU_STAGE_OAL
20e90 0a 2a 2a 20 20 20 20 20 73 74 61 67 65 20 28 70  .**     stage (p
20ea0 72 65 70 61 72 69 6e 67 20 74 68 65 20 2a 2d 6f  reparing the *-o
20eb0 61 6c 20 66 69 6c 65 29 2c 20 74 68 65 20 66 6f  al file), the fo
20ec0 6c 6c 6f 77 69 6e 67 20 73 70 65 63 69 61 6c 20  llowing special 
20ed0 68 61 6e 64 6c 69 6e 67 0a 2a 2a 20 20 20 20 20  handling.**     
20ee0 61 70 70 6c 69 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  applies:.**.**  
20ef0 20 20 20 20 2a 20 69 66 20 74 68 65 20 2a 2d 77      * if the *-w
20f00 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 65 78 69  al file does exi
20f10 73 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  st, return SQLIT
20f20 45 5f 43 41 4e 54 4f 50 45 4e 2e 20 41 6e 20 52  E_CANTOPEN. An R
20f30 42 55 0a 2a 2a 20 20 20 20 20 20 20 20 74 61 72  BU.**        tar
20f40 67 65 74 20 64 61 74 61 62 61 73 65 20 6d 61 79  get database may
20f50 20 6e 6f 74 20 62 65 20 69 6e 20 77 61 6c 20 6d   not be in wal m
20f60 6f 64 65 20 61 6c 72 65 61 64 79 2e 0a 2a 2a 0a  ode already..**.
20f70 2a 2a 20 20 20 20 20 20 2a 20 69 66 20 74 68 65  **      * if the
20f80 20 2a 2d 77 61 6c 20 66 69 6c 65 20 64 6f 65 73   *-wal file does
20f90 20 6e 6f 74 20 65 78 69 73 74 2c 20 73 65 74 20   not exist, set 
20fa0 74 68 65 20 6f 75 74 70 75 74 20 70 61 72 61 6d  the output param
20fb0 65 74 65 72 20 74 6f 0a 2a 2a 20 20 20 20 20 20  eter to.**      
20fc0 20 20 6e 6f 6e 2d 7a 65 72 6f 20 28 74 6f 20 74    non-zero (to t
20fd0 65 6c 6c 20 53 51 4c 69 74 65 20 74 68 61 74 20  ell SQLite that 
20fe0 69 74 20 64 6f 65 73 20 65 78 69 73 74 29 20 61  it does exist) a
20ff0 6e 79 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  nyway..**.**    
21000 20 54 68 65 6e 2c 20 77 68 65 6e 20 78 4f 70 65   Then, when xOpe
21010 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  n() is called to
21020 20 6f 70 65 6e 20 74 68 65 20 2a 2d 77 61 6c 20   open the *-wal 
21030 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20  file associated 
21040 77 69 74 68 0a 2a 2a 20 20 20 20 20 74 68 65 20  with.**     the 
21050 52 42 55 20 74 61 72 67 65 74 20 69 6e 20 52 42  RBU target in RB
21060 55 5f 53 54 41 47 45 5f 4f 41 4c 20 73 74 61 67  U_STAGE_OAL stag
21070 65 2c 20 69 6e 73 74 65 61 64 20 6f 66 20 6f 70  e, instead of op
21080 65 6e 69 6e 67 20 74 68 65 20 2a 2d 77 61 6c 0a  ening the *-wal.
21090 2a 2a 20 20 20 20 20 66 69 6c 65 2c 20 74 68 65  **     file, the
210a0 20 72 62 75 20 76 66 73 20 6f 70 65 6e 73 20 74   rbu vfs opens t
210b0 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
210c0 20 2a 2d 6f 61 6c 20 66 69 6c 65 20 69 6e 73 74   *-oal file inst
210d0 65 61 64 2e 20 0a 2a 2a 0a 2a 2a 20 33 62 2e 20  ead. .**.** 3b. 
210e0 54 68 65 20 2a 2d 73 68 6d 20 70 61 67 65 73 20  The *-shm pages 
210f0 72 65 74 75 72 6e 65 64 20 62 79 20 78 53 68 6d  returned by xShm
21100 4d 61 70 28 29 20 66 6f 72 20 61 20 74 61 72 67  Map() for a targ
21110 65 74 20 64 62 20 66 69 6c 65 20 69 6e 0a 2a 2a  et db file in.**
21120 20 20 20 20 20 52 42 55 5f 53 54 41 47 45 5f 4f       RBU_STAGE_O
21130 41 4c 20 6d 6f 64 65 20 61 72 65 20 61 63 74 75  AL mode are actu
21140 61 6c 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 68  ally stored in h
21150 65 61 70 20 6d 65 6d 6f 72 79 2e 20 54 68 69 73  eap memory. This
21160 20 69 73 20 74 6f 0a 2a 2a 20 20 20 20 20 61 76   is to.**     av
21170 6f 69 64 20 63 72 65 61 74 69 6e 67 20 61 20 2a  oid creating a *
21180 2d 73 68 6d 20 66 69 6c 65 20 6f 6e 20 64 69 73  -shm file on dis
21190 6b 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c  k. Additionally,
211a0 20 78 53 68 6d 4c 6f 63 6b 28 29 20 63 61 6c 6c   xShmLock() call
211b0 73 0a 2a 2a 20 20 20 20 20 61 72 65 20 6e 6f 2d  s.**     are no-
211c0 6f 70 73 20 6f 6e 20 74 61 72 67 65 74 20 64 61  ops on target da
211d0 74 61 62 61 73 65 20 66 69 6c 65 73 20 69 6e 20  tabase files in 
211e0 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20 6d 6f  RBU_STAGE_OAL mo
211f0 64 65 2e 20 54 68 69 73 20 69 73 0a 2a 2a 20 20  de. This is.**  
21200 20 20 20 62 65 63 61 75 73 65 20 61 73 73 65 72     because asser
21210 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 69  t() statements i
21220 6e 20 73 6f 6d 65 20 56 46 53 20 69 6d 70 6c 65  n some VFS imple
21230 6d 65 6e 74 61 74 69 6f 6e 73 20 66 61 69 6c 20  mentations fail 
21240 69 66 20 0a 2a 2a 20 20 20 20 20 78 53 68 6d 4c  if .**     xShmL
21250 6f 63 6b 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ock() is called 
21260 62 65 66 6f 72 65 20 78 53 68 6d 4d 61 70 28 29  before xShmMap()
21270 2e 0a 2a 2a 0a 2a 2a 20 33 63 2e 20 49 66 20 61  ..**.** 3c. If a
21280 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
21290 20 69 73 20 61 74 74 65 6d 70 74 65 64 20 6f 6e   is attempted on
212a0 20 61 20 74 61 72 67 65 74 20 64 61 74 61 62 61   a target databa
212b0 73 65 20 66 69 6c 65 20 69 6e 20 61 6e 79 0a 2a  se file in any.*
212c0 2a 20 20 20 20 20 6d 6f 64 65 20 65 78 63 65 70  *     mode excep
212d0 74 20 52 42 55 5f 53 54 41 47 45 5f 44 4f 4e 45  t RBU_STAGE_DONE
212e0 20 28 61 6c 6c 20 77 6f 72 6b 20 63 6f 6d 70 6c   (all work compl
212f0 65 74 65 64 20 61 6e 64 20 63 68 65 63 6b 70 6f  eted and checkpo
21300 69 6e 74 65 64 29 2c 20 69 74 20 0a 2a 2a 20 20  inted), it .**  
21310 20 20 20 66 61 69 6c 73 20 77 69 74 68 20 61 6e     fails with an
21320 20 53 51 4c 49 54 45 5f 42 55 53 59 20 65 72 72   SQLITE_BUSY err
21330 6f 72 2e 20 54 68 69 73 20 69 73 20 74 6f 20 73  or. This is to s
21340 74 6f 70 20 52 42 55 20 63 6f 6e 6e 65 63 74 69  top RBU connecti
21350 6f 6e 73 0a 2a 2a 20 20 20 20 20 66 72 6f 6d 20  ons.**     from 
21360 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 68  automatically ch
21370 65 63 6b 70 6f 69 6e 74 69 6e 67 20 61 20 2a 2d  eckpointing a *-
21380 77 61 6c 20 28 6f 72 20 2a 2d 6f 61 6c 29 20 66  wal (or *-oal) f
21390 69 6c 65 20 66 72 6f 6d 20 77 69 74 68 69 6e 0a  ile from within.
213a0 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63  **     sqlite3_c
213b0 6c 6f 73 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 33 64  lose()..**.** 3d
213c0 2e 20 49 6e 20 52 42 55 5f 53 54 41 47 45 5f 43  . In RBU_STAGE_C
213d0 41 50 54 55 52 45 20 6d 6f 64 65 2c 20 61 6c 6c  APTURE mode, all
213e0 20 78 52 65 61 64 28 29 20 63 61 6c 6c 73 20 6f   xRead() calls o
213f0 6e 20 74 68 65 20 77 61 6c 20 66 69 6c 65 2c 20  n the wal file, 
21400 61 6e 64 0a 2a 2a 20 20 20 20 20 61 6c 6c 20 78  and.**     all x
21410 57 72 69 74 65 28 29 20 63 61 6c 6c 73 20 6f 6e  Write() calls on
21420 20 74 68 65 20 74 61 72 67 65 74 20 64 61 74 61   the target data
21430 62 61 73 65 20 66 69 6c 65 20 70 65 72 66 6f 72  base file perfor
21440 6d 20 6e 6f 20 49 4f 2e 20 0a 2a 2a 20 20 20 20  m no IO. .**    
21450 20 49 6e 73 74 65 61 64 20 74 68 65 20 66 72 61   Instead the fra
21460 6d 65 20 61 6e 64 20 70 61 67 65 20 6e 75 6d 62  me and page numb
21470 65 72 73 20 74 68 61 74 20 77 6f 75 6c 64 20 62  ers that would b
21480 65 20 72 65 61 64 20 61 6e 64 20 77 72 69 74 74  e read and writt
21490 65 6e 0a 2a 2a 20 20 20 20 20 61 72 65 20 72 65  en.**     are re
214a0 63 6f 72 64 65 64 2e 20 41 64 64 69 74 69 6f 6e  corded. Addition
214b0 61 6c 6c 79 2c 20 73 75 63 63 65 73 73 66 75 6c  ally, successful
214c0 20 61 74 74 65 6d 70 74 73 20 74 6f 20 6f 62 74   attempts to obt
214d0 61 69 6e 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a  ain exclusive.**
214e0 20 20 20 20 20 78 53 68 6d 4c 6f 63 6b 28 29 20       xShmLock() 
214f0 57 52 49 54 45 52 2c 20 43 48 45 43 4b 50 4f 49  WRITER, CHECKPOI
21500 4e 54 45 52 20 61 6e 64 20 52 45 41 44 30 20 6c  NTER and READ0 l
21510 6f 63 6b 73 20 6f 6e 20 74 68 65 20 74 61 72 67  ocks on the targ
21520 65 74 20 0a 2a 2a 20 20 20 20 20 64 61 74 61 62  et .**     datab
21530 61 73 65 20 66 69 6c 65 20 61 72 65 20 72 65 63  ase file are rec
21540 6f 72 64 65 64 2e 20 78 53 68 6d 4c 6f 63 6b 28  orded. xShmLock(
21550 29 20 63 61 6c 6c 73 20 74 6f 20 75 6e 6c 6f 63  ) calls to unloc
21560 6b 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 20 20  k the same.**   
21570 20 20 6c 6f 63 6b 73 20 61 72 65 20 6e 6f 2d 6f    locks are no-o
21580 70 73 20 28 73 6f 20 74 68 61 74 20 6f 6e 63 65  ps (so that once
21590 20 6f 62 74 61 69 6e 65 64 2c 20 74 68 65 73 65   obtained, these
215a0 20 6c 6f 63 6b 73 20 61 72 65 20 6e 65 76 65 72   locks are never
215b0 0a 2a 2a 20 20 20 20 20 72 65 6c 69 6e 71 75 69  .**     relinqui
215c0 73 68 65 64 29 2e 20 46 69 6e 61 6c 6c 79 2c 20  shed). Finally, 
215d0 63 61 6c 6c 73 20 74 6f 20 78 53 79 6e 63 28 29  calls to xSync()
215e0 20 6f 6e 20 74 68 65 20 74 61 72 67 65 74 20 64   on the target d
215f0 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 66  atabase.**     f
21600 69 6c 65 20 66 61 69 6c 20 77 69 74 68 20 53 51  ile fail with SQ
21610 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c 20 65 72  LITE_INTERNAL er
21620 72 6f 72 73 2e 0a 2a 2f 0a 0a 73 74 61 74 69 63  rors..*/..static
21630 20 76 6f 69 64 20 72 62 75 55 6e 6c 6f 63 6b 53   void rbuUnlockS
21640 68 6d 28 72 62 75 5f 66 69 6c 65 20 2a 70 29 7b  hm(rbu_file *p){
21650 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70  .  assert( p->op
21660 65 6e 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  enFlags & SQLITE
21670 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 3b  _OPEN_MAIN_DB );
21680 0a 20 20 69 66 28 20 70 2d 3e 70 52 62 75 20 29  .  if( p->pRbu )
21690 7b 0a 20 20 20 20 69 6e 74 20 28 2a 78 53 68 6d  {.    int (*xShm
216a0 4c 6f 63 6b 29 28 73 71 6c 69 74 65 33 5f 66 69  Lock)(sqlite3_fi
216b0 6c 65 2a 2c 69 6e 74 2c 69 6e 74 2c 69 6e 74 29  le*,int,int,int)
216c0 20 3d 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65   = p->pReal->pMe
216d0 74 68 6f 64 73 2d 3e 78 53 68 6d 4c 6f 63 6b 3b  thods->xShmLock;
216e0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
216f0 66 6f 72 28 69 3d 30 3b 20 69 3c 53 51 4c 49 54  for(i=0; i<SQLIT
21700 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 3b 69 2b 2b 29  E_SHM_NLOCK;i++)
21710 7b 0a 20 20 20 20 20 20 69 66 28 20 28 31 3c 3c  {.      if( (1<<
21720 69 29 20 26 20 70 2d 3e 70 52 62 75 2d 3e 6d 4c  i) & p->pRbu->mL
21730 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 78  ock ){.        x
21740 53 68 6d 4c 6f 63 6b 28 70 2d 3e 70 52 65 61 6c  ShmLock(p->pReal
21750 2c 20 69 2c 20 31 2c 20 53 51 4c 49 54 45 5f 53  , i, 1, SQLITE_S
21760 48 4d 5f 55 4e 4c 4f 43 4b 7c 53 51 4c 49 54 45  HM_UNLOCK|SQLITE
21770 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 3b  _SHM_EXCLUSIVE);
21780 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
21790 20 20 20 70 2d 3e 70 52 62 75 2d 3e 6d 4c 6f 63     p->pRbu->mLoc
217a0 6b 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  k = 0;.  }.}../*
217b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
217c0 62 75 55 70 64 61 74 65 54 65 6d 70 53 69 7a 65  buUpdateTempSize
217d0 28 72 62 75 5f 66 69 6c 65 20 2a 70 46 64 2c 20  (rbu_file *pFd, 
217e0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 4e  sqlite3_int64 nN
217f0 65 77 29 7b 0a 20 20 73 71 6c 69 74 65 33 72 62  ew){.  sqlite3rb
21800 75 20 2a 70 52 62 75 20 3d 20 70 46 64 2d 3e 70  u *pRbu = pFd->p
21810 52 62 75 3b 0a 20 20 69 36 34 20 6e 44 69 66 66  Rbu;.  i64 nDiff
21820 20 3d 20 6e 4e 65 77 20 2d 20 70 46 64 2d 3e 73   = nNew - pFd->s
21830 7a 3b 0a 20 20 70 52 62 75 2d 3e 73 7a 54 65 6d  z;.  pRbu->szTem
21840 70 20 2b 3d 20 6e 44 69 66 66 3b 0a 20 20 70 46  p += nDiff;.  pF
21850 64 2d 3e 73 7a 20 3d 20 6e 4e 65 77 3b 0a 20 20  d->sz = nNew;.  
21860 61 73 73 65 72 74 28 20 70 52 62 75 2d 3e 73 7a  assert( pRbu->sz
21870 54 65 6d 70 3e 3d 30 20 29 3b 0a 20 20 69 66 28  Temp>=0 );.  if(
21880 20 70 52 62 75 2d 3e 73 7a 54 65 6d 70 4c 69 6d   pRbu->szTempLim
21890 69 74 20 26 26 20 70 52 62 75 2d 3e 73 7a 54 65  it && pRbu->szTe
218a0 6d 70 3e 70 52 62 75 2d 3e 73 7a 54 65 6d 70 4c  mp>pRbu->szTempL
218b0 69 6d 69 74 20 29 20 72 65 74 75 72 6e 20 53 51  imit ) return SQ
218c0 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 72 65 74  LITE_FULL;.  ret
218d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
218e0 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 69  ../*.** Add an i
218f0 74 65 6d 20 74 6f 20 74 68 65 20 6d 61 69 6e 2d  tem to the main-
21900 64 62 20 6c 69 73 74 73 2c 20 69 66 20 69 74 20  db lists, if it 
21910 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 70  is not already p
21920 72 65 73 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  resent..**.** Th
21930 65 72 65 20 61 72 65 20 74 77 6f 20 6d 61 69 6e  ere are two main
21940 2d 64 62 20 6c 69 73 74 73 2e 20 4f 6e 65 20 66  -db lists. One f
21950 6f 72 20 61 6c 6c 20 66 69 6c 65 20 64 65 73 63  or all file desc
21960 72 69 70 74 6f 72 73 2c 20 61 6e 64 20 6f 6e 65  riptors, and one
21970 0a 2a 2a 20 66 6f 72 20 61 6c 6c 20 66 69 6c 65  .** for all file
21980 20 64 65 73 63 72 69 70 74 6f 72 73 20 77 69 74   descriptors wit
21990 68 20 72 62 75 5f 66 69 6c 65 2e 70 44 62 21 3d  h rbu_file.pDb!=
219a0 30 2e 20 49 66 20 74 68 65 20 61 72 67 75 6d 65  0. If the argume
219b0 6e 74 20 68 61 73 0a 2a 2a 20 72 62 75 5f 66 69  nt has.** rbu_fi
219c0 6c 65 2e 70 44 62 21 3d 30 2c 20 74 68 65 6e 20  le.pDb!=0, then 
219d0 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f  it is assumed to
219e0 20 61 6c 72 65 61 64 79 20 62 65 20 70 72 65 73   already be pres
219f0 65 6e 74 20 6f 6e 20 74 68 65 0a 2a 2a 20 6d 61  ent on the.** ma
21a00 69 6e 20 6c 69 73 74 20 61 6e 64 20 69 73 20 6f  in list and is o
21a10 6e 6c 79 20 61 64 64 65 64 20 74 6f 20 74 68 65  nly added to the
21a20 20 70 44 62 21 3d 30 20 6c 69 73 74 2e 0a 2a 2f   pDb!=0 list..*/
21a30 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75  .static void rbu
21a40 4d 61 69 6e 6c 69 73 74 41 64 64 28 72 62 75 5f  MainlistAdd(rbu_
21a50 66 69 6c 65 20 2a 70 29 7b 0a 20 20 72 62 75 5f  file *p){.  rbu_
21a60 76 66 73 20 2a 70 52 62 75 56 66 73 20 3d 20 70  vfs *pRbuVfs = p
21a70 2d 3e 70 52 62 75 56 66 73 3b 0a 20 20 72 62 75  ->pRbuVfs;.  rbu
21a80 5f 66 69 6c 65 20 2a 70 49 74 65 72 3b 0a 20 20  _file *pIter;.  
21a90 61 73 73 65 72 74 28 20 28 70 2d 3e 6f 70 65 6e  assert( (p->open
21aa0 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  Flags & SQLITE_O
21ab0 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 20 29 3b 0a  PEN_MAIN_DB) );.
21ac0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
21ad0 65 6e 74 65 72 28 70 52 62 75 56 66 73 2d 3e 6d  enter(pRbuVfs->m
21ae0 75 74 65 78 29 3b 0a 20 20 69 66 28 20 70 2d 3e  utex);.  if( p->
21af0 70 52 62 75 3d 3d 30 20 29 7b 0a 20 20 20 20 66  pRbu==0 ){.    f
21b00 6f 72 28 70 49 74 65 72 3d 70 52 62 75 56 66 73  or(pIter=pRbuVfs
21b10 2d 3e 70 4d 61 69 6e 3b 20 70 49 74 65 72 3b 20  ->pMain; pIter; 
21b20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4d 61  pIter=pIter->pMa
21b30 69 6e 4e 65 78 74 29 3b 0a 20 20 20 20 70 2d 3e  inNext);.    p->
21b40 70 4d 61 69 6e 4e 65 78 74 20 3d 20 70 52 62 75  pMainNext = pRbu
21b50 56 66 73 2d 3e 70 4d 61 69 6e 3b 0a 20 20 20 20  Vfs->pMain;.    
21b60 70 52 62 75 56 66 73 2d 3e 70 4d 61 69 6e 20 3d  pRbuVfs->pMain =
21b70 20 70 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   p;.  }else{.   
21b80 20 66 6f 72 28 70 49 74 65 72 3d 70 52 62 75 56   for(pIter=pRbuV
21b90 66 73 2d 3e 70 4d 61 69 6e 52 62 75 3b 20 70 49  fs->pMainRbu; pI
21ba0 74 65 72 20 26 26 20 70 49 74 65 72 21 3d 70 3b  ter && pIter!=p;
21bb0 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4d   pIter=pIter->pM
21bc0 61 69 6e 52 62 75 4e 65 78 74 29 7b 7d 0a 20 20  ainRbuNext){}.  
21bd0 20 20 69 66 28 20 70 49 74 65 72 3d 3d 30 20 29    if( pIter==0 )
21be0 7b 0a 20 20 20 20 20 20 70 2d 3e 70 4d 61 69 6e  {.      p->pMain
21bf0 52 62 75 4e 65 78 74 20 3d 20 70 52 62 75 56 66  RbuNext = pRbuVf
21c00 73 2d 3e 70 4d 61 69 6e 52 62 75 3b 0a 20 20 20  s->pMainRbu;.   
21c10 20 20 20 70 52 62 75 56 66 73 2d 3e 70 4d 61 69     pRbuVfs->pMai
21c20 6e 52 62 75 20 3d 20 70 3b 0a 20 20 20 20 7d 0a  nRbu = p;.    }.
21c30 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
21c40 74 65 78 5f 6c 65 61 76 65 28 70 52 62 75 56 66  tex_leave(pRbuVf
21c50 73 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a 0a 2f 2a  s->mutex);.}../*
21c60 0a 2a 2a 20 52 65 6d 6f 76 65 20 61 6e 20 69 74  .** Remove an it
21c70 65 6d 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e  em from the main
21c80 2d 64 62 20 6c 69 73 74 73 2e 0a 2a 2f 0a 73 74  -db lists..*/.st
21c90 61 74 69 63 20 76 6f 69 64 20 72 62 75 4d 61 69  atic void rbuMai
21ca0 6e 6c 69 73 74 52 65 6d 6f 76 65 28 72 62 75 5f  nlistRemove(rbu_
21cb0 66 69 6c 65 20 2a 70 29 7b 0a 20 20 72 62 75 5f  file *p){.  rbu_
21cc0 66 69 6c 65 20 2a 2a 70 70 3b 0a 20 20 73 71 6c  file **pp;.  sql
21cd0 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
21ce0 28 70 2d 3e 70 52 62 75 56 66 73 2d 3e 6d 75 74  (p->pRbuVfs->mut
21cf0 65 78 29 3b 0a 20 20 66 6f 72 28 70 70 3d 26 70  ex);.  for(pp=&p
21d00 2d 3e 70 52 62 75 56 66 73 2d 3e 70 4d 61 69 6e  ->pRbuVfs->pMain
21d10 3b 20 2a 70 70 20 26 26 20 2a 70 70 21 3d 70 3b  ; *pp && *pp!=p;
21d20 20 70 70 3d 26 28 28 2a 70 70 29 2d 3e 70 4d 61   pp=&((*pp)->pMa
21d30 69 6e 4e 65 78 74 29 29 7b 7d 0a 20 20 69 66 28  inNext)){}.  if(
21d40 20 2a 70 70 20 29 20 2a 70 70 20 3d 20 70 2d 3e   *pp ) *pp = p->
21d50 70 4d 61 69 6e 4e 65 78 74 3b 0a 20 20 70 2d 3e  pMainNext;.  p->
21d60 70 4d 61 69 6e 4e 65 78 74 20 3d 20 30 3b 0a 20  pMainNext = 0;. 
21d70 20 66 6f 72 28 70 70 3d 26 70 2d 3e 70 52 62 75   for(pp=&p->pRbu
21d80 56 66 73 2d 3e 70 4d 61 69 6e 52 62 75 3b 20 2a  Vfs->pMainRbu; *
21d90 70 70 20 26 26 20 2a 70 70 21 3d 70 3b 20 70 70  pp && *pp!=p; pp
21da0 3d 26 28 28 2a 70 70 29 2d 3e 70 4d 61 69 6e 52  =&((*pp)->pMainR
21db0 62 75 4e 65 78 74 29 29 7b 7d 0a 20 20 69 66 28  buNext)){}.  if(
21dc0 20 2a 70 70 20 29 20 2a 70 70 20 3d 20 70 2d 3e   *pp ) *pp = p->
21dd0 70 4d 61 69 6e 52 62 75 4e 65 78 74 3b 0a 20 20  pMainRbuNext;.  
21de0 70 2d 3e 70 4d 61 69 6e 52 62 75 4e 65 78 74 20  p->pMainRbuNext 
21df0 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  = 0;.  sqlite3_m
21e00 75 74 65 78 5f 6c 65 61 76 65 28 70 2d 3e 70 52  utex_leave(p->pR
21e10 62 75 56 66 73 2d 3e 6d 75 74 65 78 29 3b 0a 7d  buVfs->mutex);.}
21e20 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68  ../*.** Given th
21e30 61 74 20 7a 57 61 6c 20 70 6f 69 6e 74 73 20 74  at zWal points t
21e40 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61  o a buffer conta
21e50 69 6e 69 6e 67 20 61 20 77 61 6c 20 66 69 6c 65  ining a wal file
21e60 20 6e 61 6d 65 20 70 61 73 73 65 64 20 74 6f 20   name passed to 
21e70 0a 2a 2a 20 65 69 74 68 65 72 20 74 68 65 20 78  .** either the x
21e80 4f 70 65 6e 28 29 20 6f 72 20 78 41 63 63 65 73  Open() or xAcces
21e90 73 28 29 20 56 46 53 20 6d 65 74 68 6f 64 2c 20  s() VFS method, 
21ea0 73 65 61 72 63 68 20 74 68 65 20 6d 61 69 6e 2d  search the main-
21eb0 64 62 20 6c 69 73 74 20 66 6f 72 0a 2a 2a 20 61  db list for.** a
21ec0 20 66 69 6c 65 2d 68 61 6e 64 6c 65 20 6f 70 65   file-handle ope
21ed0 6e 65 64 20 62 79 20 74 68 65 20 73 61 6d 65 20  ned by the same 
21ee0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
21ef0 69 6f 6e 20 6f 6e 20 74 68 65 20 63 6f 72 72 65  ion on the corre
21f00 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 64 61 74 61  sponding.** data
21f10 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
21f20 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 62 52   If parameter bR
21f30 62 75 20 69 73 20 74 72 75 65 2c 20 6f 6e 6c 79  bu is true, only
21f40 20 73 65 61 72 63 68 20 66 6f 72 20 66 69 6c 65   search for file
21f50 2d 64 65 73 63 72 69 70 74 6f 72 73 20 77 69 74  -descriptors wit
21f60 68 0a 2a 2a 20 72 62 75 5f 66 69 6c 65 2e 70 44  h.** rbu_file.pD
21f70 62 21 3d 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  b!=0..*/.static 
21f80 72 62 75 5f 66 69 6c 65 20 2a 72 62 75 46 69 6e  rbu_file *rbuFin
21f90 64 4d 61 69 6e 64 62 28 72 62 75 5f 76 66 73 20  dMaindb(rbu_vfs 
21fa0 2a 70 52 62 75 56 66 73 2c 20 63 6f 6e 73 74 20  *pRbuVfs, const 
21fb0 63 68 61 72 20 2a 7a 57 61 6c 2c 20 69 6e 74 20  char *zWal, int 
21fc0 62 52 62 75 29 7b 0a 20 20 72 62 75 5f 66 69 6c  bRbu){.  rbu_fil
21fd0 65 20 2a 70 44 62 3b 0a 20 20 73 71 6c 69 74 65  e *pDb;.  sqlite
21fe0 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 52  3_mutex_enter(pR
21ff0 62 75 56 66 73 2d 3e 6d 75 74 65 78 29 3b 0a 20  buVfs->mutex);. 
22000 20 69 66 28 20 62 52 62 75 20 29 7b 0a 20 20 20   if( bRbu ){.   
22010 20 66 6f 72 28 70 44 62 3d 70 52 62 75 56 66 73   for(pDb=pRbuVfs
22020 2d 3e 70 4d 61 69 6e 52 62 75 3b 20 70 44 62 20  ->pMainRbu; pDb 
22030 26 26 20 70 44 62 2d 3e 7a 57 61 6c 21 3d 7a 57  && pDb->zWal!=zW
22040 61 6c 3b 20 70 44 62 3d 70 44 62 2d 3e 70 4d 61  al; pDb=pDb->pMa
22050 69 6e 52 62 75 4e 65 78 74 29 7b 7d 0a 20 20 7d  inRbuNext){}.  }
22060 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 70 44  else{.    for(pD
22070 62 3d 70 52 62 75 56 66 73 2d 3e 70 4d 61 69 6e  b=pRbuVfs->pMain
22080 3b 20 70 44 62 20 26 26 20 70 44 62 2d 3e 7a 57  ; pDb && pDb->zW
22090 61 6c 21 3d 7a 57 61 6c 3b 20 70 44 62 3d 70 44  al!=zWal; pDb=pD
220a0 62 2d 3e 70 4d 61 69 6e 4e 65 78 74 29 7b 7d 0a  b->pMainNext){}.
220b0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
220c0 74 65 78 5f 6c 65 61 76 65 28 70 52 62 75 56 66  tex_leave(pRbuVf
220d0 73 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  s->mutex);.  ret
220e0 75 72 6e 20 70 44 62 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn pDb;.}../*.*
220f0 2a 20 43 6c 6f 73 65 20 61 6e 20 72 62 75 20 66  * Close an rbu f
22100 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
22110 6e 74 20 72 62 75 56 66 73 43 6c 6f 73 65 28 73  nt rbuVfsClose(s
22120 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
22130 6c 65 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20  le){.  rbu_file 
22140 2a 70 20 3d 20 28 72 62 75 5f 66 69 6c 65 2a 29  *p = (rbu_file*)
22150 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20 72 63 3b  pFile;.  int rc;
22160 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20  .  int i;..  /* 
22170 46 72 65 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  Free the content
22180 73 20 6f 66 20 74 68 65 20 61 70 53 68 6d 5b 5d  s of the apShm[]
22190 20 61 72 72 61 79 2e 20 41 6e 64 20 74 68 65 20   array. And the 
221a0 61 72 72 61 79 20 69 74 73 65 6c 66 2e 20 2a 2f  array itself. */
221b0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
221c0 3e 6e 53 68 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nShm; i++){.   
221d0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
221e0 3e 61 70 53 68 6d 5b 69 5d 29 3b 0a 20 20 7d 0a  >apShm[i]);.  }.
221f0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
22200 2d 3e 61 70 53 68 6d 29 3b 0a 20 20 70 2d 3e 61  ->apShm);.  p->a
22210 70 53 68 6d 20 3d 20 30 3b 0a 20 20 73 71 6c 69  pShm = 0;.  sqli
22220 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 44 65 6c  te3_free(p->zDel
22230 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 6f 70 65  );..  if( p->ope
22240 6e 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  nFlags & SQLITE_
22250 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 7b 0a  OPEN_MAIN_DB ){.
22260 20 20 20 20 72 62 75 4d 61 69 6e 6c 69 73 74 52      rbuMainlistR
22270 65 6d 6f 76 65 28 70 29 3b 0a 20 20 20 20 72 62  emove(p);.    rb
22280 75 55 6e 6c 6f 63 6b 53 68 6d 28 70 29 3b 0a 20  uUnlockShm(p);. 
22290 20 20 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65     p->pReal->pMe
222a0 74 68 6f 64 73 2d 3e 78 53 68 6d 55 6e 6d 61 70  thods->xShmUnmap
222b0 28 70 2d 3e 70 52 65 61 6c 2c 20 30 29 3b 0a 20  (p->pReal, 0);. 
222c0 20 7d 0a 20 20 65 6c 73 65 20 69 66 28 20 28 70   }.  else if( (p
222d0 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20 53 51  ->openFlags & SQ
222e0 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45  LITE_OPEN_DELETE
222f0 4f 4e 43 4c 4f 53 45 29 20 26 26 20 70 2d 3e 70  ONCLOSE) && p->p
22300 52 62 75 20 29 7b 0a 20 20 20 20 72 62 75 55 70  Rbu ){.    rbuUp
22310 64 61 74 65 54 65 6d 70 53 69 7a 65 28 70 2c 20  dateTempSize(p, 
22320 30 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  0);.  }.  assert
22330 28 20 70 2d 3e 70 4d 61 69 6e 4e 65 78 74 3d 3d  ( p->pMainNext==
22340 30 20 26 26 20 70 2d 3e 70 52 62 75 56 66 73 2d  0 && p->pRbuVfs-
22350 3e 70 4d 61 69 6e 21 3d 70 20 29 3b 0a 0a 20 20  >pMain!=p );..  
22360 2f 2a 20 43 6c 6f 73 65 20 74 68 65 20 75 6e 64  /* Close the und
22370 65 72 6c 79 69 6e 67 20 66 69 6c 65 20 68 61 6e  erlying file han
22380 64 6c 65 20 2a 2f 0a 20 20 72 63 20 3d 20 70 2d  dle */.  rc = p-
22390 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73  >pReal->pMethods
223a0 2d 3e 78 43 6c 6f 73 65 28 70 2d 3e 70 52 65 61  ->xClose(p->pRea
223b0 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  l);.  return rc;
223c0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  .}.../*.** Read 
223d0 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 75 6e  and return an un
223e0 73 69 67 6e 65 64 20 33 32 2d 62 69 74 20 62 69  signed 32-bit bi
223f0 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
22400 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72   from the buffer
22410 20 0a 2a 2a 20 70 61 73 73 65 64 20 61 73 20 74   .** passed as t
22420 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74  he only argument
22430 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20  ..*/.static u32 
22440 72 62 75 47 65 74 55 33 32 28 75 38 20 2a 61 42  rbuGetU32(u8 *aB
22450 75 66 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 28  uf){.  return ((
22460 75 33 32 29 61 42 75 66 5b 30 5d 20 3c 3c 20 32  u32)aBuf[0] << 2
22470 34 29 0a 20 20 20 20 20 20 20 2b 20 28 28 75 33  4).       + ((u3
22480 32 29 61 42 75 66 5b 31 5d 20 3c 3c 20 31 36 29  2)aBuf[1] << 16)
22490 0a 20 20 20 20 20 20 20 2b 20 28 28 75 33 32 29  .       + ((u32)
224a0 61 42 75 66 5b 32 5d 20 3c 3c 20 20 38 29 0a 20  aBuf[2] <<  8). 
224b0 20 20 20 20 20 20 2b 20 28 28 75 33 32 29 61 42        + ((u32)aB
224c0 75 66 5b 33 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  uf[3]);.}../*.**
224d0 20 57 72 69 74 65 20 61 6e 20 75 6e 73 69 67 6e   Write an unsign
224e0 65 64 20 33 32 2d 62 69 74 20 76 61 6c 75 65 20  ed 32-bit value 
224f0 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e 20 66 6f  in big-endian fo
22500 72 6d 61 74 20 74 6f 20 74 68 65 20 73 75 70 70  rmat to the supp
22510 6c 69 65 64 0a 2a 2a 20 62 75 66 66 65 72 2e 0a  lied.** buffer..
22520 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
22530 62 75 50 75 74 55 33 32 28 75 38 20 2a 61 42 75  buPutU32(u8 *aBu
22540 66 2c 20 75 33 32 20 69 56 61 6c 29 7b 0a 20 20  f, u32 iVal){.  
22550 61 42 75 66 5b 30 5d 20 3d 20 28 69 56 61 6c 20  aBuf[0] = (iVal 
22560 3e 3e 20 32 34 29 20 26 20 30 78 46 46 3b 0a 20  >> 24) & 0xFF;. 
22570 20 61 42 75 66 5b 31 5d 20 3d 20 28 69 56 61 6c   aBuf[1] = (iVal
22580 20 3e 3e 20 31 36 29 20 26 20 30 78 46 46 3b 0a   >> 16) & 0xFF;.
22590 20 20 61 42 75 66 5b 32 5d 20 3d 20 28 69 56 61    aBuf[2] = (iVa
225a0 6c 20 3e 3e 20 20 38 29 20 26 20 30 78 46 46 3b  l >>  8) & 0xFF;
225b0 0a 20 20 61 42 75 66 5b 33 5d 20 3d 20 28 69 56  .  aBuf[3] = (iV
225c0 61 6c 20 3e 3e 20 20 30 29 20 26 20 30 78 46 46  al >>  0) & 0xFF
225d0 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
225e0 20 72 62 75 50 75 74 55 31 36 28 75 38 20 2a 61   rbuPutU16(u8 *a
225f0 42 75 66 2c 20 75 31 36 20 69 56 61 6c 29 7b 0a  Buf, u16 iVal){.
22600 20 20 61 42 75 66 5b 30 5d 20 3d 20 28 69 56 61    aBuf[0] = (iVa
22610 6c 20 3e 3e 20 20 38 29 20 26 20 30 78 46 46 3b  l >>  8) & 0xFF;
22620 0a 20 20 61 42 75 66 5b 31 5d 20 3d 20 28 69 56  .  aBuf[1] = (iV
22630 61 6c 20 3e 3e 20 20 30 29 20 26 20 30 78 46 46  al >>  0) & 0xFF
22640 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
22650 64 61 74 61 20 66 72 6f 6d 20 61 6e 20 72 62 75  data from an rbu
22660 56 66 73 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  Vfs-file..*/.sta
22670 74 69 63 20 69 6e 74 20 72 62 75 56 66 73 52 65  tic int rbuVfsRe
22680 61 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  ad(.  sqlite3_fi
22690 6c 65 20 2a 70 46 69 6c 65 2c 20 0a 20 20 76 6f  le *pFile, .  vo
226a0 69 64 20 2a 7a 42 75 66 2c 20 0a 20 20 69 6e 74  id *zBuf, .  int
226b0 20 69 41 6d 74 2c 20 0a 20 20 73 71 6c 69 74 65   iAmt, .  sqlite
226c0 5f 69 6e 74 36 34 20 69 4f 66 73 74 0a 29 7b 0a  _int64 iOfst.){.
226d0 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 20 3d 20    rbu_file *p = 
226e0 28 72 62 75 5f 66 69 6c 65 2a 29 70 46 69 6c 65  (rbu_file*)pFile
226f0 3b 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20 2a  ;.  sqlite3rbu *
22700 70 52 62 75 20 3d 20 70 2d 3e 70 52 62 75 3b 0a  pRbu = p->pRbu;.
22710 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
22720 20 70 52 62 75 20 26 26 20 70 52 62 75 2d 3e 65   pRbu && pRbu->e
22730 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45  Stage==RBU_STAGE
22740 5f 43 41 50 54 55 52 45 20 29 7b 0a 20 20 20 20  _CAPTURE ){.    
22750 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 65 6e 46  assert( p->openF
22760 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
22770 45 4e 5f 57 41 4c 20 29 3b 0a 20 20 20 20 72 63  EN_WAL );.    rc
22780 20 3d 20 72 62 75 43 61 70 74 75 72 65 57 61 6c   = rbuCaptureWal
22790 52 65 61 64 28 70 2d 3e 70 52 62 75 2c 20 69 4f  Read(p->pRbu, iO
227a0 66 73 74 2c 20 69 41 6d 74 29 3b 0a 20 20 7d 65  fst, iAmt);.  }e
227b0 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 52 62  lse{.    if( pRb
227c0 75 20 26 26 20 70 52 62 75 2d 3e 65 53 74 61 67  u && pRbu->eStag
227d0 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c  e==RBU_STAGE_OAL
227e0 20 0a 20 20 20 20 20 26 26 20 28 70 2d 3e 6f 70   .     && (p->op
227f0 65 6e 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  enFlags & SQLITE
22800 5f 4f 50 45 4e 5f 57 41 4c 29 20 0a 20 20 20 20  _OPEN_WAL) .    
22810 20 26 26 20 69 4f 66 73 74 3e 3d 70 52 62 75 2d   && iOfst>=pRbu-
22820 3e 69 4f 61 6c 53 7a 20 0a 20 20 20 20 29 7b 0a  >iOalSz .    ){.
22830 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
22840 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 6d 65 6d 73  E_OK;.      mems
22850 65 74 28 7a 42 75 66 2c 20 30 2c 20 69 41 6d 74  et(zBuf, 0, iAmt
22860 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
22870 20 20 20 20 72 63 20 3d 20 70 2d 3e 70 52 65 61      rc = p->pRea
22880 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 52 65  l->pMethods->xRe
22890 61 64 28 70 2d 3e 70 52 65 61 6c 2c 20 7a 42 75  ad(p->pReal, zBu
228a0 66 2c 20 69 41 6d 74 2c 20 69 4f 66 73 74 29 3b  f, iAmt, iOfst);
228b0 0a 23 69 66 20 31 0a 20 20 20 20 20 20 2f 2a 20  .#if 1.      /* 
228c0 49 66 20 74 68 69 73 20 69 73 20 62 65 69 6e 67  If this is being
228d0 20 63 61 6c 6c 65 64 20 74 6f 20 72 65 61 64 20   called to read 
228e0 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
228f0 66 20 74 68 65 20 74 61 72 67 65 74 20 0a 20 20  f the target .  
22900 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
22910 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20 72 62  as part of an rb
22920 75 20 76 61 63 75 75 6d 20 6f 70 65 72 61 74 69  u vacuum operati
22930 6f 6e 2c 20 73 79 6e 74 68 65 73 69 7a 65 20 74  on, synthesize t
22940 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e  he .      ** con
22950 74 65 6e 74 73 20 6f 66 20 74 68 65 20 66 69 72  tents of the fir
22960 73 74 20 70 61 67 65 20 69 66 20 69 74 20 64 6f  st page if it do
22970 65 73 20 6e 6f 74 20 79 65 74 20 65 78 69 73 74  es not yet exist
22980 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20 20  . Otherwise,.   
22990 20 20 20 2a 2a 20 53 51 4c 69 74 65 20 77 69 6c     ** SQLite wil
229a0 6c 20 6e 6f 74 20 63 68 65 63 6b 20 66 6f 72 20  l not check for 
229b0 61 20 2a 2d 77 61 6c 20 66 69 6c 65 2e 20 20 2a  a *-wal file.  *
229c0 2f 0a 20 20 20 20 20 20 69 66 28 20 70 52 62 75  /.      if( pRbu
229d0 20 26 26 20 72 62 75 49 73 56 61 63 75 75 6d 28   && rbuIsVacuum(
229e0 70 52 62 75 29 20 0a 20 20 20 20 20 20 20 20 20  pRbu) .         
229f0 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49   && rc==SQLITE_I
22a00 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20  OERR_SHORT_READ 
22a10 26 26 20 69 4f 66 73 74 3d 3d 30 0a 20 20 20 20  && iOfst==0.    
22a20 20 20 20 20 20 20 26 26 20 28 70 2d 3e 6f 70 65        && (p->ope
22a30 6e 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  nFlags & SQLITE_
22a40 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 0a 20 20  OPEN_MAIN_DB).  
22a50 20 20 20 20 20 20 20 20 26 26 20 70 52 62 75 2d          && pRbu-
22a60 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20  >rc==SQLITE_OK. 
22a70 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
22a80 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
22a90 64 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c  d = (sqlite3_fil
22aa0 65 2a 29 70 52 62 75 2d 3e 70 52 62 75 46 64 3b  e*)pRbu->pRbuFd;
22ab0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 46  .        rc = pF
22ac0 64 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 52 65  d->pMethods->xRe
22ad0 61 64 28 70 46 64 2c 20 7a 42 75 66 2c 20 69 41  ad(pFd, zBuf, iA
22ae0 6d 74 2c 20 69 4f 66 73 74 29 3b 0a 20 20 20 20  mt, iOfst);.    
22af0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
22b00 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
22b10 20 20 20 75 38 20 2a 61 42 75 66 20 3d 20 28 75     u8 *aBuf = (u
22b20 38 2a 29 7a 42 75 66 3b 0a 20 20 20 20 20 20 20  8*)zBuf;.       
22b30 20 20 20 75 33 32 20 69 52 6f 6f 74 20 3d 20 72     u32 iRoot = r
22b40 62 75 47 65 74 55 33 32 28 26 61 42 75 66 5b 35  buGetU32(&aBuf[5
22b50 32 5d 29 20 3f 20 31 20 3a 20 30 3b 0a 20 20 20  2]) ? 1 : 0;.   
22b60 20 20 20 20 20 20 20 72 62 75 50 75 74 55 33 32         rbuPutU32
22b70 28 26 61 42 75 66 5b 35 32 5d 2c 20 69 52 6f 6f  (&aBuf[52], iRoo
22b80 74 29 3b 20 20 20 20 20 20 2f 2a 20 6c 61 72 67  t);      /* larg
22b90 65 73 74 20 72 6f 6f 74 20 70 61 67 65 20 6e 75  est root page nu
22ba0 6d 62 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  mber */.        
22bb0 20 20 72 62 75 50 75 74 55 33 32 28 26 61 42 75    rbuPutU32(&aBu
22bc0 66 5b 33 36 5d 2c 20 30 29 3b 20 20 20 20 20 20  f[36], 0);      
22bd0 20 20 20 20 2f 2a 20 6e 75 6d 62 65 72 20 6f 66      /* number of
22be0 20 66 72 65 65 20 70 61 67 65 73 20 2a 2f 0a 20   free pages */. 
22bf0 20 20 20 20 20 20 20 20 20 72 62 75 50 75 74 55           rbuPutU
22c00 33 32 28 26 61 42 75 66 5b 33 32 5d 2c 20 30 29  32(&aBuf[32], 0)
22c10 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69  ;          /* fi
22c20 72 73 74 20 70 61 67 65 20 6f 6e 20 66 72 65 65  rst page on free
22c30 20 6c 69 73 74 20 74 72 75 6e 6b 20 2a 2f 0a 20   list trunk */. 
22c40 20 20 20 20 20 20 20 20 20 72 62 75 50 75 74 55           rbuPutU
22c50 33 32 28 26 61 42 75 66 5b 32 38 5d 2c 20 31 29  32(&aBuf[28], 1)
22c60 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 69  ;          /* si
22c70 7a 65 20 6f 66 20 64 62 20 66 69 6c 65 20 69 6e  ze of db file in
22c80 20 70 61 67 65 73 20 2a 2f 0a 20 20 20 20 20 20   pages */.      
22c90 20 20 20 20 72 62 75 50 75 74 55 33 32 28 26 61      rbuPutU32(&a
22ca0 42 75 66 5b 32 34 5d 2c 20 70 52 62 75 2d 3e 70  Buf[24], pRbu->p
22cb0 52 62 75 46 64 2d 3e 69 43 6f 6f 6b 69 65 2b 31  RbuFd->iCookie+1
22cc0 29 3b 20 20 2f 2a 20 43 68 61 6e 67 65 20 63 6f  );  /* Change co
22cd0 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 20 20 20 20  unter */..      
22ce0 20 20 20 20 69 66 28 20 69 41 6d 74 3e 31 30 30      if( iAmt>100
22cf0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
22d00 6d 65 6d 73 65 74 28 26 61 42 75 66 5b 31 30 30  memset(&aBuf[100
22d10 5d 2c 20 30 2c 20 69 41 6d 74 2d 31 30 30 29 3b  ], 0, iAmt-100);
22d20 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 62 75  .            rbu
22d30 50 75 74 55 31 36 28 26 61 42 75 66 5b 31 30 35  PutU16(&aBuf[105
22d40 5d 2c 20 69 41 6d 74 20 26 20 30 78 46 46 46 46  ], iAmt & 0xFFFF
22d50 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  );.            a
22d60 42 75 66 5b 31 30 30 5d 20 3d 20 30 78 30 44 3b  Buf[100] = 0x0D;
22d70 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
22d80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23       }.      }.#
22d90 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20  endif.    }.    
22da0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
22db0 4b 20 26 26 20 69 4f 66 73 74 3d 3d 30 20 26 26  K && iOfst==0 &&
22dc0 20 28 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26   (p->openFlags &
22dd0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49   SQLITE_OPEN_MAI
22de0 4e 5f 44 42 29 20 29 7b 0a 20 20 20 20 20 20 2f  N_DB) ){.      /
22df0 2a 20 54 68 65 73 65 20 6c 6f 6f 6b 20 6c 69 6b  * These look lik
22e00 65 20 6d 61 67 69 63 20 6e 75 6d 62 65 72 73 2e  e magic numbers.
22e10 20 42 75 74 20 74 68 65 79 20 61 72 65 20 73 74   But they are st
22e20 61 62 6c 65 2c 20 61 73 20 74 68 65 79 20 61 72  able, as they ar
22e30 65 20 70 61 72 74 0a 20 20 20 20 20 20 20 2a 2a  e part.       **
22e40 20 6f 66 20 74 68 65 20 64 65 66 69 6e 69 74 69   of the definiti
22e50 6f 6e 20 6f 66 20 74 68 65 20 53 51 4c 69 74 65  on of the SQLite
22e60 20 66 69 6c 65 20 66 6f 72 6d 61 74 2c 20 77 68   file format, wh
22e70 69 63 68 20 6d 61 79 20 6e 6f 74 20 63 68 61 6e  ich may not chan
22e80 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 75 38 20  ge. */.      u8 
22e90 2a 70 42 75 66 20 3d 20 28 75 38 2a 29 7a 42 75  *pBuf = (u8*)zBu
22ea0 66 3b 0a 20 20 20 20 20 20 70 2d 3e 69 43 6f 6f  f;.      p->iCoo
22eb0 6b 69 65 20 3d 20 72 62 75 47 65 74 55 33 32 28  kie = rbuGetU32(
22ec0 26 70 42 75 66 5b 32 34 5d 29 3b 0a 20 20 20 20  &pBuf[24]);.    
22ed0 20 20 70 2d 3e 69 57 72 69 74 65 56 65 72 20 3d    p->iWriteVer =
22ee0 20 70 42 75 66 5b 31 39 5d 3b 0a 20 20 20 20 7d   pBuf[19];.    }
22ef0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
22f00 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
22f10 20 64 61 74 61 20 74 6f 20 61 6e 20 72 62 75 56   data to an rbuV
22f20 66 73 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  fs-file..*/.stat
22f30 69 63 20 69 6e 74 20 72 62 75 56 66 73 57 72 69  ic int rbuVfsWri
22f40 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  te(.  sqlite3_fi
22f50 6c 65 20 2a 70 46 69 6c 65 2c 20 0a 20 20 63 6f  le *pFile, .  co
22f60 6e 73 74 20 76 6f 69 64 20 2a 7a 42 75 66 2c 20  nst void *zBuf, 
22f70 0a 20 20 69 6e 74 20 69 41 6d 74 2c 20 0a 20 20  .  int iAmt, .  
22f80 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 69 4f 66  sqlite_int64 iOf
22f90 73 74 0a 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65  st.){.  rbu_file
22fa0 20 2a 70 20 3d 20 28 72 62 75 5f 66 69 6c 65 2a   *p = (rbu_file*
22fb0 29 70 46 69 6c 65 3b 0a 20 20 73 71 6c 69 74 65  )pFile;.  sqlite
22fc0 33 72 62 75 20 2a 70 52 62 75 20 3d 20 70 2d 3e  3rbu *pRbu = p->
22fd0 70 52 62 75 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  pRbu;.  int rc;.
22fe0 0a 20 20 69 66 28 20 70 52 62 75 20 26 26 20 70  .  if( pRbu && p
22ff0 52 62 75 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55  Rbu->eStage==RBU
23000 5f 53 54 41 47 45 5f 43 41 50 54 55 52 45 20 29  _STAGE_CAPTURE )
23010 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
23020 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20 53 51 4c  >openFlags & SQL
23030 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
23040 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 72 62 75   );.    rc = rbu
23050 43 61 70 74 75 72 65 44 62 57 72 69 74 65 28 70  CaptureDbWrite(p
23060 2d 3e 70 52 62 75 2c 20 69 4f 66 73 74 29 3b 0a  ->pRbu, iOfst);.
23070 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
23080 20 70 52 62 75 20 29 7b 0a 20 20 20 20 20 20 69   pRbu ){.      i
23090 66 28 20 70 52 62 75 2d 3e 65 53 74 61 67 65 3d  f( pRbu->eStage=
230a0 3d 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20 0a  =RBU_STAGE_OAL .
230b0 20 20 20 20 20 20 20 26 26 20 28 70 2d 3e 6f 70         && (p->op
230c0 65 6e 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  enFlags & SQLITE
230d0 5f 4f 50 45 4e 5f 57 41 4c 29 20 0a 20 20 20 20  _OPEN_WAL) .    
230e0 20 20 20 26 26 20 69 4f 66 73 74 3e 3d 70 52 62     && iOfst>=pRb
230f0 75 2d 3e 69 4f 61 6c 53 7a 0a 20 20 20 20 20 20  u->iOalSz.      
23100 29 7b 0a 20 20 20 20 20 20 20 20 70 52 62 75 2d  ){.        pRbu-
23110 3e 69 4f 61 6c 53 7a 20 3d 20 69 41 6d 74 20 2b  >iOalSz = iAmt +
23120 20 69 4f 66 73 74 3b 0a 20 20 20 20 20 20 7d 65   iOfst;.      }e
23130 6c 73 65 20 69 66 28 20 70 2d 3e 6f 70 65 6e 46  lse if( p->openF
23140 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
23150 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  EN_DELETEONCLOSE
23160 20 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20   ){.        i64 
23170 73 7a 4e 65 77 20 3d 20 69 41 6d 74 2b 69 4f 66  szNew = iAmt+iOf
23180 73 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  st;.        if( 
23190 73 7a 4e 65 77 3e 70 2d 3e 73 7a 20 29 7b 0a 20  szNew>p->sz ){. 
231a0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 62           rc = rb
231b0 75 55 70 64 61 74 65 54 65 6d 70 53 69 7a 65 28  uUpdateTempSize(
231c0 70 2c 20 73 7a 4e 65 77 29 3b 0a 20 20 20 20 20  p, szNew);.     
231d0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
231e0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
231f0 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
23200 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
23210 72 63 20 3d 20 70 2d 3e 70 52 65 61 6c 2d 3e 70  rc = p->pReal->p
23220 4d 65 74 68 6f 64 73 2d 3e 78 57 72 69 74 65 28  Methods->xWrite(
23230 70 2d 3e 70 52 65 61 6c 2c 20 7a 42 75 66 2c 20  p->pReal, zBuf, 
23240 69 41 6d 74 2c 20 69 4f 66 73 74 29 3b 0a 20 20  iAmt, iOfst);.  
23250 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
23260 5f 4f 4b 20 26 26 20 69 4f 66 73 74 3d 3d 30 20  _OK && iOfst==0 
23270 26 26 20 28 70 2d 3e 6f 70 65 6e 46 6c 61 67 73  && (p->openFlags
23280 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d   & SQLITE_OPEN_M
23290 41 49 4e 5f 44 42 29 20 29 7b 0a 20 20 20 20 20  AIN_DB) ){.     
232a0 20 2f 2a 20 54 68 65 73 65 20 6c 6f 6f 6b 20 6c   /* These look l
232b0 69 6b 65 20 6d 61 67 69 63 20 6e 75 6d 62 65 72  ike magic number
232c0 73 2e 20 42 75 74 20 74 68 65 79 20 61 72 65 20  s. But they are 
232d0 73 74 61 62 6c 65 2c 20 61 73 20 74 68 65 79 20  stable, as they 
232e0 61 72 65 20 70 61 72 74 0a 20 20 20 20 20 20 2a  are part.      *
232f0 2a 20 6f 66 20 74 68 65 20 64 65 66 69 6e 69 74  * of the definit
23300 69 6f 6e 20 6f 66 20 74 68 65 20 53 51 4c 69 74  ion of the SQLit
23310 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2c 20 77  e file format, w
23320 68 69 63 68 20 6d 61 79 20 6e 6f 74 20 63 68 61  hich may not cha
23330 6e 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 75 38  nge. */.      u8
23340 20 2a 70 42 75 66 20 3d 20 28 75 38 2a 29 7a 42   *pBuf = (u8*)zB
23350 75 66 3b 0a 20 20 20 20 20 20 70 2d 3e 69 43 6f  uf;.      p->iCo
23360 6f 6b 69 65 20 3d 20 72 62 75 47 65 74 55 33 32  okie = rbuGetU32
23370 28 26 70 42 75 66 5b 32 34 5d 29 3b 0a 20 20 20  (&pBuf[24]);.   
23380 20 20 20 70 2d 3e 69 57 72 69 74 65 56 65 72 20     p->iWriteVer 
23390 3d 20 70 42 75 66 5b 31 39 5d 3b 0a 20 20 20 20  = pBuf[19];.    
233a0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
233b0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e  c;.}../*.** Trun
233c0 63 61 74 65 20 61 6e 20 72 62 75 56 66 73 2d 66  cate an rbuVfs-f
233d0 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
233e0 6e 74 20 72 62 75 56 66 73 54 72 75 6e 63 61 74  nt rbuVfsTruncat
233f0 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
23400 70 46 69 6c 65 2c 20 73 71 6c 69 74 65 5f 69 6e  pFile, sqlite_in
23410 74 36 34 20 73 69 7a 65 29 7b 0a 20 20 72 62 75  t64 size){.  rbu
23420 5f 66 69 6c 65 20 2a 70 20 3d 20 28 72 62 75 5f  _file *p = (rbu_
23430 66 69 6c 65 2a 29 70 46 69 6c 65 3b 0a 20 20 69  file*)pFile;.  i
23440 66 28 20 28 70 2d 3e 6f 70 65 6e 46 6c 61 67 73  f( (p->openFlags
23450 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44   & SQLITE_OPEN_D
23460 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 29 20 26 26  ELETEONCLOSE) &&
23470 20 70 2d 3e 70 52 62 75 20 29 7b 0a 20 20 20 20   p->pRbu ){.    
23480 69 6e 74 20 72 63 20 3d 20 72 62 75 55 70 64 61  int rc = rbuUpda
23490 74 65 54 65 6d 70 53 69 7a 65 28 70 2c 20 73 69  teTempSize(p, si
234a0 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ze);.    if( rc!
234b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
234c0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 72 65  urn rc;.  }.  re
234d0 74 75 72 6e 20 70 2d 3e 70 52 65 61 6c 2d 3e 70  turn p->pReal->p
234e0 4d 65 74 68 6f 64 73 2d 3e 78 54 72 75 6e 63 61  Methods->xTrunca
234f0 74 65 28 70 2d 3e 70 52 65 61 6c 2c 20 73 69 7a  te(p->pReal, siz
23500 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e  e);.}../*.** Syn
23510 63 20 61 6e 20 72 62 75 56 66 73 2d 66 69 6c 65  c an rbuVfs-file
23520 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
23530 72 62 75 56 66 73 53 79 6e 63 28 73 71 6c 69 74  rbuVfsSync(sqlit
23540 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20  e3_file *pFile, 
23550 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 72 62  int flags){.  rb
23560 75 5f 66 69 6c 65 20 2a 70 20 3d 20 28 72 62 75  u_file *p = (rbu
23570 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20  _file *)pFile;. 
23580 20 69 66 28 20 70 2d 3e 70 52 62 75 20 26 26 20   if( p->pRbu && 
23590 70 2d 3e 70 52 62 75 2d 3e 65 53 74 61 67 65 3d  p->pRbu->eStage=
235a0 3d 52 42 55 5f 53 54 41 47 45 5f 43 41 50 54 55  =RBU_STAGE_CAPTU
235b0 52 45 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  RE ){.    if( p-
235c0 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20 53 51 4c  >openFlags & SQL
235d0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
235e0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
235f0 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c   SQLITE_INTERNAL
23600 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
23610 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
23620 7d 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 52  }.  return p->pR
23630 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78  eal->pMethods->x
23640 53 79 6e 63 28 70 2d 3e 70 52 65 61 6c 2c 20 66  Sync(p->pReal, f
23650 6c 61 67 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  lags);.}../*.** 
23660 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65  Return the curre
23670 6e 74 20 66 69 6c 65 2d 73 69 7a 65 20 6f 66 20  nt file-size of 
23680 61 6e 20 72 62 75 56 66 73 2d 66 69 6c 65 2e 0a  an rbuVfs-file..
23690 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62  */.static int rb
236a0 75 56 66 73 46 69 6c 65 53 69 7a 65 28 73 71 6c  uVfsFileSize(sql
236b0 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65  ite3_file *pFile
236c0 2c 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 2a  , sqlite_int64 *
236d0 70 53 69 7a 65 29 7b 0a 20 20 72 62 75 5f 66 69  pSize){.  rbu_fi
236e0 6c 65 20 2a 70 20 3d 20 28 72 62 75 5f 66 69 6c  le *p = (rbu_fil
236f0 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 69 6e 74  e *)pFile;.  int
23700 20 72 63 3b 0a 20 20 72 63 20 3d 20 70 2d 3e 70   rc;.  rc = p->p
23710 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e  Real->pMethods->
23720 78 46 69 6c 65 53 69 7a 65 28 70 2d 3e 70 52 65  xFileSize(p->pRe
23730 61 6c 2c 20 70 53 69 7a 65 29 3b 0a 0a 20 20 2f  al, pSize);..  /
23740 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
23750 52 42 55 20 76 61 63 75 75 6d 20 6f 70 65 72 61  RBU vacuum opera
23760 74 69 6f 6e 20 61 6e 64 20 74 68 69 73 20 69 73  tion and this is
23770 20 74 68 65 20 74 61 72 67 65 74 20 64 61 74 61   the target data
23780 62 61 73 65 2c 0a 20 20 2a 2a 20 70 72 65 74 65  base,.  ** prete
23790 6e 64 20 74 68 61 74 20 69 74 20 68 61 73 20 61  nd that it has a
237a0 74 20 6c 65 61 73 74 20 6f 6e 65 20 70 61 67 65  t least one page
237b0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c  . Otherwise, SQL
237c0 69 74 65 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 2a  ite will not.  *
237d0 2a 20 63 68 65 63 6b 20 66 6f 72 20 74 68 65 20  * check for the 
237e0 65 78 69 73 74 61 6e 63 65 20 6f 66 20 61 20 2a  existance of a *
237f0 2d 77 61 6c 20 66 69 6c 65 2e 20 72 62 75 56 66  -wal file. rbuVf
23800 73 52 65 61 64 28 29 20 63 6f 6e 74 61 69 6e 73  sRead() contains
23810 20 0a 20 20 2a 2a 20 73 69 6d 69 6c 61 72 20 6c   .  ** similar l
23820 6f 67 69 63 2e 20 20 2a 2f 0a 20 20 69 66 28 20  ogic.  */.  if( 
23830 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
23840 20 2a 70 53 69 7a 65 3d 3d 30 20 0a 20 20 20 26   *pSize==0 .   &
23850 26 20 70 2d 3e 70 52 62 75 20 26 26 20 72 62 75  & p->pRbu && rbu
23860 49 73 56 61 63 75 75 6d 28 70 2d 3e 70 52 62 75  IsVacuum(p->pRbu
23870 29 20 0a 20 20 20 26 26 20 28 70 2d 3e 6f 70 65  ) .   && (p->ope
23880 6e 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  nFlags & SQLITE_
23890 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 0a 20 20  OPEN_MAIN_DB).  
238a0 29 7b 0a 20 20 20 20 2a 70 53 69 7a 65 20 3d 20  ){.    *pSize = 
238b0 31 30 32 34 3b 0a 20 20 7d 0a 20 20 72 65 74 75  1024;.  }.  retu
238c0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
238d0 4c 6f 63 6b 20 61 6e 20 72 62 75 56 66 73 2d 66  Lock an rbuVfs-f
238e0 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
238f0 6e 74 20 72 62 75 56 66 73 4c 6f 63 6b 28 73 71  nt rbuVfsLock(sq
23900 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
23910 65 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20  e, int eLock){. 
23920 20 72 62 75 5f 66 69 6c 65 20 2a 70 20 3d 20 28   rbu_file *p = (
23930 72 62 75 5f 66 69 6c 65 2a 29 70 46 69 6c 65 3b  rbu_file*)pFile;
23940 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20 2a 70  .  sqlite3rbu *p
23950 52 62 75 20 3d 20 70 2d 3e 70 52 62 75 3b 0a 20  Rbu = p->pRbu;. 
23960 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
23970 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  _OK;..  assert( 
23980 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20 28  p->openFlags & (
23990 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
239a0 5f 44 42 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  _DB|SQLITE_OPEN_
239b0 54 45 4d 50 5f 44 42 29 20 29 3b 0a 20 20 69 66  TEMP_DB) );.  if
239c0 28 20 65 4c 6f 63 6b 3d 3d 53 51 4c 49 54 45 5f  ( eLock==SQLITE_
239d0 4c 4f 43 4b 5f 45 58 43 4c 55 53 49 56 45 20 0a  LOCK_EXCLUSIVE .
239e0 20 20 20 26 26 20 28 70 2d 3e 62 4e 6f 6c 6f 63     && (p->bNoloc
239f0 6b 20 7c 7c 20 28 70 52 62 75 20 26 26 20 70 52  k || (pRbu && pR
23a00 62 75 2d 3e 65 53 74 61 67 65 21 3d 52 42 55 5f  bu->eStage!=RBU_
23a10 53 54 41 47 45 5f 44 4f 4e 45 29 29 0a 20 20 29  STAGE_DONE)).  )
23a20 7b 0a 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20  {.    /* Do not 
23a30 61 6c 6c 6f 77 20 45 58 43 4c 55 53 49 56 45 20  allow EXCLUSIVE 
23a40 6c 6f 63 6b 73 2e 20 50 72 65 76 65 6e 74 69 6e  locks. Preventin
23a50 67 20 53 51 4c 69 74 65 20 66 72 6f 6d 20 74 61  g SQLite from ta
23a60 6b 69 6e 67 20 74 68 69 73 20 0a 20 20 20 20 2a  king this .    *
23a70 2a 20 70 72 65 76 65 6e 74 73 20 69 74 20 66 72  * prevents it fr
23a80 6f 6d 20 63 68 65 63 6b 70 6f 69 6e 74 69 6e 67  om checkpointing
23a90 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 72   the database fr
23aa0 6f 6d 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  om sqlite3_close
23ab0 28 29 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  (). */.    rc = 
23ac0 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
23ad0 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 70  else{.    rc = p
23ae0 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64  ->pReal->pMethod
23af0 73 2d 3e 78 4c 6f 63 6b 28 70 2d 3e 70 52 65 61  s->xLock(p->pRea
23b00 6c 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20 7d 0a 0a  l, eLock);.  }..
23b10 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
23b20 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 61 6e 20  /*.** Unlock an 
23b30 72 62 75 56 66 73 2d 66 69 6c 65 2e 0a 2a 2f 0a  rbuVfs-file..*/.
23b40 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 56 66  static int rbuVf
23b50 73 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  sUnlock(sqlite3_
23b60 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74  file *pFile, int
23b70 20 65 4c 6f 63 6b 29 7b 0a 20 20 72 62 75 5f 66   eLock){.  rbu_f
23b80 69 6c 65 20 2a 70 20 3d 20 28 72 62 75 5f 66 69  ile *p = (rbu_fi
23b90 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 72 65  le *)pFile;.  re
23ba0 74 75 72 6e 20 70 2d 3e 70 52 65 61 6c 2d 3e 70  turn p->pReal->p
23bb0 4d 65 74 68 6f 64 73 2d 3e 78 55 6e 6c 6f 63 6b  Methods->xUnlock
23bc0 28 70 2d 3e 70 52 65 61 6c 2c 20 65 4c 6f 63 6b  (p->pReal, eLock
23bd0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  );.}../*.** Chec
23be0 6b 20 69 66 20 61 6e 6f 74 68 65 72 20 66 69 6c  k if another fil
23bf0 65 2d 68 61 6e 64 6c 65 20 68 6f 6c 64 73 20 61  e-handle holds a
23c00 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f   RESERVED lock o
23c10 6e 20 61 6e 20 72 62 75 56 66 73 2d 66 69 6c 65  n an rbuVfs-file
23c20 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
23c30 72 62 75 56 66 73 43 68 65 63 6b 52 65 73 65 72  rbuVfsCheckReser
23c40 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  vedLock(sqlite3_
23c50 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74  file *pFile, int
23c60 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 72 62   *pResOut){.  rb
23c70 75 5f 66 69 6c 65 20 2a 70 20 3d 20 28 72 62 75  u_file *p = (rbu
23c80 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20  _file *)pFile;. 
23c90 20 72 65 74 75 72 6e 20 70 2d 3e 70 52 65 61 6c   return p->pReal
23ca0 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 43 68 65  ->pMethods->xChe
23cb0 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 70  ckReservedLock(p
23cc0 2d 3e 70 52 65 61 6c 2c 20 70 52 65 73 4f 75 74  ->pReal, pResOut
23cd0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c 65  );.}../*.** File
23ce0 20 63 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64 2e   control method.
23cf0 20 46 6f 72 20 63 75 73 74 6f 6d 20 6f 70 65 72   For custom oper
23d00 61 74 69 6f 6e 73 20 6f 6e 20 61 6e 20 72 62 75  ations on an rbu
23d10 56 66 73 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  Vfs-file..*/.sta
23d20 74 69 63 20 69 6e 74 20 72 62 75 56 66 73 46 69  tic int rbuVfsFi
23d30 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65  leControl(sqlite
23d40 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69  3_file *pFile, i
23d50 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72  nt op, void *pAr
23d60 67 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a  g){.  rbu_file *
23d70 70 20 3d 20 28 72 62 75 5f 66 69 6c 65 20 2a 29  p = (rbu_file *)
23d80 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20 28 2a 78  pFile;.  int (*x
23d90 43 6f 6e 74 72 6f 6c 29 28 73 71 6c 69 74 65 33  Control)(sqlite3
23da0 5f 66 69 6c 65 2a 2c 69 6e 74 2c 76 6f 69 64 2a  _file*,int,void*
23db0 29 20 3d 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d  ) = p->pReal->pM
23dc0 65 74 68 6f 64 73 2d 3e 78 46 69 6c 65 43 6f 6e  ethods->xFileCon
23dd0 74 72 6f 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  trol;.  int rc;.
23de0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70  .  assert( p->op
23df0 65 6e 46 6c 61 67 73 20 26 20 28 53 51 4c 49 54  enFlags & (SQLIT
23e00 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 7c 53  E_OPEN_MAIN_DB|S
23e10 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
23e20 44 42 29 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d  DB).       || p-
23e30 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20 28 53 51  >openFlags & (SQ
23e40 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49  LITE_OPEN_TRANSI
23e50 45 4e 54 5f 44 42 7c 53 51 4c 49 54 45 5f 4f 50  ENT_DB|SQLITE_OP
23e60 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 29  EN_TEMP_JOURNAL)
23e70 0a 20 20 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  .  );.  if( op==
23e80 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 52 42 55  SQLITE_FCNTL_RBU
23e90 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 72   ){.    sqlite3r
23ea0 62 75 20 2a 70 52 62 75 20 3d 20 28 73 71 6c 69  bu *pRbu = (sqli
23eb0 74 65 33 72 62 75 2a 29 70 41 72 67 3b 0a 0a 20  te3rbu*)pArg;.. 
23ec0 20 20 20 2f 2a 20 46 69 72 73 74 20 74 72 79 20     /* First try 
23ed0 74 6f 20 66 69 6e 64 20 61 6e 6f 74 68 65 72 20  to find another 
23ee0 52 42 55 20 76 66 73 20 6c 6f 77 65 72 20 64 6f  RBU vfs lower do
23ef0 77 6e 20 69 6e 20 74 68 65 20 76 66 73 20 73 74  wn in the vfs st
23f00 61 63 6b 2e 20 49 66 0a 20 20 20 20 2a 2a 20 6f  ack. If.    ** o
23f10 6e 65 20 69 73 20 66 6f 75 6e 64 2c 20 74 68 69  ne is found, thi
23f20 73 20 76 66 73 20 77 69 6c 6c 20 6f 70 65 72 61  s vfs will opera
23f30 74 65 20 69 6e 20 70 61 73 73 2d 74 68 72 6f 75  te in pass-throu
23f40 67 68 20 6d 6f 64 65 2e 20 54 68 65 20 6c 6f 77  gh mode. The low
23f50 65 72 0a 20 20 20 20 2a 2a 20 6c 65 76 65 6c 20  er.    ** level 
23f60 76 66 73 20 77 69 6c 6c 20 64 6f 20 74 68 65 20  vfs will do the 
23f70 73 70 65 63 69 61 6c 20 52 42 55 20 68 61 6e 64  special RBU hand
23f80 6c 69 6e 67 2e 20 20 2a 2f 0a 20 20 20 20 72 63  ling.  */.    rc
23f90 20 3d 20 78 43 6f 6e 74 72 6f 6c 28 70 2d 3e 70   = xControl(p->p
23fa0 52 65 61 6c 2c 20 6f 70 2c 20 70 41 72 67 29 3b  Real, op, pArg);
23fb0 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ..    if( rc==SQ
23fc0 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 7b  LITE_NOTFOUND ){
23fd0 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 77 20 73 65  .      /* Now se
23fe0 61 72 63 68 20 66 6f 72 20 61 20 7a 69 70 76 66  arch for a zipvf
23ff0 73 20 69 6e 73 74 61 6e 63 65 20 6c 6f 77 65 72  s instance lower
24000 20 64 6f 77 6e 20 69 6e 20 74 68 65 20 56 46 53   down in the VFS
24010 20 73 74 61 63 6b 2e 20 49 66 0a 20 20 20 20 20   stack. If.     
24020 20 2a 2a 20 6f 6e 65 20 69 73 20 66 6f 75 6e 64   ** one is found
24030 2c 20 74 68 69 73 20 69 73 20 61 6e 20 65 72 72  , this is an err
24040 6f 72 2e 20 20 2a 2f 0a 20 20 20 20 20 20 76 6f  or.  */.      vo
24050 69 64 20 2a 64 75 6d 6d 79 20 3d 20 30 3b 0a 20  id *dummy = 0;. 
24060 20 20 20 20 20 72 63 20 3d 20 78 43 6f 6e 74 72       rc = xContr
24070 6f 6c 28 70 2d 3e 70 52 65 61 6c 2c 20 53 51 4c  ol(p->pReal, SQL
24080 49 54 45 5f 46 43 4e 54 4c 5f 5a 49 50 56 46 53  ITE_FCNTL_ZIPVFS
24090 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 20  , &dummy);.     
240a0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
240b0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
240c0 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
240d0 0a 20 20 20 20 20 20 20 20 70 52 62 75 2d 3e 7a  .        pRbu->z
240e0 45 72 72 6d 73 67 20 3d 20 73 71 6c 69 74 65 33  Errmsg = sqlite3
240f0 5f 6d 70 72 69 6e 74 66 28 22 72 62 75 2f 7a 69  _mprintf("rbu/zi
24100 70 76 66 73 20 73 65 74 75 70 20 65 72 72 6f 72  pvfs setup error
24110 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ");.      }else 
24120 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  if( rc==SQLITE_N
24130 4f 54 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20  OTFOUND ){.     
24140 20 20 20 70 52 62 75 2d 3e 70 54 61 72 67 65 74     pRbu->pTarget
24150 46 64 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20  Fd = p;.        
24160 70 2d 3e 70 52 62 75 20 3d 20 70 52 62 75 3b 0a  p->pRbu = pRbu;.
24170 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f          if( p->o
24180 70 65 6e 46 6c 61 67 73 20 26 20 53 51 4c 49 54  penFlags & SQLIT
24190 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29  E_OPEN_MAIN_DB )
241a0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 62 75 4d  {.          rbuM
241b0 61 69 6e 6c 69 73 74 41 64 64 28 70 29 3b 0a 20  ainlistAdd(p);. 
241c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
241d0 20 69 66 28 20 70 2d 3e 70 57 61 6c 46 64 20 29   if( p->pWalFd )
241e0 20 70 2d 3e 70 57 61 6c 46 64 2d 3e 70 52 62 75   p->pWalFd->pRbu
241f0 20 3d 20 70 52 62 75 3b 0a 20 20 20 20 20 20 20   = pRbu;.       
24200 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
24210 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
24220 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
24230 7d 0a 20 20 65 6c 73 65 20 69 66 28 20 6f 70 3d  }.  else if( op=
24240 3d 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 52 42  =SQLITE_FCNTL_RB
24250 55 43 4e 54 20 29 7b 0a 20 20 20 20 73 71 6c 69  UCNT ){.    sqli
24260 74 65 33 72 62 75 20 2a 70 52 62 75 20 3d 20 28  te3rbu *pRbu = (
24270 73 71 6c 69 74 65 33 72 62 75 2a 29 70 41 72 67  sqlite3rbu*)pArg
24280 3b 0a 20 20 20 20 70 52 62 75 2d 3e 6e 52 62 75  ;.    pRbu->nRbu
24290 2b 2b 3b 0a 20 20 20 20 70 52 62 75 2d 3e 70 52  ++;.    pRbu->pR
242a0 62 75 46 64 20 3d 20 70 3b 0a 20 20 20 20 70 2d  buFd = p;.    p-
242b0 3e 62 4e 6f 6c 6f 63 6b 20 3d 20 31 3b 0a 20 20  >bNolock = 1;.  
242c0 7d 0a 0a 20 20 72 63 20 3d 20 78 43 6f 6e 74 72  }..  rc = xContr
242d0 6f 6c 28 70 2d 3e 70 52 65 61 6c 2c 20 6f 70 2c  ol(p->pReal, op,
242e0 20 70 41 72 67 29 3b 0a 20 20 69 66 28 20 72 63   pArg);.  if( rc
242f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6f  ==SQLITE_OK && o
24300 70 3d 3d 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  p==SQLITE_FCNTL_
24310 56 46 53 4e 41 4d 45 20 29 7b 0a 20 20 20 20 72  VFSNAME ){.    r
24320 62 75 5f 76 66 73 20 2a 70 52 62 75 56 66 73 20  bu_vfs *pRbuVfs 
24330 3d 20 70 2d 3e 70 52 62 75 56 66 73 3b 0a 20 20  = p->pRbuVfs;.  
24340 20 20 63 68 61 72 20 2a 7a 49 6e 20 3d 20 2a 28    char *zIn = *(
24350 63 68 61 72 2a 2a 29 70 41 72 67 3b 0a 20 20 20  char**)pArg;.   
24360 20 63 68 61 72 20 2a 7a 4f 75 74 20 3d 20 73 71   char *zOut = sq
24370 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 72  lite3_mprintf("r
24380 62 75 28 25 73 29 2f 25 7a 22 2c 20 70 52 62 75  bu(%s)/%z", pRbu
24390 56 66 73 2d 3e 62 61 73 65 2e 7a 4e 61 6d 65 2c  Vfs->base.zName,
243a0 20 7a 49 6e 29 3b 0a 20 20 20 20 2a 28 63 68 61   zIn);.    *(cha
243b0 72 2a 2a 29 70 41 72 67 20 3d 20 7a 4f 75 74 3b  r**)pArg = zOut;
243c0 0a 20 20 20 20 69 66 28 20 7a 4f 75 74 3d 3d 30  .    if( zOut==0
243d0 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e   ) rc = SQLITE_N
243e0 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  OMEM;.  }..  ret
243f0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
24400 20 52 65 74 75 72 6e 20 74 68 65 20 73 65 63 74   Return the sect
24410 6f 72 2d 73 69 7a 65 20 69 6e 20 62 79 74 65 73  or-size in bytes
24420 20 66 6f 72 20 61 6e 20 72 62 75 56 66 73 2d 66   for an rbuVfs-f
24430 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
24440 6e 74 20 72 62 75 56 66 73 53 65 63 74 6f 72 53  nt rbuVfsSectorS
24450 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ize(sqlite3_file
24460 20 2a 70 46 69 6c 65 29 7b 0a 20 20 72 62 75 5f   *pFile){.  rbu_
24470 66 69 6c 65 20 2a 70 20 3d 20 28 72 62 75 5f 66  file *p = (rbu_f
24480 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 72  ile *)pFile;.  r
24490 65 74 75 72 6e 20 70 2d 3e 70 52 65 61 6c 2d 3e  eturn p->pReal->
244a0 70 4d 65 74 68 6f 64 73 2d 3e 78 53 65 63 74 6f  pMethods->xSecto
244b0 72 53 69 7a 65 28 70 2d 3e 70 52 65 61 6c 29 3b  rSize(p->pReal);
244c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
244d0 20 74 68 65 20 64 65 76 69 63 65 20 63 68 61 72   the device char
244e0 61 63 74 65 72 69 73 74 69 63 20 66 6c 61 67 73  acteristic flags
244f0 20 73 75 70 70 6f 72 74 65 64 20 62 79 20 61 6e   supported by an
24500 20 72 62 75 56 66 73 2d 66 69 6c 65 2e 0a 2a 2f   rbuVfs-file..*/
24510 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 56  .static int rbuV
24520 66 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  fsDeviceCharacte
24530 72 69 73 74 69 63 73 28 73 71 6c 69 74 65 33 5f  ristics(sqlite3_
24540 66 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  file *pFile){.  
24550 72 62 75 5f 66 69 6c 65 20 2a 70 20 3d 20 28 72  rbu_file *p = (r
24560 62 75 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65 3b  bu_file *)pFile;
24570 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 52 65  .  return p->pRe
24580 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 44  al->pMethods->xD
24590 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
245a0 74 69 63 73 28 70 2d 3e 70 52 65 61 6c 29 3b 0a  tics(p->pReal);.
245b0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 61 6b 65 20 6f 72  }../*.** Take or
245c0 20 72 65 6c 65 61 73 65 20 61 20 73 68 61 72 65   release a share
245d0 64 2d 6d 65 6d 6f 72 79 20 6c 6f 63 6b 2e 0a 2a  d-memory lock..*
245e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62 75  /.static int rbu
245f0 56 66 73 53 68 6d 4c 6f 63 6b 28 73 71 6c 69 74  VfsShmLock(sqlit
24600 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20  e3_file *pFile, 
24610 69 6e 74 20 6f 66 73 74 2c 20 69 6e 74 20 6e 2c  int ofst, int n,
24620 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 72   int flags){.  r
24630 62 75 5f 66 69 6c 65 20 2a 70 20 3d 20 28 72 62  bu_file *p = (rb
24640 75 5f 66 69 6c 65 2a 29 70 46 69 6c 65 3b 0a 20  u_file*)pFile;. 
24650 20 73 71 6c 69 74 65 33 72 62 75 20 2a 70 52 62   sqlite3rbu *pRb
24660 75 20 3d 20 70 2d 3e 70 52 62 75 3b 0a 20 20 69  u = p->pRbu;.  i
24670 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
24680 4b 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  K;..#ifdef SQLIT
24690 45 5f 41 4d 41 4c 47 41 4d 41 54 49 4f 4e 0a 20  E_AMALGAMATION. 
246a0 20 20 20 61 73 73 65 72 74 28 20 57 41 4c 5f 43     assert( WAL_C
246b0 4b 50 54 5f 4c 4f 43 4b 3d 3d 31 20 29 3b 0a 23  KPT_LOCK==1 );.#
246c0 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
246d0 20 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20   p->openFlags & 
246e0 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  (SQLITE_OPEN_MAI
246f0 4e 5f 44 42 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  N_DB|SQLITE_OPEN
24700 5f 54 45 4d 50 5f 44 42 29 20 29 3b 0a 20 20 69  _TEMP_DB) );.  i
24710 66 28 20 70 52 62 75 20 26 26 20 28 70 52 62 75  f( pRbu && (pRbu
24720 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54  ->eStage==RBU_ST
24730 41 47 45 5f 4f 41 4c 20 7c 7c 20 70 52 62 75 2d  AGE_OAL || pRbu-
24740 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41  >eStage==RBU_STA
24750 47 45 5f 4d 4f 56 45 29 20 29 7b 0a 20 20 20 20  GE_MOVE) ){.    
24760 2f 2a 20 4d 61 67 69 63 20 6e 75 6d 62 65 72 20  /* Magic number 
24770 31 20 69 73 20 74 68 65 20 57 41 4c 5f 43 4b 50  1 is the WAL_CKP
24780 54 5f 4c 4f 43 4b 20 6c 6f 63 6b 2e 20 50 72 65  T_LOCK lock. Pre
24790 76 65 6e 74 69 6e 67 20 53 51 4c 69 74 65 20 66  venting SQLite f
247a0 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 61 6b 69 6e  rom.    ** takin
247b0 67 20 74 68 69 73 20 6c 6f 63 6b 20 61 6c 73 6f  g this lock also
247c0 20 70 72 65 76 65 6e 74 73 20 61 6e 79 20 63 68   prevents any ch
247d0 65 63 6b 70 6f 69 6e 74 73 20 66 72 6f 6d 20 6f  eckpoints from o
247e0 63 63 75 72 72 69 6e 67 2e 20 0a 20 20 20 20 2a  ccurring. .    *
247f0 2a 20 74 6f 64 6f 3a 20 72 65 61 6c 6c 79 2c 20  * todo: really, 
24800 69 74 27 73 20 6e 6f 74 20 63 6c 65 61 72 20 77  it's not clear w
24810 68 79 20 74 68 69 73 20 6d 69 67 68 74 20 6f 63  hy this might oc
24820 63 75 72 2c 20 61 73 20 0a 20 20 20 20 2a 2a 20  cur, as .    ** 
24830 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69  wal_autocheckpoi
24840 6e 74 20 6f 75 67 68 74 20 74 6f 20 62 65 20 74  nt ought to be t
24850 75 72 6e 65 64 20 6f 66 66 2e 20 20 2a 2f 0a 20  urned off.  */. 
24860 20 20 20 69 66 28 20 6f 66 73 74 3d 3d 57 41 4c     if( ofst==WAL
24870 5f 4c 4f 43 4b 5f 43 4b 50 54 20 26 26 20 6e 3d  _LOCK_CKPT && n=
24880 3d 31 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45  =1 ) rc = SQLITE
24890 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _BUSY;.  }else{.
248a0 20 20 20 20 69 6e 74 20 62 43 61 70 74 75 72 65      int bCapture
248b0 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6e 3d   = 0;.    if( n=
248c0 3d 31 20 26 26 20 28 66 6c 61 67 73 20 26 20 53  =1 && (flags & S
248d0 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53  QLITE_SHM_EXCLUS
248e0 49 56 45 29 0a 20 20 20 20 20 26 26 20 70 52 62  IVE).     && pRb
248f0 75 20 26 26 20 70 52 62 75 2d 3e 65 53 74 61 67  u && pRbu->eStag
24900 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 43 41 50  e==RBU_STAGE_CAP
24910 54 55 52 45 0a 20 20 20 20 20 26 26 20 28 6f 66  TURE.     && (of
24920 73 74 3d 3d 57 41 4c 5f 4c 4f 43 4b 5f 57 52 49  st==WAL_LOCK_WRI
24930 54 45 20 7c 7c 20 6f 66 73 74 3d 3d 57 41 4c 5f  TE || ofst==WAL_
24940 4c 4f 43 4b 5f 43 4b 50 54 20 7c 7c 20 6f 66 73  LOCK_CKPT || ofs
24950 74 3d 3d 57 41 4c 5f 4c 4f 43 4b 5f 52 45 41 44  t==WAL_LOCK_READ
24960 30 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  0).    ){.      
24970 62 43 61 70 74 75 72 65 20 3d 20 31 3b 0a 20 20  bCapture = 1;.  
24980 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 62 43 61    }..    if( bCa
24990 70 74 75 72 65 3d 3d 30 20 7c 7c 20 30 3d 3d 28  pture==0 || 0==(
249a0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53  flags & SQLITE_S
249b0 48 4d 5f 55 4e 4c 4f 43 4b 29 20 29 7b 0a 20 20  HM_UNLOCK) ){.  
249c0 20 20 20 20 72 63 20 3d 20 70 2d 3e 70 52 65 61      rc = p->pRea
249d0 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53 68  l->pMethods->xSh
249e0 6d 4c 6f 63 6b 28 70 2d 3e 70 52 65 61 6c 2c 20  mLock(p->pReal, 
249f0 6f 66 73 74 2c 20 6e 2c 20 66 6c 61 67 73 29 3b  ofst, n, flags);
24a00 0a 20 20 20 20 20 20 69 66 28 20 62 43 61 70 74  .      if( bCapt
24a10 75 72 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  ure && rc==SQLIT
24a20 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
24a30 70 52 62 75 2d 3e 6d 4c 6f 63 6b 20 7c 3d 20 28  pRbu->mLock |= (
24a40 31 20 3c 3c 20 6f 66 73 74 29 3b 0a 20 20 20 20  1 << ofst);.    
24a50 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
24a60 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
24a70 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 61 20 70 6f  *.** Obtain a po
24a80 69 6e 74 65 72 20 74 6f 20 61 20 6d 61 70 70 69  inter to a mappi
24a90 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 33  ng of a single 3
24aa0 32 4b 69 42 20 70 61 67 65 20 6f 66 20 74 68 65  2KiB page of the
24ab0 20 2a 2d 73 68 6d 20 66 69 6c 65 2e 0a 2a 2f 0a   *-shm file..*/.
24ac0 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 56 66  static int rbuVf
24ad0 73 53 68 6d 4d 61 70 28 0a 20 20 73 71 6c 69 74  sShmMap(.  sqlit
24ae0 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20  e3_file *pFile, 
24af0 0a 20 20 69 6e 74 20 69 52 65 67 69 6f 6e 2c 20  .  int iRegion, 
24b00 0a 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e 2c  .  int szRegion,
24b10 20 0a 20 20 69 6e 74 20 69 73 57 72 69 74 65 2c   .  int isWrite,
24b20 20 0a 20 20 76 6f 69 64 20 76 6f 6c 61 74 69 6c   .  void volatil
24b30 65 20 2a 2a 70 70 0a 29 7b 0a 20 20 72 62 75 5f  e **pp.){.  rbu_
24b40 66 69 6c 65 20 2a 70 20 3d 20 28 72 62 75 5f 66  file *p = (rbu_f
24b50 69 6c 65 2a 29 70 46 69 6c 65 3b 0a 20 20 69 6e  ile*)pFile;.  in
24b60 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
24b70 3b 0a 20 20 69 6e 74 20 65 53 74 61 67 65 20 3d  ;.  int eStage =
24b80 20 28 70 2d 3e 70 52 62 75 20 3f 20 70 2d 3e 70   (p->pRbu ? p->p
24b90 52 62 75 2d 3e 65 53 74 61 67 65 20 3a 20 30 29  Rbu->eStage : 0)
24ba0 3b 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 20 69  ;..  /* If not i
24bb0 6e 20 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 2c  n RBU_STAGE_OAL,
24bc0 20 61 6c 6c 6f 77 20 74 68 69 73 20 63 61 6c 6c   allow this call
24bd0 20 74 6f 20 70 61 73 73 20 74 68 72 6f 75 67 68   to pass through
24be0 2e 20 4f 72 2c 20 69 66 20 74 68 69 73 0a 20 20  . Or, if this.  
24bf0 2a 2a 20 72 62 75 20 69 73 20 69 6e 20 74 68 65  ** rbu is in the
24c00 20 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20 73   RBU_STAGE_OAL s
24c10 74 61 74 65 2c 20 75 73 65 20 68 65 61 70 20 6d  tate, use heap m
24c20 65 6d 6f 72 79 20 66 6f 72 20 2a 2d 73 68 6d 20  emory for *-shm 
24c30 73 70 61 63 65 20 0a 20 20 2a 2a 20 69 6e 73 74  space .  ** inst
24c40 65 61 64 20 6f 66 20 61 20 66 69 6c 65 20 6f 6e  ead of a file on
24c50 20 64 69 73 6b 2e 20 20 2a 2f 0a 20 20 61 73 73   disk.  */.  ass
24c60 65 72 74 28 20 70 2d 3e 6f 70 65 6e 46 6c 61 67  ert( p->openFlag
24c70 73 20 26 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e  s & (SQLITE_OPEN
24c80 5f 4d 41 49 4e 5f 44 42 7c 53 51 4c 49 54 45 5f  _MAIN_DB|SQLITE_
24c90 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 29 20 29 3b  OPEN_TEMP_DB) );
24ca0 0a 20 20 69 66 28 20 65 53 74 61 67 65 3d 3d 52  .  if( eStage==R
24cb0 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20 7c 7c 20  BU_STAGE_OAL || 
24cc0 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47  eStage==RBU_STAG
24cd0 45 5f 4d 4f 56 45 20 29 7b 0a 20 20 20 20 69 66  E_MOVE ){.    if
24ce0 28 20 69 52 65 67 69 6f 6e 3c 3d 70 2d 3e 6e 53  ( iRegion<=p->nS
24cf0 68 6d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  hm ){.      sqli
24d00 74 65 33 5f 69 6e 74 36 34 20 6e 42 79 74 65 20  te3_int64 nByte 
24d10 3d 20 28 69 52 65 67 69 6f 6e 2b 31 29 20 2a 20  = (iRegion+1) * 
24d20 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 3b 0a 20  sizeof(char*);. 
24d30 20 20 20 20 20 63 68 61 72 20 2a 2a 61 70 4e 65       char **apNe
24d40 77 20 3d 20 28 63 68 61 72 2a 2a 29 73 71 6c 69  w = (char**)sqli
24d50 74 65 33 5f 72 65 61 6c 6c 6f 63 36 34 28 70 2d  te3_realloc64(p-
24d60 3e 61 70 53 68 6d 2c 20 6e 42 79 74 65 29 3b 0a  >apShm, nByte);.
24d70 20 20 20 20 20 20 69 66 28 20 61 70 4e 65 77 3d        if( apNew=
24d80 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
24d90 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
24da0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
24db0 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 61 70        memset(&ap
24dc0 4e 65 77 5b 70 2d 3e 6e 53 68 6d 5d 2c 20 30 2c  New[p->nShm], 0,
24dd0 20 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 20 2a   sizeof(char*) *
24de0 20 28 31 20 2b 20 69 52 65 67 69 6f 6e 20 2d 20   (1 + iRegion - 
24df0 70 2d 3e 6e 53 68 6d 29 29 3b 0a 20 20 20 20 20  p->nShm));.     
24e00 20 20 20 70 2d 3e 61 70 53 68 6d 20 3d 20 61 70     p->apShm = ap
24e10 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  New;.        p->
24e20 6e 53 68 6d 20 3d 20 69 52 65 67 69 6f 6e 2b 31  nShm = iRegion+1
24e30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
24e40 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
24e50 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 61 70 53  ITE_OK && p->apS
24e60 68 6d 5b 69 52 65 67 69 6f 6e 5d 3d 3d 30 20 29  hm[iRegion]==0 )
24e70 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70 4e  {.      char *pN
24e80 65 77 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69  ew = (char*)sqli
24e90 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 73 7a 52  te3_malloc64(szR
24ea0 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 69 66  egion);.      if
24eb0 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( pNew==0 ){.   
24ec0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
24ed0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65  _NOMEM;.      }e
24ee0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  lse{.        mem
24ef0 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 7a 52  set(pNew, 0, szR
24f00 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20 20  egion);.        
24f10 70 2d 3e 61 70 53 68 6d 5b 69 52 65 67 69 6f 6e  p->apShm[iRegion
24f20 5d 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20  ] = pNew;.      
24f30 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  }.    }..    if(
24f40 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
24f50 7b 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 70 2d  {.      *pp = p-
24f60 3e 61 70 53 68 6d 5b 69 52 65 67 69 6f 6e 5d 3b  >apShm[iRegion];
24f70 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
24f80 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20 20 20 7d    *pp = 0;.    }
24f90 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
24fa0 73 65 72 74 28 20 70 2d 3e 61 70 53 68 6d 3d 3d  sert( p->apShm==
24fb0 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 2d  0 );.    rc = p-
24fc0 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73  >pReal->pMethods
24fd0 2d 3e 78 53 68 6d 4d 61 70 28 70 2d 3e 70 52 65  ->xShmMap(p->pRe
24fe0 61 6c 2c 20 69 52 65 67 69 6f 6e 2c 20 73 7a 52  al, iRegion, szR
24ff0 65 67 69 6f 6e 2c 20 69 73 57 72 69 74 65 2c 20  egion, isWrite, 
25000 70 70 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  pp);.  }..  retu
25010 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
25020 4d 65 6d 6f 72 79 20 62 61 72 72 69 65 72 2e 0a  Memory barrier..
25030 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
25040 62 75 56 66 73 53 68 6d 42 61 72 72 69 65 72 28  buVfsShmBarrier(
25050 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
25060 69 6c 65 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65  ile){.  rbu_file
25070 20 2a 70 20 3d 20 28 72 62 75 5f 66 69 6c 65 20   *p = (rbu_file 
25080 2a 29 70 46 69 6c 65 3b 0a 20 20 70 2d 3e 70 52  *)pFile;.  p->pR
25090 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78  eal->pMethods->x
250a0 53 68 6d 42 61 72 72 69 65 72 28 70 2d 3e 70 52  ShmBarrier(p->pR
250b0 65 61 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  eal);.}../*.** T
250c0 68 65 20 78 53 68 6d 55 6e 6d 61 70 20 6d 65 74  he xShmUnmap met
250d0 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  hod..*/.static i
250e0 6e 74 20 72 62 75 56 66 73 53 68 6d 55 6e 6d 61  nt rbuVfsShmUnma
250f0 70 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  p(sqlite3_file *
25100 70 46 69 6c 65 2c 20 69 6e 74 20 64 65 6c 46 6c  pFile, int delFl
25110 61 67 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20  ag){.  rbu_file 
25120 2a 70 20 3d 20 28 72 62 75 5f 66 69 6c 65 2a 29  *p = (rbu_file*)
25130 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20 72 63 20  pFile;.  int rc 
25140 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
25150 6e 74 20 65 53 74 61 67 65 20 3d 20 28 70 2d 3e  nt eStage = (p->
25160 70 52 62 75 20 3f 20 70 2d 3e 70 52 62 75 2d 3e  pRbu ? p->pRbu->
25170 65 53 74 61 67 65 20 3a 20 30 29 3b 0a 0a 20 20  eStage : 0);..  
25180 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 65 6e 46  assert( p->openF
25190 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f 4f  lags & (SQLITE_O
251a0 50 45 4e 5f 4d 41 49 4e 5f 44 42 7c 53 51 4c 49  PEN_MAIN_DB|SQLI
251b0 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 29  TE_OPEN_TEMP_DB)
251c0 20 29 3b 0a 20 20 69 66 28 20 65 53 74 61 67 65   );.  if( eStage
251d0 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20  ==RBU_STAGE_OAL 
251e0 7c 7c 20 65 53 74 61 67 65 3d 3d 52 42 55 5f 53  || eStage==RBU_S
251f0 54 41 47 45 5f 4d 4f 56 45 20 29 7b 0a 20 20 20  TAGE_MOVE ){.   
25200 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 7d   /* no-op */.  }
25210 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 52 65 6c  else{.    /* Rel
25220 65 61 73 65 20 74 68 65 20 63 68 65 63 6b 70 6f  ease the checkpo
25230 69 6e 74 65 72 20 61 6e 64 20 77 72 69 74 65 72  inter and writer
25240 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 72 62   locks */.    rb
25250 75 55 6e 6c 6f 63 6b 53 68 6d 28 70 29 3b 0a 20  uUnlockShm(p);. 
25260 20 20 20 72 63 20 3d 20 70 2d 3e 70 52 65 61 6c     rc = p->pReal
25270 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53 68 6d  ->pMethods->xShm
25280 55 6e 6d 61 70 28 70 2d 3e 70 52 65 61 6c 2c 20  Unmap(p->pReal, 
25290 64 65 6c 46 6c 61 67 29 3b 0a 20 20 7d 0a 20 20  delFlag);.  }.  
252a0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
252b0 20 0a 2a 2a 20 41 20 6d 61 69 6e 20 64 61 74 61   .** A main data
252c0 62 61 73 65 20 6e 61 6d 65 64 20 7a 4e 61 6d 65  base named zName
252d0 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 6f   has just been o
252e0 70 65 6e 65 64 2e 20 54 68 65 20 66 6f 6c 6c 6f  pened. The follo
252f0 77 69 6e 67 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  wing .** functio
25300 6e 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e  n returns a poin
25310 74 65 72 20 74 6f 20 61 20 62 75 66 66 65 72 20  ter to a buffer 
25320 6f 77 6e 65 64 20 62 79 20 53 51 4c 69 74 65 20  owned by SQLite 
25330 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  that contains.**
25340 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
25350 20 2a 2d 77 61 6c 20 66 69 6c 65 20 74 68 69 73   *-wal file this
25360 20 64 62 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77   db connection w
25370 69 6c 6c 20 75 73 65 2e 20 53 51 4c 69 74 65 0a  ill use. SQLite.
25380 2a 2a 20 68 61 70 70 65 6e 73 20 74 6f 20 70 61  ** happens to pa
25390 73 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ss a pointer to 
253a0 74 68 69 73 20 62 75 66 66 65 72 20 77 68 65 6e  this buffer when
253b0 20 75 73 69 6e 67 20 78 41 63 63 65 73 73 28 29   using xAccess()
253c0 0a 2a 2a 20 6f 72 20 78 4f 70 65 6e 28 29 20 74  .** or xOpen() t
253d0 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65  o operate on the
253e0 20 2a 2d 77 61 6c 20 66 69 6c 65 2e 20 20 0a 2a   *-wal file.  .*
253f0 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  /.static const c
25400 68 61 72 20 2a 72 62 75 4d 61 69 6e 54 6f 57 61  har *rbuMainToWa
25410 6c 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  l(const char *zN
25420 61 6d 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  ame, int flags){
25430 0a 20 20 69 6e 74 20 6e 20 3d 20 28 69 6e 74 29  .  int n = (int)
25440 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20  strlen(zName);. 
25450 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
25460 20 26 7a 4e 61 6d 65 5b 6e 5d 3b 0a 20 20 69 66   &zName[n];.  if
25470 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ( flags & SQLITE
25480 5f 4f 50 45 4e 5f 55 52 49 20 29 7b 0a 20 20 20  _OPEN_URI ){.   
25490 20 69 6e 74 20 6f 64 64 20 3d 20 30 3b 0a 20 20   int odd = 0;.  
254a0 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20    while( 1 ){.  
254b0 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 30 20      if( z[0]==0 
254c0 29 7b 0a 20 20 20 20 20 20 20 20 6f 64 64 20 3d  ){.        odd =
254d0 20 31 20 2d 20 6f 64 64 3b 0a 20 20 20 20 20 20   1 - odd;.      
254e0 20 20 69 66 28 20 6f 64 64 20 26 26 20 7a 5b 31    if( odd && z[1
254f0 5d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  ]==0 ) break;.  
25500 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 2b 2b 3b      }.      z++;
25510 0a 20 20 20 20 7d 0a 20 20 20 20 7a 20 2b 3d 20  .    }.    z += 
25520 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  2;.  }else{.    
25530 77 68 69 6c 65 28 20 2a 7a 3d 3d 30 20 29 20 7a  while( *z==0 ) z
25540 2b 2b 3b 0a 20 20 7d 0a 20 20 7a 20 2b 3d 20 28  ++;.  }.  z += (
25550 6e 20 2b 20 38 20 2b 20 31 29 3b 0a 20 20 72 65  n + 8 + 1);.  re
25560 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn z;.}../*.**
25570 20 4f 70 65 6e 20 61 6e 20 72 62 75 20 66 69 6c   Open an rbu fil
25580 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61  e handle..*/.sta
25590 74 69 63 20 69 6e 74 20 72 62 75 56 66 73 4f 70  tic int rbuVfsOp
255a0 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  en(.  sqlite3_vf
255b0 73 20 2a 70 56 66 73 2c 0a 20 20 63 6f 6e 73 74  s *pVfs,.  const
255c0 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20   char *zName,.  
255d0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
255e0 69 6c 65 2c 0a 20 20 69 6e 74 20 66 6c 61 67 73  ile,.  int flags
255f0 2c 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46 6c 61  ,.  int *pOutFla
25600 67 73 0a 29 7b 0a 20 20 73 74 61 74 69 63 20 73  gs.){.  static s
25610 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
25620 73 20 72 62 75 76 66 73 5f 69 6f 5f 6d 65 74 68  s rbuvfs_io_meth
25630 6f 64 73 20 3d 20 7b 0a 20 20 20 20 32 2c 20 20  ods = {.    2,  
25640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25650 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65            /* iVe
25660 72 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 72 62 75  rsion */.    rbu
25670 56 66 73 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  VfsClose,       
25680 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
25690 6c 6f 73 65 20 2a 2f 0a 20 20 20 20 72 62 75 56  lose */.    rbuV
256a0 66 73 52 65 61 64 2c 20 20 20 20 20 20 20 20 20  fsRead,         
256b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65            /* xRe
256c0 61 64 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73  ad */.    rbuVfs
256d0 57 72 69 74 65 2c 20 20 20 20 20 20 20 20 20 20  Write,          
256e0 20 20 20 20 20 20 20 20 2f 2a 20 78 57 72 69 74          /* xWrit
256f0 65 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 54  e */.    rbuVfsT
25700 72 75 6e 63 61 74 65 2c 20 20 20 20 20 20 20 20  runcate,        
25710 20 20 20 20 20 20 20 2f 2a 20 78 54 72 75 6e 63         /* xTrunc
25720 61 74 65 20 2a 2f 0a 20 20 20 20 72 62 75 56 66  ate */.    rbuVf
25730 73 53 79 6e 63 2c 20 20 20 20 20 20 20 20 20 20  sSync,          
25740 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 79 6e           /* xSyn
25750 63 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 46  c */.    rbuVfsF
25760 69 6c 65 53 69 7a 65 2c 20 20 20 20 20 20 20 20  ileSize,        
25770 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 53         /* xFileS
25780 69 7a 65 20 2a 2f 0a 20 20 20 20 72 62 75 56 66  ize */.    rbuVf
25790 73 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  sLock,          
257a0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63           /* xLoc
257b0 6b 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 55  k */.    rbuVfsU
257c0 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  nlock,          
257d0 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
257e0 6b 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 43  k */.    rbuVfsC
257f0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
25800 2c 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b  ,      /* xCheck
25810 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 2a 2f 0a  ReservedLock */.
25820 20 20 20 20 72 62 75 56 66 73 46 69 6c 65 43 6f      rbuVfsFileCo
25830 6e 74 72 6f 6c 2c 20 20 20 20 20 20 20 20 20 20  ntrol,          
25840 20 20 2f 2a 20 78 46 69 6c 65 43 6f 6e 74 72 6f    /* xFileContro
25850 6c 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 53  l */.    rbuVfsS
25860 65 63 74 6f 72 53 69 7a 65 2c 20 20 20 20 20 20  ectorSize,      
25870 20 20 20 20 20 20 20 2f 2a 20 78 53 65 63 74 6f         /* xSecto
25880 72 53 69 7a 65 20 2a 2f 0a 20 20 20 20 72 62 75  rSize */.    rbu
25890 56 66 73 44 65 76 69 63 65 43 68 61 72 61 63 74  VfsDeviceCharact
258a0 65 72 69 73 74 69 63 73 2c 20 20 2f 2a 20 78 44  eristics,  /* xD
258b0 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
258c0 74 69 63 73 20 2a 2f 0a 20 20 20 20 72 62 75 56  tics */.    rbuV
258d0 66 73 53 68 6d 4d 61 70 2c 20 20 20 20 20 20 20  fsShmMap,       
258e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
258f0 6d 4d 61 70 20 2a 2f 0a 20 20 20 20 72 62 75 56  mMap */.    rbuV
25900 66 73 53 68 6d 4c 6f 63 6b 2c 20 20 20 20 20 20  fsShmLock,      
25910 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
25920 6d 4c 6f 63 6b 20 2a 2f 0a 20 20 20 20 72 62 75  mLock */.    rbu
25930 56 66 73 53 68 6d 42 61 72 72 69 65 72 2c 20 20  VfsShmBarrier,  
25940 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
25950 68 6d 42 61 72 72 69 65 72 20 2a 2f 0a 20 20 20  hmBarrier */.   
25960 20 72 62 75 56 66 73 53 68 6d 55 6e 6d 61 70 2c   rbuVfsShmUnmap,
25970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25980 2a 20 78 53 68 6d 55 6e 6d 61 70 20 2a 2f 0a 20  * xShmUnmap */. 
25990 20 20 20 30 2c 20 30 20 20 20 20 20 20 20 20 20     0, 0         
259a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
259b0 20 2f 2a 20 78 46 65 74 63 68 2c 20 78 55 6e 66   /* xFetch, xUnf
259c0 65 74 63 68 20 2a 2f 0a 20 20 7d 3b 0a 20 20 72  etch */.  };.  r
259d0 62 75 5f 76 66 73 20 2a 70 52 62 75 56 66 73 20  bu_vfs *pRbuVfs 
259e0 3d 20 28 72 62 75 5f 76 66 73 2a 29 70 56 66 73  = (rbu_vfs*)pVfs
259f0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  ;.  sqlite3_vfs 
25a00 2a 70 52 65 61 6c 56 66 73 20 3d 20 70 52 62 75  *pRealVfs = pRbu
25a10 56 66 73 2d 3e 70 52 65 61 6c 56 66 73 3b 0a 20  Vfs->pRealVfs;. 
25a20 20 72 62 75 5f 66 69 6c 65 20 2a 70 46 64 20 3d   rbu_file *pFd =
25a30 20 28 72 62 75 5f 66 69 6c 65 20 2a 29 70 46 69   (rbu_file *)pFi
25a40 6c 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  le;.  int rc = S
25a50 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63 6f 6e 73  QLITE_OK;.  cons
25a60 74 20 63 68 61 72 20 2a 7a 4f 70 65 6e 20 3d 20  t char *zOpen = 
25a70 7a 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 6f 66 6c  zName;.  int ofl
25a80 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 0a 20 20  ags = flags;..  
25a90 6d 65 6d 73 65 74 28 70 46 64 2c 20 30 2c 20 73  memset(pFd, 0, s
25aa0 69 7a 65 6f 66 28 72 62 75 5f 66 69 6c 65 29 29  izeof(rbu_file))
25ab0 3b 0a 20 20 70 46 64 2d 3e 70 52 65 61 6c 20 3d  ;.  pFd->pReal =
25ac0 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29   (sqlite3_file*)
25ad0 26 70 46 64 5b 31 5d 3b 0a 20 20 70 46 64 2d 3e  &pFd[1];.  pFd->
25ae0 70 52 62 75 56 66 73 20 3d 20 70 52 62 75 56 66  pRbuVfs = pRbuVf
25af0 73 3b 0a 20 20 70 46 64 2d 3e 6f 70 65 6e 46 6c  s;.  pFd->openFl
25b00 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 69  ags = flags;.  i
25b10 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  f( zName ){.    
25b20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49  if( flags & SQLI
25b30 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20  TE_OPEN_MAIN_DB 
25b40 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 6d 61  ){.      /* A ma
25b50 69 6e 20 64 61 74 61 62 61 73 65 20 68 61 73 20  in database has 
25b60 6a 75 73 74 20 62 65 65 6e 20 6f 70 65 6e 65 64  just been opened
25b70 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  . The following 
25b80 62 6c 6f 63 6b 20 73 65 74 73 0a 20 20 20 20 20  block sets.     
25b90 20 2a 2a 20 28 70 46 64 2d 3e 7a 57 61 6c 29 20   ** (pFd->zWal) 
25ba0 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75  to point to a bu
25bb0 66 66 65 72 20 6f 77 6e 65 64 20 62 79 20 53 51  ffer owned by SQ
25bc0 4c 69 74 65 20 74 68 61 74 20 63 6f 6e 74 61 69  Lite that contai
25bd0 6e 73 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  ns.      ** the 
25be0 6e 61 6d 65 20 6f 66 20 74 68 65 20 2a 2d 77 61  name of the *-wa
25bf0 6c 20 66 69 6c 65 20 74 68 69 73 20 64 62 20 63  l file this db c
25c00 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 6c 6c 20 75  onnection will u
25c10 73 65 2e 20 53 51 4c 69 74 65 0a 20 20 20 20 20  se. SQLite.     
25c20 20 2a 2a 20 68 61 70 70 65 6e 73 20 74 6f 20 70   ** happens to p
25c30 61 73 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ass a pointer to
25c40 20 74 68 69 73 20 62 75 66 66 65 72 20 77 68 65   this buffer whe
25c50 6e 20 75 73 69 6e 67 20 78 41 63 63 65 73 73 28  n using xAccess(
25c60 29 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 78 4f  ).      ** or xO
25c70 70 65 6e 28 29 20 74 6f 20 6f 70 65 72 61 74 65  pen() to operate
25c80 20 6f 6e 20 74 68 65 20 2a 2d 77 61 6c 20 66 69   on the *-wal fi
25c90 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 70 46  le.  */.      pF
25ca0 64 2d 3e 7a 57 61 6c 20 3d 20 72 62 75 4d 61 69  d->zWal = rbuMai
25cb0 6e 54 6f 57 61 6c 28 7a 4e 61 6d 65 2c 20 66 6c  nToWal(zName, fl
25cc0 61 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ags);.    }.    
25cd0 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26  else if( flags &
25ce0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c   SQLITE_OPEN_WAL
25cf0 20 29 7b 0a 20 20 20 20 20 20 72 62 75 5f 66 69   ){.      rbu_fi
25d00 6c 65 20 2a 70 44 62 20 3d 20 72 62 75 46 69 6e  le *pDb = rbuFin
25d10 64 4d 61 69 6e 64 62 28 70 52 62 75 56 66 73 2c  dMaindb(pRbuVfs,
25d20 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20   zName, 0);.    
25d30 20 20 69 66 28 20 70 44 62 20 29 7b 0a 20 20 20    if( pDb ){.   
25d40 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 52       if( pDb->pR
25d50 62 75 20 26 26 20 70 44 62 2d 3e 70 52 62 75 2d  bu && pDb->pRbu-
25d60 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41  >eStage==RBU_STA
25d70 47 45 5f 4f 41 4c 20 29 7b 0a 20 20 20 20 20 20  GE_OAL ){.      
25d80 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c      /* This call
25d90 20 69 73 20 74 6f 20 6f 70 65 6e 20 61 20 2a 2d   is to open a *-
25da0 77 61 6c 20 66 69 6c 65 2e 20 49 6e 74 65 61 64  wal file. Intead
25db0 2c 20 6f 70 65 6e 20 74 68 65 20 2a 2d 6f 61 6c  , open the *-oal
25dc0 2e 20 54 68 69 73 0a 20 20 20 20 20 20 20 20 20  . This.         
25dd0 20 2a 2a 20 63 6f 64 65 20 65 6e 73 75 72 65 73   ** code ensures
25de0 20 74 68 61 74 20 74 68 65 20 73 74 72 69 6e 67   that the string
25df0 20 70 61 73 73 65 64 20 74 6f 20 78 4f 70 65 6e   passed to xOpen
25e00 28 29 20 69 73 20 74 65 72 6d 69 6e 61 74 65 64  () is terminated
25e10 20 62 79 20 61 0a 20 20 20 20 20 20 20 20 20 20   by a.          
25e20 2a 2a 20 70 61 69 72 20 6f 66 20 27 5c 30 27 20  ** pair of '\0' 
25e30 62 79 74 65 73 20 69 6e 20 63 61 73 65 20 74 68  bytes in case th
25e40 65 20 56 46 53 20 61 74 74 65 6d 70 74 73 20 74  e VFS attempts t
25e50 6f 20 65 78 74 72 61 63 74 20 61 20 55 52 49 20  o extract a URI 
25e60 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61  .          ** pa
25e70 72 61 6d 65 74 65 72 20 66 72 6f 6d 20 69 74 2e  rameter from it.
25e80 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 63    */.          c
25e90 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 61 73 65  onst char *zBase
25ea0 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20   = zName;.      
25eb0 20 20 20 20 73 69 7a 65 5f 74 20 6e 43 6f 70 79      size_t nCopy
25ec0 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72  ;.          char
25ed0 20 2a 7a 43 6f 70 79 3b 0a 20 20 20 20 20 20 20   *zCopy;.       
25ee0 20 20 20 69 66 28 20 72 62 75 49 73 56 61 63 75     if( rbuIsVacu
25ef0 75 6d 28 70 44 62 2d 3e 70 52 62 75 29 20 29 7b  um(pDb->pRbu) ){
25f00 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 42 61  .            zBa
25f10 73 65 20 3d 20 73 71 6c 69 74 65 33 5f 64 62 5f  se = sqlite3_db_
25f20 66 69 6c 65 6e 61 6d 65 28 70 44 62 2d 3e 70 52  filename(pDb->pR
25f30 62 75 2d 3e 64 62 52 62 75 2c 20 22 6d 61 69 6e  bu->dbRbu, "main
25f40 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ");.            
25f50 7a 42 61 73 65 20 3d 20 72 62 75 4d 61 69 6e 54  zBase = rbuMainT
25f60 6f 57 61 6c 28 7a 42 61 73 65 2c 20 53 51 4c 49  oWal(zBase, SQLI
25f70 54 45 5f 4f 50 45 4e 5f 55 52 49 29 3b 0a 20 20  TE_OPEN_URI);.  
25f80 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
25f90 20 20 20 20 6e 43 6f 70 79 20 3d 20 73 74 72 6c      nCopy = strl
25fa0 65 6e 28 7a 42 61 73 65 29 3b 0a 20 20 20 20 20  en(zBase);.     
25fb0 20 20 20 20 20 7a 43 6f 70 79 20 3d 20 73 71 6c       zCopy = sql
25fc0 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 43  ite3_malloc64(nC
25fd0 6f 70 79 2b 32 29 3b 0a 20 20 20 20 20 20 20 20  opy+2);.        
25fe0 20 20 69 66 28 20 7a 43 6f 70 79 20 29 7b 0a 20    if( zCopy ){. 
25ff0 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
26000 79 28 7a 43 6f 70 79 2c 20 7a 42 61 73 65 2c 20  y(zCopy, zBase, 
26010 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 20 20  nCopy);.        
26020 20 20 20 20 7a 43 6f 70 79 5b 6e 43 6f 70 79 2d      zCopy[nCopy-
26030 33 5d 20 3d 20 27 6f 27 3b 0a 20 20 20 20 20 20  3] = 'o';.      
26040 20 20 20 20 20 20 7a 43 6f 70 79 5b 6e 43 6f 70        zCopy[nCop
26050 79 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20  y] = '\0';.     
26060 20 20 20 20 20 20 20 7a 43 6f 70 79 5b 6e 43 6f         zCopy[nCo
26070 70 79 2b 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  py+1] = '\0';.  
26080 20 20 20 20 20 20 20 20 20 20 7a 4f 70 65 6e 20            zOpen 
26090 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 28  = (const char*)(
260a0 70 46 64 2d 3e 7a 44 65 6c 20 3d 20 7a 43 6f 70  pFd->zDel = zCop
260b0 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  y);.          }e
260c0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
260d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
260e0 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  EM;.          }.
260f0 20 20 20 20 20 20 20 20 20 20 70 46 64 2d 3e 70            pFd->p
26100 52 62 75 20 3d 20 70 44 62 2d 3e 70 52 62 75 3b  Rbu = pDb->pRbu;
26110 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
26120 20 20 20 70 44 62 2d 3e 70 57 61 6c 46 64 20 3d     pDb->pWalFd =
26130 20 70 46 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20   pFd;.      }.  
26140 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
26150 20 70 46 64 2d 3e 70 52 62 75 20 3d 20 70 52 62   pFd->pRbu = pRb
26160 75 56 66 73 2d 3e 70 52 62 75 3b 0a 20 20 7d 0a  uVfs->pRbu;.  }.
26170 0a 20 20 69 66 28 20 6f 66 6c 61 67 73 20 26 20  .  if( oflags & 
26180 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
26190 5f 44 42 20 0a 20 20 20 26 26 20 73 71 6c 69 74  _DB .   && sqlit
261a0 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 7a  e3_uri_boolean(z
261b0 4e 61 6d 65 2c 20 22 72 62 75 5f 6d 65 6d 6f 72  Name, "rbu_memor
261c0 79 22 2c 20 30 29 20 0a 20 20 29 7b 0a 20 20 20  y", 0) .  ){.   
261d0 20 61 73 73 65 72 74 28 20 6f 66 6c 61 67 73 20   assert( oflags 
261e0 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  & SQLITE_OPEN_MA
261f0 49 4e 5f 44 42 20 29 3b 0a 20 20 20 20 6f 66 6c  IN_DB );.    ofl
26200 61 67 73 20 3d 20 20 53 51 4c 49 54 45 5f 4f 50  ags =  SQLITE_OP
26210 45 4e 5f 54 45 4d 50 5f 44 42 20 7c 20 53 51 4c  EN_TEMP_DB | SQL
26220 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
26230 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  TE | SQLITE_OPEN
26240 5f 43 52 45 41 54 45 20 7c 0a 20 20 20 20 20 20  _CREATE |.      
26250 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
26260 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 20  PEN_EXCLUSIVE | 
26270 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
26280 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 20 20 7a  TEONCLOSE;.    z
26290 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  Open = 0;.  }.. 
262a0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
262b0 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  OK ){.    rc = p
262c0 52 65 61 6c 56 66 73 2d 3e 78 4f 70 65 6e 28 70  RealVfs->xOpen(p
262d0 52 65 61 6c 56 66 73 2c 20 7a 4f 70 65 6e 2c 20  RealVfs, zOpen, 
262e0 70 46 64 2d 3e 70 52 65 61 6c 2c 20 6f 66 6c 61  pFd->pReal, ofla
262f0 67 73 2c 20 70 4f 75 74 46 6c 61 67 73 29 3b 0a  gs, pOutFlags);.
26300 20 20 7d 0a 20 20 69 66 28 20 70 46 64 2d 3e 70    }.  if( pFd->p
26310 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 20 29  Real->pMethods )
26320 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 78 4f 70  {.    /* The xOp
26330 65 6e 28 29 20 6f 70 65 72 61 74 69 6f 6e 20 68  en() operation h
26340 61 73 20 73 75 63 63 65 65 64 65 64 2e 20 53 65  as succeeded. Se
26350 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69  t the sqlite3_fi
26360 6c 65 2e 70 4d 65 74 68 6f 64 73 0a 20 20 20 20  le.pMethods.    
26370 2a 2a 20 70 6f 69 6e 74 65 72 20 61 6e 64 2c 20  ** pointer and, 
26380 69 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 61  if the file is a
26390 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66   main database f
263a0 69 6c 65 2c 20 6c 69 6e 6b 20 69 74 20 69 6e 74  ile, link it int
263b0 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 6d 75 74  o the.    ** mut
263c0 65 78 20 70 72 6f 74 65 63 74 65 64 20 6c 69 6e  ex protected lin
263d0 6b 65 64 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  ked list of all 
263e0 73 75 63 68 20 66 69 6c 65 73 2e 20 20 2a 2f 0a  such files.  */.
263f0 20 20 20 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68      pFile->pMeth
26400 6f 64 73 20 3d 20 26 72 62 75 76 66 73 5f 69 6f  ods = &rbuvfs_io
26410 5f 6d 65 74 68 6f 64 73 3b 0a 20 20 20 20 69 66  _methods;.    if
26420 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ( flags & SQLITE
26430 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 7b  _OPEN_MAIN_DB ){
26440 0a 20 20 20 20 20 20 72 62 75 4d 61 69 6e 6c 69  .      rbuMainli
26450 73 74 41 64 64 28 70 46 64 29 3b 0a 20 20 20 20  stAdd(pFd);.    
26460 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  }.  }else{.    s
26470 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46 64 2d  qlite3_free(pFd-
26480 3e 7a 44 65 6c 29 3b 0a 20 20 7d 0a 0a 20 20 72  >zDel);.  }..  r
26490 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
264a0 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 66 69  ** Delete the fi
264b0 6c 65 20 6c 6f 63 61 74 65 64 20 61 74 20 7a 50  le located at zP
264c0 61 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ath..*/.static i
264d0 6e 74 20 72 62 75 56 66 73 44 65 6c 65 74 65 28  nt rbuVfsDelete(
264e0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
264f0 73 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  s, const char *z
26500 50 61 74 68 2c 20 69 6e 74 20 64 69 72 53 79 6e  Path, int dirSyn
26510 63 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  c){.  sqlite3_vf
26520 73 20 2a 70 52 65 61 6c 56 66 73 20 3d 20 28 28  s *pRealVfs = ((
26530 72 62 75 5f 76 66 73 2a 29 70 56 66 73 29 2d 3e  rbu_vfs*)pVfs)->
26540 70 52 65 61 6c 56 66 73 3b 0a 20 20 72 65 74 75  pRealVfs;.  retu
26550 72 6e 20 70 52 65 61 6c 56 66 73 2d 3e 78 44 65  rn pRealVfs->xDe
26560 6c 65 74 65 28 70 52 65 61 6c 56 66 73 2c 20 7a  lete(pRealVfs, z
26570 50 61 74 68 2c 20 64 69 72 53 79 6e 63 29 3b 0a  Path, dirSync);.
26580 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 66 6f  }../*.** Test fo
26590 72 20 61 63 63 65 73 73 20 70 65 72 6d 69 73 73  r access permiss
265a0 69 6f 6e 73 2e 20 52 65 74 75 72 6e 20 74 72 75  ions. Return tru
265b0 65 20 69 66 20 74 68 65 20 72 65 71 75 65 73 74  e if the request
265c0 65 64 20 70 65 72 6d 69 73 73 69 6f 6e 0a 2a 2a  ed permission.**
265d0 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f   is available, o
265e0 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73  r false otherwis
265f0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
26600 20 72 62 75 56 66 73 41 63 63 65 73 73 28 0a 20   rbuVfsAccess(. 
26610 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
26620 66 73 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61  fs, .  const cha
26630 72 20 2a 7a 50 61 74 68 2c 20 0a 20 20 69 6e 74  r *zPath, .  int
26640 20 66 6c 61 67 73 2c 20 0a 20 20 69 6e 74 20 2a   flags, .  int *
26650 70 52 65 73 4f 75 74 0a 29 7b 0a 20 20 72 62 75  pResOut.){.  rbu
26660 5f 76 66 73 20 2a 70 52 62 75 56 66 73 20 3d 20  _vfs *pRbuVfs = 
26670 28 72 62 75 5f 76 66 73 2a 29 70 56 66 73 3b 0a  (rbu_vfs*)pVfs;.
26680 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
26690 52 65 61 6c 56 66 73 20 3d 20 70 52 62 75 56 66  RealVfs = pRbuVf
266a0 73 2d 3e 70 52 65 61 6c 56 66 73 3b 0a 20 20 69  s->pRealVfs;.  i
266b0 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 70  nt rc;..  rc = p
266c0 52 65 61 6c 56 66 73 2d 3e 78 41 63 63 65 73 73  RealVfs->xAccess
266d0 28 70 52 65 61 6c 56 66 73 2c 20 7a 50 61 74 68  (pRealVfs, zPath
266e0 2c 20 66 6c 61 67 73 2c 20 70 52 65 73 4f 75 74  , flags, pResOut
266f0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  );..  /* If this
26700 20 63 61 6c 6c 20 69 73 20 74 6f 20 63 68 65 63   call is to chec
26710 6b 20 69 66 20 61 20 2a 2d 77 61 6c 20 66 69 6c  k if a *-wal fil
26720 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
26730 68 20 61 6e 20 52 42 55 20 74 61 72 67 65 74 0a  h an RBU target.
26740 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f    ** database co
26750 6e 6e 65 63 74 69 6f 6e 20 65 78 69 73 74 73 2c  nnection exists,
26760 20 61 6e 64 20 74 68 65 20 52 42 55 20 75 70 64   and the RBU upd
26770 61 74 65 20 69 73 20 69 6e 20 52 42 55 5f 53 54  ate is in RBU_ST
26780 41 47 45 5f 4f 41 4c 2c 0a 20 20 2a 2a 20 74 68  AGE_OAL,.  ** th
26790 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 70 65 63  e following spec
267a0 69 61 6c 20 68 61 6e 64 6c 69 6e 67 20 69 73 20  ial handling is 
267b0 61 63 74 69 76 61 74 65 64 3a 0a 20 20 2a 2a 0a  activated:.  **.
267c0 20 20 2a 2a 20 20 20 61 29 20 69 66 20 74 68 65    **   a) if the
267d0 20 2a 2d 77 61 6c 20 66 69 6c 65 20 64 6f 65 73   *-wal file does
267e0 20 65 78 69 73 74 2c 20 72 65 74 75 72 6e 20 53   exist, return S
267f0 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2e 20  QLITE_CANTOPEN. 
26800 54 68 69 73 0a 20 20 2a 2a 20 20 20 20 20 20 65  This.  **      e
26810 6e 73 75 72 65 73 20 74 68 61 74 20 74 68 65 20  nsures that the 
26820 52 42 55 20 65 78 74 65 6e 73 69 6f 6e 20 6e 65  RBU extension ne
26830 76 65 72 20 74 72 69 65 73 20 74 6f 20 75 70 64  ver tries to upd
26840 61 74 65 20 61 20 64 61 74 61 62 61 73 65 0a 20  ate a database. 
26850 20 2a 2a 20 20 20 20 20 20 69 6e 20 77 61 6c 20   **      in wal 
26860 6d 6f 64 65 2c 20 65 76 65 6e 20 69 66 20 74 68  mode, even if th
26870 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20  e first page of 
26880 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
26890 65 20 68 61 73 0a 20 20 2a 2a 20 20 20 20 20 20  e has.  **      
268a0 62 65 65 6e 20 64 61 6d 61 67 65 64 2e 20 0a 20  been damaged. . 
268b0 20 2a 2a 0a 20 20 2a 2a 20 20 20 62 29 20 69 66   **.  **   b) if
268c0 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20   the *-wal file 
268d0 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20  does not exist, 
268e0 63 6c 61 69 6d 20 74 68 61 74 20 69 74 20 64 6f  claim that it do
268f0 65 73 20 61 6e 79 77 61 79 2c 0a 20 20 2a 2a 20  es anyway,.  ** 
26900 20 20 20 20 20 63 61 75 73 69 6e 67 20 53 51 4c       causing SQL
26910 69 74 65 20 74 6f 20 63 61 6c 6c 20 78 4f 70 65  ite to call xOpe
26920 6e 28 29 20 74 6f 20 6f 70 65 6e 20 69 74 2e 20  n() to open it. 
26930 54 68 69 73 20 63 61 6c 6c 20 77 69 6c 6c 20 61  This call will a
26940 6c 73 6f 0a 20 20 2a 2a 20 20 20 20 20 20 62 65  lso.  **      be
26950 20 69 6e 74 65 72 63 65 70 74 65 64 20 28 73 65   intercepted (se
26960 65 20 74 68 65 20 72 62 75 56 66 73 4f 70 65 6e  e the rbuVfsOpen
26970 28 29 20 66 75 6e 63 74 69 6f 6e 29 20 61 6e 64  () function) and
26980 20 74 68 65 20 2a 2d 6f 61 6c 0a 20 20 2a 2a 20   the *-oal.  ** 
26990 20 20 20 20 20 66 69 6c 65 20 6f 70 65 6e 65 64       file opened
269a0 20 69 6e 73 74 65 61 64 2e 0a 20 20 2a 2f 0a 20   instead..  */. 
269b0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
269c0 4f 4b 20 26 26 20 66 6c 61 67 73 3d 3d 53 51 4c  OK && flags==SQL
269d0 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
269e0 53 20 29 7b 0a 20 20 20 20 72 62 75 5f 66 69 6c  S ){.    rbu_fil
269f0 65 20 2a 70 44 62 20 3d 20 72 62 75 46 69 6e 64  e *pDb = rbuFind
26a00 4d 61 69 6e 64 62 28 70 52 62 75 56 66 73 2c 20  Maindb(pRbuVfs, 
26a10 7a 50 61 74 68 2c 20 31 29 3b 0a 20 20 20 20 69  zPath, 1);.    i
26a20 66 28 20 70 44 62 20 26 26 20 70 44 62 2d 3e 70  f( pDb && pDb->p
26a30 52 62 75 20 26 26 20 70 44 62 2d 3e 70 52 62 75  Rbu && pDb->pRbu
26a40 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54  ->eStage==RBU_ST
26a50 41 47 45 5f 4f 41 4c 20 29 7b 0a 20 20 20 20 20  AGE_OAL ){.     
26a60 20 69 66 28 20 2a 70 52 65 73 4f 75 74 20 29 7b   if( *pResOut ){
26a70 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
26a80 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20  LITE_CANTOPEN;. 
26a90 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
26aa0 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
26ab0 34 20 73 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20  4 sz = 0;.      
26ac0 20 20 72 63 20 3d 20 72 62 75 56 66 73 46 69 6c    rc = rbuVfsFil
26ad0 65 53 69 7a 65 28 26 70 44 62 2d 3e 62 61 73 65  eSize(&pDb->base
26ae0 2c 20 26 73 7a 29 3b 0a 20 20 20 20 20 20 20 20  , &sz);.        
26af0 2a 70 52 65 73 4f 75 74 20 3d 20 28 73 7a 3e 30  *pResOut = (sz>0
26b00 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
26b10 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
26b20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 75  c;.}../*.** Popu
26b30 6c 61 74 65 20 62 75 66 66 65 72 20 7a 4f 75 74  late buffer zOut
26b40 20 77 69 74 68 20 74 68 65 20 66 75 6c 6c 20 63   with the full c
26b50 61 6e 6f 6e 69 63 61 6c 20 70 61 74 68 6e 61 6d  anonical pathnam
26b60 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a  e corresponding.
26b70 2a 2a 20 74 6f 20 74 68 65 20 70 61 74 68 6e 61  ** to the pathna
26b80 6d 65 20 69 6e 20 7a 50 61 74 68 2e 20 7a 4f 75  me in zPath. zOu
26b90 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  t is guaranteed 
26ba0 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75  to point to a bu
26bb0 66 66 65 72 0a 2a 2a 20 6f 66 20 61 74 20 6c 65  ffer.** of at le
26bc0 61 73 74 20 28 44 45 56 53 59 4d 5f 4d 41 58 5f  ast (DEVSYM_MAX_
26bd0 50 41 54 48 4e 41 4d 45 2b 31 29 20 62 79 74 65  PATHNAME+1) byte
26be0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
26bf0 20 72 62 75 56 66 73 46 75 6c 6c 50 61 74 68 6e   rbuVfsFullPathn
26c00 61 6d 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  ame(.  sqlite3_v
26c10 66 73 20 2a 70 56 66 73 2c 20 0a 20 20 63 6f 6e  fs *pVfs, .  con
26c20 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20  st char *zPath, 
26c30 0a 20 20 69 6e 74 20 6e 4f 75 74 2c 20 0a 20 20  .  int nOut, .  
26c40 63 68 61 72 20 2a 7a 4f 75 74 0a 29 7b 0a 20 20  char *zOut.){.  
26c50 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 52 65  sqlite3_vfs *pRe
26c60 61 6c 56 66 73 20 3d 20 28 28 72 62 75 5f 76 66  alVfs = ((rbu_vf
26c70 73 2a 29 70 56 66 73 29 2d 3e 70 52 65 61 6c 56  s*)pVfs)->pRealV
26c80 66 73 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65  fs;.  return pRe
26c90 61 6c 56 66 73 2d 3e 78 46 75 6c 6c 50 61 74 68  alVfs->xFullPath
26ca0 6e 61 6d 65 28 70 52 65 61 6c 56 66 73 2c 20 7a  name(pRealVfs, z
26cb0 50 61 74 68 2c 20 6e 4f 75 74 2c 20 7a 4f 75 74  Path, nOut, zOut
26cc0 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  );.}..#ifndef SQ
26cd0 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45  LITE_OMIT_LOAD_E
26ce0 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 4f  XTENSION./*.** O
26cf0 70 65 6e 20 74 68 65 20 64 79 6e 61 6d 69 63 20  pen the dynamic 
26d00 6c 69 62 72 61 72 79 20 6c 6f 63 61 74 65 64 20  library located 
26d10 61 74 20 7a 50 61 74 68 20 61 6e 64 20 72 65 74  at zPath and ret
26d20 75 72 6e 20 61 20 68 61 6e 64 6c 65 2e 0a 2a 2f  urn a handle..*/
26d30 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 72 62  .static void *rb
26d40 75 56 66 73 44 6c 4f 70 65 6e 28 73 71 6c 69 74  uVfsDlOpen(sqlit
26d50 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 63 6f  e3_vfs *pVfs, co
26d60 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 29  nst char *zPath)
26d70 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  {.  sqlite3_vfs 
26d80 2a 70 52 65 61 6c 56 66 73 20 3d 20 28 28 72 62  *pRealVfs = ((rb
26d90 75 5f 76 66 73 2a 29 70 56 66 73 29 2d 3e 70 52  u_vfs*)pVfs)->pR
26da0 65 61 6c 56 66 73 3b 0a 20 20 72 65 74 75 72 6e  ealVfs;.  return
26db0 20 70 52 65 61 6c 56 66 73 2d 3e 78 44 6c 4f 70   pRealVfs->xDlOp
26dc0 65 6e 28 70 52 65 61 6c 56 66 73 2c 20 7a 50 61  en(pRealVfs, zPa
26dd0 74 68 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f  th);.}../*.** Po
26de0 70 75 6c 61 74 65 20 74 68 65 20 62 75 66 66 65  pulate the buffe
26df0 72 20 7a 45 72 72 4d 73 67 20 28 73 69 7a 65 20  r zErrMsg (size 
26e00 6e 42 79 74 65 20 62 79 74 65 73 29 20 77 69 74  nByte bytes) wit
26e10 68 20 61 20 68 75 6d 61 6e 20 72 65 61 64 61 62  h a human readab
26e20 6c 65 0a 2a 2a 20 75 74 66 2d 38 20 73 74 72 69  le.** utf-8 stri
26e30 6e 67 20 64 65 73 63 72 69 62 69 6e 67 20 74 68  ng describing th
26e40 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 65 72  e most recent er
26e50 72 6f 72 20 65 6e 63 6f 75 6e 74 65 72 65 64 20  ror encountered 
26e60 61 73 73 6f 63 69 61 74 65 64 20 0a 2a 2a 20 77  associated .** w
26e70 69 74 68 20 64 79 6e 61 6d 69 63 20 6c 69 62 72  ith dynamic libr
26e80 61 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  aries..*/.static
26e90 20 76 6f 69 64 20 72 62 75 56 66 73 44 6c 45 72   void rbuVfsDlEr
26ea0 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ror(sqlite3_vfs 
26eb0 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 79 74 65  *pVfs, int nByte
26ec0 2c 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 29  , char *zErrMsg)
26ed0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  {.  sqlite3_vfs 
26ee0 2a 70 52 65 61 6c 56 66 73 20 3d 20 28 28 72 62  *pRealVfs = ((rb
26ef0 75 5f 76 66 73 2a 29 70 56 66 73 29 2d 3e 70 52  u_vfs*)pVfs)->pR
26f00 65 61 6c 56 66 73 3b 0a 20 20 70 52 65 61 6c 56  ealVfs;.  pRealV
26f10 66 73 2d 3e 78 44 6c 45 72 72 6f 72 28 70 52 65  fs->xDlError(pRe
26f20 61 6c 56 66 73 2c 20 6e 42 79 74 65 2c 20 7a 45  alVfs, nByte, zE
26f30 72 72 4d 73 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rrMsg);.}../*.**
26f40 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
26f50 72 20 74 6f 20 74 68 65 20 73 79 6d 62 6f 6c 20  r to the symbol 
26f60 7a 53 79 6d 62 6f 6c 20 69 6e 20 74 68 65 20 64  zSymbol in the d
26f70 79 6e 61 6d 69 63 20 6c 69 62 72 61 72 79 20 70  ynamic library p
26f80 48 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  Handle..*/.stati
26f90 63 20 76 6f 69 64 20 28 2a 72 62 75 56 66 73 44  c void (*rbuVfsD
26fa0 6c 53 79 6d 28 0a 20 20 73 71 6c 69 74 65 33 5f  lSym(.  sqlite3_
26fb0 76 66 73 20 2a 70 56 66 73 2c 20 0a 20 20 76 6f  vfs *pVfs, .  vo
26fc0 69 64 20 2a 70 41 72 67 2c 20 0a 20 20 63 6f 6e  id *pArg, .  con
26fd0 73 74 20 63 68 61 72 20 2a 7a 53 79 6d 0a 29 29  st char *zSym.))
26fe0 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65  (void){.  sqlite
26ff0 33 5f 76 66 73 20 2a 70 52 65 61 6c 56 66 73 20  3_vfs *pRealVfs 
27000 3d 20 28 28 72 62 75 5f 76 66 73 2a 29 70 56 66  = ((rbu_vfs*)pVf
27010 73 29 2d 3e 70 52 65 61 6c 56 66 73 3b 0a 20 20  s)->pRealVfs;.  
27020 72 65 74 75 72 6e 20 70 52 65 61 6c 56 66 73 2d  return pRealVfs-
27030 3e 78 44 6c 53 79 6d 28 70 52 65 61 6c 56 66 73  >xDlSym(pRealVfs
27040 2c 20 70 41 72 67 2c 20 7a 53 79 6d 29 3b 0a 7d  , pArg, zSym);.}
27050 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68  ../*.** Close th
27060 65 20 64 79 6e 61 6d 69 63 20 6c 69 62 72 61 72  e dynamic librar
27070 79 20 68 61 6e 64 6c 65 20 70 48 61 6e 64 6c 65  y handle pHandle
27080 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
27090 20 72 62 75 56 66 73 44 6c 43 6c 6f 73 65 28 73   rbuVfsDlClose(s
270a0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
270b0 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65 29  , void *pHandle)
270c0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  {.  sqlite3_vfs 
270d0 2a 70 52 65 61 6c 56 66 73 20 3d 20 28 28 72 62  *pRealVfs = ((rb
270e0 75 5f 76 66 73 2a 29 70 56 66 73 29 2d 3e 70 52  u_vfs*)pVfs)->pR
270f0 65 61 6c 56 66 73 3b 0a 20 20 70 52 65 61 6c 56  ealVfs;.  pRealV
27100 66 73 2d 3e 78 44 6c 43 6c 6f 73 65 28 70 52 65  fs->xDlClose(pRe
27110 61 6c 56 66 73 2c 20 70 48 61 6e 64 6c 65 29 3b  alVfs, pHandle);
27120 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
27130 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58  ITE_OMIT_LOAD_EX
27140 54 45 4e 53 49 4f 4e 20 2a 2f 0a 0a 2f 2a 0a 2a  TENSION */../*.*
27150 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 62  * Populate the b
27160 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f  uffer pointed to
27170 20 62 79 20 7a 42 75 66 4f 75 74 20 77 69 74 68   by zBufOut with
27180 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66 20   nByte bytes of 
27190 0a 2a 2a 20 72 61 6e 64 6f 6d 20 64 61 74 61 2e  .** random data.
271a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
271b0 62 75 56 66 73 52 61 6e 64 6f 6d 6e 65 73 73 28  buVfsRandomness(
271c0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
271d0 73 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 63 68  s, int nByte, ch
271e0 61 72 20 2a 7a 42 75 66 4f 75 74 29 7b 0a 20 20  ar *zBufOut){.  
271f0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 52 65  sqlite3_vfs *pRe
27200 61 6c 56 66 73 20 3d 20 28 28 72 62 75 5f 76 66  alVfs = ((rbu_vf
27210 73 2a 29 70 56 66 73 29 2d 3e 70 52 65 61 6c 56  s*)pVfs)->pRealV
27220 66 73 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65  fs;.  return pRe
27230 61 6c 56 66 73 2d 3e 78 52 61 6e 64 6f 6d 6e 65  alVfs->xRandomne
27240 73 73 28 70 52 65 61 6c 56 66 73 2c 20 6e 42 79  ss(pRealVfs, nBy
27250 74 65 2c 20 7a 42 75 66 4f 75 74 29 3b 0a 7d 0a  te, zBufOut);.}.
27260 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72  ./*.** Sleep for
27270 20 6e 4d 69 63 72 6f 20 6d 69 63 72 6f 73 65 63   nMicro microsec
27280 6f 6e 64 73 2e 20 52 65 74 75 72 6e 20 74 68 65  onds. Return the
27290 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 63 72 6f   number of micro
272a0 73 65 63 6f 6e 64 73 20 0a 2a 2a 20 61 63 74 75  seconds .** actu
272b0 61 6c 6c 79 20 73 6c 65 70 74 2e 0a 2a 2f 0a 73  ally slept..*/.s
272c0 74 61 74 69 63 20 69 6e 74 20 72 62 75 56 66 73  tatic int rbuVfs
272d0 53 6c 65 65 70 28 73 71 6c 69 74 65 33 5f 76 66  Sleep(sqlite3_vf
272e0 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 4d 69  s *pVfs, int nMi
272f0 63 72 6f 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  cro){.  sqlite3_
27300 76 66 73 20 2a 70 52 65 61 6c 56 66 73 20 3d 20  vfs *pRealVfs = 
27310 28 28 72 62 75 5f 76 66 73 2a 29 70 56 66 73 29  ((rbu_vfs*)pVfs)
27320 2d 3e 70 52 65 61 6c 56 66 73 3b 0a 20 20 72 65  ->pRealVfs;.  re
27330 74 75 72 6e 20 70 52 65 61 6c 56 66 73 2d 3e 78  turn pRealVfs->x
27340 53 6c 65 65 70 28 70 52 65 61 6c 56 66 73 2c 20  Sleep(pRealVfs, 
27350 6e 4d 69 63 72 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  nMicro);.}../*.*
27360 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72  * Return the cur
27370 72 65 6e 74 20 74 69 6d 65 20 61 73 20 61 20 4a  rent time as a J
27380 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72  ulian Day number
27390 20 69 6e 20 2a 70 54 69 6d 65 4f 75 74 2e 0a 2a   in *pTimeOut..*
273a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62 75  /.static int rbu
273b0 56 66 73 43 75 72 72 65 6e 74 54 69 6d 65 28 73  VfsCurrentTime(s
273c0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
273d0 2c 20 64 6f 75 62 6c 65 20 2a 70 54 69 6d 65 4f  , double *pTimeO
273e0 75 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  ut){.  sqlite3_v
273f0 66 73 20 2a 70 52 65 61 6c 56 66 73 20 3d 20 28  fs *pRealVfs = (
27400 28 72 62 75 5f 76 66 73 2a 29 70 56 66 73 29 2d  (rbu_vfs*)pVfs)-
27410 3e 70 52 65 61 6c 56 66 73 3b 0a 20 20 72 65 74  >pRealVfs;.  ret
27420 75 72 6e 20 70 52 65 61 6c 56 66 73 2d 3e 78 43  urn pRealVfs->xC
27430 75 72 72 65 6e 74 54 69 6d 65 28 70 52 65 61 6c  urrentTime(pReal
27440 56 66 73 2c 20 70 54 69 6d 65 4f 75 74 29 3b 0a  Vfs, pTimeOut);.
27450 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 2e 0a  }../*.** No-op..
27460 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62  */.static int rb
27470 75 56 66 73 47 65 74 4c 61 73 74 45 72 72 6f 72  uVfsGetLastError
27480 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
27490 66 73 2c 20 69 6e 74 20 61 2c 20 63 68 61 72 20  fs, int a, char 
274a0 2a 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 30 3b  *b){.  return 0;
274b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 72 65 67 69  .}../*.** Deregi
274c0 73 74 65 72 20 61 6e 64 20 64 65 73 74 72 6f 79  ster and destroy
274d0 20 61 6e 20 52 42 55 20 76 66 73 20 63 72 65 61   an RBU vfs crea
274e0 74 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65  ted by an earlie
274f0 72 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 73 71 6c  r call to.** sql
27500 69 74 65 33 72 62 75 5f 63 72 65 61 74 65 5f 76  ite3rbu_create_v
27510 66 73 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  fs()..*/.void sq
27520 6c 69 74 65 33 72 62 75 5f 64 65 73 74 72 6f 79  lite3rbu_destroy
27530 5f 76 66 73 28 63 6f 6e 73 74 20 63 68 61 72 20  _vfs(const char 
27540 2a 7a 4e 61 6d 65 29 7b 0a 20 20 73 71 6c 69 74  *zName){.  sqlit
27550 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 73  e3_vfs *pVfs = s
27560 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
27570 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 56  zName);.  if( pV
27580 66 73 20 26 26 20 70 56 66 73 2d 3e 78 4f 70 65  fs && pVfs->xOpe
27590 6e 3d 3d 72 62 75 56 66 73 4f 70 65 6e 20 29 7b  n==rbuVfsOpen ){
275a0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
275b0 65 78 5f 66 72 65 65 28 28 28 72 62 75 5f 76 66  ex_free(((rbu_vf
275c0 73 2a 29 70 56 66 73 29 2d 3e 6d 75 74 65 78 29  s*)pVfs)->mutex)
275d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66  ;.    sqlite3_vf
275e0 73 5f 75 6e 72 65 67 69 73 74 65 72 28 70 56 66  s_unregister(pVf
275f0 73 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  s);.    sqlite3_
27600 66 72 65 65 28 70 56 66 73 29 3b 0a 20 20 7d 0a  free(pVfs);.  }.
27610 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
27620 61 6e 20 52 42 55 20 56 46 53 20 6e 61 6d 65 64  an RBU VFS named
27630 20 7a 4e 61 6d 65 20 74 68 61 74 20 61 63 63 65   zName that acce
27640 73 73 65 73 20 74 68 65 20 75 6e 64 65 72 6c 79  sses the underly
27650 69 6e 67 20 66 69 6c 65 2d 73 79 73 74 65 6d 0a  ing file-system.
27660 2a 2a 20 76 69 61 20 65 78 69 73 74 69 6e 67 20  ** via existing 
27670 56 46 53 20 7a 50 61 72 65 6e 74 2e 20 54 68 65  VFS zParent. The
27680 20 6e 65 77 20 6f 62 6a 65 63 74 20 69 73 20 72   new object is r
27690 65 67 69 73 74 65 72 65 64 20 61 73 20 61 20 6e  egistered as a n
276a0 6f 6e 2d 64 65 66 61 75 6c 74 0a 2a 2a 20 56 46  on-default.** VF
276b0 53 20 77 69 74 68 20 53 51 4c 69 74 65 20 62 65  S with SQLite be
276c0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
276d0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 72 62  */.int sqlite3rb
276e0 75 5f 63 72 65 61 74 65 5f 76 66 73 28 63 6f 6e  u_create_vfs(con
276f0 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
27700 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72  const char *zPar
27710 65 6e 74 29 7b 0a 0a 20 20 2f 2a 20 54 65 6d 70  ent){..  /* Temp
27720 6c 61 74 65 20 66 6f 72 20 56 46 53 20 2a 2f 0a  late for VFS */.
27730 20 20 73 74 61 74 69 63 20 73 71 6c 69 74 65 33    static sqlite3
27740 5f 76 66 73 20 76 66 73 5f 74 65 6d 70 6c 61 74  _vfs vfs_templat
27750 65 20 3d 20 7b 0a 20 20 20 20 31 2c 20 20 20 20  e = {.    1,    
27760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27770 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73          /* iVers
27780 69 6f 6e 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20  ion */.    0,   
27790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
277a0 20 20 20 20 20 20 20 20 20 2f 2a 20 73 7a 4f 73           /* szOs
277b0 46 69 6c 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20  File */.    0,  
277c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
277d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6d 78 50            /* mxP
277e0 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 30  athname */.    0
277f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
27800 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27810 70 4e 65 78 74 20 2a 2f 0a 20 20 20 20 30 2c 20  pNext */.    0, 
27820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27830 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4e             /* zN
27840 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20  ame */.    0,   
27850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27860 20 20 20 20 20 20 20 20 20 2f 2a 20 70 41 70 70           /* pApp
27870 44 61 74 61 20 2a 2f 0a 20 20 20 20 72 62 75 56  Data */.    rbuV
27880 66 73 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20  fsOpen,         
27890 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4f 70            /* xOp
278a0 65 6e 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73  en */.    rbuVfs
278b0 44 65 6c 65 74 65 2c 20 20 20 20 20 20 20 20 20  Delete,         
278c0 20 20 20 20 20 20 20 20 2f 2a 20 78 44 65 6c 65          /* xDele
278d0 74 65 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73  te */.    rbuVfs
278e0 41 63 63 65 73 73 2c 20 20 20 20 20 20 20 20 20  Access,         
278f0 20 20 20 20 20 20 20 20 2f 2a 20 78 41 63 63 65          /* xAcce
27900 73 73 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73  ss */.    rbuVfs
27910 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20 20  FullPathname,   
27920 20 20 20 20 20 20 20 20 2f 2a 20 78 46 75 6c 6c          /* xFull
27930 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 0a 23 69 66  Pathname */..#if
27940 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
27950 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a  _LOAD_EXTENSION.
27960 20 20 20 20 72 62 75 56 66 73 44 6c 4f 70 65 6e      rbuVfsDlOpen
27970 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
27980 20 20 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f 0a    /* xDlOpen */.
27990 20 20 20 20 72 62 75 56 66 73 44 6c 45 72 72 6f      rbuVfsDlErro
279a0 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
279b0 20 20 2f 2a 20 78 44 6c 45 72 72 6f 72 20 2a 2f    /* xDlError */
279c0 0a 20 20 20 20 72 62 75 56 66 73 44 6c 53 79 6d  .    rbuVfsDlSym
279d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
279e0 20 20 20 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f 0a     /* xDlSym */.
279f0 20 20 20 20 72 62 75 56 66 73 44 6c 43 6c 6f 73      rbuVfsDlClos
27a00 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
27a10 20 20 2f 2a 20 78 44 6c 43 6c 6f 73 65 20 2a 2f    /* xDlClose */
27a20 0a 23 65 6c 73 65 0a 20 20 20 20 30 2c 20 30 2c  .#else.    0, 0,
27a30 20 30 2c 20 30 2c 0a 23 65 6e 64 69 66 0a 0a 20   0, 0,.#endif.. 
27a40 20 20 20 72 62 75 56 66 73 52 61 6e 64 6f 6d 6e     rbuVfsRandomn
27a50 65 73 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ess,            
27a60 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20   /* xRandomness 
27a70 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 53 6c 65  */.    rbuVfsSle
27a80 65 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ep,             
27a90 20 20 20 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a       /* xSleep *
27aa0 2f 0a 20 20 20 20 72 62 75 56 66 73 43 75 72 72  /.    rbuVfsCurr
27ab0 65 6e 74 54 69 6d 65 2c 20 20 20 20 20 20 20 20  entTime,        
27ac0 20 20 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54      /* xCurrentT
27ad0 69 6d 65 20 2a 2f 0a 20 20 20 20 72 62 75 56 66  ime */.    rbuVf
27ae0 73 47 65 74 4c 61 73 74 45 72 72 6f 72 2c 20 20  sGetLastError,  
27af0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 47 65 74           /* xGet
27b00 4c 61 73 74 45 72 72 6f 72 20 2a 2f 0a 20 20 20  LastError */.   
27b10 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
27b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27b30 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e  * xCurrentTimeIn
27b40 74 36 34 20 28 76 65 72 73 69 6f 6e 20 32 29 20  t64 (version 2) 
27b50 2a 2f 0a 20 20 20 20 30 2c 20 30 2c 20 30 20 20  */.    0, 0, 0  
27b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27b70 20 20 20 20 20 2f 2a 20 55 6e 69 6d 70 6c 65 6d       /* Unimplem
27b80 65 6e 74 65 64 20 76 65 72 73 69 6f 6e 20 33 20  ented version 3 
27b90 6d 65 74 68 6f 64 73 20 2a 2f 0a 20 20 7d 3b 0a  methods */.  };.
27ba0 0a 20 20 72 62 75 5f 76 66 73 20 2a 70 4e 65 77  .  rbu_vfs *pNew
27bb0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
27bc0 20 20 20 2f 2a 20 4e 65 77 6c 79 20 61 6c 6c 6f     /* Newly allo
27bd0 63 61 74 65 64 20 56 46 53 20 2a 2f 0a 20 20 69  cated VFS */.  i
27be0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
27bf0 4b 3b 0a 20 20 73 69 7a 65 5f 74 20 6e 4e 61 6d  K;.  size_t nNam
27c00 65 3b 0a 20 20 73 69 7a 65 5f 74 20 6e 42 79 74  e;.  size_t nByt
27c10 65 3b 0a 0a 20 20 6e 4e 61 6d 65 20 3d 20 73 74  e;..  nName = st
27c20 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 6e  rlen(zName);.  n
27c30 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 72 62  Byte = sizeof(rb
27c40 75 5f 76 66 73 29 20 2b 20 6e 4e 61 6d 65 20 2b  u_vfs) + nName +
27c50 20 31 3b 0a 20 20 70 4e 65 77 20 3d 20 28 72 62   1;.  pNew = (rb
27c60 75 5f 76 66 73 2a 29 73 71 6c 69 74 65 33 5f 6d  u_vfs*)sqlite3_m
27c70 61 6c 6c 6f 63 36 34 28 6e 42 79 74 65 29 3b 0a  alloc64(nByte);.
27c80 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b    if( pNew==0 ){
27c90 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
27ca0 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b  _NOMEM;.  }else{
27cb0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73  .    sqlite3_vfs
27cc0 20 2a 70 50 61 72 65 6e 74 3b 20 20 20 20 20 20   *pParent;      
27cd0 20 20 20 20 20 2f 2a 20 50 61 72 65 6e 74 20 56       /* Parent V
27ce0 46 53 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74  FS */.    memset
27cf0 28 70 4e 65 77 2c 20 30 2c 20 6e 42 79 74 65 29  (pNew, 0, nByte)
27d00 3b 0a 20 20 20 20 70 50 61 72 65 6e 74 20 3d 20  ;.    pParent = 
27d10 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
27d20 28 7a 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 69  (zParent);.    i
27d30 66 28 20 70 50 61 72 65 6e 74 3d 3d 30 20 29 7b  f( pParent==0 ){
27d40 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
27d50 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20 20  TE_NOTFOUND;.   
27d60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68   }else{.      ch
27d70 61 72 20 2a 7a 53 70 61 63 65 3b 0a 20 20 20 20  ar *zSpace;.    
27d80 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 2d 3e    memcpy(&pNew->
27d90 62 61 73 65 2c 20 26 76 66 73 5f 74 65 6d 70 6c  base, &vfs_templ
27da0 61 74 65 2c 20 73 69 7a 65 6f 66 28 73 71 6c 69  ate, sizeof(sqli
27db0 74 65 33 5f 76 66 73 29 29 3b 0a 20 20 20 20 20  te3_vfs));.     
27dc0 20 70 4e 65 77 2d 3e 62 61 73 65 2e 6d 78 50 61   pNew->base.mxPa
27dd0 74 68 6e 61 6d 65 20 3d 20 70 50 61 72 65 6e 74  thname = pParent
27de0 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 3b 0a 20 20  ->mxPathname;.  
27df0 20 20 20 20 70 4e 65 77 2d 3e 62 61 73 65 2e 73      pNew->base.s
27e00 7a 4f 73 46 69 6c 65 20 3d 20 73 69 7a 65 6f 66  zOsFile = sizeof
27e10 28 72 62 75 5f 66 69 6c 65 29 20 2b 20 70 50 61  (rbu_file) + pPa
27e20 72 65 6e 74 2d 3e 73 7a 4f 73 46 69 6c 65 3b 0a  rent->szOsFile;.
27e30 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 52 65 61        pNew->pRea
27e40 6c 56 66 73 20 3d 20 70 50 61 72 65 6e 74 3b 0a  lVfs = pParent;.
27e50 20 20 20 20 20 20 70 4e 65 77 2d 3e 62 61 73 65        pNew->base
27e60 2e 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20  .zName = (const 
27e70 63 68 61 72 2a 29 28 7a 53 70 61 63 65 20 3d 20  char*)(zSpace = 
27e80 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 29  (char*)&pNew[1])
27e90 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a  ;.      memcpy(z
27ea0 53 70 61 63 65 2c 20 7a 4e 61 6d 65 2c 20 6e 4e  Space, zName, nN
27eb0 61 6d 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  ame);..      /* 
27ec0 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 6d 75 74  Allocate the mut
27ed0 65 78 20 61 6e 64 20 72 65 67 69 73 74 65 72 20  ex and register 
27ee0 74 68 65 20 6e 65 77 20 56 46 53 20 28 6e 6f 74  the new VFS (not
27ef0 20 61 73 20 74 68 65 20 64 65 66 61 75 6c 74 29   as the default)
27f00 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   */.      pNew->
27f10 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 5f  mutex = sqlite3_
27f20 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49  mutex_alloc(SQLI
27f30 54 45 5f 4d 55 54 45 58 5f 52 45 43 55 52 53 49  TE_MUTEX_RECURSI
27f40 56 45 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  VE);.      if( p
27f50 4e 65 77 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b  New->mutex==0 ){
27f60 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
27f70 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
27f80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
27f90 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 76 66   rc = sqlite3_vf
27fa0 73 5f 72 65 67 69 73 74 65 72 28 26 70 4e 65 77  s_register(&pNew
27fb0 2d 3e 62 61 73 65 2c 20 30 29 3b 0a 20 20 20 20  ->base, 0);.    
27fc0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69    }.    }..    i
27fd0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
27fe0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
27ff0 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 4e 65  3_mutex_free(pNe
28000 77 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20  w->mutex);.     
28010 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e   sqlite3_free(pN
28020 65 77 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ew);.    }.  }..
28030 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
28040 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20  /*.** Configure 
28050 74 68 65 20 61 67 67 72 65 67 61 74 65 20 74 65  the aggregate te
28060 6d 70 20 66 69 6c 65 20 73 69 7a 65 20 6c 69 6d  mp file size lim
28070 69 74 20 66 6f 72 20 74 68 69 73 20 52 42 55 20  it for this RBU 
28080 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 71 6c 69 74  handle..*/.sqlit
28090 65 33 5f 69 6e 74 36 34 20 73 71 6c 69 74 65 33  e3_int64 sqlite3
280a0 72 62 75 5f 74 65 6d 70 5f 73 69 7a 65 5f 6c 69  rbu_temp_size_li
280b0 6d 69 74 28 73 71 6c 69 74 65 33 72 62 75 20 2a  mit(sqlite3rbu *
280c0 70 52 62 75 2c 20 73 71 6c 69 74 65 33 5f 69 6e  pRbu, sqlite3_in
280d0 74 36 34 20 6e 29 7b 0a 20 20 69 66 28 20 6e 3e  t64 n){.  if( n>
280e0 3d 30 20 29 7b 0a 20 20 20 20 70 52 62 75 2d 3e  =0 ){.    pRbu->
280f0 73 7a 54 65 6d 70 4c 69 6d 69 74 20 3d 20 6e 3b  szTempLimit = n;
28100 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52  .  }.  return pR
28110 62 75 2d 3e 73 7a 54 65 6d 70 4c 69 6d 69 74 3b  bu->szTempLimit;
28120 0a 7d 0a 0a 73 71 6c 69 74 65 33 5f 69 6e 74 36  .}..sqlite3_int6
28130 34 20 73 71 6c 69 74 65 33 72 62 75 5f 74 65 6d  4 sqlite3rbu_tem
28140 70 5f 73 69 7a 65 28 73 71 6c 69 74 65 33 72 62  p_size(sqlite3rb
28150 75 20 2a 70 52 62 75 29 7b 0a 20 20 72 65 74 75  u *pRbu){.  retu
28160 72 6e 20 70 52 62 75 2d 3e 73 7a 54 65 6d 70 3b  rn pRbu->szTemp;
28170 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}.../**********
28180 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28190 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
281a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
281b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
281c0 2f 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  /..#endif /* !de
281d0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 43 4f 52  fined(SQLITE_COR
281e0 45 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  E) || defined(SQ
281f0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 52 42 55 29  LITE_ENABLE_RBU)
28200 20 2a 2f 0a                                       */.