/ Hex Artifact Content
Login

Artifact a1a303de8b90f987ef63bf9cef57f5d7dd7983a9e8aed3775a759d87ad57075d:


0000: 2f 2a 0a 2a 2a 20 32 30 31 34 20 41 75 67 75 73  /*.** 2014 Augus
0010: 74 20 33 30 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  t 30.**.** The a
0020: 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20  uthor disclaims 
0030: 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74 68 69  copyright to thi
0040: 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20  s source code.  
0050: 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61  In place of.** a
0060: 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68   legal notice, h
0070: 65 72 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e  ere is a blessin
0080: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20  g:.**.**    May 
0090: 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20  you do good and 
00a0: 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20  not evil..**    
00b0: 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72  May you find for
00c0: 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75  giveness for you
00d0: 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76  rself and forgiv
00e0: 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20  e others..**    
00f0: 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20 66 72  May you share fr
0100: 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69  eely, never taki
0110: 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75  ng more than you
0120: 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a   give..**.******
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 56 45  ***.**.**.** OVE
0180: 52 56 49 45 57 20 0a 2a 2a 0a 2a 2a 20 20 54 68  RVIEW .**.**  Th
0190: 65 20 52 42 55 20 65 78 74 65 6e 73 69 6f 6e 20  e RBU extension 
01a0: 72 65 71 75 69 72 65 73 20 74 68 61 74 20 74 68  requires that th
01b0: 65 20 52 42 55 20 75 70 64 61 74 65 20 62 65 20  e RBU update be 
01c0: 70 61 63 6b 61 67 65 64 20 61 73 20 61 6e 0a 2a  packaged as an.*
01d0: 2a 20 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  *  SQLite databa
01e0: 73 65 2e 20 54 68 65 20 74 61 62 6c 65 73 20 69  se. The tables i
01f0: 74 20 65 78 70 65 63 74 73 20 74 6f 20 66 69 6e  t expects to fin
0200: 64 20 61 72 65 20 64 65 73 63 72 69 62 65 64 20  d are described 
0210: 69 6e 0a 2a 2a 20 20 73 71 6c 69 74 65 33 72 62  in.**  sqlite3rb
0220: 75 2e 68 2e 20 20 45 73 73 65 6e 74 69 61 6c 6c  u.h.  Essentiall
0230: 79 2c 20 66 6f 72 20 65 61 63 68 20 74 61 62 6c  y, for each tabl
0240: 65 20 78 79 7a 20 69 6e 20 74 68 65 20 74 61 72  e xyz in the tar
0250: 67 65 74 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  get database.** 
0260: 20 74 68 61 74 20 74 68 65 20 75 73 65 72 20 77   that the user w
0270: 69 73 68 65 73 20 74 6f 20 77 72 69 74 65 20 74  ishes to write t
0280: 6f 2c 20 61 20 63 6f 72 72 65 73 70 6f 6e 64 69  o, a correspondi
0290: 6e 67 20 64 61 74 61 5f 78 79 7a 20 74 61 62 6c  ng data_xyz tabl
02a0: 65 20 69 73 0a 2a 2a 20 20 63 72 65 61 74 65 64  e is.**  created
02b0: 20 69 6e 20 74 68 65 20 52 42 55 20 64 61 74 61   in the RBU data
02c0: 62 61 73 65 20 61 6e 64 20 70 6f 70 75 6c 61 74  base and populat
02d0: 65 64 20 77 69 74 68 20 6f 6e 65 20 72 6f 77 20  ed with one row 
02e0: 66 6f 72 20 65 61 63 68 20 72 6f 77 20 74 6f 0a  for each row to.
02f0: 2a 2a 20 20 75 70 64 61 74 65 2c 20 69 6e 73 65  **  update, inse
0300: 72 74 20 6f 72 20 64 65 6c 65 74 65 20 66 72 6f  rt or delete fro
0310: 6d 20 74 68 65 20 74 61 72 67 65 74 20 74 61 62  m the target tab
0320: 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 20 54 68 65 20  le..** .**  The 
0330: 75 70 64 61 74 65 20 70 72 6f 63 65 65 64 73 20  update proceeds 
0340: 69 6e 20 74 68 72 65 65 20 73 74 61 67 65 73 3a  in three stages:
0350: 0a 2a 2a 20 0a 2a 2a 20 20 31 29 20 54 68 65 20  .** .**  1) The 
0360: 64 61 74 61 62 61 73 65 20 69 73 20 75 70 64 61  database is upda
0370: 74 65 64 2e 20 54 68 65 20 6d 6f 64 69 66 69 65  ted. The modifie
0380: 64 20 64 61 74 61 62 61 73 65 20 70 61 67 65 73  d database pages
0390: 20 61 72 65 20 77 72 69 74 74 65 6e 0a 2a 2a 20   are written.** 
03a0: 20 20 20 20 74 6f 20 61 20 2a 2d 6f 61 6c 20 66      to a *-oal f
03b0: 69 6c 65 2e 20 41 20 2a 2d 6f 61 6c 20 66 69 6c  ile. A *-oal fil
03c0: 65 20 69 73 20 6a 75 73 74 20 6c 69 6b 65 20 61  e is just like a
03d0: 20 2a 2d 77 61 6c 20 66 69 6c 65 2c 20 65 78 63   *-wal file, exc
03e0: 65 70 74 0a 2a 2a 20 20 20 20 20 74 68 61 74 20  ept.**     that 
03f0: 69 74 20 69 73 20 6e 61 6d 65 64 20 22 3c 64 61  it is named "<da
0400: 74 61 62 61 73 65 3e 2d 6f 61 6c 22 20 69 6e 73  tabase>-oal" ins
0410: 74 65 61 64 20 6f 66 20 22 3c 64 61 74 61 62 61  tead of "<databa
0420: 73 65 3e 2d 77 61 6c 22 2e 0a 2a 2a 20 20 20 20  se>-wal"..**    
0430: 20 42 65 63 61 75 73 65 20 72 65 67 75 6c 61 72   Because regular
0440: 20 53 51 4c 69 74 65 20 63 6c 69 65 6e 74 73 20   SQLite clients 
0450: 64 6f 20 6e 6f 74 20 6c 6f 6f 6b 20 66 6f 72 20  do not look for 
0460: 66 69 6c 65 20 6e 61 6d 65 64 0a 2a 2a 20 20 20  file named.**   
0470: 20 20 22 3c 64 61 74 61 62 61 73 65 3e 2d 6f 61    "<database>-oa
0480: 6c 22 2c 20 74 68 65 79 20 67 6f 20 6f 6e 20 75  l", they go on u
0490: 73 69 6e 67 20 74 68 65 20 6f 72 69 67 69 6e 61  sing the origina
04a0: 6c 20 64 61 74 61 62 61 73 65 20 69 6e 0a 2a 2a  l database in.**
04b0: 20 20 20 20 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f       rollback mo
04c0: 64 65 20 77 68 69 6c 65 20 74 68 65 20 2a 2d 6f  de while the *-o
04d0: 61 6c 20 66 69 6c 65 20 69 73 20 62 65 69 6e 67  al file is being
04e0: 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2a 20 0a   generated..** .
04f0: 2a 2a 20 20 20 20 20 44 75 72 69 6e 67 20 74 68  **     During th
0500: 69 73 20 73 74 61 67 65 20 52 42 55 20 64 6f 65  is stage RBU doe
0510: 73 20 6e 6f 74 20 75 70 64 61 74 65 20 74 68 65  s not update the
0520: 20 64 61 74 61 62 61 73 65 20 62 79 20 77 72 69   database by wri
0530: 74 69 6e 67 0a 2a 2a 20 20 20 20 20 64 69 72 65  ting.**     dire
0540: 63 74 6c 79 20 74 6f 20 74 68 65 20 74 61 72 67  ctly to the targ
0550: 65 74 20 74 61 62 6c 65 73 2e 20 49 6e 73 74 65  et tables. Inste
0560: 61 64 20 69 74 20 63 72 65 61 74 65 73 20 22 69  ad it creates "i
0570: 6d 70 6f 73 74 65 72 22 0a 2a 2a 20 20 20 20 20  mposter".**     
0580: 74 61 62 6c 65 73 20 75 73 69 6e 67 20 74 68 65  tables using the
0590: 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
05a0: 5f 49 4d 50 4f 53 54 45 52 20 69 6e 74 65 72 66  _IMPOSTER interf
05b0: 61 63 65 20 74 68 61 74 20 69 74 20 75 73 65 73  ace that it uses
05c0: 0a 2a 2a 20 20 20 20 20 74 6f 20 75 70 64 61 74  .**     to updat
05d0: 65 20 65 61 63 68 20 62 2d 74 72 65 65 20 69 6e  e each b-tree in
05e0: 64 69 76 69 64 75 61 6c 6c 79 2e 20 41 6c 6c 20  dividually. All 
05f0: 75 70 64 61 74 65 73 20 72 65 71 75 69 72 65 64  updates required
0600: 20 62 79 20 65 61 63 68 0a 2a 2a 20 20 20 20 20   by each.**     
0610: 62 2d 74 72 65 65 20 61 72 65 20 63 6f 6d 70 6c  b-tree are compl
0620: 65 74 65 64 20 62 65 66 6f 72 65 20 6d 6f 76 69  eted before movi
0630: 6e 67 20 6f 6e 20 74 6f 20 74 68 65 20 6e 65 78  ng on to the nex
0640: 74 2c 20 61 6e 64 20 61 6c 6c 0a 2a 2a 20 20 20  t, and all.**   
0650: 20 20 75 70 64 61 74 65 73 20 61 72 65 20 64 6f    updates are do
0660: 6e 65 20 69 6e 20 73 6f 72 74 65 64 20 6b 65 79  ne in sorted key
0670: 20 6f 72 64 65 72 2e 0a 2a 2a 20 0a 2a 2a 20 20   order..** .**  
0680: 32 29 20 54 68 65 20 22 3c 64 61 74 61 62 61 73  2) The "<databas
0690: 65 3e 2d 6f 61 6c 22 20 66 69 6c 65 20 69 73 20  e>-oal" file is 
06a0: 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 65 71 75  moved to the equ
06b0: 69 76 61 6c 65 6e 74 20 22 3c 64 61 74 61 62 61  ivalent "<databa
06c0: 73 65 3e 2d 77 61 6c 22 0a 2a 2a 20 20 20 20 20  se>-wal".**     
06d0: 6c 6f 63 61 74 69 6f 6e 20 75 73 69 6e 67 20 61  location using a
06e0: 20 63 61 6c 6c 20 74 6f 20 72 65 6e 61 6d 65 28   call to rename(
06f0: 32 29 2e 20 42 65 66 6f 72 65 20 64 6f 69 6e 67  2). Before doing
0700: 20 74 68 69 73 20 74 68 65 20 52 42 55 0a 2a 2a   this the RBU.**
0710: 20 20 20 20 20 6d 6f 64 75 6c 65 20 74 61 6b 65       module take
0720: 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  s an EXCLUSIVE l
0730: 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
0740: 61 73 65 20 66 69 6c 65 2c 20 65 6e 73 75 72 69  ase file, ensuri
0750: 6e 67 0a 2a 2a 20 20 20 20 20 74 68 61 74 20 74  ng.**     that t
0760: 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 74 68 65  here are no othe
0770: 72 20 61 63 74 69 76 65 20 72 65 61 64 65 72 73  r active readers
0780: 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 4f 6e 63  ..** .**     Onc
0790: 65 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 20  e the EXCLUSIVE 
07a0: 6c 6f 63 6b 20 69 73 20 72 65 6c 65 61 73 65 64  lock is released
07b0: 2c 20 61 6e 79 20 6f 74 68 65 72 20 64 61 74 61  , any other data
07c0: 62 61 73 65 20 72 65 61 64 65 72 73 0a 2a 2a 20  base readers.** 
07d0: 20 20 20 20 64 65 74 65 63 74 20 74 68 65 20 6e      detect the n
07e0: 65 77 20 2a 2d 77 61 6c 20 66 69 6c 65 20 61 6e  ew *-wal file an
07f0: 64 20 72 65 61 64 20 74 68 65 20 64 61 74 61 62  d read the datab
0800: 61 73 65 20 69 6e 20 77 61 6c 20 6d 6f 64 65 2e  ase in wal mode.
0810: 20 41 74 0a 2a 2a 20 20 20 20 20 74 68 69 73 20   At.**     this 
0820: 70 6f 69 6e 74 20 74 68 65 79 20 73 65 65 20 74  point they see t
0830: 68 65 20 6e 65 77 20 76 65 72 73 69 6f 6e 20 6f  he new version o
0840: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2d  f the database -
0850: 20 69 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20 20 20   including.**   
0860: 20 20 74 68 65 20 75 70 64 61 74 65 73 20 6d 61    the updates ma
0870: 64 65 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  de as part of th
0880: 65 20 52 42 55 20 75 70 64 61 74 65 2e 0a 2a 2a  e RBU update..**
0890: 20 0a 2a 2a 20 20 33 29 20 54 68 65 20 6e 65 77   .**  3) The new
08a0: 20 2a 2d 77 61 6c 20 66 69 6c 65 20 69 73 20 63   *-wal file is c
08b0: 68 65 63 6b 70 6f 69 6e 74 65 64 2e 20 54 68 69  heckpointed. Thi
08c0: 73 20 70 72 6f 63 65 65 64 73 20 69 6e 20 74 68  s proceeds in th
08d0: 65 20 73 61 6d 65 20 77 61 79 20 0a 2a 2a 20 20  e same way .**  
08e0: 20 20 20 61 73 20 61 20 72 65 67 75 6c 61 72 20     as a regular 
08f0: 64 61 74 61 62 61 73 65 20 63 68 65 63 6b 70 6f  database checkpo
0900: 69 6e 74 2c 20 65 78 63 65 70 74 20 74 68 61 74  int, except that
0910: 20 61 20 73 69 6e 67 6c 65 20 66 72 61 6d 65 20   a single frame 
0920: 69 73 0a 2a 2a 20 20 20 20 20 63 68 65 63 6b 70  is.**     checkp
0930: 6f 69 6e 74 65 64 20 65 61 63 68 20 74 69 6d 65  ointed each time
0940: 20 73 71 6c 69 74 65 33 72 62 75 5f 73 74 65 70   sqlite3rbu_step
0950: 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 20 49 66  () is called. If
0960: 20 74 68 65 20 52 42 55 0a 2a 2a 20 20 20 20 20   the RBU.**     
0970: 68 61 6e 64 6c 65 20 69 73 20 63 6c 6f 73 65 64  handle is closed
0980: 20 62 65 66 6f 72 65 20 74 68 65 20 65 6e 74 69   before the enti
0990: 72 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 69 73  re *-wal file is
09a0: 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 2c 0a 2a   checkpointed,.*
09b0: 2a 20 20 20 20 20 74 68 65 20 63 68 65 63 6b 70  *     the checkp
09c0: 6f 69 6e 74 20 70 72 6f 67 72 65 73 73 20 69 73  oint progress is
09d0: 20 73 61 76 65 64 20 69 6e 20 74 68 65 20 52 42   saved in the RB
09e0: 55 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74  U database and t
09f0: 68 65 0a 2a 2a 20 20 20 20 20 63 68 65 63 6b 70  he.**     checkp
0a00: 6f 69 6e 74 20 63 61 6e 20 62 65 20 72 65 73 75  oint can be resu
0a10: 6d 65 64 20 62 79 20 61 6e 6f 74 68 65 72 20 52  med by another R
0a20: 42 55 20 63 6c 69 65 6e 74 20 61 74 20 73 6f 6d  BU client at som
0a30: 65 20 70 6f 69 6e 74 20 69 6e 0a 2a 2a 20 20 20  e point in.**   
0a40: 20 20 74 68 65 20 66 75 74 75 72 65 2e 0a 2a 2a    the future..**
0a50: 0a 2a 2a 20 50 4f 54 45 4e 54 49 41 4c 20 50 52  .** POTENTIAL PR
0a60: 4f 42 4c 45 4d 53 0a 2a 2a 20 0a 2a 2a 20 20 54  OBLEMS.** .**  T
0a70: 68 65 20 72 65 6e 61 6d 65 28 29 20 63 61 6c 6c  he rename() call
0a80: 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 70 6f   might not be po
0a90: 72 74 61 62 6c 65 2e 20 41 6e 64 20 52 42 55 20  rtable. And RBU 
0aa0: 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  is not currently
0ab0: 0a 2a 2a 20 20 73 79 6e 63 69 6e 67 20 74 68 65  .**  syncing the
0ac0: 20 64 69 72 65 63 74 6f 72 79 20 61 66 74 65 72   directory after
0ad0: 20 72 65 6e 61 6d 69 6e 67 20 74 68 65 20 66 69   renaming the fi
0ae0: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 57 68 65 6e 20  le..**.**  When 
0af0: 73 74 61 74 65 20 69 73 20 73 61 76 65 64 2c 20  state is saved, 
0b00: 61 6e 79 20 63 6f 6d 6d 69 74 20 74 6f 20 74 68  any commit to th
0b10: 65 20 2a 2d 6f 61 6c 20 66 69 6c 65 20 61 6e 64  e *-oal file and
0b20: 20 74 68 65 20 63 6f 6d 6d 69 74 20 74 6f 0a 2a   the commit to.*
0b30: 2a 20 20 74 68 65 20 52 42 55 20 75 70 64 61 74  *  the RBU updat
0b40: 65 20 64 61 74 61 62 61 73 65 20 61 72 65 20 6e  e database are n
0b50: 6f 74 20 61 74 6f 6d 69 63 2e 20 53 6f 20 69 66  ot atomic. So if
0b60: 20 74 68 65 20 70 6f 77 65 72 20 66 61 69 6c 73   the power fails
0b70: 20 61 74 20 74 68 65 0a 2a 2a 20 20 77 72 6f 6e   at the.**  wron
0b80: 67 20 6d 6f 6d 65 6e 74 20 74 68 65 79 20 6d 69  g moment they mi
0b90: 67 68 74 20 67 65 74 20 6f 75 74 20 6f 66 20 73  ght get out of s
0ba0: 79 6e 63 2e 20 41 73 20 74 68 65 20 6d 61 69 6e  ync. As the main
0bb0: 20 64 61 74 61 62 61 73 65 20 77 69 6c 6c 20 62   database will b
0bc0: 65 0a 2a 2a 20 20 63 6f 6d 6d 69 74 74 65 64 20  e.**  committed 
0bd0: 62 65 66 6f 72 65 20 74 68 65 20 52 42 55 20 75  before the RBU u
0be0: 70 64 61 74 65 20 64 61 74 61 62 61 73 65 20 74  pdate database t
0bf0: 68 69 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20  his will likely 
0c00: 65 69 74 68 65 72 20 6a 75 73 74 0a 2a 2a 20 20  either just.**  
0c10: 70 61 73 73 20 75 6e 6e 6f 74 69 63 65 64 2c 20  pass unnoticed, 
0c20: 6f 72 20 72 65 73 75 6c 74 20 69 6e 20 53 51 4c  or result in SQL
0c30: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 65  ITE_CONSTRAINT e
0c40: 72 72 6f 72 73 20 28 64 75 65 20 74 6f 20 55 4e  rrors (due to UN
0c50: 49 51 55 45 0a 2a 2a 20 20 63 6f 6e 73 74 72 61  IQUE.**  constra
0c60: 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 73 29 2e  int violations).
0c70: 0a 2a 2a 0a 2a 2a 20 20 49 66 20 73 6f 6d 65 20  .**.**  If some 
0c80: 63 6c 69 65 6e 74 20 64 6f 65 73 20 6d 6f 64 69  client does modi
0c90: 66 79 20 74 68 65 20 74 61 72 67 65 74 20 64 61  fy the target da
0ca0: 74 61 62 61 73 65 20 6d 69 64 20 52 42 55 20 75  tabase mid RBU u
0cb0: 70 64 61 74 65 2c 20 6f 72 20 73 6f 6d 65 0a 2a  pdate, or some.*
0cc0: 2a 20 20 6f 74 68 65 72 20 65 72 72 6f 72 20 6f  *  other error o
0cd0: 63 63 75 72 73 2c 20 74 68 65 20 52 42 55 20 65  ccurs, the RBU e
0ce0: 78 74 65 6e 73 69 6f 6e 20 77 69 6c 6c 20 6b 65  xtension will ke
0cf0: 65 70 20 74 68 72 6f 77 69 6e 67 20 65 72 72 6f  ep throwing erro
0d00: 72 73 2e 20 49 74 27 73 0a 2a 2a 20 20 6e 6f 74  rs. It's.**  not
0d10: 20 72 65 61 6c 6c 79 20 63 6c 65 61 72 20 68 6f   really clear ho
0d20: 77 20 74 6f 20 67 65 74 20 6f 75 74 20 6f 66 20  w to get out of 
0d30: 74 68 69 73 20 73 74 61 74 65 2e 20 54 68 65 20  this state. The 
0d40: 73 79 73 74 65 6d 20 63 6f 75 6c 64 20 6a 75 73  system could jus
0d50: 74 0a 2a 2a 20 20 62 79 20 64 65 6c 65 74 65 20  t.**  by delete 
0d60: 74 68 65 20 52 42 55 20 75 70 64 61 74 65 20 64  the RBU update d
0d70: 61 74 61 62 61 73 65 20 61 6e 64 20 2a 2d 6f 61  atabase and *-oa
0d80: 6c 20 66 69 6c 65 20 61 6e 64 20 68 61 76 65 20  l file and have 
0d90: 74 68 65 20 64 65 76 69 63 65 0a 2a 2a 20 20 64  the device.**  d
0da0: 6f 77 6e 6c 6f 61 64 20 74 68 65 20 75 70 64 61  ownload the upda
0db0: 74 65 20 61 67 61 69 6e 20 61 6e 64 20 73 74 61  te again and sta
0dc0: 72 74 20 6f 76 65 72 2e 0a 2a 2a 0a 2a 2a 20 20  rt over..**.**  
0dd0: 41 74 20 70 72 65 73 65 6e 74 2c 20 66 6f 72 20  At present, for 
0de0: 61 6e 20 55 50 44 41 54 45 2c 20 62 6f 74 68 20  an UPDATE, both 
0df0: 74 68 65 20 6e 65 77 2e 2a 20 61 6e 64 20 6f 6c  the new.* and ol
0e00: 64 2e 2a 20 72 65 63 6f 72 64 73 20 61 72 65 0a  d.* records are.
0e10: 2a 2a 20 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e  **  collected in
0e20: 20 74 68 65 20 72 62 75 5f 78 79 7a 20 74 61 62   the rbu_xyz tab
0e30: 6c 65 2e 20 41 6e 64 20 66 6f 72 20 62 6f 74 68  le. And for both
0e40: 20 55 50 44 41 54 45 73 20 61 6e 64 20 44 45 4c   UPDATEs and DEL
0e50: 45 54 45 73 20 61 6c 6c 0a 2a 2a 20 20 66 69 65  ETEs all.**  fie
0e60: 6c 64 73 20 61 72 65 20 63 6f 6c 6c 65 63 74 65  lds are collecte
0e70: 64 2e 20 20 54 68 69 73 20 6d 65 61 6e 73 20 77  d.  This means w
0e80: 65 27 72 65 20 70 72 6f 62 61 62 6c 79 20 77 72  e're probably wr
0e90: 69 74 69 6e 67 20 61 20 6c 6f 74 20 6d 6f 72 65  iting a lot more
0ea0: 0a 2a 2a 20 20 64 61 74 61 20 74 6f 20 64 69 73  .**  data to dis
0eb0: 6b 20 77 68 65 6e 20 73 61 76 69 6e 67 20 74 68  k when saving th
0ec0: 65 20 73 74 61 74 65 20 6f 66 20 61 6e 20 6f 6e  e state of an on
0ed0: 67 6f 69 6e 67 20 75 70 64 61 74 65 20 74 6f 20  going update to 
0ee0: 74 68 65 20 52 42 55 0a 2a 2a 20 20 75 70 64 61  the RBU.**  upda
0ef0: 74 65 20 64 61 74 61 62 61 73 65 20 74 68 61 6e  te database than
0f00: 20 69 73 20 73 74 72 69 63 74 6c 79 20 6e 65 63   is strictly nec
0f10: 65 73 73 61 72 79 2e 0a 2a 2a 20 0a 2a 2f 0a 0a  essary..** .*/..
0f20: 23 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74  #include <assert
0f30: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74  .h>.#include <st
0f40: 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  ring.h>.#include
0f50: 20 3c 73 74 64 69 6f 2e 68 3e 0a 0a 23 69 6e 63   <stdio.h>..#inc
0f60: 6c 75 64 65 20 22 73 71 6c 69 74 65 33 2e 68 22  lude "sqlite3.h"
0f70: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
0f80: 51 4c 49 54 45 5f 43 4f 52 45 29 20 7c 7c 20 64  QLITE_CORE) || d
0f90: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
0fa0: 41 42 4c 45 5f 52 42 55 29 0a 23 69 6e 63 6c 75  ABLE_RBU).#inclu
0fb0: 64 65 20 22 73 71 6c 69 74 65 33 72 62 75 2e 68  de "sqlite3rbu.h
0fc0: 22 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  "..#if defined(_
0fd0: 57 49 4e 33 32 5f 57 43 45 29 0a 23 69 6e 63 6c  WIN32_WCE).#incl
0fe0: 75 64 65 20 22 77 69 6e 64 6f 77 73 2e 68 22 0a  ude "windows.h".
0ff0: 23 65 6e 64 69 66 0a 0a 2f 2a 20 4d 61 78 69 6d  #endif../* Maxim
1000: 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 70 72 65  um number of pre
1010: 70 61 72 65 64 20 55 50 44 41 54 45 20 73 74 61  pared UPDATE sta
1020: 74 65 6d 65 6e 74 73 20 68 65 6c 64 20 62 79 20  tements held by 
1030: 74 68 69 73 20 6d 6f 64 75 6c 65 20 2a 2f 0a 23  this module */.#
1040: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 52 42  define SQLITE_RB
1050: 55 5f 55 50 44 41 54 45 5f 43 41 43 48 45 53 49  U_UPDATE_CACHESI
1060: 5a 45 20 31 36 0a 0a 2f 2a 0a 2a 2a 20 53 77 61  ZE 16../*.** Swa
1070: 70 20 74 77 6f 20 6f 62 6a 65 63 74 73 20 6f 66  p two objects of
1080: 20 74 79 70 65 20 54 59 50 45 2e 0a 2a 2f 0a 23   type TYPE..*/.#
1090: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
10a0: 54 45 5f 41 4d 41 4c 47 41 4d 41 54 49 4f 4e 29  TE_AMALGAMATION)
10b0: 0a 23 20 64 65 66 69 6e 65 20 53 57 41 50 28 54  .# define SWAP(T
10c0: 59 50 45 2c 41 2c 42 29 20 7b 54 59 50 45 20 74  YPE,A,B) {TYPE t
10d0: 3d 41 3b 20 41 3d 42 3b 20 42 3d 74 3b 7d 0a 23  =A; A=B; B=t;}.#
10e0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
10f0: 20 72 62 75 5f 73 74 61 74 65 20 74 61 62 6c 65   rbu_state table
1100: 20 69 73 20 75 73 65 64 20 74 6f 20 73 61 76 65   is used to save
1110: 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 61 20   the state of a 
1120: 70 61 72 74 69 61 6c 6c 79 20 61 70 70 6c 69 65  partially applie
1130: 64 0a 2a 2a 20 75 70 64 61 74 65 20 73 6f 20 74  d.** update so t
1140: 68 61 74 20 69 74 20 63 61 6e 20 62 65 20 72 65  hat it can be re
1150: 73 75 6d 65 64 20 6c 61 74 65 72 2e 20 54 68 65  sumed later. The
1160: 20 74 61 62 6c 65 20 63 6f 6e 73 69 73 74 73 20   table consists 
1170: 6f 66 20 69 6e 74 65 67 65 72 0a 2a 2a 20 6b 65  of integer.** ke
1180: 79 73 20 6d 61 70 70 65 64 20 74 6f 20 76 61 6c  ys mapped to val
1190: 75 65 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ues as follows:.
11a0: 2a 2a 0a 2a 2a 20 52 42 55 5f 53 54 41 54 45 5f  **.** RBU_STATE_
11b0: 53 54 41 47 45 3a 0a 2a 2a 20 20 20 4d 61 79 20  STAGE:.**   May 
11c0: 62 65 20 73 65 74 20 74 6f 20 69 6e 74 65 67 65  be set to intege
11d0: 72 20 76 61 6c 75 65 73 20 31 2c 20 32 2c 20 34  r values 1, 2, 4
11e0: 20 6f 72 20 35 2e 20 41 73 20 66 6f 6c 6c 6f 77   or 5. As follow
11f0: 73 3a 0a 2a 2a 20 20 20 20 20 20 20 31 3a 20 74  s:.**       1: t
1200: 68 65 20 2a 2d 72 62 75 20 66 69 6c 65 20 69 73  he *-rbu file is
1210: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
1220: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a   construction..*
1230: 2a 20 20 20 20 20 20 20 32 3a 20 74 68 65 20 2a  *       2: the *
1240: 2d 72 62 75 20 66 69 6c 65 20 68 61 73 20 62 65  -rbu file has be
1250: 65 6e 20 63 6f 6e 73 74 72 75 63 74 65 64 2c 20  en constructed, 
1260: 62 75 74 20 6e 6f 74 20 79 65 74 20 6d 6f 76 65  but not yet move
1270: 64 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 74  d .**          t
1280: 6f 20 74 68 65 20 2a 2d 77 61 6c 20 70 61 74 68  o the *-wal path
1290: 2e 0a 2a 2a 20 20 20 20 20 20 20 34 3a 20 74 68  ..**       4: th
12a0: 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 73 20  e checkpoint is 
12b0: 75 6e 64 65 72 77 61 79 2e 0a 2a 2a 20 20 20 20  underway..**    
12c0: 20 20 20 35 3a 20 74 68 65 20 72 62 75 20 75 70     5: the rbu up
12d0: 64 61 74 65 20 68 61 73 20 62 65 65 6e 20 63 68  date has been ch
12e0: 65 63 6b 70 6f 69 6e 74 65 64 2e 0a 2a 2a 0a 2a  eckpointed..**.*
12f0: 2a 20 52 42 55 5f 53 54 41 54 45 5f 54 42 4c 3a  * RBU_STATE_TBL:
1300: 0a 2a 2a 20 20 20 4f 6e 6c 79 20 76 61 6c 69 64  .**   Only valid
1310: 20 69 66 20 53 54 41 47 45 3d 3d 31 2e 20 54 68   if STAGE==1. Th
1320: 65 20 74 61 72 67 65 74 20 64 61 74 61 62 61 73  e target databas
1330: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
1340: 62 6c 65 20 0a 2a 2a 20 20 20 63 75 72 72 65 6e  ble .**   curren
1350: 74 6c 79 20 62 65 69 6e 67 20 77 72 69 74 74 65  tly being writte
1360: 6e 2e 0a 2a 2a 0a 2a 2a 20 52 42 55 5f 53 54 41  n..**.** RBU_STA
1370: 54 45 5f 49 44 58 3a 0a 2a 2a 20 20 20 4f 6e 6c  TE_IDX:.**   Onl
1380: 79 20 76 61 6c 69 64 20 69 66 20 53 54 41 47 45  y valid if STAGE
1390: 3d 3d 31 2e 20 54 68 65 20 74 61 72 67 65 74 20  ==1. The target 
13a0: 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 6f 66  database name of
13b0: 20 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20 20   the index .**  
13c0: 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67   currently being
13d0: 20 77 72 69 74 74 65 6e 2c 20 6f 72 20 4e 55 4c   written, or NUL
13e0: 4c 20 69 66 20 74 68 65 20 6d 61 69 6e 20 74 61  L if the main ta
13f0: 62 6c 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ble is currently
1400: 20 62 65 69 6e 67 0a 2a 2a 20 20 20 75 70 64 61   being.**   upda
1410: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 42 55 5f 53  ted..**.** RBU_S
1420: 54 41 54 45 5f 52 4f 57 3a 0a 2a 2a 20 20 20 4f  TATE_ROW:.**   O
1430: 6e 6c 79 20 76 61 6c 69 64 20 69 66 20 53 54 41  nly valid if STA
1440: 47 45 3d 3d 31 2e 20 4e 75 6d 62 65 72 20 6f 66  GE==1. Number of
1450: 20 72 6f 77 73 20 61 6c 72 65 61 64 79 20 70 72   rows already pr
1460: 6f 63 65 73 73 65 64 20 66 6f 72 20 74 68 65 20  ocessed for the 
1470: 63 75 72 72 65 6e 74 0a 2a 2a 20 20 20 74 61 62  current.**   tab
1480: 6c 65 2f 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20  le/index..**.** 
1490: 52 42 55 5f 53 54 41 54 45 5f 50 52 4f 47 52 45  RBU_STATE_PROGRE
14a0: 53 53 3a 0a 2a 2a 20 20 20 54 72 62 75 6c 20 6e  SS:.**   Trbul n
14b0: 75 6d 62 65 72 20 6f 66 20 73 71 6c 69 74 65 33  umber of sqlite3
14c0: 72 62 75 5f 73 74 65 70 28 29 20 63 61 6c 6c 73  rbu_step() calls
14d0: 20 6d 61 64 65 20 73 6f 20 66 61 72 20 61 73 20   made so far as 
14e0: 70 61 72 74 20 6f 66 20 74 68 69 73 0a 2a 2a 20  part of this.** 
14f0: 20 20 72 62 75 20 75 70 64 61 74 65 2e 0a 2a 2a    rbu update..**
1500: 0a 2a 2a 20 52 42 55 5f 53 54 41 54 45 5f 43 4b  .** RBU_STATE_CK
1510: 50 54 3a 0a 2a 2a 20 20 20 56 61 6c 69 64 20 69  PT:.**   Valid i
1520: 66 20 53 54 41 47 45 3d 3d 34 2e 20 54 68 65 20  f STAGE==4. The 
1530: 36 34 2d 62 69 74 20 63 68 65 63 6b 73 75 6d 20  64-bit checksum 
1540: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1550: 74 68 65 20 77 61 6c 2d 69 6e 64 65 78 0a 2a 2a  the wal-index.**
1560: 20 20 20 68 65 61 64 65 72 20 63 72 65 61 74 65     header create
1570: 64 20 62 79 20 72 65 63 6f 76 65 72 69 6e 67 20  d by recovering 
1580: 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 2e 20  the *-wal file. 
1590: 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20  This is used to 
15a0: 64 65 74 65 63 74 0a 2a 2a 20 20 20 63 61 73 65  detect.**   case
15b0: 73 20 77 68 65 6e 20 61 6e 6f 74 68 65 72 20 63  s when another c
15c0: 6c 69 65 6e 74 20 61 70 70 65 6e 64 73 20 66 72  lient appends fr
15d0: 61 6d 65 73 20 74 6f 20 74 68 65 20 2a 2d 77 61  ames to the *-wa
15e0: 6c 20 66 69 6c 65 20 69 6e 20 74 68 65 0a 2a 2a  l file in the.**
15f0: 20 20 20 6d 69 64 64 6c 65 20 6f 66 20 61 6e 20     middle of an 
1600: 69 6e 63 72 65 6d 65 6e 74 61 6c 20 63 68 65 63  incremental chec
1610: 6b 70 6f 69 6e 74 20 28 61 6e 20 69 6e 63 72 65  kpoint (an incre
1620: 6d 65 6e 74 61 6c 20 63 68 65 63 6b 70 6f 69 6e  mental checkpoin
1630: 74 20 63 61 6e 6e 6f 74 0a 2a 2a 20 20 20 62 65  t cannot.**   be
1640: 20 63 6f 6e 74 69 6e 75 65 64 20 69 66 20 74 68   continued if th
1650: 69 73 20 68 61 70 70 65 6e 73 29 2e 0a 2a 2a 0a  is happens)..**.
1660: 2a 2a 20 52 42 55 5f 53 54 41 54 45 5f 43 4f 4f  ** RBU_STATE_COO
1670: 4b 49 45 3a 0a 2a 2a 20 20 20 56 61 6c 69 64 20  KIE:.**   Valid 
1680: 69 66 20 53 54 41 47 45 3d 3d 31 2e 20 54 68 65  if STAGE==1. The
1690: 20 63 75 72 72 65 6e 74 20 63 68 61 6e 67 65 2d   current change-
16a0: 63 6f 75 6e 74 65 72 20 63 6f 6f 6b 69 65 20 76  counter cookie v
16b0: 61 6c 75 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20  alue in the .** 
16c0: 20 20 74 61 72 67 65 74 20 64 62 20 66 69 6c 65    target db file
16d0: 2e 0a 2a 2a 0a 2a 2a 20 52 42 55 5f 53 54 41 54  ..**.** RBU_STAT
16e0: 45 5f 4f 41 4c 53 5a 3a 0a 2a 2a 20 20 20 56 61  E_OALSZ:.**   Va
16f0: 6c 69 64 20 69 66 20 53 54 41 47 45 3d 3d 31 2e  lid if STAGE==1.
1700: 20 54 68 65 20 73 69 7a 65 20 69 6e 20 62 79 74   The size in byt
1710: 65 73 20 6f 66 20 74 68 65 20 2a 2d 6f 61 6c 20  es of the *-oal 
1720: 66 69 6c 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  file..*/.#define
1730: 20 52 42 55 5f 53 54 41 54 45 5f 53 54 41 47 45   RBU_STATE_STAGE
1740: 20 20 20 20 20 20 20 20 31 0a 23 64 65 66 69 6e          1.#defin
1750: 65 20 52 42 55 5f 53 54 41 54 45 5f 54 42 4c 20  e RBU_STATE_TBL 
1760: 20 20 20 20 20 20 20 20 20 32 0a 23 64 65 66 69           2.#defi
1770: 6e 65 20 52 42 55 5f 53 54 41 54 45 5f 49 44 58  ne RBU_STATE_IDX
1780: 20 20 20 20 20 20 20 20 20 20 33 0a 23 64 65 66            3.#def
1790: 69 6e 65 20 52 42 55 5f 53 54 41 54 45 5f 52 4f  ine RBU_STATE_RO
17a0: 57 20 20 20 20 20 20 20 20 20 20 34 0a 23 64 65  W          4.#de
17b0: 66 69 6e 65 20 52 42 55 5f 53 54 41 54 45 5f 50  fine RBU_STATE_P
17c0: 52 4f 47 52 45 53 53 20 20 20 20 20 35 0a 23 64  ROGRESS     5.#d
17d0: 65 66 69 6e 65 20 52 42 55 5f 53 54 41 54 45 5f  efine RBU_STATE_
17e0: 43 4b 50 54 20 20 20 20 20 20 20 20 20 36 0a 23  CKPT         6.#
17f0: 64 65 66 69 6e 65 20 52 42 55 5f 53 54 41 54 45  define RBU_STATE
1800: 5f 43 4f 4f 4b 49 45 20 20 20 20 20 20 20 37 0a  _COOKIE       7.
1810: 23 64 65 66 69 6e 65 20 52 42 55 5f 53 54 41 54  #define RBU_STAT
1820: 45 5f 4f 41 4c 53 5a 20 20 20 20 20 20 20 20 38  E_OALSZ        8
1830: 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 53 54 41  .#define RBU_STA
1840: 54 45 5f 50 48 41 53 45 4f 4e 45 53 54 45 50 20  TE_PHASEONESTEP 
1850: 39 0a 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 53  9..#define RBU_S
1860: 54 41 47 45 5f 4f 41 4c 20 20 20 20 20 20 20 20  TAGE_OAL        
1870: 20 31 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 53   1.#define RBU_S
1880: 54 41 47 45 5f 4d 4f 56 45 20 20 20 20 20 20 20  TAGE_MOVE       
1890: 20 32 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 53   2.#define RBU_S
18a0: 54 41 47 45 5f 43 41 50 54 55 52 45 20 20 20 20  TAGE_CAPTURE    
18b0: 20 33 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 53   3.#define RBU_S
18c0: 54 41 47 45 5f 43 4b 50 54 20 20 20 20 20 20 20  TAGE_CKPT       
18d0: 20 34 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 53   4.#define RBU_S
18e0: 54 41 47 45 5f 44 4f 4e 45 20 20 20 20 20 20 20  TAGE_DONE       
18f0: 20 35 0a 0a 0a 23 64 65 66 69 6e 65 20 52 42 55   5...#define RBU
1900: 5f 43 52 45 41 54 45 5f 53 54 41 54 45 20 5c 0a  _CREATE_STATE \.
1910: 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20    "CREATE TABLE 
1920: 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20 25 73  IF NOT EXISTS %s
1930: 2e 72 62 75 5f 73 74 61 74 65 28 6b 20 49 4e 54  .rbu_state(k INT
1940: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
1950: 2c 20 76 29 22 0a 0a 74 79 70 65 64 65 66 20 73  , v)"..typedef s
1960: 74 72 75 63 74 20 52 62 75 46 72 61 6d 65 20 52  truct RbuFrame R
1970: 62 75 46 72 61 6d 65 3b 0a 74 79 70 65 64 65 66  buFrame;.typedef
1980: 20 73 74 72 75 63 74 20 52 62 75 4f 62 6a 49 74   struct RbuObjIt
1990: 65 72 20 52 62 75 4f 62 6a 49 74 65 72 3b 0a 74  er RbuObjIter;.t
19a0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 52 62  ypedef struct Rb
19b0: 75 53 74 61 74 65 20 52 62 75 53 74 61 74 65 3b  uState RbuState;
19c0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
19d0: 72 62 75 5f 76 66 73 20 72 62 75 5f 76 66 73 3b  rbu_vfs rbu_vfs;
19e0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
19f0: 72 62 75 5f 66 69 6c 65 20 72 62 75 5f 66 69 6c  rbu_file rbu_fil
1a00: 65 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  e;.typedef struc
1a10: 74 20 52 62 75 55 70 64 61 74 65 53 74 6d 74 20  t RbuUpdateStmt 
1a20: 52 62 75 55 70 64 61 74 65 53 74 6d 74 3b 0a 0a  RbuUpdateStmt;..
1a30: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
1a40: 49 54 45 5f 41 4d 41 4c 47 41 4d 41 54 49 4f 4e  ITE_AMALGAMATION
1a50: 29 0a 74 79 70 65 64 65 66 20 75 6e 73 69 67 6e  ).typedef unsign
1a60: 65 64 20 69 6e 74 20 75 33 32 3b 0a 74 79 70 65  ed int u32;.type
1a70: 64 65 66 20 75 6e 73 69 67 6e 65 64 20 73 68 6f  def unsigned sho
1a80: 72 74 20 75 31 36 3b 0a 74 79 70 65 64 65 66 20  rt u16;.typedef 
1a90: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 75 38  unsigned char u8
1aa0: 3b 0a 74 79 70 65 64 65 66 20 73 71 6c 69 74 65  ;.typedef sqlite
1ab0: 33 5f 69 6e 74 36 34 20 69 36 34 3b 0a 23 65 6e  3_int64 i64;.#en
1ac0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65  dif../*.** These
1ad0: 20 76 61 6c 75 65 73 20 6d 75 73 74 20 6d 61 74   values must mat
1ae0: 63 68 20 74 68 65 20 76 61 6c 75 65 73 20 64 65  ch the values de
1af0: 66 69 6e 65 64 20 69 6e 20 77 61 6c 2e 63 20 66  fined in wal.c f
1b00: 6f 72 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e  or the equivalen
1b10: 74 0a 2a 2a 20 6c 6f 63 6b 73 2e 20 54 68 65 73  t.** locks. Thes
1b20: 65 20 61 72 65 20 6e 6f 74 20 6d 61 67 69 63 20  e are not magic 
1b30: 6e 75 6d 62 65 72 73 20 61 73 20 74 68 65 79 20  numbers as they 
1b40: 61 72 65 20 70 61 72 74 20 6f 66 20 74 68 65 20  are part of the 
1b50: 53 51 4c 69 74 65 20 66 69 6c 65 0a 2a 2a 20 66  SQLite file.** f
1b60: 6f 72 6d 61 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e  ormat..*/.#defin
1b70: 65 20 57 41 4c 5f 4c 4f 43 4b 5f 57 52 49 54 45  e WAL_LOCK_WRITE
1b80: 20 20 30 0a 23 64 65 66 69 6e 65 20 57 41 4c 5f    0.#define WAL_
1b90: 4c 4f 43 4b 5f 43 4b 50 54 20 20 20 31 0a 23 64  LOCK_CKPT   1.#d
1ba0: 65 66 69 6e 65 20 57 41 4c 5f 4c 4f 43 4b 5f 52  efine WAL_LOCK_R
1bb0: 45 41 44 30 20 20 33 0a 0a 23 64 65 66 69 6e 65  EAD0  3..#define
1bc0: 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 52 42   SQLITE_FCNTL_RB
1bd0: 55 43 4e 54 20 20 20 20 35 31 34 39 32 31 36 0a  UCNT    5149216.
1be0: 0a 2f 2a 0a 2a 2a 20 41 20 73 74 72 75 63 74 75  ./*.** A structu
1bf0: 72 65 20 74 6f 20 73 74 6f 72 65 20 76 61 6c 75  re to store valu
1c00: 65 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  es read from the
1c10: 20 72 62 75 5f 73 74 61 74 65 20 74 61 62 6c 65   rbu_state table
1c20: 20 69 6e 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73   in memory..*/.s
1c30: 74 72 75 63 74 20 52 62 75 53 74 61 74 65 20 7b  truct RbuState {
1c40: 0a 20 20 69 6e 74 20 65 53 74 61 67 65 3b 0a 20  .  int eStage;. 
1c50: 20 63 68 61 72 20 2a 7a 54 62 6c 3b 0a 20 20 63   char *zTbl;.  c
1c60: 68 61 72 20 2a 7a 49 64 78 3b 0a 20 20 69 36 34  har *zIdx;.  i64
1c70: 20 69 57 61 6c 43 6b 73 75 6d 3b 0a 20 20 69 6e   iWalCksum;.  in
1c80: 74 20 6e 52 6f 77 3b 0a 20 20 69 36 34 20 6e 50  t nRow;.  i64 nP
1c90: 72 6f 67 72 65 73 73 3b 0a 20 20 75 33 32 20 69  rogress;.  u32 i
1ca0: 43 6f 6f 6b 69 65 3b 0a 20 20 69 36 34 20 69 4f  Cookie;.  i64 iO
1cb0: 61 6c 53 7a 3b 0a 20 20 69 36 34 20 6e 50 68 61  alSz;.  i64 nPha
1cc0: 73 65 4f 6e 65 53 74 65 70 3b 0a 7d 3b 0a 0a 73  seOneStep;.};..s
1cd0: 74 72 75 63 74 20 52 62 75 55 70 64 61 74 65 53  truct RbuUpdateS
1ce0: 74 6d 74 20 7b 0a 20 20 63 68 61 72 20 2a 7a 4d  tmt {.  char *zM
1cf0: 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
1d00: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20          /* Copy 
1d10: 6f 66 20 75 70 64 61 74 65 20 6d 61 73 6b 20 75  of update mask u
1d20: 73 65 64 20 77 69 74 68 20 70 55 70 64 61 74 65  sed with pUpdate
1d30: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
1d40: 6d 74 20 2a 70 55 70 64 61 74 65 3b 20 20 20 20  mt *pUpdate;    
1d50: 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 75 70        /* Last up
1d60: 64 61 74 65 20 73 74 61 74 65 6d 65 6e 74 20 28  date statement (
1d70: 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 52 62  or NULL) */.  Rb
1d80: 75 55 70 64 61 74 65 53 74 6d 74 20 2a 70 4e 65  uUpdateStmt *pNe
1d90: 78 74 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e  xt;.};../*.** An
1da0: 20 69 74 65 72 61 74 6f 72 20 6f 66 20 74 68 69   iterator of thi
1db0: 73 20 74 79 70 65 20 69 73 20 75 73 65 64 20 74  s type is used t
1dc0: 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
1dd0: 68 20 61 6c 6c 20 6f 62 6a 65 63 74 73 20 69 6e  h all objects in
1de0: 0a 2a 2a 20 74 68 65 20 74 61 72 67 65 74 20 64  .** the target d
1df0: 61 74 61 62 61 73 65 20 74 68 61 74 20 72 65 71  atabase that req
1e00: 75 69 72 65 20 75 70 64 61 74 69 6e 67 2e 20 46  uire updating. F
1e10: 6f 72 20 65 61 63 68 20 73 75 63 68 20 74 61 62  or each such tab
1e20: 6c 65 2c 20 74 68 65 0a 2a 2a 20 69 74 65 72 61  le, the.** itera
1e30: 74 6f 72 20 76 69 73 69 74 73 2c 20 69 6e 20 6f  tor visits, in o
1e40: 72 64 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  rder:.**.**     
1e50: 2a 20 74 68 65 20 74 61 62 6c 65 20 69 74 73 65  * the table itse
1e60: 6c 66 2c 20 0a 2a 2a 20 20 20 20 20 2a 20 65 61  lf, .**     * ea
1e70: 63 68 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  ch index of the 
1e80: 74 61 62 6c 65 20 28 7a 65 72 6f 20 6f 72 20 6d  table (zero or m
1e90: 6f 72 65 20 70 6f 69 6e 74 73 20 74 6f 20 76 69  ore points to vi
1ea0: 73 69 74 29 2c 20 61 6e 64 0a 2a 2a 20 20 20 20  sit), and.**    
1eb0: 20 2a 20 61 20 73 70 65 63 69 61 6c 20 22 63 6c   * a special "cl
1ec0: 65 61 6e 75 70 20 74 61 62 6c 65 22 20 73 74 61  eanup table" sta
1ed0: 74 65 2e 0a 2a 2a 0a 2a 2a 20 61 62 49 6e 64 65  te..**.** abInde
1ee0: 78 65 64 3a 0a 2a 2a 20 20 20 49 66 20 74 68 65  xed:.**   If the
1ef0: 20 74 61 62 6c 65 20 68 61 73 20 6e 6f 20 69 6e   table has no in
1f00: 64 65 78 65 73 20 6f 6e 20 69 74 2c 20 61 62 49  dexes on it, abI
1f10: 6e 64 65 78 65 64 20 69 73 20 73 65 74 20 74 6f  ndexed is set to
1f20: 20 4e 55 4c 4c 2e 20 4f 74 68 65 72 77 69 73 65   NULL. Otherwise
1f30: 2c 0a 2a 2a 20 20 20 69 74 20 70 6f 69 6e 74 73  ,.**   it points
1f40: 20 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66 20   to an array of 
1f50: 66 6c 61 67 73 20 6e 54 62 6c 43 6f 6c 20 65 6c  flags nTblCol el
1f60: 65 6d 65 6e 74 73 20 69 6e 20 73 69 7a 65 2e 20  ements in size. 
1f70: 54 68 65 20 66 6c 61 67 20 69 73 0a 2a 2a 20 20  The flag is.**  
1f80: 20 73 65 74 20 66 6f 72 20 65 61 63 68 20 63 6f   set for each co
1f90: 6c 75 6d 6e 20 74 68 61 74 20 69 73 20 65 69 74  lumn that is eit
1fa0: 68 65 72 20 61 20 70 61 72 74 20 6f 66 20 74 68  her a part of th
1fb0: 65 20 50 4b 20 6f 72 20 61 20 70 61 72 74 20 6f  e PK or a part o
1fc0: 66 20 61 6e 0a 2a 2a 20 20 20 69 6e 64 65 78 2e  f an.**   index.
1fd0: 20 4f 72 20 63 6c 65 61 72 20 6f 74 68 65 72 77   Or clear otherw
1fe0: 69 73 65 2e 0a 2a 2a 20 20 20 0a 2a 2f 0a 73 74  ise..**   .*/.st
1ff0: 72 75 63 74 20 52 62 75 4f 62 6a 49 74 65 72 20  ruct RbuObjIter 
2000: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
2010: 20 2a 70 54 62 6c 49 74 65 72 3b 20 20 20 20 20   *pTblIter;     
2020: 20 20 20 20 2f 2a 20 49 74 65 72 61 74 65 20 74      /* Iterate t
2030: 68 72 6f 75 67 68 20 74 61 62 6c 65 73 20 2a 2f  hrough tables */
2040: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
2050: 2a 70 49 64 78 49 74 65 72 3b 20 20 20 20 20 20  *pIdxIter;      
2060: 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 74 65 72     /* Index iter
2070: 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 54  ator */.  int nT
2080: 62 6c 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20  blCol;          
2090: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
20a0: 65 20 6f 66 20 61 7a 54 62 6c 43 6f 6c 5b 5d 20  e of azTblCol[] 
20b0: 61 72 72 61 79 20 2a 2f 0a 20 20 63 68 61 72 20  array */.  char 
20c0: 2a 2a 61 7a 54 62 6c 43 6f 6c 3b 20 20 20 20 20  **azTblCol;     
20d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
20e0: 72 61 79 20 6f 66 20 75 6e 71 75 6f 74 65 64 20  ray of unquoted 
20f0: 74 61 72 67 65 74 20 63 6f 6c 75 6d 6e 20 6e 61  target column na
2100: 6d 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  mes */.  char **
2110: 61 7a 54 62 6c 54 79 70 65 3b 20 20 20 20 20 20  azTblType;      
2120: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
2130: 79 20 6f 66 20 74 61 72 67 65 74 20 63 6f 6c 75  y of target colu
2140: 6d 6e 20 74 79 70 65 73 20 2a 2f 0a 20 20 69 6e  mn types */.  in
2150: 74 20 2a 61 69 53 72 63 4f 72 64 65 72 3b 20 20  t *aiSrcOrder;  
2160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2170: 20 73 72 63 20 74 61 62 6c 65 20 63 6f 6c 20 2d   src table col -
2180: 3e 20 74 61 72 67 65 74 20 74 61 62 6c 65 20 63  > target table c
2190: 6f 6c 20 2a 2f 0a 20 20 75 38 20 2a 61 62 54 62  ol */.  u8 *abTb
21a0: 6c 50 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  lPk;            
21b0: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
21c0: 20 6f 66 20 66 6c 61 67 73 2c 20 73 65 74 20 6f   of flags, set o
21d0: 6e 20 74 61 72 67 65 74 20 50 4b 20 63 6f 6c 75  n target PK colu
21e0: 6d 6e 73 20 2a 2f 0a 20 20 75 38 20 2a 61 62 4e  mns */.  u8 *abN
21f0: 6f 74 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20 20  otNull;         
2200: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
2210: 79 20 6f 66 20 66 6c 61 67 73 2c 20 73 65 74 20  y of flags, set 
2220: 6f 6e 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75  on NOT NULL colu
2230: 6d 6e 73 20 2a 2f 0a 20 20 75 38 20 2a 61 62 49  mns */.  u8 *abI
2240: 6e 64 65 78 65 64 3b 20 20 20 20 20 20 20 20 20  ndexed;         
2250: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
2260: 79 20 6f 66 20 66 6c 61 67 73 2c 20 73 65 74 20  y of flags, set 
2270: 6f 6e 20 69 6e 64 65 78 65 64 20 26 20 50 4b 20  on indexed & PK 
2280: 63 6f 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 65 54  cols */.  int eT
2290: 79 70 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ype;            
22a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
22b0: 6c 65 20 74 79 70 65 20 2d 20 61 6e 20 52 42 55  le type - an RBU
22c0: 5f 50 4b 5f 58 58 58 20 76 61 6c 75 65 20 2a 2f  _PK_XXX value */
22d0: 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 76 61  ..  /* Output va
22e0: 72 69 61 62 6c 65 73 2e 20 7a 54 62 6c 3d 3d 30  riables. zTbl==0
22f0: 20 69 6d 70 6c 69 65 73 20 45 4f 46 2e 20 2a 2f   implies EOF. */
2300: 0a 20 20 69 6e 74 20 62 43 6c 65 61 6e 75 70 3b  .  int bCleanup;
2310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2320: 20 20 20 2f 2a 20 54 72 75 65 20 69 6e 20 22 63     /* True in "c
2330: 6c 65 61 6e 75 70 22 20 73 74 61 74 65 20 2a 2f  leanup" state */
2340: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2350: 54 62 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Tbl;            
2360: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 61     /* Name of ta
2370: 72 67 65 74 20 64 62 20 74 61 62 6c 65 20 2a 2f  rget db table */
2380: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2390: 44 61 74 61 54 62 6c 3b 20 20 20 20 20 20 20 20  DataTbl;        
23a0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 72 62     /* Name of rb
23b0: 75 20 64 62 20 74 61 62 6c 65 20 28 6f 72 20 6e  u db table (or n
23c0: 75 6c 6c 29 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ull) */.  const 
23d0: 63 68 61 72 20 2a 7a 49 64 78 3b 20 20 20 20 20  char *zIdx;     
23e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
23f0: 65 20 6f 66 20 74 61 72 67 65 74 20 64 62 20 69  e of target db i
2400: 6e 64 65 78 20 28 6f 72 20 6e 75 6c 6c 29 20 2a  ndex (or null) *
2410: 2f 0a 20 20 69 6e 74 20 69 54 6e 75 6d 3b 20 20  /.  int iTnum;  
2420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2430: 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
2440: 20 6f 66 20 63 75 72 72 65 6e 74 20 6f 62 6a 65   of current obje
2450: 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 50 6b 54  ct */.  int iPkT
2460: 6e 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  num;            
2470: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 65 54          /* If eT
2480: 79 70 65 3d 3d 45 58 54 45 52 4e 41 4c 2c 20 72  ype==EXTERNAL, r
2490: 6f 6f 74 20 6f 66 20 50 4b 20 69 6e 64 65 78 20  oot of PK index 
24a0: 2a 2f 0a 20 20 69 6e 74 20 62 55 6e 69 71 75 65  */.  int bUnique
24b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
24c0: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
24d0: 69 6e 64 65 78 20 69 73 20 75 6e 69 71 75 65 20  index is unique 
24e0: 2a 2f 0a 20 20 69 6e 74 20 6e 49 6e 64 65 78 3b  */.  int nIndex;
24f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2500: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2510: 66 20 61 75 78 2e 20 69 6e 64 65 78 65 73 20 6f  f aux. indexes o
2520: 6e 20 74 61 62 6c 65 20 7a 54 62 6c 20 2a 2f 0a  n table zTbl */.
2530: 0a 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 73  .  /* Statements
2540: 20 63 72 65 61 74 65 64 20 62 79 20 72 62 75 4f   created by rbuO
2550: 62 6a 49 74 65 72 50 72 65 70 61 72 65 41 6c 6c  bjIterPrepareAll
2560: 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c  () */.  int nCol
2570: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2580: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2590: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
25a0: 63 75 72 72 65 6e 74 20 6f 62 6a 65 63 74 20 2a  current object *
25b0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  /.  sqlite3_stmt
25c0: 20 2a 70 53 65 6c 65 63 74 3b 20 20 20 20 20 20   *pSelect;      
25d0: 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 20 64 61      /* Source da
25e0: 74 61 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ta */.  sqlite3_
25f0: 73 74 6d 74 20 2a 70 49 6e 73 65 72 74 3b 20 20  stmt *pInsert;  
2600: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 65          /* State
2610: 6d 65 6e 74 20 66 6f 72 20 49 4e 53 45 52 54 20  ment for INSERT 
2620: 6f 70 65 72 61 74 69 6f 6e 73 20 2a 2f 0a 20 20  operations */.  
2630: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 44  sqlite3_stmt *pD
2640: 65 6c 65 74 65 3b 20 20 20 20 20 20 20 20 20 20  elete;          
2650: 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20 66 6f 72  /* Statement for
2660: 20 44 45 4c 45 54 45 20 6f 70 73 20 2a 2f 0a 20   DELETE ops */. 
2670: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
2680: 54 6d 70 49 6e 73 65 72 74 3b 20 20 20 20 20 20  TmpInsert;      
2690: 20 2f 2a 20 49 6e 73 65 72 74 20 69 6e 74 6f 20   /* Insert into 
26a0: 72 62 75 5f 74 6d 70 5f 24 7a 44 61 74 61 54 62  rbu_tmp_$zDataTb
26b0: 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 4c 61 73 74 20  l */..  /* Last 
26c0: 55 50 44 41 54 45 20 75 73 65 64 20 28 66 6f 72  UPDATE used (for
26d0: 20 50 4b 20 62 2d 74 72 65 65 20 75 70 64 61 74   PK b-tree updat
26e0: 65 73 20 6f 6e 6c 79 29 2c 20 6f 72 20 4e 55 4c  es only), or NUL
26f0: 4c 2e 20 2a 2f 0a 20 20 52 62 75 55 70 64 61 74  L. */.  RbuUpdat
2700: 65 53 74 6d 74 20 2a 70 52 62 75 55 70 64 61 74  eStmt *pRbuUpdat
2710: 65 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c  e;.};../*.** Val
2720: 75 65 73 20 66 6f 72 20 52 62 75 4f 62 6a 49 74  ues for RbuObjIt
2730: 65 72 2e 65 54 79 70 65 0a 2a 2a 0a 2a 2a 20 20  er.eType.**.**  
2740: 20 20 20 30 3a 20 54 61 62 6c 65 20 64 6f 65 73     0: Table does
2750: 20 6e 6f 74 20 65 78 69 73 74 20 28 65 72 72 6f   not exist (erro
2760: 72 29 0a 2a 2a 20 20 20 20 20 31 3a 20 54 61 62  r).**     1: Tab
2770: 6c 65 20 68 61 73 20 61 6e 20 69 6d 70 6c 69 63  le has an implic
2780: 69 74 20 72 6f 77 69 64 2e 0a 2a 2a 20 20 20 20  it rowid..**    
2790: 20 32 3a 20 54 61 62 6c 65 20 68 61 73 20 61 6e   2: Table has an
27a0: 20 65 78 70 6c 69 63 69 74 20 49 50 4b 20 63 6f   explicit IPK co
27b0: 6c 75 6d 6e 2e 0a 2a 2a 20 20 20 20 20 33 3a 20  lumn..**     3: 
27c0: 54 61 62 6c 65 20 68 61 73 20 61 6e 20 65 78 74  Table has an ext
27d0: 65 72 6e 61 6c 20 50 4b 20 69 6e 64 65 78 2e 0a  ernal PK index..
27e0: 2a 2a 20 20 20 20 20 34 3a 20 54 61 62 6c 65 20  **     4: Table 
27f0: 69 73 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44  is WITHOUT ROWID
2800: 2e 0a 2a 2a 20 20 20 20 20 35 3a 20 54 61 62 6c  ..**     5: Tabl
2810: 65 20 69 73 20 61 20 76 69 72 74 75 61 6c 20 74  e is a virtual t
2820: 61 62 6c 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  able..*/.#define
2830: 20 52 42 55 5f 50 4b 5f 4e 4f 54 41 42 4c 45 20   RBU_PK_NOTABLE 
2840: 20 20 20 20 20 20 20 30 0a 23 64 65 66 69 6e 65         0.#define
2850: 20 52 42 55 5f 50 4b 5f 4e 4f 4e 45 20 20 20 20   RBU_PK_NONE    
2860: 20 20 20 20 20 20 20 31 0a 23 64 65 66 69 6e 65         1.#define
2870: 20 52 42 55 5f 50 4b 5f 49 50 4b 20 20 20 20 20   RBU_PK_IPK     
2880: 20 20 20 20 20 20 20 32 0a 23 64 65 66 69 6e 65         2.#define
2890: 20 52 42 55 5f 50 4b 5f 45 58 54 45 52 4e 41 4c   RBU_PK_EXTERNAL
28a0: 20 20 20 20 20 20 20 33 0a 23 64 65 66 69 6e 65         3.#define
28b0: 20 52 42 55 5f 50 4b 5f 57 49 54 48 4f 55 54 5f   RBU_PK_WITHOUT_
28c0: 52 4f 57 49 44 20 20 34 0a 23 64 65 66 69 6e 65  ROWID  4.#define
28d0: 20 52 42 55 5f 50 4b 5f 56 54 41 42 20 20 20 20   RBU_PK_VTAB    
28e0: 20 20 20 20 20 20 20 35 0a 0a 0a 2f 2a 0a 2a 2a         5.../*.**
28f0: 20 57 69 74 68 69 6e 20 74 68 65 20 52 42 55 5f   Within the RBU_
2900: 53 54 41 47 45 5f 4f 41 4c 20 73 74 61 67 65 2c  STAGE_OAL stage,
2910: 20 65 61 63 68 20 63 61 6c 6c 20 74 6f 20 73 71   each call to sq
2920: 6c 69 74 65 33 72 62 75 5f 73 74 65 70 28 29 20  lite3rbu_step() 
2930: 70 65 72 66 6f 72 6d 73 0a 2a 2a 20 6f 6e 65 20  performs.** one 
2940: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
2950: 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2f 0a   operations..*/.
2960: 23 64 65 66 69 6e 65 20 52 42 55 5f 49 4e 53 45  #define RBU_INSE
2970: 52 54 20 20 20 20 20 31 20 20 20 20 20 20 20 20  RT     1        
2980: 20 20 2f 2a 20 49 6e 73 65 72 74 20 6f 6e 20 61    /* Insert on a
2990: 20 6d 61 69 6e 20 74 61 62 6c 65 20 62 2d 74 72   main table b-tr
29a0: 65 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 52 42  ee */.#define RB
29b0: 55 5f 44 45 4c 45 54 45 20 20 20 20 20 32 20 20  U_DELETE     2  
29c0: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74          /* Delet
29d0: 65 20 61 20 72 6f 77 20 66 72 6f 6d 20 61 20 6d  e a row from a m
29e0: 61 69 6e 20 74 61 62 6c 65 20 62 2d 74 72 65 65  ain table b-tree
29f0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 52 42 55 5f   */.#define RBU_
2a00: 52 45 50 4c 41 43 45 20 20 20 20 33 20 20 20 20  REPLACE    3    
2a10: 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20        /* Delete 
2a20: 61 6e 64 20 74 68 65 6e 20 69 6e 73 65 72 74 20  and then insert 
2a30: 61 20 72 6f 77 20 2a 2f 0a 23 64 65 66 69 6e 65  a row */.#define
2a40: 20 52 42 55 5f 49 44 58 5f 44 45 4c 45 54 45 20   RBU_IDX_DELETE 
2a50: 34 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65  4          /* De
2a60: 6c 65 74 65 20 61 20 72 6f 77 20 66 72 6f 6d 20  lete a row from 
2a70: 61 6e 20 61 75 78 2e 20 69 6e 64 65 78 20 62 2d  an aux. index b-
2a80: 74 72 65 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  tree */.#define 
2a90: 52 42 55 5f 49 44 58 5f 49 4e 53 45 52 54 20 35  RBU_IDX_INSERT 5
2aa0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73            /* Ins
2ab0: 65 72 74 20 6f 6e 20 61 6e 20 61 75 78 2e 20 69  ert on an aux. i
2ac0: 6e 64 65 78 20 62 2d 74 72 65 65 20 2a 2f 0a 0a  ndex b-tree */..
2ad0: 23 64 65 66 69 6e 65 20 52 42 55 5f 55 50 44 41  #define RBU_UPDA
2ae0: 54 45 20 20 20 20 20 36 20 20 20 20 20 20 20 20  TE     6        
2af0: 20 20 2f 2a 20 55 70 64 61 74 65 20 61 20 72 6f    /* Update a ro
2b00: 77 20 69 6e 20 61 20 6d 61 69 6e 20 74 61 62 6c  w in a main tabl
2b10: 65 20 62 2d 74 72 65 65 20 2a 2f 0a 0a 2f 2a 0a  e b-tree */../*.
2b20: 2a 2a 20 41 20 73 69 6e 67 6c 65 20 73 74 65 70  ** A single step
2b30: 20 6f 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74   of an increment
2b40: 61 6c 20 63 68 65 63 6b 70 6f 69 6e 74 20 2d 20  al checkpoint - 
2b50: 66 72 61 6d 65 20 69 57 61 6c 46 72 61 6d 65 20  frame iWalFrame 
2b60: 6f 66 20 74 68 65 20 77 61 6c 0a 2a 2a 20 66 69  of the wal.** fi
2b70: 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 70  le should be cop
2b80: 69 65 64 20 74 6f 20 70 61 67 65 20 69 44 62 50  ied to page iDbP
2b90: 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
2ba0: 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 72  ase file..*/.str
2bb0: 75 63 74 20 52 62 75 46 72 61 6d 65 20 7b 0a 20  uct RbuFrame {. 
2bc0: 20 75 33 32 20 69 44 62 50 61 67 65 3b 0a 20 20   u32 iDbPage;.  
2bd0: 75 33 32 20 69 57 61 6c 46 72 61 6d 65 3b 0a 7d  u32 iWalFrame;.}
2be0: 3b 0a 0a 2f 2a 0a 2a 2a 20 52 42 55 20 68 61 6e  ;../*.** RBU han
2bf0: 64 6c 65 2e 0a 2a 2a 0a 2a 2a 20 6e 50 68 61 73  dle..**.** nPhas
2c00: 65 4f 6e 65 53 74 65 70 3a 0a 2a 2a 20 20 20 49  eOneStep:.**   I
2c10: 66 20 74 68 65 20 52 42 55 20 64 61 74 61 62 61  f the RBU databa
2c20: 73 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 72  se contains an r
2c30: 62 75 5f 63 6f 75 6e 74 20 74 61 62 6c 65 2c 20  bu_count table, 
2c40: 74 68 69 73 20 76 61 6c 75 65 20 69 73 20 73 65  this value is se
2c50: 74 20 74 6f 0a 2a 2a 20 20 20 61 20 72 75 6e 6e  t to.**   a runn
2c60: 69 6e 67 20 65 73 74 69 6d 61 74 65 20 6f 66 20  ing estimate of 
2c70: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 2d  the number of b-
2c80: 74 72 65 65 20 6f 70 65 72 61 74 69 6f 6e 73 20  tree operations 
2c90: 72 65 71 75 69 72 65 64 20 74 6f 20 0a 2a 2a 20  required to .** 
2ca0: 20 20 66 69 6e 69 73 68 20 70 6f 70 75 6c 61 74    finish populat
2cb0: 69 6e 67 20 74 68 65 20 2a 2d 6f 61 6c 20 66 69  ing the *-oal fi
2cc0: 6c 65 2e 20 54 68 69 73 20 61 6c 6c 6f 77 73 20  le. This allows 
2cd0: 74 68 65 20 73 71 6c 69 74 65 33 5f 62 70 5f 70  the sqlite3_bp_p
2ce0: 72 6f 67 72 65 73 73 28 29 0a 2a 2a 20 20 20 41  rogress().**   A
2cf0: 50 49 20 74 6f 20 63 61 6c 63 75 6c 61 74 65 20  PI to calculate 
2d00: 74 68 65 20 70 65 72 6d 79 72 69 61 64 61 67 65  the permyriadage
2d10: 20 70 72 6f 67 72 65 73 73 20 6f 66 20 70 6f 70   progress of pop
2d20: 75 6c 61 74 69 6e 67 20 74 68 65 20 2a 2d 6f 61  ulating the *-oa
2d30: 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 75 73 69 6e  l file.**   usin
2d40: 67 20 74 68 65 20 66 6f 72 6d 75 6c 61 3a 0a 2a  g the formula:.*
2d50: 2a 0a 2a 2a 20 20 20 20 20 70 65 72 6d 79 72 69  *.**     permyri
2d60: 61 64 61 67 65 20 3d 20 28 31 30 30 30 30 20 2a  adage = (10000 *
2d70: 20 6e 50 72 6f 67 72 65 73 73 29 20 2f 20 6e 50   nProgress) / nP
2d80: 68 61 73 65 4f 6e 65 53 74 65 70 0a 2a 2a 0a 2a  haseOneStep.**.*
2d90: 2a 20 20 20 6e 50 68 61 73 65 4f 6e 65 53 74 65  *   nPhaseOneSte
2da0: 70 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  p is initialized
2db0: 20 74 6f 20 74 68 65 20 73 75 6d 20 6f 66 3a 0a   to the sum of:.
2dc0: 2a 2a 0a 2a 2a 20 20 20 20 20 6e 52 6f 77 20 2a  **.**     nRow *
2dd0: 20 28 6e 49 6e 64 65 78 20 2b 20 31 29 0a 2a 2a   (nIndex + 1).**
2de0: 0a 2a 2a 20 20 20 66 6f 72 20 61 6c 6c 20 73 6f  .**   for all so
2df0: 75 72 63 65 20 74 61 62 6c 65 73 20 69 6e 20 74  urce tables in t
2e00: 68 65 20 52 42 55 20 64 61 74 61 62 61 73 65 2c  he RBU database,
2e10: 20 77 68 65 72 65 20 6e 52 6f 77 20 69 73 20 74   where nRow is t
2e20: 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 20 20 6f  he number.**   o
2e30: 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 73 6f  f rows in the so
2e40: 75 72 63 65 20 74 61 62 6c 65 20 61 6e 64 20 6e  urce table and n
2e50: 49 6e 64 65 78 20 74 68 65 20 6e 75 6d 62 65 72  Index the number
2e60: 20 6f 66 20 69 6e 64 65 78 65 73 20 6f 6e 20 74   of indexes on t
2e70: 68 65 0a 2a 2a 20 20 20 63 6f 72 72 65 73 70 6f  he.**   correspo
2e80: 6e 64 69 6e 67 20 74 61 72 67 65 74 20 64 61 74  nding target dat
2e90: 61 62 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a  abase table..**.
2ea0: 2a 2a 20 20 20 54 68 69 73 20 65 73 74 69 6d 61  **   This estima
2eb0: 74 65 20 69 73 20 61 63 63 75 72 61 74 65 20 69  te is accurate i
2ec0: 66 20 74 68 65 20 52 42 55 20 75 70 64 61 74 65  f the RBU update
2ed0: 20 63 6f 6e 73 69 73 74 73 20 65 6e 74 69 72 65   consists entire
2ee0: 6c 79 20 6f 66 0a 2a 2a 20 20 20 49 4e 53 45 52  ly of.**   INSER
2ef0: 54 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 48 6f  T operations. Ho
2f00: 77 65 76 65 72 2c 20 69 74 20 69 73 20 69 6e 61  wever, it is ina
2f10: 63 63 75 72 61 74 65 20 69 66 3a 0a 2a 2a 0a 2a  ccurate if:.**.*
2f20: 2a 20 20 20 20 20 2a 20 74 68 65 20 52 42 55 20  *     * the RBU 
2f30: 75 70 64 61 74 65 20 63 6f 6e 74 61 69 6e 73 20  update contains 
2f40: 61 6e 79 20 55 50 44 41 54 45 20 6f 70 65 72 61  any UPDATE opera
2f50: 74 69 6f 6e 73 2e 20 49 66 20 74 68 65 20 50 4b  tions. If the PK
2f60: 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 20 20   specified.**   
2f70: 20 20 20 20 66 6f 72 20 61 6e 20 55 50 44 41 54      for an UPDAT
2f80: 45 20 6f 70 65 72 61 74 69 6f 6e 20 64 6f 65 73  E operation does
2f90: 20 6e 6f 74 20 65 78 69 73 74 20 69 6e 20 74 68   not exist in th
2fa0: 65 20 74 61 72 67 65 74 20 74 61 62 6c 65 2c 20  e target table, 
2fb0: 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20 6e 6f  then.**       no
2fc0: 20 62 2d 74 72 65 65 20 6f 70 65 72 61 74 69 6f   b-tree operatio
2fd0: 6e 73 20 61 72 65 20 72 65 71 75 69 72 65 64 20  ns are required 
2fe0: 6f 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 73  on index b-trees
2ff0: 2e 20 4f 72 20 69 66 20 74 68 65 20 0a 2a 2a 20  . Or if the .** 
3000: 20 20 20 20 20 20 73 70 65 63 69 66 69 65 64 20        specified 
3010: 50 4b 20 64 6f 65 73 20 65 78 69 73 74 2c 20 74  PK does exist, t
3020: 68 65 6e 20 28 6e 49 6e 64 65 78 2a 32 29 20 73  hen (nIndex*2) s
3030: 75 63 68 20 6f 70 65 72 61 74 69 6f 6e 73 20 61  uch operations a
3040: 72 65 0a 2a 2a 20 20 20 20 20 20 20 72 65 71 75  re.**       requ
3050: 69 72 65 64 20 28 6f 6e 65 20 64 65 6c 65 74 65  ired (one delete
3060: 20 61 6e 64 20 6f 6e 65 20 69 6e 73 65 72 74 20   and one insert 
3070: 6f 6e 20 65 61 63 68 20 69 6e 64 65 78 20 62 2d  on each index b-
3080: 74 72 65 65 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  tree)..**.**    
3090: 20 2a 20 74 68 65 20 52 42 55 20 75 70 64 61 74   * the RBU updat
30a0: 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 44  e contains any D
30b0: 45 4c 45 54 45 20 6f 70 65 72 61 74 69 6f 6e 73  ELETE operations
30c0: 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 73   for which the s
30d0: 70 65 63 69 66 69 65 64 0a 2a 2a 20 20 20 20 20  pecified.**     
30e0: 20 20 50 4b 20 64 6f 65 73 20 6e 6f 74 20 65 78    PK does not ex
30f0: 69 73 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ist. In this cas
3100: 65 20 6e 6f 20 6f 70 65 72 61 74 69 6f 6e 73 20  e no operations 
3110: 61 72 65 20 72 65 71 75 69 72 65 64 20 6f 6e 20  are required on 
3120: 69 6e 64 65 78 0a 2a 2a 20 20 20 20 20 20 20 62  index.**       b
3130: 2d 74 72 65 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  -trees..**.**   
3140: 20 20 2a 20 74 68 65 20 52 42 55 20 75 70 64 61    * the RBU upda
3150: 74 65 20 63 6f 6e 74 61 69 6e 73 20 52 45 50 4c  te contains REPL
3160: 41 43 45 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20  ACE operations. 
3170: 54 68 65 73 65 20 61 72 65 20 73 69 6d 69 6c 61  These are simila
3180: 72 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20 55 50  r to.**       UP
3190: 44 41 54 45 20 6f 70 65 72 61 74 69 6f 6e 73 2e  DATE operations.
31a0: 0a 2a 2a 0a 2a 2a 20 20 20 6e 50 68 61 73 65 4f  .**.**   nPhaseO
31b0: 6e 65 53 74 65 70 20 69 73 20 75 70 64 61 74 65  neStep is update
31c0: 64 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72  d to account for
31d0: 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20   the conditions 
31e0: 61 62 6f 76 65 20 64 75 72 69 6e 67 20 74 68 65  above during the
31f0: 0a 2a 2a 20 20 20 66 69 72 73 74 20 70 61 73 73  .**   first pass
3200: 20 6f 66 20 65 61 63 68 20 73 6f 75 72 63 65 20   of each source 
3210: 74 61 62 6c 65 2e 20 54 68 65 20 75 70 64 61 74  table. The updat
3220: 65 64 20 6e 50 68 61 73 65 4f 6e 65 53 74 65 70  ed nPhaseOneStep
3230: 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20 20 20 73   value is.**   s
3240: 74 6f 72 65 64 20 69 6e 20 74 68 65 20 72 62 75  tored in the rbu
3250: 5f 73 74 61 74 65 20 74 61 62 6c 65 20 69 66 20  _state table if 
3260: 74 68 65 20 52 42 55 20 75 70 64 61 74 65 20 69  the RBU update i
3270: 73 20 73 75 73 70 65 6e 64 65 64 2e 0a 2a 2f 0a  s suspended..*/.
3280: 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 72 62  struct sqlite3rb
3290: 75 20 7b 0a 20 20 69 6e 74 20 65 53 74 61 67 65  u {.  int eStage
32a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
32b0: 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f        /* Value o
32c0: 66 20 52 42 55 5f 53 54 41 54 45 5f 53 54 41 47  f RBU_STATE_STAG
32d0: 45 20 66 69 65 6c 64 20 2a 2f 0a 20 20 73 71 6c  E field */.  sql
32e0: 69 74 65 33 20 2a 64 62 4d 61 69 6e 3b 20 20 20  ite3 *dbMain;   
32f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3300: 74 61 72 67 65 74 20 64 61 74 61 62 61 73 65 20  target database 
3310: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 73 71 6c 69  handle */.  sqli
3320: 74 65 33 20 2a 64 62 52 62 75 3b 20 20 20 20 20  te3 *dbRbu;     
3330: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72              /* r
3340: 62 75 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  bu database hand
3350: 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54  le */.  char *zT
3360: 61 72 67 65 74 3b 20 20 20 20 20 20 20 20 20 20  arget;          
3370: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 74 68 20          /* Path 
3380: 74 6f 20 74 61 72 67 65 74 20 64 62 20 2a 2f 0a  to target db */.
3390: 20 20 63 68 61 72 20 2a 7a 52 62 75 3b 20 20 20    char *zRbu;   
33a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33b0: 20 20 2f 2a 20 50 61 74 68 20 74 6f 20 72 62 75    /* Path to rbu
33c0: 20 64 62 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a   db */.  char *z
33d0: 53 74 61 74 65 3b 20 20 20 20 20 20 20 20 20 20  State;          
33e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 74 68           /* Path
33f0: 20 74 6f 20 73 74 61 74 65 20 64 62 20 28 6f 72   to state db (or
3400: 20 4e 55 4c 4c 20 69 66 20 7a 52 62 75 29 20 2a   NULL if zRbu) *
3410: 2f 0a 20 20 63 68 61 72 20 7a 53 74 61 74 65 44  /.  char zStateD
3420: 62 5b 35 5d 3b 20 20 20 20 20 20 20 20 20 20 20  b[5];           
3430: 20 20 20 20 2f 2a 20 44 62 20 6e 61 6d 65 20 66      /* Db name f
3440: 6f 72 20 73 74 61 74 65 20 28 22 73 74 61 74 22  or state ("stat"
3450: 20 6f 72 20 22 6d 61 69 6e 22 29 20 2a 2f 0a 20   or "main") */. 
3460: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
3470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3480: 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e   /* Value return
3490: 65 64 20 62 79 20 6c 61 73 74 20 72 62 75 5f 73  ed by last rbu_s
34a0: 74 65 70 28 29 20 63 61 6c 6c 20 2a 2f 0a 20 20  tep() call */.  
34b0: 63 68 61 72 20 2a 7a 45 72 72 6d 73 67 3b 20 20  char *zErrmsg;  
34c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34d0: 2f 2a 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65  /* Error message
34e0: 20 69 66 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f   if rc!=SQLITE_O
34f0: 4b 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 74 65 70  K */.  int nStep
3500: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3510: 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 70         /* Rows p
3520: 72 6f 63 65 73 73 65 64 20 66 6f 72 20 63 75 72  rocessed for cur
3530: 72 65 6e 74 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  rent object */. 
3540: 20 69 6e 74 20 6e 50 72 6f 67 72 65 73 73 3b 20   int nProgress; 
3550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3560: 20 2f 2a 20 52 6f 77 73 20 70 72 6f 63 65 73 73   /* Rows process
3570: 65 64 20 66 6f 72 20 61 6c 6c 20 6f 62 6a 65 63  ed for all objec
3580: 74 73 20 2a 2f 0a 20 20 52 62 75 4f 62 6a 49 74  ts */.  RbuObjIt
3590: 65 72 20 6f 62 6a 69 74 65 72 3b 20 20 20 20 20  er objiter;     
35a0: 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
35b0: 74 6f 72 20 66 6f 72 20 73 6b 69 70 70 69 6e 67  tor for skipping
35c0: 20 74 68 72 6f 75 67 68 20 74 62 6c 2f 69 64 78   through tbl/idx
35d0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
35e0: 20 2a 7a 56 66 73 4e 61 6d 65 3b 20 20 20 20 20   *zVfsName;     
35f0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
3600: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63   automatically c
3610: 72 65 61 74 65 64 20 72 62 75 20 76 66 73 20 2a  reated rbu vfs *
3620: 2f 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 54  /.  rbu_file *pT
3630: 61 72 67 65 74 46 64 3b 20 20 20 20 20 20 20 20  argetFd;        
3640: 20 20 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64      /* File hand
3650: 6c 65 20 6f 70 65 6e 20 6f 6e 20 74 61 72 67 65  le open on targe
3660: 74 20 64 62 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  t db */.  int nP
3670: 61 67 65 50 65 72 53 65 63 74 6f 72 3b 20 20 20  agePerSector;   
3680: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
3690: 65 73 20 70 65 72 20 73 65 63 74 6f 72 20 66 6f  es per sector fo
36a0: 72 20 70 54 61 72 67 65 74 46 64 20 2a 2f 0a 20  r pTargetFd */. 
36b0: 20 69 36 34 20 69 4f 61 6c 53 7a 3b 0a 20 20 69   i64 iOalSz;.  i
36c0: 36 34 20 6e 50 68 61 73 65 4f 6e 65 53 74 65 70  64 nPhaseOneStep
36d0: 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  ;..  /* The foll
36e0: 6f 77 69 6e 67 20 73 74 61 74 65 20 76 61 72 69  owing state vari
36f0: 61 62 6c 65 73 20 61 72 65 20 75 73 65 64 20 61  ables are used a
3700: 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 69 6e  s part of the in
3710: 63 72 65 6d 65 6e 74 61 6c 0a 20 20 2a 2a 20 63  cremental.  ** c
3720: 68 65 63 6b 70 6f 69 6e 74 20 73 74 61 67 65 20  heckpoint stage 
3730: 28 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41  (eStage==RBU_STA
3740: 47 45 5f 43 4b 50 54 29 2e 20 53 65 65 20 63 6f  GE_CKPT). See co
3750: 6d 6d 65 6e 74 73 20 73 75 72 72 6f 75 6e 64 69  mments surroundi
3760: 6e 67 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e  ng.  ** function
3770: 20 72 62 75 53 65 74 75 70 43 68 65 63 6b 70 6f   rbuSetupCheckpo
3780: 69 6e 74 28 29 20 66 6f 72 20 64 65 74 61 69 6c  int() for detail
3790: 73 2e 20 20 2a 2f 0a 20 20 75 33 32 20 69 4d 61  s.  */.  u32 iMa
37a0: 78 46 72 61 6d 65 3b 20 20 20 20 20 20 20 20 20  xFrame;         
37b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 72 67           /* Larg
37c0: 65 73 74 20 69 57 61 6c 46 72 61 6d 65 20 76 61  est iWalFrame va
37d0: 6c 75 65 20 69 6e 20 61 46 72 61 6d 65 5b 5d 20  lue in aFrame[] 
37e0: 2a 2f 0a 20 20 75 33 32 20 6d 4c 6f 63 6b 3b 0a  */.  u32 mLock;.
37f0: 20 20 69 6e 74 20 6e 46 72 61 6d 65 3b 20 20 20    int nFrame;   
3800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3810: 20 20 2f 2a 20 45 6e 74 72 69 65 73 20 69 6e 20    /* Entries in 
3820: 61 46 72 61 6d 65 5b 5d 20 61 72 72 61 79 20 2a  aFrame[] array *
3830: 2f 0a 20 20 69 6e 74 20 6e 46 72 61 6d 65 41 6c  /.  int nFrameAl
3840: 6c 6f 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  loc;            
3850: 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64      /* Allocated
3860: 20 73 69 7a 65 20 6f 66 20 61 46 72 61 6d 65 5b   size of aFrame[
3870: 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 52 62 75  ] array */.  Rbu
3880: 46 72 61 6d 65 20 2a 61 46 72 61 6d 65 3b 0a 20  Frame *aFrame;. 
3890: 20 69 6e 74 20 70 67 73 7a 3b 0a 20 20 75 38 20   int pgsz;.  u8 
38a0: 2a 61 42 75 66 3b 0a 20 20 69 36 34 20 69 57 61  *aBuf;.  i64 iWa
38b0: 6c 43 6b 73 75 6d 3b 0a 20 20 69 36 34 20 73 7a  lCksum;.  i64 sz
38c0: 54 65 6d 70 3b 20 20 20 20 20 20 20 20 20 20 20  Temp;           
38d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
38e0: 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 61 6c 6c  rent size of all
38f0: 20 74 65 6d 70 20 66 69 6c 65 73 20 69 6e 20 75   temp files in u
3900: 73 65 20 2a 2f 0a 20 20 69 36 34 20 73 7a 54 65  se */.  i64 szTe
3910: 6d 70 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 20  mpLimit;        
3920: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c          /* Total
3930: 20 73 69 7a 65 20 6c 69 6d 69 74 20 66 6f 72 20   size limit for 
3940: 74 65 6d 70 20 66 69 6c 65 73 20 2a 2f 0a 0a 20  temp files */.. 
3950: 20 2f 2a 20 55 73 65 64 20 69 6e 20 52 42 55 20   /* Used in RBU 
3960: 76 61 63 75 75 6d 20 6d 6f 64 65 20 6f 6e 6c 79  vacuum mode only
3970: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 62 75 3b 20   */.  int nRbu; 
3980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3990: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
39a0: 6f 66 20 52 42 55 20 56 46 53 20 69 6e 20 74 68  of RBU VFS in th
39b0: 65 20 73 74 61 63 6b 20 2a 2f 0a 20 20 72 62 75  e stack */.  rbu
39c0: 5f 66 69 6c 65 20 2a 70 52 62 75 46 64 3b 20 20  _file *pRbuFd;  
39d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
39e0: 46 64 20 66 6f 72 20 6d 61 69 6e 20 64 62 20 6f  Fd for main db o
39f0: 66 20 64 62 52 62 75 20 2a 2f 0a 7d 3b 0a 0a 2f  f dbRbu */.};../
3a00: 2a 0a 2a 2a 20 41 6e 20 72 62 75 20 56 46 53 20  *.** An rbu VFS 
3a10: 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75  is implemented u
3a20: 73 69 6e 67 20 61 6e 20 69 6e 73 74 61 6e 63 65  sing an instance
3a30: 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75   of this structu
3a40: 72 65 2e 0a 2a 2a 0a 2a 2a 20 56 61 72 69 61 62  re..**.** Variab
3a50: 6c 65 20 70 52 62 75 20 69 73 20 6f 6e 6c 79 20  le pRbu is only 
3a60: 6e 6f 6e 2d 4e 55 4c 4c 20 66 6f 72 20 61 75 74  non-NULL for aut
3a70: 6f 6d 61 74 69 63 61 6c 6c 79 20 63 72 65 61 74  omatically creat
3a80: 65 64 20 52 42 55 20 56 46 53 20 6f 62 6a 65 63  ed RBU VFS objec
3a90: 74 73 2e 0a 2a 2a 20 49 74 20 69 73 20 4e 55 4c  ts..** It is NUL
3aa0: 4c 20 66 6f 72 20 52 42 55 20 56 46 53 20 6f 62  L for RBU VFS ob
3ab0: 6a 65 63 74 73 20 63 72 65 61 74 65 64 20 65 78  jects created ex
3ac0: 70 6c 69 63 69 74 6c 79 20 75 73 69 6e 67 0a 2a  plicitly using.*
3ad0: 2a 20 73 71 6c 69 74 65 33 72 62 75 5f 63 72 65  * sqlite3rbu_cre
3ae0: 61 74 65 5f 76 66 73 28 29 2e 20 49 74 20 69 73  ate_vfs(). It is
3af0: 20 75 73 65 64 20 74 6f 20 74 72 61 63 6b 20 74   used to track t
3b00: 68 65 20 74 6f 74 61 6c 20 61 6d 6f 75 6e 74 20  he total amount 
3b10: 6f 66 20 74 65 6d 70 0a 2a 2a 20 73 70 61 63 65  of temp.** space
3b20: 20 75 73 65 64 20 62 79 20 74 68 65 20 52 42 55   used by the RBU
3b30: 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 72 75   handle..*/.stru
3b40: 63 74 20 72 62 75 5f 76 66 73 20 7b 0a 20 20 73  ct rbu_vfs {.  s
3b50: 71 6c 69 74 65 33 5f 76 66 73 20 62 61 73 65 3b  qlite3_vfs base;
3b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3b70: 2a 20 72 62 75 20 56 46 53 20 73 68 69 6d 20 6d  * rbu VFS shim m
3b80: 65 74 68 6f 64 73 20 2a 2f 0a 20 20 73 71 6c 69  ethods */.  sqli
3b90: 74 65 33 5f 76 66 73 20 2a 70 52 65 61 6c 56 66  te3_vfs *pRealVf
3ba0: 73 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55  s;          /* U
3bb0: 6e 64 65 72 6c 79 69 6e 67 20 56 46 53 20 2a 2f  nderlying VFS */
3bc0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
3bd0: 20 2a 6d 75 74 65 78 3b 20 20 20 20 20 20 20 20   *mutex;        
3be0: 20 20 20 2f 2a 20 4d 75 74 65 78 20 74 6f 20 70     /* Mutex to p
3bf0: 72 6f 74 65 63 74 20 70 4d 61 69 6e 20 2a 2f 0a  rotect pMain */.
3c00: 20 20 73 71 6c 69 74 65 33 72 62 75 20 2a 70 52    sqlite3rbu *pR
3c10: 62 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  bu;             
3c20: 20 20 2f 2a 20 4f 77 6e 65 72 20 52 42 55 20 6f    /* Owner RBU o
3c30: 62 6a 65 63 74 20 2a 2f 0a 20 20 72 62 75 5f 66  bject */.  rbu_f
3c40: 69 6c 65 20 2a 70 4d 61 69 6e 3b 20 20 20 20 20  ile *pMain;     
3c50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
3c60: 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 6d 61 69  nked list of mai
3c70: 6e 20 64 62 20 66 69 6c 65 73 20 2a 2f 0a 7d 3b  n db files */.};
3c80: 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 66 69 6c  ../*.** Each fil
3c90: 65 20 6f 70 65 6e 65 64 20 62 79 20 61 6e 20 72  e opened by an r
3ca0: 62 75 20 56 46 53 20 69 73 20 72 65 70 72 65 73  bu VFS is repres
3cb0: 65 6e 74 65 64 20 62 79 20 61 6e 20 69 6e 73 74  ented by an inst
3cc0: 61 6e 63 65 20 6f 66 0a 2a 2a 20 74 68 65 20 66  ance of.** the f
3cd0: 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
3ce0: 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69  re..**.** If thi
3cf0: 73 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79  s is a temporary
3d00: 20 66 69 6c 65 20 28 70 52 62 75 21 3d 30 20 26   file (pRbu!=0 &
3d10: 26 20 66 6c 61 67 73 26 44 45 4c 45 54 45 5f 4f  & flags&DELETE_O
3d20: 4e 5f 43 4c 4f 53 45 29 2c 20 76 61 72 69 61 62  N_CLOSE), variab
3d30: 6c 65 0a 2a 2a 20 22 73 7a 22 20 69 73 20 73 65  le.** "sz" is se
3d40: 74 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74  t to the current
3d50: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
3d60: 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73  abase file..*/.s
3d70: 74 72 75 63 74 20 72 62 75 5f 66 69 6c 65 20 7b  truct rbu_file {
3d80: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
3d90: 62 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  base;           
3da0: 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 66 69     /* sqlite3_fi
3db0: 6c 65 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 20 20  le methods */.  
3dc0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 52  sqlite3_file *pR
3dd0: 65 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  eal;            
3de0: 2f 2a 20 55 6e 64 65 72 6c 79 69 6e 67 20 66 69  /* Underlying fi
3df0: 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 72  le handle */.  r
3e00: 62 75 5f 76 66 73 20 2a 70 52 62 75 56 66 73 3b  bu_vfs *pRbuVfs;
3e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3e20: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  * Pointer to the
3e30: 20 72 62 75 5f 76 66 73 20 6f 62 6a 65 63 74 20   rbu_vfs object 
3e40: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20  */.  sqlite3rbu 
3e50: 2a 70 52 62 75 3b 20 20 20 20 20 20 20 20 20 20  *pRbu;          
3e60: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
3e70: 74 6f 20 72 62 75 20 6f 62 6a 65 63 74 20 28 72  to rbu object (r
3e80: 62 75 20 74 61 72 67 65 74 20 6f 6e 6c 79 29 20  bu target only) 
3e90: 2a 2f 0a 20 20 69 36 34 20 73 7a 3b 20 20 20 20  */.  i64 sz;    
3ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3eb0: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
3ec0: 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 28 74  file in bytes (t
3ed0: 65 6d 70 20 6f 6e 6c 79 29 20 2a 2f 0a 0a 20 20  emp only) */..  
3ee0: 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 3b 20 20  int openFlags;  
3ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f00: 2f 2a 20 46 6c 61 67 73 20 74 68 69 73 20 66 69  /* Flags this fi
3f10: 6c 65 20 77 61 73 20 6f 70 65 6e 65 64 20 77 69  le was opened wi
3f20: 74 68 20 2a 2f 0a 20 20 75 33 32 20 69 43 6f 6f  th */.  u32 iCoo
3f30: 6b 69 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  kie;            
3f40: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6f 6b 69          /* Cooki
3f50: 65 20 76 61 6c 75 65 20 66 6f 72 20 6d 61 69 6e  e value for main
3f60: 20 64 62 20 66 69 6c 65 73 20 2a 2f 0a 20 20 75   db files */.  u
3f70: 38 20 69 57 72 69 74 65 56 65 72 3b 20 20 20 20  8 iWriteVer;    
3f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3f90: 2a 20 22 77 72 69 74 65 2d 76 65 72 73 69 6f 6e  * "write-version
3fa0: 22 20 76 61 6c 75 65 20 66 6f 72 20 6d 61 69 6e  " value for main
3fb0: 20 64 62 20 66 69 6c 65 73 20 2a 2f 0a 20 20 75   db files */.  u
3fc0: 38 20 62 4e 6f 6c 6f 63 6b 3b 20 20 20 20 20 20  8 bNolock;      
3fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3fe0: 2a 20 54 72 75 65 20 74 6f 20 66 61 69 6c 20 45  * True to fail E
3ff0: 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20 2a  XCLUSIVE locks *
4000: 2f 0a 0a 20 20 69 6e 74 20 6e 53 68 6d 3b 20 20  /..  int nShm;  
4010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4020: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
4030: 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 70 53  f entries in apS
4040: 68 6d 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20  hm[] array */.  
4050: 63 68 61 72 20 2a 2a 61 70 53 68 6d 3b 20 20 20  char **apShm;   
4060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4070: 2f 2a 20 41 72 72 61 79 20 6f 66 20 6d 6d 61 70  /* Array of mmap
4080: 27 64 20 2a 2d 73 68 6d 20 72 65 67 69 6f 6e 73  'd *-shm regions
4090: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 65 6c   */.  char *zDel
40a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
40b0: 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20        /* Delete 
40c0: 74 68 69 73 20 77 68 65 6e 20 63 6c 6f 73 69 6e  this when closin
40d0: 67 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 63 6f 6e  g file */..  con
40e0: 73 74 20 63 68 61 72 20 2a 7a 57 61 6c 3b 20 20  st char *zWal;  
40f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4100: 57 61 6c 20 66 69 6c 65 6e 61 6d 65 20 66 6f 72  Wal filename for
4110: 20 74 68 69 73 20 6d 61 69 6e 20 64 62 20 66 69   this main db fi
4120: 6c 65 20 2a 2f 0a 20 20 72 62 75 5f 66 69 6c 65  le */.  rbu_file
4130: 20 2a 70 57 61 6c 46 64 3b 20 20 20 20 20 20 20   *pWalFd;       
4140: 20 20 20 20 20 20 20 20 2f 2a 20 57 61 6c 20 66          /* Wal f
4150: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66  ile descriptor f
4160: 6f 72 20 74 68 69 73 20 6d 61 69 6e 20 64 62 20  or this main db 
4170: 2a 2f 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a 70  */.  rbu_file *p
4180: 4d 61 69 6e 4e 65 78 74 3b 20 20 20 20 20 20 20  MainNext;       
4190: 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 4d 41 49       /* Next MAI
41a0: 4e 5f 44 42 20 66 69 6c 65 20 2a 2f 0a 7d 3b 0a  N_DB file */.};.
41b0: 0a 2f 2a 0a 2a 2a 20 54 72 75 65 20 66 6f 72 20  ./*.** True for 
41c0: 61 6e 20 52 42 55 20 76 61 63 75 75 6d 20 68 61  an RBU vacuum ha
41d0: 6e 64 6c 65 2c 20 6f 72 20 66 61 6c 73 65 20 6f  ndle, or false o
41e0: 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 23 64 65  therwise..*/.#de
41f0: 66 69 6e 65 20 72 62 75 49 73 56 61 63 75 75 6d  fine rbuIsVacuum
4200: 28 70 29 20 28 28 70 29 2d 3e 7a 54 61 72 67 65  (p) ((p)->zTarge
4210: 74 3d 3d 30 29 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  t==0).../*******
4220: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4230: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4240: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4250: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4260: 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  **.** The follow
4270: 69 6e 67 20 74 68 72 65 65 20 66 75 6e 63 74 69  ing three functi
4280: 6f 6e 73 2c 20 66 6f 75 6e 64 20 62 65 6c 6f 77  ons, found below
4290: 3a 0a 2a 2a 0a 2a 2a 20 20 20 72 62 75 44 65 6c  :.**.**   rbuDel
42a0: 74 61 47 65 74 49 6e 74 28 29 0a 2a 2a 20 20 20  taGetInt().**   
42b0: 72 62 75 44 65 6c 74 61 43 68 65 63 6b 73 75 6d  rbuDeltaChecksum
42c0: 28 29 0a 2a 2a 20 20 20 72 62 75 44 65 6c 74 61  ().**   rbuDelta
42d0: 41 70 70 6c 79 28 29 0a 2a 2a 0a 2a 2a 20 61 72  Apply().**.** ar
42e0: 65 20 6c 69 66 74 65 64 20 66 72 6f 6d 20 74 68  e lifted from th
42f0: 65 20 66 6f 73 73 69 6c 20 73 6f 75 72 63 65 20  e fossil source 
4300: 63 6f 64 65 20 28 68 74 74 70 3a 2f 2f 66 6f 73  code (http://fos
4310: 73 69 6c 2d 73 63 6d 2e 6f 72 67 29 2e 20 54 68  sil-scm.org). Th
4320: 65 79 0a 2a 2a 20 61 72 65 20 75 73 65 64 20 74  ey.** are used t
4330: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
4340: 73 63 61 6c 61 72 20 53 51 4c 20 66 75 6e 63 74  scalar SQL funct
4350: 69 6f 6e 20 72 62 75 5f 66 6f 73 73 69 6c 5f 64  ion rbu_fossil_d
4360: 65 6c 74 61 28 29 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a  elta()..*/../*.*
4370: 2a 20 52 65 61 64 20 62 79 74 65 73 20 66 72 6f  * Read bytes fro
4380: 6d 20 2a 70 7a 20 61 6e 64 20 63 6f 6e 76 65 72  m *pz and conver
4390: 74 20 74 68 65 6d 20 69 6e 74 6f 20 61 20 70 6f  t them into a po
43a0: 73 69 74 69 76 65 20 69 6e 74 65 67 65 72 2e 20  sitive integer. 
43b0: 20 57 68 65 6e 0a 2a 2a 20 66 69 6e 69 73 68 65   When.** finishe
43c0: 64 2c 20 6c 65 61 76 65 20 2a 70 7a 20 70 6f 69  d, leave *pz poi
43d0: 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 66 69 72  nting to the fir
43e0: 73 74 20 63 68 61 72 61 63 74 65 72 20 70 61 73  st character pas
43f0: 74 20 74 68 65 20 65 6e 64 20 6f 66 0a 2a 2a 20  t the end of.** 
4400: 74 68 65 20 69 6e 74 65 67 65 72 2e 20 20 54 68  the integer.  Th
4410: 65 20 2a 70 4c 65 6e 20 70 61 72 61 6d 65 74 65  e *pLen paramete
4420: 72 20 68 6f 6c 64 73 20 74 68 65 20 6c 65 6e 67  r holds the leng
4430: 74 68 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67  th of the string
4440: 0a 2a 2a 20 69 6e 20 2a 70 7a 20 61 6e 64 20 69  .** in *pz and i
4450: 73 20 64 65 63 72 65 6d 65 6e 74 65 64 20 6f 6e  s decremented on
4460: 63 65 20 66 6f 72 20 65 61 63 68 20 63 68 61 72  ce for each char
4470: 61 63 74 65 72 20 69 6e 20 74 68 65 20 69 6e 74  acter in the int
4480: 65 67 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eger..*/.static 
4490: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 72 62 75  unsigned int rbu
44a0: 44 65 6c 74 61 47 65 74 49 6e 74 28 63 6f 6e 73  DeltaGetInt(cons
44b0: 74 20 63 68 61 72 20 2a 2a 70 7a 2c 20 69 6e 74  t char **pz, int
44c0: 20 2a 70 4c 65 6e 29 7b 0a 20 20 73 74 61 74 69   *pLen){.  stati
44d0: 63 20 63 6f 6e 73 74 20 73 69 67 6e 65 64 20 63  c const signed c
44e0: 68 61 72 20 7a 56 61 6c 75 65 5b 5d 20 3d 20 7b  har zValue[] = {
44f0: 0a 20 20 20 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c  .    -1, -1, -1,
4500: 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c   -1, -1, -1, -1,
4510: 20 2d 31 2c 20 20 20 2d 31 2c 20 2d 31 2c 20 2d   -1,   -1, -1, -
4520: 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d  1, -1, -1, -1, -
4530: 31 2c 20 2d 31 2c 0a 20 20 20 20 2d 31 2c 20 2d  1, -1,.    -1, -
4540: 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d  1, -1, -1, -1, -
4550: 31 2c 20 2d 31 2c 20 2d 31 2c 20 20 20 2d 31 2c  1, -1, -1,   -1,
4560: 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c   -1, -1, -1, -1,
4570: 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 0a 20 20 20   -1, -1, -1,.   
4580: 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c   -1, -1, -1, -1,
4590: 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c   -1, -1, -1, -1,
45a0: 20 20 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d     -1, -1, -1, -
45b0: 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d  1, -1, -1, -1, -
45c0: 31 2c 0a 20 20 20 20 20 30 2c 20 20 31 2c 20 20  1,.     0,  1,  
45d0: 32 2c 20 20 33 2c 20 20 34 2c 20 20 35 2c 20 20  2,  3,  4,  5,  
45e0: 36 2c 20 20 37 2c 20 20 20 20 38 2c 20 20 39 2c  6,  7,    8,  9,
45f0: 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c   -1, -1, -1, -1,
4600: 20 2d 31 2c 20 2d 31 2c 0a 20 20 20 20 2d 31 2c   -1, -1,.    -1,
4610: 20 31 30 2c 20 31 31 2c 20 31 32 2c 20 31 33 2c   10, 11, 12, 13,
4620: 20 31 34 2c 20 31 35 2c 20 31 36 2c 20 20 20 31   14, 15, 16,   1
4630: 37 2c 20 31 38 2c 20 31 39 2c 20 32 30 2c 20 32  7, 18, 19, 20, 2
4640: 31 2c 20 32 32 2c 20 32 33 2c 20 32 34 2c 0a 20  1, 22, 23, 24,. 
4650: 20 20 20 32 35 2c 20 32 36 2c 20 32 37 2c 20 32     25, 26, 27, 2
4660: 38 2c 20 32 39 2c 20 33 30 2c 20 33 31 2c 20 33  8, 29, 30, 31, 3
4670: 32 2c 20 20 20 33 33 2c 20 33 34 2c 20 33 35 2c  2,   33, 34, 35,
4680: 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c   -1, -1, -1, -1,
4690: 20 33 36 2c 0a 20 20 20 20 2d 31 2c 20 33 37 2c   36,.    -1, 37,
46a0: 20 33 38 2c 20 33 39 2c 20 34 30 2c 20 34 31 2c   38, 39, 40, 41,
46b0: 20 34 32 2c 20 34 33 2c 20 20 20 34 34 2c 20 34   42, 43,   44, 4
46c0: 35 2c 20 34 36 2c 20 34 37 2c 20 34 38 2c 20 34  5, 46, 47, 48, 4
46d0: 39 2c 20 35 30 2c 20 35 31 2c 0a 20 20 20 20 35  9, 50, 51,.    5
46e0: 32 2c 20 35 33 2c 20 35 34 2c 20 35 35 2c 20 35  2, 53, 54, 55, 5
46f0: 36 2c 20 35 37 2c 20 35 38 2c 20 35 39 2c 20 20  6, 57, 58, 59,  
4700: 20 36 30 2c 20 36 31 2c 20 36 32 2c 20 2d 31 2c   60, 61, 62, -1,
4710: 20 2d 31 2c 20 2d 31 2c 20 36 33 2c 20 2d 31 2c   -1, -1, 63, -1,
4720: 0a 20 20 7d 3b 0a 20 20 75 6e 73 69 67 6e 65 64  .  };.  unsigned
4730: 20 69 6e 74 20 76 20 3d 20 30 3b 0a 20 20 69 6e   int v = 0;.  in
4740: 74 20 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  t c;.  unsigned 
4750: 63 68 61 72 20 2a 7a 20 3d 20 28 75 6e 73 69 67  char *z = (unsig
4760: 6e 65 64 20 63 68 61 72 2a 29 2a 70 7a 3b 0a 20  ned char*)*pz;. 
4770: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
4780: 7a 53 74 61 72 74 20 3d 20 7a 3b 0a 20 20 77 68  zStart = z;.  wh
4790: 69 6c 65 28 20 28 63 20 3d 20 7a 56 61 6c 75 65  ile( (c = zValue
47a0: 5b 30 78 37 66 26 2a 28 7a 2b 2b 29 5d 29 3e 3d  [0x7f&*(z++)])>=
47b0: 30 20 29 7b 0a 20 20 20 20 20 76 20 3d 20 28 76  0 ){.     v = (v
47c0: 3c 3c 36 29 20 2b 20 63 3b 0a 20 20 7d 0a 20 20  <<6) + c;.  }.  
47d0: 7a 2d 2d 3b 0a 20 20 2a 70 4c 65 6e 20 2d 3d 20  z--;.  *pLen -= 
47e0: 7a 20 2d 20 7a 53 74 61 72 74 3b 0a 20 20 2a 70  z - zStart;.  *p
47f0: 7a 20 3d 20 28 63 68 61 72 2a 29 7a 3b 0a 20 20  z = (char*)z;.  
4800: 72 65 74 75 72 6e 20 76 3b 0a 7d 0a 0a 2f 2a 0a  return v;.}../*.
4810: 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 33 32 2d  ** Compute a 32-
4820: 62 69 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20  bit checksum on 
4830: 74 68 65 20 4e 2d 62 79 74 65 20 62 75 66 66 65  the N-byte buffe
4840: 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 72  r.  Return the r
4850: 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  esult..*/.static
4860: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 72 62   unsigned int rb
4870: 75 44 65 6c 74 61 43 68 65 63 6b 73 75 6d 28 63  uDeltaChecksum(c
4880: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 2c 20  onst char *zIn, 
4890: 73 69 7a 65 5f 74 20 4e 29 7b 0a 20 20 63 6f 6e  size_t N){.  con
48a0: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
48b0: 20 2a 7a 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73   *z = (const uns
48c0: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 7a 49 6e  igned char *)zIn
48d0: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 73 75 6d  ;.  unsigned sum
48e0: 30 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65  0 = 0;.  unsigne
48f0: 64 20 73 75 6d 31 20 3d 20 30 3b 0a 20 20 75 6e  d sum1 = 0;.  un
4900: 73 69 67 6e 65 64 20 73 75 6d 32 20 3d 20 30 3b  signed sum2 = 0;
4910: 0a 20 20 75 6e 73 69 67 6e 65 64 20 73 75 6d 33  .  unsigned sum3
4920: 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 4e 20   = 0;.  while(N 
4930: 3e 3d 20 31 36 29 7b 0a 20 20 20 20 73 75 6d 30  >= 16){.    sum0
4940: 20 2b 3d 20 28 28 75 6e 73 69 67 6e 65 64 29 7a   += ((unsigned)z
4950: 5b 30 5d 20 2b 20 7a 5b 34 5d 20 2b 20 7a 5b 38  [0] + z[4] + z[8
4960: 5d 20 2b 20 7a 5b 31 32 5d 29 3b 0a 20 20 20 20  ] + z[12]);.    
4970: 73 75 6d 31 20 2b 3d 20 28 28 75 6e 73 69 67 6e  sum1 += ((unsign
4980: 65 64 29 7a 5b 31 5d 20 2b 20 7a 5b 35 5d 20 2b  ed)z[1] + z[5] +
4990: 20 7a 5b 39 5d 20 2b 20 7a 5b 31 33 5d 29 3b 0a   z[9] + z[13]);.
49a0: 20 20 20 20 73 75 6d 32 20 2b 3d 20 28 28 75 6e      sum2 += ((un
49b0: 73 69 67 6e 65 64 29 7a 5b 32 5d 20 2b 20 7a 5b  signed)z[2] + z[
49c0: 36 5d 20 2b 20 7a 5b 31 30 5d 2b 20 7a 5b 31 34  6] + z[10]+ z[14
49d0: 5d 29 3b 0a 20 20 20 20 73 75 6d 33 20 2b 3d 20  ]);.    sum3 += 
49e0: 28 28 75 6e 73 69 67 6e 65 64 29 7a 5b 33 5d 20  ((unsigned)z[3] 
49f0: 2b 20 7a 5b 37 5d 20 2b 20 7a 5b 31 31 5d 2b 20  + z[7] + z[11]+ 
4a00: 7a 5b 31 35 5d 29 3b 0a 20 20 20 20 7a 20 2b 3d  z[15]);.    z +=
4a10: 20 31 36 3b 0a 20 20 20 20 4e 20 2d 3d 20 31 36   16;.    N -= 16
4a20: 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 4e 20  ;.  }.  while(N 
4a30: 3e 3d 20 34 29 7b 0a 20 20 20 20 73 75 6d 30 20  >= 4){.    sum0 
4a40: 2b 3d 20 7a 5b 30 5d 3b 0a 20 20 20 20 73 75 6d  += z[0];.    sum
4a50: 31 20 2b 3d 20 7a 5b 31 5d 3b 0a 20 20 20 20 73  1 += z[1];.    s
4a60: 75 6d 32 20 2b 3d 20 7a 5b 32 5d 3b 0a 20 20 20  um2 += z[2];.   
4a70: 20 73 75 6d 33 20 2b 3d 20 7a 5b 33 5d 3b 0a 20   sum3 += z[3];. 
4a80: 20 20 20 7a 20 2b 3d 20 34 3b 0a 20 20 20 20 4e     z += 4;.    N
4a90: 20 2d 3d 20 34 3b 0a 20 20 7d 0a 20 20 73 75 6d   -= 4;.  }.  sum
4aa0: 33 20 2b 3d 20 28 73 75 6d 32 20 3c 3c 20 38 29  3 += (sum2 << 8)
4ab0: 20 2b 20 28 73 75 6d 31 20 3c 3c 20 31 36 29 20   + (sum1 << 16) 
4ac0: 2b 20 28 73 75 6d 30 20 3c 3c 20 32 34 29 3b 0a  + (sum0 << 24);.
4ad0: 20 20 73 77 69 74 63 68 28 4e 29 7b 0a 20 20 20    switch(N){.   
4ae0: 20 63 61 73 65 20 33 3a 20 20 20 73 75 6d 33 20   case 3:   sum3 
4af0: 2b 3d 20 28 7a 5b 32 5d 20 3c 3c 20 38 29 3b 0a  += (z[2] << 8);.
4b00: 20 20 20 20 63 61 73 65 20 32 3a 20 20 20 73 75      case 2:   su
4b10: 6d 33 20 2b 3d 20 28 7a 5b 31 5d 20 3c 3c 20 31  m3 += (z[1] << 1
4b20: 36 29 3b 0a 20 20 20 20 63 61 73 65 20 31 3a 20  6);.    case 1: 
4b30: 20 20 73 75 6d 33 20 2b 3d 20 28 7a 5b 30 5d 20    sum3 += (z[0] 
4b40: 3c 3c 20 32 34 29 3b 0a 20 20 20 20 64 65 66 61  << 24);.    defa
4b50: 75 6c 74 3a 20 20 3b 0a 20 20 7d 0a 20 20 72 65  ult:  ;.  }.  re
4b60: 74 75 72 6e 20 73 75 6d 33 3b 0a 7d 0a 0a 2f 2a  turn sum3;.}../*
4b70: 0a 2a 2a 20 41 70 70 6c 79 20 61 20 64 65 6c 74  .** Apply a delt
4b80: 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 75 74  a..**.** The out
4b90: 70 75 74 20 62 75 66 66 65 72 20 73 68 6f 75 6c  put buffer shoul
4ba0: 64 20 62 65 20 62 69 67 20 65 6e 6f 75 67 68 20  d be big enough 
4bb0: 74 6f 20 68 6f 6c 64 20 74 68 65 20 77 68 6f 6c  to hold the whol
4bc0: 65 20 6f 75 74 70 75 74 0a 2a 2a 20 66 69 6c 65  e output.** file
4bd0: 20 61 6e 64 20 61 20 4e 55 4c 20 74 65 72 6d 69   and a NUL termi
4be0: 6e 61 74 6f 72 20 61 74 20 74 68 65 20 65 6e 64  nator at the end
4bf0: 2e 20 20 54 68 65 20 64 65 6c 74 61 5f 6f 75 74  .  The delta_out
4c00: 70 75 74 5f 73 69 7a 65 28 29 0a 2a 2a 20 72 6f  put_size().** ro
4c10: 75 74 69 6e 65 20 77 69 6c 6c 20 64 65 74 65 72  utine will deter
4c20: 6d 69 6e 65 20 74 68 69 73 20 73 69 7a 65 20 66  mine this size f
4c30: 6f 72 20 79 6f 75 2e 0a 2a 2a 0a 2a 2a 20 54 68  or you..**.** Th
4c40: 65 20 64 65 6c 74 61 20 73 74 72 69 6e 67 20 73  e delta string s
4c50: 68 6f 75 6c 64 20 62 65 20 6e 75 6c 6c 2d 74 65  hould be null-te
4c60: 72 6d 69 6e 61 74 65 64 2e 20 20 42 75 74 20 74  rminated.  But t
4c70: 68 65 20 64 65 6c 74 61 20 73 74 72 69 6e 67 0a  he delta string.
4c80: 2a 2a 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 65  ** may contain e
4c90: 6d 62 65 64 64 65 64 20 4e 55 4c 20 63 68 61 72  mbedded NUL char
4ca0: 61 63 74 65 72 73 20 28 69 66 20 74 68 65 20 69  acters (if the i
4cb0: 6e 70 75 74 20 61 6e 64 20 6f 75 74 70 75 74 20  nput and output 
4cc0: 61 72 65 0a 2a 2a 20 62 69 6e 61 72 79 20 66 69  are.** binary fi
4cd0: 6c 65 73 29 20 73 6f 20 77 65 20 61 6c 73 6f 20  les) so we also 
4ce0: 68 61 76 65 20 74 6f 20 70 61 73 73 20 69 6e 20  have to pass in 
4cf0: 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68  the length of th
4d00: 65 20 64 65 6c 74 61 20 69 6e 0a 2a 2a 20 74 68  e delta in.** th
4d10: 65 20 6c 65 6e 44 65 6c 74 61 20 70 61 72 61 6d  e lenDelta param
4d20: 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  eter..**.** This
4d30: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
4d40: 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  s the size of th
4d50: 65 20 6f 75 74 70 75 74 20 66 69 6c 65 20 69 6e  e output file in
4d60: 20 62 79 74 65 73 20 28 65 78 63 6c 75 64 69 6e   bytes (excludin
4d70: 67 0a 2a 2a 20 74 68 65 20 66 69 6e 61 6c 20 4e  g.** the final N
4d80: 55 4c 20 74 65 72 6d 69 6e 61 74 6f 72 20 63 68  UL terminator ch
4d90: 61 72 61 63 74 65 72 29 2e 20 20 45 78 63 65 70  aracter).  Excep
4da0: 74 2c 20 69 66 20 74 68 65 20 64 65 6c 74 61 20  t, if the delta 
4db0: 73 74 72 69 6e 67 20 69 73 0a 2a 2a 20 6d 61 6c  string is.** mal
4dc0: 66 6f 72 6d 65 64 20 6f 72 20 69 6e 74 65 6e 64  formed or intend
4dd0: 65 64 20 66 6f 72 20 75 73 65 20 77 69 74 68 20  ed for use with 
4de0: 61 20 73 6f 75 72 63 65 20 66 69 6c 65 20 6f 74  a source file ot
4df0: 68 65 72 20 74 68 61 6e 20 7a 53 72 63 2c 0a 2a  her than zSrc,.*
4e00: 2a 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  * then this rout
4e10: 69 6e 65 20 72 65 74 75 72 6e 73 20 2d 31 2e 0a  ine returns -1..
4e20: 2a 2a 0a 2a 2a 20 52 65 66 65 72 20 74 6f 20 74  **.** Refer to t
4e30: 68 65 20 64 65 6c 74 61 5f 63 72 65 61 74 65 28  he delta_create(
4e40: 29 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20  ) documentation 
4e50: 61 62 6f 76 65 20 66 6f 72 20 61 20 64 65 73 63  above for a desc
4e60: 72 69 70 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68  ription.** of th
4e70: 65 20 64 65 6c 74 61 20 66 69 6c 65 20 66 6f 72  e delta file for
4e80: 6d 61 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  mat..*/.static i
4e90: 6e 74 20 72 62 75 44 65 6c 74 61 41 70 70 6c 79  nt rbuDeltaApply
4ea0: 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
4eb0: 7a 53 72 63 2c 20 20 20 20 20 20 2f 2a 20 54 68  zSrc,      /* Th
4ec0: 65 20 73 6f 75 72 63 65 20 6f 72 20 70 61 74 74  e source or patt
4ed0: 65 72 6e 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  ern file */.  in
4ee0: 74 20 6c 65 6e 53 72 63 2c 20 20 20 20 20 20 20  t lenSrc,       
4ef0: 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f       /* Length o
4f00: 66 20 74 68 65 20 73 6f 75 72 63 65 20 66 69 6c  f the source fil
4f10: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
4f20: 72 20 2a 7a 44 65 6c 74 61 2c 20 20 20 20 2f 2a  r *zDelta,    /*
4f30: 20 44 65 6c 74 61 20 74 6f 20 61 70 70 6c 79 20   Delta to apply 
4f40: 74 6f 20 74 68 65 20 70 61 74 74 65 72 6e 20 2a  to the pattern *
4f50: 2f 0a 20 20 69 6e 74 20 6c 65 6e 44 65 6c 74 61  /.  int lenDelta
4f60: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65  ,          /* Le
4f70: 6e 67 74 68 20 6f 66 20 74 68 65 20 64 65 6c 74  ngth of the delt
4f80: 61 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4f 75  a */.  char *zOu
4f90: 74 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t             /*
4fa0: 20 57 72 69 74 65 20 74 68 65 20 6f 75 74 70 75   Write the outpu
4fb0: 74 20 69 6e 74 6f 20 74 68 69 73 20 70 72 65 61  t into this prea
4fc0: 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 20  llocated buffer 
4fd0: 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  */.){.  unsigned
4fe0: 20 69 6e 74 20 6c 69 6d 69 74 3b 0a 20 20 75 6e   int limit;.  un
4ff0: 73 69 67 6e 65 64 20 69 6e 74 20 74 6f 74 61 6c  signed int total
5000: 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 46 4f   = 0;.#ifndef FO
5010: 53 53 49 4c 5f 4f 4d 49 54 5f 44 45 4c 54 41 5f  SSIL_OMIT_DELTA_
5020: 43 4b 53 55 4d 5f 54 45 53 54 0a 20 20 63 68 61  CKSUM_TEST.  cha
5030: 72 20 2a 7a 4f 72 69 67 4f 75 74 20 3d 20 7a 4f  r *zOrigOut = zO
5040: 75 74 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 6c 69  ut;.#endif..  li
5050: 6d 69 74 20 3d 20 72 62 75 44 65 6c 74 61 47 65  mit = rbuDeltaGe
5060: 74 49 6e 74 28 26 7a 44 65 6c 74 61 2c 20 26 6c  tInt(&zDelta, &l
5070: 65 6e 44 65 6c 74 61 29 3b 0a 20 20 69 66 28 20  enDelta);.  if( 
5080: 2a 7a 44 65 6c 74 61 21 3d 27 5c 6e 27 20 29 7b  *zDelta!='\n' ){
5090: 0a 20 20 20 20 2f 2a 20 45 52 52 4f 52 3a 20 73  .    /* ERROR: s
50a0: 69 7a 65 20 69 6e 74 65 67 65 72 20 6e 6f 74 20  ize integer not 
50b0: 74 65 72 6d 69 6e 61 74 65 64 20 62 79 20 22 5c  terminated by "\
50c0: 6e 22 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  n" */.    return
50d0: 20 2d 31 3b 0a 20 20 7d 0a 20 20 7a 44 65 6c 74   -1;.  }.  zDelt
50e0: 61 2b 2b 3b 20 6c 65 6e 44 65 6c 74 61 2d 2d 3b  a++; lenDelta--;
50f0: 0a 20 20 77 68 69 6c 65 28 20 2a 7a 44 65 6c 74  .  while( *zDelt
5100: 61 20 26 26 20 6c 65 6e 44 65 6c 74 61 3e 30 20  a && lenDelta>0 
5110: 29 7b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  ){.    unsigned 
5120: 69 6e 74 20 63 6e 74 2c 20 6f 66 73 74 3b 0a 20  int cnt, ofst;. 
5130: 20 20 20 63 6e 74 20 3d 20 72 62 75 44 65 6c 74     cnt = rbuDelt
5140: 61 47 65 74 49 6e 74 28 26 7a 44 65 6c 74 61 2c  aGetInt(&zDelta,
5150: 20 26 6c 65 6e 44 65 6c 74 61 29 3b 0a 20 20 20   &lenDelta);.   
5160: 20 73 77 69 74 63 68 28 20 7a 44 65 6c 74 61 5b   switch( zDelta[
5170: 30 5d 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  0] ){.      case
5180: 20 27 40 27 3a 20 7b 0a 20 20 20 20 20 20 20 20   '@': {.        
5190: 7a 44 65 6c 74 61 2b 2b 3b 20 6c 65 6e 44 65 6c  zDelta++; lenDel
51a0: 74 61 2d 2d 3b 0a 20 20 20 20 20 20 20 20 6f 66  ta--;.        of
51b0: 73 74 20 3d 20 72 62 75 44 65 6c 74 61 47 65 74  st = rbuDeltaGet
51c0: 49 6e 74 28 26 7a 44 65 6c 74 61 2c 20 26 6c 65  Int(&zDelta, &le
51d0: 6e 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20 20  nDelta);.       
51e0: 20 69 66 28 20 6c 65 6e 44 65 6c 74 61 3e 30 20   if( lenDelta>0 
51f0: 26 26 20 7a 44 65 6c 74 61 5b 30 5d 21 3d 27 2c  && zDelta[0]!=',
5200: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  ' ){.          /
5210: 2a 20 45 52 52 4f 52 3a 20 63 6f 70 79 20 63 6f  * ERROR: copy co
5220: 6d 6d 61 6e 64 20 6e 6f 74 20 74 65 72 6d 69 6e  mmand not termin
5230: 61 74 65 64 20 62 79 20 27 2c 27 20 2a 2f 0a 20  ated by ',' */. 
5240: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
5250: 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  -1;.        }.  
5260: 20 20 20 20 20 20 7a 44 65 6c 74 61 2b 2b 3b 20        zDelta++; 
5270: 6c 65 6e 44 65 6c 74 61 2d 2d 3b 0a 20 20 20 20  lenDelta--;.    
5280: 20 20 20 20 74 6f 74 61 6c 20 2b 3d 20 63 6e 74      total += cnt
5290: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 74 6f  ;.        if( to
52a0: 74 61 6c 3e 6c 69 6d 69 74 20 29 7b 0a 20 20 20  tal>limit ){.   
52b0: 20 20 20 20 20 20 20 2f 2a 20 45 52 52 4f 52 3a         /* ERROR:
52c0: 20 63 6f 70 79 20 65 78 63 65 65 64 73 20 6f 75   copy exceeds ou
52d0: 74 70 75 74 20 66 69 6c 65 20 73 69 7a 65 20 2a  tput file size *
52e0: 2f 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  /.          retu
52f0: 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d  rn -1;.        }
5300: 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 69 6e  .        if( (in
5310: 74 29 28 6f 66 73 74 2b 63 6e 74 29 20 3e 20 6c  t)(ofst+cnt) > l
5320: 65 6e 53 72 63 20 29 7b 0a 20 20 20 20 20 20 20  enSrc ){.       
5330: 20 20 20 2f 2a 20 45 52 52 4f 52 3a 20 63 6f 70     /* ERROR: cop
5340: 79 20 65 78 74 65 6e 64 73 20 70 61 73 74 20 65  y extends past e
5350: 6e 64 20 6f 66 20 69 6e 70 75 74 20 2a 2f 0a 20  nd of input */. 
5360: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
5370: 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  -1;.        }.  
5380: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 4f 75        memcpy(zOu
5390: 74 2c 20 26 7a 53 72 63 5b 6f 66 73 74 5d 2c 20  t, &zSrc[ofst], 
53a0: 63 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 7a 4f  cnt);.        zO
53b0: 75 74 20 2b 3d 20 63 6e 74 3b 0a 20 20 20 20 20  ut += cnt;.     
53c0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
53d0: 7d 0a 20 20 20 20 20 20 63 61 73 65 20 27 3a 27  }.      case ':'
53e0: 3a 20 7b 0a 20 20 20 20 20 20 20 20 7a 44 65 6c  : {.        zDel
53f0: 74 61 2b 2b 3b 20 6c 65 6e 44 65 6c 74 61 2d 2d  ta++; lenDelta--
5400: 3b 0a 20 20 20 20 20 20 20 20 74 6f 74 61 6c 20  ;.        total 
5410: 2b 3d 20 63 6e 74 3b 0a 20 20 20 20 20 20 20 20  += cnt;.        
5420: 69 66 28 20 74 6f 74 61 6c 3e 6c 69 6d 69 74 20  if( total>limit 
5430: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
5440: 45 52 52 4f 52 3a 20 20 69 6e 73 65 72 74 20 63  ERROR:  insert c
5450: 6f 6d 6d 61 6e 64 20 67 69 76 65 73 20 61 6e 20  ommand gives an 
5460: 6f 75 74 70 75 74 20 6c 61 72 67 65 72 20 74 68  output larger th
5470: 61 6e 20 70 72 65 64 69 63 74 65 64 20 2a 2f 0a  an predicted */.
5480: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
5490: 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   -1;.        }. 
54a0: 20 20 20 20 20 20 20 69 66 28 20 28 69 6e 74 29         if( (int)
54b0: 63 6e 74 3e 6c 65 6e 44 65 6c 74 61 20 29 7b 0a  cnt>lenDelta ){.
54c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 52 52            /* ERR
54d0: 4f 52 3a 20 69 6e 73 65 72 74 20 63 6f 75 6e 74  OR: insert count
54e0: 20 65 78 63 65 65 64 73 20 73 69 7a 65 20 6f 66   exceeds size of
54f0: 20 64 65 6c 74 61 20 2a 2f 0a 20 20 20 20 20 20   delta */.      
5500: 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
5510: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
5520: 20 6d 65 6d 63 70 79 28 7a 4f 75 74 2c 20 7a 44   memcpy(zOut, zD
5530: 65 6c 74 61 2c 20 63 6e 74 29 3b 0a 20 20 20 20  elta, cnt);.    
5540: 20 20 20 20 7a 4f 75 74 20 2b 3d 20 63 6e 74 3b      zOut += cnt;
5550: 0a 20 20 20 20 20 20 20 20 7a 44 65 6c 74 61 20  .        zDelta 
5560: 2b 3d 20 63 6e 74 3b 0a 20 20 20 20 20 20 20 20  += cnt;.        
5570: 6c 65 6e 44 65 6c 74 61 20 2d 3d 20 63 6e 74 3b  lenDelta -= cnt;
5580: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
5590: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
55a0: 73 65 20 27 3b 27 3a 20 7b 0a 20 20 20 20 20 20  se ';': {.      
55b0: 20 20 7a 44 65 6c 74 61 2b 2b 3b 20 6c 65 6e 44    zDelta++; lenD
55c0: 65 6c 74 61 2d 2d 3b 0a 20 20 20 20 20 20 20 20  elta--;.        
55d0: 7a 4f 75 74 5b 30 5d 20 3d 20 30 3b 0a 23 69 66  zOut[0] = 0;.#if
55e0: 6e 64 65 66 20 46 4f 53 53 49 4c 5f 4f 4d 49 54  ndef FOSSIL_OMIT
55f0: 5f 44 45 4c 54 41 5f 43 4b 53 55 4d 5f 54 45 53  _DELTA_CKSUM_TES
5600: 54 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 6e  T.        if( cn
5610: 74 21 3d 72 62 75 44 65 6c 74 61 43 68 65 63 6b  t!=rbuDeltaCheck
5620: 73 75 6d 28 7a 4f 72 69 67 4f 75 74 2c 20 74 6f  sum(zOrigOut, to
5630: 74 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  tal) ){.        
5640: 20 20 2f 2a 20 45 52 52 4f 52 3a 20 20 62 61 64    /* ERROR:  bad
5650: 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 20   checksum */.   
5660: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31         return -1
5670: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64  ;.        }.#end
5680: 69 66 0a 20 20 20 20 20 20 20 20 69 66 28 20 74  if.        if( t
5690: 6f 74 61 6c 21 3d 6c 69 6d 69 74 20 29 7b 0a 20  otal!=limit ){. 
56a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 52 52 4f           /* ERRO
56b0: 52 3a 20 67 65 6e 65 72 61 74 65 64 20 73 69 7a  R: generated siz
56c0: 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  e does not match
56d0: 20 70 72 65 64 69 63 74 65 64 20 73 69 7a 65 20   predicted size 
56e0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  */.          ret
56f0: 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  urn -1;.        
5700: 7d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  }.        return
5710: 20 74 6f 74 61 6c 3b 0a 20 20 20 20 20 20 7d 0a   total;.      }.
5720: 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b        default: {
5730: 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 52 52 4f  .        /* ERRO
5740: 52 3a 20 75 6e 6b 6e 6f 77 6e 20 64 65 6c 74 61  R: unknown delta
5750: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20   operator */.   
5760: 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a       return -1;.
5770: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
5780: 7d 0a 20 20 2f 2a 20 45 52 52 4f 52 3a 20 75 6e  }.  /* ERROR: un
5790: 74 65 72 6d 69 6e 61 74 65 64 20 64 65 6c 74 61  terminated delta
57a0: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b   */.  return -1;
57b0: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .}..static int r
57c0: 62 75 44 65 6c 74 61 4f 75 74 70 75 74 53 69 7a  buDeltaOutputSiz
57d0: 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44  e(const char *zD
57e0: 65 6c 74 61 2c 20 69 6e 74 20 6c 65 6e 44 65 6c  elta, int lenDel
57f0: 74 61 29 7b 0a 20 20 69 6e 74 20 73 69 7a 65 3b  ta){.  int size;
5800: 0a 20 20 73 69 7a 65 20 3d 20 72 62 75 44 65 6c  .  size = rbuDel
5810: 74 61 47 65 74 49 6e 74 28 26 7a 44 65 6c 74 61  taGetInt(&zDelta
5820: 2c 20 26 6c 65 6e 44 65 6c 74 61 29 3b 0a 20 20  , &lenDelta);.  
5830: 69 66 28 20 2a 7a 44 65 6c 74 61 21 3d 27 5c 6e  if( *zDelta!='\n
5840: 27 20 29 7b 0a 20 20 20 20 2f 2a 20 45 52 52 4f  ' ){.    /* ERRO
5850: 52 3a 20 73 69 7a 65 20 69 6e 74 65 67 65 72 20  R: size integer 
5860: 6e 6f 74 20 74 65 72 6d 69 6e 61 74 65 64 20 62  not terminated b
5870: 79 20 22 5c 6e 22 20 2a 2f 0a 20 20 20 20 72 65  y "\n" */.    re
5880: 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 72  turn -1;.  }.  r
5890: 65 74 75 72 6e 20 73 69 7a 65 3b 0a 7d 0a 0a 2f  eturn size;.}../
58a0: 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20 63 6f 64 65  *.** End of code
58b0: 20 74 61 6b 65 6e 20 66 72 6f 6d 20 66 6f 73 73   taken from foss
58c0: 69 6c 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  il..************
58d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
58e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
58f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5900: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
5910: 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
5920: 74 69 6f 6e 20 6f 66 20 53 51 4c 20 73 63 61 6c  tion of SQL scal
5930: 61 72 20 66 75 6e 63 74 69 6f 6e 20 72 62 75 5f  ar function rbu_
5940: 66 6f 73 73 69 6c 5f 64 65 6c 74 61 28 29 2e 0a  fossil_delta()..
5950: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
5960: 69 6f 6e 20 61 70 70 6c 69 65 73 20 61 20 66 6f  ion applies a fo
5970: 73 73 69 6c 20 64 65 6c 74 61 20 70 61 74 63 68  ssil delta patch
5980: 20 74 6f 20 61 20 62 6c 6f 62 2e 20 45 78 61 63   to a blob. Exac
5990: 74 6c 79 20 74 77 6f 0a 2a 2a 20 61 72 67 75 6d  tly two.** argum
59a0: 65 6e 74 73 20 6d 75 73 74 20 62 65 20 70 61 73  ents must be pas
59b0: 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63  sed to this func
59c0: 74 69 6f 6e 2e 20 54 68 65 20 66 69 72 73 74 20  tion. The first 
59d0: 69 73 20 74 68 65 20 62 6c 6f 62 20 74 6f 0a 2a  is the blob to.*
59e0: 2a 20 70 61 74 63 68 20 61 6e 64 20 74 68 65 20  * patch and the 
59f0: 73 65 63 6f 6e 64 20 74 68 65 20 70 61 74 63 68  second the patch
5a00: 20 74 6f 20 61 70 70 6c 79 2e 20 49 66 20 6e 6f   to apply. If no
5a10: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
5a20: 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
5a30: 72 65 74 75 72 6e 73 20 74 68 65 20 70 61 74 63  returns the patc
5a40: 68 65 64 20 62 6c 6f 62 2e 0a 2a 2f 0a 73 74 61  hed blob..*/.sta
5a50: 74 69 63 20 76 6f 69 64 20 72 62 75 46 6f 73 73  tic void rbuFoss
5a60: 69 6c 44 65 6c 74 61 46 75 6e 63 28 0a 20 20 73  ilDeltaFunc(.  s
5a70: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
5a80: 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61  context,.  int a
5a90: 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  rgc,.  sqlite3_v
5aa0: 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
5ab0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 44 65   const char *aDe
5ac0: 6c 74 61 3b 0a 20 20 69 6e 74 20 6e 44 65 6c 74  lta;.  int nDelt
5ad0: 61 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  a;.  const char 
5ae0: 2a 61 4f 72 69 67 3b 0a 20 20 69 6e 74 20 6e 4f  *aOrig;.  int nO
5af0: 72 69 67 3b 0a 0a 20 20 69 6e 74 20 6e 4f 75 74  rig;..  int nOut
5b00: 3b 0a 20 20 69 6e 74 20 6e 4f 75 74 32 3b 0a 20  ;.  int nOut2;. 
5b10: 20 63 68 61 72 20 2a 61 4f 75 74 3b 0a 0a 20 20   char *aOut;..  
5b20: 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d 32 20  assert( argc==2 
5b30: 29 3b 0a 0a 20 20 6e 4f 72 69 67 20 3d 20 73 71  );..  nOrig = sq
5b40: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
5b50: 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 61 4f  s(argv[0]);.  aO
5b60: 72 69 67 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  rig = (const cha
5b70: 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
5b80: 5f 62 6c 6f 62 28 61 72 67 76 5b 30 5d 29 3b 0a  _blob(argv[0]);.
5b90: 20 20 6e 44 65 6c 74 61 20 3d 20 73 71 6c 69 74    nDelta = sqlit
5ba0: 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61  e3_value_bytes(a
5bb0: 72 67 76 5b 31 5d 29 3b 0a 20 20 61 44 65 6c 74  rgv[1]);.  aDelt
5bc0: 61 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  a = (const char*
5bd0: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62  )sqlite3_value_b
5be0: 6c 6f 62 28 61 72 67 76 5b 31 5d 29 3b 0a 0a 20  lob(argv[1]);.. 
5bf0: 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74   /* Figure out t
5c00: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6f  he size of the o
5c10: 75 74 70 75 74 20 2a 2f 0a 20 20 6e 4f 75 74 20  utput */.  nOut 
5c20: 3d 20 72 62 75 44 65 6c 74 61 4f 75 74 70 75 74  = rbuDeltaOutput
5c30: 53 69 7a 65 28 61 44 65 6c 74 61 2c 20 6e 44 65  Size(aDelta, nDe
5c40: 6c 74 61 29 3b 0a 20 20 69 66 28 20 6e 4f 75 74  lta);.  if( nOut
5c50: 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  <0 ){.    sqlite
5c60: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63  3_result_error(c
5c70: 6f 6e 74 65 78 74 2c 20 22 63 6f 72 72 75 70 74  ontext, "corrupt
5c80: 20 66 6f 73 73 69 6c 20 64 65 6c 74 61 22 2c 20   fossil delta", 
5c90: 2d 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  -1);.    return;
5ca0: 0a 20 20 7d 0a 0a 20 20 61 4f 75 74 20 3d 20 73  .  }..  aOut = s
5cb0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 4f  qlite3_malloc(nO
5cc0: 75 74 2b 31 29 3b 0a 20 20 69 66 28 20 61 4f 75  ut+1);.  if( aOu
5cd0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  t==0 ){.    sqli
5ce0: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
5cf0: 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b  _nomem(context);
5d00: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4f  .  }else{.    nO
5d10: 75 74 32 20 3d 20 72 62 75 44 65 6c 74 61 41 70  ut2 = rbuDeltaAp
5d20: 70 6c 79 28 61 4f 72 69 67 2c 20 6e 4f 72 69 67  ply(aOrig, nOrig
5d30: 2c 20 61 44 65 6c 74 61 2c 20 6e 44 65 6c 74 61  , aDelta, nDelta
5d40: 2c 20 61 4f 75 74 29 3b 0a 20 20 20 20 69 66 28  , aOut);.    if(
5d50: 20 6e 4f 75 74 32 21 3d 6e 4f 75 74 20 29 7b 0a   nOut2!=nOut ){.
5d60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
5d70: 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65  sult_error(conte
5d80: 78 74 2c 20 22 63 6f 72 72 75 70 74 20 66 6f 73  xt, "corrupt fos
5d90: 73 69 6c 20 64 65 6c 74 61 22 2c 20 2d 31 29 3b  sil delta", -1);
5da0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
5db0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
5dc0: 5f 62 6c 6f 62 28 63 6f 6e 74 65 78 74 2c 20 61  _blob(context, a
5dd0: 4f 75 74 2c 20 6e 4f 75 74 2c 20 73 71 6c 69 74  Out, nOut, sqlit
5de0: 65 33 5f 66 72 65 65 29 3b 0a 20 20 20 20 7d 0a  e3_free);.    }.
5df0: 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 50 72    }.}.../*.** Pr
5e00: 65 70 61 72 65 20 74 68 65 20 53 51 4c 20 73 74  epare the SQL st
5e10: 61 74 65 6d 65 6e 74 20 69 6e 20 62 75 66 66 65  atement in buffe
5e20: 72 20 7a 53 71 6c 20 61 67 61 69 6e 73 74 20 64  r zSql against d
5e30: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64  atabase handle d
5e40: 62 2e 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  b..** If success
5e50: 66 75 6c 2c 20 73 65 74 20 2a 70 70 53 74 6d 74  ful, set *ppStmt
5e60: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
5e70: 20 6e 65 77 20 73 74 61 74 65 6d 65 6e 74 20 61   new statement a
5e80: 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c  nd return.** SQL
5e90: 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 0a 2a 2a 20 4f  ITE_OK. .**.** O
5ea0: 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 6e 20  therwise, if an 
5eb0: 65 72 72 6f 72 20 64 6f 65 73 20 6f 63 63 75 72  error does occur
5ec0: 2c 20 73 65 74 20 2a 70 70 53 74 6d 74 20 74 6f  , set *ppStmt to
5ed0: 20 4e 55 4c 4c 20 61 6e 64 20 72 65 74 75 72 6e   NULL and return
5ee0: 0a 2a 2a 20 61 6e 20 53 51 4c 69 74 65 20 65 72  .** an SQLite er
5ef0: 72 6f 72 20 63 6f 64 65 2e 20 41 64 64 69 74 69  ror code. Additi
5f00: 6f 6e 61 6c 6c 79 2c 20 73 65 74 20 6f 75 74 70  onally, set outp
5f10: 75 74 20 76 61 72 69 61 62 6c 65 20 2a 70 7a 45  ut variable *pzE
5f20: 72 72 6d 73 67 20 74 6f 0a 2a 2a 20 70 6f 69 6e  rrmsg to.** poin
5f30: 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f  t to a buffer co
5f40: 6e 74 61 69 6e 69 6e 67 20 61 6e 20 65 72 72 6f  ntaining an erro
5f50: 72 20 6d 65 73 73 61 67 65 2e 20 49 74 20 69 73  r message. It is
5f60: 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
5f70: 69 74 79 0a 2a 2a 20 6f 66 20 74 68 65 20 63 61  ity.** of the ca
5f80: 6c 6c 65 72 20 74 6f 20 28 65 76 65 6e 74 75 61  ller to (eventua
5f90: 6c 6c 79 29 20 66 72 65 65 20 74 68 69 73 20 62  lly) free this b
5fa0: 75 66 66 65 72 20 75 73 69 6e 67 20 73 71 6c 69  uffer using sqli
5fb0: 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 73  te3_free()..*/.s
5fc0: 74 61 74 69 63 20 69 6e 74 20 70 72 65 70 61 72  tatic int prepar
5fd0: 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72  eAndCollectError
5fe0: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
5ff0: 20 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74   .  sqlite3_stmt
6000: 20 2a 2a 70 70 53 74 6d 74 2c 0a 20 20 63 68 61   **ppStmt,.  cha
6010: 72 20 2a 2a 70 7a 45 72 72 6d 73 67 2c 0a 20 20  r **pzErrmsg,.  
6020: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
6030: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73  .){.  int rc = s
6040: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
6050: 32 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20  2(db, zSql, -1, 
6060: 70 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66  ppStmt, 0);.  if
6070: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
6080: 29 7b 0a 20 20 20 20 2a 70 7a 45 72 72 6d 73 67  ){.    *pzErrmsg
6090: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
60a0: 74 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65 33  tf("%s", sqlite3
60b0: 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20  _errmsg(db));.  
60c0: 20 20 2a 70 70 53 74 6d 74 20 3d 20 30 3b 0a 20    *ppStmt = 0;. 
60d0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
60e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74 20 74  }../*.** Reset t
60f0: 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
6100: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
6110: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 52  irst argument. R
6120: 65 74 75 72 6e 20 61 20 63 6f 70 79 0a 2a 2a 20  eturn a copy.** 
6130: 6f 66 20 74 68 65 20 76 61 6c 75 65 20 72 65 74  of the value ret
6140: 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33  urned by sqlite3
6150: 5f 72 65 73 65 74 28 29 2e 0a 2a 2a 0a 2a 2a 20  _reset()..**.** 
6160: 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20  If an error has 
6170: 6f 63 63 75 72 72 65 64 2c 20 74 68 65 6e 20 73  occurred, then s
6180: 65 74 20 2a 70 7a 45 72 72 6d 73 67 20 74 6f 20  et *pzErrmsg to 
6190: 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65  point to a buffe
61a0: 72 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20  r.** containing 
61b0: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
61c0: 2e 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70  . It is the resp
61d0: 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
61e0: 65 20 63 61 6c 6c 65 72 0a 2a 2a 20 74 6f 20 65  e caller.** to e
61f0: 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 20 74  ventually free t
6200: 68 69 73 20 62 75 66 66 65 72 20 75 73 69 6e 67  his buffer using
6210: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e   sqlite3_free().
6220: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
6230: 65 73 65 74 41 6e 64 43 6f 6c 6c 65 63 74 45 72  esetAndCollectEr
6240: 72 6f 72 28 73 71 6c 69 74 65 33 5f 73 74 6d 74  ror(sqlite3_stmt
6250: 20 2a 70 53 74 6d 74 2c 20 63 68 61 72 20 2a 2a   *pStmt, char **
6260: 70 7a 45 72 72 6d 73 67 29 7b 0a 20 20 69 6e 74  pzErrmsg){.  int
6270: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65   rc = sqlite3_re
6280: 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 69 66  set(pStmt);.  if
6290: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
62a0: 29 7b 0a 20 20 20 20 2a 70 7a 45 72 72 6d 73 67  ){.    *pzErrmsg
62b0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
62c0: 74 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65 33  tf("%s", sqlite3
62d0: 5f 65 72 72 6d 73 67 28 73 71 6c 69 74 65 33 5f  _errmsg(sqlite3_
62e0: 64 62 5f 68 61 6e 64 6c 65 28 70 53 74 6d 74 29  db_handle(pStmt)
62f0: 29 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ));.  }.  return
6300: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e   rc;.}../*.** Un
6310: 6c 65 73 73 20 69 74 20 69 73 20 4e 55 4c 4c 2c  less it is NULL,
6320: 20 61 72 67 75 6d 65 6e 74 20 7a 53 71 6c 20 70   argument zSql p
6330: 6f 69 6e 74 73 20 74 6f 20 61 20 62 75 66 66 65  oints to a buffe
6340: 72 20 61 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e  r allocated usin
6350: 67 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c  g.** sqlite3_mal
6360: 6c 6f 63 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61  loc containing a
6370: 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e  n SQL statement.
6380: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 70   This function p
6390: 72 65 70 61 72 65 73 20 74 68 65 20 53 51 4c 0a  repares the SQL.
63a0: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 61 67 61  ** statement aga
63b0: 69 6e 73 74 20 64 61 74 61 62 61 73 65 20 64 62  inst database db
63c0: 20 61 6e 64 20 66 72 65 65 73 20 74 68 65 20 62   and frees the b
63d0: 75 66 66 65 72 2e 20 49 66 20 73 74 61 74 65 6d  uffer. If statem
63e0: 65 6e 74 20 0a 2a 2a 20 63 6f 6d 70 69 6c 61 74  ent .** compilat
63f0: 69 6f 6e 20 69 73 20 73 75 63 63 65 73 73 66 75  ion is successfu
6400: 6c 2c 20 2a 70 70 53 74 6d 74 20 69 73 20 73 65  l, *ppStmt is se
6410: 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  t to point to th
6420: 65 20 6e 65 77 20 73 74 61 74 65 6d 65 6e 74 20  e new statement 
6430: 0a 2a 2a 20 68 61 6e 64 6c 65 20 61 6e 64 20 53  .** handle and S
6440: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
6450: 72 6e 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 4f 74 68  rned. .**.** Oth
6460: 65 72 77 69 73 65 2c 20 69 66 20 61 6e 20 65 72  erwise, if an er
6470: 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70 70 53  ror occurs, *ppS
6480: 74 6d 74 20 69 73 20 73 65 74 20 74 6f 20 4e 55  tmt is set to NU
6490: 4c 4c 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20  LL and an error 
64a0: 63 6f 64 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64  code.** returned
64b0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
64c0: 2a 70 7a 45 72 72 6d 73 67 20 6d 61 79 20 61 6c  *pzErrmsg may al
64d0: 73 6f 20 62 65 20 73 65 74 20 74 6f 20 70 6f 69  so be set to poi
64e0: 6e 74 20 74 6f 20 61 6e 20 65 72 72 6f 72 0a 2a  nt to an error.*
64f0: 2a 20 6d 65 73 73 61 67 65 2e 20 49 74 20 69 73  * message. It is
6500: 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
6510: 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  ity of the calle
6520: 72 20 74 6f 20 66 72 65 65 20 74 68 69 73 20 65  r to free this e
6530: 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20  rror message.** 
6540: 62 75 66 66 65 72 20 75 73 69 6e 67 20 73 71 6c  buffer using sql
6550: 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2a 0a  ite3_free()..**.
6560: 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 7a  ** If argument z
6570: 53 71 6c 20 69 73 20 4e 55 4c 4c 2c 20 74 68 69  Sql is NULL, thi
6580: 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d  s function assum
6590: 65 73 20 74 68 61 74 20 61 6e 20 4f 4f 4d 20 68  es that an OOM h
65a0: 61 73 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 20  as occurred..** 
65b0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 53 51 4c  In this case SQL
65c0: 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74  ITE_NOMEM is ret
65d0: 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 53 74 6d  urned and *ppStm
65e0: 74 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a  t set to NULL..*
65f0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 65  /.static int pre
6600: 70 61 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65  pareFreeAndColle
6610: 63 74 45 72 72 6f 72 28 0a 20 20 73 71 6c 69 74  ctError(.  sqlit
6620: 65 33 20 2a 64 62 2c 20 0a 20 20 73 71 6c 69 74  e3 *db, .  sqlit
6630: 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74  e3_stmt **ppStmt
6640: 2c 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72  ,.  char **pzErr
6650: 6d 73 67 2c 0a 20 20 63 68 61 72 20 2a 7a 53 71  msg,.  char *zSq
6660: 6c 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  l.){.  int rc;. 
6670: 20 61 73 73 65 72 74 28 20 2a 70 7a 45 72 72 6d   assert( *pzErrm
6680: 73 67 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 7a  sg==0 );.  if( z
6690: 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  Sql==0 ){.    rc
66a0: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
66b0: 0a 20 20 20 20 2a 70 70 53 74 6d 74 20 3d 20 30  .    *ppStmt = 0
66c0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
66d0: 63 20 3d 20 70 72 65 70 61 72 65 41 6e 64 43 6f  c = prepareAndCo
66e0: 6c 6c 65 63 74 45 72 72 6f 72 28 64 62 2c 20 70  llectError(db, p
66f0: 70 53 74 6d 74 2c 20 70 7a 45 72 72 6d 73 67 2c  pStmt, pzErrmsg,
6700: 20 7a 53 71 6c 29 3b 0a 20 20 20 20 73 71 6c 69   zSql);.    sqli
6710: 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a  te3_free(zSql);.
6720: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
6730: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74  .}../*.** Free t
6740: 68 65 20 52 62 75 4f 62 6a 49 74 65 72 2e 61 7a  he RbuObjIter.az
6750: 54 62 6c 43 6f 6c 5b 5d 20 61 6e 64 20 52 62 75  TblCol[] and Rbu
6760: 4f 62 6a 49 74 65 72 2e 61 62 54 62 6c 50 6b 5b  ObjIter.abTblPk[
6770: 5d 20 61 72 72 61 79 73 20 61 6c 6c 6f 63 61 74  ] arrays allocat
6780: 65 64 0a 2a 2a 20 62 79 20 61 6e 20 65 61 72 6c  ed.** by an earl
6790: 69 65 72 20 63 61 6c 6c 20 74 6f 20 72 62 75 4f  ier call to rbuO
67a0: 62 6a 49 74 65 72 43 61 63 68 65 54 61 62 6c 65  bjIterCacheTable
67b0: 49 6e 66 6f 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  Info()..*/.stati
67c0: 63 20 76 6f 69 64 20 72 62 75 4f 62 6a 49 74 65  c void rbuObjIte
67d0: 72 46 72 65 65 43 6f 6c 73 28 52 62 75 4f 62 6a  rFreeCols(RbuObj
67e0: 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
67f0: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
6800: 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 54 62 6c 43  ; i<pIter->nTblC
6810: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  ol; i++){.    sq
6820: 6c 69 74 65 33 5f 66 72 65 65 28 70 49 74 65 72  lite3_free(pIter
6830: 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69 5d 29 3b 0a  ->azTblCol[i]);.
6840: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
6850: 28 70 49 74 65 72 2d 3e 61 7a 54 62 6c 54 79 70  (pIter->azTblTyp
6860: 65 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  e[i]);.  }.  sql
6870: 69 74 65 33 5f 66 72 65 65 28 70 49 74 65 72 2d  ite3_free(pIter-
6880: 3e 61 7a 54 62 6c 43 6f 6c 29 3b 0a 20 20 70 49  >azTblCol);.  pI
6890: 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 20 3d 20  ter->azTblCol = 
68a0: 30 3b 0a 20 20 70 49 74 65 72 2d 3e 61 7a 54 62  0;.  pIter->azTb
68b0: 6c 54 79 70 65 20 3d 20 30 3b 0a 20 20 70 49 74  lType = 0;.  pIt
68c0: 65 72 2d 3e 61 69 53 72 63 4f 72 64 65 72 20 3d  er->aiSrcOrder =
68d0: 20 30 3b 0a 20 20 70 49 74 65 72 2d 3e 61 62 54   0;.  pIter->abT
68e0: 62 6c 50 6b 20 3d 20 30 3b 0a 20 20 70 49 74 65  blPk = 0;.  pIte
68f0: 72 2d 3e 61 62 4e 6f 74 4e 75 6c 6c 20 3d 20 30  r->abNotNull = 0
6900: 3b 0a 20 20 70 49 74 65 72 2d 3e 6e 54 62 6c 43  ;.  pIter->nTblC
6910: 6f 6c 20 3d 20 30 3b 0a 20 20 70 49 74 65 72 2d  ol = 0;.  pIter-
6920: 3e 65 54 79 70 65 20 3d 20 30 3b 20 20 20 20 20  >eType = 0;     
6930: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 76            /* Inv
6940: 61 6c 69 64 20 76 61 6c 75 65 20 2a 2f 0a 7d 0a  alid value */.}.
6950: 0a 2f 2a 0a 2a 2a 20 46 69 6e 61 6c 69 7a 65 20  ./*.** Finalize 
6960: 61 6c 6c 20 73 74 61 74 65 6d 65 6e 74 73 20 61  all statements a
6970: 6e 64 20 66 72 65 65 20 61 6c 6c 20 61 6c 6c 6f  nd free all allo
6980: 63 61 74 69 6f 6e 73 20 74 68 61 74 20 61 72 65  cations that are
6990: 20 73 70 65 63 69 66 69 63 20 74 6f 0a 2a 2a 20   specific to.** 
69a0: 74 68 65 20 63 75 72 72 65 6e 74 20 6f 62 6a 65  the current obje
69b0: 63 74 20 28 74 61 62 6c 65 2f 69 6e 64 65 78 20  ct (table/index 
69c0: 70 61 69 72 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  pair)..*/.static
69d0: 20 76 6f 69 64 20 72 62 75 4f 62 6a 49 74 65 72   void rbuObjIter
69e0: 43 6c 65 61 72 53 74 61 74 65 6d 65 6e 74 73 28  ClearStatements(
69f0: 52 62 75 4f 62 6a 49 74 65 72 20 2a 70 49 74 65  RbuObjIter *pIte
6a00: 72 29 7b 0a 20 20 52 62 75 55 70 64 61 74 65 53  r){.  RbuUpdateS
6a10: 74 6d 74 20 2a 70 55 70 3b 0a 0a 20 20 73 71 6c  tmt *pUp;..  sql
6a20: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 49  ite3_finalize(pI
6a30: 74 65 72 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20  ter->pSelect);. 
6a40: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
6a50: 65 28 70 49 74 65 72 2d 3e 70 49 6e 73 65 72 74  e(pIter->pInsert
6a60: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  );.  sqlite3_fin
6a70: 61 6c 69 7a 65 28 70 49 74 65 72 2d 3e 70 44 65  alize(pIter->pDe
6a80: 6c 65 74 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  lete);.  sqlite3
6a90: 5f 66 69 6e 61 6c 69 7a 65 28 70 49 74 65 72 2d  _finalize(pIter-
6aa0: 3e 70 54 6d 70 49 6e 73 65 72 74 29 3b 0a 20 20  >pTmpInsert);.  
6ab0: 70 55 70 20 3d 20 70 49 74 65 72 2d 3e 70 52 62  pUp = pIter->pRb
6ac0: 75 55 70 64 61 74 65 3b 0a 20 20 77 68 69 6c 65  uUpdate;.  while
6ad0: 28 20 70 55 70 20 29 7b 0a 20 20 20 20 52 62 75  ( pUp ){.    Rbu
6ae0: 55 70 64 61 74 65 53 74 6d 74 20 2a 70 54 6d 70  UpdateStmt *pTmp
6af0: 20 3d 20 70 55 70 2d 3e 70 4e 65 78 74 3b 0a 20   = pUp->pNext;. 
6b00: 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
6b10: 69 7a 65 28 70 55 70 2d 3e 70 55 70 64 61 74 65  ize(pUp->pUpdate
6b20: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
6b30: 72 65 65 28 70 55 70 29 3b 0a 20 20 20 20 70 55  ree(pUp);.    pU
6b40: 70 20 3d 20 70 54 6d 70 3b 0a 20 20 7d 0a 20 20  p = pTmp;.  }.  
6b50: 0a 20 20 70 49 74 65 72 2d 3e 70 53 65 6c 65 63  .  pIter->pSelec
6b60: 74 20 3d 20 30 3b 0a 20 20 70 49 74 65 72 2d 3e  t = 0;.  pIter->
6b70: 70 49 6e 73 65 72 74 20 3d 20 30 3b 0a 20 20 70  pInsert = 0;.  p
6b80: 49 74 65 72 2d 3e 70 44 65 6c 65 74 65 20 3d 20  Iter->pDelete = 
6b90: 30 3b 0a 20 20 70 49 74 65 72 2d 3e 70 52 62 75  0;.  pIter->pRbu
6ba0: 55 70 64 61 74 65 20 3d 20 30 3b 0a 20 20 70 49  Update = 0;.  pI
6bb0: 74 65 72 2d 3e 70 54 6d 70 49 6e 73 65 72 74 20  ter->pTmpInsert 
6bc0: 3d 20 30 3b 0a 20 20 70 49 74 65 72 2d 3e 6e 43  = 0;.  pIter->nC
6bd0: 6f 6c 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ol = 0;.}../*.**
6be0: 20 43 6c 65 61 6e 20 75 70 20 61 6e 79 20 72 65   Clean up any re
6bf0: 73 6f 75 72 63 65 73 20 61 6c 6c 6f 63 61 74 65  sources allocate
6c00: 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  d as part of the
6c10: 20 69 74 65 72 61 74 6f 72 20 6f 62 6a 65 63 74   iterator object
6c20: 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68   passed.** as th
6c30: 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e  e only argument.
6c40: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6c50: 72 62 75 4f 62 6a 49 74 65 72 46 69 6e 61 6c 69  rbuObjIterFinali
6c60: 7a 65 28 52 62 75 4f 62 6a 49 74 65 72 20 2a 70  ze(RbuObjIter *p
6c70: 49 74 65 72 29 7b 0a 20 20 72 62 75 4f 62 6a 49  Iter){.  rbuObjI
6c80: 74 65 72 43 6c 65 61 72 53 74 61 74 65 6d 65 6e  terClearStatemen
6c90: 74 73 28 70 49 74 65 72 29 3b 0a 20 20 73 71 6c  ts(pIter);.  sql
6ca0: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 49  ite3_finalize(pI
6cb0: 74 65 72 2d 3e 70 54 62 6c 49 74 65 72 29 3b 0a  ter->pTblIter);.
6cc0: 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
6cd0: 7a 65 28 70 49 74 65 72 2d 3e 70 49 64 78 49 74  ze(pIter->pIdxIt
6ce0: 65 72 29 3b 0a 20 20 72 62 75 4f 62 6a 49 74 65  er);.  rbuObjIte
6cf0: 72 46 72 65 65 43 6f 6c 73 28 70 49 74 65 72 29  rFreeCols(pIter)
6d00: 3b 0a 20 20 6d 65 6d 73 65 74 28 70 49 74 65 72  ;.  memset(pIter
6d10: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 52 62 75 4f  , 0, sizeof(RbuO
6d20: 62 6a 49 74 65 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a  bjIter));.}../*.
6d30: 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 69  ** Advance the i
6d40: 74 65 72 61 74 6f 72 20 74 6f 20 74 68 65 20 6e  terator to the n
6d50: 65 78 74 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2a  ext position..**
6d60: 0a 2a 2a 20 49 66 20 6e 6f 20 65 72 72 6f 72 20  .** If no error 
6d70: 6f 63 63 75 72 73 2c 20 53 51 4c 49 54 45 5f 4f  occurs, SQLITE_O
6d80: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  K is returned an
6d90: 64 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 69  d the iterator i
6da0: 73 20 6c 65 66 74 20 0a 2a 2a 20 70 6f 69 6e 74  s left .** point
6db0: 69 6e 67 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ing to the next 
6dc0: 65 6e 74 72 79 2e 20 4f 74 68 65 72 77 69 73 65  entry. Otherwise
6dd0: 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  , an error code 
6de0: 61 6e 64 20 6d 65 73 73 61 67 65 20 69 73 20 0a  and message is .
6df0: 2a 2a 20 6c 65 66 74 20 69 6e 20 74 68 65 20 52  ** left in the R
6e00: 42 55 20 68 61 6e 64 6c 65 20 70 61 73 73 65 64  BU handle passed
6e10: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
6e20: 67 75 6d 65 6e 74 2e 20 41 20 63 6f 70 79 20 6f  gument. A copy o
6e30: 66 20 74 68 65 20 0a 2a 2a 20 65 72 72 6f 72 20  f the .** error 
6e40: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
6e50: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6e60: 72 62 75 4f 62 6a 49 74 65 72 4e 65 78 74 28 73  rbuObjIterNext(s
6e70: 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 52 62  qlite3rbu *p, Rb
6e80: 75 4f 62 6a 49 74 65 72 20 2a 70 49 74 65 72 29  uObjIter *pIter)
6e90: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 2d 3e  {.  int rc = p->
6ea0: 72 63 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  rc;.  if( rc==SQ
6eb0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 0a 20 20 20 20  LITE_OK ){..    
6ec0: 2f 2a 20 46 72 65 65 20 61 6e 79 20 53 51 4c 69  /* Free any SQLi
6ed0: 74 65 20 73 74 61 74 65 6d 65 6e 74 73 20 75 73  te statements us
6ee0: 65 64 20 77 68 69 6c 65 20 70 72 6f 63 65 73 73  ed while process
6ef0: 69 6e 67 20 74 68 65 20 70 72 65 76 69 6f 75 73  ing the previous
6f00: 20 6f 62 6a 65 63 74 20 2a 2f 20 0a 20 20 20 20   object */ .    
6f10: 72 62 75 4f 62 6a 49 74 65 72 43 6c 65 61 72 53  rbuObjIterClearS
6f20: 74 61 74 65 6d 65 6e 74 73 28 70 49 74 65 72 29  tatements(pIter)
6f30: 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  ;.    if( pIter-
6f40: 3e 7a 49 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20  >zIdx==0 ){.    
6f50: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
6f60: 78 65 63 28 70 2d 3e 64 62 4d 61 69 6e 2c 0a 20  xec(p->dbMain,. 
6f70: 20 20 20 20 20 20 20 20 20 22 44 52 4f 50 20 54           "DROP T
6f80: 52 49 47 47 45 52 20 49 46 20 45 58 49 53 54 53  RIGGER IF EXISTS
6f90: 20 74 65 6d 70 2e 72 62 75 5f 69 6e 73 65 72 74   temp.rbu_insert
6fa0: 5f 74 72 3b 22 0a 20 20 20 20 20 20 20 20 20 20  _tr;".          
6fb0: 22 44 52 4f 50 20 54 52 49 47 47 45 52 20 49 46  "DROP TRIGGER IF
6fc0: 20 45 58 49 53 54 53 20 74 65 6d 70 2e 72 62 75   EXISTS temp.rbu
6fd0: 5f 75 70 64 61 74 65 31 5f 74 72 3b 22 0a 20 20  _update1_tr;".  
6fe0: 20 20 20 20 20 20 20 20 22 44 52 4f 50 20 54 52          "DROP TR
6ff0: 49 47 47 45 52 20 49 46 20 45 58 49 53 54 53 20  IGGER IF EXISTS 
7000: 74 65 6d 70 2e 72 62 75 5f 75 70 64 61 74 65 32  temp.rbu_update2
7010: 5f 74 72 3b 22 0a 20 20 20 20 20 20 20 20 20 20  _tr;".          
7020: 22 44 52 4f 50 20 54 52 49 47 47 45 52 20 49 46  "DROP TRIGGER IF
7030: 20 45 58 49 53 54 53 20 74 65 6d 70 2e 72 62 75   EXISTS temp.rbu
7040: 5f 64 65 6c 65 74 65 5f 74 72 3b 22 0a 20 20 20  _delete_tr;".   
7050: 20 20 20 20 20 20 20 2c 20 30 2c 20 30 2c 20 26         , 0, 0, &
7060: 70 2d 3e 7a 45 72 72 6d 73 67 0a 20 20 20 20 20  p->zErrmsg.     
7070: 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69   );.    }..    i
7080: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
7090: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49   ){.      if( pI
70a0: 74 65 72 2d 3e 62 43 6c 65 61 6e 75 70 20 29 7b  ter->bCleanup ){
70b0: 0a 20 20 20 20 20 20 20 20 72 62 75 4f 62 6a 49  .        rbuObjI
70c0: 74 65 72 46 72 65 65 43 6f 6c 73 28 70 49 74 65  terFreeCols(pIte
70d0: 72 29 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65  r);.        pIte
70e0: 72 2d 3e 62 43 6c 65 61 6e 75 70 20 3d 20 30 3b  r->bCleanup = 0;
70f0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
7100: 6c 69 74 65 33 5f 73 74 65 70 28 70 49 74 65 72  lite3_step(pIter
7110: 2d 3e 70 54 62 6c 49 74 65 72 29 3b 0a 20 20 20  ->pTblIter);.   
7120: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
7130: 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20  ITE_ROW ){.     
7140: 20 20 20 20 20 72 63 20 3d 20 72 65 73 65 74 41       rc = resetA
7150: 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70  ndCollectError(p
7160: 49 74 65 72 2d 3e 70 54 62 6c 49 74 65 72 2c 20  Iter->pTblIter, 
7170: 26 70 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a 20 20  &p->zErrmsg);.  
7180: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 7a          pIter->z
7190: 54 62 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Tbl = 0;.       
71a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
71b0: 20 20 70 49 74 65 72 2d 3e 7a 54 62 6c 20 3d 20    pIter->zTbl = 
71c0: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
71d0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
71e0: 28 70 49 74 65 72 2d 3e 70 54 62 6c 49 74 65 72  (pIter->pTblIter
71f0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
7200: 70 49 74 65 72 2d 3e 7a 44 61 74 61 54 62 6c 20  pIter->zDataTbl 
7210: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
7220: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
7230: 78 74 28 70 49 74 65 72 2d 3e 70 54 62 6c 49 74  xt(pIter->pTblIt
7240: 65 72 2c 31 29 3b 0a 20 20 20 20 20 20 20 20 20  er,1);.         
7250: 20 72 63 20 3d 20 28 70 49 74 65 72 2d 3e 7a 44   rc = (pIter->zD
7260: 61 74 61 54 62 6c 20 26 26 20 70 49 74 65 72 2d  ataTbl && pIter-
7270: 3e 7a 54 62 6c 29 20 3f 20 53 51 4c 49 54 45 5f  >zTbl) ? SQLITE_
7280: 4f 4b 20 3a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  OK : SQLITE_NOME
7290: 4d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  M;.        }.   
72a0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
72b0: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 7a 49 64    if( pIter->zId
72c0: 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  x==0 ){.        
72d0: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
72e0: 70 49 64 78 20 3d 20 70 49 74 65 72 2d 3e 70 49  pIdx = pIter->pI
72f0: 64 78 49 74 65 72 3b 0a 20 20 20 20 20 20 20 20  dxIter;.        
7300: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
7310: 69 6e 64 5f 74 65 78 74 28 70 49 64 78 2c 20 31  ind_text(pIdx, 1
7320: 2c 20 70 49 74 65 72 2d 3e 7a 54 62 6c 2c 20 2d  , pIter->zTbl, -
7330: 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  1, SQLITE_STATIC
7340: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
7350: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
7360: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
7370: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
7380: 5f 73 74 65 70 28 70 49 74 65 72 2d 3e 70 49 64  _step(pIter->pId
7390: 78 49 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20  xIter);.        
73a0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
73b0: 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 20 20  _ROW ){.        
73c0: 20 20 20 20 72 63 20 3d 20 72 65 73 65 74 41 6e      rc = resetAn
73d0: 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 49  dCollectError(pI
73e0: 74 65 72 2d 3e 70 49 64 78 49 74 65 72 2c 20 26  ter->pIdxIter, &
73f0: 70 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a 20 20 20  p->zErrmsg);.   
7400: 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e           pIter->
7410: 62 43 6c 65 61 6e 75 70 20 3d 20 31 3b 0a 20 20  bCleanup = 1;.  
7420: 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d            pIter-
7430: 3e 7a 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 20  >zIdx = 0;.     
7440: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
7450: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 7a          pIter->z
7460: 49 64 78 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  Idx = (const cha
7470: 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
7480: 6e 5f 74 65 78 74 28 70 49 74 65 72 2d 3e 70 49  n_text(pIter->pI
7490: 64 78 49 74 65 72 2c 20 30 29 3b 0a 20 20 20 20  dxIter, 0);.    
74a0: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69          pIter->i
74b0: 54 6e 75 6d 20 3d 20 73 71 6c 69 74 65 33 5f 63  Tnum = sqlite3_c
74c0: 6f 6c 75 6d 6e 5f 69 6e 74 28 70 49 74 65 72 2d  olumn_int(pIter-
74d0: 3e 70 49 64 78 49 74 65 72 2c 20 31 29 3b 0a 20  >pIdxIter, 1);. 
74e0: 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72             pIter
74f0: 2d 3e 62 55 6e 69 71 75 65 20 3d 20 73 71 6c 69  ->bUnique = sqli
7500: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
7510: 49 74 65 72 2d 3e 70 49 64 78 49 74 65 72 2c 20  Iter->pIdxIter, 
7520: 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  2);.            
7530: 72 63 20 3d 20 70 49 74 65 72 2d 3e 7a 49 64 78  rc = pIter->zIdx
7540: 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53   ? SQLITE_OK : S
7550: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
7560: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7570: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
7580: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d  .  }..  if( rc!=
7590: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
75a0: 20 72 62 75 4f 62 6a 49 74 65 72 46 69 6e 61 6c   rbuObjIterFinal
75b0: 69 7a 65 28 70 49 74 65 72 29 3b 0a 20 20 20 20  ize(pIter);.    
75c0: 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 7d 0a  p->rc = rc;.  }.
75d0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
75e0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65  ./*.** The imple
75f0: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
7600: 20 72 62 75 5f 74 61 72 67 65 74 5f 6e 61 6d 65   rbu_target_name
7610: 28 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2e  () SQL function.
7620: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   This function.*
7630: 2a 20 61 63 63 65 70 74 73 20 6f 6e 65 20 6f 72  * accepts one or
7640: 20 74 77 6f 20 61 72 67 75 6d 65 6e 74 73 2e 20   two arguments. 
7650: 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  The first argume
7660: 6e 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  nt is the name o
7670: 66 20 61 20 74 61 62 6c 65 20 2d 0a 2a 2a 20 74  f a table -.** t
7680: 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 74 61 62  he name of a tab
7690: 6c 65 20 69 6e 20 74 68 65 20 52 42 55 20 64 61  le in the RBU da
76a0: 74 61 62 61 73 65 2e 20 20 54 68 65 20 73 65 63  tabase.  The sec
76b0: 6f 6e 64 2c 20 69 66 20 69 74 20 69 73 20 70 72  ond, if it is pr
76c0: 65 73 65 6e 74 2c 20 69 73 20 31 0a 2a 2a 20 66  esent, is 1.** f
76d0: 6f 72 20 61 20 76 69 65 77 20 6f 72 20 30 20 66  or a view or 0 f
76e0: 6f 72 20 61 20 74 61 62 6c 65 2e 20 0a 2a 2a 0a  or a table. .**.
76f0: 2a 2a 20 46 6f 72 20 61 20 6e 6f 6e 2d 76 61 63  ** For a non-vac
7700: 75 75 6d 20 52 42 55 20 68 61 6e 64 6c 65 2c 20  uum RBU handle, 
7710: 69 66 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  if the table nam
7720: 65 20 6d 61 74 63 68 65 73 20 74 68 65 20 70 61  e matches the pa
7730: 74 74 65 72 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ttern:.**.**    
7740: 20 64 61 74 61 5b 30 2d 39 5d 5f 3c 6e 61 6d 65   data[0-9]_<name
7750: 3e 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 3c 6e  >.**.** where <n
7760: 61 6d 65 3e 20 69 73 20 61 6e 79 20 73 65 71 75  ame> is any sequ
7770: 65 6e 63 65 20 6f 66 20 31 20 6f 72 20 6d 6f 72  ence of 1 or mor
7780: 65 20 63 68 61 72 61 63 74 65 72 73 2c 20 3c 6e  e characters, <n
7790: 61 6d 65 3e 20 69 73 20 72 65 74 75 72 6e 65 64  ame> is returned
77a0: 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
77b0: 69 66 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75  if the only argu
77c0: 6d 65 6e 74 20 64 6f 65 73 20 6e 6f 74 20 6d 61  ment does not ma
77d0: 74 63 68 20 74 68 65 20 61 62 6f 76 65 20 70 61  tch the above pa
77e0: 74 74 65 72 6e 2c 20 61 6e 20 53 51 4c 0a 2a 2a  ttern, an SQL.**
77f0: 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
7800: 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 22 64 61  d..**.**     "da
7810: 74 61 5f 74 31 22 20 20 20 20 20 2d 3e 20 22 74  ta_t1"     -> "t
7820: 31 22 0a 2a 2a 20 20 20 20 20 22 64 61 74 61 30  1".**     "data0
7830: 31 32 33 5f 74 32 22 20 2d 3e 20 22 74 32 22 0a  123_t2" -> "t2".
7840: 2a 2a 20 20 20 20 20 22 64 61 74 61 41 42 5f 74  **     "dataAB_t
7850: 33 22 20 20 20 2d 3e 20 4e 55 4c 4c 0a 2a 2a 0a  3"   -> NULL.**.
7860: 2a 2a 20 46 6f 72 20 61 6e 20 72 62 75 20 76 61  ** For an rbu va
7870: 63 75 75 6d 20 68 61 6e 64 6c 65 2c 20 61 20 63  cuum handle, a c
7880: 6f 70 79 20 6f 66 20 74 68 65 20 66 69 72 73 74  opy of the first
7890: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 72 65 74   argument is ret
78a0: 75 72 6e 65 64 20 69 66 0a 2a 2a 20 74 68 65 20  urned if.** the 
78b0: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
78c0: 69 73 20 65 69 74 68 65 72 20 6d 69 73 73 69 6e  is either missin
78d0: 67 20 6f 72 20 30 20 28 6e 6f 74 20 61 20 76 69  g or 0 (not a vi
78e0: 65 77 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ew)..*/.static v
78f0: 6f 69 64 20 72 62 75 54 61 72 67 65 74 4e 61 6d  oid rbuTargetNam
7900: 65 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33  eFunc(.  sqlite3
7910: 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 0a  _context *pCtx,.
7920: 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71    int argc,.  sq
7930: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
7940: 67 76 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 72  gv.){.  sqlite3r
7950: 62 75 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 5f  bu *p = sqlite3_
7960: 75 73 65 72 5f 64 61 74 61 28 70 43 74 78 29 3b  user_data(pCtx);
7970: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
7980: 49 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 61 72  In;.  assert( ar
7990: 67 63 3d 3d 31 20 7c 7c 20 61 72 67 63 3d 3d 32  gc==1 || argc==2
79a0: 20 29 3b 0a 0a 20 20 7a 49 6e 20 3d 20 28 63 6f   );..  zIn = (co
79b0: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
79c0: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
79d0: 76 5b 30 5d 29 3b 0a 20 20 69 66 28 20 7a 49 6e  v[0]);.  if( zIn
79e0: 20 29 7b 0a 20 20 20 20 69 66 28 20 72 62 75 49   ){.    if( rbuI
79f0: 73 56 61 63 75 75 6d 28 70 29 20 29 7b 0a 20 20  sVacuum(p) ){.  
7a00: 20 20 20 20 69 66 28 20 61 72 67 63 3d 3d 31 20      if( argc==1 
7a10: 7c 7c 20 30 3d 3d 73 71 6c 69 74 65 33 5f 76 61  || 0==sqlite3_va
7a20: 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b 31 5d 29  lue_int(argv[1])
7a30: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
7a40: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
7a50: 70 43 74 78 2c 20 7a 49 6e 2c 20 2d 31 2c 20 53  pCtx, zIn, -1, S
7a60: 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
7a70: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
7a80: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 6c  {.      if( strl
7a90: 65 6e 28 7a 49 6e 29 3e 34 20 26 26 20 6d 65 6d  en(zIn)>4 && mem
7aa0: 63 6d 70 28 22 64 61 74 61 22 2c 20 7a 49 6e 2c  cmp("data", zIn,
7ab0: 20 34 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   4)==0 ){.      
7ac0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20    int i;.       
7ad0: 20 66 6f 72 28 69 3d 34 3b 20 7a 49 6e 5b 69 5d   for(i=4; zIn[i]
7ae0: 3e 3d 27 30 27 20 26 26 20 7a 49 6e 5b 69 5d 3c  >='0' && zIn[i]<
7af0: 3d 27 39 27 3b 20 69 2b 2b 29 3b 0a 20 20 20 20  ='9'; i++);.    
7b00: 20 20 20 20 69 66 28 20 7a 49 6e 5b 69 5d 3d 3d      if( zIn[i]==
7b10: 27 5f 27 20 26 26 20 7a 49 6e 5b 69 2b 31 5d 20  '_' && zIn[i+1] 
7b20: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
7b30: 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
7b40: 28 70 43 74 78 2c 20 26 7a 49 6e 5b 69 2b 31 5d  (pCtx, &zIn[i+1]
7b50: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41  , -1, SQLITE_STA
7b60: 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  TIC);.        }.
7b70: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
7b80: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  }.}../*.** Initi
7b90: 61 6c 69 7a 65 20 74 68 65 20 69 74 65 72 61 74  alize the iterat
7ba0: 6f 72 20 73 74 72 75 63 74 75 72 65 20 70 61 73  or structure pas
7bb0: 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
7bc0: 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a  d argument..**.*
7bd0: 2a 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63  * If no error oc
7be0: 63 75 72 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  curs, SQLITE_OK 
7bf0: 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
7c00: 74 68 65 20 69 74 65 72 61 74 6f 72 20 69 73 20  the iterator is 
7c10: 6c 65 66 74 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e  left .** pointin
7c20: 67 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65  g to the first e
7c30: 6e 74 72 79 2e 20 4f 74 68 65 72 77 69 73 65 2c  ntry. Otherwise,
7c40: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 61   an error code a
7c50: 6e 64 20 6d 65 73 73 61 67 65 20 69 73 20 0a 2a  nd message is .*
7c60: 2a 20 6c 65 66 74 20 69 6e 20 74 68 65 20 52 42  * left in the RB
7c70: 55 20 68 61 6e 64 6c 65 20 70 61 73 73 65 64 20  U handle passed 
7c80: 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
7c90: 75 6d 65 6e 74 2e 20 41 20 63 6f 70 79 20 6f 66  ument. A copy of
7ca0: 20 74 68 65 20 0a 2a 2a 20 65 72 72 6f 72 20 63   the .** error c
7cb0: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
7cc0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
7cd0: 62 75 4f 62 6a 49 74 65 72 46 69 72 73 74 28 73  buObjIterFirst(s
7ce0: 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 52 62  qlite3rbu *p, Rb
7cf0: 75 4f 62 6a 49 74 65 72 20 2a 70 49 74 65 72 29  uObjIter *pIter)
7d00: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 6d 65  {.  int rc;.  me
7d10: 6d 73 65 74 28 70 49 74 65 72 2c 20 30 2c 20 73  mset(pIter, 0, s
7d20: 69 7a 65 6f 66 28 52 62 75 4f 62 6a 49 74 65 72  izeof(RbuObjIter
7d30: 29 29 3b 0a 0a 20 20 72 63 20 3d 20 70 72 65 70  ));..  rc = prep
7d40: 61 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63  areFreeAndCollec
7d50: 74 45 72 72 6f 72 28 70 2d 3e 64 62 52 62 75 2c  tError(p->dbRbu,
7d60: 20 26 70 49 74 65 72 2d 3e 70 54 62 6c 49 74 65   &pIter->pTblIte
7d70: 72 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 20  r, &p->zErrmsg, 
7d80: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72  .    sqlite3_mpr
7d90: 69 6e 74 66 28 0a 20 20 20 20 20 20 22 53 45 4c  intf(.      "SEL
7da0: 45 43 54 20 72 62 75 5f 74 61 72 67 65 74 5f 6e  ECT rbu_target_n
7db0: 61 6d 65 28 6e 61 6d 65 2c 20 74 79 70 65 3d 27  ame(name, type='
7dc0: 76 69 65 77 27 29 20 41 53 20 74 61 72 67 65 74  view') AS target
7dd0: 2c 20 6e 61 6d 65 20 22 0a 20 20 20 20 20 20 22  , name ".      "
7de0: 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
7df0: 65 72 20 22 0a 20 20 20 20 20 20 22 57 48 45 52  er ".      "WHER
7e00: 45 20 74 79 70 65 20 49 4e 20 28 27 74 61 62 6c  E type IN ('tabl
7e10: 65 27 2c 20 27 76 69 65 77 27 29 20 41 4e 44 20  e', 'view') AND 
7e20: 74 61 72 67 65 74 20 49 53 20 4e 4f 54 20 4e 55  target IS NOT NU
7e30: 4c 4c 20 22 0a 20 20 20 20 20 20 22 20 25 73 20  LL ".      " %s 
7e40: 22 0a 20 20 20 20 20 20 22 4f 52 44 45 52 20 42  ".      "ORDER B
7e50: 59 20 6e 61 6d 65 22 0a 20 20 2c 20 72 62 75 49  Y name".  , rbuI
7e60: 73 56 61 63 75 75 6d 28 70 29 20 3f 20 22 41 4e  sVacuum(p) ? "AN
7e70: 44 20 72 6f 6f 74 70 61 67 65 21 3d 30 20 41 4e  D rootpage!=0 AN
7e80: 44 20 72 6f 6f 74 70 61 67 65 20 49 53 20 4e 4f  D rootpage IS NO
7e90: 54 20 4e 55 4c 4c 22 20 3a 20 22 22 29 29 3b 0a  T NULL" : ""));.
7ea0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
7eb0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
7ec0: 20 70 72 65 70 61 72 65 41 6e 64 43 6f 6c 6c 65   prepareAndColle
7ed0: 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 4d 61 69  ctError(p->dbMai
7ee0: 6e 2c 20 26 70 49 74 65 72 2d 3e 70 49 64 78 49  n, &pIter->pIdxI
7ef0: 74 65 72 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67  ter, &p->zErrmsg
7f00: 2c 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45 43  ,.        "SELEC
7f10: 54 20 6e 61 6d 65 2c 20 72 6f 6f 74 70 61 67 65  T name, rootpage
7f20: 2c 20 73 71 6c 20 49 53 20 4e 55 4c 4c 20 4f 52  , sql IS NULL OR
7f30: 20 73 75 62 73 74 72 28 38 2c 20 36 29 3d 3d 27   substr(8, 6)=='
7f40: 55 4e 49 51 55 45 27 20 22 0a 20 20 20 20 20 20  UNIQUE' ".      
7f50: 20 20 22 20 20 46 52 4f 4d 20 6d 61 69 6e 2e 73    "  FROM main.s
7f60: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 22 0a 20  qlite_master ". 
7f70: 20 20 20 20 20 20 20 22 20 20 57 48 45 52 45 20         "  WHERE 
7f80: 74 79 70 65 3d 27 69 6e 64 65 78 27 20 41 4e 44  type='index' AND
7f90: 20 74 62 6c 5f 6e 61 6d 65 20 3d 20 3f 22 0a 20   tbl_name = ?". 
7fa0: 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 70 49 74     );.  }..  pIt
7fb0: 65 72 2d 3e 62 43 6c 65 61 6e 75 70 20 3d 20 31  er->bCleanup = 1
7fc0: 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a  ;.  p->rc = rc;.
7fd0: 20 20 72 65 74 75 72 6e 20 72 62 75 4f 62 6a 49    return rbuObjI
7fe0: 74 65 72 4e 65 78 74 28 70 2c 20 70 49 74 65 72  terNext(p, pIter
7ff0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
8000: 20 69 73 20 61 20 77 72 61 70 70 65 72 20 61 72   is a wrapper ar
8010: 6f 75 6e 64 20 22 73 71 6c 69 74 65 33 5f 6d 70  ound "sqlite3_mp
8020: 72 69 6e 74 66 28 7a 46 6d 74 2c 20 2e 2e 2e 29  rintf(zFmt, ...)
8030: 22 2e 20 49 66 20 61 6e 20 4f 4f 4d 20 6f 63 63  ". If an OOM occ
8040: 75 72 73 2c 0a 2a 2a 20 61 6e 20 65 72 72 6f 72  urs,.** an error
8050: 20 63 6f 64 65 20 69 73 20 73 74 6f 72 65 64 20   code is stored 
8060: 69 6e 20 74 68 65 20 52 42 55 20 68 61 6e 64 6c  in the RBU handl
8070: 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
8080: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a  first argument..
8090: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
80a0: 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63  r has already oc
80b0: 63 75 72 72 65 64 20 28 70 2d 3e 72 63 20 69 73  curred (p->rc is
80c0: 20 61 6c 72 65 61 64 79 20 73 65 74 20 74 6f 20   already set to 
80d0: 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 0a  something other.
80e0: 2a 2a 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f  ** than SQLITE_O
80f0: 4b 29 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75  K), then this fu
8100: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 4e  nction returns N
8110: 55 4c 4c 20 77 69 74 68 6f 75 74 20 6d 6f 64 69  ULL without modi
8120: 66 79 69 6e 67 20 74 68 65 0a 2a 2a 20 73 74 6f  fying the.** sto
8130: 72 65 64 20 65 72 72 6f 72 20 63 6f 64 65 2e 20  red error code. 
8140: 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 20  In this case it 
8150: 73 74 69 6c 6c 20 63 61 6c 6c 73 20 73 71 6c 69  still calls sqli
8160: 74 65 33 5f 66 72 65 65 28 29 20 6f 6e 20 61 6e  te3_free() on an
8170: 79 20 0a 2a 2a 20 70 72 69 6e 74 66 28 29 20 70  y .** printf() p
8180: 61 72 61 6d 65 74 65 72 73 20 61 73 73 6f 63 69  arameters associ
8190: 61 74 65 64 20 77 69 74 68 20 25 7a 20 63 6f 6e  ated with %z con
81a0: 76 65 72 73 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61  versions..*/.sta
81b0: 74 69 63 20 63 68 61 72 20 2a 72 62 75 4d 50 72  tic char *rbuMPr
81c0: 69 6e 74 66 28 73 71 6c 69 74 65 33 72 62 75 20  intf(sqlite3rbu 
81d0: 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
81e0: 7a 46 6d 74 2c 20 2e 2e 2e 29 7b 0a 20 20 63 68  zFmt, ...){.  ch
81f0: 61 72 20 2a 7a 53 71 6c 20 3d 20 30 3b 0a 20 20  ar *zSql = 0;.  
8200: 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 76 61  va_list ap;.  va
8210: 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6d 74 29  _start(ap, zFmt)
8220: 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74  ;.  zSql = sqlit
8230: 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6d 74  e3_vmprintf(zFmt
8240: 2c 20 61 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e  , ap);.  if( p->
8250: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
8260: 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30  .    if( zSql==0
8270: 20 29 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54   ) p->rc = SQLIT
8280: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65  E_NOMEM;.  }else
8290: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
82a0: 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 7a 53  ee(zSql);.    zS
82b0: 71 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 76 61  ql = 0;.  }.  va
82c0: 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72 65 74 75  _end(ap);.  retu
82d0: 72 6e 20 7a 53 71 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn zSql;.}../*.*
82e0: 2a 20 41 72 67 75 6d 65 6e 74 20 7a 46 6d 74 20  * Argument zFmt 
82f0: 69 73 20 61 20 73 71 6c 69 74 65 33 5f 6d 70 72  is a sqlite3_mpr
8300: 69 6e 74 66 28 29 20 73 74 79 6c 65 20 66 6f 72  intf() style for
8310: 6d 61 74 20 73 74 72 69 6e 67 2e 20 54 68 65 20  mat string. The 
8320: 74 72 61 69 6c 69 6e 67 0a 2a 2a 20 61 72 67 75  trailing.** argu
8330: 6d 65 6e 74 73 20 61 72 65 20 74 68 65 20 75 73  ments are the us
8340: 75 61 6c 20 73 75 62 73 69 74 75 74 69 6f 6e 20  ual subsitution 
8350: 76 61 6c 75 65 73 2e 20 54 68 69 73 20 66 75 6e  values. This fun
8360: 63 74 69 6f 6e 20 70 65 72 66 6f 72 6d 73 0a 2a  ction performs.*
8370: 2a 20 74 68 65 20 70 72 69 6e 74 66 28 29 20 73  * the printf() s
8380: 74 79 6c 65 20 73 75 62 73 74 69 74 75 74 69 6f  tyle substitutio
8390: 6e 73 20 61 6e 64 20 65 78 65 63 75 74 65 73 20  ns and executes 
83a0: 74 68 65 20 72 65 73 75 6c 74 20 61 73 20 61 6e  the result as an
83b0: 20 53 51 4c 0a 2a 2a 20 73 74 61 74 65 6d 65 6e   SQL.** statemen
83c0: 74 20 6f 6e 20 74 68 65 20 52 42 55 20 68 61 6e  t on the RBU han
83d0: 64 6c 65 73 20 64 61 74 61 62 61 73 65 2e 0a 2a  dles database..*
83e0: 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
83f0: 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f   occurs, an erro
8400: 72 20 63 6f 64 65 20 61 6e 64 20 65 72 72 6f 72  r code and error
8410: 20 6d 65 73 73 61 67 65 20 69 73 20 73 74 6f 72   message is stor
8420: 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 52 42 55  ed in the.** RBU
8430: 20 68 61 6e 64 6c 65 2e 20 49 66 20 61 6e 20 65   handle. If an e
8440: 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79  rror has already
8450: 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e 20 74   occurred when t
8460: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a  his function is.
8470: 2a 2a 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73  ** called, it is
8480: 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
8490: 74 69 63 20 69 6e 74 20 72 62 75 4d 50 72 69 6e  tic int rbuMPrin
84a0: 74 66 45 78 65 63 28 73 71 6c 69 74 65 33 72 62  tfExec(sqlite3rb
84b0: 75 20 2a 70 2c 20 73 71 6c 69 74 65 33 20 2a 64  u *p, sqlite3 *d
84c0: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
84d0: 46 6d 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f  Fmt, ...){.  va_
84e0: 6c 69 73 74 20 61 70 3b 0a 20 20 63 68 61 72 20  list ap;.  char 
84f0: 2a 7a 53 71 6c 3b 0a 20 20 76 61 5f 73 74 61 72  *zSql;.  va_star
8500: 74 28 61 70 2c 20 7a 46 6d 74 29 3b 0a 20 20 7a  t(ap, zFmt);.  z
8510: 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 6d  Sql = sqlite3_vm
8520: 70 72 69 6e 74 66 28 7a 46 6d 74 2c 20 61 70 29  printf(zFmt, ap)
8530: 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ;.  if( p->rc==S
8540: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
8550: 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20  if( zSql==0 ){. 
8560: 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c       p->rc = SQL
8570: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
8580: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 72  else{.      p->r
8590: 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  c = sqlite3_exec
85a0: 28 64 62 2c 20 7a 53 71 6c 2c 20 30 2c 20 30 2c  (db, zSql, 0, 0,
85b0: 20 26 70 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a 20   &p->zErrmsg);. 
85c0: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
85d0: 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20  e3_free(zSql);. 
85e0: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72   va_end(ap);.  r
85f0: 65 74 75 72 6e 20 70 2d 3e 72 63 3b 0a 7d 0a 0a  eturn p->rc;.}..
8600: 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f  /*.** Attempt to
8610: 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72 65   allocate and re
8620: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
8630: 6f 20 61 20 7a 65 72 6f 65 64 20 62 6c 6f 63 6b  o a zeroed block
8640: 20 6f 66 20 6e 42 79 74 65 20 0a 2a 2a 20 62 79   of nByte .** by
8650: 74 65 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61  tes. .**.** If a
8660: 6e 20 65 72 72 6f 72 20 28 69 2e 65 2e 20 61 6e  n error (i.e. an
8670: 20 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e 29 20   OOM condition) 
8680: 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 4e  occurs, return N
8690: 55 4c 4c 20 61 6e 64 20 6c 65 61 76 65 20 61 6e  ULL and leave an
86a0: 20 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20   .** error code 
86b0: 69 6e 20 74 68 65 20 72 62 75 20 68 61 6e 64 6c  in the rbu handl
86c0: 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
86d0: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20  first argument. 
86e0: 4f 72 2c 20 69 66 20 61 6e 20 0a 2a 2a 20 65 72  Or, if an .** er
86f0: 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79 20  ror has already 
8700: 6f 63 63 75 72 72 65 64 20 77 68 65 6e 20 74 68  occurred when th
8710: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
8720: 61 6c 6c 65 64 2c 20 72 65 74 75 72 6e 20 4e 55  alled, return NU
8730: 4c 4c 20 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65  LL .** immediate
8740: 6c 79 20 77 69 74 68 6f 75 74 20 61 74 74 65 6d  ly without attem
8750: 70 74 69 6e 67 20 74 68 65 20 61 6c 6c 6f 63 61  pting the alloca
8760: 74 69 6f 6e 20 6f 72 20 6d 6f 64 69 66 79 69 6e  tion or modifyin
8770: 67 20 74 68 65 20 73 74 6f 72 65 64 0a 2a 2a 20  g the stored.** 
8780: 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73  error code..*/.s
8790: 74 61 74 69 63 20 76 6f 69 64 20 2a 72 62 75 4d  tatic void *rbuM
87a0: 61 6c 6c 6f 63 28 73 71 6c 69 74 65 33 72 62 75  alloc(sqlite3rbu
87b0: 20 2a 70 2c 20 69 6e 74 20 6e 42 79 74 65 29 7b   *p, int nByte){
87c0: 0a 20 20 76 6f 69 64 20 2a 70 52 65 74 20 3d 20  .  void *pRet = 
87d0: 30 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  0;.  if( p->rc==
87e0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
87f0: 20 61 73 73 65 72 74 28 20 6e 42 79 74 65 3e 30   assert( nByte>0
8800: 20 29 3b 0a 20 20 20 20 70 52 65 74 20 3d 20 73   );.    pRet = s
8810: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28  qlite3_malloc64(
8820: 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20  nByte);.    if( 
8830: 70 52 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pRet==0 ){.     
8840: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
8850: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65  NOMEM;.    }else
8860: 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70  {.      memset(p
8870: 52 65 74 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a  Ret, 0, nByte);.
8880: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
8890: 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 0a 2f 2a 0a  rn pRet;.}.../*.
88a0: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20  ** Allocate and 
88b0: 7a 65 72 6f 20 74 68 65 20 70 49 74 65 72 2d 3e  zero the pIter->
88c0: 61 7a 54 62 6c 43 6f 6c 5b 5d 20 61 6e 64 20 61  azTblCol[] and a
88d0: 62 54 62 6c 50 6b 5b 5d 20 61 72 72 61 79 73 20  bTblPk[] arrays 
88e0: 73 6f 20 74 68 61 74 0a 2a 2a 20 74 68 65 72 65  so that.** there
88f0: 20 69 73 20 72 6f 6f 6d 20 66 6f 72 20 61 74 20   is room for at 
8900: 6c 65 61 73 74 20 6e 43 6f 6c 20 65 6c 65 6d 65  least nCol eleme
8910: 6e 74 73 2e 20 49 66 20 61 6e 20 4f 4f 4d 20 6f  nts. If an OOM o
8920: 63 63 75 72 73 2c 20 73 74 6f 72 65 20 61 6e 0a  ccurs, store an.
8930: 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 6e  ** error code in
8940: 20 74 68 65 20 52 42 55 20 68 61 6e 64 6c 65 20   the RBU handle 
8950: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
8960: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  rst argument..*/
8970: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75  .static void rbu
8980: 41 6c 6c 6f 63 61 74 65 49 74 65 72 41 72 72 61  AllocateIterArra
8990: 79 73 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70  ys(sqlite3rbu *p
89a0: 2c 20 52 62 75 4f 62 6a 49 74 65 72 20 2a 70 49  , RbuObjIter *pI
89b0: 74 65 72 2c 20 69 6e 74 20 6e 43 6f 6c 29 7b 0a  ter, int nCol){.
89c0: 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 32    int nByte = (2
89d0: 2a 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 20 2b  *sizeof(char*) +
89e0: 20 73 69 7a 65 6f 66 28 69 6e 74 29 20 2b 20 33   sizeof(int) + 3
89f0: 2a 73 69 7a 65 6f 66 28 75 38 29 29 20 2a 20 6e  *sizeof(u8)) * n
8a00: 43 6f 6c 3b 0a 20 20 63 68 61 72 20 2a 2a 61 7a  Col;.  char **az
8a10: 4e 65 77 3b 0a 0a 20 20 61 7a 4e 65 77 20 3d 20  New;..  azNew = 
8a20: 28 63 68 61 72 2a 2a 29 72 62 75 4d 61 6c 6c 6f  (char**)rbuMallo
8a30: 63 28 70 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69  c(p, nByte);.  i
8a40: 66 28 20 61 7a 4e 65 77 20 29 7b 0a 20 20 20 20  f( azNew ){.    
8a50: 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 20  pIter->azTblCol 
8a60: 3d 20 61 7a 4e 65 77 3b 0a 20 20 20 20 70 49 74  = azNew;.    pIt
8a70: 65 72 2d 3e 61 7a 54 62 6c 54 79 70 65 20 3d 20  er->azTblType = 
8a80: 26 61 7a 4e 65 77 5b 6e 43 6f 6c 5d 3b 0a 20 20  &azNew[nCol];.  
8a90: 20 20 70 49 74 65 72 2d 3e 61 69 53 72 63 4f 72    pIter->aiSrcOr
8aa0: 64 65 72 20 3d 20 28 69 6e 74 2a 29 26 70 49 74  der = (int*)&pIt
8ab0: 65 72 2d 3e 61 7a 54 62 6c 54 79 70 65 5b 6e 43  er->azTblType[nC
8ac0: 6f 6c 5d 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  ol];.    pIter->
8ad0: 61 62 54 62 6c 50 6b 20 3d 20 28 75 38 2a 29 26  abTblPk = (u8*)&
8ae0: 70 49 74 65 72 2d 3e 61 69 53 72 63 4f 72 64 65  pIter->aiSrcOrde
8af0: 72 5b 6e 43 6f 6c 5d 3b 0a 20 20 20 20 70 49 74  r[nCol];.    pIt
8b00: 65 72 2d 3e 61 62 4e 6f 74 4e 75 6c 6c 20 3d 20  er->abNotNull = 
8b10: 28 75 38 2a 29 26 70 49 74 65 72 2d 3e 61 62 54  (u8*)&pIter->abT
8b20: 62 6c 50 6b 5b 6e 43 6f 6c 5d 3b 0a 20 20 20 20  blPk[nCol];.    
8b30: 70 49 74 65 72 2d 3e 61 62 49 6e 64 65 78 65 64  pIter->abIndexed
8b40: 20 3d 20 28 75 38 2a 29 26 70 49 74 65 72 2d 3e   = (u8*)&pIter->
8b50: 61 62 4e 6f 74 4e 75 6c 6c 5b 6e 43 6f 6c 5d 3b  abNotNull[nCol];
8b60: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
8b70: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
8b80: 20 6d 75 73 74 20 62 65 20 61 20 6e 75 6c 2d 74   must be a nul-t
8b90: 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67  erminated string
8ba0: 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  . This function.
8bb0: 2a 2a 20 72 65 74 75 72 6e 73 20 61 20 63 6f 70  ** returns a cop
8bc0: 79 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67 20  y of the string 
8bd0: 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  in memory obtain
8be0: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ed from sqlite3_
8bf0: 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 49 74 20  malloc()..** It 
8c00: 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62  is the responsib
8c10: 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c  ility of the cal
8c20: 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c  ler to eventuall
8c30: 79 20 66 72 65 65 20 74 68 69 73 20 6d 65 6d 6f  y free this memo
8c40: 72 79 0a 2a 2a 20 75 73 69 6e 67 20 73 71 6c 69  ry.** using sqli
8c50: 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2a 0a 2a  te3_free()..**.*
8c60: 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 63 6f 6e 64  * If an OOM cond
8c70: 69 74 69 6f 6e 20 69 73 20 65 6e 63 6f 75 6e 74  ition is encount
8c80: 65 72 65 64 20 77 68 65 6e 20 61 74 74 65 6d 70  ered when attemp
8c90: 74 69 6e 67 20 74 6f 20 61 6c 6c 6f 63 61 74 65  ting to allocate
8ca0: 20 6d 65 6d 6f 72 79 2c 0a 2a 2a 20 6f 75 74 70   memory,.** outp
8cb0: 75 74 20 76 61 72 69 61 62 6c 65 20 28 2a 70 52  ut variable (*pR
8cc0: 63 29 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c  c) is set to SQL
8cd0: 49 54 45 5f 4e 4f 4d 45 4d 20 62 65 66 6f 72 65  ITE_NOMEM before
8ce0: 20 72 65 74 75 72 6e 69 6e 67 2e 20 4f 74 68 65   returning. Othe
8cf0: 72 77 69 73 65 2c 0a 2a 2a 20 69 66 20 74 68 65  rwise,.** if the
8d00: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 75 63 63   allocation succ
8d10: 65 65 64 73 2c 20 28 2a 70 52 63 29 20 69 73 20  eeds, (*pRc) is 
8d20: 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a  left unchanged..
8d30: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
8d40: 72 62 75 53 74 72 6e 64 75 70 28 63 6f 6e 73 74  rbuStrndup(const
8d50: 20 63 68 61 72 20 2a 7a 53 74 72 2c 20 69 6e 74   char *zStr, int
8d60: 20 2a 70 52 63 29 7b 0a 20 20 63 68 61 72 20 2a   *pRc){.  char *
8d70: 7a 52 65 74 20 3d 20 30 3b 0a 0a 20 20 61 73 73  zRet = 0;..  ass
8d80: 65 72 74 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54  ert( *pRc==SQLIT
8d90: 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 7a 53  E_OK );.  if( zS
8da0: 74 72 20 29 7b 0a 20 20 20 20 73 69 7a 65 5f 74  tr ){.    size_t
8db0: 20 6e 43 6f 70 79 20 3d 20 73 74 72 6c 65 6e 28   nCopy = strlen(
8dc0: 7a 53 74 72 29 20 2b 20 31 3b 0a 20 20 20 20 7a  zStr) + 1;.    z
8dd0: 52 65 74 20 3d 20 28 63 68 61 72 2a 29 73 71 6c  Ret = (char*)sql
8de0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 43  ite3_malloc64(nC
8df0: 6f 70 79 29 3b 0a 20 20 20 20 69 66 28 20 7a 52  opy);.    if( zR
8e00: 65 74 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  et ){.      memc
8e10: 70 79 28 7a 52 65 74 2c 20 7a 53 74 72 2c 20 6e  py(zRet, zStr, n
8e20: 43 6f 70 79 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Copy);.    }else
8e30: 7b 0a 20 20 20 20 20 20 2a 70 52 63 20 3d 20 53  {.      *pRc = S
8e40: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
8e50: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
8e60: 20 7a 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   zRet;.}../*.** 
8e70: 46 69 6e 61 6c 69 7a 65 20 74 68 65 20 73 74 61  Finalize the sta
8e80: 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61 73  tement passed as
8e90: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
8ea0: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ment..**.** If t
8eb0: 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c  he sqlite3_final
8ec0: 69 7a 65 28 29 20 63 61 6c 6c 20 69 6e 64 69 63  ize() call indic
8ed0: 61 74 65 73 20 74 68 61 74 20 61 6e 20 65 72 72  ates that an err
8ee0: 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 64 20 74  or occurs, and t
8ef0: 68 65 0a 2a 2a 20 72 62 75 20 68 61 6e 64 6c 65  he.** rbu handle
8f00: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 6e   error code is n
8f10: 6f 74 20 61 6c 72 65 61 64 79 20 73 65 74 2c 20  ot already set, 
8f20: 73 65 74 20 74 68 65 20 65 72 72 6f 72 20 63 6f  set the error co
8f30: 64 65 20 61 6e 64 20 65 72 72 6f 72 0a 2a 2a 20  de and error.** 
8f40: 6d 65 73 73 61 67 65 20 61 63 63 6f 72 64 69 6e  message accordin
8f50: 67 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  gly..*/.static v
8f60: 6f 69 64 20 72 62 75 46 69 6e 61 6c 69 7a 65 28  oid rbuFinalize(
8f70: 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 73  sqlite3rbu *p, s
8f80: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
8f90: 6d 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  mt){.  sqlite3 *
8fa0: 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 64 62 5f  db = sqlite3_db_
8fb0: 68 61 6e 64 6c 65 28 70 53 74 6d 74 29 3b 0a 20  handle(pStmt);. 
8fc0: 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
8fd0: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
8fe0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  );.  if( p->rc==
8ff0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21  SQLITE_OK && rc!
9000: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
9010: 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20    p->rc = rc;.  
9020: 20 20 70 2d 3e 7a 45 72 72 6d 73 67 20 3d 20 73    p->zErrmsg = s
9030: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
9040: 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  %s", sqlite3_err
9050: 6d 73 67 28 64 62 29 29 3b 0a 20 20 7d 0a 7d 0a  msg(db));.  }.}.
9060: 0a 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68  ./* Determine th
9070: 65 20 74 79 70 65 20 6f 66 20 61 20 74 61 62 6c  e type of a tabl
9080: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 70 65 54 79 70  e..**.**   peTyp
9090: 65 20 69 73 20 6f 66 20 74 79 70 65 20 28 69 6e  e is of type (in
90a0: 74 2a 29 2c 20 61 20 70 6f 69 6e 74 65 72 20 74  t*), a pointer t
90b0: 6f 20 61 6e 20 6f 75 74 70 75 74 20 70 61 72 61  o an output para
90c0: 6d 65 74 65 72 20 6f 66 20 74 79 70 65 0a 2a 2a  meter of type.**
90d0: 20 20 20 28 69 6e 74 29 2e 20 54 68 69 73 20 63     (int). This c
90e0: 61 6c 6c 20 73 65 74 73 20 74 68 65 20 6f 75 74  all sets the out
90f0: 70 75 74 20 70 61 72 61 6d 65 74 65 72 20 61 73  put parameter as
9100: 20 66 6f 6c 6c 6f 77 73 2c 20 64 65 70 65 6e 64   follows, depend
9110: 69 6e 67 0a 2a 2a 20 20 20 6f 6e 20 74 68 65 20  ing.**   on the 
9120: 74 79 70 65 20 6f 66 20 74 68 65 20 74 61 62 6c  type of the tabl
9130: 65 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70  e specified by p
9140: 61 72 61 6d 65 74 65 72 73 20 64 62 4e 61 6d 65  arameters dbName
9150: 20 61 6e 64 20 7a 54 62 6c 2e 0a 2a 2a 0a 2a 2a   and zTbl..**.**
9160: 20 20 20 20 20 52 42 55 5f 50 4b 5f 4e 4f 54 41       RBU_PK_NOTA
9170: 42 4c 45 3a 20 20 20 20 20 20 20 4e 6f 20 73 75  BLE:       No su
9180: 63 68 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20  ch table..**    
9190: 20 52 42 55 5f 50 4b 5f 4e 4f 4e 45 3a 20 20 20   RBU_PK_NONE:   
91a0: 20 20 20 20 20 20 20 54 61 62 6c 65 20 68 61 73         Table has
91b0: 20 61 6e 20 69 6d 70 6c 69 63 69 74 20 72 6f 77   an implicit row
91c0: 69 64 2e 0a 2a 2a 20 20 20 20 20 52 42 55 5f 50  id..**     RBU_P
91d0: 4b 5f 49 50 4b 3a 20 20 20 20 20 20 20 20 20 20  K_IPK:          
91e0: 20 54 61 62 6c 65 20 68 61 73 20 61 6e 20 65 78   Table has an ex
91f0: 70 6c 69 63 69 74 20 49 50 4b 20 63 6f 6c 75 6d  plicit IPK colum
9200: 6e 2e 0a 2a 2a 20 20 20 20 20 52 42 55 5f 50 4b  n..**     RBU_PK
9210: 5f 45 58 54 45 52 4e 41 4c 3a 20 20 20 20 20 20  _EXTERNAL:      
9220: 54 61 62 6c 65 20 68 61 73 20 61 6e 20 65 78 74  Table has an ext
9230: 65 72 6e 61 6c 20 50 4b 20 69 6e 64 65 78 2e 0a  ernal PK index..
9240: 2a 2a 20 20 20 20 20 52 42 55 5f 50 4b 5f 57 49  **     RBU_PK_WI
9250: 54 48 4f 55 54 5f 52 4f 57 49 44 3a 20 54 61 62  THOUT_ROWID: Tab
9260: 6c 65 20 69 73 20 57 49 54 48 4f 55 54 20 52 4f  le is WITHOUT RO
9270: 57 49 44 2e 0a 2a 2a 20 20 20 20 20 52 42 55 5f  WID..**     RBU_
9280: 50 4b 5f 56 54 41 42 3a 20 20 20 20 20 20 20 20  PK_VTAB:        
9290: 20 20 54 61 62 6c 65 20 69 73 20 61 20 76 69 72    Table is a vir
92a0: 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a  tual table..**.*
92b0: 2a 20 20 20 41 72 67 75 6d 65 6e 74 20 2a 70 69  *   Argument *pi
92c0: 50 6b 20 69 73 20 61 6c 73 6f 20 6f 66 20 74 79  Pk is also of ty
92d0: 70 65 20 28 69 6e 74 2a 29 2c 20 61 6e 64 20 61  pe (int*), and a
92e0: 6c 73 6f 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e  lso points to an
92f0: 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20 70 61 72   output.**   par
9300: 61 6d 65 74 65 72 2e 20 55 6e 6c 65 73 73 20 74  ameter. Unless t
9310: 68 65 20 74 61 62 6c 65 20 68 61 73 20 61 6e 20  he table has an 
9320: 65 78 74 65 72 6e 61 6c 20 70 72 69 6d 61 72 79  external primary
9330: 20 6b 65 79 20 69 6e 64 65 78 20 0a 2a 2a 20 20   key index .**  
9340: 20 28 69 2e 65 2e 20 75 6e 6c 65 73 73 20 2a 70   (i.e. unless *p
9350: 65 54 79 70 65 20 69 73 20 73 65 74 20 74 6f 20  eType is set to 
9360: 33 29 2c 20 74 68 65 6e 20 2a 70 69 50 6b 20 69  3), then *piPk i
9370: 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 4f  s set to zero. O
9380: 72 2c 0a 2a 2a 20 20 20 69 66 20 74 68 65 20 74  r,.**   if the t
9390: 61 62 6c 65 20 64 6f 65 73 20 68 61 76 65 20 61  able does have a
93a0: 6e 20 65 78 74 65 72 6e 61 6c 20 70 72 69 6d 61  n external prima
93b0: 72 79 20 6b 65 79 20 69 6e 64 65 78 2c 20 74 68  ry key index, th
93c0: 65 6e 20 2a 70 69 50 6b 0a 2a 2a 20 20 20 69 73  en *piPk.**   is
93d0: 20 73 65 74 20 74 6f 20 74 68 65 20 72 6f 6f 74   set to the root
93e0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
93f0: 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20  the primary key 
9400: 69 6e 64 65 78 20 62 65 66 6f 72 65 0a 2a 2a 20  index before.** 
9410: 20 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a    returning..**.
9420: 2a 2a 20 41 4c 47 4f 52 49 54 48 4d 3a 0a 2a 2a  ** ALGORITHM:.**
9430: 0a 2a 2a 20 20 20 69 66 28 20 6e 6f 20 65 6e 74  .**   if( no ent
9440: 72 79 20 65 78 69 73 74 73 20 69 6e 20 73 71 6c  ry exists in sql
9450: 69 74 65 5f 6d 61 73 74 65 72 20 29 7b 0a 2a 2a  ite_master ){.**
9460: 20 20 20 20 20 72 65 74 75 72 6e 20 52 42 55 5f       return RBU_
9470: 50 4b 5f 4e 4f 54 41 42 4c 45 0a 2a 2a 20 20 20  PK_NOTABLE.**   
9480: 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 20 66 6f  }else if( sql fo
9490: 72 20 74 68 65 20 65 6e 74 72 79 20 73 74 61 72  r the entry star
94a0: 74 73 20 77 69 74 68 20 22 43 52 45 41 54 45 20  ts with "CREATE 
94b0: 56 49 52 54 55 41 4c 22 20 29 7b 0a 2a 2a 20 20  VIRTUAL" ){.**  
94c0: 20 20 20 72 65 74 75 72 6e 20 52 42 55 5f 50 4b     return RBU_PK
94d0: 5f 56 54 41 42 0a 2a 2a 20 20 20 7d 65 6c 73 65  _VTAB.**   }else
94e0: 20 69 66 28 20 22 50 52 41 47 4d 41 20 69 6e 64   if( "PRAGMA ind
94f0: 65 78 5f 6c 69 73 74 28 29 22 20 66 6f 72 20 74  ex_list()" for t
9500: 68 65 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e  he table contain
9510: 73 20 61 20 22 70 6b 22 20 69 6e 64 65 78 20 29  s a "pk" index )
9520: 7b 0a 2a 2a 20 20 20 20 20 69 66 28 20 74 68 65  {.**     if( the
9530: 20 69 6e 64 65 78 20 74 68 61 74 20 69 73 20 74   index that is t
9540: 68 65 20 70 6b 20 65 78 69 73 74 73 20 69 6e 20  he pk exists in 
9550: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 29 7b  sqlite_master ){
9560: 0a 2a 2a 20 20 20 20 20 20 20 2a 70 69 50 4b 20  .**       *piPK 
9570: 3d 20 72 6f 6f 74 70 61 67 65 20 6f 66 20 74 68  = rootpage of th
9580: 61 74 20 69 6e 64 65 78 2e 0a 2a 2a 20 20 20 20  at index..**    
9590: 20 20 20 72 65 74 75 72 6e 20 52 42 55 5f 50 4b     return RBU_PK
95a0: 5f 45 58 54 45 52 4e 41 4c 0a 2a 2a 20 20 20 20  _EXTERNAL.**    
95b0: 20 7d 65 6c 73 65 7b 0a 2a 2a 20 20 20 20 20 20   }else{.**      
95c0: 20 72 65 74 75 72 6e 20 52 42 55 5f 50 4b 5f 57   return RBU_PK_W
95d0: 49 54 48 4f 55 54 5f 52 4f 57 49 44 0a 2a 2a 20  ITHOUT_ROWID.** 
95e0: 20 20 20 20 7d 0a 2a 2a 20 20 20 7d 65 6c 73 65      }.**   }else
95f0: 20 69 66 28 20 22 50 52 41 47 4d 41 20 74 61 62   if( "PRAGMA tab
9600: 6c 65 5f 69 6e 66 6f 28 29 22 20 6c 69 73 74 73  le_info()" lists
9610: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 22 70 6b   one or more "pk
9620: 22 20 63 6f 6c 75 6d 6e 73 20 29 7b 0a 2a 2a 20  " columns ){.** 
9630: 20 20 20 20 72 65 74 75 72 6e 20 52 42 55 5f 50      return RBU_P
9640: 4b 5f 49 50 4b 0a 2a 2a 20 20 20 7d 65 6c 73 65  K_IPK.**   }else
9650: 7b 0a 2a 2a 20 20 20 20 20 72 65 74 75 72 6e 20  {.**     return 
9660: 52 42 55 5f 50 4b 5f 4e 4f 4e 45 0a 2a 2a 20 20  RBU_PK_NONE.**  
9670: 20 7d 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69   }.*/.static voi
9680: 64 20 72 62 75 54 61 62 6c 65 54 79 70 65 28 0a  d rbuTableType(.
9690: 20 20 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c    sqlite3rbu *p,
96a0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
96b0: 54 61 62 2c 0a 20 20 69 6e 74 20 2a 70 65 54 79  Tab,.  int *peTy
96c0: 70 65 2c 0a 20 20 69 6e 74 20 2a 70 69 54 6e 75  pe,.  int *piTnu
96d0: 6d 2c 0a 20 20 69 6e 74 20 2a 70 69 50 6b 0a 29  m,.  int *piPk.)
96e0: 7b 0a 20 20 2f 2a 0a 20 20 2a 2a 20 30 29 20 53  {.  /*.  ** 0) S
96f0: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
9700: 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
9710: 72 20 77 68 65 72 65 20 6e 61 6d 65 3d 25 51 20  r where name=%Q 
9720: 41 4e 44 20 49 73 56 69 72 74 75 61 6c 28 25 51  AND IsVirtual(%Q
9730: 29 0a 20 20 2a 2a 20 31 29 20 50 52 41 47 4d 41  ).  ** 1) PRAGMA
9740: 20 69 6e 64 65 78 5f 6c 69 73 74 20 3d 20 3f 0a   index_list = ?.
9750: 20 20 2a 2a 20 32 29 20 53 45 4c 45 43 54 20 63    ** 2) SELECT c
9760: 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 73 71 6c  ount(*) FROM sql
9770: 69 74 65 5f 6d 61 73 74 65 72 20 77 68 65 72 65  ite_master where
9780: 20 6e 61 6d 65 3d 25 51 20 0a 20 20 2a 2a 20 33   name=%Q .  ** 3
9790: 29 20 50 52 41 47 4d 41 20 74 61 62 6c 65 5f 69  ) PRAGMA table_i
97a0: 6e 66 6f 20 3d 20 3f 0a 20 20 2a 2f 0a 20 20 73  nfo = ?.  */.  s
97b0: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 61 53 74  qlite3_stmt *aSt
97c0: 6d 74 5b 34 5d 20 3d 20 7b 30 2c 20 30 2c 20 30  mt[4] = {0, 0, 0
97d0: 2c 20 30 7d 3b 0a 0a 20 20 2a 70 65 54 79 70 65  , 0};..  *peType
97e0: 20 3d 20 52 42 55 5f 50 4b 5f 4e 4f 54 41 42 4c   = RBU_PK_NOTABL
97f0: 45 3b 0a 20 20 2a 70 69 50 6b 20 3d 20 30 3b 0a  E;.  *piPk = 0;.
9800: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63  .  assert( p->rc
9810: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
9820: 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65   p->rc = prepare
9830: 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72  FreeAndCollectEr
9840: 72 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 26  ror(p->dbMain, &
9850: 61 53 74 6d 74 5b 30 5d 2c 20 26 70 2d 3e 7a 45  aStmt[0], &p->zE
9860: 72 72 6d 73 67 2c 20 0a 20 20 20 20 73 71 6c 69  rrmsg, .    sqli
9870: 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20  te3_mprintf(.   
9880: 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 28         "SELECT (
9890: 73 71 6c 20 4c 49 4b 45 20 27 63 72 65 61 74 65  sql LIKE 'create
98a0: 20 76 69 72 74 75 61 6c 25 25 27 29 2c 20 72 6f   virtual%%'), ro
98b0: 6f 74 70 61 67 65 22 0a 20 20 20 20 20 20 20 20  otpage".        
98c0: 20 20 22 20 20 46 52 4f 4d 20 73 71 6c 69 74 65    "  FROM sqlite
98d0: 5f 6d 61 73 74 65 72 22 0a 20 20 20 20 20 20 20  _master".       
98e0: 20 20 20 22 20 57 48 45 52 45 20 6e 61 6d 65 3d     " WHERE name=
98f0: 25 51 22 2c 20 7a 54 61 62 0a 20 20 29 29 3b 0a  %Q", zTab.  ));.
9900: 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c    if( p->rc!=SQL
9910: 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74 65  ITE_OK || sqlite
9920: 33 5f 73 74 65 70 28 61 53 74 6d 74 5b 30 5d 29  3_step(aStmt[0])
9930: 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  !=SQLITE_ROW ){.
9940: 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20 61 6e      /* Either an
9950: 20 65 72 72 6f 72 2c 20 6f 72 20 6e 6f 20 73 75   error, or no su
9960: 63 68 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20  ch table. */.   
9970: 20 67 6f 74 6f 20 72 62 75 54 61 62 6c 65 54 79   goto rbuTableTy
9980: 70 65 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66  pe_end;.  }.  if
9990: 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  ( sqlite3_column
99a0: 5f 69 6e 74 28 61 53 74 6d 74 5b 30 5d 2c 20 30  _int(aStmt[0], 0
99b0: 29 20 29 7b 0a 20 20 20 20 2a 70 65 54 79 70 65  ) ){.    *peType
99c0: 20 3d 20 52 42 55 5f 50 4b 5f 56 54 41 42 3b 20   = RBU_PK_VTAB; 
99d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99e0: 20 20 20 20 2f 2a 20 76 69 72 74 75 61 6c 20 74      /* virtual t
99f0: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 67 6f 74 6f  able */.    goto
9a00: 20 72 62 75 54 61 62 6c 65 54 79 70 65 5f 65 6e   rbuTableType_en
9a10: 64 3b 0a 20 20 7d 0a 20 20 2a 70 69 54 6e 75 6d  d;.  }.  *piTnum
9a20: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
9a30: 6e 5f 69 6e 74 28 61 53 74 6d 74 5b 30 5d 2c 20  n_int(aStmt[0], 
9a40: 31 29 3b 0a 0a 20 20 70 2d 3e 72 63 20 3d 20 70  1);..  p->rc = p
9a50: 72 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f 6c  repareFreeAndCol
9a60: 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 4d  lectError(p->dbM
9a70: 61 69 6e 2c 20 26 61 53 74 6d 74 5b 31 5d 2c 20  ain, &aStmt[1], 
9a80: 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 20 0a 20 20  &p->zErrmsg, .  
9a90: 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74    sqlite3_mprint
9aa0: 66 28 22 50 52 41 47 4d 41 20 69 6e 64 65 78 5f  f("PRAGMA index_
9ab0: 6c 69 73 74 3d 25 51 22 2c 7a 54 61 62 29 0a 20  list=%Q",zTab). 
9ac0: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 20   );.  if( p->rc 
9ad0: 29 20 67 6f 74 6f 20 72 62 75 54 61 62 6c 65 54  ) goto rbuTableT
9ae0: 79 70 65 5f 65 6e 64 3b 0a 20 20 77 68 69 6c 65  ype_end;.  while
9af0: 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 61  ( sqlite3_step(a
9b00: 53 74 6d 74 5b 31 5d 29 3d 3d 53 51 4c 49 54 45  Stmt[1])==SQLITE
9b10: 5f 52 4f 57 20 29 7b 0a 20 20 20 20 63 6f 6e 73  _ROW ){.    cons
9b20: 74 20 75 38 20 2a 7a 4f 72 69 67 20 3d 20 73 71  t u8 *zOrig = sq
9b30: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
9b40: 74 28 61 53 74 6d 74 5b 31 5d 2c 20 33 29 3b 0a  t(aStmt[1], 3);.
9b50: 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 7a 49      const u8 *zI
9b60: 64 78 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  dx = sqlite3_col
9b70: 75 6d 6e 5f 74 65 78 74 28 61 53 74 6d 74 5b 31  umn_text(aStmt[1
9b80: 5d 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 7a  ], 1);.    if( z
9b90: 4f 72 69 67 20 26 26 20 7a 49 64 78 20 26 26 20  Orig && zIdx && 
9ba0: 7a 4f 72 69 67 5b 30 5d 3d 3d 27 70 27 20 29 7b  zOrig[0]=='p' ){
9bb0: 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 70  .      p->rc = p
9bc0: 72 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f 6c  repareFreeAndCol
9bd0: 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 4d  lectError(p->dbM
9be0: 61 69 6e 2c 20 26 61 53 74 6d 74 5b 32 5d 2c 20  ain, &aStmt[2], 
9bf0: 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 20 0a 20 20  &p->zErrmsg, .  
9c00: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
9c10: 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20  mprintf(.       
9c20: 20 20 20 20 20 22 53 45 4c 45 43 54 20 72 6f 6f       "SELECT roo
9c30: 74 70 61 67 65 20 46 52 4f 4d 20 73 71 6c 69 74  tpage FROM sqlit
9c40: 65 5f 6d 61 73 74 65 72 20 57 48 45 52 45 20 6e  e_master WHERE n
9c50: 61 6d 65 20 3d 20 25 51 22 2c 20 7a 49 64 78 0a  ame = %Q", zIdx.
9c60: 20 20 20 20 20 20 29 29 3b 0a 20 20 20 20 20 20        ));.      
9c70: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
9c80: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
9c90: 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70  if( sqlite3_step
9ca0: 28 61 53 74 6d 74 5b 32 5d 29 3d 3d 53 51 4c 49  (aStmt[2])==SQLI
9cb0: 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20  TE_ROW ){.      
9cc0: 20 20 20 20 2a 70 69 50 6b 20 3d 20 73 71 6c 69      *piPk = sqli
9cd0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 61  te3_column_int(a
9ce0: 53 74 6d 74 5b 32 5d 2c 20 30 29 3b 0a 20 20 20  Stmt[2], 0);.   
9cf0: 20 20 20 20 20 20 20 2a 70 65 54 79 70 65 20 3d         *peType =
9d00: 20 52 42 55 5f 50 4b 5f 45 58 54 45 52 4e 41 4c   RBU_PK_EXTERNAL
9d10: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
9d20: 0a 20 20 20 20 20 20 20 20 20 20 2a 70 65 54 79  .          *peTy
9d30: 70 65 20 3d 20 52 42 55 5f 50 4b 5f 57 49 54 48  pe = RBU_PK_WITH
9d40: 4f 55 54 5f 52 4f 57 49 44 3b 0a 20 20 20 20 20  OUT_ROWID;.     
9d50: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
9d60: 20 20 20 67 6f 74 6f 20 72 62 75 54 61 62 6c 65     goto rbuTable
9d70: 54 79 70 65 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  Type_end;.    }.
9d80: 20 20 7d 0a 0a 20 20 70 2d 3e 72 63 20 3d 20 70    }..  p->rc = p
9d90: 72 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f 6c  repareFreeAndCol
9da0: 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 4d  lectError(p->dbM
9db0: 61 69 6e 2c 20 26 61 53 74 6d 74 5b 33 5d 2c 20  ain, &aStmt[3], 
9dc0: 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 20 0a 20 20  &p->zErrmsg, .  
9dd0: 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74    sqlite3_mprint
9de0: 66 28 22 50 52 41 47 4d 41 20 74 61 62 6c 65 5f  f("PRAGMA table_
9df0: 69 6e 66 6f 3d 25 51 22 2c 7a 54 61 62 29 0a 20  info=%Q",zTab). 
9e00: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d   );.  if( p->rc=
9e10: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
9e20: 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33    while( sqlite3
9e30: 5f 73 74 65 70 28 61 53 74 6d 74 5b 33 5d 29 3d  _step(aStmt[3])=
9e40: 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
9e50: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
9e60: 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 61 53 74 6d  _column_int(aStm
9e70: 74 5b 33 5d 2c 35 29 3e 30 20 29 7b 0a 20 20 20  t[3],5)>0 ){.   
9e80: 20 20 20 20 20 2a 70 65 54 79 70 65 20 3d 20 52       *peType = R
9e90: 42 55 5f 50 4b 5f 49 50 4b 3b 20 20 20 20 20 20  BU_PK_IPK;      
9ea0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 65 78 70            /* exp
9eb0: 6c 69 63 69 74 20 49 50 4b 20 63 6f 6c 75 6d 6e  licit IPK column
9ec0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   */.        goto
9ed0: 20 72 62 75 54 61 62 6c 65 54 79 70 65 5f 65 6e   rbuTableType_en
9ee0: 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  d;.      }.    }
9ef0: 0a 20 20 20 20 2a 70 65 54 79 70 65 20 3d 20 52  .    *peType = R
9f00: 42 55 5f 50 4b 5f 4e 4f 4e 45 3b 0a 20 20 7d 0a  BU_PK_NONE;.  }.
9f10: 0a 72 62 75 54 61 62 6c 65 54 79 70 65 5f 65 6e  .rbuTableType_en
9f20: 64 3a 20 7b 0a 20 20 20 20 75 6e 73 69 67 6e 65  d: {.    unsigne
9f30: 64 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72  d int i;.    for
9f40: 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61  (i=0; i<sizeof(a
9f50: 53 74 6d 74 29 2f 73 69 7a 65 6f 66 28 61 53 74  Stmt)/sizeof(aSt
9f60: 6d 74 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20  mt[0]); i++){.  
9f70: 20 20 20 20 72 62 75 46 69 6e 61 6c 69 7a 65 28      rbuFinalize(
9f80: 70 2c 20 61 53 74 6d 74 5b 69 5d 29 3b 0a 20 20  p, aStmt[i]);.  
9f90: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
9fa0: 20 54 68 69 73 20 69 73 20 61 20 68 65 6c 70 65   This is a helpe
9fb0: 72 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 72  r function for r
9fc0: 62 75 4f 62 6a 49 74 65 72 43 61 63 68 65 54 61  buObjIterCacheTa
9fd0: 62 6c 65 49 6e 66 6f 28 29 2e 20 49 74 20 70 6f  bleInfo(). It po
9fe0: 70 75 6c 61 74 65 73 0a 2a 2a 20 74 68 65 20 70  pulates.** the p
9ff0: 49 74 65 72 2d 3e 61 62 49 6e 64 65 78 65 64 5b  Iter->abIndexed[
a000: 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74  ] array..*/.stat
a010: 69 63 20 76 6f 69 64 20 72 62 75 4f 62 6a 49 74  ic void rbuObjIt
a020: 65 72 43 61 63 68 65 49 6e 64 65 78 65 64 43 6f  erCacheIndexedCo
a030: 6c 73 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70  ls(sqlite3rbu *p
a040: 2c 20 52 62 75 4f 62 6a 49 74 65 72 20 2a 70 49  , RbuObjIter *pI
a050: 74 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  ter){.  sqlite3_
a060: 73 74 6d 74 20 2a 70 4c 69 73 74 20 3d 20 30 3b  stmt *pList = 0;
a070: 0a 20 20 69 6e 74 20 62 49 6e 64 65 78 20 3d 20  .  int bIndex = 
a080: 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  0;..  if( p->rc=
a090: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
a0a0: 20 20 6d 65 6d 63 70 79 28 70 49 74 65 72 2d 3e    memcpy(pIter->
a0b0: 61 62 49 6e 64 65 78 65 64 2c 20 70 49 74 65 72  abIndexed, pIter
a0c0: 2d 3e 61 62 54 62 6c 50 6b 2c 20 73 69 7a 65 6f  ->abTblPk, sizeo
a0d0: 66 28 75 38 29 2a 70 49 74 65 72 2d 3e 6e 54 62  f(u8)*pIter->nTb
a0e0: 6c 43 6f 6c 29 3b 0a 20 20 20 20 70 2d 3e 72 63  lCol);.    p->rc
a0f0: 20 3d 20 70 72 65 70 61 72 65 46 72 65 65 41 6e   = prepareFreeAn
a100: 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d  dCollectError(p-
a110: 3e 64 62 4d 61 69 6e 2c 20 26 70 4c 69 73 74 2c  >dbMain, &pList,
a120: 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 0a 20 20   &p->zErrmsg,.  
a130: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70        sqlite3_mp
a140: 72 69 6e 74 66 28 22 50 52 41 47 4d 41 20 6d 61  rintf("PRAGMA ma
a150: 69 6e 2e 69 6e 64 65 78 5f 6c 69 73 74 20 3d 20  in.index_list = 
a160: 25 51 22 2c 20 70 49 74 65 72 2d 3e 7a 54 62 6c  %Q", pIter->zTbl
a170: 29 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20  ).    );.  }..  
a180: 70 49 74 65 72 2d 3e 6e 49 6e 64 65 78 20 3d 20  pIter->nIndex = 
a190: 30 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 72  0;.  while( p->r
a1a0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
a1b0: 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69  SQLITE_ROW==sqli
a1c0: 74 65 33 5f 73 74 65 70 28 70 4c 69 73 74 29 20  te3_step(pList) 
a1d0: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
a1e0: 72 20 2a 7a 49 64 78 20 3d 20 28 63 6f 6e 73 74  r *zIdx = (const
a1f0: 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63   char*)sqlite3_c
a200: 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 4c 69 73 74  olumn_text(pList
a210: 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 1);.    sqlite
a220: 33 5f 73 74 6d 74 20 2a 70 58 49 6e 66 6f 20 3d  3_stmt *pXInfo =
a230: 20 30 3b 0a 20 20 20 20 69 66 28 20 7a 49 64 78   0;.    if( zIdx
a240: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
a250: 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65   p->rc = prepare
a260: 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72  FreeAndCollectEr
a270: 72 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 26  ror(p->dbMain, &
a280: 70 58 49 6e 66 6f 2c 20 26 70 2d 3e 7a 45 72 72  pXInfo, &p->zErr
a290: 6d 73 67 2c 0a 20 20 20 20 20 20 20 20 73 71 6c  msg,.        sql
a2a0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 50 52  ite3_mprintf("PR
a2b0: 41 47 4d 41 20 6d 61 69 6e 2e 69 6e 64 65 78 5f  AGMA main.index_
a2c0: 78 69 6e 66 6f 20 3d 20 25 51 22 2c 20 7a 49 64  xinfo = %Q", zId
a2d0: 78 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 77 68  x).    );.    wh
a2e0: 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ile( p->rc==SQLI
a2f0: 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f  TE_OK && SQLITE_
a300: 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW==sqlite3_ste
a310: 70 28 70 58 49 6e 66 6f 29 20 29 7b 0a 20 20 20  p(pXInfo) ){.   
a320: 20 20 20 69 6e 74 20 69 43 69 64 20 3d 20 73 71     int iCid = sq
a330: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
a340: 28 70 58 49 6e 66 6f 2c 20 31 29 3b 0a 20 20 20  (pXInfo, 1);.   
a350: 20 20 20 69 66 28 20 69 43 69 64 3e 3d 30 20 29     if( iCid>=0 )
a360: 20 70 49 74 65 72 2d 3e 61 62 49 6e 64 65 78 65   pIter->abIndexe
a370: 64 5b 69 43 69 64 5d 20 3d 20 31 3b 0a 20 20 20  d[iCid] = 1;.   
a380: 20 7d 0a 20 20 20 20 72 62 75 46 69 6e 61 6c 69   }.    rbuFinali
a390: 7a 65 28 70 2c 20 70 58 49 6e 66 6f 29 3b 0a 20  ze(p, pXInfo);. 
a3a0: 20 20 20 62 49 6e 64 65 78 20 3d 20 31 3b 0a 20     bIndex = 1;. 
a3b0: 20 20 20 70 49 74 65 72 2d 3e 6e 49 6e 64 65 78     pIter->nIndex
a3c0: 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  ++;.  }..  if( p
a3d0: 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55  Iter->eType==RBU
a3e0: 5f 50 4b 5f 57 49 54 48 4f 55 54 5f 52 4f 57 49  _PK_WITHOUT_ROWI
a3f0: 44 20 29 7b 0a 20 20 20 20 2f 2a 20 22 50 52 41  D ){.    /* "PRA
a400: 47 4d 41 20 69 6e 64 65 78 5f 6c 69 73 74 22 20  GMA index_list" 
a410: 69 6e 63 6c 75 64 65 73 20 74 68 65 20 6d 61 69  includes the mai
a420: 6e 20 50 4b 20 62 2d 74 72 65 65 20 2a 2f 0a 20  n PK b-tree */. 
a430: 20 20 20 70 49 74 65 72 2d 3e 6e 49 6e 64 65 78     pIter->nIndex
a440: 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 72 62 75 46 69  --;.  }..  rbuFi
a450: 6e 61 6c 69 7a 65 28 70 2c 20 70 4c 69 73 74 29  nalize(p, pList)
a460: 3b 0a 20 20 69 66 28 20 62 49 6e 64 65 78 3d 3d  ;.  if( bIndex==
a470: 30 20 29 20 70 49 74 65 72 2d 3e 61 62 49 6e 64  0 ) pIter->abInd
a480: 65 78 65 64 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a  exed = 0;.}.../*
a490: 0a 2a 2a 20 49 66 20 74 68 65 79 20 61 72 65 20  .** If they are 
a4a0: 6e 6f 74 20 61 6c 72 65 61 64 79 20 70 6f 70 75  not already popu
a4b0: 6c 61 74 65 64 2c 20 70 6f 70 75 6c 61 74 65 20  lated, populate 
a4c0: 74 68 65 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c  the pIter->azTbl
a4d0: 43 6f 6c 5b 5d 2c 0a 2a 2a 20 70 49 74 65 72 2d  Col[],.** pIter-
a4e0: 3e 61 62 54 62 6c 50 6b 5b 5d 2c 20 70 49 74 65  >abTblPk[], pIte
a4f0: 72 2d 3e 6e 54 62 6c 43 6f 6c 20 61 6e 64 20 70  r->nTblCol and p
a500: 49 74 65 72 2d 3e 62 52 6f 77 69 64 20 76 61 72  Iter->bRowid var
a510: 69 61 62 6c 65 73 20 61 63 63 6f 72 64 69 6e 67  iables according
a520: 20 74 6f 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   to.** the table
a530: 20 28 6e 6f 74 20 69 6e 64 65 78 29 20 74 68 61   (not index) tha
a540: 74 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 63  t the iterator c
a550: 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20  urrently points 
a560: 74 6f 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  to..**.** Return
a570: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75   SQLITE_OK if su
a580: 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20  ccessful, or an 
a590: 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
a5a0: 65 20 6f 74 68 65 72 77 69 73 65 2e 20 49 66 0a  e otherwise. If.
a5b0: 2a 2a 20 61 6e 20 65 72 72 6f 72 20 64 6f 65 73  ** an error does
a5c0: 20 6f 63 63 75 72 2c 20 61 6e 20 65 72 72 6f 72   occur, an error
a5d0: 20 63 6f 64 65 20 61 6e 64 20 65 72 72 6f 72 20   code and error 
a5e0: 6d 65 73 73 61 67 65 20 61 72 65 20 61 6c 73 6f  message are also
a5f0: 20 6c 65 66 74 20 69 6e 20 0a 2a 2a 20 74 68 65   left in .** the
a600: 20 52 42 55 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a   RBU handle..*/.
a610: 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 4f 62  static int rbuOb
a620: 6a 49 74 65 72 43 61 63 68 65 54 61 62 6c 65 49  jIterCacheTableI
a630: 6e 66 6f 28 73 71 6c 69 74 65 33 72 62 75 20 2a  nfo(sqlite3rbu *
a640: 70 2c 20 52 62 75 4f 62 6a 49 74 65 72 20 2a 70  p, RbuObjIter *p
a650: 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70 49 74  Iter){.  if( pIt
a660: 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 3d 3d 30 20  er->azTblCol==0 
a670: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
a680: 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a  tmt *pStmt = 0;.
a690: 20 20 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 30      int nCol = 0
a6a0: 3b 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20  ;.    int i;    
a6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a6c0: 20 20 20 20 2f 2a 20 66 6f 72 28 29 20 6c 6f 6f      /* for() loo
a6d0: 70 20 69 74 65 72 61 74 6f 72 20 76 61 72 69 61  p iterator varia
a6e0: 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62  ble */.    int b
a6f0: 52 62 75 52 6f 77 69 64 20 3d 20 30 3b 20 20 20  RbuRowid = 0;   
a700: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69           /* If i
a710: 6e 70 75 74 20 74 61 62 6c 65 20 68 61 73 20 63  nput table has c
a720: 6f 6c 75 6d 6e 20 22 72 62 75 5f 72 6f 77 69 64  olumn "rbu_rowid
a730: 22 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4f 72  " */.    int iOr
a740: 64 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  der = 0;.    int
a750: 20 69 54 6e 75 6d 20 3d 20 30 3b 0a 0a 20 20 20   iTnum = 0;..   
a760: 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74   /* Figure out t
a770: 68 65 20 74 79 70 65 20 6f 66 20 74 61 62 6c 65  he type of table
a780: 20 74 68 69 73 20 73 74 65 70 20 77 69 6c 6c 20   this step will 
a790: 64 65 61 6c 20 77 69 74 68 2e 20 2a 2f 0a 20 20  deal with. */.  
a7a0: 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
a7b0: 3e 65 54 79 70 65 3d 3d 30 20 29 3b 0a 20 20 20  >eType==0 );.   
a7c0: 20 72 62 75 54 61 62 6c 65 54 79 70 65 28 70 2c   rbuTableType(p,
a7d0: 20 70 49 74 65 72 2d 3e 7a 54 62 6c 2c 20 26 70   pIter->zTbl, &p
a7e0: 49 74 65 72 2d 3e 65 54 79 70 65 2c 20 26 69 54  Iter->eType, &iT
a7f0: 6e 75 6d 2c 20 26 70 49 74 65 72 2d 3e 69 50 6b  num, &pIter->iPk
a800: 54 6e 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 70  Tnum);.    if( p
a810: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
a820: 26 26 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d  && pIter->eType=
a830: 3d 52 42 55 5f 50 4b 5f 4e 4f 54 41 42 4c 45 20  =RBU_PK_NOTABLE 
a840: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  ){.      p->rc =
a850: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
a860: 20 20 20 20 20 70 2d 3e 7a 45 72 72 6d 73 67 20       p->zErrmsg 
a870: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
a880: 66 28 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65  f("no such table
a890: 3a 20 25 73 22 2c 20 70 49 74 65 72 2d 3e 7a 54  : %s", pIter->zT
a8a0: 62 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  bl);.    }.    i
a8b0: 66 28 20 70 2d 3e 72 63 20 29 20 72 65 74 75 72  f( p->rc ) retur
a8c0: 6e 20 70 2d 3e 72 63 3b 0a 20 20 20 20 69 66 28  n p->rc;.    if(
a8d0: 20 70 49 74 65 72 2d 3e 7a 49 64 78 3d 3d 30 20   pIter->zIdx==0 
a8e0: 29 20 70 49 74 65 72 2d 3e 69 54 6e 75 6d 20 3d  ) pIter->iTnum =
a8f0: 20 69 54 6e 75 6d 3b 0a 0a 20 20 20 20 61 73 73   iTnum;..    ass
a900: 65 72 74 28 20 70 49 74 65 72 2d 3e 65 54 79 70  ert( pIter->eTyp
a910: 65 3d 3d 52 42 55 5f 50 4b 5f 4e 4f 4e 45 20 7c  e==RBU_PK_NONE |
a920: 7c 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d  | pIter->eType==
a930: 52 42 55 5f 50 4b 5f 49 50 4b 20 0a 20 20 20 20  RBU_PK_IPK .    
a940: 20 20 20 20 20 7c 7c 20 70 49 74 65 72 2d 3e 65       || pIter->e
a950: 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 45 58 54  Type==RBU_PK_EXT
a960: 45 52 4e 41 4c 20 7c 7c 20 70 49 74 65 72 2d 3e  ERNAL || pIter->
a970: 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 57 49  eType==RBU_PK_WI
a980: 54 48 4f 55 54 5f 52 4f 57 49 44 0a 20 20 20 20  THOUT_ROWID.    
a990: 20 20 20 20 20 7c 7c 20 70 49 74 65 72 2d 3e 65       || pIter->e
a9a0: 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 56 54 41  Type==RBU_PK_VTA
a9b0: 42 0a 20 20 20 20 29 3b 0a 0a 20 20 20 20 2f 2a  B.    );..    /*
a9c0: 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 61 7a   Populate the az
a9d0: 54 62 6c 43 6f 6c 5b 5d 20 61 6e 64 20 6e 54 62  TblCol[] and nTb
a9e0: 6c 43 6f 6c 20 76 61 72 69 61 62 6c 65 73 20 62  lCol variables b
a9f0: 61 73 65 64 20 6f 6e 20 74 68 65 20 63 6f 6c 75  ased on the colu
aa00: 6d 6e 73 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  mns.    ** of th
aa10: 65 20 69 6e 70 75 74 20 74 61 62 6c 65 2e 20 49  e input table. I
aa20: 67 6e 6f 72 65 20 61 6e 79 20 69 6e 70 75 74 20  gnore any input 
aa30: 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20 74 68  table columns th
aa40: 61 74 20 62 65 67 69 6e 20 77 69 74 68 0a 20 20  at begin with.  
aa50: 20 20 2a 2a 20 22 72 62 75 5f 22 2e 20 20 2a 2f    ** "rbu_".  */
aa60: 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 72 65  .    p->rc = pre
aa70: 70 61 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65  pareFreeAndColle
aa80: 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 52 62 75  ctError(p->dbRbu
aa90: 2c 20 26 70 53 74 6d 74 2c 20 26 70 2d 3e 7a 45  , &pStmt, &p->zE
aaa0: 72 72 6d 73 67 2c 20 0a 20 20 20 20 20 20 20 20  rrmsg, .        
aab0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
aac0: 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 27  "SELECT * FROM '
aad0: 25 71 27 22 2c 20 70 49 74 65 72 2d 3e 7a 44 61  %q'", pIter->zDa
aae0: 74 61 54 62 6c 29 0a 20 20 20 20 29 3b 0a 20 20  taTbl).    );.  
aaf0: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
ab00: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
ab10: 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63  nCol = sqlite3_c
ab20: 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d  olumn_count(pStm
ab30: 74 29 3b 0a 20 20 20 20 20 20 72 62 75 41 6c 6c  t);.      rbuAll
ab40: 6f 63 61 74 65 49 74 65 72 41 72 72 61 79 73 28  ocateIterArrays(
ab50: 70 2c 20 70 49 74 65 72 2c 20 6e 43 6f 6c 29 3b  p, pIter, nCol);
ab60: 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
ab70: 3d 30 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  =0; p->rc==SQLIT
ab80: 45 5f 4f 4b 20 26 26 20 69 3c 6e 43 6f 6c 3b 20  E_OK && i<nCol; 
ab90: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  i++){.      cons
aba0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20  t char *zName = 
abb0: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
abc0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65  ite3_column_name
abd0: 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20  (pStmt, i);.    
abe0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
abf0: 72 6e 69 63 6d 70 28 22 72 62 75 5f 22 2c 20 7a  rnicmp("rbu_", z
ac00: 4e 61 6d 65 2c 20 34 29 20 29 7b 0a 20 20 20 20  Name, 4) ){.    
ac10: 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 70 79 20      char *zCopy 
ac20: 3d 20 72 62 75 53 74 72 6e 64 75 70 28 7a 4e 61  = rbuStrndup(zNa
ac30: 6d 65 2c 20 26 70 2d 3e 72 63 29 3b 0a 20 20 20  me, &p->rc);.   
ac40: 20 20 20 20 20 70 49 74 65 72 2d 3e 61 69 53 72       pIter->aiSr
ac50: 63 4f 72 64 65 72 5b 70 49 74 65 72 2d 3e 6e 54  cOrder[pIter->nT
ac60: 62 6c 43 6f 6c 5d 20 3d 20 70 49 74 65 72 2d 3e  blCol] = pIter->
ac70: 6e 54 62 6c 43 6f 6c 3b 0a 20 20 20 20 20 20 20  nTblCol;.       
ac80: 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c   pIter->azTblCol
ac90: 5b 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 2b  [pIter->nTblCol+
aca0: 2b 5d 20 3d 20 7a 43 6f 70 79 3b 0a 20 20 20 20  +] = zCopy;.    
acb0: 20 20 7d 0a 20 20 20 20 20 20 65 6c 73 65 20 69    }.      else i
acc0: 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74  f( 0==sqlite3_st
acd0: 72 69 63 6d 70 28 22 72 62 75 5f 72 6f 77 69 64  ricmp("rbu_rowid
ace0: 22 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20  ", zName) ){.   
acf0: 20 20 20 20 20 62 52 62 75 52 6f 77 69 64 20 3d       bRbuRowid =
ad00: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
ad10: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  }.    sqlite3_fi
ad20: 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
ad30: 20 20 20 70 53 74 6d 74 20 3d 20 30 3b 0a 0a 20     pStmt = 0;.. 
ad40: 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
ad50: 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20 26 26 20  LITE_OK.     && 
ad60: 72 62 75 49 73 56 61 63 75 75 6d 28 70 29 3d 3d  rbuIsVacuum(p)==
ad70: 30 0a 20 20 20 20 20 26 26 20 62 52 62 75 52 6f  0.     && bRbuRo
ad80: 77 69 64 21 3d 28 70 49 74 65 72 2d 3e 65 54 79  wid!=(pIter->eTy
ad90: 70 65 3d 3d 52 42 55 5f 50 4b 5f 56 54 41 42 20  pe==RBU_PK_VTAB 
ada0: 7c 7c 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d  || pIter->eType=
adb0: 3d 52 42 55 5f 50 4b 5f 4e 4f 4e 45 29 0a 20 20  =RBU_PK_NONE).  
adc0: 20 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63    ){.      p->rc
add0: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
ade0: 0a 20 20 20 20 20 20 70 2d 3e 7a 45 72 72 6d 73  .      p->zErrms
adf0: 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  g = sqlite3_mpri
ae00: 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 22  ntf(.          "
ae10: 74 61 62 6c 65 20 25 71 20 25 73 20 72 62 75 5f  table %q %s rbu_
ae20: 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 22 2c 20 70  rowid column", p
ae30: 49 74 65 72 2d 3e 7a 44 61 74 61 54 62 6c 2c 0a  Iter->zDataTbl,.
ae40: 20 20 20 20 20 20 20 20 20 20 28 62 52 62 75 52            (bRbuR
ae50: 6f 77 69 64 20 3f 20 22 6d 61 79 20 6e 6f 74 20  owid ? "may not 
ae60: 68 61 76 65 22 20 3a 20 22 72 65 71 75 69 72 65  have" : "require
ae70: 73 22 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  s").      );.   
ae80: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b   }..    /* Check
ae90: 20 74 68 61 74 20 61 6c 6c 20 6e 6f 6e 2d 48 49   that all non-HI
aea0: 44 44 45 4e 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  DDEN columns in 
aeb0: 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  the destination 
aec0: 74 61 62 6c 65 20 61 72 65 20 61 6c 73 6f 0a 20  table are also. 
aed0: 20 20 20 2a 2a 20 70 72 65 73 65 6e 74 20 69 6e     ** present in
aee0: 20 74 68 65 20 69 6e 70 75 74 20 74 61 62 6c 65   the input table
aef0: 2e 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 61  . Populate the a
af00: 62 54 62 6c 50 6b 5b 5d 2c 20 61 7a 54 62 6c 54  bTblPk[], azTblT
af10: 79 70 65 5b 5d 20 61 6e 64 0a 20 20 20 20 2a 2a  ype[] and.    **
af20: 20 61 69 54 62 6c 4f 72 64 65 72 5b 5d 20 61 72   aiTblOrder[] ar
af30: 72 61 79 73 20 61 74 20 74 68 65 20 73 61 6d 65  rays at the same
af40: 20 74 69 6d 65 2e 20 20 2a 2f 0a 20 20 20 20 69   time.  */.    i
af50: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
af60: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  _OK ){.      p->
af70: 72 63 20 3d 20 70 72 65 70 61 72 65 46 72 65 65  rc = prepareFree
af80: 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28  AndCollectError(
af90: 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 70 53 74 6d  p->dbMain, &pStm
afa0: 74 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 20  t, &p->zErrmsg, 
afb0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
afc0: 65 33 5f 6d 70 72 69 6e 74 66 28 22 50 52 41 47  e3_mprintf("PRAG
afd0: 4d 41 20 74 61 62 6c 65 5f 69 6e 66 6f 28 25 51  MA table_info(%Q
afe0: 29 22 2c 20 70 49 74 65 72 2d 3e 7a 54 62 6c 29  )", pIter->zTbl)
aff0: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
b000: 20 20 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63      while( p->rc
b010: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53  ==SQLITE_OK && S
b020: 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74  QLITE_ROW==sqlit
b030: 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29  e3_step(pStmt) )
b040: 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
b050: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e  ar *zName = (con
b060: 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
b070: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74  _column_text(pSt
b080: 6d 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66  mt, 1);.      if
b090: 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 62 72 65  ( zName==0 ) bre
b0a0: 61 6b 3b 20 20 2f 2a 20 41 6e 20 4f 4f 4d 20 2d  ak;  /* An OOM -
b0b0: 20 66 69 6e 61 6c 69 7a 65 28 29 20 62 65 6c 6f   finalize() belo
b0c0: 77 20 72 65 74 75 72 6e 73 20 53 5f 4e 4f 4d 45  w returns S_NOME
b0d0: 4d 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 69  M */.      for(i
b0e0: 3d 69 4f 72 64 65 72 3b 20 69 3c 70 49 74 65 72  =iOrder; i<pIter
b0f0: 2d 3e 6e 54 62 6c 43 6f 6c 3b 20 69 2b 2b 29 7b  ->nTblCol; i++){
b100: 0a 20 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d  .        if( 0==
b110: 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 70 49  strcmp(zName, pI
b120: 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69 5d  ter->azTblCol[i]
b130: 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ) ) break;.     
b140: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d   }.      if( i==
b150: 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 20 29  pIter->nTblCol )
b160: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20  {.        p->rc 
b170: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
b180: 20 20 20 20 20 20 20 20 70 2d 3e 7a 45 72 72 6d          p->zErrm
b190: 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  sg = sqlite3_mpr
b1a0: 69 6e 74 66 28 22 63 6f 6c 75 6d 6e 20 6d 69 73  intf("column mis
b1b0: 73 69 6e 67 20 66 72 6f 6d 20 25 71 3a 20 25 73  sing from %q: %s
b1c0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ",.            p
b1d0: 49 74 65 72 2d 3e 7a 44 61 74 61 54 62 6c 2c 20  Iter->zDataTbl, 
b1e0: 7a 4e 61 6d 65 0a 20 20 20 20 20 20 20 20 29 3b  zName.        );
b1f0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
b200: 20 20 20 20 20 20 69 6e 74 20 69 50 6b 20 3d 20        int iPk = 
b210: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
b220: 6e 74 28 70 53 74 6d 74 2c 20 35 29 3b 0a 20 20  nt(pStmt, 5);.  
b230: 20 20 20 20 20 20 69 6e 74 20 62 4e 6f 74 4e 75        int bNotNu
b240: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ll = sqlite3_col
b250: 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 33  umn_int(pStmt, 3
b260: 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  );.        const
b270: 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 28   char *zType = (
b280: 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
b290: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
b2a0: 70 53 74 6d 74 2c 20 32 29 3b 0a 0a 20 20 20 20  pStmt, 2);..    
b2b0: 20 20 20 20 69 66 28 20 69 21 3d 69 4f 72 64 65      if( i!=iOrde
b2c0: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 53  r ){.          S
b2d0: 57 41 50 28 69 6e 74 2c 20 70 49 74 65 72 2d 3e  WAP(int, pIter->
b2e0: 61 69 53 72 63 4f 72 64 65 72 5b 69 5d 2c 20 70  aiSrcOrder[i], p
b2f0: 49 74 65 72 2d 3e 61 69 53 72 63 4f 72 64 65 72  Iter->aiSrcOrder
b300: 5b 69 4f 72 64 65 72 5d 29 3b 0a 20 20 20 20 20  [iOrder]);.     
b310: 20 20 20 20 20 53 57 41 50 28 63 68 61 72 2a 2c       SWAP(char*,
b320: 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c   pIter->azTblCol
b330: 5b 69 5d 2c 20 70 49 74 65 72 2d 3e 61 7a 54 62  [i], pIter->azTb
b340: 6c 43 6f 6c 5b 69 4f 72 64 65 72 5d 29 3b 0a 20  lCol[iOrder]);. 
b350: 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
b360: 20 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 54 79    pIter->azTblTy
b370: 70 65 5b 69 4f 72 64 65 72 5d 20 3d 20 72 62 75  pe[iOrder] = rbu
b380: 53 74 72 6e 64 75 70 28 7a 54 79 70 65 2c 20 26  Strndup(zType, &
b390: 70 2d 3e 72 63 29 3b 0a 20 20 20 20 20 20 20 20  p->rc);.        
b3a0: 70 49 74 65 72 2d 3e 61 62 54 62 6c 50 6b 5b 69  pIter->abTblPk[i
b3b0: 4f 72 64 65 72 5d 20 3d 20 28 69 50 6b 21 3d 30  Order] = (iPk!=0
b3c0: 29 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65 72  );.        pIter
b3d0: 2d 3e 61 62 4e 6f 74 4e 75 6c 6c 5b 69 4f 72 64  ->abNotNull[iOrd
b3e0: 65 72 5d 20 3d 20 28 75 38 29 62 4e 6f 74 4e 75  er] = (u8)bNotNu
b3f0: 6c 6c 20 7c 7c 20 28 69 50 6b 21 3d 30 29 3b 0a  ll || (iPk!=0);.
b400: 20 20 20 20 20 20 20 20 69 4f 72 64 65 72 2b 2b          iOrder++
b410: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
b420: 0a 20 20 20 20 72 62 75 46 69 6e 61 6c 69 7a 65  .    rbuFinalize
b430: 28 70 2c 20 70 53 74 6d 74 29 3b 0a 20 20 20 20  (p, pStmt);.    
b440: 72 62 75 4f 62 6a 49 74 65 72 43 61 63 68 65 49  rbuObjIterCacheI
b450: 6e 64 65 78 65 64 43 6f 6c 73 28 70 2c 20 70 49  ndexedCols(p, pI
b460: 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ter);.    assert
b470: 28 20 70 49 74 65 72 2d 3e 65 54 79 70 65 21 3d  ( pIter->eType!=
b480: 52 42 55 5f 50 4b 5f 56 54 41 42 20 7c 7c 20 70  RBU_PK_VTAB || p
b490: 49 74 65 72 2d 3e 61 62 49 6e 64 65 78 65 64 3d  Iter->abIndexed=
b4a0: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
b4b0: 28 20 70 49 74 65 72 2d 3e 65 54 79 70 65 21 3d  ( pIter->eType!=
b4c0: 52 42 55 5f 50 4b 5f 56 54 41 42 20 7c 7c 20 70  RBU_PK_VTAB || p
b4d0: 49 74 65 72 2d 3e 6e 49 6e 64 65 78 3d 3d 30 20  Iter->nIndex==0 
b4e0: 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
b4f0: 20 70 2d 3e 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   p->rc;.}../*.**
b500: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
b510: 6f 6e 73 74 72 75 63 74 73 20 61 6e 64 20 72 65  onstructs and re
b520: 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  turns a pointer 
b530: 74 6f 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  to a nul-termina
b540: 74 65 64 20 0a 2a 2a 20 73 74 72 69 6e 67 20 63  ted .** string c
b550: 6f 6e 74 61 69 6e 69 6e 67 20 73 6f 6d 65 20 53  ontaining some S
b560: 51 4c 20 63 6c 61 75 73 65 20 6f 72 20 6c 69 73  QL clause or lis
b570: 74 20 62 61 73 65 64 20 6f 6e 20 6f 6e 65 20 6f  t based on one o
b580: 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 0a 2a  r more of the .*
b590: 2a 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 63  * column names c
b5a0: 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20  urrently stored 
b5b0: 69 6e 20 74 68 65 20 70 49 74 65 72 2d 3e 61 7a  in the pIter->az
b5c0: 54 62 6c 43 6f 6c 5b 5d 20 61 72 72 61 79 2e 0a  TblCol[] array..
b5d0: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
b5e0: 72 62 75 4f 62 6a 49 74 65 72 47 65 74 43 6f 6c  rbuObjIterGetCol
b5f0: 6c 69 73 74 28 0a 20 20 73 71 6c 69 74 65 33 72  list(.  sqlite3r
b600: 62 75 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  bu *p,          
b610: 20 20 20 20 20 20 20 20 2f 2a 20 52 42 55 20 6f          /* RBU o
b620: 62 6a 65 63 74 20 2a 2f 0a 20 20 52 62 75 4f 62  bject */.  RbuOb
b630: 6a 49 74 65 72 20 2a 70 49 74 65 72 20 20 20 20  jIter *pIter    
b640: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62             /* Ob
b650: 6a 65 63 74 20 69 74 65 72 61 74 6f 72 20 66 6f  ject iterator fo
b660: 72 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a  r column names *
b670: 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4c 69  /.){.  char *zLi
b680: 73 74 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20  st = 0;.  const 
b690: 63 68 61 72 20 2a 7a 53 65 70 20 3d 20 22 22 3b  char *zSep = "";
b6a0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
b6b0: 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 54  i=0; i<pIter->nT
b6c0: 62 6c 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  blCol; i++){.   
b6d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
b6e0: 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c   pIter->azTblCol
b6f0: 5b 69 5d 3b 0a 20 20 20 20 7a 4c 69 73 74 20 3d  [i];.    zList =
b700: 20 72 62 75 4d 50 72 69 6e 74 66 28 70 2c 20 22   rbuMPrintf(p, "
b710: 25 7a 25 73 5c 22 25 77 5c 22 22 2c 20 7a 4c 69  %z%s\"%w\"", zLi
b720: 73 74 2c 20 7a 53 65 70 2c 20 7a 29 3b 0a 20 20  st, zSep, z);.  
b730: 20 20 7a 53 65 70 20 3d 20 22 2c 20 22 3b 0a 20    zSep = ", ";. 
b740: 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4c 69 73   }.  return zLis
b750: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  t;.}../*.** This
b760: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
b770: 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 53 45  d to create a SE
b780: 4c 45 43 54 20 6c 69 73 74 20 28 74 68 65 20 6c  LECT list (the l
b790: 69 73 74 20 6f 66 20 53 51 4c 20 0a 2a 2a 20 65  ist of SQL .** e
b7a0: 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20  xpressions that 
b7b0: 66 6f 6c 6c 6f 77 73 20 61 20 53 45 4c 45 43 54  follows a SELECT
b7c0: 20 6b 65 79 77 6f 72 64 29 20 66 6f 72 20 61 20   keyword) for a 
b7d0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
b7e0: 20 0a 2a 2a 20 75 73 65 64 20 74 6f 20 72 65 61   .** used to rea
b7f0: 64 20 66 72 6f 6d 20 61 6e 20 64 61 74 61 5f 78  d from an data_x
b800: 78 78 20 6f 72 20 72 62 75 5f 74 6d 70 5f 78 78  xx or rbu_tmp_xx
b810: 78 20 74 61 62 6c 65 20 77 68 69 6c 65 20 75 70  x table while up
b820: 64 61 74 69 6e 67 20 74 68 65 20 0a 2a 2a 20 69  dating the .** i
b830: 6e 64 65 78 20 6f 62 6a 65 63 74 20 63 75 72 72  ndex object curr
b840: 65 6e 74 6c 79 20 69 6e 64 69 63 61 74 65 64 20  ently indicated 
b850: 62 79 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  by the iterator 
b860: 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73  object passed as
b870: 20 74 68 65 20 0a 2a 2a 20 73 65 63 6f 6e 64 20   the .** second 
b880: 61 72 67 75 6d 65 6e 74 2e 20 41 20 22 50 52 41  argument. A "PRA
b890: 47 4d 41 20 69 6e 64 65 78 5f 78 69 6e 66 6f 20  GMA index_xinfo 
b8a0: 3d 20 3c 69 64 78 6e 61 6d 65 3e 22 20 73 74 61  = <idxname>" sta
b8b0: 74 65 6d 65 6e 74 20 69 73 20 75 73 65 64 20 0a  tement is used .
b8c0: 2a 2a 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65  ** to obtain the
b8d0: 20 72 65 71 75 69 72 65 64 20 69 6e 66 6f 72 6d   required inform
b8e0: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ation..**.** If 
b8f0: 74 68 65 20 69 6e 64 65 78 20 69 73 20 6f 66 20  the index is of 
b900: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f  the following fo
b910: 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41  rm:.**.**   CREA
b920: 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74  TE INDEX i1 ON t
b930: 31 28 63 2c 20 62 20 43 4f 4c 4c 41 54 45 20 6e  1(c, b COLLATE n
b940: 6f 63 61 73 65 29 3b 0a 2a 2a 0a 2a 2a 20 61 6e  ocase);.**.** an
b950: 64 20 22 74 31 22 20 69 73 20 61 20 74 61 62 6c  d "t1" is a tabl
b960: 65 20 77 69 74 68 20 61 6e 20 65 78 70 6c 69 63  e with an explic
b970: 69 74 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  it INTEGER PRIMA
b980: 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 0a 2a  RY KEY column .*
b990: 2a 20 22 69 70 6b 22 2c 20 74 68 65 20 72 65 74  * "ipk", the ret
b9a0: 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73 3a  urned string is:
b9b0: 0a 2a 2a 0a 2a 2a 20 20 20 22 60 63 60 20 43 4f  .**.**   "`c` CO
b9c0: 4c 4c 41 54 45 20 27 42 49 4e 41 52 59 27 2c 20  LLATE 'BINARY', 
b9d0: 60 62 60 20 43 4f 4c 4c 41 54 45 20 27 4e 4f 43  `b` COLLATE 'NOC
b9e0: 41 53 45 27 2c 20 60 69 70 6b 60 20 43 4f 4c 4c  ASE', `ipk` COLL
b9f0: 41 54 45 20 27 42 49 4e 41 52 59 27 22 0a 2a 2a  ATE 'BINARY'".**
ba00: 0a 2a 2a 20 41 73 20 77 65 6c 6c 20 61 73 20 74  .** As well as t
ba10: 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69  he returned stri
ba20: 6e 67 2c 20 74 68 72 65 65 20 6f 74 68 65 72 20  ng, three other 
ba30: 6d 61 6c 6c 6f 63 27 64 20 73 74 72 69 6e 67 73  malloc'd strings
ba40: 20 61 72 65 20 0a 2a 2a 20 72 65 74 75 72 6e 65   are .** returne
ba50: 64 20 76 69 61 20 6f 75 74 70 75 74 20 70 61 72  d via output par
ba60: 61 6d 65 74 65 72 73 2e 20 41 73 20 66 6f 6c 6c  ameters. As foll
ba70: 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 70 7a 49  ows:.**.**   pzI
ba80: 6d 70 6f 73 74 65 72 43 6f 6c 73 3a 20 2e 2e 2e  mposterCols: ...
ba90: 0a 2a 2a 20 20 20 70 7a 49 6d 70 6f 73 74 65 72  .**   pzImposter
baa0: 50 6b 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 70 7a 57  Pk: ....**   pzW
bab0: 68 65 72 65 3a 20 2e 2e 2e 0a 2a 2f 0a 73 74 61  here: ....*/.sta
bac0: 74 69 63 20 63 68 61 72 20 2a 72 62 75 4f 62 6a  tic char *rbuObj
bad0: 49 74 65 72 47 65 74 49 6e 64 65 78 43 6f 6c 73  IterGetIndexCols
bae0: 28 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20 2a  (.  sqlite3rbu *
baf0: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
bb00: 20 20 20 20 2f 2a 20 52 42 55 20 6f 62 6a 65 63      /* RBU objec
bb10: 74 20 2a 2f 0a 20 20 52 62 75 4f 62 6a 49 74 65  t */.  RbuObjIte
bb20: 72 20 2a 70 49 74 65 72 2c 20 20 20 20 20 20 20  r *pIter,       
bb30: 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74         /* Object
bb40: 20 69 74 65 72 61 74 6f 72 20 66 6f 72 20 63 6f   iterator for co
bb50: 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20  lumn names */.  
bb60: 63 68 61 72 20 2a 2a 70 7a 49 6d 70 6f 73 74 65  char **pzImposte
bb70: 72 43 6f 6c 73 2c 20 20 20 20 20 20 20 20 20 20  rCols,          
bb80: 2f 2a 20 4f 55 54 3a 20 43 6f 6c 75 6d 6e 73 20  /* OUT: Columns 
bb90: 66 6f 72 20 69 6d 70 6f 73 74 65 72 20 74 61 62  for imposter tab
bba0: 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70  le */.  char **p
bbb0: 7a 49 6d 70 6f 73 74 65 72 50 6b 2c 20 20 20 20  zImposterPk,    
bbc0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
bbd0: 49 6d 70 6f 73 74 65 72 20 50 4b 20 63 6c 61 75  Imposter PK clau
bbe0: 73 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70  se */.  char **p
bbf0: 7a 57 68 65 72 65 2c 20 20 20 20 20 20 20 20 20  zWhere,         
bc00: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
bc10: 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
bc20: 20 20 69 6e 74 20 2a 70 6e 42 69 6e 64 20 20 20    int *pnBind   
bc30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc40: 20 20 2f 2a 20 4f 55 54 3a 20 54 72 62 75 6c 20    /* OUT: Trbul 
bc50: 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
bc60: 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  s */.){.  int rc
bc70: 20 3d 20 70 2d 3e 72 63 3b 20 20 20 20 20 20 20   = p->rc;       
bc80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72            /* Err
bc90: 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  or code */.  int
bca0: 20 72 63 32 3b 20 20 20 20 20 20 20 20 20 20 20   rc2;           
bcb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
bcc0: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
bcd0: 28 29 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  () return code *
bce0: 2f 0a 20 20 63 68 61 72 20 2a 7a 52 65 74 20 3d  /.  char *zRet =
bcf0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
bd00: 20 20 20 20 2f 2a 20 53 74 72 69 6e 67 20 74 6f      /* String to
bd10: 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 63 68 61   return */.  cha
bd20: 72 20 2a 7a 49 6d 70 43 6f 6c 73 20 3d 20 30 3b  r *zImpCols = 0;
bd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
bd40: 53 74 72 69 6e 67 20 74 6f 20 72 65 74 75 72 6e  String to return
bd50: 20 76 69 61 20 2a 70 7a 49 6d 70 6f 73 74 65 72   via *pzImposter
bd60: 43 6f 6c 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  Cols */.  char *
bd70: 7a 49 6d 70 50 4b 20 3d 20 30 3b 20 20 20 20 20  zImpPK = 0;     
bd80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 72            /* Str
bd90: 69 6e 67 20 74 6f 20 72 65 74 75 72 6e 20 76 69  ing to return vi
bda0: 61 20 2a 70 7a 49 6d 70 6f 73 74 65 72 50 4b 20  a *pzImposterPK 
bdb0: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 57 68 65 72  */.  char *zWher
bdc0: 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
bdd0: 20 20 20 20 20 2f 2a 20 53 74 72 69 6e 67 20 74       /* String t
bde0: 6f 20 72 65 74 75 72 6e 20 76 69 61 20 2a 70 7a  o return via *pz
bdf0: 57 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  Where */.  int n
be00: 42 69 6e 64 20 3d 20 30 3b 20 20 20 20 20 20 20  Bind = 0;       
be10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
be20: 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 76 69  lue to return vi
be30: 61 20 2a 70 6e 42 69 6e 64 20 2a 2f 0a 20 20 63  a *pnBind */.  c
be40: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6d 20  onst char *zCom 
be50: 3d 20 22 22 3b 20 20 20 20 20 20 20 20 20 20 2f  = "";          /
be60: 2a 20 53 65 74 20 74 6f 20 22 2c 20 22 20 6c 61  * Set to ", " la
be70: 74 65 72 20 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73  ter on */.  cons
be80: 74 20 63 68 61 72 20 2a 7a 41 6e 64 20 3d 20 22  t char *zAnd = "
be90: 22 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ";          /* S
bea0: 65 74 20 74 6f 20 22 20 41 4e 44 20 22 20 6c 61  et to " AND " la
beb0: 74 65 72 20 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69  ter on */.  sqli
bec0: 74 65 33 5f 73 74 6d 74 20 2a 70 58 49 6e 66 6f  te3_stmt *pXInfo
bed0: 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 50   = 0;       /* P
bee0: 52 41 47 4d 41 20 69 6e 64 65 78 5f 78 69 6e 66  RAGMA index_xinf
bef0: 6f 20 3d 20 3f 20 2a 2f 0a 0a 20 20 69 66 28 20  o = ? */..  if( 
bf00: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
bf10: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
bf20: 7a 45 72 72 6d 73 67 3d 3d 30 20 29 3b 0a 20 20  zErrmsg==0 );.  
bf30: 20 20 72 63 20 3d 20 70 72 65 70 61 72 65 46 72    rc = prepareFr
bf40: 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f  eeAndCollectErro
bf50: 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 70 58  r(p->dbMain, &pX
bf60: 49 6e 66 6f 2c 20 26 70 2d 3e 7a 45 72 72 6d 73  Info, &p->zErrms
bf70: 67 2c 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  g,.        sqlit
bf80: 65 33 5f 6d 70 72 69 6e 74 66 28 22 50 52 41 47  e3_mprintf("PRAG
bf90: 4d 41 20 6d 61 69 6e 2e 69 6e 64 65 78 5f 78 69  MA main.index_xi
bfa0: 6e 66 6f 20 3d 20 25 51 22 2c 20 70 49 74 65 72  nfo = %Q", pIter
bfb0: 2d 3e 7a 49 64 78 29 0a 20 20 20 20 29 3b 0a 20  ->zIdx).    );. 
bfc0: 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 72 63 3d   }..  while( rc=
bfd0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51  =SQLITE_OK && SQ
bfe0: 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65  LITE_ROW==sqlite
bff0: 33 5f 73 74 65 70 28 70 58 49 6e 66 6f 29 20 29  3_step(pXInfo) )
c000: 7b 0a 20 20 20 20 69 6e 74 20 69 43 69 64 20 3d  {.    int iCid =
c010: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
c020: 69 6e 74 28 70 58 49 6e 66 6f 2c 20 31 29 3b 0a  int(pXInfo, 1);.
c030: 20 20 20 20 69 6e 74 20 62 44 65 73 63 20 3d 20      int bDesc = 
c040: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
c050: 6e 74 28 70 58 49 6e 66 6f 2c 20 33 29 3b 0a 20  nt(pXInfo, 3);. 
c060: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
c070: 43 6f 6c 6c 61 74 65 20 3d 20 28 63 6f 6e 73 74  Collate = (const
c080: 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63   char*)sqlite3_c
c090: 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 58 49 6e 66  olumn_text(pXInf
c0a0: 6f 2c 20 34 29 3b 0a 20 20 20 20 63 6f 6e 73 74  o, 4);.    const
c0b0: 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20   char *zCol;.   
c0c0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79   const char *zTy
c0d0: 70 65 3b 0a 0a 20 20 20 20 69 66 28 20 69 43 69  pe;..    if( iCi
c0e0: 64 3c 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  d<0 ){.      /* 
c0f0: 41 6e 20 69 6e 74 65 67 65 72 20 70 72 69 6d 61  An integer prima
c100: 72 79 20 6b 65 79 2e 20 49 66 20 74 68 65 20 74  ry key. If the t
c110: 61 62 6c 65 20 68 61 73 20 61 6e 20 65 78 70 6c  able has an expl
c120: 69 63 69 74 20 49 50 4b 2c 20 75 73 65 0a 20 20  icit IPK, use.  
c130: 20 20 20 20 2a 2a 20 69 74 73 20 6e 61 6d 65 2e      ** its name.
c140: 20 4f 74 68 65 72 77 69 73 65 2c 20 75 73 65 20   Otherwise, use 
c150: 22 72 62 75 5f 72 6f 77 69 64 22 2e 20 20 2a 2f  "rbu_rowid".  */
c160: 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72  .      if( pIter
c170: 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f  ->eType==RBU_PK_
c180: 49 50 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  IPK ){.        i
c190: 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 66 6f  nt i;.        fo
c1a0: 72 28 69 3d 30 3b 20 70 49 74 65 72 2d 3e 61 62  r(i=0; pIter->ab
c1b0: 54 62 6c 50 6b 5b 69 5d 3d 3d 30 3b 20 69 2b 2b  TblPk[i]==0; i++
c1c0: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
c1d0: 74 28 20 69 3c 70 49 74 65 72 2d 3e 6e 54 62 6c  t( i<pIter->nTbl
c1e0: 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 7a  Col );.        z
c1f0: 43 6f 6c 20 3d 20 70 49 74 65 72 2d 3e 61 7a 54  Col = pIter->azT
c200: 62 6c 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20 20  blCol[i];.      
c210: 7d 65 6c 73 65 20 69 66 28 20 72 62 75 49 73 56  }else if( rbuIsV
c220: 61 63 75 75 6d 28 70 29 20 29 7b 0a 20 20 20 20  acuum(p) ){.    
c230: 20 20 20 20 7a 43 6f 6c 20 3d 20 22 5f 72 6f 77      zCol = "_row
c240: 69 64 5f 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73  id_";.      }els
c250: 65 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20  e{.        zCol 
c260: 3d 20 22 72 62 75 5f 72 6f 77 69 64 22 3b 0a 20  = "rbu_rowid";. 
c270: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 54 79       }.      zTy
c280: 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a  pe = "INTEGER";.
c290: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c2a0: 20 7a 43 6f 6c 20 3d 20 70 49 74 65 72 2d 3e 61   zCol = pIter->a
c2b0: 7a 54 62 6c 43 6f 6c 5b 69 43 69 64 5d 3b 0a 20  zTblCol[iCid];. 
c2c0: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 70 49 74       zType = pIt
c2d0: 65 72 2d 3e 61 7a 54 62 6c 54 79 70 65 5b 69 43  er->azTblType[iC
c2e0: 69 64 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  id];.    }..    
c2f0: 7a 52 65 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zRet = sqlite3_m
c300: 70 72 69 6e 74 66 28 22 25 7a 25 73 5c 22 25 77  printf("%z%s\"%w
c310: 5c 22 20 43 4f 4c 4c 41 54 45 20 25 51 22 2c 20  \" COLLATE %Q", 
c320: 7a 52 65 74 2c 20 7a 43 6f 6d 2c 20 7a 43 6f 6c  zRet, zCom, zCol
c330: 2c 20 7a 43 6f 6c 6c 61 74 65 29 3b 0a 20 20 20  , zCollate);.   
c340: 20 69 66 28 20 70 49 74 65 72 2d 3e 62 55 6e 69   if( pIter->bUni
c350: 71 75 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  que==0 || sqlite
c360: 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 58 49  3_column_int(pXI
c370: 6e 66 6f 2c 20 35 29 20 29 7b 0a 20 20 20 20 20  nfo, 5) ){.     
c380: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72   const char *zOr
c390: 64 65 72 20 3d 20 28 62 44 65 73 63 20 3f 20 22  der = (bDesc ? "
c3a0: 20 44 45 53 43 22 20 3a 20 22 22 29 3b 0a 20 20   DESC" : "");.  
c3b0: 20 20 20 20 7a 49 6d 70 50 4b 20 3d 20 73 71 6c      zImpPK = sql
c3c0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a  ite3_mprintf("%z
c3d0: 25 73 5c 22 72 62 75 5f 69 6d 70 5f 25 64 25 77  %s\"rbu_imp_%d%w
c3e0: 5c 22 25 73 22 2c 20 0a 20 20 20 20 20 20 20 20  \"%s", .        
c3f0: 20 20 7a 49 6d 70 50 4b 2c 20 7a 43 6f 6d 2c 20    zImpPK, zCom, 
c400: 6e 42 69 6e 64 2c 20 7a 43 6f 6c 2c 20 7a 4f 72  nBind, zCol, zOr
c410: 64 65 72 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  der.      );.   
c420: 20 7d 0a 20 20 20 20 7a 49 6d 70 43 6f 6c 73 20   }.    zImpCols 
c430: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
c440: 66 28 22 25 7a 25 73 5c 22 72 62 75 5f 69 6d 70  f("%z%s\"rbu_imp
c450: 5f 25 64 25 77 5c 22 20 25 73 20 43 4f 4c 4c 41  _%d%w\" %s COLLA
c460: 54 45 20 25 51 22 2c 20 0a 20 20 20 20 20 20 20  TE %Q", .       
c470: 20 7a 49 6d 70 43 6f 6c 73 2c 20 7a 43 6f 6d 2c   zImpCols, zCom,
c480: 20 6e 42 69 6e 64 2c 20 7a 43 6f 6c 2c 20 7a 54   nBind, zCol, zT
c490: 79 70 65 2c 20 7a 43 6f 6c 6c 61 74 65 0a 20 20  ype, zCollate.  
c4a0: 20 20 29 3b 0a 20 20 20 20 7a 57 68 65 72 65 20    );.    zWhere 
c4b0: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
c4c0: 66 28 0a 20 20 20 20 20 20 20 20 22 25 7a 25 73  f(.        "%z%s
c4d0: 5c 22 72 62 75 5f 69 6d 70 5f 25 64 25 77 5c 22  \"rbu_imp_%d%w\"
c4e0: 20 49 53 20 3f 22 2c 20 7a 57 68 65 72 65 2c 20   IS ?", zWhere, 
c4f0: 7a 41 6e 64 2c 20 6e 42 69 6e 64 2c 20 7a 43 6f  zAnd, nBind, zCo
c500: 6c 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  l.    );.    if(
c510: 20 7a 52 65 74 3d 3d 30 20 7c 7c 20 7a 49 6d 70   zRet==0 || zImp
c520: 50 4b 3d 3d 30 20 7c 7c 20 7a 49 6d 70 43 6f 6c  PK==0 || zImpCol
c530: 73 3d 3d 30 20 7c 7c 20 7a 57 68 65 72 65 3d 3d  s==0 || zWhere==
c540: 30 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  0 ) rc = SQLITE_
c550: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7a 43 6f 6d 20  NOMEM;.    zCom 
c560: 3d 20 22 2c 20 22 3b 0a 20 20 20 20 7a 41 6e 64  = ", ";.    zAnd
c570: 20 3d 20 22 20 41 4e 44 20 22 3b 0a 20 20 20 20   = " AND ";.    
c580: 6e 42 69 6e 64 2b 2b 3b 0a 20 20 7d 0a 0a 20 20  nBind++;.  }..  
c590: 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 66 69  rc2 = sqlite3_fi
c5a0: 6e 61 6c 69 7a 65 28 70 58 49 6e 66 6f 29 3b 0a  nalize(pXInfo);.
c5b0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
c5c0: 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63 32 3b 0a  _OK ) rc = rc2;.
c5d0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
c5e0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
c5f0: 74 65 33 5f 66 72 65 65 28 7a 52 65 74 29 3b 0a  te3_free(zRet);.
c600: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
c610: 28 7a 49 6d 70 43 6f 6c 73 29 3b 0a 20 20 20 20  (zImpCols);.    
c620: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 49 6d  sqlite3_free(zIm
c630: 70 50 4b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pPK);.    sqlite
c640: 33 5f 66 72 65 65 28 7a 57 68 65 72 65 29 3b 0a  3_free(zWhere);.
c650: 20 20 20 20 7a 52 65 74 20 3d 20 30 3b 0a 20 20      zRet = 0;.  
c660: 20 20 7a 49 6d 70 43 6f 6c 73 20 3d 20 30 3b 0a    zImpCols = 0;.
c670: 20 20 20 20 7a 49 6d 70 50 4b 20 3d 20 30 3b 0a      zImpPK = 0;.
c680: 20 20 20 20 7a 57 68 65 72 65 20 3d 20 30 3b 0a      zWhere = 0;.
c690: 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a      p->rc = rc;.
c6a0: 20 20 7d 0a 0a 20 20 2a 70 7a 49 6d 70 6f 73 74    }..  *pzImpost
c6b0: 65 72 43 6f 6c 73 20 3d 20 7a 49 6d 70 43 6f 6c  erCols = zImpCol
c6c0: 73 3b 0a 20 20 2a 70 7a 49 6d 70 6f 73 74 65 72  s;.  *pzImposter
c6d0: 50 6b 20 3d 20 7a 49 6d 70 50 4b 3b 0a 20 20 2a  Pk = zImpPK;.  *
c6e0: 70 7a 57 68 65 72 65 20 3d 20 7a 57 68 65 72 65  pzWhere = zWhere
c6f0: 3b 0a 20 20 2a 70 6e 42 69 6e 64 20 3d 20 6e 42  ;.  *pnBind = nB
c700: 69 6e 64 3b 0a 20 20 72 65 74 75 72 6e 20 7a 52  ind;.  return zR
c710: 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73  et;.}../*.** Ass
c720: 75 6d 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e  uming the curren
c730: 74 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20  t table columns 
c740: 61 72 65 20 22 61 22 2c 20 22 62 22 20 61 6e 64  are "a", "b" and
c750: 20 22 63 22 2c 20 61 6e 64 20 74 68 65 20 7a 4f   "c", and the zO
c760: 62 6a 0a 2a 2a 20 70 61 72 61 6d 74 65 72 20 69  bj.** paramter i
c770: 73 20 70 61 73 73 65 64 20 22 6f 6c 64 22 2c 20  s passed "old", 
c780: 72 65 74 75 72 6e 20 61 20 73 74 72 69 6e 67 20  return a string 
c790: 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a  of the form:.**.
c7a0: 2a 2a 20 20 20 20 20 22 6f 6c 64 2e 61 2c 20 6f  **     "old.a, o
c7b0: 6c 64 2e 62 2c 20 6f 6c 64 2e 62 22 0a 2a 2a 0a  ld.b, old.b".**.
c7c0: 2a 2a 20 57 69 74 68 20 74 68 65 20 63 6f 6c 75  ** With the colu
c7d0: 6d 6e 20 6e 61 6d 65 73 20 65 73 63 61 70 65 64  mn names escaped
c7e0: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 61 62 6c  ..**.** For tabl
c7f0: 65 73 20 77 69 74 68 20 69 6d 70 6c 69 63 69 74  es with implicit
c800: 20 72 6f 77 69 64 73 20 2d 20 52 42 55 5f 50 4b   rowids - RBU_PK
c810: 5f 45 58 54 45 52 4e 41 4c 20 61 6e 64 20 52 42  _EXTERNAL and RB
c820: 55 5f 50 4b 5f 4e 4f 4e 45 2c 20 61 70 70 65 6e  U_PK_NONE, appen
c830: 64 0a 2a 2a 20 74 68 65 20 74 65 78 74 20 22 2c  d.** the text ",
c840: 20 6f 6c 64 2e 5f 72 6f 77 69 64 5f 22 20 74 6f   old._rowid_" to
c850: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 76 61   the returned va
c860: 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  lue..*/.static c
c870: 68 61 72 20 2a 72 62 75 4f 62 6a 49 74 65 72 47  har *rbuObjIterG
c880: 65 74 4f 6c 64 6c 69 73 74 28 0a 20 20 73 71 6c  etOldlist(.  sql
c890: 69 74 65 33 72 62 75 20 2a 70 2c 20 0a 20 20 52  ite3rbu *p, .  R
c8a0: 62 75 4f 62 6a 49 74 65 72 20 2a 70 49 74 65 72  buObjIter *pIter
c8b0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
c8c0: 7a 4f 62 6a 0a 29 7b 0a 20 20 63 68 61 72 20 2a  zObj.){.  char *
c8d0: 7a 4c 69 73 74 20 3d 20 30 3b 0a 20 20 69 66 28  zList = 0;.  if(
c8e0: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
c8f0: 4b 20 26 26 20 70 49 74 65 72 2d 3e 61 62 49 6e  K && pIter->abIn
c900: 64 65 78 65 64 20 29 7b 0a 20 20 20 20 63 6f 6e  dexed ){.    con
c910: 73 74 20 63 68 61 72 20 2a 7a 53 20 3d 20 22 22  st char *zS = ""
c920: 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
c930: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65   for(i=0; i<pIte
c940: 72 2d 3e 6e 54 62 6c 43 6f 6c 3b 20 69 2b 2b 29  r->nTblCol; i++)
c950: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  {.      if( pIte
c960: 72 2d 3e 61 62 49 6e 64 65 78 65 64 5b 69 5d 20  r->abIndexed[i] 
c970: 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
c980: 20 63 68 61 72 20 2a 7a 43 6f 6c 20 3d 20 70 49   char *zCol = pI
c990: 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69 5d  ter->azTblCol[i]
c9a0: 3b 0a 20 20 20 20 20 20 20 20 7a 4c 69 73 74 20  ;.        zList 
c9b0: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
c9c0: 66 28 22 25 7a 25 73 25 73 2e 5c 22 25 77 5c 22  f("%z%s%s.\"%w\"
c9d0: 22 2c 20 7a 4c 69 73 74 2c 20 7a 53 2c 20 7a 4f  ", zList, zS, zO
c9e0: 62 6a 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 20  bj, zCol);.     
c9f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
ca00: 7a 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 5f  zList = sqlite3_
ca10: 6d 70 72 69 6e 74 66 28 22 25 7a 25 73 4e 55 4c  mprintf("%z%sNUL
ca20: 4c 22 2c 20 7a 4c 69 73 74 2c 20 7a 53 29 3b 0a  L", zList, zS);.
ca30: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 53        }.      zS
ca40: 20 3d 20 22 2c 20 22 3b 0a 20 20 20 20 20 20 69   = ", ";.      i
ca50: 66 28 20 7a 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( zList==0 ){. 
ca60: 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53         p->rc = S
ca70: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
ca80: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
ca90: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
caa0: 2a 20 46 6f 72 20 61 20 74 61 62 6c 65 20 77 69  * For a table wi
cab0: 74 68 20 69 6d 70 6c 69 63 69 74 20 72 6f 77 69  th implicit rowi
cac0: 64 73 2c 20 61 70 70 65 6e 64 20 22 6f 6c 64 2e  ds, append "old.
cad0: 5f 72 6f 77 69 64 5f 22 20 74 6f 20 74 68 65 20  _rowid_" to the 
cae0: 6c 69 73 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28  list. */.    if(
caf0: 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52   pIter->eType==R
cb00: 42 55 5f 50 4b 5f 45 58 54 45 52 4e 41 4c 20 7c  BU_PK_EXTERNAL |
cb10: 7c 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d  | pIter->eType==
cb20: 52 42 55 5f 50 4b 5f 4e 4f 4e 45 20 29 7b 0a 20  RBU_PK_NONE ){. 
cb30: 20 20 20 20 20 7a 4c 69 73 74 20 3d 20 72 62 75       zList = rbu
cb40: 4d 50 72 69 6e 74 66 28 70 2c 20 22 25 7a 2c 20  MPrintf(p, "%z, 
cb50: 25 73 2e 5f 72 6f 77 69 64 5f 22 2c 20 7a 4c 69  %s._rowid_", zLi
cb60: 73 74 2c 20 7a 4f 62 6a 29 3b 0a 20 20 20 20 7d  st, zObj);.    }
cb70: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4c  .  }.  return zL
cb80: 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ist;.}../*.** Re
cb90: 74 75 72 6e 20 61 6e 20 65 78 70 72 65 73 73 69  turn an expressi
cba0: 6f 6e 20 74 68 61 74 20 63 61 6e 20 62 65 20 75  on that can be u
cbb0: 73 65 64 20 69 6e 20 61 20 57 48 45 52 45 20 63  sed in a WHERE c
cbc0: 6c 61 75 73 65 20 74 6f 20 6d 61 74 63 68 20 74  lause to match t
cbd0: 68 65 0a 2a 2a 20 70 72 69 6d 61 72 79 20 6b 65  he.** primary ke
cbe0: 79 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  y of the current
cbf0: 20 74 61 62 6c 65 2e 20 46 6f 72 20 65 78 61 6d   table. For exam
cc00: 70 6c 65 2c 20 69 66 20 74 68 65 20 74 61 62 6c  ple, if the tabl
cc10: 65 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52  e is:.**.**   CR
cc20: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
cc30: 20 62 2c 20 63 2c 20 50 52 49 4d 41 52 59 20 4b   b, c, PRIMARY K
cc40: 45 59 28 62 2c 20 63 29 29 3b 0a 2a 2a 0a 2a 2a  EY(b, c));.**.**
cc50: 20 52 65 74 75 72 6e 20 74 68 65 20 73 74 72 69   Return the stri
cc60: 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 62 20 3d  ng:.**.**   "b =
cc70: 20 3f 31 20 41 4e 44 20 63 20 3d 20 3f 32 22 0a   ?1 AND c = ?2".
cc80: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
cc90: 72 62 75 4f 62 6a 49 74 65 72 47 65 74 57 68 65  rbuObjIterGetWhe
cca0: 72 65 28 0a 20 20 73 71 6c 69 74 65 33 72 62 75  re(.  sqlite3rbu
ccb0: 20 2a 70 2c 20 0a 20 20 52 62 75 4f 62 6a 49 74   *p, .  RbuObjIt
ccc0: 65 72 20 2a 70 49 74 65 72 0a 29 7b 0a 20 20 63  er *pIter.){.  c
ccd0: 68 61 72 20 2a 7a 4c 69 73 74 20 3d 20 30 3b 0a  har *zList = 0;.
cce0: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 65 54 79    if( pIter->eTy
ccf0: 70 65 3d 3d 52 42 55 5f 50 4b 5f 56 54 41 42 20  pe==RBU_PK_VTAB 
cd00: 7c 7c 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d  || pIter->eType=
cd10: 3d 52 42 55 5f 50 4b 5f 4e 4f 4e 45 20 29 7b 0a  =RBU_PK_NONE ){.
cd20: 20 20 20 20 7a 4c 69 73 74 20 3d 20 72 62 75 4d      zList = rbuM
cd30: 50 72 69 6e 74 66 28 70 2c 20 22 5f 72 6f 77 69  Printf(p, "_rowi
cd40: 64 5f 20 3d 20 3f 25 64 22 2c 20 70 49 74 65 72  d_ = ?%d", pIter
cd50: 2d 3e 6e 54 62 6c 43 6f 6c 2b 31 29 3b 0a 20 20  ->nTblCol+1);.  
cd60: 7d 65 6c 73 65 20 69 66 28 20 70 49 74 65 72 2d  }else if( pIter-
cd70: 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 45  >eType==RBU_PK_E
cd80: 58 54 45 52 4e 41 4c 20 29 7b 0a 20 20 20 20 63  XTERNAL ){.    c
cd90: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 65 70 20  onst char *zSep 
cda0: 3d 20 22 22 3b 0a 20 20 20 20 69 6e 74 20 69 3b  = "";.    int i;
cdb0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
cdc0: 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 3b 20  pIter->nTblCol; 
cdd0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
cde0: 70 49 74 65 72 2d 3e 61 62 54 62 6c 50 6b 5b 69  pIter->abTblPk[i
cdf0: 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4c 69  ] ){.        zLi
ce00: 73 74 20 3d 20 72 62 75 4d 50 72 69 6e 74 66 28  st = rbuMPrintf(
ce10: 70 2c 20 22 25 7a 25 73 63 25 64 3d 3f 25 64 22  p, "%z%sc%d=?%d"
ce20: 2c 20 7a 4c 69 73 74 2c 20 7a 53 65 70 2c 20 69  , zList, zSep, i
ce30: 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  , i+1);.        
ce40: 7a 53 65 70 20 3d 20 22 20 41 4e 44 20 22 3b 0a  zSep = " AND ";.
ce50: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
ce60: 20 20 7a 4c 69 73 74 20 3d 20 72 62 75 4d 50 72    zList = rbuMPr
ce70: 69 6e 74 66 28 70 2c 20 0a 20 20 20 20 20 20 20  intf(p, .       
ce80: 20 22 5f 72 6f 77 69 64 5f 20 3d 20 28 53 45 4c   "_rowid_ = (SEL
ce90: 45 43 54 20 69 64 20 46 52 4f 4d 20 72 62 75 5f  ECT id FROM rbu_
cea0: 69 6d 70 6f 73 74 65 72 32 20 57 48 45 52 45 20  imposter2 WHERE 
ceb0: 25 7a 29 22 2c 20 7a 4c 69 73 74 0a 20 20 20 20  %z)", zList.    
cec0: 29 3b 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  );..  }else{.   
ced0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 65   const char *zSe
cee0: 70 20 3d 20 22 22 3b 0a 20 20 20 20 69 6e 74 20  p = "";.    int 
cef0: 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
cf00: 69 3c 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c  i<pIter->nTblCol
cf10: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
cf20: 28 20 70 49 74 65 72 2d 3e 61 62 54 62 6c 50 6b  ( pIter->abTblPk
cf30: 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 63  [i] ){.        c
cf40: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 20  onst char *zCol 
cf50: 3d 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f  = pIter->azTblCo
cf60: 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 7a 4c  l[i];.        zL
cf70: 69 73 74 20 3d 20 72 62 75 4d 50 72 69 6e 74 66  ist = rbuMPrintf
cf80: 28 70 2c 20 22 25 7a 25 73 5c 22 25 77 5c 22 3d  (p, "%z%s\"%w\"=
cf90: 3f 25 64 22 2c 20 7a 4c 69 73 74 2c 20 7a 53 65  ?%d", zList, zSe
cfa0: 70 2c 20 7a 43 6f 6c 2c 20 69 2b 31 29 3b 0a 20  p, zCol, i+1);. 
cfb0: 20 20 20 20 20 20 20 7a 53 65 70 20 3d 20 22 20         zSep = " 
cfc0: 41 4e 44 20 22 3b 0a 20 20 20 20 20 20 7d 0a 20  AND ";.      }. 
cfd0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
cfe0: 6e 20 7a 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  n zList;.}../*.*
cff0: 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61  * The SELECT sta
d000: 74 65 6d 65 6e 74 20 69 74 65 72 61 74 69 6e 67  tement iterating
d010: 20 74 68 72 6f 75 67 68 20 74 68 65 20 6b 65 79   through the key
d020: 73 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  s for the curren
d030: 74 20 6f 62 6a 65 63 74 0a 2a 2a 20 28 70 2d 3e  t object.** (p->
d040: 6f 62 6a 69 74 65 72 2e 70 53 65 6c 65 63 74 29  objiter.pSelect)
d050: 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
d060: 73 20 74 6f 20 61 20 76 61 6c 69 64 20 72 6f 77  s to a valid row
d070: 2e 20 48 6f 77 65 76 65 72 2c 20 74 68 65 72 65  . However, there
d080: 0a 2a 2a 20 69 73 20 73 6f 6d 65 74 68 69 6e 67  .** is something
d090: 20 77 72 6f 6e 67 20 77 69 74 68 20 74 68 65 20   wrong with the 
d0a0: 72 62 75 5f 63 6f 6e 74 72 6f 6c 20 76 61 6c 75  rbu_control valu
d0b0: 65 20 69 6e 20 74 68 65 20 72 62 75 5f 63 6f 6e  e in the rbu_con
d0c0: 74 72 6f 6c 20 76 61 6c 75 65 0a 2a 2a 20 73 74  trol value.** st
d0d0: 6f 72 65 64 20 69 6e 20 74 68 65 20 28 70 2d 3e  ored in the (p->
d0e0: 6e 43 6f 6c 2b 31 29 27 74 68 20 63 6f 6c 75 6d  nCol+1)'th colum
d0f0: 6e 2e 20 53 65 74 20 74 68 65 20 65 72 72 6f 72  n. Set the error
d100: 20 63 6f 64 65 20 61 6e 64 20 65 72 72 6f 72 20   code and error 
d110: 6d 65 73 73 61 67 65 0a 2a 2a 20 6f 66 20 74 68  message.** of th
d120: 65 20 52 42 55 20 68 61 6e 64 6c 65 20 74 6f 20  e RBU handle to 
d130: 73 6f 6d 65 74 68 69 6e 67 20 72 65 66 6c 65 63  something reflec
d140: 74 69 6e 67 20 74 68 69 73 2e 0a 2a 2f 0a 73 74  ting this..*/.st
d150: 61 74 69 63 20 76 6f 69 64 20 72 62 75 42 61 64  atic void rbuBad
d160: 43 6f 6e 74 72 6f 6c 45 72 72 6f 72 28 73 71 6c  ControlError(sql
d170: 69 74 65 33 72 62 75 20 2a 70 29 7b 0a 20 20 70  ite3rbu *p){.  p
d180: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52  ->rc = SQLITE_ER
d190: 52 4f 52 3b 0a 20 20 70 2d 3e 7a 45 72 72 6d 73  ROR;.  p->zErrms
d1a0: 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  g = sqlite3_mpri
d1b0: 6e 74 66 28 22 69 6e 76 61 6c 69 64 20 72 62 75  ntf("invalid rbu
d1c0: 5f 63 6f 6e 74 72 6f 6c 20 76 61 6c 75 65 22 29  _control value")
d1d0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ;.}.../*.** Retu
d1e0: 72 6e 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  rn a nul-termina
d1f0: 74 65 64 20 73 74 72 69 6e 67 20 63 6f 6e 74 61  ted string conta
d200: 69 6e 69 6e 67 20 74 68 65 20 63 6f 6d 6d 61 20  ining the comma 
d210: 73 65 70 61 72 61 74 65 64 20 6c 69 73 74 20 6f  separated list o
d220: 66 0a 2a 2a 20 61 73 73 69 67 6e 6d 65 6e 74 73  f.** assignments
d230: 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
d240: 69 6e 63 6c 75 64 65 64 20 66 6f 6c 6c 6f 77 69  included followi
d250: 6e 67 20 74 68 65 20 22 53 45 54 22 20 6b 65 79  ng the "SET" key
d260: 77 6f 72 64 20 6f 66 0a 2a 2a 20 61 6e 20 55 50  word of.** an UP
d270: 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20 75  DATE statement u
d280: 73 65 64 20 74 6f 20 75 70 64 61 74 65 20 74 68  sed to update th
d290: 65 20 74 61 62 6c 65 20 6f 62 6a 65 63 74 20 74  e table object t
d2a0: 68 61 74 20 74 68 65 20 69 74 65 72 61 74 6f 72  hat the iterator
d2b0: 0a 2a 2a 20 70 61 73 73 65 64 20 61 73 20 74 68  .** passed as th
d2c0: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
d2d0: 74 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  t currently poin
d2e0: 74 73 20 74 6f 20 69 66 20 74 68 65 20 72 62 75  ts to if the rbu
d2f0: 5f 63 6f 6e 74 72 6f 6c 0a 2a 2a 20 63 6f 6c 75  _control.** colu
d300: 6d 6e 20 6f 66 20 74 68 65 20 64 61 74 61 5f 78  mn of the data_x
d310: 78 78 20 74 61 62 6c 65 20 65 6e 74 72 79 20 69  xx table entry i
d320: 73 20 73 65 74 20 74 6f 20 7a 4d 61 73 6b 2e 0a  s set to zMask..
d330: 2a 2a 0a 2a 2a 20 54 68 65 20 6d 65 6d 6f 72 79  **.** The memory
d340: 20 66 6f 72 20 74 68 65 20 72 65 74 75 72 6e 65   for the returne
d350: 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61  d string is obta
d360: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
d370: 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 49  3_malloc()..** I
d380: 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73  t is the respons
d390: 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
d3a0: 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61  aller to eventua
d3b0: 6c 6c 79 20 66 72 65 65 20 69 74 20 75 73 69 6e  lly free it usin
d3c0: 67 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66 72 65  g.** sqlite3_fre
d3d0: 65 28 29 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61  e(). .**.** If a
d3e0: 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 69 73 20 65  n OOM error is e
d3f0: 6e 63 6f 75 6e 74 65 72 65 64 20 77 68 65 6e 20  ncountered when 
d400: 61 6c 6c 6f 63 61 74 69 6e 67 20 73 70 61 63 65  allocating space
d410: 20 66 6f 72 20 74 68 65 20 6e 65 77 0a 2a 2a 20   for the new.** 
d420: 73 74 72 69 6e 67 2c 20 61 6e 20 65 72 72 6f 72  string, an error
d430: 20 63 6f 64 65 20 69 73 20 6c 65 66 74 20 69 6e   code is left in
d440: 20 74 68 65 20 72 62 75 20 68 61 6e 64 6c 65 20   the rbu handle 
d450: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
d460: 72 73 74 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20  rst.** argument 
d470: 61 6e 64 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  and NULL is retu
d480: 72 6e 65 64 2e 20 4f 72 2c 20 69 66 20 61 6e 20  rned. Or, if an 
d490: 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64  error has alread
d4a0: 79 20 6f 63 63 75 72 72 65 64 0a 2a 2a 20 77 68  y occurred.** wh
d4b0: 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
d4c0: 20 69 73 20 63 61 6c 6c 65 64 2c 20 4e 55 4c 4c   is called, NULL
d4d0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 6d 6d   is returned imm
d4e0: 65 64 69 61 74 65 6c 79 2c 20 77 69 74 68 6f 75  ediately, withou
d4f0: 74 0a 2a 2a 20 61 74 74 65 6d 70 74 69 6e 67 20  t.** attempting 
d500: 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f  the allocation o
d510: 72 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20  r modifying the 
d520: 73 74 6f 72 65 64 20 65 72 72 6f 72 20 63 6f 64  stored error cod
d530: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  e..*/.static cha
d540: 72 20 2a 72 62 75 4f 62 6a 49 74 65 72 47 65 74  r *rbuObjIterGet
d550: 53 65 74 6c 69 73 74 28 0a 20 20 73 71 6c 69 74  Setlist(.  sqlit
d560: 65 33 72 62 75 20 2a 70 2c 0a 20 20 52 62 75 4f  e3rbu *p,.  RbuO
d570: 62 6a 49 74 65 72 20 2a 70 49 74 65 72 2c 0a 20  bjIter *pIter,. 
d580: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61   const char *zMa
d590: 73 6b 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4c  sk.){.  char *zL
d5a0: 69 73 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  ist = 0;.  if( p
d5b0: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
d5c0: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20  ){.    int i;.. 
d5d0: 20 20 20 69 66 28 20 28 69 6e 74 29 73 74 72 6c     if( (int)strl
d5e0: 65 6e 28 7a 4d 61 73 6b 29 21 3d 70 49 74 65 72  en(zMask)!=pIter
d5f0: 2d 3e 6e 54 62 6c 43 6f 6c 20 29 7b 0a 20 20 20  ->nTblCol ){.   
d600: 20 20 20 72 62 75 42 61 64 43 6f 6e 74 72 6f 6c     rbuBadControl
d610: 45 72 72 6f 72 28 70 29 3b 0a 20 20 20 20 7d 65  Error(p);.    }e
d620: 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  lse{.      const
d630: 20 63 68 61 72 20 2a 7a 53 65 70 20 3d 20 22 22   char *zSep = ""
d640: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
d650: 20 69 3c 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f   i<pIter->nTblCo
d660: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; i++){.       
d670: 20 63 68 61 72 20 63 20 3d 20 7a 4d 61 73 6b 5b   char c = zMask[
d680: 70 49 74 65 72 2d 3e 61 69 53 72 63 4f 72 64 65  pIter->aiSrcOrde
d690: 72 5b 69 5d 5d 3b 0a 20 20 20 20 20 20 20 20 69  r[i]];.        i
d6a0: 66 28 20 63 3d 3d 27 78 27 20 29 7b 0a 20 20 20  f( c=='x' ){.   
d6b0: 20 20 20 20 20 20 20 7a 4c 69 73 74 20 3d 20 72         zList = r
d6c0: 62 75 4d 50 72 69 6e 74 66 28 70 2c 20 22 25 7a  buMPrintf(p, "%z
d6d0: 25 73 5c 22 25 77 5c 22 3d 3f 25 64 22 2c 20 0a  %s\"%w\"=?%d", .
d6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4c                zL
d6f0: 69 73 74 2c 20 7a 53 65 70 2c 20 70 49 74 65 72  ist, zSep, pIter
d700: 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69 5d 2c 20 69  ->azTblCol[i], i
d710: 2b 31 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a  +1.          );.
d720: 20 20 20 20 20 20 20 20 20 20 7a 53 65 70 20 3d            zSep =
d730: 20 22 2c 20 22 3b 0a 20 20 20 20 20 20 20 20 7d   ", ";.        }
d740: 0a 20 20 20 20 20 20 20 20 65 6c 73 65 20 69 66  .        else if
d750: 28 20 63 3d 3d 27 64 27 20 29 7b 0a 20 20 20 20  ( c=='d' ){.    
d760: 20 20 20 20 20 20 7a 4c 69 73 74 20 3d 20 72 62        zList = rb
d770: 75 4d 50 72 69 6e 74 66 28 70 2c 20 22 25 7a 25  uMPrintf(p, "%z%
d780: 73 5c 22 25 77 5c 22 3d 72 62 75 5f 64 65 6c 74  s\"%w\"=rbu_delt
d790: 61 28 5c 22 25 77 5c 22 2c 20 3f 25 64 29 22 2c  a(\"%w\", ?%d)",
d7a0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
d7b0: 7a 4c 69 73 74 2c 20 7a 53 65 70 2c 20 70 49 74  zList, zSep, pIt
d7c0: 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69 5d 2c  er->azTblCol[i],
d7d0: 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c   pIter->azTblCol
d7e0: 5b 69 5d 2c 20 69 2b 31 0a 20 20 20 20 20 20 20  [i], i+1.       
d7f0: 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20     );.          
d800: 7a 53 65 70 20 3d 20 22 2c 20 22 3b 0a 20 20 20  zSep = ", ";.   
d810: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 65       }.        e
d820: 6c 73 65 20 69 66 28 20 63 3d 3d 27 66 27 20 29  lse if( c=='f' )
d830: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 4c 69 73  {.          zLis
d840: 74 20 3d 20 72 62 75 4d 50 72 69 6e 74 66 28 70  t = rbuMPrintf(p
d850: 2c 20 22 25 7a 25 73 5c 22 25 77 5c 22 3d 72 62  , "%z%s\"%w\"=rb
d860: 75 5f 66 6f 73 73 69 6c 5f 64 65 6c 74 61 28 5c  u_fossil_delta(\
d870: 22 25 77 5c 22 2c 20 3f 25 64 29 22 2c 20 0a 20  "%w\", ?%d)", . 
d880: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4c 69               zLi
d890: 73 74 2c 20 7a 53 65 70 2c 20 70 49 74 65 72 2d  st, zSep, pIter-
d8a0: 3e 61 7a 54 62 6c 43 6f 6c 5b 69 5d 2c 20 70 49  >azTblCol[i], pI
d8b0: 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69 5d  ter->azTblCol[i]
d8c0: 2c 20 69 2b 31 0a 20 20 20 20 20 20 20 20 20 20  , i+1.          
d8d0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 53 65  );.          zSe
d8e0: 70 20 3d 20 22 2c 20 22 3b 0a 20 20 20 20 20 20  p = ", ";.      
d8f0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
d900: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  }.  }.  return z
d910: 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  List;.}../*.** R
d920: 65 74 75 72 6e 20 61 20 6e 75 6c 2d 74 65 72 6d  eturn a nul-term
d930: 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20 63 6f  inated string co
d940: 6e 73 69 73 74 69 6e 67 20 6f 66 20 6e 42 79 74  nsisting of nByt
d950: 65 20 63 6f 6d 6d 61 20 73 65 70 61 72 61 74 65  e comma separate
d960: 64 0a 2a 2a 20 22 3f 22 20 65 78 70 72 65 73 73  d.** "?" express
d970: 69 6f 6e 73 2e 20 46 6f 72 20 65 78 61 6d 70 6c  ions. For exampl
d980: 65 2c 20 69 66 20 6e 42 79 74 65 20 69 73 20 33  e, if nByte is 3
d990: 2c 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  , return a point
d9a0: 65 72 20 74 6f 0a 2a 2a 20 61 20 62 75 66 66 65  er to.** a buffe
d9b0: 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  r containing the
d9c0: 20 73 74 72 69 6e 67 20 22 3f 2c 3f 2c 3f 22 2e   string "?,?,?".
d9d0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 65 6d 6f 72  .**.** The memor
d9e0: 79 20 66 6f 72 20 74 68 65 20 72 65 74 75 72 6e  y for the return
d9f0: 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74  ed string is obt
da00: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
da10: 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20  e3_malloc()..** 
da20: 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e  It is the respon
da30: 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
da40: 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75  caller to eventu
da50: 61 6c 6c 79 20 66 72 65 65 20 69 74 20 75 73 69  ally free it usi
da60: 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66 72  ng.** sqlite3_fr
da70: 65 65 28 29 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  ee(). .**.** If 
da80: 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 69 73 20  an OOM error is 
da90: 65 6e 63 6f 75 6e 74 65 72 65 64 20 77 68 65 6e  encountered when
daa0: 20 61 6c 6c 6f 63 61 74 69 6e 67 20 73 70 61 63   allocating spac
dab0: 65 20 66 6f 72 20 74 68 65 20 6e 65 77 0a 2a 2a  e for the new.**
dac0: 20 73 74 72 69 6e 67 2c 20 61 6e 20 65 72 72 6f   string, an erro
dad0: 72 20 63 6f 64 65 20 69 73 20 6c 65 66 74 20 69  r code is left i
dae0: 6e 20 74 68 65 20 72 62 75 20 68 61 6e 64 6c 65  n the rbu handle
daf0: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
db00: 69 72 73 74 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  irst.** argument
db10: 20 61 6e 64 20 4e 55 4c 4c 20 69 73 20 72 65 74   and NULL is ret
db20: 75 72 6e 65 64 2e 20 4f 72 2c 20 69 66 20 61 6e  urned. Or, if an
db30: 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61   error has alrea
db40: 64 79 20 6f 63 63 75 72 72 65 64 0a 2a 2a 20 77  dy occurred.** w
db50: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
db60: 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 4e 55 4c  n is called, NUL
db70: 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 6d  L is returned im
db80: 6d 65 64 69 61 74 65 6c 79 2c 20 77 69 74 68 6f  mediately, witho
db90: 75 74 0a 2a 2a 20 61 74 74 65 6d 70 74 69 6e 67  ut.** attempting
dba0: 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20   the allocation 
dbb0: 6f 72 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65  or modifying the
dbc0: 20 73 74 6f 72 65 64 20 65 72 72 6f 72 20 63 6f   stored error co
dbd0: 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  de..*/.static ch
dbe0: 61 72 20 2a 72 62 75 4f 62 6a 49 74 65 72 47 65  ar *rbuObjIterGe
dbf0: 74 42 69 6e 64 6c 69 73 74 28 73 71 6c 69 74 65  tBindlist(sqlite
dc00: 33 72 62 75 20 2a 70 2c 20 69 6e 74 20 6e 42 69  3rbu *p, int nBi
dc10: 6e 64 29 7b 0a 20 20 63 68 61 72 20 2a 7a 52 65  nd){.  char *zRe
dc20: 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 42 79  t = 0;.  int nBy
dc30: 74 65 20 3d 20 6e 42 69 6e 64 2a 32 20 2b 20 31  te = nBind*2 + 1
dc40: 3b 0a 0a 20 20 7a 52 65 74 20 3d 20 28 63 68 61  ;..  zRet = (cha
dc50: 72 2a 29 72 62 75 4d 61 6c 6c 6f 63 28 70 2c 20  r*)rbuMalloc(p, 
dc60: 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 7a 52  nByte);.  if( zR
dc70: 65 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  et ){.    int i;
dc80: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
dc90: 6e 42 69 6e 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  nBind; i++){.   
dca0: 20 20 20 7a 52 65 74 5b 69 2a 32 5d 20 3d 20 27     zRet[i*2] = '
dcb0: 3f 27 3b 0a 20 20 20 20 20 20 7a 52 65 74 5b 69  ?';.      zRet[i
dcc0: 2a 32 2b 31 5d 20 3d 20 28 69 2b 31 3d 3d 6e 42  *2+1] = (i+1==nB
dcd0: 69 6e 64 29 20 3f 20 27 5c 30 27 20 3a 20 27 2c  ind) ? '\0' : ',
dce0: 27 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  ';.    }.  }.  r
dcf0: 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 0a 2f  eturn zRet;.}../
dd00: 2a 0a 2a 2a 20 54 68 65 20 69 74 65 72 61 74 6f  *.** The iterato
dd10: 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  r currently poin
dd20: 74 73 20 74 6f 20 61 20 74 61 62 6c 65 20 28 6e  ts to a table (n
dd30: 6f 74 20 69 6e 64 65 78 29 20 6f 66 20 74 79 70  ot index) of typ
dd40: 65 20 0a 2a 2a 20 52 42 55 5f 50 4b 5f 57 49 54  e .** RBU_PK_WIT
dd50: 48 4f 55 54 5f 52 4f 57 49 44 2e 20 54 68 69 73  HOUT_ROWID. This
dd60: 20 66 75 6e 63 74 69 6f 6e 20 63 72 65 61 74 65   function create
dd70: 73 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  s the PRIMARY KE
dd80: 59 20 0a 2a 2a 20 64 65 63 6c 61 72 61 74 69 6f  Y .** declaratio
dd90: 6e 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65 73  n for the corres
dda0: 70 6f 6e 64 69 6e 67 20 69 6d 70 6f 73 74 65 72  ponding imposter
ddb0: 20 74 61 62 6c 65 2e 20 46 6f 72 20 65 78 61 6d   table. For exam
ddc0: 70 6c 65 2c 0a 2a 2a 20 69 66 20 74 68 65 20 69  ple,.** if the i
ddd0: 74 65 72 61 74 6f 72 20 70 6f 69 6e 74 73 20 74  terator points t
dde0: 6f 20 61 20 74 61 62 6c 65 20 63 72 65 61 74 65  o a table create
ddf0: 64 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52  d as:.**.**   CR
de00: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
de10: 20 62 2c 20 63 2c 20 50 52 49 4d 41 52 59 20 4b   b, c, PRIMARY K
de20: 45 59 28 62 2c 20 61 20 44 45 53 43 29 29 20 57  EY(b, a DESC)) W
de30: 49 54 48 4f 55 54 20 52 4f 57 49 44 0a 2a 2a 0a  ITHOUT ROWID.**.
de40: 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
de50: 20 72 65 74 75 72 6e 73 3a 0a 2a 2a 0a 2a 2a 20   returns:.**.** 
de60: 20 20 50 52 49 4d 41 52 59 20 4b 45 59 28 22 62    PRIMARY KEY("b
de70: 22 2c 20 22 61 22 20 44 45 53 43 29 0a 2a 2f 0a  ", "a" DESC).*/.
de80: 73 74 61 74 69 63 20 63 68 61 72 20 2a 72 62 75  static char *rbu
de90: 57 69 74 68 6f 75 74 52 6f 77 69 64 50 4b 28 73  WithoutRowidPK(s
dea0: 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 52 62  qlite3rbu *p, Rb
deb0: 75 4f 62 6a 49 74 65 72 20 2a 70 49 74 65 72 29  uObjIter *pIter)
dec0: 7b 0a 20 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b  {.  char *z = 0;
ded0: 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72  .  assert( pIter
dee0: 2d 3e 7a 49 64 78 3d 3d 30 20 29 3b 0a 20 20 69  ->zIdx==0 );.  i
def0: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
df00: 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  _OK ){.    const
df10: 20 63 68 61 72 20 2a 7a 53 65 70 20 3d 20 22 50   char *zSep = "P
df20: 52 49 4d 41 52 59 20 4b 45 59 28 22 3b 0a 20 20  RIMARY KEY(";.  
df30: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
df40: 70 58 4c 69 73 74 20 3d 20 30 3b 20 20 20 20 20  pXList = 0;     
df50: 2f 2a 20 50 52 41 47 4d 41 20 69 6e 64 65 78 5f  /* PRAGMA index_
df60: 6c 69 73 74 20 3d 20 28 70 49 74 65 72 2d 3e 7a  list = (pIter->z
df70: 54 62 6c 29 20 2a 2f 0a 20 20 20 20 73 71 6c 69  Tbl) */.    sqli
df80: 74 65 33 5f 73 74 6d 74 20 2a 70 58 49 6e 66 6f  te3_stmt *pXInfo
df90: 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 50 52 41   = 0;     /* PRA
dfa0: 47 4d 41 20 69 6e 64 65 78 5f 78 69 6e 66 6f 20  GMA index_xinfo 
dfb0: 3d 20 3c 70 6b 2d 69 6e 64 65 78 3e 20 2a 2f 0a  = <pk-index> */.
dfc0: 20 20 20 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20     .    p->rc = 
dfd0: 70 72 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f  prepareFreeAndCo
dfe0: 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62  llectError(p->db
dff0: 4d 61 69 6e 2c 20 26 70 58 4c 69 73 74 2c 20 26  Main, &pXList, &
e000: 70 2d 3e 7a 45 72 72 6d 73 67 2c 0a 20 20 20 20  p->zErrmsg,.    
e010: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69      sqlite3_mpri
e020: 6e 74 66 28 22 50 52 41 47 4d 41 20 6d 61 69 6e  ntf("PRAGMA main
e030: 2e 69 6e 64 65 78 5f 6c 69 73 74 20 3d 20 25 51  .index_list = %Q
e040: 22 2c 20 70 49 74 65 72 2d 3e 7a 54 62 6c 29 0a  ", pIter->zTbl).
e050: 20 20 20 20 29 3b 0a 20 20 20 20 77 68 69 6c 65      );.    while
e060: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
e070: 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57  OK && SQLITE_ROW
e080: 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ==sqlite3_step(p
e090: 58 4c 69 73 74 29 20 29 7b 0a 20 20 20 20 20 20  XList) ){.      
e0a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69  const char *zOri
e0b0: 67 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  g = (const char*
e0c0: 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
e0d0: 74 65 78 74 28 70 58 4c 69 73 74 2c 33 29 3b 0a  text(pXList,3);.
e0e0: 20 20 20 20 20 20 69 66 28 20 7a 4f 72 69 67 20        if( zOrig 
e0f0: 26 26 20 73 74 72 63 6d 70 28 7a 4f 72 69 67 2c  && strcmp(zOrig,
e100: 20 22 70 6b 22 29 3d 3d 30 20 29 7b 0a 20 20 20   "pk")==0 ){.   
e110: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
e120: 2a 7a 49 64 78 20 3d 20 28 63 6f 6e 73 74 20 63  *zIdx = (const c
e130: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
e140: 75 6d 6e 5f 74 65 78 74 28 70 58 4c 69 73 74 2c  umn_text(pXList,
e150: 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
e160: 7a 49 64 78 20 29 7b 0a 20 20 20 20 20 20 20 20  zIdx ){.        
e170: 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72    p->rc = prepar
e180: 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45  eFreeAndCollectE
e190: 72 72 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20  rror(p->dbMain, 
e1a0: 26 70 58 49 6e 66 6f 2c 20 26 70 2d 3e 7a 45 72  &pXInfo, &p->zEr
e1b0: 72 6d 73 67 2c 0a 20 20 20 20 20 20 20 20 20 20  rmsg,.          
e1c0: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69      sqlite3_mpri
e1d0: 6e 74 66 28 22 50 52 41 47 4d 41 20 6d 61 69 6e  ntf("PRAGMA main
e1e0: 2e 69 6e 64 65 78 5f 78 69 6e 66 6f 20 3d 20 25  .index_xinfo = %
e1f0: 51 22 2c 20 7a 49 64 78 29 0a 20 20 20 20 20 20  Q", zIdx).      
e200: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7d      );.        }
e210: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
e220: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
e230: 20 20 72 62 75 46 69 6e 61 6c 69 7a 65 28 70 2c    rbuFinalize(p,
e240: 20 70 58 4c 69 73 74 29 3b 0a 0a 20 20 20 20 77   pXList);..    w
e250: 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  hile( p->rc==SQL
e260: 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45  ITE_OK && SQLITE
e270: 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74  _ROW==sqlite3_st
e280: 65 70 28 70 58 49 6e 66 6f 29 20 29 7b 0a 20 20  ep(pXInfo) ){.  
e290: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
e2a0: 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 58 49 6e 66  column_int(pXInf
e2b0: 6f 2c 20 35 29 20 29 7b 0a 20 20 20 20 20 20 20  o, 5) ){.       
e2c0: 20 2f 2a 20 69 6e 74 20 69 43 69 64 20 3d 20 73   /* int iCid = s
e2d0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
e2e0: 74 28 70 58 49 6e 66 6f 2c 20 30 29 3b 20 2a 2f  t(pXInfo, 0); */
e2f0: 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
e300: 68 61 72 20 2a 7a 43 6f 6c 20 3d 20 28 63 6f 6e  har *zCol = (con
e310: 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
e320: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 58 49  _column_text(pXI
e330: 6e 66 6f 2c 20 32 29 3b 0a 20 20 20 20 20 20 20  nfo, 2);.       
e340: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 65   const char *zDe
e350: 73 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  sc = sqlite3_col
e360: 75 6d 6e 5f 69 6e 74 28 70 58 49 6e 66 6f 2c 20  umn_int(pXInfo, 
e370: 33 29 20 3f 20 22 20 44 45 53 43 22 20 3a 20 22  3) ? " DESC" : "
e380: 22 3b 0a 20 20 20 20 20 20 20 20 7a 20 3d 20 72  ";.        z = r
e390: 62 75 4d 50 72 69 6e 74 66 28 70 2c 20 22 25 7a  buMPrintf(p, "%z
e3a0: 25 73 5c 22 25 77 5c 22 25 73 22 2c 20 7a 2c 20  %s\"%w\"%s", z, 
e3b0: 7a 53 65 70 2c 20 7a 43 6f 6c 2c 20 7a 44 65 73  zSep, zCol, zDes
e3c0: 63 29 3b 0a 20 20 20 20 20 20 20 20 7a 53 65 70  c);.        zSep
e3d0: 20 3d 20 22 2c 20 22 3b 0a 20 20 20 20 20 20 7d   = ", ";.      }
e3e0: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 20 3d 20 72  .    }.    z = r
e3f0: 62 75 4d 50 72 69 6e 74 66 28 70 2c 20 22 25 7a  buMPrintf(p, "%z
e400: 29 22 2c 20 7a 29 3b 0a 20 20 20 20 72 62 75 46  )", z);.    rbuF
e410: 69 6e 61 6c 69 7a 65 28 70 2c 20 70 58 49 6e 66  inalize(p, pXInf
e420: 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  o);.  }.  return
e430: 20 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   z;.}../*.** Thi
e440: 73 20 66 75 6e 63 74 69 6f 6e 20 63 72 65 61 74  s function creat
e450: 65 73 20 74 68 65 20 73 65 63 6f 6e 64 20 69 6d  es the second im
e460: 70 6f 73 74 65 72 20 74 61 62 6c 65 20 75 73 65  poster table use
e470: 64 20 77 68 65 6e 20 77 72 69 74 69 6e 67 20 74  d when writing t
e480: 6f 0a 2a 2a 20 61 20 74 61 62 6c 65 20 62 2d 74  o.** a table b-t
e490: 72 65 65 20 77 68 65 72 65 20 74 68 65 20 74 61  ree where the ta
e4a0: 62 6c 65 20 68 61 73 20 61 6e 20 65 78 74 65 72  ble has an exter
e4b0: 6e 61 6c 20 70 72 69 6d 61 72 79 20 6b 65 79 2e  nal primary key.
e4c0: 20 49 66 20 74 68 65 0a 2a 2a 20 69 74 65 72 61   If the.** itera
e4d0: 74 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68  tor passed as th
e4e0: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
e4f0: 74 20 64 6f 65 73 20 6e 6f 74 20 63 75 72 72 65  t does not curre
e500: 6e 74 6c 79 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a  ntly point to.**
e510: 20 61 20 74 61 62 6c 65 20 28 6e 6f 74 20 69 6e   a table (not in
e520: 64 65 78 29 20 77 69 74 68 20 61 6e 20 65 78 74  dex) with an ext
e530: 65 72 6e 61 6c 20 70 72 69 6d 61 72 79 20 6b 65  ernal primary ke
e540: 79 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  y, this function
e550: 20 69 73 20 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20   is a.** no-op. 
e560: 0a 2a 2a 0a 2a 2a 20 41 73 73 75 6d 69 6e 67 20  .**.** Assuming 
e570: 74 68 65 20 69 74 65 72 61 74 6f 72 20 64 6f 65  the iterator doe
e580: 73 20 70 6f 69 6e 74 20 74 6f 20 61 20 74 61 62  s point to a tab
e590: 6c 65 20 77 69 74 68 20 61 6e 20 65 78 74 65 72  le with an exter
e5a0: 6e 61 6c 20 50 4b 2c 20 74 68 69 73 0a 2a 2a 20  nal PK, this.** 
e5b0: 66 75 6e 63 74 69 6f 6e 20 63 72 65 61 74 65 73  function creates
e5c0: 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44   a WITHOUT ROWID
e5d0: 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 20   imposter table 
e5e0: 6e 61 6d 65 64 20 22 72 62 75 5f 69 6d 70 6f 73  named "rbu_impos
e5f0: 74 65 72 32 22 0a 2a 2a 20 75 73 65 64 20 74 6f  ter2".** used to
e600: 20 61 63 63 65 73 73 20 74 68 61 74 20 50 4b 20   access that PK 
e610: 69 6e 64 65 78 2e 20 46 6f 72 20 65 78 61 6d 70  index. For examp
e620: 6c 65 2c 20 69 66 20 74 68 65 20 74 61 72 67 65  le, if the targe
e630: 74 20 74 61 62 6c 65 20 69 73 0a 2a 2a 20 64 65  t table is.** de
e640: 63 6c 61 72 65 64 20 61 73 20 66 6f 6c 6c 6f 77  clared as follow
e650: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54  s:.**.**   CREAT
e660: 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 20  E TABLE t1(a, b 
e670: 54 45 58 54 2c 20 63 20 52 45 41 4c 2c 20 50 52  TEXT, c REAL, PR
e680: 49 4d 41 52 59 20 4b 45 59 28 62 2c 20 63 29 29  IMARY KEY(b, c))
e690: 3b 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 74 68 65  ;.**.** then the
e6a0: 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 20   imposter table 
e6b0: 73 63 68 65 6d 61 20 69 73 3a 0a 2a 2a 0a 2a 2a  schema is:.**.**
e6c0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
e6d0: 72 62 75 5f 69 6d 70 6f 73 74 65 72 32 28 63 31  rbu_imposter2(c1
e6e0: 20 54 45 58 54 2c 20 63 32 20 52 45 41 4c 2c 20   TEXT, c2 REAL, 
e6f0: 69 64 20 49 4e 54 45 47 45 52 29 20 57 49 54 48  id INTEGER) WITH
e700: 4f 55 54 20 52 4f 57 49 44 3b 0a 2a 2a 0a 2a 2f  OUT ROWID;.**.*/
e710: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75  .static void rbu
e720: 43 72 65 61 74 65 49 6d 70 6f 73 74 65 72 54 61  CreateImposterTa
e730: 62 6c 65 32 28 73 71 6c 69 74 65 33 72 62 75 20  ble2(sqlite3rbu 
e740: 2a 70 2c 20 52 62 75 4f 62 6a 49 74 65 72 20 2a  *p, RbuObjIter *
e750: 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70 2d  pIter){.  if( p-
e760: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
e770: 26 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d  & pIter->eType==
e780: 52 42 55 5f 50 4b 5f 45 58 54 45 52 4e 41 4c 20  RBU_PK_EXTERNAL 
e790: 29 7b 0a 20 20 20 20 69 6e 74 20 74 6e 75 6d 20  ){.    int tnum 
e7a0: 3d 20 70 49 74 65 72 2d 3e 69 50 6b 54 6e 75 6d  = pIter->iPkTnum
e7b0: 3b 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67  ;    /* Root pag
e7c0: 65 20 6f 66 20 50 4b 20 69 6e 64 65 78 20 2a 2f  e of PK index */
e7d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  .    sqlite3_stm
e7e0: 74 20 2a 70 51 75 65 72 79 20 3d 20 30 3b 20 20  t *pQuery = 0;  
e7f0: 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 6e 61 6d     /* SELECT nam
e800: 65 20 2e 2e 2e 20 57 48 45 52 45 20 72 6f 6f 74  e ... WHERE root
e810: 70 61 67 65 20 3d 20 24 74 6e 75 6d 20 2a 2f 0a  page = $tnum */.
e820: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
e830: 7a 49 64 78 20 3d 20 30 3b 20 20 20 20 20 20 20  zIdx = 0;       
e840: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 50 4b 20    /* Name of PK 
e850: 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 73 71 6c  index */.    sql
e860: 69 74 65 33 5f 73 74 6d 74 20 2a 70 58 49 6e 66  ite3_stmt *pXInf
e870: 6f 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 50 52  o = 0;     /* PR
e880: 41 47 4d 41 20 6d 61 69 6e 2e 69 6e 64 65 78 5f  AGMA main.index_
e890: 78 69 6e 66 6f 20 3d 20 24 7a 49 64 78 20 2a 2f  xinfo = $zIdx */
e8a0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
e8b0: 2a 7a 43 6f 6d 6d 61 20 3d 20 22 22 3b 0a 20 20  *zComma = "";.  
e8c0: 20 20 63 68 61 72 20 2a 7a 43 6f 6c 73 20 3d 20    char *zCols = 
e8d0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
e8e0: 2f 2a 20 55 73 65 64 20 74 6f 20 62 75 69 6c 64  /* Used to build
e8f0: 20 75 70 20 6c 69 73 74 20 6f 66 20 74 61 62 6c   up list of tabl
e900: 65 20 63 6f 6c 73 20 2a 2f 0a 20 20 20 20 63 68  e cols */.    ch
e910: 61 72 20 2a 7a 50 6b 20 3d 20 30 3b 20 20 20 20  ar *zPk = 0;    
e920: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
e930: 73 65 64 20 74 6f 20 62 75 69 6c 64 20 75 70 20  sed to build up 
e940: 74 61 62 6c 65 20 50 4b 20 64 65 63 6c 61 72 61  table PK declara
e950: 74 69 6f 6e 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  tion */..    /* 
e960: 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 6e  Figure out the n
e970: 61 6d 65 20 6f 66 20 74 68 65 20 70 72 69 6d 61  ame of the prima
e980: 72 79 20 6b 65 79 20 69 6e 64 65 78 20 66 6f 72  ry key index for
e990: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62   the current tab
e9a0: 6c 65 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20  le..    ** This 
e9b0: 69 73 20 6e 65 65 64 65 64 20 66 6f 72 20 74 68  is needed for th
e9c0: 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 22 50  e argument to "P
e9d0: 52 41 47 4d 41 20 69 6e 64 65 78 5f 78 69 6e 66  RAGMA index_xinf
e9e0: 6f 22 2e 20 53 65 74 0a 20 20 20 20 2a 2a 20 7a  o". Set.    ** z
e9f0: 49 64 78 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  Idx to point to 
ea00: 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64  a nul-terminated
ea10: 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69   string containi
ea20: 6e 67 20 74 68 69 73 20 6e 61 6d 65 2e 20 2a 2f  ng this name. */
ea30: 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 72 65  .    p->rc = pre
ea40: 70 61 72 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72  pareAndCollectEr
ea50: 72 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 26  ror(p->dbMain, &
ea60: 70 51 75 65 72 79 2c 20 26 70 2d 3e 7a 45 72 72  pQuery, &p->zErr
ea70: 6d 73 67 2c 20 0a 20 20 20 20 20 20 20 20 22 53  msg, .        "S
ea80: 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20  ELECT name FROM 
ea90: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 57 48  sqlite_master WH
eaa0: 45 52 45 20 72 6f 6f 74 70 61 67 65 20 3d 20 3f  ERE rootpage = ?
eab0: 22 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  ".    );.    if(
eac0: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
ead0: 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
eae0: 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 51 75 65  e3_bind_int(pQue
eaf0: 72 79 2c 20 31 2c 20 74 6e 75 6d 29 3b 0a 20 20  ry, 1, tnum);.  
eb00: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52      if( SQLITE_R
eb10: 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
eb20: 28 70 51 75 65 72 79 29 20 29 7b 0a 20 20 20 20  (pQuery) ){.    
eb30: 20 20 20 20 7a 49 64 78 20 3d 20 28 63 6f 6e 73      zIdx = (cons
eb40: 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
eb50: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 51 75 65  column_text(pQue
eb60: 72 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ry, 0);.      }.
eb70: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 49      }.    if( zI
eb80: 64 78 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72  dx ){.      p->r
eb90: 63 20 3d 20 70 72 65 70 61 72 65 46 72 65 65 41  c = prepareFreeA
eba0: 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70  ndCollectError(p
ebb0: 2d 3e 64 62 4d 61 69 6e 2c 20 26 70 58 49 6e 66  ->dbMain, &pXInf
ebc0: 6f 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 0a  o, &p->zErrmsg,.
ebd0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
ebe0: 33 5f 6d 70 72 69 6e 74 66 28 22 50 52 41 47 4d  3_mprintf("PRAGM
ebf0: 41 20 6d 61 69 6e 2e 69 6e 64 65 78 5f 78 69 6e  A main.index_xin
ec00: 66 6f 20 3d 20 25 51 22 2c 20 7a 49 64 78 29 0a  fo = %Q", zIdx).
ec10: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
ec20: 20 20 20 72 62 75 46 69 6e 61 6c 69 7a 65 28 70     rbuFinalize(p
ec30: 2c 20 70 51 75 65 72 79 29 3b 0a 0a 20 20 20 20  , pQuery);..    
ec40: 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51  while( p->rc==SQ
ec50: 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54  LITE_OK && SQLIT
ec60: 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73  E_ROW==sqlite3_s
ec70: 74 65 70 28 70 58 49 6e 66 6f 29 20 29 7b 0a 20  tep(pXInfo) ){. 
ec80: 20 20 20 20 20 69 6e 74 20 62 4b 65 79 20 3d 20       int bKey = 
ec90: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
eca0: 6e 74 28 70 58 49 6e 66 6f 2c 20 35 29 3b 0a 20  nt(pXInfo, 5);. 
ecb0: 20 20 20 20 20 69 66 28 20 62 4b 65 79 20 29 7b       if( bKey ){
ecc0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 69  .        int iCi
ecd0: 64 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  d = sqlite3_colu
ece0: 6d 6e 5f 69 6e 74 28 70 58 49 6e 66 6f 2c 20 31  mn_int(pXInfo, 1
ecf0: 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 62  );.        int b
ed00: 44 65 73 63 20 3d 20 73 71 6c 69 74 65 33 5f 63  Desc = sqlite3_c
ed10: 6f 6c 75 6d 6e 5f 69 6e 74 28 70 58 49 6e 66 6f  olumn_int(pXInfo
ed20: 2c 20 33 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  , 3);.        co
ed30: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 61  nst char *zColla
ed40: 74 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  te = (const char
ed50: 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
ed60: 5f 74 65 78 74 28 70 58 49 6e 66 6f 2c 20 34 29  _text(pXInfo, 4)
ed70: 3b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 73 20  ;.        zCols 
ed80: 3d 20 72 62 75 4d 50 72 69 6e 74 66 28 70 2c 20  = rbuMPrintf(p, 
ed90: 22 25 7a 25 73 63 25 64 20 25 73 20 43 4f 4c 4c  "%z%sc%d %s COLL
eda0: 41 54 45 20 25 73 22 2c 20 7a 43 6f 6c 73 2c 20  ATE %s", zCols, 
edb0: 7a 43 6f 6d 6d 61 2c 20 0a 20 20 20 20 20 20 20  zComma, .       
edc0: 20 20 20 20 20 69 43 69 64 2c 20 70 49 74 65 72       iCid, pIter
edd0: 2d 3e 61 7a 54 62 6c 54 79 70 65 5b 69 43 69 64  ->azTblType[iCid
ede0: 5d 2c 20 7a 43 6f 6c 6c 61 74 65 0a 20 20 20 20  ], zCollate.    
edf0: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7a      );.        z
ee00: 50 6b 20 3d 20 72 62 75 4d 50 72 69 6e 74 66 28  Pk = rbuMPrintf(
ee10: 70 2c 20 22 25 7a 25 73 63 25 64 25 73 22 2c 20  p, "%z%sc%d%s", 
ee20: 7a 50 6b 2c 20 7a 43 6f 6d 6d 61 2c 20 69 43 69  zPk, zComma, iCi
ee30: 64 2c 20 62 44 65 73 63 3f 22 20 44 45 53 43 22  d, bDesc?" DESC"
ee40: 3a 22 22 29 3b 0a 20 20 20 20 20 20 20 20 7a 43  :"");.        zC
ee50: 6f 6d 6d 61 20 3d 20 22 2c 20 22 3b 0a 20 20 20  omma = ", ";.   
ee60: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a     }.    }.    z
ee70: 43 6f 6c 73 20 3d 20 72 62 75 4d 50 72 69 6e 74  Cols = rbuMPrint
ee80: 66 28 70 2c 20 22 25 7a 2c 20 69 64 20 49 4e 54  f(p, "%z, id INT
ee90: 45 47 45 52 22 2c 20 7a 43 6f 6c 73 29 3b 0a 20  EGER", zCols);. 
eea0: 20 20 20 72 62 75 46 69 6e 61 6c 69 7a 65 28 70     rbuFinalize(p
eeb0: 2c 20 70 58 49 6e 66 6f 29 3b 0a 0a 20 20 20 20  , pXInfo);..    
eec0: 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
eed0: 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
eee0: 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52 2c 20 70  CTRL_IMPOSTER, p
eef0: 2d 3e 64 62 4d 61 69 6e 2c 20 22 6d 61 69 6e 22  ->dbMain, "main"
ef00: 2c 20 31 2c 20 74 6e 75 6d 29 3b 0a 20 20 20 20  , 1, tnum);.    
ef10: 72 62 75 4d 50 72 69 6e 74 66 45 78 65 63 28 70  rbuMPrintfExec(p
ef20: 2c 20 70 2d 3e 64 62 4d 61 69 6e 2c 0a 20 20 20  , p->dbMain,.   
ef30: 20 20 20 20 20 22 43 52 45 41 54 45 20 54 41 42       "CREATE TAB
ef40: 4c 45 20 72 62 75 5f 69 6d 70 6f 73 74 65 72 32  LE rbu_imposter2
ef50: 28 25 7a 2c 20 50 52 49 4d 41 52 59 20 4b 45 59  (%z, PRIMARY KEY
ef60: 28 25 7a 29 29 20 57 49 54 48 4f 55 54 20 52 4f  (%z)) WITHOUT RO
ef70: 57 49 44 22 2c 20 0a 20 20 20 20 20 20 20 20 7a  WID", .        z
ef80: 43 6f 6c 73 2c 20 7a 50 6b 0a 20 20 20 20 29 3b  Cols, zPk.    );
ef90: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73  .    sqlite3_tes
efa0: 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
efb0: 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54  _TESTCTRL_IMPOST
efc0: 45 52 2c 20 70 2d 3e 64 62 4d 61 69 6e 2c 20 22  ER, p->dbMain, "
efd0: 6d 61 69 6e 22 2c 20 30 2c 20 30 29 3b 0a 20 20  main", 0, 0);.  
efe0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 6e  }.}../*.** If an
eff0: 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61   error has alrea
f000: 64 79 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e  dy occurred when
f010: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
f020: 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 0a 2a 2a  s called, it .**
f030: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 74   immediately ret
f040: 75 72 6e 73 20 7a 65 72 6f 20 28 77 69 74 68 6f  urns zero (witho
f050: 75 74 20 64 6f 69 6e 67 20 61 6e 79 20 77 6f 72  ut doing any wor
f060: 6b 29 2e 20 4f 72 2c 20 69 66 20 61 6e 20 65 72  k). Or, if an er
f070: 72 6f 72 0a 2a 2a 20 6f 63 63 75 72 73 20 64 75  ror.** occurs du
f080: 72 69 6e 67 20 74 68 65 20 65 78 65 63 75 74 69  ring the executi
f090: 6f 6e 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  on of this funct
f0a0: 69 6f 6e 2c 20 69 74 20 73 65 74 73 20 74 68 65  ion, it sets the
f0b0: 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 69   error code.** i
f0c0: 6e 20 74 68 65 20 73 71 6c 69 74 65 33 72 62 75  n the sqlite3rbu
f0d0: 20 6f 62 6a 65 63 74 20 69 6e 64 69 63 61 74 65   object indicate
f0e0: 64 20 62 79 20 74 68 65 20 66 69 72 73 74 20 61  d by the first a
f0f0: 72 67 75 6d 65 6e 74 20 61 6e 64 20 72 65 74 75  rgument and retu
f100: 72 6e 73 0a 2a 2a 20 7a 65 72 6f 2e 0a 2a 2a 0a  rns.** zero..**.
f110: 2a 2a 20 54 68 65 20 69 74 65 72 61 74 6f 72 20  ** The iterator 
f120: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
f130: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
f140: 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 70   guaranteed to p
f150: 6f 69 6e 74 20 74 6f 0a 2a 2a 20 61 20 74 61 62  oint to.** a tab
f160: 6c 65 20 28 6e 6f 74 20 61 6e 20 69 6e 64 65 78  le (not an index
f170: 29 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  ) when this func
f180: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 20  tion is called. 
f190: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  This function.**
f1a0: 20 61 74 74 65 6d 70 74 73 20 74 6f 20 63 72 65   attempts to cre
f1b0: 61 74 65 20 61 6e 79 20 69 6d 70 6f 73 74 65 72  ate any imposter
f1c0: 20 74 61 62 6c 65 20 72 65 71 75 69 72 65 64 20   table required 
f1d0: 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  to write to the 
f1e0: 6d 61 69 6e 0a 2a 2a 20 74 61 62 6c 65 20 62 2d  main.** table b-
f1f0: 74 72 65 65 20 6f 66 20 74 68 65 20 74 61 62 6c  tree of the tabl
f200: 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  e before returni
f210: 6e 67 2e 20 4e 6f 6e 2d 7a 65 72 6f 20 69 73 20  ng. Non-zero is 
f220: 72 65 74 75 72 6e 65 64 20 69 66 0a 2a 2a 20 61  returned if.** a
f230: 6e 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65  n imposter table
f240: 20 61 72 65 20 63 72 65 61 74 65 64 2c 20 6f 72   are created, or
f250: 20 7a 65 72 6f 20 6f 74 68 65 72 77 69 73 65 2e   zero otherwise.
f260: 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6d 70 6f 73 74  .**.** An impost
f270: 65 72 20 74 61 62 6c 65 20 69 73 20 72 65 71 75  er table is requ
f280: 69 72 65 64 20 69 6e 20 61 6c 6c 20 63 61 73 65  ired in all case
f290: 73 20 65 78 63 65 70 74 20 52 42 55 5f 50 4b 5f  s except RBU_PK_
f2a0: 56 54 41 42 2e 20 4f 6e 6c 79 0a 2a 2a 20 76 69  VTAB. Only.** vi
f2b0: 72 74 75 61 6c 20 74 61 62 6c 65 73 20 61 72 65  rtual tables are
f2c0: 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 72 65   written to dire
f2d0: 63 74 6c 79 2e 20 54 68 65 20 69 6d 70 6f 73 74  ctly. The impost
f2e0: 65 72 20 74 61 62 6c 65 20 68 61 73 20 74 68 65  er table has the
f2f0: 20 0a 2a 2a 20 73 61 6d 65 20 73 63 68 65 6d 61   .** same schema
f300: 20 61 73 20 74 68 65 20 61 63 74 75 61 6c 20 74   as the actual t
f310: 61 72 67 65 74 20 74 61 62 6c 65 20 28 6c 65 73  arget table (les
f320: 73 20 61 6e 79 20 55 4e 49 51 55 45 20 63 6f 6e  s any UNIQUE con
f330: 73 74 72 61 69 6e 74 73 29 2e 20 0a 2a 2a 20 4d  straints). .** M
f340: 6f 72 65 20 70 72 65 63 69 73 65 6c 79 2c 20 74  ore precisely, t
f350: 68 65 20 22 73 61 6d 65 20 73 63 68 65 6d 61 22  he "same schema"
f360: 20 6d 65 61 6e 73 20 74 68 65 20 73 61 6d 65 20   means the same 
f370: 63 6f 6c 75 6d 6e 73 2c 20 74 79 70 65 73 2c 20  columns, types, 
f380: 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  .** collation se
f390: 71 75 65 6e 63 65 73 2e 20 46 6f 72 20 74 61 62  quences. For tab
f3a0: 6c 65 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20  les that do not 
f3b0: 68 61 76 65 20 61 6e 20 65 78 74 65 72 6e 61 6c  have an external
f3c0: 20 50 52 49 4d 41 52 59 0a 2a 2a 20 4b 45 59 2c   PRIMARY.** KEY,
f3d0: 20 69 74 20 61 6c 73 6f 20 6d 65 61 6e 73 20 74   it also means t
f3e0: 68 65 20 73 61 6d 65 20 50 52 49 4d 41 52 59 20  he same PRIMARY 
f3f0: 4b 45 59 20 64 65 63 6c 61 72 61 74 69 6f 6e 2e  KEY declaration.
f400: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
f410: 72 62 75 43 72 65 61 74 65 49 6d 70 6f 73 74 65  rbuCreateImposte
f420: 72 54 61 62 6c 65 28 73 71 6c 69 74 65 33 72 62  rTable(sqlite3rb
f430: 75 20 2a 70 2c 20 52 62 75 4f 62 6a 49 74 65 72  u *p, RbuObjIter
f440: 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20   *pIter){.  if( 
f450: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
f460: 20 26 26 20 70 49 74 65 72 2d 3e 65 54 79 70 65   && pIter->eType
f470: 21 3d 52 42 55 5f 50 4b 5f 56 54 41 42 20 29 7b  !=RBU_PK_VTAB ){
f480: 0a 20 20 20 20 69 6e 74 20 74 6e 75 6d 20 3d 20  .    int tnum = 
f490: 70 49 74 65 72 2d 3e 69 54 6e 75 6d 3b 0a 20 20  pIter->iTnum;.  
f4a0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
f4b0: 6f 6d 6d 61 20 3d 20 22 22 3b 0a 20 20 20 20 63  omma = "";.    c
f4c0: 68 61 72 20 2a 7a 53 71 6c 20 3d 20 30 3b 0a 20  har *zSql = 0;. 
f4d0: 20 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20     int iCol;.   
f4e0: 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
f4f0: 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
f500: 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52 2c 20  TCTRL_IMPOSTER, 
f510: 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 6d 61 69 6e  p->dbMain, "main
f520: 22 2c 20 30 2c 20 31 29 3b 0a 0a 20 20 20 20 66  ", 0, 1);..    f
f530: 6f 72 28 69 43 6f 6c 3d 30 3b 20 70 2d 3e 72 63  or(iCol=0; p->rc
f540: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
f550: 43 6f 6c 3c 70 49 74 65 72 2d 3e 6e 54 62 6c 43  Col<pIter->nTblC
f560: 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ol; iCol++){.   
f570: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
f580: 50 6b 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 63  Pk = "";.      c
f590: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 20  onst char *zCol 
f5a0: 3d 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f  = pIter->azTblCo
f5b0: 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 20 20 63  l[iCol];.      c
f5c0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  onst char *zColl
f5d0: 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 70 2d 3e   = 0;..      p->
f5e0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 74 61 62  rc = sqlite3_tab
f5f0: 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61  le_column_metada
f600: 74 61 28 0a 20 20 20 20 20 20 20 20 20 20 70 2d  ta(.          p-
f610: 3e 64 62 4d 61 69 6e 2c 20 22 6d 61 69 6e 22 2c  >dbMain, "main",
f620: 20 70 49 74 65 72 2d 3e 7a 54 62 6c 2c 20 7a 43   pIter->zTbl, zC
f630: 6f 6c 2c 20 30 2c 20 26 7a 43 6f 6c 6c 2c 20 30  ol, 0, &zColl, 0
f640: 2c 20 30 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a  , 0, 0.      );.
f650: 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72  .      if( pIter
f660: 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f  ->eType==RBU_PK_
f670: 49 50 4b 20 26 26 20 70 49 74 65 72 2d 3e 61 62  IPK && pIter->ab
f680: 54 62 6c 50 6b 5b 69 43 6f 6c 5d 20 29 7b 0a 20  TblPk[iCol] ){. 
f690: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
f6a0: 20 74 61 72 67 65 74 20 74 61 62 6c 65 20 63 6f   target table co
f6b0: 6c 75 6d 6e 20 69 73 20 61 6e 20 22 49 4e 54 45  lumn is an "INTE
f6c0: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 22  GER PRIMARY KEY"
f6d0: 2c 20 61 64 64 0a 20 20 20 20 20 20 20 20 2a 2a  , add.        **
f6e0: 20 22 50 52 49 4d 41 52 59 20 4b 45 59 22 20 74   "PRIMARY KEY" t
f6f0: 6f 20 74 68 65 20 69 6d 70 6f 73 74 65 72 20 74  o the imposter t
f700: 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 64 65 63 6c  able column decl
f710: 61 72 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20  aration. */.    
f720: 20 20 20 20 7a 50 6b 20 3d 20 22 50 52 49 4d 41      zPk = "PRIMA
f730: 52 59 20 4b 45 59 20 22 3b 0a 20 20 20 20 20 20  RY KEY ";.      
f740: 7d 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 72  }.      zSql = r
f750: 62 75 4d 50 72 69 6e 74 66 28 70 2c 20 22 25 7a  buMPrintf(p, "%z
f760: 25 73 5c 22 25 77 5c 22 20 25 73 20 25 73 43 4f  %s\"%w\" %s %sCO
f770: 4c 4c 41 54 45 20 25 73 25 73 22 2c 20 0a 20 20  LLATE %s%s", .  
f780: 20 20 20 20 20 20 20 20 7a 53 71 6c 2c 20 7a 43          zSql, zC
f790: 6f 6d 6d 61 2c 20 7a 43 6f 6c 2c 20 70 49 74 65  omma, zCol, pIte
f7a0: 72 2d 3e 61 7a 54 62 6c 54 79 70 65 5b 69 43 6f  r->azTblType[iCo
f7b0: 6c 5d 2c 20 7a 50 6b 2c 20 7a 43 6f 6c 6c 2c 0a  l], zPk, zColl,.
f7c0: 20 20 20 20 20 20 20 20 20 20 28 70 49 74 65 72            (pIter
f7d0: 2d 3e 61 62 4e 6f 74 4e 75 6c 6c 5b 69 43 6f 6c  ->abNotNull[iCol
f7e0: 5d 20 3f 20 22 20 4e 4f 54 20 4e 55 4c 4c 22 20  ] ? " NOT NULL" 
f7f0: 3a 20 22 22 29 0a 20 20 20 20 20 20 29 3b 0a 20  : "").      );. 
f800: 20 20 20 20 20 7a 43 6f 6d 6d 61 20 3d 20 22 2c       zComma = ",
f810: 20 22 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69   ";.    }..    i
f820: 66 28 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d  f( pIter->eType=
f830: 3d 52 42 55 5f 50 4b 5f 57 49 54 48 4f 55 54 5f  =RBU_PK_WITHOUT_
f840: 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 20 20 63  ROWID ){.      c
f850: 68 61 72 20 2a 7a 50 6b 20 3d 20 72 62 75 57 69  har *zPk = rbuWi
f860: 74 68 6f 75 74 52 6f 77 69 64 50 4b 28 70 2c 20  thoutRowidPK(p, 
f870: 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 69 66  pIter);.      if
f880: 28 20 7a 50 6b 20 29 7b 0a 20 20 20 20 20 20 20  ( zPk ){.       
f890: 20 7a 53 71 6c 20 3d 20 72 62 75 4d 50 72 69 6e   zSql = rbuMPrin
f8a0: 74 66 28 70 2c 20 22 25 7a 2c 20 25 7a 22 2c 20  tf(p, "%z, %z", 
f8b0: 7a 53 71 6c 2c 20 7a 50 6b 29 3b 0a 20 20 20 20  zSql, zPk);.    
f8c0: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73    }.    }..    s
f8d0: 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
f8e0: 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
f8f0: 54 52 4c 5f 49 4d 50 4f 53 54 45 52 2c 20 70 2d  TRL_IMPOSTER, p-
f900: 3e 64 62 4d 61 69 6e 2c 20 22 6d 61 69 6e 22 2c  >dbMain, "main",
f910: 20 31 2c 20 74 6e 75 6d 29 3b 0a 20 20 20 20 72   1, tnum);.    r
f920: 62 75 4d 50 72 69 6e 74 66 45 78 65 63 28 70 2c  buMPrintfExec(p,
f930: 20 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 43 52 45   p->dbMain, "CRE
f940: 41 54 45 20 54 41 42 4c 45 20 5c 22 72 62 75 5f  ATE TABLE \"rbu_
f950: 69 6d 70 5f 25 77 5c 22 28 25 7a 29 25 73 22 2c  imp_%w\"(%z)%s",
f960: 20 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d   .        pIter-
f970: 3e 7a 54 62 6c 2c 20 7a 53 71 6c 2c 20 0a 20 20  >zTbl, zSql, .  
f980: 20 20 20 20 20 20 28 70 49 74 65 72 2d 3e 65 54        (pIter->eT
f990: 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 57 49 54 48  ype==RBU_PK_WITH
f9a0: 4f 55 54 5f 52 4f 57 49 44 20 3f 20 22 20 57 49  OUT_ROWID ? " WI
f9b0: 54 48 4f 55 54 20 52 4f 57 49 44 22 20 3a 20 22  THOUT ROWID" : "
f9c0: 22 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71  ").    );.    sq
f9d0: 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
f9e0: 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
f9f0: 52 4c 5f 49 4d 50 4f 53 54 45 52 2c 20 70 2d 3e  RL_IMPOSTER, p->
fa00: 64 62 4d 61 69 6e 2c 20 22 6d 61 69 6e 22 2c 20  dbMain, "main", 
fa10: 30 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  0, 0);.  }.}../*
fa20: 0a 2a 2a 20 50 72 65 70 61 72 65 20 61 20 73 74  .** Prepare a st
fa30: 61 74 65 6d 65 6e 74 20 75 73 65 64 20 74 6f 20  atement used to 
fa40: 69 6e 73 65 72 74 20 72 6f 77 73 20 69 6e 74 6f  insert rows into
fa50: 20 74 68 65 20 22 72 62 75 5f 74 6d 70 5f 78 78   the "rbu_tmp_xx
fa60: 78 22 20 74 61 62 6c 65 2e 0a 2a 2a 20 53 70 65  x" table..** Spe
fa70: 63 69 66 69 63 61 6c 6c 79 20 61 20 73 74 61 74  cifically a stat
fa80: 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 66 6f 72  ement of the for
fa90: 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 49 4e 53  m:.**.**     INS
faa0: 45 52 54 20 49 4e 54 4f 20 72 62 75 5f 74 6d 70  ERT INTO rbu_tmp
fab0: 5f 78 78 78 20 56 41 4c 55 45 53 28 3f 2c 20 3f  _xxx VALUES(?, ?
fac0: 2c 20 3f 20 2e 2e 2e 29 3b 0a 2a 2a 0a 2a 2a 20  , ? ...);.**.** 
fad0: 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 6f  The number of bo
fae0: 75 6e 64 20 76 61 72 69 61 62 6c 65 73 20 69 73  und variables is
faf0: 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6e 75   equal to the nu
fb00: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
fb10: 69 6e 0a 2a 2a 20 74 68 65 20 74 61 72 67 65 74  in.** the target
fb20: 20 74 61 62 6c 65 2c 20 70 6c 75 73 20 6f 6e 65   table, plus one
fb30: 20 28 66 6f 72 20 74 68 65 20 72 62 75 5f 63 6f   (for the rbu_co
fb40: 6e 74 72 6f 6c 20 63 6f 6c 75 6d 6e 29 2c 20 70  ntrol column), p
fb50: 6c 75 73 20 6f 6e 65 20 6d 6f 72 65 20 0a 2a 2a  lus one more .**
fb60: 20 28 66 6f 72 20 74 68 65 20 72 62 75 5f 72 6f   (for the rbu_ro
fb70: 77 69 64 20 63 6f 6c 75 6d 6e 29 20 69 66 20 74  wid column) if t
fb80: 68 65 20 74 61 72 67 65 74 20 74 61 62 6c 65 20  he target table 
fb90: 69 73 20 61 6e 20 69 6d 70 6c 69 63 69 74 20 49  is an implicit I
fba0: 50 4b 20 6f 72 20 0a 2a 2a 20 76 69 72 74 75 61  PK or .** virtua
fbb0: 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  l table..*/.stat
fbc0: 69 63 20 76 6f 69 64 20 72 62 75 4f 62 6a 49 74  ic void rbuObjIt
fbd0: 65 72 50 72 65 70 61 72 65 54 6d 70 49 6e 73 65  erPrepareTmpInse
fbe0: 72 74 28 0a 20 20 73 71 6c 69 74 65 33 72 62 75  rt(.  sqlite3rbu
fbf0: 20 2a 70 2c 20 0a 20 20 52 62 75 4f 62 6a 49 74   *p, .  RbuObjIt
fc00: 65 72 20 2a 70 49 74 65 72 2c 0a 20 20 63 6f 6e  er *pIter,.  con
fc10: 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 69 73  st char *zCollis
fc20: 74 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  t,.  const char 
fc30: 2a 7a 52 62 75 52 6f 77 69 64 0a 29 7b 0a 20 20  *zRbuRowid.){.  
fc40: 69 6e 74 20 62 52 62 75 52 6f 77 69 64 20 3d 20  int bRbuRowid = 
fc50: 28 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52  (pIter->eType==R
fc60: 42 55 5f 50 4b 5f 45 58 54 45 52 4e 41 4c 20 7c  BU_PK_EXTERNAL |
fc70: 7c 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d  | pIter->eType==
fc80: 52 42 55 5f 50 4b 5f 4e 4f 4e 45 29 3b 0a 20 20  RBU_PK_NONE);.  
fc90: 63 68 61 72 20 2a 7a 42 69 6e 64 20 3d 20 72 62  char *zBind = rb
fca0: 75 4f 62 6a 49 74 65 72 47 65 74 42 69 6e 64 6c  uObjIterGetBindl
fcb0: 69 73 74 28 70 2c 20 70 49 74 65 72 2d 3e 6e 54  ist(p, pIter->nT
fcc0: 62 6c 43 6f 6c 20 2b 20 31 20 2b 20 62 52 62 75  blCol + 1 + bRbu
fcd0: 52 6f 77 69 64 29 3b 0a 20 20 69 66 28 20 7a 42  Rowid);.  if( zB
fce0: 69 6e 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ind ){.    asser
fcf0: 74 28 20 70 49 74 65 72 2d 3e 70 54 6d 70 49 6e  t( pIter->pTmpIn
fd00: 73 65 72 74 3d 3d 30 20 29 3b 0a 20 20 20 20 70  sert==0 );.    p
fd10: 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65 46 72  ->rc = prepareFr
fd20: 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f  eeAndCollectErro
fd30: 72 28 0a 20 20 20 20 20 20 20 20 70 2d 3e 64 62  r(.        p->db
fd40: 52 62 75 2c 20 26 70 49 74 65 72 2d 3e 70 54 6d  Rbu, &pIter->pTm
fd50: 70 49 6e 73 65 72 74 2c 20 26 70 2d 3e 7a 45 72  pInsert, &p->zEr
fd60: 72 6d 73 67 2c 20 73 71 6c 69 74 65 33 5f 6d 70  rmsg, sqlite3_mp
fd70: 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20  rintf(.         
fd80: 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 25 73   "INSERT INTO %s
fd90: 2e 27 72 62 75 5f 74 6d 70 5f 25 71 27 28 72 62  .'rbu_tmp_%q'(rb
fda0: 75 5f 63 6f 6e 74 72 6f 6c 2c 25 73 25 73 29 20  u_control,%s%s) 
fdb0: 56 41 4c 55 45 53 28 25 7a 29 22 2c 20 0a 20 20  VALUES(%z)", .  
fdc0: 20 20 20 20 20 20 20 20 70 2d 3e 7a 53 74 61 74          p->zStat
fdd0: 65 44 62 2c 20 70 49 74 65 72 2d 3e 7a 44 61 74  eDb, pIter->zDat
fde0: 61 54 62 6c 2c 20 7a 43 6f 6c 6c 69 73 74 2c 20  aTbl, zCollist, 
fdf0: 7a 52 62 75 52 6f 77 69 64 2c 20 7a 42 69 6e 64  zRbuRowid, zBind
fe00: 0a 20 20 20 20 29 29 3b 0a 20 20 7d 0a 7d 0a 0a  .    ));.  }.}..
fe10: 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75 54  static void rbuT
fe20: 6d 70 49 6e 73 65 72 74 46 75 6e 63 28 0a 20 20  mpInsertFunc(.  
fe30: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
fe40: 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 56  *pCtx, .  int nV
fe50: 61 6c 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  al,.  sqlite3_va
fe60: 6c 75 65 20 2a 2a 61 70 56 61 6c 0a 29 7b 0a 20  lue **apVal.){. 
fe70: 20 73 71 6c 69 74 65 33 72 62 75 20 2a 70 20 3d   sqlite3rbu *p =
fe80: 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61   sqlite3_user_da
fe90: 74 61 28 70 43 74 78 29 3b 0a 20 20 69 6e 74 20  ta(pCtx);.  int 
fea0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
feb0: 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61 73 73 65    int i;..  asse
fec0: 72 74 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  rt( sqlite3_valu
fed0: 65 5f 69 6e 74 28 61 70 56 61 6c 5b 30 5d 29 21  e_int(apVal[0])!
fee0: 3d 30 0a 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6f  =0.      || p->o
fef0: 62 6a 69 74 65 72 2e 65 54 79 70 65 3d 3d 52 42  bjiter.eType==RB
ff00: 55 5f 50 4b 5f 45 58 54 45 52 4e 41 4c 20 0a 20  U_PK_EXTERNAL . 
ff10: 20 20 20 20 20 7c 7c 20 70 2d 3e 6f 62 6a 69 74       || p->objit
ff20: 65 72 2e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b  er.eType==RBU_PK
ff30: 5f 4e 4f 4e 45 20 0a 20 20 29 3b 0a 20 20 69 66  _NONE .  );.  if
ff40: 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ( sqlite3_value_
ff50: 69 6e 74 28 61 70 56 61 6c 5b 30 5d 29 21 3d 30  int(apVal[0])!=0
ff60: 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 50 68 61 73   ){.    p->nPhas
ff70: 65 4f 6e 65 53 74 65 70 20 2b 3d 20 70 2d 3e 6f  eOneStep += p->o
ff80: 62 6a 69 74 65 72 2e 6e 49 6e 64 65 78 3b 0a 20  bjiter.nIndex;. 
ff90: 20 7d 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72   }..  for(i=0; r
ffa0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
ffb0: 69 3c 6e 56 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nVal; i++){.  
ffc0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
ffd0: 69 6e 64 5f 76 61 6c 75 65 28 70 2d 3e 6f 62 6a  ind_value(p->obj
ffe0: 69 74 65 72 2e 70 54 6d 70 49 6e 73 65 72 74 2c  iter.pTmpInsert,
fff0: 20 69 2b 31 2c 20 61 70 56 61 6c 5b 69 5d 29 3b   i+1, apVal[i]);
10000 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
10010 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
10020 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 2d 3e  sqlite3_step(p->
10030 6f 62 6a 69 74 65 72 2e 70 54 6d 70 49 6e 73 65  objiter.pTmpInse
10040 72 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  rt);.    rc = sq
10050 6c 69 74 65 33 5f 72 65 73 65 74 28 70 2d 3e 6f  lite3_reset(p->o
10060 62 6a 69 74 65 72 2e 70 54 6d 70 49 6e 73 65 72  bjiter.pTmpInser
10070 74 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72  t);.  }..  if( r
10080 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
10090 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
100a0 6c 74 5f 65 72 72 6f 72 5f 63 6f 64 65 28 70 43  lt_error_code(pC
100b0 74 78 2c 20 72 63 29 3b 0a 20 20 7d 0a 7d 0a 0a  tx, rc);.  }.}..
100c0 2f 2a 0a 2a 2a 20 45 6e 73 75 72 65 20 74 68 61  /*.** Ensure tha
100d0 74 20 74 68 65 20 53 51 4c 69 74 65 20 73 74 61  t the SQLite sta
100e0 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65 73 20 72  tement handles r
100f0 65 71 75 69 72 65 64 20 74 6f 20 75 70 64 61 74  equired to updat
10100 65 20 74 68 65 20 0a 2a 2a 20 74 61 72 67 65 74  e the .** target
10110 20 64 61 74 61 62 61 73 65 20 6f 62 6a 65 63 74   database object
10120 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 64 69 63   currently indic
10130 61 74 65 64 20 62 79 20 74 68 65 20 69 74 65 72  ated by the iter
10140 61 74 6f 72 20 70 61 73 73 65 64 20 0a 2a 2a 20  ator passed .** 
10150 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
10160 67 75 6d 65 6e 74 20 61 72 65 20 61 76 61 69 6c  gument are avail
10170 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
10180 69 6e 74 20 72 62 75 4f 62 6a 49 74 65 72 50 72  int rbuObjIterPr
10190 65 70 61 72 65 41 6c 6c 28 0a 20 20 73 71 6c 69  epareAll(.  sqli
101a0 74 65 33 72 62 75 20 2a 70 2c 20 0a 20 20 52 62  te3rbu *p, .  Rb
101b0 75 4f 62 6a 49 74 65 72 20 2a 70 49 74 65 72 2c  uObjIter *pIter,
101c0 0a 20 20 69 6e 74 20 6e 4f 66 66 73 65 74 20 20  .  int nOffset  
101d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
101e0 20 20 20 2f 2a 20 41 64 64 20 22 4c 49 4d 49 54     /* Add "LIMIT
101f0 20 2d 31 20 4f 46 46 53 45 54 20 24 6e 4f 66 66   -1 OFFSET $nOff
10200 73 65 74 22 20 74 6f 20 53 45 4c 45 43 54 20 2a  set" to SELECT *
10210 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  /.){.  assert( p
10220 49 74 65 72 2d 3e 62 43 6c 65 61 6e 75 70 3d 3d  Iter->bCleanup==
10230 30 20 29 3b 0a 20 20 69 66 28 20 70 49 74 65 72  0 );.  if( pIter
10240 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 26 26 20  ->pSelect==0 && 
10250 72 62 75 4f 62 6a 49 74 65 72 43 61 63 68 65 54  rbuObjIterCacheT
10260 61 62 6c 65 49 6e 66 6f 28 70 2c 20 70 49 74 65  ableInfo(p, pIte
10270 72 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  r)==SQLITE_OK ){
10280 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 74  .    const int t
10290 6e 75 6d 20 3d 20 70 49 74 65 72 2d 3e 69 54 6e  num = pIter->iTn
102a0 75 6d 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43  um;.    char *zC
102b0 6f 6c 6c 69 73 74 20 3d 20 30 3b 20 20 20 20 20  ollist = 0;     
102c0 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
102d0 20 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 73   indexed columns
102e0 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 2a 70   */.    char **p
102f0 7a 20 3d 20 26 70 2d 3e 7a 45 72 72 6d 73 67 3b  z = &p->zErrmsg;
10300 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
10310 2a 7a 49 64 78 20 3d 20 70 49 74 65 72 2d 3e 7a  *zIdx = pIter->z
10320 49 64 78 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  Idx;.    char *z
10330 4c 69 6d 69 74 20 3d 20 30 3b 0a 0a 20 20 20 20  Limit = 0;..    
10340 69 66 28 20 6e 4f 66 66 73 65 74 20 29 7b 0a 20  if( nOffset ){. 
10350 20 20 20 20 20 7a 4c 69 6d 69 74 20 3d 20 73 71       zLimit = sq
10360 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 20  lite3_mprintf(" 
10370 4c 49 4d 49 54 20 2d 31 20 4f 46 46 53 45 54 20  LIMIT -1 OFFSET 
10380 25 64 22 2c 20 6e 4f 66 66 73 65 74 29 3b 0a 20  %d", nOffset);. 
10390 20 20 20 20 20 69 66 28 20 21 7a 4c 69 6d 69 74       if( !zLimit
103a0 20 29 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54   ) p->rc = SQLIT
103b0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 0a  E_NOMEM;.    }..
103c0 20 20 20 20 69 66 28 20 7a 49 64 78 20 29 7b 0a      if( zIdx ){.
103d0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
103e0 20 2a 7a 54 62 6c 20 3d 20 70 49 74 65 72 2d 3e   *zTbl = pIter->
103f0 7a 54 62 6c 3b 0a 20 20 20 20 20 20 63 68 61 72  zTbl;.      char
10400 20 2a 7a 49 6d 70 6f 73 74 65 72 43 6f 6c 73 20   *zImposterCols 
10410 3d 20 30 3b 20 20 20 20 2f 2a 20 43 6f 6c 75 6d  = 0;    /* Colum
10420 6e 73 20 66 6f 72 20 69 6d 70 6f 73 74 65 72 20  ns for imposter 
10430 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 63  table */.      c
10440 68 61 72 20 2a 7a 49 6d 70 6f 73 74 65 72 50 4b  har *zImposterPK
10450 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 50 72   = 0;      /* Pr
10460 69 6d 61 72 79 20 6b 65 79 20 64 65 63 6c 61 72  imary key declar
10470 61 74 69 6f 6e 20 66 6f 72 20 69 6d 70 6f 73 74  ation for impost
10480 65 72 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72  er */.      char
10490 20 2a 7a 57 68 65 72 65 20 3d 20 30 3b 20 20 20   *zWhere = 0;   
104a0 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45          /* WHERE
104b0 20 63 6c 61 75 73 65 20 6f 6e 20 50 4b 20 63 6f   clause on PK co
104c0 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 20 20 63  lumns */.      c
104d0 68 61 72 20 2a 7a 42 69 6e 64 20 3d 20 30 3b 0a  har *zBind = 0;.
104e0 20 20 20 20 20 20 69 6e 74 20 6e 42 69 6e 64 20        int nBind 
104f0 3d 20 30 3b 0a 0a 20 20 20 20 20 20 61 73 73 65  = 0;..      asse
10500 72 74 28 20 70 49 74 65 72 2d 3e 65 54 79 70 65  rt( pIter->eType
10510 21 3d 52 42 55 5f 50 4b 5f 56 54 41 42 20 29 3b  !=RBU_PK_VTAB );
10520 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 69 73 74 20  .      zCollist 
10530 3d 20 72 62 75 4f 62 6a 49 74 65 72 47 65 74 49  = rbuObjIterGetI
10540 6e 64 65 78 43 6f 6c 73 28 0a 20 20 20 20 20 20  ndexCols(.      
10550 20 20 20 20 70 2c 20 70 49 74 65 72 2c 20 26 7a      p, pIter, &z
10560 49 6d 70 6f 73 74 65 72 43 6f 6c 73 2c 20 26 7a  ImposterCols, &z
10570 49 6d 70 6f 73 74 65 72 50 4b 2c 20 26 7a 57 68  ImposterPK, &zWh
10580 65 72 65 2c 20 26 6e 42 69 6e 64 0a 20 20 20 20  ere, &nBind.    
10590 20 20 29 3b 0a 20 20 20 20 20 20 7a 42 69 6e 64    );.      zBind
105a0 20 3d 20 72 62 75 4f 62 6a 49 74 65 72 47 65 74   = rbuObjIterGet
105b0 42 69 6e 64 6c 69 73 74 28 70 2c 20 6e 42 69 6e  Bindlist(p, nBin
105c0 64 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 72  d);..      /* Cr
105d0 65 61 74 65 20 74 68 65 20 69 6d 70 6f 73 74 65  eate the imposte
105e0 72 20 74 61 62 6c 65 20 75 73 65 64 20 74 6f 20  r table used to 
105f0 77 72 69 74 65 20 74 6f 20 74 68 69 73 20 69 6e  write to this in
10600 64 65 78 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71  dex. */.      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 30 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 1);.      sql
10660 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
10670 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
10680 4c 5f 49 4d 50 4f 53 54 45 52 2c 20 70 2d 3e 64  L_IMPOSTER, p->d
10690 62 4d 61 69 6e 2c 20 22 6d 61 69 6e 22 2c 20 31  bMain, "main", 1
106a0 2c 74 6e 75 6d 29 3b 0a 20 20 20 20 20 20 72 62  ,tnum);.      rb
106b0 75 4d 50 72 69 6e 74 66 45 78 65 63 28 70 2c 20  uMPrintfExec(p, 
106c0 70 2d 3e 64 62 4d 61 69 6e 2c 0a 20 20 20 20 20  p->dbMain,.     
106d0 20 20 20 20 20 22 43 52 45 41 54 45 20 54 41 42       "CREATE TAB
106e0 4c 45 20 5c 22 72 62 75 5f 69 6d 70 5f 25 77 5c  LE \"rbu_imp_%w\
106f0 22 28 20 25 73 2c 20 50 52 49 4d 41 52 59 20 4b  "( %s, PRIMARY K
10700 45 59 28 20 25 73 20 29 20 29 20 57 49 54 48 4f  EY( %s ) ) WITHO
10710 55 54 20 52 4f 57 49 44 22 2c 0a 20 20 20 20 20  UT ROWID",.     
10720 20 20 20 20 20 7a 54 62 6c 2c 20 7a 49 6d 70 6f       zTbl, zImpo
10730 73 74 65 72 43 6f 6c 73 2c 20 7a 49 6d 70 6f 73  sterCols, zImpos
10740 74 65 72 50 4b 0a 20 20 20 20 20 20 29 3b 0a 20  terPK.      );. 
10750 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73       sqlite3_tes
10760 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
10770 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54  _TESTCTRL_IMPOST
10780 45 52 2c 20 70 2d 3e 64 62 4d 61 69 6e 2c 20 22  ER, p->dbMain, "
10790 6d 61 69 6e 22 2c 20 30 2c 20 30 29 3b 0a 0a 20  main", 0, 0);.. 
107a0 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74       /* Create t
107b0 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20  he statement to 
107c0 69 6e 73 65 72 74 20 69 6e 64 65 78 20 65 6e 74  insert index ent
107d0 72 69 65 73 20 2a 2f 0a 20 20 20 20 20 20 70 49  ries */.      pI
107e0 74 65 72 2d 3e 6e 43 6f 6c 20 3d 20 6e 42 69 6e  ter->nCol = nBin
107f0 64 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  d;.      if( p->
10800 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
10810 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  .        p->rc =
10820 20 70 72 65 70 61 72 65 46 72 65 65 41 6e 64 43   prepareFreeAndC
10830 6f 6c 6c 65 63 74 45 72 72 6f 72 28 0a 20 20 20  ollectError(.   
10840 20 20 20 20 20 20 20 20 20 70 2d 3e 64 62 4d 61           p->dbMa
10850 69 6e 2c 20 26 70 49 74 65 72 2d 3e 70 49 6e 73  in, &pIter->pIns
10860 65 72 74 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67  ert, &p->zErrmsg
10870 2c 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ,.          sqli
10880 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 49 4e 53  te3_mprintf("INS
10890 45 52 54 20 49 4e 54 4f 20 5c 22 72 62 75 5f 69  ERT INTO \"rbu_i
108a0 6d 70 5f 25 77 5c 22 20 56 41 4c 55 45 53 28 25  mp_%w\" VALUES(%
108b0 73 29 22 2c 20 7a 54 62 6c 2c 20 7a 42 69 6e 64  s)", zTbl, zBind
108c0 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  ).        );.   
108d0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 41     }..      /* A
108e0 6e 64 20 74 6f 20 64 65 6c 65 74 65 20 69 6e 64  nd to delete ind
108f0 65 78 20 65 6e 74 72 69 65 73 20 2a 2f 0a 20 20  ex entries */.  
10900 20 20 20 20 69 66 28 20 72 62 75 49 73 56 61 63      if( rbuIsVac
10910 75 75 6d 28 70 29 3d 3d 30 20 26 26 20 70 2d 3e  uum(p)==0 && p->
10920 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
10930 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  .        p->rc =
10940 20 70 72 65 70 61 72 65 46 72 65 65 41 6e 64 43   prepareFreeAndC
10950 6f 6c 6c 65 63 74 45 72 72 6f 72 28 0a 20 20 20  ollectError(.   
10960 20 20 20 20 20 20 20 20 20 70 2d 3e 64 62 4d 61           p->dbMa
10970 69 6e 2c 20 26 70 49 74 65 72 2d 3e 70 44 65 6c  in, &pIter->pDel
10980 65 74 65 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67  ete, &p->zErrmsg
10990 2c 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ,.          sqli
109a0 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 44 45 4c  te3_mprintf("DEL
109b0 45 54 45 20 46 52 4f 4d 20 5c 22 72 62 75 5f 69  ETE FROM \"rbu_i
109c0 6d 70 5f 25 77 5c 22 20 57 48 45 52 45 20 25 73  mp_%w\" WHERE %s
109d0 22 2c 20 7a 54 62 6c 2c 20 7a 57 68 65 72 65 29  ", zTbl, zWhere)
109e0 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
109f0 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 72    }..      /* Cr
10a00 65 61 74 65 20 74 68 65 20 53 45 4c 45 43 54 20  eate the SELECT 
10a10 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 72 65 61  statement to rea
10a20 64 20 6b 65 79 73 20 69 6e 20 73 6f 72 74 65 64  d keys in sorted
10a30 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 20 20   order */.      
10a40 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
10a50 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
10a60 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 20 20  char *zSql;.    
10a70 20 20 20 20 69 66 28 20 72 62 75 49 73 56 61 63      if( rbuIsVac
10a80 75 75 6d 28 70 29 20 29 7b 0a 20 20 20 20 20 20  uum(p) ){.      
10a90 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74      zSql = sqlit
10aa0 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20  e3_mprintf(.    
10ab0 20 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43            "SELEC
10ac0 54 20 25 73 2c 20 30 20 41 53 20 72 62 75 5f 63  T %s, 0 AS rbu_c
10ad0 6f 6e 74 72 6f 6c 20 46 52 4f 4d 20 27 25 71 27  ontrol FROM '%q'
10ae0 20 4f 52 44 45 52 20 42 59 20 25 73 25 73 22 2c   ORDER BY %s%s",
10af0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  .              z
10b00 43 6f 6c 6c 69 73 74 2c 20 0a 20 20 20 20 20 20  Collist, .      
10b10 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 7a          pIter->z
10b20 44 61 74 61 54 62 6c 2c 0a 20 20 20 20 20 20 20  DataTbl,.       
10b30 20 20 20 20 20 20 20 7a 43 6f 6c 6c 69 73 74 2c         zCollist,
10b40 20 7a 4c 69 6d 69 74 0a 20 20 20 20 20 20 20 20   zLimit.        
10b50 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c    );.        }el
10b60 73 65 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20  se..        if( 
10b70 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42  pIter->eType==RB
10b80 55 5f 50 4b 5f 45 58 54 45 52 4e 41 4c 20 7c 7c  U_PK_EXTERNAL ||
10b90 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52   pIter->eType==R
10ba0 42 55 5f 50 4b 5f 4e 4f 4e 45 20 29 7b 0a 20 20  BU_PK_NONE ){.  
10bb0 20 20 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73          zSql = s
10bc0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a  qlite3_mprintf(.
10bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 53                "S
10be0 45 4c 45 43 54 20 25 73 2c 20 72 62 75 5f 63 6f  ELECT %s, rbu_co
10bf0 6e 74 72 6f 6c 20 46 52 4f 4d 20 25 73 2e 27 72  ntrol FROM %s.'r
10c00 62 75 5f 74 6d 70 5f 25 71 27 20 4f 52 44 45 52  bu_tmp_%q' ORDER
10c10 20 42 59 20 25 73 25 73 22 2c 0a 20 20 20 20 20   BY %s%s",.     
10c20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 6c 69 73           zCollis
10c30 74 2c 20 70 2d 3e 7a 53 74 61 74 65 44 62 2c 20  t, p->zStateDb, 
10c40 70 49 74 65 72 2d 3e 7a 44 61 74 61 54 62 6c 2c  pIter->zDataTbl,
10c50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  .              z
10c60 43 6f 6c 6c 69 73 74 2c 20 7a 4c 69 6d 69 74 0a  Collist, zLimit.
10c70 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20            );.   
10c80 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
10c90 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c        zSql = sql
10ca0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20  ite3_mprintf(.  
10cb0 20 20 20 20 20 20 20 20 20 20 20 20 22 53 45 4c              "SEL
10cc0 45 43 54 20 25 73 2c 20 72 62 75 5f 63 6f 6e 74  ECT %s, rbu_cont
10cd0 72 6f 6c 20 46 52 4f 4d 20 25 73 2e 27 72 62 75  rol FROM %s.'rbu
10ce0 5f 74 6d 70 5f 25 71 27 20 22 0a 20 20 20 20 20  _tmp_%q' ".     
10cf0 20 20 20 20 20 20 20 20 20 22 55 4e 49 4f 4e 20           "UNION 
10d00 41 4c 4c 20 22 0a 20 20 20 20 20 20 20 20 20 20  ALL ".          
10d10 20 20 20 20 22 53 45 4c 45 43 54 20 25 73 2c 20      "SELECT %s, 
10d20 72 62 75 5f 63 6f 6e 74 72 6f 6c 20 46 52 4f 4d  rbu_control FROM
10d30 20 27 25 71 27 20 22 0a 20 20 20 20 20 20 20 20   '%q' ".        
10d40 20 20 20 20 20 20 22 57 48 45 52 45 20 74 79 70        "WHERE typ
10d50 65 6f 66 28 72 62 75 5f 63 6f 6e 74 72 6f 6c 29  eof(rbu_control)
10d60 3d 27 69 6e 74 65 67 65 72 27 20 41 4e 44 20 72  ='integer' AND r
10d70 62 75 5f 63 6f 6e 74 72 6f 6c 21 3d 31 20 22 0a  bu_control!=1 ".
10d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 4f                "O
10d90 52 44 45 52 20 42 59 20 25 73 25 73 22 2c 0a 20  RDER BY %s%s",. 
10da0 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f               zCo
10db0 6c 6c 69 73 74 2c 20 70 2d 3e 7a 53 74 61 74 65  llist, p->zState
10dc0 44 62 2c 20 70 49 74 65 72 2d 3e 7a 44 61 74 61  Db, pIter->zData
10dd0 54 62 6c 2c 20 0a 20 20 20 20 20 20 20 20 20 20  Tbl, .          
10de0 20 20 20 20 7a 43 6f 6c 6c 69 73 74 2c 20 70 49      zCollist, pI
10df0 74 65 72 2d 3e 7a 44 61 74 61 54 62 6c 2c 20 0a  ter->zDataTbl, .
10e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 43                zC
10e10 6f 6c 6c 69 73 74 2c 20 7a 4c 69 6d 69 74 0a 20  ollist, zLimit. 
10e20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
10e30 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 2d      }.        p-
10e40 3e 72 63 20 3d 20 70 72 65 70 61 72 65 46 72 65  >rc = prepareFre
10e50 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72  eAndCollectError
10e60 28 70 2d 3e 64 62 52 62 75 2c 20 26 70 49 74 65  (p->dbRbu, &pIte
10e70 72 2d 3e 70 53 65 6c 65 63 74 2c 20 70 7a 2c 20  r->pSelect, pz, 
10e80 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  zSql);.      }..
10e90 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
10ea0 65 65 28 7a 49 6d 70 6f 73 74 65 72 43 6f 6c 73  ee(zImposterCols
10eb0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10ec0 5f 66 72 65 65 28 7a 49 6d 70 6f 73 74 65 72 50  _free(zImposterP
10ed0 4b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  K);.      sqlite
10ee0 33 5f 66 72 65 65 28 7a 57 68 65 72 65 29 3b 0a  3_free(zWhere);.
10ef0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
10f00 65 65 28 7a 42 69 6e 64 29 3b 0a 20 20 20 20 7d  ee(zBind);.    }
10f10 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
10f20 62 52 62 75 52 6f 77 69 64 20 3d 20 28 70 49 74  bRbuRowid = (pIt
10f30 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50  er->eType==RBU_P
10f40 4b 5f 56 54 41 42 29 0a 20 20 20 20 20 20 20 20  K_VTAB).        
10f50 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 28 70              ||(p
10f60 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55  Iter->eType==RBU
10f70 5f 50 4b 5f 4e 4f 4e 45 29 0a 20 20 20 20 20 20  _PK_NONE).      
10f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
10f90 28 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52  (pIter->eType==R
10fa0 42 55 5f 50 4b 5f 45 58 54 45 52 4e 41 4c 20 26  BU_PK_EXTERNAL &
10fb0 26 20 72 62 75 49 73 56 61 63 75 75 6d 28 70 29  & rbuIsVacuum(p)
10fc0 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  );.      const c
10fd0 68 61 72 20 2a 7a 54 62 6c 20 3d 20 70 49 74 65  har *zTbl = pIte
10fe0 72 2d 3e 7a 54 62 6c 3b 20 20 20 20 20 20 20 2f  r->zTbl;       /
10ff0 2a 20 54 61 62 6c 65 20 74 68 69 73 20 73 74 65  * Table this ste
11000 70 20 61 70 70 6c 69 65 73 20 74 6f 20 2a 2f 0a  p applies to */.
11010 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
11020 20 2a 7a 57 72 69 74 65 3b 20 20 20 20 20 20 20   *zWrite;       
11030 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
11040 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 20 6e 61  mposter table na
11050 6d 65 20 2a 2f 0a 0a 20 20 20 20 20 20 63 68 61  me */..      cha
11060 72 20 2a 7a 42 69 6e 64 69 6e 67 73 20 3d 20 72  r *zBindings = r
11070 62 75 4f 62 6a 49 74 65 72 47 65 74 42 69 6e 64  buObjIterGetBind
11080 6c 69 73 74 28 70 2c 20 70 49 74 65 72 2d 3e 6e  list(p, pIter->n
11090 54 62 6c 43 6f 6c 20 2b 20 62 52 62 75 52 6f 77  TblCol + bRbuRow
110a0 69 64 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20  id);.      char 
110b0 2a 7a 57 68 65 72 65 20 3d 20 72 62 75 4f 62 6a  *zWhere = rbuObj
110c0 49 74 65 72 47 65 74 57 68 65 72 65 28 70 2c 20  IterGetWhere(p, 
110d0 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 63 68  pIter);.      ch
110e0 61 72 20 2a 7a 4f 6c 64 6c 69 73 74 20 3d 20 72  ar *zOldlist = r
110f0 62 75 4f 62 6a 49 74 65 72 47 65 74 4f 6c 64 6c  buObjIterGetOldl
11100 69 73 74 28 70 2c 20 70 49 74 65 72 2c 20 22 6f  ist(p, pIter, "o
11110 6c 64 22 29 3b 0a 20 20 20 20 20 20 63 68 61 72  ld");.      char
11120 20 2a 7a 4e 65 77 6c 69 73 74 20 3d 20 72 62 75   *zNewlist = rbu
11130 4f 62 6a 49 74 65 72 47 65 74 4f 6c 64 6c 69 73  ObjIterGetOldlis
11140 74 28 70 2c 20 70 49 74 65 72 2c 20 22 6e 65 77  t(p, pIter, "new
11150 22 29 3b 0a 0a 20 20 20 20 20 20 7a 43 6f 6c 6c  ");..      zColl
11160 69 73 74 20 3d 20 72 62 75 4f 62 6a 49 74 65 72  ist = rbuObjIter
11170 47 65 74 43 6f 6c 6c 69 73 74 28 70 2c 20 70 49  GetCollist(p, pI
11180 74 65 72 29 3b 0a 20 20 20 20 20 20 70 49 74 65  ter);.      pIte
11190 72 2d 3e 6e 43 6f 6c 20 3d 20 70 49 74 65 72 2d  r->nCol = pIter-
111a0 3e 6e 54 62 6c 43 6f 6c 3b 0a 0a 20 20 20 20 20  >nTblCol;..     
111b0 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 69   /* Create the i
111c0 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 20 6f 72  mposter table or
111d0 20 74 61 62 6c 65 73 20 28 69 66 20 72 65 71 75   tables (if requ
111e0 69 72 65 64 29 2e 20 2a 2f 0a 20 20 20 20 20 20  ired). */.      
111f0 72 62 75 43 72 65 61 74 65 49 6d 70 6f 73 74 65  rbuCreateImposte
11200 72 54 61 62 6c 65 28 70 2c 20 70 49 74 65 72 29  rTable(p, pIter)
11210 3b 0a 20 20 20 20 20 20 72 62 75 43 72 65 61 74  ;.      rbuCreat
11220 65 49 6d 70 6f 73 74 65 72 54 61 62 6c 65 32 28  eImposterTable2(
11230 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20  p, pIter);.     
11240 20 7a 57 72 69 74 65 20 3d 20 28 70 49 74 65 72   zWrite = (pIter
11250 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f  ->eType==RBU_PK_
11260 56 54 41 42 20 3f 20 22 22 20 3a 20 22 72 62 75  VTAB ? "" : "rbu
11270 5f 69 6d 70 5f 22 29 3b 0a 0a 20 20 20 20 20 20  _imp_");..      
11280 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 49 4e  /* Create the IN
11290 53 45 52 54 20 73 74 61 74 65 6d 65 6e 74 20 74  SERT statement t
112a0 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 74  o write to the t
112b0 61 72 67 65 74 20 50 4b 20 62 2d 74 72 65 65 20  arget PK b-tree 
112c0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  */.      if( p->
112d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
112e0 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  .        p->rc =
112f0 20 70 72 65 70 61 72 65 46 72 65 65 41 6e 64 43   prepareFreeAndC
11300 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64  ollectError(p->d
11310 62 4d 61 69 6e 2c 20 26 70 49 74 65 72 2d 3e 70  bMain, &pIter->p
11320 49 6e 73 65 72 74 2c 20 70 7a 2c 0a 20 20 20 20  Insert, pz,.    
11330 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
11340 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20  mprintf(.       
11350 20 20 20 20 20 20 20 22 49 4e 53 45 52 54 20 49         "INSERT I
11360 4e 54 4f 20 5c 22 25 73 25 77 5c 22 28 25 73 25  NTO \"%s%w\"(%s%
11370 73 29 20 56 41 4c 55 45 53 28 25 73 29 22 2c 20  s) VALUES(%s)", 
11380 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  .              z
11390 57 72 69 74 65 2c 20 7a 54 62 6c 2c 20 7a 43 6f  Write, zTbl, zCo
113a0 6c 6c 69 73 74 2c 20 28 62 52 62 75 52 6f 77 69  llist, (bRbuRowi
113b0 64 20 3f 20 22 2c 20 5f 72 6f 77 69 64 5f 22 20  d ? ", _rowid_" 
113c0 3a 20 22 22 29 2c 20 7a 42 69 6e 64 69 6e 67 73  : ""), zBindings
113d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 0a 20  .            ). 
113e0 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
113f0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 72 65 61  }..      /* Crea
11400 74 65 20 74 68 65 20 44 45 4c 45 54 45 20 73 74  te the DELETE st
11410 61 74 65 6d 65 6e 74 20 74 6f 20 77 72 69 74 65  atement to write
11420 20 74 6f 20 74 68 65 20 74 61 72 67 65 74 20 50   to the target P
11430 4b 20 62 2d 74 72 65 65 2e 0a 20 20 20 20 20 20  K b-tree..      
11440 2a 2a 20 42 65 63 61 75 73 65 20 69 74 20 6f 6e  ** Because it on
11450 6c 79 20 70 65 72 66 6f 72 6d 73 20 49 4e 53 45  ly performs INSE
11460 52 54 20 6f 70 65 72 61 74 69 6f 6e 73 2c 20 74  RT operations, t
11470 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69  his is not requi
11480 72 65 64 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a  red for.      **
11490 20 61 6e 20 72 62 75 20 76 61 63 75 75 6d 20 68   an rbu vacuum h
114a0 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 20  andle.  */.     
114b0 20 69 66 28 20 72 62 75 49 73 56 61 63 75 75 6d   if( rbuIsVacuum
114c0 28 70 29 3d 3d 30 20 26 26 20 70 2d 3e 72 63 3d  (p)==0 && p->rc=
114d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
114e0 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 72        p->rc = pr
114f0 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c  epareFreeAndColl
11500 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 4d 61  ectError(p->dbMa
11510 69 6e 2c 20 26 70 49 74 65 72 2d 3e 70 44 65 6c  in, &pIter->pDel
11520 65 74 65 2c 20 70 7a 2c 0a 20 20 20 20 20 20 20  ete, pz,.       
11530 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72       sqlite3_mpr
11540 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20  intf(.          
11550 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d      "DELETE FROM
11560 20 5c 22 25 73 25 77 5c 22 20 57 48 45 52 45 20   \"%s%w\" WHERE 
11570 25 73 22 2c 20 7a 57 72 69 74 65 2c 20 7a 54 62  %s", zWrite, zTb
11580 6c 2c 20 7a 57 68 65 72 65 0a 20 20 20 20 20 20  l, zWhere.      
11590 20 20 20 20 20 20 29 0a 20 20 20 20 20 20 20 20        ).        
115a0 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
115b0 20 20 69 66 28 20 72 62 75 49 73 56 61 63 75 75    if( rbuIsVacuu
115c0 6d 28 70 29 3d 3d 30 20 26 26 20 70 49 74 65 72  m(p)==0 && pIter
115d0 2d 3e 61 62 49 6e 64 65 78 65 64 20 29 7b 0a 20  ->abIndexed ){. 
115e0 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
115f0 72 20 2a 7a 52 62 75 52 6f 77 69 64 20 3d 20 22  r *zRbuRowid = "
11600 22 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ";.        if( p
11610 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55  Iter->eType==RBU
11620 5f 50 4b 5f 45 58 54 45 52 4e 41 4c 20 7c 7c 20  _PK_EXTERNAL || 
11630 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42  pIter->eType==RB
11640 55 5f 50 4b 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  U_PK_NONE ){.   
11650 20 20 20 20 20 20 20 7a 52 62 75 52 6f 77 69 64         zRbuRowid
11660 20 3d 20 22 2c 20 72 62 75 5f 72 6f 77 69 64 22   = ", rbu_rowid"
11670 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
11680 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74       /* Create t
11690 68 65 20 72 62 75 5f 74 6d 70 5f 78 78 78 20 74  he rbu_tmp_xxx t
116a0 61 62 6c 65 20 61 6e 64 20 74 68 65 20 74 72 69  able and the tri
116b0 67 67 65 72 73 20 74 6f 20 70 6f 70 75 6c 61 74  ggers to populat
116c0 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20  e it. */.       
116d0 20 72 62 75 4d 50 72 69 6e 74 66 45 78 65 63 28   rbuMPrintfExec(
116e0 70 2c 20 70 2d 3e 64 62 52 62 75 2c 0a 20 20 20  p, p->dbRbu,.   
116f0 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45           "CREATE
11700 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58   TABLE IF NOT EX
11710 49 53 54 53 20 25 73 2e 27 72 62 75 5f 74 6d 70  ISTS %s.'rbu_tmp
11720 5f 25 71 27 20 41 53 20 22 0a 20 20 20 20 20 20  _%q' AS ".      
11730 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 2a 25        "SELECT *%
11740 73 20 46 52 4f 4d 20 27 25 71 27 20 57 48 45 52  s FROM '%q' WHER
11750 45 20 30 3b 22 0a 20 20 20 20 20 20 20 20 20 20  E 0;".          
11760 20 20 2c 20 70 2d 3e 7a 53 74 61 74 65 44 62 2c    , p->zStateDb,
11770 20 70 49 74 65 72 2d 3e 7a 44 61 74 61 54 62 6c   pIter->zDataTbl
11780 0a 20 20 20 20 20 20 20 20 20 20 20 20 2c 20 28  .            , (
11790 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42  pIter->eType==RB
117a0 55 5f 50 4b 5f 45 58 54 45 52 4e 41 4c 20 3f 20  U_PK_EXTERNAL ? 
117b0 22 2c 20 30 20 41 53 20 72 62 75 5f 72 6f 77 69  ", 0 AS rbu_rowi
117c0 64 22 20 3a 20 22 22 29 0a 20 20 20 20 20 20 20  d" : "").       
117d0 20 20 20 20 20 2c 20 70 49 74 65 72 2d 3e 7a 44       , pIter->zD
117e0 61 74 61 54 62 6c 0a 20 20 20 20 20 20 20 20 29  ataTbl.        )
117f0 3b 0a 0a 20 20 20 20 20 20 20 20 72 62 75 4d 50  ;..        rbuMP
11800 72 69 6e 74 66 45 78 65 63 28 70 2c 20 70 2d 3e  rintfExec(p, p->
11810 64 62 4d 61 69 6e 2c 0a 20 20 20 20 20 20 20 20  dbMain,.        
11820 20 20 20 20 22 43 52 45 41 54 45 20 54 45 4d 50      "CREATE TEMP
11830 20 54 52 49 47 47 45 52 20 72 62 75 5f 64 65 6c   TRIGGER rbu_del
11840 65 74 65 5f 74 72 20 42 45 46 4f 52 45 20 44 45  ete_tr BEFORE DE
11850 4c 45 54 45 20 4f 4e 20 5c 22 25 73 25 77 5c 22  LETE ON \"%s%w\"
11860 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22   ".            "
11870 42 45 47 49 4e 20 22 0a 20 20 20 20 20 20 20 20  BEGIN ".        
11880 20 20 20 20 22 20 20 53 45 4c 45 43 54 20 72 62      "  SELECT rb
11890 75 5f 74 6d 70 5f 69 6e 73 65 72 74 28 33 2c 20  u_tmp_insert(3, 
118a0 25 73 29 3b 22 0a 20 20 20 20 20 20 20 20 20 20  %s);".          
118b0 20 20 22 45 4e 44 3b 22 0a 0a 20 20 20 20 20 20    "END;"..      
118c0 20 20 20 20 20 20 22 43 52 45 41 54 45 20 54 45        "CREATE TE
118d0 4d 50 20 54 52 49 47 47 45 52 20 72 62 75 5f 75  MP TRIGGER rbu_u
118e0 70 64 61 74 65 31 5f 74 72 20 42 45 46 4f 52 45  pdate1_tr BEFORE
118f0 20 55 50 44 41 54 45 20 4f 4e 20 5c 22 25 73 25   UPDATE ON \"%s%
11900 77 5c 22 20 22 0a 20 20 20 20 20 20 20 20 20 20  w\" ".          
11910 20 20 22 42 45 47 49 4e 20 22 0a 20 20 20 20 20    "BEGIN ".     
11920 20 20 20 20 20 20 20 22 20 20 53 45 4c 45 43 54         "  SELECT
11930 20 72 62 75 5f 74 6d 70 5f 69 6e 73 65 72 74 28   rbu_tmp_insert(
11940 33 2c 20 25 73 29 3b 22 0a 20 20 20 20 20 20 20  3, %s);".       
11950 20 20 20 20 20 22 45 4e 44 3b 22 0a 0a 20 20 20       "END;"..   
11960 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45           "CREATE
11970 20 54 45 4d 50 20 54 52 49 47 47 45 52 20 72 62   TEMP TRIGGER rb
11980 75 5f 75 70 64 61 74 65 32 5f 74 72 20 41 46 54  u_update2_tr AFT
11990 45 52 20 55 50 44 41 54 45 20 4f 4e 20 5c 22 25  ER UPDATE ON \"%
119a0 73 25 77 5c 22 20 22 0a 20 20 20 20 20 20 20 20  s%w\" ".        
119b0 20 20 20 20 22 42 45 47 49 4e 20 22 0a 20 20 20      "BEGIN ".   
119c0 20 20 20 20 20 20 20 20 20 22 20 20 53 45 4c 45           "  SELE
119d0 43 54 20 72 62 75 5f 74 6d 70 5f 69 6e 73 65 72  CT rbu_tmp_inser
119e0 74 28 34 2c 20 25 73 29 3b 22 0a 20 20 20 20 20  t(4, %s);".     
119f0 20 20 20 20 20 20 20 22 45 4e 44 3b 22 2c 0a 20         "END;",. 
11a00 20 20 20 20 20 20 20 20 20 20 20 7a 57 72 69 74             zWrit
11a10 65 2c 20 7a 54 62 6c 2c 20 7a 4f 6c 64 6c 69 73  e, zTbl, zOldlis
11a20 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  t,.            z
11a30 57 72 69 74 65 2c 20 7a 54 62 6c 2c 20 7a 4f 6c  Write, zTbl, zOl
11a40 64 6c 69 73 74 2c 0a 20 20 20 20 20 20 20 20 20  dlist,.         
11a50 20 20 20 7a 57 72 69 74 65 2c 20 7a 54 62 6c 2c     zWrite, zTbl,
11a60 20 7a 4e 65 77 6c 69 73 74 0a 20 20 20 20 20 20   zNewlist.      
11a70 20 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 66    );..        if
11a80 28 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d  ( pIter->eType==
11a90 52 42 55 5f 50 4b 5f 45 58 54 45 52 4e 41 4c 20  RBU_PK_EXTERNAL 
11aa0 7c 7c 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d  || pIter->eType=
11ab0 3d 52 42 55 5f 50 4b 5f 4e 4f 4e 45 20 29 7b 0a  =RBU_PK_NONE ){.
11ac0 20 20 20 20 20 20 20 20 20 20 72 62 75 4d 50 72            rbuMPr
11ad0 69 6e 74 66 45 78 65 63 28 70 2c 20 70 2d 3e 64  intfExec(p, p->d
11ae0 62 4d 61 69 6e 2c 0a 20 20 20 20 20 20 20 20 20  bMain,.         
11af0 20 20 20 20 20 22 43 52 45 41 54 45 20 54 45 4d       "CREATE TEM
11b00 50 20 54 52 49 47 47 45 52 20 72 62 75 5f 69 6e  P TRIGGER rbu_in
11b10 73 65 72 74 5f 74 72 20 41 46 54 45 52 20 49 4e  sert_tr AFTER IN
11b20 53 45 52 54 20 4f 4e 20 5c 22 25 73 25 77 5c 22  SERT ON \"%s%w\"
11b30 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ".             
11b40 20 22 42 45 47 49 4e 20 22 0a 20 20 20 20 20 20   "BEGIN ".      
11b50 20 20 20 20 20 20 20 20 22 20 20 53 45 4c 45 43          "  SELEC
11b60 54 20 72 62 75 5f 74 6d 70 5f 69 6e 73 65 72 74  T rbu_tmp_insert
11b70 28 30 2c 20 25 73 29 3b 22 0a 20 20 20 20 20 20  (0, %s);".      
11b80 20 20 20 20 20 20 20 20 22 45 4e 44 3b 22 2c 0a          "END;",.
11b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 57                zW
11ba0 72 69 74 65 2c 20 7a 54 62 6c 2c 20 7a 4e 65 77  rite, zTbl, zNew
11bb0 6c 69 73 74 0a 20 20 20 20 20 20 20 20 20 20 29  list.          )
11bc0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
11bd0 20 20 20 20 20 72 62 75 4f 62 6a 49 74 65 72 50       rbuObjIterP
11be0 72 65 70 61 72 65 54 6d 70 49 6e 73 65 72 74 28  repareTmpInsert(
11bf0 70 2c 20 70 49 74 65 72 2c 20 7a 43 6f 6c 6c 69  p, pIter, zColli
11c00 73 74 2c 20 7a 52 62 75 52 6f 77 69 64 29 3b 0a  st, zRbuRowid);.
11c10 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
11c20 2a 20 43 72 65 61 74 65 20 74 68 65 20 53 45 4c  * Create the SEL
11c30 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 6f  ECT statement to
11c40 20 72 65 61 64 20 6b 65 79 73 20 66 72 6f 6d 20   read keys from 
11c50 64 61 74 61 5f 78 78 78 20 2a 2f 0a 20 20 20 20  data_xxx */.    
11c60 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
11c70 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
11c80 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52    const char *zR
11c90 62 75 52 6f 77 69 64 20 3d 20 22 22 3b 0a 20 20  buRowid = "";.  
11ca0 20 20 20 20 20 20 69 66 28 20 62 52 62 75 52 6f        if( bRbuRo
11cb0 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  wid ){.         
11cc0 20 7a 52 62 75 52 6f 77 69 64 20 3d 20 72 62 75   zRbuRowid = rbu
11cd0 49 73 56 61 63 75 75 6d 28 70 29 20 3f 20 22 2c  IsVacuum(p) ? ",
11ce0 5f 72 6f 77 69 64 5f 20 22 20 3a 20 22 2c 72 62  _rowid_ " : ",rb
11cf0 75 5f 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20  u_rowid";.      
11d00 20 20 7d 0a 20 20 20 20 20 20 20 20 70 2d 3e 72    }.        p->r
11d10 63 20 3d 20 70 72 65 70 61 72 65 46 72 65 65 41  c = prepareFreeA
11d20 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70  ndCollectError(p
11d30 2d 3e 64 62 52 62 75 2c 20 26 70 49 74 65 72 2d  ->dbRbu, &pIter-
11d40 3e 70 53 65 6c 65 63 74 2c 20 70 7a 2c 0a 20 20  >pSelect, pz,.  
11d50 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
11d60 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20  3_mprintf(.     
11d70 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54           "SELECT
11d80 20 25 73 2c 25 73 20 72 62 75 5f 63 6f 6e 74 72   %s,%s rbu_contr
11d90 6f 6c 25 73 20 46 52 4f 4d 20 27 25 71 27 25 73  ol%s FROM '%q'%s
11da0 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ", .            
11db0 20 20 7a 43 6f 6c 6c 69 73 74 2c 20 0a 20 20 20    zCollist, .   
11dc0 20 20 20 20 20 20 20 20 20 20 20 28 72 62 75 49             (rbuI
11dd0 73 56 61 63 75 75 6d 28 70 29 20 3f 20 22 30 20  sVacuum(p) ? "0 
11de0 41 53 20 22 20 3a 20 22 22 29 2c 0a 20 20 20 20  AS " : ""),.    
11df0 20 20 20 20 20 20 20 20 20 20 7a 52 62 75 52 6f            zRbuRo
11e00 77 69 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  wid,.           
11e10 20 20 20 70 49 74 65 72 2d 3e 7a 44 61 74 61 54     pIter->zDataT
11e20 62 6c 2c 20 7a 4c 69 6d 69 74 0a 20 20 20 20 20  bl, zLimit.     
11e30 20 20 20 20 20 20 20 29 0a 20 20 20 20 20 20 20         ).       
11e40 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20   );.      }..   
11e50 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
11e60 7a 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20 73  zWhere);.      s
11e70 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 6c 64  qlite3_free(zOld
11e80 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  list);.      sql
11e90 69 74 65 33 5f 66 72 65 65 28 7a 4e 65 77 6c 69  ite3_free(zNewli
11ea0 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  st);.      sqlit
11eb0 65 33 5f 66 72 65 65 28 7a 42 69 6e 64 69 6e 67  e3_free(zBinding
11ec0 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  s);.    }.    sq
11ed0 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6c 6c  lite3_free(zColl
11ee0 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ist);.    sqlite
11ef0 33 5f 66 72 65 65 28 7a 4c 69 6d 69 74 29 3b 0a  3_free(zLimit);.
11f00 20 20 7d 0a 20 20 0a 20 20 72 65 74 75 72 6e 20    }.  .  return 
11f10 70 2d 3e 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  p->rc;.}../*.** 
11f20 53 65 74 20 6f 75 74 70 75 74 20 76 61 72 69 61  Set output varia
11f30 62 6c 65 20 2a 70 70 53 74 6d 74 20 74 6f 20 70  ble *ppStmt to p
11f40 6f 69 6e 74 20 74 6f 20 61 6e 20 55 50 44 41 54  oint to an UPDAT
11f50 45 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  E statement that
11f60 20 6d 61 79 0a 2a 2a 20 62 65 20 75 73 65 64 20   may.** be used 
11f70 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 69 6d  to update the im
11f80 70 6f 73 74 65 72 20 74 61 62 6c 65 20 66 6f 72  poster table for
11f90 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 20   the main table 
11fa0 62 2d 74 72 65 65 20 6f 66 20 74 68 65 0a 2a 2a  b-tree of the.**
11fb0 20 74 61 62 6c 65 20 6f 62 6a 65 63 74 20 74 68   table object th
11fc0 61 74 20 70 49 74 65 72 20 63 75 72 72 65 6e 74  at pIter current
11fd0 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2c 20 61 73  ly points to, as
11fe0 73 75 6d 69 6e 67 20 74 68 61 74 20 74 68 65 20  suming that the 
11ff0 0a 2a 2a 20 72 62 75 5f 63 6f 6e 74 72 6f 6c 20  .** rbu_control 
12000 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 64 61  column of the da
12010 74 61 5f 78 79 7a 20 74 61 62 6c 65 20 63 6f 6e  ta_xyz table con
12020 74 61 69 6e 73 20 7a 4d 61 73 6b 2e 0a 2a 2a 20  tains zMask..** 
12030 0a 2a 2a 20 49 66 20 74 68 65 20 7a 4d 61 73 6b  .** If the zMask
12040 20 73 74 72 69 6e 67 20 64 6f 65 73 20 6e 6f 74   string does not
12050 20 73 70 65 63 69 66 79 20 61 6e 79 20 63 6f 6c   specify any col
12060 75 6d 6e 73 20 74 6f 20 75 70 64 61 74 65 2c 20  umns to update, 
12070 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20 69 73 20  then this.** is 
12080 6e 6f 74 20 61 6e 20 65 72 72 6f 72 2e 20 4f 75  not an error. Ou
12090 74 70 75 74 20 76 61 72 69 61 62 6c 65 20 2a 70  tput variable *p
120a0 70 53 74 6d 74 20 69 73 20 73 65 74 20 74 6f 20  pStmt is set to 
120b0 4e 55 4c 4c 20 69 6e 20 74 68 69 73 20 63 61 73  NULL in this cas
120c0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
120d0 20 72 62 75 47 65 74 55 70 64 61 74 65 53 74 6d   rbuGetUpdateStm
120e0 74 28 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20  t(.  sqlite3rbu 
120f0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
12100 20 20 20 20 20 2f 2a 20 52 42 55 20 68 61 6e 64       /* RBU hand
12110 6c 65 20 2a 2f 0a 20 20 52 62 75 4f 62 6a 49 74  le */.  RbuObjIt
12120 65 72 20 2a 70 49 74 65 72 2c 20 20 20 20 20 20  er *pIter,      
12130 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63          /* Objec
12140 74 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20  t iterator */.  
12150 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73  const char *zMas
12160 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
12170 2f 2a 20 72 62 75 5f 63 6f 6e 74 72 6f 6c 20 76  /* rbu_control v
12180 61 6c 75 65 20 28 27 78 2e 78 2e 27 29 20 2a 2f  alue ('x.x.') */
12190 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
121a0 2a 2a 70 70 53 74 6d 74 20 20 20 20 20 20 20 20  **ppStmt        
121b0 20 20 20 2f 2a 20 4f 55 54 3a 20 55 50 44 41 54     /* OUT: UPDAT
121c0 45 20 73 74 61 74 65 6d 65 6e 74 20 68 61 6e 64  E statement hand
121d0 6c 65 20 2a 2f 0a 29 7b 0a 20 20 52 62 75 55 70  le */.){.  RbuUp
121e0 64 61 74 65 53 74 6d 74 20 2a 2a 70 70 3b 0a 20  dateStmt **pp;. 
121f0 20 52 62 75 55 70 64 61 74 65 53 74 6d 74 20 2a   RbuUpdateStmt *
12200 70 55 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  pUp = 0;.  int n
12210 55 70 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 6e  Up = 0;..  /* In
12220 20 63 61 73 65 20 61 6e 20 65 72 72 6f 72 20 6f   case an error o
12230 63 63 75 72 73 20 2a 2f 0a 20 20 2a 70 70 53 74  ccurs */.  *ppSt
12240 6d 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 53 65  mt = 0;..  /* Se
12250 61 72 63 68 20 66 6f 72 20 61 6e 20 65 78 69 73  arch for an exis
12260 74 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 2e 20  ting statement. 
12270 49 66 20 6f 6e 65 20 69 73 20 66 6f 75 6e 64 2c  If one is found,
12280 20 73 68 69 66 74 20 69 74 20 74 6f 20 74 68 65   shift it to the
12290 20 66 72 6f 6e 74 0a 20 20 2a 2a 20 6f 66 20 74   front.  ** of t
122a0 68 65 20 4c 52 55 20 71 75 65 75 65 20 61 6e 64  he LRU queue and
122b0 20 72 65 74 75 72 6e 20 69 6d 6d 65 64 69 61 74   return immediat
122c0 65 6c 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ely. Otherwise, 
122d0 6c 65 61 76 65 20 6e 55 70 20 70 6f 69 6e 74 69  leave nUp pointi
122e0 6e 67 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 6e  ng.  ** to the n
122f0 75 6d 62 65 72 20 6f 66 20 73 74 61 74 65 6d 65  umber of stateme
12300 6e 74 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  nts currently in
12310 20 74 68 65 20 63 61 63 68 65 20 61 6e 64 20 70   the cache and p
12320 55 70 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6c  Up to the.  ** l
12330 61 73 74 20 6f 62 6a 65 63 74 20 69 6e 20 74 68  ast object in th
12340 65 20 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 66 6f  e list.  */.  fo
12350 72 28 70 70 3d 26 70 49 74 65 72 2d 3e 70 52 62  r(pp=&pIter->pRb
12360 75 55 70 64 61 74 65 3b 20 2a 70 70 3b 20 70 70  uUpdate; *pp; pp
12370 3d 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29  =&((*pp)->pNext)
12380 29 7b 0a 20 20 20 20 70 55 70 20 3d 20 2a 70 70  ){.    pUp = *pp
12390 3b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  ;.    if( strcmp
123a0 28 70 55 70 2d 3e 7a 4d 61 73 6b 2c 20 7a 4d 61  (pUp->zMask, zMa
123b0 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)==0 ){.      
123c0 2a 70 70 20 3d 20 70 55 70 2d 3e 70 4e 65 78 74  *pp = pUp->pNext
123d0 3b 0a 20 20 20 20 20 20 70 55 70 2d 3e 70 4e 65  ;.      pUp->pNe
123e0 78 74 20 3d 20 70 49 74 65 72 2d 3e 70 52 62 75  xt = pIter->pRbu
123f0 55 70 64 61 74 65 3b 0a 20 20 20 20 20 20 70 49  Update;.      pI
12400 74 65 72 2d 3e 70 52 62 75 55 70 64 61 74 65 20  ter->pRbuUpdate 
12410 3d 20 70 55 70 3b 0a 20 20 20 20 20 20 2a 70 70  = pUp;.      *pp
12420 53 74 6d 74 20 3d 20 70 55 70 2d 3e 70 55 70 64  Stmt = pUp->pUpd
12430 61 74 65 3b 20 0a 20 20 20 20 20 20 72 65 74 75  ate; .      retu
12440 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
12450 20 20 7d 0a 20 20 20 20 6e 55 70 2b 2b 3b 0a 20    }.    nUp++;. 
12460 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 55 70   }.  assert( pUp
12470 3d 3d 30 20 7c 7c 20 70 55 70 2d 3e 70 4e 65 78  ==0 || pUp->pNex
12480 74 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 6e  t==0 );..  if( n
12490 55 70 3e 3d 53 51 4c 49 54 45 5f 52 42 55 5f 55  Up>=SQLITE_RBU_U
124a0 50 44 41 54 45 5f 43 41 43 48 45 53 49 5a 45 20  PDATE_CACHESIZE 
124b0 29 7b 0a 20 20 20 20 66 6f 72 28 70 70 3d 26 70  ){.    for(pp=&p
124c0 49 74 65 72 2d 3e 70 52 62 75 55 70 64 61 74 65  Iter->pRbuUpdate
124d0 3b 20 2a 70 70 21 3d 70 55 70 3b 20 70 70 3d 26  ; *pp!=pUp; pp=&
124e0 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 29 3b  ((*pp)->pNext));
124f0 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20  .    *pp = 0;.  
12500 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
12510 7a 65 28 70 55 70 2d 3e 70 55 70 64 61 74 65 29  ze(pUp->pUpdate)
12520 3b 0a 20 20 20 20 70 55 70 2d 3e 70 55 70 64 61  ;.    pUp->pUpda
12530 74 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  te = 0;.  }else{
12540 0a 20 20 20 20 70 55 70 20 3d 20 28 52 62 75 55  .    pUp = (RbuU
12550 70 64 61 74 65 53 74 6d 74 2a 29 72 62 75 4d 61  pdateStmt*)rbuMa
12560 6c 6c 6f 63 28 70 2c 20 73 69 7a 65 6f 66 28 52  lloc(p, sizeof(R
12570 62 75 55 70 64 61 74 65 53 74 6d 74 29 2b 70 49  buUpdateStmt)+pI
12580 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 2b 31 29 3b  ter->nTblCol+1);
12590 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 55 70 20  .  }..  if( pUp 
125a0 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 57 68  ){.    char *zWh
125b0 65 72 65 20 3d 20 72 62 75 4f 62 6a 49 74 65 72  ere = rbuObjIter
125c0 47 65 74 57 68 65 72 65 28 70 2c 20 70 49 74 65  GetWhere(p, pIte
125d0 72 29 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53  r);.    char *zS
125e0 65 74 20 3d 20 72 62 75 4f 62 6a 49 74 65 72 47  et = rbuObjIterG
125f0 65 74 53 65 74 6c 69 73 74 28 70 2c 20 70 49 74  etSetlist(p, pIt
12600 65 72 2c 20 7a 4d 61 73 6b 29 3b 0a 20 20 20 20  er, zMask);.    
12610 63 68 61 72 20 2a 7a 55 70 64 61 74 65 20 3d 20  char *zUpdate = 
12620 30 3b 0a 0a 20 20 20 20 70 55 70 2d 3e 7a 4d 61  0;..    pUp->zMa
12630 73 6b 20 3d 20 28 63 68 61 72 2a 29 26 70 55 70  sk = (char*)&pUp
12640 5b 31 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  [1];.    memcpy(
12650 70 55 70 2d 3e 7a 4d 61 73 6b 2c 20 7a 4d 61 73  pUp->zMask, zMas
12660 6b 2c 20 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f  k, pIter->nTblCo
12670 6c 29 3b 0a 20 20 20 20 70 55 70 2d 3e 70 4e 65  l);.    pUp->pNe
12680 78 74 20 3d 20 70 49 74 65 72 2d 3e 70 52 62 75  xt = pIter->pRbu
12690 55 70 64 61 74 65 3b 0a 20 20 20 20 70 49 74 65  Update;.    pIte
126a0 72 2d 3e 70 52 62 75 55 70 64 61 74 65 20 3d 20  r->pRbuUpdate = 
126b0 70 55 70 3b 0a 0a 20 20 20 20 69 66 28 20 7a 53  pUp;..    if( zS
126c0 65 74 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  et ){.      cons
126d0 74 20 63 68 61 72 20 2a 7a 50 72 65 66 69 78 20  t char *zPrefix 
126e0 3d 20 22 22 3b 0a 0a 20 20 20 20 20 20 69 66 28  = "";..      if(
126f0 20 70 49 74 65 72 2d 3e 65 54 79 70 65 21 3d 52   pIter->eType!=R
12700 42 55 5f 50 4b 5f 56 54 41 42 20 29 20 7a 50 72  BU_PK_VTAB ) zPr
12710 65 66 69 78 20 3d 20 22 72 62 75 5f 69 6d 70 5f  efix = "rbu_imp_
12720 22 3b 0a 20 20 20 20 20 20 7a 55 70 64 61 74 65  ";.      zUpdate
12730 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
12740 74 66 28 22 55 50 44 41 54 45 20 5c 22 25 73 25  tf("UPDATE \"%s%
12750 77 5c 22 20 53 45 54 20 25 73 20 57 48 45 52 45  w\" SET %s WHERE
12760 20 25 73 22 2c 20 0a 20 20 20 20 20 20 20 20 20   %s", .         
12770 20 7a 50 72 65 66 69 78 2c 20 70 49 74 65 72 2d   zPrefix, pIter-
12780 3e 7a 54 62 6c 2c 20 7a 53 65 74 2c 20 7a 57 68  >zTbl, zSet, zWh
12790 65 72 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  ere.      );.   
127a0 20 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61     p->rc = prepa
127b0 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74  reFreeAndCollect
127c0 45 72 72 6f 72 28 0a 20 20 20 20 20 20 20 20 20  Error(.         
127d0 20 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 70 55 70   p->dbMain, &pUp
127e0 2d 3e 70 55 70 64 61 74 65 2c 20 26 70 2d 3e 7a  ->pUpdate, &p->z
127f0 45 72 72 6d 73 67 2c 20 7a 55 70 64 61 74 65 0a  Errmsg, zUpdate.
12800 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 2a        );.      *
12810 70 70 53 74 6d 74 20 3d 20 70 55 70 2d 3e 70 55  ppStmt = pUp->pU
12820 70 64 61 74 65 3b 0a 20 20 20 20 7d 0a 20 20 20  pdate;.    }.   
12830 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 57   sqlite3_free(zW
12840 68 65 72 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  here);.    sqlit
12850 65 33 5f 66 72 65 65 28 7a 53 65 74 29 3b 0a 20  e3_free(zSet);. 
12860 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e   }..  return p->
12870 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 73 71  rc;.}..static sq
12880 6c 69 74 65 33 20 2a 72 62 75 4f 70 65 6e 44 62  lite3 *rbuOpenDb
12890 68 61 6e 64 6c 65 28 0a 20 20 73 71 6c 69 74 65  handle(.  sqlite
128a0 33 72 62 75 20 2a 70 2c 20 0a 20 20 63 6f 6e 73  3rbu *p, .  cons
128b0 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a  t char *zName, .
128c0 20 20 69 6e 74 20 62 55 73 65 56 66 73 0a 29 7b    int bUseVfs.){
128d0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
128e0 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d   0;.  if( p->rc=
128f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
12900 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67    const int flag
12910 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s = SQLITE_OPEN_
12920 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45  READWRITE|SQLITE
12930 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 53 51 4c  _OPEN_CREATE|SQL
12940 49 54 45 5f 4f 50 45 4e 5f 55 52 49 3b 0a 20 20  ITE_OPEN_URI;.  
12950 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65    p->rc = sqlite
12960 33 5f 6f 70 65 6e 5f 76 32 28 7a 4e 61 6d 65 2c  3_open_v2(zName,
12970 20 26 64 62 2c 20 66 6c 61 67 73 2c 20 62 55 73   &db, flags, bUs
12980 65 56 66 73 20 3f 20 70 2d 3e 7a 56 66 73 4e 61  eVfs ? p->zVfsNa
12990 6d 65 20 3a 20 30 29 3b 0a 20 20 20 20 69 66 28  me : 0);.    if(
129a0 20 70 2d 3e 72 63 20 29 7b 0a 20 20 20 20 20 20   p->rc ){.      
129b0 70 2d 3e 7a 45 72 72 6d 73 67 20 3d 20 73 71 6c  p->zErrmsg = sql
129c0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
129d0 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ", sqlite3_errms
129e0 67 28 64 62 29 29 3b 0a 20 20 20 20 20 20 73 71  g(db));.      sq
129f0 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 62 29 3b  lite3_close(db);
12a00 0a 20 20 20 20 20 20 64 62 20 3d 20 30 3b 0a 20  .      db = 0;. 
12a10 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
12a20 6e 20 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  n db;.}../*.** F
12a30 72 65 65 20 61 6e 20 52 62 75 53 74 61 74 65 20  ree an RbuState 
12a40 6f 62 6a 65 63 74 20 61 6c 6c 6f 63 61 74 65 64  object allocated
12a50 20 62 79 20 72 62 75 4c 6f 61 64 53 74 61 74 65   by rbuLoadState
12a60 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ()..*/.static vo
12a70 69 64 20 72 62 75 46 72 65 65 53 74 61 74 65 28  id rbuFreeState(
12a80 52 62 75 53 74 61 74 65 20 2a 70 29 7b 0a 20 20  RbuState *p){.  
12a90 69 66 28 20 70 20 29 7b 0a 20 20 20 20 73 71 6c  if( p ){.    sql
12aa0 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 54 62  ite3_free(p->zTb
12ab0 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  l);.    sqlite3_
12ac0 66 72 65 65 28 70 2d 3e 7a 49 64 78 29 3b 0a 20  free(p->zIdx);. 
12ad0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
12ae0 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  p);.  }.}../*.**
12af0 20 41 6c 6c 6f 63 61 74 65 20 61 6e 20 52 62 75   Allocate an Rbu
12b00 53 74 61 74 65 20 6f 62 6a 65 63 74 20 61 6e 64  State object and
12b10 20 6c 6f 61 64 20 74 68 65 20 63 6f 6e 74 65 6e   load the conten
12b20 74 73 20 6f 66 20 74 68 65 20 72 62 75 5f 73 74  ts of the rbu_st
12b30 61 74 65 20 0a 2a 2a 20 74 61 62 6c 65 20 69 6e  ate .** table in
12b40 74 6f 20 69 74 2e 20 52 65 74 75 72 6e 20 61 20  to it. Return a 
12b50 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e  pointer to the n
12b60 65 77 20 6f 62 6a 65 63 74 2e 20 49 74 20 69 73  ew object. It is
12b70 20 74 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73   the .** respons
12b80 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
12b90 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61  aller to eventua
12ba0 6c 6c 79 20 66 72 65 65 20 74 68 65 20 6f 62 6a  lly free the obj
12bb0 65 63 74 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c  ect using.** sql
12bc0 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2a 0a  ite3_free()..**.
12bd0 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
12be0 63 63 75 72 73 2c 20 6c 65 61 76 65 20 61 6e 20  ccurs, leave an 
12bf0 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 6d  error code and m
12c00 65 73 73 61 67 65 20 69 6e 20 74 68 65 20 72 62  essage in the rb
12c10 75 20 68 61 6e 64 6c 65 0a 2a 2a 20 61 6e 64 20  u handle.** and 
12c20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a  return NULL..*/.
12c30 73 74 61 74 69 63 20 52 62 75 53 74 61 74 65 20  static RbuState 
12c40 2a 72 62 75 4c 6f 61 64 53 74 61 74 65 28 73 71  *rbuLoadState(sq
12c50 6c 69 74 65 33 72 62 75 20 2a 70 29 7b 0a 20 20  lite3rbu *p){.  
12c60 52 62 75 53 74 61 74 65 20 2a 70 52 65 74 20 3d  RbuState *pRet =
12c70 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   0;.  sqlite3_st
12c80 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20  mt *pStmt = 0;. 
12c90 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 72   int rc;.  int r
12ca0 63 32 3b 0a 0a 20 20 70 52 65 74 20 3d 20 28 52  c2;..  pRet = (R
12cb0 62 75 53 74 61 74 65 2a 29 72 62 75 4d 61 6c 6c  buState*)rbuMall
12cc0 6f 63 28 70 2c 20 73 69 7a 65 6f 66 28 52 62 75  oc(p, sizeof(Rbu
12cd0 53 74 61 74 65 29 29 3b 0a 20 20 69 66 28 20 70  State));.  if( p
12ce0 52 65 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Ret==0 ) return 
12cf0 30 3b 0a 0a 20 20 72 63 20 3d 20 70 72 65 70 61  0;..  rc = prepa
12d00 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74  reFreeAndCollect
12d10 45 72 72 6f 72 28 70 2d 3e 64 62 52 62 75 2c 20  Error(p->dbRbu, 
12d20 26 70 53 74 6d 74 2c 20 26 70 2d 3e 7a 45 72 72  &pStmt, &p->zErr
12d30 6d 73 67 2c 20 0a 20 20 20 20 20 20 73 71 6c 69  msg, .      sqli
12d40 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c  te3_mprintf("SEL
12d50 45 43 54 20 6b 2c 20 76 20 46 52 4f 4d 20 25 73  ECT k, v FROM %s
12d60 2e 72 62 75 5f 73 74 61 74 65 22 2c 20 70 2d 3e  .rbu_state", p->
12d70 7a 53 74 61 74 65 44 62 29 0a 20 20 29 3b 0a 20  zStateDb).  );. 
12d80 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
12d90 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f  TE_OK && SQLITE_
12da0 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW==sqlite3_ste
12db0 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20  p(pStmt) ){.    
12dc0 73 77 69 74 63 68 28 20 73 71 6c 69 74 65 33 5f  switch( sqlite3_
12dd0 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74  column_int(pStmt
12de0 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 63 61  , 0) ){.      ca
12df0 73 65 20 52 42 55 5f 53 54 41 54 45 5f 53 54 41  se RBU_STATE_STA
12e00 47 45 3a 0a 20 20 20 20 20 20 20 20 70 52 65 74  GE:.        pRet
12e10 2d 3e 65 53 74 61 67 65 20 3d 20 73 71 6c 69 74  ->eStage = sqlit
12e20 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53  e3_column_int(pS
12e30 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  tmt, 1);.       
12e40 20 69 66 28 20 70 52 65 74 2d 3e 65 53 74 61 67   if( pRet->eStag
12e50 65 21 3d 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c  e!=RBU_STAGE_OAL
12e60 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 52 65  .         && pRe
12e70 74 2d 3e 65 53 74 61 67 65 21 3d 52 42 55 5f 53  t->eStage!=RBU_S
12e80 54 41 47 45 5f 4d 4f 56 45 0a 20 20 20 20 20 20  TAGE_MOVE.      
12e90 20 20 20 26 26 20 70 52 65 74 2d 3e 65 53 74 61     && pRet->eSta
12ea0 67 65 21 3d 52 42 55 5f 53 54 41 47 45 5f 43 4b  ge!=RBU_STAGE_CK
12eb0 50 54 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  PT.        ){.  
12ec0 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
12ed0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a  SQLITE_CORRUPT;.
12ee0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
12ef0 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20    break;..      
12f00 63 61 73 65 20 52 42 55 5f 53 54 41 54 45 5f 54  case RBU_STATE_T
12f10 42 4c 3a 0a 20 20 20 20 20 20 20 20 70 52 65 74  BL:.        pRet
12f20 2d 3e 7a 54 62 6c 20 3d 20 72 62 75 53 74 72 6e  ->zTbl = rbuStrn
12f30 64 75 70 28 28 63 68 61 72 2a 29 73 71 6c 69 74  dup((char*)sqlit
12f40 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
12f50 53 74 6d 74 2c 20 31 29 2c 20 26 72 63 29 3b 0a  Stmt, 1), &rc);.
12f60 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a          break;..
12f70 20 20 20 20 20 20 63 61 73 65 20 52 42 55 5f 53        case RBU_S
12f80 54 41 54 45 5f 49 44 58 3a 0a 20 20 20 20 20 20  TATE_IDX:.      
12f90 20 20 70 52 65 74 2d 3e 7a 49 64 78 20 3d 20 72    pRet->zIdx = r
12fa0 62 75 53 74 72 6e 64 75 70 28 28 63 68 61 72 2a  buStrndup((char*
12fb0 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
12fc0 74 65 78 74 28 70 53 74 6d 74 2c 20 31 29 2c 20  text(pStmt, 1), 
12fd0 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20 62 72  &rc);.        br
12fe0 65 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73 65  eak;..      case
12ff0 20 52 42 55 5f 53 54 41 54 45 5f 52 4f 57 3a 0a   RBU_STATE_ROW:.
13000 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e 6e 52          pRet->nR
13010 6f 77 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ow = sqlite3_col
13020 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 31  umn_int(pStmt, 1
13030 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
13040 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20 52 42  ;..      case RB
13050 55 5f 53 54 41 54 45 5f 50 52 4f 47 52 45 53 53  U_STATE_PROGRESS
13060 3a 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e  :.        pRet->
13070 6e 50 72 6f 67 72 65 73 73 20 3d 20 73 71 6c 69  nProgress = sqli
13080 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34  te3_column_int64
13090 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20  (pStmt, 1);.    
130a0 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
130b0 20 20 63 61 73 65 20 52 42 55 5f 53 54 41 54 45    case RBU_STATE
130c0 5f 43 4b 50 54 3a 0a 20 20 20 20 20 20 20 20 70  _CKPT:.        p
130d0 52 65 74 2d 3e 69 57 61 6c 43 6b 73 75 6d 20 3d  Ret->iWalCksum =
130e0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
130f0 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 31 29 3b  int64(pStmt, 1);
13100 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
13110 0a 20 20 20 20 20 20 63 61 73 65 20 52 42 55 5f  .      case RBU_
13120 53 54 41 54 45 5f 43 4f 4f 4b 49 45 3a 0a 20 20  STATE_COOKIE:.  
13130 20 20 20 20 20 20 70 52 65 74 2d 3e 69 43 6f 6f        pRet->iCoo
13140 6b 69 65 20 3d 20 28 75 33 32 29 73 71 6c 69 74  kie = (u32)sqlit
13150 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28  e3_column_int64(
13160 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20 20  pStmt, 1);.     
13170 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20     break;..     
13180 20 63 61 73 65 20 52 42 55 5f 53 54 41 54 45 5f   case RBU_STATE_
13190 4f 41 4c 53 5a 3a 0a 20 20 20 20 20 20 20 20 70  OALSZ:.        p
131a0 52 65 74 2d 3e 69 4f 61 6c 53 7a 20 3d 20 28 75  Ret->iOalSz = (u
131b0 33 32 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  32)sqlite3_colum
131c0 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 31  n_int64(pStmt, 1
131d0 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
131e0 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20 52 42  ;..      case RB
131f0 55 5f 53 54 41 54 45 5f 50 48 41 53 45 4f 4e 45  U_STATE_PHASEONE
13200 53 54 45 50 3a 0a 20 20 20 20 20 20 20 20 70 52  STEP:.        pR
13210 65 74 2d 3e 6e 50 68 61 73 65 4f 6e 65 53 74 65  et->nPhaseOneSte
13220 70 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  p = sqlite3_colu
13230 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20  mn_int64(pStmt, 
13240 31 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  1);.        brea
13250 6b 3b 0a 0a 20 20 20 20 20 20 64 65 66 61 75 6c  k;..      defaul
13260 74 3a 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  t:.        rc = 
13270 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a  SQLITE_CORRUPT;.
13280 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
13290 20 20 20 7d 0a 20 20 7d 0a 20 20 72 63 32 20 3d     }.  }.  rc2 =
132a0 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
132b0 65 28 70 53 74 6d 74 29 3b 0a 20 20 69 66 28 20  e(pStmt);.  if( 
132c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
132d0 72 63 20 3d 20 72 63 32 3b 0a 0a 20 20 70 2d 3e  rc = rc2;..  p->
132e0 72 63 20 3d 20 72 63 3b 0a 20 20 72 65 74 75 72  rc = rc;.  retur
132f0 6e 20 70 52 65 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  n pRet;.}.../*.*
13300 2a 20 4f 70 65 6e 20 74 68 65 20 64 61 74 61 62  * Open the datab
13310 61 73 65 20 68 61 6e 64 6c 65 20 61 6e 64 20 61  ase handle and a
13320 74 74 61 63 68 20 74 68 65 20 52 42 55 20 64 61  ttach the RBU da
13330 74 61 62 61 73 65 20 61 73 20 22 72 62 75 22 2e  tabase as "rbu".
13340 20 49 66 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20   If an.** error 
13350 6f 63 63 75 72 73 2c 20 6c 65 61 76 65 20 61 6e  occurs, leave an
13360 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20   error code and 
13370 6d 65 73 73 61 67 65 20 69 6e 20 74 68 65 20 52  message in the R
13380 42 55 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74  BU handle..*/.st
13390 61 74 69 63 20 76 6f 69 64 20 72 62 75 4f 70 65  atic void rbuOpe
133a0 6e 44 61 74 61 62 61 73 65 28 73 71 6c 69 74 65  nDatabase(sqlite
133b0 33 72 62 75 20 2a 70 2c 20 69 6e 74 20 2a 70 62  3rbu *p, int *pb
133c0 52 65 74 72 79 29 7b 0a 20 20 61 73 73 65 72 74  Retry){.  assert
133d0 28 20 70 2d 3e 72 63 20 7c 7c 20 28 70 2d 3e 64  ( p->rc || (p->d
133e0 62 4d 61 69 6e 3d 3d 30 20 26 26 20 70 2d 3e 64  bMain==0 && p->d
133f0 62 52 62 75 3d 3d 30 29 20 29 3b 0a 20 20 61 73  bRbu==0) );.  as
13400 73 65 72 74 28 20 70 2d 3e 72 63 20 7c 7c 20 72  sert( p->rc || r
13410 62 75 49 73 56 61 63 75 75 6d 28 70 29 20 7c 7c  buIsVacuum(p) ||
13420 20 70 2d 3e 7a 54 61 72 67 65 74 21 3d 30 20 29   p->zTarget!=0 )
13430 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65  ;..  /* Open the
13440 20 52 42 55 20 64 61 74 61 62 61 73 65 20 2a 2f   RBU database */
13450 0a 20 20 70 2d 3e 64 62 52 62 75 20 3d 20 72 62  .  p->dbRbu = rb
13460 75 4f 70 65 6e 44 62 68 61 6e 64 6c 65 28 70 2c  uOpenDbhandle(p,
13470 20 70 2d 3e 7a 52 62 75 2c 20 31 29 3b 0a 0a 20   p->zRbu, 1);.. 
13480 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
13490 54 45 5f 4f 4b 20 26 26 20 72 62 75 49 73 56 61  TE_OK && rbuIsVa
134a0 63 75 75 6d 28 70 29 20 29 7b 0a 20 20 20 20 73  cuum(p) ){.    s
134b0 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
134c0 72 6f 6c 28 70 2d 3e 64 62 52 62 75 2c 20 22 6d  rol(p->dbRbu, "m
134d0 61 69 6e 22 2c 20 53 51 4c 49 54 45 5f 46 43 4e  ain", SQLITE_FCN
134e0 54 4c 5f 52 42 55 43 4e 54 2c 20 28 76 6f 69 64  TL_RBUCNT, (void
134f0 2a 29 70 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  *)p);.    if( p-
13500 3e 7a 53 74 61 74 65 3d 3d 30 20 29 7b 0a 20 20  >zState==0 ){.  
13510 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
13520 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f  zFile = sqlite3_
13530 64 62 5f 66 69 6c 65 6e 61 6d 65 28 70 2d 3e 64  db_filename(p->d
13540 62 52 62 75 2c 20 22 6d 61 69 6e 22 29 3b 0a 20  bRbu, "main");. 
13550 20 20 20 20 20 70 2d 3e 7a 53 74 61 74 65 20 3d       p->zState =
13560 20 72 62 75 4d 50 72 69 6e 74 66 28 70 2c 20 22   rbuMPrintf(p, "
13570 66 69 6c 65 3a 2f 2f 25 73 2d 76 61 63 75 75 6d  file://%s-vacuum
13580 3f 6d 6f 64 65 6f 66 3d 25 73 22 2c 20 7a 46 69  ?modeof=%s", zFi
13590 6c 65 2c 20 7a 46 69 6c 65 29 3b 0a 20 20 20 20  le, zFile);.    
135a0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 75  }.  }..  /* If u
135b0 73 69 6e 67 20 73 65 70 61 72 61 74 65 20 52 42  sing separate RB
135c0 55 20 61 6e 64 20 73 74 61 74 65 20 64 61 74 61  U and state data
135d0 62 61 73 65 73 2c 20 61 74 74 61 63 68 20 74 68  bases, attach th
135e0 65 20 73 74 61 74 65 20 64 61 74 61 62 61 73 65  e state database
135f0 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 52 42 55   to.  ** the RBU
13600 20 64 62 20 68 61 6e 64 6c 65 20 6e 6f 77 2e 20   db handle now. 
13610 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 7a 53 74   */.  if( p->zSt
13620 61 74 65 20 29 7b 0a 20 20 20 20 72 62 75 4d 50  ate ){.    rbuMP
13630 72 69 6e 74 66 45 78 65 63 28 70 2c 20 70 2d 3e  rintfExec(p, p->
13640 64 62 52 62 75 2c 20 22 41 54 54 41 43 48 20 25  dbRbu, "ATTACH %
13650 51 20 41 53 20 73 74 61 74 22 2c 20 70 2d 3e 7a  Q AS stat", p->z
13660 53 74 61 74 65 29 3b 0a 20 20 20 20 6d 65 6d 63  State);.    memc
13670 70 79 28 70 2d 3e 7a 53 74 61 74 65 44 62 2c 20  py(p->zStateDb, 
13680 22 73 74 61 74 22 2c 20 34 29 3b 0a 20 20 7d 65  "stat", 4);.  }e
13690 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28  lse{.    memcpy(
136a0 70 2d 3e 7a 53 74 61 74 65 44 62 2c 20 22 6d 61  p->zStateDb, "ma
136b0 69 6e 22 2c 20 34 29 3b 0a 20 20 7d 0a 0a 23 69  in", 4);.  }..#i
136c0 66 20 30 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  f 0.  if( p->rc=
136d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 62  =SQLITE_OK && rb
136e0 75 49 73 56 61 63 75 75 6d 28 70 29 20 29 7b 0a  uIsVacuum(p) ){.
136f0 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69      p->rc = sqli
13700 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 52 62  te3_exec(p->dbRb
13710 75 2c 20 22 42 45 47 49 4e 22 2c 20 30 2c 20 30  u, "BEGIN", 0, 0
13720 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  , 0);.  }.#endif
13730 0a 0a 20 20 2f 2a 20 49 66 20 69 74 20 68 61 73  ..  /* If it has
13740 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65 65   not already bee
13750 6e 20 63 72 65 61 74 65 64 2c 20 63 72 65 61 74  n created, creat
13760 65 20 74 68 65 20 72 62 75 5f 73 74 61 74 65 20  e the rbu_state 
13770 74 61 62 6c 65 20 2a 2f 0a 20 20 72 62 75 4d 50  table */.  rbuMP
13780 72 69 6e 74 66 45 78 65 63 28 70 2c 20 70 2d 3e  rintfExec(p, p->
13790 64 62 52 62 75 2c 20 52 42 55 5f 43 52 45 41 54  dbRbu, RBU_CREAT
137a0 45 5f 53 54 41 54 45 2c 20 70 2d 3e 7a 53 74 61  E_STATE, p->zSta
137b0 74 65 44 62 29 3b 0a 0a 23 69 66 20 30 0a 20 20  teDb);..#if 0.  
137c0 69 66 28 20 72 62 75 49 73 56 61 63 75 75 6d 28  if( rbuIsVacuum(
137d0 70 29 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  p) ){.    if( p-
137e0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
137f0 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 32 3b  {.      int rc2;
13800 0a 20 20 20 20 20 20 69 6e 74 20 62 4f 6b 20 3d  .      int bOk =
13810 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   0;.      sqlite
13820 33 5f 73 74 6d 74 20 2a 70 43 6e 74 20 3d 20 30  3_stmt *pCnt = 0
13830 3b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20  ;.      p->rc = 
13840 70 72 65 70 61 72 65 41 6e 64 43 6f 6c 6c 65 63  prepareAndCollec
13850 74 45 72 72 6f 72 28 70 2d 3e 64 62 52 62 75 2c  tError(p->dbRbu,
13860 20 26 70 43 6e 74 2c 20 26 70 2d 3e 7a 45 72 72   &pCnt, &p->zErr
13870 6d 73 67 2c 0a 20 20 20 20 20 20 20 20 20 20 22  msg,.          "
13880 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
13890 46 52 4f 4d 20 73 74 61 74 2e 73 71 6c 69 74 65  FROM stat.sqlite
138a0 5f 6d 61 73 74 65 72 22 0a 20 20 20 20 20 20 29  _master".      )
138b0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72  ;.      if( p->r
138c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a 20 20  c==SQLITE_OK .  
138d0 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 5f       && sqlite3_
138e0 73 74 65 70 28 70 43 6e 74 29 3d 3d 53 51 4c 49  step(pCnt)==SQLI
138f0 54 45 5f 52 4f 57 0a 20 20 20 20 20 20 20 26 26  TE_ROW.       &&
13900 20 31 3d 3d 73 71 6c 69 74 65 33 5f 63 6f 6c 75   1==sqlite3_colu
13910 6d 6e 5f 69 6e 74 28 70 43 6e 74 2c 20 30 29 0a  mn_int(pCnt, 0).
13920 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
13930 20 62 4f 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20   bOk = 1;.      
13940 7d 0a 20 20 20 20 20 20 72 63 32 20 3d 20 73 71  }.      rc2 = sq
13950 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
13960 43 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Cnt);.      if( 
13970 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
13980 20 29 20 70 2d 3e 72 63 20 3d 20 72 63 32 3b 0a   ) p->rc = rc2;.
13990 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63  .      if( p->rc
139a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62  ==SQLITE_OK && b
139b0 4f 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Ok==0 ){.       
139c0 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
139d0 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 70  ERROR;.        p
139e0 2d 3e 7a 45 72 72 6d 73 67 20 3d 20 73 71 6c 69  ->zErrmsg = sqli
139f0 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 69 6e 76  te3_mprintf("inv
13a00 61 6c 69 64 20 73 74 61 74 65 20 64 61 74 61 62  alid state datab
13a10 61 73 65 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ase");.      }. 
13a20 20 20 20 0a 20 20 20 20 20 20 69 66 28 20 70 2d     .      if( p-
13a30 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
13a40 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20  {.        p->rc 
13a50 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70  = sqlite3_exec(p
13a60 2d 3e 64 62 52 62 75 2c 20 22 43 4f 4d 4d 49 54  ->dbRbu, "COMMIT
13a70 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ", 0, 0, 0);.   
13a80 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
13a90 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 2d 3e  endif..  if( p->
13aa0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
13ab0 20 72 62 75 49 73 56 61 63 75 75 6d 28 70 29 20   rbuIsVacuum(p) 
13ac0 29 7b 0a 20 20 20 20 69 6e 74 20 62 4f 70 65 6e  ){.    int bOpen
13ad0 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 63   = 0;.    int rc
13ae0 3b 0a 20 20 20 20 70 2d 3e 6e 52 62 75 20 3d 20  ;.    p->nRbu = 
13af0 30 3b 0a 20 20 20 20 70 2d 3e 70 52 62 75 46 64  0;.    p->pRbuFd
13b00 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73   = 0;.    rc = s
13b10 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
13b20 72 6f 6c 28 70 2d 3e 64 62 52 62 75 2c 20 22 6d  rol(p->dbRbu, "m
13b30 61 69 6e 22 2c 20 53 51 4c 49 54 45 5f 46 43 4e  ain", SQLITE_FCN
13b40 54 4c 5f 52 42 55 43 4e 54 2c 20 28 76 6f 69 64  TL_RBUCNT, (void
13b50 2a 29 70 29 3b 0a 20 20 20 20 69 66 28 20 72 63  *)p);.    if( rc
13b60 21 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  !=SQLITE_NOTFOUN
13b70 44 20 29 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a  D ) p->rc = rc;.
13b80 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74 61 67      if( p->eStag
13b90 65 3e 3d 52 42 55 5f 53 54 41 47 45 5f 4d 4f 56  e>=RBU_STAGE_MOV
13ba0 45 20 29 7b 0a 20 20 20 20 20 20 62 4f 70 65 6e  E ){.      bOpen
13bb0 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 1;.    }else{
13bc0 0a 20 20 20 20 20 20 52 62 75 53 74 61 74 65 20  .      RbuState 
13bd0 2a 70 53 74 61 74 65 20 3d 20 72 62 75 4c 6f 61  *pState = rbuLoa
13be0 64 53 74 61 74 65 28 70 29 3b 0a 20 20 20 20 20  dState(p);.     
13bf0 20 69 66 28 20 70 53 74 61 74 65 20 29 7b 0a 20   if( pState ){. 
13c00 20 20 20 20 20 20 20 62 4f 70 65 6e 20 3d 20 28         bOpen = (
13c10 70 53 74 61 74 65 2d 3e 65 53 74 61 67 65 3e 3d  pState->eStage>=
13c20 52 42 55 5f 53 54 41 47 45 5f 4d 4f 56 45 29 3b  RBU_STAGE_MOVE);
13c30 0a 20 20 20 20 20 20 20 20 72 62 75 46 72 65 65  .        rbuFree
13c40 53 74 61 74 65 28 70 53 74 61 74 65 29 3b 0a 20  State(pState);. 
13c50 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
13c60 20 69 66 28 20 62 4f 70 65 6e 20 29 20 70 2d 3e   if( bOpen ) p->
13c70 64 62 4d 61 69 6e 20 3d 20 72 62 75 4f 70 65 6e  dbMain = rbuOpen
13c80 44 62 68 61 6e 64 6c 65 28 70 2c 20 70 2d 3e 7a  Dbhandle(p, p->z
13c90 52 62 75 2c 20 70 2d 3e 6e 52 62 75 3c 3d 31 29  Rbu, p->nRbu<=1)
13ca0 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e 65 53 74 61  ;.  }..  p->eSta
13cb0 67 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d  ge = 0;.  if( p-
13cc0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
13cd0 26 20 70 2d 3e 64 62 4d 61 69 6e 3d 3d 30 20 29  & p->dbMain==0 )
13ce0 7b 0a 20 20 20 20 69 66 28 20 21 72 62 75 49 73  {.    if( !rbuIs
13cf0 56 61 63 75 75 6d 28 70 29 20 29 7b 0a 20 20 20  Vacuum(p) ){.   
13d00 20 20 20 70 2d 3e 64 62 4d 61 69 6e 20 3d 20 72     p->dbMain = r
13d10 62 75 4f 70 65 6e 44 62 68 61 6e 64 6c 65 28 70  buOpenDbhandle(p
13d20 2c 20 70 2d 3e 7a 54 61 72 67 65 74 2c 20 31 29  , p->zTarget, 1)
13d30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
13d40 70 2d 3e 70 52 62 75 46 64 2d 3e 70 57 61 6c 46  p->pRbuFd->pWalF
13d50 64 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  d ){.      if( p
13d60 62 52 65 74 72 79 20 29 7b 0a 20 20 20 20 20 20  bRetry ){.      
13d70 20 20 70 2d 3e 70 52 62 75 46 64 2d 3e 62 4e 6f    p->pRbuFd->bNo
13d80 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20  lock = 0;.      
13d90 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28    sqlite3_close(
13da0 70 2d 3e 64 62 52 62 75 29 3b 0a 20 20 20 20 20  p->dbRbu);.     
13db0 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65     sqlite3_close
13dc0 28 70 2d 3e 64 62 4d 61 69 6e 29 3b 0a 20 20 20  (p->dbMain);.   
13dd0 20 20 20 20 20 70 2d 3e 64 62 4d 61 69 6e 20 3d       p->dbMain =
13de0 20 30 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 64   0;.        p->d
13df0 62 52 62 75 20 3d 20 30 3b 0a 20 20 20 20 20 20  bRbu = 0;.      
13e00 20 20 2a 70 62 52 65 74 72 79 20 3d 20 31 3b 0a    *pbRetry = 1;.
13e10 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a          return;.
13e20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d        }.      p-
13e30 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52  >rc = SQLITE_ERR
13e40 4f 52 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 45 72  OR;.      p->zEr
13e50 72 6d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  rmsg = sqlite3_m
13e60 70 72 69 6e 74 66 28 22 63 61 6e 6e 6f 74 20 76  printf("cannot v
13e70 61 63 75 75 6d 20 77 61 6c 20 6d 6f 64 65 20 64  acuum wal mode d
13e80 61 74 61 62 61 73 65 22 29 3b 0a 20 20 20 20 7d  atabase");.    }
13e90 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72  else{.      char
13ea0 20 2a 7a 54 61 72 67 65 74 3b 0a 20 20 20 20 20   *zTarget;.     
13eb0 20 63 68 61 72 20 2a 7a 45 78 74 72 61 20 3d 20   char *zExtra = 
13ec0 30 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  0;.      if( str
13ed0 6c 65 6e 28 70 2d 3e 7a 52 62 75 29 3e 3d 35 20  len(p->zRbu)>=5 
13ee0 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 22 66 69  && 0==memcmp("fi
13ef0 6c 65 3a 22 2c 20 70 2d 3e 7a 52 62 75 2c 20 35  le:", p->zRbu, 5
13f00 29 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 45 78  ) ){.        zEx
13f10 74 72 61 20 3d 20 26 70 2d 3e 7a 52 62 75 5b 35  tra = &p->zRbu[5
13f20 5d 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  ];.        while
13f30 28 20 2a 7a 45 78 74 72 61 20 29 7b 0a 20 20 20  ( *zExtra ){.   
13f40 20 20 20 20 20 20 20 69 66 28 20 2a 7a 45 78 74         if( *zExt
13f50 72 61 2b 2b 3d 3d 27 3f 27 20 29 20 62 72 65 61  ra++=='?' ) brea
13f60 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
13f70 20 20 20 20 20 69 66 28 20 2a 7a 45 78 74 72 61       if( *zExtra
13f80 3d 3d 27 5c 30 27 20 29 20 7a 45 78 74 72 61 20  =='\0' ) zExtra 
13f90 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  = 0;.      }..  
13fa0 20 20 20 20 7a 54 61 72 67 65 74 20 3d 20 73 71      zTarget = sq
13fb0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 66  lite3_mprintf("f
13fc0 69 6c 65 3a 25 73 2d 76 61 63 75 75 6d 3f 72 62  ile:%s-vacuum?rb
13fd0 75 5f 6d 65 6d 6f 72 79 3d 31 25 73 25 73 22 2c  u_memory=1%s%s",
13fe0 20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69   .          sqli
13ff0 74 65 33 5f 64 62 5f 66 69 6c 65 6e 61 6d 65 28  te3_db_filename(
14000 70 2d 3e 64 62 52 62 75 2c 20 22 6d 61 69 6e 22  p->dbRbu, "main"
14010 29 2c 0a 20 20 20 20 20 20 20 20 20 20 28 7a 45  ),.          (zE
14020 78 74 72 61 3d 3d 30 20 3f 20 22 22 20 3a 20 22  xtra==0 ? "" : "
14030 26 22 29 2c 20 28 7a 45 78 74 72 61 3d 3d 30 20  &"), (zExtra==0 
14040 3f 20 22 22 20 3a 20 7a 45 78 74 72 61 29 0a 20  ? "" : zExtra). 
14050 20 20 20 20 20 29 3b 0a 0a 20 20 20 20 20 20 69       );..      i
14060 66 28 20 7a 54 61 72 67 65 74 3d 3d 30 20 29 7b  f( zTarget==0 ){
14070 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  .        p->rc =
14080 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
14090 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20         return;. 
140a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e       }.      p->
140b0 64 62 4d 61 69 6e 20 3d 20 72 62 75 4f 70 65 6e  dbMain = rbuOpen
140c0 44 62 68 61 6e 64 6c 65 28 70 2c 20 7a 54 61 72  Dbhandle(p, zTar
140d0 67 65 74 2c 20 70 2d 3e 6e 52 62 75 3c 3d 31 29  get, p->nRbu<=1)
140e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
140f0 66 72 65 65 28 7a 54 61 72 67 65 74 29 3b 0a 20  free(zTarget);. 
14100 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
14110 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
14120 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
14130 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
14140 75 6e 63 74 69 6f 6e 28 70 2d 3e 64 62 4d 61 69  unction(p->dbMai
14150 6e 2c 20 0a 20 20 20 20 20 20 20 20 22 72 62 75  n, .        "rbu
14160 5f 74 6d 70 5f 69 6e 73 65 72 74 22 2c 20 2d 31  _tmp_insert", -1
14170 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 28  , SQLITE_UTF8, (
14180 76 6f 69 64 2a 29 70 2c 20 72 62 75 54 6d 70 49  void*)p, rbuTmpI
14190 6e 73 65 72 74 46 75 6e 63 2c 20 30 2c 20 30 0a  nsertFunc, 0, 0.
141a0 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 69 66      );.  }..  if
141b0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
141c0 4f 4b 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  OK ){.    p->rc 
141d0 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
141e0 5f 66 75 6e 63 74 69 6f 6e 28 70 2d 3e 64 62 4d  _function(p->dbM
141f0 61 69 6e 2c 20 0a 20 20 20 20 20 20 20 20 22 72  ain, .        "r
14200 62 75 5f 66 6f 73 73 69 6c 5f 64 65 6c 74 61 22  bu_fossil_delta"
14210 2c 20 32 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  , 2, SQLITE_UTF8
14220 2c 20 30 2c 20 72 62 75 46 6f 73 73 69 6c 44 65  , 0, rbuFossilDe
14230 6c 74 61 46 75 6e 63 2c 20 30 2c 20 30 0a 20 20  ltaFunc, 0, 0.  
14240 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20    );.  }..  if( 
14250 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
14260 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
14270 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
14280 75 6e 63 74 69 6f 6e 28 70 2d 3e 64 62 52 62 75  unction(p->dbRbu
14290 2c 20 0a 20 20 20 20 20 20 20 20 22 72 62 75 5f  , .        "rbu_
142a0 74 61 72 67 65 74 5f 6e 61 6d 65 22 2c 20 2d 31  target_name", -1
142b0 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 28  , SQLITE_UTF8, (
142c0 76 6f 69 64 2a 29 70 2c 20 72 62 75 54 61 72 67  void*)p, rbuTarg
142d0 65 74 4e 61 6d 65 46 75 6e 63 2c 20 30 2c 20 30  etNameFunc, 0, 0
142e0 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 69  .    );.  }..  i
142f0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
14300 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63  _OK ){.    p->rc
14310 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f   = sqlite3_file_
14320 63 6f 6e 74 72 6f 6c 28 70 2d 3e 64 62 4d 61 69  control(p->dbMai
14330 6e 2c 20 22 6d 61 69 6e 22 2c 20 53 51 4c 49 54  n, "main", SQLIT
14340 45 5f 46 43 4e 54 4c 5f 52 42 55 2c 20 28 76 6f  E_FCNTL_RBU, (vo
14350 69 64 2a 29 70 29 3b 0a 20 20 7d 0a 20 20 72 62  id*)p);.  }.  rb
14360 75 4d 50 72 69 6e 74 66 45 78 65 63 28 70 2c 20  uMPrintfExec(p, 
14370 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 53 45 4c 45  p->dbMain, "SELE
14380 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65  CT * FROM sqlite
14390 5f 6d 61 73 74 65 72 22 29 3b 0a 0a 20 20 2f 2a  _master");..  /*
143a0 20 4d 61 72 6b 20 74 68 65 20 64 61 74 61 62 61   Mark the databa
143b0 73 65 20 66 69 6c 65 20 6a 75 73 74 20 6f 70 65  se file just ope
143c0 6e 65 64 20 61 73 20 61 6e 20 52 42 55 20 74 61  ned as an RBU ta
143d0 72 67 65 74 20 64 61 74 61 62 61 73 65 2e 20 49  rget database. I
143e0 66 20 0a 20 20 2a 2a 20 74 68 69 73 20 63 61 6c  f .  ** this cal
143f0 6c 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  l returns SQLITE
14400 5f 4e 4f 54 46 4f 55 4e 44 2c 20 74 68 65 6e 20  _NOTFOUND, then 
14410 74 68 65 20 52 42 55 20 76 66 73 20 69 73 20 6e  the RBU vfs is n
14420 6f 74 20 69 6e 20 75 73 65 2e 0a 20 20 2a 2a 20  ot in use..  ** 
14430 54 68 69 73 20 69 73 20 61 6e 20 65 72 72 6f 72  This is an error
14440 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 72  .  */.  if( p->r
14450 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
14460 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69      p->rc = sqli
14470 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
14480 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 6d 61 69  (p->dbMain, "mai
14490 6e 22 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  n", SQLITE_FCNTL
144a0 5f 52 42 55 2c 20 28 76 6f 69 64 2a 29 70 29 3b  _RBU, (void*)p);
144b0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72  .  }..  if( p->r
144c0 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  c==SQLITE_NOTFOU
144d0 4e 44 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  ND ){.    p->rc 
144e0 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
144f0 20 20 20 20 70 2d 3e 7a 45 72 72 6d 73 67 20 3d      p->zErrmsg =
14500 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
14510 28 22 72 62 75 20 76 66 73 20 6e 6f 74 20 66 6f  ("rbu vfs not fo
14520 75 6e 64 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  und");.  }.}../*
14530 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
14540 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68   is a copy of th
14550 65 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66  e sqlite3FileSuf
14560 66 69 78 33 28 29 20 72 6f 75 74 69 6e 65 20 66  fix3() routine f
14570 72 6f 6d 20 74 68 65 20 63 6f 72 65 2e 0a 2a 2a  rom the core..**
14580 20 49 74 20 69 73 20 61 20 6e 6f 2d 6f 70 20 75   It is a no-op u
14590 6e 6c 65 73 73 20 53 51 4c 49 54 45 5f 45 4e 41  nless SQLITE_ENA
145a0 42 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53 20 69 73  BLE_8_3_NAMES is
145b0 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20   defined..**.** 
145c0 49 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  If SQLITE_ENABLE
145d0 5f 38 5f 33 5f 4e 41 4d 45 53 20 69 73 20 73 65  _8_3_NAMES is se
145e0 74 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  t at compile-tim
145f0 65 20 61 6e 64 20 69 66 20 74 68 65 20 64 61 74  e and if the dat
14600 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 6e 61 6d  abase.** filenam
14610 65 20 69 6e 20 7a 42 61 73 65 46 69 6c 65 6e 61  e in zBaseFilena
14620 6d 65 20 69 73 20 61 20 55 52 49 20 77 69 74 68  me is a URI with
14630 20 74 68 65 20 22 38 5f 33 5f 6e 61 6d 65 73 3d   the "8_3_names=
14640 31 22 20 70 61 72 61 6d 65 74 65 72 20 61 6e 64  1" parameter and
14650 0a 2a 2a 20 69 66 20 66 69 6c 65 6e 61 6d 65 20  .** if filename 
14660 69 6e 20 7a 5b 5d 20 68 61 73 20 61 20 73 75 66  in z[] has a suf
14670 66 69 78 20 28 61 2e 6b 2e 61 2e 20 22 65 78 74  fix (a.k.a. "ext
14680 65 6e 73 69 6f 6e 22 29 20 74 68 61 74 20 69 73  ension") that is
14690 20 6c 6f 6e 67 65 72 20 74 68 61 6e 0a 2a 2a 20   longer than.** 
146a0 74 68 72 65 65 20 63 68 61 72 61 63 74 65 72 73  three characters
146b0 2c 20 74 68 65 6e 20 73 68 6f 72 74 65 6e 20 74  , then shorten t
146c0 68 65 20 73 75 66 66 69 78 20 6f 6e 20 7a 5b 5d  he suffix on z[]
146d0 20 74 6f 20 62 65 20 74 68 65 20 6c 61 73 74 20   to be the last 
146e0 74 68 72 65 65 0a 2a 2a 20 63 68 61 72 61 63 74  three.** charact
146f0 65 72 73 20 6f 66 20 74 68 65 20 6f 72 69 67 69  ers of the origi
14700 6e 61 6c 20 73 75 66 66 69 78 2e 0a 2a 2a 0a 2a  nal suffix..**.*
14710 2a 20 49 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  * If SQLITE_ENAB
14720 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53 20 69 73 20  LE_8_3_NAMES is 
14730 73 65 74 20 74 6f 20 32 20 61 74 20 63 6f 6d 70  set to 2 at comp
14740 69 6c 65 2d 74 69 6d 65 2c 20 74 68 65 6e 20 61  ile-time, then a
14750 6c 77 61 79 73 0a 2a 2a 20 64 6f 20 74 68 65 20  lways.** do the 
14760 73 75 66 66 69 78 20 73 68 6f 72 74 65 6e 69 6e  suffix shortenin
14770 67 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20  g regardless of 
14780 55 52 49 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a  URI parameter..*
14790 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 73 3a 0a 2a  *.** Examples:.*
147a0 2a 0a 2a 2a 20 20 20 20 20 74 65 73 74 2e 64 62  *.**     test.db
147b0 2d 6a 6f 75 72 6e 61 6c 20 20 20 20 3d 3e 20 20  -journal    =>  
147c0 20 74 65 73 74 2e 6e 61 6c 0a 2a 2a 20 20 20 20   test.nal.**    
147d0 20 74 65 73 74 2e 64 62 2d 77 61 6c 20 20 20 20   test.db-wal    
147e0 20 20 20 20 3d 3e 20 20 20 74 65 73 74 2e 77 61      =>   test.wa
147f0 6c 0a 2a 2a 20 20 20 20 20 74 65 73 74 2e 64 62  l.**     test.db
14800 2d 73 68 6d 20 20 20 20 20 20 20 20 3d 3e 20 20  -shm        =>  
14810 20 74 65 73 74 2e 73 68 6d 0a 2a 2a 20 20 20 20   test.shm.**    
14820 20 74 65 73 74 2e 64 62 2d 6d 6a 37 66 33 33 31   test.db-mj7f331
14830 39 66 61 20 3d 3e 20 20 20 74 65 73 74 2e 39 66  9fa =>   test.9f
14840 61 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  a.*/.static void
14850 20 72 62 75 46 69 6c 65 53 75 66 66 69 78 33 28   rbuFileSuffix3(
14860 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 61 73  const char *zBas
14870 65 2c 20 63 68 61 72 20 2a 7a 29 7b 0a 23 69 66  e, char *z){.#if
14880 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
14890 45 5f 38 5f 33 5f 4e 41 4d 45 53 0a 23 69 66 20  E_8_3_NAMES.#if 
148a0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 38 5f  SQLITE_ENABLE_8_
148b0 33 5f 4e 41 4d 45 53 3c 32 0a 20 20 69 66 28 20  3_NAMES<2.  if( 
148c0 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c  sqlite3_uri_bool
148d0 65 61 6e 28 7a 42 61 73 65 2c 20 22 38 5f 33 5f  ean(zBase, "8_3_
148e0 6e 61 6d 65 73 22 2c 20 30 29 20 29 0a 23 65 6e  names", 0) ).#en
148f0 64 69 66 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20  dif.  {.    int 
14900 69 2c 20 73 7a 3b 0a 20 20 20 20 73 7a 20 3d 20  i, sz;.    sz = 
14910 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 29 26 30  (int)strlen(z)&0
14920 78 66 66 66 66 66 66 3b 0a 20 20 20 20 66 6f 72  xffffff;.    for
14930 28 69 3d 73 7a 2d 31 3b 20 69 3e 30 20 26 26 20  (i=sz-1; i>0 && 
14940 7a 5b 69 5d 21 3d 27 2f 27 20 26 26 20 7a 5b 69  z[i]!='/' && z[i
14950 5d 21 3d 27 2e 27 3b 20 69 2d 2d 29 7b 7d 0a 20  ]!='.'; i--){}. 
14960 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 2e 27     if( z[i]=='.'
14970 20 26 26 20 73 7a 3e 69 2b 34 20 29 20 6d 65 6d   && sz>i+4 ) mem
14980 6d 6f 76 65 28 26 7a 5b 69 2b 31 5d 2c 20 26 7a  move(&z[i+1], &z
14990 5b 73 7a 2d 33 5d 2c 20 34 29 3b 0a 20 20 7d 0a  [sz-3], 4);.  }.
149a0 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
149b0 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65  Return the curre
149c0 6e 74 20 77 61 6c 2d 69 6e 64 65 78 20 68 65 61  nt wal-index hea
149d0 64 65 72 20 63 68 65 63 6b 73 75 6d 20 66 6f 72  der checksum for
149e0 20 74 68 65 20 74 61 72 67 65 74 20 64 61 74 61   the target data
149f0 62 61 73 65 20 0a 2a 2a 20 61 73 20 61 20 36 34  base .** as a 64
14a00 2d 62 69 74 20 69 6e 74 65 67 65 72 2e 0a 2a 2a  -bit integer..**
14a10 0a 2a 2a 20 54 68 65 20 63 68 65 63 6b 73 75 6d  .** The checksum
14a20 20 69 73 20 73 74 6f 72 65 20 69 6e 20 74 68 65   is store in the
14a30 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 78   first page of x
14a40 53 68 6d 4d 61 70 20 6d 65 6d 6f 72 79 20 61 73  ShmMap memory as
14a50 20 61 6e 20 38 2d 62 79 74 65 20 0a 2a 2a 20 62   an 8-byte .** b
14a60 6c 6f 62 20 73 74 61 72 74 69 6e 67 20 61 74 20  lob starting at 
14a70 62 79 74 65 20 6f 66 66 73 65 74 20 34 30 2e 0a  byte offset 40..
14a80 2a 2f 0a 73 74 61 74 69 63 20 69 36 34 20 72 62  */.static i64 rb
14a90 75 53 68 6d 43 68 65 63 6b 73 75 6d 28 73 71 6c  uShmChecksum(sql
14aa0 69 74 65 33 72 62 75 20 2a 70 29 7b 0a 20 20 69  ite3rbu *p){.  i
14ab0 36 34 20 69 52 65 74 20 3d 20 30 3b 0a 20 20 69  64 iRet = 0;.  i
14ac0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
14ad0 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
14ae0 65 33 5f 66 69 6c 65 20 2a 70 44 62 20 3d 20 70  e3_file *pDb = p
14af0 2d 3e 70 54 61 72 67 65 74 46 64 2d 3e 70 52 65  ->pTargetFd->pRe
14b00 61 6c 3b 0a 20 20 20 20 75 33 32 20 76 6f 6c 61  al;.    u32 vola
14b10 74 69 6c 65 20 2a 70 74 72 3b 0a 20 20 20 20 70  tile *ptr;.    p
14b20 2d 3e 72 63 20 3d 20 70 44 62 2d 3e 70 4d 65 74  ->rc = pDb->pMet
14b30 68 6f 64 73 2d 3e 78 53 68 6d 4d 61 70 28 70 44  hods->xShmMap(pD
14b40 62 2c 20 30 2c 20 33 32 2a 31 30 32 34 2c 20 30  b, 0, 32*1024, 0
14b50 2c 20 28 76 6f 69 64 20 76 6f 6c 61 74 69 6c 65  , (void volatile
14b60 2a 2a 29 26 70 74 72 29 3b 0a 20 20 20 20 69 66  **)&ptr);.    if
14b70 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
14b80 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 52 65 74  OK ){.      iRet
14b90 20 3d 20 28 28 69 36 34 29 70 74 72 5b 31 30 5d   = ((i64)ptr[10]
14ba0 20 3c 3c 20 33 32 29 20 2b 20 70 74 72 5b 31 31   << 32) + ptr[11
14bb0 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  ];.    }.  }.  r
14bc0 65 74 75 72 6e 20 69 52 65 74 3b 0a 7d 0a 0a 2f  eturn iRet;.}../
14bd0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
14be0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 73 20  on is called as 
14bf0 70 61 72 74 20 6f 66 20 69 6e 69 74 69 61 6c 69  part of initiali
14c00 7a 69 6e 67 20 6f 72 20 72 65 69 6e 69 74 69 61  zing or reinitia
14c10 6c 69 7a 69 6e 67 20 61 6e 0a 2a 2a 20 69 6e 63  lizing an.** inc
14c20 72 65 6d 65 6e 74 61 6c 20 63 68 65 63 6b 70 6f  remental checkpo
14c30 69 6e 74 2e 20 0a 2a 2a 0a 2a 2a 20 49 74 20 70  int. .**.** It p
14c40 6f 70 75 6c 61 74 65 73 20 74 68 65 20 73 71 6c  opulates the sql
14c50 69 74 65 33 72 62 75 2e 61 46 72 61 6d 65 5b 5d  ite3rbu.aFrame[]
14c60 20 61 72 72 61 79 20 77 69 74 68 20 74 68 65 20   array with the 
14c70 73 65 74 20 6f 66 20 0a 2a 2a 20 28 77 61 6c 20  set of .** (wal 
14c80 66 72 61 6d 65 20 2d 3e 20 64 62 20 70 61 67 65  frame -> db page
14c90 29 20 63 6f 70 79 20 6f 70 65 72 61 74 69 6f 6e  ) copy operation
14ca0 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 63 68  s required to ch
14cb0 65 63 6b 70 6f 69 6e 74 20 74 68 65 20 0a 2a 2a  eckpoint the .**
14cc0 20 63 75 72 72 65 6e 74 20 77 61 6c 20 66 69 6c   current wal fil
14cd0 65 2c 20 61 6e 64 20 6f 62 74 61 69 6e 73 20 74  e, and obtains t
14ce0 68 65 20 73 65 74 20 6f 66 20 73 68 6d 20 6c 6f  he set of shm lo
14cf0 63 6b 73 20 72 65 71 75 69 72 65 64 20 74 6f 20  cks required to 
14d00 73 61 66 65 6c 79 20 0a 2a 2a 20 70 65 72 66 6f  safely .** perfo
14d10 72 6d 20 74 68 65 20 63 6f 70 79 20 6f 70 65 72  rm the copy oper
14d20 61 74 69 6f 6e 73 20 64 69 72 65 63 74 6c 79 20  ations directly 
14d30 6f 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  on the file-syst
14d40 65 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67  em..**.** If arg
14d50 75 6d 65 6e 74 20 70 53 74 61 74 65 20 69 73 20  ument pState is 
14d60 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74  not NULL, then t
14d70 68 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 63  he incremental c
14d80 68 65 63 6b 70 6f 69 6e 74 20 69 73 0a 2a 2a 20  heckpoint is.** 
14d90 62 65 69 6e 67 20 72 65 73 75 6d 65 64 2e 20 49  being resumed. I
14da0 6e 20 74 68 69 73 20 63 61 73 65 2c 20 69 66 20  n this case, if 
14db0 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6f 66 20  the checksum of 
14dc0 74 68 65 20 77 61 6c 2d 69 6e 64 65 78 2d 68 65  the wal-index-he
14dd0 61 64 65 72 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  ader.** followin
14de0 67 20 72 65 63 6f 76 65 72 79 20 69 73 20 6e 6f  g recovery is no
14df0 74 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  t the same as th
14e00 65 20 63 68 65 63 6b 73 75 6d 20 73 61 76 65 64  e checksum saved
14e10 20 69 6e 20 74 68 65 20 52 62 75 53 74 61 74 65   in the RbuState
14e20 0a 2a 2a 20 6f 62 6a 65 63 74 2c 20 74 68 65 6e  .** object, then
14e30 20 74 68 65 20 72 62 75 20 68 61 6e 64 6c 65 20   the rbu handle 
14e40 69 73 20 73 65 74 20 74 6f 20 44 4f 4e 45 20 73  is set to DONE s
14e50 74 61 74 65 2e 20 54 68 69 73 20 6f 63 63 75 72  tate. This occur
14e60 73 20 69 66 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68  s if some.** oth
14e70 65 72 20 63 6c 69 65 6e 74 20 61 70 70 65 6e 64  er client append
14e80 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  s a transaction 
14e90 74 6f 20 74 68 65 20 77 61 6c 20 66 69 6c 65 20  to the wal file 
14ea0 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66  in the middle of
14eb0 0a 2a 2a 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74  .** an increment
14ec0 61 6c 20 63 68 65 63 6b 70 6f 69 6e 74 2e 0a 2a  al checkpoint..*
14ed0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62  /.static void rb
14ee0 75 53 65 74 75 70 43 68 65 63 6b 70 6f 69 6e 74  uSetupCheckpoint
14ef0 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20  (sqlite3rbu *p, 
14f00 52 62 75 53 74 61 74 65 20 2a 70 53 74 61 74 65  RbuState *pState
14f10 29 7b 0a 0a 20 20 2f 2a 20 49 66 20 70 53 74 61  ){..  /* If pSta
14f20 74 65 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e  te is NULL, then
14f30 20 74 68 65 20 77 61 6c 20 66 69 6c 65 20 6d 61   the wal file ma
14f40 79 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20  y not have been 
14f50 6f 70 65 6e 65 64 20 61 6e 64 0a 20 20 2a 2a 20  opened and.  ** 
14f60 72 65 63 6f 76 65 72 65 64 2e 20 52 75 6e 6e 69  recovered. Runni
14f70 6e 67 20 61 20 72 65 61 64 2d 73 74 61 74 65 6d  ng a read-statem
14f80 65 6e 74 20 68 65 72 65 20 74 6f 20 65 6e 73 75  ent here to ensu
14f90 72 65 20 74 68 61 74 20 64 6f 69 6e 67 20 73 6f  re that doing so
14fa0 0a 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 69  .  ** does not i
14fb0 6e 74 65 72 66 65 72 65 20 77 69 74 68 20 74 68  nterfere with th
14fc0 65 20 22 63 61 70 74 75 72 65 22 20 70 72 6f 63  e "capture" proc
14fd0 65 73 73 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20  ess below.  */. 
14fe0 20 69 66 28 20 70 53 74 61 74 65 3d 3d 30 20 29   if( pState==0 )
14ff0 7b 0a 20 20 20 20 70 2d 3e 65 53 74 61 67 65 20  {.    p->eStage 
15000 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  = 0;.    if( p->
15010 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
15020 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73  .      p->rc = s
15030 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
15040 62 4d 61 69 6e 2c 20 22 53 45 4c 45 43 54 20 2a  bMain, "SELECT *
15050 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73   FROM sqlite_mas
15060 74 65 72 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  ter", 0, 0, 0);.
15070 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
15080 41 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72 6f  Assuming no erro
15090 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 2c 20  r has occurred, 
150a0 72 75 6e 20 61 20 22 72 65 73 74 61 72 74 22 20  run a "restart" 
150b0 63 68 65 63 6b 70 6f 69 6e 74 20 77 69 74 68 20  checkpoint with 
150c0 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  the.  ** sqlite3
150d0 72 62 75 2e 65 53 74 61 67 65 20 76 61 72 69 61  rbu.eStage varia
150e0 62 6c 65 20 73 65 74 20 74 6f 20 43 41 50 54 55  ble set to CAPTU
150f0 52 45 2e 20 54 68 69 73 20 74 75 72 6e 73 20 6f  RE. This turns o
15100 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  n the following.
15110 20 20 2a 2a 20 73 70 65 63 69 61 6c 20 62 65 68    ** special beh
15120 61 76 69 6f 75 72 20 69 6e 20 74 68 65 20 72 62  aviour in the rb
15130 75 20 56 46 53 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  u VFS:.  **.  **
15140 20 20 20 2a 20 49 66 20 74 68 65 20 65 78 63 6c     * If the excl
15150 75 73 69 76 65 20 73 68 6d 20 57 52 49 54 45 52  usive shm WRITER
15160 20 6f 72 20 52 45 41 44 30 20 6c 6f 63 6b 20 63   or READ0 lock c
15170 61 6e 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65  annot be obtaine
15180 64 2c 0a 20 20 2a 2a 20 20 20 20 20 74 68 65 20  d,.  **     the 
15190 63 68 65 63 6b 70 6f 69 6e 74 20 66 61 69 6c 73  checkpoint fails
151a0 20 77 69 74 68 20 53 51 4c 49 54 45 5f 42 55 53   with SQLITE_BUS
151b0 59 20 28 6e 6f 72 6d 61 6c 6c 79 20 53 51 4c 69  Y (normally SQLi
151c0 74 65 20 77 6f 75 6c 64 0a 20 20 2a 2a 20 20 20  te would.  **   
151d0 20 20 70 72 6f 63 65 65 64 20 77 69 74 68 20 72    proceed with r
151e0 75 6e 6e 69 6e 67 20 61 20 70 61 73 73 69 76 65  unning a passive
151f0 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 6e 73 74   checkpoint inst
15200 65 61 64 20 6f 66 20 66 61 69 6c 69 6e 67 29 2e  ead of failing).
15210 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 41  .  **.  **   * A
15220 74 74 65 6d 70 74 73 20 74 6f 20 72 65 61 64 20  ttempts to read 
15230 66 72 6f 6d 20 74 68 65 20 2a 2d 77 61 6c 20 66  from the *-wal f
15240 69 6c 65 20 6f 72 20 77 72 69 74 65 20 74 6f 20  ile or write to 
15250 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
15260 65 0a 20 20 2a 2a 20 20 20 20 20 64 6f 20 6e 6f  e.  **     do no
15270 74 20 70 65 72 66 6f 72 6d 20 61 6e 79 20 49 4f  t perform any IO
15280 2e 20 49 6e 73 74 65 61 64 2c 20 74 68 65 20 66  . Instead, the f
15290 72 61 6d 65 2f 70 61 67 65 20 63 6f 6d 62 69 6e  rame/page combin
152a0 61 74 69 6f 6e 73 20 74 68 61 74 0a 20 20 2a 2a  ations that.  **
152b0 20 20 20 20 20 77 6f 75 6c 64 20 62 65 20 72 65       would be re
152c0 61 64 2f 77 72 69 74 74 65 6e 20 61 72 65 20 72  ad/written are r
152d0 65 63 6f 72 64 65 64 20 69 6e 20 74 68 65 20 73  ecorded in the s
152e0 71 6c 69 74 65 33 72 62 75 2e 61 46 72 61 6d 65  qlite3rbu.aFrame
152f0 5b 5d 0a 20 20 2a 2a 20 20 20 20 20 61 72 72 61  [].  **     arra
15300 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a  y..  **.  **   *
15310 20 43 61 6c 6c 73 20 74 6f 20 78 53 68 6d 4c 6f   Calls to xShmLo
15320 63 6b 28 55 4e 4c 4f 43 4b 29 20 74 6f 20 72 65  ck(UNLOCK) to re
15330 6c 65 61 73 65 20 74 68 65 20 65 78 63 6c 75 73  lease the exclus
15340 69 76 65 20 73 68 6d 20 57 52 49 54 45 52 2c 20  ive shm WRITER, 
15350 0a 20 20 2a 2a 20 20 20 20 20 52 45 41 44 30 20  .  **     READ0 
15360 61 6e 64 20 43 48 45 43 4b 50 4f 49 4e 54 20 6c  and CHECKPOINT l
15370 6f 63 6b 73 20 74 61 6b 65 6e 20 61 73 20 70 61  ocks taken as pa
15380 72 74 20 6f 66 20 74 68 65 20 63 68 65 63 6b 70  rt of the checkp
15390 6f 69 6e 74 20 61 72 65 0a 20 20 2a 2a 20 20 20  oint are.  **   
153a0 20 20 6e 6f 2d 6f 70 73 2e 20 54 68 65 73 65 20    no-ops. These 
153b0 6c 6f 63 6b 73 20 77 69 6c 6c 20 6e 6f 74 20 62  locks will not b
153c0 65 20 72 65 6c 65 61 73 65 64 20 75 6e 74 69 6c  e released until
153d0 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a   the connection.
153e0 20 20 2a 2a 20 20 20 20 20 69 73 20 63 6c 6f 73    **     is clos
153f0 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ed..  **.  **   
15400 2a 20 41 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  * Attempting to 
15410 78 53 79 6e 63 28 29 20 74 68 65 20 64 61 74 61  xSync() the data
15420 62 61 73 65 20 66 69 6c 65 20 63 61 75 73 65 73  base file causes
15430 20 61 6e 20 53 51 4c 49 54 45 5f 49 4e 54 45 52   an SQLITE_INTER
15440 4e 41 4c 20 0a 20 20 2a 2a 20 20 20 20 20 65 72  NAL .  **     er
15450 72 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  ror..  **.  ** A
15460 73 20 61 20 72 65 73 75 6c 74 2c 20 75 6e 6c 65  s a result, unle
15470 73 73 20 61 6e 20 65 72 72 6f 72 20 28 69 2e 65  ss an error (i.e
15480 2e 20 4f 4f 4d 20 6f 72 20 53 51 4c 49 54 45 5f  . OOM or SQLITE_
15490 42 55 53 59 29 20 6f 63 63 75 72 73 2c 20 74 68  BUSY) occurs, th
154a0 65 0a 20 20 2a 2a 20 63 68 65 63 6b 70 6f 69 6e  e.  ** checkpoin
154b0 74 20 62 65 6c 6f 77 20 66 61 69 6c 73 20 77 69  t below fails wi
154c0 74 68 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e  th SQLITE_INTERN
154d0 41 4c 2c 20 61 6e 64 20 6c 65 61 76 65 73 20 74  AL, and leaves t
154e0 68 65 20 61 46 72 61 6d 65 5b 5d 0a 20 20 2a 2a  he aFrame[].  **
154f0 20 61 72 72 61 79 20 70 6f 70 75 6c 61 74 65 64   array populated
15500 20 77 69 74 68 20 61 20 73 65 74 20 6f 66 20 28   with a set of (
15510 66 72 61 6d 65 20 2d 3e 20 70 61 67 65 29 20 6d  frame -> page) m
15520 61 70 70 69 6e 67 73 2e 20 42 65 63 61 75 73 65  appings. Because
15530 20 74 68 65 20 0a 20 20 2a 2a 20 57 52 49 54 45   the .  ** WRITE
15540 52 2c 20 43 48 45 43 4b 50 4f 49 4e 54 20 61 6e  R, CHECKPOINT an
15550 64 20 52 45 41 44 30 20 6c 6f 63 6b 73 20 61 72  d READ0 locks ar
15560 65 20 73 74 69 6c 6c 20 68 65 6c 64 2c 20 69 74  e still held, it
15570 20 69 73 20 73 61 66 65 20 74 6f 20 63 6f 70 79   is safe to copy
15580 20 0a 20 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d   .  ** data from
15590 20 74 68 65 20 77 61 6c 20 66 69 6c 65 20 69 6e   the wal file in
155a0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
155b0 66 69 6c 65 20 61 63 63 6f 72 64 69 6e 67 20 74  file according t
155c0 6f 20 74 68 65 20 0a 20 20 2a 2a 20 63 6f 6e 74  o the .  ** cont
155d0 65 6e 74 73 20 6f 66 20 61 46 72 61 6d 65 5b 5d  ents of aFrame[]
155e0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
155f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
15600 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 20 20  .    int rc2;.  
15610 20 20 70 2d 3e 65 53 74 61 67 65 20 3d 20 52 42    p->eStage = RB
15620 55 5f 53 54 41 47 45 5f 43 41 50 54 55 52 45 3b  U_STAGE_CAPTURE;
15630 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74  .    rc2 = sqlit
15640 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 4d 61 69  e3_exec(p->dbMai
15650 6e 2c 20 22 50 52 41 47 4d 41 20 6d 61 69 6e 2e  n, "PRAGMA main.
15660 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 3d 72  wal_checkpoint=r
15670 65 73 74 61 72 74 22 2c 20 30 2c 20 30 2c 30 29  estart", 0, 0,0)
15680 3b 0a 20 20 20 20 69 66 28 20 72 63 32 21 3d 53  ;.    if( rc2!=S
15690 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c 20 29  QLITE_INTERNAL )
156a0 20 70 2d 3e 72 63 20 3d 20 72 63 32 3b 0a 20 20   p->rc = rc2;.  
156b0 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  }..  if( p->rc==
156c0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e  SQLITE_OK && p->
156d0 6e 46 72 61 6d 65 3e 30 20 29 7b 0a 20 20 20 20  nFrame>0 ){.    
156e0 70 2d 3e 65 53 74 61 67 65 20 3d 20 52 42 55 5f  p->eStage = RBU_
156f0 53 54 41 47 45 5f 43 4b 50 54 3b 0a 20 20 20 20  STAGE_CKPT;.    
15700 70 2d 3e 6e 53 74 65 70 20 3d 20 28 70 53 74 61  p->nStep = (pSta
15710 74 65 20 3f 20 70 53 74 61 74 65 2d 3e 6e 52 6f  te ? pState->nRo
15720 77 20 3a 20 30 29 3b 0a 20 20 20 20 70 2d 3e 61  w : 0);.    p->a
15730 42 75 66 20 3d 20 72 62 75 4d 61 6c 6c 6f 63 28  Buf = rbuMalloc(
15740 70 2c 20 70 2d 3e 70 67 73 7a 29 3b 0a 20 20 20  p, p->pgsz);.   
15750 20 70 2d 3e 69 57 61 6c 43 6b 73 75 6d 20 3d 20   p->iWalCksum = 
15760 72 62 75 53 68 6d 43 68 65 63 6b 73 75 6d 28 70  rbuShmChecksum(p
15770 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d  );.  }..  if( p-
15780 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
15790 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 46 72  {.    if( p->nFr
157a0 61 6d 65 3d 3d 30 20 7c 7c 20 28 70 53 74 61 74  ame==0 || (pStat
157b0 65 20 26 26 20 70 53 74 61 74 65 2d 3e 69 57 61  e && pState->iWa
157c0 6c 43 6b 73 75 6d 21 3d 70 2d 3e 69 57 61 6c 43  lCksum!=p->iWalC
157d0 6b 73 75 6d 29 20 29 7b 0a 20 20 20 20 20 20 70  ksum) ){.      p
157e0 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f  ->rc = SQLITE_DO
157f0 4e 45 3b 0a 20 20 20 20 20 20 70 2d 3e 65 53 74  NE;.      p->eSt
15800 61 67 65 20 3d 20 52 42 55 5f 53 54 41 47 45 5f  age = RBU_STAGE_
15810 44 4f 4e 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  DONE;.    }else{
15820 0a 20 20 20 20 20 20 69 6e 74 20 6e 53 65 63 74  .      int nSect
15830 6f 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 73 71  orSize;.      sq
15840 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 44 62 20  lite3_file *pDb 
15850 3d 20 70 2d 3e 70 54 61 72 67 65 74 46 64 2d 3e  = p->pTargetFd->
15860 70 52 65 61 6c 3b 0a 20 20 20 20 20 20 73 71 6c  pReal;.      sql
15870 69 74 65 33 5f 66 69 6c 65 20 2a 70 57 61 6c 20  ite3_file *pWal 
15880 3d 20 70 2d 3e 70 54 61 72 67 65 74 46 64 2d 3e  = p->pTargetFd->
15890 70 57 61 6c 46 64 2d 3e 70 52 65 61 6c 3b 0a 20  pWalFd->pReal;. 
158a0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
158b0 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 3d 3d  nPagePerSector==
158c0 30 20 29 3b 0a 20 20 20 20 20 20 6e 53 65 63 74  0 );.      nSect
158d0 6f 72 53 69 7a 65 20 3d 20 70 44 62 2d 3e 70 4d  orSize = pDb->pM
158e0 65 74 68 6f 64 73 2d 3e 78 53 65 63 74 6f 72 53  ethods->xSectorS
158f0 69 7a 65 28 70 44 62 29 3b 0a 20 20 20 20 20 20  ize(pDb);.      
15900 69 66 28 20 6e 53 65 63 74 6f 72 53 69 7a 65 3e  if( nSectorSize>
15910 70 2d 3e 70 67 73 7a 20 29 7b 0a 20 20 20 20 20  p->pgsz ){.     
15920 20 20 20 70 2d 3e 6e 50 61 67 65 50 65 72 53 65     p->nPagePerSe
15930 63 74 6f 72 20 3d 20 6e 53 65 63 74 6f 72 53 69  ctor = nSectorSi
15940 7a 65 20 2f 20 70 2d 3e 70 67 73 7a 3b 0a 20 20  ze / p->pgsz;.  
15950 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15960 20 20 20 70 2d 3e 6e 50 61 67 65 50 65 72 53 65     p->nPagePerSe
15970 63 74 6f 72 20 3d 20 31 3b 0a 20 20 20 20 20 20  ctor = 1;.      
15980 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 61 6c 6c  }..      /* Call
15990 20 78 53 79 6e 63 28 29 20 6f 6e 20 74 68 65 20   xSync() on the 
159a0 77 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 63  wal file. This c
159b0 61 75 73 65 73 20 53 51 4c 69 74 65 20 74 6f 20  auses SQLite to 
159c0 73 79 6e 63 20 74 68 65 20 0a 20 20 20 20 20 20  sync the .      
159d0 2a 2a 20 64 69 72 65 63 74 6f 72 79 20 69 6e 20  ** directory in 
159e0 77 68 69 63 68 20 74 68 65 20 74 61 72 67 65 74  which the target
159f0 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74 68   database and th
15a00 65 20 77 61 6c 20 66 69 6c 65 20 72 65 73 69 64  e wal file resid
15a10 65 2c 20 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20  e, in .      ** 
15a20 63 61 73 65 20 69 74 20 68 61 73 20 6e 6f 74 20  case it has not 
15a30 62 65 65 6e 20 73 79 6e 63 65 64 20 73 69 6e 63  been synced sinc
15a40 65 20 74 68 65 20 72 65 6e 61 6d 65 28 29 20 63  e the rename() c
15a50 61 6c 6c 20 69 6e 20 0a 20 20 20 20 20 20 2a 2a  all in .      **
15a60 20 72 62 75 4d 6f 76 65 4f 61 6c 46 69 6c 65 28   rbuMoveOalFile(
15a70 29 2e 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 72  ). */.      p->r
15a80 63 20 3d 20 70 57 61 6c 2d 3e 70 4d 65 74 68 6f  c = pWal->pMetho
15a90 64 73 2d 3e 78 53 79 6e 63 28 70 57 61 6c 2c 20  ds->xSync(pWal, 
15aa0 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
15ab0 41 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  AL);.    }.  }.}
15ac0 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 65 64 20 77  ../*.** Called w
15ad0 68 65 6e 20 69 41 6d 74 20 62 79 74 65 73 20 61  hen iAmt bytes a
15ae0 72 65 20 72 65 61 64 20 66 72 6f 6d 20 6f 66 66  re read from off
15af0 73 65 74 20 69 4f 66 66 20 6f 66 20 74 68 65 20  set iOff of the 
15b00 77 61 6c 20 66 69 6c 65 20 77 68 69 6c 65 0a 2a  wal file while.*
15b10 2a 20 74 68 65 20 72 62 75 20 6f 62 6a 65 63 74  * the rbu object
15b20 20 69 73 20 69 6e 20 63 61 70 74 75 72 65 20 6d   is in capture m
15b30 6f 64 65 2e 20 52 65 63 6f 72 64 20 74 68 65 20  ode. Record the 
15b40 66 72 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20  frame number of 
15b50 74 68 65 20 66 72 61 6d 65 0a 2a 2a 20 62 65 69  the frame.** bei
15b60 6e 67 20 72 65 61 64 20 69 6e 20 74 68 65 20 61  ng read in the a
15b70 46 72 61 6d 65 5b 5d 20 61 72 72 61 79 2e 0a 2a  Frame[] array..*
15b80 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62 75  /.static int rbu
15b90 43 61 70 74 75 72 65 57 61 6c 52 65 61 64 28 73  CaptureWalRead(s
15ba0 71 6c 69 74 65 33 72 62 75 20 2a 70 52 62 75 2c  qlite3rbu *pRbu,
15bb0 20 69 36 34 20 69 4f 66 66 2c 20 69 6e 74 20 69   i64 iOff, int i
15bc0 41 6d 74 29 7b 0a 20 20 63 6f 6e 73 74 20 75 33  Amt){.  const u3
15bd0 32 20 6d 52 65 71 20 3d 20 28 31 3c 3c 57 41 4c  2 mReq = (1<<WAL
15be0 5f 4c 4f 43 4b 5f 57 52 49 54 45 29 7c 28 31 3c  _LOCK_WRITE)|(1<
15bf0 3c 57 41 4c 5f 4c 4f 43 4b 5f 43 4b 50 54 29 7c  <WAL_LOCK_CKPT)|
15c00 28 31 3c 3c 57 41 4c 5f 4c 4f 43 4b 5f 52 45 41  (1<<WAL_LOCK_REA
15c10 44 30 29 3b 0a 20 20 75 33 32 20 69 46 72 61 6d  D0);.  u32 iFram
15c20 65 3b 0a 0a 20 20 69 66 28 20 70 52 62 75 2d 3e  e;..  if( pRbu->
15c30 6d 4c 6f 63 6b 21 3d 6d 52 65 71 20 29 7b 0a 20  mLock!=mReq ){. 
15c40 20 20 20 70 52 62 75 2d 3e 72 63 20 3d 20 53 51     pRbu->rc = SQ
15c50 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 72  LITE_BUSY;.    r
15c60 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4e 54  eturn SQLITE_INT
15c70 45 52 4e 41 4c 3b 0a 20 20 7d 0a 0a 20 20 70 52  ERNAL;.  }..  pR
15c80 62 75 2d 3e 70 67 73 7a 20 3d 20 69 41 6d 74 3b  bu->pgsz = iAmt;
15c90 0a 20 20 69 66 28 20 70 52 62 75 2d 3e 6e 46 72  .  if( pRbu->nFr
15ca0 61 6d 65 3d 3d 70 52 62 75 2d 3e 6e 46 72 61 6d  ame==pRbu->nFram
15cb0 65 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 69 6e  eAlloc ){.    in
15cc0 74 20 6e 4e 65 77 20 3d 20 28 70 52 62 75 2d 3e  t nNew = (pRbu->
15cd0 6e 46 72 61 6d 65 41 6c 6c 6f 63 20 3f 20 70 52  nFrameAlloc ? pR
15ce0 62 75 2d 3e 6e 46 72 61 6d 65 41 6c 6c 6f 63 20  bu->nFrameAlloc 
15cf0 3a 20 36 34 29 20 2a 20 32 3b 0a 20 20 20 20 52  : 64) * 2;.    R
15d00 62 75 46 72 61 6d 65 20 2a 61 4e 65 77 3b 0a 20  buFrame *aNew;. 
15d10 20 20 20 61 4e 65 77 20 3d 20 28 52 62 75 46 72     aNew = (RbuFr
15d20 61 6d 65 2a 29 73 71 6c 69 74 65 33 5f 72 65 61  ame*)sqlite3_rea
15d30 6c 6c 6f 63 36 34 28 70 52 62 75 2d 3e 61 46 72  lloc64(pRbu->aFr
15d40 61 6d 65 2c 20 6e 4e 65 77 20 2a 20 73 69 7a 65  ame, nNew * size
15d50 6f 66 28 52 62 75 46 72 61 6d 65 29 29 3b 0a 20  of(RbuFrame));. 
15d60 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29     if( aNew==0 )
15d70 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
15d80 4f 4d 45 4d 3b 0a 20 20 20 20 70 52 62 75 2d 3e  OMEM;.    pRbu->
15d90 61 46 72 61 6d 65 20 3d 20 61 4e 65 77 3b 0a 20  aFrame = aNew;. 
15da0 20 20 20 70 52 62 75 2d 3e 6e 46 72 61 6d 65 41     pRbu->nFrameA
15db0 6c 6c 6f 63 20 3d 20 6e 4e 65 77 3b 0a 20 20 7d  lloc = nNew;.  }
15dc0 0a 0a 20 20 69 46 72 61 6d 65 20 3d 20 28 75 33  ..  iFrame = (u3
15dd0 32 29 28 28 69 4f 66 66 2d 33 32 29 20 2f 20 28  2)((iOff-32) / (
15de0 69 36 34 29 28 69 41 6d 74 2b 32 34 29 29 20 2b  i64)(iAmt+24)) +
15df0 20 31 3b 0a 20 20 69 66 28 20 70 52 62 75 2d 3e   1;.  if( pRbu->
15e00 69 4d 61 78 46 72 61 6d 65 3c 69 46 72 61 6d 65  iMaxFrame<iFrame
15e10 20 29 20 70 52 62 75 2d 3e 69 4d 61 78 46 72 61   ) pRbu->iMaxFra
15e20 6d 65 20 3d 20 69 46 72 61 6d 65 3b 0a 20 20 70  me = iFrame;.  p
15e30 52 62 75 2d 3e 61 46 72 61 6d 65 5b 70 52 62 75  Rbu->aFrame[pRbu
15e40 2d 3e 6e 46 72 61 6d 65 5d 2e 69 57 61 6c 46 72  ->nFrame].iWalFr
15e50 61 6d 65 20 3d 20 69 46 72 61 6d 65 3b 0a 20 20  ame = iFrame;.  
15e60 70 52 62 75 2d 3e 61 46 72 61 6d 65 5b 70 52 62  pRbu->aFrame[pRb
15e70 75 2d 3e 6e 46 72 61 6d 65 5d 2e 69 44 62 50 61  u->nFrame].iDbPa
15e80 67 65 20 3d 20 30 3b 0a 20 20 70 52 62 75 2d 3e  ge = 0;.  pRbu->
15e90 6e 46 72 61 6d 65 2b 2b 3b 0a 20 20 72 65 74 75  nFrame++;.  retu
15ea0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
15eb0 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 65 64 20 77 68  ./*.** Called wh
15ec0 65 6e 20 61 20 70 61 67 65 20 6f 66 20 64 61 74  en a page of dat
15ed0 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  a is written to 
15ee0 6f 66 66 73 65 74 20 69 4f 66 66 20 6f 66 20 74  offset iOff of t
15ef0 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66  he database.** f
15f00 69 6c 65 20 77 68 69 6c 65 20 74 68 65 20 72 62  ile while the rb
15f10 75 20 68 61 6e 64 6c 65 20 69 73 20 69 6e 20 63  u handle is in c
15f20 61 70 74 75 72 65 20 6d 6f 64 65 2e 20 52 65 63  apture mode. Rec
15f30 6f 72 64 20 74 68 65 20 70 61 67 65 20 6e 75 6d  ord the page num
15f40 62 65 72 20 0a 2a 2a 20 6f 66 20 74 68 65 20 70  ber .** of the p
15f50 61 67 65 20 62 65 69 6e 67 20 77 72 69 74 74 65  age being writte
15f60 6e 20 69 6e 20 74 68 65 20 61 46 72 61 6d 65 5b  n in the aFrame[
15f70 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74  ] array..*/.stat
15f80 69 63 20 69 6e 74 20 72 62 75 43 61 70 74 75 72  ic int rbuCaptur
15f90 65 44 62 57 72 69 74 65 28 73 71 6c 69 74 65 33  eDbWrite(sqlite3
15fa0 72 62 75 20 2a 70 52 62 75 2c 20 69 36 34 20 69  rbu *pRbu, i64 i
15fb0 4f 66 66 29 7b 0a 20 20 70 52 62 75 2d 3e 61 46  Off){.  pRbu->aF
15fc0 72 61 6d 65 5b 70 52 62 75 2d 3e 6e 46 72 61 6d  rame[pRbu->nFram
15fd0 65 2d 31 5d 2e 69 44 62 50 61 67 65 20 3d 20 28  e-1].iDbPage = (
15fe0 75 33 32 29 28 69 4f 66 66 20 2f 20 70 52 62 75  u32)(iOff / pRbu
15ff0 2d 3e 70 67 73 7a 29 20 2b 20 31 3b 0a 20 20 72  ->pgsz) + 1;.  r
16000 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
16010 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  .}../*.** This i
16020 73 20 63 61 6c 6c 65 64 20 61 73 20 70 61 72 74  s called as part
16030 20 6f 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74   of an increment
16040 61 6c 20 63 68 65 63 6b 70 6f 69 6e 74 20 6f 70  al checkpoint op
16050 65 72 61 74 69 6f 6e 2e 20 43 6f 70 79 0a 2a 2a  eration. Copy.**
16060 20 61 20 73 69 6e 67 6c 65 20 66 72 61 6d 65 20   a single frame 
16070 6f 66 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  of data from the
16080 20 77 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 74   wal file into t
16090 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
160a0 2c 20 61 73 0a 2a 2a 20 69 6e 64 69 63 61 74 65  , as.** indicate
160b0 64 20 62 79 20 74 68 65 20 52 62 75 46 72 61 6d  d by the RbuFram
160c0 65 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61  e object..*/.sta
160d0 74 69 63 20 76 6f 69 64 20 72 62 75 43 68 65 63  tic void rbuChec
160e0 6b 70 6f 69 6e 74 46 72 61 6d 65 28 73 71 6c 69  kpointFrame(sqli
160f0 74 65 33 72 62 75 20 2a 70 2c 20 52 62 75 46 72  te3rbu *p, RbuFr
16100 61 6d 65 20 2a 70 46 72 61 6d 65 29 7b 0a 20 20  ame *pFrame){.  
16110 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 57  sqlite3_file *pW
16120 61 6c 20 3d 20 70 2d 3e 70 54 61 72 67 65 74 46  al = p->pTargetF
16130 64 2d 3e 70 57 61 6c 46 64 2d 3e 70 52 65 61 6c  d->pWalFd->pReal
16140 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  ;.  sqlite3_file
16150 20 2a 70 44 62 20 3d 20 70 2d 3e 70 54 61 72 67   *pDb = p->pTarg
16160 65 74 46 64 2d 3e 70 52 65 61 6c 3b 0a 20 20 69  etFd->pReal;.  i
16170 36 34 20 69 4f 66 66 3b 0a 0a 20 20 61 73 73 65  64 iOff;..  asse
16180 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rt( p->rc==SQLIT
16190 45 5f 4f 4b 20 29 3b 0a 20 20 69 4f 66 66 20 3d  E_OK );.  iOff =
161a0 20 28 69 36 34 29 28 70 46 72 61 6d 65 2d 3e 69   (i64)(pFrame->i
161b0 57 61 6c 46 72 61 6d 65 2d 31 29 20 2a 20 28 70  WalFrame-1) * (p
161c0 2d 3e 70 67 73 7a 20 2b 20 32 34 29 20 2b 20 33  ->pgsz + 24) + 3
161d0 32 20 2b 20 32 34 3b 0a 20 20 70 2d 3e 72 63 20  2 + 24;.  p->rc 
161e0 3d 20 70 57 61 6c 2d 3e 70 4d 65 74 68 6f 64 73  = pWal->pMethods
161f0 2d 3e 78 52 65 61 64 28 70 57 61 6c 2c 20 70 2d  ->xRead(pWal, p-
16200 3e 61 42 75 66 2c 20 70 2d 3e 70 67 73 7a 2c 20  >aBuf, p->pgsz, 
16210 69 4f 66 66 29 3b 0a 20 20 69 66 28 20 70 2d 3e  iOff);.  if( p->
16220 72 63 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  rc ) return;..  
16230 69 4f 66 66 20 3d 20 28 69 36 34 29 28 70 46 72  iOff = (i64)(pFr
16240 61 6d 65 2d 3e 69 44 62 50 61 67 65 2d 31 29 20  ame->iDbPage-1) 
16250 2a 20 70 2d 3e 70 67 73 7a 3b 0a 20 20 70 2d 3e  * p->pgsz;.  p->
16260 72 63 20 3d 20 70 44 62 2d 3e 70 4d 65 74 68 6f  rc = pDb->pMetho
16270 64 73 2d 3e 78 57 72 69 74 65 28 70 44 62 2c 20  ds->xWrite(pDb, 
16280 70 2d 3e 61 42 75 66 2c 20 70 2d 3e 70 67 73 7a  p->aBuf, p->pgsz
16290 2c 20 69 4f 66 66 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  , iOff);.}.../*.
162a0 2a 2a 20 54 61 6b 65 20 61 6e 20 45 58 43 4c 55  ** Take an EXCLU
162b0 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
162c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
162d0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
162e0 62 75 4c 6f 63 6b 44 61 74 61 62 61 73 65 28 73  buLockDatabase(s
162f0 71 6c 69 74 65 33 72 62 75 20 2a 70 29 7b 0a 20  qlite3rbu *p){. 
16300 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
16310 52 65 61 6c 20 3d 20 70 2d 3e 70 54 61 72 67 65  Real = p->pTarge
16320 74 46 64 2d 3e 70 52 65 61 6c 3b 0a 20 20 61 73  tFd->pReal;.  as
16330 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  sert( p->rc==SQL
16340 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 70 2d 3e 72  ITE_OK );.  p->r
16350 63 20 3d 20 70 52 65 61 6c 2d 3e 70 4d 65 74 68  c = pReal->pMeth
16360 6f 64 73 2d 3e 78 4c 6f 63 6b 28 70 52 65 61 6c  ods->xLock(pReal
16370 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 53 48  , SQLITE_LOCK_SH
16380 41 52 45 44 29 3b 0a 20 20 69 66 28 20 70 2d 3e  ARED);.  if( p->
16390 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
163a0 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 52 65  .    p->rc = pRe
163b0 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 4c  al->pMethods->xL
163c0 6f 63 6b 28 70 52 65 61 6c 2c 20 53 51 4c 49 54  ock(pReal, SQLIT
163d0 45 5f 4c 4f 43 4b 5f 45 58 43 4c 55 53 49 56 45  E_LOCK_EXCLUSIVE
163e0 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 64 65  );.  }.}..#if de
163f0 66 69 6e 65 64 28 5f 57 49 4e 33 32 5f 57 43 45  fined(_WIN32_WCE
16400 29 0a 73 74 61 74 69 63 20 4c 50 57 53 54 52 20  ).static LPWSTR 
16410 72 62 75 57 69 6e 55 74 66 38 54 6f 55 6e 69 63  rbuWinUtf8ToUnic
16420 6f 64 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ode(const char *
16430 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e  zFilename){.  in
16440 74 20 6e 43 68 61 72 3b 0a 20 20 4c 50 57 53 54  t nChar;.  LPWST
16450 52 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 3b  R zWideFilename;
16460 0a 0a 20 20 6e 43 68 61 72 20 3d 20 4d 75 6c 74  ..  nChar = Mult
16470 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 28  iByteToWideChar(
16480 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 46 69 6c  CP_UTF8, 0, zFil
16490 65 6e 61 6d 65 2c 20 2d 31 2c 20 4e 55 4c 4c 2c  ename, -1, NULL,
164a0 20 30 29 3b 0a 20 20 69 66 28 20 6e 43 68 61 72   0);.  if( nChar
164b0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
164c0 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 57 69 64 65  n 0;.  }.  zWide
164d0 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Filename = sqlit
164e0 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 6e 43 68  e3_malloc64( nCh
164f0 61 72 2a 73 69 7a 65 6f 66 28 7a 57 69 64 65 46  ar*sizeof(zWideF
16500 69 6c 65 6e 61 6d 65 5b 30 5d 29 20 29 3b 0a 20  ilename[0]) );. 
16510 20 69 66 28 20 7a 57 69 64 65 46 69 6c 65 6e 61   if( zWideFilena
16520 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  me==0 ){.    ret
16530 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6d 65 6d  urn 0;.  }.  mem
16540 73 65 74 28 7a 57 69 64 65 46 69 6c 65 6e 61 6d  set(zWideFilenam
16550 65 2c 20 30 2c 20 6e 43 68 61 72 2a 73 69 7a 65  e, 0, nChar*size
16560 6f 66 28 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  of(zWideFilename
16570 5b 30 5d 29 29 3b 0a 20 20 6e 43 68 61 72 20 3d  [0]));.  nChar =
16580 20 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65   MultiByteToWide
16590 43 68 61 72 28 43 50 5f 55 54 46 38 2c 20 30 2c  Char(CP_UTF8, 0,
165a0 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20   zFilename, -1, 
165b0 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c 0a 20  zWideFilename,. 
165c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
165d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
165e0 43 68 61 72 29 3b 0a 20 20 69 66 28 20 6e 43 68  Char);.  if( nCh
165f0 61 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ar==0 ){.    sql
16600 69 74 65 33 5f 66 72 65 65 28 7a 57 69 64 65 46  ite3_free(zWideF
16610 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 57  ilename);.    zW
16620 69 64 65 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b  ideFilename = 0;
16630 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 57  .  }.  return zW
16640 69 64 65 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 23  ideFilename;.}.#
16650 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
16660 20 52 42 55 20 68 61 6e 64 6c 65 20 69 73 20 63   RBU handle is c
16670 75 72 72 65 6e 74 6c 79 20 69 6e 20 52 42 55 5f  urrently in RBU_
16680 53 54 41 47 45 5f 4f 41 4c 20 73 74 61 74 65 2c  STAGE_OAL state,
16690 20 77 69 74 68 20 61 20 53 48 41 52 45 44 20 6c   with a SHARED l
166a0 6f 63 6b 0a 2a 2a 20 6f 6e 20 74 68 65 20 64 61  ock.** on the da
166b0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 69  tabase file. Thi
166c0 73 20 70 72 6f 63 20 6d 6f 76 65 73 20 74 68 65  s proc moves the
166d0 20 2a 2d 6f 61 6c 20 66 69 6c 65 20 74 6f 20 74   *-oal file to t
166e0 68 65 20 2a 2d 77 61 6c 20 70 61 74 68 2c 0a 2a  he *-wal path,.*
166f0 2a 20 74 68 65 6e 20 72 65 6f 70 65 6e 73 20 74  * then reopens t
16700 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
16710 20 28 74 68 69 73 20 74 69 6d 65 20 69 6e 20 76   (this time in v
16720 61 6e 69 6c 6c 61 2c 20 6e 6f 6e 2d 6f 61 6c 2c  anilla, non-oal,
16730 20 57 41 4c 20 6d 6f 64 65 29 2e 0a 2a 2a 20 49   WAL mode)..** I
16740 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
16750 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  s, leave an erro
16760 72 20 63 6f 64 65 20 61 6e 64 20 65 72 72 6f 72  r code and error
16770 20 6d 65 73 73 61 67 65 20 69 6e 20 74 68 65 20   message in the 
16780 72 62 75 20 0a 2a 2a 20 68 61 6e 64 6c 65 2e 0a  rbu .** handle..
16790 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
167a0 62 75 4d 6f 76 65 4f 61 6c 46 69 6c 65 28 73 71  buMoveOalFile(sq
167b0 6c 69 74 65 33 72 62 75 20 2a 70 29 7b 0a 20 20  lite3rbu *p){.  
167c0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 61 73  const char *zBas
167d0 65 20 3d 20 73 71 6c 69 74 65 33 5f 64 62 5f 66  e = sqlite3_db_f
167e0 69 6c 65 6e 61 6d 65 28 70 2d 3e 64 62 4d 61 69  ilename(p->dbMai
167f0 6e 2c 20 22 6d 61 69 6e 22 29 3b 0a 20 20 63 6f  n, "main");.  co
16800 6e 73 74 20 63 68 61 72 20 2a 7a 4d 6f 76 65 20  nst char *zMove 
16810 3d 20 7a 42 61 73 65 3b 0a 20 20 63 68 61 72 20  = zBase;.  char 
16820 2a 7a 4f 61 6c 3b 0a 20 20 63 68 61 72 20 2a 7a  *zOal;.  char *z
16830 57 61 6c 3b 0a 0a 20 20 69 66 28 20 72 62 75 49  Wal;..  if( rbuI
16840 73 56 61 63 75 75 6d 28 70 29 20 29 7b 0a 20 20  sVacuum(p) ){.  
16850 20 20 7a 4d 6f 76 65 20 3d 20 73 71 6c 69 74 65    zMove = sqlite
16860 33 5f 64 62 5f 66 69 6c 65 6e 61 6d 65 28 70 2d  3_db_filename(p-
16870 3e 64 62 52 62 75 2c 20 22 6d 61 69 6e 22 29 3b  >dbRbu, "main");
16880 0a 20 20 7d 0a 20 20 7a 4f 61 6c 20 3d 20 73 71  .  }.  zOal = sq
16890 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
168a0 73 2d 6f 61 6c 22 2c 20 7a 4d 6f 76 65 29 3b 0a  s-oal", zMove);.
168b0 20 20 7a 57 61 6c 20 3d 20 73 71 6c 69 74 65 33    zWal = sqlite3
168c0 5f 6d 70 72 69 6e 74 66 28 22 25 73 2d 77 61 6c  _mprintf("%s-wal
168d0 22 2c 20 7a 4d 6f 76 65 29 3b 0a 0a 20 20 61 73  ", zMove);..  as
168e0 73 65 72 74 28 20 70 2d 3e 65 53 74 61 67 65 3d  sert( p->eStage=
168f0 3d 52 42 55 5f 53 54 41 47 45 5f 4d 4f 56 45 20  =RBU_STAGE_MOVE 
16900 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
16910 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
16920 20 70 2d 3e 7a 45 72 72 6d 73 67 3d 3d 30 20 29   p->zErrmsg==0 )
16930 3b 0a 20 20 69 66 28 20 7a 57 61 6c 3d 3d 30 20  ;.  if( zWal==0 
16940 7c 7c 20 7a 4f 61 6c 3d 3d 30 20 29 7b 0a 20 20  || zOal==0 ){.  
16950 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
16960 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b  _NOMEM;.  }else{
16970 0a 20 20 20 20 2f 2a 20 4d 6f 76 65 20 74 68 65  .    /* Move the
16980 20 2a 2d 6f 61 6c 20 66 69 6c 65 20 74 6f 20 2a   *-oal file to *
16990 2d 77 61 6c 2e 20 41 74 20 74 68 69 73 20 70 6f  -wal. At this po
169a0 69 6e 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70  int connection p
169b0 2d 3e 64 62 20 69 73 0a 20 20 20 20 2a 2a 20 68  ->db is.    ** h
169c0 6f 6c 64 69 6e 67 20 61 20 53 48 41 52 45 44 20  olding a SHARED 
169d0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 72 67  lock on the targ
169e0 65 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  et database file
169f0 20 28 62 65 63 61 75 73 65 20 69 74 20 69 73 0a   (because it is.
16a00 20 20 20 20 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f      ** in WAL mo
16a10 64 65 29 2e 20 53 6f 20 6e 6f 20 6f 74 68 65 72  de). So no other
16a20 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61 79 20   connection may 
16a30 62 65 20 77 72 69 74 69 6e 67 20 74 68 65 20 64  be writing the d
16a40 62 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  b. .    **.    *
16a50 2a 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 65 6e  * In order to en
16a60 73 75 72 65 20 74 68 61 74 20 74 68 65 72 65 20  sure that there 
16a70 61 72 65 20 6e 6f 20 64 61 74 61 62 61 73 65 20  are no database 
16a80 72 65 61 64 65 72 73 2c 20 61 6e 20 45 58 43 4c  readers, an EXCL
16a90 55 53 49 56 45 0a 20 20 20 20 2a 2a 20 6c 6f 63  USIVE.    ** loc
16aa0 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 68 65  k is obtained he
16ab0 72 65 20 62 65 66 6f 72 65 20 74 68 65 20 2a 2d  re before the *-
16ac0 6f 61 6c 20 69 73 20 6d 6f 76 65 64 20 74 6f 20  oal is moved to 
16ad0 2a 2d 77 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20  *-wal..    */.  
16ae0 20 20 72 62 75 4c 6f 63 6b 44 61 74 61 62 61 73    rbuLockDatabas
16af0 65 28 70 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  e(p);.    if( p-
16b00 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
16b10 7b 0a 20 20 20 20 20 20 72 62 75 46 69 6c 65 53  {.      rbuFileS
16b20 75 66 66 69 78 33 28 7a 42 61 73 65 2c 20 7a 57  uffix3(zBase, zW
16b30 61 6c 29 3b 0a 20 20 20 20 20 20 72 62 75 46 69  al);.      rbuFi
16b40 6c 65 53 75 66 66 69 78 33 28 7a 42 61 73 65 2c  leSuffix3(zBase,
16b50 20 7a 4f 61 6c 29 3b 0a 0a 20 20 20 20 20 20 2f   zOal);..      /
16b60 2a 20 52 65 2d 6f 70 65 6e 20 74 68 65 20 64 61  * Re-open the da
16b70 74 61 62 61 73 65 73 2e 20 2a 2f 0a 20 20 20 20  tabases. */.    
16b80 20 20 72 62 75 4f 62 6a 49 74 65 72 46 69 6e 61    rbuObjIterFina
16b90 6c 69 7a 65 28 26 70 2d 3e 6f 62 6a 69 74 65 72  lize(&p->objiter
16ba0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
16bb0 5f 63 6c 6f 73 65 28 70 2d 3e 64 62 52 62 75 29  _close(p->dbRbu)
16bc0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
16bd0 63 6c 6f 73 65 28 70 2d 3e 64 62 4d 61 69 6e 29  close(p->dbMain)
16be0 3b 0a 20 20 20 20 20 20 70 2d 3e 64 62 4d 61 69  ;.      p->dbMai
16bf0 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e  n = 0;.      p->
16c00 64 62 52 62 75 20 3d 20 30 3b 0a 0a 23 69 66 20  dbRbu = 0;..#if 
16c10 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 5f 57  defined(_WIN32_W
16c20 43 45 29 0a 20 20 20 20 20 20 7b 0a 20 20 20 20  CE).      {.    
16c30 20 20 20 20 4c 50 57 53 54 52 20 7a 57 69 64 65      LPWSTR zWide
16c40 4f 61 6c 3b 0a 20 20 20 20 20 20 20 20 4c 50 57  Oal;.        LPW
16c50 53 54 52 20 7a 57 69 64 65 57 61 6c 3b 0a 0a 20  STR zWideWal;.. 
16c60 20 20 20 20 20 20 20 7a 57 69 64 65 4f 61 6c 20         zWideOal 
16c70 3d 20 72 62 75 57 69 6e 55 74 66 38 54 6f 55 6e  = rbuWinUtf8ToUn
16c80 69 63 6f 64 65 28 7a 4f 61 6c 29 3b 0a 20 20 20  icode(zOal);.   
16c90 20 20 20 20 20 69 66 28 20 7a 57 69 64 65 4f 61       if( zWideOa
16ca0 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  l ){.          z
16cb0 57 69 64 65 57 61 6c 20 3d 20 72 62 75 57 69 6e  WideWal = rbuWin
16cc0 55 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a 57  Utf8ToUnicode(zW
16cd0 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  al);.          i
16ce0 66 28 20 7a 57 69 64 65 57 61 6c 20 29 7b 0a 20  f( zWideWal ){. 
16cf0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 4d             if( M
16d00 6f 76 65 46 69 6c 65 57 28 7a 57 69 64 65 4f 61  oveFileW(zWideOa
16d10 6c 2c 20 7a 57 69 64 65 57 61 6c 29 20 29 7b 0a  l, zWideWal) ){.
16d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
16d30 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  >rc = SQLITE_OK;
16d40 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
16d50 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
16d60 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
16d70 5f 49 4f 45 52 52 3b 0a 20 20 20 20 20 20 20 20  _IOERR;.        
16d80 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
16d90 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
16da0 57 69 64 65 57 61 6c 29 3b 0a 20 20 20 20 20 20  WideWal);.      
16db0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16dc0 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53         p->rc = S
16dd0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
16de0 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  M;.          }. 
16df0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
16e00 5f 66 72 65 65 28 7a 57 69 64 65 4f 61 6c 29 3b  _free(zWideOal);
16e10 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
16e20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20            p->rc 
16e30 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  = SQLITE_IOERR_N
16e40 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 7d 0a  OMEM;.        }.
16e50 20 20 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20        }.#else.  
16e60 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 65 6e 61      p->rc = rena
16e70 6d 65 28 7a 4f 61 6c 2c 20 7a 57 61 6c 29 20 3f  me(zOal, zWal) ?
16e80 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 3a 20   SQLITE_IOERR : 
16e90 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69  SQLITE_OK;.#endi
16ea0 66 0a 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  f..      if( p->
16eb0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
16ec0 0a 20 20 20 20 20 20 20 20 72 62 75 4f 70 65 6e  .        rbuOpen
16ed0 44 61 74 61 62 61 73 65 28 70 2c 20 30 29 3b 0a  Database(p, 0);.
16ee0 20 20 20 20 20 20 20 20 72 62 75 53 65 74 75 70          rbuSetup
16ef0 43 68 65 63 6b 70 6f 69 6e 74 28 70 2c 20 30 29  Checkpoint(p, 0)
16f00 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
16f10 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66    }..  sqlite3_f
16f20 72 65 65 28 7a 57 61 6c 29 3b 0a 20 20 73 71 6c  ree(zWal);.  sql
16f30 69 74 65 33 5f 66 72 65 65 28 7a 4f 61 6c 29 3b  ite3_free(zOal);
16f40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 53 45  .}../*.** The SE
16f50 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69  LECT statement i
16f60 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68  terating through
16f70 20 74 68 65 20 6b 65 79 73 20 66 6f 72 20 74 68   the keys for th
16f80 65 20 63 75 72 72 65 6e 74 20 6f 62 6a 65 63 74  e current object
16f90 0a 2a 2a 20 28 70 2d 3e 6f 62 6a 69 74 65 72 2e  .** (p->objiter.
16fa0 70 53 65 6c 65 63 74 29 20 63 75 72 72 65 6e 74  pSelect) current
16fb0 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 76  ly points to a v
16fc0 61 6c 69 64 20 72 6f 77 2e 20 54 68 69 73 20 66  alid row. This f
16fd0 75 6e 63 74 69 6f 6e 0a 2a 2a 20 64 65 74 65 72  unction.** deter
16fe0 6d 69 6e 65 73 20 74 68 65 20 74 79 70 65 20 6f  mines the type o
16ff0 66 20 6f 70 65 72 61 74 69 6f 6e 20 72 65 71 75  f operation requ
17000 65 73 74 65 64 20 62 79 20 74 68 69 73 20 72 6f  ested by this ro
17010 77 20 61 6e 64 20 72 65 74 75 72 6e 73 0a 2a 2a  w and returns.**
17020 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c   one of the foll
17030 6f 77 69 6e 67 20 76 61 6c 75 65 73 20 74 6f 20  owing values to 
17040 69 6e 64 69 63 61 74 65 20 74 68 65 20 72 65 73  indicate the res
17050 75 6c 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a  ult:.**.**     *
17060 20 52 42 55 5f 49 4e 53 45 52 54 0a 2a 2a 20 20   RBU_INSERT.**  
17070 20 20 20 2a 20 52 42 55 5f 44 45 4c 45 54 45 0a     * RBU_DELETE.
17080 2a 2a 20 20 20 20 20 2a 20 52 42 55 5f 49 44 58  **     * RBU_IDX
17090 5f 44 45 4c 45 54 45 0a 2a 2a 20 20 20 20 20 2a  _DELETE.**     *
170a0 20 52 42 55 5f 55 50 44 41 54 45 0a 2a 2a 0a 2a   RBU_UPDATE.**.*
170b0 2a 20 49 66 20 52 42 55 5f 55 50 44 41 54 45 20  * If RBU_UPDATE 
170c0 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65  is returned, the
170d0 6e 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c  n output variabl
170e0 65 20 2a 70 7a 4d 61 73 6b 20 69 73 20 73 65 74  e *pzMask is set
170f0 20 74 6f 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20   to.** point to 
17100 74 68 65 20 74 65 78 74 20 76 61 6c 75 65 20 69  the text value i
17110 6e 64 69 63 61 74 69 6e 67 20 74 68 65 20 63 6f  ndicating the co
17120 6c 75 6d 6e 73 20 74 6f 20 75 70 64 61 74 65 2e  lumns to update.
17130 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 62  .**.** If the rb
17140 75 5f 63 6f 6e 74 72 6f 6c 20 66 69 65 6c 64 20  u_control field 
17150 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6e 76 61  contains an inva
17160 6c 69 64 20 76 61 6c 75 65 2c 20 61 6e 20 65 72  lid value, an er
17170 72 6f 72 20 63 6f 64 65 20 61 6e 64 0a 2a 2a 20  ror code and.** 
17180 6d 65 73 73 61 67 65 20 61 72 65 20 6c 65 66 74  message are left
17190 20 69 6e 20 74 68 65 20 52 42 55 20 68 61 6e 64   in the RBU hand
171a0 6c 65 20 61 6e 64 20 7a 65 72 6f 20 72 65 74 75  le and zero retu
171b0 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
171c0 69 6e 74 20 72 62 75 53 74 65 70 54 79 70 65 28  int rbuStepType(
171d0 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 63  sqlite3rbu *p, c
171e0 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4d 61  onst char **pzMa
171f0 73 6b 29 7b 0a 20 20 69 6e 74 20 69 43 6f 6c 20  sk){.  int iCol 
17200 3d 20 70 2d 3e 6f 62 6a 69 74 65 72 2e 6e 43 6f  = p->objiter.nCo
17210 6c 3b 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20  l;     /* Index 
17220 6f 66 20 72 62 75 5f 63 6f 6e 74 72 6f 6c 20 63  of rbu_control c
17230 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 72  olumn */.  int r
17240 65 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  es = 0;         
17250 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
17260 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20  turn value */.. 
17270 20 73 77 69 74 63 68 28 20 73 71 6c 69 74 65 33   switch( sqlite3
17280 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 2d 3e  _column_type(p->
17290 6f 62 6a 69 74 65 72 2e 70 53 65 6c 65 63 74 2c  objiter.pSelect,
172a0 20 69 43 6f 6c 29 20 29 7b 0a 20 20 20 20 63 61   iCol) ){.    ca
172b0 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45  se SQLITE_INTEGE
172c0 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  R: {.      int i
172d0 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  Val = sqlite3_co
172e0 6c 75 6d 6e 5f 69 6e 74 28 70 2d 3e 6f 62 6a 69  lumn_int(p->obji
172f0 74 65 72 2e 70 53 65 6c 65 63 74 2c 20 69 43 6f  ter.pSelect, iCo
17300 6c 29 3b 0a 20 20 20 20 20 20 73 77 69 74 63 68  l);.      switch
17310 28 20 69 56 61 6c 20 29 7b 0a 20 20 20 20 20 20  ( iVal ){.      
17320 20 20 63 61 73 65 20 30 3a 20 72 65 73 20 3d 20    case 0: res = 
17330 52 42 55 5f 49 4e 53 45 52 54 3b 20 20 20 20 20  RBU_INSERT;     
17340 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63  break;.        c
17350 61 73 65 20 31 3a 20 72 65 73 20 3d 20 52 42 55  ase 1: res = RBU
17360 5f 44 45 4c 45 54 45 3b 20 20 20 20 20 62 72 65  _DELETE;     bre
17370 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65  ak;.        case
17380 20 32 3a 20 72 65 73 20 3d 20 52 42 55 5f 52 45   2: res = RBU_RE
17390 50 4c 41 43 45 3b 20 20 20 20 62 72 65 61 6b 3b  PLACE;    break;
173a0 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 33 3a  .        case 3:
173b0 20 72 65 73 20 3d 20 52 42 55 5f 49 44 58 5f 44   res = RBU_IDX_D
173c0 45 4c 45 54 45 3b 20 62 72 65 61 6b 3b 0a 20 20  ELETE; break;.  
173d0 20 20 20 20 20 20 63 61 73 65 20 34 3a 20 72 65        case 4: re
173e0 73 20 3d 20 52 42 55 5f 49 44 58 5f 49 4e 53 45  s = RBU_IDX_INSE
173f0 52 54 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  RT; break;.     
17400 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
17410 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20      }..    case 
17420 53 51 4c 49 54 45 5f 54 45 58 54 3a 20 7b 0a 20  SQLITE_TEXT: {. 
17430 20 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67       const unsig
17440 6e 65 64 20 63 68 61 72 20 2a 7a 20 3d 20 73 71  ned char *z = sq
17450 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
17460 74 28 70 2d 3e 6f 62 6a 69 74 65 72 2e 70 53 65  t(p->objiter.pSe
17470 6c 65 63 74 2c 20 69 43 6f 6c 29 3b 0a 20 20 20  lect, iCol);.   
17480 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20     if( z==0 ){. 
17490 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53         p->rc = S
174a0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
174b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
174c0 20 20 2a 70 7a 4d 61 73 6b 20 3d 20 28 63 6f 6e    *pzMask = (con
174d0 73 74 20 63 68 61 72 2a 29 7a 3b 0a 20 20 20 20  st char*)z;.    
174e0 20 20 7d 0a 20 20 20 20 20 20 72 65 73 20 3d 20    }.      res = 
174f0 52 42 55 5f 55 50 44 41 54 45 3b 0a 0a 20 20 20  RBU_UPDATE;..   
17500 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
17510 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20  .    default:.  
17520 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
17530 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a    if( res==0 ){.
17540 20 20 20 20 72 62 75 42 61 64 43 6f 6e 74 72 6f      rbuBadContro
17550 6c 45 72 72 6f 72 28 70 29 3b 0a 20 20 7d 0a 20  lError(p);.  }. 
17560 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a   return res;.}..
17570 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
17580 42 55 47 0a 2f 2a 0a 2a 2a 20 41 73 73 65 72 74  BUG./*.** Assert
17590 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 69 43 6f   that column iCo
175a0 6c 20 6f 66 20 73 74 61 74 65 6d 65 6e 74 20 70  l of statement p
175b0 53 74 6d 74 20 69 73 20 6e 61 6d 65 64 20 7a 4e  Stmt is named zN
175c0 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ame..*/.static v
175d0 6f 69 64 20 61 73 73 65 72 74 43 6f 6c 75 6d 6e  oid assertColumn
175e0 4e 61 6d 65 28 73 71 6c 69 74 65 33 5f 73 74 6d  Name(sqlite3_stm
175f0 74 20 2a 70 53 74 6d 74 2c 20 69 6e 74 20 69 43  t *pStmt, int iC
17600 6f 6c 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ol, const char *
17610 7a 4e 61 6d 65 29 7b 0a 20 20 63 6f 6e 73 74 20  zName){.  const 
17620 63 68 61 72 20 2a 7a 43 6f 6c 20 3d 20 73 71 6c  char *zCol = sql
17630 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65  ite3_column_name
17640 28 70 53 74 6d 74 2c 20 69 43 6f 6c 29 3b 0a 20  (pStmt, iCol);. 
17650 20 61 73 73 65 72 74 28 20 30 3d 3d 73 71 6c 69   assert( 0==sqli
17660 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 4e 61 6d  te3_stricmp(zNam
17670 65 2c 20 7a 43 6f 6c 29 20 29 3b 0a 7d 0a 23 65  e, zCol) );.}.#e
17680 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 61 73 73  lse.# define ass
17690 65 72 74 43 6f 6c 75 6d 6e 4e 61 6d 65 28 78 2c  ertColumnName(x,
176a0 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  y,z).#endif../*.
176b0 2a 2a 20 41 72 67 75 6d 65 6e 74 20 65 54 79 70  ** Argument eTyp
176c0 65 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66  e must be one of
176d0 20 52 42 55 5f 49 4e 53 45 52 54 2c 20 52 42 55   RBU_INSERT, RBU
176e0 5f 44 45 4c 45 54 45 2c 20 52 42 55 5f 49 44 58  _DELETE, RBU_IDX
176f0 5f 49 4e 53 45 52 54 20 6f 72 0a 2a 2a 20 52 42  _INSERT or.** RB
17700 55 5f 49 44 58 5f 44 45 4c 45 54 45 2e 20 54 68  U_IDX_DELETE. Th
17710 69 73 20 66 75 6e 63 74 69 6f 6e 20 70 65 72 66  is function perf
17720 6f 72 6d 73 20 74 68 65 20 77 6f 72 6b 20 6f 66  orms the work of
17730 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 73 71 6c   a single.** sql
17740 69 74 65 33 72 62 75 5f 73 74 65 70 28 29 20 63  ite3rbu_step() c
17750 61 6c 6c 20 66 6f 72 20 74 68 65 20 74 79 70 65  all for the type
17760 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 20 73 70   of operation sp
17770 65 63 69 66 69 65 64 20 62 79 20 65 54 79 70 65  ecified by eType
17780 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
17790 20 72 62 75 53 74 65 70 4f 6e 65 4f 70 28 73 71   rbuStepOneOp(sq
177a0 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 69 6e 74  lite3rbu *p, int
177b0 20 65 54 79 70 65 29 7b 0a 20 20 52 62 75 4f 62   eType){.  RbuOb
177c0 6a 49 74 65 72 20 2a 70 49 74 65 72 20 3d 20 26  jIter *pIter = &
177d0 70 2d 3e 6f 62 6a 69 74 65 72 3b 0a 20 20 73 71  p->objiter;.  sq
177e0 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61  lite3_value *pVa
177f0 6c 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  l;.  sqlite3_stm
17800 74 20 2a 70 57 72 69 74 65 72 3b 0a 20 20 69 6e  t *pWriter;.  in
17810 74 20 69 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  t i;..  assert( 
17820 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
17830 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 54   );.  assert( eT
17840 79 70 65 21 3d 52 42 55 5f 44 45 4c 45 54 45 20  ype!=RBU_DELETE 
17850 7c 7c 20 70 49 74 65 72 2d 3e 7a 49 64 78 3d 3d  || pIter->zIdx==
17860 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  0 );.  assert( e
17870 54 79 70 65 3d 3d 52 42 55 5f 44 45 4c 45 54 45  Type==RBU_DELETE
17880 20 7c 7c 20 65 54 79 70 65 3d 3d 52 42 55 5f 49   || eType==RBU_I
17890 44 58 5f 44 45 4c 45 54 45 0a 20 20 20 20 20 20  DX_DELETE.      
178a0 20 7c 7c 20 65 54 79 70 65 3d 3d 52 42 55 5f 49   || eType==RBU_I
178b0 4e 53 45 52 54 20 7c 7c 20 65 54 79 70 65 3d 3d  NSERT || eType==
178c0 52 42 55 5f 49 44 58 5f 49 4e 53 45 52 54 0a 20  RBU_IDX_INSERT. 
178d0 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69   );..  /* If thi
178e0 73 20 69 73 20 61 20 64 65 6c 65 74 65 2c 20 64  s is a delete, d
178f0 65 63 72 65 6d 65 6e 74 20 6e 50 68 61 73 65 4f  ecrement nPhaseO
17900 6e 65 53 74 65 70 20 62 79 20 6e 49 6e 64 65 78  neStep by nIndex
17910 2e 20 49 66 20 74 68 65 20 44 45 4c 45 54 45 0a  . If the DELETE.
17920 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 62    ** statement b
17930 65 6c 6f 77 20 64 6f 65 73 20 61 63 74 75 61 6c  elow does actual
17940 6c 79 20 64 65 6c 65 74 65 20 61 20 72 6f 77 2c  ly delete a row,
17950 20 6e 50 68 61 73 65 4f 6e 65 53 74 65 70 20 77   nPhaseOneStep w
17960 69 6c 6c 20 62 65 0a 20 20 2a 2a 20 69 6e 63 72  ill be.  ** incr
17970 65 6d 65 6e 74 65 64 20 62 79 20 74 68 65 20 73  emented by the s
17980 61 6d 65 20 61 6d 6f 75 6e 74 20 77 68 65 6e 20  ame amount when 
17990 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 72 62 75  SQL function rbu
179a0 5f 74 6d 70 5f 69 6e 73 65 72 74 28 29 0a 20 20  _tmp_insert().  
179b0 2a 2a 20 69 73 20 69 6e 76 6f 6b 65 64 20 62 79  ** is invoked by
179c0 20 74 68 65 20 74 72 69 67 67 65 72 2e 20 20 2a   the trigger.  *
179d0 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 52  /.  if( eType==R
179e0 42 55 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20  BU_DELETE ){.   
179f0 20 70 2d 3e 6e 50 68 61 73 65 4f 6e 65 53 74 65   p->nPhaseOneSte
17a00 70 20 2d 3d 20 70 2d 3e 6f 62 6a 69 74 65 72 2e  p -= p->objiter.
17a10 6e 49 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 69  nIndex;.  }..  i
17a20 66 28 20 65 54 79 70 65 3d 3d 52 42 55 5f 49 44  f( eType==RBU_ID
17a30 58 5f 44 45 4c 45 54 45 20 7c 7c 20 65 54 79 70  X_DELETE || eTyp
17a40 65 3d 3d 52 42 55 5f 44 45 4c 45 54 45 20 29 7b  e==RBU_DELETE ){
17a50 0a 20 20 20 20 70 57 72 69 74 65 72 20 3d 20 70  .    pWriter = p
17a60 49 74 65 72 2d 3e 70 44 65 6c 65 74 65 3b 0a 20  Iter->pDelete;. 
17a70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 57 72 69   }else{.    pWri
17a80 74 65 72 20 3d 20 70 49 74 65 72 2d 3e 70 49 6e  ter = pIter->pIn
17a90 73 65 72 74 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72  sert;.  }..  for
17aa0 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e  (i=0; i<pIter->n
17ab0 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 2f  Col; i++){.    /
17ac0 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
17ad0 49 4e 53 45 52 54 20 69 6e 74 6f 20 61 20 74 61  INSERT into a ta
17ae0 62 6c 65 20 62 2d 74 72 65 65 20 61 6e 64 20 74  ble b-tree and t
17af0 68 65 20 74 61 62 6c 65 20 68 61 73 20 61 6e 0a  he table has an.
17b00 20 20 20 20 2a 2a 20 65 78 70 6c 69 63 69 74 20      ** explicit 
17b10 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
17b20 4b 45 59 2c 20 63 68 65 63 6b 20 74 68 61 74 20  KEY, check that 
17b30 74 68 69 73 20 69 73 20 6e 6f 74 20 61 6e 20 61  this is not an a
17b40 74 74 65 6d 70 74 0a 20 20 20 20 2a 2a 20 74 6f  ttempt.    ** to
17b50 20 77 72 69 74 65 20 61 20 4e 55 4c 4c 20 69 6e   write a NULL in
17b60 74 6f 20 74 68 65 20 49 50 4b 20 63 6f 6c 75 6d  to the IPK colum
17b70 6e 2e 20 54 68 61 74 20 69 73 20 6e 6f 74 20 70  n. That is not p
17b80 65 72 6d 69 74 74 65 64 2e 20 20 2a 2f 0a 20 20  ermitted.  */.  
17b90 20 20 69 66 28 20 65 54 79 70 65 3d 3d 52 42 55    if( eType==RBU
17ba0 5f 49 4e 53 45 52 54 20 0a 20 20 20 20 20 26 26  _INSERT .     &&
17bb0 20 70 49 74 65 72 2d 3e 7a 49 64 78 3d 3d 30 20   pIter->zIdx==0 
17bc0 26 26 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d  && pIter->eType=
17bd0 3d 52 42 55 5f 50 4b 5f 49 50 4b 20 26 26 20 70  =RBU_PK_IPK && p
17be0 49 74 65 72 2d 3e 61 62 54 62 6c 50 6b 5b 69 5d  Iter->abTblPk[i]
17bf0 20 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74 65   .     && sqlite
17c00 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 49  3_column_type(pI
17c10 74 65 72 2d 3e 70 53 65 6c 65 63 74 2c 20 69 29  ter->pSelect, i)
17c20 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 0a 20 20  ==SQLITE_NULL.  
17c30 20 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63    ){.      p->rc
17c40 20 3d 20 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54   = SQLITE_MISMAT
17c50 43 48 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 45 72  CH;.      p->zEr
17c60 72 6d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  rmsg = sqlite3_m
17c70 70 72 69 6e 74 66 28 22 64 61 74 61 74 79 70 65  printf("datatype
17c80 20 6d 69 73 6d 61 74 63 68 22 29 3b 0a 20 20 20   mismatch");.   
17c90 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
17ca0 0a 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d  ..    if( eType=
17cb0 3d 52 42 55 5f 44 45 4c 45 54 45 20 26 26 20 70  =RBU_DELETE && p
17cc0 49 74 65 72 2d 3e 61 62 54 62 6c 50 6b 5b 69 5d  Iter->abTblPk[i]
17cd0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  ==0 ){.      con
17ce0 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20  tinue;.    }..  
17cf0 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33    pVal = sqlite3
17d00 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28 70 49  _column_value(pI
17d10 74 65 72 2d 3e 70 53 65 6c 65 63 74 2c 20 69 29  ter->pSelect, i)
17d20 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71  ;.    p->rc = sq
17d30 6c 69 74 65 33 5f 62 69 6e 64 5f 76 61 6c 75 65  lite3_bind_value
17d40 28 70 57 72 69 74 65 72 2c 20 69 2b 31 2c 20 70  (pWriter, i+1, p
17d50 56 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  Val);.    if( p-
17d60 3e 72 63 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  >rc ) return;.  
17d70 7d 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 7a  }.  if( pIter->z
17d80 49 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  Idx==0 ){.    if
17d90 28 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d  ( pIter->eType==
17da0 52 42 55 5f 50 4b 5f 56 54 41 42 20 0a 20 20 20  RBU_PK_VTAB .   
17db0 20 20 7c 7c 20 70 49 74 65 72 2d 3e 65 54 79 70    || pIter->eTyp
17dc0 65 3d 3d 52 42 55 5f 50 4b 5f 4e 4f 4e 45 20 0a  e==RBU_PK_NONE .
17dd0 20 20 20 20 20 7c 7c 20 28 70 49 74 65 72 2d 3e       || (pIter->
17de0 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 45 58  eType==RBU_PK_EX
17df0 54 45 52 4e 41 4c 20 26 26 20 72 62 75 49 73 56  TERNAL && rbuIsV
17e00 61 63 75 75 6d 28 70 29 29 20 0a 20 20 20 20 29  acuum(p)) .    )
17e10 7b 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 61  {.      /* For a
17e20 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2c 20   virtual table, 
17e30 6f 72 20 61 20 74 61 62 6c 65 20 77 69 74 68 20  or a table with 
17e40 6e 6f 20 70 72 69 6d 61 72 79 20 6b 65 79 2c 20  no primary key, 
17e50 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 53 45  the .      ** SE
17e60 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69  LECT statement i
17e70 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  s:.      **.    
17e80 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 3c 63    **   SELECT <c
17e90 6f 6c 73 3e 2c 20 72 62 75 5f 63 6f 6e 74 72 6f  ols>, rbu_contro
17ea0 6c 2c 20 72 62 75 5f 72 6f 77 69 64 20 46 52 4f  l, rbu_rowid FRO
17eb0 4d 20 2e 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 0a  M .....      **.
17ec0 20 20 20 20 20 20 2a 2a 20 48 65 6e 63 65 20 63        ** Hence c
17ed0 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28 70 49 74 65  olumn_value(pIte
17ee0 72 2d 3e 6e 43 6f 6c 2b 31 29 2e 0a 20 20 20 20  r->nCol+1)..    
17ef0 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72    */.      asser
17f00 74 43 6f 6c 75 6d 6e 4e 61 6d 65 28 70 49 74 65  tColumnName(pIte
17f10 72 2d 3e 70 53 65 6c 65 63 74 2c 20 70 49 74 65  r->pSelect, pIte
17f20 72 2d 3e 6e 43 6f 6c 2b 31 2c 20 0a 20 20 20 20  r->nCol+1, .    
17f30 20 20 20 20 20 20 72 62 75 49 73 56 61 63 75 75        rbuIsVacuu
17f40 6d 28 70 29 20 3f 20 22 72 6f 77 69 64 22 20 3a  m(p) ? "rowid" :
17f50 20 22 72 62 75 5f 72 6f 77 69 64 22 0a 20 20 20   "rbu_rowid".   
17f60 20 20 20 29 3b 0a 20 20 20 20 20 20 70 56 61 6c     );.      pVal
17f70 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
17f80 6e 5f 76 61 6c 75 65 28 70 49 74 65 72 2d 3e 70  n_value(pIter->p
17f90 53 65 6c 65 63 74 2c 20 70 49 74 65 72 2d 3e 6e  Select, pIter->n
17fa0 43 6f 6c 2b 31 29 3b 0a 20 20 20 20 20 20 70 2d  Col+1);.      p-
17fb0 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69  >rc = sqlite3_bi
17fc0 6e 64 5f 76 61 6c 75 65 28 70 57 72 69 74 65 72  nd_value(pWriter
17fd0 2c 20 70 49 74 65 72 2d 3e 6e 43 6f 6c 2b 31 2c  , pIter->nCol+1,
17fe0 20 70 56 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20   pVal);.    }.  
17ff0 7d 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  }.  if( p->rc==S
18000 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
18010 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 57 72  sqlite3_step(pWr
18020 69 74 65 72 29 3b 0a 20 20 20 20 70 2d 3e 72 63  iter);.    p->rc
18030 20 3d 20 72 65 73 65 74 41 6e 64 43 6f 6c 6c 65   = resetAndColle
18040 63 74 45 72 72 6f 72 28 70 57 72 69 74 65 72 2c  ctError(pWriter,
18050 20 26 70 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a 20   &p->zErrmsg);. 
18060 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
18070 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 74   function does t
18080 68 65 20 77 6f 72 6b 20 66 6f 72 20 61 6e 20 73  he work for an s
18090 71 6c 69 74 65 33 72 62 75 5f 73 74 65 70 28 29  qlite3rbu_step()
180a0 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   call..**.** The
180b0 20 6f 62 6a 65 63 74 2d 69 74 65 72 61 74 6f 72   object-iterator
180c0 20 28 70 2d 3e 6f 62 6a 69 74 65 72 29 20 63 75   (p->objiter) cu
180d0 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74  rrently points t
180e0 6f 20 61 20 76 61 6c 69 64 20 6f 62 6a 65 63 74  o a valid object
180f0 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20 69 6e 70  ,.** and the inp
18100 75 74 20 63 75 72 73 6f 72 20 28 70 2d 3e 6f 62  ut cursor (p->ob
18110 6a 69 74 65 72 2e 70 53 65 6c 65 63 74 29 20 63  jiter.pSelect) c
18120 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20  urrently points 
18130 74 6f 20 61 20 76 61 6c 69 64 0a 2a 2a 20 69 6e  to a valid.** in
18140 70 75 74 20 72 6f 77 2e 20 50 65 72 66 6f 72 6d  put row. Perform
18150 20 77 68 61 74 65 76 65 72 20 70 72 6f 63 65 73   whatever proces
18160 73 69 6e 67 20 69 73 20 72 65 71 75 69 72 65 64  sing is required
18170 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 2a 2a 0a   and return..**.
18180 2a 2a 20 49 66 20 6e 6f 20 20 65 72 72 6f 72 20  ** If no  error 
18190 6f 63 63 75 72 73 2c 20 53 51 4c 49 54 45 5f 4f  occurs, SQLITE_O
181a0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  K is returned. O
181b0 74 68 65 72 77 69 73 65 2c 20 61 6e 20 65 72 72  therwise, an err
181c0 6f 72 20 63 6f 64 65 0a 2a 2a 20 61 6e 64 20 6d  or code.** and m
181d0 65 73 73 61 67 65 20 69 73 20 6c 65 66 74 20 69  essage is left i
181e0 6e 20 74 68 65 20 52 42 55 20 68 61 6e 64 6c 65  n the RBU handle
181f0 20 61 6e 64 20 61 20 63 6f 70 79 20 6f 66 20 74   and a copy of t
18200 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a  he error code.**
18210 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
18220 61 74 69 63 20 69 6e 74 20 72 62 75 53 74 65 70  atic int rbuStep
18230 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 29 7b  (sqlite3rbu *p){
18240 0a 20 20 52 62 75 4f 62 6a 49 74 65 72 20 2a 70  .  RbuObjIter *p
18250 49 74 65 72 20 3d 20 26 70 2d 3e 6f 62 6a 69 74  Iter = &p->objit
18260 65 72 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  er;.  const char
18270 20 2a 7a 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 69   *zMask = 0;.  i
18280 6e 74 20 65 54 79 70 65 20 3d 20 72 62 75 53 74  nt eType = rbuSt
18290 65 70 54 79 70 65 28 70 2c 20 26 7a 4d 61 73 6b  epType(p, &zMask
182a0 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70 65 20  );..  if( eType 
182b0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 65  ){.    assert( e
182c0 54 79 70 65 3d 3d 52 42 55 5f 49 4e 53 45 52 54  Type==RBU_INSERT
182d0 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 52       || eType==R
182e0 42 55 5f 44 45 4c 45 54 45 0a 20 20 20 20 20 20  BU_DELETE.      
182f0 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 52 42 55     || eType==RBU
18300 5f 52 45 50 4c 41 43 45 20 20 20 20 7c 7c 20 65  _REPLACE    || e
18310 54 79 70 65 3d 3d 52 42 55 5f 49 44 58 5f 44 45  Type==RBU_IDX_DE
18320 4c 45 54 45 0a 20 20 20 20 20 20 20 20 20 7c 7c  LETE.         ||
18330 20 65 54 79 70 65 3d 3d 52 42 55 5f 49 44 58 5f   eType==RBU_IDX_
18340 49 4e 53 45 52 54 20 7c 7c 20 65 54 79 70 65 3d  INSERT || eType=
18350 3d 52 42 55 5f 55 50 44 41 54 45 0a 20 20 20 20  =RBU_UPDATE.    
18360 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 65  );.    assert( e
18370 54 79 70 65 21 3d 52 42 55 5f 55 50 44 41 54 45  Type!=RBU_UPDATE
18380 20 7c 7c 20 70 49 74 65 72 2d 3e 7a 49 64 78 3d   || pIter->zIdx=
18390 3d 30 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70  =0 );..    if( p
183a0 49 74 65 72 2d 3e 7a 49 64 78 3d 3d 30 20 26 26  Iter->zIdx==0 &&
183b0 20 28 65 54 79 70 65 3d 3d 52 42 55 5f 49 44 58   (eType==RBU_IDX
183c0 5f 44 45 4c 45 54 45 20 7c 7c 20 65 54 79 70 65  _DELETE || eType
183d0 3d 3d 52 42 55 5f 49 44 58 5f 49 4e 53 45 52 54  ==RBU_IDX_INSERT
183e0 29 20 29 7b 0a 20 20 20 20 20 20 72 62 75 42 61  ) ){.      rbuBa
183f0 64 43 6f 6e 74 72 6f 6c 45 72 72 6f 72 28 70 29  dControlError(p)
18400 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65  ;.    }.    else
18410 20 69 66 28 20 65 54 79 70 65 3d 3d 52 42 55 5f   if( eType==RBU_
18420 52 45 50 4c 41 43 45 20 29 7b 0a 20 20 20 20 20  REPLACE ){.     
18430 20 69 66 28 20 70 49 74 65 72 2d 3e 7a 49 64 78   if( pIter->zIdx
18440 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
18450 2d 3e 6e 50 68 61 73 65 4f 6e 65 53 74 65 70 20  ->nPhaseOneStep 
18460 2b 3d 20 70 2d 3e 6f 62 6a 69 74 65 72 2e 6e 49  += p->objiter.nI
18470 6e 64 65 78 3b 0a 20 20 20 20 20 20 20 20 72 62  ndex;.        rb
18480 75 53 74 65 70 4f 6e 65 4f 70 28 70 2c 20 52 42  uStepOneOp(p, RB
18490 55 5f 44 45 4c 45 54 45 29 3b 0a 20 20 20 20 20  U_DELETE);.     
184a0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e   }.      if( p->
184b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
184c0 72 62 75 53 74 65 70 4f 6e 65 4f 70 28 70 2c 20  rbuStepOneOp(p, 
184d0 52 42 55 5f 49 4e 53 45 52 54 29 3b 0a 20 20 20  RBU_INSERT);.   
184e0 20 7d 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20   }.    else if( 
184f0 65 54 79 70 65 21 3d 52 42 55 5f 55 50 44 41 54  eType!=RBU_UPDAT
18500 45 20 29 7b 0a 20 20 20 20 20 20 72 62 75 53 74  E ){.      rbuSt
18510 65 70 4f 6e 65 4f 70 28 70 2c 20 65 54 79 70 65  epOneOp(p, eType
18520 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73  );.    }.    els
18530 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
18540 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20  _value *pVal;.  
18550 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
18560 20 2a 70 55 70 64 61 74 65 20 3d 20 30 3b 0a 20   *pUpdate = 0;. 
18570 20 20 20 20 20 61 73 73 65 72 74 28 20 65 54 79       assert( eTy
18580 70 65 3d 3d 52 42 55 5f 55 50 44 41 54 45 20 29  pe==RBU_UPDATE )
18590 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 50 68 61 73  ;.      p->nPhas
185a0 65 4f 6e 65 53 74 65 70 20 2d 3d 20 70 2d 3e 6f  eOneStep -= p->o
185b0 62 6a 69 74 65 72 2e 6e 49 6e 64 65 78 3b 0a 20  bjiter.nIndex;. 
185c0 20 20 20 20 20 72 62 75 47 65 74 55 70 64 61 74       rbuGetUpdat
185d0 65 53 74 6d 74 28 70 2c 20 70 49 74 65 72 2c 20  eStmt(p, pIter, 
185e0 7a 4d 61 73 6b 2c 20 26 70 55 70 64 61 74 65 29  zMask, &pUpdate)
185f0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 55 70 64  ;.      if( pUpd
18600 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ate ){.        i
18610 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 66 6f  nt i;.        fo
18620 72 28 69 3d 30 3b 20 70 2d 3e 72 63 3d 3d 53 51  r(i=0; p->rc==SQ
18630 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70 49 74  LITE_OK && i<pIt
18640 65 72 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  er->nCol; i++){.
18650 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 63            char c
18660 20 3d 20 7a 4d 61 73 6b 5b 70 49 74 65 72 2d 3e   = zMask[pIter->
18670 61 69 53 72 63 4f 72 64 65 72 5b 69 5d 5d 3b 0a  aiSrcOrder[i]];.
18680 20 20 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d            pVal =
18690 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
186a0 76 61 6c 75 65 28 70 49 74 65 72 2d 3e 70 53 65  value(pIter->pSe
186b0 6c 65 63 74 2c 20 69 29 3b 0a 20 20 20 20 20 20  lect, i);.      
186c0 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 61      if( pIter->a
186d0 62 54 62 6c 50 6b 5b 69 5d 20 7c 7c 20 63 21 3d  bTblPk[i] || c!=
186e0 27 2e 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20  '.' ){.         
186f0 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74     p->rc = sqlit
18700 65 33 5f 62 69 6e 64 5f 76 61 6c 75 65 28 70 55  e3_bind_value(pU
18710 70 64 61 74 65 2c 20 69 2b 31 2c 20 70 56 61 6c  pdate, i+1, pVal
18720 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
18730 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
18740 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
18750 54 45 5f 4f 4b 20 0a 20 20 20 20 20 20 20 20 20  TE_OK .         
18760 26 26 20 28 70 49 74 65 72 2d 3e 65 54 79 70 65  && (pIter->eType
18770 3d 3d 52 42 55 5f 50 4b 5f 56 54 41 42 20 7c 7c  ==RBU_PK_VTAB ||
18780 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52   pIter->eType==R
18790 42 55 5f 50 4b 5f 4e 4f 4e 45 29 20 0a 20 20 20  BU_PK_NONE) .   
187a0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
187b0 20 20 2f 2a 20 42 69 6e 64 20 74 68 65 20 72 62    /* Bind the rb
187c0 75 5f 72 6f 77 69 64 20 76 61 6c 75 65 20 74 6f  u_rowid value to
187d0 20 63 6f 6c 75 6d 6e 20 5f 72 6f 77 69 64 5f 20   column _rowid_ 
187e0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  */.          ass
187f0 65 72 74 43 6f 6c 75 6d 6e 4e 61 6d 65 28 70 49  ertColumnName(pI
18800 74 65 72 2d 3e 70 53 65 6c 65 63 74 2c 20 70 49  ter->pSelect, pI
18810 74 65 72 2d 3e 6e 43 6f 6c 2b 31 2c 20 22 72 62  ter->nCol+1, "rb
18820 75 5f 72 6f 77 69 64 22 29 3b 0a 20 20 20 20 20  u_rowid");.     
18830 20 20 20 20 20 70 56 61 6c 20 3d 20 73 71 6c 69       pVal = sqli
18840 74 65 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65  te3_column_value
18850 28 70 49 74 65 72 2d 3e 70 53 65 6c 65 63 74 2c  (pIter->pSelect,
18860 20 70 49 74 65 72 2d 3e 6e 43 6f 6c 2b 31 29 3b   pIter->nCol+1);
18870 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63  .          p->rc
18880 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f   = sqlite3_bind_
18890 76 61 6c 75 65 28 70 55 70 64 61 74 65 2c 20 70  value(pUpdate, p
188a0 49 74 65 72 2d 3e 6e 43 6f 6c 2b 31 2c 20 70 56  Iter->nCol+1, pV
188b0 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  al);.        }. 
188c0 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63         if( p->rc
188d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
188e0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
188f0 5f 73 74 65 70 28 70 55 70 64 61 74 65 29 3b 0a  _step(pUpdate);.
18900 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20            p->rc 
18910 3d 20 72 65 73 65 74 41 6e 64 43 6f 6c 6c 65 63  = resetAndCollec
18920 74 45 72 72 6f 72 28 70 55 70 64 61 74 65 2c 20  tError(pUpdate, 
18930 26 70 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a 20 20  &p->zErrmsg);.  
18940 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
18950 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
18960 72 6e 20 70 2d 3e 72 63 3b 0a 7d 0a 0a 2f 2a 0a  rn p->rc;.}../*.
18970 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65  ** Increment the
18980 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 6f   schema cookie o
18990 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  f the main datab
189a0 61 73 65 20 6f 70 65 6e 65 64 20 62 79 20 70 2d  ase opened by p-
189b0 3e 64 62 4d 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 4f  >dbMain..**.** O
189c0 72 2c 20 69 66 20 74 68 69 73 20 69 73 20 61 6e  r, if this is an
189d0 20 52 42 55 20 76 61 63 75 75 6d 2c 20 73 65 74   RBU vacuum, set
189e0 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b   the schema cook
189f0 69 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 64  ie of the main d
18a00 62 0a 2a 2a 20 6f 70 65 6e 65 64 20 62 79 20 70  b.** opened by p
18a10 2d 3e 64 62 4d 61 69 6e 20 74 6f 20 6f 6e 65 20  ->dbMain to one 
18a20 6d 6f 72 65 20 74 68 61 6e 20 74 68 65 20 73 63  more than the sc
18a30 68 65 6d 61 20 63 6f 6f 6b 69 65 20 6f 66 20 74  hema cookie of t
18a40 68 65 20 6d 61 69 6e 0a 2a 2a 20 64 62 20 6f 70  he main.** db op
18a50 65 6e 65 64 20 62 79 20 70 2d 3e 64 62 52 62 75  ened by p->dbRbu
18a60 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
18a70 20 72 62 75 49 6e 63 72 53 63 68 65 6d 61 43 6f   rbuIncrSchemaCo
18a80 6f 6b 69 65 28 73 71 6c 69 74 65 33 72 62 75 20  okie(sqlite3rbu 
18a90 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63  *p){.  if( p->rc
18aa0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
18ab0 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 72 65     sqlite3 *dbre
18ac0 61 64 20 3d 20 28 72 62 75 49 73 56 61 63 75 75  ad = (rbuIsVacuu
18ad0 6d 28 70 29 20 3f 20 70 2d 3e 64 62 52 62 75 20  m(p) ? p->dbRbu 
18ae0 3a 20 70 2d 3e 64 62 4d 61 69 6e 29 3b 0a 20 20  : p->dbMain);.  
18af0 20 20 69 6e 74 20 69 43 6f 6f 6b 69 65 20 3d 20    int iCookie = 
18b00 31 30 30 30 30 30 30 3b 0a 20 20 20 20 73 71 6c  1000000;.    sql
18b10 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
18b20 3b 0a 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 70  ;..    p->rc = p
18b30 72 65 70 61 72 65 41 6e 64 43 6f 6c 6c 65 63 74  repareAndCollect
18b40 45 72 72 6f 72 28 64 62 72 65 61 64 2c 20 26 70  Error(dbread, &p
18b50 53 74 6d 74 2c 20 26 70 2d 3e 7a 45 72 72 6d 73  Stmt, &p->zErrms
18b60 67 2c 20 0a 20 20 20 20 20 20 20 20 22 50 52 41  g, .        "PRA
18b70 47 4d 41 20 73 63 68 65 6d 61 5f 76 65 72 73 69  GMA schema_versi
18b80 6f 6e 22 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  on".    );.    i
18b90 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
18ba0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  _OK ){.      /* 
18bb0 43 6f 76 65 72 61 67 65 3a 20 69 74 20 6d 61 79  Coverage: it may
18bc0 20 62 65 20 74 68 61 74 20 74 68 69 73 20 73 71   be that this sq
18bd0 6c 69 74 65 33 5f 73 74 65 70 28 29 20 63 61 6e  lite3_step() can
18be0 6e 6f 74 20 66 61 69 6c 2e 20 54 68 65 72 65 0a  not fail. There.
18bf0 20 20 20 20 20 20 2a 2a 20 69 73 20 61 6c 72 65        ** is alre
18c00 61 64 79 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ady a transactio
18c10 6e 20 6f 70 65 6e 2c 20 73 6f 20 74 68 65 20 70  n open, so the p
18c20 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
18c30 74 20 63 61 6e 6e 6f 74 0a 20 20 20 20 20 20 2a  t cannot.      *
18c40 2a 20 74 68 72 6f 77 20 61 6e 20 53 51 4c 49 54  * throw an SQLIT
18c50 45 5f 53 43 48 45 4d 41 20 65 78 63 65 70 74 69  E_SCHEMA excepti
18c60 6f 6e 2e 20 54 68 65 20 6f 6e 6c 79 20 64 61 74  on. The only dat
18c70 61 62 61 73 65 20 70 61 67 65 20 74 68 65 0a 20  abase page the. 
18c80 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e       ** statemen
18c90 74 20 72 65 61 64 73 20 69 73 20 70 61 67 65 20  t reads is page 
18ca0 31 2c 20 77 68 69 63 68 20 69 73 20 67 75 61 72  1, which is guar
18cb0 61 6e 74 65 65 64 20 74 6f 20 62 65 20 69 6e 20  anteed to be in 
18cc0 74 68 65 20 63 61 63 68 65 2e 0a 20 20 20 20 20  the cache..     
18cd0 20 2a 2a 20 41 6e 64 20 6e 6f 20 6d 65 6d 6f 72   ** And no memor
18ce0 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 61 72  y allocations ar
18cf0 65 20 72 65 71 75 69 72 65 64 2e 20 20 2a 2f 0a  e required.  */.
18d00 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45        if( SQLITE
18d10 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74  _ROW==sqlite3_st
18d20 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20  ep(pStmt) ){.   
18d30 20 20 20 20 20 69 43 6f 6f 6b 69 65 20 3d 20 73       iCookie = s
18d40 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
18d50 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20  t(pStmt, 0);.   
18d60 20 20 20 7d 0a 20 20 20 20 20 20 72 62 75 46 69     }.      rbuFi
18d70 6e 61 6c 69 7a 65 28 70 2c 20 70 53 74 6d 74 29  nalize(p, pStmt)
18d80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
18d90 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
18da0 20 29 7b 0a 20 20 20 20 20 20 72 62 75 4d 50 72   ){.      rbuMPr
18db0 69 6e 74 66 45 78 65 63 28 70 2c 20 70 2d 3e 64  intfExec(p, p->d
18dc0 62 4d 61 69 6e 2c 20 22 50 52 41 47 4d 41 20 73  bMain, "PRAGMA s
18dd0 63 68 65 6d 61 5f 76 65 72 73 69 6f 6e 20 3d 20  chema_version = 
18de0 25 64 22 2c 20 69 43 6f 6f 6b 69 65 2b 31 29 3b  %d", iCookie+1);
18df0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
18e00 0a 2a 2a 20 55 70 64 61 74 65 20 74 68 65 20 63  .** Update the c
18e10 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 72  ontents of the r
18e20 62 75 5f 73 74 61 74 65 20 74 61 62 6c 65 20 77  bu_state table w
18e30 69 74 68 69 6e 20 74 68 65 20 72 62 75 20 64 61  ithin the rbu da
18e40 74 61 62 61 73 65 2e 20 54 68 65 0a 2a 2a 20 76  tabase. The.** v
18e50 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 74  alue stored in t
18e60 68 65 20 52 42 55 5f 53 54 41 54 45 5f 53 54 41  he RBU_STATE_STA
18e70 47 45 20 63 6f 6c 75 6d 6e 20 69 73 20 65 53 74  GE column is eSt
18e80 61 67 65 2e 20 41 6c 6c 20 6f 74 68 65 72 20 76  age. All other v
18e90 61 6c 75 65 73 0a 2a 2a 20 61 72 65 20 64 65 74  alues.** are det
18ea0 65 72 6d 69 6e 65 64 20 62 79 20 69 6e 73 70 65  ermined by inspe
18eb0 63 74 69 6e 67 20 74 68 65 20 72 62 75 20 68 61  cting the rbu ha
18ec0 6e 64 6c 65 20 70 61 73 73 65 64 20 61 73 20 74  ndle passed as t
18ed0 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
18ee0 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
18ef0 64 20 72 62 75 53 61 76 65 53 74 61 74 65 28 73  d rbuSaveState(s
18f00 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 69 6e  qlite3rbu *p, in
18f10 74 20 65 53 74 61 67 65 29 7b 0a 20 20 69 66 28  t eStage){.  if(
18f20 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
18f30 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  K || p->rc==SQLI
18f40 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 73  TE_DONE ){.    s
18f50 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 49 6e  qlite3_stmt *pIn
18f60 73 65 72 74 20 3d 20 30 3b 0a 20 20 20 20 72 62  sert = 0;.    rb
18f70 75 5f 66 69 6c 65 20 2a 70 46 64 20 3d 20 28 72  u_file *pFd = (r
18f80 62 75 49 73 56 61 63 75 75 6d 28 70 29 20 3f 20  buIsVacuum(p) ? 
18f90 70 2d 3e 70 52 62 75 46 64 20 3a 20 70 2d 3e 70  p->pRbuFd : p->p
18fa0 54 61 72 67 65 74 46 64 29 3b 0a 20 20 20 20 69  TargetFd);.    i
18fb0 6e 74 20 72 63 3b 0a 0a 20 20 20 20 61 73 73 65  nt rc;..    asse
18fc0 72 74 28 20 70 2d 3e 7a 45 72 72 6d 73 67 3d 3d  rt( p->zErrmsg==
18fd0 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 72  0 );.    rc = pr
18fe0 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c  epareFreeAndColl
18ff0 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 52 62  ectError(p->dbRb
19000 75 2c 20 26 70 49 6e 73 65 72 74 2c 20 26 70 2d  u, &pInsert, &p-
19010 3e 7a 45 72 72 6d 73 67 2c 20 0a 20 20 20 20 20  >zErrmsg, .     
19020 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e     sqlite3_mprin
19030 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 22 49  tf(.          "I
19040 4e 53 45 52 54 20 4f 52 20 52 45 50 4c 41 43 45  NSERT OR REPLACE
19050 20 49 4e 54 4f 20 25 73 2e 72 62 75 5f 73 74 61   INTO %s.rbu_sta
19060 74 65 28 6b 2c 20 76 29 20 56 41 4c 55 45 53 20  te(k, v) VALUES 
19070 22 0a 20 20 20 20 20 20 20 20 20 20 22 28 25 64  ".          "(%d
19080 2c 20 25 64 29 2c 20 22 0a 20 20 20 20 20 20 20  , %d), ".       
19090 20 20 20 22 28 25 64 2c 20 25 51 29 2c 20 22 0a     "(%d, %Q), ".
190a0 20 20 20 20 20 20 20 20 20 20 22 28 25 64 2c 20            "(%d, 
190b0 25 51 29 2c 20 22 0a 20 20 20 20 20 20 20 20 20  %Q), ".         
190c0 20 22 28 25 64 2c 20 25 64 29 2c 20 22 0a 20 20   "(%d, %d), ".  
190d0 20 20 20 20 20 20 20 20 22 28 25 64 2c 20 25 64          "(%d, %d
190e0 29 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 22  ), ".          "
190f0 28 25 64 2c 20 25 6c 6c 64 29 2c 20 22 0a 20 20  (%d, %lld), ".  
19100 20 20 20 20 20 20 20 20 22 28 25 64 2c 20 25 6c          "(%d, %l
19110 6c 64 29 2c 20 22 0a 20 20 20 20 20 20 20 20 20  ld), ".         
19120 20 22 28 25 64 2c 20 25 6c 6c 64 29 2c 20 22 0a   "(%d, %lld), ".
19130 20 20 20 20 20 20 20 20 20 20 22 28 25 64 2c 20            "(%d, 
19140 25 6c 6c 64 29 20 22 2c 0a 20 20 20 20 20 20 20  %lld) ",.       
19150 20 20 20 70 2d 3e 7a 53 74 61 74 65 44 62 2c 0a     p->zStateDb,.
19160 20 20 20 20 20 20 20 20 20 20 52 42 55 5f 53 54            RBU_ST
19170 41 54 45 5f 53 54 41 47 45 2c 20 65 53 74 61 67  ATE_STAGE, eStag
19180 65 2c 0a 20 20 20 20 20 20 20 20 20 20 52 42 55  e,.          RBU
19190 5f 53 54 41 54 45 5f 54 42 4c 2c 20 70 2d 3e 6f  _STATE_TBL, p->o
191a0 62 6a 69 74 65 72 2e 7a 54 62 6c 2c 20 0a 20 20  bjiter.zTbl, .  
191b0 20 20 20 20 20 20 20 20 52 42 55 5f 53 54 41 54          RBU_STAT
191c0 45 5f 49 44 58 2c 20 70 2d 3e 6f 62 6a 69 74 65  E_IDX, p->objite
191d0 72 2e 7a 49 64 78 2c 20 0a 20 20 20 20 20 20 20  r.zIdx, .       
191e0 20 20 20 52 42 55 5f 53 54 41 54 45 5f 52 4f 57     RBU_STATE_ROW
191f0 2c 20 70 2d 3e 6e 53 74 65 70 2c 20 0a 20 20 20  , p->nStep, .   
19200 20 20 20 20 20 20 20 52 42 55 5f 53 54 41 54 45         RBU_STATE
19210 5f 50 52 4f 47 52 45 53 53 2c 20 70 2d 3e 6e 50  _PROGRESS, p->nP
19220 72 6f 67 72 65 73 73 2c 0a 20 20 20 20 20 20 20  rogress,.       
19230 20 20 20 52 42 55 5f 53 54 41 54 45 5f 43 4b 50     RBU_STATE_CKP
19240 54 2c 20 70 2d 3e 69 57 61 6c 43 6b 73 75 6d 2c  T, p->iWalCksum,
19250 0a 20 20 20 20 20 20 20 20 20 20 52 42 55 5f 53  .          RBU_S
19260 54 41 54 45 5f 43 4f 4f 4b 49 45 2c 20 28 69 36  TATE_COOKIE, (i6
19270 34 29 70 46 64 2d 3e 69 43 6f 6f 6b 69 65 2c 0a  4)pFd->iCookie,.
19280 20 20 20 20 20 20 20 20 20 20 52 42 55 5f 53 54            RBU_ST
19290 41 54 45 5f 4f 41 4c 53 5a 2c 20 70 2d 3e 69 4f  ATE_OALSZ, p->iO
192a0 61 6c 53 7a 2c 0a 20 20 20 20 20 20 20 20 20 20  alSz,.          
192b0 52 42 55 5f 53 54 41 54 45 5f 50 48 41 53 45 4f  RBU_STATE_PHASEO
192c0 4e 45 53 54 45 50 2c 20 70 2d 3e 6e 50 68 61 73  NESTEP, p->nPhas
192d0 65 4f 6e 65 53 74 65 70 0a 20 20 20 20 20 20 29  eOneStep.      )
192e0 0a 20 20 20 20 29 3b 0a 20 20 20 20 61 73 73 65  .    );.    asse
192f0 72 74 28 20 70 49 6e 73 65 72 74 3d 3d 30 20 7c  rt( pInsert==0 |
19300 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  | rc==SQLITE_OK 
19310 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  );..    if( rc==
19320 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19330 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28     sqlite3_step(
19340 70 49 6e 73 65 72 74 29 3b 0a 20 20 20 20 20 20  pInsert);.      
19350 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e  rc = sqlite3_fin
19360 61 6c 69 7a 65 28 70 49 6e 73 65 72 74 29 3b 0a  alize(pInsert);.
19370 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
19380 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 2d  !=SQLITE_OK ) p-
19390 3e 72 63 20 3d 20 72 63 3b 0a 20 20 7d 0a 7d 0a  >rc = rc;.  }.}.
193a0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f  ../*.** The seco
193b0 6e 64 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73  nd argument pass
193c0 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ed to this funct
193d0 69 6f 6e 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ion is the name 
193e0 6f 66 20 61 20 50 52 41 47 4d 41 20 0a 2a 2a 20  of a PRAGMA .** 
193f0 73 65 74 74 69 6e 67 20 2d 20 22 70 61 67 65 5f  setting - "page_
19400 73 69 7a 65 22 2c 20 22 61 75 74 6f 5f 76 61 63  size", "auto_vac
19410 75 75 6d 22 2c 20 22 75 73 65 72 5f 76 65 72 73  uum", "user_vers
19420 69 6f 6e 22 20 6f 72 20 22 61 70 70 6c 69 63 61  ion" or "applica
19430 74 69 6f 6e 5f 69 64 22 2e 0a 2a 2a 20 54 68 69  tion_id"..** Thi
19440 73 20 66 75 6e 63 74 69 6f 6e 20 65 78 65 63 75  s function execu
19450 74 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  tes the followin
19460 67 20 6f 6e 20 73 71 6c 69 74 65 33 72 62 75 2e  g on sqlite3rbu.
19470 64 62 52 62 75 3a 0a 2a 2a 0a 2a 2a 20 20 20 22  dbRbu:.**.**   "
19480 50 52 41 47 4d 41 20 6d 61 69 6e 2e 24 7a 50 72  PRAGMA main.$zPr
19490 61 67 6d 61 22 0a 2a 2a 0a 2a 2a 20 77 68 65 72  agma".**.** wher
194a0 65 20 24 7a 50 72 61 67 6d 61 20 69 73 20 74 68  e $zPragma is th
194b0 65 20 73 74 72 69 6e 67 20 70 61 73 73 65 64 20  e string passed 
194c0 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
194d0 67 75 6d 65 6e 74 2c 20 74 68 65 6e 0a 2a 2a 20  gument, then.** 
194e0 6f 6e 20 73 71 6c 69 74 65 33 72 62 75 2e 64 62  on sqlite3rbu.db
194f0 4d 61 69 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 50  Main:.**.**   "P
19500 52 41 47 4d 41 20 6d 61 69 6e 2e 24 7a 50 72 61  RAGMA main.$zPra
19510 67 6d 61 20 3d 20 24 76 61 6c 22 0a 2a 2a 0a 2a  gma = $val".**.*
19520 2a 20 77 68 65 72 65 20 24 76 61 6c 20 69 73 20  * where $val is 
19530 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
19540 65 64 20 62 79 20 74 68 65 20 66 69 72 73 74 20  ed by the first 
19550 50 52 41 47 4d 41 20 69 6e 76 6f 63 61 74 69 6f  PRAGMA invocatio
19560 6e 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 73 68 6f 72  n..**.** In shor
19570 74 2c 20 69 74 20 63 6f 70 69 65 73 20 74 68 65  t, it copies the
19580 20 76 61 6c 75 65 20 20 6f 66 20 74 68 65 20 73   value  of the s
19590 70 65 63 69 66 69 65 64 20 50 52 41 47 4d 41 20  pecified PRAGMA 
195a0 73 65 74 74 69 6e 67 20 66 72 6f 6d 0a 2a 2a 20  setting from.** 
195b0 64 62 52 62 75 20 74 6f 20 64 62 4d 61 69 6e 2e  dbRbu to dbMain.
195c0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
195d0 72 62 75 43 6f 70 79 50 72 61 67 6d 61 28 73 71  rbuCopyPragma(sq
195e0 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 63 6f 6e  lite3rbu *p, con
195f0 73 74 20 63 68 61 72 20 2a 7a 50 72 61 67 6d 61  st char *zPragma
19600 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  ){.  if( p->rc==
19610 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19620 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
19630 50 72 61 67 6d 61 20 3d 20 30 3b 0a 20 20 20 20  Pragma = 0;.    
19640 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65 46  p->rc = prepareF
19650 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72  reeAndCollectErr
19660 6f 72 28 70 2d 3e 64 62 52 62 75 2c 20 26 70 50  or(p->dbRbu, &pP
19670 72 61 67 6d 61 2c 20 26 70 2d 3e 7a 45 72 72 6d  ragma, &p->zErrm
19680 73 67 2c 20 0a 20 20 20 20 20 20 20 20 73 71 6c  sg, .        sql
19690 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 50 52  ite3_mprintf("PR
196a0 41 47 4d 41 20 6d 61 69 6e 2e 25 73 22 2c 20 7a  AGMA main.%s", z
196b0 50 72 61 67 6d 61 29 0a 20 20 20 20 29 3b 0a 20  Pragma).    );. 
196c0 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
196d0 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54  LITE_OK && SQLIT
196e0 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73  E_ROW==sqlite3_s
196f0 74 65 70 28 70 50 72 61 67 6d 61 29 20 29 7b 0a  tep(pPragma) ){.
19700 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 62        p->rc = rb
19710 75 4d 50 72 69 6e 74 66 45 78 65 63 28 70 2c 20  uMPrintfExec(p, 
19720 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 50 52 41 47  p->dbMain, "PRAG
19730 4d 41 20 6d 61 69 6e 2e 25 73 20 3d 20 25 64 22  MA main.%s = %d"
19740 2c 0a 20 20 20 20 20 20 20 20 20 20 7a 50 72 61  ,.          zPra
19750 67 6d 61 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c  gma, sqlite3_col
19760 75 6d 6e 5f 69 6e 74 28 70 50 72 61 67 6d 61 2c  umn_int(pPragma,
19770 20 30 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20   0).      );.   
19780 20 7d 0a 20 20 20 20 72 62 75 46 69 6e 61 6c 69   }.    rbuFinali
19790 7a 65 28 70 2c 20 70 50 72 61 67 6d 61 29 3b 0a  ze(p, pPragma);.
197a0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65    }.}../*.** The
197b0 20 52 42 55 20 68 61 6e 64 6c 65 20 70 61 73 73   RBU handle pass
197c0 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61  ed as the only a
197d0 72 67 75 6d 65 6e 74 20 68 61 73 20 6a 75 73 74  rgument has just
197e0 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 61 6e 64   been opened and
197f0 20 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20 64   .** the state d
19800 61 74 61 62 61 73 65 20 69 73 20 65 6d 70 74 79  atabase is empty
19810 2e 20 49 66 20 74 68 69 73 20 52 42 55 20 68 61  . If this RBU ha
19820 6e 64 6c 65 20 77 61 73 20 6f 70 65 6e 65 64 20  ndle was opened 
19830 66 6f 72 20 61 6e 0a 2a 2a 20 52 42 55 20 76 61  for an.** RBU va
19840 63 75 75 6d 20 6f 70 65 72 61 74 69 6f 6e 2c 20  cuum operation, 
19850 63 72 65 61 74 65 20 74 68 65 20 73 63 68 65 6d  create the schem
19860 61 20 69 6e 20 74 68 65 20 74 61 72 67 65 74 20  a in the target 
19870 64 62 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  db..*/.static vo
19880 69 64 20 72 62 75 43 72 65 61 74 65 54 61 72 67  id rbuCreateTarg
19890 65 74 53 63 68 65 6d 61 28 73 71 6c 69 74 65 33  etSchema(sqlite3
198a0 72 62 75 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74  rbu *p){.  sqlit
198b0 65 33 5f 73 74 6d 74 20 2a 70 53 71 6c 20 3d 20  e3_stmt *pSql = 
198c0 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  0;.  sqlite3_stm
198d0 74 20 2a 70 49 6e 73 65 72 74 20 3d 20 30 3b 0a  t *pInsert = 0;.
198e0 0a 20 20 61 73 73 65 72 74 28 20 72 62 75 49 73  .  assert( rbuIs
198f0 56 61 63 75 75 6d 28 70 29 20 29 3b 0a 20 20 70  Vacuum(p) );.  p
19900 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65  ->rc = sqlite3_e
19910 78 65 63 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 22  xec(p->dbMain, "
19920 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f  PRAGMA writable_
19930 73 63 68 65 6d 61 3d 31 22 2c 20 30 2c 30 2c 20  schema=1", 0,0, 
19940 26 70 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a 20 20  &p->zErrmsg);.  
19950 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
19960 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d 3e 72  E_OK ){.    p->r
19970 63 20 3d 20 70 72 65 70 61 72 65 41 6e 64 43 6f  c = prepareAndCo
19980 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62  llectError(p->db
19990 52 62 75 2c 20 26 70 53 71 6c 2c 20 26 70 2d 3e  Rbu, &pSql, &p->
199a0 7a 45 72 72 6d 73 67 2c 20 0a 20 20 20 20 20 20  zErrmsg, .      
199b0 22 53 45 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d  "SELECT sql FROM
199c0 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 57   sqlite_master W
199d0 48 45 52 45 20 73 71 6c 21 3d 27 27 20 41 4e 44  HERE sql!='' AND
199e0 20 72 6f 6f 74 70 61 67 65 21 3d 30 22 0a 20 20   rootpage!=0".  
199f0 20 20 20 20 22 20 41 4e 44 20 6e 61 6d 65 21 3d      " AND name!=
19a00 27 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65  'sqlite_sequence
19a10 27 20 22 0a 20 20 20 20 20 20 22 20 4f 52 44 45  ' ".      " ORDE
19a20 52 20 42 59 20 74 79 70 65 20 44 45 53 43 22 0a  R BY type DESC".
19a30 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 77 68      );.  }..  wh
19a40 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ile( p->rc==SQLI
19a50 54 45 5f 4f 4b 20 26 26 20 73 71 6c 69 74 65 33  TE_OK && sqlite3
19a60 5f 73 74 65 70 28 70 53 71 6c 29 3d 3d 53 51 4c  _step(pSql)==SQL
19a70 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 63  ITE_ROW ){.    c
19a80 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 20  onst char *zSql 
19a90 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
19aa0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
19ab0 78 74 28 70 53 71 6c 2c 20 30 29 3b 0a 20 20 20  xt(pSql, 0);.   
19ac0 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33   p->rc = sqlite3
19ad0 5f 65 78 65 63 28 70 2d 3e 64 62 4d 61 69 6e 2c  _exec(p->dbMain,
19ae0 20 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 26 70 2d   zSql, 0, 0, &p-
19af0 3e 7a 45 72 72 6d 73 67 29 3b 0a 20 20 7d 0a 20  >zErrmsg);.  }. 
19b00 20 72 62 75 46 69 6e 61 6c 69 7a 65 28 70 2c 20   rbuFinalize(p, 
19b10 70 53 71 6c 29 3b 0a 20 20 69 66 28 20 70 2d 3e  pSql);.  if( p->
19b20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
19b30 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66 28 20 70  return;..  if( p
19b40 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
19b50 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 70  ){.    p->rc = p
19b60 72 65 70 61 72 65 41 6e 64 43 6f 6c 6c 65 63 74  repareAndCollect
19b70 45 72 72 6f 72 28 70 2d 3e 64 62 52 62 75 2c 20  Error(p->dbRbu, 
19b80 26 70 53 71 6c 2c 20 26 70 2d 3e 7a 45 72 72 6d  &pSql, &p->zErrm
19b90 73 67 2c 20 0a 20 20 20 20 20 20 20 20 22 53 45  sg, .        "SE
19ba0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69  LECT * FROM sqli
19bb0 74 65 5f 6d 61 73 74 65 72 20 57 48 45 52 45 20  te_master WHERE 
19bc0 72 6f 6f 74 70 61 67 65 3d 30 20 4f 52 20 72 6f  rootpage=0 OR ro
19bd0 6f 74 70 61 67 65 20 49 53 20 4e 55 4c 4c 22 20  otpage IS NULL" 
19be0 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 69  .    );.  }..  i
19bf0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
19c00 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63  _OK ){.    p->rc
19c10 20 3d 20 70 72 65 70 61 72 65 41 6e 64 43 6f 6c   = prepareAndCol
19c20 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 4d  lectError(p->dbM
19c30 61 69 6e 2c 20 26 70 49 6e 73 65 72 74 2c 20 26  ain, &pInsert, &
19c40 70 2d 3e 7a 45 72 72 6d 73 67 2c 20 0a 20 20 20  p->zErrmsg, .   
19c50 20 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54       "INSERT INT
19c60 4f 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  O sqlite_master 
19c70 56 41 4c 55 45 53 28 3f 2c 3f 2c 3f 2c 3f 2c 3f  VALUES(?,?,?,?,?
19c80 29 22 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20  )".    );.  }.. 
19c90 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53   while( p->rc==S
19ca0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 71 6c 69  QLITE_OK && sqli
19cb0 74 65 33 5f 73 74 65 70 28 70 53 71 6c 29 3d 3d  te3_step(pSql)==
19cc0 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
19cd0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
19ce0 28 69 3d 30 3b 20 69 3c 35 3b 20 69 2b 2b 29 7b  (i=0; i<5; i++){
19cf0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62  .      sqlite3_b
19d00 69 6e 64 5f 76 61 6c 75 65 28 70 49 6e 73 65 72  ind_value(pInser
19d10 74 2c 20 69 2b 31 2c 20 73 71 6c 69 74 65 33 5f  t, i+1, sqlite3_
19d20 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28 70 53 71  column_value(pSq
19d30 6c 2c 20 69 29 29 3b 0a 20 20 20 20 7d 0a 20 20  l, i));.    }.  
19d40 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70    sqlite3_step(p
19d50 49 6e 73 65 72 74 29 3b 0a 20 20 20 20 70 2d 3e  Insert);.    p->
19d60 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73  rc = sqlite3_res
19d70 65 74 28 70 49 6e 73 65 72 74 29 3b 0a 20 20 7d  et(pInsert);.  }
19d80 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
19d90 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
19da0 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65  ->rc = sqlite3_e
19db0 78 65 63 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 22  xec(p->dbMain, "
19dc0 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f  PRAGMA writable_
19dd0 73 63 68 65 6d 61 3d 30 22 2c 30 2c 30 2c 26 70  schema=0",0,0,&p
19de0 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a 20 20 7d 0a  ->zErrmsg);.  }.
19df0 0a 20 20 72 62 75 46 69 6e 61 6c 69 7a 65 28 70  .  rbuFinalize(p
19e00 2c 20 70 53 71 6c 29 3b 0a 20 20 72 62 75 46 69  , pSql);.  rbuFi
19e10 6e 61 6c 69 7a 65 28 70 2c 20 70 49 6e 73 65 72  nalize(p, pInser
19e20 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 65  t);.}../*.** Ste
19e30 70 20 74 68 65 20 52 42 55 20 6f 62 6a 65 63 74  p the RBU object
19e40 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
19e50 72 62 75 5f 73 74 65 70 28 73 71 6c 69 74 65 33  rbu_step(sqlite3
19e60 72 62 75 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  rbu *p){.  if( p
19e70 20 29 7b 0a 20 20 20 20 73 77 69 74 63 68 28 20   ){.    switch( 
19e80 70 2d 3e 65 53 74 61 67 65 20 29 7b 0a 20 20 20  p->eStage ){.   
19e90 20 20 20 63 61 73 65 20 52 42 55 5f 53 54 41 47     case RBU_STAG
19ea0 45 5f 4f 41 4c 3a 20 7b 0a 20 20 20 20 20 20 20  E_OAL: {.       
19eb0 20 52 62 75 4f 62 6a 49 74 65 72 20 2a 70 49 74   RbuObjIter *pIt
19ec0 65 72 20 3d 20 26 70 2d 3e 6f 62 6a 69 74 65 72  er = &p->objiter
19ed0 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ;..        /* If
19ee0 20 74 68 69 73 20 69 73 20 61 6e 20 52 42 55 20   this is an RBU 
19ef0 76 61 63 75 75 6d 20 6f 70 65 72 61 74 69 6f 6e  vacuum operation
19f00 20 61 6e 64 20 74 68 65 20 73 74 61 74 65 20 74   and the state t
19f10 61 62 6c 65 20 77 61 73 20 65 6d 70 74 79 0a 20  able was empty. 
19f20 20 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 74         ** when t
19f30 68 69 73 20 68 61 6e 64 6c 65 20 77 61 73 20 6f  his handle was o
19f40 70 65 6e 65 64 2c 20 63 72 65 61 74 65 20 74 68  pened, create th
19f50 65 20 74 61 72 67 65 74 20 64 61 74 61 62 61 73  e target databas
19f60 65 20 73 63 68 65 6d 61 2e 20 2a 2f 0a 20 20 20  e schema. */.   
19f70 20 20 20 20 20 69 66 28 20 72 62 75 49 73 56 61       if( rbuIsVa
19f80 63 75 75 6d 28 70 29 20 26 26 20 70 2d 3e 6e 50  cuum(p) && p->nP
19f90 72 6f 67 72 65 73 73 3d 3d 30 20 26 26 20 70 2d  rogress==0 && p-
19fa0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
19fb0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 62 75 43  {.          rbuC
19fc0 72 65 61 74 65 54 61 72 67 65 74 53 63 68 65 6d  reateTargetSchem
19fd0 61 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  a(p);.          
19fe0 72 62 75 43 6f 70 79 50 72 61 67 6d 61 28 70 2c  rbuCopyPragma(p,
19ff0 20 22 75 73 65 72 5f 76 65 72 73 69 6f 6e 22 29   "user_version")
1a000 3b 0a 20 20 20 20 20 20 20 20 20 20 72 62 75 43  ;.          rbuC
1a010 6f 70 79 50 72 61 67 6d 61 28 70 2c 20 22 61 70  opyPragma(p, "ap
1a020 70 6c 69 63 61 74 69 6f 6e 5f 69 64 22 29 3b 0a  plication_id");.
1a030 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
1a040 20 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d     while( p->rc=
1a050 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 49  =SQLITE_OK && pI
1a060 74 65 72 2d 3e 7a 54 62 6c 20 29 7b 0a 0a 20 20  ter->zTbl ){..  
1a070 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65          if( pIte
1a080 72 2d 3e 62 43 6c 65 61 6e 75 70 20 29 7b 0a 20  r->bCleanup ){. 
1a090 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6c             /* Cl
1a0a0 65 61 6e 20 75 70 20 74 68 65 20 72 62 75 5f 74  ean up the rbu_t
1a0b0 6d 70 5f 78 78 78 20 74 61 62 6c 65 20 66 6f 72  mp_xxx table for
1a0c0 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 74 61   the previous ta
1a0d0 62 6c 65 2e 20 49 74 20 0a 20 20 20 20 20 20 20  ble. It .       
1a0e0 20 20 20 20 20 2a 2a 20 63 61 6e 6e 6f 74 20 62       ** cannot b
1a0f0 65 20 64 72 6f 70 70 65 64 20 61 73 20 74 68 65  e dropped as the
1a100 72 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  re are currently
1a110 20 61 63 74 69 76 65 20 53 51 4c 20 73 74 61 74   active SQL stat
1a120 65 6d 65 6e 74 73 2e 0a 20 20 20 20 20 20 20 20  ements..        
1a130 20 20 20 20 2a 2a 20 42 75 74 20 74 68 65 20 63      ** But the c
1a140 6f 6e 74 65 6e 74 73 20 63 61 6e 20 62 65 20 64  ontents can be d
1a150 65 6c 65 74 65 64 2e 20 20 2a 2f 0a 20 20 20 20  eleted.  */.    
1a160 20 20 20 20 20 20 20 20 69 66 28 20 72 62 75 49          if( rbuI
1a170 73 56 61 63 75 75 6d 28 70 29 3d 3d 30 20 26 26  sVacuum(p)==0 &&
1a180 20 70 49 74 65 72 2d 3e 61 62 49 6e 64 65 78 65   pIter->abIndexe
1a190 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  d ){.           
1a1a0 20 20 20 72 62 75 4d 50 72 69 6e 74 66 45 78 65     rbuMPrintfExe
1a1b0 63 28 70 2c 20 70 2d 3e 64 62 52 62 75 2c 20 0a  c(p, p->dbRbu, .
1a1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a1d0 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25    "DELETE FROM %
1a1e0 73 2e 27 72 62 75 5f 74 6d 70 5f 25 71 27 22 2c  s.'rbu_tmp_%q'",
1a1f0 20 70 2d 3e 7a 53 74 61 74 65 44 62 2c 20 70 49   p->zStateDb, pI
1a200 74 65 72 2d 3e 7a 44 61 74 61 54 62 6c 0a 20 20  ter->zDataTbl.  
1a210 20 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20              );. 
1a220 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1a230 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1a240 20 20 20 20 20 20 20 20 20 20 72 62 75 4f 62 6a            rbuObj
1a250 49 74 65 72 50 72 65 70 61 72 65 41 6c 6c 28 70  IterPrepareAll(p
1a260 2c 20 70 49 74 65 72 2c 20 30 29 3b 0a 0a 20 20  , pIter, 0);..  
1a270 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 76            /* Adv
1a280 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74  ance to the next
1a290 20 72 6f 77 20 74 6f 20 70 72 6f 63 65 73 73 2e   row to process.
1a2a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
1a2b0 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
1a2c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1a2d0 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73        int rc = s
1a2e0 71 6c 69 74 65 33 5f 73 74 65 70 28 70 49 74 65  qlite3_step(pIte
1a2f0 72 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  r->pSelect);.   
1a300 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
1a310 63 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  c==SQLITE_ROW ){
1a320 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a330 20 70 2d 3e 6e 50 72 6f 67 72 65 73 73 2b 2b 3b   p->nProgress++;
1a340 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a350 20 70 2d 3e 6e 53 74 65 70 2b 2b 3b 0a 20 20 20   p->nStep++;.   
1a360 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
1a370 75 72 6e 20 72 62 75 53 74 65 70 28 70 29 3b 0a  urn rbuStep(p);.
1a380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
1a390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
1a3a0 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65  >rc = sqlite3_re
1a3b0 73 65 74 28 70 49 74 65 72 2d 3e 70 53 65 6c 65  set(pIter->pSele
1a3c0 63 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ct);.           
1a3d0 20 20 20 70 2d 3e 6e 53 74 65 70 20 3d 20 30 3b     p->nStep = 0;
1a3e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
1a3f0 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20           }..    
1a400 20 20 20 20 20 20 72 62 75 4f 62 6a 49 74 65 72        rbuObjIter
1a410 4e 65 78 74 28 70 2c 20 70 49 74 65 72 29 3b 0a  Next(p, pIter);.
1a420 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
1a430 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
1a440 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1a450 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74       assert( pIt
1a460 65 72 2d 3e 7a 54 62 6c 3d 3d 30 20 29 3b 0a 20  er->zTbl==0 );. 
1a470 20 20 20 20 20 20 20 20 20 72 62 75 53 61 76 65           rbuSave
1a480 53 74 61 74 65 28 70 2c 20 52 42 55 5f 53 54 41  State(p, RBU_STA
1a490 47 45 5f 4d 4f 56 45 29 3b 0a 20 20 20 20 20 20  GE_MOVE);.      
1a4a0 20 20 20 20 72 62 75 49 6e 63 72 53 63 68 65 6d      rbuIncrSchem
1a4b0 61 43 6f 6f 6b 69 65 28 70 29 3b 0a 20 20 20 20  aCookie(p);.    
1a4c0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
1a4d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1a4e0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20            p->rc 
1a4f0 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70  = sqlite3_exec(p
1a500 2d 3e 64 62 4d 61 69 6e 2c 20 22 43 4f 4d 4d 49  ->dbMain, "COMMI
1a510 54 22 2c 20 30 2c 20 30 2c 20 26 70 2d 3e 7a 45  T", 0, 0, &p->zE
1a520 72 72 6d 73 67 29 3b 0a 20 20 20 20 20 20 20 20  rrmsg);.        
1a530 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
1a540 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
1a550 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
1a560 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65    p->rc = sqlite
1a570 33 5f 65 78 65 63 28 70 2d 3e 64 62 52 62 75 2c  3_exec(p->dbRbu,
1a580 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 2c   "COMMIT", 0, 0,
1a590 20 26 70 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a 20   &p->zErrmsg);. 
1a5a0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1a5b0 20 20 20 20 20 70 2d 3e 65 53 74 61 67 65 20 3d       p->eStage =
1a5c0 20 52 42 55 5f 53 54 41 47 45 5f 4d 4f 56 45 3b   RBU_STAGE_MOVE;
1a5d0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1a5e0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1a5f0 7d 0a 0a 20 20 20 20 20 20 63 61 73 65 20 52 42  }..      case RB
1a600 55 5f 53 54 41 47 45 5f 4d 4f 56 45 3a 20 7b 0a  U_STAGE_MOVE: {.
1a610 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72          if( p->r
1a620 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1a630 20 20 20 20 20 20 20 20 20 20 72 62 75 4d 6f 76            rbuMov
1a640 65 4f 61 6c 46 69 6c 65 28 70 29 3b 0a 20 20 20  eOalFile(p);.   
1a650 20 20 20 20 20 20 20 70 2d 3e 6e 50 72 6f 67 72         p->nProgr
1a660 65 73 73 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d  ess++;.        }
1a670 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
1a680 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 63        }..      c
1a690 61 73 65 20 52 42 55 5f 53 54 41 47 45 5f 43 4b  ase RBU_STAGE_CK
1a6a0 50 54 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66  PT: {.        if
1a6b0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
1a6c0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
1a6d0 69 66 28 20 70 2d 3e 6e 53 74 65 70 3e 3d 70 2d  if( p->nStep>=p-
1a6e0 3e 6e 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 20  >nFrame ){.     
1a6f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
1a700 69 6c 65 20 2a 70 44 62 20 3d 20 70 2d 3e 70 54  ile *pDb = p->pT
1a710 61 72 67 65 74 46 64 2d 3e 70 52 65 61 6c 3b 0a  argetFd->pReal;.
1a720 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f    .            /
1a730 2a 20 53 79 6e 63 20 74 68 65 20 64 62 20 66 69  * Sync the db fi
1a740 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  le */.          
1a750 20 20 70 2d 3e 72 63 20 3d 20 70 44 62 2d 3e 70    p->rc = pDb->p
1a760 4d 65 74 68 6f 64 73 2d 3e 78 53 79 6e 63 28 70  Methods->xSync(p
1a770 44 62 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  Db, SQLITE_SYNC_
1a780 4e 4f 52 4d 41 4c 29 3b 0a 20 20 0a 20 20 20 20  NORMAL);.  .    
1a790 20 20 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74          /* Updat
1a7a0 65 20 6e 42 61 63 6b 66 69 6c 6c 20 2a 2f 0a 20  e nBackfill */. 
1a7b0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
1a7c0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
1a7d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1a7e0 20 76 6f 69 64 20 76 6f 6c 61 74 69 6c 65 20 2a   void volatile *
1a7f0 70 74 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ptr;.           
1a800 20 20 20 70 2d 3e 72 63 20 3d 20 70 44 62 2d 3e     p->rc = pDb->
1a810 70 4d 65 74 68 6f 64 73 2d 3e 78 53 68 6d 4d 61  pMethods->xShmMa
1a820 70 28 70 44 62 2c 20 30 2c 20 33 32 2a 31 30 32  p(pDb, 0, 32*102
1a830 34 2c 20 30 2c 20 26 70 74 72 29 3b 0a 20 20 20  4, 0, &ptr);.   
1a840 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
1a850 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
1a860 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1a870 20 20 20 28 28 75 33 32 20 76 6f 6c 61 74 69 6c     ((u32 volatil
1a880 65 2a 29 70 74 72 29 5b 32 34 5d 20 3d 20 70 2d  e*)ptr)[24] = p-
1a890 3e 69 4d 61 78 46 72 61 6d 65 3b 0a 20 20 20 20  >iMaxFrame;.    
1a8a0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1a8b0 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20          }.  .   
1a8c0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e           if( p->
1a8d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1a8e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
1a8f0 2d 3e 65 53 74 61 67 65 20 3d 20 52 42 55 5f 53  ->eStage = RBU_S
1a900 54 41 47 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20  TAGE_DONE;.     
1a910 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d           p->rc =
1a920 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
1a930 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1a940 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1a950 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20 6f           /* At o
1a960 6e 65 20 70 6f 69 6e 74 20 74 68 65 20 66 6f 6c  ne point the fol
1a970 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 63 6f 70  lowing block cop
1a980 69 65 64 20 61 20 73 69 6e 67 6c 65 20 66 72 61  ied a single fra
1a990 6d 65 20 66 72 6f 6d 20 74 68 65 0a 20 20 20 20  me from the.    
1a9a0 20 20 20 20 20 20 20 20 2a 2a 20 77 61 6c 20 66          ** wal f
1a9b0 69 6c 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  ile to the datab
1a9c0 61 73 65 20 66 69 6c 65 2e 20 53 6f 20 74 68 61  ase file. So tha
1a9d0 74 20 6f 6e 65 20 63 61 6c 6c 20 74 6f 20 73 71  t one call to sq
1a9e0 6c 69 74 65 33 72 62 75 5f 73 74 65 70 28 29 0a  lite3rbu_step().
1a9f0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63              ** c
1aa00 68 65 63 6b 70 6f 69 6e 74 65 64 20 61 20 73 69  heckpointed a si
1aa10 6e 67 6c 65 20 66 72 61 6d 65 2e 20 0a 20 20 20  ngle frame. .   
1aa20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20           **.    
1aa30 20 20 20 20 20 20 20 20 2a 2a 20 48 6f 77 65 76          ** Howev
1aa40 65 72 2c 20 69 66 20 74 68 65 20 73 65 63 74 6f  er, if the secto
1aa50 72 2d 73 69 7a 65 20 69 73 20 6c 61 72 67 65 72  r-size is larger
1aa60 20 74 68 61 6e 20 74 68 65 20 70 61 67 65 2d 73   than the page-s
1aa70 69 7a 65 2c 20 61 6e 64 20 74 68 65 0a 20 20 20  ize, and the.   
1aa80 20 20 20 20 20 20 20 20 20 2a 2a 20 61 70 70 6c           ** appl
1aa90 69 63 61 74 69 6f 6e 20 63 61 6c 6c 73 20 73 71  ication calls sq
1aaa0 6c 69 74 65 33 72 62 75 5f 73 61 76 65 73 74 61  lite3rbu_savesta
1aab0 74 65 28 29 20 6f 72 20 63 6c 6f 73 65 28 29 20  te() or close() 
1aac0 69 6d 6d 65 64 69 61 74 65 6c 79 0a 20 20 20 20  immediately.    
1aad0 20 20 20 20 20 20 20 20 2a 2a 20 61 66 74 65 72          ** after
1aae0 20 74 68 69 73 20 73 74 65 70 2c 20 74 68 65 6e   this step, then
1aaf0 20 72 62 75 5f 73 74 65 70 28 29 20 61 67 61 69   rbu_step() agai
1ab00 6e 2c 20 74 68 65 6e 20 61 20 70 6f 77 65 72 20  n, then a power 
1ab10 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2c 0a  failure occurs,.
1ab20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
1ab30 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  hen the database
1ab40 20 70 61 67 65 20 77 72 69 74 74 65 6e 20 68 65   page written he
1ab50 72 65 20 6d 61 79 20 62 65 20 64 61 6d 61 67 65  re may be damage
1ab60 64 2e 20 57 6f 72 6b 20 61 72 6f 75 6e 64 0a 20  d. Work around. 
1ab70 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68             ** th
1ab80 69 73 20 62 79 20 63 68 65 63 6b 70 6f 69 6e 74  is by checkpoint
1ab90 69 6e 67 20 66 72 61 6d 65 73 20 75 6e 74 69 6c  ing frames until
1aba0 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
1abb0 6e 20 74 68 65 20 61 46 72 61 6d 65 5b 5d 0a 20  n the aFrame[]. 
1abc0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6c 69             ** li
1abd0 65 73 20 6f 6e 20 61 20 64 69 66 66 65 72 65 6e  es on a differen
1abe0 74 20 64 69 73 6b 20 73 65 63 74 6f 72 20 74 6f  t disk sector to
1abf0 20 74 68 65 20 63 75 72 72 65 6e 74 20 6f 6e 65   the current one
1ac00 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  . */.           
1ac10 20 75 33 32 20 69 53 65 63 74 6f 72 3b 0a 20 20   u32 iSector;.  
1ac20 20 20 20 20 20 20 20 20 20 20 64 6f 7b 0a 20 20            do{.  
1ac30 20 20 20 20 20 20 20 20 20 20 20 20 52 62 75 46              RbuF
1ac40 72 61 6d 65 20 2a 70 46 72 61 6d 65 20 3d 20 26  rame *pFrame = &
1ac50 70 2d 3e 61 46 72 61 6d 65 5b 70 2d 3e 6e 53 74  p->aFrame[p->nSt
1ac60 65 70 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ep];.           
1ac70 20 20 20 69 53 65 63 74 6f 72 20 3d 20 28 70 46     iSector = (pF
1ac80 72 61 6d 65 2d 3e 69 44 62 50 61 67 65 2d 31 29  rame->iDbPage-1)
1ac90 20 2f 20 70 2d 3e 6e 50 61 67 65 50 65 72 53 65   / p->nPagePerSe
1aca0 63 74 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20  ctor;.          
1acb0 20 20 20 20 72 62 75 43 68 65 63 6b 70 6f 69 6e      rbuCheckpoin
1acc0 74 46 72 61 6d 65 28 70 2c 20 70 46 72 61 6d 65  tFrame(p, pFrame
1acd0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
1ace0 20 70 2d 3e 6e 53 74 65 70 2b 2b 3b 0a 20 20 20   p->nStep++;.   
1acf0 20 20 20 20 20 20 20 20 20 7d 77 68 69 6c 65 28           }while(
1ad00 20 70 2d 3e 6e 53 74 65 70 3c 70 2d 3e 6e 46 72   p->nStep<p->nFr
1ad10 61 6d 65 20 0a 20 20 20 20 20 20 20 20 20 20 20  ame .           
1ad20 20 20 20 20 20 20 26 26 20 69 53 65 63 74 6f 72        && iSector
1ad30 3d 3d 28 28 70 2d 3e 61 46 72 61 6d 65 5b 70 2d  ==((p->aFrame[p-
1ad40 3e 6e 53 74 65 70 5d 2e 69 44 62 50 61 67 65 2d  >nStep].iDbPage-
1ad50 31 29 20 2f 20 70 2d 3e 6e 50 61 67 65 50 65 72  1) / p->nPagePer
1ad60 53 65 63 74 6f 72 29 0a 20 20 20 20 20 20 20 20  Sector).        
1ad70 20 20 20 20 20 20 20 20 20 26 26 20 70 2d 3e 72           && p->r
1ad80 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20  c==SQLITE_OK.   
1ad90 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
1ada0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1adb0 20 20 70 2d 3e 6e 50 72 6f 67 72 65 73 73 2b 2b    p->nProgress++
1adc0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1add0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1ade0 20 7d 0a 0a 20 20 20 20 20 20 64 65 66 61 75 6c   }..      defaul
1adf0 74 3a 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  t:.        break
1ae00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
1ae10 72 6e 20 70 2d 3e 72 63 3b 0a 20 20 7d 65 6c 73  rn p->rc;.  }els
1ae20 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  e{.    return SQ
1ae30 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
1ae40 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65  }../*.** Compare
1ae50 20 73 74 72 69 6e 67 73 20 7a 31 20 61 6e 64 20   strings z1 and 
1ae60 7a 32 2c 20 72 65 74 75 72 6e 69 6e 67 20 30 20  z2, returning 0 
1ae70 69 66 20 74 68 65 79 20 61 72 65 20 69 64 65 6e  if they are iden
1ae80 74 69 63 61 6c 2c 20 6f 72 20 6e 6f 6e 2d 7a 65  tical, or non-ze
1ae90 72 6f 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 2e  ro.** otherwise.
1aea0 20 45 69 74 68 65 72 20 6f 72 20 62 6f 74 68 20   Either or both 
1aeb0 61 72 67 75 6d 65 6e 74 20 6d 61 79 20 62 65 20  argument may be 
1aec0 4e 55 4c 4c 2e 20 54 77 6f 20 4e 55 4c 4c 20 76  NULL. Two NULL v
1aed0 61 6c 75 65 73 20 61 72 65 0a 2a 2a 20 63 6f 6e  alues are.** con
1aee0 73 69 64 65 72 65 64 20 65 71 75 61 6c 2c 20 61  sidered equal, a
1aef0 6e 64 20 4e 55 4c 4c 20 69 73 20 63 6f 6e 73 69  nd NULL is consi
1af00 64 65 72 65 64 20 64 69 73 74 69 6e 63 74 20 66  dered distinct f
1af10 72 6f 6d 20 61 6c 6c 20 6f 74 68 65 72 20 76 61  rom all other va
1af20 6c 75 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lues..*/.static 
1af30 69 6e 74 20 72 62 75 53 74 72 43 6f 6d 70 61 72  int rbuStrCompar
1af40 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 31  e(const char *z1
1af50 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32  , const char *z2
1af60 29 7b 0a 20 20 69 66 28 20 7a 31 3d 3d 30 20 26  ){.  if( z1==0 &
1af70 26 20 7a 32 3d 3d 30 20 29 20 72 65 74 75 72 6e  & z2==0 ) return
1af80 20 30 3b 0a 20 20 69 66 28 20 7a 31 3d 3d 30 20   0;.  if( z1==0 
1af90 7c 7c 20 7a 32 3d 3d 30 20 29 20 72 65 74 75 72  || z2==0 ) retur
1afa0 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 28 73  n 1;.  return (s
1afb0 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a  qlite3_stricmp(z
1afc0 31 2c 20 7a 32 29 21 3d 30 29 3b 0a 7d 0a 0a 2f  1, z2)!=0);.}../
1afd0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1afe0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 73 20  on is called as 
1aff0 70 61 72 74 20 6f 66 20 73 71 6c 69 74 65 33 72  part of sqlite3r
1b000 62 75 5f 6f 70 65 6e 28 29 20 77 68 65 6e 20 69  bu_open() when i
1b010 6e 69 74 69 61 6c 69 7a 69 6e 67 0a 2a 2a 20 61  nitializing.** a
1b020 6e 20 72 62 75 20 68 61 6e 64 6c 65 20 69 6e 20  n rbu handle in 
1b030 4f 41 4c 20 73 74 61 67 65 2e 20 49 66 20 74 68  OAL stage. If th
1b040 65 20 72 62 75 20 75 70 64 61 74 65 20 68 61 73  e rbu update has
1b050 20 6e 6f 74 20 73 74 61 72 74 65 64 20 28 69 2e   not started (i.
1b060 65 2e 0a 2a 2a 20 74 68 65 20 72 62 75 5f 73 74  e..** the rbu_st
1b070 61 74 65 20 74 61 62 6c 65 20 77 61 73 20 65 6d  ate table was em
1b080 70 74 79 29 20 69 74 20 69 73 20 61 20 6e 6f 2d  pty) it is a no-
1b090 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  op. Otherwise, i
1b0a0 74 20 61 72 72 61 6e 67 65 73 0a 2a 2a 20 74 68  t arranges.** th
1b0b0 69 6e 67 73 20 73 6f 20 74 68 61 74 20 74 68 65  ings so that the
1b0c0 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20 73 71   next call to sq
1b0d0 6c 69 74 65 33 72 62 75 5f 73 74 65 70 28 29 20  lite3rbu_step() 
1b0e0 63 6f 6e 74 69 6e 75 65 73 20 6f 6e 20 66 72 6f  continues on fro
1b0f0 6d 0a 2a 2a 20 77 68 65 72 65 20 74 68 65 20 70  m.** where the p
1b100 72 65 76 69 6f 75 73 20 72 62 75 20 68 61 6e 64  revious rbu hand
1b110 6c 65 20 6c 65 66 74 20 6f 66 66 2e 0a 2a 2a 0a  le left off..**.
1b120 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
1b130 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20  ccurs, an error 
1b140 63 6f 64 65 20 61 6e 64 20 65 72 72 6f 72 20 6d  code and error m
1b150 65 73 73 61 67 65 20 61 72 65 20 6c 65 66 74 20  essage are left 
1b160 69 6e 20 74 68 65 0a 2a 2a 20 72 62 75 20 68 61  in the.** rbu ha
1b170 6e 64 6c 65 20 70 61 73 73 65 64 20 61 73 20 74  ndle passed as t
1b180 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
1b190 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
1b1a0 64 20 72 62 75 53 65 74 75 70 4f 61 6c 28 73 71  d rbuSetupOal(sq
1b1b0 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 52 62 75  lite3rbu *p, Rbu
1b1c0 53 74 61 74 65 20 2a 70 53 74 61 74 65 29 7b 0a  State *pState){.
1b1d0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d    assert( p->rc=
1b1e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
1b1f0 69 66 28 20 70 53 74 61 74 65 2d 3e 7a 54 62 6c  if( pState->zTbl
1b200 20 29 7b 0a 20 20 20 20 52 62 75 4f 62 6a 49 74   ){.    RbuObjIt
1b210 65 72 20 2a 70 49 74 65 72 20 3d 20 26 70 2d 3e  er *pIter = &p->
1b220 6f 62 6a 69 74 65 72 3b 0a 20 20 20 20 69 6e 74  objiter;.    int
1b230 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1b240 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d  ..    while( rc=
1b250 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 49  =SQLITE_OK && pI
1b260 74 65 72 2d 3e 7a 54 62 6c 20 26 26 20 28 70 49  ter->zTbl && (pI
1b270 74 65 72 2d 3e 62 43 6c 65 61 6e 75 70 20 0a 20  ter->bCleanup . 
1b280 20 20 20 20 20 20 7c 7c 20 72 62 75 53 74 72 43        || rbuStrC
1b290 6f 6d 70 61 72 65 28 70 49 74 65 72 2d 3e 7a 49  ompare(pIter->zI
1b2a0 64 78 2c 20 70 53 74 61 74 65 2d 3e 7a 49 64 78  dx, pState->zIdx
1b2b0 29 0a 20 20 20 20 20 20 20 7c 7c 20 72 62 75 53  ).       || rbuS
1b2c0 74 72 43 6f 6d 70 61 72 65 28 70 49 74 65 72 2d  trCompare(pIter-
1b2d0 3e 7a 54 62 6c 2c 20 70 53 74 61 74 65 2d 3e 7a  >zTbl, pState->z
1b2e0 54 62 6c 29 20 0a 20 20 20 20 29 29 7b 0a 20 20  Tbl) .    )){.  
1b2f0 20 20 20 20 72 63 20 3d 20 72 62 75 4f 62 6a 49      rc = rbuObjI
1b300 74 65 72 4e 65 78 74 28 70 2c 20 70 49 74 65 72  terNext(p, pIter
1b310 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
1b320 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1b330 26 26 20 21 70 49 74 65 72 2d 3e 7a 54 62 6c 20  && !pIter->zTbl 
1b340 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
1b350 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
1b360 20 20 70 2d 3e 7a 45 72 72 6d 73 67 20 3d 20 73    p->zErrmsg = s
1b370 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
1b380 72 62 75 5f 73 74 61 74 65 20 6d 69 73 6d 61 74  rbu_state mismat
1b390 63 68 20 65 72 72 6f 72 22 29 3b 0a 20 20 20 20  ch error");.    
1b3a0 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  }..    if( rc==S
1b3b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1b3c0 20 20 70 2d 3e 6e 53 74 65 70 20 3d 20 70 53 74    p->nStep = pSt
1b3d0 61 74 65 2d 3e 6e 52 6f 77 3b 0a 20 20 20 20 20  ate->nRow;.     
1b3e0 20 72 63 20 3d 20 72 62 75 4f 62 6a 49 74 65 72   rc = rbuObjIter
1b3f0 50 72 65 70 61 72 65 41 6c 6c 28 70 2c 20 26 70  PrepareAll(p, &p
1b400 2d 3e 6f 62 6a 69 74 65 72 2c 20 70 2d 3e 6e 53  ->objiter, p->nS
1b410 74 65 70 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  tep);.    }..   
1b420 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 7d   p->rc = rc;.  }
1b430 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
1b440 72 65 20 69 73 20 61 20 22 2a 2d 6f 61 6c 22 20  re is a "*-oal" 
1b450 66 69 6c 65 20 69 6e 20 74 68 65 20 66 69 6c 65  file in the file
1b460 2d 73 79 73 74 65 6d 20 63 6f 72 72 65 73 70 6f  -system correspo
1b470 6e 64 69 6e 67 20 74 6f 20 74 68 65 0a 2a 2a 20  nding to the.** 
1b480 74 61 72 67 65 74 20 64 61 74 61 62 61 73 65 20  target database 
1b490 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  in the file-syst
1b4a0 65 6d 2c 20 64 65 6c 65 74 65 20 69 74 2e 20 49  em, delete it. I
1b4b0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
1b4c0 73 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65  s,.** leave an e
1b4d0 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 65 72  rror code and er
1b4e0 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 74  ror message in t
1b4f0 68 65 20 72 62 75 20 68 61 6e 64 6c 65 2e 0a 2a  he rbu handle..*
1b500 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62  /.static void rb
1b510 75 44 65 6c 65 74 65 4f 61 6c 46 69 6c 65 28 73  uDeleteOalFile(s
1b520 71 6c 69 74 65 33 72 62 75 20 2a 70 29 7b 0a 20  qlite3rbu *p){. 
1b530 20 63 68 61 72 20 2a 7a 4f 61 6c 20 3d 20 72 62   char *zOal = rb
1b540 75 4d 50 72 69 6e 74 66 28 70 2c 20 22 25 73 2d  uMPrintf(p, "%s-
1b550 6f 61 6c 22 2c 20 70 2d 3e 7a 54 61 72 67 65 74  oal", p->zTarget
1b560 29 3b 0a 20 20 69 66 28 20 7a 4f 61 6c 20 29 7b  );.  if( zOal ){
1b570 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73  .    sqlite3_vfs
1b580 20 2a 70 56 66 73 20 3d 20 73 71 6c 69 74 65 33   *pVfs = sqlite3
1b590 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20  _vfs_find(0);.  
1b5a0 20 20 61 73 73 65 72 74 28 20 70 56 66 73 20 26    assert( pVfs &
1b5b0 26 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  & p->rc==SQLITE_
1b5c0 4f 4b 20 26 26 20 70 2d 3e 7a 45 72 72 6d 73 67  OK && p->zErrmsg
1b5d0 3d 3d 30 20 29 3b 0a 20 20 20 20 70 56 66 73 2d  ==0 );.    pVfs-
1b5e0 3e 78 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a  >xDelete(pVfs, z
1b5f0 4f 61 6c 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  Oal, 0);.    sql
1b600 69 74 65 33 5f 66 72 65 65 28 7a 4f 61 6c 29 3b  ite3_free(zOal);
1b610 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  .  }.}../*.** Al
1b620 6c 6f 63 61 74 65 20 61 20 70 72 69 76 61 74 65  locate a private
1b630 20 72 62 75 20 56 46 53 20 66 6f 72 20 74 68 65   rbu VFS for the
1b640 20 72 62 75 20 68 61 6e 64 6c 65 20 70 61 73 73   rbu handle pass
1b650 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 0a 2a  ed as the only.*
1b660 2a 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 69 73  * argument. This
1b670 20 56 46 53 20 77 69 6c 6c 20 62 65 20 75 73 65   VFS will be use
1b680 64 20 75 6e 6c 65 73 73 20 74 68 65 20 63 61 6c  d unless the cal
1b690 6c 20 74 6f 20 73 71 6c 69 74 65 33 72 62 75 5f  l to sqlite3rbu_
1b6a0 6f 70 65 6e 28 29 0a 2a 2a 20 73 70 65 63 69 66  open().** specif
1b6b0 69 65 64 20 61 20 55 52 49 20 77 69 74 68 20 61  ied a URI with a
1b6c0 20 76 66 73 3d 3f 20 6f 70 74 69 6f 6e 20 69 6e   vfs=? option in
1b6d0 20 70 6c 61 63 65 20 6f 66 20 61 20 74 61 72 67   place of a targ
1b6e0 65 74 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66  et database.** f
1b6f0 69 6c 65 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61  ile name..*/.sta
1b700 74 69 63 20 76 6f 69 64 20 72 62 75 43 72 65 61  tic void rbuCrea
1b710 74 65 56 66 73 28 73 71 6c 69 74 65 33 72 62 75  teVfs(sqlite3rbu
1b720 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 6e 64 3b   *p){.  int rnd;
1b730 0a 20 20 63 68 61 72 20 7a 52 6e 64 5b 36 34 5d  .  char zRnd[64]
1b740 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ;..  assert( p->
1b750 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
1b760 0a 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f  .  sqlite3_rando
1b770 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 69 6e 74  mness(sizeof(int
1b780 29 2c 20 28 76 6f 69 64 2a 29 26 72 6e 64 29 3b  ), (void*)&rnd);
1b790 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
1b7a0 6e 74 66 28 73 69 7a 65 6f 66 28 7a 52 6e 64 29  ntf(sizeof(zRnd)
1b7b0 2c 20 7a 52 6e 64 2c 20 22 72 62 75 5f 76 66 73  , zRnd, "rbu_vfs
1b7c0 5f 25 64 22 2c 20 72 6e 64 29 3b 0a 20 20 70 2d  _%d", rnd);.  p-
1b7d0 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 72 62 75  >rc = sqlite3rbu
1b7e0 5f 63 72 65 61 74 65 5f 76 66 73 28 7a 52 6e 64  _create_vfs(zRnd
1b7f0 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72  , 0);.  if( p->r
1b800 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1b810 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20      sqlite3_vfs 
1b820 2a 70 56 66 73 20 3d 20 73 71 6c 69 74 65 33 5f  *pVfs = sqlite3_
1b830 76 66 73 5f 66 69 6e 64 28 7a 52 6e 64 29 3b 0a  vfs_find(zRnd);.
1b840 20 20 20 20 61 73 73 65 72 74 28 20 70 56 66 73      assert( pVfs
1b850 20 29 3b 0a 20 20 20 20 70 2d 3e 7a 56 66 73 4e   );.    p->zVfsN
1b860 61 6d 65 20 3d 20 70 56 66 73 2d 3e 7a 4e 61 6d  ame = pVfs->zNam
1b870 65 3b 0a 20 20 20 20 28 28 72 62 75 5f 76 66 73  e;.    ((rbu_vfs
1b880 2a 29 70 56 66 73 29 2d 3e 70 52 62 75 20 3d 20  *)pVfs)->pRbu = 
1b890 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  p;.  }.}../*.** 
1b8a0 44 65 73 74 72 6f 79 20 74 68 65 20 70 72 69 76  Destroy the priv
1b8b0 61 74 65 20 56 46 53 20 63 72 65 61 74 65 64 20  ate VFS created 
1b8c0 66 6f 72 20 74 68 65 20 72 62 75 20 68 61 6e 64  for the rbu hand
1b8d0 6c 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  le passed as the
1b8e0 20 6f 6e 6c 79 0a 2a 2a 20 61 72 67 75 6d 65 6e   only.** argumen
1b8f0 74 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20  t by an earlier 
1b900 63 61 6c 6c 20 74 6f 20 72 62 75 43 72 65 61 74  call to rbuCreat
1b910 65 56 66 73 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  eVfs()..*/.stati
1b920 63 20 76 6f 69 64 20 72 62 75 44 65 6c 65 74 65  c void rbuDelete
1b930 56 66 73 28 73 71 6c 69 74 65 33 72 62 75 20 2a  Vfs(sqlite3rbu *
1b940 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 7a 56 66  p){.  if( p->zVf
1b950 73 4e 61 6d 65 20 29 7b 0a 20 20 20 20 73 71 6c  sName ){.    sql
1b960 69 74 65 33 72 62 75 5f 64 65 73 74 72 6f 79 5f  ite3rbu_destroy_
1b970 76 66 73 28 70 2d 3e 7a 56 66 73 4e 61 6d 65 29  vfs(p->zVfsName)
1b980 3b 0a 20 20 20 20 70 2d 3e 7a 56 66 73 4e 61 6d  ;.    p->zVfsNam
1b990 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  e = 0;.  }.}../*
1b9a0 0a 2a 2a 20 54 68 69 73 20 75 73 65 72 2d 64 65  .** This user-de
1b9b0 66 69 6e 65 64 20 53 51 4c 20 66 75 6e 63 74 69  fined SQL functi
1b9c0 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 77 69  on is invoked wi
1b9d0 74 68 20 61 20 73 69 6e 67 6c 65 20 61 72 67 75  th a single argu
1b9e0 6d 65 6e 74 20 2d 20 74 68 65 0a 2a 2a 20 6e 61  ment - the.** na
1b9f0 6d 65 20 6f 66 20 61 20 74 61 62 6c 65 20 65 78  me of a table ex
1ba00 70 65 63 74 65 64 20 74 6f 20 61 70 70 65 61 72  pected to appear
1ba10 20 69 6e 20 74 68 65 20 74 61 72 67 65 74 20 64   in the target d
1ba20 61 74 61 62 61 73 65 2e 20 49 74 20 72 65 74 75  atabase. It retu
1ba30 72 6e 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65  rns.** the numbe
1ba40 72 20 6f 66 20 61 75 78 69 6c 6c 69 61 72 79 20  r of auxilliary 
1ba50 69 6e 64 65 78 65 73 20 6f 6e 20 74 68 65 20 74  indexes on the t
1ba60 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
1ba70 76 6f 69 64 20 72 62 75 49 6e 64 65 78 43 6e 74  void rbuIndexCnt
1ba80 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
1ba90 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a  context *pCtx, .
1baa0 20 20 69 6e 74 20 6e 56 61 6c 2c 0a 20 20 73 71    int nVal,.  sq
1bab0 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70  lite3_value **ap
1bac0 56 61 6c 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  Val.){.  sqlite3
1bad0 72 62 75 20 2a 70 20 3d 20 28 73 71 6c 69 74 65  rbu *p = (sqlite
1bae0 33 72 62 75 2a 29 73 71 6c 69 74 65 33 5f 75 73  3rbu*)sqlite3_us
1baf0 65 72 5f 64 61 74 61 28 70 43 74 78 29 3b 0a 20  er_data(pCtx);. 
1bb00 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
1bb10 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61 72  Stmt = 0;.  char
1bb20 20 2a 7a 45 72 72 6d 73 67 20 3d 20 30 3b 0a 20   *zErrmsg = 0;. 
1bb30 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
1bb40 72 74 28 20 6e 56 61 6c 3d 3d 31 20 29 3b 0a 20  rt( nVal==1 );. 
1bb50 20 0a 20 20 72 63 20 3d 20 70 72 65 70 61 72 65   .  rc = prepare
1bb60 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72  FreeAndCollectEr
1bb70 72 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 26  ror(p->dbMain, &
1bb80 70 53 74 6d 74 2c 20 26 7a 45 72 72 6d 73 67 2c  pStmt, &zErrmsg,
1bb90 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f   .      sqlite3_
1bba0 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20  mprintf("SELECT 
1bbb0 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 73 71  count(*) FROM sq
1bbc0 6c 69 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20  lite_master ".  
1bbd0 20 20 20 20 20 20 22 57 48 45 52 45 20 74 79 70        "WHERE typ
1bbe0 65 3d 27 69 6e 64 65 78 27 20 41 4e 44 20 74 62  e='index' AND tb
1bbf0 6c 5f 6e 61 6d 65 20 3d 20 25 51 22 2c 20 73 71  l_name = %Q", sq
1bc00 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
1bc10 28 61 70 56 61 6c 5b 30 5d 29 29 0a 20 20 29 3b  (apVal[0])).  );
1bc20 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
1bc30 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
1bc40 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
1bc50 28 70 43 74 78 2c 20 7a 45 72 72 6d 73 67 2c 20  (pCtx, zErrmsg, 
1bc60 2d 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  -1);.  }else{.  
1bc70 20 20 69 6e 74 20 6e 49 6e 64 65 78 20 3d 20 30    int nIndex = 0
1bc80 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  ;.    if( SQLITE
1bc90 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74  _ROW==sqlite3_st
1bca0 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20  ep(pStmt) ){.   
1bcb0 20 20 20 6e 49 6e 64 65 78 20 3d 20 73 71 6c 69     nIndex = sqli
1bcc0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
1bcd0 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  Stmt, 0);.    }.
1bce0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1bcf0 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
1bd00 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
1bd10 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1bd20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
1bd30 69 6e 74 28 70 43 74 78 2c 20 6e 49 6e 64 65 78  int(pCtx, nIndex
1bd40 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1bd50 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
1bd60 6c 74 5f 65 72 72 6f 72 28 70 43 74 78 2c 20 73  lt_error(pCtx, s
1bd70 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d  qlite3_errmsg(p-
1bd80 3e 64 62 4d 61 69 6e 29 2c 20 2d 31 29 3b 0a 20  >dbMain), -1);. 
1bd90 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69     }.  }..  sqli
1bda0 74 65 33 5f 66 72 65 65 28 7a 45 72 72 6d 73 67  te3_free(zErrmsg
1bdb0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  );.}../*.** If t
1bdc0 68 65 20 52 42 55 20 64 61 74 61 62 61 73 65 20  he RBU database 
1bdd0 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 72 62 75  contains the rbu
1bde0 5f 63 6f 75 6e 74 20 74 61 62 6c 65 2c 20 75 73  _count table, us
1bdf0 65 20 69 74 20 74 6f 20 69 6e 69 74 69 61 6c 69  e it to initiali
1be00 7a 65 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65  ze.** the sqlite
1be10 33 72 62 75 2e 6e 50 68 61 73 65 4f 6e 65 53 74  3rbu.nPhaseOneSt
1be20 65 70 20 76 61 72 69 61 62 6c 65 2e 20 54 68 65  ep variable. The
1be30 20 73 63 68 65 6d 61 20 6f 66 20 74 68 65 20 72   schema of the r
1be40 62 75 5f 63 6f 75 6e 74 20 74 61 62 6c 65 0a 2a  bu_count table.*
1be50 2a 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20  * is assumed to 
1be60 63 6f 6e 74 61 69 6e 20 74 68 65 20 73 61 6d 65  contain the same
1be70 20 63 6f 6c 75 6d 6e 73 20 61 73 3a 0a 2a 2a 0a   columns as:.**.
1be80 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  **   CREATE TABL
1be90 45 20 72 62 75 5f 63 6f 75 6e 74 28 74 62 6c 20  E rbu_count(tbl 
1bea0 54 45 58 54 20 50 52 49 4d 41 52 59 20 4b 45 59  TEXT PRIMARY KEY
1beb0 2c 20 63 6e 74 20 49 4e 54 45 47 45 52 29 20 57  , cnt INTEGER) W
1bec0 49 54 48 4f 55 54 20 52 4f 57 49 44 3b 0a 2a 2a  ITHOUT ROWID;.**
1bed0 0a 2a 2a 20 54 68 65 72 65 20 73 68 6f 75 6c 64  .** There should
1bee0 20 62 65 20 6f 6e 65 20 72 6f 77 20 69 6e 20 74   be one row in t
1bef0 68 65 20 74 61 62 6c 65 20 66 6f 72 20 65 61 63  he table for eac
1bf00 68 20 64 61 74 61 5f 78 78 78 20 74 61 62 6c 65  h data_xxx table
1bf10 20 69 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   in the.** datab
1bf20 61 73 65 2e 20 54 68 65 20 27 74 62 6c 27 20 63  ase. The 'tbl' c
1bf30 6f 6c 75 6d 6e 20 73 68 6f 75 6c 64 20 63 6f 6e  olumn should con
1bf40 74 61 69 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  tain the name of
1bf50 20 61 20 64 61 74 61 5f 78 78 78 20 74 61 62 6c   a data_xxx tabl
1bf60 65 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20 63 6e  e,.** and the cn
1bf70 74 20 63 6f 6c 75 6d 6e 20 74 68 65 20 6e 75 6d  t column the num
1bf80 62 65 72 20 6f 66 20 72 6f 77 73 20 69 74 20 63  ber of rows it c
1bf90 6f 6e 74 61 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 73  ontains..**.** s
1bfa0 71 6c 69 74 65 33 72 62 75 2e 6e 50 68 61 73 65  qlite3rbu.nPhase
1bfb0 4f 6e 65 53 74 65 70 20 69 73 20 69 6e 69 74 69  OneStep is initi
1bfc0 61 6c 69 7a 65 64 20 74 6f 20 74 68 65 20 73 75  alized to the su
1bfd0 6d 20 6f 66 20 28 31 20 2b 20 6e 49 6e 64 65 78  m of (1 + nIndex
1bfe0 29 20 2a 20 63 6e 74 0a 2a 2a 20 66 6f 72 20 61  ) * cnt.** for a
1bff0 6c 6c 20 72 6f 77 73 20 69 6e 20 74 68 65 20 72  ll rows in the r
1c000 62 75 5f 63 6f 75 6e 74 20 74 61 62 6c 65 2c 20  bu_count table, 
1c010 77 68 65 72 65 20 6e 49 6e 64 65 78 20 69 73 20  where nIndex is 
1c020 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 0a 2a  the number of .*
1c030 2a 20 69 6e 64 65 78 65 73 20 6f 6e 20 74 68 65  * indexes on the
1c040 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
1c050 61 72 67 65 74 20 64 61 74 61 62 61 73 65 20 74  arget database t
1c060 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
1c070 76 6f 69 64 20 72 62 75 49 6e 69 74 50 68 61 73  void rbuInitPhas
1c080 65 4f 6e 65 53 74 65 70 73 28 73 71 6c 69 74 65  eOneSteps(sqlite
1c090 33 72 62 75 20 2a 70 29 7b 0a 20 20 69 66 28 20  3rbu *p){.  if( 
1c0a0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
1c0b0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
1c0c0 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b  stmt *pStmt = 0;
1c0d0 0a 20 20 20 20 69 6e 74 20 62 45 78 69 73 74 73  .    int bExists
1c0e0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1c0f0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1c100 72 62 75 5f 63 6f 75 6e 74 20 65 78 69 73 74 73  rbu_count exists
1c110 20 2a 2f 0a 0a 20 20 20 20 70 2d 3e 6e 50 68 61   */..    p->nPha
1c120 73 65 4f 6e 65 53 74 65 70 20 3d 20 2d 31 3b 0a  seOneStep = -1;.
1c130 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c  .    p->rc = sql
1c140 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
1c150 74 69 6f 6e 28 70 2d 3e 64 62 52 62 75 2c 20 0a  tion(p->dbRbu, .
1c160 20 20 20 20 20 20 20 20 22 72 62 75 5f 69 6e 64          "rbu_ind
1c170 65 78 5f 63 6e 74 22 2c 20 31 2c 20 53 51 4c 49  ex_cnt", 1, SQLI
1c180 54 45 5f 55 54 46 38 2c 20 28 76 6f 69 64 2a 29  TE_UTF8, (void*)
1c190 70 2c 20 72 62 75 49 6e 64 65 78 43 6e 74 46 75  p, rbuIndexCntFu
1c1a0 6e 63 2c 20 30 2c 20 30 0a 20 20 20 20 29 3b 0a  nc, 0, 0.    );.
1c1b0 20 20 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20    .    /* Check 
1c1c0 66 6f 72 20 74 68 65 20 72 62 75 5f 63 6f 75 6e  for the rbu_coun
1c1d0 74 20 74 61 62 6c 65 2e 20 49 66 20 69 74 20 64  t table. If it d
1c1e0 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 6f  oes not exist, o
1c1f0 72 20 69 66 20 61 6e 20 65 72 72 6f 72 0a 20 20  r if an error.  
1c200 20 20 2a 2a 20 6f 63 63 75 72 73 2c 20 6e 50 68    ** occurs, nPh
1c210 61 73 65 4f 6e 65 53 74 65 70 20 77 69 6c 6c 20  aseOneStep will 
1c220 62 65 20 6c 65 66 74 20 73 65 74 20 74 6f 20 2d  be left set to -
1c230 31 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d  1. */.    if( p-
1c240 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
1c250 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20  {.      p->rc = 
1c260 70 72 65 70 61 72 65 41 6e 64 43 6f 6c 6c 65 63  prepareAndCollec
1c270 74 45 72 72 6f 72 28 70 2d 3e 64 62 52 62 75 2c  tError(p->dbRbu,
1c280 20 26 70 53 74 6d 74 2c 20 26 70 2d 3e 7a 45 72   &pStmt, &p->zEr
1c290 72 6d 73 67 2c 0a 20 20 20 20 20 20 20 20 20 20  rmsg,.          
1c2a0 22 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20 73  "SELECT 1 FROM s
1c2b0 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 57 48 45  qlite_master WHE
1c2c0 52 45 20 74 62 6c 5f 6e 61 6d 65 20 3d 20 27 72  RE tbl_name = 'r
1c2d0 62 75 5f 63 6f 75 6e 74 27 22 0a 20 20 20 20 20  bu_count'".     
1c2e0 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   );.    }.    if
1c2f0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
1c300 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  OK ){.      if( 
1c310 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69  SQLITE_ROW==sqli
1c320 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20  te3_step(pStmt) 
1c330 29 7b 0a 20 20 20 20 20 20 20 20 62 45 78 69 73  ){.        bExis
1c340 74 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ts = 1;.      }.
1c350 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71        p->rc = sq
1c360 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
1c370 53 74 6d 74 29 3b 0a 20 20 20 20 7d 0a 20 20 0a  Stmt);.    }.  .
1c380 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
1c390 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 45 78 69  QLITE_OK && bExi
1c3a0 73 74 73 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  sts ){.      p->
1c3b0 72 63 20 3d 20 70 72 65 70 61 72 65 41 6e 64 43  rc = prepareAndC
1c3c0 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64  ollectError(p->d
1c3d0 62 52 62 75 2c 20 26 70 53 74 6d 74 2c 20 26 70  bRbu, &pStmt, &p
1c3e0 2d 3e 7a 45 72 72 6d 73 67 2c 0a 20 20 20 20 20  ->zErrmsg,.     
1c3f0 20 20 20 20 20 22 53 45 4c 45 43 54 20 73 75 6d       "SELECT sum
1c400 28 63 6e 74 20 2a 20 28 31 20 2b 20 72 62 75 5f  (cnt * (1 + rbu_
1c410 69 6e 64 65 78 5f 63 6e 74 28 72 62 75 5f 74 61  index_cnt(rbu_ta
1c420 72 67 65 74 5f 6e 61 6d 65 28 74 62 6c 29 29 29  rget_name(tbl)))
1c430 29 22 0a 20 20 20 20 20 20 20 20 20 20 22 46 52  )".          "FR
1c440 4f 4d 20 72 62 75 5f 63 6f 75 6e 74 22 0a 20 20  OM rbu_count".  
1c450 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28      );.      if(
1c460 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1c470 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  K ){.        if(
1c480 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
1c490 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
1c4a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   ){.          p-
1c4b0 3e 6e 50 68 61 73 65 4f 6e 65 53 74 65 70 20 3d  >nPhaseOneStep =
1c4c0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
1c4d0 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 30 29 3b  int64(pStmt, 0);
1c4e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1c4f0 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74     p->rc = sqlit
1c500 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
1c510 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
1c520 7d 0a 20 20 7d 0a 7d 0a 0a 0a 73 74 61 74 69 63  }.  }.}...static
1c530 20 73 71 6c 69 74 65 33 72 62 75 20 2a 6f 70 65   sqlite3rbu *ope
1c540 6e 52 62 75 48 61 6e 64 6c 65 28 0a 20 20 63 6f  nRbuHandle(.  co
1c550 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 72 67 65  nst char *zTarge
1c560 74 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  t, .  const char
1c570 20 2a 7a 52 62 75 2c 0a 20 20 63 6f 6e 73 74 20   *zRbu,.  const 
1c580 63 68 61 72 20 2a 7a 53 74 61 74 65 0a 29 7b 0a  char *zState.){.
1c590 20 20 73 71 6c 69 74 65 33 72 62 75 20 2a 70 3b    sqlite3rbu *p;
1c5a0 0a 20 20 73 69 7a 65 5f 74 20 6e 54 61 72 67 65  .  size_t nTarge
1c5b0 74 20 3d 20 7a 54 61 72 67 65 74 20 3f 20 73 74  t = zTarget ? st
1c5c0 72 6c 65 6e 28 7a 54 61 72 67 65 74 29 20 3a 20  rlen(zTarget) : 
1c5d0 30 3b 0a 20 20 73 69 7a 65 5f 74 20 6e 52 62 75  0;.  size_t nRbu
1c5e0 20 3d 20 73 74 72 6c 65 6e 28 7a 52 62 75 29 3b   = strlen(zRbu);
1c5f0 0a 20 20 73 69 7a 65 5f 74 20 6e 42 79 74 65 20  .  size_t nByte 
1c600 3d 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33  = sizeof(sqlite3
1c610 72 62 75 29 20 2b 20 6e 54 61 72 67 65 74 2b 31  rbu) + nTarget+1
1c620 20 2b 20 6e 52 62 75 2b 31 3b 0a 0a 20 20 70 20   + nRbu+1;..  p 
1c630 3d 20 28 73 71 6c 69 74 65 33 72 62 75 2a 29 73  = (sqlite3rbu*)s
1c640 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28  qlite3_malloc64(
1c650 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 70 20  nByte);.  if( p 
1c660 29 7b 0a 20 20 20 20 52 62 75 53 74 61 74 65 20  ){.    RbuState 
1c670 2a 70 53 74 61 74 65 20 3d 20 30 3b 0a 0a 20 20  *pState = 0;..  
1c680 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20    /* Create the 
1c690 63 75 73 74 6f 6d 20 56 46 53 2e 20 2a 2f 0a 20  custom VFS. */. 
1c6a0 20 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20     memset(p, 0, 
1c6b0 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 72 62  sizeof(sqlite3rb
1c6c0 75 29 29 3b 0a 20 20 20 20 72 62 75 43 72 65 61  u));.    rbuCrea
1c6d0 74 65 56 66 73 28 70 29 3b 0a 0a 20 20 20 20 2f  teVfs(p);..    /
1c6e0 2a 20 4f 70 65 6e 20 74 68 65 20 74 61 72 67 65  * Open the targe
1c6f0 74 2c 20 52 42 55 20 61 6e 64 20 73 74 61 74 65  t, RBU and state
1c700 20 64 61 74 61 62 61 73 65 73 20 2a 2f 0a 20 20   databases */.  
1c710 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
1c720 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1c730 63 68 61 72 20 2a 70 43 73 72 20 3d 20 28 63 68  char *pCsr = (ch
1c740 61 72 2a 29 26 70 5b 31 5d 3b 0a 20 20 20 20 20  ar*)&p[1];.     
1c750 20 69 6e 74 20 62 52 65 74 72 79 20 3d 20 30 3b   int bRetry = 0;
1c760 0a 20 20 20 20 20 20 69 66 28 20 7a 54 61 72 67  .      if( zTarg
1c770 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  et ){.        p-
1c780 3e 7a 54 61 72 67 65 74 20 3d 20 70 43 73 72 3b  >zTarget = pCsr;
1c790 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
1c7a0 70 2d 3e 7a 54 61 72 67 65 74 2c 20 7a 54 61 72  p->zTarget, zTar
1c7b0 67 65 74 2c 20 6e 54 61 72 67 65 74 2b 31 29 3b  get, nTarget+1);
1c7c0 0a 20 20 20 20 20 20 20 20 70 43 73 72 20 2b 3d  .        pCsr +=
1c7d0 20 6e 54 61 72 67 65 74 2b 31 3b 0a 20 20 20 20   nTarget+1;.    
1c7e0 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 7a 52 62    }.      p->zRb
1c7f0 75 20 3d 20 70 43 73 72 3b 0a 20 20 20 20 20 20  u = pCsr;.      
1c800 6d 65 6d 63 70 79 28 70 2d 3e 7a 52 62 75 2c 20  memcpy(p->zRbu, 
1c810 7a 52 62 75 2c 20 6e 52 62 75 2b 31 29 3b 0a 20  zRbu, nRbu+1);. 
1c820 20 20 20 20 20 70 43 73 72 20 2b 3d 20 6e 52 62       pCsr += nRb
1c830 75 2b 31 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  u+1;.      if( z
1c840 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20  State ){.       
1c850 20 70 2d 3e 7a 53 74 61 74 65 20 3d 20 72 62 75   p->zState = rbu
1c860 4d 50 72 69 6e 74 66 28 70 2c 20 22 25 73 22 2c  MPrintf(p, "%s",
1c870 20 7a 53 74 61 74 65 29 3b 0a 20 20 20 20 20 20   zState);.      
1c880 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  }..      /* If t
1c890 68 65 20 66 69 72 73 74 20 61 74 74 65 6d 70 74  he first attempt
1c8a0 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 64 61 74   to open the dat
1c8b0 61 62 61 73 65 20 66 69 6c 65 20 66 61 69 6c 73  abase file fails
1c8c0 20 61 6e 64 20 74 68 65 20 62 52 65 74 72 79 0a   and the bRetry.
1c8d0 20 20 20 20 20 20 2a 2a 20 66 6c 61 67 20 69 74        ** flag it
1c8e0 20 73 65 74 2c 20 74 68 69 73 20 6d 65 61 6e 73   set, this means
1c8f0 20 74 68 61 74 20 74 68 65 20 64 62 20 77 61 73   that the db was
1c900 20 6e 6f 74 20 6f 70 65 6e 65 64 20 62 65 63 61   not opened beca
1c910 75 73 65 20 69 74 20 73 65 65 6d 65 64 0a 20 20  use it seemed.  
1c920 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 61 20 77      ** to be a w
1c930 61 6c 2d 6d 6f 64 65 20 64 62 2e 20 42 75 74 2c  al-mode db. But,
1c940 20 74 68 69 73 20 6d 61 79 20 68 61 76 65 20 68   this may have h
1c950 61 70 70 65 6e 65 64 20 64 75 65 20 74 6f 20 61  appened due to a
1c960 6e 20 65 61 72 6c 69 65 72 0a 20 20 20 20 20 20  n earlier.      
1c970 2a 2a 20 52 42 55 20 76 61 63 75 75 6d 20 6f 70  ** RBU vacuum op
1c980 65 72 61 74 69 6f 6e 20 6c 65 61 76 69 6e 67 20  eration leaving 
1c990 61 6e 20 6f 6c 64 20 77 61 6c 20 66 69 6c 65 20  an old wal file 
1c9a0 69 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  in the directory
1c9b0 2e 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68  ..      ** If th
1c9c0 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c 20  is is the case, 
1c9d0 69 74 20 77 69 6c 6c 20 68 61 76 65 20 62 65 65  it will have bee
1c9e0 6e 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 20 61  n checkpointed a
1c9f0 6e 64 20 64 65 6c 65 74 65 64 0a 20 20 20 20 20  nd deleted.     
1ca00 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 68 61 6e   ** when the han
1ca10 64 6c 65 20 77 61 73 20 63 6c 6f 73 65 64 20 61  dle was closed a
1ca20 6e 64 20 61 20 73 65 63 6f 6e 64 20 61 74 74 65  nd a second atte
1ca30 6d 70 74 20 74 6f 20 6f 70 65 6e 20 74 68 65 20  mpt to open the 
1ca40 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61  .      ** databa
1ca50 73 65 20 6d 61 79 20 73 75 63 63 65 65 64 2e 20  se may succeed. 
1ca60 20 2a 2f 0a 20 20 20 20 20 20 72 62 75 4f 70 65   */.      rbuOpe
1ca70 6e 44 61 74 61 62 61 73 65 28 70 2c 20 26 62 52  nDatabase(p, &bR
1ca80 65 74 72 79 29 3b 0a 20 20 20 20 20 20 69 66 28  etry);.      if(
1ca90 20 62 52 65 74 72 79 20 29 7b 0a 20 20 20 20 20   bRetry ){.     
1caa0 20 20 20 72 62 75 4f 70 65 6e 44 61 74 61 62 61     rbuOpenDataba
1cab0 73 65 28 70 2c 20 30 29 3b 0a 20 20 20 20 20 20  se(p, 0);.      
1cac0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  }.    }..    if(
1cad0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1cae0 4b 20 29 7b 0a 20 20 20 20 20 20 70 53 74 61 74  K ){.      pStat
1caf0 65 20 3d 20 72 62 75 4c 6f 61 64 53 74 61 74 65  e = rbuLoadState
1cb00 28 70 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  (p);.      asser
1cb10 74 28 20 70 53 74 61 74 65 20 7c 7c 20 70 2d 3e  t( pState || p->
1cb20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
1cb30 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63  .      if( p->rc
1cb40 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 0a  ==SQLITE_OK ){..
1cb50 20 20 20 20 20 20 20 20 69 66 28 20 70 53 74 61          if( pSta
1cb60 74 65 2d 3e 65 53 74 61 67 65 3d 3d 30 20 29 7b  te->eStage==0 ){
1cb70 20 0a 20 20 20 20 20 20 20 20 20 20 72 62 75 44   .          rbuD
1cb80 65 6c 65 74 65 4f 61 6c 46 69 6c 65 28 70 29 3b  eleteOalFile(p);
1cb90 0a 20 20 20 20 20 20 20 20 20 20 72 62 75 49 6e  .          rbuIn
1cba0 69 74 50 68 61 73 65 4f 6e 65 53 74 65 70 73 28  itPhaseOneSteps(
1cbb0 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d  p);.          p-
1cbc0 3e 65 53 74 61 67 65 20 3d 20 52 42 55 5f 53 54  >eStage = RBU_ST
1cbd0 41 47 45 5f 4f 41 4c 3b 0a 20 20 20 20 20 20 20  AGE_OAL;.       
1cbe0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1cbf0 20 20 70 2d 3e 65 53 74 61 67 65 20 3d 20 70 53    p->eStage = pS
1cc00 74 61 74 65 2d 3e 65 53 74 61 67 65 3b 0a 20 20  tate->eStage;.  
1cc10 20 20 20 20 20 20 20 20 70 2d 3e 6e 50 68 61 73          p->nPhas
1cc20 65 4f 6e 65 53 74 65 70 20 3d 20 70 53 74 61 74  eOneStep = pStat
1cc30 65 2d 3e 6e 50 68 61 73 65 4f 6e 65 53 74 65 70  e->nPhaseOneStep
1cc40 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1cc50 20 20 20 20 70 2d 3e 6e 50 72 6f 67 72 65 73 73      p->nProgress
1cc60 20 3d 20 70 53 74 61 74 65 2d 3e 6e 50 72 6f 67   = pState->nProg
1cc70 72 65 73 73 3b 0a 20 20 20 20 20 20 20 20 70 2d  ress;.        p-
1cc80 3e 69 4f 61 6c 53 7a 20 3d 20 70 53 74 61 74 65  >iOalSz = pState
1cc90 2d 3e 69 4f 61 6c 53 7a 3b 0a 20 20 20 20 20 20  ->iOalSz;.      
1cca0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  }.    }.    asse
1ccb0 72 74 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54  rt( p->rc!=SQLIT
1ccc0 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 65 53 74 61 67  E_OK || p->eStag
1ccd0 65 21 3d 30 20 29 3b 0a 0a 20 20 20 20 69 66 28  e!=0 );..    if(
1cce0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1ccf0 4b 20 26 26 20 70 2d 3e 70 54 61 72 67 65 74 46  K && p->pTargetF
1cd00 64 2d 3e 70 57 61 6c 46 64 20 29 7b 0a 20 20 20  d->pWalFd ){.   
1cd10 20 20 20 69 66 28 20 70 2d 3e 65 53 74 61 67 65     if( p->eStage
1cd20 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20  ==RBU_STAGE_OAL 
1cd30 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63  ){.        p->rc
1cd40 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
1cd50 0a 20 20 20 20 20 20 20 20 70 2d 3e 7a 45 72 72  .        p->zErr
1cd60 6d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  msg = sqlite3_mp
1cd70 72 69 6e 74 66 28 22 63 61 6e 6e 6f 74 20 75 70  rintf("cannot up
1cd80 64 61 74 65 20 77 61 6c 20 6d 6f 64 65 20 64 61  date wal mode da
1cd90 74 61 62 61 73 65 22 29 3b 0a 20 20 20 20 20 20  tabase");.      
1cda0 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 65 53 74  }else if( p->eSt
1cdb0 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4d  age==RBU_STAGE_M
1cdc0 4f 56 45 20 29 7b 0a 20 20 20 20 20 20 20 20 70  OVE ){.        p
1cdd0 2d 3e 65 53 74 61 67 65 20 3d 20 52 42 55 5f 53  ->eStage = RBU_S
1cde0 54 41 47 45 5f 43 4b 50 54 3b 0a 20 20 20 20 20  TAGE_CKPT;.     
1cdf0 20 20 20 70 2d 3e 6e 53 74 65 70 20 3d 20 30 3b     p->nStep = 0;
1ce00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1ce10 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
1ce20 51 4c 49 54 45 5f 4f 4b 20 0a 20 20 20 20 20 26  QLITE_OK .     &
1ce30 26 20 28 70 2d 3e 65 53 74 61 67 65 3d 3d 52 42  & (p->eStage==RB
1ce40 55 5f 53 54 41 47 45 5f 4f 41 4c 20 7c 7c 20 70  U_STAGE_OAL || p
1ce50 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54  ->eStage==RBU_ST
1ce60 41 47 45 5f 4d 4f 56 45 29 0a 20 20 20 20 20 26  AGE_MOVE).     &
1ce70 26 20 70 53 74 61 74 65 2d 3e 65 53 74 61 67 65  & pState->eStage
1ce80 21 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  !=0.    ){.     
1ce90 20 72 62 75 5f 66 69 6c 65 20 2a 70 46 64 20 3d   rbu_file *pFd =
1cea0 20 28 72 62 75 49 73 56 61 63 75 75 6d 28 70 29   (rbuIsVacuum(p)
1ceb0 20 3f 20 70 2d 3e 70 52 62 75 46 64 20 3a 20 70   ? p->pRbuFd : p
1cec0 2d 3e 70 54 61 72 67 65 74 46 64 29 3b 0a 20 20  ->pTargetFd);.  
1ced0 20 20 20 20 69 66 28 20 70 46 64 2d 3e 69 43 6f      if( pFd->iCo
1cee0 6f 6b 69 65 21 3d 70 53 74 61 74 65 2d 3e 69 43  okie!=pState->iC
1cef0 6f 6f 6b 69 65 20 29 7b 20 20 20 0a 20 20 20 20  ookie ){   .    
1cf00 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
1cf10 6f 69 6e 74 20 28 70 54 61 72 67 65 74 46 64 2d  oint (pTargetFd-
1cf20 3e 69 43 6f 6f 6b 69 65 29 20 63 6f 6e 74 61 69  >iCookie) contai
1cf30 6e 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ns the value of 
1cf40 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  the.        ** c
1cf50 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 63 6f  hange-counter co
1cf60 6f 6b 69 65 20 28 74 68 65 20 74 68 69 6e 67 20  okie (the thing 
1cf70 74 68 61 74 20 67 65 74 73 20 69 6e 63 72 65 6d  that gets increm
1cf80 65 6e 74 65 64 20 77 68 65 6e 20 61 20 0a 20 20  ented when a .  
1cf90 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63        ** transac
1cfa0 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65  tion is committe
1cfb0 64 20 69 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f  d in rollback mo
1cfc0 64 65 29 20 63 75 72 72 65 6e 74 6c 79 20 73 74  de) currently st
1cfd0 6f 72 65 64 20 6f 6e 20 0a 20 20 20 20 20 20 20  ored on .       
1cfe0 20 2a 2a 20 70 61 67 65 20 31 20 6f 66 20 74 68   ** page 1 of th
1cff0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1d000 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 2d 3e 72   */.        p->r
1d010 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
1d020 0a 20 20 20 20 20 20 20 20 70 2d 3e 7a 45 72 72  .        p->zErr
1d030 6d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  msg = sqlite3_mp
1d040 72 69 6e 74 66 28 22 64 61 74 61 62 61 73 65 20  rintf("database 
1d050 6d 6f 64 69 66 69 65 64 20 64 75 72 69 6e 67 20  modified during 
1d060 72 62 75 20 25 73 22 2c 0a 20 20 20 20 20 20 20  rbu %s",.       
1d070 20 20 20 20 20 28 72 62 75 49 73 56 61 63 75 75       (rbuIsVacuu
1d080 6d 28 70 29 20 3f 20 22 76 61 63 75 75 6d 22 20  m(p) ? "vacuum" 
1d090 3a 20 22 75 70 64 61 74 65 22 29 0a 20 20 20 20  : "update").    
1d0a0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20      );.      }. 
1d0b0 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 2d     }..    if( p-
1d0c0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
1d0d0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65  {.      if( p->e
1d0e0 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45  Stage==RBU_STAGE
1d0f0 5f 4f 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  _OAL ){.        
1d100 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
1d110 3e 64 62 4d 61 69 6e 3b 0a 20 20 20 20 20 20 20  >dbMain;.       
1d120 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33   p->rc = sqlite3
1d130 5f 65 78 65 63 28 70 2d 3e 64 62 52 62 75 2c 20  _exec(p->dbRbu, 
1d140 22 42 45 47 49 4e 22 2c 20 30 2c 20 30 2c 20 26  "BEGIN", 0, 0, &
1d150 70 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a 0a 20 20  p->zErrmsg);..  
1d160 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 20 74        /* Point t
1d170 68 65 20 6f 62 6a 65 63 74 20 69 74 65 72 61 74  he object iterat
1d180 6f 72 20 61 74 20 74 68 65 20 66 69 72 73 74 20  or at the first 
1d190 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 20 20  object */.      
1d1a0 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
1d1b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1d1c0 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 62 75 4f      p->rc = rbuO
1d1d0 62 6a 49 74 65 72 46 69 72 73 74 28 70 2c 20 26  bjIterFirst(p, &
1d1e0 70 2d 3e 6f 62 6a 69 74 65 72 29 3b 0a 20 20 20  p->objiter);.   
1d1f0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
1d200 2f 2a 20 49 66 20 74 68 65 20 52 42 55 20 64 61  /* If the RBU da
1d210 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 73 20  tabase contains 
1d220 6e 6f 20 64 61 74 61 5f 78 78 78 20 74 61 62 6c  no data_xxx tabl
1d230 65 73 2c 20 64 65 63 6c 61 72 65 20 74 68 65 20  es, declare the 
1d240 52 42 55 0a 20 20 20 20 20 20 20 20 2a 2a 20 75  RBU.        ** u
1d250 70 64 61 74 65 20 66 69 6e 69 73 68 65 64 2e 20  pdate finished. 
1d260 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
1d270 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
1d280 20 26 26 20 70 2d 3e 6f 62 6a 69 74 65 72 2e 7a   && p->objiter.z
1d290 54 62 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Tbl==0 ){.      
1d2a0 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
1d2b0 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20 20  TE_DONE;.       
1d2c0 20 20 20 70 2d 3e 65 53 74 61 67 65 20 3d 20 52     p->eStage = R
1d2d0 42 55 5f 53 54 41 47 45 5f 44 4f 4e 45 3b 0a 20  BU_STAGE_DONE;. 
1d2e0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1d2f0 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72          if( p->r
1d300 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1d310 70 53 74 61 74 65 2d 3e 65 53 74 61 67 65 3d 3d  pState->eStage==
1d320 30 20 26 26 20 72 62 75 49 73 56 61 63 75 75 6d  0 && rbuIsVacuum
1d330 28 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  (p) ){.         
1d340 20 20 20 72 62 75 43 6f 70 79 50 72 61 67 6d 61     rbuCopyPragma
1d350 28 70 2c 20 22 70 61 67 65 5f 73 69 7a 65 22 29  (p, "page_size")
1d360 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 62  ;.            rb
1d370 75 43 6f 70 79 50 72 61 67 6d 61 28 70 2c 20 22  uCopyPragma(p, "
1d380 61 75 74 6f 5f 76 61 63 75 75 6d 22 29 3b 0a 20  auto_vacuum");. 
1d390 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20           }..    
1d3a0 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 72        /* Open tr
1d3b0 61 6e 73 61 63 74 69 6f 6e 73 20 62 6f 74 68 20  ansactions both 
1d3c0 64 61 74 61 62 61 73 65 73 2e 20 54 68 65 20 2a  databases. The *
1d3d0 2d 6f 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  -oal file is ope
1d3e0 6e 65 64 20 6f 72 0a 20 20 20 20 20 20 20 20 20  ned or.         
1d3f0 20 2a 2a 20 63 72 65 61 74 65 64 20 61 74 20 74   ** created at t
1d400 68 69 73 20 70 6f 69 6e 74 2e 20 2a 2f 0a 20 20  his point. */.  
1d410 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72          if( p->r
1d420 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1d430 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72              p->r
1d440 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  c = sqlite3_exec
1d450 28 64 62 2c 20 22 42 45 47 49 4e 20 49 4d 4d 45  (db, "BEGIN IMME
1d460 44 49 41 54 45 22 2c 20 30 2c 20 30 2c 20 26 70  DIATE", 0, 0, &p
1d470 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a 20 20 20 20  ->zErrmsg);.    
1d480 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
1d490 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74     /* Check if t
1d4a0 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
1d4b0 20 69 73 20 61 20 7a 69 70 76 66 73 20 64 62 2e   is a zipvfs db.
1d4c0 20 49 66 20 69 74 20 69 73 2c 20 73 65 74 20 74   If it is, set t
1d4d0 68 65 20 75 70 70 65 72 0a 20 20 20 20 20 20 20  he upper.       
1d4e0 20 20 20 2a 2a 20 6c 65 76 65 6c 20 70 61 67 65     ** level page
1d4f0 72 20 74 6f 20 75 73 65 20 22 6a 6f 75 72 6e 61  r to use "journa
1d500 6c 5f 6d 6f 64 65 3d 6f 66 66 22 2e 20 54 68 69  l_mode=off". Thi
1d510 73 20 70 72 65 76 65 6e 74 73 20 69 74 20 66 72  s prevents it fr
1d520 6f 6d 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  om .          **
1d530 20 67 65 6e 65 72 61 74 69 6e 67 20 61 20 6c 61   generating a la
1d540 72 67 65 20 6a 6f 75 72 6e 61 6c 20 75 73 69 6e  rge journal usin
1d550 67 20 61 20 74 65 6d 70 20 66 69 6c 65 2e 20 20  g a temp file.  
1d560 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
1d570 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1d580 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
1d590 20 69 6e 74 20 66 72 63 20 3d 20 73 71 6c 69 74   int frc = sqlit
1d5a0 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28  e3_file_control(
1d5b0 64 62 2c 20 22 6d 61 69 6e 22 2c 20 53 51 4c 49  db, "main", SQLI
1d5c0 54 45 5f 46 43 4e 54 4c 5f 5a 49 50 56 46 53 2c  TE_FCNTL_ZIPVFS,
1d5d0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
1d5e0 20 69 66 28 20 66 72 63 3d 3d 53 51 4c 49 54 45   if( frc==SQLITE
1d5f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1d600 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c       p->rc = sql
1d610 69 74 65 33 5f 65 78 65 63 28 0a 20 20 20 20 20  ite3_exec(.     
1d620 20 20 20 20 20 20 20 20 20 20 20 64 62 2c 20 22             db, "
1d630 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
1d640 6f 64 65 3d 6f 66 66 22 2c 30 2c 30 2c 26 70 2d  ode=off",0,0,&p-
1d650 3e 7a 45 72 72 6d 73 67 29 3b 0a 20 20 20 20 20  >zErrmsg);.     
1d660 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1d670 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20     }..          
1d680 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
1d690 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1d6a0 20 20 20 20 72 62 75 53 65 74 75 70 4f 61 6c 28      rbuSetupOal(
1d6b0 70 2c 20 70 53 74 61 74 65 29 3b 0a 20 20 20 20  p, pState);.    
1d6c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1d6d0 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
1d6e0 28 20 70 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55  ( p->eStage==RBU
1d6f0 5f 53 54 41 47 45 5f 4d 4f 56 45 20 29 7b 0a 20  _STAGE_MOVE ){. 
1d700 20 20 20 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20         /* no-op 
1d710 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  */.      }else i
1d720 66 28 20 70 2d 3e 65 53 74 61 67 65 3d 3d 52 42  f( p->eStage==RB
1d730 55 5f 53 54 41 47 45 5f 43 4b 50 54 20 29 7b 0a  U_STAGE_CKPT ){.
1d740 20 20 20 20 20 20 20 20 72 62 75 53 65 74 75 70          rbuSetup
1d750 43 68 65 63 6b 70 6f 69 6e 74 28 70 2c 20 70 53  Checkpoint(p, pS
1d760 74 61 74 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c  tate);.      }el
1d770 73 65 20 69 66 28 20 70 2d 3e 65 53 74 61 67 65  se if( p->eStage
1d780 3d 3d 52 42 55 5f 53 54 41 47 45 5f 44 4f 4e 45  ==RBU_STAGE_DONE
1d790 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72   ){.        p->r
1d7a0 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  c = SQLITE_DONE;
1d7b0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1d7c0 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51        p->rc = SQ
1d7d0 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20  LITE_CORRUPT;.  
1d7e0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1d7f0 20 72 62 75 46 72 65 65 53 74 61 74 65 28 70 53   rbuFreeState(pS
1d800 74 61 74 65 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  tate);.  }..  re
1d810 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
1d820 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72 65   Allocate and re
1d830 74 75 72 6e 20 61 6e 20 52 42 55 20 68 61 6e 64  turn an RBU hand
1d840 6c 65 20 77 69 74 68 20 61 6c 6c 20 66 69 65 6c  le with all fiel
1d850 64 73 20 7a 65 72 6f 65 64 20 65 78 63 65 70 74  ds zeroed except
1d860 20 66 6f 72 20 74 68 65 0a 2a 2a 20 65 72 72 6f   for the.** erro
1d870 72 20 63 6f 64 65 2c 20 77 68 69 63 68 20 69 73  r code, which is
1d880 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4d   set to SQLITE_M
1d890 49 53 55 53 45 2e 0a 2a 2f 0a 73 74 61 74 69 63  ISUSE..*/.static
1d8a0 20 73 71 6c 69 74 65 33 72 62 75 20 2a 72 62 75   sqlite3rbu *rbu
1d8b0 4d 69 73 75 73 65 45 72 72 6f 72 28 76 6f 69 64  MisuseError(void
1d8c0 29 7b 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20  ){.  sqlite3rbu 
1d8d0 2a 70 52 65 74 3b 0a 20 20 70 52 65 74 20 3d 20  *pRet;.  pRet = 
1d8e0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
1d8f0 28 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 72  (sizeof(sqlite3r
1d900 62 75 29 29 3b 0a 20 20 69 66 28 20 70 52 65 74  bu));.  if( pRet
1d910 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70   ){.    memset(p
1d920 52 65 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  Ret, 0, sizeof(s
1d930 71 6c 69 74 65 33 72 62 75 29 29 3b 0a 20 20 20  qlite3rbu));.   
1d940 20 70 52 65 74 2d 3e 72 63 20 3d 20 53 51 4c 49   pRet->rc = SQLI
1d950 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 20  TE_MISUSE;.  }. 
1d960 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
1d970 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 6e 64 20  ./*.** Open and 
1d980 72 65 74 75 72 6e 20 61 20 6e 65 77 20 52 42 55  return a new RBU
1d990 20 68 61 6e 64 6c 65 2e 20 0a 2a 2f 0a 73 71 6c   handle. .*/.sql
1d9a0 69 74 65 33 72 62 75 20 2a 73 71 6c 69 74 65 33  ite3rbu *sqlite3
1d9b0 72 62 75 5f 6f 70 65 6e 28 0a 20 20 63 6f 6e 73  rbu_open(.  cons
1d9c0 74 20 63 68 61 72 20 2a 7a 54 61 72 67 65 74 2c  t char *zTarget,
1d9d0 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a   .  const char *
1d9e0 7a 52 62 75 2c 0a 20 20 63 6f 6e 73 74 20 63 68  zRbu,.  const ch
1d9f0 61 72 20 2a 7a 53 74 61 74 65 0a 29 7b 0a 20 20  ar *zState.){.  
1da00 69 66 28 20 7a 54 61 72 67 65 74 3d 3d 30 20 7c  if( zTarget==0 |
1da10 7c 20 7a 52 62 75 3d 3d 30 20 29 7b 20 72 65 74  | zRbu==0 ){ ret
1da20 75 72 6e 20 72 62 75 4d 69 73 75 73 65 45 72 72  urn rbuMisuseErr
1da30 6f 72 28 29 3b 20 7d 0a 20 20 2f 2a 20 54 4f 44  or(); }.  /* TOD
1da40 4f 3a 20 43 68 65 63 6b 20 74 68 61 74 20 7a 54  O: Check that zT
1da50 61 72 67 65 74 20 61 6e 64 20 7a 52 62 75 20 61  arget and zRbu a
1da60 72 65 20 6e 6f 6e 2d 4e 55 4c 4c 20 2a 2f 0a 20  re non-NULL */. 
1da70 20 72 65 74 75 72 6e 20 6f 70 65 6e 52 62 75 48   return openRbuH
1da80 61 6e 64 6c 65 28 7a 54 61 72 67 65 74 2c 20 7a  andle(zTarget, z
1da90 52 62 75 2c 20 7a 53 74 61 74 65 29 3b 0a 7d 0a  Rbu, zState);.}.
1daa0 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 68 61  ./*.** Open a ha
1dab0 6e 64 6c 65 20 74 6f 20 62 65 67 69 6e 20 6f 72  ndle to begin or
1dac0 20 72 65 73 75 6d 65 20 61 6e 20 52 42 55 20 56   resume an RBU V
1dad0 41 43 55 55 4d 20 6f 70 65 72 61 74 69 6f 6e 2e  ACUUM operation.
1dae0 0a 2a 2f 0a 73 71 6c 69 74 65 33 72 62 75 20 2a  .*/.sqlite3rbu *
1daf0 73 71 6c 69 74 65 33 72 62 75 5f 76 61 63 75 75  sqlite3rbu_vacuu
1db00 6d 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  m(.  const char 
1db10 2a 7a 54 61 72 67 65 74 2c 20 0a 20 20 63 6f 6e  *zTarget, .  con
1db20 73 74 20 63 68 61 72 20 2a 7a 53 74 61 74 65 0a  st char *zState.
1db30 29 7b 0a 20 20 69 66 28 20 7a 54 61 72 67 65 74  ){.  if( zTarget
1db40 3d 3d 30 20 29 7b 20 72 65 74 75 72 6e 20 72 62  ==0 ){ return rb
1db50 75 4d 69 73 75 73 65 45 72 72 6f 72 28 29 3b 20  uMisuseError(); 
1db60 7d 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 43 68 65  }.  /* TODO: Che
1db70 63 6b 20 74 68 61 74 20 62 6f 74 68 20 61 72 67  ck that both arg
1db80 75 6d 65 6e 74 73 20 61 72 65 20 6e 6f 6e 2d 4e  uments are non-N
1db90 55 4c 4c 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ULL */.  return 
1dba0 6f 70 65 6e 52 62 75 48 61 6e 64 6c 65 28 30 2c  openRbuHandle(0,
1dbb0 20 7a 54 61 72 67 65 74 2c 20 7a 53 74 61 74 65   zTarget, zState
1dbc0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
1dbd0 72 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  rn the database 
1dbe0 68 61 6e 64 6c 65 20 75 73 65 64 20 62 79 20 70  handle used by p
1dbf0 52 62 75 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20  Rbu..*/.sqlite3 
1dc00 2a 73 71 6c 69 74 65 33 72 62 75 5f 64 62 28 73  *sqlite3rbu_db(s
1dc10 71 6c 69 74 65 33 72 62 75 20 2a 70 52 62 75 2c  qlite3rbu *pRbu,
1dc20 20 69 6e 74 20 62 52 62 75 29 7b 0a 20 20 73 71   int bRbu){.  sq
1dc30 6c 69 74 65 33 20 2a 64 62 20 3d 20 30 3b 0a 20  lite3 *db = 0;. 
1dc40 20 69 66 28 20 70 52 62 75 20 29 7b 0a 20 20 20   if( pRbu ){.   
1dc50 20 64 62 20 3d 20 28 62 52 62 75 20 3f 20 70 52   db = (bRbu ? pR
1dc60 62 75 2d 3e 64 62 52 62 75 20 3a 20 70 52 62 75  bu->dbRbu : pRbu
1dc70 2d 3e 64 62 4d 61 69 6e 29 3b 0a 20 20 7d 0a 20  ->dbMain);.  }. 
1dc80 20 72 65 74 75 72 6e 20 64 62 3b 0a 7d 0a 0a 0a   return db;.}...
1dc90 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 72 72  /*.** If the err
1dca0 6f 72 20 63 6f 64 65 20 63 75 72 72 65 6e 74 6c  or code currentl
1dcb0 79 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  y stored in the 
1dcc0 52 42 55 20 68 61 6e 64 6c 65 20 69 73 20 53 51  RBU handle is SQ
1dcd0 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c  LITE_CONSTRAINT,
1dce0 0a 2a 2a 20 74 68 65 6e 20 65 64 69 74 20 61 6e  .** then edit an
1dcf0 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  y error message 
1dd00 73 74 72 69 6e 67 20 73 6f 20 61 73 20 74 6f 20  string so as to 
1dd10 72 65 6d 6f 76 65 20 61 6c 6c 20 6f 63 63 75 72  remove all occur
1dd20 72 65 6e 63 65 73 20 6f 66 0a 2a 2a 20 74 68 65  rences of.** the
1dd30 20 70 61 74 74 65 72 6e 20 22 72 62 75 5f 69 6d   pattern "rbu_im
1dd40 70 5f 5b 30 2d 39 5d 2a 22 2e 0a 2a 2f 0a 73 74  p_[0-9]*"..*/.st
1dd50 61 74 69 63 20 76 6f 69 64 20 72 62 75 45 64 69  atic void rbuEdi
1dd60 74 45 72 72 6d 73 67 28 73 71 6c 69 74 65 33 72  tErrmsg(sqlite3r
1dd70 62 75 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  bu *p){.  if( p-
1dd80 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53  >rc==SQLITE_CONS
1dd90 54 52 41 49 4e 54 20 26 26 20 70 2d 3e 7a 45 72  TRAINT && p->zEr
1dda0 72 6d 73 67 20 29 7b 0a 20 20 20 20 75 6e 73 69  rmsg ){.    unsi
1ddb0 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20 20 20  gned int i;.    
1ddc0 73 69 7a 65 5f 74 20 6e 45 72 72 6d 73 67 20 3d  size_t nErrmsg =
1ddd0 20 73 74 72 6c 65 6e 28 70 2d 3e 7a 45 72 72 6d   strlen(p->zErrm
1dde0 73 67 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  sg);.    for(i=0
1ddf0 3b 20 69 3c 28 6e 45 72 72 6d 73 67 2d 38 29 3b  ; i<(nErrmsg-8);
1de00 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
1de10 20 6d 65 6d 63 6d 70 28 26 70 2d 3e 7a 45 72 72   memcmp(&p->zErr
1de20 6d 73 67 5b 69 5d 2c 20 22 72 62 75 5f 69 6d 70  msg[i], "rbu_imp
1de30 5f 22 2c 20 38 29 3d 3d 30 20 29 7b 0a 20 20 20  _", 8)==0 ){.   
1de40 20 20 20 20 20 69 6e 74 20 6e 44 65 6c 20 3d 20       int nDel = 
1de50 38 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  8;.        while
1de60 28 20 70 2d 3e 7a 45 72 72 6d 73 67 5b 69 2b 6e  ( p->zErrmsg[i+n
1de70 44 65 6c 5d 3e 3d 27 30 27 20 26 26 20 70 2d 3e  Del]>='0' && p->
1de80 7a 45 72 72 6d 73 67 5b 69 2b 6e 44 65 6c 5d 3c  zErrmsg[i+nDel]<
1de90 3d 27 39 27 20 29 20 6e 44 65 6c 2b 2b 3b 0a 20  ='9' ) nDel++;. 
1dea0 20 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26         memmove(&
1deb0 70 2d 3e 7a 45 72 72 6d 73 67 5b 69 5d 2c 20 26  p->zErrmsg[i], &
1dec0 70 2d 3e 7a 45 72 72 6d 73 67 5b 69 2b 6e 44 65  p->zErrmsg[i+nDe
1ded0 6c 5d 2c 20 6e 45 72 72 6d 73 67 20 2b 20 31 20  l], nErrmsg + 1 
1dee0 2d 20 69 20 2d 20 6e 44 65 6c 29 3b 0a 20 20 20  - i - nDel);.   
1def0 20 20 20 20 20 6e 45 72 72 6d 73 67 20 2d 3d 20       nErrmsg -= 
1df00 6e 44 65 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  nDel;.      }.  
1df10 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
1df20 20 43 6c 6f 73 65 20 74 68 65 20 52 42 55 20 68   Close the RBU h
1df30 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  andle..*/.int sq
1df40 6c 69 74 65 33 72 62 75 5f 63 6c 6f 73 65 28 73  lite3rbu_close(s
1df50 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 63 68  qlite3rbu *p, ch
1df60 61 72 20 2a 2a 70 7a 45 72 72 6d 73 67 29 7b 0a  ar **pzErrmsg){.
1df70 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20    int rc;.  if( 
1df80 70 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d  p ){..    /* Com
1df90 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  mit the transact
1dfa0 69 6f 6e 20 74 6f 20 74 68 65 20 2a 2d 6f 61 6c  ion to the *-oal
1dfb0 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66   file. */.    if
1dfc0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
1dfd0 4f 4b 20 26 26 20 70 2d 3e 65 53 74 61 67 65 3d  OK && p->eStage=
1dfe0 3d 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20 29  =RBU_STAGE_OAL )
1dff0 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20  {.      p->rc = 
1e000 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e  sqlite3_exec(p->
1e010 64 62 4d 61 69 6e 2c 20 22 43 4f 4d 4d 49 54 22  dbMain, "COMMIT"
1e020 2c 20 30 2c 20 30 2c 20 26 70 2d 3e 7a 45 72 72  , 0, 0, &p->zErr
1e030 6d 73 67 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  msg);.    }..   
1e040 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 64 62 20   /* Sync the db 
1e050 66 69 6c 65 20 69 66 20 63 75 72 72 65 6e 74 6c  file if currentl
1e060 79 20 64 6f 69 6e 67 20 61 6e 20 69 6e 63 72 65  y doing an incre
1e070 6d 65 6e 74 61 6c 20 63 68 65 63 6b 70 6f 69 6e  mental checkpoin
1e080 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e  t */.    if( p->
1e090 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1e0a0 20 70 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f   p->eStage==RBU_
1e0b0 53 54 41 47 45 5f 43 4b 50 54 20 29 7b 0a 20 20  STAGE_CKPT ){.  
1e0c0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65      sqlite3_file
1e0d0 20 2a 70 44 62 20 3d 20 70 2d 3e 70 54 61 72 67   *pDb = p->pTarg
1e0e0 65 74 46 64 2d 3e 70 52 65 61 6c 3b 0a 20 20 20  etFd->pReal;.   
1e0f0 20 20 20 70 2d 3e 72 63 20 3d 20 70 44 62 2d 3e     p->rc = pDb->
1e100 70 4d 65 74 68 6f 64 73 2d 3e 78 53 79 6e 63 28  pMethods->xSync(
1e110 70 44 62 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43  pDb, SQLITE_SYNC
1e120 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20 20 20 7d 0a  _NORMAL);.    }.
1e130 0a 20 20 20 20 72 62 75 53 61 76 65 53 74 61 74  .    rbuSaveStat
1e140 65 28 70 2c 20 70 2d 3e 65 53 74 61 67 65 29 3b  e(p, p->eStage);
1e150 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d  ..    if( p->rc=
1e160 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d  =SQLITE_OK && p-
1e170 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41  >eStage==RBU_STA
1e180 47 45 5f 4f 41 4c 20 29 7b 0a 20 20 20 20 20 20  GE_OAL ){.      
1e190 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  p->rc = sqlite3_
1e1a0 65 78 65 63 28 70 2d 3e 64 62 52 62 75 2c 20 22  exec(p->dbRbu, "
1e1b0 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 2c 20 26  COMMIT", 0, 0, &
1e1c0 70 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a 20 20 20  p->zErrmsg);.   
1e1d0 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6c 6f 73 65   }..    /* Close
1e1e0 20 61 6e 79 20 6f 70 65 6e 20 73 74 61 74 65 6d   any open statem
1e1f0 65 6e 74 20 68 61 6e 64 6c 65 73 2e 20 2a 2f 0a  ent handles. */.
1e200 20 20 20 20 72 62 75 4f 62 6a 49 74 65 72 46 69      rbuObjIterFi
1e210 6e 61 6c 69 7a 65 28 26 70 2d 3e 6f 62 6a 69 74  nalize(&p->objit
1e220 65 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  er);..    /* If 
1e230 74 68 69 73 20 69 73 20 61 6e 20 52 42 55 20 76  this is an RBU v
1e240 61 63 75 75 6d 20 68 61 6e 64 6c 65 20 61 6e 64  acuum handle and
1e250 20 74 68 65 20 76 61 63 75 75 6d 20 68 61 73 20   the vacuum has 
1e260 65 69 74 68 65 72 20 66 69 6e 69 73 68 65 64 0a  either finished.
1e270 20 20 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75      ** successfu
1e280 6c 6c 79 20 6f 72 20 65 6e 63 6f 75 6e 74 65 72  lly or encounter
1e290 65 64 20 61 6e 20 65 72 72 6f 72 2c 20 64 65 6c  ed an error, del
1e2a0 65 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ete the contents
1e2b0 20 6f 66 20 74 68 65 20 0a 20 20 20 20 2a 2a 20   of the .    ** 
1e2c0 73 74 61 74 65 20 74 61 62 6c 65 2e 20 54 68 69  state table. Thi
1e2d0 73 20 63 61 75 73 65 73 20 74 68 65 20 6e 65 78  s causes the nex
1e2e0 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  t call to sqlite
1e2f0 33 72 62 75 5f 76 61 63 75 75 6d 28 29 20 0a 20  3rbu_vacuum() . 
1e300 20 20 20 2a 2a 20 73 70 65 63 69 66 79 69 6e 67     ** specifying
1e310 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 72   the current tar
1e320 67 65 74 20 61 6e 64 20 73 74 61 74 65 20 64 61  get and state da
1e330 74 61 62 61 73 65 73 20 74 6f 20 73 74 61 72 74  tabases to start
1e340 20 61 20 6e 65 77 0a 20 20 20 20 2a 2a 20 76 61   a new.    ** va
1e350 63 75 75 6d 20 66 72 6f 6d 20 73 63 72 61 74 63  cuum from scratc
1e360 68 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  h.  */.    if( r
1e370 62 75 49 73 56 61 63 75 75 6d 28 70 29 20 26 26  buIsVacuum(p) &&
1e380 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f   p->rc!=SQLITE_O
1e390 4b 20 26 26 20 70 2d 3e 64 62 52 62 75 20 29 7b  K && p->dbRbu ){
1e3a0 0a 20 20 20 20 20 20 69 6e 74 20 72 63 32 20 3d  .      int rc2 =
1e3b0 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d   sqlite3_exec(p-
1e3c0 3e 64 62 52 62 75 2c 20 22 44 45 4c 45 54 45 20  >dbRbu, "DELETE 
1e3d0 46 52 4f 4d 20 73 74 61 74 2e 72 62 75 5f 73 74  FROM stat.rbu_st
1e3e0 61 74 65 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  ate", 0, 0, 0);.
1e3f0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
1e400 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 26 26 20  =SQLITE_DONE && 
1e410 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  rc2!=SQLITE_OK )
1e420 20 70 2d 3e 72 63 20 3d 20 72 63 32 3b 0a 20 20   p->rc = rc2;.  
1e430 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6c 6f 73    }..    /* Clos
1e440 65 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62  e the open datab
1e450 61 73 65 20 68 61 6e 64 6c 65 20 61 6e 64 20 56  ase handle and V
1e460 46 53 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20  FS object. */.  
1e470 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28    sqlite3_close(
1e480 70 2d 3e 64 62 52 62 75 29 3b 0a 20 20 20 20 73  p->dbRbu);.    s
1e490 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 2d 3e  qlite3_close(p->
1e4a0 64 62 4d 61 69 6e 29 3b 0a 20 20 20 20 61 73 73  dbMain);.    ass
1e4b0 65 72 74 28 20 70 2d 3e 73 7a 54 65 6d 70 3d 3d  ert( p->szTemp==
1e4c0 30 20 29 3b 0a 20 20 20 20 72 62 75 44 65 6c 65  0 );.    rbuDele
1e4d0 74 65 56 66 73 28 70 29 3b 0a 20 20 20 20 73 71  teVfs(p);.    sq
1e4e0 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 42  lite3_free(p->aB
1e4f0 75 66 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  uf);.    sqlite3
1e500 5f 66 72 65 65 28 70 2d 3e 61 46 72 61 6d 65 29  _free(p->aFrame)
1e510 3b 0a 0a 20 20 20 20 72 62 75 45 64 69 74 45 72  ;..    rbuEditEr
1e520 72 6d 73 67 28 70 29 3b 0a 20 20 20 20 72 63 20  rmsg(p);.    rc 
1e530 3d 20 70 2d 3e 72 63 3b 0a 20 20 20 20 69 66 28  = p->rc;.    if(
1e540 20 70 7a 45 72 72 6d 73 67 20 29 7b 0a 20 20 20   pzErrmsg ){.   
1e550 20 20 20 2a 70 7a 45 72 72 6d 73 67 20 3d 20 70     *pzErrmsg = p
1e560 2d 3e 7a 45 72 72 6d 73 67 3b 0a 20 20 20 20 7d  ->zErrmsg;.    }
1e570 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
1e580 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 45 72 72  te3_free(p->zErr
1e590 6d 73 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  msg);.    }.    
1e5a0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
1e5b0 7a 53 74 61 74 65 29 3b 0a 20 20 20 20 73 71 6c  zState);.    sql
1e5c0 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
1e5d0 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
1e5e0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
1e5f0 20 20 2a 70 7a 45 72 72 6d 73 67 20 3d 20 30 3b    *pzErrmsg = 0;
1e600 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1e610 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1e620 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  n the total numb
1e630 65 72 20 6f 66 20 6b 65 79 2d 76 61 6c 75 65 20  er of key-value 
1e640 6f 70 65 72 61 74 69 6f 6e 73 20 28 69 6e 73 65  operations (inse
1e650 72 74 73 2c 20 64 65 6c 65 74 65 73 20 6f 72 20  rts, deletes or 
1e660 0a 2a 2a 20 75 70 64 61 74 65 73 29 20 74 68 61  .** updates) tha
1e670 74 20 68 61 76 65 20 62 65 65 6e 20 70 65 72 66  t have been perf
1e680 6f 72 6d 65 64 20 6f 6e 20 74 68 65 20 74 61 72  ormed on the tar
1e690 67 65 74 20 64 61 74 61 62 61 73 65 20 73 69 6e  get database sin
1e6a0 63 65 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e  ce the.** curren
1e6b0 74 20 52 42 55 20 75 70 64 61 74 65 20 77 61 73  t RBU update was
1e6c0 20 73 74 61 72 74 65 64 2e 0a 2a 2f 0a 73 71 6c   started..*/.sql
1e6d0 69 74 65 33 5f 69 6e 74 36 34 20 73 71 6c 69 74  ite3_int64 sqlit
1e6e0 65 33 72 62 75 5f 70 72 6f 67 72 65 73 73 28 73  e3rbu_progress(s
1e6f0 71 6c 69 74 65 33 72 62 75 20 2a 70 52 62 75 29  qlite3rbu *pRbu)
1e700 7b 0a 20 20 72 65 74 75 72 6e 20 70 52 62 75 2d  {.  return pRbu-
1e710 3e 6e 50 72 6f 67 72 65 73 73 3b 0a 7d 0a 0a 2f  >nProgress;.}../
1e720 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 70 65 72 6d  *.** Return perm
1e730 79 72 69 61 64 61 67 65 20 70 72 6f 67 72 65 73  yriadage progres
1e740 73 20 69 6e 64 69 63 61 74 69 6f 6e 73 20 66 6f  s indications fo
1e750 72 20 74 68 65 20 74 77 6f 20 6d 61 69 6e 20 73  r the two main s
1e760 74 61 67 65 73 20 6f 66 0a 2a 2a 20 61 6e 20 52  tages of.** an R
1e770 42 55 20 75 70 64 61 74 65 2e 0a 2a 2f 0a 76 6f  BU update..*/.vo
1e780 69 64 20 73 71 6c 69 74 65 33 72 62 75 5f 62 70  id sqlite3rbu_bp
1e790 5f 70 72 6f 67 72 65 73 73 28 73 71 6c 69 74 65  _progress(sqlite
1e7a0 33 72 62 75 20 2a 70 2c 20 69 6e 74 20 2a 70 6e  3rbu *p, int *pn
1e7b0 4f 6e 65 2c 20 69 6e 74 20 2a 70 6e 54 77 6f 29  One, int *pnTwo)
1e7c0 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 4d 41  {.  const int MA
1e7d0 58 5f 50 52 4f 47 52 45 53 53 20 3d 20 31 30 30  X_PROGRESS = 100
1e7e0 30 30 3b 0a 20 20 73 77 69 74 63 68 28 20 70 2d  00;.  switch( p-
1e7f0 3e 65 53 74 61 67 65 20 29 7b 0a 20 20 20 20 63  >eStage ){.    c
1e800 61 73 65 20 52 42 55 5f 53 54 41 47 45 5f 4f 41  ase RBU_STAGE_OA
1e810 4c 3a 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  L:.      if( p->
1e820 6e 50 68 61 73 65 4f 6e 65 53 74 65 70 3e 30 20  nPhaseOneStep>0 
1e830 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 6e 4f 6e  ){.        *pnOn
1e840 65 20 3d 20 28 69 6e 74 29 28 4d 41 58 5f 50 52  e = (int)(MAX_PR
1e850 4f 47 52 45 53 53 20 2a 20 28 69 36 34 29 70 2d  OGRESS * (i64)p-
1e860 3e 6e 50 72 6f 67 72 65 73 73 2f 28 69 36 34 29  >nProgress/(i64)
1e870 70 2d 3e 6e 50 68 61 73 65 4f 6e 65 53 74 65 70  p->nPhaseOneStep
1e880 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
1e890 20 20 20 20 20 20 20 20 2a 70 6e 4f 6e 65 20 3d          *pnOne =
1e8a0 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   -1;.      }.   
1e8b0 20 20 20 2a 70 6e 54 77 6f 20 3d 20 30 3b 0a 20     *pnTwo = 0;. 
1e8c0 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
1e8d0 20 63 61 73 65 20 52 42 55 5f 53 54 41 47 45 5f   case RBU_STAGE_
1e8e0 4d 4f 56 45 3a 0a 20 20 20 20 20 20 2a 70 6e 4f  MOVE:.      *pnO
1e8f0 6e 65 20 3d 20 4d 41 58 5f 50 52 4f 47 52 45 53  ne = MAX_PROGRES
1e900 53 3b 0a 20 20 20 20 20 20 2a 70 6e 54 77 6f 20  S;.      *pnTwo 
1e910 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = 0;.      break
1e920 3b 0a 0a 20 20 20 20 63 61 73 65 20 52 42 55 5f  ;..    case RBU_
1e930 53 54 41 47 45 5f 43 4b 50 54 3a 0a 20 20 20 20  STAGE_CKPT:.    
1e940 20 20 2a 70 6e 4f 6e 65 20 3d 20 4d 41 58 5f 50    *pnOne = MAX_P
1e950 52 4f 47 52 45 53 53 3b 0a 20 20 20 20 20 20 2a  ROGRESS;.      *
1e960 70 6e 54 77 6f 20 3d 20 28 69 6e 74 29 28 4d 41  pnTwo = (int)(MA
1e970 58 5f 50 52 4f 47 52 45 53 53 20 2a 20 28 69 36  X_PROGRESS * (i6
1e980 34 29 70 2d 3e 6e 53 74 65 70 20 2f 20 28 69 36  4)p->nStep / (i6
1e990 34 29 70 2d 3e 6e 46 72 61 6d 65 29 3b 0a 20 20  4)p->nFrame);.  
1e9a0 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
1e9b0 63 61 73 65 20 52 42 55 5f 53 54 41 47 45 5f 44  case RBU_STAGE_D
1e9c0 4f 4e 45 3a 0a 20 20 20 20 20 20 2a 70 6e 4f 6e  ONE:.      *pnOn
1e9d0 65 20 3d 20 4d 41 58 5f 50 52 4f 47 52 45 53 53  e = MAX_PROGRESS
1e9e0 3b 0a 20 20 20 20 20 20 2a 70 6e 54 77 6f 20 3d  ;.      *pnTwo =
1e9f0 20 4d 41 58 5f 50 52 4f 47 52 45 53 53 3b 0a 20   MAX_PROGRESS;. 
1ea00 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
1ea10 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
1ea20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 20 20 7d  assert( 0 );.  }
1ea30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1ea40 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61   the current sta
1ea50 74 65 20 6f 66 20 74 68 65 20 52 42 55 20 76 61  te of the RBU va
1ea60 63 75 75 6d 20 6f 72 20 75 70 64 61 74 65 20 6f  cuum or update o
1ea70 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  peration..*/.int
1ea80 20 73 71 6c 69 74 65 33 72 62 75 5f 73 74 61 74   sqlite3rbu_stat
1ea90 65 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 29  e(sqlite3rbu *p)
1eaa0 7b 0a 20 20 69 6e 74 20 61 52 65 73 5b 5d 20 3d  {.  int aRes[] =
1eab0 20 7b 0a 20 20 20 20 30 2c 20 53 51 4c 49 54 45   {.    0, SQLITE
1eac0 5f 52 42 55 5f 53 54 41 54 45 5f 4f 41 4c 2c 20  _RBU_STATE_OAL, 
1ead0 53 51 4c 49 54 45 5f 52 42 55 5f 53 54 41 54 45  SQLITE_RBU_STATE
1eae0 5f 4d 4f 56 45 2c 0a 20 20 20 20 30 2c 20 53 51  _MOVE,.    0, SQ
1eaf0 4c 49 54 45 5f 52 42 55 5f 53 54 41 54 45 5f 43  LITE_RBU_STATE_C
1eb00 48 45 43 4b 50 4f 49 4e 54 2c 20 53 51 4c 49 54  HECKPOINT, SQLIT
1eb10 45 5f 52 42 55 5f 53 54 41 54 45 5f 44 4f 4e 45  E_RBU_STATE_DONE
1eb20 0a 20 20 7d 3b 0a 0a 20 20 61 73 73 65 72 74 28  .  };..  assert(
1eb30 20 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 3d 3d   RBU_STAGE_OAL==
1eb40 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 52  1 );.  assert( R
1eb50 42 55 5f 53 54 41 47 45 5f 4d 4f 56 45 3d 3d 32  BU_STAGE_MOVE==2
1eb60 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 52 42   );.  assert( RB
1eb70 55 5f 53 54 41 47 45 5f 43 4b 50 54 3d 3d 34 20  U_STAGE_CKPT==4 
1eb80 29 3b 0a 20 20 61 73 73 65 72 74 28 20 52 42 55  );.  assert( RBU
1eb90 5f 53 54 41 47 45 5f 44 4f 4e 45 3d 3d 35 20 29  _STAGE_DONE==5 )
1eba0 3b 0a 20 20 61 73 73 65 72 74 28 20 61 52 65 73  ;.  assert( aRes
1ebb0 5b 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 5d 3d  [RBU_STAGE_OAL]=
1ebc0 3d 53 51 4c 49 54 45 5f 52 42 55 5f 53 54 41 54  =SQLITE_RBU_STAT
1ebd0 45 5f 4f 41 4c 20 29 3b 0a 20 20 61 73 73 65 72  E_OAL );.  asser
1ebe0 74 28 20 61 52 65 73 5b 52 42 55 5f 53 54 41 47  t( aRes[RBU_STAG
1ebf0 45 5f 4d 4f 56 45 5d 3d 3d 53 51 4c 49 54 45 5f  E_MOVE]==SQLITE_
1ec00 52 42 55 5f 53 54 41 54 45 5f 4d 4f 56 45 20 29  RBU_STATE_MOVE )
1ec10 3b 0a 20 20 61 73 73 65 72 74 28 20 61 52 65 73  ;.  assert( aRes
1ec20 5b 52 42 55 5f 53 54 41 47 45 5f 43 4b 50 54 5d  [RBU_STAGE_CKPT]
1ec30 3d 3d 53 51 4c 49 54 45 5f 52 42 55 5f 53 54 41  ==SQLITE_RBU_STA
1ec40 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 20 29 3b  TE_CHECKPOINT );
1ec50 0a 20 20 61 73 73 65 72 74 28 20 61 52 65 73 5b  .  assert( aRes[
1ec60 52 42 55 5f 53 54 41 47 45 5f 44 4f 4e 45 5d 3d  RBU_STAGE_DONE]=
1ec70 3d 53 51 4c 49 54 45 5f 52 42 55 5f 53 54 41 54  =SQLITE_RBU_STAT
1ec80 45 5f 44 4f 4e 45 20 29 3b 0a 0a 20 20 69 66 28  E_DONE );..  if(
1ec90 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f   p->rc!=SQLITE_O
1eca0 4b 20 26 26 20 70 2d 3e 72 63 21 3d 53 51 4c 49  K && p->rc!=SQLI
1ecb0 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 72  TE_DONE ){.    r
1ecc0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 42 55  eturn SQLITE_RBU
1ecd0 5f 53 54 41 54 45 5f 45 52 52 4f 52 3b 0a 20 20  _STATE_ERROR;.  
1ece0 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
1ecf0 74 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45  t( p->rc!=SQLITE
1ed00 5f 44 4f 4e 45 20 7c 7c 20 70 2d 3e 65 53 74 61  _DONE || p->eSta
1ed10 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 44 4f  ge==RBU_STAGE_DO
1ed20 4e 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  NE );.    assert
1ed30 28 20 70 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55  ( p->eStage==RBU
1ed40 5f 53 54 41 47 45 5f 4f 41 4c 0a 20 20 20 20 20  _STAGE_OAL.     
1ed50 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 67 65      || p->eStage
1ed60 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4d 4f 56 45  ==RBU_STAGE_MOVE
1ed70 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e  .         || p->
1ed80 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47  eStage==RBU_STAG
1ed90 45 5f 43 4b 50 54 0a 20 20 20 20 20 20 20 20 20  E_CKPT.         
1eda0 7c 7c 20 70 2d 3e 65 53 74 61 67 65 3d 3d 52 42  || p->eStage==RB
1edb0 55 5f 53 54 41 47 45 5f 44 4f 4e 45 0a 20 20 20  U_STAGE_DONE.   
1edc0 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 61   );.    return a
1edd0 52 65 73 5b 70 2d 3e 65 53 74 61 67 65 5d 3b 0a  Res[p->eStage];.
1ede0 20 20 7d 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74    }.}..int sqlit
1edf0 65 33 72 62 75 5f 73 61 76 65 73 74 61 74 65 28  e3rbu_savestate(
1ee00 73 71 6c 69 74 65 33 72 62 75 20 2a 70 29 7b 0a  sqlite3rbu *p){.
1ee10 20 20 69 6e 74 20 72 63 20 3d 20 70 2d 3e 72 63    int rc = p->rc
1ee20 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
1ee30 54 45 5f 44 4f 4e 45 20 29 20 72 65 74 75 72 6e  TE_DONE ) return
1ee40 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
1ee50 73 73 65 72 74 28 20 70 2d 3e 65 53 74 61 67 65  ssert( p->eStage
1ee60 3e 3d 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20  >=RBU_STAGE_OAL 
1ee70 26 26 20 70 2d 3e 65 53 74 61 67 65 3c 3d 52 42  && p->eStage<=RB
1ee80 55 5f 53 54 41 47 45 5f 44 4f 4e 45 20 29 3b 0a  U_STAGE_DONE );.
1ee90 20 20 69 66 28 20 70 2d 3e 65 53 74 61 67 65 3d    if( p->eStage=
1eea0 3d 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20 29  =RBU_STAGE_OAL )
1eeb0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  {.    assert( rc
1eec0 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  !=SQLITE_DONE );
1eed0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1eee0 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 73 71  ITE_OK ) rc = sq
1eef0 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62  lite3_exec(p->db
1ef00 4d 61 69 6e 2c 20 22 43 4f 4d 4d 49 54 22 2c 20  Main, "COMMIT", 
1ef10 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20  0, 0, 0);.  }.. 
1ef20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 64 62 20   /* Sync the db 
1ef30 66 69 6c 65 20 2a 2f 0a 20 20 69 66 28 20 72 63  file */.  if( rc
1ef40 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
1ef50 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54  ->eStage==RBU_ST
1ef60 41 47 45 5f 43 4b 50 54 20 29 7b 0a 20 20 20 20  AGE_CKPT ){.    
1ef70 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 44  sqlite3_file *pD
1ef80 62 20 3d 20 70 2d 3e 70 54 61 72 67 65 74 46 64  b = p->pTargetFd
1ef90 2d 3e 70 52 65 61 6c 3b 0a 20 20 20 20 72 63 20  ->pReal;.    rc 
1efa0 3d 20 70 44 62 2d 3e 70 4d 65 74 68 6f 64 73 2d  = pDb->pMethods-
1efb0 3e 78 53 79 6e 63 28 70 44 62 2c 20 53 51 4c 49  >xSync(pDb, SQLI
1efc0 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b  TE_SYNC_NORMAL);
1efd0 0a 20 20 7d 0a 0a 20 20 70 2d 3e 72 63 20 3d 20  .  }..  p->rc = 
1efe0 72 63 3b 0a 20 20 72 62 75 53 61 76 65 53 74 61  rc;.  rbuSaveSta
1eff0 74 65 28 70 2c 20 70 2d 3e 65 53 74 61 67 65 29  te(p, p->eStage)
1f000 3b 0a 20 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a  ;.  rc = p->rc;.
1f010 0a 20 20 69 66 28 20 70 2d 3e 65 53 74 61 67 65  .  if( p->eStage
1f020 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20  ==RBU_STAGE_OAL 
1f030 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  ){.    assert( r
1f040 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
1f050 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
1f060 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 73  LITE_OK ) rc = s
1f070 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
1f080 62 52 62 75 2c 20 22 43 4f 4d 4d 49 54 22 2c 20  bRbu, "COMMIT", 
1f090 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  0, 0, 0);.    if
1f0a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1f0b0 29 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65  ) rc = sqlite3_e
1f0c0 78 65 63 28 70 2d 3e 64 62 52 62 75 2c 20 22 42  xec(p->dbRbu, "B
1f0d0 45 47 49 4e 20 49 4d 4d 45 44 49 41 54 45 22 2c  EGIN IMMEDIATE",
1f0e0 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69   0, 0, 0);.    i
1f0f0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1f100 20 29 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f   ) rc = sqlite3_
1f110 65 78 65 63 28 70 2d 3e 64 62 4d 61 69 6e 2c 20  exec(p->dbMain, 
1f120 22 42 45 47 49 4e 20 49 4d 4d 45 44 49 41 54 45  "BEGIN IMMEDIATE
1f130 22 2c 20 30 2c 20 30 2c 30 29 3b 0a 20 20 7d 0a  ", 0, 0,0);.  }.
1f140 0a 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20  .  p->rc = rc;. 
1f150 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1f160 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f170 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f180 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f190 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f1a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 42 65  **********.** Be
1f1b0 67 69 6e 6e 69 6e 67 20 6f 66 20 52 42 55 20 56  ginning of RBU V
1f1c0 46 53 20 73 68 69 6d 20 6d 65 74 68 6f 64 73 2e  FS shim methods.
1f1d0 20 54 68 65 20 56 46 53 20 73 68 69 6d 20 6d 6f   The VFS shim mo
1f1e0 64 69 66 69 65 73 20 74 68 65 20 62 65 68 61 76  difies the behav
1f1f0 69 6f 75 72 0a 2a 2a 20 6f 66 20 61 20 73 74 61  iour.** of a sta
1f200 6e 64 61 72 64 20 56 46 53 20 69 6e 20 74 68 65  ndard VFS in the
1f210 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 61 79 73 3a   following ways:
1f220 0a 2a 2a 0a 2a 2a 20 31 2e 20 57 68 65 6e 65 76  .**.** 1. Whenev
1f230 65 72 20 74 68 65 20 66 69 72 73 74 20 70 61 67  er the first pag
1f240 65 20 6f 66 20 61 20 6d 61 69 6e 20 64 61 74 61  e of a main data
1f250 62 61 73 65 20 66 69 6c 65 20 69 73 20 72 65 61  base file is rea
1f260 64 20 6f 72 20 0a 2a 2a 20 20 20 20 77 72 69 74  d or .**    writ
1f270 74 65 6e 2c 20 74 68 65 20 76 61 6c 75 65 20 6f  ten, the value o
1f280 66 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  f the change-cou
1f290 6e 74 65 72 20 63 6f 6f 6b 69 65 20 69 73 20 73  nter cookie is s
1f2a0 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 20 20 20 72  tored in.**    r
1f2b0 62 75 5f 66 69 6c 65 2e 69 43 6f 6f 6b 69 65 2e  bu_file.iCookie.
1f2c0 20 53 69 6d 69 6c 61 72 6c 79 2c 20 74 68 65 20   Similarly, the 
1f2d0 76 61 6c 75 65 20 6f 66 20 74 68 65 20 22 77 72  value of the "wr
1f2e0 69 74 65 2d 76 65 72 73 69 6f 6e 22 0a 2a 2a 20  ite-version".** 
1f2f0 20 20 20 64 61 74 61 62 61 73 65 20 68 65 61 64     database head
1f300 65 72 20 66 69 65 6c 64 20 69 73 20 73 74 6f 72  er field is stor
1f310 65 64 20 69 6e 20 72 62 75 5f 66 69 6c 65 2e 69  ed in rbu_file.i
1f320 57 72 69 74 65 56 65 72 2e 20 54 68 69 73 20 65  WriteVer. This e
1f330 6e 73 75 72 65 73 0a 2a 2a 20 20 20 20 74 68 61  nsures.**    tha
1f340 74 20 74 68 65 20 76 61 6c 75 65 73 20 61 72 65  t the values are
1f350 20 61 6c 77 61 79 73 20 74 72 75 73 74 77 6f 72   always trustwor
1f360 74 68 79 20 77 69 74 68 69 6e 20 61 6e 20 6f 70  thy within an op
1f370 65 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  en transaction..
1f380 2a 2a 0a 2a 2a 20 32 2e 20 57 68 65 6e 65 76 65  **.** 2. Wheneve
1f390 72 20 61 6e 20 53 51 4c 49 54 45 5f 4f 50 45 4e  r an SQLITE_OPEN
1f3a0 5f 57 41 4c 20 66 69 6c 65 20 69 73 20 6f 70 65  _WAL file is ope
1f3b0 6e 65 64 2c 20 74 68 65 20 28 72 62 75 5f 66 69  ned, the (rbu_fi
1f3c0 6c 65 2e 70 57 61 6c 46 64 29 0a 2a 2a 20 20 20  le.pWalFd).**   
1f3d0 20 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c 65   member variable
1f3e0 20 6f 66 20 74 68 65 20 61 73 73 6f 63 69 61 74   of the associat
1f3f0 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ed database file
1f400 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 73   descriptor is s
1f410 65 74 0a 2a 2a 20 20 20 20 74 6f 20 70 6f 69 6e  et.**    to poin
1f420 74 20 74 6f 20 74 68 65 20 6e 65 77 20 66 69 6c  t to the new fil
1f430 65 2e 20 41 20 6d 75 74 65 78 20 70 72 6f 74 65  e. A mutex prote
1f440 63 74 65 64 20 6c 69 6e 6b 65 64 20 6c 69 73 74  cted linked list
1f450 20 6f 66 20 61 6c 6c 20 6d 61 69 6e 20 0a 2a 2a   of all main .**
1f460 20 20 20 20 64 62 20 66 64 73 20 6f 70 65 6e 65      db fds opene
1f470 64 20 75 73 69 6e 67 20 61 20 70 61 72 74 69 63  d using a partic
1f480 75 6c 61 72 20 52 42 55 20 56 46 53 20 69 73 20  ular RBU VFS is 
1f490 6d 61 69 6e 74 61 69 6e 65 64 20 61 74 20 0a 2a  maintained at .*
1f4a0 2a 20 20 20 20 72 62 75 5f 76 66 73 2e 70 4d 61  *    rbu_vfs.pMa
1f4b0 69 6e 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65  in to facilitate
1f4c0 20 74 68 69 73 2e 0a 2a 2a 0a 2a 2a 20 33 2e 20   this..**.** 3. 
1f4d0 55 73 69 6e 67 20 61 20 6e 65 77 20 66 69 6c 65  Using a new file
1f4e0 2d 63 6f 6e 74 72 6f 6c 20 22 53 51 4c 49 54 45  -control "SQLITE
1f4f0 5f 46 43 4e 54 4c 5f 52 42 55 22 2c 20 61 20 6d  _FCNTL_RBU", a m
1f500 61 69 6e 20 64 62 20 72 62 75 5f 66 69 6c 65 20  ain db rbu_file 
1f510 0a 2a 2a 20 20 20 20 6f 62 6a 65 63 74 20 63 61  .**    object ca
1f520 6e 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20 74  n be marked as t
1f530 68 65 20 74 61 72 67 65 74 20 64 61 74 61 62 61  he target databa
1f540 73 65 20 6f 66 20 61 6e 20 52 42 55 20 75 70 64  se of an RBU upd
1f550 61 74 65 2e 20 54 68 69 73 0a 2a 2a 20 20 20 20  ate. This.**    
1f560 74 75 72 6e 73 20 6f 6e 20 74 68 65 20 66 6f 6c  turns on the fol
1f570 6c 6f 77 69 6e 67 20 65 78 74 72 61 20 73 70 65  lowing extra spe
1f580 63 69 61 6c 20 62 65 68 61 76 69 6f 75 72 3a 0a  cial behaviour:.
1f590 2a 2a 0a 2a 2a 20 33 61 2e 20 49 66 20 78 41 63  **.** 3a. If xAc
1f5a0 63 65 73 73 28 29 20 69 73 20 63 61 6c 6c 65 64  cess() is called
1f5b0 20 74 6f 20 63 68 65 63 6b 20 69 66 20 74 68 65   to check if the
1f5c0 72 65 20 65 78 69 73 74 73 20 61 20 2a 2d 77 61  re exists a *-wa
1f5d0 6c 20 66 69 6c 65 20 0a 2a 2a 20 20 20 20 20 61  l file .**     a
1f5e0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61  ssociated with a
1f5f0 6e 20 52 42 55 20 74 61 72 67 65 74 20 64 61 74  n RBU target dat
1f600 61 62 61 73 65 20 63 75 72 72 65 6e 74 6c 79 20  abase currently 
1f610 69 6e 20 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c  in RBU_STAGE_OAL
1f620 0a 2a 2a 20 20 20 20 20 73 74 61 67 65 20 28 70  .**     stage (p
1f630 72 65 70 61 72 69 6e 67 20 74 68 65 20 2a 2d 6f  reparing the *-o
1f640 61 6c 20 66 69 6c 65 29 2c 20 74 68 65 20 66 6f  al file), the fo
1f650 6c 6c 6f 77 69 6e 67 20 73 70 65 63 69 61 6c 20  llowing special 
1f660 68 61 6e 64 6c 69 6e 67 0a 2a 2a 20 20 20 20 20  handling.**     
1f670 61 70 70 6c 69 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  applies:.**.**  
1f680 20 20 20 20 2a 20 69 66 20 74 68 65 20 2a 2d 77      * if the *-w
1f690 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 65 78 69  al file does exi
1f6a0 73 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  st, return SQLIT
1f6b0 45 5f 43 41 4e 54 4f 50 45 4e 2e 20 41 6e 20 52  E_CANTOPEN. An R
1f6c0 42 55 0a 2a 2a 20 20 20 20 20 20 20 20 74 61 72  BU.**        tar
1f6d0 67 65 74 20 64 61 74 61 62 61 73 65 20 6d 61 79  get database may
1f6e0 20 6e 6f 74 20 62 65 20 69 6e 20 77 61 6c 20 6d   not be in wal m
1f6f0 6f 64 65 20 61 6c 72 65 61 64 79 2e 0a 2a 2a 0a  ode already..**.
1f700 2a 2a 20 20 20 20 20 20 2a 20 69 66 20 74 68 65  **      * if the
1f710 20 2a 2d 77 61 6c 20 66 69 6c 65 20 64 6f 65 73   *-wal file does
1f720 20 6e 6f 74 20 65 78 69 73 74 2c 20 73 65 74 20   not exist, set 
1f730 74 68 65 20 6f 75 74 70 75 74 20 70 61 72 61 6d  the output param
1f740 65 74 65 72 20 74 6f 0a 2a 2a 20 20 20 20 20 20  eter to.**      
1f750 20 20 6e 6f 6e 2d 7a 65 72 6f 20 28 74 6f 20 74    non-zero (to t
1f760 65 6c 6c 20 53 51 4c 69 74 65 20 74 68 61 74 20  ell SQLite that 
1f770 69 74 20 64 6f 65 73 20 65 78 69 73 74 29 20 61  it does exist) a
1f780 6e 79 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  nyway..**.**    
1f790 20 54 68 65 6e 2c 20 77 68 65 6e 20 78 4f 70 65   Then, when xOpe
1f7a0 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  n() is called to
1f7b0 20 6f 70 65 6e 20 74 68 65 20 2a 2d 77 61 6c 20   open the *-wal 
1f7c0 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20  file associated 
1f7d0 77 69 74 68 0a 2a 2a 20 20 20 20 20 74 68 65 20  with.**     the 
1f7e0 52 42 55 20 74 61 72 67 65 74 20 69 6e 20 52 42  RBU target in RB
1f7f0 55 5f 53 54 41 47 45 5f 4f 41 4c 20 73 74 61 67  U_STAGE_OAL stag
1f800 65 2c 20 69 6e 73 74 65 61 64 20 6f 66 20 6f 70  e, instead of op
1f810 65 6e 69 6e 67 20 74 68 65 20 2a 2d 77 61 6c 0a  ening the *-wal.
1f820 2a 2a 20 20 20 20 20 66 69 6c 65 2c 20 74 68 65  **     file, the
1f830 20 72 62 75 20 76 66 73 20 6f 70 65 6e 73 20 74   rbu vfs opens t
1f840 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
1f850 20 2a 2d 6f 61 6c 20 66 69 6c 65 20 69 6e 73 74   *-oal file inst
1f860 65 61 64 2e 20 0a 2a 2a 0a 2a 2a 20 33 62 2e 20  ead. .**.** 3b. 
1f870 54 68 65 20 2a 2d 73 68 6d 20 70 61 67 65 73 20  The *-shm pages 
1f880 72 65 74 75 72 6e 65 64 20 62 79 20 78 53 68 6d  returned by xShm
1f890 4d 61 70 28 29 20 66 6f 72 20 61 20 74 61 72 67  Map() for a targ
1f8a0 65 74 20 64 62 20 66 69 6c 65 20 69 6e 0a 2a 2a  et db file in.**
1f8b0 20 20 20 20 20 52 42 55 5f 53 54 41 47 45 5f 4f       RBU_STAGE_O
1f8c0 41 4c 20 6d 6f 64 65 20 61 72 65 20 61 63 74 75  AL mode are actu
1f8d0 61 6c 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 68  ally stored in h
1f8e0 65 61 70 20 6d 65 6d 6f 72 79 2e 20 54 68 69 73  eap memory. This
1f8f0 20 69 73 20 74 6f 0a 2a 2a 20 20 20 20 20 61 76   is to.**     av
1f900 6f 69 64 20 63 72 65 61 74 69 6e 67 20 61 20 2a  oid creating a *
1f910 2d 73 68 6d 20 66 69 6c 65 20 6f 6e 20 64 69 73  -shm file on dis
1f920 6b 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c  k. Additionally,
1f930 20 78 53 68 6d 4c 6f 63 6b 28 29 20 63 61 6c 6c   xShmLock() call
1f940 73 0a 2a 2a 20 20 20 20 20 61 72 65 20 6e 6f 2d  s.**     are no-
1f950 6f 70 73 20 6f 6e 20 74 61 72 67 65 74 20 64 61  ops on target da
1f960 74 61 62 61 73 65 20 66 69 6c 65 73 20 69 6e 20  tabase files in 
1f970 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20 6d 6f  RBU_STAGE_OAL mo
1f980 64 65 2e 20 54 68 69 73 20 69 73 0a 2a 2a 20 20  de. This is.**  
1f990 20 20 20 62 65 63 61 75 73 65 20 61 73 73 65 72     because asser
1f9a0 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 69  t() statements i
1f9b0 6e 20 73 6f 6d 65 20 56 46 53 20 69 6d 70 6c 65  n some VFS imple
1f9c0 6d 65 6e 74 61 74 69 6f 6e 73 20 66 61 69 6c 20  mentations fail 
1f9d0 69 66 20 0a 2a 2a 20 20 20 20 20 78 53 68 6d 4c  if .**     xShmL
1f9e0 6f 63 6b 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ock() is called 
1f9f0 62 65 66 6f 72 65 20 78 53 68 6d 4d 61 70 28 29  before xShmMap()
1fa00 2e 0a 2a 2a 0a 2a 2a 20 33 63 2e 20 49 66 20 61  ..**.** 3c. If a
1fa10 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
1fa20 20 69 73 20 61 74 74 65 6d 70 74 65 64 20 6f 6e   is attempted on
1fa30 20 61 20 74 61 72 67 65 74 20 64 61 74 61 62 61   a target databa
1fa40 73 65 20 66 69 6c 65 20 69 6e 20 61 6e 79 0a 2a  se file in any.*
1fa50 2a 20 20 20 20 20 6d 6f 64 65 20 65 78 63 65 70  *     mode excep
1fa60 74 20 52 42 55 5f 53 54 41 47 45 5f 44 4f 4e 45  t RBU_STAGE_DONE
1fa70 20 28 61 6c 6c 20 77 6f 72 6b 20 63 6f 6d 70 6c   (all work compl
1fa80 65 74 65 64 20 61 6e 64 20 63 68 65 63 6b 70 6f  eted and checkpo
1fa90 69 6e 74 65 64 29 2c 20 69 74 20 0a 2a 2a 20 20  inted), it .**  
1faa0 20 20 20 66 61 69 6c 73 20 77 69 74 68 20 61 6e     fails with an
1fab0 20 53 51 4c 49 54 45 5f 42 55 53 59 20 65 72 72   SQLITE_BUSY err
1fac0 6f 72 2e 20 54 68 69 73 20 69 73 20 74 6f 20 73  or. This is to s
1fad0 74 6f 70 20 52 42 55 20 63 6f 6e 6e 65 63 74 69  top RBU connecti
1fae0 6f 6e 73 0a 2a 2a 20 20 20 20 20 66 72 6f 6d 20  ons.**     from 
1faf0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 68  automatically ch
1fb00 65 63 6b 70 6f 69 6e 74 69 6e 67 20 61 20 2a 2d  eckpointing a *-
1fb10 77 61 6c 20 28 6f 72 20 2a 2d 6f 61 6c 29 20 66  wal (or *-oal) f
1fb20 69 6c 65 20 66 72 6f 6d 20 77 69 74 68 69 6e 0a  ile from within.
1fb30 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63  **     sqlite3_c
1fb40 6c 6f 73 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 33 64  lose()..**.** 3d
1fb50 2e 20 49 6e 20 52 42 55 5f 53 54 41 47 45 5f 43  . In RBU_STAGE_C
1fb60 41 50 54 55 52 45 20 6d 6f 64 65 2c 20 61 6c 6c  APTURE mode, all
1fb70 20 78 52 65 61 64 28 29 20 63 61 6c 6c 73 20 6f   xRead() calls o
1fb80 6e 20 74 68 65 20 77 61 6c 20 66 69 6c 65 2c 20  n the wal file, 
1fb90 61 6e 64 0a 2a 2a 20 20 20 20 20 61 6c 6c 20 78  and.**     all x
1fba0 57 72 69 74 65 28 29 20 63 61 6c 6c 73 20 6f 6e  Write() calls on
1fbb0 20 74 68 65 20 74 61 72 67 65 74 20 64 61 74 61   the target data
1fbc0 62 61 73 65 20 66 69 6c 65 20 70 65 72 66 6f 72  base file perfor
1fbd0 6d 20 6e 6f 20 49 4f 2e 20 0a 2a 2a 20 20 20 20  m no IO. .**    
1fbe0 20 49 6e 73 74 65 61 64 20 74 68 65 20 66 72 61   Instead the fra
1fbf0 6d 65 20 61 6e 64 20 70 61 67 65 20 6e 75 6d 62  me and page numb
1fc00 65 72 73 20 74 68 61 74 20 77 6f 75 6c 64 20 62  ers that would b
1fc10 65 20 72 65 61 64 20 61 6e 64 20 77 72 69 74 74  e read and writt
1fc20 65 6e 0a 2a 2a 20 20 20 20 20 61 72 65 20 72 65  en.**     are re
1fc30 63 6f 72 64 65 64 2e 20 41 64 64 69 74 69 6f 6e  corded. Addition
1fc40 61 6c 6c 79 2c 20 73 75 63 63 65 73 73 66 75 6c  ally, successful
1fc50 20 61 74 74 65 6d 70 74 73 20 74 6f 20 6f 62 74   attempts to obt
1fc60 61 69 6e 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a  ain exclusive.**
1fc70 20 20 20 20 20 78 53 68 6d 4c 6f 63 6b 28 29 20       xShmLock() 
1fc80 57 52 49 54 45 52 2c 20 43 48 45 43 4b 50 4f 49  WRITER, CHECKPOI
1fc90 4e 54 45 52 20 61 6e 64 20 52 45 41 44 30 20 6c  NTER and READ0 l
1fca0 6f 63 6b 73 20 6f 6e 20 74 68 65 20 74 61 72 67  ocks on the targ
1fcb0 65 74 20 0a 2a 2a 20 20 20 20 20 64 61 74 61 62  et .**     datab
1fcc0 61 73 65 20 66 69 6c 65 20 61 72 65 20 72 65 63  ase file are rec
1fcd0 6f 72 64 65 64 2e 20 78 53 68 6d 4c 6f 63 6b 28  orded. xShmLock(
1fce0 29 20 63 61 6c 6c 73 20 74 6f 20 75 6e 6c 6f 63  ) calls to unloc
1fcf0 6b 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 20 20  k the same.**   
1fd00 20 20 6c 6f 63 6b 73 20 61 72 65 20 6e 6f 2d 6f    locks are no-o
1fd10 70 73 20 28 73 6f 20 74 68 61 74 20 6f 6e 63 65  ps (so that once
1fd20 20 6f 62 74 61 69 6e 65 64 2c 20 74 68 65 73 65   obtained, these
1fd30 20 6c 6f 63 6b 73 20 61 72 65 20 6e 65 76 65 72   locks are never
1fd40 0a 2a 2a 20 20 20 20 20 72 65 6c 69 6e 71 75 69  .**     relinqui
1fd50 73 68 65 64 29 2e 20 46 69 6e 61 6c 6c 79 2c 20  shed). Finally, 
1fd60 63 61 6c 6c 73 20 74 6f 20 78 53 79 6e 63 28 29  calls to xSync()
1fd70 20 6f 6e 20 74 68 65 20 74 61 72 67 65 74 20 64   on the target d
1fd80 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 66  atabase.**     f
1fd90 69 6c 65 20 66 61 69 6c 20 77 69 74 68 20 53 51  ile fail with SQ
1fda0 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c 20 65 72  LITE_INTERNAL er
1fdb0 72 6f 72 73 2e 0a 2a 2f 0a 0a 73 74 61 74 69 63  rors..*/..static
1fdc0 20 76 6f 69 64 20 72 62 75 55 6e 6c 6f 63 6b 53   void rbuUnlockS
1fdd0 68 6d 28 72 62 75 5f 66 69 6c 65 20 2a 70 29 7b  hm(rbu_file *p){
1fde0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70  .  assert( p->op
1fdf0 65 6e 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  enFlags & SQLITE
1fe00 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 3b  _OPEN_MAIN_DB );
1fe10 0a 20 20 69 66 28 20 70 2d 3e 70 52 62 75 20 29  .  if( p->pRbu )
1fe20 7b 0a 20 20 20 20 69 6e 74 20 28 2a 78 53 68 6d  {.    int (*xShm
1fe30 4c 6f 63 6b 29 28 73 71 6c 69 74 65 33 5f 66 69  Lock)(sqlite3_fi
1fe40 6c 65 2a 2c 69 6e 74 2c 69 6e 74 2c 69 6e 74 29  le*,int,int,int)
1fe50 20 3d 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65   = p->pReal->pMe
1fe60 74 68 6f 64 73 2d 3e 78 53 68 6d 4c 6f 63 6b 3b  thods->xShmLock;
1fe70 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
1fe80 66 6f 72 28 69 3d 30 3b 20 69 3c 53 51 4c 49 54  for(i=0; i<SQLIT
1fe90 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 3b 69 2b 2b 29  E_SHM_NLOCK;i++)
1fea0 7b 0a 20 20 20 20 20 20 69 66 28 20 28 31 3c 3c  {.      if( (1<<
1feb0 69 29 20 26 20 70 2d 3e 70 52 62 75 2d 3e 6d 4c  i) & p->pRbu->mL
1fec0 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 78  ock ){.        x
1fed0 53 68 6d 4c 6f 63 6b 28 70 2d 3e 70 52 65 61 6c  ShmLock(p->pReal
1fee0 2c 20 69 2c 20 31 2c 20 53 51 4c 49 54 45 5f 53  , i, 1, SQLITE_S
1fef0 48 4d 5f 55 4e 4c 4f 43 4b 7c 53 51 4c 49 54 45  HM_UNLOCK|SQLITE
1ff00 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 3b  _SHM_EXCLUSIVE);
1ff10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1ff20 20 20 20 70 2d 3e 70 52 62 75 2d 3e 6d 4c 6f 63     p->pRbu->mLoc
1ff30 6b 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  k = 0;.  }.}../*
1ff40 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
1ff50 62 75 55 70 64 61 74 65 54 65 6d 70 53 69 7a 65  buUpdateTempSize
1ff60 28 72 62 75 5f 66 69 6c 65 20 2a 70 46 64 2c 20  (rbu_file *pFd, 
1ff70 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 4e  sqlite3_int64 nN
1ff80 65 77 29 7b 0a 20 20 73 71 6c 69 74 65 33 72 62  ew){.  sqlite3rb
1ff90 75 20 2a 70 52 62 75 20 3d 20 70 46 64 2d 3e 70  u *pRbu = pFd->p
1ffa0 52 62 75 3b 0a 20 20 69 36 34 20 6e 44 69 66 66  Rbu;.  i64 nDiff
1ffb0 20 3d 20 6e 4e 65 77 20 2d 20 70 46 64 2d 3e 73   = nNew - pFd->s
1ffc0 7a 3b 0a 20 20 70 52 62 75 2d 3e 73 7a 54 65 6d  z;.  pRbu->szTem
1ffd0 70 20 2b 3d 20 6e 44 69 66 66 3b 0a 20 20 70 46  p += nDiff;.  pF
1ffe0 64 2d 3e 73 7a 20 3d 20 6e 4e 65 77 3b 0a 20 20  d->sz = nNew;.  
1fff0 61 73 73 65 72 74 28 20 70 52 62 75 2d 3e 73 7a  assert( pRbu->sz
20000 54 65 6d 70 3e 3d 30 20 29 3b 0a 20 20 69 66 28  Temp>=0 );.  if(
20010 20 70 52 62 75 2d 3e 73 7a 54 65 6d 70 4c 69 6d   pRbu->szTempLim
20020 69 74 20 26 26 20 70 52 62 75 2d 3e 73 7a 54 65  it && pRbu->szTe
20030 6d 70 3e 70 52 62 75 2d 3e 73 7a 54 65 6d 70 4c  mp>pRbu->szTempL
20040 69 6d 69 74 20 29 20 72 65 74 75 72 6e 20 53 51  imit ) return SQ
20050 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 72 65 74  LITE_FULL;.  ret
20060 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
20070 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e  ../*.** Close an
20080 20 72 62 75 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74   rbu file..*/.st
20090 61 74 69 63 20 69 6e 74 20 72 62 75 56 66 73 43  atic int rbuVfsC
200a0 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  lose(sqlite3_fil
200b0 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 72 62 75  e *pFile){.  rbu
200c0 5f 66 69 6c 65 20 2a 70 20 3d 20 28 72 62 75 5f  _file *p = (rbu_
200d0 66 69 6c 65 2a 29 70 46 69 6c 65 3b 0a 20 20 69  file*)pFile;.  i
200e0 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 3b 0a  nt rc;.  int i;.
200f0 0a 20 20 2f 2a 20 46 72 65 65 20 74 68 65 20 63  .  /* Free the c
20100 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 61  ontents of the a
20110 70 53 68 6d 5b 5d 20 61 72 72 61 79 2e 20 41 6e  pShm[] array. An
20120 64 20 74 68 65 20 61 72 72 61 79 20 69 74 73 65  d the array itse
20130 6c 66 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  lf. */.  for(i=0
20140 3b 20 69 3c 70 2d 3e 6e 53 68 6d 3b 20 69 2b 2b  ; i<p->nShm; i++
20150 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
20160 72 65 65 28 70 2d 3e 61 70 53 68 6d 5b 69 5d 29  ree(p->apShm[i])
20170 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
20180 66 72 65 65 28 70 2d 3e 61 70 53 68 6d 29 3b 0a  free(p->apShm);.
20190 20 20 70 2d 3e 61 70 53 68 6d 20 3d 20 30 3b 0a    p->apShm = 0;.
201a0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
201b0 2d 3e 7a 44 65 6c 29 3b 0a 0a 20 20 69 66 28 20  ->zDel);..  if( 
201c0 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20 53  p->openFlags & S
201d0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
201e0 44 42 20 29 7b 0a 20 20 20 20 72 62 75 5f 66 69  DB ){.    rbu_fi
201f0 6c 65 20 2a 2a 70 70 3b 0a 20 20 20 20 73 71 6c  le **pp;.    sql
20200 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
20210 28 70 2d 3e 70 52 62 75 56 66 73 2d 3e 6d 75 74  (p->pRbuVfs->mut
20220 65 78 29 3b 0a 20 20 20 20 66 6f 72 28 70 70 3d  ex);.    for(pp=
20230 26 70 2d 3e 70 52 62 75 56 66 73 2d 3e 70 4d 61  &p->pRbuVfs->pMa
20240 69 6e 3b 20 2a 70 70 21 3d 70 3b 20 70 70 3d 26  in; *pp!=p; pp=&
20250 28 28 2a 70 70 29 2d 3e 70 4d 61 69 6e 4e 65 78  ((*pp)->pMainNex
20260 74 29 29 3b 0a 20 20 20 20 2a 70 70 20 3d 20 70  t));.    *pp = p
20270 2d 3e 70 4d 61 69 6e 4e 65 78 74 3b 0a 20 20 20  ->pMainNext;.   
20280 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
20290 65 61 76 65 28 70 2d 3e 70 52 62 75 56 66 73 2d  eave(p->pRbuVfs-
202a0 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 72 62 75  >mutex);.    rbu
202b0 55 6e 6c 6f 63 6b 53 68 6d 28 70 29 3b 0a 20 20  UnlockShm(p);.  
202c0 20 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74    p->pReal->pMet
202d0 68 6f 64 73 2d 3e 78 53 68 6d 55 6e 6d 61 70 28  hods->xShmUnmap(
202e0 70 2d 3e 70 52 65 61 6c 2c 20 30 29 3b 0a 20 20  p->pReal, 0);.  
202f0 7d 0a 20 20 65 6c 73 65 20 69 66 28 20 28 70 2d  }.  else if( (p-
20300 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20 53 51 4c  >openFlags & SQL
20310 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f  ITE_OPEN_DELETEO
20320 4e 43 4c 4f 53 45 29 20 26 26 20 70 2d 3e 70 52  NCLOSE) && p->pR
20330 62 75 20 29 7b 0a 20 20 20 20 72 62 75 55 70 64  bu ){.    rbuUpd
20340 61 74 65 54 65 6d 70 53 69 7a 65 28 70 2c 20 30  ateTempSize(p, 0
20350 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 6f  );.  }..  /* Clo
20360 73 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  se the underlyin
20370 67 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 2a 2f  g file handle */
20380 0a 20 20 72 63 20 3d 20 70 2d 3e 70 52 65 61 6c  .  rc = p->pReal
20390 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 43 6c 6f  ->pMethods->xClo
203a0 73 65 28 70 2d 3e 70 52 65 61 6c 29 3b 0a 20 20  se(p->pReal);.  
203b0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
203c0 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 64 20 72 65  *.** Read and re
203d0 74 75 72 6e 20 61 6e 20 75 6e 73 69 67 6e 65 64  turn an unsigned
203e0 20 33 32 2d 62 69 74 20 62 69 67 2d 65 6e 64 69   32-bit big-endi
203f0 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f 6d 20  an integer from 
20400 74 68 65 20 62 75 66 66 65 72 20 0a 2a 2a 20 70  the buffer .** p
20410 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c  assed as the onl
20420 79 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73  y argument..*/.s
20430 74 61 74 69 63 20 75 33 32 20 72 62 75 47 65 74  tatic u32 rbuGet
20440 55 33 32 28 75 38 20 2a 61 42 75 66 29 7b 0a 20  U32(u8 *aBuf){. 
20450 20 72 65 74 75 72 6e 20 28 28 75 33 32 29 61 42   return ((u32)aB
20460 75 66 5b 30 5d 20 3c 3c 20 32 34 29 0a 20 20 20  uf[0] << 24).   
20470 20 20 20 20 2b 20 28 28 75 33 32 29 61 42 75 66      + ((u32)aBuf
20480 5b 31 5d 20 3c 3c 20 31 36 29 0a 20 20 20 20 20  [1] << 16).     
20490 20 20 2b 20 28 28 75 33 32 29 61 42 75 66 5b 32    + ((u32)aBuf[2
204a0 5d 20 3c 3c 20 20 38 29 0a 20 20 20 20 20 20 20  ] <<  8).       
204b0 2b 20 28 28 75 33 32 29 61 42 75 66 5b 33 5d 29  + ((u32)aBuf[3])
204c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
204d0 20 61 6e 20 75 6e 73 69 67 6e 65 64 20 33 32 2d   an unsigned 32-
204e0 62 69 74 20 76 61 6c 75 65 20 69 6e 20 62 69 67  bit value in big
204f0 2d 65 6e 64 69 61 6e 20 66 6f 72 6d 61 74 20 74  -endian format t
20500 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64 0a 2a  o the supplied.*
20510 2a 20 62 75 66 66 65 72 2e 0a 2a 2f 0a 73 74 61  * buffer..*/.sta
20520 74 69 63 20 76 6f 69 64 20 72 62 75 50 75 74 55  tic void rbuPutU
20530 33 32 28 75 38 20 2a 61 42 75 66 2c 20 75 33 32  32(u8 *aBuf, u32
20540 20 69 56 61 6c 29 7b 0a 20 20 61 42 75 66 5b 30   iVal){.  aBuf[0
20550 5d 20 3d 20 28 69 56 61 6c 20 3e 3e 20 32 34 29  ] = (iVal >> 24)
20560 20 26 20 30 78 46 46 3b 0a 20 20 61 42 75 66 5b   & 0xFF;.  aBuf[
20570 31 5d 20 3d 20 28 69 56 61 6c 20 3e 3e 20 31 36  1] = (iVal >> 16
20580 29 20 26 20 30 78 46 46 3b 0a 20 20 61 42 75 66  ) & 0xFF;.  aBuf
20590 5b 32 5d 20 3d 20 28 69 56 61 6c 20 3e 3e 20 20  [2] = (iVal >>  
205a0 38 29 20 26 20 30 78 46 46 3b 0a 20 20 61 42 75  8) & 0xFF;.  aBu
205b0 66 5b 33 5d 20 3d 20 28 69 56 61 6c 20 3e 3e 20  f[3] = (iVal >> 
205c0 20 30 29 20 26 20 30 78 46 46 3b 0a 7d 0a 0a 73   0) & 0xFF;.}..s
205d0 74 61 74 69 63 20 76 6f 69 64 20 72 62 75 50 75  tatic void rbuPu
205e0 74 55 31 36 28 75 38 20 2a 61 42 75 66 2c 20 75  tU16(u8 *aBuf, u
205f0 31 36 20 69 56 61 6c 29 7b 0a 20 20 61 42 75 66  16 iVal){.  aBuf
20600 5b 30 5d 20 3d 20 28 69 56 61 6c 20 3e 3e 20 20  [0] = (iVal >>  
20610 38 29 20 26 20 30 78 46 46 3b 0a 20 20 61 42 75  8) & 0xFF;.  aBu
20620 66 5b 31 5d 20 3d 20 28 69 56 61 6c 20 3e 3e 20  f[1] = (iVal >> 
20630 20 30 29 20 26 20 30 78 46 46 3b 0a 7d 0a 0a 2f   0) & 0xFF;.}../
20640 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66  *.** Read data f
20650 72 6f 6d 20 61 6e 20 72 62 75 56 66 73 2d 66 69  rom an rbuVfs-fi
20660 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
20670 74 20 72 62 75 56 66 73 52 65 61 64 28 0a 20 20  t rbuVfsRead(.  
20680 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
20690 69 6c 65 2c 20 0a 20 20 76 6f 69 64 20 2a 7a 42  ile, .  void *zB
206a0 75 66 2c 20 0a 20 20 69 6e 74 20 69 41 6d 74 2c  uf, .  int iAmt,
206b0 20 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34   .  sqlite_int64
206c0 20 69 4f 66 73 74 0a 29 7b 0a 20 20 72 62 75 5f   iOfst.){.  rbu_
206d0 66 69 6c 65 20 2a 70 20 3d 20 28 72 62 75 5f 66  file *p = (rbu_f
206e0 69 6c 65 2a 29 70 46 69 6c 65 3b 0a 20 20 73 71  ile*)pFile;.  sq
206f0 6c 69 74 65 33 72 62 75 20 2a 70 52 62 75 20 3d  lite3rbu *pRbu =
20700 20 70 2d 3e 70 52 62 75 3b 0a 20 20 69 6e 74 20   p->pRbu;.  int 
20710 72 63 3b 0a 0a 20 20 69 66 28 20 70 52 62 75 20  rc;..  if( pRbu 
20720 26 26 20 70 52 62 75 2d 3e 65 53 74 61 67 65 3d  && pRbu->eStage=
20730 3d 52 42 55 5f 53 54 41 47 45 5f 43 41 50 54 55  =RBU_STAGE_CAPTU
20740 52 45 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  RE ){.    assert
20750 28 20 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26  ( p->openFlags &
20760 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c   SQLITE_OPEN_WAL
20770 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 72 62 75   );.    rc = rbu
20780 43 61 70 74 75 72 65 57 61 6c 52 65 61 64 28 70  CaptureWalRead(p
20790 2d 3e 70 52 62 75 2c 20 69 4f 66 73 74 2c 20 69  ->pRbu, iOfst, i
207a0 41 6d 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Amt);.  }else{. 
207b0 20 20 20 69 66 28 20 70 52 62 75 20 26 26 20 70     if( pRbu && p
207c0 52 62 75 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55  Rbu->eStage==RBU
207d0 5f 53 54 41 47 45 5f 4f 41 4c 20 0a 20 20 20 20  _STAGE_OAL .    
207e0 20 26 26 20 28 70 2d 3e 6f 70 65 6e 46 6c 61 67   && (p->openFlag
207f0 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
20800 57 41 4c 29 20 0a 20 20 20 20 20 26 26 20 69 4f  WAL) .     && iO
20810 66 73 74 3e 3d 70 52 62 75 2d 3e 69 4f 61 6c 53  fst>=pRbu->iOalS
20820 7a 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  z .    ){.      
20830 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
20840 20 20 20 20 20 20 6d 65 6d 73 65 74 28 7a 42 75        memset(zBu
20850 66 2c 20 30 2c 20 69 41 6d 74 29 3b 0a 20 20 20  f, 0, iAmt);.   
20860 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
20870 20 3d 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65   = p->pReal->pMe
20880 74 68 6f 64 73 2d 3e 78 52 65 61 64 28 70 2d 3e  thods->xRead(p->
20890 70 52 65 61 6c 2c 20 7a 42 75 66 2c 20 69 41 6d  pReal, zBuf, iAm
208a0 74 2c 20 69 4f 66 73 74 29 3b 0a 23 69 66 20 31  t, iOfst);.#if 1
208b0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69  .      /* If thi
208c0 73 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65  s is being calle
208d0 64 20 74 6f 20 72 65 61 64 20 74 68 65 20 66 69  d to read the fi
208e0 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  rst page of the 
208f0 74 61 72 67 65 74 20 0a 20 20 20 20 20 20 2a 2a  target .      **
20900 20 64 61 74 61 62 61 73 65 20 61 73 20 70 61 72   database as par
20910 74 20 6f 66 20 61 6e 20 72 62 75 20 76 61 63 75  t of an rbu vacu
20920 75 6d 20 6f 70 65 72 61 74 69 6f 6e 2c 20 73 79  um operation, sy
20930 6e 74 68 65 73 69 7a 65 20 74 68 65 20 0a 20 20  nthesize the .  
20940 20 20 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 73 20      ** contents 
20950 6f 66 20 74 68 65 20 66 69 72 73 74 20 70 61 67  of the first pag
20960 65 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74  e if it does not
20970 20 79 65 74 20 65 78 69 73 74 2e 20 4f 74 68 65   yet exist. Othe
20980 72 77 69 73 65 2c 0a 20 20 20 20 20 20 2a 2a 20  rwise,.      ** 
20990 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e 6f 74 20  SQLite will not 
209a0 63 68 65 63 6b 20 66 6f 72 20 61 20 2a 2d 77 61  check for a *-wa
209b0 6c 20 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 20 20  l file.  */.    
209c0 20 20 69 66 28 20 70 52 62 75 20 26 26 20 72 62    if( pRbu && rb
209d0 75 49 73 56 61 63 75 75 6d 28 70 52 62 75 29 20  uIsVacuum(pRbu) 
209e0 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 72 63  .          && rc
209f0 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  ==SQLITE_IOERR_S
20a00 48 4f 52 54 5f 52 45 41 44 20 26 26 20 69 4f 66  HORT_READ && iOf
20a10 73 74 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  st==0.          
20a20 26 26 20 28 70 2d 3e 6f 70 65 6e 46 6c 61 67 73  && (p->openFlags
20a30 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d   & SQLITE_OPEN_M
20a40 41 49 4e 5f 44 42 29 0a 20 20 20 20 20 20 20 20  AIN_DB).        
20a50 20 20 26 26 20 70 52 62 75 2d 3e 72 63 3d 3d 53    && pRbu->rc==S
20a60 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20 29  QLITE_OK.      )
20a70 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
20a80 33 5f 66 69 6c 65 20 2a 70 46 64 20 3d 20 28 73  3_file *pFd = (s
20a90 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70 52 62  qlite3_file*)pRb
20aa0 75 2d 3e 70 52 62 75 46 64 3b 0a 20 20 20 20 20  u->pRbuFd;.     
20ab0 20 20 20 72 63 20 3d 20 70 46 64 2d 3e 70 4d 65     rc = pFd->pMe
20ac0 74 68 6f 64 73 2d 3e 78 52 65 61 64 28 70 46 64  thods->xRead(pFd
20ad0 2c 20 7a 42 75 66 2c 20 69 41 6d 74 2c 20 69 4f  , zBuf, iAmt, iO
20ae0 66 73 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66  fst);.        if
20af0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
20b00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 38 20  ){.          u8 
20b10 2a 61 42 75 66 20 3d 20 28 75 38 2a 29 7a 42 75  *aBuf = (u8*)zBu
20b20 66 3b 0a 20 20 20 20 20 20 20 20 20 20 75 33 32  f;.          u32
20b30 20 69 52 6f 6f 74 20 3d 20 72 62 75 47 65 74 55   iRoot = rbuGetU
20b40 33 32 28 26 61 42 75 66 5b 35 32 5d 29 20 3f 20  32(&aBuf[52]) ? 
20b50 31 20 3a 20 30 3b 0a 20 20 20 20 20 20 20 20 20  1 : 0;.         
20b60 20 72 62 75 50 75 74 55 33 32 28 26 61 42 75 66   rbuPutU32(&aBuf
20b70 5b 35 32 5d 2c 20 69 52 6f 6f 74 29 3b 20 20 20  [52], iRoot);   
20b80 20 20 20 2f 2a 20 6c 61 72 67 65 73 74 20 72 6f     /* largest ro
20b90 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a  ot page number *
20ba0 2f 0a 20 20 20 20 20 20 20 20 20 20 72 62 75 50  /.          rbuP
20bb0 75 74 55 33 32 28 26 61 42 75 66 5b 33 36 5d 2c  utU32(&aBuf[36],
20bc0 20 30 29 3b 20 20 20 20 20 20 20 20 20 20 2f 2a   0);          /*
20bd0 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 20   number of free 
20be0 70 61 67 65 73 20 2a 2f 0a 20 20 20 20 20 20 20  pages */.       
20bf0 20 20 20 72 62 75 50 75 74 55 33 32 28 26 61 42     rbuPutU32(&aB
20c00 75 66 5b 33 32 5d 2c 20 30 29 3b 20 20 20 20 20  uf[32], 0);     
20c10 20 20 20 20 20 2f 2a 20 66 69 72 73 74 20 70 61       /* first pa
20c20 67 65 20 6f 6e 20 66 72 65 65 20 6c 69 73 74 20  ge on free list 
20c30 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 20  trunk */.       
20c40 20 20 20 72 62 75 50 75 74 55 33 32 28 26 61 42     rbuPutU32(&aB
20c50 75 66 5b 32 38 5d 2c 20 31 29 3b 20 20 20 20 20  uf[28], 1);     
20c60 20 20 20 20 20 2f 2a 20 73 69 7a 65 20 6f 66 20       /* size of 
20c70 64 62 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73  db file in pages
20c80 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 62   */.          rb
20c90 75 50 75 74 55 33 32 28 26 61 42 75 66 5b 32 34  uPutU32(&aBuf[24
20ca0 5d 2c 20 70 52 62 75 2d 3e 70 52 62 75 46 64 2d  ], pRbu->pRbuFd-
20cb0 3e 69 43 6f 6f 6b 69 65 2b 31 29 3b 20 20 2f 2a  >iCookie+1);  /*
20cc0 20 43 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20   Change counter 
20cd0 2a 2f 0a 0a 20 20 20 20 20 20 20 20 20 20 69 66  */..          if
20ce0 28 20 69 41 6d 74 3e 31 30 30 20 29 7b 0a 20 20  ( iAmt>100 ){.  
20cf0 20 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74            memset
20d00 28 26 61 42 75 66 5b 31 30 30 5d 2c 20 30 2c 20  (&aBuf[100], 0, 
20d10 69 41 6d 74 2d 31 30 30 29 3b 0a 20 20 20 20 20  iAmt-100);.     
20d20 20 20 20 20 20 20 20 72 62 75 50 75 74 55 31 36         rbuPutU16
20d30 28 26 61 42 75 66 5b 31 30 35 5d 2c 20 69 41 6d  (&aBuf[105], iAm
20d40 74 20 26 20 30 78 46 46 46 46 29 3b 0a 20 20 20  t & 0xFFFF);.   
20d50 20 20 20 20 20 20 20 20 20 61 42 75 66 5b 31 30           aBuf[10
20d60 30 5d 20 3d 20 30 78 30 44 3b 0a 20 20 20 20 20  0] = 0x0D;.     
20d70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
20d80 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
20d90 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
20da0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
20db0 4f 66 73 74 3d 3d 30 20 26 26 20 28 70 2d 3e 6f  Ofst==0 && (p->o
20dc0 70 65 6e 46 6c 61 67 73 20 26 20 53 51 4c 49 54  penFlags & SQLIT
20dd0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 20  E_OPEN_MAIN_DB) 
20de0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 73  ){.      /* Thes
20df0 65 20 6c 6f 6f 6b 20 6c 69 6b 65 20 6d 61 67 69  e look like magi
20e00 63 20 6e 75 6d 62 65 72 73 2e 20 42 75 74 20 74  c numbers. But t
20e10 68 65 79 20 61 72 65 20 73 74 61 62 6c 65 2c 20  hey are stable, 
20e20 61 73 20 74 68 65 79 20 61 72 65 20 70 61 72 74  as they are part
20e30 0a 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68  .       ** of th
20e40 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66 20  e definition of 
20e50 74 68 65 20 53 51 4c 69 74 65 20 66 69 6c 65 20  the SQLite file 
20e60 66 6f 72 6d 61 74 2c 20 77 68 69 63 68 20 6d 61  format, which ma
20e70 79 20 6e 6f 74 20 63 68 61 6e 67 65 2e 20 2a 2f  y not change. */
20e80 0a 20 20 20 20 20 20 75 38 20 2a 70 42 75 66 20  .      u8 *pBuf 
20e90 3d 20 28 75 38 2a 29 7a 42 75 66 3b 0a 20 20 20  = (u8*)zBuf;.   
20ea0 20 20 20 70 2d 3e 69 43 6f 6f 6b 69 65 20 3d 20     p->iCookie = 
20eb0 72 62 75 47 65 74 55 33 32 28 26 70 42 75 66 5b  rbuGetU32(&pBuf[
20ec0 32 34 5d 29 3b 0a 20 20 20 20 20 20 70 2d 3e 69  24]);.      p->i
20ed0 57 72 69 74 65 56 65 72 20 3d 20 70 42 75 66 5b  WriteVer = pBuf[
20ee0 31 39 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  19];.    }.  }. 
20ef0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
20f00 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61 74 61 20  *.** Write data 
20f10 74 6f 20 61 6e 20 72 62 75 56 66 73 2d 66 69 6c  to an rbuVfs-fil
20f20 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
20f30 20 72 62 75 56 66 73 57 72 69 74 65 28 0a 20 20   rbuVfsWrite(.  
20f40 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
20f50 69 6c 65 2c 20 0a 20 20 63 6f 6e 73 74 20 76 6f  ile, .  const vo
20f60 69 64 20 2a 7a 42 75 66 2c 20 0a 20 20 69 6e 74  id *zBuf, .  int
20f70 20 69 41 6d 74 2c 20 0a 20 20 73 71 6c 69 74 65   iAmt, .  sqlite
20f80 5f 69 6e 74 36 34 20 69 4f 66 73 74 0a 29 7b 0a  _int64 iOfst.){.
20f90 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 20 3d 20    rbu_file *p = 
20fa0 28 72 62 75 5f 66 69 6c 65 2a 29 70 46 69 6c 65  (rbu_file*)pFile
20fb0 3b 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20 2a  ;.  sqlite3rbu *
20fc0 70 52 62 75 20 3d 20 70 2d 3e 70 52 62 75 3b 0a  pRbu = p->pRbu;.
20fd0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
20fe0 20 70 52 62 75 20 26 26 20 70 52 62 75 2d 3e 65   pRbu && pRbu->e
20ff0 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45  Stage==RBU_STAGE
21000 5f 43 41 50 54 55 52 45 20 29 7b 0a 20 20 20 20  _CAPTURE ){.    
21010 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 65 6e 46  assert( p->openF
21020 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
21030 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 3b 0a 20 20  EN_MAIN_DB );.  
21040 20 20 72 63 20 3d 20 72 62 75 43 61 70 74 75 72    rc = rbuCaptur
21050 65 44 62 57 72 69 74 65 28 70 2d 3e 70 52 62 75  eDbWrite(p->pRbu
21060 2c 20 69 4f 66 73 74 29 3b 0a 20 20 7d 65 6c 73  , iOfst);.  }els
21070 65 7b 0a 20 20 20 20 69 66 28 20 70 52 62 75 20  e{.    if( pRbu 
21080 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 52 62  ){.      if( pRb
21090 75 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53  u->eStage==RBU_S
210a0 54 41 47 45 5f 4f 41 4c 20 0a 20 20 20 20 20 20  TAGE_OAL .      
210b0 20 26 26 20 28 70 2d 3e 6f 70 65 6e 46 6c 61 67   && (p->openFlag
210c0 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
210d0 57 41 4c 29 20 0a 20 20 20 20 20 20 20 26 26 20  WAL) .       && 
210e0 69 4f 66 73 74 3e 3d 70 52 62 75 2d 3e 69 4f 61  iOfst>=pRbu->iOa
210f0 6c 53 7a 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  lSz.      ){.   
21100 20 20 20 20 20 70 52 62 75 2d 3e 69 4f 61 6c 53       pRbu->iOalS
21110 7a 20 3d 20 69 41 6d 74 20 2b 20 69 4f 66 73 74  z = iAmt + iOfst
21120 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
21130 28 20 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26  ( p->openFlags &
21140 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c   SQLITE_OPEN_DEL
21150 45 54 45 4f 4e 43 4c 4f 53 45 20 29 7b 0a 20 20  ETEONCLOSE ){.  
21160 20 20 20 20 20 20 69 36 34 20 73 7a 4e 65 77 20        i64 szNew 
21170 3d 20 69 41 6d 74 2b 69 4f 66 73 74 3b 0a 20 20  = iAmt+iOfst;.  
21180 20 20 20 20 20 20 69 66 28 20 73 7a 4e 65 77 3e        if( szNew>
21190 70 2d 3e 73 7a 20 29 7b 0a 20 20 20 20 20 20 20  p->sz ){.       
211a0 20 20 20 72 63 20 3d 20 72 62 75 55 70 64 61 74     rc = rbuUpdat
211b0 65 54 65 6d 70 53 69 7a 65 28 70 2c 20 73 7a 4e  eTempSize(p, szN
211c0 65 77 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ew);.          i
211d0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
211e0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
211f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
21200 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 70      }.    rc = p
21210 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64  ->pReal->pMethod
21220 73 2d 3e 78 57 72 69 74 65 28 70 2d 3e 70 52 65  s->xWrite(p->pRe
21230 61 6c 2c 20 7a 42 75 66 2c 20 69 41 6d 74 2c 20  al, zBuf, iAmt, 
21240 69 4f 66 73 74 29 3b 0a 20 20 20 20 69 66 28 20  iOfst);.    if( 
21250 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
21260 20 69 4f 66 73 74 3d 3d 30 20 26 26 20 28 70 2d   iOfst==0 && (p-
21270 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20 53 51 4c  >openFlags & SQL
21280 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
21290 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  ) ){.      /* Th
212a0 65 73 65 20 6c 6f 6f 6b 20 6c 69 6b 65 20 6d 61  ese look like ma
212b0 67 69 63 20 6e 75 6d 62 65 72 73 2e 20 42 75 74  gic numbers. But
212c0 20 74 68 65 79 20 61 72 65 20 73 74 61 62 6c 65   they are stable
212d0 2c 20 61 73 20 74 68 65 79 20 61 72 65 20 70 61  , as they are pa
212e0 72 74 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74  rt.      ** of t
212f0 68 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66  he definition of
21300 20 74 68 65 20 53 51 4c 69 74 65 20 66 69 6c 65   the SQLite file
21310 20 66 6f 72 6d 61 74 2c 20 77 68 69 63 68 20 6d   format, which m
21320 61 79 20 6e 6f 74 20 63 68 61 6e 67 65 2e 20 2a  ay not change. *
21330 2f 0a 20 20 20 20 20 20 75 38 20 2a 70 42 75 66  /.      u8 *pBuf
21340 20 3d 20 28 75 38 2a 29 7a 42 75 66 3b 0a 20 20   = (u8*)zBuf;.  
21350 20 20 20 20 70 2d 3e 69 43 6f 6f 6b 69 65 20 3d      p->iCookie =
21360 20 72 62 75 47 65 74 55 33 32 28 26 70 42 75 66   rbuGetU32(&pBuf
21370 5b 32 34 5d 29 3b 0a 20 20 20 20 20 20 70 2d 3e  [24]);.      p->
21380 69 57 72 69 74 65 56 65 72 20 3d 20 70 42 75 66  iWriteVer = pBuf
21390 5b 31 39 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  [19];.    }.  }.
213a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
213b0 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 61  /*.** Truncate a
213c0 6e 20 72 62 75 56 66 73 2d 66 69 6c 65 2e 0a 2a  n rbuVfs-file..*
213d0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62 75  /.static int rbu
213e0 56 66 73 54 72 75 6e 63 61 74 65 28 73 71 6c 69  VfsTruncate(sqli
213f0 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c  te3_file *pFile,
21400 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 73 69   sqlite_int64 si
21410 7a 65 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20  ze){.  rbu_file 
21420 2a 70 20 3d 20 28 72 62 75 5f 66 69 6c 65 2a 29  *p = (rbu_file*)
21430 70 46 69 6c 65 3b 0a 20 20 69 66 28 20 28 70 2d  pFile;.  if( (p-
21440 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20 53 51 4c  >openFlags & SQL
21450 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f  ITE_OPEN_DELETEO
21460 4e 43 4c 4f 53 45 29 20 26 26 20 70 2d 3e 70 52  NCLOSE) && p->pR
21470 62 75 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  bu ){.    int rc
21480 20 3d 20 72 62 75 55 70 64 61 74 65 54 65 6d 70   = rbuUpdateTemp
21490 53 69 7a 65 28 70 2c 20 73 69 7a 65 29 3b 0a 20  Size(p, size);. 
214a0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
214b0 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
214c0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
214d0 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64  ->pReal->pMethod
214e0 73 2d 3e 78 54 72 75 6e 63 61 74 65 28 70 2d 3e  s->xTruncate(p->
214f0 70 52 65 61 6c 2c 20 73 69 7a 65 29 3b 0a 7d 0a  pReal, size);.}.
21500 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 61 6e 20 72  ./*.** Sync an r
21510 62 75 56 66 73 2d 66 69 6c 65 2e 0a 2a 2f 0a 73  buVfs-file..*/.s
21520 74 61 74 69 63 20 69 6e 74 20 72 62 75 56 66 73  tatic int rbuVfs
21530 53 79 6e 63 28 73 71 6c 69 74 65 33 5f 66 69 6c  Sync(sqlite3_fil
21540 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20 66 6c  e *pFile, int fl
21550 61 67 73 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65  ags){.  rbu_file
21560 20 2a 70 20 3d 20 28 72 62 75 5f 66 69 6c 65 20   *p = (rbu_file 
21570 2a 29 70 46 69 6c 65 3b 0a 20 20 69 66 28 20 70  *)pFile;.  if( p
21580 2d 3e 70 52 62 75 20 26 26 20 70 2d 3e 70 52 62  ->pRbu && p->pRb
21590 75 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53  u->eStage==RBU_S
215a0 54 41 47 45 5f 43 41 50 54 55 52 45 20 29 7b 0a  TAGE_CAPTURE ){.
215b0 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 65 6e 46      if( p->openF
215c0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
215d0 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 7b 0a 20 20  EN_MAIN_DB ){.  
215e0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
215f0 45 5f 49 4e 54 45 52 4e 41 4c 3b 0a 20 20 20 20  E_INTERNAL;.    
21600 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  }.    return SQL
21610 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65  ITE_OK;.  }.  re
21620 74 75 72 6e 20 70 2d 3e 70 52 65 61 6c 2d 3e 70  turn p->pReal->p
21630 4d 65 74 68 6f 64 73 2d 3e 78 53 79 6e 63 28 70  Methods->xSync(p
21640 2d 3e 70 52 65 61 6c 2c 20 66 6c 61 67 73 29 3b  ->pReal, flags);
21650 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
21660 20 74 68 65 20 63 75 72 72 65 6e 74 20 66 69 6c   the current fil
21670 65 2d 73 69 7a 65 20 6f 66 20 61 6e 20 72 62 75  e-size of an rbu
21680 56 66 73 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  Vfs-file..*/.sta
21690 74 69 63 20 69 6e 74 20 72 62 75 56 66 73 46 69  tic int rbuVfsFi
216a0 6c 65 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66  leSize(sqlite3_f
216b0 69 6c 65 20 2a 70 46 69 6c 65 2c 20 73 71 6c 69  ile *pFile, sqli
216c0 74 65 5f 69 6e 74 36 34 20 2a 70 53 69 7a 65 29  te_int64 *pSize)
216d0 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 20  {.  rbu_file *p 
216e0 3d 20 28 72 62 75 5f 66 69 6c 65 20 2a 29 70 46  = (rbu_file *)pF
216f0 69 6c 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ile;.  int rc;. 
21700 20 72 63 20 3d 20 70 2d 3e 70 52 65 61 6c 2d 3e   rc = p->pReal->
21710 70 4d 65 74 68 6f 64 73 2d 3e 78 46 69 6c 65 53  pMethods->xFileS
21720 69 7a 65 28 70 2d 3e 70 52 65 61 6c 2c 20 70 53  ize(p->pReal, pS
21730 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  ize);..  /* If t
21740 68 69 73 20 69 73 20 61 6e 20 52 42 55 20 76 61  his is an RBU va
21750 63 75 75 6d 20 6f 70 65 72 61 74 69 6f 6e 20 61  cuum operation a
21760 6e 64 20 74 68 69 73 20 69 73 20 74 68 65 20 74  nd this is the t
21770 61 72 67 65 74 20 64 61 74 61 62 61 73 65 2c 0a  arget database,.
21780 20 20 2a 2a 20 70 72 65 74 65 6e 64 20 74 68 61    ** pretend tha
21790 74 20 69 74 20 68 61 73 20 61 74 20 6c 65 61 73  t it has at leas
217a0 74 20 6f 6e 65 20 70 61 67 65 2e 20 4f 74 68 65  t one page. Othe
217b0 72 77 69 73 65 2c 20 53 51 4c 69 74 65 20 77 69  rwise, SQLite wi
217c0 6c 6c 20 6e 6f 74 0a 20 20 2a 2a 20 63 68 65 63  ll not.  ** chec
217d0 6b 20 66 6f 72 20 74 68 65 20 65 78 69 73 74 61  k for the exista
217e0 6e 63 65 20 6f 66 20 61 20 2a 2d 77 61 6c 20 66  nce of a *-wal f
217f0 69 6c 65 2e 20 72 62 75 56 66 73 52 65 61 64 28  ile. rbuVfsRead(
21800 29 20 63 6f 6e 74 61 69 6e 73 20 0a 20 20 2a 2a  ) contains .  **
21810 20 73 69 6d 69 6c 61 72 20 6c 6f 67 69 63 2e 20   similar logic. 
21820 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
21830 4c 49 54 45 5f 4f 4b 20 26 26 20 2a 70 53 69 7a  LITE_OK && *pSiz
21840 65 3d 3d 30 20 0a 20 20 20 26 26 20 70 2d 3e 70  e==0 .   && p->p
21850 52 62 75 20 26 26 20 72 62 75 49 73 56 61 63 75  Rbu && rbuIsVacu
21860 75 6d 28 70 2d 3e 70 52 62 75 29 20 0a 20 20 20  um(p->pRbu) .   
21870 26 26 20 28 70 2d 3e 6f 70 65 6e 46 6c 61 67 73  && (p->openFlags
21880 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d   & SQLITE_OPEN_M
21890 41 49 4e 5f 44 42 29 0a 20 20 29 7b 0a 20 20 20  AIN_DB).  ){.   
218a0 20 2a 70 53 69 7a 65 20 3d 20 31 30 32 34 3b 0a   *pSize = 1024;.
218b0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
218c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 61  .}../*.** Lock a
218d0 6e 20 72 62 75 56 66 73 2d 66 69 6c 65 2e 0a 2a  n rbuVfs-file..*
218e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62 75  /.static int rbu
218f0 56 66 73 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  VfsLock(sqlite3_
21900 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74  file *pFile, int
21910 20 65 4c 6f 63 6b 29 7b 0a 20 20 72 62 75 5f 66   eLock){.  rbu_f
21920 69 6c 65 20 2a 70 20 3d 20 28 72 62 75 5f 66 69  ile *p = (rbu_fi
21930 6c 65 2a 29 70 46 69 6c 65 3b 0a 20 20 73 71 6c  le*)pFile;.  sql
21940 69 74 65 33 72 62 75 20 2a 70 52 62 75 20 3d 20  ite3rbu *pRbu = 
21950 70 2d 3e 70 52 62 75 3b 0a 20 20 69 6e 74 20 72  p->pRbu;.  int r
21960 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
21970 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 65    assert( p->ope
21980 6e 46 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45  nFlags & (SQLITE
21990 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 7c 53 51  _OPEN_MAIN_DB|SQ
219a0 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44  LITE_OPEN_TEMP_D
219b0 42 29 20 29 3b 0a 20 20 69 66 28 20 65 4c 6f 63  B) );.  if( eLoc
219c0 6b 3d 3d 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 45  k==SQLITE_LOCK_E
219d0 58 43 4c 55 53 49 56 45 20 0a 20 20 20 26 26 20  XCLUSIVE .   && 
219e0 28 70 2d 3e 62 4e 6f 6c 6f 63 6b 20 7c 7c 20 28  (p->bNolock || (
219f0 70 52 62 75 20 26 26 20 70 52 62 75 2d 3e 65 53  pRbu && pRbu->eS
21a00 74 61 67 65 21 3d 52 42 55 5f 53 54 41 47 45 5f  tage!=RBU_STAGE_
21a10 44 4f 4e 45 29 29 0a 20 20 29 7b 0a 20 20 20 20  DONE)).  ){.    
21a20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20  /* Do not allow 
21a30 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 2e  EXCLUSIVE locks.
21a40 20 50 72 65 76 65 6e 74 69 6e 67 20 53 51 4c 69   Preventing SQLi
21a50 74 65 20 66 72 6f 6d 20 74 61 6b 69 6e 67 20 74  te from taking t
21a60 68 69 73 20 0a 20 20 20 20 2a 2a 20 70 72 65 76  his .    ** prev
21a70 65 6e 74 73 20 69 74 20 66 72 6f 6d 20 63 68 65  ents it from che
21a80 63 6b 70 6f 69 6e 74 69 6e 67 20 74 68 65 20 64  ckpointing the d
21a90 61 74 61 62 61 73 65 20 66 72 6f 6d 20 73 71 6c  atabase from sql
21aa0 69 74 65 33 5f 63 6c 6f 73 65 28 29 2e 20 2a 2f  ite3_close(). */
21ab0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
21ac0 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _BUSY;.  }else{.
21ad0 20 20 20 20 72 63 20 3d 20 70 2d 3e 70 52 65 61      rc = p->pRea
21ae0 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 4c 6f  l->pMethods->xLo
21af0 63 6b 28 70 2d 3e 70 52 65 61 6c 2c 20 65 4c 6f  ck(p->pReal, eLo
21b00 63 6b 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ck);.  }..  retu
21b10 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
21b20 55 6e 6c 6f 63 6b 20 61 6e 20 72 62 75 56 66 73  Unlock an rbuVfs
21b30 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  -file..*/.static
21b40 20 69 6e 74 20 72 62 75 56 66 73 55 6e 6c 6f 63   int rbuVfsUnloc
21b50 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
21b60 70 46 69 6c 65 2c 20 69 6e 74 20 65 4c 6f 63 6b  pFile, int eLock
21b70 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a 70  ){.  rbu_file *p
21b80 20 3d 20 28 72 62 75 5f 66 69 6c 65 20 2a 29 70   = (rbu_file *)p
21b90 46 69 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 70  File;.  return p
21ba0 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64  ->pReal->pMethod
21bb0 73 2d 3e 78 55 6e 6c 6f 63 6b 28 70 2d 3e 70 52  s->xUnlock(p->pR
21bc0 65 61 6c 2c 20 65 4c 6f 63 6b 29 3b 0a 7d 0a 0a  eal, eLock);.}..
21bd0 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 69 66 20 61  /*.** Check if a
21be0 6e 6f 74 68 65 72 20 66 69 6c 65 2d 68 61 6e 64  nother file-hand
21bf0 6c 65 20 68 6f 6c 64 73 20 61 20 52 45 53 45 52  le holds a RESER
21c00 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 61 6e 20 72  VED lock on an r
21c10 62 75 56 66 73 2d 66 69 6c 65 2e 0a 2a 2f 0a 73  buVfs-file..*/.s
21c20 74 61 74 69 63 20 69 6e 74 20 72 62 75 56 66 73  tatic int rbuVfs
21c30 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
21c40 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
21c50 70 46 69 6c 65 2c 20 69 6e 74 20 2a 70 52 65 73  pFile, int *pRes
21c60 4f 75 74 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65  Out){.  rbu_file
21c70 20 2a 70 20 3d 20 28 72 62 75 5f 66 69 6c 65 20   *p = (rbu_file 
21c80 2a 29 70 46 69 6c 65 3b 0a 20 20 72 65 74 75 72  *)pFile;.  retur
21c90 6e 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74  n p->pReal->pMet
21ca0 68 6f 64 73 2d 3e 78 43 68 65 63 6b 52 65 73 65  hods->xCheckRese
21cb0 72 76 65 64 4c 6f 63 6b 28 70 2d 3e 70 52 65 61  rvedLock(p->pRea
21cc0 6c 2c 20 70 52 65 73 4f 75 74 29 3b 0a 7d 0a 0a  l, pResOut);.}..
21cd0 2f 2a 0a 2a 2a 20 46 69 6c 65 20 63 6f 6e 74 72  /*.** File contr
21ce0 6f 6c 20 6d 65 74 68 6f 64 2e 20 46 6f 72 20 63  ol method. For c
21cf0 75 73 74 6f 6d 20 6f 70 65 72 61 74 69 6f 6e 73  ustom operations
21d00 20 6f 6e 20 61 6e 20 72 62 75 56 66 73 2d 66 69   on an rbuVfs-fi
21d10 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
21d20 74 20 72 62 75 56 66 73 46 69 6c 65 43 6f 6e 74  t rbuVfsFileCont
21d30 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  rol(sqlite3_file
21d40 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20 6f 70 2c   *pFile, int op,
21d50 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20   void *pArg){.  
21d60 72 62 75 5f 66 69 6c 65 20 2a 70 20 3d 20 28 72  rbu_file *p = (r
21d70 62 75 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65 3b  bu_file *)pFile;
21d80 0a 20 20 69 6e 74 20 28 2a 78 43 6f 6e 74 72 6f  .  int (*xContro
21d90 6c 29 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  l)(sqlite3_file*
21da0 2c 69 6e 74 2c 76 6f 69 64 2a 29 20 3d 20 70 2d  ,int,void*) = p-
21db0 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73  >pReal->pMethods
21dc0 2d 3e 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 3b 0a  ->xFileControl;.
21dd0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
21de0 65 72 74 28 20 70 2d 3e 6f 70 65 6e 46 6c 61 67  ert( p->openFlag
21df0 73 20 26 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e  s & (SQLITE_OPEN
21e00 5f 4d 41 49 4e 5f 44 42 7c 53 51 4c 49 54 45 5f  _MAIN_DB|SQLITE_
21e10 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 29 0a 20 20  OPEN_TEMP_DB).  
21e20 20 20 20 20 20 7c 7c 20 70 2d 3e 6f 70 65 6e 46       || p->openF
21e30 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f 4f  lags & (SQLITE_O
21e40 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42  PEN_TRANSIENT_DB
21e50 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d  |SQLITE_OPEN_TEM
21e60 50 5f 4a 4f 55 52 4e 41 4c 29 0a 20 20 29 3b 0a  P_JOURNAL).  );.
21e70 20 20 69 66 28 20 6f 70 3d 3d 53 51 4c 49 54 45    if( op==SQLITE
21e80 5f 46 43 4e 54 4c 5f 52 42 55 20 29 7b 0a 20 20  _FCNTL_RBU ){.  
21e90 20 20 73 71 6c 69 74 65 33 72 62 75 20 2a 70 52    sqlite3rbu *pR
21ea0 62 75 20 3d 20 28 73 71 6c 69 74 65 33 72 62 75  bu = (sqlite3rbu
21eb0 2a 29 70 41 72 67 3b 0a 0a 20 20 20 20 2f 2a 20  *)pArg;..    /* 
21ec0 46 69 72 73 74 20 74 72 79 20 74 6f 20 66 69 6e  First try to fin
21ed0 64 20 61 6e 6f 74 68 65 72 20 52 42 55 20 76 66  d another RBU vf
21ee0 73 20 6c 6f 77 65 72 20 64 6f 77 6e 20 69 6e 20  s lower down in 
21ef0 74 68 65 20 76 66 73 20 73 74 61 63 6b 2e 20 49  the vfs stack. I
21f00 66 0a 20 20 20 20 2a 2a 20 6f 6e 65 20 69 73 20  f.    ** one is 
21f10 66 6f 75 6e 64 2c 20 74 68 69 73 20 76 66 73 20  found, this vfs 
21f20 77 69 6c 6c 20 6f 70 65 72 61 74 65 20 69 6e 20  will operate in 
21f30 70 61 73 73 2d 74 68 72 6f 75 67 68 20 6d 6f 64  pass-through mod
21f40 65 2e 20 54 68 65 20 6c 6f 77 65 72 0a 20 20 20  e. The lower.   
21f50 20 2a 2a 20 6c 65 76 65 6c 20 76 66 73 20 77 69   ** level vfs wi
21f60 6c 6c 20 64 6f 20 74 68 65 20 73 70 65 63 69 61  ll do the specia
21f70 6c 20 52 42 55 20 68 61 6e 64 6c 69 6e 67 2e 20  l RBU handling. 
21f80 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 78 43 6f   */.    rc = xCo
21f90 6e 74 72 6f 6c 28 70 2d 3e 70 52 65 61 6c 2c 20  ntrol(p->pReal, 
21fa0 6f 70 2c 20 70 41 72 67 29 3b 0a 0a 20 20 20 20  op, pArg);..    
21fb0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  if( rc==SQLITE_N
21fc0 4f 54 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20  OTFOUND ){.     
21fd0 20 2f 2a 20 4e 6f 77 20 73 65 61 72 63 68 20 66   /* Now search f
21fe0 6f 72 20 61 20 7a 69 70 76 66 73 20 69 6e 73 74  or a zipvfs inst
21ff0 61 6e 63 65 20 6c 6f 77 65 72 20 64 6f 77 6e 20  ance lower down 
22000 69 6e 20 74 68 65 20 56 46 53 20 73 74 61 63 6b  in the VFS stack
22010 2e 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 6f 6e  . If.      ** on
22020 65 20 69 73 20 66 6f 75 6e 64 2c 20 74 68 69 73  e is found, this
22030 20 69 73 20 61 6e 20 65 72 72 6f 72 2e 20 20 2a   is an error.  *
22040 2f 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 64 75  /.      void *du
22050 6d 6d 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  mmy = 0;.      r
22060 63 20 3d 20 78 43 6f 6e 74 72 6f 6c 28 70 2d 3e  c = xControl(p->
22070 70 52 65 61 6c 2c 20 53 51 4c 49 54 45 5f 46 43  pReal, SQLITE_FC
22080 4e 54 4c 5f 5a 49 50 56 46 53 2c 20 26 64 75 6d  NTL_ZIPVFS, &dum
22090 6d 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  my);.      if( r
220a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
220b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
220c0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
220d0 20 20 20 70 52 62 75 2d 3e 7a 45 72 72 6d 73 67     pRbu->zErrmsg
220e0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
220f0 74 66 28 22 72 62 75 2f 7a 69 70 76 66 73 20 73  tf("rbu/zipvfs s
22100 65 74 75 70 20 65 72 72 6f 72 22 29 3b 0a 20 20  etup error");.  
22110 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63      }else if( rc
22120 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  ==SQLITE_NOTFOUN
22130 44 20 29 7b 0a 20 20 20 20 20 20 20 20 70 52 62  D ){.        pRb
22140 75 2d 3e 70 54 61 72 67 65 74 46 64 20 3d 20 70  u->pTargetFd = p
22150 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 52 62  ;.        p->pRb
22160 75 20 3d 20 70 52 62 75 3b 0a 20 20 20 20 20 20  u = pRbu;.      
22170 20 20 69 66 28 20 70 2d 3e 70 57 61 6c 46 64 20    if( p->pWalFd 
22180 29 20 70 2d 3e 70 57 61 6c 46 64 2d 3e 70 52 62  ) p->pWalFd->pRb
22190 75 20 3d 20 70 52 62 75 3b 0a 20 20 20 20 20 20  u = pRbu;.      
221a0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
221b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
221c0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
221d0 20 7d 0a 20 20 65 6c 73 65 20 69 66 28 20 6f 70   }.  else if( op
221e0 3d 3d 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 52  ==SQLITE_FCNTL_R
221f0 42 55 43 4e 54 20 29 7b 0a 20 20 20 20 73 71 6c  BUCNT ){.    sql
22200 69 74 65 33 72 62 75 20 2a 70 52 62 75 20 3d 20  ite3rbu *pRbu = 
22210 28 73 71 6c 69 74 65 33 72 62 75 2a 29 70 41 72  (sqlite3rbu*)pAr
22220 67 3b 0a 20 20 20 20 70 52 62 75 2d 3e 6e 52 62  g;.    pRbu->nRb
22230 75 2b 2b 3b 0a 20 20 20 20 70 52 62 75 2d 3e 70  u++;.    pRbu->p
22240 52 62 75 46 64 20 3d 20 70 3b 0a 20 20 20 20 70  RbuFd = p;.    p
22250 2d 3e 62 4e 6f 6c 6f 63 6b 20 3d 20 31 3b 0a 20  ->bNolock = 1;. 
22260 20 7d 0a 0a 20 20 72 63 20 3d 20 78 43 6f 6e 74   }..  rc = xCont
22270 72 6f 6c 28 70 2d 3e 70 52 65 61 6c 2c 20 6f 70  rol(p->pReal, op
22280 2c 20 70 41 72 67 29 3b 0a 20 20 69 66 28 20 72  , pArg);.  if( r
22290 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
222a0 6f 70 3d 3d 53 51 4c 49 54 45 5f 46 43 4e 54 4c  op==SQLITE_FCNTL
222b0 5f 56 46 53 4e 41 4d 45 20 29 7b 0a 20 20 20 20  _VFSNAME ){.    
222c0 72 62 75 5f 76 66 73 20 2a 70 52 62 75 56 66 73  rbu_vfs *pRbuVfs
222d0 20 3d 20 70 2d 3e 70 52 62 75 56 66 73 3b 0a 20   = p->pRbuVfs;. 
222e0 20 20 20 63 68 61 72 20 2a 7a 49 6e 20 3d 20 2a     char *zIn = *
222f0 28 63 68 61 72 2a 2a 29 70 41 72 67 3b 0a 20 20  (char**)pArg;.  
22300 20 20 63 68 61 72 20 2a 7a 4f 75 74 20 3d 20 73    char *zOut = s
22310 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
22320 72 62 75 28 25 73 29 2f 25 7a 22 2c 20 70 52 62  rbu(%s)/%z", pRb
22330 75 56 66 73 2d 3e 62 61 73 65 2e 7a 4e 61 6d 65  uVfs->base.zName
22340 2c 20 7a 49 6e 29 3b 0a 20 20 20 20 2a 28 63 68  , zIn);.    *(ch
22350 61 72 2a 2a 29 70 41 72 67 20 3d 20 7a 4f 75 74  ar**)pArg = zOut
22360 3b 0a 20 20 20 20 69 66 28 20 7a 4f 75 74 3d 3d  ;.    if( zOut==
22370 30 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  0 ) rc = SQLITE_
22380 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 72 65  NOMEM;.  }..  re
22390 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
223a0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 65 63  * Return the sec
223b0 74 6f 72 2d 73 69 7a 65 20 69 6e 20 62 79 74 65  tor-size in byte
223c0 73 20 66 6f 72 20 61 6e 20 72 62 75 56 66 73 2d  s for an rbuVfs-
223d0 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
223e0 69 6e 74 20 72 62 75 56 66 73 53 65 63 74 6f 72  int rbuVfsSector
223f0 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  Size(sqlite3_fil
22400 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 72 62 75  e *pFile){.  rbu
22410 5f 66 69 6c 65 20 2a 70 20 3d 20 28 72 62 75 5f  _file *p = (rbu_
22420 66 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20  file *)pFile;.  
22430 72 65 74 75 72 6e 20 70 2d 3e 70 52 65 61 6c 2d  return p->pReal-
22440 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53 65 63 74  >pMethods->xSect
22450 6f 72 53 69 7a 65 28 70 2d 3e 70 52 65 61 6c 29  orSize(p->pReal)
22460 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
22470 6e 20 74 68 65 20 64 65 76 69 63 65 20 63 68 61  n the device cha
22480 72 61 63 74 65 72 69 73 74 69 63 20 66 6c 61 67  racteristic flag
22490 73 20 73 75 70 70 6f 72 74 65 64 20 62 79 20 61  s supported by a
224a0 6e 20 72 62 75 56 66 73 2d 66 69 6c 65 2e 0a 2a  n rbuVfs-file..*
224b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62 75  /.static int rbu
224c0 56 66 73 44 65 76 69 63 65 43 68 61 72 61 63 74  VfsDeviceCharact
224d0 65 72 69 73 74 69 63 73 28 73 71 6c 69 74 65 33  eristics(sqlite3
224e0 5f 66 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  _file *pFile){. 
224f0 20 72 62 75 5f 66 69 6c 65 20 2a 70 20 3d 20 28   rbu_file *p = (
22500 72 62 75 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65  rbu_file *)pFile
22510 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 52  ;.  return p->pR
22520 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78  eal->pMethods->x
22530 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
22540 73 74 69 63 73 28 70 2d 3e 70 52 65 61 6c 29 3b  stics(p->pReal);
22550 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 61 6b 65 20 6f  .}../*.** Take o
22560 72 20 72 65 6c 65 61 73 65 20 61 20 73 68 61 72  r release a shar
22570 65 64 2d 6d 65 6d 6f 72 79 20 6c 6f 63 6b 2e 0a  ed-memory lock..
22580 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62  */.static int rb
22590 75 56 66 73 53 68 6d 4c 6f 63 6b 28 73 71 6c 69  uVfsShmLock(sqli
225a0 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c  te3_file *pFile,
225b0 20 69 6e 74 20 6f 66 73 74 2c 20 69 6e 74 20 6e   int ofst, int n
225c0 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
225d0 72 62 75 5f 66 69 6c 65 20 2a 70 20 3d 20 28 72  rbu_file *p = (r
225e0 62 75 5f 66 69 6c 65 2a 29 70 46 69 6c 65 3b 0a  bu_file*)pFile;.
225f0 20 20 73 71 6c 69 74 65 33 72 62 75 20 2a 70 52    sqlite3rbu *pR
22600 62 75 20 3d 20 70 2d 3e 70 52 62 75 3b 0a 20 20  bu = p->pRbu;.  
22610 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
22620 4f 4b 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  OK;..#ifdef SQLI
22630 54 45 5f 41 4d 41 4c 47 41 4d 41 54 49 4f 4e 0a  TE_AMALGAMATION.
22640 20 20 20 20 61 73 73 65 72 74 28 20 57 41 4c 5f      assert( WAL_
22650 43 4b 50 54 5f 4c 4f 43 4b 3d 3d 31 20 29 3b 0a  CKPT_LOCK==1 );.
22660 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
22670 28 20 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26  ( p->openFlags &
22680 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41   (SQLITE_OPEN_MA
22690 49 4e 5f 44 42 7c 53 51 4c 49 54 45 5f 4f 50 45  IN_DB|SQLITE_OPE
226a0 4e 5f 54 45 4d 50 5f 44 42 29 20 29 3b 0a 20 20  N_TEMP_DB) );.  
226b0 69 66 28 20 70 52 62 75 20 26 26 20 28 70 52 62  if( pRbu && (pRb
226c0 75 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53  u->eStage==RBU_S
226d0 54 41 47 45 5f 4f 41 4c 20 7c 7c 20 70 52 62 75  TAGE_OAL || pRbu
226e0 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54  ->eStage==RBU_ST
226f0 41 47 45 5f 4d 4f 56 45 29 20 29 7b 0a 20 20 20  AGE_MOVE) ){.   
22700 20 2f 2a 20 4d 61 67 69 63 20 6e 75 6d 62 65 72   /* Magic number
22710 20 31 20 69 73 20 74 68 65 20 57 41 4c 5f 43 4b   1 is the WAL_CK
22720 50 54 5f 4c 4f 43 4b 20 6c 6f 63 6b 2e 20 50 72  PT_LOCK lock. Pr
22730 65 76 65 6e 74 69 6e 67 20 53 51 4c 69 74 65 20  eventing SQLite 
22740 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 61 6b 69  from.    ** taki
22750 6e 67 20 74 68 69 73 20 6c 6f 63 6b 20 61 6c 73  ng this lock als
22760 6f 20 70 72 65 76 65 6e 74 73 20 61 6e 79 20 63  o prevents any c
22770 68 65 63 6b 70 6f 69 6e 74 73 20 66 72 6f 6d 20  heckpoints from 
22780 6f 63 63 75 72 72 69 6e 67 2e 20 0a 20 20 20 20  occurring. .    
22790 2a 2a 20 74 6f 64 6f 3a 20 72 65 61 6c 6c 79 2c  ** todo: really,
227a0 20 69 74 27 73 20 6e 6f 74 20 63 6c 65 61 72 20   it's not clear 
227b0 77 68 79 20 74 68 69 73 20 6d 69 67 68 74 20 6f  why this might o
227c0 63 63 75 72 2c 20 61 73 20 0a 20 20 20 20 2a 2a  ccur, as .    **
227d0 20 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f   wal_autocheckpo
227e0 69 6e 74 20 6f 75 67 68 74 20 74 6f 20 62 65 20  int ought to be 
227f0 74 75 72 6e 65 64 20 6f 66 66 2e 20 20 2a 2f 0a  turned off.  */.
22800 20 20 20 20 69 66 28 20 6f 66 73 74 3d 3d 57 41      if( ofst==WA
22810 4c 5f 4c 4f 43 4b 5f 43 4b 50 54 20 26 26 20 6e  L_LOCK_CKPT && n
22820 3d 3d 31 20 29 20 72 63 20 3d 20 53 51 4c 49 54  ==1 ) rc = SQLIT
22830 45 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b  E_BUSY;.  }else{
22840 0a 20 20 20 20 69 6e 74 20 62 43 61 70 74 75 72  .    int bCaptur
22850 65 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6e  e = 0;.    if( n
22860 3d 3d 31 20 26 26 20 28 66 6c 61 67 73 20 26 20  ==1 && (flags & 
22870 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55  SQLITE_SHM_EXCLU
22880 53 49 56 45 29 0a 20 20 20 20 20 26 26 20 70 52  SIVE).     && pR
22890 62 75 20 26 26 20 70 52 62 75 2d 3e 65 53 74 61  bu && pRbu->eSta
228a0 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 43 41  ge==RBU_STAGE_CA
228b0 50 54 55 52 45 0a 20 20 20 20 20 26 26 20 28 6f  PTURE.     && (o
228c0 66 73 74 3d 3d 57 41 4c 5f 4c 4f 43 4b 5f 57 52  fst==WAL_LOCK_WR
228d0 49 54 45 20 7c 7c 20 6f 66 73 74 3d 3d 57 41 4c  ITE || ofst==WAL
228e0 5f 4c 4f 43 4b 5f 43 4b 50 54 20 7c 7c 20 6f 66  _LOCK_CKPT || of
228f0 73 74 3d 3d 57 41 4c 5f 4c 4f 43 4b 5f 52 45 41  st==WAL_LOCK_REA
22900 44 30 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  D0).    ){.     
22910 20 62 43 61 70 74 75 72 65 20 3d 20 31 3b 0a 20   bCapture = 1;. 
22920 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 62 43     }..    if( bC
22930 61 70 74 75 72 65 3d 3d 30 20 7c 7c 20 30 3d 3d  apture==0 || 0==
22940 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
22950 53 48 4d 5f 55 4e 4c 4f 43 4b 29 20 29 7b 0a 20  SHM_UNLOCK) ){. 
22960 20 20 20 20 20 72 63 20 3d 20 70 2d 3e 70 52 65       rc = p->pRe
22970 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53  al->pMethods->xS
22980 68 6d 4c 6f 63 6b 28 70 2d 3e 70 52 65 61 6c 2c  hmLock(p->pReal,
22990 20 6f 66 73 74 2c 20 6e 2c 20 66 6c 61 67 73 29   ofst, n, flags)
229a0 3b 0a 20 20 20 20 20 20 69 66 28 20 62 43 61 70  ;.      if( bCap
229b0 74 75 72 65 20 26 26 20 72 63 3d 3d 53 51 4c 49  ture && rc==SQLI
229c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
229d0 20 70 52 62 75 2d 3e 6d 4c 6f 63 6b 20 7c 3d 20   pRbu->mLock |= 
229e0 28 31 20 3c 3c 20 6f 66 73 74 29 3b 0a 20 20 20  (1 << ofst);.   
229f0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
22a00 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
22a10 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 61 20 70  /*.** Obtain a p
22a20 6f 69 6e 74 65 72 20 74 6f 20 61 20 6d 61 70 70  ointer to a mapp
22a30 69 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  ing of a single 
22a40 33 32 4b 69 42 20 70 61 67 65 20 6f 66 20 74 68  32KiB page of th
22a50 65 20 2a 2d 73 68 6d 20 66 69 6c 65 2e 0a 2a 2f  e *-shm file..*/
22a60 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 56  .static int rbuV
22a70 66 73 53 68 6d 4d 61 70 28 0a 20 20 73 71 6c 69  fsShmMap(.  sqli
22a80 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c  te3_file *pFile,
22a90 20 0a 20 20 69 6e 74 20 69 52 65 67 69 6f 6e 2c   .  int iRegion,
22aa0 20 0a 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e   .  int szRegion
22ab0 2c 20 0a 20 20 69 6e 74 20 69 73 57 72 69 74 65  , .  int isWrite
22ac0 2c 20 0a 20 20 76 6f 69 64 20 76 6f 6c 61 74 69  , .  void volati
22ad0 6c 65 20 2a 2a 70 70 0a 29 7b 0a 20 20 72 62 75  le **pp.){.  rbu
22ae0 5f 66 69 6c 65 20 2a 70 20 3d 20 28 72 62 75 5f  _file *p = (rbu_
22af0 66 69 6c 65 2a 29 70 46 69 6c 65 3b 0a 20 20 69  file*)pFile;.  i
22b00 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
22b10 4b 3b 0a 20 20 69 6e 74 20 65 53 74 61 67 65 20  K;.  int eStage 
22b20 3d 20 28 70 2d 3e 70 52 62 75 20 3f 20 70 2d 3e  = (p->pRbu ? p->
22b30 70 52 62 75 2d 3e 65 53 74 61 67 65 20 3a 20 30  pRbu->eStage : 0
22b40 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 20  );..  /* If not 
22b50 69 6e 20 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c  in RBU_STAGE_OAL
22b60 2c 20 61 6c 6c 6f 77 20 74 68 69 73 20 63 61 6c  , allow this cal
22b70 6c 20 74 6f 20 70 61 73 73 20 74 68 72 6f 75 67  l to pass throug
22b80 68 2e 20 4f 72 2c 20 69 66 20 74 68 69 73 0a 20  h. Or, if this. 
22b90 20 2a 2a 20 72 62 75 20 69 73 20 69 6e 20 74 68   ** rbu is in th
22ba0 65 20 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20  e RBU_STAGE_OAL 
22bb0 73 74 61 74 65 2c 20 75 73 65 20 68 65 61 70 20  state, use heap 
22bc0 6d 65 6d 6f 72 79 20 66 6f 72 20 2a 2d 73 68 6d  memory for *-shm
22bd0 20 73 70 61 63 65 20 0a 20 20 2a 2a 20 69 6e 73   space .  ** ins
22be0 74 65 61 64 20 6f 66 20 61 20 66 69 6c 65 20 6f  tead of a file o
22bf0 6e 20 64 69 73 6b 2e 20 20 2a 2f 0a 20 20 61 73  n disk.  */.  as
22c00 73 65 72 74 28 20 70 2d 3e 6f 70 65 6e 46 6c 61  sert( p->openFla
22c10 67 73 20 26 20 28 53 51 4c 49 54 45 5f 4f 50 45  gs & (SQLITE_OPE
22c20 4e 5f 4d 41 49 4e 5f 44 42 7c 53 51 4c 49 54 45  N_MAIN_DB|SQLITE
22c30 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 29 20 29  _OPEN_TEMP_DB) )
22c40 3b 0a 20 20 69 66 28 20 65 53 74 61 67 65 3d 3d  ;.  if( eStage==
22c50 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20 7c 7c  RBU_STAGE_OAL ||
22c60 20 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41   eStage==RBU_STA
22c70 47 45 5f 4d 4f 56 45 20 29 7b 0a 20 20 20 20 69  GE_MOVE ){.    i
22c80 66 28 20 69 52 65 67 69 6f 6e 3c 3d 70 2d 3e 6e  f( iRegion<=p->n
22c90 53 68 6d 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  Shm ){.      int
22ca0 20 6e 42 79 74 65 20 3d 20 28 69 52 65 67 69 6f   nByte = (iRegio
22cb0 6e 2b 31 29 20 2a 20 73 69 7a 65 6f 66 28 63 68  n+1) * sizeof(ch
22cc0 61 72 2a 29 3b 0a 20 20 20 20 20 20 63 68 61 72  ar*);.      char
22cd0 20 2a 2a 61 70 4e 65 77 20 3d 20 28 63 68 61 72   **apNew = (char
22ce0 2a 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c  **)sqlite3_reall
22cf0 6f 63 36 34 28 70 2d 3e 61 70 53 68 6d 2c 20 6e  oc64(p->apShm, n
22d00 42 79 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Byte);.      if(
22d10 20 61 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20   apNew==0 ){.   
22d20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
22d30 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65  _NOMEM;.      }e
22d40 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  lse{.        mem
22d50 73 65 74 28 26 61 70 4e 65 77 5b 70 2d 3e 6e 53  set(&apNew[p->nS
22d60 68 6d 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 63  hm], 0, sizeof(c
22d70 68 61 72 2a 29 20 2a 20 28 31 20 2b 20 69 52 65  har*) * (1 + iRe
22d80 67 69 6f 6e 20 2d 20 70 2d 3e 6e 53 68 6d 29 29  gion - p->nShm))
22d90 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 70 53  ;.        p->apS
22da0 68 6d 20 3d 20 61 70 4e 65 77 3b 0a 20 20 20 20  hm = apNew;.    
22db0 20 20 20 20 70 2d 3e 6e 53 68 6d 20 3d 20 69 52      p->nShm = iR
22dc0 65 67 69 6f 6e 2b 31 3b 0a 20 20 20 20 20 20 7d  egion+1;.      }
22dd0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
22de0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
22df0 20 70 2d 3e 61 70 53 68 6d 5b 69 52 65 67 69 6f   p->apShm[iRegio
22e00 6e 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63  n]==0 ){.      c
22e10 68 61 72 20 2a 70 4e 65 77 20 3d 20 28 63 68 61  har *pNew = (cha
22e20 72 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  r*)sqlite3_mallo
22e30 63 36 34 28 73 7a 52 65 67 69 6f 6e 29 3b 0a 20  c64(szRegion);. 
22e40 20 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30       if( pNew==0
22e50 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
22e60 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
22e70 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
22e80 20 20 20 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c      memset(pNew,
22e90 20 30 2c 20 73 7a 52 65 67 69 6f 6e 29 3b 0a 20   0, szRegion);. 
22ea0 20 20 20 20 20 20 20 70 2d 3e 61 70 53 68 6d 5b         p->apShm[
22eb0 69 52 65 67 69 6f 6e 5d 20 3d 20 70 4e 65 77 3b  iRegion] = pNew;
22ec0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
22ed0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
22ee0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2a  TE_OK ){.      *
22ef0 70 70 20 3d 20 70 2d 3e 61 70 53 68 6d 5b 69 52  pp = p->apShm[iR
22f00 65 67 69 6f 6e 5d 3b 0a 20 20 20 20 7d 65 6c 73  egion];.    }els
22f10 65 7b 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 30  e{.      *pp = 0
22f20 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
22f30 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
22f40 61 70 53 68 6d 3d 3d 30 20 29 3b 0a 20 20 20 20  apShm==0 );.    
22f50 72 63 20 3d 20 70 2d 3e 70 52 65 61 6c 2d 3e 70  rc = p->pReal->p
22f60 4d 65 74 68 6f 64 73 2d 3e 78 53 68 6d 4d 61 70  Methods->xShmMap
22f70 28 70 2d 3e 70 52 65 61 6c 2c 20 69 52 65 67 69  (p->pReal, iRegi
22f80 6f 6e 2c 20 73 7a 52 65 67 69 6f 6e 2c 20 69 73  on, szRegion, is
22f90 57 72 69 74 65 2c 20 70 70 29 3b 0a 20 20 7d 0a  Write, pp);.  }.
22fa0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
22fb0 0a 2f 2a 0a 2a 2a 20 4d 65 6d 6f 72 79 20 62 61  ./*.** Memory ba
22fc0 72 72 69 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  rrier..*/.static
22fd0 20 76 6f 69 64 20 72 62 75 56 66 73 53 68 6d 42   void rbuVfsShmB
22fe0 61 72 72 69 65 72 28 73 71 6c 69 74 65 33 5f 66  arrier(sqlite3_f
22ff0 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 72  ile *pFile){.  r
23000 62 75 5f 66 69 6c 65 20 2a 70 20 3d 20 28 72 62  bu_file *p = (rb
23010 75 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a  u_file *)pFile;.
23020 20 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74    p->pReal->pMet
23030 68 6f 64 73 2d 3e 78 53 68 6d 42 61 72 72 69 65  hods->xShmBarrie
23040 72 28 70 2d 3e 70 52 65 61 6c 29 3b 0a 7d 0a 0a  r(p->pReal);.}..
23050 2f 2a 0a 2a 2a 20 54 68 65 20 78 53 68 6d 55 6e  /*.** The xShmUn
23060 6d 61 70 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73  map method..*/.s
23070 74 61 74 69 63 20 69 6e 74 20 72 62 75 56 66 73  tatic int rbuVfs
23080 53 68 6d 55 6e 6d 61 70 28 73 71 6c 69 74 65 33  ShmUnmap(sqlite3
23090 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e  _file *pFile, in
230a0 74 20 64 65 6c 46 6c 61 67 29 7b 0a 20 20 72 62  t delFlag){.  rb
230b0 75 5f 66 69 6c 65 20 2a 70 20 3d 20 28 72 62 75  u_file *p = (rbu
230c0 5f 66 69 6c 65 2a 29 70 46 69 6c 65 3b 0a 20 20  _file*)pFile;.  
230d0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
230e0 4f 4b 3b 0a 20 20 69 6e 74 20 65 53 74 61 67 65  OK;.  int eStage
230f0 20 3d 20 28 70 2d 3e 70 52 62 75 20 3f 20 70 2d   = (p->pRbu ? p-
23100 3e 70 52 62 75 2d 3e 65 53 74 61 67 65 20 3a 20  >pRbu->eStage : 
23110 30 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  0);..  assert( p
23120 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20 28 53  ->openFlags & (S
23130 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
23140 44 42 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54  DB|SQLITE_OPEN_T
23150 45 4d 50 5f 44 42 29 20 29 3b 0a 20 20 69 66 28  EMP_DB) );.  if(
23160 20 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41   eStage==RBU_STA
23170 47 45 5f 4f 41 4c 20 7c 7c 20 65 53 74 61 67 65  GE_OAL || eStage
23180 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4d 4f 56 45  ==RBU_STAGE_MOVE
23190 20 29 7b 0a 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70   ){.    /* no-op
231a0 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   */.  }else{.   
231b0 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20   /* Release the 
231c0 63 68 65 63 6b 70 6f 69 6e 74 65 72 20 61 6e 64  checkpointer and
231d0 20 77 72 69 74 65 72 20 6c 6f 63 6b 73 20 2a 2f   writer locks */
231e0 0a 20 20 20 20 72 62 75 55 6e 6c 6f 63 6b 53 68  .    rbuUnlockSh
231f0 6d 28 70 29 3b 0a 20 20 20 20 72 63 20 3d 20 70  m(p);.    rc = p
23200 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64  ->pReal->pMethod
23210 73 2d 3e 78 53 68 6d 55 6e 6d 61 70 28 70 2d 3e  s->xShmUnmap(p->
23220 70 52 65 61 6c 2c 20 64 65 6c 46 6c 61 67 29 3b  pReal, delFlag);
23230 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
23240 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
23250 20 74 68 61 74 20 7a 57 61 6c 20 70 6f 69 6e 74   that zWal point
23260 73 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f  s to a buffer co
23270 6e 74 61 69 6e 69 6e 67 20 61 20 77 61 6c 20 66  ntaining a wal f
23280 69 6c 65 20 6e 61 6d 65 20 70 61 73 73 65 64 20  ile name passed 
23290 74 6f 20 0a 2a 2a 20 65 69 74 68 65 72 20 74 68  to .** either th
232a0 65 20 78 4f 70 65 6e 28 29 20 6f 72 20 78 41 63  e xOpen() or xAc
232b0 63 65 73 73 28 29 20 56 46 53 20 6d 65 74 68 6f  cess() VFS metho
232c0 64 2c 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  d, return a poin
232d0 74 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 66 69  ter to the.** fi
232e0 6c 65 2d 68 61 6e 64 6c 65 20 6f 70 65 6e 65 64  le-handle opened
232f0 20 62 79 20 74 68 65 20 73 61 6d 65 20 64 61 74   by the same dat
23300 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
23310 20 6f 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f   on the correspo
23320 6e 64 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73  nding.** databas
23330 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  e file..*/.stati
23340 63 20 72 62 75 5f 66 69 6c 65 20 2a 72 62 75 46  c rbu_file *rbuF
23350 69 6e 64 4d 61 69 6e 64 62 28 72 62 75 5f 76 66  indMaindb(rbu_vf
23360 73 20 2a 70 52 62 75 56 66 73 2c 20 63 6f 6e 73  s *pRbuVfs, cons
23370 74 20 63 68 61 72 20 2a 7a 57 61 6c 29 7b 0a 20  t char *zWal){. 
23380 20 72 62 75 5f 66 69 6c 65 20 2a 70 44 62 3b 0a   rbu_file *pDb;.
23390 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
233a0 65 6e 74 65 72 28 70 52 62 75 56 66 73 2d 3e 6d  enter(pRbuVfs->m
233b0 75 74 65 78 29 3b 0a 20 20 66 6f 72 28 70 44 62  utex);.  for(pDb
233c0 3d 70 52 62 75 56 66 73 2d 3e 70 4d 61 69 6e 3b  =pRbuVfs->pMain;
233d0 20 70 44 62 20 26 26 20 70 44 62 2d 3e 7a 57 61   pDb && pDb->zWa
233e0 6c 21 3d 7a 57 61 6c 3b 20 70 44 62 3d 70 44 62  l!=zWal; pDb=pDb
233f0 2d 3e 70 4d 61 69 6e 4e 65 78 74 29 7b 7d 0a 20  ->pMainNext){}. 
23400 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
23410 65 61 76 65 28 70 52 62 75 56 66 73 2d 3e 6d 75  eave(pRbuVfs->mu
23420 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  tex);.  return p
23430 44 62 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 41 20  Db;.}../* .** A 
23440 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 6e 61  main database na
23450 6d 65 64 20 7a 4e 61 6d 65 20 68 61 73 20 6a 75  med zName has ju
23460 73 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e 20  st been opened. 
23470 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a  The following .*
23480 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  * function retur
23490 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
234a0 61 20 62 75 66 66 65 72 20 6f 77 6e 65 64 20 62  a buffer owned b
234b0 79 20 53 51 4c 69 74 65 20 74 68 61 74 20 63 6f  y SQLite that co
234c0 6e 74 61 69 6e 73 0a 2a 2a 20 74 68 65 20 6e 61  ntains.** the na
234d0 6d 65 20 6f 66 20 74 68 65 20 2a 2d 77 61 6c 20  me of the *-wal 
234e0 66 69 6c 65 20 74 68 69 73 20 64 62 20 63 6f 6e  file this db con
234f0 6e 65 63 74 69 6f 6e 20 77 69 6c 6c 20 75 73 65  nection will use
23500 2e 20 53 51 4c 69 74 65 0a 2a 2a 20 68 61 70 70  . SQLite.** happ
23510 65 6e 73 20 74 6f 20 70 61 73 73 20 61 20 70 6f  ens to pass a po
23520 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20 62 75  inter to this bu
23530 66 66 65 72 20 77 68 65 6e 20 75 73 69 6e 67 20  ffer when using 
23540 78 41 63 63 65 73 73 28 29 0a 2a 2a 20 6f 72 20  xAccess().** or 
23550 78 4f 70 65 6e 28 29 20 74 6f 20 6f 70 65 72 61  xOpen() to opera
23560 74 65 20 6f 6e 20 74 68 65 20 2a 2d 77 61 6c 20  te on the *-wal 
23570 66 69 6c 65 2e 20 20 0a 2a 2f 0a 73 74 61 74 69  file.  .*/.stati
23580 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 72 62  c const char *rb
23590 75 4d 61 69 6e 54 6f 57 61 6c 28 63 6f 6e 73 74  uMainToWal(const
235a0 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e   char *zName, in
235b0 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20  t flags){.  int 
235c0 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  n = (int)strlen(
235d0 7a 4e 61 6d 65 29 3b 0a 20 20 63 6f 6e 73 74 20  zName);.  const 
235e0 63 68 61 72 20 2a 7a 20 3d 20 26 7a 4e 61 6d 65  char *z = &zName
235f0 5b 6e 5d 3b 0a 20 20 69 66 28 20 66 6c 61 67 73  [n];.  if( flags
23600 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55   & SQLITE_OPEN_U
23610 52 49 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 64  RI ){.    int od
23620 64 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65  d = 0;.    while
23630 28 20 31 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ( 1 ){.      if(
23640 20 7a 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20   z[0]==0 ){.    
23650 20 20 20 20 6f 64 64 20 3d 20 31 20 2d 20 6f 64      odd = 1 - od
23660 64 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6f  d;.        if( o
23670 64 64 20 26 26 20 7a 5b 31 5d 3d 3d 30 20 29 20  dd && z[1]==0 ) 
23680 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
23690 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 7d 0a       z++;.    }.
236a0 20 20 20 20 7a 20 2b 3d 20 32 3b 0a 20 20 7d 65      z += 2;.  }e
236b0 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  lse{.    while( 
236c0 2a 7a 3d 3d 30 20 29 20 7a 2b 2b 3b 0a 20 20 7d  *z==0 ) z++;.  }
236d0 0a 20 20 7a 20 2b 3d 20 28 6e 20 2b 20 38 20 2b  .  z += (n + 8 +
236e0 20 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b   1);.  return z;
236f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  .}../*.** Open a
23700 6e 20 72 62 75 20 66 69 6c 65 20 68 61 6e 64 6c  n rbu file handl
23710 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
23720 20 72 62 75 56 66 73 4f 70 65 6e 28 0a 20 20 73   rbuVfsOpen(.  s
23730 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
23740 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
23750 7a 4e 61 6d 65 2c 0a 20 20 73 71 6c 69 74 65 33  zName,.  sqlite3
23760 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 0a 20 20  _file *pFile,.  
23770 69 6e 74 20 66 6c 61 67 73 2c 0a 20 20 69 6e 74  int flags,.  int
23780 20 2a 70 4f 75 74 46 6c 61 67 73 0a 29 7b 0a 20   *pOutFlags.){. 
23790 20 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f   static sqlite3_
237a0 69 6f 5f 6d 65 74 68 6f 64 73 20 72 62 75 76 66  io_methods rbuvf
237b0 73 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 3d 20 7b  s_io_methods = {
237c0 0a 20 20 20 20 32 2c 20 20 20 20 20 20 20 20 20  .    2,         
237d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
237e0 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a     /* iVersion *
237f0 2f 0a 20 20 20 20 72 62 75 56 66 73 43 6c 6f 73  /.    rbuVfsClos
23800 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
23810 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f      /* xClose */
23820 0a 20 20 20 20 72 62 75 56 66 73 52 65 61 64 2c  .    rbuVfsRead,
23830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23840 20 20 20 2f 2a 20 78 52 65 61 64 20 2a 2f 0a 20     /* xRead */. 
23850 20 20 20 72 62 75 56 66 73 57 72 69 74 65 2c 20     rbuVfsWrite, 
23860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23870 20 2f 2a 20 78 57 72 69 74 65 20 2a 2f 0a 20 20   /* xWrite */.  
23880 20 20 72 62 75 56 66 73 54 72 75 6e 63 61 74 65    rbuVfsTruncate
23890 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
238a0 2f 2a 20 78 54 72 75 6e 63 61 74 65 20 2a 2f 0a  /* xTruncate */.
238b0 20 20 20 20 72 62 75 56 66 73 53 79 6e 63 2c 20      rbuVfsSync, 
238c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
238d0 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 0a 20 20    /* xSync */.  
238e0 20 20 72 62 75 56 66 73 46 69 6c 65 53 69 7a 65    rbuVfsFileSize
238f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
23900 2f 2a 20 78 46 69 6c 65 53 69 7a 65 20 2a 2f 0a  /* xFileSize */.
23910 20 20 20 20 72 62 75 56 66 73 4c 6f 63 6b 2c 20      rbuVfsLock, 
23920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23930 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 0a 20 20    /* xLock */.  
23940 20 20 72 62 75 56 66 73 55 6e 6c 6f 63 6b 2c 20    rbuVfsUnlock, 
23950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23960 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a 2f 0a 20 20  /* xUnlock */.  
23970 20 20 72 62 75 56 66 73 43 68 65 63 6b 52 65 73    rbuVfsCheckRes
23980 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20 20 20  ervedLock,      
23990 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
239a0 64 4c 6f 63 6b 20 2a 2f 0a 20 20 20 20 72 62 75  dLock */.    rbu
239b0 56 66 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20  VfsFileControl, 
239c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46             /* xF
239d0 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f 0a 20 20  ileControl */.  
239e0 20 20 72 62 75 56 66 73 53 65 63 74 6f 72 53 69    rbuVfsSectorSi
239f0 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ze,             
23a00 2f 2a 20 78 53 65 63 74 6f 72 53 69 7a 65 20 2a  /* xSectorSize *
23a10 2f 0a 20 20 20 20 72 62 75 56 66 73 44 65 76 69  /.    rbuVfsDevi
23a20 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
23a30 73 2c 20 20 2f 2a 20 78 44 65 76 69 63 65 43 68  s,  /* xDeviceCh
23a40 61 72 61 63 74 65 72 69 73 74 69 63 73 20 2a 2f  aracteristics */
23a50 0a 20 20 20 20 72 62 75 56 66 73 53 68 6d 4d 61  .    rbuVfsShmMa
23a60 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
23a70 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 2a 2f     /* xShmMap */
23a80 0a 20 20 20 20 72 62 75 56 66 73 53 68 6d 4c 6f  .    rbuVfsShmLo
23a90 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
23aa0 20 20 20 2f 2a 20 78 53 68 6d 4c 6f 63 6b 20 2a     /* xShmLock *
23ab0 2f 0a 20 20 20 20 72 62 75 56 66 73 53 68 6d 42  /.    rbuVfsShmB
23ac0 61 72 72 69 65 72 2c 20 20 20 20 20 20 20 20 20  arrier,         
23ad0 20 20 20 20 2f 2a 20 78 53 68 6d 42 61 72 72 69      /* xShmBarri
23ae0 65 72 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73  er */.    rbuVfs
23af0 53 68 6d 55 6e 6d 61 70 2c 20 20 20 20 20 20 20  ShmUnmap,       
23b00 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 55          /* xShmU
23b10 6e 6d 61 70 20 2a 2f 0a 20 20 20 20 30 2c 20 30  nmap */.    0, 0
23b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 65            /* xFe
23b40 74 63 68 2c 20 78 55 6e 66 65 74 63 68 20 2a 2f  tch, xUnfetch */
23b50 0a 20 20 7d 3b 0a 20 20 72 62 75 5f 76 66 73 20  .  };.  rbu_vfs 
23b60 2a 70 52 62 75 56 66 73 20 3d 20 28 72 62 75 5f  *pRbuVfs = (rbu_
23b70 76 66 73 2a 29 70 56 66 73 3b 0a 20 20 73 71 6c  vfs*)pVfs;.  sql
23b80 69 74 65 33 5f 76 66 73 20 2a 70 52 65 61 6c 56  ite3_vfs *pRealV
23b90 66 73 20 3d 20 70 52 62 75 56 66 73 2d 3e 70 52  fs = pRbuVfs->pR
23ba0 65 61 6c 56 66 73 3b 0a 20 20 72 62 75 5f 66 69  ealVfs;.  rbu_fi
23bb0 6c 65 20 2a 70 46 64 20 3d 20 28 72 62 75 5f 66  le *pFd = (rbu_f
23bc0 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 69  ile *)pFile;.  i
23bd0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
23be0 4b 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  K;.  const char 
23bf0 2a 7a 4f 70 65 6e 20 3d 20 7a 4e 61 6d 65 3b 0a  *zOpen = zName;.
23c00 20 20 69 6e 74 20 6f 66 6c 61 67 73 20 3d 20 66    int oflags = f
23c10 6c 61 67 73 3b 0a 0a 20 20 6d 65 6d 73 65 74 28  lags;..  memset(
23c20 70 46 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 72  pFd, 0, sizeof(r
23c30 62 75 5f 66 69 6c 65 29 29 3b 0a 20 20 70 46 64  bu_file));.  pFd
23c40 2d 3e 70 52 65 61 6c 20 3d 20 28 73 71 6c 69 74  ->pReal = (sqlit
23c50 65 33 5f 66 69 6c 65 2a 29 26 70 46 64 5b 31 5d  e3_file*)&pFd[1]
23c60 3b 0a 20 20 70 46 64 2d 3e 70 52 62 75 56 66 73  ;.  pFd->pRbuVfs
23c70 20 3d 20 70 52 62 75 56 66 73 3b 0a 20 20 70 46   = pRbuVfs;.  pF
23c80 64 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 66  d->openFlags = f
23c90 6c 61 67 73 3b 0a 20 20 69 66 28 20 7a 4e 61 6d  lags;.  if( zNam
23ca0 65 20 29 7b 0a 20 20 20 20 69 66 28 20 66 6c 61  e ){.    if( fla
23cb0 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
23cc0 5f 4d 41 49 4e 5f 44 42 20 29 7b 0a 20 20 20 20  _MAIN_DB ){.    
23cd0 20 20 2f 2a 20 41 20 6d 61 69 6e 20 64 61 74 61    /* A main data
23ce0 62 61 73 65 20 68 61 73 20 6a 75 73 74 20 62 65  base has just be
23cf0 65 6e 20 6f 70 65 6e 65 64 2e 20 54 68 65 20 66  en opened. The f
23d00 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 73  ollowing block s
23d10 65 74 73 0a 20 20 20 20 20 20 2a 2a 20 28 70 46  ets.      ** (pF
23d20 64 2d 3e 7a 57 61 6c 29 20 74 6f 20 70 6f 69 6e  d->zWal) to poin
23d30 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f 77  t to a buffer ow
23d40 6e 65 64 20 62 79 20 53 51 4c 69 74 65 20 74 68  ned by SQLite th
23d50 61 74 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20  at contains.    
23d60 20 20 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66    ** the name of
23d70 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20   the *-wal file 
23d80 74 68 69 73 20 64 62 20 63 6f 6e 6e 65 63 74 69  this db connecti
23d90 6f 6e 20 77 69 6c 6c 20 75 73 65 2e 20 53 51 4c  on will use. SQL
23da0 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 68 61 70  ite.      ** hap
23db0 70 65 6e 73 20 74 6f 20 70 61 73 73 20 61 20 70  pens to pass a p
23dc0 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20 62  ointer to this b
23dd0 75 66 66 65 72 20 77 68 65 6e 20 75 73 69 6e 67  uffer when using
23de0 20 78 41 63 63 65 73 73 28 29 0a 20 20 20 20 20   xAccess().     
23df0 20 2a 2a 20 6f 72 20 78 4f 70 65 6e 28 29 20 74   ** or xOpen() t
23e00 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65  o operate on the
23e10 20 2a 2d 77 61 6c 20 66 69 6c 65 2e 20 20 2a 2f   *-wal file.  */
23e20 0a 20 20 20 20 20 20 70 46 64 2d 3e 7a 57 61 6c  .      pFd->zWal
23e30 20 3d 20 72 62 75 4d 61 69 6e 54 6f 57 61 6c 28   = rbuMainToWal(
23e40 7a 4e 61 6d 65 2c 20 66 6c 61 67 73 29 3b 0a 20  zName, flags);. 
23e50 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69 66     }.    else if
23e60 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ( flags & SQLITE
23e70 5f 4f 50 45 4e 5f 57 41 4c 20 29 7b 0a 20 20 20  _OPEN_WAL ){.   
23e80 20 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 44 62     rbu_file *pDb
23e90 20 3d 20 72 62 75 46 69 6e 64 4d 61 69 6e 64 62   = rbuFindMaindb
23ea0 28 70 52 62 75 56 66 73 2c 20 7a 4e 61 6d 65 29  (pRbuVfs, zName)
23eb0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 20  ;.      if( pDb 
23ec0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
23ed0 44 62 2d 3e 70 52 62 75 20 26 26 20 70 44 62 2d  Db->pRbu && pDb-
23ee0 3e 70 52 62 75 2d 3e 65 53 74 61 67 65 3d 3d 52  >pRbu->eStage==R
23ef0 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20 29 7b 0a  BU_STAGE_OAL ){.
23f00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69            /* Thi
23f10 73 20 63 61 6c 6c 20 69 73 20 74 6f 20 6f 70 65  s call is to ope
23f20 6e 20 61 20 2a 2d 77 61 6c 20 66 69 6c 65 2e 20  n a *-wal file. 
23f30 49 6e 74 65 61 64 2c 20 6f 70 65 6e 20 74 68 65  Intead, open the
23f40 20 2a 2d 6f 61 6c 2e 20 54 68 69 73 0a 20 20 20   *-oal. This.   
23f50 20 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 20 65         ** code e
23f60 6e 73 75 72 65 73 20 74 68 61 74 20 74 68 65 20  nsures that the 
23f70 73 74 72 69 6e 67 20 70 61 73 73 65 64 20 74 6f  string passed to
23f80 20 78 4f 70 65 6e 28 29 20 69 73 20 74 65 72 6d   xOpen() is term
23f90 69 6e 61 74 65 64 20 62 79 20 61 0a 20 20 20 20  inated by a.    
23fa0 20 20 20 20 20 20 2a 2a 20 70 61 69 72 20 6f 66        ** pair of
23fb0 20 27 5c 30 27 20 62 79 74 65 73 20 69 6e 20 63   '\0' bytes in c
23fc0 61 73 65 20 74 68 65 20 56 46 53 20 61 74 74 65  ase the VFS atte
23fd0 6d 70 74 73 20 74 6f 20 65 78 74 72 61 63 74 20  mpts to extract 
23fe0 61 20 55 52 49 20 0a 20 20 20 20 20 20 20 20 20  a URI .         
23ff0 20 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 66 72   ** parameter fr
24000 6f 6d 20 69 74 2e 20 20 2a 2f 0a 20 20 20 20 20  om it.  */.     
24010 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
24020 2a 7a 42 61 73 65 20 3d 20 7a 4e 61 6d 65 3b 0a  *zBase = zName;.
24030 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 5f 74            size_t
24040 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20 20 20   nCopy;.        
24050 20 20 63 68 61 72 20 2a 7a 43 6f 70 79 3b 0a 20    char *zCopy;. 
24060 20 20 20 20 20 20 20 20 20 69 66 28 20 72 62 75           if( rbu
24070 49 73 56 61 63 75 75 6d 28 70 44 62 2d 3e 70 52  IsVacuum(pDb->pR
24080 62 75 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  bu) ){.         
24090 20 20 20 7a 42 61 73 65 20 3d 20 73 71 6c 69 74     zBase = sqlit
240a0 65 33 5f 64 62 5f 66 69 6c 65 6e 61 6d 65 28 70  e3_db_filename(p
240b0 44 62 2d 3e 70 52 62 75 2d 3e 64 62 52 62 75 2c  Db->pRbu->dbRbu,
240c0 20 22 6d 61 69 6e 22 29 3b 0a 20 20 20 20 20 20   "main");.      
240d0 20 20 20 20 20 20 7a 42 61 73 65 20 3d 20 72 62        zBase = rb
240e0 75 4d 61 69 6e 54 6f 57 61 6c 28 7a 42 61 73 65  uMainToWal(zBase
240f0 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52  , SQLITE_OPEN_UR
24100 49 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  I);.          }.
24110 20 20 20 20 20 20 20 20 20 20 6e 43 6f 70 79 20            nCopy 
24120 3d 20 73 74 72 6c 65 6e 28 7a 42 61 73 65 29 3b  = strlen(zBase);
24130 0a 20 20 20 20 20 20 20 20 20 20 7a 43 6f 70 79  .          zCopy
24140 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
24150 63 36 34 28 6e 43 6f 70 79 2b 32 29 3b 0a 20 20  c64(nCopy+2);.  
24160 20 20 20 20 20 20 20 20 69 66 28 20 7a 43 6f 70          if( zCop
24170 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  y ){.           
24180 20 6d 65 6d 63 70 79 28 7a 43 6f 70 79 2c 20 7a   memcpy(zCopy, z
24190 42 61 73 65 2c 20 6e 43 6f 70 79 29 3b 0a 20 20  Base, nCopy);.  
241a0 20 20 20 20 20 20 20 20 20 20 7a 43 6f 70 79 5b            zCopy[
241b0 6e 43 6f 70 79 2d 33 5d 20 3d 20 27 6f 27 3b 0a  nCopy-3] = 'o';.
241c0 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f 70              zCop
241d0 79 5b 6e 43 6f 70 79 5d 20 3d 20 27 5c 30 27 3b  y[nCopy] = '\0';
241e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f  .            zCo
241f0 70 79 5b 6e 43 6f 70 79 2b 31 5d 20 3d 20 27 5c  py[nCopy+1] = '\
24200 30 27 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0';.            
24210 7a 4f 70 65 6e 20 3d 20 28 63 6f 6e 73 74 20 63  zOpen = (const c
24220 68 61 72 2a 29 28 70 46 64 2d 3e 7a 44 65 6c 20  har*)(pFd->zDel 
24230 3d 20 7a 43 6f 70 79 29 3b 0a 20 20 20 20 20 20  = zCopy);.      
24240 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
24250 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
24260 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
24270 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
24280 70 46 64 2d 3e 70 52 62 75 20 3d 20 70 44 62 2d  pFd->pRbu = pDb-
24290 3e 70 52 62 75 3b 0a 20 20 20 20 20 20 20 20 7d  >pRbu;.        }
242a0 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 70 57  .        pDb->pW
242b0 61 6c 46 64 20 3d 20 70 46 64 3b 0a 20 20 20 20  alFd = pFd;.    
242c0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
242d0 65 7b 0a 20 20 20 20 70 46 64 2d 3e 70 52 62 75  e{.    pFd->pRbu
242e0 20 3d 20 70 52 62 75 56 66 73 2d 3e 70 52 62 75   = pRbuVfs->pRbu
242f0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6f 66 6c  ;.  }..  if( ofl
24300 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
24310 4e 5f 4d 41 49 4e 5f 44 42 20 0a 20 20 20 26 26  N_MAIN_DB .   &&
24320 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f   sqlite3_uri_boo
24330 6c 65 61 6e 28 7a 4e 61 6d 65 2c 20 22 72 62 75  lean(zName, "rbu
24340 5f 6d 65 6d 6f 72 79 22 2c 20 30 29 20 0a 20 20  _memory", 0) .  
24350 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f  ){.    assert( o
24360 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
24370 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 3b 0a 20  PEN_MAIN_DB );. 
24380 20 20 20 6f 66 6c 61 67 73 20 3d 20 20 53 51 4c     oflags =  SQL
24390 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42  ITE_OPEN_TEMP_DB
243a0 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   | SQLITE_OPEN_R
243b0 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54  EADWRITE | SQLIT
243c0 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a  E_OPEN_CREATE |.
243d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
243e0 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53  LITE_OPEN_EXCLUS
243f0 49 56 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  IVE | SQLITE_OPE
24400 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b  N_DELETEONCLOSE;
24410 0a 20 20 20 20 7a 4f 70 65 6e 20 3d 20 30 3b 0a  .    zOpen = 0;.
24420 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
24430 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
24440 72 63 20 3d 20 70 52 65 61 6c 56 66 73 2d 3e 78  rc = pRealVfs->x
24450 4f 70 65 6e 28 70 52 65 61 6c 56 66 73 2c 20 7a  Open(pRealVfs, z
24460 4f 70 65 6e 2c 20 70 46 64 2d 3e 70 52 65 61 6c  Open, pFd->pReal
24470 2c 20 6f 66 6c 61 67 73 2c 20 70 4f 75 74 46 6c  , oflags, pOutFl
24480 61 67 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ags);.  }.  if( 
24490 70 46 64 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74  pFd->pReal->pMet
244a0 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 54  hods ){.    /* T
244b0 68 65 20 78 4f 70 65 6e 28 29 20 6f 70 65 72 61  he xOpen() opera
244c0 74 69 6f 6e 20 68 61 73 20 73 75 63 63 65 65 64  tion has succeed
244d0 65 64 2e 20 53 65 74 20 74 68 65 20 73 71 6c 69  ed. Set the sqli
244e0 74 65 33 5f 66 69 6c 65 2e 70 4d 65 74 68 6f 64  te3_file.pMethod
244f0 73 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72  s.    ** pointer
24500 20 61 6e 64 2c 20 69 66 20 74 68 65 20 66 69 6c   and, if the fil
24510 65 20 69 73 20 61 20 6d 61 69 6e 20 64 61 74 61  e is a main data
24520 62 61 73 65 20 66 69 6c 65 2c 20 6c 69 6e 6b 20  base file, link 
24530 69 74 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20  it into the.    
24540 2a 2a 20 6d 75 74 65 78 20 70 72 6f 74 65 63 74  ** mutex protect
24550 65 64 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f  ed linked list o
24560 66 20 61 6c 6c 20 73 75 63 68 20 66 69 6c 65 73  f all such files
24570 2e 20 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d  .  */.    pFile-
24580 3e 70 4d 65 74 68 6f 64 73 20 3d 20 26 72 62 75  >pMethods = &rbu
24590 76 66 73 5f 69 6f 5f 6d 65 74 68 6f 64 73 3b 0a  vfs_io_methods;.
245a0 20 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 20      if( flags & 
245b0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
245c0 5f 44 42 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _DB ){.      sql
245d0 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
245e0 28 70 52 62 75 56 66 73 2d 3e 6d 75 74 65 78 29  (pRbuVfs->mutex)
245f0 3b 0a 20 20 20 20 20 20 70 46 64 2d 3e 70 4d 61  ;.      pFd->pMa
24600 69 6e 4e 65 78 74 20 3d 20 70 52 62 75 56 66 73  inNext = pRbuVfs
24610 2d 3e 70 4d 61 69 6e 3b 0a 20 20 20 20 20 20 70  ->pMain;.      p
24620 52 62 75 56 66 73 2d 3e 70 4d 61 69 6e 20 3d 20  RbuVfs->pMain = 
24630 70 46 64 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  pFd;.      sqlit
24640 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
24650 52 62 75 56 66 73 2d 3e 6d 75 74 65 78 29 3b 0a  RbuVfs->mutex);.
24660 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
24670 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
24680 70 46 64 2d 3e 7a 44 65 6c 29 3b 0a 20 20 7d 0a  pFd->zDel);.  }.
24690 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
246a0 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68  ./*.** Delete th
246b0 65 20 66 69 6c 65 20 6c 6f 63 61 74 65 64 20 61  e file located a
246c0 74 20 7a 50 61 74 68 2e 0a 2a 2f 0a 73 74 61 74  t zPath..*/.stat
246d0 69 63 20 69 6e 74 20 72 62 75 56 66 73 44 65 6c  ic int rbuVfsDel
246e0 65 74 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ete(sqlite3_vfs 
246f0 2a 70 56 66 73 2c 20 63 6f 6e 73 74 20 63 68 61  *pVfs, const cha
24700 72 20 2a 7a 50 61 74 68 2c 20 69 6e 74 20 64 69  r *zPath, int di
24710 72 53 79 6e 63 29 7b 0a 20 20 73 71 6c 69 74 65  rSync){.  sqlite
24720 33 5f 76 66 73 20 2a 70 52 65 61 6c 56 66 73 20  3_vfs *pRealVfs 
24730 3d 20 28 28 72 62 75 5f 76 66 73 2a 29 70 56 66  = ((rbu_vfs*)pVf
24740 73 29 2d 3e 70 52 65 61 6c 56 66 73 3b 0a 20 20  s)->pRealVfs;.  
24750 72 65 74 75 72 6e 20 70 52 65 61 6c 56 66 73 2d  return pRealVfs-
24760 3e 78 44 65 6c 65 74 65 28 70 52 65 61 6c 56 66  >xDelete(pRealVf
24770 73 2c 20 7a 50 61 74 68 2c 20 64 69 72 53 79 6e  s, zPath, dirSyn
24780 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 73  c);.}../*.** Tes
24790 74 20 66 6f 72 20 61 63 63 65 73 73 20 70 65 72  t for access per
247a0 6d 69 73 73 69 6f 6e 73 2e 20 52 65 74 75 72 6e  missions. Return
247b0 20 74 72 75 65 20 69 66 20 74 68 65 20 72 65 71   true if the req
247c0 75 65 73 74 65 64 20 70 65 72 6d 69 73 73 69 6f  uested permissio
247d0 6e 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62 6c  n.** is availabl
247e0 65 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65  e, or false othe
247f0 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  rwise..*/.static
24800 20 69 6e 74 20 72 62 75 56 66 73 41 63 63 65 73   int rbuVfsAcces
24810 73 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  s(.  sqlite3_vfs
24820 20 2a 70 56 66 73 2c 20 0a 20 20 63 6f 6e 73 74   *pVfs, .  const
24830 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 0a 20   char *zPath, . 
24840 20 69 6e 74 20 66 6c 61 67 73 2c 20 0a 20 20 69   int flags, .  i
24850 6e 74 20 2a 70 52 65 73 4f 75 74 0a 29 7b 0a 20  nt *pResOut.){. 
24860 20 72 62 75 5f 76 66 73 20 2a 70 52 62 75 56 66   rbu_vfs *pRbuVf
24870 73 20 3d 20 28 72 62 75 5f 76 66 73 2a 29 70 56  s = (rbu_vfs*)pV
24880 66 73 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  fs;.  sqlite3_vf
24890 73 20 2a 70 52 65 61 6c 56 66 73 20 3d 20 70 52  s *pRealVfs = pR
248a0 62 75 56 66 73 2d 3e 70 52 65 61 6c 56 66 73 3b  buVfs->pRealVfs;
248b0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63  .  int rc;..  rc
248c0 20 3d 20 70 52 65 61 6c 56 66 73 2d 3e 78 41 63   = pRealVfs->xAc
248d0 63 65 73 73 28 70 52 65 61 6c 56 66 73 2c 20 7a  cess(pRealVfs, z
248e0 50 61 74 68 2c 20 66 6c 61 67 73 2c 20 70 52 65  Path, flags, pRe
248f0 73 4f 75 74 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  sOut);..  /* If 
24900 74 68 69 73 20 63 61 6c 6c 20 69 73 20 74 6f 20  this call is to 
24910 63 68 65 63 6b 20 69 66 20 61 20 2a 2d 77 61 6c  check if a *-wal
24920 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64   file associated
24930 20 77 69 74 68 20 61 6e 20 52 42 55 20 74 61 72   with an RBU tar
24940 67 65 74 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  get.  ** databas
24950 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 65 78 69  e connection exi
24960 73 74 73 2c 20 61 6e 64 20 74 68 65 20 52 42 55  sts, and the RBU
24970 20 75 70 64 61 74 65 20 69 73 20 69 6e 20 52 42   update is in RB
24980 55 5f 53 54 41 47 45 5f 4f 41 4c 2c 0a 20 20 2a  U_STAGE_OAL,.  *
24990 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * the following 
249a0 73 70 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67  special handling
249b0 20 69 73 20 61 63 74 69 76 61 74 65 64 3a 0a 20   is activated:. 
249c0 20 2a 2a 0a 20 20 2a 2a 20 20 20 61 29 20 69 66   **.  **   a) if
249d0 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20   the *-wal file 
249e0 64 6f 65 73 20 65 78 69 73 74 2c 20 72 65 74 75  does exist, retu
249f0 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rn SQLITE_CANTOP
24a00 45 4e 2e 20 54 68 69 73 0a 20 20 2a 2a 20 20 20  EN. This.  **   
24a10 20 20 20 65 6e 73 75 72 65 73 20 74 68 61 74 20     ensures that 
24a20 74 68 65 20 52 42 55 20 65 78 74 65 6e 73 69 6f  the RBU extensio
24a30 6e 20 6e 65 76 65 72 20 74 72 69 65 73 20 74 6f  n never tries to
24a40 20 75 70 64 61 74 65 20 61 20 64 61 74 61 62 61   update a databa
24a50 73 65 0a 20 20 2a 2a 20 20 20 20 20 20 69 6e 20  se.  **      in 
24a60 77 61 6c 20 6d 6f 64 65 2c 20 65 76 65 6e 20 69  wal mode, even i
24a70 66 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  f the first page
24a80 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
24a90 20 66 69 6c 65 20 68 61 73 0a 20 20 2a 2a 20 20   file has.  **  
24aa0 20 20 20 20 62 65 65 6e 20 64 61 6d 61 67 65 64      been damaged
24ab0 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 62  . .  **.  **   b
24ac0 29 20 69 66 20 74 68 65 20 2a 2d 77 61 6c 20 66  ) if the *-wal f
24ad0 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  ile does not exi
24ae0 73 74 2c 20 63 6c 61 69 6d 20 74 68 61 74 20 69  st, claim that i
24af0 74 20 64 6f 65 73 20 61 6e 79 77 61 79 2c 0a 20  t does anyway,. 
24b00 20 2a 2a 20 20 20 20 20 20 63 61 75 73 69 6e 67   **      causing
24b10 20 53 51 4c 69 74 65 20 74 6f 20 63 61 6c 6c 20   SQLite to call 
24b20 78 4f 70 65 6e 28 29 20 74 6f 20 6f 70 65 6e 20  xOpen() to open 
24b30 69 74 2e 20 54 68 69 73 20 63 61 6c 6c 20 77 69  it. This call wi
24b40 6c 6c 20 61 6c 73 6f 0a 20 20 2a 2a 20 20 20 20  ll also.  **    
24b50 20 20 62 65 20 69 6e 74 65 72 63 65 70 74 65 64    be intercepted
24b60 20 28 73 65 65 20 74 68 65 20 72 62 75 56 66 73   (see the rbuVfs
24b70 4f 70 65 6e 28 29 20 66 75 6e 63 74 69 6f 6e 29  Open() function)
24b80 20 61 6e 64 20 74 68 65 20 2a 2d 6f 61 6c 0a 20   and the *-oal. 
24b90 20 2a 2a 20 20 20 20 20 20 66 69 6c 65 20 6f 70   **      file op
24ba0 65 6e 65 64 20 69 6e 73 74 65 61 64 2e 0a 20 20  ened instead..  
24bb0 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
24bc0 49 54 45 5f 4f 4b 20 26 26 20 66 6c 61 67 73 3d  ITE_OK && flags=
24bd0 3d 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45  =SQLITE_ACCESS_E
24be0 58 49 53 54 53 20 29 7b 0a 20 20 20 20 72 62 75  XISTS ){.    rbu
24bf0 5f 66 69 6c 65 20 2a 70 44 62 20 3d 20 72 62 75  _file *pDb = rbu
24c00 46 69 6e 64 4d 61 69 6e 64 62 28 70 52 62 75 56  FindMaindb(pRbuV
24c10 66 73 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20 20  fs, zPath);.    
24c20 69 66 28 20 70 44 62 20 26 26 20 70 44 62 2d 3e  if( pDb && pDb->
24c30 70 52 62 75 20 26 26 20 70 44 62 2d 3e 70 52 62  pRbu && pDb->pRb
24c40 75 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53  u->eStage==RBU_S
24c50 54 41 47 45 5f 4f 41 4c 20 29 7b 0a 20 20 20 20  TAGE_OAL ){.    
24c60 20 20 69 66 28 20 2a 70 52 65 73 4f 75 74 20 29    if( *pResOut )
24c70 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
24c80 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a  QLITE_CANTOPEN;.
24c90 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
24ca0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74       sqlite3_int
24cb0 36 34 20 73 7a 20 3d 20 30 3b 0a 20 20 20 20 20  64 sz = 0;.     
24cc0 20 20 20 72 63 20 3d 20 72 62 75 56 66 73 46 69     rc = rbuVfsFi
24cd0 6c 65 53 69 7a 65 28 26 70 44 62 2d 3e 62 61 73  leSize(&pDb->bas
24ce0 65 2c 20 26 73 7a 29 3b 0a 20 20 20 20 20 20 20  e, &sz);.       
24cf0 20 2a 70 52 65 73 4f 75 74 20 3d 20 28 73 7a 3e   *pResOut = (sz>
24d00 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
24d10 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
24d20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70  rc;.}../*.** Pop
24d30 75 6c 61 74 65 20 62 75 66 66 65 72 20 7a 4f 75  ulate buffer zOu
24d40 74 20 77 69 74 68 20 74 68 65 20 66 75 6c 6c 20  t with the full 
24d50 63 61 6e 6f 6e 69 63 61 6c 20 70 61 74 68 6e 61  canonical pathna
24d60 6d 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  me corresponding
24d70 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61 74 68 6e  .** to the pathn
24d80 61 6d 65 20 69 6e 20 7a 50 61 74 68 2e 20 7a 4f  ame in zPath. zO
24d90 75 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  ut is guaranteed
24da0 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62   to point to a b
24db0 75 66 66 65 72 0a 2a 2a 20 6f 66 20 61 74 20 6c  uffer.** of at l
24dc0 65 61 73 74 20 28 44 45 56 53 59 4d 5f 4d 41 58  east (DEVSYM_MAX
24dd0 5f 50 41 54 48 4e 41 4d 45 2b 31 29 20 62 79 74  _PATHNAME+1) byt
24de0 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es..*/.static in
24df0 74 20 72 62 75 56 66 73 46 75 6c 6c 50 61 74 68  t rbuVfsFullPath
24e00 6e 61 6d 65 28 0a 20 20 73 71 6c 69 74 65 33 5f  name(.  sqlite3_
24e10 76 66 73 20 2a 70 56 66 73 2c 20 0a 20 20 63 6f  vfs *pVfs, .  co
24e20 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c  nst char *zPath,
24e30 20 0a 20 20 69 6e 74 20 6e 4f 75 74 2c 20 0a 20   .  int nOut, . 
24e40 20 63 68 61 72 20 2a 7a 4f 75 74 0a 29 7b 0a 20   char *zOut.){. 
24e50 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 52   sqlite3_vfs *pR
24e60 65 61 6c 56 66 73 20 3d 20 28 28 72 62 75 5f 76  ealVfs = ((rbu_v
24e70 66 73 2a 29 70 56 66 73 29 2d 3e 70 52 65 61 6c  fs*)pVfs)->pReal
24e80 56 66 73 3b 0a 20 20 72 65 74 75 72 6e 20 70 52  Vfs;.  return pR
24e90 65 61 6c 56 66 73 2d 3e 78 46 75 6c 6c 50 61 74  ealVfs->xFullPat
24ea0 68 6e 61 6d 65 28 70 52 65 61 6c 56 66 73 2c 20  hname(pRealVfs, 
24eb0 7a 50 61 74 68 2c 20 6e 4f 75 74 2c 20 7a 4f 75  zPath, nOut, zOu
24ec0 74 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  t);.}..#ifndef S
24ed0 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
24ee0 45 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20  EXTENSION./*.** 
24ef0 4f 70 65 6e 20 74 68 65 20 64 79 6e 61 6d 69 63  Open the dynamic
24f00 20 6c 69 62 72 61 72 79 20 6c 6f 63 61 74 65 64   library located
24f10 20 61 74 20 7a 50 61 74 68 20 61 6e 64 20 72 65   at zPath and re
24f20 74 75 72 6e 20 61 20 68 61 6e 64 6c 65 2e 0a 2a  turn a handle..*
24f30 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 72  /.static void *r
24f40 62 75 56 66 73 44 6c 4f 70 65 6e 28 73 71 6c 69  buVfsDlOpen(sqli
24f50 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 63  te3_vfs *pVfs, c
24f60 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
24f70 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
24f80 20 2a 70 52 65 61 6c 56 66 73 20 3d 20 28 28 72   *pRealVfs = ((r
24f90 62 75 5f 76 66 73 2a 29 70 56 66 73 29 2d 3e 70  bu_vfs*)pVfs)->p
24fa0 52 65 61 6c 56 66 73 3b 0a 20 20 72 65 74 75 72  RealVfs;.  retur
24fb0 6e 20 70 52 65 61 6c 56 66 73 2d 3e 78 44 6c 4f  n pRealVfs->xDlO
24fc0 70 65 6e 28 70 52 65 61 6c 56 66 73 2c 20 7a 50  pen(pRealVfs, zP
24fd0 61 74 68 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  ath);.}../*.** P
24fe0 6f 70 75 6c 61 74 65 20 74 68 65 20 62 75 66 66  opulate the buff
24ff0 65 72 20 7a 45 72 72 4d 73 67 20 28 73 69 7a 65  er zErrMsg (size
25000 20 6e 42 79 74 65 20 62 79 74 65 73 29 20 77 69   nByte bytes) wi
25010 74 68 20 61 20 68 75 6d 61 6e 20 72 65 61 64 61  th a human reada
25020 62 6c 65 0a 2a 2a 20 75 74 66 2d 38 20 73 74 72  ble.** utf-8 str
25030 69 6e 67 20 64 65 73 63 72 69 62 69 6e 67 20 74  ing describing t
25040 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 65  he most recent e
25050 72 72 6f 72 20 65 6e 63 6f 75 6e 74 65 72 65 64  rror encountered
25060 20 61 73 73 6f 63 69 61 74 65 64 20 0a 2a 2a 20   associated .** 
25070 77 69 74 68 20 64 79 6e 61 6d 69 63 20 6c 69 62  with dynamic lib
25080 72 61 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  raries..*/.stati
25090 63 20 76 6f 69 64 20 72 62 75 56 66 73 44 6c 45  c void rbuVfsDlE
250a0 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73  rror(sqlite3_vfs
250b0 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 79 74   *pVfs, int nByt
250c0 65 2c 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67  e, char *zErrMsg
250d0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
250e0 20 2a 70 52 65 61 6c 56 66 73 20 3d 20 28 28 72   *pRealVfs = ((r
250f0 62 75 5f 76 66 73 2a 29 70 56 66 73 29 2d 3e 70  bu_vfs*)pVfs)->p
25100 52 65 61 6c 56 66 73 3b 0a 20 20 70 52 65 61 6c  RealVfs;.  pReal
25110 56 66 73 2d 3e 78 44 6c 45 72 72 6f 72 28 70 52  Vfs->xDlError(pR
25120 65 61 6c 56 66 73 2c 20 6e 42 79 74 65 2c 20 7a  ealVfs, nByte, z
25130 45 72 72 4d 73 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ErrMsg);.}../*.*
25140 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
25150 65 72 20 74 6f 20 74 68 65 20 73 79 6d 62 6f 6c  er to the symbol
25160 20 7a 53 79 6d 62 6f 6c 20 69 6e 20 74 68 65 20   zSymbol in the 
25170 64 79 6e 61 6d 69 63 20 6c 69 62 72 61 72 79 20  dynamic library 
25180 70 48 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74  pHandle..*/.stat
25190 69 63 20 76 6f 69 64 20 28 2a 72 62 75 56 66 73  ic void (*rbuVfs
251a0 44 6c 53 79 6d 28 0a 20 20 73 71 6c 69 74 65 33  DlSym(.  sqlite3
251b0 5f 76 66 73 20 2a 70 56 66 73 2c 20 0a 20 20 76  _vfs *pVfs, .  v
251c0 6f 69 64 20 2a 70 41 72 67 2c 20 0a 20 20 63 6f  oid *pArg, .  co
251d0 6e 73 74 20 63 68 61 72 20 2a 7a 53 79 6d 0a 29  nst char *zSym.)
251e0 29 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74  )(void){.  sqlit
251f0 65 33 5f 76 66 73 20 2a 70 52 65 61 6c 56 66 73  e3_vfs *pRealVfs
25200 20 3d 20 28 28 72 62 75 5f 76 66 73 2a 29 70 56   = ((rbu_vfs*)pV
25210 66 73 29 2d 3e 70 52 65 61 6c 56 66 73 3b 0a 20  fs)->pRealVfs;. 
25220 20 72 65 74 75 72 6e 20 70 52 65 61 6c 56 66 73   return pRealVfs
25230 2d 3e 78 44 6c 53 79 6d 28 70 52 65 61 6c 56 66  ->xDlSym(pRealVf
25240 73 2c 20 70 41 72 67 2c 20 7a 53 79 6d 29 3b 0a  s, pArg, zSym);.
25250 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74  }../*.** Close t
25260 68 65 20 64 79 6e 61 6d 69 63 20 6c 69 62 72 61  he dynamic libra
25270 72 79 20 68 61 6e 64 6c 65 20 70 48 61 6e 64 6c  ry handle pHandl
25280 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
25290 64 20 72 62 75 56 66 73 44 6c 43 6c 6f 73 65 28  d rbuVfsDlClose(
252a0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
252b0 73 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65  s, void *pHandle
252c0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
252d0 20 2a 70 52 65 61 6c 56 66 73 20 3d 20 28 28 72   *pRealVfs = ((r
252e0 62 75 5f 76 66 73 2a 29 70 56 66 73 29 2d 3e 70  bu_vfs*)pVfs)->p
252f0 52 65 61 6c 56 66 73 3b 0a 20 20 70 52 65 61 6c  RealVfs;.  pReal
25300 56 66 73 2d 3e 78 44 6c 43 6c 6f 73 65 28 70 52  Vfs->xDlClose(pR
25310 65 61 6c 56 66 73 2c 20 70 48 61 6e 64 6c 65 29  ealVfs, pHandle)
25320 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
25330 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45  LITE_OMIT_LOAD_E
25340 58 54 45 4e 53 49 4f 4e 20 2a 2f 0a 0a 2f 2a 0a  XTENSION */../*.
25350 2a 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20  ** Populate the 
25360 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74  buffer pointed t
25370 6f 20 62 79 20 7a 42 75 66 4f 75 74 20 77 69 74  o by zBufOut wit
25380 68 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66  h nByte bytes of
25390 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20 64 61 74 61   .** random data
253a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
253b0 72 62 75 56 66 73 52 61 6e 64 6f 6d 6e 65 73 73  rbuVfsRandomness
253c0 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
253d0 66 73 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 63  fs, int nByte, c
253e0 68 61 72 20 2a 7a 42 75 66 4f 75 74 29 7b 0a 20  har *zBufOut){. 
253f0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 52   sqlite3_vfs *pR
25400 65 61 6c 56 66 73 20 3d 20 28 28 72 62 75 5f 76  ealVfs = ((rbu_v
25410 66 73 2a 29 70 56 66 73 29 2d 3e 70 52 65 61 6c  fs*)pVfs)->pReal
25420 56 66 73 3b 0a 20 20 72 65 74 75 72 6e 20 70 52  Vfs;.  return pR
25430 65 61 6c 56 66 73 2d 3e 78 52 61 6e 64 6f 6d 6e  ealVfs->xRandomn
25440 65 73 73 28 70 52 65 61 6c 56 66 73 2c 20 6e 42  ess(pRealVfs, nB
25450 79 74 65 2c 20 7a 42 75 66 4f 75 74 29 3b 0a 7d  yte, zBufOut);.}
25460 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f  ../*.** Sleep fo
25470 72 20 6e 4d 69 63 72 6f 20 6d 69 63 72 6f 73 65  r nMicro microse
25480 63 6f 6e 64 73 2e 20 52 65 74 75 72 6e 20 74 68  conds. Return th
25490 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 63 72  e number of micr
254a0 6f 73 65 63 6f 6e 64 73 20 0a 2a 2a 20 61 63 74  oseconds .** act
254b0 75 61 6c 6c 79 20 73 6c 65 70 74 2e 0a 2a 2f 0a  ually slept..*/.
254c0 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 56 66  static int rbuVf
254d0 73 53 6c 65 65 70 28 73 71 6c 69 74 65 33 5f 76  sSleep(sqlite3_v
254e0 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 4d  fs *pVfs, int nM
254f0 69 63 72 6f 29 7b 0a 20 20 73 71 6c 69 74 65 33  icro){.  sqlite3
25500 5f 76 66 73 20 2a 70 52 65 61 6c 56 66 73 20 3d  _vfs *pRealVfs =
25510 20 28 28 72 62 75 5f 76 66 73 2a 29 70 56 66 73   ((rbu_vfs*)pVfs
25520 29 2d 3e 70 52 65 61 6c 56 66 73 3b 0a 20 20 72  )->pRealVfs;.  r
25530 65 74 75 72 6e 20 70 52 65 61 6c 56 66 73 2d 3e  eturn pRealVfs->
25540 78 53 6c 65 65 70 28 70 52 65 61 6c 56 66 73 2c  xSleep(pRealVfs,
25550 20 6e 4d 69 63 72 6f 29 3b 0a 7d 0a 0a 2f 2a 0a   nMicro);.}../*.
25560 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75  ** Return the cu
25570 72 72 65 6e 74 20 74 69 6d 65 20 61 73 20 61 20  rrent time as a 
25580 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65  Julian Day numbe
25590 72 20 69 6e 20 2a 70 54 69 6d 65 4f 75 74 2e 0a  r in *pTimeOut..
255a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62  */.static int rb
255b0 75 56 66 73 43 75 72 72 65 6e 74 54 69 6d 65 28  uVfsCurrentTime(
255c0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
255d0 73 2c 20 64 6f 75 62 6c 65 20 2a 70 54 69 6d 65  s, double *pTime
255e0 4f 75 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  Out){.  sqlite3_
255f0 76 66 73 20 2a 70 52 65 61 6c 56 66 73 20 3d 20  vfs *pRealVfs = 
25600 28 28 72 62 75 5f 76 66 73 2a 29 70 56 66 73 29  ((rbu_vfs*)pVfs)
25610 2d 3e 70 52 65 61 6c 56 66 73 3b 0a 20 20 72 65  ->pRealVfs;.  re
25620 74 75 72 6e 20 70 52 65 61 6c 56 66 73 2d 3e 78  turn pRealVfs->x
25630 43 75 72 72 65 6e 74 54 69 6d 65 28 70 52 65 61  CurrentTime(pRea
25640 6c 56 66 73 2c 20 70 54 69 6d 65 4f 75 74 29 3b  lVfs, pTimeOut);
25650 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 2e  .}../*.** No-op.
25660 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
25670 62 75 56 66 73 47 65 74 4c 61 73 74 45 72 72 6f  buVfsGetLastErro
25680 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  r(sqlite3_vfs *p
25690 56 66 73 2c 20 69 6e 74 20 61 2c 20 63 68 61 72  Vfs, int a, char
256a0 20 2a 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 30   *b){.  return 0
256b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 72 65 67  ;.}../*.** Dereg
256c0 69 73 74 65 72 20 61 6e 64 20 64 65 73 74 72 6f  ister and destro
256d0 79 20 61 6e 20 52 42 55 20 76 66 73 20 63 72 65  y an RBU vfs cre
256e0 61 74 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69  ated by an earli
256f0 65 72 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 73 71  er call to.** sq
25700 6c 69 74 65 33 72 62 75 5f 63 72 65 61 74 65 5f  lite3rbu_create_
25710 76 66 73 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  vfs()..*/.void s
25720 71 6c 69 74 65 33 72 62 75 5f 64 65 73 74 72 6f  qlite3rbu_destro
25730 79 5f 76 66 73 28 63 6f 6e 73 74 20 63 68 61 72  y_vfs(const char
25740 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 73 71 6c 69   *zName){.  sqli
25750 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20  te3_vfs *pVfs = 
25760 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
25770 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70  (zName);.  if( p
25780 56 66 73 20 26 26 20 70 56 66 73 2d 3e 78 4f 70  Vfs && pVfs->xOp
25790 65 6e 3d 3d 72 62 75 56 66 73 4f 70 65 6e 20 29  en==rbuVfsOpen )
257a0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  {.    sqlite3_mu
257b0 74 65 78 5f 66 72 65 65 28 28 28 72 62 75 5f 76  tex_free(((rbu_v
257c0 66 73 2a 29 70 56 66 73 29 2d 3e 6d 75 74 65 78  fs*)pVfs)->mutex
257d0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76  );.    sqlite3_v
257e0 66 73 5f 75 6e 72 65 67 69 73 74 65 72 28 70 56  fs_unregister(pV
257f0 66 73 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  fs);.    sqlite3
25800 5f 66 72 65 65 28 70 56 66 73 29 3b 0a 20 20 7d  _free(pVfs);.  }
25810 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
25820 20 61 6e 20 52 42 55 20 56 46 53 20 6e 61 6d 65   an RBU VFS name
25830 64 20 7a 4e 61 6d 65 20 74 68 61 74 20 61 63 63  d zName that acc
25840 65 73 73 65 73 20 74 68 65 20 75 6e 64 65 72 6c  esses the underl
25850 79 69 6e 67 20 66 69 6c 65 2d 73 79 73 74 65 6d  ying file-system
25860 0a 2a 2a 20 76 69 61 20 65 78 69 73 74 69 6e 67  .** via existing
25870 20 56 46 53 20 7a 50 61 72 65 6e 74 2e 20 54 68   VFS zParent. Th
25880 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 69 73 20  e new object is 
25890 72 65 67 69 73 74 65 72 65 64 20 61 73 20 61 20  registered as a 
258a0 6e 6f 6e 2d 64 65 66 61 75 6c 74 0a 2a 2a 20 56  non-default.** V
258b0 46 53 20 77 69 74 68 20 53 51 4c 69 74 65 20 62  FS with SQLite b
258c0 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
258d0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 72  .*/.int sqlite3r
258e0 62 75 5f 63 72 65 61 74 65 5f 76 66 73 28 63 6f  bu_create_vfs(co
258f0 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
25900 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
25910 72 65 6e 74 29 7b 0a 0a 20 20 2f 2a 20 54 65 6d  rent){..  /* Tem
25920 70 6c 61 74 65 20 66 6f 72 20 56 46 53 20 2a 2f  plate for VFS */
25930 0a 20 20 73 74 61 74 69 63 20 73 71 6c 69 74 65  .  static sqlite
25940 33 5f 76 66 73 20 76 66 73 5f 74 65 6d 70 6c 61  3_vfs vfs_templa
25950 74 65 20 3d 20 7b 0a 20 20 20 20 31 2c 20 20 20  te = {.    1,   
25960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25970 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72           /* iVer
25980 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 30 2c 20 20  sion */.    0,  
25990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
259a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 7a 4f            /* szO
259b0 73 46 69 6c 65 20 2a 2f 0a 20 20 20 20 30 2c 20  sFile */.    0, 
259c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
259d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6d 78             /* mx
259e0 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  Pathname */.    
259f0 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
25a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25a10 20 70 4e 65 78 74 20 2a 2f 0a 20 20 20 20 30 2c   pNext */.    0,
25a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a              /* z
25a40 4e 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20  Name */.    0,  
25a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 41 70            /* pAp
25a70 70 44 61 74 61 20 2a 2f 0a 20 20 20 20 72 62 75  pData */.    rbu
25a80 56 66 73 4f 70 65 6e 2c 20 20 20 20 20 20 20 20  VfsOpen,        
25a90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4f             /* xO
25aa0 70 65 6e 20 2a 2f 0a 20 20 20 20 72 62 75 56 66  pen */.    rbuVf
25ab0 73 44 65 6c 65 74 65 2c 20 20 20 20 20 20 20 20  sDelete,        
25ac0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 65 6c           /* xDel
25ad0 65 74 65 20 2a 2f 0a 20 20 20 20 72 62 75 56 66  ete */.    rbuVf
25ae0 73 41 63 63 65 73 73 2c 20 20 20 20 20 20 20 20  sAccess,        
25af0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 41 63 63           /* xAcc
25b00 65 73 73 20 2a 2f 0a 20 20 20 20 72 62 75 56 66  ess */.    rbuVf
25b10 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20  sFullPathname,  
25b20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 75 6c           /* xFul
25b30 6c 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 0a 23 69  lPathname */..#i
25b40 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
25b50 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  T_LOAD_EXTENSION
25b60 0a 20 20 20 20 72 62 75 56 66 73 44 6c 4f 70 65  .    rbuVfsDlOpe
25b70 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
25b80 20 20 20 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f     /* xDlOpen */
25b90 0a 20 20 20 20 72 62 75 56 66 73 44 6c 45 72 72  .    rbuVfsDlErr
25ba0 6f 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  or,             
25bb0 20 20 20 2f 2a 20 78 44 6c 45 72 72 6f 72 20 2a     /* xDlError *
25bc0 2f 0a 20 20 20 20 72 62 75 56 66 73 44 6c 53 79  /.    rbuVfsDlSy
25bd0 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m,              
25be0 20 20 20 20 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f      /* xDlSym */
25bf0 0a 20 20 20 20 72 62 75 56 66 73 44 6c 43 6c 6f  .    rbuVfsDlClo
25c00 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
25c10 20 20 20 2f 2a 20 78 44 6c 43 6c 6f 73 65 20 2a     /* xDlClose *
25c20 2f 0a 23 65 6c 73 65 0a 20 20 20 20 30 2c 20 30  /.#else.    0, 0
25c30 2c 20 30 2c 20 30 2c 0a 23 65 6e 64 69 66 0a 0a  , 0, 0,.#endif..
25c40 20 20 20 20 72 62 75 56 66 73 52 61 6e 64 6f 6d      rbuVfsRandom
25c50 6e 65 73 73 2c 20 20 20 20 20 20 20 20 20 20 20  ness,           
25c60 20 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65 73 73    /* xRandomness
25c70 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 53 6c   */.    rbuVfsSl
25c80 65 65 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  eep,            
25c90 20 20 20 20 20 20 2f 2a 20 78 53 6c 65 65 70 20        /* xSleep 
25ca0 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 43 75 72  */.    rbuVfsCur
25cb0 72 65 6e 74 54 69 6d 65 2c 20 20 20 20 20 20 20  rentTime,       
25cc0 20 20 20 20 20 2f 2a 20 78 43 75 72 72 65 6e 74       /* xCurrent
25cd0 54 69 6d 65 20 2a 2f 0a 20 20 20 20 72 62 75 56  Time */.    rbuV
25ce0 66 73 47 65 74 4c 61 73 74 45 72 72 6f 72 2c 20  fsGetLastError, 
25cf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 47 65            /* xGe
25d00 74 4c 61 73 74 45 72 72 6f 72 20 2a 2f 0a 20 20  tLastError */.  
25d10 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
25d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25d30 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65 49  /* xCurrentTimeI
25d40 6e 74 36 34 20 28 76 65 72 73 69 6f 6e 20 32 29  nt64 (version 2)
25d50 20 2a 2f 0a 20 20 20 20 30 2c 20 30 2c 20 30 20   */.    0, 0, 0 
25d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25d70 20 20 20 20 20 20 2f 2a 20 55 6e 69 6d 70 6c 65        /* Unimple
25d80 6d 65 6e 74 65 64 20 76 65 72 73 69 6f 6e 20 33  mented version 3
25d90 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 20 20 7d 3b   methods */.  };
25da0 0a 0a 20 20 72 62 75 5f 76 66 73 20 2a 70 4e 65  ..  rbu_vfs *pNe
25db0 77 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  w = 0;          
25dc0 20 20 20 20 2f 2a 20 4e 65 77 6c 79 20 61 6c 6c      /* Newly all
25dd0 6f 63 61 74 65 64 20 56 46 53 20 2a 2f 0a 20 20  ocated VFS */.  
25de0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
25df0 4f 4b 3b 0a 20 20 73 69 7a 65 5f 74 20 6e 4e 61  OK;.  size_t nNa
25e00 6d 65 3b 0a 20 20 73 69 7a 65 5f 74 20 6e 42 79  me;.  size_t nBy
25e10 74 65 3b 0a 0a 20 20 6e 4e 61 6d 65 20 3d 20 73  te;..  nName = s
25e20 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20  trlen(zName);.  
25e30 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 72  nByte = sizeof(r
25e40 62 75 5f 76 66 73 29 20 2b 20 6e 4e 61 6d 65 20  bu_vfs) + nName 
25e50 2b 20 31 3b 0a 20 20 70 4e 65 77 20 3d 20 28 72  + 1;.  pNew = (r
25e60 62 75 5f 76 66 73 2a 29 73 71 6c 69 74 65 33 5f  bu_vfs*)sqlite3_
25e70 6d 61 6c 6c 6f 63 36 34 28 6e 42 79 74 65 29 3b  malloc64(nByte);
25e80 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
25e90 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
25ea0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65  E_NOMEM;.  }else
25eb0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66  {.    sqlite3_vf
25ec0 73 20 2a 70 50 61 72 65 6e 74 3b 20 20 20 20 20  s *pParent;     
25ed0 20 20 20 20 20 20 2f 2a 20 50 61 72 65 6e 74 20        /* Parent 
25ee0 56 46 53 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65  VFS */.    memse
25ef0 74 28 70 4e 65 77 2c 20 30 2c 20 6e 42 79 74 65  t(pNew, 0, nByte
25f00 29 3b 0a 20 20 20 20 70 50 61 72 65 6e 74 20 3d  );.    pParent =
25f10 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e   sqlite3_vfs_fin
25f20 64 28 7a 50 61 72 65 6e 74 29 3b 0a 20 20 20 20  d(zParent);.    
25f30 69 66 28 20 70 50 61 72 65 6e 74 3d 3d 30 20 29  if( pParent==0 )
25f40 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
25f50 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20  ITE_NOTFOUND;.  
25f60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
25f70 68 61 72 20 2a 7a 53 70 61 63 65 3b 0a 20 20 20  har *zSpace;.   
25f80 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 2d     memcpy(&pNew-
25f90 3e 62 61 73 65 2c 20 26 76 66 73 5f 74 65 6d 70  >base, &vfs_temp
25fa0 6c 61 74 65 2c 20 73 69 7a 65 6f 66 28 73 71 6c  late, sizeof(sql
25fb0 69 74 65 33 5f 76 66 73 29 29 3b 0a 20 20 20 20  ite3_vfs));.    
25fc0 20 20 70 4e 65 77 2d 3e 62 61 73 65 2e 6d 78 50    pNew->base.mxP
25fd0 61 74 68 6e 61 6d 65 20 3d 20 70 50 61 72 65 6e  athname = pParen
25fe0 74 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 3b 0a 20  t->mxPathname;. 
25ff0 20 20 20 20 20 70 4e 65 77 2d 3e 62 61 73 65 2e       pNew->base.
26000 73 7a 4f 73 46 69 6c 65 20 3d 20 73 69 7a 65 6f  szOsFile = sizeo
26010 66 28 72 62 75 5f 66 69 6c 65 29 20 2b 20 70 50  f(rbu_file) + pP
26020 61 72 65 6e 74 2d 3e 73 7a 4f 73 46 69 6c 65 3b  arent->szOsFile;
26030 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 52 65  .      pNew->pRe
26040 61 6c 56 66 73 20 3d 20 70 50 61 72 65 6e 74 3b  alVfs = pParent;
26050 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 62 61 73  .      pNew->bas
26060 65 2e 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74  e.zName = (const
26070 20 63 68 61 72 2a 29 28 7a 53 70 61 63 65 20 3d   char*)(zSpace =
26080 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d   (char*)&pNew[1]
26090 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
260a0 7a 53 70 61 63 65 2c 20 7a 4e 61 6d 65 2c 20 6e  zSpace, zName, n
260b0 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  Name);..      /*
260c0 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 6d 75   Allocate the mu
260d0 74 65 78 20 61 6e 64 20 72 65 67 69 73 74 65 72  tex and register
260e0 20 74 68 65 20 6e 65 77 20 56 46 53 20 28 6e 6f   the new VFS (no
260f0 74 20 61 73 20 74 68 65 20 64 65 66 61 75 6c 74  t as the default
26100 29 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d  ) */.      pNew-
26110 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33  >mutex = sqlite3
26120 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c  _mutex_alloc(SQL
26130 49 54 45 5f 4d 55 54 45 58 5f 52 45 43 55 52 53  ITE_MUTEX_RECURS
26140 49 56 45 29 3b 0a 20 20 20 20 20 20 69 66 28 20  IVE);.      if( 
26150 70 4e 65 77 2d 3e 6d 75 74 65 78 3d 3d 30 20 29  pNew->mutex==0 )
26160 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
26170 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
26180 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
26190 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 76    rc = sqlite3_v
261a0 66 73 5f 72 65 67 69 73 74 65 72 28 26 70 4e 65  fs_register(&pNe
261b0 77 2d 3e 62 61 73 65 2c 20 30 29 3b 0a 20 20 20  w->base, 0);.   
261c0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
261d0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
261e0 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
261f0 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 4e  e3_mutex_free(pN
26200 65 77 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20  ew->mutex);.    
26210 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
26220 4e 65 77 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  New);.    }.  }.
26230 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
26240 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65  ./*.** Configure
26250 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 74   the aggregate t
26260 65 6d 70 20 66 69 6c 65 20 73 69 7a 65 20 6c 69  emp file size li
26270 6d 69 74 20 66 6f 72 20 74 68 69 73 20 52 42 55  mit for this RBU
26280 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 71 6c 69   handle..*/.sqli
26290 74 65 33 5f 69 6e 74 36 34 20 73 71 6c 69 74 65  te3_int64 sqlite
262a0 33 72 62 75 5f 74 65 6d 70 5f 73 69 7a 65 5f 6c  3rbu_temp_size_l
262b0 69 6d 69 74 28 73 71 6c 69 74 65 33 72 62 75 20  imit(sqlite3rbu 
262c0 2a 70 52 62 75 2c 20 73 71 6c 69 74 65 33 5f 69  *pRbu, sqlite3_i
262d0 6e 74 36 34 20 6e 29 7b 0a 20 20 69 66 28 20 6e  nt64 n){.  if( n
262e0 3e 3d 30 20 29 7b 0a 20 20 20 20 70 52 62 75 2d  >=0 ){.    pRbu-
262f0 3e 73 7a 54 65 6d 70 4c 69 6d 69 74 20 3d 20 6e  >szTempLimit = n
26300 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
26310 52 62 75 2d 3e 73 7a 54 65 6d 70 4c 69 6d 69 74  Rbu->szTempLimit
26320 3b 0a 7d 0a 0a 73 71 6c 69 74 65 33 5f 69 6e 74  ;.}..sqlite3_int
26330 36 34 20 73 71 6c 69 74 65 33 72 62 75 5f 74 65  64 sqlite3rbu_te
26340 6d 70 5f 73 69 7a 65 28 73 71 6c 69 74 65 33 72  mp_size(sqlite3r
26350 62 75 20 2a 70 52 62 75 29 7b 0a 20 20 72 65 74  bu *pRbu){.  ret
26360 75 72 6e 20 70 52 62 75 2d 3e 73 7a 54 65 6d 70  urn pRbu->szTemp
26370 3b 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.}.../*********
26380 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26390 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
263a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
263b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
263c0 2a 2f 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  */..#endif /* !d
263d0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 43 4f  efined(SQLITE_CO
263e0 52 45 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  RE) || defined(S
263f0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 52 42 55  QLITE_ENABLE_RBU
26400 29 20 2a 2f 0a                                   ) */.