/ Hex Artifact Content
Login

Artifact bb0de6cdbdb14a7d55a097238a434b7e99caf318:


0000: 2f 2a 0a 2a 2a 20 32 30 31 34 20 41 75 67 75 73  /*.** 2014 Augus
0010: 74 20 33 30 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  t 30.**.** The a
0020: 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20  uthor disclaims 
0030: 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74 68 69  copyright to thi
0040: 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20  s source code.  
0050: 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61  In place of.** a
0060: 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68   legal notice, h
0070: 65 72 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e  ere is a blessin
0080: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20  g:.**.**    May 
0090: 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20  you do good and 
00a0: 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20  not evil..**    
00b0: 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72  May you find for
00c0: 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75  giveness for you
00d0: 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76  rself and forgiv
00e0: 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20  e others..**    
00f0: 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20 66 72  May you share fr
0100: 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69  eely, never taki
0110: 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75  ng more than you
0120: 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a   give..**.******
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 56 45  ***.**.**.** OVE
0180: 52 56 49 45 57 20 0a 2a 2a 0a 2a 2a 20 20 54 68  RVIEW .**.**  Th
0190: 65 20 52 42 55 20 65 78 74 65 6e 73 69 6f 6e 20  e RBU extension 
01a0: 72 65 71 75 69 72 65 73 20 74 68 61 74 20 74 68  requires that th
01b0: 65 20 52 42 55 20 75 70 64 61 74 65 20 62 65 20  e RBU update be 
01c0: 70 61 63 6b 61 67 65 64 20 61 73 20 61 6e 0a 2a  packaged as an.*
01d0: 2a 20 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  *  SQLite databa
01e0: 73 65 2e 20 54 68 65 20 74 61 62 6c 65 73 20 69  se. The tables i
01f0: 74 20 65 78 70 65 63 74 73 20 74 6f 20 66 69 6e  t expects to fin
0200: 64 20 61 72 65 20 64 65 73 63 72 69 62 65 64 20  d are described 
0210: 69 6e 0a 2a 2a 20 20 73 71 6c 69 74 65 33 72 62  in.**  sqlite3rb
0220: 75 2e 68 2e 20 20 45 73 73 65 6e 74 69 61 6c 6c  u.h.  Essentiall
0230: 79 2c 20 66 6f 72 20 65 61 63 68 20 74 61 62 6c  y, for each tabl
0240: 65 20 78 79 7a 20 69 6e 20 74 68 65 20 74 61 72  e xyz in the tar
0250: 67 65 74 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  get database.** 
0260: 20 74 68 61 74 20 74 68 65 20 75 73 65 72 20 77   that the user w
0270: 69 73 68 65 73 20 74 6f 20 77 72 69 74 65 20 74  ishes to write t
0280: 6f 2c 20 61 20 63 6f 72 72 65 73 70 6f 6e 64 69  o, a correspondi
0290: 6e 67 20 64 61 74 61 5f 78 79 7a 20 74 61 62 6c  ng data_xyz tabl
02a0: 65 20 69 73 0a 2a 2a 20 20 63 72 65 61 74 65 64  e is.**  created
02b0: 20 69 6e 20 74 68 65 20 52 42 55 20 64 61 74 61   in the RBU data
02c0: 62 61 73 65 20 61 6e 64 20 70 6f 70 75 6c 61 74  base and populat
02d0: 65 64 20 77 69 74 68 20 6f 6e 65 20 72 6f 77 20  ed with one row 
02e0: 66 6f 72 20 65 61 63 68 20 72 6f 77 20 74 6f 0a  for each row to.
02f0: 2a 2a 20 20 75 70 64 61 74 65 2c 20 69 6e 73 65  **  update, inse
0300: 72 74 20 6f 72 20 64 65 6c 65 74 65 20 66 72 6f  rt or delete fro
0310: 6d 20 74 68 65 20 74 61 72 67 65 74 20 74 61 62  m the target tab
0320: 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 20 54 68 65 20  le..** .**  The 
0330: 75 70 64 61 74 65 20 70 72 6f 63 65 65 64 73 20  update proceeds 
0340: 69 6e 20 74 68 72 65 65 20 73 74 61 67 65 73 3a  in three stages:
0350: 0a 2a 2a 20 0a 2a 2a 20 20 31 29 20 54 68 65 20  .** .**  1) The 
0360: 64 61 74 61 62 61 73 65 20 69 73 20 75 70 64 61  database is upda
0370: 74 65 64 2e 20 54 68 65 20 6d 6f 64 69 66 69 65  ted. The modifie
0380: 64 20 64 61 74 61 62 61 73 65 20 70 61 67 65 73  d database pages
0390: 20 61 72 65 20 77 72 69 74 74 65 6e 0a 2a 2a 20   are written.** 
03a0: 20 20 20 20 74 6f 20 61 20 2a 2d 6f 61 6c 20 66      to a *-oal f
03b0: 69 6c 65 2e 20 41 20 2a 2d 6f 61 6c 20 66 69 6c  ile. A *-oal fil
03c0: 65 20 69 73 20 6a 75 73 74 20 6c 69 6b 65 20 61  e is just like a
03d0: 20 2a 2d 77 61 6c 20 66 69 6c 65 2c 20 65 78 63   *-wal file, exc
03e0: 65 70 74 0a 2a 2a 20 20 20 20 20 74 68 61 74 20  ept.**     that 
03f0: 69 74 20 69 73 20 6e 61 6d 65 64 20 22 3c 64 61  it is named "<da
0400: 74 61 62 61 73 65 3e 2d 6f 61 6c 22 20 69 6e 73  tabase>-oal" ins
0410: 74 65 61 64 20 6f 66 20 22 3c 64 61 74 61 62 61  tead of "<databa
0420: 73 65 3e 2d 77 61 6c 22 2e 0a 2a 2a 20 20 20 20  se>-wal"..**    
0430: 20 42 65 63 61 75 73 65 20 72 65 67 75 6c 61 72   Because regular
0440: 20 53 51 4c 69 74 65 20 63 6c 69 65 6e 74 73 20   SQLite clients 
0450: 64 6f 20 6e 6f 74 20 6c 6f 6f 6b 20 66 6f 72 20  do not look for 
0460: 66 69 6c 65 20 6e 61 6d 65 64 0a 2a 2a 20 20 20  file named.**   
0470: 20 20 22 3c 64 61 74 61 62 61 73 65 3e 2d 6f 61    "<database>-oa
0480: 6c 22 2c 20 74 68 65 79 20 67 6f 20 6f 6e 20 75  l", they go on u
0490: 73 69 6e 67 20 74 68 65 20 6f 72 69 67 69 6e 61  sing the origina
04a0: 6c 20 64 61 74 61 62 61 73 65 20 69 6e 0a 2a 2a  l database in.**
04b0: 20 20 20 20 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f       rollback mo
04c0: 64 65 20 77 68 69 6c 65 20 74 68 65 20 2a 2d 6f  de while the *-o
04d0: 61 6c 20 66 69 6c 65 20 69 73 20 62 65 69 6e 67  al file is being
04e0: 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2a 20 0a   generated..** .
04f0: 2a 2a 20 20 20 20 20 44 75 72 69 6e 67 20 74 68  **     During th
0500: 69 73 20 73 74 61 67 65 20 52 42 55 20 64 6f 65  is stage RBU doe
0510: 73 20 6e 6f 74 20 75 70 64 61 74 65 20 74 68 65  s not update the
0520: 20 64 61 74 61 62 61 73 65 20 62 79 20 77 72 69   database by wri
0530: 74 69 6e 67 0a 2a 2a 20 20 20 20 20 64 69 72 65  ting.**     dire
0540: 63 74 6c 79 20 74 6f 20 74 68 65 20 74 61 72 67  ctly to the targ
0550: 65 74 20 74 61 62 6c 65 73 2e 20 49 6e 73 74 65  et tables. Inste
0560: 61 64 20 69 74 20 63 72 65 61 74 65 73 20 22 69  ad it creates "i
0570: 6d 70 6f 73 74 65 72 22 0a 2a 2a 20 20 20 20 20  mposter".**     
0580: 74 61 62 6c 65 73 20 75 73 69 6e 67 20 74 68 65  tables using the
0590: 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
05a0: 5f 49 4d 50 4f 53 54 45 52 20 69 6e 74 65 72 66  _IMPOSTER interf
05b0: 61 63 65 20 74 68 61 74 20 69 74 20 75 73 65 73  ace that it uses
05c0: 0a 2a 2a 20 20 20 20 20 74 6f 20 75 70 64 61 74  .**     to updat
05d0: 65 20 65 61 63 68 20 62 2d 74 72 65 65 20 69 6e  e each b-tree in
05e0: 64 69 76 69 64 75 61 6c 6c 79 2e 20 41 6c 6c 20  dividually. All 
05f0: 75 70 64 61 74 65 73 20 72 65 71 75 69 72 65 64  updates required
0600: 20 62 79 20 65 61 63 68 0a 2a 2a 20 20 20 20 20   by each.**     
0610: 62 2d 74 72 65 65 20 61 72 65 20 63 6f 6d 70 6c  b-tree are compl
0620: 65 74 65 64 20 62 65 66 6f 72 65 20 6d 6f 76 69  eted before movi
0630: 6e 67 20 6f 6e 20 74 6f 20 74 68 65 20 6e 65 78  ng on to the nex
0640: 74 2c 20 61 6e 64 20 61 6c 6c 0a 2a 2a 20 20 20  t, and all.**   
0650: 20 20 75 70 64 61 74 65 73 20 61 72 65 20 64 6f    updates are do
0660: 6e 65 20 69 6e 20 73 6f 72 74 65 64 20 6b 65 79  ne in sorted key
0670: 20 6f 72 64 65 72 2e 0a 2a 2a 20 0a 2a 2a 20 20   order..** .**  
0680: 32 29 20 54 68 65 20 22 3c 64 61 74 61 62 61 73  2) The "<databas
0690: 65 3e 2d 6f 61 6c 22 20 66 69 6c 65 20 69 73 20  e>-oal" file is 
06a0: 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 65 71 75  moved to the equ
06b0: 69 76 61 6c 65 6e 74 20 22 3c 64 61 74 61 62 61  ivalent "<databa
06c0: 73 65 3e 2d 77 61 6c 22 0a 2a 2a 20 20 20 20 20  se>-wal".**     
06d0: 6c 6f 63 61 74 69 6f 6e 20 75 73 69 6e 67 20 61  location using a
06e0: 20 63 61 6c 6c 20 74 6f 20 72 65 6e 61 6d 65 28   call to rename(
06f0: 32 29 2e 20 42 65 66 6f 72 65 20 64 6f 69 6e 67  2). Before doing
0700: 20 74 68 69 73 20 74 68 65 20 52 42 55 0a 2a 2a   this the RBU.**
0710: 20 20 20 20 20 6d 6f 64 75 6c 65 20 74 61 6b 65       module take
0720: 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  s an EXCLUSIVE l
0730: 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
0740: 61 73 65 20 66 69 6c 65 2c 20 65 6e 73 75 72 69  ase file, ensuri
0750: 6e 67 0a 2a 2a 20 20 20 20 20 74 68 61 74 20 74  ng.**     that t
0760: 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 74 68 65  here are no othe
0770: 72 20 61 63 74 69 76 65 20 72 65 61 64 65 72 73  r active readers
0780: 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 4f 6e 63  ..** .**     Onc
0790: 65 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 20  e the EXCLUSIVE 
07a0: 6c 6f 63 6b 20 69 73 20 72 65 6c 65 61 73 65 64  lock is released
07b0: 2c 20 61 6e 79 20 6f 74 68 65 72 20 64 61 74 61  , any other data
07c0: 62 61 73 65 20 72 65 61 64 65 72 73 0a 2a 2a 20  base readers.** 
07d0: 20 20 20 20 64 65 74 65 63 74 20 74 68 65 20 6e      detect the n
07e0: 65 77 20 2a 2d 77 61 6c 20 66 69 6c 65 20 61 6e  ew *-wal file an
07f0: 64 20 72 65 61 64 20 74 68 65 20 64 61 74 61 62  d read the datab
0800: 61 73 65 20 69 6e 20 77 61 6c 20 6d 6f 64 65 2e  ase in wal mode.
0810: 20 41 74 0a 2a 2a 20 20 20 20 20 74 68 69 73 20   At.**     this 
0820: 70 6f 69 6e 74 20 74 68 65 79 20 73 65 65 20 74  point they see t
0830: 68 65 20 6e 65 77 20 76 65 72 73 69 6f 6e 20 6f  he new version o
0840: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2d  f the database -
0850: 20 69 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20 20 20   including.**   
0860: 20 20 74 68 65 20 75 70 64 61 74 65 73 20 6d 61    the updates ma
0870: 64 65 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  de as part of th
0880: 65 20 52 42 55 20 75 70 64 61 74 65 2e 0a 2a 2a  e RBU update..**
0890: 20 0a 2a 2a 20 20 33 29 20 54 68 65 20 6e 65 77   .**  3) The new
08a0: 20 2a 2d 77 61 6c 20 66 69 6c 65 20 69 73 20 63   *-wal file is c
08b0: 68 65 63 6b 70 6f 69 6e 74 65 64 2e 20 54 68 69  heckpointed. Thi
08c0: 73 20 70 72 6f 63 65 65 64 73 20 69 6e 20 74 68  s proceeds in th
08d0: 65 20 73 61 6d 65 20 77 61 79 20 0a 2a 2a 20 20  e same way .**  
08e0: 20 20 20 61 73 20 61 20 72 65 67 75 6c 61 72 20     as a regular 
08f0: 64 61 74 61 62 61 73 65 20 63 68 65 63 6b 70 6f  database checkpo
0900: 69 6e 74 2c 20 65 78 63 65 70 74 20 74 68 61 74  int, except that
0910: 20 61 20 73 69 6e 67 6c 65 20 66 72 61 6d 65 20   a single frame 
0920: 69 73 0a 2a 2a 20 20 20 20 20 63 68 65 63 6b 70  is.**     checkp
0930: 6f 69 6e 74 65 64 20 65 61 63 68 20 74 69 6d 65  ointed each time
0940: 20 73 71 6c 69 74 65 33 72 62 75 5f 73 74 65 70   sqlite3rbu_step
0950: 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 20 49 66  () is called. If
0960: 20 74 68 65 20 52 42 55 0a 2a 2a 20 20 20 20 20   the RBU.**     
0970: 68 61 6e 64 6c 65 20 69 73 20 63 6c 6f 73 65 64  handle is closed
0980: 20 62 65 66 6f 72 65 20 74 68 65 20 65 6e 74 69   before the enti
0990: 72 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 69 73  re *-wal file is
09a0: 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 2c 0a 2a   checkpointed,.*
09b0: 2a 20 20 20 20 20 74 68 65 20 63 68 65 63 6b 70  *     the checkp
09c0: 6f 69 6e 74 20 70 72 6f 67 72 65 73 73 20 69 73  oint progress is
09d0: 20 73 61 76 65 64 20 69 6e 20 74 68 65 20 52 42   saved in the RB
09e0: 55 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74  U database and t
09f0: 68 65 0a 2a 2a 20 20 20 20 20 63 68 65 63 6b 70  he.**     checkp
0a00: 6f 69 6e 74 20 63 61 6e 20 62 65 20 72 65 73 75  oint can be resu
0a10: 6d 65 64 20 62 79 20 61 6e 6f 74 68 65 72 20 52  med by another R
0a20: 42 55 20 63 6c 69 65 6e 74 20 61 74 20 73 6f 6d  BU client at som
0a30: 65 20 70 6f 69 6e 74 20 69 6e 0a 2a 2a 20 20 20  e point in.**   
0a40: 20 20 74 68 65 20 66 75 74 75 72 65 2e 0a 2a 2a    the future..**
0a50: 0a 2a 2a 20 50 4f 54 45 4e 54 49 41 4c 20 50 52  .** POTENTIAL PR
0a60: 4f 42 4c 45 4d 53 0a 2a 2a 20 0a 2a 2a 20 20 54  OBLEMS.** .**  T
0a70: 68 65 20 72 65 6e 61 6d 65 28 29 20 63 61 6c 6c  he rename() call
0a80: 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 70 6f   might not be po
0a90: 72 74 61 62 6c 65 2e 20 41 6e 64 20 52 42 55 20  rtable. And RBU 
0aa0: 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  is not currently
0ab0: 0a 2a 2a 20 20 73 79 6e 63 69 6e 67 20 74 68 65  .**  syncing the
0ac0: 20 64 69 72 65 63 74 6f 72 79 20 61 66 74 65 72   directory after
0ad0: 20 72 65 6e 61 6d 69 6e 67 20 74 68 65 20 66 69   renaming the fi
0ae0: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 57 68 65 6e 20  le..**.**  When 
0af0: 73 74 61 74 65 20 69 73 20 73 61 76 65 64 2c 20  state is saved, 
0b00: 61 6e 79 20 63 6f 6d 6d 69 74 20 74 6f 20 74 68  any commit to th
0b10: 65 20 2a 2d 6f 61 6c 20 66 69 6c 65 20 61 6e 64  e *-oal file and
0b20: 20 74 68 65 20 63 6f 6d 6d 69 74 20 74 6f 0a 2a   the commit to.*
0b30: 2a 20 20 74 68 65 20 52 42 55 20 75 70 64 61 74  *  the RBU updat
0b40: 65 20 64 61 74 61 62 61 73 65 20 61 72 65 20 6e  e database are n
0b50: 6f 74 20 61 74 6f 6d 69 63 2e 20 53 6f 20 69 66  ot atomic. So if
0b60: 20 74 68 65 20 70 6f 77 65 72 20 66 61 69 6c 73   the power fails
0b70: 20 61 74 20 74 68 65 0a 2a 2a 20 20 77 72 6f 6e   at the.**  wron
0b80: 67 20 6d 6f 6d 65 6e 74 20 74 68 65 79 20 6d 69  g moment they mi
0b90: 67 68 74 20 67 65 74 20 6f 75 74 20 6f 66 20 73  ght get out of s
0ba0: 79 6e 63 2e 20 41 73 20 74 68 65 20 6d 61 69 6e  ync. As the main
0bb0: 20 64 61 74 61 62 61 73 65 20 77 69 6c 6c 20 62   database will b
0bc0: 65 0a 2a 2a 20 20 63 6f 6d 6d 69 74 74 65 64 20  e.**  committed 
0bd0: 62 65 66 6f 72 65 20 74 68 65 20 52 42 55 20 75  before the RBU u
0be0: 70 64 61 74 65 20 64 61 74 61 62 61 73 65 20 74  pdate database t
0bf0: 68 69 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20  his will likely 
0c00: 65 69 74 68 65 72 20 6a 75 73 74 0a 2a 2a 20 20  either just.**  
0c10: 70 61 73 73 20 75 6e 6e 6f 74 69 63 65 64 2c 20  pass unnoticed, 
0c20: 6f 72 20 72 65 73 75 6c 74 20 69 6e 20 53 51 4c  or result in SQL
0c30: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 65  ITE_CONSTRAINT e
0c40: 72 72 6f 72 73 20 28 64 75 65 20 74 6f 20 55 4e  rrors (due to UN
0c50: 49 51 55 45 0a 2a 2a 20 20 63 6f 6e 73 74 72 61  IQUE.**  constra
0c60: 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 73 29 2e  int violations).
0c70: 0a 2a 2a 0a 2a 2a 20 20 49 66 20 73 6f 6d 65 20  .**.**  If some 
0c80: 63 6c 69 65 6e 74 20 64 6f 65 73 20 6d 6f 64 69  client does modi
0c90: 66 79 20 74 68 65 20 74 61 72 67 65 74 20 64 61  fy the target da
0ca0: 74 61 62 61 73 65 20 6d 69 64 20 52 42 55 20 75  tabase mid RBU u
0cb0: 70 64 61 74 65 2c 20 6f 72 20 73 6f 6d 65 0a 2a  pdate, or some.*
0cc0: 2a 20 20 6f 74 68 65 72 20 65 72 72 6f 72 20 6f  *  other error o
0cd0: 63 63 75 72 73 2c 20 74 68 65 20 52 42 55 20 65  ccurs, the RBU e
0ce0: 78 74 65 6e 73 69 6f 6e 20 77 69 6c 6c 20 6b 65  xtension will ke
0cf0: 65 70 20 74 68 72 6f 77 69 6e 67 20 65 72 72 6f  ep throwing erro
0d00: 72 73 2e 20 49 74 27 73 0a 2a 2a 20 20 6e 6f 74  rs. It's.**  not
0d10: 20 72 65 61 6c 6c 79 20 63 6c 65 61 72 20 68 6f   really clear ho
0d20: 77 20 74 6f 20 67 65 74 20 6f 75 74 20 6f 66 20  w to get out of 
0d30: 74 68 69 73 20 73 74 61 74 65 2e 20 54 68 65 20  this state. The 
0d40: 73 79 73 74 65 6d 20 63 6f 75 6c 64 20 6a 75 73  system could jus
0d50: 74 0a 2a 2a 20 20 62 79 20 64 65 6c 65 74 65 20  t.**  by delete 
0d60: 74 68 65 20 52 42 55 20 75 70 64 61 74 65 20 64  the RBU update d
0d70: 61 74 61 62 61 73 65 20 61 6e 64 20 2a 2d 6f 61  atabase and *-oa
0d80: 6c 20 66 69 6c 65 20 61 6e 64 20 68 61 76 65 20  l file and have 
0d90: 74 68 65 20 64 65 76 69 63 65 0a 2a 2a 20 20 64  the device.**  d
0da0: 6f 77 6e 6c 6f 61 64 20 74 68 65 20 75 70 64 61  ownload the upda
0db0: 74 65 20 61 67 61 69 6e 20 61 6e 64 20 73 74 61  te again and sta
0dc0: 72 74 20 6f 76 65 72 2e 0a 2a 2a 0a 2a 2a 20 20  rt over..**.**  
0dd0: 41 74 20 70 72 65 73 65 6e 74 2c 20 66 6f 72 20  At present, for 
0de0: 61 6e 20 55 50 44 41 54 45 2c 20 62 6f 74 68 20  an UPDATE, both 
0df0: 74 68 65 20 6e 65 77 2e 2a 20 61 6e 64 20 6f 6c  the new.* and ol
0e00: 64 2e 2a 20 72 65 63 6f 72 64 73 20 61 72 65 0a  d.* records are.
0e10: 2a 2a 20 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e  **  collected in
0e20: 20 74 68 65 20 72 62 75 5f 78 79 7a 20 74 61 62   the rbu_xyz tab
0e30: 6c 65 2e 20 41 6e 64 20 66 6f 72 20 62 6f 74 68  le. And for both
0e40: 20 55 50 44 41 54 45 73 20 61 6e 64 20 44 45 4c   UPDATEs and DEL
0e50: 45 54 45 73 20 61 6c 6c 0a 2a 2a 20 20 66 69 65  ETEs all.**  fie
0e60: 6c 64 73 20 61 72 65 20 63 6f 6c 6c 65 63 74 65  lds are collecte
0e70: 64 2e 20 20 54 68 69 73 20 6d 65 61 6e 73 20 77  d.  This means w
0e80: 65 27 72 65 20 70 72 6f 62 61 62 6c 79 20 77 72  e're probably wr
0e90: 69 74 69 6e 67 20 61 20 6c 6f 74 20 6d 6f 72 65  iting a lot more
0ea0: 0a 2a 2a 20 20 64 61 74 61 20 74 6f 20 64 69 73  .**  data to dis
0eb0: 6b 20 77 68 65 6e 20 73 61 76 69 6e 67 20 74 68  k when saving th
0ec0: 65 20 73 74 61 74 65 20 6f 66 20 61 6e 20 6f 6e  e state of an on
0ed0: 67 6f 69 6e 67 20 75 70 64 61 74 65 20 74 6f 20  going update to 
0ee0: 74 68 65 20 52 42 55 0a 2a 2a 20 20 75 70 64 61  the RBU.**  upda
0ef0: 74 65 20 64 61 74 61 62 61 73 65 20 74 68 61 6e  te database than
0f00: 20 69 73 20 73 74 72 69 63 74 6c 79 20 6e 65 63   is strictly nec
0f10: 65 73 73 61 72 79 2e 0a 2a 2a 20 0a 2a 2f 0a 0a  essary..** .*/..
0f20: 23 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74  #include <assert
0f30: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74  .h>.#include <st
0f40: 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  ring.h>.#include
0f50: 20 3c 73 74 64 69 6f 2e 68 3e 0a 0a 23 69 6e 63   <stdio.h>..#inc
0f60: 6c 75 64 65 20 22 73 71 6c 69 74 65 33 2e 68 22  lude "sqlite3.h"
0f70: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
0f80: 51 4c 49 54 45 5f 43 4f 52 45 29 20 7c 7c 20 64  QLITE_CORE) || d
0f90: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
0fa0: 41 42 4c 45 5f 52 42 55 29 0a 23 69 6e 63 6c 75  ABLE_RBU).#inclu
0fb0: 64 65 20 22 73 71 6c 69 74 65 33 72 62 75 2e 68  de "sqlite3rbu.h
0fc0: 22 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  "..#if defined(_
0fd0: 57 49 4e 33 32 5f 57 43 45 29 0a 23 69 6e 63 6c  WIN32_WCE).#incl
0fe0: 75 64 65 20 22 77 69 6e 64 6f 77 73 2e 68 22 0a  ude "windows.h".
0ff0: 23 65 6e 64 69 66 0a 0a 2f 2a 20 4d 61 78 69 6d  #endif../* Maxim
1000: 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 70 72 65  um number of pre
1010: 70 61 72 65 64 20 55 50 44 41 54 45 20 73 74 61  pared UPDATE sta
1020: 74 65 6d 65 6e 74 73 20 68 65 6c 64 20 62 79 20  tements held by 
1030: 74 68 69 73 20 6d 6f 64 75 6c 65 20 2a 2f 0a 23  this module */.#
1040: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 52 42  define SQLITE_RB
1050: 55 5f 55 50 44 41 54 45 5f 43 41 43 48 45 53 49  U_UPDATE_CACHESI
1060: 5a 45 20 31 36 0a 0a 2f 2a 0a 2a 2a 20 53 77 61  ZE 16../*.** Swa
1070: 70 20 74 77 6f 20 6f 62 6a 65 63 74 73 20 6f 66  p two objects of
1080: 20 74 79 70 65 20 54 59 50 45 2e 0a 2a 2f 0a 23   type TYPE..*/.#
1090: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
10a0: 54 45 5f 41 4d 41 4c 47 41 4d 41 54 49 4f 4e 29  TE_AMALGAMATION)
10b0: 0a 23 20 64 65 66 69 6e 65 20 53 57 41 50 28 54  .# define SWAP(T
10c0: 59 50 45 2c 41 2c 42 29 20 7b 54 59 50 45 20 74  YPE,A,B) {TYPE t
10d0: 3d 41 3b 20 41 3d 42 3b 20 42 3d 74 3b 7d 0a 23  =A; A=B; B=t;}.#
10e0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
10f0: 20 72 62 75 5f 73 74 61 74 65 20 74 61 62 6c 65   rbu_state table
1100: 20 69 73 20 75 73 65 64 20 74 6f 20 73 61 76 65   is used to save
1110: 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 61 20   the state of a 
1120: 70 61 72 74 69 61 6c 6c 79 20 61 70 70 6c 69 65  partially applie
1130: 64 0a 2a 2a 20 75 70 64 61 74 65 20 73 6f 20 74  d.** update so t
1140: 68 61 74 20 69 74 20 63 61 6e 20 62 65 20 72 65  hat it can be re
1150: 73 75 6d 65 64 20 6c 61 74 65 72 2e 20 54 68 65  sumed later. The
1160: 20 74 61 62 6c 65 20 63 6f 6e 73 69 73 74 73 20   table consists 
1170: 6f 66 20 69 6e 74 65 67 65 72 0a 2a 2a 20 6b 65  of integer.** ke
1180: 79 73 20 6d 61 70 70 65 64 20 74 6f 20 76 61 6c  ys mapped to val
1190: 75 65 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ues as follows:.
11a0: 2a 2a 0a 2a 2a 20 52 42 55 5f 53 54 41 54 45 5f  **.** RBU_STATE_
11b0: 53 54 41 47 45 3a 0a 2a 2a 20 20 20 4d 61 79 20  STAGE:.**   May 
11c0: 62 65 20 73 65 74 20 74 6f 20 69 6e 74 65 67 65  be set to intege
11d0: 72 20 76 61 6c 75 65 73 20 31 2c 20 32 2c 20 34  r values 1, 2, 4
11e0: 20 6f 72 20 35 2e 20 41 73 20 66 6f 6c 6c 6f 77   or 5. As follow
11f0: 73 3a 0a 2a 2a 20 20 20 20 20 20 20 31 3a 20 74  s:.**       1: t
1200: 68 65 20 2a 2d 72 62 75 20 66 69 6c 65 20 69 73  he *-rbu file is
1210: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
1220: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a   construction..*
1230: 2a 20 20 20 20 20 20 20 32 3a 20 74 68 65 20 2a  *       2: the *
1240: 2d 72 62 75 20 66 69 6c 65 20 68 61 73 20 62 65  -rbu file has be
1250: 65 6e 20 63 6f 6e 73 74 72 75 63 74 65 64 2c 20  en constructed, 
1260: 62 75 74 20 6e 6f 74 20 79 65 74 20 6d 6f 76 65  but not yet move
1270: 64 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 74  d .**          t
1280: 6f 20 74 68 65 20 2a 2d 77 61 6c 20 70 61 74 68  o the *-wal path
1290: 2e 0a 2a 2a 20 20 20 20 20 20 20 34 3a 20 74 68  ..**       4: th
12a0: 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 73 20  e checkpoint is 
12b0: 75 6e 64 65 72 77 61 79 2e 0a 2a 2a 20 20 20 20  underway..**    
12c0: 20 20 20 35 3a 20 74 68 65 20 72 62 75 20 75 70     5: the rbu up
12d0: 64 61 74 65 20 68 61 73 20 62 65 65 6e 20 63 68  date has been ch
12e0: 65 63 6b 70 6f 69 6e 74 65 64 2e 0a 2a 2a 0a 2a  eckpointed..**.*
12f0: 2a 20 52 42 55 5f 53 54 41 54 45 5f 54 42 4c 3a  * RBU_STATE_TBL:
1300: 0a 2a 2a 20 20 20 4f 6e 6c 79 20 76 61 6c 69 64  .**   Only valid
1310: 20 69 66 20 53 54 41 47 45 3d 3d 31 2e 20 54 68   if STAGE==1. Th
1320: 65 20 74 61 72 67 65 74 20 64 61 74 61 62 61 73  e target databas
1330: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
1340: 62 6c 65 20 0a 2a 2a 20 20 20 63 75 72 72 65 6e  ble .**   curren
1350: 74 6c 79 20 62 65 69 6e 67 20 77 72 69 74 74 65  tly being writte
1360: 6e 2e 0a 2a 2a 0a 2a 2a 20 52 42 55 5f 53 54 41  n..**.** RBU_STA
1370: 54 45 5f 49 44 58 3a 0a 2a 2a 20 20 20 4f 6e 6c  TE_IDX:.**   Onl
1380: 79 20 76 61 6c 69 64 20 69 66 20 53 54 41 47 45  y valid if STAGE
1390: 3d 3d 31 2e 20 54 68 65 20 74 61 72 67 65 74 20  ==1. The target 
13a0: 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 6f 66  database name of
13b0: 20 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20 20   the index .**  
13c0: 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67   currently being
13d0: 20 77 72 69 74 74 65 6e 2c 20 6f 72 20 4e 55 4c   written, or NUL
13e0: 4c 20 69 66 20 74 68 65 20 6d 61 69 6e 20 74 61  L if the main ta
13f0: 62 6c 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ble is currently
1400: 20 62 65 69 6e 67 0a 2a 2a 20 20 20 75 70 64 61   being.**   upda
1410: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 42 55 5f 53  ted..**.** RBU_S
1420: 54 41 54 45 5f 52 4f 57 3a 0a 2a 2a 20 20 20 4f  TATE_ROW:.**   O
1430: 6e 6c 79 20 76 61 6c 69 64 20 69 66 20 53 54 41  nly valid if STA
1440: 47 45 3d 3d 31 2e 20 4e 75 6d 62 65 72 20 6f 66  GE==1. Number of
1450: 20 72 6f 77 73 20 61 6c 72 65 61 64 79 20 70 72   rows already pr
1460: 6f 63 65 73 73 65 64 20 66 6f 72 20 74 68 65 20  ocessed for the 
1470: 63 75 72 72 65 6e 74 0a 2a 2a 20 20 20 74 61 62  current.**   tab
1480: 6c 65 2f 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20  le/index..**.** 
1490: 52 42 55 5f 53 54 41 54 45 5f 50 52 4f 47 52 45  RBU_STATE_PROGRE
14a0: 53 53 3a 0a 2a 2a 20 20 20 54 72 62 75 6c 20 6e  SS:.**   Trbul n
14b0: 75 6d 62 65 72 20 6f 66 20 73 71 6c 69 74 65 33  umber of sqlite3
14c0: 72 62 75 5f 73 74 65 70 28 29 20 63 61 6c 6c 73  rbu_step() calls
14d0: 20 6d 61 64 65 20 73 6f 20 66 61 72 20 61 73 20   made so far as 
14e0: 70 61 72 74 20 6f 66 20 74 68 69 73 0a 2a 2a 20  part of this.** 
14f0: 20 20 72 62 75 20 75 70 64 61 74 65 2e 0a 2a 2a    rbu update..**
1500: 0a 2a 2a 20 52 42 55 5f 53 54 41 54 45 5f 43 4b  .** RBU_STATE_CK
1510: 50 54 3a 0a 2a 2a 20 20 20 56 61 6c 69 64 20 69  PT:.**   Valid i
1520: 66 20 53 54 41 47 45 3d 3d 34 2e 20 54 68 65 20  f STAGE==4. The 
1530: 36 34 2d 62 69 74 20 63 68 65 63 6b 73 75 6d 20  64-bit checksum 
1540: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1550: 74 68 65 20 77 61 6c 2d 69 6e 64 65 78 0a 2a 2a  the wal-index.**
1560: 20 20 20 68 65 61 64 65 72 20 63 72 65 61 74 65     header create
1570: 64 20 62 79 20 72 65 63 6f 76 65 72 69 6e 67 20  d by recovering 
1580: 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 2e 20  the *-wal file. 
1590: 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20  This is used to 
15a0: 64 65 74 65 63 74 0a 2a 2a 20 20 20 63 61 73 65  detect.**   case
15b0: 73 20 77 68 65 6e 20 61 6e 6f 74 68 65 72 20 63  s when another c
15c0: 6c 69 65 6e 74 20 61 70 70 65 6e 64 73 20 66 72  lient appends fr
15d0: 61 6d 65 73 20 74 6f 20 74 68 65 20 2a 2d 77 61  ames to the *-wa
15e0: 6c 20 66 69 6c 65 20 69 6e 20 74 68 65 0a 2a 2a  l file in the.**
15f0: 20 20 20 6d 69 64 64 6c 65 20 6f 66 20 61 6e 20     middle of an 
1600: 69 6e 63 72 65 6d 65 6e 74 61 6c 20 63 68 65 63  incremental chec
1610: 6b 70 6f 69 6e 74 20 28 61 6e 20 69 6e 63 72 65  kpoint (an incre
1620: 6d 65 6e 74 61 6c 20 63 68 65 63 6b 70 6f 69 6e  mental checkpoin
1630: 74 20 63 61 6e 6e 6f 74 0a 2a 2a 20 20 20 62 65  t cannot.**   be
1640: 20 63 6f 6e 74 69 6e 75 65 64 20 69 66 20 74 68   continued if th
1650: 69 73 20 68 61 70 70 65 6e 73 29 2e 0a 2a 2a 0a  is happens)..**.
1660: 2a 2a 20 52 42 55 5f 53 54 41 54 45 5f 43 4f 4f  ** RBU_STATE_COO
1670: 4b 49 45 3a 0a 2a 2a 20 20 20 56 61 6c 69 64 20  KIE:.**   Valid 
1680: 69 66 20 53 54 41 47 45 3d 3d 31 2e 20 54 68 65  if STAGE==1. The
1690: 20 63 75 72 72 65 6e 74 20 63 68 61 6e 67 65 2d   current change-
16a0: 63 6f 75 6e 74 65 72 20 63 6f 6f 6b 69 65 20 76  counter cookie v
16b0: 61 6c 75 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20  alue in the .** 
16c0: 20 20 74 61 72 67 65 74 20 64 62 20 66 69 6c 65    target db file
16d0: 2e 0a 2a 2a 0a 2a 2a 20 52 42 55 5f 53 54 41 54  ..**.** RBU_STAT
16e0: 45 5f 4f 41 4c 53 5a 3a 0a 2a 2a 20 20 20 56 61  E_OALSZ:.**   Va
16f0: 6c 69 64 20 69 66 20 53 54 41 47 45 3d 3d 31 2e  lid if STAGE==1.
1700: 20 54 68 65 20 73 69 7a 65 20 69 6e 20 62 79 74   The size in byt
1710: 65 73 20 6f 66 20 74 68 65 20 2a 2d 6f 61 6c 20  es of the *-oal 
1720: 66 69 6c 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  file..*/.#define
1730: 20 52 42 55 5f 53 54 41 54 45 5f 53 54 41 47 45   RBU_STATE_STAGE
1740: 20 20 20 20 20 20 20 20 31 0a 23 64 65 66 69 6e          1.#defin
1750: 65 20 52 42 55 5f 53 54 41 54 45 5f 54 42 4c 20  e RBU_STATE_TBL 
1760: 20 20 20 20 20 20 20 20 20 32 0a 23 64 65 66 69           2.#defi
1770: 6e 65 20 52 42 55 5f 53 54 41 54 45 5f 49 44 58  ne RBU_STATE_IDX
1780: 20 20 20 20 20 20 20 20 20 20 33 0a 23 64 65 66            3.#def
1790: 69 6e 65 20 52 42 55 5f 53 54 41 54 45 5f 52 4f  ine RBU_STATE_RO
17a0: 57 20 20 20 20 20 20 20 20 20 20 34 0a 23 64 65  W          4.#de
17b0: 66 69 6e 65 20 52 42 55 5f 53 54 41 54 45 5f 50  fine RBU_STATE_P
17c0: 52 4f 47 52 45 53 53 20 20 20 20 20 35 0a 23 64  ROGRESS     5.#d
17d0: 65 66 69 6e 65 20 52 42 55 5f 53 54 41 54 45 5f  efine RBU_STATE_
17e0: 43 4b 50 54 20 20 20 20 20 20 20 20 20 36 0a 23  CKPT         6.#
17f0: 64 65 66 69 6e 65 20 52 42 55 5f 53 54 41 54 45  define RBU_STATE
1800: 5f 43 4f 4f 4b 49 45 20 20 20 20 20 20 20 37 0a  _COOKIE       7.
1810: 23 64 65 66 69 6e 65 20 52 42 55 5f 53 54 41 54  #define RBU_STAT
1820: 45 5f 4f 41 4c 53 5a 20 20 20 20 20 20 20 20 38  E_OALSZ        8
1830: 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 53 54 41  .#define RBU_STA
1840: 54 45 5f 50 48 41 53 45 4f 4e 45 53 54 45 50 20  TE_PHASEONESTEP 
1850: 39 0a 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 53  9..#define RBU_S
1860: 54 41 47 45 5f 4f 41 4c 20 20 20 20 20 20 20 20  TAGE_OAL        
1870: 20 31 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 53   1.#define RBU_S
1880: 54 41 47 45 5f 4d 4f 56 45 20 20 20 20 20 20 20  TAGE_MOVE       
1890: 20 32 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 53   2.#define RBU_S
18a0: 54 41 47 45 5f 43 41 50 54 55 52 45 20 20 20 20  TAGE_CAPTURE    
18b0: 20 33 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 53   3.#define RBU_S
18c0: 54 41 47 45 5f 43 4b 50 54 20 20 20 20 20 20 20  TAGE_CKPT       
18d0: 20 34 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 53   4.#define RBU_S
18e0: 54 41 47 45 5f 44 4f 4e 45 20 20 20 20 20 20 20  TAGE_DONE       
18f0: 20 35 0a 0a 0a 23 64 65 66 69 6e 65 20 52 42 55   5...#define RBU
1900: 5f 43 52 45 41 54 45 5f 53 54 41 54 45 20 5c 0a  _CREATE_STATE \.
1910: 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20    "CREATE TABLE 
1920: 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20 25 73  IF NOT EXISTS %s
1930: 2e 72 62 75 5f 73 74 61 74 65 28 6b 20 49 4e 54  .rbu_state(k INT
1940: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
1950: 2c 20 76 29 22 0a 0a 74 79 70 65 64 65 66 20 73  , v)"..typedef s
1960: 74 72 75 63 74 20 52 62 75 46 72 61 6d 65 20 52  truct RbuFrame R
1970: 62 75 46 72 61 6d 65 3b 0a 74 79 70 65 64 65 66  buFrame;.typedef
1980: 20 73 74 72 75 63 74 20 52 62 75 4f 62 6a 49 74   struct RbuObjIt
1990: 65 72 20 52 62 75 4f 62 6a 49 74 65 72 3b 0a 74  er RbuObjIter;.t
19a0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 52 62  ypedef struct Rb
19b0: 75 53 74 61 74 65 20 52 62 75 53 74 61 74 65 3b  uState RbuState;
19c0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
19d0: 72 62 75 5f 76 66 73 20 72 62 75 5f 76 66 73 3b  rbu_vfs rbu_vfs;
19e0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
19f0: 72 62 75 5f 66 69 6c 65 20 72 62 75 5f 66 69 6c  rbu_file rbu_fil
1a00: 65 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  e;.typedef struc
1a10: 74 20 52 62 75 55 70 64 61 74 65 53 74 6d 74 20  t RbuUpdateStmt 
1a20: 52 62 75 55 70 64 61 74 65 53 74 6d 74 3b 0a 0a  RbuUpdateStmt;..
1a30: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
1a40: 49 54 45 5f 41 4d 41 4c 47 41 4d 41 54 49 4f 4e  ITE_AMALGAMATION
1a50: 29 0a 74 79 70 65 64 65 66 20 75 6e 73 69 67 6e  ).typedef unsign
1a60: 65 64 20 69 6e 74 20 75 33 32 3b 0a 74 79 70 65  ed int u32;.type
1a70: 64 65 66 20 75 6e 73 69 67 6e 65 64 20 73 68 6f  def unsigned sho
1a80: 72 74 20 75 31 36 3b 0a 74 79 70 65 64 65 66 20  rt u16;.typedef 
1a90: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 75 38  unsigned char u8
1aa0: 3b 0a 74 79 70 65 64 65 66 20 73 71 6c 69 74 65  ;.typedef sqlite
1ab0: 33 5f 69 6e 74 36 34 20 69 36 34 3b 0a 23 65 6e  3_int64 i64;.#en
1ac0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65  dif../*.** These
1ad0: 20 76 61 6c 75 65 73 20 6d 75 73 74 20 6d 61 74   values must mat
1ae0: 63 68 20 74 68 65 20 76 61 6c 75 65 73 20 64 65  ch the values de
1af0: 66 69 6e 65 64 20 69 6e 20 77 61 6c 2e 63 20 66  fined in wal.c f
1b00: 6f 72 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e  or the equivalen
1b10: 74 0a 2a 2a 20 6c 6f 63 6b 73 2e 20 54 68 65 73  t.** locks. Thes
1b20: 65 20 61 72 65 20 6e 6f 74 20 6d 61 67 69 63 20  e are not magic 
1b30: 6e 75 6d 62 65 72 73 20 61 73 20 74 68 65 79 20  numbers as they 
1b40: 61 72 65 20 70 61 72 74 20 6f 66 20 74 68 65 20  are part of the 
1b50: 53 51 4c 69 74 65 20 66 69 6c 65 0a 2a 2a 20 66  SQLite file.** f
1b60: 6f 72 6d 61 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e  ormat..*/.#defin
1b70: 65 20 57 41 4c 5f 4c 4f 43 4b 5f 57 52 49 54 45  e WAL_LOCK_WRITE
1b80: 20 20 30 0a 23 64 65 66 69 6e 65 20 57 41 4c 5f    0.#define WAL_
1b90: 4c 4f 43 4b 5f 43 4b 50 54 20 20 20 31 0a 23 64  LOCK_CKPT   1.#d
1ba0: 65 66 69 6e 65 20 57 41 4c 5f 4c 4f 43 4b 5f 52  efine WAL_LOCK_R
1bb0: 45 41 44 30 20 20 33 0a 0a 23 64 65 66 69 6e 65  EAD0  3..#define
1bc0: 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 52 42   SQLITE_FCNTL_RB
1bd0: 55 43 4e 54 20 20 20 20 35 31 34 39 32 31 36 0a  UCNT    5149216.
1be0: 0a 2f 2a 0a 2a 2a 20 41 20 73 74 72 75 63 74 75  ./*.** A structu
1bf0: 72 65 20 74 6f 20 73 74 6f 72 65 20 76 61 6c 75  re to store valu
1c00: 65 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  es read from the
1c10: 20 72 62 75 5f 73 74 61 74 65 20 74 61 62 6c 65   rbu_state table
1c20: 20 69 6e 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73   in memory..*/.s
1c30: 74 72 75 63 74 20 52 62 75 53 74 61 74 65 20 7b  truct RbuState {
1c40: 0a 20 20 69 6e 74 20 65 53 74 61 67 65 3b 0a 20  .  int eStage;. 
1c50: 20 63 68 61 72 20 2a 7a 54 62 6c 3b 0a 20 20 63   char *zTbl;.  c
1c60: 68 61 72 20 2a 7a 49 64 78 3b 0a 20 20 69 36 34  har *zIdx;.  i64
1c70: 20 69 57 61 6c 43 6b 73 75 6d 3b 0a 20 20 69 6e   iWalCksum;.  in
1c80: 74 20 6e 52 6f 77 3b 0a 20 20 69 36 34 20 6e 50  t nRow;.  i64 nP
1c90: 72 6f 67 72 65 73 73 3b 0a 20 20 75 33 32 20 69  rogress;.  u32 i
1ca0: 43 6f 6f 6b 69 65 3b 0a 20 20 69 36 34 20 69 4f  Cookie;.  i64 iO
1cb0: 61 6c 53 7a 3b 0a 20 20 69 36 34 20 6e 50 68 61  alSz;.  i64 nPha
1cc0: 73 65 4f 6e 65 53 74 65 70 3b 0a 7d 3b 0a 0a 73  seOneStep;.};..s
1cd0: 74 72 75 63 74 20 52 62 75 55 70 64 61 74 65 53  truct RbuUpdateS
1ce0: 74 6d 74 20 7b 0a 20 20 63 68 61 72 20 2a 7a 4d  tmt {.  char *zM
1cf0: 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
1d00: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20          /* Copy 
1d10: 6f 66 20 75 70 64 61 74 65 20 6d 61 73 6b 20 75  of update mask u
1d20: 73 65 64 20 77 69 74 68 20 70 55 70 64 61 74 65  sed with pUpdate
1d30: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
1d40: 6d 74 20 2a 70 55 70 64 61 74 65 3b 20 20 20 20  mt *pUpdate;    
1d50: 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 75 70        /* Last up
1d60: 64 61 74 65 20 73 74 61 74 65 6d 65 6e 74 20 28  date statement (
1d70: 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 52 62  or NULL) */.  Rb
1d80: 75 55 70 64 61 74 65 53 74 6d 74 20 2a 70 4e 65  uUpdateStmt *pNe
1d90: 78 74 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e  xt;.};../*.** An
1da0: 20 69 74 65 72 61 74 6f 72 20 6f 66 20 74 68 69   iterator of thi
1db0: 73 20 74 79 70 65 20 69 73 20 75 73 65 64 20 74  s type is used t
1dc0: 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
1dd0: 68 20 61 6c 6c 20 6f 62 6a 65 63 74 73 20 69 6e  h all objects in
1de0: 0a 2a 2a 20 74 68 65 20 74 61 72 67 65 74 20 64  .** the target d
1df0: 61 74 61 62 61 73 65 20 74 68 61 74 20 72 65 71  atabase that req
1e00: 75 69 72 65 20 75 70 64 61 74 69 6e 67 2e 20 46  uire updating. F
1e10: 6f 72 20 65 61 63 68 20 73 75 63 68 20 74 61 62  or each such tab
1e20: 6c 65 2c 20 74 68 65 0a 2a 2a 20 69 74 65 72 61  le, the.** itera
1e30: 74 6f 72 20 76 69 73 69 74 73 2c 20 69 6e 20 6f  tor visits, in o
1e40: 72 64 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  rder:.**.**     
1e50: 2a 20 74 68 65 20 74 61 62 6c 65 20 69 74 73 65  * the table itse
1e60: 6c 66 2c 20 0a 2a 2a 20 20 20 20 20 2a 20 65 61  lf, .**     * ea
1e70: 63 68 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  ch index of the 
1e80: 74 61 62 6c 65 20 28 7a 65 72 6f 20 6f 72 20 6d  table (zero or m
1e90: 6f 72 65 20 70 6f 69 6e 74 73 20 74 6f 20 76 69  ore points to vi
1ea0: 73 69 74 29 2c 20 61 6e 64 0a 2a 2a 20 20 20 20  sit), and.**    
1eb0: 20 2a 20 61 20 73 70 65 63 69 61 6c 20 22 63 6c   * a special "cl
1ec0: 65 61 6e 75 70 20 74 61 62 6c 65 22 20 73 74 61  eanup table" sta
1ed0: 74 65 2e 0a 2a 2a 0a 2a 2a 20 61 62 49 6e 64 65  te..**.** abInde
1ee0: 78 65 64 3a 0a 2a 2a 20 20 20 49 66 20 74 68 65  xed:.**   If the
1ef0: 20 74 61 62 6c 65 20 68 61 73 20 6e 6f 20 69 6e   table has no in
1f00: 64 65 78 65 73 20 6f 6e 20 69 74 2c 20 61 62 49  dexes on it, abI
1f10: 6e 64 65 78 65 64 20 69 73 20 73 65 74 20 74 6f  ndexed is set to
1f20: 20 4e 55 4c 4c 2e 20 4f 74 68 65 72 77 69 73 65   NULL. Otherwise
1f30: 2c 0a 2a 2a 20 20 20 69 74 20 70 6f 69 6e 74 73  ,.**   it points
1f40: 20 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66 20   to an array of 
1f50: 66 6c 61 67 73 20 6e 54 62 6c 43 6f 6c 20 65 6c  flags nTblCol el
1f60: 65 6d 65 6e 74 73 20 69 6e 20 73 69 7a 65 2e 20  ements in size. 
1f70: 54 68 65 20 66 6c 61 67 20 69 73 0a 2a 2a 20 20  The flag is.**  
1f80: 20 73 65 74 20 66 6f 72 20 65 61 63 68 20 63 6f   set for each co
1f90: 6c 75 6d 6e 20 74 68 61 74 20 69 73 20 65 69 74  lumn that is eit
1fa0: 68 65 72 20 61 20 70 61 72 74 20 6f 66 20 74 68  her a part of th
1fb0: 65 20 50 4b 20 6f 72 20 61 20 70 61 72 74 20 6f  e PK or a part o
1fc0: 66 20 61 6e 0a 2a 2a 20 20 20 69 6e 64 65 78 2e  f an.**   index.
1fd0: 20 4f 72 20 63 6c 65 61 72 20 6f 74 68 65 72 77   Or clear otherw
1fe0: 69 73 65 2e 0a 2a 2a 20 20 20 0a 2a 2f 0a 73 74  ise..**   .*/.st
1ff0: 72 75 63 74 20 52 62 75 4f 62 6a 49 74 65 72 20  ruct RbuObjIter 
2000: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
2010: 20 2a 70 54 62 6c 49 74 65 72 3b 20 20 20 20 20   *pTblIter;     
2020: 20 20 20 20 2f 2a 20 49 74 65 72 61 74 65 20 74      /* Iterate t
2030: 68 72 6f 75 67 68 20 74 61 62 6c 65 73 20 2a 2f  hrough tables */
2040: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
2050: 2a 70 49 64 78 49 74 65 72 3b 20 20 20 20 20 20  *pIdxIter;      
2060: 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 74 65 72     /* Index iter
2070: 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 54  ator */.  int nT
2080: 62 6c 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20  blCol;          
2090: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
20a0: 65 20 6f 66 20 61 7a 54 62 6c 43 6f 6c 5b 5d 20  e of azTblCol[] 
20b0: 61 72 72 61 79 20 2a 2f 0a 20 20 63 68 61 72 20  array */.  char 
20c0: 2a 2a 61 7a 54 62 6c 43 6f 6c 3b 20 20 20 20 20  **azTblCol;     
20d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
20e0: 72 61 79 20 6f 66 20 75 6e 71 75 6f 74 65 64 20  ray of unquoted 
20f0: 74 61 72 67 65 74 20 63 6f 6c 75 6d 6e 20 6e 61  target column na
2100: 6d 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  mes */.  char **
2110: 61 7a 54 62 6c 54 79 70 65 3b 20 20 20 20 20 20  azTblType;      
2120: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
2130: 79 20 6f 66 20 74 61 72 67 65 74 20 63 6f 6c 75  y of target colu
2140: 6d 6e 20 74 79 70 65 73 20 2a 2f 0a 20 20 69 6e  mn types */.  in
2150: 74 20 2a 61 69 53 72 63 4f 72 64 65 72 3b 20 20  t *aiSrcOrder;  
2160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2170: 20 73 72 63 20 74 61 62 6c 65 20 63 6f 6c 20 2d   src table col -
2180: 3e 20 74 61 72 67 65 74 20 74 61 62 6c 65 20 63  > target table c
2190: 6f 6c 20 2a 2f 0a 20 20 75 38 20 2a 61 62 54 62  ol */.  u8 *abTb
21a0: 6c 50 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  lPk;            
21b0: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
21c0: 20 6f 66 20 66 6c 61 67 73 2c 20 73 65 74 20 6f   of flags, set o
21d0: 6e 20 74 61 72 67 65 74 20 50 4b 20 63 6f 6c 75  n target PK colu
21e0: 6d 6e 73 20 2a 2f 0a 20 20 75 38 20 2a 61 62 4e  mns */.  u8 *abN
21f0: 6f 74 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20 20  otNull;         
2200: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
2210: 79 20 6f 66 20 66 6c 61 67 73 2c 20 73 65 74 20  y of flags, set 
2220: 6f 6e 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75  on NOT NULL colu
2230: 6d 6e 73 20 2a 2f 0a 20 20 75 38 20 2a 61 62 49  mns */.  u8 *abI
2240: 6e 64 65 78 65 64 3b 20 20 20 20 20 20 20 20 20  ndexed;         
2250: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
2260: 79 20 6f 66 20 66 6c 61 67 73 2c 20 73 65 74 20  y of flags, set 
2270: 6f 6e 20 69 6e 64 65 78 65 64 20 26 20 50 4b 20  on indexed & PK 
2280: 63 6f 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 65 54  cols */.  int eT
2290: 79 70 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ype;            
22a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
22b0: 6c 65 20 74 79 70 65 20 2d 20 61 6e 20 52 42 55  le type - an RBU
22c0: 5f 50 4b 5f 58 58 58 20 76 61 6c 75 65 20 2a 2f  _PK_XXX value */
22d0: 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 76 61  ..  /* Output va
22e0: 72 69 61 62 6c 65 73 2e 20 7a 54 62 6c 3d 3d 30  riables. zTbl==0
22f0: 20 69 6d 70 6c 69 65 73 20 45 4f 46 2e 20 2a 2f   implies EOF. */
2300: 0a 20 20 69 6e 74 20 62 43 6c 65 61 6e 75 70 3b  .  int bCleanup;
2310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2320: 20 20 20 2f 2a 20 54 72 75 65 20 69 6e 20 22 63     /* True in "c
2330: 6c 65 61 6e 75 70 22 20 73 74 61 74 65 20 2a 2f  leanup" state */
2340: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2350: 54 62 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Tbl;            
2360: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 61     /* Name of ta
2370: 72 67 65 74 20 64 62 20 74 61 62 6c 65 20 2a 2f  rget db table */
2380: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2390: 44 61 74 61 54 62 6c 3b 20 20 20 20 20 20 20 20  DataTbl;        
23a0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 72 62     /* Name of rb
23b0: 75 20 64 62 20 74 61 62 6c 65 20 28 6f 72 20 6e  u db table (or n
23c0: 75 6c 6c 29 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ull) */.  const 
23d0: 63 68 61 72 20 2a 7a 49 64 78 3b 20 20 20 20 20  char *zIdx;     
23e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
23f0: 65 20 6f 66 20 74 61 72 67 65 74 20 64 62 20 69  e of target db i
2400: 6e 64 65 78 20 28 6f 72 20 6e 75 6c 6c 29 20 2a  ndex (or null) *
2410: 2f 0a 20 20 69 6e 74 20 69 54 6e 75 6d 3b 20 20  /.  int iTnum;  
2420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2430: 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
2440: 20 6f 66 20 63 75 72 72 65 6e 74 20 6f 62 6a 65   of current obje
2450: 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 50 6b 54  ct */.  int iPkT
2460: 6e 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  num;            
2470: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 65 54          /* If eT
2480: 79 70 65 3d 3d 45 58 54 45 52 4e 41 4c 2c 20 72  ype==EXTERNAL, r
2490: 6f 6f 74 20 6f 66 20 50 4b 20 69 6e 64 65 78 20  oot of PK index 
24a0: 2a 2f 0a 20 20 69 6e 74 20 62 55 6e 69 71 75 65  */.  int bUnique
24b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
24c0: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
24d0: 69 6e 64 65 78 20 69 73 20 75 6e 69 71 75 65 20  index is unique 
24e0: 2a 2f 0a 20 20 69 6e 74 20 6e 49 6e 64 65 78 3b  */.  int nIndex;
24f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2500: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2510: 66 20 61 75 78 2e 20 69 6e 64 65 78 65 73 20 6f  f aux. indexes o
2520: 6e 20 74 61 62 6c 65 20 7a 54 62 6c 20 2a 2f 0a  n table zTbl */.
2530: 0a 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 73  .  /* Statements
2540: 20 63 72 65 61 74 65 64 20 62 79 20 72 62 75 4f   created by rbuO
2550: 62 6a 49 74 65 72 50 72 65 70 61 72 65 41 6c 6c  bjIterPrepareAll
2560: 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c  () */.  int nCol
2570: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2580: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2590: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
25a0: 63 75 72 72 65 6e 74 20 6f 62 6a 65 63 74 20 2a  current object *
25b0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  /.  sqlite3_stmt
25c0: 20 2a 70 53 65 6c 65 63 74 3b 20 20 20 20 20 20   *pSelect;      
25d0: 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 20 64 61      /* Source da
25e0: 74 61 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ta */.  sqlite3_
25f0: 73 74 6d 74 20 2a 70 49 6e 73 65 72 74 3b 20 20  stmt *pInsert;  
2600: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 65          /* State
2610: 6d 65 6e 74 20 66 6f 72 20 49 4e 53 45 52 54 20  ment for INSERT 
2620: 6f 70 65 72 61 74 69 6f 6e 73 20 2a 2f 0a 20 20  operations */.  
2630: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 44  sqlite3_stmt *pD
2640: 65 6c 65 74 65 3b 20 20 20 20 20 20 20 20 20 20  elete;          
2650: 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20 66 6f 72  /* Statement for
2660: 20 44 45 4c 45 54 45 20 6f 70 73 20 2a 2f 0a 20   DELETE ops */. 
2670: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
2680: 54 6d 70 49 6e 73 65 72 74 3b 20 20 20 20 20 20  TmpInsert;      
2690: 20 2f 2a 20 49 6e 73 65 72 74 20 69 6e 74 6f 20   /* Insert into 
26a0: 72 62 75 5f 74 6d 70 5f 24 7a 44 61 74 61 54 62  rbu_tmp_$zDataTb
26b0: 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 4c 61 73 74 20  l */..  /* Last 
26c0: 55 50 44 41 54 45 20 75 73 65 64 20 28 66 6f 72  UPDATE used (for
26d0: 20 50 4b 20 62 2d 74 72 65 65 20 75 70 64 61 74   PK b-tree updat
26e0: 65 73 20 6f 6e 6c 79 29 2c 20 6f 72 20 4e 55 4c  es only), or NUL
26f0: 4c 2e 20 2a 2f 0a 20 20 52 62 75 55 70 64 61 74  L. */.  RbuUpdat
2700: 65 53 74 6d 74 20 2a 70 52 62 75 55 70 64 61 74  eStmt *pRbuUpdat
2710: 65 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c  e;.};../*.** Val
2720: 75 65 73 20 66 6f 72 20 52 62 75 4f 62 6a 49 74  ues for RbuObjIt
2730: 65 72 2e 65 54 79 70 65 0a 2a 2a 0a 2a 2a 20 20  er.eType.**.**  
2740: 20 20 20 30 3a 20 54 61 62 6c 65 20 64 6f 65 73     0: Table does
2750: 20 6e 6f 74 20 65 78 69 73 74 20 28 65 72 72 6f   not exist (erro
2760: 72 29 0a 2a 2a 20 20 20 20 20 31 3a 20 54 61 62  r).**     1: Tab
2770: 6c 65 20 68 61 73 20 61 6e 20 69 6d 70 6c 69 63  le has an implic
2780: 69 74 20 72 6f 77 69 64 2e 0a 2a 2a 20 20 20 20  it rowid..**    
2790: 20 32 3a 20 54 61 62 6c 65 20 68 61 73 20 61 6e   2: Table has an
27a0: 20 65 78 70 6c 69 63 69 74 20 49 50 4b 20 63 6f   explicit IPK co
27b0: 6c 75 6d 6e 2e 0a 2a 2a 20 20 20 20 20 33 3a 20  lumn..**     3: 
27c0: 54 61 62 6c 65 20 68 61 73 20 61 6e 20 65 78 74  Table has an ext
27d0: 65 72 6e 61 6c 20 50 4b 20 69 6e 64 65 78 2e 0a  ernal PK index..
27e0: 2a 2a 20 20 20 20 20 34 3a 20 54 61 62 6c 65 20  **     4: Table 
27f0: 69 73 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44  is WITHOUT ROWID
2800: 2e 0a 2a 2a 20 20 20 20 20 35 3a 20 54 61 62 6c  ..**     5: Tabl
2810: 65 20 69 73 20 61 20 76 69 72 74 75 61 6c 20 74  e is a virtual t
2820: 61 62 6c 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  able..*/.#define
2830: 20 52 42 55 5f 50 4b 5f 4e 4f 54 41 42 4c 45 20   RBU_PK_NOTABLE 
2840: 20 20 20 20 20 20 20 30 0a 23 64 65 66 69 6e 65         0.#define
2850: 20 52 42 55 5f 50 4b 5f 4e 4f 4e 45 20 20 20 20   RBU_PK_NONE    
2860: 20 20 20 20 20 20 20 31 0a 23 64 65 66 69 6e 65         1.#define
2870: 20 52 42 55 5f 50 4b 5f 49 50 4b 20 20 20 20 20   RBU_PK_IPK     
2880: 20 20 20 20 20 20 20 32 0a 23 64 65 66 69 6e 65         2.#define
2890: 20 52 42 55 5f 50 4b 5f 45 58 54 45 52 4e 41 4c   RBU_PK_EXTERNAL
28a0: 20 20 20 20 20 20 20 33 0a 23 64 65 66 69 6e 65         3.#define
28b0: 20 52 42 55 5f 50 4b 5f 57 49 54 48 4f 55 54 5f   RBU_PK_WITHOUT_
28c0: 52 4f 57 49 44 20 20 34 0a 23 64 65 66 69 6e 65  ROWID  4.#define
28d0: 20 52 42 55 5f 50 4b 5f 56 54 41 42 20 20 20 20   RBU_PK_VTAB    
28e0: 20 20 20 20 20 20 20 35 0a 0a 0a 2f 2a 0a 2a 2a         5.../*.**
28f0: 20 57 69 74 68 69 6e 20 74 68 65 20 52 42 55 5f   Within the RBU_
2900: 53 54 41 47 45 5f 4f 41 4c 20 73 74 61 67 65 2c  STAGE_OAL stage,
2910: 20 65 61 63 68 20 63 61 6c 6c 20 74 6f 20 73 71   each call to sq
2920: 6c 69 74 65 33 72 62 75 5f 73 74 65 70 28 29 20  lite3rbu_step() 
2930: 70 65 72 66 6f 72 6d 73 0a 2a 2a 20 6f 6e 65 20  performs.** one 
2940: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
2950: 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2f 0a   operations..*/.
2960: 23 64 65 66 69 6e 65 20 52 42 55 5f 49 4e 53 45  #define RBU_INSE
2970: 52 54 20 20 20 20 20 31 20 20 20 20 20 20 20 20  RT     1        
2980: 20 20 2f 2a 20 49 6e 73 65 72 74 20 6f 6e 20 61    /* Insert on a
2990: 20 6d 61 69 6e 20 74 61 62 6c 65 20 62 2d 74 72   main table b-tr
29a0: 65 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 52 42  ee */.#define RB
29b0: 55 5f 44 45 4c 45 54 45 20 20 20 20 20 32 20 20  U_DELETE     2  
29c0: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74          /* Delet
29d0: 65 20 61 20 72 6f 77 20 66 72 6f 6d 20 61 20 6d  e a row from a m
29e0: 61 69 6e 20 74 61 62 6c 65 20 62 2d 74 72 65 65  ain table b-tree
29f0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 52 42 55 5f   */.#define RBU_
2a00: 52 45 50 4c 41 43 45 20 20 20 20 33 20 20 20 20  REPLACE    3    
2a10: 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20        /* Delete 
2a20: 61 6e 64 20 74 68 65 6e 20 69 6e 73 65 72 74 20  and then insert 
2a30: 61 20 72 6f 77 20 2a 2f 0a 23 64 65 66 69 6e 65  a row */.#define
2a40: 20 52 42 55 5f 49 44 58 5f 44 45 4c 45 54 45 20   RBU_IDX_DELETE 
2a50: 34 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65  4          /* De
2a60: 6c 65 74 65 20 61 20 72 6f 77 20 66 72 6f 6d 20  lete a row from 
2a70: 61 6e 20 61 75 78 2e 20 69 6e 64 65 78 20 62 2d  an aux. index b-
2a80: 74 72 65 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  tree */.#define 
2a90: 52 42 55 5f 49 44 58 5f 49 4e 53 45 52 54 20 35  RBU_IDX_INSERT 5
2aa0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73            /* Ins
2ab0: 65 72 74 20 6f 6e 20 61 6e 20 61 75 78 2e 20 69  ert on an aux. i
2ac0: 6e 64 65 78 20 62 2d 74 72 65 65 20 2a 2f 0a 0a  ndex b-tree */..
2ad0: 23 64 65 66 69 6e 65 20 52 42 55 5f 55 50 44 41  #define RBU_UPDA
2ae0: 54 45 20 20 20 20 20 36 20 20 20 20 20 20 20 20  TE     6        
2af0: 20 20 2f 2a 20 55 70 64 61 74 65 20 61 20 72 6f    /* Update a ro
2b00: 77 20 69 6e 20 61 20 6d 61 69 6e 20 74 61 62 6c  w in a main tabl
2b10: 65 20 62 2d 74 72 65 65 20 2a 2f 0a 0a 2f 2a 0a  e b-tree */../*.
2b20: 2a 2a 20 41 20 73 69 6e 67 6c 65 20 73 74 65 70  ** A single step
2b30: 20 6f 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74   of an increment
2b40: 61 6c 20 63 68 65 63 6b 70 6f 69 6e 74 20 2d 20  al checkpoint - 
2b50: 66 72 61 6d 65 20 69 57 61 6c 46 72 61 6d 65 20  frame iWalFrame 
2b60: 6f 66 20 74 68 65 20 77 61 6c 0a 2a 2a 20 66 69  of the wal.** fi
2b70: 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 70  le should be cop
2b80: 69 65 64 20 74 6f 20 70 61 67 65 20 69 44 62 50  ied to page iDbP
2b90: 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
2ba0: 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 72  ase file..*/.str
2bb0: 75 63 74 20 52 62 75 46 72 61 6d 65 20 7b 0a 20  uct RbuFrame {. 
2bc0: 20 75 33 32 20 69 44 62 50 61 67 65 3b 0a 20 20   u32 iDbPage;.  
2bd0: 75 33 32 20 69 57 61 6c 46 72 61 6d 65 3b 0a 7d  u32 iWalFrame;.}
2be0: 3b 0a 0a 2f 2a 0a 2a 2a 20 52 42 55 20 68 61 6e  ;../*.** RBU han
2bf0: 64 6c 65 2e 0a 2a 2a 0a 2a 2a 20 6e 50 68 61 73  dle..**.** nPhas
2c00: 65 4f 6e 65 53 74 65 70 3a 0a 2a 2a 20 20 20 49  eOneStep:.**   I
2c10: 66 20 74 68 65 20 52 42 55 20 64 61 74 61 62 61  f the RBU databa
2c20: 73 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 72  se contains an r
2c30: 62 75 5f 63 6f 75 6e 74 20 74 61 62 6c 65 2c 20  bu_count table, 
2c40: 74 68 69 73 20 76 61 6c 75 65 20 69 73 20 73 65  this value is se
2c50: 74 20 74 6f 0a 2a 2a 20 20 20 61 20 72 75 6e 6e  t to.**   a runn
2c60: 69 6e 67 20 65 73 74 69 6d 61 74 65 20 6f 66 20  ing estimate of 
2c70: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 2d  the number of b-
2c80: 74 72 65 65 20 6f 70 65 72 61 74 69 6f 6e 73 20  tree operations 
2c90: 72 65 71 75 69 72 65 64 20 74 6f 20 0a 2a 2a 20  required to .** 
2ca0: 20 20 66 69 6e 69 73 68 20 70 6f 70 75 6c 61 74    finish populat
2cb0: 69 6e 67 20 74 68 65 20 2a 2d 6f 61 6c 20 66 69  ing the *-oal fi
2cc0: 6c 65 2e 20 54 68 69 73 20 61 6c 6c 6f 77 73 20  le. This allows 
2cd0: 74 68 65 20 73 71 6c 69 74 65 33 5f 62 70 5f 70  the sqlite3_bp_p
2ce0: 72 6f 67 72 65 73 73 28 29 0a 2a 2a 20 20 20 41  rogress().**   A
2cf0: 50 49 20 74 6f 20 63 61 6c 63 75 6c 61 74 65 20  PI to calculate 
2d00: 74 68 65 20 70 65 72 6d 79 72 69 61 64 61 67 65  the permyriadage
2d10: 20 70 72 6f 67 72 65 73 73 20 6f 66 20 70 6f 70   progress of pop
2d20: 75 6c 61 74 69 6e 67 20 74 68 65 20 2a 2d 6f 61  ulating the *-oa
2d30: 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 75 73 69 6e  l file.**   usin
2d40: 67 20 74 68 65 20 66 6f 72 6d 75 6c 61 3a 0a 2a  g the formula:.*
2d50: 2a 0a 2a 2a 20 20 20 20 20 70 65 72 6d 79 72 69  *.**     permyri
2d60: 61 64 61 67 65 20 3d 20 28 31 30 30 30 30 20 2a  adage = (10000 *
2d70: 20 6e 50 72 6f 67 72 65 73 73 29 20 2f 20 6e 50   nProgress) / nP
2d80: 68 61 73 65 4f 6e 65 53 74 65 70 0a 2a 2a 0a 2a  haseOneStep.**.*
2d90: 2a 20 20 20 6e 50 68 61 73 65 4f 6e 65 53 74 65  *   nPhaseOneSte
2da0: 70 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  p is initialized
2db0: 20 74 6f 20 74 68 65 20 73 75 6d 20 6f 66 3a 0a   to the sum of:.
2dc0: 2a 2a 0a 2a 2a 20 20 20 20 20 6e 52 6f 77 20 2a  **.**     nRow *
2dd0: 20 28 6e 49 6e 64 65 78 20 2b 20 31 29 0a 2a 2a   (nIndex + 1).**
2de0: 0a 2a 2a 20 20 20 66 6f 72 20 61 6c 6c 20 73 6f  .**   for all so
2df0: 75 72 63 65 20 74 61 62 6c 65 73 20 69 6e 20 74  urce tables in t
2e00: 68 65 20 52 42 55 20 64 61 74 61 62 61 73 65 2c  he RBU database,
2e10: 20 77 68 65 72 65 20 6e 52 6f 77 20 69 73 20 74   where nRow is t
2e20: 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 20 20 6f  he number.**   o
2e30: 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 73 6f  f rows in the so
2e40: 75 72 63 65 20 74 61 62 6c 65 20 61 6e 64 20 6e  urce table and n
2e50: 49 6e 64 65 78 20 74 68 65 20 6e 75 6d 62 65 72  Index the number
2e60: 20 6f 66 20 69 6e 64 65 78 65 73 20 6f 6e 20 74   of indexes on t
2e70: 68 65 0a 2a 2a 20 20 20 63 6f 72 72 65 73 70 6f  he.**   correspo
2e80: 6e 64 69 6e 67 20 74 61 72 67 65 74 20 64 61 74  nding target dat
2e90: 61 62 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a  abase table..**.
2ea0: 2a 2a 20 20 20 54 68 69 73 20 65 73 74 69 6d 61  **   This estima
2eb0: 74 65 20 69 73 20 61 63 63 75 72 61 74 65 20 69  te is accurate i
2ec0: 66 20 74 68 65 20 52 42 55 20 75 70 64 61 74 65  f the RBU update
2ed0: 20 63 6f 6e 73 69 73 74 73 20 65 6e 74 69 72 65   consists entire
2ee0: 6c 79 20 6f 66 0a 2a 2a 20 20 20 49 4e 53 45 52  ly of.**   INSER
2ef0: 54 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 48 6f  T operations. Ho
2f00: 77 65 76 65 72 2c 20 69 74 20 69 73 20 69 6e 61  wever, it is ina
2f10: 63 63 75 72 61 74 65 20 69 66 3a 0a 2a 2a 0a 2a  ccurate if:.**.*
2f20: 2a 20 20 20 20 20 2a 20 74 68 65 20 52 42 55 20  *     * the RBU 
2f30: 75 70 64 61 74 65 20 63 6f 6e 74 61 69 6e 73 20  update contains 
2f40: 61 6e 79 20 55 50 44 41 54 45 20 6f 70 65 72 61  any UPDATE opera
2f50: 74 69 6f 6e 73 2e 20 49 66 20 74 68 65 20 50 4b  tions. If the PK
2f60: 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 20 20   specified.**   
2f70: 20 20 20 20 66 6f 72 20 61 6e 20 55 50 44 41 54      for an UPDAT
2f80: 45 20 6f 70 65 72 61 74 69 6f 6e 20 64 6f 65 73  E operation does
2f90: 20 6e 6f 74 20 65 78 69 73 74 20 69 6e 20 74 68   not exist in th
2fa0: 65 20 74 61 72 67 65 74 20 74 61 62 6c 65 2c 20  e target table, 
2fb0: 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20 6e 6f  then.**       no
2fc0: 20 62 2d 74 72 65 65 20 6f 70 65 72 61 74 69 6f   b-tree operatio
2fd0: 6e 73 20 61 72 65 20 72 65 71 75 69 72 65 64 20  ns are required 
2fe0: 6f 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 73  on index b-trees
2ff0: 2e 20 4f 72 20 69 66 20 74 68 65 20 0a 2a 2a 20  . Or if the .** 
3000: 20 20 20 20 20 20 73 70 65 63 69 66 69 65 64 20        specified 
3010: 50 4b 20 64 6f 65 73 20 65 78 69 73 74 2c 20 74  PK does exist, t
3020: 68 65 6e 20 28 6e 49 6e 64 65 78 2a 32 29 20 73  hen (nIndex*2) s
3030: 75 63 68 20 6f 70 65 72 61 74 69 6f 6e 73 20 61  uch operations a
3040: 72 65 0a 2a 2a 20 20 20 20 20 20 20 72 65 71 75  re.**       requ
3050: 69 72 65 64 20 28 6f 6e 65 20 64 65 6c 65 74 65  ired (one delete
3060: 20 61 6e 64 20 6f 6e 65 20 69 6e 73 65 72 74 20   and one insert 
3070: 6f 6e 20 65 61 63 68 20 69 6e 64 65 78 20 62 2d  on each index b-
3080: 74 72 65 65 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  tree)..**.**    
3090: 20 2a 20 74 68 65 20 52 42 55 20 75 70 64 61 74   * the RBU updat
30a0: 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 44  e contains any D
30b0: 45 4c 45 54 45 20 6f 70 65 72 61 74 69 6f 6e 73  ELETE operations
30c0: 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 73   for which the s
30d0: 70 65 63 69 66 69 65 64 0a 2a 2a 20 20 20 20 20  pecified.**     
30e0: 20 20 50 4b 20 64 6f 65 73 20 6e 6f 74 20 65 78    PK does not ex
30f0: 69 73 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ist. In this cas
3100: 65 20 6e 6f 20 6f 70 65 72 61 74 69 6f 6e 73 20  e no operations 
3110: 61 72 65 20 72 65 71 75 69 72 65 64 20 6f 6e 20  are required on 
3120: 69 6e 64 65 78 0a 2a 2a 20 20 20 20 20 20 20 62  index.**       b
3130: 2d 74 72 65 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  -trees..**.**   
3140: 20 20 2a 20 74 68 65 20 52 42 55 20 75 70 64 61    * the RBU upda
3150: 74 65 20 63 6f 6e 74 61 69 6e 73 20 52 45 50 4c  te contains REPL
3160: 41 43 45 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20  ACE operations. 
3170: 54 68 65 73 65 20 61 72 65 20 73 69 6d 69 6c 61  These are simila
3180: 72 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20 55 50  r to.**       UP
3190: 44 41 54 45 20 6f 70 65 72 61 74 69 6f 6e 73 2e  DATE operations.
31a0: 0a 2a 2a 0a 2a 2a 20 20 20 6e 50 68 61 73 65 4f  .**.**   nPhaseO
31b0: 6e 65 53 74 65 70 20 69 73 20 75 70 64 61 74 65  neStep is update
31c0: 64 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72  d to account for
31d0: 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20   the conditions 
31e0: 61 62 6f 76 65 20 64 75 72 69 6e 67 20 74 68 65  above during the
31f0: 0a 2a 2a 20 20 20 66 69 72 73 74 20 70 61 73 73  .**   first pass
3200: 20 6f 66 20 65 61 63 68 20 73 6f 75 72 63 65 20   of each source 
3210: 74 61 62 6c 65 2e 20 54 68 65 20 75 70 64 61 74  table. The updat
3220: 65 64 20 6e 50 68 61 73 65 4f 6e 65 53 74 65 70  ed nPhaseOneStep
3230: 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20 20 20 73   value is.**   s
3240: 74 6f 72 65 64 20 69 6e 20 74 68 65 20 72 62 75  tored in the rbu
3250: 5f 73 74 61 74 65 20 74 61 62 6c 65 20 69 66 20  _state table if 
3260: 74 68 65 20 52 42 55 20 75 70 64 61 74 65 20 69  the RBU update i
3270: 73 20 73 75 73 70 65 6e 64 65 64 2e 0a 2a 2f 0a  s suspended..*/.
3280: 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 72 62  struct sqlite3rb
3290: 75 20 7b 0a 20 20 69 6e 74 20 65 53 74 61 67 65  u {.  int eStage
32a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
32b0: 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f        /* Value o
32c0: 66 20 52 42 55 5f 53 54 41 54 45 5f 53 54 41 47  f RBU_STATE_STAG
32d0: 45 20 66 69 65 6c 64 20 2a 2f 0a 20 20 73 71 6c  E field */.  sql
32e0: 69 74 65 33 20 2a 64 62 4d 61 69 6e 3b 20 20 20  ite3 *dbMain;   
32f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3300: 74 61 72 67 65 74 20 64 61 74 61 62 61 73 65 20  target database 
3310: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 73 71 6c 69  handle */.  sqli
3320: 74 65 33 20 2a 64 62 52 62 75 3b 20 20 20 20 20  te3 *dbRbu;     
3330: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72              /* r
3340: 62 75 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  bu database hand
3350: 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54  le */.  char *zT
3360: 61 72 67 65 74 3b 20 20 20 20 20 20 20 20 20 20  arget;          
3370: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 74 68 20          /* Path 
3380: 74 6f 20 74 61 72 67 65 74 20 64 62 20 2a 2f 0a  to target db */.
3390: 20 20 63 68 61 72 20 2a 7a 52 62 75 3b 20 20 20    char *zRbu;   
33a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33b0: 20 20 2f 2a 20 50 61 74 68 20 74 6f 20 72 62 75    /* Path to rbu
33c0: 20 64 62 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a   db */.  char *z
33d0: 53 74 61 74 65 3b 20 20 20 20 20 20 20 20 20 20  State;          
33e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 74 68           /* Path
33f0: 20 74 6f 20 73 74 61 74 65 20 64 62 20 28 6f 72   to state db (or
3400: 20 4e 55 4c 4c 20 69 66 20 7a 52 62 75 29 20 2a   NULL if zRbu) *
3410: 2f 0a 20 20 63 68 61 72 20 7a 53 74 61 74 65 44  /.  char zStateD
3420: 62 5b 35 5d 3b 20 20 20 20 20 20 20 20 20 20 20  b[5];           
3430: 20 20 20 20 2f 2a 20 44 62 20 6e 61 6d 65 20 66      /* Db name f
3440: 6f 72 20 73 74 61 74 65 20 28 22 73 74 61 74 22  or state ("stat"
3450: 20 6f 72 20 22 6d 61 69 6e 22 29 20 2a 2f 0a 20   or "main") */. 
3460: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
3470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3480: 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e   /* Value return
3490: 65 64 20 62 79 20 6c 61 73 74 20 72 62 75 5f 73  ed by last rbu_s
34a0: 74 65 70 28 29 20 63 61 6c 6c 20 2a 2f 0a 20 20  tep() call */.  
34b0: 63 68 61 72 20 2a 7a 45 72 72 6d 73 67 3b 20 20  char *zErrmsg;  
34c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34d0: 2f 2a 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65  /* Error message
34e0: 20 69 66 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f   if rc!=SQLITE_O
34f0: 4b 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 74 65 70  K */.  int nStep
3500: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3510: 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 70         /* Rows p
3520: 72 6f 63 65 73 73 65 64 20 66 6f 72 20 63 75 72  rocessed for cur
3530: 72 65 6e 74 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  rent object */. 
3540: 20 69 6e 74 20 6e 50 72 6f 67 72 65 73 73 3b 20   int nProgress; 
3550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3560: 20 2f 2a 20 52 6f 77 73 20 70 72 6f 63 65 73 73   /* Rows process
3570: 65 64 20 66 6f 72 20 61 6c 6c 20 6f 62 6a 65 63  ed for all objec
3580: 74 73 20 2a 2f 0a 20 20 52 62 75 4f 62 6a 49 74  ts */.  RbuObjIt
3590: 65 72 20 6f 62 6a 69 74 65 72 3b 20 20 20 20 20  er objiter;     
35a0: 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
35b0: 74 6f 72 20 66 6f 72 20 73 6b 69 70 70 69 6e 67  tor for skipping
35c0: 20 74 68 72 6f 75 67 68 20 74 62 6c 2f 69 64 78   through tbl/idx
35d0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
35e0: 20 2a 7a 56 66 73 4e 61 6d 65 3b 20 20 20 20 20   *zVfsName;     
35f0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
3600: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63   automatically c
3610: 72 65 61 74 65 64 20 72 62 75 20 76 66 73 20 2a  reated rbu vfs *
3620: 2f 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 54  /.  rbu_file *pT
3630: 61 72 67 65 74 46 64 3b 20 20 20 20 20 20 20 20  argetFd;        
3640: 20 20 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64      /* File hand
3650: 6c 65 20 6f 70 65 6e 20 6f 6e 20 74 61 72 67 65  le open on targe
3660: 74 20 64 62 20 2a 2f 0a 20 20 69 36 34 20 69 4f  t db */.  i64 iO
3670: 61 6c 53 7a 3b 0a 20 20 69 36 34 20 6e 50 68 61  alSz;.  i64 nPha
3680: 73 65 4f 6e 65 53 74 65 70 3b 0a 0a 20 20 2f 2a  seOneStep;..  /*
3690: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   The following s
36a0: 74 61 74 65 20 76 61 72 69 61 62 6c 65 73 20 61  tate variables a
36b0: 72 65 20 75 73 65 64 20 61 73 20 70 61 72 74 20  re used as part 
36c0: 6f 66 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74  of the increment
36d0: 61 6c 0a 20 20 2a 2a 20 63 68 65 63 6b 70 6f 69  al.  ** checkpoi
36e0: 6e 74 20 73 74 61 67 65 20 28 65 53 74 61 67 65  nt stage (eStage
36f0: 3d 3d 52 42 55 5f 53 54 41 47 45 5f 43 4b 50 54  ==RBU_STAGE_CKPT
3700: 29 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20  ). See comments 
3710: 73 75 72 72 6f 75 6e 64 69 6e 67 0a 20 20 2a 2a  surrounding.  **
3720: 20 66 75 6e 63 74 69 6f 6e 20 72 62 75 53 65 74   function rbuSet
3730: 75 70 43 68 65 63 6b 70 6f 69 6e 74 28 29 20 66  upCheckpoint() f
3740: 6f 72 20 64 65 74 61 69 6c 73 2e 20 20 2a 2f 0a  or details.  */.
3750: 20 20 75 33 32 20 69 4d 61 78 46 72 61 6d 65 3b    u32 iMaxFrame;
3760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3770: 20 20 2f 2a 20 4c 61 72 67 65 73 74 20 69 57 61    /* Largest iWa
3780: 6c 46 72 61 6d 65 20 76 61 6c 75 65 20 69 6e 20  lFrame value in 
3790: 61 46 72 61 6d 65 5b 5d 20 2a 2f 0a 20 20 75 33  aFrame[] */.  u3
37a0: 32 20 6d 4c 6f 63 6b 3b 0a 20 20 69 6e 74 20 6e  2 mLock;.  int n
37b0: 46 72 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  Frame;          
37c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e             /* En
37d0: 74 72 69 65 73 20 69 6e 20 61 46 72 61 6d 65 5b  tries in aFrame[
37e0: 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74  ] array */.  int
37f0: 20 6e 46 72 61 6d 65 41 6c 6c 6f 63 3b 20 20 20   nFrameAlloc;   
3800: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3810: 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65 20 6f  Allocated size o
3820: 66 20 61 46 72 61 6d 65 5b 5d 20 61 72 72 61 79  f aFrame[] array
3830: 20 2a 2f 0a 20 20 52 62 75 46 72 61 6d 65 20 2a   */.  RbuFrame *
3840: 61 46 72 61 6d 65 3b 0a 20 20 69 6e 74 20 70 67  aFrame;.  int pg
3850: 73 7a 3b 0a 20 20 75 38 20 2a 61 42 75 66 3b 0a  sz;.  u8 *aBuf;.
3860: 20 20 69 36 34 20 69 57 61 6c 43 6b 73 75 6d 3b    i64 iWalCksum;
3870: 0a 0a 20 20 2f 2a 20 55 73 65 64 20 69 6e 20 52  ..  /* Used in R
3880: 42 55 20 76 61 63 75 75 6d 20 6d 6f 64 65 20 6f  BU vacuum mode o
3890: 6e 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 62  nly */.  int nRb
38a0: 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  u;              
38b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
38c0: 65 72 20 6f 66 20 52 42 55 20 56 46 53 20 69 6e  er of RBU VFS in
38d0: 20 74 68 65 20 73 74 61 63 6b 20 2a 2f 0a 20 20   the stack */.  
38e0: 72 62 75 5f 66 69 6c 65 20 2a 70 52 62 75 46 64  rbu_file *pRbuFd
38f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3900: 2f 2a 20 46 64 20 66 6f 72 20 6d 61 69 6e 20 64  /* Fd for main d
3910: 62 20 6f 66 20 64 62 52 62 75 20 2a 2f 0a 7d 3b  b of dbRbu */.};
3920: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 72 62 75 20 56  ../*.** An rbu V
3930: 46 53 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  FS is implemente
3940: 64 20 75 73 69 6e 67 20 61 6e 20 69 6e 73 74 61  d using an insta
3950: 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 75  nce of this stru
3960: 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72 75 63 74  cture..*/.struct
3970: 20 72 62 75 5f 76 66 73 20 7b 0a 20 20 73 71 6c   rbu_vfs {.  sql
3980: 69 74 65 33 5f 76 66 73 20 62 61 73 65 3b 20 20  ite3_vfs base;  
3990: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
39a0: 72 62 75 20 56 46 53 20 73 68 69 6d 20 6d 65 74  rbu VFS shim met
39b0: 68 6f 64 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  hods */.  sqlite
39c0: 33 5f 76 66 73 20 2a 70 52 65 61 6c 56 66 73 3b  3_vfs *pRealVfs;
39d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 64            /* Und
39e0: 65 72 6c 79 69 6e 67 20 56 46 53 20 2a 2f 0a 20  erlying VFS */. 
39f0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
3a00: 6d 75 74 65 78 3b 20 20 20 20 20 20 20 20 20 20  mutex;          
3a10: 20 2f 2a 20 4d 75 74 65 78 20 74 6f 20 70 72 6f   /* Mutex to pro
3a20: 74 65 63 74 20 70 4d 61 69 6e 20 2a 2f 0a 20 20  tect pMain */.  
3a30: 72 62 75 5f 66 69 6c 65 20 2a 70 4d 61 69 6e 3b  rbu_file *pMain;
3a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a50: 2f 2a 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20 6f  /* Linked list o
3a60: 66 20 6d 61 69 6e 20 64 62 20 66 69 6c 65 73 20  f main db files 
3a70: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 45 61 63  */.};../*.** Eac
3a80: 68 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 62 79  h file opened by
3a90: 20 61 6e 20 72 62 75 20 56 46 53 20 69 73 20 72   an rbu VFS is r
3aa0: 65 70 72 65 73 65 6e 74 65 64 20 62 79 20 61 6e  epresented by an
3ab0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 0a 2a 2a 20   instance of.** 
3ac0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
3ad0: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72 75  ructure..*/.stru
3ae0: 63 74 20 72 62 75 5f 66 69 6c 65 20 7b 0a 20 20  ct rbu_file {.  
3af0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 62 61 73  sqlite3_file bas
3b00: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
3b10: 2f 2a 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  /* sqlite3_file 
3b20: 6d 65 74 68 6f 64 73 20 2a 2f 0a 20 20 73 71 6c  methods */.  sql
3b30: 69 74 65 33 5f 66 69 6c 65 20 2a 70 52 65 61 6c  ite3_file *pReal
3b40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
3b50: 55 6e 64 65 72 6c 79 69 6e 67 20 66 69 6c 65 20  Underlying file 
3b60: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 72 62 75 5f  handle */.  rbu_
3b70: 76 66 73 20 2a 70 52 62 75 56 66 73 3b 20 20 20  vfs *pRbuVfs;   
3b80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
3b90: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 72 62  ointer to the rb
3ba0: 75 5f 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a  u_vfs object */.
3bb0: 20 20 73 71 6c 69 74 65 33 72 62 75 20 2a 70 52    sqlite3rbu *pR
3bc0: 62 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  bu;             
3bd0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
3be0: 72 62 75 20 6f 62 6a 65 63 74 20 28 72 62 75 20  rbu object (rbu 
3bf0: 74 61 72 67 65 74 20 6f 6e 6c 79 29 20 2a 2f 0a  target only) */.
3c00: 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73  .  int openFlags
3c10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3c20: 20 20 20 2f 2a 20 46 6c 61 67 73 20 74 68 69 73     /* Flags this
3c30: 20 66 69 6c 65 20 77 61 73 20 6f 70 65 6e 65 64   file was opened
3c40: 20 77 69 74 68 20 2a 2f 0a 20 20 75 33 32 20 69   with */.  u32 i
3c50: 43 6f 6f 6b 69 65 3b 20 20 20 20 20 20 20 20 20  Cookie;         
3c60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
3c70: 6f 6b 69 65 20 76 61 6c 75 65 20 66 6f 72 20 6d  okie value for m
3c80: 61 69 6e 20 64 62 20 66 69 6c 65 73 20 2a 2f 0a  ain db files */.
3c90: 20 20 75 38 20 69 57 72 69 74 65 56 65 72 3b 20    u8 iWriteVer; 
3ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3cb0: 20 20 2f 2a 20 22 77 72 69 74 65 2d 76 65 72 73    /* "write-vers
3cc0: 69 6f 6e 22 20 76 61 6c 75 65 20 66 6f 72 20 6d  ion" value for m
3cd0: 61 69 6e 20 64 62 20 66 69 6c 65 73 20 2a 2f 0a  ain db files */.
3ce0: 20 20 75 38 20 62 4e 6f 6c 6f 63 6b 3b 20 20 20    u8 bNolock;   
3cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d00: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 66 61 69    /* True to fai
3d10: 6c 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  l EXCLUSIVE lock
3d20: 73 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 53 68 6d  s */..  int nShm
3d30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3d40: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
3d50: 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
3d60: 61 70 53 68 6d 5b 5d 20 61 72 72 61 79 20 2a 2f  apShm[] array */
3d70: 0a 20 20 63 68 61 72 20 2a 2a 61 70 53 68 6d 3b  .  char **apShm;
3d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d90: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 6d     /* Array of m
3da0: 6d 61 70 27 64 20 2a 2d 73 68 6d 20 72 65 67 69  map'd *-shm regi
3db0: 6f 6e 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ons */.  char *z
3dc0: 44 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Del;            
3dd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65           /* Dele
3de0: 74 65 20 74 68 69 73 20 77 68 65 6e 20 63 6c 6f  te this when clo
3df0: 73 69 6e 67 20 66 69 6c 65 20 2a 2f 0a 0a 20 20  sing file */..  
3e00: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 57 61 6c  const char *zWal
3e10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3e20: 2f 2a 20 57 61 6c 20 66 69 6c 65 6e 61 6d 65 20  /* Wal filename 
3e30: 66 6f 72 20 74 68 69 73 20 6d 61 69 6e 20 64 62  for this main db
3e40: 20 66 69 6c 65 20 2a 2f 0a 20 20 72 62 75 5f 66   file */.  rbu_f
3e50: 69 6c 65 20 2a 70 57 61 6c 46 64 3b 20 20 20 20  ile *pWalFd;    
3e60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 61             /* Wa
3e70: 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  l file descripto
3e80: 72 20 66 6f 72 20 74 68 69 73 20 6d 61 69 6e 20  r for this main 
3e90: 64 62 20 2a 2f 0a 20 20 72 62 75 5f 66 69 6c 65  db */.  rbu_file
3ea0: 20 2a 70 4d 61 69 6e 4e 65 78 74 3b 20 20 20 20   *pMainNext;    
3eb0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
3ec0: 4d 41 49 4e 5f 44 42 20 66 69 6c 65 20 2a 2f 0a  MAIN_DB file */.
3ed0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 65 20 66  };../*.** True f
3ee0: 6f 72 20 61 6e 20 52 42 55 20 76 61 63 75 75 6d  or an RBU vacuum
3ef0: 20 68 61 6e 64 6c 65 2c 20 6f 72 20 66 61 6c 73   handle, or fals
3f00: 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  e otherwise..*/.
3f10: 23 64 65 66 69 6e 65 20 72 62 75 49 73 56 61 63  #define rbuIsVac
3f20: 75 75 6d 28 70 29 20 28 28 70 29 2d 3e 7a 54 61  uum(p) ((p)->zTa
3f30: 72 67 65 74 3d 3d 30 29 0a 0a 0a 2f 2a 2a 2a 2a  rget==0).../****
3f40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3f50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3f60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3f70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3f80: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  *****.** The fol
3f90: 6c 6f 77 69 6e 67 20 74 68 72 65 65 20 66 75 6e  lowing three fun
3fa0: 63 74 69 6f 6e 73 2c 20 66 6f 75 6e 64 20 62 65  ctions, found be
3fb0: 6c 6f 77 3a 0a 2a 2a 0a 2a 2a 20 20 20 72 62 75  low:.**.**   rbu
3fc0: 44 65 6c 74 61 47 65 74 49 6e 74 28 29 0a 2a 2a  DeltaGetInt().**
3fd0: 20 20 20 72 62 75 44 65 6c 74 61 43 68 65 63 6b     rbuDeltaCheck
3fe0: 73 75 6d 28 29 0a 2a 2a 20 20 20 72 62 75 44 65  sum().**   rbuDe
3ff0: 6c 74 61 41 70 70 6c 79 28 29 0a 2a 2a 0a 2a 2a  ltaApply().**.**
4000: 20 61 72 65 20 6c 69 66 74 65 64 20 66 72 6f 6d   are lifted from
4010: 20 74 68 65 20 66 6f 73 73 69 6c 20 73 6f 75 72   the fossil sour
4020: 63 65 20 63 6f 64 65 20 28 68 74 74 70 3a 2f 2f  ce code (http://
4030: 66 6f 73 73 69 6c 2d 73 63 6d 2e 6f 72 67 29 2e  fossil-scm.org).
4040: 20 54 68 65 79 0a 2a 2a 20 61 72 65 20 75 73 65   They.** are use
4050: 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  d to implement t
4060: 68 65 20 73 63 61 6c 61 72 20 53 51 4c 20 66 75  he scalar SQL fu
4070: 6e 63 74 69 6f 6e 20 72 62 75 5f 66 6f 73 73 69  nction rbu_fossi
4080: 6c 5f 64 65 6c 74 61 28 29 2e 0a 2a 2f 0a 0a 2f  l_delta()..*/../
4090: 2a 0a 2a 2a 20 52 65 61 64 20 62 79 74 65 73 20  *.** Read bytes 
40a0: 66 72 6f 6d 20 2a 70 7a 20 61 6e 64 20 63 6f 6e  from *pz and con
40b0: 76 65 72 74 20 74 68 65 6d 20 69 6e 74 6f 20 61  vert them into a
40c0: 20 70 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65   positive intege
40d0: 72 2e 20 20 57 68 65 6e 0a 2a 2a 20 66 69 6e 69  r.  When.** fini
40e0: 73 68 65 64 2c 20 6c 65 61 76 65 20 2a 70 7a 20  shed, leave *pz 
40f0: 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
4100: 66 69 72 73 74 20 63 68 61 72 61 63 74 65 72 20  first character 
4110: 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 0a  past the end of.
4120: 2a 2a 20 74 68 65 20 69 6e 74 65 67 65 72 2e 20  ** the integer. 
4130: 20 54 68 65 20 2a 70 4c 65 6e 20 70 61 72 61 6d   The *pLen param
4140: 65 74 65 72 20 68 6f 6c 64 73 20 74 68 65 20 6c  eter holds the l
4150: 65 6e 67 74 68 20 6f 66 20 74 68 65 20 73 74 72  ength of the str
4160: 69 6e 67 0a 2a 2a 20 69 6e 20 2a 70 7a 20 61 6e  ing.** in *pz an
4170: 64 20 69 73 20 64 65 63 72 65 6d 65 6e 74 65 64  d is decremented
4180: 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 63   once for each c
4190: 68 61 72 61 63 74 65 72 20 69 6e 20 74 68 65 20  haracter in the 
41a0: 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 73 74 61 74  integer..*/.stat
41b0: 69 63 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  ic unsigned int 
41c0: 72 62 75 44 65 6c 74 61 47 65 74 49 6e 74 28 63  rbuDeltaGetInt(c
41d0: 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 2c 20  onst char **pz, 
41e0: 69 6e 74 20 2a 70 4c 65 6e 29 7b 0a 20 20 73 74  int *pLen){.  st
41f0: 61 74 69 63 20 63 6f 6e 73 74 20 73 69 67 6e 65  atic const signe
4200: 64 20 63 68 61 72 20 7a 56 61 6c 75 65 5b 5d 20  d char zValue[] 
4210: 3d 20 7b 0a 20 20 20 20 2d 31 2c 20 2d 31 2c 20  = {.    -1, -1, 
4220: 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20  -1, -1, -1, -1, 
4230: 2d 31 2c 20 2d 31 2c 20 20 20 2d 31 2c 20 2d 31  -1, -1,   -1, -1
4240: 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31  , -1, -1, -1, -1
4250: 2c 20 2d 31 2c 20 2d 31 2c 0a 20 20 20 20 2d 31  , -1, -1,.    -1
4260: 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31  , -1, -1, -1, -1
4270: 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 20 20  , -1, -1, -1,   
4280: 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20  -1, -1, -1, -1, 
4290: 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 0a  -1, -1, -1, -1,.
42a0: 20 20 20 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20      -1, -1, -1, 
42b0: 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20  -1, -1, -1, -1, 
42c0: 2d 31 2c 20 20 20 2d 31 2c 20 2d 31 2c 20 2d 31  -1,   -1, -1, -1
42d0: 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31  , -1, -1, -1, -1
42e0: 2c 20 2d 31 2c 0a 20 20 20 20 20 30 2c 20 20 31  , -1,.     0,  1
42f0: 2c 20 20 32 2c 20 20 33 2c 20 20 34 2c 20 20 35  ,  2,  3,  4,  5
4300: 2c 20 20 36 2c 20 20 37 2c 20 20 20 20 38 2c 20  ,  6,  7,    8, 
4310: 20 39 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20   9, -1, -1, -1, 
4320: 2d 31 2c 20 2d 31 2c 20 2d 31 2c 0a 20 20 20 20  -1, -1, -1,.    
4330: 2d 31 2c 20 31 30 2c 20 31 31 2c 20 31 32 2c 20  -1, 10, 11, 12, 
4340: 31 33 2c 20 31 34 2c 20 31 35 2c 20 31 36 2c 20  13, 14, 15, 16, 
4350: 20 20 31 37 2c 20 31 38 2c 20 31 39 2c 20 32 30    17, 18, 19, 20
4360: 2c 20 32 31 2c 20 32 32 2c 20 32 33 2c 20 32 34  , 21, 22, 23, 24
4370: 2c 0a 20 20 20 20 32 35 2c 20 32 36 2c 20 32 37  ,.    25, 26, 27
4380: 2c 20 32 38 2c 20 32 39 2c 20 33 30 2c 20 33 31  , 28, 29, 30, 31
4390: 2c 20 33 32 2c 20 20 20 33 33 2c 20 33 34 2c 20  , 32,   33, 34, 
43a0: 33 35 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20  35, -1, -1, -1, 
43b0: 2d 31 2c 20 33 36 2c 0a 20 20 20 20 2d 31 2c 20  -1, 36,.    -1, 
43c0: 33 37 2c 20 33 38 2c 20 33 39 2c 20 34 30 2c 20  37, 38, 39, 40, 
43d0: 34 31 2c 20 34 32 2c 20 34 33 2c 20 20 20 34 34  41, 42, 43,   44
43e0: 2c 20 34 35 2c 20 34 36 2c 20 34 37 2c 20 34 38  , 45, 46, 47, 48
43f0: 2c 20 34 39 2c 20 35 30 2c 20 35 31 2c 0a 20 20  , 49, 50, 51,.  
4400: 20 20 35 32 2c 20 35 33 2c 20 35 34 2c 20 35 35    52, 53, 54, 55
4410: 2c 20 35 36 2c 20 35 37 2c 20 35 38 2c 20 35 39  , 56, 57, 58, 59
4420: 2c 20 20 20 36 30 2c 20 36 31 2c 20 36 32 2c 20  ,   60, 61, 62, 
4430: 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 36 33 2c 20  -1, -1, -1, 63, 
4440: 2d 31 2c 0a 20 20 7d 3b 0a 20 20 75 6e 73 69 67  -1,.  };.  unsig
4450: 6e 65 64 20 69 6e 74 20 76 20 3d 20 30 3b 0a 20  ned int v = 0;. 
4460: 20 69 6e 74 20 63 3b 0a 20 20 75 6e 73 69 67 6e   int c;.  unsign
4470: 65 64 20 63 68 61 72 20 2a 7a 20 3d 20 28 75 6e  ed char *z = (un
4480: 73 69 67 6e 65 64 20 63 68 61 72 2a 29 2a 70 7a  signed char*)*pz
4490: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
44a0: 72 20 2a 7a 53 74 61 72 74 20 3d 20 7a 3b 0a 20  r *zStart = z;. 
44b0: 20 77 68 69 6c 65 28 20 28 63 20 3d 20 7a 56 61   while( (c = zVa
44c0: 6c 75 65 5b 30 78 37 66 26 2a 28 7a 2b 2b 29 5d  lue[0x7f&*(z++)]
44d0: 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 76 20 3d  )>=0 ){.     v =
44e0: 20 28 76 3c 3c 36 29 20 2b 20 63 3b 0a 20 20 7d   (v<<6) + c;.  }
44f0: 0a 20 20 7a 2d 2d 3b 0a 20 20 2a 70 4c 65 6e 20  .  z--;.  *pLen 
4500: 2d 3d 20 7a 20 2d 20 7a 53 74 61 72 74 3b 0a 20  -= z - zStart;. 
4510: 20 2a 70 7a 20 3d 20 28 63 68 61 72 2a 29 7a 3b   *pz = (char*)z;
4520: 0a 20 20 72 65 74 75 72 6e 20 76 3b 0a 7d 0a 0a  .  return v;.}..
4530: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20  /*.** Compute a 
4540: 33 32 2d 62 69 74 20 63 68 65 63 6b 73 75 6d 20  32-bit checksum 
4550: 6f 6e 20 74 68 65 20 4e 2d 62 79 74 65 20 62 75  on the N-byte bu
4560: 66 66 65 72 2e 20 20 52 65 74 75 72 6e 20 74 68  ffer.  Return th
4570: 65 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61  e result..*/.sta
4580: 74 69 63 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  tic unsigned int
4590: 20 72 62 75 44 65 6c 74 61 43 68 65 63 6b 73 75   rbuDeltaChecksu
45a0: 6d 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49  m(const char *zI
45b0: 6e 2c 20 73 69 7a 65 5f 74 20 4e 29 7b 0a 20 20  n, size_t N){.  
45c0: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
45d0: 68 61 72 20 2a 7a 20 3d 20 28 63 6f 6e 73 74 20  har *z = (const 
45e0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
45f0: 7a 49 6e 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  zIn;.  unsigned 
4600: 73 75 6d 30 20 3d 20 30 3b 0a 20 20 75 6e 73 69  sum0 = 0;.  unsi
4610: 67 6e 65 64 20 73 75 6d 31 20 3d 20 30 3b 0a 20  gned sum1 = 0;. 
4620: 20 75 6e 73 69 67 6e 65 64 20 73 75 6d 32 20 3d   unsigned sum2 =
4630: 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 73   0;.  unsigned s
4640: 75 6d 33 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65  um3 = 0;.  while
4650: 28 4e 20 3e 3d 20 31 36 29 7b 0a 20 20 20 20 73  (N >= 16){.    s
4660: 75 6d 30 20 2b 3d 20 28 28 75 6e 73 69 67 6e 65  um0 += ((unsigne
4670: 64 29 7a 5b 30 5d 20 2b 20 7a 5b 34 5d 20 2b 20  d)z[0] + z[4] + 
4680: 7a 5b 38 5d 20 2b 20 7a 5b 31 32 5d 29 3b 0a 20  z[8] + z[12]);. 
4690: 20 20 20 73 75 6d 31 20 2b 3d 20 28 28 75 6e 73     sum1 += ((uns
46a0: 69 67 6e 65 64 29 7a 5b 31 5d 20 2b 20 7a 5b 35  igned)z[1] + z[5
46b0: 5d 20 2b 20 7a 5b 39 5d 20 2b 20 7a 5b 31 33 5d  ] + z[9] + z[13]
46c0: 29 3b 0a 20 20 20 20 73 75 6d 32 20 2b 3d 20 28  );.    sum2 += (
46d0: 28 75 6e 73 69 67 6e 65 64 29 7a 5b 32 5d 20 2b  (unsigned)z[2] +
46e0: 20 7a 5b 36 5d 20 2b 20 7a 5b 31 30 5d 2b 20 7a   z[6] + z[10]+ z
46f0: 5b 31 34 5d 29 3b 0a 20 20 20 20 73 75 6d 33 20  [14]);.    sum3 
4700: 2b 3d 20 28 28 75 6e 73 69 67 6e 65 64 29 7a 5b  += ((unsigned)z[
4710: 33 5d 20 2b 20 7a 5b 37 5d 20 2b 20 7a 5b 31 31  3] + z[7] + z[11
4720: 5d 2b 20 7a 5b 31 35 5d 29 3b 0a 20 20 20 20 7a  ]+ z[15]);.    z
4730: 20 2b 3d 20 31 36 3b 0a 20 20 20 20 4e 20 2d 3d   += 16;.    N -=
4740: 20 31 36 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65   16;.  }.  while
4750: 28 4e 20 3e 3d 20 34 29 7b 0a 20 20 20 20 73 75  (N >= 4){.    su
4760: 6d 30 20 2b 3d 20 7a 5b 30 5d 3b 0a 20 20 20 20  m0 += z[0];.    
4770: 73 75 6d 31 20 2b 3d 20 7a 5b 31 5d 3b 0a 20 20  sum1 += z[1];.  
4780: 20 20 73 75 6d 32 20 2b 3d 20 7a 5b 32 5d 3b 0a    sum2 += z[2];.
4790: 20 20 20 20 73 75 6d 33 20 2b 3d 20 7a 5b 33 5d      sum3 += z[3]
47a0: 3b 0a 20 20 20 20 7a 20 2b 3d 20 34 3b 0a 20 20  ;.    z += 4;.  
47b0: 20 20 4e 20 2d 3d 20 34 3b 0a 20 20 7d 0a 20 20    N -= 4;.  }.  
47c0: 73 75 6d 33 20 2b 3d 20 28 73 75 6d 32 20 3c 3c  sum3 += (sum2 <<
47d0: 20 38 29 20 2b 20 28 73 75 6d 31 20 3c 3c 20 31   8) + (sum1 << 1
47e0: 36 29 20 2b 20 28 73 75 6d 30 20 3c 3c 20 32 34  6) + (sum0 << 24
47f0: 29 3b 0a 20 20 73 77 69 74 63 68 28 4e 29 7b 0a  );.  switch(N){.
4800: 20 20 20 20 63 61 73 65 20 33 3a 20 20 20 73 75      case 3:   su
4810: 6d 33 20 2b 3d 20 28 7a 5b 32 5d 20 3c 3c 20 38  m3 += (z[2] << 8
4820: 29 3b 0a 20 20 20 20 63 61 73 65 20 32 3a 20 20  );.    case 2:  
4830: 20 73 75 6d 33 20 2b 3d 20 28 7a 5b 31 5d 20 3c   sum3 += (z[1] <
4840: 3c 20 31 36 29 3b 0a 20 20 20 20 63 61 73 65 20  < 16);.    case 
4850: 31 3a 20 20 20 73 75 6d 33 20 2b 3d 20 28 7a 5b  1:   sum3 += (z[
4860: 30 5d 20 3c 3c 20 32 34 29 3b 0a 20 20 20 20 64  0] << 24);.    d
4870: 65 66 61 75 6c 74 3a 20 20 3b 0a 20 20 7d 0a 20  efault:  ;.  }. 
4880: 20 72 65 74 75 72 6e 20 73 75 6d 33 3b 0a 7d 0a   return sum3;.}.
4890: 0a 2f 2a 0a 2a 2a 20 41 70 70 6c 79 20 61 20 64  ./*.** Apply a d
48a0: 65 6c 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  elta..**.** The 
48b0: 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 73 68  output buffer sh
48c0: 6f 75 6c 64 20 62 65 20 62 69 67 20 65 6e 6f 75  ould be big enou
48d0: 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 77  gh to hold the w
48e0: 68 6f 6c 65 20 6f 75 74 70 75 74 0a 2a 2a 20 66  hole output.** f
48f0: 69 6c 65 20 61 6e 64 20 61 20 4e 55 4c 20 74 65  ile and a NUL te
4900: 72 6d 69 6e 61 74 6f 72 20 61 74 20 74 68 65 20  rminator at the 
4910: 65 6e 64 2e 20 20 54 68 65 20 64 65 6c 74 61 5f  end.  The delta_
4920: 6f 75 74 70 75 74 5f 73 69 7a 65 28 29 0a 2a 2a  output_size().**
4930: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 65   routine will de
4940: 74 65 72 6d 69 6e 65 20 74 68 69 73 20 73 69 7a  termine this siz
4950: 65 20 66 6f 72 20 79 6f 75 2e 0a 2a 2a 0a 2a 2a  e for you..**.**
4960: 20 54 68 65 20 64 65 6c 74 61 20 73 74 72 69 6e   The delta strin
4970: 67 20 73 68 6f 75 6c 64 20 62 65 20 6e 75 6c 6c  g should be null
4980: 2d 74 65 72 6d 69 6e 61 74 65 64 2e 20 20 42 75  -terminated.  Bu
4990: 74 20 74 68 65 20 64 65 6c 74 61 20 73 74 72 69  t the delta stri
49a0: 6e 67 0a 2a 2a 20 6d 61 79 20 63 6f 6e 74 61 69  ng.** may contai
49b0: 6e 20 65 6d 62 65 64 64 65 64 20 4e 55 4c 20 63  n embedded NUL c
49c0: 68 61 72 61 63 74 65 72 73 20 28 69 66 20 74 68  haracters (if th
49d0: 65 20 69 6e 70 75 74 20 61 6e 64 20 6f 75 74 70  e input and outp
49e0: 75 74 20 61 72 65 0a 2a 2a 20 62 69 6e 61 72 79  ut are.** binary
49f0: 20 66 69 6c 65 73 29 20 73 6f 20 77 65 20 61 6c   files) so we al
4a00: 73 6f 20 68 61 76 65 20 74 6f 20 70 61 73 73 20  so have to pass 
4a10: 69 6e 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66  in the length of
4a20: 20 74 68 65 20 64 65 6c 74 61 20 69 6e 0a 2a 2a   the delta in.**
4a30: 20 74 68 65 20 6c 65 6e 44 65 6c 74 61 20 70 61   the lenDelta pa
4a40: 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54  rameter..**.** T
4a50: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
4a60: 75 72 6e 73 20 74 68 65 20 73 69 7a 65 20 6f 66  urns the size of
4a70: 20 74 68 65 20 6f 75 74 70 75 74 20 66 69 6c 65   the output file
4a80: 20 69 6e 20 62 79 74 65 73 20 28 65 78 63 6c 75   in bytes (exclu
4a90: 64 69 6e 67 0a 2a 2a 20 74 68 65 20 66 69 6e 61  ding.** the fina
4aa0: 6c 20 4e 55 4c 20 74 65 72 6d 69 6e 61 74 6f 72  l NUL terminator
4ab0: 20 63 68 61 72 61 63 74 65 72 29 2e 20 20 45 78   character).  Ex
4ac0: 63 65 70 74 2c 20 69 66 20 74 68 65 20 64 65 6c  cept, if the del
4ad0: 74 61 20 73 74 72 69 6e 67 20 69 73 0a 2a 2a 20  ta string is.** 
4ae0: 6d 61 6c 66 6f 72 6d 65 64 20 6f 72 20 69 6e 74  malformed or int
4af0: 65 6e 64 65 64 20 66 6f 72 20 75 73 65 20 77 69  ended for use wi
4b00: 74 68 20 61 20 73 6f 75 72 63 65 20 66 69 6c 65  th a source file
4b10: 20 6f 74 68 65 72 20 74 68 61 6e 20 7a 53 72 63   other than zSrc
4b20: 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 72  ,.** then this r
4b30: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 2d  outine returns -
4b40: 31 2e 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72 20 74  1..**.** Refer t
4b50: 6f 20 74 68 65 20 64 65 6c 74 61 5f 63 72 65 61  o the delta_crea
4b60: 74 65 28 29 20 64 6f 63 75 6d 65 6e 74 61 74 69  te() documentati
4b70: 6f 6e 20 61 62 6f 76 65 20 66 6f 72 20 61 20 64  on above for a d
4b80: 65 73 63 72 69 70 74 69 6f 6e 0a 2a 2a 20 6f 66  escription.** of
4b90: 20 74 68 65 20 64 65 6c 74 61 20 66 69 6c 65 20   the delta file 
4ba0: 66 6f 72 6d 61 74 2e 0a 2a 2f 0a 73 74 61 74 69  format..*/.stati
4bb0: 63 20 69 6e 74 20 72 62 75 44 65 6c 74 61 41 70  c int rbuDeltaAp
4bc0: 70 6c 79 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  ply(.  const cha
4bd0: 72 20 2a 7a 53 72 63 2c 20 20 20 20 20 20 2f 2a  r *zSrc,      /*
4be0: 20 54 68 65 20 73 6f 75 72 63 65 20 6f 72 20 70   The source or p
4bf0: 61 74 74 65 72 6e 20 66 69 6c 65 20 2a 2f 0a 20  attern file */. 
4c00: 20 69 6e 74 20 6c 65 6e 53 72 63 2c 20 20 20 20   int lenSrc,    
4c10: 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74          /* Lengt
4c20: 68 20 6f 66 20 74 68 65 20 73 6f 75 72 63 65 20  h of the source 
4c30: 66 69 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  file */.  const 
4c40: 63 68 61 72 20 2a 7a 44 65 6c 74 61 2c 20 20 20  char *zDelta,   
4c50: 20 2f 2a 20 44 65 6c 74 61 20 74 6f 20 61 70 70   /* Delta to app
4c60: 6c 79 20 74 6f 20 74 68 65 20 70 61 74 74 65 72  ly to the patter
4c70: 6e 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 6e 44 65  n */.  int lenDe
4c80: 6c 74 61 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  lta,          /*
4c90: 20 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 64   Length of the d
4ca0: 65 6c 74 61 20 2a 2f 0a 20 20 63 68 61 72 20 2a  elta */.  char *
4cb0: 7a 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 20  zOut            
4cc0: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6f 75   /* Write the ou
4cd0: 74 70 75 74 20 69 6e 74 6f 20 74 68 69 73 20 70  tput into this p
4ce0: 72 65 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66  reallocated buff
4cf0: 65 72 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67  er */.){.  unsig
4d00: 6e 65 64 20 69 6e 74 20 6c 69 6d 69 74 3b 0a 20  ned int limit;. 
4d10: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 74 6f   unsigned int to
4d20: 74 61 6c 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66  tal = 0;.#ifndef
4d30: 20 46 4f 53 53 49 4c 5f 4f 4d 49 54 5f 44 45 4c   FOSSIL_OMIT_DEL
4d40: 54 41 5f 43 4b 53 55 4d 5f 54 45 53 54 0a 20 20  TA_CKSUM_TEST.  
4d50: 63 68 61 72 20 2a 7a 4f 72 69 67 4f 75 74 20 3d  char *zOrigOut =
4d60: 20 7a 4f 75 74 3b 0a 23 65 6e 64 69 66 0a 0a 20   zOut;.#endif.. 
4d70: 20 6c 69 6d 69 74 20 3d 20 72 62 75 44 65 6c 74   limit = rbuDelt
4d80: 61 47 65 74 49 6e 74 28 26 7a 44 65 6c 74 61 2c  aGetInt(&zDelta,
4d90: 20 26 6c 65 6e 44 65 6c 74 61 29 3b 0a 20 20 69   &lenDelta);.  i
4da0: 66 28 20 2a 7a 44 65 6c 74 61 21 3d 27 5c 6e 27  f( *zDelta!='\n'
4db0: 20 29 7b 0a 20 20 20 20 2f 2a 20 45 52 52 4f 52   ){.    /* ERROR
4dc0: 3a 20 73 69 7a 65 20 69 6e 74 65 67 65 72 20 6e  : size integer n
4dd0: 6f 74 20 74 65 72 6d 69 6e 61 74 65 64 20 62 79  ot terminated by
4de0: 20 22 5c 6e 22 20 2a 2f 0a 20 20 20 20 72 65 74   "\n" */.    ret
4df0: 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 7a 44  urn -1;.  }.  zD
4e00: 65 6c 74 61 2b 2b 3b 20 6c 65 6e 44 65 6c 74 61  elta++; lenDelta
4e10: 2d 2d 3b 0a 20 20 77 68 69 6c 65 28 20 2a 7a 44  --;.  while( *zD
4e20: 65 6c 74 61 20 26 26 20 6c 65 6e 44 65 6c 74 61  elta && lenDelta
4e30: 3e 30 20 29 7b 0a 20 20 20 20 75 6e 73 69 67 6e  >0 ){.    unsign
4e40: 65 64 20 69 6e 74 20 63 6e 74 2c 20 6f 66 73 74  ed int cnt, ofst
4e50: 3b 0a 20 20 20 20 63 6e 74 20 3d 20 72 62 75 44  ;.    cnt = rbuD
4e60: 65 6c 74 61 47 65 74 49 6e 74 28 26 7a 44 65 6c  eltaGetInt(&zDel
4e70: 74 61 2c 20 26 6c 65 6e 44 65 6c 74 61 29 3b 0a  ta, &lenDelta);.
4e80: 20 20 20 20 73 77 69 74 63 68 28 20 7a 44 65 6c      switch( zDel
4e90: 74 61 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 63  ta[0] ){.      c
4ea0: 61 73 65 20 27 40 27 3a 20 7b 0a 20 20 20 20 20  ase '@': {.     
4eb0: 20 20 20 7a 44 65 6c 74 61 2b 2b 3b 20 6c 65 6e     zDelta++; len
4ec0: 44 65 6c 74 61 2d 2d 3b 0a 20 20 20 20 20 20 20  Delta--;.       
4ed0: 20 6f 66 73 74 20 3d 20 72 62 75 44 65 6c 74 61   ofst = rbuDelta
4ee0: 47 65 74 49 6e 74 28 26 7a 44 65 6c 74 61 2c 20  GetInt(&zDelta, 
4ef0: 26 6c 65 6e 44 65 6c 74 61 29 3b 0a 20 20 20 20  &lenDelta);.    
4f00: 20 20 20 20 69 66 28 20 6c 65 6e 44 65 6c 74 61      if( lenDelta
4f10: 3e 30 20 26 26 20 7a 44 65 6c 74 61 5b 30 5d 21  >0 && zDelta[0]!
4f20: 3d 27 2c 27 20 29 7b 0a 20 20 20 20 20 20 20 20  =',' ){.        
4f30: 20 20 2f 2a 20 45 52 52 4f 52 3a 20 63 6f 70 79    /* ERROR: copy
4f40: 20 63 6f 6d 6d 61 6e 64 20 6e 6f 74 20 74 65 72   command not ter
4f50: 6d 69 6e 61 74 65 64 20 62 79 20 27 2c 27 20 2a  minated by ',' *
4f60: 2f 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  /.          retu
4f70: 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d  rn -1;.        }
4f80: 0a 20 20 20 20 20 20 20 20 7a 44 65 6c 74 61 2b  .        zDelta+
4f90: 2b 3b 20 6c 65 6e 44 65 6c 74 61 2d 2d 3b 0a 20  +; lenDelta--;. 
4fa0: 20 20 20 20 20 20 20 74 6f 74 61 6c 20 2b 3d 20         total += 
4fb0: 63 6e 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28  cnt;.        if(
4fc0: 20 74 6f 74 61 6c 3e 6c 69 6d 69 74 20 29 7b 0a   total>limit ){.
4fd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 52 52            /* ERR
4fe0: 4f 52 3a 20 63 6f 70 79 20 65 78 63 65 65 64 73  OR: copy exceeds
4ff0: 20 6f 75 74 70 75 74 20 66 69 6c 65 20 73 69 7a   output file siz
5000: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  e */.          r
5010: 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20  eturn -1;.      
5020: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
5030: 28 69 6e 74 29 28 6f 66 73 74 2b 63 6e 74 29 20  (int)(ofst+cnt) 
5040: 3e 20 6c 65 6e 53 72 63 20 29 7b 0a 20 20 20 20  > lenSrc ){.    
5050: 20 20 20 20 20 20 2f 2a 20 45 52 52 4f 52 3a 20        /* ERROR: 
5060: 63 6f 70 79 20 65 78 74 65 6e 64 73 20 70 61 73  copy extends pas
5070: 74 20 65 6e 64 20 6f 66 20 69 6e 70 75 74 20 2a  t end of input *
5080: 2f 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  /.          retu
5090: 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d  rn -1;.        }
50a0: 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
50b0: 7a 4f 75 74 2c 20 26 7a 53 72 63 5b 6f 66 73 74  zOut, &zSrc[ofst
50c0: 5d 2c 20 63 6e 74 29 3b 0a 20 20 20 20 20 20 20  ], cnt);.       
50d0: 20 7a 4f 75 74 20 2b 3d 20 63 6e 74 3b 0a 20 20   zOut += cnt;.  
50e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
50f0: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
5100: 27 3a 27 3a 20 7b 0a 20 20 20 20 20 20 20 20 7a  ':': {.        z
5110: 44 65 6c 74 61 2b 2b 3b 20 6c 65 6e 44 65 6c 74  Delta++; lenDelt
5120: 61 2d 2d 3b 0a 20 20 20 20 20 20 20 20 74 6f 74  a--;.        tot
5130: 61 6c 20 2b 3d 20 63 6e 74 3b 0a 20 20 20 20 20  al += cnt;.     
5140: 20 20 20 69 66 28 20 74 6f 74 61 6c 3e 6c 69 6d     if( total>lim
5150: 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  it ){.          
5160: 2f 2a 20 45 52 52 4f 52 3a 20 20 69 6e 73 65 72  /* ERROR:  inser
5170: 74 20 63 6f 6d 6d 61 6e 64 20 67 69 76 65 73 20  t command gives 
5180: 61 6e 20 6f 75 74 70 75 74 20 6c 61 72 67 65 72  an output larger
5190: 20 74 68 61 6e 20 70 72 65 64 69 63 74 65 64 20   than predicted 
51a0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  */.          ret
51b0: 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  urn -1;.        
51c0: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 69  }.        if( (i
51d0: 6e 74 29 63 6e 74 3e 6c 65 6e 44 65 6c 74 61 20  nt)cnt>lenDelta 
51e0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
51f0: 45 52 52 4f 52 3a 20 69 6e 73 65 72 74 20 63 6f  ERROR: insert co
5200: 75 6e 74 20 65 78 63 65 65 64 73 20 73 69 7a 65  unt exceeds size
5210: 20 6f 66 20 64 65 6c 74 61 20 2a 2f 0a 20 20 20   of delta */.   
5220: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31         return -1
5230: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
5240: 20 20 20 20 6d 65 6d 63 70 79 28 7a 4f 75 74 2c      memcpy(zOut,
5250: 20 7a 44 65 6c 74 61 2c 20 63 6e 74 29 3b 0a 20   zDelta, cnt);. 
5260: 20 20 20 20 20 20 20 7a 4f 75 74 20 2b 3d 20 63         zOut += c
5270: 6e 74 3b 0a 20 20 20 20 20 20 20 20 7a 44 65 6c  nt;.        zDel
5280: 74 61 20 2b 3d 20 63 6e 74 3b 0a 20 20 20 20 20  ta += cnt;.     
5290: 20 20 20 6c 65 6e 44 65 6c 74 61 20 2d 3d 20 63     lenDelta -= c
52a0: 6e 74 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  nt;.        brea
52b0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
52c0: 20 63 61 73 65 20 27 3b 27 3a 20 7b 0a 20 20 20   case ';': {.   
52d0: 20 20 20 20 20 7a 44 65 6c 74 61 2b 2b 3b 20 6c       zDelta++; l
52e0: 65 6e 44 65 6c 74 61 2d 2d 3b 0a 20 20 20 20 20  enDelta--;.     
52f0: 20 20 20 7a 4f 75 74 5b 30 5d 20 3d 20 30 3b 0a     zOut[0] = 0;.
5300: 23 69 66 6e 64 65 66 20 46 4f 53 53 49 4c 5f 4f  #ifndef FOSSIL_O
5310: 4d 49 54 5f 44 45 4c 54 41 5f 43 4b 53 55 4d 5f  MIT_DELTA_CKSUM_
5320: 54 45 53 54 0a 20 20 20 20 20 20 20 20 69 66 28  TEST.        if(
5330: 20 63 6e 74 21 3d 72 62 75 44 65 6c 74 61 43 68   cnt!=rbuDeltaCh
5340: 65 63 6b 73 75 6d 28 7a 4f 72 69 67 4f 75 74 2c  ecksum(zOrigOut,
5350: 20 74 6f 74 61 6c 29 20 29 7b 0a 20 20 20 20 20   total) ){.     
5360: 20 20 20 20 20 2f 2a 20 45 52 52 4f 52 3a 20 20       /* ERROR:  
5370: 62 61 64 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a  bad checksum */.
5380: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
5390: 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23   -1;.        }.#
53a0: 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 69 66  endif.        if
53b0: 28 20 74 6f 74 61 6c 21 3d 6c 69 6d 69 74 20 29  ( total!=limit )
53c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45  {.          /* E
53d0: 52 52 4f 52 3a 20 67 65 6e 65 72 61 74 65 64 20  RROR: generated 
53e0: 73 69 7a 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61  size does not ma
53f0: 74 63 68 20 70 72 65 64 69 63 74 65 64 20 73 69  tch predicted si
5400: 7a 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ze */.          
5410: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20  return -1;.     
5420: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 74     }.        ret
5430: 75 72 6e 20 74 6f 74 61 6c 3b 0a 20 20 20 20 20  urn total;.     
5440: 20 7d 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74   }.      default
5450: 3a 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45  : {.        /* E
5460: 52 52 4f 52 3a 20 75 6e 6b 6e 6f 77 6e 20 64 65  RROR: unknown de
5470: 6c 74 61 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  lta operator */.
5480: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d          return -
5490: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
54a0: 0a 20 20 7d 0a 20 20 2f 2a 20 45 52 52 4f 52 3a  .  }.  /* ERROR:
54b0: 20 75 6e 74 65 72 6d 69 6e 61 74 65 64 20 64 65   unterminated de
54c0: 6c 74 61 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  lta */.  return 
54d0: 2d 31 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  -1;.}..static in
54e0: 74 20 72 62 75 44 65 6c 74 61 4f 75 74 70 75 74  t rbuDeltaOutput
54f0: 53 69 7a 65 28 63 6f 6e 73 74 20 63 68 61 72 20  Size(const char 
5500: 2a 7a 44 65 6c 74 61 2c 20 69 6e 74 20 6c 65 6e  *zDelta, int len
5510: 44 65 6c 74 61 29 7b 0a 20 20 69 6e 74 20 73 69  Delta){.  int si
5520: 7a 65 3b 0a 20 20 73 69 7a 65 20 3d 20 72 62 75  ze;.  size = rbu
5530: 44 65 6c 74 61 47 65 74 49 6e 74 28 26 7a 44 65  DeltaGetInt(&zDe
5540: 6c 74 61 2c 20 26 6c 65 6e 44 65 6c 74 61 29 3b  lta, &lenDelta);
5550: 0a 20 20 69 66 28 20 2a 7a 44 65 6c 74 61 21 3d  .  if( *zDelta!=
5560: 27 5c 6e 27 20 29 7b 0a 20 20 20 20 2f 2a 20 45  '\n' ){.    /* E
5570: 52 52 4f 52 3a 20 73 69 7a 65 20 69 6e 74 65 67  RROR: size integ
5580: 65 72 20 6e 6f 74 20 74 65 72 6d 69 6e 61 74 65  er not terminate
5590: 64 20 62 79 20 22 5c 6e 22 20 2a 2f 0a 20 20 20  d by "\n" */.   
55a0: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a   return -1;.  }.
55b0: 20 20 72 65 74 75 72 6e 20 73 69 7a 65 3b 0a 7d    return size;.}
55c0: 0a 0a 2f 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20 63  ../*.** End of c
55d0: 6f 64 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 66  ode taken from f
55e0: 6f 73 73 69 6c 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ossil..*********
55f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5600: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5610: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5620: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5630: 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  /../*.** Impleme
5640: 6e 74 61 74 69 6f 6e 20 6f 66 20 53 51 4c 20 73  ntation of SQL s
5650: 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20 72  calar function r
5660: 62 75 5f 66 6f 73 73 69 6c 5f 64 65 6c 74 61 28  bu_fossil_delta(
5670: 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  )..**.** This fu
5680: 6e 63 74 69 6f 6e 20 61 70 70 6c 69 65 73 20 61  nction applies a
5690: 20 66 6f 73 73 69 6c 20 64 65 6c 74 61 20 70 61   fossil delta pa
56a0: 74 63 68 20 74 6f 20 61 20 62 6c 6f 62 2e 20 45  tch to a blob. E
56b0: 78 61 63 74 6c 79 20 74 77 6f 0a 2a 2a 20 61 72  xactly two.** ar
56c0: 67 75 6d 65 6e 74 73 20 6d 75 73 74 20 62 65 20  guments must be 
56d0: 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66  passed to this f
56e0: 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20 66 69 72  unction. The fir
56f0: 73 74 20 69 73 20 74 68 65 20 62 6c 6f 62 20 74  st is the blob t
5700: 6f 0a 2a 2a 20 70 61 74 63 68 20 61 6e 64 20 74  o.** patch and t
5710: 68 65 20 73 65 63 6f 6e 64 20 74 68 65 20 70 61  he second the pa
5720: 74 63 68 20 74 6f 20 61 70 70 6c 79 2e 20 49 66  tch to apply. If
5730: 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
5740: 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  , this.** functi
5750: 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 70  on returns the p
5760: 61 74 63 68 65 64 20 62 6c 6f 62 2e 0a 2a 2f 0a  atched blob..*/.
5770: 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75 46  static void rbuF
5780: 6f 73 73 69 6c 44 65 6c 74 61 46 75 6e 63 28 0a  ossilDeltaFunc(.
5790: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
57a0: 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e  t *context,.  in
57b0: 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65  t argc,.  sqlite
57c0: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
57d0: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
57e0: 61 44 65 6c 74 61 3b 0a 20 20 69 6e 74 20 6e 44  aDelta;.  int nD
57f0: 65 6c 74 61 3b 0a 20 20 63 6f 6e 73 74 20 63 68  elta;.  const ch
5800: 61 72 20 2a 61 4f 72 69 67 3b 0a 20 20 69 6e 74  ar *aOrig;.  int
5810: 20 6e 4f 72 69 67 3b 0a 0a 20 20 69 6e 74 20 6e   nOrig;..  int n
5820: 4f 75 74 3b 0a 20 20 69 6e 74 20 6e 4f 75 74 32  Out;.  int nOut2
5830: 3b 0a 20 20 63 68 61 72 20 2a 61 4f 75 74 3b 0a  ;.  char *aOut;.
5840: 0a 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3d  .  assert( argc=
5850: 3d 32 20 29 3b 0a 0a 20 20 6e 4f 72 69 67 20 3d  =2 );..  nOrig =
5860: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
5870: 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20  ytes(argv[0]);. 
5880: 20 61 4f 72 69 67 20 3d 20 28 63 6f 6e 73 74 20   aOrig = (const 
5890: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
58a0: 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30 5d  lue_blob(argv[0]
58b0: 29 3b 0a 20 20 6e 44 65 6c 74 61 20 3d 20 73 71  );.  nDelta = sq
58c0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
58d0: 73 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 61 44  s(argv[1]);.  aD
58e0: 65 6c 74 61 20 3d 20 28 63 6f 6e 73 74 20 63 68  elta = (const ch
58f0: 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
5900: 65 5f 62 6c 6f 62 28 61 72 67 76 5b 31 5d 29 3b  e_blob(argv[1]);
5910: 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
5920: 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  t the size of th
5930: 65 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 6e 4f  e output */.  nO
5940: 75 74 20 3d 20 72 62 75 44 65 6c 74 61 4f 75 74  ut = rbuDeltaOut
5950: 70 75 74 53 69 7a 65 28 61 44 65 6c 74 61 2c 20  putSize(aDelta, 
5960: 6e 44 65 6c 74 61 29 3b 0a 20 20 69 66 28 20 6e  nDelta);.  if( n
5970: 4f 75 74 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c  Out<0 ){.    sql
5980: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
5990: 72 28 63 6f 6e 74 65 78 74 2c 20 22 63 6f 72 72  r(context, "corr
59a0: 75 70 74 20 66 6f 73 73 69 6c 20 64 65 6c 74 61  upt fossil delta
59b0: 22 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65 74 75  ", -1);.    retu
59c0: 72 6e 3b 0a 20 20 7d 0a 0a 20 20 61 4f 75 74 20  rn;.  }..  aOut 
59d0: 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
59e0: 28 6e 4f 75 74 2b 31 29 3b 0a 20 20 69 66 28 20  (nOut+1);.  if( 
59f0: 61 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73  aOut==0 ){.    s
5a00: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
5a10: 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78  ror_nomem(contex
5a20: 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t);.  }else{.   
5a30: 20 6e 4f 75 74 32 20 3d 20 72 62 75 44 65 6c 74   nOut2 = rbuDelt
5a40: 61 41 70 70 6c 79 28 61 4f 72 69 67 2c 20 6e 4f  aApply(aOrig, nO
5a50: 72 69 67 2c 20 61 44 65 6c 74 61 2c 20 6e 44 65  rig, aDelta, nDe
5a60: 6c 74 61 2c 20 61 4f 75 74 29 3b 0a 20 20 20 20  lta, aOut);.    
5a70: 69 66 28 20 6e 4f 75 74 32 21 3d 6e 4f 75 74 20  if( nOut2!=nOut 
5a80: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
5a90: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f  _result_error(co
5aa0: 6e 74 65 78 74 2c 20 22 63 6f 72 72 75 70 74 20  ntext, "corrupt 
5ab0: 66 6f 73 73 69 6c 20 64 65 6c 74 61 22 2c 20 2d  fossil delta", -
5ac0: 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  1);.    }else{. 
5ad0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
5ae0: 75 6c 74 5f 62 6c 6f 62 28 63 6f 6e 74 65 78 74  ult_blob(context
5af0: 2c 20 61 4f 75 74 2c 20 6e 4f 75 74 2c 20 73 71  , aOut, nOut, sq
5b00: 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 20 20 20  lite3_free);.   
5b10: 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a   }.  }.}.../*.**
5b20: 20 50 72 65 70 61 72 65 20 74 68 65 20 53 51 4c   Prepare the SQL
5b30: 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 62 75   statement in bu
5b40: 66 66 65 72 20 7a 53 71 6c 20 61 67 61 69 6e 73  ffer zSql agains
5b50: 74 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  t database handl
5b60: 65 20 64 62 2e 0a 2a 2a 20 49 66 20 73 75 63 63  e db..** If succ
5b70: 65 73 73 66 75 6c 2c 20 73 65 74 20 2a 70 70 53  essful, set *ppS
5b80: 74 6d 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  tmt to point to 
5b90: 74 68 65 20 6e 65 77 20 73 74 61 74 65 6d 65 6e  the new statemen
5ba0: 74 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20  t and return.** 
5bb0: 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 0a 2a  SQLITE_OK. .**.*
5bc0: 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
5bd0: 61 6e 20 65 72 72 6f 72 20 64 6f 65 73 20 6f 63  an error does oc
5be0: 63 75 72 2c 20 73 65 74 20 2a 70 70 53 74 6d 74  cur, set *ppStmt
5bf0: 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 72 65 74   to NULL and ret
5c00: 75 72 6e 0a 2a 2a 20 61 6e 20 53 51 4c 69 74 65  urn.** an SQLite
5c10: 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 41 64 64   error code. Add
5c20: 69 74 69 6f 6e 61 6c 6c 79 2c 20 73 65 74 20 6f  itionally, set o
5c30: 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 20 2a  utput variable *
5c40: 70 7a 45 72 72 6d 73 67 20 74 6f 0a 2a 2a 20 70  pzErrmsg to.** p
5c50: 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72  oint to a buffer
5c60: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6e 20 65   containing an e
5c70: 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 20 49 74  rror message. It
5c80: 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
5c90: 62 69 6c 69 74 79 0a 2a 2a 20 6f 66 20 74 68 65  bility.** of the
5ca0: 20 63 61 6c 6c 65 72 20 74 6f 20 28 65 76 65 6e   caller to (even
5cb0: 74 75 61 6c 6c 79 29 20 66 72 65 65 20 74 68 69  tually) free thi
5cc0: 73 20 62 75 66 66 65 72 20 75 73 69 6e 67 20 73  s buffer using s
5cd0: 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a  qlite3_free()..*
5ce0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 65  /.static int pre
5cf0: 70 61 72 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72  pareAndCollectEr
5d00: 72 6f 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ror(.  sqlite3 *
5d10: 64 62 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 73  db, .  sqlite3_s
5d20: 74 6d 74 20 2a 2a 70 70 53 74 6d 74 2c 0a 20 20  tmt **ppStmt,.  
5d30: 63 68 61 72 20 2a 2a 70 7a 45 72 72 6d 73 67 2c  char **pzErrmsg,
5d40: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
5d50: 53 71 6c 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20  Sql.){.  int rc 
5d60: 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
5d70: 65 5f 76 32 28 64 62 2c 20 7a 53 71 6c 2c 20 2d  e_v2(db, zSql, -
5d80: 31 2c 20 70 70 53 74 6d 74 2c 20 30 29 3b 0a 20  1, ppStmt, 0);. 
5d90: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
5da0: 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 7a 45 72 72  OK ){.    *pzErr
5db0: 6d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  msg = sqlite3_mp
5dc0: 72 69 6e 74 66 28 22 25 73 22 2c 20 73 71 6c 69  rintf("%s", sqli
5dd0: 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b  te3_errmsg(db));
5de0: 0a 20 20 20 20 2a 70 70 53 74 6d 74 20 3d 20 30  .    *ppStmt = 0
5df0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
5e00: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65  c;.}../*.** Rese
5e10: 74 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  t the SQL statem
5e20: 65 6e 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ent passed as th
5e30: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
5e40: 2e 20 52 65 74 75 72 6e 20 61 20 63 6f 70 79 0a  . Return a copy.
5e50: 2a 2a 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20  ** of the value 
5e60: 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69  returned by sqli
5e70: 74 65 33 5f 72 65 73 65 74 28 29 2e 0a 2a 2a 0a  te3_reset()..**.
5e80: 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68  ** If an error h
5e90: 61 73 20 6f 63 63 75 72 72 65 64 2c 20 74 68 65  as occurred, the
5ea0: 6e 20 73 65 74 20 2a 70 7a 45 72 72 6d 73 67 20  n set *pzErrmsg 
5eb0: 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75  to point to a bu
5ec0: 66 66 65 72 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69  ffer.** containi
5ed0: 6e 67 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ng an error mess
5ee0: 61 67 65 2e 20 49 74 20 69 73 20 74 68 65 20 72  age. It is the r
5ef0: 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
5f00: 20 74 68 65 20 63 61 6c 6c 65 72 0a 2a 2a 20 74   the caller.** t
5f10: 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65  o eventually fre
5f20: 65 20 74 68 69 73 20 62 75 66 66 65 72 20 75 73  e this buffer us
5f30: 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ing sqlite3_free
5f40: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ()..*/.static in
5f50: 74 20 72 65 73 65 74 41 6e 64 43 6f 6c 6c 65 63  t resetAndCollec
5f60: 74 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 73  tError(sqlite3_s
5f70: 74 6d 74 20 2a 70 53 74 6d 74 2c 20 63 68 61 72  tmt *pStmt, char
5f80: 20 2a 2a 70 7a 45 72 72 6d 73 67 29 7b 0a 20 20   **pzErrmsg){.  
5f90: 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
5fa0: 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20  _reset(pStmt);. 
5fb0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
5fc0: 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 7a 45 72 72  OK ){.    *pzErr
5fd0: 6d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  msg = sqlite3_mp
5fe0: 72 69 6e 74 66 28 22 25 73 22 2c 20 73 71 6c 69  rintf("%s", sqli
5ff0: 74 65 33 5f 65 72 72 6d 73 67 28 73 71 6c 69 74  te3_errmsg(sqlit
6000: 65 33 5f 64 62 5f 68 61 6e 64 6c 65 28 70 53 74  e3_db_handle(pSt
6010: 6d 74 29 29 29 3b 0a 20 20 7d 0a 20 20 72 65 74  mt)));.  }.  ret
6020: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
6030: 20 55 6e 6c 65 73 73 20 69 74 20 69 73 20 4e 55   Unless it is NU
6040: 4c 4c 2c 20 61 72 67 75 6d 65 6e 74 20 7a 53 71  LL, argument zSq
6050: 6c 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 62 75  l points to a bu
6060: 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 75  ffer allocated u
6070: 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  sing.** sqlite3_
6080: 6d 61 6c 6c 6f 63 20 63 6f 6e 74 61 69 6e 69 6e  malloc containin
6090: 67 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65  g an SQL stateme
60a0: 6e 74 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  nt. This functio
60b0: 6e 20 70 72 65 70 61 72 65 73 20 74 68 65 20 53  n prepares the S
60c0: 51 4c 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  QL.** statement 
60d0: 61 67 61 69 6e 73 74 20 64 61 74 61 62 61 73 65  against database
60e0: 20 64 62 20 61 6e 64 20 66 72 65 65 73 20 74 68   db and frees th
60f0: 65 20 62 75 66 66 65 72 2e 20 49 66 20 73 74 61  e buffer. If sta
6100: 74 65 6d 65 6e 74 20 0a 2a 2a 20 63 6f 6d 70 69  tement .** compi
6110: 6c 61 74 69 6f 6e 20 69 73 20 73 75 63 63 65 73  lation is succes
6120: 73 66 75 6c 2c 20 2a 70 70 53 74 6d 74 20 69 73  sful, *ppStmt is
6130: 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
6140: 20 74 68 65 20 6e 65 77 20 73 74 61 74 65 6d 65   the new stateme
6150: 6e 74 20 0a 2a 2a 20 68 61 6e 64 6c 65 20 61 6e  nt .** handle an
6160: 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  d SQLITE_OK is r
6170: 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 0a 2a 2a 20  eturned. .**.** 
6180: 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 6e  Otherwise, if an
6190: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a   error occurs, *
61a0: 70 70 53 74 6d 74 20 69 73 20 73 65 74 20 74 6f  ppStmt is set to
61b0: 20 4e 55 4c 4c 20 61 6e 64 20 61 6e 20 65 72 72   NULL and an err
61c0: 6f 72 20 63 6f 64 65 0a 2a 2a 20 72 65 74 75 72  or code.** retur
61d0: 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ned. In this cas
61e0: 65 2c 20 2a 70 7a 45 72 72 6d 73 67 20 6d 61 79  e, *pzErrmsg may
61f0: 20 61 6c 73 6f 20 62 65 20 73 65 74 20 74 6f 20   also be set to 
6200: 70 6f 69 6e 74 20 74 6f 20 61 6e 20 65 72 72 6f  point to an erro
6210: 72 0a 2a 2a 20 6d 65 73 73 61 67 65 2e 20 49 74  r.** message. It
6220: 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
6230: 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
6240: 6c 6c 65 72 20 74 6f 20 66 72 65 65 20 74 68 69  ller to free thi
6250: 73 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a  s error message.
6260: 2a 2a 20 62 75 66 66 65 72 20 75 73 69 6e 67 20  ** buffer using 
6270: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a  sqlite3_free()..
6280: 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e  **.** If argumen
6290: 74 20 7a 53 71 6c 20 69 73 20 4e 55 4c 4c 2c 20  t zSql is NULL, 
62a0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73  this function as
62b0: 73 75 6d 65 73 20 74 68 61 74 20 61 6e 20 4f 4f  sumes that an OO
62c0: 4d 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e 0a  M has occurred..
62d0: 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  ** In this case 
62e0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20  SQLITE_NOMEM is 
62f0: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70  returned and *pp
6300: 53 74 6d 74 20 73 65 74 20 74 6f 20 4e 55 4c 4c  Stmt set to NULL
6310: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6320: 70 72 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f  prepareFreeAndCo
6330: 6c 6c 65 63 74 45 72 72 6f 72 28 0a 20 20 73 71  llectError(.  sq
6340: 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 73 71  lite3 *db, .  sq
6350: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53  lite3_stmt **ppS
6360: 74 6d 74 2c 0a 20 20 63 68 61 72 20 2a 2a 70 7a  tmt,.  char **pz
6370: 45 72 72 6d 73 67 2c 0a 20 20 63 68 61 72 20 2a  Errmsg,.  char *
6380: 7a 53 71 6c 0a 29 7b 0a 20 20 69 6e 74 20 72 63  zSql.){.  int rc
6390: 3b 0a 20 20 61 73 73 65 72 74 28 20 2a 70 7a 45  ;.  assert( *pzE
63a0: 72 72 6d 73 67 3d 3d 30 20 29 3b 0a 20 20 69 66  rrmsg==0 );.  if
63b0: 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20  ( zSql==0 ){.   
63c0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
63d0: 45 4d 3b 0a 20 20 20 20 2a 70 70 53 74 6d 74 20  EM;.    *ppStmt 
63e0: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
63f0: 20 20 72 63 20 3d 20 70 72 65 70 61 72 65 41 6e    rc = prepareAn
6400: 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 64 62  dCollectError(db
6410: 2c 20 70 70 53 74 6d 74 2c 20 70 7a 45 72 72 6d  , ppStmt, pzErrm
6420: 73 67 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 73  sg, zSql);.    s
6430: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c  qlite3_free(zSql
6440: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
6450: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  rc;.}../*.** Fre
6460: 65 20 74 68 65 20 52 62 75 4f 62 6a 49 74 65 72  e the RbuObjIter
6470: 2e 61 7a 54 62 6c 43 6f 6c 5b 5d 20 61 6e 64 20  .azTblCol[] and 
6480: 52 62 75 4f 62 6a 49 74 65 72 2e 61 62 54 62 6c  RbuObjIter.abTbl
6490: 50 6b 5b 5d 20 61 72 72 61 79 73 20 61 6c 6c 6f  Pk[] arrays allo
64a0: 63 61 74 65 64 0a 2a 2a 20 62 79 20 61 6e 20 65  cated.** by an e
64b0: 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20 72  arlier call to r
64c0: 62 75 4f 62 6a 49 74 65 72 43 61 63 68 65 54 61  buObjIterCacheTa
64d0: 62 6c 65 49 6e 66 6f 28 29 2e 0a 2a 2f 0a 73 74  bleInfo()..*/.st
64e0: 61 74 69 63 20 76 6f 69 64 20 72 62 75 4f 62 6a  atic void rbuObj
64f0: 49 74 65 72 46 72 65 65 43 6f 6c 73 28 52 62 75  IterFreeCols(Rbu
6500: 4f 62 6a 49 74 65 72 20 2a 70 49 74 65 72 29 7b  ObjIter *pIter){
6510: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
6520: 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 54  i=0; i<pIter->nT
6530: 62 6c 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  blCol; i++){.   
6540: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49   sqlite3_free(pI
6550: 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69 5d  ter->azTblCol[i]
6560: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
6570: 72 65 65 28 70 49 74 65 72 2d 3e 61 7a 54 62 6c  ree(pIter->azTbl
6580: 54 79 70 65 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20  Type[i]);.  }.  
6590: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 74  sqlite3_free(pIt
65a0: 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 29 3b 0a 20  er->azTblCol);. 
65b0: 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c   pIter->azTblCol
65c0: 20 3d 20 30 3b 0a 20 20 70 49 74 65 72 2d 3e 61   = 0;.  pIter->a
65d0: 7a 54 62 6c 54 79 70 65 20 3d 20 30 3b 0a 20 20  zTblType = 0;.  
65e0: 70 49 74 65 72 2d 3e 61 69 53 72 63 4f 72 64 65  pIter->aiSrcOrde
65f0: 72 20 3d 20 30 3b 0a 20 20 70 49 74 65 72 2d 3e  r = 0;.  pIter->
6600: 61 62 54 62 6c 50 6b 20 3d 20 30 3b 0a 20 20 70  abTblPk = 0;.  p
6610: 49 74 65 72 2d 3e 61 62 4e 6f 74 4e 75 6c 6c 20  Iter->abNotNull 
6620: 3d 20 30 3b 0a 20 20 70 49 74 65 72 2d 3e 6e 54  = 0;.  pIter->nT
6630: 62 6c 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 49 74  blCol = 0;.  pIt
6640: 65 72 2d 3e 65 54 79 70 65 20 3d 20 30 3b 20 20  er->eType = 0;  
6650: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6660: 49 6e 76 61 6c 69 64 20 76 61 6c 75 65 20 2a 2f  Invalid value */
6670: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 61 6c 69  .}../*.** Finali
6680: 7a 65 20 61 6c 6c 20 73 74 61 74 65 6d 65 6e 74  ze all statement
6690: 73 20 61 6e 64 20 66 72 65 65 20 61 6c 6c 20 61  s and free all a
66a0: 6c 6c 6f 63 61 74 69 6f 6e 73 20 74 68 61 74 20  llocations that 
66b0: 61 72 65 20 73 70 65 63 69 66 69 63 20 74 6f 0a  are specific to.
66c0: 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 6f  ** the current o
66d0: 62 6a 65 63 74 20 28 74 61 62 6c 65 2f 69 6e 64  bject (table/ind
66e0: 65 78 20 70 61 69 72 29 2e 0a 2a 2f 0a 73 74 61  ex pair)..*/.sta
66f0: 74 69 63 20 76 6f 69 64 20 72 62 75 4f 62 6a 49  tic void rbuObjI
6700: 74 65 72 43 6c 65 61 72 53 74 61 74 65 6d 65 6e  terClearStatemen
6710: 74 73 28 52 62 75 4f 62 6a 49 74 65 72 20 2a 70  ts(RbuObjIter *p
6720: 49 74 65 72 29 7b 0a 20 20 52 62 75 55 70 64 61  Iter){.  RbuUpda
6730: 74 65 53 74 6d 74 20 2a 70 55 70 3b 0a 0a 20 20  teStmt *pUp;..  
6740: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
6750: 28 70 49 74 65 72 2d 3e 70 53 65 6c 65 63 74 29  (pIter->pSelect)
6760: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  ;.  sqlite3_fina
6770: 6c 69 7a 65 28 70 49 74 65 72 2d 3e 70 49 6e 73  lize(pIter->pIns
6780: 65 72 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ert);.  sqlite3_
6790: 66 69 6e 61 6c 69 7a 65 28 70 49 74 65 72 2d 3e  finalize(pIter->
67a0: 70 44 65 6c 65 74 65 29 3b 0a 20 20 73 71 6c 69  pDelete);.  sqli
67b0: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 49 74  te3_finalize(pIt
67c0: 65 72 2d 3e 70 54 6d 70 49 6e 73 65 72 74 29 3b  er->pTmpInsert);
67d0: 0a 20 20 70 55 70 20 3d 20 70 49 74 65 72 2d 3e  .  pUp = pIter->
67e0: 70 52 62 75 55 70 64 61 74 65 3b 0a 20 20 77 68  pRbuUpdate;.  wh
67f0: 69 6c 65 28 20 70 55 70 20 29 7b 0a 20 20 20 20  ile( pUp ){.    
6800: 52 62 75 55 70 64 61 74 65 53 74 6d 74 20 2a 70  RbuUpdateStmt *p
6810: 54 6d 70 20 3d 20 70 55 70 2d 3e 70 4e 65 78 74  Tmp = pUp->pNext
6820: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  ;.    sqlite3_fi
6830: 6e 61 6c 69 7a 65 28 70 55 70 2d 3e 70 55 70 64  nalize(pUp->pUpd
6840: 61 74 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ate);.    sqlite
6850: 33 5f 66 72 65 65 28 70 55 70 29 3b 0a 20 20 20  3_free(pUp);.   
6860: 20 70 55 70 20 3d 20 70 54 6d 70 3b 0a 20 20 7d   pUp = pTmp;.  }
6870: 0a 20 20 0a 20 20 70 49 74 65 72 2d 3e 70 53 65  .  .  pIter->pSe
6880: 6c 65 63 74 20 3d 20 30 3b 0a 20 20 70 49 74 65  lect = 0;.  pIte
6890: 72 2d 3e 70 49 6e 73 65 72 74 20 3d 20 30 3b 0a  r->pInsert = 0;.
68a0: 20 20 70 49 74 65 72 2d 3e 70 44 65 6c 65 74 65    pIter->pDelete
68b0: 20 3d 20 30 3b 0a 20 20 70 49 74 65 72 2d 3e 70   = 0;.  pIter->p
68c0: 52 62 75 55 70 64 61 74 65 20 3d 20 30 3b 0a 20  RbuUpdate = 0;. 
68d0: 20 70 49 74 65 72 2d 3e 70 54 6d 70 49 6e 73 65   pIter->pTmpInse
68e0: 72 74 20 3d 20 30 3b 0a 20 20 70 49 74 65 72 2d  rt = 0;.  pIter-
68f0: 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  >nCol = 0;.}../*
6900: 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61 6e 79  .** Clean up any
6910: 20 72 65 73 6f 75 72 63 65 73 20 61 6c 6c 6f 63   resources alloc
6920: 61 74 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  ated as part of 
6930: 74 68 65 20 69 74 65 72 61 74 6f 72 20 6f 62 6a  the iterator obj
6940: 65 63 74 20 70 61 73 73 65 64 0a 2a 2a 20 61 73  ect passed.** as
6950: 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65   the only argume
6960: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nt..*/.static vo
6970: 69 64 20 72 62 75 4f 62 6a 49 74 65 72 46 69 6e  id rbuObjIterFin
6980: 61 6c 69 7a 65 28 52 62 75 4f 62 6a 49 74 65 72  alize(RbuObjIter
6990: 20 2a 70 49 74 65 72 29 7b 0a 20 20 72 62 75 4f   *pIter){.  rbuO
69a0: 62 6a 49 74 65 72 43 6c 65 61 72 53 74 61 74 65  bjIterClearState
69b0: 6d 65 6e 74 73 28 70 49 74 65 72 29 3b 0a 20 20  ments(pIter);.  
69c0: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
69d0: 28 70 49 74 65 72 2d 3e 70 54 62 6c 49 74 65 72  (pIter->pTblIter
69e0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  );.  sqlite3_fin
69f0: 61 6c 69 7a 65 28 70 49 74 65 72 2d 3e 70 49 64  alize(pIter->pId
6a00: 78 49 74 65 72 29 3b 0a 20 20 72 62 75 4f 62 6a  xIter);.  rbuObj
6a10: 49 74 65 72 46 72 65 65 43 6f 6c 73 28 70 49 74  IterFreeCols(pIt
6a20: 65 72 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 49  er);.  memset(pI
6a30: 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 52  ter, 0, sizeof(R
6a40: 62 75 4f 62 6a 49 74 65 72 29 29 3b 0a 7d 0a 0a  buObjIter));.}..
6a50: 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68  /*.** Advance th
6a60: 65 20 69 74 65 72 61 74 6f 72 20 74 6f 20 74 68  e iterator to th
6a70: 65 20 6e 65 78 74 20 70 6f 73 69 74 69 6f 6e 2e  e next position.
6a80: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 65 72 72  .**.** If no err
6a90: 6f 72 20 6f 63 63 75 72 73 2c 20 53 51 4c 49 54  or occurs, SQLIT
6aa0: 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
6ab0: 20 61 6e 64 20 74 68 65 20 69 74 65 72 61 74 6f   and the iterato
6ac0: 72 20 69 73 20 6c 65 66 74 20 0a 2a 2a 20 70 6f  r is left .** po
6ad0: 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6e 65  inting to the ne
6ae0: 78 74 20 65 6e 74 72 79 2e 20 4f 74 68 65 72 77  xt entry. Otherw
6af0: 69 73 65 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f  ise, an error co
6b00: 64 65 20 61 6e 64 20 6d 65 73 73 61 67 65 20 69  de and message i
6b10: 73 20 0a 2a 2a 20 6c 65 66 74 20 69 6e 20 74 68  s .** left in th
6b20: 65 20 52 42 55 20 68 61 6e 64 6c 65 20 70 61 73  e RBU handle pas
6b30: 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
6b40: 20 61 72 67 75 6d 65 6e 74 2e 20 41 20 63 6f 70   argument. A cop
6b50: 79 20 6f 66 20 74 68 65 20 0a 2a 2a 20 65 72 72  y of the .** err
6b60: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
6b70: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
6b80: 6e 74 20 72 62 75 4f 62 6a 49 74 65 72 4e 65 78  nt rbuObjIterNex
6b90: 74 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c  t(sqlite3rbu *p,
6ba0: 20 52 62 75 4f 62 6a 49 74 65 72 20 2a 70 49 74   RbuObjIter *pIt
6bb0: 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
6bc0: 70 2d 3e 72 63 3b 0a 20 20 69 66 28 20 72 63 3d  p->rc;.  if( rc=
6bd0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 0a 20  =SQLITE_OK ){.. 
6be0: 20 20 20 2f 2a 20 46 72 65 65 20 61 6e 79 20 53     /* Free any S
6bf0: 51 4c 69 74 65 20 73 74 61 74 65 6d 65 6e 74 73  QLite statements
6c00: 20 75 73 65 64 20 77 68 69 6c 65 20 70 72 6f 63   used while proc
6c10: 65 73 73 69 6e 67 20 74 68 65 20 70 72 65 76 69  essing the previ
6c20: 6f 75 73 20 6f 62 6a 65 63 74 20 2a 2f 20 0a 20  ous object */ . 
6c30: 20 20 20 72 62 75 4f 62 6a 49 74 65 72 43 6c 65     rbuObjIterCle
6c40: 61 72 53 74 61 74 65 6d 65 6e 74 73 28 70 49 74  arStatements(pIt
6c50: 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74  er);.    if( pIt
6c60: 65 72 2d 3e 7a 49 64 78 3d 3d 30 20 29 7b 0a 20  er->zIdx==0 ){. 
6c70: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
6c80: 33 5f 65 78 65 63 28 70 2d 3e 64 62 4d 61 69 6e  3_exec(p->dbMain
6c90: 2c 0a 20 20 20 20 20 20 20 20 20 20 22 44 52 4f  ,.          "DRO
6ca0: 50 20 54 52 49 47 47 45 52 20 49 46 20 45 58 49  P TRIGGER IF EXI
6cb0: 53 54 53 20 74 65 6d 70 2e 72 62 75 5f 69 6e 73  STS temp.rbu_ins
6cc0: 65 72 74 5f 74 72 3b 22 0a 20 20 20 20 20 20 20  ert_tr;".       
6cd0: 20 20 20 22 44 52 4f 50 20 54 52 49 47 47 45 52     "DROP TRIGGER
6ce0: 20 49 46 20 45 58 49 53 54 53 20 74 65 6d 70 2e   IF EXISTS temp.
6cf0: 72 62 75 5f 75 70 64 61 74 65 31 5f 74 72 3b 22  rbu_update1_tr;"
6d00: 0a 20 20 20 20 20 20 20 20 20 20 22 44 52 4f 50  .          "DROP
6d10: 20 54 52 49 47 47 45 52 20 49 46 20 45 58 49 53   TRIGGER IF EXIS
6d20: 54 53 20 74 65 6d 70 2e 72 62 75 5f 75 70 64 61  TS temp.rbu_upda
6d30: 74 65 32 5f 74 72 3b 22 0a 20 20 20 20 20 20 20  te2_tr;".       
6d40: 20 20 20 22 44 52 4f 50 20 54 52 49 47 47 45 52     "DROP TRIGGER
6d50: 20 49 46 20 45 58 49 53 54 53 20 74 65 6d 70 2e   IF EXISTS temp.
6d60: 72 62 75 5f 64 65 6c 65 74 65 5f 74 72 3b 22 0a  rbu_delete_tr;".
6d70: 20 20 20 20 20 20 20 20 20 20 2c 20 30 2c 20 30            , 0, 0
6d80: 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 0a 20 20  , &p->zErrmsg.  
6d90: 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20      );.    }..  
6da0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
6db0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  _OK ){.      if(
6dc0: 20 70 49 74 65 72 2d 3e 62 43 6c 65 61 6e 75 70   pIter->bCleanup
6dd0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 62 75 4f   ){.        rbuO
6de0: 62 6a 49 74 65 72 46 72 65 65 43 6f 6c 73 28 70  bjIterFreeCols(p
6df0: 49 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 70  Iter);.        p
6e00: 49 74 65 72 2d 3e 62 43 6c 65 61 6e 75 70 20 3d  Iter->bCleanup =
6e10: 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   0;.        rc =
6e20: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 49   sqlite3_step(pI
6e30: 74 65 72 2d 3e 70 54 62 6c 49 74 65 72 29 3b 0a  ter->pTblIter);.
6e40: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
6e50: 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
6e60: 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 65 73          rc = res
6e70: 65 74 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f  etAndCollectErro
6e80: 72 28 70 49 74 65 72 2d 3e 70 54 62 6c 49 74 65  r(pIter->pTblIte
6e90: 72 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 29 3b  r, &p->zErrmsg);
6ea0: 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72  .          pIter
6eb0: 2d 3e 7a 54 62 6c 20 3d 20 30 3b 0a 20 20 20 20  ->zTbl = 0;.    
6ec0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6ed0: 20 20 20 20 20 70 49 74 65 72 2d 3e 7a 54 62 6c       pIter->zTbl
6ee0: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
6ef0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
6f00: 65 78 74 28 70 49 74 65 72 2d 3e 70 54 62 6c 49  ext(pIter->pTblI
6f10: 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ter, 0);.       
6f20: 20 20 20 70 49 74 65 72 2d 3e 7a 44 61 74 61 54     pIter->zDataT
6f30: 62 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  bl = (const char
6f40: 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
6f50: 5f 74 65 78 74 28 70 49 74 65 72 2d 3e 70 54 62  _text(pIter->pTb
6f60: 6c 49 74 65 72 2c 31 29 3b 0a 20 20 20 20 20 20  lIter,1);.      
6f70: 20 20 20 20 72 63 20 3d 20 28 70 49 74 65 72 2d      rc = (pIter-
6f80: 3e 7a 44 61 74 61 54 62 6c 20 26 26 20 70 49 74  >zDataTbl && pIt
6f90: 65 72 2d 3e 7a 54 62 6c 29 20 3f 20 53 51 4c 49  er->zTbl) ? SQLI
6fa0: 54 45 5f 4f 4b 20 3a 20 53 51 4c 49 54 45 5f 4e  TE_OK : SQLITE_N
6fb0: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 7d 0a  OMEM;.        }.
6fc0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
6fd0: 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e       if( pIter->
6fe0: 7a 49 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  zIdx==0 ){.     
6ff0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d       sqlite3_stm
7000: 74 20 2a 70 49 64 78 20 3d 20 70 49 74 65 72 2d  t *pIdx = pIter-
7010: 3e 70 49 64 78 49 74 65 72 3b 0a 20 20 20 20 20  >pIdxIter;.     
7020: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
7030: 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 49 64 78  3_bind_text(pIdx
7040: 2c 20 31 2c 20 70 49 74 65 72 2d 3e 7a 54 62 6c  , 1, pIter->zTbl
7050: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41  , -1, SQLITE_STA
7060: 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  TIC);.        }.
7070: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
7080: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
7090: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
70a0: 74 65 33 5f 73 74 65 70 28 70 49 74 65 72 2d 3e  te3_step(pIter->
70b0: 70 49 64 78 49 74 65 72 29 3b 0a 20 20 20 20 20  pIdxIter);.     
70c0: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
70d0: 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20  ITE_ROW ){.     
70e0: 20 20 20 20 20 20 20 72 63 20 3d 20 72 65 73 65         rc = rese
70f0: 74 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72  tAndCollectError
7100: 28 70 49 74 65 72 2d 3e 70 49 64 78 49 74 65 72  (pIter->pIdxIter
7110: 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a  , &p->zErrmsg);.
7120: 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
7130: 72 2d 3e 62 43 6c 65 61 6e 75 70 20 3d 20 31 3b  r->bCleanup = 1;
7140: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74  .            pIt
7150: 65 72 2d 3e 7a 49 64 78 20 3d 20 30 3b 0a 20 20  er->zIdx = 0;.  
7160: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
7170: 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72             pIter
7180: 2d 3e 7a 49 64 78 20 3d 20 28 63 6f 6e 73 74 20  ->zIdx = (const 
7190: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
71a0: 6c 75 6d 6e 5f 74 65 78 74 28 70 49 74 65 72 2d  lumn_text(pIter-
71b0: 3e 70 49 64 78 49 74 65 72 2c 20 30 29 3b 0a 20  >pIdxIter, 0);. 
71c0: 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72             pIter
71d0: 2d 3e 69 54 6e 75 6d 20 3d 20 73 71 6c 69 74 65  ->iTnum = sqlite
71e0: 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 49 74  3_column_int(pIt
71f0: 65 72 2d 3e 70 49 64 78 49 74 65 72 2c 20 31 29  er->pIdxIter, 1)
7200: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49  ;.            pI
7210: 74 65 72 2d 3e 62 55 6e 69 71 75 65 20 3d 20 73  ter->bUnique = s
7220: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
7230: 74 28 70 49 74 65 72 2d 3e 70 49 64 78 49 74 65  t(pIter->pIdxIte
7240: 72 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20 20  r, 2);.         
7250: 20 20 20 72 63 20 3d 20 70 49 74 65 72 2d 3e 7a     rc = pIter->z
7260: 49 64 78 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20  Idx ? SQLITE_OK 
7270: 3a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  : SQLITE_NOMEM;.
7280: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
7290: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
72a0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72    }.  }..  if( r
72b0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
72c0: 20 20 20 20 72 62 75 4f 62 6a 49 74 65 72 46 69      rbuObjIterFi
72d0: 6e 61 6c 69 7a 65 28 70 49 74 65 72 29 3b 0a 20  nalize(pIter);. 
72e0: 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20     p->rc = rc;. 
72f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
7300: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6d  }.../*.** The im
7310: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
7320: 74 68 65 20 72 62 75 5f 74 61 72 67 65 74 5f 6e  the rbu_target_n
7330: 61 6d 65 28 29 20 53 51 4c 20 66 75 6e 63 74 69  ame() SQL functi
7340: 6f 6e 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  on. This functio
7350: 6e 0a 2a 2a 20 61 63 63 65 70 74 73 20 6f 6e 65  n.** accepts one
7360: 20 6f 72 20 74 77 6f 20 61 72 67 75 6d 65 6e 74   or two argument
7370: 73 2e 20 54 68 65 20 66 69 72 73 74 20 61 72 67  s. The first arg
7380: 75 6d 65 6e 74 20 69 73 20 74 68 65 20 6e 61 6d  ument is the nam
7390: 65 20 6f 66 20 61 20 74 61 62 6c 65 20 2d 0a 2a  e of a table -.*
73a0: 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  * the name of a 
73b0: 74 61 62 6c 65 20 69 6e 20 74 68 65 20 52 42 55  table in the RBU
73c0: 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20   database.  The 
73d0: 73 65 63 6f 6e 64 2c 20 69 66 20 69 74 20 69 73  second, if it is
73e0: 20 70 72 65 73 65 6e 74 2c 20 69 73 20 31 0a 2a   present, is 1.*
73f0: 2a 20 66 6f 72 20 61 20 76 69 65 77 20 6f 72 20  * for a view or 
7400: 30 20 66 6f 72 20 61 20 74 61 62 6c 65 2e 20 0a  0 for a table. .
7410: 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 6e 6f 6e 2d  **.** For a non-
7420: 76 61 63 75 75 6d 20 52 42 55 20 68 61 6e 64 6c  vacuum RBU handl
7430: 65 2c 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  e, if the table 
7440: 6e 61 6d 65 20 6d 61 74 63 68 65 73 20 74 68 65  name matches the
7450: 20 70 61 74 74 65 72 6e 3a 0a 2a 2a 0a 2a 2a 20   pattern:.**.** 
7460: 20 20 20 20 64 61 74 61 5b 30 2d 39 5d 5f 3c 6e      data[0-9]_<n
7470: 61 6d 65 3e 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65  ame>.**.** where
7480: 20 3c 6e 61 6d 65 3e 20 69 73 20 61 6e 79 20 73   <name> is any s
7490: 65 71 75 65 6e 63 65 20 6f 66 20 31 20 6f 72 20  equence of 1 or 
74a0: 6d 6f 72 65 20 63 68 61 72 61 63 74 65 72 73 2c  more characters,
74b0: 20 3c 6e 61 6d 65 3e 20 69 73 20 72 65 74 75 72   <name> is retur
74c0: 6e 65 64 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ned..** Otherwis
74d0: 65 2c 20 69 66 20 74 68 65 20 6f 6e 6c 79 20 61  e, if the only a
74e0: 72 67 75 6d 65 6e 74 20 64 6f 65 73 20 6e 6f 74  rgument does not
74f0: 20 6d 61 74 63 68 20 74 68 65 20 61 62 6f 76 65   match the above
7500: 20 70 61 74 74 65 72 6e 2c 20 61 6e 20 53 51 4c   pattern, an SQL
7510: 0a 2a 2a 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  .** NULL is retu
7520: 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  rned..**.**     
7530: 22 64 61 74 61 5f 74 31 22 20 20 20 20 20 2d 3e  "data_t1"     ->
7540: 20 22 74 31 22 0a 2a 2a 20 20 20 20 20 22 64 61   "t1".**     "da
7550: 74 61 30 31 32 33 5f 74 32 22 20 2d 3e 20 22 74  ta0123_t2" -> "t
7560: 32 22 0a 2a 2a 20 20 20 20 20 22 64 61 74 61 41  2".**     "dataA
7570: 42 5f 74 33 22 20 20 20 2d 3e 20 4e 55 4c 4c 0a  B_t3"   -> NULL.
7580: 2a 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 72 62 75  **.** For an rbu
7590: 20 76 61 63 75 75 6d 20 68 61 6e 64 6c 65 2c 20   vacuum handle, 
75a0: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 66 69  a copy of the fi
75b0: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  rst argument is 
75c0: 72 65 74 75 72 6e 65 64 20 69 66 0a 2a 2a 20 74  returned if.** t
75d0: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
75e0: 6e 74 20 69 73 20 65 69 74 68 65 72 20 6d 69 73  nt is either mis
75f0: 73 69 6e 67 20 6f 72 20 30 20 28 6e 6f 74 20 61  sing or 0 (not a
7600: 20 76 69 65 77 29 2e 0a 2a 2f 0a 73 74 61 74 69   view)..*/.stati
7610: 63 20 76 6f 69 64 20 72 62 75 54 61 72 67 65 74  c void rbuTarget
7620: 4e 61 6d 65 46 75 6e 63 28 0a 20 20 73 71 6c 69  NameFunc(.  sqli
7630: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74  te3_context *pCt
7640: 78 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  x,.  int argc,. 
7650: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
7660: 2a 61 72 67 76 0a 29 7b 0a 20 20 73 71 6c 69 74  *argv.){.  sqlit
7670: 65 33 72 62 75 20 2a 70 20 3d 20 73 71 6c 69 74  e3rbu *p = sqlit
7680: 65 33 5f 75 73 65 72 5f 64 61 74 61 28 70 43 74  e3_user_data(pCt
7690: 78 29 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  x);.  const char
76a0: 20 2a 7a 49 6e 3b 0a 20 20 61 73 73 65 72 74 28   *zIn;.  assert(
76b0: 20 61 72 67 63 3d 3d 31 20 7c 7c 20 61 72 67 63   argc==1 || argc
76c0: 3d 3d 32 20 29 3b 0a 0a 20 20 7a 49 6e 20 3d 20  ==2 );..  zIn = 
76d0: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
76e0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
76f0: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28 20  argv[0]);.  if( 
7700: 7a 49 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 72  zIn ){.    if( r
7710: 62 75 49 73 56 61 63 75 75 6d 28 70 29 20 29 7b  buIsVacuum(p) ){
7720: 0a 20 20 20 20 20 20 69 66 28 20 61 72 67 63 3d  .      if( argc=
7730: 3d 31 20 7c 7c 20 30 3d 3d 73 71 6c 69 74 65 33  =1 || 0==sqlite3
7740: 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b  _value_int(argv[
7750: 31 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  1]) ){.        s
7760: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
7770: 78 74 28 70 43 74 78 2c 20 7a 49 6e 2c 20 2d 31  xt(pCtx, zIn, -1
7780: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
7790: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
77a0: 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 73  lse{.      if( s
77b0: 74 72 6c 65 6e 28 7a 49 6e 29 3e 34 20 26 26 20  trlen(zIn)>4 && 
77c0: 6d 65 6d 63 6d 70 28 22 64 61 74 61 22 2c 20 7a  memcmp("data", z
77d0: 49 6e 2c 20 34 29 3d 3d 30 20 29 7b 0a 20 20 20  In, 4)==0 ){.   
77e0: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
77f0: 20 20 20 20 66 6f 72 28 69 3d 34 3b 20 7a 49 6e      for(i=4; zIn
7800: 5b 69 5d 3e 3d 27 30 27 20 26 26 20 7a 49 6e 5b  [i]>='0' && zIn[
7810: 69 5d 3c 3d 27 39 27 3b 20 69 2b 2b 29 3b 0a 20  i]<='9'; i++);. 
7820: 20 20 20 20 20 20 20 69 66 28 20 7a 49 6e 5b 69         if( zIn[i
7830: 5d 3d 3d 27 5f 27 20 26 26 20 7a 49 6e 5b 69 2b  ]=='_' && zIn[i+
7840: 31 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  1] ){.          
7850: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
7860: 65 78 74 28 70 43 74 78 2c 20 26 7a 49 6e 5b 69  ext(pCtx, &zIn[i
7870: 2b 31 5d 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  +1], -1, SQLITE_
7880: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20  STATIC);.       
7890: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
78a0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  .  }.}../*.** In
78b0: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 69 74 65  itialize the ite
78c0: 72 61 74 6f 72 20 73 74 72 75 63 74 75 72 65 20  rator structure 
78d0: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
78e0: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  cond argument..*
78f0: 2a 0a 2a 2a 20 49 66 20 6e 6f 20 65 72 72 6f 72  *.** If no error
7900: 20 6f 63 63 75 72 73 2c 20 53 51 4c 49 54 45 5f   occurs, SQLITE_
7910: 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  OK is returned a
7920: 6e 64 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  nd the iterator 
7930: 69 73 20 6c 65 66 74 20 0a 2a 2a 20 70 6f 69 6e  is left .** poin
7940: 74 69 6e 67 20 74 6f 20 74 68 65 20 66 69 72 73  ting to the firs
7950: 74 20 65 6e 74 72 79 2e 20 4f 74 68 65 72 77 69  t entry. Otherwi
7960: 73 65 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  se, an error cod
7970: 65 20 61 6e 64 20 6d 65 73 73 61 67 65 20 69 73  e and message is
7980: 20 0a 2a 2a 20 6c 65 66 74 20 69 6e 20 74 68 65   .** left in the
7990: 20 52 42 55 20 68 61 6e 64 6c 65 20 70 61 73 73   RBU handle pass
79a0: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
79b0: 61 72 67 75 6d 65 6e 74 2e 20 41 20 63 6f 70 79  argument. A copy
79c0: 20 6f 66 20 74 68 65 20 0a 2a 2a 20 65 72 72 6f   of the .** erro
79d0: 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
79e0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
79f0: 74 20 72 62 75 4f 62 6a 49 74 65 72 46 69 72 73  t rbuObjIterFirs
7a00: 74 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c  t(sqlite3rbu *p,
7a10: 20 52 62 75 4f 62 6a 49 74 65 72 20 2a 70 49 74   RbuObjIter *pIt
7a20: 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
7a30: 20 6d 65 6d 73 65 74 28 70 49 74 65 72 2c 20 30   memset(pIter, 0
7a40: 2c 20 73 69 7a 65 6f 66 28 52 62 75 4f 62 6a 49  , sizeof(RbuObjI
7a50: 74 65 72 29 29 3b 0a 0a 20 20 72 63 20 3d 20 70  ter));..  rc = p
7a60: 72 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f 6c  repareFreeAndCol
7a70: 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 52  lectError(p->dbR
7a80: 62 75 2c 20 26 70 49 74 65 72 2d 3e 70 54 62 6c  bu, &pIter->pTbl
7a90: 49 74 65 72 2c 20 26 70 2d 3e 7a 45 72 72 6d 73  Iter, &p->zErrms
7aa0: 67 2c 20 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  g, .    sqlite3_
7ab0: 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 22  mprintf(.      "
7ac0: 53 45 4c 45 43 54 20 72 62 75 5f 74 61 72 67 65  SELECT rbu_targe
7ad0: 74 5f 6e 61 6d 65 28 6e 61 6d 65 2c 20 74 79 70  t_name(name, typ
7ae0: 65 3d 27 76 69 65 77 27 29 20 41 53 20 74 61 72  e='view') AS tar
7af0: 67 65 74 2c 20 6e 61 6d 65 20 22 0a 20 20 20 20  get, name ".    
7b00: 20 20 22 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d    "FROM sqlite_m
7b10: 61 73 74 65 72 20 22 0a 20 20 20 20 20 20 22 57  aster ".      "W
7b20: 48 45 52 45 20 74 79 70 65 20 49 4e 20 28 27 74  HERE type IN ('t
7b30: 61 62 6c 65 27 2c 20 27 76 69 65 77 27 29 20 41  able', 'view') A
7b40: 4e 44 20 74 61 72 67 65 74 20 49 53 20 4e 4f 54  ND target IS NOT
7b50: 20 4e 55 4c 4c 20 22 0a 20 20 20 20 20 20 22 20   NULL ".      " 
7b60: 25 73 20 22 0a 20 20 20 20 20 20 22 4f 52 44 45  %s ".      "ORDE
7b70: 52 20 42 59 20 6e 61 6d 65 22 0a 20 20 2c 20 72  R BY name".  , r
7b80: 62 75 49 73 56 61 63 75 75 6d 28 70 29 20 3f 20  buIsVacuum(p) ? 
7b90: 22 41 4e 44 20 72 6f 6f 74 70 61 67 65 21 3d 30  "AND rootpage!=0
7ba0: 20 41 4e 44 20 72 6f 6f 74 70 61 67 65 20 49 53   AND rootpage IS
7bb0: 20 4e 4f 54 20 4e 55 4c 4c 22 20 3a 20 22 22 29   NOT NULL" : "")
7bc0: 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  );..  if( rc==SQ
7bd0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
7be0: 63 20 3d 20 70 72 65 70 61 72 65 41 6e 64 43 6f  c = prepareAndCo
7bf0: 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62  llectError(p->db
7c00: 4d 61 69 6e 2c 20 26 70 49 74 65 72 2d 3e 70 49  Main, &pIter->pI
7c10: 64 78 49 74 65 72 2c 20 26 70 2d 3e 7a 45 72 72  dxIter, &p->zErr
7c20: 6d 73 67 2c 0a 20 20 20 20 20 20 20 20 22 53 45  msg,.        "SE
7c30: 4c 45 43 54 20 6e 61 6d 65 2c 20 72 6f 6f 74 70  LECT name, rootp
7c40: 61 67 65 2c 20 73 71 6c 20 49 53 20 4e 55 4c 4c  age, sql IS NULL
7c50: 20 4f 52 20 73 75 62 73 74 72 28 38 2c 20 36 29   OR substr(8, 6)
7c60: 3d 3d 27 55 4e 49 51 55 45 27 20 22 0a 20 20 20  =='UNIQUE' ".   
7c70: 20 20 20 20 20 22 20 20 46 52 4f 4d 20 6d 61 69       "  FROM mai
7c80: 6e 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  n.sqlite_master 
7c90: 22 0a 20 20 20 20 20 20 20 20 22 20 20 57 48 45  ".        "  WHE
7ca0: 52 45 20 74 79 70 65 3d 27 69 6e 64 65 78 27 20  RE type='index' 
7cb0: 41 4e 44 20 74 62 6c 5f 6e 61 6d 65 20 3d 20 3f  AND tbl_name = ?
7cc0: 22 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20  ".    );.  }..  
7cd0: 70 49 74 65 72 2d 3e 62 43 6c 65 61 6e 75 70 20  pIter->bCleanup 
7ce0: 3d 20 31 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 72  = 1;.  p->rc = r
7cf0: 63 3b 0a 20 20 72 65 74 75 72 6e 20 72 62 75 4f  c;.  return rbuO
7d00: 62 6a 49 74 65 72 4e 65 78 74 28 70 2c 20 70 49  bjIterNext(p, pI
7d10: 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ter);.}../*.** T
7d20: 68 69 73 20 69 73 20 61 20 77 72 61 70 70 65 72  his is a wrapper
7d30: 20 61 72 6f 75 6e 64 20 22 73 71 6c 69 74 65 33   around "sqlite3
7d40: 5f 6d 70 72 69 6e 74 66 28 7a 46 6d 74 2c 20 2e  _mprintf(zFmt, .
7d50: 2e 2e 29 22 2e 20 49 66 20 61 6e 20 4f 4f 4d 20  ..)". If an OOM 
7d60: 6f 63 63 75 72 73 2c 0a 2a 2a 20 61 6e 20 65 72  occurs,.** an er
7d70: 72 6f 72 20 63 6f 64 65 20 69 73 20 73 74 6f 72  ror code is stor
7d80: 65 64 20 69 6e 20 74 68 65 20 52 42 55 20 68 61  ed in the RBU ha
7d90: 6e 64 6c 65 20 70 61 73 73 65 64 20 61 73 20 74  ndle passed as t
7da0: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
7db0: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  t..**.** If an e
7dc0: 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79  rror has already
7dd0: 20 6f 63 63 75 72 72 65 64 20 28 70 2d 3e 72 63   occurred (p->rc
7de0: 20 69 73 20 61 6c 72 65 61 64 79 20 73 65 74 20   is already set 
7df0: 74 6f 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68  to something oth
7e00: 65 72 0a 2a 2a 20 74 68 61 6e 20 53 51 4c 49 54  er.** than SQLIT
7e10: 45 5f 4f 4b 29 2c 20 74 68 65 6e 20 74 68 69 73  E_OK), then this
7e20: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
7e30: 73 20 4e 55 4c 4c 20 77 69 74 68 6f 75 74 20 6d  s NULL without m
7e40: 6f 64 69 66 79 69 6e 67 20 74 68 65 0a 2a 2a 20  odifying the.** 
7e50: 73 74 6f 72 65 64 20 65 72 72 6f 72 20 63 6f 64  stored error cod
7e60: 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  e. In this case 
7e70: 69 74 20 73 74 69 6c 6c 20 63 61 6c 6c 73 20 73  it still calls s
7e80: 71 6c 69 74 65 33 5f 66 72 65 65 28 29 20 6f 6e  qlite3_free() on
7e90: 20 61 6e 79 20 0a 2a 2a 20 70 72 69 6e 74 66 28   any .** printf(
7ea0: 29 20 70 61 72 61 6d 65 74 65 72 73 20 61 73 73  ) parameters ass
7eb0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 25 7a 20  ociated with %z 
7ec0: 63 6f 6e 76 65 72 73 69 6f 6e 73 2e 0a 2a 2f 0a  conversions..*/.
7ed0: 73 74 61 74 69 63 20 63 68 61 72 20 2a 72 62 75  static char *rbu
7ee0: 4d 50 72 69 6e 74 66 28 73 71 6c 69 74 65 33 72  MPrintf(sqlite3r
7ef0: 62 75 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  bu *p, const cha
7f00: 72 20 2a 7a 46 6d 74 2c 20 2e 2e 2e 29 7b 0a 20  r *zFmt, ...){. 
7f10: 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 30 3b   char *zSql = 0;
7f20: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
7f30: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46   va_start(ap, zF
7f40: 6d 74 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71  mt);.  zSql = sq
7f50: 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a  lite3_vmprintf(z
7f60: 46 6d 74 2c 20 61 70 29 3b 0a 20 20 69 66 28 20  Fmt, ap);.  if( 
7f70: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
7f80: 20 29 7b 0a 20 20 20 20 69 66 28 20 7a 53 71 6c   ){.    if( zSql
7f90: 3d 3d 30 20 29 20 70 2d 3e 72 63 20 3d 20 53 51  ==0 ) p->rc = SQ
7fa0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65  LITE_NOMEM;.  }e
7fb0: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
7fc0: 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20  _free(zSql);.   
7fd0: 20 7a 53 71 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20   zSql = 0;.  }. 
7fe0: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72   va_end(ap);.  r
7ff0: 65 74 75 72 6e 20 7a 53 71 6c 3b 0a 7d 0a 0a 2f  eturn zSql;.}../
8000: 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 7a 46  *.** Argument zF
8010: 6d 74 20 69 73 20 61 20 73 71 6c 69 74 65 33 5f  mt is a sqlite3_
8020: 6d 70 72 69 6e 74 66 28 29 20 73 74 79 6c 65 20  mprintf() style 
8030: 66 6f 72 6d 61 74 20 73 74 72 69 6e 67 2e 20 54  format string. T
8040: 68 65 20 74 72 61 69 6c 69 6e 67 0a 2a 2a 20 61  he trailing.** a
8050: 72 67 75 6d 65 6e 74 73 20 61 72 65 20 74 68 65  rguments are the
8060: 20 75 73 75 61 6c 20 73 75 62 73 69 74 75 74 69   usual subsituti
8070: 6f 6e 20 76 61 6c 75 65 73 2e 20 54 68 69 73 20  on values. This 
8080: 66 75 6e 63 74 69 6f 6e 20 70 65 72 66 6f 72 6d  function perform
8090: 73 0a 2a 2a 20 74 68 65 20 70 72 69 6e 74 66 28  s.** the printf(
80a0: 29 20 73 74 79 6c 65 20 73 75 62 73 74 69 74 75  ) style substitu
80b0: 74 69 6f 6e 73 20 61 6e 64 20 65 78 65 63 75 74  tions and execut
80c0: 65 73 20 74 68 65 20 72 65 73 75 6c 74 20 61 73  es the result as
80d0: 20 61 6e 20 53 51 4c 0a 2a 2a 20 73 74 61 74 65   an SQL.** state
80e0: 6d 65 6e 74 20 6f 6e 20 74 68 65 20 52 42 55 20  ment on the RBU 
80f0: 68 61 6e 64 6c 65 73 20 64 61 74 61 62 61 73 65  handles database
8100: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
8110: 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65  ror occurs, an e
8120: 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 65 72  rror code and er
8130: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 73  ror message is s
8140: 74 6f 72 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20  tored in the.** 
8150: 52 42 55 20 68 61 6e 64 6c 65 2e 20 49 66 20 61  RBU handle. If a
8160: 6e 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65  n error has alre
8170: 61 64 79 20 6f 63 63 75 72 72 65 64 20 77 68 65  ady occurred whe
8180: 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
8190: 69 73 0a 2a 2a 20 63 61 6c 6c 65 64 2c 20 69 74  is.** called, it
81a0: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
81b0: 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 4d 50  static int rbuMP
81c0: 72 69 6e 74 66 45 78 65 63 28 73 71 6c 69 74 65  rintfExec(sqlite
81d0: 33 72 62 75 20 2a 70 2c 20 73 71 6c 69 74 65 33  3rbu *p, sqlite3
81e0: 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72   *db, const char
81f0: 20 2a 7a 46 6d 74 2c 20 2e 2e 2e 29 7b 0a 20 20   *zFmt, ...){.  
8200: 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63 68  va_list ap;.  ch
8210: 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 76 61 5f 73  ar *zSql;.  va_s
8220: 74 61 72 74 28 61 70 2c 20 7a 46 6d 74 29 3b 0a  tart(ap, zFmt);.
8230: 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
8240: 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6d 74 2c 20  _vmprintf(zFmt, 
8250: 61 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63  ap);.  if( p->rc
8260: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
8270: 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29     if( zSql==0 )
8280: 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20  {.      p->rc = 
8290: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
82a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
82b0: 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65  ->rc = sqlite3_e
82c0: 78 65 63 28 64 62 2c 20 7a 53 71 6c 2c 20 30 2c  xec(db, zSql, 0,
82d0: 20 30 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 29   0, &p->zErrmsg)
82e0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
82f0: 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29  lite3_free(zSql)
8300: 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a  ;.  va_end(ap);.
8310: 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 3b 0a    return p->rc;.
8320: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  }../*.** Attempt
8330: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64   to allocate and
8340: 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
8350: 72 20 74 6f 20 61 20 7a 65 72 6f 65 64 20 62 6c  r to a zeroed bl
8360: 6f 63 6b 20 6f 66 20 6e 42 79 74 65 20 0a 2a 2a  ock of nByte .**
8370: 20 62 79 74 65 73 2e 20 0a 2a 2a 0a 2a 2a 20 49   bytes. .**.** I
8380: 66 20 61 6e 20 65 72 72 6f 72 20 28 69 2e 65 2e  f an error (i.e.
8390: 20 61 6e 20 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f   an OOM conditio
83a0: 6e 29 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  n) occurs, retur
83b0: 6e 20 4e 55 4c 4c 20 61 6e 64 20 6c 65 61 76 65  n NULL and leave
83c0: 20 61 6e 20 0a 2a 2a 20 65 72 72 6f 72 20 63 6f   an .** error co
83d0: 64 65 20 69 6e 20 74 68 65 20 72 62 75 20 68 61  de in the rbu ha
83e0: 6e 64 6c 65 20 70 61 73 73 65 64 20 61 73 20 74  ndle passed as t
83f0: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
8400: 74 2e 20 4f 72 2c 20 69 66 20 61 6e 20 0a 2a 2a  t. Or, if an .**
8410: 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61   error has alrea
8420: 64 79 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e  dy occurred when
8430: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
8440: 73 20 63 61 6c 6c 65 64 2c 20 72 65 74 75 72 6e  s called, return
8450: 20 4e 55 4c 4c 20 0a 2a 2a 20 69 6d 6d 65 64 69   NULL .** immedi
8460: 61 74 65 6c 79 20 77 69 74 68 6f 75 74 20 61 74  ately without at
8470: 74 65 6d 70 74 69 6e 67 20 74 68 65 20 61 6c 6c  tempting the all
8480: 6f 63 61 74 69 6f 6e 20 6f 72 20 6d 6f 64 69 66  ocation or modif
8490: 79 69 6e 67 20 74 68 65 20 73 74 6f 72 65 64 0a  ying the stored.
84a0: 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  ** error code..*
84b0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 72  /.static void *r
84c0: 62 75 4d 61 6c 6c 6f 63 28 73 71 6c 69 74 65 33  buMalloc(sqlite3
84d0: 72 62 75 20 2a 70 2c 20 69 6e 74 20 6e 42 79 74  rbu *p, int nByt
84e0: 65 29 7b 0a 20 20 76 6f 69 64 20 2a 70 52 65 74  e){.  void *pRet
84f0: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 72   = 0;.  if( p->r
8500: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
8510: 20 20 20 20 61 73 73 65 72 74 28 20 6e 42 79 74      assert( nByt
8520: 65 3e 30 20 29 3b 0a 20 20 20 20 70 52 65 74 20  e>0 );.    pRet 
8530: 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
8540: 36 34 28 6e 42 79 74 65 29 3b 0a 20 20 20 20 69  64(nByte);.    i
8550: 66 28 20 70 52 65 74 3d 3d 30 20 29 7b 0a 20 20  f( pRet==0 ){.  
8560: 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
8570: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65  TE_NOMEM;.    }e
8580: 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65  lse{.      memse
8590: 74 28 70 52 65 74 2c 20 30 2c 20 6e 42 79 74 65  t(pRet, 0, nByte
85a0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
85b0: 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 0a  eturn pRet;.}...
85c0: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
85d0: 6e 64 20 7a 65 72 6f 20 74 68 65 20 70 49 74 65  nd zero the pIte
85e0: 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 5d 20 61 6e  r->azTblCol[] an
85f0: 64 20 61 62 54 62 6c 50 6b 5b 5d 20 61 72 72 61  d abTblPk[] arra
8600: 79 73 20 73 6f 20 74 68 61 74 0a 2a 2a 20 74 68  ys so that.** th
8610: 65 72 65 20 69 73 20 72 6f 6f 6d 20 66 6f 72 20  ere is room for 
8620: 61 74 20 6c 65 61 73 74 20 6e 43 6f 6c 20 65 6c  at least nCol el
8630: 65 6d 65 6e 74 73 2e 20 49 66 20 61 6e 20 4f 4f  ements. If an OO
8640: 4d 20 6f 63 63 75 72 73 2c 20 73 74 6f 72 65 20  M occurs, store 
8650: 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65  an.** error code
8660: 20 69 6e 20 74 68 65 20 52 42 55 20 68 61 6e 64   in the RBU hand
8670: 6c 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  le passed as the
8680: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
8690: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
86a0: 72 62 75 41 6c 6c 6f 63 61 74 65 49 74 65 72 41  rbuAllocateIterA
86b0: 72 72 61 79 73 28 73 71 6c 69 74 65 33 72 62 75  rrays(sqlite3rbu
86c0: 20 2a 70 2c 20 52 62 75 4f 62 6a 49 74 65 72 20   *p, RbuObjIter 
86d0: 2a 70 49 74 65 72 2c 20 69 6e 74 20 6e 43 6f 6c  *pIter, int nCol
86e0: 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d  ){.  int nByte =
86f0: 20 28 32 2a 73 69 7a 65 6f 66 28 63 68 61 72 2a   (2*sizeof(char*
8700: 29 20 2b 20 73 69 7a 65 6f 66 28 69 6e 74 29 20  ) + sizeof(int) 
8710: 2b 20 33 2a 73 69 7a 65 6f 66 28 75 38 29 29 20  + 3*sizeof(u8)) 
8720: 2a 20 6e 43 6f 6c 3b 0a 20 20 63 68 61 72 20 2a  * nCol;.  char *
8730: 2a 61 7a 4e 65 77 3b 0a 0a 20 20 61 7a 4e 65 77  *azNew;..  azNew
8740: 20 3d 20 28 63 68 61 72 2a 2a 29 72 62 75 4d 61   = (char**)rbuMa
8750: 6c 6c 6f 63 28 70 2c 20 6e 42 79 74 65 29 3b 0a  lloc(p, nByte);.
8760: 20 20 69 66 28 20 61 7a 4e 65 77 20 29 7b 0a 20    if( azNew ){. 
8770: 20 20 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43     pIter->azTblC
8780: 6f 6c 20 3d 20 61 7a 4e 65 77 3b 0a 20 20 20 20  ol = azNew;.    
8790: 70 49 74 65 72 2d 3e 61 7a 54 62 6c 54 79 70 65  pIter->azTblType
87a0: 20 3d 20 26 61 7a 4e 65 77 5b 6e 43 6f 6c 5d 3b   = &azNew[nCol];
87b0: 0a 20 20 20 20 70 49 74 65 72 2d 3e 61 69 53 72  .    pIter->aiSr
87c0: 63 4f 72 64 65 72 20 3d 20 28 69 6e 74 2a 29 26  cOrder = (int*)&
87d0: 70 49 74 65 72 2d 3e 61 7a 54 62 6c 54 79 70 65  pIter->azTblType
87e0: 5b 6e 43 6f 6c 5d 3b 0a 20 20 20 20 70 49 74 65  [nCol];.    pIte
87f0: 72 2d 3e 61 62 54 62 6c 50 6b 20 3d 20 28 75 38  r->abTblPk = (u8
8800: 2a 29 26 70 49 74 65 72 2d 3e 61 69 53 72 63 4f  *)&pIter->aiSrcO
8810: 72 64 65 72 5b 6e 43 6f 6c 5d 3b 0a 20 20 20 20  rder[nCol];.    
8820: 70 49 74 65 72 2d 3e 61 62 4e 6f 74 4e 75 6c 6c  pIter->abNotNull
8830: 20 3d 20 28 75 38 2a 29 26 70 49 74 65 72 2d 3e   = (u8*)&pIter->
8840: 61 62 54 62 6c 50 6b 5b 6e 43 6f 6c 5d 3b 0a 20  abTblPk[nCol];. 
8850: 20 20 20 70 49 74 65 72 2d 3e 61 62 49 6e 64 65     pIter->abInde
8860: 78 65 64 20 3d 20 28 75 38 2a 29 26 70 49 74 65  xed = (u8*)&pIte
8870: 72 2d 3e 61 62 4e 6f 74 4e 75 6c 6c 5b 6e 43 6f  r->abNotNull[nCo
8880: 6c 5d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  l];.  }.}../*.**
8890: 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   The first argum
88a0: 65 6e 74 20 6d 75 73 74 20 62 65 20 61 20 6e 75  ent must be a nu
88b0: 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72  l-terminated str
88c0: 69 6e 67 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ing. This functi
88d0: 6f 6e 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61 20  on.** returns a 
88e0: 63 6f 70 79 20 6f 66 20 74 68 65 20 73 74 72 69  copy of the stri
88f0: 6e 67 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74  ng in memory obt
8900: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
8910: 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20  e3_malloc()..** 
8920: 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e  It is the respon
8930: 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
8940: 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75  caller to eventu
8950: 61 6c 6c 79 20 66 72 65 65 20 74 68 69 73 20 6d  ally free this m
8960: 65 6d 6f 72 79 0a 2a 2a 20 75 73 69 6e 67 20 73  emory.** using s
8970: 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a  qlite3_free()..*
8980: 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 63  *.** If an OOM c
8990: 6f 6e 64 69 74 69 6f 6e 20 69 73 20 65 6e 63 6f  ondition is enco
89a0: 75 6e 74 65 72 65 64 20 77 68 65 6e 20 61 74 74  untered when att
89b0: 65 6d 70 74 69 6e 67 20 74 6f 20 61 6c 6c 6f 63  empting to alloc
89c0: 61 74 65 20 6d 65 6d 6f 72 79 2c 0a 2a 2a 20 6f  ate memory,.** o
89d0: 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 20 28  utput variable (
89e0: 2a 70 52 63 29 20 69 73 20 73 65 74 20 74 6f 20  *pRc) is set to 
89f0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 62 65 66  SQLITE_NOMEM bef
8a00: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 4f  ore returning. O
8a10: 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 69 66 20  therwise,.** if 
8a20: 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73  the allocation s
8a30: 75 63 63 65 65 64 73 2c 20 28 2a 70 52 63 29 20  ucceeds, (*pRc) 
8a40: 69 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65  is left unchange
8a50: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  d..*/.static cha
8a60: 72 20 2a 72 62 75 53 74 72 6e 64 75 70 28 63 6f  r *rbuStrndup(co
8a70: 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 72 2c 20  nst char *zStr, 
8a80: 69 6e 74 20 2a 70 52 63 29 7b 0a 20 20 63 68 61  int *pRc){.  cha
8a90: 72 20 2a 7a 52 65 74 20 3d 20 30 3b 0a 0a 20 20  r *zRet = 0;..  
8aa0: 61 73 73 65 72 74 28 20 2a 70 52 63 3d 3d 53 51  assert( *pRc==SQ
8ab0: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28  LITE_OK );.  if(
8ac0: 20 7a 53 74 72 20 29 7b 0a 20 20 20 20 73 69 7a   zStr ){.    siz
8ad0: 65 5f 74 20 6e 43 6f 70 79 20 3d 20 73 74 72 6c  e_t nCopy = strl
8ae0: 65 6e 28 7a 53 74 72 29 20 2b 20 31 3b 0a 20 20  en(zStr) + 1;.  
8af0: 20 20 7a 52 65 74 20 3d 20 28 63 68 61 72 2a 29    zRet = (char*)
8b00: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
8b10: 28 6e 43 6f 70 79 29 3b 0a 20 20 20 20 69 66 28  (nCopy);.    if(
8b20: 20 7a 52 65 74 20 29 7b 0a 20 20 20 20 20 20 6d   zRet ){.      m
8b30: 65 6d 63 70 79 28 7a 52 65 74 2c 20 7a 53 74 72  emcpy(zRet, zStr
8b40: 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20 7d 65  , nCopy);.    }e
8b50: 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 52 63 20  lse{.      *pRc 
8b60: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
8b70: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
8b80: 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a  urn zRet;.}../*.
8b90: 2a 2a 20 46 69 6e 61 6c 69 7a 65 20 74 68 65 20  ** Finalize the 
8ba0: 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64  statement passed
8bb0: 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
8bc0: 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49  rgument..**.** I
8bd0: 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69  f the sqlite3_fi
8be0: 6e 61 6c 69 7a 65 28 29 20 63 61 6c 6c 20 69 6e  nalize() call in
8bf0: 64 69 63 61 74 65 73 20 74 68 61 74 20 61 6e 20  dicates that an 
8c00: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e  error occurs, an
8c10: 64 20 74 68 65 0a 2a 2a 20 72 62 75 20 68 61 6e  d the.** rbu han
8c20: 64 6c 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  dle error code i
8c30: 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 73 65  s not already se
8c40: 74 2c 20 73 65 74 20 74 68 65 20 65 72 72 6f 72  t, set the error
8c50: 20 63 6f 64 65 20 61 6e 64 20 65 72 72 6f 72 0a   code and error.
8c60: 2a 2a 20 6d 65 73 73 61 67 65 20 61 63 63 6f 72  ** message accor
8c70: 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  dingly..*/.stati
8c80: 63 20 76 6f 69 64 20 72 62 75 46 69 6e 61 6c 69  c void rbuFinali
8c90: 7a 65 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70  ze(sqlite3rbu *p
8ca0: 2c 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a  , sqlite3_stmt *
8cb0: 70 53 74 6d 74 29 7b 0a 20 20 73 71 6c 69 74 65  pStmt){.  sqlite
8cc0: 33 20 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f  3 *db = sqlite3_
8cd0: 64 62 5f 68 61 6e 64 6c 65 28 70 53 74 6d 74 29  db_handle(pStmt)
8ce0: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c  ;.  int rc = sql
8cf0: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
8d00: 74 6d 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72  tmt);.  if( p->r
8d10: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
8d20: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
8d30: 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b  .    p->rc = rc;
8d40: 0a 20 20 20 20 70 2d 3e 7a 45 72 72 6d 73 67 20  .    p->zErrmsg 
8d50: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
8d60: 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f  f("%s", sqlite3_
8d70: 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 7d  errmsg(db));.  }
8d80: 0a 7d 0a 0a 2f 2a 20 44 65 74 65 72 6d 69 6e 65  .}../* Determine
8d90: 20 74 68 65 20 74 79 70 65 20 6f 66 20 61 20 74   the type of a t
8da0: 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 70 65  able..**.**   pe
8db0: 54 79 70 65 20 69 73 20 6f 66 20 74 79 70 65 20  Type is of type 
8dc0: 28 69 6e 74 2a 29 2c 20 61 20 70 6f 69 6e 74 65  (int*), a pointe
8dd0: 72 20 74 6f 20 61 6e 20 6f 75 74 70 75 74 20 70  r to an output p
8de0: 61 72 61 6d 65 74 65 72 20 6f 66 20 74 79 70 65  arameter of type
8df0: 0a 2a 2a 20 20 20 28 69 6e 74 29 2e 20 54 68 69  .**   (int). Thi
8e00: 73 20 63 61 6c 6c 20 73 65 74 73 20 74 68 65 20  s call sets the 
8e10: 6f 75 74 70 75 74 20 70 61 72 61 6d 65 74 65 72  output parameter
8e20: 20 61 73 20 66 6f 6c 6c 6f 77 73 2c 20 64 65 70   as follows, dep
8e30: 65 6e 64 69 6e 67 0a 2a 2a 20 20 20 6f 6e 20 74  ending.**   on t
8e40: 68 65 20 74 79 70 65 20 6f 66 20 74 68 65 20 74  he type of the t
8e50: 61 62 6c 65 20 73 70 65 63 69 66 69 65 64 20 62  able specified b
8e60: 79 20 70 61 72 61 6d 65 74 65 72 73 20 64 62 4e  y parameters dbN
8e70: 61 6d 65 20 61 6e 64 20 7a 54 62 6c 2e 0a 2a 2a  ame and zTbl..**
8e80: 0a 2a 2a 20 20 20 20 20 52 42 55 5f 50 4b 5f 4e  .**     RBU_PK_N
8e90: 4f 54 41 42 4c 45 3a 20 20 20 20 20 20 20 4e 6f  OTABLE:       No
8ea0: 20 73 75 63 68 20 74 61 62 6c 65 2e 0a 2a 2a 20   such table..** 
8eb0: 20 20 20 20 52 42 55 5f 50 4b 5f 4e 4f 4e 45 3a      RBU_PK_NONE:
8ec0: 20 20 20 20 20 20 20 20 20 20 54 61 62 6c 65 20            Table 
8ed0: 68 61 73 20 61 6e 20 69 6d 70 6c 69 63 69 74 20  has an implicit 
8ee0: 72 6f 77 69 64 2e 0a 2a 2a 20 20 20 20 20 52 42  rowid..**     RB
8ef0: 55 5f 50 4b 5f 49 50 4b 3a 20 20 20 20 20 20 20  U_PK_IPK:       
8f00: 20 20 20 20 54 61 62 6c 65 20 68 61 73 20 61 6e      Table has an
8f10: 20 65 78 70 6c 69 63 69 74 20 49 50 4b 20 63 6f   explicit IPK co
8f20: 6c 75 6d 6e 2e 0a 2a 2a 20 20 20 20 20 52 42 55  lumn..**     RBU
8f30: 5f 50 4b 5f 45 58 54 45 52 4e 41 4c 3a 20 20 20  _PK_EXTERNAL:   
8f40: 20 20 20 54 61 62 6c 65 20 68 61 73 20 61 6e 20     Table has an 
8f50: 65 78 74 65 72 6e 61 6c 20 50 4b 20 69 6e 64 65  external PK inde
8f60: 78 2e 0a 2a 2a 20 20 20 20 20 52 42 55 5f 50 4b  x..**     RBU_PK
8f70: 5f 57 49 54 48 4f 55 54 5f 52 4f 57 49 44 3a 20  _WITHOUT_ROWID: 
8f80: 54 61 62 6c 65 20 69 73 20 57 49 54 48 4f 55 54  Table is WITHOUT
8f90: 20 52 4f 57 49 44 2e 0a 2a 2a 20 20 20 20 20 52   ROWID..**     R
8fa0: 42 55 5f 50 4b 5f 56 54 41 42 3a 20 20 20 20 20  BU_PK_VTAB:     
8fb0: 20 20 20 20 20 54 61 62 6c 65 20 69 73 20 61 20       Table is a 
8fc0: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a  virtual table..*
8fd0: 2a 0a 2a 2a 20 20 20 41 72 67 75 6d 65 6e 74 20  *.**   Argument 
8fe0: 2a 70 69 50 6b 20 69 73 20 61 6c 73 6f 20 6f 66  *piPk is also of
8ff0: 20 74 79 70 65 20 28 69 6e 74 2a 29 2c 20 61 6e   type (int*), an
9000: 64 20 61 6c 73 6f 20 70 6f 69 6e 74 73 20 74 6f  d also points to
9010: 20 61 6e 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20   an output.**   
9020: 70 61 72 61 6d 65 74 65 72 2e 20 55 6e 6c 65 73  parameter. Unles
9030: 73 20 74 68 65 20 74 61 62 6c 65 20 68 61 73 20  s the table has 
9040: 61 6e 20 65 78 74 65 72 6e 61 6c 20 70 72 69 6d  an external prim
9050: 61 72 79 20 6b 65 79 20 69 6e 64 65 78 20 0a 2a  ary key index .*
9060: 2a 20 20 20 28 69 2e 65 2e 20 75 6e 6c 65 73 73  *   (i.e. unless
9070: 20 2a 70 65 54 79 70 65 20 69 73 20 73 65 74 20   *peType is set 
9080: 74 6f 20 33 29 2c 20 74 68 65 6e 20 2a 70 69 50  to 3), then *piP
9090: 6b 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  k is set to zero
90a0: 2e 20 4f 72 2c 0a 2a 2a 20 20 20 69 66 20 74 68  . Or,.**   if th
90b0: 65 20 74 61 62 6c 65 20 64 6f 65 73 20 68 61 76  e table does hav
90c0: 65 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 70 72  e an external pr
90d0: 69 6d 61 72 79 20 6b 65 79 20 69 6e 64 65 78 2c  imary key index,
90e0: 20 74 68 65 6e 20 2a 70 69 50 6b 0a 2a 2a 20 20   then *piPk.**  
90f0: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 72   is set to the r
9100: 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  oot page number 
9110: 6f 66 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b  of the primary k
9120: 65 79 20 69 6e 64 65 78 20 62 65 66 6f 72 65 0a  ey index before.
9130: 2a 2a 20 20 20 72 65 74 75 72 6e 69 6e 67 2e 0a  **   returning..
9140: 2a 2a 0a 2a 2a 20 41 4c 47 4f 52 49 54 48 4d 3a  **.** ALGORITHM:
9150: 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 6e 6f 20  .**.**   if( no 
9160: 65 6e 74 72 79 20 65 78 69 73 74 73 20 69 6e 20  entry exists in 
9170: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 29 7b  sqlite_master ){
9180: 0a 2a 2a 20 20 20 20 20 72 65 74 75 72 6e 20 52  .**     return R
9190: 42 55 5f 50 4b 5f 4e 4f 54 41 42 4c 45 0a 2a 2a  BU_PK_NOTABLE.**
91a0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c     }else if( sql
91b0: 20 66 6f 72 20 74 68 65 20 65 6e 74 72 79 20 73   for the entry s
91c0: 74 61 72 74 73 20 77 69 74 68 20 22 43 52 45 41  tarts with "CREA
91d0: 54 45 20 56 49 52 54 55 41 4c 22 20 29 7b 0a 2a  TE VIRTUAL" ){.*
91e0: 2a 20 20 20 20 20 72 65 74 75 72 6e 20 52 42 55  *     return RBU
91f0: 5f 50 4b 5f 56 54 41 42 0a 2a 2a 20 20 20 7d 65  _PK_VTAB.**   }e
9200: 6c 73 65 20 69 66 28 20 22 50 52 41 47 4d 41 20  lse if( "PRAGMA 
9210: 69 6e 64 65 78 5f 6c 69 73 74 28 29 22 20 66 6f  index_list()" fo
9220: 72 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6e 74  r the table cont
9230: 61 69 6e 73 20 61 20 22 70 6b 22 20 69 6e 64 65  ains a "pk" inde
9240: 78 20 29 7b 0a 2a 2a 20 20 20 20 20 69 66 28 20  x ){.**     if( 
9250: 74 68 65 20 69 6e 64 65 78 20 74 68 61 74 20 69  the index that i
9260: 73 20 74 68 65 20 70 6b 20 65 78 69 73 74 73 20  s the pk exists 
9270: 69 6e 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  in sqlite_master
9280: 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 2a 70 69   ){.**       *pi
9290: 50 4b 20 3d 20 72 6f 6f 74 70 61 67 65 20 6f 66  PK = rootpage of
92a0: 20 74 68 61 74 20 69 6e 64 65 78 2e 0a 2a 2a 20   that index..** 
92b0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 52 42 55        return RBU
92c0: 5f 50 4b 5f 45 58 54 45 52 4e 41 4c 0a 2a 2a 20  _PK_EXTERNAL.** 
92d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 2a 2a 20 20 20      }else{.**   
92e0: 20 20 20 20 72 65 74 75 72 6e 20 52 42 55 5f 50      return RBU_P
92f0: 4b 5f 57 49 54 48 4f 55 54 5f 52 4f 57 49 44 0a  K_WITHOUT_ROWID.
9300: 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20 7d 65  **     }.**   }e
9310: 6c 73 65 20 69 66 28 20 22 50 52 41 47 4d 41 20  lse if( "PRAGMA 
9320: 74 61 62 6c 65 5f 69 6e 66 6f 28 29 22 20 6c 69  table_info()" li
9330: 73 74 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  sts one or more 
9340: 22 70 6b 22 20 63 6f 6c 75 6d 6e 73 20 29 7b 0a  "pk" columns ){.
9350: 2a 2a 20 20 20 20 20 72 65 74 75 72 6e 20 52 42  **     return RB
9360: 55 5f 50 4b 5f 49 50 4b 0a 2a 2a 20 20 20 7d 65  U_PK_IPK.**   }e
9370: 6c 73 65 7b 0a 2a 2a 20 20 20 20 20 72 65 74 75  lse{.**     retu
9380: 72 6e 20 52 42 55 5f 50 4b 5f 4e 4f 4e 45 0a 2a  rn RBU_PK_NONE.*
9390: 2a 20 20 20 7d 0a 2a 2f 0a 73 74 61 74 69 63 20  *   }.*/.static 
93a0: 76 6f 69 64 20 72 62 75 54 61 62 6c 65 54 79 70  void rbuTableTyp
93b0: 65 28 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20  e(.  sqlite3rbu 
93c0: 2a 70 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  *p,.  const char
93d0: 20 2a 7a 54 61 62 2c 0a 20 20 69 6e 74 20 2a 70   *zTab,.  int *p
93e0: 65 54 79 70 65 2c 0a 20 20 69 6e 74 20 2a 70 69  eType,.  int *pi
93f0: 54 6e 75 6d 2c 0a 20 20 69 6e 74 20 2a 70 69 50  Tnum,.  int *piP
9400: 6b 0a 29 7b 0a 20 20 2f 2a 0a 20 20 2a 2a 20 30  k.){.  /*.  ** 0
9410: 29 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a  ) SELECT count(*
9420: 29 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  ) FROM sqlite_ma
9430: 73 74 65 72 20 77 68 65 72 65 20 6e 61 6d 65 3d  ster where name=
9440: 25 51 20 41 4e 44 20 49 73 56 69 72 74 75 61 6c  %Q AND IsVirtual
9450: 28 25 51 29 0a 20 20 2a 2a 20 31 29 20 50 52 41  (%Q).  ** 1) PRA
9460: 47 4d 41 20 69 6e 64 65 78 5f 6c 69 73 74 20 3d  GMA index_list =
9470: 20 3f 0a 20 20 2a 2a 20 32 29 20 53 45 4c 45 43   ?.  ** 2) SELEC
9480: 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
9490: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 77 68  sqlite_master wh
94a0: 65 72 65 20 6e 61 6d 65 3d 25 51 20 0a 20 20 2a  ere name=%Q .  *
94b0: 2a 20 33 29 20 50 52 41 47 4d 41 20 74 61 62 6c  * 3) PRAGMA tabl
94c0: 65 5f 69 6e 66 6f 20 3d 20 3f 0a 20 20 2a 2f 0a  e_info = ?.  */.
94d0: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
94e0: 61 53 74 6d 74 5b 34 5d 20 3d 20 7b 30 2c 20 30  aStmt[4] = {0, 0
94f0: 2c 20 30 2c 20 30 7d 3b 0a 0a 20 20 2a 70 65 54  , 0, 0};..  *peT
9500: 79 70 65 20 3d 20 52 42 55 5f 50 4b 5f 4e 4f 54  ype = RBU_PK_NOT
9510: 41 42 4c 45 3b 0a 20 20 2a 70 69 50 6b 20 3d 20  ABLE;.  *piPk = 
9520: 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  0;..  assert( p-
9530: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
9540: 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70  ;.  p->rc = prep
9550: 61 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63  areFreeAndCollec
9560: 74 45 72 72 6f 72 28 70 2d 3e 64 62 4d 61 69 6e  tError(p->dbMain
9570: 2c 20 26 61 53 74 6d 74 5b 30 5d 2c 20 26 70 2d  , &aStmt[0], &p-
9580: 3e 7a 45 72 72 6d 73 67 2c 20 0a 20 20 20 20 73  >zErrmsg, .    s
9590: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a  qlite3_mprintf(.
95a0: 20 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43            "SELEC
95b0: 54 20 28 73 71 6c 20 4c 49 4b 45 20 27 63 72 65  T (sql LIKE 'cre
95c0: 61 74 65 20 76 69 72 74 75 61 6c 25 25 27 29 2c  ate virtual%%'),
95d0: 20 72 6f 6f 74 70 61 67 65 22 0a 20 20 20 20 20   rootpage".     
95e0: 20 20 20 20 20 22 20 20 46 52 4f 4d 20 73 71 6c       "  FROM sql
95f0: 69 74 65 5f 6d 61 73 74 65 72 22 0a 20 20 20 20  ite_master".    
9600: 20 20 20 20 20 20 22 20 57 48 45 52 45 20 6e 61        " WHERE na
9610: 6d 65 3d 25 51 22 2c 20 7a 54 61 62 0a 20 20 29  me=%Q", zTab.  )
9620: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 21 3d  );.  if( p->rc!=
9630: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c  SQLITE_OK || sql
9640: 69 74 65 33 5f 73 74 65 70 28 61 53 74 6d 74 5b  ite3_step(aStmt[
9650: 30 5d 29 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20  0])!=SQLITE_ROW 
9660: 29 7b 0a 20 20 20 20 2f 2a 20 45 69 74 68 65 72  ){.    /* Either
9670: 20 61 6e 20 65 72 72 6f 72 2c 20 6f 72 20 6e 6f   an error, or no
9680: 20 73 75 63 68 20 74 61 62 6c 65 2e 20 2a 2f 0a   such table. */.
9690: 20 20 20 20 67 6f 74 6f 20 72 62 75 54 61 62 6c      goto rbuTabl
96a0: 65 54 79 70 65 5f 65 6e 64 3b 0a 20 20 7d 0a 20  eType_end;.  }. 
96b0: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c   if( sqlite3_col
96c0: 75 6d 6e 5f 69 6e 74 28 61 53 74 6d 74 5b 30 5d  umn_int(aStmt[0]
96d0: 2c 20 30 29 20 29 7b 0a 20 20 20 20 2a 70 65 54  , 0) ){.    *peT
96e0: 79 70 65 20 3d 20 52 42 55 5f 50 4b 5f 56 54 41  ype = RBU_PK_VTA
96f0: 42 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  B;              
9700: 20 20 20 20 20 20 20 2f 2a 20 76 69 72 74 75 61         /* virtua
9710: 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 67  l table */.    g
9720: 6f 74 6f 20 72 62 75 54 61 62 6c 65 54 79 70 65  oto rbuTableType
9730: 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 2a 70 69 54  _end;.  }.  *piT
9740: 6e 75 6d 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  num = sqlite3_co
9750: 6c 75 6d 6e 5f 69 6e 74 28 61 53 74 6d 74 5b 30  lumn_int(aStmt[0
9760: 5d 2c 20 31 29 3b 0a 0a 20 20 70 2d 3e 72 63 20  ], 1);..  p->rc 
9770: 3d 20 70 72 65 70 61 72 65 46 72 65 65 41 6e 64  = prepareFreeAnd
9780: 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e  CollectError(p->
9790: 64 62 4d 61 69 6e 2c 20 26 61 53 74 6d 74 5b 31  dbMain, &aStmt[1
97a0: 5d 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 20  ], &p->zErrmsg, 
97b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72  .    sqlite3_mpr
97c0: 69 6e 74 66 28 22 50 52 41 47 4d 41 20 69 6e 64  intf("PRAGMA ind
97d0: 65 78 5f 6c 69 73 74 3d 25 51 22 2c 7a 54 61 62  ex_list=%Q",zTab
97e0: 29 0a 20 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  ).  );.  if( p->
97f0: 72 63 20 29 20 67 6f 74 6f 20 72 62 75 54 61 62  rc ) goto rbuTab
9800: 6c 65 54 79 70 65 5f 65 6e 64 3b 0a 20 20 77 68  leType_end;.  wh
9810: 69 6c 65 28 20 73 71 6c 69 74 65 33 5f 73 74 65  ile( sqlite3_ste
9820: 70 28 61 53 74 6d 74 5b 31 5d 29 3d 3d 53 51 4c  p(aStmt[1])==SQL
9830: 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 63  ITE_ROW ){.    c
9840: 6f 6e 73 74 20 75 38 20 2a 7a 4f 72 69 67 20 3d  onst u8 *zOrig =
9850: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
9860: 74 65 78 74 28 61 53 74 6d 74 5b 31 5d 2c 20 33  text(aStmt[1], 3
9870: 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 38 20  );.    const u8 
9880: 2a 7a 49 64 78 20 3d 20 73 71 6c 69 74 65 33 5f  *zIdx = sqlite3_
9890: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 61 53 74 6d  column_text(aStm
98a0: 74 5b 31 5d 2c 20 31 29 3b 0a 20 20 20 20 69 66  t[1], 1);.    if
98b0: 28 20 7a 4f 72 69 67 20 26 26 20 7a 49 64 78 20  ( zOrig && zIdx 
98c0: 26 26 20 7a 4f 72 69 67 5b 30 5d 3d 3d 27 70 27  && zOrig[0]=='p'
98d0: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20   ){.      p->rc 
98e0: 3d 20 70 72 65 70 61 72 65 46 72 65 65 41 6e 64  = prepareFreeAnd
98f0: 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e  CollectError(p->
9900: 64 62 4d 61 69 6e 2c 20 26 61 53 74 6d 74 5b 32  dbMain, &aStmt[2
9910: 5d 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 20  ], &p->zErrmsg, 
9920: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
9930: 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20  e3_mprintf(.    
9940: 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
9950: 72 6f 6f 74 70 61 67 65 20 46 52 4f 4d 20 73 71  rootpage FROM sq
9960: 6c 69 74 65 5f 6d 61 73 74 65 72 20 57 48 45 52  lite_master WHER
9970: 45 20 6e 61 6d 65 20 3d 20 25 51 22 2c 20 7a 49  E name = %Q", zI
9980: 64 78 0a 20 20 20 20 20 20 29 29 3b 0a 20 20 20  dx.      ));.   
9990: 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
99a0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
99b0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
99c0: 74 65 70 28 61 53 74 6d 74 5b 32 5d 29 3d 3d 53  tep(aStmt[2])==S
99d0: 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20  QLITE_ROW ){.   
99e0: 20 20 20 20 20 20 20 2a 70 69 50 6b 20 3d 20 73         *piPk = s
99f0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
9a00: 74 28 61 53 74 6d 74 5b 32 5d 2c 20 30 29 3b 0a  t(aStmt[2], 0);.
9a10: 20 20 20 20 20 20 20 20 20 20 2a 70 65 54 79 70            *peTyp
9a20: 65 20 3d 20 52 42 55 5f 50 4b 5f 45 58 54 45 52  e = RBU_PK_EXTER
9a30: 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  NAL;.        }el
9a40: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70  se{.          *p
9a50: 65 54 79 70 65 20 3d 20 52 42 55 5f 50 4b 5f 57  eType = RBU_PK_W
9a60: 49 54 48 4f 55 54 5f 52 4f 57 49 44 3b 0a 20 20  ITHOUT_ROWID;.  
9a70: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
9a80: 20 20 20 20 20 20 67 6f 74 6f 20 72 62 75 54 61        goto rbuTa
9a90: 62 6c 65 54 79 70 65 5f 65 6e 64 3b 0a 20 20 20  bleType_end;.   
9aa0: 20 7d 0a 20 20 7d 0a 0a 20 20 70 2d 3e 72 63 20   }.  }..  p->rc 
9ab0: 3d 20 70 72 65 70 61 72 65 46 72 65 65 41 6e 64  = prepareFreeAnd
9ac0: 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e  CollectError(p->
9ad0: 64 62 4d 61 69 6e 2c 20 26 61 53 74 6d 74 5b 33  dbMain, &aStmt[3
9ae0: 5d 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 20  ], &p->zErrmsg, 
9af0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72  .    sqlite3_mpr
9b00: 69 6e 74 66 28 22 50 52 41 47 4d 41 20 74 61 62  intf("PRAGMA tab
9b10: 6c 65 5f 69 6e 66 6f 3d 25 51 22 2c 7a 54 61 62  le_info=%Q",zTab
9b20: 29 0a 20 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  ).  );.  if( p->
9b30: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
9b40: 0a 20 20 20 20 77 68 69 6c 65 28 20 73 71 6c 69  .    while( sqli
9b50: 74 65 33 5f 73 74 65 70 28 61 53 74 6d 74 5b 33  te3_step(aStmt[3
9b60: 5d 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  ])==SQLITE_ROW )
9b70: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
9b80: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 61  te3_column_int(a
9b90: 53 74 6d 74 5b 33 5d 2c 35 29 3e 30 20 29 7b 0a  Stmt[3],5)>0 ){.
9ba0: 20 20 20 20 20 20 20 20 2a 70 65 54 79 70 65 20          *peType 
9bb0: 3d 20 52 42 55 5f 50 4b 5f 49 50 4b 3b 20 20 20  = RBU_PK_IPK;   
9bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9bd0: 65 78 70 6c 69 63 69 74 20 49 50 4b 20 63 6f 6c  explicit IPK col
9be0: 75 6d 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 67  umn */.        g
9bf0: 6f 74 6f 20 72 62 75 54 61 62 6c 65 54 79 70 65  oto rbuTableType
9c00: 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _end;.      }.  
9c10: 20 20 7d 0a 20 20 20 20 2a 70 65 54 79 70 65 20    }.    *peType 
9c20: 3d 20 52 42 55 5f 50 4b 5f 4e 4f 4e 45 3b 0a 20  = RBU_PK_NONE;. 
9c30: 20 7d 0a 0a 72 62 75 54 61 62 6c 65 54 79 70 65   }..rbuTableType
9c40: 5f 65 6e 64 3a 20 7b 0a 20 20 20 20 75 6e 73 69  _end: {.    unsi
9c50: 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20 20 20  gned int i;.    
9c60: 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
9c70: 66 28 61 53 74 6d 74 29 2f 73 69 7a 65 6f 66 28  f(aStmt)/sizeof(
9c80: 61 53 74 6d 74 5b 30 5d 29 3b 20 69 2b 2b 29 7b  aStmt[0]); i++){
9c90: 0a 20 20 20 20 20 20 72 62 75 46 69 6e 61 6c 69  .      rbuFinali
9ca0: 7a 65 28 70 2c 20 61 53 74 6d 74 5b 69 5d 29 3b  ze(p, aStmt[i]);
9cb0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
9cc0: 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 68 65  .** This is a he
9cd0: 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 20 66 6f  lper function fo
9ce0: 72 20 72 62 75 4f 62 6a 49 74 65 72 43 61 63 68  r rbuObjIterCach
9cf0: 65 54 61 62 6c 65 49 6e 66 6f 28 29 2e 20 49 74  eTableInfo(). It
9d00: 20 70 6f 70 75 6c 61 74 65 73 0a 2a 2a 20 74 68   populates.** th
9d10: 65 20 70 49 74 65 72 2d 3e 61 62 49 6e 64 65 78  e pIter->abIndex
9d20: 65 64 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73  ed[] array..*/.s
9d30: 74 61 74 69 63 20 76 6f 69 64 20 72 62 75 4f 62  tatic void rbuOb
9d40: 6a 49 74 65 72 43 61 63 68 65 49 6e 64 65 78 65  jIterCacheIndexe
9d50: 64 43 6f 6c 73 28 73 71 6c 69 74 65 33 72 62 75  dCols(sqlite3rbu
9d60: 20 2a 70 2c 20 52 62 75 4f 62 6a 49 74 65 72 20   *p, RbuObjIter 
9d70: 2a 70 49 74 65 72 29 7b 0a 20 20 73 71 6c 69 74  *pIter){.  sqlit
9d80: 65 33 5f 73 74 6d 74 20 2a 70 4c 69 73 74 20 3d  e3_stmt *pList =
9d90: 20 30 3b 0a 20 20 69 6e 74 20 62 49 6e 64 65 78   0;.  int bIndex
9da0: 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e   = 0;..  if( p->
9db0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
9dc0: 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 49 74 65  .    memcpy(pIte
9dd0: 72 2d 3e 61 62 49 6e 64 65 78 65 64 2c 20 70 49  r->abIndexed, pI
9de0: 74 65 72 2d 3e 61 62 54 62 6c 50 6b 2c 20 73 69  ter->abTblPk, si
9df0: 7a 65 6f 66 28 75 38 29 2a 70 49 74 65 72 2d 3e  zeof(u8)*pIter->
9e00: 6e 54 62 6c 43 6f 6c 29 3b 0a 20 20 20 20 70 2d  nTblCol);.    p-
9e10: 3e 72 63 20 3d 20 70 72 65 70 61 72 65 46 72 65  >rc = prepareFre
9e20: 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72  eAndCollectError
9e30: 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 70 4c 69  (p->dbMain, &pLi
9e40: 73 74 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c  st, &p->zErrmsg,
9e50: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
9e60: 5f 6d 70 72 69 6e 74 66 28 22 50 52 41 47 4d 41  _mprintf("PRAGMA
9e70: 20 6d 61 69 6e 2e 69 6e 64 65 78 5f 6c 69 73 74   main.index_list
9e80: 20 3d 20 25 51 22 2c 20 70 49 74 65 72 2d 3e 7a   = %Q", pIter->z
9e90: 54 62 6c 29 0a 20 20 20 20 29 3b 0a 20 20 7d 0a  Tbl).    );.  }.
9ea0: 0a 20 20 70 49 74 65 72 2d 3e 6e 49 6e 64 65 78  .  pIter->nIndex
9eb0: 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 70   = 0;.  while( p
9ec0: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
9ed0: 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  && SQLITE_ROW==s
9ee0: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 4c 69 73  qlite3_step(pLis
9ef0: 74 29 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  t) ){.    const 
9f00: 63 68 61 72 20 2a 7a 49 64 78 20 3d 20 28 63 6f  char *zIdx = (co
9f10: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
9f20: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 4c  3_column_text(pL
9f30: 69 73 74 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c  ist, 1);.    sql
9f40: 69 74 65 33 5f 73 74 6d 74 20 2a 70 58 49 6e 66  ite3_stmt *pXInf
9f50: 6f 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 7a  o = 0;.    if( z
9f60: 49 64 78 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  Idx==0 ) break;.
9f70: 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70      p->rc = prep
9f80: 61 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63  areFreeAndCollec
9f90: 74 45 72 72 6f 72 28 70 2d 3e 64 62 4d 61 69 6e  tError(p->dbMain
9fa0: 2c 20 26 70 58 49 6e 66 6f 2c 20 26 70 2d 3e 7a  , &pXInfo, &p->z
9fb0: 45 72 72 6d 73 67 2c 0a 20 20 20 20 20 20 20 20  Errmsg,.        
9fc0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
9fd0: 22 50 52 41 47 4d 41 20 6d 61 69 6e 2e 69 6e 64  "PRAGMA main.ind
9fe0: 65 78 5f 78 69 6e 66 6f 20 3d 20 25 51 22 2c 20  ex_xinfo = %Q", 
9ff0: 7a 49 64 78 29 0a 20 20 20 20 29 3b 0a 20 20 20  zIdx).    );.   
a000: 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53   while( p->rc==S
a010: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49  QLITE_OK && SQLI
a020: 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
a030: 73 74 65 70 28 70 58 49 6e 66 6f 29 20 29 7b 0a  step(pXInfo) ){.
a040: 20 20 20 20 20 20 69 6e 74 20 69 43 69 64 20 3d        int iCid =
a050: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
a060: 69 6e 74 28 70 58 49 6e 66 6f 2c 20 31 29 3b 0a  int(pXInfo, 1);.
a070: 20 20 20 20 20 20 69 66 28 20 69 43 69 64 3e 3d        if( iCid>=
a080: 30 20 29 20 70 49 74 65 72 2d 3e 61 62 49 6e 64  0 ) pIter->abInd
a090: 65 78 65 64 5b 69 43 69 64 5d 20 3d 20 31 3b 0a  exed[iCid] = 1;.
a0a0: 20 20 20 20 7d 0a 20 20 20 20 72 62 75 46 69 6e      }.    rbuFin
a0b0: 61 6c 69 7a 65 28 70 2c 20 70 58 49 6e 66 6f 29  alize(p, pXInfo)
a0c0: 3b 0a 20 20 20 20 62 49 6e 64 65 78 20 3d 20 31  ;.    bIndex = 1
a0d0: 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 6e 49 6e  ;.    pIter->nIn
a0e0: 64 65 78 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 69 66  dex++;.  }..  if
a0f0: 28 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d  ( pIter->eType==
a100: 52 42 55 5f 50 4b 5f 57 49 54 48 4f 55 54 5f 52  RBU_PK_WITHOUT_R
a110: 4f 57 49 44 20 29 7b 0a 20 20 20 20 2f 2a 20 22  OWID ){.    /* "
a120: 50 52 41 47 4d 41 20 69 6e 64 65 78 5f 6c 69 73  PRAGMA index_lis
a130: 74 22 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20  t" includes the 
a140: 6d 61 69 6e 20 50 4b 20 62 2d 74 72 65 65 20 2a  main PK b-tree *
a150: 2f 0a 20 20 20 20 70 49 74 65 72 2d 3e 6e 49 6e  /.    pIter->nIn
a160: 64 65 78 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 72 62  dex--;.  }..  rb
a170: 75 46 69 6e 61 6c 69 7a 65 28 70 2c 20 70 4c 69  uFinalize(p, pLi
a180: 73 74 29 3b 0a 20 20 69 66 28 20 62 49 6e 64 65  st);.  if( bInde
a190: 78 3d 3d 30 20 29 20 70 49 74 65 72 2d 3e 61 62  x==0 ) pIter->ab
a1a0: 49 6e 64 65 78 65 64 20 3d 20 30 3b 0a 7d 0a 0a  Indexed = 0;.}..
a1b0: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 79 20 61  ./*.** If they a
a1c0: 72 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 70  re not already p
a1d0: 6f 70 75 6c 61 74 65 64 2c 20 70 6f 70 75 6c 61  opulated, popula
a1e0: 74 65 20 74 68 65 20 70 49 74 65 72 2d 3e 61 7a  te the pIter->az
a1f0: 54 62 6c 43 6f 6c 5b 5d 2c 0a 2a 2a 20 70 49 74  TblCol[],.** pIt
a200: 65 72 2d 3e 61 62 54 62 6c 50 6b 5b 5d 2c 20 70  er->abTblPk[], p
a210: 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 20 61 6e  Iter->nTblCol an
a220: 64 20 70 49 74 65 72 2d 3e 62 52 6f 77 69 64 20  d pIter->bRowid 
a230: 76 61 72 69 61 62 6c 65 73 20 61 63 63 6f 72 64  variables accord
a240: 69 6e 67 20 74 6f 0a 2a 2a 20 74 68 65 20 74 61  ing to.** the ta
a250: 62 6c 65 20 28 6e 6f 74 20 69 6e 64 65 78 29 20  ble (not index) 
a260: 74 68 61 74 20 74 68 65 20 69 74 65 72 61 74 6f  that the iterato
a270: 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  r currently poin
a280: 74 73 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  ts to..**.** Ret
a290: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
a2a0: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20   successful, or 
a2b0: 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
a2c0: 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 20  code otherwise. 
a2d0: 49 66 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 64  If.** an error d
a2e0: 6f 65 73 20 6f 63 63 75 72 2c 20 61 6e 20 65 72  oes occur, an er
a2f0: 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 65 72 72  ror code and err
a300: 6f 72 20 6d 65 73 73 61 67 65 20 61 72 65 20 61  or message are a
a310: 6c 73 6f 20 6c 65 66 74 20 69 6e 20 0a 2a 2a 20  lso left in .** 
a320: 74 68 65 20 52 42 55 20 68 61 6e 64 6c 65 2e 0a  the RBU handle..
a330: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62  */.static int rb
a340: 75 4f 62 6a 49 74 65 72 43 61 63 68 65 54 61 62  uObjIterCacheTab
a350: 6c 65 49 6e 66 6f 28 73 71 6c 69 74 65 33 72 62  leInfo(sqlite3rb
a360: 75 20 2a 70 2c 20 52 62 75 4f 62 6a 49 74 65 72  u *p, RbuObjIter
a370: 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20   *pIter){.  if( 
a380: 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 3d  pIter->azTblCol=
a390: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
a3a0: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
a3b0: 30 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 20  0;.    int nCol 
a3c0: 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 3b 20  = 0;.    int i; 
a3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a3e0: 20 20 20 20 20 20 20 2f 2a 20 66 6f 72 28 29 20         /* for() 
a3f0: 6c 6f 6f 70 20 69 74 65 72 61 74 6f 72 20 76 61  loop iterator va
a400: 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e  riable */.    in
a410: 74 20 62 52 62 75 52 6f 77 69 64 20 3d 20 30 3b  t bRbuRowid = 0;
a420: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
a430: 66 20 69 6e 70 75 74 20 74 61 62 6c 65 20 68 61  f input table ha
a440: 73 20 63 6f 6c 75 6d 6e 20 22 72 62 75 5f 72 6f  s column "rbu_ro
a450: 77 69 64 22 20 2a 2f 0a 20 20 20 20 69 6e 74 20  wid" */.    int 
a460: 69 4f 72 64 65 72 20 3d 20 30 3b 0a 20 20 20 20  iOrder = 0;.    
a470: 69 6e 74 20 69 54 6e 75 6d 20 3d 20 30 3b 0a 0a  int iTnum = 0;..
a480: 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75      /* Figure ou
a490: 74 20 74 68 65 20 74 79 70 65 20 6f 66 20 74 61  t the type of ta
a4a0: 62 6c 65 20 74 68 69 73 20 73 74 65 70 20 77 69  ble this step wi
a4b0: 6c 6c 20 64 65 61 6c 20 77 69 74 68 2e 20 2a 2f  ll deal with. */
a4c0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
a4d0: 65 72 2d 3e 65 54 79 70 65 3d 3d 30 20 29 3b 0a  er->eType==0 );.
a4e0: 20 20 20 20 72 62 75 54 61 62 6c 65 54 79 70 65      rbuTableType
a4f0: 28 70 2c 20 70 49 74 65 72 2d 3e 7a 54 62 6c 2c  (p, pIter->zTbl,
a500: 20 26 70 49 74 65 72 2d 3e 65 54 79 70 65 2c 20   &pIter->eType, 
a510: 26 69 54 6e 75 6d 2c 20 26 70 49 74 65 72 2d 3e  &iTnum, &pIter->
a520: 69 50 6b 54 6e 75 6d 29 3b 0a 20 20 20 20 69 66  iPkTnum);.    if
a530: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
a540: 4f 4b 20 26 26 20 70 49 74 65 72 2d 3e 65 54 79  OK && pIter->eTy
a550: 70 65 3d 3d 52 42 55 5f 50 4b 5f 4e 4f 54 41 42  pe==RBU_PK_NOTAB
a560: 4c 45 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72  LE ){.      p->r
a570: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
a580: 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 45 72 72 6d  ;.      p->zErrm
a590: 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  sg = sqlite3_mpr
a5a0: 69 6e 74 66 28 22 6e 6f 20 73 75 63 68 20 74 61  intf("no such ta
a5b0: 62 6c 65 3a 20 25 73 22 2c 20 70 49 74 65 72 2d  ble: %s", pIter-
a5c0: 3e 7a 54 62 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  >zTbl);.    }.  
a5d0: 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20 72 65    if( p->rc ) re
a5e0: 74 75 72 6e 20 70 2d 3e 72 63 3b 0a 20 20 20 20  turn p->rc;.    
a5f0: 69 66 28 20 70 49 74 65 72 2d 3e 7a 49 64 78 3d  if( pIter->zIdx=
a600: 3d 30 20 29 20 70 49 74 65 72 2d 3e 69 54 6e 75  =0 ) pIter->iTnu
a610: 6d 20 3d 20 69 54 6e 75 6d 3b 0a 0a 20 20 20 20  m = iTnum;..    
a620: 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 65  assert( pIter->e
a630: 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 4e 4f 4e  Type==RBU_PK_NON
a640: 45 20 7c 7c 20 70 49 74 65 72 2d 3e 65 54 79 70  E || pIter->eTyp
a650: 65 3d 3d 52 42 55 5f 50 4b 5f 49 50 4b 20 0a 20  e==RBU_PK_IPK . 
a660: 20 20 20 20 20 20 20 20 7c 7c 20 70 49 74 65 72          || pIter
a670: 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f  ->eType==RBU_PK_
a680: 45 58 54 45 52 4e 41 4c 20 7c 7c 20 70 49 74 65  EXTERNAL || pIte
a690: 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b  r->eType==RBU_PK
a6a0: 5f 57 49 54 48 4f 55 54 5f 52 4f 57 49 44 0a 20  _WITHOUT_ROWID. 
a6b0: 20 20 20 20 20 20 20 20 7c 7c 20 70 49 74 65 72          || pIter
a6c0: 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f  ->eType==RBU_PK_
a6d0: 56 54 41 42 0a 20 20 20 20 29 3b 0a 0a 20 20 20  VTAB.    );..   
a6e0: 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65   /* Populate the
a6f0: 20 61 7a 54 62 6c 43 6f 6c 5b 5d 20 61 6e 64 20   azTblCol[] and 
a700: 6e 54 62 6c 43 6f 6c 20 76 61 72 69 61 62 6c 65  nTblCol variable
a710: 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63  s based on the c
a720: 6f 6c 75 6d 6e 73 0a 20 20 20 20 2a 2a 20 6f 66  olumns.    ** of
a730: 20 74 68 65 20 69 6e 70 75 74 20 74 61 62 6c 65   the input table
a740: 2e 20 49 67 6e 6f 72 65 20 61 6e 79 20 69 6e 70  . Ignore any inp
a750: 75 74 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73  ut table columns
a760: 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74 68   that begin with
a770: 0a 20 20 20 20 2a 2a 20 22 72 62 75 5f 22 2e 20  .    ** "rbu_". 
a780: 20 2a 2f 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   */.    p->rc = 
a790: 70 72 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f  prepareFreeAndCo
a7a0: 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62  llectError(p->db
a7b0: 52 62 75 2c 20 26 70 53 74 6d 74 2c 20 26 70 2d  Rbu, &pStmt, &p-
a7c0: 3e 7a 45 72 72 6d 73 67 2c 20 0a 20 20 20 20 20  >zErrmsg, .     
a7d0: 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e     sqlite3_mprin
a7e0: 74 66 28 22 53 45 4c 45 43 54 20 2a 20 46 52 4f  tf("SELECT * FRO
a7f0: 4d 20 27 25 71 27 22 2c 20 70 49 74 65 72 2d 3e  M '%q'", pIter->
a800: 7a 44 61 74 61 54 62 6c 29 0a 20 20 20 20 29 3b  zDataTbl).    );
a810: 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  .    if( p->rc==
a820: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
a830: 20 20 20 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65     nCol = sqlite
a840: 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70  3_column_count(p
a850: 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 72 62 75  Stmt);.      rbu
a860: 41 6c 6c 6f 63 61 74 65 49 74 65 72 41 72 72 61  AllocateIterArra
a870: 79 73 28 70 2c 20 70 49 74 65 72 2c 20 6e 43 6f  ys(p, pIter, nCo
a880: 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  l);.    }.    fo
a890: 72 28 69 3d 30 3b 20 70 2d 3e 72 63 3d 3d 53 51  r(i=0; p->rc==SQ
a8a0: 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 6e 43 6f  LITE_OK && i<nCo
a8b0: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63  l; i++){.      c
a8c0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
a8d0: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
a8e0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e  sqlite3_column_n
a8f0: 61 6d 65 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20  ame(pStmt, i);. 
a900: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
a910: 5f 73 74 72 6e 69 63 6d 70 28 22 72 62 75 5f 22  _strnicmp("rbu_"
a920: 2c 20 7a 4e 61 6d 65 2c 20 34 29 20 29 7b 0a 20  , zName, 4) ){. 
a930: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f         char *zCo
a940: 70 79 20 3d 20 72 62 75 53 74 72 6e 64 75 70 28  py = rbuStrndup(
a950: 7a 4e 61 6d 65 2c 20 26 70 2d 3e 72 63 29 3b 0a  zName, &p->rc);.
a960: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 61          pIter->a
a970: 69 53 72 63 4f 72 64 65 72 5b 70 49 74 65 72 2d  iSrcOrder[pIter-
a980: 3e 6e 54 62 6c 43 6f 6c 5d 20 3d 20 70 49 74 65  >nTblCol] = pIte
a990: 72 2d 3e 6e 54 62 6c 43 6f 6c 3b 0a 20 20 20 20  r->nTblCol;.    
a9a0: 20 20 20 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c      pIter->azTbl
a9b0: 43 6f 6c 5b 70 49 74 65 72 2d 3e 6e 54 62 6c 43  Col[pIter->nTblC
a9c0: 6f 6c 2b 2b 5d 20 3d 20 7a 43 6f 70 79 3b 0a 20  ol++] = zCopy;. 
a9d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65 6c 73       }.      els
a9e0: 65 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33  e if( 0==sqlite3
a9f0: 5f 73 74 72 69 63 6d 70 28 22 72 62 75 5f 72 6f  _stricmp("rbu_ro
aa00: 77 69 64 22 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a  wid", zName) ){.
aa10: 20 20 20 20 20 20 20 20 62 52 62 75 52 6f 77 69          bRbuRowi
aa20: 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  d = 1;.      }. 
aa30: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
aa40: 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
aa50: 3b 0a 20 20 20 20 70 53 74 6d 74 20 3d 20 30 3b  ;.    pStmt = 0;
aa60: 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d  ..    if( p->rc=
aa70: 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20  =SQLITE_OK.     
aa80: 26 26 20 72 62 75 49 73 56 61 63 75 75 6d 28 70  && rbuIsVacuum(p
aa90: 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 62 52 62  )==0.     && bRb
aaa0: 75 52 6f 77 69 64 21 3d 28 70 49 74 65 72 2d 3e  uRowid!=(pIter->
aab0: 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 56 54  eType==RBU_PK_VT
aac0: 41 42 20 7c 7c 20 70 49 74 65 72 2d 3e 65 54 79  AB || pIter->eTy
aad0: 70 65 3d 3d 52 42 55 5f 50 4b 5f 4e 4f 4e 45 29  pe==RBU_PK_NONE)
aae0: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70 2d  .    ){.      p-
aaf0: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52  >rc = SQLITE_ERR
ab00: 4f 52 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 45 72  OR;.      p->zEr
ab10: 72 6d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  rmsg = sqlite3_m
ab20: 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  printf(.        
ab30: 20 20 22 74 61 62 6c 65 20 25 71 20 25 73 20 72    "table %q %s r
ab40: 62 75 5f 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 22  bu_rowid column"
ab50: 2c 20 70 49 74 65 72 2d 3e 7a 44 61 74 61 54 62  , pIter->zDataTb
ab60: 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 28 62 52  l,.          (bR
ab70: 62 75 52 6f 77 69 64 20 3f 20 22 6d 61 79 20 6e  buRowid ? "may n
ab80: 6f 74 20 68 61 76 65 22 20 3a 20 22 72 65 71 75  ot have" : "requ
ab90: 69 72 65 73 22 29 0a 20 20 20 20 20 20 29 3b 0a  ires").      );.
aba0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68      }..    /* Ch
abb0: 65 63 6b 20 74 68 61 74 20 61 6c 6c 20 6e 6f 6e  eck that all non
abc0: 2d 48 49 44 44 45 4e 20 63 6f 6c 75 6d 6e 73 20  -HIDDEN columns 
abd0: 69 6e 20 74 68 65 20 64 65 73 74 69 6e 61 74 69  in the destinati
abe0: 6f 6e 20 74 61 62 6c 65 20 61 72 65 20 61 6c 73  on table are als
abf0: 6f 0a 20 20 20 20 2a 2a 20 70 72 65 73 65 6e 74  o.    ** present
ac00: 20 69 6e 20 74 68 65 20 69 6e 70 75 74 20 74 61   in the input ta
ac10: 62 6c 65 2e 20 50 6f 70 75 6c 61 74 65 20 74 68  ble. Populate th
ac20: 65 20 61 62 54 62 6c 50 6b 5b 5d 2c 20 61 7a 54  e abTblPk[], azT
ac30: 62 6c 54 79 70 65 5b 5d 20 61 6e 64 0a 20 20 20  blType[] and.   
ac40: 20 2a 2a 20 61 69 54 62 6c 4f 72 64 65 72 5b 5d   ** aiTblOrder[]
ac50: 20 61 72 72 61 79 73 20 61 74 20 74 68 65 20 73   arrays at the s
ac60: 61 6d 65 20 74 69 6d 65 2e 20 20 2a 2f 0a 20 20  ame time.  */.  
ac70: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
ac80: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
ac90: 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65 46  p->rc = prepareF
aca0: 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72  reeAndCollectErr
acb0: 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 70  or(p->dbMain, &p
acc0: 53 74 6d 74 2c 20 26 70 2d 3e 7a 45 72 72 6d 73  Stmt, &p->zErrms
acd0: 67 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73 71  g, .          sq
ace0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 50  lite3_mprintf("P
acf0: 52 41 47 4d 41 20 74 61 62 6c 65 5f 69 6e 66 6f  RAGMA table_info
ad00: 28 25 51 29 22 2c 20 70 49 74 65 72 2d 3e 7a 54  (%Q)", pIter->zT
ad10: 62 6c 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  bl).      );.   
ad20: 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 70 2d   }.    while( p-
ad30: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
ad40: 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71  & SQLITE_ROW==sq
ad50: 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
ad60: 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  ) ){.      const
ad70: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 28   char *zName = (
ad80: 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
ad90: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
ada0: 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20 20  pStmt, 1);.     
adb0: 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20   if( zName==0 ) 
adc0: 62 72 65 61 6b 3b 20 20 2f 2a 20 41 6e 20 4f 4f  break;  /* An OO
add0: 4d 20 2d 20 66 69 6e 61 6c 69 7a 65 28 29 20 62  M - finalize() b
ade0: 65 6c 6f 77 20 72 65 74 75 72 6e 73 20 53 5f 4e  elow returns S_N
adf0: 4f 4d 45 4d 20 2a 2f 0a 20 20 20 20 20 20 66 6f  OMEM */.      fo
ae00: 72 28 69 3d 69 4f 72 64 65 72 3b 20 69 3c 70 49  r(i=iOrder; i<pI
ae10: 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 3b 20 69 2b  ter->nTblCol; i+
ae20: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
ae30: 30 3d 3d 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c  0==strcmp(zName,
ae40: 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c   pIter->azTblCol
ae50: 5b 69 5d 29 20 29 20 62 72 65 61 6b 3b 0a 20 20  [i]) ) break;.  
ae60: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
ae70: 69 3d 3d 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f  i==pIter->nTblCo
ae80: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  l ){.        p->
ae90: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
aea0: 52 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 7a 45  R;.        p->zE
aeb0: 72 72 6d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f  rrmsg = sqlite3_
aec0: 6d 70 72 69 6e 74 66 28 22 63 6f 6c 75 6d 6e 20  mprintf("column 
aed0: 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20 25 71 3a  missing from %q:
aee0: 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20   %s",.          
aef0: 20 20 70 49 74 65 72 2d 3e 7a 44 61 74 61 54 62    pIter->zDataTb
af00: 6c 2c 20 7a 4e 61 6d 65 0a 20 20 20 20 20 20 20  l, zName.       
af10: 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   );.      }else{
af20: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 50 6b  .        int iPk
af30: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
af40: 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 35 29 3b  n_int(pStmt, 5);
af50: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 62 4e 6f  .        int bNo
af60: 74 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 5f  tNull = sqlite3_
af70: 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74  column_int(pStmt
af80: 2c 20 33 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  , 3);.        co
af90: 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 20  nst char *zType 
afa0: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
afb0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
afc0: 78 74 28 70 53 74 6d 74 2c 20 32 29 3b 0a 0a 20  xt(pStmt, 2);.. 
afd0: 20 20 20 20 20 20 20 69 66 28 20 69 21 3d 69 4f         if( i!=iO
afe0: 72 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  rder ){.        
aff0: 20 20 53 57 41 50 28 69 6e 74 2c 20 70 49 74 65    SWAP(int, pIte
b000: 72 2d 3e 61 69 53 72 63 4f 72 64 65 72 5b 69 5d  r->aiSrcOrder[i]
b010: 2c 20 70 49 74 65 72 2d 3e 61 69 53 72 63 4f 72  , pIter->aiSrcOr
b020: 64 65 72 5b 69 4f 72 64 65 72 5d 29 3b 0a 20 20  der[iOrder]);.  
b030: 20 20 20 20 20 20 20 20 53 57 41 50 28 63 68 61          SWAP(cha
b040: 72 2a 2c 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c  r*, pIter->azTbl
b050: 43 6f 6c 5b 69 5d 2c 20 70 49 74 65 72 2d 3e 61  Col[i], pIter->a
b060: 7a 54 62 6c 43 6f 6c 5b 69 4f 72 64 65 72 5d 29  zTblCol[iOrder])
b070: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
b080: 20 20 20 20 20 70 49 74 65 72 2d 3e 61 7a 54 62       pIter->azTb
b090: 6c 54 79 70 65 5b 69 4f 72 64 65 72 5d 20 3d 20  lType[iOrder] = 
b0a0: 72 62 75 53 74 72 6e 64 75 70 28 7a 54 79 70 65  rbuStrndup(zType
b0b0: 2c 20 26 70 2d 3e 72 63 29 3b 0a 20 20 20 20 20  , &p->rc);.     
b0c0: 20 20 20 70 49 74 65 72 2d 3e 61 62 54 62 6c 50     pIter->abTblP
b0d0: 6b 5b 69 4f 72 64 65 72 5d 20 3d 20 28 69 50 6b  k[iOrder] = (iPk
b0e0: 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 70 49  !=0);.        pI
b0f0: 74 65 72 2d 3e 61 62 4e 6f 74 4e 75 6c 6c 5b 69  ter->abNotNull[i
b100: 4f 72 64 65 72 5d 20 3d 20 28 75 38 29 62 4e 6f  Order] = (u8)bNo
b110: 74 4e 75 6c 6c 20 7c 7c 20 28 69 50 6b 21 3d 30  tNull || (iPk!=0
b120: 29 3b 0a 20 20 20 20 20 20 20 20 69 4f 72 64 65  );.        iOrde
b130: 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  r++;.      }.   
b140: 20 7d 0a 0a 20 20 20 20 72 62 75 46 69 6e 61 6c   }..    rbuFinal
b150: 69 7a 65 28 70 2c 20 70 53 74 6d 74 29 3b 0a 20  ize(p, pStmt);. 
b160: 20 20 20 72 62 75 4f 62 6a 49 74 65 72 43 61 63     rbuObjIterCac
b170: 68 65 49 6e 64 65 78 65 64 43 6f 6c 73 28 70 2c  heIndexedCols(p,
b180: 20 70 49 74 65 72 29 3b 0a 20 20 20 20 61 73 73   pIter);.    ass
b190: 65 72 74 28 20 70 49 74 65 72 2d 3e 65 54 79 70  ert( pIter->eTyp
b1a0: 65 21 3d 52 42 55 5f 50 4b 5f 56 54 41 42 20 7c  e!=RBU_PK_VTAB |
b1b0: 7c 20 70 49 74 65 72 2d 3e 61 62 49 6e 64 65 78  | pIter->abIndex
b1c0: 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ed==0 );.    ass
b1d0: 65 72 74 28 20 70 49 74 65 72 2d 3e 65 54 79 70  ert( pIter->eTyp
b1e0: 65 21 3d 52 42 55 5f 50 4b 5f 56 54 41 42 20 7c  e!=RBU_PK_VTAB |
b1f0: 7c 20 70 49 74 65 72 2d 3e 6e 49 6e 64 65 78 3d  | pIter->nIndex=
b200: 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  =0 );.  }..  ret
b210: 75 72 6e 20 70 2d 3e 72 63 3b 0a 7d 0a 0a 2f 2a  urn p->rc;.}../*
b220: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
b230: 6e 20 63 6f 6e 73 74 72 75 63 74 73 20 61 6e 64  n constructs and
b240: 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74   returns a point
b250: 65 72 20 74 6f 20 61 20 6e 75 6c 2d 74 65 72 6d  er to a nul-term
b260: 69 6e 61 74 65 64 20 0a 2a 2a 20 73 74 72 69 6e  inated .** strin
b270: 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 73 6f 6d  g containing som
b280: 65 20 53 51 4c 20 63 6c 61 75 73 65 20 6f 72 20  e SQL clause or 
b290: 6c 69 73 74 20 62 61 73 65 64 20 6f 6e 20 6f 6e  list based on on
b2a0: 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65  e or more of the
b2b0: 20 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   .** column name
b2c0: 73 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72  s currently stor
b2d0: 65 64 20 69 6e 20 74 68 65 20 70 49 74 65 72 2d  ed in the pIter-
b2e0: 3e 61 7a 54 62 6c 43 6f 6c 5b 5d 20 61 72 72 61  >azTblCol[] arra
b2f0: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  y..*/.static cha
b300: 72 20 2a 72 62 75 4f 62 6a 49 74 65 72 47 65 74  r *rbuObjIterGet
b310: 43 6f 6c 6c 69 73 74 28 0a 20 20 73 71 6c 69 74  Collist(.  sqlit
b320: 65 33 72 62 75 20 2a 70 2c 20 20 20 20 20 20 20  e3rbu *p,       
b330: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 42             /* RB
b340: 55 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 52 62  U object */.  Rb
b350: 75 4f 62 6a 49 74 65 72 20 2a 70 49 74 65 72 20  uObjIter *pIter 
b360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b370: 20 4f 62 6a 65 63 74 20 69 74 65 72 61 74 6f 72   Object iterator
b380: 20 66 6f 72 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   for column name
b390: 73 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a  s */.){.  char *
b3a0: 7a 4c 69 73 74 20 3d 20 30 3b 0a 20 20 63 6f 6e  zList = 0;.  con
b3b0: 73 74 20 63 68 61 72 20 2a 7a 53 65 70 20 3d 20  st char *zSep = 
b3c0: 22 22 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  "";.  int i;.  f
b3d0: 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d  or(i=0; i<pIter-
b3e0: 3e 6e 54 62 6c 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  >nTblCol; i++){.
b3f0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
b400: 7a 20 3d 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c  z = pIter->azTbl
b410: 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 7a 4c 69 73  Col[i];.    zLis
b420: 74 20 3d 20 72 62 75 4d 50 72 69 6e 74 66 28 70  t = rbuMPrintf(p
b430: 2c 20 22 25 7a 25 73 5c 22 25 77 5c 22 22 2c 20  , "%z%s\"%w\"", 
b440: 7a 4c 69 73 74 2c 20 7a 53 65 70 2c 20 7a 29 3b  zList, zSep, z);
b450: 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 2c 20 22  .    zSep = ", "
b460: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
b470: 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  List;.}../*.** T
b480: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
b490: 75 73 65 64 20 74 6f 20 63 72 65 61 74 65 20 61  used to create a
b4a0: 20 53 45 4c 45 43 54 20 6c 69 73 74 20 28 74 68   SELECT list (th
b4b0: 65 20 6c 69 73 74 20 6f 66 20 53 51 4c 20 0a 2a  e list of SQL .*
b4c0: 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68  * expressions th
b4d0: 61 74 20 66 6f 6c 6c 6f 77 73 20 61 20 53 45 4c  at follows a SEL
b4e0: 45 43 54 20 6b 65 79 77 6f 72 64 29 20 66 6f 72  ECT keyword) for
b4f0: 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
b500: 65 6e 74 20 0a 2a 2a 20 75 73 65 64 20 74 6f 20  ent .** used to 
b510: 72 65 61 64 20 66 72 6f 6d 20 61 6e 20 64 61 74  read from an dat
b520: 61 5f 78 78 78 20 6f 72 20 72 62 75 5f 74 6d 70  a_xxx or rbu_tmp
b530: 5f 78 78 78 20 74 61 62 6c 65 20 77 68 69 6c 65  _xxx table while
b540: 20 75 70 64 61 74 69 6e 67 20 74 68 65 20 0a 2a   updating the .*
b550: 2a 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 20 63  * index object c
b560: 75 72 72 65 6e 74 6c 79 20 69 6e 64 69 63 61 74  urrently indicat
b570: 65 64 20 62 79 20 74 68 65 20 69 74 65 72 61 74  ed by the iterat
b580: 6f 72 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64  or object passed
b590: 20 61 73 20 74 68 65 20 0a 2a 2a 20 73 65 63 6f   as the .** seco
b5a0: 6e 64 20 61 72 67 75 6d 65 6e 74 2e 20 41 20 22  nd argument. A "
b5b0: 50 52 41 47 4d 41 20 69 6e 64 65 78 5f 78 69 6e  PRAGMA index_xin
b5c0: 66 6f 20 3d 20 3c 69 64 78 6e 61 6d 65 3e 22 20  fo = <idxname>" 
b5d0: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 75 73 65  statement is use
b5e0: 64 20 0a 2a 2a 20 74 6f 20 6f 62 74 61 69 6e 20  d .** to obtain 
b5f0: 74 68 65 20 72 65 71 75 69 72 65 64 20 69 6e 66  the required inf
b600: 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  ormation..**.** 
b610: 49 66 20 74 68 65 20 69 6e 64 65 78 20 69 73 20  If the index is 
b620: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
b630: 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 43   form:.**.**   C
b640: 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f  REATE INDEX i1 O
b650: 4e 20 74 31 28 63 2c 20 62 20 43 4f 4c 4c 41 54  N t1(c, b COLLAT
b660: 45 20 6e 6f 63 61 73 65 29 3b 0a 2a 2a 0a 2a 2a  E nocase);.**.**
b670: 20 61 6e 64 20 22 74 31 22 20 69 73 20 61 20 74   and "t1" is a t
b680: 61 62 6c 65 20 77 69 74 68 20 61 6e 20 65 78 70  able with an exp
b690: 6c 69 63 69 74 20 49 4e 54 45 47 45 52 20 50 52  licit INTEGER PR
b6a0: 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e  IMARY KEY column
b6b0: 20 0a 2a 2a 20 22 69 70 6b 22 2c 20 74 68 65 20   .** "ipk", the 
b6c0: 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20  returned string 
b6d0: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 60 63 60  is:.**.**   "`c`
b6e0: 20 43 4f 4c 4c 41 54 45 20 27 42 49 4e 41 52 59   COLLATE 'BINARY
b6f0: 27 2c 20 60 62 60 20 43 4f 4c 4c 41 54 45 20 27  ', `b` COLLATE '
b700: 4e 4f 43 41 53 45 27 2c 20 60 69 70 6b 60 20 43  NOCASE', `ipk` C
b710: 4f 4c 4c 41 54 45 20 27 42 49 4e 41 52 59 27 22  OLLATE 'BINARY'"
b720: 0a 2a 2a 0a 2a 2a 20 41 73 20 77 65 6c 6c 20 61  .**.** As well a
b730: 73 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73  s the returned s
b740: 74 72 69 6e 67 2c 20 74 68 72 65 65 20 6f 74 68  tring, three oth
b750: 65 72 20 6d 61 6c 6c 6f 63 27 64 20 73 74 72 69  er malloc'd stri
b760: 6e 67 73 20 61 72 65 20 0a 2a 2a 20 72 65 74 75  ngs are .** retu
b770: 72 6e 65 64 20 76 69 61 20 6f 75 74 70 75 74 20  rned via output 
b780: 70 61 72 61 6d 65 74 65 72 73 2e 20 41 73 20 66  parameters. As f
b790: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
b7a0: 70 7a 49 6d 70 6f 73 74 65 72 43 6f 6c 73 3a 20  pzImposterCols: 
b7b0: 2e 2e 2e 0a 2a 2a 20 20 20 70 7a 49 6d 70 6f 73  ....**   pzImpos
b7c0: 74 65 72 50 6b 3a 20 2e 2e 2e 0a 2a 2a 20 20 20  terPk: ....**   
b7d0: 70 7a 57 68 65 72 65 3a 20 2e 2e 2e 0a 2a 2f 0a  pzWhere: ....*/.
b7e0: 73 74 61 74 69 63 20 63 68 61 72 20 2a 72 62 75  static char *rbu
b7f0: 4f 62 6a 49 74 65 72 47 65 74 49 6e 64 65 78 43  ObjIterGetIndexC
b800: 6f 6c 73 28 0a 20 20 73 71 6c 69 74 65 33 72 62  ols(.  sqlite3rb
b810: 75 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  u *p,           
b820: 20 20 20 20 20 20 20 2f 2a 20 52 42 55 20 6f 62         /* RBU ob
b830: 6a 65 63 74 20 2a 2f 0a 20 20 52 62 75 4f 62 6a  ject */.  RbuObj
b840: 49 74 65 72 20 2a 70 49 74 65 72 2c 20 20 20 20  Iter *pIter,    
b850: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a            /* Obj
b860: 65 63 74 20 69 74 65 72 61 74 6f 72 20 66 6f 72  ect iterator for
b870: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f   column names */
b880: 0a 20 20 63 68 61 72 20 2a 2a 70 7a 49 6d 70 6f  .  char **pzImpo
b890: 73 74 65 72 43 6f 6c 73 2c 20 20 20 20 20 20 20  sterCols,       
b8a0: 20 20 20 2f 2a 20 4f 55 54 3a 20 43 6f 6c 75 6d     /* OUT: Colum
b8b0: 6e 73 20 66 6f 72 20 69 6d 70 6f 73 74 65 72 20  ns for imposter 
b8c0: 74 61 62 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20  table */.  char 
b8d0: 2a 2a 70 7a 49 6d 70 6f 73 74 65 72 50 6b 2c 20  **pzImposterPk, 
b8e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
b8f0: 54 3a 20 49 6d 70 6f 73 74 65 72 20 50 4b 20 63  T: Imposter PK c
b900: 6c 61 75 73 65 20 2a 2f 0a 20 20 63 68 61 72 20  lause */.  char 
b910: 2a 2a 70 7a 57 68 65 72 65 2c 20 20 20 20 20 20  **pzWhere,      
b920: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
b930: 54 3a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  T: WHERE clause 
b940: 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 42 69 6e 64  */.  int *pnBind
b950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b960: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54 72 62       /* OUT: Trb
b970: 75 6c 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  ul number of col
b980: 75 6d 6e 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  umns */.){.  int
b990: 20 72 63 20 3d 20 70 2d 3e 72 63 3b 20 20 20 20   rc = p->rc;    
b9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b9b0: 45 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20  Error code */.  
b9c0: 69 6e 74 20 72 63 32 3b 20 20 20 20 20 20 20 20  int rc2;        
b9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9e0: 2f 2a 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c  /* sqlite3_final
b9f0: 69 7a 65 28 29 20 72 65 74 75 72 6e 20 63 6f 64  ize() return cod
ba00: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 52 65  e */.  char *zRe
ba10: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
ba20: 20 20 20 20 20 20 20 2f 2a 20 53 74 72 69 6e 67         /* String
ba30: 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20   to return */.  
ba40: 63 68 61 72 20 2a 7a 49 6d 70 43 6f 6c 73 20 3d  char *zImpCols =
ba50: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
ba60: 2f 2a 20 53 74 72 69 6e 67 20 74 6f 20 72 65 74  /* String to ret
ba70: 75 72 6e 20 76 69 61 20 2a 70 7a 49 6d 70 6f 73  urn via *pzImpos
ba80: 74 65 72 43 6f 6c 73 20 2a 2f 0a 20 20 63 68 61  terCols */.  cha
ba90: 72 20 2a 7a 49 6d 70 50 4b 20 3d 20 30 3b 20 20  r *zImpPK = 0;  
baa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
bab0: 53 74 72 69 6e 67 20 74 6f 20 72 65 74 75 72 6e  String to return
bac0: 20 76 69 61 20 2a 70 7a 49 6d 70 6f 73 74 65 72   via *pzImposter
bad0: 50 4b 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 57  PK */.  char *zW
bae0: 68 65 72 65 20 3d 20 30 3b 20 20 20 20 20 20 20  here = 0;       
baf0: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 72 69 6e          /* Strin
bb00: 67 20 74 6f 20 72 65 74 75 72 6e 20 76 69 61 20  g to return via 
bb10: 2a 70 7a 57 68 65 72 65 20 2a 2f 0a 20 20 69 6e  *pzWhere */.  in
bb20: 74 20 6e 42 69 6e 64 20 3d 20 30 3b 20 20 20 20  t nBind = 0;    
bb30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
bb40: 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e   Value to return
bb50: 20 76 69 61 20 2a 70 6e 42 69 6e 64 20 2a 2f 0a   via *pnBind */.
bb60: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
bb70: 6f 6d 20 3d 20 22 22 3b 20 20 20 20 20 20 20 20  om = "";        
bb80: 20 20 2f 2a 20 53 65 74 20 74 6f 20 22 2c 20 22    /* Set to ", "
bb90: 20 6c 61 74 65 72 20 6f 6e 20 2a 2f 0a 20 20 63   later on */.  c
bba0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 6e 64 20  onst char *zAnd 
bbb0: 3d 20 22 22 3b 20 20 20 20 20 20 20 20 20 20 2f  = "";          /
bbc0: 2a 20 53 65 74 20 74 6f 20 22 20 41 4e 44 20 22  * Set to " AND "
bbd0: 20 6c 61 74 65 72 20 6f 6e 20 2a 2f 0a 20 20 73   later on */.  s
bbe0: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 58 49  qlite3_stmt *pXI
bbf0: 6e 66 6f 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  nfo = 0;       /
bc00: 2a 20 50 52 41 47 4d 41 20 69 6e 64 65 78 5f 78  * PRAGMA index_x
bc10: 69 6e 66 6f 20 3d 20 3f 20 2a 2f 0a 0a 20 20 69  info = ? */..  i
bc20: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
bc30: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
bc40: 70 2d 3e 7a 45 72 72 6d 73 67 3d 3d 30 20 29 3b  p->zErrmsg==0 );
bc50: 0a 20 20 20 20 72 63 20 3d 20 70 72 65 70 61 72  .    rc = prepar
bc60: 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45  eFreeAndCollectE
bc70: 72 72 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20  rror(p->dbMain, 
bc80: 26 70 58 49 6e 66 6f 2c 20 26 70 2d 3e 7a 45 72  &pXInfo, &p->zEr
bc90: 72 6d 73 67 2c 0a 20 20 20 20 20 20 20 20 73 71  rmsg,.        sq
bca0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 50  lite3_mprintf("P
bcb0: 52 41 47 4d 41 20 6d 61 69 6e 2e 69 6e 64 65 78  RAGMA main.index
bcc0: 5f 78 69 6e 66 6f 20 3d 20 25 51 22 2c 20 70 49  _xinfo = %Q", pI
bcd0: 74 65 72 2d 3e 7a 49 64 78 29 0a 20 20 20 20 29  ter->zIdx).    )
bce0: 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20  ;.  }..  while( 
bcf0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
bd00: 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
bd10: 69 74 65 33 5f 73 74 65 70 28 70 58 49 6e 66 6f  ite3_step(pXInfo
bd20: 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 43 69  ) ){.    int iCi
bd30: 64 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  d = sqlite3_colu
bd40: 6d 6e 5f 69 6e 74 28 70 58 49 6e 66 6f 2c 20 31  mn_int(pXInfo, 1
bd50: 29 3b 0a 20 20 20 20 69 6e 74 20 62 44 65 73 63  );.    int bDesc
bd60: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
bd70: 6e 5f 69 6e 74 28 70 58 49 6e 66 6f 2c 20 33 29  n_int(pXInfo, 3)
bd80: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
bd90: 20 2a 7a 43 6f 6c 6c 61 74 65 20 3d 20 28 63 6f   *zCollate = (co
bda0: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
bdb0: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 58  3_column_text(pX
bdc0: 49 6e 66 6f 2c 20 34 29 3b 0a 20 20 20 20 63 6f  Info, 4);.    co
bdd0: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a  nst char *zCol;.
bde0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
bdf0: 7a 54 79 70 65 3b 0a 0a 20 20 20 20 69 66 28 20  zType;..    if( 
be00: 69 43 69 64 3c 30 20 29 7b 0a 20 20 20 20 20 20  iCid<0 ){.      
be10: 2f 2a 20 41 6e 20 69 6e 74 65 67 65 72 20 70 72  /* An integer pr
be20: 69 6d 61 72 79 20 6b 65 79 2e 20 49 66 20 74 68  imary key. If th
be30: 65 20 74 61 62 6c 65 20 68 61 73 20 61 6e 20 65  e table has an e
be40: 78 70 6c 69 63 69 74 20 49 50 4b 2c 20 75 73 65  xplicit IPK, use
be50: 0a 20 20 20 20 20 20 2a 2a 20 69 74 73 20 6e 61  .      ** its na
be60: 6d 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 75  me. Otherwise, u
be70: 73 65 20 22 72 62 75 5f 72 6f 77 69 64 22 2e 20  se "rbu_rowid". 
be80: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 49   */.      if( pI
be90: 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f  ter->eType==RBU_
bea0: 50 4b 5f 49 50 4b 20 29 7b 0a 20 20 20 20 20 20  PK_IPK ){.      
beb0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20    int i;.       
bec0: 20 66 6f 72 28 69 3d 30 3b 20 70 49 74 65 72 2d   for(i=0; pIter-
bed0: 3e 61 62 54 62 6c 50 6b 5b 69 5d 3d 3d 30 3b 20  >abTblPk[i]==0; 
bee0: 69 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20 61 73  i++);.        as
bef0: 73 65 72 74 28 20 69 3c 70 49 74 65 72 2d 3e 6e  sert( i<pIter->n
bf00: 54 62 6c 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20  TblCol );.      
bf10: 20 20 7a 43 6f 6c 20 3d 20 70 49 74 65 72 2d 3e    zCol = pIter->
bf20: 61 7a 54 62 6c 43 6f 6c 5b 69 5d 3b 0a 20 20 20  azTblCol[i];.   
bf30: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 62 75     }else if( rbu
bf40: 49 73 56 61 63 75 75 6d 28 70 29 20 29 7b 0a 20  IsVacuum(p) ){. 
bf50: 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22 5f         zCol = "_
bf60: 72 6f 77 69 64 5f 22 3b 0a 20 20 20 20 20 20 7d  rowid_";.      }
bf70: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 43  else{.        zC
bf80: 6f 6c 20 3d 20 22 72 62 75 5f 72 6f 77 69 64 22  ol = "rbu_rowid"
bf90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
bfa0: 7a 54 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52  zType = "INTEGER
bfb0: 22 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  ";.    }else{.  
bfc0: 20 20 20 20 7a 43 6f 6c 20 3d 20 70 49 74 65 72      zCol = pIter
bfd0: 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69 43 69 64 5d  ->azTblCol[iCid]
bfe0: 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20  ;.      zType = 
bff0: 70 49 74 65 72 2d 3e 61 7a 54 62 6c 54 79 70 65  pIter->azTblType
c000: 5b 69 43 69 64 5d 3b 0a 20 20 20 20 7d 0a 0a 20  [iCid];.    }.. 
c010: 20 20 20 7a 52 65 74 20 3d 20 73 71 6c 69 74 65     zRet = sqlite
c020: 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a 25 73 5c  3_mprintf("%z%s\
c030: 22 25 77 5c 22 20 43 4f 4c 4c 41 54 45 20 25 51  "%w\" COLLATE %Q
c040: 22 2c 20 7a 52 65 74 2c 20 7a 43 6f 6d 2c 20 7a  ", zRet, zCom, z
c050: 43 6f 6c 2c 20 7a 43 6f 6c 6c 61 74 65 29 3b 0a  Col, zCollate);.
c060: 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 62      if( pIter->b
c070: 55 6e 69 71 75 65 3d 3d 30 20 7c 7c 20 73 71 6c  Unique==0 || sql
c080: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
c090: 70 58 49 6e 66 6f 2c 20 35 29 20 29 7b 0a 20 20  pXInfo, 5) ){.  
c0a0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
c0b0: 7a 4f 72 64 65 72 20 3d 20 28 62 44 65 73 63 20  zOrder = (bDesc 
c0c0: 3f 20 22 20 44 45 53 43 22 20 3a 20 22 22 29 3b  ? " DESC" : "");
c0d0: 0a 20 20 20 20 20 20 7a 49 6d 70 50 4b 20 3d 20  .      zImpPK = 
c0e0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
c0f0: 22 25 7a 25 73 5c 22 72 62 75 5f 69 6d 70 5f 25  "%z%s\"rbu_imp_%
c100: 64 25 77 5c 22 25 73 22 2c 20 0a 20 20 20 20 20  d%w\"%s", .     
c110: 20 20 20 20 20 7a 49 6d 70 50 4b 2c 20 7a 43 6f       zImpPK, zCo
c120: 6d 2c 20 6e 42 69 6e 64 2c 20 7a 43 6f 6c 2c 20  m, nBind, zCol, 
c130: 7a 4f 72 64 65 72 0a 20 20 20 20 20 20 29 3b 0a  zOrder.      );.
c140: 20 20 20 20 7d 0a 20 20 20 20 7a 49 6d 70 43 6f      }.    zImpCo
c150: 6c 73 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ls = sqlite3_mpr
c160: 69 6e 74 66 28 22 25 7a 25 73 5c 22 72 62 75 5f  intf("%z%s\"rbu_
c170: 69 6d 70 5f 25 64 25 77 5c 22 20 25 73 20 43 4f  imp_%d%w\" %s CO
c180: 4c 4c 41 54 45 20 25 51 22 2c 20 0a 20 20 20 20  LLATE %Q", .    
c190: 20 20 20 20 7a 49 6d 70 43 6f 6c 73 2c 20 7a 43      zImpCols, zC
c1a0: 6f 6d 2c 20 6e 42 69 6e 64 2c 20 7a 43 6f 6c 2c  om, nBind, zCol,
c1b0: 20 7a 54 79 70 65 2c 20 7a 43 6f 6c 6c 61 74 65   zType, zCollate
c1c0: 0a 20 20 20 20 29 3b 0a 20 20 20 20 7a 57 68 65  .    );.    zWhe
c1d0: 72 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  re = sqlite3_mpr
c1e0: 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 22 25  intf(.        "%
c1f0: 7a 25 73 5c 22 72 62 75 5f 69 6d 70 5f 25 64 25  z%s\"rbu_imp_%d%
c200: 77 5c 22 20 49 53 20 3f 22 2c 20 7a 57 68 65 72  w\" IS ?", zWher
c210: 65 2c 20 7a 41 6e 64 2c 20 6e 42 69 6e 64 2c 20  e, zAnd, nBind, 
c220: 7a 43 6f 6c 0a 20 20 20 20 29 3b 0a 20 20 20 20  zCol.    );.    
c230: 69 66 28 20 7a 52 65 74 3d 3d 30 20 7c 7c 20 7a  if( zRet==0 || z
c240: 49 6d 70 50 4b 3d 3d 30 20 7c 7c 20 7a 49 6d 70  ImpPK==0 || zImp
c250: 43 6f 6c 73 3d 3d 30 20 7c 7c 20 7a 57 68 65 72  Cols==0 || zWher
c260: 65 3d 3d 30 20 29 20 72 63 20 3d 20 53 51 4c 49  e==0 ) rc = SQLI
c270: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7a 43  TE_NOMEM;.    zC
c280: 6f 6d 20 3d 20 22 2c 20 22 3b 0a 20 20 20 20 7a  om = ", ";.    z
c290: 41 6e 64 20 3d 20 22 20 41 4e 44 20 22 3b 0a 20  And = " AND ";. 
c2a0: 20 20 20 6e 42 69 6e 64 2b 2b 3b 0a 20 20 7d 0a     nBind++;.  }.
c2b0: 0a 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33  .  rc2 = sqlite3
c2c0: 5f 66 69 6e 61 6c 69 7a 65 28 70 58 49 6e 66 6f  _finalize(pXInfo
c2d0: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
c2e0: 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63  ITE_OK ) rc = rc
c2f0: 32 3b 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51  2;..  if( rc!=SQ
c300: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
c310: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 52 65 74  qlite3_free(zRet
c320: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
c330: 72 65 65 28 7a 49 6d 70 43 6f 6c 73 29 3b 0a 20  ree(zImpCols);. 
c340: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
c350: 7a 49 6d 70 50 4b 29 3b 0a 20 20 20 20 73 71 6c  zImpPK);.    sql
c360: 69 74 65 33 5f 66 72 65 65 28 7a 57 68 65 72 65  ite3_free(zWhere
c370: 29 3b 0a 20 20 20 20 7a 52 65 74 20 3d 20 30 3b  );.    zRet = 0;
c380: 0a 20 20 20 20 7a 49 6d 70 43 6f 6c 73 20 3d 20  .    zImpCols = 
c390: 30 3b 0a 20 20 20 20 7a 49 6d 70 50 4b 20 3d 20  0;.    zImpPK = 
c3a0: 30 3b 0a 20 20 20 20 7a 57 68 65 72 65 20 3d 20  0;.    zWhere = 
c3b0: 30 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 72  0;.    p->rc = r
c3c0: 63 3b 0a 20 20 7d 0a 0a 20 20 2a 70 7a 49 6d 70  c;.  }..  *pzImp
c3d0: 6f 73 74 65 72 43 6f 6c 73 20 3d 20 7a 49 6d 70  osterCols = zImp
c3e0: 43 6f 6c 73 3b 0a 20 20 2a 70 7a 49 6d 70 6f 73  Cols;.  *pzImpos
c3f0: 74 65 72 50 6b 20 3d 20 7a 49 6d 70 50 4b 3b 0a  terPk = zImpPK;.
c400: 20 20 2a 70 7a 57 68 65 72 65 20 3d 20 7a 57 68    *pzWhere = zWh
c410: 65 72 65 3b 0a 20 20 2a 70 6e 42 69 6e 64 20 3d  ere;.  *pnBind =
c420: 20 6e 42 69 6e 64 3b 0a 20 20 72 65 74 75 72 6e   nBind;.  return
c430: 20 7a 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   zRet;.}../*.** 
c440: 41 73 73 75 6d 69 6e 67 20 74 68 65 20 63 75 72  Assuming the cur
c450: 72 65 6e 74 20 74 61 62 6c 65 20 63 6f 6c 75 6d  rent table colum
c460: 6e 73 20 61 72 65 20 22 61 22 2c 20 22 62 22 20  ns are "a", "b" 
c470: 61 6e 64 20 22 63 22 2c 20 61 6e 64 20 74 68 65  and "c", and the
c480: 20 7a 4f 62 6a 0a 2a 2a 20 70 61 72 61 6d 74 65   zObj.** paramte
c490: 72 20 69 73 20 70 61 73 73 65 64 20 22 6f 6c 64  r is passed "old
c4a0: 22 2c 20 72 65 74 75 72 6e 20 61 20 73 74 72 69  ", return a stri
c4b0: 6e 67 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  ng of the form:.
c4c0: 2a 2a 0a 2a 2a 20 20 20 20 20 22 6f 6c 64 2e 61  **.**     "old.a
c4d0: 2c 20 6f 6c 64 2e 62 2c 20 6f 6c 64 2e 62 22 0a  , old.b, old.b".
c4e0: 2a 2a 0a 2a 2a 20 57 69 74 68 20 74 68 65 20 63  **.** With the c
c4f0: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 65 73 63 61  olumn names esca
c500: 70 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74  ped..**.** For t
c510: 61 62 6c 65 73 20 77 69 74 68 20 69 6d 70 6c 69  ables with impli
c520: 63 69 74 20 72 6f 77 69 64 73 20 2d 20 52 42 55  cit rowids - RBU
c530: 5f 50 4b 5f 45 58 54 45 52 4e 41 4c 20 61 6e 64  _PK_EXTERNAL and
c540: 20 52 42 55 5f 50 4b 5f 4e 4f 4e 45 2c 20 61 70   RBU_PK_NONE, ap
c550: 70 65 6e 64 0a 2a 2a 20 74 68 65 20 74 65 78 74  pend.** the text
c560: 20 22 2c 20 6f 6c 64 2e 5f 72 6f 77 69 64 5f 22   ", old._rowid_"
c570: 20 74 6f 20 74 68 65 20 72 65 74 75 72 6e 65 64   to the returned
c580: 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69   value..*/.stati
c590: 63 20 63 68 61 72 20 2a 72 62 75 4f 62 6a 49 74  c char *rbuObjIt
c5a0: 65 72 47 65 74 4f 6c 64 6c 69 73 74 28 0a 20 20  erGetOldlist(.  
c5b0: 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 0a  sqlite3rbu *p, .
c5c0: 20 20 52 62 75 4f 62 6a 49 74 65 72 20 2a 70 49    RbuObjIter *pI
c5d0: 74 65 72 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  ter,.  const cha
c5e0: 72 20 2a 7a 4f 62 6a 0a 29 7b 0a 20 20 63 68 61  r *zObj.){.  cha
c5f0: 72 20 2a 7a 4c 69 73 74 20 3d 20 30 3b 0a 20 20  r *zList = 0;.  
c600: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
c610: 45 5f 4f 4b 20 26 26 20 70 49 74 65 72 2d 3e 61  E_OK && pIter->a
c620: 62 49 6e 64 65 78 65 64 20 29 7b 0a 20 20 20 20  bIndexed ){.    
c630: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 20 3d  const char *zS =
c640: 20 22 22 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a   "";.    int i;.
c650: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
c660: 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 3b 20 69  Iter->nTblCol; i
c670: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
c680: 49 74 65 72 2d 3e 61 62 49 6e 64 65 78 65 64 5b  Iter->abIndexed[
c690: 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  i] ){.        co
c6a0: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 20 3d  nst char *zCol =
c6b0: 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c   pIter->azTblCol
c6c0: 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 7a 4c 69  [i];.        zLi
c6d0: 73 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  st = sqlite3_mpr
c6e0: 69 6e 74 66 28 22 25 7a 25 73 25 73 2e 5c 22 25  intf("%z%s%s.\"%
c6f0: 77 5c 22 22 2c 20 7a 4c 69 73 74 2c 20 7a 53 2c  w\"", zList, zS,
c700: 20 7a 4f 62 6a 2c 20 7a 43 6f 6c 29 3b 0a 20 20   zObj, zCol);.  
c710: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c720: 20 20 20 7a 4c 69 73 74 20 3d 20 73 71 6c 69 74     zList = sqlit
c730: 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a 25 73  e3_mprintf("%z%s
c740: 4e 55 4c 4c 22 2c 20 7a 4c 69 73 74 2c 20 7a 53  NULL", zList, zS
c750: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
c760: 20 7a 53 20 3d 20 22 2c 20 22 3b 0a 20 20 20 20   zS = ", ";.    
c770: 20 20 69 66 28 20 7a 4c 69 73 74 3d 3d 30 20 29    if( zList==0 )
c780: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20  {.        p->rc 
c790: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
c7a0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
c7b0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
c7c0: 20 20 2f 2a 20 46 6f 72 20 61 20 74 61 62 6c 65    /* For a table
c7d0: 20 77 69 74 68 20 69 6d 70 6c 69 63 69 74 20 72   with implicit r
c7e0: 6f 77 69 64 73 2c 20 61 70 70 65 6e 64 20 22 6f  owids, append "o
c7f0: 6c 64 2e 5f 72 6f 77 69 64 5f 22 20 74 6f 20 74  ld._rowid_" to t
c800: 68 65 20 6c 69 73 74 2e 20 2a 2f 0a 20 20 20 20  he list. */.    
c810: 69 66 28 20 70 49 74 65 72 2d 3e 65 54 79 70 65  if( pIter->eType
c820: 3d 3d 52 42 55 5f 50 4b 5f 45 58 54 45 52 4e 41  ==RBU_PK_EXTERNA
c830: 4c 20 7c 7c 20 70 49 74 65 72 2d 3e 65 54 79 70  L || pIter->eTyp
c840: 65 3d 3d 52 42 55 5f 50 4b 5f 4e 4f 4e 45 20 29  e==RBU_PK_NONE )
c850: 7b 0a 20 20 20 20 20 20 7a 4c 69 73 74 20 3d 20  {.      zList = 
c860: 72 62 75 4d 50 72 69 6e 74 66 28 70 2c 20 22 25  rbuMPrintf(p, "%
c870: 7a 2c 20 25 73 2e 5f 72 6f 77 69 64 5f 22 2c 20  z, %s._rowid_", 
c880: 7a 4c 69 73 74 2c 20 7a 4f 62 6a 29 3b 0a 20 20  zList, zObj);.  
c890: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
c8a0: 20 7a 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   zList;.}../*.**
c8b0: 20 52 65 74 75 72 6e 20 61 6e 20 65 78 70 72 65   Return an expre
c8c0: 73 73 69 6f 6e 20 74 68 61 74 20 63 61 6e 20 62  ssion that can b
c8d0: 65 20 75 73 65 64 20 69 6e 20 61 20 57 48 45 52  e used in a WHER
c8e0: 45 20 63 6c 61 75 73 65 20 74 6f 20 6d 61 74 63  E clause to matc
c8f0: 68 20 74 68 65 0a 2a 2a 20 70 72 69 6d 61 72 79  h the.** primary
c900: 20 6b 65 79 20 6f 66 20 74 68 65 20 63 75 72 72   key of the curr
c910: 65 6e 74 20 74 61 62 6c 65 2e 20 46 6f 72 20 65  ent table. For e
c920: 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 74  xample, if the t
c930: 61 62 6c 65 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  able is:.**.**  
c940: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
c950: 28 61 2c 20 62 2c 20 63 2c 20 50 52 49 4d 41 52  (a, b, c, PRIMAR
c960: 59 20 4b 45 59 28 62 2c 20 63 29 29 3b 0a 2a 2a  Y KEY(b, c));.**
c970: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
c980: 74 72 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 22  tring:.**.**   "
c990: 62 20 3d 20 3f 31 20 41 4e 44 20 63 20 3d 20 3f  b = ?1 AND c = ?
c9a0: 32 22 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  2".*/.static cha
c9b0: 72 20 2a 72 62 75 4f 62 6a 49 74 65 72 47 65 74  r *rbuObjIterGet
c9c0: 57 68 65 72 65 28 0a 20 20 73 71 6c 69 74 65 33  Where(.  sqlite3
c9d0: 72 62 75 20 2a 70 2c 20 0a 20 20 52 62 75 4f 62  rbu *p, .  RbuOb
c9e0: 6a 49 74 65 72 20 2a 70 49 74 65 72 0a 29 7b 0a  jIter *pIter.){.
c9f0: 20 20 63 68 61 72 20 2a 7a 4c 69 73 74 20 3d 20    char *zList = 
ca00: 30 3b 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e  0;.  if( pIter->
ca10: 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 56 54  eType==RBU_PK_VT
ca20: 41 42 20 7c 7c 20 70 49 74 65 72 2d 3e 65 54 79  AB || pIter->eTy
ca30: 70 65 3d 3d 52 42 55 5f 50 4b 5f 4e 4f 4e 45 20  pe==RBU_PK_NONE 
ca40: 29 7b 0a 20 20 20 20 7a 4c 69 73 74 20 3d 20 72  ){.    zList = r
ca50: 62 75 4d 50 72 69 6e 74 66 28 70 2c 20 22 5f 72  buMPrintf(p, "_r
ca60: 6f 77 69 64 5f 20 3d 20 3f 25 64 22 2c 20 70 49  owid_ = ?%d", pI
ca70: 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 2b 31 29 3b  ter->nTblCol+1);
ca80: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 49 74  .  }else if( pIt
ca90: 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50  er->eType==RBU_P
caa0: 4b 5f 45 58 54 45 52 4e 41 4c 20 29 7b 0a 20 20  K_EXTERNAL ){.  
cab0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
cac0: 65 70 20 3d 20 22 22 3b 0a 20 20 20 20 69 6e 74  ep = "";.    int
cad0: 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
cae0: 20 69 3c 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f   i<pIter->nTblCo
caf0: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  l; i++){.      i
cb00: 66 28 20 70 49 74 65 72 2d 3e 61 62 54 62 6c 50  f( pIter->abTblP
cb10: 6b 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  k[i] ){.        
cb20: 7a 4c 69 73 74 20 3d 20 72 62 75 4d 50 72 69 6e  zList = rbuMPrin
cb30: 74 66 28 70 2c 20 22 25 7a 25 73 63 25 64 3d 3f  tf(p, "%z%sc%d=?
cb40: 25 64 22 2c 20 7a 4c 69 73 74 2c 20 7a 53 65 70  %d", zList, zSep
cb50: 2c 20 69 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20  , i, i+1);.     
cb60: 20 20 20 7a 53 65 70 20 3d 20 22 20 41 4e 44 20     zSep = " AND 
cb70: 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ";.      }.    }
cb80: 0a 20 20 20 20 7a 4c 69 73 74 20 3d 20 72 62 75  .    zList = rbu
cb90: 4d 50 72 69 6e 74 66 28 70 2c 20 0a 20 20 20 20  MPrintf(p, .    
cba0: 20 20 20 20 22 5f 72 6f 77 69 64 5f 20 3d 20 28      "_rowid_ = (
cbb0: 53 45 4c 45 43 54 20 69 64 20 46 52 4f 4d 20 72  SELECT id FROM r
cbc0: 62 75 5f 69 6d 70 6f 73 74 65 72 32 20 57 48 45  bu_imposter2 WHE
cbd0: 52 45 20 25 7a 29 22 2c 20 7a 4c 69 73 74 0a 20  RE %z)", zList. 
cbe0: 20 20 20 29 3b 0a 0a 20 20 7d 65 6c 73 65 7b 0a     );..  }else{.
cbf0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
cc00: 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20 20 20 69  zSep = "";.    i
cc10: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
cc20: 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 54 62 6c  0; i<pIter->nTbl
cc30: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
cc40: 20 69 66 28 20 70 49 74 65 72 2d 3e 61 62 54 62   if( pIter->abTb
cc50: 6c 50 6b 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20  lPk[i] ){.      
cc60: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
cc70: 6f 6c 20 3d 20 70 49 74 65 72 2d 3e 61 7a 54 62  ol = pIter->azTb
cc80: 6c 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20  lCol[i];.       
cc90: 20 7a 4c 69 73 74 20 3d 20 72 62 75 4d 50 72 69   zList = rbuMPri
cca0: 6e 74 66 28 70 2c 20 22 25 7a 25 73 5c 22 25 77  ntf(p, "%z%s\"%w
ccb0: 5c 22 3d 3f 25 64 22 2c 20 7a 4c 69 73 74 2c 20  \"=?%d", zList, 
ccc0: 7a 53 65 70 2c 20 7a 43 6f 6c 2c 20 69 2b 31 29  zSep, zCol, i+1)
ccd0: 3b 0a 20 20 20 20 20 20 20 20 7a 53 65 70 20 3d  ;.        zSep =
cce0: 20 22 20 41 4e 44 20 22 3b 0a 20 20 20 20 20 20   " AND ";.      
ccf0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
cd00: 74 75 72 6e 20 7a 4c 69 73 74 3b 0a 7d 0a 0a 2f  turn zList;.}../
cd10: 2a 0a 2a 2a 20 54 68 65 20 53 45 4c 45 43 54 20  *.** The SELECT 
cd20: 73 74 61 74 65 6d 65 6e 74 20 69 74 65 72 61 74  statement iterat
cd30: 69 6e 67 20 74 68 72 6f 75 67 68 20 74 68 65 20  ing through the 
cd40: 6b 65 79 73 20 66 6f 72 20 74 68 65 20 63 75 72  keys for the cur
cd50: 72 65 6e 74 20 6f 62 6a 65 63 74 0a 2a 2a 20 28  rent object.** (
cd60: 70 2d 3e 6f 62 6a 69 74 65 72 2e 70 53 65 6c 65  p->objiter.pSele
cd70: 63 74 29 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  ct) currently po
cd80: 69 6e 74 73 20 74 6f 20 61 20 76 61 6c 69 64 20  ints to a valid 
cd90: 72 6f 77 2e 20 48 6f 77 65 76 65 72 2c 20 74 68  row. However, th
cda0: 65 72 65 0a 2a 2a 20 69 73 20 73 6f 6d 65 74 68  ere.** is someth
cdb0: 69 6e 67 20 77 72 6f 6e 67 20 77 69 74 68 20 74  ing wrong with t
cdc0: 68 65 20 72 62 75 5f 63 6f 6e 74 72 6f 6c 20 76  he rbu_control v
cdd0: 61 6c 75 65 20 69 6e 20 74 68 65 20 72 62 75 5f  alue in the rbu_
cde0: 63 6f 6e 74 72 6f 6c 20 76 61 6c 75 65 0a 2a 2a  control value.**
cdf0: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 28   stored in the (
ce00: 70 2d 3e 6e 43 6f 6c 2b 31 29 27 74 68 20 63 6f  p->nCol+1)'th co
ce10: 6c 75 6d 6e 2e 20 53 65 74 20 74 68 65 20 65 72  lumn. Set the er
ce20: 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 65 72 72  ror code and err
ce30: 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 6f 66  or message.** of
ce40: 20 74 68 65 20 52 42 55 20 68 61 6e 64 6c 65 20   the RBU handle 
ce50: 74 6f 20 73 6f 6d 65 74 68 69 6e 67 20 72 65 66  to something ref
ce60: 6c 65 63 74 69 6e 67 20 74 68 69 73 2e 0a 2a 2f  lecting this..*/
ce70: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75  .static void rbu
ce80: 42 61 64 43 6f 6e 74 72 6f 6c 45 72 72 6f 72 28  BadControlError(
ce90: 73 71 6c 69 74 65 33 72 62 75 20 2a 70 29 7b 0a  sqlite3rbu *p){.
cea0: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
ceb0: 5f 45 52 52 4f 52 3b 0a 20 20 70 2d 3e 7a 45 72  _ERROR;.  p->zEr
cec0: 72 6d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  rmsg = sqlite3_m
ced0: 70 72 69 6e 74 66 28 22 69 6e 76 61 6c 69 64 20  printf("invalid 
cee0: 72 62 75 5f 63 6f 6e 74 72 6f 6c 20 76 61 6c 75  rbu_control valu
cef0: 65 22 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52  e");.}.../*.** R
cf00: 65 74 75 72 6e 20 61 20 6e 75 6c 2d 74 65 72 6d  eturn a nul-term
cf10: 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20 63 6f  inated string co
cf20: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 6f 6d  ntaining the com
cf30: 6d 61 20 73 65 70 61 72 61 74 65 64 20 6c 69 73  ma separated lis
cf40: 74 20 6f 66 0a 2a 2a 20 61 73 73 69 67 6e 6d 65  t of.** assignme
cf50: 6e 74 73 20 74 68 61 74 20 73 68 6f 75 6c 64 20  nts that should 
cf60: 62 65 20 69 6e 63 6c 75 64 65 64 20 66 6f 6c 6c  be included foll
cf70: 6f 77 69 6e 67 20 74 68 65 20 22 53 45 54 22 20  owing the "SET" 
cf80: 6b 65 79 77 6f 72 64 20 6f 66 0a 2a 2a 20 61 6e  keyword of.** an
cf90: 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e   UPDATE statemen
cfa0: 74 20 75 73 65 64 20 74 6f 20 75 70 64 61 74 65  t used to update
cfb0: 20 74 68 65 20 74 61 62 6c 65 20 6f 62 6a 65 63   the table objec
cfc0: 74 20 74 68 61 74 20 74 68 65 20 69 74 65 72 61  t that the itera
cfd0: 74 6f 72 0a 2a 2a 20 70 61 73 73 65 64 20 61 73  tor.** passed as
cfe0: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
cff0: 6d 65 6e 74 20 63 75 72 72 65 6e 74 6c 79 20 70  ment currently p
d000: 6f 69 6e 74 73 20 74 6f 20 69 66 20 74 68 65 20  oints to if the 
d010: 72 62 75 5f 63 6f 6e 74 72 6f 6c 0a 2a 2a 20 63  rbu_control.** c
d020: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 64 61 74  olumn of the dat
d030: 61 5f 78 78 78 20 74 61 62 6c 65 20 65 6e 74 72  a_xxx table entr
d040: 79 20 69 73 20 73 65 74 20 74 6f 20 7a 4d 61 73  y is set to zMas
d050: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 65 6d  k..**.** The mem
d060: 6f 72 79 20 66 6f 72 20 74 68 65 20 72 65 74 75  ory for the retu
d070: 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f  rned string is o
d080: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
d090: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a  ite3_malloc()..*
d0a0: 2a 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70  * It is the resp
d0b0: 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
d0c0: 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e  e caller to even
d0d0: 74 75 61 6c 6c 79 20 66 72 65 65 20 69 74 20 75  tually free it u
d0e0: 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  sing.** sqlite3_
d0f0: 66 72 65 65 28 29 2e 20 0a 2a 2a 0a 2a 2a 20 49  free(). .**.** I
d100: 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 69  f an OOM error i
d110: 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 77 68  s encountered wh
d120: 65 6e 20 61 6c 6c 6f 63 61 74 69 6e 67 20 73 70  en allocating sp
d130: 61 63 65 20 66 6f 72 20 74 68 65 20 6e 65 77 0a  ace for the new.
d140: 2a 2a 20 73 74 72 69 6e 67 2c 20 61 6e 20 65 72  ** string, an er
d150: 72 6f 72 20 63 6f 64 65 20 69 73 20 6c 65 66 74  ror code is left
d160: 20 69 6e 20 74 68 65 20 72 62 75 20 68 61 6e 64   in the rbu hand
d170: 6c 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  le passed as the
d180: 20 66 69 72 73 74 0a 2a 2a 20 61 72 67 75 6d 65   first.** argume
d190: 6e 74 20 61 6e 64 20 4e 55 4c 4c 20 69 73 20 72  nt and NULL is r
d1a0: 65 74 75 72 6e 65 64 2e 20 4f 72 2c 20 69 66 20  eturned. Or, if 
d1b0: 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72  an error has alr
d1c0: 65 61 64 79 20 6f 63 63 75 72 72 65 64 0a 2a 2a  eady occurred.**
d1d0: 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
d1e0: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 4e  ion is called, N
d1f0: 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20  ULL is returned 
d200: 69 6d 6d 65 64 69 61 74 65 6c 79 2c 20 77 69 74  immediately, wit
d210: 68 6f 75 74 0a 2a 2a 20 61 74 74 65 6d 70 74 69  hout.** attempti
d220: 6e 67 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f  ng the allocatio
d230: 6e 20 6f 72 20 6d 6f 64 69 66 79 69 6e 67 20 74  n or modifying t
d240: 68 65 20 73 74 6f 72 65 64 20 65 72 72 6f 72 20  he stored error 
d250: 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  code..*/.static 
d260: 63 68 61 72 20 2a 72 62 75 4f 62 6a 49 74 65 72  char *rbuObjIter
d270: 47 65 74 53 65 74 6c 69 73 74 28 0a 20 20 73 71  GetSetlist(.  sq
d280: 6c 69 74 65 33 72 62 75 20 2a 70 2c 0a 20 20 52  lite3rbu *p,.  R
d290: 62 75 4f 62 6a 49 74 65 72 20 2a 70 49 74 65 72  buObjIter *pIter
d2a0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
d2b0: 7a 4d 61 73 6b 0a 29 7b 0a 20 20 63 68 61 72 20  zMask.){.  char 
d2c0: 2a 7a 4c 69 73 74 20 3d 20 30 3b 0a 20 20 69 66  *zList = 0;.  if
d2d0: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
d2e0: 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  OK ){.    int i;
d2f0: 0a 0a 20 20 20 20 69 66 28 20 28 69 6e 74 29 73  ..    if( (int)s
d300: 74 72 6c 65 6e 28 7a 4d 61 73 6b 29 21 3d 70 49  trlen(zMask)!=pI
d310: 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 20 29 7b 0a  ter->nTblCol ){.
d320: 20 20 20 20 20 20 72 62 75 42 61 64 43 6f 6e 74        rbuBadCont
d330: 72 6f 6c 45 72 72 6f 72 28 70 29 3b 0a 20 20 20  rolError(p);.   
d340: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f   }else{.      co
d350: 6e 73 74 20 63 68 61 72 20 2a 7a 53 65 70 20 3d  nst char *zSep =
d360: 20 22 22 3b 0a 20 20 20 20 20 20 66 6f 72 28 69   "";.      for(i
d370: 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 54 62  =0; i<pIter->nTb
d380: 6c 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lCol; i++){.    
d390: 20 20 20 20 63 68 61 72 20 63 20 3d 20 7a 4d 61      char c = zMa
d3a0: 73 6b 5b 70 49 74 65 72 2d 3e 61 69 53 72 63 4f  sk[pIter->aiSrcO
d3b0: 72 64 65 72 5b 69 5d 5d 3b 0a 20 20 20 20 20 20  rder[i]];.      
d3c0: 20 20 69 66 28 20 63 3d 3d 27 78 27 20 29 7b 0a    if( c=='x' ){.
d3d0: 20 20 20 20 20 20 20 20 20 20 7a 4c 69 73 74 20            zList 
d3e0: 3d 20 72 62 75 4d 50 72 69 6e 74 66 28 70 2c 20  = rbuMPrintf(p, 
d3f0: 22 25 7a 25 73 5c 22 25 77 5c 22 3d 3f 25 64 22  "%z%s\"%w\"=?%d"
d400: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
d410: 20 7a 4c 69 73 74 2c 20 7a 53 65 70 2c 20 70 49   zList, zSep, pI
d420: 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69 5d  ter->azTblCol[i]
d430: 2c 20 69 2b 31 0a 20 20 20 20 20 20 20 20 20 20  , i+1.          
d440: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 53 65  );.          zSe
d450: 70 20 3d 20 22 2c 20 22 3b 0a 20 20 20 20 20 20  p = ", ";.      
d460: 20 20 7d 0a 20 20 20 20 20 20 20 20 65 6c 73 65    }.        else
d470: 20 69 66 28 20 63 3d 3d 27 64 27 20 29 7b 0a 20   if( c=='d' ){. 
d480: 20 20 20 20 20 20 20 20 20 7a 4c 69 73 74 20 3d           zList =
d490: 20 72 62 75 4d 50 72 69 6e 74 66 28 70 2c 20 22   rbuMPrintf(p, "
d4a0: 25 7a 25 73 5c 22 25 77 5c 22 3d 72 62 75 5f 64  %z%s\"%w\"=rbu_d
d4b0: 65 6c 74 61 28 5c 22 25 77 5c 22 2c 20 3f 25 64  elta(\"%w\", ?%d
d4c0: 29 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  )", .           
d4d0: 20 20 20 7a 4c 69 73 74 2c 20 7a 53 65 70 2c 20     zList, zSep, 
d4e0: 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b  pIter->azTblCol[
d4f0: 69 5d 2c 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c  i], pIter->azTbl
d500: 43 6f 6c 5b 69 5d 2c 20 69 2b 31 0a 20 20 20 20  Col[i], i+1.    
d510: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
d520: 20 20 20 7a 53 65 70 20 3d 20 22 2c 20 22 3b 0a     zSep = ", ";.
d530: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d540: 20 20 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 66    else if( c=='f
d550: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  ' ){.          z
d560: 4c 69 73 74 20 3d 20 72 62 75 4d 50 72 69 6e 74  List = rbuMPrint
d570: 66 28 70 2c 20 22 25 7a 25 73 5c 22 25 77 5c 22  f(p, "%z%s\"%w\"
d580: 3d 72 62 75 5f 66 6f 73 73 69 6c 5f 64 65 6c 74  =rbu_fossil_delt
d590: 61 28 5c 22 25 77 5c 22 2c 20 3f 25 64 29 22 2c  a(\"%w\", ?%d)",
d5a0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
d5b0: 7a 4c 69 73 74 2c 20 7a 53 65 70 2c 20 70 49 74  zList, zSep, pIt
d5c0: 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69 5d 2c  er->azTblCol[i],
d5d0: 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c   pIter->azTblCol
d5e0: 5b 69 5d 2c 20 69 2b 31 0a 20 20 20 20 20 20 20  [i], i+1.       
d5f0: 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20     );.          
d600: 7a 53 65 70 20 3d 20 22 2c 20 22 3b 0a 20 20 20  zSep = ", ";.   
d610: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
d620: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
d630: 6e 20 7a 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  n zList;.}../*.*
d640: 2a 20 52 65 74 75 72 6e 20 61 20 6e 75 6c 2d 74  * Return a nul-t
d650: 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67  erminated string
d660: 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20 6e   consisting of n
d670: 42 79 74 65 20 63 6f 6d 6d 61 20 73 65 70 61 72  Byte comma separ
d680: 61 74 65 64 0a 2a 2a 20 22 3f 22 20 65 78 70 72  ated.** "?" expr
d690: 65 73 73 69 6f 6e 73 2e 20 46 6f 72 20 65 78 61  essions. For exa
d6a0: 6d 70 6c 65 2c 20 69 66 20 6e 42 79 74 65 20 69  mple, if nByte i
d6b0: 73 20 33 2c 20 72 65 74 75 72 6e 20 61 20 70 6f  s 3, return a po
d6c0: 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 61 20 62 75  inter to.** a bu
d6d0: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
d6e0: 74 68 65 20 73 74 72 69 6e 67 20 22 3f 2c 3f 2c  the string "?,?,
d6f0: 3f 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 65  ?"..**.** The me
d700: 6d 6f 72 79 20 66 6f 72 20 74 68 65 20 72 65 74  mory for the ret
d710: 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20  urned string is 
d720: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
d730: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a  lite3_malloc()..
d740: 2a 2a 20 49 74 20 69 73 20 74 68 65 20 72 65 73  ** It is the res
d750: 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
d760: 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65  he caller to eve
d770: 6e 74 75 61 6c 6c 79 20 66 72 65 65 20 69 74 20  ntually free it 
d780: 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33  using.** sqlite3
d790: 5f 66 72 65 65 28 29 2e 20 0a 2a 2a 0a 2a 2a 20  _free(). .**.** 
d7a0: 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20  If an OOM error 
d7b0: 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 77  is encountered w
d7c0: 68 65 6e 20 61 6c 6c 6f 63 61 74 69 6e 67 20 73  hen allocating s
d7d0: 70 61 63 65 20 66 6f 72 20 74 68 65 20 6e 65 77  pace for the new
d7e0: 0a 2a 2a 20 73 74 72 69 6e 67 2c 20 61 6e 20 65  .** string, an e
d7f0: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 6c 65 66  rror code is lef
d800: 74 20 69 6e 20 74 68 65 20 72 62 75 20 68 61 6e  t in the rbu han
d810: 64 6c 65 20 70 61 73 73 65 64 20 61 73 20 74 68  dle passed as th
d820: 65 20 66 69 72 73 74 0a 2a 2a 20 61 72 67 75 6d  e first.** argum
d830: 65 6e 74 20 61 6e 64 20 4e 55 4c 4c 20 69 73 20  ent and NULL is 
d840: 72 65 74 75 72 6e 65 64 2e 20 4f 72 2c 20 69 66  returned. Or, if
d850: 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61 6c   an error has al
d860: 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 0a 2a  ready occurred.*
d870: 2a 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  * when this func
d880: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
d890: 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
d8a0: 20 69 6d 6d 65 64 69 61 74 65 6c 79 2c 20 77 69   immediately, wi
d8b0: 74 68 6f 75 74 0a 2a 2a 20 61 74 74 65 6d 70 74  thout.** attempt
d8c0: 69 6e 67 20 74 68 65 20 61 6c 6c 6f 63 61 74 69  ing the allocati
d8d0: 6f 6e 20 6f 72 20 6d 6f 64 69 66 79 69 6e 67 20  on or modifying 
d8e0: 74 68 65 20 73 74 6f 72 65 64 20 65 72 72 6f 72  the stored error
d8f0: 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   code..*/.static
d900: 20 63 68 61 72 20 2a 72 62 75 4f 62 6a 49 74 65   char *rbuObjIte
d910: 72 47 65 74 42 69 6e 64 6c 69 73 74 28 73 71 6c  rGetBindlist(sql
d920: 69 74 65 33 72 62 75 20 2a 70 2c 20 69 6e 74 20  ite3rbu *p, int 
d930: 6e 42 69 6e 64 29 7b 0a 20 20 63 68 61 72 20 2a  nBind){.  char *
d940: 7a 52 65 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20  zRet = 0;.  int 
d950: 6e 42 79 74 65 20 3d 20 6e 42 69 6e 64 2a 32 20  nByte = nBind*2 
d960: 2b 20 31 3b 0a 0a 20 20 7a 52 65 74 20 3d 20 28  + 1;..  zRet = (
d970: 63 68 61 72 2a 29 72 62 75 4d 61 6c 6c 6f 63 28  char*)rbuMalloc(
d980: 70 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28  p, nByte);.  if(
d990: 20 7a 52 65 74 20 29 7b 0a 20 20 20 20 69 6e 74   zRet ){.    int
d9a0: 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
d9b0: 20 69 3c 6e 42 69 6e 64 3b 20 69 2b 2b 29 7b 0a   i<nBind; i++){.
d9c0: 20 20 20 20 20 20 7a 52 65 74 5b 69 2a 32 5d 20        zRet[i*2] 
d9d0: 3d 20 27 3f 27 3b 0a 20 20 20 20 20 20 7a 52 65  = '?';.      zRe
d9e0: 74 5b 69 2a 32 2b 31 5d 20 3d 20 28 69 2b 31 3d  t[i*2+1] = (i+1=
d9f0: 3d 6e 42 69 6e 64 29 20 3f 20 27 5c 30 27 20 3a  =nBind) ? '\0' :
da00: 20 27 2c 27 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   ',';.    }.  }.
da10: 20 20 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d    return zRet;.}
da20: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 74 65 72  ../*.** The iter
da30: 61 74 6f 72 20 63 75 72 72 65 6e 74 6c 79 20 70  ator currently p
da40: 6f 69 6e 74 73 20 74 6f 20 61 20 74 61 62 6c 65  oints to a table
da50: 20 28 6e 6f 74 20 69 6e 64 65 78 29 20 6f 66 20   (not index) of 
da60: 74 79 70 65 20 0a 2a 2a 20 52 42 55 5f 50 4b 5f  type .** RBU_PK_
da70: 57 49 54 48 4f 55 54 5f 52 4f 57 49 44 2e 20 54  WITHOUT_ROWID. T
da80: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 72 65  his function cre
da90: 61 74 65 73 20 74 68 65 20 50 52 49 4d 41 52 59  ates the PRIMARY
daa0: 20 4b 45 59 20 0a 2a 2a 20 64 65 63 6c 61 72 61   KEY .** declara
dab0: 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 63 6f 72  tion for the cor
dac0: 72 65 73 70 6f 6e 64 69 6e 67 20 69 6d 70 6f 73  responding impos
dad0: 74 65 72 20 74 61 62 6c 65 2e 20 46 6f 72 20 65  ter table. For e
dae0: 78 61 6d 70 6c 65 2c 0a 2a 2a 20 69 66 20 74 68  xample,.** if th
daf0: 65 20 69 74 65 72 61 74 6f 72 20 70 6f 69 6e 74  e iterator point
db00: 73 20 74 6f 20 61 20 74 61 62 6c 65 20 63 72 65  s to a table cre
db10: 61 74 65 64 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20  ated as:.**.**  
db20: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
db30: 28 61 2c 20 62 2c 20 63 2c 20 50 52 49 4d 41 52  (a, b, c, PRIMAR
db40: 59 20 4b 45 59 28 62 2c 20 61 20 44 45 53 43 29  Y KEY(b, a DESC)
db50: 29 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 0a  ) WITHOUT ROWID.
db60: 2a 2a 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74  **.** this funct
db70: 69 6f 6e 20 72 65 74 75 72 6e 73 3a 0a 2a 2a 0a  ion returns:.**.
db80: 2a 2a 20 20 20 50 52 49 4d 41 52 59 20 4b 45 59  **   PRIMARY KEY
db90: 28 22 62 22 2c 20 22 61 22 20 44 45 53 43 29 0a  ("b", "a" DESC).
dba0: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
dbb0: 72 62 75 57 69 74 68 6f 75 74 52 6f 77 69 64 50  rbuWithoutRowidP
dbc0: 4b 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c  K(sqlite3rbu *p,
dbd0: 20 52 62 75 4f 62 6a 49 74 65 72 20 2a 70 49 74   RbuObjIter *pIt
dbe0: 65 72 29 7b 0a 20 20 63 68 61 72 20 2a 7a 20 3d  er){.  char *z =
dbf0: 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49   0;.  assert( pI
dc00: 74 65 72 2d 3e 7a 49 64 78 3d 3d 30 20 29 3b 0a  ter->zIdx==0 );.
dc10: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
dc20: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 6f  ITE_OK ){.    co
dc30: 6e 73 74 20 63 68 61 72 20 2a 7a 53 65 70 20 3d  nst char *zSep =
dc40: 20 22 50 52 49 4d 41 52 59 20 4b 45 59 28 22 3b   "PRIMARY KEY(";
dc50: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  .    sqlite3_stm
dc60: 74 20 2a 70 58 4c 69 73 74 20 3d 20 30 3b 20 20  t *pXList = 0;  
dc70: 20 20 20 2f 2a 20 50 52 41 47 4d 41 20 69 6e 64     /* PRAGMA ind
dc80: 65 78 5f 6c 69 73 74 20 3d 20 28 70 49 74 65 72  ex_list = (pIter
dc90: 2d 3e 7a 54 62 6c 29 20 2a 2f 0a 20 20 20 20 73  ->zTbl) */.    s
dca0: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 58 49  qlite3_stmt *pXI
dcb0: 6e 66 6f 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  nfo = 0;     /* 
dcc0: 50 52 41 47 4d 41 20 69 6e 64 65 78 5f 78 69 6e  PRAGMA index_xin
dcd0: 66 6f 20 3d 20 3c 70 6b 2d 69 6e 64 65 78 3e 20  fo = <pk-index> 
dce0: 2a 2f 0a 20 20 20 0a 20 20 20 20 70 2d 3e 72 63  */.   .    p->rc
dcf0: 20 3d 20 70 72 65 70 61 72 65 46 72 65 65 41 6e   = prepareFreeAn
dd00: 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d  dCollectError(p-
dd10: 3e 64 62 4d 61 69 6e 2c 20 26 70 58 4c 69 73 74  >dbMain, &pXList
dd20: 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 0a 20  , &p->zErrmsg,. 
dd30: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d         sqlite3_m
dd40: 70 72 69 6e 74 66 28 22 50 52 41 47 4d 41 20 6d  printf("PRAGMA m
dd50: 61 69 6e 2e 69 6e 64 65 78 5f 6c 69 73 74 20 3d  ain.index_list =
dd60: 20 25 51 22 2c 20 70 49 74 65 72 2d 3e 7a 54 62   %Q", pIter->zTb
dd70: 6c 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 77 68  l).    );.    wh
dd80: 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ile( p->rc==SQLI
dd90: 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f  TE_OK && SQLITE_
dda0: 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW==sqlite3_ste
ddb0: 70 28 70 58 4c 69 73 74 29 20 29 7b 0a 20 20 20  p(pXList) ){.   
ddc0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
ddd0: 4f 72 69 67 20 3d 20 28 63 6f 6e 73 74 20 63 68  Orig = (const ch
dde0: 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
ddf0: 6d 6e 5f 74 65 78 74 28 70 58 4c 69 73 74 2c 33  mn_text(pXList,3
de00: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 4f 72  );.      if( zOr
de10: 69 67 20 26 26 20 73 74 72 63 6d 70 28 7a 4f 72  ig && strcmp(zOr
de20: 69 67 2c 20 22 70 6b 22 29 3d 3d 30 20 29 7b 0a  ig, "pk")==0 ){.
de30: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
de40: 61 72 20 2a 7a 49 64 78 20 3d 20 28 63 6f 6e 73  ar *zIdx = (cons
de50: 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
de60: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 58 4c 69  column_text(pXLi
de70: 73 74 2c 31 29 3b 0a 20 20 20 20 20 20 20 20 69  st,1);.        i
de80: 66 28 20 7a 49 64 78 20 29 7b 0a 20 20 20 20 20  f( zIdx ){.     
de90: 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 72 65       p->rc = pre
dea0: 70 61 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65  pareFreeAndColle
deb0: 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 4d 61 69  ctError(p->dbMai
dec0: 6e 2c 20 26 70 58 49 6e 66 6f 2c 20 26 70 2d 3e  n, &pXInfo, &p->
ded0: 7a 45 72 72 6d 73 67 2c 0a 20 20 20 20 20 20 20  zErrmsg,.       
dee0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d         sqlite3_m
def0: 70 72 69 6e 74 66 28 22 50 52 41 47 4d 41 20 6d  printf("PRAGMA m
df00: 61 69 6e 2e 69 6e 64 65 78 5f 78 69 6e 66 6f 20  ain.index_xinfo 
df10: 3d 20 25 51 22 2c 20 7a 49 64 78 29 0a 20 20 20  = %Q", zIdx).   
df20: 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
df30: 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
df40: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
df50: 0a 20 20 20 20 72 62 75 46 69 6e 61 6c 69 7a 65  .    rbuFinalize
df60: 28 70 2c 20 70 58 4c 69 73 74 29 3b 0a 0a 20 20  (p, pXList);..  
df70: 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d    while( p->rc==
df80: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c  SQLITE_OK && SQL
df90: 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
dfa0: 5f 73 74 65 70 28 70 58 49 6e 66 6f 29 20 29 7b  _step(pXInfo) ){
dfb0: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
dfc0: 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 58  e3_column_int(pX
dfd0: 49 6e 66 6f 2c 20 35 29 20 29 7b 0a 20 20 20 20  Info, 5) ){.    
dfe0: 20 20 20 20 2f 2a 20 69 6e 74 20 69 43 69 64 20      /* int iCid 
dff0: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
e000: 5f 69 6e 74 28 70 58 49 6e 66 6f 2c 20 30 29 3b  _int(pXInfo, 0);
e010: 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 73   */.        cons
e020: 74 20 63 68 61 72 20 2a 7a 43 6f 6c 20 3d 20 28  t char *zCol = (
e030: 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
e040: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
e050: 70 58 49 6e 66 6f 2c 20 32 29 3b 0a 20 20 20 20  pXInfo, 2);.    
e060: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
e070: 7a 44 65 73 63 20 3d 20 73 71 6c 69 74 65 33 5f  zDesc = sqlite3_
e080: 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 58 49 6e 66  column_int(pXInf
e090: 6f 2c 20 33 29 20 3f 20 22 20 44 45 53 43 22 20  o, 3) ? " DESC" 
e0a0: 3a 20 22 22 3b 0a 20 20 20 20 20 20 20 20 7a 20  : "";.        z 
e0b0: 3d 20 72 62 75 4d 50 72 69 6e 74 66 28 70 2c 20  = rbuMPrintf(p, 
e0c0: 22 25 7a 25 73 5c 22 25 77 5c 22 25 73 22 2c 20  "%z%s\"%w\"%s", 
e0d0: 7a 2c 20 7a 53 65 70 2c 20 7a 43 6f 6c 2c 20 7a  z, zSep, zCol, z
e0e0: 44 65 73 63 29 3b 0a 20 20 20 20 20 20 20 20 7a  Desc);.        z
e0f0: 53 65 70 20 3d 20 22 2c 20 22 3b 0a 20 20 20 20  Sep = ", ";.    
e100: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 20    }.    }.    z 
e110: 3d 20 72 62 75 4d 50 72 69 6e 74 66 28 70 2c 20  = rbuMPrintf(p, 
e120: 22 25 7a 29 22 2c 20 7a 29 3b 0a 20 20 20 20 72  "%z)", z);.    r
e130: 62 75 46 69 6e 61 6c 69 7a 65 28 70 2c 20 70 58  buFinalize(p, pX
e140: 49 6e 66 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Info);.  }.  ret
e150: 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn z;.}../*.** 
e160: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 72  This function cr
e170: 65 61 74 65 73 20 74 68 65 20 73 65 63 6f 6e 64  eates the second
e180: 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 20   imposter table 
e190: 75 73 65 64 20 77 68 65 6e 20 77 72 69 74 69 6e  used when writin
e1a0: 67 20 74 6f 0a 2a 2a 20 61 20 74 61 62 6c 65 20  g to.** a table 
e1b0: 62 2d 74 72 65 65 20 77 68 65 72 65 20 74 68 65  b-tree where the
e1c0: 20 74 61 62 6c 65 20 68 61 73 20 61 6e 20 65 78   table has an ex
e1d0: 74 65 72 6e 61 6c 20 70 72 69 6d 61 72 79 20 6b  ternal primary k
e1e0: 65 79 2e 20 49 66 20 74 68 65 0a 2a 2a 20 69 74  ey. If the.** it
e1f0: 65 72 61 74 6f 72 20 70 61 73 73 65 64 20 61 73  erator passed as
e200: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
e210: 6d 65 6e 74 20 64 6f 65 73 20 6e 6f 74 20 63 75  ment does not cu
e220: 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 20 74 6f  rrently point to
e230: 0a 2a 2a 20 61 20 74 61 62 6c 65 20 28 6e 6f 74  .** a table (not
e240: 20 69 6e 64 65 78 29 20 77 69 74 68 20 61 6e 20   index) with an 
e250: 65 78 74 65 72 6e 61 6c 20 70 72 69 6d 61 72 79  external primary
e260: 20 6b 65 79 2c 20 74 68 69 73 20 66 75 6e 63 74   key, this funct
e270: 69 6f 6e 20 69 73 20 61 0a 2a 2a 20 6e 6f 2d 6f  ion is a.** no-o
e280: 70 2e 20 0a 2a 2a 0a 2a 2a 20 41 73 73 75 6d 69  p. .**.** Assumi
e290: 6e 67 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  ng the iterator 
e2a0: 64 6f 65 73 20 70 6f 69 6e 74 20 74 6f 20 61 20  does point to a 
e2b0: 74 61 62 6c 65 20 77 69 74 68 20 61 6e 20 65 78  table with an ex
e2c0: 74 65 72 6e 61 6c 20 50 4b 2c 20 74 68 69 73 0a  ternal PK, this.
e2d0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 63 72 65 61  ** function crea
e2e0: 74 65 73 20 61 20 57 49 54 48 4f 55 54 20 52 4f  tes a WITHOUT RO
e2f0: 57 49 44 20 69 6d 70 6f 73 74 65 72 20 74 61 62  WID imposter tab
e300: 6c 65 20 6e 61 6d 65 64 20 22 72 62 75 5f 69 6d  le named "rbu_im
e310: 70 6f 73 74 65 72 32 22 0a 2a 2a 20 75 73 65 64  poster2".** used
e320: 20 74 6f 20 61 63 63 65 73 73 20 74 68 61 74 20   to access that 
e330: 50 4b 20 69 6e 64 65 78 2e 20 46 6f 72 20 65 78  PK index. For ex
e340: 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 74 61  ample, if the ta
e350: 72 67 65 74 20 74 61 62 6c 65 20 69 73 0a 2a 2a  rget table is.**
e360: 20 64 65 63 6c 61 72 65 64 20 61 73 20 66 6f 6c   declared as fol
e370: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52  lows:.**.**   CR
e380: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
e390: 20 62 20 54 45 58 54 2c 20 63 20 52 45 41 4c 2c   b TEXT, c REAL,
e3a0: 20 50 52 49 4d 41 52 59 20 4b 45 59 28 62 2c 20   PRIMARY KEY(b, 
e3b0: 63 29 29 3b 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20  c));.**.** then 
e3c0: 74 68 65 20 69 6d 70 6f 73 74 65 72 20 74 61 62  the imposter tab
e3d0: 6c 65 20 73 63 68 65 6d 61 20 69 73 3a 0a 2a 2a  le schema is:.**
e3e0: 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42  .**   CREATE TAB
e3f0: 4c 45 20 72 62 75 5f 69 6d 70 6f 73 74 65 72 32  LE rbu_imposter2
e400: 28 63 31 20 54 45 58 54 2c 20 63 32 20 52 45 41  (c1 TEXT, c2 REA
e410: 4c 2c 20 69 64 20 49 4e 54 45 47 45 52 29 20 57  L, id INTEGER) W
e420: 49 54 48 4f 55 54 20 52 4f 57 49 44 3b 0a 2a 2a  ITHOUT ROWID;.**
e430: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
e440: 72 62 75 43 72 65 61 74 65 49 6d 70 6f 73 74 65  rbuCreateImposte
e450: 72 54 61 62 6c 65 32 28 73 71 6c 69 74 65 33 72  rTable2(sqlite3r
e460: 62 75 20 2a 70 2c 20 52 62 75 4f 62 6a 49 74 65  bu *p, RbuObjIte
e470: 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28  r *pIter){.  if(
e480: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
e490: 4b 20 26 26 20 70 49 74 65 72 2d 3e 65 54 79 70  K && pIter->eTyp
e4a0: 65 3d 3d 52 42 55 5f 50 4b 5f 45 58 54 45 52 4e  e==RBU_PK_EXTERN
e4b0: 41 4c 20 29 7b 0a 20 20 20 20 69 6e 74 20 74 6e  AL ){.    int tn
e4c0: 75 6d 20 3d 20 70 49 74 65 72 2d 3e 69 50 6b 54  um = pIter->iPkT
e4d0: 6e 75 6d 3b 20 20 20 20 2f 2a 20 52 6f 6f 74 20  num;    /* Root 
e4e0: 70 61 67 65 20 6f 66 20 50 4b 20 69 6e 64 65 78  page of PK index
e4f0: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   */.    sqlite3_
e500: 73 74 6d 74 20 2a 70 51 75 65 72 79 20 3d 20 30  stmt *pQuery = 0
e510: 3b 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20  ;     /* SELECT 
e520: 6e 61 6d 65 20 2e 2e 2e 20 57 48 45 52 45 20 72  name ... WHERE r
e530: 6f 6f 74 70 61 67 65 20 3d 20 24 74 6e 75 6d 20  ootpage = $tnum 
e540: 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  */.    const cha
e550: 72 20 2a 7a 49 64 78 20 3d 20 30 3b 20 20 20 20  r *zIdx = 0;    
e560: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
e570: 50 4b 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  PK index */.    
e580: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 58  sqlite3_stmt *pX
e590: 49 6e 66 6f 20 3d 20 30 3b 20 20 20 20 20 2f 2a  Info = 0;     /*
e5a0: 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e 69 6e 64   PRAGMA main.ind
e5b0: 65 78 5f 78 69 6e 66 6f 20 3d 20 24 7a 49 64 78  ex_xinfo = $zIdx
e5c0: 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   */.    const ch
e5d0: 61 72 20 2a 7a 43 6f 6d 6d 61 20 3d 20 22 22 3b  ar *zComma = "";
e5e0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 73  .    char *zCols
e5f0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
e600: 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 62 75     /* Used to bu
e610: 69 6c 64 20 75 70 20 6c 69 73 74 20 6f 66 20 74  ild up list of t
e620: 61 62 6c 65 20 63 6f 6c 73 20 2a 2f 0a 20 20 20  able cols */.   
e630: 20 63 68 61 72 20 2a 7a 50 6b 20 3d 20 30 3b 20   char *zPk = 0; 
e640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e650: 2a 20 55 73 65 64 20 74 6f 20 62 75 69 6c 64 20  * Used to build 
e660: 75 70 20 74 61 62 6c 65 20 50 4b 20 64 65 63 6c  up table PK decl
e670: 61 72 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20 20 20  aration */..    
e680: 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74 68  /* Figure out th
e690: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 70 72  e name of the pr
e6a0: 69 6d 61 72 79 20 6b 65 79 20 69 6e 64 65 78 20  imary key index 
e6b0: 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
e6c0: 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20 54 68  table..    ** Th
e6d0: 69 73 20 69 73 20 6e 65 65 64 65 64 20 66 6f 72  is is needed for
e6e0: 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f   the argument to
e6f0: 20 22 50 52 41 47 4d 41 20 69 6e 64 65 78 5f 78   "PRAGMA index_x
e700: 69 6e 66 6f 22 2e 20 53 65 74 0a 20 20 20 20 2a  info". Set.    *
e710: 2a 20 7a 49 64 78 20 74 6f 20 70 6f 69 6e 74 20  * zIdx to point 
e720: 74 6f 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  to a nul-termina
e730: 74 65 64 20 73 74 72 69 6e 67 20 63 6f 6e 74 61  ted string conta
e740: 69 6e 69 6e 67 20 74 68 69 73 20 6e 61 6d 65 2e  ining this name.
e750: 20 2a 2f 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   */.    p->rc = 
e760: 70 72 65 70 61 72 65 41 6e 64 43 6f 6c 6c 65 63  prepareAndCollec
e770: 74 45 72 72 6f 72 28 70 2d 3e 64 62 4d 61 69 6e  tError(p->dbMain
e780: 2c 20 26 70 51 75 65 72 79 2c 20 26 70 2d 3e 7a  , &pQuery, &p->z
e790: 45 72 72 6d 73 67 2c 20 0a 20 20 20 20 20 20 20  Errmsg, .       
e7a0: 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52   "SELECT name FR
e7b0: 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  OM sqlite_master
e7c0: 20 57 48 45 52 45 20 72 6f 6f 74 70 61 67 65 20   WHERE rootpage 
e7d0: 3d 20 3f 22 0a 20 20 20 20 29 3b 0a 20 20 20 20  = ?".    );.    
e7e0: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
e7f0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
e800: 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70  lite3_bind_int(p
e810: 51 75 65 72 79 2c 20 31 2c 20 74 6e 75 6d 29 3b  Query, 1, tnum);
e820: 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54  .      if( SQLIT
e830: 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73  E_ROW==sqlite3_s
e840: 74 65 70 28 70 51 75 65 72 79 29 20 29 7b 0a 20  tep(pQuery) ){. 
e850: 20 20 20 20 20 20 20 7a 49 64 78 20 3d 20 28 63         zIdx = (c
e860: 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
e870: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
e880: 51 75 65 72 79 2c 20 30 29 3b 0a 20 20 20 20 20  Query, 0);.     
e890: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
e8a0: 20 7a 49 64 78 20 29 7b 0a 20 20 20 20 20 20 70   zIdx ){.      p
e8b0: 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65 46 72  ->rc = prepareFr
e8c0: 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f  eeAndCollectErro
e8d0: 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 70 58  r(p->dbMain, &pX
e8e0: 49 6e 66 6f 2c 20 26 70 2d 3e 7a 45 72 72 6d 73  Info, &p->zErrms
e8f0: 67 2c 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  g,.          sql
e900: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 50 52  ite3_mprintf("PR
e910: 41 47 4d 41 20 6d 61 69 6e 2e 69 6e 64 65 78 5f  AGMA main.index_
e920: 78 69 6e 66 6f 20 3d 20 25 51 22 2c 20 7a 49 64  xinfo = %Q", zId
e930: 78 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  x).      );.    
e940: 7d 0a 20 20 20 20 72 62 75 46 69 6e 61 6c 69 7a  }.    rbuFinaliz
e950: 65 28 70 2c 20 70 51 75 65 72 79 29 3b 0a 0a 20  e(p, pQuery);.. 
e960: 20 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d     while( p->rc=
e970: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51  =SQLITE_OK && SQ
e980: 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65  LITE_ROW==sqlite
e990: 33 5f 73 74 65 70 28 70 58 49 6e 66 6f 29 20 29  3_step(pXInfo) )
e9a0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 4b 65 79  {.      int bKey
e9b0: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
e9c0: 6e 5f 69 6e 74 28 70 58 49 6e 66 6f 2c 20 35 29  n_int(pXInfo, 5)
e9d0: 3b 0a 20 20 20 20 20 20 69 66 28 20 62 4b 65 79  ;.      if( bKey
e9e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
e9f0: 69 43 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 63  iCid = sqlite3_c
ea00: 6f 6c 75 6d 6e 5f 69 6e 74 28 70 58 49 6e 66 6f  olumn_int(pXInfo
ea10: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 6e  , 1);.        in
ea20: 74 20 62 44 65 73 63 20 3d 20 73 71 6c 69 74 65  t bDesc = sqlite
ea30: 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 58 49  3_column_int(pXI
ea40: 6e 66 6f 2c 20 33 29 3b 0a 20 20 20 20 20 20 20  nfo, 3);.       
ea50: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
ea60: 6c 6c 61 74 65 20 3d 20 28 63 6f 6e 73 74 20 63  llate = (const c
ea70: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
ea80: 75 6d 6e 5f 74 65 78 74 28 70 58 49 6e 66 6f 2c  umn_text(pXInfo,
ea90: 20 34 29 3b 0a 20 20 20 20 20 20 20 20 7a 43 6f   4);.        zCo
eaa0: 6c 73 20 3d 20 72 62 75 4d 50 72 69 6e 74 66 28  ls = rbuMPrintf(
eab0: 70 2c 20 22 25 7a 25 73 63 25 64 20 25 73 20 43  p, "%z%sc%d %s C
eac0: 4f 4c 4c 41 54 45 20 25 73 22 2c 20 7a 43 6f 6c  OLLATE %s", zCol
ead0: 73 2c 20 7a 43 6f 6d 6d 61 2c 20 0a 20 20 20 20  s, zComma, .    
eae0: 20 20 20 20 20 20 20 20 69 43 69 64 2c 20 70 49          iCid, pI
eaf0: 74 65 72 2d 3e 61 7a 54 62 6c 54 79 70 65 5b 69  ter->azTblType[i
eb00: 43 69 64 5d 2c 20 7a 43 6f 6c 6c 61 74 65 0a 20  Cid], zCollate. 
eb10: 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
eb20: 20 20 7a 50 6b 20 3d 20 72 62 75 4d 50 72 69 6e    zPk = rbuMPrin
eb30: 74 66 28 70 2c 20 22 25 7a 25 73 63 25 64 25 73  tf(p, "%z%sc%d%s
eb40: 22 2c 20 7a 50 6b 2c 20 7a 43 6f 6d 6d 61 2c 20  ", zPk, zComma, 
eb50: 69 43 69 64 2c 20 62 44 65 73 63 3f 22 20 44 45  iCid, bDesc?" DE
eb60: 53 43 22 3a 22 22 29 3b 0a 20 20 20 20 20 20 20  SC":"");.       
eb70: 20 7a 43 6f 6d 6d 61 20 3d 20 22 2c 20 22 3b 0a   zComma = ", ";.
eb80: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
eb90: 20 20 7a 43 6f 6c 73 20 3d 20 72 62 75 4d 50 72    zCols = rbuMPr
eba0: 69 6e 74 66 28 70 2c 20 22 25 7a 2c 20 69 64 20  intf(p, "%z, id 
ebb0: 49 4e 54 45 47 45 52 22 2c 20 7a 43 6f 6c 73 29  INTEGER", zCols)
ebc0: 3b 0a 20 20 20 20 72 62 75 46 69 6e 61 6c 69 7a  ;.    rbuFinaliz
ebd0: 65 28 70 2c 20 70 58 49 6e 66 6f 29 3b 0a 0a 20  e(p, pXInfo);.. 
ebe0: 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f     sqlite3_test_
ebf0: 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
ec00: 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52  ESTCTRL_IMPOSTER
ec10: 2c 20 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 6d 61  , p->dbMain, "ma
ec20: 69 6e 22 2c 20 31 2c 20 74 6e 75 6d 29 3b 0a 20  in", 1, tnum);. 
ec30: 20 20 20 72 62 75 4d 50 72 69 6e 74 66 45 78 65     rbuMPrintfExe
ec40: 63 28 70 2c 20 70 2d 3e 64 62 4d 61 69 6e 2c 0a  c(p, p->dbMain,.
ec50: 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20          "CREATE 
ec60: 54 41 42 4c 45 20 72 62 75 5f 69 6d 70 6f 73 74  TABLE rbu_impost
ec70: 65 72 32 28 25 7a 2c 20 50 52 49 4d 41 52 59 20  er2(%z, PRIMARY 
ec80: 4b 45 59 28 25 7a 29 29 20 57 49 54 48 4f 55 54  KEY(%z)) WITHOUT
ec90: 20 52 4f 57 49 44 22 2c 20 0a 20 20 20 20 20 20   ROWID", .      
eca0: 20 20 7a 43 6f 6c 73 2c 20 7a 50 6b 0a 20 20 20    zCols, zPk.   
ecb0: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   );.    sqlite3_
ecc0: 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
ecd0: 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50  ITE_TESTCTRL_IMP
ece0: 4f 53 54 45 52 2c 20 70 2d 3e 64 62 4d 61 69 6e  OSTER, p->dbMain
ecf0: 2c 20 22 6d 61 69 6e 22 2c 20 30 2c 20 30 29 3b  , "main", 0, 0);
ed00: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  .  }.}../*.** If
ed10: 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61 6c   an error has al
ed20: 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 20 77  ready occurred w
ed30: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
ed40: 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20  n is called, it 
ed50: 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  .** immediately 
ed60: 72 65 74 75 72 6e 73 20 7a 65 72 6f 20 28 77 69  returns zero (wi
ed70: 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 20  thout doing any 
ed80: 77 6f 72 6b 29 2e 20 4f 72 2c 20 69 66 20 61 6e  work). Or, if an
ed90: 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75 72 73   error.** occurs
eda0: 20 64 75 72 69 6e 67 20 74 68 65 20 65 78 65 63   during the exec
edb0: 75 74 69 6f 6e 20 6f 66 20 74 68 69 73 20 66 75  ution of this fu
edc0: 6e 63 74 69 6f 6e 2c 20 69 74 20 73 65 74 73 20  nction, it sets 
edd0: 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a  the error code.*
ede0: 2a 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 33  * in the sqlite3
edf0: 72 62 75 20 6f 62 6a 65 63 74 20 69 6e 64 69 63  rbu object indic
ee00: 61 74 65 64 20 62 79 20 74 68 65 20 66 69 72 73  ated by the firs
ee10: 74 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 72  t argument and r
ee20: 65 74 75 72 6e 73 0a 2a 2a 20 7a 65 72 6f 2e 0a  eturns.** zero..
ee30: 2a 2a 0a 2a 2a 20 54 68 65 20 69 74 65 72 61 74  **.** The iterat
ee40: 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65  or passed as the
ee50: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
ee60: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
ee70: 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 61 20  o point to.** a 
ee80: 74 61 62 6c 65 20 28 6e 6f 74 20 61 6e 20 69 6e  table (not an in
ee90: 64 65 78 29 20 77 68 65 6e 20 74 68 69 73 20 66  dex) when this f
eea0: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
eeb0: 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  d. This function
eec0: 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20  .** attempts to 
eed0: 63 72 65 61 74 65 20 61 6e 79 20 69 6d 70 6f 73  create any impos
eee0: 74 65 72 20 74 61 62 6c 65 20 72 65 71 75 69 72  ter table requir
eef0: 65 64 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74  ed to write to t
ef00: 68 65 20 6d 61 69 6e 0a 2a 2a 20 74 61 62 6c 65  he main.** table
ef10: 20 62 2d 74 72 65 65 20 6f 66 20 74 68 65 20 74   b-tree of the t
ef20: 61 62 6c 65 20 62 65 66 6f 72 65 20 72 65 74 75  able before retu
ef30: 72 6e 69 6e 67 2e 20 4e 6f 6e 2d 7a 65 72 6f 20  rning. Non-zero 
ef40: 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 0a 2a  is returned if.*
ef50: 2a 20 61 6e 20 69 6d 70 6f 73 74 65 72 20 74 61  * an imposter ta
ef60: 62 6c 65 20 61 72 65 20 63 72 65 61 74 65 64 2c  ble are created,
ef70: 20 6f 72 20 7a 65 72 6f 20 6f 74 68 65 72 77 69   or zero otherwi
ef80: 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6d 70  se..**.** An imp
ef90: 6f 73 74 65 72 20 74 61 62 6c 65 20 69 73 20 72  oster table is r
efa0: 65 71 75 69 72 65 64 20 69 6e 20 61 6c 6c 20 63  equired in all c
efb0: 61 73 65 73 20 65 78 63 65 70 74 20 52 42 55 5f  ases except RBU_
efc0: 50 4b 5f 56 54 41 42 2e 20 4f 6e 6c 79 0a 2a 2a  PK_VTAB. Only.**
efd0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20   virtual tables 
efe0: 61 72 65 20 77 72 69 74 74 65 6e 20 74 6f 20 64  are written to d
eff0: 69 72 65 63 74 6c 79 2e 20 54 68 65 20 69 6d 70  irectly. The imp
f000: 6f 73 74 65 72 20 74 61 62 6c 65 20 68 61 73 20  oster table has 
f010: 74 68 65 20 0a 2a 2a 20 73 61 6d 65 20 73 63 68  the .** same sch
f020: 65 6d 61 20 61 73 20 74 68 65 20 61 63 74 75 61  ema as the actua
f030: 6c 20 74 61 72 67 65 74 20 74 61 62 6c 65 20 28  l target table (
f040: 6c 65 73 73 20 61 6e 79 20 55 4e 49 51 55 45 20  less any UNIQUE 
f050: 63 6f 6e 73 74 72 61 69 6e 74 73 29 2e 20 0a 2a  constraints). .*
f060: 2a 20 4d 6f 72 65 20 70 72 65 63 69 73 65 6c 79  * More precisely
f070: 2c 20 74 68 65 20 22 73 61 6d 65 20 73 63 68 65  , the "same sche
f080: 6d 61 22 20 6d 65 61 6e 73 20 74 68 65 20 73 61  ma" means the sa
f090: 6d 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 79 70 65  me columns, type
f0a0: 73 2c 20 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e  s, .** collation
f0b0: 20 73 65 71 75 65 6e 63 65 73 2e 20 46 6f 72 20   sequences. For 
f0c0: 74 61 62 6c 65 73 20 74 68 61 74 20 64 6f 20 6e  tables that do n
f0d0: 6f 74 20 68 61 76 65 20 61 6e 20 65 78 74 65 72  ot have an exter
f0e0: 6e 61 6c 20 50 52 49 4d 41 52 59 0a 2a 2a 20 4b  nal PRIMARY.** K
f0f0: 45 59 2c 20 69 74 20 61 6c 73 6f 20 6d 65 61 6e  EY, it also mean
f100: 73 20 74 68 65 20 73 61 6d 65 20 50 52 49 4d 41  s the same PRIMA
f110: 52 59 20 4b 45 59 20 64 65 63 6c 61 72 61 74 69  RY KEY declarati
f120: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
f130: 69 64 20 72 62 75 43 72 65 61 74 65 49 6d 70 6f  id rbuCreateImpo
f140: 73 74 65 72 54 61 62 6c 65 28 73 71 6c 69 74 65  sterTable(sqlite
f150: 33 72 62 75 20 2a 70 2c 20 52 62 75 4f 62 6a 49  3rbu *p, RbuObjI
f160: 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69  ter *pIter){.  i
f170: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
f180: 5f 4f 4b 20 26 26 20 70 49 74 65 72 2d 3e 65 54  _OK && pIter->eT
f190: 79 70 65 21 3d 52 42 55 5f 50 4b 5f 56 54 41 42  ype!=RBU_PK_VTAB
f1a0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 74 6e 75 6d   ){.    int tnum
f1b0: 20 3d 20 70 49 74 65 72 2d 3e 69 54 6e 75 6d 3b   = pIter->iTnum;
f1c0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
f1d0: 2a 7a 43 6f 6d 6d 61 20 3d 20 22 22 3b 0a 20 20  *zComma = "";.  
f1e0: 20 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 30    char *zSql = 0
f1f0: 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b 0a  ;.    int iCol;.
f200: 20 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74      sqlite3_test
f210: 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
f220: 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45  TESTCTRL_IMPOSTE
f230: 52 2c 20 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 6d  R, p->dbMain, "m
f240: 61 69 6e 22 2c 20 30 2c 20 31 29 3b 0a 0a 20 20  ain", 0, 1);..  
f250: 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 70 2d    for(iCol=0; p-
f260: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
f270: 26 20 69 43 6f 6c 3c 70 49 74 65 72 2d 3e 6e 54  & iCol<pIter->nT
f280: 62 6c 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a  blCol; iCol++){.
f290: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
f2a0: 20 2a 7a 50 6b 20 3d 20 22 22 3b 0a 20 20 20 20   *zPk = "";.    
f2b0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
f2c0: 6f 6c 20 3d 20 70 49 74 65 72 2d 3e 61 7a 54 62  ol = pIter->azTb
f2d0: 6c 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20  lCol[iCol];.    
f2e0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
f2f0: 6f 6c 6c 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20  oll = 0;..      
f300: 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  p->rc = sqlite3_
f310: 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74  table_column_met
f320: 61 64 61 74 61 28 0a 20 20 20 20 20 20 20 20 20  adata(.         
f330: 20 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 6d 61 69   p->dbMain, "mai
f340: 6e 22 2c 20 70 49 74 65 72 2d 3e 7a 54 62 6c 2c  n", pIter->zTbl,
f350: 20 7a 43 6f 6c 2c 20 30 2c 20 26 7a 43 6f 6c 6c   zCol, 0, &zColl
f360: 2c 20 30 2c 20 30 2c 20 30 0a 20 20 20 20 20 20  , 0, 0, 0.      
f370: 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 49  );..      if( pI
f380: 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f  ter->eType==RBU_
f390: 50 4b 5f 49 50 4b 20 26 26 20 70 49 74 65 72 2d  PK_IPK && pIter-
f3a0: 3e 61 62 54 62 6c 50 6b 5b 69 43 6f 6c 5d 20 29  >abTblPk[iCol] )
f3b0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
f3c0: 74 68 65 20 74 61 72 67 65 74 20 74 61 62 6c 65  the target table
f3d0: 20 63 6f 6c 75 6d 6e 20 69 73 20 61 6e 20 22 49   column is an "I
f3e0: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
f3f0: 45 59 22 2c 20 61 64 64 0a 20 20 20 20 20 20 20  EY", add.       
f400: 20 2a 2a 20 22 50 52 49 4d 41 52 59 20 4b 45 59   ** "PRIMARY KEY
f410: 22 20 74 6f 20 74 68 65 20 69 6d 70 6f 73 74 65  " to the imposte
f420: 72 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 64  r table column d
f430: 65 63 6c 61 72 61 74 69 6f 6e 2e 20 2a 2f 0a 20  eclaration. */. 
f440: 20 20 20 20 20 20 20 7a 50 6b 20 3d 20 22 50 52         zPk = "PR
f450: 49 4d 41 52 59 20 4b 45 59 20 22 3b 0a 20 20 20  IMARY KEY ";.   
f460: 20 20 20 7d 0a 20 20 20 20 20 20 7a 53 71 6c 20     }.      zSql 
f470: 3d 20 72 62 75 4d 50 72 69 6e 74 66 28 70 2c 20  = rbuMPrintf(p, 
f480: 22 25 7a 25 73 5c 22 25 77 5c 22 20 25 73 20 25  "%z%s\"%w\" %s %
f490: 73 43 4f 4c 4c 41 54 45 20 25 73 25 73 22 2c 20  sCOLLATE %s%s", 
f4a0: 0a 20 20 20 20 20 20 20 20 20 20 7a 53 71 6c 2c  .          zSql,
f4b0: 20 7a 43 6f 6d 6d 61 2c 20 7a 43 6f 6c 2c 20 70   zComma, zCol, p
f4c0: 49 74 65 72 2d 3e 61 7a 54 62 6c 54 79 70 65 5b  Iter->azTblType[
f4d0: 69 43 6f 6c 5d 2c 20 7a 50 6b 2c 20 7a 43 6f 6c  iCol], zPk, zCol
f4e0: 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 28 70 49  l,.          (pI
f4f0: 74 65 72 2d 3e 61 62 4e 6f 74 4e 75 6c 6c 5b 69  ter->abNotNull[i
f500: 43 6f 6c 5d 20 3f 20 22 20 4e 4f 54 20 4e 55 4c  Col] ? " NOT NUL
f510: 4c 22 20 3a 20 22 22 29 0a 20 20 20 20 20 20 29  L" : "").      )
f520: 3b 0a 20 20 20 20 20 20 7a 43 6f 6d 6d 61 20 3d  ;.      zComma =
f530: 20 22 2c 20 22 3b 0a 20 20 20 20 7d 0a 0a 20 20   ", ";.    }..  
f540: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 65 54 79    if( pIter->eTy
f550: 70 65 3d 3d 52 42 55 5f 50 4b 5f 57 49 54 48 4f  pe==RBU_PK_WITHO
f560: 55 54 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20  UT_ROWID ){.    
f570: 20 20 63 68 61 72 20 2a 7a 50 6b 20 3d 20 72 62    char *zPk = rb
f580: 75 57 69 74 68 6f 75 74 52 6f 77 69 64 50 4b 28  uWithoutRowidPK(
f590: 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20  p, pIter);.     
f5a0: 20 69 66 28 20 7a 50 6b 20 29 7b 0a 20 20 20 20   if( zPk ){.    
f5b0: 20 20 20 20 7a 53 71 6c 20 3d 20 72 62 75 4d 50      zSql = rbuMP
f5c0: 72 69 6e 74 66 28 70 2c 20 22 25 7a 2c 20 25 7a  rintf(p, "%z, %z
f5d0: 22 2c 20 7a 53 71 6c 2c 20 7a 50 6b 29 3b 0a 20  ", zSql, zPk);. 
f5e0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
f5f0: 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
f600: 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
f610: 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52 2c  STCTRL_IMPOSTER,
f620: 20 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 6d 61 69   p->dbMain, "mai
f630: 6e 22 2c 20 31 2c 20 74 6e 75 6d 29 3b 0a 20 20  n", 1, tnum);.  
f640: 20 20 72 62 75 4d 50 72 69 6e 74 66 45 78 65 63    rbuMPrintfExec
f650: 28 70 2c 20 70 2d 3e 64 62 4d 61 69 6e 2c 20 22  (p, p->dbMain, "
f660: 43 52 45 41 54 45 20 54 41 42 4c 45 20 5c 22 72  CREATE TABLE \"r
f670: 62 75 5f 69 6d 70 5f 25 77 5c 22 28 25 7a 29 25  bu_imp_%w\"(%z)%
f680: 73 22 2c 20 0a 20 20 20 20 20 20 20 20 70 49 74  s", .        pIt
f690: 65 72 2d 3e 7a 54 62 6c 2c 20 7a 53 71 6c 2c 20  er->zTbl, zSql, 
f6a0: 0a 20 20 20 20 20 20 20 20 28 70 49 74 65 72 2d  .        (pIter-
f6b0: 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 57  >eType==RBU_PK_W
f6c0: 49 54 48 4f 55 54 5f 52 4f 57 49 44 20 3f 20 22  ITHOUT_ROWID ? "
f6d0: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 22 20   WITHOUT ROWID" 
f6e0: 3a 20 22 22 29 0a 20 20 20 20 29 3b 0a 20 20 20  : "").    );.   
f6f0: 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
f700: 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
f710: 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52 2c 20  TCTRL_IMPOSTER, 
f720: 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 6d 61 69 6e  p->dbMain, "main
f730: 22 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a  ", 0, 0);.  }.}.
f740: 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20 61  ./*.** Prepare a
f750: 20 73 74 61 74 65 6d 65 6e 74 20 75 73 65 64 20   statement used 
f760: 74 6f 20 69 6e 73 65 72 74 20 72 6f 77 73 20 69  to insert rows i
f770: 6e 74 6f 20 74 68 65 20 22 72 62 75 5f 74 6d 70  nto the "rbu_tmp
f780: 5f 78 78 78 22 20 74 61 62 6c 65 2e 0a 2a 2a 20  _xxx" table..** 
f790: 53 70 65 63 69 66 69 63 61 6c 6c 79 20 61 20 73  Specifically a s
f7a0: 74 61 74 65 6d 65 6e 74 20 6f 66 20 74 68 65 20  tatement of the 
f7b0: 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  form:.**.**     
f7c0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 72 62 75 5f  INSERT INTO rbu_
f7d0: 74 6d 70 5f 78 78 78 20 56 41 4c 55 45 53 28 3f  tmp_xxx VALUES(?
f7e0: 2c 20 3f 2c 20 3f 20 2e 2e 2e 29 3b 0a 2a 2a 0a  , ?, ? ...);.**.
f7f0: 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** The number of
f800: 20 62 6f 75 6e 64 20 76 61 72 69 61 62 6c 65 73   bound variables
f810: 20 69 73 20 65 71 75 61 6c 20 74 6f 20 74 68 65   is equal to the
f820: 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
f830: 6e 73 20 69 6e 0a 2a 2a 20 74 68 65 20 74 61 72  ns in.** the tar
f840: 67 65 74 20 74 61 62 6c 65 2c 20 70 6c 75 73 20  get table, plus 
f850: 6f 6e 65 20 28 66 6f 72 20 74 68 65 20 72 62 75  one (for the rbu
f860: 5f 63 6f 6e 74 72 6f 6c 20 63 6f 6c 75 6d 6e 29  _control column)
f870: 2c 20 70 6c 75 73 20 6f 6e 65 20 6d 6f 72 65 20  , plus one more 
f880: 0a 2a 2a 20 28 66 6f 72 20 74 68 65 20 72 62 75  .** (for the rbu
f890: 5f 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 29 20 69  _rowid column) i
f8a0: 66 20 74 68 65 20 74 61 72 67 65 74 20 74 61 62  f the target tab
f8b0: 6c 65 20 69 73 20 61 6e 20 69 6d 70 6c 69 63 69  le is an implici
f8c0: 74 20 49 50 4b 20 6f 72 20 0a 2a 2a 20 76 69 72  t IPK or .** vir
f8d0: 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73  tual table..*/.s
f8e0: 74 61 74 69 63 20 76 6f 69 64 20 72 62 75 4f 62  tatic void rbuOb
f8f0: 6a 49 74 65 72 50 72 65 70 61 72 65 54 6d 70 49  jIterPrepareTmpI
f900: 6e 73 65 72 74 28 0a 20 20 73 71 6c 69 74 65 33  nsert(.  sqlite3
f910: 72 62 75 20 2a 70 2c 20 0a 20 20 52 62 75 4f 62  rbu *p, .  RbuOb
f920: 6a 49 74 65 72 20 2a 70 49 74 65 72 2c 0a 20 20  jIter *pIter,.  
f930: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
f940: 6c 69 73 74 2c 0a 20 20 63 6f 6e 73 74 20 63 68  list,.  const ch
f950: 61 72 20 2a 7a 52 62 75 52 6f 77 69 64 0a 29 7b  ar *zRbuRowid.){
f960: 0a 20 20 69 6e 74 20 62 52 62 75 52 6f 77 69 64  .  int bRbuRowid
f970: 20 3d 20 28 70 49 74 65 72 2d 3e 65 54 79 70 65   = (pIter->eType
f980: 3d 3d 52 42 55 5f 50 4b 5f 45 58 54 45 52 4e 41  ==RBU_PK_EXTERNA
f990: 4c 20 7c 7c 20 70 49 74 65 72 2d 3e 65 54 79 70  L || pIter->eTyp
f9a0: 65 3d 3d 52 42 55 5f 50 4b 5f 4e 4f 4e 45 29 3b  e==RBU_PK_NONE);
f9b0: 0a 20 20 63 68 61 72 20 2a 7a 42 69 6e 64 20 3d  .  char *zBind =
f9c0: 20 72 62 75 4f 62 6a 49 74 65 72 47 65 74 42 69   rbuObjIterGetBi
f9d0: 6e 64 6c 69 73 74 28 70 2c 20 70 49 74 65 72 2d  ndlist(p, pIter-
f9e0: 3e 6e 54 62 6c 43 6f 6c 20 2b 20 31 20 2b 20 62  >nTblCol + 1 + b
f9f0: 52 62 75 52 6f 77 69 64 29 3b 0a 20 20 69 66 28  RbuRowid);.  if(
fa00: 20 7a 42 69 6e 64 20 29 7b 0a 20 20 20 20 61 73   zBind ){.    as
fa10: 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70 54 6d  sert( pIter->pTm
fa20: 70 49 6e 73 65 72 74 3d 3d 30 20 29 3b 0a 20 20  pInsert==0 );.  
fa30: 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72    p->rc = prepar
fa40: 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45  eFreeAndCollectE
fa50: 72 72 6f 72 28 0a 20 20 20 20 20 20 20 20 70 2d  rror(.        p-
fa60: 3e 64 62 52 62 75 2c 20 26 70 49 74 65 72 2d 3e  >dbRbu, &pIter->
fa70: 70 54 6d 70 49 6e 73 65 72 74 2c 20 26 70 2d 3e  pTmpInsert, &p->
fa80: 7a 45 72 72 6d 73 67 2c 20 73 71 6c 69 74 65 33  zErrmsg, sqlite3
fa90: 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20  _mprintf(.      
faa0: 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f      "INSERT INTO
fab0: 20 25 73 2e 27 72 62 75 5f 74 6d 70 5f 25 71 27   %s.'rbu_tmp_%q'
fac0: 28 72 62 75 5f 63 6f 6e 74 72 6f 6c 2c 25 73 25  (rbu_control,%s%
fad0: 73 29 20 56 41 4c 55 45 53 28 25 7a 29 22 2c 20  s) VALUES(%z)", 
fae0: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 53  .          p->zS
faf0: 74 61 74 65 44 62 2c 20 70 49 74 65 72 2d 3e 7a  tateDb, pIter->z
fb00: 44 61 74 61 54 62 6c 2c 20 7a 43 6f 6c 6c 69 73  DataTbl, zCollis
fb10: 74 2c 20 7a 52 62 75 52 6f 77 69 64 2c 20 7a 42  t, zRbuRowid, zB
fb20: 69 6e 64 0a 20 20 20 20 29 29 3b 0a 20 20 7d 0a  ind.    ));.  }.
fb30: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  }..static void r
fb40: 62 75 54 6d 70 49 6e 73 65 72 74 46 75 6e 63 28  buTmpInsertFunc(
fb50: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
fb60: 78 74 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74  xt *pCtx, .  int
fb70: 20 6e 56 61 6c 2c 0a 20 20 73 71 6c 69 74 65 33   nVal,.  sqlite3
fb80: 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 0a 29  _value **apVal.)
fb90: 7b 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20 2a  {.  sqlite3rbu *
fba0: 70 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72  p = sqlite3_user
fbb0: 5f 64 61 74 61 28 70 43 74 78 29 3b 0a 20 20 69  _data(pCtx);.  i
fbc0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
fbd0: 4b 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61  K;.  int i;..  a
fbe0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76  ssert( sqlite3_v
fbf0: 61 6c 75 65 5f 69 6e 74 28 61 70 56 61 6c 5b 30  alue_int(apVal[0
fc00: 5d 29 21 3d 30 0a 20 20 20 20 20 20 7c 7c 20 70  ])!=0.      || p
fc10: 2d 3e 6f 62 6a 69 74 65 72 2e 65 54 79 70 65 3d  ->objiter.eType=
fc20: 3d 52 42 55 5f 50 4b 5f 45 58 54 45 52 4e 41 4c  =RBU_PK_EXTERNAL
fc30: 20 0a 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6f 62   .      || p->ob
fc40: 6a 69 74 65 72 2e 65 54 79 70 65 3d 3d 52 42 55  jiter.eType==RBU
fc50: 5f 50 4b 5f 4e 4f 4e 45 20 0a 20 20 29 3b 0a 20  _PK_NONE .  );. 
fc60: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c   if( sqlite3_val
fc70: 75 65 5f 69 6e 74 28 61 70 56 61 6c 5b 30 5d 29  ue_int(apVal[0])
fc80: 21 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 50  !=0 ){.    p->nP
fc90: 68 61 73 65 4f 6e 65 53 74 65 70 20 2b 3d 20 70  haseOneStep += p
fca0: 2d 3e 6f 62 6a 69 74 65 72 2e 6e 49 6e 64 65 78  ->objiter.nIndex
fcb0: 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 3d 30  ;.  }..  for(i=0
fcc0: 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
fcd0: 26 26 20 69 3c 6e 56 61 6c 3b 20 69 2b 2b 29 7b  && i<nVal; i++){
fce0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
fcf0: 33 5f 62 69 6e 64 5f 76 61 6c 75 65 28 70 2d 3e  3_bind_value(p->
fd00: 6f 62 6a 69 74 65 72 2e 70 54 6d 70 49 6e 73 65  objiter.pTmpInse
fd10: 72 74 2c 20 69 2b 31 2c 20 61 70 56 61 6c 5b 69  rt, i+1, apVal[i
fd20: 5d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  ]);.  }.  if( rc
fd30: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
fd40: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28     sqlite3_step(
fd50: 70 2d 3e 6f 62 6a 69 74 65 72 2e 70 54 6d 70 49  p->objiter.pTmpI
fd60: 6e 73 65 72 74 29 3b 0a 20 20 20 20 72 63 20 3d  nsert);.    rc =
fd70: 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
fd80: 2d 3e 6f 62 6a 69 74 65 72 2e 70 54 6d 70 49 6e  ->objiter.pTmpIn
fd90: 73 65 72 74 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  sert);.  }..  if
fda0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
fdb0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ){.    sqlite3_r
fdc0: 65 73 75 6c 74 5f 65 72 72 6f 72 5f 63 6f 64 65  esult_error_code
fdd0: 28 70 43 74 78 2c 20 72 63 29 3b 0a 20 20 7d 0a  (pCtx, rc);.  }.
fde0: 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 73 75 72 65 20  }../*.** Ensure 
fdf0: 74 68 61 74 20 74 68 65 20 53 51 4c 69 74 65 20  that the SQLite 
fe00: 73 74 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65  statement handle
fe10: 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 75 70  s required to up
fe20: 64 61 74 65 20 74 68 65 20 0a 2a 2a 20 74 61 72  date the .** tar
fe30: 67 65 74 20 64 61 74 61 62 61 73 65 20 6f 62 6a  get database obj
fe40: 65 63 74 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  ect currently in
fe50: 64 69 63 61 74 65 64 20 62 79 20 74 68 65 20 69  dicated by the i
fe60: 74 65 72 61 74 6f 72 20 70 61 73 73 65 64 20 0a  terator passed .
fe70: 2a 2a 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ** as the second
fe80: 20 61 72 67 75 6d 65 6e 74 20 61 72 65 20 61 76   argument are av
fe90: 61 69 6c 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  ailable..*/.stat
fea0: 69 63 20 69 6e 74 20 72 62 75 4f 62 6a 49 74 65  ic int rbuObjIte
feb0: 72 50 72 65 70 61 72 65 41 6c 6c 28 0a 20 20 73  rPrepareAll(.  s
fec0: 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 0a 20  qlite3rbu *p, . 
fed0: 20 52 62 75 4f 62 6a 49 74 65 72 20 2a 70 49 74   RbuObjIter *pIt
fee0: 65 72 2c 0a 20 20 69 6e 74 20 6e 4f 66 66 73 65  er,.  int nOffse
fef0: 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
ff00: 20 20 20 20 20 20 2f 2a 20 41 64 64 20 22 4c 49        /* Add "LI
ff10: 4d 49 54 20 2d 31 20 4f 46 46 53 45 54 20 24 6e  MIT -1 OFFSET $n
ff20: 4f 66 66 73 65 74 22 20 74 6f 20 53 45 4c 45 43  Offset" to SELEC
ff30: 54 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74  T */.){.  assert
ff40: 28 20 70 49 74 65 72 2d 3e 62 43 6c 65 61 6e 75  ( pIter->bCleanu
ff50: 70 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 49  p==0 );.  if( pI
ff60: 74 65 72 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20  ter->pSelect==0 
ff70: 26 26 20 72 62 75 4f 62 6a 49 74 65 72 43 61 63  && rbuObjIterCac
ff80: 68 65 54 61 62 6c 65 49 6e 66 6f 28 70 2c 20 70  heTableInfo(p, p
ff90: 49 74 65 72 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  Iter)==SQLITE_OK
ffa0: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e   ){.    const in
ffb0: 74 20 74 6e 75 6d 20 3d 20 70 49 74 65 72 2d 3e  t tnum = pIter->
ffc0: 69 54 6e 75 6d 3b 0a 20 20 20 20 63 68 61 72 20  iTnum;.    char 
ffd0: 2a 7a 43 6f 6c 6c 69 73 74 20 3d 20 30 3b 20 20  *zCollist = 0;  
ffe0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
fff0: 20 6f 66 20 69 6e 64 65 78 65 64 20 63 6f 6c 75   of indexed colu
10000 6d 6e 73 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  mns */.    char 
10010 2a 2a 70 7a 20 3d 20 26 70 2d 3e 7a 45 72 72 6d  **pz = &p->zErrm
10020 73 67 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  sg;.    const ch
10030 61 72 20 2a 7a 49 64 78 20 3d 20 70 49 74 65 72  ar *zIdx = pIter
10040 2d 3e 7a 49 64 78 3b 0a 20 20 20 20 63 68 61 72  ->zIdx;.    char
10050 20 2a 7a 4c 69 6d 69 74 20 3d 20 30 3b 0a 0a 20   *zLimit = 0;.. 
10060 20 20 20 69 66 28 20 6e 4f 66 66 73 65 74 20 29     if( nOffset )
10070 7b 0a 20 20 20 20 20 20 7a 4c 69 6d 69 74 20 3d  {.      zLimit =
10080 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
10090 28 22 20 4c 49 4d 49 54 20 2d 31 20 4f 46 46 53  (" LIMIT -1 OFFS
100a0 45 54 20 25 64 22 2c 20 6e 4f 66 66 73 65 74 29  ET %d", nOffset)
100b0 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 4c 69  ;.      if( !zLi
100c0 6d 69 74 20 29 20 70 2d 3e 72 63 20 3d 20 53 51  mit ) p->rc = SQ
100d0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
100e0 7d 0a 0a 20 20 20 20 69 66 28 20 7a 49 64 78 20  }..    if( zIdx 
100f0 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
10100 68 61 72 20 2a 7a 54 62 6c 20 3d 20 70 49 74 65  har *zTbl = pIte
10110 72 2d 3e 7a 54 62 6c 3b 0a 20 20 20 20 20 20 63  r->zTbl;.      c
10120 68 61 72 20 2a 7a 49 6d 70 6f 73 74 65 72 43 6f  har *zImposterCo
10130 6c 73 20 3d 20 30 3b 20 20 20 20 2f 2a 20 43 6f  ls = 0;    /* Co
10140 6c 75 6d 6e 73 20 66 6f 72 20 69 6d 70 6f 73 74  lumns for impost
10150 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  er table */.    
10160 20 20 63 68 61 72 20 2a 7a 49 6d 70 6f 73 74 65    char *zImposte
10170 72 50 4b 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  rPK = 0;      /*
10180 20 50 72 69 6d 61 72 79 20 6b 65 79 20 64 65 63   Primary key dec
10190 6c 61 72 61 74 69 6f 6e 20 66 6f 72 20 69 6d 70  laration for imp
101a0 6f 73 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 63  oster */.      c
101b0 68 61 72 20 2a 7a 57 68 65 72 65 20 3d 20 30 3b  har *zWhere = 0;
101c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 48             /* WH
101d0 45 52 45 20 63 6c 61 75 73 65 20 6f 6e 20 50 4b  ERE clause on PK
101e0 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20   columns */.    
101f0 20 20 63 68 61 72 20 2a 7a 42 69 6e 64 20 3d 20    char *zBind = 
10200 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 69  0;.      int nBi
10210 6e 64 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 61  nd = 0;..      a
10220 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 65 54  ssert( pIter->eT
10230 79 70 65 21 3d 52 42 55 5f 50 4b 5f 56 54 41 42  ype!=RBU_PK_VTAB
10240 20 29 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 69   );.      zColli
10250 73 74 20 3d 20 72 62 75 4f 62 6a 49 74 65 72 47  st = rbuObjIterG
10260 65 74 49 6e 64 65 78 43 6f 6c 73 28 0a 20 20 20  etIndexCols(.   
10270 20 20 20 20 20 20 20 70 2c 20 70 49 74 65 72 2c         p, pIter,
10280 20 26 7a 49 6d 70 6f 73 74 65 72 43 6f 6c 73 2c   &zImposterCols,
10290 20 26 7a 49 6d 70 6f 73 74 65 72 50 4b 2c 20 26   &zImposterPK, &
102a0 7a 57 68 65 72 65 2c 20 26 6e 42 69 6e 64 0a 20  zWhere, &nBind. 
102b0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7a 42       );.      zB
102c0 69 6e 64 20 3d 20 72 62 75 4f 62 6a 49 74 65 72  ind = rbuObjIter
102d0 47 65 74 42 69 6e 64 6c 69 73 74 28 70 2c 20 6e  GetBindlist(p, n
102e0 42 69 6e 64 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  Bind);..      /*
102f0 20 43 72 65 61 74 65 20 74 68 65 20 69 6d 70 6f   Create the impo
10300 73 74 65 72 20 74 61 62 6c 65 20 75 73 65 64 20  ster table used 
10310 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 69 73  to write to this
10320 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20 20 20 20   index. */.     
10330 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
10340 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
10350 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52 2c 20  TCTRL_IMPOSTER, 
10360 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 6d 61 69 6e  p->dbMain, "main
10370 22 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20 20 20  ", 0, 1);.      
10380 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
10390 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
103a0 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52 2c 20 70  CTRL_IMPOSTER, p
103b0 2d 3e 64 62 4d 61 69 6e 2c 20 22 6d 61 69 6e 22  ->dbMain, "main"
103c0 2c 20 31 2c 74 6e 75 6d 29 3b 0a 20 20 20 20 20  , 1,tnum);.     
103d0 20 72 62 75 4d 50 72 69 6e 74 66 45 78 65 63 28   rbuMPrintfExec(
103e0 70 2c 20 70 2d 3e 64 62 4d 61 69 6e 2c 0a 20 20  p, p->dbMain,.  
103f0 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20          "CREATE 
10400 54 41 42 4c 45 20 5c 22 72 62 75 5f 69 6d 70 5f  TABLE \"rbu_imp_
10410 25 77 5c 22 28 20 25 73 2c 20 50 52 49 4d 41 52  %w\"( %s, PRIMAR
10420 59 20 4b 45 59 28 20 25 73 20 29 20 29 20 57 49  Y KEY( %s ) ) WI
10430 54 48 4f 55 54 20 52 4f 57 49 44 22 2c 0a 20 20  THOUT ROWID",.  
10440 20 20 20 20 20 20 20 20 7a 54 62 6c 2c 20 7a 49          zTbl, zI
10450 6d 70 6f 73 74 65 72 43 6f 6c 73 2c 20 7a 49 6d  mposterCols, zIm
10460 70 6f 73 74 65 72 50 4b 0a 20 20 20 20 20 20 29  posterPK.      )
10470 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
10480 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
10490 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50  ITE_TESTCTRL_IMP
104a0 4f 53 54 45 52 2c 20 70 2d 3e 64 62 4d 61 69 6e  OSTER, p->dbMain
104b0 2c 20 22 6d 61 69 6e 22 2c 20 30 2c 20 30 29 3b  , "main", 0, 0);
104c0 0a 0a 20 20 20 20 20 20 2f 2a 20 43 72 65 61 74  ..      /* Creat
104d0 65 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  e the statement 
104e0 74 6f 20 69 6e 73 65 72 74 20 69 6e 64 65 78 20  to insert index 
104f0 65 6e 74 72 69 65 73 20 2a 2f 0a 20 20 20 20 20  entries */.     
10500 20 70 49 74 65 72 2d 3e 6e 43 6f 6c 20 3d 20 6e   pIter->nCol = n
10510 42 69 6e 64 3b 0a 20 20 20 20 20 20 69 66 28 20  Bind;.      if( 
10520 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
10530 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72   ){.        p->r
10540 63 20 3d 20 70 72 65 70 61 72 65 46 72 65 65 41  c = prepareFreeA
10550 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 0a  ndCollectError(.
10560 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 64              p->d
10570 62 4d 61 69 6e 2c 20 26 70 49 74 65 72 2d 3e 70  bMain, &pIter->p
10580 49 6e 73 65 72 74 2c 20 26 70 2d 3e 7a 45 72 72  Insert, &p->zErr
10590 6d 73 67 2c 0a 20 20 20 20 20 20 20 20 20 20 73  msg,.          s
105a0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
105b0 49 4e 53 45 52 54 20 49 4e 54 4f 20 5c 22 72 62  INSERT INTO \"rb
105c0 75 5f 69 6d 70 5f 25 77 5c 22 20 56 41 4c 55 45  u_imp_%w\" VALUE
105d0 53 28 25 73 29 22 2c 20 7a 54 62 6c 2c 20 7a 42  S(%s)", zTbl, zB
105e0 69 6e 64 29 0a 20 20 20 20 20 20 20 20 29 3b 0a  ind).        );.
105f0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
10600 2a 20 41 6e 64 20 74 6f 20 64 65 6c 65 74 65 20  * And to delete 
10610 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20 2a 2f  index entries */
10620 0a 20 20 20 20 20 20 69 66 28 20 72 62 75 49 73  .      if( rbuIs
10630 56 61 63 75 75 6d 28 70 29 3d 3d 30 20 26 26 20  Vacuum(p)==0 && 
10640 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
10650 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72   ){.        p->r
10660 63 20 3d 20 70 72 65 70 61 72 65 46 72 65 65 41  c = prepareFreeA
10670 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 0a  ndCollectError(.
10680 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 64              p->d
10690 62 4d 61 69 6e 2c 20 26 70 49 74 65 72 2d 3e 70  bMain, &pIter->p
106a0 44 65 6c 65 74 65 2c 20 26 70 2d 3e 7a 45 72 72  Delete, &p->zErr
106b0 6d 73 67 2c 0a 20 20 20 20 20 20 20 20 20 20 73  msg,.          s
106c0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
106d0 44 45 4c 45 54 45 20 46 52 4f 4d 20 5c 22 72 62  DELETE FROM \"rb
106e0 75 5f 69 6d 70 5f 25 77 5c 22 20 57 48 45 52 45  u_imp_%w\" WHERE
106f0 20 25 73 22 2c 20 7a 54 62 6c 2c 20 7a 57 68 65   %s", zTbl, zWhe
10700 72 65 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  re).        );. 
10710 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
10720 20 43 72 65 61 74 65 20 74 68 65 20 53 45 4c 45   Create the SELE
10730 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20  CT statement to 
10740 72 65 61 64 20 6b 65 79 73 20 69 6e 20 73 6f 72  read keys in sor
10750 74 65 64 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20  ted order */.   
10760 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
10770 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
10780 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20     char *zSql;. 
10790 20 20 20 20 20 20 20 69 66 28 20 72 62 75 49 73         if( rbuIs
107a0 56 61 63 75 75 6d 28 70 29 20 29 7b 0a 20 20 20  Vacuum(p) ){.   
107b0 20 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73 71         zSql = sq
107c0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20  lite3_mprintf(. 
107d0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 53 45               "SE
107e0 4c 45 43 54 20 25 73 2c 20 30 20 41 53 20 72 62  LECT %s, 0 AS rb
107f0 75 5f 63 6f 6e 74 72 6f 6c 20 46 52 4f 4d 20 27  u_control FROM '
10800 25 71 27 20 4f 52 44 45 52 20 42 59 20 25 73 25  %q' ORDER BY %s%
10810 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s",.            
10820 20 20 7a 43 6f 6c 6c 69 73 74 2c 20 0a 20 20 20    zCollist, .   
10830 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72             pIter
10840 2d 3e 7a 44 61 74 61 54 62 6c 2c 0a 20 20 20 20  ->zDataTbl,.    
10850 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 6c 69            zColli
10860 73 74 2c 20 7a 4c 69 6d 69 74 0a 20 20 20 20 20  st, zLimit.     
10870 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
10880 7d 65 6c 73 65 0a 0a 20 20 20 20 20 20 20 20 69  }else..        i
10890 66 28 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d  f( pIter->eType=
108a0 3d 52 42 55 5f 50 4b 5f 45 58 54 45 52 4e 41 4c  =RBU_PK_EXTERNAL
108b0 20 7c 7c 20 70 49 74 65 72 2d 3e 65 54 79 70 65   || pIter->eType
108c0 3d 3d 52 42 55 5f 50 4b 5f 4e 4f 4e 45 20 29 7b  ==RBU_PK_NONE ){
108d0 0a 20 20 20 20 20 20 20 20 20 20 7a 53 71 6c 20  .          zSql 
108e0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
108f0 66 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  f(.             
10900 20 22 53 45 4c 45 43 54 20 25 73 2c 20 72 62 75   "SELECT %s, rbu
10910 5f 63 6f 6e 74 72 6f 6c 20 46 52 4f 4d 20 25 73  _control FROM %s
10920 2e 27 72 62 75 5f 74 6d 70 5f 25 71 27 20 4f 52  .'rbu_tmp_%q' OR
10930 44 45 52 20 42 59 20 25 73 25 73 22 2c 0a 20 20  DER BY %s%s",.  
10940 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c              zCol
10950 6c 69 73 74 2c 20 70 2d 3e 7a 53 74 61 74 65 44  list, p->zStateD
10960 62 2c 20 70 49 74 65 72 2d 3e 7a 44 61 74 61 54  b, pIter->zDataT
10970 62 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  bl,.            
10980 20 20 7a 43 6f 6c 6c 69 73 74 2c 20 7a 4c 69 6d    zCollist, zLim
10990 69 74 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a  it.          );.
109a0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
109b0 20 20 20 20 20 20 20 20 20 7a 53 71 6c 20 3d 20           zSql = 
109c0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
109d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
109e0 53 45 4c 45 43 54 20 25 73 2c 20 72 62 75 5f 63  SELECT %s, rbu_c
109f0 6f 6e 74 72 6f 6c 20 46 52 4f 4d 20 25 73 2e 27  ontrol FROM %s.'
10a00 72 62 75 5f 74 6d 70 5f 25 71 27 20 22 0a 20 20  rbu_tmp_%q' ".  
10a10 20 20 20 20 20 20 20 20 20 20 20 20 22 55 4e 49              "UNI
10a20 4f 4e 20 41 4c 4c 20 22 0a 20 20 20 20 20 20 20  ON ALL ".       
10a30 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 25         "SELECT %
10a40 73 2c 20 72 62 75 5f 63 6f 6e 74 72 6f 6c 20 46  s, rbu_control F
10a50 52 4f 4d 20 27 25 71 27 20 22 0a 20 20 20 20 20  ROM '%q' ".     
10a60 20 20 20 20 20 20 20 20 20 22 57 48 45 52 45 20           "WHERE 
10a70 74 79 70 65 6f 66 28 72 62 75 5f 63 6f 6e 74 72  typeof(rbu_contr
10a80 6f 6c 29 3d 27 69 6e 74 65 67 65 72 27 20 41 4e  ol)='integer' AN
10a90 44 20 72 62 75 5f 63 6f 6e 74 72 6f 6c 21 3d 31  D rbu_control!=1
10aa0 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ".             
10ab0 20 22 4f 52 44 45 52 20 42 59 20 25 73 25 73 22   "ORDER BY %s%s"
10ac0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
10ad0 7a 43 6f 6c 6c 69 73 74 2c 20 70 2d 3e 7a 53 74  zCollist, p->zSt
10ae0 61 74 65 44 62 2c 20 70 49 74 65 72 2d 3e 7a 44  ateDb, pIter->zD
10af0 61 74 61 54 62 6c 2c 20 0a 20 20 20 20 20 20 20  ataTbl, .       
10b00 20 20 20 20 20 20 20 7a 43 6f 6c 6c 69 73 74 2c         zCollist,
10b10 20 70 49 74 65 72 2d 3e 7a 44 61 74 61 54 62 6c   pIter->zDataTbl
10b20 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
10b30 20 7a 43 6f 6c 6c 69 73 74 2c 20 7a 4c 69 6d 69   zCollist, zLimi
10b40 74 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20  t.          );. 
10b50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
10b60 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65   p->rc = prepare
10b70 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72  FreeAndCollectEr
10b80 72 6f 72 28 70 2d 3e 64 62 52 62 75 2c 20 26 70  ror(p->dbRbu, &p
10b90 49 74 65 72 2d 3e 70 53 65 6c 65 63 74 2c 20 70  Iter->pSelect, p
10ba0 7a 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20  z, zSql);.      
10bb0 7d 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  }..      sqlite3
10bc0 5f 66 72 65 65 28 7a 49 6d 70 6f 73 74 65 72 43  _free(zImposterC
10bd0 6f 6c 73 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ols);.      sqli
10be0 74 65 33 5f 66 72 65 65 28 7a 49 6d 70 6f 73 74  te3_free(zImpost
10bf0 65 72 50 4b 29 3b 0a 20 20 20 20 20 20 73 71 6c  erPK);.      sql
10c00 69 74 65 33 5f 66 72 65 65 28 7a 57 68 65 72 65  ite3_free(zWhere
10c10 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10c20 5f 66 72 65 65 28 7a 42 69 6e 64 29 3b 0a 20 20  _free(zBind);.  
10c30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
10c40 6e 74 20 62 52 62 75 52 6f 77 69 64 20 3d 20 28  nt bRbuRowid = (
10c50 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42  pIter->eType==RB
10c60 55 5f 50 4b 5f 56 54 41 42 29 0a 20 20 20 20 20  U_PK_VTAB).     
10c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
10c80 7c 28 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d  |(pIter->eType==
10c90 52 42 55 5f 50 4b 5f 4e 4f 4e 45 29 0a 20 20 20  RBU_PK_NONE).   
10ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10cb0 20 7c 7c 28 70 49 74 65 72 2d 3e 65 54 79 70 65   ||(pIter->eType
10cc0 3d 3d 52 42 55 5f 50 4b 5f 45 58 54 45 52 4e 41  ==RBU_PK_EXTERNA
10cd0 4c 20 26 26 20 72 62 75 49 73 56 61 63 75 75 6d  L && rbuIsVacuum
10ce0 28 70 29 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73  (p));.      cons
10cf0 74 20 63 68 61 72 20 2a 7a 54 62 6c 20 3d 20 70  t char *zTbl = p
10d00 49 74 65 72 2d 3e 7a 54 62 6c 3b 20 20 20 20 20  Iter->zTbl;     
10d10 20 20 2f 2a 20 54 61 62 6c 65 20 74 68 69 73 20    /* Table this 
10d20 73 74 65 70 20 61 70 70 6c 69 65 73 20 74 6f 20  step applies to 
10d30 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  */.      const c
10d40 68 61 72 20 2a 7a 57 72 69 74 65 3b 20 20 20 20  har *zWrite;    
10d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10d60 2a 20 49 6d 70 6f 73 74 65 72 20 74 61 62 6c 65  * Imposter table
10d70 20 6e 61 6d 65 20 2a 2f 0a 0a 20 20 20 20 20 20   name */..      
10d80 63 68 61 72 20 2a 7a 42 69 6e 64 69 6e 67 73 20  char *zBindings 
10d90 3d 20 72 62 75 4f 62 6a 49 74 65 72 47 65 74 42  = rbuObjIterGetB
10da0 69 6e 64 6c 69 73 74 28 70 2c 20 70 49 74 65 72  indlist(p, pIter
10db0 2d 3e 6e 54 62 6c 43 6f 6c 20 2b 20 62 52 62 75  ->nTblCol + bRbu
10dc0 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 63 68  Rowid);.      ch
10dd0 61 72 20 2a 7a 57 68 65 72 65 20 3d 20 72 62 75  ar *zWhere = rbu
10de0 4f 62 6a 49 74 65 72 47 65 74 57 68 65 72 65 28  ObjIterGetWhere(
10df0 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20  p, pIter);.     
10e00 20 63 68 61 72 20 2a 7a 4f 6c 64 6c 69 73 74 20   char *zOldlist 
10e10 3d 20 72 62 75 4f 62 6a 49 74 65 72 47 65 74 4f  = rbuObjIterGetO
10e20 6c 64 6c 69 73 74 28 70 2c 20 70 49 74 65 72 2c  ldlist(p, pIter,
10e30 20 22 6f 6c 64 22 29 3b 0a 20 20 20 20 20 20 63   "old");.      c
10e40 68 61 72 20 2a 7a 4e 65 77 6c 69 73 74 20 3d 20  har *zNewlist = 
10e50 72 62 75 4f 62 6a 49 74 65 72 47 65 74 4f 6c 64  rbuObjIterGetOld
10e60 6c 69 73 74 28 70 2c 20 70 49 74 65 72 2c 20 22  list(p, pIter, "
10e70 6e 65 77 22 29 3b 0a 0a 20 20 20 20 20 20 7a 43  new");..      zC
10e80 6f 6c 6c 69 73 74 20 3d 20 72 62 75 4f 62 6a 49  ollist = rbuObjI
10e90 74 65 72 47 65 74 43 6f 6c 6c 69 73 74 28 70 2c  terGetCollist(p,
10ea0 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 70   pIter);.      p
10eb0 49 74 65 72 2d 3e 6e 43 6f 6c 20 3d 20 70 49 74  Iter->nCol = pIt
10ec0 65 72 2d 3e 6e 54 62 6c 43 6f 6c 3b 0a 0a 20 20  er->nTblCol;..  
10ed0 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68      /* Create th
10ee0 65 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65  e imposter table
10ef0 20 6f 72 20 74 61 62 6c 65 73 20 28 69 66 20 72   or tables (if r
10f00 65 71 75 69 72 65 64 29 2e 20 2a 2f 0a 20 20 20  equired). */.   
10f10 20 20 20 72 62 75 43 72 65 61 74 65 49 6d 70 6f     rbuCreateImpo
10f20 73 74 65 72 54 61 62 6c 65 28 70 2c 20 70 49 74  sterTable(p, pIt
10f30 65 72 29 3b 0a 20 20 20 20 20 20 72 62 75 43 72  er);.      rbuCr
10f40 65 61 74 65 49 6d 70 6f 73 74 65 72 54 61 62 6c  eateImposterTabl
10f50 65 32 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  e2(p, pIter);.  
10f60 20 20 20 20 7a 57 72 69 74 65 20 3d 20 28 70 49      zWrite = (pI
10f70 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f  ter->eType==RBU_
10f80 50 4b 5f 56 54 41 42 20 3f 20 22 22 20 3a 20 22  PK_VTAB ? "" : "
10f90 72 62 75 5f 69 6d 70 5f 22 29 3b 0a 0a 20 20 20  rbu_imp_");..   
10fa0 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65     /* Create the
10fb0 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65 6e   INSERT statemen
10fc0 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68  t to write to th
10fd0 65 20 74 61 72 67 65 74 20 50 4b 20 62 2d 74 72  e target PK b-tr
10fe0 65 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ee */.      if( 
10ff0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
11000 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72   ){.        p->r
11010 63 20 3d 20 70 72 65 70 61 72 65 46 72 65 65 41  c = prepareFreeA
11020 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70  ndCollectError(p
11030 2d 3e 64 62 4d 61 69 6e 2c 20 26 70 49 74 65 72  ->dbMain, &pIter
11040 2d 3e 70 49 6e 73 65 72 74 2c 20 70 7a 2c 0a 20  ->pInsert, pz,. 
11050 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
11060 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20  e3_mprintf(.    
11070 20 20 20 20 20 20 20 20 20 20 22 49 4e 53 45 52            "INSER
11080 54 20 49 4e 54 4f 20 5c 22 25 73 25 77 5c 22 28  T INTO \"%s%w\"(
11090 25 73 25 73 29 20 56 41 4c 55 45 53 28 25 73 29  %s%s) VALUES(%s)
110a0 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ", .            
110b0 20 20 7a 57 72 69 74 65 2c 20 7a 54 62 6c 2c 20    zWrite, zTbl, 
110c0 7a 43 6f 6c 6c 69 73 74 2c 20 28 62 52 62 75 52  zCollist, (bRbuR
110d0 6f 77 69 64 20 3f 20 22 2c 20 5f 72 6f 77 69 64  owid ? ", _rowid
110e0 5f 22 20 3a 20 22 22 29 2c 20 7a 42 69 6e 64 69  _" : ""), zBindi
110f0 6e 67 73 0a 20 20 20 20 20 20 20 20 20 20 20 20  ngs.            
11100 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  ).        );.   
11110 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43     }..      /* C
11120 72 65 61 74 65 20 74 68 65 20 44 45 4c 45 54 45  reate the DELETE
11130 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 77 72   statement to wr
11140 69 74 65 20 74 6f 20 74 68 65 20 74 61 72 67 65  ite to the targe
11150 74 20 50 4b 20 62 2d 74 72 65 65 2e 0a 20 20 20  t PK b-tree..   
11160 20 20 20 2a 2a 20 42 65 63 61 75 73 65 20 69 74     ** Because it
11170 20 6f 6e 6c 79 20 70 65 72 66 6f 72 6d 73 20 49   only performs I
11180 4e 53 45 52 54 20 6f 70 65 72 61 74 69 6f 6e 73  NSERT operations
11190 2c 20 74 68 69 73 20 69 73 20 6e 6f 74 20 72 65  , this is not re
111a0 71 75 69 72 65 64 20 66 6f 72 0a 20 20 20 20 20  quired for.     
111b0 20 2a 2a 20 61 6e 20 72 62 75 20 76 61 63 75 75   ** an rbu vacuu
111c0 6d 20 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20  m handle.  */.  
111d0 20 20 20 20 69 66 28 20 72 62 75 49 73 56 61 63      if( rbuIsVac
111e0 75 75 6d 28 70 29 3d 3d 30 20 26 26 20 70 2d 3e  uum(p)==0 && p->
111f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
11200 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  .        p->rc =
11210 20 70 72 65 70 61 72 65 46 72 65 65 41 6e 64 43   prepareFreeAndC
11220 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64  ollectError(p->d
11230 62 4d 61 69 6e 2c 20 26 70 49 74 65 72 2d 3e 70  bMain, &pIter->p
11240 44 65 6c 65 74 65 2c 20 70 7a 2c 0a 20 20 20 20  Delete, pz,.    
11250 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
11260 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20  mprintf(.       
11270 20 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46         "DELETE F
11280 52 4f 4d 20 5c 22 25 73 25 77 5c 22 20 57 48 45  ROM \"%s%w\" WHE
11290 52 45 20 25 73 22 2c 20 7a 57 72 69 74 65 2c 20  RE %s", zWrite, 
112a0 7a 54 62 6c 2c 20 7a 57 68 65 72 65 0a 20 20 20  zTbl, zWhere.   
112b0 20 20 20 20 20 20 20 20 20 29 0a 20 20 20 20 20           ).     
112c0 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20     );.      }.. 
112d0 20 20 20 20 20 69 66 28 20 72 62 75 49 73 56 61       if( rbuIsVa
112e0 63 75 75 6d 28 70 29 3d 3d 30 20 26 26 20 70 49  cuum(p)==0 && pI
112f0 74 65 72 2d 3e 61 62 49 6e 64 65 78 65 64 20 29  ter->abIndexed )
11300 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
11310 63 68 61 72 20 2a 7a 52 62 75 52 6f 77 69 64 20  char *zRbuRowid 
11320 3d 20 22 22 3b 0a 20 20 20 20 20 20 20 20 69 66  = "";.        if
11330 28 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d  ( pIter->eType==
11340 52 42 55 5f 50 4b 5f 45 58 54 45 52 4e 41 4c 20  RBU_PK_EXTERNAL 
11350 7c 7c 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d  || pIter->eType=
11360 3d 52 42 55 5f 50 4b 5f 4e 4f 4e 45 20 29 7b 0a  =RBU_PK_NONE ){.
11370 20 20 20 20 20 20 20 20 20 20 7a 52 62 75 52 6f            zRbuRo
11380 77 69 64 20 3d 20 22 2c 20 72 62 75 5f 72 6f 77  wid = ", rbu_row
11390 69 64 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  id";.        }..
113a0 20 20 20 20 20 20 20 20 2f 2a 20 43 72 65 61 74          /* Creat
113b0 65 20 74 68 65 20 72 62 75 5f 74 6d 70 5f 78 78  e the rbu_tmp_xx
113c0 78 20 74 61 62 6c 65 20 61 6e 64 20 74 68 65 20  x table and the 
113d0 74 72 69 67 67 65 72 73 20 74 6f 20 70 6f 70 75  triggers to popu
113e0 6c 61 74 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20  late it. */.    
113f0 20 20 20 20 72 62 75 4d 50 72 69 6e 74 66 45 78      rbuMPrintfEx
11400 65 63 28 70 2c 20 70 2d 3e 64 62 52 62 75 2c 0a  ec(p, p->dbRbu,.
11410 20 20 20 20 20 20 20 20 20 20 20 20 22 43 52 45              "CRE
11420 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54  ATE TABLE IF NOT
11430 20 45 58 49 53 54 53 20 25 73 2e 27 72 62 75 5f   EXISTS %s.'rbu_
11440 74 6d 70 5f 25 71 27 20 41 53 20 22 0a 20 20 20  tmp_%q' AS ".   
11450 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54           "SELECT
11460 20 2a 25 73 20 46 52 4f 4d 20 27 25 71 27 20 57   *%s FROM '%q' W
11470 48 45 52 45 20 30 3b 22 0a 20 20 20 20 20 20 20  HERE 0;".       
11480 20 20 20 20 20 2c 20 70 2d 3e 7a 53 74 61 74 65       , p->zState
11490 44 62 2c 20 70 49 74 65 72 2d 3e 7a 44 61 74 61  Db, pIter->zData
114a0 54 62 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20  Tbl.            
114b0 2c 20 28 70 49 74 65 72 2d 3e 65 54 79 70 65 3d  , (pIter->eType=
114c0 3d 52 42 55 5f 50 4b 5f 45 58 54 45 52 4e 41 4c  =RBU_PK_EXTERNAL
114d0 20 3f 20 22 2c 20 30 20 41 53 20 72 62 75 5f 72   ? ", 0 AS rbu_r
114e0 6f 77 69 64 22 20 3a 20 22 22 29 0a 20 20 20 20  owid" : "").    
114f0 20 20 20 20 20 20 20 20 2c 20 70 49 74 65 72 2d          , pIter-
11500 3e 7a 44 61 74 61 54 62 6c 0a 20 20 20 20 20 20  >zDataTbl.      
11510 20 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 72 62    );..        rb
11520 75 4d 50 72 69 6e 74 66 45 78 65 63 28 70 2c 20  uMPrintfExec(p, 
11530 70 2d 3e 64 62 4d 61 69 6e 2c 0a 20 20 20 20 20  p->dbMain,.     
11540 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20 54         "CREATE T
11550 45 4d 50 20 54 52 49 47 47 45 52 20 72 62 75 5f  EMP TRIGGER rbu_
11560 64 65 6c 65 74 65 5f 74 72 20 42 45 46 4f 52 45  delete_tr BEFORE
11570 20 44 45 4c 45 54 45 20 4f 4e 20 5c 22 25 73 25   DELETE ON \"%s%
11580 77 5c 22 20 22 0a 20 20 20 20 20 20 20 20 20 20  w\" ".          
11590 20 20 22 42 45 47 49 4e 20 22 0a 20 20 20 20 20    "BEGIN ".     
115a0 20 20 20 20 20 20 20 22 20 20 53 45 4c 45 43 54         "  SELECT
115b0 20 72 62 75 5f 74 6d 70 5f 69 6e 73 65 72 74 28   rbu_tmp_insert(
115c0 33 2c 20 25 73 29 3b 22 0a 20 20 20 20 20 20 20  3, %s);".       
115d0 20 20 20 20 20 22 45 4e 44 3b 22 0a 0a 20 20 20       "END;"..   
115e0 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45           "CREATE
115f0 20 54 45 4d 50 20 54 52 49 47 47 45 52 20 72 62   TEMP TRIGGER rb
11600 75 5f 75 70 64 61 74 65 31 5f 74 72 20 42 45 46  u_update1_tr BEF
11610 4f 52 45 20 55 50 44 41 54 45 20 4f 4e 20 5c 22  ORE UPDATE ON \"
11620 25 73 25 77 5c 22 20 22 0a 20 20 20 20 20 20 20  %s%w\" ".       
11630 20 20 20 20 20 22 42 45 47 49 4e 20 22 0a 20 20       "BEGIN ".  
11640 20 20 20 20 20 20 20 20 20 20 22 20 20 53 45 4c            "  SEL
11650 45 43 54 20 72 62 75 5f 74 6d 70 5f 69 6e 73 65  ECT rbu_tmp_inse
11660 72 74 28 33 2c 20 25 73 29 3b 22 0a 20 20 20 20  rt(3, %s);".    
11670 20 20 20 20 20 20 20 20 22 45 4e 44 3b 22 0a 0a          "END;"..
11680 20 20 20 20 20 20 20 20 20 20 20 20 22 43 52 45              "CRE
11690 41 54 45 20 54 45 4d 50 20 54 52 49 47 47 45 52  ATE TEMP TRIGGER
116a0 20 72 62 75 5f 75 70 64 61 74 65 32 5f 74 72 20   rbu_update2_tr 
116b0 41 46 54 45 52 20 55 50 44 41 54 45 20 4f 4e 20  AFTER UPDATE ON 
116c0 5c 22 25 73 25 77 5c 22 20 22 0a 20 20 20 20 20  \"%s%w\" ".     
116d0 20 20 20 20 20 20 20 22 42 45 47 49 4e 20 22 0a         "BEGIN ".
116e0 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20 53              "  S
116f0 45 4c 45 43 54 20 72 62 75 5f 74 6d 70 5f 69 6e  ELECT rbu_tmp_in
11700 73 65 72 74 28 34 2c 20 25 73 29 3b 22 0a 20 20  sert(4, %s);".  
11710 20 20 20 20 20 20 20 20 20 20 22 45 4e 44 3b 22            "END;"
11720 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 57  ,.            zW
11730 72 69 74 65 2c 20 7a 54 62 6c 2c 20 7a 4f 6c 64  rite, zTbl, zOld
11740 6c 69 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20  list,.          
11750 20 20 7a 57 72 69 74 65 2c 20 7a 54 62 6c 2c 20    zWrite, zTbl, 
11760 7a 4f 6c 64 6c 69 73 74 2c 0a 20 20 20 20 20 20  zOldlist,.      
11770 20 20 20 20 20 20 7a 57 72 69 74 65 2c 20 7a 54        zWrite, zT
11780 62 6c 2c 20 7a 4e 65 77 6c 69 73 74 0a 20 20 20  bl, zNewlist.   
11790 20 20 20 20 20 29 3b 0a 0a 20 20 20 20 20 20 20       );..       
117a0 20 69 66 28 20 70 49 74 65 72 2d 3e 65 54 79 70   if( pIter->eTyp
117b0 65 3d 3d 52 42 55 5f 50 4b 5f 45 58 54 45 52 4e  e==RBU_PK_EXTERN
117c0 41 4c 20 7c 7c 20 70 49 74 65 72 2d 3e 65 54 79  AL || pIter->eTy
117d0 70 65 3d 3d 52 42 55 5f 50 4b 5f 4e 4f 4e 45 20  pe==RBU_PK_NONE 
117e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 62 75  ){.          rbu
117f0 4d 50 72 69 6e 74 66 45 78 65 63 28 70 2c 20 70  MPrintfExec(p, p
11800 2d 3e 64 62 4d 61 69 6e 2c 0a 20 20 20 20 20 20  ->dbMain,.      
11810 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20          "CREATE 
11820 54 45 4d 50 20 54 52 49 47 47 45 52 20 72 62 75  TEMP TRIGGER rbu
11830 5f 69 6e 73 65 72 74 5f 74 72 20 41 46 54 45 52  _insert_tr AFTER
11840 20 49 4e 53 45 52 54 20 4f 4e 20 5c 22 25 73 25   INSERT ON \"%s%
11850 77 5c 22 20 22 0a 20 20 20 20 20 20 20 20 20 20  w\" ".          
11860 20 20 20 20 22 42 45 47 49 4e 20 22 0a 20 20 20      "BEGIN ".   
11870 20 20 20 20 20 20 20 20 20 20 20 22 20 20 53 45             "  SE
11880 4c 45 43 54 20 72 62 75 5f 74 6d 70 5f 69 6e 73  LECT rbu_tmp_ins
11890 65 72 74 28 30 2c 20 25 73 29 3b 22 0a 20 20 20  ert(0, %s);".   
118a0 20 20 20 20 20 20 20 20 20 20 20 22 45 4e 44 3b             "END;
118b0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
118c0 20 7a 57 72 69 74 65 2c 20 7a 54 62 6c 2c 20 7a   zWrite, zTbl, z
118d0 4e 65 77 6c 69 73 74 0a 20 20 20 20 20 20 20 20  Newlist.        
118e0 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a    );.        }..
118f0 20 20 20 20 20 20 20 20 72 62 75 4f 62 6a 49 74          rbuObjIt
11900 65 72 50 72 65 70 61 72 65 54 6d 70 49 6e 73 65  erPrepareTmpInse
11910 72 74 28 70 2c 20 70 49 74 65 72 2c 20 7a 43 6f  rt(p, pIter, zCo
11920 6c 6c 69 73 74 2c 20 7a 52 62 75 52 6f 77 69 64  llist, zRbuRowid
11930 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
11940 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20    /* Create the 
11950 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
11960 20 74 6f 20 72 65 61 64 20 6b 65 79 73 20 66 72   to read keys fr
11970 6f 6d 20 64 61 74 61 5f 78 78 78 20 2a 2f 0a 20  om data_xxx */. 
11980 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
11990 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
119a0 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
119b0 2a 7a 52 62 75 52 6f 77 69 64 20 3d 20 22 22 3b  *zRbuRowid = "";
119c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 62 52 62  .        if( bRb
119d0 75 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20  uRowid ){.      
119e0 20 20 20 20 7a 52 62 75 52 6f 77 69 64 20 3d 20      zRbuRowid = 
119f0 72 62 75 49 73 56 61 63 75 75 6d 28 70 29 20 3f  rbuIsVacuum(p) ?
11a00 20 22 2c 5f 72 6f 77 69 64 5f 20 22 20 3a 20 22   ",_rowid_ " : "
11a10 2c 72 62 75 5f 72 6f 77 69 64 22 3b 0a 20 20 20  ,rbu_rowid";.   
11a20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
11a30 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65 46 72  ->rc = prepareFr
11a40 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f  eeAndCollectErro
11a50 72 28 70 2d 3e 64 62 52 62 75 2c 20 26 70 49 74  r(p->dbRbu, &pIt
11a60 65 72 2d 3e 70 53 65 6c 65 63 74 2c 20 70 7a 2c  er->pSelect, pz,
11a70 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
11a80 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20  ite3_mprintf(.  
11a90 20 20 20 20 20 20 20 20 20 20 20 20 22 53 45 4c              "SEL
11aa0 45 43 54 20 25 73 2c 25 73 20 72 62 75 5f 63 6f  ECT %s,%s rbu_co
11ab0 6e 74 72 6f 6c 25 73 20 46 52 4f 4d 20 27 25 71  ntrol%s FROM '%q
11ac0 27 25 73 22 2c 20 0a 20 20 20 20 20 20 20 20 20  '%s", .         
11ad0 20 20 20 20 20 7a 43 6f 6c 6c 69 73 74 2c 20 0a       zCollist, .
11ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 72                (r
11af0 62 75 49 73 56 61 63 75 75 6d 28 70 29 20 3f 20  buIsVacuum(p) ? 
11b00 22 30 20 41 53 20 22 20 3a 20 22 22 29 2c 0a 20  "0 AS " : ""),. 
11b10 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 52 62               zRb
11b20 75 52 6f 77 69 64 2c 0a 20 20 20 20 20 20 20 20  uRowid,.        
11b30 20 20 20 20 20 20 70 49 74 65 72 2d 3e 7a 44 61        pIter->zDa
11b40 74 61 54 62 6c 2c 20 7a 4c 69 6d 69 74 0a 20 20  taTbl, zLimit.  
11b50 20 20 20 20 20 20 20 20 20 20 29 0a 20 20 20 20            ).    
11b60 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a      );.      }..
11b70 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
11b80 65 65 28 7a 57 68 65 72 65 29 3b 0a 20 20 20 20  ee(zWhere);.    
11b90 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
11ba0 4f 6c 64 6c 69 73 74 29 3b 0a 20 20 20 20 20 20  Oldlist);.      
11bb0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e 65  sqlite3_free(zNe
11bc0 77 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 73 71  wlist);.      sq
11bd0 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 69 6e 64  lite3_free(zBind
11be0 69 6e 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ings);.    }.   
11bf0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
11c00 6f 6c 6c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c  ollist);.    sql
11c10 69 74 65 33 5f 66 72 65 65 28 7a 4c 69 6d 69 74  ite3_free(zLimit
11c20 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 72 65 74 75  );.  }.  .  retu
11c30 72 6e 20 70 2d 3e 72 63 3b 0a 7d 0a 0a 2f 2a 0a  rn p->rc;.}../*.
11c40 2a 2a 20 53 65 74 20 6f 75 74 70 75 74 20 76 61  ** Set output va
11c50 72 69 61 62 6c 65 20 2a 70 70 53 74 6d 74 20 74  riable *ppStmt t
11c60 6f 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 55 50  o point to an UP
11c70 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20 74  DATE statement t
11c80 68 61 74 20 6d 61 79 0a 2a 2a 20 62 65 20 75 73  hat may.** be us
11c90 65 64 20 74 6f 20 75 70 64 61 74 65 20 74 68 65  ed to update the
11ca0 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 20   imposter table 
11cb0 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 74 61 62  for the main tab
11cc0 6c 65 20 62 2d 74 72 65 65 20 6f 66 20 74 68 65  le b-tree of the
11cd0 0a 2a 2a 20 74 61 62 6c 65 20 6f 62 6a 65 63 74  .** table object
11ce0 20 74 68 61 74 20 70 49 74 65 72 20 63 75 72 72   that pIter curr
11cf0 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2c  ently points to,
11d00 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20 74   assuming that t
11d10 68 65 20 0a 2a 2a 20 72 62 75 5f 63 6f 6e 74 72  he .** rbu_contr
11d20 6f 6c 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  ol column of the
11d30 20 64 61 74 61 5f 78 79 7a 20 74 61 62 6c 65 20   data_xyz table 
11d40 63 6f 6e 74 61 69 6e 73 20 7a 4d 61 73 6b 2e 0a  contains zMask..
11d50 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 7a 4d  ** .** If the zM
11d60 61 73 6b 20 73 74 72 69 6e 67 20 64 6f 65 73 20  ask string does 
11d70 6e 6f 74 20 73 70 65 63 69 66 79 20 61 6e 79 20  not specify any 
11d80 63 6f 6c 75 6d 6e 73 20 74 6f 20 75 70 64 61 74  columns to updat
11d90 65 2c 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20  e, then this.** 
11da0 69 73 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72 2e  is not an error.
11db0 20 4f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65   Output variable
11dc0 20 2a 70 70 53 74 6d 74 20 69 73 20 73 65 74 20   *ppStmt is set 
11dd0 74 6f 20 4e 55 4c 4c 20 69 6e 20 74 68 69 73 20  to NULL in this 
11de0 63 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  case..*/.static 
11df0 69 6e 74 20 72 62 75 47 65 74 55 70 64 61 74 65  int rbuGetUpdate
11e00 53 74 6d 74 28 0a 20 20 73 71 6c 69 74 65 33 72  Stmt(.  sqlite3r
11e10 62 75 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  bu *p,          
11e20 20 20 20 20 20 20 20 20 2f 2a 20 52 42 55 20 68          /* RBU h
11e30 61 6e 64 6c 65 20 2a 2f 0a 20 20 52 62 75 4f 62  andle */.  RbuOb
11e40 6a 49 74 65 72 20 2a 70 49 74 65 72 2c 20 20 20  jIter *pIter,   
11e50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62             /* Ob
11e60 6a 65 63 74 20 69 74 65 72 61 74 6f 72 20 2a 2f  ject iterator */
11e70 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
11e80 4d 61 73 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Mask,           
11e90 20 20 20 2f 2a 20 72 62 75 5f 63 6f 6e 74 72 6f     /* rbu_contro
11ea0 6c 20 76 61 6c 75 65 20 28 27 78 2e 78 2e 27 29  l value ('x.x.')
11eb0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
11ec0 6d 74 20 2a 2a 70 70 53 74 6d 74 20 20 20 20 20  mt **ppStmt     
11ed0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 55 50        /* OUT: UP
11ee0 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20 68  DATE statement h
11ef0 61 6e 64 6c 65 20 2a 2f 0a 29 7b 0a 20 20 52 62  andle */.){.  Rb
11f00 75 55 70 64 61 74 65 53 74 6d 74 20 2a 2a 70 70  uUpdateStmt **pp
11f10 3b 0a 20 20 52 62 75 55 70 64 61 74 65 53 74 6d  ;.  RbuUpdateStm
11f20 74 20 2a 70 55 70 20 3d 20 30 3b 0a 20 20 69 6e  t *pUp = 0;.  in
11f30 74 20 6e 55 70 20 3d 20 30 3b 0a 0a 20 20 2f 2a  t nUp = 0;..  /*
11f40 20 49 6e 20 63 61 73 65 20 61 6e 20 65 72 72 6f   In case an erro
11f50 72 20 6f 63 63 75 72 73 20 2a 2f 0a 20 20 2a 70  r occurs */.  *p
11f60 70 53 74 6d 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a  pStmt = 0;..  /*
11f70 20 53 65 61 72 63 68 20 66 6f 72 20 61 6e 20 65   Search for an e
11f80 78 69 73 74 69 6e 67 20 73 74 61 74 65 6d 65 6e  xisting statemen
11f90 74 2e 20 49 66 20 6f 6e 65 20 69 73 20 66 6f 75  t. If one is fou
11fa0 6e 64 2c 20 73 68 69 66 74 20 69 74 20 74 6f 20  nd, shift it to 
11fb0 74 68 65 20 66 72 6f 6e 74 0a 20 20 2a 2a 20 6f  the front.  ** o
11fc0 66 20 74 68 65 20 4c 52 55 20 71 75 65 75 65 20  f the LRU queue 
11fd0 61 6e 64 20 72 65 74 75 72 6e 20 69 6d 6d 65 64  and return immed
11fe0 69 61 74 65 6c 79 2e 20 4f 74 68 65 72 77 69 73  iately. Otherwis
11ff0 65 2c 20 6c 65 61 76 65 20 6e 55 70 20 70 6f 69  e, leave nUp poi
12000 6e 74 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 74 68  nting.  ** to th
12010 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 74 61 74  e number of stat
12020 65 6d 65 6e 74 73 20 63 75 72 72 65 6e 74 6c 79  ements currently
12030 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 61 6e   in the cache an
12040 64 20 70 55 70 20 74 6f 20 74 68 65 0a 20 20 2a  d pUp to the.  *
12050 2a 20 6c 61 73 74 20 6f 62 6a 65 63 74 20 69 6e  * last object in
12060 20 74 68 65 20 6c 69 73 74 2e 20 20 2a 2f 0a 20   the list.  */. 
12070 20 66 6f 72 28 70 70 3d 26 70 49 74 65 72 2d 3e   for(pp=&pIter->
12080 70 52 62 75 55 70 64 61 74 65 3b 20 2a 70 70 3b  pRbuUpdate; *pp;
12090 20 70 70 3d 26 28 28 2a 70 70 29 2d 3e 70 4e 65   pp=&((*pp)->pNe
120a0 78 74 29 29 7b 0a 20 20 20 20 70 55 70 20 3d 20  xt)){.    pUp = 
120b0 2a 70 70 3b 0a 20 20 20 20 69 66 28 20 73 74 72  *pp;.    if( str
120c0 63 6d 70 28 70 55 70 2d 3e 7a 4d 61 73 6b 2c 20  cmp(pUp->zMask, 
120d0 7a 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20  zMask)==0 ){.   
120e0 20 20 20 2a 70 70 20 3d 20 70 55 70 2d 3e 70 4e     *pp = pUp->pN
120f0 65 78 74 3b 0a 20 20 20 20 20 20 70 55 70 2d 3e  ext;.      pUp->
12100 70 4e 65 78 74 20 3d 20 70 49 74 65 72 2d 3e 70  pNext = pIter->p
12110 52 62 75 55 70 64 61 74 65 3b 0a 20 20 20 20 20  RbuUpdate;.     
12120 20 70 49 74 65 72 2d 3e 70 52 62 75 55 70 64 61   pIter->pRbuUpda
12130 74 65 20 3d 20 70 55 70 3b 0a 20 20 20 20 20 20  te = pUp;.      
12140 2a 70 70 53 74 6d 74 20 3d 20 70 55 70 2d 3e 70  *ppStmt = pUp->p
12150 55 70 64 61 74 65 3b 20 0a 20 20 20 20 20 20 72  Update; .      r
12160 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
12170 0a 20 20 20 20 7d 0a 20 20 20 20 6e 55 70 2b 2b  .    }.    nUp++
12180 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
12190 70 55 70 3d 3d 30 20 7c 7c 20 70 55 70 2d 3e 70  pUp==0 || pUp->p
121a0 4e 65 78 74 3d 3d 30 20 29 3b 0a 0a 20 20 69 66  Next==0 );..  if
121b0 28 20 6e 55 70 3e 3d 53 51 4c 49 54 45 5f 52 42  ( nUp>=SQLITE_RB
121c0 55 5f 55 50 44 41 54 45 5f 43 41 43 48 45 53 49  U_UPDATE_CACHESI
121d0 5a 45 20 29 7b 0a 20 20 20 20 66 6f 72 28 70 70  ZE ){.    for(pp
121e0 3d 26 70 49 74 65 72 2d 3e 70 52 62 75 55 70 64  =&pIter->pRbuUpd
121f0 61 74 65 3b 20 2a 70 70 21 3d 70 55 70 3b 20 70  ate; *pp!=pUp; p
12200 70 3d 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74  p=&((*pp)->pNext
12210 29 29 3b 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b  ));.    *pp = 0;
12220 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  .    sqlite3_fin
12230 61 6c 69 7a 65 28 70 55 70 2d 3e 70 55 70 64 61  alize(pUp->pUpda
12240 74 65 29 3b 0a 20 20 20 20 70 55 70 2d 3e 70 55  te);.    pUp->pU
12250 70 64 61 74 65 20 3d 20 30 3b 0a 20 20 7d 65 6c  pdate = 0;.  }el
12260 73 65 7b 0a 20 20 20 20 70 55 70 20 3d 20 28 52  se{.    pUp = (R
12270 62 75 55 70 64 61 74 65 53 74 6d 74 2a 29 72 62  buUpdateStmt*)rb
12280 75 4d 61 6c 6c 6f 63 28 70 2c 20 73 69 7a 65 6f  uMalloc(p, sizeo
12290 66 28 52 62 75 55 70 64 61 74 65 53 74 6d 74 29  f(RbuUpdateStmt)
122a0 2b 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 2b  +pIter->nTblCol+
122b0 31 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  1);.  }..  if( p
122c0 55 70 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  Up ){.    char *
122d0 7a 57 68 65 72 65 20 3d 20 72 62 75 4f 62 6a 49  zWhere = rbuObjI
122e0 74 65 72 47 65 74 57 68 65 72 65 28 70 2c 20 70  terGetWhere(p, p
122f0 49 74 65 72 29 3b 0a 20 20 20 20 63 68 61 72 20  Iter);.    char 
12300 2a 7a 53 65 74 20 3d 20 72 62 75 4f 62 6a 49 74  *zSet = rbuObjIt
12310 65 72 47 65 74 53 65 74 6c 69 73 74 28 70 2c 20  erGetSetlist(p, 
12320 70 49 74 65 72 2c 20 7a 4d 61 73 6b 29 3b 0a 20  pIter, zMask);. 
12330 20 20 20 63 68 61 72 20 2a 7a 55 70 64 61 74 65     char *zUpdate
12340 20 3d 20 30 3b 0a 0a 20 20 20 20 70 55 70 2d 3e   = 0;..    pUp->
12350 7a 4d 61 73 6b 20 3d 20 28 63 68 61 72 2a 29 26  zMask = (char*)&
12360 70 55 70 5b 31 5d 3b 0a 20 20 20 20 6d 65 6d 63  pUp[1];.    memc
12370 70 79 28 70 55 70 2d 3e 7a 4d 61 73 6b 2c 20 7a  py(pUp->zMask, z
12380 4d 61 73 6b 2c 20 70 49 74 65 72 2d 3e 6e 54 62  Mask, pIter->nTb
12390 6c 43 6f 6c 29 3b 0a 20 20 20 20 70 55 70 2d 3e  lCol);.    pUp->
123a0 70 4e 65 78 74 20 3d 20 70 49 74 65 72 2d 3e 70  pNext = pIter->p
123b0 52 62 75 55 70 64 61 74 65 3b 0a 20 20 20 20 70  RbuUpdate;.    p
123c0 49 74 65 72 2d 3e 70 52 62 75 55 70 64 61 74 65  Iter->pRbuUpdate
123d0 20 3d 20 70 55 70 3b 0a 0a 20 20 20 20 69 66 28   = pUp;..    if(
123e0 20 7a 53 65 74 20 29 7b 0a 20 20 20 20 20 20 63   zSet ){.      c
123f0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 72 65 66  onst char *zPref
12400 69 78 20 3d 20 22 22 3b 0a 0a 20 20 20 20 20 20  ix = "";..      
12410 69 66 28 20 70 49 74 65 72 2d 3e 65 54 79 70 65  if( pIter->eType
12420 21 3d 52 42 55 5f 50 4b 5f 56 54 41 42 20 29 20  !=RBU_PK_VTAB ) 
12430 7a 50 72 65 66 69 78 20 3d 20 22 72 62 75 5f 69  zPrefix = "rbu_i
12440 6d 70 5f 22 3b 0a 20 20 20 20 20 20 7a 55 70 64  mp_";.      zUpd
12450 61 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ate = sqlite3_mp
12460 72 69 6e 74 66 28 22 55 50 44 41 54 45 20 5c 22  rintf("UPDATE \"
12470 25 73 25 77 5c 22 20 53 45 54 20 25 73 20 57 48  %s%w\" SET %s WH
12480 45 52 45 20 25 73 22 2c 20 0a 20 20 20 20 20 20  ERE %s", .      
12490 20 20 20 20 7a 50 72 65 66 69 78 2c 20 70 49 74      zPrefix, pIt
124a0 65 72 2d 3e 7a 54 62 6c 2c 20 7a 53 65 74 2c 20  er->zTbl, zSet, 
124b0 7a 57 68 65 72 65 0a 20 20 20 20 20 20 29 3b 0a  zWhere.      );.
124c0 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 72        p->rc = pr
124d0 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c  epareFreeAndColl
124e0 65 63 74 45 72 72 6f 72 28 0a 20 20 20 20 20 20  ectError(.      
124f0 20 20 20 20 70 2d 3e 64 62 4d 61 69 6e 2c 20 26      p->dbMain, &
12500 70 55 70 2d 3e 70 55 70 64 61 74 65 2c 20 26 70  pUp->pUpdate, &p
12510 2d 3e 7a 45 72 72 6d 73 67 2c 20 7a 55 70 64 61  ->zErrmsg, zUpda
12520 74 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  te.      );.    
12530 20 20 2a 70 70 53 74 6d 74 20 3d 20 70 55 70 2d    *ppStmt = pUp-
12540 3e 70 55 70 64 61 74 65 3b 0a 20 20 20 20 7d 0a  >pUpdate;.    }.
12550 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
12560 28 7a 57 68 65 72 65 29 3b 0a 20 20 20 20 73 71  (zWhere);.    sq
12570 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 65 74 29  lite3_free(zSet)
12580 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
12590 70 2d 3e 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63  p->rc;.}..static
125a0 20 73 71 6c 69 74 65 33 20 2a 72 62 75 4f 70 65   sqlite3 *rbuOpe
125b0 6e 44 62 68 61 6e 64 6c 65 28 0a 20 20 73 71 6c  nDbhandle(.  sql
125c0 69 74 65 33 72 62 75 20 2a 70 2c 20 0a 20 20 63  ite3rbu *p, .  c
125d0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
125e0 2c 20 0a 20 20 69 6e 74 20 62 55 73 65 56 66 73  , .  int bUseVfs
125f0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
12600 62 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e  b = 0;.  if( p->
12610 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
12620 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 66  .    const int f
12630 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50  lags = SQLITE_OP
12640 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c  EN_READWRITE|SQL
12650 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c  ITE_OPEN_CREATE|
12660 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 3b  SQLITE_OPEN_URI;
12670 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c  .    p->rc = sql
12680 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 7a 4e 61  ite3_open_v2(zNa
12690 6d 65 2c 20 26 64 62 2c 20 66 6c 61 67 73 2c 20  me, &db, flags, 
126a0 62 55 73 65 56 66 73 20 3f 20 70 2d 3e 7a 56 66  bUseVfs ? p->zVf
126b0 73 4e 61 6d 65 20 3a 20 30 29 3b 0a 20 20 20 20  sName : 0);.    
126c0 69 66 28 20 70 2d 3e 72 63 20 29 7b 0a 20 20 20  if( p->rc ){.   
126d0 20 20 20 70 2d 3e 7a 45 72 72 6d 73 67 20 3d 20     p->zErrmsg = 
126e0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
126f0 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 65 72  "%s", sqlite3_er
12700 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 20 20 20  rmsg(db));.     
12710 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64   sqlite3_close(d
12720 62 29 3b 0a 20 20 20 20 20 20 64 62 20 3d 20 30  b);.      db = 0
12730 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
12740 74 75 72 6e 20 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn db;.}../*.*
12750 2a 20 46 72 65 65 20 61 6e 20 52 62 75 53 74 61  * Free an RbuSta
12760 74 65 20 6f 62 6a 65 63 74 20 61 6c 6c 6f 63 61  te object alloca
12770 74 65 64 20 62 79 20 72 62 75 4c 6f 61 64 53 74  ted by rbuLoadSt
12780 61 74 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ate()..*/.static
12790 20 76 6f 69 64 20 72 62 75 46 72 65 65 53 74 61   void rbuFreeSta
127a0 74 65 28 52 62 75 53 74 61 74 65 20 2a 70 29 7b  te(RbuState *p){
127b0 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
127c0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
127d0 7a 54 62 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74  zTbl);.    sqlit
127e0 65 33 5f 66 72 65 65 28 70 2d 3e 7a 49 64 78 29  e3_free(p->zIdx)
127f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
12800 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ee(p);.  }.}../*
12810 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 20  .** Allocate an 
12820 52 62 75 53 74 61 74 65 20 6f 62 6a 65 63 74 20  RbuState object 
12830 61 6e 64 20 6c 6f 61 64 20 74 68 65 20 63 6f 6e  and load the con
12840 74 65 6e 74 73 20 6f 66 20 74 68 65 20 72 62 75  tents of the rbu
12850 5f 73 74 61 74 65 20 0a 2a 2a 20 74 61 62 6c 65  _state .** table
12860 20 69 6e 74 6f 20 69 74 2e 20 52 65 74 75 72 6e   into it. Return
12870 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
12880 65 20 6e 65 77 20 6f 62 6a 65 63 74 2e 20 49 74  e new object. It
12890 20 69 73 20 74 68 65 20 0a 2a 2a 20 72 65 73 70   is the .** resp
128a0 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
128b0 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e  e caller to even
128c0 74 75 61 6c 6c 79 20 66 72 65 65 20 74 68 65 20  tually free the 
128d0 6f 62 6a 65 63 74 20 75 73 69 6e 67 0a 2a 2a 20  object using.** 
128e0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a  sqlite3_free()..
128f0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
12900 72 20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65 20  r occurs, leave 
12910 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e  an error code an
12920 64 20 6d 65 73 73 61 67 65 20 69 6e 20 74 68 65  d message in the
12930 20 72 62 75 20 68 61 6e 64 6c 65 0a 2a 2a 20 61   rbu handle.** a
12940 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a  nd return NULL..
12950 2a 2f 0a 73 74 61 74 69 63 20 52 62 75 53 74 61  */.static RbuSta
12960 74 65 20 2a 72 62 75 4c 6f 61 64 53 74 61 74 65  te *rbuLoadState
12970 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 29 7b  (sqlite3rbu *p){
12980 0a 20 20 52 62 75 53 74 61 74 65 20 2a 70 52 65  .  RbuState *pRe
12990 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  t = 0;.  sqlite3
129a0 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30  _stmt *pStmt = 0
129b0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  ;.  int rc;.  in
129c0 74 20 72 63 32 3b 0a 0a 20 20 70 52 65 74 20 3d  t rc2;..  pRet =
129d0 20 28 52 62 75 53 74 61 74 65 2a 29 72 62 75 4d   (RbuState*)rbuM
129e0 61 6c 6c 6f 63 28 70 2c 20 73 69 7a 65 6f 66 28  alloc(p, sizeof(
129f0 52 62 75 53 74 61 74 65 29 29 3b 0a 20 20 69 66  RbuState));.  if
12a00 28 20 70 52 65 74 3d 3d 30 20 29 20 72 65 74 75  ( pRet==0 ) retu
12a10 72 6e 20 30 3b 0a 0a 20 20 72 63 20 3d 20 70 72  rn 0;..  rc = pr
12a20 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c  epareFreeAndColl
12a30 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 52 62  ectError(p->dbRb
12a40 75 2c 20 26 70 53 74 6d 74 2c 20 26 70 2d 3e 7a  u, &pStmt, &p->z
12a50 45 72 72 6d 73 67 2c 20 0a 20 20 20 20 20 20 73  Errmsg, .      s
12a60 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
12a70 53 45 4c 45 43 54 20 6b 2c 20 76 20 46 52 4f 4d  SELECT k, v FROM
12a80 20 25 73 2e 72 62 75 5f 73 74 61 74 65 22 2c 20   %s.rbu_state", 
12a90 70 2d 3e 7a 53 74 61 74 65 44 62 29 0a 20 20 29  p->zStateDb).  )
12aa0 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53  ;.  while( rc==S
12ab0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49  QLITE_OK && SQLI
12ac0 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
12ad0 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20  step(pStmt) ){. 
12ae0 20 20 20 73 77 69 74 63 68 28 20 73 71 6c 69 74     switch( sqlit
12af0 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53  e3_column_int(pS
12b00 74 6d 74 2c 20 30 29 20 29 7b 0a 20 20 20 20 20  tmt, 0) ){.     
12b10 20 63 61 73 65 20 52 42 55 5f 53 54 41 54 45 5f   case RBU_STATE_
12b20 53 54 41 47 45 3a 0a 20 20 20 20 20 20 20 20 70  STAGE:.        p
12b30 52 65 74 2d 3e 65 53 74 61 67 65 20 3d 20 73 71  Ret->eStage = sq
12b40 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
12b50 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20  (pStmt, 1);.    
12b60 20 20 20 20 69 66 28 20 70 52 65 74 2d 3e 65 53      if( pRet->eS
12b70 74 61 67 65 21 3d 52 42 55 5f 53 54 41 47 45 5f  tage!=RBU_STAGE_
12b80 4f 41 4c 0a 20 20 20 20 20 20 20 20 20 26 26 20  OAL.         && 
12b90 70 52 65 74 2d 3e 65 53 74 61 67 65 21 3d 52 42  pRet->eStage!=RB
12ba0 55 5f 53 54 41 47 45 5f 4d 4f 56 45 0a 20 20 20  U_STAGE_MOVE.   
12bb0 20 20 20 20 20 20 26 26 20 70 52 65 74 2d 3e 65        && pRet->e
12bc0 53 74 61 67 65 21 3d 52 42 55 5f 53 54 41 47 45  Stage!=RBU_STAGE
12bd0 5f 43 4b 50 54 0a 20 20 20 20 20 20 20 20 29 7b  _CKPT.        ){
12be0 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63  .          p->rc
12bf0 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
12c00 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  T;.        }.   
12c10 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
12c20 20 20 20 63 61 73 65 20 52 42 55 5f 53 54 41 54     case RBU_STAT
12c30 45 5f 54 42 4c 3a 0a 20 20 20 20 20 20 20 20 70  E_TBL:.        p
12c40 52 65 74 2d 3e 7a 54 62 6c 20 3d 20 72 62 75 53  Ret->zTbl = rbuS
12c50 74 72 6e 64 75 70 28 28 63 68 61 72 2a 29 73 71  trndup((char*)sq
12c60 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
12c70 74 28 70 53 74 6d 74 2c 20 31 29 2c 20 26 72 63  t(pStmt, 1), &rc
12c80 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
12c90 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20 52 42  ;..      case RB
12ca0 55 5f 53 54 41 54 45 5f 49 44 58 3a 0a 20 20 20  U_STATE_IDX:.   
12cb0 20 20 20 20 20 70 52 65 74 2d 3e 7a 49 64 78 20       pRet->zIdx 
12cc0 3d 20 72 62 75 53 74 72 6e 64 75 70 28 28 63 68  = rbuStrndup((ch
12cd0 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
12ce0 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31  mn_text(pStmt, 1
12cf0 29 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20  ), &rc);.       
12d00 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 63   break;..      c
12d10 61 73 65 20 52 42 55 5f 53 54 41 54 45 5f 52 4f  ase RBU_STATE_RO
12d20 57 3a 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d  W:.        pRet-
12d30 3e 6e 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 5f  >nRow = sqlite3_
12d40 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74  column_int(pStmt
12d50 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 62 72  , 1);.        br
12d60 65 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73 65  eak;..      case
12d70 20 52 42 55 5f 53 54 41 54 45 5f 50 52 4f 47 52   RBU_STATE_PROGR
12d80 45 53 53 3a 0a 20 20 20 20 20 20 20 20 70 52 65  ESS:.        pRe
12d90 74 2d 3e 6e 50 72 6f 67 72 65 73 73 20 3d 20 73  t->nProgress = s
12da0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
12db0 74 36 34 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20  t64(pStmt, 1);. 
12dc0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20         break;.. 
12dd0 20 20 20 20 20 63 61 73 65 20 52 42 55 5f 53 54       case RBU_ST
12de0 41 54 45 5f 43 4b 50 54 3a 0a 20 20 20 20 20 20  ATE_CKPT:.      
12df0 20 20 70 52 65 74 2d 3e 69 57 61 6c 43 6b 73 75    pRet->iWalCksu
12e00 6d 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  m = sqlite3_colu
12e10 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20  mn_int64(pStmt, 
12e20 31 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  1);.        brea
12e30 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20 52  k;..      case R
12e40 42 55 5f 53 54 41 54 45 5f 43 4f 4f 4b 49 45 3a  BU_STATE_COOKIE:
12e50 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e 69  .        pRet->i
12e60 43 6f 6f 6b 69 65 20 3d 20 28 75 33 32 29 73 71  Cookie = (u32)sq
12e70 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
12e80 36 34 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20  64(pStmt, 1);.  
12e90 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
12ea0 20 20 20 20 63 61 73 65 20 52 42 55 5f 53 54 41      case RBU_STA
12eb0 54 45 5f 4f 41 4c 53 5a 3a 0a 20 20 20 20 20 20  TE_OALSZ:.      
12ec0 20 20 70 52 65 74 2d 3e 69 4f 61 6c 53 7a 20 3d    pRet->iOalSz =
12ed0 20 28 75 33 32 29 73 71 6c 69 74 65 33 5f 63 6f   (u32)sqlite3_co
12ee0 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74  lumn_int64(pStmt
12ef0 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 62 72  , 1);.        br
12f00 65 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73 65  eak;..      case
12f10 20 52 42 55 5f 53 54 41 54 45 5f 50 48 41 53 45   RBU_STATE_PHASE
12f20 4f 4e 45 53 54 45 50 3a 0a 20 20 20 20 20 20 20  ONESTEP:.       
12f30 20 70 52 65 74 2d 3e 6e 50 68 61 73 65 4f 6e 65   pRet->nPhaseOne
12f40 53 74 65 70 20 3d 20 73 71 6c 69 74 65 33 5f 63  Step = sqlite3_c
12f50 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d  olumn_int64(pStm
12f60 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 62  t, 1);.        b
12f70 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 64 65 66  reak;..      def
12f80 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 72 63  ault:.        rc
12f90 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
12fa0 54 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  T;.        break
12fb0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 63  ;.    }.  }.  rc
12fc0 32 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  2 = sqlite3_fina
12fd0 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 69  lize(pStmt);.  i
12fe0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
12ff0 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 0a 20 20   ) rc = rc2;..  
13000 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 72 65  p->rc = rc;.  re
13010 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 0a 2f  turn pRet;.}.../
13020 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 64 61  *.** Open the da
13030 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 61 6e  tabase handle an
13040 64 20 61 74 74 61 63 68 20 74 68 65 20 52 42 55  d attach the RBU
13050 20 64 61 74 61 62 61 73 65 20 61 73 20 22 72 62   database as "rb
13060 75 22 2e 20 49 66 20 61 6e 0a 2a 2a 20 65 72 72  u". If an.** err
13070 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65  or occurs, leave
13080 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 61   an error code a
13090 6e 64 20 6d 65 73 73 61 67 65 20 69 6e 20 74 68  nd message in th
130a0 65 20 52 42 55 20 68 61 6e 64 6c 65 2e 0a 2a 2f  e RBU handle..*/
130b0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75  .static void rbu
130c0 4f 70 65 6e 44 61 74 61 62 61 73 65 28 73 71 6c  OpenDatabase(sql
130d0 69 74 65 33 72 62 75 20 2a 70 2c 20 69 6e 74 20  ite3rbu *p, int 
130e0 2a 70 62 52 65 74 72 79 29 7b 0a 20 20 61 73 73  *pbRetry){.  ass
130f0 65 72 74 28 20 70 2d 3e 72 63 20 7c 7c 20 28 70  ert( p->rc || (p
13100 2d 3e 64 62 4d 61 69 6e 3d 3d 30 20 26 26 20 70  ->dbMain==0 && p
13110 2d 3e 64 62 52 62 75 3d 3d 30 29 20 29 3b 0a 20  ->dbRbu==0) );. 
13120 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 20 7c   assert( p->rc |
13130 7c 20 72 62 75 49 73 56 61 63 75 75 6d 28 70 29  | rbuIsVacuum(p)
13140 20 7c 7c 20 70 2d 3e 7a 54 61 72 67 65 74 21 3d   || p->zTarget!=
13150 30 20 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  0 );..  /* Open 
13160 74 68 65 20 52 42 55 20 64 61 74 61 62 61 73 65  the RBU database
13170 20 2a 2f 0a 20 20 70 2d 3e 64 62 52 62 75 20 3d   */.  p->dbRbu =
13180 20 72 62 75 4f 70 65 6e 44 62 68 61 6e 64 6c 65   rbuOpenDbhandle
13190 28 70 2c 20 70 2d 3e 7a 52 62 75 2c 20 31 29 3b  (p, p->zRbu, 1);
131a0 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ..  if( p->rc==S
131b0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 62 75 49  QLITE_OK && rbuI
131c0 73 56 61 63 75 75 6d 28 70 29 20 29 7b 0a 20 20  sVacuum(p) ){.  
131d0 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63    sqlite3_file_c
131e0 6f 6e 74 72 6f 6c 28 70 2d 3e 64 62 52 62 75 2c  ontrol(p->dbRbu,
131f0 20 22 6d 61 69 6e 22 2c 20 53 51 4c 49 54 45 5f   "main", SQLITE_
13200 46 43 4e 54 4c 5f 52 42 55 43 4e 54 2c 20 28 76  FCNTL_RBUCNT, (v
13210 6f 69 64 2a 29 70 29 3b 0a 20 20 20 20 69 66 28  oid*)p);.    if(
13220 20 70 2d 3e 7a 53 74 61 74 65 3d 3d 30 20 29 7b   p->zState==0 ){
13230 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
13240 72 20 2a 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74  r *zFile = sqlit
13250 65 33 5f 64 62 5f 66 69 6c 65 6e 61 6d 65 28 70  e3_db_filename(p
13260 2d 3e 64 62 52 62 75 2c 20 22 6d 61 69 6e 22 29  ->dbRbu, "main")
13270 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 53 74 61 74  ;.      p->zStat
13280 65 20 3d 20 72 62 75 4d 50 72 69 6e 74 66 28 70  e = rbuMPrintf(p
13290 2c 20 22 66 69 6c 65 3a 2f 2f 25 73 2d 76 61 63  , "file://%s-vac
132a0 75 75 6d 3f 6d 6f 64 65 6f 66 3d 25 73 22 2c 20  uum?modeof=%s", 
132b0 7a 46 69 6c 65 2c 20 7a 46 69 6c 65 29 3b 0a 20  zFile, zFile);. 
132c0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
132d0 66 20 75 73 69 6e 67 20 73 65 70 61 72 61 74 65  f using separate
132e0 20 52 42 55 20 61 6e 64 20 73 74 61 74 65 20 64   RBU and state d
132f0 61 74 61 62 61 73 65 73 2c 20 61 74 74 61 63 68  atabases, attach
13300 20 74 68 65 20 73 74 61 74 65 20 64 61 74 61 62   the state datab
13310 61 73 65 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20  ase to.  ** the 
13320 52 42 55 20 64 62 20 68 61 6e 64 6c 65 20 6e 6f  RBU db handle no
13330 77 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  w.  */.  if( p->
13340 7a 53 74 61 74 65 20 29 7b 0a 20 20 20 20 72 62  zState ){.    rb
13350 75 4d 50 72 69 6e 74 66 45 78 65 63 28 70 2c 20  uMPrintfExec(p, 
13360 70 2d 3e 64 62 52 62 75 2c 20 22 41 54 54 41 43  p->dbRbu, "ATTAC
13370 48 20 25 51 20 41 53 20 73 74 61 74 22 2c 20 70  H %Q AS stat", p
13380 2d 3e 7a 53 74 61 74 65 29 3b 0a 20 20 20 20 6d  ->zState);.    m
13390 65 6d 63 70 79 28 70 2d 3e 7a 53 74 61 74 65 44  emcpy(p->zStateD
133a0 62 2c 20 22 73 74 61 74 22 2c 20 34 29 3b 0a 20  b, "stat", 4);. 
133b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 63   }else{.    memc
133c0 70 79 28 70 2d 3e 7a 53 74 61 74 65 44 62 2c 20  py(p->zStateDb, 
133d0 22 6d 61 69 6e 22 2c 20 34 29 3b 0a 20 20 7d 0a  "main", 4);.  }.
133e0 0a 23 69 66 20 30 0a 20 20 69 66 28 20 70 2d 3e  .#if 0.  if( p->
133f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
13400 20 72 62 75 49 73 56 61 63 75 75 6d 28 70 29 20   rbuIsVacuum(p) 
13410 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73  ){.    p->rc = s
13420 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
13430 62 52 62 75 2c 20 22 42 45 47 49 4e 22 2c 20 30  bRbu, "BEGIN", 0
13440 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e  , 0, 0);.  }.#en
13450 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 69 74 20  dif..  /* If it 
13460 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  has not already 
13470 62 65 65 6e 20 63 72 65 61 74 65 64 2c 20 63 72  been created, cr
13480 65 61 74 65 20 74 68 65 20 72 62 75 5f 73 74 61  eate the rbu_sta
13490 74 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 72 62  te table */.  rb
134a0 75 4d 50 72 69 6e 74 66 45 78 65 63 28 70 2c 20  uMPrintfExec(p, 
134b0 70 2d 3e 64 62 52 62 75 2c 20 52 42 55 5f 43 52  p->dbRbu, RBU_CR
134c0 45 41 54 45 5f 53 54 41 54 45 2c 20 70 2d 3e 7a  EATE_STATE, p->z
134d0 53 74 61 74 65 44 62 29 3b 0a 0a 23 69 66 20 30  StateDb);..#if 0
134e0 0a 20 20 69 66 28 20 72 62 75 49 73 56 61 63 75  .  if( rbuIsVacu
134f0 75 6d 28 70 29 20 29 7b 0a 20 20 20 20 69 66 28  um(p) ){.    if(
13500 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
13510 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  K ){.      int r
13520 63 32 3b 0a 20 20 20 20 20 20 69 6e 74 20 62 4f  c2;.      int bO
13530 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c  k = 0;.      sql
13540 69 74 65 33 5f 73 74 6d 74 20 2a 70 43 6e 74 20  ite3_stmt *pCnt 
13550 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 72 63  = 0;.      p->rc
13560 20 3d 20 70 72 65 70 61 72 65 41 6e 64 43 6f 6c   = prepareAndCol
13570 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 52  lectError(p->dbR
13580 62 75 2c 20 26 70 43 6e 74 2c 20 26 70 2d 3e 7a  bu, &pCnt, &p->z
13590 45 72 72 6d 73 67 2c 0a 20 20 20 20 20 20 20 20  Errmsg,.        
135a0 20 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28    "SELECT count(
135b0 2a 29 20 46 52 4f 4d 20 73 74 61 74 2e 73 71 6c  *) FROM stat.sql
135c0 69 74 65 5f 6d 61 73 74 65 72 22 0a 20 20 20 20  ite_master".    
135d0 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70    );.      if( p
135e0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
135f0 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74  .       && sqlit
13600 65 33 5f 73 74 65 70 28 70 43 6e 74 29 3d 3d 53  e3_step(pCnt)==S
13610 51 4c 49 54 45 5f 52 4f 57 0a 20 20 20 20 20 20  QLITE_ROW.      
13620 20 26 26 20 31 3d 3d 73 71 6c 69 74 65 33 5f 63   && 1==sqlite3_c
13630 6f 6c 75 6d 6e 5f 69 6e 74 28 70 43 6e 74 2c 20  olumn_int(pCnt, 
13640 30 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  0).      ){.    
13650 20 20 20 20 62 4f 6b 20 3d 20 31 3b 0a 20 20 20      bOk = 1;.   
13660 20 20 20 7d 0a 20 20 20 20 20 20 72 63 32 20 3d     }.      rc2 =
13670 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
13680 65 28 70 43 6e 74 29 3b 0a 20 20 20 20 20 20 69  e(pCnt);.      i
13690 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
136a0 5f 4f 4b 20 29 20 70 2d 3e 72 63 20 3d 20 72 63  _OK ) p->rc = rc
136b0 32 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 2d  2;..      if( p-
136c0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
136d0 26 20 62 4f 6b 3d 3d 30 20 29 7b 0a 20 20 20 20  & bOk==0 ){.    
136e0 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
136f0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
13700 20 20 70 2d 3e 7a 45 72 72 6d 73 67 20 3d 20 73    p->zErrmsg = s
13710 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
13720 69 6e 76 61 6c 69 64 20 73 74 61 74 65 20 64 61  invalid state da
13730 74 61 62 61 73 65 22 29 3b 0a 20 20 20 20 20 20  tabase");.      
13740 7d 0a 20 20 20 20 0a 20 20 20 20 20 20 69 66 28  }.    .      if(
13750 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
13760 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  K ){.        p->
13770 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65  rc = sqlite3_exe
13780 63 28 70 2d 3e 64 62 52 62 75 2c 20 22 43 4f 4d  c(p->dbRbu, "COM
13790 4d 49 54 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  MIT", 0, 0, 0);.
137a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
137b0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  }.#endif..  if( 
137c0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
137d0 20 26 26 20 72 62 75 49 73 56 61 63 75 75 6d 28   && rbuIsVacuum(
137e0 70 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 4f  p) ){.    int bO
137f0 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  pen = 0;.    int
13800 20 72 63 3b 0a 20 20 20 20 70 2d 3e 6e 52 62 75   rc;.    p->nRbu
13810 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 52 62   = 0;.    p->pRb
13820 75 46 64 20 3d 20 30 3b 0a 20 20 20 20 72 63 20  uFd = 0;.    rc 
13830 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63  = sqlite3_file_c
13840 6f 6e 74 72 6f 6c 28 70 2d 3e 64 62 52 62 75 2c  ontrol(p->dbRbu,
13850 20 22 6d 61 69 6e 22 2c 20 53 51 4c 49 54 45 5f   "main", SQLITE_
13860 46 43 4e 54 4c 5f 52 42 55 43 4e 54 2c 20 28 76  FCNTL_RBUCNT, (v
13870 6f 69 64 2a 29 70 29 3b 0a 20 20 20 20 69 66 28  oid*)p);.    if(
13880 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 54 46   rc!=SQLITE_NOTF
13890 4f 55 4e 44 20 29 20 70 2d 3e 72 63 20 3d 20 72  OUND ) p->rc = r
138a0 63 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 53  c;.    if( p->eS
138b0 74 61 67 65 3e 3d 52 42 55 5f 53 54 41 47 45 5f  tage>=RBU_STAGE_
138c0 4d 4f 56 45 20 29 7b 0a 20 20 20 20 20 20 62 4f  MOVE ){.      bO
138d0 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  pen = 1;.    }el
138e0 73 65 7b 0a 20 20 20 20 20 20 52 62 75 53 74 61  se{.      RbuSta
138f0 74 65 20 2a 70 53 74 61 74 65 20 3d 20 72 62 75  te *pState = rbu
13900 4c 6f 61 64 53 74 61 74 65 28 70 29 3b 0a 20 20  LoadState(p);.  
13910 20 20 20 20 69 66 28 20 70 53 74 61 74 65 20 29      if( pState )
13920 7b 0a 20 20 20 20 20 20 20 20 62 4f 70 65 6e 20  {.        bOpen 
13930 3d 20 28 70 53 74 61 74 65 2d 3e 65 53 74 61 67  = (pState->eStag
13940 65 3e 3d 52 42 55 5f 53 54 41 47 45 5f 4d 4f 56  e>=RBU_STAGE_MOV
13950 45 29 3b 0a 20 20 20 20 20 20 20 20 72 62 75 46  E);.        rbuF
13960 72 65 65 53 74 61 74 65 28 70 53 74 61 74 65 29  reeState(pState)
13970 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
13980 20 20 20 20 69 66 28 20 62 4f 70 65 6e 20 29 20      if( bOpen ) 
13990 70 2d 3e 64 62 4d 61 69 6e 20 3d 20 72 62 75 4f  p->dbMain = rbuO
139a0 70 65 6e 44 62 68 61 6e 64 6c 65 28 70 2c 20 70  penDbhandle(p, p
139b0 2d 3e 7a 52 62 75 2c 20 70 2d 3e 6e 52 62 75 3c  ->zRbu, p->nRbu<
139c0 3d 31 29 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e 65  =1);.  }..  p->e
139d0 53 74 61 67 65 20 3d 20 30 3b 0a 20 20 69 66 28  Stage = 0;.  if(
139e0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
139f0 4b 20 26 26 20 70 2d 3e 64 62 4d 61 69 6e 3d 3d  K && p->dbMain==
13a00 30 20 29 7b 0a 20 20 20 20 69 66 28 20 21 72 62  0 ){.    if( !rb
13a10 75 49 73 56 61 63 75 75 6d 28 70 29 20 29 7b 0a  uIsVacuum(p) ){.
13a20 20 20 20 20 20 20 70 2d 3e 64 62 4d 61 69 6e 20        p->dbMain 
13a30 3d 20 72 62 75 4f 70 65 6e 44 62 68 61 6e 64 6c  = rbuOpenDbhandl
13a40 65 28 70 2c 20 70 2d 3e 7a 54 61 72 67 65 74 2c  e(p, p->zTarget,
13a50 20 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69   1);.    }else i
13a60 66 28 20 70 2d 3e 70 52 62 75 46 64 2d 3e 70 57  f( p->pRbuFd->pW
13a70 61 6c 46 64 20 29 7b 0a 20 20 20 20 20 20 69 66  alFd ){.      if
13a80 28 20 70 62 52 65 74 72 79 20 29 7b 0a 20 20 20  ( pbRetry ){.   
13a90 20 20 20 20 20 70 2d 3e 70 52 62 75 46 64 2d 3e       p->pRbuFd->
13aa0 62 4e 6f 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20  bNolock = 0;.   
13ab0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f       sqlite3_clo
13ac0 73 65 28 70 2d 3e 64 62 52 62 75 29 3b 0a 20 20  se(p->dbRbu);.  
13ad0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c        sqlite3_cl
13ae0 6f 73 65 28 70 2d 3e 64 62 4d 61 69 6e 29 3b 0a  ose(p->dbMain);.
13af0 20 20 20 20 20 20 20 20 70 2d 3e 64 62 4d 61 69          p->dbMai
13b00 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  n = 0;.        p
13b10 2d 3e 64 62 52 62 75 20 3d 20 30 3b 0a 20 20 20  ->dbRbu = 0;.   
13b20 20 20 20 20 20 2a 70 62 52 65 74 72 79 20 3d 20       *pbRetry = 
13b30 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  1;.        retur
13b40 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  n;.      }.     
13b50 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
13b60 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 70 2d 3e  ERROR;.      p->
13b70 7a 45 72 72 6d 73 67 20 3d 20 73 71 6c 69 74 65  zErrmsg = sqlite
13b80 33 5f 6d 70 72 69 6e 74 66 28 22 63 61 6e 6e 6f  3_mprintf("canno
13b90 74 20 76 61 63 75 75 6d 20 77 61 6c 20 6d 6f 64  t vacuum wal mod
13ba0 65 20 64 61 74 61 62 61 73 65 22 29 3b 0a 20 20  e database");.  
13bb0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
13bc0 68 61 72 20 2a 7a 54 61 72 67 65 74 3b 0a 20 20  har *zTarget;.  
13bd0 20 20 20 20 63 68 61 72 20 2a 7a 45 78 74 72 61      char *zExtra
13be0 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
13bf0 73 74 72 6c 65 6e 28 70 2d 3e 7a 52 62 75 29 3e  strlen(p->zRbu)>
13c00 3d 35 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28  =5 && 0==memcmp(
13c10 22 66 69 6c 65 3a 22 2c 20 70 2d 3e 7a 52 62 75  "file:", p->zRbu
13c20 2c 20 35 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 5) ){.        
13c30 7a 45 78 74 72 61 20 3d 20 26 70 2d 3e 7a 52 62  zExtra = &p->zRb
13c40 75 5b 35 5d 3b 0a 20 20 20 20 20 20 20 20 77 68  u[5];.        wh
13c50 69 6c 65 28 20 2a 7a 45 78 74 72 61 20 29 7b 0a  ile( *zExtra ){.
13c60 20 20 20 20 20 20 20 20 20 20 69 66 28 20 2a 7a            if( *z
13c70 45 78 74 72 61 2b 2b 3d 3d 27 3f 27 20 29 20 62  Extra++=='?' ) b
13c80 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
13c90 20 20 20 20 20 20 20 20 69 66 28 20 2a 7a 45 78          if( *zEx
13ca0 74 72 61 3d 3d 27 5c 30 27 20 29 20 7a 45 78 74  tra=='\0' ) zExt
13cb0 72 61 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ra = 0;.      }.
13cc0 0a 20 20 20 20 20 20 7a 54 61 72 67 65 74 20 3d  .      zTarget =
13cd0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
13ce0 28 22 66 69 6c 65 3a 25 73 2d 76 61 63 75 75 6d  ("file:%s-vacuum
13cf0 3f 72 62 75 5f 6d 65 6d 6f 72 79 3d 31 25 73 25  ?rbu_memory=1%s%
13d00 73 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73  s", .          s
13d10 71 6c 69 74 65 33 5f 64 62 5f 66 69 6c 65 6e 61  qlite3_db_filena
13d20 6d 65 28 70 2d 3e 64 62 52 62 75 2c 20 22 6d 61  me(p->dbRbu, "ma
13d30 69 6e 22 29 2c 0a 20 20 20 20 20 20 20 20 20 20  in"),.          
13d40 28 7a 45 78 74 72 61 3d 3d 30 20 3f 20 22 22 20  (zExtra==0 ? "" 
13d50 3a 20 22 26 22 29 2c 20 28 7a 45 78 74 72 61 3d  : "&"), (zExtra=
13d60 3d 30 20 3f 20 22 22 20 3a 20 7a 45 78 74 72 61  =0 ? "" : zExtra
13d70 29 0a 20 20 20 20 20 20 29 3b 0a 0a 20 20 20 20  ).      );..    
13d80 20 20 69 66 28 20 7a 54 61 72 67 65 74 3d 3d 30    if( zTarget==0
13d90 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72   ){.        p->r
13da0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
13db0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
13dc0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
13dd0 70 2d 3e 64 62 4d 61 69 6e 20 3d 20 72 62 75 4f  p->dbMain = rbuO
13de0 70 65 6e 44 62 68 61 6e 64 6c 65 28 70 2c 20 7a  penDbhandle(p, z
13df0 54 61 72 67 65 74 2c 20 70 2d 3e 6e 52 62 75 3c  Target, p->nRbu<
13e00 3d 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  =1);.      sqlit
13e10 65 33 5f 66 72 65 65 28 7a 54 61 72 67 65 74 29  e3_free(zTarget)
13e20 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
13e30 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
13e40 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63  _OK ){.    p->rc
13e50 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
13e60 65 5f 66 75 6e 63 74 69 6f 6e 28 70 2d 3e 64 62  e_function(p->db
13e70 4d 61 69 6e 2c 20 0a 20 20 20 20 20 20 20 20 22  Main, .        "
13e80 72 62 75 5f 74 6d 70 5f 69 6e 73 65 72 74 22 2c  rbu_tmp_insert",
13e90 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38   -1, SQLITE_UTF8
13ea0 2c 20 28 76 6f 69 64 2a 29 70 2c 20 72 62 75 54  , (void*)p, rbuT
13eb0 6d 70 49 6e 73 65 72 74 46 75 6e 63 2c 20 30 2c  mpInsertFunc, 0,
13ec0 20 30 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20   0.    );.  }.. 
13ed0 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
13ee0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d 3e  TE_OK ){.    p->
13ef0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
13f00 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70 2d 3e  ate_function(p->
13f10 64 62 4d 61 69 6e 2c 20 0a 20 20 20 20 20 20 20  dbMain, .       
13f20 20 22 72 62 75 5f 66 6f 73 73 69 6c 5f 64 65 6c   "rbu_fossil_del
13f30 74 61 22 2c 20 32 2c 20 53 51 4c 49 54 45 5f 55  ta", 2, SQLITE_U
13f40 54 46 38 2c 20 30 2c 20 72 62 75 46 6f 73 73 69  TF8, 0, rbuFossi
13f50 6c 44 65 6c 74 61 46 75 6e 63 2c 20 30 2c 20 30  lDeltaFunc, 0, 0
13f60 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 69  .    );.  }..  i
13f70 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
13f80 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63  _OK ){.    p->rc
13f90 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
13fa0 65 5f 66 75 6e 63 74 69 6f 6e 28 70 2d 3e 64 62  e_function(p->db
13fb0 52 62 75 2c 20 0a 20 20 20 20 20 20 20 20 22 72  Rbu, .        "r
13fc0 62 75 5f 74 61 72 67 65 74 5f 6e 61 6d 65 22 2c  bu_target_name",
13fd0 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38   -1, SQLITE_UTF8
13fe0 2c 20 28 76 6f 69 64 2a 29 70 2c 20 72 62 75 54  , (void*)p, rbuT
13ff0 61 72 67 65 74 4e 61 6d 65 46 75 6e 63 2c 20 30  argetNameFunc, 0
14000 2c 20 30 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a  , 0.    );.  }..
14010 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
14020 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d  ITE_OK ){.    p-
14030 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69  >rc = sqlite3_fi
14040 6c 65 5f 63 6f 6e 74 72 6f 6c 28 70 2d 3e 64 62  le_control(p->db
14050 4d 61 69 6e 2c 20 22 6d 61 69 6e 22 2c 20 53 51  Main, "main", SQ
14060 4c 49 54 45 5f 46 43 4e 54 4c 5f 52 42 55 2c 20  LITE_FCNTL_RBU, 
14070 28 76 6f 69 64 2a 29 70 29 3b 0a 20 20 7d 0a 20  (void*)p);.  }. 
14080 20 72 62 75 4d 50 72 69 6e 74 66 45 78 65 63 28   rbuMPrintfExec(
14090 70 2c 20 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 53  p, p->dbMain, "S
140a0 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c  ELECT * FROM sql
140b0 69 74 65 5f 6d 61 73 74 65 72 22 29 3b 0a 0a 20  ite_master");.. 
140c0 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 64 61 74   /* Mark the dat
140d0 61 62 61 73 65 20 66 69 6c 65 20 6a 75 73 74 20  abase file just 
140e0 6f 70 65 6e 65 64 20 61 73 20 61 6e 20 52 42 55  opened as an RBU
140f0 20 74 61 72 67 65 74 20 64 61 74 61 62 61 73 65   target database
14100 2e 20 49 66 20 0a 20 20 2a 2a 20 74 68 69 73 20  . If .  ** this 
14110 63 61 6c 6c 20 72 65 74 75 72 6e 73 20 53 51 4c  call returns SQL
14120 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 2c 20 74 68  ITE_NOTFOUND, th
14130 65 6e 20 74 68 65 20 52 42 55 20 76 66 73 20 69  en the RBU vfs i
14140 73 20 6e 6f 74 20 69 6e 20 75 73 65 2e 0a 20 20  s not in use..  
14150 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 65 72  ** This is an er
14160 72 6f 72 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70  ror.  */.  if( p
14170 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
14180 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73  ){.    p->rc = s
14190 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
141a0 72 6f 6c 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 22  rol(p->dbMain, "
141b0 6d 61 69 6e 22 2c 20 53 51 4c 49 54 45 5f 46 43  main", SQLITE_FC
141c0 4e 54 4c 5f 52 42 55 2c 20 28 76 6f 69 64 2a 29  NTL_RBU, (void*)
141d0 70 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  p);.  }..  if( p
141e0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54  ->rc==SQLITE_NOT
141f0 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 70 2d 3e  FOUND ){.    p->
14200 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
14210 52 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72 6d 73  R;.    p->zErrms
14220 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  g = sqlite3_mpri
14230 6e 74 66 28 22 72 62 75 20 76 66 73 20 6e 6f 74  ntf("rbu vfs not
14240 20 66 6f 75 6e 64 22 29 3b 0a 20 20 7d 0a 7d 0a   found");.  }.}.
14250 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
14260 69 6e 65 20 69 73 20 61 20 63 6f 70 79 20 6f 66  ine is a copy of
14270 20 74 68 65 20 73 71 6c 69 74 65 33 46 69 6c 65   the sqlite3File
14280 53 75 66 66 69 78 33 28 29 20 72 6f 75 74 69 6e  Suffix3() routin
14290 65 20 66 72 6f 6d 20 74 68 65 20 63 6f 72 65 2e  e from the core.
142a0 0a 2a 2a 20 49 74 20 69 73 20 61 20 6e 6f 2d 6f  .** It is a no-o
142b0 70 20 75 6e 6c 65 73 73 20 53 51 4c 49 54 45 5f  p unless SQLITE_
142c0 45 4e 41 42 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53  ENABLE_8_3_NAMES
142d0 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a   is defined..**.
142e0 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 45 4e 41  ** If SQLITE_ENA
142f0 42 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53 20 69 73  BLE_8_3_NAMES is
14300 20 73 65 74 20 61 74 20 63 6f 6d 70 69 6c 65 2d   set at compile-
14310 74 69 6d 65 20 61 6e 64 20 69 66 20 74 68 65 20  time and if the 
14320 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65  database.** file
14330 6e 61 6d 65 20 69 6e 20 7a 42 61 73 65 46 69 6c  name in zBaseFil
14340 65 6e 61 6d 65 20 69 73 20 61 20 55 52 49 20 77  ename is a URI w
14350 69 74 68 20 74 68 65 20 22 38 5f 33 5f 6e 61 6d  ith the "8_3_nam
14360 65 73 3d 31 22 20 70 61 72 61 6d 65 74 65 72 20  es=1" parameter 
14370 61 6e 64 0a 2a 2a 20 69 66 20 66 69 6c 65 6e 61  and.** if filena
14380 6d 65 20 69 6e 20 7a 5b 5d 20 68 61 73 20 61 20  me in z[] has a 
14390 73 75 66 66 69 78 20 28 61 2e 6b 2e 61 2e 20 22  suffix (a.k.a. "
143a0 65 78 74 65 6e 73 69 6f 6e 22 29 20 74 68 61 74  extension") that
143b0 20 69 73 20 6c 6f 6e 67 65 72 20 74 68 61 6e 0a   is longer than.
143c0 2a 2a 20 74 68 72 65 65 20 63 68 61 72 61 63 74  ** three charact
143d0 65 72 73 2c 20 74 68 65 6e 20 73 68 6f 72 74 65  ers, then shorte
143e0 6e 20 74 68 65 20 73 75 66 66 69 78 20 6f 6e 20  n the suffix on 
143f0 7a 5b 5d 20 74 6f 20 62 65 20 74 68 65 20 6c 61  z[] to be the la
14400 73 74 20 74 68 72 65 65 0a 2a 2a 20 63 68 61 72  st three.** char
14410 61 63 74 65 72 73 20 6f 66 20 74 68 65 20 6f 72  acters of the or
14420 69 67 69 6e 61 6c 20 73 75 66 66 69 78 2e 0a 2a  iginal suffix..*
14430 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 45  *.** If SQLITE_E
14440 4e 41 42 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53 20  NABLE_8_3_NAMES 
14450 69 73 20 73 65 74 20 74 6f 20 32 20 61 74 20 63  is set to 2 at c
14460 6f 6d 70 69 6c 65 2d 74 69 6d 65 2c 20 74 68 65  ompile-time, the
14470 6e 20 61 6c 77 61 79 73 0a 2a 2a 20 64 6f 20 74  n always.** do t
14480 68 65 20 73 75 66 66 69 78 20 73 68 6f 72 74 65  he suffix shorte
14490 6e 69 6e 67 20 72 65 67 61 72 64 6c 65 73 73 20  ning regardless 
144a0 6f 66 20 55 52 49 20 70 61 72 61 6d 65 74 65 72  of URI parameter
144b0 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 73  ..**.** Examples
144c0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 74 65 73 74  :.**.**     test
144d0 2e 64 62 2d 6a 6f 75 72 6e 61 6c 20 20 20 20 3d  .db-journal    =
144e0 3e 20 20 20 74 65 73 74 2e 6e 61 6c 0a 2a 2a 20  >   test.nal.** 
144f0 20 20 20 20 74 65 73 74 2e 64 62 2d 77 61 6c 20      test.db-wal 
14500 20 20 20 20 20 20 20 3d 3e 20 20 20 74 65 73 74         =>   test
14510 2e 77 61 6c 0a 2a 2a 20 20 20 20 20 74 65 73 74  .wal.**     test
14520 2e 64 62 2d 73 68 6d 20 20 20 20 20 20 20 20 3d  .db-shm        =
14530 3e 20 20 20 74 65 73 74 2e 73 68 6d 0a 2a 2a 20  >   test.shm.** 
14540 20 20 20 20 74 65 73 74 2e 64 62 2d 6d 6a 37 66      test.db-mj7f
14550 33 33 31 39 66 61 20 3d 3e 20 20 20 74 65 73 74  3319fa =>   test
14560 2e 39 66 61 0a 2a 2f 0a 73 74 61 74 69 63 20 76  .9fa.*/.static v
14570 6f 69 64 20 72 62 75 46 69 6c 65 53 75 66 66 69  oid rbuFileSuffi
14580 78 33 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  x3(const char *z
14590 42 61 73 65 2c 20 63 68 61 72 20 2a 7a 29 7b 0a  Base, char *z){.
145a0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
145b0 41 42 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53 0a 23  ABLE_8_3_NAMES.#
145c0 69 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 3c 32 0a 20 20 69  _8_3_NAMES<2.  i
145e0 66 28 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62  f( sqlite3_uri_b
145f0 6f 6f 6c 65 61 6e 28 7a 42 61 73 65 2c 20 22 38  oolean(zBase, "8
14600 5f 33 5f 6e 61 6d 65 73 22 2c 20 30 29 20 29 0a  _3_names", 0) ).
14610 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 69  #endif.  {.    i
14620 6e 74 20 69 2c 20 73 7a 3b 0a 20 20 20 20 73 7a  nt i, sz;.    sz
14630 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a   = (int)strlen(z
14640 29 26 30 78 66 66 66 66 66 66 3b 0a 20 20 20 20  )&0xffffff;.    
14650 66 6f 72 28 69 3d 73 7a 2d 31 3b 20 69 3e 30 20  for(i=sz-1; i>0 
14660 26 26 20 7a 5b 69 5d 21 3d 27 2f 27 20 26 26 20  && z[i]!='/' && 
14670 7a 5b 69 5d 21 3d 27 2e 27 3b 20 69 2d 2d 29 7b  z[i]!='.'; i--){
14680 7d 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d  }.    if( z[i]==
14690 27 2e 27 20 26 26 20 73 7a 3e 69 2b 34 20 29 20  '.' && sz>i+4 ) 
146a0 6d 65 6d 6d 6f 76 65 28 26 7a 5b 69 2b 31 5d 2c  memmove(&z[i+1],
146b0 20 26 7a 5b 73 7a 2d 33 5d 2c 20 34 29 3b 0a 20   &z[sz-3], 4);. 
146c0 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a   }.#endif.}../*.
146d0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75  ** Return the cu
146e0 72 72 65 6e 74 20 77 61 6c 2d 69 6e 64 65 78 20  rrent wal-index 
146f0 68 65 61 64 65 72 20 63 68 65 63 6b 73 75 6d 20  header checksum 
14700 66 6f 72 20 74 68 65 20 74 61 72 67 65 74 20 64  for the target d
14710 61 74 61 62 61 73 65 20 0a 2a 2a 20 61 73 20 61  atabase .** as a
14720 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 2e   64-bit integer.
14730 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 68 65 63 6b  .**.** The check
14740 73 75 6d 20 69 73 20 73 74 6f 72 65 20 69 6e 20  sum is store in 
14750 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
14760 66 20 78 53 68 6d 4d 61 70 20 6d 65 6d 6f 72 79  f xShmMap memory
14770 20 61 73 20 61 6e 20 38 2d 62 79 74 65 20 0a 2a   as an 8-byte .*
14780 2a 20 62 6c 6f 62 20 73 74 61 72 74 69 6e 67 20  * blob starting 
14790 61 74 20 62 79 74 65 20 6f 66 66 73 65 74 20 34  at byte offset 4
147a0 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36 34  0..*/.static i64
147b0 20 72 62 75 53 68 6d 43 68 65 63 6b 73 75 6d 28   rbuShmChecksum(
147c0 73 71 6c 69 74 65 33 72 62 75 20 2a 70 29 7b 0a  sqlite3rbu *p){.
147d0 20 20 69 36 34 20 69 52 65 74 20 3d 20 30 3b 0a    i64 iRet = 0;.
147e0 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
147f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
14800 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 44 62 20  lite3_file *pDb 
14810 3d 20 70 2d 3e 70 54 61 72 67 65 74 46 64 2d 3e  = p->pTargetFd->
14820 70 52 65 61 6c 3b 0a 20 20 20 20 75 33 32 20 76  pReal;.    u32 v
14830 6f 6c 61 74 69 6c 65 20 2a 70 74 72 3b 0a 20 20  olatile *ptr;.  
14840 20 20 70 2d 3e 72 63 20 3d 20 70 44 62 2d 3e 70    p->rc = pDb->p
14850 4d 65 74 68 6f 64 73 2d 3e 78 53 68 6d 4d 61 70  Methods->xShmMap
14860 28 70 44 62 2c 20 30 2c 20 33 32 2a 31 30 32 34  (pDb, 0, 32*1024
14870 2c 20 30 2c 20 28 76 6f 69 64 20 76 6f 6c 61 74  , 0, (void volat
14880 69 6c 65 2a 2a 29 26 70 74 72 29 3b 0a 20 20 20  ile**)&ptr);.   
14890 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
148a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
148b0 52 65 74 20 3d 20 28 28 69 36 34 29 70 74 72 5b  Ret = ((i64)ptr[
148c0 31 30 5d 20 3c 3c 20 33 32 29 20 2b 20 70 74 72  10] << 32) + ptr
148d0 5b 31 31 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  [11];.    }.  }.
148e0 20 20 72 65 74 75 72 6e 20 69 52 65 74 3b 0a 7d    return iRet;.}
148f0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
14900 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
14910 61 73 20 70 61 72 74 20 6f 66 20 69 6e 69 74 69  as part of initi
14920 61 6c 69 7a 69 6e 67 20 6f 72 20 72 65 69 6e 69  alizing or reini
14930 74 69 61 6c 69 7a 69 6e 67 20 61 6e 0a 2a 2a 20  tializing an.** 
14940 69 6e 63 72 65 6d 65 6e 74 61 6c 20 63 68 65 63  incremental chec
14950 6b 70 6f 69 6e 74 2e 20 0a 2a 2a 0a 2a 2a 20 49  kpoint. .**.** I
14960 74 20 70 6f 70 75 6c 61 74 65 73 20 74 68 65 20  t populates the 
14970 73 71 6c 69 74 65 33 72 62 75 2e 61 46 72 61 6d  sqlite3rbu.aFram
14980 65 5b 5d 20 61 72 72 61 79 20 77 69 74 68 20 74  e[] array with t
14990 68 65 20 73 65 74 20 6f 66 20 0a 2a 2a 20 28 77  he set of .** (w
149a0 61 6c 20 66 72 61 6d 65 20 2d 3e 20 64 62 20 70  al frame -> db p
149b0 61 67 65 29 20 63 6f 70 79 20 6f 70 65 72 61 74  age) copy operat
149c0 69 6f 6e 73 20 72 65 71 75 69 72 65 64 20 74 6f  ions required to
149d0 20 63 68 65 63 6b 70 6f 69 6e 74 20 74 68 65 20   checkpoint the 
149e0 0a 2a 2a 20 63 75 72 72 65 6e 74 20 77 61 6c 20  .** current wal 
149f0 66 69 6c 65 2c 20 61 6e 64 20 6f 62 74 61 69 6e  file, and obtain
14a00 73 20 74 68 65 20 73 65 74 20 6f 66 20 73 68 6d  s the set of shm
14a10 20 6c 6f 63 6b 73 20 72 65 71 75 69 72 65 64 20   locks required 
14a20 74 6f 20 73 61 66 65 6c 79 20 0a 2a 2a 20 70 65  to safely .** pe
14a30 72 66 6f 72 6d 20 74 68 65 20 63 6f 70 79 20 6f  rform the copy o
14a40 70 65 72 61 74 69 6f 6e 73 20 64 69 72 65 63 74  perations direct
14a50 6c 79 20 6f 6e 20 74 68 65 20 66 69 6c 65 2d 73  ly on the file-s
14a60 79 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ystem..**.** If 
14a70 61 72 67 75 6d 65 6e 74 20 70 53 74 61 74 65 20  argument pState 
14a80 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  is not NULL, the
14a90 6e 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61  n the incrementa
14aa0 6c 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 73 0a  l checkpoint is.
14ab0 2a 2a 20 62 65 69 6e 67 20 72 65 73 75 6d 65 64  ** being resumed
14ac0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
14ad0 69 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  if the checksum 
14ae0 6f 66 20 74 68 65 20 77 61 6c 2d 69 6e 64 65 78  of the wal-index
14af0 2d 68 65 61 64 65 72 0a 2a 2a 20 66 6f 6c 6c 6f  -header.** follo
14b00 77 69 6e 67 20 72 65 63 6f 76 65 72 79 20 69 73  wing recovery is
14b10 20 6e 6f 74 20 74 68 65 20 73 61 6d 65 20 61 73   not the same as
14b20 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 73 61   the checksum sa
14b30 76 65 64 20 69 6e 20 74 68 65 20 52 62 75 53 74  ved in the RbuSt
14b40 61 74 65 0a 2a 2a 20 6f 62 6a 65 63 74 2c 20 74  ate.** object, t
14b50 68 65 6e 20 74 68 65 20 72 62 75 20 68 61 6e 64  hen the rbu hand
14b60 6c 65 20 69 73 20 73 65 74 20 74 6f 20 44 4f 4e  le is set to DON
14b70 45 20 73 74 61 74 65 2e 20 54 68 69 73 20 6f 63  E state. This oc
14b80 63 75 72 73 20 69 66 20 73 6f 6d 65 0a 2a 2a 20  curs if some.** 
14b90 6f 74 68 65 72 20 63 6c 69 65 6e 74 20 61 70 70  other client app
14ba0 65 6e 64 73 20 61 20 74 72 61 6e 73 61 63 74 69  ends a transacti
14bb0 6f 6e 20 74 6f 20 74 68 65 20 77 61 6c 20 66 69  on to the wal fi
14bc0 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65  le in the middle
14bd0 20 6f 66 0a 2a 2a 20 61 6e 20 69 6e 63 72 65 6d   of.** an increm
14be0 65 6e 74 61 6c 20 63 68 65 63 6b 70 6f 69 6e 74  ental checkpoint
14bf0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
14c00 20 72 62 75 53 65 74 75 70 43 68 65 63 6b 70 6f   rbuSetupCheckpo
14c10 69 6e 74 28 73 71 6c 69 74 65 33 72 62 75 20 2a  int(sqlite3rbu *
14c20 70 2c 20 52 62 75 53 74 61 74 65 20 2a 70 53 74  p, RbuState *pSt
14c30 61 74 65 29 7b 0a 0a 20 20 2f 2a 20 49 66 20 70  ate){..  /* If p
14c40 53 74 61 74 65 20 69 73 20 4e 55 4c 4c 2c 20 74  State is NULL, t
14c50 68 65 6e 20 74 68 65 20 77 61 6c 20 66 69 6c 65  hen the wal file
14c60 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 62 65   may not have be
14c70 65 6e 20 6f 70 65 6e 65 64 20 61 6e 64 0a 20 20  en opened and.  
14c80 2a 2a 20 72 65 63 6f 76 65 72 65 64 2e 20 52 75  ** recovered. Ru
14c90 6e 6e 69 6e 67 20 61 20 72 65 61 64 2d 73 74 61  nning a read-sta
14ca0 74 65 6d 65 6e 74 20 68 65 72 65 20 74 6f 20 65  tement here to e
14cb0 6e 73 75 72 65 20 74 68 61 74 20 64 6f 69 6e 67  nsure that doing
14cc0 20 73 6f 0a 20 20 2a 2a 20 64 6f 65 73 20 6e 6f   so.  ** does no
14cd0 74 20 69 6e 74 65 72 66 65 72 65 20 77 69 74 68  t interfere with
14ce0 20 74 68 65 20 22 63 61 70 74 75 72 65 22 20 70   the "capture" p
14cf0 72 6f 63 65 73 73 20 62 65 6c 6f 77 2e 20 20 2a  rocess below.  *
14d00 2f 0a 20 20 69 66 28 20 70 53 74 61 74 65 3d 3d  /.  if( pState==
14d10 30 20 29 7b 0a 20 20 20 20 70 2d 3e 65 53 74 61  0 ){.    p->eSta
14d20 67 65 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  ge = 0;.    if( 
14d30 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
14d40 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20   ){.      p->rc 
14d50 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70  = sqlite3_exec(p
14d60 2d 3e 64 62 4d 61 69 6e 2c 20 22 53 45 4c 45 43  ->dbMain, "SELEC
14d70 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  T * FROM sqlite_
14d80 6d 61 73 74 65 72 22 2c 20 30 2c 20 30 2c 20 30  master", 0, 0, 0
14d90 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
14da0 2f 2a 20 41 73 73 75 6d 69 6e 67 20 6e 6f 20 65  /* Assuming no e
14db0 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65  rror has occurre
14dc0 64 2c 20 72 75 6e 20 61 20 22 72 65 73 74 61 72  d, run a "restar
14dd0 74 22 20 63 68 65 63 6b 70 6f 69 6e 74 20 77 69  t" checkpoint wi
14de0 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69  th the.  ** sqli
14df0 74 65 33 72 62 75 2e 65 53 74 61 67 65 20 76 61  te3rbu.eStage va
14e00 72 69 61 62 6c 65 20 73 65 74 20 74 6f 20 43 41  riable set to CA
14e10 50 54 55 52 45 2e 20 54 68 69 73 20 74 75 72 6e  PTURE. This turn
14e20 73 20 6f 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  s on the followi
14e30 6e 67 0a 20 20 2a 2a 20 73 70 65 63 69 61 6c 20  ng.  ** special 
14e40 62 65 68 61 76 69 6f 75 72 20 69 6e 20 74 68 65  behaviour in the
14e50 20 72 62 75 20 56 46 53 3a 0a 20 20 2a 2a 0a 20   rbu VFS:.  **. 
14e60 20 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 65   **   * If the e
14e70 78 63 6c 75 73 69 76 65 20 73 68 6d 20 57 52 49  xclusive shm WRI
14e80 54 45 52 20 6f 72 20 52 45 41 44 30 20 6c 6f 63  TER or READ0 loc
14e90 6b 20 63 61 6e 6e 6f 74 20 62 65 20 6f 62 74 61  k cannot be obta
14ea0 69 6e 65 64 2c 0a 20 20 2a 2a 20 20 20 20 20 74  ined,.  **     t
14eb0 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 66 61  he checkpoint fa
14ec0 69 6c 73 20 77 69 74 68 20 53 51 4c 49 54 45 5f  ils with SQLITE_
14ed0 42 55 53 59 20 28 6e 6f 72 6d 61 6c 6c 79 20 53  BUSY (normally S
14ee0 51 4c 69 74 65 20 77 6f 75 6c 64 0a 20 20 2a 2a  QLite would.  **
14ef0 20 20 20 20 20 70 72 6f 63 65 65 64 20 77 69 74       proceed wit
14f00 68 20 72 75 6e 6e 69 6e 67 20 61 20 70 61 73 73  h running a pass
14f10 69 76 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 69  ive checkpoint i
14f20 6e 73 74 65 61 64 20 6f 66 20 66 61 69 6c 69 6e  nstead of failin
14f30 67 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  g)..  **.  **   
14f40 2a 20 41 74 74 65 6d 70 74 73 20 74 6f 20 72 65  * Attempts to re
14f50 61 64 20 66 72 6f 6d 20 74 68 65 20 2a 2d 77 61  ad from the *-wa
14f60 6c 20 66 69 6c 65 20 6f 72 20 77 72 69 74 65 20  l file or write 
14f70 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
14f80 66 69 6c 65 0a 20 20 2a 2a 20 20 20 20 20 64 6f  file.  **     do
14f90 20 6e 6f 74 20 70 65 72 66 6f 72 6d 20 61 6e 79   not perform any
14fa0 20 49 4f 2e 20 49 6e 73 74 65 61 64 2c 20 74 68   IO. Instead, th
14fb0 65 20 66 72 61 6d 65 2f 70 61 67 65 20 63 6f 6d  e frame/page com
14fc0 62 69 6e 61 74 69 6f 6e 73 20 74 68 61 74 0a 20  binations that. 
14fd0 20 2a 2a 20 20 20 20 20 77 6f 75 6c 64 20 62 65   **     would be
14fe0 20 72 65 61 64 2f 77 72 69 74 74 65 6e 20 61 72   read/written ar
14ff0 65 20 72 65 63 6f 72 64 65 64 20 69 6e 20 74 68  e recorded in th
15000 65 20 73 71 6c 69 74 65 33 72 62 75 2e 61 46 72  e sqlite3rbu.aFr
15010 61 6d 65 5b 5d 0a 20 20 2a 2a 20 20 20 20 20 61  ame[].  **     a
15020 72 72 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rray..  **.  ** 
15030 20 20 2a 20 43 61 6c 6c 73 20 74 6f 20 78 53 68    * Calls to xSh
15040 6d 4c 6f 63 6b 28 55 4e 4c 4f 43 4b 29 20 74 6f  mLock(UNLOCK) to
15050 20 72 65 6c 65 61 73 65 20 74 68 65 20 65 78 63   release the exc
15060 6c 75 73 69 76 65 20 73 68 6d 20 57 52 49 54 45  lusive shm WRITE
15070 52 2c 20 0a 20 20 2a 2a 20 20 20 20 20 52 45 41  R, .  **     REA
15080 44 30 20 61 6e 64 20 43 48 45 43 4b 50 4f 49 4e  D0 and CHECKPOIN
15090 54 20 6c 6f 63 6b 73 20 74 61 6b 65 6e 20 61 73  T locks taken as
150a0 20 70 61 72 74 20 6f 66 20 74 68 65 20 63 68 65   part of the che
150b0 63 6b 70 6f 69 6e 74 20 61 72 65 0a 20 20 2a 2a  ckpoint are.  **
150c0 20 20 20 20 20 6e 6f 2d 6f 70 73 2e 20 54 68 65       no-ops. The
150d0 73 65 20 6c 6f 63 6b 73 20 77 69 6c 6c 20 6e 6f  se locks will no
150e0 74 20 62 65 20 72 65 6c 65 61 73 65 64 20 75 6e  t be released un
150f0 74 69 6c 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  til the connecti
15100 6f 6e 0a 20 20 2a 2a 20 20 20 20 20 69 73 20 63  on.  **     is c
15110 6c 6f 73 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  losed..  **.  **
15120 20 20 20 2a 20 41 74 74 65 6d 70 74 69 6e 67 20     * Attempting 
15130 74 6f 20 78 53 79 6e 63 28 29 20 74 68 65 20 64  to xSync() the d
15140 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 61 75  atabase file cau
15150 73 65 73 20 61 6e 20 53 51 4c 49 54 45 5f 49 4e  ses an SQLITE_IN
15160 54 45 52 4e 41 4c 20 0a 20 20 2a 2a 20 20 20 20  TERNAL .  **    
15170 20 65 72 72 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a   error..  **.  *
15180 2a 20 41 73 20 61 20 72 65 73 75 6c 74 2c 20 75  * As a result, u
15190 6e 6c 65 73 73 20 61 6e 20 65 72 72 6f 72 20 28  nless an error (
151a0 69 2e 65 2e 20 4f 4f 4d 20 6f 72 20 53 51 4c 49  i.e. OOM or SQLI
151b0 54 45 5f 42 55 53 59 29 20 6f 63 63 75 72 73 2c  TE_BUSY) occurs,
151c0 20 74 68 65 0a 20 20 2a 2a 20 63 68 65 63 6b 70   the.  ** checkp
151d0 6f 69 6e 74 20 62 65 6c 6f 77 20 66 61 69 6c 73  oint below fails
151e0 20 77 69 74 68 20 53 51 4c 49 54 45 5f 49 4e 54   with SQLITE_INT
151f0 45 52 4e 41 4c 2c 20 61 6e 64 20 6c 65 61 76 65  ERNAL, and leave
15200 73 20 74 68 65 20 61 46 72 61 6d 65 5b 5d 0a 20  s the aFrame[]. 
15210 20 2a 2a 20 61 72 72 61 79 20 70 6f 70 75 6c 61   ** array popula
15220 74 65 64 20 77 69 74 68 20 61 20 73 65 74 20 6f  ted with a set o
15230 66 20 28 66 72 61 6d 65 20 2d 3e 20 70 61 67 65  f (frame -> page
15240 29 20 6d 61 70 70 69 6e 67 73 2e 20 42 65 63 61  ) mappings. Beca
15250 75 73 65 20 74 68 65 20 0a 20 20 2a 2a 20 57 52  use the .  ** WR
15260 49 54 45 52 2c 20 43 48 45 43 4b 50 4f 49 4e 54  ITER, CHECKPOINT
15270 20 61 6e 64 20 52 45 41 44 30 20 6c 6f 63 6b 73   and READ0 locks
15280 20 61 72 65 20 73 74 69 6c 6c 20 68 65 6c 64 2c   are still held,
15290 20 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 63   it is safe to c
152a0 6f 70 79 20 0a 20 20 2a 2a 20 64 61 74 61 20 66  opy .  ** data f
152b0 72 6f 6d 20 74 68 65 20 77 61 6c 20 66 69 6c 65  rom the wal file
152c0 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
152d0 73 65 20 66 69 6c 65 20 61 63 63 6f 72 64 69 6e  se file accordin
152e0 67 20 74 6f 20 74 68 65 20 0a 20 20 2a 2a 20 63  g to the .  ** c
152f0 6f 6e 74 65 6e 74 73 20 6f 66 20 61 46 72 61 6d  ontents of aFram
15300 65 5b 5d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  e[]..  */.  if( 
15310 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
15320 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b   ){.    int rc2;
15330 0a 20 20 20 20 70 2d 3e 65 53 74 61 67 65 20 3d  .    p->eStage =
15340 20 52 42 55 5f 53 54 41 47 45 5f 43 41 50 54 55   RBU_STAGE_CAPTU
15350 52 45 3b 0a 20 20 20 20 72 63 32 20 3d 20 73 71  RE;.    rc2 = sq
15360 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62  lite3_exec(p->db
15370 4d 61 69 6e 2c 20 22 50 52 41 47 4d 41 20 6d 61  Main, "PRAGMA ma
15380 69 6e 2e 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  in.wal_checkpoin
15390 74 3d 72 65 73 74 61 72 74 22 2c 20 30 2c 20 30  t=restart", 0, 0
153a0 2c 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 32  ,0);.    if( rc2
153b0 21 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41  !=SQLITE_INTERNA
153c0 4c 20 29 20 70 2d 3e 72 63 20 3d 20 72 63 32 3b  L ) p->rc = rc2;
153d0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72  .  }..  if( p->r
153e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
153f0 70 2d 3e 6e 46 72 61 6d 65 3e 30 20 29 7b 0a 20  p->nFrame>0 ){. 
15400 20 20 20 70 2d 3e 65 53 74 61 67 65 20 3d 20 52     p->eStage = R
15410 42 55 5f 53 54 41 47 45 5f 43 4b 50 54 3b 0a 20  BU_STAGE_CKPT;. 
15420 20 20 20 70 2d 3e 6e 53 74 65 70 20 3d 20 28 70     p->nStep = (p
15430 53 74 61 74 65 20 3f 20 70 53 74 61 74 65 2d 3e  State ? pState->
15440 6e 52 6f 77 20 3a 20 30 29 3b 0a 20 20 20 20 70  nRow : 0);.    p
15450 2d 3e 61 42 75 66 20 3d 20 72 62 75 4d 61 6c 6c  ->aBuf = rbuMall
15460 6f 63 28 70 2c 20 70 2d 3e 70 67 73 7a 29 3b 0a  oc(p, p->pgsz);.
15470 20 20 20 20 70 2d 3e 69 57 61 6c 43 6b 73 75 6d      p->iWalCksum
15480 20 3d 20 72 62 75 53 68 6d 43 68 65 63 6b 73 75   = rbuShmChecksu
15490 6d 28 70 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  m(p);.  }..  if(
154a0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
154b0 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  K ){.    if( p->
154c0 6e 46 72 61 6d 65 3d 3d 30 20 7c 7c 20 28 70 53  nFrame==0 || (pS
154d0 74 61 74 65 20 26 26 20 70 53 74 61 74 65 2d 3e  tate && pState->
154e0 69 57 61 6c 43 6b 73 75 6d 21 3d 70 2d 3e 69 57  iWalCksum!=p->iW
154f0 61 6c 43 6b 73 75 6d 29 20 29 7b 0a 20 20 20 20  alCksum) ){.    
15500 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
15510 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20 70 2d 3e  _DONE;.      p->
15520 65 53 74 61 67 65 20 3d 20 52 42 55 5f 53 54 41  eStage = RBU_STA
15530 47 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20  GE_DONE;.    }. 
15540 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c   }.}../*.** Call
15550 65 64 20 77 68 65 6e 20 69 41 6d 74 20 62 79 74  ed when iAmt byt
15560 65 73 20 61 72 65 20 72 65 61 64 20 66 72 6f 6d  es are read from
15570 20 6f 66 66 73 65 74 20 69 4f 66 66 20 6f 66 20   offset iOff of 
15580 74 68 65 20 77 61 6c 20 66 69 6c 65 20 77 68 69  the wal file whi
15590 6c 65 0a 2a 2a 20 74 68 65 20 72 62 75 20 6f 62  le.** the rbu ob
155a0 6a 65 63 74 20 69 73 20 69 6e 20 63 61 70 74 75  ject is in captu
155b0 72 65 20 6d 6f 64 65 2e 20 52 65 63 6f 72 64 20  re mode. Record 
155c0 74 68 65 20 66 72 61 6d 65 20 6e 75 6d 62 65 72  the frame number
155d0 20 6f 66 20 74 68 65 20 66 72 61 6d 65 0a 2a 2a   of the frame.**
155e0 20 62 65 69 6e 67 20 72 65 61 64 20 69 6e 20 74   being read in t
155f0 68 65 20 61 46 72 61 6d 65 5b 5d 20 61 72 72 61  he aFrame[] arra
15600 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
15610 20 72 62 75 43 61 70 74 75 72 65 57 61 6c 52 65   rbuCaptureWalRe
15620 61 64 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70  ad(sqlite3rbu *p
15630 52 62 75 2c 20 69 36 34 20 69 4f 66 66 2c 20 69  Rbu, i64 iOff, i
15640 6e 74 20 69 41 6d 74 29 7b 0a 20 20 63 6f 6e 73  nt iAmt){.  cons
15650 74 20 75 33 32 20 6d 52 65 71 20 3d 20 28 31 3c  t u32 mReq = (1<
15660 3c 57 41 4c 5f 4c 4f 43 4b 5f 57 52 49 54 45 29  <WAL_LOCK_WRITE)
15670 7c 28 31 3c 3c 57 41 4c 5f 4c 4f 43 4b 5f 43 4b  |(1<<WAL_LOCK_CK
15680 50 54 29 7c 28 31 3c 3c 57 41 4c 5f 4c 4f 43 4b  PT)|(1<<WAL_LOCK
15690 5f 52 45 41 44 30 29 3b 0a 20 20 75 33 32 20 69  _READ0);.  u32 i
156a0 46 72 61 6d 65 3b 0a 0a 20 20 69 66 28 20 70 52  Frame;..  if( pR
156b0 62 75 2d 3e 6d 4c 6f 63 6b 21 3d 6d 52 65 71 20  bu->mLock!=mReq 
156c0 29 7b 0a 20 20 20 20 70 52 62 75 2d 3e 72 63 20  ){.    pRbu->rc 
156d0 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
156e0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
156f0 5f 49 4e 54 45 52 4e 41 4c 3b 0a 20 20 7d 0a 0a  _INTERNAL;.  }..
15700 20 20 70 52 62 75 2d 3e 70 67 73 7a 20 3d 20 69    pRbu->pgsz = i
15710 41 6d 74 3b 0a 20 20 69 66 28 20 70 52 62 75 2d  Amt;.  if( pRbu-
15720 3e 6e 46 72 61 6d 65 3d 3d 70 52 62 75 2d 3e 6e  >nFrame==pRbu->n
15730 46 72 61 6d 65 41 6c 6c 6f 63 20 29 7b 0a 20 20  FrameAlloc ){.  
15740 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 28 70 52    int nNew = (pR
15750 62 75 2d 3e 6e 46 72 61 6d 65 41 6c 6c 6f 63 20  bu->nFrameAlloc 
15760 3f 20 70 52 62 75 2d 3e 6e 46 72 61 6d 65 41 6c  ? pRbu->nFrameAl
15770 6c 6f 63 20 3a 20 36 34 29 20 2a 20 32 3b 0a 20  loc : 64) * 2;. 
15780 20 20 20 52 62 75 46 72 61 6d 65 20 2a 61 4e 65     RbuFrame *aNe
15790 77 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20 28 52  w;.    aNew = (R
157a0 62 75 46 72 61 6d 65 2a 29 73 71 6c 69 74 65 33  buFrame*)sqlite3
157b0 5f 72 65 61 6c 6c 6f 63 36 34 28 70 52 62 75 2d  _realloc64(pRbu-
157c0 3e 61 46 72 61 6d 65 2c 20 6e 4e 65 77 20 2a 20  >aFrame, nNew * 
157d0 73 69 7a 65 6f 66 28 52 62 75 46 72 61 6d 65 29  sizeof(RbuFrame)
157e0 29 3b 0a 20 20 20 20 69 66 28 20 61 4e 65 77 3d  );.    if( aNew=
157f0 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
15800 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 70 52  TE_NOMEM;.    pR
15810 62 75 2d 3e 61 46 72 61 6d 65 20 3d 20 61 4e 65  bu->aFrame = aNe
15820 77 3b 0a 20 20 20 20 70 52 62 75 2d 3e 6e 46 72  w;.    pRbu->nFr
15830 61 6d 65 41 6c 6c 6f 63 20 3d 20 6e 4e 65 77 3b  ameAlloc = nNew;
15840 0a 20 20 7d 0a 0a 20 20 69 46 72 61 6d 65 20 3d  .  }..  iFrame =
15850 20 28 75 33 32 29 28 28 69 4f 66 66 2d 33 32 29   (u32)((iOff-32)
15860 20 2f 20 28 69 36 34 29 28 69 41 6d 74 2b 32 34   / (i64)(iAmt+24
15870 29 29 20 2b 20 31 3b 0a 20 20 69 66 28 20 70 52  )) + 1;.  if( pR
15880 62 75 2d 3e 69 4d 61 78 46 72 61 6d 65 3c 69 46  bu->iMaxFrame<iF
15890 72 61 6d 65 20 29 20 70 52 62 75 2d 3e 69 4d 61  rame ) pRbu->iMa
158a0 78 46 72 61 6d 65 20 3d 20 69 46 72 61 6d 65 3b  xFrame = iFrame;
158b0 0a 20 20 70 52 62 75 2d 3e 61 46 72 61 6d 65 5b  .  pRbu->aFrame[
158c0 70 52 62 75 2d 3e 6e 46 72 61 6d 65 5d 2e 69 57  pRbu->nFrame].iW
158d0 61 6c 46 72 61 6d 65 20 3d 20 69 46 72 61 6d 65  alFrame = iFrame
158e0 3b 0a 20 20 70 52 62 75 2d 3e 61 46 72 61 6d 65  ;.  pRbu->aFrame
158f0 5b 70 52 62 75 2d 3e 6e 46 72 61 6d 65 5d 2e 69  [pRbu->nFrame].i
15900 44 62 50 61 67 65 20 3d 20 30 3b 0a 20 20 70 52  DbPage = 0;.  pR
15910 62 75 2d 3e 6e 46 72 61 6d 65 2b 2b 3b 0a 20 20  bu->nFrame++;.  
15920 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
15930 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 65  ;.}../*.** Calle
15940 64 20 77 68 65 6e 20 61 20 70 61 67 65 20 6f 66  d when a page of
15950 20 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e   data is written
15960 20 74 6f 20 6f 66 66 73 65 74 20 69 4f 66 66 20   to offset iOff 
15970 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  of the database.
15980 2a 2a 20 66 69 6c 65 20 77 68 69 6c 65 20 74 68  ** file while th
15990 65 20 72 62 75 20 68 61 6e 64 6c 65 20 69 73 20  e rbu handle is 
159a0 69 6e 20 63 61 70 74 75 72 65 20 6d 6f 64 65 2e  in capture mode.
159b0 20 52 65 63 6f 72 64 20 74 68 65 20 70 61 67 65   Record the page
159c0 20 6e 75 6d 62 65 72 20 0a 2a 2a 20 6f 66 20 74   number .** of t
159d0 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 77 72  he page being wr
159e0 69 74 74 65 6e 20 69 6e 20 74 68 65 20 61 46 72  itten in the aFr
159f0 61 6d 65 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a  ame[] array..*/.
15a00 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 43 61  static int rbuCa
15a10 70 74 75 72 65 44 62 57 72 69 74 65 28 73 71 6c  ptureDbWrite(sql
15a20 69 74 65 33 72 62 75 20 2a 70 52 62 75 2c 20 69  ite3rbu *pRbu, i
15a30 36 34 20 69 4f 66 66 29 7b 0a 20 20 70 52 62 75  64 iOff){.  pRbu
15a40 2d 3e 61 46 72 61 6d 65 5b 70 52 62 75 2d 3e 6e  ->aFrame[pRbu->n
15a50 46 72 61 6d 65 2d 31 5d 2e 69 44 62 50 61 67 65  Frame-1].iDbPage
15a60 20 3d 20 28 75 33 32 29 28 69 4f 66 66 20 2f 20   = (u32)(iOff / 
15a70 70 52 62 75 2d 3e 70 67 73 7a 29 20 2b 20 31 3b  pRbu->pgsz) + 1;
15a80 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
15a90 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
15aa0 69 73 20 69 73 20 63 61 6c 6c 65 64 20 61 73 20  is is called as 
15ab0 70 61 72 74 20 6f 66 20 61 6e 20 69 6e 63 72 65  part of an incre
15ac0 6d 65 6e 74 61 6c 20 63 68 65 63 6b 70 6f 69 6e  mental checkpoin
15ad0 74 20 6f 70 65 72 61 74 69 6f 6e 2e 20 43 6f 70  t operation. Cop
15ae0 79 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 66 72  y.** a single fr
15af0 61 6d 65 20 6f 66 20 64 61 74 61 20 66 72 6f 6d  ame of data from
15b00 20 74 68 65 20 77 61 6c 20 66 69 6c 65 20 69 6e   the wal file in
15b10 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
15b20 66 69 6c 65 2c 20 61 73 0a 2a 2a 20 69 6e 64 69  file, as.** indi
15b30 63 61 74 65 64 20 62 79 20 74 68 65 20 52 62 75  cated by the Rbu
15b40 46 72 61 6d 65 20 6f 62 6a 65 63 74 2e 0a 2a 2f  Frame object..*/
15b50 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75  .static void rbu
15b60 43 68 65 63 6b 70 6f 69 6e 74 46 72 61 6d 65 28  CheckpointFrame(
15b70 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 52  sqlite3rbu *p, R
15b80 62 75 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 29  buFrame *pFrame)
15b90 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  {.  sqlite3_file
15ba0 20 2a 70 57 61 6c 20 3d 20 70 2d 3e 70 54 61 72   *pWal = p->pTar
15bb0 67 65 74 46 64 2d 3e 70 57 61 6c 46 64 2d 3e 70  getFd->pWalFd->p
15bc0 52 65 61 6c 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Real;.  sqlite3_
15bd0 66 69 6c 65 20 2a 70 44 62 20 3d 20 70 2d 3e 70  file *pDb = p->p
15be0 54 61 72 67 65 74 46 64 2d 3e 70 52 65 61 6c 3b  TargetFd->pReal;
15bf0 0a 20 20 69 36 34 20 69 4f 66 66 3b 0a 0a 20 20  .  i64 iOff;..  
15c00 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53  assert( p->rc==S
15c10 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 4f  QLITE_OK );.  iO
15c20 66 66 20 3d 20 28 69 36 34 29 28 70 46 72 61 6d  ff = (i64)(pFram
15c30 65 2d 3e 69 57 61 6c 46 72 61 6d 65 2d 31 29 20  e->iWalFrame-1) 
15c40 2a 20 28 70 2d 3e 70 67 73 7a 20 2b 20 32 34 29  * (p->pgsz + 24)
15c50 20 2b 20 33 32 20 2b 20 32 34 3b 0a 20 20 70 2d   + 32 + 24;.  p-
15c60 3e 72 63 20 3d 20 70 57 61 6c 2d 3e 70 4d 65 74  >rc = pWal->pMet
15c70 68 6f 64 73 2d 3e 78 52 65 61 64 28 70 57 61 6c  hods->xRead(pWal
15c80 2c 20 70 2d 3e 61 42 75 66 2c 20 70 2d 3e 70 67  , p->aBuf, p->pg
15c90 73 7a 2c 20 69 4f 66 66 29 3b 0a 20 20 69 66 28  sz, iOff);.  if(
15ca0 20 70 2d 3e 72 63 20 29 20 72 65 74 75 72 6e 3b   p->rc ) return;
15cb0 0a 0a 20 20 69 4f 66 66 20 3d 20 28 69 36 34 29  ..  iOff = (i64)
15cc0 28 70 46 72 61 6d 65 2d 3e 69 44 62 50 61 67 65  (pFrame->iDbPage
15cd0 2d 31 29 20 2a 20 70 2d 3e 70 67 73 7a 3b 0a 20  -1) * p->pgsz;. 
15ce0 20 70 2d 3e 72 63 20 3d 20 70 44 62 2d 3e 70 4d   p->rc = pDb->pM
15cf0 65 74 68 6f 64 73 2d 3e 78 57 72 69 74 65 28 70  ethods->xWrite(p
15d00 44 62 2c 20 70 2d 3e 61 42 75 66 2c 20 70 2d 3e  Db, p->aBuf, p->
15d10 70 67 73 7a 2c 20 69 4f 66 66 29 3b 0a 7d 0a 0a  pgsz, iOff);.}..
15d20 0a 2f 2a 0a 2a 2a 20 54 61 6b 65 20 61 6e 20 45  ./*.** Take an E
15d30 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
15d40 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
15d50 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  le..*/.static vo
15d60 69 64 20 72 62 75 4c 6f 63 6b 44 61 74 61 62 61  id rbuLockDataba
15d70 73 65 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70  se(sqlite3rbu *p
15d80 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  ){.  sqlite3_fil
15d90 65 20 2a 70 52 65 61 6c 20 3d 20 70 2d 3e 70 54  e *pReal = p->pT
15da0 61 72 67 65 74 46 64 2d 3e 70 52 65 61 6c 3b 0a  argetFd->pReal;.
15db0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d    assert( p->rc=
15dc0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
15dd0 70 2d 3e 72 63 20 3d 20 70 52 65 61 6c 2d 3e 70  p->rc = pReal->p
15de0 4d 65 74 68 6f 64 73 2d 3e 78 4c 6f 63 6b 28 70  Methods->xLock(p
15df0 52 65 61 6c 2c 20 53 51 4c 49 54 45 5f 4c 4f 43  Real, SQLITE_LOC
15e00 4b 5f 53 48 41 52 45 44 29 3b 0a 20 20 69 66 28  K_SHARED);.  if(
15e10 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
15e20 4b 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  K ){.    p->rc =
15e30 20 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73   pReal->pMethods
15e40 2d 3e 78 4c 6f 63 6b 28 70 52 65 61 6c 2c 20 53  ->xLock(pReal, S
15e50 51 4c 49 54 45 5f 4c 4f 43 4b 5f 45 58 43 4c 55  QLITE_LOCK_EXCLU
15e60 53 49 56 45 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69  SIVE);.  }.}..#i
15e70 66 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32  f defined(_WIN32
15e80 5f 57 43 45 29 0a 73 74 61 74 69 63 20 4c 50 57  _WCE).static LPW
15e90 53 54 52 20 72 62 75 57 69 6e 55 74 66 38 54 6f  STR rbuWinUtf8To
15ea0 55 6e 69 63 6f 64 65 28 63 6f 6e 73 74 20 63 68  Unicode(const ch
15eb0 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a  ar *zFilename){.
15ec0 20 20 69 6e 74 20 6e 43 68 61 72 3b 0a 20 20 4c    int nChar;.  L
15ed0 50 57 53 54 52 20 7a 57 69 64 65 46 69 6c 65 6e  PWSTR zWideFilen
15ee0 61 6d 65 3b 0a 0a 20 20 6e 43 68 61 72 20 3d 20  ame;..  nChar = 
15ef0 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43  MultiByteToWideC
15f00 68 61 72 28 43 50 5f 55 54 46 38 2c 20 30 2c 20  har(CP_UTF8, 0, 
15f10 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 4e  zFilename, -1, N
15f20 55 4c 4c 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e  ULL, 0);.  if( n
15f30 43 68 61 72 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Char==0 ){.    r
15f40 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a  eturn 0;.  }.  z
15f50 57 69 64 65 46 69 6c 65 6e 61 6d 65 20 3d 20 73  WideFilename = s
15f60 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28  qlite3_malloc64(
15f70 20 6e 43 68 61 72 2a 73 69 7a 65 6f 66 28 7a 57   nChar*sizeof(zW
15f80 69 64 65 46 69 6c 65 6e 61 6d 65 5b 30 5d 29 20  ideFilename[0]) 
15f90 29 3b 0a 20 20 69 66 28 20 7a 57 69 64 65 46 69  );.  if( zWideFi
15fa0 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  lename==0 ){.   
15fb0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
15fc0 20 6d 65 6d 73 65 74 28 7a 57 69 64 65 46 69 6c   memset(zWideFil
15fd0 65 6e 61 6d 65 2c 20 30 2c 20 6e 43 68 61 72 2a  ename, 0, nChar*
15fe0 73 69 7a 65 6f 66 28 7a 57 69 64 65 46 69 6c 65  sizeof(zWideFile
15ff0 6e 61 6d 65 5b 30 5d 29 29 3b 0a 20 20 6e 43 68  name[0]));.  nCh
16000 61 72 20 3d 20 4d 75 6c 74 69 42 79 74 65 54 6f  ar = MultiByteTo
16010 57 69 64 65 43 68 61 72 28 43 50 5f 55 54 46 38  WideChar(CP_UTF8
16020 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20  , 0, zFilename, 
16030 2d 31 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d  -1, zWideFilenam
16040 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
16050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16060 20 20 20 6e 43 68 61 72 29 3b 0a 20 20 69 66 28     nChar);.  if(
16070 20 6e 43 68 61 72 3d 3d 30 20 29 7b 0a 20 20 20   nChar==0 ){.   
16080 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 57   sqlite3_free(zW
16090 69 64 65 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  ideFilename);.  
160a0 20 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 20    zWideFilename 
160b0 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
160c0 6e 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 3b  n zWideFilename;
160d0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
160e0 20 54 68 65 20 52 42 55 20 68 61 6e 64 6c 65 20   The RBU handle 
160f0 69 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  is currently in 
16100 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20 73 74  RBU_STAGE_OAL st
16110 61 74 65 2c 20 77 69 74 68 20 61 20 53 48 41 52  ate, with a SHAR
16120 45 44 20 6c 6f 63 6b 0a 2a 2a 20 6f 6e 20 74 68  ED lock.** on th
16130 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
16140 20 54 68 69 73 20 70 72 6f 63 20 6d 6f 76 65 73   This proc moves
16150 20 74 68 65 20 2a 2d 6f 61 6c 20 66 69 6c 65 20   the *-oal file 
16160 74 6f 20 74 68 65 20 2a 2d 77 61 6c 20 70 61 74  to the *-wal pat
16170 68 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 6f 70 65  h,.** then reope
16180 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ns the database 
16190 66 69 6c 65 20 28 74 68 69 73 20 74 69 6d 65 20  file (this time 
161a0 69 6e 20 76 61 6e 69 6c 6c 61 2c 20 6e 6f 6e 2d  in vanilla, non-
161b0 6f 61 6c 2c 20 57 41 4c 20 6d 6f 64 65 29 2e 0a  oal, WAL mode)..
161c0 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
161d0 63 63 75 72 73 2c 20 6c 65 61 76 65 20 61 6e 20  ccurs, leave an 
161e0 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 65  error code and e
161f0 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20  rror message in 
16200 74 68 65 20 72 62 75 20 0a 2a 2a 20 68 61 6e 64  the rbu .** hand
16210 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  le..*/.static vo
16220 69 64 20 72 62 75 4d 6f 76 65 4f 61 6c 46 69 6c  id rbuMoveOalFil
16230 65 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 29  e(sqlite3rbu *p)
16240 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
16250 7a 42 61 73 65 20 3d 20 73 71 6c 69 74 65 33 5f  zBase = sqlite3_
16260 64 62 5f 66 69 6c 65 6e 61 6d 65 28 70 2d 3e 64  db_filename(p->d
16270 62 4d 61 69 6e 2c 20 22 6d 61 69 6e 22 29 3b 0a  bMain, "main");.
16280 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d    const char *zM
16290 6f 76 65 20 3d 20 7a 42 61 73 65 3b 0a 20 20 63  ove = zBase;.  c
162a0 68 61 72 20 2a 7a 4f 61 6c 3b 0a 20 20 63 68 61  har *zOal;.  cha
162b0 72 20 2a 7a 57 61 6c 3b 0a 0a 20 20 69 66 28 20  r *zWal;..  if( 
162c0 72 62 75 49 73 56 61 63 75 75 6d 28 70 29 20 29  rbuIsVacuum(p) )
162d0 7b 0a 20 20 20 20 7a 4d 6f 76 65 20 3d 20 73 71  {.    zMove = sq
162e0 6c 69 74 65 33 5f 64 62 5f 66 69 6c 65 6e 61 6d  lite3_db_filenam
162f0 65 28 70 2d 3e 64 62 52 62 75 2c 20 22 6d 61 69  e(p->dbRbu, "mai
16300 6e 22 29 3b 0a 20 20 7d 0a 20 20 7a 4f 61 6c 20  n");.  }.  zOal 
16310 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
16320 66 28 22 25 73 2d 6f 61 6c 22 2c 20 7a 4d 6f 76  f("%s-oal", zMov
16330 65 29 3b 0a 20 20 7a 57 61 6c 20 3d 20 73 71 6c  e);.  zWal = sql
16340 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
16350 2d 77 61 6c 22 2c 20 7a 4d 6f 76 65 29 3b 0a 0a  -wal", zMove);..
16360 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 53 74    assert( p->eSt
16370 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4d  age==RBU_STAGE_M
16380 4f 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OVE );.  assert(
16390 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
163a0 4b 20 26 26 20 70 2d 3e 7a 45 72 72 6d 73 67 3d  K && p->zErrmsg=
163b0 3d 30 20 29 3b 0a 20 20 69 66 28 20 7a 57 61 6c  =0 );.  if( zWal
163c0 3d 3d 30 20 7c 7c 20 7a 4f 61 6c 3d 3d 30 20 29  ==0 || zOal==0 )
163d0 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51  {.    p->rc = SQ
163e0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65  LITE_NOMEM;.  }e
163f0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4d 6f 76 65  lse{.    /* Move
16400 20 74 68 65 20 2a 2d 6f 61 6c 20 66 69 6c 65 20   the *-oal file 
16410 74 6f 20 2a 2d 77 61 6c 2e 20 41 74 20 74 68 69  to *-wal. At thi
16420 73 20 70 6f 69 6e 74 20 63 6f 6e 6e 65 63 74 69  s point connecti
16430 6f 6e 20 70 2d 3e 64 62 20 69 73 0a 20 20 20 20  on p->db is.    
16440 2a 2a 20 68 6f 6c 64 69 6e 67 20 61 20 53 48 41  ** holding a SHA
16450 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  RED lock on the 
16460 74 61 72 67 65 74 20 64 61 74 61 62 61 73 65 20  target database 
16470 66 69 6c 65 20 28 62 65 63 61 75 73 65 20 69 74  file (because it
16480 20 69 73 0a 20 20 20 20 2a 2a 20 69 6e 20 57 41   is.    ** in WA
16490 4c 20 6d 6f 64 65 29 2e 20 53 6f 20 6e 6f 20 6f  L mode). So no o
164a0 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ther connection 
164b0 6d 61 79 20 62 65 20 77 72 69 74 69 6e 67 20 74  may be writing t
164c0 68 65 20 64 62 2e 20 0a 20 20 20 20 2a 2a 0a 20  he db. .    **. 
164d0 20 20 20 2a 2a 20 49 6e 20 6f 72 64 65 72 20 74     ** In order t
164e0 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68  o ensure that th
164f0 65 72 65 20 61 72 65 20 6e 6f 20 64 61 74 61 62  ere are no datab
16500 61 73 65 20 72 65 61 64 65 72 73 2c 20 61 6e 20  ase readers, an 
16510 45 58 43 4c 55 53 49 56 45 0a 20 20 20 20 2a 2a  EXCLUSIVE.    **
16520 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65   lock is obtaine
16530 64 20 68 65 72 65 20 62 65 66 6f 72 65 20 74 68  d here before th
16540 65 20 2a 2d 6f 61 6c 20 69 73 20 6d 6f 76 65 64  e *-oal is moved
16550 20 74 6f 20 2a 2d 77 61 6c 2e 0a 20 20 20 20 2a   to *-wal..    *
16560 2f 0a 20 20 20 20 72 62 75 4c 6f 63 6b 44 61 74  /.    rbuLockDat
16570 61 62 61 73 65 28 70 29 3b 0a 20 20 20 20 69 66  abase(p);.    if
16580 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
16590 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 62 75 46  OK ){.      rbuF
165a0 69 6c 65 53 75 66 66 69 78 33 28 7a 42 61 73 65  ileSuffix3(zBase
165b0 2c 20 7a 57 61 6c 29 3b 0a 20 20 20 20 20 20 72  , zWal);.      r
165c0 62 75 46 69 6c 65 53 75 66 66 69 78 33 28 7a 42  buFileSuffix3(zB
165d0 61 73 65 2c 20 7a 4f 61 6c 29 3b 0a 0a 20 20 20  ase, zOal);..   
165e0 20 20 20 2f 2a 20 52 65 2d 6f 70 65 6e 20 74 68     /* Re-open th
165f0 65 20 64 61 74 61 62 61 73 65 73 2e 20 2a 2f 0a  e databases. */.
16600 20 20 20 20 20 20 72 62 75 4f 62 6a 49 74 65 72        rbuObjIter
16610 46 69 6e 61 6c 69 7a 65 28 26 70 2d 3e 6f 62 6a  Finalize(&p->obj
16620 69 74 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  iter);.      sql
16630 69 74 65 33 5f 63 6c 6f 73 65 28 70 2d 3e 64 62  ite3_close(p->db
16640 52 62 75 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Rbu);.      sqli
16650 74 65 33 5f 63 6c 6f 73 65 28 70 2d 3e 64 62 4d  te3_close(p->dbM
16660 61 69 6e 29 3b 0a 20 20 20 20 20 20 70 2d 3e 64  ain);.      p->d
16670 62 4d 61 69 6e 20 3d 20 30 3b 0a 20 20 20 20 20  bMain = 0;.     
16680 20 70 2d 3e 64 62 52 62 75 20 3d 20 30 3b 0a 0a   p->dbRbu = 0;..
16690 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57 49 4e  #if defined(_WIN
166a0 33 32 5f 57 43 45 29 0a 20 20 20 20 20 20 7b 0a  32_WCE).      {.
166b0 20 20 20 20 20 20 20 20 4c 50 57 53 54 52 20 7a          LPWSTR z
166c0 57 69 64 65 4f 61 6c 3b 0a 20 20 20 20 20 20 20  WideOal;.       
166d0 20 4c 50 57 53 54 52 20 7a 57 69 64 65 57 61 6c   LPWSTR zWideWal
166e0 3b 0a 0a 20 20 20 20 20 20 20 20 7a 57 69 64 65  ;..        zWide
166f0 4f 61 6c 20 3d 20 72 62 75 57 69 6e 55 74 66 38  Oal = rbuWinUtf8
16700 54 6f 55 6e 69 63 6f 64 65 28 7a 4f 61 6c 29 3b  ToUnicode(zOal);
16710 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 57 69  .        if( zWi
16720 64 65 4f 61 6c 20 29 7b 0a 20 20 20 20 20 20 20  deOal ){.       
16730 20 20 20 7a 57 69 64 65 57 61 6c 20 3d 20 72 62     zWideWal = rb
16740 75 57 69 6e 55 74 66 38 54 6f 55 6e 69 63 6f 64  uWinUtf8ToUnicod
16750 65 28 7a 57 61 6c 29 3b 0a 20 20 20 20 20 20 20  e(zWal);.       
16760 20 20 20 69 66 28 20 7a 57 69 64 65 57 61 6c 20     if( zWideWal 
16770 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
16780 66 28 20 4d 6f 76 65 46 69 6c 65 57 28 7a 57 69  f( MoveFileW(zWi
16790 64 65 4f 61 6c 2c 20 7a 57 69 64 65 57 61 6c 29  deOal, zWideWal)
167a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
167b0 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
167c0 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  _OK;.           
167d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
167e0 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51        p->rc = SQ
167f0 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20  LITE_IOERR;.    
16800 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
16810 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
16820 65 65 28 7a 57 69 64 65 57 61 6c 29 3b 0a 20 20  ee(zWideWal);.  
16830 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
16840 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63             p->rc
16850 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
16860 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20  NOMEM;.         
16870 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c   }.          sql
16880 69 74 65 33 5f 66 72 65 65 28 7a 57 69 64 65 4f  ite3_free(zWideO
16890 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  al);.        }el
168a0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d  se{.          p-
168b0 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45  >rc = SQLITE_IOE
168c0 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  RR_NOMEM;.      
168d0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6c 73    }.      }.#els
168e0 65 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20  e.      p->rc = 
168f0 72 65 6e 61 6d 65 28 7a 4f 61 6c 2c 20 7a 57 61  rename(zOal, zWa
16900 6c 29 20 3f 20 53 51 4c 49 54 45 5f 49 4f 45 52  l) ? SQLITE_IOER
16910 52 20 3a 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23  R : SQLITE_OK;.#
16920 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 69 66 28  endif..      if(
16930 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
16940 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 62 75  K ){.        rbu
16950 4f 70 65 6e 44 61 74 61 62 61 73 65 28 70 2c 20  OpenDatabase(p, 
16960 30 29 3b 0a 20 20 20 20 20 20 20 20 72 62 75 53  0);.        rbuS
16970 65 74 75 70 43 68 65 63 6b 70 6f 69 6e 74 28 70  etupCheckpoint(p
16980 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
16990 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74    }.  }..  sqlit
169a0 65 33 5f 66 72 65 65 28 7a 57 61 6c 29 3b 0a 20  e3_free(zWal);. 
169b0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f   sqlite3_free(zO
169c0 61 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  al);.}../*.** Th
169d0 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
169e0 6e 74 20 69 74 65 72 61 74 69 6e 67 20 74 68 72  nt iterating thr
169f0 6f 75 67 68 20 74 68 65 20 6b 65 79 73 20 66 6f  ough the keys fo
16a00 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 6f 62  r the current ob
16a10 6a 65 63 74 0a 2a 2a 20 28 70 2d 3e 6f 62 6a 69  ject.** (p->obji
16a20 74 65 72 2e 70 53 65 6c 65 63 74 29 20 63 75 72  ter.pSelect) cur
16a30 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f  rently points to
16a40 20 61 20 76 61 6c 69 64 20 72 6f 77 2e 20 54 68   a valid row. Th
16a50 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 64  is function.** d
16a60 65 74 65 72 6d 69 6e 65 73 20 74 68 65 20 74 79  etermines the ty
16a70 70 65 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 20  pe of operation 
16a80 72 65 71 75 65 73 74 65 64 20 62 79 20 74 68 69  requested by thi
16a90 73 20 72 6f 77 20 61 6e 64 20 72 65 74 75 72 6e  s row and return
16aa0 73 0a 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20  s.** one of the 
16ab0 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 6c 75 65 73  following values
16ac0 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 65   to indicate the
16ad0 20 72 65 73 75 6c 74 3a 0a 2a 2a 0a 2a 2a 20 20   result:.**.**  
16ae0 20 20 20 2a 20 52 42 55 5f 49 4e 53 45 52 54 0a     * RBU_INSERT.
16af0 2a 2a 20 20 20 20 20 2a 20 52 42 55 5f 44 45 4c  **     * RBU_DEL
16b00 45 54 45 0a 2a 2a 20 20 20 20 20 2a 20 52 42 55  ETE.**     * RBU
16b10 5f 49 44 58 5f 44 45 4c 45 54 45 0a 2a 2a 20 20  _IDX_DELETE.**  
16b20 20 20 20 2a 20 52 42 55 5f 55 50 44 41 54 45 0a     * RBU_UPDATE.
16b30 2a 2a 0a 2a 2a 20 49 66 20 52 42 55 5f 55 50 44  **.** If RBU_UPD
16b40 41 54 45 20 69 73 20 72 65 74 75 72 6e 65 64 2c  ATE is returned,
16b50 20 74 68 65 6e 20 6f 75 74 70 75 74 20 76 61 72   then output var
16b60 69 61 62 6c 65 20 2a 70 7a 4d 61 73 6b 20 69 73  iable *pzMask is
16b70 20 73 65 74 20 74 6f 0a 2a 2a 20 70 6f 69 6e 74   set to.** point
16b80 20 74 6f 20 74 68 65 20 74 65 78 74 20 76 61 6c   to the text val
16b90 75 65 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68  ue indicating th
16ba0 65 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 75 70 64  e columns to upd
16bb0 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ate..**.** If th
16bc0 65 20 72 62 75 5f 63 6f 6e 74 72 6f 6c 20 66 69  e rbu_control fi
16bd0 65 6c 64 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20  eld contains an 
16be0 69 6e 76 61 6c 69 64 20 76 61 6c 75 65 2c 20 61  invalid value, a
16bf0 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64  n error code and
16c00 0a 2a 2a 20 6d 65 73 73 61 67 65 20 61 72 65 20  .** message are 
16c10 6c 65 66 74 20 69 6e 20 74 68 65 20 52 42 55 20  left in the RBU 
16c20 68 61 6e 64 6c 65 20 61 6e 64 20 7a 65 72 6f 20  handle and zero 
16c30 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
16c40 74 69 63 20 69 6e 74 20 72 62 75 53 74 65 70 54  tic int rbuStepT
16c50 79 70 65 28 73 71 6c 69 74 65 33 72 62 75 20 2a  ype(sqlite3rbu *
16c60 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a  p, const char **
16c70 70 7a 4d 61 73 6b 29 7b 0a 20 20 69 6e 74 20 69  pzMask){.  int i
16c80 43 6f 6c 20 3d 20 70 2d 3e 6f 62 6a 69 74 65 72  Col = p->objiter
16c90 2e 6e 43 6f 6c 3b 20 20 20 20 20 2f 2a 20 49 6e  .nCol;     /* In
16ca0 64 65 78 20 6f 66 20 72 62 75 5f 63 6f 6e 74 72  dex of rbu_contr
16cb0 6f 6c 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69  ol column */.  i
16cc0 6e 74 20 72 65 73 20 3d 20 30 3b 20 20 20 20 20  nt res = 0;     
16cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16ce0 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a  * Return value *
16cf0 2f 0a 0a 20 20 73 77 69 74 63 68 28 20 73 71 6c  /..  switch( sql
16d00 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65  ite3_column_type
16d10 28 70 2d 3e 6f 62 6a 69 74 65 72 2e 70 53 65 6c  (p->objiter.pSel
16d20 65 63 74 2c 20 69 43 6f 6c 29 20 29 7b 0a 20 20  ect, iCol) ){.  
16d30 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e    case SQLITE_IN
16d40 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 69  TEGER: {.      i
16d50 6e 74 20 69 56 61 6c 20 3d 20 73 71 6c 69 74 65  nt iVal = sqlite
16d60 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 2d 3e  3_column_int(p->
16d70 6f 62 6a 69 74 65 72 2e 70 53 65 6c 65 63 74 2c  objiter.pSelect,
16d80 20 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 73 77   iCol);.      sw
16d90 69 74 63 68 28 20 69 56 61 6c 20 29 7b 0a 20 20  itch( iVal ){.  
16da0 20 20 20 20 20 20 63 61 73 65 20 30 3a 20 72 65        case 0: re
16db0 73 20 3d 20 52 42 55 5f 49 4e 53 45 52 54 3b 20  s = RBU_INSERT; 
16dc0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
16dd0 20 20 20 63 61 73 65 20 31 3a 20 72 65 73 20 3d     case 1: res =
16de0 20 52 42 55 5f 44 45 4c 45 54 45 3b 20 20 20 20   RBU_DELETE;    
16df0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
16e00 63 61 73 65 20 32 3a 20 72 65 73 20 3d 20 52 42  case 2: res = RB
16e10 55 5f 52 45 50 4c 41 43 45 3b 20 20 20 20 62 72  U_REPLACE;    br
16e20 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73  eak;.        cas
16e30 65 20 33 3a 20 72 65 73 20 3d 20 52 42 55 5f 49  e 3: res = RBU_I
16e40 44 58 5f 44 45 4c 45 54 45 3b 20 62 72 65 61 6b  DX_DELETE; break
16e50 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 34  ;.        case 4
16e60 3a 20 72 65 73 20 3d 20 52 42 55 5f 49 44 58 5f  : res = RBU_IDX_
16e70 49 4e 53 45 52 54 3b 20 62 72 65 61 6b 3b 0a 20  INSERT; break;. 
16e80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
16e90 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63  ak;.    }..    c
16ea0 61 73 65 20 53 51 4c 49 54 45 5f 54 45 58 54 3a  ase SQLITE_TEXT:
16eb0 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75   {.      const u
16ec0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 20  nsigned char *z 
16ed0 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
16ee0 5f 74 65 78 74 28 70 2d 3e 6f 62 6a 69 74 65 72  _text(p->objiter
16ef0 2e 70 53 65 6c 65 63 74 2c 20 69 43 6f 6c 29 3b  .pSelect, iCol);
16f00 0a 20 20 20 20 20 20 69 66 28 20 7a 3d 3d 30 20  .      if( z==0 
16f10 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63  ){.        p->rc
16f20 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
16f30 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
16f40 20 20 20 20 20 20 2a 70 7a 4d 61 73 6b 20 3d 20        *pzMask = 
16f50 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a 3b 0a  (const char*)z;.
16f60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
16f70 73 20 3d 20 52 42 55 5f 55 50 44 41 54 45 3b 0a  s = RBU_UPDATE;.
16f80 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
16f90 20 20 7d 0a 0a 20 20 20 20 64 65 66 61 75 6c 74    }..    default
16fa0 3a 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  :.      break;. 
16fb0 20 7d 0a 0a 20 20 69 66 28 20 72 65 73 3d 3d 30   }..  if( res==0
16fc0 20 29 7b 0a 20 20 20 20 72 62 75 42 61 64 43 6f   ){.    rbuBadCo
16fd0 6e 74 72 6f 6c 45 72 72 6f 72 28 70 29 3b 0a 20  ntrolError(p);. 
16fe0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b   }.  return res;
16ff0 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
17000 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 41 73  E_DEBUG./*.** As
17010 73 65 72 74 20 74 68 61 74 20 63 6f 6c 75 6d 6e  sert that column
17020 20 69 43 6f 6c 20 6f 66 20 73 74 61 74 65 6d 65   iCol of stateme
17030 6e 74 20 70 53 74 6d 74 20 69 73 20 6e 61 6d 65  nt pStmt is name
17040 64 20 7a 4e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74  d zName..*/.stat
17050 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 43 6f  ic void assertCo
17060 6c 75 6d 6e 4e 61 6d 65 28 73 71 6c 69 74 65 33  lumnName(sqlite3
17070 5f 73 74 6d 74 20 2a 70 53 74 6d 74 2c 20 69 6e  _stmt *pStmt, in
17080 74 20 69 43 6f 6c 2c 20 63 6f 6e 73 74 20 63 68  t iCol, const ch
17090 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 63 6f  ar *zName){.  co
170a0 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 20 3d  nst char *zCol =
170b0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
170c0 6e 61 6d 65 28 70 53 74 6d 74 2c 20 69 43 6f 6c  name(pStmt, iCol
170d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d  );.  assert( 0==
170e0 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
170f0 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 20 29 3b 0a  zName, zCol) );.
17100 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
17110 20 61 73 73 65 72 74 43 6f 6c 75 6d 6e 4e 61 6d   assertColumnNam
17120 65 28 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 0a  e(x,y,z).#endif.
17130 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  ./*.** Argument 
17140 65 54 79 70 65 20 6d 75 73 74 20 62 65 20 6f 6e  eType must be on
17150 65 20 6f 66 20 52 42 55 5f 49 4e 53 45 52 54 2c  e of RBU_INSERT,
17160 20 52 42 55 5f 44 45 4c 45 54 45 2c 20 52 42 55   RBU_DELETE, RBU
17170 5f 49 44 58 5f 49 4e 53 45 52 54 20 6f 72 0a 2a  _IDX_INSERT or.*
17180 2a 20 52 42 55 5f 49 44 58 5f 44 45 4c 45 54 45  * RBU_IDX_DELETE
17190 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
171a0 70 65 72 66 6f 72 6d 73 20 74 68 65 20 77 6f 72  performs the wor
171b0 6b 20 6f 66 20 61 20 73 69 6e 67 6c 65 0a 2a 2a  k of a single.**
171c0 20 73 71 6c 69 74 65 33 72 62 75 5f 73 74 65 70   sqlite3rbu_step
171d0 28 29 20 63 61 6c 6c 20 66 6f 72 20 74 68 65 20  () call for the 
171e0 74 79 70 65 20 6f 66 20 6f 70 65 72 61 74 69 6f  type of operatio
171f0 6e 20 73 70 65 63 69 66 69 65 64 20 62 79 20 65  n specified by e
17200 54 79 70 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Type..*/.static 
17210 76 6f 69 64 20 72 62 75 53 74 65 70 4f 6e 65 4f  void rbuStepOneO
17220 70 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c  p(sqlite3rbu *p,
17230 20 69 6e 74 20 65 54 79 70 65 29 7b 0a 20 20 52   int eType){.  R
17240 62 75 4f 62 6a 49 74 65 72 20 2a 70 49 74 65 72  buObjIter *pIter
17250 20 3d 20 26 70 2d 3e 6f 62 6a 69 74 65 72 3b 0a   = &p->objiter;.
17260 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
17270 2a 70 56 61 6c 3b 0a 20 20 73 71 6c 69 74 65 33  *pVal;.  sqlite3
17280 5f 73 74 6d 74 20 2a 70 57 72 69 74 65 72 3b 0a  _stmt *pWriter;.
17290 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61 73 73 65    int i;..  asse
172a0 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rt( p->rc==SQLIT
172b0 45 5f 4f 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  E_OK );.  assert
172c0 28 20 65 54 79 70 65 21 3d 52 42 55 5f 44 45 4c  ( eType!=RBU_DEL
172d0 45 54 45 20 7c 7c 20 70 49 74 65 72 2d 3e 7a 49  ETE || pIter->zI
172e0 64 78 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  dx==0 );.  asser
172f0 74 28 20 65 54 79 70 65 3d 3d 52 42 55 5f 44 45  t( eType==RBU_DE
17300 4c 45 54 45 20 7c 7c 20 65 54 79 70 65 3d 3d 52  LETE || eType==R
17310 42 55 5f 49 44 58 5f 44 45 4c 45 54 45 0a 20 20  BU_IDX_DELETE.  
17320 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 52       || eType==R
17330 42 55 5f 49 4e 53 45 52 54 20 7c 7c 20 65 54 79  BU_INSERT || eTy
17340 70 65 3d 3d 52 42 55 5f 49 44 58 5f 49 4e 53 45  pe==RBU_IDX_INSE
17350 52 54 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  RT.  );..  /* If
17360 20 74 68 69 73 20 69 73 20 61 20 64 65 6c 65 74   this is a delet
17370 65 2c 20 64 65 63 72 65 6d 65 6e 74 20 6e 50 68  e, decrement nPh
17380 61 73 65 4f 6e 65 53 74 65 70 20 62 79 20 6e 49  aseOneStep by nI
17390 6e 64 65 78 2e 20 49 66 20 74 68 65 20 44 45 4c  ndex. If the DEL
173a0 45 54 45 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65  ETE.  ** stateme
173b0 6e 74 20 62 65 6c 6f 77 20 64 6f 65 73 20 61 63  nt below does ac
173c0 74 75 61 6c 6c 79 20 64 65 6c 65 74 65 20 61 20  tually delete a 
173d0 72 6f 77 2c 20 6e 50 68 61 73 65 4f 6e 65 53 74  row, nPhaseOneSt
173e0 65 70 20 77 69 6c 6c 20 62 65 0a 20 20 2a 2a 20  ep will be.  ** 
173f0 69 6e 63 72 65 6d 65 6e 74 65 64 20 62 79 20 74  incremented by t
17400 68 65 20 73 61 6d 65 20 61 6d 6f 75 6e 74 20 77  he same amount w
17410 68 65 6e 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  hen SQL function
17420 20 72 62 75 5f 74 6d 70 5f 69 6e 73 65 72 74 28   rbu_tmp_insert(
17430 29 0a 20 20 2a 2a 20 69 73 20 69 6e 76 6f 6b 65  ).  ** is invoke
17440 64 20 62 79 20 74 68 65 20 74 72 69 67 67 65 72  d by the trigger
17450 2e 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70  .  */.  if( eTyp
17460 65 3d 3d 52 42 55 5f 44 45 4c 45 54 45 20 29 7b  e==RBU_DELETE ){
17470 0a 20 20 20 20 70 2d 3e 6e 50 68 61 73 65 4f 6e  .    p->nPhaseOn
17480 65 53 74 65 70 20 2d 3d 20 70 2d 3e 6f 62 6a 69  eStep -= p->obji
17490 74 65 72 2e 6e 49 6e 64 65 78 3b 0a 20 20 7d 0a  ter.nIndex;.  }.
174a0 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 52 42  .  if( eType==RB
174b0 55 5f 49 44 58 5f 44 45 4c 45 54 45 20 7c 7c 20  U_IDX_DELETE || 
174c0 65 54 79 70 65 3d 3d 52 42 55 5f 44 45 4c 45 54  eType==RBU_DELET
174d0 45 20 29 7b 0a 20 20 20 20 70 57 72 69 74 65 72  E ){.    pWriter
174e0 20 3d 20 70 49 74 65 72 2d 3e 70 44 65 6c 65 74   = pIter->pDelet
174f0 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
17500 70 57 72 69 74 65 72 20 3d 20 70 49 74 65 72 2d  pWriter = pIter-
17510 3e 70 49 6e 73 65 72 74 3b 0a 20 20 7d 0a 0a 20  >pInsert;.  }.. 
17520 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65   for(i=0; i<pIte
17530 72 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  r->nCol; i++){. 
17540 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
17550 20 61 6e 20 49 4e 53 45 52 54 20 69 6e 74 6f 20   an INSERT into 
17560 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20 61  a table b-tree a
17570 6e 64 20 74 68 65 20 74 61 62 6c 65 20 68 61 73  nd the table has
17580 20 61 6e 0a 20 20 20 20 2a 2a 20 65 78 70 6c 69   an.    ** expli
17590 63 69 74 20 49 4e 54 45 47 45 52 20 50 52 49 4d  cit INTEGER PRIM
175a0 41 52 59 20 4b 45 59 2c 20 63 68 65 63 6b 20 74  ARY KEY, check t
175b0 68 61 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20  hat this is not 
175c0 61 6e 20 61 74 74 65 6d 70 74 0a 20 20 20 20 2a  an attempt.    *
175d0 2a 20 74 6f 20 77 72 69 74 65 20 61 20 4e 55 4c  * to write a NUL
175e0 4c 20 69 6e 74 6f 20 74 68 65 20 49 50 4b 20 63  L into the IPK c
175f0 6f 6c 75 6d 6e 2e 20 54 68 61 74 20 69 73 20 6e  olumn. That is n
17600 6f 74 20 70 65 72 6d 69 74 74 65 64 2e 20 20 2a  ot permitted.  *
17610 2f 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d  /.    if( eType=
17620 3d 52 42 55 5f 49 4e 53 45 52 54 20 0a 20 20 20  =RBU_INSERT .   
17630 20 20 26 26 20 70 49 74 65 72 2d 3e 7a 49 64 78    && pIter->zIdx
17640 3d 3d 30 20 26 26 20 70 49 74 65 72 2d 3e 65 54  ==0 && pIter->eT
17650 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 49 50 4b 20  ype==RBU_PK_IPK 
17660 26 26 20 70 49 74 65 72 2d 3e 61 62 54 62 6c 50  && pIter->abTblP
17670 6b 5b 69 5d 20 0a 20 20 20 20 20 26 26 20 73 71  k[i] .     && sq
17680 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70  lite3_column_typ
17690 65 28 70 49 74 65 72 2d 3e 70 53 65 6c 65 63 74  e(pIter->pSelect
176a0 2c 20 69 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c  , i)==SQLITE_NUL
176b0 4c 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70  L.    ){.      p
176c0 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4d 49  ->rc = SQLITE_MI
176d0 53 4d 41 54 43 48 3b 0a 20 20 20 20 20 20 70 2d  SMATCH;.      p-
176e0 3e 7a 45 72 72 6d 73 67 20 3d 20 73 71 6c 69 74  >zErrmsg = sqlit
176f0 65 33 5f 6d 70 72 69 6e 74 66 28 22 64 61 74 61  e3_mprintf("data
17700 74 79 70 65 20 6d 69 73 6d 61 74 63 68 22 29 3b  type mismatch");
17710 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
17720 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 65 54     }..    if( eT
17730 79 70 65 3d 3d 52 42 55 5f 44 45 4c 45 54 45 20  ype==RBU_DELETE 
17740 26 26 20 70 49 74 65 72 2d 3e 61 62 54 62 6c 50  && pIter->abTblP
17750 6b 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  k[i]==0 ){.     
17760 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
17770 0a 0a 20 20 20 20 70 56 61 6c 20 3d 20 73 71 6c  ..    pVal = sql
17780 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75  ite3_column_valu
17790 65 28 70 49 74 65 72 2d 3e 70 53 65 6c 65 63 74  e(pIter->pSelect
177a0 2c 20 69 29 3b 0a 20 20 20 20 70 2d 3e 72 63 20  , i);.    p->rc 
177b0 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 76  = sqlite3_bind_v
177c0 61 6c 75 65 28 70 57 72 69 74 65 72 2c 20 69 2b  alue(pWriter, i+
177d0 31 2c 20 70 56 61 6c 29 3b 0a 20 20 20 20 69 66  1, pVal);.    if
177e0 28 20 70 2d 3e 72 63 20 29 20 72 65 74 75 72 6e  ( p->rc ) return
177f0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 74 65  ;.  }.  if( pIte
17800 72 2d 3e 7a 49 64 78 3d 3d 30 20 29 7b 0a 20 20  r->zIdx==0 ){.  
17810 20 20 69 66 28 20 70 49 74 65 72 2d 3e 65 54 79    if( pIter->eTy
17820 70 65 3d 3d 52 42 55 5f 50 4b 5f 56 54 41 42 20  pe==RBU_PK_VTAB 
17830 0a 20 20 20 20 20 7c 7c 20 70 49 74 65 72 2d 3e  .     || pIter->
17840 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 4e 4f  eType==RBU_PK_NO
17850 4e 45 20 0a 20 20 20 20 20 7c 7c 20 28 70 49 74  NE .     || (pIt
17860 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50  er->eType==RBU_P
17870 4b 5f 45 58 54 45 52 4e 41 4c 20 26 26 20 72 62  K_EXTERNAL && rb
17880 75 49 73 56 61 63 75 75 6d 28 70 29 29 20 0a 20  uIsVacuum(p)) . 
17890 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46     ){.      /* F
178a0 6f 72 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  or a virtual tab
178b0 6c 65 2c 20 6f 72 20 61 20 74 61 62 6c 65 20 77  le, or a table w
178c0 69 74 68 20 6e 6f 20 70 72 69 6d 61 72 79 20 6b  ith no primary k
178d0 65 79 2c 20 74 68 65 20 0a 20 20 20 20 20 20 2a  ey, the .      *
178e0 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
178f0 6e 74 20 69 73 3a 0a 20 20 20 20 20 20 2a 2a 0a  nt is:.      **.
17900 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43        **   SELEC
17910 54 20 3c 63 6f 6c 73 3e 2c 20 72 62 75 5f 63 6f  T <cols>, rbu_co
17920 6e 74 72 6f 6c 2c 20 72 62 75 5f 72 6f 77 69 64  ntrol, rbu_rowid
17930 20 46 52 4f 4d 20 2e 2e 2e 2e 0a 20 20 20 20 20   FROM .....     
17940 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 48 65 6e   **.      ** Hen
17950 63 65 20 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28  ce column_value(
17960 70 49 74 65 72 2d 3e 6e 43 6f 6c 2b 31 29 2e 0a  pIter->nCol+1)..
17970 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
17980 73 73 65 72 74 43 6f 6c 75 6d 6e 4e 61 6d 65 28  ssertColumnName(
17990 70 49 74 65 72 2d 3e 70 53 65 6c 65 63 74 2c 20  pIter->pSelect, 
179a0 70 49 74 65 72 2d 3e 6e 43 6f 6c 2b 31 2c 20 0a  pIter->nCol+1, .
179b0 20 20 20 20 20 20 20 20 20 20 72 62 75 49 73 56            rbuIsV
179c0 61 63 75 75 6d 28 70 29 20 3f 20 22 72 6f 77 69  acuum(p) ? "rowi
179d0 64 22 20 3a 20 22 72 62 75 5f 72 6f 77 69 64 22  d" : "rbu_rowid"
179e0 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
179f0 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63  pVal = sqlite3_c
17a00 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28 70 49 74 65  olumn_value(pIte
17a10 72 2d 3e 70 53 65 6c 65 63 74 2c 20 70 49 74 65  r->pSelect, pIte
17a20 72 2d 3e 6e 43 6f 6c 2b 31 29 3b 0a 20 20 20 20  r->nCol+1);.    
17a30 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65    p->rc = sqlite
17a40 33 5f 62 69 6e 64 5f 76 61 6c 75 65 28 70 57 72  3_bind_value(pWr
17a50 69 74 65 72 2c 20 70 49 74 65 72 2d 3e 6e 43 6f  iter, pIter->nCo
17a60 6c 2b 31 2c 20 70 56 61 6c 29 3b 0a 20 20 20 20  l+1, pVal);.    
17a70 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 72  }.  }.  if( p->r
17a80 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
17a90 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70      sqlite3_step
17aa0 28 70 57 72 69 74 65 72 29 3b 0a 20 20 20 20 70  (pWriter);.    p
17ab0 2d 3e 72 63 20 3d 20 72 65 73 65 74 41 6e 64 43  ->rc = resetAndC
17ac0 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 57 72 69  ollectError(pWri
17ad0 74 65 72 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67  ter, &p->zErrmsg
17ae0 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
17af0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f  This function do
17b00 65 73 20 74 68 65 20 77 6f 72 6b 20 66 6f 72 20  es the work for 
17b10 61 6e 20 73 71 6c 69 74 65 33 72 62 75 5f 73 74  an sqlite3rbu_st
17b20 65 70 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a  ep() call..**.**
17b30 20 54 68 65 20 6f 62 6a 65 63 74 2d 69 74 65 72   The object-iter
17b40 61 74 6f 72 20 28 70 2d 3e 6f 62 6a 69 74 65 72  ator (p->objiter
17b50 29 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  ) currently poin
17b60 74 73 20 74 6f 20 61 20 76 61 6c 69 64 20 6f 62  ts to a valid ob
17b70 6a 65 63 74 2c 0a 2a 2a 20 61 6e 64 20 74 68 65  ject,.** and the
17b80 20 69 6e 70 75 74 20 63 75 72 73 6f 72 20 28 70   input cursor (p
17b90 2d 3e 6f 62 6a 69 74 65 72 2e 70 53 65 6c 65 63  ->objiter.pSelec
17ba0 74 29 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  t) currently poi
17bb0 6e 74 73 20 74 6f 20 61 20 76 61 6c 69 64 0a 2a  nts to a valid.*
17bc0 2a 20 69 6e 70 75 74 20 72 6f 77 2e 20 50 65 72  * input row. Per
17bd0 66 6f 72 6d 20 77 68 61 74 65 76 65 72 20 70 72  form whatever pr
17be0 6f 63 65 73 73 69 6e 67 20 69 73 20 72 65 71 75  ocessing is requ
17bf0 69 72 65 64 20 61 6e 64 20 72 65 74 75 72 6e 2e  ired and return.
17c00 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 20 65 72  .**.** If no  er
17c10 72 6f 72 20 6f 63 63 75 72 73 2c 20 53 51 4c 49  ror occurs, SQLI
17c20 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
17c30 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e  d. Otherwise, an
17c40 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 61   error code.** a
17c50 6e 64 20 6d 65 73 73 61 67 65 20 69 73 20 6c 65  nd message is le
17c60 66 74 20 69 6e 20 74 68 65 20 52 42 55 20 68 61  ft in the RBU ha
17c70 6e 64 6c 65 20 61 6e 64 20 61 20 63 6f 70 79 20  ndle and a copy 
17c80 6f 66 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  of the error cod
17c90 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e.** returned..*
17ca0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62 75  /.static int rbu
17cb0 53 74 65 70 28 73 71 6c 69 74 65 33 72 62 75 20  Step(sqlite3rbu 
17cc0 2a 70 29 7b 0a 20 20 52 62 75 4f 62 6a 49 74 65  *p){.  RbuObjIte
17cd0 72 20 2a 70 49 74 65 72 20 3d 20 26 70 2d 3e 6f  r *pIter = &p->o
17ce0 62 6a 69 74 65 72 3b 0a 20 20 63 6f 6e 73 74 20  bjiter;.  const 
17cf0 63 68 61 72 20 2a 7a 4d 61 73 6b 20 3d 20 30 3b  char *zMask = 0;
17d00 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20 72  .  int eType = r
17d10 62 75 53 74 65 70 54 79 70 65 28 70 2c 20 26 7a  buStepType(p, &z
17d20 4d 61 73 6b 29 3b 0a 0a 20 20 69 66 28 20 65 54  Mask);..  if( eT
17d30 79 70 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ype ){.    asser
17d40 74 28 20 65 54 79 70 65 3d 3d 52 42 55 5f 49 4e  t( eType==RBU_IN
17d50 53 45 52 54 20 20 20 20 20 7c 7c 20 65 54 79 70  SERT     || eTyp
17d60 65 3d 3d 52 42 55 5f 44 45 4c 45 54 45 0a 20 20  e==RBU_DELETE.  
17d70 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d         || eType=
17d80 3d 52 42 55 5f 52 45 50 4c 41 43 45 20 20 20 20  =RBU_REPLACE    
17d90 7c 7c 20 65 54 79 70 65 3d 3d 52 42 55 5f 49 44  || eType==RBU_ID
17da0 58 5f 44 45 4c 45 54 45 0a 20 20 20 20 20 20 20  X_DELETE.       
17db0 20 20 7c 7c 20 65 54 79 70 65 3d 3d 52 42 55 5f    || eType==RBU_
17dc0 49 44 58 5f 49 4e 53 45 52 54 20 7c 7c 20 65 54  IDX_INSERT || eT
17dd0 79 70 65 3d 3d 52 42 55 5f 55 50 44 41 54 45 0a  ype==RBU_UPDATE.
17de0 20 20 20 20 29 3b 0a 20 20 20 20 61 73 73 65 72      );.    asser
17df0 74 28 20 65 54 79 70 65 21 3d 52 42 55 5f 55 50  t( eType!=RBU_UP
17e00 44 41 54 45 20 7c 7c 20 70 49 74 65 72 2d 3e 7a  DATE || pIter->z
17e10 49 64 78 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 69  Idx==0 );..    i
17e20 66 28 20 70 49 74 65 72 2d 3e 7a 49 64 78 3d 3d  f( pIter->zIdx==
17e30 30 20 26 26 20 28 65 54 79 70 65 3d 3d 52 42 55  0 && (eType==RBU
17e40 5f 49 44 58 5f 44 45 4c 45 54 45 20 7c 7c 20 65  _IDX_DELETE || e
17e50 54 79 70 65 3d 3d 52 42 55 5f 49 44 58 5f 49 4e  Type==RBU_IDX_IN
17e60 53 45 52 54 29 20 29 7b 0a 20 20 20 20 20 20 72  SERT) ){.      r
17e70 62 75 42 61 64 43 6f 6e 74 72 6f 6c 45 72 72 6f  buBadControlErro
17e80 72 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  r(p);.    }.    
17e90 65 6c 73 65 20 69 66 28 20 65 54 79 70 65 3d 3d  else if( eType==
17ea0 52 42 55 5f 52 45 50 4c 41 43 45 20 29 7b 0a 20  RBU_REPLACE ){. 
17eb0 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e       if( pIter->
17ec0 7a 49 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  zIdx==0 ){.     
17ed0 20 20 20 70 2d 3e 6e 50 68 61 73 65 4f 6e 65 53     p->nPhaseOneS
17ee0 74 65 70 20 2b 3d 20 70 2d 3e 6f 62 6a 69 74 65  tep += p->objite
17ef0 72 2e 6e 49 6e 64 65 78 3b 0a 20 20 20 20 20 20  r.nIndex;.      
17f00 20 20 72 62 75 53 74 65 70 4f 6e 65 4f 70 28 70    rbuStepOneOp(p
17f10 2c 20 52 42 55 5f 44 45 4c 45 54 45 29 3b 0a 20  , RBU_DELETE);. 
17f20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
17f30 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
17f40 4b 20 29 20 72 62 75 53 74 65 70 4f 6e 65 4f 70  K ) rbuStepOneOp
17f50 28 70 2c 20 52 42 55 5f 49 4e 53 45 52 54 29 3b  (p, RBU_INSERT);
17f60 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20  .    }.    else 
17f70 69 66 28 20 65 54 79 70 65 21 3d 52 42 55 5f 55  if( eType!=RBU_U
17f80 50 44 41 54 45 20 29 7b 0a 20 20 20 20 20 20 72  PDATE ){.      r
17f90 62 75 53 74 65 70 4f 6e 65 4f 70 28 70 2c 20 65  buStepOneOp(p, e
17fa0 54 79 70 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Type);.    }.   
17fb0 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c   else{.      sql
17fc0 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c  ite3_value *pVal
17fd0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
17fe0 73 74 6d 74 20 2a 70 55 70 64 61 74 65 20 3d 20  stmt *pUpdate = 
17ff0 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  0;.      assert(
18000 20 65 54 79 70 65 3d 3d 52 42 55 5f 55 50 44 41   eType==RBU_UPDA
18010 54 45 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 6e  TE );.      p->n
18020 50 68 61 73 65 4f 6e 65 53 74 65 70 20 2d 3d 20  PhaseOneStep -= 
18030 70 2d 3e 6f 62 6a 69 74 65 72 2e 6e 49 6e 64 65  p->objiter.nInde
18040 78 3b 0a 20 20 20 20 20 20 72 62 75 47 65 74 55  x;.      rbuGetU
18050 70 64 61 74 65 53 74 6d 74 28 70 2c 20 70 49 74  pdateStmt(p, pIt
18060 65 72 2c 20 7a 4d 61 73 6b 2c 20 26 70 55 70 64  er, zMask, &pUpd
18070 61 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ate);.      if( 
18080 70 55 70 64 61 74 65 20 29 7b 0a 20 20 20 20 20  pUpdate ){.     
18090 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
180a0 20 20 66 6f 72 28 69 3d 30 3b 20 70 2d 3e 72 63    for(i=0; p->rc
180b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
180c0 3c 70 49 74 65 72 2d 3e 6e 43 6f 6c 3b 20 69 2b  <pIter->nCol; i+
180d0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 68  +){.          ch
180e0 61 72 20 63 20 3d 20 7a 4d 61 73 6b 5b 70 49 74  ar c = zMask[pIt
180f0 65 72 2d 3e 61 69 53 72 63 4f 72 64 65 72 5b 69  er->aiSrcOrder[i
18100 5d 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 70 56  ]];.          pV
18110 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  al = sqlite3_col
18120 75 6d 6e 5f 76 61 6c 75 65 28 70 49 74 65 72 2d  umn_value(pIter-
18130 3e 70 53 65 6c 65 63 74 2c 20 69 29 3b 0a 20 20  >pSelect, i);.  
18140 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65          if( pIte
18150 72 2d 3e 61 62 54 62 6c 50 6b 5b 69 5d 20 7c 7c  r->abTblPk[i] ||
18160 20 63 21 3d 27 2e 27 20 29 7b 0a 20 20 20 20 20   c!='.' ){.     
18170 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73         p->rc = s
18180 71 6c 69 74 65 33 5f 62 69 6e 64 5f 76 61 6c 75  qlite3_bind_valu
18190 65 28 70 55 70 64 61 74 65 2c 20 69 2b 31 2c 20  e(pUpdate, i+1, 
181a0 70 56 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 20  pVal);.         
181b0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
181c0 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
181d0 53 51 4c 49 54 45 5f 4f 4b 20 0a 20 20 20 20 20  SQLITE_OK .     
181e0 20 20 20 20 26 26 20 28 70 49 74 65 72 2d 3e 65      && (pIter->e
181f0 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 56 54 41  Type==RBU_PK_VTA
18200 42 20 7c 7c 20 70 49 74 65 72 2d 3e 65 54 79 70  B || pIter->eTyp
18210 65 3d 3d 52 42 55 5f 50 4b 5f 4e 4f 4e 45 29 20  e==RBU_PK_NONE) 
18220 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
18230 20 20 20 20 20 20 2f 2a 20 42 69 6e 64 20 74 68        /* Bind th
18240 65 20 72 62 75 5f 72 6f 77 69 64 20 76 61 6c 75  e rbu_rowid valu
18250 65 20 74 6f 20 63 6f 6c 75 6d 6e 20 5f 72 6f 77  e to column _row
18260 69 64 5f 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  id_ */.         
18270 20 61 73 73 65 72 74 43 6f 6c 75 6d 6e 4e 61 6d   assertColumnNam
18280 65 28 70 49 74 65 72 2d 3e 70 53 65 6c 65 63 74  e(pIter->pSelect
18290 2c 20 70 49 74 65 72 2d 3e 6e 43 6f 6c 2b 31 2c  , pIter->nCol+1,
182a0 20 22 72 62 75 5f 72 6f 77 69 64 22 29 3b 0a 20   "rbu_rowid");. 
182b0 20 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20           pVal = 
182c0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 76  sqlite3_column_v
182d0 61 6c 75 65 28 70 49 74 65 72 2d 3e 70 53 65 6c  alue(pIter->pSel
182e0 65 63 74 2c 20 70 49 74 65 72 2d 3e 6e 43 6f 6c  ect, pIter->nCol
182f0 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  +1);.          p
18300 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62  ->rc = sqlite3_b
18310 69 6e 64 5f 76 61 6c 75 65 28 70 55 70 64 61 74  ind_value(pUpdat
18320 65 2c 20 70 49 74 65 72 2d 3e 6e 43 6f 6c 2b 31  e, pIter->nCol+1
18330 2c 20 70 56 61 6c 29 3b 0a 20 20 20 20 20 20 20  , pVal);.       
18340 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
18350 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
18360 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
18370 69 74 65 33 5f 73 74 65 70 28 70 55 70 64 61 74  ite3_step(pUpdat
18380 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d  e);.          p-
18390 3e 72 63 20 3d 20 72 65 73 65 74 41 6e 64 43 6f  >rc = resetAndCo
183a0 6c 6c 65 63 74 45 72 72 6f 72 28 70 55 70 64 61  llectError(pUpda
183b0 74 65 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 29  te, &p->zErrmsg)
183c0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
183d0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
183e0 72 65 74 75 72 6e 20 70 2d 3e 72 63 3b 0a 7d 0a  return p->rc;.}.
183f0 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74  ./*.** Increment
18400 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b   the schema cook
18410 69 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 64  ie of the main d
18420 61 74 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62  atabase opened b
18430 79 20 70 2d 3e 64 62 4d 61 69 6e 2e 0a 2a 2a 0a  y p->dbMain..**.
18440 2a 2a 20 4f 72 2c 20 69 66 20 74 68 69 73 20 69  ** Or, if this i
18450 73 20 61 6e 20 52 42 55 20 76 61 63 75 75 6d 2c  s an RBU vacuum,
18460 20 73 65 74 20 74 68 65 20 73 63 68 65 6d 61 20   set the schema 
18470 63 6f 6f 6b 69 65 20 6f 66 20 74 68 65 20 6d 61  cookie of the ma
18480 69 6e 20 64 62 0a 2a 2a 20 6f 70 65 6e 65 64 20  in db.** opened 
18490 62 79 20 70 2d 3e 64 62 4d 61 69 6e 20 74 6f 20  by p->dbMain to 
184a0 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 20 74 68  one more than th
184b0 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20  e schema cookie 
184c0 6f 66 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 64  of the main.** d
184d0 62 20 6f 70 65 6e 65 64 20 62 79 20 70 2d 3e 64  b opened by p->d
184e0 62 52 62 75 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  bRbu..*/.static 
184f0 76 6f 69 64 20 72 62 75 49 6e 63 72 53 63 68 65  void rbuIncrSche
18500 6d 61 43 6f 6f 6b 69 65 28 73 71 6c 69 74 65 33  maCookie(sqlite3
18510 72 62 75 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  rbu *p){.  if( p
18520 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
18530 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a  ){.    sqlite3 *
18540 64 62 72 65 61 64 20 3d 20 28 72 62 75 49 73 56  dbread = (rbuIsV
18550 61 63 75 75 6d 28 70 29 20 3f 20 70 2d 3e 64 62  acuum(p) ? p->db
18560 52 62 75 20 3a 20 70 2d 3e 64 62 4d 61 69 6e 29  Rbu : p->dbMain)
18570 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6f 6b 69  ;.    int iCooki
18580 65 20 3d 20 31 30 30 30 30 30 30 3b 0a 20 20 20  e = 1000000;.   
18590 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
185a0 53 74 6d 74 3b 0a 0a 20 20 20 20 70 2d 3e 72 63  Stmt;..    p->rc
185b0 20 3d 20 70 72 65 70 61 72 65 41 6e 64 43 6f 6c   = prepareAndCol
185c0 6c 65 63 74 45 72 72 6f 72 28 64 62 72 65 61 64  lectError(dbread
185d0 2c 20 26 70 53 74 6d 74 2c 20 26 70 2d 3e 7a 45  , &pStmt, &p->zE
185e0 72 72 6d 73 67 2c 20 0a 20 20 20 20 20 20 20 20  rrmsg, .        
185f0 22 50 52 41 47 4d 41 20 73 63 68 65 6d 61 5f 76  "PRAGMA schema_v
18600 65 72 73 69 6f 6e 22 0a 20 20 20 20 29 3b 0a 20  ersion".    );. 
18610 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
18620 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
18630 20 2f 2a 20 43 6f 76 65 72 61 67 65 3a 20 69 74   /* Coverage: it
18640 20 6d 61 79 20 62 65 20 74 68 61 74 20 74 68 69   may be that thi
18650 73 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  s sqlite3_step()
18660 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 54 68   cannot fail. Th
18670 65 72 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  ere.      ** is 
18680 61 6c 72 65 61 64 79 20 61 20 74 72 61 6e 73 61  already a transa
18690 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 73 6f 20 74  ction open, so t
186a0 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
186b0 65 6d 65 6e 74 20 63 61 6e 6e 6f 74 0a 20 20 20  ement cannot.   
186c0 20 20 20 2a 2a 20 74 68 72 6f 77 20 61 6e 20 53     ** throw an S
186d0 51 4c 49 54 45 5f 53 43 48 45 4d 41 20 65 78 63  QLITE_SCHEMA exc
186e0 65 70 74 69 6f 6e 2e 20 54 68 65 20 6f 6e 6c 79  eption. The only
186f0 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 74   database page t
18700 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74  he.      ** stat
18710 65 6d 65 6e 74 20 72 65 61 64 73 20 69 73 20 70  ement reads is p
18720 61 67 65 20 31 2c 20 77 68 69 63 68 20 69 73 20  age 1, which is 
18730 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65  guaranteed to be
18740 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e 0a 20   in the cache.. 
18750 20 20 20 20 20 2a 2a 20 41 6e 64 20 6e 6f 20 6d       ** And no m
18760 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
18770 73 20 61 72 65 20 72 65 71 75 69 72 65 64 2e 20  s are required. 
18780 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 53 51   */.      if( SQ
18790 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65  LITE_ROW==sqlite
187a0 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b  3_step(pStmt) ){
187b0 0a 20 20 20 20 20 20 20 20 69 43 6f 6f 6b 69 65  .        iCookie
187c0 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
187d0 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b  n_int(pStmt, 0);
187e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
187f0 62 75 46 69 6e 61 6c 69 7a 65 28 70 2c 20 70 53  buFinalize(p, pS
18800 74 6d 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  tmt);.    }.    
18810 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
18820 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 62  E_OK ){.      rb
18830 75 4d 50 72 69 6e 74 66 45 78 65 63 28 70 2c 20  uMPrintfExec(p, 
18840 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 50 52 41 47  p->dbMain, "PRAG
18850 4d 41 20 73 63 68 65 6d 61 5f 76 65 72 73 69 6f  MA schema_versio
18860 6e 20 3d 20 25 64 22 2c 20 69 43 6f 6f 6b 69 65  n = %d", iCookie
18870 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  +1);.    }.  }.}
18880 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74  ../*.** Update t
18890 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
188a0 68 65 20 72 62 75 5f 73 74 61 74 65 20 74 61 62  he rbu_state tab
188b0 6c 65 20 77 69 74 68 69 6e 20 74 68 65 20 72 62  le within the rb
188c0 75 20 64 61 74 61 62 61 73 65 2e 20 54 68 65 0a  u database. The.
188d0 2a 2a 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20  ** value stored 
188e0 69 6e 20 74 68 65 20 52 42 55 5f 53 54 41 54 45  in the RBU_STATE
188f0 5f 53 54 41 47 45 20 63 6f 6c 75 6d 6e 20 69 73  _STAGE column is
18900 20 65 53 74 61 67 65 2e 20 41 6c 6c 20 6f 74 68   eStage. All oth
18910 65 72 20 76 61 6c 75 65 73 0a 2a 2a 20 61 72 65  er values.** are
18920 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 69   determined by i
18930 6e 73 70 65 63 74 69 6e 67 20 74 68 65 20 72 62  nspecting the rb
18940 75 20 68 61 6e 64 6c 65 20 70 61 73 73 65 64 20  u handle passed 
18950 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
18960 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ument..*/.static
18970 20 76 6f 69 64 20 72 62 75 53 61 76 65 53 74 61   void rbuSaveSta
18980 74 65 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70  te(sqlite3rbu *p
18990 2c 20 69 6e 74 20 65 53 74 61 67 65 29 7b 0a 20  , int eStage){. 
189a0 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
189b0 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d  TE_OK || p->rc==
189c0 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20  SQLITE_DONE ){. 
189d0 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20     sqlite3_stmt 
189e0 2a 70 49 6e 73 65 72 74 20 3d 20 30 3b 0a 20 20  *pInsert = 0;.  
189f0 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 46 64 20    rbu_file *pFd 
18a00 3d 20 28 72 62 75 49 73 56 61 63 75 75 6d 28 70  = (rbuIsVacuum(p
18a10 29 20 3f 20 70 2d 3e 70 52 62 75 46 64 20 3a 20  ) ? p->pRbuFd : 
18a20 70 2d 3e 70 54 61 72 67 65 74 46 64 29 3b 0a 20  p->pTargetFd);. 
18a30 20 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 20 20     int rc;..    
18a40 61 73 73 65 72 74 28 20 70 2d 3e 7a 45 72 72 6d  assert( p->zErrm
18a50 73 67 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20  sg==0 );.    rc 
18a60 3d 20 70 72 65 70 61 72 65 46 72 65 65 41 6e 64  = prepareFreeAnd
18a70 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e  CollectError(p->
18a80 64 62 52 62 75 2c 20 26 70 49 6e 73 65 72 74 2c  dbRbu, &pInsert,
18a90 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 20 0a 20   &p->zErrmsg, . 
18aa0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d         sqlite3_m
18ab0 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  printf(.        
18ac0 20 20 22 49 4e 53 45 52 54 20 4f 52 20 52 45 50    "INSERT OR REP
18ad0 4c 41 43 45 20 49 4e 54 4f 20 25 73 2e 72 62 75  LACE INTO %s.rbu
18ae0 5f 73 74 61 74 65 28 6b 2c 20 76 29 20 56 41 4c  _state(k, v) VAL
18af0 55 45 53 20 22 0a 20 20 20 20 20 20 20 20 20 20  UES ".          
18b00 22 28 25 64 2c 20 25 64 29 2c 20 22 0a 20 20 20  "(%d, %d), ".   
18b10 20 20 20 20 20 20 20 22 28 25 64 2c 20 25 51 29         "(%d, %Q)
18b20 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 22 28  , ".          "(
18b30 25 64 2c 20 25 51 29 2c 20 22 0a 20 20 20 20 20  %d, %Q), ".     
18b40 20 20 20 20 20 22 28 25 64 2c 20 25 64 29 2c 20       "(%d, %d), 
18b50 22 0a 20 20 20 20 20 20 20 20 20 20 22 28 25 64  ".          "(%d
18b60 2c 20 25 64 29 2c 20 22 0a 20 20 20 20 20 20 20  , %d), ".       
18b70 20 20 20 22 28 25 64 2c 20 25 6c 6c 64 29 2c 20     "(%d, %lld), 
18b80 22 0a 20 20 20 20 20 20 20 20 20 20 22 28 25 64  ".          "(%d
18b90 2c 20 25 6c 6c 64 29 2c 20 22 0a 20 20 20 20 20  , %lld), ".     
18ba0 20 20 20 20 20 22 28 25 64 2c 20 25 6c 6c 64 29       "(%d, %lld)
18bb0 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 22 28  , ".          "(
18bc0 25 64 2c 20 25 6c 6c 64 29 20 22 2c 0a 20 20 20  %d, %lld) ",.   
18bd0 20 20 20 20 20 20 20 70 2d 3e 7a 53 74 61 74 65         p->zState
18be0 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 52 42  Db,.          RB
18bf0 55 5f 53 54 41 54 45 5f 53 54 41 47 45 2c 20 65  U_STATE_STAGE, e
18c00 53 74 61 67 65 2c 0a 20 20 20 20 20 20 20 20 20  Stage,.         
18c10 20 52 42 55 5f 53 54 41 54 45 5f 54 42 4c 2c 20   RBU_STATE_TBL, 
18c20 70 2d 3e 6f 62 6a 69 74 65 72 2e 7a 54 62 6c 2c  p->objiter.zTbl,
18c30 20 0a 20 20 20 20 20 20 20 20 20 20 52 42 55 5f   .          RBU_
18c40 53 54 41 54 45 5f 49 44 58 2c 20 70 2d 3e 6f 62  STATE_IDX, p->ob
18c50 6a 69 74 65 72 2e 7a 49 64 78 2c 20 0a 20 20 20  jiter.zIdx, .   
18c60 20 20 20 20 20 20 20 52 42 55 5f 53 54 41 54 45         RBU_STATE
18c70 5f 52 4f 57 2c 20 70 2d 3e 6e 53 74 65 70 2c 20  _ROW, p->nStep, 
18c80 0a 20 20 20 20 20 20 20 20 20 20 52 42 55 5f 53  .          RBU_S
18c90 54 41 54 45 5f 50 52 4f 47 52 45 53 53 2c 20 70  TATE_PROGRESS, p
18ca0 2d 3e 6e 50 72 6f 67 72 65 73 73 2c 0a 20 20 20  ->nProgress,.   
18cb0 20 20 20 20 20 20 20 52 42 55 5f 53 54 41 54 45         RBU_STATE
18cc0 5f 43 4b 50 54 2c 20 70 2d 3e 69 57 61 6c 43 6b  _CKPT, p->iWalCk
18cd0 73 75 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 52  sum,.          R
18ce0 42 55 5f 53 54 41 54 45 5f 43 4f 4f 4b 49 45 2c  BU_STATE_COOKIE,
18cf0 20 28 69 36 34 29 70 46 64 2d 3e 69 43 6f 6f 6b   (i64)pFd->iCook
18d00 69 65 2c 0a 20 20 20 20 20 20 20 20 20 20 52 42  ie,.          RB
18d10 55 5f 53 54 41 54 45 5f 4f 41 4c 53 5a 2c 20 70  U_STATE_OALSZ, p
18d20 2d 3e 69 4f 61 6c 53 7a 2c 0a 20 20 20 20 20 20  ->iOalSz,.      
18d30 20 20 20 20 52 42 55 5f 53 54 41 54 45 5f 50 48      RBU_STATE_PH
18d40 41 53 45 4f 4e 45 53 54 45 50 2c 20 70 2d 3e 6e  ASEONESTEP, p->n
18d50 50 68 61 73 65 4f 6e 65 53 74 65 70 0a 20 20 20  PhaseOneStep.   
18d60 20 20 20 29 0a 20 20 20 20 29 3b 0a 20 20 20 20     ).    );.    
18d70 61 73 73 65 72 74 28 20 70 49 6e 73 65 72 74 3d  assert( pInsert=
18d80 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  =0 || rc==SQLITE
18d90 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 69 66 28 20  _OK );..    if( 
18da0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
18db0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
18dc0 74 65 70 28 70 49 6e 73 65 72 74 29 3b 0a 20 20  tep(pInsert);.  
18dd0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
18de0 5f 66 69 6e 61 6c 69 7a 65 28 70 49 6e 73 65 72  _finalize(pInser
18df0 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  t);.    }.    if
18e00 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
18e10 29 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20  ) p->rc = rc;.  
18e20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  }.}.../*.** The 
18e30 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
18e40 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66  passed to this f
18e50 75 6e 63 74 69 6f 6e 20 69 73 20 74 68 65 20 6e  unction is the n
18e60 61 6d 65 20 6f 66 20 61 20 50 52 41 47 4d 41 20  ame of a PRAGMA 
18e70 0a 2a 2a 20 73 65 74 74 69 6e 67 20 2d 20 22 70  .** setting - "p
18e80 61 67 65 5f 73 69 7a 65 22 2c 20 22 61 75 74 6f  age_size", "auto
18e90 5f 76 61 63 75 75 6d 22 2c 20 22 75 73 65 72 5f  _vacuum", "user_
18ea0 76 65 72 73 69 6f 6e 22 20 6f 72 20 22 61 70 70  version" or "app
18eb0 6c 69 63 61 74 69 6f 6e 5f 69 64 22 2e 0a 2a 2a  lication_id"..**
18ec0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 65   This function e
18ed0 78 65 63 75 74 65 73 20 74 68 65 20 66 6f 6c 6c  xecutes the foll
18ee0 6f 77 69 6e 67 20 6f 6e 20 73 71 6c 69 74 65 33  owing on sqlite3
18ef0 72 62 75 2e 64 62 52 62 75 3a 0a 2a 2a 0a 2a 2a  rbu.dbRbu:.**.**
18f00 20 20 20 22 50 52 41 47 4d 41 20 6d 61 69 6e 2e     "PRAGMA main.
18f10 24 7a 50 72 61 67 6d 61 22 0a 2a 2a 0a 2a 2a 20  $zPragma".**.** 
18f20 77 68 65 72 65 20 24 7a 50 72 61 67 6d 61 20 69  where $zPragma i
18f30 73 20 74 68 65 20 73 74 72 69 6e 67 20 70 61 73  s the string pas
18f40 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
18f50 64 20 61 72 67 75 6d 65 6e 74 2c 20 74 68 65 6e  d argument, then
18f60 0a 2a 2a 20 6f 6e 20 73 71 6c 69 74 65 33 72 62  .** on sqlite3rb
18f70 75 2e 64 62 4d 61 69 6e 3a 0a 2a 2a 0a 2a 2a 20  u.dbMain:.**.** 
18f80 20 20 22 50 52 41 47 4d 41 20 6d 61 69 6e 2e 24    "PRAGMA main.$
18f90 7a 50 72 61 67 6d 61 20 3d 20 24 76 61 6c 22 0a  zPragma = $val".
18fa0 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 24 76 61 6c  **.** where $val
18fb0 20 69 73 20 74 68 65 20 76 61 6c 75 65 20 72 65   is the value re
18fc0 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 66 69  turned by the fi
18fd0 72 73 74 20 50 52 41 47 4d 41 20 69 6e 76 6f 63  rst PRAGMA invoc
18fe0 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  ation..**.** In 
18ff0 73 68 6f 72 74 2c 20 69 74 20 63 6f 70 69 65 73  short, it copies
19000 20 74 68 65 20 76 61 6c 75 65 20 20 6f 66 20 74   the value  of t
19010 68 65 20 73 70 65 63 69 66 69 65 64 20 50 52 41  he specified PRA
19020 47 4d 41 20 73 65 74 74 69 6e 67 20 66 72 6f 6d  GMA setting from
19030 0a 2a 2a 20 64 62 52 62 75 20 74 6f 20 64 62 4d  .** dbRbu to dbM
19040 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ain..*/.static v
19050 6f 69 64 20 72 62 75 43 6f 70 79 50 72 61 67 6d  oid rbuCopyPragm
19060 61 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c  a(sqlite3rbu *p,
19070 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 72   const char *zPr
19080 61 67 6d 61 29 7b 0a 20 20 69 66 28 20 70 2d 3e  agma){.  if( p->
19090 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
190a0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  .    sqlite3_stm
190b0 74 20 2a 70 50 72 61 67 6d 61 20 3d 20 30 3b 0a  t *pPragma = 0;.
190c0 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70      p->rc = prep
190d0 61 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63  areFreeAndCollec
190e0 74 45 72 72 6f 72 28 70 2d 3e 64 62 52 62 75 2c  tError(p->dbRbu,
190f0 20 26 70 50 72 61 67 6d 61 2c 20 26 70 2d 3e 7a   &pPragma, &p->z
19100 45 72 72 6d 73 67 2c 20 0a 20 20 20 20 20 20 20  Errmsg, .       
19110 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
19120 28 22 50 52 41 47 4d 41 20 6d 61 69 6e 2e 25 73  ("PRAGMA main.%s
19130 22 2c 20 7a 50 72 61 67 6d 61 29 0a 20 20 20 20  ", zPragma).    
19140 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  );.    if( p->rc
19150 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53  ==SQLITE_OK && S
19160 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74  QLITE_ROW==sqlit
19170 65 33 5f 73 74 65 70 28 70 50 72 61 67 6d 61 29  e3_step(pPragma)
19180 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20   ){.      p->rc 
19190 3d 20 72 62 75 4d 50 72 69 6e 74 66 45 78 65 63  = rbuMPrintfExec
191a0 28 70 2c 20 70 2d 3e 64 62 4d 61 69 6e 2c 20 22  (p, p->dbMain, "
191b0 50 52 41 47 4d 41 20 6d 61 69 6e 2e 25 73 20 3d  PRAGMA main.%s =
191c0 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20   %d",.          
191d0 7a 50 72 61 67 6d 61 2c 20 73 71 6c 69 74 65 33  zPragma, sqlite3
191e0 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 50 72 61  _column_int(pPra
191f0 67 6d 61 2c 20 30 29 0a 20 20 20 20 20 20 29 3b  gma, 0).      );
19200 0a 20 20 20 20 7d 0a 20 20 20 20 72 62 75 46 69  .    }.    rbuFi
19210 6e 61 6c 69 7a 65 28 70 2c 20 70 50 72 61 67 6d  nalize(p, pPragm
19220 61 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  a);.  }.}../*.**
19230 20 54 68 65 20 52 42 55 20 68 61 6e 64 6c 65 20   The RBU handle 
19240 70 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e  passed as the on
19250 6c 79 20 61 72 67 75 6d 65 6e 74 20 68 61 73 20  ly argument has 
19260 6a 75 73 74 20 62 65 65 6e 20 6f 70 65 6e 65 64  just been opened
19270 20 61 6e 64 20 0a 2a 2a 20 74 68 65 20 73 74 61   and .** the sta
19280 74 65 20 64 61 74 61 62 61 73 65 20 69 73 20 65  te database is e
19290 6d 70 74 79 2e 20 49 66 20 74 68 69 73 20 52 42  mpty. If this RB
192a0 55 20 68 61 6e 64 6c 65 20 77 61 73 20 6f 70 65  U handle was ope
192b0 6e 65 64 20 66 6f 72 20 61 6e 0a 2a 2a 20 52 42  ned for an.** RB
192c0 55 20 76 61 63 75 75 6d 20 6f 70 65 72 61 74 69  U vacuum operati
192d0 6f 6e 2c 20 63 72 65 61 74 65 20 74 68 65 20 73  on, create the s
192e0 63 68 65 6d 61 20 69 6e 20 74 68 65 20 74 61 72  chema in the tar
192f0 67 65 74 20 64 62 2e 0a 2a 2f 0a 73 74 61 74 69  get db..*/.stati
19300 63 20 76 6f 69 64 20 72 62 75 43 72 65 61 74 65  c void rbuCreate
19310 54 61 72 67 65 74 53 63 68 65 6d 61 28 73 71 6c  TargetSchema(sql
19320 69 74 65 33 72 62 75 20 2a 70 29 7b 0a 20 20 73  ite3rbu *p){.  s
19330 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 71  qlite3_stmt *pSq
19340 6c 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  l = 0;.  sqlite3
19350 5f 73 74 6d 74 20 2a 70 49 6e 73 65 72 74 20 3d  _stmt *pInsert =
19360 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 72   0;..  assert( r
19370 62 75 49 73 56 61 63 75 75 6d 28 70 29 20 29 3b  buIsVacuum(p) );
19380 0a 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74  .  p->rc = sqlit
19390 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 4d 61 69  e3_exec(p->dbMai
193a0 6e 2c 20 22 50 52 41 47 4d 41 20 77 72 69 74 61  n, "PRAGMA writa
193b0 62 6c 65 5f 73 63 68 65 6d 61 3d 31 22 2c 20 30  ble_schema=1", 0
193c0 2c 30 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 29  ,0, &p->zErrmsg)
193d0 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ;.  if( p->rc==S
193e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
193f0 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65 41  p->rc = prepareA
19400 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70  ndCollectError(p
19410 2d 3e 64 62 52 62 75 2c 20 26 70 53 71 6c 2c 20  ->dbRbu, &pSql, 
19420 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 20 0a 20 20  &p->zErrmsg, .  
19430 20 20 20 20 22 53 45 4c 45 43 54 20 73 71 6c 20      "SELECT sql 
19440 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
19450 65 72 20 57 48 45 52 45 20 73 71 6c 21 3d 27 27  er WHERE sql!=''
19460 20 41 4e 44 20 72 6f 6f 74 70 61 67 65 21 3d 30   AND rootpage!=0
19470 22 0a 20 20 20 20 20 20 22 20 41 4e 44 20 6e 61  ".      " AND na
19480 6d 65 21 3d 27 73 71 6c 69 74 65 5f 73 65 71 75  me!='sqlite_sequ
19490 65 6e 63 65 27 20 22 0a 20 20 20 20 20 20 22 20  ence' ".      " 
194a0 4f 52 44 45 52 20 42 59 20 74 79 70 65 20 44 45  ORDER BY type DE
194b0 53 43 22 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a  SC".    );.  }..
194c0 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d    while( p->rc==
194d0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 71 6c  SQLITE_OK && sql
194e0 69 74 65 33 5f 73 74 65 70 28 70 53 71 6c 29 3d  ite3_step(pSql)=
194f0 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
19500 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
19510 53 71 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  Sql = (const cha
19520 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
19530 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 30 29 3b  n_text(pSql, 0);
19540 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c  .    p->rc = sql
19550 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 4d  ite3_exec(p->dbM
19560 61 69 6e 2c 20 7a 53 71 6c 2c 20 30 2c 20 30 2c  ain, zSql, 0, 0,
19570 20 26 70 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a 20   &p->zErrmsg);. 
19580 20 7d 0a 20 20 72 62 75 46 69 6e 61 6c 69 7a 65   }.  rbuFinalize
19590 28 70 2c 20 70 53 71 6c 29 3b 0a 20 20 69 66 28  (p, pSql);.  if(
195a0 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f   p->rc!=SQLITE_O
195b0 4b 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69  K ) return;..  i
195c0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
195d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63  _OK ){.    p->rc
195e0 20 3d 20 70 72 65 70 61 72 65 41 6e 64 43 6f 6c   = prepareAndCol
195f0 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 52  lectError(p->dbR
19600 62 75 2c 20 26 70 53 71 6c 2c 20 26 70 2d 3e 7a  bu, &pSql, &p->z
19610 45 72 72 6d 73 67 2c 20 0a 20 20 20 20 20 20 20  Errmsg, .       
19620 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   "SELECT * FROM 
19630 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 57 48  sqlite_master WH
19640 45 52 45 20 72 6f 6f 74 70 61 67 65 3d 30 20 4f  ERE rootpage=0 O
19650 52 20 72 6f 6f 74 70 61 67 65 20 49 53 20 4e 55  R rootpage IS NU
19660 4c 4c 22 20 0a 20 20 20 20 29 3b 0a 20 20 7d 0a  LL" .    );.  }.
19670 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
19680 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
19690 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65 41 6e  ->rc = prepareAn
196a0 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d  dCollectError(p-
196b0 3e 64 62 4d 61 69 6e 2c 20 26 70 49 6e 73 65 72  >dbMain, &pInser
196c0 74 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 20  t, &p->zErrmsg, 
196d0 0a 20 20 20 20 20 20 20 20 22 49 4e 53 45 52 54  .        "INSERT
196e0 20 49 4e 54 4f 20 73 71 6c 69 74 65 5f 6d 61 73   INTO sqlite_mas
196f0 74 65 72 20 56 41 4c 55 45 53 28 3f 2c 3f 2c 3f  ter VALUES(?,?,?
19700 2c 3f 2c 3f 29 22 0a 20 20 20 20 29 3b 0a 20 20  ,?,?)".    );.  
19710 7d 0a 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 72  }..  while( p->r
19720 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
19730 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 71  sqlite3_step(pSq
19740 6c 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  l)==SQLITE_ROW )
19750 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
19760 20 66 6f 72 28 69 3d 30 3b 20 69 3c 35 3b 20 69   for(i=0; i<5; i
19770 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
19780 65 33 5f 62 69 6e 64 5f 76 61 6c 75 65 28 70 49  e3_bind_value(pI
19790 6e 73 65 72 74 2c 20 69 2b 31 2c 20 73 71 6c 69  nsert, i+1, sqli
197a0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65  te3_column_value
197b0 28 70 53 71 6c 2c 20 69 29 29 3b 0a 20 20 20 20  (pSql, i));.    
197c0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  }.    sqlite3_st
197d0 65 70 28 70 49 6e 73 65 72 74 29 3b 0a 20 20 20  ep(pInsert);.   
197e0 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33   p->rc = sqlite3
197f0 5f 72 65 73 65 74 28 70 49 6e 73 65 72 74 29 3b  _reset(pInsert);
19800 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 72 63  .  }.  if( p->rc
19810 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
19820 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74     p->rc = sqlit
19830 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 4d 61 69  e3_exec(p->dbMai
19840 6e 2c 20 22 50 52 41 47 4d 41 20 77 72 69 74 61  n, "PRAGMA writa
19850 62 6c 65 5f 73 63 68 65 6d 61 3d 30 22 2c 30 2c  ble_schema=0",0,
19860 30 2c 26 70 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a  0,&p->zErrmsg);.
19870 20 20 7d 0a 0a 20 20 72 62 75 46 69 6e 61 6c 69    }..  rbuFinali
19880 7a 65 28 70 2c 20 70 53 71 6c 29 3b 0a 20 20 72  ze(p, pSql);.  r
19890 62 75 46 69 6e 61 6c 69 7a 65 28 70 2c 20 70 49  buFinalize(p, pI
198a0 6e 73 65 72 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nsert);.}../*.**
198b0 20 53 74 65 70 20 74 68 65 20 52 42 55 20 6f 62   Step the RBU ob
198c0 6a 65 63 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ject..*/.int sql
198d0 69 74 65 33 72 62 75 5f 73 74 65 70 28 73 71 6c  ite3rbu_step(sql
198e0 69 74 65 33 72 62 75 20 2a 70 29 7b 0a 20 20 69  ite3rbu *p){.  i
198f0 66 28 20 70 20 29 7b 0a 20 20 20 20 73 77 69 74  f( p ){.    swit
19900 63 68 28 20 70 2d 3e 65 53 74 61 67 65 20 29 7b  ch( p->eStage ){
19910 0a 20 20 20 20 20 20 63 61 73 65 20 52 42 55 5f  .      case RBU_
19920 53 54 41 47 45 5f 4f 41 4c 3a 20 7b 0a 20 20 20  STAGE_OAL: {.   
19930 20 20 20 20 20 52 62 75 4f 62 6a 49 74 65 72 20       RbuObjIter 
19940 2a 70 49 74 65 72 20 3d 20 26 70 2d 3e 6f 62 6a  *pIter = &p->obj
19950 69 74 65 72 3b 0a 0a 20 20 20 20 20 20 20 20 2f  iter;..        /
19960 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
19970 52 42 55 20 76 61 63 75 75 6d 20 6f 70 65 72 61  RBU vacuum opera
19980 74 69 6f 6e 20 61 6e 64 20 74 68 65 20 73 74 61  tion and the sta
19990 74 65 20 74 61 62 6c 65 20 77 61 73 20 65 6d 70  te table was emp
199a0 74 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 68  ty.        ** wh
199b0 65 6e 20 74 68 69 73 20 68 61 6e 64 6c 65 20 77  en this handle w
199c0 61 73 20 6f 70 65 6e 65 64 2c 20 63 72 65 61 74  as opened, creat
199d0 65 20 74 68 65 20 74 61 72 67 65 74 20 64 61 74  e the target dat
199e0 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 2a 2f  abase schema. */
199f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 62 75  .        if( rbu
19a00 49 73 56 61 63 75 75 6d 28 70 29 20 26 26 20 70  IsVacuum(p) && p
19a10 2d 3e 6e 50 72 6f 67 72 65 73 73 3d 3d 30 20 26  ->nProgress==0 &
19a20 26 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  & p->rc==SQLITE_
19a30 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
19a40 72 62 75 43 72 65 61 74 65 54 61 72 67 65 74 53  rbuCreateTargetS
19a50 63 68 65 6d 61 28 70 29 3b 0a 20 20 20 20 20 20  chema(p);.      
19a60 20 20 20 20 72 62 75 43 6f 70 79 50 72 61 67 6d      rbuCopyPragm
19a70 61 28 70 2c 20 22 75 73 65 72 5f 76 65 72 73 69  a(p, "user_versi
19a80 6f 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  on");.          
19a90 72 62 75 43 6f 70 79 50 72 61 67 6d 61 28 70 2c  rbuCopyPragma(p,
19aa0 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 5f 69 64   "application_id
19ab0 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  ");.        }.. 
19ac0 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 2d         while( p-
19ad0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
19ae0 26 20 70 49 74 65 72 2d 3e 7a 54 62 6c 20 29 7b  & pIter->zTbl ){
19af0 0a 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ..          if( 
19b00 70 49 74 65 72 2d 3e 62 43 6c 65 61 6e 75 70 20  pIter->bCleanup 
19b10 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
19b20 2a 20 43 6c 65 61 6e 20 75 70 20 74 68 65 20 72  * Clean up the r
19b30 62 75 5f 74 6d 70 5f 78 78 78 20 74 61 62 6c 65  bu_tmp_xxx table
19b40 20 66 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75   for the previou
19b50 73 20 74 61 62 6c 65 2e 20 49 74 20 0a 20 20 20  s table. It .   
19b60 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6e 6e           ** cann
19b70 6f 74 20 62 65 20 64 72 6f 70 70 65 64 20 61 73  ot be dropped as
19b80 20 74 68 65 72 65 20 61 72 65 20 63 75 72 72 65   there are curre
19b90 6e 74 6c 79 20 61 63 74 69 76 65 20 53 51 4c 20  ntly active SQL 
19ba0 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 20 20  statements..    
19bb0 20 20 20 20 20 20 20 20 2a 2a 20 42 75 74 20 74          ** But t
19bc0 68 65 20 63 6f 6e 74 65 6e 74 73 20 63 61 6e 20  he contents can 
19bd0 62 65 20 64 65 6c 65 74 65 64 2e 20 20 2a 2f 0a  be deleted.  */.
19be0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
19bf0 72 62 75 49 73 56 61 63 75 75 6d 28 70 29 3d 3d  rbuIsVacuum(p)==
19c00 30 20 26 26 20 70 49 74 65 72 2d 3e 61 62 49 6e  0 && pIter->abIn
19c10 64 65 78 65 64 20 29 7b 0a 20 20 20 20 20 20 20  dexed ){.       
19c20 20 20 20 20 20 20 20 72 62 75 4d 50 72 69 6e 74         rbuMPrint
19c30 66 45 78 65 63 28 70 2c 20 70 2d 3e 64 62 52 62  fExec(p, p->dbRb
19c40 75 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  u, .            
19c50 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52        "DELETE FR
19c60 4f 4d 20 25 73 2e 27 72 62 75 5f 74 6d 70 5f 25  OM %s.'rbu_tmp_%
19c70 71 27 22 2c 20 70 2d 3e 7a 53 74 61 74 65 44 62  q'", p->zStateDb
19c80 2c 20 70 49 74 65 72 2d 3e 7a 44 61 74 61 54 62  , pIter->zDataTb
19c90 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l.              
19ca0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
19cb0 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
19cc0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 62  {.            rb
19cd0 75 4f 62 6a 49 74 65 72 50 72 65 70 61 72 65 41  uObjIterPrepareA
19ce0 6c 6c 28 70 2c 20 70 49 74 65 72 2c 20 30 29 3b  ll(p, pIter, 0);
19cf0 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ..            /*
19d00 20 41 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20   Advance to the 
19d10 6e 65 78 74 20 72 6f 77 20 74 6f 20 70 72 6f 63  next row to proc
19d20 65 73 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ess. */.        
19d30 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
19d40 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19d50 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 63            int rc
19d60 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28   = sqlite3_step(
19d70 70 49 74 65 72 2d 3e 70 53 65 6c 65 63 74 29 3b  pIter->pSelect);
19d80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
19d90 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 52 4f  f( rc==SQLITE_RO
19da0 57 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  W ){.           
19db0 20 20 20 20 20 70 2d 3e 6e 50 72 6f 67 72 65 73       p->nProgres
19dc0 73 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  s++;.           
19dd0 20 20 20 20 20 70 2d 3e 6e 53 74 65 70 2b 2b 3b       p->nStep++;
19de0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19df0 20 72 65 74 75 72 6e 20 72 62 75 53 74 65 70 28   return rbuStep(
19e00 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  p);.            
19e10 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
19e20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65    p->rc = sqlite
19e30 33 5f 72 65 73 65 74 28 70 49 74 65 72 2d 3e 70  3_reset(pIter->p
19e40 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20  Select);.       
19e50 20 20 20 20 20 20 20 70 2d 3e 6e 53 74 65 70 20         p->nStep 
19e60 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
19e70 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a   }.          }..
19e80 20 20 20 20 20 20 20 20 20 20 72 62 75 4f 62 6a            rbuObj
19e90 49 74 65 72 4e 65 78 74 28 70 2c 20 70 49 74 65  IterNext(p, pIte
19ea0 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  r);.        }.. 
19eb0 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63         if( p->rc
19ec0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
19ed0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
19ee0 20 70 49 74 65 72 2d 3e 7a 54 62 6c 3d 3d 30 20   pIter->zTbl==0 
19ef0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 62 75  );.          rbu
19f00 53 61 76 65 53 74 61 74 65 28 70 2c 20 52 42 55  SaveState(p, RBU
19f10 5f 53 54 41 47 45 5f 4d 4f 56 45 29 3b 0a 20 20  _STAGE_MOVE);.  
19f20 20 20 20 20 20 20 20 20 72 62 75 49 6e 63 72 53          rbuIncrS
19f30 63 68 65 6d 61 43 6f 6f 6b 69 65 28 70 29 3b 0a  chemaCookie(p);.
19f40 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d            if( p-
19f50 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
19f60 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d  {.            p-
19f70 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78  >rc = sqlite3_ex
19f80 65 63 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 43  ec(p->dbMain, "C
19f90 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 2c 20 26 70  OMMIT", 0, 0, &p
19fa0 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a 20 20 20 20  ->zErrmsg);.    
19fb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
19fc0 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
19fd0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
19fe0 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71        p->rc = sq
19ff0 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62  lite3_exec(p->db
1a000 52 62 75 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30  Rbu, "COMMIT", 0
1a010 2c 20 30 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67  , 0, &p->zErrmsg
1a020 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
1a030 20 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61           p->eSta
1a040 67 65 20 3d 20 52 42 55 5f 53 54 41 47 45 5f 4d  ge = RBU_STAGE_M
1a050 4f 56 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  OVE;.        }. 
1a060 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1a070 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 63 61 73      }..      cas
1a080 65 20 52 42 55 5f 53 54 41 47 45 5f 4d 4f 56 45  e RBU_STAGE_MOVE
1a090 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  : {.        if( 
1a0a0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
1a0b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 62   ){.          rb
1a0c0 75 4d 6f 76 65 4f 61 6c 46 69 6c 65 28 70 29 3b  uMoveOalFile(p);
1a0d0 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 50  .          p->nP
1a0e0 72 6f 67 72 65 73 73 2b 2b 3b 0a 20 20 20 20 20  rogress++;.     
1a0f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65     }.        bre
1a100 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ak;.      }..   
1a110 20 20 20 63 61 73 65 20 52 42 55 5f 53 54 41 47     case RBU_STAG
1a120 45 5f 43 4b 50 54 3a 20 7b 0a 20 20 20 20 20 20  E_CKPT: {.      
1a130 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
1a140 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1a150 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 74 65 70      if( p->nStep
1a160 3e 3d 70 2d 3e 6e 46 72 61 6d 65 20 29 7b 0a 20  >=p->nFrame ){. 
1a170 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
1a180 65 33 5f 66 69 6c 65 20 2a 70 44 62 20 3d 20 70  e3_file *pDb = p
1a190 2d 3e 70 54 61 72 67 65 74 46 64 2d 3e 70 52 65  ->pTargetFd->pRe
1a1a0 61 6c 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 20  al;.  .         
1a1b0 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 64     /* Sync the d
1a1c0 62 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20  b file */.      
1a1d0 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 44        p->rc = pD
1a1e0 62 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53 79  b->pMethods->xSy
1a1f0 6e 63 28 70 44 62 2c 20 53 51 4c 49 54 45 5f 53  nc(pDb, SQLITE_S
1a200 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20 0a  YNC_NORMAL);.  .
1a210 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
1a220 70 64 61 74 65 20 6e 42 61 63 6b 66 69 6c 6c 20  pdate nBackfill 
1a230 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  */.            i
1a240 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
1a250 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1a260 20 20 20 20 20 76 6f 69 64 20 76 6f 6c 61 74 69       void volati
1a270 6c 65 20 2a 70 74 72 3b 0a 20 20 20 20 20 20 20  le *ptr;.       
1a280 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 70         p->rc = p
1a290 44 62 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53  Db->pMethods->xS
1a2a0 68 6d 4d 61 70 28 70 44 62 2c 20 30 2c 20 33 32  hmMap(pDb, 0, 32
1a2b0 2a 31 30 32 34 2c 20 30 2c 20 26 70 74 72 29 3b  *1024, 0, &ptr);
1a2c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
1a2d0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
1a2e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1a2f0 20 20 20 20 20 20 20 28 28 75 33 32 20 76 6f 6c         ((u32 vol
1a300 61 74 69 6c 65 2a 29 70 74 72 29 5b 32 34 5d 20  atile*)ptr)[24] 
1a310 3d 20 70 2d 3e 69 4d 61 78 46 72 61 6d 65 3b 0a  = p->iMaxFrame;.
1a320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
1a330 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1a340 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
1a350 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1a360 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
1a370 20 20 20 70 2d 3e 65 53 74 61 67 65 20 3d 20 52     p->eStage = R
1a380 42 55 5f 53 54 41 47 45 5f 44 4f 4e 45 3b 0a 20  BU_STAGE_DONE;. 
1a390 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
1a3a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
1a3b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
1a3c0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
1a3d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 52 62 75  .            Rbu
1a3e0 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 20 3d 20  Frame *pFrame = 
1a3f0 26 70 2d 3e 61 46 72 61 6d 65 5b 70 2d 3e 6e 53  &p->aFrame[p->nS
1a400 74 65 70 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  tep];.          
1a410 20 20 72 62 75 43 68 65 63 6b 70 6f 69 6e 74 46    rbuCheckpointF
1a420 72 61 6d 65 28 70 2c 20 70 46 72 61 6d 65 29 3b  rame(p, pFrame);
1a430 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  .            p->
1a440 6e 53 74 65 70 2b 2b 3b 0a 20 20 20 20 20 20 20  nStep++;.       
1a450 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
1a460 2d 3e 6e 50 72 6f 67 72 65 73 73 2b 2b 3b 0a 20  ->nProgress++;. 
1a470 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1a480 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
1a490 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  .      default:.
1a4a0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1a4b0 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
1a4c0 70 2d 3e 72 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a  p->rc;.  }else{.
1a4d0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1a4e0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 7d 0a 0a  E_NOMEM;.  }.}..
1a4f0 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 73 74  /*.** Compare st
1a500 72 69 6e 67 73 20 7a 31 20 61 6e 64 20 7a 32 2c  rings z1 and z2,
1a510 20 72 65 74 75 72 6e 69 6e 67 20 30 20 69 66 20   returning 0 if 
1a520 74 68 65 79 20 61 72 65 20 69 64 65 6e 74 69 63  they are identic
1a530 61 6c 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 0a  al, or non-zero.
1a540 2a 2a 20 6f 74 68 65 72 77 69 73 65 2e 20 45 69  ** otherwise. Ei
1a550 74 68 65 72 20 6f 72 20 62 6f 74 68 20 61 72 67  ther or both arg
1a560 75 6d 65 6e 74 20 6d 61 79 20 62 65 20 4e 55 4c  ument may be NUL
1a570 4c 2e 20 54 77 6f 20 4e 55 4c 4c 20 76 61 6c 75  L. Two NULL valu
1a580 65 73 20 61 72 65 0a 2a 2a 20 63 6f 6e 73 69 64  es are.** consid
1a590 65 72 65 64 20 65 71 75 61 6c 2c 20 61 6e 64 20  ered equal, and 
1a5a0 4e 55 4c 4c 20 69 73 20 63 6f 6e 73 69 64 65 72  NULL is consider
1a5b0 65 64 20 64 69 73 74 69 6e 63 74 20 66 72 6f 6d  ed distinct from
1a5c0 20 61 6c 6c 20 6f 74 68 65 72 20 76 61 6c 75 65   all other value
1a5d0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
1a5e0 20 72 62 75 53 74 72 43 6f 6d 70 61 72 65 28 63   rbuStrCompare(c
1a5f0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 31 2c 20 63  onst char *z1, c
1a600 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32 29 7b 0a  onst char *z2){.
1a610 20 20 69 66 28 20 7a 31 3d 3d 30 20 26 26 20 7a    if( z1==0 && z
1a620 32 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  2==0 ) return 0;
1a630 0a 20 20 69 66 28 20 7a 31 3d 3d 30 20 7c 7c 20  .  if( z1==0 || 
1a640 7a 32 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  z2==0 ) return 1
1a650 3b 0a 20 20 72 65 74 75 72 6e 20 28 73 71 6c 69  ;.  return (sqli
1a660 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 31 2c 20  te3_stricmp(z1, 
1a670 7a 32 29 21 3d 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  z2)!=0);.}../*.*
1a680 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1a690 69 73 20 63 61 6c 6c 65 64 20 61 73 20 70 61 72  is called as par
1a6a0 74 20 6f 66 20 73 71 6c 69 74 65 33 72 62 75 5f  t of sqlite3rbu_
1a6b0 6f 70 65 6e 28 29 20 77 68 65 6e 20 69 6e 69 74  open() when init
1a6c0 69 61 6c 69 7a 69 6e 67 0a 2a 2a 20 61 6e 20 72  ializing.** an r
1a6d0 62 75 20 68 61 6e 64 6c 65 20 69 6e 20 4f 41 4c  bu handle in OAL
1a6e0 20 73 74 61 67 65 2e 20 49 66 20 74 68 65 20 72   stage. If the r
1a6f0 62 75 20 75 70 64 61 74 65 20 68 61 73 20 6e 6f  bu update has no
1a700 74 20 73 74 61 72 74 65 64 20 28 69 2e 65 2e 0a  t started (i.e..
1a710 2a 2a 20 74 68 65 20 72 62 75 5f 73 74 61 74 65  ** the rbu_state
1a720 20 74 61 62 6c 65 20 77 61 73 20 65 6d 70 74 79   table was empty
1a730 29 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  ) it is a no-op.
1a740 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 61   Otherwise, it a
1a750 72 72 61 6e 67 65 73 0a 2a 2a 20 74 68 69 6e 67  rranges.** thing
1a760 73 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65  s so that the ne
1a770 78 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  xt call to sqlit
1a780 65 33 72 62 75 5f 73 74 65 70 28 29 20 63 6f 6e  e3rbu_step() con
1a790 74 69 6e 75 65 73 20 6f 6e 20 66 72 6f 6d 0a 2a  tinues on from.*
1a7a0 2a 20 77 68 65 72 65 20 74 68 65 20 70 72 65 76  * where the prev
1a7b0 69 6f 75 73 20 72 62 75 20 68 61 6e 64 6c 65 20  ious rbu handle 
1a7c0 6c 65 66 74 20 6f 66 66 2e 0a 2a 2a 0a 2a 2a 20  left off..**.** 
1a7d0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
1a7e0 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  rs, an error cod
1a7f0 65 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73  e and error mess
1a800 61 67 65 20 61 72 65 20 6c 65 66 74 20 69 6e 20  age are left in 
1a810 74 68 65 0a 2a 2a 20 72 62 75 20 68 61 6e 64 6c  the.** rbu handl
1a820 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
1a830 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a  first argument..
1a840 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
1a850 62 75 53 65 74 75 70 4f 61 6c 28 73 71 6c 69 74  buSetupOal(sqlit
1a860 65 33 72 62 75 20 2a 70 2c 20 52 62 75 53 74 61  e3rbu *p, RbuSta
1a870 74 65 20 2a 70 53 74 61 74 65 29 7b 0a 20 20 61  te *pState){.  a
1a880 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51  ssert( p->rc==SQ
1a890 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28  LITE_OK );.  if(
1a8a0 20 70 53 74 61 74 65 2d 3e 7a 54 62 6c 20 29 7b   pState->zTbl ){
1a8b0 0a 20 20 20 20 52 62 75 4f 62 6a 49 74 65 72 20  .    RbuObjIter 
1a8c0 2a 70 49 74 65 72 20 3d 20 26 70 2d 3e 6f 62 6a  *pIter = &p->obj
1a8d0 69 74 65 72 3b 0a 20 20 20 20 69 6e 74 20 72 63  iter;.    int rc
1a8e0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
1a8f0 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51     while( rc==SQ
1a900 4c 49 54 45 5f 4f 4b 20 26 26 20 70 49 74 65 72  LITE_OK && pIter
1a910 2d 3e 7a 54 62 6c 20 26 26 20 28 70 49 74 65 72  ->zTbl && (pIter
1a920 2d 3e 62 43 6c 65 61 6e 75 70 20 0a 20 20 20 20  ->bCleanup .    
1a930 20 20 20 7c 7c 20 72 62 75 53 74 72 43 6f 6d 70     || rbuStrComp
1a940 61 72 65 28 70 49 74 65 72 2d 3e 7a 49 64 78 2c  are(pIter->zIdx,
1a950 20 70 53 74 61 74 65 2d 3e 7a 49 64 78 29 0a 20   pState->zIdx). 
1a960 20 20 20 20 20 20 7c 7c 20 72 62 75 53 74 72 43        || rbuStrC
1a970 6f 6d 70 61 72 65 28 70 49 74 65 72 2d 3e 7a 54  ompare(pIter->zT
1a980 62 6c 2c 20 70 53 74 61 74 65 2d 3e 7a 54 62 6c  bl, pState->zTbl
1a990 29 20 0a 20 20 20 20 29 29 7b 0a 20 20 20 20 20  ) .    )){.     
1a9a0 20 72 63 20 3d 20 72 62 75 4f 62 6a 49 74 65 72   rc = rbuObjIter
1a9b0 4e 65 78 74 28 70 2c 20 70 49 74 65 72 29 3b 0a  Next(p, pIter);.
1a9c0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72      }..    if( r
1a9d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1a9e0 21 70 49 74 65 72 2d 3e 7a 54 62 6c 20 29 7b 0a  !pIter->zTbl ){.
1a9f0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1aa00 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 70  E_ERROR;.      p
1aa10 2d 3e 7a 45 72 72 6d 73 67 20 3d 20 73 71 6c 69  ->zErrmsg = sqli
1aa20 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 72 62 75  te3_mprintf("rbu
1aa30 5f 73 74 61 74 65 20 6d 69 73 6d 61 74 63 68 20  _state mismatch 
1aa40 65 72 72 6f 72 22 29 3b 0a 20 20 20 20 7d 0a 0a  error");.    }..
1aa50 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1aa60 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
1aa70 2d 3e 6e 53 74 65 70 20 3d 20 70 53 74 61 74 65  ->nStep = pState
1aa80 2d 3e 6e 52 6f 77 3b 0a 20 20 20 20 20 20 72 63  ->nRow;.      rc
1aa90 20 3d 20 72 62 75 4f 62 6a 49 74 65 72 50 72 65   = rbuObjIterPre
1aaa0 70 61 72 65 41 6c 6c 28 70 2c 20 26 70 2d 3e 6f  pareAll(p, &p->o
1aab0 62 6a 69 74 65 72 2c 20 70 2d 3e 6e 53 74 65 70  bjiter, p->nStep
1aac0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 2d  );.    }..    p-
1aad0 3e 72 63 20 3d 20 72 63 3b 0a 20 20 7d 0a 7d 0a  >rc = rc;.  }.}.
1aae0 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  ./*.** If there 
1aaf0 69 73 20 61 20 22 2a 2d 6f 61 6c 22 20 66 69 6c  is a "*-oal" fil
1ab00 65 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79  e in the file-sy
1ab10 73 74 65 6d 20 63 6f 72 72 65 73 70 6f 6e 64 69  stem correspondi
1ab20 6e 67 20 74 6f 20 74 68 65 0a 2a 2a 20 74 61 72  ng to the.** tar
1ab30 67 65 74 20 64 61 74 61 62 61 73 65 20 69 6e 20  get database in 
1ab40 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c  the file-system,
1ab50 20 64 65 6c 65 74 65 20 69 74 2e 20 49 66 20 61   delete it. If a
1ab60 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 0a  n error occurs,.
1ab70 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  ** leave an erro
1ab80 72 20 63 6f 64 65 20 61 6e 64 20 65 72 72 6f 72  r code and error
1ab90 20 6d 65 73 73 61 67 65 20 69 6e 20 74 68 65 20   message in the 
1aba0 72 62 75 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73  rbu handle..*/.s
1abb0 74 61 74 69 63 20 76 6f 69 64 20 72 62 75 44 65  tatic void rbuDe
1abc0 6c 65 74 65 4f 61 6c 46 69 6c 65 28 73 71 6c 69  leteOalFile(sqli
1abd0 74 65 33 72 62 75 20 2a 70 29 7b 0a 20 20 63 68  te3rbu *p){.  ch
1abe0 61 72 20 2a 7a 4f 61 6c 20 3d 20 72 62 75 4d 50  ar *zOal = rbuMP
1abf0 72 69 6e 74 66 28 70 2c 20 22 25 73 2d 6f 61 6c  rintf(p, "%s-oal
1ac00 22 2c 20 70 2d 3e 7a 54 61 72 67 65 74 29 3b 0a  ", p->zTarget);.
1ac10 20 20 69 66 28 20 7a 4f 61 6c 20 29 7b 0a 20 20    if( zOal ){.  
1ac20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
1ac30 56 66 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 66  Vfs = sqlite3_vf
1ac40 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20 20 20 61  s_find(0);.    a
1ac50 73 73 65 72 74 28 20 70 56 66 73 20 26 26 20 70  ssert( pVfs && p
1ac60 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
1ac70 26 26 20 70 2d 3e 7a 45 72 72 6d 73 67 3d 3d 30  && p->zErrmsg==0
1ac80 20 29 3b 0a 20 20 20 20 70 56 66 73 2d 3e 78 44   );.    pVfs->xD
1ac90 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4f 61 6c  elete(pVfs, zOal
1aca0 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
1acb0 33 5f 66 72 65 65 28 7a 4f 61 6c 29 3b 0a 20 20  3_free(zOal);.  
1acc0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  }.}../*.** Alloc
1acd0 61 74 65 20 61 20 70 72 69 76 61 74 65 20 72 62  ate a private rb
1ace0 75 20 56 46 53 20 66 6f 72 20 74 68 65 20 72 62  u VFS for the rb
1acf0 75 20 68 61 6e 64 6c 65 20 70 61 73 73 65 64 20  u handle passed 
1ad00 61 73 20 74 68 65 20 6f 6e 6c 79 0a 2a 2a 20 61  as the only.** a
1ad10 72 67 75 6d 65 6e 74 2e 20 54 68 69 73 20 56 46  rgument. This VF
1ad20 53 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 75  S will be used u
1ad30 6e 6c 65 73 73 20 74 68 65 20 63 61 6c 6c 20 74  nless the call t
1ad40 6f 20 73 71 6c 69 74 65 33 72 62 75 5f 6f 70 65  o sqlite3rbu_ope
1ad50 6e 28 29 0a 2a 2a 20 73 70 65 63 69 66 69 65 64  n().** specified
1ad60 20 61 20 55 52 49 20 77 69 74 68 20 61 20 76 66   a URI with a vf
1ad70 73 3d 3f 20 6f 70 74 69 6f 6e 20 69 6e 20 70 6c  s=? option in pl
1ad80 61 63 65 20 6f 66 20 61 20 74 61 72 67 65 74 20  ace of a target 
1ad90 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65  database.** file
1ada0 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   name..*/.static
1adb0 20 76 6f 69 64 20 72 62 75 43 72 65 61 74 65 56   void rbuCreateV
1adc0 66 73 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70  fs(sqlite3rbu *p
1add0 29 7b 0a 20 20 69 6e 74 20 72 6e 64 3b 0a 20 20  ){.  int rnd;.  
1ade0 63 68 61 72 20 7a 52 6e 64 5b 36 34 5d 3b 0a 0a  char zRnd[64];..
1adf0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d    assert( p->rc=
1ae00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
1ae10 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65  sqlite3_randomne
1ae20 73 73 28 73 69 7a 65 6f 66 28 69 6e 74 29 2c 20  ss(sizeof(int), 
1ae30 28 76 6f 69 64 2a 29 26 72 6e 64 29 3b 0a 20 20  (void*)&rnd);.  
1ae40 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
1ae50 28 73 69 7a 65 6f 66 28 7a 52 6e 64 29 2c 20 7a  (sizeof(zRnd), z
1ae60 52 6e 64 2c 20 22 72 62 75 5f 76 66 73 5f 25 64  Rnd, "rbu_vfs_%d
1ae70 22 2c 20 72 6e 64 29 3b 0a 20 20 70 2d 3e 72 63  ", rnd);.  p->rc
1ae80 20 3d 20 73 71 6c 69 74 65 33 72 62 75 5f 63 72   = sqlite3rbu_cr
1ae90 65 61 74 65 5f 76 66 73 28 7a 52 6e 64 2c 20 30  eate_vfs(zRnd, 0
1aea0 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  );.  if( p->rc==
1aeb0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1aec0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
1aed0 66 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73  fs = sqlite3_vfs
1aee0 5f 66 69 6e 64 28 7a 52 6e 64 29 3b 0a 20 20 20  _find(zRnd);.   
1aef0 20 61 73 73 65 72 74 28 20 70 56 66 73 20 29 3b   assert( pVfs );
1af00 0a 20 20 20 20 70 2d 3e 7a 56 66 73 4e 61 6d 65  .    p->zVfsName
1af10 20 3d 20 70 56 66 73 2d 3e 7a 4e 61 6d 65 3b 0a   = pVfs->zName;.
1af20 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73    }.}../*.** Des
1af30 74 72 6f 79 20 74 68 65 20 70 72 69 76 61 74 65  troy the private
1af40 20 56 46 53 20 63 72 65 61 74 65 64 20 66 6f 72   VFS created for
1af50 20 74 68 65 20 72 62 75 20 68 61 6e 64 6c 65 20   the rbu handle 
1af60 70 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e  passed as the on
1af70 6c 79 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 62  ly.** argument b
1af80 79 20 61 6e 20 65 61 72 6c 69 65 72 20 63 61 6c  y an earlier cal
1af90 6c 20 74 6f 20 72 62 75 43 72 65 61 74 65 56 66  l to rbuCreateVf
1afa0 73 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  s()..*/.static v
1afb0 6f 69 64 20 72 62 75 44 65 6c 65 74 65 56 66 73  oid rbuDeleteVfs
1afc0 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 29 7b  (sqlite3rbu *p){
1afd0 0a 20 20 69 66 28 20 70 2d 3e 7a 56 66 73 4e 61  .  if( p->zVfsNa
1afe0 6d 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  me ){.    sqlite
1aff0 33 72 62 75 5f 64 65 73 74 72 6f 79 5f 76 66 73  3rbu_destroy_vfs
1b000 28 70 2d 3e 7a 56 66 73 4e 61 6d 65 29 3b 0a 20  (p->zVfsName);. 
1b010 20 20 20 70 2d 3e 7a 56 66 73 4e 61 6d 65 20 3d     p->zVfsName =
1b020 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
1b030 20 54 68 69 73 20 75 73 65 72 2d 64 65 66 69 6e   This user-defin
1b040 65 64 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20  ed SQL function 
1b050 69 73 20 69 6e 76 6f 6b 65 64 20 77 69 74 68 20  is invoked with 
1b060 61 20 73 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e  a single argumen
1b070 74 20 2d 20 74 68 65 0a 2a 2a 20 6e 61 6d 65 20  t - the.** name 
1b080 6f 66 20 61 20 74 61 62 6c 65 20 65 78 70 65 63  of a table expec
1b090 74 65 64 20 74 6f 20 61 70 70 65 61 72 20 69 6e  ted to appear in
1b0a0 20 74 68 65 20 74 61 72 67 65 74 20 64 61 74 61   the target data
1b0b0 62 61 73 65 2e 20 49 74 20 72 65 74 75 72 6e 73  base. It returns
1b0c0 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  .** the number o
1b0d0 66 20 61 75 78 69 6c 6c 69 61 72 79 20 69 6e 64  f auxilliary ind
1b0e0 65 78 65 73 20 6f 6e 20 74 68 65 20 74 61 62 6c  exes on the tabl
1b0f0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
1b100 64 20 72 62 75 49 6e 64 65 78 43 6e 74 46 75 6e  d rbuIndexCntFun
1b110 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  c(.  sqlite3_con
1b120 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20 69  text *pCtx, .  i
1b130 6e 74 20 6e 56 61 6c 2c 0a 20 20 73 71 6c 69 74  nt nVal,.  sqlit
1b140 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c  e3_value **apVal
1b150 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 72 62 75  .){.  sqlite3rbu
1b160 20 2a 70 20 3d 20 28 73 71 6c 69 74 65 33 72 62   *p = (sqlite3rb
1b170 75 2a 29 73 71 6c 69 74 65 33 5f 75 73 65 72 5f  u*)sqlite3_user_
1b180 64 61 74 61 28 70 43 74 78 29 3b 0a 20 20 73 71  data(pCtx);.  sq
1b190 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
1b1a0 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a  t = 0;.  char *z
1b1b0 45 72 72 6d 73 67 20 3d 20 30 3b 0a 20 20 69 6e  Errmsg = 0;.  in
1b1c0 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
1b1d0 20 6e 56 61 6c 3d 3d 31 20 29 3b 0a 20 20 0a 20   nVal==1 );.  . 
1b1e0 20 72 63 20 3d 20 70 72 65 70 61 72 65 46 72 65   rc = prepareFre
1b1f0 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72  eAndCollectError
1b200 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 70 53 74  (p->dbMain, &pSt
1b210 6d 74 2c 20 26 7a 45 72 72 6d 73 67 2c 20 0a 20  mt, &zErrmsg, . 
1b220 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72       sqlite3_mpr
1b230 69 6e 74 66 28 22 53 45 4c 45 43 54 20 63 6f 75  intf("SELECT cou
1b240 6e 74 28 2a 29 20 46 52 4f 4d 20 73 71 6c 69 74  nt(*) FROM sqlit
1b250 65 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20 20  e_master ".     
1b260 20 20 20 22 57 48 45 52 45 20 74 79 70 65 3d 27     "WHERE type='
1b270 69 6e 64 65 78 27 20 41 4e 44 20 74 62 6c 5f 6e  index' AND tbl_n
1b280 61 6d 65 20 3d 20 25 51 22 2c 20 73 71 6c 69 74  ame = %Q", sqlit
1b290 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 70  e3_value_text(ap
1b2a0 56 61 6c 5b 30 5d 29 29 0a 20 20 29 3b 0a 20 20  Val[0])).  );.  
1b2b0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1b2c0 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
1b2d0 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 70 43  _result_error(pC
1b2e0 74 78 2c 20 7a 45 72 72 6d 73 67 2c 20 2d 31 29  tx, zErrmsg, -1)
1b2f0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
1b300 6e 74 20 6e 49 6e 64 65 78 20 3d 20 30 3b 0a 20  nt nIndex = 0;. 
1b310 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f     if( SQLITE_RO
1b320 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28  W==sqlite3_step(
1b330 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20 20  pStmt) ){.      
1b340 6e 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33  nIndex = sqlite3
1b350 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d  _column_int(pStm
1b360 74 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  t, 0);.    }.   
1b370 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69   rc = sqlite3_fi
1b380 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
1b390 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1b3a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
1b3b0 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
1b3c0 28 70 43 74 78 2c 20 6e 49 6e 64 65 78 29 3b 0a  (pCtx, nIndex);.
1b3d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1b3e0 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
1b3f0 65 72 72 6f 72 28 70 43 74 78 2c 20 73 71 6c 69  error(pCtx, sqli
1b400 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62  te3_errmsg(p->db
1b410 4d 61 69 6e 29 2c 20 2d 31 29 3b 0a 20 20 20 20  Main), -1);.    
1b420 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  }.  }..  sqlite3
1b430 5f 66 72 65 65 28 7a 45 72 72 6d 73 67 29 3b 0a  _free(zErrmsg);.
1b440 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
1b450 52 42 55 20 64 61 74 61 62 61 73 65 20 63 6f 6e  RBU database con
1b460 74 61 69 6e 73 20 74 68 65 20 72 62 75 5f 63 6f  tains the rbu_co
1b470 75 6e 74 20 74 61 62 6c 65 2c 20 75 73 65 20 69  unt table, use i
1b480 74 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 0a  t to initialize.
1b490 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 72 62  ** the sqlite3rb
1b4a0 75 2e 6e 50 68 61 73 65 4f 6e 65 53 74 65 70 20  u.nPhaseOneStep 
1b4b0 76 61 72 69 61 62 6c 65 2e 20 54 68 65 20 73 63  variable. The sc
1b4c0 68 65 6d 61 20 6f 66 20 74 68 65 20 72 62 75 5f  hema of the rbu_
1b4d0 63 6f 75 6e 74 20 74 61 62 6c 65 0a 2a 2a 20 69  count table.** i
1b4e0 73 20 61 73 73 75 6d 65 64 20 74 6f 20 63 6f 6e  s assumed to con
1b4f0 74 61 69 6e 20 74 68 65 20 73 61 6d 65 20 63 6f  tain the same co
1b500 6c 75 6d 6e 73 20 61 73 3a 0a 2a 2a 0a 2a 2a 20  lumns as:.**.** 
1b510 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 72    CREATE TABLE r
1b520 62 75 5f 63 6f 75 6e 74 28 74 62 6c 20 54 45 58  bu_count(tbl TEX
1b530 54 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 63  T PRIMARY KEY, c
1b540 6e 74 20 49 4e 54 45 47 45 52 29 20 57 49 54 48  nt INTEGER) WITH
1b550 4f 55 54 20 52 4f 57 49 44 3b 0a 2a 2a 0a 2a 2a  OUT ROWID;.**.**
1b560 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65   There should be
1b570 20 6f 6e 65 20 72 6f 77 20 69 6e 20 74 68 65 20   one row in the 
1b580 74 61 62 6c 65 20 66 6f 72 20 65 61 63 68 20 64  table for each d
1b590 61 74 61 5f 78 78 78 20 74 61 62 6c 65 20 69 6e  ata_xxx table in
1b5a0 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
1b5b0 2e 20 54 68 65 20 27 74 62 6c 27 20 63 6f 6c 75  . The 'tbl' colu
1b5c0 6d 6e 20 73 68 6f 75 6c 64 20 63 6f 6e 74 61 69  mn should contai
1b5d0 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  n the name of a 
1b5e0 64 61 74 61 5f 78 78 78 20 74 61 62 6c 65 2c 0a  data_xxx table,.
1b5f0 2a 2a 20 61 6e 64 20 74 68 65 20 63 6e 74 20 63  ** and the cnt c
1b600 6f 6c 75 6d 6e 20 74 68 65 20 6e 75 6d 62 65 72  olumn the number
1b610 20 6f 66 20 72 6f 77 73 20 69 74 20 63 6f 6e 74   of rows it cont
1b620 61 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 73 71 6c 69  ains..**.** sqli
1b630 74 65 33 72 62 75 2e 6e 50 68 61 73 65 4f 6e 65  te3rbu.nPhaseOne
1b640 53 74 65 70 20 69 73 20 69 6e 69 74 69 61 6c 69  Step is initiali
1b650 7a 65 64 20 74 6f 20 74 68 65 20 73 75 6d 20 6f  zed to the sum o
1b660 66 20 28 31 20 2b 20 6e 49 6e 64 65 78 29 20 2a  f (1 + nIndex) *
1b670 20 63 6e 74 0a 2a 2a 20 66 6f 72 20 61 6c 6c 20   cnt.** for all 
1b680 72 6f 77 73 20 69 6e 20 74 68 65 20 72 62 75 5f  rows in the rbu_
1b690 63 6f 75 6e 74 20 74 61 62 6c 65 2c 20 77 68 65  count table, whe
1b6a0 72 65 20 6e 49 6e 64 65 78 20 69 73 20 74 68 65  re nIndex is the
1b6b0 20 6e 75 6d 62 65 72 20 6f 66 20 0a 2a 2a 20 69   number of .** i
1b6c0 6e 64 65 78 65 73 20 6f 6e 20 74 68 65 20 63 6f  ndexes on the co
1b6d0 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61 72 67  rresponding targ
1b6e0 65 74 20 64 61 74 61 62 61 73 65 20 74 61 62 6c  et database tabl
1b6f0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
1b700 64 20 72 62 75 49 6e 69 74 50 68 61 73 65 4f 6e  d rbuInitPhaseOn
1b710 65 53 74 65 70 73 28 73 71 6c 69 74 65 33 72 62  eSteps(sqlite3rb
1b720 75 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  u *p){.  if( p->
1b730 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1b740 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  .    sqlite3_stm
1b750 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  t *pStmt = 0;.  
1b760 20 20 69 6e 74 20 62 45 78 69 73 74 73 20 3d 20    int bExists = 
1b770 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1b780 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 62 75    /* True if rbu
1b790 5f 63 6f 75 6e 74 20 65 78 69 73 74 73 20 2a 2f  _count exists */
1b7a0 0a 0a 20 20 20 20 70 2d 3e 6e 50 68 61 73 65 4f  ..    p->nPhaseO
1b7b0 6e 65 53 74 65 70 20 3d 20 2d 31 3b 0a 0a 20 20  neStep = -1;..  
1b7c0 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65    p->rc = sqlite
1b7d0 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
1b7e0 6e 28 70 2d 3e 64 62 52 62 75 2c 20 0a 20 20 20  n(p->dbRbu, .   
1b7f0 20 20 20 20 20 22 72 62 75 5f 69 6e 64 65 78 5f       "rbu_index_
1b800 63 6e 74 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f  cnt", 1, SQLITE_
1b810 55 54 46 38 2c 20 28 76 6f 69 64 2a 29 70 2c 20  UTF8, (void*)p, 
1b820 72 62 75 49 6e 64 65 78 43 6e 74 46 75 6e 63 2c  rbuIndexCntFunc,
1b830 20 30 2c 20 30 0a 20 20 20 20 29 3b 0a 20 20 0a   0, 0.    );.  .
1b840 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72      /* Check for
1b850 20 74 68 65 20 72 62 75 5f 63 6f 75 6e 74 20 74   the rbu_count t
1b860 61 62 6c 65 2e 20 49 66 20 69 74 20 64 6f 65 73  able. If it does
1b870 20 6e 6f 74 20 65 78 69 73 74 2c 20 6f 72 20 69   not exist, or i
1b880 66 20 61 6e 20 65 72 72 6f 72 0a 20 20 20 20 2a  f an error.    *
1b890 2a 20 6f 63 63 75 72 73 2c 20 6e 50 68 61 73 65  * occurs, nPhase
1b8a0 4f 6e 65 53 74 65 70 20 77 69 6c 6c 20 62 65 20  OneStep will be 
1b8b0 6c 65 66 74 20 73 65 74 20 74 6f 20 2d 31 2e 20  left set to -1. 
1b8c0 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  */.    if( p->rc
1b8d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1b8e0 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 72 65       p->rc = pre
1b8f0 70 61 72 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72  pareAndCollectEr
1b900 72 6f 72 28 70 2d 3e 64 62 52 62 75 2c 20 26 70  ror(p->dbRbu, &p
1b910 53 74 6d 74 2c 20 26 70 2d 3e 7a 45 72 72 6d 73  Stmt, &p->zErrms
1b920 67 2c 0a 20 20 20 20 20 20 20 20 20 20 22 53 45  g,.          "SE
1b930 4c 45 43 54 20 31 20 46 52 4f 4d 20 73 71 6c 69  LECT 1 FROM sqli
1b940 74 65 5f 6d 61 73 74 65 72 20 57 48 45 52 45 20  te_master WHERE 
1b950 74 62 6c 5f 6e 61 6d 65 20 3d 20 27 72 62 75 5f  tbl_name = 'rbu_
1b960 63 6f 75 6e 74 27 22 0a 20 20 20 20 20 20 29 3b  count'".      );
1b970 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1b980 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
1b990 29 7b 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c  ){.      if( SQL
1b9a0 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
1b9b0 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a  _step(pStmt) ){.
1b9c0 20 20 20 20 20 20 20 20 62 45 78 69 73 74 73 20          bExists 
1b9d0 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
1b9e0 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74     p->rc = sqlit
1b9f0 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
1ba00 74 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  t);.    }.  .   
1ba10 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
1ba20 54 45 5f 4f 4b 20 26 26 20 62 45 78 69 73 74 73  TE_OK && bExists
1ba30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20   ){.      p->rc 
1ba40 3d 20 70 72 65 70 61 72 65 41 6e 64 43 6f 6c 6c  = prepareAndColl
1ba50 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 52 62  ectError(p->dbRb
1ba60 75 2c 20 26 70 53 74 6d 74 2c 20 26 70 2d 3e 7a  u, &pStmt, &p->z
1ba70 45 72 72 6d 73 67 2c 0a 20 20 20 20 20 20 20 20  Errmsg,.        
1ba80 20 20 22 53 45 4c 45 43 54 20 73 75 6d 28 63 6e    "SELECT sum(cn
1ba90 74 20 2a 20 28 31 20 2b 20 72 62 75 5f 69 6e 64  t * (1 + rbu_ind
1baa0 65 78 5f 63 6e 74 28 72 62 75 5f 74 61 72 67 65  ex_cnt(rbu_targe
1bab0 74 5f 6e 61 6d 65 28 74 62 6c 29 29 29 29 22 0a  t_name(tbl))))".
1bac0 20 20 20 20 20 20 20 20 20 20 22 46 52 4f 4d 20            "FROM 
1bad0 72 62 75 5f 63 6f 75 6e 74 22 0a 20 20 20 20 20  rbu_count".     
1bae0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   );.      if( p-
1baf0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
1bb00 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 53 51  {.        if( SQ
1bb10 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65  LITE_ROW==sqlite
1bb20 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b  3_step(pStmt) ){
1bb30 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 50  .          p->nP
1bb40 68 61 73 65 4f 6e 65 53 74 65 70 20 3d 20 73 71  haseOneStep = sq
1bb50 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
1bb60 36 34 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  64(pStmt, 0);.  
1bb70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1bb80 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  p->rc = sqlite3_
1bb90 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
1bba0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1bbb0 20 7d 0a 7d 0a 0a 0a 73 74 61 74 69 63 20 73 71   }.}...static sq
1bbc0 6c 69 74 65 33 72 62 75 20 2a 6f 70 65 6e 52 62  lite3rbu *openRb
1bbd0 75 48 61 6e 64 6c 65 28 0a 20 20 63 6f 6e 73 74  uHandle(.  const
1bbe0 20 63 68 61 72 20 2a 7a 54 61 72 67 65 74 2c 20   char *zTarget, 
1bbf0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1bc00 52 62 75 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  Rbu,.  const cha
1bc10 72 20 2a 7a 53 74 61 74 65 0a 29 7b 0a 20 20 73  r *zState.){.  s
1bc20 71 6c 69 74 65 33 72 62 75 20 2a 70 3b 0a 20 20  qlite3rbu *p;.  
1bc30 73 69 7a 65 5f 74 20 6e 54 61 72 67 65 74 20 3d  size_t nTarget =
1bc40 20 7a 54 61 72 67 65 74 20 3f 20 73 74 72 6c 65   zTarget ? strle
1bc50 6e 28 7a 54 61 72 67 65 74 29 20 3a 20 30 3b 0a  n(zTarget) : 0;.
1bc60 20 20 73 69 7a 65 5f 74 20 6e 52 62 75 20 3d 20    size_t nRbu = 
1bc70 73 74 72 6c 65 6e 28 7a 52 62 75 29 3b 0a 20 20  strlen(zRbu);.  
1bc80 73 69 7a 65 5f 74 20 6e 42 79 74 65 20 3d 20 73  size_t nByte = s
1bc90 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 72 62 75  izeof(sqlite3rbu
1bca0 29 20 2b 20 6e 54 61 72 67 65 74 2b 31 20 2b 20  ) + nTarget+1 + 
1bcb0 6e 52 62 75 2b 31 3b 0a 0a 20 20 70 20 3d 20 28  nRbu+1;..  p = (
1bcc0 73 71 6c 69 74 65 33 72 62 75 2a 29 73 71 6c 69  sqlite3rbu*)sqli
1bcd0 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 42 79  te3_malloc64(nBy
1bce0 74 65 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a  te);.  if( p ){.
1bcf0 20 20 20 20 52 62 75 53 74 61 74 65 20 2a 70 53      RbuState *pS
1bd00 74 61 74 65 20 3d 20 30 3b 0a 0a 20 20 20 20 2f  tate = 0;..    /
1bd10 2a 20 43 72 65 61 74 65 20 74 68 65 20 63 75 73  * Create the cus
1bd20 74 6f 6d 20 56 46 53 2e 20 2a 2f 0a 20 20 20 20  tom VFS. */.    
1bd30 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a  memset(p, 0, siz
1bd40 65 6f 66 28 73 71 6c 69 74 65 33 72 62 75 29 29  eof(sqlite3rbu))
1bd50 3b 0a 20 20 20 20 72 62 75 43 72 65 61 74 65 56  ;.    rbuCreateV
1bd60 66 73 28 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f  fs(p);..    /* O
1bd70 70 65 6e 20 74 68 65 20 74 61 72 67 65 74 2c 20  pen the target, 
1bd80 52 42 55 20 61 6e 64 20 73 74 61 74 65 20 64 61  RBU and state da
1bd90 74 61 62 61 73 65 73 20 2a 2f 0a 20 20 20 20 69  tabases */.    i
1bda0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
1bdb0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 63 68 61  _OK ){.      cha
1bdc0 72 20 2a 70 43 73 72 20 3d 20 28 63 68 61 72 2a  r *pCsr = (char*
1bdd0 29 26 70 5b 31 5d 3b 0a 20 20 20 20 20 20 69 6e  )&p[1];.      in
1bde0 74 20 62 52 65 74 72 79 20 3d 20 30 3b 0a 20 20  t bRetry = 0;.  
1bdf0 20 20 20 20 69 66 28 20 7a 54 61 72 67 65 74 20      if( zTarget 
1be00 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 7a 54  ){.        p->zT
1be10 61 72 67 65 74 20 3d 20 70 43 73 72 3b 0a 20 20  arget = pCsr;.  
1be20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e        memcpy(p->
1be30 7a 54 61 72 67 65 74 2c 20 7a 54 61 72 67 65 74  zTarget, zTarget
1be40 2c 20 6e 54 61 72 67 65 74 2b 31 29 3b 0a 20 20  , nTarget+1);.  
1be50 20 20 20 20 20 20 70 43 73 72 20 2b 3d 20 6e 54        pCsr += nT
1be60 61 72 67 65 74 2b 31 3b 0a 20 20 20 20 20 20 7d  arget+1;.      }
1be70 0a 20 20 20 20 20 20 70 2d 3e 7a 52 62 75 20 3d  .      p->zRbu =
1be80 20 70 43 73 72 3b 0a 20 20 20 20 20 20 6d 65 6d   pCsr;.      mem
1be90 63 70 79 28 70 2d 3e 7a 52 62 75 2c 20 7a 52 62  cpy(p->zRbu, zRb
1bea0 75 2c 20 6e 52 62 75 2b 31 29 3b 0a 20 20 20 20  u, nRbu+1);.    
1beb0 20 20 70 43 73 72 20 2b 3d 20 6e 52 62 75 2b 31    pCsr += nRbu+1
1bec0 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 53 74 61  ;.      if( zSta
1bed0 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  te ){.        p-
1bee0 3e 7a 53 74 61 74 65 20 3d 20 72 62 75 4d 50 72  >zState = rbuMPr
1bef0 69 6e 74 66 28 70 2c 20 22 25 73 22 2c 20 7a 53  intf(p, "%s", zS
1bf00 74 61 74 65 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  tate);.      }..
1bf10 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
1bf20 66 69 72 73 74 20 61 74 74 65 6d 70 74 20 74 6f  first attempt to
1bf30 20 6f 70 65 6e 20 74 68 65 20 64 61 74 61 62 61   open the databa
1bf40 73 65 20 66 69 6c 65 20 66 61 69 6c 73 20 61 6e  se file fails an
1bf50 64 20 74 68 65 20 62 52 65 74 72 79 0a 20 20 20  d the bRetry.   
1bf60 20 20 20 2a 2a 20 66 6c 61 67 20 69 74 20 73 65     ** flag it se
1bf70 74 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 74 68  t, this means th
1bf80 61 74 20 74 68 65 20 64 62 20 77 61 73 20 6e 6f  at the db was no
1bf90 74 20 6f 70 65 6e 65 64 20 62 65 63 61 75 73 65  t opened because
1bfa0 20 69 74 20 73 65 65 6d 65 64 0a 20 20 20 20 20   it seemed.     
1bfb0 20 2a 2a 20 74 6f 20 62 65 20 61 20 77 61 6c 2d   ** to be a wal-
1bfc0 6d 6f 64 65 20 64 62 2e 20 42 75 74 2c 20 74 68  mode db. But, th
1bfd0 69 73 20 6d 61 79 20 68 61 76 65 20 68 61 70 70  is may have happ
1bfe0 65 6e 65 64 20 64 75 65 20 74 6f 20 61 6e 20 65  ened due to an e
1bff0 61 72 6c 69 65 72 0a 20 20 20 20 20 20 2a 2a 20  arlier.      ** 
1c000 52 42 55 20 76 61 63 75 75 6d 20 6f 70 65 72 61  RBU vacuum opera
1c010 74 69 6f 6e 20 6c 65 61 76 69 6e 67 20 61 6e 20  tion leaving an 
1c020 6f 6c 64 20 77 61 6c 20 66 69 6c 65 20 69 6e 20  old wal file in 
1c030 74 68 65 20 64 69 72 65 63 74 6f 72 79 2e 0a 20  the directory.. 
1c040 20 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20       ** If this 
1c050 69 73 20 74 68 65 20 63 61 73 65 2c 20 69 74 20  is the case, it 
1c060 77 69 6c 6c 20 68 61 76 65 20 62 65 65 6e 20 63  will have been c
1c070 68 65 63 6b 70 6f 69 6e 74 65 64 20 61 6e 64 20  heckpointed and 
1c080 64 65 6c 65 74 65 64 0a 20 20 20 20 20 20 2a 2a  deleted.      **
1c090 20 77 68 65 6e 20 74 68 65 20 68 61 6e 64 6c 65   when the handle
1c0a0 20 77 61 73 20 63 6c 6f 73 65 64 20 61 6e 64 20   was closed and 
1c0b0 61 20 73 65 63 6f 6e 64 20 61 74 74 65 6d 70 74  a second attempt
1c0c0 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 0a 20 20   to open the .  
1c0d0 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
1c0e0 6d 61 79 20 73 75 63 63 65 65 64 2e 20 20 2a 2f  may succeed.  */
1c0f0 0a 20 20 20 20 20 20 72 62 75 4f 70 65 6e 44 61  .      rbuOpenDa
1c100 74 61 62 61 73 65 28 70 2c 20 26 62 52 65 74 72  tabase(p, &bRetr
1c110 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62 52  y);.      if( bR
1c120 65 74 72 79 20 29 7b 0a 20 20 20 20 20 20 20 20  etry ){.        
1c130 72 62 75 4f 70 65 6e 44 61 74 61 62 61 73 65 28  rbuOpenDatabase(
1c140 70 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  p, 0);.      }. 
1c150 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 2d     }..    if( p-
1c160 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
1c170 7b 0a 20 20 20 20 20 20 70 53 74 61 74 65 20 3d  {.      pState =
1c180 20 72 62 75 4c 6f 61 64 53 74 61 74 65 28 70 29   rbuLoadState(p)
1c190 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1c1a0 70 53 74 61 74 65 20 7c 7c 20 70 2d 3e 72 63 21  pState || p->rc!
1c1b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
1c1c0 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
1c1d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 0a 20 20 20  QLITE_OK ){..   
1c1e0 20 20 20 20 20 69 66 28 20 70 53 74 61 74 65 2d       if( pState-
1c1f0 3e 65 53 74 61 67 65 3d 3d 30 20 29 7b 20 0a 20  >eStage==0 ){ . 
1c200 20 20 20 20 20 20 20 20 20 72 62 75 44 65 6c 65           rbuDele
1c210 74 65 4f 61 6c 46 69 6c 65 28 70 29 3b 0a 20 20  teOalFile(p);.  
1c220 20 20 20 20 20 20 20 20 72 62 75 49 6e 69 74 50          rbuInitP
1c230 68 61 73 65 4f 6e 65 53 74 65 70 73 28 70 29 3b  haseOneSteps(p);
1c240 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 65 53  .          p->eS
1c250 74 61 67 65 20 3d 20 52 42 55 5f 53 54 41 47 45  tage = RBU_STAGE
1c260 5f 4f 41 4c 3b 0a 20 20 20 20 20 20 20 20 7d 65  _OAL;.        }e
1c270 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
1c280 2d 3e 65 53 74 61 67 65 20 3d 20 70 53 74 61 74  ->eStage = pStat
1c290 65 2d 3e 65 53 74 61 67 65 3b 0a 20 20 20 20 20  e->eStage;.     
1c2a0 20 20 20 20 20 70 2d 3e 6e 50 68 61 73 65 4f 6e       p->nPhaseOn
1c2b0 65 53 74 65 70 20 3d 20 70 53 74 61 74 65 2d 3e  eStep = pState->
1c2c0 6e 50 68 61 73 65 4f 6e 65 53 74 65 70 3b 0a 20  nPhaseOneStep;. 
1c2d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1c2e0 20 70 2d 3e 6e 50 72 6f 67 72 65 73 73 20 3d 20   p->nProgress = 
1c2f0 70 53 74 61 74 65 2d 3e 6e 50 72 6f 67 72 65 73  pState->nProgres
1c300 73 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 4f  s;.        p->iO
1c310 61 6c 53 7a 20 3d 20 70 53 74 61 74 65 2d 3e 69  alSz = pState->i
1c320 4f 61 6c 53 7a 3b 0a 20 20 20 20 20 20 7d 0a 20  OalSz;.      }. 
1c330 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
1c340 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f   p->rc!=SQLITE_O
1c350 4b 20 7c 7c 20 70 2d 3e 65 53 74 61 67 65 21 3d  K || p->eStage!=
1c360 30 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d  0 );..    if( p-
1c370 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
1c380 26 20 70 2d 3e 70 54 61 72 67 65 74 46 64 2d 3e  & p->pTargetFd->
1c390 70 57 61 6c 46 64 20 29 7b 0a 20 20 20 20 20 20  pWalFd ){.      
1c3a0 69 66 28 20 70 2d 3e 65 53 74 61 67 65 3d 3d 52  if( p->eStage==R
1c3b0 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20 29 7b 0a  BU_STAGE_OAL ){.
1c3c0 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
1c3d0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
1c3e0 20 20 20 20 20 20 70 2d 3e 7a 45 72 72 6d 73 67        p->zErrmsg
1c3f0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
1c400 74 66 28 22 63 61 6e 6e 6f 74 20 75 70 64 61 74  tf("cannot updat
1c410 65 20 77 61 6c 20 6d 6f 64 65 20 64 61 74 61 62  e wal mode datab
1c420 61 73 65 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ase");.      }el
1c430 73 65 20 69 66 28 20 70 2d 3e 65 53 74 61 67 65  se if( p->eStage
1c440 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4d 4f 56 45  ==RBU_STAGE_MOVE
1c450 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65   ){.        p->e
1c460 53 74 61 67 65 20 3d 20 52 42 55 5f 53 54 41 47  Stage = RBU_STAG
1c470 45 5f 43 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  E_CKPT;.        
1c480 70 2d 3e 6e 53 74 65 70 20 3d 20 30 3b 0a 20 20  p->nStep = 0;.  
1c490 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1c4a0 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
1c4b0 54 45 5f 4f 4b 20 0a 20 20 20 20 20 26 26 20 28  TE_OK .     && (
1c4c0 70 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53  p->eStage==RBU_S
1c4d0 54 41 47 45 5f 4f 41 4c 20 7c 7c 20 70 2d 3e 65  TAGE_OAL || p->e
1c4e0 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45  Stage==RBU_STAGE
1c4f0 5f 4d 4f 56 45 29 0a 20 20 20 20 20 26 26 20 70  _MOVE).     && p
1c500 53 74 61 74 65 2d 3e 65 53 74 61 67 65 21 3d 30  State->eStage!=0
1c510 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 62  .    ){.      rb
1c520 75 5f 66 69 6c 65 20 2a 70 46 64 20 3d 20 28 72  u_file *pFd = (r
1c530 62 75 49 73 56 61 63 75 75 6d 28 70 29 20 3f 20  buIsVacuum(p) ? 
1c540 70 2d 3e 70 52 62 75 46 64 20 3a 20 70 2d 3e 70  p->pRbuFd : p->p
1c550 54 61 72 67 65 74 46 64 29 3b 0a 20 20 20 20 20  TargetFd);.     
1c560 20 69 66 28 20 70 46 64 2d 3e 69 43 6f 6f 6b 69   if( pFd->iCooki
1c570 65 21 3d 70 53 74 61 74 65 2d 3e 69 43 6f 6f 6b  e!=pState->iCook
1c580 69 65 20 29 7b 20 20 20 0a 20 20 20 20 20 20 20  ie ){   .       
1c590 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
1c5a0 74 20 28 70 54 61 72 67 65 74 46 64 2d 3e 69 43  t (pTargetFd->iC
1c5b0 6f 6f 6b 69 65 29 20 63 6f 6e 74 61 69 6e 73 20  ookie) contains 
1c5c0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
1c5d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 68 61 6e  .        ** chan
1c5e0 67 65 2d 63 6f 75 6e 74 65 72 20 63 6f 6f 6b 69  ge-counter cooki
1c5f0 65 20 28 74 68 65 20 74 68 69 6e 67 20 74 68 61  e (the thing tha
1c600 74 20 67 65 74 73 20 69 6e 63 72 65 6d 65 6e 74  t gets increment
1c610 65 64 20 77 68 65 6e 20 61 20 0a 20 20 20 20 20  ed when a .     
1c620 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
1c630 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 20 69  n is committed i
1c640 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 29  n rollback mode)
1c650 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65   currently store
1c660 64 20 6f 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a  d on .        **
1c670 20 70 61 67 65 20 31 20 6f 66 20 74 68 65 20 64   page 1 of the d
1c680 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f  atabase file. */
1c690 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  .        p->rc =
1c6a0 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
1c6b0 20 20 20 20 20 20 70 2d 3e 7a 45 72 72 6d 73 67        p->zErrmsg
1c6c0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
1c6d0 74 66 28 22 64 61 74 61 62 61 73 65 20 6d 6f 64  tf("database mod
1c6e0 69 66 69 65 64 20 64 75 72 69 6e 67 20 72 62 75  ified during rbu
1c6f0 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20   %s",.          
1c700 20 20 28 72 62 75 49 73 56 61 63 75 75 6d 28 70    (rbuIsVacuum(p
1c710 29 20 3f 20 22 76 61 63 75 75 6d 22 20 3a 20 22  ) ? "vacuum" : "
1c720 75 70 64 61 74 65 22 29 0a 20 20 20 20 20 20 20  update").       
1c730 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
1c740 7d 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  }..    if( p->rc
1c750 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1c760 20 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74 61       if( p->eSta
1c770 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4f 41  ge==RBU_STAGE_OA
1c780 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  L ){.        sql
1c790 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
1c7a0 4d 61 69 6e 3b 0a 20 20 20 20 20 20 20 20 70 2d  Main;.        p-
1c7b0 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78  >rc = sqlite3_ex
1c7c0 65 63 28 70 2d 3e 64 62 52 62 75 2c 20 22 42 45  ec(p->dbRbu, "BE
1c7d0 47 49 4e 22 2c 20 30 2c 20 30 2c 20 26 70 2d 3e  GIN", 0, 0, &p->
1c7e0 7a 45 72 72 6d 73 67 29 3b 0a 0a 20 20 20 20 20  zErrmsg);..     
1c7f0 20 20 20 2f 2a 20 50 6f 69 6e 74 20 74 68 65 20     /* Point the 
1c800 6f 62 6a 65 63 74 20 69 74 65 72 61 74 6f 72 20  object iterator 
1c810 61 74 20 74 68 65 20 66 69 72 73 74 20 6f 62 6a  at the first obj
1c820 65 63 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ect */.        i
1c830 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
1c840 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1c850 20 70 2d 3e 72 63 20 3d 20 72 62 75 4f 62 6a 49   p->rc = rbuObjI
1c860 74 65 72 46 69 72 73 74 28 70 2c 20 26 70 2d 3e  terFirst(p, &p->
1c870 6f 62 6a 69 74 65 72 29 3b 0a 20 20 20 20 20 20  objiter);.      
1c880 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
1c890 49 66 20 74 68 65 20 52 42 55 20 64 61 74 61 62  If the RBU datab
1c8a0 61 73 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20  ase contains no 
1c8b0 64 61 74 61 5f 78 78 78 20 74 61 62 6c 65 73 2c  data_xxx tables,
1c8c0 20 64 65 63 6c 61 72 65 20 74 68 65 20 52 42 55   declare the RBU
1c8d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 75 70 64 61  .        ** upda
1c8e0 74 65 20 66 69 6e 69 73 68 65 64 2e 20 20 2a 2f  te finished.  */
1c8f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
1c900 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1c910 20 70 2d 3e 6f 62 6a 69 74 65 72 2e 7a 54 62 6c   p->objiter.zTbl
1c920 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
1c930 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
1c940 44 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 20 20  DONE;.          
1c950 70 2d 3e 65 53 74 61 67 65 20 3d 20 52 42 55 5f  p->eStage = RBU_
1c960 53 54 41 47 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  STAGE_DONE;.    
1c970 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c980 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
1c990 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 53 74  SQLITE_OK && pSt
1c9a0 61 74 65 2d 3e 65 53 74 61 67 65 3d 3d 30 20 26  ate->eStage==0 &
1c9b0 26 20 72 62 75 49 73 56 61 63 75 75 6d 28 70 29  & rbuIsVacuum(p)
1c9c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1c9d0 72 62 75 43 6f 70 79 50 72 61 67 6d 61 28 70 2c  rbuCopyPragma(p,
1c9e0 20 22 70 61 67 65 5f 73 69 7a 65 22 29 3b 0a 20   "page_size");. 
1c9f0 20 20 20 20 20 20 20 20 20 20 20 72 62 75 43 6f             rbuCo
1ca00 70 79 50 72 61 67 6d 61 28 70 2c 20 22 61 75 74  pyPragma(p, "aut
1ca10 6f 5f 76 61 63 75 75 6d 22 29 3b 0a 20 20 20 20  o_vacuum");.    
1ca20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
1ca30 20 20 20 2f 2a 20 4f 70 65 6e 20 74 72 61 6e 73     /* Open trans
1ca40 61 63 74 69 6f 6e 73 20 62 6f 74 68 20 64 61 74  actions both dat
1ca50 61 62 61 73 65 73 2e 20 54 68 65 20 2a 2d 6f 61  abases. The *-oa
1ca60 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64  l file is opened
1ca70 20 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   or.          **
1ca80 20 63 72 65 61 74 65 64 20 61 74 20 74 68 69 73   created at this
1ca90 20 70 6f 69 6e 74 2e 20 2a 2f 0a 20 20 20 20 20   point. */.     
1caa0 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
1cab0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1cac0 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d           p->rc =
1cad0 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62   sqlite3_exec(db
1cae0 2c 20 22 42 45 47 49 4e 20 49 4d 4d 45 44 49 41  , "BEGIN IMMEDIA
1caf0 54 45 22 2c 20 30 2c 20 30 2c 20 26 70 2d 3e 7a  TE", 0, 0, &p->z
1cb00 45 72 72 6d 73 67 29 3b 0a 20 20 20 20 20 20 20  Errmsg);.       
1cb10 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20     }..          
1cb20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20  /* Check if the 
1cb30 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 69 73  main database is
1cb40 20 61 20 7a 69 70 76 66 73 20 64 62 2e 20 49 66   a zipvfs db. If
1cb50 20 69 74 20 69 73 2c 20 73 65 74 20 74 68 65 20   it is, set the 
1cb60 75 70 70 65 72 0a 20 20 20 20 20 20 20 20 20 20  upper.          
1cb70 2a 2a 20 6c 65 76 65 6c 20 70 61 67 65 72 20 74  ** level pager t
1cb80 6f 20 75 73 65 20 22 6a 6f 75 72 6e 61 6c 5f 6d  o use "journal_m
1cb90 6f 64 65 3d 6f 66 66 22 2e 20 54 68 69 73 20 70  ode=off". This p
1cba0 72 65 76 65 6e 74 73 20 69 74 20 66 72 6f 6d 20  revents it from 
1cbb0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 67 65  .          ** ge
1cbc0 6e 65 72 61 74 69 6e 67 20 61 20 6c 61 72 67 65  nerating a large
1cbd0 20 6a 6f 75 72 6e 61 6c 20 75 73 69 6e 67 20 61   journal using a
1cbe0 20 74 65 6d 70 20 66 69 6c 65 2e 20 20 2a 2f 0a   temp file.  */.
1cbf0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d            if( p-
1cc00 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
1cc10 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
1cc20 74 20 66 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  t frc = sqlite3_
1cc30 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c  file_control(db,
1cc40 20 22 6d 61 69 6e 22 2c 20 53 51 4c 49 54 45 5f   "main", SQLITE_
1cc50 46 43 4e 54 4c 5f 5a 49 50 56 46 53 2c 20 30 29  FCNTL_ZIPVFS, 0)
1cc60 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
1cc70 28 20 66 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  ( frc==SQLITE_OK
1cc80 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1cc90 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65    p->rc = sqlite
1cca0 33 5f 65 78 65 63 28 0a 20 20 20 20 20 20 20 20  3_exec(.        
1ccb0 20 20 20 20 20 20 20 20 64 62 2c 20 22 50 52 41          db, "PRA
1ccc0 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
1ccd0 3d 6f 66 66 22 2c 30 2c 30 2c 26 70 2d 3e 7a 45  =off",0,0,&p->zE
1cce0 72 72 6d 73 67 29 3b 0a 20 20 20 20 20 20 20 20  rrmsg);.        
1ccf0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1cd00 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  }..          if(
1cd10 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1cd20 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
1cd30 20 72 62 75 53 65 74 75 70 4f 61 6c 28 70 2c 20   rbuSetupOal(p, 
1cd40 70 53 74 61 74 65 29 3b 0a 20 20 20 20 20 20 20  pState);.       
1cd50 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
1cd60 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
1cd70 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54  ->eStage==RBU_ST
1cd80 41 47 45 5f 4d 4f 56 45 20 29 7b 0a 20 20 20 20  AGE_MOVE ){.    
1cd90 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a      /* no-op */.
1cda0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1cdb0 70 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53  p->eStage==RBU_S
1cdc0 54 41 47 45 5f 43 4b 50 54 20 29 7b 0a 20 20 20  TAGE_CKPT ){.   
1cdd0 20 20 20 20 20 72 62 75 53 65 74 75 70 43 68 65       rbuSetupChe
1cde0 63 6b 70 6f 69 6e 74 28 70 2c 20 70 53 74 61 74  ckpoint(p, pStat
1cdf0 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  e);.      }else 
1ce00 69 66 28 20 70 2d 3e 65 53 74 61 67 65 3d 3d 52  if( p->eStage==R
1ce10 42 55 5f 53 54 41 47 45 5f 44 4f 4e 45 20 29 7b  BU_STAGE_DONE ){
1ce20 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  .        p->rc =
1ce30 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
1ce40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1ce50 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
1ce60 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20  E_CORRUPT;.     
1ce70 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 62   }.    }..    rb
1ce80 75 46 72 65 65 53 74 61 74 65 28 70 53 74 61 74  uFreeState(pStat
1ce90 65 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  e);.  }..  retur
1cea0 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  n p;.}../*.** Al
1ceb0 6c 6f 63 61 74 65 20 61 6e 64 20 72 65 74 75 72  locate and retur
1cec0 6e 20 61 6e 20 52 42 55 20 68 61 6e 64 6c 65 20  n an RBU handle 
1ced0 77 69 74 68 20 61 6c 6c 20 66 69 65 6c 64 73 20  with all fields 
1cee0 7a 65 72 6f 65 64 20 65 78 63 65 70 74 20 66 6f  zeroed except fo
1cef0 72 20 74 68 65 0a 2a 2a 20 65 72 72 6f 72 20 63  r the.** error c
1cf00 6f 64 65 2c 20 77 68 69 63 68 20 69 73 20 73 65  ode, which is se
1cf10 74 20 74 6f 20 53 51 4c 49 54 45 5f 4d 49 53 55  t to SQLITE_MISU
1cf20 53 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71  SE..*/.static sq
1cf30 6c 69 74 65 33 72 62 75 20 2a 72 62 75 4d 69 73  lite3rbu *rbuMis
1cf40 75 73 65 45 72 72 6f 72 28 76 6f 69 64 29 7b 0a  useError(void){.
1cf50 20 20 73 71 6c 69 74 65 33 72 62 75 20 2a 70 52    sqlite3rbu *pR
1cf60 65 74 3b 0a 20 20 70 52 65 74 20 3d 20 73 71 6c  et;.  pRet = sql
1cf70 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 73 69  ite3_malloc64(si
1cf80 7a 65 6f 66 28 73 71 6c 69 74 65 33 72 62 75 29  zeof(sqlite3rbu)
1cf90 29 3b 0a 20 20 69 66 28 20 70 52 65 74 20 29 7b  );.  if( pRet ){
1cfa0 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 52 65 74  .    memset(pRet
1cfb0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 71 6c 69  , 0, sizeof(sqli
1cfc0 74 65 33 72 62 75 29 29 3b 0a 20 20 20 20 70 52  te3rbu));.    pR
1cfd0 65 74 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f  et->rc = SQLITE_
1cfe0 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 20 20 72 65  MISUSE;.  }.  re
1cff0 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a  turn pRet;.}../*
1d000 0a 2a 2a 20 4f 70 65 6e 20 61 6e 64 20 72 65 74  .** Open and ret
1d010 75 72 6e 20 61 20 6e 65 77 20 52 42 55 20 68 61  urn a new RBU ha
1d020 6e 64 6c 65 2e 20 0a 2a 2f 0a 73 71 6c 69 74 65  ndle. .*/.sqlite
1d030 33 72 62 75 20 2a 73 71 6c 69 74 65 33 72 62 75  3rbu *sqlite3rbu
1d040 5f 6f 70 65 6e 28 0a 20 20 63 6f 6e 73 74 20 63  _open(.  const c
1d050 68 61 72 20 2a 7a 54 61 72 67 65 74 2c 20 0a 20  har *zTarget, . 
1d060 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 62   const char *zRb
1d070 75 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  u,.  const char 
1d080 2a 7a 53 74 61 74 65 0a 29 7b 0a 20 20 69 66 28  *zState.){.  if(
1d090 20 7a 54 61 72 67 65 74 3d 3d 30 20 7c 7c 20 7a   zTarget==0 || z
1d0a0 52 62 75 3d 3d 30 20 29 7b 20 72 65 74 75 72 6e  Rbu==0 ){ return
1d0b0 20 72 62 75 4d 69 73 75 73 65 45 72 72 6f 72 28   rbuMisuseError(
1d0c0 29 3b 20 7d 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20  ); }.  /* TODO: 
1d0d0 43 68 65 63 6b 20 74 68 61 74 20 7a 54 61 72 67  Check that zTarg
1d0e0 65 74 20 61 6e 64 20 7a 52 62 75 20 61 72 65 20  et and zRbu are 
1d0f0 6e 6f 6e 2d 4e 55 4c 4c 20 2a 2f 0a 20 20 72 65  non-NULL */.  re
1d100 74 75 72 6e 20 6f 70 65 6e 52 62 75 48 61 6e 64  turn openRbuHand
1d110 6c 65 28 7a 54 61 72 67 65 74 2c 20 7a 52 62 75  le(zTarget, zRbu
1d120 2c 20 7a 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a  , zState);.}../*
1d130 0a 2a 2a 20 4f 70 65 6e 20 61 20 68 61 6e 64 6c  .** Open a handl
1d140 65 20 74 6f 20 62 65 67 69 6e 20 6f 72 20 72 65  e to begin or re
1d150 73 75 6d 65 20 61 6e 20 52 42 55 20 56 41 43 55  sume an RBU VACU
1d160 55 4d 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f  UM operation..*/
1d170 0a 73 71 6c 69 74 65 33 72 62 75 20 2a 73 71 6c  .sqlite3rbu *sql
1d180 69 74 65 33 72 62 75 5f 76 61 63 75 75 6d 28 0a  ite3rbu_vacuum(.
1d190 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
1d1a0 61 72 67 65 74 2c 20 0a 20 20 63 6f 6e 73 74 20  arget, .  const 
1d1b0 63 68 61 72 20 2a 7a 53 74 61 74 65 0a 29 7b 0a  char *zState.){.
1d1c0 20 20 69 66 28 20 7a 54 61 72 67 65 74 3d 3d 30    if( zTarget==0
1d1d0 20 29 7b 20 72 65 74 75 72 6e 20 72 62 75 4d 69   ){ return rbuMi
1d1e0 73 75 73 65 45 72 72 6f 72 28 29 3b 20 7d 0a 20  suseError(); }. 
1d1f0 20 2f 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20   /* TODO: Check 
1d200 74 68 61 74 20 62 6f 74 68 20 61 72 67 75 6d 65  that both argume
1d210 6e 74 73 20 61 72 65 20 6e 6f 6e 2d 4e 55 4c 4c  nts are non-NULL
1d220 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 6f 70 65   */.  return ope
1d230 6e 52 62 75 48 61 6e 64 6c 65 28 30 2c 20 7a 54  nRbuHandle(0, zT
1d240 61 72 67 65 74 2c 20 7a 53 74 61 74 65 29 3b 0a  arget, zState);.
1d250 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1d260 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
1d270 64 6c 65 20 75 73 65 64 20 62 79 20 70 52 62 75  dle used by pRbu
1d280 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20 2a 73 71  ..*/.sqlite3 *sq
1d290 6c 69 74 65 33 72 62 75 5f 64 62 28 73 71 6c 69  lite3rbu_db(sqli
1d2a0 74 65 33 72 62 75 20 2a 70 52 62 75 2c 20 69 6e  te3rbu *pRbu, in
1d2b0 74 20 62 52 62 75 29 7b 0a 20 20 73 71 6c 69 74  t bRbu){.  sqlit
1d2c0 65 33 20 2a 64 62 20 3d 20 30 3b 0a 20 20 69 66  e3 *db = 0;.  if
1d2d0 28 20 70 52 62 75 20 29 7b 0a 20 20 20 20 64 62  ( pRbu ){.    db
1d2e0 20 3d 20 28 62 52 62 75 20 3f 20 70 52 62 75 2d   = (bRbu ? pRbu-
1d2f0 3e 64 62 52 62 75 20 3a 20 70 52 62 75 2d 3e 64  >dbRbu : pRbu->d
1d300 62 4d 61 69 6e 29 3b 0a 20 20 7d 0a 20 20 72 65  bMain);.  }.  re
1d310 74 75 72 6e 20 64 62 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn db;.}.../*.
1d320 2a 2a 20 49 66 20 74 68 65 20 65 72 72 6f 72 20  ** If the error 
1d330 63 6f 64 65 20 63 75 72 72 65 6e 74 6c 79 20 73  code currently s
1d340 74 6f 72 65 64 20 69 6e 20 74 68 65 20 52 42 55  tored in the RBU
1d350 20 68 61 6e 64 6c 65 20 69 73 20 53 51 4c 49 54   handle is SQLIT
1d360 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 0a 2a 2a  E_CONSTRAINT,.**
1d370 20 74 68 65 6e 20 65 64 69 74 20 61 6e 79 20 65   then edit any e
1d380 72 72 6f 72 20 6d 65 73 73 61 67 65 20 73 74 72  rror message str
1d390 69 6e 67 20 73 6f 20 61 73 20 74 6f 20 72 65 6d  ing so as to rem
1d3a0 6f 76 65 20 61 6c 6c 20 6f 63 63 75 72 72 65 6e  ove all occurren
1d3b0 63 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 70 61  ces of.** the pa
1d3c0 74 74 65 72 6e 20 22 72 62 75 5f 69 6d 70 5f 5b  ttern "rbu_imp_[
1d3d0 30 2d 39 5d 2a 22 2e 0a 2a 2f 0a 73 74 61 74 69  0-9]*"..*/.stati
1d3e0 63 20 76 6f 69 64 20 72 62 75 45 64 69 74 45 72  c void rbuEditEr
1d3f0 72 6d 73 67 28 73 71 6c 69 74 65 33 72 62 75 20  rmsg(sqlite3rbu 
1d400 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63  *p){.  if( p->rc
1d410 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  ==SQLITE_CONSTRA
1d420 49 4e 54 20 26 26 20 70 2d 3e 7a 45 72 72 6d 73  INT && p->zErrms
1d430 67 20 29 7b 0a 20 20 20 20 75 6e 73 69 67 6e 65  g ){.    unsigne
1d440 64 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 69 7a  d int i;.    siz
1d450 65 5f 74 20 6e 45 72 72 6d 73 67 20 3d 20 73 74  e_t nErrmsg = st
1d460 72 6c 65 6e 28 70 2d 3e 7a 45 72 72 6d 73 67 29  rlen(p->zErrmsg)
1d470 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
1d480 3c 28 6e 45 72 72 6d 73 67 2d 38 29 3b 20 69 2b  <(nErrmsg-8); i+
1d490 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6d 65  +){.      if( me
1d4a0 6d 63 6d 70 28 26 70 2d 3e 7a 45 72 72 6d 73 67  mcmp(&p->zErrmsg
1d4b0 5b 69 5d 2c 20 22 72 62 75 5f 69 6d 70 5f 22 2c  [i], "rbu_imp_",
1d4c0 20 38 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   8)==0 ){.      
1d4d0 20 20 69 6e 74 20 6e 44 65 6c 20 3d 20 38 3b 0a    int nDel = 8;.
1d4e0 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70          while( p
1d4f0 2d 3e 7a 45 72 72 6d 73 67 5b 69 2b 6e 44 65 6c  ->zErrmsg[i+nDel
1d500 5d 3e 3d 27 30 27 20 26 26 20 70 2d 3e 7a 45 72  ]>='0' && p->zEr
1d510 72 6d 73 67 5b 69 2b 6e 44 65 6c 5d 3c 3d 27 39  rmsg[i+nDel]<='9
1d520 27 20 29 20 6e 44 65 6c 2b 2b 3b 0a 20 20 20 20  ' ) nDel++;.    
1d530 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26 70 2d 3e      memmove(&p->
1d540 7a 45 72 72 6d 73 67 5b 69 5d 2c 20 26 70 2d 3e  zErrmsg[i], &p->
1d550 7a 45 72 72 6d 73 67 5b 69 2b 6e 44 65 6c 5d 2c  zErrmsg[i+nDel],
1d560 20 6e 45 72 72 6d 73 67 20 2b 20 31 20 2d 20 69   nErrmsg + 1 - i
1d570 20 2d 20 6e 44 65 6c 29 3b 0a 20 20 20 20 20 20   - nDel);.      
1d580 20 20 6e 45 72 72 6d 73 67 20 2d 3d 20 6e 44 65    nErrmsg -= nDe
1d590 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  l;.      }.    }
1d5a0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  .  }.}../*.** Cl
1d5b0 6f 73 65 20 74 68 65 20 52 42 55 20 68 61 6e 64  ose the RBU hand
1d5c0 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  le..*/.int sqlit
1d5d0 65 33 72 62 75 5f 63 6c 6f 73 65 28 73 71 6c 69  e3rbu_close(sqli
1d5e0 74 65 33 72 62 75 20 2a 70 2c 20 63 68 61 72 20  te3rbu *p, char 
1d5f0 2a 2a 70 7a 45 72 72 6d 73 67 29 7b 0a 20 20 69  **pzErrmsg){.  i
1d600 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 70 20 29  nt rc;.  if( p )
1d610 7b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 6d 69 74  {..    /* Commit
1d620 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1d630 20 74 6f 20 74 68 65 20 2a 2d 6f 61 6c 20 66 69   to the *-oal fi
1d640 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  le. */.    if( p
1d650 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
1d660 26 26 20 70 2d 3e 65 53 74 61 67 65 3d 3d 52 42  && p->eStage==RB
1d670 55 5f 53 54 41 47 45 5f 4f 41 4c 20 29 7b 0a 20  U_STAGE_OAL ){. 
1d680 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c       p->rc = sql
1d690 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 4d  ite3_exec(p->dbM
1d6a0 61 69 6e 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30  ain, "COMMIT", 0
1d6b0 2c 20 30 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67  , 0, &p->zErrmsg
1d6c0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 62  );.    }..    rb
1d6d0 75 53 61 76 65 53 74 61 74 65 28 70 2c 20 70 2d  uSaveState(p, p-
1d6e0 3e 65 53 74 61 67 65 29 3b 0a 0a 20 20 20 20 69  >eStage);..    i
1d6f0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
1d700 5f 4f 4b 20 26 26 20 70 2d 3e 65 53 74 61 67 65  _OK && p->eStage
1d710 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20  ==RBU_STAGE_OAL 
1d720 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  ){.      p->rc =
1d730 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d   sqlite3_exec(p-
1d740 3e 64 62 52 62 75 2c 20 22 43 4f 4d 4d 49 54 22  >dbRbu, "COMMIT"
1d750 2c 20 30 2c 20 30 2c 20 26 70 2d 3e 7a 45 72 72  , 0, 0, &p->zErr
1d760 6d 73 67 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  msg);.    }..   
1d770 20 2f 2a 20 43 6c 6f 73 65 20 61 6e 79 20 6f 70   /* Close any op
1d780 65 6e 20 73 74 61 74 65 6d 65 6e 74 20 68 61 6e  en statement han
1d790 64 6c 65 73 2e 20 2a 2f 0a 20 20 20 20 72 62 75  dles. */.    rbu
1d7a0 4f 62 6a 49 74 65 72 46 69 6e 61 6c 69 7a 65 28  ObjIterFinalize(
1d7b0 26 70 2d 3e 6f 62 6a 69 74 65 72 29 3b 0a 0a 20  &p->objiter);.. 
1d7c0 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
1d7d0 20 61 6e 20 52 42 55 20 76 61 63 75 75 6d 20 68   an RBU vacuum h
1d7e0 61 6e 64 6c 65 20 61 6e 64 20 74 68 65 20 76 61  andle and the va
1d7f0 63 75 75 6d 20 68 61 73 20 65 69 74 68 65 72 20  cuum has either 
1d800 66 69 6e 69 73 68 65 64 0a 20 20 20 20 2a 2a 20  finished.    ** 
1d810 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 72 20  successfully or 
1d820 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 6e 20 65  encountered an e
1d830 72 72 6f 72 2c 20 64 65 6c 65 74 65 20 74 68 65  rror, delete the
1d840 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
1d850 20 0a 20 20 20 20 2a 2a 20 73 74 61 74 65 20 74   .    ** state t
1d860 61 62 6c 65 2e 20 54 68 69 73 20 63 61 75 73 65  able. This cause
1d870 73 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20  s the next call 
1d880 74 6f 20 73 71 6c 69 74 65 33 72 62 75 5f 76 61  to sqlite3rbu_va
1d890 63 75 75 6d 28 29 20 0a 20 20 20 20 2a 2a 20 73  cuum() .    ** s
1d8a0 70 65 63 69 66 79 69 6e 67 20 74 68 65 20 63 75  pecifying the cu
1d8b0 72 72 65 6e 74 20 74 61 72 67 65 74 20 61 6e 64  rrent target and
1d8c0 20 73 74 61 74 65 20 64 61 74 61 62 61 73 65 73   state databases
1d8d0 20 74 6f 20 73 74 61 72 74 20 61 20 6e 65 77 0a   to start a new.
1d8e0 20 20 20 20 2a 2a 20 76 61 63 75 75 6d 20 66 72      ** vacuum fr
1d8f0 6f 6d 20 73 63 72 61 74 63 68 2e 20 20 2a 2f 0a  om scratch.  */.
1d900 20 20 20 20 69 66 28 20 72 62 75 49 73 56 61 63      if( rbuIsVac
1d910 75 75 6d 28 70 29 20 26 26 20 70 2d 3e 72 63 21  uum(p) && p->rc!
1d920 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d  =SQLITE_OK && p-
1d930 3e 64 62 52 62 75 20 29 7b 0a 20 20 20 20 20 20  >dbRbu ){.      
1d940 69 6e 74 20 72 63 32 20 3d 20 73 71 6c 69 74 65  int rc2 = sqlite
1d950 33 5f 65 78 65 63 28 70 2d 3e 64 62 52 62 75 2c  3_exec(p->dbRbu,
1d960 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 73 74   "DELETE FROM st
1d970 61 74 2e 72 62 75 5f 73 74 61 74 65 22 2c 20 30  at.rbu_state", 0
1d980 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  , 0, 0);.      i
1d990 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
1d9a0 5f 44 4f 4e 45 20 26 26 20 72 63 32 21 3d 53 51  _DONE && rc2!=SQ
1d9b0 4c 49 54 45 5f 4f 4b 20 29 20 70 2d 3e 72 63 20  LITE_OK ) p->rc 
1d9c0 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 0a 20 20  = rc2;.    }..  
1d9d0 20 20 2f 2a 20 43 6c 6f 73 65 20 74 68 65 20 6f    /* Close the o
1d9e0 70 65 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e  pen database han
1d9f0 64 6c 65 20 61 6e 64 20 56 46 53 20 6f 62 6a 65  dle and VFS obje
1da00 63 74 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  ct. */.    sqlit
1da10 65 33 5f 63 6c 6f 73 65 28 70 2d 3e 64 62 52 62  e3_close(p->dbRb
1da20 75 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  u);.    sqlite3_
1da30 63 6c 6f 73 65 28 70 2d 3e 64 62 4d 61 69 6e 29  close(p->dbMain)
1da40 3b 0a 20 20 20 20 72 62 75 44 65 6c 65 74 65 56  ;.    rbuDeleteV
1da50 66 73 28 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  fs(p);.    sqlit
1da60 65 33 5f 66 72 65 65 28 70 2d 3e 61 42 75 66 29  e3_free(p->aBuf)
1da70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
1da80 65 65 28 70 2d 3e 61 46 72 61 6d 65 29 3b 0a 0a  ee(p->aFrame);..
1da90 20 20 20 20 72 62 75 45 64 69 74 45 72 72 6d 73      rbuEditErrms
1daa0 67 28 70 29 3b 0a 20 20 20 20 72 63 20 3d 20 70  g(p);.    rc = p
1dab0 2d 3e 72 63 3b 0a 20 20 20 20 2a 70 7a 45 72 72  ->rc;.    *pzErr
1dac0 6d 73 67 20 3d 20 70 2d 3e 7a 45 72 72 6d 73 67  msg = p->zErrmsg
1dad0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
1dae0 65 65 28 70 2d 3e 7a 53 74 61 74 65 29 3b 0a 20  ee(p->zState);. 
1daf0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1db00 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  p);.  }else{.   
1db10 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
1db20 45 4d 3b 0a 20 20 20 20 2a 70 7a 45 72 72 6d 73  EM;.    *pzErrms
1db30 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  g = 0;.  }.  ret
1db40 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1db50 20 52 65 74 75 72 6e 20 74 68 65 20 74 6f 74 61   Return the tota
1db60 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6b 65 79 2d  l number of key-
1db70 76 61 6c 75 65 20 6f 70 65 72 61 74 69 6f 6e 73  value operations
1db80 20 28 69 6e 73 65 72 74 73 2c 20 64 65 6c 65 74   (inserts, delet
1db90 65 73 20 6f 72 20 0a 2a 2a 20 75 70 64 61 74 65  es or .** update
1dba0 73 29 20 74 68 61 74 20 68 61 76 65 20 62 65 65  s) that have bee
1dbb0 6e 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e 20 74  n performed on t
1dbc0 68 65 20 74 61 72 67 65 74 20 64 61 74 61 62 61  he target databa
1dbd0 73 65 20 73 69 6e 63 65 20 74 68 65 0a 2a 2a 20  se since the.** 
1dbe0 63 75 72 72 65 6e 74 20 52 42 55 20 75 70 64 61  current RBU upda
1dbf0 74 65 20 77 61 73 20 73 74 61 72 74 65 64 2e 0a  te was started..
1dc00 2a 2f 0a 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  */.sqlite3_int64
1dc10 20 73 71 6c 69 74 65 33 72 62 75 5f 70 72 6f 67   sqlite3rbu_prog
1dc20 72 65 73 73 28 73 71 6c 69 74 65 33 72 62 75 20  ress(sqlite3rbu 
1dc30 2a 70 52 62 75 29 7b 0a 20 20 72 65 74 75 72 6e  *pRbu){.  return
1dc40 20 70 52 62 75 2d 3e 6e 50 72 6f 67 72 65 73 73   pRbu->nProgress
1dc50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1dc60 6e 20 70 65 72 6d 79 72 69 61 64 61 67 65 20 70  n permyriadage p
1dc70 72 6f 67 72 65 73 73 20 69 6e 64 69 63 61 74 69  rogress indicati
1dc80 6f 6e 73 20 66 6f 72 20 74 68 65 20 74 77 6f 20  ons for the two 
1dc90 6d 61 69 6e 20 73 74 61 67 65 73 20 6f 66 0a 2a  main stages of.*
1dca0 2a 20 61 6e 20 52 42 55 20 75 70 64 61 74 65 2e  * an RBU update.
1dcb0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1dcc0 72 62 75 5f 62 70 5f 70 72 6f 67 72 65 73 73 28  rbu_bp_progress(
1dcd0 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 69  sqlite3rbu *p, i
1dce0 6e 74 20 2a 70 6e 4f 6e 65 2c 20 69 6e 74 20 2a  nt *pnOne, int *
1dcf0 70 6e 54 77 6f 29 7b 0a 20 20 63 6f 6e 73 74 20  pnTwo){.  const 
1dd00 69 6e 74 20 4d 41 58 5f 50 52 4f 47 52 45 53 53  int MAX_PROGRESS
1dd10 20 3d 20 31 30 30 30 30 3b 0a 20 20 73 77 69 74   = 10000;.  swit
1dd20 63 68 28 20 70 2d 3e 65 53 74 61 67 65 20 29 7b  ch( p->eStage ){
1dd30 0a 20 20 20 20 63 61 73 65 20 52 42 55 5f 53 54  .    case RBU_ST
1dd40 41 47 45 5f 4f 41 4c 3a 0a 20 20 20 20 20 20 69  AGE_OAL:.      i
1dd50 66 28 20 70 2d 3e 6e 50 68 61 73 65 4f 6e 65 53  f( p->nPhaseOneS
1dd60 74 65 70 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  tep>0 ){.       
1dd70 20 2a 70 6e 4f 6e 65 20 3d 20 28 69 6e 74 29 28   *pnOne = (int)(
1dd80 4d 41 58 5f 50 52 4f 47 52 45 53 53 20 2a 20 28  MAX_PROGRESS * (
1dd90 69 36 34 29 70 2d 3e 6e 50 72 6f 67 72 65 73 73  i64)p->nProgress
1dda0 2f 28 69 36 34 29 70 2d 3e 6e 50 68 61 73 65 4f  /(i64)p->nPhaseO
1ddb0 6e 65 53 74 65 70 29 3b 0a 20 20 20 20 20 20 7d  neStep);.      }
1ddc0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2a 70  else{.        *p
1ddd0 6e 4f 6e 65 20 3d 20 2d 31 3b 0a 20 20 20 20 20  nOne = -1;.     
1dde0 20 7d 0a 20 20 20 20 20 20 2a 70 6e 54 77 6f 20   }.      *pnTwo 
1ddf0 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = 0;.      break
1de00 3b 0a 0a 20 20 20 20 63 61 73 65 20 52 42 55 5f  ;..    case RBU_
1de10 53 54 41 47 45 5f 4d 4f 56 45 3a 0a 20 20 20 20  STAGE_MOVE:.    
1de20 20 20 2a 70 6e 4f 6e 65 20 3d 20 4d 41 58 5f 50    *pnOne = MAX_P
1de30 52 4f 47 52 45 53 53 3b 0a 20 20 20 20 20 20 2a  ROGRESS;.      *
1de40 70 6e 54 77 6f 20 3d 20 30 3b 0a 20 20 20 20 20  pnTwo = 0;.     
1de50 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73   break;..    cas
1de60 65 20 52 42 55 5f 53 54 41 47 45 5f 43 4b 50 54  e RBU_STAGE_CKPT
1de70 3a 0a 20 20 20 20 20 20 2a 70 6e 4f 6e 65 20 3d  :.      *pnOne =
1de80 20 4d 41 58 5f 50 52 4f 47 52 45 53 53 3b 0a 20   MAX_PROGRESS;. 
1de90 20 20 20 20 20 2a 70 6e 54 77 6f 20 3d 20 28 69       *pnTwo = (i
1dea0 6e 74 29 28 4d 41 58 5f 50 52 4f 47 52 45 53 53  nt)(MAX_PROGRESS
1deb0 20 2a 20 28 69 36 34 29 70 2d 3e 6e 53 74 65 70   * (i64)p->nStep
1dec0 20 2f 20 28 69 36 34 29 70 2d 3e 6e 46 72 61 6d   / (i64)p->nFram
1ded0 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
1dee0 0a 0a 20 20 20 20 63 61 73 65 20 52 42 55 5f 53  ..    case RBU_S
1def0 54 41 47 45 5f 44 4f 4e 45 3a 0a 20 20 20 20 20  TAGE_DONE:.     
1df00 20 2a 70 6e 4f 6e 65 20 3d 20 4d 41 58 5f 50 52   *pnOne = MAX_PR
1df10 4f 47 52 45 53 53 3b 0a 20 20 20 20 20 20 2a 70  OGRESS;.      *p
1df20 6e 54 77 6f 20 3d 20 4d 41 58 5f 50 52 4f 47 52  nTwo = MAX_PROGR
1df30 45 53 53 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ESS;.      break
1df40 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  ;..    default:.
1df50 20 20 20 20 20 20 61 73 73 65 72 74 28 20 30 20        assert( 0 
1df60 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
1df70 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65  Return the curre
1df80 6e 74 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  nt state of the 
1df90 52 42 55 20 76 61 63 75 75 6d 20 6f 72 20 75 70  RBU vacuum or up
1dfa0 64 61 74 65 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  date operation..
1dfb0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 72 62  */.int sqlite3rb
1dfc0 75 5f 73 74 61 74 65 28 73 71 6c 69 74 65 33 72  u_state(sqlite3r
1dfd0 62 75 20 2a 70 29 7b 0a 20 20 69 6e 74 20 61 52  bu *p){.  int aR
1dfe0 65 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 30 2c 20  es[] = {.    0, 
1dff0 53 51 4c 49 54 45 5f 52 42 55 5f 53 54 41 54 45  SQLITE_RBU_STATE
1e000 5f 4f 41 4c 2c 20 53 51 4c 49 54 45 5f 52 42 55  _OAL, SQLITE_RBU
1e010 5f 53 54 41 54 45 5f 4d 4f 56 45 2c 0a 20 20 20  _STATE_MOVE,.   
1e020 20 30 2c 20 53 51 4c 49 54 45 5f 52 42 55 5f 53   0, SQLITE_RBU_S
1e030 54 41 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 2c  TATE_CHECKPOINT,
1e040 20 53 51 4c 49 54 45 5f 52 42 55 5f 53 54 41 54   SQLITE_RBU_STAT
1e050 45 5f 44 4f 4e 45 0a 20 20 7d 3b 0a 0a 20 20 61  E_DONE.  };..  a
1e060 73 73 65 72 74 28 20 52 42 55 5f 53 54 41 47 45  ssert( RBU_STAGE
1e070 5f 4f 41 4c 3d 3d 31 20 29 3b 0a 20 20 61 73 73  _OAL==1 );.  ass
1e080 65 72 74 28 20 52 42 55 5f 53 54 41 47 45 5f 4d  ert( RBU_STAGE_M
1e090 4f 56 45 3d 3d 32 20 29 3b 0a 20 20 61 73 73 65  OVE==2 );.  asse
1e0a0 72 74 28 20 52 42 55 5f 53 54 41 47 45 5f 43 4b  rt( RBU_STAGE_CK
1e0b0 50 54 3d 3d 34 20 29 3b 0a 20 20 61 73 73 65 72  PT==4 );.  asser
1e0c0 74 28 20 52 42 55 5f 53 54 41 47 45 5f 44 4f 4e  t( RBU_STAGE_DON
1e0d0 45 3d 3d 35 20 29 3b 0a 20 20 61 73 73 65 72 74  E==5 );.  assert
1e0e0 28 20 61 52 65 73 5b 52 42 55 5f 53 54 41 47 45  ( aRes[RBU_STAGE
1e0f0 5f 4f 41 4c 5d 3d 3d 53 51 4c 49 54 45 5f 52 42  _OAL]==SQLITE_RB
1e100 55 5f 53 54 41 54 45 5f 4f 41 4c 20 29 3b 0a 20  U_STATE_OAL );. 
1e110 20 61 73 73 65 72 74 28 20 61 52 65 73 5b 52 42   assert( aRes[RB
1e120 55 5f 53 54 41 47 45 5f 4d 4f 56 45 5d 3d 3d 53  U_STAGE_MOVE]==S
1e130 51 4c 49 54 45 5f 52 42 55 5f 53 54 41 54 45 5f  QLITE_RBU_STATE_
1e140 4d 4f 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74  MOVE );.  assert
1e150 28 20 61 52 65 73 5b 52 42 55 5f 53 54 41 47 45  ( aRes[RBU_STAGE
1e160 5f 43 4b 50 54 5d 3d 3d 53 51 4c 49 54 45 5f 52  _CKPT]==SQLITE_R
1e170 42 55 5f 53 54 41 54 45 5f 43 48 45 43 4b 50 4f  BU_STATE_CHECKPO
1e180 49 4e 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28  INT );.  assert(
1e190 20 61 52 65 73 5b 52 42 55 5f 53 54 41 47 45 5f   aRes[RBU_STAGE_
1e1a0 44 4f 4e 45 5d 3d 3d 53 51 4c 49 54 45 5f 52 42  DONE]==SQLITE_RB
1e1b0 55 5f 53 54 41 54 45 5f 44 4f 4e 45 20 29 3b 0a  U_STATE_DONE );.
1e1c0 0a 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51  .  if( p->rc!=SQ
1e1d0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 72 63  LITE_OK && p->rc
1e1e0 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b  !=SQLITE_DONE ){
1e1f0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1e200 54 45 5f 52 42 55 5f 53 54 41 54 45 5f 45 52 52  TE_RBU_STATE_ERR
1e210 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OR;.  }else{.   
1e220 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 21 3d   assert( p->rc!=
1e230 53 51 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c 20 70  SQLITE_DONE || p
1e240 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54  ->eStage==RBU_ST
1e250 41 47 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20  AGE_DONE );.    
1e260 61 73 73 65 72 74 28 20 70 2d 3e 65 53 74 61 67  assert( p->eStag
1e270 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c  e==RBU_STAGE_OAL
1e280 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e  .         || p->
1e290 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47  eStage==RBU_STAG
1e2a0 45 5f 4d 4f 56 45 0a 20 20 20 20 20 20 20 20 20  E_MOVE.         
1e2b0 7c 7c 20 70 2d 3e 65 53 74 61 67 65 3d 3d 52 42  || p->eStage==RB
1e2c0 55 5f 53 54 41 47 45 5f 43 4b 50 54 0a 20 20 20  U_STAGE_CKPT.   
1e2d0 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61        || p->eSta
1e2e0 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 44 4f  ge==RBU_STAGE_DO
1e2f0 4e 45 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 65  NE.    );.    re
1e300 74 75 72 6e 20 61 52 65 73 5b 70 2d 3e 65 53 74  turn aRes[p->eSt
1e310 61 67 65 5d 3b 0a 20 20 7d 0a 7d 0a 0a 69 6e 74  age];.  }.}..int
1e320 20 73 71 6c 69 74 65 33 72 62 75 5f 73 61 76 65   sqlite3rbu_save
1e330 73 74 61 74 65 28 73 71 6c 69 74 65 33 72 62 75  state(sqlite3rbu
1e340 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d   *p){.  int rc =
1e350 20 70 2d 3e 72 63 3b 0a 20 20 69 66 28 20 72 63   p->rc;.  if( rc
1e360 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 20  ==SQLITE_DONE ) 
1e370 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1e380 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ;..  assert( p->
1e390 65 53 74 61 67 65 3e 3d 52 42 55 5f 53 54 41 47  eStage>=RBU_STAG
1e3a0 45 5f 4f 41 4c 20 26 26 20 70 2d 3e 65 53 74 61  E_OAL && p->eSta
1e3b0 67 65 3c 3d 52 42 55 5f 53 54 41 47 45 5f 44 4f  ge<=RBU_STAGE_DO
1e3c0 4e 45 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 65  NE );.  if( p->e
1e3d0 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45  Stage==RBU_STAGE
1e3e0 5f 4f 41 4c 20 29 7b 0a 20 20 20 20 61 73 73 65  _OAL ){.    asse
1e3f0 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
1e400 4f 4e 45 20 29 3b 0a 20 20 20 20 69 66 28 20 72  ONE );.    if( r
1e410 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c==SQLITE_OK ) r
1e420 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  c = sqlite3_exec
1e430 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 43 4f 4d  (p->dbMain, "COM
1e440 4d 49 54 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  MIT", 0, 0, 0);.
1e450 20 20 7d 0a 0a 20 20 70 2d 3e 72 63 20 3d 20 72    }..  p->rc = r
1e460 63 3b 0a 20 20 72 62 75 53 61 76 65 53 74 61 74  c;.  rbuSaveStat
1e470 65 28 70 2c 20 70 2d 3e 65 53 74 61 67 65 29 3b  e(p, p->eStage);
1e480 0a 20 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 0a  .  rc = p->rc;..
1e490 20 20 69 66 28 20 70 2d 3e 65 53 74 61 67 65 3d    if( p->eStage=
1e4a0 3d 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20 29  =RBU_STAGE_OAL )
1e4b0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  {.    assert( rc
1e4c0 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  !=SQLITE_DONE );
1e4d0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1e4e0 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 73 71  ITE_OK ) rc = sq
1e4f0 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62  lite3_exec(p->db
1e500 52 62 75 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30  Rbu, "COMMIT", 0
1e510 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 0, 0);.    if(
1e520 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1e530 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78   rc = sqlite3_ex
1e540 65 63 28 70 2d 3e 64 62 52 62 75 2c 20 22 42 45  ec(p->dbRbu, "BE
1e550 47 49 4e 20 49 4d 4d 45 44 49 41 54 45 22 2c 20  GIN IMMEDIATE", 
1e560 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  0, 0, 0);.    if
1e570 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1e580 29 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65  ) rc = sqlite3_e
1e590 78 65 63 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 22  xec(p->dbMain, "
1e5a0 42 45 47 49 4e 20 49 4d 4d 45 44 49 41 54 45 22  BEGIN IMMEDIATE"
1e5b0 2c 20 30 2c 20 30 2c 30 29 3b 0a 20 20 7d 0a 0a  , 0, 0,0);.  }..
1e5c0 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20    p->rc = rc;.  
1e5d0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1e5e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e5f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e610 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e620 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 42 65 67  *********.** Beg
1e630 69 6e 6e 69 6e 67 20 6f 66 20 52 42 55 20 56 46  inning of RBU VF
1e640 53 20 73 68 69 6d 20 6d 65 74 68 6f 64 73 2e 20  S shim methods. 
1e650 54 68 65 20 56 46 53 20 73 68 69 6d 20 6d 6f 64  The VFS shim mod
1e660 69 66 69 65 73 20 74 68 65 20 62 65 68 61 76 69  ifies the behavi
1e670 6f 75 72 0a 2a 2a 20 6f 66 20 61 20 73 74 61 6e  our.** of a stan
1e680 64 61 72 64 20 56 46 53 20 69 6e 20 74 68 65 20  dard VFS in the 
1e690 66 6f 6c 6c 6f 77 69 6e 67 20 77 61 79 73 3a 0a  following ways:.
1e6a0 2a 2a 0a 2a 2a 20 31 2e 20 57 68 65 6e 65 76 65  **.** 1. Wheneve
1e6b0 72 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  r the first page
1e6c0 20 6f 66 20 61 20 6d 61 69 6e 20 64 61 74 61 62   of a main datab
1e6d0 61 73 65 20 66 69 6c 65 20 69 73 20 72 65 61 64  ase file is read
1e6e0 20 6f 72 20 0a 2a 2a 20 20 20 20 77 72 69 74 74   or .**    writt
1e6f0 65 6e 2c 20 74 68 65 20 76 61 6c 75 65 20 6f 66  en, the value of
1e700 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
1e710 74 65 72 20 63 6f 6f 6b 69 65 20 69 73 20 73 74  ter cookie is st
1e720 6f 72 65 64 20 69 6e 0a 2a 2a 20 20 20 20 72 62  ored in.**    rb
1e730 75 5f 66 69 6c 65 2e 69 43 6f 6f 6b 69 65 2e 20  u_file.iCookie. 
1e740 53 69 6d 69 6c 61 72 6c 79 2c 20 74 68 65 20 76  Similarly, the v
1e750 61 6c 75 65 20 6f 66 20 74 68 65 20 22 77 72 69  alue of the "wri
1e760 74 65 2d 76 65 72 73 69 6f 6e 22 0a 2a 2a 20 20  te-version".**  
1e770 20 20 64 61 74 61 62 61 73 65 20 68 65 61 64 65    database heade
1e780 72 20 66 69 65 6c 64 20 69 73 20 73 74 6f 72 65  r field is store
1e790 64 20 69 6e 20 72 62 75 5f 66 69 6c 65 2e 69 57  d in rbu_file.iW
1e7a0 72 69 74 65 56 65 72 2e 20 54 68 69 73 20 65 6e  riteVer. This en
1e7b0 73 75 72 65 73 0a 2a 2a 20 20 20 20 74 68 61 74  sures.**    that
1e7c0 20 74 68 65 20 76 61 6c 75 65 73 20 61 72 65 20   the values are 
1e7d0 61 6c 77 61 79 73 20 74 72 75 73 74 77 6f 72 74  always trustwort
1e7e0 68 79 20 77 69 74 68 69 6e 20 61 6e 20 6f 70 65  hy within an ope
1e7f0 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  n transaction..*
1e800 2a 0a 2a 2a 20 32 2e 20 57 68 65 6e 65 76 65 72  *.** 2. Whenever
1e810 20 61 6e 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   an SQLITE_OPEN_
1e820 57 41 4c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e  WAL file is open
1e830 65 64 2c 20 74 68 65 20 28 72 62 75 5f 66 69 6c  ed, the (rbu_fil
1e840 65 2e 70 57 61 6c 46 64 29 0a 2a 2a 20 20 20 20  e.pWalFd).**    
1e850 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c 65 20  member variable 
1e860 6f 66 20 74 68 65 20 61 73 73 6f 63 69 61 74 65  of the associate
1e870 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  d database file 
1e880 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 73 65  descriptor is se
1e890 74 0a 2a 2a 20 20 20 20 74 6f 20 70 6f 69 6e 74  t.**    to point
1e8a0 20 74 6f 20 74 68 65 20 6e 65 77 20 66 69 6c 65   to the new file
1e8b0 2e 20 41 20 6d 75 74 65 78 20 70 72 6f 74 65 63  . A mutex protec
1e8c0 74 65 64 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  ted linked list 
1e8d0 6f 66 20 61 6c 6c 20 6d 61 69 6e 20 0a 2a 2a 20  of all main .** 
1e8e0 20 20 20 64 62 20 66 64 73 20 6f 70 65 6e 65 64     db fds opened
1e8f0 20 75 73 69 6e 67 20 61 20 70 61 72 74 69 63 75   using a particu
1e900 6c 61 72 20 52 42 55 20 56 46 53 20 69 73 20 6d  lar RBU VFS is m
1e910 61 69 6e 74 61 69 6e 65 64 20 61 74 20 0a 2a 2a  aintained at .**
1e920 20 20 20 20 72 62 75 5f 76 66 73 2e 70 4d 61 69      rbu_vfs.pMai
1e930 6e 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65 20  n to facilitate 
1e940 74 68 69 73 2e 0a 2a 2a 0a 2a 2a 20 33 2e 20 55  this..**.** 3. U
1e950 73 69 6e 67 20 61 20 6e 65 77 20 66 69 6c 65 2d  sing a new file-
1e960 63 6f 6e 74 72 6f 6c 20 22 53 51 4c 49 54 45 5f  control "SQLITE_
1e970 46 43 4e 54 4c 5f 52 42 55 22 2c 20 61 20 6d 61  FCNTL_RBU", a ma
1e980 69 6e 20 64 62 20 72 62 75 5f 66 69 6c 65 20 0a  in db rbu_file .
1e990 2a 2a 20 20 20 20 6f 62 6a 65 63 74 20 63 61 6e  **    object can
1e9a0 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20 74 68   be marked as th
1e9b0 65 20 74 61 72 67 65 74 20 64 61 74 61 62 61 73  e target databas
1e9c0 65 20 6f 66 20 61 6e 20 52 42 55 20 75 70 64 61  e of an RBU upda
1e9d0 74 65 2e 20 54 68 69 73 0a 2a 2a 20 20 20 20 74  te. This.**    t
1e9e0 75 72 6e 73 20 6f 6e 20 74 68 65 20 66 6f 6c 6c  urns on the foll
1e9f0 6f 77 69 6e 67 20 65 78 74 72 61 20 73 70 65 63  owing extra spec
1ea00 69 61 6c 20 62 65 68 61 76 69 6f 75 72 3a 0a 2a  ial behaviour:.*
1ea10 2a 0a 2a 2a 20 33 61 2e 20 49 66 20 78 41 63 63  *.** 3a. If xAcc
1ea20 65 73 73 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ess() is called 
1ea30 74 6f 20 63 68 65 63 6b 20 69 66 20 74 68 65 72  to check if ther
1ea40 65 20 65 78 69 73 74 73 20 61 20 2a 2d 77 61 6c  e exists a *-wal
1ea50 20 66 69 6c 65 20 0a 2a 2a 20 20 20 20 20 61 73   file .**     as
1ea60 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 6e  sociated with an
1ea70 20 52 42 55 20 74 61 72 67 65 74 20 64 61 74 61   RBU target data
1ea80 62 61 73 65 20 63 75 72 72 65 6e 74 6c 79 20 69  base currently i
1ea90 6e 20 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 0a  n RBU_STAGE_OAL.
1eaa0 2a 2a 20 20 20 20 20 73 74 61 67 65 20 28 70 72  **     stage (pr
1eab0 65 70 61 72 69 6e 67 20 74 68 65 20 2a 2d 6f 61  eparing the *-oa
1eac0 6c 20 66 69 6c 65 29 2c 20 74 68 65 20 66 6f 6c  l file), the fol
1ead0 6c 6f 77 69 6e 67 20 73 70 65 63 69 61 6c 20 68  lowing special h
1eae0 61 6e 64 6c 69 6e 67 0a 2a 2a 20 20 20 20 20 61  andling.**     a
1eaf0 70 70 6c 69 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  pplies:.**.**   
1eb00 20 20 20 2a 20 69 66 20 74 68 65 20 2a 2d 77 61     * if the *-wa
1eb10 6c 20 66 69 6c 65 20 64 6f 65 73 20 65 78 69 73  l file does exis
1eb20 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  t, return SQLITE
1eb30 5f 43 41 4e 54 4f 50 45 4e 2e 20 41 6e 20 52 42  _CANTOPEN. An RB
1eb40 55 0a 2a 2a 20 20 20 20 20 20 20 20 74 61 72 67  U.**        targ
1eb50 65 74 20 64 61 74 61 62 61 73 65 20 6d 61 79 20  et database may 
1eb60 6e 6f 74 20 62 65 20 69 6e 20 77 61 6c 20 6d 6f  not be in wal mo
1eb70 64 65 20 61 6c 72 65 61 64 79 2e 0a 2a 2a 0a 2a  de already..**.*
1eb80 2a 20 20 20 20 20 20 2a 20 69 66 20 74 68 65 20  *      * if the 
1eb90 2a 2d 77 61 6c 20 66 69 6c 65 20 64 6f 65 73 20  *-wal file does 
1eba0 6e 6f 74 20 65 78 69 73 74 2c 20 73 65 74 20 74  not exist, set t
1ebb0 68 65 20 6f 75 74 70 75 74 20 70 61 72 61 6d 65  he output parame
1ebc0 74 65 72 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20  ter to.**       
1ebd0 20 6e 6f 6e 2d 7a 65 72 6f 20 28 74 6f 20 74 65   non-zero (to te
1ebe0 6c 6c 20 53 51 4c 69 74 65 20 74 68 61 74 20 69  ll SQLite that i
1ebf0 74 20 64 6f 65 73 20 65 78 69 73 74 29 20 61 6e  t does exist) an
1ec00 79 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  yway..**.**     
1ec10 54 68 65 6e 2c 20 77 68 65 6e 20 78 4f 70 65 6e  Then, when xOpen
1ec20 28 29 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  () is called to 
1ec30 6f 70 65 6e 20 74 68 65 20 2a 2d 77 61 6c 20 66  open the *-wal f
1ec40 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ile associated w
1ec50 69 74 68 0a 2a 2a 20 20 20 20 20 74 68 65 20 52  ith.**     the R
1ec60 42 55 20 74 61 72 67 65 74 20 69 6e 20 52 42 55  BU target in RBU
1ec70 5f 53 54 41 47 45 5f 4f 41 4c 20 73 74 61 67 65  _STAGE_OAL stage
1ec80 2c 20 69 6e 73 74 65 61 64 20 6f 66 20 6f 70 65  , instead of ope
1ec90 6e 69 6e 67 20 74 68 65 20 2a 2d 77 61 6c 0a 2a  ning the *-wal.*
1eca0 2a 20 20 20 20 20 66 69 6c 65 2c 20 74 68 65 20  *     file, the 
1ecb0 72 62 75 20 76 66 73 20 6f 70 65 6e 73 20 74 68  rbu vfs opens th
1ecc0 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
1ecd0 2a 2d 6f 61 6c 20 66 69 6c 65 20 69 6e 73 74 65  *-oal file inste
1ece0 61 64 2e 20 0a 2a 2a 0a 2a 2a 20 33 62 2e 20 54  ad. .**.** 3b. T
1ecf0 68 65 20 2a 2d 73 68 6d 20 70 61 67 65 73 20 72  he *-shm pages r
1ed00 65 74 75 72 6e 65 64 20 62 79 20 78 53 68 6d 4d  eturned by xShmM
1ed10 61 70 28 29 20 66 6f 72 20 61 20 74 61 72 67 65  ap() for a targe
1ed20 74 20 64 62 20 66 69 6c 65 20 69 6e 0a 2a 2a 20  t db file in.** 
1ed30 20 20 20 20 52 42 55 5f 53 54 41 47 45 5f 4f 41      RBU_STAGE_OA
1ed40 4c 20 6d 6f 64 65 20 61 72 65 20 61 63 74 75 61  L mode are actua
1ed50 6c 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 68 65  lly stored in he
1ed60 61 70 20 6d 65 6d 6f 72 79 2e 20 54 68 69 73 20  ap memory. This 
1ed70 69 73 20 74 6f 0a 2a 2a 20 20 20 20 20 61 76 6f  is to.**     avo
1ed80 69 64 20 63 72 65 61 74 69 6e 67 20 61 20 2a 2d  id creating a *-
1ed90 73 68 6d 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  shm file on disk
1eda0 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20  . Additionally, 
1edb0 78 53 68 6d 4c 6f 63 6b 28 29 20 63 61 6c 6c 73  xShmLock() calls
1edc0 0a 2a 2a 20 20 20 20 20 61 72 65 20 6e 6f 2d 6f  .**     are no-o
1edd0 70 73 20 6f 6e 20 74 61 72 67 65 74 20 64 61 74  ps on target dat
1ede0 61 62 61 73 65 20 66 69 6c 65 73 20 69 6e 20 52  abase files in R
1edf0 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20 6d 6f 64  BU_STAGE_OAL mod
1ee00 65 2e 20 54 68 69 73 20 69 73 0a 2a 2a 20 20 20  e. This is.**   
1ee10 20 20 62 65 63 61 75 73 65 20 61 73 73 65 72 74    because assert
1ee20 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  () statements in
1ee30 20 73 6f 6d 65 20 56 46 53 20 69 6d 70 6c 65 6d   some VFS implem
1ee40 65 6e 74 61 74 69 6f 6e 73 20 66 61 69 6c 20 69  entations fail i
1ee50 66 20 0a 2a 2a 20 20 20 20 20 78 53 68 6d 4c 6f  f .**     xShmLo
1ee60 63 6b 28 29 20 69 73 20 63 61 6c 6c 65 64 20 62  ck() is called b
1ee70 65 66 6f 72 65 20 78 53 68 6d 4d 61 70 28 29 2e  efore xShmMap().
1ee80 0a 2a 2a 0a 2a 2a 20 33 63 2e 20 49 66 20 61 6e  .**.** 3c. If an
1ee90 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
1eea0 69 73 20 61 74 74 65 6d 70 74 65 64 20 6f 6e 20  is attempted on 
1eeb0 61 20 74 61 72 67 65 74 20 64 61 74 61 62 61 73  a target databas
1eec0 65 20 66 69 6c 65 20 69 6e 20 61 6e 79 0a 2a 2a  e file in any.**
1eed0 20 20 20 20 20 6d 6f 64 65 20 65 78 63 65 70 74       mode except
1eee0 20 52 42 55 5f 53 54 41 47 45 5f 44 4f 4e 45 20   RBU_STAGE_DONE 
1eef0 28 61 6c 6c 20 77 6f 72 6b 20 63 6f 6d 70 6c 65  (all work comple
1ef00 74 65 64 20 61 6e 64 20 63 68 65 63 6b 70 6f 69  ted and checkpoi
1ef10 6e 74 65 64 29 2c 20 69 74 20 0a 2a 2a 20 20 20  nted), it .**   
1ef20 20 20 66 61 69 6c 73 20 77 69 74 68 20 61 6e 20    fails with an 
1ef30 53 51 4c 49 54 45 5f 42 55 53 59 20 65 72 72 6f  SQLITE_BUSY erro
1ef40 72 2e 20 54 68 69 73 20 69 73 20 74 6f 20 73 74  r. This is to st
1ef50 6f 70 20 52 42 55 20 63 6f 6e 6e 65 63 74 69 6f  op RBU connectio
1ef60 6e 73 0a 2a 2a 20 20 20 20 20 66 72 6f 6d 20 61  ns.**     from a
1ef70 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 68 65  utomatically che
1ef80 63 6b 70 6f 69 6e 74 69 6e 67 20 61 20 2a 2d 77  ckpointing a *-w
1ef90 61 6c 20 28 6f 72 20 2a 2d 6f 61 6c 29 20 66 69  al (or *-oal) fi
1efa0 6c 65 20 66 72 6f 6d 20 77 69 74 68 69 6e 0a 2a  le from within.*
1efb0 2a 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c  *     sqlite3_cl
1efc0 6f 73 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 33 64 2e  ose()..**.** 3d.
1efd0 20 49 6e 20 52 42 55 5f 53 54 41 47 45 5f 43 41   In RBU_STAGE_CA
1efe0 50 54 55 52 45 20 6d 6f 64 65 2c 20 61 6c 6c 20  PTURE mode, all 
1eff0 78 52 65 61 64 28 29 20 63 61 6c 6c 73 20 6f 6e  xRead() calls on
1f000 20 74 68 65 20 77 61 6c 20 66 69 6c 65 2c 20 61   the wal file, a
1f010 6e 64 0a 2a 2a 20 20 20 20 20 61 6c 6c 20 78 57  nd.**     all xW
1f020 72 69 74 65 28 29 20 63 61 6c 6c 73 20 6f 6e 20  rite() calls on 
1f030 74 68 65 20 74 61 72 67 65 74 20 64 61 74 61 62  the target datab
1f040 61 73 65 20 66 69 6c 65 20 70 65 72 66 6f 72 6d  ase file perform
1f050 20 6e 6f 20 49 4f 2e 20 0a 2a 2a 20 20 20 20 20   no IO. .**     
1f060 49 6e 73 74 65 61 64 20 74 68 65 20 66 72 61 6d  Instead the fram
1f070 65 20 61 6e 64 20 70 61 67 65 20 6e 75 6d 62 65  e and page numbe
1f080 72 73 20 74 68 61 74 20 77 6f 75 6c 64 20 62 65  rs that would be
1f090 20 72 65 61 64 20 61 6e 64 20 77 72 69 74 74 65   read and writte
1f0a0 6e 0a 2a 2a 20 20 20 20 20 61 72 65 20 72 65 63  n.**     are rec
1f0b0 6f 72 64 65 64 2e 20 41 64 64 69 74 69 6f 6e 61  orded. Additiona
1f0c0 6c 6c 79 2c 20 73 75 63 63 65 73 73 66 75 6c 20  lly, successful 
1f0d0 61 74 74 65 6d 70 74 73 20 74 6f 20 6f 62 74 61  attempts to obta
1f0e0 69 6e 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20  in exclusive.** 
1f0f0 20 20 20 20 78 53 68 6d 4c 6f 63 6b 28 29 20 57      xShmLock() W
1f100 52 49 54 45 52 2c 20 43 48 45 43 4b 50 4f 49 4e  RITER, CHECKPOIN
1f110 54 45 52 20 61 6e 64 20 52 45 41 44 30 20 6c 6f  TER and READ0 lo
1f120 63 6b 73 20 6f 6e 20 74 68 65 20 74 61 72 67 65  cks on the targe
1f130 74 20 0a 2a 2a 20 20 20 20 20 64 61 74 61 62 61  t .**     databa
1f140 73 65 20 66 69 6c 65 20 61 72 65 20 72 65 63 6f  se file are reco
1f150 72 64 65 64 2e 20 78 53 68 6d 4c 6f 63 6b 28 29  rded. xShmLock()
1f160 20 63 61 6c 6c 73 20 74 6f 20 75 6e 6c 6f 63 6b   calls to unlock
1f170 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 20 20 20   the same.**    
1f180 20 6c 6f 63 6b 73 20 61 72 65 20 6e 6f 2d 6f 70   locks are no-op
1f190 73 20 28 73 6f 20 74 68 61 74 20 6f 6e 63 65 20  s (so that once 
1f1a0 6f 62 74 61 69 6e 65 64 2c 20 74 68 65 73 65 20  obtained, these 
1f1b0 6c 6f 63 6b 73 20 61 72 65 20 6e 65 76 65 72 0a  locks are never.
1f1c0 2a 2a 20 20 20 20 20 72 65 6c 69 6e 71 75 69 73  **     relinquis
1f1d0 68 65 64 29 2e 20 46 69 6e 61 6c 6c 79 2c 20 63  hed). Finally, c
1f1e0 61 6c 6c 73 20 74 6f 20 78 53 79 6e 63 28 29 20  alls to xSync() 
1f1f0 6f 6e 20 74 68 65 20 74 61 72 67 65 74 20 64 61  on the target da
1f200 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 66 69  tabase.**     fi
1f210 6c 65 20 66 61 69 6c 20 77 69 74 68 20 53 51 4c  le fail with SQL
1f220 49 54 45 5f 49 4e 54 45 52 4e 41 4c 20 65 72 72  ITE_INTERNAL err
1f230 6f 72 73 2e 0a 2a 2f 0a 0a 73 74 61 74 69 63 20  ors..*/..static 
1f240 76 6f 69 64 20 72 62 75 55 6e 6c 6f 63 6b 53 68  void rbuUnlockSh
1f250 6d 28 72 62 75 5f 66 69 6c 65 20 2a 70 29 7b 0a  m(rbu_file *p){.
1f260 20 20 69 66 28 20 70 2d 3e 70 52 62 75 20 29 7b    if( p->pRbu ){
1f270 0a 20 20 20 20 69 6e 74 20 28 2a 78 53 68 6d 4c  .    int (*xShmL
1f280 6f 63 6b 29 28 73 71 6c 69 74 65 33 5f 66 69 6c  ock)(sqlite3_fil
1f290 65 2a 2c 69 6e 74 2c 69 6e 74 2c 69 6e 74 29 20  e*,int,int,int) 
1f2a0 3d 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74  = p->pReal->pMet
1f2b0 68 6f 64 73 2d 3e 78 53 68 6d 4c 6f 63 6b 3b 0a  hods->xShmLock;.
1f2c0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
1f2d0 6f 72 28 69 3d 30 3b 20 69 3c 53 51 4c 49 54 45  or(i=0; i<SQLITE
1f2e0 5f 53 48 4d 5f 4e 4c 4f 43 4b 3b 69 2b 2b 29 7b  _SHM_NLOCK;i++){
1f2f0 0a 20 20 20 20 20 20 69 66 28 20 28 31 3c 3c 69  .      if( (1<<i
1f300 29 20 26 20 70 2d 3e 70 52 62 75 2d 3e 6d 4c 6f  ) & p->pRbu->mLo
1f310 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 78 53  ck ){.        xS
1f320 68 6d 4c 6f 63 6b 28 70 2d 3e 70 52 65 61 6c 2c  hmLock(p->pReal,
1f330 20 69 2c 20 31 2c 20 53 51 4c 49 54 45 5f 53 48   i, 1, SQLITE_SH
1f340 4d 5f 55 4e 4c 4f 43 4b 7c 53 51 4c 49 54 45 5f  M_UNLOCK|SQLITE_
1f350 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 3b 0a  SHM_EXCLUSIVE);.
1f360 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1f370 20 20 70 2d 3e 70 52 62 75 2d 3e 6d 4c 6f 63 6b    p->pRbu->mLock
1f380 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 0;.  }.}../*.
1f390 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 72 62 75 20  ** Close an rbu 
1f3a0 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
1f3b0 69 6e 74 20 72 62 75 56 66 73 43 6c 6f 73 65 28  int rbuVfsClose(
1f3c0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
1f3d0 69 6c 65 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65  ile){.  rbu_file
1f3e0 20 2a 70 20 3d 20 28 72 62 75 5f 66 69 6c 65 2a   *p = (rbu_file*
1f3f0 29 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20 72 63  )pFile;.  int rc
1f400 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a  ;.  int i;..  /*
1f410 20 46 72 65 65 20 74 68 65 20 63 6f 6e 74 65 6e   Free the conten
1f420 74 73 20 6f 66 20 74 68 65 20 61 70 53 68 6d 5b  ts of the apShm[
1f430 5d 20 61 72 72 61 79 2e 20 41 6e 64 20 74 68 65  ] array. And the
1f440 20 61 72 72 61 79 20 69 74 73 65 6c 66 2e 20 2a   array itself. *
1f450 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  /.  for(i=0; i<p
1f460 2d 3e 6e 53 68 6d 3b 20 69 2b 2b 29 7b 0a 20 20  ->nShm; i++){.  
1f470 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1f480 2d 3e 61 70 53 68 6d 5b 69 5d 29 3b 0a 20 20 7d  ->apShm[i]);.  }
1f490 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
1f4a0 70 2d 3e 61 70 53 68 6d 29 3b 0a 20 20 70 2d 3e  p->apShm);.  p->
1f4b0 61 70 53 68 6d 20 3d 20 30 3b 0a 20 20 73 71 6c  apShm = 0;.  sql
1f4c0 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 44 65  ite3_free(p->zDe
1f4d0 6c 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 6f 70  l);..  if( p->op
1f4e0 65 6e 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  enFlags & SQLITE
1f4f0 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 7b  _OPEN_MAIN_DB ){
1f500 0a 20 20 20 20 72 62 75 5f 66 69 6c 65 20 2a 2a  .    rbu_file **
1f510 70 70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  pp;.    sqlite3_
1f520 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 2d 3e 70  mutex_enter(p->p
1f530 52 62 75 56 66 73 2d 3e 6d 75 74 65 78 29 3b 0a  RbuVfs->mutex);.
1f540 20 20 20 20 66 6f 72 28 70 70 3d 26 70 2d 3e 70      for(pp=&p->p
1f550 52 62 75 56 66 73 2d 3e 70 4d 61 69 6e 3b 20 2a  RbuVfs->pMain; *
1f560 70 70 21 3d 70 3b 20 70 70 3d 26 28 28 2a 70 70  pp!=p; pp=&((*pp
1f570 29 2d 3e 70 4d 61 69 6e 4e 65 78 74 29 29 3b 0a  )->pMainNext));.
1f580 20 20 20 20 2a 70 70 20 3d 20 70 2d 3e 70 4d 61      *pp = p->pMa
1f590 69 6e 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c 69  inNext;.    sqli
1f5a0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
1f5b0 70 2d 3e 70 52 62 75 56 66 73 2d 3e 6d 75 74 65  p->pRbuVfs->mute
1f5c0 78 29 3b 0a 20 20 20 20 72 62 75 55 6e 6c 6f 63  x);.    rbuUnloc
1f5d0 6b 53 68 6d 28 70 29 3b 0a 20 20 20 20 70 2d 3e  kShm(p);.    p->
1f5e0 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d  pReal->pMethods-
1f5f0 3e 78 53 68 6d 55 6e 6d 61 70 28 70 2d 3e 70 52  >xShmUnmap(p->pR
1f600 65 61 6c 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  eal, 0);.  }..  
1f610 2f 2a 20 43 6c 6f 73 65 20 74 68 65 20 75 6e 64  /* Close the und
1f620 65 72 6c 79 69 6e 67 20 66 69 6c 65 20 68 61 6e  erlying file han
1f630 64 6c 65 20 2a 2f 0a 20 20 72 63 20 3d 20 70 2d  dle */.  rc = p-
1f640 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73  >pReal->pMethods
1f650 2d 3e 78 43 6c 6f 73 65 28 70 2d 3e 70 52 65 61  ->xClose(p->pRea
1f660 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  l);.  return rc;
1f670 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  .}.../*.** Read 
1f680 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 75 6e  and return an un
1f690 73 69 67 6e 65 64 20 33 32 2d 62 69 74 20 62 69  signed 32-bit bi
1f6a0 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
1f6b0 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72   from the buffer
1f6c0 20 0a 2a 2a 20 70 61 73 73 65 64 20 61 73 20 74   .** passed as t
1f6d0 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74  he only argument
1f6e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20  ..*/.static u32 
1f6f0 72 62 75 47 65 74 55 33 32 28 75 38 20 2a 61 42  rbuGetU32(u8 *aB
1f700 75 66 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 28  uf){.  return ((
1f710 75 33 32 29 61 42 75 66 5b 30 5d 20 3c 3c 20 32  u32)aBuf[0] << 2
1f720 34 29 0a 20 20 20 20 20 20 20 2b 20 28 28 75 33  4).       + ((u3
1f730 32 29 61 42 75 66 5b 31 5d 20 3c 3c 20 31 36 29  2)aBuf[1] << 16)
1f740 0a 20 20 20 20 20 20 20 2b 20 28 28 75 33 32 29  .       + ((u32)
1f750 61 42 75 66 5b 32 5d 20 3c 3c 20 20 38 29 0a 20  aBuf[2] <<  8). 
1f760 20 20 20 20 20 20 2b 20 28 28 75 33 32 29 61 42        + ((u32)aB
1f770 75 66 5b 33 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  uf[3]);.}../*.**
1f780 20 57 72 69 74 65 20 61 6e 20 75 6e 73 69 67 6e   Write an unsign
1f790 65 64 20 33 32 2d 62 69 74 20 76 61 6c 75 65 20  ed 32-bit value 
1f7a0 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e 20 66 6f  in big-endian fo
1f7b0 72 6d 61 74 20 74 6f 20 74 68 65 20 73 75 70 70  rmat to the supp
1f7c0 6c 69 65 64 0a 2a 2a 20 62 75 66 66 65 72 2e 0a  lied.** buffer..
1f7d0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
1f7e0 62 75 50 75 74 55 33 32 28 75 38 20 2a 61 42 75  buPutU32(u8 *aBu
1f7f0 66 2c 20 75 33 32 20 69 56 61 6c 29 7b 0a 20 20  f, u32 iVal){.  
1f800 61 42 75 66 5b 30 5d 20 3d 20 28 69 56 61 6c 20  aBuf[0] = (iVal 
1f810 3e 3e 20 32 34 29 20 26 20 30 78 46 46 3b 0a 20  >> 24) & 0xFF;. 
1f820 20 61 42 75 66 5b 31 5d 20 3d 20 28 69 56 61 6c   aBuf[1] = (iVal
1f830 20 3e 3e 20 31 36 29 20 26 20 30 78 46 46 3b 0a   >> 16) & 0xFF;.
1f840 20 20 61 42 75 66 5b 32 5d 20 3d 20 28 69 56 61    aBuf[2] = (iVa
1f850 6c 20 3e 3e 20 20 38 29 20 26 20 30 78 46 46 3b  l >>  8) & 0xFF;
1f860 0a 20 20 61 42 75 66 5b 33 5d 20 3d 20 28 69 56  .  aBuf[3] = (iV
1f870 61 6c 20 3e 3e 20 20 30 29 20 26 20 30 78 46 46  al >>  0) & 0xFF
1f880 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
1f890 20 72 62 75 50 75 74 55 31 36 28 75 38 20 2a 61   rbuPutU16(u8 *a
1f8a0 42 75 66 2c 20 75 31 36 20 69 56 61 6c 29 7b 0a  Buf, u16 iVal){.
1f8b0 20 20 61 42 75 66 5b 30 5d 20 3d 20 28 69 56 61    aBuf[0] = (iVa
1f8c0 6c 20 3e 3e 20 20 38 29 20 26 20 30 78 46 46 3b  l >>  8) & 0xFF;
1f8d0 0a 20 20 61 42 75 66 5b 31 5d 20 3d 20 28 69 56  .  aBuf[1] = (iV
1f8e0 61 6c 20 3e 3e 20 20 30 29 20 26 20 30 78 46 46  al >>  0) & 0xFF
1f8f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
1f900 64 61 74 61 20 66 72 6f 6d 20 61 6e 20 72 62 75  data from an rbu
1f910 56 66 73 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  Vfs-file..*/.sta
1f920 74 69 63 20 69 6e 74 20 72 62 75 56 66 73 52 65  tic int rbuVfsRe
1f930 61 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  ad(.  sqlite3_fi
1f940 6c 65 20 2a 70 46 69 6c 65 2c 20 0a 20 20 76 6f  le *pFile, .  vo
1f950 69 64 20 2a 7a 42 75 66 2c 20 0a 20 20 69 6e 74  id *zBuf, .  int
1f960 20 69 41 6d 74 2c 20 0a 20 20 73 71 6c 69 74 65   iAmt, .  sqlite
1f970 5f 69 6e 74 36 34 20 69 4f 66 73 74 0a 29 7b 0a  _int64 iOfst.){.
1f980 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 20 3d 20    rbu_file *p = 
1f990 28 72 62 75 5f 66 69 6c 65 2a 29 70 46 69 6c 65  (rbu_file*)pFile
1f9a0 3b 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20 2a  ;.  sqlite3rbu *
1f9b0 70 52 62 75 20 3d 20 70 2d 3e 70 52 62 75 3b 0a  pRbu = p->pRbu;.
1f9c0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
1f9d0 20 70 52 62 75 20 26 26 20 70 52 62 75 2d 3e 65   pRbu && pRbu->e
1f9e0 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45  Stage==RBU_STAGE
1f9f0 5f 43 41 50 54 55 52 45 20 29 7b 0a 20 20 20 20  _CAPTURE ){.    
1fa00 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 65 6e 46  assert( p->openF
1fa10 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
1fa20 45 4e 5f 57 41 4c 20 29 3b 0a 20 20 20 20 72 63  EN_WAL );.    rc
1fa30 20 3d 20 72 62 75 43 61 70 74 75 72 65 57 61 6c   = rbuCaptureWal
1fa40 52 65 61 64 28 70 2d 3e 70 52 62 75 2c 20 69 4f  Read(p->pRbu, iO
1fa50 66 73 74 2c 20 69 41 6d 74 29 3b 0a 20 20 7d 65  fst, iAmt);.  }e
1fa60 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 52 62  lse{.    if( pRb
1fa70 75 20 26 26 20 70 52 62 75 2d 3e 65 53 74 61 67  u && pRbu->eStag
1fa80 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c  e==RBU_STAGE_OAL
1fa90 20 0a 20 20 20 20 20 26 26 20 28 70 2d 3e 6f 70   .     && (p->op
1faa0 65 6e 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  enFlags & SQLITE
1fab0 5f 4f 50 45 4e 5f 57 41 4c 29 20 0a 20 20 20 20  _OPEN_WAL) .    
1fac0 20 26 26 20 69 4f 66 73 74 3e 3d 70 52 62 75 2d   && iOfst>=pRbu-
1fad0 3e 69 4f 61 6c 53 7a 20 0a 20 20 20 20 29 7b 0a  >iOalSz .    ){.
1fae0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1faf0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 6d 65 6d 73  E_OK;.      mems
1fb00 65 74 28 7a 42 75 66 2c 20 30 2c 20 69 41 6d 74  et(zBuf, 0, iAmt
1fb10 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1fb20 20 20 20 20 72 63 20 3d 20 70 2d 3e 70 52 65 61      rc = p->pRea
1fb30 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 52 65  l->pMethods->xRe
1fb40 61 64 28 70 2d 3e 70 52 65 61 6c 2c 20 7a 42 75  ad(p->pReal, zBu
1fb50 66 2c 20 69 41 6d 74 2c 20 69 4f 66 73 74 29 3b  f, iAmt, iOfst);
1fb60 0a 23 69 66 20 31 0a 20 20 20 20 20 20 2f 2a 20  .#if 1.      /* 
1fb70 49 66 20 74 68 69 73 20 69 73 20 62 65 69 6e 67  If this is being
1fb80 20 63 61 6c 6c 65 64 20 74 6f 20 72 65 61 64 20   called to read 
1fb90 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
1fba0 66 20 74 68 65 20 74 61 72 67 65 74 20 0a 20 20  f the target .  
1fbb0 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
1fbc0 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20 72 62  as part of an rb
1fbd0 75 20 76 61 63 75 75 6d 20 6f 70 65 72 61 74 69  u vacuum operati
1fbe0 6f 6e 2c 20 73 79 6e 74 68 65 73 69 7a 65 20 74  on, synthesize t
1fbf0 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e  he .      ** con
1fc00 74 65 6e 74 73 20 6f 66 20 74 68 65 20 66 69 72  tents of the fir
1fc10 73 74 20 70 61 67 65 20 69 66 20 69 74 20 64 6f  st page if it do
1fc20 65 73 20 6e 6f 74 20 79 65 74 20 65 78 69 73 74  es not yet exist
1fc30 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20 20  . Otherwise,.   
1fc40 20 20 20 2a 2a 20 53 51 4c 69 74 65 20 77 69 6c     ** SQLite wil
1fc50 6c 20 6e 6f 74 20 63 68 65 63 6b 20 66 6f 72 20  l not check for 
1fc60 61 20 2a 2d 77 61 6c 20 66 69 6c 65 2e 20 20 2a  a *-wal file.  *
1fc70 2f 0a 20 20 20 20 20 20 69 66 28 20 70 52 62 75  /.      if( pRbu
1fc80 20 26 26 20 72 62 75 49 73 56 61 63 75 75 6d 28   && rbuIsVacuum(
1fc90 70 52 62 75 29 20 0a 20 20 20 20 20 20 20 20 20  pRbu) .         
1fca0 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49   && rc==SQLITE_I
1fcb0 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20  OERR_SHORT_READ 
1fcc0 26 26 20 69 4f 66 73 74 3d 3d 30 0a 20 20 20 20  && iOfst==0.    
1fcd0 20 20 20 20 20 20 26 26 20 28 70 2d 3e 6f 70 65        && (p->ope
1fce0 6e 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  nFlags & SQLITE_
1fcf0 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 0a 20 20  OPEN_MAIN_DB).  
1fd00 20 20 20 20 20 20 20 20 26 26 20 70 52 62 75 2d          && pRbu-
1fd10 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20  >rc==SQLITE_OK. 
1fd20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
1fd30 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
1fd40 64 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c  d = (sqlite3_fil
1fd50 65 2a 29 70 52 62 75 2d 3e 70 52 62 75 46 64 3b  e*)pRbu->pRbuFd;
1fd60 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 46  .        rc = pF
1fd70 64 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 52 65  d->pMethods->xRe
1fd80 61 64 28 70 46 64 2c 20 7a 42 75 66 2c 20 69 41  ad(pFd, zBuf, iA
1fd90 6d 74 2c 20 69 4f 66 73 74 29 3b 0a 20 20 20 20  mt, iOfst);.    
1fda0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1fdb0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1fdc0 20 20 20 75 38 20 2a 61 42 75 66 20 3d 20 28 75     u8 *aBuf = (u
1fdd0 38 2a 29 7a 42 75 66 3b 0a 20 20 20 20 20 20 20  8*)zBuf;.       
1fde0 20 20 20 75 33 32 20 69 52 6f 6f 74 20 3d 20 72     u32 iRoot = r
1fdf0 62 75 47 65 74 55 33 32 28 26 61 42 75 66 5b 35  buGetU32(&aBuf[5
1fe00 32 5d 29 20 3f 20 31 20 3a 20 30 3b 0a 20 20 20  2]) ? 1 : 0;.   
1fe10 20 20 20 20 20 20 20 72 62 75 50 75 74 55 33 32         rbuPutU32
1fe20 28 26 61 42 75 66 5b 35 32 5d 2c 20 69 52 6f 6f  (&aBuf[52], iRoo
1fe30 74 29 3b 20 20 20 20 20 20 2f 2a 20 6c 61 72 67  t);      /* larg
1fe40 65 73 74 20 72 6f 6f 74 20 70 61 67 65 20 6e 75  est root page nu
1fe50 6d 62 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  mber */.        
1fe60 20 20 72 62 75 50 75 74 55 33 32 28 26 61 42 75    rbuPutU32(&aBu
1fe70 66 5b 33 36 5d 2c 20 30 29 3b 20 20 20 20 20 20  f[36], 0);      
1fe80 20 20 20 20 2f 2a 20 6e 75 6d 62 65 72 20 6f 66      /* number of
1fe90 20 66 72 65 65 20 70 61 67 65 73 20 2a 2f 0a 20   free pages */. 
1fea0 20 20 20 20 20 20 20 20 20 72 62 75 50 75 74 55           rbuPutU
1feb0 33 32 28 26 61 42 75 66 5b 33 32 5d 2c 20 30 29  32(&aBuf[32], 0)
1fec0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69  ;          /* fi
1fed0 72 73 74 20 70 61 67 65 20 6f 6e 20 66 72 65 65  rst page on free
1fee0 20 6c 69 73 74 20 74 72 75 6e 6b 20 2a 2f 0a 20   list trunk */. 
1fef0 20 20 20 20 20 20 20 20 20 72 62 75 50 75 74 55           rbuPutU
1ff00 33 32 28 26 61 42 75 66 5b 32 38 5d 2c 20 31 29  32(&aBuf[28], 1)
1ff10 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 69  ;          /* si
1ff20 7a 65 20 6f 66 20 64 62 20 66 69 6c 65 20 69 6e  ze of db file in
1ff30 20 70 61 67 65 73 20 2a 2f 0a 20 20 20 20 20 20   pages */.      
1ff40 20 20 20 20 72 62 75 50 75 74 55 33 32 28 26 61      rbuPutU32(&a
1ff50 42 75 66 5b 32 34 5d 2c 20 70 52 62 75 2d 3e 70  Buf[24], pRbu->p
1ff60 52 62 75 46 64 2d 3e 69 43 6f 6f 6b 69 65 2b 31  RbuFd->iCookie+1
1ff70 29 3b 20 20 2f 2a 20 43 68 61 6e 67 65 20 63 6f  );  /* Change co
1ff80 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 20 20 20 20  unter */..      
1ff90 20 20 20 20 69 66 28 20 69 41 6d 74 3e 31 30 30      if( iAmt>100
1ffa0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1ffb0 6d 65 6d 73 65 74 28 26 61 42 75 66 5b 31 30 30  memset(&aBuf[100
1ffc0 5d 2c 20 30 2c 20 69 41 6d 74 2d 31 30 30 29 3b  ], 0, iAmt-100);
1ffd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 62 75  .            rbu
1ffe0 50 75 74 55 31 36 28 26 61 42 75 66 5b 31 30 35  PutU16(&aBuf[105
1fff0 5d 2c 20 69 41 6d 74 20 26 20 30 78 46 46 46 46  ], iAmt & 0xFFFF
20000 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  );.            a
20010 42 75 66 5b 31 30 30 5d 20 3d 20 30 78 30 44 3b  Buf[100] = 0x0D;
20020 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
20030 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23       }.      }.#
20040 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20  endif.    }.    
20050 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
20060 4b 20 26 26 20 69 4f 66 73 74 3d 3d 30 20 26 26  K && iOfst==0 &&
20070 20 28 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26   (p->openFlags &
20080 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49   SQLITE_OPEN_MAI
20090 4e 5f 44 42 29 20 29 7b 0a 20 20 20 20 20 20 2f  N_DB) ){.      /
200a0 2a 20 54 68 65 73 65 20 6c 6f 6f 6b 20 6c 69 6b  * These look lik
200b0 65 20 6d 61 67 69 63 20 6e 75 6d 62 65 72 73 2e  e magic numbers.
200c0 20 42 75 74 20 74 68 65 79 20 61 72 65 20 73 74   But they are st
200d0 61 62 6c 65 2c 20 61 73 20 74 68 65 79 20 61 72  able, as they ar
200e0 65 20 70 61 72 74 0a 20 20 20 20 20 20 20 2a 2a  e part.       **
200f0 20 6f 66 20 74 68 65 20 64 65 66 69 6e 69 74 69   of the definiti
20100 6f 6e 20 6f 66 20 74 68 65 20 53 51 4c 69 74 65  on of the SQLite
20110 20 66 69 6c 65 20 66 6f 72 6d 61 74 2c 20 77 68   file format, wh
20120 69 63 68 20 6d 61 79 20 6e 6f 74 20 63 68 61 6e  ich may not chan
20130 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 75 38 20  ge. */.      u8 
20140 2a 70 42 75 66 20 3d 20 28 75 38 2a 29 7a 42 75  *pBuf = (u8*)zBu
20150 66 3b 0a 20 20 20 20 20 20 70 2d 3e 69 43 6f 6f  f;.      p->iCoo
20160 6b 69 65 20 3d 20 72 62 75 47 65 74 55 33 32 28  kie = rbuGetU32(
20170 26 70 42 75 66 5b 32 34 5d 29 3b 0a 20 20 20 20  &pBuf[24]);.    
20180 20 20 70 2d 3e 69 57 72 69 74 65 56 65 72 20 3d    p->iWriteVer =
20190 20 70 42 75 66 5b 31 39 5d 3b 0a 20 20 20 20 7d   pBuf[19];.    }
201a0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
201b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
201c0 20 64 61 74 61 20 74 6f 20 61 6e 20 72 62 75 56   data to an rbuV
201d0 66 73 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  fs-file..*/.stat
201e0 69 63 20 69 6e 74 20 72 62 75 56 66 73 57 72 69  ic int rbuVfsWri
201f0 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  te(.  sqlite3_fi
20200 6c 65 20 2a 70 46 69 6c 65 2c 20 0a 20 20 63 6f  le *pFile, .  co
20210 6e 73 74 20 76 6f 69 64 20 2a 7a 42 75 66 2c 20  nst void *zBuf, 
20220 0a 20 20 69 6e 74 20 69 41 6d 74 2c 20 0a 20 20  .  int iAmt, .  
20230 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 69 4f 66  sqlite_int64 iOf
20240 73 74 0a 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65  st.){.  rbu_file
20250 20 2a 70 20 3d 20 28 72 62 75 5f 66 69 6c 65 2a   *p = (rbu_file*
20260 29 70 46 69 6c 65 3b 0a 20 20 73 71 6c 69 74 65  )pFile;.  sqlite
20270 33 72 62 75 20 2a 70 52 62 75 20 3d 20 70 2d 3e  3rbu *pRbu = p->
20280 70 52 62 75 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  pRbu;.  int rc;.
20290 0a 20 20 69 66 28 20 70 52 62 75 20 26 26 20 70  .  if( pRbu && p
202a0 52 62 75 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55  Rbu->eStage==RBU
202b0 5f 53 54 41 47 45 5f 43 41 50 54 55 52 45 20 29  _STAGE_CAPTURE )
202c0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
202d0 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20 53 51 4c  >openFlags & SQL
202e0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
202f0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 72 62 75   );.    rc = rbu
20300 43 61 70 74 75 72 65 44 62 57 72 69 74 65 28 70  CaptureDbWrite(p
20310 2d 3e 70 52 62 75 2c 20 69 4f 66 73 74 29 3b 0a  ->pRbu, iOfst);.
20320 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
20330 20 70 52 62 75 20 26 26 20 70 52 62 75 2d 3e 65   pRbu && pRbu->e
20340 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45  Stage==RBU_STAGE
20350 5f 4f 41 4c 20 0a 20 20 20 20 20 26 26 20 28 70  _OAL .     && (p
20360 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20 53 51  ->openFlags & SQ
20370 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 29 20 0a  LITE_OPEN_WAL) .
20380 20 20 20 20 20 26 26 20 69 4f 66 73 74 3e 3d 70       && iOfst>=p
20390 52 62 75 2d 3e 69 4f 61 6c 53 7a 0a 20 20 20 20  Rbu->iOalSz.    
203a0 29 7b 0a 20 20 20 20 20 20 70 52 62 75 2d 3e 69  ){.      pRbu->i
203b0 4f 61 6c 53 7a 20 3d 20 69 41 6d 74 20 2b 20 69  OalSz = iAmt + i
203c0 4f 66 73 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Ofst;.    }.    
203d0 72 63 20 3d 20 70 2d 3e 70 52 65 61 6c 2d 3e 70  rc = p->pReal->p
203e0 4d 65 74 68 6f 64 73 2d 3e 78 57 72 69 74 65 28  Methods->xWrite(
203f0 70 2d 3e 70 52 65 61 6c 2c 20 7a 42 75 66 2c 20  p->pReal, zBuf, 
20400 69 41 6d 74 2c 20 69 4f 66 73 74 29 3b 0a 20 20  iAmt, iOfst);.  
20410 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
20420 5f 4f 4b 20 26 26 20 69 4f 66 73 74 3d 3d 30 20  _OK && iOfst==0 
20430 26 26 20 28 70 2d 3e 6f 70 65 6e 46 6c 61 67 73  && (p->openFlags
20440 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d   & SQLITE_OPEN_M
20450 41 49 4e 5f 44 42 29 20 29 7b 0a 20 20 20 20 20  AIN_DB) ){.     
20460 20 2f 2a 20 54 68 65 73 65 20 6c 6f 6f 6b 20 6c   /* These look l
20470 69 6b 65 20 6d 61 67 69 63 20 6e 75 6d 62 65 72  ike magic number
20480 73 2e 20 42 75 74 20 74 68 65 79 20 61 72 65 20  s. But they are 
20490 73 74 61 62 6c 65 2c 20 61 73 20 74 68 65 79 20  stable, as they 
204a0 61 72 65 20 70 61 72 74 0a 20 20 20 20 20 20 2a  are part.      *
204b0 2a 20 6f 66 20 74 68 65 20 64 65 66 69 6e 69 74  * of the definit
204c0 69 6f 6e 20 6f 66 20 74 68 65 20 53 51 4c 69 74  ion of the SQLit
204d0 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2c 20 77  e file format, w
204e0 68 69 63 68 20 6d 61 79 20 6e 6f 74 20 63 68 61  hich may not cha
204f0 6e 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 75 38  nge. */.      u8
20500 20 2a 70 42 75 66 20 3d 20 28 75 38 2a 29 7a 42   *pBuf = (u8*)zB
20510 75 66 3b 0a 20 20 20 20 20 20 70 2d 3e 69 43 6f  uf;.      p->iCo
20520 6f 6b 69 65 20 3d 20 72 62 75 47 65 74 55 33 32  okie = rbuGetU32
20530 28 26 70 42 75 66 5b 32 34 5d 29 3b 0a 20 20 20  (&pBuf[24]);.   
20540 20 20 20 70 2d 3e 69 57 72 69 74 65 56 65 72 20     p->iWriteVer 
20550 3d 20 70 42 75 66 5b 31 39 5d 3b 0a 20 20 20 20  = pBuf[19];.    
20560 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
20570 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e  c;.}../*.** Trun
20580 63 61 74 65 20 61 6e 20 72 62 75 56 66 73 2d 66  cate an rbuVfs-f
20590 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
205a0 6e 74 20 72 62 75 56 66 73 54 72 75 6e 63 61 74  nt rbuVfsTruncat
205b0 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
205c0 70 46 69 6c 65 2c 20 73 71 6c 69 74 65 5f 69 6e  pFile, sqlite_in
205d0 74 36 34 20 73 69 7a 65 29 7b 0a 20 20 72 62 75  t64 size){.  rbu
205e0 5f 66 69 6c 65 20 2a 70 20 3d 20 28 72 62 75 5f  _file *p = (rbu_
205f0 66 69 6c 65 2a 29 70 46 69 6c 65 3b 0a 20 20 72  file*)pFile;.  r
20600 65 74 75 72 6e 20 70 2d 3e 70 52 65 61 6c 2d 3e  eturn p->pReal->
20610 70 4d 65 74 68 6f 64 73 2d 3e 78 54 72 75 6e 63  pMethods->xTrunc
20620 61 74 65 28 70 2d 3e 70 52 65 61 6c 2c 20 73 69  ate(p->pReal, si
20630 7a 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79  ze);.}../*.** Sy
20640 6e 63 20 61 6e 20 72 62 75 56 66 73 2d 66 69 6c  nc an rbuVfs-fil
20650 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
20660 20 72 62 75 56 66 73 53 79 6e 63 28 73 71 6c 69   rbuVfsSync(sqli
20670 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c  te3_file *pFile,
20680 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 72   int flags){.  r
20690 62 75 5f 66 69 6c 65 20 2a 70 20 3d 20 28 72 62  bu_file *p = (rb
206a0 75 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a  u_file *)pFile;.
206b0 20 20 69 66 28 20 70 2d 3e 70 52 62 75 20 26 26    if( p->pRbu &&
206c0 20 70 2d 3e 70 52 62 75 2d 3e 65 53 74 61 67 65   p->pRbu->eStage
206d0 3d 3d 52 42 55 5f 53 54 41 47 45 5f 43 41 50 54  ==RBU_STAGE_CAPT
206e0 55 52 45 20 29 7b 0a 20 20 20 20 69 66 28 20 70  URE ){.    if( p
206f0 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20 53 51  ->openFlags & SQ
20700 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
20710 42 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  B ){.      retur
20720 6e 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41  n SQLITE_INTERNA
20730 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  L;.    }.    ret
20740 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
20750 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70   }.  return p->p
20760 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e  Real->pMethods->
20770 78 53 79 6e 63 28 70 2d 3e 70 52 65 61 6c 2c 20  xSync(p->pReal, 
20780 66 6c 61 67 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  flags);.}../*.**
20790 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72   Return the curr
207a0 65 6e 74 20 66 69 6c 65 2d 73 69 7a 65 20 6f 66  ent file-size of
207b0 20 61 6e 20 72 62 75 56 66 73 2d 66 69 6c 65 2e   an rbuVfs-file.
207c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
207d0 62 75 56 66 73 46 69 6c 65 53 69 7a 65 28 73 71  buVfsFileSize(sq
207e0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
207f0 65 2c 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20  e, sqlite_int64 
20800 2a 70 53 69 7a 65 29 7b 0a 20 20 72 62 75 5f 66  *pSize){.  rbu_f
20810 69 6c 65 20 2a 70 20 3d 20 28 72 62 75 5f 66 69  ile *p = (rbu_fi
20820 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 69 6e  le *)pFile;.  in
20830 74 20 72 63 3b 0a 20 20 72 63 20 3d 20 70 2d 3e  t rc;.  rc = p->
20840 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d  pReal->pMethods-
20850 3e 78 46 69 6c 65 53 69 7a 65 28 70 2d 3e 70 52  >xFileSize(p->pR
20860 65 61 6c 2c 20 70 53 69 7a 65 29 3b 0a 0a 20 20  eal, pSize);..  
20870 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  /* If this is an
20880 20 52 42 55 20 76 61 63 75 75 6d 20 6f 70 65 72   RBU vacuum oper
20890 61 74 69 6f 6e 20 61 6e 64 20 74 68 69 73 20 69  ation and this i
208a0 73 20 74 68 65 20 74 61 72 67 65 74 20 64 61 74  s the target dat
208b0 61 62 61 73 65 2c 0a 20 20 2a 2a 20 70 72 65 74  abase,.  ** pret
208c0 65 6e 64 20 74 68 61 74 20 69 74 20 68 61 73 20  end that it has 
208d0 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 70 61 67  at least one pag
208e0 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51  e. Otherwise, SQ
208f0 4c 69 74 65 20 77 69 6c 6c 20 6e 6f 74 0a 20 20  Lite will not.  
20900 2a 2a 20 63 68 65 63 6b 20 66 6f 72 20 74 68 65  ** check for the
20910 20 65 78 69 73 74 61 6e 63 65 20 6f 66 20 61 20   existance of a 
20920 2a 2d 77 61 6c 20 66 69 6c 65 2e 20 72 62 75 56  *-wal file. rbuV
20930 66 73 52 65 61 64 28 29 20 63 6f 6e 74 61 69 6e  fsRead() contain
20940 73 20 0a 20 20 2a 2a 20 73 69 6d 69 6c 61 72 20  s .  ** similar 
20950 6c 6f 67 69 63 2e 20 20 2a 2f 0a 20 20 69 66 28  logic.  */.  if(
20960 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
20970 26 20 2a 70 53 69 7a 65 3d 3d 30 20 0a 20 20 20  & *pSize==0 .   
20980 26 26 20 70 2d 3e 70 52 62 75 20 26 26 20 72 62  && p->pRbu && rb
20990 75 49 73 56 61 63 75 75 6d 28 70 2d 3e 70 52 62  uIsVacuum(p->pRb
209a0 75 29 20 0a 20 20 20 26 26 20 28 70 2d 3e 6f 70  u) .   && (p->op
209b0 65 6e 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  enFlags & SQLITE
209c0 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 0a 20  _OPEN_MAIN_DB). 
209d0 20 29 7b 0a 20 20 20 20 2a 70 53 69 7a 65 20 3d   ){.    *pSize =
209e0 20 31 30 32 34 3b 0a 20 20 7d 0a 20 20 72 65 74   1024;.  }.  ret
209f0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
20a00 20 4c 6f 63 6b 20 61 6e 20 72 62 75 56 66 73 2d   Lock an rbuVfs-
20a10 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
20a20 69 6e 74 20 72 62 75 56 66 73 4c 6f 63 6b 28 73  int rbuVfsLock(s
20a30 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
20a40 6c 65 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a  le, int eLock){.
20a50 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 20 3d 20    rbu_file *p = 
20a60 28 72 62 75 5f 66 69 6c 65 2a 29 70 46 69 6c 65  (rbu_file*)pFile
20a70 3b 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20 2a  ;.  sqlite3rbu *
20a80 70 52 62 75 20 3d 20 70 2d 3e 70 52 62 75 3b 0a  pRbu = p->pRbu;.
20a90 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
20aa0 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
20ab0 20 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20   p->openFlags & 
20ac0 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  (SQLITE_OPEN_MAI
20ad0 4e 5f 44 42 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  N_DB|SQLITE_OPEN
20ae0 5f 54 45 4d 50 5f 44 42 29 20 29 3b 0a 20 20 69  _TEMP_DB) );.  i
20af0 66 28 20 65 4c 6f 63 6b 3d 3d 53 51 4c 49 54 45  f( eLock==SQLITE
20b00 5f 4c 4f 43 4b 5f 45 58 43 4c 55 53 49 56 45 20  _LOCK_EXCLUSIVE 
20b10 0a 20 20 20 26 26 20 28 70 2d 3e 62 4e 6f 6c 6f  .   && (p->bNolo
20b20 63 6b 20 7c 7c 20 28 70 52 62 75 20 26 26 20 70  ck || (pRbu && p
20b30 52 62 75 2d 3e 65 53 74 61 67 65 21 3d 52 42 55  Rbu->eStage!=RBU
20b40 5f 53 54 41 47 45 5f 44 4f 4e 45 29 29 0a 20 20  _STAGE_DONE)).  
20b50 29 7b 0a 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74  ){.    /* Do not
20b60 20 61 6c 6c 6f 77 20 45 58 43 4c 55 53 49 56 45   allow EXCLUSIVE
20b70 20 6c 6f 63 6b 73 2e 20 50 72 65 76 65 6e 74 69   locks. Preventi
20b80 6e 67 20 53 51 4c 69 74 65 20 66 72 6f 6d 20 74  ng SQLite from t
20b90 61 6b 69 6e 67 20 74 68 69 73 20 0a 20 20 20 20  aking this .    
20ba0 2a 2a 20 70 72 65 76 65 6e 74 73 20 69 74 20 66  ** prevents it f
20bb0 72 6f 6d 20 63 68 65 63 6b 70 6f 69 6e 74 69 6e  rom checkpointin
20bc0 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  g the database f
20bd0 72 6f 6d 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73  rom sqlite3_clos
20be0 65 28 29 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d  e(). */.    rc =
20bf0 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
20c00 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
20c10 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f  p->pReal->pMetho
20c20 64 73 2d 3e 78 4c 6f 63 6b 28 70 2d 3e 70 52 65  ds->xLock(p->pRe
20c30 61 6c 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20 7d 0a  al, eLock);.  }.
20c40 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
20c50 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 61 6e  ./*.** Unlock an
20c60 20 72 62 75 56 66 73 2d 66 69 6c 65 2e 0a 2a 2f   rbuVfs-file..*/
20c70 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 56  .static int rbuV
20c80 66 73 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33  fsUnlock(sqlite3
20c90 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e  _file *pFile, in
20ca0 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 72 62 75 5f  t eLock){.  rbu_
20cb0 66 69 6c 65 20 2a 70 20 3d 20 28 72 62 75 5f 66  file *p = (rbu_f
20cc0 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 72  ile *)pFile;.  r
20cd0 65 74 75 72 6e 20 70 2d 3e 70 52 65 61 6c 2d 3e  eturn p->pReal->
20ce0 70 4d 65 74 68 6f 64 73 2d 3e 78 55 6e 6c 6f 63  pMethods->xUnloc
20cf0 6b 28 70 2d 3e 70 52 65 61 6c 2c 20 65 4c 6f 63  k(p->pReal, eLoc
20d00 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  k);.}../*.** Che
20d10 63 6b 20 69 66 20 61 6e 6f 74 68 65 72 20 66 69  ck if another fi
20d20 6c 65 2d 68 61 6e 64 6c 65 20 68 6f 6c 64 73 20  le-handle holds 
20d30 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
20d40 6f 6e 20 61 6e 20 72 62 75 56 66 73 2d 66 69 6c  on an rbuVfs-fil
20d50 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
20d60 20 72 62 75 56 66 73 43 68 65 63 6b 52 65 73 65   rbuVfsCheckRese
20d70 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33  rvedLock(sqlite3
20d80 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e  _file *pFile, in
20d90 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 72  t *pResOut){.  r
20da0 62 75 5f 66 69 6c 65 20 2a 70 20 3d 20 28 72 62  bu_file *p = (rb
20db0 75 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a  u_file *)pFile;.
20dc0 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 52 65 61    return p->pRea
20dd0 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 43 68  l->pMethods->xCh
20de0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
20df0 70 2d 3e 70 52 65 61 6c 2c 20 70 52 65 73 4f 75  p->pReal, pResOu
20e00 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c  t);.}../*.** Fil
20e10 65 20 63 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64  e control method
20e20 2e 20 46 6f 72 20 63 75 73 74 6f 6d 20 6f 70 65  . For custom ope
20e30 72 61 74 69 6f 6e 73 20 6f 6e 20 61 6e 20 72 62  rations on an rb
20e40 75 56 66 73 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74  uVfs-file..*/.st
20e50 61 74 69 63 20 69 6e 74 20 72 62 75 56 66 73 46  atic int rbuVfsF
20e60 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74  ileControl(sqlit
20e70 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20  e3_file *pFile, 
20e80 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41  int op, void *pA
20e90 72 67 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20  rg){.  rbu_file 
20ea0 2a 70 20 3d 20 28 72 62 75 5f 66 69 6c 65 20 2a  *p = (rbu_file *
20eb0 29 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20 28 2a  )pFile;.  int (*
20ec0 78 43 6f 6e 74 72 6f 6c 29 28 73 71 6c 69 74 65  xControl)(sqlite
20ed0 33 5f 66 69 6c 65 2a 2c 69 6e 74 2c 76 6f 69 64  3_file*,int,void
20ee0 2a 29 20 3d 20 70 2d 3e 70 52 65 61 6c 2d 3e 70  *) = p->pReal->p
20ef0 4d 65 74 68 6f 64 73 2d 3e 78 46 69 6c 65 43 6f  Methods->xFileCo
20f00 6e 74 72 6f 6c 3b 0a 20 20 69 6e 74 20 72 63 3b  ntrol;.  int rc;
20f10 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f  ..  assert( p->o
20f20 70 65 6e 46 6c 61 67 73 20 26 20 28 53 51 4c 49  penFlags & (SQLI
20f30 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 7c  TE_OPEN_MAIN_DB|
20f40 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
20f50 5f 44 42 29 0a 20 20 20 20 20 20 20 7c 7c 20 70  _DB).       || p
20f60 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20 28 53  ->openFlags & (S
20f70 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53  QLITE_OPEN_TRANS
20f80 49 45 4e 54 5f 44 42 7c 53 51 4c 49 54 45 5f 4f  IENT_DB|SQLITE_O
20f90 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c  PEN_TEMP_JOURNAL
20fa0 29 0a 20 20 29 3b 0a 20 20 69 66 28 20 6f 70 3d  ).  );.  if( op=
20fb0 3d 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 52 42  =SQLITE_FCNTL_RB
20fc0 55 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  U ){.    sqlite3
20fd0 72 62 75 20 2a 70 52 62 75 20 3d 20 28 73 71 6c  rbu *pRbu = (sql
20fe0 69 74 65 33 72 62 75 2a 29 70 41 72 67 3b 0a 0a  ite3rbu*)pArg;..
20ff0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 74 72 79      /* First try
21000 20 74 6f 20 66 69 6e 64 20 61 6e 6f 74 68 65 72   to find another
21010 20 52 42 55 20 76 66 73 20 6c 6f 77 65 72 20 64   RBU vfs lower d
21020 6f 77 6e 20 69 6e 20 74 68 65 20 76 66 73 20 73  own in the vfs s
21030 74 61 63 6b 2e 20 49 66 0a 20 20 20 20 2a 2a 20  tack. If.    ** 
21040 6f 6e 65 20 69 73 20 66 6f 75 6e 64 2c 20 74 68  one is found, th
21050 69 73 20 76 66 73 20 77 69 6c 6c 20 6f 70 65 72  is vfs will oper
21060 61 74 65 20 69 6e 20 70 61 73 73 2d 74 68 72 6f  ate in pass-thro
21070 75 67 68 20 6d 6f 64 65 2e 20 54 68 65 20 6c 6f  ugh mode. The lo
21080 77 65 72 0a 20 20 20 20 2a 2a 20 6c 65 76 65 6c  wer.    ** level
21090 20 76 66 73 20 77 69 6c 6c 20 64 6f 20 74 68 65   vfs will do the
210a0 20 73 70 65 63 69 61 6c 20 52 42 55 20 68 61 6e   special RBU han
210b0 64 6c 69 6e 67 2e 20 20 2a 2f 0a 20 20 20 20 72  dling.  */.    r
210c0 63 20 3d 20 78 43 6f 6e 74 72 6f 6c 28 70 2d 3e  c = xControl(p->
210d0 70 52 65 61 6c 2c 20 6f 70 2c 20 70 41 72 67 29  pReal, op, pArg)
210e0 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  ;..    if( rc==S
210f0 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29  QLITE_NOTFOUND )
21100 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 77 20 73  {.      /* Now s
21110 65 61 72 63 68 20 66 6f 72 20 61 20 7a 69 70 76  earch for a zipv
21120 66 73 20 69 6e 73 74 61 6e 63 65 20 6c 6f 77 65  fs instance lowe
21130 72 20 64 6f 77 6e 20 69 6e 20 74 68 65 20 56 46  r down in the VF
21140 53 20 73 74 61 63 6b 2e 20 49 66 0a 20 20 20 20  S stack. If.    
21150 20 20 2a 2a 20 6f 6e 65 20 69 73 20 66 6f 75 6e    ** one is foun
21160 64 2c 20 74 68 69 73 20 69 73 20 61 6e 20 65 72  d, this is an er
21170 72 6f 72 2e 20 20 2a 2f 0a 20 20 20 20 20 20 76  ror.  */.      v
21180 6f 69 64 20 2a 64 75 6d 6d 79 20 3d 20 30 3b 0a  oid *dummy = 0;.
21190 20 20 20 20 20 20 72 63 20 3d 20 78 43 6f 6e 74        rc = xCont
211a0 72 6f 6c 28 70 2d 3e 70 52 65 61 6c 2c 20 53 51  rol(p->pReal, SQ
211b0 4c 49 54 45 5f 46 43 4e 54 4c 5f 5a 49 50 56 46  LITE_FCNTL_ZIPVF
211c0 53 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20  S, &dummy);.    
211d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
211e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
211f0 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
21200 3b 0a 20 20 20 20 20 20 20 20 70 52 62 75 2d 3e  ;.        pRbu->
21210 7a 45 72 72 6d 73 67 20 3d 20 73 71 6c 69 74 65  zErrmsg = sqlite
21220 33 5f 6d 70 72 69 6e 74 66 28 22 72 62 75 2f 7a  3_mprintf("rbu/z
21230 69 70 76 66 73 20 73 65 74 75 70 20 65 72 72 6f  ipvfs setup erro
21240 72 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  r");.      }else
21250 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
21260 4e 4f 54 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20  NOTFOUND ){.    
21270 20 20 20 20 70 52 62 75 2d 3e 70 54 61 72 67 65      pRbu->pTarge
21280 74 46 64 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  tFd = p;.       
21290 20 70 2d 3e 70 52 62 75 20 3d 20 70 52 62 75 3b   p->pRbu = pRbu;
212a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
212b0 70 57 61 6c 46 64 20 29 20 70 2d 3e 70 57 61 6c  pWalFd ) p->pWal
212c0 46 64 2d 3e 70 52 62 75 20 3d 20 70 52 62 75 3b  Fd->pRbu = pRbu;
212d0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
212e0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
212f0 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
21300 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 65 6c 73 65  n rc;.  }.  else
21310 20 69 66 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f   if( op==SQLITE_
21320 46 43 4e 54 4c 5f 52 42 55 43 4e 54 20 29 7b 0a  FCNTL_RBUCNT ){.
21330 20 20 20 20 73 71 6c 69 74 65 33 72 62 75 20 2a      sqlite3rbu *
21340 70 52 62 75 20 3d 20 28 73 71 6c 69 74 65 33 72  pRbu = (sqlite3r
21350 62 75 2a 29 70 41 72 67 3b 0a 20 20 20 20 70 52  bu*)pArg;.    pR
21360 62 75 2d 3e 6e 52 62 75 2b 2b 3b 0a 20 20 20 20  bu->nRbu++;.    
21370 70 52 62 75 2d 3e 70 52 62 75 46 64 20 3d 20 70  pRbu->pRbuFd = p
21380 3b 0a 20 20 20 20 70 2d 3e 62 4e 6f 6c 6f 63 6b  ;.    p->bNolock
21390 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 72 63 20   = 1;.  }..  rc 
213a0 3d 20 78 43 6f 6e 74 72 6f 6c 28 70 2d 3e 70 52  = xControl(p->pR
213b0 65 61 6c 2c 20 6f 70 2c 20 70 41 72 67 29 3b 0a  eal, op, pArg);.
213c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
213d0 5f 4f 4b 20 26 26 20 6f 70 3d 3d 53 51 4c 49 54  _OK && op==SQLIT
213e0 45 5f 46 43 4e 54 4c 5f 56 46 53 4e 41 4d 45 20  E_FCNTL_VFSNAME 
213f0 29 7b 0a 20 20 20 20 72 62 75 5f 76 66 73 20 2a  ){.    rbu_vfs *
21400 70 52 62 75 56 66 73 20 3d 20 70 2d 3e 70 52 62  pRbuVfs = p->pRb
21410 75 56 66 73 3b 0a 20 20 20 20 63 68 61 72 20 2a  uVfs;.    char *
21420 7a 49 6e 20 3d 20 2a 28 63 68 61 72 2a 2a 29 70  zIn = *(char**)p
21430 41 72 67 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  Arg;.    char *z
21440 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Out = sqlite3_mp
21450 72 69 6e 74 66 28 22 72 62 75 28 25 73 29 2f 25  rintf("rbu(%s)/%
21460 7a 22 2c 20 70 52 62 75 56 66 73 2d 3e 62 61 73  z", pRbuVfs->bas
21470 65 2e 7a 4e 61 6d 65 2c 20 7a 49 6e 29 3b 0a 20  e.zName, zIn);. 
21480 20 20 20 2a 28 63 68 61 72 2a 2a 29 70 41 72 67     *(char**)pArg
21490 20 3d 20 7a 4f 75 74 3b 0a 20 20 20 20 69 66 28   = zOut;.    if(
214a0 20 7a 4f 75 74 3d 3d 30 20 29 20 72 63 20 3d 20   zOut==0 ) rc = 
214b0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
214c0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
214d0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
214e0 74 68 65 20 73 65 63 74 6f 72 2d 73 69 7a 65 20  the sector-size 
214f0 69 6e 20 62 79 74 65 73 20 66 6f 72 20 61 6e 20  in bytes for an 
21500 72 62 75 56 66 73 2d 66 69 6c 65 2e 0a 2a 2f 0a  rbuVfs-file..*/.
21510 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 56 66  static int rbuVf
21520 73 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69  sSectorSize(sqli
21530 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 29  te3_file *pFile)
21540 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 20  {.  rbu_file *p 
21550 3d 20 28 72 62 75 5f 66 69 6c 65 20 2a 29 70 46  = (rbu_file *)pF
21560 69 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d  ile;.  return p-
21570 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73  >pReal->pMethods
21580 2d 3e 78 53 65 63 74 6f 72 53 69 7a 65 28 70 2d  ->xSectorSize(p-
21590 3e 70 52 65 61 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  >pReal);.}../*.*
215a0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 76  * Return the dev
215b0 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74  ice characterist
215c0 69 63 20 66 6c 61 67 73 20 73 75 70 70 6f 72 74  ic flags support
215d0 65 64 20 62 79 20 61 6e 20 72 62 75 56 66 73 2d  ed by an rbuVfs-
215e0 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
215f0 69 6e 74 20 72 62 75 56 66 73 44 65 76 69 63 65  int rbuVfsDevice
21600 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
21610 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
21620 69 6c 65 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65  ile){.  rbu_file
21630 20 2a 70 20 3d 20 28 72 62 75 5f 66 69 6c 65 20   *p = (rbu_file 
21640 2a 29 70 46 69 6c 65 3b 0a 20 20 72 65 74 75 72  *)pFile;.  retur
21650 6e 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74  n p->pReal->pMet
21660 68 6f 64 73 2d 3e 78 44 65 76 69 63 65 43 68 61  hods->xDeviceCha
21670 72 61 63 74 65 72 69 73 74 69 63 73 28 70 2d 3e  racteristics(p->
21680 70 52 65 61 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pReal);.}../*.**
21690 20 54 61 6b 65 20 6f 72 20 72 65 6c 65 61 73 65   Take or release
216a0 20 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79   a shared-memory
216b0 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63   lock..*/.static
216c0 20 69 6e 74 20 72 62 75 56 66 73 53 68 6d 4c 6f   int rbuVfsShmLo
216d0 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
216e0 2a 70 46 69 6c 65 2c 20 69 6e 74 20 6f 66 73 74  *pFile, int ofst
216f0 2c 20 69 6e 74 20 6e 2c 20 69 6e 74 20 66 6c 61  , int n, int fla
21700 67 73 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20  gs){.  rbu_file 
21710 2a 70 20 3d 20 28 72 62 75 5f 66 69 6c 65 2a 29  *p = (rbu_file*)
21720 70 46 69 6c 65 3b 0a 20 20 73 71 6c 69 74 65 33  pFile;.  sqlite3
21730 72 62 75 20 2a 70 52 62 75 20 3d 20 70 2d 3e 70  rbu *pRbu = p->p
21740 52 62 75 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  Rbu;.  int rc = 
21750 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 23 69 66 64  SQLITE_OK;..#ifd
21760 65 66 20 53 51 4c 49 54 45 5f 41 4d 41 4c 47 41  ef SQLITE_AMALGA
21770 4d 41 54 49 4f 4e 0a 20 20 20 20 61 73 73 65 72  MATION.    asser
21780 74 28 20 57 41 4c 5f 43 4b 50 54 5f 4c 4f 43 4b  t( WAL_CKPT_LOCK
21790 3d 3d 31 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  ==1 );.#endif.. 
217a0 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 65 6e   assert( p->open
217b0 46 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f  Flags & (SQLITE_
217c0 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 7c 53 51 4c  OPEN_MAIN_DB|SQL
217d0 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42  ITE_OPEN_TEMP_DB
217e0 29 20 29 3b 0a 20 20 69 66 28 20 70 52 62 75 20  ) );.  if( pRbu 
217f0 26 26 20 28 70 52 62 75 2d 3e 65 53 74 61 67 65  && (pRbu->eStage
21800 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20  ==RBU_STAGE_OAL 
21810 7c 7c 20 70 52 62 75 2d 3e 65 53 74 61 67 65 3d  || pRbu->eStage=
21820 3d 52 42 55 5f 53 54 41 47 45 5f 4d 4f 56 45 29  =RBU_STAGE_MOVE)
21830 20 29 7b 0a 20 20 20 20 2f 2a 20 4d 61 67 69 63   ){.    /* Magic
21840 20 6e 75 6d 62 65 72 20 31 20 69 73 20 74 68 65   number 1 is the
21850 20 57 41 4c 5f 43 4b 50 54 5f 4c 4f 43 4b 20 6c   WAL_CKPT_LOCK l
21860 6f 63 6b 2e 20 50 72 65 76 65 6e 74 69 6e 67 20  ock. Preventing 
21870 53 51 4c 69 74 65 20 66 72 6f 6d 0a 20 20 20 20  SQLite from.    
21880 2a 2a 20 74 61 6b 69 6e 67 20 74 68 69 73 20 6c  ** taking this l
21890 6f 63 6b 20 61 6c 73 6f 20 70 72 65 76 65 6e 74  ock also prevent
218a0 73 20 61 6e 79 20 63 68 65 63 6b 70 6f 69 6e 74  s any checkpoint
218b0 73 20 66 72 6f 6d 20 6f 63 63 75 72 72 69 6e 67  s from occurring
218c0 2e 20 0a 20 20 20 20 2a 2a 20 74 6f 64 6f 3a 20  . .    ** todo: 
218d0 72 65 61 6c 6c 79 2c 20 69 74 27 73 20 6e 6f 74  really, it's not
218e0 20 63 6c 65 61 72 20 77 68 79 20 74 68 69 73 20   clear why this 
218f0 6d 69 67 68 74 20 6f 63 63 75 72 2c 20 61 73 20  might occur, as 
21900 0a 20 20 20 20 2a 2a 20 77 61 6c 5f 61 75 74 6f  .    ** wal_auto
21910 63 68 65 63 6b 70 6f 69 6e 74 20 6f 75 67 68 74  checkpoint ought
21920 20 74 6f 20 62 65 20 74 75 72 6e 65 64 20 6f 66   to be turned of
21930 66 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f  f.  */.    if( o
21940 66 73 74 3d 3d 57 41 4c 5f 4c 4f 43 4b 5f 43 4b  fst==WAL_LOCK_CK
21950 50 54 20 26 26 20 6e 3d 3d 31 20 29 20 72 63 20  PT && n==1 ) rc 
21960 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
21970 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
21980 62 43 61 70 74 75 72 65 20 3d 20 30 3b 0a 20 20  bCapture = 0;.  
21990 20 20 69 66 28 20 6e 3d 3d 31 20 26 26 20 28 66    if( n==1 && (f
219a0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48  lags & SQLITE_SH
219b0 4d 5f 45 58 43 4c 55 53 49 56 45 29 0a 20 20 20  M_EXCLUSIVE).   
219c0 20 20 26 26 20 70 52 62 75 20 26 26 20 70 52 62    && pRbu && pRb
219d0 75 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53  u->eStage==RBU_S
219e0 54 41 47 45 5f 43 41 50 54 55 52 45 0a 20 20 20  TAGE_CAPTURE.   
219f0 20 20 26 26 20 28 6f 66 73 74 3d 3d 57 41 4c 5f    && (ofst==WAL_
21a00 4c 4f 43 4b 5f 57 52 49 54 45 20 7c 7c 20 6f 66  LOCK_WRITE || of
21a10 73 74 3d 3d 57 41 4c 5f 4c 4f 43 4b 5f 43 4b 50  st==WAL_LOCK_CKP
21a20 54 20 7c 7c 20 6f 66 73 74 3d 3d 57 41 4c 5f 4c  T || ofst==WAL_L
21a30 4f 43 4b 5f 52 45 41 44 30 29 0a 20 20 20 20 29  OCK_READ0).    )
21a40 7b 0a 20 20 20 20 20 20 62 43 61 70 74 75 72 65  {.      bCapture
21a50 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 1;.    }..   
21a60 20 69 66 28 20 62 43 61 70 74 75 72 65 3d 3d 30   if( bCapture==0
21a70 20 7c 7c 20 30 3d 3d 28 66 6c 61 67 73 20 26 20   || 0==(flags & 
21a80 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43  SQLITE_SHM_UNLOC
21a90 4b 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  K) ){.      rc =
21aa0 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68   p->pReal->pMeth
21ab0 6f 64 73 2d 3e 78 53 68 6d 4c 6f 63 6b 28 70 2d  ods->xShmLock(p-
21ac0 3e 70 52 65 61 6c 2c 20 6f 66 73 74 2c 20 6e 2c  >pReal, ofst, n,
21ad0 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 69   flags);.      i
21ae0 66 28 20 62 43 61 70 74 75 72 65 20 26 26 20 72  f( bCapture && r
21af0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
21b00 20 20 20 20 20 20 20 20 70 52 62 75 2d 3e 6d 4c          pRbu->mL
21b10 6f 63 6b 20 7c 3d 20 28 31 20 3c 3c 20 6f 66 73  ock |= (1 << ofs
21b20 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
21b30 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
21b40 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 62 74  rc;.}../*.** Obt
21b50 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ain a pointer to
21b60 20 61 20 6d 61 70 70 69 6e 67 20 6f 66 20 61 20   a mapping of a 
21b70 73 69 6e 67 6c 65 20 33 32 4b 69 42 20 70 61 67  single 32KiB pag
21b80 65 20 6f 66 20 74 68 65 20 2a 2d 73 68 6d 20 66  e of the *-shm f
21b90 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
21ba0 6e 74 20 72 62 75 56 66 73 53 68 6d 4d 61 70 28  nt rbuVfsShmMap(
21bb0 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
21bc0 2a 70 46 69 6c 65 2c 20 0a 20 20 69 6e 74 20 69  *pFile, .  int i
21bd0 52 65 67 69 6f 6e 2c 20 0a 20 20 69 6e 74 20 73  Region, .  int s
21be0 7a 52 65 67 69 6f 6e 2c 20 0a 20 20 69 6e 74 20  zRegion, .  int 
21bf0 69 73 57 72 69 74 65 2c 20 0a 20 20 76 6f 69 64  isWrite, .  void
21c00 20 76 6f 6c 61 74 69 6c 65 20 2a 2a 70 70 0a 29   volatile **pp.)
21c10 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 20  {.  rbu_file *p 
21c20 3d 20 28 72 62 75 5f 66 69 6c 65 2a 29 70 46 69  = (rbu_file*)pFi
21c30 6c 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  le;.  int rc = S
21c40 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
21c50 65 53 74 61 67 65 20 3d 20 28 70 2d 3e 70 52 62  eStage = (p->pRb
21c60 75 20 3f 20 70 2d 3e 70 52 62 75 2d 3e 65 53 74  u ? p->pRbu->eSt
21c70 61 67 65 20 3a 20 30 29 3b 0a 0a 20 20 2f 2a 20  age : 0);..  /* 
21c80 49 66 20 6e 6f 74 20 69 6e 20 52 42 55 5f 53 54  If not in RBU_ST
21c90 41 47 45 5f 4f 41 4c 2c 20 61 6c 6c 6f 77 20 74  AGE_OAL, allow t
21ca0 68 69 73 20 63 61 6c 6c 20 74 6f 20 70 61 73 73  his call to pass
21cb0 20 74 68 72 6f 75 67 68 2e 20 4f 72 2c 20 69 66   through. Or, if
21cc0 20 74 68 69 73 0a 20 20 2a 2a 20 72 62 75 20 69   this.  ** rbu i
21cd0 73 20 69 6e 20 74 68 65 20 52 42 55 5f 53 54 41  s in the RBU_STA
21ce0 47 45 5f 4f 41 4c 20 73 74 61 74 65 2c 20 75 73  GE_OAL state, us
21cf0 65 20 68 65 61 70 20 6d 65 6d 6f 72 79 20 66 6f  e heap memory fo
21d00 72 20 2a 2d 73 68 6d 20 73 70 61 63 65 20 0a 20  r *-shm space . 
21d10 20 2a 2a 20 69 6e 73 74 65 61 64 20 6f 66 20 61   ** instead of a
21d20 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 20   file on disk.  
21d30 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
21d40 6f 70 65 6e 46 6c 61 67 73 20 26 20 28 53 51 4c  openFlags & (SQL
21d50 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
21d60 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d  |SQLITE_OPEN_TEM
21d70 50 5f 44 42 29 20 29 3b 0a 20 20 69 66 28 20 65  P_DB) );.  if( e
21d80 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45  Stage==RBU_STAGE
21d90 5f 4f 41 4c 20 7c 7c 20 65 53 74 61 67 65 3d 3d  _OAL || eStage==
21da0 52 42 55 5f 53 54 41 47 45 5f 4d 4f 56 45 20 29  RBU_STAGE_MOVE )
21db0 7b 0a 20 20 20 20 69 66 28 20 69 52 65 67 69 6f  {.    if( iRegio
21dc0 6e 3c 3d 70 2d 3e 6e 53 68 6d 20 29 7b 0a 20 20  n<=p->nShm ){.  
21dd0 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20      int nByte = 
21de0 28 69 52 65 67 69 6f 6e 2b 31 29 20 2a 20 73 69  (iRegion+1) * si
21df0 7a 65 6f 66 28 63 68 61 72 2a 29 3b 0a 20 20 20  zeof(char*);.   
21e00 20 20 20 63 68 61 72 20 2a 2a 61 70 4e 65 77 20     char **apNew 
21e10 3d 20 28 63 68 61 72 2a 2a 29 73 71 6c 69 74 65  = (char**)sqlite
21e20 33 5f 72 65 61 6c 6c 6f 63 36 34 28 70 2d 3e 61  3_realloc64(p->a
21e30 70 53 68 6d 2c 20 6e 42 79 74 65 29 3b 0a 20 20  pShm, nByte);.  
21e40 20 20 20 20 69 66 28 20 61 70 4e 65 77 3d 3d 30      if( apNew==0
21e50 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
21e60 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
21e70 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
21e80 20 20 20 20 6d 65 6d 73 65 74 28 26 61 70 4e 65      memset(&apNe
21e90 77 5b 70 2d 3e 6e 53 68 6d 5d 2c 20 30 2c 20 73  w[p->nShm], 0, s
21ea0 69 7a 65 6f 66 28 63 68 61 72 2a 29 20 2a 20 28  izeof(char*) * (
21eb0 31 20 2b 20 69 52 65 67 69 6f 6e 20 2d 20 70 2d  1 + iRegion - p-
21ec0 3e 6e 53 68 6d 29 29 3b 0a 20 20 20 20 20 20 20  >nShm));.       
21ed0 20 70 2d 3e 61 70 53 68 6d 20 3d 20 61 70 4e 65   p->apShm = apNe
21ee0 77 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 53  w;.        p->nS
21ef0 68 6d 20 3d 20 69 52 65 67 69 6f 6e 2b 31 3b 0a  hm = iRegion+1;.
21f00 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
21f10 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
21f20 45 5f 4f 4b 20 26 26 20 70 2d 3e 61 70 53 68 6d  E_OK && p->apShm
21f30 5b 69 52 65 67 69 6f 6e 5d 3d 3d 30 20 29 7b 0a  [iRegion]==0 ){.
21f40 20 20 20 20 20 20 63 68 61 72 20 2a 70 4e 65 77        char *pNew
21f50 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65   = (char*)sqlite
21f60 33 5f 6d 61 6c 6c 6f 63 36 34 28 73 7a 52 65 67  3_malloc64(szReg
21f70 69 6f 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ion);.      if( 
21f80 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pNew==0 ){.     
21f90 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
21fa0 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73  OMEM;.      }els
21fb0 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  e{.        memse
21fc0 74 28 70 4e 65 77 2c 20 30 2c 20 73 7a 52 65 67  t(pNew, 0, szReg
21fd0 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  ion);.        p-
21fe0 3e 61 70 53 68 6d 5b 69 52 65 67 69 6f 6e 5d 20  >apShm[iRegion] 
21ff0 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 7d 0a  = pNew;.      }.
22000 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72      }..    if( r
22010 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
22020 20 20 20 20 20 20 2a 70 70 20 3d 20 70 2d 3e 61        *pp = p->a
22030 70 53 68 6d 5b 69 52 65 67 69 6f 6e 5d 3b 0a 20  pShm[iRegion];. 
22040 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
22050 2a 70 70 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  *pp = 0;.    }. 
22060 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
22070 72 74 28 20 70 2d 3e 61 70 53 68 6d 3d 3d 30 20  rt( p->apShm==0 
22080 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 2d 3e 70  );.    rc = p->p
22090 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e  Real->pMethods->
220a0 78 53 68 6d 4d 61 70 28 70 2d 3e 70 52 65 61 6c  xShmMap(p->pReal
220b0 2c 20 69 52 65 67 69 6f 6e 2c 20 73 7a 52 65 67  , iRegion, szReg
220c0 69 6f 6e 2c 20 69 73 57 72 69 74 65 2c 20 70 70  ion, isWrite, pp
220d0 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
220e0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65   rc;.}../*.** Me
220f0 6d 6f 72 79 20 62 61 72 72 69 65 72 2e 0a 2a 2f  mory barrier..*/
22100 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75  .static void rbu
22110 56 66 73 53 68 6d 42 61 72 72 69 65 72 28 73 71  VfsShmBarrier(sq
22120 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
22130 65 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a  e){.  rbu_file *
22140 70 20 3d 20 28 72 62 75 5f 66 69 6c 65 20 2a 29  p = (rbu_file *)
22150 70 46 69 6c 65 3b 0a 20 20 70 2d 3e 70 52 65 61  pFile;.  p->pRea
22160 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53 68  l->pMethods->xSh
22170 6d 42 61 72 72 69 65 72 28 70 2d 3e 70 52 65 61  mBarrier(p->pRea
22180 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  l);.}../*.** The
22190 20 78 53 68 6d 55 6e 6d 61 70 20 6d 65 74 68 6f   xShmUnmap metho
221a0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
221b0 20 72 62 75 56 66 73 53 68 6d 55 6e 6d 61 70 28   rbuVfsShmUnmap(
221c0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
221d0 69 6c 65 2c 20 69 6e 74 20 64 65 6c 46 6c 61 67  ile, int delFlag
221e0 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a 70  ){.  rbu_file *p
221f0 20 3d 20 28 72 62 75 5f 66 69 6c 65 2a 29 70 46   = (rbu_file*)pF
22200 69 6c 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ile;.  int rc = 
22210 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
22220 20 65 53 74 61 67 65 20 3d 20 28 70 2d 3e 70 52   eStage = (p->pR
22230 62 75 20 3f 20 70 2d 3e 70 52 62 75 2d 3e 65 53  bu ? p->pRbu->eS
22240 74 61 67 65 20 3a 20 30 29 3b 0a 0a 20 20 61 73  tage : 0);..  as
22250 73 65 72 74 28 20 70 2d 3e 6f 70 65 6e 46 6c 61  sert( p->openFla
22260 67 73 20 26 20 28 53 51 4c 49 54 45 5f 4f 50 45  gs & (SQLITE_OPE
22270 4e 5f 4d 41 49 4e 5f 44 42 7c 53 51 4c 49 54 45  N_MAIN_DB|SQLITE
22280 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 29 20 29  _OPEN_TEMP_DB) )
22290 3b 0a 20 20 69 66 28 20 65 53 74 61 67 65 3d 3d  ;.  if( eStage==
222a0 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20 7c 7c  RBU_STAGE_OAL ||
222b0 20 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41   eStage==RBU_STA
222c0 47 45 5f 4d 4f 56 45 20 29 7b 0a 20 20 20 20 2f  GE_MOVE ){.    /
222d0 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 7d 65 6c  * no-op */.  }el
222e0 73 65 7b 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61  se{.    /* Relea
222f0 73 65 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e  se the checkpoin
22300 74 65 72 20 61 6e 64 20 77 72 69 74 65 72 20 6c  ter and writer l
22310 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 72 62 75 55  ocks */.    rbuU
22320 6e 6c 6f 63 6b 53 68 6d 28 70 29 3b 0a 20 20 20  nlockShm(p);.   
22330 20 72 63 20 3d 20 70 2d 3e 70 52 65 61 6c 2d 3e   rc = p->pReal->
22340 70 4d 65 74 68 6f 64 73 2d 3e 78 53 68 6d 55 6e  pMethods->xShmUn
22350 6d 61 70 28 70 2d 3e 70 52 65 61 6c 2c 20 64 65  map(p->pReal, de
22360 6c 46 6c 61 67 29 3b 0a 20 20 7d 0a 20 20 72 65  lFlag);.  }.  re
22370 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
22380 2a 20 47 69 76 65 6e 20 74 68 61 74 20 7a 57 61  * Given that zWa
22390 6c 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 62 75  l points to a bu
223a0 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
223b0 61 20 77 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  a wal file name 
223c0 70 61 73 73 65 64 20 74 6f 20 0a 2a 2a 20 65 69  passed to .** ei
223d0 74 68 65 72 20 74 68 65 20 78 4f 70 65 6e 28 29  ther the xOpen()
223e0 20 6f 72 20 78 41 63 63 65 73 73 28 29 20 56 46   or xAccess() VF
223f0 53 20 6d 65 74 68 6f 64 2c 20 72 65 74 75 72 6e  S method, return
22400 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
22410 65 0a 2a 2a 20 66 69 6c 65 2d 68 61 6e 64 6c 65  e.** file-handle
22420 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20 73   opened by the s
22430 61 6d 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  ame database con
22440 6e 65 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 63  nection on the c
22450 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20  orresponding.** 
22460 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
22470 2f 0a 73 74 61 74 69 63 20 72 62 75 5f 66 69 6c  /.static rbu_fil
22480 65 20 2a 72 62 75 46 69 6e 64 4d 61 69 6e 64 62  e *rbuFindMaindb
22490 28 72 62 75 5f 76 66 73 20 2a 70 52 62 75 56 66  (rbu_vfs *pRbuVf
224a0 73 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  s, const char *z
224b0 57 61 6c 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65  Wal){.  rbu_file
224c0 20 2a 70 44 62 3b 0a 20 20 73 71 6c 69 74 65 33   *pDb;.  sqlite3
224d0 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 52 62  _mutex_enter(pRb
224e0 75 56 66 73 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  uVfs->mutex);.  
224f0 66 6f 72 28 70 44 62 3d 70 52 62 75 56 66 73 2d  for(pDb=pRbuVfs-
22500 3e 70 4d 61 69 6e 3b 20 70 44 62 20 26 26 20 70  >pMain; pDb && p
22510 44 62 2d 3e 7a 57 61 6c 21 3d 7a 57 61 6c 3b 20  Db->zWal!=zWal; 
22520 70 44 62 3d 70 44 62 2d 3e 70 4d 61 69 6e 4e 65  pDb=pDb->pMainNe
22530 78 74 29 7b 7d 0a 20 20 73 71 6c 69 74 65 33 5f  xt){}.  sqlite3_
22540 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 52 62 75  mutex_leave(pRbu
22550 56 66 73 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  Vfs->mutex);.  r
22560 65 74 75 72 6e 20 70 44 62 3b 0a 7d 0a 0a 2f 2a  eturn pDb;.}../*
22570 20 0a 2a 2a 20 41 20 6d 61 69 6e 20 64 61 74 61   .** A main data
22580 62 61 73 65 20 6e 61 6d 65 64 20 7a 4e 61 6d 65  base named zName
22590 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 6f   has just been o
225a0 70 65 6e 65 64 2e 20 54 68 65 20 66 6f 6c 6c 6f  pened. The follo
225b0 77 69 6e 67 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  wing .** functio
225c0 6e 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e  n returns a poin
225d0 74 65 72 20 74 6f 20 61 20 62 75 66 66 65 72 20  ter to a buffer 
225e0 6f 77 6e 65 64 20 62 79 20 53 51 4c 69 74 65 20  owned by SQLite 
225f0 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  that contains.**
22600 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
22610 20 2a 2d 77 61 6c 20 66 69 6c 65 20 74 68 69 73   *-wal file this
22620 20 64 62 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77   db connection w
22630 69 6c 6c 20 75 73 65 2e 20 53 51 4c 69 74 65 0a  ill use. SQLite.
22640 2a 2a 20 68 61 70 70 65 6e 73 20 74 6f 20 70 61  ** happens to pa
22650 73 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ss a pointer to 
22660 74 68 69 73 20 62 75 66 66 65 72 20 77 68 65 6e  this buffer when
22670 20 75 73 69 6e 67 20 78 41 63 63 65 73 73 28 29   using xAccess()
22680 0a 2a 2a 20 6f 72 20 78 4f 70 65 6e 28 29 20 74  .** or xOpen() t
22690 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65  o operate on the
226a0 20 2a 2d 77 61 6c 20 66 69 6c 65 2e 20 20 0a 2a   *-wal file.  .*
226b0 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  /.static const c
226c0 68 61 72 20 2a 72 62 75 4d 61 69 6e 54 6f 57 61  har *rbuMainToWa
226d0 6c 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  l(const char *zN
226e0 61 6d 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  ame, int flags){
226f0 0a 20 20 69 6e 74 20 6e 20 3d 20 28 69 6e 74 29  .  int n = (int)
22700 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20  strlen(zName);. 
22710 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
22720 20 26 7a 4e 61 6d 65 5b 6e 5d 3b 0a 20 20 69 66   &zName[n];.  if
22730 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ( flags & SQLITE
22740 5f 4f 50 45 4e 5f 55 52 49 20 29 7b 0a 20 20 20  _OPEN_URI ){.   
22750 20 69 6e 74 20 6f 64 64 20 3d 20 30 3b 0a 20 20   int odd = 0;.  
22760 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20    while( 1 ){.  
22770 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 30 20      if( z[0]==0 
22780 29 7b 0a 20 20 20 20 20 20 20 20 6f 64 64 20 3d  ){.        odd =
22790 20 31 20 2d 20 6f 64 64 3b 0a 20 20 20 20 20 20   1 - odd;.      
227a0 20 20 69 66 28 20 6f 64 64 20 26 26 20 7a 5b 31    if( odd && z[1
227b0 5d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  ]==0 ) break;.  
227c0 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 2b 2b 3b      }.      z++;
227d0 0a 20 20 20 20 7d 0a 20 20 20 20 7a 20 2b 3d 20  .    }.    z += 
227e0 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  2;.  }else{.    
227f0 77 68 69 6c 65 28 20 2a 7a 3d 3d 30 20 29 20 7a  while( *z==0 ) z
22800 2b 2b 3b 0a 20 20 7d 0a 20 20 7a 20 2b 3d 20 28  ++;.  }.  z += (
22810 6e 20 2b 20 38 20 2b 20 31 29 3b 0a 20 20 72 65  n + 8 + 1);.  re
22820 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn z;.}../*.**
22830 20 4f 70 65 6e 20 61 6e 20 72 62 75 20 66 69 6c   Open an rbu fil
22840 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61  e handle..*/.sta
22850 74 69 63 20 69 6e 74 20 72 62 75 56 66 73 4f 70  tic int rbuVfsOp
22860 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  en(.  sqlite3_vf
22870 73 20 2a 70 56 66 73 2c 0a 20 20 63 6f 6e 73 74  s *pVfs,.  const
22880 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20   char *zName,.  
22890 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
228a0 69 6c 65 2c 0a 20 20 69 6e 74 20 66 6c 61 67 73  ile,.  int flags
228b0 2c 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46 6c 61  ,.  int *pOutFla
228c0 67 73 0a 29 7b 0a 20 20 73 74 61 74 69 63 20 73  gs.){.  static s
228d0 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
228e0 73 20 72 62 75 76 66 73 5f 69 6f 5f 6d 65 74 68  s rbuvfs_io_meth
228f0 6f 64 73 20 3d 20 7b 0a 20 20 20 20 32 2c 20 20  ods = {.    2,  
22900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22910 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65            /* iVe
22920 72 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 72 62 75  rsion */.    rbu
22930 56 66 73 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  VfsClose,       
22940 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
22950 6c 6f 73 65 20 2a 2f 0a 20 20 20 20 72 62 75 56  lose */.    rbuV
22960 66 73 52 65 61 64 2c 20 20 20 20 20 20 20 20 20  fsRead,         
22970 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65            /* xRe
22980 61 64 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73  ad */.    rbuVfs
22990 57 72 69 74 65 2c 20 20 20 20 20 20 20 20 20 20  Write,          
229a0 20 20 20 20 20 20 20 20 2f 2a 20 78 57 72 69 74          /* xWrit
229b0 65 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 54  e */.    rbuVfsT
229c0 72 75 6e 63 61 74 65 2c 20 20 20 20 20 20 20 20  runcate,        
229d0 20 20 20 20 20 20 20 2f 2a 20 78 54 72 75 6e 63         /* xTrunc
229e0 61 74 65 20 2a 2f 0a 20 20 20 20 72 62 75 56 66  ate */.    rbuVf
229f0 73 53 79 6e 63 2c 20 20 20 20 20 20 20 20 20 20  sSync,          
22a00 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 79 6e           /* xSyn
22a10 63 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 46  c */.    rbuVfsF
22a20 69 6c 65 53 69 7a 65 2c 20 20 20 20 20 20 20 20  ileSize,        
22a30 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 53         /* xFileS
22a40 69 7a 65 20 2a 2f 0a 20 20 20 20 72 62 75 56 66  ize */.    rbuVf
22a50 73 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  sLock,          
22a60 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63           /* xLoc
22a70 6b 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 55  k */.    rbuVfsU
22a80 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  nlock,          
22a90 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
22aa0 6b 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 43  k */.    rbuVfsC
22ab0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
22ac0 2c 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b  ,      /* xCheck
22ad0 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 2a 2f 0a  ReservedLock */.
22ae0 20 20 20 20 72 62 75 56 66 73 46 69 6c 65 43 6f      rbuVfsFileCo
22af0 6e 74 72 6f 6c 2c 20 20 20 20 20 20 20 20 20 20  ntrol,          
22b00 20 20 2f 2a 20 78 46 69 6c 65 43 6f 6e 74 72 6f    /* xFileContro
22b10 6c 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 53  l */.    rbuVfsS
22b20 65 63 74 6f 72 53 69 7a 65 2c 20 20 20 20 20 20  ectorSize,      
22b30 20 20 20 20 20 20 20 2f 2a 20 78 53 65 63 74 6f         /* xSecto
22b40 72 53 69 7a 65 20 2a 2f 0a 20 20 20 20 72 62 75  rSize */.    rbu
22b50 56 66 73 44 65 76 69 63 65 43 68 61 72 61 63 74  VfsDeviceCharact
22b60 65 72 69 73 74 69 63 73 2c 20 20 2f 2a 20 78 44  eristics,  /* xD
22b70 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
22b80 74 69 63 73 20 2a 2f 0a 20 20 20 20 72 62 75 56  tics */.    rbuV
22b90 66 73 53 68 6d 4d 61 70 2c 20 20 20 20 20 20 20  fsShmMap,       
22ba0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
22bb0 6d 4d 61 70 20 2a 2f 0a 20 20 20 20 72 62 75 56  mMap */.    rbuV
22bc0 66 73 53 68 6d 4c 6f 63 6b 2c 20 20 20 20 20 20  fsShmLock,      
22bd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
22be0 6d 4c 6f 63 6b 20 2a 2f 0a 20 20 20 20 72 62 75  mLock */.    rbu
22bf0 56 66 73 53 68 6d 42 61 72 72 69 65 72 2c 20 20  VfsShmBarrier,  
22c00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
22c10 68 6d 42 61 72 72 69 65 72 20 2a 2f 0a 20 20 20  hmBarrier */.   
22c20 20 72 62 75 56 66 73 53 68 6d 55 6e 6d 61 70 2c   rbuVfsShmUnmap,
22c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22c40 2a 20 78 53 68 6d 55 6e 6d 61 70 20 2a 2f 0a 20  * xShmUnmap */. 
22c50 20 20 20 30 2c 20 30 20 20 20 20 20 20 20 20 20     0, 0         
22c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c70 20 2f 2a 20 78 46 65 74 63 68 2c 20 78 55 6e 66   /* xFetch, xUnf
22c80 65 74 63 68 20 2a 2f 0a 20 20 7d 3b 0a 20 20 72  etch */.  };.  r
22c90 62 75 5f 76 66 73 20 2a 70 52 62 75 56 66 73 20  bu_vfs *pRbuVfs 
22ca0 3d 20 28 72 62 75 5f 76 66 73 2a 29 70 56 66 73  = (rbu_vfs*)pVfs
22cb0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  ;.  sqlite3_vfs 
22cc0 2a 70 52 65 61 6c 56 66 73 20 3d 20 70 52 62 75  *pRealVfs = pRbu
22cd0 56 66 73 2d 3e 70 52 65 61 6c 56 66 73 3b 0a 20  Vfs->pRealVfs;. 
22ce0 20 72 62 75 5f 66 69 6c 65 20 2a 70 46 64 20 3d   rbu_file *pFd =
22cf0 20 28 72 62 75 5f 66 69 6c 65 20 2a 29 70 46 69   (rbu_file *)pFi
22d00 6c 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  le;.  int rc = S
22d10 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63 6f 6e 73  QLITE_OK;.  cons
22d20 74 20 63 68 61 72 20 2a 7a 4f 70 65 6e 20 3d 20  t char *zOpen = 
22d30 7a 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 6f 66 6c  zName;.  int ofl
22d40 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 0a 20 20  ags = flags;..  
22d50 6d 65 6d 73 65 74 28 70 46 64 2c 20 30 2c 20 73  memset(pFd, 0, s
22d60 69 7a 65 6f 66 28 72 62 75 5f 66 69 6c 65 29 29  izeof(rbu_file))
22d70 3b 0a 20 20 70 46 64 2d 3e 70 52 65 61 6c 20 3d  ;.  pFd->pReal =
22d80 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29   (sqlite3_file*)
22d90 26 70 46 64 5b 31 5d 3b 0a 20 20 70 46 64 2d 3e  &pFd[1];.  pFd->
22da0 70 52 62 75 56 66 73 20 3d 20 70 52 62 75 56 66  pRbuVfs = pRbuVf
22db0 73 3b 0a 20 20 70 46 64 2d 3e 6f 70 65 6e 46 6c  s;.  pFd->openFl
22dc0 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 69  ags = flags;.  i
22dd0 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  f( zName ){.    
22de0 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49  if( flags & SQLI
22df0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20  TE_OPEN_MAIN_DB 
22e00 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 6d 61  ){.      /* A ma
22e10 69 6e 20 64 61 74 61 62 61 73 65 20 68 61 73 20  in database has 
22e20 6a 75 73 74 20 62 65 65 6e 20 6f 70 65 6e 65 64  just been opened
22e30 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  . The following 
22e40 62 6c 6f 63 6b 20 73 65 74 73 0a 20 20 20 20 20  block sets.     
22e50 20 2a 2a 20 28 70 46 64 2d 3e 7a 57 61 6c 29 20   ** (pFd->zWal) 
22e60 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75  to point to a bu
22e70 66 66 65 72 20 6f 77 6e 65 64 20 62 79 20 53 51  ffer owned by SQ
22e80 4c 69 74 65 20 74 68 61 74 20 63 6f 6e 74 61 69  Lite that contai
22e90 6e 73 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  ns.      ** the 
22ea0 6e 61 6d 65 20 6f 66 20 74 68 65 20 2a 2d 77 61  name of the *-wa
22eb0 6c 20 66 69 6c 65 20 74 68 69 73 20 64 62 20 63  l file this db c
22ec0 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 6c 6c 20 75  onnection will u
22ed0 73 65 2e 20 53 51 4c 69 74 65 0a 20 20 20 20 20  se. SQLite.     
22ee0 20 2a 2a 20 68 61 70 70 65 6e 73 20 74 6f 20 70   ** happens to p
22ef0 61 73 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ass a pointer to
22f00 20 74 68 69 73 20 62 75 66 66 65 72 20 77 68 65   this buffer whe
22f10 6e 20 75 73 69 6e 67 20 78 41 63 63 65 73 73 28  n using xAccess(
22f20 29 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 78 4f  ).      ** or xO
22f30 70 65 6e 28 29 20 74 6f 20 6f 70 65 72 61 74 65  pen() to operate
22f40 20 6f 6e 20 74 68 65 20 2a 2d 77 61 6c 20 66 69   on the *-wal fi
22f50 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 70 46  le.  */.      pF
22f60 64 2d 3e 7a 57 61 6c 20 3d 20 72 62 75 4d 61 69  d->zWal = rbuMai
22f70 6e 54 6f 57 61 6c 28 7a 4e 61 6d 65 2c 20 66 6c  nToWal(zName, fl
22f80 61 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ags);.    }.    
22f90 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26  else if( flags &
22fa0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c   SQLITE_OPEN_WAL
22fb0 20 29 7b 0a 20 20 20 20 20 20 72 62 75 5f 66 69   ){.      rbu_fi
22fc0 6c 65 20 2a 70 44 62 20 3d 20 72 62 75 46 69 6e  le *pDb = rbuFin
22fd0 64 4d 61 69 6e 64 62 28 70 52 62 75 56 66 73 2c  dMaindb(pRbuVfs,
22fe0 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69   zName);.      i
22ff0 66 28 20 70 44 62 20 29 7b 0a 20 20 20 20 20 20  f( pDb ){.      
23000 20 20 69 66 28 20 70 44 62 2d 3e 70 52 62 75 20    if( pDb->pRbu 
23010 26 26 20 70 44 62 2d 3e 70 52 62 75 2d 3e 65 53  && pDb->pRbu->eS
23020 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f  tage==RBU_STAGE_
23030 4f 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  OAL ){.         
23040 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 69 73   /* This call is
23050 20 74 6f 20 6f 70 65 6e 20 61 20 2a 2d 77 61 6c   to open a *-wal
23060 20 66 69 6c 65 2e 20 49 6e 74 65 61 64 2c 20 6f   file. Intead, o
23070 70 65 6e 20 74 68 65 20 2a 2d 6f 61 6c 2e 20 54  pen the *-oal. T
23080 68 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  his.          **
23090 20 63 6f 64 65 20 65 6e 73 75 72 65 73 20 74 68   code ensures th
230a0 61 74 20 74 68 65 20 73 74 72 69 6e 67 20 70 61  at the string pa
230b0 73 73 65 64 20 74 6f 20 78 4f 70 65 6e 28 29 20  ssed to xOpen() 
230c0 69 73 20 74 65 72 6d 69 6e 61 74 65 64 20 62 79  is terminated by
230d0 20 61 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20   a.          ** 
230e0 70 61 69 72 20 6f 66 20 27 5c 30 27 20 62 79 74  pair of '\0' byt
230f0 65 73 20 69 6e 20 63 61 73 65 20 74 68 65 20 56  es in case the V
23100 46 53 20 61 74 74 65 6d 70 74 73 20 74 6f 20 65  FS attempts to e
23110 78 74 72 61 63 74 20 61 20 55 52 49 20 0a 20 20  xtract a URI .  
23120 20 20 20 20 20 20 20 20 2a 2a 20 70 61 72 61 6d          ** param
23130 65 74 65 72 20 66 72 6f 6d 20 69 74 2e 20 20 2a  eter from it.  *
23140 2f 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73  /.          cons
23150 74 20 63 68 61 72 20 2a 7a 42 61 73 65 20 3d 20  t char *zBase = 
23160 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  zName;.         
23170 20 73 69 7a 65 5f 74 20 6e 43 6f 70 79 3b 0a 20   size_t nCopy;. 
23180 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
23190 43 6f 70 79 3b 0a 20 20 20 20 20 20 20 20 20 20  Copy;.          
231a0 69 66 28 20 72 62 75 49 73 56 61 63 75 75 6d 28  if( rbuIsVacuum(
231b0 70 44 62 2d 3e 70 52 62 75 29 20 29 7b 0a 20 20  pDb->pRbu) ){.  
231c0 20 20 20 20 20 20 20 20 20 20 7a 42 61 73 65 20            zBase 
231d0 3d 20 73 71 6c 69 74 65 33 5f 64 62 5f 66 69 6c  = sqlite3_db_fil
231e0 65 6e 61 6d 65 28 70 44 62 2d 3e 70 52 62 75 2d  ename(pDb->pRbu-
231f0 3e 64 62 52 62 75 2c 20 22 6d 61 69 6e 22 29 3b  >dbRbu, "main");
23200 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 42 61  .            zBa
23210 73 65 20 3d 20 72 62 75 4d 61 69 6e 54 6f 57 61  se = rbuMainToWa
23220 6c 28 7a 42 61 73 65 2c 20 53 51 4c 49 54 45 5f  l(zBase, SQLITE_
23230 4f 50 45 4e 5f 55 52 49 29 3b 0a 20 20 20 20 20  OPEN_URI);.     
23240 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
23250 20 6e 43 6f 70 79 20 3d 20 73 74 72 6c 65 6e 28   nCopy = strlen(
23260 7a 42 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20  zBase);.        
23270 20 20 7a 43 6f 70 79 20 3d 20 73 71 6c 69 74 65    zCopy = sqlite
23280 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 43 6f 70 79  3_malloc64(nCopy
23290 2b 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  +2);.          i
232a0 66 28 20 7a 43 6f 70 79 20 29 7b 0a 20 20 20 20  f( zCopy ){.    
232b0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a          memcpy(z
232c0 43 6f 70 79 2c 20 7a 42 61 73 65 2c 20 6e 43 6f  Copy, zBase, nCo
232d0 70 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  py);.           
232e0 20 7a 43 6f 70 79 5b 6e 43 6f 70 79 2d 33 5d 20   zCopy[nCopy-3] 
232f0 3d 20 27 6f 27 3b 0a 20 20 20 20 20 20 20 20 20  = 'o';.         
23300 20 20 20 7a 43 6f 70 79 5b 6e 43 6f 70 79 5d 20     zCopy[nCopy] 
23310 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20  = '\0';.        
23320 20 20 20 20 7a 43 6f 70 79 5b 6e 43 6f 70 79 2b      zCopy[nCopy+
23330 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20  1] = '\0';.     
23340 20 20 20 20 20 20 20 7a 4f 70 65 6e 20 3d 20 28         zOpen = (
23350 63 6f 6e 73 74 20 63 68 61 72 2a 29 28 70 46 64  const char*)(pFd
23360 2d 3e 7a 44 65 6c 20 3d 20 7a 43 6f 70 79 29 3b  ->zDel = zCopy);
23370 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
23380 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
23390 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
233a0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
233b0 20 20 20 20 20 20 20 70 46 64 2d 3e 70 52 62 75         pFd->pRbu
233c0 20 3d 20 70 44 62 2d 3e 70 52 62 75 3b 0a 20 20   = pDb->pRbu;.  
233d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
233e0 70 44 62 2d 3e 70 57 61 6c 46 64 20 3d 20 70 46  pDb->pWalFd = pF
233f0 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  d;.      }.    }
23400 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6f 66 6c 61  .  }..  if( ofla
23410 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
23420 5f 4d 41 49 4e 5f 44 42 20 0a 20 20 20 26 26 20  _MAIN_DB .   && 
23430 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c  sqlite3_uri_bool
23440 65 61 6e 28 7a 4e 61 6d 65 2c 20 22 72 62 75 5f  ean(zName, "rbu_
23450 6d 65 6d 6f 72 79 22 2c 20 30 29 20 0a 20 20 29  memory", 0) .  )
23460 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 66  {.    assert( of
23470 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
23480 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 3b 0a 20 20  EN_MAIN_DB );.  
23490 20 20 6f 66 6c 61 67 73 20 3d 20 20 53 51 4c 49    oflags =  SQLI
234a0 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20  TE_OPEN_TEMP_DB 
234b0 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  | SQLITE_OPEN_RE
234c0 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45  ADWRITE | SQLITE
234d0 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20  _OPEN_CREATE |. 
234e0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
234f0 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49  ITE_OPEN_EXCLUSI
23500 56 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  VE | SQLITE_OPEN
23510 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a  _DELETEONCLOSE;.
23520 20 20 20 20 7a 4f 70 65 6e 20 3d 20 30 3b 0a 20      zOpen = 0;. 
23530 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   }..  if( rc==SQ
23540 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
23550 63 20 3d 20 70 52 65 61 6c 56 66 73 2d 3e 78 4f  c = pRealVfs->xO
23560 70 65 6e 28 70 52 65 61 6c 56 66 73 2c 20 7a 4f  pen(pRealVfs, zO
23570 70 65 6e 2c 20 70 46 64 2d 3e 70 52 65 61 6c 2c  pen, pFd->pReal,
23580 20 6f 66 6c 61 67 73 2c 20 70 4f 75 74 46 6c 61   oflags, pOutFla
23590 67 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  gs);.  }.  if( p
235a0 46 64 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68  Fd->pReal->pMeth
235b0 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ods ){.    /* Th
235c0 65 20 78 4f 70 65 6e 28 29 20 6f 70 65 72 61 74  e xOpen() operat
235d0 69 6f 6e 20 68 61 73 20 73 75 63 63 65 65 64 65  ion has succeede
235e0 64 2e 20 53 65 74 20 74 68 65 20 73 71 6c 69 74  d. Set the sqlit
235f0 65 33 5f 66 69 6c 65 2e 70 4d 65 74 68 6f 64 73  e3_file.pMethods
23600 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20  .    ** pointer 
23610 61 6e 64 2c 20 69 66 20 74 68 65 20 66 69 6c 65  and, if the file
23620 20 69 73 20 61 20 6d 61 69 6e 20 64 61 74 61 62   is a main datab
23630 61 73 65 20 66 69 6c 65 2c 20 6c 69 6e 6b 20 69  ase file, link i
23640 74 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 2a  t into the.    *
23650 2a 20 6d 75 74 65 78 20 70 72 6f 74 65 63 74 65  * mutex protecte
23660 64 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  d linked list of
23670 20 61 6c 6c 20 73 75 63 68 20 66 69 6c 65 73 2e   all such files.
23680 20 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e    */.    pFile->
23690 70 4d 65 74 68 6f 64 73 20 3d 20 26 72 62 75 76  pMethods = &rbuv
236a0 66 73 5f 69 6f 5f 6d 65 74 68 6f 64 73 3b 0a 20  fs_io_methods;. 
236b0 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 53     if( flags & S
236c0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
236d0 44 42 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  DB ){.      sqli
236e0 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
236f0 70 52 62 75 56 66 73 2d 3e 6d 75 74 65 78 29 3b  pRbuVfs->mutex);
23700 0a 20 20 20 20 20 20 70 46 64 2d 3e 70 4d 61 69  .      pFd->pMai
23710 6e 4e 65 78 74 20 3d 20 70 52 62 75 56 66 73 2d  nNext = pRbuVfs-
23720 3e 70 4d 61 69 6e 3b 0a 20 20 20 20 20 20 70 52  >pMain;.      pR
23730 62 75 56 66 73 2d 3e 70 4d 61 69 6e 20 3d 20 70  buVfs->pMain = p
23740 46 64 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  Fd;.      sqlite
23750 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 52  3_mutex_leave(pR
23760 62 75 56 66 73 2d 3e 6d 75 74 65 78 29 3b 0a 20  buVfs->mutex);. 
23770 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
23780 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
23790 46 64 2d 3e 7a 44 65 6c 29 3b 0a 20 20 7d 0a 0a  Fd->zDel);.  }..
237a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
237b0 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65  /*.** Delete the
237c0 20 66 69 6c 65 20 6c 6f 63 61 74 65 64 20 61 74   file located at
237d0 20 7a 50 61 74 68 2e 0a 2a 2f 0a 73 74 61 74 69   zPath..*/.stati
237e0 63 20 69 6e 74 20 72 62 75 56 66 73 44 65 6c 65  c int rbuVfsDele
237f0 74 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  te(sqlite3_vfs *
23800 70 56 66 73 2c 20 63 6f 6e 73 74 20 63 68 61 72  pVfs, const char
23810 20 2a 7a 50 61 74 68 2c 20 69 6e 74 20 64 69 72   *zPath, int dir
23820 53 79 6e 63 29 7b 0a 20 20 73 71 6c 69 74 65 33  Sync){.  sqlite3
23830 5f 76 66 73 20 2a 70 52 65 61 6c 56 66 73 20 3d  _vfs *pRealVfs =
23840 20 28 28 72 62 75 5f 76 66 73 2a 29 70 56 66 73   ((rbu_vfs*)pVfs
23850 29 2d 3e 70 52 65 61 6c 56 66 73 3b 0a 20 20 72  )->pRealVfs;.  r
23860 65 74 75 72 6e 20 70 52 65 61 6c 56 66 73 2d 3e  eturn pRealVfs->
23870 78 44 65 6c 65 74 65 28 70 52 65 61 6c 56 66 73  xDelete(pRealVfs
23880 2c 20 7a 50 61 74 68 2c 20 64 69 72 53 79 6e 63  , zPath, dirSync
23890 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74  );.}../*.** Test
238a0 20 66 6f 72 20 61 63 63 65 73 73 20 70 65 72 6d   for access perm
238b0 69 73 73 69 6f 6e 73 2e 20 52 65 74 75 72 6e 20  issions. Return 
238c0 74 72 75 65 20 69 66 20 74 68 65 20 72 65 71 75  true if the requ
238d0 65 73 74 65 64 20 70 65 72 6d 69 73 73 69 6f 6e  ested permission
238e0 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62 6c 65  .** is available
238f0 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72  , or false other
23900 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  wise..*/.static 
23910 69 6e 74 20 72 62 75 56 66 73 41 63 63 65 73 73  int rbuVfsAccess
23920 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
23930 2a 70 56 66 73 2c 20 0a 20 20 63 6f 6e 73 74 20  *pVfs, .  const 
23940 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 0a 20 20  char *zPath, .  
23950 69 6e 74 20 66 6c 61 67 73 2c 20 0a 20 20 69 6e  int flags, .  in
23960 74 20 2a 70 52 65 73 4f 75 74 0a 29 7b 0a 20 20  t *pResOut.){.  
23970 72 62 75 5f 76 66 73 20 2a 70 52 62 75 56 66 73  rbu_vfs *pRbuVfs
23980 20 3d 20 28 72 62 75 5f 76 66 73 2a 29 70 56 66   = (rbu_vfs*)pVf
23990 73 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  s;.  sqlite3_vfs
239a0 20 2a 70 52 65 61 6c 56 66 73 20 3d 20 70 52 62   *pRealVfs = pRb
239b0 75 56 66 73 2d 3e 70 52 65 61 6c 56 66 73 3b 0a  uVfs->pRealVfs;.
239c0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20    int rc;..  rc 
239d0 3d 20 70 52 65 61 6c 56 66 73 2d 3e 78 41 63 63  = pRealVfs->xAcc
239e0 65 73 73 28 70 52 65 61 6c 56 66 73 2c 20 7a 50  ess(pRealVfs, zP
239f0 61 74 68 2c 20 66 6c 61 67 73 2c 20 70 52 65 73  ath, flags, pRes
23a00 4f 75 74 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  Out);..  /* If t
23a10 68 69 73 20 63 61 6c 6c 20 69 73 20 74 6f 20 63  his call is to c
23a20 68 65 63 6b 20 69 66 20 61 20 2a 2d 77 61 6c 20  heck if a *-wal 
23a30 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20  file associated 
23a40 77 69 74 68 20 61 6e 20 52 42 55 20 74 61 72 67  with an RBU targ
23a50 65 74 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  et.  ** database
23a60 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 65 78 69 73   connection exis
23a70 74 73 2c 20 61 6e 64 20 74 68 65 20 52 42 55 20  ts, and the RBU 
23a80 75 70 64 61 74 65 20 69 73 20 69 6e 20 52 42 55  update is in RBU
23a90 5f 53 54 41 47 45 5f 4f 41 4c 2c 0a 20 20 2a 2a  _STAGE_OAL,.  **
23aa0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
23ab0 70 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67 20  pecial handling 
23ac0 69 73 20 61 63 74 69 76 61 74 65 64 3a 0a 20 20  is activated:.  
23ad0 2a 2a 0a 20 20 2a 2a 20 20 20 61 29 20 69 66 20  **.  **   a) if 
23ae0 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 64  the *-wal file d
23af0 6f 65 73 20 65 78 69 73 74 2c 20 72 65 74 75 72  oes exist, retur
23b00 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  n SQLITE_CANTOPE
23b10 4e 2e 20 54 68 69 73 0a 20 20 2a 2a 20 20 20 20  N. This.  **    
23b20 20 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 74    ensures that t
23b30 68 65 20 52 42 55 20 65 78 74 65 6e 73 69 6f 6e  he RBU extension
23b40 20 6e 65 76 65 72 20 74 72 69 65 73 20 74 6f 20   never tries to 
23b50 75 70 64 61 74 65 20 61 20 64 61 74 61 62 61 73  update a databas
23b60 65 0a 20 20 2a 2a 20 20 20 20 20 20 69 6e 20 77  e.  **      in w
23b70 61 6c 20 6d 6f 64 65 2c 20 65 76 65 6e 20 69 66  al mode, even if
23b80 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
23b90 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
23ba0 66 69 6c 65 20 68 61 73 0a 20 20 2a 2a 20 20 20  file has.  **   
23bb0 20 20 20 62 65 65 6e 20 64 61 6d 61 67 65 64 2e     been damaged.
23bc0 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 62 29   .  **.  **   b)
23bd0 20 69 66 20 74 68 65 20 2a 2d 77 61 6c 20 66 69   if the *-wal fi
23be0 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  le does not exis
23bf0 74 2c 20 63 6c 61 69 6d 20 74 68 61 74 20 69 74  t, claim that it
23c00 20 64 6f 65 73 20 61 6e 79 77 61 79 2c 0a 20 20   does anyway,.  
23c10 2a 2a 20 20 20 20 20 20 63 61 75 73 69 6e 67 20  **      causing 
23c20 53 51 4c 69 74 65 20 74 6f 20 63 61 6c 6c 20 78  SQLite to call x
23c30 4f 70 65 6e 28 29 20 74 6f 20 6f 70 65 6e 20 69  Open() to open i
23c40 74 2e 20 54 68 69 73 20 63 61 6c 6c 20 77 69 6c  t. This call wil
23c50 6c 20 61 6c 73 6f 0a 20 20 2a 2a 20 20 20 20 20  l also.  **     
23c60 20 62 65 20 69 6e 74 65 72 63 65 70 74 65 64 20   be intercepted 
23c70 28 73 65 65 20 74 68 65 20 72 62 75 56 66 73 4f  (see the rbuVfsO
23c80 70 65 6e 28 29 20 66 75 6e 63 74 69 6f 6e 29 20  pen() function) 
23c90 61 6e 64 20 74 68 65 20 2a 2d 6f 61 6c 0a 20 20  and the *-oal.  
23ca0 2a 2a 20 20 20 20 20 20 66 69 6c 65 20 6f 70 65  **      file ope
23cb0 6e 65 64 20 69 6e 73 74 65 61 64 2e 0a 20 20 2a  ned instead..  *
23cc0 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
23cd0 54 45 5f 4f 4b 20 26 26 20 66 6c 61 67 73 3d 3d  TE_OK && flags==
23ce0 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
23cf0 49 53 54 53 20 29 7b 0a 20 20 20 20 72 62 75 5f  ISTS ){.    rbu_
23d00 66 69 6c 65 20 2a 70 44 62 20 3d 20 72 62 75 46  file *pDb = rbuF
23d10 69 6e 64 4d 61 69 6e 64 62 28 70 52 62 75 56 66  indMaindb(pRbuVf
23d20 73 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20 20 69  s, zPath);.    i
23d30 66 28 20 70 44 62 20 26 26 20 70 44 62 2d 3e 70  f( pDb && pDb->p
23d40 52 62 75 20 26 26 20 70 44 62 2d 3e 70 52 62 75  Rbu && pDb->pRbu
23d50 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54  ->eStage==RBU_ST
23d60 41 47 45 5f 4f 41 4c 20 29 7b 0a 20 20 20 20 20  AGE_OAL ){.     
23d70 20 69 66 28 20 2a 70 52 65 73 4f 75 74 20 29 7b   if( *pResOut ){
23d80 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
23d90 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20  LITE_CANTOPEN;. 
23da0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
23db0 20 20 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 31      *pResOut = 1
23dc0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
23dd0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
23de0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 75 6c  ;.}../*.** Popul
23df0 61 74 65 20 62 75 66 66 65 72 20 7a 4f 75 74 20  ate buffer zOut 
23e00 77 69 74 68 20 74 68 65 20 66 75 6c 6c 20 63 61  with the full ca
23e10 6e 6f 6e 69 63 61 6c 20 70 61 74 68 6e 61 6d 65  nonical pathname
23e20 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a   corresponding.*
23e30 2a 20 74 6f 20 74 68 65 20 70 61 74 68 6e 61 6d  * to the pathnam
23e40 65 20 69 6e 20 7a 50 61 74 68 2e 20 7a 4f 75 74  e in zPath. zOut
23e50 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
23e60 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66  o point to a buf
23e70 66 65 72 0a 2a 2a 20 6f 66 20 61 74 20 6c 65 61  fer.** of at lea
23e80 73 74 20 28 44 45 56 53 59 4d 5f 4d 41 58 5f 50  st (DEVSYM_MAX_P
23e90 41 54 48 4e 41 4d 45 2b 31 29 20 62 79 74 65 73  ATHNAME+1) bytes
23ea0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
23eb0 72 62 75 56 66 73 46 75 6c 6c 50 61 74 68 6e 61  rbuVfsFullPathna
23ec0 6d 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  me(.  sqlite3_vf
23ed0 73 20 2a 70 56 66 73 2c 20 0a 20 20 63 6f 6e 73  s *pVfs, .  cons
23ee0 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 0a  t char *zPath, .
23ef0 20 20 69 6e 74 20 6e 4f 75 74 2c 20 0a 20 20 63    int nOut, .  c
23f00 68 61 72 20 2a 7a 4f 75 74 0a 29 7b 0a 20 20 73  har *zOut.){.  s
23f10 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 52 65 61  qlite3_vfs *pRea
23f20 6c 56 66 73 20 3d 20 28 28 72 62 75 5f 76 66 73  lVfs = ((rbu_vfs
23f30 2a 29 70 56 66 73 29 2d 3e 70 52 65 61 6c 56 66  *)pVfs)->pRealVf
23f40 73 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65 61  s;.  return pRea
23f50 6c 56 66 73 2d 3e 78 46 75 6c 6c 50 61 74 68 6e  lVfs->xFullPathn
23f60 61 6d 65 28 70 52 65 61 6c 56 66 73 2c 20 7a 50  ame(pRealVfs, zP
23f70 61 74 68 2c 20 6e 4f 75 74 2c 20 7a 4f 75 74 29  ath, nOut, zOut)
23f80 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
23f90 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58  ITE_OMIT_LOAD_EX
23fa0 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 4f 70  TENSION./*.** Op
23fb0 65 6e 20 74 68 65 20 64 79 6e 61 6d 69 63 20 6c  en the dynamic l
23fc0 69 62 72 61 72 79 20 6c 6f 63 61 74 65 64 20 61  ibrary located a
23fd0 74 20 7a 50 61 74 68 20 61 6e 64 20 72 65 74 75  t zPath and retu
23fe0 72 6e 20 61 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a  rn a handle..*/.
23ff0 73 74 61 74 69 63 20 76 6f 69 64 20 2a 72 62 75  static void *rbu
24000 56 66 73 44 6c 4f 70 65 6e 28 73 71 6c 69 74 65  VfsDlOpen(sqlite
24010 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 63 6f 6e  3_vfs *pVfs, con
24020 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 29 7b  st char *zPath){
24030 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
24040 70 52 65 61 6c 56 66 73 20 3d 20 28 28 72 62 75  pRealVfs = ((rbu
24050 5f 76 66 73 2a 29 70 56 66 73 29 2d 3e 70 52 65  _vfs*)pVfs)->pRe
24060 61 6c 56 66 73 3b 0a 20 20 72 65 74 75 72 6e 20  alVfs;.  return 
24070 70 52 65 61 6c 56 66 73 2d 3e 78 44 6c 4f 70 65  pRealVfs->xDlOpe
24080 6e 28 70 52 65 61 6c 56 66 73 2c 20 7a 50 61 74  n(pRealVfs, zPat
24090 68 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70  h);.}../*.** Pop
240a0 75 6c 61 74 65 20 74 68 65 20 62 75 66 66 65 72  ulate the buffer
240b0 20 7a 45 72 72 4d 73 67 20 28 73 69 7a 65 20 6e   zErrMsg (size n
240c0 42 79 74 65 20 62 79 74 65 73 29 20 77 69 74 68  Byte bytes) with
240d0 20 61 20 68 75 6d 61 6e 20 72 65 61 64 61 62 6c   a human readabl
240e0 65 0a 2a 2a 20 75 74 66 2d 38 20 73 74 72 69 6e  e.** utf-8 strin
240f0 67 20 64 65 73 63 72 69 62 69 6e 67 20 74 68 65  g describing the
24100 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 65 72 72   most recent err
24110 6f 72 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61  or encountered a
24120 73 73 6f 63 69 61 74 65 64 20 0a 2a 2a 20 77 69  ssociated .** wi
24130 74 68 20 64 79 6e 61 6d 69 63 20 6c 69 62 72 61  th dynamic libra
24140 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ries..*/.static 
24150 76 6f 69 64 20 72 62 75 56 66 73 44 6c 45 72 72  void rbuVfsDlErr
24160 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  or(sqlite3_vfs *
24170 70 56 66 73 2c 20 69 6e 74 20 6e 42 79 74 65 2c  pVfs, int nByte,
24180 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 29 7b   char *zErrMsg){
24190 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
241a0 70 52 65 61 6c 56 66 73 20 3d 20 28 28 72 62 75  pRealVfs = ((rbu
241b0 5f 76 66 73 2a 29 70 56 66 73 29 2d 3e 70 52 65  _vfs*)pVfs)->pRe
241c0 61 6c 56 66 73 3b 0a 20 20 70 52 65 61 6c 56 66  alVfs;.  pRealVf
241d0 73 2d 3e 78 44 6c 45 72 72 6f 72 28 70 52 65 61  s->xDlError(pRea
241e0 6c 56 66 73 2c 20 6e 42 79 74 65 2c 20 7a 45 72  lVfs, nByte, zEr
241f0 72 4d 73 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rMsg);.}../*.** 
24200 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
24210 20 74 6f 20 74 68 65 20 73 79 6d 62 6f 6c 20 7a   to the symbol z
24220 53 79 6d 62 6f 6c 20 69 6e 20 74 68 65 20 64 79  Symbol in the dy
24230 6e 61 6d 69 63 20 6c 69 62 72 61 72 79 20 70 48  namic library pH
24240 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  andle..*/.static
24250 20 76 6f 69 64 20 28 2a 72 62 75 56 66 73 44 6c   void (*rbuVfsDl
24260 53 79 6d 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  Sym(.  sqlite3_v
24270 66 73 20 2a 70 56 66 73 2c 20 0a 20 20 76 6f 69  fs *pVfs, .  voi
24280 64 20 2a 70 41 72 67 2c 20 0a 20 20 63 6f 6e 73  d *pArg, .  cons
24290 74 20 63 68 61 72 20 2a 7a 53 79 6d 0a 29 29 28  t char *zSym.))(
242a0 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33  void){.  sqlite3
242b0 5f 76 66 73 20 2a 70 52 65 61 6c 56 66 73 20 3d  _vfs *pRealVfs =
242c0 20 28 28 72 62 75 5f 76 66 73 2a 29 70 56 66 73   ((rbu_vfs*)pVfs
242d0 29 2d 3e 70 52 65 61 6c 56 66 73 3b 0a 20 20 72  )->pRealVfs;.  r
242e0 65 74 75 72 6e 20 70 52 65 61 6c 56 66 73 2d 3e  eturn pRealVfs->
242f0 78 44 6c 53 79 6d 28 70 52 65 61 6c 56 66 73 2c  xDlSym(pRealVfs,
24300 20 70 41 72 67 2c 20 7a 53 79 6d 29 3b 0a 7d 0a   pArg, zSym);.}.
24310 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65  ./*.** Close the
24320 20 64 79 6e 61 6d 69 63 20 6c 69 62 72 61 72 79   dynamic library
24330 20 68 61 6e 64 6c 65 20 70 48 61 6e 64 6c 65 2e   handle pHandle.
24340 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
24350 72 62 75 56 66 73 44 6c 43 6c 6f 73 65 28 73 71  rbuVfsDlClose(sq
24360 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
24370 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65 29 7b   void *pHandle){
24380 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
24390 70 52 65 61 6c 56 66 73 20 3d 20 28 28 72 62 75  pRealVfs = ((rbu
243a0 5f 76 66 73 2a 29 70 56 66 73 29 2d 3e 70 52 65  _vfs*)pVfs)->pRe
243b0 61 6c 56 66 73 3b 0a 20 20 70 52 65 61 6c 56 66  alVfs;.  pRealVf
243c0 73 2d 3e 78 44 6c 43 6c 6f 73 65 28 70 52 65 61  s->xDlClose(pRea
243d0 6c 56 66 73 2c 20 70 48 61 6e 64 6c 65 29 3b 0a  lVfs, pHandle);.
243e0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
243f0 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54  TE_OMIT_LOAD_EXT
24400 45 4e 53 49 4f 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  ENSION */../*.**
24410 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 62 75   Populate the bu
24420 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20  ffer pointed to 
24430 62 79 20 7a 42 75 66 4f 75 74 20 77 69 74 68 20  by zBufOut with 
24440 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 0a  nByte bytes of .
24450 2a 2a 20 72 61 6e 64 6f 6d 20 64 61 74 61 2e 0a  ** random data..
24460 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62  */.static int rb
24470 75 56 66 73 52 61 6e 64 6f 6d 6e 65 73 73 28 73  uVfsRandomness(s
24480 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
24490 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 63 68 61  , int nByte, cha
244a0 72 20 2a 7a 42 75 66 4f 75 74 29 7b 0a 20 20 73  r *zBufOut){.  s
244b0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 52 65 61  qlite3_vfs *pRea
244c0 6c 56 66 73 20 3d 20 28 28 72 62 75 5f 76 66 73  lVfs = ((rbu_vfs
244d0 2a 29 70 56 66 73 29 2d 3e 70 52 65 61 6c 56 66  *)pVfs)->pRealVf
244e0 73 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65 61  s;.  return pRea
244f0 6c 56 66 73 2d 3e 78 52 61 6e 64 6f 6d 6e 65 73  lVfs->xRandomnes
24500 73 28 70 52 65 61 6c 56 66 73 2c 20 6e 42 79 74  s(pRealVfs, nByt
24510 65 2c 20 7a 42 75 66 4f 75 74 29 3b 0a 7d 0a 0a  e, zBufOut);.}..
24520 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20  /*.** Sleep for 
24530 6e 4d 69 63 72 6f 20 6d 69 63 72 6f 73 65 63 6f  nMicro microseco
24540 6e 64 73 2e 20 52 65 74 75 72 6e 20 74 68 65 20  nds. Return the 
24550 6e 75 6d 62 65 72 20 6f 66 20 6d 69 63 72 6f 73  number of micros
24560 65 63 6f 6e 64 73 20 0a 2a 2a 20 61 63 74 75 61  econds .** actua
24570 6c 6c 79 20 73 6c 65 70 74 2e 0a 2a 2f 0a 73 74  lly slept..*/.st
24580 61 74 69 63 20 69 6e 74 20 72 62 75 56 66 73 53  atic int rbuVfsS
24590 6c 65 65 70 28 73 71 6c 69 74 65 33 5f 76 66 73  leep(sqlite3_vfs
245a0 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 4d 69 63   *pVfs, int nMic
245b0 72 6f 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  ro){.  sqlite3_v
245c0 66 73 20 2a 70 52 65 61 6c 56 66 73 20 3d 20 28  fs *pRealVfs = (
245d0 28 72 62 75 5f 76 66 73 2a 29 70 56 66 73 29 2d  (rbu_vfs*)pVfs)-
245e0 3e 70 52 65 61 6c 56 66 73 3b 0a 20 20 72 65 74  >pRealVfs;.  ret
245f0 75 72 6e 20 70 52 65 61 6c 56 66 73 2d 3e 78 53  urn pRealVfs->xS
24600 6c 65 65 70 28 70 52 65 61 6c 56 66 73 2c 20 6e  leep(pRealVfs, n
24610 4d 69 63 72 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Micro);.}../*.**
24620 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72   Return the curr
24630 65 6e 74 20 74 69 6d 65 20 61 73 20 61 20 4a 75  ent time as a Ju
24640 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20  lian Day number 
24650 69 6e 20 2a 70 54 69 6d 65 4f 75 74 2e 0a 2a 2f  in *pTimeOut..*/
24660 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 56  .static int rbuV
24670 66 73 43 75 72 72 65 6e 74 54 69 6d 65 28 73 71  fsCurrentTime(sq
24680 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
24690 20 64 6f 75 62 6c 65 20 2a 70 54 69 6d 65 4f 75   double *pTimeOu
246a0 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  t){.  sqlite3_vf
246b0 73 20 2a 70 52 65 61 6c 56 66 73 20 3d 20 28 28  s *pRealVfs = ((
246c0 72 62 75 5f 76 66 73 2a 29 70 56 66 73 29 2d 3e  rbu_vfs*)pVfs)->
246d0 70 52 65 61 6c 56 66 73 3b 0a 20 20 72 65 74 75  pRealVfs;.  retu
246e0 72 6e 20 70 52 65 61 6c 56 66 73 2d 3e 78 43 75  rn pRealVfs->xCu
246f0 72 72 65 6e 74 54 69 6d 65 28 70 52 65 61 6c 56  rrentTime(pRealV
24700 66 73 2c 20 70 54 69 6d 65 4f 75 74 29 3b 0a 7d  fs, pTimeOut);.}
24710 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 2e 0a 2a  ../*.** No-op..*
24720 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62 75  /.static int rbu
24730 56 66 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28  VfsGetLastError(
24740 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
24750 73 2c 20 69 6e 74 20 61 2c 20 63 68 61 72 20 2a  s, int a, char *
24760 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  b){.  return 0;.
24770 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 72 65 67 69 73  }../*.** Deregis
24780 74 65 72 20 61 6e 64 20 64 65 73 74 72 6f 79 20  ter and destroy 
24790 61 6e 20 52 42 55 20 76 66 73 20 63 72 65 61 74  an RBU vfs creat
247a0 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72  ed by an earlier
247b0 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 73 71 6c 69   call to.** sqli
247c0 74 65 33 72 62 75 5f 63 72 65 61 74 65 5f 76 66  te3rbu_create_vf
247d0 73 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  s()..*/.void sql
247e0 69 74 65 33 72 62 75 5f 64 65 73 74 72 6f 79 5f  ite3rbu_destroy_
247f0 76 66 73 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  vfs(const char *
24800 7a 4e 61 6d 65 29 7b 0a 20 20 73 71 6c 69 74 65  zName){.  sqlite
24810 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 73 71  3_vfs *pVfs = sq
24820 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 7a  lite3_vfs_find(z
24830 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 56 66  Name);.  if( pVf
24840 73 20 26 26 20 70 56 66 73 2d 3e 78 4f 70 65 6e  s && pVfs->xOpen
24850 3d 3d 72 62 75 56 66 73 4f 70 65 6e 20 29 7b 0a  ==rbuVfsOpen ){.
24860 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
24870 78 5f 66 72 65 65 28 28 28 72 62 75 5f 76 66 73  x_free(((rbu_vfs
24880 2a 29 70 56 66 73 29 2d 3e 6d 75 74 65 78 29 3b  *)pVfs)->mutex);
24890 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73  .    sqlite3_vfs
248a0 5f 75 6e 72 65 67 69 73 74 65 72 28 70 56 66 73  _unregister(pVfs
248b0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
248c0 72 65 65 28 70 56 66 73 29 3b 0a 20 20 7d 0a 7d  ree(pVfs);.  }.}
248d0 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
248e0 6e 20 52 42 55 20 56 46 53 20 6e 61 6d 65 64 20  n RBU VFS named 
248f0 7a 4e 61 6d 65 20 74 68 61 74 20 61 63 63 65 73  zName that acces
24900 73 65 73 20 74 68 65 20 75 6e 64 65 72 6c 79 69  ses the underlyi
24910 6e 67 20 66 69 6c 65 2d 73 79 73 74 65 6d 0a 2a  ng file-system.*
24920 2a 20 76 69 61 20 65 78 69 73 74 69 6e 67 20 56  * via existing V
24930 46 53 20 7a 50 61 72 65 6e 74 2e 20 54 68 65 20  FS zParent. The 
24940 6e 65 77 20 6f 62 6a 65 63 74 20 69 73 20 72 65  new object is re
24950 67 69 73 74 65 72 65 64 20 61 73 20 61 20 6e 6f  gistered as a no
24960 6e 2d 64 65 66 61 75 6c 74 0a 2a 2a 20 56 46 53  n-default.** VFS
24970 20 77 69 74 68 20 53 51 4c 69 74 65 20 62 65 66   with SQLite bef
24980 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
24990 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 72 62 75  /.int sqlite3rbu
249a0 5f 63 72 65 61 74 65 5f 76 66 73 28 63 6f 6e 73  _create_vfs(cons
249b0 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63  t char *zName, c
249c0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72 65  onst char *zPare
249d0 6e 74 29 7b 0a 0a 20 20 2f 2a 20 54 65 6d 70 6c  nt){..  /* Templ
249e0 61 74 65 20 66 6f 72 20 56 46 53 20 2a 2f 0a 20  ate for VFS */. 
249f0 20 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f   static sqlite3_
24a00 76 66 73 20 76 66 73 5f 74 65 6d 70 6c 61 74 65  vfs vfs_template
24a10 20 3d 20 7b 0a 20 20 20 20 31 2c 20 20 20 20 20   = {.    1,     
24a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a30 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69         /* iVersi
24a40 6f 6e 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20  on */.    0,    
24a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a60 20 20 20 20 20 20 20 20 2f 2a 20 73 7a 4f 73 46          /* szOsF
24a70 69 6c 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20  ile */.    0,   
24a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a90 20 20 20 20 20 20 20 20 20 2f 2a 20 6d 78 50 61           /* mxPa
24aa0 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c  thname */.    0,
24ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ac0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70              /* p
24ad0 4e 65 78 74 20 2a 2f 0a 20 20 20 20 30 2c 20 20  Next */.    0,  
24ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24af0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4e 61            /* zNa
24b00 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20  me */.    0,    
24b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b20 20 20 20 20 20 20 20 20 2f 2a 20 70 41 70 70 44          /* pAppD
24b30 61 74 61 20 2a 2f 0a 20 20 20 20 72 62 75 56 66  ata */.    rbuVf
24b40 73 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20  sOpen,          
24b50 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 65           /* xOpe
24b60 6e 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 44  n */.    rbuVfsD
24b70 65 6c 65 74 65 2c 20 20 20 20 20 20 20 20 20 20  elete,          
24b80 20 20 20 20 20 20 20 2f 2a 20 78 44 65 6c 65 74         /* xDelet
24b90 65 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 41  e */.    rbuVfsA
24ba0 63 63 65 73 73 2c 20 20 20 20 20 20 20 20 20 20  ccess,          
24bb0 20 20 20 20 20 20 20 2f 2a 20 78 41 63 63 65 73         /* xAcces
24bc0 73 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 46  s */.    rbuVfsF
24bd0 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20 20 20  ullPathname,    
24be0 20 20 20 20 20 20 20 2f 2a 20 78 46 75 6c 6c 50         /* xFullP
24bf0 61 74 68 6e 61 6d 65 20 2a 2f 0a 0a 23 69 66 6e  athname */..#ifn
24c00 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
24c10 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20  LOAD_EXTENSION. 
24c20 20 20 20 72 62 75 56 66 73 44 6c 4f 70 65 6e 2c     rbuVfsDlOpen,
24c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c40 20 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f 0a 20   /* xDlOpen */. 
24c50 20 20 20 72 62 75 56 66 73 44 6c 45 72 72 6f 72     rbuVfsDlError
24c60 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
24c70 20 2f 2a 20 78 44 6c 45 72 72 6f 72 20 2a 2f 0a   /* xDlError */.
24c80 20 20 20 20 72 62 75 56 66 73 44 6c 53 79 6d 2c      rbuVfsDlSym,
24c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ca0 20 20 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f 0a 20    /* xDlSym */. 
24cb0 20 20 20 72 62 75 56 66 73 44 6c 43 6c 6f 73 65     rbuVfsDlClose
24cc0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
24cd0 20 2f 2a 20 78 44 6c 43 6c 6f 73 65 20 2a 2f 0a   /* xDlClose */.
24ce0 23 65 6c 73 65 0a 20 20 20 20 30 2c 20 30 2c 20  #else.    0, 0, 
24cf0 30 2c 20 30 2c 0a 23 65 6e 64 69 66 0a 0a 20 20  0, 0,.#endif..  
24d00 20 20 72 62 75 56 66 73 52 61 6e 64 6f 6d 6e 65    rbuVfsRandomne
24d10 73 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ss,             
24d20 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20 2a  /* xRandomness *
24d30 2f 0a 20 20 20 20 72 62 75 56 66 73 53 6c 65 65  /.    rbuVfsSlee
24d40 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
24d50 20 20 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a 2f      /* xSleep */
24d60 0a 20 20 20 20 72 62 75 56 66 73 43 75 72 72 65  .    rbuVfsCurre
24d70 6e 74 54 69 6d 65 2c 20 20 20 20 20 20 20 20 20  ntTime,         
24d80 20 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69     /* xCurrentTi
24d90 6d 65 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73  me */.    rbuVfs
24da0 47 65 74 4c 61 73 74 45 72 72 6f 72 2c 20 20 20  GetLastError,   
24db0 20 20 20 20 20 20 20 20 2f 2a 20 78 47 65 74 4c          /* xGetL
24dc0 61 73 74 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20  astError */.    
24dd0 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
24de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24df0 20 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74   xCurrentTimeInt
24e00 36 34 20 28 76 65 72 73 69 6f 6e 20 32 29 20 2a  64 (version 2) *
24e10 2f 0a 20 20 20 20 30 2c 20 30 2c 20 30 20 20 20  /.    0, 0, 0   
24e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e30 20 20 20 20 2f 2a 20 55 6e 69 6d 70 6c 65 6d 65      /* Unimpleme
24e40 6e 74 65 64 20 76 65 72 73 69 6f 6e 20 33 20 6d  nted version 3 m
24e50 65 74 68 6f 64 73 20 2a 2f 0a 20 20 7d 3b 0a 0a  ethods */.  };..
24e60 20 20 72 62 75 5f 76 66 73 20 2a 70 4e 65 77 20    rbu_vfs *pNew 
24e70 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
24e80 20 20 2f 2a 20 4e 65 77 6c 79 20 61 6c 6c 6f 63    /* Newly alloc
24e90 61 74 65 64 20 56 46 53 20 2a 2f 0a 20 20 69 6e  ated VFS */.  in
24ea0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
24eb0 3b 0a 20 20 73 69 7a 65 5f 74 20 6e 4e 61 6d 65  ;.  size_t nName
24ec0 3b 0a 20 20 73 69 7a 65 5f 74 20 6e 42 79 74 65  ;.  size_t nByte
24ed0 3b 0a 0a 20 20 6e 4e 61 6d 65 20 3d 20 73 74 72  ;..  nName = str
24ee0 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 6e 42  len(zName);.  nB
24ef0 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 72 62 75  yte = sizeof(rbu
24f00 5f 76 66 73 29 20 2b 20 6e 4e 61 6d 65 20 2b 20  _vfs) + nName + 
24f10 31 3b 0a 20 20 70 4e 65 77 20 3d 20 28 72 62 75  1;.  pNew = (rbu
24f20 5f 76 66 73 2a 29 73 71 6c 69 74 65 33 5f 6d 61  _vfs*)sqlite3_ma
24f30 6c 6c 6f 63 36 34 28 6e 42 79 74 65 29 3b 0a 20  lloc64(nByte);. 
24f40 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
24f50 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
24f60 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  NOMEM;.  }else{.
24f70 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20      sqlite3_vfs 
24f80 2a 70 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20  *pParent;       
24f90 20 20 20 20 2f 2a 20 50 61 72 65 6e 74 20 56 46      /* Parent VF
24fa0 53 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28  S */.    memset(
24fb0 70 4e 65 77 2c 20 30 2c 20 6e 42 79 74 65 29 3b  pNew, 0, nByte);
24fc0 0a 20 20 20 20 70 50 61 72 65 6e 74 20 3d 20 73  .    pParent = s
24fd0 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
24fe0 7a 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 69 66  zParent);.    if
24ff0 28 20 70 50 61 72 65 6e 74 3d 3d 30 20 29 7b 0a  ( pParent==0 ){.
25000 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
25010 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20 20 20  E_NOTFOUND;.    
25020 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61  }else{.      cha
25030 72 20 2a 7a 53 70 61 63 65 3b 0a 20 20 20 20 20  r *zSpace;.     
25040 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 2d 3e 62   memcpy(&pNew->b
25050 61 73 65 2c 20 26 76 66 73 5f 74 65 6d 70 6c 61  ase, &vfs_templa
25060 74 65 2c 20 73 69 7a 65 6f 66 28 73 71 6c 69 74  te, sizeof(sqlit
25070 65 33 5f 76 66 73 29 29 3b 0a 20 20 20 20 20 20  e3_vfs));.      
25080 70 4e 65 77 2d 3e 62 61 73 65 2e 6d 78 50 61 74  pNew->base.mxPat
25090 68 6e 61 6d 65 20 3d 20 70 50 61 72 65 6e 74 2d  hname = pParent-
250a0 3e 6d 78 50 61 74 68 6e 61 6d 65 3b 0a 20 20 20  >mxPathname;.   
250b0 20 20 20 70 4e 65 77 2d 3e 62 61 73 65 2e 73 7a     pNew->base.sz
250c0 4f 73 46 69 6c 65 20 3d 20 73 69 7a 65 6f 66 28  OsFile = sizeof(
250d0 72 62 75 5f 66 69 6c 65 29 20 2b 20 70 50 61 72  rbu_file) + pPar
250e0 65 6e 74 2d 3e 73 7a 4f 73 46 69 6c 65 3b 0a 20  ent->szOsFile;. 
250f0 20 20 20 20 20 70 4e 65 77 2d 3e 70 52 65 61 6c       pNew->pReal
25100 56 66 73 20 3d 20 70 50 61 72 65 6e 74 3b 0a 20  Vfs = pParent;. 
25110 20 20 20 20 20 70 4e 65 77 2d 3e 62 61 73 65 2e       pNew->base.
25120 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63  zName = (const c
25130 68 61 72 2a 29 28 7a 53 70 61 63 65 20 3d 20 28  har*)(zSpace = (
25140 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 29 3b  char*)&pNew[1]);
25150 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 53  .      memcpy(zS
25160 70 61 63 65 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61  pace, zName, nNa
25170 6d 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 41  me);..      /* A
25180 6c 6c 6f 63 61 74 65 20 74 68 65 20 6d 75 74 65  llocate the mute
25190 78 20 61 6e 64 20 72 65 67 69 73 74 65 72 20 74  x and register t
251a0 68 65 20 6e 65 77 20 56 46 53 20 28 6e 6f 74 20  he new VFS (not 
251b0 61 73 20 74 68 65 20 64 65 66 61 75 6c 74 29 20  as the default) 
251c0 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6d  */.      pNew->m
251d0 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d  utex = sqlite3_m
251e0 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54  utex_alloc(SQLIT
251f0 45 5f 4d 55 54 45 58 5f 52 45 43 55 52 53 49 56  E_MUTEX_RECURSIV
25200 45 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e  E);.      if( pN
25210 65 77 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a  ew->mutex==0 ){.
25220 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
25230 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
25240 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
25250 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73  rc = sqlite3_vfs
25260 5f 72 65 67 69 73 74 65 72 28 26 70 4e 65 77 2d  _register(&pNew-
25270 3e 62 61 73 65 2c 20 30 29 3b 0a 20 20 20 20 20  >base, 0);.     
25280 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66   }.    }..    if
25290 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
252a0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
252b0 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 4e 65 77  _mutex_free(pNew
252c0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20  ->mutex);.      
252d0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65  sqlite3_free(pNe
252e0 77 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  w);.    }.  }.. 
252f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
25300 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
25310 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25320 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25330 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25340 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 23 65  ***********/..#e
25350 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
25360 28 53 51 4c 49 54 45 5f 43 4f 52 45 29 20 7c 7c  (SQLITE_CORE) ||
25370 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
25380 45 4e 41 42 4c 45 5f 52 42 55 29 20 2a 2f 0a     ENABLE_RBU) */.