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

Artifact f6e9ca388b5d4680fbf266a4d10a21aec11d6baf48f6d06fd53f6b205fad959f:


0000: 2f 2a 0a 2a 2a 20 32 30 31 34 20 41 75 67 75 73  /*.** 2014 Augus
0010: 74 20 33 30 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  t 30.**.** The a
0020: 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20  uthor disclaims 
0030: 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74 68 69  copyright to thi
0040: 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20  s source code.  
0050: 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61  In place of.** a
0060: 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68   legal notice, h
0070: 65 72 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e  ere is a blessin
0080: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20  g:.**.**    May 
0090: 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20  you do good and 
00a0: 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20  not evil..**    
00b0: 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72  May you find for
00c0: 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75  giveness for you
00d0: 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76  rself and forgiv
00e0: 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20  e others..**    
00f0: 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20 66 72  May you share fr
0100: 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69  eely, never taki
0110: 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75  ng more than you
0120: 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a   give..**.******
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 56 45  ***.**.**.** OVE
0180: 52 56 49 45 57 20 0a 2a 2a 0a 2a 2a 20 20 54 68  RVIEW .**.**  Th
0190: 65 20 52 42 55 20 65 78 74 65 6e 73 69 6f 6e 20  e RBU extension 
01a0: 72 65 71 75 69 72 65 73 20 74 68 61 74 20 74 68  requires that th
01b0: 65 20 52 42 55 20 75 70 64 61 74 65 20 62 65 20  e RBU update be 
01c0: 70 61 63 6b 61 67 65 64 20 61 73 20 61 6e 0a 2a  packaged as an.*
01d0: 2a 20 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  *  SQLite databa
01e0: 73 65 2e 20 54 68 65 20 74 61 62 6c 65 73 20 69  se. The tables i
01f0: 74 20 65 78 70 65 63 74 73 20 74 6f 20 66 69 6e  t expects to fin
0200: 64 20 61 72 65 20 64 65 73 63 72 69 62 65 64 20  d are described 
0210: 69 6e 0a 2a 2a 20 20 73 71 6c 69 74 65 33 72 62  in.**  sqlite3rb
0220: 75 2e 68 2e 20 20 45 73 73 65 6e 74 69 61 6c 6c  u.h.  Essentiall
0230: 79 2c 20 66 6f 72 20 65 61 63 68 20 74 61 62 6c  y, for each tabl
0240: 65 20 78 79 7a 20 69 6e 20 74 68 65 20 74 61 72  e xyz in the tar
0250: 67 65 74 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  get database.** 
0260: 20 74 68 61 74 20 74 68 65 20 75 73 65 72 20 77   that the user w
0270: 69 73 68 65 73 20 74 6f 20 77 72 69 74 65 20 74  ishes to write t
0280: 6f 2c 20 61 20 63 6f 72 72 65 73 70 6f 6e 64 69  o, a correspondi
0290: 6e 67 20 64 61 74 61 5f 78 79 7a 20 74 61 62 6c  ng data_xyz tabl
02a0: 65 20 69 73 0a 2a 2a 20 20 63 72 65 61 74 65 64  e is.**  created
02b0: 20 69 6e 20 74 68 65 20 52 42 55 20 64 61 74 61   in the RBU data
02c0: 62 61 73 65 20 61 6e 64 20 70 6f 70 75 6c 61 74  base and populat
02d0: 65 64 20 77 69 74 68 20 6f 6e 65 20 72 6f 77 20  ed with one row 
02e0: 66 6f 72 20 65 61 63 68 20 72 6f 77 20 74 6f 0a  for each row to.
02f0: 2a 2a 20 20 75 70 64 61 74 65 2c 20 69 6e 73 65  **  update, inse
0300: 72 74 20 6f 72 20 64 65 6c 65 74 65 20 66 72 6f  rt or delete fro
0310: 6d 20 74 68 65 20 74 61 72 67 65 74 20 74 61 62  m the target tab
0320: 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 20 54 68 65 20  le..** .**  The 
0330: 75 70 64 61 74 65 20 70 72 6f 63 65 65 64 73 20  update proceeds 
0340: 69 6e 20 74 68 72 65 65 20 73 74 61 67 65 73 3a  in three stages:
0350: 0a 2a 2a 20 0a 2a 2a 20 20 31 29 20 54 68 65 20  .** .**  1) The 
0360: 64 61 74 61 62 61 73 65 20 69 73 20 75 70 64 61  database is upda
0370: 74 65 64 2e 20 54 68 65 20 6d 6f 64 69 66 69 65  ted. The modifie
0380: 64 20 64 61 74 61 62 61 73 65 20 70 61 67 65 73  d database pages
0390: 20 61 72 65 20 77 72 69 74 74 65 6e 0a 2a 2a 20   are written.** 
03a0: 20 20 20 20 74 6f 20 61 20 2a 2d 6f 61 6c 20 66      to a *-oal f
03b0: 69 6c 65 2e 20 41 20 2a 2d 6f 61 6c 20 66 69 6c  ile. A *-oal fil
03c0: 65 20 69 73 20 6a 75 73 74 20 6c 69 6b 65 20 61  e is just like a
03d0: 20 2a 2d 77 61 6c 20 66 69 6c 65 2c 20 65 78 63   *-wal file, exc
03e0: 65 70 74 0a 2a 2a 20 20 20 20 20 74 68 61 74 20  ept.**     that 
03f0: 69 74 20 69 73 20 6e 61 6d 65 64 20 22 3c 64 61  it is named "<da
0400: 74 61 62 61 73 65 3e 2d 6f 61 6c 22 20 69 6e 73  tabase>-oal" ins
0410: 74 65 61 64 20 6f 66 20 22 3c 64 61 74 61 62 61  tead of "<databa
0420: 73 65 3e 2d 77 61 6c 22 2e 0a 2a 2a 20 20 20 20  se>-wal"..**    
0430: 20 42 65 63 61 75 73 65 20 72 65 67 75 6c 61 72   Because regular
0440: 20 53 51 4c 69 74 65 20 63 6c 69 65 6e 74 73 20   SQLite clients 
0450: 64 6f 20 6e 6f 74 20 6c 6f 6f 6b 20 66 6f 72 20  do not look for 
0460: 66 69 6c 65 20 6e 61 6d 65 64 0a 2a 2a 20 20 20  file named.**   
0470: 20 20 22 3c 64 61 74 61 62 61 73 65 3e 2d 6f 61    "<database>-oa
0480: 6c 22 2c 20 74 68 65 79 20 67 6f 20 6f 6e 20 75  l", they go on u
0490: 73 69 6e 67 20 74 68 65 20 6f 72 69 67 69 6e 61  sing the origina
04a0: 6c 20 64 61 74 61 62 61 73 65 20 69 6e 0a 2a 2a  l database in.**
04b0: 20 20 20 20 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f       rollback mo
04c0: 64 65 20 77 68 69 6c 65 20 74 68 65 20 2a 2d 6f  de while the *-o
04d0: 61 6c 20 66 69 6c 65 20 69 73 20 62 65 69 6e 67  al file is being
04e0: 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2a 20 0a   generated..** .
04f0: 2a 2a 20 20 20 20 20 44 75 72 69 6e 67 20 74 68  **     During th
0500: 69 73 20 73 74 61 67 65 20 52 42 55 20 64 6f 65  is stage RBU doe
0510: 73 20 6e 6f 74 20 75 70 64 61 74 65 20 74 68 65  s not update the
0520: 20 64 61 74 61 62 61 73 65 20 62 79 20 77 72 69   database by wri
0530: 74 69 6e 67 0a 2a 2a 20 20 20 20 20 64 69 72 65  ting.**     dire
0540: 63 74 6c 79 20 74 6f 20 74 68 65 20 74 61 72 67  ctly to the targ
0550: 65 74 20 74 61 62 6c 65 73 2e 20 49 6e 73 74 65  et tables. Inste
0560: 61 64 20 69 74 20 63 72 65 61 74 65 73 20 22 69  ad it creates "i
0570: 6d 70 6f 73 74 65 72 22 0a 2a 2a 20 20 20 20 20  mposter".**     
0580: 74 61 62 6c 65 73 20 75 73 69 6e 67 20 74 68 65  tables using the
0590: 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
05a0: 5f 49 4d 50 4f 53 54 45 52 20 69 6e 74 65 72 66  _IMPOSTER interf
05b0: 61 63 65 20 74 68 61 74 20 69 74 20 75 73 65 73  ace that it uses
05c0: 0a 2a 2a 20 20 20 20 20 74 6f 20 75 70 64 61 74  .**     to updat
05d0: 65 20 65 61 63 68 20 62 2d 74 72 65 65 20 69 6e  e each b-tree in
05e0: 64 69 76 69 64 75 61 6c 6c 79 2e 20 41 6c 6c 20  dividually. All 
05f0: 75 70 64 61 74 65 73 20 72 65 71 75 69 72 65 64  updates required
0600: 20 62 79 20 65 61 63 68 0a 2a 2a 20 20 20 20 20   by each.**     
0610: 62 2d 74 72 65 65 20 61 72 65 20 63 6f 6d 70 6c  b-tree are compl
0620: 65 74 65 64 20 62 65 66 6f 72 65 20 6d 6f 76 69  eted before movi
0630: 6e 67 20 6f 6e 20 74 6f 20 74 68 65 20 6e 65 78  ng on to the nex
0640: 74 2c 20 61 6e 64 20 61 6c 6c 0a 2a 2a 20 20 20  t, and all.**   
0650: 20 20 75 70 64 61 74 65 73 20 61 72 65 20 64 6f    updates are do
0660: 6e 65 20 69 6e 20 73 6f 72 74 65 64 20 6b 65 79  ne in sorted key
0670: 20 6f 72 64 65 72 2e 0a 2a 2a 20 0a 2a 2a 20 20   order..** .**  
0680: 32 29 20 54 68 65 20 22 3c 64 61 74 61 62 61 73  2) The "<databas
0690: 65 3e 2d 6f 61 6c 22 20 66 69 6c 65 20 69 73 20  e>-oal" file is 
06a0: 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 65 71 75  moved to the equ
06b0: 69 76 61 6c 65 6e 74 20 22 3c 64 61 74 61 62 61  ivalent "<databa
06c0: 73 65 3e 2d 77 61 6c 22 0a 2a 2a 20 20 20 20 20  se>-wal".**     
06d0: 6c 6f 63 61 74 69 6f 6e 20 75 73 69 6e 67 20 61  location using a
06e0: 20 63 61 6c 6c 20 74 6f 20 72 65 6e 61 6d 65 28   call to rename(
06f0: 32 29 2e 20 42 65 66 6f 72 65 20 64 6f 69 6e 67  2). Before doing
0700: 20 74 68 69 73 20 74 68 65 20 52 42 55 0a 2a 2a   this the RBU.**
0710: 20 20 20 20 20 6d 6f 64 75 6c 65 20 74 61 6b 65       module take
0720: 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  s an EXCLUSIVE l
0730: 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
0740: 61 73 65 20 66 69 6c 65 2c 20 65 6e 73 75 72 69  ase file, ensuri
0750: 6e 67 0a 2a 2a 20 20 20 20 20 74 68 61 74 20 74  ng.**     that t
0760: 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 74 68 65  here are no othe
0770: 72 20 61 63 74 69 76 65 20 72 65 61 64 65 72 73  r active readers
0780: 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 4f 6e 63  ..** .**     Onc
0790: 65 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 20  e the EXCLUSIVE 
07a0: 6c 6f 63 6b 20 69 73 20 72 65 6c 65 61 73 65 64  lock is released
07b0: 2c 20 61 6e 79 20 6f 74 68 65 72 20 64 61 74 61  , any other data
07c0: 62 61 73 65 20 72 65 61 64 65 72 73 0a 2a 2a 20  base readers.** 
07d0: 20 20 20 20 64 65 74 65 63 74 20 74 68 65 20 6e      detect the n
07e0: 65 77 20 2a 2d 77 61 6c 20 66 69 6c 65 20 61 6e  ew *-wal file an
07f0: 64 20 72 65 61 64 20 74 68 65 20 64 61 74 61 62  d read the datab
0800: 61 73 65 20 69 6e 20 77 61 6c 20 6d 6f 64 65 2e  ase in wal mode.
0810: 20 41 74 0a 2a 2a 20 20 20 20 20 74 68 69 73 20   At.**     this 
0820: 70 6f 69 6e 74 20 74 68 65 79 20 73 65 65 20 74  point they see t
0830: 68 65 20 6e 65 77 20 76 65 72 73 69 6f 6e 20 6f  he new version o
0840: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2d  f the database -
0850: 20 69 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20 20 20   including.**   
0860: 20 20 74 68 65 20 75 70 64 61 74 65 73 20 6d 61    the updates ma
0870: 64 65 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  de as part of th
0880: 65 20 52 42 55 20 75 70 64 61 74 65 2e 0a 2a 2a  e RBU update..**
0890: 20 0a 2a 2a 20 20 33 29 20 54 68 65 20 6e 65 77   .**  3) The new
08a0: 20 2a 2d 77 61 6c 20 66 69 6c 65 20 69 73 20 63   *-wal file is c
08b0: 68 65 63 6b 70 6f 69 6e 74 65 64 2e 20 54 68 69  heckpointed. Thi
08c0: 73 20 70 72 6f 63 65 65 64 73 20 69 6e 20 74 68  s proceeds in th
08d0: 65 20 73 61 6d 65 20 77 61 79 20 0a 2a 2a 20 20  e same way .**  
08e0: 20 20 20 61 73 20 61 20 72 65 67 75 6c 61 72 20     as a regular 
08f0: 64 61 74 61 62 61 73 65 20 63 68 65 63 6b 70 6f  database checkpo
0900: 69 6e 74 2c 20 65 78 63 65 70 74 20 74 68 61 74  int, except that
0910: 20 61 20 73 69 6e 67 6c 65 20 66 72 61 6d 65 20   a single frame 
0920: 69 73 0a 2a 2a 20 20 20 20 20 63 68 65 63 6b 70  is.**     checkp
0930: 6f 69 6e 74 65 64 20 65 61 63 68 20 74 69 6d 65  ointed each time
0940: 20 73 71 6c 69 74 65 33 72 62 75 5f 73 74 65 70   sqlite3rbu_step
0950: 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 20 49 66  () is called. If
0960: 20 74 68 65 20 52 42 55 0a 2a 2a 20 20 20 20 20   the RBU.**     
0970: 68 61 6e 64 6c 65 20 69 73 20 63 6c 6f 73 65 64  handle is closed
0980: 20 62 65 66 6f 72 65 20 74 68 65 20 65 6e 74 69   before the enti
0990: 72 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 69 73  re *-wal file is
09a0: 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 2c 0a 2a   checkpointed,.*
09b0: 2a 20 20 20 20 20 74 68 65 20 63 68 65 63 6b 70  *     the checkp
09c0: 6f 69 6e 74 20 70 72 6f 67 72 65 73 73 20 69 73  oint progress is
09d0: 20 73 61 76 65 64 20 69 6e 20 74 68 65 20 52 42   saved in the RB
09e0: 55 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74  U database and t
09f0: 68 65 0a 2a 2a 20 20 20 20 20 63 68 65 63 6b 70  he.**     checkp
0a00: 6f 69 6e 74 20 63 61 6e 20 62 65 20 72 65 73 75  oint can be resu
0a10: 6d 65 64 20 62 79 20 61 6e 6f 74 68 65 72 20 52  med by another R
0a20: 42 55 20 63 6c 69 65 6e 74 20 61 74 20 73 6f 6d  BU client at som
0a30: 65 20 70 6f 69 6e 74 20 69 6e 0a 2a 2a 20 20 20  e point in.**   
0a40: 20 20 74 68 65 20 66 75 74 75 72 65 2e 0a 2a 2a    the future..**
0a50: 0a 2a 2a 20 50 4f 54 45 4e 54 49 41 4c 20 50 52  .** POTENTIAL PR
0a60: 4f 42 4c 45 4d 53 0a 2a 2a 20 0a 2a 2a 20 20 54  OBLEMS.** .**  T
0a70: 68 65 20 72 65 6e 61 6d 65 28 29 20 63 61 6c 6c  he rename() call
0a80: 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 70 6f   might not be po
0a90: 72 74 61 62 6c 65 2e 20 41 6e 64 20 52 42 55 20  rtable. And RBU 
0aa0: 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  is not currently
0ab0: 0a 2a 2a 20 20 73 79 6e 63 69 6e 67 20 74 68 65  .**  syncing the
0ac0: 20 64 69 72 65 63 74 6f 72 79 20 61 66 74 65 72   directory after
0ad0: 20 72 65 6e 61 6d 69 6e 67 20 74 68 65 20 66 69   renaming the fi
0ae0: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 57 68 65 6e 20  le..**.**  When 
0af0: 73 74 61 74 65 20 69 73 20 73 61 76 65 64 2c 20  state is saved, 
0b00: 61 6e 79 20 63 6f 6d 6d 69 74 20 74 6f 20 74 68  any commit to th
0b10: 65 20 2a 2d 6f 61 6c 20 66 69 6c 65 20 61 6e 64  e *-oal file and
0b20: 20 74 68 65 20 63 6f 6d 6d 69 74 20 74 6f 0a 2a   the commit to.*
0b30: 2a 20 20 74 68 65 20 52 42 55 20 75 70 64 61 74  *  the RBU updat
0b40: 65 20 64 61 74 61 62 61 73 65 20 61 72 65 20 6e  e database are n
0b50: 6f 74 20 61 74 6f 6d 69 63 2e 20 53 6f 20 69 66  ot atomic. So if
0b60: 20 74 68 65 20 70 6f 77 65 72 20 66 61 69 6c 73   the power fails
0b70: 20 61 74 20 74 68 65 0a 2a 2a 20 20 77 72 6f 6e   at the.**  wron
0b80: 67 20 6d 6f 6d 65 6e 74 20 74 68 65 79 20 6d 69  g moment they mi
0b90: 67 68 74 20 67 65 74 20 6f 75 74 20 6f 66 20 73  ght get out of s
0ba0: 79 6e 63 2e 20 41 73 20 74 68 65 20 6d 61 69 6e  ync. As the main
0bb0: 20 64 61 74 61 62 61 73 65 20 77 69 6c 6c 20 62   database will b
0bc0: 65 0a 2a 2a 20 20 63 6f 6d 6d 69 74 74 65 64 20  e.**  committed 
0bd0: 62 65 66 6f 72 65 20 74 68 65 20 52 42 55 20 75  before the RBU u
0be0: 70 64 61 74 65 20 64 61 74 61 62 61 73 65 20 74  pdate database t
0bf0: 68 69 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20  his will likely 
0c00: 65 69 74 68 65 72 20 6a 75 73 74 0a 2a 2a 20 20  either just.**  
0c10: 70 61 73 73 20 75 6e 6e 6f 74 69 63 65 64 2c 20  pass unnoticed, 
0c20: 6f 72 20 72 65 73 75 6c 74 20 69 6e 20 53 51 4c  or result in SQL
0c30: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 65  ITE_CONSTRAINT e
0c40: 72 72 6f 72 73 20 28 64 75 65 20 74 6f 20 55 4e  rrors (due to UN
0c50: 49 51 55 45 0a 2a 2a 20 20 63 6f 6e 73 74 72 61  IQUE.**  constra
0c60: 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 73 29 2e  int violations).
0c70: 0a 2a 2a 0a 2a 2a 20 20 49 66 20 73 6f 6d 65 20  .**.**  If some 
0c80: 63 6c 69 65 6e 74 20 64 6f 65 73 20 6d 6f 64 69  client does modi
0c90: 66 79 20 74 68 65 20 74 61 72 67 65 74 20 64 61  fy the target da
0ca0: 74 61 62 61 73 65 20 6d 69 64 20 52 42 55 20 75  tabase mid RBU u
0cb0: 70 64 61 74 65 2c 20 6f 72 20 73 6f 6d 65 0a 2a  pdate, or some.*
0cc0: 2a 20 20 6f 74 68 65 72 20 65 72 72 6f 72 20 6f  *  other error o
0cd0: 63 63 75 72 73 2c 20 74 68 65 20 52 42 55 20 65  ccurs, the RBU e
0ce0: 78 74 65 6e 73 69 6f 6e 20 77 69 6c 6c 20 6b 65  xtension will ke
0cf0: 65 70 20 74 68 72 6f 77 69 6e 67 20 65 72 72 6f  ep throwing erro
0d00: 72 73 2e 20 49 74 27 73 0a 2a 2a 20 20 6e 6f 74  rs. It's.**  not
0d10: 20 72 65 61 6c 6c 79 20 63 6c 65 61 72 20 68 6f   really clear ho
0d20: 77 20 74 6f 20 67 65 74 20 6f 75 74 20 6f 66 20  w to get out of 
0d30: 74 68 69 73 20 73 74 61 74 65 2e 20 54 68 65 20  this state. The 
0d40: 73 79 73 74 65 6d 20 63 6f 75 6c 64 20 6a 75 73  system could jus
0d50: 74 0a 2a 2a 20 20 62 79 20 64 65 6c 65 74 65 20  t.**  by delete 
0d60: 74 68 65 20 52 42 55 20 75 70 64 61 74 65 20 64  the RBU update d
0d70: 61 74 61 62 61 73 65 20 61 6e 64 20 2a 2d 6f 61  atabase and *-oa
0d80: 6c 20 66 69 6c 65 20 61 6e 64 20 68 61 76 65 20  l file and have 
0d90: 74 68 65 20 64 65 76 69 63 65 0a 2a 2a 20 20 64  the device.**  d
0da0: 6f 77 6e 6c 6f 61 64 20 74 68 65 20 75 70 64 61  ownload the upda
0db0: 74 65 20 61 67 61 69 6e 20 61 6e 64 20 73 74 61  te again and sta
0dc0: 72 74 20 6f 76 65 72 2e 0a 2a 2a 0a 2a 2a 20 20  rt over..**.**  
0dd0: 41 74 20 70 72 65 73 65 6e 74 2c 20 66 6f 72 20  At present, for 
0de0: 61 6e 20 55 50 44 41 54 45 2c 20 62 6f 74 68 20  an UPDATE, both 
0df0: 74 68 65 20 6e 65 77 2e 2a 20 61 6e 64 20 6f 6c  the new.* and ol
0e00: 64 2e 2a 20 72 65 63 6f 72 64 73 20 61 72 65 0a  d.* records are.
0e10: 2a 2a 20 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e  **  collected in
0e20: 20 74 68 65 20 72 62 75 5f 78 79 7a 20 74 61 62   the rbu_xyz tab
0e30: 6c 65 2e 20 41 6e 64 20 66 6f 72 20 62 6f 74 68  le. And for both
0e40: 20 55 50 44 41 54 45 73 20 61 6e 64 20 44 45 4c   UPDATEs and DEL
0e50: 45 54 45 73 20 61 6c 6c 0a 2a 2a 20 20 66 69 65  ETEs all.**  fie
0e60: 6c 64 73 20 61 72 65 20 63 6f 6c 6c 65 63 74 65  lds are collecte
0e70: 64 2e 20 20 54 68 69 73 20 6d 65 61 6e 73 20 77  d.  This means w
0e80: 65 27 72 65 20 70 72 6f 62 61 62 6c 79 20 77 72  e're probably wr
0e90: 69 74 69 6e 67 20 61 20 6c 6f 74 20 6d 6f 72 65  iting a lot more
0ea0: 0a 2a 2a 20 20 64 61 74 61 20 74 6f 20 64 69 73  .**  data to dis
0eb0: 6b 20 77 68 65 6e 20 73 61 76 69 6e 67 20 74 68  k when saving th
0ec0: 65 20 73 74 61 74 65 20 6f 66 20 61 6e 20 6f 6e  e state of an on
0ed0: 67 6f 69 6e 67 20 75 70 64 61 74 65 20 74 6f 20  going update to 
0ee0: 74 68 65 20 52 42 55 0a 2a 2a 20 20 75 70 64 61  the RBU.**  upda
0ef0: 74 65 20 64 61 74 61 62 61 73 65 20 74 68 61 6e  te database than
0f00: 20 69 73 20 73 74 72 69 63 74 6c 79 20 6e 65 63   is strictly nec
0f10: 65 73 73 61 72 79 2e 0a 2a 2a 20 0a 2a 2f 0a 0a  essary..** .*/..
0f20: 23 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74  #include <assert
0f30: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74  .h>.#include <st
0f40: 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  ring.h>.#include
0f50: 20 3c 73 74 64 69 6f 2e 68 3e 0a 0a 23 69 6e 63   <stdio.h>..#inc
0f60: 6c 75 64 65 20 22 73 71 6c 69 74 65 33 2e 68 22  lude "sqlite3.h"
0f70: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
0f80: 51 4c 49 54 45 5f 43 4f 52 45 29 20 7c 7c 20 64  QLITE_CORE) || d
0f90: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
0fa0: 41 42 4c 45 5f 52 42 55 29 0a 23 69 6e 63 6c 75  ABLE_RBU).#inclu
0fb0: 64 65 20 22 73 71 6c 69 74 65 33 72 62 75 2e 68  de "sqlite3rbu.h
0fc0: 22 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  "..#if defined(_
0fd0: 57 49 4e 33 32 5f 57 43 45 29 0a 23 69 6e 63 6c  WIN32_WCE).#incl
0fe0: 75 64 65 20 22 77 69 6e 64 6f 77 73 2e 68 22 0a  ude "windows.h".
0ff0: 23 65 6e 64 69 66 0a 0a 2f 2a 20 4d 61 78 69 6d  #endif../* Maxim
1000: 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 70 72 65  um number of pre
1010: 70 61 72 65 64 20 55 50 44 41 54 45 20 73 74 61  pared UPDATE sta
1020: 74 65 6d 65 6e 74 73 20 68 65 6c 64 20 62 79 20  tements held by 
1030: 74 68 69 73 20 6d 6f 64 75 6c 65 20 2a 2f 0a 23  this module */.#
1040: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 52 42  define SQLITE_RB
1050: 55 5f 55 50 44 41 54 45 5f 43 41 43 48 45 53 49  U_UPDATE_CACHESI
1060: 5a 45 20 31 36 0a 0a 2f 2a 20 44 65 6c 74 61 20  ZE 16../* Delta 
1070: 63 68 65 63 6b 73 75 6d 73 20 64 69 73 61 62 6c  checksums disabl
1080: 65 64 20 62 79 20 64 65 66 61 75 6c 74 2e 20 20  ed by default.  
1090: 43 6f 6d 70 69 6c 65 20 77 69 74 68 20 2d 44 52  Compile with -DR
10a0: 42 55 5f 45 4e 41 42 4c 45 5f 44 45 4c 54 41 5f  BU_ENABLE_DELTA_
10b0: 43 4b 53 55 4d 0a 2a 2a 20 74 6f 20 65 6e 61 62  CKSUM.** to enab
10c0: 6c 65 20 63 68 65 63 6b 73 75 6d 20 76 65 72 69  le checksum veri
10d0: 66 69 63 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66  fication..*/.#if
10e0: 6e 64 65 66 20 52 42 55 5f 45 4e 41 42 4c 45 5f  ndef RBU_ENABLE_
10f0: 44 45 4c 54 41 5f 43 4b 53 55 4d 0a 23 20 64 65  DELTA_CKSUM.# de
1100: 66 69 6e 65 20 52 42 55 5f 45 4e 41 42 4c 45 5f  fine RBU_ENABLE_
1110: 44 45 4c 54 41 5f 43 4b 53 55 4d 20 30 0a 23 65  DELTA_CKSUM 0.#e
1120: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 77 61 70  ndif../*.** Swap
1130: 20 74 77 6f 20 6f 62 6a 65 63 74 73 20 6f 66 20   two objects of 
1140: 74 79 70 65 20 54 59 50 45 2e 0a 2a 2f 0a 23 69  type TYPE..*/.#i
1150: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
1160: 45 5f 41 4d 41 4c 47 41 4d 41 54 49 4f 4e 29 0a  E_AMALGAMATION).
1170: 23 20 64 65 66 69 6e 65 20 53 57 41 50 28 54 59  # define SWAP(TY
1180: 50 45 2c 41 2c 42 29 20 7b 54 59 50 45 20 74 3d  PE,A,B) {TYPE t=
1190: 41 3b 20 41 3d 42 3b 20 42 3d 74 3b 7d 0a 23 65  A; A=B; B=t;}.#e
11a0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
11b0: 72 62 75 5f 73 74 61 74 65 20 74 61 62 6c 65 20  rbu_state table 
11c0: 69 73 20 75 73 65 64 20 74 6f 20 73 61 76 65 20  is used to save 
11d0: 74 68 65 20 73 74 61 74 65 20 6f 66 20 61 20 70  the state of a p
11e0: 61 72 74 69 61 6c 6c 79 20 61 70 70 6c 69 65 64  artially applied
11f0: 0a 2a 2a 20 75 70 64 61 74 65 20 73 6f 20 74 68  .** update so th
1200: 61 74 20 69 74 20 63 61 6e 20 62 65 20 72 65 73  at it can be res
1210: 75 6d 65 64 20 6c 61 74 65 72 2e 20 54 68 65 20  umed later. The 
1220: 74 61 62 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f  table consists o
1230: 66 20 69 6e 74 65 67 65 72 0a 2a 2a 20 6b 65 79  f integer.** key
1240: 73 20 6d 61 70 70 65 64 20 74 6f 20 76 61 6c 75  s mapped to valu
1250: 65 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  es as follows:.*
1260: 2a 0a 2a 2a 20 52 42 55 5f 53 54 41 54 45 5f 53  *.** RBU_STATE_S
1270: 54 41 47 45 3a 0a 2a 2a 20 20 20 4d 61 79 20 62  TAGE:.**   May b
1280: 65 20 73 65 74 20 74 6f 20 69 6e 74 65 67 65 72  e set to integer
1290: 20 76 61 6c 75 65 73 20 31 2c 20 32 2c 20 34 20   values 1, 2, 4 
12a0: 6f 72 20 35 2e 20 41 73 20 66 6f 6c 6c 6f 77 73  or 5. As follows
12b0: 3a 0a 2a 2a 20 20 20 20 20 20 20 31 3a 20 74 68  :.**       1: th
12c0: 65 20 2a 2d 72 62 75 20 66 69 6c 65 20 69 73 20  e *-rbu file is 
12d0: 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
12e0: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a  construction..**
12f0: 20 20 20 20 20 20 20 32 3a 20 74 68 65 20 2a 2d         2: the *-
1300: 72 62 75 20 66 69 6c 65 20 68 61 73 20 62 65 65  rbu file has bee
1310: 6e 20 63 6f 6e 73 74 72 75 63 74 65 64 2c 20 62  n constructed, b
1320: 75 74 20 6e 6f 74 20 79 65 74 20 6d 6f 76 65 64  ut not yet moved
1330: 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 74 6f   .**          to
1340: 20 74 68 65 20 2a 2d 77 61 6c 20 70 61 74 68 2e   the *-wal path.
1350: 0a 2a 2a 20 20 20 20 20 20 20 34 3a 20 74 68 65  .**       4: the
1360: 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 73 20 75   checkpoint is u
1370: 6e 64 65 72 77 61 79 2e 0a 2a 2a 20 20 20 20 20  nderway..**     
1380: 20 20 35 3a 20 74 68 65 20 72 62 75 20 75 70 64    5: the rbu upd
1390: 61 74 65 20 68 61 73 20 62 65 65 6e 20 63 68 65  ate has been che
13a0: 63 6b 70 6f 69 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a  ckpointed..**.**
13b0: 20 52 42 55 5f 53 54 41 54 45 5f 54 42 4c 3a 0a   RBU_STATE_TBL:.
13c0: 2a 2a 20 20 20 4f 6e 6c 79 20 76 61 6c 69 64 20  **   Only valid 
13d0: 69 66 20 53 54 41 47 45 3d 3d 31 2e 20 54 68 65  if STAGE==1. The
13e0: 20 74 61 72 67 65 74 20 64 61 74 61 62 61 73 65   target database
13f0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
1400: 6c 65 20 0a 2a 2a 20 20 20 63 75 72 72 65 6e 74  le .**   current
1410: 6c 79 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  ly being written
1420: 2e 0a 2a 2a 0a 2a 2a 20 52 42 55 5f 53 54 41 54  ..**.** RBU_STAT
1430: 45 5f 49 44 58 3a 0a 2a 2a 20 20 20 4f 6e 6c 79  E_IDX:.**   Only
1440: 20 76 61 6c 69 64 20 69 66 20 53 54 41 47 45 3d   valid if STAGE=
1450: 3d 31 2e 20 54 68 65 20 74 61 72 67 65 74 20 64  =1. The target d
1460: 61 74 61 62 61 73 65 20 6e 61 6d 65 20 6f 66 20  atabase name of 
1470: 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20 20 20  the index .**   
1480: 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20  currently being 
1490: 77 72 69 74 74 65 6e 2c 20 6f 72 20 4e 55 4c 4c  written, or NULL
14a0: 20 69 66 20 74 68 65 20 6d 61 69 6e 20 74 61 62   if the main tab
14b0: 6c 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  le is currently 
14c0: 62 65 69 6e 67 0a 2a 2a 20 20 20 75 70 64 61 74  being.**   updat
14d0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 42 55 5f 53 54  ed..**.** RBU_ST
14e0: 41 54 45 5f 52 4f 57 3a 0a 2a 2a 20 20 20 4f 6e  ATE_ROW:.**   On
14f0: 6c 79 20 76 61 6c 69 64 20 69 66 20 53 54 41 47  ly valid if STAG
1500: 45 3d 3d 31 2e 20 4e 75 6d 62 65 72 20 6f 66 20  E==1. Number of 
1510: 72 6f 77 73 20 61 6c 72 65 61 64 79 20 70 72 6f  rows already pro
1520: 63 65 73 73 65 64 20 66 6f 72 20 74 68 65 20 63  cessed for the c
1530: 75 72 72 65 6e 74 0a 2a 2a 20 20 20 74 61 62 6c  urrent.**   tabl
1540: 65 2f 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 52  e/index..**.** R
1550: 42 55 5f 53 54 41 54 45 5f 50 52 4f 47 52 45 53  BU_STATE_PROGRES
1560: 53 3a 0a 2a 2a 20 20 20 54 72 62 75 6c 20 6e 75  S:.**   Trbul nu
1570: 6d 62 65 72 20 6f 66 20 73 71 6c 69 74 65 33 72  mber of sqlite3r
1580: 62 75 5f 73 74 65 70 28 29 20 63 61 6c 6c 73 20  bu_step() calls 
1590: 6d 61 64 65 20 73 6f 20 66 61 72 20 61 73 20 70  made so far as p
15a0: 61 72 74 20 6f 66 20 74 68 69 73 0a 2a 2a 20 20  art of this.**  
15b0: 20 72 62 75 20 75 70 64 61 74 65 2e 0a 2a 2a 0a   rbu update..**.
15c0: 2a 2a 20 52 42 55 5f 53 54 41 54 45 5f 43 4b 50  ** RBU_STATE_CKP
15d0: 54 3a 0a 2a 2a 20 20 20 56 61 6c 69 64 20 69 66  T:.**   Valid if
15e0: 20 53 54 41 47 45 3d 3d 34 2e 20 54 68 65 20 36   STAGE==4. The 6
15f0: 34 2d 62 69 74 20 63 68 65 63 6b 73 75 6d 20 61  4-bit checksum a
1600: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
1610: 68 65 20 77 61 6c 2d 69 6e 64 65 78 0a 2a 2a 20  he wal-index.** 
1620: 20 20 68 65 61 64 65 72 20 63 72 65 61 74 65 64    header created
1630: 20 62 79 20 72 65 63 6f 76 65 72 69 6e 67 20 74   by recovering t
1640: 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 2e 20 54  he *-wal file. T
1650: 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 64  his is used to d
1660: 65 74 65 63 74 0a 2a 2a 20 20 20 63 61 73 65 73  etect.**   cases
1670: 20 77 68 65 6e 20 61 6e 6f 74 68 65 72 20 63 6c   when another cl
1680: 69 65 6e 74 20 61 70 70 65 6e 64 73 20 66 72 61  ient appends fra
1690: 6d 65 73 20 74 6f 20 74 68 65 20 2a 2d 77 61 6c  mes to the *-wal
16a0: 20 66 69 6c 65 20 69 6e 20 74 68 65 0a 2a 2a 20   file in the.** 
16b0: 20 20 6d 69 64 64 6c 65 20 6f 66 20 61 6e 20 69    middle of an i
16c0: 6e 63 72 65 6d 65 6e 74 61 6c 20 63 68 65 63 6b  ncremental check
16d0: 70 6f 69 6e 74 20 28 61 6e 20 69 6e 63 72 65 6d  point (an increm
16e0: 65 6e 74 61 6c 20 63 68 65 63 6b 70 6f 69 6e 74  ental checkpoint
16f0: 20 63 61 6e 6e 6f 74 0a 2a 2a 20 20 20 62 65 20   cannot.**   be 
1700: 63 6f 6e 74 69 6e 75 65 64 20 69 66 20 74 68 69  continued if thi
1710: 73 20 68 61 70 70 65 6e 73 29 2e 0a 2a 2a 0a 2a  s happens)..**.*
1720: 2a 20 52 42 55 5f 53 54 41 54 45 5f 43 4f 4f 4b  * RBU_STATE_COOK
1730: 49 45 3a 0a 2a 2a 20 20 20 56 61 6c 69 64 20 69  IE:.**   Valid i
1740: 66 20 53 54 41 47 45 3d 3d 31 2e 20 54 68 65 20  f STAGE==1. The 
1750: 63 75 72 72 65 6e 74 20 63 68 61 6e 67 65 2d 63  current change-c
1760: 6f 75 6e 74 65 72 20 63 6f 6f 6b 69 65 20 76 61  ounter cookie va
1770: 6c 75 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 20  lue in the .**  
1780: 20 74 61 72 67 65 74 20 64 62 20 66 69 6c 65 2e   target db file.
1790: 0a 2a 2a 0a 2a 2a 20 52 42 55 5f 53 54 41 54 45  .**.** RBU_STATE
17a0: 5f 4f 41 4c 53 5a 3a 0a 2a 2a 20 20 20 56 61 6c  _OALSZ:.**   Val
17b0: 69 64 20 69 66 20 53 54 41 47 45 3d 3d 31 2e 20  id if STAGE==1. 
17c0: 54 68 65 20 73 69 7a 65 20 69 6e 20 62 79 74 65  The size in byte
17d0: 73 20 6f 66 20 74 68 65 20 2a 2d 6f 61 6c 20 66  s of the *-oal f
17e0: 69 6c 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ile..*/.#define 
17f0: 52 42 55 5f 53 54 41 54 45 5f 53 54 41 47 45 20  RBU_STATE_STAGE 
1800: 20 20 20 20 20 20 20 31 0a 23 64 65 66 69 6e 65         1.#define
1810: 20 52 42 55 5f 53 54 41 54 45 5f 54 42 4c 20 20   RBU_STATE_TBL  
1820: 20 20 20 20 20 20 20 20 32 0a 23 64 65 66 69 6e          2.#defin
1830: 65 20 52 42 55 5f 53 54 41 54 45 5f 49 44 58 20  e RBU_STATE_IDX 
1840: 20 20 20 20 20 20 20 20 20 33 0a 23 64 65 66 69           3.#defi
1850: 6e 65 20 52 42 55 5f 53 54 41 54 45 5f 52 4f 57  ne RBU_STATE_ROW
1860: 20 20 20 20 20 20 20 20 20 20 34 0a 23 64 65 66            4.#def
1870: 69 6e 65 20 52 42 55 5f 53 54 41 54 45 5f 50 52  ine RBU_STATE_PR
1880: 4f 47 52 45 53 53 20 20 20 20 20 35 0a 23 64 65  OGRESS     5.#de
1890: 66 69 6e 65 20 52 42 55 5f 53 54 41 54 45 5f 43  fine RBU_STATE_C
18a0: 4b 50 54 20 20 20 20 20 20 20 20 20 36 0a 23 64  KPT         6.#d
18b0: 65 66 69 6e 65 20 52 42 55 5f 53 54 41 54 45 5f  efine RBU_STATE_
18c0: 43 4f 4f 4b 49 45 20 20 20 20 20 20 20 37 0a 23  COOKIE       7.#
18d0: 64 65 66 69 6e 65 20 52 42 55 5f 53 54 41 54 45  define RBU_STATE
18e0: 5f 4f 41 4c 53 5a 20 20 20 20 20 20 20 20 38 0a  _OALSZ        8.
18f0: 23 64 65 66 69 6e 65 20 52 42 55 5f 53 54 41 54  #define RBU_STAT
1900: 45 5f 50 48 41 53 45 4f 4e 45 53 54 45 50 20 39  E_PHASEONESTEP 9
1910: 0a 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 53 54  ..#define RBU_ST
1920: 41 47 45 5f 4f 41 4c 20 20 20 20 20 20 20 20 20  AGE_OAL         
1930: 31 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 53 54  1.#define RBU_ST
1940: 41 47 45 5f 4d 4f 56 45 20 20 20 20 20 20 20 20  AGE_MOVE        
1950: 32 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 53 54  2.#define RBU_ST
1960: 41 47 45 5f 43 41 50 54 55 52 45 20 20 20 20 20  AGE_CAPTURE     
1970: 33 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 53 54  3.#define RBU_ST
1980: 41 47 45 5f 43 4b 50 54 20 20 20 20 20 20 20 20  AGE_CKPT        
1990: 34 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 53 54  4.#define RBU_ST
19a0: 41 47 45 5f 44 4f 4e 45 20 20 20 20 20 20 20 20  AGE_DONE        
19b0: 35 0a 0a 0a 23 64 65 66 69 6e 65 20 52 42 55 5f  5...#define RBU_
19c0: 43 52 45 41 54 45 5f 53 54 41 54 45 20 5c 0a 20  CREATE_STATE \. 
19d0: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 49   "CREATE TABLE I
19e0: 46 20 4e 4f 54 20 45 58 49 53 54 53 20 25 73 2e  F NOT EXISTS %s.
19f0: 72 62 75 5f 73 74 61 74 65 28 6b 20 49 4e 54 45  rbu_state(k INTE
1a00: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  GER PRIMARY KEY,
1a10: 20 76 29 22 0a 0a 74 79 70 65 64 65 66 20 73 74   v)"..typedef st
1a20: 72 75 63 74 20 52 62 75 46 72 61 6d 65 20 52 62  ruct RbuFrame Rb
1a30: 75 46 72 61 6d 65 3b 0a 74 79 70 65 64 65 66 20  uFrame;.typedef 
1a40: 73 74 72 75 63 74 20 52 62 75 4f 62 6a 49 74 65  struct RbuObjIte
1a50: 72 20 52 62 75 4f 62 6a 49 74 65 72 3b 0a 74 79  r RbuObjIter;.ty
1a60: 70 65 64 65 66 20 73 74 72 75 63 74 20 52 62 75  pedef struct Rbu
1a70: 53 74 61 74 65 20 52 62 75 53 74 61 74 65 3b 0a  State RbuState;.
1a80: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 72  typedef struct r
1a90: 62 75 5f 76 66 73 20 72 62 75 5f 76 66 73 3b 0a  bu_vfs rbu_vfs;.
1aa0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 72  typedef struct r
1ab0: 62 75 5f 66 69 6c 65 20 72 62 75 5f 66 69 6c 65  bu_file rbu_file
1ac0: 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ;.typedef struct
1ad0: 20 52 62 75 55 70 64 61 74 65 53 74 6d 74 20 52   RbuUpdateStmt R
1ae0: 62 75 55 70 64 61 74 65 53 74 6d 74 3b 0a 0a 23  buUpdateStmt;..#
1af0: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
1b00: 54 45 5f 41 4d 41 4c 47 41 4d 41 54 49 4f 4e 29  TE_AMALGAMATION)
1b10: 0a 74 79 70 65 64 65 66 20 75 6e 73 69 67 6e 65  .typedef unsigne
1b20: 64 20 69 6e 74 20 75 33 32 3b 0a 74 79 70 65 64  d int u32;.typed
1b30: 65 66 20 75 6e 73 69 67 6e 65 64 20 73 68 6f 72  ef unsigned shor
1b40: 74 20 75 31 36 3b 0a 74 79 70 65 64 65 66 20 75  t u16;.typedef u
1b50: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 75 38 3b  nsigned char u8;
1b60: 0a 74 79 70 65 64 65 66 20 73 71 6c 69 74 65 33  .typedef sqlite3
1b70: 5f 69 6e 74 36 34 20 69 36 34 3b 0a 23 65 6e 64  _int64 i64;.#end
1b80: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20  if../*.** These 
1b90: 76 61 6c 75 65 73 20 6d 75 73 74 20 6d 61 74 63  values must matc
1ba0: 68 20 74 68 65 20 76 61 6c 75 65 73 20 64 65 66  h the values def
1bb0: 69 6e 65 64 20 69 6e 20 77 61 6c 2e 63 20 66 6f  ined in wal.c fo
1bc0: 72 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74  r the equivalent
1bd0: 0a 2a 2a 20 6c 6f 63 6b 73 2e 20 54 68 65 73 65  .** locks. These
1be0: 20 61 72 65 20 6e 6f 74 20 6d 61 67 69 63 20 6e   are not magic n
1bf0: 75 6d 62 65 72 73 20 61 73 20 74 68 65 79 20 61  umbers as they a
1c00: 72 65 20 70 61 72 74 20 6f 66 20 74 68 65 20 53  re part of the S
1c10: 51 4c 69 74 65 20 66 69 6c 65 0a 2a 2a 20 66 6f  QLite file.** fo
1c20: 72 6d 61 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  rmat..*/.#define
1c30: 20 57 41 4c 5f 4c 4f 43 4b 5f 57 52 49 54 45 20   WAL_LOCK_WRITE 
1c40: 20 30 0a 23 64 65 66 69 6e 65 20 57 41 4c 5f 4c   0.#define WAL_L
1c50: 4f 43 4b 5f 43 4b 50 54 20 20 20 31 0a 23 64 65  OCK_CKPT   1.#de
1c60: 66 69 6e 65 20 57 41 4c 5f 4c 4f 43 4b 5f 52 45  fine WAL_LOCK_RE
1c70: 41 44 30 20 20 33 0a 0a 23 64 65 66 69 6e 65 20  AD0  3..#define 
1c80: 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 52 42 55  SQLITE_FCNTL_RBU
1c90: 43 4e 54 20 20 20 20 35 31 34 39 32 31 36 0a 0a  CNT    5149216..
1ca0: 2f 2a 0a 2a 2a 20 41 20 73 74 72 75 63 74 75 72  /*.** A structur
1cb0: 65 20 74 6f 20 73 74 6f 72 65 20 76 61 6c 75 65  e to store value
1cc0: 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  s read from the 
1cd0: 72 62 75 5f 73 74 61 74 65 20 74 61 62 6c 65 20  rbu_state table 
1ce0: 69 6e 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74  in memory..*/.st
1cf0: 72 75 63 74 20 52 62 75 53 74 61 74 65 20 7b 0a  ruct RbuState {.
1d00: 20 20 69 6e 74 20 65 53 74 61 67 65 3b 0a 20 20    int eStage;.  
1d10: 63 68 61 72 20 2a 7a 54 62 6c 3b 0a 20 20 63 68  char *zTbl;.  ch
1d20: 61 72 20 2a 7a 49 64 78 3b 0a 20 20 69 36 34 20  ar *zIdx;.  i64 
1d30: 69 57 61 6c 43 6b 73 75 6d 3b 0a 20 20 69 6e 74  iWalCksum;.  int
1d40: 20 6e 52 6f 77 3b 0a 20 20 69 36 34 20 6e 50 72   nRow;.  i64 nPr
1d50: 6f 67 72 65 73 73 3b 0a 20 20 75 33 32 20 69 43  ogress;.  u32 iC
1d60: 6f 6f 6b 69 65 3b 0a 20 20 69 36 34 20 69 4f 61  ookie;.  i64 iOa
1d70: 6c 53 7a 3b 0a 20 20 69 36 34 20 6e 50 68 61 73  lSz;.  i64 nPhas
1d80: 65 4f 6e 65 53 74 65 70 3b 0a 7d 3b 0a 0a 73 74  eOneStep;.};..st
1d90: 72 75 63 74 20 52 62 75 55 70 64 61 74 65 53 74  ruct RbuUpdateSt
1da0: 6d 74 20 7b 0a 20 20 63 68 61 72 20 2a 7a 4d 61  mt {.  char *zMa
1db0: 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sk;             
1dc0: 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f         /* Copy o
1dd0: 66 20 75 70 64 61 74 65 20 6d 61 73 6b 20 75 73  f update mask us
1de0: 65 64 20 77 69 74 68 20 70 55 70 64 61 74 65 20  ed with pUpdate 
1df0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  */.  sqlite3_stm
1e00: 74 20 2a 70 55 70 64 61 74 65 3b 20 20 20 20 20  t *pUpdate;     
1e10: 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 75 70 64       /* Last upd
1e20: 61 74 65 20 73 74 61 74 65 6d 65 6e 74 20 28 6f  ate statement (o
1e30: 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 52 62 75  r NULL) */.  Rbu
1e40: 55 70 64 61 74 65 53 74 6d 74 20 2a 70 4e 65 78  UpdateStmt *pNex
1e50: 74 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  t;.};../*.** An 
1e60: 69 74 65 72 61 74 6f 72 20 6f 66 20 74 68 69 73  iterator of this
1e70: 20 74 79 70 65 20 69 73 20 75 73 65 64 20 74 6f   type is used to
1e80: 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
1e90: 20 61 6c 6c 20 6f 62 6a 65 63 74 73 20 69 6e 0a   all objects in.
1ea0: 2a 2a 20 74 68 65 20 74 61 72 67 65 74 20 64 61  ** the target da
1eb0: 74 61 62 61 73 65 20 74 68 61 74 20 72 65 71 75  tabase that requ
1ec0: 69 72 65 20 75 70 64 61 74 69 6e 67 2e 20 46 6f  ire updating. Fo
1ed0: 72 20 65 61 63 68 20 73 75 63 68 20 74 61 62 6c  r each such tabl
1ee0: 65 2c 20 74 68 65 0a 2a 2a 20 69 74 65 72 61 74  e, the.** iterat
1ef0: 6f 72 20 76 69 73 69 74 73 2c 20 69 6e 20 6f 72  or visits, in or
1f00: 64 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a  der:.**.**     *
1f10: 20 74 68 65 20 74 61 62 6c 65 20 69 74 73 65 6c   the table itsel
1f20: 66 2c 20 0a 2a 2a 20 20 20 20 20 2a 20 65 61 63  f, .**     * eac
1f30: 68 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 74  h index of the t
1f40: 61 62 6c 65 20 28 7a 65 72 6f 20 6f 72 20 6d 6f  able (zero or mo
1f50: 72 65 20 70 6f 69 6e 74 73 20 74 6f 20 76 69 73  re points to vis
1f60: 69 74 29 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 20  it), and.**     
1f70: 2a 20 61 20 73 70 65 63 69 61 6c 20 22 63 6c 65  * a special "cle
1f80: 61 6e 75 70 20 74 61 62 6c 65 22 20 73 74 61 74  anup table" stat
1f90: 65 2e 0a 2a 2a 0a 2a 2a 20 61 62 49 6e 64 65 78  e..**.** abIndex
1fa0: 65 64 3a 0a 2a 2a 20 20 20 49 66 20 74 68 65 20  ed:.**   If the 
1fb0: 74 61 62 6c 65 20 68 61 73 20 6e 6f 20 69 6e 64  table has no ind
1fc0: 65 78 65 73 20 6f 6e 20 69 74 2c 20 61 62 49 6e  exes on it, abIn
1fd0: 64 65 78 65 64 20 69 73 20 73 65 74 20 74 6f 20  dexed is set to 
1fe0: 4e 55 4c 4c 2e 20 4f 74 68 65 72 77 69 73 65 2c  NULL. Otherwise,
1ff0: 0a 2a 2a 20 20 20 69 74 20 70 6f 69 6e 74 73 20  .**   it points 
2000: 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66 20 66  to an array of f
2010: 6c 61 67 73 20 6e 54 62 6c 43 6f 6c 20 65 6c 65  lags nTblCol ele
2020: 6d 65 6e 74 73 20 69 6e 20 73 69 7a 65 2e 20 54  ments in size. T
2030: 68 65 20 66 6c 61 67 20 69 73 0a 2a 2a 20 20 20  he flag is.**   
2040: 73 65 74 20 66 6f 72 20 65 61 63 68 20 63 6f 6c  set for each col
2050: 75 6d 6e 20 74 68 61 74 20 69 73 20 65 69 74 68  umn that is eith
2060: 65 72 20 61 20 70 61 72 74 20 6f 66 20 74 68 65  er a part of the
2070: 20 50 4b 20 6f 72 20 61 20 70 61 72 74 20 6f 66   PK or a part of
2080: 20 61 6e 0a 2a 2a 20 20 20 69 6e 64 65 78 2e 20   an.**   index. 
2090: 4f 72 20 63 6c 65 61 72 20 6f 74 68 65 72 77 69  Or clear otherwi
20a0: 73 65 2e 0a 2a 2a 20 20 20 0a 2a 2f 0a 73 74 72  se..**   .*/.str
20b0: 75 63 74 20 52 62 75 4f 62 6a 49 74 65 72 20 7b  uct RbuObjIter {
20c0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
20d0: 2a 70 54 62 6c 49 74 65 72 3b 20 20 20 20 20 20  *pTblIter;      
20e0: 20 20 20 2f 2a 20 49 74 65 72 61 74 65 20 74 68     /* Iterate th
20f0: 72 6f 75 67 68 20 74 61 62 6c 65 73 20 2a 2f 0a  rough tables */.
2100: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
2110: 70 49 64 78 49 74 65 72 3b 20 20 20 20 20 20 20  pIdxIter;       
2120: 20 20 2f 2a 20 49 6e 64 65 78 20 69 74 65 72 61    /* Index itera
2130: 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 62  tor */.  int nTb
2140: 6c 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  lCol;           
2150: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
2160: 20 6f 66 20 61 7a 54 62 6c 43 6f 6c 5b 5d 20 61   of azTblCol[] a
2170: 72 72 61 79 20 2a 2f 0a 20 20 63 68 61 72 20 2a  rray */.  char *
2180: 2a 61 7a 54 62 6c 43 6f 6c 3b 20 20 20 20 20 20  *azTblCol;      
2190: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72            /* Arr
21a0: 61 79 20 6f 66 20 75 6e 71 75 6f 74 65 64 20 74  ay of unquoted t
21b0: 61 72 67 65 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d  arget column nam
21c0: 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  es */.  char **a
21d0: 7a 54 62 6c 54 79 70 65 3b 20 20 20 20 20 20 20  zTblType;       
21e0: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
21f0: 20 6f 66 20 74 61 72 67 65 74 20 63 6f 6c 75 6d   of target colum
2200: 6e 20 74 79 70 65 73 20 2a 2f 0a 20 20 69 6e 74  n types */.  int
2210: 20 2a 61 69 53 72 63 4f 72 64 65 72 3b 20 20 20   *aiSrcOrder;   
2220: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2230: 73 72 63 20 74 61 62 6c 65 20 63 6f 6c 20 2d 3e  src table col ->
2240: 20 74 61 72 67 65 74 20 74 61 62 6c 65 20 63 6f   target table co
2250: 6c 20 2a 2f 0a 20 20 75 38 20 2a 61 62 54 62 6c  l */.  u8 *abTbl
2260: 50 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Pk;             
2270: 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
2280: 6f 66 20 66 6c 61 67 73 2c 20 73 65 74 20 6f 6e  of flags, set on
2290: 20 74 61 72 67 65 74 20 50 4b 20 63 6f 6c 75 6d   target PK colum
22a0: 6e 73 20 2a 2f 0a 20 20 75 38 20 2a 61 62 4e 6f  ns */.  u8 *abNo
22b0: 74 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  tNull;          
22c0: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
22d0: 20 6f 66 20 66 6c 61 67 73 2c 20 73 65 74 20 6f   of flags, set o
22e0: 6e 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75 6d  n NOT NULL colum
22f0: 6e 73 20 2a 2f 0a 20 20 75 38 20 2a 61 62 49 6e  ns */.  u8 *abIn
2300: 64 65 78 65 64 3b 20 20 20 20 20 20 20 20 20 20  dexed;          
2310: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
2320: 20 6f 66 20 66 6c 61 67 73 2c 20 73 65 74 20 6f   of flags, set o
2330: 6e 20 69 6e 64 65 78 65 64 20 26 20 50 4b 20 63  n indexed & PK c
2340: 6f 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79  ols */.  int eTy
2350: 70 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pe;             
2360: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
2370: 65 20 74 79 70 65 20 2d 20 61 6e 20 52 42 55 5f  e type - an RBU_
2380: 50 4b 5f 58 58 58 20 76 61 6c 75 65 20 2a 2f 0a  PK_XXX value */.
2390: 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 76 61 72  .  /* Output var
23a0: 69 61 62 6c 65 73 2e 20 7a 54 62 6c 3d 3d 30 20  iables. zTbl==0 
23b0: 69 6d 70 6c 69 65 73 20 45 4f 46 2e 20 2a 2f 0a  implies EOF. */.
23c0: 20 20 69 6e 74 20 62 43 6c 65 61 6e 75 70 3b 20    int bCleanup; 
23d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23e0: 20 20 2f 2a 20 54 72 75 65 20 69 6e 20 22 63 6c    /* True in "cl
23f0: 65 61 6e 75 70 22 20 73 74 61 74 65 20 2a 2f 0a  eanup" state */.
2400: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
2410: 62 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  bl;             
2420: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 61 72    /* Name of tar
2430: 67 65 74 20 64 62 20 74 61 62 6c 65 20 2a 2f 0a  get db table */.
2440: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
2450: 61 74 61 54 62 6c 3b 20 20 20 20 20 20 20 20 20  ataTbl;         
2460: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 72 62 75    /* Name of rbu
2470: 20 64 62 20 74 61 62 6c 65 20 28 6f 72 20 6e 75   db table (or nu
2480: 6c 6c 29 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ll) */.  const c
2490: 68 61 72 20 2a 7a 49 64 78 3b 20 20 20 20 20 20  har *zIdx;      
24a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
24b0: 20 6f 66 20 74 61 72 67 65 74 20 64 62 20 69 6e   of target db in
24c0: 64 65 78 20 28 6f 72 20 6e 75 6c 6c 29 20 2a 2f  dex (or null) */
24d0: 0a 20 20 69 6e 74 20 69 54 6e 75 6d 3b 20 20 20  .  int iTnum;   
24e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24f0: 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20     /* Root page 
2500: 6f 66 20 63 75 72 72 65 6e 74 20 6f 62 6a 65 63  of current objec
2510: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 50 6b 54 6e  t */.  int iPkTn
2520: 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  um;             
2530: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 65 54 79         /* If eTy
2540: 70 65 3d 3d 45 58 54 45 52 4e 41 4c 2c 20 72 6f  pe==EXTERNAL, ro
2550: 6f 74 20 6f 66 20 50 4b 20 69 6e 64 65 78 20 2a  ot of PK index *
2560: 2f 0a 20 20 69 6e 74 20 62 55 6e 69 71 75 65 3b  /.  int bUnique;
2570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2580: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 69      /* Current i
2590: 6e 64 65 78 20 69 73 20 75 6e 69 71 75 65 20 2a  ndex is unique *
25a0: 2f 0a 20 20 69 6e 74 20 6e 49 6e 64 65 78 3b 20  /.  int nIndex; 
25b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25c0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
25d0: 20 61 75 78 2e 20 69 6e 64 65 78 65 73 20 6f 6e   aux. indexes on
25e0: 20 74 61 62 6c 65 20 7a 54 62 6c 20 2a 2f 0a 0a   table zTbl */..
25f0: 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 73 20    /* Statements 
2600: 63 72 65 61 74 65 64 20 62 79 20 72 62 75 4f 62  created by rbuOb
2610: 6a 49 74 65 72 50 72 65 70 61 72 65 41 6c 6c 28  jIterPrepareAll(
2620: 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b  ) */.  int nCol;
2630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2640: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2650: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 63   of columns in c
2660: 75 72 72 65 6e 74 20 6f 62 6a 65 63 74 20 2a 2f  urrent object */
2670: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
2680: 2a 70 53 65 6c 65 63 74 3b 20 20 20 20 20 20 20  *pSelect;       
2690: 20 20 20 2f 2a 20 53 6f 75 72 63 65 20 64 61 74     /* Source dat
26a0: 61 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73  a */.  sqlite3_s
26b0: 74 6d 74 20 2a 70 49 6e 73 65 72 74 3b 20 20 20  tmt *pInsert;   
26c0: 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 65 6d         /* Statem
26d0: 65 6e 74 20 66 6f 72 20 49 4e 53 45 52 54 20 6f  ent for INSERT o
26e0: 70 65 72 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 73  perations */.  s
26f0: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 44 65  qlite3_stmt *pDe
2700: 6c 65 74 65 3b 20 20 20 20 20 20 20 20 20 20 2f  lete;          /
2710: 2a 20 53 74 61 74 65 6d 65 6e 74 20 66 6f 72 20  * Statement for 
2720: 44 45 4c 45 54 45 20 6f 70 73 20 2a 2f 0a 20 20  DELETE ops */.  
2730: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 54  sqlite3_stmt *pT
2740: 6d 70 49 6e 73 65 72 74 3b 20 20 20 20 20 20 20  mpInsert;       
2750: 2f 2a 20 49 6e 73 65 72 74 20 69 6e 74 6f 20 72  /* Insert into r
2760: 62 75 5f 74 6d 70 5f 24 7a 44 61 74 61 54 62 6c  bu_tmp_$zDataTbl
2770: 20 2a 2f 0a 0a 20 20 2f 2a 20 4c 61 73 74 20 55   */..  /* Last U
2780: 50 44 41 54 45 20 75 73 65 64 20 28 66 6f 72 20  PDATE used (for 
2790: 50 4b 20 62 2d 74 72 65 65 20 75 70 64 61 74 65  PK b-tree update
27a0: 73 20 6f 6e 6c 79 29 2c 20 6f 72 20 4e 55 4c 4c  s only), or NULL
27b0: 2e 20 2a 2f 0a 20 20 52 62 75 55 70 64 61 74 65  . */.  RbuUpdate
27c0: 53 74 6d 74 20 2a 70 52 62 75 55 70 64 61 74 65  Stmt *pRbuUpdate
27d0: 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c 75  ;.};../*.** Valu
27e0: 65 73 20 66 6f 72 20 52 62 75 4f 62 6a 49 74 65  es for RbuObjIte
27f0: 72 2e 65 54 79 70 65 0a 2a 2a 0a 2a 2a 20 20 20  r.eType.**.**   
2800: 20 20 30 3a 20 54 61 62 6c 65 20 64 6f 65 73 20    0: Table does 
2810: 6e 6f 74 20 65 78 69 73 74 20 28 65 72 72 6f 72  not exist (error
2820: 29 0a 2a 2a 20 20 20 20 20 31 3a 20 54 61 62 6c  ).**     1: Tabl
2830: 65 20 68 61 73 20 61 6e 20 69 6d 70 6c 69 63 69  e has an implici
2840: 74 20 72 6f 77 69 64 2e 0a 2a 2a 20 20 20 20 20  t rowid..**     
2850: 32 3a 20 54 61 62 6c 65 20 68 61 73 20 61 6e 20  2: Table has an 
2860: 65 78 70 6c 69 63 69 74 20 49 50 4b 20 63 6f 6c  explicit IPK col
2870: 75 6d 6e 2e 0a 2a 2a 20 20 20 20 20 33 3a 20 54  umn..**     3: T
2880: 61 62 6c 65 20 68 61 73 20 61 6e 20 65 78 74 65  able has an exte
2890: 72 6e 61 6c 20 50 4b 20 69 6e 64 65 78 2e 0a 2a  rnal PK index..*
28a0: 2a 20 20 20 20 20 34 3a 20 54 61 62 6c 65 20 69  *     4: Table i
28b0: 73 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 2e  s WITHOUT ROWID.
28c0: 0a 2a 2a 20 20 20 20 20 35 3a 20 54 61 62 6c 65  .**     5: Table
28d0: 20 69 73 20 61 20 76 69 72 74 75 61 6c 20 74 61   is a virtual ta
28e0: 62 6c 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ble..*/.#define 
28f0: 52 42 55 5f 50 4b 5f 4e 4f 54 41 42 4c 45 20 20  RBU_PK_NOTABLE  
2900: 20 20 20 20 20 20 30 0a 23 64 65 66 69 6e 65 20        0.#define 
2910: 52 42 55 5f 50 4b 5f 4e 4f 4e 45 20 20 20 20 20  RBU_PK_NONE     
2920: 20 20 20 20 20 20 31 0a 23 64 65 66 69 6e 65 20        1.#define 
2930: 52 42 55 5f 50 4b 5f 49 50 4b 20 20 20 20 20 20  RBU_PK_IPK      
2940: 20 20 20 20 20 20 32 0a 23 64 65 66 69 6e 65 20        2.#define 
2950: 52 42 55 5f 50 4b 5f 45 58 54 45 52 4e 41 4c 20  RBU_PK_EXTERNAL 
2960: 20 20 20 20 20 20 33 0a 23 64 65 66 69 6e 65 20        3.#define 
2970: 52 42 55 5f 50 4b 5f 57 49 54 48 4f 55 54 5f 52  RBU_PK_WITHOUT_R
2980: 4f 57 49 44 20 20 34 0a 23 64 65 66 69 6e 65 20  OWID  4.#define 
2990: 52 42 55 5f 50 4b 5f 56 54 41 42 20 20 20 20 20  RBU_PK_VTAB     
29a0: 20 20 20 20 20 20 35 0a 0a 0a 2f 2a 0a 2a 2a 20        5.../*.** 
29b0: 57 69 74 68 69 6e 20 74 68 65 20 52 42 55 5f 53  Within the RBU_S
29c0: 54 41 47 45 5f 4f 41 4c 20 73 74 61 67 65 2c 20  TAGE_OAL stage, 
29d0: 65 61 63 68 20 63 61 6c 6c 20 74 6f 20 73 71 6c  each call to sql
29e0: 69 74 65 33 72 62 75 5f 73 74 65 70 28 29 20 70  ite3rbu_step() p
29f0: 65 72 66 6f 72 6d 73 0a 2a 2a 20 6f 6e 65 20 6f  erforms.** one o
2a00: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
2a10: 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 23  operations..*/.#
2a20: 64 65 66 69 6e 65 20 52 42 55 5f 49 4e 53 45 52  define RBU_INSER
2a30: 54 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20  T     1         
2a40: 20 2f 2a 20 49 6e 73 65 72 74 20 6f 6e 20 61 20   /* Insert on a 
2a50: 6d 61 69 6e 20 74 61 62 6c 65 20 62 2d 74 72 65  main table b-tre
2a60: 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 52 42 55  e */.#define RBU
2a70: 5f 44 45 4c 45 54 45 20 20 20 20 20 32 20 20 20  _DELETE     2   
2a80: 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65         /* Delete
2a90: 20 61 20 72 6f 77 20 66 72 6f 6d 20 61 20 6d 61   a row from a ma
2aa0: 69 6e 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20  in table b-tree 
2ab0: 2a 2f 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 52  */.#define RBU_R
2ac0: 45 50 4c 41 43 45 20 20 20 20 33 20 20 20 20 20  EPLACE    3     
2ad0: 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 61       /* Delete a
2ae0: 6e 64 20 74 68 65 6e 20 69 6e 73 65 72 74 20 61  nd then insert a
2af0: 20 72 6f 77 20 2a 2f 0a 23 64 65 66 69 6e 65 20   row */.#define 
2b00: 52 42 55 5f 49 44 58 5f 44 45 4c 45 54 45 20 34  RBU_IDX_DELETE 4
2b10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c            /* Del
2b20: 65 74 65 20 61 20 72 6f 77 20 66 72 6f 6d 20 61  ete a row from a
2b30: 6e 20 61 75 78 2e 20 69 6e 64 65 78 20 62 2d 74  n aux. index b-t
2b40: 72 65 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 52  ree */.#define R
2b50: 42 55 5f 49 44 58 5f 49 4e 53 45 52 54 20 35 20  BU_IDX_INSERT 5 
2b60: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 65           /* Inse
2b70: 72 74 20 6f 6e 20 61 6e 20 61 75 78 2e 20 69 6e  rt on an aux. in
2b80: 64 65 78 20 62 2d 74 72 65 65 20 2a 2f 0a 0a 23  dex b-tree */..#
2b90: 64 65 66 69 6e 65 20 52 42 55 5f 55 50 44 41 54  define RBU_UPDAT
2ba0: 45 20 20 20 20 20 36 20 20 20 20 20 20 20 20 20  E     6         
2bb0: 20 2f 2a 20 55 70 64 61 74 65 20 61 20 72 6f 77   /* Update a row
2bc0: 20 69 6e 20 61 20 6d 61 69 6e 20 74 61 62 6c 65   in a main table
2bd0: 20 62 2d 74 72 65 65 20 2a 2f 0a 0a 2f 2a 0a 2a   b-tree */../*.*
2be0: 2a 20 41 20 73 69 6e 67 6c 65 20 73 74 65 70 20  * A single step 
2bf0: 6f 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61  of an incrementa
2c00: 6c 20 63 68 65 63 6b 70 6f 69 6e 74 20 2d 20 66  l checkpoint - f
2c10: 72 61 6d 65 20 69 57 61 6c 46 72 61 6d 65 20 6f  rame iWalFrame o
2c20: 66 20 74 68 65 20 77 61 6c 0a 2a 2a 20 66 69 6c  f the wal.** fil
2c30: 65 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 70 69  e should be copi
2c40: 65 64 20 74 6f 20 70 61 67 65 20 69 44 62 50 61  ed to page iDbPa
2c50: 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ge of the databa
2c60: 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 72 75  se file..*/.stru
2c70: 63 74 20 52 62 75 46 72 61 6d 65 20 7b 0a 20 20  ct RbuFrame {.  
2c80: 75 33 32 20 69 44 62 50 61 67 65 3b 0a 20 20 75  u32 iDbPage;.  u
2c90: 33 32 20 69 57 61 6c 46 72 61 6d 65 3b 0a 7d 3b  32 iWalFrame;.};
2ca0: 0a 0a 2f 2a 0a 2a 2a 20 52 42 55 20 68 61 6e 64  ../*.** RBU hand
2cb0: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 6e 50 68 61 73 65  le..**.** nPhase
2cc0: 4f 6e 65 53 74 65 70 3a 0a 2a 2a 20 20 20 49 66  OneStep:.**   If
2cd0: 20 74 68 65 20 52 42 55 20 64 61 74 61 62 61 73   the RBU databas
2ce0: 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 72 62  e contains an rb
2cf0: 75 5f 63 6f 75 6e 74 20 74 61 62 6c 65 2c 20 74  u_count table, t
2d00: 68 69 73 20 76 61 6c 75 65 20 69 73 20 73 65 74  his value is set
2d10: 20 74 6f 0a 2a 2a 20 20 20 61 20 72 75 6e 6e 69   to.**   a runni
2d20: 6e 67 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74  ng estimate of t
2d30: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 2d 74  he number of b-t
2d40: 72 65 65 20 6f 70 65 72 61 74 69 6f 6e 73 20 72  ree operations r
2d50: 65 71 75 69 72 65 64 20 74 6f 20 0a 2a 2a 20 20  equired to .**  
2d60: 20 66 69 6e 69 73 68 20 70 6f 70 75 6c 61 74 69   finish populati
2d70: 6e 67 20 74 68 65 20 2a 2d 6f 61 6c 20 66 69 6c  ng the *-oal fil
2d80: 65 2e 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 74  e. This allows t
2d90: 68 65 20 73 71 6c 69 74 65 33 5f 62 70 5f 70 72  he sqlite3_bp_pr
2da0: 6f 67 72 65 73 73 28 29 0a 2a 2a 20 20 20 41 50  ogress().**   AP
2db0: 49 20 74 6f 20 63 61 6c 63 75 6c 61 74 65 20 74  I to calculate t
2dc0: 68 65 20 70 65 72 6d 79 72 69 61 64 61 67 65 20  he permyriadage 
2dd0: 70 72 6f 67 72 65 73 73 20 6f 66 20 70 6f 70 75  progress of popu
2de0: 6c 61 74 69 6e 67 20 74 68 65 20 2a 2d 6f 61 6c  lating the *-oal
2df0: 20 66 69 6c 65 0a 2a 2a 20 20 20 75 73 69 6e 67   file.**   using
2e00: 20 74 68 65 20 66 6f 72 6d 75 6c 61 3a 0a 2a 2a   the formula:.**
2e10: 0a 2a 2a 20 20 20 20 20 70 65 72 6d 79 72 69 61  .**     permyria
2e20: 64 61 67 65 20 3d 20 28 31 30 30 30 30 20 2a 20  dage = (10000 * 
2e30: 6e 50 72 6f 67 72 65 73 73 29 20 2f 20 6e 50 68  nProgress) / nPh
2e40: 61 73 65 4f 6e 65 53 74 65 70 0a 2a 2a 0a 2a 2a  aseOneStep.**.**
2e50: 20 20 20 6e 50 68 61 73 65 4f 6e 65 53 74 65 70     nPhaseOneStep
2e60: 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
2e70: 74 6f 20 74 68 65 20 73 75 6d 20 6f 66 3a 0a 2a  to the sum of:.*
2e80: 2a 0a 2a 2a 20 20 20 20 20 6e 52 6f 77 20 2a 20  *.**     nRow * 
2e90: 28 6e 49 6e 64 65 78 20 2b 20 31 29 0a 2a 2a 0a  (nIndex + 1).**.
2ea0: 2a 2a 20 20 20 66 6f 72 20 61 6c 6c 20 73 6f 75  **   for all sou
2eb0: 72 63 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68  rce tables in th
2ec0: 65 20 52 42 55 20 64 61 74 61 62 61 73 65 2c 20  e RBU database, 
2ed0: 77 68 65 72 65 20 6e 52 6f 77 20 69 73 20 74 68  where nRow is th
2ee0: 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 20 20 6f 66  e number.**   of
2ef0: 20 72 6f 77 73 20 69 6e 20 74 68 65 20 73 6f 75   rows in the sou
2f00: 72 63 65 20 74 61 62 6c 65 20 61 6e 64 20 6e 49  rce table and nI
2f10: 6e 64 65 78 20 74 68 65 20 6e 75 6d 62 65 72 20  ndex the number 
2f20: 6f 66 20 69 6e 64 65 78 65 73 20 6f 6e 20 74 68  of indexes on th
2f30: 65 0a 2a 2a 20 20 20 63 6f 72 72 65 73 70 6f 6e  e.**   correspon
2f40: 64 69 6e 67 20 74 61 72 67 65 74 20 64 61 74 61  ding target data
2f50: 62 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a  base table..**.*
2f60: 2a 20 20 20 54 68 69 73 20 65 73 74 69 6d 61 74  *   This estimat
2f70: 65 20 69 73 20 61 63 63 75 72 61 74 65 20 69 66  e is accurate if
2f80: 20 74 68 65 20 52 42 55 20 75 70 64 61 74 65 20   the RBU update 
2f90: 63 6f 6e 73 69 73 74 73 20 65 6e 74 69 72 65 6c  consists entirel
2fa0: 79 20 6f 66 0a 2a 2a 20 20 20 49 4e 53 45 52 54  y of.**   INSERT
2fb0: 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 48 6f 77   operations. How
2fc0: 65 76 65 72 2c 20 69 74 20 69 73 20 69 6e 61 63  ever, it is inac
2fd0: 63 75 72 61 74 65 20 69 66 3a 0a 2a 2a 0a 2a 2a  curate if:.**.**
2fe0: 20 20 20 20 20 2a 20 74 68 65 20 52 42 55 20 75       * the RBU u
2ff0: 70 64 61 74 65 20 63 6f 6e 74 61 69 6e 73 20 61  pdate contains a
3000: 6e 79 20 55 50 44 41 54 45 20 6f 70 65 72 61 74  ny UPDATE operat
3010: 69 6f 6e 73 2e 20 49 66 20 74 68 65 20 50 4b 20  ions. If the PK 
3020: 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 20 20 20  specified.**    
3030: 20 20 20 66 6f 72 20 61 6e 20 55 50 44 41 54 45     for an UPDATE
3040: 20 6f 70 65 72 61 74 69 6f 6e 20 64 6f 65 73 20   operation does 
3050: 6e 6f 74 20 65 78 69 73 74 20 69 6e 20 74 68 65  not exist in the
3060: 20 74 61 72 67 65 74 20 74 61 62 6c 65 2c 20 74   target table, t
3070: 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20 6e 6f 20  hen.**       no 
3080: 62 2d 74 72 65 65 20 6f 70 65 72 61 74 69 6f 6e  b-tree operation
3090: 73 20 61 72 65 20 72 65 71 75 69 72 65 64 20 6f  s are required o
30a0: 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 73 2e  n index b-trees.
30b0: 20 4f 72 20 69 66 20 74 68 65 20 0a 2a 2a 20 20   Or if the .**  
30c0: 20 20 20 20 20 73 70 65 63 69 66 69 65 64 20 50       specified P
30d0: 4b 20 64 6f 65 73 20 65 78 69 73 74 2c 20 74 68  K does exist, th
30e0: 65 6e 20 28 6e 49 6e 64 65 78 2a 32 29 20 73 75  en (nIndex*2) su
30f0: 63 68 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 72  ch operations ar
3100: 65 0a 2a 2a 20 20 20 20 20 20 20 72 65 71 75 69  e.**       requi
3110: 72 65 64 20 28 6f 6e 65 20 64 65 6c 65 74 65 20  red (one delete 
3120: 61 6e 64 20 6f 6e 65 20 69 6e 73 65 72 74 20 6f  and one insert o
3130: 6e 20 65 61 63 68 20 69 6e 64 65 78 20 62 2d 74  n each index b-t
3140: 72 65 65 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ree)..**.**     
3150: 2a 20 74 68 65 20 52 42 55 20 75 70 64 61 74 65  * the RBU update
3160: 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 44 45   contains any DE
3170: 4c 45 54 45 20 6f 70 65 72 61 74 69 6f 6e 73 20  LETE operations 
3180: 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 73 70  for which the sp
3190: 65 63 69 66 69 65 64 0a 2a 2a 20 20 20 20 20 20  ecified.**      
31a0: 20 50 4b 20 64 6f 65 73 20 6e 6f 74 20 65 78 69   PK does not exi
31b0: 73 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  st. In this case
31c0: 20 6e 6f 20 6f 70 65 72 61 74 69 6f 6e 73 20 61   no operations a
31d0: 72 65 20 72 65 71 75 69 72 65 64 20 6f 6e 20 69  re required on i
31e0: 6e 64 65 78 0a 2a 2a 20 20 20 20 20 20 20 62 2d  ndex.**       b-
31f0: 74 72 65 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  trees..**.**    
3200: 20 2a 20 74 68 65 20 52 42 55 20 75 70 64 61 74   * the RBU updat
3210: 65 20 63 6f 6e 74 61 69 6e 73 20 52 45 50 4c 41  e contains REPLA
3220: 43 45 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 54  CE operations. T
3230: 68 65 73 65 20 61 72 65 20 73 69 6d 69 6c 61 72  hese are similar
3240: 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20 55 50 44   to.**       UPD
3250: 41 54 45 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a  ATE operations..
3260: 2a 2a 0a 2a 2a 20 20 20 6e 50 68 61 73 65 4f 6e  **.**   nPhaseOn
3270: 65 53 74 65 70 20 69 73 20 75 70 64 61 74 65 64  eStep is updated
3280: 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72 20   to account for 
3290: 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61  the conditions a
32a0: 62 6f 76 65 20 64 75 72 69 6e 67 20 74 68 65 0a  bove during the.
32b0: 2a 2a 20 20 20 66 69 72 73 74 20 70 61 73 73 20  **   first pass 
32c0: 6f 66 20 65 61 63 68 20 73 6f 75 72 63 65 20 74  of each source t
32d0: 61 62 6c 65 2e 20 54 68 65 20 75 70 64 61 74 65  able. The update
32e0: 64 20 6e 50 68 61 73 65 4f 6e 65 53 74 65 70 20  d nPhaseOneStep 
32f0: 76 61 6c 75 65 20 69 73 0a 2a 2a 20 20 20 73 74  value is.**   st
3300: 6f 72 65 64 20 69 6e 20 74 68 65 20 72 62 75 5f  ored in the rbu_
3310: 73 74 61 74 65 20 74 61 62 6c 65 20 69 66 20 74  state table if t
3320: 68 65 20 52 42 55 20 75 70 64 61 74 65 20 69 73  he RBU update is
3330: 20 73 75 73 70 65 6e 64 65 64 2e 0a 2a 2f 0a 73   suspended..*/.s
3340: 74 72 75 63 74 20 73 71 6c 69 74 65 33 72 62 75  truct sqlite3rbu
3350: 20 7b 0a 20 20 69 6e 74 20 65 53 74 61 67 65 3b   {.  int eStage;
3360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3370: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66       /* Value of
3380: 20 52 42 55 5f 53 54 41 54 45 5f 53 54 41 47 45   RBU_STATE_STAGE
3390: 20 66 69 65 6c 64 20 2a 2f 0a 20 20 73 71 6c 69   field */.  sqli
33a0: 74 65 33 20 2a 64 62 4d 61 69 6e 3b 20 20 20 20  te3 *dbMain;    
33b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74              /* t
33c0: 61 72 67 65 74 20 64 61 74 61 62 61 73 65 20 68  arget database h
33d0: 61 6e 64 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74  andle */.  sqlit
33e0: 65 33 20 2a 64 62 52 62 75 3b 20 20 20 20 20 20  e3 *dbRbu;      
33f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72 62             /* rb
3400: 75 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  u database handl
3410: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 61  e */.  char *zTa
3420: 72 67 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  rget;           
3430: 20 20 20 20 20 20 20 2f 2a 20 50 61 74 68 20 74         /* Path t
3440: 6f 20 74 61 72 67 65 74 20 64 62 20 2a 2f 0a 20  o target db */. 
3450: 20 63 68 61 72 20 2a 7a 52 62 75 3b 20 20 20 20   char *zRbu;    
3460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3470: 20 2f 2a 20 50 61 74 68 20 74 6f 20 72 62 75 20   /* Path to rbu 
3480: 64 62 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53  db */.  char *zS
3490: 74 61 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  tate;           
34a0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 74 68 20          /* Path 
34b0: 74 6f 20 73 74 61 74 65 20 64 62 20 28 6f 72 20  to state db (or 
34c0: 4e 55 4c 4c 20 69 66 20 7a 52 62 75 29 20 2a 2f  NULL if zRbu) */
34d0: 0a 20 20 63 68 61 72 20 7a 53 74 61 74 65 44 62  .  char zStateDb
34e0: 5b 35 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  [5];            
34f0: 20 20 20 2f 2a 20 44 62 20 6e 61 6d 65 20 66 6f     /* Db name fo
3500: 72 20 73 74 61 74 65 20 28 22 73 74 61 74 22 20  r state ("stat" 
3510: 6f 72 20 22 6d 61 69 6e 22 29 20 2a 2f 0a 20 20  or "main") */.  
3520: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
3530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3540: 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65  /* Value returne
3550: 64 20 62 79 20 6c 61 73 74 20 72 62 75 5f 73 74  d by last rbu_st
3560: 65 70 28 29 20 63 61 6c 6c 20 2a 2f 0a 20 20 63  ep() call */.  c
3570: 68 61 72 20 2a 7a 45 72 72 6d 73 67 3b 20 20 20  har *zErrmsg;   
3580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3590: 2a 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20  * Error message 
35a0: 69 66 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  if rc!=SQLITE_OK
35b0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 74 65 70 3b   */.  int nStep;
35c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35d0: 20 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 70 72        /* Rows pr
35e0: 6f 63 65 73 73 65 64 20 66 6f 72 20 63 75 72 72  ocessed for curr
35f0: 65 6e 74 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ent object */.  
3600: 69 6e 74 20 6e 50 72 6f 67 72 65 73 73 3b 20 20  int nProgress;  
3610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3620: 2f 2a 20 52 6f 77 73 20 70 72 6f 63 65 73 73 65  /* Rows processe
3630: 64 20 66 6f 72 20 61 6c 6c 20 6f 62 6a 65 63 74  d for all object
3640: 73 20 2a 2f 0a 20 20 52 62 75 4f 62 6a 49 74 65  s */.  RbuObjIte
3650: 72 20 6f 62 6a 69 74 65 72 3b 20 20 20 20 20 20  r objiter;      
3660: 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
3670: 6f 72 20 66 6f 72 20 73 6b 69 70 70 69 6e 67 20  or for skipping 
3680: 74 68 72 6f 75 67 68 20 74 62 6c 2f 69 64 78 20  through tbl/idx 
3690: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
36a0: 2a 7a 56 66 73 4e 61 6d 65 3b 20 20 20 20 20 20  *zVfsName;      
36b0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
36c0: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 72  automatically cr
36d0: 65 61 74 65 64 20 72 62 75 20 76 66 73 20 2a 2f  eated rbu vfs */
36e0: 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 54 61  .  rbu_file *pTa
36f0: 72 67 65 74 46 64 3b 20 20 20 20 20 20 20 20 20  rgetFd;         
3700: 20 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c     /* File handl
3710: 65 20 6f 70 65 6e 20 6f 6e 20 74 61 72 67 65 74  e open on target
3720: 20 64 62 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61   db */.  int nPa
3730: 67 65 50 65 72 53 65 63 74 6f 72 3b 20 20 20 20  gePerSector;    
3740: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
3750: 73 20 70 65 72 20 73 65 63 74 6f 72 20 66 6f 72  s per sector for
3760: 20 70 54 61 72 67 65 74 46 64 20 2a 2f 0a 20 20   pTargetFd */.  
3770: 69 36 34 20 69 4f 61 6c 53 7a 3b 0a 20 20 69 36  i64 iOalSz;.  i6
3780: 34 20 6e 50 68 61 73 65 4f 6e 65 53 74 65 70 3b  4 nPhaseOneStep;
3790: 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  ..  /* The follo
37a0: 77 69 6e 67 20 73 74 61 74 65 20 76 61 72 69 61  wing state varia
37b0: 62 6c 65 73 20 61 72 65 20 75 73 65 64 20 61 73  bles are used as
37c0: 20 70 61 72 74 20 6f 66 20 74 68 65 20 69 6e 63   part of the inc
37d0: 72 65 6d 65 6e 74 61 6c 0a 20 20 2a 2a 20 63 68  remental.  ** ch
37e0: 65 63 6b 70 6f 69 6e 74 20 73 74 61 67 65 20 28  eckpoint stage (
37f0: 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47  eStage==RBU_STAG
3800: 45 5f 43 4b 50 54 29 2e 20 53 65 65 20 63 6f 6d  E_CKPT). See com
3810: 6d 65 6e 74 73 20 73 75 72 72 6f 75 6e 64 69 6e  ments surroundin
3820: 67 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  g.  ** function 
3830: 72 62 75 53 65 74 75 70 43 68 65 63 6b 70 6f 69  rbuSetupCheckpoi
3840: 6e 74 28 29 20 66 6f 72 20 64 65 74 61 69 6c 73  nt() for details
3850: 2e 20 20 2a 2f 0a 20 20 75 33 32 20 69 4d 61 78  .  */.  u32 iMax
3860: 46 72 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  Frame;          
3870: 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 72 67 65          /* Large
3880: 73 74 20 69 57 61 6c 46 72 61 6d 65 20 76 61 6c  st iWalFrame val
3890: 75 65 20 69 6e 20 61 46 72 61 6d 65 5b 5d 20 2a  ue in aFrame[] *
38a0: 2f 0a 20 20 75 33 32 20 6d 4c 6f 63 6b 3b 0a 20  /.  u32 mLock;. 
38b0: 20 69 6e 74 20 6e 46 72 61 6d 65 3b 20 20 20 20   int nFrame;    
38c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38d0: 20 2f 2a 20 45 6e 74 72 69 65 73 20 69 6e 20 61   /* Entries in a
38e0: 46 72 61 6d 65 5b 5d 20 61 72 72 61 79 20 2a 2f  Frame[] array */
38f0: 0a 20 20 69 6e 74 20 6e 46 72 61 6d 65 41 6c 6c  .  int nFrameAll
3900: 6f 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  oc;             
3910: 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20     /* Allocated 
3920: 73 69 7a 65 20 6f 66 20 61 46 72 61 6d 65 5b 5d  size of aFrame[]
3930: 20 61 72 72 61 79 20 2a 2f 0a 20 20 52 62 75 46   array */.  RbuF
3940: 72 61 6d 65 20 2a 61 46 72 61 6d 65 3b 0a 20 20  rame *aFrame;.  
3950: 69 6e 74 20 70 67 73 7a 3b 0a 20 20 75 38 20 2a  int pgsz;.  u8 *
3960: 61 42 75 66 3b 0a 20 20 69 36 34 20 69 57 61 6c  aBuf;.  i64 iWal
3970: 43 6b 73 75 6d 3b 0a 20 20 69 36 34 20 73 7a 54  Cksum;.  i64 szT
3980: 65 6d 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  emp;            
3990: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
39a0: 65 6e 74 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20  ent size of all 
39b0: 74 65 6d 70 20 66 69 6c 65 73 20 69 6e 20 75 73  temp files in us
39c0: 65 20 2a 2f 0a 20 20 69 36 34 20 73 7a 54 65 6d  e */.  i64 szTem
39d0: 70 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 20 20  pLimit;         
39e0: 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
39f0: 73 69 7a 65 20 6c 69 6d 69 74 20 66 6f 72 20 74  size limit for t
3a00: 65 6d 70 20 66 69 6c 65 73 20 2a 2f 0a 0a 20 20  emp files */..  
3a10: 2f 2a 20 55 73 65 64 20 69 6e 20 52 42 55 20 76  /* Used in RBU v
3a20: 61 63 75 75 6d 20 6d 6f 64 65 20 6f 6e 6c 79 20  acuum mode only 
3a30: 2a 2f 0a 20 20 69 6e 74 20 6e 52 62 75 3b 20 20  */.  int nRbu;  
3a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a50: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
3a60: 66 20 52 42 55 20 56 46 53 20 69 6e 20 74 68 65  f RBU VFS in the
3a70: 20 73 74 61 63 6b 20 2a 2f 0a 20 20 72 62 75 5f   stack */.  rbu_
3a80: 66 69 6c 65 20 2a 70 52 62 75 46 64 3b 20 20 20  file *pRbuFd;   
3a90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
3aa0: 64 20 66 6f 72 20 6d 61 69 6e 20 64 62 20 6f 66  d for main db of
3ab0: 20 64 62 52 62 75 20 2a 2f 0a 7d 3b 0a 0a 2f 2a   dbRbu */.};../*
3ac0: 0a 2a 2a 20 41 6e 20 72 62 75 20 56 46 53 20 69  .** An rbu VFS i
3ad0: 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73  s implemented us
3ae0: 69 6e 67 20 61 6e 20 69 6e 73 74 61 6e 63 65 20  ing an instance 
3af0: 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72  of this structur
3b00: 65 2e 0a 2a 2a 0a 2a 2a 20 56 61 72 69 61 62 6c  e..**.** Variabl
3b10: 65 20 70 52 62 75 20 69 73 20 6f 6e 6c 79 20 6e  e pRbu is only n
3b20: 6f 6e 2d 4e 55 4c 4c 20 66 6f 72 20 61 75 74 6f  on-NULL for auto
3b30: 6d 61 74 69 63 61 6c 6c 79 20 63 72 65 61 74 65  matically create
3b40: 64 20 52 42 55 20 56 46 53 20 6f 62 6a 65 63 74  d RBU VFS object
3b50: 73 2e 0a 2a 2a 20 49 74 20 69 73 20 4e 55 4c 4c  s..** It is NULL
3b60: 20 66 6f 72 20 52 42 55 20 56 46 53 20 6f 62 6a   for RBU VFS obj
3b70: 65 63 74 73 20 63 72 65 61 74 65 64 20 65 78 70  ects created exp
3b80: 6c 69 63 69 74 6c 79 20 75 73 69 6e 67 0a 2a 2a  licitly using.**
3b90: 20 73 71 6c 69 74 65 33 72 62 75 5f 63 72 65 61   sqlite3rbu_crea
3ba0: 74 65 5f 76 66 73 28 29 2e 20 49 74 20 69 73 20  te_vfs(). It is 
3bb0: 75 73 65 64 20 74 6f 20 74 72 61 63 6b 20 74 68  used to track th
3bc0: 65 20 74 6f 74 61 6c 20 61 6d 6f 75 6e 74 20 6f  e total amount o
3bd0: 66 20 74 65 6d 70 0a 2a 2a 20 73 70 61 63 65 20  f temp.** space 
3be0: 75 73 65 64 20 62 79 20 74 68 65 20 52 42 55 20  used by the RBU 
3bf0: 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 72 75 63  handle..*/.struc
3c00: 74 20 72 62 75 5f 76 66 73 20 7b 0a 20 20 73 71  t rbu_vfs {.  sq
3c10: 6c 69 74 65 33 5f 76 66 73 20 62 61 73 65 3b 20  lite3_vfs base; 
3c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3c30: 20 72 62 75 20 56 46 53 20 73 68 69 6d 20 6d 65   rbu VFS shim me
3c40: 74 68 6f 64 73 20 2a 2f 0a 20 20 73 71 6c 69 74  thods */.  sqlit
3c50: 65 33 5f 76 66 73 20 2a 70 52 65 61 6c 56 66 73  e3_vfs *pRealVfs
3c60: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e  ;          /* Un
3c70: 64 65 72 6c 79 69 6e 67 20 56 46 53 20 2a 2f 0a  derlying VFS */.
3c80: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20    sqlite3_mutex 
3c90: 2a 6d 75 74 65 78 3b 20 20 20 20 20 20 20 20 20  *mutex;         
3ca0: 20 20 2f 2a 20 4d 75 74 65 78 20 74 6f 20 70 72    /* Mutex to pr
3cb0: 6f 74 65 63 74 20 70 4d 61 69 6e 20 2a 2f 0a 20  otect pMain */. 
3cc0: 20 73 71 6c 69 74 65 33 72 62 75 20 2a 70 52 62   sqlite3rbu *pRb
3cd0: 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  u;              
3ce0: 20 2f 2a 20 4f 77 6e 65 72 20 52 42 55 20 6f 62   /* Owner RBU ob
3cf0: 6a 65 63 74 20 2a 2f 0a 20 20 72 62 75 5f 66 69  ject */.  rbu_fi
3d00: 6c 65 20 2a 70 4d 61 69 6e 3b 20 20 20 20 20 20  le *pMain;      
3d10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e            /* Lin
3d20: 6b 65 64 20 6c 69 73 74 20 6f 66 20 6d 61 69 6e  ked list of main
3d30: 20 64 62 20 66 69 6c 65 73 20 2a 2f 0a 7d 3b 0a   db files */.};.
3d40: 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 66 69 6c 65  ./*.** Each file
3d50: 20 6f 70 65 6e 65 64 20 62 79 20 61 6e 20 72 62   opened by an rb
3d60: 75 20 56 46 53 20 69 73 20 72 65 70 72 65 73 65  u VFS is represe
3d70: 6e 74 65 64 20 62 79 20 61 6e 20 69 6e 73 74 61  nted by an insta
3d80: 6e 63 65 20 6f 66 0a 2a 2a 20 74 68 65 20 66 6f  nce of.** the fo
3d90: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
3da0: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73  e..**.** If this
3db0: 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
3dc0: 66 69 6c 65 20 28 70 52 62 75 21 3d 30 20 26 26  file (pRbu!=0 &&
3dd0: 20 66 6c 61 67 73 26 44 45 4c 45 54 45 5f 4f 4e   flags&DELETE_ON
3de0: 5f 43 4c 4f 53 45 29 2c 20 76 61 72 69 61 62 6c  _CLOSE), variabl
3df0: 65 0a 2a 2a 20 22 73 7a 22 20 69 73 20 73 65 74  e.** "sz" is set
3e00: 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20   to the current 
3e10: 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
3e20: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  base file..*/.st
3e30: 72 75 63 74 20 72 62 75 5f 66 69 6c 65 20 7b 0a  ruct rbu_file {.
3e40: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 62    sqlite3_file b
3e50: 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ase;            
3e60: 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 66 69 6c    /* sqlite3_fil
3e70: 65 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 20 20 73  e methods */.  s
3e80: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 52 65  qlite3_file *pRe
3e90: 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  al;            /
3ea0: 2a 20 55 6e 64 65 72 6c 79 69 6e 67 20 66 69 6c  * Underlying fil
3eb0: 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 72 62  e handle */.  rb
3ec0: 75 5f 76 66 73 20 2a 70 52 62 75 56 66 73 3b 20  u_vfs *pRbuVfs; 
3ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3ee0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
3ef0: 72 62 75 5f 76 66 73 20 6f 62 6a 65 63 74 20 2a  rbu_vfs object *
3f00: 2f 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20 2a  /.  sqlite3rbu *
3f10: 70 52 62 75 3b 20 20 20 20 20 20 20 20 20 20 20  pRbu;           
3f20: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
3f30: 6f 20 72 62 75 20 6f 62 6a 65 63 74 20 28 72 62  o rbu object (rb
3f40: 75 20 74 61 72 67 65 74 20 6f 6e 6c 79 29 20 2a  u target only) *
3f50: 2f 0a 20 20 69 36 34 20 73 7a 3b 20 20 20 20 20  /.  i64 sz;     
3f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f70: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 66      /* Size of f
3f80: 69 6c 65 20 69 6e 20 62 79 74 65 73 20 28 74 65  ile in bytes (te
3f90: 6d 70 20 6f 6e 6c 79 29 20 2a 2f 0a 0a 20 20 69  mp only) */..  i
3fa0: 6e 74 20 6f 70 65 6e 46 6c 61 67 73 3b 20 20 20  nt openFlags;   
3fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3fc0: 2a 20 46 6c 61 67 73 20 74 68 69 73 20 66 69 6c  * Flags this fil
3fd0: 65 20 77 61 73 20 6f 70 65 6e 65 64 20 77 69 74  e was opened wit
3fe0: 68 20 2a 2f 0a 20 20 75 33 32 20 69 43 6f 6f 6b  h */.  u32 iCook
3ff0: 69 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ie;             
4000: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6f 6b 69 65         /* Cookie
4010: 20 76 61 6c 75 65 20 66 6f 72 20 6d 61 69 6e 20   value for main 
4020: 64 62 20 66 69 6c 65 73 20 2a 2f 0a 20 20 75 38  db files */.  u8
4030: 20 69 57 72 69 74 65 56 65 72 3b 20 20 20 20 20   iWriteVer;     
4040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4050: 20 22 77 72 69 74 65 2d 76 65 72 73 69 6f 6e 22   "write-version"
4060: 20 76 61 6c 75 65 20 66 6f 72 20 6d 61 69 6e 20   value for main 
4070: 64 62 20 66 69 6c 65 73 20 2a 2f 0a 20 20 75 38  db files */.  u8
4080: 20 62 4e 6f 6c 6f 63 6b 3b 20 20 20 20 20 20 20   bNolock;       
4090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
40a0: 20 54 72 75 65 20 74 6f 20 66 61 69 6c 20 45 58   True to fail EX
40b0: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20 2a 2f  CLUSIVE locks */
40c0: 0a 0a 20 20 69 6e 74 20 6e 53 68 6d 3b 20 20 20  ..  int nShm;   
40d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
40e0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
40f0: 20 65 6e 74 72 69 65 73 20 69 6e 20 61 70 53 68   entries in apSh
4100: 6d 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 63  m[] array */.  c
4110: 68 61 72 20 2a 2a 61 70 53 68 6d 3b 20 20 20 20  har **apShm;    
4120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4130: 2a 20 41 72 72 61 79 20 6f 66 20 6d 6d 61 70 27  * Array of mmap'
4140: 64 20 2a 2d 73 68 6d 20 72 65 67 69 6f 6e 73 20  d *-shm regions 
4150: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 65 6c 3b  */.  char *zDel;
4160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4170: 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 74       /* Delete t
4180: 68 69 73 20 77 68 65 6e 20 63 6c 6f 73 69 6e 67  his when closing
4190: 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 63 6f 6e 73   file */..  cons
41a0: 74 20 63 68 61 72 20 2a 7a 57 61 6c 3b 20 20 20  t char *zWal;   
41b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
41c0: 61 6c 20 66 69 6c 65 6e 61 6d 65 20 66 6f 72 20  al filename for 
41d0: 74 68 69 73 20 6d 61 69 6e 20 64 62 20 66 69 6c  this main db fil
41e0: 65 20 2a 2f 0a 20 20 72 62 75 5f 66 69 6c 65 20  e */.  rbu_file 
41f0: 2a 70 57 61 6c 46 64 3b 20 20 20 20 20 20 20 20  *pWalFd;        
4200: 20 20 20 20 20 20 20 2f 2a 20 57 61 6c 20 66 69         /* Wal fi
4210: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f  le descriptor fo
4220: 72 20 74 68 69 73 20 6d 61 69 6e 20 64 62 20 2a  r this main db *
4230: 2f 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 4d  /.  rbu_file *pM
4240: 61 69 6e 4e 65 78 74 3b 20 20 20 20 20 20 20 20  ainNext;        
4250: 20 20 20 20 2f 2a 20 4e 65 78 74 20 4d 41 49 4e      /* Next MAIN
4260: 5f 44 42 20 66 69 6c 65 20 2a 2f 0a 7d 3b 0a 0a  _DB file */.};..
4270: 2f 2a 0a 2a 2a 20 54 72 75 65 20 66 6f 72 20 61  /*.** True for a
4280: 6e 20 52 42 55 20 76 61 63 75 75 6d 20 68 61 6e  n RBU vacuum han
4290: 64 6c 65 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74  dle, or false ot
42a0: 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 23 64 65 66  herwise..*/.#def
42b0: 69 6e 65 20 72 62 75 49 73 56 61 63 75 75 6d 28  ine rbuIsVacuum(
42c0: 70 29 20 28 28 70 29 2d 3e 7a 54 61 72 67 65 74  p) ((p)->zTarget
42d0: 3d 3d 30 29 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ==0).../********
42e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
42f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4300: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4320: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
4330: 6e 67 20 74 68 72 65 65 20 66 75 6e 63 74 69 6f  ng three functio
4340: 6e 73 2c 20 66 6f 75 6e 64 20 62 65 6c 6f 77 3a  ns, found below:
4350: 0a 2a 2a 0a 2a 2a 20 20 20 72 62 75 44 65 6c 74  .**.**   rbuDelt
4360: 61 47 65 74 49 6e 74 28 29 0a 2a 2a 20 20 20 72  aGetInt().**   r
4370: 62 75 44 65 6c 74 61 43 68 65 63 6b 73 75 6d 28  buDeltaChecksum(
4380: 29 0a 2a 2a 20 20 20 72 62 75 44 65 6c 74 61 41  ).**   rbuDeltaA
4390: 70 70 6c 79 28 29 0a 2a 2a 0a 2a 2a 20 61 72 65  pply().**.** are
43a0: 20 6c 69 66 74 65 64 20 66 72 6f 6d 20 74 68 65   lifted from the
43b0: 20 66 6f 73 73 69 6c 20 73 6f 75 72 63 65 20 63   fossil source c
43c0: 6f 64 65 20 28 68 74 74 70 3a 2f 2f 66 6f 73 73  ode (http://foss
43d0: 69 6c 2d 73 63 6d 2e 6f 72 67 29 2e 20 54 68 65  il-scm.org). The
43e0: 79 0a 2a 2a 20 61 72 65 20 75 73 65 64 20 74 6f  y.** are used to
43f0: 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 73   implement the s
4400: 63 61 6c 61 72 20 53 51 4c 20 66 75 6e 63 74 69  calar SQL functi
4410: 6f 6e 20 72 62 75 5f 66 6f 73 73 69 6c 5f 64 65  on rbu_fossil_de
4420: 6c 74 61 28 29 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a  lta()..*/../*.**
4430: 20 52 65 61 64 20 62 79 74 65 73 20 66 72 6f 6d   Read bytes from
4440: 20 2a 70 7a 20 61 6e 64 20 63 6f 6e 76 65 72 74   *pz and convert
4450: 20 74 68 65 6d 20 69 6e 74 6f 20 61 20 70 6f 73   them into a pos
4460: 69 74 69 76 65 20 69 6e 74 65 67 65 72 2e 20 20  itive integer.  
4470: 57 68 65 6e 0a 2a 2a 20 66 69 6e 69 73 68 65 64  When.** finished
4480: 2c 20 6c 65 61 76 65 20 2a 70 7a 20 70 6f 69 6e  , leave *pz poin
4490: 74 69 6e 67 20 74 6f 20 74 68 65 20 66 69 72 73  ting to the firs
44a0: 74 20 63 68 61 72 61 63 74 65 72 20 70 61 73 74  t character past
44b0: 20 74 68 65 20 65 6e 64 20 6f 66 0a 2a 2a 20 74   the end of.** t
44c0: 68 65 20 69 6e 74 65 67 65 72 2e 20 20 54 68 65  he integer.  The
44d0: 20 2a 70 4c 65 6e 20 70 61 72 61 6d 65 74 65 72   *pLen parameter
44e0: 20 68 6f 6c 64 73 20 74 68 65 20 6c 65 6e 67 74   holds the lengt
44f0: 68 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67 0a  h of the string.
4500: 2a 2a 20 69 6e 20 2a 70 7a 20 61 6e 64 20 69 73  ** in *pz and is
4510: 20 64 65 63 72 65 6d 65 6e 74 65 64 20 6f 6e 63   decremented onc
4520: 65 20 66 6f 72 20 65 61 63 68 20 63 68 61 72 61  e for each chara
4530: 63 74 65 72 20 69 6e 20 74 68 65 20 69 6e 74 65  cter in the inte
4540: 67 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  ger..*/.static u
4550: 6e 73 69 67 6e 65 64 20 69 6e 74 20 72 62 75 44  nsigned int rbuD
4560: 65 6c 74 61 47 65 74 49 6e 74 28 63 6f 6e 73 74  eltaGetInt(const
4570: 20 63 68 61 72 20 2a 2a 70 7a 2c 20 69 6e 74 20   char **pz, int 
4580: 2a 70 4c 65 6e 29 7b 0a 20 20 73 74 61 74 69 63  *pLen){.  static
4590: 20 63 6f 6e 73 74 20 73 69 67 6e 65 64 20 63 68   const signed ch
45a0: 61 72 20 7a 56 61 6c 75 65 5b 5d 20 3d 20 7b 0a  ar zValue[] = {.
45b0: 20 20 20 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20      -1, -1, -1, 
45c0: 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20  -1, -1, -1, -1, 
45d0: 2d 31 2c 20 20 20 2d 31 2c 20 2d 31 2c 20 2d 31  -1,   -1, -1, -1
45e0: 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31  , -1, -1, -1, -1
45f0: 2c 20 2d 31 2c 0a 20 20 20 20 2d 31 2c 20 2d 31  , -1,.    -1, -1
4600: 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31  , -1, -1, -1, -1
4610: 2c 20 2d 31 2c 20 2d 31 2c 20 20 20 2d 31 2c 20  , -1, -1,   -1, 
4620: 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20  -1, -1, -1, -1, 
4630: 2d 31 2c 20 2d 31 2c 20 2d 31 2c 0a 20 20 20 20  -1, -1, -1,.    
4640: 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20  -1, -1, -1, -1, 
4650: 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20  -1, -1, -1, -1, 
4660: 20 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31    -1, -1, -1, -1
4670: 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31  , -1, -1, -1, -1
4680: 2c 0a 20 20 20 20 20 30 2c 20 20 31 2c 20 20 32  ,.     0,  1,  2
4690: 2c 20 20 33 2c 20 20 34 2c 20 20 35 2c 20 20 36  ,  3,  4,  5,  6
46a0: 2c 20 20 37 2c 20 20 20 20 38 2c 20 20 39 2c 20  ,  7,    8,  9, 
46b0: 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20  -1, -1, -1, -1, 
46c0: 2d 31 2c 20 2d 31 2c 0a 20 20 20 20 2d 31 2c 20  -1, -1,.    -1, 
46d0: 31 30 2c 20 31 31 2c 20 31 32 2c 20 31 33 2c 20  10, 11, 12, 13, 
46e0: 31 34 2c 20 31 35 2c 20 31 36 2c 20 20 20 31 37  14, 15, 16,   17
46f0: 2c 20 31 38 2c 20 31 39 2c 20 32 30 2c 20 32 31  , 18, 19, 20, 21
4700: 2c 20 32 32 2c 20 32 33 2c 20 32 34 2c 0a 20 20  , 22, 23, 24,.  
4710: 20 20 32 35 2c 20 32 36 2c 20 32 37 2c 20 32 38    25, 26, 27, 28
4720: 2c 20 32 39 2c 20 33 30 2c 20 33 31 2c 20 33 32  , 29, 30, 31, 32
4730: 2c 20 20 20 33 33 2c 20 33 34 2c 20 33 35 2c 20  ,   33, 34, 35, 
4740: 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20  -1, -1, -1, -1, 
4750: 33 36 2c 0a 20 20 20 20 2d 31 2c 20 33 37 2c 20  36,.    -1, 37, 
4760: 33 38 2c 20 33 39 2c 20 34 30 2c 20 34 31 2c 20  38, 39, 40, 41, 
4770: 34 32 2c 20 34 33 2c 20 20 20 34 34 2c 20 34 35  42, 43,   44, 45
4780: 2c 20 34 36 2c 20 34 37 2c 20 34 38 2c 20 34 39  , 46, 47, 48, 49
4790: 2c 20 35 30 2c 20 35 31 2c 0a 20 20 20 20 35 32  , 50, 51,.    52
47a0: 2c 20 35 33 2c 20 35 34 2c 20 35 35 2c 20 35 36  , 53, 54, 55, 56
47b0: 2c 20 35 37 2c 20 35 38 2c 20 35 39 2c 20 20 20  , 57, 58, 59,   
47c0: 36 30 2c 20 36 31 2c 20 36 32 2c 20 2d 31 2c 20  60, 61, 62, -1, 
47d0: 2d 31 2c 20 2d 31 2c 20 36 33 2c 20 2d 31 2c 0a  -1, -1, 63, -1,.
47e0: 20 20 7d 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20    };.  unsigned 
47f0: 69 6e 74 20 76 20 3d 20 30 3b 0a 20 20 69 6e 74  int v = 0;.  int
4800: 20 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   c;.  unsigned c
4810: 68 61 72 20 2a 7a 20 3d 20 28 75 6e 73 69 67 6e  har *z = (unsign
4820: 65 64 20 63 68 61 72 2a 29 2a 70 7a 3b 0a 20 20  ed char*)*pz;.  
4830: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
4840: 53 74 61 72 74 20 3d 20 7a 3b 0a 20 20 77 68 69  Start = z;.  whi
4850: 6c 65 28 20 28 63 20 3d 20 7a 56 61 6c 75 65 5b  le( (c = zValue[
4860: 30 78 37 66 26 2a 28 7a 2b 2b 29 5d 29 3e 3d 30  0x7f&*(z++)])>=0
4870: 20 29 7b 0a 20 20 20 20 20 76 20 3d 20 28 76 3c   ){.     v = (v<
4880: 3c 36 29 20 2b 20 63 3b 0a 20 20 7d 0a 20 20 7a  <6) + c;.  }.  z
4890: 2d 2d 3b 0a 20 20 2a 70 4c 65 6e 20 2d 3d 20 7a  --;.  *pLen -= z
48a0: 20 2d 20 7a 53 74 61 72 74 3b 0a 20 20 2a 70 7a   - zStart;.  *pz
48b0: 20 3d 20 28 63 68 61 72 2a 29 7a 3b 0a 20 20 72   = (char*)z;.  r
48c0: 65 74 75 72 6e 20 76 3b 0a 7d 0a 0a 23 69 66 20  eturn v;.}..#if 
48d0: 52 42 55 5f 45 4e 41 42 4c 45 5f 44 45 4c 54 41  RBU_ENABLE_DELTA
48e0: 5f 43 4b 53 55 4d 0a 2f 2a 0a 2a 2a 20 43 6f 6d  _CKSUM./*.** Com
48f0: 70 75 74 65 20 61 20 33 32 2d 62 69 74 20 63 68  pute a 32-bit ch
4900: 65 63 6b 73 75 6d 20 6f 6e 20 74 68 65 20 4e 2d  ecksum on the N-
4910: 62 79 74 65 20 62 75 66 66 65 72 2e 20 20 52 65  byte buffer.  Re
4920: 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 2e  turn the result.
4930: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 6e 73 69 67  .*/.static unsig
4940: 6e 65 64 20 69 6e 74 20 72 62 75 44 65 6c 74 61  ned int rbuDelta
4950: 43 68 65 63 6b 73 75 6d 28 63 6f 6e 73 74 20 63  Checksum(const c
4960: 68 61 72 20 2a 7a 49 6e 2c 20 73 69 7a 65 5f 74  har *zIn, size_t
4970: 20 4e 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73   N){.  const uns
4980: 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 20 3d 20  igned char *z = 
4990: 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
49a0: 63 68 61 72 20 2a 29 7a 49 6e 3b 0a 20 20 75 6e  char *)zIn;.  un
49b0: 73 69 67 6e 65 64 20 73 75 6d 30 20 3d 20 30 3b  signed sum0 = 0;
49c0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 73 75 6d 31  .  unsigned sum1
49d0: 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64   = 0;.  unsigned
49e0: 20 73 75 6d 32 20 3d 20 30 3b 0a 20 20 75 6e 73   sum2 = 0;.  uns
49f0: 69 67 6e 65 64 20 73 75 6d 33 20 3d 20 30 3b 0a  igned sum3 = 0;.
4a00: 20 20 77 68 69 6c 65 28 4e 20 3e 3d 20 31 36 29    while(N >= 16)
4a10: 7b 0a 20 20 20 20 73 75 6d 30 20 2b 3d 20 28 28  {.    sum0 += ((
4a20: 75 6e 73 69 67 6e 65 64 29 7a 5b 30 5d 20 2b 20  unsigned)z[0] + 
4a30: 7a 5b 34 5d 20 2b 20 7a 5b 38 5d 20 2b 20 7a 5b  z[4] + z[8] + z[
4a40: 31 32 5d 29 3b 0a 20 20 20 20 73 75 6d 31 20 2b  12]);.    sum1 +
4a50: 3d 20 28 28 75 6e 73 69 67 6e 65 64 29 7a 5b 31  = ((unsigned)z[1
4a60: 5d 20 2b 20 7a 5b 35 5d 20 2b 20 7a 5b 39 5d 20  ] + z[5] + z[9] 
4a70: 2b 20 7a 5b 31 33 5d 29 3b 0a 20 20 20 20 73 75  + z[13]);.    su
4a80: 6d 32 20 2b 3d 20 28 28 75 6e 73 69 67 6e 65 64  m2 += ((unsigned
4a90: 29 7a 5b 32 5d 20 2b 20 7a 5b 36 5d 20 2b 20 7a  )z[2] + z[6] + z
4aa0: 5b 31 30 5d 2b 20 7a 5b 31 34 5d 29 3b 0a 20 20  [10]+ z[14]);.  
4ab0: 20 20 73 75 6d 33 20 2b 3d 20 28 28 75 6e 73 69    sum3 += ((unsi
4ac0: 67 6e 65 64 29 7a 5b 33 5d 20 2b 20 7a 5b 37 5d  gned)z[3] + z[7]
4ad0: 20 2b 20 7a 5b 31 31 5d 2b 20 7a 5b 31 35 5d 29   + z[11]+ z[15])
4ae0: 3b 0a 20 20 20 20 7a 20 2b 3d 20 31 36 3b 0a 20  ;.    z += 16;. 
4af0: 20 20 20 4e 20 2d 3d 20 31 36 3b 0a 20 20 7d 0a     N -= 16;.  }.
4b00: 20 20 77 68 69 6c 65 28 4e 20 3e 3d 20 34 29 7b    while(N >= 4){
4b10: 0a 20 20 20 20 73 75 6d 30 20 2b 3d 20 7a 5b 30  .    sum0 += z[0
4b20: 5d 3b 0a 20 20 20 20 73 75 6d 31 20 2b 3d 20 7a  ];.    sum1 += z
4b30: 5b 31 5d 3b 0a 20 20 20 20 73 75 6d 32 20 2b 3d  [1];.    sum2 +=
4b40: 20 7a 5b 32 5d 3b 0a 20 20 20 20 73 75 6d 33 20   z[2];.    sum3 
4b50: 2b 3d 20 7a 5b 33 5d 3b 0a 20 20 20 20 7a 20 2b  += z[3];.    z +
4b60: 3d 20 34 3b 0a 20 20 20 20 4e 20 2d 3d 20 34 3b  = 4;.    N -= 4;
4b70: 0a 20 20 7d 0a 20 20 73 75 6d 33 20 2b 3d 20 28  .  }.  sum3 += (
4b80: 73 75 6d 32 20 3c 3c 20 38 29 20 2b 20 28 73 75  sum2 << 8) + (su
4b90: 6d 31 20 3c 3c 20 31 36 29 20 2b 20 28 73 75 6d  m1 << 16) + (sum
4ba0: 30 20 3c 3c 20 32 34 29 3b 0a 20 20 73 77 69 74  0 << 24);.  swit
4bb0: 63 68 28 4e 29 7b 0a 20 20 20 20 63 61 73 65 20  ch(N){.    case 
4bc0: 33 3a 20 20 20 73 75 6d 33 20 2b 3d 20 28 7a 5b  3:   sum3 += (z[
4bd0: 32 5d 20 3c 3c 20 38 29 3b 0a 20 20 20 20 63 61  2] << 8);.    ca
4be0: 73 65 20 32 3a 20 20 20 73 75 6d 33 20 2b 3d 20  se 2:   sum3 += 
4bf0: 28 7a 5b 31 5d 20 3c 3c 20 31 36 29 3b 0a 20 20  (z[1] << 16);.  
4c00: 20 20 63 61 73 65 20 31 3a 20 20 20 73 75 6d 33    case 1:   sum3
4c10: 20 2b 3d 20 28 7a 5b 30 5d 20 3c 3c 20 32 34 29   += (z[0] << 24)
4c20: 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20  ;.    default:  
4c30: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73  ;.  }.  return s
4c40: 75 6d 33 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  um3;.}.#endif../
4c50: 2a 0a 2a 2a 20 41 70 70 6c 79 20 61 20 64 65 6c  *.** Apply a del
4c60: 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 75  ta..**.** The ou
4c70: 74 70 75 74 20 62 75 66 66 65 72 20 73 68 6f 75  tput buffer shou
4c80: 6c 64 20 62 65 20 62 69 67 20 65 6e 6f 75 67 68  ld be big enough
4c90: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 77 68 6f   to hold the who
4ca0: 6c 65 20 6f 75 74 70 75 74 0a 2a 2a 20 66 69 6c  le output.** fil
4cb0: 65 20 61 6e 64 20 61 20 4e 55 4c 20 74 65 72 6d  e and a NUL term
4cc0: 69 6e 61 74 6f 72 20 61 74 20 74 68 65 20 65 6e  inator at the en
4cd0: 64 2e 20 20 54 68 65 20 64 65 6c 74 61 5f 6f 75  d.  The delta_ou
4ce0: 74 70 75 74 5f 73 69 7a 65 28 29 0a 2a 2a 20 72  tput_size().** r
4cf0: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 65 74 65  outine will dete
4d00: 72 6d 69 6e 65 20 74 68 69 73 20 73 69 7a 65 20  rmine this size 
4d10: 66 6f 72 20 79 6f 75 2e 0a 2a 2a 0a 2a 2a 20 54  for you..**.** T
4d20: 68 65 20 64 65 6c 74 61 20 73 74 72 69 6e 67 20  he delta string 
4d30: 73 68 6f 75 6c 64 20 62 65 20 6e 75 6c 6c 2d 74  should be null-t
4d40: 65 72 6d 69 6e 61 74 65 64 2e 20 20 42 75 74 20  erminated.  But 
4d50: 74 68 65 20 64 65 6c 74 61 20 73 74 72 69 6e 67  the delta string
4d60: 0a 2a 2a 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20  .** may contain 
4d70: 65 6d 62 65 64 64 65 64 20 4e 55 4c 20 63 68 61  embedded NUL cha
4d80: 72 61 63 74 65 72 73 20 28 69 66 20 74 68 65 20  racters (if the 
4d90: 69 6e 70 75 74 20 61 6e 64 20 6f 75 74 70 75 74  input and output
4da0: 20 61 72 65 0a 2a 2a 20 62 69 6e 61 72 79 20 66   are.** binary f
4db0: 69 6c 65 73 29 20 73 6f 20 77 65 20 61 6c 73 6f  iles) so we also
4dc0: 20 68 61 76 65 20 74 6f 20 70 61 73 73 20 69 6e   have to pass in
4dd0: 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74   the length of t
4de0: 68 65 20 64 65 6c 74 61 20 69 6e 0a 2a 2a 20 74  he delta in.** t
4df0: 68 65 20 6c 65 6e 44 65 6c 74 61 20 70 61 72 61  he lenDelta para
4e00: 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  meter..**.** Thi
4e10: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
4e20: 6e 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  ns the size of t
4e30: 68 65 20 6f 75 74 70 75 74 20 66 69 6c 65 20 69  he output file i
4e40: 6e 20 62 79 74 65 73 20 28 65 78 63 6c 75 64 69  n bytes (excludi
4e50: 6e 67 0a 2a 2a 20 74 68 65 20 66 69 6e 61 6c 20  ng.** the final 
4e60: 4e 55 4c 20 74 65 72 6d 69 6e 61 74 6f 72 20 63  NUL terminator c
4e70: 68 61 72 61 63 74 65 72 29 2e 20 20 45 78 63 65  haracter).  Exce
4e80: 70 74 2c 20 69 66 20 74 68 65 20 64 65 6c 74 61  pt, if the delta
4e90: 20 73 74 72 69 6e 67 20 69 73 0a 2a 2a 20 6d 61   string is.** ma
4ea0: 6c 66 6f 72 6d 65 64 20 6f 72 20 69 6e 74 65 6e  lformed or inten
4eb0: 64 65 64 20 66 6f 72 20 75 73 65 20 77 69 74 68  ded for use with
4ec0: 20 61 20 73 6f 75 72 63 65 20 66 69 6c 65 20 6f   a source file o
4ed0: 74 68 65 72 20 74 68 61 6e 20 7a 53 72 63 2c 0a  ther than zSrc,.
4ee0: 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  ** then this rou
4ef0: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 2d 31 2e  tine returns -1.
4f00: 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72 20 74 6f 20  .**.** Refer to 
4f10: 74 68 65 20 64 65 6c 74 61 5f 63 72 65 61 74 65  the delta_create
4f20: 28 29 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e  () documentation
4f30: 20 61 62 6f 76 65 20 66 6f 72 20 61 20 64 65 73   above for a des
4f40: 63 72 69 70 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74  cription.** of t
4f50: 68 65 20 64 65 6c 74 61 20 66 69 6c 65 20 66 6f  he delta file fo
4f60: 72 6d 61 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rmat..*/.static 
4f70: 69 6e 74 20 72 62 75 44 65 6c 74 61 41 70 70 6c  int rbuDeltaAppl
4f80: 79 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  y(.  const char 
4f90: 2a 7a 53 72 63 2c 20 20 20 20 20 20 2f 2a 20 54  *zSrc,      /* T
4fa0: 68 65 20 73 6f 75 72 63 65 20 6f 72 20 70 61 74  he source or pat
4fb0: 74 65 72 6e 20 66 69 6c 65 20 2a 2f 0a 20 20 69  tern file */.  i
4fc0: 6e 74 20 6c 65 6e 53 72 63 2c 20 20 20 20 20 20  nt lenSrc,      
4fd0: 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20        /* Length 
4fe0: 6f 66 20 74 68 65 20 73 6f 75 72 63 65 20 66 69  of the source fi
4ff0: 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  le */.  const ch
5000: 61 72 20 2a 7a 44 65 6c 74 61 2c 20 20 20 20 2f  ar *zDelta,    /
5010: 2a 20 44 65 6c 74 61 20 74 6f 20 61 70 70 6c 79  * Delta to apply
5020: 20 74 6f 20 74 68 65 20 70 61 74 74 65 72 6e 20   to the pattern 
5030: 2a 2f 0a 20 20 69 6e 74 20 6c 65 6e 44 65 6c 74  */.  int lenDelt
5040: 61 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  a,          /* L
5050: 65 6e 67 74 68 20 6f 66 20 74 68 65 20 64 65 6c  ength of the del
5060: 74 61 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4f  ta */.  char *zO
5070: 75 74 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ut             /
5080: 2a 20 57 72 69 74 65 20 74 68 65 20 6f 75 74 70  * Write the outp
5090: 75 74 20 69 6e 74 6f 20 74 68 69 73 20 70 72 65  ut into this pre
50a0: 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72  allocated buffer
50b0: 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65   */.){.  unsigne
50c0: 64 20 69 6e 74 20 6c 69 6d 69 74 3b 0a 20 20 75  d int limit;.  u
50d0: 6e 73 69 67 6e 65 64 20 69 6e 74 20 74 6f 74 61  nsigned int tota
50e0: 6c 20 3d 20 30 3b 0a 23 69 66 20 52 42 55 5f 45  l = 0;.#if RBU_E
50f0: 4e 41 42 4c 45 5f 44 45 4c 54 41 5f 43 4b 53 55  NABLE_DELTA_CKSU
5100: 4d 0a 20 20 63 68 61 72 20 2a 7a 4f 72 69 67 4f  M.  char *zOrigO
5110: 75 74 20 3d 20 7a 4f 75 74 3b 0a 23 65 6e 64 69  ut = zOut;.#endi
5120: 66 0a 0a 20 20 6c 69 6d 69 74 20 3d 20 72 62 75  f..  limit = rbu
5130: 44 65 6c 74 61 47 65 74 49 6e 74 28 26 7a 44 65  DeltaGetInt(&zDe
5140: 6c 74 61 2c 20 26 6c 65 6e 44 65 6c 74 61 29 3b  lta, &lenDelta);
5150: 0a 20 20 69 66 28 20 2a 7a 44 65 6c 74 61 21 3d  .  if( *zDelta!=
5160: 27 5c 6e 27 20 29 7b 0a 20 20 20 20 2f 2a 20 45  '\n' ){.    /* E
5170: 52 52 4f 52 3a 20 73 69 7a 65 20 69 6e 74 65 67  RROR: size integ
5180: 65 72 20 6e 6f 74 20 74 65 72 6d 69 6e 61 74 65  er not terminate
5190: 64 20 62 79 20 22 5c 6e 22 20 2a 2f 0a 20 20 20  d by "\n" */.   
51a0: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a   return -1;.  }.
51b0: 20 20 7a 44 65 6c 74 61 2b 2b 3b 20 6c 65 6e 44    zDelta++; lenD
51c0: 65 6c 74 61 2d 2d 3b 0a 20 20 77 68 69 6c 65 28  elta--;.  while(
51d0: 20 2a 7a 44 65 6c 74 61 20 26 26 20 6c 65 6e 44   *zDelta && lenD
51e0: 65 6c 74 61 3e 30 20 29 7b 0a 20 20 20 20 75 6e  elta>0 ){.    un
51f0: 73 69 67 6e 65 64 20 69 6e 74 20 63 6e 74 2c 20  signed int cnt, 
5200: 6f 66 73 74 3b 0a 20 20 20 20 63 6e 74 20 3d 20  ofst;.    cnt = 
5210: 72 62 75 44 65 6c 74 61 47 65 74 49 6e 74 28 26  rbuDeltaGetInt(&
5220: 7a 44 65 6c 74 61 2c 20 26 6c 65 6e 44 65 6c 74  zDelta, &lenDelt
5230: 61 29 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20  a);.    switch( 
5240: 7a 44 65 6c 74 61 5b 30 5d 20 29 7b 0a 20 20 20  zDelta[0] ){.   
5250: 20 20 20 63 61 73 65 20 27 40 27 3a 20 7b 0a 20     case '@': {. 
5260: 20 20 20 20 20 20 20 7a 44 65 6c 74 61 2b 2b 3b         zDelta++;
5270: 20 6c 65 6e 44 65 6c 74 61 2d 2d 3b 0a 20 20 20   lenDelta--;.   
5280: 20 20 20 20 20 6f 66 73 74 20 3d 20 72 62 75 44       ofst = rbuD
5290: 65 6c 74 61 47 65 74 49 6e 74 28 26 7a 44 65 6c  eltaGetInt(&zDel
52a0: 74 61 2c 20 26 6c 65 6e 44 65 6c 74 61 29 3b 0a  ta, &lenDelta);.
52b0: 20 20 20 20 20 20 20 20 69 66 28 20 6c 65 6e 44          if( lenD
52c0: 65 6c 74 61 3e 30 20 26 26 20 7a 44 65 6c 74 61  elta>0 && zDelta
52d0: 5b 30 5d 21 3d 27 2c 27 20 29 7b 0a 20 20 20 20  [0]!=',' ){.    
52e0: 20 20 20 20 20 20 2f 2a 20 45 52 52 4f 52 3a 20        /* ERROR: 
52f0: 63 6f 70 79 20 63 6f 6d 6d 61 6e 64 20 6e 6f 74  copy command not
5300: 20 74 65 72 6d 69 6e 61 74 65 64 20 62 79 20 27   terminated by '
5310: 2c 27 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ,' */.          
5320: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20  return -1;.     
5330: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 44 65     }.        zDe
5340: 6c 74 61 2b 2b 3b 20 6c 65 6e 44 65 6c 74 61 2d  lta++; lenDelta-
5350: 2d 3b 0a 20 20 20 20 20 20 20 20 74 6f 74 61 6c  -;.        total
5360: 20 2b 3d 20 63 6e 74 3b 0a 20 20 20 20 20 20 20   += cnt;.       
5370: 20 69 66 28 20 74 6f 74 61 6c 3e 6c 69 6d 69 74   if( total>limit
5380: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
5390: 20 45 52 52 4f 52 3a 20 63 6f 70 79 20 65 78 63   ERROR: copy exc
53a0: 65 65 64 73 20 6f 75 74 70 75 74 20 66 69 6c 65  eeds output file
53b0: 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 20 20 20   size */.       
53c0: 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
53d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
53e0: 69 66 28 20 28 69 6e 74 29 28 6f 66 73 74 2b 63  if( (int)(ofst+c
53f0: 6e 74 29 20 3e 20 6c 65 6e 53 72 63 20 29 7b 0a  nt) > lenSrc ){.
5400: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 52 52            /* ERR
5410: 4f 52 3a 20 63 6f 70 79 20 65 78 74 65 6e 64 73  OR: copy extends
5420: 20 70 61 73 74 20 65 6e 64 20 6f 66 20 69 6e 70   past end of inp
5430: 75 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ut */.          
5440: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20  return -1;.     
5450: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6d 65 6d     }.        mem
5460: 63 70 79 28 7a 4f 75 74 2c 20 26 7a 53 72 63 5b  cpy(zOut, &zSrc[
5470: 6f 66 73 74 5d 2c 20 63 6e 74 29 3b 0a 20 20 20  ofst], cnt);.   
5480: 20 20 20 20 20 7a 4f 75 74 20 2b 3d 20 63 6e 74       zOut += cnt
5490: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
54a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
54b0: 61 73 65 20 27 3a 27 3a 20 7b 0a 20 20 20 20 20  ase ':': {.     
54c0: 20 20 20 7a 44 65 6c 74 61 2b 2b 3b 20 6c 65 6e     zDelta++; len
54d0: 44 65 6c 74 61 2d 2d 3b 0a 20 20 20 20 20 20 20  Delta--;.       
54e0: 20 74 6f 74 61 6c 20 2b 3d 20 63 6e 74 3b 0a 20   total += cnt;. 
54f0: 20 20 20 20 20 20 20 69 66 28 20 74 6f 74 61 6c         if( total
5500: 3e 6c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  >limit ){.      
5510: 20 20 20 20 2f 2a 20 45 52 52 4f 52 3a 20 20 69      /* ERROR:  i
5520: 6e 73 65 72 74 20 63 6f 6d 6d 61 6e 64 20 67 69  nsert command gi
5530: 76 65 73 20 61 6e 20 6f 75 74 70 75 74 20 6c 61  ves an output la
5540: 72 67 65 72 20 74 68 61 6e 20 70 72 65 64 69 63  rger than predic
5550: 74 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ted */.         
5560: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
5570: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
5580: 28 20 28 69 6e 74 29 63 6e 74 3e 6c 65 6e 44 65  ( (int)cnt>lenDe
5590: 6c 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 20  lta ){.         
55a0: 20 2f 2a 20 45 52 52 4f 52 3a 20 69 6e 73 65 72   /* ERROR: inser
55b0: 74 20 63 6f 75 6e 74 20 65 78 63 65 65 64 73 20  t count exceeds 
55c0: 73 69 7a 65 20 6f 66 20 64 65 6c 74 61 20 2a 2f  size of delta */
55d0: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
55e0: 6e 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n -1;.        }.
55f0: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a          memcpy(z
5600: 4f 75 74 2c 20 7a 44 65 6c 74 61 2c 20 63 6e 74  Out, zDelta, cnt
5610: 29 3b 0a 20 20 20 20 20 20 20 20 7a 4f 75 74 20  );.        zOut 
5620: 2b 3d 20 63 6e 74 3b 0a 20 20 20 20 20 20 20 20  += cnt;.        
5630: 7a 44 65 6c 74 61 20 2b 3d 20 63 6e 74 3b 0a 20  zDelta += cnt;. 
5640: 20 20 20 20 20 20 20 6c 65 6e 44 65 6c 74 61 20         lenDelta 
5650: 2d 3d 20 63 6e 74 3b 0a 20 20 20 20 20 20 20 20  -= cnt;.        
5660: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
5670: 20 20 20 20 20 63 61 73 65 20 27 3b 27 3a 20 7b       case ';': {
5680: 0a 20 20 20 20 20 20 20 20 7a 44 65 6c 74 61 2b  .        zDelta+
5690: 2b 3b 20 6c 65 6e 44 65 6c 74 61 2d 2d 3b 0a 20  +; lenDelta--;. 
56a0: 20 20 20 20 20 20 20 7a 4f 75 74 5b 30 5d 20 3d         zOut[0] =
56b0: 20 30 3b 0a 23 69 66 20 52 42 55 5f 45 4e 41 42   0;.#if RBU_ENAB
56c0: 4c 45 5f 44 45 4c 54 41 5f 43 4b 53 55 4d 0a 20  LE_DELTA_CKSUM. 
56d0: 20 20 20 20 20 20 20 69 66 28 20 63 6e 74 21 3d         if( cnt!=
56e0: 72 62 75 44 65 6c 74 61 43 68 65 63 6b 73 75 6d  rbuDeltaChecksum
56f0: 28 7a 4f 72 69 67 4f 75 74 2c 20 74 6f 74 61 6c  (zOrigOut, total
5700: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  ) ){.          /
5710: 2a 20 45 52 52 4f 52 3a 20 20 62 61 64 20 63 68  * ERROR:  bad ch
5720: 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 20 20 20 20  ecksum */.      
5730: 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
5740: 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a         }.#endif.
5750: 20 20 20 20 20 20 20 20 69 66 28 20 74 6f 74 61          if( tota
5760: 6c 21 3d 6c 69 6d 69 74 20 29 7b 0a 20 20 20 20  l!=limit ){.    
5770: 20 20 20 20 20 20 2f 2a 20 45 52 52 4f 52 3a 20        /* ERROR: 
5780: 67 65 6e 65 72 61 74 65 64 20 73 69 7a 65 20 64  generated size d
5790: 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 70 72  oes not match pr
57a0: 65 64 69 63 74 65 64 20 73 69 7a 65 20 2a 2f 0a  edicted size */.
57b0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
57c0: 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   -1;.        }. 
57d0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 6f         return to
57e0: 74 61 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  tal;.      }.   
57f0: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
5800: 20 20 20 20 20 20 2f 2a 20 45 52 52 4f 52 3a 20        /* ERROR: 
5810: 75 6e 6b 6e 6f 77 6e 20 64 65 6c 74 61 20 6f 70  unknown delta op
5820: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20  erator */.      
5830: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20    return -1;.   
5840: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
5850: 20 2f 2a 20 45 52 52 4f 52 3a 20 75 6e 74 65 72   /* ERROR: unter
5860: 6d 69 6e 61 74 65 64 20 64 65 6c 74 61 20 2a 2f  minated delta */
5870: 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a  .  return -1;.}.
5880: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 44  .static int rbuD
5890: 65 6c 74 61 4f 75 74 70 75 74 53 69 7a 65 28 63  eltaOutputSize(c
58a0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 65 6c 74  onst char *zDelt
58b0: 61 2c 20 69 6e 74 20 6c 65 6e 44 65 6c 74 61 29  a, int lenDelta)
58c0: 7b 0a 20 20 69 6e 74 20 73 69 7a 65 3b 0a 20 20  {.  int size;.  
58d0: 73 69 7a 65 20 3d 20 72 62 75 44 65 6c 74 61 47  size = rbuDeltaG
58e0: 65 74 49 6e 74 28 26 7a 44 65 6c 74 61 2c 20 26  etInt(&zDelta, &
58f0: 6c 65 6e 44 65 6c 74 61 29 3b 0a 20 20 69 66 28  lenDelta);.  if(
5900: 20 2a 7a 44 65 6c 74 61 21 3d 27 5c 6e 27 20 29   *zDelta!='\n' )
5910: 7b 0a 20 20 20 20 2f 2a 20 45 52 52 4f 52 3a 20  {.    /* ERROR: 
5920: 73 69 7a 65 20 69 6e 74 65 67 65 72 20 6e 6f 74  size integer not
5930: 20 74 65 72 6d 69 6e 61 74 65 64 20 62 79 20 22   terminated by "
5940: 5c 6e 22 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  \n" */.    retur
5950: 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  n -1;.  }.  retu
5960: 72 6e 20 73 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn size;.}../*.*
5970: 2a 20 45 6e 64 20 6f 66 20 63 6f 64 65 20 74 61  * End of code ta
5980: 6b 65 6e 20 66 72 6f 6d 20 66 6f 73 73 69 6c 2e  ken from fossil.
5990: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
59a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
59b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
59c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
59d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a  **********/../*.
59e0: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
59f0: 6e 20 6f 66 20 53 51 4c 20 73 63 61 6c 61 72 20  n of SQL scalar 
5a00: 66 75 6e 63 74 69 6f 6e 20 72 62 75 5f 66 6f 73  function rbu_fos
5a10: 73 69 6c 5f 64 65 6c 74 61 28 29 2e 0a 2a 2a 0a  sil_delta()..**.
5a20: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
5a30: 20 61 70 70 6c 69 65 73 20 61 20 66 6f 73 73 69   applies a fossi
5a40: 6c 20 64 65 6c 74 61 20 70 61 74 63 68 20 74 6f  l delta patch to
5a50: 20 61 20 62 6c 6f 62 2e 20 45 78 61 63 74 6c 79   a blob. Exactly
5a60: 20 74 77 6f 0a 2a 2a 20 61 72 67 75 6d 65 6e 74   two.** argument
5a70: 73 20 6d 75 73 74 20 62 65 20 70 61 73 73 65 64  s must be passed
5a80: 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
5a90: 6e 2e 20 54 68 65 20 66 69 72 73 74 20 69 73 20  n. The first is 
5aa0: 74 68 65 20 62 6c 6f 62 20 74 6f 0a 2a 2a 20 70  the blob to.** p
5ab0: 61 74 63 68 20 61 6e 64 20 74 68 65 20 73 65 63  atch and the sec
5ac0: 6f 6e 64 20 74 68 65 20 70 61 74 63 68 20 74 6f  ond the patch to
5ad0: 20 61 70 70 6c 79 2e 20 49 66 20 6e 6f 20 65 72   apply. If no er
5ae0: 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 69 73  ror occurs, this
5af0: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  .** function ret
5b00: 75 72 6e 73 20 74 68 65 20 70 61 74 63 68 65 64  urns the patched
5b10: 20 62 6c 6f 62 2e 0a 2a 2f 0a 73 74 61 74 69 63   blob..*/.static
5b20: 20 76 6f 69 64 20 72 62 75 46 6f 73 73 69 6c 44   void rbuFossilD
5b30: 65 6c 74 61 46 75 6e 63 28 0a 20 20 73 71 6c 69  eltaFunc(.  sqli
5b40: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
5b50: 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63  text,.  int argc
5b60: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
5b70: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63 6f  e **argv.){.  co
5b80: 6e 73 74 20 63 68 61 72 20 2a 61 44 65 6c 74 61  nst char *aDelta
5b90: 3b 0a 20 20 69 6e 74 20 6e 44 65 6c 74 61 3b 0a  ;.  int nDelta;.
5ba0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 4f    const char *aO
5bb0: 72 69 67 3b 0a 20 20 69 6e 74 20 6e 4f 72 69 67  rig;.  int nOrig
5bc0: 3b 0a 0a 20 20 69 6e 74 20 6e 4f 75 74 3b 0a 20  ;..  int nOut;. 
5bd0: 20 69 6e 74 20 6e 4f 75 74 32 3b 0a 20 20 63 68   int nOut2;.  ch
5be0: 61 72 20 2a 61 4f 75 74 3b 0a 0a 20 20 61 73 73  ar *aOut;..  ass
5bf0: 65 72 74 28 20 61 72 67 63 3d 3d 32 20 29 3b 0a  ert( argc==2 );.
5c00: 0a 20 20 6e 4f 72 69 67 20 3d 20 73 71 6c 69 74  .  nOrig = sqlit
5c10: 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61  e3_value_bytes(a
5c20: 72 67 76 5b 30 5d 29 3b 0a 20 20 61 4f 72 69 67  rgv[0]);.  aOrig
5c30: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
5c40: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c  sqlite3_value_bl
5c50: 6f 62 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 6e  ob(argv[0]);.  n
5c60: 44 65 6c 74 61 20 3d 20 73 71 6c 69 74 65 33 5f  Delta = sqlite3_
5c70: 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76  value_bytes(argv
5c80: 5b 31 5d 29 3b 0a 20 20 61 44 65 6c 74 61 20 3d  [1]);.  aDelta =
5c90: 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
5ca0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62  lite3_value_blob
5cb0: 28 61 72 67 76 5b 31 5d 29 3b 0a 0a 20 20 2f 2a  (argv[1]);..  /*
5cc0: 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20   Figure out the 
5cd0: 73 69 7a 65 20 6f 66 20 74 68 65 20 6f 75 74 70  size of the outp
5ce0: 75 74 20 2a 2f 0a 20 20 6e 4f 75 74 20 3d 20 72  ut */.  nOut = r
5cf0: 62 75 44 65 6c 74 61 4f 75 74 70 75 74 53 69 7a  buDeltaOutputSiz
5d00: 65 28 61 44 65 6c 74 61 2c 20 6e 44 65 6c 74 61  e(aDelta, nDelta
5d10: 29 3b 0a 20 20 69 66 28 20 6e 4f 75 74 3c 30 20  );.  if( nOut<0 
5d20: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ){.    sqlite3_r
5d30: 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74  esult_error(cont
5d40: 65 78 74 2c 20 22 63 6f 72 72 75 70 74 20 66 6f  ext, "corrupt fo
5d50: 73 73 69 6c 20 64 65 6c 74 61 22 2c 20 2d 31 29  ssil delta", -1)
5d60: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
5d70: 7d 0a 0a 20 20 61 4f 75 74 20 3d 20 73 71 6c 69  }..  aOut = sqli
5d80: 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 4f 75 74 2b  te3_malloc(nOut+
5d90: 31 29 3b 0a 20 20 69 66 28 20 61 4f 75 74 3d 3d  1);.  if( aOut==
5da0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
5db0: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f  _result_error_no
5dc0: 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  mem(context);.  
5dd0: 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4f 75 74 32  }else{.    nOut2
5de0: 20 3d 20 72 62 75 44 65 6c 74 61 41 70 70 6c 79   = rbuDeltaApply
5df0: 28 61 4f 72 69 67 2c 20 6e 4f 72 69 67 2c 20 61  (aOrig, nOrig, a
5e00: 44 65 6c 74 61 2c 20 6e 44 65 6c 74 61 2c 20 61  Delta, nDelta, a
5e10: 4f 75 74 29 3b 0a 20 20 20 20 69 66 28 20 6e 4f  Out);.    if( nO
5e20: 75 74 32 21 3d 6e 4f 75 74 20 29 7b 0a 20 20 20  ut2!=nOut ){.   
5e30: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
5e40: 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c  t_error(context,
5e50: 20 22 63 6f 72 72 75 70 74 20 66 6f 73 73 69 6c   "corrupt fossil
5e60: 20 64 65 6c 74 61 22 2c 20 2d 31 29 3b 0a 20 20   delta", -1);.  
5e70: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
5e80: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c  qlite3_result_bl
5e90: 6f 62 28 63 6f 6e 74 65 78 74 2c 20 61 4f 75 74  ob(context, aOut
5ea0: 2c 20 6e 4f 75 74 2c 20 73 71 6c 69 74 65 33 5f  , nOut, sqlite3_
5eb0: 66 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  free);.    }.  }
5ec0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61  .}.../*.** Prepa
5ed0: 72 65 20 74 68 65 20 53 51 4c 20 73 74 61 74 65  re the SQL state
5ee0: 6d 65 6e 74 20 69 6e 20 62 75 66 66 65 72 20 7a  ment in buffer z
5ef0: 53 71 6c 20 61 67 61 69 6e 73 74 20 64 61 74 61  Sql against data
5f00: 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a  base handle db..
5f10: 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
5f20: 2c 20 73 65 74 20 2a 70 70 53 74 6d 74 20 74 6f  , set *ppStmt to
5f30: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65   point to the ne
5f40: 77 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20  w statement and 
5f50: 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45  return.** SQLITE
5f60: 5f 4f 4b 2e 20 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  _OK. .**.** Othe
5f70: 72 77 69 73 65 2c 20 69 66 20 61 6e 20 65 72 72  rwise, if an err
5f80: 6f 72 20 64 6f 65 73 20 6f 63 63 75 72 2c 20 73  or does occur, s
5f90: 65 74 20 2a 70 70 53 74 6d 74 20 74 6f 20 4e 55  et *ppStmt to NU
5fa0: 4c 4c 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a  LL and return.**
5fb0: 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
5fc0: 20 63 6f 64 65 2e 20 41 64 64 69 74 69 6f 6e 61   code. Additiona
5fd0: 6c 6c 79 2c 20 73 65 74 20 6f 75 74 70 75 74 20  lly, set output 
5fe0: 76 61 72 69 61 62 6c 65 20 2a 70 7a 45 72 72 6d  variable *pzErrm
5ff0: 73 67 20 74 6f 0a 2a 2a 20 70 6f 69 6e 74 20 74  sg to.** point t
6000: 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61  o a buffer conta
6010: 69 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 6d  ining an error m
6020: 65 73 73 61 67 65 2e 20 49 74 20 69 73 20 74 68  essage. It is th
6030: 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
6040: 0a 2a 2a 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  .** of the calle
6050: 72 20 74 6f 20 28 65 76 65 6e 74 75 61 6c 6c 79  r to (eventually
6060: 29 20 66 72 65 65 20 74 68 69 73 20 62 75 66 66  ) free this buff
6070: 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  er using sqlite3
6080: 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  _free()..*/.stat
6090: 69 63 20 69 6e 74 20 70 72 65 70 61 72 65 41 6e  ic int prepareAn
60a0: 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 0a 20  dCollectError(. 
60b0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20   sqlite3 *db, . 
60c0: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a   sqlite3_stmt **
60d0: 70 70 53 74 6d 74 2c 0a 20 20 63 68 61 72 20 2a  ppStmt,.  char *
60e0: 2a 70 7a 45 72 72 6d 73 67 2c 0a 20 20 63 6f 6e  *pzErrmsg,.  con
60f0: 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 0a 29 7b  st char *zSql.){
6100: 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69  .  int rc = sqli
6110: 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64  te3_prepare_v2(d
6120: 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 70 70 53  b, zSql, -1, ppS
6130: 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  tmt, 0);.  if( r
6140: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
6150: 20 20 20 20 2a 70 7a 45 72 72 6d 73 67 20 3d 20      *pzErrmsg = 
6160: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
6170: 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 65 72  "%s", sqlite3_er
6180: 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 20 20 2a  rmsg(db));.    *
6190: 70 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a  ppStmt = 0;.  }.
61a0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
61b0: 2f 2a 0a 2a 2a 20 52 65 73 65 74 20 74 68 65 20  /*.** Reset the 
61c0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 70 61  SQL statement pa
61d0: 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
61e0: 74 20 61 72 67 75 6d 65 6e 74 2e 20 52 65 74 75  t argument. Retu
61f0: 72 6e 20 61 20 63 6f 70 79 0a 2a 2a 20 6f 66 20  rn a copy.** of 
6200: 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
6210: 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f 72 65  ed by sqlite3_re
6220: 73 65 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  set()..**.** If 
6230: 61 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63  an error has occ
6240: 75 72 72 65 64 2c 20 74 68 65 6e 20 73 65 74 20  urred, then set 
6250: 2a 70 7a 45 72 72 6d 73 67 20 74 6f 20 70 6f 69  *pzErrmsg to poi
6260: 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 0a 2a  nt to a buffer.*
6270: 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6e 20  * containing an 
6280: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 20 49  error message. I
6290: 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73  t is the respons
62a0: 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
62b0: 61 6c 6c 65 72 0a 2a 2a 20 74 6f 20 65 76 65 6e  aller.** to even
62c0: 74 75 61 6c 6c 79 20 66 72 65 65 20 74 68 69 73  tually free this
62d0: 20 62 75 66 66 65 72 20 75 73 69 6e 67 20 73 71   buffer using sq
62e0: 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f  lite3_free()..*/
62f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 73 65  .static int rese
6300: 74 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72  tAndCollectError
6310: 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70  (sqlite3_stmt *p
6320: 53 74 6d 74 2c 20 63 68 61 72 20 2a 2a 70 7a 45  Stmt, char **pzE
6330: 72 72 6d 73 67 29 7b 0a 20 20 69 6e 74 20 72 63  rrmsg){.  int rc
6340: 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
6350: 28 70 53 74 6d 74 29 3b 0a 20 20 69 66 28 20 72  (pStmt);.  if( r
6360: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
6370: 20 20 20 20 2a 70 7a 45 72 72 6d 73 67 20 3d 20      *pzErrmsg = 
6380: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
6390: 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 65 72  "%s", sqlite3_er
63a0: 72 6d 73 67 28 73 71 6c 69 74 65 33 5f 64 62 5f  rmsg(sqlite3_db_
63b0: 68 61 6e 64 6c 65 28 70 53 74 6d 74 29 29 29 3b  handle(pStmt)));
63c0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
63d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73  ;.}../*.** Unles
63e0: 73 20 69 74 20 69 73 20 4e 55 4c 4c 2c 20 61 72  s it is NULL, ar
63f0: 67 75 6d 65 6e 74 20 7a 53 71 6c 20 70 6f 69 6e  gument zSql poin
6400: 74 73 20 74 6f 20 61 20 62 75 66 66 65 72 20 61  ts to a buffer a
6410: 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 0a 2a  llocated using.*
6420: 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  * sqlite3_malloc
6430: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6e 20 53   containing an S
6440: 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68  QL statement. Th
6450: 69 73 20 66 75 6e 63 74 69 6f 6e 20 70 72 65 70  is function prep
6460: 61 72 65 73 20 74 68 65 20 53 51 4c 0a 2a 2a 20  ares the SQL.** 
6470: 73 74 61 74 65 6d 65 6e 74 20 61 67 61 69 6e 73  statement agains
6480: 74 20 64 61 74 61 62 61 73 65 20 64 62 20 61 6e  t database db an
6490: 64 20 66 72 65 65 73 20 74 68 65 20 62 75 66 66  d frees the buff
64a0: 65 72 2e 20 49 66 20 73 74 61 74 65 6d 65 6e 74  er. If statement
64b0: 20 0a 2a 2a 20 63 6f 6d 70 69 6c 61 74 69 6f 6e   .** compilation
64c0: 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20   is successful, 
64d0: 2a 70 70 53 74 6d 74 20 69 73 20 73 65 74 20 74  *ppStmt is set t
64e0: 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e  o point to the n
64f0: 65 77 20 73 74 61 74 65 6d 65 6e 74 20 0a 2a 2a  ew statement .**
6500: 20 68 61 6e 64 6c 65 20 61 6e 64 20 53 51 4c 49   handle and SQLI
6510: 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
6520: 64 2e 20 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  d. .**.** Otherw
6530: 69 73 65 2c 20 69 66 20 61 6e 20 65 72 72 6f 72  ise, if an error
6540: 20 6f 63 63 75 72 73 2c 20 2a 70 70 53 74 6d 74   occurs, *ppStmt
6550: 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20   is set to NULL 
6560: 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  and an error cod
6570: 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20 49  e.** returned. I
6580: 6e 20 74 68 69 73 20 63 61 73 65 2c 20 2a 70 7a  n this case, *pz
6590: 45 72 72 6d 73 67 20 6d 61 79 20 61 6c 73 6f 20  Errmsg may also 
65a0: 62 65 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  be set to point 
65b0: 74 6f 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 6d  to an error.** m
65c0: 65 73 73 61 67 65 2e 20 49 74 20 69 73 20 74 68  essage. It is th
65d0: 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
65e0: 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74   of the caller t
65f0: 6f 20 66 72 65 65 20 74 68 69 73 20 65 72 72 6f  o free this erro
6600: 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 62 75 66  r message.** buf
6610: 66 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65  fer using sqlite
6620: 33 5f 66 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  3_free()..**.** 
6630: 49 66 20 61 72 67 75 6d 65 6e 74 20 7a 53 71 6c  If argument zSql
6640: 20 69 73 20 4e 55 4c 4c 2c 20 74 68 69 73 20 66   is NULL, this f
6650: 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20  unction assumes 
6660: 74 68 61 74 20 61 6e 20 4f 4f 4d 20 68 61 73 20  that an OOM has 
6670: 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 20 49 6e 20  occurred..** In 
6680: 74 68 69 73 20 63 61 73 65 20 53 51 4c 49 54 45  this case SQLITE
6690: 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e  _NOMEM is return
66a0: 65 64 20 61 6e 64 20 2a 70 70 53 74 6d 74 20 73  ed and *ppStmt s
66b0: 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73  et to NULL..*/.s
66c0: 74 61 74 69 63 20 69 6e 74 20 70 72 65 70 61 72  tatic int prepar
66d0: 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45  eFreeAndCollectE
66e0: 72 72 6f 72 28 0a 20 20 73 71 6c 69 74 65 33 20  rror(.  sqlite3 
66f0: 2a 64 62 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f  *db, .  sqlite3_
6700: 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 2c 0a 20  stmt **ppStmt,. 
6710: 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 6d 73 67   char **pzErrmsg
6720: 2c 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 0a 29  ,.  char *zSql.)
6730: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73  {.  int rc;.  as
6740: 73 65 72 74 28 20 2a 70 7a 45 72 72 6d 73 67 3d  sert( *pzErrmsg=
6750: 3d 30 20 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c  =0 );.  if( zSql
6760: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
6770: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
6780: 20 20 2a 70 70 53 74 6d 74 20 3d 20 30 3b 0a 20    *ppStmt = 0;. 
6790: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
67a0: 20 70 72 65 70 61 72 65 41 6e 64 43 6f 6c 6c 65   prepareAndColle
67b0: 63 74 45 72 72 6f 72 28 64 62 2c 20 70 70 53 74  ctError(db, ppSt
67c0: 6d 74 2c 20 70 7a 45 72 72 6d 73 67 2c 20 7a 53  mt, pzErrmsg, zS
67d0: 71 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ql);.    sqlite3
67e0: 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 7d  _free(zSql);.  }
67f0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
6800: 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20  ./*.** Free the 
6810: 52 62 75 4f 62 6a 49 74 65 72 2e 61 7a 54 62 6c  RbuObjIter.azTbl
6820: 43 6f 6c 5b 5d 20 61 6e 64 20 52 62 75 4f 62 6a  Col[] and RbuObj
6830: 49 74 65 72 2e 61 62 54 62 6c 50 6b 5b 5d 20 61  Iter.abTblPk[] a
6840: 72 72 61 79 73 20 61 6c 6c 6f 63 61 74 65 64 0a  rrays allocated.
6850: 2a 2a 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72  ** by an earlier
6860: 20 63 61 6c 6c 20 74 6f 20 72 62 75 4f 62 6a 49   call to rbuObjI
6870: 74 65 72 43 61 63 68 65 54 61 62 6c 65 49 6e 66  terCacheTableInf
6880: 6f 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  o()..*/.static v
6890: 6f 69 64 20 72 62 75 4f 62 6a 49 74 65 72 46 72  oid rbuObjIterFr
68a0: 65 65 43 6f 6c 73 28 52 62 75 4f 62 6a 49 74 65  eeCols(RbuObjIte
68b0: 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e 74  r *pIter){.  int
68c0: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
68d0: 3c 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 3b  <pIter->nTblCol;
68e0: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
68f0: 65 33 5f 66 72 65 65 28 70 49 74 65 72 2d 3e 61  e3_free(pIter->a
6900: 7a 54 62 6c 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20  zTblCol[i]);.   
6910: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49   sqlite3_free(pI
6920: 74 65 72 2d 3e 61 7a 54 62 6c 54 79 70 65 5b 69  ter->azTblType[i
6930: 5d 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ]);.  }.  sqlite
6940: 33 5f 66 72 65 65 28 70 49 74 65 72 2d 3e 61 7a  3_free(pIter->az
6950: 54 62 6c 43 6f 6c 29 3b 0a 20 20 70 49 74 65 72  TblCol);.  pIter
6960: 2d 3e 61 7a 54 62 6c 43 6f 6c 20 3d 20 30 3b 0a  ->azTblCol = 0;.
6970: 20 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 54 79    pIter->azTblTy
6980: 70 65 20 3d 20 30 3b 0a 20 20 70 49 74 65 72 2d  pe = 0;.  pIter-
6990: 3e 61 69 53 72 63 4f 72 64 65 72 20 3d 20 30 3b  >aiSrcOrder = 0;
69a0: 0a 20 20 70 49 74 65 72 2d 3e 61 62 54 62 6c 50  .  pIter->abTblP
69b0: 6b 20 3d 20 30 3b 0a 20 20 70 49 74 65 72 2d 3e  k = 0;.  pIter->
69c0: 61 62 4e 6f 74 4e 75 6c 6c 20 3d 20 30 3b 0a 20  abNotNull = 0;. 
69d0: 20 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 20   pIter->nTblCol 
69e0: 3d 20 30 3b 0a 20 20 70 49 74 65 72 2d 3e 65 54  = 0;.  pIter->eT
69f0: 79 70 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ype = 0;        
6a00: 20 20 20 20 20 20 20 2f 2a 20 49 6e 76 61 6c 69         /* Invali
6a10: 64 20 76 61 6c 75 65 20 2a 2f 0a 7d 0a 0a 2f 2a  d value */.}../*
6a20: 0a 2a 2a 20 46 69 6e 61 6c 69 7a 65 20 61 6c 6c  .** Finalize all
6a30: 20 73 74 61 74 65 6d 65 6e 74 73 20 61 6e 64 20   statements and 
6a40: 66 72 65 65 20 61 6c 6c 20 61 6c 6c 6f 63 61 74  free all allocat
6a50: 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20 73 70  ions that are sp
6a60: 65 63 69 66 69 63 20 74 6f 0a 2a 2a 20 74 68 65  ecific to.** the
6a70: 20 63 75 72 72 65 6e 74 20 6f 62 6a 65 63 74 20   current object 
6a80: 28 74 61 62 6c 65 2f 69 6e 64 65 78 20 70 61 69  (table/index pai
6a90: 72 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  r)..*/.static vo
6aa0: 69 64 20 72 62 75 4f 62 6a 49 74 65 72 43 6c 65  id rbuObjIterCle
6ab0: 61 72 53 74 61 74 65 6d 65 6e 74 73 28 52 62 75  arStatements(Rbu
6ac0: 4f 62 6a 49 74 65 72 20 2a 70 49 74 65 72 29 7b  ObjIter *pIter){
6ad0: 0a 20 20 52 62 75 55 70 64 61 74 65 53 74 6d 74  .  RbuUpdateStmt
6ae0: 20 2a 70 55 70 3b 0a 0a 20 20 73 71 6c 69 74 65   *pUp;..  sqlite
6af0: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 49 74 65 72  3_finalize(pIter
6b00: 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 73 71  ->pSelect);.  sq
6b10: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
6b20: 49 74 65 72 2d 3e 70 49 6e 73 65 72 74 29 3b 0a  Iter->pInsert);.
6b30: 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
6b40: 7a 65 28 70 49 74 65 72 2d 3e 70 44 65 6c 65 74  ze(pIter->pDelet
6b50: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  e);.  sqlite3_fi
6b60: 6e 61 6c 69 7a 65 28 70 49 74 65 72 2d 3e 70 54  nalize(pIter->pT
6b70: 6d 70 49 6e 73 65 72 74 29 3b 0a 20 20 70 55 70  mpInsert);.  pUp
6b80: 20 3d 20 70 49 74 65 72 2d 3e 70 52 62 75 55 70   = pIter->pRbuUp
6b90: 64 61 74 65 3b 0a 20 20 77 68 69 6c 65 28 20 70  date;.  while( p
6ba0: 55 70 20 29 7b 0a 20 20 20 20 52 62 75 55 70 64  Up ){.    RbuUpd
6bb0: 61 74 65 53 74 6d 74 20 2a 70 54 6d 70 20 3d 20  ateStmt *pTmp = 
6bc0: 70 55 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  pUp->pNext;.    
6bd0: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
6be0: 28 70 55 70 2d 3e 70 55 70 64 61 74 65 29 3b 0a  (pUp->pUpdate);.
6bf0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
6c00: 28 70 55 70 29 3b 0a 20 20 20 20 70 55 70 20 3d  (pUp);.    pUp =
6c10: 20 70 54 6d 70 3b 0a 20 20 7d 0a 20 20 0a 20 20   pTmp;.  }.  .  
6c20: 70 49 74 65 72 2d 3e 70 53 65 6c 65 63 74 20 3d  pIter->pSelect =
6c30: 20 30 3b 0a 20 20 70 49 74 65 72 2d 3e 70 49 6e   0;.  pIter->pIn
6c40: 73 65 72 74 20 3d 20 30 3b 0a 20 20 70 49 74 65  sert = 0;.  pIte
6c50: 72 2d 3e 70 44 65 6c 65 74 65 20 3d 20 30 3b 0a  r->pDelete = 0;.
6c60: 20 20 70 49 74 65 72 2d 3e 70 52 62 75 55 70 64    pIter->pRbuUpd
6c70: 61 74 65 20 3d 20 30 3b 0a 20 20 70 49 74 65 72  ate = 0;.  pIter
6c80: 2d 3e 70 54 6d 70 49 6e 73 65 72 74 20 3d 20 30  ->pTmpInsert = 0
6c90: 3b 0a 20 20 70 49 74 65 72 2d 3e 6e 43 6f 6c 20  ;.  pIter->nCol 
6ca0: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  = 0;.}../*.** Cl
6cb0: 65 61 6e 20 75 70 20 61 6e 79 20 72 65 73 6f 75  ean up any resou
6cc0: 72 63 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 61  rces allocated a
6cd0: 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 69 74  s part of the it
6ce0: 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 70 61  erator object pa
6cf0: 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 6f  ssed.** as the o
6d00: 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  nly argument..*/
6d10: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75  .static void rbu
6d20: 4f 62 6a 49 74 65 72 46 69 6e 61 6c 69 7a 65 28  ObjIterFinalize(
6d30: 52 62 75 4f 62 6a 49 74 65 72 20 2a 70 49 74 65  RbuObjIter *pIte
6d40: 72 29 7b 0a 20 20 72 62 75 4f 62 6a 49 74 65 72  r){.  rbuObjIter
6d50: 43 6c 65 61 72 53 74 61 74 65 6d 65 6e 74 73 28  ClearStatements(
6d60: 70 49 74 65 72 29 3b 0a 20 20 73 71 6c 69 74 65  pIter);.  sqlite
6d70: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 49 74 65 72  3_finalize(pIter
6d80: 2d 3e 70 54 62 6c 49 74 65 72 29 3b 0a 20 20 73  ->pTblIter);.  s
6d90: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
6da0: 70 49 74 65 72 2d 3e 70 49 64 78 49 74 65 72 29  pIter->pIdxIter)
6db0: 3b 0a 20 20 72 62 75 4f 62 6a 49 74 65 72 46 72  ;.  rbuObjIterFr
6dc0: 65 65 43 6f 6c 73 28 70 49 74 65 72 29 3b 0a 20  eeCols(pIter);. 
6dd0: 20 6d 65 6d 73 65 74 28 70 49 74 65 72 2c 20 30   memset(pIter, 0
6de0: 2c 20 73 69 7a 65 6f 66 28 52 62 75 4f 62 6a 49  , sizeof(RbuObjI
6df0: 74 65 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ter));.}../*.** 
6e00: 41 64 76 61 6e 63 65 20 74 68 65 20 69 74 65 72  Advance the iter
6e10: 61 74 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74  ator to the next
6e20: 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   position..**.**
6e30: 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63   If no error occ
6e40: 75 72 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  urs, SQLITE_OK i
6e50: 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74  s returned and t
6e60: 68 65 20 69 74 65 72 61 74 6f 72 20 69 73 20 6c  he iterator is l
6e70: 65 66 74 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67  eft .** pointing
6e80: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74   to the next ent
6e90: 72 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61  ry. Otherwise, a
6ea0: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64  n error code and
6eb0: 20 6d 65 73 73 61 67 65 20 69 73 20 0a 2a 2a 20   message is .** 
6ec0: 6c 65 66 74 20 69 6e 20 74 68 65 20 52 42 55 20  left in the RBU 
6ed0: 68 61 6e 64 6c 65 20 70 61 73 73 65 64 20 61 73  handle passed as
6ee0: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
6ef0: 65 6e 74 2e 20 41 20 63 6f 70 79 20 6f 66 20 74  ent. A copy of t
6f00: 68 65 20 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64  he .** error cod
6f10: 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
6f20: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62 75  /.static int rbu
6f30: 4f 62 6a 49 74 65 72 4e 65 78 74 28 73 71 6c 69  ObjIterNext(sqli
6f40: 74 65 33 72 62 75 20 2a 70 2c 20 52 62 75 4f 62  te3rbu *p, RbuOb
6f50: 6a 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  jIter *pIter){. 
6f60: 20 69 6e 74 20 72 63 20 3d 20 70 2d 3e 72 63 3b   int rc = p->rc;
6f70: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
6f80: 45 5f 4f 4b 20 29 7b 0a 0a 20 20 20 20 2f 2a 20  E_OK ){..    /* 
6f90: 46 72 65 65 20 61 6e 79 20 53 51 4c 69 74 65 20  Free any SQLite 
6fa0: 73 74 61 74 65 6d 65 6e 74 73 20 75 73 65 64 20  statements used 
6fb0: 77 68 69 6c 65 20 70 72 6f 63 65 73 73 69 6e 67  while processing
6fc0: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 6f 62   the previous ob
6fd0: 6a 65 63 74 20 2a 2f 20 0a 20 20 20 20 72 62 75  ject */ .    rbu
6fe0: 4f 62 6a 49 74 65 72 43 6c 65 61 72 53 74 61 74  ObjIterClearStat
6ff0: 65 6d 65 6e 74 73 28 70 49 74 65 72 29 3b 0a 20  ements(pIter);. 
7000: 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 7a 49     if( pIter->zI
7010: 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  dx==0 ){.      r
7020: 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  c = sqlite3_exec
7030: 28 70 2d 3e 64 62 4d 61 69 6e 2c 0a 20 20 20 20  (p->dbMain,.    
7040: 20 20 20 20 20 20 22 44 52 4f 50 20 54 52 49 47        "DROP TRIG
7050: 47 45 52 20 49 46 20 45 58 49 53 54 53 20 74 65  GER IF EXISTS te
7060: 6d 70 2e 72 62 75 5f 69 6e 73 65 72 74 5f 74 72  mp.rbu_insert_tr
7070: 3b 22 0a 20 20 20 20 20 20 20 20 20 20 22 44 52  ;".          "DR
7080: 4f 50 20 54 52 49 47 47 45 52 20 49 46 20 45 58  OP TRIGGER IF EX
7090: 49 53 54 53 20 74 65 6d 70 2e 72 62 75 5f 75 70  ISTS temp.rbu_up
70a0: 64 61 74 65 31 5f 74 72 3b 22 0a 20 20 20 20 20  date1_tr;".     
70b0: 20 20 20 20 20 22 44 52 4f 50 20 54 52 49 47 47       "DROP TRIGG
70c0: 45 52 20 49 46 20 45 58 49 53 54 53 20 74 65 6d  ER IF EXISTS tem
70d0: 70 2e 72 62 75 5f 75 70 64 61 74 65 32 5f 74 72  p.rbu_update2_tr
70e0: 3b 22 0a 20 20 20 20 20 20 20 20 20 20 22 44 52  ;".          "DR
70f0: 4f 50 20 54 52 49 47 47 45 52 20 49 46 20 45 58  OP TRIGGER IF EX
7100: 49 53 54 53 20 74 65 6d 70 2e 72 62 75 5f 64 65  ISTS temp.rbu_de
7110: 6c 65 74 65 5f 74 72 3b 22 0a 20 20 20 20 20 20  lete_tr;".      
7120: 20 20 20 20 2c 20 30 2c 20 30 2c 20 26 70 2d 3e      , 0, 0, &p->
7130: 7a 45 72 72 6d 73 67 0a 20 20 20 20 20 20 29 3b  zErrmsg.      );
7140: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
7150: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
7160: 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72  .      if( pIter
7170: 2d 3e 62 43 6c 65 61 6e 75 70 20 29 7b 0a 20 20  ->bCleanup ){.  
7180: 20 20 20 20 20 20 72 62 75 4f 62 6a 49 74 65 72        rbuObjIter
7190: 46 72 65 65 43 6f 6c 73 28 70 49 74 65 72 29 3b  FreeCols(pIter);
71a0: 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e  .        pIter->
71b0: 62 43 6c 65 61 6e 75 70 20 3d 20 30 3b 0a 20 20  bCleanup = 0;.  
71c0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
71d0: 65 33 5f 73 74 65 70 28 70 49 74 65 72 2d 3e 70  e3_step(pIter->p
71e0: 54 62 6c 49 74 65 72 29 3b 0a 20 20 20 20 20 20  TblIter);.      
71f0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
7200: 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 20 20  _ROW ){.        
7210: 20 20 72 63 20 3d 20 72 65 73 65 74 41 6e 64 43    rc = resetAndC
7220: 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 49 74 65  ollectError(pIte
7230: 72 2d 3e 70 54 62 6c 49 74 65 72 2c 20 26 70 2d  r->pTblIter, &p-
7240: 3e 7a 45 72 72 6d 73 67 29 3b 0a 20 20 20 20 20  >zErrmsg);.     
7250: 20 20 20 20 20 70 49 74 65 72 2d 3e 7a 54 62 6c       pIter->zTbl
7260: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 0;.        }e
7270: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
7280: 49 74 65 72 2d 3e 7a 54 62 6c 20 3d 20 28 63 6f  Iter->zTbl = (co
7290: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
72a0: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 49  3_column_text(pI
72b0: 74 65 72 2d 3e 70 54 62 6c 49 74 65 72 2c 20 30  ter->pTblIter, 0
72c0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74  );.          pIt
72d0: 65 72 2d 3e 7a 44 61 74 61 54 62 6c 20 3d 20 28  er->zDataTbl = (
72e0: 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
72f0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
7300: 70 49 74 65 72 2d 3e 70 54 62 6c 49 74 65 72 2c  pIter->pTblIter,
7310: 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  1);.          rc
7320: 20 3d 20 28 70 49 74 65 72 2d 3e 7a 44 61 74 61   = (pIter->zData
7330: 54 62 6c 20 26 26 20 70 49 74 65 72 2d 3e 7a 54  Tbl && pIter->zT
7340: 62 6c 29 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20  bl) ? SQLITE_OK 
7350: 3a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  : SQLITE_NOMEM;.
7360: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7370: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
7380: 66 28 20 70 49 74 65 72 2d 3e 7a 49 64 78 3d 3d  f( pIter->zIdx==
7390: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
73a0: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 49 64  qlite3_stmt *pId
73b0: 78 20 3d 20 70 49 74 65 72 2d 3e 70 49 64 78 49  x = pIter->pIdxI
73c0: 74 65 72 3b 0a 20 20 20 20 20 20 20 20 20 20 72  ter;.          r
73d0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  c = sqlite3_bind
73e0: 5f 74 65 78 74 28 70 49 64 78 2c 20 31 2c 20 70  _text(pIdx, 1, p
73f0: 49 74 65 72 2d 3e 7a 54 62 6c 2c 20 2d 31 2c 20  Iter->zTbl, -1, 
7400: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
7410: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7420: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
7430: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
7440: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74   rc = sqlite3_st
7450: 65 70 28 70 49 74 65 72 2d 3e 70 49 64 78 49 74  ep(pIter->pIdxIt
7460: 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  er);.          i
7470: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 52 4f  f( rc!=SQLITE_RO
7480: 57 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  W ){.           
7490: 20 72 63 20 3d 20 72 65 73 65 74 41 6e 64 43 6f   rc = resetAndCo
74a0: 6c 6c 65 63 74 45 72 72 6f 72 28 70 49 74 65 72  llectError(pIter
74b0: 2d 3e 70 49 64 78 49 74 65 72 2c 20 26 70 2d 3e  ->pIdxIter, &p->
74c0: 7a 45 72 72 6d 73 67 29 3b 0a 20 20 20 20 20 20  zErrmsg);.      
74d0: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 62 43 6c        pIter->bCl
74e0: 65 61 6e 75 70 20 3d 20 31 3b 0a 20 20 20 20 20  eanup = 1;.     
74f0: 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 7a 49         pIter->zI
7500: 64 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  dx = 0;.        
7510: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
7520: 20 20 20 20 20 70 49 74 65 72 2d 3e 7a 49 64 78       pIter->zIdx
7530: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
7540: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
7550: 65 78 74 28 70 49 74 65 72 2d 3e 70 49 64 78 49  ext(pIter->pIdxI
7560: 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ter, 0);.       
7570: 20 20 20 20 20 70 49 74 65 72 2d 3e 69 54 6e 75       pIter->iTnu
7580: 6d 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  m = sqlite3_colu
7590: 6d 6e 5f 69 6e 74 28 70 49 74 65 72 2d 3e 70 49  mn_int(pIter->pI
75a0: 64 78 49 74 65 72 2c 20 31 29 3b 0a 20 20 20 20  dxIter, 1);.    
75b0: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 62          pIter->b
75c0: 55 6e 69 71 75 65 20 3d 20 73 71 6c 69 74 65 33  Unique = sqlite3
75d0: 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 49 74 65  _column_int(pIte
75e0: 72 2d 3e 70 49 64 78 49 74 65 72 2c 20 32 29 3b  r->pIdxIter, 2);
75f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
7600: 3d 20 70 49 74 65 72 2d 3e 7a 49 64 78 20 3f 20  = pIter->zIdx ? 
7610: 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49  SQLITE_OK : SQLI
7620: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
7630: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
7640: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
7650: 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  }..  if( rc!=SQL
7660: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 62  ITE_OK ){.    rb
7670: 75 4f 62 6a 49 74 65 72 46 69 6e 61 6c 69 7a 65  uObjIterFinalize
7680: 28 70 49 74 65 72 29 3b 0a 20 20 20 20 70 2d 3e  (pIter);.    p->
7690: 72 63 20 3d 20 72 63 3b 0a 20 20 7d 0a 20 20 72  rc = rc;.  }.  r
76a0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
76b0: 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e  .** The implemen
76c0: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 72 62  tation of the rb
76d0: 75 5f 74 61 72 67 65 74 5f 6e 61 6d 65 28 29 20  u_target_name() 
76e0: 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68  SQL function. Th
76f0: 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61  is function.** a
7700: 63 63 65 70 74 73 20 6f 6e 65 20 6f 72 20 74 77  ccepts one or tw
7710: 6f 20 61 72 67 75 6d 65 6e 74 73 2e 20 54 68 65  o arguments. The
7720: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
7730: 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  is the name of a
7740: 20 74 61 62 6c 65 20 2d 0a 2a 2a 20 74 68 65 20   table -.** the 
7750: 6e 61 6d 65 20 6f 66 20 61 20 74 61 62 6c 65 20  name of a table 
7760: 69 6e 20 74 68 65 20 52 42 55 20 64 61 74 61 62  in the RBU datab
7770: 61 73 65 2e 20 20 54 68 65 20 73 65 63 6f 6e 64  ase.  The second
7780: 2c 20 69 66 20 69 74 20 69 73 20 70 72 65 73 65  , if it is prese
7790: 6e 74 2c 20 69 73 20 31 0a 2a 2a 20 66 6f 72 20  nt, is 1.** for 
77a0: 61 20 76 69 65 77 20 6f 72 20 30 20 66 6f 72 20  a view or 0 for 
77b0: 61 20 74 61 62 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20  a table. .**.** 
77c0: 46 6f 72 20 61 20 6e 6f 6e 2d 76 61 63 75 75 6d  For a non-vacuum
77d0: 20 52 42 55 20 68 61 6e 64 6c 65 2c 20 69 66 20   RBU handle, if 
77e0: 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 6d  the table name m
77f0: 61 74 63 68 65 73 20 74 68 65 20 70 61 74 74 65  atches the patte
7800: 72 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 64 61  rn:.**.**     da
7810: 74 61 5b 30 2d 39 5d 5f 3c 6e 61 6d 65 3e 0a 2a  ta[0-9]_<name>.*
7820: 2a 0a 2a 2a 20 77 68 65 72 65 20 3c 6e 61 6d 65  *.** where <name
7830: 3e 20 69 73 20 61 6e 79 20 73 65 71 75 65 6e 63  > is any sequenc
7840: 65 20 6f 66 20 31 20 6f 72 20 6d 6f 72 65 20 63  e of 1 or more c
7850: 68 61 72 61 63 74 65 72 73 2c 20 3c 6e 61 6d 65  haracters, <name
7860: 3e 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  > is returned..*
7870: 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
7880: 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e  the only argumen
7890: 74 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  t does not match
78a0: 20 74 68 65 20 61 62 6f 76 65 20 70 61 74 74 65   the above patte
78b0: 72 6e 2c 20 61 6e 20 53 51 4c 0a 2a 2a 20 4e 55  rn, an SQL.** NU
78c0: 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  LL is returned..
78d0: 2a 2a 0a 2a 2a 20 20 20 20 20 22 64 61 74 61 5f  **.**     "data_
78e0: 74 31 22 20 20 20 20 20 2d 3e 20 22 74 31 22 0a  t1"     -> "t1".
78f0: 2a 2a 20 20 20 20 20 22 64 61 74 61 30 31 32 33  **     "data0123
7900: 5f 74 32 22 20 2d 3e 20 22 74 32 22 0a 2a 2a 20  _t2" -> "t2".** 
7910: 20 20 20 20 22 64 61 74 61 41 42 5f 74 33 22 20      "dataAB_t3" 
7920: 20 20 2d 3e 20 4e 55 4c 4c 0a 2a 2a 0a 2a 2a 20    -> NULL.**.** 
7930: 46 6f 72 20 61 6e 20 72 62 75 20 76 61 63 75 75  For an rbu vacuu
7940: 6d 20 68 61 6e 64 6c 65 2c 20 61 20 63 6f 70 79  m handle, a copy
7950: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 61 72   of the first ar
7960: 67 75 6d 65 6e 74 20 69 73 20 72 65 74 75 72 6e  gument is return
7970: 65 64 20 69 66 0a 2a 2a 20 74 68 65 20 73 65 63  ed if.** the sec
7980: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
7990: 65 69 74 68 65 72 20 6d 69 73 73 69 6e 67 20 6f  either missing o
79a0: 72 20 30 20 28 6e 6f 74 20 61 20 76 69 65 77 29  r 0 (not a view)
79b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
79c0: 20 72 62 75 54 61 72 67 65 74 4e 61 6d 65 46 75   rbuTargetNameFu
79d0: 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  nc(.  sqlite3_co
79e0: 6e 74 65 78 74 20 2a 70 43 74 78 2c 0a 20 20 69  ntext *pCtx,.  i
79f0: 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74  nt argc,.  sqlit
7a00: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
7a10: 29 7b 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20  ){.  sqlite3rbu 
7a20: 2a 70 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65  *p = sqlite3_use
7a30: 72 5f 64 61 74 61 28 70 43 74 78 29 3b 0a 20 20  r_data(pCtx);.  
7a40: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 3b  const char *zIn;
7a50: 0a 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3d  .  assert( argc=
7a60: 3d 31 20 7c 7c 20 61 72 67 63 3d 3d 32 20 29 3b  =1 || argc==2 );
7a70: 0a 0a 20 20 7a 49 6e 20 3d 20 28 63 6f 6e 73 74  ..  zIn = (const
7a80: 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76   char*)sqlite3_v
7a90: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
7aa0: 5d 29 3b 0a 20 20 69 66 28 20 7a 49 6e 20 29 7b  ]);.  if( zIn ){
7ab0: 0a 20 20 20 20 69 66 28 20 72 62 75 49 73 56 61  .    if( rbuIsVa
7ac0: 63 75 75 6d 28 70 29 20 29 7b 0a 20 20 20 20 20  cuum(p) ){.     
7ad0: 20 69 66 28 20 61 72 67 63 3d 3d 31 20 7c 7c 20   if( argc==1 || 
7ae0: 30 3d 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  0==sqlite3_value
7af0: 5f 69 6e 74 28 61 72 67 76 5b 31 5d 29 20 29 7b  _int(argv[1]) ){
7b00: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7b10: 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43 74  _result_text(pCt
7b20: 78 2c 20 7a 49 6e 2c 20 2d 31 2c 20 53 51 4c 49  x, zIn, -1, SQLI
7b30: 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
7b40: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
7b50: 20 20 20 20 20 69 66 28 20 73 74 72 6c 65 6e 28       if( strlen(
7b60: 7a 49 6e 29 3e 34 20 26 26 20 6d 65 6d 63 6d 70  zIn)>4 && memcmp
7b70: 28 22 64 61 74 61 22 2c 20 7a 49 6e 2c 20 34 29  ("data", zIn, 4)
7b80: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
7b90: 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 66 6f  nt i;.        fo
7ba0: 72 28 69 3d 34 3b 20 7a 49 6e 5b 69 5d 3e 3d 27  r(i=4; zIn[i]>='
7bb0: 30 27 20 26 26 20 7a 49 6e 5b 69 5d 3c 3d 27 39  0' && zIn[i]<='9
7bc0: 27 3b 20 69 2b 2b 29 3b 0a 20 20 20 20 20 20 20  '; i++);.       
7bd0: 20 69 66 28 20 7a 49 6e 5b 69 5d 3d 3d 27 5f 27   if( zIn[i]=='_'
7be0: 20 26 26 20 7a 49 6e 5b 69 2b 31 5d 20 29 7b 0a   && zIn[i+1] ){.
7bf0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
7c00: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43  3_result_text(pC
7c10: 74 78 2c 20 26 7a 49 6e 5b 69 2b 31 5d 2c 20 2d  tx, &zIn[i+1], -
7c20: 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  1, SQLITE_STATIC
7c30: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
7c40: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
7c50: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
7c60: 7a 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  ze the iterator 
7c70: 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64  structure passed
7c80: 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
7c90: 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49  rgument..**.** I
7ca0: 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  f no error occur
7cb0: 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  s, SQLITE_OK is 
7cc0: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65  returned and the
7cd0: 20 69 74 65 72 61 74 6f 72 20 69 73 20 6c 65 66   iterator is lef
7ce0: 74 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74  t .** pointing t
7cf0: 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  o the first entr
7d00: 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e  y. Otherwise, an
7d10: 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20   error code and 
7d20: 6d 65 73 73 61 67 65 20 69 73 20 0a 2a 2a 20 6c  message is .** l
7d30: 65 66 74 20 69 6e 20 74 68 65 20 52 42 55 20 68  eft in the RBU h
7d40: 61 6e 64 6c 65 20 70 61 73 73 65 64 20 61 73 20  andle passed as 
7d50: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
7d60: 6e 74 2e 20 41 20 63 6f 70 79 20 6f 66 20 74 68  nt. A copy of th
7d70: 65 20 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65  e .** error code
7d80: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
7d90: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 4f  .static int rbuO
7da0: 62 6a 49 74 65 72 46 69 72 73 74 28 73 71 6c 69  bjIterFirst(sqli
7db0: 74 65 33 72 62 75 20 2a 70 2c 20 52 62 75 4f 62  te3rbu *p, RbuOb
7dc0: 6a 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  jIter *pIter){. 
7dd0: 20 69 6e 74 20 72 63 3b 0a 20 20 6d 65 6d 73 65   int rc;.  memse
7de0: 74 28 70 49 74 65 72 2c 20 30 2c 20 73 69 7a 65  t(pIter, 0, size
7df0: 6f 66 28 52 62 75 4f 62 6a 49 74 65 72 29 29 3b  of(RbuObjIter));
7e00: 0a 0a 20 20 72 63 20 3d 20 70 72 65 70 61 72 65  ..  rc = prepare
7e10: 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72  FreeAndCollectEr
7e20: 72 6f 72 28 70 2d 3e 64 62 52 62 75 2c 20 26 70  ror(p->dbRbu, &p
7e30: 49 74 65 72 2d 3e 70 54 62 6c 49 74 65 72 2c 20  Iter->pTblIter, 
7e40: 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 20 0a 20 20  &p->zErrmsg, .  
7e50: 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74    sqlite3_mprint
7e60: 66 28 0a 20 20 20 20 20 20 22 53 45 4c 45 43 54  f(.      "SELECT
7e70: 20 72 62 75 5f 74 61 72 67 65 74 5f 6e 61 6d 65   rbu_target_name
7e80: 28 6e 61 6d 65 2c 20 74 79 70 65 3d 27 76 69 65  (name, type='vie
7e90: 77 27 29 20 41 53 20 74 61 72 67 65 74 2c 20 6e  w') AS target, n
7ea0: 61 6d 65 20 22 0a 20 20 20 20 20 20 22 46 52 4f  ame ".      "FRO
7eb0: 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  M sqlite_master 
7ec0: 22 0a 20 20 20 20 20 20 22 57 48 45 52 45 20 74  ".      "WHERE t
7ed0: 79 70 65 20 49 4e 20 28 27 74 61 62 6c 65 27 2c  ype IN ('table',
7ee0: 20 27 76 69 65 77 27 29 20 41 4e 44 20 74 61 72   'view') AND tar
7ef0: 67 65 74 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20  get IS NOT NULL 
7f00: 22 0a 20 20 20 20 20 20 22 20 25 73 20 22 0a 20  ".      " %s ". 
7f10: 20 20 20 20 20 22 4f 52 44 45 52 20 42 59 20 6e       "ORDER BY n
7f20: 61 6d 65 22 0a 20 20 2c 20 72 62 75 49 73 56 61  ame".  , rbuIsVa
7f30: 63 75 75 6d 28 70 29 20 3f 20 22 41 4e 44 20 72  cuum(p) ? "AND r
7f40: 6f 6f 74 70 61 67 65 21 3d 30 20 41 4e 44 20 72  ootpage!=0 AND r
7f50: 6f 6f 74 70 61 67 65 20 49 53 20 4e 4f 54 20 4e  ootpage IS NOT N
7f60: 55 4c 4c 22 20 3a 20 22 22 29 29 3b 0a 0a 20 20  ULL" : ""));..  
7f70: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
7f80: 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 72  K ){.    rc = pr
7f90: 65 70 61 72 65 41 6e 64 43 6f 6c 6c 65 63 74 45  epareAndCollectE
7fa0: 72 72 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20  rror(p->dbMain, 
7fb0: 26 70 49 74 65 72 2d 3e 70 49 64 78 49 74 65 72  &pIter->pIdxIter
7fc0: 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 0a 20  , &p->zErrmsg,. 
7fd0: 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 6e         "SELECT n
7fe0: 61 6d 65 2c 20 72 6f 6f 74 70 61 67 65 2c 20 73  ame, rootpage, s
7ff0: 71 6c 20 49 53 20 4e 55 4c 4c 20 4f 52 20 73 75  ql IS NULL OR su
8000: 62 73 74 72 28 38 2c 20 36 29 3d 3d 27 55 4e 49  bstr(8, 6)=='UNI
8010: 51 55 45 27 20 22 0a 20 20 20 20 20 20 20 20 22  QUE' ".        "
8020: 20 20 46 52 4f 4d 20 6d 61 69 6e 2e 73 71 6c 69    FROM main.sqli
8030: 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20  te_master ".    
8040: 20 20 20 20 22 20 20 57 48 45 52 45 20 74 79 70      "  WHERE typ
8050: 65 3d 27 69 6e 64 65 78 27 20 41 4e 44 20 74 62  e='index' AND tb
8060: 6c 5f 6e 61 6d 65 20 3d 20 3f 22 0a 20 20 20 20  l_name = ?".    
8070: 29 3b 0a 20 20 7d 0a 0a 20 20 70 49 74 65 72 2d  );.  }..  pIter-
8080: 3e 62 43 6c 65 61 6e 75 70 20 3d 20 31 3b 0a 20  >bCleanup = 1;. 
8090: 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 72   p->rc = rc;.  r
80a0: 65 74 75 72 6e 20 72 62 75 4f 62 6a 49 74 65 72  eturn rbuObjIter
80b0: 4e 65 78 74 28 70 2c 20 70 49 74 65 72 29 3b 0a  Next(p, pIter);.
80c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  }../*.** This is
80d0: 20 61 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e   a wrapper aroun
80e0: 64 20 22 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  d "sqlite3_mprin
80f0: 74 66 28 7a 46 6d 74 2c 20 2e 2e 2e 29 22 2e 20  tf(zFmt, ...)". 
8100: 49 66 20 61 6e 20 4f 4f 4d 20 6f 63 63 75 72 73  If an OOM occurs
8110: 2c 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 63 6f  ,.** an error co
8120: 64 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  de is stored in 
8130: 74 68 65 20 52 42 55 20 68 61 6e 64 6c 65 20 70  the RBU handle p
8140: 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
8150: 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a  st argument..**.
8160: 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68  ** If an error h
8170: 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72  as already occur
8180: 72 65 64 20 28 70 2d 3e 72 63 20 69 73 20 61 6c  red (p->rc is al
8190: 72 65 61 64 79 20 73 65 74 20 74 6f 20 73 6f 6d  ready set to som
81a0: 65 74 68 69 6e 67 20 6f 74 68 65 72 0a 2a 2a 20  ething other.** 
81b0: 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 29 2c  than SQLITE_OK),
81c0: 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   then this funct
81d0: 69 6f 6e 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c  ion returns NULL
81e0: 20 77 69 74 68 6f 75 74 20 6d 6f 64 69 66 79 69   without modifyi
81f0: 6e 67 20 74 68 65 0a 2a 2a 20 73 74 6f 72 65 64  ng the.** stored
8200: 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 6e 20   error code. In 
8210: 74 68 69 73 20 63 61 73 65 20 69 74 20 73 74 69  this case it sti
8220: 6c 6c 20 63 61 6c 6c 73 20 73 71 6c 69 74 65 33  ll calls sqlite3
8230: 5f 66 72 65 65 28 29 20 6f 6e 20 61 6e 79 20 0a  _free() on any .
8240: 2a 2a 20 70 72 69 6e 74 66 28 29 20 70 61 72 61  ** printf() para
8250: 6d 65 74 65 72 73 20 61 73 73 6f 63 69 61 74 65  meters associate
8260: 64 20 77 69 74 68 20 25 7a 20 63 6f 6e 76 65 72  d with %z conver
8270: 73 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  sions..*/.static
8280: 20 63 68 61 72 20 2a 72 62 75 4d 50 72 69 6e 74   char *rbuMPrint
8290: 66 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c  f(sqlite3rbu *p,
82a0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d   const char *zFm
82b0: 74 2c 20 2e 2e 2e 29 7b 0a 20 20 63 68 61 72 20  t, ...){.  char 
82c0: 2a 7a 53 71 6c 20 3d 20 30 3b 0a 20 20 76 61 5f  *zSql = 0;.  va_
82d0: 6c 69 73 74 20 61 70 3b 0a 20 20 76 61 5f 73 74  list ap;.  va_st
82e0: 61 72 74 28 61 70 2c 20 7a 46 6d 74 29 3b 0a 20  art(ap, zFmt);. 
82f0: 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
8300: 76 6d 70 72 69 6e 74 66 28 7a 46 6d 74 2c 20 61  vmprintf(zFmt, a
8310: 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  p);.  if( p->rc=
8320: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
8330: 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 20    if( zSql==0 ) 
8340: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  p->rc = SQLITE_N
8350: 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  OMEM;.  }else{. 
8360: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
8370: 7a 53 71 6c 29 3b 0a 20 20 20 20 7a 53 71 6c 20  zSql);.    zSql 
8380: 3d 20 30 3b 0a 20 20 7d 0a 20 20 76 61 5f 65 6e  = 0;.  }.  va_en
8390: 64 28 61 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  d(ap);.  return 
83a0: 7a 53 71 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  zSql;.}../*.** A
83b0: 72 67 75 6d 65 6e 74 20 7a 46 6d 74 20 69 73 20  rgument zFmt is 
83c0: 61 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  a sqlite3_mprint
83d0: 66 28 29 20 73 74 79 6c 65 20 66 6f 72 6d 61 74  f() style format
83e0: 20 73 74 72 69 6e 67 2e 20 54 68 65 20 74 72 61   string. The tra
83f0: 69 6c 69 6e 67 0a 2a 2a 20 61 72 67 75 6d 65 6e  iling.** argumen
8400: 74 73 20 61 72 65 20 74 68 65 20 75 73 75 61 6c  ts are the usual
8410: 20 73 75 62 73 69 74 75 74 69 6f 6e 20 76 61 6c   subsitution val
8420: 75 65 73 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ues. This functi
8430: 6f 6e 20 70 65 72 66 6f 72 6d 73 0a 2a 2a 20 74  on performs.** t
8440: 68 65 20 70 72 69 6e 74 66 28 29 20 73 74 79 6c  he printf() styl
8450: 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e 73 20  e substitutions 
8460: 61 6e 64 20 65 78 65 63 75 74 65 73 20 74 68 65  and executes the
8470: 20 72 65 73 75 6c 74 20 61 73 20 61 6e 20 53 51   result as an SQ
8480: 4c 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 6f  L.** statement o
8490: 6e 20 74 68 65 20 52 42 55 20 68 61 6e 64 6c 65  n the RBU handle
84a0: 73 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  s database..**.*
84b0: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
84c0: 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63  curs, an error c
84d0: 6f 64 65 20 61 6e 64 20 65 72 72 6f 72 20 6d 65  ode and error me
84e0: 73 73 61 67 65 20 69 73 20 73 74 6f 72 65 64 20  ssage is stored 
84f0: 69 6e 20 74 68 65 0a 2a 2a 20 52 42 55 20 68 61  in the.** RBU ha
8500: 6e 64 6c 65 2e 20 49 66 20 61 6e 20 65 72 72 6f  ndle. If an erro
8510: 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63  r has already oc
8520: 63 75 72 72 65 64 20 77 68 65 6e 20 74 68 69 73  curred when this
8530: 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20   function is.** 
8540: 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20  called, it is a 
8550: 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
8560: 20 69 6e 74 20 72 62 75 4d 50 72 69 6e 74 66 45   int rbuMPrintfE
8570: 78 65 63 28 73 71 6c 69 74 65 33 72 62 75 20 2a  xec(sqlite3rbu *
8580: 70 2c 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  p, sqlite3 *db, 
8590: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d 74  const char *zFmt
85a0: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
85b0: 74 20 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 53  t ap;.  char *zS
85c0: 71 6c 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61  ql;.  va_start(a
85d0: 70 2c 20 7a 46 6d 74 29 3b 0a 20 20 7a 53 71 6c  p, zFmt);.  zSql
85e0: 20 3d 20 73 71 6c 69 74 65 33 5f 76 6d 70 72 69   = sqlite3_vmpri
85f0: 6e 74 66 28 7a 46 6d 74 2c 20 61 70 29 3b 0a 20  ntf(zFmt, ap);. 
8600: 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
8610: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
8620: 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20   zSql==0 ){.    
8630: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
8640: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73  _NOMEM;.    }els
8650: 65 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  e{.      p->rc =
8660: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62   sqlite3_exec(db
8670: 2c 20 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 26 70  , zSql, 0, 0, &p
8680: 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a 20 20 20 20  ->zErrmsg);.    
8690: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  }.  }.  sqlite3_
86a0: 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 76 61  free(zSql);.  va
86b0: 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72 65 74 75  _end(ap);.  retu
86c0: 72 6e 20 70 2d 3e 72 63 3b 0a 7d 0a 0a 2f 2a 0a  rn p->rc;.}../*.
86d0: 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 61 6c  ** Attempt to al
86e0: 6c 6f 63 61 74 65 20 61 6e 64 20 72 65 74 75 72  locate and retur
86f0: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
8700: 20 7a 65 72 6f 65 64 20 62 6c 6f 63 6b 20 6f 66   zeroed block of
8710: 20 6e 42 79 74 65 20 0a 2a 2a 20 62 79 74 65 73   nByte .** bytes
8720: 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  . .**.** If an e
8730: 72 72 6f 72 20 28 69 2e 65 2e 20 61 6e 20 4f 4f  rror (i.e. an OO
8740: 4d 20 63 6f 6e 64 69 74 69 6f 6e 29 20 6f 63 63  M condition) occ
8750: 75 72 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c  urs, return NULL
8760: 20 61 6e 64 20 6c 65 61 76 65 20 61 6e 20 0a 2a   and leave an .*
8770: 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 6e 20  * error code in 
8780: 74 68 65 20 72 62 75 20 68 61 6e 64 6c 65 20 70  the rbu handle p
8790: 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
87a0: 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 4f 72 2c  st argument. Or,
87b0: 20 69 66 20 61 6e 20 0a 2a 2a 20 65 72 72 6f 72   if an .** error
87c0: 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63   has already occ
87d0: 75 72 72 65 64 20 77 68 65 6e 20 74 68 69 73 20  urred when this 
87e0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
87f0: 65 64 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20  ed, return NULL 
8800: 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  .** immediately 
8810: 77 69 74 68 6f 75 74 20 61 74 74 65 6d 70 74 69  without attempti
8820: 6e 67 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f  ng the allocatio
8830: 6e 20 6f 72 20 6d 6f 64 69 66 79 69 6e 67 20 74  n or modifying t
8840: 68 65 20 73 74 6f 72 65 64 0a 2a 2a 20 65 72 72  he stored.** err
8850: 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  or code..*/.stat
8860: 69 63 20 76 6f 69 64 20 2a 72 62 75 4d 61 6c 6c  ic void *rbuMall
8870: 6f 63 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70  oc(sqlite3rbu *p
8880: 2c 20 69 6e 74 20 6e 42 79 74 65 29 7b 0a 20 20  , int nByte){.  
8890: 76 6f 69 64 20 2a 70 52 65 74 20 3d 20 30 3b 0a  void *pRet = 0;.
88a0: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
88b0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73  ITE_OK ){.    as
88c0: 73 65 72 74 28 20 6e 42 79 74 65 3e 30 20 29 3b  sert( nByte>0 );
88d0: 0a 20 20 20 20 70 52 65 74 20 3d 20 73 71 6c 69  .    pRet = sqli
88e0: 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 42 79  te3_malloc64(nBy
88f0: 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70 52 65  te);.    if( pRe
8900: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  t==0 ){.      p-
8910: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  >rc = SQLITE_NOM
8920: 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  EM;.    }else{. 
8930: 20 20 20 20 20 6d 65 6d 73 65 74 28 70 52 65 74       memset(pRet
8940: 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  , 0, nByte);.   
8950: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
8960: 70 52 65 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  pRet;.}.../*.** 
8970: 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 7a 65 72  Allocate and zer
8980: 6f 20 74 68 65 20 70 49 74 65 72 2d 3e 61 7a 54  o the pIter->azT
8990: 62 6c 43 6f 6c 5b 5d 20 61 6e 64 20 61 62 54 62  blCol[] and abTb
89a0: 6c 50 6b 5b 5d 20 61 72 72 61 79 73 20 73 6f 20  lPk[] arrays so 
89b0: 74 68 61 74 0a 2a 2a 20 74 68 65 72 65 20 69 73  that.** there is
89c0: 20 72 6f 6f 6d 20 66 6f 72 20 61 74 20 6c 65 61   room for at lea
89d0: 73 74 20 6e 43 6f 6c 20 65 6c 65 6d 65 6e 74 73  st nCol elements
89e0: 2e 20 49 66 20 61 6e 20 4f 4f 4d 20 6f 63 63 75  . If an OOM occu
89f0: 72 73 2c 20 73 74 6f 72 65 20 61 6e 0a 2a 2a 20  rs, store an.** 
8a00: 65 72 72 6f 72 20 63 6f 64 65 20 69 6e 20 74 68  error code in th
8a10: 65 20 52 42 55 20 68 61 6e 64 6c 65 20 70 61 73  e RBU handle pas
8a20: 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
8a30: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   argument..*/.st
8a40: 61 74 69 63 20 76 6f 69 64 20 72 62 75 41 6c 6c  atic void rbuAll
8a50: 6f 63 61 74 65 49 74 65 72 41 72 72 61 79 73 28  ocateIterArrays(
8a60: 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 52  sqlite3rbu *p, R
8a70: 62 75 4f 62 6a 49 74 65 72 20 2a 70 49 74 65 72  buObjIter *pIter
8a80: 2c 20 69 6e 74 20 6e 43 6f 6c 29 7b 0a 20 20 69  , int nCol){.  i
8a90: 6e 74 20 6e 42 79 74 65 20 3d 20 28 32 2a 73 69  nt nByte = (2*si
8aa0: 7a 65 6f 66 28 63 68 61 72 2a 29 20 2b 20 73 69  zeof(char*) + si
8ab0: 7a 65 6f 66 28 69 6e 74 29 20 2b 20 33 2a 73 69  zeof(int) + 3*si
8ac0: 7a 65 6f 66 28 75 38 29 29 20 2a 20 6e 43 6f 6c  zeof(u8)) * nCol
8ad0: 3b 0a 20 20 63 68 61 72 20 2a 2a 61 7a 4e 65 77  ;.  char **azNew
8ae0: 3b 0a 0a 20 20 61 7a 4e 65 77 20 3d 20 28 63 68  ;..  azNew = (ch
8af0: 61 72 2a 2a 29 72 62 75 4d 61 6c 6c 6f 63 28 70  ar**)rbuMalloc(p
8b00: 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20  , nByte);.  if( 
8b10: 61 7a 4e 65 77 20 29 7b 0a 20 20 20 20 70 49 74  azNew ){.    pIt
8b20: 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 20 3d 20 61  er->azTblCol = a
8b30: 7a 4e 65 77 3b 0a 20 20 20 20 70 49 74 65 72 2d  zNew;.    pIter-
8b40: 3e 61 7a 54 62 6c 54 79 70 65 20 3d 20 26 61 7a  >azTblType = &az
8b50: 4e 65 77 5b 6e 43 6f 6c 5d 3b 0a 20 20 20 20 70  New[nCol];.    p
8b60: 49 74 65 72 2d 3e 61 69 53 72 63 4f 72 64 65 72  Iter->aiSrcOrder
8b70: 20 3d 20 28 69 6e 74 2a 29 26 70 49 74 65 72 2d   = (int*)&pIter-
8b80: 3e 61 7a 54 62 6c 54 79 70 65 5b 6e 43 6f 6c 5d  >azTblType[nCol]
8b90: 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 61 62 54  ;.    pIter->abT
8ba0: 62 6c 50 6b 20 3d 20 28 75 38 2a 29 26 70 49 74  blPk = (u8*)&pIt
8bb0: 65 72 2d 3e 61 69 53 72 63 4f 72 64 65 72 5b 6e  er->aiSrcOrder[n
8bc0: 43 6f 6c 5d 3b 0a 20 20 20 20 70 49 74 65 72 2d  Col];.    pIter-
8bd0: 3e 61 62 4e 6f 74 4e 75 6c 6c 20 3d 20 28 75 38  >abNotNull = (u8
8be0: 2a 29 26 70 49 74 65 72 2d 3e 61 62 54 62 6c 50  *)&pIter->abTblP
8bf0: 6b 5b 6e 43 6f 6c 5d 3b 0a 20 20 20 20 70 49 74  k[nCol];.    pIt
8c00: 65 72 2d 3e 61 62 49 6e 64 65 78 65 64 20 3d 20  er->abIndexed = 
8c10: 28 75 38 2a 29 26 70 49 74 65 72 2d 3e 61 62 4e  (u8*)&pIter->abN
8c20: 6f 74 4e 75 6c 6c 5b 6e 43 6f 6c 5d 3b 0a 20 20  otNull[nCol];.  
8c30: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  }.}../*.** The f
8c40: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 6d 75  irst argument mu
8c50: 73 74 20 62 65 20 61 20 6e 75 6c 2d 74 65 72 6d  st be a nul-term
8c60: 69 6e 61 74 65 64 20 73 74 72 69 6e 67 2e 20 54  inated string. T
8c70: 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
8c80: 72 65 74 75 72 6e 73 20 61 20 63 6f 70 79 20 6f  returns a copy o
8c90: 66 20 74 68 65 20 73 74 72 69 6e 67 20 69 6e 20  f the string in 
8ca0: 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20  memory obtained 
8cb0: 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  from sqlite3_mal
8cc0: 6c 6f 63 28 29 2e 0a 2a 2a 20 49 74 20 69 73 20  loc()..** It is 
8cd0: 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  the responsibili
8ce0: 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72  ty of the caller
8cf0: 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 66   to eventually f
8d00: 72 65 65 20 74 68 69 73 20 6d 65 6d 6f 72 79 0a  ree this memory.
8d10: 2a 2a 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ** using sqlite3
8d20: 5f 66 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49  _free()..**.** I
8d30: 66 20 61 6e 20 4f 4f 4d 20 63 6f 6e 64 69 74 69  f an OOM conditi
8d40: 6f 6e 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  on is encountere
8d50: 64 20 77 68 65 6e 20 61 74 74 65 6d 70 74 69 6e  d when attemptin
8d60: 67 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65  g to allocate me
8d70: 6d 6f 72 79 2c 0a 2a 2a 20 6f 75 74 70 75 74 20  mory,.** output 
8d80: 76 61 72 69 61 62 6c 65 20 28 2a 70 52 63 29 20  variable (*pRc) 
8d90: 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  is set to SQLITE
8da0: 5f 4e 4f 4d 45 4d 20 62 65 66 6f 72 65 20 72 65  _NOMEM before re
8db0: 74 75 72 6e 69 6e 67 2e 20 4f 74 68 65 72 77 69  turning. Otherwi
8dc0: 73 65 2c 0a 2a 2a 20 69 66 20 74 68 65 20 61 6c  se,.** if the al
8dd0: 6c 6f 63 61 74 69 6f 6e 20 73 75 63 63 65 65 64  location succeed
8de0: 73 2c 20 28 2a 70 52 63 29 20 69 73 20 6c 65 66  s, (*pRc) is lef
8df0: 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a  t unchanged..*/.
8e00: 73 74 61 74 69 63 20 63 68 61 72 20 2a 72 62 75  static char *rbu
8e10: 53 74 72 6e 64 75 70 28 63 6f 6e 73 74 20 63 68  Strndup(const ch
8e20: 61 72 20 2a 7a 53 74 72 2c 20 69 6e 74 20 2a 70  ar *zStr, int *p
8e30: 52 63 29 7b 0a 20 20 63 68 61 72 20 2a 7a 52 65  Rc){.  char *zRe
8e40: 74 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  t = 0;..  assert
8e50: 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f  ( *pRc==SQLITE_O
8e60: 4b 20 29 3b 0a 20 20 69 66 28 20 7a 53 74 72 20  K );.  if( zStr 
8e70: 29 7b 0a 20 20 20 20 73 69 7a 65 5f 74 20 6e 43  ){.    size_t nC
8e80: 6f 70 79 20 3d 20 73 74 72 6c 65 6e 28 7a 53 74  opy = strlen(zSt
8e90: 72 29 20 2b 20 31 3b 0a 20 20 20 20 7a 52 65 74  r) + 1;.    zRet
8ea0: 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65   = (char*)sqlite
8eb0: 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 43 6f 70 79  3_malloc64(nCopy
8ec0: 29 3b 0a 20 20 20 20 69 66 28 20 7a 52 65 74 20  );.    if( zRet 
8ed0: 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
8ee0: 7a 52 65 74 2c 20 7a 53 74 72 2c 20 6e 43 6f 70  zRet, zStr, nCop
8ef0: 79 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  y);.    }else{. 
8f00: 20 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49       *pRc = SQLI
8f10: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
8f20: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 7a 52    }..  return zR
8f30: 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e  et;.}../*.** Fin
8f40: 61 6c 69 7a 65 20 74 68 65 20 73 74 61 74 65 6d  alize the statem
8f50: 65 6e 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ent passed as th
8f60: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
8f70: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  t..**.** If the 
8f80: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
8f90: 28 29 20 63 61 6c 6c 20 69 6e 64 69 63 61 74 65  () call indicate
8fa0: 73 20 74 68 61 74 20 61 6e 20 65 72 72 6f 72 20  s that an error 
8fb0: 6f 63 63 75 72 73 2c 20 61 6e 64 20 74 68 65 0a  occurs, and the.
8fc0: 2a 2a 20 72 62 75 20 68 61 6e 64 6c 65 20 65 72  ** rbu handle er
8fd0: 72 6f 72 20 63 6f 64 65 20 69 73 20 6e 6f 74 20  ror code is not 
8fe0: 61 6c 72 65 61 64 79 20 73 65 74 2c 20 73 65 74  already set, set
8ff0: 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
9000: 61 6e 64 20 65 72 72 6f 72 0a 2a 2a 20 6d 65 73  and error.** mes
9010: 73 61 67 65 20 61 63 63 6f 72 64 69 6e 67 6c 79  sage accordingly
9020: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
9030: 20 72 62 75 46 69 6e 61 6c 69 7a 65 28 73 71 6c   rbuFinalize(sql
9040: 69 74 65 33 72 62 75 20 2a 70 2c 20 73 71 6c 69  ite3rbu *p, sqli
9050: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 29  te3_stmt *pStmt)
9060: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
9070: 3d 20 73 71 6c 69 74 65 33 5f 64 62 5f 68 61 6e  = sqlite3_db_han
9080: 64 6c 65 28 70 53 74 6d 74 29 3b 0a 20 20 69 6e  dle(pStmt);.  in
9090: 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66  t rc = sqlite3_f
90a0: 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
90b0: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
90c0: 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51  ITE_OK && rc!=SQ
90d0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
90e0: 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 70  ->rc = rc;.    p
90f0: 2d 3e 7a 45 72 72 6d 73 67 20 3d 20 73 71 6c 69  ->zErrmsg = sqli
9100: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22  te3_mprintf("%s"
9110: 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
9120: 28 64 62 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  (db));.  }.}../*
9130: 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 74   Determine the t
9140: 79 70 65 20 6f 66 20 61 20 74 61 62 6c 65 2e 0a  ype of a table..
9150: 2a 2a 0a 2a 2a 20 20 20 70 65 54 79 70 65 20 69  **.**   peType i
9160: 73 20 6f 66 20 74 79 70 65 20 28 69 6e 74 2a 29  s of type (int*)
9170: 2c 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  , a pointer to a
9180: 6e 20 6f 75 74 70 75 74 20 70 61 72 61 6d 65 74  n output paramet
9190: 65 72 20 6f 66 20 74 79 70 65 0a 2a 2a 20 20 20  er of type.**   
91a0: 28 69 6e 74 29 2e 20 54 68 69 73 20 63 61 6c 6c  (int). This call
91b0: 20 73 65 74 73 20 74 68 65 20 6f 75 74 70 75 74   sets the output
91c0: 20 70 61 72 61 6d 65 74 65 72 20 61 73 20 66 6f   parameter as fo
91d0: 6c 6c 6f 77 73 2c 20 64 65 70 65 6e 64 69 6e 67  llows, depending
91e0: 0a 2a 2a 20 20 20 6f 6e 20 74 68 65 20 74 79 70  .**   on the typ
91f0: 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 73  e of the table s
9200: 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61  pecified by para
9210: 6d 65 74 65 72 73 20 64 62 4e 61 6d 65 20 61 6e  meters dbName an
9220: 64 20 7a 54 62 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20  d zTbl..**.**   
9230: 20 20 52 42 55 5f 50 4b 5f 4e 4f 54 41 42 4c 45    RBU_PK_NOTABLE
9240: 3a 20 20 20 20 20 20 20 4e 6f 20 73 75 63 68 20  :       No such 
9250: 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 52 42  table..**     RB
9260: 55 5f 50 4b 5f 4e 4f 4e 45 3a 20 20 20 20 20 20  U_PK_NONE:      
9270: 20 20 20 20 54 61 62 6c 65 20 68 61 73 20 61 6e      Table has an
9280: 20 69 6d 70 6c 69 63 69 74 20 72 6f 77 69 64 2e   implicit rowid.
9290: 0a 2a 2a 20 20 20 20 20 52 42 55 5f 50 4b 5f 49  .**     RBU_PK_I
92a0: 50 4b 3a 20 20 20 20 20 20 20 20 20 20 20 54 61  PK:           Ta
92b0: 62 6c 65 20 68 61 73 20 61 6e 20 65 78 70 6c 69  ble has an expli
92c0: 63 69 74 20 49 50 4b 20 63 6f 6c 75 6d 6e 2e 0a  cit IPK column..
92d0: 2a 2a 20 20 20 20 20 52 42 55 5f 50 4b 5f 45 58  **     RBU_PK_EX
92e0: 54 45 52 4e 41 4c 3a 20 20 20 20 20 20 54 61 62  TERNAL:      Tab
92f0: 6c 65 20 68 61 73 20 61 6e 20 65 78 74 65 72 6e  le has an extern
9300: 61 6c 20 50 4b 20 69 6e 64 65 78 2e 0a 2a 2a 20  al PK index..** 
9310: 20 20 20 20 52 42 55 5f 50 4b 5f 57 49 54 48 4f      RBU_PK_WITHO
9320: 55 54 5f 52 4f 57 49 44 3a 20 54 61 62 6c 65 20  UT_ROWID: Table 
9330: 69 73 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44  is WITHOUT ROWID
9340: 2e 0a 2a 2a 20 20 20 20 20 52 42 55 5f 50 4b 5f  ..**     RBU_PK_
9350: 56 54 41 42 3a 20 20 20 20 20 20 20 20 20 20 54  VTAB:          T
9360: 61 62 6c 65 20 69 73 20 61 20 76 69 72 74 75 61  able is a virtua
9370: 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20  l table..**.**  
9380: 20 41 72 67 75 6d 65 6e 74 20 2a 70 69 50 6b 20   Argument *piPk 
9390: 69 73 20 61 6c 73 6f 20 6f 66 20 74 79 70 65 20  is also of type 
93a0: 28 69 6e 74 2a 29 2c 20 61 6e 64 20 61 6c 73 6f  (int*), and also
93b0: 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 6f 75   points to an ou
93c0: 74 70 75 74 0a 2a 2a 20 20 20 70 61 72 61 6d 65  tput.**   parame
93d0: 74 65 72 2e 20 55 6e 6c 65 73 73 20 74 68 65 20  ter. Unless the 
93e0: 74 61 62 6c 65 20 68 61 73 20 61 6e 20 65 78 74  table has an ext
93f0: 65 72 6e 61 6c 20 70 72 69 6d 61 72 79 20 6b 65  ernal primary ke
9400: 79 20 69 6e 64 65 78 20 0a 2a 2a 20 20 20 28 69  y index .**   (i
9410: 2e 65 2e 20 75 6e 6c 65 73 73 20 2a 70 65 54 79  .e. unless *peTy
9420: 70 65 20 69 73 20 73 65 74 20 74 6f 20 33 29 2c  pe is set to 3),
9430: 20 74 68 65 6e 20 2a 70 69 50 6b 20 69 73 20 73   then *piPk is s
9440: 65 74 20 74 6f 20 7a 65 72 6f 2e 20 4f 72 2c 0a  et to zero. Or,.
9450: 2a 2a 20 20 20 69 66 20 74 68 65 20 74 61 62 6c  **   if the tabl
9460: 65 20 64 6f 65 73 20 68 61 76 65 20 61 6e 20 65  e does have an e
9470: 78 74 65 72 6e 61 6c 20 70 72 69 6d 61 72 79 20  xternal primary 
9480: 6b 65 79 20 69 6e 64 65 78 2c 20 74 68 65 6e 20  key index, then 
9490: 2a 70 69 50 6b 0a 2a 2a 20 20 20 69 73 20 73 65  *piPk.**   is se
94a0: 74 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61  t to the root pa
94b0: 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
94c0: 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e 64   primary key ind
94d0: 65 78 20 62 65 66 6f 72 65 0a 2a 2a 20 20 20 72  ex before.**   r
94e0: 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  eturning..**.** 
94f0: 41 4c 47 4f 52 49 54 48 4d 3a 0a 2a 2a 0a 2a 2a  ALGORITHM:.**.**
9500: 20 20 20 69 66 28 20 6e 6f 20 65 6e 74 72 79 20     if( no entry 
9510: 65 78 69 73 74 73 20 69 6e 20 73 71 6c 69 74 65  exists in sqlite
9520: 5f 6d 61 73 74 65 72 20 29 7b 0a 2a 2a 20 20 20  _master ){.**   
9530: 20 20 72 65 74 75 72 6e 20 52 42 55 5f 50 4b 5f    return RBU_PK_
9540: 4e 4f 54 41 42 4c 45 0a 2a 2a 20 20 20 7d 65 6c  NOTABLE.**   }el
9550: 73 65 20 69 66 28 20 73 71 6c 20 66 6f 72 20 74  se if( sql for t
9560: 68 65 20 65 6e 74 72 79 20 73 74 61 72 74 73 20  he entry starts 
9570: 77 69 74 68 20 22 43 52 45 41 54 45 20 56 49 52  with "CREATE VIR
9580: 54 55 41 4c 22 20 29 7b 0a 2a 2a 20 20 20 20 20  TUAL" ){.**     
9590: 72 65 74 75 72 6e 20 52 42 55 5f 50 4b 5f 56 54  return RBU_PK_VT
95a0: 41 42 0a 2a 2a 20 20 20 7d 65 6c 73 65 20 69 66  AB.**   }else if
95b0: 28 20 22 50 52 41 47 4d 41 20 69 6e 64 65 78 5f  ( "PRAGMA index_
95c0: 6c 69 73 74 28 29 22 20 66 6f 72 20 74 68 65 20  list()" for the 
95d0: 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61  table contains a
95e0: 20 22 70 6b 22 20 69 6e 64 65 78 20 29 7b 0a 2a   "pk" index ){.*
95f0: 2a 20 20 20 20 20 69 66 28 20 74 68 65 20 69 6e  *     if( the in
9600: 64 65 78 20 74 68 61 74 20 69 73 20 74 68 65 20  dex that is the 
9610: 70 6b 20 65 78 69 73 74 73 20 69 6e 20 73 71 6c  pk exists in sql
9620: 69 74 65 5f 6d 61 73 74 65 72 20 29 7b 0a 2a 2a  ite_master ){.**
9630: 20 20 20 20 20 20 20 2a 70 69 50 4b 20 3d 20 72         *piPK = r
9640: 6f 6f 74 70 61 67 65 20 6f 66 20 74 68 61 74 20  ootpage of that 
9650: 69 6e 64 65 78 2e 0a 2a 2a 20 20 20 20 20 20 20  index..**       
9660: 72 65 74 75 72 6e 20 52 42 55 5f 50 4b 5f 45 58  return RBU_PK_EX
9670: 54 45 52 4e 41 4c 0a 2a 2a 20 20 20 20 20 7d 65  TERNAL.**     }e
9680: 6c 73 65 7b 0a 2a 2a 20 20 20 20 20 20 20 72 65  lse{.**       re
9690: 74 75 72 6e 20 52 42 55 5f 50 4b 5f 57 49 54 48  turn RBU_PK_WITH
96a0: 4f 55 54 5f 52 4f 57 49 44 0a 2a 2a 20 20 20 20  OUT_ROWID.**    
96b0: 20 7d 0a 2a 2a 20 20 20 7d 65 6c 73 65 20 69 66   }.**   }else if
96c0: 28 20 22 50 52 41 47 4d 41 20 74 61 62 6c 65 5f  ( "PRAGMA table_
96d0: 69 6e 66 6f 28 29 22 20 6c 69 73 74 73 20 6f 6e  info()" lists on
96e0: 65 20 6f 72 20 6d 6f 72 65 20 22 70 6b 22 20 63  e or more "pk" c
96f0: 6f 6c 75 6d 6e 73 20 29 7b 0a 2a 2a 20 20 20 20  olumns ){.**    
9700: 20 72 65 74 75 72 6e 20 52 42 55 5f 50 4b 5f 49   return RBU_PK_I
9710: 50 4b 0a 2a 2a 20 20 20 7d 65 6c 73 65 7b 0a 2a  PK.**   }else{.*
9720: 2a 20 20 20 20 20 72 65 74 75 72 6e 20 52 42 55  *     return RBU
9730: 5f 50 4b 5f 4e 4f 4e 45 0a 2a 2a 20 20 20 7d 0a  _PK_NONE.**   }.
9740: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
9750: 62 75 54 61 62 6c 65 54 79 70 65 28 0a 20 20 73  buTableType(.  s
9760: 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 0a 20 20  qlite3rbu *p,.  
9770: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
9780: 2c 0a 20 20 69 6e 74 20 2a 70 65 54 79 70 65 2c  ,.  int *peType,
9790: 0a 20 20 69 6e 74 20 2a 70 69 54 6e 75 6d 2c 0a  .  int *piTnum,.
97a0: 20 20 69 6e 74 20 2a 70 69 50 6b 0a 29 7b 0a 20    int *piPk.){. 
97b0: 20 2f 2a 0a 20 20 2a 2a 20 30 29 20 53 45 4c 45   /*.  ** 0) SELE
97c0: 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
97d0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 77   sqlite_master w
97e0: 68 65 72 65 20 6e 61 6d 65 3d 25 51 20 41 4e 44  here name=%Q AND
97f0: 20 49 73 56 69 72 74 75 61 6c 28 25 51 29 0a 20   IsVirtual(%Q). 
9800: 20 2a 2a 20 31 29 20 50 52 41 47 4d 41 20 69 6e   ** 1) PRAGMA in
9810: 64 65 78 5f 6c 69 73 74 20 3d 20 3f 0a 20 20 2a  dex_list = ?.  *
9820: 2a 20 32 29 20 53 45 4c 45 43 54 20 63 6f 75 6e  * 2) SELECT coun
9830: 74 28 2a 29 20 46 52 4f 4d 20 73 71 6c 69 74 65  t(*) FROM sqlite
9840: 5f 6d 61 73 74 65 72 20 77 68 65 72 65 20 6e 61  _master where na
9850: 6d 65 3d 25 51 20 0a 20 20 2a 2a 20 33 29 20 50  me=%Q .  ** 3) P
9860: 52 41 47 4d 41 20 74 61 62 6c 65 5f 69 6e 66 6f  RAGMA table_info
9870: 20 3d 20 3f 0a 20 20 2a 2f 0a 20 20 73 71 6c 69   = ?.  */.  sqli
9880: 74 65 33 5f 73 74 6d 74 20 2a 61 53 74 6d 74 5b  te3_stmt *aStmt[
9890: 34 5d 20 3d 20 7b 30 2c 20 30 2c 20 30 2c 20 30  4] = {0, 0, 0, 0
98a0: 7d 3b 0a 0a 20 20 2a 70 65 54 79 70 65 20 3d 20  };..  *peType = 
98b0: 52 42 55 5f 50 4b 5f 4e 4f 54 41 42 4c 45 3b 0a  RBU_PK_NOTABLE;.
98c0: 20 20 2a 70 69 50 6b 20 3d 20 30 3b 0a 0a 20 20    *piPk = 0;..  
98d0: 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53  assert( p->rc==S
98e0: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 70 2d  QLITE_OK );.  p-
98f0: 3e 72 63 20 3d 20 70 72 65 70 61 72 65 46 72 65  >rc = prepareFre
9900: 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72  eAndCollectError
9910: 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 61 53 74  (p->dbMain, &aSt
9920: 6d 74 5b 30 5d 2c 20 26 70 2d 3e 7a 45 72 72 6d  mt[0], &p->zErrm
9930: 73 67 2c 20 0a 20 20 20 20 73 71 6c 69 74 65 33  sg, .    sqlite3
9940: 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20  _mprintf(.      
9950: 20 20 20 20 22 53 45 4c 45 43 54 20 28 73 71 6c      "SELECT (sql
9960: 20 4c 49 4b 45 20 27 63 72 65 61 74 65 20 76 69   LIKE 'create vi
9970: 72 74 75 61 6c 25 25 27 29 2c 20 72 6f 6f 74 70  rtual%%'), rootp
9980: 61 67 65 22 0a 20 20 20 20 20 20 20 20 20 20 22  age".          "
9990: 20 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61    FROM sqlite_ma
99a0: 73 74 65 72 22 0a 20 20 20 20 20 20 20 20 20 20  ster".          
99b0: 22 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 22  " WHERE name=%Q"
99c0: 2c 20 7a 54 61 62 0a 20 20 29 29 3b 0a 20 20 69  , zTab.  ));.  i
99d0: 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45  f( p->rc!=SQLITE
99e0: 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74 65 33 5f 73  _OK || sqlite3_s
99f0: 74 65 70 28 61 53 74 6d 74 5b 30 5d 29 21 3d 53  tep(aStmt[0])!=S
9a00: 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20  QLITE_ROW ){.   
9a10: 20 2f 2a 20 45 69 74 68 65 72 20 61 6e 20 65 72   /* Either an er
9a20: 72 6f 72 2c 20 6f 72 20 6e 6f 20 73 75 63 68 20  ror, or no such 
9a30: 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 67 6f  table. */.    go
9a40: 74 6f 20 72 62 75 54 61 62 6c 65 54 79 70 65 5f  to rbuTableType_
9a50: 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  end;.  }.  if( s
9a60: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
9a70: 74 28 61 53 74 6d 74 5b 30 5d 2c 20 30 29 20 29  t(aStmt[0], 0) )
9a80: 7b 0a 20 20 20 20 2a 70 65 54 79 70 65 20 3d 20  {.    *peType = 
9a90: 52 42 55 5f 50 4b 5f 56 54 41 42 3b 20 20 20 20  RBU_PK_VTAB;    
9aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ab0: 20 2f 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c   /* virtual tabl
9ac0: 65 20 2a 2f 0a 20 20 20 20 67 6f 74 6f 20 72 62  e */.    goto rb
9ad0: 75 54 61 62 6c 65 54 79 70 65 5f 65 6e 64 3b 0a  uTableType_end;.
9ae0: 20 20 7d 0a 20 20 2a 70 69 54 6e 75 6d 20 3d 20    }.  *piTnum = 
9af0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
9b00: 6e 74 28 61 53 74 6d 74 5b 30 5d 2c 20 31 29 3b  nt(aStmt[0], 1);
9b10: 0a 0a 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70  ..  p->rc = prep
9b20: 61 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63  areFreeAndCollec
9b30: 74 45 72 72 6f 72 28 70 2d 3e 64 62 4d 61 69 6e  tError(p->dbMain
9b40: 2c 20 26 61 53 74 6d 74 5b 31 5d 2c 20 26 70 2d  , &aStmt[1], &p-
9b50: 3e 7a 45 72 72 6d 73 67 2c 20 0a 20 20 20 20 73  >zErrmsg, .    s
9b60: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
9b70: 50 52 41 47 4d 41 20 69 6e 64 65 78 5f 6c 69 73  PRAGMA index_lis
9b80: 74 3d 25 51 22 2c 7a 54 61 62 29 0a 20 20 29 3b  t=%Q",zTab).  );
9b90: 0a 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20 67  .  if( p->rc ) g
9ba0: 6f 74 6f 20 72 62 75 54 61 62 6c 65 54 79 70 65  oto rbuTableType
9bb0: 5f 65 6e 64 3b 0a 20 20 77 68 69 6c 65 28 20 73  _end;.  while( s
9bc0: 71 6c 69 74 65 33 5f 73 74 65 70 28 61 53 74 6d  qlite3_step(aStm
9bd0: 74 5b 31 5d 29 3d 3d 53 51 4c 49 54 45 5f 52 4f  t[1])==SQLITE_RO
9be0: 57 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75  W ){.    const u
9bf0: 38 20 2a 7a 4f 72 69 67 20 3d 20 73 71 6c 69 74  8 *zOrig = sqlit
9c00: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 61  e3_column_text(a
9c10: 53 74 6d 74 5b 31 5d 2c 20 33 29 3b 0a 20 20 20  Stmt[1], 3);.   
9c20: 20 63 6f 6e 73 74 20 75 38 20 2a 7a 49 64 78 20   const u8 *zIdx 
9c30: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
9c40: 5f 74 65 78 74 28 61 53 74 6d 74 5b 31 5d 2c 20  _text(aStmt[1], 
9c50: 31 29 3b 0a 20 20 20 20 69 66 28 20 7a 4f 72 69  1);.    if( zOri
9c60: 67 20 26 26 20 7a 49 64 78 20 26 26 20 7a 4f 72  g && zIdx && zOr
9c70: 69 67 5b 30 5d 3d 3d 27 70 27 20 29 7b 0a 20 20  ig[0]=='p' ){.  
9c80: 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70      p->rc = prep
9c90: 61 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63  areFreeAndCollec
9ca0: 74 45 72 72 6f 72 28 70 2d 3e 64 62 4d 61 69 6e  tError(p->dbMain
9cb0: 2c 20 26 61 53 74 6d 74 5b 32 5d 2c 20 26 70 2d  , &aStmt[2], &p-
9cc0: 3e 7a 45 72 72 6d 73 67 2c 20 0a 20 20 20 20 20  >zErrmsg, .     
9cd0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72       sqlite3_mpr
9ce0: 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20  intf(.          
9cf0: 20 20 22 53 45 4c 45 43 54 20 72 6f 6f 74 70 61    "SELECT rootpa
9d00: 67 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d  ge FROM sqlite_m
9d10: 61 73 74 65 72 20 57 48 45 52 45 20 6e 61 6d 65  aster WHERE name
9d20: 20 3d 20 25 51 22 2c 20 7a 49 64 78 0a 20 20 20   = %Q", zIdx.   
9d30: 20 20 20 29 29 3b 0a 20 20 20 20 20 20 69 66 28     ));.      if(
9d40: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
9d50: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  K ){.        if(
9d60: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 61 53   sqlite3_step(aS
9d70: 74 6d 74 5b 32 5d 29 3d 3d 53 51 4c 49 54 45 5f  tmt[2])==SQLITE_
9d80: 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ROW ){.         
9d90: 20 2a 70 69 50 6b 20 3d 20 73 71 6c 69 74 65 33   *piPk = sqlite3
9da0: 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 61 53 74 6d  _column_int(aStm
9db0: 74 5b 32 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20  t[2], 0);.      
9dc0: 20 20 20 20 2a 70 65 54 79 70 65 20 3d 20 52 42      *peType = RB
9dd0: 55 5f 50 4b 5f 45 58 54 45 52 4e 41 4c 3b 0a 20  U_PK_EXTERNAL;. 
9de0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
9df0: 20 20 20 20 20 20 20 20 2a 70 65 54 79 70 65 20          *peType 
9e00: 3d 20 52 42 55 5f 50 4b 5f 57 49 54 48 4f 55 54  = RBU_PK_WITHOUT
9e10: 5f 52 4f 57 49 44 3b 0a 20 20 20 20 20 20 20 20  _ROWID;.        
9e20: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
9e30: 67 6f 74 6f 20 72 62 75 54 61 62 6c 65 54 79 70  goto rbuTableTyp
9e40: 65 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 7d  e_end;.    }.  }
9e50: 0a 0a 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70  ..  p->rc = prep
9e60: 61 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63  areFreeAndCollec
9e70: 74 45 72 72 6f 72 28 70 2d 3e 64 62 4d 61 69 6e  tError(p->dbMain
9e80: 2c 20 26 61 53 74 6d 74 5b 33 5d 2c 20 26 70 2d  , &aStmt[3], &p-
9e90: 3e 7a 45 72 72 6d 73 67 2c 20 0a 20 20 20 20 73  >zErrmsg, .    s
9ea0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
9eb0: 50 52 41 47 4d 41 20 74 61 62 6c 65 5f 69 6e 66  PRAGMA table_inf
9ec0: 6f 3d 25 51 22 2c 7a 54 61 62 29 0a 20 20 29 3b  o=%Q",zTab).  );
9ed0: 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
9ee0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 77  LITE_OK ){.    w
9ef0: 68 69 6c 65 28 20 73 71 6c 69 74 65 33 5f 73 74  hile( sqlite3_st
9f00: 65 70 28 61 53 74 6d 74 5b 33 5d 29 3d 3d 53 51  ep(aStmt[3])==SQ
9f10: 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20  LITE_ROW ){.    
9f20: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 6f    if( sqlite3_co
9f30: 6c 75 6d 6e 5f 69 6e 74 28 61 53 74 6d 74 5b 33  lumn_int(aStmt[3
9f40: 5d 2c 35 29 3e 30 20 29 7b 0a 20 20 20 20 20 20  ],5)>0 ){.      
9f50: 20 20 2a 70 65 54 79 70 65 20 3d 20 52 42 55 5f    *peType = RBU_
9f60: 50 4b 5f 49 50 4b 3b 20 20 20 20 20 20 20 20 20  PK_IPK;         
9f70: 20 20 20 20 20 20 20 2f 2a 20 65 78 70 6c 69 63         /* explic
9f80: 69 74 20 49 50 4b 20 63 6f 6c 75 6d 6e 20 2a 2f  it IPK column */
9f90: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 72 62  .        goto rb
9fa0: 75 54 61 62 6c 65 54 79 70 65 5f 65 6e 64 3b 0a  uTableType_end;.
9fb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
9fc0: 20 20 2a 70 65 54 79 70 65 20 3d 20 52 42 55 5f    *peType = RBU_
9fd0: 50 4b 5f 4e 4f 4e 45 3b 0a 20 20 7d 0a 0a 72 62  PK_NONE;.  }..rb
9fe0: 75 54 61 62 6c 65 54 79 70 65 5f 65 6e 64 3a 20  uTableType_end: 
9ff0: 7b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69  {.    unsigned i
a000: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
a010: 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 74 6d  0; i<sizeof(aStm
a020: 74 29 2f 73 69 7a 65 6f 66 28 61 53 74 6d 74 5b  t)/sizeof(aStmt[
a030: 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  0]); i++){.     
a040: 20 72 62 75 46 69 6e 61 6c 69 7a 65 28 70 2c 20   rbuFinalize(p, 
a050: 61 53 74 6d 74 5b 69 5d 29 3b 0a 20 20 20 20 7d  aStmt[i]);.    }
a060: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
a070: 69 73 20 69 73 20 61 20 68 65 6c 70 65 72 20 66  is is a helper f
a080: 75 6e 63 74 69 6f 6e 20 66 6f 72 20 72 62 75 4f  unction for rbuO
a090: 62 6a 49 74 65 72 43 61 63 68 65 54 61 62 6c 65  bjIterCacheTable
a0a0: 49 6e 66 6f 28 29 2e 20 49 74 20 70 6f 70 75 6c  Info(). It popul
a0b0: 61 74 65 73 0a 2a 2a 20 74 68 65 20 70 49 74 65  ates.** the pIte
a0c0: 72 2d 3e 61 62 49 6e 64 65 78 65 64 5b 5d 20 61  r->abIndexed[] a
a0d0: 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rray..*/.static 
a0e0: 76 6f 69 64 20 72 62 75 4f 62 6a 49 74 65 72 43  void rbuObjIterC
a0f0: 61 63 68 65 49 6e 64 65 78 65 64 43 6f 6c 73 28  acheIndexedCols(
a100: 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 52  sqlite3rbu *p, R
a110: 62 75 4f 62 6a 49 74 65 72 20 2a 70 49 74 65 72  buObjIter *pIter
a120: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
a130: 74 20 2a 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20  t *pList = 0;.  
a140: 69 6e 74 20 62 49 6e 64 65 78 20 3d 20 30 3b 0a  int bIndex = 0;.
a150: 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
a160: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6d  LITE_OK ){.    m
a170: 65 6d 63 70 79 28 70 49 74 65 72 2d 3e 61 62 49  emcpy(pIter->abI
a180: 6e 64 65 78 65 64 2c 20 70 49 74 65 72 2d 3e 61  ndexed, pIter->a
a190: 62 54 62 6c 50 6b 2c 20 73 69 7a 65 6f 66 28 75  bTblPk, sizeof(u
a1a0: 38 29 2a 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f  8)*pIter->nTblCo
a1b0: 6c 29 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20  l);.    p->rc = 
a1c0: 70 72 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f  prepareFreeAndCo
a1d0: 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62  llectError(p->db
a1e0: 4d 61 69 6e 2c 20 26 70 4c 69 73 74 2c 20 26 70  Main, &pList, &p
a1f0: 2d 3e 7a 45 72 72 6d 73 67 2c 0a 20 20 20 20 20  ->zErrmsg,.     
a200: 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e     sqlite3_mprin
a210: 74 66 28 22 50 52 41 47 4d 41 20 6d 61 69 6e 2e  tf("PRAGMA main.
a220: 69 6e 64 65 78 5f 6c 69 73 74 20 3d 20 25 51 22  index_list = %Q"
a230: 2c 20 70 49 74 65 72 2d 3e 7a 54 62 6c 29 0a 20  , pIter->zTbl). 
a240: 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 70 49 74     );.  }..  pIt
a250: 65 72 2d 3e 6e 49 6e 64 65 78 20 3d 20 30 3b 0a  er->nIndex = 0;.
a260: 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d    while( p->rc==
a270: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c  SQLITE_OK && SQL
a280: 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
a290: 5f 73 74 65 70 28 70 4c 69 73 74 29 20 29 7b 0a  _step(pList) ){.
a2a0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
a2b0: 7a 49 64 78 20 3d 20 28 63 6f 6e 73 74 20 63 68  zIdx = (const ch
a2c0: 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
a2d0: 6d 6e 5f 74 65 78 74 28 70 4c 69 73 74 2c 20 31  mn_text(pList, 1
a2e0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  );.    sqlite3_s
a2f0: 74 6d 74 20 2a 70 58 49 6e 66 6f 20 3d 20 30 3b  tmt *pXInfo = 0;
a300: 0a 20 20 20 20 69 66 28 20 7a 49 64 78 3d 3d 30  .    if( zIdx==0
a310: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 2d   ) break;.    p-
a320: 3e 72 63 20 3d 20 70 72 65 70 61 72 65 46 72 65  >rc = prepareFre
a330: 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72  eAndCollectError
a340: 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 70 58 49  (p->dbMain, &pXI
a350: 6e 66 6f 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67  nfo, &p->zErrmsg
a360: 2c 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ,.        sqlite
a370: 33 5f 6d 70 72 69 6e 74 66 28 22 50 52 41 47 4d  3_mprintf("PRAGM
a380: 41 20 6d 61 69 6e 2e 69 6e 64 65 78 5f 78 69 6e  A main.index_xin
a390: 66 6f 20 3d 20 25 51 22 2c 20 7a 49 64 78 29 0a  fo = %Q", zIdx).
a3a0: 20 20 20 20 29 3b 0a 20 20 20 20 77 68 69 6c 65      );.    while
a3b0: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
a3c0: 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57  OK && SQLITE_ROW
a3d0: 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ==sqlite3_step(p
a3e0: 58 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 20 20  XInfo) ){.      
a3f0: 69 6e 74 20 69 43 69 64 20 3d 20 73 71 6c 69 74  int iCid = sqlit
a400: 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 58  e3_column_int(pX
a410: 49 6e 66 6f 2c 20 31 29 3b 0a 20 20 20 20 20 20  Info, 1);.      
a420: 69 66 28 20 69 43 69 64 3e 3d 30 20 29 20 70 49  if( iCid>=0 ) pI
a430: 74 65 72 2d 3e 61 62 49 6e 64 65 78 65 64 5b 69  ter->abIndexed[i
a440: 43 69 64 5d 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  Cid] = 1;.    }.
a450: 20 20 20 20 72 62 75 46 69 6e 61 6c 69 7a 65 28      rbuFinalize(
a460: 70 2c 20 70 58 49 6e 66 6f 29 3b 0a 20 20 20 20  p, pXInfo);.    
a470: 62 49 6e 64 65 78 20 3d 20 31 3b 0a 20 20 20 20  bIndex = 1;.    
a480: 70 49 74 65 72 2d 3e 6e 49 6e 64 65 78 2b 2b 3b  pIter->nIndex++;
a490: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 49 74 65  .  }..  if( pIte
a4a0: 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b  r->eType==RBU_PK
a4b0: 5f 57 49 54 48 4f 55 54 5f 52 4f 57 49 44 20 29  _WITHOUT_ROWID )
a4c0: 7b 0a 20 20 20 20 2f 2a 20 22 50 52 41 47 4d 41  {.    /* "PRAGMA
a4d0: 20 69 6e 64 65 78 5f 6c 69 73 74 22 20 69 6e 63   index_list" inc
a4e0: 6c 75 64 65 73 20 74 68 65 20 6d 61 69 6e 20 50  ludes the main P
a4f0: 4b 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 20 20  K b-tree */.    
a500: 70 49 74 65 72 2d 3e 6e 49 6e 64 65 78 2d 2d 3b  pIter->nIndex--;
a510: 0a 20 20 7d 0a 0a 20 20 72 62 75 46 69 6e 61 6c  .  }..  rbuFinal
a520: 69 7a 65 28 70 2c 20 70 4c 69 73 74 29 3b 0a 20  ize(p, pList);. 
a530: 20 69 66 28 20 62 49 6e 64 65 78 3d 3d 30 20 29   if( bIndex==0 )
a540: 20 70 49 74 65 72 2d 3e 61 62 49 6e 64 65 78 65   pIter->abIndexe
a550: 64 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  d = 0;.}.../*.**
a560: 20 49 66 20 74 68 65 79 20 61 72 65 20 6e 6f 74   If they are not
a570: 20 61 6c 72 65 61 64 79 20 70 6f 70 75 6c 61 74   already populat
a580: 65 64 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65  ed, populate the
a590: 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c   pIter->azTblCol
a5a0: 5b 5d 2c 0a 2a 2a 20 70 49 74 65 72 2d 3e 61 62  [],.** pIter->ab
a5b0: 54 62 6c 50 6b 5b 5d 2c 20 70 49 74 65 72 2d 3e  TblPk[], pIter->
a5c0: 6e 54 62 6c 43 6f 6c 20 61 6e 64 20 70 49 74 65  nTblCol and pIte
a5d0: 72 2d 3e 62 52 6f 77 69 64 20 76 61 72 69 61 62  r->bRowid variab
a5e0: 6c 65 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  les according to
a5f0: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 28 6e  .** the table (n
a600: 6f 74 20 69 6e 64 65 78 29 20 74 68 61 74 20 74  ot index) that t
a610: 68 65 20 69 74 65 72 61 74 6f 72 20 63 75 72 72  he iterator curr
a620: 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e  ently points to.
a630: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
a640: 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65  LITE_OK if succe
a650: 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c  ssful, or an SQL
a660: 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f  ite error code o
a670: 74 68 65 72 77 69 73 65 2e 20 49 66 0a 2a 2a 20  therwise. If.** 
a680: 61 6e 20 65 72 72 6f 72 20 64 6f 65 73 20 6f 63  an error does oc
a690: 63 75 72 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f  cur, an error co
a6a0: 64 65 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73  de and error mes
a6b0: 73 61 67 65 20 61 72 65 20 61 6c 73 6f 20 6c 65  sage are also le
a6c0: 66 74 20 69 6e 20 0a 2a 2a 20 74 68 65 20 52 42  ft in .** the RB
a6d0: 55 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61  U handle..*/.sta
a6e0: 74 69 63 20 69 6e 74 20 72 62 75 4f 62 6a 49 74  tic int rbuObjIt
a6f0: 65 72 43 61 63 68 65 54 61 62 6c 65 49 6e 66 6f  erCacheTableInfo
a700: 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20  (sqlite3rbu *p, 
a710: 52 62 75 4f 62 6a 49 74 65 72 20 2a 70 49 74 65  RbuObjIter *pIte
a720: 72 29 7b 0a 20 20 69 66 28 20 70 49 74 65 72 2d  r){.  if( pIter-
a730: 3e 61 7a 54 62 6c 43 6f 6c 3d 3d 30 20 29 7b 0a  >azTblCol==0 ){.
a740: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
a750: 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20   *pStmt = 0;.   
a760: 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20   int nCol = 0;. 
a770: 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20     int i;       
a780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a790: 20 2f 2a 20 66 6f 72 28 29 20 6c 6f 6f 70 20 69   /* for() loop i
a7a0: 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65  terator variable
a7b0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 52 62 75   */.    int bRbu
a7c0: 52 6f 77 69 64 20 3d 20 30 3b 20 20 20 20 20 20  Rowid = 0;      
a7d0: 20 20 20 20 20 20 2f 2a 20 49 66 20 69 6e 70 75        /* If inpu
a7e0: 74 20 74 61 62 6c 65 20 68 61 73 20 63 6f 6c 75  t table has colu
a7f0: 6d 6e 20 22 72 62 75 5f 72 6f 77 69 64 22 20 2a  mn "rbu_rowid" *
a800: 2f 0a 20 20 20 20 69 6e 74 20 69 4f 72 64 65 72  /.    int iOrder
a810: 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 54   = 0;.    int iT
a820: 6e 75 6d 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a  num = 0;..    /*
a830: 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20   Figure out the 
a840: 74 79 70 65 20 6f 66 20 74 61 62 6c 65 20 74 68  type of table th
a850: 69 73 20 73 74 65 70 20 77 69 6c 6c 20 64 65 61  is step will dea
a860: 6c 20 77 69 74 68 2e 20 2a 2f 0a 20 20 20 20 61  l with. */.    a
a870: 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 65 54  ssert( pIter->eT
a880: 79 70 65 3d 3d 30 20 29 3b 0a 20 20 20 20 72 62  ype==0 );.    rb
a890: 75 54 61 62 6c 65 54 79 70 65 28 70 2c 20 70 49  uTableType(p, pI
a8a0: 74 65 72 2d 3e 7a 54 62 6c 2c 20 26 70 49 74 65  ter->zTbl, &pIte
a8b0: 72 2d 3e 65 54 79 70 65 2c 20 26 69 54 6e 75 6d  r->eType, &iTnum
a8c0: 2c 20 26 70 49 74 65 72 2d 3e 69 50 6b 54 6e 75  , &pIter->iPkTnu
a8d0: 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72  m);.    if( p->r
a8e0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
a8f0: 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42  pIter->eType==RB
a900: 55 5f 50 4b 5f 4e 4f 54 41 42 4c 45 20 29 7b 0a  U_PK_NOTABLE ){.
a910: 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51        p->rc = SQ
a920: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
a930: 20 20 70 2d 3e 7a 45 72 72 6d 73 67 20 3d 20 73    p->zErrmsg = s
a940: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
a950: 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 25  no such table: %
a960: 73 22 2c 20 70 49 74 65 72 2d 3e 7a 54 62 6c 29  s", pIter->zTbl)
a970: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
a980: 70 2d 3e 72 63 20 29 20 72 65 74 75 72 6e 20 70  p->rc ) return p
a990: 2d 3e 72 63 3b 0a 20 20 20 20 69 66 28 20 70 49  ->rc;.    if( pI
a9a0: 74 65 72 2d 3e 7a 49 64 78 3d 3d 30 20 29 20 70  ter->zIdx==0 ) p
a9b0: 49 74 65 72 2d 3e 69 54 6e 75 6d 20 3d 20 69 54  Iter->iTnum = iT
a9c0: 6e 75 6d 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  num;..    assert
a9d0: 28 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d  ( pIter->eType==
a9e0: 52 42 55 5f 50 4b 5f 4e 4f 4e 45 20 7c 7c 20 70  RBU_PK_NONE || p
a9f0: 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55  Iter->eType==RBU
aa00: 5f 50 4b 5f 49 50 4b 20 0a 20 20 20 20 20 20 20  _PK_IPK .       
aa10: 20 20 7c 7c 20 70 49 74 65 72 2d 3e 65 54 79 70    || pIter->eTyp
aa20: 65 3d 3d 52 42 55 5f 50 4b 5f 45 58 54 45 52 4e  e==RBU_PK_EXTERN
aa30: 41 4c 20 7c 7c 20 70 49 74 65 72 2d 3e 65 54 79  AL || pIter->eTy
aa40: 70 65 3d 3d 52 42 55 5f 50 4b 5f 57 49 54 48 4f  pe==RBU_PK_WITHO
aa50: 55 54 5f 52 4f 57 49 44 0a 20 20 20 20 20 20 20  UT_ROWID.       
aa60: 20 20 7c 7c 20 70 49 74 65 72 2d 3e 65 54 79 70    || pIter->eTyp
aa70: 65 3d 3d 52 42 55 5f 50 4b 5f 56 54 41 42 0a 20  e==RBU_PK_VTAB. 
aa80: 20 20 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 50 6f     );..    /* Po
aa90: 70 75 6c 61 74 65 20 74 68 65 20 61 7a 54 62 6c  pulate the azTbl
aaa0: 43 6f 6c 5b 5d 20 61 6e 64 20 6e 54 62 6c 43 6f  Col[] and nTblCo
aab0: 6c 20 76 61 72 69 61 62 6c 65 73 20 62 61 73 65  l variables base
aac0: 64 20 6f 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 73  d on the columns
aad0: 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 69  .    ** of the i
aae0: 6e 70 75 74 20 74 61 62 6c 65 2e 20 49 67 6e 6f  nput table. Igno
aaf0: 72 65 20 61 6e 79 20 69 6e 70 75 74 20 74 61 62  re any input tab
ab00: 6c 65 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20  le columns that 
ab10: 62 65 67 69 6e 20 77 69 74 68 0a 20 20 20 20 2a  begin with.    *
ab20: 2a 20 22 72 62 75 5f 22 2e 20 20 2a 2f 0a 20 20  * "rbu_".  */.  
ab30: 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72    p->rc = prepar
ab40: 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45  eFreeAndCollectE
ab50: 72 72 6f 72 28 70 2d 3e 64 62 52 62 75 2c 20 26  rror(p->dbRbu, &
ab60: 70 53 74 6d 74 2c 20 26 70 2d 3e 7a 45 72 72 6d  pStmt, &p->zErrm
ab70: 73 67 2c 20 0a 20 20 20 20 20 20 20 20 73 71 6c  sg, .        sql
ab80: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45  ite3_mprintf("SE
ab90: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 27 25 71 27  LECT * FROM '%q'
aba0: 22 2c 20 70 49 74 65 72 2d 3e 7a 44 61 74 61 54  ", pIter->zDataT
abb0: 62 6c 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  bl).    );.    i
abc0: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
abd0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e 43 6f  _OK ){.      nCo
abe0: 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  l = sqlite3_colu
abf0: 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b  mn_count(pStmt);
ac00: 0a 20 20 20 20 20 20 72 62 75 41 6c 6c 6f 63 61  .      rbuAlloca
ac10: 74 65 49 74 65 72 41 72 72 61 79 73 28 70 2c 20  teIterArrays(p, 
ac20: 70 49 74 65 72 2c 20 6e 43 6f 6c 29 3b 0a 20 20  pIter, nCol);.  
ac30: 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
ac40: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
ac50: 4b 20 26 26 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  K && i<nCol; i++
ac60: 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
ac70: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f  har *zName = (co
ac80: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
ac90: 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53  3_column_name(pS
aca0: 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 69  tmt, i);.      i
acb0: 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69  f( sqlite3_strni
acc0: 63 6d 70 28 22 72 62 75 5f 22 2c 20 7a 4e 61 6d  cmp("rbu_", zNam
acd0: 65 2c 20 34 29 20 29 7b 0a 20 20 20 20 20 20 20  e, 4) ){.       
ace0: 20 63 68 61 72 20 2a 7a 43 6f 70 79 20 3d 20 72   char *zCopy = r
acf0: 62 75 53 74 72 6e 64 75 70 28 7a 4e 61 6d 65 2c  buStrndup(zName,
ad00: 20 26 70 2d 3e 72 63 29 3b 0a 20 20 20 20 20 20   &p->rc);.      
ad10: 20 20 70 49 74 65 72 2d 3e 61 69 53 72 63 4f 72    pIter->aiSrcOr
ad20: 64 65 72 5b 70 49 74 65 72 2d 3e 6e 54 62 6c 43  der[pIter->nTblC
ad30: 6f 6c 5d 20 3d 20 70 49 74 65 72 2d 3e 6e 54 62  ol] = pIter->nTb
ad40: 6c 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70 49  lCol;.        pI
ad50: 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 70 49  ter->azTblCol[pI
ad60: 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 2b 2b 5d 20  ter->nTblCol++] 
ad70: 3d 20 7a 43 6f 70 79 3b 0a 20 20 20 20 20 20 7d  = zCopy;.      }
ad80: 0a 20 20 20 20 20 20 65 6c 73 65 20 69 66 28 20  .      else if( 
ad90: 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 69 63  0==sqlite3_stric
ada0: 6d 70 28 22 72 62 75 5f 72 6f 77 69 64 22 2c 20  mp("rbu_rowid", 
adb0: 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20  zName) ){.      
adc0: 20 20 62 52 62 75 52 6f 77 69 64 20 3d 20 31 3b    bRbuRowid = 1;
add0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
ade0: 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
adf0: 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
ae00: 70 53 74 6d 74 20 3d 20 30 3b 0a 0a 20 20 20 20  pStmt = 0;..    
ae10: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
ae20: 45 5f 4f 4b 0a 20 20 20 20 20 26 26 20 72 62 75  E_OK.     && rbu
ae30: 49 73 56 61 63 75 75 6d 28 70 29 3d 3d 30 0a 20  IsVacuum(p)==0. 
ae40: 20 20 20 20 26 26 20 62 52 62 75 52 6f 77 69 64      && bRbuRowid
ae50: 21 3d 28 70 49 74 65 72 2d 3e 65 54 79 70 65 3d  !=(pIter->eType=
ae60: 3d 52 42 55 5f 50 4b 5f 56 54 41 42 20 7c 7c 20  =RBU_PK_VTAB || 
ae70: 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42  pIter->eType==RB
ae80: 55 5f 50 4b 5f 4e 4f 4e 45 29 0a 20 20 20 20 29  U_PK_NONE).    )
ae90: 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20  {.      p->rc = 
aea0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
aeb0: 20 20 20 20 70 2d 3e 7a 45 72 72 6d 73 67 20 3d      p->zErrmsg =
aec0: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
aed0: 28 0a 20 20 20 20 20 20 20 20 20 20 22 74 61 62  (.          "tab
aee0: 6c 65 20 25 71 20 25 73 20 72 62 75 5f 72 6f 77  le %q %s rbu_row
aef0: 69 64 20 63 6f 6c 75 6d 6e 22 2c 20 70 49 74 65  id column", pIte
af00: 72 2d 3e 7a 44 61 74 61 54 62 6c 2c 0a 20 20 20  r->zDataTbl,.   
af10: 20 20 20 20 20 20 20 28 62 52 62 75 52 6f 77 69         (bRbuRowi
af20: 64 20 3f 20 22 6d 61 79 20 6e 6f 74 20 68 61 76  d ? "may not hav
af30: 65 22 20 3a 20 22 72 65 71 75 69 72 65 73 22 29  e" : "requires")
af40: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
af50: 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  .    /* Check th
af60: 61 74 20 61 6c 6c 20 6e 6f 6e 2d 48 49 44 44 45  at all non-HIDDE
af70: 4e 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  N columns in the
af80: 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 74 61 62   destination tab
af90: 6c 65 20 61 72 65 20 61 6c 73 6f 0a 20 20 20 20  le are also.    
afa0: 2a 2a 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68  ** present in th
afb0: 65 20 69 6e 70 75 74 20 74 61 62 6c 65 2e 20 50  e input table. P
afc0: 6f 70 75 6c 61 74 65 20 74 68 65 20 61 62 54 62  opulate the abTb
afd0: 6c 50 6b 5b 5d 2c 20 61 7a 54 62 6c 54 79 70 65  lPk[], azTblType
afe0: 5b 5d 20 61 6e 64 0a 20 20 20 20 2a 2a 20 61 69  [] and.    ** ai
aff0: 54 62 6c 4f 72 64 65 72 5b 5d 20 61 72 72 61 79  TblOrder[] array
b000: 73 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69  s at the same ti
b010: 6d 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  me.  */.    if( 
b020: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
b030: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20   ){.      p->rc 
b040: 3d 20 70 72 65 70 61 72 65 46 72 65 65 41 6e 64  = prepareFreeAnd
b050: 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e  CollectError(p->
b060: 64 62 4d 61 69 6e 2c 20 26 70 53 74 6d 74 2c 20  dbMain, &pStmt, 
b070: 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 20 0a 20 20  &p->zErrmsg, .  
b080: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
b090: 6d 70 72 69 6e 74 66 28 22 50 52 41 47 4d 41 20  mprintf("PRAGMA 
b0a0: 74 61 62 6c 65 5f 69 6e 66 6f 28 25 51 29 22 2c  table_info(%Q)",
b0b0: 20 70 49 74 65 72 2d 3e 7a 54 62 6c 29 0a 20 20   pIter->zTbl).  
b0c0: 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20      );.    }.   
b0d0: 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53   while( p->rc==S
b0e0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49  QLITE_OK && SQLI
b0f0: 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
b100: 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20  step(pStmt) ){. 
b110: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
b120: 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20  *zName = (const 
b130: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
b140: 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
b150: 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a   1);.      if( z
b160: 4e 61 6d 65 3d 3d 30 20 29 20 62 72 65 61 6b 3b  Name==0 ) break;
b170: 20 20 2f 2a 20 41 6e 20 4f 4f 4d 20 2d 20 66 69    /* An OOM - fi
b180: 6e 61 6c 69 7a 65 28 29 20 62 65 6c 6f 77 20 72  nalize() below r
b190: 65 74 75 72 6e 73 20 53 5f 4e 4f 4d 45 4d 20 2a  eturns S_NOMEM *
b1a0: 2f 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 69 4f  /.      for(i=iO
b1b0: 72 64 65 72 3b 20 69 3c 70 49 74 65 72 2d 3e 6e  rder; i<pIter->n
b1c0: 54 62 6c 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  TblCol; i++){.  
b1d0: 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72        if( 0==str
b1e0: 63 6d 70 28 7a 4e 61 6d 65 2c 20 70 49 74 65 72  cmp(zName, pIter
b1f0: 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69 5d 29 20 29  ->azTblCol[i]) )
b200: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
b210: 20 20 20 20 20 20 69 66 28 20 69 3d 3d 70 49 74        if( i==pIt
b220: 65 72 2d 3e 6e 54 62 6c 43 6f 6c 20 29 7b 0a 20  er->nTblCol ){. 
b230: 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53         p->rc = S
b240: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
b250: 20 20 20 20 20 70 2d 3e 7a 45 72 72 6d 73 67 20       p->zErrmsg 
b260: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
b270: 66 28 22 63 6f 6c 75 6d 6e 20 6d 69 73 73 69 6e  f("column missin
b280: 67 20 66 72 6f 6d 20 25 71 3a 20 25 73 22 2c 0a  g from %q: %s",.
b290: 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
b2a0: 72 2d 3e 7a 44 61 74 61 54 62 6c 2c 20 7a 4e 61  r->zDataTbl, zNa
b2b0: 6d 65 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  me.        );.  
b2c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
b2d0: 20 20 20 69 6e 74 20 69 50 6b 20 3d 20 73 71 6c     int iPk = sql
b2e0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
b2f0: 70 53 74 6d 74 2c 20 35 29 3b 0a 20 20 20 20 20  pStmt, 5);.     
b300: 20 20 20 69 6e 74 20 62 4e 6f 74 4e 75 6c 6c 20     int bNotNull 
b310: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
b320: 5f 69 6e 74 28 70 53 74 6d 74 2c 20 33 29 3b 0a  _int(pStmt, 3);.
b330: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
b340: 61 72 20 2a 7a 54 79 70 65 20 3d 20 28 63 6f 6e  ar *zType = (con
b350: 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
b360: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74  _column_text(pSt
b370: 6d 74 2c 20 32 29 3b 0a 0a 20 20 20 20 20 20 20  mt, 2);..       
b380: 20 69 66 28 20 69 21 3d 69 4f 72 64 65 72 20 29   if( i!=iOrder )
b390: 7b 0a 20 20 20 20 20 20 20 20 20 20 53 57 41 50  {.          SWAP
b3a0: 28 69 6e 74 2c 20 70 49 74 65 72 2d 3e 61 69 53  (int, pIter->aiS
b3b0: 72 63 4f 72 64 65 72 5b 69 5d 2c 20 70 49 74 65  rcOrder[i], pIte
b3c0: 72 2d 3e 61 69 53 72 63 4f 72 64 65 72 5b 69 4f  r->aiSrcOrder[iO
b3d0: 72 64 65 72 5d 29 3b 0a 20 20 20 20 20 20 20 20  rder]);.        
b3e0: 20 20 53 57 41 50 28 63 68 61 72 2a 2c 20 70 49    SWAP(char*, pI
b3f0: 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69 5d  ter->azTblCol[i]
b400: 2c 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f  , pIter->azTblCo
b410: 6c 5b 69 4f 72 64 65 72 5d 29 3b 0a 20 20 20 20  l[iOrder]);.    
b420: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 70      }..        p
b430: 49 74 65 72 2d 3e 61 7a 54 62 6c 54 79 70 65 5b  Iter->azTblType[
b440: 69 4f 72 64 65 72 5d 20 3d 20 72 62 75 53 74 72  iOrder] = rbuStr
b450: 6e 64 75 70 28 7a 54 79 70 65 2c 20 26 70 2d 3e  ndup(zType, &p->
b460: 72 63 29 3b 0a 20 20 20 20 20 20 20 20 70 49 74  rc);.        pIt
b470: 65 72 2d 3e 61 62 54 62 6c 50 6b 5b 69 4f 72 64  er->abTblPk[iOrd
b480: 65 72 5d 20 3d 20 28 69 50 6b 21 3d 30 29 3b 0a  er] = (iPk!=0);.
b490: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 61          pIter->a
b4a0: 62 4e 6f 74 4e 75 6c 6c 5b 69 4f 72 64 65 72 5d  bNotNull[iOrder]
b4b0: 20 3d 20 28 75 38 29 62 4e 6f 74 4e 75 6c 6c 20   = (u8)bNotNull 
b4c0: 7c 7c 20 28 69 50 6b 21 3d 30 29 3b 0a 20 20 20  || (iPk!=0);.   
b4d0: 20 20 20 20 20 69 4f 72 64 65 72 2b 2b 3b 0a 20       iOrder++;. 
b4e0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
b4f0: 20 20 72 62 75 46 69 6e 61 6c 69 7a 65 28 70 2c    rbuFinalize(p,
b500: 20 70 53 74 6d 74 29 3b 0a 20 20 20 20 72 62 75   pStmt);.    rbu
b510: 4f 62 6a 49 74 65 72 43 61 63 68 65 49 6e 64 65  ObjIterCacheInde
b520: 78 65 64 43 6f 6c 73 28 70 2c 20 70 49 74 65 72  xedCols(p, pIter
b530: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
b540: 49 74 65 72 2d 3e 65 54 79 70 65 21 3d 52 42 55  Iter->eType!=RBU
b550: 5f 50 4b 5f 56 54 41 42 20 7c 7c 20 70 49 74 65  _PK_VTAB || pIte
b560: 72 2d 3e 61 62 49 6e 64 65 78 65 64 3d 3d 30 20  r->abIndexed==0 
b570: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
b580: 49 74 65 72 2d 3e 65 54 79 70 65 21 3d 52 42 55  Iter->eType!=RBU
b590: 5f 50 4b 5f 56 54 41 42 20 7c 7c 20 70 49 74 65  _PK_VTAB || pIte
b5a0: 72 2d 3e 6e 49 6e 64 65 78 3d 3d 30 20 29 3b 0a  r->nIndex==0 );.
b5b0: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 2d    }..  return p-
b5c0: 3e 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  >rc;.}../*.** Th
b5d0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 73  is function cons
b5e0: 74 72 75 63 74 73 20 61 6e 64 20 72 65 74 75 72  tructs and retur
b5f0: 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
b600: 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64  a nul-terminated
b610: 20 0a 2a 2a 20 73 74 72 69 6e 67 20 63 6f 6e 74   .** string cont
b620: 61 69 6e 69 6e 67 20 73 6f 6d 65 20 53 51 4c 20  aining some SQL 
b630: 63 6c 61 75 73 65 20 6f 72 20 6c 69 73 74 20 62  clause or list b
b640: 61 73 65 64 20 6f 6e 20 6f 6e 65 20 6f 72 20 6d  ased on one or m
b650: 6f 72 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 63  ore of the .** c
b660: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 63 75 72 72  olumn names curr
b670: 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20  ently stored in 
b680: 74 68 65 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c  the pIter->azTbl
b690: 43 6f 6c 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a  Col[] array..*/.
b6a0: 73 74 61 74 69 63 20 63 68 61 72 20 2a 72 62 75  static char *rbu
b6b0: 4f 62 6a 49 74 65 72 47 65 74 43 6f 6c 6c 69 73  ObjIterGetCollis
b6c0: 74 28 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20  t(.  sqlite3rbu 
b6d0: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
b6e0: 20 20 20 20 20 2f 2a 20 52 42 55 20 6f 62 6a 65       /* RBU obje
b6f0: 63 74 20 2a 2f 0a 20 20 52 62 75 4f 62 6a 49 74  ct */.  RbuObjIt
b700: 65 72 20 2a 70 49 74 65 72 20 20 20 20 20 20 20  er *pIter       
b710: 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63          /* Objec
b720: 74 20 69 74 65 72 61 74 6f 72 20 66 6f 72 20 63  t iterator for c
b730: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 29  olumn names */.)
b740: 7b 0a 20 20 63 68 61 72 20 2a 7a 4c 69 73 74 20  {.  char *zList 
b750: 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  = 0;.  const cha
b760: 72 20 2a 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20  r *zSep = "";.  
b770: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
b780: 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 54 62 6c 43  ; i<pIter->nTblC
b790: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f  ol; i++){.    co
b7a0: 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 49  nst char *z = pI
b7b0: 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69 5d  ter->azTblCol[i]
b7c0: 3b 0a 20 20 20 20 7a 4c 69 73 74 20 3d 20 72 62  ;.    zList = rb
b7d0: 75 4d 50 72 69 6e 74 66 28 70 2c 20 22 25 7a 25  uMPrintf(p, "%z%
b7e0: 73 5c 22 25 77 5c 22 22 2c 20 7a 4c 69 73 74 2c  s\"%w\"", zList,
b7f0: 20 7a 53 65 70 2c 20 7a 29 3b 0a 20 20 20 20 7a   zSep, z);.    z
b800: 53 65 70 20 3d 20 22 2c 20 22 3b 0a 20 20 7d 0a  Sep = ", ";.  }.
b810: 20 20 72 65 74 75 72 6e 20 7a 4c 69 73 74 3b 0a    return zList;.
b820: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
b830: 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
b840: 6f 20 63 72 65 61 74 65 20 61 20 53 45 4c 45 43  o create a SELEC
b850: 54 20 6c 69 73 74 20 28 74 68 65 20 6c 69 73 74  T list (the list
b860: 20 6f 66 20 53 51 4c 20 0a 2a 2a 20 65 78 70 72   of SQL .** expr
b870: 65 73 73 69 6f 6e 73 20 74 68 61 74 20 66 6f 6c  essions that fol
b880: 6c 6f 77 73 20 61 20 53 45 4c 45 43 54 20 6b 65  lows a SELECT ke
b890: 79 77 6f 72 64 29 20 66 6f 72 20 61 20 53 45 4c  yword) for a SEL
b8a0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 0a 2a  ECT statement .*
b8b0: 2a 20 75 73 65 64 20 74 6f 20 72 65 61 64 20 66  * used to read f
b8c0: 72 6f 6d 20 61 6e 20 64 61 74 61 5f 78 78 78 20  rom an data_xxx 
b8d0: 6f 72 20 72 62 75 5f 74 6d 70 5f 78 78 78 20 74  or rbu_tmp_xxx t
b8e0: 61 62 6c 65 20 77 68 69 6c 65 20 75 70 64 61 74  able while updat
b8f0: 69 6e 67 20 74 68 65 20 0a 2a 2a 20 69 6e 64 65  ing the .** inde
b900: 78 20 6f 62 6a 65 63 74 20 63 75 72 72 65 6e 74  x object current
b910: 6c 79 20 69 6e 64 69 63 61 74 65 64 20 62 79 20  ly indicated by 
b920: 74 68 65 20 69 74 65 72 61 74 6f 72 20 6f 62 6a  the iterator obj
b930: 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ect passed as th
b940: 65 20 0a 2a 2a 20 73 65 63 6f 6e 64 20 61 72 67  e .** second arg
b950: 75 6d 65 6e 74 2e 20 41 20 22 50 52 41 47 4d 41  ument. A "PRAGMA
b960: 20 69 6e 64 65 78 5f 78 69 6e 66 6f 20 3d 20 3c   index_xinfo = <
b970: 69 64 78 6e 61 6d 65 3e 22 20 73 74 61 74 65 6d  idxname>" statem
b980: 65 6e 74 20 69 73 20 75 73 65 64 20 0a 2a 2a 20  ent is used .** 
b990: 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 72 65  to obtain the re
b9a0: 71 75 69 72 65 64 20 69 6e 66 6f 72 6d 61 74 69  quired informati
b9b0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  on..**.** If the
b9c0: 20 69 6e 64 65 78 20 69 73 20 6f 66 20 74 68 65   index is of the
b9d0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 3a   following form:
b9e0: 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45 20  .**.**   CREATE 
b9f0: 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28 63  INDEX i1 ON t1(c
ba00: 2c 20 62 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61  , b COLLATE noca
ba10: 73 65 29 3b 0a 2a 2a 0a 2a 2a 20 61 6e 64 20 22  se);.**.** and "
ba20: 74 31 22 20 69 73 20 61 20 74 61 62 6c 65 20 77  t1" is a table w
ba30: 69 74 68 20 61 6e 20 65 78 70 6c 69 63 69 74 20  ith an explicit 
ba40: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
ba50: 4b 45 59 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 22  KEY column .** "
ba60: 69 70 6b 22 2c 20 74 68 65 20 72 65 74 75 72 6e  ipk", the return
ba70: 65 64 20 73 74 72 69 6e 67 20 69 73 3a 0a 2a 2a  ed string is:.**
ba80: 0a 2a 2a 20 20 20 22 60 63 60 20 43 4f 4c 4c 41  .**   "`c` COLLA
ba90: 54 45 20 27 42 49 4e 41 52 59 27 2c 20 60 62 60  TE 'BINARY', `b`
baa0: 20 43 4f 4c 4c 41 54 45 20 27 4e 4f 43 41 53 45   COLLATE 'NOCASE
bab0: 27 2c 20 60 69 70 6b 60 20 43 4f 4c 4c 41 54 45  ', `ipk` COLLATE
bac0: 20 27 42 49 4e 41 52 59 27 22 0a 2a 2a 0a 2a 2a   'BINARY'".**.**
bad0: 20 41 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20   As well as the 
bae0: 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 2c  returned string,
baf0: 20 74 68 72 65 65 20 6f 74 68 65 72 20 6d 61 6c   three other mal
bb00: 6c 6f 63 27 64 20 73 74 72 69 6e 67 73 20 61 72  loc'd strings ar
bb10: 65 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 76  e .** returned v
bb20: 69 61 20 6f 75 74 70 75 74 20 70 61 72 61 6d 65  ia output parame
bb30: 74 65 72 73 2e 20 41 73 20 66 6f 6c 6c 6f 77 73  ters. As follows
bb40: 3a 0a 2a 2a 0a 2a 2a 20 20 20 70 7a 49 6d 70 6f  :.**.**   pzImpo
bb50: 73 74 65 72 43 6f 6c 73 3a 20 2e 2e 2e 0a 2a 2a  sterCols: ....**
bb60: 20 20 20 70 7a 49 6d 70 6f 73 74 65 72 50 6b 3a     pzImposterPk:
bb70: 20 2e 2e 2e 0a 2a 2a 20 20 20 70 7a 57 68 65 72   ....**   pzWher
bb80: 65 3a 20 2e 2e 2e 0a 2a 2f 0a 73 74 61 74 69 63  e: ....*/.static
bb90: 20 63 68 61 72 20 2a 72 62 75 4f 62 6a 49 74 65   char *rbuObjIte
bba0: 72 47 65 74 49 6e 64 65 78 43 6f 6c 73 28 0a 20  rGetIndexCols(. 
bbb0: 20 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20   sqlite3rbu *p, 
bbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bbd0: 20 2f 2a 20 52 42 55 20 6f 62 6a 65 63 74 20 2a   /* RBU object *
bbe0: 2f 0a 20 20 52 62 75 4f 62 6a 49 74 65 72 20 2a  /.  RbuObjIter *
bbf0: 70 49 74 65 72 2c 20 20 20 20 20 20 20 20 20 20  pIter,          
bc00: 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 69 74      /* Object it
bc10: 65 72 61 74 6f 72 20 66 6f 72 20 63 6f 6c 75 6d  erator for colum
bc20: 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 63 68 61  n names */.  cha
bc30: 72 20 2a 2a 70 7a 49 6d 70 6f 73 74 65 72 43 6f  r **pzImposterCo
bc40: 6c 73 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ls,          /* 
bc50: 4f 55 54 3a 20 43 6f 6c 75 6d 6e 73 20 66 6f 72  OUT: Columns for
bc60: 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 20   imposter table 
bc70: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 49 6d  */.  char **pzIm
bc80: 70 6f 73 74 65 72 50 6b 2c 20 20 20 20 20 20 20  posterPk,       
bc90: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 49 6d 70       /* OUT: Imp
bca0: 6f 73 74 65 72 20 50 4b 20 63 6c 61 75 73 65 20  oster PK clause 
bcb0: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 57 68  */.  char **pzWh
bcc0: 65 72 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ere,            
bcd0: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 57 48 45       /* OUT: WHE
bce0: 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  RE clause */.  i
bcf0: 6e 74 20 2a 70 6e 42 69 6e 64 20 20 20 20 20 20  nt *pnBind      
bd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bd10: 2a 20 4f 55 54 3a 20 54 72 62 75 6c 20 6e 75 6d  * OUT: Trbul num
bd20: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 2a  ber of columns *
bd30: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
bd40: 70 2d 3e 72 63 3b 20 20 20 20 20 20 20 20 20 20  p->rc;          
bd50: 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20         /* Error 
bd60: 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  code */.  int rc
bd70: 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2;              
bd80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
bd90: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 29 20  ite3_finalize() 
bda0: 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  return code */. 
bdb0: 20 63 68 61 72 20 2a 7a 52 65 74 20 3d 20 30 3b   char *zRet = 0;
bdc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bdd0: 20 2f 2a 20 53 74 72 69 6e 67 20 74 6f 20 72 65   /* String to re
bde0: 74 75 72 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a  turn */.  char *
bdf0: 7a 49 6d 70 43 6f 6c 73 20 3d 20 30 3b 20 20 20  zImpCols = 0;   
be00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 72            /* Str
be10: 69 6e 67 20 74 6f 20 72 65 74 75 72 6e 20 76 69  ing to return vi
be20: 61 20 2a 70 7a 49 6d 70 6f 73 74 65 72 43 6f 6c  a *pzImposterCol
be30: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 49 6d  s */.  char *zIm
be40: 70 50 4b 20 3d 20 30 3b 20 20 20 20 20 20 20 20  pPK = 0;        
be50: 20 20 20 20 20 20 20 2f 2a 20 53 74 72 69 6e 67         /* String
be60: 20 74 6f 20 72 65 74 75 72 6e 20 76 69 61 20 2a   to return via *
be70: 70 7a 49 6d 70 6f 73 74 65 72 50 4b 20 2a 2f 0a  pzImposterPK */.
be80: 20 20 63 68 61 72 20 2a 7a 57 68 65 72 65 20 3d    char *zWhere =
be90: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
bea0: 20 20 2f 2a 20 53 74 72 69 6e 67 20 74 6f 20 72    /* String to r
beb0: 65 74 75 72 6e 20 76 69 61 20 2a 70 7a 57 68 65  eturn via *pzWhe
bec0: 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 69 6e  re */.  int nBin
bed0: 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  d = 0;          
bee0: 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
bef0: 20 74 6f 20 72 65 74 75 72 6e 20 76 69 61 20 2a   to return via *
bf00: 70 6e 42 69 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73  pnBind */.  cons
bf10: 74 20 63 68 61 72 20 2a 7a 43 6f 6d 20 3d 20 22  t char *zCom = "
bf20: 22 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ";          /* S
bf30: 65 74 20 74 6f 20 22 2c 20 22 20 6c 61 74 65 72  et to ", " later
bf40: 20 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63   on */.  const c
bf50: 68 61 72 20 2a 7a 41 6e 64 20 3d 20 22 22 3b 20  har *zAnd = ""; 
bf60: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20           /* Set 
bf70: 74 6f 20 22 20 41 4e 44 20 22 20 6c 61 74 65 72  to " AND " later
bf80: 20 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33   on */.  sqlite3
bf90: 5f 73 74 6d 74 20 2a 70 58 49 6e 66 6f 20 3d 20  _stmt *pXInfo = 
bfa0: 30 3b 20 20 20 20 20 20 20 2f 2a 20 50 52 41 47  0;       /* PRAG
bfb0: 4d 41 20 69 6e 64 65 78 5f 78 69 6e 66 6f 20 3d  MA index_xinfo =
bfc0: 20 3f 20 2a 2f 0a 0a 20 20 69 66 28 20 72 63 3d   ? */..  if( rc=
bfd0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
bfe0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 7a 45 72    assert( p->zEr
bff0: 72 6d 73 67 3d 3d 30 20 29 3b 0a 20 20 20 20 72  rmsg==0 );.    r
c000: 63 20 3d 20 70 72 65 70 61 72 65 46 72 65 65 41  c = prepareFreeA
c010: 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70  ndCollectError(p
c020: 2d 3e 64 62 4d 61 69 6e 2c 20 26 70 58 49 6e 66  ->dbMain, &pXInf
c030: 6f 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 0a  o, &p->zErrmsg,.
c040: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
c050: 6d 70 72 69 6e 74 66 28 22 50 52 41 47 4d 41 20  mprintf("PRAGMA 
c060: 6d 61 69 6e 2e 69 6e 64 65 78 5f 78 69 6e 66 6f  main.index_xinfo
c070: 20 3d 20 25 51 22 2c 20 70 49 74 65 72 2d 3e 7a   = %Q", pIter->z
c080: 49 64 78 29 0a 20 20 20 20 29 3b 0a 20 20 7d 0a  Idx).    );.  }.
c090: 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51  .  while( rc==SQ
c0a0: 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54  LITE_OK && SQLIT
c0b0: 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73  E_ROW==sqlite3_s
c0c0: 74 65 70 28 70 58 49 6e 66 6f 29 20 29 7b 0a 20  tep(pXInfo) ){. 
c0d0: 20 20 20 69 6e 74 20 69 43 69 64 20 3d 20 73 71     int iCid = sq
c0e0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
c0f0: 28 70 58 49 6e 66 6f 2c 20 31 29 3b 0a 20 20 20  (pXInfo, 1);.   
c100: 20 69 6e 74 20 62 44 65 73 63 20 3d 20 73 71 6c   int bDesc = sql
c110: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
c120: 70 58 49 6e 66 6f 2c 20 33 29 3b 0a 20 20 20 20  pXInfo, 3);.    
c130: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
c140: 6c 61 74 65 20 3d 20 28 63 6f 6e 73 74 20 63 68  late = (const ch
c150: 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
c160: 6d 6e 5f 74 65 78 74 28 70 58 49 6e 66 6f 2c 20  mn_text(pXInfo, 
c170: 34 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  4);.    const ch
c180: 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 63 6f  ar *zCol;.    co
c190: 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 3b  nst char *zType;
c1a0: 0a 0a 20 20 20 20 69 66 28 20 69 43 69 64 3c 30  ..    if( iCid<0
c1b0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20   ){.      /* An 
c1c0: 69 6e 74 65 67 65 72 20 70 72 69 6d 61 72 79 20  integer primary 
c1d0: 6b 65 79 2e 20 49 66 20 74 68 65 20 74 61 62 6c  key. If the tabl
c1e0: 65 20 68 61 73 20 61 6e 20 65 78 70 6c 69 63 69  e has an explici
c1f0: 74 20 49 50 4b 2c 20 75 73 65 0a 20 20 20 20 20  t IPK, use.     
c200: 20 2a 2a 20 69 74 73 20 6e 61 6d 65 2e 20 4f 74   ** its name. Ot
c210: 68 65 72 77 69 73 65 2c 20 75 73 65 20 22 72 62  herwise, use "rb
c220: 75 5f 72 6f 77 69 64 22 2e 20 20 2a 2f 0a 20 20  u_rowid".  */.  
c230: 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 65      if( pIter->e
c240: 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 49 50 4b  Type==RBU_PK_IPK
c250: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
c260: 69 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  i;.        for(i
c270: 3d 30 3b 20 70 49 74 65 72 2d 3e 61 62 54 62 6c  =0; pIter->abTbl
c280: 50 6b 5b 69 5d 3d 3d 30 3b 20 69 2b 2b 29 3b 0a  Pk[i]==0; i++);.
c290: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
c2a0: 69 3c 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c  i<pIter->nTblCol
c2b0: 20 29 3b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c   );.        zCol
c2c0: 20 3d 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43   = pIter->azTblC
c2d0: 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 65 6c  ol[i];.      }el
c2e0: 73 65 20 69 66 28 20 72 62 75 49 73 56 61 63 75  se if( rbuIsVacu
c2f0: 75 6d 28 70 29 20 29 7b 0a 20 20 20 20 20 20 20  um(p) ){.       
c300: 20 7a 43 6f 6c 20 3d 20 22 5f 72 6f 77 69 64 5f   zCol = "_rowid_
c310: 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  ";.      }else{.
c320: 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22          zCol = "
c330: 72 62 75 5f 72 6f 77 69 64 22 3b 0a 20 20 20 20  rbu_rowid";.    
c340: 20 20 7d 0a 20 20 20 20 20 20 7a 54 79 70 65 20    }.      zType 
c350: 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20 20  = "INTEGER";.   
c360: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 43   }else{.      zC
c370: 6f 6c 20 3d 20 70 49 74 65 72 2d 3e 61 7a 54 62  ol = pIter->azTb
c380: 6c 43 6f 6c 5b 69 43 69 64 5d 3b 0a 20 20 20 20  lCol[iCid];.    
c390: 20 20 7a 54 79 70 65 20 3d 20 70 49 74 65 72 2d    zType = pIter-
c3a0: 3e 61 7a 54 62 6c 54 79 70 65 5b 69 43 69 64 5d  >azTblType[iCid]
c3b0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 7a 52 65  ;.    }..    zRe
c3c0: 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  t = sqlite3_mpri
c3d0: 6e 74 66 28 22 25 7a 25 73 5c 22 25 77 5c 22 20  ntf("%z%s\"%w\" 
c3e0: 43 4f 4c 4c 41 54 45 20 25 51 22 2c 20 7a 52 65  COLLATE %Q", zRe
c3f0: 74 2c 20 7a 43 6f 6d 2c 20 7a 43 6f 6c 2c 20 7a  t, zCom, zCol, z
c400: 43 6f 6c 6c 61 74 65 29 3b 0a 20 20 20 20 69 66  Collate);.    if
c410: 28 20 70 49 74 65 72 2d 3e 62 55 6e 69 71 75 65  ( pIter->bUnique
c420: 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 63  ==0 || sqlite3_c
c430: 6f 6c 75 6d 6e 5f 69 6e 74 28 70 58 49 6e 66 6f  olumn_int(pXInfo
c440: 2c 20 35 29 20 29 7b 0a 20 20 20 20 20 20 63 6f  , 5) ){.      co
c450: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 64 65 72  nst char *zOrder
c460: 20 3d 20 28 62 44 65 73 63 20 3f 20 22 20 44 45   = (bDesc ? " DE
c470: 53 43 22 20 3a 20 22 22 29 3b 0a 20 20 20 20 20  SC" : "");.     
c480: 20 7a 49 6d 70 50 4b 20 3d 20 73 71 6c 69 74 65   zImpPK = sqlite
c490: 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a 25 73 5c  3_mprintf("%z%s\
c4a0: 22 72 62 75 5f 69 6d 70 5f 25 64 25 77 5c 22 25  "rbu_imp_%d%w\"%
c4b0: 73 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 7a  s", .          z
c4c0: 49 6d 70 50 4b 2c 20 7a 43 6f 6d 2c 20 6e 42 69  ImpPK, zCom, nBi
c4d0: 6e 64 2c 20 7a 43 6f 6c 2c 20 7a 4f 72 64 65 72  nd, zCol, zOrder
c4e0: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
c4f0: 20 20 20 20 7a 49 6d 70 43 6f 6c 73 20 3d 20 73      zImpCols = s
c500: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
c510: 25 7a 25 73 5c 22 72 62 75 5f 69 6d 70 5f 25 64  %z%s\"rbu_imp_%d
c520: 25 77 5c 22 20 25 73 20 43 4f 4c 4c 41 54 45 20  %w\" %s COLLATE 
c530: 25 51 22 2c 20 0a 20 20 20 20 20 20 20 20 7a 49  %Q", .        zI
c540: 6d 70 43 6f 6c 73 2c 20 7a 43 6f 6d 2c 20 6e 42  mpCols, zCom, nB
c550: 69 6e 64 2c 20 7a 43 6f 6c 2c 20 7a 54 79 70 65  ind, zCol, zType
c560: 2c 20 7a 43 6f 6c 6c 61 74 65 0a 20 20 20 20 29  , zCollate.    )
c570: 3b 0a 20 20 20 20 7a 57 68 65 72 65 20 3d 20 73  ;.    zWhere = s
c580: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a  qlite3_mprintf(.
c590: 20 20 20 20 20 20 20 20 22 25 7a 25 73 5c 22 72          "%z%s\"r
c5a0: 62 75 5f 69 6d 70 5f 25 64 25 77 5c 22 20 49 53  bu_imp_%d%w\" IS
c5b0: 20 3f 22 2c 20 7a 57 68 65 72 65 2c 20 7a 41 6e   ?", zWhere, zAn
c5c0: 64 2c 20 6e 42 69 6e 64 2c 20 7a 43 6f 6c 0a 20  d, nBind, zCol. 
c5d0: 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 52     );.    if( zR
c5e0: 65 74 3d 3d 30 20 7c 7c 20 7a 49 6d 70 50 4b 3d  et==0 || zImpPK=
c5f0: 3d 30 20 7c 7c 20 7a 49 6d 70 43 6f 6c 73 3d 3d  =0 || zImpCols==
c600: 30 20 7c 7c 20 7a 57 68 65 72 65 3d 3d 30 20 29  0 || zWhere==0 )
c610: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
c620: 45 4d 3b 0a 20 20 20 20 7a 43 6f 6d 20 3d 20 22  EM;.    zCom = "
c630: 2c 20 22 3b 0a 20 20 20 20 7a 41 6e 64 20 3d 20  , ";.    zAnd = 
c640: 22 20 41 4e 44 20 22 3b 0a 20 20 20 20 6e 42 69  " AND ";.    nBi
c650: 6e 64 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 72 63 32  nd++;.  }..  rc2
c660: 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c   = sqlite3_final
c670: 69 7a 65 28 70 58 49 6e 66 6f 29 3b 0a 20 20 69  ize(pXInfo);.  i
c680: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
c690: 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 0a 20 20   ) rc = rc2;..  
c6a0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
c6b0: 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
c6c0: 5f 66 72 65 65 28 7a 52 65 74 29 3b 0a 20 20 20  _free(zRet);.   
c6d0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 49   sqlite3_free(zI
c6e0: 6d 70 43 6f 6c 73 29 3b 0a 20 20 20 20 73 71 6c  mpCols);.    sql
c6f0: 69 74 65 33 5f 66 72 65 65 28 7a 49 6d 70 50 4b  ite3_free(zImpPK
c700: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
c710: 72 65 65 28 7a 57 68 65 72 65 29 3b 0a 20 20 20  ree(zWhere);.   
c720: 20 7a 52 65 74 20 3d 20 30 3b 0a 20 20 20 20 7a   zRet = 0;.    z
c730: 49 6d 70 43 6f 6c 73 20 3d 20 30 3b 0a 20 20 20  ImpCols = 0;.   
c740: 20 7a 49 6d 70 50 4b 20 3d 20 30 3b 0a 20 20 20   zImpPK = 0;.   
c750: 20 7a 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 20   zWhere = 0;.   
c760: 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 7d   p->rc = rc;.  }
c770: 0a 0a 20 20 2a 70 7a 49 6d 70 6f 73 74 65 72 43  ..  *pzImposterC
c780: 6f 6c 73 20 3d 20 7a 49 6d 70 43 6f 6c 73 3b 0a  ols = zImpCols;.
c790: 20 20 2a 70 7a 49 6d 70 6f 73 74 65 72 50 6b 20    *pzImposterPk 
c7a0: 3d 20 7a 49 6d 70 50 4b 3b 0a 20 20 2a 70 7a 57  = zImpPK;.  *pzW
c7b0: 68 65 72 65 20 3d 20 7a 57 68 65 72 65 3b 0a 20  here = zWhere;. 
c7c0: 20 2a 70 6e 42 69 6e 64 20 3d 20 6e 42 69 6e 64   *pnBind = nBind
c7d0: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 52 65 74 3b  ;.  return zRet;
c7e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 75 6d 69  .}../*.** Assumi
c7f0: 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  ng the current t
c800: 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20 61 72 65  able columns are
c810: 20 22 61 22 2c 20 22 62 22 20 61 6e 64 20 22 63   "a", "b" and "c
c820: 22 2c 20 61 6e 64 20 74 68 65 20 7a 4f 62 6a 0a  ", and the zObj.
c830: 2a 2a 20 70 61 72 61 6d 74 65 72 20 69 73 20 70  ** paramter is p
c840: 61 73 73 65 64 20 22 6f 6c 64 22 2c 20 72 65 74  assed "old", ret
c850: 75 72 6e 20 61 20 73 74 72 69 6e 67 20 6f 66 20  urn a string of 
c860: 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20  the form:.**.** 
c870: 20 20 20 20 22 6f 6c 64 2e 61 2c 20 6f 6c 64 2e      "old.a, old.
c880: 62 2c 20 6f 6c 64 2e 62 22 0a 2a 2a 0a 2a 2a 20  b, old.b".**.** 
c890: 57 69 74 68 20 74 68 65 20 63 6f 6c 75 6d 6e 20  With the column 
c8a0: 6e 61 6d 65 73 20 65 73 63 61 70 65 64 2e 0a 2a  names escaped..*
c8b0: 2a 0a 2a 2a 20 46 6f 72 20 74 61 62 6c 65 73 20  *.** For tables 
c8c0: 77 69 74 68 20 69 6d 70 6c 69 63 69 74 20 72 6f  with implicit ro
c8d0: 77 69 64 73 20 2d 20 52 42 55 5f 50 4b 5f 45 58  wids - RBU_PK_EX
c8e0: 54 45 52 4e 41 4c 20 61 6e 64 20 52 42 55 5f 50  TERNAL and RBU_P
c8f0: 4b 5f 4e 4f 4e 45 2c 20 61 70 70 65 6e 64 0a 2a  K_NONE, append.*
c900: 2a 20 74 68 65 20 74 65 78 74 20 22 2c 20 6f 6c  * the text ", ol
c910: 64 2e 5f 72 6f 77 69 64 5f 22 20 74 6f 20 74 68  d._rowid_" to th
c920: 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65  e returned value
c930: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
c940: 20 2a 72 62 75 4f 62 6a 49 74 65 72 47 65 74 4f   *rbuObjIterGetO
c950: 6c 64 6c 69 73 74 28 0a 20 20 73 71 6c 69 74 65  ldlist(.  sqlite
c960: 33 72 62 75 20 2a 70 2c 20 0a 20 20 52 62 75 4f  3rbu *p, .  RbuO
c970: 62 6a 49 74 65 72 20 2a 70 49 74 65 72 2c 0a 20  bjIter *pIter,. 
c980: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 62   const char *zOb
c990: 6a 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4c 69  j.){.  char *zLi
c9a0: 73 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d  st = 0;.  if( p-
c9b0: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
c9c0: 26 20 70 49 74 65 72 2d 3e 61 62 49 6e 64 65 78  & pIter->abIndex
c9d0: 65 64 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  ed ){.    const 
c9e0: 63 68 61 72 20 2a 7a 53 20 3d 20 22 22 3b 0a 20  char *zS = "";. 
c9f0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
ca00: 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e  r(i=0; i<pIter->
ca10: 6e 54 62 6c 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  nTblCol; i++){. 
ca20: 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e       if( pIter->
ca30: 61 62 49 6e 64 65 78 65 64 5b 69 5d 20 29 7b 0a  abIndexed[i] ){.
ca40: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
ca50: 61 72 20 2a 7a 43 6f 6c 20 3d 20 70 49 74 65 72  ar *zCol = pIter
ca60: 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69 5d 3b 0a 20  ->azTblCol[i];. 
ca70: 20 20 20 20 20 20 20 7a 4c 69 73 74 20 3d 20 73         zList = s
ca80: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
ca90: 25 7a 25 73 25 73 2e 5c 22 25 77 5c 22 22 2c 20  %z%s%s.\"%w\"", 
caa0: 7a 4c 69 73 74 2c 20 7a 53 2c 20 7a 4f 62 6a 2c  zList, zS, zObj,
cab0: 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20 7d 65   zCol);.      }e
cac0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 4c 69  lse{.        zLi
cad0: 73 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  st = sqlite3_mpr
cae0: 69 6e 74 66 28 22 25 7a 25 73 4e 55 4c 4c 22 2c  intf("%z%sNULL",
caf0: 20 7a 4c 69 73 74 2c 20 7a 53 29 3b 0a 20 20 20   zList, zS);.   
cb00: 20 20 20 7d 0a 20 20 20 20 20 20 7a 53 20 3d 20     }.      zS = 
cb10: 22 2c 20 22 3b 0a 20 20 20 20 20 20 69 66 28 20  ", ";.      if( 
cb20: 7a 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  zList==0 ){.    
cb30: 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
cb40: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
cb50: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
cb60: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46  .    }..    /* F
cb70: 6f 72 20 61 20 74 61 62 6c 65 20 77 69 74 68 20  or a table with 
cb80: 69 6d 70 6c 69 63 69 74 20 72 6f 77 69 64 73 2c  implicit rowids,
cb90: 20 61 70 70 65 6e 64 20 22 6f 6c 64 2e 5f 72 6f   append "old._ro
cba0: 77 69 64 5f 22 20 74 6f 20 74 68 65 20 6c 69 73  wid_" to the lis
cbb0: 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 49  t. */.    if( pI
cbc0: 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f  ter->eType==RBU_
cbd0: 50 4b 5f 45 58 54 45 52 4e 41 4c 20 7c 7c 20 70  PK_EXTERNAL || p
cbe0: 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55  Iter->eType==RBU
cbf0: 5f 50 4b 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  _PK_NONE ){.    
cc00: 20 20 7a 4c 69 73 74 20 3d 20 72 62 75 4d 50 72    zList = rbuMPr
cc10: 69 6e 74 66 28 70 2c 20 22 25 7a 2c 20 25 73 2e  intf(p, "%z, %s.
cc20: 5f 72 6f 77 69 64 5f 22 2c 20 7a 4c 69 73 74 2c  _rowid_", zList,
cc30: 20 7a 4f 62 6a 29 3b 0a 20 20 20 20 7d 0a 20 20   zObj);.    }.  
cc40: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4c 69 73 74  }.  return zList
cc50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
cc60: 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  n an expression 
cc70: 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64  that can be used
cc80: 20 69 6e 20 61 20 57 48 45 52 45 20 63 6c 61 75   in a WHERE clau
cc90: 73 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65 0a  se to match the.
cca0: 2a 2a 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f  ** primary key o
ccb0: 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 61  f the current ta
ccc0: 62 6c 65 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  ble. For example
ccd0: 2c 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69  , if the table i
cce0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54  s:.**.**   CREAT
ccf0: 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 2c  E TABLE t1(a, b,
cd00: 20 63 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28   c, PRIMARY KEY(
cd10: 62 2c 20 63 29 29 3b 0a 2a 2a 0a 2a 2a 20 52 65  b, c));.**.** Re
cd20: 74 75 72 6e 20 74 68 65 20 73 74 72 69 6e 67 3a  turn the string:
cd30: 0a 2a 2a 0a 2a 2a 20 20 20 22 62 20 3d 20 3f 31  .**.**   "b = ?1
cd40: 20 41 4e 44 20 63 20 3d 20 3f 32 22 0a 2a 2f 0a   AND c = ?2".*/.
cd50: 73 74 61 74 69 63 20 63 68 61 72 20 2a 72 62 75  static char *rbu
cd60: 4f 62 6a 49 74 65 72 47 65 74 57 68 65 72 65 28  ObjIterGetWhere(
cd70: 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20 2a 70  .  sqlite3rbu *p
cd80: 2c 20 0a 20 20 52 62 75 4f 62 6a 49 74 65 72 20  , .  RbuObjIter 
cd90: 2a 70 49 74 65 72 0a 29 7b 0a 20 20 63 68 61 72  *pIter.){.  char
cda0: 20 2a 7a 4c 69 73 74 20 3d 20 30 3b 0a 20 20 69   *zList = 0;.  i
cdb0: 66 28 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d  f( pIter->eType=
cdc0: 3d 52 42 55 5f 50 4b 5f 56 54 41 42 20 7c 7c 20  =RBU_PK_VTAB || 
cdd0: 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42  pIter->eType==RB
cde0: 55 5f 50 4b 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  U_PK_NONE ){.   
cdf0: 20 7a 4c 69 73 74 20 3d 20 72 62 75 4d 50 72 69   zList = rbuMPri
ce00: 6e 74 66 28 70 2c 20 22 5f 72 6f 77 69 64 5f 20  ntf(p, "_rowid_ 
ce10: 3d 20 3f 25 64 22 2c 20 70 49 74 65 72 2d 3e 6e  = ?%d", pIter->n
ce20: 54 62 6c 43 6f 6c 2b 31 29 3b 0a 20 20 7d 65 6c  TblCol+1);.  }el
ce30: 73 65 20 69 66 28 20 70 49 74 65 72 2d 3e 65 54  se if( pIter->eT
ce40: 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 45 58 54 45  ype==RBU_PK_EXTE
ce50: 52 4e 41 4c 20 29 7b 0a 20 20 20 20 63 6f 6e 73  RNAL ){.    cons
ce60: 74 20 63 68 61 72 20 2a 7a 53 65 70 20 3d 20 22  t char *zSep = "
ce70: 22 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ";.    int i;.  
ce80: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74    for(i=0; i<pIt
ce90: 65 72 2d 3e 6e 54 62 6c 43 6f 6c 3b 20 69 2b 2b  er->nTblCol; i++
cea0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  ){.      if( pIt
ceb0: 65 72 2d 3e 61 62 54 62 6c 50 6b 5b 69 5d 20 29  er->abTblPk[i] )
cec0: 7b 0a 20 20 20 20 20 20 20 20 7a 4c 69 73 74 20  {.        zList 
ced0: 3d 20 72 62 75 4d 50 72 69 6e 74 66 28 70 2c 20  = rbuMPrintf(p, 
cee0: 22 25 7a 25 73 63 25 64 3d 3f 25 64 22 2c 20 7a  "%z%sc%d=?%d", z
cef0: 4c 69 73 74 2c 20 7a 53 65 70 2c 20 69 2c 20 69  List, zSep, i, i
cf00: 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 7a 53 65  +1);.        zSe
cf10: 70 20 3d 20 22 20 41 4e 44 20 22 3b 0a 20 20 20  p = " AND ";.   
cf20: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a     }.    }.    z
cf30: 4c 69 73 74 20 3d 20 72 62 75 4d 50 72 69 6e 74  List = rbuMPrint
cf40: 66 28 70 2c 20 0a 20 20 20 20 20 20 20 20 22 5f  f(p, .        "_
cf50: 72 6f 77 69 64 5f 20 3d 20 28 53 45 4c 45 43 54  rowid_ = (SELECT
cf60: 20 69 64 20 46 52 4f 4d 20 72 62 75 5f 69 6d 70   id FROM rbu_imp
cf70: 6f 73 74 65 72 32 20 57 48 45 52 45 20 25 7a 29  oster2 WHERE %z)
cf80: 22 2c 20 7a 4c 69 73 74 0a 20 20 20 20 29 3b 0a  ", zList.    );.
cf90: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f  .  }else{.    co
cfa0: 6e 73 74 20 63 68 61 72 20 2a 7a 53 65 70 20 3d  nst char *zSep =
cfb0: 20 22 22 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a   "";.    int i;.
cfc0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
cfd0: 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 3b 20 69  Iter->nTblCol; i
cfe0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
cff0: 49 74 65 72 2d 3e 61 62 54 62 6c 50 6b 5b 69 5d  Iter->abTblPk[i]
d000: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73   ){.        cons
d010: 74 20 63 68 61 72 20 2a 7a 43 6f 6c 20 3d 20 70  t char *zCol = p
d020: 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69  Iter->azTblCol[i
d030: 5d 3b 0a 20 20 20 20 20 20 20 20 7a 4c 69 73 74  ];.        zList
d040: 20 3d 20 72 62 75 4d 50 72 69 6e 74 66 28 70 2c   = rbuMPrintf(p,
d050: 20 22 25 7a 25 73 5c 22 25 77 5c 22 3d 3f 25 64   "%z%s\"%w\"=?%d
d060: 22 2c 20 7a 4c 69 73 74 2c 20 7a 53 65 70 2c 20  ", zList, zSep, 
d070: 7a 43 6f 6c 2c 20 69 2b 31 29 3b 0a 20 20 20 20  zCol, i+1);.    
d080: 20 20 20 20 7a 53 65 70 20 3d 20 22 20 41 4e 44      zSep = " AND
d090: 20 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   ";.      }.    
d0a0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  }.  }.  return z
d0b0: 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  List;.}../*.** T
d0c0: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
d0d0: 65 6e 74 20 69 74 65 72 61 74 69 6e 67 20 74 68  ent iterating th
d0e0: 72 6f 75 67 68 20 74 68 65 20 6b 65 79 73 20 66  rough the keys f
d0f0: 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 6f  or the current o
d100: 62 6a 65 63 74 0a 2a 2a 20 28 70 2d 3e 6f 62 6a  bject.** (p->obj
d110: 69 74 65 72 2e 70 53 65 6c 65 63 74 29 20 63 75  iter.pSelect) cu
d120: 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74  rrently points t
d130: 6f 20 61 20 76 61 6c 69 64 20 72 6f 77 2e 20 48  o a valid row. H
d140: 6f 77 65 76 65 72 2c 20 74 68 65 72 65 0a 2a 2a  owever, there.**
d150: 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 77 72   is something wr
d160: 6f 6e 67 20 77 69 74 68 20 74 68 65 20 72 62 75  ong with the rbu
d170: 5f 63 6f 6e 74 72 6f 6c 20 76 61 6c 75 65 20 69  _control value i
d180: 6e 20 74 68 65 20 72 62 75 5f 63 6f 6e 74 72 6f  n the rbu_contro
d190: 6c 20 76 61 6c 75 65 0a 2a 2a 20 73 74 6f 72 65  l value.** store
d1a0: 64 20 69 6e 20 74 68 65 20 28 70 2d 3e 6e 43 6f  d in the (p->nCo
d1b0: 6c 2b 31 29 27 74 68 20 63 6f 6c 75 6d 6e 2e 20  l+1)'th column. 
d1c0: 53 65 74 20 74 68 65 20 65 72 72 6f 72 20 63 6f  Set the error co
d1d0: 64 65 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73  de and error mes
d1e0: 73 61 67 65 0a 2a 2a 20 6f 66 20 74 68 65 20 52  sage.** of the R
d1f0: 42 55 20 68 61 6e 64 6c 65 20 74 6f 20 73 6f 6d  BU handle to som
d200: 65 74 68 69 6e 67 20 72 65 66 6c 65 63 74 69 6e  ething reflectin
d210: 67 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69  g this..*/.stati
d220: 63 20 76 6f 69 64 20 72 62 75 42 61 64 43 6f 6e  c void rbuBadCon
d230: 74 72 6f 6c 45 72 72 6f 72 28 73 71 6c 69 74 65  trolError(sqlite
d240: 33 72 62 75 20 2a 70 29 7b 0a 20 20 70 2d 3e 72  3rbu *p){.  p->r
d250: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
d260: 3b 0a 20 20 70 2d 3e 7a 45 72 72 6d 73 67 20 3d  ;.  p->zErrmsg =
d270: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
d280: 28 22 69 6e 76 61 6c 69 64 20 72 62 75 5f 63 6f  ("invalid rbu_co
d290: 6e 74 72 6f 6c 20 76 61 6c 75 65 22 29 3b 0a 7d  ntrol value");.}
d2a0: 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  .../*.** Return 
d2b0: 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64  a nul-terminated
d2c0: 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69   string containi
d2d0: 6e 67 20 74 68 65 20 63 6f 6d 6d 61 20 73 65 70  ng the comma sep
d2e0: 61 72 61 74 65 64 20 6c 69 73 74 20 6f 66 0a 2a  arated list of.*
d2f0: 2a 20 61 73 73 69 67 6e 6d 65 6e 74 73 20 74 68  * assignments th
d300: 61 74 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 63  at should be inc
d310: 6c 75 64 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20  luded following 
d320: 74 68 65 20 22 53 45 54 22 20 6b 65 79 77 6f 72  the "SET" keywor
d330: 64 20 6f 66 0a 2a 2a 20 61 6e 20 55 50 44 41 54  d of.** an UPDAT
d340: 45 20 73 74 61 74 65 6d 65 6e 74 20 75 73 65 64  E statement used
d350: 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 74   to update the t
d360: 61 62 6c 65 20 6f 62 6a 65 63 74 20 74 68 61 74  able object that
d370: 20 74 68 65 20 69 74 65 72 61 74 6f 72 0a 2a 2a   the iterator.**
d380: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
d390: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 63  econd argument c
d3a0: 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20  urrently points 
d3b0: 74 6f 20 69 66 20 74 68 65 20 72 62 75 5f 63 6f  to if the rbu_co
d3c0: 6e 74 72 6f 6c 0a 2a 2a 20 63 6f 6c 75 6d 6e 20  ntrol.** column 
d3d0: 6f 66 20 74 68 65 20 64 61 74 61 5f 78 78 78 20  of the data_xxx 
d3e0: 74 61 62 6c 65 20 65 6e 74 72 79 20 69 73 20 73  table entry is s
d3f0: 65 74 20 74 6f 20 7a 4d 61 73 6b 2e 0a 2a 2a 0a  et to zMask..**.
d400: 2a 2a 20 54 68 65 20 6d 65 6d 6f 72 79 20 66 6f  ** The memory fo
d410: 72 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73  r the returned s
d420: 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65  tring is obtaine
d430: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
d440: 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 49 74 20 69  alloc()..** It i
d450: 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69  s the responsibi
d460: 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c  lity of the call
d470: 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79  er to eventually
d480: 20 66 72 65 65 20 69 74 20 75 73 69 6e 67 0a 2a   free it using.*
d490: 2a 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29  * sqlite3_free()
d4a0: 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f  . .**.** If an O
d4b0: 4f 4d 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  OM error is enco
d4c0: 75 6e 74 65 72 65 64 20 77 68 65 6e 20 61 6c 6c  untered when all
d4d0: 6f 63 61 74 69 6e 67 20 73 70 61 63 65 20 66 6f  ocating space fo
d4e0: 72 20 74 68 65 20 6e 65 77 0a 2a 2a 20 73 74 72  r the new.** str
d4f0: 69 6e 67 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f  ing, an error co
d500: 64 65 20 69 73 20 6c 65 66 74 20 69 6e 20 74 68  de is left in th
d510: 65 20 72 62 75 20 68 61 6e 64 6c 65 20 70 61 73  e rbu handle pas
d520: 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
d530: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 61 6e 64  .** argument and
d540: 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
d550: 64 2e 20 4f 72 2c 20 69 66 20 61 6e 20 65 72 72  d. Or, if an err
d560: 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f  or has already o
d570: 63 63 75 72 72 65 64 0a 2a 2a 20 77 68 65 6e 20  ccurred.** when 
d580: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
d590: 20 63 61 6c 6c 65 64 2c 20 4e 55 4c 4c 20 69 73   called, NULL is
d5a0: 20 72 65 74 75 72 6e 65 64 20 69 6d 6d 65 64 69   returned immedi
d5b0: 61 74 65 6c 79 2c 20 77 69 74 68 6f 75 74 0a 2a  ately, without.*
d5c0: 2a 20 61 74 74 65 6d 70 74 69 6e 67 20 74 68 65  * attempting the
d5d0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 72 20 6d   allocation or m
d5e0: 6f 64 69 66 79 69 6e 67 20 74 68 65 20 73 74 6f  odifying the sto
d5f0: 72 65 64 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  red error code..
d600: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
d610: 72 62 75 4f 62 6a 49 74 65 72 47 65 74 53 65 74  rbuObjIterGetSet
d620: 6c 69 73 74 28 0a 20 20 73 71 6c 69 74 65 33 72  list(.  sqlite3r
d630: 62 75 20 2a 70 2c 0a 20 20 52 62 75 4f 62 6a 49  bu *p,.  RbuObjI
d640: 74 65 72 20 2a 70 49 74 65 72 2c 0a 20 20 63 6f  ter *pIter,.  co
d650: 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 6b 0a  nst char *zMask.
d660: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4c 69 73 74  ){.  char *zList
d670: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 72   = 0;.  if( p->r
d680: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
d690: 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20      int i;..    
d6a0: 69 66 28 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  if( (int)strlen(
d6b0: 7a 4d 61 73 6b 29 21 3d 70 49 74 65 72 2d 3e 6e  zMask)!=pIter->n
d6c0: 54 62 6c 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  TblCol ){.      
d6d0: 72 62 75 42 61 64 43 6f 6e 74 72 6f 6c 45 72 72  rbuBadControlErr
d6e0: 6f 72 28 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65  or(p);.    }else
d6f0: 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
d700: 61 72 20 2a 7a 53 65 70 20 3d 20 22 22 3b 0a 20  ar *zSep = "";. 
d710: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
d720: 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 3b 20  pIter->nTblCol; 
d730: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68  i++){.        ch
d740: 61 72 20 63 20 3d 20 7a 4d 61 73 6b 5b 70 49 74  ar c = zMask[pIt
d750: 65 72 2d 3e 61 69 53 72 63 4f 72 64 65 72 5b 69  er->aiSrcOrder[i
d760: 5d 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ]];.        if( 
d770: 63 3d 3d 27 78 27 20 29 7b 0a 20 20 20 20 20 20  c=='x' ){.      
d780: 20 20 20 20 7a 4c 69 73 74 20 3d 20 72 62 75 4d      zList = rbuM
d790: 50 72 69 6e 74 66 28 70 2c 20 22 25 7a 25 73 5c  Printf(p, "%z%s\
d7a0: 22 25 77 5c 22 3d 3f 25 64 22 2c 20 0a 20 20 20  "%w\"=?%d", .   
d7b0: 20 20 20 20 20 20 20 20 20 20 20 7a 4c 69 73 74             zList
d7c0: 2c 20 7a 53 65 70 2c 20 70 49 74 65 72 2d 3e 61  , zSep, pIter->a
d7d0: 7a 54 62 6c 43 6f 6c 5b 69 5d 2c 20 69 2b 31 0a  zTblCol[i], i+1.
d7e0: 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20            );.   
d7f0: 20 20 20 20 20 20 20 7a 53 65 70 20 3d 20 22 2c         zSep = ",
d800: 20 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   ";.        }.  
d810: 20 20 20 20 20 20 65 6c 73 65 20 69 66 28 20 63        else if( c
d820: 3d 3d 27 64 27 20 29 7b 0a 20 20 20 20 20 20 20  =='d' ){.       
d830: 20 20 20 7a 4c 69 73 74 20 3d 20 72 62 75 4d 50     zList = rbuMP
d840: 72 69 6e 74 66 28 70 2c 20 22 25 7a 25 73 5c 22  rintf(p, "%z%s\"
d850: 25 77 5c 22 3d 72 62 75 5f 64 65 6c 74 61 28 5c  %w\"=rbu_delta(\
d860: 22 25 77 5c 22 2c 20 3f 25 64 29 22 2c 20 0a 20  "%w\", ?%d)", . 
d870: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4c 69               zLi
d880: 73 74 2c 20 7a 53 65 70 2c 20 70 49 74 65 72 2d  st, zSep, pIter-
d890: 3e 61 7a 54 62 6c 43 6f 6c 5b 69 5d 2c 20 70 49  >azTblCol[i], pI
d8a0: 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69 5d  ter->azTblCol[i]
d8b0: 2c 20 69 2b 31 0a 20 20 20 20 20 20 20 20 20 20  , i+1.          
d8c0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 53 65  );.          zSe
d8d0: 70 20 3d 20 22 2c 20 22 3b 0a 20 20 20 20 20 20  p = ", ";.      
d8e0: 20 20 7d 0a 20 20 20 20 20 20 20 20 65 6c 73 65    }.        else
d8f0: 20 69 66 28 20 63 3d 3d 27 66 27 20 29 7b 0a 20   if( c=='f' ){. 
d900: 20 20 20 20 20 20 20 20 20 7a 4c 69 73 74 20 3d           zList =
d910: 20 72 62 75 4d 50 72 69 6e 74 66 28 70 2c 20 22   rbuMPrintf(p, "
d920: 25 7a 25 73 5c 22 25 77 5c 22 3d 72 62 75 5f 66  %z%s\"%w\"=rbu_f
d930: 6f 73 73 69 6c 5f 64 65 6c 74 61 28 5c 22 25 77  ossil_delta(\"%w
d940: 5c 22 2c 20 3f 25 64 29 22 2c 20 0a 20 20 20 20  \", ?%d)", .    
d950: 20 20 20 20 20 20 20 20 20 20 7a 4c 69 73 74 2c            zList,
d960: 20 7a 53 65 70 2c 20 70 49 74 65 72 2d 3e 61 7a   zSep, pIter->az
d970: 54 62 6c 43 6f 6c 5b 69 5d 2c 20 70 49 74 65 72  TblCol[i], pIter
d980: 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69 5d 2c 20 69  ->azTblCol[i], i
d990: 2b 31 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a  +1.          );.
d9a0: 20 20 20 20 20 20 20 20 20 20 7a 53 65 70 20 3d            zSep =
d9b0: 20 22 2c 20 22 3b 0a 20 20 20 20 20 20 20 20 7d   ", ";.        }
d9c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
d9d0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4c 69 73   }.  return zLis
d9e0: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  t;.}../*.** Retu
d9f0: 72 6e 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  rn a nul-termina
da00: 74 65 64 20 73 74 72 69 6e 67 20 63 6f 6e 73 69  ted string consi
da10: 73 74 69 6e 67 20 6f 66 20 6e 42 79 74 65 20 63  sting of nByte c
da20: 6f 6d 6d 61 20 73 65 70 61 72 61 74 65 64 0a 2a  omma separated.*
da30: 2a 20 22 3f 22 20 65 78 70 72 65 73 73 69 6f 6e  * "?" expression
da40: 73 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  s. For example, 
da50: 69 66 20 6e 42 79 74 65 20 69 73 20 33 2c 20 72  if nByte is 3, r
da60: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
da70: 74 6f 0a 2a 2a 20 61 20 62 75 66 66 65 72 20 63  to.** a buffer c
da80: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73 74  ontaining the st
da90: 72 69 6e 67 20 22 3f 2c 3f 2c 3f 22 2e 0a 2a 2a  ring "?,?,?"..**
daa0: 0a 2a 2a 20 54 68 65 20 6d 65 6d 6f 72 79 20 66  .** The memory f
dab0: 6f 72 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  or the returned 
dac0: 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e  string is obtain
dad0: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ed from sqlite3_
dae0: 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 49 74 20  malloc()..** It 
daf0: 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62  is the responsib
db00: 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c  ility of the cal
db10: 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c  ler to eventuall
db20: 79 20 66 72 65 65 20 69 74 20 75 73 69 6e 67 0a  y free it using.
db30: 2a 2a 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  ** sqlite3_free(
db40: 29 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ). .**.** If an 
db50: 4f 4f 4d 20 65 72 72 6f 72 20 69 73 20 65 6e 63  OOM error is enc
db60: 6f 75 6e 74 65 72 65 64 20 77 68 65 6e 20 61 6c  ountered when al
db70: 6c 6f 63 61 74 69 6e 67 20 73 70 61 63 65 20 66  locating space f
db80: 6f 72 20 74 68 65 20 6e 65 77 0a 2a 2a 20 73 74  or the new.** st
db90: 72 69 6e 67 2c 20 61 6e 20 65 72 72 6f 72 20 63  ring, an error c
dba0: 6f 64 65 20 69 73 20 6c 65 66 74 20 69 6e 20 74  ode is left in t
dbb0: 68 65 20 72 62 75 20 68 61 6e 64 6c 65 20 70 61  he rbu handle pa
dbc0: 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
dbd0: 74 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 61 6e  t.** argument an
dbe0: 64 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  d NULL is return
dbf0: 65 64 2e 20 4f 72 2c 20 69 66 20 61 6e 20 65 72  ed. Or, if an er
dc00: 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79 20  ror has already 
dc10: 6f 63 63 75 72 72 65 64 0a 2a 2a 20 77 68 65 6e  occurred.** when
dc20: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
dc30: 73 20 63 61 6c 6c 65 64 2c 20 4e 55 4c 4c 20 69  s called, NULL i
dc40: 73 20 72 65 74 75 72 6e 65 64 20 69 6d 6d 65 64  s returned immed
dc50: 69 61 74 65 6c 79 2c 20 77 69 74 68 6f 75 74 0a  iately, without.
dc60: 2a 2a 20 61 74 74 65 6d 70 74 69 6e 67 20 74 68  ** attempting th
dc70: 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 72 20  e allocation or 
dc80: 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 73 74  modifying the st
dc90: 6f 72 65 64 20 65 72 72 6f 72 20 63 6f 64 65 2e  ored error code.
dca0: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
dcb0: 2a 72 62 75 4f 62 6a 49 74 65 72 47 65 74 42 69  *rbuObjIterGetBi
dcc0: 6e 64 6c 69 73 74 28 73 71 6c 69 74 65 33 72 62  ndlist(sqlite3rb
dcd0: 75 20 2a 70 2c 20 69 6e 74 20 6e 42 69 6e 64 29  u *p, int nBind)
dce0: 7b 0a 20 20 63 68 61 72 20 2a 7a 52 65 74 20 3d  {.  char *zRet =
dcf0: 20 30 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20   0;.  int nByte 
dd00: 3d 20 6e 42 69 6e 64 2a 32 20 2b 20 31 3b 0a 0a  = nBind*2 + 1;..
dd10: 20 20 7a 52 65 74 20 3d 20 28 63 68 61 72 2a 29    zRet = (char*)
dd20: 72 62 75 4d 61 6c 6c 6f 63 28 70 2c 20 6e 42 79  rbuMalloc(p, nBy
dd30: 74 65 29 3b 0a 20 20 69 66 28 20 7a 52 65 74 20  te);.  if( zRet 
dd40: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
dd50: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 69    for(i=0; i<nBi
dd60: 6e 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  nd; i++){.      
dd70: 7a 52 65 74 5b 69 2a 32 5d 20 3d 20 27 3f 27 3b  zRet[i*2] = '?';
dd80: 0a 20 20 20 20 20 20 7a 52 65 74 5b 69 2a 32 2b  .      zRet[i*2+
dd90: 31 5d 20 3d 20 28 69 2b 31 3d 3d 6e 42 69 6e 64  1] = (i+1==nBind
dda0: 29 20 3f 20 27 5c 30 27 20 3a 20 27 2c 27 3b 0a  ) ? '\0' : ',';.
ddb0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
ddc0: 72 6e 20 7a 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn zRet;.}../*.*
ddd0: 2a 20 54 68 65 20 69 74 65 72 61 74 6f 72 20 63  * The iterator c
dde0: 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20  urrently points 
ddf0: 74 6f 20 61 20 74 61 62 6c 65 20 28 6e 6f 74 20  to a table (not 
de00: 69 6e 64 65 78 29 20 6f 66 20 74 79 70 65 20 0a  index) of type .
de10: 2a 2a 20 52 42 55 5f 50 4b 5f 57 49 54 48 4f 55  ** RBU_PK_WITHOU
de20: 54 5f 52 4f 57 49 44 2e 20 54 68 69 73 20 66 75  T_ROWID. This fu
de30: 6e 63 74 69 6f 6e 20 63 72 65 61 74 65 73 20 74  nction creates t
de40: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 0a  he PRIMARY KEY .
de50: 2a 2a 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 66  ** declaration f
de60: 6f 72 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  or the correspon
de70: 64 69 6e 67 20 69 6d 70 6f 73 74 65 72 20 74 61  ding imposter ta
de80: 62 6c 65 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  ble. For example
de90: 2c 0a 2a 2a 20 69 66 20 74 68 65 20 69 74 65 72  ,.** if the iter
dea0: 61 74 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20 61  ator points to a
deb0: 20 74 61 62 6c 65 20 63 72 65 61 74 65 64 20 61   table created a
dec0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54  s:.**.**   CREAT
ded0: 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 2c  E TABLE t1(a, b,
dee0: 20 63 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28   c, PRIMARY KEY(
def0: 62 2c 20 61 20 44 45 53 43 29 29 20 57 49 54 48  b, a DESC)) WITH
df00: 4f 55 54 20 52 4f 57 49 44 0a 2a 2a 0a 2a 2a 20  OUT ROWID.**.** 
df10: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
df20: 74 75 72 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 50  turns:.**.**   P
df30: 52 49 4d 41 52 59 20 4b 45 59 28 22 62 22 2c 20  RIMARY KEY("b", 
df40: 22 61 22 20 44 45 53 43 29 0a 2a 2f 0a 73 74 61  "a" DESC).*/.sta
df50: 74 69 63 20 63 68 61 72 20 2a 72 62 75 57 69 74  tic char *rbuWit
df60: 68 6f 75 74 52 6f 77 69 64 50 4b 28 73 71 6c 69  houtRowidPK(sqli
df70: 74 65 33 72 62 75 20 2a 70 2c 20 52 62 75 4f 62  te3rbu *p, RbuOb
df80: 6a 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  jIter *pIter){. 
df90: 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20 20   char *z = 0;.  
dfa0: 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 7a  assert( pIter->z
dfb0: 49 64 78 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  Idx==0 );.  if( 
dfc0: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
dfd0: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
dfe0: 61 72 20 2a 7a 53 65 70 20 3d 20 22 50 52 49 4d  ar *zSep = "PRIM
dff0: 41 52 59 20 4b 45 59 28 22 3b 0a 20 20 20 20 73  ARY KEY(";.    s
e000: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 58 4c  qlite3_stmt *pXL
e010: 69 73 74 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  ist = 0;     /* 
e020: 50 52 41 47 4d 41 20 69 6e 64 65 78 5f 6c 69 73  PRAGMA index_lis
e030: 74 20 3d 20 28 70 49 74 65 72 2d 3e 7a 54 62 6c  t = (pIter->zTbl
e040: 29 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  ) */.    sqlite3
e050: 5f 73 74 6d 74 20 2a 70 58 49 6e 66 6f 20 3d 20  _stmt *pXInfo = 
e060: 30 3b 20 20 20 20 20 2f 2a 20 50 52 41 47 4d 41  0;     /* PRAGMA
e070: 20 69 6e 64 65 78 5f 78 69 6e 66 6f 20 3d 20 3c   index_xinfo = <
e080: 70 6b 2d 69 6e 64 65 78 3e 20 2a 2f 0a 20 20 20  pk-index> */.   
e090: 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 72 65  .    p->rc = pre
e0a0: 70 61 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65  pareFreeAndColle
e0b0: 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 4d 61 69  ctError(p->dbMai
e0c0: 6e 2c 20 26 70 58 4c 69 73 74 2c 20 26 70 2d 3e  n, &pXList, &p->
e0d0: 7a 45 72 72 6d 73 67 2c 0a 20 20 20 20 20 20 20  zErrmsg,.       
e0e0: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
e0f0: 28 22 50 52 41 47 4d 41 20 6d 61 69 6e 2e 69 6e  ("PRAGMA main.in
e100: 64 65 78 5f 6c 69 73 74 20 3d 20 25 51 22 2c 20  dex_list = %Q", 
e110: 70 49 74 65 72 2d 3e 7a 54 62 6c 29 0a 20 20 20  pIter->zTbl).   
e120: 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70   );.    while( p
e130: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
e140: 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  && SQLITE_ROW==s
e150: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 58 4c 69  qlite3_step(pXLi
e160: 73 74 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  st) ){.      con
e170: 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 20 3d  st char *zOrig =
e180: 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
e190: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
e1a0: 74 28 70 58 4c 69 73 74 2c 33 29 3b 0a 20 20 20  t(pXList,3);.   
e1b0: 20 20 20 69 66 28 20 7a 4f 72 69 67 20 26 26 20     if( zOrig && 
e1c0: 73 74 72 63 6d 70 28 7a 4f 72 69 67 2c 20 22 70  strcmp(zOrig, "p
e1d0: 6b 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  k")==0 ){.      
e1e0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49    const char *zI
e1f0: 64 78 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  dx = (const char
e200: 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
e210: 5f 74 65 78 74 28 70 58 4c 69 73 74 2c 31 29 3b  _text(pXList,1);
e220: 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 49 64  .        if( zId
e230: 78 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  x ){.          p
e240: 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65 46 72  ->rc = prepareFr
e250: 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f  eeAndCollectErro
e260: 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 70 58  r(p->dbMain, &pX
e270: 49 6e 66 6f 2c 20 26 70 2d 3e 7a 45 72 72 6d 73  Info, &p->zErrms
e280: 67 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  g,.             
e290: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
e2a0: 28 22 50 52 41 47 4d 41 20 6d 61 69 6e 2e 69 6e  ("PRAGMA main.in
e2b0: 64 65 78 5f 78 69 6e 66 6f 20 3d 20 25 51 22 2c  dex_xinfo = %Q",
e2c0: 20 7a 49 64 78 29 0a 20 20 20 20 20 20 20 20 20   zIdx).         
e2d0: 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   );.        }.  
e2e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
e2f0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72     }.    }.    r
e300: 62 75 46 69 6e 61 6c 69 7a 65 28 70 2c 20 70 58  buFinalize(p, pX
e310: 4c 69 73 74 29 3b 0a 0a 20 20 20 20 77 68 69 6c  List);..    whil
e320: 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  e( p->rc==SQLITE
e330: 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f  _OK && SQLITE_RO
e340: 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28  W==sqlite3_step(
e350: 70 58 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 20  pXInfo) ){.     
e360: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c   if( sqlite3_col
e370: 75 6d 6e 5f 69 6e 74 28 70 58 49 6e 66 6f 2c 20  umn_int(pXInfo, 
e380: 35 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  5) ){.        /*
e390: 20 69 6e 74 20 69 43 69 64 20 3d 20 73 71 6c 69   int iCid = sqli
e3a0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
e3b0: 58 49 6e 66 6f 2c 20 30 29 3b 20 2a 2f 0a 20 20  XInfo, 0); */.  
e3c0: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
e3d0: 20 2a 7a 43 6f 6c 20 3d 20 28 63 6f 6e 73 74 20   *zCol = (const 
e3e0: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
e3f0: 6c 75 6d 6e 5f 74 65 78 74 28 70 58 49 6e 66 6f  lumn_text(pXInfo
e400: 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  , 2);.        co
e410: 6e 73 74 20 63 68 61 72 20 2a 7a 44 65 73 63 20  nst char *zDesc 
e420: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
e430: 5f 69 6e 74 28 70 58 49 6e 66 6f 2c 20 33 29 20  _int(pXInfo, 3) 
e440: 3f 20 22 20 44 45 53 43 22 20 3a 20 22 22 3b 0a  ? " DESC" : "";.
e450: 20 20 20 20 20 20 20 20 7a 20 3d 20 72 62 75 4d          z = rbuM
e460: 50 72 69 6e 74 66 28 70 2c 20 22 25 7a 25 73 5c  Printf(p, "%z%s\
e470: 22 25 77 5c 22 25 73 22 2c 20 7a 2c 20 7a 53 65  "%w\"%s", z, zSe
e480: 70 2c 20 7a 43 6f 6c 2c 20 7a 44 65 73 63 29 3b  p, zCol, zDesc);
e490: 0a 20 20 20 20 20 20 20 20 7a 53 65 70 20 3d 20  .        zSep = 
e4a0: 22 2c 20 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ", ";.      }.  
e4b0: 20 20 7d 0a 20 20 20 20 7a 20 3d 20 72 62 75 4d    }.    z = rbuM
e4c0: 50 72 69 6e 74 66 28 70 2c 20 22 25 7a 29 22 2c  Printf(p, "%z)",
e4d0: 20 7a 29 3b 0a 20 20 20 20 72 62 75 46 69 6e 61   z);.    rbuFina
e4e0: 6c 69 7a 65 28 70 2c 20 70 58 49 6e 66 6f 29 3b  lize(p, pXInfo);
e4f0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b  .  }.  return z;
e500: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
e510: 75 6e 63 74 69 6f 6e 20 63 72 65 61 74 65 73 20  unction creates 
e520: 74 68 65 20 73 65 63 6f 6e 64 20 69 6d 70 6f 73  the second impos
e530: 74 65 72 20 74 61 62 6c 65 20 75 73 65 64 20 77  ter table used w
e540: 68 65 6e 20 77 72 69 74 69 6e 67 20 74 6f 0a 2a  hen writing to.*
e550: 2a 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65  * a table b-tree
e560: 20 77 68 65 72 65 20 74 68 65 20 74 61 62 6c 65   where the table
e570: 20 68 61 73 20 61 6e 20 65 78 74 65 72 6e 61 6c   has an external
e580: 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 49 66   primary key. If
e590: 20 74 68 65 0a 2a 2a 20 69 74 65 72 61 74 6f 72   the.** iterator
e5a0: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
e5b0: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 64  econd argument d
e5c0: 6f 65 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c  oes not currentl
e5d0: 79 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 61 20  y point to.** a 
e5e0: 74 61 62 6c 65 20 28 6e 6f 74 20 69 6e 64 65 78  table (not index
e5f0: 29 20 77 69 74 68 20 61 6e 20 65 78 74 65 72 6e  ) with an extern
e600: 61 6c 20 70 72 69 6d 61 72 79 20 6b 65 79 2c 20  al primary key, 
e610: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
e620: 20 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20 0a 2a 2a   a.** no-op. .**
e630: 0a 2a 2a 20 41 73 73 75 6d 69 6e 67 20 74 68 65  .** Assuming the
e640: 20 69 74 65 72 61 74 6f 72 20 64 6f 65 73 20 70   iterator does p
e650: 6f 69 6e 74 20 74 6f 20 61 20 74 61 62 6c 65 20  oint to a table 
e660: 77 69 74 68 20 61 6e 20 65 78 74 65 72 6e 61 6c  with an external
e670: 20 50 4b 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e   PK, this.** fun
e680: 63 74 69 6f 6e 20 63 72 65 61 74 65 73 20 61 20  ction creates a 
e690: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 69 6d  WITHOUT ROWID im
e6a0: 70 6f 73 74 65 72 20 74 61 62 6c 65 20 6e 61 6d  poster table nam
e6b0: 65 64 20 22 72 62 75 5f 69 6d 70 6f 73 74 65 72  ed "rbu_imposter
e6c0: 32 22 0a 2a 2a 20 75 73 65 64 20 74 6f 20 61 63  2".** used to ac
e6d0: 63 65 73 73 20 74 68 61 74 20 50 4b 20 69 6e 64  cess that PK ind
e6e0: 65 78 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  ex. For example,
e6f0: 20 69 66 20 74 68 65 20 74 61 72 67 65 74 20 74   if the target t
e700: 61 62 6c 65 20 69 73 0a 2a 2a 20 64 65 63 6c 61  able is.** decla
e710: 72 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  red as follows:.
e720: 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 54  **.**   CREATE T
e730: 41 42 4c 45 20 74 31 28 61 2c 20 62 20 54 45 58  ABLE t1(a, b TEX
e740: 54 2c 20 63 20 52 45 41 4c 2c 20 50 52 49 4d 41  T, c REAL, PRIMA
e750: 52 59 20 4b 45 59 28 62 2c 20 63 29 29 3b 0a 2a  RY KEY(b, c));.*
e760: 2a 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 69 6d  *.** then the im
e770: 70 6f 73 74 65 72 20 74 61 62 6c 65 20 73 63 68  poster table sch
e780: 65 6d 61 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ema is:.**.**   
e790: 43 52 45 41 54 45 20 54 41 42 4c 45 20 72 62 75  CREATE TABLE rbu
e7a0: 5f 69 6d 70 6f 73 74 65 72 32 28 63 31 20 54 45  _imposter2(c1 TE
e7b0: 58 54 2c 20 63 32 20 52 45 41 4c 2c 20 69 64 20  XT, c2 REAL, id 
e7c0: 49 4e 54 45 47 45 52 29 20 57 49 54 48 4f 55 54  INTEGER) WITHOUT
e7d0: 20 52 4f 57 49 44 3b 0a 2a 2a 0a 2a 2f 0a 73 74   ROWID;.**.*/.st
e7e0: 61 74 69 63 20 76 6f 69 64 20 72 62 75 43 72 65  atic void rbuCre
e7f0: 61 74 65 49 6d 70 6f 73 74 65 72 54 61 62 6c 65  ateImposterTable
e800: 32 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c  2(sqlite3rbu *p,
e810: 20 52 62 75 4f 62 6a 49 74 65 72 20 2a 70 49 74   RbuObjIter *pIt
e820: 65 72 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63  er){.  if( p->rc
e830: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
e840: 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55  Iter->eType==RBU
e850: 5f 50 4b 5f 45 58 54 45 52 4e 41 4c 20 29 7b 0a  _PK_EXTERNAL ){.
e860: 20 20 20 20 69 6e 74 20 74 6e 75 6d 20 3d 20 70      int tnum = p
e870: 49 74 65 72 2d 3e 69 50 6b 54 6e 75 6d 3b 20 20  Iter->iPkTnum;  
e880: 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f    /* Root page o
e890: 66 20 50 4b 20 69 6e 64 65 78 20 2a 2f 0a 20 20  f PK index */.  
e8a0: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
e8b0: 70 51 75 65 72 79 20 3d 20 30 3b 20 20 20 20 20  pQuery = 0;     
e8c0: 2f 2a 20 53 45 4c 45 43 54 20 6e 61 6d 65 20 2e  /* SELECT name .
e8d0: 2e 2e 20 57 48 45 52 45 20 72 6f 6f 74 70 61 67  .. WHERE rootpag
e8e0: 65 20 3d 20 24 74 6e 75 6d 20 2a 2f 0a 20 20 20  e = $tnum */.   
e8f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64   const char *zId
e900: 78 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  x = 0;         /
e910: 2a 20 4e 61 6d 65 20 6f 66 20 50 4b 20 69 6e 64  * Name of PK ind
e920: 65 78 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  ex */.    sqlite
e930: 33 5f 73 74 6d 74 20 2a 70 58 49 6e 66 6f 20 3d  3_stmt *pXInfo =
e940: 20 30 3b 20 20 20 20 20 2f 2a 20 50 52 41 47 4d   0;     /* PRAGM
e950: 41 20 6d 61 69 6e 2e 69 6e 64 65 78 5f 78 69 6e  A main.index_xin
e960: 66 6f 20 3d 20 24 7a 49 64 78 20 2a 2f 0a 20 20  fo = $zIdx */.  
e970: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
e980: 6f 6d 6d 61 20 3d 20 22 22 3b 0a 20 20 20 20 63  omma = "";.    c
e990: 68 61 72 20 2a 7a 43 6f 6c 73 20 3d 20 30 3b 20  har *zCols = 0; 
e9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e9b0: 55 73 65 64 20 74 6f 20 62 75 69 6c 64 20 75 70  Used to build up
e9c0: 20 6c 69 73 74 20 6f 66 20 74 61 62 6c 65 20 63   list of table c
e9d0: 6f 6c 73 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  ols */.    char 
e9e0: 2a 7a 50 6b 20 3d 20 30 3b 20 20 20 20 20 20 20  *zPk = 0;       
e9f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
ea00: 20 74 6f 20 62 75 69 6c 64 20 75 70 20 74 61 62   to build up tab
ea10: 6c 65 20 50 4b 20 64 65 63 6c 61 72 61 74 69 6f  le PK declaratio
ea20: 6e 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46 69 67  n */..    /* Fig
ea30: 75 72 65 20 6f 75 74 20 74 68 65 20 6e 61 6d 65  ure out the name
ea40: 20 6f 66 20 74 68 65 20 70 72 69 6d 61 72 79 20   of the primary 
ea50: 6b 65 79 20 69 6e 64 65 78 20 66 6f 72 20 74 68  key index for th
ea60: 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65 2e  e current table.
ea70: 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20  .    ** This is 
ea80: 6e 65 65 64 65 64 20 66 6f 72 20 74 68 65 20 61  needed for the a
ea90: 72 67 75 6d 65 6e 74 20 74 6f 20 22 50 52 41 47  rgument to "PRAG
eaa0: 4d 41 20 69 6e 64 65 78 5f 78 69 6e 66 6f 22 2e  MA index_xinfo".
eab0: 20 53 65 74 0a 20 20 20 20 2a 2a 20 7a 49 64 78   Set.    ** zIdx
eac0: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 6e   to point to a n
ead0: 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74  ul-terminated st
eae0: 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ring containing 
eaf0: 74 68 69 73 20 6e 61 6d 65 2e 20 2a 2f 0a 20 20  this name. */.  
eb00: 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72    p->rc = prepar
eb10: 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72  eAndCollectError
eb20: 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 70 51 75  (p->dbMain, &pQu
eb30: 65 72 79 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67  ery, &p->zErrmsg
eb40: 2c 20 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45  , .        "SELE
eb50: 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c  CT name FROM sql
eb60: 69 74 65 5f 6d 61 73 74 65 72 20 57 48 45 52 45  ite_master WHERE
eb70: 20 72 6f 6f 74 70 61 67 65 20 3d 20 3f 22 0a 20   rootpage = ?". 
eb80: 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d     );.    if( p-
eb90: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
eba0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
ebb0: 62 69 6e 64 5f 69 6e 74 28 70 51 75 65 72 79 2c  bind_int(pQuery,
ebc0: 20 31 2c 20 74 6e 75 6d 29 3b 0a 20 20 20 20 20   1, tnum);.     
ebd0: 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d   if( SQLITE_ROW=
ebe0: 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 51  =sqlite3_step(pQ
ebf0: 75 65 72 79 29 20 29 7b 0a 20 20 20 20 20 20 20  uery) ){.       
ec00: 20 7a 49 64 78 20 3d 20 28 63 6f 6e 73 74 20 63   zIdx = (const c
ec10: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
ec20: 75 6d 6e 5f 74 65 78 74 28 70 51 75 65 72 79 2c  umn_text(pQuery,
ec30: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
ec40: 20 7d 0a 20 20 20 20 69 66 28 20 7a 49 64 78 20   }.    if( zIdx 
ec50: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  ){.      p->rc =
ec60: 20 70 72 65 70 61 72 65 46 72 65 65 41 6e 64 43   prepareFreeAndC
ec70: 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64  ollectError(p->d
ec80: 62 4d 61 69 6e 2c 20 26 70 58 49 6e 66 6f 2c 20  bMain, &pXInfo, 
ec90: 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 0a 20 20 20  &p->zErrmsg,.   
eca0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d         sqlite3_m
ecb0: 70 72 69 6e 74 66 28 22 50 52 41 47 4d 41 20 6d  printf("PRAGMA m
ecc0: 61 69 6e 2e 69 6e 64 65 78 5f 78 69 6e 66 6f 20  ain.index_xinfo 
ecd0: 3d 20 25 51 22 2c 20 7a 49 64 78 29 0a 20 20 20  = %Q", zIdx).   
ece0: 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20     );.    }.    
ecf0: 72 62 75 46 69 6e 61 6c 69 7a 65 28 70 2c 20 70  rbuFinalize(p, p
ed00: 51 75 65 72 79 29 3b 0a 0a 20 20 20 20 77 68 69  Query);..    whi
ed10: 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  le( p->rc==SQLIT
ed20: 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52  E_OK && SQLITE_R
ed30: 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
ed40: 28 70 58 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20  (pXInfo) ){.    
ed50: 20 20 69 6e 74 20 62 4b 65 79 20 3d 20 73 71 6c    int bKey = sql
ed60: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
ed70: 70 58 49 6e 66 6f 2c 20 35 29 3b 0a 20 20 20 20  pXInfo, 5);.    
ed80: 20 20 69 66 28 20 62 4b 65 79 20 29 7b 0a 20 20    if( bKey ){.  
ed90: 20 20 20 20 20 20 69 6e 74 20 69 43 69 64 20 3d        int iCid =
eda0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
edb0: 69 6e 74 28 70 58 49 6e 66 6f 2c 20 31 29 3b 0a  int(pXInfo, 1);.
edc0: 20 20 20 20 20 20 20 20 69 6e 74 20 62 44 65 73          int bDes
edd0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  c = sqlite3_colu
ede0: 6d 6e 5f 69 6e 74 28 70 58 49 6e 66 6f 2c 20 33  mn_int(pXInfo, 3
edf0: 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  );.        const
ee00: 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 61 74 65 20   char *zCollate 
ee10: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
ee20: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
ee30: 78 74 28 70 58 49 6e 66 6f 2c 20 34 29 3b 0a 20  xt(pXInfo, 4);. 
ee40: 20 20 20 20 20 20 20 7a 43 6f 6c 73 20 3d 20 72         zCols = r
ee50: 62 75 4d 50 72 69 6e 74 66 28 70 2c 20 22 25 7a  buMPrintf(p, "%z
ee60: 25 73 63 25 64 20 25 73 20 43 4f 4c 4c 41 54 45  %sc%d %s COLLATE
ee70: 20 25 51 22 2c 20 7a 43 6f 6c 73 2c 20 7a 43 6f   %Q", zCols, zCo
ee80: 6d 6d 61 2c 20 0a 20 20 20 20 20 20 20 20 20 20  mma, .          
ee90: 20 20 69 43 69 64 2c 20 70 49 74 65 72 2d 3e 61    iCid, pIter->a
eea0: 7a 54 62 6c 54 79 70 65 5b 69 43 69 64 5d 2c 20  zTblType[iCid], 
eeb0: 7a 43 6f 6c 6c 61 74 65 0a 20 20 20 20 20 20 20  zCollate.       
eec0: 20 29 3b 0a 20 20 20 20 20 20 20 20 7a 50 6b 20   );.        zPk 
eed0: 3d 20 72 62 75 4d 50 72 69 6e 74 66 28 70 2c 20  = rbuMPrintf(p, 
eee0: 22 25 7a 25 73 63 25 64 25 73 22 2c 20 7a 50 6b  "%z%sc%d%s", zPk
eef0: 2c 20 7a 43 6f 6d 6d 61 2c 20 69 43 69 64 2c 20  , zComma, iCid, 
ef00: 62 44 65 73 63 3f 22 20 44 45 53 43 22 3a 22 22  bDesc?" DESC":""
ef10: 29 3b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6d 6d  );.        zComm
ef20: 61 20 3d 20 22 2c 20 22 3b 0a 20 20 20 20 20 20  a = ", ";.      
ef30: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 43 6f 6c  }.    }.    zCol
ef40: 73 20 3d 20 72 62 75 4d 50 72 69 6e 74 66 28 70  s = rbuMPrintf(p
ef50: 2c 20 22 25 7a 2c 20 69 64 20 49 4e 54 45 47 45  , "%z, id INTEGE
ef60: 52 22 2c 20 7a 43 6f 6c 73 29 3b 0a 20 20 20 20  R", zCols);.    
ef70: 72 62 75 46 69 6e 61 6c 69 7a 65 28 70 2c 20 70  rbuFinalize(p, p
ef80: 58 49 6e 66 6f 29 3b 0a 0a 20 20 20 20 73 71 6c  XInfo);..    sql
ef90: 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
efa0: 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
efb0: 4c 5f 49 4d 50 4f 53 54 45 52 2c 20 70 2d 3e 64  L_IMPOSTER, p->d
efc0: 62 4d 61 69 6e 2c 20 22 6d 61 69 6e 22 2c 20 31  bMain, "main", 1
efd0: 2c 20 74 6e 75 6d 29 3b 0a 20 20 20 20 72 62 75  , tnum);.    rbu
efe0: 4d 50 72 69 6e 74 66 45 78 65 63 28 70 2c 20 70  MPrintfExec(p, p
eff0: 2d 3e 64 62 4d 61 69 6e 2c 0a 20 20 20 20 20 20  ->dbMain,.      
f000: 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20    "CREATE TABLE 
f010: 72 62 75 5f 69 6d 70 6f 73 74 65 72 32 28 25 7a  rbu_imposter2(%z
f020: 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28 25 7a  , PRIMARY KEY(%z
f030: 29 29 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44  )) WITHOUT ROWID
f040: 22 2c 20 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c  ", .        zCol
f050: 73 2c 20 7a 50 6b 0a 20 20 20 20 29 3b 0a 20 20  s, zPk.    );.  
f060: 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
f070: 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
f080: 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52 2c  STCTRL_IMPOSTER,
f090: 20 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 6d 61 69   p->dbMain, "mai
f0a0: 6e 22 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 7d  n", 0, 0);.  }.}
f0b0: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ../*.** If an er
f0c0: 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79 20  ror has already 
f0d0: 6f 63 63 75 72 72 65 64 20 77 68 65 6e 20 74 68  occurred when th
f0e0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
f0f0: 61 6c 6c 65 64 2c 20 69 74 20 0a 2a 2a 20 69 6d  alled, it .** im
f100: 6d 65 64 69 61 74 65 6c 79 20 72 65 74 75 72 6e  mediately return
f110: 73 20 7a 65 72 6f 20 28 77 69 74 68 6f 75 74 20  s zero (without 
f120: 64 6f 69 6e 67 20 61 6e 79 20 77 6f 72 6b 29 2e  doing any work).
f130: 20 4f 72 2c 20 69 66 20 61 6e 20 65 72 72 6f 72   Or, if an error
f140: 0a 2a 2a 20 6f 63 63 75 72 73 20 64 75 72 69 6e  .** occurs durin
f150: 67 20 74 68 65 20 65 78 65 63 75 74 69 6f 6e 20  g the execution 
f160: 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
f170: 2c 20 69 74 20 73 65 74 73 20 74 68 65 20 65 72  , it sets the er
f180: 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 69 6e 20 74  ror code.** in t
f190: 68 65 20 73 71 6c 69 74 65 33 72 62 75 20 6f 62  he sqlite3rbu ob
f1a0: 6a 65 63 74 20 69 6e 64 69 63 61 74 65 64 20 62  ject indicated b
f1b0: 79 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  y the first argu
f1c0: 6d 65 6e 74 20 61 6e 64 20 72 65 74 75 72 6e 73  ment and returns
f1d0: 0a 2a 2a 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20  .** zero..**.** 
f1e0: 54 68 65 20 69 74 65 72 61 74 6f 72 20 70 61 73  The iterator pas
f1f0: 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
f200: 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 67 75  d argument is gu
f210: 61 72 61 6e 74 65 65 64 20 74 6f 20 70 6f 69 6e  aranteed to poin
f220: 74 20 74 6f 0a 2a 2a 20 61 20 74 61 62 6c 65 20  t to.** a table 
f230: 28 6e 6f 74 20 61 6e 20 69 6e 64 65 78 29 20 77  (not an index) w
f240: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
f250: 6e 20 69 73 20 63 61 6c 6c 65 64 2e 20 54 68 69  n is called. Thi
f260: 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 74  s function.** at
f270: 74 65 6d 70 74 73 20 74 6f 20 63 72 65 61 74 65  tempts to create
f280: 20 61 6e 79 20 69 6d 70 6f 73 74 65 72 20 74 61   any imposter ta
f290: 62 6c 65 20 72 65 71 75 69 72 65 64 20 74 6f 20  ble required to 
f2a0: 77 72 69 74 65 20 74 6f 20 74 68 65 20 6d 61 69  write to the mai
f2b0: 6e 0a 2a 2a 20 74 61 62 6c 65 20 62 2d 74 72 65  n.** table b-tre
f2c0: 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 62  e of the table b
f2d0: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
f2e0: 20 4e 6f 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74   Non-zero is ret
f2f0: 75 72 6e 65 64 20 69 66 0a 2a 2a 20 61 6e 20 69  urned if.** an i
f300: 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 20 61 72  mposter table ar
f310: 65 20 63 72 65 61 74 65 64 2c 20 6f 72 20 7a 65  e created, or ze
f320: 72 6f 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a  ro otherwise..**
f330: 0a 2a 2a 20 41 6e 20 69 6d 70 6f 73 74 65 72 20  .** An imposter 
f340: 74 61 62 6c 65 20 69 73 20 72 65 71 75 69 72 65  table is require
f350: 64 20 69 6e 20 61 6c 6c 20 63 61 73 65 73 20 65  d in all cases e
f360: 78 63 65 70 74 20 52 42 55 5f 50 4b 5f 56 54 41  xcept RBU_PK_VTA
f370: 42 2e 20 4f 6e 6c 79 0a 2a 2a 20 76 69 72 74 75  B. Only.** virtu
f380: 61 6c 20 74 61 62 6c 65 73 20 61 72 65 20 77 72  al tables are wr
f390: 69 74 74 65 6e 20 74 6f 20 64 69 72 65 63 74 6c  itten to directl
f3a0: 79 2e 20 54 68 65 20 69 6d 70 6f 73 74 65 72 20  y. The imposter 
f3b0: 74 61 62 6c 65 20 68 61 73 20 74 68 65 20 0a 2a  table has the .*
f3c0: 2a 20 73 61 6d 65 20 73 63 68 65 6d 61 20 61 73  * same schema as
f3d0: 20 74 68 65 20 61 63 74 75 61 6c 20 74 61 72 67   the actual targ
f3e0: 65 74 20 74 61 62 6c 65 20 28 6c 65 73 73 20 61  et table (less a
f3f0: 6e 79 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72  ny UNIQUE constr
f400: 61 69 6e 74 73 29 2e 20 0a 2a 2a 20 4d 6f 72 65  aints). .** More
f410: 20 70 72 65 63 69 73 65 6c 79 2c 20 74 68 65 20   precisely, the 
f420: 22 73 61 6d 65 20 73 63 68 65 6d 61 22 20 6d 65  "same schema" me
f430: 61 6e 73 20 74 68 65 20 73 61 6d 65 20 63 6f 6c  ans the same col
f440: 75 6d 6e 73 2c 20 74 79 70 65 73 2c 20 0a 2a 2a  umns, types, .**
f450: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
f460: 6e 63 65 73 2e 20 46 6f 72 20 74 61 62 6c 65 73  nces. For tables
f470: 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 68 61 76   that do not hav
f480: 65 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 50 52  e an external PR
f490: 49 4d 41 52 59 0a 2a 2a 20 4b 45 59 2c 20 69 74  IMARY.** KEY, it
f4a0: 20 61 6c 73 6f 20 6d 65 61 6e 73 20 74 68 65 20   also means the 
f4b0: 73 61 6d 65 20 50 52 49 4d 41 52 59 20 4b 45 59  same PRIMARY KEY
f4c0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 2e 0a 2a 2f   declaration..*/
f4d0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75  .static void rbu
f4e0: 43 72 65 61 74 65 49 6d 70 6f 73 74 65 72 54 61  CreateImposterTa
f4f0: 62 6c 65 28 73 71 6c 69 74 65 33 72 62 75 20 2a  ble(sqlite3rbu *
f500: 70 2c 20 52 62 75 4f 62 6a 49 74 65 72 20 2a 70  p, RbuObjIter *p
f510: 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70 2d 3e  Iter){.  if( p->
f520: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
f530: 20 70 49 74 65 72 2d 3e 65 54 79 70 65 21 3d 52   pIter->eType!=R
f540: 42 55 5f 50 4b 5f 56 54 41 42 20 29 7b 0a 20 20  BU_PK_VTAB ){.  
f550: 20 20 69 6e 74 20 74 6e 75 6d 20 3d 20 70 49 74    int tnum = pIt
f560: 65 72 2d 3e 69 54 6e 75 6d 3b 0a 20 20 20 20 63  er->iTnum;.    c
f570: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6d 6d  onst char *zComm
f580: 61 20 3d 20 22 22 3b 0a 20 20 20 20 63 68 61 72  a = "";.    char
f590: 20 2a 7a 53 71 6c 20 3d 20 30 3b 0a 20 20 20 20   *zSql = 0;.    
f5a0: 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20 73 71  int iCol;.    sq
f5b0: 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
f5c0: 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
f5d0: 52 4c 5f 49 4d 50 4f 53 54 45 52 2c 20 70 2d 3e  RL_IMPOSTER, p->
f5e0: 64 62 4d 61 69 6e 2c 20 22 6d 61 69 6e 22 2c 20  dbMain, "main", 
f5f0: 30 2c 20 31 29 3b 0a 0a 20 20 20 20 66 6f 72 28  0, 1);..    for(
f600: 69 43 6f 6c 3d 30 3b 20 70 2d 3e 72 63 3d 3d 53  iCol=0; p->rc==S
f610: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 43 6f 6c  QLITE_OK && iCol
f620: 3c 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 3b  <pIter->nTblCol;
f630: 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   iCol++){.      
f640: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 6b 20  const char *zPk 
f650: 3d 20 22 22 3b 0a 20 20 20 20 20 20 63 6f 6e 73  = "";.      cons
f660: 74 20 63 68 61 72 20 2a 7a 43 6f 6c 20 3d 20 70  t char *zCol = p
f670: 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69  Iter->azTblCol[i
f680: 43 6f 6c 5d 3b 0a 20 20 20 20 20 20 63 6f 6e 73  Col];.      cons
f690: 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20  t char *zColl = 
f6a0: 30 3b 0a 0a 20 20 20 20 20 20 70 2d 3e 72 63 20  0;..      p->rc 
f6b0: 3d 20 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f  = sqlite3_table_
f6c0: 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28  column_metadata(
f6d0: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 64 62  .          p->db
f6e0: 4d 61 69 6e 2c 20 22 6d 61 69 6e 22 2c 20 70 49  Main, "main", pI
f6f0: 74 65 72 2d 3e 7a 54 62 6c 2c 20 7a 43 6f 6c 2c  ter->zTbl, zCol,
f700: 20 30 2c 20 26 7a 43 6f 6c 6c 2c 20 30 2c 20 30   0, &zColl, 0, 0
f710: 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a 0a 20 20  , 0.      );..  
f720: 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 65      if( pIter->e
f730: 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 49 50 4b  Type==RBU_PK_IPK
f740: 20 26 26 20 70 49 74 65 72 2d 3e 61 62 54 62 6c   && pIter->abTbl
f750: 50 6b 5b 69 43 6f 6c 5d 20 29 7b 0a 20 20 20 20  Pk[iCol] ){.    
f760: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 74 61      /* If the ta
f770: 72 67 65 74 20 74 61 62 6c 65 20 63 6f 6c 75 6d  rget table colum
f780: 6e 20 69 73 20 61 6e 20 22 49 4e 54 45 47 45 52  n is an "INTEGER
f790: 20 50 52 49 4d 41 52 59 20 4b 45 59 22 2c 20 61   PRIMARY KEY", a
f7a0: 64 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 22 50  dd.        ** "P
f7b0: 52 49 4d 41 52 59 20 4b 45 59 22 20 74 6f 20 74  RIMARY KEY" to t
f7c0: 68 65 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c  he imposter tabl
f7d0: 65 20 63 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61  e column declara
f7e0: 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20  tion. */.       
f7f0: 20 7a 50 6b 20 3d 20 22 50 52 49 4d 41 52 59 20   zPk = "PRIMARY 
f800: 4b 45 59 20 22 3b 0a 20 20 20 20 20 20 7d 0a 20  KEY ";.      }. 
f810: 20 20 20 20 20 7a 53 71 6c 20 3d 20 72 62 75 4d       zSql = rbuM
f820: 50 72 69 6e 74 66 28 70 2c 20 22 25 7a 25 73 5c  Printf(p, "%z%s\
f830: 22 25 77 5c 22 20 25 73 20 25 73 43 4f 4c 4c 41  "%w\" %s %sCOLLA
f840: 54 45 20 25 51 25 73 22 2c 20 0a 20 20 20 20 20  TE %Q%s", .     
f850: 20 20 20 20 20 7a 53 71 6c 2c 20 7a 43 6f 6d 6d       zSql, zComm
f860: 61 2c 20 7a 43 6f 6c 2c 20 70 49 74 65 72 2d 3e  a, zCol, pIter->
f870: 61 7a 54 62 6c 54 79 70 65 5b 69 43 6f 6c 5d 2c  azTblType[iCol],
f880: 20 7a 50 6b 2c 20 7a 43 6f 6c 6c 2c 0a 20 20 20   zPk, zColl,.   
f890: 20 20 20 20 20 20 20 28 70 49 74 65 72 2d 3e 61         (pIter->a
f8a0: 62 4e 6f 74 4e 75 6c 6c 5b 69 43 6f 6c 5d 20 3f  bNotNull[iCol] ?
f8b0: 20 22 20 4e 4f 54 20 4e 55 4c 4c 22 20 3a 20 22   " NOT NULL" : "
f8c0: 22 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  ").      );.    
f8d0: 20 20 7a 43 6f 6d 6d 61 20 3d 20 22 2c 20 22 3b    zComma = ", ";
f8e0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
f8f0: 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42  pIter->eType==RB
f900: 55 5f 50 4b 5f 57 49 54 48 4f 55 54 5f 52 4f 57  U_PK_WITHOUT_ROW
f910: 49 44 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  ID ){.      char
f920: 20 2a 7a 50 6b 20 3d 20 72 62 75 57 69 74 68 6f   *zPk = rbuWitho
f930: 75 74 52 6f 77 69 64 50 4b 28 70 2c 20 70 49 74  utRowidPK(p, pIt
f940: 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  er);.      if( z
f950: 50 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 53  Pk ){.        zS
f960: 71 6c 20 3d 20 72 62 75 4d 50 72 69 6e 74 66 28  ql = rbuMPrintf(
f970: 70 2c 20 22 25 7a 2c 20 25 7a 22 2c 20 7a 53 71  p, "%z, %z", zSq
f980: 6c 2c 20 7a 50 6b 29 3b 0a 20 20 20 20 20 20 7d  l, zPk);.      }
f990: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69  .    }..    sqli
f9a0: 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
f9b0: 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
f9c0: 5f 49 4d 50 4f 53 54 45 52 2c 20 70 2d 3e 64 62  _IMPOSTER, p->db
f9d0: 4d 61 69 6e 2c 20 22 6d 61 69 6e 22 2c 20 31 2c  Main, "main", 1,
f9e0: 20 74 6e 75 6d 29 3b 0a 20 20 20 20 72 62 75 4d   tnum);.    rbuM
f9f0: 50 72 69 6e 74 66 45 78 65 63 28 70 2c 20 70 2d  PrintfExec(p, p-
fa00: 3e 64 62 4d 61 69 6e 2c 20 22 43 52 45 41 54 45  >dbMain, "CREATE
fa10: 20 54 41 42 4c 45 20 5c 22 72 62 75 5f 69 6d 70   TABLE \"rbu_imp
fa20: 5f 25 77 5c 22 28 25 7a 29 25 73 22 2c 20 0a 20  _%w\"(%z)%s", . 
fa30: 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 7a 54         pIter->zT
fa40: 62 6c 2c 20 7a 53 71 6c 2c 20 0a 20 20 20 20 20  bl, zSql, .     
fa50: 20 20 20 28 70 49 74 65 72 2d 3e 65 54 79 70 65     (pIter->eType
fa60: 3d 3d 52 42 55 5f 50 4b 5f 57 49 54 48 4f 55 54  ==RBU_PK_WITHOUT
fa70: 5f 52 4f 57 49 44 20 3f 20 22 20 57 49 54 48 4f  _ROWID ? " WITHO
fa80: 55 54 20 52 4f 57 49 44 22 20 3a 20 22 22 29 0a  UT ROWID" : "").
fa90: 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74      );.    sqlit
faa0: 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
fab0: 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
fac0: 49 4d 50 4f 53 54 45 52 2c 20 70 2d 3e 64 62 4d  IMPOSTER, p->dbM
fad0: 61 69 6e 2c 20 22 6d 61 69 6e 22 2c 20 30 2c 20  ain, "main", 0, 
fae0: 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  0);.  }.}../*.**
faf0: 20 50 72 65 70 61 72 65 20 61 20 73 74 61 74 65   Prepare a state
fb00: 6d 65 6e 74 20 75 73 65 64 20 74 6f 20 69 6e 73  ment used to ins
fb10: 65 72 74 20 72 6f 77 73 20 69 6e 74 6f 20 74 68  ert rows into th
fb20: 65 20 22 72 62 75 5f 74 6d 70 5f 78 78 78 22 20  e "rbu_tmp_xxx" 
fb30: 74 61 62 6c 65 2e 0a 2a 2a 20 53 70 65 63 69 66  table..** Specif
fb40: 69 63 61 6c 6c 79 20 61 20 73 74 61 74 65 6d 65  ically a stateme
fb50: 6e 74 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  nt of the form:.
fb60: 2a 2a 0a 2a 2a 20 20 20 20 20 49 4e 53 45 52 54  **.**     INSERT
fb70: 20 49 4e 54 4f 20 72 62 75 5f 74 6d 70 5f 78 78   INTO rbu_tmp_xx
fb80: 78 20 56 41 4c 55 45 53 28 3f 2c 20 3f 2c 20 3f  x VALUES(?, ?, ?
fb90: 20 2e 2e 2e 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65   ...);.**.** The
fba0: 20 6e 75 6d 62 65 72 20 6f 66 20 62 6f 75 6e 64   number of bound
fbb0: 20 76 61 72 69 61 62 6c 65 73 20 69 73 20 65 71   variables is eq
fbc0: 75 61 6c 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  ual to the numbe
fbd0: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 0a  r of columns in.
fbe0: 2a 2a 20 74 68 65 20 74 61 72 67 65 74 20 74 61  ** the target ta
fbf0: 62 6c 65 2c 20 70 6c 75 73 20 6f 6e 65 20 28 66  ble, plus one (f
fc00: 6f 72 20 74 68 65 20 72 62 75 5f 63 6f 6e 74 72  or the rbu_contr
fc10: 6f 6c 20 63 6f 6c 75 6d 6e 29 2c 20 70 6c 75 73  ol column), plus
fc20: 20 6f 6e 65 20 6d 6f 72 65 20 0a 2a 2a 20 28 66   one more .** (f
fc30: 6f 72 20 74 68 65 20 72 62 75 5f 72 6f 77 69 64  or the rbu_rowid
fc40: 20 63 6f 6c 75 6d 6e 29 20 69 66 20 74 68 65 20   column) if the 
fc50: 74 61 72 67 65 74 20 74 61 62 6c 65 20 69 73 20  target table is 
fc60: 61 6e 20 69 6d 70 6c 69 63 69 74 20 49 50 4b 20  an implicit IPK 
fc70: 6f 72 20 0a 2a 2a 20 76 69 72 74 75 61 6c 20 74  or .** virtual t
fc80: 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
fc90: 76 6f 69 64 20 72 62 75 4f 62 6a 49 74 65 72 50  void rbuObjIterP
fca0: 72 65 70 61 72 65 54 6d 70 49 6e 73 65 72 74 28  repareTmpInsert(
fcb0: 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20 2a 70  .  sqlite3rbu *p
fcc0: 2c 20 0a 20 20 52 62 75 4f 62 6a 49 74 65 72 20  , .  RbuObjIter 
fcd0: 2a 70 49 74 65 72 2c 0a 20 20 63 6f 6e 73 74 20  *pIter,.  const 
fce0: 63 68 61 72 20 2a 7a 43 6f 6c 6c 69 73 74 2c 0a  char *zCollist,.
fcf0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52    const char *zR
fd00: 62 75 52 6f 77 69 64 0a 29 7b 0a 20 20 69 6e 74  buRowid.){.  int
fd10: 20 62 52 62 75 52 6f 77 69 64 20 3d 20 28 70 49   bRbuRowid = (pI
fd20: 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f  ter->eType==RBU_
fd30: 50 4b 5f 45 58 54 45 52 4e 41 4c 20 7c 7c 20 70  PK_EXTERNAL || p
fd40: 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55  Iter->eType==RBU
fd50: 5f 50 4b 5f 4e 4f 4e 45 29 3b 0a 20 20 63 68 61  _PK_NONE);.  cha
fd60: 72 20 2a 7a 42 69 6e 64 20 3d 20 72 62 75 4f 62  r *zBind = rbuOb
fd70: 6a 49 74 65 72 47 65 74 42 69 6e 64 6c 69 73 74  jIterGetBindlist
fd80: 28 70 2c 20 70 49 74 65 72 2d 3e 6e 54 62 6c 43  (p, pIter->nTblC
fd90: 6f 6c 20 2b 20 31 20 2b 20 62 52 62 75 52 6f 77  ol + 1 + bRbuRow
fda0: 69 64 29 3b 0a 20 20 69 66 28 20 7a 42 69 6e 64  id);.  if( zBind
fdb0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
fdc0: 70 49 74 65 72 2d 3e 70 54 6d 70 49 6e 73 65 72  pIter->pTmpInser
fdd0: 74 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 72  t==0 );.    p->r
fde0: 63 20 3d 20 70 72 65 70 61 72 65 46 72 65 65 41  c = prepareFreeA
fdf0: 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 0a  ndCollectError(.
fe00: 20 20 20 20 20 20 20 20 70 2d 3e 64 62 52 62 75          p->dbRbu
fe10: 2c 20 26 70 49 74 65 72 2d 3e 70 54 6d 70 49 6e  , &pIter->pTmpIn
fe20: 73 65 72 74 2c 20 26 70 2d 3e 7a 45 72 72 6d 73  sert, &p->zErrms
fe30: 67 2c 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  g, sqlite3_mprin
fe40: 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 22 49  tf(.          "I
fe50: 4e 53 45 52 54 20 49 4e 54 4f 20 25 73 2e 27 72  NSERT INTO %s.'r
fe60: 62 75 5f 74 6d 70 5f 25 71 27 28 72 62 75 5f 63  bu_tmp_%q'(rbu_c
fe70: 6f 6e 74 72 6f 6c 2c 25 73 25 73 29 20 56 41 4c  ontrol,%s%s) VAL
fe80: 55 45 53 28 25 7a 29 22 2c 20 0a 20 20 20 20 20  UES(%z)", .     
fe90: 20 20 20 20 20 70 2d 3e 7a 53 74 61 74 65 44 62       p->zStateDb
fea0: 2c 20 70 49 74 65 72 2d 3e 7a 44 61 74 61 54 62  , pIter->zDataTb
feb0: 6c 2c 20 7a 43 6f 6c 6c 69 73 74 2c 20 7a 52 62  l, zCollist, zRb
fec0: 75 52 6f 77 69 64 2c 20 7a 42 69 6e 64 0a 20 20  uRowid, zBind.  
fed0: 20 20 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61    ));.  }.}..sta
fee0: 74 69 63 20 76 6f 69 64 20 72 62 75 54 6d 70 49  tic void rbuTmpI
fef0: 6e 73 65 72 74 46 75 6e 63 28 0a 20 20 73 71 6c  nsertFunc(.  sql
ff00: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43  ite3_context *pC
ff10: 74 78 2c 20 0a 20 20 69 6e 74 20 6e 56 61 6c 2c  tx, .  int nVal,
ff20: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
ff30: 20 2a 2a 61 70 56 61 6c 0a 29 7b 0a 20 20 73 71   **apVal.){.  sq
ff40: 6c 69 74 65 33 72 62 75 20 2a 70 20 3d 20 73 71  lite3rbu *p = sq
ff50: 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28  lite3_user_data(
ff60: 70 43 74 78 29 3b 0a 20 20 69 6e 74 20 72 63 20  pCtx);.  int rc 
ff70: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
ff80: 6e 74 20 69 3b 0a 0a 20 20 61 73 73 65 72 74 28  nt i;..  assert(
ff90: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
ffa0: 6e 74 28 61 70 56 61 6c 5b 30 5d 29 21 3d 30 0a  nt(apVal[0])!=0.
ffb0: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6f 62 6a 69        || p->obji
ffc0: 74 65 72 2e 65 54 79 70 65 3d 3d 52 42 55 5f 50  ter.eType==RBU_P
ffd0: 4b 5f 45 58 54 45 52 4e 41 4c 20 0a 20 20 20 20  K_EXTERNAL .    
ffe0: 20 20 7c 7c 20 70 2d 3e 6f 62 6a 69 74 65 72 2e    || p->objiter.
fff0: 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 4e 4f  eType==RBU_PK_NO
10000 4e 45 20 0a 20 20 29 3b 0a 20 20 69 66 28 20 73  NE .  );.  if( s
10010 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
10020 28 61 70 56 61 6c 5b 30 5d 29 21 3d 30 20 29 7b  (apVal[0])!=0 ){
10030 0a 20 20 20 20 70 2d 3e 6e 50 68 61 73 65 4f 6e  .    p->nPhaseOn
10040 65 53 74 65 70 20 2b 3d 20 70 2d 3e 6f 62 6a 69  eStep += p->obji
10050 74 65 72 2e 6e 49 6e 64 65 78 3b 0a 20 20 7d 0a  ter.nIndex;.  }.
10060 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d  .  for(i=0; rc==
10070 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 6e  SQLITE_OK && i<n
10080 56 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72  Val; i++){.    r
10090 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  c = sqlite3_bind
100a0 5f 76 61 6c 75 65 28 70 2d 3e 6f 62 6a 69 74 65  _value(p->objite
100b0 72 2e 70 54 6d 70 49 6e 73 65 72 74 2c 20 69 2b  r.pTmpInsert, i+
100c0 31 2c 20 61 70 56 61 6c 5b 69 5d 29 3b 0a 20 20  1, apVal[i]);.  
100d0 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
100e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
100f0 69 74 65 33 5f 73 74 65 70 28 70 2d 3e 6f 62 6a  ite3_step(p->obj
10100 69 74 65 72 2e 70 54 6d 70 49 6e 73 65 72 74 29  iter.pTmpInsert)
10110 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
10120 65 33 5f 72 65 73 65 74 28 70 2d 3e 6f 62 6a 69  e3_reset(p->obji
10130 74 65 72 2e 70 54 6d 70 49 6e 73 65 72 74 29 3b  ter.pTmpInsert);
10140 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d  .  }..  if( rc!=
10150 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
10160 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
10170 65 72 72 6f 72 5f 63 6f 64 65 28 70 43 74 78 2c  error_code(pCtx,
10180 20 72 63 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   rc);.  }.}../*.
10190 2a 2a 20 45 6e 73 75 72 65 20 74 68 61 74 20 74  ** Ensure that t
101a0 68 65 20 53 51 4c 69 74 65 20 73 74 61 74 65 6d  he SQLite statem
101b0 65 6e 74 20 68 61 6e 64 6c 65 73 20 72 65 71 75  ent handles requ
101c0 69 72 65 64 20 74 6f 20 75 70 64 61 74 65 20 74  ired to update t
101d0 68 65 20 0a 2a 2a 20 74 61 72 67 65 74 20 64 61  he .** target da
101e0 74 61 62 61 73 65 20 6f 62 6a 65 63 74 20 63 75  tabase object cu
101f0 72 72 65 6e 74 6c 79 20 69 6e 64 69 63 61 74 65  rrently indicate
10200 64 20 62 79 20 74 68 65 20 69 74 65 72 61 74 6f  d by the iterato
10210 72 20 70 61 73 73 65 64 20 0a 2a 2a 20 61 73 20  r passed .** as 
10220 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
10230 65 6e 74 20 61 72 65 20 61 76 61 69 6c 61 62 6c  ent are availabl
10240 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
10250 20 72 62 75 4f 62 6a 49 74 65 72 50 72 65 70 61   rbuObjIterPrepa
10260 72 65 41 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33  reAll(.  sqlite3
10270 72 62 75 20 2a 70 2c 20 0a 20 20 52 62 75 4f 62  rbu *p, .  RbuOb
10280 6a 49 74 65 72 20 2a 70 49 74 65 72 2c 0a 20 20  jIter *pIter,.  
10290 69 6e 74 20 6e 4f 66 66 73 65 74 20 20 20 20 20  int nOffset     
102a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
102b0 2f 2a 20 41 64 64 20 22 4c 49 4d 49 54 20 2d 31  /* Add "LIMIT -1
102c0 20 4f 46 46 53 45 54 20 24 6e 4f 66 66 73 65 74   OFFSET $nOffset
102d0 22 20 74 6f 20 53 45 4c 45 43 54 20 2a 2f 0a 29  " to SELECT */.)
102e0 7b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65  {.  assert( pIte
102f0 72 2d 3e 62 43 6c 65 61 6e 75 70 3d 3d 30 20 29  r->bCleanup==0 )
10300 3b 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70  ;.  if( pIter->p
10310 53 65 6c 65 63 74 3d 3d 30 20 26 26 20 72 62 75  Select==0 && rbu
10320 4f 62 6a 49 74 65 72 43 61 63 68 65 54 61 62 6c  ObjIterCacheTabl
10330 65 49 6e 66 6f 28 70 2c 20 70 49 74 65 72 29 3d  eInfo(p, pIter)=
10340 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
10350 20 20 63 6f 6e 73 74 20 69 6e 74 20 74 6e 75 6d    const int tnum
10360 20 3d 20 70 49 74 65 72 2d 3e 69 54 6e 75 6d 3b   = pIter->iTnum;
10370 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  .    char *zColl
10380 69 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ist = 0;        
10390 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 69 6e     /* List of in
103a0 64 65 78 65 64 20 63 6f 6c 75 6d 6e 73 20 2a 2f  dexed columns */
103b0 0a 20 20 20 20 63 68 61 72 20 2a 2a 70 7a 20 3d  .    char **pz =
103c0 20 26 70 2d 3e 7a 45 72 72 6d 73 67 3b 0a 20 20   &p->zErrmsg;.  
103d0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49    const char *zI
103e0 64 78 20 3d 20 70 49 74 65 72 2d 3e 7a 49 64 78  dx = pIter->zIdx
103f0 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4c 69 6d  ;.    char *zLim
10400 69 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28  it = 0;..    if(
10410 20 6e 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20   nOffset ){.    
10420 20 20 7a 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74    zLimit = sqlit
10430 65 33 5f 6d 70 72 69 6e 74 66 28 22 20 4c 49 4d  e3_mprintf(" LIM
10440 49 54 20 2d 31 20 4f 46 46 53 45 54 20 25 64 22  IT -1 OFFSET %d"
10450 2c 20 6e 4f 66 66 73 65 74 29 3b 0a 20 20 20 20  , nOffset);.    
10460 20 20 69 66 28 20 21 7a 4c 69 6d 69 74 20 29 20    if( !zLimit ) 
10470 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  p->rc = SQLITE_N
10480 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  OMEM;.    }..   
10490 20 69 66 28 20 7a 49 64 78 20 29 7b 0a 20 20 20   if( zIdx ){.   
104a0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
104b0 54 62 6c 20 3d 20 70 49 74 65 72 2d 3e 7a 54 62  Tbl = pIter->zTb
104c0 6c 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  l;.      char *z
104d0 49 6d 70 6f 73 74 65 72 43 6f 6c 73 20 3d 20 30  ImposterCols = 0
104e0 3b 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20  ;    /* Columns 
104f0 66 6f 72 20 69 6d 70 6f 73 74 65 72 20 74 61 62  for imposter tab
10500 6c 65 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72  le */.      char
10510 20 2a 7a 49 6d 70 6f 73 74 65 72 50 4b 20 3d 20   *zImposterPK = 
10520 30 3b 20 20 20 20 20 20 2f 2a 20 50 72 69 6d 61  0;      /* Prima
10530 72 79 20 6b 65 79 20 64 65 63 6c 61 72 61 74 69  ry key declarati
10540 6f 6e 20 66 6f 72 20 69 6d 70 6f 73 74 65 72 20  on for imposter 
10550 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  */.      char *z
10560 57 68 65 72 65 20 3d 20 30 3b 20 20 20 20 20 20  Where = 0;      
10570 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20 63 6c       /* WHERE cl
10580 61 75 73 65 20 6f 6e 20 50 4b 20 63 6f 6c 75 6d  ause on PK colum
10590 6e 73 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72  ns */.      char
105a0 20 2a 7a 42 69 6e 64 20 3d 20 30 3b 0a 20 20 20   *zBind = 0;.   
105b0 20 20 20 69 6e 74 20 6e 42 69 6e 64 20 3d 20 30     int nBind = 0
105c0 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ;..      assert(
105d0 20 70 49 74 65 72 2d 3e 65 54 79 70 65 21 3d 52   pIter->eType!=R
105e0 42 55 5f 50 4b 5f 56 54 41 42 20 29 3b 0a 20 20  BU_PK_VTAB );.  
105f0 20 20 20 20 7a 43 6f 6c 6c 69 73 74 20 3d 20 72      zCollist = r
10600 62 75 4f 62 6a 49 74 65 72 47 65 74 49 6e 64 65  buObjIterGetInde
10610 78 43 6f 6c 73 28 0a 20 20 20 20 20 20 20 20 20  xCols(.         
10620 20 70 2c 20 70 49 74 65 72 2c 20 26 7a 49 6d 70   p, pIter, &zImp
10630 6f 73 74 65 72 43 6f 6c 73 2c 20 26 7a 49 6d 70  osterCols, &zImp
10640 6f 73 74 65 72 50 4b 2c 20 26 7a 57 68 65 72 65  osterPK, &zWhere
10650 2c 20 26 6e 42 69 6e 64 0a 20 20 20 20 20 20 29  , &nBind.      )
10660 3b 0a 20 20 20 20 20 20 7a 42 69 6e 64 20 3d 20  ;.      zBind = 
10670 72 62 75 4f 62 6a 49 74 65 72 47 65 74 42 69 6e  rbuObjIterGetBin
10680 64 6c 69 73 74 28 70 2c 20 6e 42 69 6e 64 29 3b  dlist(p, nBind);
10690 0a 0a 20 20 20 20 20 20 2f 2a 20 43 72 65 61 74  ..      /* Creat
106a0 65 20 74 68 65 20 69 6d 70 6f 73 74 65 72 20 74  e the imposter t
106b0 61 62 6c 65 20 75 73 65 64 20 74 6f 20 77 72 69  able used to wri
106c0 74 65 20 74 6f 20 74 68 69 73 20 69 6e 64 65 78  te to this index
106d0 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
106e0 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
106f0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
10700 49 4d 50 4f 53 54 45 52 2c 20 70 2d 3e 64 62 4d  IMPOSTER, p->dbM
10710 61 69 6e 2c 20 22 6d 61 69 6e 22 2c 20 30 2c 20  ain, "main", 0, 
10720 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
10730 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
10740 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49  QLITE_TESTCTRL_I
10750 4d 50 4f 53 54 45 52 2c 20 70 2d 3e 64 62 4d 61  MPOSTER, p->dbMa
10760 69 6e 2c 20 22 6d 61 69 6e 22 2c 20 31 2c 74 6e  in, "main", 1,tn
10770 75 6d 29 3b 0a 20 20 20 20 20 20 72 62 75 4d 50  um);.      rbuMP
10780 72 69 6e 74 66 45 78 65 63 28 70 2c 20 70 2d 3e  rintfExec(p, p->
10790 64 62 4d 61 69 6e 2c 0a 20 20 20 20 20 20 20 20  dbMain,.        
107a0 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20    "CREATE TABLE 
107b0 5c 22 72 62 75 5f 69 6d 70 5f 25 77 5c 22 28 20  \"rbu_imp_%w\"( 
107c0 25 73 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28  %s, PRIMARY KEY(
107d0 20 25 73 20 29 20 29 20 57 49 54 48 4f 55 54 20   %s ) ) WITHOUT 
107e0 52 4f 57 49 44 22 2c 0a 20 20 20 20 20 20 20 20  ROWID",.        
107f0 20 20 7a 54 62 6c 2c 20 7a 49 6d 70 6f 73 74 65    zTbl, zImposte
10800 72 43 6f 6c 73 2c 20 7a 49 6d 70 6f 73 74 65 72  rCols, zImposter
10810 50 4b 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  PK.      );.    
10820 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
10830 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
10840 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52 2c  STCTRL_IMPOSTER,
10850 20 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 6d 61 69   p->dbMain, "mai
10860 6e 22 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20  n", 0, 0);..    
10870 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20    /* Create the 
10880 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 69 6e 73  statement to ins
10890 65 72 74 20 69 6e 64 65 78 20 65 6e 74 72 69 65  ert index entrie
108a0 73 20 2a 2f 0a 20 20 20 20 20 20 70 49 74 65 72  s */.      pIter
108b0 2d 3e 6e 43 6f 6c 20 3d 20 6e 42 69 6e 64 3b 0a  ->nCol = nBind;.
108c0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
108d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
108e0 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 72        p->rc = pr
108f0 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c  epareFreeAndColl
10900 65 63 74 45 72 72 6f 72 28 0a 20 20 20 20 20 20  ectError(.      
10910 20 20 20 20 20 20 70 2d 3e 64 62 4d 61 69 6e 2c        p->dbMain,
10920 20 26 70 49 74 65 72 2d 3e 70 49 6e 73 65 72 74   &pIter->pInsert
10930 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 0a 20  , &p->zErrmsg,. 
10940 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
10950 5f 6d 70 72 69 6e 74 66 28 22 49 4e 53 45 52 54  _mprintf("INSERT
10960 20 49 4e 54 4f 20 5c 22 72 62 75 5f 69 6d 70 5f   INTO \"rbu_imp_
10970 25 77 5c 22 20 56 41 4c 55 45 53 28 25 73 29 22  %w\" VALUES(%s)"
10980 2c 20 7a 54 62 6c 2c 20 7a 42 69 6e 64 29 0a 20  , zTbl, zBind). 
10990 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
109a0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 41 6e 64 20  }..      /* And 
109b0 74 6f 20 64 65 6c 65 74 65 20 69 6e 64 65 78 20  to delete index 
109c0 65 6e 74 72 69 65 73 20 2a 2f 0a 20 20 20 20 20  entries */.     
109d0 20 69 66 28 20 72 62 75 49 73 56 61 63 75 75 6d   if( rbuIsVacuum
109e0 28 70 29 3d 3d 30 20 26 26 20 70 2d 3e 72 63 3d  (p)==0 && p->rc=
109f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
10a00 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 72        p->rc = pr
10a10 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c  epareFreeAndColl
10a20 65 63 74 45 72 72 6f 72 28 0a 20 20 20 20 20 20  ectError(.      
10a30 20 20 20 20 20 20 70 2d 3e 64 62 4d 61 69 6e 2c        p->dbMain,
10a40 20 26 70 49 74 65 72 2d 3e 70 44 65 6c 65 74 65   &pIter->pDelete
10a50 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 0a 20  , &p->zErrmsg,. 
10a60 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
10a70 5f 6d 70 72 69 6e 74 66 28 22 44 45 4c 45 54 45  _mprintf("DELETE
10a80 20 46 52 4f 4d 20 5c 22 72 62 75 5f 69 6d 70 5f   FROM \"rbu_imp_
10a90 25 77 5c 22 20 57 48 45 52 45 20 25 73 22 2c 20  %w\" WHERE %s", 
10aa0 7a 54 62 6c 2c 20 7a 57 68 65 72 65 29 0a 20 20  zTbl, zWhere).  
10ab0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d        );.      }
10ac0 0a 0a 20 20 20 20 20 20 2f 2a 20 43 72 65 61 74  ..      /* Creat
10ad0 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  e the SELECT sta
10ae0 74 65 6d 65 6e 74 20 74 6f 20 72 65 61 64 20 6b  tement to read k
10af0 65 79 73 20 69 6e 20 73 6f 72 74 65 64 20 6f 72  eys in sorted or
10b00 64 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  der */.      if(
10b10 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
10b20 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  K ){.        cha
10b30 72 20 2a 7a 53 71 6c 3b 0a 20 20 20 20 20 20 20  r *zSql;.       
10b40 20 69 66 28 20 72 62 75 49 73 56 61 63 75 75 6d   if( rbuIsVacuum
10b50 28 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  (p) ){.         
10b60 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
10b70 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20  mprintf(.       
10b80 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 25         "SELECT %
10b90 73 2c 20 30 20 41 53 20 72 62 75 5f 63 6f 6e 74  s, 0 AS rbu_cont
10ba0 72 6f 6c 20 46 52 4f 4d 20 27 25 71 27 20 4f 52  rol FROM '%q' OR
10bb0 44 45 52 20 42 59 20 25 73 25 73 22 2c 0a 20 20  DER BY %s%s",.  
10bc0 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c              zCol
10bd0 6c 69 73 74 2c 20 0a 20 20 20 20 20 20 20 20 20  list, .         
10be0 20 20 20 20 20 70 49 74 65 72 2d 3e 7a 44 61 74       pIter->zDat
10bf0 61 54 62 6c 2c 0a 20 20 20 20 20 20 20 20 20 20  aTbl,.          
10c00 20 20 20 20 7a 43 6f 6c 6c 69 73 74 2c 20 7a 4c      zCollist, zL
10c10 69 6d 69 74 0a 20 20 20 20 20 20 20 20 20 20 29  imit.          )
10c20 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a  ;.        }else.
10c30 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74  .        if( pIt
10c40 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50  er->eType==RBU_P
10c50 4b 5f 45 58 54 45 52 4e 41 4c 20 7c 7c 20 70 49  K_EXTERNAL || pI
10c60 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f  ter->eType==RBU_
10c70 50 4b 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20  PK_NONE ){.     
10c80 20 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69       zSql = sqli
10c90 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20  te3_mprintf(.   
10ca0 20 20 20 20 20 20 20 20 20 20 20 22 53 45 4c 45             "SELE
10cb0 43 54 20 25 73 2c 20 72 62 75 5f 63 6f 6e 74 72  CT %s, rbu_contr
10cc0 6f 6c 20 46 52 4f 4d 20 25 73 2e 27 72 62 75 5f  ol FROM %s.'rbu_
10cd0 74 6d 70 5f 25 71 27 20 4f 52 44 45 52 20 42 59  tmp_%q' ORDER BY
10ce0 20 25 73 25 73 22 2c 0a 20 20 20 20 20 20 20 20   %s%s",.        
10cf0 20 20 20 20 20 20 7a 43 6f 6c 6c 69 73 74 2c 20        zCollist, 
10d00 70 2d 3e 7a 53 74 61 74 65 44 62 2c 20 70 49 74  p->zStateDb, pIt
10d10 65 72 2d 3e 7a 44 61 74 61 54 62 6c 2c 0a 20 20  er->zDataTbl,.  
10d20 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c              zCol
10d30 6c 69 73 74 2c 20 7a 4c 69 6d 69 74 0a 20 20 20  list, zLimit.   
10d40 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
10d50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
10d60 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65     zSql = sqlite
10d70 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20  3_mprintf(.     
10d80 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54           "SELECT
10d90 20 25 73 2c 20 72 62 75 5f 63 6f 6e 74 72 6f 6c   %s, rbu_control
10da0 20 46 52 4f 4d 20 25 73 2e 27 72 62 75 5f 74 6d   FROM %s.'rbu_tm
10db0 70 5f 25 71 27 20 22 0a 20 20 20 20 20 20 20 20  p_%q' ".        
10dc0 20 20 20 20 20 20 22 55 4e 49 4f 4e 20 41 4c 4c        "UNION ALL
10dd0 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ".             
10de0 20 22 53 45 4c 45 43 54 20 25 73 2c 20 72 62 75   "SELECT %s, rbu
10df0 5f 63 6f 6e 74 72 6f 6c 20 46 52 4f 4d 20 27 25  _control FROM '%
10e00 71 27 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  q' ".           
10e10 20 20 20 22 57 48 45 52 45 20 74 79 70 65 6f 66     "WHERE typeof
10e20 28 72 62 75 5f 63 6f 6e 74 72 6f 6c 29 3d 27 69  (rbu_control)='i
10e30 6e 74 65 67 65 72 27 20 41 4e 44 20 72 62 75 5f  nteger' AND rbu_
10e40 63 6f 6e 74 72 6f 6c 21 3d 31 20 22 0a 20 20 20  control!=1 ".   
10e50 20 20 20 20 20 20 20 20 20 20 20 22 4f 52 44 45             "ORDE
10e60 52 20 42 59 20 25 73 25 73 22 2c 0a 20 20 20 20  R BY %s%s",.    
10e70 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 6c 69            zColli
10e80 73 74 2c 20 70 2d 3e 7a 53 74 61 74 65 44 62 2c  st, p->zStateDb,
10e90 20 70 49 74 65 72 2d 3e 7a 44 61 74 61 54 62 6c   pIter->zDataTbl
10ea0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
10eb0 20 7a 43 6f 6c 6c 69 73 74 2c 20 70 49 74 65 72   zCollist, pIter
10ec0 2d 3e 7a 44 61 74 61 54 62 6c 2c 20 0a 20 20 20  ->zDataTbl, .   
10ed0 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 6c             zColl
10ee0 69 73 74 2c 20 7a 4c 69 6d 69 74 0a 20 20 20 20  ist, zLimit.    
10ef0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
10f00 20 7d 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63   }.        p->rc
10f10 20 3d 20 70 72 65 70 61 72 65 46 72 65 65 41 6e   = prepareFreeAn
10f20 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d  dCollectError(p-
10f30 3e 64 62 52 62 75 2c 20 26 70 49 74 65 72 2d 3e  >dbRbu, &pIter->
10f40 70 53 65 6c 65 63 74 2c 20 70 7a 2c 20 7a 53 71  pSelect, pz, zSq
10f50 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  l);.      }..   
10f60 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
10f70 7a 49 6d 70 6f 73 74 65 72 43 6f 6c 73 29 3b 0a  zImposterCols);.
10f80 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
10f90 65 65 28 7a 49 6d 70 6f 73 74 65 72 50 4b 29 3b  ee(zImposterPK);
10fa0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
10fb0 72 65 65 28 7a 57 68 65 72 65 29 3b 0a 20 20 20  ree(zWhere);.   
10fc0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
10fd0 7a 42 69 6e 64 29 3b 0a 20 20 20 20 7d 65 6c 73  zBind);.    }els
10fe0 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 52 62  e{.      int bRb
10ff0 75 52 6f 77 69 64 20 3d 20 28 70 49 74 65 72 2d  uRowid = (pIter-
11000 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 56  >eType==RBU_PK_V
11010 54 41 42 29 0a 20 20 20 20 20 20 20 20 20 20 20  TAB).           
11020 20 20 20 20 20 20 20 20 20 7c 7c 28 70 49 74 65           ||(pIte
11030 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b  r->eType==RBU_PK
11040 5f 4e 4f 4e 45 29 0a 20 20 20 20 20 20 20 20 20  _NONE).         
11050 20 20 20 20 20 20 20 20 20 20 20 7c 7c 28 70 49             ||(pI
11060 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f  ter->eType==RBU_
11070 50 4b 5f 45 58 54 45 52 4e 41 4c 20 26 26 20 72  PK_EXTERNAL && r
11080 62 75 49 73 56 61 63 75 75 6d 28 70 29 29 3b 0a  buIsVacuum(p));.
11090 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
110a0 20 2a 7a 54 62 6c 20 3d 20 70 49 74 65 72 2d 3e   *zTbl = pIter->
110b0 7a 54 62 6c 3b 20 20 20 20 20 20 20 2f 2a 20 54  zTbl;       /* T
110c0 61 62 6c 65 20 74 68 69 73 20 73 74 65 70 20 61  able this step a
110d0 70 70 6c 69 65 73 20 74 6f 20 2a 2f 0a 20 20 20  pplies to */.   
110e0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
110f0 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20  Write;          
11100 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6d 70 6f           /* Impo
11110 73 74 65 72 20 74 61 62 6c 65 20 6e 61 6d 65 20  ster table name 
11120 2a 2f 0a 0a 20 20 20 20 20 20 63 68 61 72 20 2a  */..      char *
11130 7a 42 69 6e 64 69 6e 67 73 20 3d 20 72 62 75 4f  zBindings = rbuO
11140 62 6a 49 74 65 72 47 65 74 42 69 6e 64 6c 69 73  bjIterGetBindlis
11150 74 28 70 2c 20 70 49 74 65 72 2d 3e 6e 54 62 6c  t(p, pIter->nTbl
11160 43 6f 6c 20 2b 20 62 52 62 75 52 6f 77 69 64 29  Col + bRbuRowid)
11170 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 57  ;.      char *zW
11180 68 65 72 65 20 3d 20 72 62 75 4f 62 6a 49 74 65  here = rbuObjIte
11190 72 47 65 74 57 68 65 72 65 28 70 2c 20 70 49 74  rGetWhere(p, pIt
111a0 65 72 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20  er);.      char 
111b0 2a 7a 4f 6c 64 6c 69 73 74 20 3d 20 72 62 75 4f  *zOldlist = rbuO
111c0 62 6a 49 74 65 72 47 65 74 4f 6c 64 6c 69 73 74  bjIterGetOldlist
111d0 28 70 2c 20 70 49 74 65 72 2c 20 22 6f 6c 64 22  (p, pIter, "old"
111e0 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  );.      char *z
111f0 4e 65 77 6c 69 73 74 20 3d 20 72 62 75 4f 62 6a  Newlist = rbuObj
11200 49 74 65 72 47 65 74 4f 6c 64 6c 69 73 74 28 70  IterGetOldlist(p
11210 2c 20 70 49 74 65 72 2c 20 22 6e 65 77 22 29 3b  , pIter, "new");
11220 0a 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 69 73 74  ..      zCollist
11230 20 3d 20 72 62 75 4f 62 6a 49 74 65 72 47 65 74   = rbuObjIterGet
11240 43 6f 6c 6c 69 73 74 28 70 2c 20 70 49 74 65 72  Collist(p, pIter
11250 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  );.      pIter->
11260 6e 43 6f 6c 20 3d 20 70 49 74 65 72 2d 3e 6e 54  nCol = pIter->nT
11270 62 6c 43 6f 6c 3b 0a 0a 20 20 20 20 20 20 2f 2a  blCol;..      /*
11280 20 43 72 65 61 74 65 20 74 68 65 20 69 6d 70 6f   Create the impo
11290 73 74 65 72 20 74 61 62 6c 65 20 6f 72 20 74 61  ster table or ta
112a0 62 6c 65 73 20 28 69 66 20 72 65 71 75 69 72 65  bles (if require
112b0 64 29 2e 20 2a 2f 0a 20 20 20 20 20 20 72 62 75  d). */.      rbu
112c0 43 72 65 61 74 65 49 6d 70 6f 73 74 65 72 54 61  CreateImposterTa
112d0 62 6c 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  ble(p, pIter);. 
112e0 20 20 20 20 20 72 62 75 43 72 65 61 74 65 49 6d       rbuCreateIm
112f0 70 6f 73 74 65 72 54 61 62 6c 65 32 28 70 2c 20  posterTable2(p, 
11300 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 7a 57  pIter);.      zW
11310 72 69 74 65 20 3d 20 28 70 49 74 65 72 2d 3e 65  rite = (pIter->e
11320 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 56 54 41  Type==RBU_PK_VTA
11330 42 20 3f 20 22 22 20 3a 20 22 72 62 75 5f 69 6d  B ? "" : "rbu_im
11340 70 5f 22 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  p_");..      /* 
11350 43 72 65 61 74 65 20 74 68 65 20 49 4e 53 45 52  Create the INSER
11360 54 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 77  T statement to w
11370 72 69 74 65 20 74 6f 20 74 68 65 20 74 61 72 67  rite to the targ
11380 65 74 20 50 4b 20 62 2d 74 72 65 65 20 2a 2f 0a  et PK b-tree */.
11390 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
113a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
113b0 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 72        p->rc = pr
113c0 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c  epareFreeAndColl
113d0 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 4d 61  ectError(p->dbMa
113e0 69 6e 2c 20 26 70 49 74 65 72 2d 3e 70 49 6e 73  in, &pIter->pIns
113f0 65 72 74 2c 20 70 7a 2c 0a 20 20 20 20 20 20 20  ert, pz,.       
11400 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72       sqlite3_mpr
11410 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20  intf(.          
11420 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f      "INSERT INTO
11430 20 5c 22 25 73 25 77 5c 22 28 25 73 25 73 29 20   \"%s%w\"(%s%s) 
11440 56 41 4c 55 45 53 28 25 73 29 22 2c 20 0a 20 20  VALUES(%s)", .  
11450 20 20 20 20 20 20 20 20 20 20 20 20 7a 57 72 69              zWri
11460 74 65 2c 20 7a 54 62 6c 2c 20 7a 43 6f 6c 6c 69  te, zTbl, zColli
11470 73 74 2c 20 28 62 52 62 75 52 6f 77 69 64 20 3f  st, (bRbuRowid ?
11480 20 22 2c 20 5f 72 6f 77 69 64 5f 22 20 3a 20 22   ", _rowid_" : "
11490 22 29 2c 20 7a 42 69 6e 64 69 6e 67 73 0a 20 20  "), zBindings.  
114a0 20 20 20 20 20 20 20 20 20 20 29 0a 20 20 20 20            ).    
114b0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a      );.      }..
114c0 20 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20        /* Create 
114d0 74 68 65 20 44 45 4c 45 54 45 20 73 74 61 74 65  the DELETE state
114e0 6d 65 6e 74 20 74 6f 20 77 72 69 74 65 20 74 6f  ment to write to
114f0 20 74 68 65 20 74 61 72 67 65 74 20 50 4b 20 62   the target PK b
11500 2d 74 72 65 65 2e 0a 20 20 20 20 20 20 2a 2a 20  -tree..      ** 
11510 42 65 63 61 75 73 65 20 69 74 20 6f 6e 6c 79 20  Because it only 
11520 70 65 72 66 6f 72 6d 73 20 49 4e 53 45 52 54 20  performs INSERT 
11530 6f 70 65 72 61 74 69 6f 6e 73 2c 20 74 68 69 73  operations, this
11540 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64   is not required
11550 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 61 6e   for.      ** an
11560 20 72 62 75 20 76 61 63 75 75 6d 20 68 61 6e 64   rbu vacuum hand
11570 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66  le.  */.      if
11580 28 20 72 62 75 49 73 56 61 63 75 75 6d 28 70 29  ( rbuIsVacuum(p)
11590 3d 3d 30 20 26 26 20 70 2d 3e 72 63 3d 3d 53 51  ==0 && p->rc==SQ
115a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
115b0 20 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61     p->rc = prepa
115c0 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74  reFreeAndCollect
115d0 45 72 72 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c  Error(p->dbMain,
115e0 20 26 70 49 74 65 72 2d 3e 70 44 65 6c 65 74 65   &pIter->pDelete
115f0 2c 20 70 7a 2c 0a 20 20 20 20 20 20 20 20 20 20  , pz,.          
11600 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74    sqlite3_mprint
11610 66 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  f(.             
11620 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 5c 22   "DELETE FROM \"
11630 25 73 25 77 5c 22 20 57 48 45 52 45 20 25 73 22  %s%w\" WHERE %s"
11640 2c 20 7a 57 72 69 74 65 2c 20 7a 54 62 6c 2c 20  , zWrite, zTbl, 
11650 7a 57 68 65 72 65 0a 20 20 20 20 20 20 20 20 20  zWhere.         
11660 20 20 20 29 0a 20 20 20 20 20 20 20 20 29 3b 0a     ).        );.
11670 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
11680 66 28 20 72 62 75 49 73 56 61 63 75 75 6d 28 70  f( rbuIsVacuum(p
11690 29 3d 3d 30 20 26 26 20 70 49 74 65 72 2d 3e 61  )==0 && pIter->a
116a0 62 49 6e 64 65 78 65 64 20 29 7b 0a 20 20 20 20  bIndexed ){.    
116b0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
116c0 7a 52 62 75 52 6f 77 69 64 20 3d 20 22 22 3b 0a  zRbuRowid = "";.
116d0 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65          if( pIte
116e0 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b  r->eType==RBU_PK
116f0 5f 45 58 54 45 52 4e 41 4c 20 7c 7c 20 70 49 74  _EXTERNAL || pIt
11700 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50  er->eType==RBU_P
11710 4b 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  K_NONE ){.      
11720 20 20 20 20 7a 52 62 75 52 6f 77 69 64 20 3d 20      zRbuRowid = 
11730 22 2c 20 72 62 75 5f 72 6f 77 69 64 22 3b 0a 20  ", rbu_rowid";. 
11740 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
11750 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20    /* Create the 
11760 72 62 75 5f 74 6d 70 5f 78 78 78 20 74 61 62 6c  rbu_tmp_xxx tabl
11770 65 20 61 6e 64 20 74 68 65 20 74 72 69 67 67 65  e and the trigge
11780 72 73 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 69  rs to populate i
11790 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 62  t. */.        rb
117a0 75 4d 50 72 69 6e 74 66 45 78 65 63 28 70 2c 20  uMPrintfExec(p, 
117b0 70 2d 3e 64 62 52 62 75 2c 0a 20 20 20 20 20 20  p->dbRbu,.      
117c0 20 20 20 20 20 20 22 43 52 45 41 54 45 20 54 41        "CREATE TA
117d0 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54  BLE IF NOT EXIST
117e0 53 20 25 73 2e 27 72 62 75 5f 74 6d 70 5f 25 71  S %s.'rbu_tmp_%q
117f0 27 20 41 53 20 22 0a 20 20 20 20 20 20 20 20 20  ' AS ".         
11800 20 20 20 22 53 45 4c 45 43 54 20 2a 25 73 20 46     "SELECT *%s F
11810 52 4f 4d 20 27 25 71 27 20 57 48 45 52 45 20 30  ROM '%q' WHERE 0
11820 3b 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 2c  ;".            ,
11830 20 70 2d 3e 7a 53 74 61 74 65 44 62 2c 20 70 49   p->zStateDb, pI
11840 74 65 72 2d 3e 7a 44 61 74 61 54 62 6c 0a 20 20  ter->zDataTbl.  
11850 20 20 20 20 20 20 20 20 20 20 2c 20 28 70 49 74            , (pIt
11860 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50  er->eType==RBU_P
11870 4b 5f 45 58 54 45 52 4e 41 4c 20 3f 20 22 2c 20  K_EXTERNAL ? ", 
11880 30 20 41 53 20 72 62 75 5f 72 6f 77 69 64 22 20  0 AS rbu_rowid" 
11890 3a 20 22 22 29 0a 20 20 20 20 20 20 20 20 20 20  : "").          
118a0 20 20 2c 20 70 49 74 65 72 2d 3e 7a 44 61 74 61    , pIter->zData
118b0 54 62 6c 0a 20 20 20 20 20 20 20 20 29 3b 0a 0a  Tbl.        );..
118c0 20 20 20 20 20 20 20 20 72 62 75 4d 50 72 69 6e          rbuMPrin
118d0 74 66 45 78 65 63 28 70 2c 20 70 2d 3e 64 62 4d  tfExec(p, p->dbM
118e0 61 69 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ain,.           
118f0 20 22 43 52 45 41 54 45 20 54 45 4d 50 20 54 52   "CREATE TEMP TR
11900 49 47 47 45 52 20 72 62 75 5f 64 65 6c 65 74 65  IGGER rbu_delete
11910 5f 74 72 20 42 45 46 4f 52 45 20 44 45 4c 45 54  _tr BEFORE DELET
11920 45 20 4f 4e 20 5c 22 25 73 25 77 5c 22 20 22 0a  E ON \"%s%w\" ".
11930 20 20 20 20 20 20 20 20 20 20 20 20 22 42 45 47              "BEG
11940 49 4e 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  IN ".           
11950 20 22 20 20 53 45 4c 45 43 54 20 72 62 75 5f 74   "  SELECT rbu_t
11960 6d 70 5f 69 6e 73 65 72 74 28 33 2c 20 25 73 29  mp_insert(3, %s)
11970 3b 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  ;".            "
11980 45 4e 44 3b 22 0a 0a 20 20 20 20 20 20 20 20 20  END;"..         
11990 20 20 20 22 43 52 45 41 54 45 20 54 45 4d 50 20     "CREATE TEMP 
119a0 54 52 49 47 47 45 52 20 72 62 75 5f 75 70 64 61  TRIGGER rbu_upda
119b0 74 65 31 5f 74 72 20 42 45 46 4f 52 45 20 55 50  te1_tr BEFORE UP
119c0 44 41 54 45 20 4f 4e 20 5c 22 25 73 25 77 5c 22  DATE ON \"%s%w\"
119d0 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22   ".            "
119e0 42 45 47 49 4e 20 22 0a 20 20 20 20 20 20 20 20  BEGIN ".        
119f0 20 20 20 20 22 20 20 53 45 4c 45 43 54 20 72 62      "  SELECT rb
11a00 75 5f 74 6d 70 5f 69 6e 73 65 72 74 28 33 2c 20  u_tmp_insert(3, 
11a10 25 73 29 3b 22 0a 20 20 20 20 20 20 20 20 20 20  %s);".          
11a20 20 20 22 45 4e 44 3b 22 0a 0a 20 20 20 20 20 20    "END;"..      
11a30 20 20 20 20 20 20 22 43 52 45 41 54 45 20 54 45        "CREATE TE
11a40 4d 50 20 54 52 49 47 47 45 52 20 72 62 75 5f 75  MP TRIGGER rbu_u
11a50 70 64 61 74 65 32 5f 74 72 20 41 46 54 45 52 20  pdate2_tr AFTER 
11a60 55 50 44 41 54 45 20 4f 4e 20 5c 22 25 73 25 77  UPDATE ON \"%s%w
11a70 5c 22 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  \" ".           
11a80 20 22 42 45 47 49 4e 20 22 0a 20 20 20 20 20 20   "BEGIN ".      
11a90 20 20 20 20 20 20 22 20 20 53 45 4c 45 43 54 20        "  SELECT 
11aa0 72 62 75 5f 74 6d 70 5f 69 6e 73 65 72 74 28 34  rbu_tmp_insert(4
11ab0 2c 20 25 73 29 3b 22 0a 20 20 20 20 20 20 20 20  , %s);".        
11ac0 20 20 20 20 22 45 4e 44 3b 22 2c 0a 20 20 20 20      "END;",.    
11ad0 20 20 20 20 20 20 20 20 7a 57 72 69 74 65 2c 20          zWrite, 
11ae0 7a 54 62 6c 2c 20 7a 4f 6c 64 6c 69 73 74 2c 0a  zTbl, zOldlist,.
11af0 20 20 20 20 20 20 20 20 20 20 20 20 7a 57 72 69              zWri
11b00 74 65 2c 20 7a 54 62 6c 2c 20 7a 4f 6c 64 6c 69  te, zTbl, zOldli
11b10 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  st,.            
11b20 7a 57 72 69 74 65 2c 20 7a 54 62 6c 2c 20 7a 4e  zWrite, zTbl, zN
11b30 65 77 6c 69 73 74 0a 20 20 20 20 20 20 20 20 29  ewlist.        )
11b40 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ;..        if( p
11b50 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55  Iter->eType==RBU
11b60 5f 50 4b 5f 45 58 54 45 52 4e 41 4c 20 7c 7c 20  _PK_EXTERNAL || 
11b70 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42  pIter->eType==RB
11b80 55 5f 50 4b 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  U_PK_NONE ){.   
11b90 20 20 20 20 20 20 20 72 62 75 4d 50 72 69 6e 74         rbuMPrint
11ba0 66 45 78 65 63 28 70 2c 20 70 2d 3e 64 62 4d 61  fExec(p, p->dbMa
11bb0 69 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  in,.            
11bc0 20 20 22 43 52 45 41 54 45 20 54 45 4d 50 20 54    "CREATE TEMP T
11bd0 52 49 47 47 45 52 20 72 62 75 5f 69 6e 73 65 72  RIGGER rbu_inser
11be0 74 5f 74 72 20 41 46 54 45 52 20 49 4e 53 45 52  t_tr AFTER INSER
11bf0 54 20 4f 4e 20 5c 22 25 73 25 77 5c 22 20 22 0a  T ON \"%s%w\" ".
11c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 42                "B
11c10 45 47 49 4e 20 22 0a 20 20 20 20 20 20 20 20 20  EGIN ".         
11c20 20 20 20 20 20 22 20 20 53 45 4c 45 43 54 20 72       "  SELECT r
11c30 62 75 5f 74 6d 70 5f 69 6e 73 65 72 74 28 30 2c  bu_tmp_insert(0,
11c40 20 25 73 29 3b 22 0a 20 20 20 20 20 20 20 20 20   %s);".         
11c50 20 20 20 20 20 22 45 4e 44 3b 22 2c 0a 20 20 20       "END;",.   
11c60 20 20 20 20 20 20 20 20 20 20 20 7a 57 72 69 74             zWrit
11c70 65 2c 20 7a 54 62 6c 2c 20 7a 4e 65 77 6c 69 73  e, zTbl, zNewlis
11c80 74 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20  t.          );. 
11c90 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
11ca0 20 20 72 62 75 4f 62 6a 49 74 65 72 50 72 65 70    rbuObjIterPrep
11cb0 61 72 65 54 6d 70 49 6e 73 65 72 74 28 70 2c 20  areTmpInsert(p, 
11cc0 70 49 74 65 72 2c 20 7a 43 6f 6c 6c 69 73 74 2c  pIter, zCollist,
11cd0 20 7a 52 62 75 52 6f 77 69 64 29 3b 0a 20 20 20   zRbuRowid);.   
11ce0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43     }..      /* C
11cf0 72 65 61 74 65 20 74 68 65 20 53 45 4c 45 43 54  reate the SELECT
11d00 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 72 65   statement to re
11d10 61 64 20 6b 65 79 73 20 66 72 6f 6d 20 64 61 74  ad keys from dat
11d20 61 5f 78 78 78 20 2a 2f 0a 20 20 20 20 20 20 69  a_xxx */.      i
11d30 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
11d40 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 63  _OK ){.        c
11d50 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 62 75 52  onst char *zRbuR
11d60 6f 77 69 64 20 3d 20 22 22 3b 0a 20 20 20 20 20  owid = "";.     
11d70 20 20 20 69 66 28 20 62 52 62 75 52 6f 77 69 64     if( bRbuRowid
11d80 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 52   ){.          zR
11d90 62 75 52 6f 77 69 64 20 3d 20 72 62 75 49 73 56  buRowid = rbuIsV
11da0 61 63 75 75 6d 28 70 29 20 3f 20 22 2c 5f 72 6f  acuum(p) ? ",_ro
11db0 77 69 64 5f 20 22 20 3a 20 22 2c 72 62 75 5f 72  wid_ " : ",rbu_r
11dc0 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 20 20 7d  owid";.        }
11dd0 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  .        p->rc =
11de0 20 70 72 65 70 61 72 65 46 72 65 65 41 6e 64 43   prepareFreeAndC
11df0 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64  ollectError(p->d
11e00 62 52 62 75 2c 20 26 70 49 74 65 72 2d 3e 70 53  bRbu, &pIter->pS
11e10 65 6c 65 63 74 2c 20 70 7a 2c 0a 20 20 20 20 20  elect, pz,.     
11e20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d         sqlite3_m
11e30 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  printf(.        
11e40 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 25 73        "SELECT %s
11e50 2c 25 73 20 72 62 75 5f 63 6f 6e 74 72 6f 6c 25  ,%s rbu_control%
11e60 73 20 46 52 4f 4d 20 27 25 71 27 25 73 22 2c 20  s FROM '%q'%s", 
11e70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  .              z
11e80 43 6f 6c 6c 69 73 74 2c 20 0a 20 20 20 20 20 20  Collist, .      
11e90 20 20 20 20 20 20 20 20 28 72 62 75 49 73 56 61          (rbuIsVa
11ea0 63 75 75 6d 28 70 29 20 3f 20 22 30 20 41 53 20  cuum(p) ? "0 AS 
11eb0 22 20 3a 20 22 22 29 2c 0a 20 20 20 20 20 20 20  " : ""),.       
11ec0 20 20 20 20 20 20 20 7a 52 62 75 52 6f 77 69 64         zRbuRowid
11ed0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
11ee0 70 49 74 65 72 2d 3e 7a 44 61 74 61 54 62 6c 2c  pIter->zDataTbl,
11ef0 20 7a 4c 69 6d 69 74 0a 20 20 20 20 20 20 20 20   zLimit.        
11f00 20 20 20 20 29 0a 20 20 20 20 20 20 20 20 29 3b      ).        );
11f10 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
11f20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 57 68  sqlite3_free(zWh
11f30 65 72 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ere);.      sqli
11f40 74 65 33 5f 66 72 65 65 28 7a 4f 6c 64 6c 69 73  te3_free(zOldlis
11f50 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
11f60 33 5f 66 72 65 65 28 7a 4e 65 77 6c 69 73 74 29  3_free(zNewlist)
11f70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
11f80 66 72 65 65 28 7a 42 69 6e 64 69 6e 67 73 29 3b  free(zBindings);
11f90 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
11fa0 65 33 5f 66 72 65 65 28 7a 43 6f 6c 6c 69 73 74  e3_free(zCollist
11fb0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
11fc0 72 65 65 28 7a 4c 69 6d 69 74 29 3b 0a 20 20 7d  ree(zLimit);.  }
11fd0 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e  .  .  return p->
11fe0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  rc;.}../*.** Set
11ff0 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65   output variable
12000 20 2a 70 70 53 74 6d 74 20 74 6f 20 70 6f 69 6e   *ppStmt to poin
12010 74 20 74 6f 20 61 6e 20 55 50 44 41 54 45 20 73  t to an UPDATE s
12020 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 6d 61  tatement that ma
12030 79 0a 2a 2a 20 62 65 20 75 73 65 64 20 74 6f 20  y.** be used to 
12040 75 70 64 61 74 65 20 74 68 65 20 69 6d 70 6f 73  update the impos
12050 74 65 72 20 74 61 62 6c 65 20 66 6f 72 20 74 68  ter table for th
12060 65 20 6d 61 69 6e 20 74 61 62 6c 65 20 62 2d 74  e main table b-t
12070 72 65 65 20 6f 66 20 74 68 65 0a 2a 2a 20 74 61  ree of the.** ta
12080 62 6c 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20  ble object that 
12090 70 49 74 65 72 20 63 75 72 72 65 6e 74 6c 79 20  pIter currently 
120a0 70 6f 69 6e 74 73 20 74 6f 2c 20 61 73 73 75 6d  points to, assum
120b0 69 6e 67 20 74 68 61 74 20 74 68 65 20 0a 2a 2a  ing that the .**
120c0 20 72 62 75 5f 63 6f 6e 74 72 6f 6c 20 63 6f 6c   rbu_control col
120d0 75 6d 6e 20 6f 66 20 74 68 65 20 64 61 74 61 5f  umn of the data_
120e0 78 79 7a 20 74 61 62 6c 65 20 63 6f 6e 74 61 69  xyz table contai
120f0 6e 73 20 7a 4d 61 73 6b 2e 0a 2a 2a 20 0a 2a 2a  ns zMask..** .**
12100 20 49 66 20 74 68 65 20 7a 4d 61 73 6b 20 73 74   If the zMask st
12110 72 69 6e 67 20 64 6f 65 73 20 6e 6f 74 20 73 70  ring does not sp
12120 65 63 69 66 79 20 61 6e 79 20 63 6f 6c 75 6d 6e  ecify any column
12130 73 20 74 6f 20 75 70 64 61 74 65 2c 20 74 68 65  s to update, the
12140 6e 20 74 68 69 73 0a 2a 2a 20 69 73 20 6e 6f 74  n this.** is not
12150 20 61 6e 20 65 72 72 6f 72 2e 20 4f 75 74 70 75   an error. Outpu
12160 74 20 76 61 72 69 61 62 6c 65 20 2a 70 70 53 74  t variable *ppSt
12170 6d 74 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  mt is set to NUL
12180 4c 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  L in this case..
12190 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62  */.static int rb
121a0 75 47 65 74 55 70 64 61 74 65 53 74 6d 74 28 0a  uGetUpdateStmt(.
121b0 20 20 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c    sqlite3rbu *p,
121c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
121d0 20 20 2f 2a 20 52 42 55 20 68 61 6e 64 6c 65 20    /* RBU handle 
121e0 2a 2f 0a 20 20 52 62 75 4f 62 6a 49 74 65 72 20  */.  RbuObjIter 
121f0 2a 70 49 74 65 72 2c 20 20 20 20 20 20 20 20 20  *pIter,         
12200 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 69       /* Object i
12210 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20 63 6f 6e  terator */.  con
12220 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 6b 2c 20  st char *zMask, 
12230 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12240 72 62 75 5f 63 6f 6e 74 72 6f 6c 20 76 61 6c 75  rbu_control valu
12250 65 20 28 27 78 2e 78 2e 27 29 20 2a 2f 0a 20 20  e ('x.x.') */.  
12260 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70  sqlite3_stmt **p
12270 70 53 74 6d 74 20 20 20 20 20 20 20 20 20 20 20  pStmt           
12280 2f 2a 20 4f 55 54 3a 20 55 50 44 41 54 45 20 73  /* OUT: UPDATE s
12290 74 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65 20  tatement handle 
122a0 2a 2f 0a 29 7b 0a 20 20 52 62 75 55 70 64 61 74  */.){.  RbuUpdat
122b0 65 53 74 6d 74 20 2a 2a 70 70 3b 0a 20 20 52 62  eStmt **pp;.  Rb
122c0 75 55 70 64 61 74 65 53 74 6d 74 20 2a 70 55 70  uUpdateStmt *pUp
122d0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 55 70 20   = 0;.  int nUp 
122e0 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 6e 20 63 61  = 0;..  /* In ca
122f0 73 65 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  se an error occu
12300 72 73 20 2a 2f 0a 20 20 2a 70 70 53 74 6d 74 20  rs */.  *ppStmt 
12310 3d 20 30 3b 0a 0a 20 20 2f 2a 20 53 65 61 72 63  = 0;..  /* Searc
12320 68 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e  h for an existin
12330 67 20 73 74 61 74 65 6d 65 6e 74 2e 20 49 66 20  g statement. If 
12340 6f 6e 65 20 69 73 20 66 6f 75 6e 64 2c 20 73 68  one is found, sh
12350 69 66 74 20 69 74 20 74 6f 20 74 68 65 20 66 72  ift it to the fr
12360 6f 6e 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  ont.  ** of the 
12370 4c 52 55 20 71 75 65 75 65 20 61 6e 64 20 72 65  LRU queue and re
12380 74 75 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79  turn immediately
12390 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 6c 65 61  . Otherwise, lea
123a0 76 65 20 6e 55 70 20 70 6f 69 6e 74 69 6e 67 0a  ve nUp pointing.
123b0 20 20 2a 2a 20 74 6f 20 74 68 65 20 6e 75 6d 62    ** to the numb
123c0 65 72 20 6f 66 20 73 74 61 74 65 6d 65 6e 74 73  er of statements
123d0 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68   currently in th
123e0 65 20 63 61 63 68 65 20 61 6e 64 20 70 55 70 20  e cache and pUp 
123f0 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6c 61 73 74  to the.  ** last
12400 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 20 6c   object in the l
12410 69 73 74 2e 20 20 2a 2f 0a 20 20 66 6f 72 28 70  ist.  */.  for(p
12420 70 3d 26 70 49 74 65 72 2d 3e 70 52 62 75 55 70  p=&pIter->pRbuUp
12430 64 61 74 65 3b 20 2a 70 70 3b 20 70 70 3d 26 28  date; *pp; pp=&(
12440 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 29 7b 0a  (*pp)->pNext)){.
12450 20 20 20 20 70 55 70 20 3d 20 2a 70 70 3b 0a 20      pUp = *pp;. 
12460 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 70 55     if( strcmp(pU
12470 70 2d 3e 7a 4d 61 73 6b 2c 20 7a 4d 61 73 6b 29  p->zMask, zMask)
12480 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 70  ==0 ){.      *pp
12490 20 3d 20 70 55 70 2d 3e 70 4e 65 78 74 3b 0a 20   = pUp->pNext;. 
124a0 20 20 20 20 20 70 55 70 2d 3e 70 4e 65 78 74 20       pUp->pNext 
124b0 3d 20 70 49 74 65 72 2d 3e 70 52 62 75 55 70 64  = pIter->pRbuUpd
124c0 61 74 65 3b 0a 20 20 20 20 20 20 70 49 74 65 72  ate;.      pIter
124d0 2d 3e 70 52 62 75 55 70 64 61 74 65 20 3d 20 70  ->pRbuUpdate = p
124e0 55 70 3b 0a 20 20 20 20 20 20 2a 70 70 53 74 6d  Up;.      *ppStm
124f0 74 20 3d 20 70 55 70 2d 3e 70 55 70 64 61 74 65  t = pUp->pUpdate
12500 3b 20 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ; .      return 
12510 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
12520 0a 20 20 20 20 6e 55 70 2b 2b 3b 0a 20 20 7d 0a  .    nUp++;.  }.
12530 20 20 61 73 73 65 72 74 28 20 70 55 70 3d 3d 30    assert( pUp==0
12540 20 7c 7c 20 70 55 70 2d 3e 70 4e 65 78 74 3d 3d   || pUp->pNext==
12550 30 20 29 3b 0a 0a 20 20 69 66 28 20 6e 55 70 3e  0 );..  if( nUp>
12560 3d 53 51 4c 49 54 45 5f 52 42 55 5f 55 50 44 41  =SQLITE_RBU_UPDA
12570 54 45 5f 43 41 43 48 45 53 49 5a 45 20 29 7b 0a  TE_CACHESIZE ){.
12580 20 20 20 20 66 6f 72 28 70 70 3d 26 70 49 74 65      for(pp=&pIte
12590 72 2d 3e 70 52 62 75 55 70 64 61 74 65 3b 20 2a  r->pRbuUpdate; *
125a0 70 70 21 3d 70 55 70 3b 20 70 70 3d 26 28 28 2a  pp!=pUp; pp=&((*
125b0 70 70 29 2d 3e 70 4e 65 78 74 29 29 3b 0a 20 20  pp)->pNext));.  
125c0 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20 20 20 73    *pp = 0;.    s
125d0 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
125e0 70 55 70 2d 3e 70 55 70 64 61 74 65 29 3b 0a 20  pUp->pUpdate);. 
125f0 20 20 20 70 55 70 2d 3e 70 55 70 64 61 74 65 20     pUp->pUpdate 
12600 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
12610 20 20 70 55 70 20 3d 20 28 52 62 75 55 70 64 61    pUp = (RbuUpda
12620 74 65 53 74 6d 74 2a 29 72 62 75 4d 61 6c 6c 6f  teStmt*)rbuMallo
12630 63 28 70 2c 20 73 69 7a 65 6f 66 28 52 62 75 55  c(p, sizeof(RbuU
12640 70 64 61 74 65 53 74 6d 74 29 2b 70 49 74 65 72  pdateStmt)+pIter
12650 2d 3e 6e 54 62 6c 43 6f 6c 2b 31 29 3b 0a 20 20  ->nTblCol+1);.  
12660 7d 0a 0a 20 20 69 66 28 20 70 55 70 20 29 7b 0a  }..  if( pUp ){.
12670 20 20 20 20 63 68 61 72 20 2a 7a 57 68 65 72 65      char *zWhere
12680 20 3d 20 72 62 75 4f 62 6a 49 74 65 72 47 65 74   = rbuObjIterGet
12690 57 68 65 72 65 28 70 2c 20 70 49 74 65 72 29 3b  Where(p, pIter);
126a0 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 65 74 20  .    char *zSet 
126b0 3d 20 72 62 75 4f 62 6a 49 74 65 72 47 65 74 53  = rbuObjIterGetS
126c0 65 74 6c 69 73 74 28 70 2c 20 70 49 74 65 72 2c  etlist(p, pIter,
126d0 20 7a 4d 61 73 6b 29 3b 0a 20 20 20 20 63 68 61   zMask);.    cha
126e0 72 20 2a 7a 55 70 64 61 74 65 20 3d 20 30 3b 0a  r *zUpdate = 0;.
126f0 0a 20 20 20 20 70 55 70 2d 3e 7a 4d 61 73 6b 20  .    pUp->zMask 
12700 3d 20 28 63 68 61 72 2a 29 26 70 55 70 5b 31 5d  = (char*)&pUp[1]
12710 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 55 70  ;.    memcpy(pUp
12720 2d 3e 7a 4d 61 73 6b 2c 20 7a 4d 61 73 6b 2c 20  ->zMask, zMask, 
12730 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 29 3b  pIter->nTblCol);
12740 0a 20 20 20 20 70 55 70 2d 3e 70 4e 65 78 74 20  .    pUp->pNext 
12750 3d 20 70 49 74 65 72 2d 3e 70 52 62 75 55 70 64  = pIter->pRbuUpd
12760 61 74 65 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  ate;.    pIter->
12770 70 52 62 75 55 70 64 61 74 65 20 3d 20 70 55 70  pRbuUpdate = pUp
12780 3b 0a 0a 20 20 20 20 69 66 28 20 7a 53 65 74 20  ;..    if( zSet 
12790 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
127a0 68 61 72 20 2a 7a 50 72 65 66 69 78 20 3d 20 22  har *zPrefix = "
127b0 22 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 49  ";..      if( pI
127c0 74 65 72 2d 3e 65 54 79 70 65 21 3d 52 42 55 5f  ter->eType!=RBU_
127d0 50 4b 5f 56 54 41 42 20 29 20 7a 50 72 65 66 69  PK_VTAB ) zPrefi
127e0 78 20 3d 20 22 72 62 75 5f 69 6d 70 5f 22 3b 0a  x = "rbu_imp_";.
127f0 20 20 20 20 20 20 7a 55 70 64 61 74 65 20 3d 20        zUpdate = 
12800 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
12810 22 55 50 44 41 54 45 20 5c 22 25 73 25 77 5c 22  "UPDATE \"%s%w\"
12820 20 53 45 54 20 25 73 20 57 48 45 52 45 20 25 73   SET %s WHERE %s
12830 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 7a 50  ", .          zP
12840 72 65 66 69 78 2c 20 70 49 74 65 72 2d 3e 7a 54  refix, pIter->zT
12850 62 6c 2c 20 7a 53 65 74 2c 20 7a 57 68 65 72 65  bl, zSet, zWhere
12860 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
12870 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65 46  p->rc = prepareF
12880 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72  reeAndCollectErr
12890 6f 72 28 0a 20 20 20 20 20 20 20 20 20 20 70 2d  or(.          p-
128a0 3e 64 62 4d 61 69 6e 2c 20 26 70 55 70 2d 3e 70  >dbMain, &pUp->p
128b0 55 70 64 61 74 65 2c 20 26 70 2d 3e 7a 45 72 72  Update, &p->zErr
128c0 6d 73 67 2c 20 7a 55 70 64 61 74 65 0a 20 20 20  msg, zUpdate.   
128d0 20 20 20 29 3b 0a 20 20 20 20 20 20 2a 70 70 53     );.      *ppS
128e0 74 6d 74 20 3d 20 70 55 70 2d 3e 70 55 70 64 61  tmt = pUp->pUpda
128f0 74 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  te;.    }.    sq
12900 6c 69 74 65 33 5f 66 72 65 65 28 7a 57 68 65 72  lite3_free(zWher
12910 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  e);.    sqlite3_
12920 66 72 65 65 28 7a 53 65 74 29 3b 0a 20 20 7d 0a  free(zSet);.  }.
12930 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 3b  .  return p->rc;
12940 0a 7d 0a 0a 73 74 61 74 69 63 20 73 71 6c 69 74  .}..static sqlit
12950 65 33 20 2a 72 62 75 4f 70 65 6e 44 62 68 61 6e  e3 *rbuOpenDbhan
12960 64 6c 65 28 0a 20 20 73 71 6c 69 74 65 33 72 62  dle(.  sqlite3rb
12970 75 20 2a 70 2c 20 0a 20 20 63 6f 6e 73 74 20 63  u *p, .  const c
12980 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 69  har *zName, .  i
12990 6e 74 20 62 55 73 65 56 66 73 0a 29 7b 0a 20 20  nt bUseVfs.){.  
129a0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 30 3b  sqlite3 *db = 0;
129b0 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
129c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 63  LITE_OK ){.    c
129d0 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d  onst int flags =
129e0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
129f0 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50  DWRITE|SQLITE_OP
12a00 45 4e 5f 43 52 45 41 54 45 7c 53 51 4c 49 54 45  EN_CREATE|SQLITE
12a10 5f 4f 50 45 4e 5f 55 52 49 3b 0a 20 20 20 20 70  _OPEN_URI;.    p
12a20 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f  ->rc = sqlite3_o
12a30 70 65 6e 5f 76 32 28 7a 4e 61 6d 65 2c 20 26 64  pen_v2(zName, &d
12a40 62 2c 20 66 6c 61 67 73 2c 20 62 55 73 65 56 66  b, flags, bUseVf
12a50 73 20 3f 20 70 2d 3e 7a 56 66 73 4e 61 6d 65 20  s ? p->zVfsName 
12a60 3a 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  : 0);.    if( p-
12a70 3e 72 63 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  >rc ){.      p->
12a80 7a 45 72 72 6d 73 67 20 3d 20 73 71 6c 69 74 65  zErrmsg = sqlite
12a90 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20  3_mprintf("%s", 
12aa0 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64  sqlite3_errmsg(d
12ab0 62 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  b));.      sqlit
12ac0 65 33 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20  e3_close(db);.  
12ad0 20 20 20 20 64 62 20 3d 20 30 3b 0a 20 20 20 20      db = 0;.    
12ae0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 64  }.  }.  return d
12af0 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65  b;.}../*.** Free
12b00 20 61 6e 20 52 62 75 53 74 61 74 65 20 6f 62 6a   an RbuState obj
12b10 65 63 74 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  ect allocated by
12b20 20 72 62 75 4c 6f 61 64 53 74 61 74 65 28 29 2e   rbuLoadState().
12b30 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
12b40 72 62 75 46 72 65 65 53 74 61 74 65 28 52 62 75  rbuFreeState(Rbu
12b50 53 74 61 74 65 20 2a 70 29 7b 0a 20 20 69 66 28  State *p){.  if(
12b60 20 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   p ){.    sqlite
12b70 33 5f 66 72 65 65 28 70 2d 3e 7a 54 62 6c 29 3b  3_free(p->zTbl);
12b80 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
12b90 65 28 70 2d 3e 7a 49 64 78 29 3b 0a 20 20 20 20  e(p->zIdx);.    
12ba0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
12bb0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  .  }.}../*.** Al
12bc0 6c 6f 63 61 74 65 20 61 6e 20 52 62 75 53 74 61  locate an RbuSta
12bd0 74 65 20 6f 62 6a 65 63 74 20 61 6e 64 20 6c 6f  te object and lo
12be0 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ad the contents 
12bf0 6f 66 20 74 68 65 20 72 62 75 5f 73 74 61 74 65  of the rbu_state
12c00 20 0a 2a 2a 20 74 61 62 6c 65 20 69 6e 74 6f 20   .** table into 
12c10 69 74 2e 20 52 65 74 75 72 6e 20 61 20 70 6f 69  it. Return a poi
12c20 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 65 77 20  nter to the new 
12c30 6f 62 6a 65 63 74 2e 20 49 74 20 69 73 20 74 68  object. It is th
12c40 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62 69  e .** responsibi
12c50 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c  lity of the call
12c60 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79  er to eventually
12c70 20 66 72 65 65 20 74 68 65 20 6f 62 6a 65 63 74   free the object
12c80 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65   using.** sqlite
12c90 33 5f 66 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  3_free()..**.** 
12ca0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
12cb0 72 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72  rs, leave an err
12cc0 6f 72 20 63 6f 64 65 20 61 6e 64 20 6d 65 73 73  or code and mess
12cd0 61 67 65 20 69 6e 20 74 68 65 20 72 62 75 20 68  age in the rbu h
12ce0 61 6e 64 6c 65 0a 2a 2a 20 61 6e 64 20 72 65 74  andle.** and ret
12cf0 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61  urn NULL..*/.sta
12d00 74 69 63 20 52 62 75 53 74 61 74 65 20 2a 72 62  tic RbuState *rb
12d10 75 4c 6f 61 64 53 74 61 74 65 28 73 71 6c 69 74  uLoadState(sqlit
12d20 65 33 72 62 75 20 2a 70 29 7b 0a 20 20 52 62 75  e3rbu *p){.  Rbu
12d30 53 74 61 74 65 20 2a 70 52 65 74 20 3d 20 30 3b  State *pRet = 0;
12d40 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
12d50 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 69 6e  *pStmt = 0;.  in
12d60 74 20 72 63 3b 0a 20 20 69 6e 74 20 72 63 32 3b  t rc;.  int rc2;
12d70 0a 0a 20 20 70 52 65 74 20 3d 20 28 52 62 75 53  ..  pRet = (RbuS
12d80 74 61 74 65 2a 29 72 62 75 4d 61 6c 6c 6f 63 28  tate*)rbuMalloc(
12d90 70 2c 20 73 69 7a 65 6f 66 28 52 62 75 53 74 61  p, sizeof(RbuSta
12da0 74 65 29 29 3b 0a 20 20 69 66 28 20 70 52 65 74  te));.  if( pRet
12db0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
12dc0 0a 20 20 72 63 20 3d 20 70 72 65 70 61 72 65 46  .  rc = prepareF
12dd0 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72  reeAndCollectErr
12de0 6f 72 28 70 2d 3e 64 62 52 62 75 2c 20 26 70 53  or(p->dbRbu, &pS
12df0 74 6d 74 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67  tmt, &p->zErrmsg
12e00 2c 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  , .      sqlite3
12e10 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54  _mprintf("SELECT
12e20 20 6b 2c 20 76 20 46 52 4f 4d 20 25 73 2e 72 62   k, v FROM %s.rb
12e30 75 5f 73 74 61 74 65 22 2c 20 70 2d 3e 7a 53 74  u_state", p->zSt
12e40 61 74 65 44 62 29 0a 20 20 29 3b 0a 20 20 77 68  ateDb).  );.  wh
12e50 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
12e60 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57  OK && SQLITE_ROW
12e70 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ==sqlite3_step(p
12e80 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 73 77 69  Stmt) ){.    swi
12e90 74 63 68 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c  tch( sqlite3_col
12ea0 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30  umn_int(pStmt, 0
12eb0 29 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20  ) ){.      case 
12ec0 52 42 55 5f 53 54 41 54 45 5f 53 54 41 47 45 3a  RBU_STATE_STAGE:
12ed0 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e 65  .        pRet->e
12ee0 53 74 61 67 65 20 3d 20 73 71 6c 69 74 65 33 5f  Stage = sqlite3_
12ef0 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74  column_int(pStmt
12f00 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 1);.        if
12f10 28 20 70 52 65 74 2d 3e 65 53 74 61 67 65 21 3d  ( pRet->eStage!=
12f20 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 0a 20 20  RBU_STAGE_OAL.  
12f30 20 20 20 20 20 20 20 26 26 20 70 52 65 74 2d 3e         && pRet->
12f40 65 53 74 61 67 65 21 3d 52 42 55 5f 53 54 41 47  eStage!=RBU_STAG
12f50 45 5f 4d 4f 56 45 0a 20 20 20 20 20 20 20 20 20  E_MOVE.         
12f60 26 26 20 70 52 65 74 2d 3e 65 53 74 61 67 65 21  && pRet->eStage!
12f70 3d 52 42 55 5f 53 54 41 47 45 5f 43 4b 50 54 0a  =RBU_STAGE_CKPT.
12f80 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
12f90 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c       p->rc = SQL
12fa0 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  ITE_CORRUPT;.   
12fb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62       }.        b
12fc0 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73  reak;..      cas
12fd0 65 20 52 42 55 5f 53 54 41 54 45 5f 54 42 4c 3a  e RBU_STATE_TBL:
12fe0 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e 7a  .        pRet->z
12ff0 54 62 6c 20 3d 20 72 62 75 53 74 72 6e 64 75 70  Tbl = rbuStrndup
13000 28 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  ((char*)sqlite3_
13010 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d  column_text(pStm
13020 74 2c 20 31 29 2c 20 26 72 63 29 3b 0a 20 20 20  t, 1), &rc);.   
13030 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
13040 20 20 20 63 61 73 65 20 52 42 55 5f 53 54 41 54     case RBU_STAT
13050 45 5f 49 44 58 3a 0a 20 20 20 20 20 20 20 20 70  E_IDX:.        p
13060 52 65 74 2d 3e 7a 49 64 78 20 3d 20 72 62 75 53  Ret->zIdx = rbuS
13070 74 72 6e 64 75 70 28 28 63 68 61 72 2a 29 73 71  trndup((char*)sq
13080 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
13090 74 28 70 53 74 6d 74 2c 20 31 29 2c 20 26 72 63  t(pStmt, 1), &rc
130a0 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
130b0 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20 52 42  ;..      case RB
130c0 55 5f 53 54 41 54 45 5f 52 4f 57 3a 0a 20 20 20  U_STATE_ROW:.   
130d0 20 20 20 20 20 70 52 65 74 2d 3e 6e 52 6f 77 20       pRet->nRow 
130e0 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
130f0 5f 69 6e 74 28 70 53 74 6d 74 2c 20 31 29 3b 0a  _int(pStmt, 1);.
13100 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a          break;..
13110 20 20 20 20 20 20 63 61 73 65 20 52 42 55 5f 53        case RBU_S
13120 54 41 54 45 5f 50 52 4f 47 52 45 53 53 3a 0a 20  TATE_PROGRESS:. 
13130 20 20 20 20 20 20 20 70 52 65 74 2d 3e 6e 50 72         pRet->nPr
13140 6f 67 72 65 73 73 20 3d 20 73 71 6c 69 74 65 33  ogress = sqlite3
13150 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53  _column_int64(pS
13160 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  tmt, 1);.       
13170 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 63   break;..      c
13180 61 73 65 20 52 42 55 5f 53 54 41 54 45 5f 43 4b  ase RBU_STATE_CK
13190 50 54 3a 0a 20 20 20 20 20 20 20 20 70 52 65 74  PT:.        pRet
131a0 2d 3e 69 57 61 6c 43 6b 73 75 6d 20 3d 20 73 71  ->iWalCksum = sq
131b0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
131c0 36 34 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20  64(pStmt, 1);.  
131d0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
131e0 20 20 20 20 63 61 73 65 20 52 42 55 5f 53 54 41      case RBU_STA
131f0 54 45 5f 43 4f 4f 4b 49 45 3a 0a 20 20 20 20 20  TE_COOKIE:.     
13200 20 20 20 70 52 65 74 2d 3e 69 43 6f 6f 6b 69 65     pRet->iCookie
13210 20 3d 20 28 75 33 32 29 73 71 6c 69 74 65 33 5f   = (u32)sqlite3_
13220 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74  column_int64(pSt
13230 6d 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  mt, 1);.        
13240 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61  break;..      ca
13250 73 65 20 52 42 55 5f 53 54 41 54 45 5f 4f 41 4c  se RBU_STATE_OAL
13260 53 5a 3a 0a 20 20 20 20 20 20 20 20 70 52 65 74  SZ:.        pRet
13270 2d 3e 69 4f 61 6c 53 7a 20 3d 20 28 75 33 32 29  ->iOalSz = (u32)
13280 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
13290 6e 74 36 34 28 70 53 74 6d 74 2c 20 31 29 3b 0a  nt64(pStmt, 1);.
132a0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a          break;..
132b0 20 20 20 20 20 20 63 61 73 65 20 52 42 55 5f 53        case RBU_S
132c0 54 41 54 45 5f 50 48 41 53 45 4f 4e 45 53 54 45  TATE_PHASEONESTE
132d0 50 3a 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d  P:.        pRet-
132e0 3e 6e 50 68 61 73 65 4f 6e 65 53 74 65 70 20 3d  >nPhaseOneStep =
132f0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
13300 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 31 29 3b  int64(pStmt, 1);
13310 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
13320 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  .      default:.
13330 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
13340 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  ITE_CORRUPT;.   
13350 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
13360 7d 0a 20 20 7d 0a 20 20 72 63 32 20 3d 20 73 71  }.  }.  rc2 = sq
13370 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
13380 53 74 6d 74 29 3b 0a 20 20 69 66 28 20 72 63 3d  Stmt);.  if( rc=
13390 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20  =SQLITE_OK ) rc 
133a0 3d 20 72 63 32 3b 0a 0a 20 20 70 2d 3e 72 63 20  = rc2;..  p->rc 
133b0 3d 20 72 63 3b 0a 20 20 72 65 74 75 72 6e 20 70  = rc;.  return p
133c0 52 65 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4f  Ret;.}.../*.** O
133d0 70 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  pen the database
133e0 20 68 61 6e 64 6c 65 20 61 6e 64 20 61 74 74 61   handle and atta
133f0 63 68 20 74 68 65 20 52 42 55 20 64 61 74 61 62  ch the RBU datab
13400 61 73 65 20 61 73 20 22 72 62 75 22 2e 20 49 66  ase as "rbu". If
13410 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63   an.** error occ
13420 75 72 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72  urs, leave an er
13430 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 6d 65 73  ror code and mes
13440 73 61 67 65 20 69 6e 20 74 68 65 20 52 42 55 20  sage in the RBU 
13450 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  handle..*/.stati
13460 63 20 76 6f 69 64 20 72 62 75 4f 70 65 6e 44 61  c void rbuOpenDa
13470 74 61 62 61 73 65 28 73 71 6c 69 74 65 33 72 62  tabase(sqlite3rb
13480 75 20 2a 70 2c 20 69 6e 74 20 2a 70 62 52 65 74  u *p, int *pbRet
13490 72 79 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  ry){.  assert( p
134a0 2d 3e 72 63 20 7c 7c 20 28 70 2d 3e 64 62 4d 61  ->rc || (p->dbMa
134b0 69 6e 3d 3d 30 20 26 26 20 70 2d 3e 64 62 52 62  in==0 && p->dbRb
134c0 75 3d 3d 30 29 20 29 3b 0a 20 20 61 73 73 65 72  u==0) );.  asser
134d0 74 28 20 70 2d 3e 72 63 20 7c 7c 20 72 62 75 49  t( p->rc || rbuI
134e0 73 56 61 63 75 75 6d 28 70 29 20 7c 7c 20 70 2d  sVacuum(p) || p-
134f0 3e 7a 54 61 72 67 65 74 21 3d 30 20 29 3b 0a 0a  >zTarget!=0 );..
13500 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 52 42    /* Open the RB
13510 55 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  U database */.  
13520 70 2d 3e 64 62 52 62 75 20 3d 20 72 62 75 4f 70  p->dbRbu = rbuOp
13530 65 6e 44 62 68 61 6e 64 6c 65 28 70 2c 20 70 2d  enDbhandle(p, p-
13540 3e 7a 52 62 75 2c 20 31 29 3b 0a 0a 20 20 69 66  >zRbu, 1);..  if
13550 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
13560 4f 4b 20 26 26 20 72 62 75 49 73 56 61 63 75 75  OK && rbuIsVacuu
13570 6d 28 70 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  m(p) ){.    sqli
13580 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
13590 28 70 2d 3e 64 62 52 62 75 2c 20 22 6d 61 69 6e  (p->dbRbu, "main
135a0 22 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  ", SQLITE_FCNTL_
135b0 52 42 55 43 4e 54 2c 20 28 76 6f 69 64 2a 29 70  RBUCNT, (void*)p
135c0 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 7a 53  );.    if( p->zS
135d0 74 61 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  tate==0 ){.     
135e0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
135f0 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 64 62 5f  le = sqlite3_db_
13600 66 69 6c 65 6e 61 6d 65 28 70 2d 3e 64 62 52 62  filename(p->dbRb
13610 75 2c 20 22 6d 61 69 6e 22 29 3b 0a 20 20 20 20  u, "main");.    
13620 20 20 70 2d 3e 7a 53 74 61 74 65 20 3d 20 72 62    p->zState = rb
13630 75 4d 50 72 69 6e 74 66 28 70 2c 20 22 66 69 6c  uMPrintf(p, "fil
13640 65 3a 2f 2f 25 73 2d 76 61 63 75 75 6d 3f 6d 6f  e://%s-vacuum?mo
13650 64 65 6f 66 3d 25 73 22 2c 20 7a 46 69 6c 65 2c  deof=%s", zFile,
13660 20 7a 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20   zFile);.    }. 
13670 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 75 73 69 6e   }..  /* If usin
13680 67 20 73 65 70 61 72 61 74 65 20 52 42 55 20 61  g separate RBU a
13690 6e 64 20 73 74 61 74 65 20 64 61 74 61 62 61 73  nd state databas
136a0 65 73 2c 20 61 74 74 61 63 68 20 74 68 65 20 73  es, attach the s
136b0 74 61 74 65 20 64 61 74 61 62 61 73 65 20 74 6f  tate database to
136c0 0a 20 20 2a 2a 20 74 68 65 20 52 42 55 20 64 62  .  ** the RBU db
136d0 20 68 61 6e 64 6c 65 20 6e 6f 77 2e 20 20 2a 2f   handle now.  */
136e0 0a 20 20 69 66 28 20 70 2d 3e 7a 53 74 61 74 65  .  if( p->zState
136f0 20 29 7b 0a 20 20 20 20 72 62 75 4d 50 72 69 6e   ){.    rbuMPrin
13700 74 66 45 78 65 63 28 70 2c 20 70 2d 3e 64 62 52  tfExec(p, p->dbR
13710 62 75 2c 20 22 41 54 54 41 43 48 20 25 51 20 41  bu, "ATTACH %Q A
13720 53 20 73 74 61 74 22 2c 20 70 2d 3e 7a 53 74 61  S stat", p->zSta
13730 74 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  te);.    memcpy(
13740 70 2d 3e 7a 53 74 61 74 65 44 62 2c 20 22 73 74  p->zStateDb, "st
13750 61 74 22 2c 20 34 29 3b 0a 20 20 7d 65 6c 73 65  at", 4);.  }else
13760 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e  {.    memcpy(p->
13770 7a 53 74 61 74 65 44 62 2c 20 22 6d 61 69 6e 22  zStateDb, "main"
13780 2c 20 34 29 3b 0a 20 20 7d 0a 0a 23 69 66 20 30  , 4);.  }..#if 0
13790 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
137a0 4c 49 54 45 5f 4f 4b 20 26 26 20 72 62 75 49 73  LITE_OK && rbuIs
137b0 56 61 63 75 75 6d 28 70 29 20 29 7b 0a 20 20 20  Vacuum(p) ){.   
137c0 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33   p->rc = sqlite3
137d0 5f 65 78 65 63 28 70 2d 3e 64 62 52 62 75 2c 20  _exec(p->dbRbu, 
137e0 22 42 45 47 49 4e 22 2c 20 30 2c 20 30 2c 20 30  "BEGIN", 0, 0, 0
137f0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
13800 20 2f 2a 20 49 66 20 69 74 20 68 61 73 20 6e 6f   /* If it has no
13810 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63  t already been c
13820 72 65 61 74 65 64 2c 20 63 72 65 61 74 65 20 74  reated, create t
13830 68 65 20 72 62 75 5f 73 74 61 74 65 20 74 61 62  he rbu_state tab
13840 6c 65 20 2a 2f 0a 20 20 72 62 75 4d 50 72 69 6e  le */.  rbuMPrin
13850 74 66 45 78 65 63 28 70 2c 20 70 2d 3e 64 62 52  tfExec(p, p->dbR
13860 62 75 2c 20 52 42 55 5f 43 52 45 41 54 45 5f 53  bu, RBU_CREATE_S
13870 54 41 54 45 2c 20 70 2d 3e 7a 53 74 61 74 65 44  TATE, p->zStateD
13880 62 29 3b 0a 0a 23 69 66 20 30 0a 20 20 69 66 28  b);..#if 0.  if(
13890 20 72 62 75 49 73 56 61 63 75 75 6d 28 70 29 20   rbuIsVacuum(p) 
138a0 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  ){.    if( p->rc
138b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
138c0 20 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 20 20       int rc2;.  
138d0 20 20 20 20 69 6e 74 20 62 4f 6b 20 3d 20 30 3b      int bOk = 0;
138e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
138f0 74 6d 74 20 2a 70 43 6e 74 20 3d 20 30 3b 0a 20  tmt *pCnt = 0;. 
13900 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 72 65       p->rc = pre
13910 70 61 72 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72  pareAndCollectEr
13920 72 6f 72 28 70 2d 3e 64 62 52 62 75 2c 20 26 70  ror(p->dbRbu, &p
13930 43 6e 74 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67  Cnt, &p->zErrmsg
13940 2c 0a 20 20 20 20 20 20 20 20 20 20 22 53 45 4c  ,.          "SEL
13950 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
13960 4d 20 73 74 61 74 2e 73 71 6c 69 74 65 5f 6d 61  M stat.sqlite_ma
13970 73 74 65 72 22 0a 20 20 20 20 20 20 29 3b 0a 20  ster".      );. 
13980 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
13990 53 51 4c 49 54 45 5f 4f 4b 20 0a 20 20 20 20 20  SQLITE_OK .     
139a0 20 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74 65    && sqlite3_ste
139b0 70 28 70 43 6e 74 29 3d 3d 53 51 4c 49 54 45 5f  p(pCnt)==SQLITE_
139c0 52 4f 57 0a 20 20 20 20 20 20 20 26 26 20 31 3d  ROW.       && 1=
139d0 3d 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  =sqlite3_column_
139e0 69 6e 74 28 70 43 6e 74 2c 20 30 29 0a 20 20 20  int(pCnt, 0).   
139f0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 62 4f     ){.        bO
13a00 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  k = 1;.      }. 
13a10 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74       rc2 = sqlit
13a20 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 43 6e 74  e3_finalize(pCnt
13a30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  );.      if( p->
13a40 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
13a50 70 2d 3e 72 63 20 3d 20 72 63 32 3b 0a 0a 20 20  p->rc = rc2;..  
13a60 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
13a70 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 4f 6b 3d  QLITE_OK && bOk=
13a80 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  =0 ){.        p-
13a90 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52  >rc = SQLITE_ERR
13aa0 4f 52 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 7a  OR;.        p->z
13ab0 45 72 72 6d 73 67 20 3d 20 73 71 6c 69 74 65 33  Errmsg = sqlite3
13ac0 5f 6d 70 72 69 6e 74 66 28 22 69 6e 76 61 6c 69  _mprintf("invali
13ad0 64 20 73 74 61 74 65 20 64 61 74 61 62 61 73 65  d state database
13ae0 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ");.      }.    
13af0 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63  .      if( p->rc
13b00 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
13b10 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73         p->rc = s
13b20 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
13b30 62 52 62 75 2c 20 22 43 4f 4d 4d 49 54 22 2c 20  bRbu, "COMMIT", 
13b40 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
13b50 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  }.    }.  }.#end
13b60 69 66 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  if..  if( p->rc=
13b70 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 62  =SQLITE_OK && rb
13b80 75 49 73 56 61 63 75 75 6d 28 70 29 20 29 7b 0a  uIsVacuum(p) ){.
13b90 20 20 20 20 69 6e 74 20 62 4f 70 65 6e 20 3d 20      int bOpen = 
13ba0 30 3b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  0;.    int rc;. 
13bb0 20 20 20 70 2d 3e 6e 52 62 75 20 3d 20 30 3b 0a     p->nRbu = 0;.
13bc0 20 20 20 20 70 2d 3e 70 52 62 75 46 64 20 3d 20      p->pRbuFd = 
13bd0 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  0;.    rc = sqli
13be0 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
13bf0 28 70 2d 3e 64 62 52 62 75 2c 20 22 6d 61 69 6e  (p->dbRbu, "main
13c00 22 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  ", SQLITE_FCNTL_
13c10 52 42 55 43 4e 54 2c 20 28 76 6f 69 64 2a 29 70  RBUCNT, (void*)p
13c20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
13c30 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29  QLITE_NOTFOUND )
13c40 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20   p->rc = rc;.   
13c50 20 69 66 28 20 70 2d 3e 65 53 74 61 67 65 3e 3d   if( p->eStage>=
13c60 52 42 55 5f 53 54 41 47 45 5f 4d 4f 56 45 20 29  RBU_STAGE_MOVE )
13c70 7b 0a 20 20 20 20 20 20 62 4f 70 65 6e 20 3d 20  {.      bOpen = 
13c80 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
13c90 20 20 20 20 52 62 75 53 74 61 74 65 20 2a 70 53      RbuState *pS
13ca0 74 61 74 65 20 3d 20 72 62 75 4c 6f 61 64 53 74  tate = rbuLoadSt
13cb0 61 74 65 28 70 29 3b 0a 20 20 20 20 20 20 69 66  ate(p);.      if
13cc0 28 20 70 53 74 61 74 65 20 29 7b 0a 20 20 20 20  ( pState ){.    
13cd0 20 20 20 20 62 4f 70 65 6e 20 3d 20 28 70 53 74      bOpen = (pSt
13ce0 61 74 65 2d 3e 65 53 74 61 67 65 3e 3d 52 42 55  ate->eStage>=RBU
13cf0 5f 53 54 41 47 45 5f 4d 4f 56 45 29 3b 0a 20 20  _STAGE_MOVE);.  
13d00 20 20 20 20 20 20 72 62 75 46 72 65 65 53 74 61        rbuFreeSta
13d10 74 65 28 70 53 74 61 74 65 29 3b 0a 20 20 20 20  te(pState);.    
13d20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
13d30 28 20 62 4f 70 65 6e 20 29 20 70 2d 3e 64 62 4d  ( bOpen ) p->dbM
13d40 61 69 6e 20 3d 20 72 62 75 4f 70 65 6e 44 62 68  ain = rbuOpenDbh
13d50 61 6e 64 6c 65 28 70 2c 20 70 2d 3e 7a 52 62 75  andle(p, p->zRbu
13d60 2c 20 70 2d 3e 6e 52 62 75 3c 3d 31 29 3b 0a 20  , p->nRbu<=1);. 
13d70 20 7d 0a 0a 20 20 70 2d 3e 65 53 74 61 67 65 20   }..  p->eStage 
13d80 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63  = 0;.  if( p->rc
13d90 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
13da0 2d 3e 64 62 4d 61 69 6e 3d 3d 30 20 29 7b 0a 20  ->dbMain==0 ){. 
13db0 20 20 20 69 66 28 20 21 72 62 75 49 73 56 61 63     if( !rbuIsVac
13dc0 75 75 6d 28 70 29 20 29 7b 0a 20 20 20 20 20 20  uum(p) ){.      
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 70  penDbhandle(p, p
13df0 2d 3e 7a 54 61 72 67 65 74 2c 20 31 29 3b 0a 20  ->zTarget, 1);. 
13e00 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e     }else if( p->
13e10 70 52 62 75 46 64 2d 3e 70 57 61 6c 46 64 20 29  pRbuFd->pWalFd )
13e20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 62 52 65  {.      if( pbRe
13e30 74 72 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70  try ){.        p
13e40 2d 3e 70 52 62 75 46 64 2d 3e 62 4e 6f 6c 6f 63  ->pRbuFd->bNoloc
13e50 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73  k = 0;.        s
13e60 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 2d 3e  qlite3_close(p->
13e70 64 62 52 62 75 29 3b 0a 20 20 20 20 20 20 20 20  dbRbu);.        
13e80 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 2d  sqlite3_close(p-
13e90 3e 64 62 4d 61 69 6e 29 3b 0a 20 20 20 20 20 20  >dbMain);.      
13ea0 20 20 70 2d 3e 64 62 4d 61 69 6e 20 3d 20 30 3b    p->dbMain = 0;
13eb0 0a 20 20 20 20 20 20 20 20 70 2d 3e 64 62 52 62  .        p->dbRb
13ec0 75 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 2a  u = 0;.        *
13ed0 70 62 52 65 74 72 79 20 3d 20 31 3b 0a 20 20 20  pbRetry = 1;.   
13ee0 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
13ef0 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 72 63     }.      p->rc
13f00 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
13f10 0a 20 20 20 20 20 20 70 2d 3e 7a 45 72 72 6d 73  .      p->zErrms
13f20 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  g = sqlite3_mpri
13f30 6e 74 66 28 22 63 61 6e 6e 6f 74 20 76 61 63 75  ntf("cannot vacu
13f40 75 6d 20 77 61 6c 20 6d 6f 64 65 20 64 61 74 61  um wal mode data
13f50 62 61 73 65 22 29 3b 0a 20 20 20 20 7d 65 6c 73  base");.    }els
13f60 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  e{.      char *z
13f70 54 61 72 67 65 74 3b 0a 20 20 20 20 20 20 63 68  Target;.      ch
13f80 61 72 20 2a 7a 45 78 74 72 61 20 3d 20 30 3b 0a  ar *zExtra = 0;.
13f90 20 20 20 20 20 20 69 66 28 20 73 74 72 6c 65 6e        if( strlen
13fa0 28 70 2d 3e 7a 52 62 75 29 3e 3d 35 20 26 26 20  (p->zRbu)>=5 && 
13fb0 30 3d 3d 6d 65 6d 63 6d 70 28 22 66 69 6c 65 3a  0==memcmp("file:
13fc0 22 2c 20 70 2d 3e 7a 52 62 75 2c 20 35 29 20 29  ", p->zRbu, 5) )
13fd0 7b 0a 20 20 20 20 20 20 20 20 7a 45 78 74 72 61  {.        zExtra
13fe0 20 3d 20 26 70 2d 3e 7a 52 62 75 5b 35 5d 3b 0a   = &p->zRbu[5];.
13ff0 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 2a          while( *
14000 7a 45 78 74 72 61 20 29 7b 0a 20 20 20 20 20 20  zExtra ){.      
14010 20 20 20 20 69 66 28 20 2a 7a 45 78 74 72 61 2b      if( *zExtra+
14020 2b 3d 3d 27 3f 27 20 29 20 62 72 65 61 6b 3b 0a  +=='?' ) break;.
14030 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
14040 20 20 69 66 28 20 2a 7a 45 78 74 72 61 3d 3d 27    if( *zExtra=='
14050 5c 30 27 20 29 20 7a 45 78 74 72 61 20 3d 20 30  \0' ) zExtra = 0
14060 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
14070 20 7a 54 61 72 67 65 74 20 3d 20 73 71 6c 69 74   zTarget = sqlit
14080 65 33 5f 6d 70 72 69 6e 74 66 28 22 66 69 6c 65  e3_mprintf("file
14090 3a 25 73 2d 76 61 63 75 75 6d 3f 72 62 75 5f 6d  :%s-vacuum?rbu_m
140a0 65 6d 6f 72 79 3d 31 25 73 25 73 22 2c 20 0a 20  emory=1%s%s", . 
140b0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
140c0 5f 64 62 5f 66 69 6c 65 6e 61 6d 65 28 70 2d 3e  _db_filename(p->
140d0 64 62 52 62 75 2c 20 22 6d 61 69 6e 22 29 2c 0a  dbRbu, "main"),.
140e0 20 20 20 20 20 20 20 20 20 20 28 7a 45 78 74 72            (zExtr
140f0 61 3d 3d 30 20 3f 20 22 22 20 3a 20 22 26 22 29  a==0 ? "" : "&")
14100 2c 20 28 7a 45 78 74 72 61 3d 3d 30 20 3f 20 22  , (zExtra==0 ? "
14110 22 20 3a 20 7a 45 78 74 72 61 29 0a 20 20 20 20  " : zExtra).    
14120 20 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20    );..      if( 
14130 7a 54 61 72 67 65 74 3d 3d 30 20 29 7b 0a 20 20  zTarget==0 ){.  
14140 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51        p->rc = SQ
14150 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
14160 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
14170 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 64 62 4d    }.      p->dbM
14180 61 69 6e 20 3d 20 72 62 75 4f 70 65 6e 44 62 68  ain = rbuOpenDbh
14190 61 6e 64 6c 65 28 70 2c 20 7a 54 61 72 67 65 74  andle(p, zTarget
141a0 2c 20 70 2d 3e 6e 52 62 75 3c 3d 31 29 3b 0a 20  , p->nRbu<=1);. 
141b0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
141c0 65 28 7a 54 61 72 67 65 74 29 3b 0a 20 20 20 20  e(zTarget);.    
141d0 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e  }.  }..  if( p->
141e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
141f0 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c  .    p->rc = sql
14200 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
14210 74 69 6f 6e 28 70 2d 3e 64 62 4d 61 69 6e 2c 20  tion(p->dbMain, 
14220 0a 20 20 20 20 20 20 20 20 22 72 62 75 5f 74 6d  .        "rbu_tm
14230 70 5f 69 6e 73 65 72 74 22 2c 20 2d 31 2c 20 53  p_insert", -1, S
14240 51 4c 49 54 45 5f 55 54 46 38 2c 20 28 76 6f 69  QLITE_UTF8, (voi
14250 64 2a 29 70 2c 20 72 62 75 54 6d 70 49 6e 73 65  d*)p, rbuTmpInse
14260 72 74 46 75 6e 63 2c 20 30 2c 20 30 0a 20 20 20  rtFunc, 0, 0.   
14270 20 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70   );.  }..  if( p
14280 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
14290 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73  ){.    p->rc = s
142a0 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
142b0 6e 63 74 69 6f 6e 28 70 2d 3e 64 62 4d 61 69 6e  nction(p->dbMain
142c0 2c 20 0a 20 20 20 20 20 20 20 20 22 72 62 75 5f  , .        "rbu_
142d0 66 6f 73 73 69 6c 5f 64 65 6c 74 61 22 2c 20 32  fossil_delta", 2
142e0 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
142f0 2c 20 72 62 75 46 6f 73 73 69 6c 44 65 6c 74 61  , rbuFossilDelta
14300 46 75 6e 63 2c 20 30 2c 20 30 0a 20 20 20 20 29  Func, 0, 0.    )
14310 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e  ;.  }..  if( p->
14320 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
14330 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c  .    p->rc = sql
14340 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
14350 74 69 6f 6e 28 70 2d 3e 64 62 52 62 75 2c 20 0a  tion(p->dbRbu, .
14360 20 20 20 20 20 20 20 20 22 72 62 75 5f 74 61 72          "rbu_tar
14370 67 65 74 5f 6e 61 6d 65 22 2c 20 2d 31 2c 20 53  get_name", -1, S
14380 51 4c 49 54 45 5f 55 54 46 38 2c 20 28 76 6f 69  QLITE_UTF8, (voi
14390 64 2a 29 70 2c 20 72 62 75 54 61 72 67 65 74 4e  d*)p, rbuTargetN
143a0 61 6d 65 46 75 6e 63 2c 20 30 2c 20 30 0a 20 20  ameFunc, 0, 0.  
143b0 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20    );.  }..  if( 
143c0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
143d0 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
143e0 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
143f0 74 72 6f 6c 28 70 2d 3e 64 62 4d 61 69 6e 2c 20  trol(p->dbMain, 
14400 22 6d 61 69 6e 22 2c 20 53 51 4c 49 54 45 5f 46  "main", SQLITE_F
14410 43 4e 54 4c 5f 52 42 55 2c 20 28 76 6f 69 64 2a  CNTL_RBU, (void*
14420 29 70 29 3b 0a 20 20 7d 0a 20 20 72 62 75 4d 50  )p);.  }.  rbuMP
14430 72 69 6e 74 66 45 78 65 63 28 70 2c 20 70 2d 3e  rintfExec(p, p->
14440 64 62 4d 61 69 6e 2c 20 22 53 45 4c 45 43 54 20  dbMain, "SELECT 
14450 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  * FROM sqlite_ma
14460 73 74 65 72 22 29 3b 0a 0a 20 20 2f 2a 20 4d 61  ster");..  /* Ma
14470 72 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 20  rk the database 
14480 66 69 6c 65 20 6a 75 73 74 20 6f 70 65 6e 65 64  file just opened
14490 20 61 73 20 61 6e 20 52 42 55 20 74 61 72 67 65   as an RBU targe
144a0 74 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 0a  t database. If .
144b0 20 20 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 72    ** this call r
144c0 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4e 4f  eturns SQLITE_NO
144d0 54 46 4f 55 4e 44 2c 20 74 68 65 6e 20 74 68 65  TFOUND, then the
144e0 20 52 42 55 20 76 66 73 20 69 73 20 6e 6f 74 20   RBU vfs is not 
144f0 69 6e 20 75 73 65 2e 0a 20 20 2a 2a 20 54 68 69  in use..  ** Thi
14500 73 20 69 73 20 61 6e 20 65 72 72 6f 72 2e 20 20  s is an error.  
14510 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  */.  if( p->rc==
14520 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
14530 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33   p->rc = sqlite3
14540 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 70 2d  _file_control(p-
14550 3e 64 62 4d 61 69 6e 2c 20 22 6d 61 69 6e 22 2c  >dbMain, "main",
14560 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 52 42   SQLITE_FCNTL_RB
14570 55 2c 20 28 76 6f 69 64 2a 29 70 29 3b 0a 20 20  U, (void*)p);.  
14580 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  }..  if( p->rc==
14590 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20  SQLITE_NOTFOUND 
145a0 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  ){.    p->rc = S
145b0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
145c0 20 70 2d 3e 7a 45 72 72 6d 73 67 20 3d 20 73 71   p->zErrmsg = sq
145d0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 72  lite3_mprintf("r
145e0 62 75 20 76 66 73 20 6e 6f 74 20 66 6f 75 6e 64  bu vfs not found
145f0 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ");.  }.}../*.**
14600 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
14610 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73   a copy of the s
14620 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69 78  qlite3FileSuffix
14630 33 28 29 20 72 6f 75 74 69 6e 65 20 66 72 6f 6d  3() routine from
14640 20 74 68 65 20 63 6f 72 65 2e 0a 2a 2a 20 49 74   the core..** It
14650 20 69 73 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65   is a no-op unle
14660 73 73 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ss SQLITE_ENABLE
14670 5f 38 5f 33 5f 4e 41 4d 45 53 20 69 73 20 64 65  _8_3_NAMES is de
14680 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  fined..**.** If 
14690 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 38 5f  SQLITE_ENABLE_8_
146a0 33 5f 4e 41 4d 45 53 20 69 73 20 73 65 74 20 61  3_NAMES is set a
146b0 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 61  t compile-time a
146c0 6e 64 20 69 66 20 74 68 65 20 64 61 74 61 62 61  nd if the databa
146d0 73 65 0a 2a 2a 20 66 69 6c 65 6e 61 6d 65 20 69  se.** filename i
146e0 6e 20 7a 42 61 73 65 46 69 6c 65 6e 61 6d 65 20  n zBaseFilename 
146f0 69 73 20 61 20 55 52 49 20 77 69 74 68 20 74 68  is a URI with th
14700 65 20 22 38 5f 33 5f 6e 61 6d 65 73 3d 31 22 20  e "8_3_names=1" 
14710 70 61 72 61 6d 65 74 65 72 20 61 6e 64 0a 2a 2a  parameter and.**
14720 20 69 66 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20   if filename in 
14730 7a 5b 5d 20 68 61 73 20 61 20 73 75 66 66 69 78  z[] has a suffix
14740 20 28 61 2e 6b 2e 61 2e 20 22 65 78 74 65 6e 73   (a.k.a. "extens
14750 69 6f 6e 22 29 20 74 68 61 74 20 69 73 20 6c 6f  ion") that is lo
14760 6e 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 72  nger than.** thr
14770 65 65 20 63 68 61 72 61 63 74 65 72 73 2c 20 74  ee characters, t
14780 68 65 6e 20 73 68 6f 72 74 65 6e 20 74 68 65 20  hen shorten the 
14790 73 75 66 66 69 78 20 6f 6e 20 7a 5b 5d 20 74 6f  suffix on z[] to
147a0 20 62 65 20 74 68 65 20 6c 61 73 74 20 74 68 72   be the last thr
147b0 65 65 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 73  ee.** characters
147c0 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   of the original
147d0 20 73 75 66 66 69 78 2e 0a 2a 2a 0a 2a 2a 20 49   suffix..**.** I
147e0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
147f0 38 5f 33 5f 4e 41 4d 45 53 20 69 73 20 73 65 74  8_3_NAMES is set
14800 20 74 6f 20 32 20 61 74 20 63 6f 6d 70 69 6c 65   to 2 at compile
14810 2d 74 69 6d 65 2c 20 74 68 65 6e 20 61 6c 77 61  -time, then alwa
14820 79 73 0a 2a 2a 20 64 6f 20 74 68 65 20 73 75 66  ys.** do the suf
14830 66 69 78 20 73 68 6f 72 74 65 6e 69 6e 67 20 72  fix shortening r
14840 65 67 61 72 64 6c 65 73 73 20 6f 66 20 55 52 49  egardless of URI
14850 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a   parameter..**.*
14860 2a 20 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a  * Examples:.**.*
14870 2a 20 20 20 20 20 74 65 73 74 2e 64 62 2d 6a 6f  *     test.db-jo
14880 75 72 6e 61 6c 20 20 20 20 3d 3e 20 20 20 74 65  urnal    =>   te
14890 73 74 2e 6e 61 6c 0a 2a 2a 20 20 20 20 20 74 65  st.nal.**     te
148a0 73 74 2e 64 62 2d 77 61 6c 20 20 20 20 20 20 20  st.db-wal       
148b0 20 3d 3e 20 20 20 74 65 73 74 2e 77 61 6c 0a 2a   =>   test.wal.*
148c0 2a 20 20 20 20 20 74 65 73 74 2e 64 62 2d 73 68  *     test.db-sh
148d0 6d 20 20 20 20 20 20 20 20 3d 3e 20 20 20 74 65  m        =>   te
148e0 73 74 2e 73 68 6d 0a 2a 2a 20 20 20 20 20 74 65  st.shm.**     te
148f0 73 74 2e 64 62 2d 6d 6a 37 66 33 33 31 39 66 61  st.db-mj7f3319fa
14900 20 3d 3e 20 20 20 74 65 73 74 2e 39 66 61 0a 2a   =>   test.9fa.*
14910 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62  /.static void rb
14920 75 46 69 6c 65 53 75 66 66 69 78 33 28 63 6f 6e  uFileSuffix3(con
14930 73 74 20 63 68 61 72 20 2a 7a 42 61 73 65 2c 20  st char *zBase, 
14940 63 68 61 72 20 2a 7a 29 7b 0a 23 69 66 64 65 66  char *z){.#ifdef
14950 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 38   SQLITE_ENABLE_8
14960 5f 33 5f 4e 41 4d 45 53 0a 23 69 66 20 53 51 4c  _3_NAMES.#if SQL
14970 49 54 45 5f 45 4e 41 42 4c 45 5f 38 5f 33 5f 4e  ITE_ENABLE_8_3_N
14980 41 4d 45 53 3c 32 0a 20 20 69 66 28 20 73 71 6c  AMES<2.  if( sql
14990 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e  ite3_uri_boolean
149a0 28 7a 42 61 73 65 2c 20 22 38 5f 33 5f 6e 61 6d  (zBase, "8_3_nam
149b0 65 73 22 2c 20 30 29 20 29 0a 23 65 6e 64 69 66  es", 0) ).#endif
149c0 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20  .  {.    int i, 
149d0 73 7a 3b 0a 20 20 20 20 73 7a 20 3d 20 28 69 6e  sz;.    sz = (in
149e0 74 29 73 74 72 6c 65 6e 28 7a 29 26 30 78 66 66  t)strlen(z)&0xff
149f0 66 66 66 66 3b 0a 20 20 20 20 66 6f 72 28 69 3d  ffff;.    for(i=
14a00 73 7a 2d 31 3b 20 69 3e 30 20 26 26 20 7a 5b 69  sz-1; i>0 && z[i
14a10 5d 21 3d 27 2f 27 20 26 26 20 7a 5b 69 5d 21 3d  ]!='/' && z[i]!=
14a20 27 2e 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20 20 20  '.'; i--){}.    
14a30 69 66 28 20 7a 5b 69 5d 3d 3d 27 2e 27 20 26 26  if( z[i]=='.' &&
14a40 20 73 7a 3e 69 2b 34 20 29 20 6d 65 6d 6d 6f 76   sz>i+4 ) memmov
14a50 65 28 26 7a 5b 69 2b 31 5d 2c 20 26 7a 5b 73 7a  e(&z[i+1], &z[sz
14a60 2d 33 5d 2c 20 34 29 3b 0a 20 20 7d 0a 23 65 6e  -3], 4);.  }.#en
14a70 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  dif.}../*.** Ret
14a80 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  urn the current 
14a90 77 61 6c 2d 69 6e 64 65 78 20 68 65 61 64 65 72  wal-index header
14aa0 20 63 68 65 63 6b 73 75 6d 20 66 6f 72 20 74 68   checksum for th
14ab0 65 20 74 61 72 67 65 74 20 64 61 74 61 62 61 73  e target databas
14ac0 65 20 0a 2a 2a 20 61 73 20 61 20 36 34 2d 62 69  e .** as a 64-bi
14ad0 74 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a  t integer..**.**
14ae0 20 54 68 65 20 63 68 65 63 6b 73 75 6d 20 69 73   The checksum is
14af0 20 73 74 6f 72 65 20 69 6e 20 74 68 65 20 66 69   store in the fi
14b00 72 73 74 20 70 61 67 65 20 6f 66 20 78 53 68 6d  rst page of xShm
14b10 4d 61 70 20 6d 65 6d 6f 72 79 20 61 73 20 61 6e  Map memory as an
14b20 20 38 2d 62 79 74 65 20 0a 2a 2a 20 62 6c 6f 62   8-byte .** blob
14b30 20 73 74 61 72 74 69 6e 67 20 61 74 20 62 79 74   starting at byt
14b40 65 20 6f 66 66 73 65 74 20 34 30 2e 0a 2a 2f 0a  e offset 40..*/.
14b50 73 74 61 74 69 63 20 69 36 34 20 72 62 75 53 68  static i64 rbuSh
14b60 6d 43 68 65 63 6b 73 75 6d 28 73 71 6c 69 74 65  mChecksum(sqlite
14b70 33 72 62 75 20 2a 70 29 7b 0a 20 20 69 36 34 20  3rbu *p){.  i64 
14b80 69 52 65 74 20 3d 20 30 3b 0a 20 20 69 66 28 20  iRet = 0;.  if( 
14b90 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
14ba0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
14bb0 66 69 6c 65 20 2a 70 44 62 20 3d 20 70 2d 3e 70  file *pDb = p->p
14bc0 54 61 72 67 65 74 46 64 2d 3e 70 52 65 61 6c 3b  TargetFd->pReal;
14bd0 0a 20 20 20 20 75 33 32 20 76 6f 6c 61 74 69 6c  .    u32 volatil
14be0 65 20 2a 70 74 72 3b 0a 20 20 20 20 70 2d 3e 72  e *ptr;.    p->r
14bf0 63 20 3d 20 70 44 62 2d 3e 70 4d 65 74 68 6f 64  c = pDb->pMethod
14c00 73 2d 3e 78 53 68 6d 4d 61 70 28 70 44 62 2c 20  s->xShmMap(pDb, 
14c10 30 2c 20 33 32 2a 31 30 32 34 2c 20 30 2c 20 28  0, 32*1024, 0, (
14c20 76 6f 69 64 20 76 6f 6c 61 74 69 6c 65 2a 2a 29  void volatile**)
14c30 26 70 74 72 29 3b 0a 20 20 20 20 69 66 28 20 70  &ptr);.    if( p
14c40 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
14c50 29 7b 0a 20 20 20 20 20 20 69 52 65 74 20 3d 20  ){.      iRet = 
14c60 28 28 69 36 34 29 70 74 72 5b 31 30 5d 20 3c 3c  ((i64)ptr[10] <<
14c70 20 33 32 29 20 2b 20 70 74 72 5b 31 31 5d 3b 0a   32) + ptr[11];.
14c80 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
14c90 72 6e 20 69 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn iRet;.}../*.*
14ca0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
14cb0 69 73 20 63 61 6c 6c 65 64 20 61 73 20 70 61 72  is called as par
14cc0 74 20 6f 66 20 69 6e 69 74 69 61 6c 69 7a 69 6e  t of initializin
14cd0 67 20 6f 72 20 72 65 69 6e 69 74 69 61 6c 69 7a  g or reinitializ
14ce0 69 6e 67 20 61 6e 0a 2a 2a 20 69 6e 63 72 65 6d  ing an.** increm
14cf0 65 6e 74 61 6c 20 63 68 65 63 6b 70 6f 69 6e 74  ental checkpoint
14d00 2e 20 0a 2a 2a 0a 2a 2a 20 49 74 20 70 6f 70 75  . .**.** It popu
14d10 6c 61 74 65 73 20 74 68 65 20 73 71 6c 69 74 65  lates the sqlite
14d20 33 72 62 75 2e 61 46 72 61 6d 65 5b 5d 20 61 72  3rbu.aFrame[] ar
14d30 72 61 79 20 77 69 74 68 20 74 68 65 20 73 65 74  ray with the set
14d40 20 6f 66 20 0a 2a 2a 20 28 77 61 6c 20 66 72 61   of .** (wal fra
14d50 6d 65 20 2d 3e 20 64 62 20 70 61 67 65 29 20 63  me -> db page) c
14d60 6f 70 79 20 6f 70 65 72 61 74 69 6f 6e 73 20 72  opy operations r
14d70 65 71 75 69 72 65 64 20 74 6f 20 63 68 65 63 6b  equired to check
14d80 70 6f 69 6e 74 20 74 68 65 20 0a 2a 2a 20 63 75  point the .** cu
14d90 72 72 65 6e 74 20 77 61 6c 20 66 69 6c 65 2c 20  rrent wal file, 
14da0 61 6e 64 20 6f 62 74 61 69 6e 73 20 74 68 65 20  and obtains the 
14db0 73 65 74 20 6f 66 20 73 68 6d 20 6c 6f 63 6b 73  set of shm locks
14dc0 20 72 65 71 75 69 72 65 64 20 74 6f 20 73 61 66   required to saf
14dd0 65 6c 79 20 0a 2a 2a 20 70 65 72 66 6f 72 6d 20  ely .** perform 
14de0 74 68 65 20 63 6f 70 79 20 6f 70 65 72 61 74 69  the copy operati
14df0 6f 6e 73 20 64 69 72 65 63 74 6c 79 20 6f 6e 20  ons directly on 
14e00 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e  the file-system.
14e10 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65  .**.** If argume
14e20 6e 74 20 70 53 74 61 74 65 20 69 73 20 6e 6f 74  nt pState is not
14e30 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20   NULL, then the 
14e40 69 6e 63 72 65 6d 65 6e 74 61 6c 20 63 68 65 63  incremental chec
14e50 6b 70 6f 69 6e 74 20 69 73 0a 2a 2a 20 62 65 69  kpoint is.** bei
14e60 6e 67 20 72 65 73 75 6d 65 64 2e 20 49 6e 20 74  ng resumed. In t
14e70 68 69 73 20 63 61 73 65 2c 20 69 66 20 74 68 65  his case, if the
14e80 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 74 68 65   checksum of the
14e90 20 77 61 6c 2d 69 6e 64 65 78 2d 68 65 61 64 65   wal-index-heade
14ea0 72 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 72  r.** following r
14eb0 65 63 6f 76 65 72 79 20 69 73 20 6e 6f 74 20 74  ecovery is not t
14ec0 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 63  he same as the c
14ed0 68 65 63 6b 73 75 6d 20 73 61 76 65 64 20 69 6e  hecksum saved in
14ee0 20 74 68 65 20 52 62 75 53 74 61 74 65 0a 2a 2a   the RbuState.**
14ef0 20 6f 62 6a 65 63 74 2c 20 74 68 65 6e 20 74 68   object, then th
14f00 65 20 72 62 75 20 68 61 6e 64 6c 65 20 69 73 20  e rbu handle is 
14f10 73 65 74 20 74 6f 20 44 4f 4e 45 20 73 74 61 74  set to DONE stat
14f20 65 2e 20 54 68 69 73 20 6f 63 63 75 72 73 20 69  e. This occurs i
14f30 66 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20  f some.** other 
14f40 63 6c 69 65 6e 74 20 61 70 70 65 6e 64 73 20 61  client appends a
14f50 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20   transaction to 
14f60 74 68 65 20 77 61 6c 20 66 69 6c 65 20 69 6e 20  the wal file in 
14f70 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a  the middle of.**
14f80 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   an incremental 
14f90 63 68 65 63 6b 70 6f 69 6e 74 2e 0a 2a 2f 0a 73  checkpoint..*/.s
14fa0 74 61 74 69 63 20 76 6f 69 64 20 72 62 75 53 65  tatic void rbuSe
14fb0 74 75 70 43 68 65 63 6b 70 6f 69 6e 74 28 73 71  tupCheckpoint(sq
14fc0 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 52 62 75  lite3rbu *p, Rbu
14fd0 53 74 61 74 65 20 2a 70 53 74 61 74 65 29 7b 0a  State *pState){.
14fe0 0a 20 20 2f 2a 20 49 66 20 70 53 74 61 74 65 20  .  /* If pState 
14ff0 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  is NULL, then th
15000 65 20 77 61 6c 20 66 69 6c 65 20 6d 61 79 20 6e  e wal file may n
15010 6f 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65  ot have been ope
15020 6e 65 64 20 61 6e 64 0a 20 20 2a 2a 20 72 65 63  ned and.  ** rec
15030 6f 76 65 72 65 64 2e 20 52 75 6e 6e 69 6e 67 20  overed. Running 
15040 61 20 72 65 61 64 2d 73 74 61 74 65 6d 65 6e 74  a read-statement
15050 20 68 65 72 65 20 74 6f 20 65 6e 73 75 72 65 20   here to ensure 
15060 74 68 61 74 20 64 6f 69 6e 67 20 73 6f 0a 20 20  that doing so.  
15070 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 69 6e 74 65  ** does not inte
15080 72 66 65 72 65 20 77 69 74 68 20 74 68 65 20 22  rfere with the "
15090 63 61 70 74 75 72 65 22 20 70 72 6f 63 65 73 73  capture" process
150a0 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20 69 66   below.  */.  if
150b0 28 20 70 53 74 61 74 65 3d 3d 30 20 29 7b 0a 20  ( pState==0 ){. 
150c0 20 20 20 70 2d 3e 65 53 74 61 67 65 20 3d 20 30     p->eStage = 0
150d0 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d  ;.    if( p->rc=
150e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
150f0 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69      p->rc = sqli
15100 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 4d 61  te3_exec(p->dbMa
15110 69 6e 2c 20 22 53 45 4c 45 43 54 20 2a 20 46 52  in, "SELECT * FR
15120 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  OM sqlite_master
15130 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ", 0, 0, 0);.   
15140 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 73 73   }.  }..  /* Ass
15150 75 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72 20 68  uming no error h
15160 61 73 20 6f 63 63 75 72 72 65 64 2c 20 72 75 6e  as occurred, run
15170 20 61 20 22 72 65 73 74 61 72 74 22 20 63 68 65   a "restart" che
15180 63 6b 70 6f 69 6e 74 20 77 69 74 68 20 74 68 65  ckpoint with the
15190 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 72 62 75  .  ** sqlite3rbu
151a0 2e 65 53 74 61 67 65 20 76 61 72 69 61 62 6c 65  .eStage variable
151b0 20 73 65 74 20 74 6f 20 43 41 50 54 55 52 45 2e   set to CAPTURE.
151c0 20 54 68 69 73 20 74 75 72 6e 73 20 6f 6e 20 74   This turns on t
151d0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a  he following.  *
151e0 2a 20 73 70 65 63 69 61 6c 20 62 65 68 61 76 69  * special behavi
151f0 6f 75 72 20 69 6e 20 74 68 65 20 72 62 75 20 56  our in the rbu V
15200 46 53 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  FS:.  **.  **   
15210 2a 20 49 66 20 74 68 65 20 65 78 63 6c 75 73 69  * If the exclusi
15220 76 65 20 73 68 6d 20 57 52 49 54 45 52 20 6f 72  ve shm WRITER or
15230 20 52 45 41 44 30 20 6c 6f 63 6b 20 63 61 6e 6e   READ0 lock cann
15240 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 0a  ot be obtained,.
15250 20 20 2a 2a 20 20 20 20 20 74 68 65 20 63 68 65    **     the che
15260 63 6b 70 6f 69 6e 74 20 66 61 69 6c 73 20 77 69  ckpoint fails wi
15270 74 68 20 53 51 4c 49 54 45 5f 42 55 53 59 20 28  th SQLITE_BUSY (
15280 6e 6f 72 6d 61 6c 6c 79 20 53 51 4c 69 74 65 20  normally SQLite 
15290 77 6f 75 6c 64 0a 20 20 2a 2a 20 20 20 20 20 70  would.  **     p
152a0 72 6f 63 65 65 64 20 77 69 74 68 20 72 75 6e 6e  roceed with runn
152b0 69 6e 67 20 61 20 70 61 73 73 69 76 65 20 63 68  ing a passive ch
152c0 65 63 6b 70 6f 69 6e 74 20 69 6e 73 74 65 61 64  eckpoint instead
152d0 20 6f 66 20 66 61 69 6c 69 6e 67 29 2e 0a 20 20   of failing)..  
152e0 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 41 74 74 65  **.  **   * Atte
152f0 6d 70 74 73 20 74 6f 20 72 65 61 64 20 66 72 6f  mpts to read fro
15300 6d 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65  m the *-wal file
15310 20 6f 72 20 77 72 69 74 65 20 74 6f 20 74 68 65   or write to the
15320 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20   database file. 
15330 20 2a 2a 20 20 20 20 20 64 6f 20 6e 6f 74 20 70   **     do not p
15340 65 72 66 6f 72 6d 20 61 6e 79 20 49 4f 2e 20 49  erform any IO. I
15350 6e 73 74 65 61 64 2c 20 74 68 65 20 66 72 61 6d  nstead, the fram
15360 65 2f 70 61 67 65 20 63 6f 6d 62 69 6e 61 74 69  e/page combinati
15370 6f 6e 73 20 74 68 61 74 0a 20 20 2a 2a 20 20 20  ons that.  **   
15380 20 20 77 6f 75 6c 64 20 62 65 20 72 65 61 64 2f    would be read/
15390 77 72 69 74 74 65 6e 20 61 72 65 20 72 65 63 6f  written are reco
153a0 72 64 65 64 20 69 6e 20 74 68 65 20 73 71 6c 69  rded in the sqli
153b0 74 65 33 72 62 75 2e 61 46 72 61 6d 65 5b 5d 0a  te3rbu.aFrame[].
153c0 20 20 2a 2a 20 20 20 20 20 61 72 72 61 79 2e 0a    **     array..
153d0 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 43 61    **.  **   * Ca
153e0 6c 6c 73 20 74 6f 20 78 53 68 6d 4c 6f 63 6b 28  lls to xShmLock(
153f0 55 4e 4c 4f 43 4b 29 20 74 6f 20 72 65 6c 65 61  UNLOCK) to relea
15400 73 65 20 74 68 65 20 65 78 63 6c 75 73 69 76 65  se the exclusive
15410 20 73 68 6d 20 57 52 49 54 45 52 2c 20 0a 20 20   shm WRITER, .  
15420 2a 2a 20 20 20 20 20 52 45 41 44 30 20 61 6e 64  **     READ0 and
15430 20 43 48 45 43 4b 50 4f 49 4e 54 20 6c 6f 63 6b   CHECKPOINT lock
15440 73 20 74 61 6b 65 6e 20 61 73 20 70 61 72 74 20  s taken as part 
15450 6f 66 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e  of the checkpoin
15460 74 20 61 72 65 0a 20 20 2a 2a 20 20 20 20 20 6e  t are.  **     n
15470 6f 2d 6f 70 73 2e 20 54 68 65 73 65 20 6c 6f 63  o-ops. These loc
15480 6b 73 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 72  ks will not be r
15490 65 6c 65 61 73 65 64 20 75 6e 74 69 6c 20 74 68  eleased until th
154a0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 2a  e connection.  *
154b0 2a 20 20 20 20 20 69 73 20 63 6c 6f 73 65 64 2e  *     is closed.
154c0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 41  .  **.  **   * A
154d0 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 78 53 79  ttempting to xSy
154e0 6e 63 28 29 20 74 68 65 20 64 61 74 61 62 61 73  nc() the databas
154f0 65 20 66 69 6c 65 20 63 61 75 73 65 73 20 61 6e  e file causes an
15500 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c   SQLITE_INTERNAL
15510 20 0a 20 20 2a 2a 20 20 20 20 20 65 72 72 6f 72   .  **     error
15520 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 73 20 61  ..  **.  ** As a
15530 20 72 65 73 75 6c 74 2c 20 75 6e 6c 65 73 73 20   result, unless 
15540 61 6e 20 65 72 72 6f 72 20 28 69 2e 65 2e 20 4f  an error (i.e. O
15550 4f 4d 20 6f 72 20 53 51 4c 49 54 45 5f 42 55 53  OM or SQLITE_BUS
15560 59 29 20 6f 63 63 75 72 73 2c 20 74 68 65 0a 20  Y) occurs, the. 
15570 20 2a 2a 20 63 68 65 63 6b 70 6f 69 6e 74 20 62   ** checkpoint b
15580 65 6c 6f 77 20 66 61 69 6c 73 20 77 69 74 68 20  elow fails with 
15590 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c 2c  SQLITE_INTERNAL,
155a0 20 61 6e 64 20 6c 65 61 76 65 73 20 74 68 65 20   and leaves the 
155b0 61 46 72 61 6d 65 5b 5d 0a 20 20 2a 2a 20 61 72  aFrame[].  ** ar
155c0 72 61 79 20 70 6f 70 75 6c 61 74 65 64 20 77 69  ray populated wi
155d0 74 68 20 61 20 73 65 74 20 6f 66 20 28 66 72 61  th a set of (fra
155e0 6d 65 20 2d 3e 20 70 61 67 65 29 20 6d 61 70 70  me -> page) mapp
155f0 69 6e 67 73 2e 20 42 65 63 61 75 73 65 20 74 68  ings. Because th
15600 65 20 0a 20 20 2a 2a 20 57 52 49 54 45 52 2c 20  e .  ** WRITER, 
15610 43 48 45 43 4b 50 4f 49 4e 54 20 61 6e 64 20 52  CHECKPOINT and R
15620 45 41 44 30 20 6c 6f 63 6b 73 20 61 72 65 20 73  EAD0 locks are s
15630 74 69 6c 6c 20 68 65 6c 64 2c 20 69 74 20 69 73  till held, it is
15640 20 73 61 66 65 20 74 6f 20 63 6f 70 79 20 0a 20   safe to copy . 
15650 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68   ** data from th
15660 65 20 77 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20  e wal file into 
15670 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
15680 65 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  e according to t
15690 68 65 20 0a 20 20 2a 2a 20 63 6f 6e 74 65 6e 74  he .  ** content
156a0 73 20 6f 66 20 61 46 72 61 6d 65 5b 5d 2e 0a 20  s of aFrame[].. 
156b0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d   */.  if( p->rc=
156c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
156d0 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 20 20 70    int rc2;.    p
156e0 2d 3e 65 53 74 61 67 65 20 3d 20 52 42 55 5f 53  ->eStage = RBU_S
156f0 54 41 47 45 5f 43 41 50 54 55 52 45 3b 0a 20 20  TAGE_CAPTURE;.  
15700 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f    rc2 = sqlite3_
15710 65 78 65 63 28 70 2d 3e 64 62 4d 61 69 6e 2c 20  exec(p->dbMain, 
15720 22 50 52 41 47 4d 41 20 6d 61 69 6e 2e 77 61 6c  "PRAGMA main.wal
15730 5f 63 68 65 63 6b 70 6f 69 6e 74 3d 72 65 73 74  _checkpoint=rest
15740 61 72 74 22 2c 20 30 2c 20 30 2c 30 29 3b 0a 20  art", 0, 0,0);. 
15750 20 20 20 69 66 28 20 72 63 32 21 3d 53 51 4c 49     if( rc2!=SQLI
15760 54 45 5f 49 4e 54 45 52 4e 41 4c 20 29 20 70 2d  TE_INTERNAL ) p-
15770 3e 72 63 20 3d 20 72 63 32 3b 0a 20 20 7d 0a 0a  >rc = rc2;.  }..
15780 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
15790 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 6e 46 72  ITE_OK && p->nFr
157a0 61 6d 65 3e 30 20 29 7b 0a 20 20 20 20 70 2d 3e  ame>0 ){.    p->
157b0 65 53 74 61 67 65 20 3d 20 52 42 55 5f 53 54 41  eStage = RBU_STA
157c0 47 45 5f 43 4b 50 54 3b 0a 20 20 20 20 70 2d 3e  GE_CKPT;.    p->
157d0 6e 53 74 65 70 20 3d 20 28 70 53 74 61 74 65 20  nStep = (pState 
157e0 3f 20 70 53 74 61 74 65 2d 3e 6e 52 6f 77 20 3a  ? pState->nRow :
157f0 20 30 29 3b 0a 20 20 20 20 70 2d 3e 61 42 75 66   0);.    p->aBuf
15800 20 3d 20 72 62 75 4d 61 6c 6c 6f 63 28 70 2c 20   = rbuMalloc(p, 
15810 70 2d 3e 70 67 73 7a 29 3b 0a 20 20 20 20 70 2d  p->pgsz);.    p-
15820 3e 69 57 61 6c 43 6b 73 75 6d 20 3d 20 72 62 75  >iWalCksum = rbu
15830 53 68 6d 43 68 65 63 6b 73 75 6d 28 70 29 3b 0a  ShmChecksum(p);.
15840 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63    }..  if( p->rc
15850 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
15860 20 20 20 69 66 28 20 70 2d 3e 6e 46 72 61 6d 65     if( p->nFrame
15870 3d 3d 30 20 7c 7c 20 28 70 53 74 61 74 65 20 26  ==0 || (pState &
15880 26 20 70 53 74 61 74 65 2d 3e 69 57 61 6c 43 6b  & pState->iWalCk
15890 73 75 6d 21 3d 70 2d 3e 69 57 61 6c 43 6b 73 75  sum!=p->iWalCksu
158a0 6d 29 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72  m) ){.      p->r
158b0 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  c = SQLITE_DONE;
158c0 0a 20 20 20 20 20 20 70 2d 3e 65 53 74 61 67 65  .      p->eStage
158d0 20 3d 20 52 42 55 5f 53 54 41 47 45 5f 44 4f 4e   = RBU_STAGE_DON
158e0 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  E;.    }else{.  
158f0 20 20 20 20 69 6e 74 20 6e 53 65 63 74 6f 72 53      int nSectorS
15900 69 7a 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ize;.      sqlit
15910 65 33 5f 66 69 6c 65 20 2a 70 44 62 20 3d 20 70  e3_file *pDb = p
15920 2d 3e 70 54 61 72 67 65 74 46 64 2d 3e 70 52 65  ->pTargetFd->pRe
15930 61 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  al;.      sqlite
15940 33 5f 66 69 6c 65 20 2a 70 57 61 6c 20 3d 20 70  3_file *pWal = p
15950 2d 3e 70 54 61 72 67 65 74 46 64 2d 3e 70 57 61  ->pTargetFd->pWa
15960 6c 46 64 2d 3e 70 52 65 61 6c 3b 0a 20 20 20 20  lFd->pReal;.    
15970 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 50 61    assert( p->nPa
15980 67 65 50 65 72 53 65 63 74 6f 72 3d 3d 30 20 29  gePerSector==0 )
15990 3b 0a 20 20 20 20 20 20 6e 53 65 63 74 6f 72 53  ;.      nSectorS
159a0 69 7a 65 20 3d 20 70 44 62 2d 3e 70 4d 65 74 68  ize = pDb->pMeth
159b0 6f 64 73 2d 3e 78 53 65 63 74 6f 72 53 69 7a 65  ods->xSectorSize
159c0 28 70 44 62 29 3b 0a 20 20 20 20 20 20 69 66 28  (pDb);.      if(
159d0 20 6e 53 65 63 74 6f 72 53 69 7a 65 3e 70 2d 3e   nSectorSize>p->
159e0 70 67 73 7a 20 29 7b 0a 20 20 20 20 20 20 20 20  pgsz ){.        
159f0 70 2d 3e 6e 50 61 67 65 50 65 72 53 65 63 74 6f  p->nPagePerSecto
15a00 72 20 3d 20 6e 53 65 63 74 6f 72 53 69 7a 65 20  r = nSectorSize 
15a10 2f 20 70 2d 3e 70 67 73 7a 3b 0a 20 20 20 20 20  / p->pgsz;.     
15a20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
15a30 70 2d 3e 6e 50 61 67 65 50 65 72 53 65 63 74 6f  p->nPagePerSecto
15a40 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 0a  r = 1;.      }..
15a50 20 20 20 20 20 20 2f 2a 20 43 61 6c 6c 20 78 53        /* Call xS
15a60 79 6e 63 28 29 20 6f 6e 20 74 68 65 20 77 61 6c  ync() on the wal
15a70 20 66 69 6c 65 2e 20 54 68 69 73 20 63 61 75 73   file. This caus
15a80 65 73 20 53 51 4c 69 74 65 20 74 6f 20 73 79 6e  es SQLite to syn
15a90 63 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  c the .      ** 
15aa0 64 69 72 65 63 74 6f 72 79 20 69 6e 20 77 68 69  directory in whi
15ab0 63 68 20 74 68 65 20 74 61 72 67 65 74 20 64 61  ch the target da
15ac0 74 61 62 61 73 65 20 61 6e 64 20 74 68 65 20 77  tabase and the w
15ad0 61 6c 20 66 69 6c 65 20 72 65 73 69 64 65 2c 20  al file reside, 
15ae0 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 63 61 73  in .      ** cas
15af0 65 20 69 74 20 68 61 73 20 6e 6f 74 20 62 65 65  e it has not bee
15b00 6e 20 73 79 6e 63 65 64 20 73 69 6e 63 65 20 74  n synced since t
15b10 68 65 20 72 65 6e 61 6d 65 28 29 20 63 61 6c 6c  he rename() call
15b20 20 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 72 62   in .      ** rb
15b30 75 4d 6f 76 65 4f 61 6c 46 69 6c 65 28 29 2e 20  uMoveOalFile(). 
15b40 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  */.      p->rc =
15b50 20 70 57 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d   pWal->pMethods-
15b60 3e 78 53 79 6e 63 28 70 57 61 6c 2c 20 53 51 4c  >xSync(pWal, SQL
15b70 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29  ITE_SYNC_NORMAL)
15b80 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
15b90 2a 0a 2a 2a 20 43 61 6c 6c 65 64 20 77 68 65 6e  *.** Called when
15ba0 20 69 41 6d 74 20 62 79 74 65 73 20 61 72 65 20   iAmt bytes are 
15bb0 72 65 61 64 20 66 72 6f 6d 20 6f 66 66 73 65 74  read from offset
15bc0 20 69 4f 66 66 20 6f 66 20 74 68 65 20 77 61 6c   iOff of the wal
15bd0 20 66 69 6c 65 20 77 68 69 6c 65 0a 2a 2a 20 74   file while.** t
15be0 68 65 20 72 62 75 20 6f 62 6a 65 63 74 20 69 73  he rbu object is
15bf0 20 69 6e 20 63 61 70 74 75 72 65 20 6d 6f 64 65   in capture mode
15c00 2e 20 52 65 63 6f 72 64 20 74 68 65 20 66 72 61  . Record the fra
15c10 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  me number of the
15c20 20 66 72 61 6d 65 0a 2a 2a 20 62 65 69 6e 67 20   frame.** being 
15c30 72 65 61 64 20 69 6e 20 74 68 65 20 61 46 72 61  read in the aFra
15c40 6d 65 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73  me[] array..*/.s
15c50 74 61 74 69 63 20 69 6e 74 20 72 62 75 43 61 70  tatic int rbuCap
15c60 74 75 72 65 57 61 6c 52 65 61 64 28 73 71 6c 69  tureWalRead(sqli
15c70 74 65 33 72 62 75 20 2a 70 52 62 75 2c 20 69 36  te3rbu *pRbu, i6
15c80 34 20 69 4f 66 66 2c 20 69 6e 74 20 69 41 6d 74  4 iOff, int iAmt
15c90 29 7b 0a 20 20 63 6f 6e 73 74 20 75 33 32 20 6d  ){.  const u32 m
15ca0 52 65 71 20 3d 20 28 31 3c 3c 57 41 4c 5f 4c 4f  Req = (1<<WAL_LO
15cb0 43 4b 5f 57 52 49 54 45 29 7c 28 31 3c 3c 57 41  CK_WRITE)|(1<<WA
15cc0 4c 5f 4c 4f 43 4b 5f 43 4b 50 54 29 7c 28 31 3c  L_LOCK_CKPT)|(1<
15cd0 3c 57 41 4c 5f 4c 4f 43 4b 5f 52 45 41 44 30 29  <WAL_LOCK_READ0)
15ce0 3b 0a 20 20 75 33 32 20 69 46 72 61 6d 65 3b 0a  ;.  u32 iFrame;.
15cf0 0a 20 20 69 66 28 20 70 52 62 75 2d 3e 6d 4c 6f  .  if( pRbu->mLo
15d00 63 6b 21 3d 6d 52 65 71 20 29 7b 0a 20 20 20 20  ck!=mReq ){.    
15d10 70 52 62 75 2d 3e 72 63 20 3d 20 53 51 4c 49 54  pRbu->rc = SQLIT
15d20 45 5f 42 55 53 59 3b 0a 20 20 20 20 72 65 74 75  E_BUSY;.    retu
15d30 72 6e 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e  rn SQLITE_INTERN
15d40 41 4c 3b 0a 20 20 7d 0a 0a 20 20 70 52 62 75 2d  AL;.  }..  pRbu-
15d50 3e 70 67 73 7a 20 3d 20 69 41 6d 74 3b 0a 20 20  >pgsz = iAmt;.  
15d60 69 66 28 20 70 52 62 75 2d 3e 6e 46 72 61 6d 65  if( pRbu->nFrame
15d70 3d 3d 70 52 62 75 2d 3e 6e 46 72 61 6d 65 41 6c  ==pRbu->nFrameAl
15d80 6c 6f 63 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  loc ){.    int n
15d90 4e 65 77 20 3d 20 28 70 52 62 75 2d 3e 6e 46 72  New = (pRbu->nFr
15da0 61 6d 65 41 6c 6c 6f 63 20 3f 20 70 52 62 75 2d  ameAlloc ? pRbu-
15db0 3e 6e 46 72 61 6d 65 41 6c 6c 6f 63 20 3a 20 36  >nFrameAlloc : 6
15dc0 34 29 20 2a 20 32 3b 0a 20 20 20 20 52 62 75 46  4) * 2;.    RbuF
15dd0 72 61 6d 65 20 2a 61 4e 65 77 3b 0a 20 20 20 20  rame *aNew;.    
15de0 61 4e 65 77 20 3d 20 28 52 62 75 46 72 61 6d 65  aNew = (RbuFrame
15df0 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f  *)sqlite3_reallo
15e00 63 36 34 28 70 52 62 75 2d 3e 61 46 72 61 6d 65  c64(pRbu->aFrame
15e10 2c 20 6e 4e 65 77 20 2a 20 73 69 7a 65 6f 66 28  , nNew * sizeof(
15e20 52 62 75 46 72 61 6d 65 29 29 3b 0a 20 20 20 20  RbuFrame));.    
15e30 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 20 72 65  if( aNew==0 ) re
15e40 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
15e50 4d 3b 0a 20 20 20 20 70 52 62 75 2d 3e 61 46 72  M;.    pRbu->aFr
15e60 61 6d 65 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20  ame = aNew;.    
15e70 70 52 62 75 2d 3e 6e 46 72 61 6d 65 41 6c 6c 6f  pRbu->nFrameAllo
15e80 63 20 3d 20 6e 4e 65 77 3b 0a 20 20 7d 0a 0a 20  c = nNew;.  }.. 
15e90 20 69 46 72 61 6d 65 20 3d 20 28 75 33 32 29 28   iFrame = (u32)(
15ea0 28 69 4f 66 66 2d 33 32 29 20 2f 20 28 69 36 34  (iOff-32) / (i64
15eb0 29 28 69 41 6d 74 2b 32 34 29 29 20 2b 20 31 3b  )(iAmt+24)) + 1;
15ec0 0a 20 20 69 66 28 20 70 52 62 75 2d 3e 69 4d 61  .  if( pRbu->iMa
15ed0 78 46 72 61 6d 65 3c 69 46 72 61 6d 65 20 29 20  xFrame<iFrame ) 
15ee0 70 52 62 75 2d 3e 69 4d 61 78 46 72 61 6d 65 20  pRbu->iMaxFrame 
15ef0 3d 20 69 46 72 61 6d 65 3b 0a 20 20 70 52 62 75  = iFrame;.  pRbu
15f00 2d 3e 61 46 72 61 6d 65 5b 70 52 62 75 2d 3e 6e  ->aFrame[pRbu->n
15f10 46 72 61 6d 65 5d 2e 69 57 61 6c 46 72 61 6d 65  Frame].iWalFrame
15f20 20 3d 20 69 46 72 61 6d 65 3b 0a 20 20 70 52 62   = iFrame;.  pRb
15f30 75 2d 3e 61 46 72 61 6d 65 5b 70 52 62 75 2d 3e  u->aFrame[pRbu->
15f40 6e 46 72 61 6d 65 5d 2e 69 44 62 50 61 67 65 20  nFrame].iDbPage 
15f50 3d 20 30 3b 0a 20 20 70 52 62 75 2d 3e 6e 46 72  = 0;.  pRbu->nFr
15f60 61 6d 65 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20  ame++;.  return 
15f70 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
15f80 0a 2a 2a 20 43 61 6c 6c 65 64 20 77 68 65 6e 20  .** Called when 
15f90 61 20 70 61 67 65 20 6f 66 20 64 61 74 61 20 69  a page of data i
15fa0 73 20 77 72 69 74 74 65 6e 20 74 6f 20 6f 66 66  s written to off
15fb0 73 65 74 20 69 4f 66 66 20 6f 66 20 74 68 65 20  set iOff of the 
15fc0 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65  database.** file
15fd0 20 77 68 69 6c 65 20 74 68 65 20 72 62 75 20 68   while the rbu h
15fe0 61 6e 64 6c 65 20 69 73 20 69 6e 20 63 61 70 74  andle is in capt
15ff0 75 72 65 20 6d 6f 64 65 2e 20 52 65 63 6f 72 64  ure mode. Record
16000 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
16010 20 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65   .** of the page
16020 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 69   being written i
16030 6e 20 74 68 65 20 61 46 72 61 6d 65 5b 5d 20 61  n the aFrame[] a
16040 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rray..*/.static 
16050 69 6e 74 20 72 62 75 43 61 70 74 75 72 65 44 62  int rbuCaptureDb
16060 57 72 69 74 65 28 73 71 6c 69 74 65 33 72 62 75  Write(sqlite3rbu
16070 20 2a 70 52 62 75 2c 20 69 36 34 20 69 4f 66 66   *pRbu, i64 iOff
16080 29 7b 0a 20 20 70 52 62 75 2d 3e 61 46 72 61 6d  ){.  pRbu->aFram
16090 65 5b 70 52 62 75 2d 3e 6e 46 72 61 6d 65 2d 31  e[pRbu->nFrame-1
160a0 5d 2e 69 44 62 50 61 67 65 20 3d 20 28 75 33 32  ].iDbPage = (u32
160b0 29 28 69 4f 66 66 20 2f 20 70 52 62 75 2d 3e 70  )(iOff / pRbu->p
160c0 67 73 7a 29 20 2b 20 31 3b 0a 20 20 72 65 74 75  gsz) + 1;.  retu
160d0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
160e0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 63  ./*.** This is c
160f0 61 6c 6c 65 64 20 61 73 20 70 61 72 74 20 6f 66  alled as part of
16100 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   an incremental 
16110 63 68 65 63 6b 70 6f 69 6e 74 20 6f 70 65 72 61  checkpoint opera
16120 74 69 6f 6e 2e 20 43 6f 70 79 0a 2a 2a 20 61 20  tion. Copy.** a 
16130 73 69 6e 67 6c 65 20 66 72 61 6d 65 20 6f 66 20  single frame of 
16140 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 77 61  data from the wa
16150 6c 20 66 69 6c 65 20 69 6e 74 6f 20 74 68 65 20  l file into the 
16160 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 61  database file, a
16170 73 0a 2a 2a 20 69 6e 64 69 63 61 74 65 64 20 62  s.** indicated b
16180 79 20 74 68 65 20 52 62 75 46 72 61 6d 65 20 6f  y the RbuFrame o
16190 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  bject..*/.static
161a0 20 76 6f 69 64 20 72 62 75 43 68 65 63 6b 70 6f   void rbuCheckpo
161b0 69 6e 74 46 72 61 6d 65 28 73 71 6c 69 74 65 33  intFrame(sqlite3
161c0 72 62 75 20 2a 70 2c 20 52 62 75 46 72 61 6d 65  rbu *p, RbuFrame
161d0 20 2a 70 46 72 61 6d 65 29 7b 0a 20 20 73 71 6c   *pFrame){.  sql
161e0 69 74 65 33 5f 66 69 6c 65 20 2a 70 57 61 6c 20  ite3_file *pWal 
161f0 3d 20 70 2d 3e 70 54 61 72 67 65 74 46 64 2d 3e  = p->pTargetFd->
16200 70 57 61 6c 46 64 2d 3e 70 52 65 61 6c 3b 0a 20  pWalFd->pReal;. 
16210 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
16220 44 62 20 3d 20 70 2d 3e 70 54 61 72 67 65 74 46  Db = p->pTargetF
16230 64 2d 3e 70 52 65 61 6c 3b 0a 20 20 69 36 34 20  d->pReal;.  i64 
16240 69 4f 66 66 3b 0a 0a 20 20 61 73 73 65 72 74 28  iOff;..  assert(
16250 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
16260 4b 20 29 3b 0a 20 20 69 4f 66 66 20 3d 20 28 69  K );.  iOff = (i
16270 36 34 29 28 70 46 72 61 6d 65 2d 3e 69 57 61 6c  64)(pFrame->iWal
16280 46 72 61 6d 65 2d 31 29 20 2a 20 28 70 2d 3e 70  Frame-1) * (p->p
16290 67 73 7a 20 2b 20 32 34 29 20 2b 20 33 32 20 2b  gsz + 24) + 32 +
162a0 20 32 34 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 70   24;.  p->rc = p
162b0 57 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78  Wal->pMethods->x
162c0 52 65 61 64 28 70 57 61 6c 2c 20 70 2d 3e 61 42  Read(pWal, p->aB
162d0 75 66 2c 20 70 2d 3e 70 67 73 7a 2c 20 69 4f 66  uf, p->pgsz, iOf
162e0 66 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 20  f);.  if( p->rc 
162f0 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 4f 66  ) return;..  iOf
16300 66 20 3d 20 28 69 36 34 29 28 70 46 72 61 6d 65  f = (i64)(pFrame
16310 2d 3e 69 44 62 50 61 67 65 2d 31 29 20 2a 20 70  ->iDbPage-1) * p
16320 2d 3e 70 67 73 7a 3b 0a 20 20 70 2d 3e 72 63 20  ->pgsz;.  p->rc 
16330 3d 20 70 44 62 2d 3e 70 4d 65 74 68 6f 64 73 2d  = pDb->pMethods-
16340 3e 78 57 72 69 74 65 28 70 44 62 2c 20 70 2d 3e  >xWrite(pDb, p->
16350 61 42 75 66 2c 20 70 2d 3e 70 67 73 7a 2c 20 69  aBuf, p->pgsz, i
16360 4f 66 66 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  Off);.}.../*.** 
16370 54 61 6b 65 20 61 6e 20 45 58 43 4c 55 53 49 56  Take an EXCLUSIV
16380 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  E lock on the da
16390 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a  tabase file..*/.
163a0 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75 4c  static void rbuL
163b0 6f 63 6b 44 61 74 61 62 61 73 65 28 73 71 6c 69  ockDatabase(sqli
163c0 74 65 33 72 62 75 20 2a 70 29 7b 0a 20 20 73 71  te3rbu *p){.  sq
163d0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 52 65 61  lite3_file *pRea
163e0 6c 20 3d 20 70 2d 3e 70 54 61 72 67 65 74 46 64  l = p->pTargetFd
163f0 2d 3e 70 52 65 61 6c 3b 0a 20 20 61 73 73 65 72  ->pReal;.  asser
16400 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  t( p->rc==SQLITE
16410 5f 4f 4b 20 29 3b 0a 20 20 70 2d 3e 72 63 20 3d  _OK );.  p->rc =
16420 20 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73   pReal->pMethods
16430 2d 3e 78 4c 6f 63 6b 28 70 52 65 61 6c 2c 20 53  ->xLock(pReal, S
16440 51 4c 49 54 45 5f 4c 4f 43 4b 5f 53 48 41 52 45  QLITE_LOCK_SHARE
16450 44 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  D);.  if( p->rc=
16460 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16470 20 20 70 2d 3e 72 63 20 3d 20 70 52 65 61 6c 2d    p->rc = pReal-
16480 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 4c 6f 63 6b  >pMethods->xLock
16490 28 70 52 65 61 6c 2c 20 53 51 4c 49 54 45 5f 4c  (pReal, SQLITE_L
164a0 4f 43 4b 5f 45 58 43 4c 55 53 49 56 45 29 3b 0a  OCK_EXCLUSIVE);.
164b0 20 20 7d 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e    }.}..#if defin
164c0 65 64 28 5f 57 49 4e 33 32 5f 57 43 45 29 0a 73  ed(_WIN32_WCE).s
164d0 74 61 74 69 63 20 4c 50 57 53 54 52 20 72 62 75  tatic LPWSTR rbu
164e0 57 69 6e 55 74 66 38 54 6f 55 6e 69 63 6f 64 65  WinUtf8ToUnicode
164f0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69  (const char *zFi
16500 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e  lename){.  int n
16510 43 68 61 72 3b 0a 20 20 4c 50 57 53 54 52 20 7a  Char;.  LPWSTR z
16520 57 69 64 65 46 69 6c 65 6e 61 6d 65 3b 0a 0a 20  WideFilename;.. 
16530 20 6e 43 68 61 72 20 3d 20 4d 75 6c 74 69 42 79   nChar = MultiBy
16540 74 65 54 6f 57 69 64 65 43 68 61 72 28 43 50 5f  teToWideChar(CP_
16550 55 54 46 38 2c 20 30 2c 20 7a 46 69 6c 65 6e 61  UTF8, 0, zFilena
16560 6d 65 2c 20 2d 31 2c 20 4e 55 4c 4c 2c 20 30 29  me, -1, NULL, 0)
16570 3b 0a 20 20 69 66 28 20 6e 43 68 61 72 3d 3d 30  ;.  if( nChar==0
16580 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
16590 3b 0a 20 20 7d 0a 20 20 7a 57 69 64 65 46 69 6c  ;.  }.  zWideFil
165a0 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 5f  ename = sqlite3_
165b0 6d 61 6c 6c 6f 63 36 34 28 20 6e 43 68 61 72 2a  malloc64( nChar*
165c0 73 69 7a 65 6f 66 28 7a 57 69 64 65 46 69 6c 65  sizeof(zWideFile
165d0 6e 61 6d 65 5b 30 5d 29 20 29 3b 0a 20 20 69 66  name[0]) );.  if
165e0 28 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 3d  ( zWideFilename=
165f0 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
16600 20 30 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74   0;.  }.  memset
16610 28 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c 20  (zWideFilename, 
16620 30 2c 20 6e 43 68 61 72 2a 73 69 7a 65 6f 66 28  0, nChar*sizeof(
16630 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 5b 30 5d  zWideFilename[0]
16640 29 29 3b 0a 20 20 6e 43 68 61 72 20 3d 20 4d 75  ));.  nChar = Mu
16650 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 61  ltiByteToWideCha
16660 72 28 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 46  r(CP_UTF8, 0, zF
16670 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 57 69  ilename, -1, zWi
16680 64 65 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20  deFilename,.    
16690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
166a0 20 20 20 20 20 20 20 20 20 20 20 20 6e 43 68 61              nCha
166b0 72 29 3b 0a 20 20 69 66 28 20 6e 43 68 61 72 3d  r);.  if( nChar=
166c0 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
166d0 33 5f 66 72 65 65 28 7a 57 69 64 65 46 69 6c 65  3_free(zWideFile
166e0 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 57 69 64 65  name);.    zWide
166f0 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20  Filename = 0;.  
16700 7d 0a 20 20 72 65 74 75 72 6e 20 7a 57 69 64 65  }.  return zWide
16710 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 23 65 6e 64  Filename;.}.#end
16720 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 52 42  if../*.** The RB
16730 55 20 68 61 6e 64 6c 65 20 69 73 20 63 75 72 72  U handle is curr
16740 65 6e 74 6c 79 20 69 6e 20 52 42 55 5f 53 54 41  ently in RBU_STA
16750 47 45 5f 4f 41 4c 20 73 74 61 74 65 2c 20 77 69  GE_OAL state, wi
16760 74 68 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  th a SHARED lock
16770 0a 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62  .** on the datab
16780 61 73 65 20 66 69 6c 65 2e 20 54 68 69 73 20 70  ase file. This p
16790 72 6f 63 20 6d 6f 76 65 73 20 74 68 65 20 2a 2d  roc moves the *-
167a0 6f 61 6c 20 66 69 6c 65 20 74 6f 20 74 68 65 20  oal file to the 
167b0 2a 2d 77 61 6c 20 70 61 74 68 2c 0a 2a 2a 20 74  *-wal path,.** t
167c0 68 65 6e 20 72 65 6f 70 65 6e 73 20 74 68 65 20  hen reopens the 
167d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 74  database file (t
167e0 68 69 73 20 74 69 6d 65 20 69 6e 20 76 61 6e 69  his time in vani
167f0 6c 6c 61 2c 20 6e 6f 6e 2d 6f 61 6c 2c 20 57 41  lla, non-oal, WA
16800 4c 20 6d 6f 64 65 29 2e 0a 2a 2a 20 49 66 20 61  L mode)..** If a
16810 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
16820 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 63  leave an error c
16830 6f 64 65 20 61 6e 64 20 65 72 72 6f 72 20 6d 65  ode and error me
16840 73 73 61 67 65 20 69 6e 20 74 68 65 20 72 62 75  ssage in the rbu
16850 20 0a 2a 2a 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a   .** handle..*/.
16860 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75 4d  static void rbuM
16870 6f 76 65 4f 61 6c 46 69 6c 65 28 73 71 6c 69 74  oveOalFile(sqlit
16880 65 33 72 62 75 20 2a 70 29 7b 0a 20 20 63 6f 6e  e3rbu *p){.  con
16890 73 74 20 63 68 61 72 20 2a 7a 42 61 73 65 20 3d  st char *zBase =
168a0 20 73 71 6c 69 74 65 33 5f 64 62 5f 66 69 6c 65   sqlite3_db_file
168b0 6e 61 6d 65 28 70 2d 3e 64 62 4d 61 69 6e 2c 20  name(p->dbMain, 
168c0 22 6d 61 69 6e 22 29 3b 0a 20 20 63 6f 6e 73 74  "main");.  const
168d0 20 63 68 61 72 20 2a 7a 4d 6f 76 65 20 3d 20 7a   char *zMove = z
168e0 42 61 73 65 3b 0a 20 20 63 68 61 72 20 2a 7a 4f  Base;.  char *zO
168f0 61 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 57 61 6c  al;.  char *zWal
16900 3b 0a 0a 20 20 69 66 28 20 72 62 75 49 73 56 61  ;..  if( rbuIsVa
16910 63 75 75 6d 28 70 29 20 29 7b 0a 20 20 20 20 7a  cuum(p) ){.    z
16920 4d 6f 76 65 20 3d 20 73 71 6c 69 74 65 33 5f 64  Move = sqlite3_d
16930 62 5f 66 69 6c 65 6e 61 6d 65 28 70 2d 3e 64 62  b_filename(p->db
16940 52 62 75 2c 20 22 6d 61 69 6e 22 29 3b 0a 20 20  Rbu, "main");.  
16950 7d 0a 20 20 7a 4f 61 6c 20 3d 20 73 71 6c 69 74  }.  zOal = sqlit
16960 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 2d 6f  e3_mprintf("%s-o
16970 61 6c 22 2c 20 7a 4d 6f 76 65 29 3b 0a 20 20 7a  al", zMove);.  z
16980 57 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Wal = sqlite3_mp
16990 72 69 6e 74 66 28 22 25 73 2d 77 61 6c 22 2c 20  rintf("%s-wal", 
169a0 7a 4d 6f 76 65 29 3b 0a 0a 20 20 61 73 73 65 72  zMove);..  asser
169b0 74 28 20 70 2d 3e 65 53 74 61 67 65 3d 3d 52 42  t( p->eStage==RB
169c0 55 5f 53 54 41 47 45 5f 4d 4f 56 45 20 29 3b 0a  U_STAGE_MOVE );.
169d0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d    assert( p->rc=
169e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d  =SQLITE_OK && p-
169f0 3e 7a 45 72 72 6d 73 67 3d 3d 30 20 29 3b 0a 20  >zErrmsg==0 );. 
16a00 20 69 66 28 20 7a 57 61 6c 3d 3d 30 20 7c 7c 20   if( zWal==0 || 
16a10 7a 4f 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 70  zOal==0 ){.    p
16a20 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ->rc = SQLITE_NO
16a30 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  MEM;.  }else{.  
16a40 20 20 2f 2a 20 4d 6f 76 65 20 74 68 65 20 2a 2d    /* Move the *-
16a50 6f 61 6c 20 66 69 6c 65 20 74 6f 20 2a 2d 77 61  oal file to *-wa
16a60 6c 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  l. At this point
16a70 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 2d 3e 64   connection p->d
16a80 62 20 69 73 0a 20 20 20 20 2a 2a 20 68 6f 6c 64  b is.    ** hold
16a90 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63  ing a SHARED loc
16aa0 6b 20 6f 6e 20 74 68 65 20 74 61 72 67 65 74 20  k on the target 
16ab0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 62  database file (b
16ac0 65 63 61 75 73 65 20 69 74 20 69 73 0a 20 20 20  ecause it is.   
16ad0 20 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f 64 65 29   ** in WAL mode)
16ae0 2e 20 53 6f 20 6e 6f 20 6f 74 68 65 72 20 63 6f  . So no other co
16af0 6e 6e 65 63 74 69 6f 6e 20 6d 61 79 20 62 65 20  nnection may be 
16b00 77 72 69 74 69 6e 67 20 74 68 65 20 64 62 2e 20  writing the db. 
16b10 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
16b20 6e 20 6f 72 64 65 72 20 74 6f 20 65 6e 73 75 72  n order to ensur
16b30 65 20 74 68 61 74 20 74 68 65 72 65 20 61 72 65  e that there are
16b40 20 6e 6f 20 64 61 74 61 62 61 73 65 20 72 65 61   no database rea
16b50 64 65 72 73 2c 20 61 6e 20 45 58 43 4c 55 53 49  ders, an EXCLUSI
16b60 56 45 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 69  VE.    ** lock i
16b70 73 20 6f 62 74 61 69 6e 65 64 20 68 65 72 65 20  s obtained here 
16b80 62 65 66 6f 72 65 20 74 68 65 20 2a 2d 6f 61 6c  before the *-oal
16b90 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 2a 2d 77   is moved to *-w
16ba0 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  al..    */.    r
16bb0 62 75 4c 6f 63 6b 44 61 74 61 62 61 73 65 28 70  buLockDatabase(p
16bc0 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  );.    if( p->rc
16bd0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
16be0 20 20 20 20 20 72 62 75 46 69 6c 65 53 75 66 66       rbuFileSuff
16bf0 69 78 33 28 7a 42 61 73 65 2c 20 7a 57 61 6c 29  ix3(zBase, zWal)
16c00 3b 0a 20 20 20 20 20 20 72 62 75 46 69 6c 65 53  ;.      rbuFileS
16c10 75 66 66 69 78 33 28 7a 42 61 73 65 2c 20 7a 4f  uffix3(zBase, zO
16c20 61 6c 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 52  al);..      /* R
16c30 65 2d 6f 70 65 6e 20 74 68 65 20 64 61 74 61 62  e-open the datab
16c40 61 73 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 72  ases. */.      r
16c50 62 75 4f 62 6a 49 74 65 72 46 69 6e 61 6c 69 7a  buObjIterFinaliz
16c60 65 28 26 70 2d 3e 6f 62 6a 69 74 65 72 29 3b 0a  e(&p->objiter);.
16c70 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c        sqlite3_cl
16c80 6f 73 65 28 70 2d 3e 64 62 52 62 75 29 3b 0a 20  ose(p->dbRbu);. 
16c90 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f       sqlite3_clo
16ca0 73 65 28 70 2d 3e 64 62 4d 61 69 6e 29 3b 0a 20  se(p->dbMain);. 
16cb0 20 20 20 20 20 70 2d 3e 64 62 4d 61 69 6e 20 3d       p->dbMain =
16cc0 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 64 62 52   0;.      p->dbR
16cd0 62 75 20 3d 20 30 3b 0a 0a 23 69 66 20 64 65 66  bu = 0;..#if def
16ce0 69 6e 65 64 28 5f 57 49 4e 33 32 5f 57 43 45 29  ined(_WIN32_WCE)
16cf0 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
16d00 20 4c 50 57 53 54 52 20 7a 57 69 64 65 4f 61 6c   LPWSTR zWideOal
16d10 3b 0a 20 20 20 20 20 20 20 20 4c 50 57 53 54 52  ;.        LPWSTR
16d20 20 7a 57 69 64 65 57 61 6c 3b 0a 0a 20 20 20 20   zWideWal;..    
16d30 20 20 20 20 7a 57 69 64 65 4f 61 6c 20 3d 20 72      zWideOal = r
16d40 62 75 57 69 6e 55 74 66 38 54 6f 55 6e 69 63 6f  buWinUtf8ToUnico
16d50 64 65 28 7a 4f 61 6c 29 3b 0a 20 20 20 20 20 20  de(zOal);.      
16d60 20 20 69 66 28 20 7a 57 69 64 65 4f 61 6c 20 29    if( zWideOal )
16d70 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 57 69 64  {.          zWid
16d80 65 57 61 6c 20 3d 20 72 62 75 57 69 6e 55 74 66  eWal = rbuWinUtf
16d90 38 54 6f 55 6e 69 63 6f 64 65 28 7a 57 61 6c 29  8ToUnicode(zWal)
16da0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
16db0 7a 57 69 64 65 57 61 6c 20 29 7b 0a 20 20 20 20  zWideWal ){.    
16dc0 20 20 20 20 20 20 20 20 69 66 28 20 4d 6f 76 65          if( Move
16dd0 46 69 6c 65 57 28 7a 57 69 64 65 4f 61 6c 2c 20  FileW(zWideOal, 
16de0 7a 57 69 64 65 57 61 6c 29 20 29 7b 0a 20 20 20  zWideWal) ){.   
16df0 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63             p->rc
16e00 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
16e10 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
16e20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
16e30 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f  ->rc = SQLITE_IO
16e40 45 52 52 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ERR;.           
16e50 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73   }.            s
16e60 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 57 69 64  qlite3_free(zWid
16e70 65 57 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 20  eWal);.         
16e80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
16e90 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
16ea0 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a  TE_IOERR_NOMEM;.
16eb0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
16ec0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
16ed0 65 65 28 7a 57 69 64 65 4f 61 6c 29 3b 0a 20 20  ee(zWideOal);.  
16ee0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
16ef0 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53         p->rc = S
16f00 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
16f10 4d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  M;.        }.   
16f20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20     }.#else.     
16f30 20 70 2d 3e 72 63 20 3d 20 72 65 6e 61 6d 65 28   p->rc = rename(
16f40 7a 4f 61 6c 2c 20 7a 57 61 6c 29 20 3f 20 53 51  zOal, zWal) ? SQ
16f50 4c 49 54 45 5f 49 4f 45 52 52 20 3a 20 53 51 4c  LITE_IOERR : SQL
16f60 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a  ITE_OK;.#endif..
16f70 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
16f80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16f90 20 20 20 20 20 20 72 62 75 4f 70 65 6e 44 61 74        rbuOpenDat
16fa0 61 62 61 73 65 28 70 2c 20 30 29 3b 0a 20 20 20  abase(p, 0);.   
16fb0 20 20 20 20 20 72 62 75 53 65 74 75 70 43 68 65       rbuSetupChe
16fc0 63 6b 70 6f 69 6e 74 28 70 2c 20 30 29 3b 0a 20  ckpoint(p, 0);. 
16fd0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
16fe0 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ..  sqlite3_free
16ff0 28 7a 57 61 6c 29 3b 0a 20 20 73 71 6c 69 74 65  (zWal);.  sqlite
17000 33 5f 66 72 65 65 28 7a 4f 61 6c 29 3b 0a 7d 0a  3_free(zOal);.}.
17010 0a 2f 2a 0a 2a 2a 20 54 68 65 20 53 45 4c 45 43  ./*.** The SELEC
17020 54 20 73 74 61 74 65 6d 65 6e 74 20 69 74 65 72  T statement iter
17030 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20 74 68  ating through th
17040 65 20 6b 65 79 73 20 66 6f 72 20 74 68 65 20 63  e keys for the c
17050 75 72 72 65 6e 74 20 6f 62 6a 65 63 74 0a 2a 2a  urrent object.**
17060 20 28 70 2d 3e 6f 62 6a 69 74 65 72 2e 70 53 65   (p->objiter.pSe
17070 6c 65 63 74 29 20 63 75 72 72 65 6e 74 6c 79 20  lect) currently 
17080 70 6f 69 6e 74 73 20 74 6f 20 61 20 76 61 6c 69  points to a vali
17090 64 20 72 6f 77 2e 20 54 68 69 73 20 66 75 6e 63  d row. This func
170a0 74 69 6f 6e 0a 2a 2a 20 64 65 74 65 72 6d 69 6e  tion.** determin
170b0 65 73 20 74 68 65 20 74 79 70 65 20 6f 66 20 6f  es the type of o
170c0 70 65 72 61 74 69 6f 6e 20 72 65 71 75 65 73 74  peration request
170d0 65 64 20 62 79 20 74 68 69 73 20 72 6f 77 20 61  ed by this row a
170e0 6e 64 20 72 65 74 75 72 6e 73 0a 2a 2a 20 6f 6e  nd returns.** on
170f0 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
17100 6e 67 20 76 61 6c 75 65 73 20 74 6f 20 69 6e 64  ng values to ind
17110 69 63 61 74 65 20 74 68 65 20 72 65 73 75 6c 74  icate the result
17120 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 52 42  :.**.**     * RB
17130 55 5f 49 4e 53 45 52 54 0a 2a 2a 20 20 20 20 20  U_INSERT.**     
17140 2a 20 52 42 55 5f 44 45 4c 45 54 45 0a 2a 2a 20  * RBU_DELETE.** 
17150 20 20 20 20 2a 20 52 42 55 5f 49 44 58 5f 44 45      * RBU_IDX_DE
17160 4c 45 54 45 0a 2a 2a 20 20 20 20 20 2a 20 52 42  LETE.**     * RB
17170 55 5f 55 50 44 41 54 45 0a 2a 2a 0a 2a 2a 20 49  U_UPDATE.**.** I
17180 66 20 52 42 55 5f 55 50 44 41 54 45 20 69 73 20  f RBU_UPDATE is 
17190 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 6f  returned, then o
171a0 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 20 2a  utput variable *
171b0 70 7a 4d 61 73 6b 20 69 73 20 73 65 74 20 74 6f  pzMask is set to
171c0 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  .** point to the
171d0 20 74 65 78 74 20 76 61 6c 75 65 20 69 6e 64 69   text value indi
171e0 63 61 74 69 6e 67 20 74 68 65 20 63 6f 6c 75 6d  cating the colum
171f0 6e 73 20 74 6f 20 75 70 64 61 74 65 2e 0a 2a 2a  ns to update..**
17200 0a 2a 2a 20 49 66 20 74 68 65 20 72 62 75 5f 63  .** If the rbu_c
17210 6f 6e 74 72 6f 6c 20 66 69 65 6c 64 20 63 6f 6e  ontrol field con
17220 74 61 69 6e 73 20 61 6e 20 69 6e 76 61 6c 69 64  tains an invalid
17230 20 76 61 6c 75 65 2c 20 61 6e 20 65 72 72 6f 72   value, an error
17240 20 63 6f 64 65 20 61 6e 64 0a 2a 2a 20 6d 65 73   code and.** mes
17250 73 61 67 65 20 61 72 65 20 6c 65 66 74 20 69 6e  sage are left in
17260 20 74 68 65 20 52 42 55 20 68 61 6e 64 6c 65 20   the RBU handle 
17270 61 6e 64 20 7a 65 72 6f 20 72 65 74 75 72 6e 65  and zero returne
17280 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
17290 20 72 62 75 53 74 65 70 54 79 70 65 28 73 71 6c   rbuStepType(sql
172a0 69 74 65 33 72 62 75 20 2a 70 2c 20 63 6f 6e 73  ite3rbu *p, cons
172b0 74 20 63 68 61 72 20 2a 2a 70 7a 4d 61 73 6b 29  t char **pzMask)
172c0 7b 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70  {.  int iCol = p
172d0 2d 3e 6f 62 6a 69 74 65 72 2e 6e 43 6f 6c 3b 20  ->objiter.nCol; 
172e0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
172f0 72 62 75 5f 63 6f 6e 74 72 6f 6c 20 63 6f 6c 75  rbu_control colu
17300 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 20  mn */.  int res 
17310 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
17320 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
17330 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 73 77  n value */..  sw
17340 69 74 63 68 28 20 73 71 6c 69 74 65 33 5f 63 6f  itch( sqlite3_co
17350 6c 75 6d 6e 5f 74 79 70 65 28 70 2d 3e 6f 62 6a  lumn_type(p->obj
17360 69 74 65 72 2e 70 53 65 6c 65 63 74 2c 20 69 43  iter.pSelect, iC
17370 6f 6c 29 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ol) ){.    case 
17380 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a 20  SQLITE_INTEGER: 
17390 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 56 61 6c  {.      int iVal
173a0 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
173b0 6e 5f 69 6e 74 28 70 2d 3e 6f 62 6a 69 74 65 72  n_int(p->objiter
173c0 2e 70 53 65 6c 65 63 74 2c 20 69 43 6f 6c 29 3b  .pSelect, iCol);
173d0 0a 20 20 20 20 20 20 73 77 69 74 63 68 28 20 69  .      switch( i
173e0 56 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 63  Val ){.        c
173f0 61 73 65 20 30 3a 20 72 65 73 20 3d 20 52 42 55  ase 0: res = RBU
17400 5f 49 4e 53 45 52 54 3b 20 20 20 20 20 62 72 65  _INSERT;     bre
17410 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65  ak;.        case
17420 20 31 3a 20 72 65 73 20 3d 20 52 42 55 5f 44 45   1: res = RBU_DE
17430 4c 45 54 45 3b 20 20 20 20 20 62 72 65 61 6b 3b  LETE;     break;
17440 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 32 3a  .        case 2:
17450 20 72 65 73 20 3d 20 52 42 55 5f 52 45 50 4c 41   res = RBU_REPLA
17460 43 45 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  CE;    break;.  
17470 20 20 20 20 20 20 63 61 73 65 20 33 3a 20 72 65        case 3: re
17480 73 20 3d 20 52 42 55 5f 49 44 58 5f 44 45 4c 45  s = RBU_IDX_DELE
17490 54 45 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  TE; break;.     
174a0 20 20 20 63 61 73 65 20 34 3a 20 72 65 73 20 3d     case 4: res =
174b0 20 52 42 55 5f 49 44 58 5f 49 4e 53 45 52 54 3b   RBU_IDX_INSERT;
174c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
174d0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
174e0 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c   }..    case SQL
174f0 49 54 45 5f 54 45 58 54 3a 20 7b 0a 20 20 20 20  ITE_TEXT: {.    
17500 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
17510 20 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74   char *z = sqlit
17520 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
17530 2d 3e 6f 62 6a 69 74 65 72 2e 70 53 65 6c 65 63  ->objiter.pSelec
17540 74 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20  t, iCol);.      
17550 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20  if( z==0 ){.    
17560 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
17570 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
17580 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2a  }else{.        *
17590 70 7a 4d 61 73 6b 20 3d 20 28 63 6f 6e 73 74 20  pzMask = (const 
175a0 63 68 61 72 2a 29 7a 3b 0a 20 20 20 20 20 20 7d  char*)z;.      }
175b0 0a 20 20 20 20 20 20 72 65 73 20 3d 20 52 42 55  .      res = RBU
175c0 5f 55 50 44 41 54 45 3b 0a 0a 20 20 20 20 20 20  _UPDATE;..      
175d0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
175e0 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
175f0 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 69   break;.  }..  i
17600 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20  f( res==0 ){.   
17610 20 72 62 75 42 61 64 43 6f 6e 74 72 6f 6c 45 72   rbuBadControlEr
17620 72 6f 72 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65  ror(p);.  }.  re
17630 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 23 69 66  turn res;.}..#if
17640 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
17650 0a 2f 2a 0a 2a 2a 20 41 73 73 65 72 74 20 74 68  ./*.** Assert th
17660 61 74 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 20 6f  at column iCol o
17670 66 20 73 74 61 74 65 6d 65 6e 74 20 70 53 74 6d  f statement pStm
17680 74 20 69 73 20 6e 61 6d 65 64 20 7a 4e 61 6d 65  t is named zName
17690 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
176a0 20 61 73 73 65 72 74 43 6f 6c 75 6d 6e 4e 61 6d   assertColumnNam
176b0 65 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a  e(sqlite3_stmt *
176c0 70 53 74 6d 74 2c 20 69 6e 74 20 69 43 6f 6c 2c  pStmt, int iCol,
176d0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
176e0 6d 65 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  me){.  const cha
176f0 72 20 2a 7a 43 6f 6c 20 3d 20 73 71 6c 69 74 65  r *zCol = sqlite
17700 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53  3_column_name(pS
17710 74 6d 74 2c 20 69 43 6f 6c 29 3b 0a 20 20 61 73  tmt, iCol);.  as
17720 73 65 72 74 28 20 30 3d 3d 73 71 6c 69 74 65 33  sert( 0==sqlite3
17730 5f 73 74 72 69 63 6d 70 28 7a 4e 61 6d 65 2c 20  _stricmp(zName, 
17740 7a 43 6f 6c 29 20 29 3b 0a 7d 0a 23 65 6c 73 65  zCol) );.}.#else
17750 0a 23 20 64 65 66 69 6e 65 20 61 73 73 65 72 74  .# define assert
17760 43 6f 6c 75 6d 6e 4e 61 6d 65 28 78 2c 79 2c 7a  ColumnName(x,y,z
17770 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
17780 41 72 67 75 6d 65 6e 74 20 65 54 79 70 65 20 6d  Argument eType m
17790 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20 52 42  ust be one of RB
177a0 55 5f 49 4e 53 45 52 54 2c 20 52 42 55 5f 44 45  U_INSERT, RBU_DE
177b0 4c 45 54 45 2c 20 52 42 55 5f 49 44 58 5f 49 4e  LETE, RBU_IDX_IN
177c0 53 45 52 54 20 6f 72 0a 2a 2a 20 52 42 55 5f 49  SERT or.** RBU_I
177d0 44 58 5f 44 45 4c 45 54 45 2e 20 54 68 69 73 20  DX_DELETE. This 
177e0 66 75 6e 63 74 69 6f 6e 20 70 65 72 66 6f 72 6d  function perform
177f0 73 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 61 20  s the work of a 
17800 73 69 6e 67 6c 65 0a 2a 2a 20 73 71 6c 69 74 65  single.** sqlite
17810 33 72 62 75 5f 73 74 65 70 28 29 20 63 61 6c 6c  3rbu_step() call
17820 20 66 6f 72 20 74 68 65 20 74 79 70 65 20 6f 66   for the type of
17830 20 6f 70 65 72 61 74 69 6f 6e 20 73 70 65 63 69   operation speci
17840 66 69 65 64 20 62 79 20 65 54 79 70 65 2e 0a 2a  fied by eType..*
17850 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62  /.static void rb
17860 75 53 74 65 70 4f 6e 65 4f 70 28 73 71 6c 69 74  uStepOneOp(sqlit
17870 65 33 72 62 75 20 2a 70 2c 20 69 6e 74 20 65 54  e3rbu *p, int eT
17880 79 70 65 29 7b 0a 20 20 52 62 75 4f 62 6a 49 74  ype){.  RbuObjIt
17890 65 72 20 2a 70 49 74 65 72 20 3d 20 26 70 2d 3e  er *pIter = &p->
178a0 6f 62 6a 69 74 65 72 3b 0a 20 20 73 71 6c 69 74  objiter;.  sqlit
178b0 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a  e3_value *pVal;.
178c0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
178d0 70 57 72 69 74 65 72 3b 0a 20 20 69 6e 74 20 69  pWriter;.  int i
178e0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ;..  assert( p->
178f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
17900 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65  .  assert( eType
17910 21 3d 52 42 55 5f 44 45 4c 45 54 45 20 7c 7c 20  !=RBU_DELETE || 
17920 70 49 74 65 72 2d 3e 7a 49 64 78 3d 3d 30 20 29  pIter->zIdx==0 )
17930 3b 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70  ;.  assert( eTyp
17940 65 3d 3d 52 42 55 5f 44 45 4c 45 54 45 20 7c 7c  e==RBU_DELETE ||
17950 20 65 54 79 70 65 3d 3d 52 42 55 5f 49 44 58 5f   eType==RBU_IDX_
17960 44 45 4c 45 54 45 0a 20 20 20 20 20 20 20 7c 7c  DELETE.       ||
17970 20 65 54 79 70 65 3d 3d 52 42 55 5f 49 4e 53 45   eType==RBU_INSE
17980 52 54 20 7c 7c 20 65 54 79 70 65 3d 3d 52 42 55  RT || eType==RBU
17990 5f 49 44 58 5f 49 4e 53 45 52 54 0a 20 20 29 3b  _IDX_INSERT.  );
179a0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
179b0 73 20 61 20 64 65 6c 65 74 65 2c 20 64 65 63 72  s a delete, decr
179c0 65 6d 65 6e 74 20 6e 50 68 61 73 65 4f 6e 65 53  ement nPhaseOneS
179d0 74 65 70 20 62 79 20 6e 49 6e 64 65 78 2e 20 49  tep by nIndex. I
179e0 66 20 74 68 65 20 44 45 4c 45 54 45 0a 20 20 2a  f the DELETE.  *
179f0 2a 20 73 74 61 74 65 6d 65 6e 74 20 62 65 6c 6f  * statement belo
17a00 77 20 64 6f 65 73 20 61 63 74 75 61 6c 6c 79 20  w does actually 
17a10 64 65 6c 65 74 65 20 61 20 72 6f 77 2c 20 6e 50  delete a row, nP
17a20 68 61 73 65 4f 6e 65 53 74 65 70 20 77 69 6c 6c  haseOneStep will
17a30 20 62 65 0a 20 20 2a 2a 20 69 6e 63 72 65 6d 65   be.  ** increme
17a40 6e 74 65 64 20 62 79 20 74 68 65 20 73 61 6d 65  nted by the same
17a50 20 61 6d 6f 75 6e 74 20 77 68 65 6e 20 53 51 4c   amount when SQL
17a60 20 66 75 6e 63 74 69 6f 6e 20 72 62 75 5f 74 6d   function rbu_tm
17a70 70 5f 69 6e 73 65 72 74 28 29 0a 20 20 2a 2a 20  p_insert().  ** 
17a80 69 73 20 69 6e 76 6f 6b 65 64 20 62 79 20 74 68  is invoked by th
17a90 65 20 74 72 69 67 67 65 72 2e 20 20 2a 2f 0a 20  e trigger.  */. 
17aa0 20 69 66 28 20 65 54 79 70 65 3d 3d 52 42 55 5f   if( eType==RBU_
17ab0 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 70 2d  DELETE ){.    p-
17ac0 3e 6e 50 68 61 73 65 4f 6e 65 53 74 65 70 20 2d  >nPhaseOneStep -
17ad0 3d 20 70 2d 3e 6f 62 6a 69 74 65 72 2e 6e 49 6e  = p->objiter.nIn
17ae0 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  dex;.  }..  if( 
17af0 65 54 79 70 65 3d 3d 52 42 55 5f 49 44 58 5f 44  eType==RBU_IDX_D
17b00 45 4c 45 54 45 20 7c 7c 20 65 54 79 70 65 3d 3d  ELETE || eType==
17b10 52 42 55 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20  RBU_DELETE ){.  
17b20 20 20 70 57 72 69 74 65 72 20 3d 20 70 49 74 65    pWriter = pIte
17b30 72 2d 3e 70 44 65 6c 65 74 65 3b 0a 20 20 7d 65  r->pDelete;.  }e
17b40 6c 73 65 7b 0a 20 20 20 20 70 57 72 69 74 65 72  lse{.    pWriter
17b50 20 3d 20 70 49 74 65 72 2d 3e 70 49 6e 73 65 72   = pIter->pInser
17b60 74 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 3d  t;.  }..  for(i=
17b70 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 43 6f 6c  0; i<pIter->nCol
17b80 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 49  ; i++){.    /* I
17b90 66 20 74 68 69 73 20 69 73 20 61 6e 20 49 4e 53  f this is an INS
17ba0 45 52 54 20 69 6e 74 6f 20 61 20 74 61 62 6c 65  ERT into a table
17bb0 20 62 2d 74 72 65 65 20 61 6e 64 20 74 68 65 20   b-tree and the 
17bc0 74 61 62 6c 65 20 68 61 73 20 61 6e 0a 20 20 20  table has an.   
17bd0 20 2a 2a 20 65 78 70 6c 69 63 69 74 20 49 4e 54   ** explicit INT
17be0 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
17bf0 2c 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 69  , check that thi
17c00 73 20 69 73 20 6e 6f 74 20 61 6e 20 61 74 74 65  s is not an atte
17c10 6d 70 74 0a 20 20 20 20 2a 2a 20 74 6f 20 77 72  mpt.    ** to wr
17c20 69 74 65 20 61 20 4e 55 4c 4c 20 69 6e 74 6f 20  ite a NULL into 
17c30 74 68 65 20 49 50 4b 20 63 6f 6c 75 6d 6e 2e 20  the IPK column. 
17c40 54 68 61 74 20 69 73 20 6e 6f 74 20 70 65 72 6d  That is not perm
17c50 69 74 74 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69  itted.  */.    i
17c60 66 28 20 65 54 79 70 65 3d 3d 52 42 55 5f 49 4e  f( eType==RBU_IN
17c70 53 45 52 54 20 0a 20 20 20 20 20 26 26 20 70 49  SERT .     && pI
17c80 74 65 72 2d 3e 7a 49 64 78 3d 3d 30 20 26 26 20  ter->zIdx==0 && 
17c90 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42  pIter->eType==RB
17ca0 55 5f 50 4b 5f 49 50 4b 20 26 26 20 70 49 74 65  U_PK_IPK && pIte
17cb0 72 2d 3e 61 62 54 62 6c 50 6b 5b 69 5d 20 0a 20  r->abTblPk[i] . 
17cc0 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 5f 63      && sqlite3_c
17cd0 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 49 74 65 72  olumn_type(pIter
17ce0 2d 3e 70 53 65 6c 65 63 74 2c 20 69 29 3d 3d 53  ->pSelect, i)==S
17cf0 51 4c 49 54 45 5f 4e 55 4c 4c 0a 20 20 20 20 29  QLITE_NULL.    )
17d00 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20  {.      p->rc = 
17d10 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48 3b  SQLITE_MISMATCH;
17d20 0a 20 20 20 20 20 20 70 2d 3e 7a 45 72 72 6d 73  .      p->zErrms
17d30 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  g = sqlite3_mpri
17d40 6e 74 66 28 22 64 61 74 61 74 79 70 65 20 6d 69  ntf("datatype mi
17d50 73 6d 61 74 63 68 22 29 3b 0a 20 20 20 20 20 20  smatch");.      
17d60 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20  return;.    }.. 
17d70 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 52 42     if( eType==RB
17d80 55 5f 44 45 4c 45 54 45 20 26 26 20 70 49 74 65  U_DELETE && pIte
17d90 72 2d 3e 61 62 54 62 6c 50 6b 5b 69 5d 3d 3d 30  r->abTblPk[i]==0
17da0 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e   ){.      contin
17db0 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  ue;.    }..    p
17dc0 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  Val = sqlite3_co
17dd0 6c 75 6d 6e 5f 76 61 6c 75 65 28 70 49 74 65 72  lumn_value(pIter
17de0 2d 3e 70 53 65 6c 65 63 74 2c 20 69 29 3b 0a 20  ->pSelect, i);. 
17df0 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74     p->rc = sqlit
17e00 65 33 5f 62 69 6e 64 5f 76 61 6c 75 65 28 70 57  e3_bind_value(pW
17e10 72 69 74 65 72 2c 20 69 2b 31 2c 20 70 56 61 6c  riter, i+1, pVal
17e20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  );.    if( p->rc
17e30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20   ) return;.  }. 
17e40 20 69 66 28 20 70 49 74 65 72 2d 3e 7a 49 64 78   if( pIter->zIdx
17e50 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ==0 ){.    if( p
17e60 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55  Iter->eType==RBU
17e70 5f 50 4b 5f 56 54 41 42 20 0a 20 20 20 20 20 7c  _PK_VTAB .     |
17e80 7c 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d  | pIter->eType==
17e90 52 42 55 5f 50 4b 5f 4e 4f 4e 45 20 0a 20 20 20  RBU_PK_NONE .   
17ea0 20 20 7c 7c 20 28 70 49 74 65 72 2d 3e 65 54 79    || (pIter->eTy
17eb0 70 65 3d 3d 52 42 55 5f 50 4b 5f 45 58 54 45 52  pe==RBU_PK_EXTER
17ec0 4e 41 4c 20 26 26 20 72 62 75 49 73 56 61 63 75  NAL && rbuIsVacu
17ed0 75 6d 28 70 29 29 20 0a 20 20 20 20 29 7b 0a 20  um(p)) .    ){. 
17ee0 20 20 20 20 20 2f 2a 20 46 6f 72 20 61 20 76 69       /* For a vi
17ef0 72 74 75 61 6c 20 74 61 62 6c 65 2c 20 6f 72 20  rtual table, or 
17f00 61 20 74 61 62 6c 65 20 77 69 74 68 20 6e 6f 20  a table with no 
17f10 70 72 69 6d 61 72 79 20 6b 65 79 2c 20 74 68 65  primary key, the
17f20 20 0a 20 20 20 20 20 20 2a 2a 20 53 45 4c 45 43   .      ** SELEC
17f30 54 20 73 74 61 74 65 6d 65 6e 74 20 69 73 3a 0a  T statement is:.
17f40 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
17f50 2a 20 20 20 53 45 4c 45 43 54 20 3c 63 6f 6c 73  *   SELECT <cols
17f60 3e 2c 20 72 62 75 5f 63 6f 6e 74 72 6f 6c 2c 20  >, rbu_control, 
17f70 72 62 75 5f 72 6f 77 69 64 20 46 52 4f 4d 20 2e  rbu_rowid FROM .
17f80 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ....      **.   
17f90 20 20 20 2a 2a 20 48 65 6e 63 65 20 63 6f 6c 75     ** Hence colu
17fa0 6d 6e 5f 76 61 6c 75 65 28 70 49 74 65 72 2d 3e  mn_value(pIter->
17fb0 6e 43 6f 6c 2b 31 29 2e 0a 20 20 20 20 20 20 2a  nCol+1)..      *
17fc0 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 43 6f  /.      assertCo
17fd0 6c 75 6d 6e 4e 61 6d 65 28 70 49 74 65 72 2d 3e  lumnName(pIter->
17fe0 70 53 65 6c 65 63 74 2c 20 70 49 74 65 72 2d 3e  pSelect, pIter->
17ff0 6e 43 6f 6c 2b 31 2c 20 0a 20 20 20 20 20 20 20  nCol+1, .       
18000 20 20 20 72 62 75 49 73 56 61 63 75 75 6d 28 70     rbuIsVacuum(p
18010 29 20 3f 20 22 72 6f 77 69 64 22 20 3a 20 22 72  ) ? "rowid" : "r
18020 62 75 5f 72 6f 77 69 64 22 0a 20 20 20 20 20 20  bu_rowid".      
18030 29 3b 0a 20 20 20 20 20 20 70 56 61 6c 20 3d 20  );.      pVal = 
18040 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 76  sqlite3_column_v
18050 61 6c 75 65 28 70 49 74 65 72 2d 3e 70 53 65 6c  alue(pIter->pSel
18060 65 63 74 2c 20 70 49 74 65 72 2d 3e 6e 43 6f 6c  ect, pIter->nCol
18070 2b 31 29 3b 0a 20 20 20 20 20 20 70 2d 3e 72 63  +1);.      p->rc
18080 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f   = sqlite3_bind_
18090 76 61 6c 75 65 28 70 57 72 69 74 65 72 2c 20 70  value(pWriter, p
180a0 49 74 65 72 2d 3e 6e 43 6f 6c 2b 31 2c 20 70 56  Iter->nCol+1, pV
180b0 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  al);.    }.  }. 
180c0 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
180d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
180e0 69 74 65 33 5f 73 74 65 70 28 70 57 72 69 74 65  ite3_step(pWrite
180f0 72 29 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20  r);.    p->rc = 
18100 72 65 73 65 74 41 6e 64 43 6f 6c 6c 65 63 74 45  resetAndCollectE
18110 72 72 6f 72 28 70 57 72 69 74 65 72 2c 20 26 70  rror(pWriter, &p
18120 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a 20 20 7d 0a  ->zErrmsg);.  }.
18130 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
18140 6e 63 74 69 6f 6e 20 64 6f 65 73 20 74 68 65 20  nction does the 
18150 77 6f 72 6b 20 66 6f 72 20 61 6e 20 73 71 6c 69  work for an sqli
18160 74 65 33 72 62 75 5f 73 74 65 70 28 29 20 63 61  te3rbu_step() ca
18170 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 62  ll..**.** The ob
18180 6a 65 63 74 2d 69 74 65 72 61 74 6f 72 20 28 70  ject-iterator (p
18190 2d 3e 6f 62 6a 69 74 65 72 29 20 63 75 72 72 65  ->objiter) curre
181a0 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 61  ntly points to a
181b0 20 76 61 6c 69 64 20 6f 62 6a 65 63 74 2c 0a 2a   valid object,.*
181c0 2a 20 61 6e 64 20 74 68 65 20 69 6e 70 75 74 20  * and the input 
181d0 63 75 72 73 6f 72 20 28 70 2d 3e 6f 62 6a 69 74  cursor (p->objit
181e0 65 72 2e 70 53 65 6c 65 63 74 29 20 63 75 72 72  er.pSelect) curr
181f0 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20  ently points to 
18200 61 20 76 61 6c 69 64 0a 2a 2a 20 69 6e 70 75 74  a valid.** input
18210 20 72 6f 77 2e 20 50 65 72 66 6f 72 6d 20 77 68   row. Perform wh
18220 61 74 65 76 65 72 20 70 72 6f 63 65 73 73 69 6e  atever processin
18230 67 20 69 73 20 72 65 71 75 69 72 65 64 20 61 6e  g is required an
18240 64 20 72 65 74 75 72 6e 2e 0a 2a 2a 0a 2a 2a 20  d return..**.** 
18250 49 66 20 6e 6f 20 20 65 72 72 6f 72 20 6f 63 63  If no  error occ
18260 75 72 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  urs, SQLITE_OK i
18270 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
18280 72 77 69 73 65 2c 20 61 6e 20 65 72 72 6f 72 20  rwise, an error 
18290 63 6f 64 65 0a 2a 2a 20 61 6e 64 20 6d 65 73 73  code.** and mess
182a0 61 67 65 20 69 73 20 6c 65 66 74 20 69 6e 20 74  age is left in t
182b0 68 65 20 52 42 55 20 68 61 6e 64 6c 65 20 61 6e  he RBU handle an
182c0 64 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  d a copy of the 
182d0 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 72 65  error code.** re
182e0 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
182f0 63 20 69 6e 74 20 72 62 75 53 74 65 70 28 73 71  c int rbuStep(sq
18300 6c 69 74 65 33 72 62 75 20 2a 70 29 7b 0a 20 20  lite3rbu *p){.  
18310 52 62 75 4f 62 6a 49 74 65 72 20 2a 70 49 74 65  RbuObjIter *pIte
18320 72 20 3d 20 26 70 2d 3e 6f 62 6a 69 74 65 72 3b  r = &p->objiter;
18330 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
18340 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Mask = 0;.  int 
18350 65 54 79 70 65 20 3d 20 72 62 75 53 74 65 70 54  eType = rbuStepT
18360 79 70 65 28 70 2c 20 26 7a 4d 61 73 6b 29 3b 0a  ype(p, &zMask);.
18370 0a 20 20 69 66 28 20 65 54 79 70 65 20 29 7b 0a  .  if( eType ){.
18380 20 20 20 20 61 73 73 65 72 74 28 20 65 54 79 70      assert( eTyp
18390 65 3d 3d 52 42 55 5f 49 4e 53 45 52 54 20 20 20  e==RBU_INSERT   
183a0 20 20 7c 7c 20 65 54 79 70 65 3d 3d 52 42 55 5f    || eType==RBU_
183b0 44 45 4c 45 54 45 0a 20 20 20 20 20 20 20 20 20  DELETE.         
183c0 7c 7c 20 65 54 79 70 65 3d 3d 52 42 55 5f 52 45  || eType==RBU_RE
183d0 50 4c 41 43 45 20 20 20 20 7c 7c 20 65 54 79 70  PLACE    || eTyp
183e0 65 3d 3d 52 42 55 5f 49 44 58 5f 44 45 4c 45 54  e==RBU_IDX_DELET
183f0 45 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 65 54  E.         || eT
18400 79 70 65 3d 3d 52 42 55 5f 49 44 58 5f 49 4e 53  ype==RBU_IDX_INS
18410 45 52 54 20 7c 7c 20 65 54 79 70 65 3d 3d 52 42  ERT || eType==RB
18420 55 5f 55 50 44 41 54 45 0a 20 20 20 20 29 3b 0a  U_UPDATE.    );.
18430 20 20 20 20 61 73 73 65 72 74 28 20 65 54 79 70      assert( eTyp
18440 65 21 3d 52 42 55 5f 55 50 44 41 54 45 20 7c 7c  e!=RBU_UPDATE ||
18450 20 70 49 74 65 72 2d 3e 7a 49 64 78 3d 3d 30 20   pIter->zIdx==0 
18460 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 49 74 65  );..    if( pIte
18470 72 2d 3e 7a 49 64 78 3d 3d 30 20 26 26 20 28 65  r->zIdx==0 && (e
18480 54 79 70 65 3d 3d 52 42 55 5f 49 44 58 5f 44 45  Type==RBU_IDX_DE
18490 4c 45 54 45 20 7c 7c 20 65 54 79 70 65 3d 3d 52  LETE || eType==R
184a0 42 55 5f 49 44 58 5f 49 4e 53 45 52 54 29 20 29  BU_IDX_INSERT) )
184b0 7b 0a 20 20 20 20 20 20 72 62 75 42 61 64 43 6f  {.      rbuBadCo
184c0 6e 74 72 6f 6c 45 72 72 6f 72 28 70 29 3b 0a 20  ntrolError(p);. 
184d0 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69 66     }.    else if
184e0 28 20 65 54 79 70 65 3d 3d 52 42 55 5f 52 45 50  ( eType==RBU_REP
184f0 4c 41 43 45 20 29 7b 0a 20 20 20 20 20 20 69 66  LACE ){.      if
18500 28 20 70 49 74 65 72 2d 3e 7a 49 64 78 3d 3d 30  ( pIter->zIdx==0
18510 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e   ){.        p->n
18520 50 68 61 73 65 4f 6e 65 53 74 65 70 20 2b 3d 20  PhaseOneStep += 
18530 70 2d 3e 6f 62 6a 69 74 65 72 2e 6e 49 6e 64 65  p->objiter.nInde
18540 78 3b 0a 20 20 20 20 20 20 20 20 72 62 75 53 74  x;.        rbuSt
18550 65 70 4f 6e 65 4f 70 28 70 2c 20 52 42 55 5f 44  epOneOp(p, RBU_D
18560 45 4c 45 54 45 29 3b 0a 20 20 20 20 20 20 7d 0a  ELETE);.      }.
18570 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
18580 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 62 75  =SQLITE_OK ) rbu
18590 53 74 65 70 4f 6e 65 4f 70 28 70 2c 20 52 42 55  StepOneOp(p, RBU
185a0 5f 49 4e 53 45 52 54 29 3b 0a 20 20 20 20 7d 0a  _INSERT);.    }.
185b0 20 20 20 20 65 6c 73 65 20 69 66 28 20 65 54 79      else if( eTy
185c0 70 65 21 3d 52 42 55 5f 55 50 44 41 54 45 20 29  pe!=RBU_UPDATE )
185d0 7b 0a 20 20 20 20 20 20 72 62 75 53 74 65 70 4f  {.      rbuStepO
185e0 6e 65 4f 70 28 70 2c 20 65 54 79 70 65 29 3b 0a  neOp(p, eType);.
185f0 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 7b 0a      }.    else{.
18600 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61        sqlite3_va
18610 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 20 20 20  lue *pVal;.     
18620 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
18630 55 70 64 61 74 65 20 3d 20 30 3b 0a 20 20 20 20  Update = 0;.    
18640 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d    assert( eType=
18650 3d 52 42 55 5f 55 50 44 41 54 45 20 29 3b 0a 20  =RBU_UPDATE );. 
18660 20 20 20 20 20 70 2d 3e 6e 50 68 61 73 65 4f 6e       p->nPhaseOn
18670 65 53 74 65 70 20 2d 3d 20 70 2d 3e 6f 62 6a 69  eStep -= p->obji
18680 74 65 72 2e 6e 49 6e 64 65 78 3b 0a 20 20 20 20  ter.nIndex;.    
18690 20 20 72 62 75 47 65 74 55 70 64 61 74 65 53 74    rbuGetUpdateSt
186a0 6d 74 28 70 2c 20 70 49 74 65 72 2c 20 7a 4d 61  mt(p, pIter, zMa
186b0 73 6b 2c 20 26 70 55 70 64 61 74 65 29 3b 0a 20  sk, &pUpdate);. 
186c0 20 20 20 20 20 69 66 28 20 70 55 70 64 61 74 65       if( pUpdate
186d0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
186e0 69 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  i;.        for(i
186f0 3d 30 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  =0; p->rc==SQLIT
18700 45 5f 4f 4b 20 26 26 20 69 3c 70 49 74 65 72 2d  E_OK && i<pIter-
18710 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCol; i++){.   
18720 20 20 20 20 20 20 20 63 68 61 72 20 63 20 3d 20         char c = 
18730 7a 4d 61 73 6b 5b 70 49 74 65 72 2d 3e 61 69 53  zMask[pIter->aiS
18740 72 63 4f 72 64 65 72 5b 69 5d 5d 3b 0a 20 20 20  rcOrder[i]];.   
18750 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20 73 71         pVal = sq
18760 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c  lite3_column_val
18770 75 65 28 70 49 74 65 72 2d 3e 70 53 65 6c 65 63  ue(pIter->pSelec
18780 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20  t, i);.         
18790 20 69 66 28 20 70 49 74 65 72 2d 3e 61 62 54 62   if( pIter->abTb
187a0 6c 50 6b 5b 69 5d 20 7c 7c 20 63 21 3d 27 2e 27  lPk[i] || c!='.'
187b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
187c0 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  p->rc = sqlite3_
187d0 62 69 6e 64 5f 76 61 6c 75 65 28 70 55 70 64 61  bind_value(pUpda
187e0 74 65 2c 20 69 2b 31 2c 20 70 56 61 6c 29 3b 0a  te, i+1, pVal);.
187f0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
18800 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
18810 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
18820 4f 4b 20 0a 20 20 20 20 20 20 20 20 20 26 26 20  OK .         && 
18830 28 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52  (pIter->eType==R
18840 42 55 5f 50 4b 5f 56 54 41 42 20 7c 7c 20 70 49  BU_PK_VTAB || pI
18850 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f  ter->eType==RBU_
18860 50 4b 5f 4e 4f 4e 45 29 20 0a 20 20 20 20 20 20  PK_NONE) .      
18870 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f    ){.          /
18880 2a 20 42 69 6e 64 20 74 68 65 20 72 62 75 5f 72  * Bind the rbu_r
18890 6f 77 69 64 20 76 61 6c 75 65 20 74 6f 20 63 6f  owid value to co
188a0 6c 75 6d 6e 20 5f 72 6f 77 69 64 5f 20 2a 2f 0a  lumn _rowid_ */.
188b0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
188c0 43 6f 6c 75 6d 6e 4e 61 6d 65 28 70 49 74 65 72  ColumnName(pIter
188d0 2d 3e 70 53 65 6c 65 63 74 2c 20 70 49 74 65 72  ->pSelect, pIter
188e0 2d 3e 6e 43 6f 6c 2b 31 2c 20 22 72 62 75 5f 72  ->nCol+1, "rbu_r
188f0 6f 77 69 64 22 29 3b 0a 20 20 20 20 20 20 20 20  owid");.        
18900 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33    pVal = sqlite3
18910 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28 70 49  _column_value(pI
18920 74 65 72 2d 3e 70 53 65 6c 65 63 74 2c 20 70 49  ter->pSelect, pI
18930 74 65 72 2d 3e 6e 43 6f 6c 2b 31 29 3b 0a 20 20  ter->nCol+1);.  
18940 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
18950 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 76 61 6c  sqlite3_bind_val
18960 75 65 28 70 55 70 64 61 74 65 2c 20 70 49 74 65  ue(pUpdate, pIte
18970 72 2d 3e 6e 43 6f 6c 2b 31 2c 20 70 56 61 6c 29  r->nCol+1, pVal)
18980 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
18990 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
189a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
189b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
189c0 65 70 28 70 55 70 64 61 74 65 29 3b 0a 20 20 20  ep(pUpdate);.   
189d0 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72         p->rc = r
189e0 65 73 65 74 41 6e 64 43 6f 6c 6c 65 63 74 45 72  esetAndCollectEr
189f0 72 6f 72 28 70 55 70 64 61 74 65 2c 20 26 70 2d  ror(pUpdate, &p-
18a00 3e 7a 45 72 72 6d 73 67 29 3b 0a 20 20 20 20 20  >zErrmsg);.     
18a10 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
18a20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
18a30 70 2d 3e 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  p->rc;.}../*.** 
18a40 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 73 63  Increment the sc
18a50 68 65 6d 61 20 63 6f 6f 6b 69 65 20 6f 66 20 74  hema cookie of t
18a60 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
18a70 20 6f 70 65 6e 65 64 20 62 79 20 70 2d 3e 64 62   opened by p->db
18a80 4d 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20  Main..**.** Or, 
18a90 69 66 20 74 68 69 73 20 69 73 20 61 6e 20 52 42  if this is an RB
18aa0 55 20 76 61 63 75 75 6d 2c 20 73 65 74 20 74 68  U vacuum, set th
18ab0 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20  e schema cookie 
18ac0 6f 66 20 74 68 65 20 6d 61 69 6e 20 64 62 0a 2a  of the main db.*
18ad0 2a 20 6f 70 65 6e 65 64 20 62 79 20 70 2d 3e 64  * opened by p->d
18ae0 62 4d 61 69 6e 20 74 6f 20 6f 6e 65 20 6d 6f 72  bMain to one mor
18af0 65 20 74 68 61 6e 20 74 68 65 20 73 63 68 65 6d  e than the schem
18b00 61 20 63 6f 6f 6b 69 65 20 6f 66 20 74 68 65 20  a cookie of the 
18b10 6d 61 69 6e 0a 2a 2a 20 64 62 20 6f 70 65 6e 65  main.** db opene
18b20 64 20 62 79 20 70 2d 3e 64 62 52 62 75 2e 0a 2a  d by p->dbRbu..*
18b30 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62  /.static void rb
18b40 75 49 6e 63 72 53 63 68 65 6d 61 43 6f 6f 6b 69  uIncrSchemaCooki
18b50 65 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 29  e(sqlite3rbu *p)
18b60 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  {.  if( p->rc==S
18b70 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
18b80 73 71 6c 69 74 65 33 20 2a 64 62 72 65 61 64 20  sqlite3 *dbread 
18b90 3d 20 28 72 62 75 49 73 56 61 63 75 75 6d 28 70  = (rbuIsVacuum(p
18ba0 29 20 3f 20 70 2d 3e 64 62 52 62 75 20 3a 20 70  ) ? p->dbRbu : p
18bb0 2d 3e 64 62 4d 61 69 6e 29 3b 0a 20 20 20 20 69  ->dbMain);.    i
18bc0 6e 74 20 69 43 6f 6f 6b 69 65 20 3d 20 31 30 30  nt iCookie = 100
18bd0 30 30 30 30 3b 0a 20 20 20 20 73 71 6c 69 74 65  0000;.    sqlite
18be0 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a  3_stmt *pStmt;..
18bf0 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70      p->rc = prep
18c00 61 72 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72  areAndCollectErr
18c10 6f 72 28 64 62 72 65 61 64 2c 20 26 70 53 74 6d  or(dbread, &pStm
18c20 74 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 20  t, &p->zErrmsg, 
18c30 0a 20 20 20 20 20 20 20 20 22 50 52 41 47 4d 41  .        "PRAGMA
18c40 20 73 63 68 65 6d 61 5f 76 65 72 73 69 6f 6e 22   schema_version"
18c50 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
18c60 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
18c70 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 6f 76   ){.      /* Cov
18c80 65 72 61 67 65 3a 20 69 74 20 6d 61 79 20 62 65  erage: it may be
18c90 20 74 68 61 74 20 74 68 69 73 20 73 71 6c 69 74   that this sqlit
18ca0 65 33 5f 73 74 65 70 28 29 20 63 61 6e 6e 6f 74  e3_step() cannot
18cb0 20 66 61 69 6c 2e 20 54 68 65 72 65 0a 20 20 20   fail. There.   
18cc0 20 20 20 2a 2a 20 69 73 20 61 6c 72 65 61 64 79     ** is already
18cd0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f   a transaction o
18ce0 70 65 6e 2c 20 73 6f 20 74 68 65 20 70 72 65 70  pen, so the prep
18cf0 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 63  ared statement c
18d00 61 6e 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20 74  annot.      ** t
18d10 68 72 6f 77 20 61 6e 20 53 51 4c 49 54 45 5f 53  hrow an SQLITE_S
18d20 43 48 45 4d 41 20 65 78 63 65 70 74 69 6f 6e 2e  CHEMA exception.
18d30 20 54 68 65 20 6f 6e 6c 79 20 64 61 74 61 62 61   The only databa
18d40 73 65 20 70 61 67 65 20 74 68 65 0a 20 20 20 20  se page the.    
18d50 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 72    ** statement r
18d60 65 61 64 73 20 69 73 20 70 61 67 65 20 31 2c 20  eads is page 1, 
18d70 77 68 69 63 68 20 69 73 20 67 75 61 72 61 6e 74  which is guarant
18d80 65 65 64 20 74 6f 20 62 65 20 69 6e 20 74 68 65  eed to be in the
18d90 20 63 61 63 68 65 2e 0a 20 20 20 20 20 20 2a 2a   cache..      **
18da0 20 41 6e 64 20 6e 6f 20 6d 65 6d 6f 72 79 20 61   And no memory a
18db0 6c 6c 6f 63 61 74 69 6f 6e 73 20 61 72 65 20 72  llocations are r
18dc0 65 71 75 69 72 65 64 2e 20 20 2a 2f 0a 20 20 20  equired.  */.   
18dd0 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f     if( SQLITE_RO
18de0 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28  W==sqlite3_step(
18df0 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20 20  pStmt) ){.      
18e00 20 20 69 43 6f 6f 6b 69 65 20 3d 20 73 71 6c 69    iCookie = sqli
18e10 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
18e20 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  Stmt, 0);.      
18e30 7d 0a 20 20 20 20 20 20 72 62 75 46 69 6e 61 6c  }.      rbuFinal
18e40 69 7a 65 28 70 2c 20 70 53 74 6d 74 29 3b 0a 20  ize(p, pStmt);. 
18e50 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e     }.    if( p->
18e60 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
18e70 0a 20 20 20 20 20 20 72 62 75 4d 50 72 69 6e 74  .      rbuMPrint
18e80 66 45 78 65 63 28 70 2c 20 70 2d 3e 64 62 4d 61  fExec(p, p->dbMa
18e90 69 6e 2c 20 22 50 52 41 47 4d 41 20 73 63 68 65  in, "PRAGMA sche
18ea0 6d 61 5f 76 65 72 73 69 6f 6e 20 3d 20 25 64 22  ma_version = %d"
18eb0 2c 20 69 43 6f 6f 6b 69 65 2b 31 29 3b 0a 20 20  , iCookie+1);.  
18ec0 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
18ed0 20 55 70 64 61 74 65 20 74 68 65 20 63 6f 6e 74   Update the cont
18ee0 65 6e 74 73 20 6f 66 20 74 68 65 20 72 62 75 5f  ents of the rbu_
18ef0 73 74 61 74 65 20 74 61 62 6c 65 20 77 69 74 68  state table with
18f00 69 6e 20 74 68 65 20 72 62 75 20 64 61 74 61 62  in the rbu datab
18f10 61 73 65 2e 20 54 68 65 0a 2a 2a 20 76 61 6c 75  ase. The.** valu
18f20 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  e stored in the 
18f30 52 42 55 5f 53 54 41 54 45 5f 53 54 41 47 45 20  RBU_STATE_STAGE 
18f40 63 6f 6c 75 6d 6e 20 69 73 20 65 53 74 61 67 65  column is eStage
18f50 2e 20 41 6c 6c 20 6f 74 68 65 72 20 76 61 6c 75  . All other valu
18f60 65 73 0a 2a 2a 20 61 72 65 20 64 65 74 65 72 6d  es.** are determ
18f70 69 6e 65 64 20 62 79 20 69 6e 73 70 65 63 74 69  ined by inspecti
18f80 6e 67 20 74 68 65 20 72 62 75 20 68 61 6e 64 6c  ng the rbu handl
18f90 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
18fa0 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a  first argument..
18fb0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
18fc0 62 75 53 61 76 65 53 74 61 74 65 28 73 71 6c 69  buSaveState(sqli
18fd0 74 65 33 72 62 75 20 2a 70 2c 20 69 6e 74 20 65  te3rbu *p, int e
18fe0 53 74 61 67 65 29 7b 0a 20 20 69 66 28 20 70 2d  Stage){.  if( p-
18ff0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc==SQLITE_OK |
19000 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  | p->rc==SQLITE_
19010 44 4f 4e 45 20 29 7b 0a 20 20 20 20 73 71 6c 69  DONE ){.    sqli
19020 74 65 33 5f 73 74 6d 74 20 2a 70 49 6e 73 65 72  te3_stmt *pInser
19030 74 20 3d 20 30 3b 0a 20 20 20 20 72 62 75 5f 66  t = 0;.    rbu_f
19040 69 6c 65 20 2a 70 46 64 20 3d 20 28 72 62 75 49  ile *pFd = (rbuI
19050 73 56 61 63 75 75 6d 28 70 29 20 3f 20 70 2d 3e  sVacuum(p) ? p->
19060 70 52 62 75 46 64 20 3a 20 70 2d 3e 70 54 61 72  pRbuFd : p->pTar
19070 67 65 74 46 64 29 3b 0a 20 20 20 20 69 6e 74 20  getFd);.    int 
19080 72 63 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  rc;..    assert(
19090 20 70 2d 3e 7a 45 72 72 6d 73 67 3d 3d 30 20 29   p->zErrmsg==0 )
190a0 3b 0a 20 20 20 20 72 63 20 3d 20 70 72 65 70 61  ;.    rc = prepa
190b0 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74  reFreeAndCollect
190c0 45 72 72 6f 72 28 70 2d 3e 64 62 52 62 75 2c 20  Error(p->dbRbu, 
190d0 26 70 49 6e 73 65 72 74 2c 20 26 70 2d 3e 7a 45  &pInsert, &p->zE
190e0 72 72 6d 73 67 2c 20 0a 20 20 20 20 20 20 20 20  rrmsg, .        
190f0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
19100 0a 20 20 20 20 20 20 20 20 20 20 22 49 4e 53 45  .          "INSE
19110 52 54 20 4f 52 20 52 45 50 4c 41 43 45 20 49 4e  RT OR REPLACE IN
19120 54 4f 20 25 73 2e 72 62 75 5f 73 74 61 74 65 28  TO %s.rbu_state(
19130 6b 2c 20 76 29 20 56 41 4c 55 45 53 20 22 0a 20  k, v) VALUES ". 
19140 20 20 20 20 20 20 20 20 20 22 28 25 64 2c 20 25           "(%d, %
19150 64 29 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20  d), ".          
19160 22 28 25 64 2c 20 25 51 29 2c 20 22 0a 20 20 20  "(%d, %Q), ".   
19170 20 20 20 20 20 20 20 22 28 25 64 2c 20 25 51 29         "(%d, %Q)
19180 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 22 28  , ".          "(
19190 25 64 2c 20 25 64 29 2c 20 22 0a 20 20 20 20 20  %d, %d), ".     
191a0 20 20 20 20 20 22 28 25 64 2c 20 25 64 29 2c 20       "(%d, %d), 
191b0 22 0a 20 20 20 20 20 20 20 20 20 20 22 28 25 64  ".          "(%d
191c0 2c 20 25 6c 6c 64 29 2c 20 22 0a 20 20 20 20 20  , %lld), ".     
191d0 20 20 20 20 20 22 28 25 64 2c 20 25 6c 6c 64 29       "(%d, %lld)
191e0 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 22 28  , ".          "(
191f0 25 64 2c 20 25 6c 6c 64 29 2c 20 22 0a 20 20 20  %d, %lld), ".   
19200 20 20 20 20 20 20 20 22 28 25 64 2c 20 25 6c 6c         "(%d, %ll
19210 64 29 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d) ",.          
19220 70 2d 3e 7a 53 74 61 74 65 44 62 2c 0a 20 20 20  p->zStateDb,.   
19230 20 20 20 20 20 20 20 52 42 55 5f 53 54 41 54 45         RBU_STATE
19240 5f 53 54 41 47 45 2c 20 65 53 74 61 67 65 2c 0a  _STAGE, eStage,.
19250 20 20 20 20 20 20 20 20 20 20 52 42 55 5f 53 54            RBU_ST
19260 41 54 45 5f 54 42 4c 2c 20 70 2d 3e 6f 62 6a 69  ATE_TBL, p->obji
19270 74 65 72 2e 7a 54 62 6c 2c 20 0a 20 20 20 20 20  ter.zTbl, .     
19280 20 20 20 20 20 52 42 55 5f 53 54 41 54 45 5f 49       RBU_STATE_I
19290 44 58 2c 20 70 2d 3e 6f 62 6a 69 74 65 72 2e 7a  DX, p->objiter.z
192a0 49 64 78 2c 20 0a 20 20 20 20 20 20 20 20 20 20  Idx, .          
192b0 52 42 55 5f 53 54 41 54 45 5f 52 4f 57 2c 20 70  RBU_STATE_ROW, p
192c0 2d 3e 6e 53 74 65 70 2c 20 0a 20 20 20 20 20 20  ->nStep, .      
192d0 20 20 20 20 52 42 55 5f 53 54 41 54 45 5f 50 52      RBU_STATE_PR
192e0 4f 47 52 45 53 53 2c 20 70 2d 3e 6e 50 72 6f 67  OGRESS, p->nProg
192f0 72 65 73 73 2c 0a 20 20 20 20 20 20 20 20 20 20  ress,.          
19300 52 42 55 5f 53 54 41 54 45 5f 43 4b 50 54 2c 20  RBU_STATE_CKPT, 
19310 70 2d 3e 69 57 61 6c 43 6b 73 75 6d 2c 0a 20 20  p->iWalCksum,.  
19320 20 20 20 20 20 20 20 20 52 42 55 5f 53 54 41 54          RBU_STAT
19330 45 5f 43 4f 4f 4b 49 45 2c 20 28 69 36 34 29 70  E_COOKIE, (i64)p
19340 46 64 2d 3e 69 43 6f 6f 6b 69 65 2c 0a 20 20 20  Fd->iCookie,.   
19350 20 20 20 20 20 20 20 52 42 55 5f 53 54 41 54 45         RBU_STATE
19360 5f 4f 41 4c 53 5a 2c 20 70 2d 3e 69 4f 61 6c 53  _OALSZ, p->iOalS
19370 7a 2c 0a 20 20 20 20 20 20 20 20 20 20 52 42 55  z,.          RBU
19380 5f 53 54 41 54 45 5f 50 48 41 53 45 4f 4e 45 53  _STATE_PHASEONES
19390 54 45 50 2c 20 70 2d 3e 6e 50 68 61 73 65 4f 6e  TEP, p->nPhaseOn
193a0 65 53 74 65 70 0a 20 20 20 20 20 20 29 0a 20 20  eStep.      ).  
193b0 20 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28    );.    assert(
193c0 20 70 49 6e 73 65 72 74 3d 3d 30 20 7c 7c 20 72   pInsert==0 || r
193d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
193e0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
193f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
19400 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 49 6e  sqlite3_step(pIn
19410 73 65 72 74 29 3b 0a 20 20 20 20 20 20 72 63 20  sert);.      rc 
19420 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69  = sqlite3_finali
19430 7a 65 28 70 49 6e 73 65 72 74 29 3b 0a 20 20 20  ze(pInsert);.   
19440 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
19450 51 4c 49 54 45 5f 4f 4b 20 29 20 70 2d 3e 72 63  QLITE_OK ) p->rc
19460 20 3d 20 72 63 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f   = rc;.  }.}.../
19470 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20  *.** The second 
19480 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20  argument passed 
19490 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
194a0 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
194b0 61 20 50 52 41 47 4d 41 20 0a 2a 2a 20 73 65 74  a PRAGMA .** set
194c0 74 69 6e 67 20 2d 20 22 70 61 67 65 5f 73 69 7a  ting - "page_siz
194d0 65 22 2c 20 22 61 75 74 6f 5f 76 61 63 75 75 6d  e", "auto_vacuum
194e0 22 2c 20 22 75 73 65 72 5f 76 65 72 73 69 6f 6e  ", "user_version
194f0 22 20 6f 72 20 22 61 70 70 6c 69 63 61 74 69 6f  " or "applicatio
19500 6e 5f 69 64 22 2e 0a 2a 2a 20 54 68 69 73 20 66  n_id"..** This f
19510 75 6e 63 74 69 6f 6e 20 65 78 65 63 75 74 65 73  unction executes
19520 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f   the following o
19530 6e 20 73 71 6c 69 74 65 33 72 62 75 2e 64 62 52  n sqlite3rbu.dbR
19540 62 75 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 50 52 41  bu:.**.**   "PRA
19550 47 4d 41 20 6d 61 69 6e 2e 24 7a 50 72 61 67 6d  GMA main.$zPragm
19560 61 22 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 24  a".**.** where $
19570 7a 50 72 61 67 6d 61 20 69 73 20 74 68 65 20 73  zPragma is the s
19580 74 72 69 6e 67 20 70 61 73 73 65 64 20 61 73 20  tring passed as 
19590 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
195a0 65 6e 74 2c 20 74 68 65 6e 0a 2a 2a 20 6f 6e 20  ent, then.** on 
195b0 73 71 6c 69 74 65 33 72 62 75 2e 64 62 4d 61 69  sqlite3rbu.dbMai
195c0 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 50 52 41 47  n:.**.**   "PRAG
195d0 4d 41 20 6d 61 69 6e 2e 24 7a 50 72 61 67 6d 61  MA main.$zPragma
195e0 20 3d 20 24 76 61 6c 22 0a 2a 2a 0a 2a 2a 20 77   = $val".**.** w
195f0 68 65 72 65 20 24 76 61 6c 20 69 73 20 74 68 65  here $val is the
19600 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
19610 62 79 20 74 68 65 20 66 69 72 73 74 20 50 52 41  by the first PRA
19620 47 4d 41 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 0a  GMA invocation..
19630 2a 2a 0a 2a 2a 20 49 6e 20 73 68 6f 72 74 2c 20  **.** In short, 
19640 69 74 20 63 6f 70 69 65 73 20 74 68 65 20 76 61  it copies the va
19650 6c 75 65 20 20 6f 66 20 74 68 65 20 73 70 65 63  lue  of the spec
19660 69 66 69 65 64 20 50 52 41 47 4d 41 20 73 65 74  ified PRAGMA set
19670 74 69 6e 67 20 66 72 6f 6d 0a 2a 2a 20 64 62 52  ting from.** dbR
19680 62 75 20 74 6f 20 64 62 4d 61 69 6e 2e 0a 2a 2f  bu to dbMain..*/
19690 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75  .static void rbu
196a0 43 6f 70 79 50 72 61 67 6d 61 28 73 71 6c 69 74  CopyPragma(sqlit
196b0 65 33 72 62 75 20 2a 70 2c 20 63 6f 6e 73 74 20  e3rbu *p, const 
196c0 63 68 61 72 20 2a 7a 50 72 61 67 6d 61 29 7b 0a  char *zPragma){.
196d0 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
196e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
196f0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 50 72 61  lite3_stmt *pPra
19700 67 6d 61 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  gma = 0;.    p->
19710 72 63 20 3d 20 70 72 65 70 61 72 65 46 72 65 65  rc = prepareFree
19720 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28  AndCollectError(
19730 70 2d 3e 64 62 52 62 75 2c 20 26 70 50 72 61 67  p->dbRbu, &pPrag
19740 6d 61 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c  ma, &p->zErrmsg,
19750 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65   .        sqlite
19760 33 5f 6d 70 72 69 6e 74 66 28 22 50 52 41 47 4d  3_mprintf("PRAGM
19770 41 20 6d 61 69 6e 2e 25 73 22 2c 20 7a 50 72 61  A main.%s", zPra
19780 67 6d 61 29 0a 20 20 20 20 29 3b 0a 20 20 20 20  gma).    );.    
19790 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
197a0 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52  E_OK && SQLITE_R
197b0 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
197c0 28 70 50 72 61 67 6d 61 29 20 29 7b 0a 20 20 20  (pPragma) ){.   
197d0 20 20 20 70 2d 3e 72 63 20 3d 20 72 62 75 4d 50     p->rc = rbuMP
197e0 72 69 6e 74 66 45 78 65 63 28 70 2c 20 70 2d 3e  rintfExec(p, p->
197f0 64 62 4d 61 69 6e 2c 20 22 50 52 41 47 4d 41 20  dbMain, "PRAGMA 
19800 6d 61 69 6e 2e 25 73 20 3d 20 25 64 22 2c 0a 20  main.%s = %d",. 
19810 20 20 20 20 20 20 20 20 20 7a 50 72 61 67 6d 61           zPragma
19820 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  , sqlite3_column
19830 5f 69 6e 74 28 70 50 72 61 67 6d 61 2c 20 30 29  _int(pPragma, 0)
19840 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
19850 20 20 20 20 72 62 75 46 69 6e 61 6c 69 7a 65 28      rbuFinalize(
19860 70 2c 20 70 50 72 61 67 6d 61 29 3b 0a 20 20 7d  p, pPragma);.  }
19870 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 52 42  .}../*.** The RB
19880 55 20 68 61 6e 64 6c 65 20 70 61 73 73 65 64 20  U handle passed 
19890 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75  as the only argu
198a0 6d 65 6e 74 20 68 61 73 20 6a 75 73 74 20 62 65  ment has just be
198b0 65 6e 20 6f 70 65 6e 65 64 20 61 6e 64 20 0a 2a  en opened and .*
198c0 2a 20 74 68 65 20 73 74 61 74 65 20 64 61 74 61  * the state data
198d0 62 61 73 65 20 69 73 20 65 6d 70 74 79 2e 20 49  base is empty. I
198e0 66 20 74 68 69 73 20 52 42 55 20 68 61 6e 64 6c  f this RBU handl
198f0 65 20 77 61 73 20 6f 70 65 6e 65 64 20 66 6f 72  e was opened for
19900 20 61 6e 0a 2a 2a 20 52 42 55 20 76 61 63 75 75   an.** RBU vacuu
19910 6d 20 6f 70 65 72 61 74 69 6f 6e 2c 20 63 72 65  m operation, cre
19920 61 74 65 20 74 68 65 20 73 63 68 65 6d 61 20 69  ate the schema i
19930 6e 20 74 68 65 20 74 61 72 67 65 74 20 64 62 2e  n the target db.
19940 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
19950 72 62 75 43 72 65 61 74 65 54 61 72 67 65 74 53  rbuCreateTargetS
19960 63 68 65 6d 61 28 73 71 6c 69 74 65 33 72 62 75  chema(sqlite3rbu
19970 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f   *p){.  sqlite3_
19980 73 74 6d 74 20 2a 70 53 71 6c 20 3d 20 30 3b 0a  stmt *pSql = 0;.
19990 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
199a0 70 49 6e 73 65 72 74 20 3d 20 30 3b 0a 0a 20 20  pInsert = 0;..  
199b0 61 73 73 65 72 74 28 20 72 62 75 49 73 56 61 63  assert( rbuIsVac
199c0 75 75 6d 28 70 29 20 29 3b 0a 20 20 70 2d 3e 72  uum(p) );.  p->r
199d0 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  c = sqlite3_exec
199e0 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 50 52 41  (p->dbMain, "PRA
199f0 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68  GMA writable_sch
19a00 65 6d 61 3d 31 22 2c 20 30 2c 30 2c 20 26 70 2d  ema=1", 0,0, &p-
19a10 3e 7a 45 72 72 6d 73 67 29 3b 0a 20 20 69 66 28  >zErrmsg);.  if(
19a20 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
19a30 4b 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  K ){.    p->rc =
19a40 20 70 72 65 70 61 72 65 41 6e 64 43 6f 6c 6c 65   prepareAndColle
19a50 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 52 62 75  ctError(p->dbRbu
19a60 2c 20 26 70 53 71 6c 2c 20 26 70 2d 3e 7a 45 72  , &pSql, &p->zEr
19a70 72 6d 73 67 2c 20 0a 20 20 20 20 20 20 22 53 45  rmsg, .      "SE
19a80 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d 20 73 71  LECT sql FROM sq
19a90 6c 69 74 65 5f 6d 61 73 74 65 72 20 57 48 45 52  lite_master WHER
19aa0 45 20 73 71 6c 21 3d 27 27 20 41 4e 44 20 72 6f  E sql!='' AND ro
19ab0 6f 74 70 61 67 65 21 3d 30 22 0a 20 20 20 20 20  otpage!=0".     
19ac0 20 22 20 41 4e 44 20 6e 61 6d 65 21 3d 27 73 71   " AND name!='sq
19ad0 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 27 20 22  lite_sequence' "
19ae0 0a 20 20 20 20 20 20 22 20 4f 52 44 45 52 20 42  .      " ORDER B
19af0 59 20 74 79 70 65 20 44 45 53 43 22 0a 20 20 20  Y type DESC".   
19b00 20 29 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65   );.  }..  while
19b10 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
19b20 4f 4b 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74  OK && sqlite3_st
19b30 65 70 28 70 53 71 6c 29 3d 3d 53 51 4c 49 54 45  ep(pSql)==SQLITE
19b40 5f 52 4f 57 20 29 7b 0a 20 20 20 20 63 6f 6e 73  _ROW ){.    cons
19b50 74 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 28  t char *zSql = (
19b60 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
19b70 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
19b80 70 53 71 6c 2c 20 30 29 3b 0a 20 20 20 20 70 2d  pSql, 0);.    p-
19b90 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78  >rc = sqlite3_ex
19ba0 65 63 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 7a 53  ec(p->dbMain, zS
19bb0 71 6c 2c 20 30 2c 20 30 2c 20 26 70 2d 3e 7a 45  ql, 0, 0, &p->zE
19bc0 72 72 6d 73 67 29 3b 0a 20 20 7d 0a 20 20 72 62  rrmsg);.  }.  rb
19bd0 75 46 69 6e 61 6c 69 7a 65 28 70 2c 20 70 53 71  uFinalize(p, pSq
19be0 6c 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 21  l);.  if( p->rc!
19bf0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
19c00 75 72 6e 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72  urn;..  if( p->r
19c10 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
19c20 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70      p->rc = prep
19c30 61 72 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72  areAndCollectErr
19c40 6f 72 28 70 2d 3e 64 62 52 62 75 2c 20 26 70 53  or(p->dbRbu, &pS
19c50 71 6c 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c  ql, &p->zErrmsg,
19c60 20 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45 43   .        "SELEC
19c70 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  T * FROM sqlite_
19c80 6d 61 73 74 65 72 20 57 48 45 52 45 20 72 6f 6f  master WHERE roo
19c90 74 70 61 67 65 3d 30 20 4f 52 20 72 6f 6f 74 70  tpage=0 OR rootp
19ca0 61 67 65 20 49 53 20 4e 55 4c 4c 22 20 0a 20 20  age IS NULL" .  
19cb0 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20    );.  }..  if( 
19cc0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
19cd0 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
19ce0 70 72 65 70 61 72 65 41 6e 64 43 6f 6c 6c 65 63  prepareAndCollec
19cf0 74 45 72 72 6f 72 28 70 2d 3e 64 62 4d 61 69 6e  tError(p->dbMain
19d00 2c 20 26 70 49 6e 73 65 72 74 2c 20 26 70 2d 3e  , &pInsert, &p->
19d10 7a 45 72 72 6d 73 67 2c 20 0a 20 20 20 20 20 20  zErrmsg, .      
19d20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 73    "INSERT INTO s
19d30 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 56 41 4c  qlite_master VAL
19d40 55 45 53 28 3f 2c 3f 2c 3f 2c 3f 2c 3f 29 22 0a  UES(?,?,?,?,?)".
19d50 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 77 68      );.  }..  wh
19d60 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ile( p->rc==SQLI
19d70 54 45 5f 4f 4b 20 26 26 20 73 71 6c 69 74 65 33  TE_OK && sqlite3
19d80 5f 73 74 65 70 28 70 53 71 6c 29 3d 3d 53 51 4c  _step(pSql)==SQL
19d90 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 69  ITE_ROW ){.    i
19da0 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
19db0 30 3b 20 69 3c 35 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<5; i++){.  
19dc0 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
19dd0 5f 76 61 6c 75 65 28 70 49 6e 73 65 72 74 2c 20  _value(pInsert, 
19de0 69 2b 31 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c  i+1, sqlite3_col
19df0 75 6d 6e 5f 76 61 6c 75 65 28 70 53 71 6c 2c 20  umn_value(pSql, 
19e00 69 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  i));.    }.    s
19e10 71 6c 69 74 65 33 5f 73 74 65 70 28 70 49 6e 73  qlite3_step(pIns
19e20 65 72 74 29 3b 0a 20 20 20 20 70 2d 3e 72 63 20  ert);.    p->rc 
19e30 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
19e40 70 49 6e 73 65 72 74 29 3b 0a 20 20 7d 0a 20 20  pInsert);.  }.  
19e50 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
19e60 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d 3e 72  E_OK ){.    p->r
19e70 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  c = sqlite3_exec
19e80 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 50 52 41  (p->dbMain, "PRA
19e90 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68  GMA writable_sch
19ea0 65 6d 61 3d 30 22 2c 30 2c 30 2c 26 70 2d 3e 7a  ema=0",0,0,&p->z
19eb0 45 72 72 6d 73 67 29 3b 0a 20 20 7d 0a 0a 20 20  Errmsg);.  }..  
19ec0 72 62 75 46 69 6e 61 6c 69 7a 65 28 70 2c 20 70  rbuFinalize(p, p
19ed0 53 71 6c 29 3b 0a 20 20 72 62 75 46 69 6e 61 6c  Sql);.  rbuFinal
19ee0 69 7a 65 28 70 2c 20 70 49 6e 73 65 72 74 29 3b  ize(p, pInsert);
19ef0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74  .}../*.** Step t
19f00 68 65 20 52 42 55 20 6f 62 6a 65 63 74 2e 0a 2a  he RBU object..*
19f10 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 72 62 75  /.int sqlite3rbu
19f20 5f 73 74 65 70 28 73 71 6c 69 74 65 33 72 62 75  _step(sqlite3rbu
19f30 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b   *p){.  if( p ){
19f40 0a 20 20 20 20 73 77 69 74 63 68 28 20 70 2d 3e  .    switch( p->
19f50 65 53 74 61 67 65 20 29 7b 0a 20 20 20 20 20 20  eStage ){.      
19f60 63 61 73 65 20 52 42 55 5f 53 54 41 47 45 5f 4f  case RBU_STAGE_O
19f70 41 4c 3a 20 7b 0a 20 20 20 20 20 20 20 20 52 62  AL: {.        Rb
19f80 75 4f 62 6a 49 74 65 72 20 2a 70 49 74 65 72 20  uObjIter *pIter 
19f90 3d 20 26 70 2d 3e 6f 62 6a 69 74 65 72 3b 0a 0a  = &p->objiter;..
19fa0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
19fb0 69 73 20 69 73 20 61 6e 20 52 42 55 20 76 61 63  is is an RBU vac
19fc0 75 75 6d 20 6f 70 65 72 61 74 69 6f 6e 20 61 6e  uum operation an
19fd0 64 20 74 68 65 20 73 74 61 74 65 20 74 61 62 6c  d the state tabl
19fe0 65 20 77 61 73 20 65 6d 70 74 79 0a 20 20 20 20  e was empty.    
19ff0 20 20 20 20 2a 2a 20 77 68 65 6e 20 74 68 69 73      ** when this
1a000 20 68 61 6e 64 6c 65 20 77 61 73 20 6f 70 65 6e   handle was open
1a010 65 64 2c 20 63 72 65 61 74 65 20 74 68 65 20 74  ed, create the t
1a020 61 72 67 65 74 20 64 61 74 61 62 61 73 65 20 73  arget database s
1a030 63 68 65 6d 61 2e 20 2a 2f 0a 20 20 20 20 20 20  chema. */.      
1a040 20 20 69 66 28 20 72 62 75 49 73 56 61 63 75 75    if( rbuIsVacuu
1a050 6d 28 70 29 20 26 26 20 70 2d 3e 6e 50 72 6f 67  m(p) && p->nProg
1a060 72 65 73 73 3d 3d 30 20 26 26 20 70 2d 3e 72 63  ress==0 && p->rc
1a070 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1a080 20 20 20 20 20 20 20 20 20 72 62 75 43 72 65 61           rbuCrea
1a090 74 65 54 61 72 67 65 74 53 63 68 65 6d 61 28 70  teTargetSchema(p
1a0a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 62 75  );.          rbu
1a0b0 43 6f 70 79 50 72 61 67 6d 61 28 70 2c 20 22 75  CopyPragma(p, "u
1a0c0 73 65 72 5f 76 65 72 73 69 6f 6e 22 29 3b 0a 20  ser_version");. 
1a0d0 20 20 20 20 20 20 20 20 20 72 62 75 43 6f 70 79           rbuCopy
1a0e0 50 72 61 67 6d 61 28 70 2c 20 22 61 70 70 6c 69  Pragma(p, "appli
1a0f0 63 61 74 69 6f 6e 5f 69 64 22 29 3b 0a 20 20 20  cation_id");.   
1a100 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
1a110 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51  while( p->rc==SQ
1a120 4c 49 54 45 5f 4f 4b 20 26 26 20 70 49 74 65 72  LITE_OK && pIter
1a130 2d 3e 7a 54 62 6c 20 29 7b 0a 0a 20 20 20 20 20  ->zTbl ){..     
1a140 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e       if( pIter->
1a150 62 43 6c 65 61 6e 75 70 20 29 7b 0a 20 20 20 20  bCleanup ){.    
1a160 20 20 20 20 20 20 20 20 2f 2a 20 43 6c 65 61 6e          /* Clean
1a170 20 75 70 20 74 68 65 20 72 62 75 5f 74 6d 70 5f   up the rbu_tmp_
1a180 78 78 78 20 74 61 62 6c 65 20 66 6f 72 20 74 68  xxx table for th
1a190 65 20 70 72 65 76 69 6f 75 73 20 74 61 62 6c 65  e previous table
1a1a0 2e 20 49 74 20 0a 20 20 20 20 20 20 20 20 20 20  . It .          
1a1b0 20 20 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 64    ** cannot be d
1a1c0 72 6f 70 70 65 64 20 61 73 20 74 68 65 72 65 20  ropped as there 
1a1d0 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 61 63  are currently ac
1a1e0 74 69 76 65 20 53 51 4c 20 73 74 61 74 65 6d 65  tive SQL stateme
1a1f0 6e 74 73 2e 0a 20 20 20 20 20 20 20 20 20 20 20  nts..           
1a200 20 2a 2a 20 42 75 74 20 74 68 65 20 63 6f 6e 74   ** But the cont
1a210 65 6e 74 73 20 63 61 6e 20 62 65 20 64 65 6c 65  ents can be dele
1a220 74 65 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  ted.  */.       
1a230 20 20 20 20 20 69 66 28 20 72 62 75 49 73 56 61       if( rbuIsVa
1a240 63 75 75 6d 28 70 29 3d 3d 30 20 26 26 20 70 49  cuum(p)==0 && pI
1a250 74 65 72 2d 3e 61 62 49 6e 64 65 78 65 64 20 29  ter->abIndexed )
1a260 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1a270 72 62 75 4d 50 72 69 6e 74 66 45 78 65 63 28 70  rbuMPrintfExec(p
1a280 2c 20 70 2d 3e 64 62 52 62 75 2c 20 0a 20 20 20  , p->dbRbu, .   
1a290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1a2a0 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 73 2e 27  DELETE FROM %s.'
1a2b0 72 62 75 5f 74 6d 70 5f 25 71 27 22 2c 20 70 2d  rbu_tmp_%q'", p-
1a2c0 3e 7a 53 74 61 74 65 44 62 2c 20 70 49 74 65 72  >zStateDb, pIter
1a2d0 2d 3e 7a 44 61 74 61 54 62 6c 0a 20 20 20 20 20  ->zDataTbl.     
1a2e0 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
1a2f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1a300 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1a310 20 20 20 20 20 20 20 72 62 75 4f 62 6a 49 74 65         rbuObjIte
1a320 72 50 72 65 70 61 72 65 41 6c 6c 28 70 2c 20 70  rPrepareAll(p, p
1a330 49 74 65 72 2c 20 30 29 3b 0a 0a 20 20 20 20 20  Iter, 0);..     
1a340 20 20 20 20 20 20 20 2f 2a 20 41 64 76 61 6e 63         /* Advanc
1a350 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 72 6f  e to the next ro
1a360 77 20 74 6f 20 70 72 6f 63 65 73 73 2e 20 2a 2f  w to process. */
1a370 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
1a380 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1a390 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
1a3a0 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69     int rc = sqli
1a3b0 74 65 33 5f 73 74 65 70 28 70 49 74 65 72 2d 3e  te3_step(pIter->
1a3c0 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  pSelect);.      
1a3d0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
1a3e0 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
1a3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
1a400 3e 6e 50 72 6f 67 72 65 73 73 2b 2b 3b 0a 20 20  >nProgress++;.  
1a410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
1a420 3e 6e 53 74 65 70 2b 2b 3b 0a 20 20 20 20 20 20  >nStep++;.      
1a430 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1a440 20 72 62 75 53 74 65 70 28 70 29 3b 0a 20 20 20   rbuStep(p);.   
1a450 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1a460 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63             p->rc
1a470 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
1a480 28 70 49 74 65 72 2d 3e 70 53 65 6c 65 63 74 29  (pIter->pSelect)
1a490 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1a4a0 70 2d 3e 6e 53 74 65 70 20 3d 20 30 3b 0a 20 20  p->nStep = 0;.  
1a4b0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1a4c0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
1a4d0 20 20 20 72 62 75 4f 62 6a 49 74 65 72 4e 65 78     rbuObjIterNex
1a4e0 74 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20  t(p, pIter);.   
1a4f0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
1a500 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
1a510 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1a520 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
1a530 3e 7a 54 62 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  >zTbl==0 );.    
1a540 20 20 20 20 20 20 72 62 75 53 61 76 65 53 74 61        rbuSaveSta
1a550 74 65 28 70 2c 20 52 42 55 5f 53 54 41 47 45 5f  te(p, RBU_STAGE_
1a560 4d 4f 56 45 29 3b 0a 20 20 20 20 20 20 20 20 20  MOVE);.         
1a570 20 72 62 75 49 6e 63 72 53 63 68 65 6d 61 43 6f   rbuIncrSchemaCo
1a580 6f 6b 69 65 28 70 29 3b 0a 20 20 20 20 20 20 20  okie(p);.       
1a590 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
1a5a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1a5b0 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73         p->rc = s
1a5c0 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
1a5d0 62 4d 61 69 6e 2c 20 22 43 4f 4d 4d 49 54 22 2c  bMain, "COMMIT",
1a5e0 20 30 2c 20 30 2c 20 26 70 2d 3e 7a 45 72 72 6d   0, 0, &p->zErrm
1a5f0 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  sg);.          }
1a600 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
1a610 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
1a620 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
1a630 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65  ->rc = sqlite3_e
1a640 78 65 63 28 70 2d 3e 64 62 52 62 75 2c 20 22 43  xec(p->dbRbu, "C
1a650 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 2c 20 26 70  OMMIT", 0, 0, &p
1a660 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a 20 20 20 20  ->zErrmsg);.    
1a670 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1a680 20 20 70 2d 3e 65 53 74 61 67 65 20 3d 20 52 42    p->eStage = RB
1a690 55 5f 53 54 41 47 45 5f 4d 4f 56 45 3b 0a 20 20  U_STAGE_MOVE;.  
1a6a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1a6b0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a  break;.      }..
1a6c0 20 20 20 20 20 20 63 61 73 65 20 52 42 55 5f 53        case RBU_S
1a6d0 54 41 47 45 5f 4d 4f 56 45 3a 20 7b 0a 20 20 20  TAGE_MOVE: {.   
1a6e0 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
1a6f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1a700 20 20 20 20 20 20 20 72 62 75 4d 6f 76 65 4f 61         rbuMoveOa
1a710 6c 46 69 6c 65 28 70 29 3b 0a 20 20 20 20 20 20  lFile(p);.      
1a720 20 20 20 20 70 2d 3e 6e 50 72 6f 67 72 65 73 73      p->nProgress
1a730 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ++;.        }.  
1a740 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1a750 20 20 20 7d 0a 0a 20 20 20 20 20 20 63 61 73 65     }..      case
1a760 20 52 42 55 5f 53 54 41 47 45 5f 43 4b 50 54 3a   RBU_STAGE_CKPT:
1a770 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   {.        if( p
1a780 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
1a790 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
1a7a0 20 70 2d 3e 6e 53 74 65 70 3e 3d 70 2d 3e 6e 46   p->nStep>=p->nF
1a7b0 72 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20  rame ){.        
1a7c0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65      sqlite3_file
1a7d0 20 2a 70 44 62 20 3d 20 70 2d 3e 70 54 61 72 67   *pDb = p->pTarg
1a7e0 65 74 46 64 2d 3e 70 52 65 61 6c 3b 0a 20 20 0a  etFd->pReal;.  .
1a7f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1a800 79 6e 63 20 74 68 65 20 64 62 20 66 69 6c 65 20  ync the db file 
1a810 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  */.            p
1a820 2d 3e 72 63 20 3d 20 70 44 62 2d 3e 70 4d 65 74  ->rc = pDb->pMet
1a830 68 6f 64 73 2d 3e 78 53 79 6e 63 28 70 44 62 2c  hods->xSync(pDb,
1a840 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
1a850 4d 41 4c 29 3b 0a 20 20 0a 20 20 20 20 20 20 20  MAL);.  .       
1a860 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 6e       /* Update n
1a870 42 61 63 6b 66 69 6c 6c 20 2a 2f 0a 20 20 20 20  Backfill */.    
1a880 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72          if( p->r
1a890 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1a8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 76 6f                vo
1a8b0 69 64 20 76 6f 6c 61 74 69 6c 65 20 2a 70 74 72  id volatile *ptr
1a8c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1a8d0 70 2d 3e 72 63 20 3d 20 70 44 62 2d 3e 70 4d 65  p->rc = pDb->pMe
1a8e0 74 68 6f 64 73 2d 3e 78 53 68 6d 4d 61 70 28 70  thods->xShmMap(p
1a8f0 44 62 2c 20 30 2c 20 33 32 2a 31 30 32 34 2c 20  Db, 0, 32*1024, 
1a900 30 2c 20 26 70 74 72 29 3b 0a 20 20 20 20 20 20  0, &ptr);.      
1a910 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72          if( p->r
1a920 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1a930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a940 28 28 75 33 32 20 76 6f 6c 61 74 69 6c 65 2a 29  ((u32 volatile*)
1a950 70 74 72 29 5b 32 34 5d 20 3d 20 70 2d 3e 69 4d  ptr)[24] = p->iM
1a960 61 78 46 72 61 6d 65 3b 0a 20 20 20 20 20 20 20  axFrame;.       
1a970 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1a980 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20       }.  .      
1a990 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
1a9a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1a9b0 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 65              p->e
1a9c0 53 74 61 67 65 20 3d 20 52 42 55 5f 53 54 41 47  Stage = RBU_STAG
1a9d0 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20  E_DONE;.        
1a9e0 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51        p->rc = SQ
1a9f0 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20  LITE_DONE;.     
1aa00 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1aa10 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1aa20 20 20 20 20 20 20 2f 2a 20 41 74 20 6f 6e 65 20        /* At one 
1aa30 70 6f 69 6e 74 20 74 68 65 20 66 6f 6c 6c 6f 77  point the follow
1aa40 69 6e 67 20 62 6c 6f 63 6b 20 63 6f 70 69 65 64  ing block copied
1aa50 20 61 20 73 69 6e 67 6c 65 20 66 72 61 6d 65 20   a single frame 
1aa60 66 72 6f 6d 20 74 68 65 0a 20 20 20 20 20 20 20  from the.       
1aa70 20 20 20 20 20 2a 2a 20 77 61 6c 20 66 69 6c 65       ** wal file
1aa80 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1aa90 20 66 69 6c 65 2e 20 53 6f 20 74 68 61 74 20 6f   file. So that o
1aaa0 6e 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  ne call to sqlit
1aab0 65 33 72 62 75 5f 73 74 65 70 28 29 0a 20 20 20  e3rbu_step().   
1aac0 20 20 20 20 20 20 20 20 20 2a 2a 20 63 68 65 63           ** chec
1aad0 6b 70 6f 69 6e 74 65 64 20 61 20 73 69 6e 67 6c  kpointed a singl
1aae0 65 20 66 72 61 6d 65 2e 20 0a 20 20 20 20 20 20  e frame. .      
1aaf0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
1ab00 20 20 20 20 20 2a 2a 20 48 6f 77 65 76 65 72 2c       ** However,
1ab10 20 69 66 20 74 68 65 20 73 65 63 74 6f 72 2d 73   if the sector-s
1ab20 69 7a 65 20 69 73 20 6c 61 72 67 65 72 20 74 68  ize is larger th
1ab30 61 6e 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  an the page-size
1ab40 2c 20 61 6e 64 20 74 68 65 0a 20 20 20 20 20 20  , and the.      
1ab50 20 20 20 20 20 20 2a 2a 20 61 70 70 6c 69 63 61        ** applica
1ab60 74 69 6f 6e 20 63 61 6c 6c 73 20 73 71 6c 69 74  tion calls sqlit
1ab70 65 33 72 62 75 5f 73 61 76 65 73 74 61 74 65 28  e3rbu_savestate(
1ab80 29 20 6f 72 20 63 6c 6f 73 65 28 29 20 69 6d 6d  ) or close() imm
1ab90 65 64 69 61 74 65 6c 79 0a 20 20 20 20 20 20 20  ediately.       
1aba0 20 20 20 20 20 2a 2a 20 61 66 74 65 72 20 74 68       ** after th
1abb0 69 73 20 73 74 65 70 2c 20 74 68 65 6e 20 72 62  is step, then rb
1abc0 75 5f 73 74 65 70 28 29 20 61 67 61 69 6e 2c 20  u_step() again, 
1abd0 74 68 65 6e 20 61 20 70 6f 77 65 72 20 66 61 69  then a power fai
1abe0 6c 75 72 65 20 6f 63 63 75 72 73 2c 0a 20 20 20  lure occurs,.   
1abf0 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e           ** then
1ac00 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70 61   the database pa
1ac10 67 65 20 77 72 69 74 74 65 6e 20 68 65 72 65 20  ge written here 
1ac20 6d 61 79 20 62 65 20 64 61 6d 61 67 65 64 2e 20  may be damaged. 
1ac30 57 6f 72 6b 20 61 72 6f 75 6e 64 0a 20 20 20 20  Work around.    
1ac40 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20          ** this 
1ac50 62 79 20 63 68 65 63 6b 70 6f 69 6e 74 69 6e 67  by checkpointing
1ac60 20 66 72 61 6d 65 73 20 75 6e 74 69 6c 20 74 68   frames until th
1ac70 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74  e next page in t
1ac80 68 65 20 61 46 72 61 6d 65 5b 5d 0a 20 20 20 20  he aFrame[].    
1ac90 20 20 20 20 20 20 20 20 2a 2a 20 6c 69 65 73 20          ** lies 
1aca0 6f 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 64  on a different d
1acb0 69 73 6b 20 73 65 63 74 6f 72 20 74 6f 20 74 68  isk sector to th
1acc0 65 20 63 75 72 72 65 6e 74 20 6f 6e 65 2e 20 2a  e current one. *
1acd0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 33  /.            u3
1ace0 32 20 69 53 65 63 74 6f 72 3b 0a 20 20 20 20 20  2 iSector;.     
1acf0 20 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20         do{.     
1ad00 20 20 20 20 20 20 20 20 20 52 62 75 46 72 61 6d           RbuFram
1ad10 65 20 2a 70 46 72 61 6d 65 20 3d 20 26 70 2d 3e  e *pFrame = &p->
1ad20 61 46 72 61 6d 65 5b 70 2d 3e 6e 53 74 65 70 5d  aFrame[p->nStep]
1ad30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1ad40 69 53 65 63 74 6f 72 20 3d 20 28 70 46 72 61 6d  iSector = (pFram
1ad50 65 2d 3e 69 44 62 50 61 67 65 2d 31 29 20 2f 20  e->iDbPage-1) / 
1ad60 70 2d 3e 6e 50 61 67 65 50 65 72 53 65 63 74 6f  p->nPagePerSecto
1ad70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r;.             
1ad80 20 72 62 75 43 68 65 63 6b 70 6f 69 6e 74 46 72   rbuCheckpointFr
1ad90 61 6d 65 28 70 2c 20 70 46 72 61 6d 65 29 3b 0a  ame(p, pFrame);.
1ada0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
1adb0 3e 6e 53 74 65 70 2b 2b 3b 0a 20 20 20 20 20 20  >nStep++;.      
1adc0 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 70 2d        }while( p-
1add0 3e 6e 53 74 65 70 3c 70 2d 3e 6e 46 72 61 6d 65  >nStep<p->nFrame
1ade0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
1adf0 20 20 20 26 26 20 69 53 65 63 74 6f 72 3d 3d 28     && iSector==(
1ae00 28 70 2d 3e 61 46 72 61 6d 65 5b 70 2d 3e 6e 53  (p->aFrame[p->nS
1ae10 74 65 70 5d 2e 69 44 62 50 61 67 65 2d 31 29 20  tep].iDbPage-1) 
1ae20 2f 20 70 2d 3e 6e 50 61 67 65 50 65 72 53 65 63  / p->nPagePerSec
1ae30 74 6f 72 29 0a 20 20 20 20 20 20 20 20 20 20 20  tor).           
1ae40 20 20 20 20 20 20 26 26 20 70 2d 3e 72 63 3d 3d        && p->rc==
1ae50 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20  SQLITE_OK.      
1ae60 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
1ae70 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
1ae80 2d 3e 6e 50 72 6f 67 72 65 73 73 2b 2b 3b 0a 20  ->nProgress++;. 
1ae90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1aea0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
1aeb0 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  .      default:.
1aec0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1aed0 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
1aee0 70 2d 3e 72 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a  p->rc;.  }else{.
1aef0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1af00 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 7d 0a 0a  E_NOMEM;.  }.}..
1af10 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 73 74  /*.** Compare st
1af20 72 69 6e 67 73 20 7a 31 20 61 6e 64 20 7a 32 2c  rings z1 and z2,
1af30 20 72 65 74 75 72 6e 69 6e 67 20 30 20 69 66 20   returning 0 if 
1af40 74 68 65 79 20 61 72 65 20 69 64 65 6e 74 69 63  they are identic
1af50 61 6c 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 0a  al, or non-zero.
1af60 2a 2a 20 6f 74 68 65 72 77 69 73 65 2e 20 45 69  ** otherwise. Ei
1af70 74 68 65 72 20 6f 72 20 62 6f 74 68 20 61 72 67  ther or both arg
1af80 75 6d 65 6e 74 20 6d 61 79 20 62 65 20 4e 55 4c  ument may be NUL
1af90 4c 2e 20 54 77 6f 20 4e 55 4c 4c 20 76 61 6c 75  L. Two NULL valu
1afa0 65 73 20 61 72 65 0a 2a 2a 20 63 6f 6e 73 69 64  es are.** consid
1afb0 65 72 65 64 20 65 71 75 61 6c 2c 20 61 6e 64 20  ered equal, and 
1afc0 4e 55 4c 4c 20 69 73 20 63 6f 6e 73 69 64 65 72  NULL is consider
1afd0 65 64 20 64 69 73 74 69 6e 63 74 20 66 72 6f 6d  ed distinct from
1afe0 20 61 6c 6c 20 6f 74 68 65 72 20 76 61 6c 75 65   all other value
1aff0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
1b000 20 72 62 75 53 74 72 43 6f 6d 70 61 72 65 28 63   rbuStrCompare(c
1b010 6f 6e 73 74 20 63 68 61 72 20 2a 7a 31 2c 20 63  onst char *z1, c
1b020 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32 29 7b 0a  onst char *z2){.
1b030 20 20 69 66 28 20 7a 31 3d 3d 30 20 26 26 20 7a    if( z1==0 && z
1b040 32 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  2==0 ) return 0;
1b050 0a 20 20 69 66 28 20 7a 31 3d 3d 30 20 7c 7c 20  .  if( z1==0 || 
1b060 7a 32 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  z2==0 ) return 1
1b070 3b 0a 20 20 72 65 74 75 72 6e 20 28 73 71 6c 69  ;.  return (sqli
1b080 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 31 2c 20  te3_stricmp(z1, 
1b090 7a 32 29 21 3d 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  z2)!=0);.}../*.*
1b0a0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1b0b0 69 73 20 63 61 6c 6c 65 64 20 61 73 20 70 61 72  is called as par
1b0c0 74 20 6f 66 20 73 71 6c 69 74 65 33 72 62 75 5f  t of sqlite3rbu_
1b0d0 6f 70 65 6e 28 29 20 77 68 65 6e 20 69 6e 69 74  open() when init
1b0e0 69 61 6c 69 7a 69 6e 67 0a 2a 2a 20 61 6e 20 72  ializing.** an r
1b0f0 62 75 20 68 61 6e 64 6c 65 20 69 6e 20 4f 41 4c  bu handle in OAL
1b100 20 73 74 61 67 65 2e 20 49 66 20 74 68 65 20 72   stage. If the r
1b110 62 75 20 75 70 64 61 74 65 20 68 61 73 20 6e 6f  bu update has no
1b120 74 20 73 74 61 72 74 65 64 20 28 69 2e 65 2e 0a  t started (i.e..
1b130 2a 2a 20 74 68 65 20 72 62 75 5f 73 74 61 74 65  ** the rbu_state
1b140 20 74 61 62 6c 65 20 77 61 73 20 65 6d 70 74 79   table was empty
1b150 29 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  ) it is a no-op.
1b160 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 61   Otherwise, it a
1b170 72 72 61 6e 67 65 73 0a 2a 2a 20 74 68 69 6e 67  rranges.** thing
1b180 73 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65  s so that the ne
1b190 78 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  xt call to sqlit
1b1a0 65 33 72 62 75 5f 73 74 65 70 28 29 20 63 6f 6e  e3rbu_step() con
1b1b0 74 69 6e 75 65 73 20 6f 6e 20 66 72 6f 6d 0a 2a  tinues on from.*
1b1c0 2a 20 77 68 65 72 65 20 74 68 65 20 70 72 65 76  * where the prev
1b1d0 69 6f 75 73 20 72 62 75 20 68 61 6e 64 6c 65 20  ious rbu handle 
1b1e0 6c 65 66 74 20 6f 66 66 2e 0a 2a 2a 0a 2a 2a 20  left off..**.** 
1b1f0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
1b200 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  rs, an error cod
1b210 65 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73  e and error mess
1b220 61 67 65 20 61 72 65 20 6c 65 66 74 20 69 6e 20  age are left in 
1b230 74 68 65 0a 2a 2a 20 72 62 75 20 68 61 6e 64 6c  the.** rbu handl
1b240 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
1b250 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a  first argument..
1b260 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
1b270 62 75 53 65 74 75 70 4f 61 6c 28 73 71 6c 69 74  buSetupOal(sqlit
1b280 65 33 72 62 75 20 2a 70 2c 20 52 62 75 53 74 61  e3rbu *p, RbuSta
1b290 74 65 20 2a 70 53 74 61 74 65 29 7b 0a 20 20 61  te *pState){.  a
1b2a0 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51  ssert( p->rc==SQ
1b2b0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28  LITE_OK );.  if(
1b2c0 20 70 53 74 61 74 65 2d 3e 7a 54 62 6c 20 29 7b   pState->zTbl ){
1b2d0 0a 20 20 20 20 52 62 75 4f 62 6a 49 74 65 72 20  .    RbuObjIter 
1b2e0 2a 70 49 74 65 72 20 3d 20 26 70 2d 3e 6f 62 6a  *pIter = &p->obj
1b2f0 69 74 65 72 3b 0a 20 20 20 20 69 6e 74 20 72 63  iter;.    int rc
1b300 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
1b310 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51     while( rc==SQ
1b320 4c 49 54 45 5f 4f 4b 20 26 26 20 70 49 74 65 72  LITE_OK && pIter
1b330 2d 3e 7a 54 62 6c 20 26 26 20 28 70 49 74 65 72  ->zTbl && (pIter
1b340 2d 3e 62 43 6c 65 61 6e 75 70 20 0a 20 20 20 20  ->bCleanup .    
1b350 20 20 20 7c 7c 20 72 62 75 53 74 72 43 6f 6d 70     || rbuStrComp
1b360 61 72 65 28 70 49 74 65 72 2d 3e 7a 49 64 78 2c  are(pIter->zIdx,
1b370 20 70 53 74 61 74 65 2d 3e 7a 49 64 78 29 0a 20   pState->zIdx). 
1b380 20 20 20 20 20 20 7c 7c 20 72 62 75 53 74 72 43        || rbuStrC
1b390 6f 6d 70 61 72 65 28 70 49 74 65 72 2d 3e 7a 54  ompare(pIter->zT
1b3a0 62 6c 2c 20 70 53 74 61 74 65 2d 3e 7a 54 62 6c  bl, pState->zTbl
1b3b0 29 20 0a 20 20 20 20 29 29 7b 0a 20 20 20 20 20  ) .    )){.     
1b3c0 20 72 63 20 3d 20 72 62 75 4f 62 6a 49 74 65 72   rc = rbuObjIter
1b3d0 4e 65 78 74 28 70 2c 20 70 49 74 65 72 29 3b 0a  Next(p, pIter);.
1b3e0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72      }..    if( r
1b3f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1b400 21 70 49 74 65 72 2d 3e 7a 54 62 6c 20 29 7b 0a  !pIter->zTbl ){.
1b410 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1b420 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 70  E_ERROR;.      p
1b430 2d 3e 7a 45 72 72 6d 73 67 20 3d 20 73 71 6c 69  ->zErrmsg = sqli
1b440 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 72 62 75  te3_mprintf("rbu
1b450 5f 73 74 61 74 65 20 6d 69 73 6d 61 74 63 68 20  _state mismatch 
1b460 65 72 72 6f 72 22 29 3b 0a 20 20 20 20 7d 0a 0a  error");.    }..
1b470 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1b480 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
1b490 2d 3e 6e 53 74 65 70 20 3d 20 70 53 74 61 74 65  ->nStep = pState
1b4a0 2d 3e 6e 52 6f 77 3b 0a 20 20 20 20 20 20 72 63  ->nRow;.      rc
1b4b0 20 3d 20 72 62 75 4f 62 6a 49 74 65 72 50 72 65   = rbuObjIterPre
1b4c0 70 61 72 65 41 6c 6c 28 70 2c 20 26 70 2d 3e 6f  pareAll(p, &p->o
1b4d0 62 6a 69 74 65 72 2c 20 70 2d 3e 6e 53 74 65 70  bjiter, p->nStep
1b4e0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 2d  );.    }..    p-
1b4f0 3e 72 63 20 3d 20 72 63 3b 0a 20 20 7d 0a 7d 0a  >rc = rc;.  }.}.
1b500 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  ./*.** If there 
1b510 69 73 20 61 20 22 2a 2d 6f 61 6c 22 20 66 69 6c  is a "*-oal" fil
1b520 65 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79  e in the file-sy
1b530 73 74 65 6d 20 63 6f 72 72 65 73 70 6f 6e 64 69  stem correspondi
1b540 6e 67 20 74 6f 20 74 68 65 0a 2a 2a 20 74 61 72  ng to the.** tar
1b550 67 65 74 20 64 61 74 61 62 61 73 65 20 69 6e 20  get database in 
1b560 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c  the file-system,
1b570 20 64 65 6c 65 74 65 20 69 74 2e 20 49 66 20 61   delete it. If a
1b580 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 0a  n error occurs,.
1b590 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  ** leave an erro
1b5a0 72 20 63 6f 64 65 20 61 6e 64 20 65 72 72 6f 72  r code and error
1b5b0 20 6d 65 73 73 61 67 65 20 69 6e 20 74 68 65 20   message in the 
1b5c0 72 62 75 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73  rbu handle..*/.s
1b5d0 74 61 74 69 63 20 76 6f 69 64 20 72 62 75 44 65  tatic void rbuDe
1b5e0 6c 65 74 65 4f 61 6c 46 69 6c 65 28 73 71 6c 69  leteOalFile(sqli
1b5f0 74 65 33 72 62 75 20 2a 70 29 7b 0a 20 20 63 68  te3rbu *p){.  ch
1b600 61 72 20 2a 7a 4f 61 6c 20 3d 20 72 62 75 4d 50  ar *zOal = rbuMP
1b610 72 69 6e 74 66 28 70 2c 20 22 25 73 2d 6f 61 6c  rintf(p, "%s-oal
1b620 22 2c 20 70 2d 3e 7a 54 61 72 67 65 74 29 3b 0a  ", p->zTarget);.
1b630 20 20 69 66 28 20 7a 4f 61 6c 20 29 7b 0a 20 20    if( zOal ){.  
1b640 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
1b650 56 66 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 66  Vfs = sqlite3_vf
1b660 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20 20 20 61  s_find(0);.    a
1b670 73 73 65 72 74 28 20 70 56 66 73 20 26 26 20 70  ssert( pVfs && p
1b680 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
1b690 26 26 20 70 2d 3e 7a 45 72 72 6d 73 67 3d 3d 30  && p->zErrmsg==0
1b6a0 20 29 3b 0a 20 20 20 20 70 56 66 73 2d 3e 78 44   );.    pVfs->xD
1b6b0 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4f 61 6c  elete(pVfs, zOal
1b6c0 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
1b6d0 33 5f 66 72 65 65 28 7a 4f 61 6c 29 3b 0a 20 20  3_free(zOal);.  
1b6e0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  }.}../*.** Alloc
1b6f0 61 74 65 20 61 20 70 72 69 76 61 74 65 20 72 62  ate a private rb
1b700 75 20 56 46 53 20 66 6f 72 20 74 68 65 20 72 62  u VFS for the rb
1b710 75 20 68 61 6e 64 6c 65 20 70 61 73 73 65 64 20  u handle passed 
1b720 61 73 20 74 68 65 20 6f 6e 6c 79 0a 2a 2a 20 61  as the only.** a
1b730 72 67 75 6d 65 6e 74 2e 20 54 68 69 73 20 56 46  rgument. This VF
1b740 53 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 75  S will be used u
1b750 6e 6c 65 73 73 20 74 68 65 20 63 61 6c 6c 20 74  nless the call t
1b760 6f 20 73 71 6c 69 74 65 33 72 62 75 5f 6f 70 65  o sqlite3rbu_ope
1b770 6e 28 29 0a 2a 2a 20 73 70 65 63 69 66 69 65 64  n().** specified
1b780 20 61 20 55 52 49 20 77 69 74 68 20 61 20 76 66   a URI with a vf
1b790 73 3d 3f 20 6f 70 74 69 6f 6e 20 69 6e 20 70 6c  s=? option in pl
1b7a0 61 63 65 20 6f 66 20 61 20 74 61 72 67 65 74 20  ace of a target 
1b7b0 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65  database.** file
1b7c0 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   name..*/.static
1b7d0 20 76 6f 69 64 20 72 62 75 43 72 65 61 74 65 56   void rbuCreateV
1b7e0 66 73 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70  fs(sqlite3rbu *p
1b7f0 29 7b 0a 20 20 69 6e 74 20 72 6e 64 3b 0a 20 20  ){.  int rnd;.  
1b800 63 68 61 72 20 7a 52 6e 64 5b 36 34 5d 3b 0a 0a  char zRnd[64];..
1b810 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d    assert( p->rc=
1b820 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
1b830 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65  sqlite3_randomne
1b840 73 73 28 73 69 7a 65 6f 66 28 69 6e 74 29 2c 20  ss(sizeof(int), 
1b850 28 76 6f 69 64 2a 29 26 72 6e 64 29 3b 0a 20 20  (void*)&rnd);.  
1b860 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
1b870 28 73 69 7a 65 6f 66 28 7a 52 6e 64 29 2c 20 7a  (sizeof(zRnd), z
1b880 52 6e 64 2c 20 22 72 62 75 5f 76 66 73 5f 25 64  Rnd, "rbu_vfs_%d
1b890 22 2c 20 72 6e 64 29 3b 0a 20 20 70 2d 3e 72 63  ", rnd);.  p->rc
1b8a0 20 3d 20 73 71 6c 69 74 65 33 72 62 75 5f 63 72   = sqlite3rbu_cr
1b8b0 65 61 74 65 5f 76 66 73 28 7a 52 6e 64 2c 20 30  eate_vfs(zRnd, 0
1b8c0 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  );.  if( p->rc==
1b8d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1b8e0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
1b8f0 66 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73  fs = sqlite3_vfs
1b900 5f 66 69 6e 64 28 7a 52 6e 64 29 3b 0a 20 20 20  _find(zRnd);.   
1b910 20 61 73 73 65 72 74 28 20 70 56 66 73 20 29 3b   assert( pVfs );
1b920 0a 20 20 20 20 70 2d 3e 7a 56 66 73 4e 61 6d 65  .    p->zVfsName
1b930 20 3d 20 70 56 66 73 2d 3e 7a 4e 61 6d 65 3b 0a   = pVfs->zName;.
1b940 20 20 20 20 28 28 72 62 75 5f 76 66 73 2a 29 70      ((rbu_vfs*)p
1b950 56 66 73 29 2d 3e 70 52 62 75 20 3d 20 70 3b 0a  Vfs)->pRbu = p;.
1b960 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73    }.}../*.** Des
1b970 74 72 6f 79 20 74 68 65 20 70 72 69 76 61 74 65  troy the private
1b980 20 56 46 53 20 63 72 65 61 74 65 64 20 66 6f 72   VFS created for
1b990 20 74 68 65 20 72 62 75 20 68 61 6e 64 6c 65 20   the rbu handle 
1b9a0 70 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e  passed as the on
1b9b0 6c 79 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 62  ly.** argument b
1b9c0 79 20 61 6e 20 65 61 72 6c 69 65 72 20 63 61 6c  y an earlier cal
1b9d0 6c 20 74 6f 20 72 62 75 43 72 65 61 74 65 56 66  l to rbuCreateVf
1b9e0 73 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  s()..*/.static v
1b9f0 6f 69 64 20 72 62 75 44 65 6c 65 74 65 56 66 73  oid rbuDeleteVfs
1ba00 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 29 7b  (sqlite3rbu *p){
1ba10 0a 20 20 69 66 28 20 70 2d 3e 7a 56 66 73 4e 61  .  if( p->zVfsNa
1ba20 6d 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  me ){.    sqlite
1ba30 33 72 62 75 5f 64 65 73 74 72 6f 79 5f 76 66 73  3rbu_destroy_vfs
1ba40 28 70 2d 3e 7a 56 66 73 4e 61 6d 65 29 3b 0a 20  (p->zVfsName);. 
1ba50 20 20 20 70 2d 3e 7a 56 66 73 4e 61 6d 65 20 3d     p->zVfsName =
1ba60 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
1ba70 20 54 68 69 73 20 75 73 65 72 2d 64 65 66 69 6e   This user-defin
1ba80 65 64 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20  ed SQL function 
1ba90 69 73 20 69 6e 76 6f 6b 65 64 20 77 69 74 68 20  is invoked with 
1baa0 61 20 73 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e  a single argumen
1bab0 74 20 2d 20 74 68 65 0a 2a 2a 20 6e 61 6d 65 20  t - the.** name 
1bac0 6f 66 20 61 20 74 61 62 6c 65 20 65 78 70 65 63  of a table expec
1bad0 74 65 64 20 74 6f 20 61 70 70 65 61 72 20 69 6e  ted to appear in
1bae0 20 74 68 65 20 74 61 72 67 65 74 20 64 61 74 61   the target data
1baf0 62 61 73 65 2e 20 49 74 20 72 65 74 75 72 6e 73  base. It returns
1bb00 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  .** the number o
1bb10 66 20 61 75 78 69 6c 6c 69 61 72 79 20 69 6e 64  f auxilliary ind
1bb20 65 78 65 73 20 6f 6e 20 74 68 65 20 74 61 62 6c  exes on the tabl
1bb30 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
1bb40 64 20 72 62 75 49 6e 64 65 78 43 6e 74 46 75 6e  d rbuIndexCntFun
1bb50 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  c(.  sqlite3_con
1bb60 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20 69  text *pCtx, .  i
1bb70 6e 74 20 6e 56 61 6c 2c 0a 20 20 73 71 6c 69 74  nt nVal,.  sqlit
1bb80 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c  e3_value **apVal
1bb90 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 72 62 75  .){.  sqlite3rbu
1bba0 20 2a 70 20 3d 20 28 73 71 6c 69 74 65 33 72 62   *p = (sqlite3rb
1bbb0 75 2a 29 73 71 6c 69 74 65 33 5f 75 73 65 72 5f  u*)sqlite3_user_
1bbc0 64 61 74 61 28 70 43 74 78 29 3b 0a 20 20 73 71  data(pCtx);.  sq
1bbd0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
1bbe0 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a  t = 0;.  char *z
1bbf0 45 72 72 6d 73 67 20 3d 20 30 3b 0a 20 20 69 6e  Errmsg = 0;.  in
1bc00 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
1bc10 20 6e 56 61 6c 3d 3d 31 20 29 3b 0a 20 20 0a 20   nVal==1 );.  . 
1bc20 20 72 63 20 3d 20 70 72 65 70 61 72 65 46 72 65   rc = prepareFre
1bc30 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72  eAndCollectError
1bc40 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 70 53 74  (p->dbMain, &pSt
1bc50 6d 74 2c 20 26 7a 45 72 72 6d 73 67 2c 20 0a 20  mt, &zErrmsg, . 
1bc60 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72       sqlite3_mpr
1bc70 69 6e 74 66 28 22 53 45 4c 45 43 54 20 63 6f 75  intf("SELECT cou
1bc80 6e 74 28 2a 29 20 46 52 4f 4d 20 73 71 6c 69 74  nt(*) FROM sqlit
1bc90 65 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20 20  e_master ".     
1bca0 20 20 20 22 57 48 45 52 45 20 74 79 70 65 3d 27     "WHERE type='
1bcb0 69 6e 64 65 78 27 20 41 4e 44 20 74 62 6c 5f 6e  index' AND tbl_n
1bcc0 61 6d 65 20 3d 20 25 51 22 2c 20 73 71 6c 69 74  ame = %Q", sqlit
1bcd0 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 70  e3_value_text(ap
1bce0 56 61 6c 5b 30 5d 29 29 0a 20 20 29 3b 0a 20 20  Val[0])).  );.  
1bcf0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1bd00 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
1bd10 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 70 43  _result_error(pC
1bd20 74 78 2c 20 7a 45 72 72 6d 73 67 2c 20 2d 31 29  tx, zErrmsg, -1)
1bd30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
1bd40 6e 74 20 6e 49 6e 64 65 78 20 3d 20 30 3b 0a 20  nt nIndex = 0;. 
1bd50 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f     if( SQLITE_RO
1bd60 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28  W==sqlite3_step(
1bd70 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20 20  pStmt) ){.      
1bd80 6e 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33  nIndex = sqlite3
1bd90 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d  _column_int(pStm
1bda0 74 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  t, 0);.    }.   
1bdb0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69   rc = sqlite3_fi
1bdc0 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
1bdd0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1bde0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
1bdf0 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
1be00 28 70 43 74 78 2c 20 6e 49 6e 64 65 78 29 3b 0a  (pCtx, nIndex);.
1be10 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1be20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
1be30 65 72 72 6f 72 28 70 43 74 78 2c 20 73 71 6c 69  error(pCtx, sqli
1be40 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62  te3_errmsg(p->db
1be50 4d 61 69 6e 29 2c 20 2d 31 29 3b 0a 20 20 20 20  Main), -1);.    
1be60 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  }.  }..  sqlite3
1be70 5f 66 72 65 65 28 7a 45 72 72 6d 73 67 29 3b 0a  _free(zErrmsg);.
1be80 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
1be90 52 42 55 20 64 61 74 61 62 61 73 65 20 63 6f 6e  RBU database con
1bea0 74 61 69 6e 73 20 74 68 65 20 72 62 75 5f 63 6f  tains the rbu_co
1beb0 75 6e 74 20 74 61 62 6c 65 2c 20 75 73 65 20 69  unt table, use i
1bec0 74 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 0a  t to initialize.
1bed0 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 72 62  ** the sqlite3rb
1bee0 75 2e 6e 50 68 61 73 65 4f 6e 65 53 74 65 70 20  u.nPhaseOneStep 
1bef0 76 61 72 69 61 62 6c 65 2e 20 54 68 65 20 73 63  variable. The sc
1bf00 68 65 6d 61 20 6f 66 20 74 68 65 20 72 62 75 5f  hema of the rbu_
1bf10 63 6f 75 6e 74 20 74 61 62 6c 65 0a 2a 2a 20 69  count table.** i
1bf20 73 20 61 73 73 75 6d 65 64 20 74 6f 20 63 6f 6e  s assumed to con
1bf30 74 61 69 6e 20 74 68 65 20 73 61 6d 65 20 63 6f  tain the same co
1bf40 6c 75 6d 6e 73 20 61 73 3a 0a 2a 2a 0a 2a 2a 20  lumns as:.**.** 
1bf50 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 72    CREATE TABLE r
1bf60 62 75 5f 63 6f 75 6e 74 28 74 62 6c 20 54 45 58  bu_count(tbl TEX
1bf70 54 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 63  T PRIMARY KEY, c
1bf80 6e 74 20 49 4e 54 45 47 45 52 29 20 57 49 54 48  nt INTEGER) WITH
1bf90 4f 55 54 20 52 4f 57 49 44 3b 0a 2a 2a 0a 2a 2a  OUT ROWID;.**.**
1bfa0 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65   There should be
1bfb0 20 6f 6e 65 20 72 6f 77 20 69 6e 20 74 68 65 20   one row in the 
1bfc0 74 61 62 6c 65 20 66 6f 72 20 65 61 63 68 20 64  table for each d
1bfd0 61 74 61 5f 78 78 78 20 74 61 62 6c 65 20 69 6e  ata_xxx table in
1bfe0 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
1bff0 2e 20 54 68 65 20 27 74 62 6c 27 20 63 6f 6c 75  . The 'tbl' colu
1c000 6d 6e 20 73 68 6f 75 6c 64 20 63 6f 6e 74 61 69  mn should contai
1c010 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  n the name of a 
1c020 64 61 74 61 5f 78 78 78 20 74 61 62 6c 65 2c 0a  data_xxx table,.
1c030 2a 2a 20 61 6e 64 20 74 68 65 20 63 6e 74 20 63  ** and the cnt c
1c040 6f 6c 75 6d 6e 20 74 68 65 20 6e 75 6d 62 65 72  olumn the number
1c050 20 6f 66 20 72 6f 77 73 20 69 74 20 63 6f 6e 74   of rows it cont
1c060 61 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 73 71 6c 69  ains..**.** sqli
1c070 74 65 33 72 62 75 2e 6e 50 68 61 73 65 4f 6e 65  te3rbu.nPhaseOne
1c080 53 74 65 70 20 69 73 20 69 6e 69 74 69 61 6c 69  Step is initiali
1c090 7a 65 64 20 74 6f 20 74 68 65 20 73 75 6d 20 6f  zed to the sum o
1c0a0 66 20 28 31 20 2b 20 6e 49 6e 64 65 78 29 20 2a  f (1 + nIndex) *
1c0b0 20 63 6e 74 0a 2a 2a 20 66 6f 72 20 61 6c 6c 20   cnt.** for all 
1c0c0 72 6f 77 73 20 69 6e 20 74 68 65 20 72 62 75 5f  rows in the rbu_
1c0d0 63 6f 75 6e 74 20 74 61 62 6c 65 2c 20 77 68 65  count table, whe
1c0e0 72 65 20 6e 49 6e 64 65 78 20 69 73 20 74 68 65  re nIndex is the
1c0f0 20 6e 75 6d 62 65 72 20 6f 66 20 0a 2a 2a 20 69   number of .** i
1c100 6e 64 65 78 65 73 20 6f 6e 20 74 68 65 20 63 6f  ndexes on the co
1c110 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61 72 67  rresponding targ
1c120 65 74 20 64 61 74 61 62 61 73 65 20 74 61 62 6c  et database tabl
1c130 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
1c140 64 20 72 62 75 49 6e 69 74 50 68 61 73 65 4f 6e  d rbuInitPhaseOn
1c150 65 53 74 65 70 73 28 73 71 6c 69 74 65 33 72 62  eSteps(sqlite3rb
1c160 75 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  u *p){.  if( p->
1c170 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1c180 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  .    sqlite3_stm
1c190 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  t *pStmt = 0;.  
1c1a0 20 20 69 6e 74 20 62 45 78 69 73 74 73 20 3d 20    int bExists = 
1c1b0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1c1c0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 62 75    /* True if rbu
1c1d0 5f 63 6f 75 6e 74 20 65 78 69 73 74 73 20 2a 2f  _count exists */
1c1e0 0a 0a 20 20 20 20 70 2d 3e 6e 50 68 61 73 65 4f  ..    p->nPhaseO
1c1f0 6e 65 53 74 65 70 20 3d 20 2d 31 3b 0a 0a 20 20  neStep = -1;..  
1c200 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65    p->rc = sqlite
1c210 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
1c220 6e 28 70 2d 3e 64 62 52 62 75 2c 20 0a 20 20 20  n(p->dbRbu, .   
1c230 20 20 20 20 20 22 72 62 75 5f 69 6e 64 65 78 5f       "rbu_index_
1c240 63 6e 74 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f  cnt", 1, SQLITE_
1c250 55 54 46 38 2c 20 28 76 6f 69 64 2a 29 70 2c 20  UTF8, (void*)p, 
1c260 72 62 75 49 6e 64 65 78 43 6e 74 46 75 6e 63 2c  rbuIndexCntFunc,
1c270 20 30 2c 20 30 0a 20 20 20 20 29 3b 0a 20 20 0a   0, 0.    );.  .
1c280 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72      /* Check for
1c290 20 74 68 65 20 72 62 75 5f 63 6f 75 6e 74 20 74   the rbu_count t
1c2a0 61 62 6c 65 2e 20 49 66 20 69 74 20 64 6f 65 73  able. If it does
1c2b0 20 6e 6f 74 20 65 78 69 73 74 2c 20 6f 72 20 69   not exist, or i
1c2c0 66 20 61 6e 20 65 72 72 6f 72 0a 20 20 20 20 2a  f an error.    *
1c2d0 2a 20 6f 63 63 75 72 73 2c 20 6e 50 68 61 73 65  * occurs, nPhase
1c2e0 4f 6e 65 53 74 65 70 20 77 69 6c 6c 20 62 65 20  OneStep will be 
1c2f0 6c 65 66 74 20 73 65 74 20 74 6f 20 2d 31 2e 20  left set to -1. 
1c300 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  */.    if( p->rc
1c310 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1c320 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 72 65       p->rc = pre
1c330 70 61 72 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72  pareAndCollectEr
1c340 72 6f 72 28 70 2d 3e 64 62 52 62 75 2c 20 26 70  ror(p->dbRbu, &p
1c350 53 74 6d 74 2c 20 26 70 2d 3e 7a 45 72 72 6d 73  Stmt, &p->zErrms
1c360 67 2c 0a 20 20 20 20 20 20 20 20 20 20 22 53 45  g,.          "SE
1c370 4c 45 43 54 20 31 20 46 52 4f 4d 20 73 71 6c 69  LECT 1 FROM sqli
1c380 74 65 5f 6d 61 73 74 65 72 20 57 48 45 52 45 20  te_master WHERE 
1c390 74 62 6c 5f 6e 61 6d 65 20 3d 20 27 72 62 75 5f  tbl_name = 'rbu_
1c3a0 63 6f 75 6e 74 27 22 0a 20 20 20 20 20 20 29 3b  count'".      );
1c3b0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1c3c0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
1c3d0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c  ){.      if( SQL
1c3e0 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
1c3f0 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a  _step(pStmt) ){.
1c400 20 20 20 20 20 20 20 20 62 45 78 69 73 74 73 20          bExists 
1c410 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
1c420 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74     p->rc = sqlit
1c430 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
1c440 74 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  t);.    }.  .   
1c450 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
1c460 54 45 5f 4f 4b 20 26 26 20 62 45 78 69 73 74 73  TE_OK && bExists
1c470 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20   ){.      p->rc 
1c480 3d 20 70 72 65 70 61 72 65 41 6e 64 43 6f 6c 6c  = prepareAndColl
1c490 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 52 62  ectError(p->dbRb
1c4a0 75 2c 20 26 70 53 74 6d 74 2c 20 26 70 2d 3e 7a  u, &pStmt, &p->z
1c4b0 45 72 72 6d 73 67 2c 0a 20 20 20 20 20 20 20 20  Errmsg,.        
1c4c0 20 20 22 53 45 4c 45 43 54 20 73 75 6d 28 63 6e    "SELECT sum(cn
1c4d0 74 20 2a 20 28 31 20 2b 20 72 62 75 5f 69 6e 64  t * (1 + rbu_ind
1c4e0 65 78 5f 63 6e 74 28 72 62 75 5f 74 61 72 67 65  ex_cnt(rbu_targe
1c4f0 74 5f 6e 61 6d 65 28 74 62 6c 29 29 29 29 22 0a  t_name(tbl))))".
1c500 20 20 20 20 20 20 20 20 20 20 22 46 52 4f 4d 20            "FROM 
1c510 72 62 75 5f 63 6f 75 6e 74 22 0a 20 20 20 20 20  rbu_count".     
1c520 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   );.      if( p-
1c530 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
1c540 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 53 51  {.        if( SQ
1c550 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65  LITE_ROW==sqlite
1c560 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b  3_step(pStmt) ){
1c570 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 50  .          p->nP
1c580 68 61 73 65 4f 6e 65 53 74 65 70 20 3d 20 73 71  haseOneStep = sq
1c590 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
1c5a0 36 34 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  64(pStmt, 0);.  
1c5b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1c5c0 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  p->rc = sqlite3_
1c5d0 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
1c5e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1c5f0 20 7d 0a 7d 0a 0a 0a 73 74 61 74 69 63 20 73 71   }.}...static sq
1c600 6c 69 74 65 33 72 62 75 20 2a 6f 70 65 6e 52 62  lite3rbu *openRb
1c610 75 48 61 6e 64 6c 65 28 0a 20 20 63 6f 6e 73 74  uHandle(.  const
1c620 20 63 68 61 72 20 2a 7a 54 61 72 67 65 74 2c 20   char *zTarget, 
1c630 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1c640 52 62 75 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  Rbu,.  const cha
1c650 72 20 2a 7a 53 74 61 74 65 0a 29 7b 0a 20 20 73  r *zState.){.  s
1c660 71 6c 69 74 65 33 72 62 75 20 2a 70 3b 0a 20 20  qlite3rbu *p;.  
1c670 73 69 7a 65 5f 74 20 6e 54 61 72 67 65 74 20 3d  size_t nTarget =
1c680 20 7a 54 61 72 67 65 74 20 3f 20 73 74 72 6c 65   zTarget ? strle
1c690 6e 28 7a 54 61 72 67 65 74 29 20 3a 20 30 3b 0a  n(zTarget) : 0;.
1c6a0 20 20 73 69 7a 65 5f 74 20 6e 52 62 75 20 3d 20    size_t nRbu = 
1c6b0 73 74 72 6c 65 6e 28 7a 52 62 75 29 3b 0a 20 20  strlen(zRbu);.  
1c6c0 73 69 7a 65 5f 74 20 6e 42 79 74 65 20 3d 20 73  size_t nByte = s
1c6d0 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 72 62 75  izeof(sqlite3rbu
1c6e0 29 20 2b 20 6e 54 61 72 67 65 74 2b 31 20 2b 20  ) + nTarget+1 + 
1c6f0 6e 52 62 75 2b 31 3b 0a 0a 20 20 70 20 3d 20 28  nRbu+1;..  p = (
1c700 73 71 6c 69 74 65 33 72 62 75 2a 29 73 71 6c 69  sqlite3rbu*)sqli
1c710 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 42 79  te3_malloc64(nBy
1c720 74 65 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a  te);.  if( p ){.
1c730 20 20 20 20 52 62 75 53 74 61 74 65 20 2a 70 53      RbuState *pS
1c740 74 61 74 65 20 3d 20 30 3b 0a 0a 20 20 20 20 2f  tate = 0;..    /
1c750 2a 20 43 72 65 61 74 65 20 74 68 65 20 63 75 73  * Create the cus
1c760 74 6f 6d 20 56 46 53 2e 20 2a 2f 0a 20 20 20 20  tom VFS. */.    
1c770 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a  memset(p, 0, siz
1c780 65 6f 66 28 73 71 6c 69 74 65 33 72 62 75 29 29  eof(sqlite3rbu))
1c790 3b 0a 20 20 20 20 72 62 75 43 72 65 61 74 65 56  ;.    rbuCreateV
1c7a0 66 73 28 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f  fs(p);..    /* O
1c7b0 70 65 6e 20 74 68 65 20 74 61 72 67 65 74 2c 20  pen the target, 
1c7c0 52 42 55 20 61 6e 64 20 73 74 61 74 65 20 64 61  RBU and state da
1c7d0 74 61 62 61 73 65 73 20 2a 2f 0a 20 20 20 20 69  tabases */.    i
1c7e0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
1c7f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 63 68 61  _OK ){.      cha
1c800 72 20 2a 70 43 73 72 20 3d 20 28 63 68 61 72 2a  r *pCsr = (char*
1c810 29 26 70 5b 31 5d 3b 0a 20 20 20 20 20 20 69 6e  )&p[1];.      in
1c820 74 20 62 52 65 74 72 79 20 3d 20 30 3b 0a 20 20  t bRetry = 0;.  
1c830 20 20 20 20 69 66 28 20 7a 54 61 72 67 65 74 20      if( zTarget 
1c840 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 7a 54  ){.        p->zT
1c850 61 72 67 65 74 20 3d 20 70 43 73 72 3b 0a 20 20  arget = pCsr;.  
1c860 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e        memcpy(p->
1c870 7a 54 61 72 67 65 74 2c 20 7a 54 61 72 67 65 74  zTarget, zTarget
1c880 2c 20 6e 54 61 72 67 65 74 2b 31 29 3b 0a 20 20  , nTarget+1);.  
1c890 20 20 20 20 20 20 70 43 73 72 20 2b 3d 20 6e 54        pCsr += nT
1c8a0 61 72 67 65 74 2b 31 3b 0a 20 20 20 20 20 20 7d  arget+1;.      }
1c8b0 0a 20 20 20 20 20 20 70 2d 3e 7a 52 62 75 20 3d  .      p->zRbu =
1c8c0 20 70 43 73 72 3b 0a 20 20 20 20 20 20 6d 65 6d   pCsr;.      mem
1c8d0 63 70 79 28 70 2d 3e 7a 52 62 75 2c 20 7a 52 62  cpy(p->zRbu, zRb
1c8e0 75 2c 20 6e 52 62 75 2b 31 29 3b 0a 20 20 20 20  u, nRbu+1);.    
1c8f0 20 20 70 43 73 72 20 2b 3d 20 6e 52 62 75 2b 31    pCsr += nRbu+1
1c900 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 53 74 61  ;.      if( zSta
1c910 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  te ){.        p-
1c920 3e 7a 53 74 61 74 65 20 3d 20 72 62 75 4d 50 72  >zState = rbuMPr
1c930 69 6e 74 66 28 70 2c 20 22 25 73 22 2c 20 7a 53  intf(p, "%s", zS
1c940 74 61 74 65 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  tate);.      }..
1c950 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
1c960 66 69 72 73 74 20 61 74 74 65 6d 70 74 20 74 6f  first attempt to
1c970 20 6f 70 65 6e 20 74 68 65 20 64 61 74 61 62 61   open the databa
1c980 73 65 20 66 69 6c 65 20 66 61 69 6c 73 20 61 6e  se file fails an
1c990 64 20 74 68 65 20 62 52 65 74 72 79 0a 20 20 20  d the bRetry.   
1c9a0 20 20 20 2a 2a 20 66 6c 61 67 20 69 74 20 73 65     ** flag it se
1c9b0 74 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 74 68  t, this means th
1c9c0 61 74 20 74 68 65 20 64 62 20 77 61 73 20 6e 6f  at the db was no
1c9d0 74 20 6f 70 65 6e 65 64 20 62 65 63 61 75 73 65  t opened because
1c9e0 20 69 74 20 73 65 65 6d 65 64 0a 20 20 20 20 20   it seemed.     
1c9f0 20 2a 2a 20 74 6f 20 62 65 20 61 20 77 61 6c 2d   ** to be a wal-
1ca00 6d 6f 64 65 20 64 62 2e 20 42 75 74 2c 20 74 68  mode db. But, th
1ca10 69 73 20 6d 61 79 20 68 61 76 65 20 68 61 70 70  is may have happ
1ca20 65 6e 65 64 20 64 75 65 20 74 6f 20 61 6e 20 65  ened due to an e
1ca30 61 72 6c 69 65 72 0a 20 20 20 20 20 20 2a 2a 20  arlier.      ** 
1ca40 52 42 55 20 76 61 63 75 75 6d 20 6f 70 65 72 61  RBU vacuum opera
1ca50 74 69 6f 6e 20 6c 65 61 76 69 6e 67 20 61 6e 20  tion leaving an 
1ca60 6f 6c 64 20 77 61 6c 20 66 69 6c 65 20 69 6e 20  old wal file in 
1ca70 74 68 65 20 64 69 72 65 63 74 6f 72 79 2e 0a 20  the directory.. 
1ca80 20 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20       ** If this 
1ca90 69 73 20 74 68 65 20 63 61 73 65 2c 20 69 74 20  is the case, it 
1caa0 77 69 6c 6c 20 68 61 76 65 20 62 65 65 6e 20 63  will have been c
1cab0 68 65 63 6b 70 6f 69 6e 74 65 64 20 61 6e 64 20  heckpointed and 
1cac0 64 65 6c 65 74 65 64 0a 20 20 20 20 20 20 2a 2a  deleted.      **
1cad0 20 77 68 65 6e 20 74 68 65 20 68 61 6e 64 6c 65   when the handle
1cae0 20 77 61 73 20 63 6c 6f 73 65 64 20 61 6e 64 20   was closed and 
1caf0 61 20 73 65 63 6f 6e 64 20 61 74 74 65 6d 70 74  a second attempt
1cb00 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 0a 20 20   to open the .  
1cb10 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
1cb20 6d 61 79 20 73 75 63 63 65 65 64 2e 20 20 2a 2f  may succeed.  */
1cb30 0a 20 20 20 20 20 20 72 62 75 4f 70 65 6e 44 61  .      rbuOpenDa
1cb40 74 61 62 61 73 65 28 70 2c 20 26 62 52 65 74 72  tabase(p, &bRetr
1cb50 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62 52  y);.      if( bR
1cb60 65 74 72 79 20 29 7b 0a 20 20 20 20 20 20 20 20  etry ){.        
1cb70 72 62 75 4f 70 65 6e 44 61 74 61 62 61 73 65 28  rbuOpenDatabase(
1cb80 70 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  p, 0);.      }. 
1cb90 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 2d     }..    if( p-
1cba0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
1cbb0 7b 0a 20 20 20 20 20 20 70 53 74 61 74 65 20 3d  {.      pState =
1cbc0 20 72 62 75 4c 6f 61 64 53 74 61 74 65 28 70 29   rbuLoadState(p)
1cbd0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1cbe0 70 53 74 61 74 65 20 7c 7c 20 70 2d 3e 72 63 21  pState || p->rc!
1cbf0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
1cc00 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
1cc10 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 0a 20 20 20  QLITE_OK ){..   
1cc20 20 20 20 20 20 69 66 28 20 70 53 74 61 74 65 2d       if( pState-
1cc30 3e 65 53 74 61 67 65 3d 3d 30 20 29 7b 20 0a 20  >eStage==0 ){ . 
1cc40 20 20 20 20 20 20 20 20 20 72 62 75 44 65 6c 65           rbuDele
1cc50 74 65 4f 61 6c 46 69 6c 65 28 70 29 3b 0a 20 20  teOalFile(p);.  
1cc60 20 20 20 20 20 20 20 20 72 62 75 49 6e 69 74 50          rbuInitP
1cc70 68 61 73 65 4f 6e 65 53 74 65 70 73 28 70 29 3b  haseOneSteps(p);
1cc80 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 65 53  .          p->eS
1cc90 74 61 67 65 20 3d 20 52 42 55 5f 53 54 41 47 45  tage = RBU_STAGE
1cca0 5f 4f 41 4c 3b 0a 20 20 20 20 20 20 20 20 7d 65  _OAL;.        }e
1ccb0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
1ccc0 2d 3e 65 53 74 61 67 65 20 3d 20 70 53 74 61 74  ->eStage = pStat
1ccd0 65 2d 3e 65 53 74 61 67 65 3b 0a 20 20 20 20 20  e->eStage;.     
1cce0 20 20 20 20 20 70 2d 3e 6e 50 68 61 73 65 4f 6e       p->nPhaseOn
1ccf0 65 53 74 65 70 20 3d 20 70 53 74 61 74 65 2d 3e  eStep = pState->
1cd00 6e 50 68 61 73 65 4f 6e 65 53 74 65 70 3b 0a 20  nPhaseOneStep;. 
1cd10 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1cd20 20 70 2d 3e 6e 50 72 6f 67 72 65 73 73 20 3d 20   p->nProgress = 
1cd30 70 53 74 61 74 65 2d 3e 6e 50 72 6f 67 72 65 73  pState->nProgres
1cd40 73 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 4f  s;.        p->iO
1cd50 61 6c 53 7a 20 3d 20 70 53 74 61 74 65 2d 3e 69  alSz = pState->i
1cd60 4f 61 6c 53 7a 3b 0a 20 20 20 20 20 20 7d 0a 20  OalSz;.      }. 
1cd70 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
1cd80 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f   p->rc!=SQLITE_O
1cd90 4b 20 7c 7c 20 70 2d 3e 65 53 74 61 67 65 21 3d  K || p->eStage!=
1cda0 30 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d  0 );..    if( p-
1cdb0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
1cdc0 26 20 70 2d 3e 70 54 61 72 67 65 74 46 64 2d 3e  & p->pTargetFd->
1cdd0 70 57 61 6c 46 64 20 29 7b 0a 20 20 20 20 20 20  pWalFd ){.      
1cde0 69 66 28 20 70 2d 3e 65 53 74 61 67 65 3d 3d 52  if( p->eStage==R
1cdf0 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20 29 7b 0a  BU_STAGE_OAL ){.
1ce00 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
1ce10 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
1ce20 20 20 20 20 20 20 70 2d 3e 7a 45 72 72 6d 73 67        p->zErrmsg
1ce30 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
1ce40 74 66 28 22 63 61 6e 6e 6f 74 20 75 70 64 61 74  tf("cannot updat
1ce50 65 20 77 61 6c 20 6d 6f 64 65 20 64 61 74 61 62  e wal mode datab
1ce60 61 73 65 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ase");.      }el
1ce70 73 65 20 69 66 28 20 70 2d 3e 65 53 74 61 67 65  se if( p->eStage
1ce80 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4d 4f 56 45  ==RBU_STAGE_MOVE
1ce90 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65   ){.        p->e
1cea0 53 74 61 67 65 20 3d 20 52 42 55 5f 53 54 41 47  Stage = RBU_STAG
1ceb0 45 5f 43 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  E_CKPT;.        
1cec0 70 2d 3e 6e 53 74 65 70 20 3d 20 30 3b 0a 20 20  p->nStep = 0;.  
1ced0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1cee0 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
1cef0 54 45 5f 4f 4b 20 0a 20 20 20 20 20 26 26 20 28  TE_OK .     && (
1cf00 70 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53  p->eStage==RBU_S
1cf10 54 41 47 45 5f 4f 41 4c 20 7c 7c 20 70 2d 3e 65  TAGE_OAL || p->e
1cf20 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45  Stage==RBU_STAGE
1cf30 5f 4d 4f 56 45 29 0a 20 20 20 20 20 26 26 20 70  _MOVE).     && p
1cf40 53 74 61 74 65 2d 3e 65 53 74 61 67 65 21 3d 30  State->eStage!=0
1cf50 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 62  .    ){.      rb
1cf60 75 5f 66 69 6c 65 20 2a 70 46 64 20 3d 20 28 72  u_file *pFd = (r
1cf70 62 75 49 73 56 61 63 75 75 6d 28 70 29 20 3f 20  buIsVacuum(p) ? 
1cf80 70 2d 3e 70 52 62 75 46 64 20 3a 20 70 2d 3e 70  p->pRbuFd : p->p
1cf90 54 61 72 67 65 74 46 64 29 3b 0a 20 20 20 20 20  TargetFd);.     
1cfa0 20 69 66 28 20 70 46 64 2d 3e 69 43 6f 6f 6b 69   if( pFd->iCooki
1cfb0 65 21 3d 70 53 74 61 74 65 2d 3e 69 43 6f 6f 6b  e!=pState->iCook
1cfc0 69 65 20 29 7b 20 20 20 0a 20 20 20 20 20 20 20  ie ){   .       
1cfd0 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
1cfe0 74 20 28 70 54 61 72 67 65 74 46 64 2d 3e 69 43  t (pTargetFd->iC
1cff0 6f 6f 6b 69 65 29 20 63 6f 6e 74 61 69 6e 73 20  ookie) contains 
1d000 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
1d010 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 68 61 6e  .        ** chan
1d020 67 65 2d 63 6f 75 6e 74 65 72 20 63 6f 6f 6b 69  ge-counter cooki
1d030 65 20 28 74 68 65 20 74 68 69 6e 67 20 74 68 61  e (the thing tha
1d040 74 20 67 65 74 73 20 69 6e 63 72 65 6d 65 6e 74  t gets increment
1d050 65 64 20 77 68 65 6e 20 61 20 0a 20 20 20 20 20  ed when a .     
1d060 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
1d070 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 20 69  n is committed i
1d080 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 29  n rollback mode)
1d090 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65   currently store
1d0a0 64 20 6f 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a  d on .        **
1d0b0 20 70 61 67 65 20 31 20 6f 66 20 74 68 65 20 64   page 1 of the d
1d0c0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f  atabase file. */
1d0d0 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  .        p->rc =
1d0e0 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
1d0f0 20 20 20 20 20 20 70 2d 3e 7a 45 72 72 6d 73 67        p->zErrmsg
1d100 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
1d110 74 66 28 22 64 61 74 61 62 61 73 65 20 6d 6f 64  tf("database mod
1d120 69 66 69 65 64 20 64 75 72 69 6e 67 20 72 62 75  ified during rbu
1d130 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20   %s",.          
1d140 20 20 28 72 62 75 49 73 56 61 63 75 75 6d 28 70    (rbuIsVacuum(p
1d150 29 20 3f 20 22 76 61 63 75 75 6d 22 20 3a 20 22  ) ? "vacuum" : "
1d160 75 70 64 61 74 65 22 29 0a 20 20 20 20 20 20 20  update").       
1d170 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
1d180 7d 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  }..    if( p->rc
1d190 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1d1a0 20 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74 61       if( p->eSta
1d1b0 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4f 41  ge==RBU_STAGE_OA
1d1c0 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  L ){.        sql
1d1d0 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
1d1e0 4d 61 69 6e 3b 0a 20 20 20 20 20 20 20 20 70 2d  Main;.        p-
1d1f0 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78  >rc = sqlite3_ex
1d200 65 63 28 70 2d 3e 64 62 52 62 75 2c 20 22 42 45  ec(p->dbRbu, "BE
1d210 47 49 4e 22 2c 20 30 2c 20 30 2c 20 26 70 2d 3e  GIN", 0, 0, &p->
1d220 7a 45 72 72 6d 73 67 29 3b 0a 0a 20 20 20 20 20  zErrmsg);..     
1d230 20 20 20 2f 2a 20 50 6f 69 6e 74 20 74 68 65 20     /* Point the 
1d240 6f 62 6a 65 63 74 20 69 74 65 72 61 74 6f 72 20  object iterator 
1d250 61 74 20 74 68 65 20 66 69 72 73 74 20 6f 62 6a  at the first obj
1d260 65 63 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ect */.        i
1d270 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
1d280 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1d290 20 70 2d 3e 72 63 20 3d 20 72 62 75 4f 62 6a 49   p->rc = rbuObjI
1d2a0 74 65 72 46 69 72 73 74 28 70 2c 20 26 70 2d 3e  terFirst(p, &p->
1d2b0 6f 62 6a 69 74 65 72 29 3b 0a 20 20 20 20 20 20  objiter);.      
1d2c0 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
1d2d0 49 66 20 74 68 65 20 52 42 55 20 64 61 74 61 62  If the RBU datab
1d2e0 61 73 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20  ase contains no 
1d2f0 64 61 74 61 5f 78 78 78 20 74 61 62 6c 65 73 2c  data_xxx tables,
1d300 20 64 65 63 6c 61 72 65 20 74 68 65 20 52 42 55   declare the RBU
1d310 0a 20 20 20 20 20 20 20 20 2a 2a 20 75 70 64 61  .        ** upda
1d320 74 65 20 66 69 6e 69 73 68 65 64 2e 20 20 2a 2f  te finished.  */
1d330 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
1d340 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1d350 20 70 2d 3e 6f 62 6a 69 74 65 72 2e 7a 54 62 6c   p->objiter.zTbl
1d360 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
1d370 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
1d380 44 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 20 20  DONE;.          
1d390 70 2d 3e 65 53 74 61 67 65 20 3d 20 52 42 55 5f  p->eStage = RBU_
1d3a0 53 54 41 47 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  STAGE_DONE;.    
1d3b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1d3c0 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
1d3d0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 53 74  SQLITE_OK && pSt
1d3e0 61 74 65 2d 3e 65 53 74 61 67 65 3d 3d 30 20 26  ate->eStage==0 &
1d3f0 26 20 72 62 75 49 73 56 61 63 75 75 6d 28 70 29  & rbuIsVacuum(p)
1d400 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1d410 72 62 75 43 6f 70 79 50 72 61 67 6d 61 28 70 2c  rbuCopyPragma(p,
1d420 20 22 70 61 67 65 5f 73 69 7a 65 22 29 3b 0a 20   "page_size");. 
1d430 20 20 20 20 20 20 20 20 20 20 20 72 62 75 43 6f             rbuCo
1d440 70 79 50 72 61 67 6d 61 28 70 2c 20 22 61 75 74  pyPragma(p, "aut
1d450 6f 5f 76 61 63 75 75 6d 22 29 3b 0a 20 20 20 20  o_vacuum");.    
1d460 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
1d470 20 20 20 2f 2a 20 4f 70 65 6e 20 74 72 61 6e 73     /* Open trans
1d480 61 63 74 69 6f 6e 73 20 62 6f 74 68 20 64 61 74  actions both dat
1d490 61 62 61 73 65 73 2e 20 54 68 65 20 2a 2d 6f 61  abases. The *-oa
1d4a0 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64  l file is opened
1d4b0 20 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   or.          **
1d4c0 20 63 72 65 61 74 65 64 20 61 74 20 74 68 69 73   created at this
1d4d0 20 70 6f 69 6e 74 2e 20 2a 2f 0a 20 20 20 20 20   point. */.     
1d4e0 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
1d4f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1d500 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d           p->rc =
1d510 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62   sqlite3_exec(db
1d520 2c 20 22 42 45 47 49 4e 20 49 4d 4d 45 44 49 41  , "BEGIN IMMEDIA
1d530 54 45 22 2c 20 30 2c 20 30 2c 20 26 70 2d 3e 7a  TE", 0, 0, &p->z
1d540 45 72 72 6d 73 67 29 3b 0a 20 20 20 20 20 20 20  Errmsg);.       
1d550 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20     }..          
1d560 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20  /* Check if the 
1d570 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 69 73  main database is
1d580 20 61 20 7a 69 70 76 66 73 20 64 62 2e 20 49 66   a zipvfs db. If
1d590 20 69 74 20 69 73 2c 20 73 65 74 20 74 68 65 20   it is, set the 
1d5a0 75 70 70 65 72 0a 20 20 20 20 20 20 20 20 20 20  upper.          
1d5b0 2a 2a 20 6c 65 76 65 6c 20 70 61 67 65 72 20 74  ** level pager t
1d5c0 6f 20 75 73 65 20 22 6a 6f 75 72 6e 61 6c 5f 6d  o use "journal_m
1d5d0 6f 64 65 3d 6f 66 66 22 2e 20 54 68 69 73 20 70  ode=off". This p
1d5e0 72 65 76 65 6e 74 73 20 69 74 20 66 72 6f 6d 20  revents it from 
1d5f0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 67 65  .          ** ge
1d600 6e 65 72 61 74 69 6e 67 20 61 20 6c 61 72 67 65  nerating a large
1d610 20 6a 6f 75 72 6e 61 6c 20 75 73 69 6e 67 20 61   journal using a
1d620 20 74 65 6d 70 20 66 69 6c 65 2e 20 20 2a 2f 0a   temp file.  */.
1d630 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d            if( p-
1d640 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
1d650 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
1d660 74 20 66 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  t frc = sqlite3_
1d670 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c  file_control(db,
1d680 20 22 6d 61 69 6e 22 2c 20 53 51 4c 49 54 45 5f   "main", SQLITE_
1d690 46 43 4e 54 4c 5f 5a 49 50 56 46 53 2c 20 30 29  FCNTL_ZIPVFS, 0)
1d6a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
1d6b0 28 20 66 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  ( frc==SQLITE_OK
1d6c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1d6d0 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65    p->rc = sqlite
1d6e0 33 5f 65 78 65 63 28 0a 20 20 20 20 20 20 20 20  3_exec(.        
1d6f0 20 20 20 20 20 20 20 20 64 62 2c 20 22 50 52 41          db, "PRA
1d700 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
1d710 3d 6f 66 66 22 2c 30 2c 30 2c 26 70 2d 3e 7a 45  =off",0,0,&p->zE
1d720 72 72 6d 73 67 29 3b 0a 20 20 20 20 20 20 20 20  rrmsg);.        
1d730 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1d740 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  }..          if(
1d750 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1d760 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
1d770 20 72 62 75 53 65 74 75 70 4f 61 6c 28 70 2c 20   rbuSetupOal(p, 
1d780 70 53 74 61 74 65 29 3b 0a 20 20 20 20 20 20 20  pState);.       
1d790 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
1d7a0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
1d7b0 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54  ->eStage==RBU_ST
1d7c0 41 47 45 5f 4d 4f 56 45 20 29 7b 0a 20 20 20 20  AGE_MOVE ){.    
1d7d0 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a      /* no-op */.
1d7e0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1d7f0 70 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53  p->eStage==RBU_S
1d800 54 41 47 45 5f 43 4b 50 54 20 29 7b 0a 20 20 20  TAGE_CKPT ){.   
1d810 20 20 20 20 20 72 62 75 53 65 74 75 70 43 68 65       rbuSetupChe
1d820 63 6b 70 6f 69 6e 74 28 70 2c 20 70 53 74 61 74  ckpoint(p, pStat
1d830 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  e);.      }else 
1d840 69 66 28 20 70 2d 3e 65 53 74 61 67 65 3d 3d 52  if( p->eStage==R
1d850 42 55 5f 53 54 41 47 45 5f 44 4f 4e 45 20 29 7b  BU_STAGE_DONE ){
1d860 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  .        p->rc =
1d870 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
1d880 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1d890 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
1d8a0 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20  E_CORRUPT;.     
1d8b0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 62   }.    }..    rb
1d8c0 75 46 72 65 65 53 74 61 74 65 28 70 53 74 61 74  uFreeState(pStat
1d8d0 65 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  e);.  }..  retur
1d8e0 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  n p;.}../*.** Al
1d8f0 6c 6f 63 61 74 65 20 61 6e 64 20 72 65 74 75 72  locate and retur
1d900 6e 20 61 6e 20 52 42 55 20 68 61 6e 64 6c 65 20  n an RBU handle 
1d910 77 69 74 68 20 61 6c 6c 20 66 69 65 6c 64 73 20  with all fields 
1d920 7a 65 72 6f 65 64 20 65 78 63 65 70 74 20 66 6f  zeroed except fo
1d930 72 20 74 68 65 0a 2a 2a 20 65 72 72 6f 72 20 63  r the.** error c
1d940 6f 64 65 2c 20 77 68 69 63 68 20 69 73 20 73 65  ode, which is se
1d950 74 20 74 6f 20 53 51 4c 49 54 45 5f 4d 49 53 55  t to SQLITE_MISU
1d960 53 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71  SE..*/.static sq
1d970 6c 69 74 65 33 72 62 75 20 2a 72 62 75 4d 69 73  lite3rbu *rbuMis
1d980 75 73 65 45 72 72 6f 72 28 76 6f 69 64 29 7b 0a  useError(void){.
1d990 20 20 73 71 6c 69 74 65 33 72 62 75 20 2a 70 52    sqlite3rbu *pR
1d9a0 65 74 3b 0a 20 20 70 52 65 74 20 3d 20 73 71 6c  et;.  pRet = sql
1d9b0 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 73 69  ite3_malloc64(si
1d9c0 7a 65 6f 66 28 73 71 6c 69 74 65 33 72 62 75 29  zeof(sqlite3rbu)
1d9d0 29 3b 0a 20 20 69 66 28 20 70 52 65 74 20 29 7b  );.  if( pRet ){
1d9e0 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 52 65 74  .    memset(pRet
1d9f0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 71 6c 69  , 0, sizeof(sqli
1da00 74 65 33 72 62 75 29 29 3b 0a 20 20 20 20 70 52  te3rbu));.    pR
1da10 65 74 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f  et->rc = SQLITE_
1da20 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 20 20 72 65  MISUSE;.  }.  re
1da30 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a  turn pRet;.}../*
1da40 0a 2a 2a 20 4f 70 65 6e 20 61 6e 64 20 72 65 74  .** Open and ret
1da50 75 72 6e 20 61 20 6e 65 77 20 52 42 55 20 68 61  urn a new RBU ha
1da60 6e 64 6c 65 2e 20 0a 2a 2f 0a 73 71 6c 69 74 65  ndle. .*/.sqlite
1da70 33 72 62 75 20 2a 73 71 6c 69 74 65 33 72 62 75  3rbu *sqlite3rbu
1da80 5f 6f 70 65 6e 28 0a 20 20 63 6f 6e 73 74 20 63  _open(.  const c
1da90 68 61 72 20 2a 7a 54 61 72 67 65 74 2c 20 0a 20  har *zTarget, . 
1daa0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 62   const char *zRb
1dab0 75 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  u,.  const char 
1dac0 2a 7a 53 74 61 74 65 0a 29 7b 0a 20 20 69 66 28  *zState.){.  if(
1dad0 20 7a 54 61 72 67 65 74 3d 3d 30 20 7c 7c 20 7a   zTarget==0 || z
1dae0 52 62 75 3d 3d 30 20 29 7b 20 72 65 74 75 72 6e  Rbu==0 ){ return
1daf0 20 72 62 75 4d 69 73 75 73 65 45 72 72 6f 72 28   rbuMisuseError(
1db00 29 3b 20 7d 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20  ); }.  /* TODO: 
1db10 43 68 65 63 6b 20 74 68 61 74 20 7a 54 61 72 67  Check that zTarg
1db20 65 74 20 61 6e 64 20 7a 52 62 75 20 61 72 65 20  et and zRbu are 
1db30 6e 6f 6e 2d 4e 55 4c 4c 20 2a 2f 0a 20 20 72 65  non-NULL */.  re
1db40 74 75 72 6e 20 6f 70 65 6e 52 62 75 48 61 6e 64  turn openRbuHand
1db50 6c 65 28 7a 54 61 72 67 65 74 2c 20 7a 52 62 75  le(zTarget, zRbu
1db60 2c 20 7a 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a  , zState);.}../*
1db70 0a 2a 2a 20 4f 70 65 6e 20 61 20 68 61 6e 64 6c  .** Open a handl
1db80 65 20 74 6f 20 62 65 67 69 6e 20 6f 72 20 72 65  e to begin or re
1db90 73 75 6d 65 20 61 6e 20 52 42 55 20 56 41 43 55  sume an RBU VACU
1dba0 55 4d 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f  UM operation..*/
1dbb0 0a 73 71 6c 69 74 65 33 72 62 75 20 2a 73 71 6c  .sqlite3rbu *sql
1dbc0 69 74 65 33 72 62 75 5f 76 61 63 75 75 6d 28 0a  ite3rbu_vacuum(.
1dbd0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
1dbe0 61 72 67 65 74 2c 20 0a 20 20 63 6f 6e 73 74 20  arget, .  const 
1dbf0 63 68 61 72 20 2a 7a 53 74 61 74 65 0a 29 7b 0a  char *zState.){.
1dc00 20 20 69 66 28 20 7a 54 61 72 67 65 74 3d 3d 30    if( zTarget==0
1dc10 20 29 7b 20 72 65 74 75 72 6e 20 72 62 75 4d 69   ){ return rbuMi
1dc20 73 75 73 65 45 72 72 6f 72 28 29 3b 20 7d 0a 20  suseError(); }. 
1dc30 20 2f 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20   /* TODO: Check 
1dc40 74 68 61 74 20 62 6f 74 68 20 61 72 67 75 6d 65  that both argume
1dc50 6e 74 73 20 61 72 65 20 6e 6f 6e 2d 4e 55 4c 4c  nts are non-NULL
1dc60 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 6f 70 65   */.  return ope
1dc70 6e 52 62 75 48 61 6e 64 6c 65 28 30 2c 20 7a 54  nRbuHandle(0, zT
1dc80 61 72 67 65 74 2c 20 7a 53 74 61 74 65 29 3b 0a  arget, zState);.
1dc90 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1dca0 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
1dcb0 64 6c 65 20 75 73 65 64 20 62 79 20 70 52 62 75  dle used by pRbu
1dcc0 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20 2a 73 71  ..*/.sqlite3 *sq
1dcd0 6c 69 74 65 33 72 62 75 5f 64 62 28 73 71 6c 69  lite3rbu_db(sqli
1dce0 74 65 33 72 62 75 20 2a 70 52 62 75 2c 20 69 6e  te3rbu *pRbu, in
1dcf0 74 20 62 52 62 75 29 7b 0a 20 20 73 71 6c 69 74  t bRbu){.  sqlit
1dd00 65 33 20 2a 64 62 20 3d 20 30 3b 0a 20 20 69 66  e3 *db = 0;.  if
1dd10 28 20 70 52 62 75 20 29 7b 0a 20 20 20 20 64 62  ( pRbu ){.    db
1dd20 20 3d 20 28 62 52 62 75 20 3f 20 70 52 62 75 2d   = (bRbu ? pRbu-
1dd30 3e 64 62 52 62 75 20 3a 20 70 52 62 75 2d 3e 64  >dbRbu : pRbu->d
1dd40 62 4d 61 69 6e 29 3b 0a 20 20 7d 0a 20 20 72 65  bMain);.  }.  re
1dd50 74 75 72 6e 20 64 62 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn db;.}.../*.
1dd60 2a 2a 20 49 66 20 74 68 65 20 65 72 72 6f 72 20  ** If the error 
1dd70 63 6f 64 65 20 63 75 72 72 65 6e 74 6c 79 20 73  code currently s
1dd80 74 6f 72 65 64 20 69 6e 20 74 68 65 20 52 42 55  tored in the RBU
1dd90 20 68 61 6e 64 6c 65 20 69 73 20 53 51 4c 49 54   handle is SQLIT
1dda0 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 0a 2a 2a  E_CONSTRAINT,.**
1ddb0 20 74 68 65 6e 20 65 64 69 74 20 61 6e 79 20 65   then edit any e
1ddc0 72 72 6f 72 20 6d 65 73 73 61 67 65 20 73 74 72  rror message str
1ddd0 69 6e 67 20 73 6f 20 61 73 20 74 6f 20 72 65 6d  ing so as to rem
1dde0 6f 76 65 20 61 6c 6c 20 6f 63 63 75 72 72 65 6e  ove all occurren
1ddf0 63 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 70 61  ces of.** the pa
1de00 74 74 65 72 6e 20 22 72 62 75 5f 69 6d 70 5f 5b  ttern "rbu_imp_[
1de10 30 2d 39 5d 2a 22 2e 0a 2a 2f 0a 73 74 61 74 69  0-9]*"..*/.stati
1de20 63 20 76 6f 69 64 20 72 62 75 45 64 69 74 45 72  c void rbuEditEr
1de30 72 6d 73 67 28 73 71 6c 69 74 65 33 72 62 75 20  rmsg(sqlite3rbu 
1de40 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63  *p){.  if( p->rc
1de50 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  ==SQLITE_CONSTRA
1de60 49 4e 54 20 26 26 20 70 2d 3e 7a 45 72 72 6d 73  INT && p->zErrms
1de70 67 20 29 7b 0a 20 20 20 20 75 6e 73 69 67 6e 65  g ){.    unsigne
1de80 64 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 69 7a  d int i;.    siz
1de90 65 5f 74 20 6e 45 72 72 6d 73 67 20 3d 20 73 74  e_t nErrmsg = st
1dea0 72 6c 65 6e 28 70 2d 3e 7a 45 72 72 6d 73 67 29  rlen(p->zErrmsg)
1deb0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
1dec0 3c 28 6e 45 72 72 6d 73 67 2d 38 29 3b 20 69 2b  <(nErrmsg-8); i+
1ded0 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6d 65  +){.      if( me
1dee0 6d 63 6d 70 28 26 70 2d 3e 7a 45 72 72 6d 73 67  mcmp(&p->zErrmsg
1def0 5b 69 5d 2c 20 22 72 62 75 5f 69 6d 70 5f 22 2c  [i], "rbu_imp_",
1df00 20 38 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   8)==0 ){.      
1df10 20 20 69 6e 74 20 6e 44 65 6c 20 3d 20 38 3b 0a    int nDel = 8;.
1df20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70          while( p
1df30 2d 3e 7a 45 72 72 6d 73 67 5b 69 2b 6e 44 65 6c  ->zErrmsg[i+nDel
1df40 5d 3e 3d 27 30 27 20 26 26 20 70 2d 3e 7a 45 72  ]>='0' && p->zEr
1df50 72 6d 73 67 5b 69 2b 6e 44 65 6c 5d 3c 3d 27 39  rmsg[i+nDel]<='9
1df60 27 20 29 20 6e 44 65 6c 2b 2b 3b 0a 20 20 20 20  ' ) nDel++;.    
1df70 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26 70 2d 3e      memmove(&p->
1df80 7a 45 72 72 6d 73 67 5b 69 5d 2c 20 26 70 2d 3e  zErrmsg[i], &p->
1df90 7a 45 72 72 6d 73 67 5b 69 2b 6e 44 65 6c 5d 2c  zErrmsg[i+nDel],
1dfa0 20 6e 45 72 72 6d 73 67 20 2b 20 31 20 2d 20 69   nErrmsg + 1 - i
1dfb0 20 2d 20 6e 44 65 6c 29 3b 0a 20 20 20 20 20 20   - nDel);.      
1dfc0 20 20 6e 45 72 72 6d 73 67 20 2d 3d 20 6e 44 65    nErrmsg -= nDe
1dfd0 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  l;.      }.    }
1dfe0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  .  }.}../*.** Cl
1dff0 6f 73 65 20 74 68 65 20 52 42 55 20 68 61 6e 64  ose the RBU hand
1e000 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  le..*/.int sqlit
1e010 65 33 72 62 75 5f 63 6c 6f 73 65 28 73 71 6c 69  e3rbu_close(sqli
1e020 74 65 33 72 62 75 20 2a 70 2c 20 63 68 61 72 20  te3rbu *p, char 
1e030 2a 2a 70 7a 45 72 72 6d 73 67 29 7b 0a 20 20 69  **pzErrmsg){.  i
1e040 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 70 20 29  nt rc;.  if( p )
1e050 7b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 6d 69 74  {..    /* Commit
1e060 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1e070 20 74 6f 20 74 68 65 20 2a 2d 6f 61 6c 20 66 69   to the *-oal fi
1e080 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  le. */.    if( p
1e090 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
1e0a0 26 26 20 70 2d 3e 65 53 74 61 67 65 3d 3d 52 42  && p->eStage==RB
1e0b0 55 5f 53 54 41 47 45 5f 4f 41 4c 20 29 7b 0a 20  U_STAGE_OAL ){. 
1e0c0 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c       p->rc = sql
1e0d0 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 4d  ite3_exec(p->dbM
1e0e0 61 69 6e 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30  ain, "COMMIT", 0
1e0f0 2c 20 30 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67  , 0, &p->zErrmsg
1e100 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
1e110 20 53 79 6e 63 20 74 68 65 20 64 62 20 66 69 6c   Sync the db fil
1e120 65 20 69 66 20 63 75 72 72 65 6e 74 6c 79 20 64  e if currently d
1e130 6f 69 6e 67 20 61 6e 20 69 6e 63 72 65 6d 65 6e  oing an incremen
1e140 74 61 6c 20 63 68 65 63 6b 70 6f 69 6e 74 20 2a  tal checkpoint *
1e150 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d  /.    if( p->rc=
1e160 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d  =SQLITE_OK && p-
1e170 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41  >eStage==RBU_STA
1e180 47 45 5f 43 4b 50 54 20 29 7b 0a 20 20 20 20 20  GE_CKPT ){.     
1e190 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
1e1a0 44 62 20 3d 20 70 2d 3e 70 54 61 72 67 65 74 46  Db = p->pTargetF
1e1b0 64 2d 3e 70 52 65 61 6c 3b 0a 20 20 20 20 20 20  d->pReal;.      
1e1c0 70 2d 3e 72 63 20 3d 20 70 44 62 2d 3e 70 4d 65  p->rc = pDb->pMe
1e1d0 74 68 6f 64 73 2d 3e 78 53 79 6e 63 28 70 44 62  thods->xSync(pDb
1e1e0 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  , SQLITE_SYNC_NO
1e1f0 52 4d 41 4c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  RMAL);.    }..  
1e200 20 20 72 62 75 53 61 76 65 53 74 61 74 65 28 70    rbuSaveState(p
1e210 2c 20 70 2d 3e 65 53 74 61 67 65 29 3b 0a 0a 20  , p->eStage);.. 
1e220 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
1e230 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 65 53  LITE_OK && p->eS
1e240 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f  tage==RBU_STAGE_
1e250 4f 41 4c 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  OAL ){.      p->
1e260 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65  rc = sqlite3_exe
1e270 63 28 70 2d 3e 64 62 52 62 75 2c 20 22 43 4f 4d  c(p->dbRbu, "COM
1e280 4d 49 54 22 2c 20 30 2c 20 30 2c 20 26 70 2d 3e  MIT", 0, 0, &p->
1e290 7a 45 72 72 6d 73 67 29 3b 0a 20 20 20 20 7d 0a  zErrmsg);.    }.
1e2a0 0a 20 20 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6e  .    /* Close an
1e2b0 79 20 6f 70 65 6e 20 73 74 61 74 65 6d 65 6e 74  y open statement
1e2c0 20 68 61 6e 64 6c 65 73 2e 20 2a 2f 0a 20 20 20   handles. */.   
1e2d0 20 72 62 75 4f 62 6a 49 74 65 72 46 69 6e 61 6c   rbuObjIterFinal
1e2e0 69 7a 65 28 26 70 2d 3e 6f 62 6a 69 74 65 72 29  ize(&p->objiter)
1e2f0 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  ;..    /* If thi
1e300 73 20 69 73 20 61 6e 20 52 42 55 20 76 61 63 75  s is an RBU vacu
1e310 75 6d 20 68 61 6e 64 6c 65 20 61 6e 64 20 74 68  um handle and th
1e320 65 20 76 61 63 75 75 6d 20 68 61 73 20 65 69 74  e vacuum has eit
1e330 68 65 72 20 66 69 6e 69 73 68 65 64 0a 20 20 20  her finished.   
1e340 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79   ** successfully
1e350 20 6f 72 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   or encountered 
1e360 61 6e 20 65 72 72 6f 72 2c 20 64 65 6c 65 74 65  an error, delete
1e370 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
1e380 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 73 74 61   the .    ** sta
1e390 74 65 20 74 61 62 6c 65 2e 20 54 68 69 73 20 63  te table. This c
1e3a0 61 75 73 65 73 20 74 68 65 20 6e 65 78 74 20 63  auses the next c
1e3b0 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 72 62  all to sqlite3rb
1e3c0 75 5f 76 61 63 75 75 6d 28 29 20 0a 20 20 20 20  u_vacuum() .    
1e3d0 2a 2a 20 73 70 65 63 69 66 79 69 6e 67 20 74 68  ** specifying th
1e3e0 65 20 63 75 72 72 65 6e 74 20 74 61 72 67 65 74  e current target
1e3f0 20 61 6e 64 20 73 74 61 74 65 20 64 61 74 61 62   and state datab
1e400 61 73 65 73 20 74 6f 20 73 74 61 72 74 20 61 20  ases to start a 
1e410 6e 65 77 0a 20 20 20 20 2a 2a 20 76 61 63 75 75  new.    ** vacuu
1e420 6d 20 66 72 6f 6d 20 73 63 72 61 74 63 68 2e 20  m from scratch. 
1e430 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 62 75 49   */.    if( rbuI
1e440 73 56 61 63 75 75 6d 28 70 29 20 26 26 20 70 2d  sVacuum(p) && p-
1e450 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc!=SQLITE_OK &
1e460 26 20 70 2d 3e 64 62 52 62 75 20 29 7b 0a 20 20  & p->dbRbu ){.  
1e470 20 20 20 20 69 6e 74 20 72 63 32 20 3d 20 73 71      int rc2 = sq
1e480 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62  lite3_exec(p->db
1e490 52 62 75 2c 20 22 44 45 4c 45 54 45 20 46 52 4f  Rbu, "DELETE FRO
1e4a0 4d 20 73 74 61 74 2e 72 62 75 5f 73 74 61 74 65  M stat.rbu_state
1e4b0 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ", 0, 0, 0);.   
1e4c0 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
1e4d0 4c 49 54 45 5f 44 4f 4e 45 20 26 26 20 72 63 32  LITE_DONE && rc2
1e4e0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 2d  !=SQLITE_OK ) p-
1e4f0 3e 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d  >rc = rc2;.    }
1e500 0a 0a 20 20 20 20 2f 2a 20 43 6c 6f 73 65 20 74  ..    /* Close t
1e510 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  he open database
1e520 20 68 61 6e 64 6c 65 20 61 6e 64 20 56 46 53 20   handle and VFS 
1e530 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 20 20 73  object. */.    s
1e540 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 2d 3e  qlite3_close(p->
1e550 64 62 52 62 75 29 3b 0a 20 20 20 20 73 71 6c 69  dbRbu);.    sqli
1e560 74 65 33 5f 63 6c 6f 73 65 28 70 2d 3e 64 62 4d  te3_close(p->dbM
1e570 61 69 6e 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ain);.    assert
1e580 28 20 70 2d 3e 73 7a 54 65 6d 70 3d 3d 30 20 29  ( p->szTemp==0 )
1e590 3b 0a 20 20 20 20 72 62 75 44 65 6c 65 74 65 56  ;.    rbuDeleteV
1e5a0 66 73 28 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  fs(p);.    sqlit
1e5b0 65 33 5f 66 72 65 65 28 70 2d 3e 61 42 75 66 29  e3_free(p->aBuf)
1e5c0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
1e5d0 65 65 28 70 2d 3e 61 46 72 61 6d 65 29 3b 0a 0a  ee(p->aFrame);..
1e5e0 20 20 20 20 72 62 75 45 64 69 74 45 72 72 6d 73      rbuEditErrms
1e5f0 67 28 70 29 3b 0a 20 20 20 20 72 63 20 3d 20 70  g(p);.    rc = p
1e600 2d 3e 72 63 3b 0a 20 20 20 20 69 66 28 20 70 7a  ->rc;.    if( pz
1e610 45 72 72 6d 73 67 20 29 7b 0a 20 20 20 20 20 20  Errmsg ){.      
1e620 2a 70 7a 45 72 72 6d 73 67 20 3d 20 70 2d 3e 7a  *pzErrmsg = p->z
1e630 45 72 72 6d 73 67 3b 0a 20 20 20 20 7d 65 6c 73  Errmsg;.    }els
1e640 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
1e650 5f 66 72 65 65 28 70 2d 3e 7a 45 72 72 6d 73 67  _free(p->zErrmsg
1e660 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
1e670 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 53 74  ite3_free(p->zSt
1e680 61 74 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ate);.    sqlite
1e690 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d 65 6c  3_free(p);.  }el
1e6a0 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  se{.    rc = SQL
1e6b0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 2a  ITE_NOMEM;.    *
1e6c0 70 7a 45 72 72 6d 73 67 20 3d 20 30 3b 0a 20 20  pzErrmsg = 0;.  
1e6d0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1e6e0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1e6f0 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
1e700 6f 66 20 6b 65 79 2d 76 61 6c 75 65 20 6f 70 65  of key-value ope
1e710 72 61 74 69 6f 6e 73 20 28 69 6e 73 65 72 74 73  rations (inserts
1e720 2c 20 64 65 6c 65 74 65 73 20 6f 72 20 0a 2a 2a  , deletes or .**
1e730 20 75 70 64 61 74 65 73 29 20 74 68 61 74 20 68   updates) that h
1e740 61 76 65 20 62 65 65 6e 20 70 65 72 66 6f 72 6d  ave been perform
1e750 65 64 20 6f 6e 20 74 68 65 20 74 61 72 67 65 74  ed on the target
1e760 20 64 61 74 61 62 61 73 65 20 73 69 6e 63 65 20   database since 
1e770 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 52  the.** current R
1e780 42 55 20 75 70 64 61 74 65 20 77 61 73 20 73 74  BU update was st
1e790 61 72 74 65 64 2e 0a 2a 2f 0a 73 71 6c 69 74 65  arted..*/.sqlite
1e7a0 33 5f 69 6e 74 36 34 20 73 71 6c 69 74 65 33 72  3_int64 sqlite3r
1e7b0 62 75 5f 70 72 6f 67 72 65 73 73 28 73 71 6c 69  bu_progress(sqli
1e7c0 74 65 33 72 62 75 20 2a 70 52 62 75 29 7b 0a 20  te3rbu *pRbu){. 
1e7d0 20 72 65 74 75 72 6e 20 70 52 62 75 2d 3e 6e 50   return pRbu->nP
1e7e0 72 6f 67 72 65 73 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  rogress;.}../*.*
1e7f0 2a 20 52 65 74 75 72 6e 20 70 65 72 6d 79 72 69  * Return permyri
1e800 61 64 61 67 65 20 70 72 6f 67 72 65 73 73 20 69  adage progress i
1e810 6e 64 69 63 61 74 69 6f 6e 73 20 66 6f 72 20 74  ndications for t
1e820 68 65 20 74 77 6f 20 6d 61 69 6e 20 73 74 61 67  he two main stag
1e830 65 73 20 6f 66 0a 2a 2a 20 61 6e 20 52 42 55 20  es of.** an RBU 
1e840 75 70 64 61 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20  update..*/.void 
1e850 73 71 6c 69 74 65 33 72 62 75 5f 62 70 5f 70 72  sqlite3rbu_bp_pr
1e860 6f 67 72 65 73 73 28 73 71 6c 69 74 65 33 72 62  ogress(sqlite3rb
1e870 75 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 4f 6e 65  u *p, int *pnOne
1e880 2c 20 69 6e 74 20 2a 70 6e 54 77 6f 29 7b 0a 20  , int *pnTwo){. 
1e890 20 63 6f 6e 73 74 20 69 6e 74 20 4d 41 58 5f 50   const int MAX_P
1e8a0 52 4f 47 52 45 53 53 20 3d 20 31 30 30 30 30 3b  ROGRESS = 10000;
1e8b0 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 65 53  .  switch( p->eS
1e8c0 74 61 67 65 20 29 7b 0a 20 20 20 20 63 61 73 65  tage ){.    case
1e8d0 20 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 3a 0a   RBU_STAGE_OAL:.
1e8e0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 50 68        if( p->nPh
1e8f0 61 73 65 4f 6e 65 53 74 65 70 3e 30 20 29 7b 0a  aseOneStep>0 ){.
1e900 20 20 20 20 20 20 20 20 2a 70 6e 4f 6e 65 20 3d          *pnOne =
1e910 20 28 69 6e 74 29 28 4d 41 58 5f 50 52 4f 47 52   (int)(MAX_PROGR
1e920 45 53 53 20 2a 20 28 69 36 34 29 70 2d 3e 6e 50  ESS * (i64)p->nP
1e930 72 6f 67 72 65 73 73 2f 28 69 36 34 29 70 2d 3e  rogress/(i64)p->
1e940 6e 50 68 61 73 65 4f 6e 65 53 74 65 70 29 3b 0a  nPhaseOneStep);.
1e950 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1e960 20 20 20 20 20 2a 70 6e 4f 6e 65 20 3d 20 2d 31       *pnOne = -1
1e970 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1e980 2a 70 6e 54 77 6f 20 3d 20 30 3b 0a 20 20 20 20  *pnTwo = 0;.    
1e990 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61    break;..    ca
1e9a0 73 65 20 52 42 55 5f 53 54 41 47 45 5f 4d 4f 56  se RBU_STAGE_MOV
1e9b0 45 3a 0a 20 20 20 20 20 20 2a 70 6e 4f 6e 65 20  E:.      *pnOne 
1e9c0 3d 20 4d 41 58 5f 50 52 4f 47 52 45 53 53 3b 0a  = MAX_PROGRESS;.
1e9d0 20 20 20 20 20 20 2a 70 6e 54 77 6f 20 3d 20 30        *pnTwo = 0
1e9e0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a  ;.      break;..
1e9f0 20 20 20 20 63 61 73 65 20 52 42 55 5f 53 54 41      case RBU_STA
1ea00 47 45 5f 43 4b 50 54 3a 0a 20 20 20 20 20 20 2a  GE_CKPT:.      *
1ea10 70 6e 4f 6e 65 20 3d 20 4d 41 58 5f 50 52 4f 47  pnOne = MAX_PROG
1ea20 52 45 53 53 3b 0a 20 20 20 20 20 20 2a 70 6e 54  RESS;.      *pnT
1ea30 77 6f 20 3d 20 28 69 6e 74 29 28 4d 41 58 5f 50  wo = (int)(MAX_P
1ea40 52 4f 47 52 45 53 53 20 2a 20 28 69 36 34 29 70  ROGRESS * (i64)p
1ea50 2d 3e 6e 53 74 65 70 20 2f 20 28 69 36 34 29 70  ->nStep / (i64)p
1ea60 2d 3e 6e 46 72 61 6d 65 29 3b 0a 20 20 20 20 20  ->nFrame);.     
1ea70 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73   break;..    cas
1ea80 65 20 52 42 55 5f 53 54 41 47 45 5f 44 4f 4e 45  e RBU_STAGE_DONE
1ea90 3a 0a 20 20 20 20 20 20 2a 70 6e 4f 6e 65 20 3d  :.      *pnOne =
1eaa0 20 4d 41 58 5f 50 52 4f 47 52 45 53 53 3b 0a 20   MAX_PROGRESS;. 
1eab0 20 20 20 20 20 2a 70 6e 54 77 6f 20 3d 20 4d 41       *pnTwo = MA
1eac0 58 5f 50 52 4f 47 52 45 53 53 3b 0a 20 20 20 20  X_PROGRESS;.    
1ead0 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 64 65    break;..    de
1eae0 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 61 73 73  fault:.      ass
1eaf0 65 72 74 28 20 30 20 29 3b 0a 20 20 7d 0a 7d 0a  ert( 0 );.  }.}.
1eb00 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
1eb10 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 20  e current state 
1eb20 6f 66 20 74 68 65 20 52 42 55 20 76 61 63 75 75  of the RBU vacuu
1eb30 6d 20 6f 72 20 75 70 64 61 74 65 20 6f 70 65 72  m or update oper
1eb40 61 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ation..*/.int sq
1eb50 6c 69 74 65 33 72 62 75 5f 73 74 61 74 65 28 73  lite3rbu_state(s
1eb60 71 6c 69 74 65 33 72 62 75 20 2a 70 29 7b 0a 20  qlite3rbu *p){. 
1eb70 20 69 6e 74 20 61 52 65 73 5b 5d 20 3d 20 7b 0a   int aRes[] = {.
1eb80 20 20 20 20 30 2c 20 53 51 4c 49 54 45 5f 52 42      0, SQLITE_RB
1eb90 55 5f 53 54 41 54 45 5f 4f 41 4c 2c 20 53 51 4c  U_STATE_OAL, SQL
1eba0 49 54 45 5f 52 42 55 5f 53 54 41 54 45 5f 4d 4f  ITE_RBU_STATE_MO
1ebb0 56 45 2c 0a 20 20 20 20 30 2c 20 53 51 4c 49 54  VE,.    0, SQLIT
1ebc0 45 5f 52 42 55 5f 53 54 41 54 45 5f 43 48 45 43  E_RBU_STATE_CHEC
1ebd0 4b 50 4f 49 4e 54 2c 20 53 51 4c 49 54 45 5f 52  KPOINT, SQLITE_R
1ebe0 42 55 5f 53 54 41 54 45 5f 44 4f 4e 45 0a 20 20  BU_STATE_DONE.  
1ebf0 7d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 52 42  };..  assert( RB
1ec00 55 5f 53 54 41 47 45 5f 4f 41 4c 3d 3d 31 20 29  U_STAGE_OAL==1 )
1ec10 3b 0a 20 20 61 73 73 65 72 74 28 20 52 42 55 5f  ;.  assert( RBU_
1ec20 53 54 41 47 45 5f 4d 4f 56 45 3d 3d 32 20 29 3b  STAGE_MOVE==2 );
1ec30 0a 20 20 61 73 73 65 72 74 28 20 52 42 55 5f 53  .  assert( RBU_S
1ec40 54 41 47 45 5f 43 4b 50 54 3d 3d 34 20 29 3b 0a  TAGE_CKPT==4 );.
1ec50 20 20 61 73 73 65 72 74 28 20 52 42 55 5f 53 54    assert( RBU_ST
1ec60 41 47 45 5f 44 4f 4e 45 3d 3d 35 20 29 3b 0a 20  AGE_DONE==5 );. 
1ec70 20 61 73 73 65 72 74 28 20 61 52 65 73 5b 52 42   assert( aRes[RB
1ec80 55 5f 53 54 41 47 45 5f 4f 41 4c 5d 3d 3d 53 51  U_STAGE_OAL]==SQ
1ec90 4c 49 54 45 5f 52 42 55 5f 53 54 41 54 45 5f 4f  LITE_RBU_STATE_O
1eca0 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  AL );.  assert( 
1ecb0 61 52 65 73 5b 52 42 55 5f 53 54 41 47 45 5f 4d  aRes[RBU_STAGE_M
1ecc0 4f 56 45 5d 3d 3d 53 51 4c 49 54 45 5f 52 42 55  OVE]==SQLITE_RBU
1ecd0 5f 53 54 41 54 45 5f 4d 4f 56 45 20 29 3b 0a 20  _STATE_MOVE );. 
1ece0 20 61 73 73 65 72 74 28 20 61 52 65 73 5b 52 42   assert( aRes[RB
1ecf0 55 5f 53 54 41 47 45 5f 43 4b 50 54 5d 3d 3d 53  U_STAGE_CKPT]==S
1ed00 51 4c 49 54 45 5f 52 42 55 5f 53 54 41 54 45 5f  QLITE_RBU_STATE_
1ed10 43 48 45 43 4b 50 4f 49 4e 54 20 29 3b 0a 20 20  CHECKPOINT );.  
1ed20 61 73 73 65 72 74 28 20 61 52 65 73 5b 52 42 55  assert( aRes[RBU
1ed30 5f 53 54 41 47 45 5f 44 4f 4e 45 5d 3d 3d 53 51  _STAGE_DONE]==SQ
1ed40 4c 49 54 45 5f 52 42 55 5f 53 54 41 54 45 5f 44  LITE_RBU_STATE_D
1ed50 4f 4e 45 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d  ONE );..  if( p-
1ed60 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc!=SQLITE_OK &
1ed70 26 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f  & p->rc!=SQLITE_
1ed80 44 4f 4e 45 20 29 7b 0a 20 20 20 20 72 65 74 75  DONE ){.    retu
1ed90 72 6e 20 53 51 4c 49 54 45 5f 52 42 55 5f 53 54  rn SQLITE_RBU_ST
1eda0 41 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c  ATE_ERROR;.  }el
1edb0 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
1edc0 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  p->rc!=SQLITE_DO
1edd0 4e 45 20 7c 7c 20 70 2d 3e 65 53 74 61 67 65 3d  NE || p->eStage=
1ede0 3d 52 42 55 5f 53 54 41 47 45 5f 44 4f 4e 45 20  =RBU_STAGE_DONE 
1edf0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1ee00 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54  ->eStage==RBU_ST
1ee10 41 47 45 5f 4f 41 4c 0a 20 20 20 20 20 20 20 20  AGE_OAL.        
1ee20 20 7c 7c 20 70 2d 3e 65 53 74 61 67 65 3d 3d 52   || p->eStage==R
1ee30 42 55 5f 53 54 41 47 45 5f 4d 4f 56 45 0a 20 20  BU_STAGE_MOVE.  
1ee40 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74         || p->eSt
1ee50 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 43  age==RBU_STAGE_C
1ee60 4b 50 54 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  KPT.         || 
1ee70 70 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53  p->eStage==RBU_S
1ee80 54 41 47 45 5f 44 4f 4e 45 0a 20 20 20 20 29 3b  TAGE_DONE.    );
1ee90 0a 20 20 20 20 72 65 74 75 72 6e 20 61 52 65 73  .    return aRes
1eea0 5b 70 2d 3e 65 53 74 61 67 65 5d 3b 0a 20 20 7d  [p->eStage];.  }
1eeb0 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 72  .}..int sqlite3r
1eec0 62 75 5f 73 61 76 65 73 74 61 74 65 28 73 71 6c  bu_savestate(sql
1eed0 69 74 65 33 72 62 75 20 2a 70 29 7b 0a 20 20 69  ite3rbu *p){.  i
1eee0 6e 74 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 20  nt rc = p->rc;. 
1eef0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1ef00 44 4f 4e 45 20 29 20 72 65 74 75 72 6e 20 53 51  DONE ) return SQ
1ef10 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65  LITE_OK;..  asse
1ef20 72 74 28 20 70 2d 3e 65 53 74 61 67 65 3e 3d 52  rt( p->eStage>=R
1ef30 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20 26 26 20  BU_STAGE_OAL && 
1ef40 70 2d 3e 65 53 74 61 67 65 3c 3d 52 42 55 5f 53  p->eStage<=RBU_S
1ef50 54 41 47 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 69  TAGE_DONE );.  i
1ef60 66 28 20 70 2d 3e 65 53 74 61 67 65 3d 3d 52 42  f( p->eStage==RB
1ef70 55 5f 53 54 41 47 45 5f 4f 41 4c 20 29 7b 0a 20  U_STAGE_OAL ){. 
1ef80 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
1ef90 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20  QLITE_DONE );.  
1efa0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1efb0 5f 4f 4b 20 29 20 72 63 20 3d 20 73 71 6c 69 74  _OK ) rc = sqlit
1efc0 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 4d 61 69  e3_exec(p->dbMai
1efd0 6e 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20  n, "COMMIT", 0, 
1efe0 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  0, 0);.  }..  /*
1eff0 20 53 79 6e 63 20 74 68 65 20 64 62 20 66 69 6c   Sync the db fil
1f000 65 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53  e */.  if( rc==S
1f010 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 65  QLITE_OK && p->e
1f020 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45  Stage==RBU_STAGE
1f030 5f 43 4b 50 54 20 29 7b 0a 20 20 20 20 73 71 6c  _CKPT ){.    sql
1f040 69 74 65 33 5f 66 69 6c 65 20 2a 70 44 62 20 3d  ite3_file *pDb =
1f050 20 70 2d 3e 70 54 61 72 67 65 74 46 64 2d 3e 70   p->pTargetFd->p
1f060 52 65 61 6c 3b 0a 20 20 20 20 72 63 20 3d 20 70  Real;.    rc = p
1f070 44 62 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53  Db->pMethods->xS
1f080 79 6e 63 28 70 44 62 2c 20 53 51 4c 49 54 45 5f  ync(pDb, SQLITE_
1f090 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20  SYNC_NORMAL);.  
1f0a0 7d 0a 0a 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b  }..  p->rc = rc;
1f0b0 0a 20 20 72 62 75 53 61 76 65 53 74 61 74 65 28  .  rbuSaveState(
1f0c0 70 2c 20 70 2d 3e 65 53 74 61 67 65 29 3b 0a 20  p, p->eStage);. 
1f0d0 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 0a 20 20   rc = p->rc;..  
1f0e0 69 66 28 20 70 2d 3e 65 53 74 61 67 65 3d 3d 52  if( p->eStage==R
1f0f0 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20 29 7b 0a  BU_STAGE_OAL ){.
1f100 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
1f110 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
1f120 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1f130 45 5f 4f 4b 20 29 20 72 63 20 3d 20 73 71 6c 69  E_OK ) rc = sqli
1f140 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 52 62  te3_exec(p->dbRb
1f150 75 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20  u, "COMMIT", 0, 
1f160 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  0, 0);.    if( r
1f170 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c==SQLITE_OK ) r
1f180 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  c = sqlite3_exec
1f190 28 70 2d 3e 64 62 52 62 75 2c 20 22 42 45 47 49  (p->dbRbu, "BEGI
1f1a0 4e 20 49 4d 4d 45 44 49 41 54 45 22 2c 20 30 2c  N IMMEDIATE", 0,
1f1b0 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   0, 0);.    if( 
1f1c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
1f1d0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65  rc = sqlite3_exe
1f1e0 63 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 42 45  c(p->dbMain, "BE
1f1f0 47 49 4e 20 49 4d 4d 45 44 49 41 54 45 22 2c 20  GIN IMMEDIATE", 
1f200 30 2c 20 30 2c 30 29 3b 0a 20 20 7d 0a 0a 20 20  0, 0,0);.  }..  
1f210 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 72 65  p->rc = rc;.  re
1f220 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 2a 2a  turn rc;.}../***
1f230 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f240 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f250 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f260 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f270 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 42 65 67 69 6e  *******.** Begin
1f280 6e 69 6e 67 20 6f 66 20 52 42 55 20 56 46 53 20  ning of RBU VFS 
1f290 73 68 69 6d 20 6d 65 74 68 6f 64 73 2e 20 54 68  shim methods. Th
1f2a0 65 20 56 46 53 20 73 68 69 6d 20 6d 6f 64 69 66  e VFS shim modif
1f2b0 69 65 73 20 74 68 65 20 62 65 68 61 76 69 6f 75  ies the behaviou
1f2c0 72 0a 2a 2a 20 6f 66 20 61 20 73 74 61 6e 64 61  r.** of a standa
1f2d0 72 64 20 56 46 53 20 69 6e 20 74 68 65 20 66 6f  rd VFS in the fo
1f2e0 6c 6c 6f 77 69 6e 67 20 77 61 79 73 3a 0a 2a 2a  llowing ways:.**
1f2f0 0a 2a 2a 20 31 2e 20 57 68 65 6e 65 76 65 72 20  .** 1. Whenever 
1f300 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
1f310 66 20 61 20 6d 61 69 6e 20 64 61 74 61 62 61 73  f a main databas
1f320 65 20 66 69 6c 65 20 69 73 20 72 65 61 64 20 6f  e file is read o
1f330 72 20 0a 2a 2a 20 20 20 20 77 72 69 74 74 65 6e  r .**    written
1f340 2c 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  , the value of t
1f350 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
1f360 72 20 63 6f 6f 6b 69 65 20 69 73 20 73 74 6f 72  r cookie is stor
1f370 65 64 20 69 6e 0a 2a 2a 20 20 20 20 72 62 75 5f  ed in.**    rbu_
1f380 66 69 6c 65 2e 69 43 6f 6f 6b 69 65 2e 20 53 69  file.iCookie. Si
1f390 6d 69 6c 61 72 6c 79 2c 20 74 68 65 20 76 61 6c  milarly, the val
1f3a0 75 65 20 6f 66 20 74 68 65 20 22 77 72 69 74 65  ue of the "write
1f3b0 2d 76 65 72 73 69 6f 6e 22 0a 2a 2a 20 20 20 20  -version".**    
1f3c0 64 61 74 61 62 61 73 65 20 68 65 61 64 65 72 20  database header 
1f3d0 66 69 65 6c 64 20 69 73 20 73 74 6f 72 65 64 20  field is stored 
1f3e0 69 6e 20 72 62 75 5f 66 69 6c 65 2e 69 57 72 69  in rbu_file.iWri
1f3f0 74 65 56 65 72 2e 20 54 68 69 73 20 65 6e 73 75  teVer. This ensu
1f400 72 65 73 0a 2a 2a 20 20 20 20 74 68 61 74 20 74  res.**    that t
1f410 68 65 20 76 61 6c 75 65 73 20 61 72 65 20 61 6c  he values are al
1f420 77 61 79 73 20 74 72 75 73 74 77 6f 72 74 68 79  ways trustworthy
1f430 20 77 69 74 68 69 6e 20 61 6e 20 6f 70 65 6e 20   within an open 
1f440 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
1f450 2a 2a 20 32 2e 20 57 68 65 6e 65 76 65 72 20 61  ** 2. Whenever a
1f460 6e 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41  n SQLITE_OPEN_WA
1f470 4c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64  L file is opened
1f480 2c 20 74 68 65 20 28 72 62 75 5f 66 69 6c 65 2e  , the (rbu_file.
1f490 70 57 61 6c 46 64 29 0a 2a 2a 20 20 20 20 6d 65  pWalFd).**    me
1f4a0 6d 62 65 72 20 76 61 72 69 61 62 6c 65 20 6f 66  mber variable of
1f4b0 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20   the associated 
1f4c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 64 65  database file de
1f4d0 73 63 72 69 70 74 6f 72 20 69 73 20 73 65 74 0a  scriptor is set.
1f4e0 2a 2a 20 20 20 20 74 6f 20 70 6f 69 6e 74 20 74  **    to point t
1f4f0 6f 20 74 68 65 20 6e 65 77 20 66 69 6c 65 2e 20  o the new file. 
1f500 41 20 6d 75 74 65 78 20 70 72 6f 74 65 63 74 65  A mutex protecte
1f510 64 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  d linked list of
1f520 20 61 6c 6c 20 6d 61 69 6e 20 0a 2a 2a 20 20 20   all main .**   
1f530 20 64 62 20 66 64 73 20 6f 70 65 6e 65 64 20 75   db fds opened u
1f540 73 69 6e 67 20 61 20 70 61 72 74 69 63 75 6c 61  sing a particula
1f550 72 20 52 42 55 20 56 46 53 20 69 73 20 6d 61 69  r RBU VFS is mai
1f560 6e 74 61 69 6e 65 64 20 61 74 20 0a 2a 2a 20 20  ntained at .**  
1f570 20 20 72 62 75 5f 76 66 73 2e 70 4d 61 69 6e 20    rbu_vfs.pMain 
1f580 74 6f 20 66 61 63 69 6c 69 74 61 74 65 20 74 68  to facilitate th
1f590 69 73 2e 0a 2a 2a 0a 2a 2a 20 33 2e 20 55 73 69  is..**.** 3. Usi
1f5a0 6e 67 20 61 20 6e 65 77 20 66 69 6c 65 2d 63 6f  ng a new file-co
1f5b0 6e 74 72 6f 6c 20 22 53 51 4c 49 54 45 5f 46 43  ntrol "SQLITE_FC
1f5c0 4e 54 4c 5f 52 42 55 22 2c 20 61 20 6d 61 69 6e  NTL_RBU", a main
1f5d0 20 64 62 20 72 62 75 5f 66 69 6c 65 20 0a 2a 2a   db rbu_file .**
1f5e0 20 20 20 20 6f 62 6a 65 63 74 20 63 61 6e 20 62      object can b
1f5f0 65 20 6d 61 72 6b 65 64 20 61 73 20 74 68 65 20  e marked as the 
1f600 74 61 72 67 65 74 20 64 61 74 61 62 61 73 65 20  target database 
1f610 6f 66 20 61 6e 20 52 42 55 20 75 70 64 61 74 65  of an RBU update
1f620 2e 20 54 68 69 73 0a 2a 2a 20 20 20 20 74 75 72  . This.**    tur
1f630 6e 73 20 6f 6e 20 74 68 65 20 66 6f 6c 6c 6f 77  ns on the follow
1f640 69 6e 67 20 65 78 74 72 61 20 73 70 65 63 69 61  ing extra specia
1f650 6c 20 62 65 68 61 76 69 6f 75 72 3a 0a 2a 2a 0a  l behaviour:.**.
1f660 2a 2a 20 33 61 2e 20 49 66 20 78 41 63 63 65 73  ** 3a. If xAcces
1f670 73 28 29 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  s() is called to
1f680 20 63 68 65 63 6b 20 69 66 20 74 68 65 72 65 20   check if there 
1f690 65 78 69 73 74 73 20 61 20 2a 2d 77 61 6c 20 66  exists a *-wal f
1f6a0 69 6c 65 20 0a 2a 2a 20 20 20 20 20 61 73 73 6f  ile .**     asso
1f6b0 63 69 61 74 65 64 20 77 69 74 68 20 61 6e 20 52  ciated with an R
1f6c0 42 55 20 74 61 72 67 65 74 20 64 61 74 61 62 61  BU target databa
1f6d0 73 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  se currently in 
1f6e0 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 0a 2a 2a  RBU_STAGE_OAL.**
1f6f0 20 20 20 20 20 73 74 61 67 65 20 28 70 72 65 70       stage (prep
1f700 61 72 69 6e 67 20 74 68 65 20 2a 2d 6f 61 6c 20  aring the *-oal 
1f710 66 69 6c 65 29 2c 20 74 68 65 20 66 6f 6c 6c 6f  file), the follo
1f720 77 69 6e 67 20 73 70 65 63 69 61 6c 20 68 61 6e  wing special han
1f730 64 6c 69 6e 67 0a 2a 2a 20 20 20 20 20 61 70 70  dling.**     app
1f740 6c 69 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  lies:.**.**     
1f750 20 2a 20 69 66 20 74 68 65 20 2a 2d 77 61 6c 20   * if the *-wal 
1f760 66 69 6c 65 20 64 6f 65 73 20 65 78 69 73 74 2c  file does exist,
1f770 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1f780 41 4e 54 4f 50 45 4e 2e 20 41 6e 20 52 42 55 0a  ANTOPEN. An RBU.
1f790 2a 2a 20 20 20 20 20 20 20 20 74 61 72 67 65 74  **        target
1f7a0 20 64 61 74 61 62 61 73 65 20 6d 61 79 20 6e 6f   database may no
1f7b0 74 20 62 65 20 69 6e 20 77 61 6c 20 6d 6f 64 65  t be in wal mode
1f7c0 20 61 6c 72 65 61 64 79 2e 0a 2a 2a 0a 2a 2a 20   already..**.** 
1f7d0 20 20 20 20 20 2a 20 69 66 20 74 68 65 20 2a 2d       * if the *-
1f7e0 77 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  wal file does no
1f7f0 74 20 65 78 69 73 74 2c 20 73 65 74 20 74 68 65  t exist, set the
1f800 20 6f 75 74 70 75 74 20 70 61 72 61 6d 65 74 65   output paramete
1f810 72 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20 6e  r to.**        n
1f820 6f 6e 2d 7a 65 72 6f 20 28 74 6f 20 74 65 6c 6c  on-zero (to tell
1f830 20 53 51 4c 69 74 65 20 74 68 61 74 20 69 74 20   SQLite that it 
1f840 64 6f 65 73 20 65 78 69 73 74 29 20 61 6e 79 77  does exist) anyw
1f850 61 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 54 68  ay..**.**     Th
1f860 65 6e 2c 20 77 68 65 6e 20 78 4f 70 65 6e 28 29  en, when xOpen()
1f870 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 70   is called to op
1f880 65 6e 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c  en the *-wal fil
1f890 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
1f8a0 68 0a 2a 2a 20 20 20 20 20 74 68 65 20 52 42 55  h.**     the RBU
1f8b0 20 74 61 72 67 65 74 20 69 6e 20 52 42 55 5f 53   target in RBU_S
1f8c0 54 41 47 45 5f 4f 41 4c 20 73 74 61 67 65 2c 20  TAGE_OAL stage, 
1f8d0 69 6e 73 74 65 61 64 20 6f 66 20 6f 70 65 6e 69  instead of openi
1f8e0 6e 67 20 74 68 65 20 2a 2d 77 61 6c 0a 2a 2a 20  ng the *-wal.** 
1f8f0 20 20 20 20 66 69 6c 65 2c 20 74 68 65 20 72 62      file, the rb
1f900 75 20 76 66 73 20 6f 70 65 6e 73 20 74 68 65 20  u vfs opens the 
1f910 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 2a 2d  corresponding *-
1f920 6f 61 6c 20 66 69 6c 65 20 69 6e 73 74 65 61 64  oal file instead
1f930 2e 20 0a 2a 2a 0a 2a 2a 20 33 62 2e 20 54 68 65  . .**.** 3b. The
1f940 20 2a 2d 73 68 6d 20 70 61 67 65 73 20 72 65 74   *-shm pages ret
1f950 75 72 6e 65 64 20 62 79 20 78 53 68 6d 4d 61 70  urned by xShmMap
1f960 28 29 20 66 6f 72 20 61 20 74 61 72 67 65 74 20  () for a target 
1f970 64 62 20 66 69 6c 65 20 69 6e 0a 2a 2a 20 20 20  db file in.**   
1f980 20 20 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20    RBU_STAGE_OAL 
1f990 6d 6f 64 65 20 61 72 65 20 61 63 74 75 61 6c 6c  mode are actuall
1f9a0 79 20 73 74 6f 72 65 64 20 69 6e 20 68 65 61 70  y stored in heap
1f9b0 20 6d 65 6d 6f 72 79 2e 20 54 68 69 73 20 69 73   memory. This is
1f9c0 20 74 6f 0a 2a 2a 20 20 20 20 20 61 76 6f 69 64   to.**     avoid
1f9d0 20 63 72 65 61 74 69 6e 67 20 61 20 2a 2d 73 68   creating a *-sh
1f9e0 6d 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20  m file on disk. 
1f9f0 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 78 53  Additionally, xS
1fa00 68 6d 4c 6f 63 6b 28 29 20 63 61 6c 6c 73 0a 2a  hmLock() calls.*
1fa10 2a 20 20 20 20 20 61 72 65 20 6e 6f 2d 6f 70 73  *     are no-ops
1fa20 20 6f 6e 20 74 61 72 67 65 74 20 64 61 74 61 62   on target datab
1fa30 61 73 65 20 66 69 6c 65 73 20 69 6e 20 52 42 55  ase files in RBU
1fa40 5f 53 54 41 47 45 5f 4f 41 4c 20 6d 6f 64 65 2e  _STAGE_OAL mode.
1fa50 20 54 68 69 73 20 69 73 0a 2a 2a 20 20 20 20 20   This is.**     
1fa60 62 65 63 61 75 73 65 20 61 73 73 65 72 74 28 29  because assert()
1fa70 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 73   statements in s
1fa80 6f 6d 65 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e  ome VFS implemen
1fa90 74 61 74 69 6f 6e 73 20 66 61 69 6c 20 69 66 20  tations fail if 
1faa0 0a 2a 2a 20 20 20 20 20 78 53 68 6d 4c 6f 63 6b  .**     xShmLock
1fab0 28 29 20 69 73 20 63 61 6c 6c 65 64 20 62 65 66  () is called bef
1fac0 6f 72 65 20 78 53 68 6d 4d 61 70 28 29 2e 0a 2a  ore xShmMap()..*
1fad0 2a 0a 2a 2a 20 33 63 2e 20 49 66 20 61 6e 20 45  *.** 3c. If an E
1fae0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73  XCLUSIVE lock is
1faf0 20 61 74 74 65 6d 70 74 65 64 20 6f 6e 20 61 20   attempted on a 
1fb00 74 61 72 67 65 74 20 64 61 74 61 62 61 73 65 20  target database 
1fb10 66 69 6c 65 20 69 6e 20 61 6e 79 0a 2a 2a 20 20  file in any.**  
1fb20 20 20 20 6d 6f 64 65 20 65 78 63 65 70 74 20 52     mode except R
1fb30 42 55 5f 53 54 41 47 45 5f 44 4f 4e 45 20 28 61  BU_STAGE_DONE (a
1fb40 6c 6c 20 77 6f 72 6b 20 63 6f 6d 70 6c 65 74 65  ll work complete
1fb50 64 20 61 6e 64 20 63 68 65 63 6b 70 6f 69 6e 74  d and checkpoint
1fb60 65 64 29 2c 20 69 74 20 0a 2a 2a 20 20 20 20 20  ed), it .**     
1fb70 66 61 69 6c 73 20 77 69 74 68 20 61 6e 20 53 51  fails with an SQ
1fb80 4c 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72 2e  LITE_BUSY error.
1fb90 20 54 68 69 73 20 69 73 20 74 6f 20 73 74 6f 70   This is to stop
1fba0 20 52 42 55 20 63 6f 6e 6e 65 63 74 69 6f 6e 73   RBU connections
1fbb0 0a 2a 2a 20 20 20 20 20 66 72 6f 6d 20 61 75 74  .**     from aut
1fbc0 6f 6d 61 74 69 63 61 6c 6c 79 20 63 68 65 63 6b  omatically check
1fbd0 70 6f 69 6e 74 69 6e 67 20 61 20 2a 2d 77 61 6c  pointing a *-wal
1fbe0 20 28 6f 72 20 2a 2d 6f 61 6c 29 20 66 69 6c 65   (or *-oal) file
1fbf0 20 66 72 6f 6d 20 77 69 74 68 69 6e 0a 2a 2a 20   from within.** 
1fc00 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73      sqlite3_clos
1fc10 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 33 64 2e 20 49  e()..**.** 3d. I
1fc20 6e 20 52 42 55 5f 53 54 41 47 45 5f 43 41 50 54  n RBU_STAGE_CAPT
1fc30 55 52 45 20 6d 6f 64 65 2c 20 61 6c 6c 20 78 52  URE mode, all xR
1fc40 65 61 64 28 29 20 63 61 6c 6c 73 20 6f 6e 20 74  ead() calls on t
1fc50 68 65 20 77 61 6c 20 66 69 6c 65 2c 20 61 6e 64  he wal file, and
1fc60 0a 2a 2a 20 20 20 20 20 61 6c 6c 20 78 57 72 69  .**     all xWri
1fc70 74 65 28 29 20 63 61 6c 6c 73 20 6f 6e 20 74 68  te() calls on th
1fc80 65 20 74 61 72 67 65 74 20 64 61 74 61 62 61 73  e target databas
1fc90 65 20 66 69 6c 65 20 70 65 72 66 6f 72 6d 20 6e  e file perform n
1fca0 6f 20 49 4f 2e 20 0a 2a 2a 20 20 20 20 20 49 6e  o IO. .**     In
1fcb0 73 74 65 61 64 20 74 68 65 20 66 72 61 6d 65 20  stead the frame 
1fcc0 61 6e 64 20 70 61 67 65 20 6e 75 6d 62 65 72 73  and page numbers
1fcd0 20 74 68 61 74 20 77 6f 75 6c 64 20 62 65 20 72   that would be r
1fce0 65 61 64 20 61 6e 64 20 77 72 69 74 74 65 6e 0a  ead and written.
1fcf0 2a 2a 20 20 20 20 20 61 72 65 20 72 65 63 6f 72  **     are recor
1fd00 64 65 64 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c  ded. Additionall
1fd10 79 2c 20 73 75 63 63 65 73 73 66 75 6c 20 61 74  y, successful at
1fd20 74 65 6d 70 74 73 20 74 6f 20 6f 62 74 61 69 6e  tempts to obtain
1fd30 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 20 20   exclusive.**   
1fd40 20 20 78 53 68 6d 4c 6f 63 6b 28 29 20 57 52 49    xShmLock() WRI
1fd50 54 45 52 2c 20 43 48 45 43 4b 50 4f 49 4e 54 45  TER, CHECKPOINTE
1fd60 52 20 61 6e 64 20 52 45 41 44 30 20 6c 6f 63 6b  R and READ0 lock
1fd70 73 20 6f 6e 20 74 68 65 20 74 61 72 67 65 74 20  s on the target 
1fd80 0a 2a 2a 20 20 20 20 20 64 61 74 61 62 61 73 65  .**     database
1fd90 20 66 69 6c 65 20 61 72 65 20 72 65 63 6f 72 64   file are record
1fda0 65 64 2e 20 78 53 68 6d 4c 6f 63 6b 28 29 20 63  ed. xShmLock() c
1fdb0 61 6c 6c 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74  alls to unlock t
1fdc0 68 65 20 73 61 6d 65 0a 2a 2a 20 20 20 20 20 6c  he same.**     l
1fdd0 6f 63 6b 73 20 61 72 65 20 6e 6f 2d 6f 70 73 20  ocks are no-ops 
1fde0 28 73 6f 20 74 68 61 74 20 6f 6e 63 65 20 6f 62  (so that once ob
1fdf0 74 61 69 6e 65 64 2c 20 74 68 65 73 65 20 6c 6f  tained, these lo
1fe00 63 6b 73 20 61 72 65 20 6e 65 76 65 72 0a 2a 2a  cks are never.**
1fe10 20 20 20 20 20 72 65 6c 69 6e 71 75 69 73 68 65       relinquishe
1fe20 64 29 2e 20 46 69 6e 61 6c 6c 79 2c 20 63 61 6c  d). Finally, cal
1fe30 6c 73 20 74 6f 20 78 53 79 6e 63 28 29 20 6f 6e  ls to xSync() on
1fe40 20 74 68 65 20 74 61 72 67 65 74 20 64 61 74 61   the target data
1fe50 62 61 73 65 0a 2a 2a 20 20 20 20 20 66 69 6c 65  base.**     file
1fe60 20 66 61 69 6c 20 77 69 74 68 20 53 51 4c 49 54   fail with SQLIT
1fe70 45 5f 49 4e 54 45 52 4e 41 4c 20 65 72 72 6f 72  E_INTERNAL error
1fe80 73 2e 0a 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f  s..*/..static vo
1fe90 69 64 20 72 62 75 55 6e 6c 6f 63 6b 53 68 6d 28  id rbuUnlockShm(
1fea0 72 62 75 5f 66 69 6c 65 20 2a 70 29 7b 0a 20 20  rbu_file *p){.  
1feb0 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 65 6e 46  assert( p->openF
1fec0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
1fed0 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 3b 0a 20 20  EN_MAIN_DB );.  
1fee0 69 66 28 20 70 2d 3e 70 52 62 75 20 29 7b 0a 20  if( p->pRbu ){. 
1fef0 20 20 20 69 6e 74 20 28 2a 78 53 68 6d 4c 6f 63     int (*xShmLoc
1ff00 6b 29 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  k)(sqlite3_file*
1ff10 2c 69 6e 74 2c 69 6e 74 2c 69 6e 74 29 20 3d 20  ,int,int,int) = 
1ff20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f  p->pReal->pMetho
1ff30 64 73 2d 3e 78 53 68 6d 4c 6f 63 6b 3b 0a 20 20  ds->xShmLock;.  
1ff40 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
1ff50 28 69 3d 30 3b 20 69 3c 53 51 4c 49 54 45 5f 53  (i=0; i<SQLITE_S
1ff60 48 4d 5f 4e 4c 4f 43 4b 3b 69 2b 2b 29 7b 0a 20  HM_NLOCK;i++){. 
1ff70 20 20 20 20 20 69 66 28 20 28 31 3c 3c 69 29 20       if( (1<<i) 
1ff80 26 20 70 2d 3e 70 52 62 75 2d 3e 6d 4c 6f 63 6b  & p->pRbu->mLock
1ff90 20 29 7b 0a 20 20 20 20 20 20 20 20 78 53 68 6d   ){.        xShm
1ffa0 4c 6f 63 6b 28 70 2d 3e 70 52 65 61 6c 2c 20 69  Lock(p->pReal, i
1ffb0 2c 20 31 2c 20 53 51 4c 49 54 45 5f 53 48 4d 5f  , 1, SQLITE_SHM_
1ffc0 55 4e 4c 4f 43 4b 7c 53 51 4c 49 54 45 5f 53 48  UNLOCK|SQLITE_SH
1ffd0 4d 5f 45 58 43 4c 55 53 49 56 45 29 3b 0a 20 20  M_EXCLUSIVE);.  
1ffe0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1fff0 70 2d 3e 70 52 62 75 2d 3e 6d 4c 6f 63 6b 20 3d  p->pRbu->mLock =
20000 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2f   0;.  }.}../*.*/
20010 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 55  .static int rbuU
20020 70 64 61 74 65 54 65 6d 70 53 69 7a 65 28 72 62  pdateTempSize(rb
20030 75 5f 66 69 6c 65 20 2a 70 46 64 2c 20 73 71 6c  u_file *pFd, sql
20040 69 74 65 33 5f 69 6e 74 36 34 20 6e 4e 65 77 29  ite3_int64 nNew)
20050 7b 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20 2a  {.  sqlite3rbu *
20060 70 52 62 75 20 3d 20 70 46 64 2d 3e 70 52 62 75  pRbu = pFd->pRbu
20070 3b 0a 20 20 69 36 34 20 6e 44 69 66 66 20 3d 20  ;.  i64 nDiff = 
20080 6e 4e 65 77 20 2d 20 70 46 64 2d 3e 73 7a 3b 0a  nNew - pFd->sz;.
20090 20 20 70 52 62 75 2d 3e 73 7a 54 65 6d 70 20 2b    pRbu->szTemp +
200a0 3d 20 6e 44 69 66 66 3b 0a 20 20 70 46 64 2d 3e  = nDiff;.  pFd->
200b0 73 7a 20 3d 20 6e 4e 65 77 3b 0a 20 20 61 73 73  sz = nNew;.  ass
200c0 65 72 74 28 20 70 52 62 75 2d 3e 73 7a 54 65 6d  ert( pRbu->szTem
200d0 70 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 52  p>=0 );.  if( pR
200e0 62 75 2d 3e 73 7a 54 65 6d 70 4c 69 6d 69 74 20  bu->szTempLimit 
200f0 26 26 20 70 52 62 75 2d 3e 73 7a 54 65 6d 70 3e  && pRbu->szTemp>
20100 70 52 62 75 2d 3e 73 7a 54 65 6d 70 4c 69 6d 69  pRbu->szTempLimi
20110 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  t ) return SQLIT
20120 45 5f 46 55 4c 4c 3b 0a 20 20 72 65 74 75 72 6e  E_FULL;.  return
20130 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
20140 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 72 62  *.** Close an rb
20150 75 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  u file..*/.stati
20160 63 20 69 6e 74 20 72 62 75 56 66 73 43 6c 6f 73  c int rbuVfsClos
20170 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
20180 70 46 69 6c 65 29 7b 0a 20 20 72 62 75 5f 66 69  pFile){.  rbu_fi
20190 6c 65 20 2a 70 20 3d 20 28 72 62 75 5f 66 69 6c  le *p = (rbu_fil
201a0 65 2a 29 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20  e*)pFile;.  int 
201b0 72 63 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  rc;.  int i;..  
201c0 2f 2a 20 46 72 65 65 20 74 68 65 20 63 6f 6e 74  /* Free the cont
201d0 65 6e 74 73 20 6f 66 20 74 68 65 20 61 70 53 68  ents of the apSh
201e0 6d 5b 5d 20 61 72 72 61 79 2e 20 41 6e 64 20 74  m[] array. And t
201f0 68 65 20 61 72 72 61 79 20 69 74 73 65 6c 66 2e  he array itself.
20200 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
20210 3c 70 2d 3e 6e 53 68 6d 3b 20 69 2b 2b 29 7b 0a  <p->nShm; i++){.
20220 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
20230 28 70 2d 3e 61 70 53 68 6d 5b 69 5d 29 3b 0a 20  (p->apShm[i]);. 
20240 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
20250 65 28 70 2d 3e 61 70 53 68 6d 29 3b 0a 20 20 70  e(p->apShm);.  p
20260 2d 3e 61 70 53 68 6d 20 3d 20 30 3b 0a 20 20 73  ->apShm = 0;.  s
20270 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a  qlite3_free(p->z
20280 44 65 6c 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  Del);..  if( p->
20290 6f 70 65 6e 46 6c 61 67 73 20 26 20 53 51 4c 49  openFlags & SQLI
202a0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20  TE_OPEN_MAIN_DB 
202b0 29 7b 0a 20 20 20 20 72 62 75 5f 66 69 6c 65 20  ){.    rbu_file 
202c0 2a 2a 70 70 3b 0a 20 20 20 20 73 71 6c 69 74 65  **pp;.    sqlite
202d0 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 2d  3_mutex_enter(p-
202e0 3e 70 52 62 75 56 66 73 2d 3e 6d 75 74 65 78 29  >pRbuVfs->mutex)
202f0 3b 0a 20 20 20 20 66 6f 72 28 70 70 3d 26 70 2d  ;.    for(pp=&p-
20300 3e 70 52 62 75 56 66 73 2d 3e 70 4d 61 69 6e 3b  >pRbuVfs->pMain;
20310 20 2a 70 70 21 3d 70 3b 20 70 70 3d 26 28 28 2a   *pp!=p; pp=&((*
20320 70 70 29 2d 3e 70 4d 61 69 6e 4e 65 78 74 29 29  pp)->pMainNext))
20330 3b 0a 20 20 20 20 2a 70 70 20 3d 20 70 2d 3e 70  ;.    *pp = p->p
20340 4d 61 69 6e 4e 65 78 74 3b 0a 20 20 20 20 73 71  MainNext;.    sq
20350 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
20360 65 28 70 2d 3e 70 52 62 75 56 66 73 2d 3e 6d 75  e(p->pRbuVfs->mu
20370 74 65 78 29 3b 0a 20 20 20 20 72 62 75 55 6e 6c  tex);.    rbuUnl
20380 6f 63 6b 53 68 6d 28 70 29 3b 0a 20 20 20 20 70  ockShm(p);.    p
20390 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64  ->pReal->pMethod
203a0 73 2d 3e 78 53 68 6d 55 6e 6d 61 70 28 70 2d 3e  s->xShmUnmap(p->
203b0 70 52 65 61 6c 2c 20 30 29 3b 0a 20 20 7d 0a 20  pReal, 0);.  }. 
203c0 20 65 6c 73 65 20 69 66 28 20 28 70 2d 3e 6f 70   else if( (p->op
203d0 65 6e 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  enFlags & SQLITE
203e0 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
203f0 4f 53 45 29 20 26 26 20 70 2d 3e 70 52 62 75 20  OSE) && p->pRbu 
20400 29 7b 0a 20 20 20 20 72 62 75 55 70 64 61 74 65  ){.    rbuUpdate
20410 54 65 6d 70 53 69 7a 65 28 70 2c 20 30 29 3b 0a  TempSize(p, 0);.
20420 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20    }..  /* Close 
20430 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 66  the underlying f
20440 69 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ile handle */.  
20450 72 63 20 3d 20 70 2d 3e 70 52 65 61 6c 2d 3e 70  rc = p->pReal->p
20460 4d 65 74 68 6f 64 73 2d 3e 78 43 6c 6f 73 65 28  Methods->xClose(
20470 70 2d 3e 70 52 65 61 6c 29 3b 0a 20 20 72 65 74  p->pReal);.  ret
20480 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
20490 2a 20 52 65 61 64 20 61 6e 64 20 72 65 74 75 72  * Read and retur
204a0 6e 20 61 6e 20 75 6e 73 69 67 6e 65 64 20 33 32  n an unsigned 32
204b0 2d 62 69 74 20 62 69 67 2d 65 6e 64 69 61 6e 20  -bit big-endian 
204c0 69 6e 74 65 67 65 72 20 66 72 6f 6d 20 74 68 65  integer from the
204d0 20 62 75 66 66 65 72 20 0a 2a 2a 20 70 61 73 73   buffer .** pass
204e0 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61  ed as the only a
204f0 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  rgument..*/.stat
20500 69 63 20 75 33 32 20 72 62 75 47 65 74 55 33 32  ic u32 rbuGetU32
20510 28 75 38 20 2a 61 42 75 66 29 7b 0a 20 20 72 65  (u8 *aBuf){.  re
20520 74 75 72 6e 20 28 28 75 33 32 29 61 42 75 66 5b  turn ((u32)aBuf[
20530 30 5d 20 3c 3c 20 32 34 29 0a 20 20 20 20 20 20  0] << 24).      
20540 20 2b 20 28 28 75 33 32 29 61 42 75 66 5b 31 5d   + ((u32)aBuf[1]
20550 20 3c 3c 20 31 36 29 0a 20 20 20 20 20 20 20 2b   << 16).       +
20560 20 28 28 75 33 32 29 61 42 75 66 5b 32 5d 20 3c   ((u32)aBuf[2] <
20570 3c 20 20 38 29 0a 20 20 20 20 20 20 20 2b 20 28  <  8).       + (
20580 28 75 33 32 29 61 42 75 66 5b 33 5d 29 3b 0a 7d  (u32)aBuf[3]);.}
20590 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e  ../*.** Write an
205a0 20 75 6e 73 69 67 6e 65 64 20 33 32 2d 62 69 74   unsigned 32-bit
205b0 20 76 61 6c 75 65 20 69 6e 20 62 69 67 2d 65 6e   value in big-en
205c0 64 69 61 6e 20 66 6f 72 6d 61 74 20 74 6f 20 74  dian format to t
205d0 68 65 20 73 75 70 70 6c 69 65 64 0a 2a 2a 20 62  he supplied.** b
205e0 75 66 66 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  uffer..*/.static
205f0 20 76 6f 69 64 20 72 62 75 50 75 74 55 33 32 28   void rbuPutU32(
20600 75 38 20 2a 61 42 75 66 2c 20 75 33 32 20 69 56  u8 *aBuf, u32 iV
20610 61 6c 29 7b 0a 20 20 61 42 75 66 5b 30 5d 20 3d  al){.  aBuf[0] =
20620 20 28 69 56 61 6c 20 3e 3e 20 32 34 29 20 26 20   (iVal >> 24) & 
20630 30 78 46 46 3b 0a 20 20 61 42 75 66 5b 31 5d 20  0xFF;.  aBuf[1] 
20640 3d 20 28 69 56 61 6c 20 3e 3e 20 31 36 29 20 26  = (iVal >> 16) &
20650 20 30 78 46 46 3b 0a 20 20 61 42 75 66 5b 32 5d   0xFF;.  aBuf[2]
20660 20 3d 20 28 69 56 61 6c 20 3e 3e 20 20 38 29 20   = (iVal >>  8) 
20670 26 20 30 78 46 46 3b 0a 20 20 61 42 75 66 5b 33  & 0xFF;.  aBuf[3
20680 5d 20 3d 20 28 69 56 61 6c 20 3e 3e 20 20 30 29  ] = (iVal >>  0)
20690 20 26 20 30 78 46 46 3b 0a 7d 0a 0a 73 74 61 74   & 0xFF;.}..stat
206a0 69 63 20 76 6f 69 64 20 72 62 75 50 75 74 55 31  ic void rbuPutU1
206b0 36 28 75 38 20 2a 61 42 75 66 2c 20 75 31 36 20  6(u8 *aBuf, u16 
206c0 69 56 61 6c 29 7b 0a 20 20 61 42 75 66 5b 30 5d  iVal){.  aBuf[0]
206d0 20 3d 20 28 69 56 61 6c 20 3e 3e 20 20 38 29 20   = (iVal >>  8) 
206e0 26 20 30 78 46 46 3b 0a 20 20 61 42 75 66 5b 31  & 0xFF;.  aBuf[1
206f0 5d 20 3d 20 28 69 56 61 6c 20 3e 3e 20 20 30 29  ] = (iVal >>  0)
20700 20 26 20 30 78 46 46 3b 0a 7d 0a 0a 2f 2a 0a 2a   & 0xFF;.}../*.*
20710 2a 20 52 65 61 64 20 64 61 74 61 20 66 72 6f 6d  * Read data from
20720 20 61 6e 20 72 62 75 56 66 73 2d 66 69 6c 65 2e   an rbuVfs-file.
20730 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
20740 62 75 56 66 73 52 65 61 64 28 0a 20 20 73 71 6c  buVfsRead(.  sql
20750 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65  ite3_file *pFile
20760 2c 20 0a 20 20 76 6f 69 64 20 2a 7a 42 75 66 2c  , .  void *zBuf,
20770 20 0a 20 20 69 6e 74 20 69 41 6d 74 2c 20 0a 20   .  int iAmt, . 
20780 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 69 4f   sqlite_int64 iO
20790 66 73 74 0a 29 7b 0a 20 20 72 62 75 5f 66 69 6c  fst.){.  rbu_fil
207a0 65 20 2a 70 20 3d 20 28 72 62 75 5f 66 69 6c 65  e *p = (rbu_file
207b0 2a 29 70 46 69 6c 65 3b 0a 20 20 73 71 6c 69 74  *)pFile;.  sqlit
207c0 65 33 72 62 75 20 2a 70 52 62 75 20 3d 20 70 2d  e3rbu *pRbu = p-
207d0 3e 70 52 62 75 3b 0a 20 20 69 6e 74 20 72 63 3b  >pRbu;.  int rc;
207e0 0a 0a 20 20 69 66 28 20 70 52 62 75 20 26 26 20  ..  if( pRbu && 
207f0 70 52 62 75 2d 3e 65 53 74 61 67 65 3d 3d 52 42  pRbu->eStage==RB
20800 55 5f 53 54 41 47 45 5f 43 41 50 54 55 52 45 20  U_STAGE_CAPTURE 
20810 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
20820 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20 53 51  ->openFlags & SQ
20830 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 29 3b  LITE_OPEN_WAL );
20840 0a 20 20 20 20 72 63 20 3d 20 72 62 75 43 61 70  .    rc = rbuCap
20850 74 75 72 65 57 61 6c 52 65 61 64 28 70 2d 3e 70  tureWalRead(p->p
20860 52 62 75 2c 20 69 4f 66 73 74 2c 20 69 41 6d 74  Rbu, iOfst, iAmt
20870 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
20880 69 66 28 20 70 52 62 75 20 26 26 20 70 52 62 75  if( pRbu && pRbu
20890 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54  ->eStage==RBU_ST
208a0 41 47 45 5f 4f 41 4c 20 0a 20 20 20 20 20 26 26  AGE_OAL .     &&
208b0 20 28 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26   (p->openFlags &
208c0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c   SQLITE_OPEN_WAL
208d0 29 20 0a 20 20 20 20 20 26 26 20 69 4f 66 73 74  ) .     && iOfst
208e0 3e 3d 70 52 62 75 2d 3e 69 4f 61 6c 53 7a 20 0a  >=pRbu->iOalSz .
208f0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63 20      ){.      rc 
20900 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
20910 20 20 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20     memset(zBuf, 
20920 30 2c 20 69 41 6d 74 29 3b 0a 20 20 20 20 7d 65  0, iAmt);.    }e
20930 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
20940 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f  p->pReal->pMetho
20950 64 73 2d 3e 78 52 65 61 64 28 70 2d 3e 70 52 65  ds->xRead(p->pRe
20960 61 6c 2c 20 7a 42 75 66 2c 20 69 41 6d 74 2c 20  al, zBuf, iAmt, 
20970 69 4f 66 73 74 29 3b 0a 23 69 66 20 31 0a 20 20  iOfst);.#if 1.  
20980 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
20990 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 74  s being called t
209a0 6f 20 72 65 61 64 20 74 68 65 20 66 69 72 73 74  o read the first
209b0 20 70 61 67 65 20 6f 66 20 74 68 65 20 74 61 72   page of the tar
209c0 67 65 74 20 0a 20 20 20 20 20 20 2a 2a 20 64 61  get .      ** da
209d0 74 61 62 61 73 65 20 61 73 20 70 61 72 74 20 6f  tabase as part o
209e0 66 20 61 6e 20 72 62 75 20 76 61 63 75 75 6d 20  f an rbu vacuum 
209f0 6f 70 65 72 61 74 69 6f 6e 2c 20 73 79 6e 74 68  operation, synth
20a00 65 73 69 7a 65 20 74 68 65 20 0a 20 20 20 20 20  esize the .     
20a10 20 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20   ** contents of 
20a20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 69  the first page i
20a30 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 79 65  f it does not ye
20a40 74 20 65 78 69 73 74 2e 20 4f 74 68 65 72 77 69  t exist. Otherwi
20a50 73 65 2c 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c  se,.      ** SQL
20a60 69 74 65 20 77 69 6c 6c 20 6e 6f 74 20 63 68 65  ite will not che
20a70 63 6b 20 66 6f 72 20 61 20 2a 2d 77 61 6c 20 66  ck for a *-wal f
20a80 69 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69  ile.  */.      i
20a90 66 28 20 70 52 62 75 20 26 26 20 72 62 75 49 73  f( pRbu && rbuIs
20aa0 56 61 63 75 75 6d 28 70 52 62 75 29 20 0a 20 20  Vacuum(pRbu) .  
20ab0 20 20 20 20 20 20 20 20 26 26 20 72 63 3d 3d 53          && rc==S
20ac0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
20ad0 54 5f 52 45 41 44 20 26 26 20 69 4f 66 73 74 3d  T_READ && iOfst=
20ae0 3d 30 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  =0.          && 
20af0 28 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20  (p->openFlags & 
20b00 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
20b10 5f 44 42 29 0a 20 20 20 20 20 20 20 20 20 20 26  _DB).          &
20b20 26 20 70 52 62 75 2d 3e 72 63 3d 3d 53 51 4c 49  & pRbu->rc==SQLI
20b30 54 45 5f 4f 4b 0a 20 20 20 20 20 20 29 7b 0a 20  TE_OK.      ){. 
20b40 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
20b50 69 6c 65 20 2a 70 46 64 20 3d 20 28 73 71 6c 69  ile *pFd = (sqli
20b60 74 65 33 5f 66 69 6c 65 2a 29 70 52 62 75 2d 3e  te3_file*)pRbu->
20b70 70 52 62 75 46 64 3b 0a 20 20 20 20 20 20 20 20  pRbuFd;.        
20b80 72 63 20 3d 20 70 46 64 2d 3e 70 4d 65 74 68 6f  rc = pFd->pMetho
20b90 64 73 2d 3e 78 52 65 61 64 28 70 46 64 2c 20 7a  ds->xRead(pFd, z
20ba0 42 75 66 2c 20 69 41 6d 74 2c 20 69 4f 66 73 74  Buf, iAmt, iOfst
20bb0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
20bc0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
20bd0 20 20 20 20 20 20 20 20 20 20 75 38 20 2a 61 42            u8 *aB
20be0 75 66 20 3d 20 28 75 38 2a 29 7a 42 75 66 3b 0a  uf = (u8*)zBuf;.
20bf0 20 20 20 20 20 20 20 20 20 20 75 33 32 20 69 52            u32 iR
20c00 6f 6f 74 20 3d 20 72 62 75 47 65 74 55 33 32 28  oot = rbuGetU32(
20c10 26 61 42 75 66 5b 35 32 5d 29 20 3f 20 31 20 3a  &aBuf[52]) ? 1 :
20c20 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 62   0;.          rb
20c30 75 50 75 74 55 33 32 28 26 61 42 75 66 5b 35 32  uPutU32(&aBuf[52
20c40 5d 2c 20 69 52 6f 6f 74 29 3b 20 20 20 20 20 20  ], iRoot);      
20c50 2f 2a 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 20  /* largest root 
20c60 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  page number */. 
20c70 20 20 20 20 20 20 20 20 20 72 62 75 50 75 74 55           rbuPutU
20c80 33 32 28 26 61 42 75 66 5b 33 36 5d 2c 20 30 29  32(&aBuf[36], 0)
20c90 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6e 75  ;          /* nu
20ca0 6d 62 65 72 20 6f 66 20 66 72 65 65 20 70 61 67  mber of free pag
20cb0 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  es */.          
20cc0 72 62 75 50 75 74 55 33 32 28 26 61 42 75 66 5b  rbuPutU32(&aBuf[
20cd0 33 32 5d 2c 20 30 29 3b 20 20 20 20 20 20 20 20  32], 0);        
20ce0 20 20 2f 2a 20 66 69 72 73 74 20 70 61 67 65 20    /* first page 
20cf0 6f 6e 20 66 72 65 65 20 6c 69 73 74 20 74 72 75  on free list tru
20d00 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  nk */.          
20d10 72 62 75 50 75 74 55 33 32 28 26 61 42 75 66 5b  rbuPutU32(&aBuf[
20d20 32 38 5d 2c 20 31 29 3b 20 20 20 20 20 20 20 20  28], 1);        
20d30 20 20 2f 2a 20 73 69 7a 65 20 6f 66 20 64 62 20    /* size of db 
20d40 66 69 6c 65 20 69 6e 20 70 61 67 65 73 20 2a 2f  file in pages */
20d50 0a 20 20 20 20 20 20 20 20 20 20 72 62 75 50 75  .          rbuPu
20d60 74 55 33 32 28 26 61 42 75 66 5b 32 34 5d 2c 20  tU32(&aBuf[24], 
20d70 70 52 62 75 2d 3e 70 52 62 75 46 64 2d 3e 69 43  pRbu->pRbuFd->iC
20d80 6f 6f 6b 69 65 2b 31 29 3b 20 20 2f 2a 20 43 68  ookie+1);  /* Ch
20d90 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  ange counter */.
20da0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
20db0 41 6d 74 3e 31 30 30 20 29 7b 0a 20 20 20 20 20  Amt>100 ){.     
20dc0 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 61         memset(&a
20dd0 42 75 66 5b 31 30 30 5d 2c 20 30 2c 20 69 41 6d  Buf[100], 0, iAm
20de0 74 2d 31 30 30 29 3b 0a 20 20 20 20 20 20 20 20  t-100);.        
20df0 20 20 20 20 72 62 75 50 75 74 55 31 36 28 26 61      rbuPutU16(&a
20e00 42 75 66 5b 31 30 35 5d 2c 20 69 41 6d 74 20 26  Buf[105], iAmt &
20e10 20 30 78 46 46 46 46 29 3b 0a 20 20 20 20 20 20   0xFFFF);.      
20e20 20 20 20 20 20 20 61 42 75 66 5b 31 30 30 5d 20        aBuf[100] 
20e30 3d 20 30 78 30 44 3b 0a 20 20 20 20 20 20 20 20  = 0x0D;.        
20e40 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
20e50 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
20e60 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
20e70 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4f 66 73  QLITE_OK && iOfs
20e80 74 3d 3d 30 20 26 26 20 28 70 2d 3e 6f 70 65 6e  t==0 && (p->open
20e90 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  Flags & SQLITE_O
20ea0 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 20 29 7b 0a  PEN_MAIN_DB) ){.
20eb0 20 20 20 20 20 20 2f 2a 20 54 68 65 73 65 20 6c        /* These l
20ec0 6f 6f 6b 20 6c 69 6b 65 20 6d 61 67 69 63 20 6e  ook like magic n
20ed0 75 6d 62 65 72 73 2e 20 42 75 74 20 74 68 65 79  umbers. But they
20ee0 20 61 72 65 20 73 74 61 62 6c 65 2c 20 61 73 20   are stable, as 
20ef0 74 68 65 79 20 61 72 65 20 70 61 72 74 0a 20 20  they are part.  
20f00 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 64       ** of the d
20f10 65 66 69 6e 69 74 69 6f 6e 20 6f 66 20 74 68 65  efinition of the
20f20 20 53 51 4c 69 74 65 20 66 69 6c 65 20 66 6f 72   SQLite file for
20f30 6d 61 74 2c 20 77 68 69 63 68 20 6d 61 79 20 6e  mat, which may n
20f40 6f 74 20 63 68 61 6e 67 65 2e 20 2a 2f 0a 20 20  ot change. */.  
20f50 20 20 20 20 75 38 20 2a 70 42 75 66 20 3d 20 28      u8 *pBuf = (
20f60 75 38 2a 29 7a 42 75 66 3b 0a 20 20 20 20 20 20  u8*)zBuf;.      
20f70 70 2d 3e 69 43 6f 6f 6b 69 65 20 3d 20 72 62 75  p->iCookie = rbu
20f80 47 65 74 55 33 32 28 26 70 42 75 66 5b 32 34 5d  GetU32(&pBuf[24]
20f90 29 3b 0a 20 20 20 20 20 20 70 2d 3e 69 57 72 69  );.      p->iWri
20fa0 74 65 56 65 72 20 3d 20 70 42 75 66 5b 31 39 5d  teVer = pBuf[19]
20fb0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
20fc0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
20fd0 2a 20 57 72 69 74 65 20 64 61 74 61 20 74 6f 20  * Write data to 
20fe0 61 6e 20 72 62 75 56 66 73 2d 66 69 6c 65 2e 0a  an rbuVfs-file..
20ff0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62  */.static int rb
21000 75 56 66 73 57 72 69 74 65 28 0a 20 20 73 71 6c  uVfsWrite(.  sql
21010 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65  ite3_file *pFile
21020 2c 20 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  , .  const void 
21030 2a 7a 42 75 66 2c 20 0a 20 20 69 6e 74 20 69 41  *zBuf, .  int iA
21040 6d 74 2c 20 0a 20 20 73 71 6c 69 74 65 5f 69 6e  mt, .  sqlite_in
21050 74 36 34 20 69 4f 66 73 74 0a 29 7b 0a 20 20 72  t64 iOfst.){.  r
21060 62 75 5f 66 69 6c 65 20 2a 70 20 3d 20 28 72 62  bu_file *p = (rb
21070 75 5f 66 69 6c 65 2a 29 70 46 69 6c 65 3b 0a 20  u_file*)pFile;. 
21080 20 73 71 6c 69 74 65 33 72 62 75 20 2a 70 52 62   sqlite3rbu *pRb
21090 75 20 3d 20 70 2d 3e 70 52 62 75 3b 0a 20 20 69  u = p->pRbu;.  i
210a0 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 70 52  nt rc;..  if( pR
210b0 62 75 20 26 26 20 70 52 62 75 2d 3e 65 53 74 61  bu && pRbu->eSta
210c0 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 43 41  ge==RBU_STAGE_CA
210d0 50 54 55 52 45 20 29 7b 0a 20 20 20 20 61 73 73  PTURE ){.    ass
210e0 65 72 74 28 20 70 2d 3e 6f 70 65 6e 46 6c 61 67  ert( p->openFlag
210f0 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
21100 4d 41 49 4e 5f 44 42 20 29 3b 0a 20 20 20 20 72  MAIN_DB );.    r
21110 63 20 3d 20 72 62 75 43 61 70 74 75 72 65 44 62  c = rbuCaptureDb
21120 57 72 69 74 65 28 70 2d 3e 70 52 62 75 2c 20 69  Write(p->pRbu, i
21130 4f 66 73 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Ofst);.  }else{.
21140 20 20 20 20 69 66 28 20 70 52 62 75 20 29 7b 0a      if( pRbu ){.
21150 20 20 20 20 20 20 69 66 28 20 70 52 62 75 2d 3e        if( pRbu->
21160 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47  eStage==RBU_STAG
21170 45 5f 4f 41 4c 20 0a 20 20 20 20 20 20 20 26 26  E_OAL .       &&
21180 20 28 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26   (p->openFlags &
21190 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c   SQLITE_OPEN_WAL
211a0 29 20 0a 20 20 20 20 20 20 20 26 26 20 69 4f 66  ) .       && iOf
211b0 73 74 3e 3d 70 52 62 75 2d 3e 69 4f 61 6c 53 7a  st>=pRbu->iOalSz
211c0 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
211d0 20 20 70 52 62 75 2d 3e 69 4f 61 6c 53 7a 20 3d    pRbu->iOalSz =
211e0 20 69 41 6d 74 20 2b 20 69 4f 66 73 74 3b 0a 20   iAmt + iOfst;. 
211f0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
21200 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20 53 51  ->openFlags & SQ
21210 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45  LITE_OPEN_DELETE
21220 4f 4e 43 4c 4f 53 45 20 29 7b 0a 20 20 20 20 20  ONCLOSE ){.     
21230 20 20 20 69 36 34 20 73 7a 4e 65 77 20 3d 20 69     i64 szNew = i
21240 41 6d 74 2b 69 4f 66 73 74 3b 0a 20 20 20 20 20  Amt+iOfst;.     
21250 20 20 20 69 66 28 20 73 7a 4e 65 77 3e 70 2d 3e     if( szNew>p->
21260 73 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  sz ){.          
21270 72 63 20 3d 20 72 62 75 55 70 64 61 74 65 54 65  rc = rbuUpdateTe
21280 6d 70 53 69 7a 65 28 70 2c 20 73 7a 4e 65 77 29  mpSize(p, szNew)
21290 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
212a0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
212b0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
212c0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
212d0 20 7d 0a 20 20 20 20 72 63 20 3d 20 70 2d 3e 70   }.    rc = p->p
212e0 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e  Real->pMethods->
212f0 78 57 72 69 74 65 28 70 2d 3e 70 52 65 61 6c 2c  xWrite(p->pReal,
21300 20 7a 42 75 66 2c 20 69 41 6d 74 2c 20 69 4f 66   zBuf, iAmt, iOf
21310 73 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  st);.    if( rc=
21320 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4f  =SQLITE_OK && iO
21330 66 73 74 3d 3d 30 20 26 26 20 28 70 2d 3e 6f 70  fst==0 && (p->op
21340 65 6e 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  enFlags & SQLITE
21350 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 20 29  _OPEN_MAIN_DB) )
21360 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 73 65  {.      /* These
21370 20 6c 6f 6f 6b 20 6c 69 6b 65 20 6d 61 67 69 63   look like magic
21380 20 6e 75 6d 62 65 72 73 2e 20 42 75 74 20 74 68   numbers. But th
21390 65 79 20 61 72 65 20 73 74 61 62 6c 65 2c 20 61  ey are stable, a
213a0 73 20 74 68 65 79 20 61 72 65 20 70 61 72 74 0a  s they are part.
213b0 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20        ** of the 
213c0 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66 20 74 68  definition of th
213d0 65 20 53 51 4c 69 74 65 20 66 69 6c 65 20 66 6f  e SQLite file fo
213e0 72 6d 61 74 2c 20 77 68 69 63 68 20 6d 61 79 20  rmat, which may 
213f0 6e 6f 74 20 63 68 61 6e 67 65 2e 20 2a 2f 0a 20  not change. */. 
21400 20 20 20 20 20 75 38 20 2a 70 42 75 66 20 3d 20       u8 *pBuf = 
21410 28 75 38 2a 29 7a 42 75 66 3b 0a 20 20 20 20 20  (u8*)zBuf;.     
21420 20 70 2d 3e 69 43 6f 6f 6b 69 65 20 3d 20 72 62   p->iCookie = rb
21430 75 47 65 74 55 33 32 28 26 70 42 75 66 5b 32 34  uGetU32(&pBuf[24
21440 5d 29 3b 0a 20 20 20 20 20 20 70 2d 3e 69 57 72  ]);.      p->iWr
21450 69 74 65 56 65 72 20 3d 20 70 42 75 66 5b 31 39  iteVer = pBuf[19
21460 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  ];.    }.  }.  r
21470 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
21480 2a 2a 20 54 72 75 6e 63 61 74 65 20 61 6e 20 72  ** Truncate an r
21490 62 75 56 66 73 2d 66 69 6c 65 2e 0a 2a 2f 0a 73  buVfs-file..*/.s
214a0 74 61 74 69 63 20 69 6e 74 20 72 62 75 56 66 73  tatic int rbuVfs
214b0 54 72 75 6e 63 61 74 65 28 73 71 6c 69 74 65 33  Truncate(sqlite3
214c0 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 73 71  _file *pFile, sq
214d0 6c 69 74 65 5f 69 6e 74 36 34 20 73 69 7a 65 29  lite_int64 size)
214e0 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 20  {.  rbu_file *p 
214f0 3d 20 28 72 62 75 5f 66 69 6c 65 2a 29 70 46 69  = (rbu_file*)pFi
21500 6c 65 3b 0a 20 20 69 66 28 20 28 70 2d 3e 6f 70  le;.  if( (p->op
21510 65 6e 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  enFlags & SQLITE
21520 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
21530 4f 53 45 29 20 26 26 20 70 2d 3e 70 52 62 75 20  OSE) && p->pRbu 
21540 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  ){.    int rc = 
21550 72 62 75 55 70 64 61 74 65 54 65 6d 70 53 69 7a  rbuUpdateTempSiz
21560 65 28 70 2c 20 73 69 7a 65 29 3b 0a 20 20 20 20  e(p, size);.    
21570 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
21580 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
21590 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70   }.  return p->p
215a0 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e  Real->pMethods->
215b0 78 54 72 75 6e 63 61 74 65 28 70 2d 3e 70 52 65  xTruncate(p->pRe
215c0 61 6c 2c 20 73 69 7a 65 29 3b 0a 7d 0a 0a 2f 2a  al, size);.}../*
215d0 0a 2a 2a 20 53 79 6e 63 20 61 6e 20 72 62 75 56  .** Sync an rbuV
215e0 66 73 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  fs-file..*/.stat
215f0 69 63 20 69 6e 74 20 72 62 75 56 66 73 53 79 6e  ic int rbuVfsSyn
21600 63 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  c(sqlite3_file *
21610 70 46 69 6c 65 2c 20 69 6e 74 20 66 6c 61 67 73  pFile, int flags
21620 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a 70  ){.  rbu_file *p
21630 20 3d 20 28 72 62 75 5f 66 69 6c 65 20 2a 29 70   = (rbu_file *)p
21640 46 69 6c 65 3b 0a 20 20 69 66 28 20 70 2d 3e 70  File;.  if( p->p
21650 52 62 75 20 26 26 20 70 2d 3e 70 52 62 75 2d 3e  Rbu && p->pRbu->
21660 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47  eStage==RBU_STAG
21670 45 5f 43 41 50 54 55 52 45 20 29 7b 0a 20 20 20  E_CAPTURE ){.   
21680 20 69 66 28 20 70 2d 3e 6f 70 65 6e 46 6c 61 67   if( p->openFlag
21690 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
216a0 4d 41 49 4e 5f 44 42 20 29 7b 0a 20 20 20 20 20  MAIN_DB ){.     
216b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
216c0 4e 54 45 52 4e 41 4c 3b 0a 20 20 20 20 7d 0a 20  NTERNAL;.    }. 
216d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
216e0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  _OK;.  }.  retur
216f0 6e 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74  n p->pReal->pMet
21700 68 6f 64 73 2d 3e 78 53 79 6e 63 28 70 2d 3e 70  hods->xSync(p->p
21710 52 65 61 6c 2c 20 66 6c 61 67 73 29 3b 0a 7d 0a  Real, flags);.}.
21720 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
21730 65 20 63 75 72 72 65 6e 74 20 66 69 6c 65 2d 73  e current file-s
21740 69 7a 65 20 6f 66 20 61 6e 20 72 62 75 56 66 73  ize of an rbuVfs
21750 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  -file..*/.static
21760 20 69 6e 74 20 72 62 75 56 66 73 46 69 6c 65 53   int rbuVfsFileS
21770 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ize(sqlite3_file
21780 20 2a 70 46 69 6c 65 2c 20 73 71 6c 69 74 65 5f   *pFile, sqlite_
21790 69 6e 74 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20  int64 *pSize){. 
217a0 20 72 62 75 5f 66 69 6c 65 20 2a 70 20 3d 20 28   rbu_file *p = (
217b0 72 62 75 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65  rbu_file *)pFile
217c0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 72 63  ;.  int rc;.  rc
217d0 20 3d 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65   = p->pReal->pMe
217e0 74 68 6f 64 73 2d 3e 78 46 69 6c 65 53 69 7a 65  thods->xFileSize
217f0 28 70 2d 3e 70 52 65 61 6c 2c 20 70 53 69 7a 65  (p->pReal, pSize
21800 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  );..  /* If this
21810 20 69 73 20 61 6e 20 52 42 55 20 76 61 63 75 75   is an RBU vacuu
21820 6d 20 6f 70 65 72 61 74 69 6f 6e 20 61 6e 64 20  m operation and 
21830 74 68 69 73 20 69 73 20 74 68 65 20 74 61 72 67  this is the targ
21840 65 74 20 64 61 74 61 62 61 73 65 2c 0a 20 20 2a  et database,.  *
21850 2a 20 70 72 65 74 65 6e 64 20 74 68 61 74 20 69  * pretend that i
21860 74 20 68 61 73 20 61 74 20 6c 65 61 73 74 20 6f  t has at least o
21870 6e 65 20 70 61 67 65 2e 20 4f 74 68 65 72 77 69  ne page. Otherwi
21880 73 65 2c 20 53 51 4c 69 74 65 20 77 69 6c 6c 20  se, SQLite will 
21890 6e 6f 74 0a 20 20 2a 2a 20 63 68 65 63 6b 20 66  not.  ** check f
218a0 6f 72 20 74 68 65 20 65 78 69 73 74 61 6e 63 65  or the existance
218b0 20 6f 66 20 61 20 2a 2d 77 61 6c 20 66 69 6c 65   of a *-wal file
218c0 2e 20 72 62 75 56 66 73 52 65 61 64 28 29 20 63  . rbuVfsRead() c
218d0 6f 6e 74 61 69 6e 73 20 0a 20 20 2a 2a 20 73 69  ontains .  ** si
218e0 6d 69 6c 61 72 20 6c 6f 67 69 63 2e 20 20 2a 2f  milar logic.  */
218f0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
21900 45 5f 4f 4b 20 26 26 20 2a 70 53 69 7a 65 3d 3d  E_OK && *pSize==
21910 30 20 0a 20 20 20 26 26 20 70 2d 3e 70 52 62 75  0 .   && p->pRbu
21920 20 26 26 20 72 62 75 49 73 56 61 63 75 75 6d 28   && rbuIsVacuum(
21930 70 2d 3e 70 52 62 75 29 20 0a 20 20 20 26 26 20  p->pRbu) .   && 
21940 28 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20  (p->openFlags & 
21950 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
21960 5f 44 42 29 0a 20 20 29 7b 0a 20 20 20 20 2a 70  _DB).  ){.    *p
21970 53 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 7d  Size = 1024;.  }
21980 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
21990 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 61 6e 20 72  ./*.** Lock an r
219a0 62 75 56 66 73 2d 66 69 6c 65 2e 0a 2a 2f 0a 73  buVfs-file..*/.s
219b0 74 61 74 69 63 20 69 6e 74 20 72 62 75 56 66 73  tatic int rbuVfs
219c0 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
219d0 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20 65 4c  e *pFile, int eL
219e0 6f 63 6b 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65  ock){.  rbu_file
219f0 20 2a 70 20 3d 20 28 72 62 75 5f 66 69 6c 65 2a   *p = (rbu_file*
21a00 29 70 46 69 6c 65 3b 0a 20 20 73 71 6c 69 74 65  )pFile;.  sqlite
21a10 33 72 62 75 20 2a 70 52 62 75 20 3d 20 70 2d 3e  3rbu *pRbu = p->
21a20 70 52 62 75 3b 0a 20 20 69 6e 74 20 72 63 20 3d  pRbu;.  int rc =
21a30 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
21a40 73 73 65 72 74 28 20 70 2d 3e 6f 70 65 6e 46 6c  ssert( p->openFl
21a50 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f 4f 50  ags & (SQLITE_OP
21a60 45 4e 5f 4d 41 49 4e 5f 44 42 7c 53 51 4c 49 54  EN_MAIN_DB|SQLIT
21a70 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 29 20  E_OPEN_TEMP_DB) 
21a80 29 3b 0a 20 20 69 66 28 20 65 4c 6f 63 6b 3d 3d  );.  if( eLock==
21a90 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 45 58 43 4c  SQLITE_LOCK_EXCL
21aa0 55 53 49 56 45 20 0a 20 20 20 26 26 20 28 70 2d  USIVE .   && (p-
21ab0 3e 62 4e 6f 6c 6f 63 6b 20 7c 7c 20 28 70 52 62  >bNolock || (pRb
21ac0 75 20 26 26 20 70 52 62 75 2d 3e 65 53 74 61 67  u && pRbu->eStag
21ad0 65 21 3d 52 42 55 5f 53 54 41 47 45 5f 44 4f 4e  e!=RBU_STAGE_DON
21ae0 45 29 29 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20  E)).  ){.    /* 
21af0 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 45 58 43  Do not allow EXC
21b00 4c 55 53 49 56 45 20 6c 6f 63 6b 73 2e 20 50 72  LUSIVE locks. Pr
21b10 65 76 65 6e 74 69 6e 67 20 53 51 4c 69 74 65 20  eventing SQLite 
21b20 66 72 6f 6d 20 74 61 6b 69 6e 67 20 74 68 69 73  from taking this
21b30 20 0a 20 20 20 20 2a 2a 20 70 72 65 76 65 6e 74   .    ** prevent
21b40 73 20 69 74 20 66 72 6f 6d 20 63 68 65 63 6b 70  s it from checkp
21b50 6f 69 6e 74 69 6e 67 20 74 68 65 20 64 61 74 61  ointing the data
21b60 62 61 73 65 20 66 72 6f 6d 20 73 71 6c 69 74 65  base from sqlite
21b70 33 5f 63 6c 6f 73 65 28 29 2e 20 2a 2f 0a 20 20  3_close(). */.  
21b80 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
21b90 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  SY;.  }else{.   
21ba0 20 72 63 20 3d 20 70 2d 3e 70 52 65 61 6c 2d 3e   rc = p->pReal->
21bb0 70 4d 65 74 68 6f 64 73 2d 3e 78 4c 6f 63 6b 28  pMethods->xLock(
21bc0 70 2d 3e 70 52 65 61 6c 2c 20 65 4c 6f 63 6b 29  p->pReal, eLock)
21bd0 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
21be0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c  rc;.}../*.** Unl
21bf0 6f 63 6b 20 61 6e 20 72 62 75 56 66 73 2d 66 69  ock an rbuVfs-fi
21c00 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
21c10 74 20 72 62 75 56 66 73 55 6e 6c 6f 63 6b 28 73  t rbuVfsUnlock(s
21c20 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
21c30 6c 65 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a  le, int eLock){.
21c40 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 20 3d 20    rbu_file *p = 
21c50 28 72 62 75 5f 66 69 6c 65 20 2a 29 70 46 69 6c  (rbu_file *)pFil
21c60 65 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70  e;.  return p->p
21c70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e  Real->pMethods->
21c80 78 55 6e 6c 6f 63 6b 28 70 2d 3e 70 52 65 61 6c  xUnlock(p->pReal
21c90 2c 20 65 4c 6f 63 6b 29 3b 0a 7d 0a 0a 2f 2a 0a  , eLock);.}../*.
21ca0 2a 2a 20 43 68 65 63 6b 20 69 66 20 61 6e 6f 74  ** Check if anot
21cb0 68 65 72 20 66 69 6c 65 2d 68 61 6e 64 6c 65 20  her file-handle 
21cc0 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56 45 44  holds a RESERVED
21cd0 20 6c 6f 63 6b 20 6f 6e 20 61 6e 20 72 62 75 56   lock on an rbuV
21ce0 66 73 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  fs-file..*/.stat
21cf0 69 63 20 69 6e 74 20 72 62 75 56 66 73 43 68 65  ic int rbuVfsChe
21d00 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73  ckReservedLock(s
21d10 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
21d20 6c 65 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  le, int *pResOut
21d30 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a 70  ){.  rbu_file *p
21d40 20 3d 20 28 72 62 75 5f 66 69 6c 65 20 2a 29 70   = (rbu_file *)p
21d50 46 69 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 70  File;.  return p
21d60 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64  ->pReal->pMethod
21d70 73 2d 3e 78 43 68 65 63 6b 52 65 73 65 72 76 65  s->xCheckReserve
21d80 64 4c 6f 63 6b 28 70 2d 3e 70 52 65 61 6c 2c 20  dLock(p->pReal, 
21d90 70 52 65 73 4f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a  pResOut);.}../*.
21da0 2a 2a 20 46 69 6c 65 20 63 6f 6e 74 72 6f 6c 20  ** File control 
21db0 6d 65 74 68 6f 64 2e 20 46 6f 72 20 63 75 73 74  method. For cust
21dc0 6f 6d 20 6f 70 65 72 61 74 69 6f 6e 73 20 6f 6e  om operations on
21dd0 20 61 6e 20 72 62 75 56 66 73 2d 66 69 6c 65 2e   an rbuVfs-file.
21de0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
21df0 62 75 56 66 73 46 69 6c 65 43 6f 6e 74 72 6f 6c  buVfsFileControl
21e00 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70  (sqlite3_file *p
21e10 46 69 6c 65 2c 20 69 6e 74 20 6f 70 2c 20 76 6f  File, int op, vo
21e20 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 72 62 75  id *pArg){.  rbu
21e30 5f 66 69 6c 65 20 2a 70 20 3d 20 28 72 62 75 5f  _file *p = (rbu_
21e40 66 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20  file *)pFile;.  
21e50 69 6e 74 20 28 2a 78 43 6f 6e 74 72 6f 6c 29 28  int (*xControl)(
21e60 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 69 6e  sqlite3_file*,in
21e70 74 2c 76 6f 69 64 2a 29 20 3d 20 70 2d 3e 70 52  t,void*) = p->pR
21e80 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78  eal->pMethods->x
21e90 46 69 6c 65 43 6f 6e 74 72 6f 6c 3b 0a 20 20 69  FileControl;.  i
21ea0 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
21eb0 28 20 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26  ( p->openFlags &
21ec0 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41   (SQLITE_OPEN_MA
21ed0 49 4e 5f 44 42 7c 53 51 4c 49 54 45 5f 4f 50 45  IN_DB|SQLITE_OPE
21ee0 4e 5f 54 45 4d 50 5f 44 42 29 0a 20 20 20 20 20  N_TEMP_DB).     
21ef0 20 20 7c 7c 20 70 2d 3e 6f 70 65 6e 46 6c 61 67    || p->openFlag
21f00 73 20 26 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e  s & (SQLITE_OPEN
21f10 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 7c 53 51  _TRANSIENT_DB|SQ
21f20 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a  LITE_OPEN_TEMP_J
21f30 4f 55 52 4e 41 4c 29 0a 20 20 29 3b 0a 20 20 69  OURNAL).  );.  i
21f40 66 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 46 43  f( op==SQLITE_FC
21f50 4e 54 4c 5f 52 42 55 20 29 7b 0a 20 20 20 20 73  NTL_RBU ){.    s
21f60 71 6c 69 74 65 33 72 62 75 20 2a 70 52 62 75 20  qlite3rbu *pRbu 
21f70 3d 20 28 73 71 6c 69 74 65 33 72 62 75 2a 29 70  = (sqlite3rbu*)p
21f80 41 72 67 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 72  Arg;..    /* Fir
21f90 73 74 20 74 72 79 20 74 6f 20 66 69 6e 64 20 61  st try to find a
21fa0 6e 6f 74 68 65 72 20 52 42 55 20 76 66 73 20 6c  nother RBU vfs l
21fb0 6f 77 65 72 20 64 6f 77 6e 20 69 6e 20 74 68 65  ower down in the
21fc0 20 76 66 73 20 73 74 61 63 6b 2e 20 49 66 0a 20   vfs stack. If. 
21fd0 20 20 20 2a 2a 20 6f 6e 65 20 69 73 20 66 6f 75     ** one is fou
21fe0 6e 64 2c 20 74 68 69 73 20 76 66 73 20 77 69 6c  nd, this vfs wil
21ff0 6c 20 6f 70 65 72 61 74 65 20 69 6e 20 70 61 73  l operate in pas
22000 73 2d 74 68 72 6f 75 67 68 20 6d 6f 64 65 2e 20  s-through mode. 
22010 54 68 65 20 6c 6f 77 65 72 0a 20 20 20 20 2a 2a  The lower.    **
22020 20 6c 65 76 65 6c 20 76 66 73 20 77 69 6c 6c 20   level vfs will 
22030 64 6f 20 74 68 65 20 73 70 65 63 69 61 6c 20 52  do the special R
22040 42 55 20 68 61 6e 64 6c 69 6e 67 2e 20 20 2a 2f  BU handling.  */
22050 0a 20 20 20 20 72 63 20 3d 20 78 43 6f 6e 74 72  .    rc = xContr
22060 6f 6c 28 70 2d 3e 70 52 65 61 6c 2c 20 6f 70 2c  ol(p->pReal, op,
22070 20 70 41 72 67 29 3b 0a 0a 20 20 20 20 69 66 28   pArg);..    if(
22080 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46   rc==SQLITE_NOTF
22090 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20 20 2f 2a  OUND ){.      /*
220a0 20 4e 6f 77 20 73 65 61 72 63 68 20 66 6f 72 20   Now search for 
220b0 61 20 7a 69 70 76 66 73 20 69 6e 73 74 61 6e 63  a zipvfs instanc
220c0 65 20 6c 6f 77 65 72 20 64 6f 77 6e 20 69 6e 20  e lower down in 
220d0 74 68 65 20 56 46 53 20 73 74 61 63 6b 2e 20 49  the VFS stack. I
220e0 66 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 65 20 69  f.      ** one i
220f0 73 20 66 6f 75 6e 64 2c 20 74 68 69 73 20 69 73  s found, this is
22100 20 61 6e 20 65 72 72 6f 72 2e 20 20 2a 2f 0a 20   an error.  */. 
22110 20 20 20 20 20 76 6f 69 64 20 2a 64 75 6d 6d 79       void *dummy
22120 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
22130 20 78 43 6f 6e 74 72 6f 6c 28 70 2d 3e 70 52 65   xControl(p->pRe
22140 61 6c 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  al, SQLITE_FCNTL
22150 5f 5a 49 50 56 46 53 2c 20 26 64 75 6d 6d 79 29  _ZIPVFS, &dummy)
22160 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
22170 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
22180 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
22190 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
221a0 70 52 62 75 2d 3e 7a 45 72 72 6d 73 67 20 3d 20  pRbu->zErrmsg = 
221b0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
221c0 22 72 62 75 2f 7a 69 70 76 66 73 20 73 65 74 75  "rbu/zipvfs setu
221d0 70 20 65 72 72 6f 72 22 29 3b 0a 20 20 20 20 20  p error");.     
221e0 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53   }else if( rc==S
221f0 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29  QLITE_NOTFOUND )
22200 7b 0a 20 20 20 20 20 20 20 20 70 52 62 75 2d 3e  {.        pRbu->
22210 70 54 61 72 67 65 74 46 64 20 3d 20 70 3b 0a 20  pTargetFd = p;. 
22220 20 20 20 20 20 20 20 70 2d 3e 70 52 62 75 20 3d         p->pRbu =
22230 20 70 52 62 75 3b 0a 20 20 20 20 20 20 20 20 69   pRbu;.        i
22240 66 28 20 70 2d 3e 70 57 61 6c 46 64 20 29 20 70  f( p->pWalFd ) p
22250 2d 3e 70 57 61 6c 46 64 2d 3e 70 52 62 75 20 3d  ->pWalFd->pRbu =
22260 20 70 52 62 75 3b 0a 20 20 20 20 20 20 20 20 72   pRbu;.        r
22270 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
22280 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
22290 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
222a0 20 20 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 53    else if( op==S
222b0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 52 42 55 43  QLITE_FCNTL_RBUC
222c0 4e 54 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  NT ){.    sqlite
222d0 33 72 62 75 20 2a 70 52 62 75 20 3d 20 28 73 71  3rbu *pRbu = (sq
222e0 6c 69 74 65 33 72 62 75 2a 29 70 41 72 67 3b 0a  lite3rbu*)pArg;.
222f0 20 20 20 20 70 52 62 75 2d 3e 6e 52 62 75 2b 2b      pRbu->nRbu++
22300 3b 0a 20 20 20 20 70 52 62 75 2d 3e 70 52 62 75  ;.    pRbu->pRbu
22310 46 64 20 3d 20 70 3b 0a 20 20 20 20 70 2d 3e 62  Fd = p;.    p->b
22320 4e 6f 6c 6f 63 6b 20 3d 20 31 3b 0a 20 20 7d 0a  Nolock = 1;.  }.
22330 0a 20 20 72 63 20 3d 20 78 43 6f 6e 74 72 6f 6c  .  rc = xControl
22340 28 70 2d 3e 70 52 65 61 6c 2c 20 6f 70 2c 20 70  (p->pReal, op, p
22350 41 72 67 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Arg);.  if( rc==
22360 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6f 70 3d  SQLITE_OK && op=
22370 3d 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 56 46  =SQLITE_FCNTL_VF
22380 53 4e 41 4d 45 20 29 7b 0a 20 20 20 20 72 62 75  SNAME ){.    rbu
22390 5f 76 66 73 20 2a 70 52 62 75 56 66 73 20 3d 20  _vfs *pRbuVfs = 
223a0 70 2d 3e 70 52 62 75 56 66 73 3b 0a 20 20 20 20  p->pRbuVfs;.    
223b0 63 68 61 72 20 2a 7a 49 6e 20 3d 20 2a 28 63 68  char *zIn = *(ch
223c0 61 72 2a 2a 29 70 41 72 67 3b 0a 20 20 20 20 63  ar**)pArg;.    c
223d0 68 61 72 20 2a 7a 4f 75 74 20 3d 20 73 71 6c 69  har *zOut = sqli
223e0 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 72 62 75  te3_mprintf("rbu
223f0 28 25 73 29 2f 25 7a 22 2c 20 70 52 62 75 56 66  (%s)/%z", pRbuVf
22400 73 2d 3e 62 61 73 65 2e 7a 4e 61 6d 65 2c 20 7a  s->base.zName, z
22410 49 6e 29 3b 0a 20 20 20 20 2a 28 63 68 61 72 2a  In);.    *(char*
22420 2a 29 70 41 72 67 20 3d 20 7a 4f 75 74 3b 0a 20  *)pArg = zOut;. 
22430 20 20 20 69 66 28 20 7a 4f 75 74 3d 3d 30 20 29     if( zOut==0 )
22440 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
22450 45 4d 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  EM;.  }..  retur
22460 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
22470 65 74 75 72 6e 20 74 68 65 20 73 65 63 74 6f 72  eturn the sector
22480 2d 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 66  -size in bytes f
22490 6f 72 20 61 6e 20 72 62 75 56 66 73 2d 66 69 6c  or an rbuVfs-fil
224a0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
224b0 20 72 62 75 56 66 73 53 65 63 74 6f 72 53 69 7a   rbuVfsSectorSiz
224c0 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
224d0 70 46 69 6c 65 29 7b 0a 20 20 72 62 75 5f 66 69  pFile){.  rbu_fi
224e0 6c 65 20 2a 70 20 3d 20 28 72 62 75 5f 66 69 6c  le *p = (rbu_fil
224f0 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 72 65 74  e *)pFile;.  ret
22500 75 72 6e 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d  urn p->pReal->pM
22510 65 74 68 6f 64 73 2d 3e 78 53 65 63 74 6f 72 53  ethods->xSectorS
22520 69 7a 65 28 70 2d 3e 70 52 65 61 6c 29 3b 0a 7d  ize(p->pReal);.}
22530 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
22540 68 65 20 64 65 76 69 63 65 20 63 68 61 72 61 63  he device charac
22550 74 65 72 69 73 74 69 63 20 66 6c 61 67 73 20 73  teristic flags s
22560 75 70 70 6f 72 74 65 64 20 62 79 20 61 6e 20 72  upported by an r
22570 62 75 56 66 73 2d 66 69 6c 65 2e 0a 2a 2f 0a 73  buVfs-file..*/.s
22580 74 61 74 69 63 20 69 6e 74 20 72 62 75 56 66 73  tatic int rbuVfs
22590 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
225a0 73 74 69 63 73 28 73 71 6c 69 74 65 33 5f 66 69  stics(sqlite3_fi
225b0 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 72 62  le *pFile){.  rb
225c0 75 5f 66 69 6c 65 20 2a 70 20 3d 20 28 72 62 75  u_file *p = (rbu
225d0 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20  _file *)pFile;. 
225e0 20 72 65 74 75 72 6e 20 70 2d 3e 70 52 65 61 6c   return p->pReal
225f0 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 44 65 76  ->pMethods->xDev
22600 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
22610 63 73 28 70 2d 3e 70 52 65 61 6c 29 3b 0a 7d 0a  cs(p->pReal);.}.
22620 0a 2f 2a 0a 2a 2a 20 54 61 6b 65 20 6f 72 20 72  ./*.** Take or r
22630 65 6c 65 61 73 65 20 61 20 73 68 61 72 65 64 2d  elease a shared-
22640 6d 65 6d 6f 72 79 20 6c 6f 63 6b 2e 0a 2a 2f 0a  memory lock..*/.
22650 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 56 66  static int rbuVf
22660 73 53 68 6d 4c 6f 63 6b 28 73 71 6c 69 74 65 33  sShmLock(sqlite3
22670 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e  _file *pFile, in
22680 74 20 6f 66 73 74 2c 20 69 6e 74 20 6e 2c 20 69  t ofst, int n, i
22690 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 72 62 75  nt flags){.  rbu
226a0 5f 66 69 6c 65 20 2a 70 20 3d 20 28 72 62 75 5f  _file *p = (rbu_
226b0 66 69 6c 65 2a 29 70 46 69 6c 65 3b 0a 20 20 73  file*)pFile;.  s
226c0 71 6c 69 74 65 33 72 62 75 20 2a 70 52 62 75 20  qlite3rbu *pRbu 
226d0 3d 20 70 2d 3e 70 52 62 75 3b 0a 20 20 69 6e 74  = p->pRbu;.  int
226e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
226f0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
22700 41 4d 41 4c 47 41 4d 41 54 49 4f 4e 0a 20 20 20  AMALGAMATION.   
22710 20 61 73 73 65 72 74 28 20 57 41 4c 5f 43 4b 50   assert( WAL_CKP
22720 54 5f 4c 4f 43 4b 3d 3d 31 20 29 3b 0a 23 65 6e  T_LOCK==1 );.#en
22730 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70  dif..  assert( p
22740 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20 28 53  ->openFlags & (S
22750 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
22760 44 42 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54  DB|SQLITE_OPEN_T
22770 45 4d 50 5f 44 42 29 20 29 3b 0a 20 20 69 66 28  EMP_DB) );.  if(
22780 20 70 52 62 75 20 26 26 20 28 70 52 62 75 2d 3e   pRbu && (pRbu->
22790 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47  eStage==RBU_STAG
227a0 45 5f 4f 41 4c 20 7c 7c 20 70 52 62 75 2d 3e 65  E_OAL || pRbu->e
227b0 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45  Stage==RBU_STAGE
227c0 5f 4d 4f 56 45 29 20 29 7b 0a 20 20 20 20 2f 2a  _MOVE) ){.    /*
227d0 20 4d 61 67 69 63 20 6e 75 6d 62 65 72 20 31 20   Magic number 1 
227e0 69 73 20 74 68 65 20 57 41 4c 5f 43 4b 50 54 5f  is the WAL_CKPT_
227f0 4c 4f 43 4b 20 6c 6f 63 6b 2e 20 50 72 65 76 65  LOCK lock. Preve
22800 6e 74 69 6e 67 20 53 51 4c 69 74 65 20 66 72 6f  nting SQLite fro
22810 6d 0a 20 20 20 20 2a 2a 20 74 61 6b 69 6e 67 20  m.    ** taking 
22820 74 68 69 73 20 6c 6f 63 6b 20 61 6c 73 6f 20 70  this lock also p
22830 72 65 76 65 6e 74 73 20 61 6e 79 20 63 68 65 63  revents any chec
22840 6b 70 6f 69 6e 74 73 20 66 72 6f 6d 20 6f 63 63  kpoints from occ
22850 75 72 72 69 6e 67 2e 20 0a 20 20 20 20 2a 2a 20  urring. .    ** 
22860 74 6f 64 6f 3a 20 72 65 61 6c 6c 79 2c 20 69 74  todo: really, it
22870 27 73 20 6e 6f 74 20 63 6c 65 61 72 20 77 68 79  's not clear why
22880 20 74 68 69 73 20 6d 69 67 68 74 20 6f 63 63 75   this might occu
22890 72 2c 20 61 73 20 0a 20 20 20 20 2a 2a 20 77 61  r, as .    ** wa
228a0 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74  l_autocheckpoint
228b0 20 6f 75 67 68 74 20 74 6f 20 62 65 20 74 75 72   ought to be tur
228c0 6e 65 64 20 6f 66 66 2e 20 20 2a 2f 0a 20 20 20  ned off.  */.   
228d0 20 69 66 28 20 6f 66 73 74 3d 3d 57 41 4c 5f 4c   if( ofst==WAL_L
228e0 4f 43 4b 5f 43 4b 50 54 20 26 26 20 6e 3d 3d 31  OCK_CKPT && n==1
228f0 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42   ) rc = SQLITE_B
22900 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  USY;.  }else{.  
22910 20 20 69 6e 74 20 62 43 61 70 74 75 72 65 20 3d    int bCapture =
22920 20 30 3b 0a 20 20 20 20 69 66 28 20 6e 3d 3d 31   0;.    if( n==1
22930 20 26 26 20 28 66 6c 61 67 73 20 26 20 53 51 4c   && (flags & SQL
22940 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56  ITE_SHM_EXCLUSIV
22950 45 29 0a 20 20 20 20 20 26 26 20 70 52 62 75 20  E).     && pRbu 
22960 26 26 20 70 52 62 75 2d 3e 65 53 74 61 67 65 3d  && pRbu->eStage=
22970 3d 52 42 55 5f 53 54 41 47 45 5f 43 41 50 54 55  =RBU_STAGE_CAPTU
22980 52 45 0a 20 20 20 20 20 26 26 20 28 6f 66 73 74  RE.     && (ofst
22990 3d 3d 57 41 4c 5f 4c 4f 43 4b 5f 57 52 49 54 45  ==WAL_LOCK_WRITE
229a0 20 7c 7c 20 6f 66 73 74 3d 3d 57 41 4c 5f 4c 4f   || ofst==WAL_LO
229b0 43 4b 5f 43 4b 50 54 20 7c 7c 20 6f 66 73 74 3d  CK_CKPT || ofst=
229c0 3d 57 41 4c 5f 4c 4f 43 4b 5f 52 45 41 44 30 29  =WAL_LOCK_READ0)
229d0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 62 43  .    ){.      bC
229e0 61 70 74 75 72 65 20 3d 20 31 3b 0a 20 20 20 20  apture = 1;.    
229f0 7d 0a 0a 20 20 20 20 69 66 28 20 62 43 61 70 74  }..    if( bCapt
22a00 75 72 65 3d 3d 30 20 7c 7c 20 30 3d 3d 28 66 6c  ure==0 || 0==(fl
22a10 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d  ags & SQLITE_SHM
22a20 5f 55 4e 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20  _UNLOCK) ){.    
22a30 20 20 72 63 20 3d 20 70 2d 3e 70 52 65 61 6c 2d    rc = p->pReal-
22a40 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53 68 6d 4c  >pMethods->xShmL
22a50 6f 63 6b 28 70 2d 3e 70 52 65 61 6c 2c 20 6f 66  ock(p->pReal, of
22a60 73 74 2c 20 6e 2c 20 66 6c 61 67 73 29 3b 0a 20  st, n, flags);. 
22a70 20 20 20 20 20 69 66 28 20 62 43 61 70 74 75 72       if( bCaptur
22a80 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  e && rc==SQLITE_
22a90 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 52  OK ){.        pR
22aa0 62 75 2d 3e 6d 4c 6f 63 6b 20 7c 3d 20 28 31 20  bu->mLock |= (1 
22ab0 3c 3c 20 6f 66 73 74 29 3b 0a 20 20 20 20 20 20  << ofst);.      
22ac0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  }.    }.  }..  r
22ad0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
22ae0 2a 2a 20 4f 62 74 61 69 6e 20 61 20 70 6f 69 6e  ** Obtain a poin
22af0 74 65 72 20 74 6f 20 61 20 6d 61 70 70 69 6e 67  ter to a mapping
22b00 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 33 32 4b   of a single 32K
22b10 69 42 20 70 61 67 65 20 6f 66 20 74 68 65 20 2a  iB page of the *
22b20 2d 73 68 6d 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  -shm file..*/.st
22b30 61 74 69 63 20 69 6e 74 20 72 62 75 56 66 73 53  atic int rbuVfsS
22b40 68 6d 4d 61 70 28 0a 20 20 73 71 6c 69 74 65 33  hmMap(.  sqlite3
22b50 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 0a 20  _file *pFile, . 
22b60 20 69 6e 74 20 69 52 65 67 69 6f 6e 2c 20 0a 20   int iRegion, . 
22b70 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e 2c 20 0a   int szRegion, .
22b80 20 20 69 6e 74 20 69 73 57 72 69 74 65 2c 20 0a    int isWrite, .
22b90 20 20 76 6f 69 64 20 76 6f 6c 61 74 69 6c 65 20    void volatile 
22ba0 2a 2a 70 70 0a 29 7b 0a 20 20 72 62 75 5f 66 69  **pp.){.  rbu_fi
22bb0 6c 65 20 2a 70 20 3d 20 28 72 62 75 5f 66 69 6c  le *p = (rbu_fil
22bc0 65 2a 29 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20  e*)pFile;.  int 
22bd0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
22be0 20 20 69 6e 74 20 65 53 74 61 67 65 20 3d 20 28    int eStage = (
22bf0 70 2d 3e 70 52 62 75 20 3f 20 70 2d 3e 70 52 62  p->pRbu ? p->pRb
22c00 75 2d 3e 65 53 74 61 67 65 20 3a 20 30 29 3b 0a  u->eStage : 0);.
22c10 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 20 69 6e 20  .  /* If not in 
22c20 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 2c 20 61  RBU_STAGE_OAL, a
22c30 6c 6c 6f 77 20 74 68 69 73 20 63 61 6c 6c 20 74  llow this call t
22c40 6f 20 70 61 73 73 20 74 68 72 6f 75 67 68 2e 20  o pass through. 
22c50 4f 72 2c 20 69 66 20 74 68 69 73 0a 20 20 2a 2a  Or, if this.  **
22c60 20 72 62 75 20 69 73 20 69 6e 20 74 68 65 20 52   rbu is in the R
22c70 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20 73 74 61  BU_STAGE_OAL sta
22c80 74 65 2c 20 75 73 65 20 68 65 61 70 20 6d 65 6d  te, use heap mem
22c90 6f 72 79 20 66 6f 72 20 2a 2d 73 68 6d 20 73 70  ory for *-shm sp
22ca0 61 63 65 20 0a 20 20 2a 2a 20 69 6e 73 74 65 61  ace .  ** instea
22cb0 64 20 6f 66 20 61 20 66 69 6c 65 20 6f 6e 20 64  d of a file on d
22cc0 69 73 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  isk.  */.  asser
22cd0 74 28 20 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20  t( p->openFlags 
22ce0 26 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  & (SQLITE_OPEN_M
22cf0 41 49 4e 5f 44 42 7c 53 51 4c 49 54 45 5f 4f 50  AIN_DB|SQLITE_OP
22d00 45 4e 5f 54 45 4d 50 5f 44 42 29 20 29 3b 0a 20  EN_TEMP_DB) );. 
22d10 20 69 66 28 20 65 53 74 61 67 65 3d 3d 52 42 55   if( eStage==RBU
22d20 5f 53 54 41 47 45 5f 4f 41 4c 20 7c 7c 20 65 53  _STAGE_OAL || eS
22d30 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f  tage==RBU_STAGE_
22d40 4d 4f 56 45 20 29 7b 0a 20 20 20 20 69 66 28 20  MOVE ){.    if( 
22d50 69 52 65 67 69 6f 6e 3c 3d 70 2d 3e 6e 53 68 6d  iRegion<=p->nShm
22d60 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42   ){.      int nB
22d70 79 74 65 20 3d 20 28 69 52 65 67 69 6f 6e 2b 31  yte = (iRegion+1
22d80 29 20 2a 20 73 69 7a 65 6f 66 28 63 68 61 72 2a  ) * sizeof(char*
22d90 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 2a  );.      char **
22da0 61 70 4e 65 77 20 3d 20 28 63 68 61 72 2a 2a 29  apNew = (char**)
22db0 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 36  sqlite3_realloc6
22dc0 34 28 70 2d 3e 61 70 53 68 6d 2c 20 6e 42 79 74  4(p->apShm, nByt
22dd0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 70  e);.      if( ap
22de0 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
22df0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
22e00 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  MEM;.      }else
22e10 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  {.        memset
22e20 28 26 61 70 4e 65 77 5b 70 2d 3e 6e 53 68 6d 5d  (&apNew[p->nShm]
22e30 2c 20 30 2c 20 73 69 7a 65 6f 66 28 63 68 61 72  , 0, sizeof(char
22e40 2a 29 20 2a 20 28 31 20 2b 20 69 52 65 67 69 6f  *) * (1 + iRegio
22e50 6e 20 2d 20 70 2d 3e 6e 53 68 6d 29 29 3b 0a 20  n - p->nShm));. 
22e60 20 20 20 20 20 20 20 70 2d 3e 61 70 53 68 6d 20         p->apShm 
22e70 3d 20 61 70 4e 65 77 3b 0a 20 20 20 20 20 20 20  = apNew;.       
22e80 20 70 2d 3e 6e 53 68 6d 20 3d 20 69 52 65 67 69   p->nShm = iRegi
22e90 6f 6e 2b 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  on+1;.      }.  
22ea0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d    }..    if( rc=
22eb0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d  =SQLITE_OK && p-
22ec0 3e 61 70 53 68 6d 5b 69 52 65 67 69 6f 6e 5d 3d  >apShm[iRegion]=
22ed0 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  =0 ){.      char
22ee0 20 2a 70 4e 65 77 20 3d 20 28 63 68 61 72 2a 29   *pNew = (char*)
22ef0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
22f00 28 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20  (szRegion);.    
22f10 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b    if( pNew==0 ){
22f20 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
22f30 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
22f40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
22f50 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c   memset(pNew, 0,
22f60 20 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20   szRegion);.    
22f70 20 20 20 20 70 2d 3e 61 70 53 68 6d 5b 69 52 65      p->apShm[iRe
22f80 67 69 6f 6e 5d 20 3d 20 70 4e 65 77 3b 0a 20 20  gion] = pNew;.  
22f90 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
22fa0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
22fb0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 20  OK ){.      *pp 
22fc0 3d 20 70 2d 3e 61 70 53 68 6d 5b 69 52 65 67 69  = p->apShm[iRegi
22fd0 6f 6e 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  on];.    }else{.
22fe0 20 20 20 20 20 20 2a 70 70 20 3d 20 30 3b 0a 20        *pp = 0;. 
22ff0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
23000 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 70 53    assert( p->apS
23010 68 6d 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20  hm==0 );.    rc 
23020 3d 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74  = p->pReal->pMet
23030 68 6f 64 73 2d 3e 78 53 68 6d 4d 61 70 28 70 2d  hods->xShmMap(p-
23040 3e 70 52 65 61 6c 2c 20 69 52 65 67 69 6f 6e 2c  >pReal, iRegion,
23050 20 73 7a 52 65 67 69 6f 6e 2c 20 69 73 57 72 69   szRegion, isWri
23060 74 65 2c 20 70 70 29 3b 0a 20 20 7d 0a 0a 20 20  te, pp);.  }..  
23070 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
23080 0a 2a 2a 20 4d 65 6d 6f 72 79 20 62 61 72 72 69  .** Memory barri
23090 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
230a0 69 64 20 72 62 75 56 66 73 53 68 6d 42 61 72 72  id rbuVfsShmBarr
230b0 69 65 72 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ier(sqlite3_file
230c0 20 2a 70 46 69 6c 65 29 7b 0a 20 20 72 62 75 5f   *pFile){.  rbu_
230d0 66 69 6c 65 20 2a 70 20 3d 20 28 72 62 75 5f 66  file *p = (rbu_f
230e0 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 70  ile *)pFile;.  p
230f0 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64  ->pReal->pMethod
23100 73 2d 3e 78 53 68 6d 42 61 72 72 69 65 72 28 70  s->xShmBarrier(p
23110 2d 3e 70 52 65 61 6c 29 3b 0a 7d 0a 0a 2f 2a 0a  ->pReal);.}../*.
23120 2a 2a 20 54 68 65 20 78 53 68 6d 55 6e 6d 61 70  ** The xShmUnmap
23130 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74   method..*/.stat
23140 69 63 20 69 6e 74 20 72 62 75 56 66 73 53 68 6d  ic int rbuVfsShm
23150 55 6e 6d 61 70 28 73 71 6c 69 74 65 33 5f 66 69  Unmap(sqlite3_fi
23160 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20 64  le *pFile, int d
23170 65 6c 46 6c 61 67 29 7b 0a 20 20 72 62 75 5f 66  elFlag){.  rbu_f
23180 69 6c 65 20 2a 70 20 3d 20 28 72 62 75 5f 66 69  ile *p = (rbu_fi
23190 6c 65 2a 29 70 46 69 6c 65 3b 0a 20 20 69 6e 74  le*)pFile;.  int
231a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
231b0 0a 20 20 69 6e 74 20 65 53 74 61 67 65 20 3d 20  .  int eStage = 
231c0 28 70 2d 3e 70 52 62 75 20 3f 20 70 2d 3e 70 52  (p->pRbu ? p->pR
231d0 62 75 2d 3e 65 53 74 61 67 65 20 3a 20 30 29 3b  bu->eStage : 0);
231e0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f  ..  assert( p->o
231f0 70 65 6e 46 6c 61 67 73 20 26 20 28 53 51 4c 49  penFlags & (SQLI
23200 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 7c  TE_OPEN_MAIN_DB|
23210 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
23220 5f 44 42 29 20 29 3b 0a 20 20 69 66 28 20 65 53  _DB) );.  if( eS
23230 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f  tage==RBU_STAGE_
23240 4f 41 4c 20 7c 7c 20 65 53 74 61 67 65 3d 3d 52  OAL || eStage==R
23250 42 55 5f 53 54 41 47 45 5f 4d 4f 56 45 20 29 7b  BU_STAGE_MOVE ){
23260 0a 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f  .    /* no-op */
23270 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
23280 20 52 65 6c 65 61 73 65 20 74 68 65 20 63 68 65   Release the che
23290 63 6b 70 6f 69 6e 74 65 72 20 61 6e 64 20 77 72  ckpointer and wr
232a0 69 74 65 72 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20  iter locks */.  
232b0 20 20 72 62 75 55 6e 6c 6f 63 6b 53 68 6d 28 70    rbuUnlockShm(p
232c0 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 2d 3e 70  );.    rc = p->p
232d0 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e  Real->pMethods->
232e0 78 53 68 6d 55 6e 6d 61 70 28 70 2d 3e 70 52 65  xShmUnmap(p->pRe
232f0 61 6c 2c 20 64 65 6c 46 6c 61 67 29 3b 0a 20 20  al, delFlag);.  
23300 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
23310 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68  ../*.** Given th
23320 61 74 20 7a 57 61 6c 20 70 6f 69 6e 74 73 20 74  at zWal points t
23330 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61  o a buffer conta
23340 69 6e 69 6e 67 20 61 20 77 61 6c 20 66 69 6c 65  ining a wal file
23350 20 6e 61 6d 65 20 70 61 73 73 65 64 20 74 6f 20   name passed to 
23360 0a 2a 2a 20 65 69 74 68 65 72 20 74 68 65 20 78  .** either the x
23370 4f 70 65 6e 28 29 20 6f 72 20 78 41 63 63 65 73  Open() or xAcces
23380 73 28 29 20 56 46 53 20 6d 65 74 68 6f 64 2c 20  s() VFS method, 
23390 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
233a0 20 74 6f 20 74 68 65 0a 2a 2a 20 66 69 6c 65 2d   to the.** file-
233b0 68 61 6e 64 6c 65 20 6f 70 65 6e 65 64 20 62 79  handle opened by
233c0 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61   the same databa
233d0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 6e  se connection on
233e0 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
233f0 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66  ng.** database f
23400 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 72  ile..*/.static r
23410 62 75 5f 66 69 6c 65 20 2a 72 62 75 46 69 6e 64  bu_file *rbuFind
23420 4d 61 69 6e 64 62 28 72 62 75 5f 76 66 73 20 2a  Maindb(rbu_vfs *
23430 70 52 62 75 56 66 73 2c 20 63 6f 6e 73 74 20 63  pRbuVfs, const c
23440 68 61 72 20 2a 7a 57 61 6c 29 7b 0a 20 20 72 62  har *zWal){.  rb
23450 75 5f 66 69 6c 65 20 2a 70 44 62 3b 0a 20 20 73  u_file *pDb;.  s
23460 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
23470 65 72 28 70 52 62 75 56 66 73 2d 3e 6d 75 74 65  er(pRbuVfs->mute
23480 78 29 3b 0a 20 20 66 6f 72 28 70 44 62 3d 70 52  x);.  for(pDb=pR
23490 62 75 56 66 73 2d 3e 70 4d 61 69 6e 3b 20 70 44  buVfs->pMain; pD
234a0 62 20 26 26 20 70 44 62 2d 3e 7a 57 61 6c 21 3d  b && pDb->zWal!=
234b0 7a 57 61 6c 3b 20 70 44 62 3d 70 44 62 2d 3e 70  zWal; pDb=pDb->p
234c0 4d 61 69 6e 4e 65 78 74 29 7b 7d 0a 20 20 73 71  MainNext){}.  sq
234d0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
234e0 65 28 70 52 62 75 56 66 73 2d 3e 6d 75 74 65 78  e(pRbuVfs->mutex
234f0 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 44 62 3b  );.  return pDb;
23500 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 41 20 6d 61 69  .}../* .** A mai
23510 6e 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 64  n database named
23520 20 7a 4e 61 6d 65 20 68 61 73 20 6a 75 73 74 20   zName has just 
23530 62 65 65 6e 20 6f 70 65 6e 65 64 2e 20 54 68 65  been opened. The
23540 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20 66   following .** f
23550 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
23560 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 62  a pointer to a b
23570 75 66 66 65 72 20 6f 77 6e 65 64 20 62 79 20 53  uffer owned by S
23580 51 4c 69 74 65 20 74 68 61 74 20 63 6f 6e 74 61  QLite that conta
23590 69 6e 73 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20  ins.** the name 
235a0 6f 66 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c  of the *-wal fil
235b0 65 20 74 68 69 73 20 64 62 20 63 6f 6e 6e 65 63  e this db connec
235c0 74 69 6f 6e 20 77 69 6c 6c 20 75 73 65 2e 20 53  tion will use. S
235d0 51 4c 69 74 65 0a 2a 2a 20 68 61 70 70 65 6e 73  QLite.** happens
235e0 20 74 6f 20 70 61 73 73 20 61 20 70 6f 69 6e 74   to pass a point
235f0 65 72 20 74 6f 20 74 68 69 73 20 62 75 66 66 65  er to this buffe
23600 72 20 77 68 65 6e 20 75 73 69 6e 67 20 78 41 63  r when using xAc
23610 63 65 73 73 28 29 0a 2a 2a 20 6f 72 20 78 4f 70  cess().** or xOp
23620 65 6e 28 29 20 74 6f 20 6f 70 65 72 61 74 65 20  en() to operate 
23630 6f 6e 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c  on the *-wal fil
23640 65 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 63  e.  .*/.static c
23650 6f 6e 73 74 20 63 68 61 72 20 2a 72 62 75 4d 61  onst char *rbuMa
23660 69 6e 54 6f 57 61 6c 28 63 6f 6e 73 74 20 63 68  inToWal(const ch
23670 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 66  ar *zName, int f
23680 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 20 3d  lags){.  int n =
23690 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 4e 61   (int)strlen(zNa
236a0 6d 65 29 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  me);.  const cha
236b0 72 20 2a 7a 20 3d 20 26 7a 4e 61 6d 65 5b 6e 5d  r *z = &zName[n]
236c0 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20  ;.  if( flags & 
236d0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 20  SQLITE_OPEN_URI 
236e0 29 7b 0a 20 20 20 20 69 6e 74 20 6f 64 64 20 3d  ){.    int odd =
236f0 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 31   0;.    while( 1
23700 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b   ){.      if( z[
23710 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  0]==0 ){.       
23720 20 6f 64 64 20 3d 20 31 20 2d 20 6f 64 64 3b 0a   odd = 1 - odd;.
23730 20 20 20 20 20 20 20 20 69 66 28 20 6f 64 64 20          if( odd 
23740 26 26 20 7a 5b 31 5d 3d 3d 30 20 29 20 62 72 65  && z[1]==0 ) bre
23750 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
23760 20 20 7a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20    z++;.    }.   
23770 20 7a 20 2b 3d 20 32 3b 0a 20 20 7d 65 6c 73 65   z += 2;.  }else
23780 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 2a 7a 3d  {.    while( *z=
23790 3d 30 20 29 20 7a 2b 2b 3b 0a 20 20 7d 0a 20 20  =0 ) z++;.  }.  
237a0 7a 20 2b 3d 20 28 6e 20 2b 20 38 20 2b 20 31 29  z += (n + 8 + 1)
237b0 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a  ;.  return z;.}.
237c0 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 6e 20 72  ./*.** Open an r
237d0 62 75 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a  bu file handle..
237e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62  */.static int rb
237f0 75 56 66 73 4f 70 65 6e 28 0a 20 20 73 71 6c 69  uVfsOpen(.  sqli
23800 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 0a 20  te3_vfs *pVfs,. 
23810 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
23820 6d 65 2c 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  me,.  sqlite3_fi
23830 6c 65 20 2a 70 46 69 6c 65 2c 0a 20 20 69 6e 74  le *pFile,.  int
23840 20 66 6c 61 67 73 2c 0a 20 20 69 6e 74 20 2a 70   flags,.  int *p
23850 4f 75 74 46 6c 61 67 73 0a 29 7b 0a 20 20 73 74  OutFlags.){.  st
23860 61 74 69 63 20 73 71 6c 69 74 65 33 5f 69 6f 5f  atic sqlite3_io_
23870 6d 65 74 68 6f 64 73 20 72 62 75 76 66 73 5f 69  methods rbuvfs_i
23880 6f 5f 6d 65 74 68 6f 64 73 20 3d 20 7b 0a 20 20  o_methods = {.  
23890 20 20 32 2c 20 20 20 20 20 20 20 20 20 20 20 20    2,            
238a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
238b0 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20  /* iVersion */. 
238c0 20 20 20 72 62 75 56 66 73 43 6c 6f 73 65 2c 20     rbuVfsClose, 
238d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
238e0 20 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f 0a 20 20   /* xClose */.  
238f0 20 20 72 62 75 56 66 73 52 65 61 64 2c 20 20 20    rbuVfsRead,   
23900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23910 2f 2a 20 78 52 65 61 64 20 2a 2f 0a 20 20 20 20  /* xRead */.    
23920 72 62 75 56 66 73 57 72 69 74 65 2c 20 20 20 20  rbuVfsWrite,    
23930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23940 20 78 57 72 69 74 65 20 2a 2f 0a 20 20 20 20 72   xWrite */.    r
23950 62 75 56 66 73 54 72 75 6e 63 61 74 65 2c 20 20  buVfsTruncate,  
23960 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23970 78 54 72 75 6e 63 61 74 65 20 2a 2f 0a 20 20 20  xTruncate */.   
23980 20 72 62 75 56 66 73 53 79 6e 63 2c 20 20 20 20   rbuVfsSync,    
23990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
239a0 2a 20 78 53 79 6e 63 20 2a 2f 0a 20 20 20 20 72  * xSync */.    r
239b0 62 75 56 66 73 46 69 6c 65 53 69 7a 65 2c 20 20  buVfsFileSize,  
239c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
239d0 78 46 69 6c 65 53 69 7a 65 20 2a 2f 0a 20 20 20  xFileSize */.   
239e0 20 72 62 75 56 66 73 4c 6f 63 6b 2c 20 20 20 20   rbuVfsLock,    
239f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23a00 2a 20 78 4c 6f 63 6b 20 2a 2f 0a 20 20 20 20 72  * xLock */.    r
23a10 62 75 56 66 73 55 6e 6c 6f 63 6b 2c 20 20 20 20  buVfsUnlock,    
23a20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23a30 78 55 6e 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 72  xUnlock */.    r
23a40 62 75 56 66 73 43 68 65 63 6b 52 65 73 65 72 76  buVfsCheckReserv
23a50 65 64 4c 6f 63 6b 2c 20 20 20 20 20 20 2f 2a 20  edLock,      /* 
23a60 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
23a70 63 6b 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73  ck */.    rbuVfs
23a80 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20 20 20 20  FileControl,    
23a90 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65          /* xFile
23aa0 43 6f 6e 74 72 6f 6c 20 2a 2f 0a 20 20 20 20 72  Control */.    r
23ab0 62 75 56 66 73 53 65 63 74 6f 72 53 69 7a 65 2c  buVfsSectorSize,
23ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23ad0 78 53 65 63 74 6f 72 53 69 7a 65 20 2a 2f 0a 20  xSectorSize */. 
23ae0 20 20 20 72 62 75 56 66 73 44 65 76 69 63 65 43     rbuVfsDeviceC
23af0 68 61 72 61 63 74 65 72 69 73 74 69 63 73 2c 20  haracteristics, 
23b00 20 2f 2a 20 78 44 65 76 69 63 65 43 68 61 72 61   /* xDeviceChara
23b10 63 74 65 72 69 73 74 69 63 73 20 2a 2f 0a 20 20  cteristics */.  
23b20 20 20 72 62 75 56 66 73 53 68 6d 4d 61 70 2c 20    rbuVfsShmMap, 
23b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b40 2f 2a 20 78 53 68 6d 4d 61 70 20 2a 2f 0a 20 20  /* xShmMap */.  
23b50 20 20 72 62 75 56 66 73 53 68 6d 4c 6f 63 6b 2c    rbuVfsShmLock,
23b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b70 2f 2a 20 78 53 68 6d 4c 6f 63 6b 20 2a 2f 0a 20  /* xShmLock */. 
23b80 20 20 20 72 62 75 56 66 73 53 68 6d 42 61 72 72     rbuVfsShmBarr
23b90 69 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ier,            
23ba0 20 2f 2a 20 78 53 68 6d 42 61 72 72 69 65 72 20   /* xShmBarrier 
23bb0 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 53 68 6d  */.    rbuVfsShm
23bc0 55 6e 6d 61 70 2c 20 20 20 20 20 20 20 20 20 20  Unmap,          
23bd0 20 20 20 20 20 2f 2a 20 78 53 68 6d 55 6e 6d 61       /* xShmUnma
23be0 70 20 2a 2f 0a 20 20 20 20 30 2c 20 30 20 20 20  p */.    0, 0   
23bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c00 20 20 20 20 20 20 20 2f 2a 20 78 46 65 74 63 68         /* xFetch
23c10 2c 20 78 55 6e 66 65 74 63 68 20 2a 2f 0a 20 20  , xUnfetch */.  
23c20 7d 3b 0a 20 20 72 62 75 5f 76 66 73 20 2a 70 52  };.  rbu_vfs *pR
23c30 62 75 56 66 73 20 3d 20 28 72 62 75 5f 76 66 73  buVfs = (rbu_vfs
23c40 2a 29 70 56 66 73 3b 0a 20 20 73 71 6c 69 74 65  *)pVfs;.  sqlite
23c50 33 5f 76 66 73 20 2a 70 52 65 61 6c 56 66 73 20  3_vfs *pRealVfs 
23c60 3d 20 70 52 62 75 56 66 73 2d 3e 70 52 65 61 6c  = pRbuVfs->pReal
23c70 56 66 73 3b 0a 20 20 72 62 75 5f 66 69 6c 65 20  Vfs;.  rbu_file 
23c80 2a 70 46 64 20 3d 20 28 72 62 75 5f 66 69 6c 65  *pFd = (rbu_file
23c90 20 2a 29 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20   *)pFile;.  int 
23ca0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
23cb0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f    const char *zO
23cc0 70 65 6e 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 69  pen = zName;.  i
23cd0 6e 74 20 6f 66 6c 61 67 73 20 3d 20 66 6c 61 67  nt oflags = flag
23ce0 73 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 70 46 64  s;..  memset(pFd
23cf0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 72 62 75 5f  , 0, sizeof(rbu_
23d00 66 69 6c 65 29 29 3b 0a 20 20 70 46 64 2d 3e 70  file));.  pFd->p
23d10 52 65 61 6c 20 3d 20 28 73 71 6c 69 74 65 33 5f  Real = (sqlite3_
23d20 66 69 6c 65 2a 29 26 70 46 64 5b 31 5d 3b 0a 20  file*)&pFd[1];. 
23d30 20 70 46 64 2d 3e 70 52 62 75 56 66 73 20 3d 20   pFd->pRbuVfs = 
23d40 70 52 62 75 56 66 73 3b 0a 20 20 70 46 64 2d 3e  pRbuVfs;.  pFd->
23d50 6f 70 65 6e 46 6c 61 67 73 20 3d 20 66 6c 61 67  openFlags = flag
23d60 73 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 29  s;.  if( zName )
23d70 7b 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73 20  {.    if( flags 
23d80 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  & SQLITE_OPEN_MA
23d90 49 4e 5f 44 42 20 29 7b 0a 20 20 20 20 20 20 2f  IN_DB ){.      /
23da0 2a 20 41 20 6d 61 69 6e 20 64 61 74 61 62 61 73  * A main databas
23db0 65 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  e has just been 
23dc0 6f 70 65 6e 65 64 2e 20 54 68 65 20 66 6f 6c 6c  opened. The foll
23dd0 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 73 65 74 73  owing block sets
23de0 0a 20 20 20 20 20 20 2a 2a 20 28 70 46 64 2d 3e  .      ** (pFd->
23df0 7a 57 61 6c 29 20 74 6f 20 70 6f 69 6e 74 20 74  zWal) to point t
23e00 6f 20 61 20 62 75 66 66 65 72 20 6f 77 6e 65 64  o a buffer owned
23e10 20 62 79 20 53 51 4c 69 74 65 20 74 68 61 74 20   by SQLite that 
23e20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20 20 2a  contains.      *
23e30 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  * the name of th
23e40 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 74 68 69  e *-wal file thi
23e50 73 20 64 62 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  s db connection 
23e60 77 69 6c 6c 20 75 73 65 2e 20 53 51 4c 69 74 65  will use. SQLite
23e70 0a 20 20 20 20 20 20 2a 2a 20 68 61 70 70 65 6e  .      ** happen
23e80 73 20 74 6f 20 70 61 73 73 20 61 20 70 6f 69 6e  s to pass a poin
23e90 74 65 72 20 74 6f 20 74 68 69 73 20 62 75 66 66  ter to this buff
23ea0 65 72 20 77 68 65 6e 20 75 73 69 6e 67 20 78 41  er when using xA
23eb0 63 63 65 73 73 28 29 0a 20 20 20 20 20 20 2a 2a  ccess().      **
23ec0 20 6f 72 20 78 4f 70 65 6e 28 29 20 74 6f 20 6f   or xOpen() to o
23ed0 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 2a 2d  perate on the *-
23ee0 77 61 6c 20 66 69 6c 65 2e 20 20 2a 2f 0a 20 20  wal file.  */.  
23ef0 20 20 20 20 70 46 64 2d 3e 7a 57 61 6c 20 3d 20      pFd->zWal = 
23f00 72 62 75 4d 61 69 6e 54 6f 57 61 6c 28 7a 4e 61  rbuMainToWal(zNa
23f10 6d 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  me, flags);.    
23f20 7d 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 66  }.    else if( f
23f30 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
23f40 45 4e 5f 57 41 4c 20 29 7b 0a 20 20 20 20 20 20  EN_WAL ){.      
23f50 72 62 75 5f 66 69 6c 65 20 2a 70 44 62 20 3d 20  rbu_file *pDb = 
23f60 72 62 75 46 69 6e 64 4d 61 69 6e 64 62 28 70 52  rbuFindMaindb(pR
23f70 62 75 56 66 73 2c 20 7a 4e 61 6d 65 29 3b 0a 20  buVfs, zName);. 
23f80 20 20 20 20 20 69 66 28 20 70 44 62 20 29 7b 0a       if( pDb ){.
23f90 20 20 20 20 20 20 20 20 69 66 28 20 70 44 62 2d          if( pDb-
23fa0 3e 70 52 62 75 20 26 26 20 70 44 62 2d 3e 70 52  >pRbu && pDb->pR
23fb0 62 75 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f  bu->eStage==RBU_
23fc0 53 54 41 47 45 5f 4f 41 4c 20 29 7b 0a 20 20 20  STAGE_OAL ){.   
23fd0 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63         /* This c
23fe0 61 6c 6c 20 69 73 20 74 6f 20 6f 70 65 6e 20 61  all is to open a
23ff0 20 2a 2d 77 61 6c 20 66 69 6c 65 2e 20 49 6e 74   *-wal file. Int
24000 65 61 64 2c 20 6f 70 65 6e 20 74 68 65 20 2a 2d  ead, open the *-
24010 6f 61 6c 2e 20 54 68 69 73 0a 20 20 20 20 20 20  oal. This.      
24020 20 20 20 20 2a 2a 20 63 6f 64 65 20 65 6e 73 75      ** code ensu
24030 72 65 73 20 74 68 61 74 20 74 68 65 20 73 74 72  res that the str
24040 69 6e 67 20 70 61 73 73 65 64 20 74 6f 20 78 4f  ing passed to xO
24050 70 65 6e 28 29 20 69 73 20 74 65 72 6d 69 6e 61  pen() is termina
24060 74 65 64 20 62 79 20 61 0a 20 20 20 20 20 20 20  ted by a.       
24070 20 20 20 2a 2a 20 70 61 69 72 20 6f 66 20 27 5c     ** pair of '\
24080 30 27 20 62 79 74 65 73 20 69 6e 20 63 61 73 65  0' bytes in case
24090 20 74 68 65 20 56 46 53 20 61 74 74 65 6d 70 74   the VFS attempt
240a0 73 20 74 6f 20 65 78 74 72 61 63 74 20 61 20 55  s to extract a U
240b0 52 49 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  RI .          **
240c0 20 70 61 72 61 6d 65 74 65 72 20 66 72 6f 6d 20   parameter from 
240d0 69 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  it.  */.        
240e0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42    const char *zB
240f0 61 73 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20  ase = zName;.   
24100 20 20 20 20 20 20 20 73 69 7a 65 5f 74 20 6e 43         size_t nC
24110 6f 70 79 3b 0a 20 20 20 20 20 20 20 20 20 20 63  opy;.          c
24120 68 61 72 20 2a 7a 43 6f 70 79 3b 0a 20 20 20 20  har *zCopy;.    
24130 20 20 20 20 20 20 69 66 28 20 72 62 75 49 73 56        if( rbuIsV
24140 61 63 75 75 6d 28 70 44 62 2d 3e 70 52 62 75 29  acuum(pDb->pRbu)
24150 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
24160 7a 42 61 73 65 20 3d 20 73 71 6c 69 74 65 33 5f  zBase = sqlite3_
24170 64 62 5f 66 69 6c 65 6e 61 6d 65 28 70 44 62 2d  db_filename(pDb-
24180 3e 70 52 62 75 2d 3e 64 62 52 62 75 2c 20 22 6d  >pRbu->dbRbu, "m
24190 61 69 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 20  ain");.         
241a0 20 20 20 7a 42 61 73 65 20 3d 20 72 62 75 4d 61     zBase = rbuMa
241b0 69 6e 54 6f 57 61 6c 28 7a 42 61 73 65 2c 20 53  inToWal(zBase, S
241c0 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29 3b  QLITE_OPEN_URI);
241d0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
241e0 20 20 20 20 20 20 20 6e 43 6f 70 79 20 3d 20 73         nCopy = s
241f0 74 72 6c 65 6e 28 7a 42 61 73 65 29 3b 0a 20 20  trlen(zBase);.  
24200 20 20 20 20 20 20 20 20 7a 43 6f 70 79 20 3d 20          zCopy = 
24210 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
24220 28 6e 43 6f 70 79 2b 32 29 3b 0a 20 20 20 20 20  (nCopy+2);.     
24230 20 20 20 20 20 69 66 28 20 7a 43 6f 70 79 20 29       if( zCopy )
24240 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  {.            me
24250 6d 63 70 79 28 7a 43 6f 70 79 2c 20 7a 42 61 73  mcpy(zCopy, zBas
24260 65 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20  e, nCopy);.     
24270 20 20 20 20 20 20 20 7a 43 6f 70 79 5b 6e 43 6f         zCopy[nCo
24280 70 79 2d 33 5d 20 3d 20 27 6f 27 3b 0a 20 20 20  py-3] = 'o';.   
24290 20 20 20 20 20 20 20 20 20 7a 43 6f 70 79 5b 6e           zCopy[n
242a0 43 6f 70 79 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  Copy] = '\0';.  
242b0 20 20 20 20 20 20 20 20 20 20 7a 43 6f 70 79 5b            zCopy[
242c0 6e 43 6f 70 79 2b 31 5d 20 3d 20 27 5c 30 27 3b  nCopy+1] = '\0';
242d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 4f 70  .            zOp
242e0 65 6e 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  en = (const char
242f0 2a 29 28 70 46 64 2d 3e 7a 44 65 6c 20 3d 20 7a  *)(pFd->zDel = z
24300 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 20 20 20  Copy);.         
24310 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
24320 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
24330 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20  NOMEM;.         
24340 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 46 64   }.          pFd
24350 2d 3e 70 52 62 75 20 3d 20 70 44 62 2d 3e 70 52  ->pRbu = pDb->pR
24360 62 75 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  bu;.        }.  
24370 20 20 20 20 20 20 70 44 62 2d 3e 70 57 61 6c 46        pDb->pWalF
24380 64 20 3d 20 70 46 64 3b 0a 20 20 20 20 20 20 7d  d = pFd;.      }
24390 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
243a0 20 20 20 20 70 46 64 2d 3e 70 52 62 75 20 3d 20      pFd->pRbu = 
243b0 70 52 62 75 56 66 73 2d 3e 70 52 62 75 3b 0a 20  pRbuVfs->pRbu;. 
243c0 20 7d 0a 0a 20 20 69 66 28 20 6f 66 6c 61 67 73   }..  if( oflags
243d0 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d   & SQLITE_OPEN_M
243e0 41 49 4e 5f 44 42 20 0a 20 20 20 26 26 20 73 71  AIN_DB .   && sq
243f0 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61  lite3_uri_boolea
24400 6e 28 7a 4e 61 6d 65 2c 20 22 72 62 75 5f 6d 65  n(zName, "rbu_me
24410 6d 6f 72 79 22 2c 20 30 29 20 0a 20 20 29 7b 0a  mory", 0) .  ){.
24420 20 20 20 20 61 73 73 65 72 74 28 20 6f 66 6c 61      assert( ofla
24430 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
24440 5f 4d 41 49 4e 5f 44 42 20 29 3b 0a 20 20 20 20  _MAIN_DB );.    
24450 6f 66 6c 61 67 73 20 3d 20 20 53 51 4c 49 54 45  oflags =  SQLITE
24460 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20 7c 20  _OPEN_TEMP_DB | 
24470 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
24480 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f  WRITE | SQLITE_O
24490 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20 20  PEN_CREATE |.   
244a0 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
244b0 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
244c0 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44   | SQLITE_OPEN_D
244d0 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20  ELETEONCLOSE;.  
244e0 20 20 7a 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 7d    zOpen = 0;.  }
244f0 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
24500 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
24510 3d 20 70 52 65 61 6c 56 66 73 2d 3e 78 4f 70 65  = pRealVfs->xOpe
24520 6e 28 70 52 65 61 6c 56 66 73 2c 20 7a 4f 70 65  n(pRealVfs, zOpe
24530 6e 2c 20 70 46 64 2d 3e 70 52 65 61 6c 2c 20 6f  n, pFd->pReal, o
24540 66 6c 61 67 73 2c 20 70 4f 75 74 46 6c 61 67 73  flags, pOutFlags
24550 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 46 64  );.  }.  if( pFd
24560 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64  ->pReal->pMethod
24570 73 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  s ){.    /* The 
24580 78 4f 70 65 6e 28 29 20 6f 70 65 72 61 74 69 6f  xOpen() operatio
24590 6e 20 68 61 73 20 73 75 63 63 65 65 64 65 64 2e  n has succeeded.
245a0 20 53 65 74 20 74 68 65 20 73 71 6c 69 74 65 33   Set the sqlite3
245b0 5f 66 69 6c 65 2e 70 4d 65 74 68 6f 64 73 0a 20  _file.pMethods. 
245c0 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 61 6e     ** pointer an
245d0 64 2c 20 69 66 20 74 68 65 20 66 69 6c 65 20 69  d, if the file i
245e0 73 20 61 20 6d 61 69 6e 20 64 61 74 61 62 61 73  s a main databas
245f0 65 20 66 69 6c 65 2c 20 6c 69 6e 6b 20 69 74 20  e file, link it 
24600 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20  into the.    ** 
24610 6d 75 74 65 78 20 70 72 6f 74 65 63 74 65 64 20  mutex protected 
24620 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 61  linked list of a
24630 6c 6c 20 73 75 63 68 20 66 69 6c 65 73 2e 20 20  ll such files.  
24640 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70 4d  */.    pFile->pM
24650 65 74 68 6f 64 73 20 3d 20 26 72 62 75 76 66 73  ethods = &rbuvfs
24660 5f 69 6f 5f 6d 65 74 68 6f 64 73 3b 0a 20 20 20  _io_methods;.   
24670 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c   if( flags & SQL
24680 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
24690 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
246a0 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 52  3_mutex_enter(pR
246b0 62 75 56 66 73 2d 3e 6d 75 74 65 78 29 3b 0a 20  buVfs->mutex);. 
246c0 20 20 20 20 20 70 46 64 2d 3e 70 4d 61 69 6e 4e       pFd->pMainN
246d0 65 78 74 20 3d 20 70 52 62 75 56 66 73 2d 3e 70  ext = pRbuVfs->p
246e0 4d 61 69 6e 3b 0a 20 20 20 20 20 20 70 52 62 75  Main;.      pRbu
246f0 56 66 73 2d 3e 70 4d 61 69 6e 20 3d 20 70 46 64  Vfs->pMain = pFd
24700 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
24710 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 52 62 75  mutex_leave(pRbu
24720 56 66 73 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20  Vfs->mutex);.   
24730 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
24740 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46 64  sqlite3_free(pFd
24750 2d 3e 7a 44 65 6c 29 3b 0a 20 20 7d 0a 0a 20 20  ->zDel);.  }..  
24760 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
24770 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 66  .** Delete the f
24780 69 6c 65 20 6c 6f 63 61 74 65 64 20 61 74 20 7a  ile located at z
24790 50 61 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Path..*/.static 
247a0 69 6e 74 20 72 62 75 56 66 73 44 65 6c 65 74 65  int rbuVfsDelete
247b0 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
247c0 66 73 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  fs, const char *
247d0 7a 50 61 74 68 2c 20 69 6e 74 20 64 69 72 53 79  zPath, int dirSy
247e0 6e 63 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  nc){.  sqlite3_v
247f0 66 73 20 2a 70 52 65 61 6c 56 66 73 20 3d 20 28  fs *pRealVfs = (
24800 28 72 62 75 5f 76 66 73 2a 29 70 56 66 73 29 2d  (rbu_vfs*)pVfs)-
24810 3e 70 52 65 61 6c 56 66 73 3b 0a 20 20 72 65 74  >pRealVfs;.  ret
24820 75 72 6e 20 70 52 65 61 6c 56 66 73 2d 3e 78 44  urn pRealVfs->xD
24830 65 6c 65 74 65 28 70 52 65 61 6c 56 66 73 2c 20  elete(pRealVfs, 
24840 7a 50 61 74 68 2c 20 64 69 72 53 79 6e 63 29 3b  zPath, dirSync);
24850 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 66  .}../*.** Test f
24860 6f 72 20 61 63 63 65 73 73 20 70 65 72 6d 69 73  or access permis
24870 73 69 6f 6e 73 2e 20 52 65 74 75 72 6e 20 74 72  sions. Return tr
24880 75 65 20 69 66 20 74 68 65 20 72 65 71 75 65 73  ue if the reques
24890 74 65 64 20 70 65 72 6d 69 73 73 69 6f 6e 0a 2a  ted permission.*
248a0 2a 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20  * is available, 
248b0 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69  or false otherwi
248c0 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
248d0 74 20 72 62 75 56 66 73 41 63 63 65 73 73 28 0a  t rbuVfsAccess(.
248e0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
248f0 56 66 73 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68  Vfs, .  const ch
24900 61 72 20 2a 7a 50 61 74 68 2c 20 0a 20 20 69 6e  ar *zPath, .  in
24910 74 20 66 6c 61 67 73 2c 20 0a 20 20 69 6e 74 20  t flags, .  int 
24920 2a 70 52 65 73 4f 75 74 0a 29 7b 0a 20 20 72 62  *pResOut.){.  rb
24930 75 5f 76 66 73 20 2a 70 52 62 75 56 66 73 20 3d  u_vfs *pRbuVfs =
24940 20 28 72 62 75 5f 76 66 73 2a 29 70 56 66 73 3b   (rbu_vfs*)pVfs;
24950 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
24960 70 52 65 61 6c 56 66 73 20 3d 20 70 52 62 75 56  pRealVfs = pRbuV
24970 66 73 2d 3e 70 52 65 61 6c 56 66 73 3b 0a 20 20  fs->pRealVfs;.  
24980 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  int rc;..  rc = 
24990 70 52 65 61 6c 56 66 73 2d 3e 78 41 63 63 65 73  pRealVfs->xAcces
249a0 73 28 70 52 65 61 6c 56 66 73 2c 20 7a 50 61 74  s(pRealVfs, zPat
249b0 68 2c 20 66 6c 61 67 73 2c 20 70 52 65 73 4f 75  h, flags, pResOu
249c0 74 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69  t);..  /* If thi
249d0 73 20 63 61 6c 6c 20 69 73 20 74 6f 20 63 68 65  s call is to che
249e0 63 6b 20 69 66 20 61 20 2a 2d 77 61 6c 20 66 69  ck if a *-wal fi
249f0 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  le associated wi
24a00 74 68 20 61 6e 20 52 42 55 20 74 61 72 67 65 74  th an RBU target
24a10 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 63  .  ** database c
24a20 6f 6e 6e 65 63 74 69 6f 6e 20 65 78 69 73 74 73  onnection exists
24a30 2c 20 61 6e 64 20 74 68 65 20 52 42 55 20 75 70  , and the RBU up
24a40 64 61 74 65 20 69 73 20 69 6e 20 52 42 55 5f 53  date is in RBU_S
24a50 54 41 47 45 5f 4f 41 4c 2c 0a 20 20 2a 2a 20 74  TAGE_OAL,.  ** t
24a60 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 70 65  he following spe
24a70 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67 20 69 73  cial handling is
24a80 20 61 63 74 69 76 61 74 65 64 3a 0a 20 20 2a 2a   activated:.  **
24a90 0a 20 20 2a 2a 20 20 20 61 29 20 69 66 20 74 68  .  **   a) if th
24aa0 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 64 6f 65  e *-wal file doe
24ab0 73 20 65 78 69 73 74 2c 20 72 65 74 75 72 6e 20  s exist, return 
24ac0 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2e  SQLITE_CANTOPEN.
24ad0 20 54 68 69 73 0a 20 20 2a 2a 20 20 20 20 20 20   This.  **      
24ae0 65 6e 73 75 72 65 73 20 74 68 61 74 20 74 68 65  ensures that the
24af0 20 52 42 55 20 65 78 74 65 6e 73 69 6f 6e 20 6e   RBU extension n
24b00 65 76 65 72 20 74 72 69 65 73 20 74 6f 20 75 70  ever tries to up
24b10 64 61 74 65 20 61 20 64 61 74 61 62 61 73 65 0a  date a database.
24b20 20 20 2a 2a 20 20 20 20 20 20 69 6e 20 77 61 6c    **      in wal
24b30 20 6d 6f 64 65 2c 20 65 76 65 6e 20 69 66 20 74   mode, even if t
24b40 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
24b50 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
24b60 6c 65 20 68 61 73 0a 20 20 2a 2a 20 20 20 20 20  le has.  **     
24b70 20 62 65 65 6e 20 64 61 6d 61 67 65 64 2e 20 0a   been damaged. .
24b80 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 62 29 20 69    **.  **   b) i
24b90 66 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65  f the *-wal file
24ba0 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c   does not exist,
24bb0 20 63 6c 61 69 6d 20 74 68 61 74 20 69 74 20 64   claim that it d
24bc0 6f 65 73 20 61 6e 79 77 61 79 2c 0a 20 20 2a 2a  oes anyway,.  **
24bd0 20 20 20 20 20 20 63 61 75 73 69 6e 67 20 53 51        causing SQ
24be0 4c 69 74 65 20 74 6f 20 63 61 6c 6c 20 78 4f 70  Lite to call xOp
24bf0 65 6e 28 29 20 74 6f 20 6f 70 65 6e 20 69 74 2e  en() to open it.
24c00 20 54 68 69 73 20 63 61 6c 6c 20 77 69 6c 6c 20   This call will 
24c10 61 6c 73 6f 0a 20 20 2a 2a 20 20 20 20 20 20 62  also.  **      b
24c20 65 20 69 6e 74 65 72 63 65 70 74 65 64 20 28 73  e intercepted (s
24c30 65 65 20 74 68 65 20 72 62 75 56 66 73 4f 70 65  ee the rbuVfsOpe
24c40 6e 28 29 20 66 75 6e 63 74 69 6f 6e 29 20 61 6e  n() function) an
24c50 64 20 74 68 65 20 2a 2d 6f 61 6c 0a 20 20 2a 2a  d the *-oal.  **
24c60 20 20 20 20 20 20 66 69 6c 65 20 6f 70 65 6e 65        file opene
24c70 64 20 69 6e 73 74 65 61 64 2e 0a 20 20 2a 2f 0a  d instead..  */.
24c80 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
24c90 5f 4f 4b 20 26 26 20 66 6c 61 67 73 3d 3d 53 51  _OK && flags==SQ
24ca0 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
24cb0 54 53 20 29 7b 0a 20 20 20 20 72 62 75 5f 66 69  TS ){.    rbu_fi
24cc0 6c 65 20 2a 70 44 62 20 3d 20 72 62 75 46 69 6e  le *pDb = rbuFin
24cd0 64 4d 61 69 6e 64 62 28 70 52 62 75 56 66 73 2c  dMaindb(pRbuVfs,
24ce0 20 7a 50 61 74 68 29 3b 0a 20 20 20 20 69 66 28   zPath);.    if(
24cf0 20 70 44 62 20 26 26 20 70 44 62 2d 3e 70 52 62   pDb && pDb->pRb
24d00 75 20 26 26 20 70 44 62 2d 3e 70 52 62 75 2d 3e  u && pDb->pRbu->
24d10 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47  eStage==RBU_STAG
24d20 45 5f 4f 41 4c 20 29 7b 0a 20 20 20 20 20 20 69  E_OAL ){.      i
24d30 66 28 20 2a 70 52 65 73 4f 75 74 20 29 7b 0a 20  f( *pResOut ){. 
24d40 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
24d50 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 20  TE_CANTOPEN;.   
24d60 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
24d70 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
24d80 73 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  sz = 0;.        
24d90 72 63 20 3d 20 72 62 75 56 66 73 46 69 6c 65 53  rc = rbuVfsFileS
24da0 69 7a 65 28 26 70 44 62 2d 3e 62 61 73 65 2c 20  ize(&pDb->base, 
24db0 26 73 7a 29 3b 0a 20 20 20 20 20 20 20 20 2a 70  &sz);.        *p
24dc0 52 65 73 4f 75 74 20 3d 20 28 73 7a 3e 30 29 3b  ResOut = (sz>0);
24dd0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
24de0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
24df0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 75 6c 61  .}../*.** Popula
24e00 74 65 20 62 75 66 66 65 72 20 7a 4f 75 74 20 77  te buffer zOut w
24e10 69 74 68 20 74 68 65 20 66 75 6c 6c 20 63 61 6e  ith the full can
24e20 6f 6e 69 63 61 6c 20 70 61 74 68 6e 61 6d 65 20  onical pathname 
24e30 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a  corresponding.**
24e40 20 74 6f 20 74 68 65 20 70 61 74 68 6e 61 6d 65   to the pathname
24e50 20 69 6e 20 7a 50 61 74 68 2e 20 7a 4f 75 74 20   in zPath. zOut 
24e60 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
24e70 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66   point to a buff
24e80 65 72 0a 2a 2a 20 6f 66 20 61 74 20 6c 65 61 73  er.** of at leas
24e90 74 20 28 44 45 56 53 59 4d 5f 4d 41 58 5f 50 41  t (DEVSYM_MAX_PA
24ea0 54 48 4e 41 4d 45 2b 31 29 20 62 79 74 65 73 2e  THNAME+1) bytes.
24eb0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
24ec0 62 75 56 66 73 46 75 6c 6c 50 61 74 68 6e 61 6d  buVfsFullPathnam
24ed0 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  e(.  sqlite3_vfs
24ee0 20 2a 70 56 66 73 2c 20 0a 20 20 63 6f 6e 73 74   *pVfs, .  const
24ef0 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 0a 20   char *zPath, . 
24f00 20 69 6e 74 20 6e 4f 75 74 2c 20 0a 20 20 63 68   int nOut, .  ch
24f10 61 72 20 2a 7a 4f 75 74 0a 29 7b 0a 20 20 73 71  ar *zOut.){.  sq
24f20 6c 69 74 65 33 5f 76 66 73 20 2a 70 52 65 61 6c  lite3_vfs *pReal
24f30 56 66 73 20 3d 20 28 28 72 62 75 5f 76 66 73 2a  Vfs = ((rbu_vfs*
24f40 29 70 56 66 73 29 2d 3e 70 52 65 61 6c 56 66 73  )pVfs)->pRealVfs
24f50 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65 61 6c  ;.  return pReal
24f60 56 66 73 2d 3e 78 46 75 6c 6c 50 61 74 68 6e 61  Vfs->xFullPathna
24f70 6d 65 28 70 52 65 61 6c 56 66 73 2c 20 7a 50 61  me(pRealVfs, zPa
24f80 74 68 2c 20 6e 4f 75 74 2c 20 7a 4f 75 74 29 3b  th, nOut, zOut);
24f90 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
24fa0 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54  TE_OMIT_LOAD_EXT
24fb0 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 4f 70 65  ENSION./*.** Ope
24fc0 6e 20 74 68 65 20 64 79 6e 61 6d 69 63 20 6c 69  n the dynamic li
24fd0 62 72 61 72 79 20 6c 6f 63 61 74 65 64 20 61 74  brary located at
24fe0 20 7a 50 61 74 68 20 61 6e 64 20 72 65 74 75 72   zPath and retur
24ff0 6e 20 61 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73  n a handle..*/.s
25000 74 61 74 69 63 20 76 6f 69 64 20 2a 72 62 75 56  tatic void *rbuV
25010 66 73 44 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33  fsDlOpen(sqlite3
25020 5f 76 66 73 20 2a 70 56 66 73 2c 20 63 6f 6e 73  _vfs *pVfs, cons
25030 74 20 63 68 61 72 20 2a 7a 50 61 74 68 29 7b 0a  t char *zPath){.
25040 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
25050 52 65 61 6c 56 66 73 20 3d 20 28 28 72 62 75 5f  RealVfs = ((rbu_
25060 76 66 73 2a 29 70 56 66 73 29 2d 3e 70 52 65 61  vfs*)pVfs)->pRea
25070 6c 56 66 73 3b 0a 20 20 72 65 74 75 72 6e 20 70  lVfs;.  return p
25080 52 65 61 6c 56 66 73 2d 3e 78 44 6c 4f 70 65 6e  RealVfs->xDlOpen
25090 28 70 52 65 61 6c 56 66 73 2c 20 7a 50 61 74 68  (pRealVfs, zPath
250a0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 75  );.}../*.** Popu
250b0 6c 61 74 65 20 74 68 65 20 62 75 66 66 65 72 20  late the buffer 
250c0 7a 45 72 72 4d 73 67 20 28 73 69 7a 65 20 6e 42  zErrMsg (size nB
250d0 79 74 65 20 62 79 74 65 73 29 20 77 69 74 68 20  yte bytes) with 
250e0 61 20 68 75 6d 61 6e 20 72 65 61 64 61 62 6c 65  a human readable
250f0 0a 2a 2a 20 75 74 66 2d 38 20 73 74 72 69 6e 67  .** utf-8 string
25100 20 64 65 73 63 72 69 62 69 6e 67 20 74 68 65 20   describing the 
25110 6d 6f 73 74 20 72 65 63 65 6e 74 20 65 72 72 6f  most recent erro
25120 72 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 73  r encountered as
25130 73 6f 63 69 61 74 65 64 20 0a 2a 2a 20 77 69 74  sociated .** wit
25140 68 20 64 79 6e 61 6d 69 63 20 6c 69 62 72 61 72  h dynamic librar
25150 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ies..*/.static v
25160 6f 69 64 20 72 62 75 56 66 73 44 6c 45 72 72 6f  oid rbuVfsDlErro
25170 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  r(sqlite3_vfs *p
25180 56 66 73 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20  Vfs, int nByte, 
25190 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 29 7b 0a  char *zErrMsg){.
251a0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
251b0 52 65 61 6c 56 66 73 20 3d 20 28 28 72 62 75 5f  RealVfs = ((rbu_
251c0 76 66 73 2a 29 70 56 66 73 29 2d 3e 70 52 65 61  vfs*)pVfs)->pRea
251d0 6c 56 66 73 3b 0a 20 20 70 52 65 61 6c 56 66 73  lVfs;.  pRealVfs
251e0 2d 3e 78 44 6c 45 72 72 6f 72 28 70 52 65 61 6c  ->xDlError(pReal
251f0 56 66 73 2c 20 6e 42 79 74 65 2c 20 7a 45 72 72  Vfs, nByte, zErr
25200 4d 73 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Msg);.}../*.** R
25210 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
25220 74 6f 20 74 68 65 20 73 79 6d 62 6f 6c 20 7a 53  to the symbol zS
25230 79 6d 62 6f 6c 20 69 6e 20 74 68 65 20 64 79 6e  ymbol in the dyn
25240 61 6d 69 63 20 6c 69 62 72 61 72 79 20 70 48 61  amic library pHa
25250 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndle..*/.static 
25260 76 6f 69 64 20 28 2a 72 62 75 56 66 73 44 6c 53  void (*rbuVfsDlS
25270 79 6d 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  ym(.  sqlite3_vf
25280 73 20 2a 70 56 66 73 2c 20 0a 20 20 76 6f 69 64  s *pVfs, .  void
25290 20 2a 70 41 72 67 2c 20 0a 20 20 63 6f 6e 73 74   *pArg, .  const
252a0 20 63 68 61 72 20 2a 7a 53 79 6d 0a 29 29 28 76   char *zSym.))(v
252b0 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  oid){.  sqlite3_
252c0 76 66 73 20 2a 70 52 65 61 6c 56 66 73 20 3d 20  vfs *pRealVfs = 
252d0 28 28 72 62 75 5f 76 66 73 2a 29 70 56 66 73 29  ((rbu_vfs*)pVfs)
252e0 2d 3e 70 52 65 61 6c 56 66 73 3b 0a 20 20 72 65  ->pRealVfs;.  re
252f0 74 75 72 6e 20 70 52 65 61 6c 56 66 73 2d 3e 78  turn pRealVfs->x
25300 44 6c 53 79 6d 28 70 52 65 61 6c 56 66 73 2c 20  DlSym(pRealVfs, 
25310 70 41 72 67 2c 20 7a 53 79 6d 29 3b 0a 7d 0a 0a  pArg, zSym);.}..
25320 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20  /*.** Close the 
25330 64 79 6e 61 6d 69 63 20 6c 69 62 72 61 72 79 20  dynamic library 
25340 68 61 6e 64 6c 65 20 70 48 61 6e 64 6c 65 2e 0a  handle pHandle..
25350 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
25360 62 75 56 66 73 44 6c 43 6c 6f 73 65 28 73 71 6c  buVfsDlClose(sql
25370 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
25380 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65 29 7b 0a  void *pHandle){.
25390 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
253a0 52 65 61 6c 56 66 73 20 3d 20 28 28 72 62 75 5f  RealVfs = ((rbu_
253b0 76 66 73 2a 29 70 56 66 73 29 2d 3e 70 52 65 61  vfs*)pVfs)->pRea
253c0 6c 56 66 73 3b 0a 20 20 70 52 65 61 6c 56 66 73  lVfs;.  pRealVfs
253d0 2d 3e 78 44 6c 43 6c 6f 73 65 28 70 52 65 61 6c  ->xDlClose(pReal
253e0 56 66 73 2c 20 70 48 61 6e 64 6c 65 29 3b 0a 7d  Vfs, pHandle);.}
253f0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
25400 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45  E_OMIT_LOAD_EXTE
25410 4e 53 49 4f 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  NSION */../*.** 
25420 50 6f 70 75 6c 61 74 65 20 74 68 65 20 62 75 66  Populate the buf
25430 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  fer pointed to b
25440 79 20 7a 42 75 66 4f 75 74 20 77 69 74 68 20 6e  y zBufOut with n
25450 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 0a 2a  Byte bytes of .*
25460 2a 20 72 61 6e 64 6f 6d 20 64 61 74 61 2e 0a 2a  * random data..*
25470 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62 75  /.static int rbu
25480 56 66 73 52 61 6e 64 6f 6d 6e 65 73 73 28 73 71  VfsRandomness(sq
25490 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
254a0 20 69 6e 74 20 6e 42 79 74 65 2c 20 63 68 61 72   int nByte, char
254b0 20 2a 7a 42 75 66 4f 75 74 29 7b 0a 20 20 73 71   *zBufOut){.  sq
254c0 6c 69 74 65 33 5f 76 66 73 20 2a 70 52 65 61 6c  lite3_vfs *pReal
254d0 56 66 73 20 3d 20 28 28 72 62 75 5f 76 66 73 2a  Vfs = ((rbu_vfs*
254e0 29 70 56 66 73 29 2d 3e 70 52 65 61 6c 56 66 73  )pVfs)->pRealVfs
254f0 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65 61 6c  ;.  return pReal
25500 56 66 73 2d 3e 78 52 61 6e 64 6f 6d 6e 65 73 73  Vfs->xRandomness
25510 28 70 52 65 61 6c 56 66 73 2c 20 6e 42 79 74 65  (pRealVfs, nByte
25520 2c 20 7a 42 75 66 4f 75 74 29 3b 0a 7d 0a 0a 2f  , zBufOut);.}../
25530 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 6e  *.** Sleep for n
25540 4d 69 63 72 6f 20 6d 69 63 72 6f 73 65 63 6f 6e  Micro microsecon
25550 64 73 2e 20 52 65 74 75 72 6e 20 74 68 65 20 6e  ds. Return the n
25560 75 6d 62 65 72 20 6f 66 20 6d 69 63 72 6f 73 65  umber of microse
25570 63 6f 6e 64 73 20 0a 2a 2a 20 61 63 74 75 61 6c  conds .** actual
25580 6c 79 20 73 6c 65 70 74 2e 0a 2a 2f 0a 73 74 61  ly slept..*/.sta
25590 74 69 63 20 69 6e 74 20 72 62 75 56 66 73 53 6c  tic int rbuVfsSl
255a0 65 65 70 28 73 71 6c 69 74 65 33 5f 76 66 73 20  eep(sqlite3_vfs 
255b0 2a 70 56 66 73 2c 20 69 6e 74 20 6e 4d 69 63 72  *pVfs, int nMicr
255c0 6f 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  o){.  sqlite3_vf
255d0 73 20 2a 70 52 65 61 6c 56 66 73 20 3d 20 28 28  s *pRealVfs = ((
255e0 72 62 75 5f 76 66 73 2a 29 70 56 66 73 29 2d 3e  rbu_vfs*)pVfs)->
255f0 70 52 65 61 6c 56 66 73 3b 0a 20 20 72 65 74 75  pRealVfs;.  retu
25600 72 6e 20 70 52 65 61 6c 56 66 73 2d 3e 78 53 6c  rn pRealVfs->xSl
25610 65 65 70 28 70 52 65 61 6c 56 66 73 2c 20 6e 4d  eep(pRealVfs, nM
25620 69 63 72 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  icro);.}../*.** 
25630 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65  Return the curre
25640 6e 74 20 74 69 6d 65 20 61 73 20 61 20 4a 75 6c  nt time as a Jul
25650 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 69  ian Day number i
25660 6e 20 2a 70 54 69 6d 65 4f 75 74 2e 0a 2a 2f 0a  n *pTimeOut..*/.
25670 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 56 66  static int rbuVf
25680 73 43 75 72 72 65 6e 74 54 69 6d 65 28 73 71 6c  sCurrentTime(sql
25690 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
256a0 64 6f 75 62 6c 65 20 2a 70 54 69 6d 65 4f 75 74  double *pTimeOut
256b0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
256c0 20 2a 70 52 65 61 6c 56 66 73 20 3d 20 28 28 72   *pRealVfs = ((r
256d0 62 75 5f 76 66 73 2a 29 70 56 66 73 29 2d 3e 70  bu_vfs*)pVfs)->p
256e0 52 65 61 6c 56 66 73 3b 0a 20 20 72 65 74 75 72  RealVfs;.  retur
256f0 6e 20 70 52 65 61 6c 56 66 73 2d 3e 78 43 75 72  n pRealVfs->xCur
25700 72 65 6e 74 54 69 6d 65 28 70 52 65 61 6c 56 66  rentTime(pRealVf
25710 73 2c 20 70 54 69 6d 65 4f 75 74 29 3b 0a 7d 0a  s, pTimeOut);.}.
25720 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 2e 0a 2a 2f  ./*.** No-op..*/
25730 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 56  .static int rbuV
25740 66 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 73  fsGetLastError(s
25750 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
25760 2c 20 69 6e 74 20 61 2c 20 63 68 61 72 20 2a 62  , int a, char *b
25770 29 7b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  ){.  return 0;.}
25780 0a 0a 2f 2a 0a 2a 2a 20 44 65 72 65 67 69 73 74  ../*.** Deregist
25790 65 72 20 61 6e 64 20 64 65 73 74 72 6f 79 20 61  er and destroy a
257a0 6e 20 52 42 55 20 76 66 73 20 63 72 65 61 74 65  n RBU vfs create
257b0 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20  d by an earlier 
257c0 63 61 6c 6c 20 74 6f 0a 2a 2a 20 73 71 6c 69 74  call to.** sqlit
257d0 65 33 72 62 75 5f 63 72 65 61 74 65 5f 76 66 73  e3rbu_create_vfs
257e0 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
257f0 74 65 33 72 62 75 5f 64 65 73 74 72 6f 79 5f 76  te3rbu_destroy_v
25800 66 73 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  fs(const char *z
25810 4e 61 6d 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  Name){.  sqlite3
25820 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 73 71 6c  _vfs *pVfs = sql
25830 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 7a 4e  ite3_vfs_find(zN
25840 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 56 66 73  ame);.  if( pVfs
25850 20 26 26 20 70 56 66 73 2d 3e 78 4f 70 65 6e 3d   && pVfs->xOpen=
25860 3d 72 62 75 56 66 73 4f 70 65 6e 20 29 7b 0a 20  =rbuVfsOpen ){. 
25870 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
25880 5f 66 72 65 65 28 28 28 72 62 75 5f 76 66 73 2a  _free(((rbu_vfs*
25890 29 70 56 66 73 29 2d 3e 6d 75 74 65 78 29 3b 0a  )pVfs)->mutex);.
258a0 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f      sqlite3_vfs_
258b0 75 6e 72 65 67 69 73 74 65 72 28 70 56 66 73 29  unregister(pVfs)
258c0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
258d0 65 65 28 70 56 66 73 29 3b 0a 20 20 7d 0a 7d 0a  ee(pVfs);.  }.}.
258e0 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 6e  ./*.** Create an
258f0 20 52 42 55 20 56 46 53 20 6e 61 6d 65 64 20 7a   RBU VFS named z
25900 4e 61 6d 65 20 74 68 61 74 20 61 63 63 65 73 73  Name that access
25910 65 73 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  es the underlyin
25920 67 20 66 69 6c 65 2d 73 79 73 74 65 6d 0a 2a 2a  g file-system.**
25930 20 76 69 61 20 65 78 69 73 74 69 6e 67 20 56 46   via existing VF
25940 53 20 7a 50 61 72 65 6e 74 2e 20 54 68 65 20 6e  S zParent. The n
25950 65 77 20 6f 62 6a 65 63 74 20 69 73 20 72 65 67  ew object is reg
25960 69 73 74 65 72 65 64 20 61 73 20 61 20 6e 6f 6e  istered as a non
25970 2d 64 65 66 61 75 6c 74 0a 2a 2a 20 56 46 53 20  -default.** VFS 
25980 77 69 74 68 20 53 51 4c 69 74 65 20 62 65 66 6f  with SQLite befo
25990 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f  re returning..*/
259a0 0a 69 6e 74 20 73 71 6c 69 74 65 33 72 62 75 5f  .int sqlite3rbu_
259b0 63 72 65 61 74 65 5f 76 66 73 28 63 6f 6e 73 74  create_vfs(const
259c0 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f   char *zName, co
259d0 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72 65 6e  nst char *zParen
259e0 74 29 7b 0a 0a 20 20 2f 2a 20 54 65 6d 70 6c 61  t){..  /* Templa
259f0 74 65 20 66 6f 72 20 56 46 53 20 2a 2f 0a 20 20  te for VFS */.  
25a00 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 76  static sqlite3_v
25a10 66 73 20 76 66 73 5f 74 65 6d 70 6c 61 74 65 20  fs vfs_template 
25a20 3d 20 7b 0a 20 20 20 20 31 2c 20 20 20 20 20 20  = {.    1,      
25a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a40 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f        /* iVersio
25a50 6e 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20  n */.    0,     
25a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a70 20 20 20 20 20 20 20 2f 2a 20 73 7a 4f 73 46 69         /* szOsFi
25a80 6c 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20  le */.    0,    
25a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25aa0 20 20 20 20 20 20 20 20 2f 2a 20 6d 78 50 61 74          /* mxPat
25ab0 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20  hname */.    0, 
25ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25ad0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e             /* pN
25ae0 65 78 74 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20  ext */.    0,   
25af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25b00 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4e 61 6d           /* zNam
25b10 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20  e */.    0,     
25b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25b30 20 20 20 20 20 20 20 2f 2a 20 70 41 70 70 44 61         /* pAppDa
25b40 74 61 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73  ta */.    rbuVfs
25b50 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20  Open,           
25b60 20 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e          /* xOpen
25b70 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 44 65   */.    rbuVfsDe
25b80 6c 65 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  lete,           
25b90 20 20 20 20 20 20 2f 2a 20 78 44 65 6c 65 74 65        /* xDelete
25ba0 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 41 63   */.    rbuVfsAc
25bb0 63 65 73 73 2c 20 20 20 20 20 20 20 20 20 20 20  cess,           
25bc0 20 20 20 20 20 20 2f 2a 20 78 41 63 63 65 73 73        /* xAccess
25bd0 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 46 75   */.    rbuVfsFu
25be0 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20 20 20 20  llPathname,     
25bf0 20 20 20 20 20 20 2f 2a 20 78 46 75 6c 6c 50 61        /* xFullPa
25c00 74 68 6e 61 6d 65 20 2a 2f 0a 0a 23 69 66 6e 64  thname */..#ifnd
25c10 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  ef SQLITE_OMIT_L
25c20 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20  OAD_EXTENSION.  
25c30 20 20 72 62 75 56 66 73 44 6c 4f 70 65 6e 2c 20    rbuVfsDlOpen, 
25c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25c50 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f 0a 20 20  /* xDlOpen */.  
25c60 20 20 72 62 75 56 66 73 44 6c 45 72 72 6f 72 2c    rbuVfsDlError,
25c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25c80 2f 2a 20 78 44 6c 45 72 72 6f 72 20 2a 2f 0a 20  /* xDlError */. 
25c90 20 20 20 72 62 75 56 66 73 44 6c 53 79 6d 2c 20     rbuVfsDlSym, 
25ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25cb0 20 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f 0a 20 20   /* xDlSym */.  
25cc0 20 20 72 62 75 56 66 73 44 6c 43 6c 6f 73 65 2c    rbuVfsDlClose,
25cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25ce0 2f 2a 20 78 44 6c 43 6c 6f 73 65 20 2a 2f 0a 23  /* xDlClose */.#
25cf0 65 6c 73 65 0a 20 20 20 20 30 2c 20 30 2c 20 30  else.    0, 0, 0
25d00 2c 20 30 2c 0a 23 65 6e 64 69 66 0a 0a 20 20 20  , 0,.#endif..   
25d10 20 72 62 75 56 66 73 52 61 6e 64 6f 6d 6e 65 73   rbuVfsRandomnes
25d20 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  s,             /
25d30 2a 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f  * xRandomness */
25d40 0a 20 20 20 20 72 62 75 56 66 73 53 6c 65 65 70  .    rbuVfsSleep
25d50 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
25d60 20 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a 2f 0a     /* xSleep */.
25d70 20 20 20 20 72 62 75 56 66 73 43 75 72 72 65 6e      rbuVfsCurren
25d80 74 54 69 6d 65 2c 20 20 20 20 20 20 20 20 20 20  tTime,          
25d90 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d    /* xCurrentTim
25da0 65 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 47  e */.    rbuVfsG
25db0 65 74 4c 61 73 74 45 72 72 6f 72 2c 20 20 20 20  etLastError,    
25dc0 20 20 20 20 20 20 20 2f 2a 20 78 47 65 74 4c 61         /* xGetLa
25dd0 73 74 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20 30  stError */.    0
25de0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
25df0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25e00 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36  xCurrentTimeInt6
25e10 34 20 28 76 65 72 73 69 6f 6e 20 32 29 20 2a 2f  4 (version 2) */
25e20 0a 20 20 20 20 30 2c 20 30 2c 20 30 20 20 20 20  .    0, 0, 0    
25e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25e40 20 20 20 2f 2a 20 55 6e 69 6d 70 6c 65 6d 65 6e     /* Unimplemen
25e50 74 65 64 20 76 65 72 73 69 6f 6e 20 33 20 6d 65  ted version 3 me
25e60 74 68 6f 64 73 20 2a 2f 0a 20 20 7d 3b 0a 0a 20  thods */.  };.. 
25e70 20 72 62 75 5f 76 66 73 20 2a 70 4e 65 77 20 3d   rbu_vfs *pNew =
25e80 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
25e90 20 2f 2a 20 4e 65 77 6c 79 20 61 6c 6c 6f 63 61   /* Newly alloca
25ea0 74 65 64 20 56 46 53 20 2a 2f 0a 20 20 69 6e 74  ted VFS */.  int
25eb0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
25ec0 0a 20 20 73 69 7a 65 5f 74 20 6e 4e 61 6d 65 3b  .  size_t nName;
25ed0 0a 20 20 73 69 7a 65 5f 74 20 6e 42 79 74 65 3b  .  size_t nByte;
25ee0 0a 0a 20 20 6e 4e 61 6d 65 20 3d 20 73 74 72 6c  ..  nName = strl
25ef0 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 6e 42 79  en(zName);.  nBy
25f00 74 65 20 3d 20 73 69 7a 65 6f 66 28 72 62 75 5f  te = sizeof(rbu_
25f10 76 66 73 29 20 2b 20 6e 4e 61 6d 65 20 2b 20 31  vfs) + nName + 1
25f20 3b 0a 20 20 70 4e 65 77 20 3d 20 28 72 62 75 5f  ;.  pNew = (rbu_
25f30 76 66 73 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c  vfs*)sqlite3_mal
25f40 6c 6f 63 36 34 28 6e 42 79 74 65 29 3b 0a 20 20  loc64(nByte);.  
25f50 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
25f60 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
25f70 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  OMEM;.  }else{. 
25f80 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a     sqlite3_vfs *
25f90 70 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20  pParent;        
25fa0 20 20 20 2f 2a 20 50 61 72 65 6e 74 20 56 46 53     /* Parent VFS
25fb0 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 70   */.    memset(p
25fc0 4e 65 77 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a  New, 0, nByte);.
25fd0 20 20 20 20 70 50 61 72 65 6e 74 20 3d 20 73 71      pParent = sq
25fe0 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 7a  lite3_vfs_find(z
25ff0 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 69 66 28  Parent);.    if(
26000 20 70 50 61 72 65 6e 74 3d 3d 30 20 29 7b 0a 20   pParent==0 ){. 
26010 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
26020 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20 20 20 7d  _NOTFOUND;.    }
26030 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72  else{.      char
26040 20 2a 7a 53 70 61 63 65 3b 0a 20 20 20 20 20 20   *zSpace;.      
26050 6d 65 6d 63 70 79 28 26 70 4e 65 77 2d 3e 62 61  memcpy(&pNew->ba
26060 73 65 2c 20 26 76 66 73 5f 74 65 6d 70 6c 61 74  se, &vfs_templat
26070 65 2c 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65  e, sizeof(sqlite
26080 33 5f 76 66 73 29 29 3b 0a 20 20 20 20 20 20 70  3_vfs));.      p
26090 4e 65 77 2d 3e 62 61 73 65 2e 6d 78 50 61 74 68  New->base.mxPath
260a0 6e 61 6d 65 20 3d 20 70 50 61 72 65 6e 74 2d 3e  name = pParent->
260b0 6d 78 50 61 74 68 6e 61 6d 65 3b 0a 20 20 20 20  mxPathname;.    
260c0 20 20 70 4e 65 77 2d 3e 62 61 73 65 2e 73 7a 4f    pNew->base.szO
260d0 73 46 69 6c 65 20 3d 20 73 69 7a 65 6f 66 28 72  sFile = sizeof(r
260e0 62 75 5f 66 69 6c 65 29 20 2b 20 70 50 61 72 65  bu_file) + pPare
260f0 6e 74 2d 3e 73 7a 4f 73 46 69 6c 65 3b 0a 20 20  nt->szOsFile;.  
26100 20 20 20 20 70 4e 65 77 2d 3e 70 52 65 61 6c 56      pNew->pRealV
26110 66 73 20 3d 20 70 50 61 72 65 6e 74 3b 0a 20 20  fs = pParent;.  
26120 20 20 20 20 70 4e 65 77 2d 3e 62 61 73 65 2e 7a      pNew->base.z
26130 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68  Name = (const ch
26140 61 72 2a 29 28 7a 53 70 61 63 65 20 3d 20 28 63  ar*)(zSpace = (c
26150 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 29 3b 0a  har*)&pNew[1]);.
26160 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 53 70        memcpy(zSp
26170 61 63 65 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d  ace, zName, nNam
26180 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 41 6c  e);..      /* Al
26190 6c 6f 63 61 74 65 20 74 68 65 20 6d 75 74 65 78  locate the mutex
261a0 20 61 6e 64 20 72 65 67 69 73 74 65 72 20 74 68   and register th
261b0 65 20 6e 65 77 20 56 46 53 20 28 6e 6f 74 20 61  e new VFS (not a
261c0 73 20 74 68 65 20 64 65 66 61 75 6c 74 29 20 2a  s the default) *
261d0 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6d 75  /.      pNew->mu
261e0 74 65 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75  tex = sqlite3_mu
261f0 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45  tex_alloc(SQLITE
26200 5f 4d 55 54 45 58 5f 52 45 43 55 52 53 49 56 45  _MUTEX_RECURSIVE
26210 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65  );.      if( pNe
26220 77 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20  w->mutex==0 ){. 
26230 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
26240 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
26250 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
26260 63 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  c = sqlite3_vfs_
26270 72 65 67 69 73 74 65 72 28 26 70 4e 65 77 2d 3e  register(&pNew->
26280 62 61 73 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  base, 0);.      
26290 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  }.    }..    if(
262a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
262b0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
262c0 6d 75 74 65 78 5f 66 72 65 65 28 70 4e 65 77 2d  mutex_free(pNew-
262d0 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 73  >mutex);.      s
262e0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77  qlite3_free(pNew
262f0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
26300 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
26310 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20 74 68  .** Configure th
26320 65 20 61 67 67 72 65 67 61 74 65 20 74 65 6d 70  e aggregate temp
26330 20 66 69 6c 65 20 73 69 7a 65 20 6c 69 6d 69 74   file size limit
26340 20 66 6f 72 20 74 68 69 73 20 52 42 55 20 68 61   for this RBU ha
26350 6e 64 6c 65 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33  ndle..*/.sqlite3
26360 5f 69 6e 74 36 34 20 73 71 6c 69 74 65 33 72 62  _int64 sqlite3rb
26370 75 5f 74 65 6d 70 5f 73 69 7a 65 5f 6c 69 6d 69  u_temp_size_limi
26380 74 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 52  t(sqlite3rbu *pR
26390 62 75 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  bu, sqlite3_int6
263a0 34 20 6e 29 7b 0a 20 20 69 66 28 20 6e 3e 3d 30  4 n){.  if( n>=0
263b0 20 29 7b 0a 20 20 20 20 70 52 62 75 2d 3e 73 7a   ){.    pRbu->sz
263c0 54 65 6d 70 4c 69 6d 69 74 20 3d 20 6e 3b 0a 20  TempLimit = n;. 
263d0 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 62 75   }.  return pRbu
263e0 2d 3e 73 7a 54 65 6d 70 4c 69 6d 69 74 3b 0a 7d  ->szTempLimit;.}
263f0 0a 0a 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  ..sqlite3_int64 
26400 73 71 6c 69 74 65 33 72 62 75 5f 74 65 6d 70 5f  sqlite3rbu_temp_
26410 73 69 7a 65 28 73 71 6c 69 74 65 33 72 62 75 20  size(sqlite3rbu 
26420 2a 70 52 62 75 29 7b 0a 20 20 72 65 74 75 72 6e  *pRbu){.  return
26430 20 70 52 62 75 2d 3e 73 7a 54 65 6d 70 3b 0a 7d   pRbu->szTemp;.}
26440 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .../************
26450 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26460 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26470 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26480 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
26490 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
264a0 6e 65 64 28 53 51 4c 49 54 45 5f 43 4f 52 45 29  ned(SQLITE_CORE)
264b0 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
264c0 54 45 5f 45 4e 41 42 4c 45 5f 52 42 55 29 20 2a  TE_ENABLE_RBU) *
264d0 2f 0a                                            /.