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

Artifact 9bcf35b2f1d8eaf1c82b47bead114b2289ea06c6:


0000: 2f 2a 0a 2a 2a 20 32 30 31 34 20 41 75 67 75 73  /*.** 2014 Augus
0010: 74 20 33 30 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  t 30.**.** The a
0020: 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20  uthor disclaims 
0030: 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74 68 69  copyright to thi
0040: 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20  s source code.  
0050: 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61  In place of.** a
0060: 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68   legal notice, h
0070: 65 72 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e  ere is a blessin
0080: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20  g:.**.**    May 
0090: 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20  you do good and 
00a0: 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20  not evil..**    
00b0: 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72  May you find for
00c0: 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75  giveness for you
00d0: 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76  rself and forgiv
00e0: 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20  e others..**    
00f0: 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20 66 72  May you share fr
0100: 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69  eely, never taki
0110: 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75  ng more than you
0120: 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a   give..**.******
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 56 45  ***.**.**.** OVE
0180: 52 56 49 45 57 20 0a 2a 2a 0a 2a 2a 20 20 54 68  RVIEW .**.**  Th
0190: 65 20 52 42 55 20 65 78 74 65 6e 73 69 6f 6e 20  e RBU extension 
01a0: 72 65 71 75 69 72 65 73 20 74 68 61 74 20 74 68  requires that th
01b0: 65 20 52 42 55 20 75 70 64 61 74 65 20 62 65 20  e RBU update be 
01c0: 70 61 63 6b 61 67 65 64 20 61 73 20 61 6e 0a 2a  packaged as an.*
01d0: 2a 20 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  *  SQLite databa
01e0: 73 65 2e 20 54 68 65 20 74 61 62 6c 65 73 20 69  se. The tables i
01f0: 74 20 65 78 70 65 63 74 73 20 74 6f 20 66 69 6e  t expects to fin
0200: 64 20 61 72 65 20 64 65 73 63 72 69 62 65 64 20  d are described 
0210: 69 6e 0a 2a 2a 20 20 73 71 6c 69 74 65 33 72 62  in.**  sqlite3rb
0220: 75 2e 68 2e 20 20 45 73 73 65 6e 74 69 61 6c 6c  u.h.  Essentiall
0230: 79 2c 20 66 6f 72 20 65 61 63 68 20 74 61 62 6c  y, for each tabl
0240: 65 20 78 79 7a 20 69 6e 20 74 68 65 20 74 61 72  e xyz in the tar
0250: 67 65 74 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  get database.** 
0260: 20 74 68 61 74 20 74 68 65 20 75 73 65 72 20 77   that the user w
0270: 69 73 68 65 73 20 74 6f 20 77 72 69 74 65 20 74  ishes to write t
0280: 6f 2c 20 61 20 63 6f 72 72 65 73 70 6f 6e 64 69  o, a correspondi
0290: 6e 67 20 64 61 74 61 5f 78 79 7a 20 74 61 62 6c  ng data_xyz tabl
02a0: 65 20 69 73 0a 2a 2a 20 20 63 72 65 61 74 65 64  e is.**  created
02b0: 20 69 6e 20 74 68 65 20 52 42 55 20 64 61 74 61   in the RBU data
02c0: 62 61 73 65 20 61 6e 64 20 70 6f 70 75 6c 61 74  base and populat
02d0: 65 64 20 77 69 74 68 20 6f 6e 65 20 72 6f 77 20  ed with one row 
02e0: 66 6f 72 20 65 61 63 68 20 72 6f 77 20 74 6f 0a  for each row to.
02f0: 2a 2a 20 20 75 70 64 61 74 65 2c 20 69 6e 73 65  **  update, inse
0300: 72 74 20 6f 72 20 64 65 6c 65 74 65 20 66 72 6f  rt or delete fro
0310: 6d 20 74 68 65 20 74 61 72 67 65 74 20 74 61 62  m the target tab
0320: 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 20 54 68 65 20  le..** .**  The 
0330: 75 70 64 61 74 65 20 70 72 6f 63 65 65 64 73 20  update proceeds 
0340: 69 6e 20 74 68 72 65 65 20 73 74 61 67 65 73 3a  in three stages:
0350: 0a 2a 2a 20 0a 2a 2a 20 20 31 29 20 54 68 65 20  .** .**  1) The 
0360: 64 61 74 61 62 61 73 65 20 69 73 20 75 70 64 61  database is upda
0370: 74 65 64 2e 20 54 68 65 20 6d 6f 64 69 66 69 65  ted. The modifie
0380: 64 20 64 61 74 61 62 61 73 65 20 70 61 67 65 73  d database pages
0390: 20 61 72 65 20 77 72 69 74 74 65 6e 0a 2a 2a 20   are written.** 
03a0: 20 20 20 20 74 6f 20 61 20 2a 2d 6f 61 6c 20 66      to a *-oal f
03b0: 69 6c 65 2e 20 41 20 2a 2d 6f 61 6c 20 66 69 6c  ile. A *-oal fil
03c0: 65 20 69 73 20 6a 75 73 74 20 6c 69 6b 65 20 61  e is just like a
03d0: 20 2a 2d 77 61 6c 20 66 69 6c 65 2c 20 65 78 63   *-wal file, exc
03e0: 65 70 74 0a 2a 2a 20 20 20 20 20 74 68 61 74 20  ept.**     that 
03f0: 69 74 20 69 73 20 6e 61 6d 65 64 20 22 3c 64 61  it is named "<da
0400: 74 61 62 61 73 65 3e 2d 6f 61 6c 22 20 69 6e 73  tabase>-oal" ins
0410: 74 65 61 64 20 6f 66 20 22 3c 64 61 74 61 62 61  tead of "<databa
0420: 73 65 3e 2d 77 61 6c 22 2e 0a 2a 2a 20 20 20 20  se>-wal"..**    
0430: 20 42 65 63 61 75 73 65 20 72 65 67 75 6c 61 72   Because regular
0440: 20 53 51 4c 69 74 65 20 63 6c 69 65 6e 74 73 20   SQLite clients 
0450: 64 6f 20 6e 6f 74 20 6c 6f 6f 6b 20 66 6f 72 20  do not look for 
0460: 66 69 6c 65 20 6e 61 6d 65 64 0a 2a 2a 20 20 20  file named.**   
0470: 20 20 22 3c 64 61 74 61 62 61 73 65 3e 2d 6f 61    "<database>-oa
0480: 6c 22 2c 20 74 68 65 79 20 67 6f 20 6f 6e 20 75  l", they go on u
0490: 73 69 6e 67 20 74 68 65 20 6f 72 69 67 69 6e 61  sing the origina
04a0: 6c 20 64 61 74 61 62 61 73 65 20 69 6e 0a 2a 2a  l database in.**
04b0: 20 20 20 20 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f       rollback mo
04c0: 64 65 20 77 68 69 6c 65 20 74 68 65 20 2a 2d 6f  de while the *-o
04d0: 61 6c 20 66 69 6c 65 20 69 73 20 62 65 69 6e 67  al file is being
04e0: 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2a 20 0a   generated..** .
04f0: 2a 2a 20 20 20 20 20 44 75 72 69 6e 67 20 74 68  **     During th
0500: 69 73 20 73 74 61 67 65 20 52 42 55 20 64 6f 65  is stage RBU doe
0510: 73 20 6e 6f 74 20 75 70 64 61 74 65 20 74 68 65  s not update the
0520: 20 64 61 74 61 62 61 73 65 20 62 79 20 77 72 69   database by wri
0530: 74 69 6e 67 0a 2a 2a 20 20 20 20 20 64 69 72 65  ting.**     dire
0540: 63 74 6c 79 20 74 6f 20 74 68 65 20 74 61 72 67  ctly to the targ
0550: 65 74 20 74 61 62 6c 65 73 2e 20 49 6e 73 74 65  et tables. Inste
0560: 61 64 20 69 74 20 63 72 65 61 74 65 73 20 22 69  ad it creates "i
0570: 6d 70 6f 73 74 65 72 22 0a 2a 2a 20 20 20 20 20  mposter".**     
0580: 74 61 62 6c 65 73 20 75 73 69 6e 67 20 74 68 65  tables using the
0590: 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
05a0: 5f 49 4d 50 4f 53 54 45 52 20 69 6e 74 65 72 66  _IMPOSTER interf
05b0: 61 63 65 20 74 68 61 74 20 69 74 20 75 73 65 73  ace that it uses
05c0: 0a 2a 2a 20 20 20 20 20 74 6f 20 75 70 64 61 74  .**     to updat
05d0: 65 20 65 61 63 68 20 62 2d 74 72 65 65 20 69 6e  e each b-tree in
05e0: 64 69 76 69 64 75 61 6c 6c 79 2e 20 41 6c 6c 20  dividually. All 
05f0: 75 70 64 61 74 65 73 20 72 65 71 75 69 72 65 64  updates required
0600: 20 62 79 20 65 61 63 68 0a 2a 2a 20 20 20 20 20   by each.**     
0610: 62 2d 74 72 65 65 20 61 72 65 20 63 6f 6d 70 6c  b-tree are compl
0620: 65 74 65 64 20 62 65 66 6f 72 65 20 6d 6f 76 69  eted before movi
0630: 6e 67 20 6f 6e 20 74 6f 20 74 68 65 20 6e 65 78  ng on to the nex
0640: 74 2c 20 61 6e 64 20 61 6c 6c 0a 2a 2a 20 20 20  t, and all.**   
0650: 20 20 75 70 64 61 74 65 73 20 61 72 65 20 64 6f    updates are do
0660: 6e 65 20 69 6e 20 73 6f 72 74 65 64 20 6b 65 79  ne in sorted key
0670: 20 6f 72 64 65 72 2e 0a 2a 2a 20 0a 2a 2a 20 20   order..** .**  
0680: 32 29 20 54 68 65 20 22 3c 64 61 74 61 62 61 73  2) The "<databas
0690: 65 3e 2d 6f 61 6c 22 20 66 69 6c 65 20 69 73 20  e>-oal" file is 
06a0: 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 65 71 75  moved to the equ
06b0: 69 76 61 6c 65 6e 74 20 22 3c 64 61 74 61 62 61  ivalent "<databa
06c0: 73 65 3e 2d 77 61 6c 22 0a 2a 2a 20 20 20 20 20  se>-wal".**     
06d0: 6c 6f 63 61 74 69 6f 6e 20 75 73 69 6e 67 20 61  location using a
06e0: 20 63 61 6c 6c 20 74 6f 20 72 65 6e 61 6d 65 28   call to rename(
06f0: 32 29 2e 20 42 65 66 6f 72 65 20 64 6f 69 6e 67  2). Before doing
0700: 20 74 68 69 73 20 74 68 65 20 52 42 55 0a 2a 2a   this the RBU.**
0710: 20 20 20 20 20 6d 6f 64 75 6c 65 20 74 61 6b 65       module take
0720: 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  s an EXCLUSIVE l
0730: 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
0740: 61 73 65 20 66 69 6c 65 2c 20 65 6e 73 75 72 69  ase file, ensuri
0750: 6e 67 0a 2a 2a 20 20 20 20 20 74 68 61 74 20 74  ng.**     that t
0760: 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 74 68 65  here are no othe
0770: 72 20 61 63 74 69 76 65 20 72 65 61 64 65 72 73  r active readers
0780: 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 4f 6e 63  ..** .**     Onc
0790: 65 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 20  e the EXCLUSIVE 
07a0: 6c 6f 63 6b 20 69 73 20 72 65 6c 65 61 73 65 64  lock is released
07b0: 2c 20 61 6e 79 20 6f 74 68 65 72 20 64 61 74 61  , any other data
07c0: 62 61 73 65 20 72 65 61 64 65 72 73 0a 2a 2a 20  base readers.** 
07d0: 20 20 20 20 64 65 74 65 63 74 20 74 68 65 20 6e      detect the n
07e0: 65 77 20 2a 2d 77 61 6c 20 66 69 6c 65 20 61 6e  ew *-wal file an
07f0: 64 20 72 65 61 64 20 74 68 65 20 64 61 74 61 62  d read the datab
0800: 61 73 65 20 69 6e 20 77 61 6c 20 6d 6f 64 65 2e  ase in wal mode.
0810: 20 41 74 0a 2a 2a 20 20 20 20 20 74 68 69 73 20   At.**     this 
0820: 70 6f 69 6e 74 20 74 68 65 79 20 73 65 65 20 74  point they see t
0830: 68 65 20 6e 65 77 20 76 65 72 73 69 6f 6e 20 6f  he new version o
0840: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2d  f the database -
0850: 20 69 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20 20 20   including.**   
0860: 20 20 74 68 65 20 75 70 64 61 74 65 73 20 6d 61    the updates ma
0870: 64 65 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  de as part of th
0880: 65 20 52 42 55 20 75 70 64 61 74 65 2e 0a 2a 2a  e RBU update..**
0890: 20 0a 2a 2a 20 20 33 29 20 54 68 65 20 6e 65 77   .**  3) The new
08a0: 20 2a 2d 77 61 6c 20 66 69 6c 65 20 69 73 20 63   *-wal file is c
08b0: 68 65 63 6b 70 6f 69 6e 74 65 64 2e 20 54 68 69  heckpointed. Thi
08c0: 73 20 70 72 6f 63 65 65 64 73 20 69 6e 20 74 68  s proceeds in th
08d0: 65 20 73 61 6d 65 20 77 61 79 20 0a 2a 2a 20 20  e same way .**  
08e0: 20 20 20 61 73 20 61 20 72 65 67 75 6c 61 72 20     as a regular 
08f0: 64 61 74 61 62 61 73 65 20 63 68 65 63 6b 70 6f  database checkpo
0900: 69 6e 74 2c 20 65 78 63 65 70 74 20 74 68 61 74  int, except that
0910: 20 61 20 73 69 6e 67 6c 65 20 66 72 61 6d 65 20   a single frame 
0920: 69 73 0a 2a 2a 20 20 20 20 20 63 68 65 63 6b 70  is.**     checkp
0930: 6f 69 6e 74 65 64 20 65 61 63 68 20 74 69 6d 65  ointed each time
0940: 20 73 71 6c 69 74 65 33 72 62 75 5f 73 74 65 70   sqlite3rbu_step
0950: 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 20 49 66  () is called. If
0960: 20 74 68 65 20 52 42 55 0a 2a 2a 20 20 20 20 20   the RBU.**     
0970: 68 61 6e 64 6c 65 20 69 73 20 63 6c 6f 73 65 64  handle is closed
0980: 20 62 65 66 6f 72 65 20 74 68 65 20 65 6e 74 69   before the enti
0990: 72 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 69 73  re *-wal file is
09a0: 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 2c 0a 2a   checkpointed,.*
09b0: 2a 20 20 20 20 20 74 68 65 20 63 68 65 63 6b 70  *     the checkp
09c0: 6f 69 6e 74 20 70 72 6f 67 72 65 73 73 20 69 73  oint progress is
09d0: 20 73 61 76 65 64 20 69 6e 20 74 68 65 20 52 42   saved in the RB
09e0: 55 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74  U database and t
09f0: 68 65 0a 2a 2a 20 20 20 20 20 63 68 65 63 6b 70  he.**     checkp
0a00: 6f 69 6e 74 20 63 61 6e 20 62 65 20 72 65 73 75  oint can be resu
0a10: 6d 65 64 20 62 79 20 61 6e 6f 74 68 65 72 20 52  med by another R
0a20: 42 55 20 63 6c 69 65 6e 74 20 61 74 20 73 6f 6d  BU client at som
0a30: 65 20 70 6f 69 6e 74 20 69 6e 0a 2a 2a 20 20 20  e point in.**   
0a40: 20 20 74 68 65 20 66 75 74 75 72 65 2e 0a 2a 2a    the future..**
0a50: 0a 2a 2a 20 50 4f 54 45 4e 54 49 41 4c 20 50 52  .** POTENTIAL PR
0a60: 4f 42 4c 45 4d 53 0a 2a 2a 20 0a 2a 2a 20 20 54  OBLEMS.** .**  T
0a70: 68 65 20 72 65 6e 61 6d 65 28 29 20 63 61 6c 6c  he rename() call
0a80: 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 70 6f   might not be po
0a90: 72 74 61 62 6c 65 2e 20 41 6e 64 20 52 42 55 20  rtable. And RBU 
0aa0: 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  is not currently
0ab0: 0a 2a 2a 20 20 73 79 6e 63 69 6e 67 20 74 68 65  .**  syncing the
0ac0: 20 64 69 72 65 63 74 6f 72 79 20 61 66 74 65 72   directory after
0ad0: 20 72 65 6e 61 6d 69 6e 67 20 74 68 65 20 66 69   renaming the fi
0ae0: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 57 68 65 6e 20  le..**.**  When 
0af0: 73 74 61 74 65 20 69 73 20 73 61 76 65 64 2c 20  state is saved, 
0b00: 61 6e 79 20 63 6f 6d 6d 69 74 20 74 6f 20 74 68  any commit to th
0b10: 65 20 2a 2d 6f 61 6c 20 66 69 6c 65 20 61 6e 64  e *-oal file and
0b20: 20 74 68 65 20 63 6f 6d 6d 69 74 20 74 6f 0a 2a   the commit to.*
0b30: 2a 20 20 74 68 65 20 52 42 55 20 75 70 64 61 74  *  the RBU updat
0b40: 65 20 64 61 74 61 62 61 73 65 20 61 72 65 20 6e  e database are n
0b50: 6f 74 20 61 74 6f 6d 69 63 2e 20 53 6f 20 69 66  ot atomic. So if
0b60: 20 74 68 65 20 70 6f 77 65 72 20 66 61 69 6c 73   the power fails
0b70: 20 61 74 20 74 68 65 0a 2a 2a 20 20 77 72 6f 6e   at the.**  wron
0b80: 67 20 6d 6f 6d 65 6e 74 20 74 68 65 79 20 6d 69  g moment they mi
0b90: 67 68 74 20 67 65 74 20 6f 75 74 20 6f 66 20 73  ght get out of s
0ba0: 79 6e 63 2e 20 41 73 20 74 68 65 20 6d 61 69 6e  ync. As the main
0bb0: 20 64 61 74 61 62 61 73 65 20 77 69 6c 6c 20 62   database will b
0bc0: 65 0a 2a 2a 20 20 63 6f 6d 6d 69 74 74 65 64 20  e.**  committed 
0bd0: 62 65 66 6f 72 65 20 74 68 65 20 52 42 55 20 75  before the RBU u
0be0: 70 64 61 74 65 20 64 61 74 61 62 61 73 65 20 74  pdate database t
0bf0: 68 69 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20  his will likely 
0c00: 65 69 74 68 65 72 20 6a 75 73 74 0a 2a 2a 20 20  either just.**  
0c10: 70 61 73 73 20 75 6e 6e 6f 74 69 63 65 64 2c 20  pass unnoticed, 
0c20: 6f 72 20 72 65 73 75 6c 74 20 69 6e 20 53 51 4c  or result in SQL
0c30: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 65  ITE_CONSTRAINT e
0c40: 72 72 6f 72 73 20 28 64 75 65 20 74 6f 20 55 4e  rrors (due to UN
0c50: 49 51 55 45 0a 2a 2a 20 20 63 6f 6e 73 74 72 61  IQUE.**  constra
0c60: 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 73 29 2e  int violations).
0c70: 0a 2a 2a 0a 2a 2a 20 20 49 66 20 73 6f 6d 65 20  .**.**  If some 
0c80: 63 6c 69 65 6e 74 20 64 6f 65 73 20 6d 6f 64 69  client does modi
0c90: 66 79 20 74 68 65 20 74 61 72 67 65 74 20 64 61  fy the target da
0ca0: 74 61 62 61 73 65 20 6d 69 64 20 52 42 55 20 75  tabase mid RBU u
0cb0: 70 64 61 74 65 2c 20 6f 72 20 73 6f 6d 65 0a 2a  pdate, or some.*
0cc0: 2a 20 20 6f 74 68 65 72 20 65 72 72 6f 72 20 6f  *  other error o
0cd0: 63 63 75 72 73 2c 20 74 68 65 20 52 42 55 20 65  ccurs, the RBU e
0ce0: 78 74 65 6e 73 69 6f 6e 20 77 69 6c 6c 20 6b 65  xtension will ke
0cf0: 65 70 20 74 68 72 6f 77 69 6e 67 20 65 72 72 6f  ep throwing erro
0d00: 72 73 2e 20 49 74 27 73 0a 2a 2a 20 20 6e 6f 74  rs. It's.**  not
0d10: 20 72 65 61 6c 6c 79 20 63 6c 65 61 72 20 68 6f   really clear ho
0d20: 77 20 74 6f 20 67 65 74 20 6f 75 74 20 6f 66 20  w to get out of 
0d30: 74 68 69 73 20 73 74 61 74 65 2e 20 54 68 65 20  this state. The 
0d40: 73 79 73 74 65 6d 20 63 6f 75 6c 64 20 6a 75 73  system could jus
0d50: 74 0a 2a 2a 20 20 62 79 20 64 65 6c 65 74 65 20  t.**  by delete 
0d60: 74 68 65 20 52 42 55 20 75 70 64 61 74 65 20 64  the RBU update d
0d70: 61 74 61 62 61 73 65 20 61 6e 64 20 2a 2d 6f 61  atabase and *-oa
0d80: 6c 20 66 69 6c 65 20 61 6e 64 20 68 61 76 65 20  l file and have 
0d90: 74 68 65 20 64 65 76 69 63 65 0a 2a 2a 20 20 64  the device.**  d
0da0: 6f 77 6e 6c 6f 61 64 20 74 68 65 20 75 70 64 61  ownload the upda
0db0: 74 65 20 61 67 61 69 6e 20 61 6e 64 20 73 74 61  te again and sta
0dc0: 72 74 20 6f 76 65 72 2e 0a 2a 2a 0a 2a 2a 20 20  rt over..**.**  
0dd0: 41 74 20 70 72 65 73 65 6e 74 2c 20 66 6f 72 20  At present, for 
0de0: 61 6e 20 55 50 44 41 54 45 2c 20 62 6f 74 68 20  an UPDATE, both 
0df0: 74 68 65 20 6e 65 77 2e 2a 20 61 6e 64 20 6f 6c  the new.* and ol
0e00: 64 2e 2a 20 72 65 63 6f 72 64 73 20 61 72 65 0a  d.* records are.
0e10: 2a 2a 20 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e  **  collected in
0e20: 20 74 68 65 20 72 62 75 5f 78 79 7a 20 74 61 62   the rbu_xyz tab
0e30: 6c 65 2e 20 41 6e 64 20 66 6f 72 20 62 6f 74 68  le. And for both
0e40: 20 55 50 44 41 54 45 73 20 61 6e 64 20 44 45 4c   UPDATEs and DEL
0e50: 45 54 45 73 20 61 6c 6c 0a 2a 2a 20 20 66 69 65  ETEs all.**  fie
0e60: 6c 64 73 20 61 72 65 20 63 6f 6c 6c 65 63 74 65  lds are collecte
0e70: 64 2e 20 20 54 68 69 73 20 6d 65 61 6e 73 20 77  d.  This means w
0e80: 65 27 72 65 20 70 72 6f 62 61 62 6c 79 20 77 72  e're probably wr
0e90: 69 74 69 6e 67 20 61 20 6c 6f 74 20 6d 6f 72 65  iting a lot more
0ea0: 0a 2a 2a 20 20 64 61 74 61 20 74 6f 20 64 69 73  .**  data to dis
0eb0: 6b 20 77 68 65 6e 20 73 61 76 69 6e 67 20 74 68  k when saving th
0ec0: 65 20 73 74 61 74 65 20 6f 66 20 61 6e 20 6f 6e  e state of an on
0ed0: 67 6f 69 6e 67 20 75 70 64 61 74 65 20 74 6f 20  going update to 
0ee0: 74 68 65 20 52 42 55 0a 2a 2a 20 20 75 70 64 61  the RBU.**  upda
0ef0: 74 65 20 64 61 74 61 62 61 73 65 20 74 68 61 6e  te database than
0f00: 20 69 73 20 73 74 72 69 63 74 6c 79 20 6e 65 63   is strictly nec
0f10: 65 73 73 61 72 79 2e 0a 2a 2a 20 0a 2a 2f 0a 0a  essary..** .*/..
0f20: 23 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74  #include <assert
0f30: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74  .h>.#include <st
0f40: 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  ring.h>.#include
0f50: 20 3c 73 74 64 69 6f 2e 68 3e 0a 0a 23 69 6e 63   <stdio.h>..#inc
0f60: 6c 75 64 65 20 22 73 71 6c 69 74 65 33 2e 68 22  lude "sqlite3.h"
0f70: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
0f80: 51 4c 49 54 45 5f 43 4f 52 45 29 20 7c 7c 20 64  QLITE_CORE) || d
0f90: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
0fa0: 41 42 4c 45 5f 52 42 55 29 0a 23 69 6e 63 6c 75  ABLE_RBU).#inclu
0fb0: 64 65 20 22 73 71 6c 69 74 65 33 72 62 75 2e 68  de "sqlite3rbu.h
0fc0: 22 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  "..#if defined(_
0fd0: 57 49 4e 33 32 5f 57 43 45 29 0a 23 69 6e 63 6c  WIN32_WCE).#incl
0fe0: 75 64 65 20 22 77 69 6e 64 6f 77 73 2e 68 22 0a  ude "windows.h".
0ff0: 23 65 6e 64 69 66 0a 0a 2f 2a 20 4d 61 78 69 6d  #endif../* Maxim
1000: 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 70 72 65  um number of pre
1010: 70 61 72 65 64 20 55 50 44 41 54 45 20 73 74 61  pared UPDATE sta
1020: 74 65 6d 65 6e 74 73 20 68 65 6c 64 20 62 79 20  tements held by 
1030: 74 68 69 73 20 6d 6f 64 75 6c 65 20 2a 2f 0a 23  this module */.#
1040: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 52 42  define SQLITE_RB
1050: 55 5f 55 50 44 41 54 45 5f 43 41 43 48 45 53 49  U_UPDATE_CACHESI
1060: 5a 45 20 31 36 0a 0a 2f 2a 0a 2a 2a 20 53 77 61  ZE 16../*.** Swa
1070: 70 20 74 77 6f 20 6f 62 6a 65 63 74 73 20 6f 66  p two objects of
1080: 20 74 79 70 65 20 54 59 50 45 2e 0a 2a 2f 0a 23   type TYPE..*/.#
1090: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
10a0: 54 45 5f 41 4d 41 4c 47 41 4d 41 54 49 4f 4e 29  TE_AMALGAMATION)
10b0: 0a 23 20 64 65 66 69 6e 65 20 53 57 41 50 28 54  .# define SWAP(T
10c0: 59 50 45 2c 41 2c 42 29 20 7b 54 59 50 45 20 74  YPE,A,B) {TYPE t
10d0: 3d 41 3b 20 41 3d 42 3b 20 42 3d 74 3b 7d 0a 23  =A; A=B; B=t;}.#
10e0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
10f0: 20 72 62 75 5f 73 74 61 74 65 20 74 61 62 6c 65   rbu_state table
1100: 20 69 73 20 75 73 65 64 20 74 6f 20 73 61 76 65   is used to save
1110: 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 61 20   the state of a 
1120: 70 61 72 74 69 61 6c 6c 79 20 61 70 70 6c 69 65  partially applie
1130: 64 0a 2a 2a 20 75 70 64 61 74 65 20 73 6f 20 74  d.** update so t
1140: 68 61 74 20 69 74 20 63 61 6e 20 62 65 20 72 65  hat it can be re
1150: 73 75 6d 65 64 20 6c 61 74 65 72 2e 20 54 68 65  sumed later. The
1160: 20 74 61 62 6c 65 20 63 6f 6e 73 69 73 74 73 20   table consists 
1170: 6f 66 20 69 6e 74 65 67 65 72 0a 2a 2a 20 6b 65  of integer.** ke
1180: 79 73 20 6d 61 70 70 65 64 20 74 6f 20 76 61 6c  ys mapped to val
1190: 75 65 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ues as follows:.
11a0: 2a 2a 0a 2a 2a 20 52 42 55 5f 53 54 41 54 45 5f  **.** RBU_STATE_
11b0: 53 54 41 47 45 3a 0a 2a 2a 20 20 20 4d 61 79 20  STAGE:.**   May 
11c0: 62 65 20 73 65 74 20 74 6f 20 69 6e 74 65 67 65  be set to intege
11d0: 72 20 76 61 6c 75 65 73 20 31 2c 20 32 2c 20 34  r values 1, 2, 4
11e0: 20 6f 72 20 35 2e 20 41 73 20 66 6f 6c 6c 6f 77   or 5. As follow
11f0: 73 3a 0a 2a 2a 20 20 20 20 20 20 20 31 3a 20 74  s:.**       1: t
1200: 68 65 20 2a 2d 72 62 75 20 66 69 6c 65 20 69 73  he *-rbu file is
1210: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
1220: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a   construction..*
1230: 2a 20 20 20 20 20 20 20 32 3a 20 74 68 65 20 2a  *       2: the *
1240: 2d 72 62 75 20 66 69 6c 65 20 68 61 73 20 62 65  -rbu file has be
1250: 65 6e 20 63 6f 6e 73 74 72 75 63 74 65 64 2c 20  en constructed, 
1260: 62 75 74 20 6e 6f 74 20 79 65 74 20 6d 6f 76 65  but not yet move
1270: 64 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 74  d .**          t
1280: 6f 20 74 68 65 20 2a 2d 77 61 6c 20 70 61 74 68  o the *-wal path
1290: 2e 0a 2a 2a 20 20 20 20 20 20 20 34 3a 20 74 68  ..**       4: th
12a0: 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 73 20  e checkpoint is 
12b0: 75 6e 64 65 72 77 61 79 2e 0a 2a 2a 20 20 20 20  underway..**    
12c0: 20 20 20 35 3a 20 74 68 65 20 72 62 75 20 75 70     5: the rbu up
12d0: 64 61 74 65 20 68 61 73 20 62 65 65 6e 20 63 68  date has been ch
12e0: 65 63 6b 70 6f 69 6e 74 65 64 2e 0a 2a 2a 0a 2a  eckpointed..**.*
12f0: 2a 20 52 42 55 5f 53 54 41 54 45 5f 54 42 4c 3a  * RBU_STATE_TBL:
1300: 0a 2a 2a 20 20 20 4f 6e 6c 79 20 76 61 6c 69 64  .**   Only valid
1310: 20 69 66 20 53 54 41 47 45 3d 3d 31 2e 20 54 68   if STAGE==1. Th
1320: 65 20 74 61 72 67 65 74 20 64 61 74 61 62 61 73  e target databas
1330: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
1340: 62 6c 65 20 0a 2a 2a 20 20 20 63 75 72 72 65 6e  ble .**   curren
1350: 74 6c 79 20 62 65 69 6e 67 20 77 72 69 74 74 65  tly being writte
1360: 6e 2e 0a 2a 2a 0a 2a 2a 20 52 42 55 5f 53 54 41  n..**.** RBU_STA
1370: 54 45 5f 49 44 58 3a 0a 2a 2a 20 20 20 4f 6e 6c  TE_IDX:.**   Onl
1380: 79 20 76 61 6c 69 64 20 69 66 20 53 54 41 47 45  y valid if STAGE
1390: 3d 3d 31 2e 20 54 68 65 20 74 61 72 67 65 74 20  ==1. The target 
13a0: 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 6f 66  database name of
13b0: 20 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20 20   the index .**  
13c0: 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67   currently being
13d0: 20 77 72 69 74 74 65 6e 2c 20 6f 72 20 4e 55 4c   written, or NUL
13e0: 4c 20 69 66 20 74 68 65 20 6d 61 69 6e 20 74 61  L if the main ta
13f0: 62 6c 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ble is currently
1400: 20 62 65 69 6e 67 0a 2a 2a 20 20 20 75 70 64 61   being.**   upda
1410: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 42 55 5f 53  ted..**.** RBU_S
1420: 54 41 54 45 5f 52 4f 57 3a 0a 2a 2a 20 20 20 4f  TATE_ROW:.**   O
1430: 6e 6c 79 20 76 61 6c 69 64 20 69 66 20 53 54 41  nly valid if STA
1440: 47 45 3d 3d 31 2e 20 4e 75 6d 62 65 72 20 6f 66  GE==1. Number of
1450: 20 72 6f 77 73 20 61 6c 72 65 61 64 79 20 70 72   rows already pr
1460: 6f 63 65 73 73 65 64 20 66 6f 72 20 74 68 65 20  ocessed for the 
1470: 63 75 72 72 65 6e 74 0a 2a 2a 20 20 20 74 61 62  current.**   tab
1480: 6c 65 2f 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20  le/index..**.** 
1490: 52 42 55 5f 53 54 41 54 45 5f 50 52 4f 47 52 45  RBU_STATE_PROGRE
14a0: 53 53 3a 0a 2a 2a 20 20 20 54 72 62 75 6c 20 6e  SS:.**   Trbul n
14b0: 75 6d 62 65 72 20 6f 66 20 73 71 6c 69 74 65 33  umber of sqlite3
14c0: 72 62 75 5f 73 74 65 70 28 29 20 63 61 6c 6c 73  rbu_step() calls
14d0: 20 6d 61 64 65 20 73 6f 20 66 61 72 20 61 73 20   made so far as 
14e0: 70 61 72 74 20 6f 66 20 74 68 69 73 0a 2a 2a 20  part of this.** 
14f0: 20 20 72 62 75 20 75 70 64 61 74 65 2e 0a 2a 2a    rbu update..**
1500: 0a 2a 2a 20 52 42 55 5f 53 54 41 54 45 5f 43 4b  .** RBU_STATE_CK
1510: 50 54 3a 0a 2a 2a 20 20 20 56 61 6c 69 64 20 69  PT:.**   Valid i
1520: 66 20 53 54 41 47 45 3d 3d 34 2e 20 54 68 65 20  f STAGE==4. The 
1530: 36 34 2d 62 69 74 20 63 68 65 63 6b 73 75 6d 20  64-bit checksum 
1540: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1550: 74 68 65 20 77 61 6c 2d 69 6e 64 65 78 0a 2a 2a  the wal-index.**
1560: 20 20 20 68 65 61 64 65 72 20 63 72 65 61 74 65     header create
1570: 64 20 62 79 20 72 65 63 6f 76 65 72 69 6e 67 20  d by recovering 
1580: 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 2e 20  the *-wal file. 
1590: 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20  This is used to 
15a0: 64 65 74 65 63 74 0a 2a 2a 20 20 20 63 61 73 65  detect.**   case
15b0: 73 20 77 68 65 6e 20 61 6e 6f 74 68 65 72 20 63  s when another c
15c0: 6c 69 65 6e 74 20 61 70 70 65 6e 64 73 20 66 72  lient appends fr
15d0: 61 6d 65 73 20 74 6f 20 74 68 65 20 2a 2d 77 61  ames to the *-wa
15e0: 6c 20 66 69 6c 65 20 69 6e 20 74 68 65 0a 2a 2a  l file in the.**
15f0: 20 20 20 6d 69 64 64 6c 65 20 6f 66 20 61 6e 20     middle of an 
1600: 69 6e 63 72 65 6d 65 6e 74 61 6c 20 63 68 65 63  incremental chec
1610: 6b 70 6f 69 6e 74 20 28 61 6e 20 69 6e 63 72 65  kpoint (an incre
1620: 6d 65 6e 74 61 6c 20 63 68 65 63 6b 70 6f 69 6e  mental checkpoin
1630: 74 20 63 61 6e 6e 6f 74 0a 2a 2a 20 20 20 62 65  t cannot.**   be
1640: 20 63 6f 6e 74 69 6e 75 65 64 20 69 66 20 74 68   continued if th
1650: 69 73 20 68 61 70 70 65 6e 73 29 2e 0a 2a 2a 0a  is happens)..**.
1660: 2a 2a 20 52 42 55 5f 53 54 41 54 45 5f 43 4f 4f  ** RBU_STATE_COO
1670: 4b 49 45 3a 0a 2a 2a 20 20 20 56 61 6c 69 64 20  KIE:.**   Valid 
1680: 69 66 20 53 54 41 47 45 3d 3d 31 2e 20 54 68 65  if STAGE==1. The
1690: 20 63 75 72 72 65 6e 74 20 63 68 61 6e 67 65 2d   current change-
16a0: 63 6f 75 6e 74 65 72 20 63 6f 6f 6b 69 65 20 76  counter cookie v
16b0: 61 6c 75 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20  alue in the .** 
16c0: 20 20 74 61 72 67 65 74 20 64 62 20 66 69 6c 65    target db file
16d0: 2e 0a 2a 2a 0a 2a 2a 20 52 42 55 5f 53 54 41 54  ..**.** RBU_STAT
16e0: 45 5f 4f 41 4c 53 5a 3a 0a 2a 2a 20 20 20 56 61  E_OALSZ:.**   Va
16f0: 6c 69 64 20 69 66 20 53 54 41 47 45 3d 3d 31 2e  lid if STAGE==1.
1700: 20 54 68 65 20 73 69 7a 65 20 69 6e 20 62 79 74   The size in byt
1710: 65 73 20 6f 66 20 74 68 65 20 2a 2d 6f 61 6c 20  es of the *-oal 
1720: 66 69 6c 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  file..*/.#define
1730: 20 52 42 55 5f 53 54 41 54 45 5f 53 54 41 47 45   RBU_STATE_STAGE
1740: 20 20 20 20 20 20 20 20 31 0a 23 64 65 66 69 6e          1.#defin
1750: 65 20 52 42 55 5f 53 54 41 54 45 5f 54 42 4c 20  e RBU_STATE_TBL 
1760: 20 20 20 20 20 20 20 20 20 32 0a 23 64 65 66 69           2.#defi
1770: 6e 65 20 52 42 55 5f 53 54 41 54 45 5f 49 44 58  ne RBU_STATE_IDX
1780: 20 20 20 20 20 20 20 20 20 20 33 0a 23 64 65 66            3.#def
1790: 69 6e 65 20 52 42 55 5f 53 54 41 54 45 5f 52 4f  ine RBU_STATE_RO
17a0: 57 20 20 20 20 20 20 20 20 20 20 34 0a 23 64 65  W          4.#de
17b0: 66 69 6e 65 20 52 42 55 5f 53 54 41 54 45 5f 50  fine RBU_STATE_P
17c0: 52 4f 47 52 45 53 53 20 20 20 20 20 35 0a 23 64  ROGRESS     5.#d
17d0: 65 66 69 6e 65 20 52 42 55 5f 53 54 41 54 45 5f  efine RBU_STATE_
17e0: 43 4b 50 54 20 20 20 20 20 20 20 20 20 36 0a 23  CKPT         6.#
17f0: 64 65 66 69 6e 65 20 52 42 55 5f 53 54 41 54 45  define RBU_STATE
1800: 5f 43 4f 4f 4b 49 45 20 20 20 20 20 20 20 37 0a  _COOKIE       7.
1810: 23 64 65 66 69 6e 65 20 52 42 55 5f 53 54 41 54  #define RBU_STAT
1820: 45 5f 4f 41 4c 53 5a 20 20 20 20 20 20 20 20 38  E_OALSZ        8
1830: 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 53 54 41  .#define RBU_STA
1840: 54 45 5f 50 48 41 53 45 4f 4e 45 53 54 45 50 20  TE_PHASEONESTEP 
1850: 39 0a 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 53  9..#define RBU_S
1860: 54 41 47 45 5f 4f 41 4c 20 20 20 20 20 20 20 20  TAGE_OAL        
1870: 20 31 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 53   1.#define RBU_S
1880: 54 41 47 45 5f 4d 4f 56 45 20 20 20 20 20 20 20  TAGE_MOVE       
1890: 20 32 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 53   2.#define RBU_S
18a0: 54 41 47 45 5f 43 41 50 54 55 52 45 20 20 20 20  TAGE_CAPTURE    
18b0: 20 33 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 53   3.#define RBU_S
18c0: 54 41 47 45 5f 43 4b 50 54 20 20 20 20 20 20 20  TAGE_CKPT       
18d0: 20 34 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 53   4.#define RBU_S
18e0: 54 41 47 45 5f 44 4f 4e 45 20 20 20 20 20 20 20  TAGE_DONE       
18f0: 20 35 0a 0a 0a 23 64 65 66 69 6e 65 20 52 42 55   5...#define RBU
1900: 5f 43 52 45 41 54 45 5f 53 54 41 54 45 20 5c 0a  _CREATE_STATE \.
1910: 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20    "CREATE TABLE 
1920: 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20 25 73  IF NOT EXISTS %s
1930: 2e 72 62 75 5f 73 74 61 74 65 28 6b 20 49 4e 54  .rbu_state(k INT
1940: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
1950: 2c 20 76 29 22 0a 0a 74 79 70 65 64 65 66 20 73  , v)"..typedef s
1960: 74 72 75 63 74 20 52 62 75 46 72 61 6d 65 20 52  truct RbuFrame R
1970: 62 75 46 72 61 6d 65 3b 0a 74 79 70 65 64 65 66  buFrame;.typedef
1980: 20 73 74 72 75 63 74 20 52 62 75 4f 62 6a 49 74   struct RbuObjIt
1990: 65 72 20 52 62 75 4f 62 6a 49 74 65 72 3b 0a 74  er RbuObjIter;.t
19a0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 52 62  ypedef struct Rb
19b0: 75 53 74 61 74 65 20 52 62 75 53 74 61 74 65 3b  uState RbuState;
19c0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
19d0: 72 62 75 5f 76 66 73 20 72 62 75 5f 76 66 73 3b  rbu_vfs rbu_vfs;
19e0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
19f0: 72 62 75 5f 66 69 6c 65 20 72 62 75 5f 66 69 6c  rbu_file rbu_fil
1a00: 65 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  e;.typedef struc
1a10: 74 20 52 62 75 55 70 64 61 74 65 53 74 6d 74 20  t RbuUpdateStmt 
1a20: 52 62 75 55 70 64 61 74 65 53 74 6d 74 3b 0a 0a  RbuUpdateStmt;..
1a30: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
1a40: 49 54 45 5f 41 4d 41 4c 47 41 4d 41 54 49 4f 4e  ITE_AMALGAMATION
1a50: 29 0a 74 79 70 65 64 65 66 20 75 6e 73 69 67 6e  ).typedef unsign
1a60: 65 64 20 69 6e 74 20 75 33 32 3b 0a 74 79 70 65  ed int u32;.type
1a70: 64 65 66 20 75 6e 73 69 67 6e 65 64 20 63 68 61  def unsigned cha
1a80: 72 20 75 38 3b 0a 74 79 70 65 64 65 66 20 73 71  r u8;.typedef sq
1a90: 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 36 34 3b  lite3_int64 i64;
1aa0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
1ab0: 68 65 73 65 20 76 61 6c 75 65 73 20 6d 75 73 74  hese values must
1ac0: 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75 65   match the value
1ad0: 73 20 64 65 66 69 6e 65 64 20 69 6e 20 77 61 6c  s defined in wal
1ae0: 2e 63 20 66 6f 72 20 74 68 65 20 65 71 75 69 76  .c for the equiv
1af0: 61 6c 65 6e 74 0a 2a 2a 20 6c 6f 63 6b 73 2e 20  alent.** locks. 
1b00: 54 68 65 73 65 20 61 72 65 20 6e 6f 74 20 6d 61  These are not ma
1b10: 67 69 63 20 6e 75 6d 62 65 72 73 20 61 73 20 74  gic numbers as t
1b20: 68 65 79 20 61 72 65 20 70 61 72 74 20 6f 66 20  hey are part of 
1b30: 74 68 65 20 53 51 4c 69 74 65 20 66 69 6c 65 0a  the SQLite file.
1b40: 2a 2a 20 66 6f 72 6d 61 74 2e 0a 2a 2f 0a 23 64  ** format..*/.#d
1b50: 65 66 69 6e 65 20 57 41 4c 5f 4c 4f 43 4b 5f 57  efine WAL_LOCK_W
1b60: 52 49 54 45 20 20 30 0a 23 64 65 66 69 6e 65 20  RITE  0.#define 
1b70: 57 41 4c 5f 4c 4f 43 4b 5f 43 4b 50 54 20 20 20  WAL_LOCK_CKPT   
1b80: 31 0a 23 64 65 66 69 6e 65 20 57 41 4c 5f 4c 4f  1.#define WAL_LO
1b90: 43 4b 5f 52 45 41 44 30 20 20 33 0a 0a 2f 2a 0a  CK_READ0  3../*.
1ba0: 2a 2a 20 41 20 73 74 72 75 63 74 75 72 65 20 74  ** A structure t
1bb0: 6f 20 73 74 6f 72 65 20 76 61 6c 75 65 73 20 72  o store values r
1bc0: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 72 62 75  ead from the rbu
1bd0: 5f 73 74 61 74 65 20 74 61 62 6c 65 20 69 6e 20  _state table in 
1be0: 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 72 75 63  memory..*/.struc
1bf0: 74 20 52 62 75 53 74 61 74 65 20 7b 0a 20 20 69  t RbuState {.  i
1c00: 6e 74 20 65 53 74 61 67 65 3b 0a 20 20 63 68 61  nt eStage;.  cha
1c10: 72 20 2a 7a 54 62 6c 3b 0a 20 20 63 68 61 72 20  r *zTbl;.  char 
1c20: 2a 7a 49 64 78 3b 0a 20 20 69 36 34 20 69 57 61  *zIdx;.  i64 iWa
1c30: 6c 43 6b 73 75 6d 3b 0a 20 20 69 6e 74 20 6e 52  lCksum;.  int nR
1c40: 6f 77 3b 0a 20 20 69 36 34 20 6e 50 72 6f 67 72  ow;.  i64 nProgr
1c50: 65 73 73 3b 0a 20 20 75 33 32 20 69 43 6f 6f 6b  ess;.  u32 iCook
1c60: 69 65 3b 0a 20 20 69 36 34 20 69 4f 61 6c 53 7a  ie;.  i64 iOalSz
1c70: 3b 0a 20 20 69 36 34 20 6e 50 68 61 73 65 4f 6e  ;.  i64 nPhaseOn
1c80: 65 53 74 65 70 3b 0a 7d 3b 0a 0a 73 74 72 75 63  eStep;.};..struc
1c90: 74 20 52 62 75 55 70 64 61 74 65 53 74 6d 74 20  t RbuUpdateStmt 
1ca0: 7b 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 6b 3b  {.  char *zMask;
1cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc0: 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 75      /* Copy of u
1cd0: 70 64 61 74 65 20 6d 61 73 6b 20 75 73 65 64 20  pdate mask used 
1ce0: 77 69 74 68 20 70 55 70 64 61 74 65 20 2a 2f 0a  with pUpdate */.
1cf0: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
1d00: 70 55 70 64 61 74 65 3b 20 20 20 20 20 20 20 20  pUpdate;        
1d10: 20 20 2f 2a 20 4c 61 73 74 20 75 70 64 61 74 65    /* Last update
1d20: 20 73 74 61 74 65 6d 65 6e 74 20 28 6f 72 20 4e   statement (or N
1d30: 55 4c 4c 29 20 2a 2f 0a 20 20 52 62 75 55 70 64  ULL) */.  RbuUpd
1d40: 61 74 65 53 74 6d 74 20 2a 70 4e 65 78 74 3b 0a  ateStmt *pNext;.
1d50: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 74 65  };../*.** An ite
1d60: 72 61 74 6f 72 20 6f 66 20 74 68 69 73 20 74 79  rator of this ty
1d70: 70 65 20 69 73 20 75 73 65 64 20 74 6f 20 69 74  pe is used to it
1d80: 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 61 6c  erate through al
1d90: 6c 20 6f 62 6a 65 63 74 73 20 69 6e 0a 2a 2a 20  l objects in.** 
1da0: 74 68 65 20 74 61 72 67 65 74 20 64 61 74 61 62  the target datab
1db0: 61 73 65 20 74 68 61 74 20 72 65 71 75 69 72 65  ase that require
1dc0: 20 75 70 64 61 74 69 6e 67 2e 20 46 6f 72 20 65   updating. For e
1dd0: 61 63 68 20 73 75 63 68 20 74 61 62 6c 65 2c 20  ach such table, 
1de0: 74 68 65 0a 2a 2a 20 69 74 65 72 61 74 6f 72 20  the.** iterator 
1df0: 76 69 73 69 74 73 2c 20 69 6e 20 6f 72 64 65 72  visits, in order
1e00: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 74 68  :.**.**     * th
1e10: 65 20 74 61 62 6c 65 20 69 74 73 65 6c 66 2c 20  e table itself, 
1e20: 0a 2a 2a 20 20 20 20 20 2a 20 65 61 63 68 20 69  .**     * each i
1e30: 6e 64 65 78 20 6f 66 20 74 68 65 20 74 61 62 6c  ndex of the tabl
1e40: 65 20 28 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20  e (zero or more 
1e50: 70 6f 69 6e 74 73 20 74 6f 20 76 69 73 69 74 29  points to visit)
1e60: 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 2a 20 61  , and.**     * a
1e70: 20 73 70 65 63 69 61 6c 20 22 63 6c 65 61 6e 75   special "cleanu
1e80: 70 20 74 61 62 6c 65 22 20 73 74 61 74 65 2e 0a  p table" state..
1e90: 2a 2a 0a 2a 2a 20 61 62 49 6e 64 65 78 65 64 3a  **.** abIndexed:
1ea0: 0a 2a 2a 20 20 20 49 66 20 74 68 65 20 74 61 62  .**   If the tab
1eb0: 6c 65 20 68 61 73 20 6e 6f 20 69 6e 64 65 78 65  le has no indexe
1ec0: 73 20 6f 6e 20 69 74 2c 20 61 62 49 6e 64 65 78  s on it, abIndex
1ed0: 65 64 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  ed is set to NUL
1ee0: 4c 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a  L. Otherwise,.**
1ef0: 20 20 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20     it points to 
1f00: 61 6e 20 61 72 72 61 79 20 6f 66 20 66 6c 61 67  an array of flag
1f10: 73 20 6e 54 62 6c 43 6f 6c 20 65 6c 65 6d 65 6e  s nTblCol elemen
1f20: 74 73 20 69 6e 20 73 69 7a 65 2e 20 54 68 65 20  ts in size. The 
1f30: 66 6c 61 67 20 69 73 0a 2a 2a 20 20 20 73 65 74  flag is.**   set
1f40: 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e   for each column
1f50: 20 74 68 61 74 20 69 73 20 65 69 74 68 65 72 20   that is either 
1f60: 61 20 70 61 72 74 20 6f 66 20 74 68 65 20 50 4b  a part of the PK
1f70: 20 6f 72 20 61 20 70 61 72 74 20 6f 66 20 61 6e   or a part of an
1f80: 0a 2a 2a 20 20 20 69 6e 64 65 78 2e 20 4f 72 20  .**   index. Or 
1f90: 63 6c 65 61 72 20 6f 74 68 65 72 77 69 73 65 2e  clear otherwise.
1fa0: 0a 2a 2a 20 20 20 0a 2a 2f 0a 73 74 72 75 63 74  .**   .*/.struct
1fb0: 20 52 62 75 4f 62 6a 49 74 65 72 20 7b 0a 20 20   RbuObjIter {.  
1fc0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 54  sqlite3_stmt *pT
1fd0: 62 6c 49 74 65 72 3b 20 20 20 20 20 20 20 20 20  blIter;         
1fe0: 2f 2a 20 49 74 65 72 61 74 65 20 74 68 72 6f 75  /* Iterate throu
1ff0: 67 68 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 73  gh tables */.  s
2000: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 49 64  qlite3_stmt *pId
2010: 78 49 74 65 72 3b 20 20 20 20 20 20 20 20 20 2f  xIter;         /
2020: 2a 20 49 6e 64 65 78 20 69 74 65 72 61 74 6f 72  * Index iterator
2030: 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 62 6c 43 6f   */.  int nTblCo
2040: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
2050: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
2060: 20 61 7a 54 62 6c 43 6f 6c 5b 5d 20 61 72 72 61   azTblCol[] arra
2070: 79 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a  y */.  char **az
2080: 54 62 6c 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  TblCol;         
2090: 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
20a0: 6f 66 20 75 6e 71 75 6f 74 65 64 20 74 61 72 67  of unquoted targ
20b0: 65 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  et column names 
20c0: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a 54 62  */.  char **azTb
20d0: 6c 54 79 70 65 3b 20 20 20 20 20 20 20 20 20 20  lType;          
20e0: 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
20f0: 20 74 61 72 67 65 74 20 63 6f 6c 75 6d 6e 20 74   target column t
2100: 79 70 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 61  ypes */.  int *a
2110: 69 53 72 63 4f 72 64 65 72 3b 20 20 20 20 20 20  iSrcOrder;      
2120: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 72 63            /* src
2130: 20 74 61 62 6c 65 20 63 6f 6c 20 2d 3e 20 74 61   table col -> ta
2140: 72 67 65 74 20 74 61 62 6c 65 20 63 6f 6c 20 2a  rget table col *
2150: 2f 0a 20 20 75 38 20 2a 61 62 54 62 6c 50 6b 3b  /.  u8 *abTblPk;
2160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2170: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
2180: 66 6c 61 67 73 2c 20 73 65 74 20 6f 6e 20 74 61  flags, set on ta
2190: 72 67 65 74 20 50 4b 20 63 6f 6c 75 6d 6e 73 20  rget PK columns 
21a0: 2a 2f 0a 20 20 75 38 20 2a 61 62 4e 6f 74 4e 75  */.  u8 *abNotNu
21b0: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
21c0: 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
21d0: 20 66 6c 61 67 73 2c 20 73 65 74 20 6f 6e 20 4e   flags, set on N
21e0: 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73 20  OT NULL columns 
21f0: 2a 2f 0a 20 20 75 38 20 2a 61 62 49 6e 64 65 78  */.  u8 *abIndex
2200: 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ed;             
2210: 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
2220: 20 66 6c 61 67 73 2c 20 73 65 74 20 6f 6e 20 69   flags, set on i
2230: 6e 64 65 78 65 64 20 26 20 50 4b 20 63 6f 6c 73  ndexed & PK cols
2240: 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 3b   */.  int eType;
2250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2260: 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74        /* Table t
2270: 79 70 65 20 2d 20 61 6e 20 52 42 55 5f 50 4b 5f  ype - an RBU_PK_
2280: 58 58 58 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20  XXX value */..  
2290: 2f 2a 20 4f 75 74 70 75 74 20 76 61 72 69 61 62  /* Output variab
22a0: 6c 65 73 2e 20 7a 54 62 6c 3d 3d 30 20 69 6d 70  les. zTbl==0 imp
22b0: 6c 69 65 73 20 45 4f 46 2e 20 2a 2f 0a 20 20 69  lies EOF. */.  i
22c0: 6e 74 20 62 43 6c 65 61 6e 75 70 3b 20 20 20 20  nt bCleanup;    
22d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22e0: 2a 20 54 72 75 65 20 69 6e 20 22 63 6c 65 61 6e  * True in "clean
22f0: 75 70 22 20 73 74 61 74 65 20 2a 2f 0a 20 20 63  up" state */.  c
2300: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 62 6c 3b  onst char *zTbl;
2310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2320: 2a 20 4e 61 6d 65 20 6f 66 20 74 61 72 67 65 74  * Name of target
2330: 20 64 62 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63   db table */.  c
2340: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61 74 61  onst char *zData
2350: 54 62 6c 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Tbl;           /
2360: 2a 20 4e 61 6d 65 20 6f 66 20 72 62 75 20 64 62  * Name of rbu db
2370: 20 74 61 62 6c 65 20 28 6f 72 20 6e 75 6c 6c 29   table (or null)
2380: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
2390: 20 2a 7a 49 64 78 3b 20 20 20 20 20 20 20 20 20   *zIdx;         
23a0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
23b0: 20 74 61 72 67 65 74 20 64 62 20 69 6e 64 65 78   target db index
23c0: 20 28 6f 72 20 6e 75 6c 6c 29 20 2a 2f 0a 20 20   (or null) */.  
23d0: 69 6e 74 20 69 54 6e 75 6d 3b 20 20 20 20 20 20  int iTnum;      
23e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f0: 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20  /* Root page of 
2400: 63 75 72 72 65 6e 74 20 6f 62 6a 65 63 74 20 2a  current object *
2410: 2f 0a 20 20 69 6e 74 20 69 50 6b 54 6e 75 6d 3b  /.  int iPkTnum;
2420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2430: 20 20 20 20 2f 2a 20 49 66 20 65 54 79 70 65 3d      /* If eType=
2440: 3d 45 58 54 45 52 4e 41 4c 2c 20 72 6f 6f 74 20  =EXTERNAL, root 
2450: 6f 66 20 50 4b 20 69 6e 64 65 78 20 2a 2f 0a 20  of PK index */. 
2460: 20 69 6e 74 20 62 55 6e 69 71 75 65 3b 20 20 20   int bUnique;   
2470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2480: 20 2f 2a 20 43 75 72 72 65 6e 74 20 69 6e 64 65   /* Current inde
2490: 78 20 69 73 20 75 6e 69 71 75 65 20 2a 2f 0a 20  x is unique */. 
24a0: 20 69 6e 74 20 6e 49 6e 64 65 78 3b 20 20 20 20   int nIndex;    
24b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 75   /* Number of au
24d0: 78 2e 20 69 6e 64 65 78 65 73 20 6f 6e 20 74 61  x. indexes on ta
24e0: 62 6c 65 20 7a 54 62 6c 20 2a 2f 0a 0a 20 20 2f  ble zTbl */..  /
24f0: 2a 20 53 74 61 74 65 6d 65 6e 74 73 20 63 72 65  * Statements cre
2500: 61 74 65 64 20 62 79 20 72 62 75 4f 62 6a 49 74  ated by rbuObjIt
2510: 65 72 50 72 65 70 61 72 65 41 6c 6c 28 29 20 2a  erPrepareAll() *
2520: 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20  /.  int nCol;   
2530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2540: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2550: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 63 75 72 72   columns in curr
2560: 65 6e 74 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ent object */.  
2570: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
2580: 65 6c 65 63 74 3b 20 20 20 20 20 20 20 20 20 20  elect;          
2590: 2f 2a 20 53 6f 75 72 63 65 20 64 61 74 61 20 2a  /* Source data *
25a0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  /.  sqlite3_stmt
25b0: 20 2a 70 49 6e 73 65 72 74 3b 20 20 20 20 20 20   *pInsert;      
25c0: 20 20 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74      /* Statement
25d0: 20 66 6f 72 20 49 4e 53 45 52 54 20 6f 70 65 72   for INSERT oper
25e0: 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 73 71 6c 69  ations */.  sqli
25f0: 74 65 33 5f 73 74 6d 74 20 2a 70 44 65 6c 65 74  te3_stmt *pDelet
2600: 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  e;          /* S
2610: 74 61 74 65 6d 65 6e 74 20 66 6f 72 20 44 45 4c  tatement for DEL
2620: 45 54 45 20 6f 70 73 20 2a 2f 0a 20 20 73 71 6c  ETE ops */.  sql
2630: 69 74 65 33 5f 73 74 6d 74 20 2a 70 54 6d 70 49  ite3_stmt *pTmpI
2640: 6e 73 65 72 74 3b 20 20 20 20 20 20 20 2f 2a 20  nsert;       /* 
2650: 49 6e 73 65 72 74 20 69 6e 74 6f 20 72 62 75 5f  Insert into rbu_
2660: 74 6d 70 5f 24 7a 44 61 74 61 54 62 6c 20 2a 2f  tmp_$zDataTbl */
2670: 0a 0a 20 20 2f 2a 20 4c 61 73 74 20 55 50 44 41  ..  /* Last UPDA
2680: 54 45 20 75 73 65 64 20 28 66 6f 72 20 50 4b 20  TE used (for PK 
2690: 62 2d 74 72 65 65 20 75 70 64 61 74 65 73 20 6f  b-tree updates o
26a0: 6e 6c 79 29 2c 20 6f 72 20 4e 55 4c 4c 2e 20 2a  nly), or NULL. *
26b0: 2f 0a 20 20 52 62 75 55 70 64 61 74 65 53 74 6d  /.  RbuUpdateStm
26c0: 74 20 2a 70 52 62 75 55 70 64 61 74 65 3b 0a 7d  t *pRbuUpdate;.}
26d0: 3b 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c 75 65 73 20  ;../*.** Values 
26e0: 66 6f 72 20 52 62 75 4f 62 6a 49 74 65 72 2e 65  for RbuObjIter.e
26f0: 54 79 70 65 0a 2a 2a 0a 2a 2a 20 20 20 20 20 30  Type.**.**     0
2700: 3a 20 54 61 62 6c 65 20 64 6f 65 73 20 6e 6f 74  : Table does not
2710: 20 65 78 69 73 74 20 28 65 72 72 6f 72 29 0a 2a   exist (error).*
2720: 2a 20 20 20 20 20 31 3a 20 54 61 62 6c 65 20 68  *     1: Table h
2730: 61 73 20 61 6e 20 69 6d 70 6c 69 63 69 74 20 72  as an implicit r
2740: 6f 77 69 64 2e 0a 2a 2a 20 20 20 20 20 32 3a 20  owid..**     2: 
2750: 54 61 62 6c 65 20 68 61 73 20 61 6e 20 65 78 70  Table has an exp
2760: 6c 69 63 69 74 20 49 50 4b 20 63 6f 6c 75 6d 6e  licit IPK column
2770: 2e 0a 2a 2a 20 20 20 20 20 33 3a 20 54 61 62 6c  ..**     3: Tabl
2780: 65 20 68 61 73 20 61 6e 20 65 78 74 65 72 6e 61  e has an externa
2790: 6c 20 50 4b 20 69 6e 64 65 78 2e 0a 2a 2a 20 20  l PK index..**  
27a0: 20 20 20 34 3a 20 54 61 62 6c 65 20 69 73 20 57     4: Table is W
27b0: 49 54 48 4f 55 54 20 52 4f 57 49 44 2e 0a 2a 2a  ITHOUT ROWID..**
27c0: 20 20 20 20 20 35 3a 20 54 61 62 6c 65 20 69 73       5: Table is
27d0: 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
27e0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 52 42 55  ..*/.#define RBU
27f0: 5f 50 4b 5f 4e 4f 54 41 42 4c 45 20 20 20 20 20  _PK_NOTABLE     
2800: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 52 42 55     0.#define RBU
2810: 5f 50 4b 5f 4e 4f 4e 45 20 20 20 20 20 20 20 20  _PK_NONE        
2820: 20 20 20 31 0a 23 64 65 66 69 6e 65 20 52 42 55     1.#define RBU
2830: 5f 50 4b 5f 49 50 4b 20 20 20 20 20 20 20 20 20  _PK_IPK         
2840: 20 20 20 32 0a 23 64 65 66 69 6e 65 20 52 42 55     2.#define RBU
2850: 5f 50 4b 5f 45 58 54 45 52 4e 41 4c 20 20 20 20  _PK_EXTERNAL    
2860: 20 20 20 33 0a 23 64 65 66 69 6e 65 20 52 42 55     3.#define RBU
2870: 5f 50 4b 5f 57 49 54 48 4f 55 54 5f 52 4f 57 49  _PK_WITHOUT_ROWI
2880: 44 20 20 34 0a 23 64 65 66 69 6e 65 20 52 42 55  D  4.#define RBU
2890: 5f 50 4b 5f 56 54 41 42 20 20 20 20 20 20 20 20  _PK_VTAB        
28a0: 20 20 20 35 0a 0a 0a 2f 2a 0a 2a 2a 20 57 69 74     5.../*.** Wit
28b0: 68 69 6e 20 74 68 65 20 52 42 55 5f 53 54 41 47  hin the RBU_STAG
28c0: 45 5f 4f 41 4c 20 73 74 61 67 65 2c 20 65 61 63  E_OAL stage, eac
28d0: 68 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  h call to sqlite
28e0: 33 72 62 75 5f 73 74 65 70 28 29 20 70 65 72 66  3rbu_step() perf
28f0: 6f 72 6d 73 0a 2a 2a 20 6f 6e 65 20 6f 66 20 74  orms.** one of t
2900: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70 65  he following ope
2910: 72 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 23 64 65 66  rations..*/.#def
2920: 69 6e 65 20 52 42 55 5f 49 4e 53 45 52 54 20 20  ine RBU_INSERT  
2930: 20 20 20 31 20 20 20 20 20 20 20 20 20 20 2f 2a     1          /*
2940: 20 49 6e 73 65 72 74 20 6f 6e 20 61 20 6d 61 69   Insert on a mai
2950: 6e 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20 2a  n table b-tree *
2960: 2f 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 44 45  /.#define RBU_DE
2970: 4c 45 54 45 20 20 20 20 20 32 20 20 20 20 20 20  LETE     2      
2980: 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 20      /* Delete a 
2990: 72 6f 77 20 66 72 6f 6d 20 61 20 6d 61 69 6e 20  row from a main 
29a0: 74 61 62 6c 65 20 62 2d 74 72 65 65 20 2a 2f 0a  table b-tree */.
29b0: 23 64 65 66 69 6e 65 20 52 42 55 5f 52 45 50 4c  #define RBU_REPL
29c0: 41 43 45 20 20 20 20 33 20 20 20 20 20 20 20 20  ACE    3        
29d0: 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6e 64 20    /* Delete and 
29e0: 74 68 65 6e 20 69 6e 73 65 72 74 20 61 20 72 6f  then insert a ro
29f0: 77 20 2a 2f 0a 23 64 65 66 69 6e 65 20 52 42 55  w */.#define RBU
2a00: 5f 49 44 58 5f 44 45 4c 45 54 45 20 34 20 20 20  _IDX_DELETE 4   
2a10: 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65         /* Delete
2a20: 20 61 20 72 6f 77 20 66 72 6f 6d 20 61 6e 20 61   a row from an a
2a30: 75 78 2e 20 69 6e 64 65 78 20 62 2d 74 72 65 65  ux. index b-tree
2a40: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 52 42 55 5f   */.#define RBU_
2a50: 49 44 58 5f 49 4e 53 45 52 54 20 35 20 20 20 20  IDX_INSERT 5    
2a60: 20 20 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20        /* Insert 
2a70: 6f 6e 20 61 6e 20 61 75 78 2e 20 69 6e 64 65 78  on an aux. index
2a80: 20 62 2d 74 72 65 65 20 2a 2f 0a 0a 23 64 65 66   b-tree */..#def
2a90: 69 6e 65 20 52 42 55 5f 55 50 44 41 54 45 20 20  ine RBU_UPDATE  
2aa0: 20 20 20 36 20 20 20 20 20 20 20 20 20 20 2f 2a     6          /*
2ab0: 20 55 70 64 61 74 65 20 61 20 72 6f 77 20 69 6e   Update a row in
2ac0: 20 61 20 6d 61 69 6e 20 74 61 62 6c 65 20 62 2d   a main table b-
2ad0: 74 72 65 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41  tree */../*.** A
2ae0: 20 73 69 6e 67 6c 65 20 73 74 65 70 20 6f 66 20   single step of 
2af0: 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 63  an incremental c
2b00: 68 65 63 6b 70 6f 69 6e 74 20 2d 20 66 72 61 6d  heckpoint - fram
2b10: 65 20 69 57 61 6c 46 72 61 6d 65 20 6f 66 20 74  e iWalFrame of t
2b20: 68 65 20 77 61 6c 0a 2a 2a 20 66 69 6c 65 20 73  he wal.** file s
2b30: 68 6f 75 6c 64 20 62 65 20 63 6f 70 69 65 64 20  hould be copied 
2b40: 74 6f 20 70 61 67 65 20 69 44 62 50 61 67 65 20  to page iDbPage 
2b50: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
2b60: 66 69 6c 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  file..*/.struct 
2b70: 52 62 75 46 72 61 6d 65 20 7b 0a 20 20 75 33 32  RbuFrame {.  u32
2b80: 20 69 44 62 50 61 67 65 3b 0a 20 20 75 33 32 20   iDbPage;.  u32 
2b90: 69 57 61 6c 46 72 61 6d 65 3b 0a 7d 3b 0a 0a 2f  iWalFrame;.};../
2ba0: 2a 0a 2a 2a 20 52 42 55 20 68 61 6e 64 6c 65 2e  *.** RBU handle.
2bb0: 0a 2a 2f 0a 73 74 72 75 63 74 20 73 71 6c 69 74  .*/.struct sqlit
2bc0: 65 33 72 62 75 20 7b 0a 20 20 69 6e 74 20 65 53  e3rbu {.  int eS
2bd0: 74 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  tage;           
2be0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
2bf0: 75 65 20 6f 66 20 52 42 55 5f 53 54 41 54 45 5f  ue of RBU_STATE_
2c00: 53 54 41 47 45 20 66 69 65 6c 64 20 2a 2f 0a 20  STAGE field */. 
2c10: 20 73 71 6c 69 74 65 33 20 2a 64 62 4d 61 69 6e   sqlite3 *dbMain
2c20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2c30: 20 2f 2a 20 74 61 72 67 65 74 20 64 61 74 61 62   /* target datab
2c40: 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ase handle */.  
2c50: 73 71 6c 69 74 65 33 20 2a 64 62 52 62 75 3b 20  sqlite3 *dbRbu; 
2c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c70: 2f 2a 20 72 62 75 20 64 61 74 61 62 61 73 65 20  /* rbu database 
2c80: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63 68 61 72  handle */.  char
2c90: 20 2a 7a 54 61 72 67 65 74 3b 20 20 20 20 20 20   *zTarget;      
2ca0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2cb0: 61 74 68 20 74 6f 20 74 61 72 67 65 74 20 64 62  ath to target db
2cc0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 52 62 75   */.  char *zRbu
2cd0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2ce0: 20 20 20 20 20 20 2f 2a 20 50 61 74 68 20 74 6f        /* Path to
2cf0: 20 72 62 75 20 64 62 20 2a 2f 0a 20 20 63 68 61   rbu db */.  cha
2d00: 72 20 2a 7a 53 74 61 74 65 3b 20 20 20 20 20 20  r *zState;      
2d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d20: 50 61 74 68 20 74 6f 20 73 74 61 74 65 20 64 62  Path to state db
2d30: 20 28 6f 72 20 4e 55 4c 4c 20 69 66 20 7a 52 62   (or NULL if zRb
2d40: 75 29 20 2a 2f 0a 20 20 63 68 61 72 20 7a 53 74  u) */.  char zSt
2d50: 61 74 65 44 62 5b 35 5d 3b 20 20 20 20 20 20 20  ateDb[5];       
2d60: 20 20 20 20 20 20 20 20 2f 2a 20 44 62 20 6e 61          /* Db na
2d70: 6d 65 20 66 6f 72 20 73 74 61 74 65 20 28 22 73  me for state ("s
2d80: 74 61 74 22 20 6f 72 20 22 6d 61 69 6e 22 29 20  tat" or "main") 
2d90: 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
2da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2db0: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65       /* Value re
2dc0: 74 75 72 6e 65 64 20 62 79 20 6c 61 73 74 20 72  turned by last r
2dd0: 62 75 5f 73 74 65 70 28 29 20 63 61 6c 6c 20 2a  bu_step() call *
2de0: 2f 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 6d 73  /.  char *zErrms
2df0: 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
2e00: 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 6d 65 73      /* Error mes
2e10: 73 61 67 65 20 69 66 20 72 63 21 3d 53 51 4c 49  sage if rc!=SQLI
2e20: 54 45 5f 4f 4b 20 2a 2f 0a 20 20 69 6e 74 20 6e  TE_OK */.  int n
2e30: 53 74 65 70 3b 20 20 20 20 20 20 20 20 20 20 20  Step;           
2e40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
2e50: 77 73 20 70 72 6f 63 65 73 73 65 64 20 66 6f 72  ws processed for
2e60: 20 63 75 72 72 65 6e 74 20 6f 62 6a 65 63 74 20   current object 
2e70: 2a 2f 0a 20 20 69 6e 74 20 6e 50 72 6f 67 72 65  */.  int nProgre
2e80: 73 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ss;             
2e90: 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 70 72 6f       /* Rows pro
2ea0: 63 65 73 73 65 64 20 66 6f 72 20 61 6c 6c 20 6f  cessed for all o
2eb0: 62 6a 65 63 74 73 20 2a 2f 0a 20 20 52 62 75 4f  bjects */.  RbuO
2ec0: 62 6a 49 74 65 72 20 6f 62 6a 69 74 65 72 3b 20  bjIter objiter; 
2ed0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2ee0: 74 65 72 61 74 6f 72 20 66 6f 72 20 73 6b 69 70  terator for skip
2ef0: 70 69 6e 67 20 74 68 72 6f 75 67 68 20 74 62 6c  ping through tbl
2f00: 2f 69 64 78 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  /idx */.  const 
2f10: 63 68 61 72 20 2a 7a 56 66 73 4e 61 6d 65 3b 20  char *zVfsName; 
2f20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
2f30: 65 20 6f 66 20 61 75 74 6f 6d 61 74 69 63 61 6c  e of automatical
2f40: 6c 79 20 63 72 65 61 74 65 64 20 72 62 75 20 76  ly created rbu v
2f50: 66 73 20 2a 2f 0a 20 20 72 62 75 5f 66 69 6c 65  fs */.  rbu_file
2f60: 20 2a 70 54 61 72 67 65 74 46 64 3b 20 20 20 20   *pTargetFd;    
2f70: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
2f80: 68 61 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e 20 74  handle open on t
2f90: 61 72 67 65 74 20 64 62 20 2a 2f 0a 20 20 69 36  arget db */.  i6
2fa0: 34 20 69 4f 61 6c 53 7a 3b 0a 20 20 69 36 34 20  4 iOalSz;.  i64 
2fb0: 6e 50 68 61 73 65 4f 6e 65 53 74 65 70 3b 0a 0a  nPhaseOneStep;..
2fc0: 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
2fd0: 6e 67 20 73 74 61 74 65 20 76 61 72 69 61 62 6c  ng state variabl
2fe0: 65 73 20 61 72 65 20 75 73 65 64 20 61 73 20 70  es are used as p
2ff0: 61 72 74 20 6f 66 20 74 68 65 20 69 6e 63 72 65  art of the incre
3000: 6d 65 6e 74 61 6c 0a 20 20 2a 2a 20 63 68 65 63  mental.  ** chec
3010: 6b 70 6f 69 6e 74 20 73 74 61 67 65 20 28 65 53  kpoint stage (eS
3020: 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f  tage==RBU_STAGE_
3030: 43 4b 50 54 29 2e 20 53 65 65 20 63 6f 6d 6d 65  CKPT). See comme
3040: 6e 74 73 20 73 75 72 72 6f 75 6e 64 69 6e 67 0a  nts surrounding.
3050: 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 62    ** function rb
3060: 75 53 65 74 75 70 43 68 65 63 6b 70 6f 69 6e 74  uSetupCheckpoint
3070: 28 29 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 20  () for details. 
3080: 20 2a 2f 0a 20 20 75 33 32 20 69 4d 61 78 46 72   */.  u32 iMaxFr
3090: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
30a0: 20 20 20 20 20 20 2f 2a 20 4c 61 72 67 65 73 74        /* Largest
30b0: 20 69 57 61 6c 46 72 61 6d 65 20 76 61 6c 75 65   iWalFrame value
30c0: 20 69 6e 20 61 46 72 61 6d 65 5b 5d 20 2a 2f 0a   in aFrame[] */.
30d0: 20 20 75 33 32 20 6d 4c 6f 63 6b 3b 0a 20 20 69    u32 mLock;.  i
30e0: 6e 74 20 6e 46 72 61 6d 65 3b 20 20 20 20 20 20  nt nFrame;      
30f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3100: 2a 20 45 6e 74 72 69 65 73 20 69 6e 20 61 46 72  * Entries in aFr
3110: 61 6d 65 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20  ame[] array */. 
3120: 20 69 6e 74 20 6e 46 72 61 6d 65 41 6c 6c 6f 63   int nFrameAlloc
3130: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3140: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 69   /* Allocated si
3150: 7a 65 20 6f 66 20 61 46 72 61 6d 65 5b 5d 20 61  ze of aFrame[] a
3160: 72 72 61 79 20 2a 2f 0a 20 20 52 62 75 46 72 61  rray */.  RbuFra
3170: 6d 65 20 2a 61 46 72 61 6d 65 3b 0a 20 20 69 6e  me *aFrame;.  in
3180: 74 20 70 67 73 7a 3b 0a 20 20 75 38 20 2a 61 42  t pgsz;.  u8 *aB
3190: 75 66 3b 0a 20 20 69 36 34 20 69 57 61 6c 43 6b  uf;.  i64 iWalCk
31a0: 73 75 6d 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  sum;.};../*.** A
31b0: 6e 20 72 62 75 20 56 46 53 20 69 73 20 69 6d 70  n rbu VFS is imp
31c0: 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e 67 20 61  lemented using a
31d0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
31e0: 69 73 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  is structure..*/
31f0: 0a 73 74 72 75 63 74 20 72 62 75 5f 76 66 73 20  .struct rbu_vfs 
3200: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  {.  sqlite3_vfs 
3210: 62 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  base;           
3220: 20 20 20 20 2f 2a 20 72 62 75 20 56 46 53 20 73      /* rbu VFS s
3230: 68 69 6d 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 20  him methods */. 
3240: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 52   sqlite3_vfs *pR
3250: 65 61 6c 56 66 73 3b 20 20 20 20 20 20 20 20 20  ealVfs;         
3260: 20 2f 2a 20 55 6e 64 65 72 6c 79 69 6e 67 20 56   /* Underlying V
3270: 46 53 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  FS */.  sqlite3_
3280: 6d 75 74 65 78 20 2a 6d 75 74 65 78 3b 20 20 20  mutex *mutex;   
3290: 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 74 65 78          /* Mutex
32a0: 20 74 6f 20 70 72 6f 74 65 63 74 20 70 4d 61 69   to protect pMai
32b0: 6e 20 2a 2f 0a 20 20 72 62 75 5f 66 69 6c 65 20  n */.  rbu_file 
32c0: 2a 70 4d 61 69 6e 3b 20 20 20 20 20 20 20 20 20  *pMain;         
32d0: 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 6b 65 64         /* Linked
32e0: 20 6c 69 73 74 20 6f 66 20 6d 61 69 6e 20 64 62   list of main db
32f0: 20 66 69 6c 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a   files */.};../*
3300: 0a 2a 2a 20 45 61 63 68 20 66 69 6c 65 20 6f 70  .** Each file op
3310: 65 6e 65 64 20 62 79 20 61 6e 20 72 62 75 20 56  ened by an rbu V
3320: 46 53 20 69 73 20 72 65 70 72 65 73 65 6e 74 65  FS is represente
3330: 64 20 62 79 20 61 6e 20 69 6e 73 74 61 6e 63 65  d by an instance
3340: 20 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f   of.** the follo
3350: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a  wing structure..
3360: 2a 2f 0a 73 74 72 75 63 74 20 72 62 75 5f 66 69  */.struct rbu_fi
3370: 6c 65 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66  le {.  sqlite3_f
3380: 69 6c 65 20 62 61 73 65 3b 20 20 20 20 20 20 20  ile base;       
3390: 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
33a0: 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73 20 2a  3_file methods *
33b0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
33c0: 20 2a 70 52 65 61 6c 3b 20 20 20 20 20 20 20 20   *pReal;        
33d0: 20 20 20 20 2f 2a 20 55 6e 64 65 72 6c 79 69 6e      /* Underlyin
33e0: 67 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 2a 2f  g file handle */
33f0: 0a 20 20 72 62 75 5f 76 66 73 20 2a 70 52 62 75  .  rbu_vfs *pRbu
3400: 56 66 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  Vfs;            
3410: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
3420: 20 74 68 65 20 72 62 75 5f 76 66 73 20 6f 62 6a   the rbu_vfs obj
3430: 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ect */.  sqlite3
3440: 72 62 75 20 2a 70 52 62 75 3b 20 20 20 20 20 20  rbu *pRbu;      
3450: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
3460: 74 65 72 20 74 6f 20 72 62 75 20 6f 62 6a 65 63  ter to rbu objec
3470: 74 20 28 72 62 75 20 74 61 72 67 65 74 20 6f 6e  t (rbu target on
3480: 6c 79 29 20 2a 2f 0a 0a 20 20 69 6e 74 20 6f 70  ly) */..  int op
3490: 65 6e 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  enFlags;        
34a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
34b0: 67 73 20 74 68 69 73 20 66 69 6c 65 20 77 61 73  gs this file was
34c0: 20 6f 70 65 6e 65 64 20 77 69 74 68 20 2a 2f 0a   opened with */.
34d0: 20 20 75 33 32 20 69 43 6f 6f 6b 69 65 3b 20 20    u32 iCookie;  
34e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34f0: 20 20 2f 2a 20 43 6f 6f 6b 69 65 20 76 61 6c 75    /* Cookie valu
3500: 65 20 66 6f 72 20 6d 61 69 6e 20 64 62 20 66 69  e for main db fi
3510: 6c 65 73 20 2a 2f 0a 20 20 75 38 20 69 57 72 69  les */.  u8 iWri
3520: 74 65 56 65 72 3b 20 20 20 20 20 20 20 20 20 20  teVer;          
3530: 20 20 20 20 20 20 20 20 20 2f 2a 20 22 77 72 69           /* "wri
3540: 74 65 2d 76 65 72 73 69 6f 6e 22 20 76 61 6c 75  te-version" valu
3550: 65 20 66 6f 72 20 6d 61 69 6e 20 64 62 20 66 69  e for main db fi
3560: 6c 65 73 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 53  les */..  int nS
3570: 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  hm;             
3580: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
3590: 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
35a0: 6e 20 61 70 53 68 6d 5b 5d 20 61 72 72 61 79 20  n apShm[] array 
35b0: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 70 53 68  */.  char **apSh
35c0: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
35d0: 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
35e0: 20 6d 6d 61 70 27 64 20 2a 2d 73 68 6d 20 72 65   mmap'd *-shm re
35f0: 67 69 6f 6e 73 20 2a 2f 0a 20 20 63 68 61 72 20  gions */.  char 
3600: 2a 7a 44 65 6c 3b 20 20 20 20 20 20 20 20 20 20  *zDel;          
3610: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
3620: 6c 65 74 65 20 74 68 69 73 20 77 68 65 6e 20 63  lete this when c
3630: 6c 6f 73 69 6e 67 20 66 69 6c 65 20 2a 2f 0a 0a  losing file */..
3640: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 57    const char *zW
3650: 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
3660: 20 20 2f 2a 20 57 61 6c 20 66 69 6c 65 6e 61 6d    /* Wal filenam
3670: 65 20 66 6f 72 20 74 68 69 73 20 6d 61 69 6e 20  e for this main 
3680: 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20 72 62 75  db file */.  rbu
3690: 5f 66 69 6c 65 20 2a 70 57 61 6c 46 64 3b 20 20  _file *pWalFd;  
36a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
36b0: 57 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70  Wal file descrip
36c0: 74 6f 72 20 66 6f 72 20 74 68 69 73 20 6d 61 69  tor for this mai
36d0: 6e 20 64 62 20 2a 2f 0a 20 20 72 62 75 5f 66 69  n db */.  rbu_fi
36e0: 6c 65 20 2a 70 4d 61 69 6e 4e 65 78 74 3b 20 20  le *pMainNext;  
36f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78            /* Nex
3700: 74 20 4d 41 49 4e 5f 44 42 20 66 69 6c 65 20 2a  t MAIN_DB file *
3710: 2f 0a 7d 3b 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  /.};.../********
3720: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3730: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3740: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3750: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3760: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
3770: 6e 67 20 74 68 72 65 65 20 66 75 6e 63 74 69 6f  ng three functio
3780: 6e 73 2c 20 66 6f 75 6e 64 20 62 65 6c 6f 77 3a  ns, found below:
3790: 0a 2a 2a 0a 2a 2a 20 20 20 72 62 75 44 65 6c 74  .**.**   rbuDelt
37a0: 61 47 65 74 49 6e 74 28 29 0a 2a 2a 20 20 20 72  aGetInt().**   r
37b0: 62 75 44 65 6c 74 61 43 68 65 63 6b 73 75 6d 28  buDeltaChecksum(
37c0: 29 0a 2a 2a 20 20 20 72 62 75 44 65 6c 74 61 41  ).**   rbuDeltaA
37d0: 70 70 6c 79 28 29 0a 2a 2a 0a 2a 2a 20 61 72 65  pply().**.** are
37e0: 20 6c 69 66 74 65 64 20 66 72 6f 6d 20 74 68 65   lifted from the
37f0: 20 66 6f 73 73 69 6c 20 73 6f 75 72 63 65 20 63   fossil source c
3800: 6f 64 65 20 28 68 74 74 70 3a 2f 2f 66 6f 73 73  ode (http://foss
3810: 69 6c 2d 73 63 6d 2e 6f 72 67 29 2e 20 54 68 65  il-scm.org). The
3820: 79 0a 2a 2a 20 61 72 65 20 75 73 65 64 20 74 6f  y.** are used to
3830: 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 73   implement the s
3840: 63 61 6c 61 72 20 53 51 4c 20 66 75 6e 63 74 69  calar SQL functi
3850: 6f 6e 20 72 62 75 5f 66 6f 73 73 69 6c 5f 64 65  on rbu_fossil_de
3860: 6c 74 61 28 29 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a  lta()..*/../*.**
3870: 20 52 65 61 64 20 62 79 74 65 73 20 66 72 6f 6d   Read bytes from
3880: 20 2a 70 7a 20 61 6e 64 20 63 6f 6e 76 65 72 74   *pz and convert
3890: 20 74 68 65 6d 20 69 6e 74 6f 20 61 20 70 6f 73   them into a pos
38a0: 69 74 69 76 65 20 69 6e 74 65 67 65 72 2e 20 20  itive integer.  
38b0: 57 68 65 6e 0a 2a 2a 20 66 69 6e 69 73 68 65 64  When.** finished
38c0: 2c 20 6c 65 61 76 65 20 2a 70 7a 20 70 6f 69 6e  , leave *pz poin
38d0: 74 69 6e 67 20 74 6f 20 74 68 65 20 66 69 72 73  ting to the firs
38e0: 74 20 63 68 61 72 61 63 74 65 72 20 70 61 73 74  t character past
38f0: 20 74 68 65 20 65 6e 64 20 6f 66 0a 2a 2a 20 74   the end of.** t
3900: 68 65 20 69 6e 74 65 67 65 72 2e 20 20 54 68 65  he integer.  The
3910: 20 2a 70 4c 65 6e 20 70 61 72 61 6d 65 74 65 72   *pLen parameter
3920: 20 68 6f 6c 64 73 20 74 68 65 20 6c 65 6e 67 74   holds the lengt
3930: 68 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67 0a  h of the string.
3940: 2a 2a 20 69 6e 20 2a 70 7a 20 61 6e 64 20 69 73  ** in *pz and is
3950: 20 64 65 63 72 65 6d 65 6e 74 65 64 20 6f 6e 63   decremented onc
3960: 65 20 66 6f 72 20 65 61 63 68 20 63 68 61 72 61  e for each chara
3970: 63 74 65 72 20 69 6e 20 74 68 65 20 69 6e 74 65  cter in the inte
3980: 67 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  ger..*/.static u
3990: 6e 73 69 67 6e 65 64 20 69 6e 74 20 72 62 75 44  nsigned int rbuD
39a0: 65 6c 74 61 47 65 74 49 6e 74 28 63 6f 6e 73 74  eltaGetInt(const
39b0: 20 63 68 61 72 20 2a 2a 70 7a 2c 20 69 6e 74 20   char **pz, int 
39c0: 2a 70 4c 65 6e 29 7b 0a 20 20 73 74 61 74 69 63  *pLen){.  static
39d0: 20 63 6f 6e 73 74 20 73 69 67 6e 65 64 20 63 68   const signed ch
39e0: 61 72 20 7a 56 61 6c 75 65 5b 5d 20 3d 20 7b 0a  ar zValue[] = {.
39f0: 20 20 20 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20      -1, -1, -1, 
3a00: 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20  -1, -1, -1, -1, 
3a10: 2d 31 2c 20 20 20 2d 31 2c 20 2d 31 2c 20 2d 31  -1,   -1, -1, -1
3a20: 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31  , -1, -1, -1, -1
3a30: 2c 20 2d 31 2c 0a 20 20 20 20 2d 31 2c 20 2d 31  , -1,.    -1, -1
3a40: 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31  , -1, -1, -1, -1
3a50: 2c 20 2d 31 2c 20 2d 31 2c 20 20 20 2d 31 2c 20  , -1, -1,   -1, 
3a60: 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20  -1, -1, -1, -1, 
3a70: 2d 31 2c 20 2d 31 2c 20 2d 31 2c 0a 20 20 20 20  -1, -1, -1,.    
3a80: 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20  -1, -1, -1, -1, 
3a90: 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20  -1, -1, -1, -1, 
3aa0: 20 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31    -1, -1, -1, -1
3ab0: 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31  , -1, -1, -1, -1
3ac0: 2c 0a 20 20 20 20 20 30 2c 20 20 31 2c 20 20 32  ,.     0,  1,  2
3ad0: 2c 20 20 33 2c 20 20 34 2c 20 20 35 2c 20 20 36  ,  3,  4,  5,  6
3ae0: 2c 20 20 37 2c 20 20 20 20 38 2c 20 20 39 2c 20  ,  7,    8,  9, 
3af0: 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20  -1, -1, -1, -1, 
3b00: 2d 31 2c 20 2d 31 2c 0a 20 20 20 20 2d 31 2c 20  -1, -1,.    -1, 
3b10: 31 30 2c 20 31 31 2c 20 31 32 2c 20 31 33 2c 20  10, 11, 12, 13, 
3b20: 31 34 2c 20 31 35 2c 20 31 36 2c 20 20 20 31 37  14, 15, 16,   17
3b30: 2c 20 31 38 2c 20 31 39 2c 20 32 30 2c 20 32 31  , 18, 19, 20, 21
3b40: 2c 20 32 32 2c 20 32 33 2c 20 32 34 2c 0a 20 20  , 22, 23, 24,.  
3b50: 20 20 32 35 2c 20 32 36 2c 20 32 37 2c 20 32 38    25, 26, 27, 28
3b60: 2c 20 32 39 2c 20 33 30 2c 20 33 31 2c 20 33 32  , 29, 30, 31, 32
3b70: 2c 20 20 20 33 33 2c 20 33 34 2c 20 33 35 2c 20  ,   33, 34, 35, 
3b80: 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20  -1, -1, -1, -1, 
3b90: 33 36 2c 0a 20 20 20 20 2d 31 2c 20 33 37 2c 20  36,.    -1, 37, 
3ba0: 33 38 2c 20 33 39 2c 20 34 30 2c 20 34 31 2c 20  38, 39, 40, 41, 
3bb0: 34 32 2c 20 34 33 2c 20 20 20 34 34 2c 20 34 35  42, 43,   44, 45
3bc0: 2c 20 34 36 2c 20 34 37 2c 20 34 38 2c 20 34 39  , 46, 47, 48, 49
3bd0: 2c 20 35 30 2c 20 35 31 2c 0a 20 20 20 20 35 32  , 50, 51,.    52
3be0: 2c 20 35 33 2c 20 35 34 2c 20 35 35 2c 20 35 36  , 53, 54, 55, 56
3bf0: 2c 20 35 37 2c 20 35 38 2c 20 35 39 2c 20 20 20  , 57, 58, 59,   
3c00: 36 30 2c 20 36 31 2c 20 36 32 2c 20 2d 31 2c 20  60, 61, 62, -1, 
3c10: 2d 31 2c 20 2d 31 2c 20 36 33 2c 20 2d 31 2c 0a  -1, -1, 63, -1,.
3c20: 20 20 7d 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20    };.  unsigned 
3c30: 69 6e 74 20 76 20 3d 20 30 3b 0a 20 20 69 6e 74  int v = 0;.  int
3c40: 20 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   c;.  unsigned c
3c50: 68 61 72 20 2a 7a 20 3d 20 28 75 6e 73 69 67 6e  har *z = (unsign
3c60: 65 64 20 63 68 61 72 2a 29 2a 70 7a 3b 0a 20 20  ed char*)*pz;.  
3c70: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
3c80: 53 74 61 72 74 20 3d 20 7a 3b 0a 20 20 77 68 69  Start = z;.  whi
3c90: 6c 65 28 20 28 63 20 3d 20 7a 56 61 6c 75 65 5b  le( (c = zValue[
3ca0: 30 78 37 66 26 2a 28 7a 2b 2b 29 5d 29 3e 3d 30  0x7f&*(z++)])>=0
3cb0: 20 29 7b 0a 20 20 20 20 20 76 20 3d 20 28 76 3c   ){.     v = (v<
3cc0: 3c 36 29 20 2b 20 63 3b 0a 20 20 7d 0a 20 20 7a  <6) + c;.  }.  z
3cd0: 2d 2d 3b 0a 20 20 2a 70 4c 65 6e 20 2d 3d 20 7a  --;.  *pLen -= z
3ce0: 20 2d 20 7a 53 74 61 72 74 3b 0a 20 20 2a 70 7a   - zStart;.  *pz
3cf0: 20 3d 20 28 63 68 61 72 2a 29 7a 3b 0a 20 20 72   = (char*)z;.  r
3d00: 65 74 75 72 6e 20 76 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn v;.}../*.*
3d10: 2a 20 43 6f 6d 70 75 74 65 20 61 20 33 32 2d 62  * Compute a 32-b
3d20: 69 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20 74  it checksum on t
3d30: 68 65 20 4e 2d 62 79 74 65 20 62 75 66 66 65 72  he N-byte buffer
3d40: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 72 65  .  Return the re
3d50: 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sult..*/.static 
3d60: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 72 62 75  unsigned int rbu
3d70: 44 65 6c 74 61 43 68 65 63 6b 73 75 6d 28 63 6f  DeltaChecksum(co
3d80: 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 2c 20 73  nst char *zIn, s
3d90: 69 7a 65 5f 74 20 4e 29 7b 0a 20 20 63 6f 6e 73  ize_t N){.  cons
3da0: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
3db0: 2a 7a 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69  *z = (const unsi
3dc0: 67 6e 65 64 20 63 68 61 72 20 2a 29 7a 49 6e 3b  gned char *)zIn;
3dd0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 73 75 6d 30  .  unsigned sum0
3de0: 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64   = 0;.  unsigned
3df0: 20 73 75 6d 31 20 3d 20 30 3b 0a 20 20 75 6e 73   sum1 = 0;.  uns
3e00: 69 67 6e 65 64 20 73 75 6d 32 20 3d 20 30 3b 0a  igned sum2 = 0;.
3e10: 20 20 75 6e 73 69 67 6e 65 64 20 73 75 6d 33 20    unsigned sum3 
3e20: 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 4e 20 3e  = 0;.  while(N >
3e30: 3d 20 31 36 29 7b 0a 20 20 20 20 73 75 6d 30 20  = 16){.    sum0 
3e40: 2b 3d 20 28 28 75 6e 73 69 67 6e 65 64 29 7a 5b  += ((unsigned)z[
3e50: 30 5d 20 2b 20 7a 5b 34 5d 20 2b 20 7a 5b 38 5d  0] + z[4] + z[8]
3e60: 20 2b 20 7a 5b 31 32 5d 29 3b 0a 20 20 20 20 73   + z[12]);.    s
3e70: 75 6d 31 20 2b 3d 20 28 28 75 6e 73 69 67 6e 65  um1 += ((unsigne
3e80: 64 29 7a 5b 31 5d 20 2b 20 7a 5b 35 5d 20 2b 20  d)z[1] + z[5] + 
3e90: 7a 5b 39 5d 20 2b 20 7a 5b 31 33 5d 29 3b 0a 20  z[9] + z[13]);. 
3ea0: 20 20 20 73 75 6d 32 20 2b 3d 20 28 28 75 6e 73     sum2 += ((uns
3eb0: 69 67 6e 65 64 29 7a 5b 32 5d 20 2b 20 7a 5b 36  igned)z[2] + z[6
3ec0: 5d 20 2b 20 7a 5b 31 30 5d 2b 20 7a 5b 31 34 5d  ] + z[10]+ z[14]
3ed0: 29 3b 0a 20 20 20 20 73 75 6d 33 20 2b 3d 20 28  );.    sum3 += (
3ee0: 28 75 6e 73 69 67 6e 65 64 29 7a 5b 33 5d 20 2b  (unsigned)z[3] +
3ef0: 20 7a 5b 37 5d 20 2b 20 7a 5b 31 31 5d 2b 20 7a   z[7] + z[11]+ z
3f00: 5b 31 35 5d 29 3b 0a 20 20 20 20 7a 20 2b 3d 20  [15]);.    z += 
3f10: 31 36 3b 0a 20 20 20 20 4e 20 2d 3d 20 31 36 3b  16;.    N -= 16;
3f20: 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 4e 20 3e  .  }.  while(N >
3f30: 3d 20 34 29 7b 0a 20 20 20 20 73 75 6d 30 20 2b  = 4){.    sum0 +
3f40: 3d 20 7a 5b 30 5d 3b 0a 20 20 20 20 73 75 6d 31  = z[0];.    sum1
3f50: 20 2b 3d 20 7a 5b 31 5d 3b 0a 20 20 20 20 73 75   += z[1];.    su
3f60: 6d 32 20 2b 3d 20 7a 5b 32 5d 3b 0a 20 20 20 20  m2 += z[2];.    
3f70: 73 75 6d 33 20 2b 3d 20 7a 5b 33 5d 3b 0a 20 20  sum3 += z[3];.  
3f80: 20 20 7a 20 2b 3d 20 34 3b 0a 20 20 20 20 4e 20    z += 4;.    N 
3f90: 2d 3d 20 34 3b 0a 20 20 7d 0a 20 20 73 75 6d 33  -= 4;.  }.  sum3
3fa0: 20 2b 3d 20 28 73 75 6d 32 20 3c 3c 20 38 29 20   += (sum2 << 8) 
3fb0: 2b 20 28 73 75 6d 31 20 3c 3c 20 31 36 29 20 2b  + (sum1 << 16) +
3fc0: 20 28 73 75 6d 30 20 3c 3c 20 32 34 29 3b 0a 20   (sum0 << 24);. 
3fd0: 20 73 77 69 74 63 68 28 4e 29 7b 0a 20 20 20 20   switch(N){.    
3fe0: 63 61 73 65 20 33 3a 20 20 20 73 75 6d 33 20 2b  case 3:   sum3 +
3ff0: 3d 20 28 7a 5b 32 5d 20 3c 3c 20 38 29 3b 0a 20  = (z[2] << 8);. 
4000: 20 20 20 63 61 73 65 20 32 3a 20 20 20 73 75 6d     case 2:   sum
4010: 33 20 2b 3d 20 28 7a 5b 31 5d 20 3c 3c 20 31 36  3 += (z[1] << 16
4020: 29 3b 0a 20 20 20 20 63 61 73 65 20 31 3a 20 20  );.    case 1:  
4030: 20 73 75 6d 33 20 2b 3d 20 28 7a 5b 30 5d 20 3c   sum3 += (z[0] <
4040: 3c 20 32 34 29 3b 0a 20 20 20 20 64 65 66 61 75  < 24);.    defau
4050: 6c 74 3a 20 20 3b 0a 20 20 7d 0a 20 20 72 65 74  lt:  ;.  }.  ret
4060: 75 72 6e 20 73 75 6d 33 3b 0a 7d 0a 0a 2f 2a 0a  urn sum3;.}../*.
4070: 2a 2a 20 41 70 70 6c 79 20 61 20 64 65 6c 74 61  ** Apply a delta
4080: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 75 74 70  ..**.** The outp
4090: 75 74 20 62 75 66 66 65 72 20 73 68 6f 75 6c 64  ut buffer should
40a0: 20 62 65 20 62 69 67 20 65 6e 6f 75 67 68 20 74   be big enough t
40b0: 6f 20 68 6f 6c 64 20 74 68 65 20 77 68 6f 6c 65  o hold the whole
40c0: 20 6f 75 74 70 75 74 0a 2a 2a 20 66 69 6c 65 20   output.** file 
40d0: 61 6e 64 20 61 20 4e 55 4c 20 74 65 72 6d 69 6e  and a NUL termin
40e0: 61 74 6f 72 20 61 74 20 74 68 65 20 65 6e 64 2e  ator at the end.
40f0: 20 20 54 68 65 20 64 65 6c 74 61 5f 6f 75 74 70    The delta_outp
4100: 75 74 5f 73 69 7a 65 28 29 0a 2a 2a 20 72 6f 75  ut_size().** rou
4110: 74 69 6e 65 20 77 69 6c 6c 20 64 65 74 65 72 6d  tine will determ
4120: 69 6e 65 20 74 68 69 73 20 73 69 7a 65 20 66 6f  ine this size fo
4130: 72 20 79 6f 75 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  r you..**.** The
4140: 20 64 65 6c 74 61 20 73 74 72 69 6e 67 20 73 68   delta string sh
4150: 6f 75 6c 64 20 62 65 20 6e 75 6c 6c 2d 74 65 72  ould be null-ter
4160: 6d 69 6e 61 74 65 64 2e 20 20 42 75 74 20 74 68  minated.  But th
4170: 65 20 64 65 6c 74 61 20 73 74 72 69 6e 67 0a 2a  e delta string.*
4180: 2a 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 65 6d  * may contain em
4190: 62 65 64 64 65 64 20 4e 55 4c 20 63 68 61 72 61  bedded NUL chara
41a0: 63 74 65 72 73 20 28 69 66 20 74 68 65 20 69 6e  cters (if the in
41b0: 70 75 74 20 61 6e 64 20 6f 75 74 70 75 74 20 61  put and output a
41c0: 72 65 0a 2a 2a 20 62 69 6e 61 72 79 20 66 69 6c  re.** binary fil
41d0: 65 73 29 20 73 6f 20 77 65 20 61 6c 73 6f 20 68  es) so we also h
41e0: 61 76 65 20 74 6f 20 70 61 73 73 20 69 6e 20 74  ave to pass in t
41f0: 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65  he length of the
4200: 20 64 65 6c 74 61 20 69 6e 0a 2a 2a 20 74 68 65   delta in.** the
4210: 20 6c 65 6e 44 65 6c 74 61 20 70 61 72 61 6d 65   lenDelta parame
4220: 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ter..**.** This 
4230: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
4240: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
4250: 20 6f 75 74 70 75 74 20 66 69 6c 65 20 69 6e 20   output file in 
4260: 62 79 74 65 73 20 28 65 78 63 6c 75 64 69 6e 67  bytes (excluding
4270: 0a 2a 2a 20 74 68 65 20 66 69 6e 61 6c 20 4e 55  .** the final NU
4280: 4c 20 74 65 72 6d 69 6e 61 74 6f 72 20 63 68 61  L terminator cha
4290: 72 61 63 74 65 72 29 2e 20 20 45 78 63 65 70 74  racter).  Except
42a0: 2c 20 69 66 20 74 68 65 20 64 65 6c 74 61 20 73  , if the delta s
42b0: 74 72 69 6e 67 20 69 73 0a 2a 2a 20 6d 61 6c 66  tring is.** malf
42c0: 6f 72 6d 65 64 20 6f 72 20 69 6e 74 65 6e 64 65  ormed or intende
42d0: 64 20 66 6f 72 20 75 73 65 20 77 69 74 68 20 61  d for use with a
42e0: 20 73 6f 75 72 63 65 20 66 69 6c 65 20 6f 74 68   source file oth
42f0: 65 72 20 74 68 61 6e 20 7a 53 72 63 2c 0a 2a 2a  er than zSrc,.**
4300: 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
4310: 6e 65 20 72 65 74 75 72 6e 73 20 2d 31 2e 0a 2a  ne returns -1..*
4320: 2a 0a 2a 2a 20 52 65 66 65 72 20 74 6f 20 74 68  *.** Refer to th
4330: 65 20 64 65 6c 74 61 5f 63 72 65 61 74 65 28 29  e delta_create()
4340: 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 61   documentation a
4350: 62 6f 76 65 20 66 6f 72 20 61 20 64 65 73 63 72  bove for a descr
4360: 69 70 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65  iption.** of the
4370: 20 64 65 6c 74 61 20 66 69 6c 65 20 66 6f 72 6d   delta file form
4380: 61 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  at..*/.static in
4390: 74 20 72 62 75 44 65 6c 74 61 41 70 70 6c 79 28  t rbuDeltaApply(
43a0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
43b0: 53 72 63 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  Src,      /* The
43c0: 20 73 6f 75 72 63 65 20 6f 72 20 70 61 74 74 65   source or patte
43d0: 72 6e 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  rn file */.  int
43e0: 20 6c 65 6e 53 72 63 2c 20 20 20 20 20 20 20 20   lenSrc,        
43f0: 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66      /* Length of
4400: 20 74 68 65 20 73 6f 75 72 63 65 20 66 69 6c 65   the source file
4410: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
4420: 20 2a 7a 44 65 6c 74 61 2c 20 20 20 20 2f 2a 20   *zDelta,    /* 
4430: 44 65 6c 74 61 20 74 6f 20 61 70 70 6c 79 20 74  Delta to apply t
4440: 6f 20 74 68 65 20 70 61 74 74 65 72 6e 20 2a 2f  o the pattern */
4450: 0a 20 20 69 6e 74 20 6c 65 6e 44 65 6c 74 61 2c  .  int lenDelta,
4460: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e            /* Len
4470: 67 74 68 20 6f 66 20 74 68 65 20 64 65 6c 74 61  gth of the delta
4480: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74   */.  char *zOut
4490: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
44a0: 57 72 69 74 65 20 74 68 65 20 6f 75 74 70 75 74  Write the output
44b0: 20 69 6e 74 6f 20 74 68 69 73 20 70 72 65 61 6c   into this preal
44c0: 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 20 2a  located buffer *
44d0: 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  /.){.  unsigned 
44e0: 69 6e 74 20 6c 69 6d 69 74 3b 0a 20 20 75 6e 73  int limit;.  uns
44f0: 69 67 6e 65 64 20 69 6e 74 20 74 6f 74 61 6c 20  igned int total 
4500: 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 46 4f 53  = 0;.#ifndef FOS
4510: 53 49 4c 5f 4f 4d 49 54 5f 44 45 4c 54 41 5f 43  SIL_OMIT_DELTA_C
4520: 4b 53 55 4d 5f 54 45 53 54 0a 20 20 63 68 61 72  KSUM_TEST.  char
4530: 20 2a 7a 4f 72 69 67 4f 75 74 20 3d 20 7a 4f 75   *zOrigOut = zOu
4540: 74 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 6c 69 6d  t;.#endif..  lim
4550: 69 74 20 3d 20 72 62 75 44 65 6c 74 61 47 65 74  it = rbuDeltaGet
4560: 49 6e 74 28 26 7a 44 65 6c 74 61 2c 20 26 6c 65  Int(&zDelta, &le
4570: 6e 44 65 6c 74 61 29 3b 0a 20 20 69 66 28 20 2a  nDelta);.  if( *
4580: 7a 44 65 6c 74 61 21 3d 27 5c 6e 27 20 29 7b 0a  zDelta!='\n' ){.
4590: 20 20 20 20 2f 2a 20 45 52 52 4f 52 3a 20 73 69      /* ERROR: si
45a0: 7a 65 20 69 6e 74 65 67 65 72 20 6e 6f 74 20 74  ze integer not t
45b0: 65 72 6d 69 6e 61 74 65 64 20 62 79 20 22 5c 6e  erminated by "\n
45c0: 22 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  " */.    return 
45d0: 2d 31 3b 0a 20 20 7d 0a 20 20 7a 44 65 6c 74 61  -1;.  }.  zDelta
45e0: 2b 2b 3b 20 6c 65 6e 44 65 6c 74 61 2d 2d 3b 0a  ++; lenDelta--;.
45f0: 20 20 77 68 69 6c 65 28 20 2a 7a 44 65 6c 74 61    while( *zDelta
4600: 20 26 26 20 6c 65 6e 44 65 6c 74 61 3e 30 20 29   && lenDelta>0 )
4610: 7b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69  {.    unsigned i
4620: 6e 74 20 63 6e 74 2c 20 6f 66 73 74 3b 0a 20 20  nt cnt, ofst;.  
4630: 20 20 63 6e 74 20 3d 20 72 62 75 44 65 6c 74 61    cnt = rbuDelta
4640: 47 65 74 49 6e 74 28 26 7a 44 65 6c 74 61 2c 20  GetInt(&zDelta, 
4650: 26 6c 65 6e 44 65 6c 74 61 29 3b 0a 20 20 20 20  &lenDelta);.    
4660: 73 77 69 74 63 68 28 20 7a 44 65 6c 74 61 5b 30  switch( zDelta[0
4670: 5d 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20  ] ){.      case 
4680: 27 40 27 3a 20 7b 0a 20 20 20 20 20 20 20 20 7a  '@': {.        z
4690: 44 65 6c 74 61 2b 2b 3b 20 6c 65 6e 44 65 6c 74  Delta++; lenDelt
46a0: 61 2d 2d 3b 0a 20 20 20 20 20 20 20 20 6f 66 73  a--;.        ofs
46b0: 74 20 3d 20 72 62 75 44 65 6c 74 61 47 65 74 49  t = rbuDeltaGetI
46c0: 6e 74 28 26 7a 44 65 6c 74 61 2c 20 26 6c 65 6e  nt(&zDelta, &len
46d0: 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20 20 20  Delta);.        
46e0: 69 66 28 20 6c 65 6e 44 65 6c 74 61 3e 30 20 26  if( lenDelta>0 &
46f0: 26 20 7a 44 65 6c 74 61 5b 30 5d 21 3d 27 2c 27  & zDelta[0]!=','
4700: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
4710: 20 45 52 52 4f 52 3a 20 63 6f 70 79 20 63 6f 6d   ERROR: copy com
4720: 6d 61 6e 64 20 6e 6f 74 20 74 65 72 6d 69 6e 61  mand not termina
4730: 74 65 64 20 62 79 20 27 2c 27 20 2a 2f 0a 20 20  ted by ',' */.  
4740: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d          return -
4750: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
4760: 20 20 20 20 20 7a 44 65 6c 74 61 2b 2b 3b 20 6c       zDelta++; l
4770: 65 6e 44 65 6c 74 61 2d 2d 3b 0a 20 20 20 20 20  enDelta--;.     
4780: 20 20 20 74 6f 74 61 6c 20 2b 3d 20 63 6e 74 3b     total += cnt;
4790: 0a 20 20 20 20 20 20 20 20 69 66 28 20 74 6f 74  .        if( tot
47a0: 61 6c 3e 6c 69 6d 69 74 20 29 7b 0a 20 20 20 20  al>limit ){.    
47b0: 20 20 20 20 20 20 2f 2a 20 45 52 52 4f 52 3a 20        /* ERROR: 
47c0: 63 6f 70 79 20 65 78 63 65 65 64 73 20 6f 75 74  copy exceeds out
47d0: 70 75 74 20 66 69 6c 65 20 73 69 7a 65 20 2a 2f  put file size */
47e0: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
47f0: 6e 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n -1;.        }.
4800: 20 20 20 20 20 20 20 20 69 66 28 20 28 69 6e 74          if( (int
4810: 29 28 6f 66 73 74 2b 63 6e 74 29 20 3e 20 6c 65  )(ofst+cnt) > le
4820: 6e 53 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  nSrc ){.        
4830: 20 20 2f 2a 20 45 52 52 4f 52 3a 20 63 6f 70 79    /* ERROR: copy
4840: 20 65 78 74 65 6e 64 73 20 70 61 73 74 20 65 6e   extends past en
4850: 64 20 6f 66 20 69 6e 70 75 74 20 2a 2f 0a 20 20  d of input */.  
4860: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d          return -
4870: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
4880: 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 4f 75 74       memcpy(zOut
4890: 2c 20 26 7a 53 72 63 5b 6f 66 73 74 5d 2c 20 63  , &zSrc[ofst], c
48a0: 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 7a 4f 75  nt);.        zOu
48b0: 74 20 2b 3d 20 63 6e 74 3b 0a 20 20 20 20 20 20  t += cnt;.      
48c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
48d0: 0a 20 20 20 20 20 20 63 61 73 65 20 27 3a 27 3a  .      case ':':
48e0: 20 7b 0a 20 20 20 20 20 20 20 20 7a 44 65 6c 74   {.        zDelt
48f0: 61 2b 2b 3b 20 6c 65 6e 44 65 6c 74 61 2d 2d 3b  a++; lenDelta--;
4900: 0a 20 20 20 20 20 20 20 20 74 6f 74 61 6c 20 2b  .        total +
4910: 3d 20 63 6e 74 3b 0a 20 20 20 20 20 20 20 20 69  = cnt;.        i
4920: 66 28 20 74 6f 74 61 6c 3e 6c 69 6d 69 74 20 29  f( total>limit )
4930: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45  {.          /* E
4940: 52 52 4f 52 3a 20 20 69 6e 73 65 72 74 20 63 6f  RROR:  insert co
4950: 6d 6d 61 6e 64 20 67 69 76 65 73 20 61 6e 20 6f  mmand gives an o
4960: 75 74 70 75 74 20 6c 61 72 67 65 72 20 74 68 61  utput larger tha
4970: 6e 20 70 72 65 64 69 63 74 65 64 20 2a 2f 0a 20  n predicted */. 
4980: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
4990: 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  -1;.        }.  
49a0: 20 20 20 20 20 20 69 66 28 20 28 69 6e 74 29 63        if( (int)c
49b0: 6e 74 3e 6c 65 6e 44 65 6c 74 61 20 29 7b 0a 20  nt>lenDelta ){. 
49c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 52 52 4f           /* ERRO
49d0: 52 3a 20 69 6e 73 65 72 74 20 63 6f 75 6e 74 20  R: insert count 
49e0: 65 78 63 65 65 64 73 20 73 69 7a 65 20 6f 66 20  exceeds size of 
49f0: 64 65 6c 74 61 20 2a 2f 0a 20 20 20 20 20 20 20  delta */.       
4a00: 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
4a10: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
4a20: 6d 65 6d 63 70 79 28 7a 4f 75 74 2c 20 7a 44 65  memcpy(zOut, zDe
4a30: 6c 74 61 2c 20 63 6e 74 29 3b 0a 20 20 20 20 20  lta, cnt);.     
4a40: 20 20 20 7a 4f 75 74 20 2b 3d 20 63 6e 74 3b 0a     zOut += cnt;.
4a50: 20 20 20 20 20 20 20 20 7a 44 65 6c 74 61 20 2b          zDelta +
4a60: 3d 20 63 6e 74 3b 0a 20 20 20 20 20 20 20 20 6c  = cnt;.        l
4a70: 65 6e 44 65 6c 74 61 20 2d 3d 20 63 6e 74 3b 0a  enDelta -= cnt;.
4a80: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
4a90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73       }.      cas
4aa0: 65 20 27 3b 27 3a 20 7b 0a 20 20 20 20 20 20 20  e ';': {.       
4ab0: 20 7a 44 65 6c 74 61 2b 2b 3b 20 6c 65 6e 44 65   zDelta++; lenDe
4ac0: 6c 74 61 2d 2d 3b 0a 20 20 20 20 20 20 20 20 7a  lta--;.        z
4ad0: 4f 75 74 5b 30 5d 20 3d 20 30 3b 0a 23 69 66 6e  Out[0] = 0;.#ifn
4ae0: 64 65 66 20 46 4f 53 53 49 4c 5f 4f 4d 49 54 5f  def FOSSIL_OMIT_
4af0: 44 45 4c 54 41 5f 43 4b 53 55 4d 5f 54 45 53 54  DELTA_CKSUM_TEST
4b00: 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 6e 74  .        if( cnt
4b10: 21 3d 72 62 75 44 65 6c 74 61 43 68 65 63 6b 73  !=rbuDeltaChecks
4b20: 75 6d 28 7a 4f 72 69 67 4f 75 74 2c 20 74 6f 74  um(zOrigOut, tot
4b30: 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  al) ){.         
4b40: 20 2f 2a 20 45 52 52 4f 52 3a 20 20 62 61 64 20   /* ERROR:  bad 
4b50: 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 20 20  checksum */.    
4b60: 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b        return -1;
4b70: 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  .        }.#endi
4b80: 66 0a 20 20 20 20 20 20 20 20 69 66 28 20 74 6f  f.        if( to
4b90: 74 61 6c 21 3d 6c 69 6d 69 74 20 29 7b 0a 20 20  tal!=limit ){.  
4ba0: 20 20 20 20 20 20 20 20 2f 2a 20 45 52 52 4f 52          /* ERROR
4bb0: 3a 20 67 65 6e 65 72 61 74 65 64 20 73 69 7a 65  : generated size
4bc0: 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20   does not match 
4bd0: 70 72 65 64 69 63 74 65 64 20 73 69 7a 65 20 2a  predicted size *
4be0: 2f 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  /.          retu
4bf0: 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d  rn -1;.        }
4c00: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
4c10: 74 6f 74 61 6c 3b 0a 20 20 20 20 20 20 7d 0a 20  total;.      }. 
4c20: 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a       default: {.
4c30: 20 20 20 20 20 20 20 20 2f 2a 20 45 52 52 4f 52          /* ERROR
4c40: 3a 20 75 6e 6b 6e 6f 77 6e 20 64 65 6c 74 61 20  : unknown delta 
4c50: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20  operator */.    
4c60: 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
4c70: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
4c80: 0a 20 20 2f 2a 20 45 52 52 4f 52 3a 20 75 6e 74  .  /* ERROR: unt
4c90: 65 72 6d 69 6e 61 74 65 64 20 64 65 6c 74 61 20  erminated delta 
4ca0: 2a 2f 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a  */.  return -1;.
4cb0: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62  }..static int rb
4cc0: 75 44 65 6c 74 61 4f 75 74 70 75 74 53 69 7a 65  uDeltaOutputSize
4cd0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 65  (const char *zDe
4ce0: 6c 74 61 2c 20 69 6e 74 20 6c 65 6e 44 65 6c 74  lta, int lenDelt
4cf0: 61 29 7b 0a 20 20 69 6e 74 20 73 69 7a 65 3b 0a  a){.  int size;.
4d00: 20 20 73 69 7a 65 20 3d 20 72 62 75 44 65 6c 74    size = rbuDelt
4d10: 61 47 65 74 49 6e 74 28 26 7a 44 65 6c 74 61 2c  aGetInt(&zDelta,
4d20: 20 26 6c 65 6e 44 65 6c 74 61 29 3b 0a 20 20 69   &lenDelta);.  i
4d30: 66 28 20 2a 7a 44 65 6c 74 61 21 3d 27 5c 6e 27  f( *zDelta!='\n'
4d40: 20 29 7b 0a 20 20 20 20 2f 2a 20 45 52 52 4f 52   ){.    /* ERROR
4d50: 3a 20 73 69 7a 65 20 69 6e 74 65 67 65 72 20 6e  : size integer n
4d60: 6f 74 20 74 65 72 6d 69 6e 61 74 65 64 20 62 79  ot terminated by
4d70: 20 22 5c 6e 22 20 2a 2f 0a 20 20 20 20 72 65 74   "\n" */.    ret
4d80: 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 72 65  urn -1;.  }.  re
4d90: 74 75 72 6e 20 73 69 7a 65 3b 0a 7d 0a 0a 2f 2a  turn size;.}../*
4da0: 0a 2a 2a 20 45 6e 64 20 6f 66 20 63 6f 64 65 20  .** End of code 
4db0: 74 61 6b 65 6e 20 66 72 6f 6d 20 66 6f 73 73 69  taken from fossi
4dc0: 6c 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  l..*************
4dd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4de0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4df0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4e00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
4e10: 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
4e20: 69 6f 6e 20 6f 66 20 53 51 4c 20 73 63 61 6c 61  ion of SQL scala
4e30: 72 20 66 75 6e 63 74 69 6f 6e 20 72 62 75 5f 66  r function rbu_f
4e40: 6f 73 73 69 6c 5f 64 65 6c 74 61 28 29 2e 0a 2a  ossil_delta()..*
4e50: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
4e60: 6f 6e 20 61 70 70 6c 69 65 73 20 61 20 66 6f 73  on applies a fos
4e70: 73 69 6c 20 64 65 6c 74 61 20 70 61 74 63 68 20  sil delta patch 
4e80: 74 6f 20 61 20 62 6c 6f 62 2e 20 45 78 61 63 74  to a blob. Exact
4e90: 6c 79 20 74 77 6f 0a 2a 2a 20 61 72 67 75 6d 65  ly two.** argume
4ea0: 6e 74 73 20 6d 75 73 74 20 62 65 20 70 61 73 73  nts must be pass
4eb0: 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ed to this funct
4ec0: 69 6f 6e 2e 20 54 68 65 20 66 69 72 73 74 20 69  ion. The first i
4ed0: 73 20 74 68 65 20 62 6c 6f 62 20 74 6f 0a 2a 2a  s the blob to.**
4ee0: 20 70 61 74 63 68 20 61 6e 64 20 74 68 65 20 73   patch and the s
4ef0: 65 63 6f 6e 64 20 74 68 65 20 70 61 74 63 68 20  econd the patch 
4f00: 74 6f 20 61 70 70 6c 79 2e 20 49 66 20 6e 6f 20  to apply. If no 
4f10: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
4f20: 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72  is.** function r
4f30: 65 74 75 72 6e 73 20 74 68 65 20 70 61 74 63 68  eturns the patch
4f40: 65 64 20 62 6c 6f 62 2e 0a 2a 2f 0a 73 74 61 74  ed blob..*/.stat
4f50: 69 63 20 76 6f 69 64 20 72 62 75 46 6f 73 73 69  ic void rbuFossi
4f60: 6c 44 65 6c 74 61 46 75 6e 63 28 0a 20 20 73 71  lDeltaFunc(.  sq
4f70: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
4f80: 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72  ontext,.  int ar
4f90: 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  gc,.  sqlite3_va
4fa0: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
4fb0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 44 65 6c  const char *aDel
4fc0: 74 61 3b 0a 20 20 69 6e 74 20 6e 44 65 6c 74 61  ta;.  int nDelta
4fd0: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
4fe0: 61 4f 72 69 67 3b 0a 20 20 69 6e 74 20 6e 4f 72  aOrig;.  int nOr
4ff0: 69 67 3b 0a 0a 20 20 69 6e 74 20 6e 4f 75 74 3b  ig;..  int nOut;
5000: 0a 20 20 69 6e 74 20 6e 4f 75 74 32 3b 0a 20 20  .  int nOut2;.  
5010: 63 68 61 72 20 2a 61 4f 75 74 3b 0a 0a 20 20 61  char *aOut;..  a
5020: 73 73 65 72 74 28 20 61 72 67 63 3d 3d 32 20 29  ssert( argc==2 )
5030: 3b 0a 0a 20 20 6e 4f 72 69 67 20 3d 20 73 71 6c  ;..  nOrig = sql
5040: 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
5050: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 61 4f 72  (argv[0]);.  aOr
5060: 69 67 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  ig = (const char
5070: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
5080: 62 6c 6f 62 28 61 72 67 76 5b 30 5d 29 3b 0a 20  blob(argv[0]);. 
5090: 20 6e 44 65 6c 74 61 20 3d 20 73 71 6c 69 74 65   nDelta = sqlite
50a0: 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72  3_value_bytes(ar
50b0: 67 76 5b 31 5d 29 3b 0a 20 20 61 44 65 6c 74 61  gv[1]);.  aDelta
50c0: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
50d0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c  sqlite3_value_bl
50e0: 6f 62 28 61 72 67 76 5b 31 5d 29 3b 0a 0a 20 20  ob(argv[1]);..  
50f0: 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74 68  /* Figure out th
5100: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6f 75  e size of the ou
5110: 74 70 75 74 20 2a 2f 0a 20 20 6e 4f 75 74 20 3d  tput */.  nOut =
5120: 20 72 62 75 44 65 6c 74 61 4f 75 74 70 75 74 53   rbuDeltaOutputS
5130: 69 7a 65 28 61 44 65 6c 74 61 2c 20 6e 44 65 6c  ize(aDelta, nDel
5140: 74 61 29 3b 0a 20 20 69 66 28 20 6e 4f 75 74 3c  ta);.  if( nOut<
5150: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
5160: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f  _result_error(co
5170: 6e 74 65 78 74 2c 20 22 63 6f 72 72 75 70 74 20  ntext, "corrupt 
5180: 66 6f 73 73 69 6c 20 64 65 6c 74 61 22 2c 20 2d  fossil delta", -
5190: 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  1);.    return;.
51a0: 20 20 7d 0a 0a 20 20 61 4f 75 74 20 3d 20 73 71    }..  aOut = sq
51b0: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 4f 75  lite3_malloc(nOu
51c0: 74 2b 31 29 3b 0a 20 20 69 66 28 20 61 4f 75 74  t+1);.  if( aOut
51d0: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
51e0: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f  e3_result_error_
51f0: 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a  nomem(context);.
5200: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4f 75    }else{.    nOu
5210: 74 32 20 3d 20 72 62 75 44 65 6c 74 61 41 70 70  t2 = rbuDeltaApp
5220: 6c 79 28 61 4f 72 69 67 2c 20 6e 4f 72 69 67 2c  ly(aOrig, nOrig,
5230: 20 61 44 65 6c 74 61 2c 20 6e 44 65 6c 74 61 2c   aDelta, nDelta,
5240: 20 61 4f 75 74 29 3b 0a 20 20 20 20 69 66 28 20   aOut);.    if( 
5250: 6e 4f 75 74 32 21 3d 6e 4f 75 74 20 29 7b 0a 20  nOut2!=nOut ){. 
5260: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
5270: 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78  ult_error(contex
5280: 74 2c 20 22 63 6f 72 72 75 70 74 20 66 6f 73 73  t, "corrupt foss
5290: 69 6c 20 64 65 6c 74 61 22 2c 20 2d 31 29 3b 0a  il delta", -1);.
52a0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
52b0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
52c0: 62 6c 6f 62 28 63 6f 6e 74 65 78 74 2c 20 61 4f  blob(context, aO
52d0: 75 74 2c 20 6e 4f 75 74 2c 20 73 71 6c 69 74 65  ut, nOut, sqlite
52e0: 33 5f 66 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20  3_free);.    }. 
52f0: 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 50 72 65   }.}.../*.** Pre
5300: 70 61 72 65 20 74 68 65 20 53 51 4c 20 73 74 61  pare the SQL sta
5310: 74 65 6d 65 6e 74 20 69 6e 20 62 75 66 66 65 72  tement in buffer
5320: 20 7a 53 71 6c 20 61 67 61 69 6e 73 74 20 64 61   zSql against da
5330: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62  tabase handle db
5340: 2e 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  ..** If successf
5350: 75 6c 2c 20 73 65 74 20 2a 70 70 53 74 6d 74 20  ul, set *ppStmt 
5360: 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
5370: 6e 65 77 20 73 74 61 74 65 6d 65 6e 74 20 61 6e  new statement an
5380: 64 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49  d return.** SQLI
5390: 54 45 5f 4f 4b 2e 20 0a 2a 2a 0a 2a 2a 20 4f 74  TE_OK. .**.** Ot
53a0: 68 65 72 77 69 73 65 2c 20 69 66 20 61 6e 20 65  herwise, if an e
53b0: 72 72 6f 72 20 64 6f 65 73 20 6f 63 63 75 72 2c  rror does occur,
53c0: 20 73 65 74 20 2a 70 70 53 74 6d 74 20 74 6f 20   set *ppStmt to 
53d0: 4e 55 4c 4c 20 61 6e 64 20 72 65 74 75 72 6e 0a  NULL and return.
53e0: 2a 2a 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  ** an SQLite err
53f0: 6f 72 20 63 6f 64 65 2e 20 41 64 64 69 74 69 6f  or code. Additio
5400: 6e 61 6c 6c 79 2c 20 73 65 74 20 6f 75 74 70 75  nally, set outpu
5410: 74 20 76 61 72 69 61 62 6c 65 20 2a 70 7a 45 72  t variable *pzEr
5420: 72 6d 73 67 20 74 6f 0a 2a 2a 20 70 6f 69 6e 74  rmsg to.** point
5430: 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e   to a buffer con
5440: 74 61 69 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72  taining an error
5450: 20 6d 65 73 73 61 67 65 2e 20 49 74 20 69 73 20   message. It is 
5460: 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  the responsibili
5470: 74 79 0a 2a 2a 20 6f 66 20 74 68 65 20 63 61 6c  ty.** of the cal
5480: 6c 65 72 20 74 6f 20 28 65 76 65 6e 74 75 61 6c  ler to (eventual
5490: 6c 79 29 20 66 72 65 65 20 74 68 69 73 20 62 75  ly) free this bu
54a0: 66 66 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74  ffer using sqlit
54b0: 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 73 74  e3_free()..*/.st
54c0: 61 74 69 63 20 69 6e 74 20 70 72 65 70 61 72 65  atic int prepare
54d0: 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28  AndCollectError(
54e0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
54f0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
5500: 2a 2a 70 70 53 74 6d 74 2c 0a 20 20 63 68 61 72  **ppStmt,.  char
5510: 20 2a 2a 70 7a 45 72 72 6d 73 67 2c 0a 20 20 63   **pzErrmsg,.  c
5520: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 0a  onst char *zSql.
5530: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71  ){.  int rc = sq
5540: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
5550: 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 70  (db, zSql, -1, p
5560: 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28  pStmt, 0);.  if(
5570: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
5580: 7b 0a 20 20 20 20 2a 70 7a 45 72 72 6d 73 67 20  {.    *pzErrmsg 
5590: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
55a0: 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f  f("%s", sqlite3_
55b0: 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 20  errmsg(db));.   
55c0: 20 2a 70 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20   *ppStmt = 0;.  
55d0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
55e0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74 20 74 68  ../*.** Reset th
55f0: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  e SQL statement 
5600: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
5610: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 52 65  rst argument. Re
5620: 74 75 72 6e 20 61 20 63 6f 70 79 0a 2a 2a 20 6f  turn a copy.** o
5630: 66 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75  f the value retu
5640: 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f  rned by sqlite3_
5650: 72 65 73 65 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 49  reset()..**.** I
5660: 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 6f  f an error has o
5670: 63 63 75 72 72 65 64 2c 20 74 68 65 6e 20 73 65  ccurred, then se
5680: 74 20 2a 70 7a 45 72 72 6d 73 67 20 74 6f 20 70  t *pzErrmsg to p
5690: 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72  oint to a buffer
56a0: 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61  .** containing a
56b0: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e  n error message.
56c0: 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f   It is the respo
56d0: 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
56e0: 20 63 61 6c 6c 65 72 0a 2a 2a 20 74 6f 20 65 76   caller.** to ev
56f0: 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 20 74 68  entually free th
5700: 69 73 20 62 75 66 66 65 72 20 75 73 69 6e 67 20  is buffer using 
5710: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a  sqlite3_free()..
5720: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
5730: 73 65 74 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72  setAndCollectErr
5740: 6f 72 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  or(sqlite3_stmt 
5750: 2a 70 53 74 6d 74 2c 20 63 68 61 72 20 2a 2a 70  *pStmt, char **p
5760: 7a 45 72 72 6d 73 67 29 7b 0a 20 20 69 6e 74 20  zErrmsg){.  int 
5770: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73  rc = sqlite3_res
5780: 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 69 66 28  et(pStmt);.  if(
5790: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
57a0: 7b 0a 20 20 20 20 2a 70 7a 45 72 72 6d 73 67 20  {.    *pzErrmsg 
57b0: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
57c0: 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f  f("%s", sqlite3_
57d0: 65 72 72 6d 73 67 28 73 71 6c 69 74 65 33 5f 64  errmsg(sqlite3_d
57e0: 62 5f 68 61 6e 64 6c 65 28 70 53 74 6d 74 29 29  b_handle(pStmt))
57f0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
5800: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c  rc;.}../*.** Unl
5810: 65 73 73 20 69 74 20 69 73 20 4e 55 4c 4c 2c 20  ess it is NULL, 
5820: 61 72 67 75 6d 65 6e 74 20 7a 53 71 6c 20 70 6f  argument zSql po
5830: 69 6e 74 73 20 74 6f 20 61 20 62 75 66 66 65 72  ints to a buffer
5840: 20 61 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e 67   allocated using
5850: 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  .** sqlite3_mall
5860: 6f 63 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6e  oc containing an
5870: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20   SQL statement. 
5880: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 70 72  This function pr
5890: 65 70 61 72 65 73 20 74 68 65 20 53 51 4c 0a 2a  epares the SQL.*
58a0: 2a 20 73 74 61 74 65 6d 65 6e 74 20 61 67 61 69  * statement agai
58b0: 6e 73 74 20 64 61 74 61 62 61 73 65 20 64 62 20  nst database db 
58c0: 61 6e 64 20 66 72 65 65 73 20 74 68 65 20 62 75  and frees the bu
58d0: 66 66 65 72 2e 20 49 66 20 73 74 61 74 65 6d 65  ffer. If stateme
58e0: 6e 74 20 0a 2a 2a 20 63 6f 6d 70 69 6c 61 74 69  nt .** compilati
58f0: 6f 6e 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  on is successful
5900: 2c 20 2a 70 70 53 74 6d 74 20 69 73 20 73 65 74  , *ppStmt is set
5910: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
5920: 20 6e 65 77 20 73 74 61 74 65 6d 65 6e 74 20 0a   new statement .
5930: 2a 2a 20 68 61 6e 64 6c 65 20 61 6e 64 20 53 51  ** handle and SQ
5940: 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
5950: 6e 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  ned. .**.** Othe
5960: 72 77 69 73 65 2c 20 69 66 20 61 6e 20 65 72 72  rwise, if an err
5970: 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70 70 53 74  or occurs, *ppSt
5980: 6d 74 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  mt is set to NUL
5990: 4c 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63  L and an error c
59a0: 6f 64 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e  ode.** returned.
59b0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 2a   In this case, *
59c0: 70 7a 45 72 72 6d 73 67 20 6d 61 79 20 61 6c 73  pzErrmsg may als
59d0: 6f 20 62 65 20 73 65 74 20 74 6f 20 70 6f 69 6e  o be set to poin
59e0: 74 20 74 6f 20 61 6e 20 65 72 72 6f 72 0a 2a 2a  t to an error.**
59f0: 20 6d 65 73 73 61 67 65 2e 20 49 74 20 69 73 20   message. It is 
5a00: 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  the responsibili
5a10: 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72  ty of the caller
5a20: 20 74 6f 20 66 72 65 65 20 74 68 69 73 20 65 72   to free this er
5a30: 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 62  ror message.** b
5a40: 75 66 66 65 72 20 75 73 69 6e 67 20 73 71 6c 69  uffer using sqli
5a50: 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2a 0a 2a  te3_free()..**.*
5a60: 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 7a 53  * If argument zS
5a70: 71 6c 20 69 73 20 4e 55 4c 4c 2c 20 74 68 69 73  ql is NULL, this
5a80: 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65   function assume
5a90: 73 20 74 68 61 74 20 61 6e 20 4f 4f 4d 20 68 61  s that an OOM ha
5aa0: 73 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 20 49  s occurred..** I
5ab0: 6e 20 74 68 69 73 20 63 61 73 65 20 53 51 4c 49  n this case SQLI
5ac0: 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75  TE_NOMEM is retu
5ad0: 72 6e 65 64 20 61 6e 64 20 2a 70 70 53 74 6d 74  rned and *ppStmt
5ae0: 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2f   set to NULL..*/
5af0: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 65 70  .static int prep
5b00: 61 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63  areFreeAndCollec
5b10: 74 45 72 72 6f 72 28 0a 20 20 73 71 6c 69 74 65  tError(.  sqlite
5b20: 33 20 2a 64 62 2c 20 0a 20 20 73 71 6c 69 74 65  3 *db, .  sqlite
5b30: 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 2c  3_stmt **ppStmt,
5b40: 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 6d  .  char **pzErrm
5b50: 73 67 2c 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c  sg,.  char *zSql
5b60: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
5b70: 61 73 73 65 72 74 28 20 2a 70 7a 45 72 72 6d 73  assert( *pzErrms
5b80: 67 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 7a 53  g==0 );.  if( zS
5b90: 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  ql==0 ){.    rc 
5ba0: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
5bb0: 20 20 20 20 2a 70 70 53 74 6d 74 20 3d 20 30 3b      *ppStmt = 0;
5bc0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
5bd0: 20 3d 20 70 72 65 70 61 72 65 41 6e 64 43 6f 6c   = prepareAndCol
5be0: 6c 65 63 74 45 72 72 6f 72 28 64 62 2c 20 70 70  lectError(db, pp
5bf0: 53 74 6d 74 2c 20 70 7a 45 72 72 6d 73 67 2c 20  Stmt, pzErrmsg, 
5c00: 7a 53 71 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74  zSql);.    sqlit
5c10: 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20  e3_free(zSql);. 
5c20: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
5c30: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68  }../*.** Free th
5c40: 65 20 52 62 75 4f 62 6a 49 74 65 72 2e 61 7a 54  e RbuObjIter.azT
5c50: 62 6c 43 6f 6c 5b 5d 20 61 6e 64 20 52 62 75 4f  blCol[] and RbuO
5c60: 62 6a 49 74 65 72 2e 61 62 54 62 6c 50 6b 5b 5d  bjIter.abTblPk[]
5c70: 20 61 72 72 61 79 73 20 61 6c 6c 6f 63 61 74 65   arrays allocate
5c80: 64 0a 2a 2a 20 62 79 20 61 6e 20 65 61 72 6c 69  d.** by an earli
5c90: 65 72 20 63 61 6c 6c 20 74 6f 20 72 62 75 4f 62  er call to rbuOb
5ca0: 6a 49 74 65 72 43 61 63 68 65 54 61 62 6c 65 49  jIterCacheTableI
5cb0: 6e 66 6f 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  nfo()..*/.static
5cc0: 20 76 6f 69 64 20 72 62 75 4f 62 6a 49 74 65 72   void rbuObjIter
5cd0: 46 72 65 65 43 6f 6c 73 28 52 62 75 4f 62 6a 49  FreeCols(RbuObjI
5ce0: 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69  ter *pIter){.  i
5cf0: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
5d00: 20 69 3c 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f   i<pIter->nTblCo
5d10: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  l; i++){.    sql
5d20: 69 74 65 33 5f 66 72 65 65 28 70 49 74 65 72 2d  ite3_free(pIter-
5d30: 3e 61 7a 54 62 6c 43 6f 6c 5b 69 5d 29 3b 0a 20  >azTblCol[i]);. 
5d40: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
5d50: 70 49 74 65 72 2d 3e 61 7a 54 62 6c 54 79 70 65  pIter->azTblType
5d60: 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  [i]);.  }.  sqli
5d70: 74 65 33 5f 66 72 65 65 28 70 49 74 65 72 2d 3e  te3_free(pIter->
5d80: 61 7a 54 62 6c 43 6f 6c 29 3b 0a 20 20 70 49 74  azTblCol);.  pIt
5d90: 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 20 3d 20 30  er->azTblCol = 0
5da0: 3b 0a 20 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c  ;.  pIter->azTbl
5db0: 54 79 70 65 20 3d 20 30 3b 0a 20 20 70 49 74 65  Type = 0;.  pIte
5dc0: 72 2d 3e 61 69 53 72 63 4f 72 64 65 72 20 3d 20  r->aiSrcOrder = 
5dd0: 30 3b 0a 20 20 70 49 74 65 72 2d 3e 61 62 54 62  0;.  pIter->abTb
5de0: 6c 50 6b 20 3d 20 30 3b 0a 20 20 70 49 74 65 72  lPk = 0;.  pIter
5df0: 2d 3e 61 62 4e 6f 74 4e 75 6c 6c 20 3d 20 30 3b  ->abNotNull = 0;
5e00: 0a 20 20 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f  .  pIter->nTblCo
5e10: 6c 20 3d 20 30 3b 0a 20 20 70 49 74 65 72 2d 3e  l = 0;.  pIter->
5e20: 65 54 79 70 65 20 3d 20 30 3b 20 20 20 20 20 20  eType = 0;      
5e30: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 76 61           /* Inva
5e40: 6c 69 64 20 76 61 6c 75 65 20 2a 2f 0a 7d 0a 0a  lid value */.}..
5e50: 2f 2a 0a 2a 2a 20 46 69 6e 61 6c 69 7a 65 20 61  /*.** Finalize a
5e60: 6c 6c 20 73 74 61 74 65 6d 65 6e 74 73 20 61 6e  ll statements an
5e70: 64 20 66 72 65 65 20 61 6c 6c 20 61 6c 6c 6f 63  d free all alloc
5e80: 61 74 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20  ations that are 
5e90: 73 70 65 63 69 66 69 63 20 74 6f 0a 2a 2a 20 74  specific to.** t
5ea0: 68 65 20 63 75 72 72 65 6e 74 20 6f 62 6a 65 63  he current objec
5eb0: 74 20 28 74 61 62 6c 65 2f 69 6e 64 65 78 20 70  t (table/index p
5ec0: 61 69 72 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  air)..*/.static 
5ed0: 76 6f 69 64 20 72 62 75 4f 62 6a 49 74 65 72 43  void rbuObjIterC
5ee0: 6c 65 61 72 53 74 61 74 65 6d 65 6e 74 73 28 52  learStatements(R
5ef0: 62 75 4f 62 6a 49 74 65 72 20 2a 70 49 74 65 72  buObjIter *pIter
5f00: 29 7b 0a 20 20 52 62 75 55 70 64 61 74 65 53 74  ){.  RbuUpdateSt
5f10: 6d 74 20 2a 70 55 70 3b 0a 0a 20 20 73 71 6c 69  mt *pUp;..  sqli
5f20: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 49 74  te3_finalize(pIt
5f30: 65 72 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20  er->pSelect);.  
5f40: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
5f50: 28 70 49 74 65 72 2d 3e 70 49 6e 73 65 72 74 29  (pIter->pInsert)
5f60: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  ;.  sqlite3_fina
5f70: 6c 69 7a 65 28 70 49 74 65 72 2d 3e 70 44 65 6c  lize(pIter->pDel
5f80: 65 74 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ete);.  sqlite3_
5f90: 66 69 6e 61 6c 69 7a 65 28 70 49 74 65 72 2d 3e  finalize(pIter->
5fa0: 70 54 6d 70 49 6e 73 65 72 74 29 3b 0a 20 20 70  pTmpInsert);.  p
5fb0: 55 70 20 3d 20 70 49 74 65 72 2d 3e 70 52 62 75  Up = pIter->pRbu
5fc0: 55 70 64 61 74 65 3b 0a 20 20 77 68 69 6c 65 28  Update;.  while(
5fd0: 20 70 55 70 20 29 7b 0a 20 20 20 20 52 62 75 55   pUp ){.    RbuU
5fe0: 70 64 61 74 65 53 74 6d 74 20 2a 70 54 6d 70 20  pdateStmt *pTmp 
5ff0: 3d 20 70 55 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  = pUp->pNext;.  
6000: 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
6010: 7a 65 28 70 55 70 2d 3e 70 55 70 64 61 74 65 29  ze(pUp->pUpdate)
6020: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
6030: 65 65 28 70 55 70 29 3b 0a 20 20 20 20 70 55 70  ee(pUp);.    pUp
6040: 20 3d 20 70 54 6d 70 3b 0a 20 20 7d 0a 20 20 0a   = pTmp;.  }.  .
6050: 20 20 70 49 74 65 72 2d 3e 70 53 65 6c 65 63 74    pIter->pSelect
6060: 20 3d 20 30 3b 0a 20 20 70 49 74 65 72 2d 3e 70   = 0;.  pIter->p
6070: 49 6e 73 65 72 74 20 3d 20 30 3b 0a 20 20 70 49  Insert = 0;.  pI
6080: 74 65 72 2d 3e 70 44 65 6c 65 74 65 20 3d 20 30  ter->pDelete = 0
6090: 3b 0a 20 20 70 49 74 65 72 2d 3e 70 52 62 75 55  ;.  pIter->pRbuU
60a0: 70 64 61 74 65 20 3d 20 30 3b 0a 20 20 70 49 74  pdate = 0;.  pIt
60b0: 65 72 2d 3e 70 54 6d 70 49 6e 73 65 72 74 20 3d  er->pTmpInsert =
60c0: 20 30 3b 0a 20 20 70 49 74 65 72 2d 3e 6e 43 6f   0;.  pIter->nCo
60d0: 6c 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  l = 0;.}../*.** 
60e0: 43 6c 65 61 6e 20 75 70 20 61 6e 79 20 72 65 73  Clean up any res
60f0: 6f 75 72 63 65 73 20 61 6c 6c 6f 63 61 74 65 64  ources allocated
6100: 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   as part of the 
6110: 69 74 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 20  iterator object 
6120: 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65  passed.** as the
6130: 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e 0a   only argument..
6140: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
6150: 62 75 4f 62 6a 49 74 65 72 46 69 6e 61 6c 69 7a  buObjIterFinaliz
6160: 65 28 52 62 75 4f 62 6a 49 74 65 72 20 2a 70 49  e(RbuObjIter *pI
6170: 74 65 72 29 7b 0a 20 20 72 62 75 4f 62 6a 49 74  ter){.  rbuObjIt
6180: 65 72 43 6c 65 61 72 53 74 61 74 65 6d 65 6e 74  erClearStatement
6190: 73 28 70 49 74 65 72 29 3b 0a 20 20 73 71 6c 69  s(pIter);.  sqli
61a0: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 49 74  te3_finalize(pIt
61b0: 65 72 2d 3e 70 54 62 6c 49 74 65 72 29 3b 0a 20  er->pTblIter);. 
61c0: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
61d0: 65 28 70 49 74 65 72 2d 3e 70 49 64 78 49 74 65  e(pIter->pIdxIte
61e0: 72 29 3b 0a 20 20 72 62 75 4f 62 6a 49 74 65 72  r);.  rbuObjIter
61f0: 46 72 65 65 43 6f 6c 73 28 70 49 74 65 72 29 3b  FreeCols(pIter);
6200: 0a 20 20 6d 65 6d 73 65 74 28 70 49 74 65 72 2c  .  memset(pIter,
6210: 20 30 2c 20 73 69 7a 65 6f 66 28 52 62 75 4f 62   0, sizeof(RbuOb
6220: 6a 49 74 65 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  jIter));.}../*.*
6230: 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 69 74  * Advance the it
6240: 65 72 61 74 6f 72 20 74 6f 20 74 68 65 20 6e 65  erator to the ne
6250: 78 74 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2a 0a  xt position..**.
6260: 2a 2a 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f  ** If no error o
6270: 63 63 75 72 73 2c 20 53 51 4c 49 54 45 5f 4f 4b  ccurs, SQLITE_OK
6280: 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
6290: 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 69 73   the iterator is
62a0: 20 6c 65 66 74 20 0a 2a 2a 20 70 6f 69 6e 74 69   left .** pointi
62b0: 6e 67 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65  ng to the next e
62c0: 6e 74 72 79 2e 20 4f 74 68 65 72 77 69 73 65 2c  ntry. Otherwise,
62d0: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 61   an error code a
62e0: 6e 64 20 6d 65 73 73 61 67 65 20 69 73 20 0a 2a  nd message is .*
62f0: 2a 20 6c 65 66 74 20 69 6e 20 74 68 65 20 52 42  * left in the RB
6300: 55 20 68 61 6e 64 6c 65 20 70 61 73 73 65 64 20  U handle passed 
6310: 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
6320: 75 6d 65 6e 74 2e 20 41 20 63 6f 70 79 20 6f 66  ument. A copy of
6330: 20 74 68 65 20 0a 2a 2a 20 65 72 72 6f 72 20 63   the .** error c
6340: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
6350: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
6360: 62 75 4f 62 6a 49 74 65 72 4e 65 78 74 28 73 71  buObjIterNext(sq
6370: 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 52 62 75  lite3rbu *p, Rbu
6380: 4f 62 6a 49 74 65 72 20 2a 70 49 74 65 72 29 7b  ObjIter *pIter){
6390: 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 2d 3e 72  .  int rc = p->r
63a0: 63 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  c;.  if( rc==SQL
63b0: 49 54 45 5f 4f 4b 20 29 7b 0a 0a 20 20 20 20 2f  ITE_OK ){..    /
63c0: 2a 20 46 72 65 65 20 61 6e 79 20 53 51 4c 69 74  * Free any SQLit
63d0: 65 20 73 74 61 74 65 6d 65 6e 74 73 20 75 73 65  e statements use
63e0: 64 20 77 68 69 6c 65 20 70 72 6f 63 65 73 73 69  d while processi
63f0: 6e 67 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  ng the previous 
6400: 6f 62 6a 65 63 74 20 2a 2f 20 0a 20 20 20 20 72  object */ .    r
6410: 62 75 4f 62 6a 49 74 65 72 43 6c 65 61 72 53 74  buObjIterClearSt
6420: 61 74 65 6d 65 6e 74 73 28 70 49 74 65 72 29 3b  atements(pIter);
6430: 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e  .    if( pIter->
6440: 7a 49 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  zIdx==0 ){.     
6450: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78   rc = sqlite3_ex
6460: 65 63 28 70 2d 3e 64 62 4d 61 69 6e 2c 0a 20 20  ec(p->dbMain,.  
6470: 20 20 20 20 20 20 20 20 22 44 52 4f 50 20 54 52          "DROP TR
6480: 49 47 47 45 52 20 49 46 20 45 58 49 53 54 53 20  IGGER IF EXISTS 
6490: 74 65 6d 70 2e 72 62 75 5f 69 6e 73 65 72 74 5f  temp.rbu_insert_
64a0: 74 72 3b 22 0a 20 20 20 20 20 20 20 20 20 20 22  tr;".          "
64b0: 44 52 4f 50 20 54 52 49 47 47 45 52 20 49 46 20  DROP TRIGGER IF 
64c0: 45 58 49 53 54 53 20 74 65 6d 70 2e 72 62 75 5f  EXISTS temp.rbu_
64d0: 75 70 64 61 74 65 31 5f 74 72 3b 22 0a 20 20 20  update1_tr;".   
64e0: 20 20 20 20 20 20 20 22 44 52 4f 50 20 54 52 49         "DROP TRI
64f0: 47 47 45 52 20 49 46 20 45 58 49 53 54 53 20 74  GGER IF EXISTS t
6500: 65 6d 70 2e 72 62 75 5f 75 70 64 61 74 65 32 5f  emp.rbu_update2_
6510: 74 72 3b 22 0a 20 20 20 20 20 20 20 20 20 20 22  tr;".          "
6520: 44 52 4f 50 20 54 52 49 47 47 45 52 20 49 46 20  DROP TRIGGER IF 
6530: 45 58 49 53 54 53 20 74 65 6d 70 2e 72 62 75 5f  EXISTS temp.rbu_
6540: 64 65 6c 65 74 65 5f 74 72 3b 22 0a 20 20 20 20  delete_tr;".    
6550: 20 20 20 20 20 20 2c 20 30 2c 20 30 2c 20 26 70        , 0, 0, &p
6560: 2d 3e 7a 45 72 72 6d 73 67 0a 20 20 20 20 20 20  ->zErrmsg.      
6570: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
6580: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
6590: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  ){.      if( pIt
65a0: 65 72 2d 3e 62 43 6c 65 61 6e 75 70 20 29 7b 0a  er->bCleanup ){.
65b0: 20 20 20 20 20 20 20 20 72 62 75 4f 62 6a 49 74          rbuObjIt
65c0: 65 72 46 72 65 65 43 6f 6c 73 28 70 49 74 65 72  erFreeCols(pIter
65d0: 29 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65 72  );.        pIter
65e0: 2d 3e 62 43 6c 65 61 6e 75 70 20 3d 20 30 3b 0a  ->bCleanup = 0;.
65f0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
6600: 69 74 65 33 5f 73 74 65 70 28 70 49 74 65 72 2d  ite3_step(pIter-
6610: 3e 70 54 62 6c 49 74 65 72 29 3b 0a 20 20 20 20  >pTblIter);.    
6620: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
6630: 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20  TE_ROW ){.      
6640: 20 20 20 20 72 63 20 3d 20 72 65 73 65 74 41 6e      rc = resetAn
6650: 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 49  dCollectError(pI
6660: 74 65 72 2d 3e 70 54 62 6c 49 74 65 72 2c 20 26  ter->pTblIter, &
6670: 70 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a 20 20 20  p->zErrmsg);.   
6680: 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 7a 54         pIter->zT
6690: 62 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  bl = 0;.        
66a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
66b0: 20 70 49 74 65 72 2d 3e 7a 54 62 6c 20 3d 20 28   pIter->zTbl = (
66c0: 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
66d0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
66e0: 70 49 74 65 72 2d 3e 70 54 62 6c 49 74 65 72 2c  pIter->pTblIter,
66f0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70   0);.          p
6700: 49 74 65 72 2d 3e 7a 44 61 74 61 54 62 6c 20 3d  Iter->zDataTbl =
6710: 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
6720: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
6730: 74 28 70 49 74 65 72 2d 3e 70 54 62 6c 49 74 65  t(pIter->pTblIte
6740: 72 2c 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  r,1);.          
6750: 72 63 20 3d 20 28 70 49 74 65 72 2d 3e 7a 44 61  rc = (pIter->zDa
6760: 74 61 54 62 6c 20 26 26 20 70 49 74 65 72 2d 3e  taTbl && pIter->
6770: 7a 54 62 6c 29 20 3f 20 53 51 4c 49 54 45 5f 4f  zTbl) ? SQLITE_O
6780: 4b 20 3a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  K : SQLITE_NOMEM
6790: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
67a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
67b0: 20 69 66 28 20 70 49 74 65 72 2d 3e 7a 49 64 78   if( pIter->zIdx
67c0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
67d0: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
67e0: 49 64 78 20 3d 20 70 49 74 65 72 2d 3e 70 49 64  Idx = pIter->pId
67f0: 78 49 74 65 72 3b 0a 20 20 20 20 20 20 20 20 20  xIter;.         
6800: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69   rc = sqlite3_bi
6810: 6e 64 5f 74 65 78 74 28 70 49 64 78 2c 20 31 2c  nd_text(pIdx, 1,
6820: 20 70 49 74 65 72 2d 3e 7a 54 62 6c 2c 20 2d 31   pIter->zTbl, -1
6830: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
6840: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
6850: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
6860: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
6870: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
6880: 73 74 65 70 28 70 49 74 65 72 2d 3e 70 49 64 78  step(pIter->pIdx
6890: 49 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Iter);.         
68a0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
68b0: 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ROW ){.         
68c0: 20 20 20 72 63 20 3d 20 72 65 73 65 74 41 6e 64     rc = resetAnd
68d0: 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 49 74  CollectError(pIt
68e0: 65 72 2d 3e 70 49 64 78 49 74 65 72 2c 20 26 70  er->pIdxIter, &p
68f0: 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a 20 20 20 20  ->zErrmsg);.    
6900: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 62          pIter->b
6910: 43 6c 65 61 6e 75 70 20 3d 20 31 3b 0a 20 20 20  Cleanup = 1;.   
6920: 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e           pIter->
6930: 7a 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  zIdx = 0;.      
6940: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6950: 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 7a 49         pIter->zI
6960: 64 78 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  dx = (const char
6970: 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
6980: 5f 74 65 78 74 28 70 49 74 65 72 2d 3e 70 49 64  _text(pIter->pId
6990: 78 49 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20  xIter, 0);.     
69a0: 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 54         pIter->iT
69b0: 6e 75 6d 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  num = sqlite3_co
69c0: 6c 75 6d 6e 5f 69 6e 74 28 70 49 74 65 72 2d 3e  lumn_int(pIter->
69d0: 70 49 64 78 49 74 65 72 2c 20 31 29 3b 0a 20 20  pIdxIter, 1);.  
69e0: 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d            pIter-
69f0: 3e 62 55 6e 69 71 75 65 20 3d 20 73 71 6c 69 74  >bUnique = sqlit
6a00: 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 49  e3_column_int(pI
6a10: 74 65 72 2d 3e 70 49 64 78 49 74 65 72 2c 20 32  ter->pIdxIter, 2
6a20: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
6a30: 63 20 3d 20 70 49 74 65 72 2d 3e 7a 49 64 78 20  c = pIter->zIdx 
6a40: 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51  ? SQLITE_OK : SQ
6a50: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
6a60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6a70: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
6a80: 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 53    }..  if( rc!=S
6a90: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
6aa0: 72 62 75 4f 62 6a 49 74 65 72 46 69 6e 61 6c 69  rbuObjIterFinali
6ab0: 7a 65 28 70 49 74 65 72 29 3b 0a 20 20 20 20 70  ze(pIter);.    p
6ac0: 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 7d 0a 20  ->rc = rc;.  }. 
6ad0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
6ae0: 2f 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d  /*.** The implem
6af0: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
6b00: 72 62 75 5f 74 61 72 67 65 74 5f 6e 61 6d 65 28  rbu_target_name(
6b10: 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 20  ) SQL function. 
6b20: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  This function.**
6b30: 20 61 63 63 65 70 74 73 20 6f 6e 65 20 61 72 67   accepts one arg
6b40: 75 6d 65 6e 74 20 2d 20 74 68 65 20 6e 61 6d 65  ument - the name
6b50: 20 6f 66 20 61 20 74 61 62 6c 65 20 69 6e 20 74   of a table in t
6b60: 68 65 20 52 42 55 20 64 61 74 61 62 61 73 65 2e  he RBU database.
6b70: 20 49 66 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65   If the.** table
6b80: 20 6e 61 6d 65 20 6d 61 74 63 68 65 73 20 74 68   name matches th
6b90: 65 20 70 61 74 74 65 72 6e 3a 0a 2a 2a 0a 2a 2a  e pattern:.**.**
6ba0: 20 20 20 20 20 64 61 74 61 5b 30 2d 39 5d 5f 3c       data[0-9]_<
6bb0: 6e 61 6d 65 3e 0a 2a 2a 0a 2a 2a 20 77 68 65 72  name>.**.** wher
6bc0: 65 20 3c 6e 61 6d 65 3e 20 69 73 20 61 6e 79 20  e <name> is any 
6bd0: 73 65 71 75 65 6e 63 65 20 6f 66 20 31 20 6f 72  sequence of 1 or
6be0: 20 6d 6f 72 65 20 63 68 61 72 61 63 74 65 72 73   more characters
6bf0: 2c 20 3c 6e 61 6d 65 3e 20 69 73 20 72 65 74 75  , <name> is retu
6c00: 72 6e 65 64 2e 0a 2a 2a 20 4f 74 68 65 72 77 69  rned..** Otherwi
6c10: 73 65 2c 20 69 66 20 74 68 65 20 6f 6e 6c 79 20  se, if the only 
6c20: 61 72 67 75 6d 65 6e 74 20 64 6f 65 73 20 6e 6f  argument does no
6c30: 74 20 6d 61 74 63 68 20 74 68 65 20 61 62 6f 76  t match the abov
6c40: 65 20 70 61 74 74 65 72 6e 2c 20 61 6e 20 53 51  e pattern, an SQ
6c50: 4c 0a 2a 2a 20 4e 55 4c 4c 20 69 73 20 72 65 74  L.** NULL is ret
6c60: 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  urned..**.**    
6c70: 20 22 64 61 74 61 5f 74 31 22 20 20 20 20 20 2d   "data_t1"     -
6c80: 3e 20 22 74 31 22 0a 2a 2a 20 20 20 20 20 22 64  > "t1".**     "d
6c90: 61 74 61 30 31 32 33 5f 74 32 22 20 2d 3e 20 22  ata0123_t2" -> "
6ca0: 74 32 22 0a 2a 2a 20 20 20 20 20 22 64 61 74 61  t2".**     "data
6cb0: 41 42 5f 74 33 22 20 20 20 2d 3e 20 4e 55 4c 4c  AB_t3"   -> NULL
6cc0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6cd0: 72 62 75 54 61 72 67 65 74 4e 61 6d 65 46 75 6e  rbuTargetNameFun
6ce0: 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  c(.  sqlite3_con
6cf0: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20  text *context,. 
6d00: 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c   int argc,.  sql
6d10: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
6d20: 76 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  v.){.  const cha
6d30: 72 20 2a 7a 49 6e 3b 0a 20 20 61 73 73 65 72 74  r *zIn;.  assert
6d40: 28 20 61 72 67 63 3d 3d 31 20 29 3b 0a 0a 20 20  ( argc==1 );..  
6d50: 7a 49 6e 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  zIn = (const cha
6d60: 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
6d70: 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a  _text(argv[0]);.
6d80: 20 20 69 66 28 20 7a 49 6e 20 26 26 20 73 74 72    if( zIn && str
6d90: 6c 65 6e 28 7a 49 6e 29 3e 34 20 26 26 20 6d 65  len(zIn)>4 && me
6da0: 6d 63 6d 70 28 22 64 61 74 61 22 2c 20 7a 49 6e  mcmp("data", zIn
6db0: 2c 20 34 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  , 4)==0 ){.    i
6dc0: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
6dd0: 34 3b 20 7a 49 6e 5b 69 5d 3e 3d 27 30 27 20 26  4; zIn[i]>='0' &
6de0: 26 20 7a 49 6e 5b 69 5d 3c 3d 27 39 27 3b 20 69  & zIn[i]<='9'; i
6df0: 2b 2b 29 3b 0a 20 20 20 20 69 66 28 20 7a 49 6e  ++);.    if( zIn
6e00: 5b 69 5d 3d 3d 27 5f 27 20 26 26 20 7a 49 6e 5b  [i]=='_' && zIn[
6e10: 69 2b 31 5d 20 29 7b 0a 20 20 20 20 20 20 73 71  i+1] ){.      sq
6e20: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
6e30: 74 28 63 6f 6e 74 65 78 74 2c 20 26 7a 49 6e 5b  t(context, &zIn[
6e40: 69 2b 31 5d 2c 20 2d 31 2c 20 53 51 4c 49 54 45  i+1], -1, SQLITE
6e50: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 7d 0a  _STATIC);.    }.
6e60: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69    }.}../*.** Ini
6e70: 74 69 61 6c 69 7a 65 20 74 68 65 20 69 74 65 72  tialize the iter
6e80: 61 74 6f 72 20 73 74 72 75 63 74 75 72 65 20 70  ator structure p
6e90: 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
6ea0: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a  ond argument..**
6eb0: 0a 2a 2a 20 49 66 20 6e 6f 20 65 72 72 6f 72 20  .** If no error 
6ec0: 6f 63 63 75 72 73 2c 20 53 51 4c 49 54 45 5f 4f  occurs, SQLITE_O
6ed0: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  K is returned an
6ee0: 64 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 69  d the iterator i
6ef0: 73 20 6c 65 66 74 20 0a 2a 2a 20 70 6f 69 6e 74  s left .** point
6f00: 69 6e 67 20 74 6f 20 74 68 65 20 66 69 72 73 74  ing to the first
6f10: 20 65 6e 74 72 79 2e 20 4f 74 68 65 72 77 69 73   entry. Otherwis
6f20: 65 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  e, an error code
6f30: 20 61 6e 64 20 6d 65 73 73 61 67 65 20 69 73 20   and message is 
6f40: 0a 2a 2a 20 6c 65 66 74 20 69 6e 20 74 68 65 20  .** left in the 
6f50: 52 42 55 20 68 61 6e 64 6c 65 20 70 61 73 73 65  RBU handle passe
6f60: 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  d as the first a
6f70: 72 67 75 6d 65 6e 74 2e 20 41 20 63 6f 70 79 20  rgument. A copy 
6f80: 6f 66 20 74 68 65 20 0a 2a 2a 20 65 72 72 6f 72  of the .** error
6f90: 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
6fa0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
6fb0: 20 72 62 75 4f 62 6a 49 74 65 72 46 69 72 73 74   rbuObjIterFirst
6fc0: 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20  (sqlite3rbu *p, 
6fd0: 52 62 75 4f 62 6a 49 74 65 72 20 2a 70 49 74 65  RbuObjIter *pIte
6fe0: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
6ff0: 6d 65 6d 73 65 74 28 70 49 74 65 72 2c 20 30 2c  memset(pIter, 0,
7000: 20 73 69 7a 65 6f 66 28 52 62 75 4f 62 6a 49 74   sizeof(RbuObjIt
7010: 65 72 29 29 3b 0a 0a 20 20 72 63 20 3d 20 70 72  er));..  rc = pr
7020: 65 70 61 72 65 41 6e 64 43 6f 6c 6c 65 63 74 45  epareAndCollectE
7030: 72 72 6f 72 28 70 2d 3e 64 62 52 62 75 2c 20 26  rror(p->dbRbu, &
7040: 70 49 74 65 72 2d 3e 70 54 62 6c 49 74 65 72 2c  pIter->pTblIter,
7050: 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 20 0a 20   &p->zErrmsg, . 
7060: 20 20 20 20 20 22 53 45 4c 45 43 54 20 72 62 75       "SELECT rbu
7070: 5f 74 61 72 67 65 74 5f 6e 61 6d 65 28 6e 61 6d  _target_name(nam
7080: 65 29 20 41 53 20 74 61 72 67 65 74 2c 20 6e 61  e) AS target, na
7090: 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d  me FROM sqlite_m
70a0: 61 73 74 65 72 20 22 0a 20 20 20 20 20 20 22 57  aster ".      "W
70b0: 48 45 52 45 20 74 79 70 65 20 49 4e 20 28 27 74  HERE type IN ('t
70c0: 61 62 6c 65 27 2c 20 27 76 69 65 77 27 29 20 41  able', 'view') A
70d0: 4e 44 20 74 61 72 67 65 74 20 49 53 20 4e 4f 54  ND target IS NOT
70e0: 20 4e 55 4c 4c 20 22 0a 20 20 20 20 20 20 22 4f   NULL ".      "O
70f0: 52 44 45 52 20 42 59 20 6e 61 6d 65 22 0a 20 20  RDER BY name".  
7100: 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  );..  if( rc==SQ
7110: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
7120: 63 20 3d 20 70 72 65 70 61 72 65 41 6e 64 43 6f  c = prepareAndCo
7130: 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62  llectError(p->db
7140: 4d 61 69 6e 2c 20 26 70 49 74 65 72 2d 3e 70 49  Main, &pIter->pI
7150: 64 78 49 74 65 72 2c 20 26 70 2d 3e 7a 45 72 72  dxIter, &p->zErr
7160: 6d 73 67 2c 0a 20 20 20 20 20 20 20 20 22 53 45  msg,.        "SE
7170: 4c 45 43 54 20 6e 61 6d 65 2c 20 72 6f 6f 74 70  LECT name, rootp
7180: 61 67 65 2c 20 73 71 6c 20 49 53 20 4e 55 4c 4c  age, sql IS NULL
7190: 20 4f 52 20 73 75 62 73 74 72 28 38 2c 20 36 29   OR substr(8, 6)
71a0: 3d 3d 27 55 4e 49 51 55 45 27 20 22 0a 20 20 20  =='UNIQUE' ".   
71b0: 20 20 20 20 20 22 20 20 46 52 4f 4d 20 6d 61 69       "  FROM mai
71c0: 6e 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  n.sqlite_master 
71d0: 22 0a 20 20 20 20 20 20 20 20 22 20 20 57 48 45  ".        "  WHE
71e0: 52 45 20 74 79 70 65 3d 27 69 6e 64 65 78 27 20  RE type='index' 
71f0: 41 4e 44 20 74 62 6c 5f 6e 61 6d 65 20 3d 20 3f  AND tbl_name = ?
7200: 22 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20  ".    );.  }..  
7210: 70 49 74 65 72 2d 3e 62 43 6c 65 61 6e 75 70 20  pIter->bCleanup 
7220: 3d 20 31 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 72  = 1;.  p->rc = r
7230: 63 3b 0a 20 20 72 65 74 75 72 6e 20 72 62 75 4f  c;.  return rbuO
7240: 62 6a 49 74 65 72 4e 65 78 74 28 70 2c 20 70 49  bjIterNext(p, pI
7250: 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ter);.}../*.** T
7260: 68 69 73 20 69 73 20 61 20 77 72 61 70 70 65 72  his is a wrapper
7270: 20 61 72 6f 75 6e 64 20 22 73 71 6c 69 74 65 33   around "sqlite3
7280: 5f 6d 70 72 69 6e 74 66 28 7a 46 6d 74 2c 20 2e  _mprintf(zFmt, .
7290: 2e 2e 29 22 2e 20 49 66 20 61 6e 20 4f 4f 4d 20  ..)". If an OOM 
72a0: 6f 63 63 75 72 73 2c 0a 2a 2a 20 61 6e 20 65 72  occurs,.** an er
72b0: 72 6f 72 20 63 6f 64 65 20 69 73 20 73 74 6f 72  ror code is stor
72c0: 65 64 20 69 6e 20 74 68 65 20 52 42 55 20 68 61  ed in the RBU ha
72d0: 6e 64 6c 65 20 70 61 73 73 65 64 20 61 73 20 74  ndle passed as t
72e0: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
72f0: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  t..**.** If an e
7300: 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79  rror has already
7310: 20 6f 63 63 75 72 72 65 64 20 28 70 2d 3e 72 63   occurred (p->rc
7320: 20 69 73 20 61 6c 72 65 61 64 79 20 73 65 74 20   is already set 
7330: 74 6f 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68  to something oth
7340: 65 72 0a 2a 2a 20 74 68 61 6e 20 53 51 4c 49 54  er.** than SQLIT
7350: 45 5f 4f 4b 29 2c 20 74 68 65 6e 20 74 68 69 73  E_OK), then this
7360: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
7370: 73 20 4e 55 4c 4c 20 77 69 74 68 6f 75 74 20 6d  s NULL without m
7380: 6f 64 69 66 79 69 6e 67 20 74 68 65 0a 2a 2a 20  odifying the.** 
7390: 73 74 6f 72 65 64 20 65 72 72 6f 72 20 63 6f 64  stored error cod
73a0: 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  e. In this case 
73b0: 69 74 20 73 74 69 6c 6c 20 63 61 6c 6c 73 20 73  it still calls s
73c0: 71 6c 69 74 65 33 5f 66 72 65 65 28 29 20 6f 6e  qlite3_free() on
73d0: 20 61 6e 79 20 0a 2a 2a 20 70 72 69 6e 74 66 28   any .** printf(
73e0: 29 20 70 61 72 61 6d 65 74 65 72 73 20 61 73 73  ) parameters ass
73f0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 25 7a 20  ociated with %z 
7400: 63 6f 6e 76 65 72 73 69 6f 6e 73 2e 0a 2a 2f 0a  conversions..*/.
7410: 73 74 61 74 69 63 20 63 68 61 72 20 2a 72 62 75  static char *rbu
7420: 4d 50 72 69 6e 74 66 28 73 71 6c 69 74 65 33 72  MPrintf(sqlite3r
7430: 62 75 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  bu *p, const cha
7440: 72 20 2a 7a 46 6d 74 2c 20 2e 2e 2e 29 7b 0a 20  r *zFmt, ...){. 
7450: 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 30 3b   char *zSql = 0;
7460: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
7470: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46   va_start(ap, zF
7480: 6d 74 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71  mt);.  zSql = sq
7490: 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a  lite3_vmprintf(z
74a0: 46 6d 74 2c 20 61 70 29 3b 0a 20 20 69 66 28 20  Fmt, ap);.  if( 
74b0: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
74c0: 20 29 7b 0a 20 20 20 20 69 66 28 20 7a 53 71 6c   ){.    if( zSql
74d0: 3d 3d 30 20 29 20 70 2d 3e 72 63 20 3d 20 53 51  ==0 ) p->rc = SQ
74e0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65  LITE_NOMEM;.  }e
74f0: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
7500: 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20  _free(zSql);.   
7510: 20 7a 53 71 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20   zSql = 0;.  }. 
7520: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72   va_end(ap);.  r
7530: 65 74 75 72 6e 20 7a 53 71 6c 3b 0a 7d 0a 0a 2f  eturn zSql;.}../
7540: 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 7a 46  *.** Argument zF
7550: 6d 74 20 69 73 20 61 20 73 71 6c 69 74 65 33 5f  mt is a sqlite3_
7560: 6d 70 72 69 6e 74 66 28 29 20 73 74 79 6c 65 20  mprintf() style 
7570: 66 6f 72 6d 61 74 20 73 74 72 69 6e 67 2e 20 54  format string. T
7580: 68 65 20 74 72 61 69 6c 69 6e 67 0a 2a 2a 20 61  he trailing.** a
7590: 72 67 75 6d 65 6e 74 73 20 61 72 65 20 74 68 65  rguments are the
75a0: 20 75 73 75 61 6c 20 73 75 62 73 69 74 75 74 69   usual subsituti
75b0: 6f 6e 20 76 61 6c 75 65 73 2e 20 54 68 69 73 20  on values. This 
75c0: 66 75 6e 63 74 69 6f 6e 20 70 65 72 66 6f 72 6d  function perform
75d0: 73 0a 2a 2a 20 74 68 65 20 70 72 69 6e 74 66 28  s.** the printf(
75e0: 29 20 73 74 79 6c 65 20 73 75 62 73 74 69 74 75  ) style substitu
75f0: 74 69 6f 6e 73 20 61 6e 64 20 65 78 65 63 75 74  tions and execut
7600: 65 73 20 74 68 65 20 72 65 73 75 6c 74 20 61 73  es the result as
7610: 20 61 6e 20 53 51 4c 0a 2a 2a 20 73 74 61 74 65   an SQL.** state
7620: 6d 65 6e 74 20 6f 6e 20 74 68 65 20 52 42 55 20  ment on the RBU 
7630: 68 61 6e 64 6c 65 73 20 64 61 74 61 62 61 73 65  handles database
7640: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
7650: 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65  ror occurs, an e
7660: 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 65 72  rror code and er
7670: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 73  ror message is s
7680: 74 6f 72 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20  tored in the.** 
7690: 52 42 55 20 68 61 6e 64 6c 65 2e 20 49 66 20 61  RBU handle. If a
76a0: 6e 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65  n error has alre
76b0: 61 64 79 20 6f 63 63 75 72 72 65 64 20 77 68 65  ady occurred whe
76c0: 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
76d0: 69 73 0a 2a 2a 20 63 61 6c 6c 65 64 2c 20 69 74  is.** called, it
76e0: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
76f0: 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 4d 50  static int rbuMP
7700: 72 69 6e 74 66 45 78 65 63 28 73 71 6c 69 74 65  rintfExec(sqlite
7710: 33 72 62 75 20 2a 70 2c 20 73 71 6c 69 74 65 33  3rbu *p, sqlite3
7720: 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72   *db, const char
7730: 20 2a 7a 46 6d 74 2c 20 2e 2e 2e 29 7b 0a 20 20   *zFmt, ...){.  
7740: 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63 68  va_list ap;.  ch
7750: 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 76 61 5f 73  ar *zSql;.  va_s
7760: 74 61 72 74 28 61 70 2c 20 7a 46 6d 74 29 3b 0a  tart(ap, zFmt);.
7770: 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
7780: 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6d 74 2c 20  _vmprintf(zFmt, 
7790: 61 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63  ap);.  if( p->rc
77a0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
77b0: 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29     if( zSql==0 )
77c0: 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20  {.      p->rc = 
77d0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
77e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
77f0: 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65  ->rc = sqlite3_e
7800: 78 65 63 28 64 62 2c 20 7a 53 71 6c 2c 20 30 2c  xec(db, zSql, 0,
7810: 20 30 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 29   0, &p->zErrmsg)
7820: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
7830: 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29  lite3_free(zSql)
7840: 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a  ;.  va_end(ap);.
7850: 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 3b 0a    return p->rc;.
7860: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  }../*.** Attempt
7870: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64   to allocate and
7880: 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
7890: 72 20 74 6f 20 61 20 7a 65 72 6f 65 64 20 62 6c  r to a zeroed bl
78a0: 6f 63 6b 20 6f 66 20 6e 42 79 74 65 20 0a 2a 2a  ock of nByte .**
78b0: 20 62 79 74 65 73 2e 20 0a 2a 2a 0a 2a 2a 20 49   bytes. .**.** I
78c0: 66 20 61 6e 20 65 72 72 6f 72 20 28 69 2e 65 2e  f an error (i.e.
78d0: 20 61 6e 20 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f   an OOM conditio
78e0: 6e 29 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  n) occurs, retur
78f0: 6e 20 4e 55 4c 4c 20 61 6e 64 20 6c 65 61 76 65  n NULL and leave
7900: 20 61 6e 20 0a 2a 2a 20 65 72 72 6f 72 20 63 6f   an .** error co
7910: 64 65 20 69 6e 20 74 68 65 20 72 62 75 20 68 61  de in the rbu ha
7920: 6e 64 6c 65 20 70 61 73 73 65 64 20 61 73 20 74  ndle passed as t
7930: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
7940: 74 2e 20 4f 72 2c 20 69 66 20 61 6e 20 0a 2a 2a  t. Or, if an .**
7950: 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61   error has alrea
7960: 64 79 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e  dy occurred when
7970: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
7980: 73 20 63 61 6c 6c 65 64 2c 20 72 65 74 75 72 6e  s called, return
7990: 20 4e 55 4c 4c 20 0a 2a 2a 20 69 6d 6d 65 64 69   NULL .** immedi
79a0: 61 74 65 6c 79 20 77 69 74 68 6f 75 74 20 61 74  ately without at
79b0: 74 65 6d 70 74 69 6e 67 20 74 68 65 20 61 6c 6c  tempting the all
79c0: 6f 63 61 74 69 6f 6e 20 6f 72 20 6d 6f 64 69 66  ocation or modif
79d0: 79 69 6e 67 20 74 68 65 20 73 74 6f 72 65 64 0a  ying the stored.
79e0: 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  ** error code..*
79f0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 72  /.static void *r
7a00: 62 75 4d 61 6c 6c 6f 63 28 73 71 6c 69 74 65 33  buMalloc(sqlite3
7a10: 72 62 75 20 2a 70 2c 20 69 6e 74 20 6e 42 79 74  rbu *p, int nByt
7a20: 65 29 7b 0a 20 20 76 6f 69 64 20 2a 70 52 65 74  e){.  void *pRet
7a30: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 72   = 0;.  if( p->r
7a40: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
7a50: 20 20 20 20 61 73 73 65 72 74 28 20 6e 42 79 74      assert( nByt
7a60: 65 3e 30 20 29 3b 0a 20 20 20 20 70 52 65 74 20  e>0 );.    pRet 
7a70: 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
7a80: 36 34 28 6e 42 79 74 65 29 3b 0a 20 20 20 20 69  64(nByte);.    i
7a90: 66 28 20 70 52 65 74 3d 3d 30 20 29 7b 0a 20 20  f( pRet==0 ){.  
7aa0: 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
7ab0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65  TE_NOMEM;.    }e
7ac0: 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65  lse{.      memse
7ad0: 74 28 70 52 65 74 2c 20 30 2c 20 6e 42 79 74 65  t(pRet, 0, nByte
7ae0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
7af0: 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 0a  eturn pRet;.}...
7b00: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
7b10: 6e 64 20 7a 65 72 6f 20 74 68 65 20 70 49 74 65  nd zero the pIte
7b20: 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 5d 20 61 6e  r->azTblCol[] an
7b30: 64 20 61 62 54 62 6c 50 6b 5b 5d 20 61 72 72 61  d abTblPk[] arra
7b40: 79 73 20 73 6f 20 74 68 61 74 0a 2a 2a 20 74 68  ys so that.** th
7b50: 65 72 65 20 69 73 20 72 6f 6f 6d 20 66 6f 72 20  ere is room for 
7b60: 61 74 20 6c 65 61 73 74 20 6e 43 6f 6c 20 65 6c  at least nCol el
7b70: 65 6d 65 6e 74 73 2e 20 49 66 20 61 6e 20 4f 4f  ements. If an OO
7b80: 4d 20 6f 63 63 75 72 73 2c 20 73 74 6f 72 65 20  M occurs, store 
7b90: 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65  an.** error code
7ba0: 20 69 6e 20 74 68 65 20 52 42 55 20 68 61 6e 64   in the RBU hand
7bb0: 6c 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  le passed as the
7bc0: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
7bd0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
7be0: 72 62 75 41 6c 6c 6f 63 61 74 65 49 74 65 72 41  rbuAllocateIterA
7bf0: 72 72 61 79 73 28 73 71 6c 69 74 65 33 72 62 75  rrays(sqlite3rbu
7c00: 20 2a 70 2c 20 52 62 75 4f 62 6a 49 74 65 72 20   *p, RbuObjIter 
7c10: 2a 70 49 74 65 72 2c 20 69 6e 74 20 6e 43 6f 6c  *pIter, int nCol
7c20: 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d  ){.  int nByte =
7c30: 20 28 32 2a 73 69 7a 65 6f 66 28 63 68 61 72 2a   (2*sizeof(char*
7c40: 29 20 2b 20 73 69 7a 65 6f 66 28 69 6e 74 29 20  ) + sizeof(int) 
7c50: 2b 20 33 2a 73 69 7a 65 6f 66 28 75 38 29 29 20  + 3*sizeof(u8)) 
7c60: 2a 20 6e 43 6f 6c 3b 0a 20 20 63 68 61 72 20 2a  * nCol;.  char *
7c70: 2a 61 7a 4e 65 77 3b 0a 0a 20 20 61 7a 4e 65 77  *azNew;..  azNew
7c80: 20 3d 20 28 63 68 61 72 2a 2a 29 72 62 75 4d 61   = (char**)rbuMa
7c90: 6c 6c 6f 63 28 70 2c 20 6e 42 79 74 65 29 3b 0a  lloc(p, nByte);.
7ca0: 20 20 69 66 28 20 61 7a 4e 65 77 20 29 7b 0a 20    if( azNew ){. 
7cb0: 20 20 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43     pIter->azTblC
7cc0: 6f 6c 20 3d 20 61 7a 4e 65 77 3b 0a 20 20 20 20  ol = azNew;.    
7cd0: 70 49 74 65 72 2d 3e 61 7a 54 62 6c 54 79 70 65  pIter->azTblType
7ce0: 20 3d 20 26 61 7a 4e 65 77 5b 6e 43 6f 6c 5d 3b   = &azNew[nCol];
7cf0: 0a 20 20 20 20 70 49 74 65 72 2d 3e 61 69 53 72  .    pIter->aiSr
7d00: 63 4f 72 64 65 72 20 3d 20 28 69 6e 74 2a 29 26  cOrder = (int*)&
7d10: 70 49 74 65 72 2d 3e 61 7a 54 62 6c 54 79 70 65  pIter->azTblType
7d20: 5b 6e 43 6f 6c 5d 3b 0a 20 20 20 20 70 49 74 65  [nCol];.    pIte
7d30: 72 2d 3e 61 62 54 62 6c 50 6b 20 3d 20 28 75 38  r->abTblPk = (u8
7d40: 2a 29 26 70 49 74 65 72 2d 3e 61 69 53 72 63 4f  *)&pIter->aiSrcO
7d50: 72 64 65 72 5b 6e 43 6f 6c 5d 3b 0a 20 20 20 20  rder[nCol];.    
7d60: 70 49 74 65 72 2d 3e 61 62 4e 6f 74 4e 75 6c 6c  pIter->abNotNull
7d70: 20 3d 20 28 75 38 2a 29 26 70 49 74 65 72 2d 3e   = (u8*)&pIter->
7d80: 61 62 54 62 6c 50 6b 5b 6e 43 6f 6c 5d 3b 0a 20  abTblPk[nCol];. 
7d90: 20 20 20 70 49 74 65 72 2d 3e 61 62 49 6e 64 65     pIter->abInde
7da0: 78 65 64 20 3d 20 28 75 38 2a 29 26 70 49 74 65  xed = (u8*)&pIte
7db0: 72 2d 3e 61 62 4e 6f 74 4e 75 6c 6c 5b 6e 43 6f  r->abNotNull[nCo
7dc0: 6c 5d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  l];.  }.}../*.**
7dd0: 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   The first argum
7de0: 65 6e 74 20 6d 75 73 74 20 62 65 20 61 20 6e 75  ent must be a nu
7df0: 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72  l-terminated str
7e00: 69 6e 67 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ing. This functi
7e10: 6f 6e 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61 20  on.** returns a 
7e20: 63 6f 70 79 20 6f 66 20 74 68 65 20 73 74 72 69  copy of the stri
7e30: 6e 67 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74  ng in memory obt
7e40: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
7e50: 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20  e3_malloc()..** 
7e60: 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e  It is the respon
7e70: 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
7e80: 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75  caller to eventu
7e90: 61 6c 6c 79 20 66 72 65 65 20 74 68 69 73 20 6d  ally free this m
7ea0: 65 6d 6f 72 79 0a 2a 2a 20 75 73 69 6e 67 20 73  emory.** using s
7eb0: 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a  qlite3_free()..*
7ec0: 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 63  *.** If an OOM c
7ed0: 6f 6e 64 69 74 69 6f 6e 20 69 73 20 65 6e 63 6f  ondition is enco
7ee0: 75 6e 74 65 72 65 64 20 77 68 65 6e 20 61 74 74  untered when att
7ef0: 65 6d 70 74 69 6e 67 20 74 6f 20 61 6c 6c 6f 63  empting to alloc
7f00: 61 74 65 20 6d 65 6d 6f 72 79 2c 0a 2a 2a 20 6f  ate memory,.** o
7f10: 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 20 28  utput variable (
7f20: 2a 70 52 63 29 20 69 73 20 73 65 74 20 74 6f 20  *pRc) is set to 
7f30: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 62 65 66  SQLITE_NOMEM bef
7f40: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 4f  ore returning. O
7f50: 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 69 66 20  therwise,.** if 
7f60: 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73  the allocation s
7f70: 75 63 63 65 65 64 73 2c 20 28 2a 70 52 63 29 20  ucceeds, (*pRc) 
7f80: 69 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65  is left unchange
7f90: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  d..*/.static cha
7fa0: 72 20 2a 72 62 75 53 74 72 6e 64 75 70 28 63 6f  r *rbuStrndup(co
7fb0: 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 72 2c 20  nst char *zStr, 
7fc0: 69 6e 74 20 2a 70 52 63 29 7b 0a 20 20 63 68 61  int *pRc){.  cha
7fd0: 72 20 2a 7a 52 65 74 20 3d 20 30 3b 0a 0a 20 20  r *zRet = 0;..  
7fe0: 61 73 73 65 72 74 28 20 2a 70 52 63 3d 3d 53 51  assert( *pRc==SQ
7ff0: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28  LITE_OK );.  if(
8000: 20 7a 53 74 72 20 29 7b 0a 20 20 20 20 73 69 7a   zStr ){.    siz
8010: 65 5f 74 20 6e 43 6f 70 79 20 3d 20 73 74 72 6c  e_t nCopy = strl
8020: 65 6e 28 7a 53 74 72 29 20 2b 20 31 3b 0a 20 20  en(zStr) + 1;.  
8030: 20 20 7a 52 65 74 20 3d 20 28 63 68 61 72 2a 29    zRet = (char*)
8040: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
8050: 28 6e 43 6f 70 79 29 3b 0a 20 20 20 20 69 66 28  (nCopy);.    if(
8060: 20 7a 52 65 74 20 29 7b 0a 20 20 20 20 20 20 6d   zRet ){.      m
8070: 65 6d 63 70 79 28 7a 52 65 74 2c 20 7a 53 74 72  emcpy(zRet, zStr
8080: 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20 7d 65  , nCopy);.    }e
8090: 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 52 63 20  lse{.      *pRc 
80a0: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
80b0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
80c0: 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a  urn zRet;.}../*.
80d0: 2a 2a 20 46 69 6e 61 6c 69 7a 65 20 74 68 65 20  ** Finalize the 
80e0: 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64  statement passed
80f0: 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
8100: 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49  rgument..**.** I
8110: 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69  f the sqlite3_fi
8120: 6e 61 6c 69 7a 65 28 29 20 63 61 6c 6c 20 69 6e  nalize() call in
8130: 64 69 63 61 74 65 73 20 74 68 61 74 20 61 6e 20  dicates that an 
8140: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e  error occurs, an
8150: 64 20 74 68 65 0a 2a 2a 20 72 62 75 20 68 61 6e  d the.** rbu han
8160: 64 6c 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  dle error code i
8170: 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 73 65  s not already se
8180: 74 2c 20 73 65 74 20 74 68 65 20 65 72 72 6f 72  t, set the error
8190: 20 63 6f 64 65 20 61 6e 64 20 65 72 72 6f 72 0a   code and error.
81a0: 2a 2a 20 6d 65 73 73 61 67 65 20 61 63 63 6f 72  ** message accor
81b0: 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  dingly..*/.stati
81c0: 63 20 76 6f 69 64 20 72 62 75 46 69 6e 61 6c 69  c void rbuFinali
81d0: 7a 65 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70  ze(sqlite3rbu *p
81e0: 2c 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a  , sqlite3_stmt *
81f0: 70 53 74 6d 74 29 7b 0a 20 20 73 71 6c 69 74 65  pStmt){.  sqlite
8200: 33 20 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f  3 *db = sqlite3_
8210: 64 62 5f 68 61 6e 64 6c 65 28 70 53 74 6d 74 29  db_handle(pStmt)
8220: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c  ;.  int rc = sql
8230: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
8240: 74 6d 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72  tmt);.  if( p->r
8250: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
8260: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
8270: 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b  .    p->rc = rc;
8280: 0a 20 20 20 20 70 2d 3e 7a 45 72 72 6d 73 67 20  .    p->zErrmsg 
8290: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
82a0: 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f  f("%s", sqlite3_
82b0: 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 7d  errmsg(db));.  }
82c0: 0a 7d 0a 0a 2f 2a 20 44 65 74 65 72 6d 69 6e 65  .}../* Determine
82d0: 20 74 68 65 20 74 79 70 65 20 6f 66 20 61 20 74   the type of a t
82e0: 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 70 65  able..**.**   pe
82f0: 54 79 70 65 20 69 73 20 6f 66 20 74 79 70 65 20  Type is of type 
8300: 28 69 6e 74 2a 29 2c 20 61 20 70 6f 69 6e 74 65  (int*), a pointe
8310: 72 20 74 6f 20 61 6e 20 6f 75 74 70 75 74 20 70  r to an output p
8320: 61 72 61 6d 65 74 65 72 20 6f 66 20 74 79 70 65  arameter of type
8330: 0a 2a 2a 20 20 20 28 69 6e 74 29 2e 20 54 68 69  .**   (int). Thi
8340: 73 20 63 61 6c 6c 20 73 65 74 73 20 74 68 65 20  s call sets the 
8350: 6f 75 74 70 75 74 20 70 61 72 61 6d 65 74 65 72  output parameter
8360: 20 61 73 20 66 6f 6c 6c 6f 77 73 2c 20 64 65 70   as follows, dep
8370: 65 6e 64 69 6e 67 0a 2a 2a 20 20 20 6f 6e 20 74  ending.**   on t
8380: 68 65 20 74 79 70 65 20 6f 66 20 74 68 65 20 74  he type of the t
8390: 61 62 6c 65 20 73 70 65 63 69 66 69 65 64 20 62  able specified b
83a0: 79 20 70 61 72 61 6d 65 74 65 72 73 20 64 62 4e  y parameters dbN
83b0: 61 6d 65 20 61 6e 64 20 7a 54 62 6c 2e 0a 2a 2a  ame and zTbl..**
83c0: 0a 2a 2a 20 20 20 20 20 52 42 55 5f 50 4b 5f 4e  .**     RBU_PK_N
83d0: 4f 54 41 42 4c 45 3a 20 20 20 20 20 20 20 4e 6f  OTABLE:       No
83e0: 20 73 75 63 68 20 74 61 62 6c 65 2e 0a 2a 2a 20   such table..** 
83f0: 20 20 20 20 52 42 55 5f 50 4b 5f 4e 4f 4e 45 3a      RBU_PK_NONE:
8400: 20 20 20 20 20 20 20 20 20 20 54 61 62 6c 65 20            Table 
8410: 68 61 73 20 61 6e 20 69 6d 70 6c 69 63 69 74 20  has an implicit 
8420: 72 6f 77 69 64 2e 0a 2a 2a 20 20 20 20 20 52 42  rowid..**     RB
8430: 55 5f 50 4b 5f 49 50 4b 3a 20 20 20 20 20 20 20  U_PK_IPK:       
8440: 20 20 20 20 54 61 62 6c 65 20 68 61 73 20 61 6e      Table has an
8450: 20 65 78 70 6c 69 63 69 74 20 49 50 4b 20 63 6f   explicit IPK co
8460: 6c 75 6d 6e 2e 0a 2a 2a 20 20 20 20 20 52 42 55  lumn..**     RBU
8470: 5f 50 4b 5f 45 58 54 45 52 4e 41 4c 3a 20 20 20  _PK_EXTERNAL:   
8480: 20 20 20 54 61 62 6c 65 20 68 61 73 20 61 6e 20     Table has an 
8490: 65 78 74 65 72 6e 61 6c 20 50 4b 20 69 6e 64 65  external PK inde
84a0: 78 2e 0a 2a 2a 20 20 20 20 20 52 42 55 5f 50 4b  x..**     RBU_PK
84b0: 5f 57 49 54 48 4f 55 54 5f 52 4f 57 49 44 3a 20  _WITHOUT_ROWID: 
84c0: 54 61 62 6c 65 20 69 73 20 57 49 54 48 4f 55 54  Table is WITHOUT
84d0: 20 52 4f 57 49 44 2e 0a 2a 2a 20 20 20 20 20 52   ROWID..**     R
84e0: 42 55 5f 50 4b 5f 56 54 41 42 3a 20 20 20 20 20  BU_PK_VTAB:     
84f0: 20 20 20 20 20 54 61 62 6c 65 20 69 73 20 61 20       Table is a 
8500: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a  virtual table..*
8510: 2a 0a 2a 2a 20 20 20 41 72 67 75 6d 65 6e 74 20  *.**   Argument 
8520: 2a 70 69 50 6b 20 69 73 20 61 6c 73 6f 20 6f 66  *piPk is also of
8530: 20 74 79 70 65 20 28 69 6e 74 2a 29 2c 20 61 6e   type (int*), an
8540: 64 20 61 6c 73 6f 20 70 6f 69 6e 74 73 20 74 6f  d also points to
8550: 20 61 6e 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20   an output.**   
8560: 70 61 72 61 6d 65 74 65 72 2e 20 55 6e 6c 65 73  parameter. Unles
8570: 73 20 74 68 65 20 74 61 62 6c 65 20 68 61 73 20  s the table has 
8580: 61 6e 20 65 78 74 65 72 6e 61 6c 20 70 72 69 6d  an external prim
8590: 61 72 79 20 6b 65 79 20 69 6e 64 65 78 20 0a 2a  ary key index .*
85a0: 2a 20 20 20 28 69 2e 65 2e 20 75 6e 6c 65 73 73  *   (i.e. unless
85b0: 20 2a 70 65 54 79 70 65 20 69 73 20 73 65 74 20   *peType is set 
85c0: 74 6f 20 33 29 2c 20 74 68 65 6e 20 2a 70 69 50  to 3), then *piP
85d0: 6b 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  k is set to zero
85e0: 2e 20 4f 72 2c 0a 2a 2a 20 20 20 69 66 20 74 68  . Or,.**   if th
85f0: 65 20 74 61 62 6c 65 20 64 6f 65 73 20 68 61 76  e table does hav
8600: 65 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 70 72  e an external pr
8610: 69 6d 61 72 79 20 6b 65 79 20 69 6e 64 65 78 2c  imary key index,
8620: 20 74 68 65 6e 20 2a 70 69 50 6b 0a 2a 2a 20 20   then *piPk.**  
8630: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 72   is set to the r
8640: 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  oot page number 
8650: 6f 66 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b  of the primary k
8660: 65 79 20 69 6e 64 65 78 20 62 65 66 6f 72 65 0a  ey index before.
8670: 2a 2a 20 20 20 72 65 74 75 72 6e 69 6e 67 2e 0a  **   returning..
8680: 2a 2a 0a 2a 2a 20 41 4c 47 4f 52 49 54 48 4d 3a  **.** ALGORITHM:
8690: 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 6e 6f 20  .**.**   if( no 
86a0: 65 6e 74 72 79 20 65 78 69 73 74 73 20 69 6e 20  entry exists in 
86b0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 29 7b  sqlite_master ){
86c0: 0a 2a 2a 20 20 20 20 20 72 65 74 75 72 6e 20 52  .**     return R
86d0: 42 55 5f 50 4b 5f 4e 4f 54 41 42 4c 45 0a 2a 2a  BU_PK_NOTABLE.**
86e0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c     }else if( sql
86f0: 20 66 6f 72 20 74 68 65 20 65 6e 74 72 79 20 73   for the entry s
8700: 74 61 72 74 73 20 77 69 74 68 20 22 43 52 45 41  tarts with "CREA
8710: 54 45 20 56 49 52 54 55 41 4c 22 20 29 7b 0a 2a  TE VIRTUAL" ){.*
8720: 2a 20 20 20 20 20 72 65 74 75 72 6e 20 52 42 55  *     return RBU
8730: 5f 50 4b 5f 56 54 41 42 0a 2a 2a 20 20 20 7d 65  _PK_VTAB.**   }e
8740: 6c 73 65 20 69 66 28 20 22 50 52 41 47 4d 41 20  lse if( "PRAGMA 
8750: 69 6e 64 65 78 5f 6c 69 73 74 28 29 22 20 66 6f  index_list()" fo
8760: 72 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6e 74  r the table cont
8770: 61 69 6e 73 20 61 20 22 70 6b 22 20 69 6e 64 65  ains a "pk" inde
8780: 78 20 29 7b 0a 2a 2a 20 20 20 20 20 69 66 28 20  x ){.**     if( 
8790: 74 68 65 20 69 6e 64 65 78 20 74 68 61 74 20 69  the index that i
87a0: 73 20 74 68 65 20 70 6b 20 65 78 69 73 74 73 20  s the pk exists 
87b0: 69 6e 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  in sqlite_master
87c0: 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 2a 70 69   ){.**       *pi
87d0: 50 4b 20 3d 20 72 6f 6f 74 70 61 67 65 20 6f 66  PK = rootpage of
87e0: 20 74 68 61 74 20 69 6e 64 65 78 2e 0a 2a 2a 20   that index..** 
87f0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 52 42 55        return RBU
8800: 5f 50 4b 5f 45 58 54 45 52 4e 41 4c 0a 2a 2a 20  _PK_EXTERNAL.** 
8810: 20 20 20 20 7d 65 6c 73 65 7b 0a 2a 2a 20 20 20      }else{.**   
8820: 20 20 20 20 72 65 74 75 72 6e 20 52 42 55 5f 50      return RBU_P
8830: 4b 5f 57 49 54 48 4f 55 54 5f 52 4f 57 49 44 0a  K_WITHOUT_ROWID.
8840: 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20 7d 65  **     }.**   }e
8850: 6c 73 65 20 69 66 28 20 22 50 52 41 47 4d 41 20  lse if( "PRAGMA 
8860: 74 61 62 6c 65 5f 69 6e 66 6f 28 29 22 20 6c 69  table_info()" li
8870: 73 74 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  sts one or more 
8880: 22 70 6b 22 20 63 6f 6c 75 6d 6e 73 20 29 7b 0a  "pk" columns ){.
8890: 2a 2a 20 20 20 20 20 72 65 74 75 72 6e 20 52 42  **     return RB
88a0: 55 5f 50 4b 5f 49 50 4b 0a 2a 2a 20 20 20 7d 65  U_PK_IPK.**   }e
88b0: 6c 73 65 7b 0a 2a 2a 20 20 20 20 20 72 65 74 75  lse{.**     retu
88c0: 72 6e 20 52 42 55 5f 50 4b 5f 4e 4f 4e 45 0a 2a  rn RBU_PK_NONE.*
88d0: 2a 20 20 20 7d 0a 2a 2f 0a 73 74 61 74 69 63 20  *   }.*/.static 
88e0: 76 6f 69 64 20 72 62 75 54 61 62 6c 65 54 79 70  void rbuTableTyp
88f0: 65 28 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20  e(.  sqlite3rbu 
8900: 2a 70 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  *p,.  const char
8910: 20 2a 7a 54 61 62 2c 0a 20 20 69 6e 74 20 2a 70   *zTab,.  int *p
8920: 65 54 79 70 65 2c 0a 20 20 69 6e 74 20 2a 70 69  eType,.  int *pi
8930: 54 6e 75 6d 2c 0a 20 20 69 6e 74 20 2a 70 69 50  Tnum,.  int *piP
8940: 6b 0a 29 7b 0a 20 20 2f 2a 0a 20 20 2a 2a 20 30  k.){.  /*.  ** 0
8950: 29 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a  ) SELECT count(*
8960: 29 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  ) FROM sqlite_ma
8970: 73 74 65 72 20 77 68 65 72 65 20 6e 61 6d 65 3d  ster where name=
8980: 25 51 20 41 4e 44 20 49 73 56 69 72 74 75 61 6c  %Q AND IsVirtual
8990: 28 25 51 29 0a 20 20 2a 2a 20 31 29 20 50 52 41  (%Q).  ** 1) PRA
89a0: 47 4d 41 20 69 6e 64 65 78 5f 6c 69 73 74 20 3d  GMA index_list =
89b0: 20 3f 0a 20 20 2a 2a 20 32 29 20 53 45 4c 45 43   ?.  ** 2) SELEC
89c0: 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
89d0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 77 68  sqlite_master wh
89e0: 65 72 65 20 6e 61 6d 65 3d 25 51 20 0a 20 20 2a  ere name=%Q .  *
89f0: 2a 20 33 29 20 50 52 41 47 4d 41 20 74 61 62 6c  * 3) PRAGMA tabl
8a00: 65 5f 69 6e 66 6f 20 3d 20 3f 0a 20 20 2a 2f 0a  e_info = ?.  */.
8a10: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
8a20: 61 53 74 6d 74 5b 34 5d 20 3d 20 7b 30 2c 20 30  aStmt[4] = {0, 0
8a30: 2c 20 30 2c 20 30 7d 3b 0a 0a 20 20 2a 70 65 54  , 0, 0};..  *peT
8a40: 79 70 65 20 3d 20 52 42 55 5f 50 4b 5f 4e 4f 54  ype = RBU_PK_NOT
8a50: 41 42 4c 45 3b 0a 20 20 2a 70 69 50 6b 20 3d 20  ABLE;.  *piPk = 
8a60: 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  0;..  assert( p-
8a70: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
8a80: 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70  ;.  p->rc = prep
8a90: 61 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63  areFreeAndCollec
8aa0: 74 45 72 72 6f 72 28 70 2d 3e 64 62 4d 61 69 6e  tError(p->dbMain
8ab0: 2c 20 26 61 53 74 6d 74 5b 30 5d 2c 20 26 70 2d  , &aStmt[0], &p-
8ac0: 3e 7a 45 72 72 6d 73 67 2c 20 0a 20 20 20 20 73  >zErrmsg, .    s
8ad0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a  qlite3_mprintf(.
8ae0: 20 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43            "SELEC
8af0: 54 20 28 73 71 6c 20 4c 49 4b 45 20 27 63 72 65  T (sql LIKE 'cre
8b00: 61 74 65 20 76 69 72 74 75 61 6c 25 25 27 29 2c  ate virtual%%'),
8b10: 20 72 6f 6f 74 70 61 67 65 22 0a 20 20 20 20 20   rootpage".     
8b20: 20 20 20 20 20 22 20 20 46 52 4f 4d 20 73 71 6c       "  FROM sql
8b30: 69 74 65 5f 6d 61 73 74 65 72 22 0a 20 20 20 20  ite_master".    
8b40: 20 20 20 20 20 20 22 20 57 48 45 52 45 20 6e 61        " WHERE na
8b50: 6d 65 3d 25 51 22 2c 20 7a 54 61 62 0a 20 20 29  me=%Q", zTab.  )
8b60: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 21 3d  );.  if( p->rc!=
8b70: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c  SQLITE_OK || sql
8b80: 69 74 65 33 5f 73 74 65 70 28 61 53 74 6d 74 5b  ite3_step(aStmt[
8b90: 30 5d 29 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20  0])!=SQLITE_ROW 
8ba0: 29 7b 0a 20 20 20 20 2f 2a 20 45 69 74 68 65 72  ){.    /* Either
8bb0: 20 61 6e 20 65 72 72 6f 72 2c 20 6f 72 20 6e 6f   an error, or no
8bc0: 20 73 75 63 68 20 74 61 62 6c 65 2e 20 2a 2f 0a   such table. */.
8bd0: 20 20 20 20 67 6f 74 6f 20 72 62 75 54 61 62 6c      goto rbuTabl
8be0: 65 54 79 70 65 5f 65 6e 64 3b 0a 20 20 7d 0a 20  eType_end;.  }. 
8bf0: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c   if( sqlite3_col
8c00: 75 6d 6e 5f 69 6e 74 28 61 53 74 6d 74 5b 30 5d  umn_int(aStmt[0]
8c10: 2c 20 30 29 20 29 7b 0a 20 20 20 20 2a 70 65 54  , 0) ){.    *peT
8c20: 79 70 65 20 3d 20 52 42 55 5f 50 4b 5f 56 54 41  ype = RBU_PK_VTA
8c30: 42 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  B;              
8c40: 20 20 20 20 20 20 20 2f 2a 20 76 69 72 74 75 61         /* virtua
8c50: 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 67  l table */.    g
8c60: 6f 74 6f 20 72 62 75 54 61 62 6c 65 54 79 70 65  oto rbuTableType
8c70: 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 2a 70 69 54  _end;.  }.  *piT
8c80: 6e 75 6d 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  num = sqlite3_co
8c90: 6c 75 6d 6e 5f 69 6e 74 28 61 53 74 6d 74 5b 30  lumn_int(aStmt[0
8ca0: 5d 2c 20 31 29 3b 0a 0a 20 20 70 2d 3e 72 63 20  ], 1);..  p->rc 
8cb0: 3d 20 70 72 65 70 61 72 65 46 72 65 65 41 6e 64  = prepareFreeAnd
8cc0: 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e  CollectError(p->
8cd0: 64 62 4d 61 69 6e 2c 20 26 61 53 74 6d 74 5b 31  dbMain, &aStmt[1
8ce0: 5d 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 20  ], &p->zErrmsg, 
8cf0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72  .    sqlite3_mpr
8d00: 69 6e 74 66 28 22 50 52 41 47 4d 41 20 69 6e 64  intf("PRAGMA ind
8d10: 65 78 5f 6c 69 73 74 3d 25 51 22 2c 7a 54 61 62  ex_list=%Q",zTab
8d20: 29 0a 20 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  ).  );.  if( p->
8d30: 72 63 20 29 20 67 6f 74 6f 20 72 62 75 54 61 62  rc ) goto rbuTab
8d40: 6c 65 54 79 70 65 5f 65 6e 64 3b 0a 20 20 77 68  leType_end;.  wh
8d50: 69 6c 65 28 20 73 71 6c 69 74 65 33 5f 73 74 65  ile( sqlite3_ste
8d60: 70 28 61 53 74 6d 74 5b 31 5d 29 3d 3d 53 51 4c  p(aStmt[1])==SQL
8d70: 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 63  ITE_ROW ){.    c
8d80: 6f 6e 73 74 20 75 38 20 2a 7a 4f 72 69 67 20 3d  onst u8 *zOrig =
8d90: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
8da0: 74 65 78 74 28 61 53 74 6d 74 5b 31 5d 2c 20 33  text(aStmt[1], 3
8db0: 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 38 20  );.    const u8 
8dc0: 2a 7a 49 64 78 20 3d 20 73 71 6c 69 74 65 33 5f  *zIdx = sqlite3_
8dd0: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 61 53 74 6d  column_text(aStm
8de0: 74 5b 31 5d 2c 20 31 29 3b 0a 20 20 20 20 69 66  t[1], 1);.    if
8df0: 28 20 7a 4f 72 69 67 20 26 26 20 7a 49 64 78 20  ( zOrig && zIdx 
8e00: 26 26 20 7a 4f 72 69 67 5b 30 5d 3d 3d 27 70 27  && zOrig[0]=='p'
8e10: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20   ){.      p->rc 
8e20: 3d 20 70 72 65 70 61 72 65 46 72 65 65 41 6e 64  = prepareFreeAnd
8e30: 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e  CollectError(p->
8e40: 64 62 4d 61 69 6e 2c 20 26 61 53 74 6d 74 5b 32  dbMain, &aStmt[2
8e50: 5d 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 20  ], &p->zErrmsg, 
8e60: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
8e70: 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20  e3_mprintf(.    
8e80: 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
8e90: 72 6f 6f 74 70 61 67 65 20 46 52 4f 4d 20 73 71  rootpage FROM sq
8ea0: 6c 69 74 65 5f 6d 61 73 74 65 72 20 57 48 45 52  lite_master WHER
8eb0: 45 20 6e 61 6d 65 20 3d 20 25 51 22 2c 20 7a 49  E name = %Q", zI
8ec0: 64 78 0a 20 20 20 20 20 20 29 29 3b 0a 20 20 20  dx.      ));.   
8ed0: 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
8ee0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
8ef0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
8f00: 74 65 70 28 61 53 74 6d 74 5b 32 5d 29 3d 3d 53  tep(aStmt[2])==S
8f10: 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20  QLITE_ROW ){.   
8f20: 20 20 20 20 20 20 20 2a 70 69 50 6b 20 3d 20 73         *piPk = s
8f30: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
8f40: 74 28 61 53 74 6d 74 5b 32 5d 2c 20 30 29 3b 0a  t(aStmt[2], 0);.
8f50: 20 20 20 20 20 20 20 20 20 20 2a 70 65 54 79 70            *peTyp
8f60: 65 20 3d 20 52 42 55 5f 50 4b 5f 45 58 54 45 52  e = RBU_PK_EXTER
8f70: 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  NAL;.        }el
8f80: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70  se{.          *p
8f90: 65 54 79 70 65 20 3d 20 52 42 55 5f 50 4b 5f 57  eType = RBU_PK_W
8fa0: 49 54 48 4f 55 54 5f 52 4f 57 49 44 3b 0a 20 20  ITHOUT_ROWID;.  
8fb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
8fc0: 20 20 20 20 20 20 67 6f 74 6f 20 72 62 75 54 61        goto rbuTa
8fd0: 62 6c 65 54 79 70 65 5f 65 6e 64 3b 0a 20 20 20  bleType_end;.   
8fe0: 20 7d 0a 20 20 7d 0a 0a 20 20 70 2d 3e 72 63 20   }.  }..  p->rc 
8ff0: 3d 20 70 72 65 70 61 72 65 46 72 65 65 41 6e 64  = prepareFreeAnd
9000: 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e  CollectError(p->
9010: 64 62 4d 61 69 6e 2c 20 26 61 53 74 6d 74 5b 33  dbMain, &aStmt[3
9020: 5d 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 20  ], &p->zErrmsg, 
9030: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72  .    sqlite3_mpr
9040: 69 6e 74 66 28 22 50 52 41 47 4d 41 20 74 61 62  intf("PRAGMA tab
9050: 6c 65 5f 69 6e 66 6f 3d 25 51 22 2c 7a 54 61 62  le_info=%Q",zTab
9060: 29 0a 20 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  ).  );.  if( p->
9070: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
9080: 0a 20 20 20 20 77 68 69 6c 65 28 20 73 71 6c 69  .    while( sqli
9090: 74 65 33 5f 73 74 65 70 28 61 53 74 6d 74 5b 33  te3_step(aStmt[3
90a0: 5d 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  ])==SQLITE_ROW )
90b0: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
90c0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 61  te3_column_int(a
90d0: 53 74 6d 74 5b 33 5d 2c 35 29 3e 30 20 29 7b 0a  Stmt[3],5)>0 ){.
90e0: 20 20 20 20 20 20 20 20 2a 70 65 54 79 70 65 20          *peType 
90f0: 3d 20 52 42 55 5f 50 4b 5f 49 50 4b 3b 20 20 20  = RBU_PK_IPK;   
9100: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9110: 65 78 70 6c 69 63 69 74 20 49 50 4b 20 63 6f 6c  explicit IPK col
9120: 75 6d 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 67  umn */.        g
9130: 6f 74 6f 20 72 62 75 54 61 62 6c 65 54 79 70 65  oto rbuTableType
9140: 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _end;.      }.  
9150: 20 20 7d 0a 20 20 20 20 2a 70 65 54 79 70 65 20    }.    *peType 
9160: 3d 20 52 42 55 5f 50 4b 5f 4e 4f 4e 45 3b 0a 20  = RBU_PK_NONE;. 
9170: 20 7d 0a 0a 72 62 75 54 61 62 6c 65 54 79 70 65   }..rbuTableType
9180: 5f 65 6e 64 3a 20 7b 0a 20 20 20 20 75 6e 73 69  _end: {.    unsi
9190: 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20 20 20  gned int i;.    
91a0: 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
91b0: 66 28 61 53 74 6d 74 29 2f 73 69 7a 65 6f 66 28  f(aStmt)/sizeof(
91c0: 61 53 74 6d 74 5b 30 5d 29 3b 20 69 2b 2b 29 7b  aStmt[0]); i++){
91d0: 0a 20 20 20 20 20 20 72 62 75 46 69 6e 61 6c 69  .      rbuFinali
91e0: 7a 65 28 70 2c 20 61 53 74 6d 74 5b 69 5d 29 3b  ze(p, aStmt[i]);
91f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
9200: 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 68 65  .** This is a he
9210: 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 20 66 6f  lper function fo
9220: 72 20 72 62 75 4f 62 6a 49 74 65 72 43 61 63 68  r rbuObjIterCach
9230: 65 54 61 62 6c 65 49 6e 66 6f 28 29 2e 20 49 74  eTableInfo(). It
9240: 20 70 6f 70 75 6c 61 74 65 73 0a 2a 2a 20 74 68   populates.** th
9250: 65 20 70 49 74 65 72 2d 3e 61 62 49 6e 64 65 78  e pIter->abIndex
9260: 65 64 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73  ed[] array..*/.s
9270: 74 61 74 69 63 20 76 6f 69 64 20 72 62 75 4f 62  tatic void rbuOb
9280: 6a 49 74 65 72 43 61 63 68 65 49 6e 64 65 78 65  jIterCacheIndexe
9290: 64 43 6f 6c 73 28 73 71 6c 69 74 65 33 72 62 75  dCols(sqlite3rbu
92a0: 20 2a 70 2c 20 52 62 75 4f 62 6a 49 74 65 72 20   *p, RbuObjIter 
92b0: 2a 70 49 74 65 72 29 7b 0a 20 20 73 71 6c 69 74  *pIter){.  sqlit
92c0: 65 33 5f 73 74 6d 74 20 2a 70 4c 69 73 74 20 3d  e3_stmt *pList =
92d0: 20 30 3b 0a 20 20 69 6e 74 20 62 49 6e 64 65 78   0;.  int bIndex
92e0: 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e   = 0;..  if( p->
92f0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
9300: 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 49 74 65  .    memcpy(pIte
9310: 72 2d 3e 61 62 49 6e 64 65 78 65 64 2c 20 70 49  r->abIndexed, pI
9320: 74 65 72 2d 3e 61 62 54 62 6c 50 6b 2c 20 73 69  ter->abTblPk, si
9330: 7a 65 6f 66 28 75 38 29 2a 70 49 74 65 72 2d 3e  zeof(u8)*pIter->
9340: 6e 54 62 6c 43 6f 6c 29 3b 0a 20 20 20 20 70 2d  nTblCol);.    p-
9350: 3e 72 63 20 3d 20 70 72 65 70 61 72 65 46 72 65  >rc = prepareFre
9360: 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72  eAndCollectError
9370: 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 70 4c 69  (p->dbMain, &pLi
9380: 73 74 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c  st, &p->zErrmsg,
9390: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
93a0: 5f 6d 70 72 69 6e 74 66 28 22 50 52 41 47 4d 41  _mprintf("PRAGMA
93b0: 20 6d 61 69 6e 2e 69 6e 64 65 78 5f 6c 69 73 74   main.index_list
93c0: 20 3d 20 25 51 22 2c 20 70 49 74 65 72 2d 3e 7a   = %Q", pIter->z
93d0: 54 62 6c 29 0a 20 20 20 20 29 3b 0a 20 20 7d 0a  Tbl).    );.  }.
93e0: 0a 20 20 70 49 74 65 72 2d 3e 6e 49 6e 64 65 78  .  pIter->nIndex
93f0: 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 70   = 0;.  while( p
9400: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
9410: 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  && SQLITE_ROW==s
9420: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 4c 69 73  qlite3_step(pLis
9430: 74 29 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  t) ){.    const 
9440: 63 68 61 72 20 2a 7a 49 64 78 20 3d 20 28 63 6f  char *zIdx = (co
9450: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
9460: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 4c  3_column_text(pL
9470: 69 73 74 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c  ist, 1);.    sql
9480: 69 74 65 33 5f 73 74 6d 74 20 2a 70 58 49 6e 66  ite3_stmt *pXInf
9490: 6f 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 7a  o = 0;.    if( z
94a0: 49 64 78 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  Idx==0 ) break;.
94b0: 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70      p->rc = prep
94c0: 61 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63  areFreeAndCollec
94d0: 74 45 72 72 6f 72 28 70 2d 3e 64 62 4d 61 69 6e  tError(p->dbMain
94e0: 2c 20 26 70 58 49 6e 66 6f 2c 20 26 70 2d 3e 7a  , &pXInfo, &p->z
94f0: 45 72 72 6d 73 67 2c 0a 20 20 20 20 20 20 20 20  Errmsg,.        
9500: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
9510: 22 50 52 41 47 4d 41 20 6d 61 69 6e 2e 69 6e 64  "PRAGMA main.ind
9520: 65 78 5f 78 69 6e 66 6f 20 3d 20 25 51 22 2c 20  ex_xinfo = %Q", 
9530: 7a 49 64 78 29 0a 20 20 20 20 29 3b 0a 20 20 20  zIdx).    );.   
9540: 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53   while( p->rc==S
9550: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49  QLITE_OK && SQLI
9560: 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
9570: 73 74 65 70 28 70 58 49 6e 66 6f 29 20 29 7b 0a  step(pXInfo) ){.
9580: 20 20 20 20 20 20 69 6e 74 20 69 43 69 64 20 3d        int iCid =
9590: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
95a0: 69 6e 74 28 70 58 49 6e 66 6f 2c 20 31 29 3b 0a  int(pXInfo, 1);.
95b0: 20 20 20 20 20 20 69 66 28 20 69 43 69 64 3e 3d        if( iCid>=
95c0: 30 20 29 20 70 49 74 65 72 2d 3e 61 62 49 6e 64  0 ) pIter->abInd
95d0: 65 78 65 64 5b 69 43 69 64 5d 20 3d 20 31 3b 0a  exed[iCid] = 1;.
95e0: 20 20 20 20 7d 0a 20 20 20 20 72 62 75 46 69 6e      }.    rbuFin
95f0: 61 6c 69 7a 65 28 70 2c 20 70 58 49 6e 66 6f 29  alize(p, pXInfo)
9600: 3b 0a 20 20 20 20 62 49 6e 64 65 78 20 3d 20 31  ;.    bIndex = 1
9610: 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 6e 49 6e  ;.    pIter->nIn
9620: 64 65 78 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 72 62  dex++;.  }..  rb
9630: 75 46 69 6e 61 6c 69 7a 65 28 70 2c 20 70 4c 69  uFinalize(p, pLi
9640: 73 74 29 3b 0a 20 20 69 66 28 20 62 49 6e 64 65  st);.  if( bInde
9650: 78 3d 3d 30 20 29 20 70 49 74 65 72 2d 3e 61 62  x==0 ) pIter->ab
9660: 49 6e 64 65 78 65 64 20 3d 20 30 3b 0a 7d 0a 0a  Indexed = 0;.}..
9670: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 79 20 61  ./*.** If they a
9680: 72 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 70  re not already p
9690: 6f 70 75 6c 61 74 65 64 2c 20 70 6f 70 75 6c 61  opulated, popula
96a0: 74 65 20 74 68 65 20 70 49 74 65 72 2d 3e 61 7a  te the pIter->az
96b0: 54 62 6c 43 6f 6c 5b 5d 2c 0a 2a 2a 20 70 49 74  TblCol[],.** pIt
96c0: 65 72 2d 3e 61 62 54 62 6c 50 6b 5b 5d 2c 20 70  er->abTblPk[], p
96d0: 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 20 61 6e  Iter->nTblCol an
96e0: 64 20 70 49 74 65 72 2d 3e 62 52 6f 77 69 64 20  d pIter->bRowid 
96f0: 76 61 72 69 61 62 6c 65 73 20 61 63 63 6f 72 64  variables accord
9700: 69 6e 67 20 74 6f 0a 2a 2a 20 74 68 65 20 74 61  ing to.** the ta
9710: 62 6c 65 20 28 6e 6f 74 20 69 6e 64 65 78 29 20  ble (not index) 
9720: 74 68 61 74 20 74 68 65 20 69 74 65 72 61 74 6f  that the iterato
9730: 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  r currently poin
9740: 74 73 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  ts to..**.** Ret
9750: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
9760: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20   successful, or 
9770: 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
9780: 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 20  code otherwise. 
9790: 49 66 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 64  If.** an error d
97a0: 6f 65 73 20 6f 63 63 75 72 2c 20 61 6e 20 65 72  oes occur, an er
97b0: 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 65 72 72  ror code and err
97c0: 6f 72 20 6d 65 73 73 61 67 65 20 61 72 65 20 61  or message are a
97d0: 6c 73 6f 20 6c 65 66 74 20 69 6e 20 0a 2a 2a 20  lso left in .** 
97e0: 74 68 65 20 52 42 55 20 68 61 6e 64 6c 65 2e 0a  the RBU handle..
97f0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62  */.static int rb
9800: 75 4f 62 6a 49 74 65 72 43 61 63 68 65 54 61 62  uObjIterCacheTab
9810: 6c 65 49 6e 66 6f 28 73 71 6c 69 74 65 33 72 62  leInfo(sqlite3rb
9820: 75 20 2a 70 2c 20 52 62 75 4f 62 6a 49 74 65 72  u *p, RbuObjIter
9830: 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20   *pIter){.  if( 
9840: 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 3d  pIter->azTblCol=
9850: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
9860: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
9870: 30 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 20  0;.    int nCol 
9880: 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 3b 20  = 0;.    int i; 
9890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
98a0: 20 20 20 20 20 20 20 2f 2a 20 66 6f 72 28 29 20         /* for() 
98b0: 6c 6f 6f 70 20 69 74 65 72 61 74 6f 72 20 76 61  loop iterator va
98c0: 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e  riable */.    in
98d0: 74 20 62 52 62 75 52 6f 77 69 64 20 3d 20 30 3b  t bRbuRowid = 0;
98e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
98f0: 66 20 69 6e 70 75 74 20 74 61 62 6c 65 20 68 61  f input table ha
9900: 73 20 63 6f 6c 75 6d 6e 20 22 72 62 75 5f 72 6f  s column "rbu_ro
9910: 77 69 64 22 20 2a 2f 0a 20 20 20 20 69 6e 74 20  wid" */.    int 
9920: 69 4f 72 64 65 72 20 3d 20 30 3b 0a 20 20 20 20  iOrder = 0;.    
9930: 69 6e 74 20 69 54 6e 75 6d 20 3d 20 30 3b 0a 0a  int iTnum = 0;..
9940: 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75      /* Figure ou
9950: 74 20 74 68 65 20 74 79 70 65 20 6f 66 20 74 61  t the type of ta
9960: 62 6c 65 20 74 68 69 73 20 73 74 65 70 20 77 69  ble this step wi
9970: 6c 6c 20 64 65 61 6c 20 77 69 74 68 2e 20 2a 2f  ll deal with. */
9980: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
9990: 65 72 2d 3e 65 54 79 70 65 3d 3d 30 20 29 3b 0a  er->eType==0 );.
99a0: 20 20 20 20 72 62 75 54 61 62 6c 65 54 79 70 65      rbuTableType
99b0: 28 70 2c 20 70 49 74 65 72 2d 3e 7a 54 62 6c 2c  (p, pIter->zTbl,
99c0: 20 26 70 49 74 65 72 2d 3e 65 54 79 70 65 2c 20   &pIter->eType, 
99d0: 26 69 54 6e 75 6d 2c 20 26 70 49 74 65 72 2d 3e  &iTnum, &pIter->
99e0: 69 50 6b 54 6e 75 6d 29 3b 0a 20 20 20 20 69 66  iPkTnum);.    if
99f0: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
9a00: 4f 4b 20 26 26 20 70 49 74 65 72 2d 3e 65 54 79  OK && pIter->eTy
9a10: 70 65 3d 3d 52 42 55 5f 50 4b 5f 4e 4f 54 41 42  pe==RBU_PK_NOTAB
9a20: 4c 45 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72  LE ){.      p->r
9a30: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
9a40: 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 45 72 72 6d  ;.      p->zErrm
9a50: 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  sg = sqlite3_mpr
9a60: 69 6e 74 66 28 22 6e 6f 20 73 75 63 68 20 74 61  intf("no such ta
9a70: 62 6c 65 3a 20 25 73 22 2c 20 70 49 74 65 72 2d  ble: %s", pIter-
9a80: 3e 7a 54 62 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  >zTbl);.    }.  
9a90: 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20 72 65    if( p->rc ) re
9aa0: 74 75 72 6e 20 70 2d 3e 72 63 3b 0a 20 20 20 20  turn p->rc;.    
9ab0: 69 66 28 20 70 49 74 65 72 2d 3e 7a 49 64 78 3d  if( pIter->zIdx=
9ac0: 3d 30 20 29 20 70 49 74 65 72 2d 3e 69 54 6e 75  =0 ) pIter->iTnu
9ad0: 6d 20 3d 20 69 54 6e 75 6d 3b 0a 0a 20 20 20 20  m = iTnum;..    
9ae0: 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 65  assert( pIter->e
9af0: 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 4e 4f 4e  Type==RBU_PK_NON
9b00: 45 20 7c 7c 20 70 49 74 65 72 2d 3e 65 54 79 70  E || pIter->eTyp
9b10: 65 3d 3d 52 42 55 5f 50 4b 5f 49 50 4b 20 0a 20  e==RBU_PK_IPK . 
9b20: 20 20 20 20 20 20 20 20 7c 7c 20 70 49 74 65 72          || pIter
9b30: 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f  ->eType==RBU_PK_
9b40: 45 58 54 45 52 4e 41 4c 20 7c 7c 20 70 49 74 65  EXTERNAL || pIte
9b50: 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b  r->eType==RBU_PK
9b60: 5f 57 49 54 48 4f 55 54 5f 52 4f 57 49 44 0a 20  _WITHOUT_ROWID. 
9b70: 20 20 20 20 20 20 20 20 7c 7c 20 70 49 74 65 72          || pIter
9b80: 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f  ->eType==RBU_PK_
9b90: 56 54 41 42 0a 20 20 20 20 29 3b 0a 0a 20 20 20  VTAB.    );..   
9ba0: 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65   /* Populate the
9bb0: 20 61 7a 54 62 6c 43 6f 6c 5b 5d 20 61 6e 64 20   azTblCol[] and 
9bc0: 6e 54 62 6c 43 6f 6c 20 76 61 72 69 61 62 6c 65  nTblCol variable
9bd0: 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63  s based on the c
9be0: 6f 6c 75 6d 6e 73 0a 20 20 20 20 2a 2a 20 6f 66  olumns.    ** of
9bf0: 20 74 68 65 20 69 6e 70 75 74 20 74 61 62 6c 65   the input table
9c00: 2e 20 49 67 6e 6f 72 65 20 61 6e 79 20 69 6e 70  . Ignore any inp
9c10: 75 74 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73  ut table columns
9c20: 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74 68   that begin with
9c30: 0a 20 20 20 20 2a 2a 20 22 72 62 75 5f 22 2e 20  .    ** "rbu_". 
9c40: 20 2a 2f 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   */.    p->rc = 
9c50: 70 72 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f  prepareFreeAndCo
9c60: 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62  llectError(p->db
9c70: 52 62 75 2c 20 26 70 53 74 6d 74 2c 20 26 70 2d  Rbu, &pStmt, &p-
9c80: 3e 7a 45 72 72 6d 73 67 2c 20 0a 20 20 20 20 20  >zErrmsg, .     
9c90: 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e     sqlite3_mprin
9ca0: 74 66 28 22 53 45 4c 45 43 54 20 2a 20 46 52 4f  tf("SELECT * FRO
9cb0: 4d 20 27 25 71 27 22 2c 20 70 49 74 65 72 2d 3e  M '%q'", pIter->
9cc0: 7a 44 61 74 61 54 62 6c 29 0a 20 20 20 20 29 3b  zDataTbl).    );
9cd0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  .    if( p->rc==
9ce0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
9cf0: 20 20 20 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65     nCol = sqlite
9d00: 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70  3_column_count(p
9d10: 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 72 62 75  Stmt);.      rbu
9d20: 41 6c 6c 6f 63 61 74 65 49 74 65 72 41 72 72 61  AllocateIterArra
9d30: 79 73 28 70 2c 20 70 49 74 65 72 2c 20 6e 43 6f  ys(p, pIter, nCo
9d40: 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  l);.    }.    fo
9d50: 72 28 69 3d 30 3b 20 70 2d 3e 72 63 3d 3d 53 51  r(i=0; p->rc==SQ
9d60: 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 6e 43 6f  LITE_OK && i<nCo
9d70: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63  l; i++){.      c
9d80: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
9d90: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
9da0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e  sqlite3_column_n
9db0: 61 6d 65 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20  ame(pStmt, i);. 
9dc0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
9dd0: 5f 73 74 72 6e 69 63 6d 70 28 22 72 62 75 5f 22  _strnicmp("rbu_"
9de0: 2c 20 7a 4e 61 6d 65 2c 20 34 29 20 29 7b 0a 20  , zName, 4) ){. 
9df0: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f         char *zCo
9e00: 70 79 20 3d 20 72 62 75 53 74 72 6e 64 75 70 28  py = rbuStrndup(
9e10: 7a 4e 61 6d 65 2c 20 26 70 2d 3e 72 63 29 3b 0a  zName, &p->rc);.
9e20: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 61          pIter->a
9e30: 69 53 72 63 4f 72 64 65 72 5b 70 49 74 65 72 2d  iSrcOrder[pIter-
9e40: 3e 6e 54 62 6c 43 6f 6c 5d 20 3d 20 70 49 74 65  >nTblCol] = pIte
9e50: 72 2d 3e 6e 54 62 6c 43 6f 6c 3b 0a 20 20 20 20  r->nTblCol;.    
9e60: 20 20 20 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c      pIter->azTbl
9e70: 43 6f 6c 5b 70 49 74 65 72 2d 3e 6e 54 62 6c 43  Col[pIter->nTblC
9e80: 6f 6c 2b 2b 5d 20 3d 20 7a 43 6f 70 79 3b 0a 20  ol++] = zCopy;. 
9e90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65 6c 73       }.      els
9ea0: 65 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33  e if( 0==sqlite3
9eb0: 5f 73 74 72 69 63 6d 70 28 22 72 62 75 5f 72 6f  _stricmp("rbu_ro
9ec0: 77 69 64 22 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a  wid", zName) ){.
9ed0: 20 20 20 20 20 20 20 20 62 52 62 75 52 6f 77 69          bRbuRowi
9ee0: 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  d = 1;.      }. 
9ef0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
9f00: 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
9f10: 3b 0a 20 20 20 20 70 53 74 6d 74 20 3d 20 30 3b  ;.    pStmt = 0;
9f20: 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d  ..    if( p->rc=
9f30: 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20  =SQLITE_OK.     
9f40: 26 26 20 62 52 62 75 52 6f 77 69 64 21 3d 28 70  && bRbuRowid!=(p
9f50: 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55  Iter->eType==RBU
9f60: 5f 50 4b 5f 56 54 41 42 20 7c 7c 20 70 49 74 65  _PK_VTAB || pIte
9f70: 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b  r->eType==RBU_PK
9f80: 5f 4e 4f 4e 45 29 0a 20 20 20 20 29 7b 0a 20 20  _NONE).    ){.  
9f90: 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
9fa0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
9fb0: 70 2d 3e 7a 45 72 72 6d 73 67 20 3d 20 73 71 6c  p->zErrmsg = sql
9fc0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20  ite3_mprintf(.  
9fd0: 20 20 20 20 20 20 20 20 22 74 61 62 6c 65 20 25          "table %
9fe0: 71 20 25 73 20 72 62 75 5f 72 6f 77 69 64 20 63  q %s rbu_rowid c
9ff0: 6f 6c 75 6d 6e 22 2c 20 70 49 74 65 72 2d 3e 7a  olumn", pIter->z
a000: 44 61 74 61 54 62 6c 2c 0a 20 20 20 20 20 20 20  DataTbl,.       
a010: 20 20 20 28 62 52 62 75 52 6f 77 69 64 20 3f 20     (bRbuRowid ? 
a020: 22 6d 61 79 20 6e 6f 74 20 68 61 76 65 22 20 3a  "may not have" :
a030: 20 22 72 65 71 75 69 72 65 73 22 29 0a 20 20 20   "requires").   
a040: 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20     );.    }..   
a050: 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 61   /* Check that a
a060: 6c 6c 20 6e 6f 6e 2d 48 49 44 44 45 4e 20 63 6f  ll non-HIDDEN co
a070: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 64 65 73  lumns in the des
a080: 74 69 6e 61 74 69 6f 6e 20 74 61 62 6c 65 20 61  tination table a
a090: 72 65 20 61 6c 73 6f 0a 20 20 20 20 2a 2a 20 70  re also.    ** p
a0a0: 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 69 6e  resent in the in
a0b0: 70 75 74 20 74 61 62 6c 65 2e 20 50 6f 70 75 6c  put table. Popul
a0c0: 61 74 65 20 74 68 65 20 61 62 54 62 6c 50 6b 5b  ate the abTblPk[
a0d0: 5d 2c 20 61 7a 54 62 6c 54 79 70 65 5b 5d 20 61  ], azTblType[] a
a0e0: 6e 64 0a 20 20 20 20 2a 2a 20 61 69 54 62 6c 4f  nd.    ** aiTblO
a0f0: 72 64 65 72 5b 5d 20 61 72 72 61 79 73 20 61 74  rder[] arrays at
a100: 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 20   the same time. 
a110: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 72   */.    if( p->r
a120: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
a130: 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 72        p->rc = pr
a140: 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c  epareFreeAndColl
a150: 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 4d 61  ectError(p->dbMa
a160: 69 6e 2c 20 26 70 53 74 6d 74 2c 20 26 70 2d 3e  in, &pStmt, &p->
a170: 7a 45 72 72 6d 73 67 2c 20 0a 20 20 20 20 20 20  zErrmsg, .      
a180: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69      sqlite3_mpri
a190: 6e 74 66 28 22 50 52 41 47 4d 41 20 74 61 62 6c  ntf("PRAGMA tabl
a1a0: 65 5f 69 6e 66 6f 28 25 51 29 22 2c 20 70 49 74  e_info(%Q)", pIt
a1b0: 65 72 2d 3e 7a 54 62 6c 29 0a 20 20 20 20 20 20  er->zTbl).      
a1c0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69  );.    }.    whi
a1d0: 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  le( p->rc==SQLIT
a1e0: 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52  E_OK && SQLITE_R
a1f0: 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
a200: 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20  (pStmt) ){.     
a210: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
a220: 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  me = (const char
a230: 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
a240: 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31 29 3b  _text(pStmt, 1);
a250: 0a 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65  .      if( zName
a260: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 20 20 2f 2a  ==0 ) break;  /*
a270: 20 41 6e 20 4f 4f 4d 20 2d 20 66 69 6e 61 6c 69   An OOM - finali
a280: 7a 65 28 29 20 62 65 6c 6f 77 20 72 65 74 75 72  ze() below retur
a290: 6e 73 20 53 5f 4e 4f 4d 45 4d 20 2a 2f 0a 20 20  ns S_NOMEM */.  
a2a0: 20 20 20 20 66 6f 72 28 69 3d 69 4f 72 64 65 72      for(i=iOrder
a2b0: 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 54 62 6c 43  ; i<pIter->nTblC
a2c0: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
a2d0: 20 20 69 66 28 20 30 3d 3d 73 74 72 63 6d 70 28    if( 0==strcmp(
a2e0: 7a 4e 61 6d 65 2c 20 70 49 74 65 72 2d 3e 61 7a  zName, pIter->az
a2f0: 54 62 6c 43 6f 6c 5b 69 5d 29 20 29 20 62 72 65  TblCol[i]) ) bre
a300: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
a310: 20 20 69 66 28 20 69 3d 3d 70 49 74 65 72 2d 3e    if( i==pIter->
a320: 6e 54 62 6c 43 6f 6c 20 29 7b 0a 20 20 20 20 20  nTblCol ){.     
a330: 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
a340: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  E_ERROR;.       
a350: 20 70 2d 3e 7a 45 72 72 6d 73 67 20 3d 20 73 71   p->zErrmsg = sq
a360: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 63  lite3_mprintf("c
a370: 6f 6c 75 6d 6e 20 6d 69 73 73 69 6e 67 20 66 72  olumn missing fr
a380: 6f 6d 20 25 71 3a 20 25 73 22 2c 0a 20 20 20 20  om %q: %s",.    
a390: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 7a          pIter->z
a3a0: 44 61 74 61 54 62 6c 2c 20 7a 4e 61 6d 65 0a 20  DataTbl, zName. 
a3b0: 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
a3c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
a3d0: 6e 74 20 69 50 6b 20 3d 20 73 71 6c 69 74 65 33  nt iPk = sqlite3
a3e0: 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d  _column_int(pStm
a3f0: 74 2c 20 35 29 3b 0a 20 20 20 20 20 20 20 20 69  t, 5);.        i
a400: 6e 74 20 62 4e 6f 74 4e 75 6c 6c 20 3d 20 73 71  nt bNotNull = sq
a410: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
a420: 28 70 53 74 6d 74 2c 20 33 29 3b 0a 20 20 20 20  (pStmt, 3);.    
a430: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
a440: 7a 54 79 70 65 20 3d 20 28 63 6f 6e 73 74 20 63  zType = (const c
a450: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
a460: 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  umn_text(pStmt, 
a470: 32 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28  2);..        if(
a480: 20 69 21 3d 69 4f 72 64 65 72 20 29 7b 0a 20 20   i!=iOrder ){.  
a490: 20 20 20 20 20 20 20 20 53 57 41 50 28 69 6e 74          SWAP(int
a4a0: 2c 20 70 49 74 65 72 2d 3e 61 69 53 72 63 4f 72  , pIter->aiSrcOr
a4b0: 64 65 72 5b 69 5d 2c 20 70 49 74 65 72 2d 3e 61  der[i], pIter->a
a4c0: 69 53 72 63 4f 72 64 65 72 5b 69 4f 72 64 65 72  iSrcOrder[iOrder
a4d0: 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 53 57  ]);.          SW
a4e0: 41 50 28 63 68 61 72 2a 2c 20 70 49 74 65 72 2d  AP(char*, pIter-
a4f0: 3e 61 7a 54 62 6c 43 6f 6c 5b 69 5d 2c 20 70 49  >azTblCol[i], pI
a500: 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69 4f  ter->azTblCol[iO
a510: 72 64 65 72 5d 29 3b 0a 20 20 20 20 20 20 20 20  rder]);.        
a520: 7d 0a 0a 20 20 20 20 20 20 20 20 70 49 74 65 72  }..        pIter
a530: 2d 3e 61 7a 54 62 6c 54 79 70 65 5b 69 4f 72 64  ->azTblType[iOrd
a540: 65 72 5d 20 3d 20 72 62 75 53 74 72 6e 64 75 70  er] = rbuStrndup
a550: 28 7a 54 79 70 65 2c 20 26 70 2d 3e 72 63 29 3b  (zType, &p->rc);
a560: 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e  .        pIter->
a570: 61 62 54 62 6c 50 6b 5b 69 4f 72 64 65 72 5d 20  abTblPk[iOrder] 
a580: 3d 20 28 69 50 6b 21 3d 30 29 3b 0a 20 20 20 20  = (iPk!=0);.    
a590: 20 20 20 20 70 49 74 65 72 2d 3e 61 62 4e 6f 74      pIter->abNot
a5a0: 4e 75 6c 6c 5b 69 4f 72 64 65 72 5d 20 3d 20 28  Null[iOrder] = (
a5b0: 75 38 29 62 4e 6f 74 4e 75 6c 6c 20 7c 7c 20 28  u8)bNotNull || (
a5c0: 69 50 6b 21 3d 30 29 3b 0a 20 20 20 20 20 20 20  iPk!=0);.       
a5d0: 20 69 4f 72 64 65 72 2b 2b 3b 0a 20 20 20 20 20   iOrder++;.     
a5e0: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 62   }.    }..    rb
a5f0: 75 46 69 6e 61 6c 69 7a 65 28 70 2c 20 70 53 74  uFinalize(p, pSt
a600: 6d 74 29 3b 0a 20 20 20 20 72 62 75 4f 62 6a 49  mt);.    rbuObjI
a610: 74 65 72 43 61 63 68 65 49 6e 64 65 78 65 64 43  terCacheIndexedC
a620: 6f 6c 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  ols(p, pIter);. 
a630: 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72     assert( pIter
a640: 2d 3e 65 54 79 70 65 21 3d 52 42 55 5f 50 4b 5f  ->eType!=RBU_PK_
a650: 56 54 41 42 20 7c 7c 20 70 49 74 65 72 2d 3e 61  VTAB || pIter->a
a660: 62 49 6e 64 65 78 65 64 3d 3d 30 20 29 3b 0a 20  bIndexed==0 );. 
a670: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e   }..  return p->
a680: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
a690: 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 73 74  s function const
a6a0: 72 75 63 74 73 20 61 6e 64 20 72 65 74 75 72 6e  ructs and return
a6b0: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
a6c0: 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20   nul-terminated 
a6d0: 0a 2a 2a 20 73 74 72 69 6e 67 20 63 6f 6e 74 61  .** string conta
a6e0: 69 6e 69 6e 67 20 73 6f 6d 65 20 53 51 4c 20 63  ining some SQL c
a6f0: 6c 61 75 73 65 20 6f 72 20 6c 69 73 74 20 62 61  lause or list ba
a700: 73 65 64 20 6f 6e 20 6f 6e 65 20 6f 72 20 6d 6f  sed on one or mo
a710: 72 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 63 6f  re of the .** co
a720: 6c 75 6d 6e 20 6e 61 6d 65 73 20 63 75 72 72 65  lumn names curre
a730: 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 74  ntly stored in t
a740: 68 65 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43  he pIter->azTblC
a750: 6f 6c 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73  ol[] array..*/.s
a760: 74 61 74 69 63 20 63 68 61 72 20 2a 72 62 75 4f  tatic char *rbuO
a770: 62 6a 49 74 65 72 47 65 74 43 6f 6c 6c 69 73 74  bjIterGetCollist
a780: 28 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20 2a  (.  sqlite3rbu *
a790: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
a7a0: 20 20 20 20 2f 2a 20 52 42 55 20 6f 62 6a 65 63      /* RBU objec
a7b0: 74 20 2a 2f 0a 20 20 52 62 75 4f 62 6a 49 74 65  t */.  RbuObjIte
a7c0: 72 20 2a 70 49 74 65 72 20 20 20 20 20 20 20 20  r *pIter        
a7d0: 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74         /* Object
a7e0: 20 69 74 65 72 61 74 6f 72 20 66 6f 72 20 63 6f   iterator for co
a7f0: 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 29 7b  lumn names */.){
a800: 0a 20 20 63 68 61 72 20 2a 7a 4c 69 73 74 20 3d  .  char *zList =
a810: 20 30 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   0;.  const char
a820: 20 2a 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20 69   *zSep = "";.  i
a830: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
a840: 20 69 3c 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f   i<pIter->nTblCo
a850: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e  l; i++){.    con
a860: 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 49 74  st char *z = pIt
a870: 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69 5d 3b  er->azTblCol[i];
a880: 0a 20 20 20 20 7a 4c 69 73 74 20 3d 20 72 62 75  .    zList = rbu
a890: 4d 50 72 69 6e 74 66 28 70 2c 20 22 25 7a 25 73  MPrintf(p, "%z%s
a8a0: 5c 22 25 77 5c 22 22 2c 20 7a 4c 69 73 74 2c 20  \"%w\"", zList, 
a8b0: 7a 53 65 70 2c 20 7a 29 3b 0a 20 20 20 20 7a 53  zSep, z);.    zS
a8c0: 65 70 20 3d 20 22 2c 20 22 3b 0a 20 20 7d 0a 20  ep = ", ";.  }. 
a8d0: 20 72 65 74 75 72 6e 20 7a 4c 69 73 74 3b 0a 7d   return zList;.}
a8e0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
a8f0: 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
a900: 20 63 72 65 61 74 65 20 61 20 53 45 4c 45 43 54   create a SELECT
a910: 20 6c 69 73 74 20 28 74 68 65 20 6c 69 73 74 20   list (the list 
a920: 6f 66 20 53 51 4c 20 0a 2a 2a 20 65 78 70 72 65  of SQL .** expre
a930: 73 73 69 6f 6e 73 20 74 68 61 74 20 66 6f 6c 6c  ssions that foll
a940: 6f 77 73 20 61 20 53 45 4c 45 43 54 20 6b 65 79  ows a SELECT key
a950: 77 6f 72 64 29 20 66 6f 72 20 61 20 53 45 4c 45  word) for a SELE
a960: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 0a 2a 2a  CT statement .**
a970: 20 75 73 65 64 20 74 6f 20 72 65 61 64 20 66 72   used to read fr
a980: 6f 6d 20 61 6e 20 64 61 74 61 5f 78 78 78 20 6f  om an data_xxx o
a990: 72 20 72 62 75 5f 74 6d 70 5f 78 78 78 20 74 61  r rbu_tmp_xxx ta
a9a0: 62 6c 65 20 77 68 69 6c 65 20 75 70 64 61 74 69  ble while updati
a9b0: 6e 67 20 74 68 65 20 0a 2a 2a 20 69 6e 64 65 78  ng the .** index
a9c0: 20 6f 62 6a 65 63 74 20 63 75 72 72 65 6e 74 6c   object currentl
a9d0: 79 20 69 6e 64 69 63 61 74 65 64 20 62 79 20 74  y indicated by t
a9e0: 68 65 20 69 74 65 72 61 74 6f 72 20 6f 62 6a 65  he iterator obje
a9f0: 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ct passed as the
aa00: 20 0a 2a 2a 20 73 65 63 6f 6e 64 20 61 72 67 75   .** second argu
aa10: 6d 65 6e 74 2e 20 41 20 22 50 52 41 47 4d 41 20  ment. A "PRAGMA 
aa20: 69 6e 64 65 78 5f 78 69 6e 66 6f 20 3d 20 3c 69  index_xinfo = <i
aa30: 64 78 6e 61 6d 65 3e 22 20 73 74 61 74 65 6d 65  dxname>" stateme
aa40: 6e 74 20 69 73 20 75 73 65 64 20 0a 2a 2a 20 74  nt is used .** t
aa50: 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 72 65 71  o obtain the req
aa60: 75 69 72 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f  uired informatio
aa70: 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  n..**.** If the 
aa80: 69 6e 64 65 78 20 69 73 20 6f 66 20 74 68 65 20  index is of the 
aa90: 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 3a 0a  following form:.
aaa0: 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 49  **.**   CREATE I
aab0: 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28 63 2c  NDEX i1 ON t1(c,
aac0: 20 62 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73   b COLLATE nocas
aad0: 65 29 3b 0a 2a 2a 0a 2a 2a 20 61 6e 64 20 22 74  e);.**.** and "t
aae0: 31 22 20 69 73 20 61 20 74 61 62 6c 65 20 77 69  1" is a table wi
aaf0: 74 68 20 61 6e 20 65 78 70 6c 69 63 69 74 20 49  th an explicit I
ab00: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
ab10: 45 59 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 22 69  EY column .** "i
ab20: 70 6b 22 2c 20 74 68 65 20 72 65 74 75 72 6e 65  pk", the returne
ab30: 64 20 73 74 72 69 6e 67 20 69 73 3a 0a 2a 2a 0a  d string is:.**.
ab40: 2a 2a 20 20 20 22 60 63 60 20 43 4f 4c 4c 41 54  **   "`c` COLLAT
ab50: 45 20 27 42 49 4e 41 52 59 27 2c 20 60 62 60 20  E 'BINARY', `b` 
ab60: 43 4f 4c 4c 41 54 45 20 27 4e 4f 43 41 53 45 27  COLLATE 'NOCASE'
ab70: 2c 20 60 69 70 6b 60 20 43 4f 4c 4c 41 54 45 20  , `ipk` COLLATE 
ab80: 27 42 49 4e 41 52 59 27 22 0a 2a 2a 0a 2a 2a 20  'BINARY'".**.** 
ab90: 41 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20 72  As well as the r
aba0: 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 2c 20  eturned string, 
abb0: 74 68 72 65 65 20 6f 74 68 65 72 20 6d 61 6c 6c  three other mall
abc0: 6f 63 27 64 20 73 74 72 69 6e 67 73 20 61 72 65  oc'd strings are
abd0: 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 76 69   .** returned vi
abe0: 61 20 6f 75 74 70 75 74 20 70 61 72 61 6d 65 74  a output paramet
abf0: 65 72 73 2e 20 41 73 20 66 6f 6c 6c 6f 77 73 3a  ers. As follows:
ac00: 0a 2a 2a 0a 2a 2a 20 20 20 70 7a 49 6d 70 6f 73  .**.**   pzImpos
ac10: 74 65 72 43 6f 6c 73 3a 20 2e 2e 2e 0a 2a 2a 20  terCols: ....** 
ac20: 20 20 70 7a 49 6d 70 6f 73 74 65 72 50 6b 3a 20    pzImposterPk: 
ac30: 2e 2e 2e 0a 2a 2a 20 20 20 70 7a 57 68 65 72 65  ....**   pzWhere
ac40: 3a 20 2e 2e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  : ....*/.static 
ac50: 63 68 61 72 20 2a 72 62 75 4f 62 6a 49 74 65 72  char *rbuObjIter
ac60: 47 65 74 49 6e 64 65 78 43 6f 6c 73 28 0a 20 20  GetIndexCols(.  
ac70: 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 20  sqlite3rbu *p,  
ac80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac90: 2f 2a 20 52 42 55 20 6f 62 6a 65 63 74 20 2a 2f  /* RBU object */
aca0: 0a 20 20 52 62 75 4f 62 6a 49 74 65 72 20 2a 70  .  RbuObjIter *p
acb0: 49 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  Iter,           
acc0: 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 69 74 65     /* Object ite
acd0: 72 61 74 6f 72 20 66 6f 72 20 63 6f 6c 75 6d 6e  rator for column
ace0: 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 63 68 61 72   names */.  char
acf0: 20 2a 2a 70 7a 49 6d 70 6f 73 74 65 72 43 6f 6c   **pzImposterCol
ad00: 73 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  s,          /* O
ad10: 55 54 3a 20 43 6f 6c 75 6d 6e 73 20 66 6f 72 20  UT: Columns for 
ad20: 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 20 2a  imposter table *
ad30: 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 49 6d 70  /.  char **pzImp
ad40: 6f 73 74 65 72 50 6b 2c 20 20 20 20 20 20 20 20  osterPk,        
ad50: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 49 6d 70 6f      /* OUT: Impo
ad60: 73 74 65 72 20 50 4b 20 63 6c 61 75 73 65 20 2a  ster PK clause *
ad70: 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 57 68 65  /.  char **pzWhe
ad80: 72 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  re,             
ad90: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 57 48 45 52      /* OUT: WHER
ada0: 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  E clause */.  in
adb0: 74 20 2a 70 6e 42 69 6e 64 20 20 20 20 20 20 20  t *pnBind       
adc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
add0: 20 4f 55 54 3a 20 54 72 62 75 6c 20 6e 75 6d 62   OUT: Trbul numb
ade0: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 2a 2f  er of columns */
adf0: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70  .){.  int rc = p
ae00: 2d 3e 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  ->rc;           
ae10: 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63        /* Error c
ae20: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 32  ode */.  int rc2
ae30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ae40: 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69           /* sqli
ae50: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 29 20 72  te3_finalize() r
ae60: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
ae70: 63 68 61 72 20 2a 7a 52 65 74 20 3d 20 30 3b 20  char *zRet = 0; 
ae80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae90: 2f 2a 20 53 74 72 69 6e 67 20 74 6f 20 72 65 74  /* String to ret
aea0: 75 72 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  urn */.  char *z
aeb0: 49 6d 70 43 6f 6c 73 20 3d 20 30 3b 20 20 20 20  ImpCols = 0;    
aec0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 72 69           /* Stri
aed0: 6e 67 20 74 6f 20 72 65 74 75 72 6e 20 76 69 61  ng to return via
aee0: 20 2a 70 7a 49 6d 70 6f 73 74 65 72 43 6f 6c 73   *pzImposterCols
aef0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 49 6d 70   */.  char *zImp
af00: 50 4b 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  PK = 0;         
af10: 20 20 20 20 20 20 2f 2a 20 53 74 72 69 6e 67 20        /* String 
af20: 74 6f 20 72 65 74 75 72 6e 20 76 69 61 20 2a 70  to return via *p
af30: 7a 49 6d 70 6f 73 74 65 72 50 4b 20 2a 2f 0a 20  zImposterPK */. 
af40: 20 63 68 61 72 20 2a 7a 57 68 65 72 65 20 3d 20   char *zWhere = 
af50: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
af60: 20 2f 2a 20 53 74 72 69 6e 67 20 74 6f 20 72 65   /* String to re
af70: 74 75 72 6e 20 76 69 61 20 2a 70 7a 57 68 65 72  turn via *pzWher
af80: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 69 6e 64  e */.  int nBind
af90: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
afa0: 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
afb0: 74 6f 20 72 65 74 75 72 6e 20 76 69 61 20 2a 70  to return via *p
afc0: 6e 42 69 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  nBind */.  const
afd0: 20 63 68 61 72 20 2a 7a 43 6f 6d 20 3d 20 22 22   char *zCom = ""
afe0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65  ;          /* Se
aff0: 74 20 74 6f 20 22 2c 20 22 20 6c 61 74 65 72 20  t to ", " later 
b000: 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  on */.  const ch
b010: 61 72 20 2a 7a 41 6e 64 20 3d 20 22 22 3b 20 20  ar *zAnd = "";  
b020: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74          /* Set t
b030: 6f 20 22 20 41 4e 44 20 22 20 6c 61 74 65 72 20  o " AND " later 
b040: 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  on */.  sqlite3_
b050: 73 74 6d 74 20 2a 70 58 49 6e 66 6f 20 3d 20 30  stmt *pXInfo = 0
b060: 3b 20 20 20 20 20 20 20 2f 2a 20 50 52 41 47 4d  ;       /* PRAGM
b070: 41 20 69 6e 64 65 78 5f 78 69 6e 66 6f 20 3d 20  A index_xinfo = 
b080: 3f 20 2a 2f 0a 0a 20 20 69 66 28 20 72 63 3d 3d  ? */..  if( rc==
b090: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
b0a0: 20 61 73 73 65 72 74 28 20 70 2d 3e 7a 45 72 72   assert( p->zErr
b0b0: 6d 73 67 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63  msg==0 );.    rc
b0c0: 20 3d 20 70 72 65 70 61 72 65 46 72 65 65 41 6e   = prepareFreeAn
b0d0: 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d  dCollectError(p-
b0e0: 3e 64 62 4d 61 69 6e 2c 20 26 70 58 49 6e 66 6f  >dbMain, &pXInfo
b0f0: 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 0a 20  , &p->zErrmsg,. 
b100: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d         sqlite3_m
b110: 70 72 69 6e 74 66 28 22 50 52 41 47 4d 41 20 6d  printf("PRAGMA m
b120: 61 69 6e 2e 69 6e 64 65 78 5f 78 69 6e 66 6f 20  ain.index_xinfo 
b130: 3d 20 25 51 22 2c 20 70 49 74 65 72 2d 3e 7a 49  = %Q", pIter->zI
b140: 64 78 29 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a  dx).    );.  }..
b150: 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
b160: 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45  ITE_OK && SQLITE
b170: 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74  _ROW==sqlite3_st
b180: 65 70 28 70 58 49 6e 66 6f 29 20 29 7b 0a 20 20  ep(pXInfo) ){.  
b190: 20 20 69 6e 74 20 69 43 69 64 20 3d 20 73 71 6c    int iCid = sql
b1a0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
b1b0: 70 58 49 6e 66 6f 2c 20 31 29 3b 0a 20 20 20 20  pXInfo, 1);.    
b1c0: 69 6e 74 20 62 44 65 73 63 20 3d 20 73 71 6c 69  int bDesc = sqli
b1d0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
b1e0: 58 49 6e 66 6f 2c 20 33 29 3b 0a 20 20 20 20 63  XInfo, 3);.    c
b1f0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  onst char *zColl
b200: 61 74 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ate = (const cha
b210: 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
b220: 6e 5f 74 65 78 74 28 70 58 49 6e 66 6f 2c 20 34  n_text(pXInfo, 4
b230: 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  );.    const cha
b240: 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 63 6f 6e  r *zCol;.    con
b250: 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a  st char *zType;.
b260: 0a 20 20 20 20 69 66 28 20 69 43 69 64 3c 30 20  .    if( iCid<0 
b270: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 69  ){.      /* An i
b280: 6e 74 65 67 65 72 20 70 72 69 6d 61 72 79 20 6b  nteger primary k
b290: 65 79 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65  ey. If the table
b2a0: 20 68 61 73 20 61 6e 20 65 78 70 6c 69 63 69 74   has an explicit
b2b0: 20 49 50 4b 2c 20 75 73 65 0a 20 20 20 20 20 20   IPK, use.      
b2c0: 2a 2a 20 69 74 73 20 6e 61 6d 65 2e 20 4f 74 68  ** its name. Oth
b2d0: 65 72 77 69 73 65 2c 20 75 73 65 20 22 72 62 75  erwise, use "rbu
b2e0: 5f 72 6f 77 69 64 22 2e 20 20 2a 2f 0a 20 20 20  _rowid".  */.   
b2f0: 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 65 54     if( pIter->eT
b300: 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 49 50 4b 20  ype==RBU_PK_IPK 
b310: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
b320: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
b330: 30 3b 20 70 49 74 65 72 2d 3e 61 62 54 62 6c 50  0; pIter->abTblP
b340: 6b 5b 69 5d 3d 3d 30 3b 20 69 2b 2b 29 3b 0a 20  k[i]==0; i++);. 
b350: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
b360: 3c 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 20  <pIter->nTblCol 
b370: 29 3b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20  );.        zCol 
b380: 3d 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f  = pIter->azTblCo
b390: 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73  l[i];.      }els
b3a0: 65 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20  e{.        zCol 
b3b0: 3d 20 22 72 62 75 5f 72 6f 77 69 64 22 3b 0a 20  = "rbu_rowid";. 
b3c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 54 79       }.      zTy
b3d0: 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a  pe = "INTEGER";.
b3e0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
b3f0: 20 7a 43 6f 6c 20 3d 20 70 49 74 65 72 2d 3e 61   zCol = pIter->a
b400: 7a 54 62 6c 43 6f 6c 5b 69 43 69 64 5d 3b 0a 20  zTblCol[iCid];. 
b410: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 70 49 74       zType = pIt
b420: 65 72 2d 3e 61 7a 54 62 6c 54 79 70 65 5b 69 43  er->azTblType[iC
b430: 69 64 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  id];.    }..    
b440: 7a 52 65 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zRet = sqlite3_m
b450: 70 72 69 6e 74 66 28 22 25 7a 25 73 5c 22 25 77  printf("%z%s\"%w
b460: 5c 22 20 43 4f 4c 4c 41 54 45 20 25 51 22 2c 20  \" COLLATE %Q", 
b470: 7a 52 65 74 2c 20 7a 43 6f 6d 2c 20 7a 43 6f 6c  zRet, zCom, zCol
b480: 2c 20 7a 43 6f 6c 6c 61 74 65 29 3b 0a 20 20 20  , zCollate);.   
b490: 20 69 66 28 20 70 49 74 65 72 2d 3e 62 55 6e 69   if( pIter->bUni
b4a0: 71 75 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  que==0 || sqlite
b4b0: 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 58 49  3_column_int(pXI
b4c0: 6e 66 6f 2c 20 35 29 20 29 7b 0a 20 20 20 20 20  nfo, 5) ){.     
b4d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72   const char *zOr
b4e0: 64 65 72 20 3d 20 28 62 44 65 73 63 20 3f 20 22  der = (bDesc ? "
b4f0: 20 44 45 53 43 22 20 3a 20 22 22 29 3b 0a 20 20   DESC" : "");.  
b500: 20 20 20 20 7a 49 6d 70 50 4b 20 3d 20 73 71 6c      zImpPK = sql
b510: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a  ite3_mprintf("%z
b520: 25 73 5c 22 72 62 75 5f 69 6d 70 5f 25 64 25 77  %s\"rbu_imp_%d%w
b530: 5c 22 25 73 22 2c 20 0a 20 20 20 20 20 20 20 20  \"%s", .        
b540: 20 20 7a 49 6d 70 50 4b 2c 20 7a 43 6f 6d 2c 20    zImpPK, zCom, 
b550: 6e 42 69 6e 64 2c 20 7a 43 6f 6c 2c 20 7a 4f 72  nBind, zCol, zOr
b560: 64 65 72 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  der.      );.   
b570: 20 7d 0a 20 20 20 20 7a 49 6d 70 43 6f 6c 73 20   }.    zImpCols 
b580: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
b590: 66 28 22 25 7a 25 73 5c 22 72 62 75 5f 69 6d 70  f("%z%s\"rbu_imp
b5a0: 5f 25 64 25 77 5c 22 20 25 73 20 43 4f 4c 4c 41  _%d%w\" %s COLLA
b5b0: 54 45 20 25 51 22 2c 20 0a 20 20 20 20 20 20 20  TE %Q", .       
b5c0: 20 7a 49 6d 70 43 6f 6c 73 2c 20 7a 43 6f 6d 2c   zImpCols, zCom,
b5d0: 20 6e 42 69 6e 64 2c 20 7a 43 6f 6c 2c 20 7a 54   nBind, zCol, zT
b5e0: 79 70 65 2c 20 7a 43 6f 6c 6c 61 74 65 0a 20 20  ype, zCollate.  
b5f0: 20 20 29 3b 0a 20 20 20 20 7a 57 68 65 72 65 20    );.    zWhere 
b600: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
b610: 66 28 0a 20 20 20 20 20 20 20 20 22 25 7a 25 73  f(.        "%z%s
b620: 5c 22 72 62 75 5f 69 6d 70 5f 25 64 25 77 5c 22  \"rbu_imp_%d%w\"
b630: 20 49 53 20 3f 22 2c 20 7a 57 68 65 72 65 2c 20   IS ?", zWhere, 
b640: 7a 41 6e 64 2c 20 6e 42 69 6e 64 2c 20 7a 43 6f  zAnd, nBind, zCo
b650: 6c 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  l.    );.    if(
b660: 20 7a 52 65 74 3d 3d 30 20 7c 7c 20 7a 49 6d 70   zRet==0 || zImp
b670: 50 4b 3d 3d 30 20 7c 7c 20 7a 49 6d 70 43 6f 6c  PK==0 || zImpCol
b680: 73 3d 3d 30 20 7c 7c 20 7a 57 68 65 72 65 3d 3d  s==0 || zWhere==
b690: 30 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  0 ) rc = SQLITE_
b6a0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7a 43 6f 6d 20  NOMEM;.    zCom 
b6b0: 3d 20 22 2c 20 22 3b 0a 20 20 20 20 7a 41 6e 64  = ", ";.    zAnd
b6c0: 20 3d 20 22 20 41 4e 44 20 22 3b 0a 20 20 20 20   = " AND ";.    
b6d0: 6e 42 69 6e 64 2b 2b 3b 0a 20 20 7d 0a 0a 20 20  nBind++;.  }..  
b6e0: 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 66 69  rc2 = sqlite3_fi
b6f0: 6e 61 6c 69 7a 65 28 70 58 49 6e 66 6f 29 3b 0a  nalize(pXInfo);.
b700: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
b710: 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63 32 3b 0a  _OK ) rc = rc2;.
b720: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
b730: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
b740: 74 65 33 5f 66 72 65 65 28 7a 52 65 74 29 3b 0a  te3_free(zRet);.
b750: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
b760: 28 7a 49 6d 70 43 6f 6c 73 29 3b 0a 20 20 20 20  (zImpCols);.    
b770: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 49 6d  sqlite3_free(zIm
b780: 70 50 4b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pPK);.    sqlite
b790: 33 5f 66 72 65 65 28 7a 57 68 65 72 65 29 3b 0a  3_free(zWhere);.
b7a0: 20 20 20 20 7a 52 65 74 20 3d 20 30 3b 0a 20 20      zRet = 0;.  
b7b0: 20 20 7a 49 6d 70 43 6f 6c 73 20 3d 20 30 3b 0a    zImpCols = 0;.
b7c0: 20 20 20 20 7a 49 6d 70 50 4b 20 3d 20 30 3b 0a      zImpPK = 0;.
b7d0: 20 20 20 20 7a 57 68 65 72 65 20 3d 20 30 3b 0a      zWhere = 0;.
b7e0: 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a      p->rc = rc;.
b7f0: 20 20 7d 0a 0a 20 20 2a 70 7a 49 6d 70 6f 73 74    }..  *pzImpost
b800: 65 72 43 6f 6c 73 20 3d 20 7a 49 6d 70 43 6f 6c  erCols = zImpCol
b810: 73 3b 0a 20 20 2a 70 7a 49 6d 70 6f 73 74 65 72  s;.  *pzImposter
b820: 50 6b 20 3d 20 7a 49 6d 70 50 4b 3b 0a 20 20 2a  Pk = zImpPK;.  *
b830: 70 7a 57 68 65 72 65 20 3d 20 7a 57 68 65 72 65  pzWhere = zWhere
b840: 3b 0a 20 20 2a 70 6e 42 69 6e 64 20 3d 20 6e 42  ;.  *pnBind = nB
b850: 69 6e 64 3b 0a 20 20 72 65 74 75 72 6e 20 7a 52  ind;.  return zR
b860: 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73  et;.}../*.** Ass
b870: 75 6d 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e  uming the curren
b880: 74 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20  t table columns 
b890: 61 72 65 20 22 61 22 2c 20 22 62 22 20 61 6e 64  are "a", "b" and
b8a0: 20 22 63 22 2c 20 61 6e 64 20 74 68 65 20 7a 4f   "c", and the zO
b8b0: 62 6a 0a 2a 2a 20 70 61 72 61 6d 74 65 72 20 69  bj.** paramter i
b8c0: 73 20 70 61 73 73 65 64 20 22 6f 6c 64 22 2c 20  s passed "old", 
b8d0: 72 65 74 75 72 6e 20 61 20 73 74 72 69 6e 67 20  return a string 
b8e0: 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a  of the form:.**.
b8f0: 2a 2a 20 20 20 20 20 22 6f 6c 64 2e 61 2c 20 6f  **     "old.a, o
b900: 6c 64 2e 62 2c 20 6f 6c 64 2e 62 22 0a 2a 2a 0a  ld.b, old.b".**.
b910: 2a 2a 20 57 69 74 68 20 74 68 65 20 63 6f 6c 75  ** With the colu
b920: 6d 6e 20 6e 61 6d 65 73 20 65 73 63 61 70 65 64  mn names escaped
b930: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 61 62 6c  ..**.** For tabl
b940: 65 73 20 77 69 74 68 20 69 6d 70 6c 69 63 69 74  es with implicit
b950: 20 72 6f 77 69 64 73 20 2d 20 52 42 55 5f 50 4b   rowids - RBU_PK
b960: 5f 45 58 54 45 52 4e 41 4c 20 61 6e 64 20 52 42  _EXTERNAL and RB
b970: 55 5f 50 4b 5f 4e 4f 4e 45 2c 20 61 70 70 65 6e  U_PK_NONE, appen
b980: 64 0a 2a 2a 20 74 68 65 20 74 65 78 74 20 22 2c  d.** the text ",
b990: 20 6f 6c 64 2e 5f 72 6f 77 69 64 5f 22 20 74 6f   old._rowid_" to
b9a0: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 76 61   the returned va
b9b0: 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  lue..*/.static c
b9c0: 68 61 72 20 2a 72 62 75 4f 62 6a 49 74 65 72 47  har *rbuObjIterG
b9d0: 65 74 4f 6c 64 6c 69 73 74 28 0a 20 20 73 71 6c  etOldlist(.  sql
b9e0: 69 74 65 33 72 62 75 20 2a 70 2c 20 0a 20 20 52  ite3rbu *p, .  R
b9f0: 62 75 4f 62 6a 49 74 65 72 20 2a 70 49 74 65 72  buObjIter *pIter
ba00: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
ba10: 7a 4f 62 6a 0a 29 7b 0a 20 20 63 68 61 72 20 2a  zObj.){.  char *
ba20: 7a 4c 69 73 74 20 3d 20 30 3b 0a 20 20 69 66 28  zList = 0;.  if(
ba30: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
ba40: 4b 20 26 26 20 70 49 74 65 72 2d 3e 61 62 49 6e  K && pIter->abIn
ba50: 64 65 78 65 64 20 29 7b 0a 20 20 20 20 63 6f 6e  dexed ){.    con
ba60: 73 74 20 63 68 61 72 20 2a 7a 53 20 3d 20 22 22  st char *zS = ""
ba70: 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
ba80: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65   for(i=0; i<pIte
ba90: 72 2d 3e 6e 54 62 6c 43 6f 6c 3b 20 69 2b 2b 29  r->nTblCol; i++)
baa0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  {.      if( pIte
bab0: 72 2d 3e 61 62 49 6e 64 65 78 65 64 5b 69 5d 20  r->abIndexed[i] 
bac0: 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
bad0: 20 63 68 61 72 20 2a 7a 43 6f 6c 20 3d 20 70 49   char *zCol = pI
bae0: 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69 5d  ter->azTblCol[i]
baf0: 3b 0a 20 20 20 20 20 20 20 20 7a 4c 69 73 74 20  ;.        zList 
bb00: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
bb10: 66 28 22 25 7a 25 73 25 73 2e 5c 22 25 77 5c 22  f("%z%s%s.\"%w\"
bb20: 22 2c 20 7a 4c 69 73 74 2c 20 7a 53 2c 20 7a 4f  ", zList, zS, zO
bb30: 62 6a 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 20  bj, zCol);.     
bb40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
bb50: 7a 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 5f  zList = sqlite3_
bb60: 6d 70 72 69 6e 74 66 28 22 25 7a 25 73 4e 55 4c  mprintf("%z%sNUL
bb70: 4c 22 2c 20 7a 4c 69 73 74 2c 20 7a 53 29 3b 0a  L", zList, zS);.
bb80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 53        }.      zS
bb90: 20 3d 20 22 2c 20 22 3b 0a 20 20 20 20 20 20 69   = ", ";.      i
bba0: 66 28 20 7a 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( zList==0 ){. 
bbb0: 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53         p->rc = S
bbc0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
bbd0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
bbe0: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
bbf0: 2a 20 46 6f 72 20 61 20 74 61 62 6c 65 20 77 69  * For a table wi
bc00: 74 68 20 69 6d 70 6c 69 63 69 74 20 72 6f 77 69  th implicit rowi
bc10: 64 73 2c 20 61 70 70 65 6e 64 20 22 6f 6c 64 2e  ds, append "old.
bc20: 5f 72 6f 77 69 64 5f 22 20 74 6f 20 74 68 65 20  _rowid_" to the 
bc30: 6c 69 73 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28  list. */.    if(
bc40: 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52   pIter->eType==R
bc50: 42 55 5f 50 4b 5f 45 58 54 45 52 4e 41 4c 20 7c  BU_PK_EXTERNAL |
bc60: 7c 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d  | pIter->eType==
bc70: 52 42 55 5f 50 4b 5f 4e 4f 4e 45 20 29 7b 0a 20  RBU_PK_NONE ){. 
bc80: 20 20 20 20 20 7a 4c 69 73 74 20 3d 20 72 62 75       zList = rbu
bc90: 4d 50 72 69 6e 74 66 28 70 2c 20 22 25 7a 2c 20  MPrintf(p, "%z, 
bca0: 25 73 2e 5f 72 6f 77 69 64 5f 22 2c 20 7a 4c 69  %s._rowid_", zLi
bcb0: 73 74 2c 20 7a 4f 62 6a 29 3b 0a 20 20 20 20 7d  st, zObj);.    }
bcc0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4c  .  }.  return zL
bcd0: 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ist;.}../*.** Re
bce0: 74 75 72 6e 20 61 6e 20 65 78 70 72 65 73 73 69  turn an expressi
bcf0: 6f 6e 20 74 68 61 74 20 63 61 6e 20 62 65 20 75  on that can be u
bd00: 73 65 64 20 69 6e 20 61 20 57 48 45 52 45 20 63  sed in a WHERE c
bd10: 6c 61 75 73 65 20 74 6f 20 6d 61 74 63 68 20 74  lause to match t
bd20: 68 65 0a 2a 2a 20 70 72 69 6d 61 72 79 20 6b 65  he.** primary ke
bd30: 79 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  y of the current
bd40: 20 74 61 62 6c 65 2e 20 46 6f 72 20 65 78 61 6d   table. For exam
bd50: 70 6c 65 2c 20 69 66 20 74 68 65 20 74 61 62 6c  ple, if the tabl
bd60: 65 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52  e is:.**.**   CR
bd70: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
bd80: 20 62 2c 20 63 2c 20 50 52 49 4d 41 52 59 20 4b   b, c, PRIMARY K
bd90: 45 59 28 62 2c 20 63 29 29 3b 0a 2a 2a 0a 2a 2a  EY(b, c));.**.**
bda0: 20 52 65 74 75 72 6e 20 74 68 65 20 73 74 72 69   Return the stri
bdb0: 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 62 20 3d  ng:.**.**   "b =
bdc0: 20 3f 31 20 41 4e 44 20 63 20 3d 20 3f 32 22 0a   ?1 AND c = ?2".
bdd0: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
bde0: 72 62 75 4f 62 6a 49 74 65 72 47 65 74 57 68 65  rbuObjIterGetWhe
bdf0: 72 65 28 0a 20 20 73 71 6c 69 74 65 33 72 62 75  re(.  sqlite3rbu
be00: 20 2a 70 2c 20 0a 20 20 52 62 75 4f 62 6a 49 74   *p, .  RbuObjIt
be10: 65 72 20 2a 70 49 74 65 72 0a 29 7b 0a 20 20 63  er *pIter.){.  c
be20: 68 61 72 20 2a 7a 4c 69 73 74 20 3d 20 30 3b 0a  har *zList = 0;.
be30: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 65 54 79    if( pIter->eTy
be40: 70 65 3d 3d 52 42 55 5f 50 4b 5f 56 54 41 42 20  pe==RBU_PK_VTAB 
be50: 7c 7c 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d  || pIter->eType=
be60: 3d 52 42 55 5f 50 4b 5f 4e 4f 4e 45 20 29 7b 0a  =RBU_PK_NONE ){.
be70: 20 20 20 20 7a 4c 69 73 74 20 3d 20 72 62 75 4d      zList = rbuM
be80: 50 72 69 6e 74 66 28 70 2c 20 22 5f 72 6f 77 69  Printf(p, "_rowi
be90: 64 5f 20 3d 20 3f 25 64 22 2c 20 70 49 74 65 72  d_ = ?%d", pIter
bea0: 2d 3e 6e 54 62 6c 43 6f 6c 2b 31 29 3b 0a 20 20  ->nTblCol+1);.  
beb0: 7d 65 6c 73 65 20 69 66 28 20 70 49 74 65 72 2d  }else if( pIter-
bec0: 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 45  >eType==RBU_PK_E
bed0: 58 54 45 52 4e 41 4c 20 29 7b 0a 20 20 20 20 63  XTERNAL ){.    c
bee0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 65 70 20  onst char *zSep 
bef0: 3d 20 22 22 3b 0a 20 20 20 20 69 6e 74 20 69 3b  = "";.    int i;
bf00: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
bf10: 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 3b 20  pIter->nTblCol; 
bf20: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
bf30: 70 49 74 65 72 2d 3e 61 62 54 62 6c 50 6b 5b 69  pIter->abTblPk[i
bf40: 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4c 69  ] ){.        zLi
bf50: 73 74 20 3d 20 72 62 75 4d 50 72 69 6e 74 66 28  st = rbuMPrintf(
bf60: 70 2c 20 22 25 7a 25 73 63 25 64 3d 3f 25 64 22  p, "%z%sc%d=?%d"
bf70: 2c 20 7a 4c 69 73 74 2c 20 7a 53 65 70 2c 20 69  , zList, zSep, i
bf80: 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  , i+1);.        
bf90: 7a 53 65 70 20 3d 20 22 20 41 4e 44 20 22 3b 0a  zSep = " AND ";.
bfa0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
bfb0: 20 20 7a 4c 69 73 74 20 3d 20 72 62 75 4d 50 72    zList = rbuMPr
bfc0: 69 6e 74 66 28 70 2c 20 0a 20 20 20 20 20 20 20  intf(p, .       
bfd0: 20 22 5f 72 6f 77 69 64 5f 20 3d 20 28 53 45 4c   "_rowid_ = (SEL
bfe0: 45 43 54 20 69 64 20 46 52 4f 4d 20 72 62 75 5f  ECT id FROM rbu_
bff0: 69 6d 70 6f 73 74 65 72 32 20 57 48 45 52 45 20  imposter2 WHERE 
c000: 25 7a 29 22 2c 20 7a 4c 69 73 74 0a 20 20 20 20  %z)", zList.    
c010: 29 3b 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  );..  }else{.   
c020: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 65   const char *zSe
c030: 70 20 3d 20 22 22 3b 0a 20 20 20 20 69 6e 74 20  p = "";.    int 
c040: 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
c050: 69 3c 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c  i<pIter->nTblCol
c060: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
c070: 28 20 70 49 74 65 72 2d 3e 61 62 54 62 6c 50 6b  ( pIter->abTblPk
c080: 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 63  [i] ){.        c
c090: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 20  onst char *zCol 
c0a0: 3d 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f  = pIter->azTblCo
c0b0: 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 7a 4c  l[i];.        zL
c0c0: 69 73 74 20 3d 20 72 62 75 4d 50 72 69 6e 74 66  ist = rbuMPrintf
c0d0: 28 70 2c 20 22 25 7a 25 73 5c 22 25 77 5c 22 3d  (p, "%z%s\"%w\"=
c0e0: 3f 25 64 22 2c 20 7a 4c 69 73 74 2c 20 7a 53 65  ?%d", zList, zSe
c0f0: 70 2c 20 7a 43 6f 6c 2c 20 69 2b 31 29 3b 0a 20  p, zCol, i+1);. 
c100: 20 20 20 20 20 20 20 7a 53 65 70 20 3d 20 22 20         zSep = " 
c110: 41 4e 44 20 22 3b 0a 20 20 20 20 20 20 7d 0a 20  AND ";.      }. 
c120: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
c130: 6e 20 7a 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  n zList;.}../*.*
c140: 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61  * The SELECT sta
c150: 74 65 6d 65 6e 74 20 69 74 65 72 61 74 69 6e 67  tement iterating
c160: 20 74 68 72 6f 75 67 68 20 74 68 65 20 6b 65 79   through the key
c170: 73 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  s for the curren
c180: 74 20 6f 62 6a 65 63 74 0a 2a 2a 20 28 70 2d 3e  t object.** (p->
c190: 6f 62 6a 69 74 65 72 2e 70 53 65 6c 65 63 74 29  objiter.pSelect)
c1a0: 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
c1b0: 73 20 74 6f 20 61 20 76 61 6c 69 64 20 72 6f 77  s to a valid row
c1c0: 2e 20 48 6f 77 65 76 65 72 2c 20 74 68 65 72 65  . However, there
c1d0: 0a 2a 2a 20 69 73 20 73 6f 6d 65 74 68 69 6e 67  .** is something
c1e0: 20 77 72 6f 6e 67 20 77 69 74 68 20 74 68 65 20   wrong with the 
c1f0: 72 62 75 5f 63 6f 6e 74 72 6f 6c 20 76 61 6c 75  rbu_control valu
c200: 65 20 69 6e 20 74 68 65 20 72 62 75 5f 63 6f 6e  e in the rbu_con
c210: 74 72 6f 6c 20 76 61 6c 75 65 0a 2a 2a 20 73 74  trol value.** st
c220: 6f 72 65 64 20 69 6e 20 74 68 65 20 28 70 2d 3e  ored in the (p->
c230: 6e 43 6f 6c 2b 31 29 27 74 68 20 63 6f 6c 75 6d  nCol+1)'th colum
c240: 6e 2e 20 53 65 74 20 74 68 65 20 65 72 72 6f 72  n. Set the error
c250: 20 63 6f 64 65 20 61 6e 64 20 65 72 72 6f 72 20   code and error 
c260: 6d 65 73 73 61 67 65 0a 2a 2a 20 6f 66 20 74 68  message.** of th
c270: 65 20 52 42 55 20 68 61 6e 64 6c 65 20 74 6f 20  e RBU handle to 
c280: 73 6f 6d 65 74 68 69 6e 67 20 72 65 66 6c 65 63  something reflec
c290: 74 69 6e 67 20 74 68 69 73 2e 0a 2a 2f 0a 73 74  ting this..*/.st
c2a0: 61 74 69 63 20 76 6f 69 64 20 72 62 75 42 61 64  atic void rbuBad
c2b0: 43 6f 6e 74 72 6f 6c 45 72 72 6f 72 28 73 71 6c  ControlError(sql
c2c0: 69 74 65 33 72 62 75 20 2a 70 29 7b 0a 20 20 70  ite3rbu *p){.  p
c2d0: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52  ->rc = SQLITE_ER
c2e0: 52 4f 52 3b 0a 20 20 70 2d 3e 7a 45 72 72 6d 73  ROR;.  p->zErrms
c2f0: 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  g = sqlite3_mpri
c300: 6e 74 66 28 22 69 6e 76 61 6c 69 64 20 72 62 75  ntf("invalid rbu
c310: 5f 63 6f 6e 74 72 6f 6c 20 76 61 6c 75 65 22 29  _control value")
c320: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ;.}.../*.** Retu
c330: 72 6e 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  rn a nul-termina
c340: 74 65 64 20 73 74 72 69 6e 67 20 63 6f 6e 74 61  ted string conta
c350: 69 6e 69 6e 67 20 74 68 65 20 63 6f 6d 6d 61 20  ining the comma 
c360: 73 65 70 61 72 61 74 65 64 20 6c 69 73 74 20 6f  separated list o
c370: 66 0a 2a 2a 20 61 73 73 69 67 6e 6d 65 6e 74 73  f.** assignments
c380: 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
c390: 69 6e 63 6c 75 64 65 64 20 66 6f 6c 6c 6f 77 69  included followi
c3a0: 6e 67 20 74 68 65 20 22 53 45 54 22 20 6b 65 79  ng the "SET" key
c3b0: 77 6f 72 64 20 6f 66 0a 2a 2a 20 61 6e 20 55 50  word of.** an UP
c3c0: 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20 75  DATE statement u
c3d0: 73 65 64 20 74 6f 20 75 70 64 61 74 65 20 74 68  sed to update th
c3e0: 65 20 74 61 62 6c 65 20 6f 62 6a 65 63 74 20 74  e table object t
c3f0: 68 61 74 20 74 68 65 20 69 74 65 72 61 74 6f 72  hat the iterator
c400: 0a 2a 2a 20 70 61 73 73 65 64 20 61 73 20 74 68  .** passed as th
c410: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
c420: 74 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  t currently poin
c430: 74 73 20 74 6f 20 69 66 20 74 68 65 20 72 62 75  ts to if the rbu
c440: 5f 63 6f 6e 74 72 6f 6c 0a 2a 2a 20 63 6f 6c 75  _control.** colu
c450: 6d 6e 20 6f 66 20 74 68 65 20 64 61 74 61 5f 78  mn of the data_x
c460: 78 78 20 74 61 62 6c 65 20 65 6e 74 72 79 20 69  xx table entry i
c470: 73 20 73 65 74 20 74 6f 20 7a 4d 61 73 6b 2e 0a  s set to zMask..
c480: 2a 2a 0a 2a 2a 20 54 68 65 20 6d 65 6d 6f 72 79  **.** The memory
c490: 20 66 6f 72 20 74 68 65 20 72 65 74 75 72 6e 65   for the returne
c4a0: 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61  d string is obta
c4b0: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
c4c0: 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 49  3_malloc()..** I
c4d0: 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73  t is the respons
c4e0: 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
c4f0: 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61  aller to eventua
c500: 6c 6c 79 20 66 72 65 65 20 69 74 20 75 73 69 6e  lly free it usin
c510: 67 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66 72 65  g.** sqlite3_fre
c520: 65 28 29 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61  e(). .**.** If a
c530: 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 69 73 20 65  n OOM error is e
c540: 6e 63 6f 75 6e 74 65 72 65 64 20 77 68 65 6e 20  ncountered when 
c550: 61 6c 6c 6f 63 61 74 69 6e 67 20 73 70 61 63 65  allocating space
c560: 20 66 6f 72 20 74 68 65 20 6e 65 77 0a 2a 2a 20   for the new.** 
c570: 73 74 72 69 6e 67 2c 20 61 6e 20 65 72 72 6f 72  string, an error
c580: 20 63 6f 64 65 20 69 73 20 6c 65 66 74 20 69 6e   code is left in
c590: 20 74 68 65 20 72 62 75 20 68 61 6e 64 6c 65 20   the rbu handle 
c5a0: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
c5b0: 72 73 74 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20  rst.** argument 
c5c0: 61 6e 64 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  and NULL is retu
c5d0: 72 6e 65 64 2e 20 4f 72 2c 20 69 66 20 61 6e 20  rned. Or, if an 
c5e0: 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64  error has alread
c5f0: 79 20 6f 63 63 75 72 72 65 64 0a 2a 2a 20 77 68  y occurred.** wh
c600: 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
c610: 20 69 73 20 63 61 6c 6c 65 64 2c 20 4e 55 4c 4c   is called, NULL
c620: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 6d 6d   is returned imm
c630: 65 64 69 61 74 65 6c 79 2c 20 77 69 74 68 6f 75  ediately, withou
c640: 74 0a 2a 2a 20 61 74 74 65 6d 70 74 69 6e 67 20  t.** attempting 
c650: 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f  the allocation o
c660: 72 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20  r modifying the 
c670: 73 74 6f 72 65 64 20 65 72 72 6f 72 20 63 6f 64  stored error cod
c680: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  e..*/.static cha
c690: 72 20 2a 72 62 75 4f 62 6a 49 74 65 72 47 65 74  r *rbuObjIterGet
c6a0: 53 65 74 6c 69 73 74 28 0a 20 20 73 71 6c 69 74  Setlist(.  sqlit
c6b0: 65 33 72 62 75 20 2a 70 2c 0a 20 20 52 62 75 4f  e3rbu *p,.  RbuO
c6c0: 62 6a 49 74 65 72 20 2a 70 49 74 65 72 2c 0a 20  bjIter *pIter,. 
c6d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61   const char *zMa
c6e0: 73 6b 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4c  sk.){.  char *zL
c6f0: 69 73 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  ist = 0;.  if( p
c700: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
c710: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20  ){.    int i;.. 
c720: 20 20 20 69 66 28 20 28 69 6e 74 29 73 74 72 6c     if( (int)strl
c730: 65 6e 28 7a 4d 61 73 6b 29 21 3d 70 49 74 65 72  en(zMask)!=pIter
c740: 2d 3e 6e 54 62 6c 43 6f 6c 20 29 7b 0a 20 20 20  ->nTblCol ){.   
c750: 20 20 20 72 62 75 42 61 64 43 6f 6e 74 72 6f 6c     rbuBadControl
c760: 45 72 72 6f 72 28 70 29 3b 0a 20 20 20 20 7d 65  Error(p);.    }e
c770: 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  lse{.      const
c780: 20 63 68 61 72 20 2a 7a 53 65 70 20 3d 20 22 22   char *zSep = ""
c790: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
c7a0: 20 69 3c 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f   i<pIter->nTblCo
c7b0: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; i++){.       
c7c0: 20 63 68 61 72 20 63 20 3d 20 7a 4d 61 73 6b 5b   char c = zMask[
c7d0: 70 49 74 65 72 2d 3e 61 69 53 72 63 4f 72 64 65  pIter->aiSrcOrde
c7e0: 72 5b 69 5d 5d 3b 0a 20 20 20 20 20 20 20 20 69  r[i]];.        i
c7f0: 66 28 20 63 3d 3d 27 78 27 20 29 7b 0a 20 20 20  f( c=='x' ){.   
c800: 20 20 20 20 20 20 20 7a 4c 69 73 74 20 3d 20 72         zList = r
c810: 62 75 4d 50 72 69 6e 74 66 28 70 2c 20 22 25 7a  buMPrintf(p, "%z
c820: 25 73 5c 22 25 77 5c 22 3d 3f 25 64 22 2c 20 0a  %s\"%w\"=?%d", .
c830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4c                zL
c840: 69 73 74 2c 20 7a 53 65 70 2c 20 70 49 74 65 72  ist, zSep, pIter
c850: 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69 5d 2c 20 69  ->azTblCol[i], i
c860: 2b 31 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a  +1.          );.
c870: 20 20 20 20 20 20 20 20 20 20 7a 53 65 70 20 3d            zSep =
c880: 20 22 2c 20 22 3b 0a 20 20 20 20 20 20 20 20 7d   ", ";.        }
c890: 0a 20 20 20 20 20 20 20 20 65 6c 73 65 20 69 66  .        else if
c8a0: 28 20 63 3d 3d 27 64 27 20 29 7b 0a 20 20 20 20  ( c=='d' ){.    
c8b0: 20 20 20 20 20 20 7a 4c 69 73 74 20 3d 20 72 62        zList = rb
c8c0: 75 4d 50 72 69 6e 74 66 28 70 2c 20 22 25 7a 25  uMPrintf(p, "%z%
c8d0: 73 5c 22 25 77 5c 22 3d 72 62 75 5f 64 65 6c 74  s\"%w\"=rbu_delt
c8e0: 61 28 5c 22 25 77 5c 22 2c 20 3f 25 64 29 22 2c  a(\"%w\", ?%d)",
c8f0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
c900: 7a 4c 69 73 74 2c 20 7a 53 65 70 2c 20 70 49 74  zList, zSep, pIt
c910: 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69 5d 2c  er->azTblCol[i],
c920: 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c   pIter->azTblCol
c930: 5b 69 5d 2c 20 69 2b 31 0a 20 20 20 20 20 20 20  [i], i+1.       
c940: 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20     );.          
c950: 7a 53 65 70 20 3d 20 22 2c 20 22 3b 0a 20 20 20  zSep = ", ";.   
c960: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 65       }.        e
c970: 6c 73 65 20 69 66 28 20 63 3d 3d 27 66 27 20 29  lse if( c=='f' )
c980: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 4c 69 73  {.          zLis
c990: 74 20 3d 20 72 62 75 4d 50 72 69 6e 74 66 28 70  t = rbuMPrintf(p
c9a0: 2c 20 22 25 7a 25 73 5c 22 25 77 5c 22 3d 72 62  , "%z%s\"%w\"=rb
c9b0: 75 5f 66 6f 73 73 69 6c 5f 64 65 6c 74 61 28 5c  u_fossil_delta(\
c9c0: 22 25 77 5c 22 2c 20 3f 25 64 29 22 2c 20 0a 20  "%w\", ?%d)", . 
c9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4c 69               zLi
c9e0: 73 74 2c 20 7a 53 65 70 2c 20 70 49 74 65 72 2d  st, zSep, pIter-
c9f0: 3e 61 7a 54 62 6c 43 6f 6c 5b 69 5d 2c 20 70 49  >azTblCol[i], pI
ca00: 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69 5d  ter->azTblCol[i]
ca10: 2c 20 69 2b 31 0a 20 20 20 20 20 20 20 20 20 20  , i+1.          
ca20: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 53 65  );.          zSe
ca30: 70 20 3d 20 22 2c 20 22 3b 0a 20 20 20 20 20 20  p = ", ";.      
ca40: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
ca50: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  }.  }.  return z
ca60: 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  List;.}../*.** R
ca70: 65 74 75 72 6e 20 61 20 6e 75 6c 2d 74 65 72 6d  eturn a nul-term
ca80: 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20 63 6f  inated string co
ca90: 6e 73 69 73 74 69 6e 67 20 6f 66 20 6e 42 79 74  nsisting of nByt
caa0: 65 20 63 6f 6d 6d 61 20 73 65 70 61 72 61 74 65  e comma separate
cab0: 64 0a 2a 2a 20 22 3f 22 20 65 78 70 72 65 73 73  d.** "?" express
cac0: 69 6f 6e 73 2e 20 46 6f 72 20 65 78 61 6d 70 6c  ions. For exampl
cad0: 65 2c 20 69 66 20 6e 42 79 74 65 20 69 73 20 33  e, if nByte is 3
cae0: 2c 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  , return a point
caf0: 65 72 20 74 6f 0a 2a 2a 20 61 20 62 75 66 66 65  er to.** a buffe
cb00: 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  r containing the
cb10: 20 73 74 72 69 6e 67 20 22 3f 2c 3f 2c 3f 22 2e   string "?,?,?".
cb20: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 65 6d 6f 72  .**.** The memor
cb30: 79 20 66 6f 72 20 74 68 65 20 72 65 74 75 72 6e  y for the return
cb40: 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74  ed string is obt
cb50: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
cb60: 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20  e3_malloc()..** 
cb70: 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e  It is the respon
cb80: 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
cb90: 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75  caller to eventu
cba0: 61 6c 6c 79 20 66 72 65 65 20 69 74 20 75 73 69  ally free it usi
cbb0: 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66 72  ng.** sqlite3_fr
cbc0: 65 65 28 29 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  ee(). .**.** If 
cbd0: 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 69 73 20  an OOM error is 
cbe0: 65 6e 63 6f 75 6e 74 65 72 65 64 20 77 68 65 6e  encountered when
cbf0: 20 61 6c 6c 6f 63 61 74 69 6e 67 20 73 70 61 63   allocating spac
cc00: 65 20 66 6f 72 20 74 68 65 20 6e 65 77 0a 2a 2a  e for the new.**
cc10: 20 73 74 72 69 6e 67 2c 20 61 6e 20 65 72 72 6f   string, an erro
cc20: 72 20 63 6f 64 65 20 69 73 20 6c 65 66 74 20 69  r code is left i
cc30: 6e 20 74 68 65 20 72 62 75 20 68 61 6e 64 6c 65  n the rbu handle
cc40: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
cc50: 69 72 73 74 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  irst.** argument
cc60: 20 61 6e 64 20 4e 55 4c 4c 20 69 73 20 72 65 74   and NULL is ret
cc70: 75 72 6e 65 64 2e 20 4f 72 2c 20 69 66 20 61 6e  urned. Or, if an
cc80: 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61   error has alrea
cc90: 64 79 20 6f 63 63 75 72 72 65 64 0a 2a 2a 20 77  dy occurred.** w
cca0: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
ccb0: 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 4e 55 4c  n is called, NUL
ccc0: 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 6d  L is returned im
ccd0: 6d 65 64 69 61 74 65 6c 79 2c 20 77 69 74 68 6f  mediately, witho
cce0: 75 74 0a 2a 2a 20 61 74 74 65 6d 70 74 69 6e 67  ut.** attempting
ccf0: 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20   the allocation 
cd00: 6f 72 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65  or modifying the
cd10: 20 73 74 6f 72 65 64 20 65 72 72 6f 72 20 63 6f   stored error co
cd20: 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  de..*/.static ch
cd30: 61 72 20 2a 72 62 75 4f 62 6a 49 74 65 72 47 65  ar *rbuObjIterGe
cd40: 74 42 69 6e 64 6c 69 73 74 28 73 71 6c 69 74 65  tBindlist(sqlite
cd50: 33 72 62 75 20 2a 70 2c 20 69 6e 74 20 6e 42 69  3rbu *p, int nBi
cd60: 6e 64 29 7b 0a 20 20 63 68 61 72 20 2a 7a 52 65  nd){.  char *zRe
cd70: 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 42 79  t = 0;.  int nBy
cd80: 74 65 20 3d 20 6e 42 69 6e 64 2a 32 20 2b 20 31  te = nBind*2 + 1
cd90: 3b 0a 0a 20 20 7a 52 65 74 20 3d 20 28 63 68 61  ;..  zRet = (cha
cda0: 72 2a 29 72 62 75 4d 61 6c 6c 6f 63 28 70 2c 20  r*)rbuMalloc(p, 
cdb0: 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 7a 52  nByte);.  if( zR
cdc0: 65 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  et ){.    int i;
cdd0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
cde0: 6e 42 69 6e 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  nBind; i++){.   
cdf0: 20 20 20 7a 52 65 74 5b 69 2a 32 5d 20 3d 20 27     zRet[i*2] = '
ce00: 3f 27 3b 0a 20 20 20 20 20 20 7a 52 65 74 5b 69  ?';.      zRet[i
ce10: 2a 32 2b 31 5d 20 3d 20 28 69 2b 31 3d 3d 6e 42  *2+1] = (i+1==nB
ce20: 69 6e 64 29 20 3f 20 27 5c 30 27 20 3a 20 27 2c  ind) ? '\0' : ',
ce30: 27 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  ';.    }.  }.  r
ce40: 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 0a 2f  eturn zRet;.}../
ce50: 2a 0a 2a 2a 20 54 68 65 20 69 74 65 72 61 74 6f  *.** The iterato
ce60: 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  r currently poin
ce70: 74 73 20 74 6f 20 61 20 74 61 62 6c 65 20 28 6e  ts to a table (n
ce80: 6f 74 20 69 6e 64 65 78 29 20 6f 66 20 74 79 70  ot index) of typ
ce90: 65 20 0a 2a 2a 20 52 42 55 5f 50 4b 5f 57 49 54  e .** RBU_PK_WIT
cea0: 48 4f 55 54 5f 52 4f 57 49 44 2e 20 54 68 69 73  HOUT_ROWID. This
ceb0: 20 66 75 6e 63 74 69 6f 6e 20 63 72 65 61 74 65   function create
cec0: 73 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  s the PRIMARY KE
ced0: 59 20 0a 2a 2a 20 64 65 63 6c 61 72 61 74 69 6f  Y .** declaratio
cee0: 6e 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65 73  n for the corres
cef0: 70 6f 6e 64 69 6e 67 20 69 6d 70 6f 73 74 65 72  ponding imposter
cf00: 20 74 61 62 6c 65 2e 20 46 6f 72 20 65 78 61 6d   table. For exam
cf10: 70 6c 65 2c 0a 2a 2a 20 69 66 20 74 68 65 20 69  ple,.** if the i
cf20: 74 65 72 61 74 6f 72 20 70 6f 69 6e 74 73 20 74  terator points t
cf30: 6f 20 61 20 74 61 62 6c 65 20 63 72 65 61 74 65  o a table create
cf40: 64 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52  d as:.**.**   CR
cf50: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
cf60: 20 62 2c 20 63 2c 20 50 52 49 4d 41 52 59 20 4b   b, c, PRIMARY K
cf70: 45 59 28 62 2c 20 61 20 44 45 53 43 29 29 20 57  EY(b, a DESC)) W
cf80: 49 54 48 4f 55 54 20 52 4f 57 49 44 0a 2a 2a 0a  ITHOUT ROWID.**.
cf90: 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
cfa0: 20 72 65 74 75 72 6e 73 3a 0a 2a 2a 0a 2a 2a 20   returns:.**.** 
cfb0: 20 20 50 52 49 4d 41 52 59 20 4b 45 59 28 22 62    PRIMARY KEY("b
cfc0: 22 2c 20 22 61 22 20 44 45 53 43 29 0a 2a 2f 0a  ", "a" DESC).*/.
cfd0: 73 74 61 74 69 63 20 63 68 61 72 20 2a 72 62 75  static char *rbu
cfe0: 57 69 74 68 6f 75 74 52 6f 77 69 64 50 4b 28 73  WithoutRowidPK(s
cff0: 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 52 62  qlite3rbu *p, Rb
d000: 75 4f 62 6a 49 74 65 72 20 2a 70 49 74 65 72 29  uObjIter *pIter)
d010: 7b 0a 20 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b  {.  char *z = 0;
d020: 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72  .  assert( pIter
d030: 2d 3e 7a 49 64 78 3d 3d 30 20 29 3b 0a 20 20 69  ->zIdx==0 );.  i
d040: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
d050: 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  _OK ){.    const
d060: 20 63 68 61 72 20 2a 7a 53 65 70 20 3d 20 22 50   char *zSep = "P
d070: 52 49 4d 41 52 59 20 4b 45 59 28 22 3b 0a 20 20  RIMARY KEY(";.  
d080: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
d090: 70 58 4c 69 73 74 20 3d 20 30 3b 20 20 20 20 20  pXList = 0;     
d0a0: 2f 2a 20 50 52 41 47 4d 41 20 69 6e 64 65 78 5f  /* PRAGMA index_
d0b0: 6c 69 73 74 20 3d 20 28 70 49 74 65 72 2d 3e 7a  list = (pIter->z
d0c0: 54 62 6c 29 20 2a 2f 0a 20 20 20 20 73 71 6c 69  Tbl) */.    sqli
d0d0: 74 65 33 5f 73 74 6d 74 20 2a 70 58 49 6e 66 6f  te3_stmt *pXInfo
d0e0: 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 50 52 41   = 0;     /* PRA
d0f0: 47 4d 41 20 69 6e 64 65 78 5f 78 69 6e 66 6f 20  GMA index_xinfo 
d100: 3d 20 3c 70 6b 2d 69 6e 64 65 78 3e 20 2a 2f 0a  = <pk-index> */.
d110: 20 20 20 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20     .    p->rc = 
d120: 70 72 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f  prepareFreeAndCo
d130: 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62  llectError(p->db
d140: 4d 61 69 6e 2c 20 26 70 58 4c 69 73 74 2c 20 26  Main, &pXList, &
d150: 70 2d 3e 7a 45 72 72 6d 73 67 2c 0a 20 20 20 20  p->zErrmsg,.    
d160: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69      sqlite3_mpri
d170: 6e 74 66 28 22 50 52 41 47 4d 41 20 6d 61 69 6e  ntf("PRAGMA main
d180: 2e 69 6e 64 65 78 5f 6c 69 73 74 20 3d 20 25 51  .index_list = %Q
d190: 22 2c 20 70 49 74 65 72 2d 3e 7a 54 62 6c 29 0a  ", pIter->zTbl).
d1a0: 20 20 20 20 29 3b 0a 20 20 20 20 77 68 69 6c 65      );.    while
d1b0: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
d1c0: 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57  OK && SQLITE_ROW
d1d0: 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ==sqlite3_step(p
d1e0: 58 4c 69 73 74 29 20 29 7b 0a 20 20 20 20 20 20  XList) ){.      
d1f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69  const char *zOri
d200: 67 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  g = (const char*
d210: 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
d220: 74 65 78 74 28 70 58 4c 69 73 74 2c 33 29 3b 0a  text(pXList,3);.
d230: 20 20 20 20 20 20 69 66 28 20 7a 4f 72 69 67 20        if( zOrig 
d240: 26 26 20 73 74 72 63 6d 70 28 7a 4f 72 69 67 2c  && strcmp(zOrig,
d250: 20 22 70 6b 22 29 3d 3d 30 20 29 7b 0a 20 20 20   "pk")==0 ){.   
d260: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
d270: 2a 7a 49 64 78 20 3d 20 28 63 6f 6e 73 74 20 63  *zIdx = (const c
d280: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
d290: 75 6d 6e 5f 74 65 78 74 28 70 58 4c 69 73 74 2c  umn_text(pXList,
d2a0: 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
d2b0: 7a 49 64 78 20 29 7b 0a 20 20 20 20 20 20 20 20  zIdx ){.        
d2c0: 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72    p->rc = prepar
d2d0: 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45  eFreeAndCollectE
d2e0: 72 72 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20  rror(p->dbMain, 
d2f0: 26 70 58 49 6e 66 6f 2c 20 26 70 2d 3e 7a 45 72  &pXInfo, &p->zEr
d300: 72 6d 73 67 2c 0a 20 20 20 20 20 20 20 20 20 20  rmsg,.          
d310: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69      sqlite3_mpri
d320: 6e 74 66 28 22 50 52 41 47 4d 41 20 6d 61 69 6e  ntf("PRAGMA main
d330: 2e 69 6e 64 65 78 5f 78 69 6e 66 6f 20 3d 20 25  .index_xinfo = %
d340: 51 22 2c 20 7a 49 64 78 29 0a 20 20 20 20 20 20  Q", zIdx).      
d350: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7d      );.        }
d360: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
d370: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
d380: 20 20 72 62 75 46 69 6e 61 6c 69 7a 65 28 70 2c    rbuFinalize(p,
d390: 20 70 58 4c 69 73 74 29 3b 0a 0a 20 20 20 20 77   pXList);..    w
d3a0: 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  hile( p->rc==SQL
d3b0: 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45  ITE_OK && SQLITE
d3c0: 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74  _ROW==sqlite3_st
d3d0: 65 70 28 70 58 49 6e 66 6f 29 20 29 7b 0a 20 20  ep(pXInfo) ){.  
d3e0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
d3f0: 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 58 49 6e 66  column_int(pXInf
d400: 6f 2c 20 35 29 20 29 7b 0a 20 20 20 20 20 20 20  o, 5) ){.       
d410: 20 2f 2a 20 69 6e 74 20 69 43 69 64 20 3d 20 73   /* int iCid = s
d420: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
d430: 74 28 70 58 49 6e 66 6f 2c 20 30 29 3b 20 2a 2f  t(pXInfo, 0); */
d440: 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
d450: 68 61 72 20 2a 7a 43 6f 6c 20 3d 20 28 63 6f 6e  har *zCol = (con
d460: 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
d470: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 58 49  _column_text(pXI
d480: 6e 66 6f 2c 20 32 29 3b 0a 20 20 20 20 20 20 20  nfo, 2);.       
d490: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 65   const char *zDe
d4a0: 73 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  sc = sqlite3_col
d4b0: 75 6d 6e 5f 69 6e 74 28 70 58 49 6e 66 6f 2c 20  umn_int(pXInfo, 
d4c0: 33 29 20 3f 20 22 20 44 45 53 43 22 20 3a 20 22  3) ? " DESC" : "
d4d0: 22 3b 0a 20 20 20 20 20 20 20 20 7a 20 3d 20 72  ";.        z = r
d4e0: 62 75 4d 50 72 69 6e 74 66 28 70 2c 20 22 25 7a  buMPrintf(p, "%z
d4f0: 25 73 5c 22 25 77 5c 22 25 73 22 2c 20 7a 2c 20  %s\"%w\"%s", z, 
d500: 7a 53 65 70 2c 20 7a 43 6f 6c 2c 20 7a 44 65 73  zSep, zCol, zDes
d510: 63 29 3b 0a 20 20 20 20 20 20 20 20 7a 53 65 70  c);.        zSep
d520: 20 3d 20 22 2c 20 22 3b 0a 20 20 20 20 20 20 7d   = ", ";.      }
d530: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 20 3d 20 72  .    }.    z = r
d540: 62 75 4d 50 72 69 6e 74 66 28 70 2c 20 22 25 7a  buMPrintf(p, "%z
d550: 29 22 2c 20 7a 29 3b 0a 20 20 20 20 72 62 75 46  )", z);.    rbuF
d560: 69 6e 61 6c 69 7a 65 28 70 2c 20 70 58 49 6e 66  inalize(p, pXInf
d570: 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  o);.  }.  return
d580: 20 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   z;.}../*.** Thi
d590: 73 20 66 75 6e 63 74 69 6f 6e 20 63 72 65 61 74  s function creat
d5a0: 65 73 20 74 68 65 20 73 65 63 6f 6e 64 20 69 6d  es the second im
d5b0: 70 6f 73 74 65 72 20 74 61 62 6c 65 20 75 73 65  poster table use
d5c0: 64 20 77 68 65 6e 20 77 72 69 74 69 6e 67 20 74  d when writing t
d5d0: 6f 0a 2a 2a 20 61 20 74 61 62 6c 65 20 62 2d 74  o.** a table b-t
d5e0: 72 65 65 20 77 68 65 72 65 20 74 68 65 20 74 61  ree where the ta
d5f0: 62 6c 65 20 68 61 73 20 61 6e 20 65 78 74 65 72  ble has an exter
d600: 6e 61 6c 20 70 72 69 6d 61 72 79 20 6b 65 79 2e  nal primary key.
d610: 20 49 66 20 74 68 65 0a 2a 2a 20 69 74 65 72 61   If the.** itera
d620: 74 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68  tor passed as th
d630: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
d640: 74 20 64 6f 65 73 20 6e 6f 74 20 63 75 72 72 65  t does not curre
d650: 6e 74 6c 79 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a  ntly point to.**
d660: 20 61 20 74 61 62 6c 65 20 28 6e 6f 74 20 69 6e   a table (not in
d670: 64 65 78 29 20 77 69 74 68 20 61 6e 20 65 78 74  dex) with an ext
d680: 65 72 6e 61 6c 20 70 72 69 6d 61 72 79 20 6b 65  ernal primary ke
d690: 79 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  y, this function
d6a0: 20 69 73 20 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20   is a.** no-op. 
d6b0: 0a 2a 2a 0a 2a 2a 20 41 73 73 75 6d 69 6e 67 20  .**.** Assuming 
d6c0: 74 68 65 20 69 74 65 72 61 74 6f 72 20 64 6f 65  the iterator doe
d6d0: 73 20 70 6f 69 6e 74 20 74 6f 20 61 20 74 61 62  s point to a tab
d6e0: 6c 65 20 77 69 74 68 20 61 6e 20 65 78 74 65 72  le with an exter
d6f0: 6e 61 6c 20 50 4b 2c 20 74 68 69 73 0a 2a 2a 20  nal PK, this.** 
d700: 66 75 6e 63 74 69 6f 6e 20 63 72 65 61 74 65 73  function creates
d710: 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44   a WITHOUT ROWID
d720: 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 20   imposter table 
d730: 6e 61 6d 65 64 20 22 72 62 75 5f 69 6d 70 6f 73  named "rbu_impos
d740: 74 65 72 32 22 0a 2a 2a 20 75 73 65 64 20 74 6f  ter2".** used to
d750: 20 61 63 63 65 73 73 20 74 68 61 74 20 50 4b 20   access that PK 
d760: 69 6e 64 65 78 2e 20 46 6f 72 20 65 78 61 6d 70  index. For examp
d770: 6c 65 2c 20 69 66 20 74 68 65 20 74 61 72 67 65  le, if the targe
d780: 74 20 74 61 62 6c 65 20 69 73 0a 2a 2a 20 64 65  t table is.** de
d790: 63 6c 61 72 65 64 20 61 73 20 66 6f 6c 6c 6f 77  clared as follow
d7a0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54  s:.**.**   CREAT
d7b0: 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 20  E TABLE t1(a, b 
d7c0: 54 45 58 54 2c 20 63 20 52 45 41 4c 2c 20 50 52  TEXT, c REAL, PR
d7d0: 49 4d 41 52 59 20 4b 45 59 28 62 2c 20 63 29 29  IMARY KEY(b, c))
d7e0: 3b 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 74 68 65  ;.**.** then the
d7f0: 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 20   imposter table 
d800: 73 63 68 65 6d 61 20 69 73 3a 0a 2a 2a 0a 2a 2a  schema is:.**.**
d810: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
d820: 72 62 75 5f 69 6d 70 6f 73 74 65 72 32 28 63 31  rbu_imposter2(c1
d830: 20 54 45 58 54 2c 20 63 32 20 52 45 41 4c 2c 20   TEXT, c2 REAL, 
d840: 69 64 20 49 4e 54 45 47 45 52 29 20 57 49 54 48  id INTEGER) WITH
d850: 4f 55 54 20 52 4f 57 49 44 3b 0a 2a 2a 0a 2a 2f  OUT ROWID;.**.*/
d860: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75  .static void rbu
d870: 43 72 65 61 74 65 49 6d 70 6f 73 74 65 72 54 61  CreateImposterTa
d880: 62 6c 65 32 28 73 71 6c 69 74 65 33 72 62 75 20  ble2(sqlite3rbu 
d890: 2a 70 2c 20 52 62 75 4f 62 6a 49 74 65 72 20 2a  *p, RbuObjIter *
d8a0: 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70 2d  pIter){.  if( p-
d8b0: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
d8c0: 26 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d  & pIter->eType==
d8d0: 52 42 55 5f 50 4b 5f 45 58 54 45 52 4e 41 4c 20  RBU_PK_EXTERNAL 
d8e0: 29 7b 0a 20 20 20 20 69 6e 74 20 74 6e 75 6d 20  ){.    int tnum 
d8f0: 3d 20 70 49 74 65 72 2d 3e 69 50 6b 54 6e 75 6d  = pIter->iPkTnum
d900: 3b 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67  ;    /* Root pag
d910: 65 20 6f 66 20 50 4b 20 69 6e 64 65 78 20 2a 2f  e of PK index */
d920: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  .    sqlite3_stm
d930: 74 20 2a 70 51 75 65 72 79 20 3d 20 30 3b 20 20  t *pQuery = 0;  
d940: 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 6e 61 6d     /* SELECT nam
d950: 65 20 2e 2e 2e 20 57 48 45 52 45 20 72 6f 6f 74  e ... WHERE root
d960: 70 61 67 65 20 3d 20 24 74 6e 75 6d 20 2a 2f 0a  page = $tnum */.
d970: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
d980: 7a 49 64 78 20 3d 20 30 3b 20 20 20 20 20 20 20  zIdx = 0;       
d990: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 50 4b 20    /* Name of PK 
d9a0: 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 73 71 6c  index */.    sql
d9b0: 69 74 65 33 5f 73 74 6d 74 20 2a 70 58 49 6e 66  ite3_stmt *pXInf
d9c0: 6f 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 50 52  o = 0;     /* PR
d9d0: 41 47 4d 41 20 6d 61 69 6e 2e 69 6e 64 65 78 5f  AGMA main.index_
d9e0: 78 69 6e 66 6f 20 3d 20 24 7a 49 64 78 20 2a 2f  xinfo = $zIdx */
d9f0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
da00: 2a 7a 43 6f 6d 6d 61 20 3d 20 22 22 3b 0a 20 20  *zComma = "";.  
da10: 20 20 63 68 61 72 20 2a 7a 43 6f 6c 73 20 3d 20    char *zCols = 
da20: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
da30: 2f 2a 20 55 73 65 64 20 74 6f 20 62 75 69 6c 64  /* Used to build
da40: 20 75 70 20 6c 69 73 74 20 6f 66 20 74 61 62 6c   up list of tabl
da50: 65 20 63 6f 6c 73 20 2a 2f 0a 20 20 20 20 63 68  e cols */.    ch
da60: 61 72 20 2a 7a 50 6b 20 3d 20 30 3b 20 20 20 20  ar *zPk = 0;    
da70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
da80: 73 65 64 20 74 6f 20 62 75 69 6c 64 20 75 70 20  sed to build up 
da90: 74 61 62 6c 65 20 50 4b 20 64 65 63 6c 61 72 61  table PK declara
daa0: 74 69 6f 6e 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  tion */..    /* 
dab0: 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 6e  Figure out the n
dac0: 61 6d 65 20 6f 66 20 74 68 65 20 70 72 69 6d 61  ame of the prima
dad0: 72 79 20 6b 65 79 20 69 6e 64 65 78 20 66 6f 72  ry key index for
dae0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62   the current tab
daf0: 6c 65 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20  le..    ** This 
db00: 69 73 20 6e 65 65 64 65 64 20 66 6f 72 20 74 68  is needed for th
db10: 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 22 50  e argument to "P
db20: 52 41 47 4d 41 20 69 6e 64 65 78 5f 78 69 6e 66  RAGMA index_xinf
db30: 6f 22 2e 20 53 65 74 0a 20 20 20 20 2a 2a 20 7a  o". Set.    ** z
db40: 49 64 78 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  Idx to point to 
db50: 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64  a nul-terminated
db60: 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69   string containi
db70: 6e 67 20 74 68 69 73 20 6e 61 6d 65 2e 20 2a 2f  ng this name. */
db80: 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 72 65  .    p->rc = pre
db90: 70 61 72 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72  pareAndCollectEr
dba0: 72 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 26  ror(p->dbMain, &
dbb0: 70 51 75 65 72 79 2c 20 26 70 2d 3e 7a 45 72 72  pQuery, &p->zErr
dbc0: 6d 73 67 2c 20 0a 20 20 20 20 20 20 20 20 22 53  msg, .        "S
dbd0: 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20  ELECT name FROM 
dbe0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 57 48  sqlite_master WH
dbf0: 45 52 45 20 72 6f 6f 74 70 61 67 65 20 3d 20 3f  ERE rootpage = ?
dc00: 22 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  ".    );.    if(
dc10: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
dc20: 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
dc30: 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 51 75 65  e3_bind_int(pQue
dc40: 72 79 2c 20 31 2c 20 74 6e 75 6d 29 3b 0a 20 20  ry, 1, tnum);.  
dc50: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52      if( SQLITE_R
dc60: 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
dc70: 28 70 51 75 65 72 79 29 20 29 7b 0a 20 20 20 20  (pQuery) ){.    
dc80: 20 20 20 20 7a 49 64 78 20 3d 20 28 63 6f 6e 73      zIdx = (cons
dc90: 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
dca0: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 51 75 65  column_text(pQue
dcb0: 72 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ry, 0);.      }.
dcc0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 49      }.    if( zI
dcd0: 64 78 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72  dx ){.      p->r
dce0: 63 20 3d 20 70 72 65 70 61 72 65 46 72 65 65 41  c = prepareFreeA
dcf0: 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70  ndCollectError(p
dd00: 2d 3e 64 62 4d 61 69 6e 2c 20 26 70 58 49 6e 66  ->dbMain, &pXInf
dd10: 6f 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 0a  o, &p->zErrmsg,.
dd20: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
dd30: 33 5f 6d 70 72 69 6e 74 66 28 22 50 52 41 47 4d  3_mprintf("PRAGM
dd40: 41 20 6d 61 69 6e 2e 69 6e 64 65 78 5f 78 69 6e  A main.index_xin
dd50: 66 6f 20 3d 20 25 51 22 2c 20 7a 49 64 78 29 0a  fo = %Q", zIdx).
dd60: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
dd70: 20 20 20 72 62 75 46 69 6e 61 6c 69 7a 65 28 70     rbuFinalize(p
dd80: 2c 20 70 51 75 65 72 79 29 3b 0a 0a 20 20 20 20  , pQuery);..    
dd90: 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51  while( p->rc==SQ
dda0: 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54  LITE_OK && SQLIT
ddb0: 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73  E_ROW==sqlite3_s
ddc0: 74 65 70 28 70 58 49 6e 66 6f 29 20 29 7b 0a 20  tep(pXInfo) ){. 
ddd0: 20 20 20 20 20 69 6e 74 20 62 4b 65 79 20 3d 20       int bKey = 
dde0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
ddf0: 6e 74 28 70 58 49 6e 66 6f 2c 20 35 29 3b 0a 20  nt(pXInfo, 5);. 
de00: 20 20 20 20 20 69 66 28 20 62 4b 65 79 20 29 7b       if( bKey ){
de10: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 69  .        int iCi
de20: 64 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  d = sqlite3_colu
de30: 6d 6e 5f 69 6e 74 28 70 58 49 6e 66 6f 2c 20 31  mn_int(pXInfo, 1
de40: 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 62  );.        int b
de50: 44 65 73 63 20 3d 20 73 71 6c 69 74 65 33 5f 63  Desc = sqlite3_c
de60: 6f 6c 75 6d 6e 5f 69 6e 74 28 70 58 49 6e 66 6f  olumn_int(pXInfo
de70: 2c 20 33 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  , 3);.        co
de80: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 61  nst char *zColla
de90: 74 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  te = (const char
dea0: 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
deb0: 5f 74 65 78 74 28 70 58 49 6e 66 6f 2c 20 34 29  _text(pXInfo, 4)
dec0: 3b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 73 20  ;.        zCols 
ded0: 3d 20 72 62 75 4d 50 72 69 6e 74 66 28 70 2c 20  = rbuMPrintf(p, 
dee0: 22 25 7a 25 73 63 25 64 20 25 73 20 43 4f 4c 4c  "%z%sc%d %s COLL
def0: 41 54 45 20 25 73 22 2c 20 7a 43 6f 6c 73 2c 20  ATE %s", zCols, 
df00: 7a 43 6f 6d 6d 61 2c 20 0a 20 20 20 20 20 20 20  zComma, .       
df10: 20 20 20 20 20 69 43 69 64 2c 20 70 49 74 65 72       iCid, pIter
df20: 2d 3e 61 7a 54 62 6c 54 79 70 65 5b 69 43 69 64  ->azTblType[iCid
df30: 5d 2c 20 7a 43 6f 6c 6c 61 74 65 0a 20 20 20 20  ], zCollate.    
df40: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7a      );.        z
df50: 50 6b 20 3d 20 72 62 75 4d 50 72 69 6e 74 66 28  Pk = rbuMPrintf(
df60: 70 2c 20 22 25 7a 25 73 63 25 64 25 73 22 2c 20  p, "%z%sc%d%s", 
df70: 7a 50 6b 2c 20 7a 43 6f 6d 6d 61 2c 20 69 43 69  zPk, zComma, iCi
df80: 64 2c 20 62 44 65 73 63 3f 22 20 44 45 53 43 22  d, bDesc?" DESC"
df90: 3a 22 22 29 3b 0a 20 20 20 20 20 20 20 20 7a 43  :"");.        zC
dfa0: 6f 6d 6d 61 20 3d 20 22 2c 20 22 3b 0a 20 20 20  omma = ", ";.   
dfb0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a     }.    }.    z
dfc0: 43 6f 6c 73 20 3d 20 72 62 75 4d 50 72 69 6e 74  Cols = rbuMPrint
dfd0: 66 28 70 2c 20 22 25 7a 2c 20 69 64 20 49 4e 54  f(p, "%z, id INT
dfe0: 45 47 45 52 22 2c 20 7a 43 6f 6c 73 29 3b 0a 20  EGER", zCols);. 
dff0: 20 20 20 72 62 75 46 69 6e 61 6c 69 7a 65 28 70     rbuFinalize(p
e000: 2c 20 70 58 49 6e 66 6f 29 3b 0a 0a 20 20 20 20  , pXInfo);..    
e010: 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
e020: 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
e030: 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52 2c 20 70  CTRL_IMPOSTER, p
e040: 2d 3e 64 62 4d 61 69 6e 2c 20 22 6d 61 69 6e 22  ->dbMain, "main"
e050: 2c 20 31 2c 20 74 6e 75 6d 29 3b 0a 20 20 20 20  , 1, tnum);.    
e060: 72 62 75 4d 50 72 69 6e 74 66 45 78 65 63 28 70  rbuMPrintfExec(p
e070: 2c 20 70 2d 3e 64 62 4d 61 69 6e 2c 0a 20 20 20  , p->dbMain,.   
e080: 20 20 20 20 20 22 43 52 45 41 54 45 20 54 41 42       "CREATE TAB
e090: 4c 45 20 72 62 75 5f 69 6d 70 6f 73 74 65 72 32  LE rbu_imposter2
e0a0: 28 25 7a 2c 20 50 52 49 4d 41 52 59 20 4b 45 59  (%z, PRIMARY KEY
e0b0: 28 25 7a 29 29 20 57 49 54 48 4f 55 54 20 52 4f  (%z)) WITHOUT RO
e0c0: 57 49 44 22 2c 20 0a 20 20 20 20 20 20 20 20 7a  WID", .        z
e0d0: 43 6f 6c 73 2c 20 7a 50 6b 0a 20 20 20 20 29 3b  Cols, zPk.    );
e0e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73  .    sqlite3_tes
e0f0: 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
e100: 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54  _TESTCTRL_IMPOST
e110: 45 52 2c 20 70 2d 3e 64 62 4d 61 69 6e 2c 20 22  ER, p->dbMain, "
e120: 6d 61 69 6e 22 2c 20 30 2c 20 30 29 3b 0a 20 20  main", 0, 0);.  
e130: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 6e  }.}../*.** If an
e140: 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61   error has alrea
e150: 64 79 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e  dy occurred when
e160: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
e170: 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 0a 2a 2a  s called, it .**
e180: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 74   immediately ret
e190: 75 72 6e 73 20 7a 65 72 6f 20 28 77 69 74 68 6f  urns zero (witho
e1a0: 75 74 20 64 6f 69 6e 67 20 61 6e 79 20 77 6f 72  ut doing any wor
e1b0: 6b 29 2e 20 4f 72 2c 20 69 66 20 61 6e 20 65 72  k). Or, if an er
e1c0: 72 6f 72 0a 2a 2a 20 6f 63 63 75 72 73 20 64 75  ror.** occurs du
e1d0: 72 69 6e 67 20 74 68 65 20 65 78 65 63 75 74 69  ring the executi
e1e0: 6f 6e 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  on of this funct
e1f0: 69 6f 6e 2c 20 69 74 20 73 65 74 73 20 74 68 65  ion, it sets the
e200: 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 69   error code.** i
e210: 6e 20 74 68 65 20 73 71 6c 69 74 65 33 72 62 75  n the sqlite3rbu
e220: 20 6f 62 6a 65 63 74 20 69 6e 64 69 63 61 74 65   object indicate
e230: 64 20 62 79 20 74 68 65 20 66 69 72 73 74 20 61  d by the first a
e240: 72 67 75 6d 65 6e 74 20 61 6e 64 20 72 65 74 75  rgument and retu
e250: 72 6e 73 0a 2a 2a 20 7a 65 72 6f 2e 0a 2a 2a 0a  rns.** zero..**.
e260: 2a 2a 20 54 68 65 20 69 74 65 72 61 74 6f 72 20  ** The iterator 
e270: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
e280: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
e290: 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 70   guaranteed to p
e2a0: 6f 69 6e 74 20 74 6f 0a 2a 2a 20 61 20 74 61 62  oint to.** a tab
e2b0: 6c 65 20 28 6e 6f 74 20 61 6e 20 69 6e 64 65 78  le (not an index
e2c0: 29 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  ) when this func
e2d0: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 20  tion is called. 
e2e0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  This function.**
e2f0: 20 61 74 74 65 6d 70 74 73 20 74 6f 20 63 72 65   attempts to cre
e300: 61 74 65 20 61 6e 79 20 69 6d 70 6f 73 74 65 72  ate any imposter
e310: 20 74 61 62 6c 65 20 72 65 71 75 69 72 65 64 20   table required 
e320: 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  to write to the 
e330: 6d 61 69 6e 0a 2a 2a 20 74 61 62 6c 65 20 62 2d  main.** table b-
e340: 74 72 65 65 20 6f 66 20 74 68 65 20 74 61 62 6c  tree of the tabl
e350: 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  e before returni
e360: 6e 67 2e 20 4e 6f 6e 2d 7a 65 72 6f 20 69 73 20  ng. Non-zero is 
e370: 72 65 74 75 72 6e 65 64 20 69 66 0a 2a 2a 20 61  returned if.** a
e380: 6e 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65  n imposter table
e390: 20 61 72 65 20 63 72 65 61 74 65 64 2c 20 6f 72   are created, or
e3a0: 20 7a 65 72 6f 20 6f 74 68 65 72 77 69 73 65 2e   zero otherwise.
e3b0: 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6d 70 6f 73 74  .**.** An impost
e3c0: 65 72 20 74 61 62 6c 65 20 69 73 20 72 65 71 75  er table is requ
e3d0: 69 72 65 64 20 69 6e 20 61 6c 6c 20 63 61 73 65  ired in all case
e3e0: 73 20 65 78 63 65 70 74 20 52 42 55 5f 50 4b 5f  s except RBU_PK_
e3f0: 56 54 41 42 2e 20 4f 6e 6c 79 0a 2a 2a 20 76 69  VTAB. Only.** vi
e400: 72 74 75 61 6c 20 74 61 62 6c 65 73 20 61 72 65  rtual tables are
e410: 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 72 65   written to dire
e420: 63 74 6c 79 2e 20 54 68 65 20 69 6d 70 6f 73 74  ctly. The impost
e430: 65 72 20 74 61 62 6c 65 20 68 61 73 20 74 68 65  er table has the
e440: 20 0a 2a 2a 20 73 61 6d 65 20 73 63 68 65 6d 61   .** same schema
e450: 20 61 73 20 74 68 65 20 61 63 74 75 61 6c 20 74   as the actual t
e460: 61 72 67 65 74 20 74 61 62 6c 65 20 28 6c 65 73  arget table (les
e470: 73 20 61 6e 79 20 55 4e 49 51 55 45 20 63 6f 6e  s any UNIQUE con
e480: 73 74 72 61 69 6e 74 73 29 2e 20 0a 2a 2a 20 4d  straints). .** M
e490: 6f 72 65 20 70 72 65 63 69 73 65 6c 79 2c 20 74  ore precisely, t
e4a0: 68 65 20 22 73 61 6d 65 20 73 63 68 65 6d 61 22  he "same schema"
e4b0: 20 6d 65 61 6e 73 20 74 68 65 20 73 61 6d 65 20   means the same 
e4c0: 63 6f 6c 75 6d 6e 73 2c 20 74 79 70 65 73 2c 20  columns, types, 
e4d0: 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  .** collation se
e4e0: 71 75 65 6e 63 65 73 2e 20 46 6f 72 20 74 61 62  quences. For tab
e4f0: 6c 65 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20  les that do not 
e500: 68 61 76 65 20 61 6e 20 65 78 74 65 72 6e 61 6c  have an external
e510: 20 50 52 49 4d 41 52 59 0a 2a 2a 20 4b 45 59 2c   PRIMARY.** KEY,
e520: 20 69 74 20 61 6c 73 6f 20 6d 65 61 6e 73 20 74   it also means t
e530: 68 65 20 73 61 6d 65 20 50 52 49 4d 41 52 59 20  he same PRIMARY 
e540: 4b 45 59 20 64 65 63 6c 61 72 61 74 69 6f 6e 2e  KEY declaration.
e550: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
e560: 72 62 75 43 72 65 61 74 65 49 6d 70 6f 73 74 65  rbuCreateImposte
e570: 72 54 61 62 6c 65 28 73 71 6c 69 74 65 33 72 62  rTable(sqlite3rb
e580: 75 20 2a 70 2c 20 52 62 75 4f 62 6a 49 74 65 72  u *p, RbuObjIter
e590: 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20   *pIter){.  if( 
e5a0: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
e5b0: 20 26 26 20 70 49 74 65 72 2d 3e 65 54 79 70 65   && pIter->eType
e5c0: 21 3d 52 42 55 5f 50 4b 5f 56 54 41 42 20 29 7b  !=RBU_PK_VTAB ){
e5d0: 0a 20 20 20 20 69 6e 74 20 74 6e 75 6d 20 3d 20  .    int tnum = 
e5e0: 70 49 74 65 72 2d 3e 69 54 6e 75 6d 3b 0a 20 20  pIter->iTnum;.  
e5f0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
e600: 6f 6d 6d 61 20 3d 20 22 22 3b 0a 20 20 20 20 63  omma = "";.    c
e610: 68 61 72 20 2a 7a 53 71 6c 20 3d 20 30 3b 0a 20  har *zSql = 0;. 
e620: 20 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20     int iCol;.   
e630: 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
e640: 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
e650: 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52 2c 20  TCTRL_IMPOSTER, 
e660: 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 6d 61 69 6e  p->dbMain, "main
e670: 22 2c 20 30 2c 20 31 29 3b 0a 0a 20 20 20 20 66  ", 0, 1);..    f
e680: 6f 72 28 69 43 6f 6c 3d 30 3b 20 70 2d 3e 72 63  or(iCol=0; p->rc
e690: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
e6a0: 43 6f 6c 3c 70 49 74 65 72 2d 3e 6e 54 62 6c 43  Col<pIter->nTblC
e6b0: 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ol; iCol++){.   
e6c0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
e6d0: 50 6b 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 63  Pk = "";.      c
e6e0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 20  onst char *zCol 
e6f0: 3d 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f  = pIter->azTblCo
e700: 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 20 20 63  l[iCol];.      c
e710: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  onst char *zColl
e720: 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 70 2d 3e   = 0;..      p->
e730: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 74 61 62  rc = sqlite3_tab
e740: 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61  le_column_metada
e750: 74 61 28 0a 20 20 20 20 20 20 20 20 20 20 70 2d  ta(.          p-
e760: 3e 64 62 4d 61 69 6e 2c 20 22 6d 61 69 6e 22 2c  >dbMain, "main",
e770: 20 70 49 74 65 72 2d 3e 7a 54 62 6c 2c 20 7a 43   pIter->zTbl, zC
e780: 6f 6c 2c 20 30 2c 20 26 7a 43 6f 6c 6c 2c 20 30  ol, 0, &zColl, 0
e790: 2c 20 30 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a  , 0, 0.      );.
e7a0: 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72  .      if( pIter
e7b0: 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f  ->eType==RBU_PK_
e7c0: 49 50 4b 20 26 26 20 70 49 74 65 72 2d 3e 61 62  IPK && pIter->ab
e7d0: 54 62 6c 50 6b 5b 69 43 6f 6c 5d 20 29 7b 0a 20  TblPk[iCol] ){. 
e7e0: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
e7f0: 20 74 61 72 67 65 74 20 74 61 62 6c 65 20 63 6f   target table co
e800: 6c 75 6d 6e 20 69 73 20 61 6e 20 22 49 4e 54 45  lumn is an "INTE
e810: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 22  GER PRIMARY KEY"
e820: 2c 20 61 64 64 0a 20 20 20 20 20 20 20 20 2a 2a  , add.        **
e830: 20 22 50 52 49 4d 41 52 59 20 4b 45 59 22 20 74   "PRIMARY KEY" t
e840: 6f 20 74 68 65 20 69 6d 70 6f 73 74 65 72 20 74  o the imposter t
e850: 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 64 65 63 6c  able column decl
e860: 61 72 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20  aration. */.    
e870: 20 20 20 20 7a 50 6b 20 3d 20 22 50 52 49 4d 41      zPk = "PRIMA
e880: 52 59 20 4b 45 59 20 22 3b 0a 20 20 20 20 20 20  RY KEY ";.      
e890: 7d 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 72  }.      zSql = r
e8a0: 62 75 4d 50 72 69 6e 74 66 28 70 2c 20 22 25 7a  buMPrintf(p, "%z
e8b0: 25 73 5c 22 25 77 5c 22 20 25 73 20 25 73 43 4f  %s\"%w\" %s %sCO
e8c0: 4c 4c 41 54 45 20 25 73 25 73 22 2c 20 0a 20 20  LLATE %s%s", .  
e8d0: 20 20 20 20 20 20 20 20 7a 53 71 6c 2c 20 7a 43          zSql, zC
e8e0: 6f 6d 6d 61 2c 20 7a 43 6f 6c 2c 20 70 49 74 65  omma, zCol, pIte
e8f0: 72 2d 3e 61 7a 54 62 6c 54 79 70 65 5b 69 43 6f  r->azTblType[iCo
e900: 6c 5d 2c 20 7a 50 6b 2c 20 7a 43 6f 6c 6c 2c 0a  l], zPk, zColl,.
e910: 20 20 20 20 20 20 20 20 20 20 28 70 49 74 65 72            (pIter
e920: 2d 3e 61 62 4e 6f 74 4e 75 6c 6c 5b 69 43 6f 6c  ->abNotNull[iCol
e930: 5d 20 3f 20 22 20 4e 4f 54 20 4e 55 4c 4c 22 20  ] ? " NOT NULL" 
e940: 3a 20 22 22 29 0a 20 20 20 20 20 20 29 3b 0a 20  : "").      );. 
e950: 20 20 20 20 20 7a 43 6f 6d 6d 61 20 3d 20 22 2c       zComma = ",
e960: 20 22 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69   ";.    }..    i
e970: 66 28 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d  f( pIter->eType=
e980: 3d 52 42 55 5f 50 4b 5f 57 49 54 48 4f 55 54 5f  =RBU_PK_WITHOUT_
e990: 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 20 20 63  ROWID ){.      c
e9a0: 68 61 72 20 2a 7a 50 6b 20 3d 20 72 62 75 57 69  har *zPk = rbuWi
e9b0: 74 68 6f 75 74 52 6f 77 69 64 50 4b 28 70 2c 20  thoutRowidPK(p, 
e9c0: 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 69 66  pIter);.      if
e9d0: 28 20 7a 50 6b 20 29 7b 0a 20 20 20 20 20 20 20  ( zPk ){.       
e9e0: 20 7a 53 71 6c 20 3d 20 72 62 75 4d 50 72 69 6e   zSql = rbuMPrin
e9f0: 74 66 28 70 2c 20 22 25 7a 2c 20 25 7a 22 2c 20  tf(p, "%z, %z", 
ea00: 7a 53 71 6c 2c 20 7a 50 6b 29 3b 0a 20 20 20 20  zSql, zPk);.    
ea10: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73    }.    }..    s
ea20: 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
ea30: 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
ea40: 54 52 4c 5f 49 4d 50 4f 53 54 45 52 2c 20 70 2d  TRL_IMPOSTER, p-
ea50: 3e 64 62 4d 61 69 6e 2c 20 22 6d 61 69 6e 22 2c  >dbMain, "main",
ea60: 20 31 2c 20 74 6e 75 6d 29 3b 0a 20 20 20 20 72   1, tnum);.    r
ea70: 62 75 4d 50 72 69 6e 74 66 45 78 65 63 28 70 2c  buMPrintfExec(p,
ea80: 20 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 43 52 45   p->dbMain, "CRE
ea90: 41 54 45 20 54 41 42 4c 45 20 5c 22 72 62 75 5f  ATE TABLE \"rbu_
eaa0: 69 6d 70 5f 25 77 5c 22 28 25 7a 29 25 73 22 2c  imp_%w\"(%z)%s",
eab0: 20 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d   .        pIter-
eac0: 3e 7a 54 62 6c 2c 20 7a 53 71 6c 2c 20 0a 20 20  >zTbl, zSql, .  
ead0: 20 20 20 20 20 20 28 70 49 74 65 72 2d 3e 65 54        (pIter->eT
eae0: 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 57 49 54 48  ype==RBU_PK_WITH
eaf0: 4f 55 54 5f 52 4f 57 49 44 20 3f 20 22 20 57 49  OUT_ROWID ? " WI
eb00: 54 48 4f 55 54 20 52 4f 57 49 44 22 20 3a 20 22  THOUT ROWID" : "
eb10: 22 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71  ").    );.    sq
eb20: 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
eb30: 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
eb40: 52 4c 5f 49 4d 50 4f 53 54 45 52 2c 20 70 2d 3e  RL_IMPOSTER, p->
eb50: 64 62 4d 61 69 6e 2c 20 22 6d 61 69 6e 22 2c 20  dbMain, "main", 
eb60: 30 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  0, 0);.  }.}../*
eb70: 0a 2a 2a 20 50 72 65 70 61 72 65 20 61 20 73 74  .** Prepare a st
eb80: 61 74 65 6d 65 6e 74 20 75 73 65 64 20 74 6f 20  atement used to 
eb90: 69 6e 73 65 72 74 20 72 6f 77 73 20 69 6e 74 6f  insert rows into
eba0: 20 74 68 65 20 22 72 62 75 5f 74 6d 70 5f 78 78   the "rbu_tmp_xx
ebb0: 78 22 20 74 61 62 6c 65 2e 0a 2a 2a 20 53 70 65  x" table..** Spe
ebc0: 63 69 66 69 63 61 6c 6c 79 20 61 20 73 74 61 74  cifically a stat
ebd0: 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 66 6f 72  ement of the for
ebe0: 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 49 4e 53  m:.**.**     INS
ebf0: 45 52 54 20 49 4e 54 4f 20 72 62 75 5f 74 6d 70  ERT INTO rbu_tmp
ec00: 5f 78 78 78 20 56 41 4c 55 45 53 28 3f 2c 20 3f  _xxx VALUES(?, ?
ec10: 2c 20 3f 20 2e 2e 2e 29 3b 0a 2a 2a 0a 2a 2a 20  , ? ...);.**.** 
ec20: 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 6f  The number of bo
ec30: 75 6e 64 20 76 61 72 69 61 62 6c 65 73 20 69 73  und variables is
ec40: 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6e 75   equal to the nu
ec50: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
ec60: 69 6e 0a 2a 2a 20 74 68 65 20 74 61 72 67 65 74  in.** the target
ec70: 20 74 61 62 6c 65 2c 20 70 6c 75 73 20 6f 6e 65   table, plus one
ec80: 20 28 66 6f 72 20 74 68 65 20 72 62 75 5f 63 6f   (for the rbu_co
ec90: 6e 74 72 6f 6c 20 63 6f 6c 75 6d 6e 29 2c 20 70  ntrol column), p
eca0: 6c 75 73 20 6f 6e 65 20 6d 6f 72 65 20 0a 2a 2a  lus one more .**
ecb0: 20 28 66 6f 72 20 74 68 65 20 72 62 75 5f 72 6f   (for the rbu_ro
ecc0: 77 69 64 20 63 6f 6c 75 6d 6e 29 20 69 66 20 74  wid column) if t
ecd0: 68 65 20 74 61 72 67 65 74 20 74 61 62 6c 65 20  he target table 
ece0: 69 73 20 61 6e 20 69 6d 70 6c 69 63 69 74 20 49  is an implicit I
ecf0: 50 4b 20 6f 72 20 0a 2a 2a 20 76 69 72 74 75 61  PK or .** virtua
ed00: 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  l table..*/.stat
ed10: 69 63 20 76 6f 69 64 20 72 62 75 4f 62 6a 49 74  ic void rbuObjIt
ed20: 65 72 50 72 65 70 61 72 65 54 6d 70 49 6e 73 65  erPrepareTmpInse
ed30: 72 74 28 0a 20 20 73 71 6c 69 74 65 33 72 62 75  rt(.  sqlite3rbu
ed40: 20 2a 70 2c 20 0a 20 20 52 62 75 4f 62 6a 49 74   *p, .  RbuObjIt
ed50: 65 72 20 2a 70 49 74 65 72 2c 0a 20 20 63 6f 6e  er *pIter,.  con
ed60: 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 69 73  st char *zCollis
ed70: 74 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  t,.  const char 
ed80: 2a 7a 52 62 75 52 6f 77 69 64 0a 29 7b 0a 20 20  *zRbuRowid.){.  
ed90: 69 6e 74 20 62 52 62 75 52 6f 77 69 64 20 3d 20  int bRbuRowid = 
eda0: 28 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52  (pIter->eType==R
edb0: 42 55 5f 50 4b 5f 45 58 54 45 52 4e 41 4c 20 7c  BU_PK_EXTERNAL |
edc0: 7c 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d  | pIter->eType==
edd0: 52 42 55 5f 50 4b 5f 4e 4f 4e 45 29 3b 0a 20 20  RBU_PK_NONE);.  
ede0: 63 68 61 72 20 2a 7a 42 69 6e 64 20 3d 20 72 62  char *zBind = rb
edf0: 75 4f 62 6a 49 74 65 72 47 65 74 42 69 6e 64 6c  uObjIterGetBindl
ee00: 69 73 74 28 70 2c 20 70 49 74 65 72 2d 3e 6e 54  ist(p, pIter->nT
ee10: 62 6c 43 6f 6c 20 2b 20 31 20 2b 20 62 52 62 75  blCol + 1 + bRbu
ee20: 52 6f 77 69 64 29 3b 0a 20 20 69 66 28 20 7a 42  Rowid);.  if( zB
ee30: 69 6e 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ind ){.    asser
ee40: 74 28 20 70 49 74 65 72 2d 3e 70 54 6d 70 49 6e  t( pIter->pTmpIn
ee50: 73 65 72 74 3d 3d 30 20 29 3b 0a 20 20 20 20 70  sert==0 );.    p
ee60: 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65 46 72  ->rc = prepareFr
ee70: 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f  eeAndCollectErro
ee80: 72 28 0a 20 20 20 20 20 20 20 20 70 2d 3e 64 62  r(.        p->db
ee90: 52 62 75 2c 20 26 70 49 74 65 72 2d 3e 70 54 6d  Rbu, &pIter->pTm
eea0: 70 49 6e 73 65 72 74 2c 20 26 70 2d 3e 7a 45 72  pInsert, &p->zEr
eeb0: 72 6d 73 67 2c 20 73 71 6c 69 74 65 33 5f 6d 70  rmsg, sqlite3_mp
eec0: 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20  rintf(.         
eed0: 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 25 73   "INSERT INTO %s
eee0: 2e 27 72 62 75 5f 74 6d 70 5f 25 71 27 28 72 62  .'rbu_tmp_%q'(rb
eef0: 75 5f 63 6f 6e 74 72 6f 6c 2c 25 73 25 73 29 20  u_control,%s%s) 
ef00: 56 41 4c 55 45 53 28 25 7a 29 22 2c 20 0a 20 20  VALUES(%z)", .  
ef10: 20 20 20 20 20 20 20 20 70 2d 3e 7a 53 74 61 74          p->zStat
ef20: 65 44 62 2c 20 70 49 74 65 72 2d 3e 7a 44 61 74  eDb, pIter->zDat
ef30: 61 54 62 6c 2c 20 7a 43 6f 6c 6c 69 73 74 2c 20  aTbl, zCollist, 
ef40: 7a 52 62 75 52 6f 77 69 64 2c 20 7a 42 69 6e 64  zRbuRowid, zBind
ef50: 0a 20 20 20 20 29 29 3b 0a 20 20 7d 0a 7d 0a 0a  .    ));.  }.}..
ef60: 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75 54  static void rbuT
ef70: 6d 70 49 6e 73 65 72 74 46 75 6e 63 28 0a 20 20  mpInsertFunc(.  
ef80: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
ef90: 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 56  *pCtx, .  int nV
efa0: 61 6c 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  al,.  sqlite3_va
efb0: 6c 75 65 20 2a 2a 61 70 56 61 6c 0a 29 7b 0a 20  lue **apVal.){. 
efc0: 20 73 71 6c 69 74 65 33 72 62 75 20 2a 70 20 3d   sqlite3rbu *p =
efd0: 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61   sqlite3_user_da
efe0: 74 61 28 70 43 74 78 29 3b 0a 20 20 69 6e 74 20  ta(pCtx);.  int 
eff0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
f000: 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61 73 73 65    int i;..  asse
f010: 72 74 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  rt( sqlite3_valu
f020: 65 5f 69 6e 74 28 61 70 56 61 6c 5b 30 5d 29 21  e_int(apVal[0])!
f030: 3d 30 0a 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6f  =0.      || p->o
f040: 62 6a 69 74 65 72 2e 65 54 79 70 65 3d 3d 52 42  bjiter.eType==RB
f050: 55 5f 50 4b 5f 45 58 54 45 52 4e 41 4c 20 0a 20  U_PK_EXTERNAL . 
f060: 20 20 20 20 20 7c 7c 20 70 2d 3e 6f 62 6a 69 74       || p->objit
f070: 65 72 2e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b  er.eType==RBU_PK
f080: 5f 4e 4f 4e 45 20 0a 20 20 29 3b 0a 20 20 69 66  _NONE .  );.  if
f090: 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ( sqlite3_value_
f0a0: 69 6e 74 28 61 70 56 61 6c 5b 30 5d 29 21 3d 30  int(apVal[0])!=0
f0b0: 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 50 68 61 73   ){.    p->nPhas
f0c0: 65 4f 6e 65 53 74 65 70 20 2b 3d 20 70 2d 3e 6f  eOneStep += p->o
f0d0: 62 6a 69 74 65 72 2e 6e 49 6e 64 65 78 3b 0a 20  bjiter.nIndex;. 
f0e0: 20 7d 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72   }..  for(i=0; r
f0f0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
f100: 69 3c 6e 56 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nVal; i++){.  
f110: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
f120: 69 6e 64 5f 76 61 6c 75 65 28 70 2d 3e 6f 62 6a  ind_value(p->obj
f130: 69 74 65 72 2e 70 54 6d 70 49 6e 73 65 72 74 2c  iter.pTmpInsert,
f140: 20 69 2b 31 2c 20 61 70 56 61 6c 5b 69 5d 29 3b   i+1, apVal[i]);
f150: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
f160: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
f170: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 2d 3e  sqlite3_step(p->
f180: 6f 62 6a 69 74 65 72 2e 70 54 6d 70 49 6e 73 65  objiter.pTmpInse
f190: 72 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  rt);.    rc = sq
f1a0: 6c 69 74 65 33 5f 72 65 73 65 74 28 70 2d 3e 6f  lite3_reset(p->o
f1b0: 62 6a 69 74 65 72 2e 70 54 6d 70 49 6e 73 65 72  bjiter.pTmpInser
f1c0: 74 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72  t);.  }..  if( r
f1d0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
f1e0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
f1f0: 6c 74 5f 65 72 72 6f 72 5f 63 6f 64 65 28 70 43  lt_error_code(pC
f200: 74 78 2c 20 72 63 29 3b 0a 20 20 7d 0a 7d 0a 0a  tx, rc);.  }.}..
f210: 2f 2a 0a 2a 2a 20 45 6e 73 75 72 65 20 74 68 61  /*.** Ensure tha
f220: 74 20 74 68 65 20 53 51 4c 69 74 65 20 73 74 61  t the SQLite sta
f230: 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65 73 20 72  tement handles r
f240: 65 71 75 69 72 65 64 20 74 6f 20 75 70 64 61 74  equired to updat
f250: 65 20 74 68 65 20 0a 2a 2a 20 74 61 72 67 65 74  e the .** target
f260: 20 64 61 74 61 62 61 73 65 20 6f 62 6a 65 63 74   database object
f270: 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 64 69 63   currently indic
f280: 61 74 65 64 20 62 79 20 74 68 65 20 69 74 65 72  ated by the iter
f290: 61 74 6f 72 20 70 61 73 73 65 64 20 0a 2a 2a 20  ator passed .** 
f2a0: 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
f2b0: 67 75 6d 65 6e 74 20 61 72 65 20 61 76 61 69 6c  gument are avail
f2c0: 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
f2d0: 69 6e 74 20 72 62 75 4f 62 6a 49 74 65 72 50 72  int rbuObjIterPr
f2e0: 65 70 61 72 65 41 6c 6c 28 0a 20 20 73 71 6c 69  epareAll(.  sqli
f2f0: 74 65 33 72 62 75 20 2a 70 2c 20 0a 20 20 52 62  te3rbu *p, .  Rb
f300: 75 4f 62 6a 49 74 65 72 20 2a 70 49 74 65 72 2c  uObjIter *pIter,
f310: 0a 20 20 69 6e 74 20 6e 4f 66 66 73 65 74 20 20  .  int nOffset  
f320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f330: 20 20 20 2f 2a 20 41 64 64 20 22 4c 49 4d 49 54     /* Add "LIMIT
f340: 20 2d 31 20 4f 46 46 53 45 54 20 24 6e 4f 66 66   -1 OFFSET $nOff
f350: 73 65 74 22 20 74 6f 20 53 45 4c 45 43 54 20 2a  set" to SELECT *
f360: 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  /.){.  assert( p
f370: 49 74 65 72 2d 3e 62 43 6c 65 61 6e 75 70 3d 3d  Iter->bCleanup==
f380: 30 20 29 3b 0a 20 20 69 66 28 20 70 49 74 65 72  0 );.  if( pIter
f390: 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 26 26 20  ->pSelect==0 && 
f3a0: 72 62 75 4f 62 6a 49 74 65 72 43 61 63 68 65 54  rbuObjIterCacheT
f3b0: 61 62 6c 65 49 6e 66 6f 28 70 2c 20 70 49 74 65  ableInfo(p, pIte
f3c0: 72 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  r)==SQLITE_OK ){
f3d0: 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 74  .    const int t
f3e0: 6e 75 6d 20 3d 20 70 49 74 65 72 2d 3e 69 54 6e  num = pIter->iTn
f3f0: 75 6d 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43  um;.    char *zC
f400: 6f 6c 6c 69 73 74 20 3d 20 30 3b 20 20 20 20 20  ollist = 0;     
f410: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
f420: 20 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 73   indexed columns
f430: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 2a 70   */.    char **p
f440: 7a 20 3d 20 26 70 2d 3e 7a 45 72 72 6d 73 67 3b  z = &p->zErrmsg;
f450: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
f460: 2a 7a 49 64 78 20 3d 20 70 49 74 65 72 2d 3e 7a  *zIdx = pIter->z
f470: 49 64 78 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  Idx;.    char *z
f480: 4c 69 6d 69 74 20 3d 20 30 3b 0a 0a 20 20 20 20  Limit = 0;..    
f490: 69 66 28 20 6e 4f 66 66 73 65 74 20 29 7b 0a 20  if( nOffset ){. 
f4a0: 20 20 20 20 20 7a 4c 69 6d 69 74 20 3d 20 73 71       zLimit = sq
f4b0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 20  lite3_mprintf(" 
f4c0: 4c 49 4d 49 54 20 2d 31 20 4f 46 46 53 45 54 20  LIMIT -1 OFFSET 
f4d0: 25 64 22 2c 20 6e 4f 66 66 73 65 74 29 3b 0a 20  %d", nOffset);. 
f4e0: 20 20 20 20 20 69 66 28 20 21 7a 4c 69 6d 69 74       if( !zLimit
f4f0: 20 29 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54   ) p->rc = SQLIT
f500: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 0a  E_NOMEM;.    }..
f510: 20 20 20 20 69 66 28 20 7a 49 64 78 20 29 7b 0a      if( zIdx ){.
f520: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
f530: 20 2a 7a 54 62 6c 20 3d 20 70 49 74 65 72 2d 3e   *zTbl = pIter->
f540: 7a 54 62 6c 3b 0a 20 20 20 20 20 20 63 68 61 72  zTbl;.      char
f550: 20 2a 7a 49 6d 70 6f 73 74 65 72 43 6f 6c 73 20   *zImposterCols 
f560: 3d 20 30 3b 20 20 20 20 2f 2a 20 43 6f 6c 75 6d  = 0;    /* Colum
f570: 6e 73 20 66 6f 72 20 69 6d 70 6f 73 74 65 72 20  ns for imposter 
f580: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 63  table */.      c
f590: 68 61 72 20 2a 7a 49 6d 70 6f 73 74 65 72 50 4b  har *zImposterPK
f5a0: 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 50 72   = 0;      /* Pr
f5b0: 69 6d 61 72 79 20 6b 65 79 20 64 65 63 6c 61 72  imary key declar
f5c0: 61 74 69 6f 6e 20 66 6f 72 20 69 6d 70 6f 73 74  ation for impost
f5d0: 65 72 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72  er */.      char
f5e0: 20 2a 7a 57 68 65 72 65 20 3d 20 30 3b 20 20 20   *zWhere = 0;   
f5f0: 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45          /* WHERE
f600: 20 63 6c 61 75 73 65 20 6f 6e 20 50 4b 20 63 6f   clause on PK co
f610: 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 20 20 63  lumns */.      c
f620: 68 61 72 20 2a 7a 42 69 6e 64 20 3d 20 30 3b 0a  har *zBind = 0;.
f630: 20 20 20 20 20 20 69 6e 74 20 6e 42 69 6e 64 20        int nBind 
f640: 3d 20 30 3b 0a 0a 20 20 20 20 20 20 61 73 73 65  = 0;..      asse
f650: 72 74 28 20 70 49 74 65 72 2d 3e 65 54 79 70 65  rt( pIter->eType
f660: 21 3d 52 42 55 5f 50 4b 5f 56 54 41 42 20 29 3b  !=RBU_PK_VTAB );
f670: 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 69 73 74 20  .      zCollist 
f680: 3d 20 72 62 75 4f 62 6a 49 74 65 72 47 65 74 49  = rbuObjIterGetI
f690: 6e 64 65 78 43 6f 6c 73 28 0a 20 20 20 20 20 20  ndexCols(.      
f6a0: 20 20 20 20 70 2c 20 70 49 74 65 72 2c 20 26 7a      p, pIter, &z
f6b0: 49 6d 70 6f 73 74 65 72 43 6f 6c 73 2c 20 26 7a  ImposterCols, &z
f6c0: 49 6d 70 6f 73 74 65 72 50 4b 2c 20 26 7a 57 68  ImposterPK, &zWh
f6d0: 65 72 65 2c 20 26 6e 42 69 6e 64 0a 20 20 20 20  ere, &nBind.    
f6e0: 20 20 29 3b 0a 20 20 20 20 20 20 7a 42 69 6e 64    );.      zBind
f6f0: 20 3d 20 72 62 75 4f 62 6a 49 74 65 72 47 65 74   = rbuObjIterGet
f700: 42 69 6e 64 6c 69 73 74 28 70 2c 20 6e 42 69 6e  Bindlist(p, nBin
f710: 64 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 72  d);..      /* Cr
f720: 65 61 74 65 20 74 68 65 20 69 6d 70 6f 73 74 65  eate the imposte
f730: 72 20 74 61 62 6c 65 20 75 73 65 64 20 74 6f 20  r table used to 
f740: 77 72 69 74 65 20 74 6f 20 74 68 69 73 20 69 6e  write to this in
f750: 64 65 78 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71  dex. */.      sq
f760: 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
f770: 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
f780: 52 4c 5f 49 4d 50 4f 53 54 45 52 2c 20 70 2d 3e  RL_IMPOSTER, p->
f790: 64 62 4d 61 69 6e 2c 20 22 6d 61 69 6e 22 2c 20  dbMain, "main", 
f7a0: 30 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 1);.      sql
f7b0: 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
f7c0: 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
f7d0: 4c 5f 49 4d 50 4f 53 54 45 52 2c 20 70 2d 3e 64  L_IMPOSTER, p->d
f7e0: 62 4d 61 69 6e 2c 20 22 6d 61 69 6e 22 2c 20 31  bMain, "main", 1
f7f0: 2c 74 6e 75 6d 29 3b 0a 20 20 20 20 20 20 72 62  ,tnum);.      rb
f800: 75 4d 50 72 69 6e 74 66 45 78 65 63 28 70 2c 20  uMPrintfExec(p, 
f810: 70 2d 3e 64 62 4d 61 69 6e 2c 0a 20 20 20 20 20  p->dbMain,.     
f820: 20 20 20 20 20 22 43 52 45 41 54 45 20 54 41 42       "CREATE TAB
f830: 4c 45 20 5c 22 72 62 75 5f 69 6d 70 5f 25 77 5c  LE \"rbu_imp_%w\
f840: 22 28 20 25 73 2c 20 50 52 49 4d 41 52 59 20 4b  "( %s, PRIMARY K
f850: 45 59 28 20 25 73 20 29 20 29 20 57 49 54 48 4f  EY( %s ) ) WITHO
f860: 55 54 20 52 4f 57 49 44 22 2c 0a 20 20 20 20 20  UT ROWID",.     
f870: 20 20 20 20 20 7a 54 62 6c 2c 20 7a 49 6d 70 6f       zTbl, zImpo
f880: 73 74 65 72 43 6f 6c 73 2c 20 7a 49 6d 70 6f 73  sterCols, zImpos
f890: 74 65 72 50 4b 0a 20 20 20 20 20 20 29 3b 0a 20  terPK.      );. 
f8a0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73       sqlite3_tes
f8b0: 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
f8c0: 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54  _TESTCTRL_IMPOST
f8d0: 45 52 2c 20 70 2d 3e 64 62 4d 61 69 6e 2c 20 22  ER, p->dbMain, "
f8e0: 6d 61 69 6e 22 2c 20 30 2c 20 30 29 3b 0a 0a 20  main", 0, 0);.. 
f8f0: 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74       /* Create t
f900: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20  he statement to 
f910: 69 6e 73 65 72 74 20 69 6e 64 65 78 20 65 6e 74  insert index ent
f920: 72 69 65 73 20 2a 2f 0a 20 20 20 20 20 20 70 49  ries */.      pI
f930: 74 65 72 2d 3e 6e 43 6f 6c 20 3d 20 6e 42 69 6e  ter->nCol = nBin
f940: 64 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  d;.      if( p->
f950: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
f960: 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  .        p->rc =
f970: 20 70 72 65 70 61 72 65 46 72 65 65 41 6e 64 43   prepareFreeAndC
f980: 6f 6c 6c 65 63 74 45 72 72 6f 72 28 0a 20 20 20  ollectError(.   
f990: 20 20 20 20 20 20 20 20 20 70 2d 3e 64 62 4d 61           p->dbMa
f9a0: 69 6e 2c 20 26 70 49 74 65 72 2d 3e 70 49 6e 73  in, &pIter->pIns
f9b0: 65 72 74 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67  ert, &p->zErrmsg
f9c0: 2c 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ,.          sqli
f9d0: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 49 4e 53  te3_mprintf("INS
f9e0: 45 52 54 20 49 4e 54 4f 20 5c 22 72 62 75 5f 69  ERT INTO \"rbu_i
f9f0: 6d 70 5f 25 77 5c 22 20 56 41 4c 55 45 53 28 25  mp_%w\" VALUES(%
fa00: 73 29 22 2c 20 7a 54 62 6c 2c 20 7a 42 69 6e 64  s)", zTbl, zBind
fa10: 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  ).        );.   
fa20: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 41     }..      /* A
fa30: 6e 64 20 74 6f 20 64 65 6c 65 74 65 20 69 6e 64  nd to delete ind
fa40: 65 78 20 65 6e 74 72 69 65 73 20 2a 2f 0a 20 20  ex entries */.  
fa50: 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
fa60: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
fa70: 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70      p->rc = prep
fa80: 61 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63  areFreeAndCollec
fa90: 74 45 72 72 6f 72 28 0a 20 20 20 20 20 20 20 20  tError(.        
faa0: 20 20 20 20 70 2d 3e 64 62 4d 61 69 6e 2c 20 26      p->dbMain, &
fab0: 70 49 74 65 72 2d 3e 70 44 65 6c 65 74 65 2c 20  pIter->pDelete, 
fac0: 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 0a 20 20 20  &p->zErrmsg,.   
fad0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d         sqlite3_m
fae0: 70 72 69 6e 74 66 28 22 44 45 4c 45 54 45 20 46  printf("DELETE F
faf0: 52 4f 4d 20 5c 22 72 62 75 5f 69 6d 70 5f 25 77  ROM \"rbu_imp_%w
fb00: 5c 22 20 57 48 45 52 45 20 25 73 22 2c 20 7a 54  \" WHERE %s", zT
fb10: 62 6c 2c 20 7a 57 68 65 72 65 29 0a 20 20 20 20  bl, zWhere).    
fb20: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a      );.      }..
fb30: 20 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20        /* Create 
fb40: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
fb50: 6d 65 6e 74 20 74 6f 20 72 65 61 64 20 6b 65 79  ment to read key
fb60: 73 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65  s in sorted orde
fb70: 72 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  r */.      if( p
fb80: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
fb90: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
fba0: 2a 7a 53 71 6c 3b 0a 20 20 20 20 20 20 20 20 69  *zSql;.        i
fbb0: 66 28 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d  f( pIter->eType=
fbc0: 3d 52 42 55 5f 50 4b 5f 45 58 54 45 52 4e 41 4c  =RBU_PK_EXTERNAL
fbd0: 20 7c 7c 20 70 49 74 65 72 2d 3e 65 54 79 70 65   || pIter->eType
fbe0: 3d 3d 52 42 55 5f 50 4b 5f 4e 4f 4e 45 20 29 7b  ==RBU_PK_NONE ){
fbf0: 0a 20 20 20 20 20 20 20 20 20 20 7a 53 71 6c 20  .          zSql 
fc00: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
fc10: 66 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  f(.             
fc20: 20 22 53 45 4c 45 43 54 20 25 73 2c 20 72 62 75   "SELECT %s, rbu
fc30: 5f 63 6f 6e 74 72 6f 6c 20 46 52 4f 4d 20 25 73  _control FROM %s
fc40: 2e 27 72 62 75 5f 74 6d 70 5f 25 71 27 20 4f 52  .'rbu_tmp_%q' OR
fc50: 44 45 52 20 42 59 20 25 73 25 73 22 2c 0a 20 20  DER BY %s%s",.  
fc60: 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c              zCol
fc70: 6c 69 73 74 2c 20 70 2d 3e 7a 53 74 61 74 65 44  list, p->zStateD
fc80: 62 2c 20 70 49 74 65 72 2d 3e 7a 44 61 74 61 54  b, pIter->zDataT
fc90: 62 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  bl,.            
fca0: 20 20 7a 43 6f 6c 6c 69 73 74 2c 20 7a 4c 69 6d    zCollist, zLim
fcb0: 69 74 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a  it.          );.
fcc0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
fcd0: 20 20 20 20 20 20 20 20 20 7a 53 71 6c 20 3d 20           zSql = 
fce0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
fcf0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
fd00: 53 45 4c 45 43 54 20 25 73 2c 20 72 62 75 5f 63  SELECT %s, rbu_c
fd10: 6f 6e 74 72 6f 6c 20 46 52 4f 4d 20 25 73 2e 27  ontrol FROM %s.'
fd20: 72 62 75 5f 74 6d 70 5f 25 71 27 20 22 0a 20 20  rbu_tmp_%q' ".  
fd30: 20 20 20 20 20 20 20 20 20 20 20 20 22 55 4e 49              "UNI
fd40: 4f 4e 20 41 4c 4c 20 22 0a 20 20 20 20 20 20 20  ON ALL ".       
fd50: 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 25         "SELECT %
fd60: 73 2c 20 72 62 75 5f 63 6f 6e 74 72 6f 6c 20 46  s, rbu_control F
fd70: 52 4f 4d 20 27 25 71 27 20 22 0a 20 20 20 20 20  ROM '%q' ".     
fd80: 20 20 20 20 20 20 20 20 20 22 57 48 45 52 45 20           "WHERE 
fd90: 74 79 70 65 6f 66 28 72 62 75 5f 63 6f 6e 74 72  typeof(rbu_contr
fda0: 6f 6c 29 3d 27 69 6e 74 65 67 65 72 27 20 41 4e  ol)='integer' AN
fdb0: 44 20 72 62 75 5f 63 6f 6e 74 72 6f 6c 21 3d 31  D rbu_control!=1
fdc0: 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ".             
fdd0: 20 22 4f 52 44 45 52 20 42 59 20 25 73 25 73 22   "ORDER BY %s%s"
fde0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
fdf0: 7a 43 6f 6c 6c 69 73 74 2c 20 70 2d 3e 7a 53 74  zCollist, p->zSt
fe00: 61 74 65 44 62 2c 20 70 49 74 65 72 2d 3e 7a 44  ateDb, pIter->zD
fe10: 61 74 61 54 62 6c 2c 20 0a 20 20 20 20 20 20 20  ataTbl, .       
fe20: 20 20 20 20 20 20 20 7a 43 6f 6c 6c 69 73 74 2c         zCollist,
fe30: 20 70 49 74 65 72 2d 3e 7a 44 61 74 61 54 62 6c   pIter->zDataTbl
fe40: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
fe50: 20 7a 43 6f 6c 6c 69 73 74 2c 20 7a 4c 69 6d 69   zCollist, zLimi
fe60: 74 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20  t.          );. 
fe70: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
fe80: 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65   p->rc = prepare
fe90: 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72  FreeAndCollectEr
fea0: 72 6f 72 28 70 2d 3e 64 62 52 62 75 2c 20 26 70  ror(p->dbRbu, &p
feb0: 49 74 65 72 2d 3e 70 53 65 6c 65 63 74 2c 20 70  Iter->pSelect, p
fec0: 7a 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20  z, zSql);.      
fed0: 7d 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  }..      sqlite3
fee0: 5f 66 72 65 65 28 7a 49 6d 70 6f 73 74 65 72 43  _free(zImposterC
fef0: 6f 6c 73 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ols);.      sqli
ff00: 74 65 33 5f 66 72 65 65 28 7a 49 6d 70 6f 73 74  te3_free(zImpost
ff10: 65 72 50 4b 29 3b 0a 20 20 20 20 20 20 73 71 6c  erPK);.      sql
ff20: 69 74 65 33 5f 66 72 65 65 28 7a 57 68 65 72 65  ite3_free(zWhere
ff30: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
ff40: 5f 66 72 65 65 28 7a 42 69 6e 64 29 3b 0a 20 20  _free(zBind);.  
ff50: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
ff60: 6e 74 20 62 52 62 75 52 6f 77 69 64 20 3d 20 28  nt bRbuRowid = (
ff70: 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42  pIter->eType==RB
ff80: 55 5f 50 4b 5f 56 54 41 42 20 7c 7c 20 70 49 74  U_PK_VTAB || pIt
ff90: 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50  er->eType==RBU_P
ffa0: 4b 5f 4e 4f 4e 45 29 3b 0a 20 20 20 20 20 20 63  K_NONE);.      c
ffb0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 62 6c 20  onst char *zTbl 
ffc0: 3d 20 70 49 74 65 72 2d 3e 7a 54 62 6c 3b 20 20  = pIter->zTbl;  
ffd0: 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 68       /* Table th
ffe0: 69 73 20 73 74 65 70 20 61 70 70 6c 69 65 73 20  is step applies 
fff0: 74 6f 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73  to */.      cons
10000 74 20 63 68 61 72 20 2a 7a 57 72 69 74 65 3b 20  t char *zWrite; 
10010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10020 20 20 2f 2a 20 49 6d 70 6f 73 74 65 72 20 74 61    /* Imposter ta
10030 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 0a 20 20 20  ble name */..   
10040 20 20 20 63 68 61 72 20 2a 7a 42 69 6e 64 69 6e     char *zBindin
10050 67 73 20 3d 20 72 62 75 4f 62 6a 49 74 65 72 47  gs = rbuObjIterG
10060 65 74 42 69 6e 64 6c 69 73 74 28 70 2c 20 70 49  etBindlist(p, pI
10070 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 20 2b 20 62  ter->nTblCol + b
10080 52 62 75 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  RbuRowid);.     
10090 20 63 68 61 72 20 2a 7a 57 68 65 72 65 20 3d 20   char *zWhere = 
100a0 72 62 75 4f 62 6a 49 74 65 72 47 65 74 57 68 65  rbuObjIterGetWhe
100b0 72 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  re(p, pIter);.  
100c0 20 20 20 20 63 68 61 72 20 2a 7a 4f 6c 64 6c 69      char *zOldli
100d0 73 74 20 3d 20 72 62 75 4f 62 6a 49 74 65 72 47  st = rbuObjIterG
100e0 65 74 4f 6c 64 6c 69 73 74 28 70 2c 20 70 49 74  etOldlist(p, pIt
100f0 65 72 2c 20 22 6f 6c 64 22 29 3b 0a 20 20 20 20  er, "old");.    
10100 20 20 63 68 61 72 20 2a 7a 4e 65 77 6c 69 73 74    char *zNewlist
10110 20 3d 20 72 62 75 4f 62 6a 49 74 65 72 47 65 74   = rbuObjIterGet
10120 4f 6c 64 6c 69 73 74 28 70 2c 20 70 49 74 65 72  Oldlist(p, pIter
10130 2c 20 22 6e 65 77 22 29 3b 0a 0a 20 20 20 20 20  , "new");..     
10140 20 7a 43 6f 6c 6c 69 73 74 20 3d 20 72 62 75 4f   zCollist = rbuO
10150 62 6a 49 74 65 72 47 65 74 43 6f 6c 6c 69 73 74  bjIterGetCollist
10160 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  (p, pIter);.    
10170 20 20 70 49 74 65 72 2d 3e 6e 43 6f 6c 20 3d 20    pIter->nCol = 
10180 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 3b 0a  pIter->nTblCol;.
10190 0a 20 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65  .      /* Create
101a0 20 74 68 65 20 69 6d 70 6f 73 74 65 72 20 74 61   the imposter ta
101b0 62 6c 65 20 6f 72 20 74 61 62 6c 65 73 20 28 69  ble or tables (i
101c0 66 20 72 65 71 75 69 72 65 64 29 2e 20 2a 2f 0a  f required). */.
101d0 20 20 20 20 20 20 72 62 75 43 72 65 61 74 65 49        rbuCreateI
101e0 6d 70 6f 73 74 65 72 54 61 62 6c 65 28 70 2c 20  mposterTable(p, 
101f0 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 72 62  pIter);.      rb
10200 75 43 72 65 61 74 65 49 6d 70 6f 73 74 65 72 54  uCreateImposterT
10210 61 62 6c 65 32 28 70 2c 20 70 49 74 65 72 29 3b  able2(p, pIter);
10220 0a 20 20 20 20 20 20 7a 57 72 69 74 65 20 3d 20  .      zWrite = 
10230 28 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52  (pIter->eType==R
10240 42 55 5f 50 4b 5f 56 54 41 42 20 3f 20 22 22 20  BU_PK_VTAB ? "" 
10250 3a 20 22 72 62 75 5f 69 6d 70 5f 22 29 3b 0a 0a  : "rbu_imp_");..
10260 20 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20        /* Create 
10270 74 68 65 20 49 4e 53 45 52 54 20 73 74 61 74 65  the INSERT state
10280 6d 65 6e 74 20 74 6f 20 77 72 69 74 65 20 74 6f  ment to write to
10290 20 74 68 65 20 74 61 72 67 65 74 20 50 4b 20 62   the target PK b
102a0 2d 74 72 65 65 20 2a 2f 0a 20 20 20 20 20 20 69  -tree */.      i
102b0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
102c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
102d0 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65 46 72  ->rc = prepareFr
102e0 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f  eeAndCollectErro
102f0 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 70 49  r(p->dbMain, &pI
10300 74 65 72 2d 3e 70 49 6e 73 65 72 74 2c 20 70 7a  ter->pInsert, pz
10310 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ,.            sq
10320 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20  lite3_mprintf(. 
10330 20 20 20 20 20 20 20 20 20 20 20 20 20 22 49 4e               "IN
10340 53 45 52 54 20 49 4e 54 4f 20 5c 22 25 73 25 77  SERT INTO \"%s%w
10350 5c 22 28 25 73 25 73 29 20 56 41 4c 55 45 53 28  \"(%s%s) VALUES(
10360 25 73 29 22 2c 20 0a 20 20 20 20 20 20 20 20 20  %s)", .         
10370 20 20 20 20 20 7a 57 72 69 74 65 2c 20 7a 54 62       zWrite, zTb
10380 6c 2c 20 7a 43 6f 6c 6c 69 73 74 2c 20 28 62 52  l, zCollist, (bR
10390 62 75 52 6f 77 69 64 20 3f 20 22 2c 20 5f 72 6f  buRowid ? ", _ro
103a0 77 69 64 5f 22 20 3a 20 22 22 29 2c 20 7a 42 69  wid_" : ""), zBi
103b0 6e 64 69 6e 67 73 0a 20 20 20 20 20 20 20 20 20  ndings.         
103c0 20 20 20 29 0a 20 20 20 20 20 20 20 20 29 3b 0a     ).        );.
103d0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
103e0 2a 20 43 72 65 61 74 65 20 74 68 65 20 44 45 4c  * Create the DEL
103f0 45 54 45 20 73 74 61 74 65 6d 65 6e 74 20 74 6f  ETE statement to
10400 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 74 61   write to the ta
10410 72 67 65 74 20 50 4b 20 62 2d 74 72 65 65 20 2a  rget PK b-tree *
10420 2f 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72  /.      if( p->r
10430 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
10440 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
10450 70 72 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f  prepareFreeAndCo
10460 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62  llectError(p->db
10470 4d 61 69 6e 2c 20 26 70 49 74 65 72 2d 3e 70 44  Main, &pIter->pD
10480 65 6c 65 74 65 2c 20 70 7a 2c 0a 20 20 20 20 20  elete, pz,.     
10490 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d         sqlite3_m
104a0 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  printf(.        
104b0 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52        "DELETE FR
104c0 4f 4d 20 5c 22 25 73 25 77 5c 22 20 57 48 45 52  OM \"%s%w\" WHER
104d0 45 20 25 73 22 2c 20 7a 57 72 69 74 65 2c 20 7a  E %s", zWrite, z
104e0 54 62 6c 2c 20 7a 57 68 65 72 65 0a 20 20 20 20  Tbl, zWhere.    
104f0 20 20 20 20 20 20 20 20 29 0a 20 20 20 20 20 20          ).      
10500 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20    );.      }..  
10510 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 61      if( pIter->a
10520 62 49 6e 64 65 78 65 64 20 29 7b 0a 20 20 20 20  bIndexed ){.    
10530 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
10540 7a 52 62 75 52 6f 77 69 64 20 3d 20 22 22 3b 0a  zRbuRowid = "";.
10550 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65          if( pIte
10560 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b  r->eType==RBU_PK
10570 5f 45 58 54 45 52 4e 41 4c 20 7c 7c 20 70 49 74  _EXTERNAL || pIt
10580 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50  er->eType==RBU_P
10590 4b 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  K_NONE ){.      
105a0 20 20 20 20 7a 52 62 75 52 6f 77 69 64 20 3d 20      zRbuRowid = 
105b0 22 2c 20 72 62 75 5f 72 6f 77 69 64 22 3b 0a 20  ", rbu_rowid";. 
105c0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
105d0 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20    /* Create the 
105e0 72 62 75 5f 74 6d 70 5f 78 78 78 20 74 61 62 6c  rbu_tmp_xxx tabl
105f0 65 20 61 6e 64 20 74 68 65 20 74 72 69 67 67 65  e and the trigge
10600 72 73 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 69  rs to populate i
10610 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 62  t. */.        rb
10620 75 4d 50 72 69 6e 74 66 45 78 65 63 28 70 2c 20  uMPrintfExec(p, 
10630 70 2d 3e 64 62 52 62 75 2c 0a 20 20 20 20 20 20  p->dbRbu,.      
10640 20 20 20 20 20 20 22 43 52 45 41 54 45 20 54 41        "CREATE TA
10650 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54  BLE IF NOT EXIST
10660 53 20 25 73 2e 27 72 62 75 5f 74 6d 70 5f 25 71  S %s.'rbu_tmp_%q
10670 27 20 41 53 20 22 0a 20 20 20 20 20 20 20 20 20  ' AS ".         
10680 20 20 20 22 53 45 4c 45 43 54 20 2a 25 73 20 46     "SELECT *%s F
10690 52 4f 4d 20 27 25 71 27 20 57 48 45 52 45 20 30  ROM '%q' WHERE 0
106a0 3b 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 2c  ;".            ,
106b0 20 70 2d 3e 7a 53 74 61 74 65 44 62 2c 20 70 49   p->zStateDb, pI
106c0 74 65 72 2d 3e 7a 44 61 74 61 54 62 6c 0a 20 20  ter->zDataTbl.  
106d0 20 20 20 20 20 20 20 20 20 20 2c 20 28 70 49 74            , (pIt
106e0 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50  er->eType==RBU_P
106f0 4b 5f 45 58 54 45 52 4e 41 4c 20 3f 20 22 2c 20  K_EXTERNAL ? ", 
10700 30 20 41 53 20 72 62 75 5f 72 6f 77 69 64 22 20  0 AS rbu_rowid" 
10710 3a 20 22 22 29 0a 20 20 20 20 20 20 20 20 20 20  : "").          
10720 20 20 2c 20 70 49 74 65 72 2d 3e 7a 44 61 74 61    , pIter->zData
10730 54 62 6c 0a 20 20 20 20 20 20 20 20 29 3b 0a 0a  Tbl.        );..
10740 20 20 20 20 20 20 20 20 72 62 75 4d 50 72 69 6e          rbuMPrin
10750 74 66 45 78 65 63 28 70 2c 20 70 2d 3e 64 62 4d  tfExec(p, p->dbM
10760 61 69 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ain,.           
10770 20 22 43 52 45 41 54 45 20 54 45 4d 50 20 54 52   "CREATE TEMP TR
10780 49 47 47 45 52 20 72 62 75 5f 64 65 6c 65 74 65  IGGER rbu_delete
10790 5f 74 72 20 42 45 46 4f 52 45 20 44 45 4c 45 54  _tr BEFORE DELET
107a0 45 20 4f 4e 20 5c 22 25 73 25 77 5c 22 20 22 0a  E ON \"%s%w\" ".
107b0 20 20 20 20 20 20 20 20 20 20 20 20 22 42 45 47              "BEG
107c0 49 4e 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  IN ".           
107d0 20 22 20 20 53 45 4c 45 43 54 20 72 62 75 5f 74   "  SELECT rbu_t
107e0 6d 70 5f 69 6e 73 65 72 74 28 33 2c 20 25 73 29  mp_insert(3, %s)
107f0 3b 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  ;".            "
10800 45 4e 44 3b 22 0a 0a 20 20 20 20 20 20 20 20 20  END;"..         
10810 20 20 20 22 43 52 45 41 54 45 20 54 45 4d 50 20     "CREATE TEMP 
10820 54 52 49 47 47 45 52 20 72 62 75 5f 75 70 64 61  TRIGGER rbu_upda
10830 74 65 31 5f 74 72 20 42 45 46 4f 52 45 20 55 50  te1_tr BEFORE UP
10840 44 41 54 45 20 4f 4e 20 5c 22 25 73 25 77 5c 22  DATE ON \"%s%w\"
10850 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22   ".            "
10860 42 45 47 49 4e 20 22 0a 20 20 20 20 20 20 20 20  BEGIN ".        
10870 20 20 20 20 22 20 20 53 45 4c 45 43 54 20 72 62      "  SELECT rb
10880 75 5f 74 6d 70 5f 69 6e 73 65 72 74 28 33 2c 20  u_tmp_insert(3, 
10890 25 73 29 3b 22 0a 20 20 20 20 20 20 20 20 20 20  %s);".          
108a0 20 20 22 45 4e 44 3b 22 0a 0a 20 20 20 20 20 20    "END;"..      
108b0 20 20 20 20 20 20 22 43 52 45 41 54 45 20 54 45        "CREATE TE
108c0 4d 50 20 54 52 49 47 47 45 52 20 72 62 75 5f 75  MP TRIGGER rbu_u
108d0 70 64 61 74 65 32 5f 74 72 20 41 46 54 45 52 20  pdate2_tr AFTER 
108e0 55 50 44 41 54 45 20 4f 4e 20 5c 22 25 73 25 77  UPDATE ON \"%s%w
108f0 5c 22 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  \" ".           
10900 20 22 42 45 47 49 4e 20 22 0a 20 20 20 20 20 20   "BEGIN ".      
10910 20 20 20 20 20 20 22 20 20 53 45 4c 45 43 54 20        "  SELECT 
10920 72 62 75 5f 74 6d 70 5f 69 6e 73 65 72 74 28 34  rbu_tmp_insert(4
10930 2c 20 25 73 29 3b 22 0a 20 20 20 20 20 20 20 20  , %s);".        
10940 20 20 20 20 22 45 4e 44 3b 22 2c 0a 20 20 20 20      "END;",.    
10950 20 20 20 20 20 20 20 20 7a 57 72 69 74 65 2c 20          zWrite, 
10960 7a 54 62 6c 2c 20 7a 4f 6c 64 6c 69 73 74 2c 0a  zTbl, zOldlist,.
10970 20 20 20 20 20 20 20 20 20 20 20 20 7a 57 72 69              zWri
10980 74 65 2c 20 7a 54 62 6c 2c 20 7a 4f 6c 64 6c 69  te, zTbl, zOldli
10990 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  st,.            
109a0 7a 57 72 69 74 65 2c 20 7a 54 62 6c 2c 20 7a 4e  zWrite, zTbl, zN
109b0 65 77 6c 69 73 74 0a 20 20 20 20 20 20 20 20 29  ewlist.        )
109c0 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ;..        if( p
109d0 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55  Iter->eType==RBU
109e0 5f 50 4b 5f 45 58 54 45 52 4e 41 4c 20 7c 7c 20  _PK_EXTERNAL || 
109f0 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42  pIter->eType==RB
10a00 55 5f 50 4b 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  U_PK_NONE ){.   
10a10 20 20 20 20 20 20 20 72 62 75 4d 50 72 69 6e 74         rbuMPrint
10a20 66 45 78 65 63 28 70 2c 20 70 2d 3e 64 62 4d 61  fExec(p, p->dbMa
10a30 69 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  in,.            
10a40 20 20 22 43 52 45 41 54 45 20 54 45 4d 50 20 54    "CREATE TEMP T
10a50 52 49 47 47 45 52 20 72 62 75 5f 69 6e 73 65 72  RIGGER rbu_inser
10a60 74 5f 74 72 20 41 46 54 45 52 20 49 4e 53 45 52  t_tr AFTER INSER
10a70 54 20 4f 4e 20 5c 22 25 73 25 77 5c 22 20 22 0a  T ON \"%s%w\" ".
10a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 42                "B
10a90 45 47 49 4e 20 22 0a 20 20 20 20 20 20 20 20 20  EGIN ".         
10aa0 20 20 20 20 20 22 20 20 53 45 4c 45 43 54 20 72       "  SELECT r
10ab0 62 75 5f 74 6d 70 5f 69 6e 73 65 72 74 28 30 2c  bu_tmp_insert(0,
10ac0 20 25 73 29 3b 22 0a 20 20 20 20 20 20 20 20 20   %s);".         
10ad0 20 20 20 20 20 22 45 4e 44 3b 22 2c 0a 20 20 20       "END;",.   
10ae0 20 20 20 20 20 20 20 20 20 20 20 7a 57 72 69 74             zWrit
10af0 65 2c 20 7a 54 62 6c 2c 20 7a 4e 65 77 6c 69 73  e, zTbl, zNewlis
10b00 74 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20  t.          );. 
10b10 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
10b20 20 20 72 62 75 4f 62 6a 49 74 65 72 50 72 65 70    rbuObjIterPrep
10b30 61 72 65 54 6d 70 49 6e 73 65 72 74 28 70 2c 20  areTmpInsert(p, 
10b40 70 49 74 65 72 2c 20 7a 43 6f 6c 6c 69 73 74 2c  pIter, zCollist,
10b50 20 7a 52 62 75 52 6f 77 69 64 29 3b 0a 20 20 20   zRbuRowid);.   
10b60 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43     }..      /* C
10b70 72 65 61 74 65 20 74 68 65 20 53 45 4c 45 43 54  reate the SELECT
10b80 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 72 65   statement to re
10b90 61 64 20 6b 65 79 73 20 66 72 6f 6d 20 64 61 74  ad keys from dat
10ba0 61 5f 78 78 78 20 2a 2f 0a 20 20 20 20 20 20 69  a_xxx */.      i
10bb0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
10bc0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
10bd0 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65 46 72  ->rc = prepareFr
10be0 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f  eeAndCollectErro
10bf0 72 28 70 2d 3e 64 62 52 62 75 2c 20 26 70 49 74  r(p->dbRbu, &pIt
10c00 65 72 2d 3e 70 53 65 6c 65 63 74 2c 20 70 7a 2c  er->pSelect, pz,
10c10 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
10c20 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20  ite3_mprintf(.  
10c30 20 20 20 20 20 20 20 20 20 20 20 20 22 53 45 4c              "SEL
10c40 45 43 54 20 25 73 2c 20 72 62 75 5f 63 6f 6e 74  ECT %s, rbu_cont
10c50 72 6f 6c 25 73 20 46 52 4f 4d 20 27 25 71 27 25  rol%s FROM '%q'%
10c60 73 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  s", .           
10c70 20 20 20 7a 43 6f 6c 6c 69 73 74 2c 20 28 62 52     zCollist, (bR
10c80 62 75 52 6f 77 69 64 20 3f 20 22 2c 20 72 62 75  buRowid ? ", rbu
10c90 5f 72 6f 77 69 64 22 20 3a 20 22 22 29 2c 20 0a  _rowid" : ""), .
10ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49                pI
10cb0 74 65 72 2d 3e 7a 44 61 74 61 54 62 6c 2c 20 7a  ter->zDataTbl, z
10cc0 4c 69 6d 69 74 0a 20 20 20 20 20 20 20 20 20 20  Limit.          
10cd0 20 20 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20    ).        );. 
10ce0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 73 71       }..      sq
10cf0 6c 69 74 65 33 5f 66 72 65 65 28 7a 57 68 65 72  lite3_free(zWher
10d00 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
10d10 33 5f 66 72 65 65 28 7a 4f 6c 64 6c 69 73 74 29  3_free(zOldlist)
10d20 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
10d30 66 72 65 65 28 7a 4e 65 77 6c 69 73 74 29 3b 0a  free(zNewlist);.
10d40 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
10d50 65 65 28 7a 42 69 6e 64 69 6e 67 73 29 3b 0a 20  ee(zBindings);. 
10d60 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
10d70 5f 66 72 65 65 28 7a 43 6f 6c 6c 69 73 74 29 3b  _free(zCollist);
10d80 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
10d90 65 28 7a 4c 69 6d 69 74 29 3b 0a 20 20 7d 0a 20  e(zLimit);.  }. 
10da0 20 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63   .  return p->rc
10db0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 6f  ;.}../*.** Set o
10dc0 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 20 2a  utput variable *
10dd0 70 70 53 74 6d 74 20 74 6f 20 70 6f 69 6e 74 20  ppStmt to point 
10de0 74 6f 20 61 6e 20 55 50 44 41 54 45 20 73 74 61  to an UPDATE sta
10df0 74 65 6d 65 6e 74 20 74 68 61 74 20 6d 61 79 0a  tement that may.
10e00 2a 2a 20 62 65 20 75 73 65 64 20 74 6f 20 75 70  ** be used to up
10e10 64 61 74 65 20 74 68 65 20 69 6d 70 6f 73 74 65  date the imposte
10e20 72 20 74 61 62 6c 65 20 66 6f 72 20 74 68 65 20  r table for the 
10e30 6d 61 69 6e 20 74 61 62 6c 65 20 62 2d 74 72 65  main table b-tre
10e40 65 20 6f 66 20 74 68 65 0a 2a 2a 20 74 61 62 6c  e of the.** tabl
10e50 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20 70 49  e object that pI
10e60 74 65 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  ter currently po
10e70 69 6e 74 73 20 74 6f 2c 20 61 73 73 75 6d 69 6e  ints to, assumin
10e80 67 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 72  g that the .** r
10e90 62 75 5f 63 6f 6e 74 72 6f 6c 20 63 6f 6c 75 6d  bu_control colum
10ea0 6e 20 6f 66 20 74 68 65 20 64 61 74 61 5f 78 79  n of the data_xy
10eb0 7a 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73  z table contains
10ec0 20 7a 4d 61 73 6b 2e 0a 2a 2a 20 0a 2a 2a 20 49   zMask..** .** I
10ed0 66 20 74 68 65 20 7a 4d 61 73 6b 20 73 74 72 69  f the zMask stri
10ee0 6e 67 20 64 6f 65 73 20 6e 6f 74 20 73 70 65 63  ng does not spec
10ef0 69 66 79 20 61 6e 79 20 63 6f 6c 75 6d 6e 73 20  ify any columns 
10f00 74 6f 20 75 70 64 61 74 65 2c 20 74 68 65 6e 20  to update, then 
10f10 74 68 69 73 0a 2a 2a 20 69 73 20 6e 6f 74 20 61  this.** is not a
10f20 6e 20 65 72 72 6f 72 2e 20 4f 75 74 70 75 74 20  n error. Output 
10f30 76 61 72 69 61 62 6c 65 20 2a 70 70 53 74 6d 74  variable *ppStmt
10f40 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20   is set to NULL 
10f50 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f  in this case..*/
10f60 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 47  .static int rbuG
10f70 65 74 55 70 64 61 74 65 53 74 6d 74 28 0a 20 20  etUpdateStmt(.  
10f80 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 20  sqlite3rbu *p,  
10f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10fa0 2f 2a 20 52 42 55 20 68 61 6e 64 6c 65 20 2a 2f  /* RBU handle */
10fb0 0a 20 20 52 62 75 4f 62 6a 49 74 65 72 20 2a 70  .  RbuObjIter *p
10fc0 49 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  Iter,           
10fd0 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 69 74 65     /* Object ite
10fe0 72 61 74 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74  rator */.  const
10ff0 20 63 68 61 72 20 2a 7a 4d 61 73 6b 2c 20 20 20   char *zMask,   
11000 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72 62             /* rb
11010 75 5f 63 6f 6e 74 72 6f 6c 20 76 61 6c 75 65 20  u_control value 
11020 28 27 78 2e 78 2e 27 29 20 2a 2f 0a 20 20 73 71  ('x.x.') */.  sq
11030 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53  lite3_stmt **ppS
11040 74 6d 74 20 20 20 20 20 20 20 20 20 20 20 2f 2a  tmt           /*
11050 20 4f 55 54 3a 20 55 50 44 41 54 45 20 73 74 61   OUT: UPDATE sta
11060 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65 20 2a 2f  tement handle */
11070 0a 29 7b 0a 20 20 52 62 75 55 70 64 61 74 65 53  .){.  RbuUpdateS
11080 74 6d 74 20 2a 2a 70 70 3b 0a 20 20 52 62 75 55  tmt **pp;.  RbuU
11090 70 64 61 74 65 53 74 6d 74 20 2a 70 55 70 20 3d  pdateStmt *pUp =
110a0 20 30 3b 0a 20 20 69 6e 74 20 6e 55 70 20 3d 20   0;.  int nUp = 
110b0 30 3b 0a 0a 20 20 2f 2a 20 49 6e 20 63 61 73 65  0;..  /* In case
110c0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
110d0 20 2a 2f 0a 20 20 2a 70 70 53 74 6d 74 20 3d 20   */.  *ppStmt = 
110e0 30 3b 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20  0;..  /* Search 
110f0 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20  for an existing 
11100 73 74 61 74 65 6d 65 6e 74 2e 20 49 66 20 6f 6e  statement. If on
11110 65 20 69 73 20 66 6f 75 6e 64 2c 20 73 68 69 66  e is found, shif
11120 74 20 69 74 20 74 6f 20 74 68 65 20 66 72 6f 6e  t it to the fron
11130 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 4c 52  t.  ** of the LR
11140 55 20 71 75 65 75 65 20 61 6e 64 20 72 65 74 75  U queue and retu
11150 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20  rn immediately. 
11160 4f 74 68 65 72 77 69 73 65 2c 20 6c 65 61 76 65  Otherwise, leave
11170 20 6e 55 70 20 70 6f 69 6e 74 69 6e 67 0a 20 20   nUp pointing.  
11180 2a 2a 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  ** to the number
11190 20 6f 66 20 73 74 61 74 65 6d 65 6e 74 73 20 63   of statements c
111a0 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20  urrently in the 
111b0 63 61 63 68 65 20 61 6e 64 20 70 55 70 20 74 6f  cache and pUp to
111c0 20 74 68 65 0a 20 20 2a 2a 20 6c 61 73 74 20 6f   the.  ** last o
111d0 62 6a 65 63 74 20 69 6e 20 74 68 65 20 6c 69 73  bject in the lis
111e0 74 2e 20 20 2a 2f 0a 20 20 66 6f 72 28 70 70 3d  t.  */.  for(pp=
111f0 26 70 49 74 65 72 2d 3e 70 52 62 75 55 70 64 61  &pIter->pRbuUpda
11200 74 65 3b 20 2a 70 70 3b 20 70 70 3d 26 28 28 2a  te; *pp; pp=&((*
11210 70 70 29 2d 3e 70 4e 65 78 74 29 29 7b 0a 20 20  pp)->pNext)){.  
11220 20 20 70 55 70 20 3d 20 2a 70 70 3b 0a 20 20 20    pUp = *pp;.   
11230 20 69 66 28 20 73 74 72 63 6d 70 28 70 55 70 2d   if( strcmp(pUp-
11240 3e 7a 4d 61 73 6b 2c 20 7a 4d 61 73 6b 29 3d 3d  >zMask, zMask)==
11250 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 20 3d  0 ){.      *pp =
11260 20 70 55 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   pUp->pNext;.   
11270 20 20 20 70 55 70 2d 3e 70 4e 65 78 74 20 3d 20     pUp->pNext = 
11280 70 49 74 65 72 2d 3e 70 52 62 75 55 70 64 61 74  pIter->pRbuUpdat
11290 65 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  e;.      pIter->
112a0 70 52 62 75 55 70 64 61 74 65 20 3d 20 70 55 70  pRbuUpdate = pUp
112b0 3b 0a 20 20 20 20 20 20 2a 70 70 53 74 6d 74 20  ;.      *ppStmt 
112c0 3d 20 70 55 70 2d 3e 70 55 70 64 61 74 65 3b 20  = pUp->pUpdate; 
112d0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
112e0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
112f0 20 20 20 6e 55 70 2b 2b 3b 0a 20 20 7d 0a 20 20     nUp++;.  }.  
11300 61 73 73 65 72 74 28 20 70 55 70 3d 3d 30 20 7c  assert( pUp==0 |
11310 7c 20 70 55 70 2d 3e 70 4e 65 78 74 3d 3d 30 20  | pUp->pNext==0 
11320 29 3b 0a 0a 20 20 69 66 28 20 6e 55 70 3e 3d 53  );..  if( nUp>=S
11330 51 4c 49 54 45 5f 52 42 55 5f 55 50 44 41 54 45  QLITE_RBU_UPDATE
11340 5f 43 41 43 48 45 53 49 5a 45 20 29 7b 0a 20 20  _CACHESIZE ){.  
11350 20 20 66 6f 72 28 70 70 3d 26 70 49 74 65 72 2d    for(pp=&pIter-
11360 3e 70 52 62 75 55 70 64 61 74 65 3b 20 2a 70 70  >pRbuUpdate; *pp
11370 21 3d 70 55 70 3b 20 70 70 3d 26 28 28 2a 70 70  !=pUp; pp=&((*pp
11380 29 2d 3e 70 4e 65 78 74 29 29 3b 0a 20 20 20 20  )->pNext));.    
11390 2a 70 70 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  *pp = 0;.    sql
113a0 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 55  ite3_finalize(pU
113b0 70 2d 3e 70 55 70 64 61 74 65 29 3b 0a 20 20 20  p->pUpdate);.   
113c0 20 70 55 70 2d 3e 70 55 70 64 61 74 65 20 3d 20   pUp->pUpdate = 
113d0 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
113e0 70 55 70 20 3d 20 28 52 62 75 55 70 64 61 74 65  pUp = (RbuUpdate
113f0 53 74 6d 74 2a 29 72 62 75 4d 61 6c 6c 6f 63 28  Stmt*)rbuMalloc(
11400 70 2c 20 73 69 7a 65 6f 66 28 52 62 75 55 70 64  p, sizeof(RbuUpd
11410 61 74 65 53 74 6d 74 29 2b 70 49 74 65 72 2d 3e  ateStmt)+pIter->
11420 6e 54 62 6c 43 6f 6c 2b 31 29 3b 0a 20 20 7d 0a  nTblCol+1);.  }.
11430 0a 20 20 69 66 28 20 70 55 70 20 29 7b 0a 20 20  .  if( pUp ){.  
11440 20 20 63 68 61 72 20 2a 7a 57 68 65 72 65 20 3d    char *zWhere =
11450 20 72 62 75 4f 62 6a 49 74 65 72 47 65 74 57 68   rbuObjIterGetWh
11460 65 72 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  ere(p, pIter);. 
11470 20 20 20 63 68 61 72 20 2a 7a 53 65 74 20 3d 20     char *zSet = 
11480 72 62 75 4f 62 6a 49 74 65 72 47 65 74 53 65 74  rbuObjIterGetSet
11490 6c 69 73 74 28 70 2c 20 70 49 74 65 72 2c 20 7a  list(p, pIter, z
114a0 4d 61 73 6b 29 3b 0a 20 20 20 20 63 68 61 72 20  Mask);.    char 
114b0 2a 7a 55 70 64 61 74 65 20 3d 20 30 3b 0a 0a 20  *zUpdate = 0;.. 
114c0 20 20 20 70 55 70 2d 3e 7a 4d 61 73 6b 20 3d 20     pUp->zMask = 
114d0 28 63 68 61 72 2a 29 26 70 55 70 5b 31 5d 3b 0a  (char*)&pUp[1];.
114e0 20 20 20 20 6d 65 6d 63 70 79 28 70 55 70 2d 3e      memcpy(pUp->
114f0 7a 4d 61 73 6b 2c 20 7a 4d 61 73 6b 2c 20 70 49  zMask, zMask, pI
11500 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 29 3b 0a 20  ter->nTblCol);. 
11510 20 20 20 70 55 70 2d 3e 70 4e 65 78 74 20 3d 20     pUp->pNext = 
11520 70 49 74 65 72 2d 3e 70 52 62 75 55 70 64 61 74  pIter->pRbuUpdat
11530 65 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70 52  e;.    pIter->pR
11540 62 75 55 70 64 61 74 65 20 3d 20 70 55 70 3b 0a  buUpdate = pUp;.
11550 0a 20 20 20 20 69 66 28 20 7a 53 65 74 20 29 7b  .    if( zSet ){
11560 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
11570 72 20 2a 7a 50 72 65 66 69 78 20 3d 20 22 22 3b  r *zPrefix = "";
11580 0a 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  ..      if( pIte
11590 72 2d 3e 65 54 79 70 65 21 3d 52 42 55 5f 50 4b  r->eType!=RBU_PK
115a0 5f 56 54 41 42 20 29 20 7a 50 72 65 66 69 78 20  _VTAB ) zPrefix 
115b0 3d 20 22 72 62 75 5f 69 6d 70 5f 22 3b 0a 20 20  = "rbu_imp_";.  
115c0 20 20 20 20 7a 55 70 64 61 74 65 20 3d 20 73 71      zUpdate = sq
115d0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 55  lite3_mprintf("U
115e0 50 44 41 54 45 20 5c 22 25 73 25 77 5c 22 20 53  PDATE \"%s%w\" S
115f0 45 54 20 25 73 20 57 48 45 52 45 20 25 73 22 2c  ET %s WHERE %s",
11600 20 0a 20 20 20 20 20 20 20 20 20 20 7a 50 72 65   .          zPre
11610 66 69 78 2c 20 70 49 74 65 72 2d 3e 7a 54 62 6c  fix, pIter->zTbl
11620 2c 20 7a 53 65 74 2c 20 7a 57 68 65 72 65 0a 20  , zSet, zWhere. 
11630 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 70 2d       );.      p-
11640 3e 72 63 20 3d 20 70 72 65 70 61 72 65 46 72 65  >rc = prepareFre
11650 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72  eAndCollectError
11660 28 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 64  (.          p->d
11670 62 4d 61 69 6e 2c 20 26 70 55 70 2d 3e 70 55 70  bMain, &pUp->pUp
11680 64 61 74 65 2c 20 26 70 2d 3e 7a 45 72 72 6d 73  date, &p->zErrms
11690 67 2c 20 7a 55 70 64 61 74 65 0a 20 20 20 20 20  g, zUpdate.     
116a0 20 29 3b 0a 20 20 20 20 20 20 2a 70 70 53 74 6d   );.      *ppStm
116b0 74 20 3d 20 70 55 70 2d 3e 70 55 70 64 61 74 65  t = pUp->pUpdate
116c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
116d0 74 65 33 5f 66 72 65 65 28 7a 57 68 65 72 65 29  te3_free(zWhere)
116e0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
116f0 65 65 28 7a 53 65 74 29 3b 0a 20 20 7d 0a 0a 20  ee(zSet);.  }.. 
11700 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 3b 0a 7d   return p->rc;.}
11710 0a 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33  ..static sqlite3
11720 20 2a 72 62 75 4f 70 65 6e 44 62 68 61 6e 64 6c   *rbuOpenDbhandl
11730 65 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c  e(sqlite3rbu *p,
11740 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
11750 6d 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  me){.  sqlite3 *
11760 64 62 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d  db = 0;.  if( p-
11770 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
11780 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20  {.    const int 
11790 66 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f  flags = SQLITE_O
117a0 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51  PEN_READWRITE|SQ
117b0 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
117c0 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49  |SQLITE_OPEN_URI
117d0 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71  ;.    p->rc = sq
117e0 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 7a 4e  lite3_open_v2(zN
117f0 61 6d 65 2c 20 26 64 62 2c 20 66 6c 61 67 73 2c  ame, &db, flags,
11800 20 70 2d 3e 7a 56 66 73 4e 61 6d 65 29 3b 0a 20   p->zVfsName);. 
11810 20 20 20 69 66 28 20 70 2d 3e 72 63 20 29 7b 0a     if( p->rc ){.
11820 20 20 20 20 20 20 70 2d 3e 7a 45 72 72 6d 73 67        p->zErrmsg
11830 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
11840 74 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65 33  tf("%s", sqlite3
11850 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20  _errmsg(db));.  
11860 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73      sqlite3_clos
11870 65 28 64 62 29 3b 0a 20 20 20 20 20 20 64 62 20  e(db);.      db 
11880 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 0;.    }.  }. 
11890 20 72 65 74 75 72 6e 20 64 62 3b 0a 7d 0a 0a 2f   return db;.}../
118a0 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 64 61  *.** Open the da
118b0 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 61 6e  tabase handle an
118c0 64 20 61 74 74 61 63 68 20 74 68 65 20 52 42 55  d attach the RBU
118d0 20 64 61 74 61 62 61 73 65 20 61 73 20 22 72 62   database as "rb
118e0 75 22 2e 20 49 66 20 61 6e 0a 2a 2a 20 65 72 72  u". If an.** err
118f0 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65  or occurs, leave
11900 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 61   an error code a
11910 6e 64 20 6d 65 73 73 61 67 65 20 69 6e 20 74 68  nd message in th
11920 65 20 52 42 55 20 68 61 6e 64 6c 65 2e 0a 2a 2f  e RBU handle..*/
11930 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75  .static void rbu
11940 4f 70 65 6e 44 61 74 61 62 61 73 65 28 73 71 6c  OpenDatabase(sql
11950 69 74 65 33 72 62 75 20 2a 70 29 7b 0a 20 20 61  ite3rbu *p){.  a
11960 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51  ssert( p->rc==SQ
11970 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 61 73 73  LITE_OK );.  ass
11980 65 72 74 28 20 70 2d 3e 64 62 4d 61 69 6e 3d 3d  ert( p->dbMain==
11990 30 20 26 26 20 70 2d 3e 64 62 52 62 75 3d 3d 30  0 && p->dbRbu==0
119a0 20 29 3b 0a 0a 20 20 70 2d 3e 65 53 74 61 67 65   );..  p->eStage
119b0 20 3d 20 30 3b 0a 20 20 70 2d 3e 64 62 4d 61 69   = 0;.  p->dbMai
119c0 6e 20 3d 20 72 62 75 4f 70 65 6e 44 62 68 61 6e  n = rbuOpenDbhan
119d0 64 6c 65 28 70 2c 20 70 2d 3e 7a 54 61 72 67 65  dle(p, p->zTarge
119e0 74 29 3b 0a 20 20 70 2d 3e 64 62 52 62 75 20 3d  t);.  p->dbRbu =
119f0 20 72 62 75 4f 70 65 6e 44 62 68 61 6e 64 6c 65   rbuOpenDbhandle
11a00 28 70 2c 20 70 2d 3e 7a 52 62 75 29 3b 0a 0a 20  (p, p->zRbu);.. 
11a10 20 2f 2a 20 49 66 20 75 73 69 6e 67 20 73 65 70   /* If using sep
11a20 61 72 61 74 65 20 52 42 55 20 61 6e 64 20 73 74  arate RBU and st
11a30 61 74 65 20 64 61 74 61 62 61 73 65 73 2c 20 61  ate databases, a
11a40 74 74 61 63 68 20 74 68 65 20 73 74 61 74 65 20  ttach the state 
11a50 64 61 74 61 62 61 73 65 20 74 6f 0a 20 20 2a 2a  database to.  **
11a60 20 74 68 65 20 52 42 55 20 64 62 20 68 61 6e 64   the RBU db hand
11a70 6c 65 20 6e 6f 77 2e 20 20 2a 2f 0a 20 20 69 66  le now.  */.  if
11a80 28 20 70 2d 3e 7a 53 74 61 74 65 20 29 7b 0a 20  ( p->zState ){. 
11a90 20 20 20 72 62 75 4d 50 72 69 6e 74 66 45 78 65     rbuMPrintfExe
11aa0 63 28 70 2c 20 70 2d 3e 64 62 52 62 75 2c 20 22  c(p, p->dbRbu, "
11ab0 41 54 54 41 43 48 20 25 51 20 41 53 20 73 74 61  ATTACH %Q AS sta
11ac0 74 22 2c 20 70 2d 3e 7a 53 74 61 74 65 29 3b 0a  t", p->zState);.
11ad0 20 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e 7a 53      memcpy(p->zS
11ae0 74 61 74 65 44 62 2c 20 22 73 74 61 74 22 2c 20  tateDb, "stat", 
11af0 34 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  4);.  }else{.   
11b00 20 6d 65 6d 63 70 79 28 70 2d 3e 7a 53 74 61 74   memcpy(p->zStat
11b10 65 44 62 2c 20 22 6d 61 69 6e 22 2c 20 34 29 3b  eDb, "main", 4);
11b20 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72  .  }..  if( p->r
11b30 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
11b40 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69      p->rc = sqli
11b50 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
11b60 69 6f 6e 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 0a  ion(p->dbMain, .
11b70 20 20 20 20 20 20 20 20 22 72 62 75 5f 74 6d 70          "rbu_tmp
11b80 5f 69 6e 73 65 72 74 22 2c 20 2d 31 2c 20 53 51  _insert", -1, SQ
11b90 4c 49 54 45 5f 55 54 46 38 2c 20 28 76 6f 69 64  LITE_UTF8, (void
11ba0 2a 29 70 2c 20 72 62 75 54 6d 70 49 6e 73 65 72  *)p, rbuTmpInser
11bb0 74 46 75 6e 63 2c 20 30 2c 20 30 0a 20 20 20 20  tFunc, 0, 0.    
11bc0 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d  );.  }..  if( p-
11bd0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
11be0 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71  {.    p->rc = sq
11bf0 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
11c00 63 74 69 6f 6e 28 70 2d 3e 64 62 4d 61 69 6e 2c  ction(p->dbMain,
11c10 20 0a 20 20 20 20 20 20 20 20 22 72 62 75 5f 66   .        "rbu_f
11c20 6f 73 73 69 6c 5f 64 65 6c 74 61 22 2c 20 32 2c  ossil_delta", 2,
11c30 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c   SQLITE_UTF8, 0,
11c40 20 72 62 75 46 6f 73 73 69 6c 44 65 6c 74 61 46   rbuFossilDeltaF
11c50 75 6e 63 2c 20 30 2c 20 30 0a 20 20 20 20 29 3b  unc, 0, 0.    );
11c60 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72  .  }..  if( p->r
11c70 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
11c80 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69      p->rc = sqli
11c90 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
11ca0 69 6f 6e 28 70 2d 3e 64 62 52 62 75 2c 20 0a 20  ion(p->dbRbu, . 
11cb0 20 20 20 20 20 20 20 22 72 62 75 5f 74 61 72 67         "rbu_targ
11cc0 65 74 5f 6e 61 6d 65 22 2c 20 31 2c 20 53 51 4c  et_name", 1, SQL
11cd0 49 54 45 5f 55 54 46 38 2c 20 28 76 6f 69 64 2a  ITE_UTF8, (void*
11ce0 29 70 2c 20 72 62 75 54 61 72 67 65 74 4e 61 6d  )p, rbuTargetNam
11cf0 65 46 75 6e 63 2c 20 30 2c 20 30 0a 20 20 20 20  eFunc, 0, 0.    
11d00 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d  );.  }..  if( p-
11d10 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
11d20 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71  {.    p->rc = sq
11d30 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
11d40 6f 6c 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 6d  ol(p->dbMain, "m
11d50 61 69 6e 22 2c 20 53 51 4c 49 54 45 5f 46 43 4e  ain", SQLITE_FCN
11d60 54 4c 5f 52 42 55 2c 20 28 76 6f 69 64 2a 29 70  TL_RBU, (void*)p
11d70 29 3b 0a 20 20 7d 0a 20 20 72 62 75 4d 50 72 69  );.  }.  rbuMPri
11d80 6e 74 66 45 78 65 63 28 70 2c 20 70 2d 3e 64 62  ntfExec(p, p->db
11d90 4d 61 69 6e 2c 20 22 53 45 4c 45 43 54 20 2a 20  Main, "SELECT * 
11da0 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
11db0 65 72 22 29 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b  er");..  /* Mark
11dc0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
11dd0 6c 65 20 6a 75 73 74 20 6f 70 65 6e 65 64 20 61  le just opened a
11de0 73 20 61 6e 20 52 42 55 20 74 61 72 67 65 74 20  s an RBU target 
11df0 64 61 74 61 62 61 73 65 2e 20 49 66 20 0a 20 20  database. If .  
11e00 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 72 65 74  ** this call ret
11e10 75 72 6e 73 20 53 51 4c 49 54 45 5f 4e 4f 54 46  urns SQLITE_NOTF
11e20 4f 55 4e 44 2c 20 74 68 65 6e 20 74 68 65 20 52  OUND, then the R
11e30 42 55 20 76 66 73 20 69 73 20 6e 6f 74 20 69 6e  BU vfs is not in
11e40 20 75 73 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20   use..  ** This 
11e50 69 73 20 61 6e 20 65 72 72 6f 72 2e 20 20 2a 2f  is an error.  */
11e60 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
11e70 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
11e80 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66  ->rc = sqlite3_f
11e90 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 70 2d 3e 64  ile_control(p->d
11ea0 62 4d 61 69 6e 2c 20 22 6d 61 69 6e 22 2c 20 53  bMain, "main", S
11eb0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 52 42 55 2c  QLITE_FCNTL_RBU,
11ec0 20 28 76 6f 69 64 2a 29 70 29 3b 0a 20 20 7d 0a   (void*)p);.  }.
11ed0 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
11ee0 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 7b  LITE_NOTFOUND ){
11ef0 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  .    p->rc = SQL
11f00 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 70  ITE_ERROR;.    p
11f10 2d 3e 7a 45 72 72 6d 73 67 20 3d 20 73 71 6c 69  ->zErrmsg = sqli
11f20 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 72 62 75  te3_mprintf("rbu
11f30 20 76 66 73 20 6e 6f 74 20 66 6f 75 6e 64 22 29   vfs not found")
11f40 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
11f50 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
11f60 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 71 6c   copy of the sql
11f70 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33 28  ite3FileSuffix3(
11f80 29 20 72 6f 75 74 69 6e 65 20 66 72 6f 6d 20 74  ) routine from t
11f90 68 65 20 63 6f 72 65 2e 0a 2a 2a 20 49 74 20 69  he core..** It i
11fa0 73 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73  s a no-op unless
11fb0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 38   SQLITE_ENABLE_8
11fc0 5f 33 5f 4e 41 4d 45 53 20 69 73 20 64 65 66 69  _3_NAMES is defi
11fd0 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51  ned..**.** If SQ
11fe0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 38 5f 33 5f  LITE_ENABLE_8_3_
11ff0 4e 41 4d 45 53 20 69 73 20 73 65 74 20 61 74 20  NAMES is set at 
12000 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 61 6e 64  compile-time and
12010 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
12020 0a 2a 2a 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20  .** filename in 
12030 7a 42 61 73 65 46 69 6c 65 6e 61 6d 65 20 69 73  zBaseFilename is
12040 20 61 20 55 52 49 20 77 69 74 68 20 74 68 65 20   a URI with the 
12050 22 38 5f 33 5f 6e 61 6d 65 73 3d 31 22 20 70 61  "8_3_names=1" pa
12060 72 61 6d 65 74 65 72 20 61 6e 64 0a 2a 2a 20 69  rameter and.** i
12070 66 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 7a 5b  f filename in z[
12080 5d 20 68 61 73 20 61 20 73 75 66 66 69 78 20 28  ] has a suffix (
12090 61 2e 6b 2e 61 2e 20 22 65 78 74 65 6e 73 69 6f  a.k.a. "extensio
120a0 6e 22 29 20 74 68 61 74 20 69 73 20 6c 6f 6e 67  n") that is long
120b0 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 72 65 65  er than.** three
120c0 20 63 68 61 72 61 63 74 65 72 73 2c 20 74 68 65   characters, the
120d0 6e 20 73 68 6f 72 74 65 6e 20 74 68 65 20 73 75  n shorten the su
120e0 66 66 69 78 20 6f 6e 20 7a 5b 5d 20 74 6f 20 62  ffix on z[] to b
120f0 65 20 74 68 65 20 6c 61 73 74 20 74 68 72 65 65  e the last three
12100 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 73 20 6f  .** characters o
12110 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 73  f the original s
12120 75 66 66 69 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  uffix..**.** If 
12130 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 38 5f  SQLITE_ENABLE_8_
12140 33 5f 4e 41 4d 45 53 20 69 73 20 73 65 74 20 74  3_NAMES is set t
12150 6f 20 32 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74  o 2 at compile-t
12160 69 6d 65 2c 20 74 68 65 6e 20 61 6c 77 61 79 73  ime, then always
12170 0a 2a 2a 20 64 6f 20 74 68 65 20 73 75 66 66 69  .** do the suffi
12180 78 20 73 68 6f 72 74 65 6e 69 6e 67 20 72 65 67  x shortening reg
12190 61 72 64 6c 65 73 73 20 6f 66 20 55 52 49 20 70  ardless of URI p
121a0 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  arameter..**.** 
121b0 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20  Examples:.**.** 
121c0 20 20 20 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72      test.db-jour
121d0 6e 61 6c 20 20 20 20 3d 3e 20 20 20 74 65 73 74  nal    =>   test
121e0 2e 6e 61 6c 0a 2a 2a 20 20 20 20 20 74 65 73 74  .nal.**     test
121f0 2e 64 62 2d 77 61 6c 20 20 20 20 20 20 20 20 3d  .db-wal        =
12200 3e 20 20 20 74 65 73 74 2e 77 61 6c 0a 2a 2a 20  >   test.wal.** 
12210 20 20 20 20 74 65 73 74 2e 64 62 2d 73 68 6d 20      test.db-shm 
12220 20 20 20 20 20 20 20 3d 3e 20 20 20 74 65 73 74         =>   test
12230 2e 73 68 6d 0a 2a 2a 20 20 20 20 20 74 65 73 74  .shm.**     test
12240 2e 64 62 2d 6d 6a 37 66 33 33 31 39 66 61 20 3d  .db-mj7f3319fa =
12250 3e 20 20 20 74 65 73 74 2e 39 66 61 0a 2a 2f 0a  >   test.9fa.*/.
12260 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75 46  static void rbuF
12270 69 6c 65 53 75 66 66 69 78 33 28 63 6f 6e 73 74  ileSuffix3(const
12280 20 63 68 61 72 20 2a 7a 42 61 73 65 2c 20 63 68   char *zBase, ch
12290 61 72 20 2a 7a 29 7b 0a 23 69 66 64 65 66 20 53  ar *z){.#ifdef S
122a0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 38 5f 33  QLITE_ENABLE_8_3
122b0 5f 4e 41 4d 45 53 0a 23 69 66 20 53 51 4c 49 54  _NAMES.#if SQLIT
122c0 45 5f 45 4e 41 42 4c 45 5f 38 5f 33 5f 4e 41 4d  E_ENABLE_8_3_NAM
122d0 45 53 3c 32 0a 20 20 69 66 28 20 73 71 6c 69 74  ES<2.  if( sqlit
122e0 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 7a  e3_uri_boolean(z
122f0 42 61 73 65 2c 20 22 38 5f 33 5f 6e 61 6d 65 73  Base, "8_3_names
12300 22 2c 20 30 29 20 29 0a 23 65 6e 64 69 66 0a 20  ", 0) ).#endif. 
12310 20 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 73 7a   {.    int i, sz
12320 3b 0a 20 20 20 20 73 7a 20 3d 20 73 71 6c 69 74  ;.    sz = sqlit
12330 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20  e3Strlen30(z);. 
12340 20 20 20 66 6f 72 28 69 3d 73 7a 2d 31 3b 20 69     for(i=sz-1; i
12350 3e 30 20 26 26 20 7a 5b 69 5d 21 3d 27 2f 27 20  >0 && z[i]!='/' 
12360 26 26 20 7a 5b 69 5d 21 3d 27 2e 27 3b 20 69 2d  && z[i]!='.'; i-
12370 2d 29 7b 7d 0a 20 20 20 20 69 66 28 20 7a 5b 69  -){}.    if( z[i
12380 5d 3d 3d 27 2e 27 20 26 26 20 41 4c 57 41 59 53  ]=='.' && ALWAYS
12390 28 73 7a 3e 69 2b 34 29 20 29 20 6d 65 6d 6d 6f  (sz>i+4) ) memmo
123a0 76 65 28 26 7a 5b 69 2b 31 5d 2c 20 26 7a 5b 73  ve(&z[i+1], &z[s
123b0 7a 2d 33 5d 2c 20 34 29 3b 0a 20 20 7d 0a 23 65  z-3], 4);.  }.#e
123c0 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ndif.}../*.** Re
123d0 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74  turn the current
123e0 20 77 61 6c 2d 69 6e 64 65 78 20 68 65 61 64 65   wal-index heade
123f0 72 20 63 68 65 63 6b 73 75 6d 20 66 6f 72 20 74  r checksum for t
12400 68 65 20 74 61 72 67 65 74 20 64 61 74 61 62 61  he target databa
12410 73 65 20 0a 2a 2a 20 61 73 20 61 20 36 34 2d 62  se .** as a 64-b
12420 69 74 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a  it integer..**.*
12430 2a 20 54 68 65 20 63 68 65 63 6b 73 75 6d 20 69  * The checksum i
12440 73 20 73 74 6f 72 65 20 69 6e 20 74 68 65 20 66  s store in the f
12450 69 72 73 74 20 70 61 67 65 20 6f 66 20 78 53 68  irst page of xSh
12460 6d 4d 61 70 20 6d 65 6d 6f 72 79 20 61 73 20 61  mMap memory as a
12470 6e 20 38 2d 62 79 74 65 20 0a 2a 2a 20 62 6c 6f  n 8-byte .** blo
12480 62 20 73 74 61 72 74 69 6e 67 20 61 74 20 62 79  b starting at by
12490 74 65 20 6f 66 66 73 65 74 20 34 30 2e 0a 2a 2f  te offset 40..*/
124a0 0a 73 74 61 74 69 63 20 69 36 34 20 72 62 75 53  .static i64 rbuS
124b0 68 6d 43 68 65 63 6b 73 75 6d 28 73 71 6c 69 74  hmChecksum(sqlit
124c0 65 33 72 62 75 20 2a 70 29 7b 0a 20 20 69 36 34  e3rbu *p){.  i64
124d0 20 69 52 65 74 20 3d 20 30 3b 0a 20 20 69 66 28   iRet = 0;.  if(
124e0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
124f0 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
12500 5f 66 69 6c 65 20 2a 70 44 62 20 3d 20 70 2d 3e  _file *pDb = p->
12510 70 54 61 72 67 65 74 46 64 2d 3e 70 52 65 61 6c  pTargetFd->pReal
12520 3b 0a 20 20 20 20 75 33 32 20 76 6f 6c 61 74 69  ;.    u32 volati
12530 6c 65 20 2a 70 74 72 3b 0a 20 20 20 20 70 2d 3e  le *ptr;.    p->
12540 72 63 20 3d 20 70 44 62 2d 3e 70 4d 65 74 68 6f  rc = pDb->pMetho
12550 64 73 2d 3e 78 53 68 6d 4d 61 70 28 70 44 62 2c  ds->xShmMap(pDb,
12560 20 30 2c 20 33 32 2a 31 30 32 34 2c 20 30 2c 20   0, 32*1024, 0, 
12570 28 76 6f 69 64 20 76 6f 6c 61 74 69 6c 65 2a 2a  (void volatile**
12580 29 26 70 74 72 29 3b 0a 20 20 20 20 69 66 28 20  )&ptr);.    if( 
12590 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
125a0 20 29 7b 0a 20 20 20 20 20 20 69 52 65 74 20 3d   ){.      iRet =
125b0 20 28 28 69 36 34 29 70 74 72 5b 31 30 5d 20 3c   ((i64)ptr[10] <
125c0 3c 20 33 32 29 20 2b 20 70 74 72 5b 31 31 5d 3b  < 32) + ptr[11];
125d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
125e0 75 72 6e 20 69 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a  urn iRet;.}../*.
125f0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
12600 20 69 73 20 63 61 6c 6c 65 64 20 61 73 20 70 61   is called as pa
12610 72 74 20 6f 66 20 69 6e 69 74 69 61 6c 69 7a 69  rt of initializi
12620 6e 67 20 6f 72 20 72 65 69 6e 69 74 69 61 6c 69  ng or reinitiali
12630 7a 69 6e 67 20 61 6e 0a 2a 2a 20 69 6e 63 72 65  zing an.** incre
12640 6d 65 6e 74 61 6c 20 63 68 65 63 6b 70 6f 69 6e  mental checkpoin
12650 74 2e 20 0a 2a 2a 0a 2a 2a 20 49 74 20 70 6f 70  t. .**.** It pop
12660 75 6c 61 74 65 73 20 74 68 65 20 73 71 6c 69 74  ulates the sqlit
12670 65 33 72 62 75 2e 61 46 72 61 6d 65 5b 5d 20 61  e3rbu.aFrame[] a
12680 72 72 61 79 20 77 69 74 68 20 74 68 65 20 73 65  rray with the se
12690 74 20 6f 66 20 0a 2a 2a 20 28 77 61 6c 20 66 72  t of .** (wal fr
126a0 61 6d 65 20 2d 3e 20 64 62 20 70 61 67 65 29 20  ame -> db page) 
126b0 63 6f 70 79 20 6f 70 65 72 61 74 69 6f 6e 73 20  copy operations 
126c0 72 65 71 75 69 72 65 64 20 74 6f 20 63 68 65 63  required to chec
126d0 6b 70 6f 69 6e 74 20 74 68 65 20 0a 2a 2a 20 63  kpoint the .** c
126e0 75 72 72 65 6e 74 20 77 61 6c 20 66 69 6c 65 2c  urrent wal file,
126f0 20 61 6e 64 20 6f 62 74 61 69 6e 73 20 74 68 65   and obtains the
12700 20 73 65 74 20 6f 66 20 73 68 6d 20 6c 6f 63 6b   set of shm lock
12710 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 73 61  s required to sa
12720 66 65 6c 79 20 0a 2a 2a 20 70 65 72 66 6f 72 6d  fely .** perform
12730 20 74 68 65 20 63 6f 70 79 20 6f 70 65 72 61 74   the copy operat
12740 69 6f 6e 73 20 64 69 72 65 63 74 6c 79 20 6f 6e  ions directly on
12750 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
12760 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d  ..**.** If argum
12770 65 6e 74 20 70 53 74 61 74 65 20 69 73 20 6e 6f  ent pState is no
12780 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65  t NULL, then the
12790 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 63 68 65   incremental che
127a0 63 6b 70 6f 69 6e 74 20 69 73 0a 2a 2a 20 62 65  ckpoint is.** be
127b0 69 6e 67 20 72 65 73 75 6d 65 64 2e 20 49 6e 20  ing resumed. In 
127c0 74 68 69 73 20 63 61 73 65 2c 20 69 66 20 74 68  this case, if th
127d0 65 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 74 68  e checksum of th
127e0 65 20 77 61 6c 2d 69 6e 64 65 78 2d 68 65 61 64  e wal-index-head
127f0 65 72 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  er.** following 
12800 72 65 63 6f 76 65 72 79 20 69 73 20 6e 6f 74 20  recovery is not 
12810 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
12820 63 68 65 63 6b 73 75 6d 20 73 61 76 65 64 20 69  checksum saved i
12830 6e 20 74 68 65 20 52 62 75 53 74 61 74 65 0a 2a  n the RbuState.*
12840 2a 20 6f 62 6a 65 63 74 2c 20 74 68 65 6e 20 74  * object, then t
12850 68 65 20 72 62 75 20 68 61 6e 64 6c 65 20 69 73  he rbu handle is
12860 20 73 65 74 20 74 6f 20 44 4f 4e 45 20 73 74 61   set to DONE sta
12870 74 65 2e 20 54 68 69 73 20 6f 63 63 75 72 73 20  te. This occurs 
12880 69 66 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72  if some.** other
12890 20 63 6c 69 65 6e 74 20 61 70 70 65 6e 64 73 20   client appends 
128a0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f  a transaction to
128b0 20 74 68 65 20 77 61 6c 20 66 69 6c 65 20 69 6e   the wal file in
128c0 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a   the middle of.*
128d0 2a 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  * an incremental
128e0 20 63 68 65 63 6b 70 6f 69 6e 74 2e 0a 2a 2f 0a   checkpoint..*/.
128f0 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75 53  static void rbuS
12900 65 74 75 70 43 68 65 63 6b 70 6f 69 6e 74 28 73  etupCheckpoint(s
12910 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 52 62  qlite3rbu *p, Rb
12920 75 53 74 61 74 65 20 2a 70 53 74 61 74 65 29 7b  uState *pState){
12930 0a 0a 20 20 2f 2a 20 49 66 20 70 53 74 61 74 65  ..  /* If pState
12940 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74   is NULL, then t
12950 68 65 20 77 61 6c 20 66 69 6c 65 20 6d 61 79 20  he wal file may 
12960 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70  not have been op
12970 65 6e 65 64 20 61 6e 64 0a 20 20 2a 2a 20 72 65  ened and.  ** re
12980 63 6f 76 65 72 65 64 2e 20 52 75 6e 6e 69 6e 67  covered. Running
12990 20 61 20 72 65 61 64 2d 73 74 61 74 65 6d 65 6e   a read-statemen
129a0 74 20 68 65 72 65 20 74 6f 20 65 6e 73 75 72 65  t here to ensure
129b0 20 74 68 61 74 20 64 6f 69 6e 67 20 73 6f 0a 20   that doing so. 
129c0 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 69 6e 74   ** does not int
129d0 65 72 66 65 72 65 20 77 69 74 68 20 74 68 65 20  erfere with the 
129e0 22 63 61 70 74 75 72 65 22 20 70 72 6f 63 65 73  "capture" proces
129f0 73 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20 69  s below.  */.  i
12a00 66 28 20 70 53 74 61 74 65 3d 3d 30 20 29 7b 0a  f( pState==0 ){.
12a10 20 20 20 20 70 2d 3e 65 53 74 61 67 65 20 3d 20      p->eStage = 
12a20 30 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  0;.    if( p->rc
12a30 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
12a40 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c       p->rc = sql
12a50 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 4d  ite3_exec(p->dbM
12a60 61 69 6e 2c 20 22 53 45 4c 45 43 54 20 2a 20 46  ain, "SELECT * F
12a70 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
12a80 72 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  r", 0, 0, 0);.  
12a90 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 73    }.  }..  /* As
12aa0 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72 20  suming no error 
12ab0 68 61 73 20 6f 63 63 75 72 72 65 64 2c 20 72 75  has occurred, ru
12ac0 6e 20 61 20 22 72 65 73 74 61 72 74 22 20 63 68  n a "restart" ch
12ad0 65 63 6b 70 6f 69 6e 74 20 77 69 74 68 20 74 68  eckpoint with th
12ae0 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 72 62  e.  ** sqlite3rb
12af0 75 2e 65 53 74 61 67 65 20 76 61 72 69 61 62 6c  u.eStage variabl
12b00 65 20 73 65 74 20 74 6f 20 43 41 50 54 55 52 45  e set to CAPTURE
12b10 2e 20 54 68 69 73 20 74 75 72 6e 73 20 6f 6e 20  . This turns on 
12b20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20  the following.  
12b30 2a 2a 20 73 70 65 63 69 61 6c 20 62 65 68 61 76  ** special behav
12b40 69 6f 75 72 20 69 6e 20 74 68 65 20 72 62 75 20  iour in the rbu 
12b50 56 46 53 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  VFS:.  **.  **  
12b60 20 2a 20 49 66 20 74 68 65 20 65 78 63 6c 75 73   * If the exclus
12b70 69 76 65 20 73 68 6d 20 57 52 49 54 45 52 20 6f  ive shm WRITER o
12b80 72 20 52 45 41 44 30 20 6c 6f 63 6b 20 63 61 6e  r READ0 lock can
12b90 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2c  not be obtained,
12ba0 0a 20 20 2a 2a 20 20 20 20 20 74 68 65 20 63 68  .  **     the ch
12bb0 65 63 6b 70 6f 69 6e 74 20 66 61 69 6c 73 20 77  eckpoint fails w
12bc0 69 74 68 20 53 51 4c 49 54 45 5f 42 55 53 59 20  ith SQLITE_BUSY 
12bd0 28 6e 6f 72 6d 61 6c 6c 79 20 53 51 4c 69 74 65  (normally SQLite
12be0 20 77 6f 75 6c 64 0a 20 20 2a 2a 20 20 20 20 20   would.  **     
12bf0 70 72 6f 63 65 65 64 20 77 69 74 68 20 72 75 6e  proceed with run
12c00 6e 69 6e 67 20 61 20 70 61 73 73 69 76 65 20 63  ning a passive c
12c10 68 65 63 6b 70 6f 69 6e 74 20 69 6e 73 74 65 61  heckpoint instea
12c20 64 20 6f 66 20 66 61 69 6c 69 6e 67 29 2e 0a 20  d of failing).. 
12c30 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 41 74 74   **.  **   * Att
12c40 65 6d 70 74 73 20 74 6f 20 72 65 61 64 20 66 72  empts to read fr
12c50 6f 6d 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c  om the *-wal fil
12c60 65 20 6f 72 20 77 72 69 74 65 20 74 6f 20 74 68  e or write to th
12c70 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a  e database file.
12c80 20 20 2a 2a 20 20 20 20 20 64 6f 20 6e 6f 74 20    **     do not 
12c90 70 65 72 66 6f 72 6d 20 61 6e 79 20 49 4f 2e 20  perform any IO. 
12ca0 49 6e 73 74 65 61 64 2c 20 74 68 65 20 66 72 61  Instead, the fra
12cb0 6d 65 2f 70 61 67 65 20 63 6f 6d 62 69 6e 61 74  me/page combinat
12cc0 69 6f 6e 73 20 74 68 61 74 0a 20 20 2a 2a 20 20  ions that.  **  
12cd0 20 20 20 77 6f 75 6c 64 20 62 65 20 72 65 61 64     would be read
12ce0 2f 77 72 69 74 74 65 6e 20 61 72 65 20 72 65 63  /written are rec
12cf0 6f 72 64 65 64 20 69 6e 20 74 68 65 20 73 71 6c  orded in the sql
12d00 69 74 65 33 72 62 75 2e 61 46 72 61 6d 65 5b 5d  ite3rbu.aFrame[]
12d10 0a 20 20 2a 2a 20 20 20 20 20 61 72 72 61 79 2e  .  **     array.
12d20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 43  .  **.  **   * C
12d30 61 6c 6c 73 20 74 6f 20 78 53 68 6d 4c 6f 63 6b  alls to xShmLock
12d40 28 55 4e 4c 4f 43 4b 29 20 74 6f 20 72 65 6c 65  (UNLOCK) to rele
12d50 61 73 65 20 74 68 65 20 65 78 63 6c 75 73 69 76  ase the exclusiv
12d60 65 20 73 68 6d 20 57 52 49 54 45 52 2c 20 0a 20  e shm WRITER, . 
12d70 20 2a 2a 20 20 20 20 20 52 45 41 44 30 20 61 6e   **     READ0 an
12d80 64 20 43 48 45 43 4b 50 4f 49 4e 54 20 6c 6f 63  d CHECKPOINT loc
12d90 6b 73 20 74 61 6b 65 6e 20 61 73 20 70 61 72 74  ks taken as part
12da0 20 6f 66 20 74 68 65 20 63 68 65 63 6b 70 6f 69   of the checkpoi
12db0 6e 74 20 61 72 65 0a 20 20 2a 2a 20 20 20 20 20  nt are.  **     
12dc0 6e 6f 2d 6f 70 73 2e 20 54 68 65 73 65 20 6c 6f  no-ops. These lo
12dd0 63 6b 73 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  cks will not be 
12de0 72 65 6c 65 61 73 65 64 20 75 6e 74 69 6c 20 74  released until t
12df0 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20  he connection.  
12e00 2a 2a 20 20 20 20 20 69 73 20 63 6c 6f 73 65 64  **     is closed
12e10 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20  ..  **.  **   * 
12e20 41 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 78 53  Attempting to xS
12e30 79 6e 63 28 29 20 74 68 65 20 64 61 74 61 62 61  ync() the databa
12e40 73 65 20 66 69 6c 65 20 63 61 75 73 65 73 20 61  se file causes a
12e50 6e 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41  n SQLITE_INTERNA
12e60 4c 20 0a 20 20 2a 2a 20 20 20 20 20 65 72 72 6f  L .  **     erro
12e70 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 73 20  r..  **.  ** As 
12e80 61 20 72 65 73 75 6c 74 2c 20 75 6e 6c 65 73 73  a result, unless
12e90 20 61 6e 20 65 72 72 6f 72 20 28 69 2e 65 2e 20   an error (i.e. 
12ea0 4f 4f 4d 20 6f 72 20 53 51 4c 49 54 45 5f 42 55  OOM or SQLITE_BU
12eb0 53 59 29 20 6f 63 63 75 72 73 2c 20 74 68 65 0a  SY) occurs, the.
12ec0 20 20 2a 2a 20 63 68 65 63 6b 70 6f 69 6e 74 20    ** checkpoint 
12ed0 62 65 6c 6f 77 20 66 61 69 6c 73 20 77 69 74 68  below fails with
12ee0 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c   SQLITE_INTERNAL
12ef0 2c 20 61 6e 64 20 6c 65 61 76 65 73 20 74 68 65  , and leaves the
12f00 20 61 46 72 61 6d 65 5b 5d 0a 20 20 2a 2a 20 61   aFrame[].  ** a
12f10 72 72 61 79 20 70 6f 70 75 6c 61 74 65 64 20 77  rray populated w
12f20 69 74 68 20 61 20 73 65 74 20 6f 66 20 28 66 72  ith a set of (fr
12f30 61 6d 65 20 2d 3e 20 70 61 67 65 29 20 6d 61 70  ame -> page) map
12f40 70 69 6e 67 73 2e 20 42 65 63 61 75 73 65 20 74  pings. Because t
12f50 68 65 20 0a 20 20 2a 2a 20 57 52 49 54 45 52 2c  he .  ** WRITER,
12f60 20 43 48 45 43 4b 50 4f 49 4e 54 20 61 6e 64 20   CHECKPOINT and 
12f70 52 45 41 44 30 20 6c 6f 63 6b 73 20 61 72 65 20  READ0 locks are 
12f80 73 74 69 6c 6c 20 68 65 6c 64 2c 20 69 74 20 69  still held, it i
12f90 73 20 73 61 66 65 20 74 6f 20 63 6f 70 79 20 0a  s safe to copy .
12fa0 20 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74    ** data from t
12fb0 68 65 20 77 61 6c 20 66 69 6c 65 20 69 6e 74 6f  he wal file into
12fc0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
12fd0 6c 65 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  le according to 
12fe0 74 68 65 20 0a 20 20 2a 2a 20 63 6f 6e 74 65 6e  the .  ** conten
12ff0 74 73 20 6f 66 20 61 46 72 61 6d 65 5b 5d 2e 0a  ts of aFrame[]..
13000 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 72 63    */.  if( p->rc
13010 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
13020 20 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 20 20     int rc2;.    
13030 70 2d 3e 65 53 74 61 67 65 20 3d 20 52 42 55 5f  p->eStage = RBU_
13040 53 54 41 47 45 5f 43 41 50 54 55 52 45 3b 0a 20  STAGE_CAPTURE;. 
13050 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33     rc2 = sqlite3
13060 5f 65 78 65 63 28 70 2d 3e 64 62 4d 61 69 6e 2c  _exec(p->dbMain,
13070 20 22 50 52 41 47 4d 41 20 6d 61 69 6e 2e 77 61   "PRAGMA main.wa
13080 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 3d 72 65 73  l_checkpoint=res
13090 74 61 72 74 22 2c 20 30 2c 20 30 2c 30 29 3b 0a  tart", 0, 0,0);.
130a0 20 20 20 20 69 66 28 20 72 63 32 21 3d 53 51 4c      if( rc2!=SQL
130b0 49 54 45 5f 49 4e 54 45 52 4e 41 4c 20 29 20 70  ITE_INTERNAL ) p
130c0 2d 3e 72 63 20 3d 20 72 63 32 3b 0a 20 20 7d 0a  ->rc = rc2;.  }.
130d0 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
130e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
130f0 2d 3e 65 53 74 61 67 65 20 3d 20 52 42 55 5f 53  ->eStage = RBU_S
13100 54 41 47 45 5f 43 4b 50 54 3b 0a 20 20 20 20 70  TAGE_CKPT;.    p
13110 2d 3e 6e 53 74 65 70 20 3d 20 28 70 53 74 61 74  ->nStep = (pStat
13120 65 20 3f 20 70 53 74 61 74 65 2d 3e 6e 52 6f 77  e ? pState->nRow
13130 20 3a 20 30 29 3b 0a 20 20 20 20 70 2d 3e 61 42   : 0);.    p->aB
13140 75 66 20 3d 20 72 62 75 4d 61 6c 6c 6f 63 28 70  uf = rbuMalloc(p
13150 2c 20 70 2d 3e 70 67 73 7a 29 3b 0a 20 20 20 20  , p->pgsz);.    
13160 70 2d 3e 69 57 61 6c 43 6b 73 75 6d 20 3d 20 72  p->iWalCksum = r
13170 62 75 53 68 6d 43 68 65 63 6b 73 75 6d 28 70 29  buShmChecksum(p)
13180 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e  ;.  }..  if( p->
13190 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
131a0 20 70 53 74 61 74 65 20 26 26 20 70 53 74 61 74   pState && pStat
131b0 65 2d 3e 69 57 61 6c 43 6b 73 75 6d 21 3d 70 2d  e->iWalCksum!=p-
131c0 3e 69 57 61 6c 43 6b 73 75 6d 20 29 7b 0a 20 20  >iWalCksum ){.  
131d0 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
131e0 5f 44 4f 4e 45 3b 0a 20 20 20 20 70 2d 3e 65 53  _DONE;.    p->eS
131f0 74 61 67 65 20 3d 20 52 42 55 5f 53 54 41 47 45  tage = RBU_STAGE
13200 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  _DONE;.  }.}../*
13210 0a 2a 2a 20 43 61 6c 6c 65 64 20 77 68 65 6e 20  .** Called when 
13220 69 41 6d 74 20 62 79 74 65 73 20 61 72 65 20 72  iAmt bytes are r
13230 65 61 64 20 66 72 6f 6d 20 6f 66 66 73 65 74 20  ead from offset 
13240 69 4f 66 66 20 6f 66 20 74 68 65 20 77 61 6c 20  iOff of the wal 
13250 66 69 6c 65 20 77 68 69 6c 65 0a 2a 2a 20 74 68  file while.** th
13260 65 20 72 62 75 20 6f 62 6a 65 63 74 20 69 73 20  e rbu object is 
13270 69 6e 20 63 61 70 74 75 72 65 20 6d 6f 64 65 2e  in capture mode.
13280 20 52 65 63 6f 72 64 20 74 68 65 20 66 72 61 6d   Record the fram
13290 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
132a0 66 72 61 6d 65 0a 2a 2a 20 62 65 69 6e 67 20 72  frame.** being r
132b0 65 61 64 20 69 6e 20 74 68 65 20 61 46 72 61 6d  ead in the aFram
132c0 65 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74  e[] array..*/.st
132d0 61 74 69 63 20 69 6e 74 20 72 62 75 43 61 70 74  atic int rbuCapt
132e0 75 72 65 57 61 6c 52 65 61 64 28 73 71 6c 69 74  ureWalRead(sqlit
132f0 65 33 72 62 75 20 2a 70 52 62 75 2c 20 69 36 34  e3rbu *pRbu, i64
13300 20 69 4f 66 66 2c 20 69 6e 74 20 69 41 6d 74 29   iOff, int iAmt)
13310 7b 0a 20 20 63 6f 6e 73 74 20 75 33 32 20 6d 52  {.  const u32 mR
13320 65 71 20 3d 20 28 31 3c 3c 57 41 4c 5f 4c 4f 43  eq = (1<<WAL_LOC
13330 4b 5f 57 52 49 54 45 29 7c 28 31 3c 3c 57 41 4c  K_WRITE)|(1<<WAL
13340 5f 4c 4f 43 4b 5f 43 4b 50 54 29 7c 28 31 3c 3c  _LOCK_CKPT)|(1<<
13350 57 41 4c 5f 4c 4f 43 4b 5f 52 45 41 44 30 29 3b  WAL_LOCK_READ0);
13360 0a 20 20 75 33 32 20 69 46 72 61 6d 65 3b 0a 0a  .  u32 iFrame;..
13370 20 20 69 66 28 20 70 52 62 75 2d 3e 6d 4c 6f 63    if( pRbu->mLoc
13380 6b 21 3d 6d 52 65 71 20 29 7b 0a 20 20 20 20 70  k!=mReq ){.    p
13390 52 62 75 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45  Rbu->rc = SQLITE
133a0 5f 42 55 53 59 3b 0a 20 20 20 20 72 65 74 75 72  _BUSY;.    retur
133b0 6e 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41  n SQLITE_INTERNA
133c0 4c 3b 0a 20 20 7d 0a 0a 20 20 70 52 62 75 2d 3e  L;.  }..  pRbu->
133d0 70 67 73 7a 20 3d 20 69 41 6d 74 3b 0a 20 20 69  pgsz = iAmt;.  i
133e0 66 28 20 70 52 62 75 2d 3e 6e 46 72 61 6d 65 3d  f( pRbu->nFrame=
133f0 3d 70 52 62 75 2d 3e 6e 46 72 61 6d 65 41 6c 6c  =pRbu->nFrameAll
13400 6f 63 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 4e  oc ){.    int nN
13410 65 77 20 3d 20 28 70 52 62 75 2d 3e 6e 46 72 61  ew = (pRbu->nFra
13420 6d 65 41 6c 6c 6f 63 20 3f 20 70 52 62 75 2d 3e  meAlloc ? pRbu->
13430 6e 46 72 61 6d 65 41 6c 6c 6f 63 20 3a 20 36 34  nFrameAlloc : 64
13440 29 20 2a 20 32 3b 0a 20 20 20 20 52 62 75 46 72  ) * 2;.    RbuFr
13450 61 6d 65 20 2a 61 4e 65 77 3b 0a 20 20 20 20 61  ame *aNew;.    a
13460 4e 65 77 20 3d 20 28 52 62 75 46 72 61 6d 65 2a  New = (RbuFrame*
13470 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63  )sqlite3_realloc
13480 36 34 28 70 52 62 75 2d 3e 61 46 72 61 6d 65 2c  64(pRbu->aFrame,
13490 20 6e 4e 65 77 20 2a 20 73 69 7a 65 6f 66 28 52   nNew * sizeof(R
134a0 62 75 46 72 61 6d 65 29 29 3b 0a 20 20 20 20 69  buFrame));.    i
134b0 66 28 20 61 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( aNew==0 ) ret
134c0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
134d0 3b 0a 20 20 20 20 70 52 62 75 2d 3e 61 46 72 61  ;.    pRbu->aFra
134e0 6d 65 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 70  me = aNew;.    p
134f0 52 62 75 2d 3e 6e 46 72 61 6d 65 41 6c 6c 6f 63  Rbu->nFrameAlloc
13500 20 3d 20 6e 4e 65 77 3b 0a 20 20 7d 0a 0a 20 20   = nNew;.  }..  
13510 69 46 72 61 6d 65 20 3d 20 28 75 33 32 29 28 28  iFrame = (u32)((
13520 69 4f 66 66 2d 33 32 29 20 2f 20 28 69 36 34 29  iOff-32) / (i64)
13530 28 69 41 6d 74 2b 32 34 29 29 20 2b 20 31 3b 0a  (iAmt+24)) + 1;.
13540 20 20 69 66 28 20 70 52 62 75 2d 3e 69 4d 61 78    if( pRbu->iMax
13550 46 72 61 6d 65 3c 69 46 72 61 6d 65 20 29 20 70  Frame<iFrame ) p
13560 52 62 75 2d 3e 69 4d 61 78 46 72 61 6d 65 20 3d  Rbu->iMaxFrame =
13570 20 69 46 72 61 6d 65 3b 0a 20 20 70 52 62 75 2d   iFrame;.  pRbu-
13580 3e 61 46 72 61 6d 65 5b 70 52 62 75 2d 3e 6e 46  >aFrame[pRbu->nF
13590 72 61 6d 65 5d 2e 69 57 61 6c 46 72 61 6d 65 20  rame].iWalFrame 
135a0 3d 20 69 46 72 61 6d 65 3b 0a 20 20 70 52 62 75  = iFrame;.  pRbu
135b0 2d 3e 61 46 72 61 6d 65 5b 70 52 62 75 2d 3e 6e  ->aFrame[pRbu->n
135c0 46 72 61 6d 65 5d 2e 69 44 62 50 61 67 65 20 3d  Frame].iDbPage =
135d0 20 30 3b 0a 20 20 70 52 62 75 2d 3e 6e 46 72 61   0;.  pRbu->nFra
135e0 6d 65 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20 53  me++;.  return S
135f0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
13600 2a 2a 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 61  ** Called when a
13610 20 70 61 67 65 20 6f 66 20 64 61 74 61 20 69 73   page of data is
13620 20 77 72 69 74 74 65 6e 20 74 6f 20 6f 66 66 73   written to offs
13630 65 74 20 69 4f 66 66 20 6f 66 20 74 68 65 20 64  et iOff of the d
13640 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20  atabase.** file 
13650 77 68 69 6c 65 20 74 68 65 20 72 62 75 20 68 61  while the rbu ha
13660 6e 64 6c 65 20 69 73 20 69 6e 20 63 61 70 74 75  ndle is in captu
13670 72 65 20 6d 6f 64 65 2e 20 52 65 63 6f 72 64 20  re mode. Record 
13680 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
13690 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20  .** of the page 
136a0 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 69 6e  being written in
136b0 20 74 68 65 20 61 46 72 61 6d 65 5b 5d 20 61 72   the aFrame[] ar
136c0 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ray..*/.static i
136d0 6e 74 20 72 62 75 43 61 70 74 75 72 65 44 62 57  nt rbuCaptureDbW
136e0 72 69 74 65 28 73 71 6c 69 74 65 33 72 62 75 20  rite(sqlite3rbu 
136f0 2a 70 52 62 75 2c 20 69 36 34 20 69 4f 66 66 29  *pRbu, i64 iOff)
13700 7b 0a 20 20 70 52 62 75 2d 3e 61 46 72 61 6d 65  {.  pRbu->aFrame
13710 5b 70 52 62 75 2d 3e 6e 46 72 61 6d 65 2d 31 5d  [pRbu->nFrame-1]
13720 2e 69 44 62 50 61 67 65 20 3d 20 28 75 33 32 29  .iDbPage = (u32)
13730 28 69 4f 66 66 20 2f 20 70 52 62 75 2d 3e 70 67  (iOff / pRbu->pg
13740 73 7a 29 20 2b 20 31 3b 0a 20 20 72 65 74 75 72  sz) + 1;.  retur
13750 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
13760 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 61  /*.** This is ca
13770 6c 6c 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  lled as part of 
13780 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 63  an incremental c
13790 68 65 63 6b 70 6f 69 6e 74 20 6f 70 65 72 61 74  heckpoint operat
137a0 69 6f 6e 2e 20 43 6f 70 79 0a 2a 2a 20 61 20 73  ion. Copy.** a s
137b0 69 6e 67 6c 65 20 66 72 61 6d 65 20 6f 66 20 64  ingle frame of d
137c0 61 74 61 20 66 72 6f 6d 20 74 68 65 20 77 61 6c  ata from the wal
137d0 20 66 69 6c 65 20 69 6e 74 6f 20 74 68 65 20 64   file into the d
137e0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 61 73  atabase file, as
137f0 0a 2a 2a 20 69 6e 64 69 63 61 74 65 64 20 62 79  .** indicated by
13800 20 74 68 65 20 52 62 75 46 72 61 6d 65 20 6f 62   the RbuFrame ob
13810 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ject..*/.static 
13820 76 6f 69 64 20 72 62 75 43 68 65 63 6b 70 6f 69  void rbuCheckpoi
13830 6e 74 46 72 61 6d 65 28 73 71 6c 69 74 65 33 72  ntFrame(sqlite3r
13840 62 75 20 2a 70 2c 20 52 62 75 46 72 61 6d 65 20  bu *p, RbuFrame 
13850 2a 70 46 72 61 6d 65 29 7b 0a 20 20 73 71 6c 69  *pFrame){.  sqli
13860 74 65 33 5f 66 69 6c 65 20 2a 70 57 61 6c 20 3d  te3_file *pWal =
13870 20 70 2d 3e 70 54 61 72 67 65 74 46 64 2d 3e 70   p->pTargetFd->p
13880 57 61 6c 46 64 2d 3e 70 52 65 61 6c 3b 0a 20 20  WalFd->pReal;.  
13890 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 44  sqlite3_file *pD
138a0 62 20 3d 20 70 2d 3e 70 54 61 72 67 65 74 46 64  b = p->pTargetFd
138b0 2d 3e 70 52 65 61 6c 3b 0a 20 20 69 36 34 20 69  ->pReal;.  i64 i
138c0 4f 66 66 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  Off;..  assert( 
138d0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
138e0 20 29 3b 0a 20 20 69 4f 66 66 20 3d 20 28 69 36   );.  iOff = (i6
138f0 34 29 28 70 46 72 61 6d 65 2d 3e 69 57 61 6c 46  4)(pFrame->iWalF
13900 72 61 6d 65 2d 31 29 20 2a 20 28 70 2d 3e 70 67  rame-1) * (p->pg
13910 73 7a 20 2b 20 32 34 29 20 2b 20 33 32 20 2b 20  sz + 24) + 32 + 
13920 32 34 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 70 57  24;.  p->rc = pW
13930 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 52  al->pMethods->xR
13940 65 61 64 28 70 57 61 6c 2c 20 70 2d 3e 61 42 75  ead(pWal, p->aBu
13950 66 2c 20 70 2d 3e 70 67 73 7a 2c 20 69 4f 66 66  f, p->pgsz, iOff
13960 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 20 29  );.  if( p->rc )
13970 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 4f 66 66   return;..  iOff
13980 20 3d 20 28 69 36 34 29 28 70 46 72 61 6d 65 2d   = (i64)(pFrame-
13990 3e 69 44 62 50 61 67 65 2d 31 29 20 2a 20 70 2d  >iDbPage-1) * p-
139a0 3e 70 67 73 7a 3b 0a 20 20 70 2d 3e 72 63 20 3d  >pgsz;.  p->rc =
139b0 20 70 44 62 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e   pDb->pMethods->
139c0 78 57 72 69 74 65 28 70 44 62 2c 20 70 2d 3e 61  xWrite(pDb, p->a
139d0 42 75 66 2c 20 70 2d 3e 70 67 73 7a 2c 20 69 4f  Buf, p->pgsz, iO
139e0 66 66 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  ff);.}.../*.** T
139f0 61 6b 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ake an EXCLUSIVE
13a00 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
13a10 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73  abase file..*/.s
13a20 74 61 74 69 63 20 76 6f 69 64 20 72 62 75 4c 6f  tatic void rbuLo
13a30 63 6b 44 61 74 61 62 61 73 65 28 73 71 6c 69 74  ckDatabase(sqlit
13a40 65 33 72 62 75 20 2a 70 29 7b 0a 20 20 73 71 6c  e3rbu *p){.  sql
13a50 69 74 65 33 5f 66 69 6c 65 20 2a 70 52 65 61 6c  ite3_file *pReal
13a60 20 3d 20 70 2d 3e 70 54 61 72 67 65 74 46 64 2d   = p->pTargetFd-
13a70 3e 70 52 65 61 6c 3b 0a 20 20 61 73 73 65 72 74  >pReal;.  assert
13a80 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
13a90 4f 4b 20 29 3b 0a 20 20 70 2d 3e 72 63 20 3d 20  OK );.  p->rc = 
13aa0 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d  pReal->pMethods-
13ab0 3e 78 4c 6f 63 6b 28 70 52 65 61 6c 2c 20 53 51  >xLock(pReal, SQ
13ac0 4c 49 54 45 5f 4c 4f 43 4b 5f 53 48 41 52 45 44  LITE_LOCK_SHARED
13ad0 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  );.  if( p->rc==
13ae0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
13af0 20 70 2d 3e 72 63 20 3d 20 70 52 65 61 6c 2d 3e   p->rc = pReal->
13b00 70 4d 65 74 68 6f 64 73 2d 3e 78 4c 6f 63 6b 28  pMethods->xLock(
13b10 70 52 65 61 6c 2c 20 53 51 4c 49 54 45 5f 4c 4f  pReal, SQLITE_LO
13b20 43 4b 5f 45 58 43 4c 55 53 49 56 45 29 3b 0a 20  CK_EXCLUSIVE);. 
13b30 20 7d 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65   }.}..#if define
13b40 64 28 5f 57 49 4e 33 32 5f 57 43 45 29 0a 73 74  d(_WIN32_WCE).st
13b50 61 74 69 63 20 4c 50 57 53 54 52 20 72 62 75 57  atic LPWSTR rbuW
13b60 69 6e 55 74 66 38 54 6f 55 6e 69 63 6f 64 65 28  inUtf8ToUnicode(
13b70 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
13b80 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e 43  ename){.  int nC
13b90 68 61 72 3b 0a 20 20 4c 50 57 53 54 52 20 7a 57  har;.  LPWSTR zW
13ba0 69 64 65 46 69 6c 65 6e 61 6d 65 3b 0a 0a 20 20  ideFilename;..  
13bb0 6e 43 68 61 72 20 3d 20 4d 75 6c 74 69 42 79 74  nChar = MultiByt
13bc0 65 54 6f 57 69 64 65 43 68 61 72 28 43 50 5f 55  eToWideChar(CP_U
13bd0 54 46 38 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d  TF8, 0, zFilenam
13be0 65 2c 20 2d 31 2c 20 4e 55 4c 4c 2c 20 30 29 3b  e, -1, NULL, 0);
13bf0 0a 20 20 69 66 28 20 6e 43 68 61 72 3d 3d 30 20  .  if( nChar==0 
13c00 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
13c10 0a 20 20 7d 0a 20 20 7a 57 69 64 65 46 69 6c 65  .  }.  zWideFile
13c20 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d  name = sqlite3_m
13c30 61 6c 6c 6f 63 36 34 28 20 6e 43 68 61 72 2a 73  alloc64( nChar*s
13c40 69 7a 65 6f 66 28 7a 57 69 64 65 46 69 6c 65 6e  izeof(zWideFilen
13c50 61 6d 65 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28  ame[0]) );.  if(
13c60 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 3d 3d   zWideFilename==
13c70 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
13c80 30 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28  0;.  }.  memset(
13c90 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c 20 30  zWideFilename, 0
13ca0 2c 20 6e 43 68 61 72 2a 73 69 7a 65 6f 66 28 7a  , nChar*sizeof(z
13cb0 57 69 64 65 46 69 6c 65 6e 61 6d 65 5b 30 5d 29  WideFilename[0])
13cc0 29 3b 0a 20 20 6e 43 68 61 72 20 3d 20 4d 75 6c  );.  nChar = Mul
13cd0 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72  tiByteToWideChar
13ce0 28 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 46 69  (CP_UTF8, 0, zFi
13cf0 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 57 69 64  lename, -1, zWid
13d00 65 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20  eFilename,.     
13d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d20 20 20 20 20 20 20 20 20 20 20 20 6e 43 68 61 72             nChar
13d30 29 3b 0a 20 20 69 66 28 20 6e 43 68 61 72 3d 3d  );.  if( nChar==
13d40 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
13d50 5f 66 72 65 65 28 7a 57 69 64 65 46 69 6c 65 6e  _free(zWideFilen
13d60 61 6d 65 29 3b 0a 20 20 20 20 7a 57 69 64 65 46  ame);.    zWideF
13d70 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d  ilename = 0;.  }
13d80 0a 20 20 72 65 74 75 72 6e 20 7a 57 69 64 65 46  .  return zWideF
13d90 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 23 65 6e 64 69  ilename;.}.#endi
13da0 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 52 42 55  f../*.** The RBU
13db0 20 68 61 6e 64 6c 65 20 69 73 20 63 75 72 72 65   handle is curre
13dc0 6e 74 6c 79 20 69 6e 20 52 42 55 5f 53 54 41 47  ntly in RBU_STAG
13dd0 45 5f 4f 41 4c 20 73 74 61 74 65 2c 20 77 69 74  E_OAL state, wit
13de0 68 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 0a  h a SHARED lock.
13df0 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ** on the databa
13e00 73 65 20 66 69 6c 65 2e 20 54 68 69 73 20 70 72  se file. This pr
13e10 6f 63 20 6d 6f 76 65 73 20 74 68 65 20 2a 2d 6f  oc moves the *-o
13e20 61 6c 20 66 69 6c 65 20 74 6f 20 74 68 65 20 2a  al file to the *
13e30 2d 77 61 6c 20 70 61 74 68 2c 0a 2a 2a 20 74 68  -wal path,.** th
13e40 65 6e 20 72 65 6f 70 65 6e 73 20 74 68 65 20 64  en reopens the d
13e50 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 74 68  atabase file (th
13e60 69 73 20 74 69 6d 65 20 69 6e 20 76 61 6e 69 6c  is time in vanil
13e70 6c 61 2c 20 6e 6f 6e 2d 6f 61 6c 2c 20 57 41 4c  la, non-oal, WAL
13e80 20 6d 6f 64 65 29 2e 0a 2a 2a 20 49 66 20 61 6e   mode)..** If an
13e90 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c   error occurs, l
13ea0 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 63 6f  eave an error co
13eb0 64 65 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73  de and error mes
13ec0 73 61 67 65 20 69 6e 20 74 68 65 20 72 62 75 20  sage in the rbu 
13ed0 0a 2a 2a 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73  .** handle..*/.s
13ee0 74 61 74 69 63 20 76 6f 69 64 20 72 62 75 4d 6f  tatic void rbuMo
13ef0 76 65 4f 61 6c 46 69 6c 65 28 73 71 6c 69 74 65  veOalFile(sqlite
13f00 33 72 62 75 20 2a 70 29 7b 0a 20 20 63 6f 6e 73  3rbu *p){.  cons
13f10 74 20 63 68 61 72 20 2a 7a 42 61 73 65 20 3d 20  t char *zBase = 
13f20 73 71 6c 69 74 65 33 5f 64 62 5f 66 69 6c 65 6e  sqlite3_db_filen
13f30 61 6d 65 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 22  ame(p->dbMain, "
13f40 6d 61 69 6e 22 29 3b 0a 0a 20 20 63 68 61 72 20  main");..  char 
13f50 2a 7a 57 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f  *zWal = sqlite3_
13f60 6d 70 72 69 6e 74 66 28 22 25 73 2d 77 61 6c 22  mprintf("%s-wal"
13f70 2c 20 7a 42 61 73 65 29 3b 0a 20 20 63 68 61 72  , zBase);.  char
13f80 20 2a 7a 4f 61 6c 20 3d 20 73 71 6c 69 74 65 33   *zOal = sqlite3
13f90 5f 6d 70 72 69 6e 74 66 28 22 25 73 2d 6f 61 6c  _mprintf("%s-oal
13fa0 22 2c 20 7a 42 61 73 65 29 3b 0a 0a 20 20 61 73  ", zBase);..  as
13fb0 73 65 72 74 28 20 70 2d 3e 65 53 74 61 67 65 3d  sert( p->eStage=
13fc0 3d 52 42 55 5f 53 54 41 47 45 5f 4d 4f 56 45 20  =RBU_STAGE_MOVE 
13fd0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
13fe0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
13ff0 20 70 2d 3e 7a 45 72 72 6d 73 67 3d 3d 30 20 29   p->zErrmsg==0 )
14000 3b 0a 20 20 69 66 28 20 7a 57 61 6c 3d 3d 30 20  ;.  if( zWal==0 
14010 7c 7c 20 7a 4f 61 6c 3d 3d 30 20 29 7b 0a 20 20  || zOal==0 ){.  
14020 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
14030 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b  _NOMEM;.  }else{
14040 0a 20 20 20 20 2f 2a 20 4d 6f 76 65 20 74 68 65  .    /* Move the
14050 20 2a 2d 6f 61 6c 20 66 69 6c 65 20 74 6f 20 2a   *-oal file to *
14060 2d 77 61 6c 2e 20 41 74 20 74 68 69 73 20 70 6f  -wal. At this po
14070 69 6e 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70  int connection p
14080 2d 3e 64 62 20 69 73 0a 20 20 20 20 2a 2a 20 68  ->db is.    ** h
14090 6f 6c 64 69 6e 67 20 61 20 53 48 41 52 45 44 20  olding a SHARED 
140a0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 72 67  lock on the targ
140b0 65 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  et database file
140c0 20 28 62 65 63 61 75 73 65 20 69 74 20 69 73 0a   (because it is.
140d0 20 20 20 20 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f      ** in WAL mo
140e0 64 65 29 2e 20 53 6f 20 6e 6f 20 6f 74 68 65 72  de). So no other
140f0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61 79 20   connection may 
14100 62 65 20 77 72 69 74 69 6e 67 20 74 68 65 20 64  be writing the d
14110 62 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  b. .    **.    *
14120 2a 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 65 6e  * In order to en
14130 73 75 72 65 20 74 68 61 74 20 74 68 65 72 65 20  sure that there 
14140 61 72 65 20 6e 6f 20 64 61 74 61 62 61 73 65 20  are no database 
14150 72 65 61 64 65 72 73 2c 20 61 6e 20 45 58 43 4c  readers, an EXCL
14160 55 53 49 56 45 0a 20 20 20 20 2a 2a 20 6c 6f 63  USIVE.    ** loc
14170 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 68 65  k is obtained he
14180 72 65 20 62 65 66 6f 72 65 20 74 68 65 20 2a 2d  re before the *-
14190 6f 61 6c 20 69 73 20 6d 6f 76 65 64 20 74 6f 20  oal is moved to 
141a0 2a 2d 77 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20  *-wal..    */.  
141b0 20 20 72 62 75 4c 6f 63 6b 44 61 74 61 62 61 73    rbuLockDatabas
141c0 65 28 70 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  e(p);.    if( p-
141d0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
141e0 7b 0a 20 20 20 20 20 20 72 62 75 46 69 6c 65 53  {.      rbuFileS
141f0 75 66 66 69 78 33 28 7a 42 61 73 65 2c 20 7a 57  uffix3(zBase, zW
14200 61 6c 29 3b 0a 20 20 20 20 20 20 72 62 75 46 69  al);.      rbuFi
14210 6c 65 53 75 66 66 69 78 33 28 7a 42 61 73 65 2c  leSuffix3(zBase,
14220 20 7a 4f 61 6c 29 3b 0a 0a 20 20 20 20 20 20 2f   zOal);..      /
14230 2a 20 52 65 2d 6f 70 65 6e 20 74 68 65 20 64 61  * Re-open the da
14240 74 61 62 61 73 65 73 2e 20 2a 2f 0a 20 20 20 20  tabases. */.    
14250 20 20 72 62 75 4f 62 6a 49 74 65 72 46 69 6e 61    rbuObjIterFina
14260 6c 69 7a 65 28 26 70 2d 3e 6f 62 6a 69 74 65 72  lize(&p->objiter
14270 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
14280 5f 63 6c 6f 73 65 28 70 2d 3e 64 62 4d 61 69 6e  _close(p->dbMain
14290 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
142a0 5f 63 6c 6f 73 65 28 70 2d 3e 64 62 52 62 75 29  _close(p->dbRbu)
142b0 3b 0a 20 20 20 20 20 20 70 2d 3e 64 62 4d 61 69  ;.      p->dbMai
142c0 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e  n = 0;.      p->
142d0 64 62 52 62 75 20 3d 20 30 3b 0a 0a 23 69 66 20  dbRbu = 0;..#if 
142e0 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 5f 57  defined(_WIN32_W
142f0 43 45 29 0a 20 20 20 20 20 20 7b 0a 20 20 20 20  CE).      {.    
14300 20 20 20 20 4c 50 57 53 54 52 20 7a 57 69 64 65      LPWSTR zWide
14310 4f 61 6c 3b 0a 20 20 20 20 20 20 20 20 4c 50 57  Oal;.        LPW
14320 53 54 52 20 7a 57 69 64 65 57 61 6c 3b 0a 0a 20  STR zWideWal;.. 
14330 20 20 20 20 20 20 20 7a 57 69 64 65 4f 61 6c 20         zWideOal 
14340 3d 20 72 62 75 57 69 6e 55 74 66 38 54 6f 55 6e  = rbuWinUtf8ToUn
14350 69 63 6f 64 65 28 7a 4f 61 6c 29 3b 0a 20 20 20  icode(zOal);.   
14360 20 20 20 20 20 69 66 28 20 7a 57 69 64 65 4f 61       if( zWideOa
14370 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  l ){.          z
14380 57 69 64 65 57 61 6c 20 3d 20 72 62 75 57 69 6e  WideWal = rbuWin
14390 55 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a 57  Utf8ToUnicode(zW
143a0 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  al);.          i
143b0 66 28 20 7a 57 69 64 65 57 61 6c 20 29 7b 0a 20  f( zWideWal ){. 
143c0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 4d             if( M
143d0 6f 76 65 46 69 6c 65 57 28 7a 57 69 64 65 4f 61  oveFileW(zWideOa
143e0 6c 2c 20 7a 57 69 64 65 57 61 6c 29 20 29 7b 0a  l, zWideWal) ){.
143f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
14400 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  >rc = SQLITE_OK;
14410 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
14420 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
14430 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
14440 5f 49 4f 45 52 52 3b 0a 20 20 20 20 20 20 20 20  _IOERR;.        
14450 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
14460 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
14470 57 69 64 65 57 61 6c 29 3b 0a 20 20 20 20 20 20  WideWal);.      
14480 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14490 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53         p->rc = S
144a0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
144b0 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  M;.          }. 
144c0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
144d0 5f 66 72 65 65 28 7a 57 69 64 65 4f 61 6c 29 3b  _free(zWideOal);
144e0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
144f0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20            p->rc 
14500 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  = SQLITE_IOERR_N
14510 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 7d 0a  OMEM;.        }.
14520 20 20 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20        }.#else.  
14530 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 65 6e 61      p->rc = rena
14540 6d 65 28 7a 4f 61 6c 2c 20 7a 57 61 6c 29 20 3f  me(zOal, zWal) ?
14550 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 3a 20   SQLITE_IOERR : 
14560 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69  SQLITE_OK;.#endi
14570 66 0a 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  f..      if( p->
14580 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
14590 0a 20 20 20 20 20 20 20 20 72 62 75 4f 70 65 6e  .        rbuOpen
145a0 44 61 74 61 62 61 73 65 28 70 29 3b 0a 20 20 20  Database(p);.   
145b0 20 20 20 20 20 72 62 75 53 65 74 75 70 43 68 65       rbuSetupChe
145c0 63 6b 70 6f 69 6e 74 28 70 2c 20 30 29 3b 0a 20  ckpoint(p, 0);. 
145d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
145e0 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ..  sqlite3_free
145f0 28 7a 57 61 6c 29 3b 0a 20 20 73 71 6c 69 74 65  (zWal);.  sqlite
14600 33 5f 66 72 65 65 28 7a 4f 61 6c 29 3b 0a 7d 0a  3_free(zOal);.}.
14610 0a 2f 2a 0a 2a 2a 20 54 68 65 20 53 45 4c 45 43  ./*.** The SELEC
14620 54 20 73 74 61 74 65 6d 65 6e 74 20 69 74 65 72  T statement iter
14630 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20 74 68  ating through th
14640 65 20 6b 65 79 73 20 66 6f 72 20 74 68 65 20 63  e keys for the c
14650 75 72 72 65 6e 74 20 6f 62 6a 65 63 74 0a 2a 2a  urrent object.**
14660 20 28 70 2d 3e 6f 62 6a 69 74 65 72 2e 70 53 65   (p->objiter.pSe
14670 6c 65 63 74 29 20 63 75 72 72 65 6e 74 6c 79 20  lect) currently 
14680 70 6f 69 6e 74 73 20 74 6f 20 61 20 76 61 6c 69  points to a vali
14690 64 20 72 6f 77 2e 20 54 68 69 73 20 66 75 6e 63  d row. This func
146a0 74 69 6f 6e 0a 2a 2a 20 64 65 74 65 72 6d 69 6e  tion.** determin
146b0 65 73 20 74 68 65 20 74 79 70 65 20 6f 66 20 6f  es the type of o
146c0 70 65 72 61 74 69 6f 6e 20 72 65 71 75 65 73 74  peration request
146d0 65 64 20 62 79 20 74 68 69 73 20 72 6f 77 20 61  ed by this row a
146e0 6e 64 20 72 65 74 75 72 6e 73 0a 2a 2a 20 6f 6e  nd returns.** on
146f0 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
14700 6e 67 20 76 61 6c 75 65 73 20 74 6f 20 69 6e 64  ng values to ind
14710 69 63 61 74 65 20 74 68 65 20 72 65 73 75 6c 74  icate the result
14720 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 52 42  :.**.**     * RB
14730 55 5f 49 4e 53 45 52 54 0a 2a 2a 20 20 20 20 20  U_INSERT.**     
14740 2a 20 52 42 55 5f 44 45 4c 45 54 45 0a 2a 2a 20  * RBU_DELETE.** 
14750 20 20 20 20 2a 20 52 42 55 5f 49 44 58 5f 44 45      * RBU_IDX_DE
14760 4c 45 54 45 0a 2a 2a 20 20 20 20 20 2a 20 52 42  LETE.**     * RB
14770 55 5f 55 50 44 41 54 45 0a 2a 2a 0a 2a 2a 20 49  U_UPDATE.**.** I
14780 66 20 52 42 55 5f 55 50 44 41 54 45 20 69 73 20  f RBU_UPDATE is 
14790 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 6f  returned, then o
147a0 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 20 2a  utput variable *
147b0 70 7a 4d 61 73 6b 20 69 73 20 73 65 74 20 74 6f  pzMask is set to
147c0 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  .** point to the
147d0 20 74 65 78 74 20 76 61 6c 75 65 20 69 6e 64 69   text value indi
147e0 63 61 74 69 6e 67 20 74 68 65 20 63 6f 6c 75 6d  cating the colum
147f0 6e 73 20 74 6f 20 75 70 64 61 74 65 2e 0a 2a 2a  ns to update..**
14800 0a 2a 2a 20 49 66 20 74 68 65 20 72 62 75 5f 63  .** If the rbu_c
14810 6f 6e 74 72 6f 6c 20 66 69 65 6c 64 20 63 6f 6e  ontrol field con
14820 74 61 69 6e 73 20 61 6e 20 69 6e 76 61 6c 69 64  tains an invalid
14830 20 76 61 6c 75 65 2c 20 61 6e 20 65 72 72 6f 72   value, an error
14840 20 63 6f 64 65 20 61 6e 64 0a 2a 2a 20 6d 65 73   code and.** mes
14850 73 61 67 65 20 61 72 65 20 6c 65 66 74 20 69 6e  sage are left in
14860 20 74 68 65 20 52 42 55 20 68 61 6e 64 6c 65 20   the RBU handle 
14870 61 6e 64 20 7a 65 72 6f 20 72 65 74 75 72 6e 65  and zero returne
14880 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
14890 20 72 62 75 53 74 65 70 54 79 70 65 28 73 71 6c   rbuStepType(sql
148a0 69 74 65 33 72 62 75 20 2a 70 2c 20 63 6f 6e 73  ite3rbu *p, cons
148b0 74 20 63 68 61 72 20 2a 2a 70 7a 4d 61 73 6b 29  t char **pzMask)
148c0 7b 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70  {.  int iCol = p
148d0 2d 3e 6f 62 6a 69 74 65 72 2e 6e 43 6f 6c 3b 20  ->objiter.nCol; 
148e0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
148f0 72 62 75 5f 63 6f 6e 74 72 6f 6c 20 63 6f 6c 75  rbu_control colu
14900 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 20  mn */.  int res 
14910 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
14920 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
14930 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 73 77  n value */..  sw
14940 69 74 63 68 28 20 73 71 6c 69 74 65 33 5f 63 6f  itch( sqlite3_co
14950 6c 75 6d 6e 5f 74 79 70 65 28 70 2d 3e 6f 62 6a  lumn_type(p->obj
14960 69 74 65 72 2e 70 53 65 6c 65 63 74 2c 20 69 43  iter.pSelect, iC
14970 6f 6c 29 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ol) ){.    case 
14980 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a 20  SQLITE_INTEGER: 
14990 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 56 61 6c  {.      int iVal
149a0 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
149b0 6e 5f 69 6e 74 28 70 2d 3e 6f 62 6a 69 74 65 72  n_int(p->objiter
149c0 2e 70 53 65 6c 65 63 74 2c 20 69 43 6f 6c 29 3b  .pSelect, iCol);
149d0 0a 20 20 20 20 20 20 73 77 69 74 63 68 28 20 69  .      switch( i
149e0 56 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 63  Val ){.        c
149f0 61 73 65 20 30 3a 20 72 65 73 20 3d 20 52 42 55  ase 0: res = RBU
14a00 5f 49 4e 53 45 52 54 3b 20 20 20 20 20 62 72 65  _INSERT;     bre
14a10 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65  ak;.        case
14a20 20 31 3a 20 72 65 73 20 3d 20 52 42 55 5f 44 45   1: res = RBU_DE
14a30 4c 45 54 45 3b 20 20 20 20 20 62 72 65 61 6b 3b  LETE;     break;
14a40 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 32 3a  .        case 2:
14a50 20 72 65 73 20 3d 20 52 42 55 5f 52 45 50 4c 41   res = RBU_REPLA
14a60 43 45 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  CE;    break;.  
14a70 20 20 20 20 20 20 63 61 73 65 20 33 3a 20 72 65        case 3: re
14a80 73 20 3d 20 52 42 55 5f 49 44 58 5f 44 45 4c 45  s = RBU_IDX_DELE
14a90 54 45 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  TE; break;.     
14aa0 20 20 20 63 61 73 65 20 34 3a 20 72 65 73 20 3d     case 4: res =
14ab0 20 52 42 55 5f 49 44 58 5f 49 4e 53 45 52 54 3b   RBU_IDX_INSERT;
14ac0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
14ad0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
14ae0 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c   }..    case SQL
14af0 49 54 45 5f 54 45 58 54 3a 20 7b 0a 20 20 20 20  ITE_TEXT: {.    
14b00 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
14b10 20 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74   char *z = sqlit
14b20 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
14b30 2d 3e 6f 62 6a 69 74 65 72 2e 70 53 65 6c 65 63  ->objiter.pSelec
14b40 74 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20  t, iCol);.      
14b50 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20  if( z==0 ){.    
14b60 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
14b70 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
14b80 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2a  }else{.        *
14b90 70 7a 4d 61 73 6b 20 3d 20 28 63 6f 6e 73 74 20  pzMask = (const 
14ba0 63 68 61 72 2a 29 7a 3b 0a 20 20 20 20 20 20 7d  char*)z;.      }
14bb0 0a 20 20 20 20 20 20 72 65 73 20 3d 20 52 42 55  .      res = RBU
14bc0 5f 55 50 44 41 54 45 3b 0a 0a 20 20 20 20 20 20  _UPDATE;..      
14bd0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
14be0 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
14bf0 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 69   break;.  }..  i
14c00 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20  f( res==0 ){.   
14c10 20 72 62 75 42 61 64 43 6f 6e 74 72 6f 6c 45 72   rbuBadControlEr
14c20 72 6f 72 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65  ror(p);.  }.  re
14c30 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 23 69 66  turn res;.}..#if
14c40 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
14c50 0a 2f 2a 0a 2a 2a 20 41 73 73 65 72 74 20 74 68  ./*.** Assert th
14c60 61 74 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 20 6f  at column iCol o
14c70 66 20 73 74 61 74 65 6d 65 6e 74 20 70 53 74 6d  f statement pStm
14c80 74 20 69 73 20 6e 61 6d 65 64 20 7a 4e 61 6d 65  t is named zName
14c90 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
14ca0 20 61 73 73 65 72 74 43 6f 6c 75 6d 6e 4e 61 6d   assertColumnNam
14cb0 65 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a  e(sqlite3_stmt *
14cc0 70 53 74 6d 74 2c 20 69 6e 74 20 69 43 6f 6c 2c  pStmt, int iCol,
14cd0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
14ce0 6d 65 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  me){.  const cha
14cf0 72 20 2a 7a 43 6f 6c 20 3d 20 73 71 6c 69 74 65  r *zCol = sqlite
14d00 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53  3_column_name(pS
14d10 74 6d 74 2c 20 69 43 6f 6c 29 3b 0a 20 20 61 73  tmt, iCol);.  as
14d20 73 65 72 74 28 20 30 3d 3d 73 71 6c 69 74 65 33  sert( 0==sqlite3
14d30 5f 73 74 72 69 63 6d 70 28 7a 4e 61 6d 65 2c 20  _stricmp(zName, 
14d40 7a 43 6f 6c 29 20 29 3b 0a 7d 0a 23 65 6c 73 65  zCol) );.}.#else
14d50 0a 23 20 64 65 66 69 6e 65 20 61 73 73 65 72 74  .# define assert
14d60 43 6f 6c 75 6d 6e 4e 61 6d 65 28 78 2c 79 2c 7a  ColumnName(x,y,z
14d70 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
14d80 41 72 67 75 6d 65 6e 74 20 65 54 79 70 65 20 6d  Argument eType m
14d90 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20 52 42  ust be one of RB
14da0 55 5f 49 4e 53 45 52 54 2c 20 52 42 55 5f 44 45  U_INSERT, RBU_DE
14db0 4c 45 54 45 2c 20 52 42 55 5f 49 44 58 5f 49 4e  LETE, RBU_IDX_IN
14dc0 53 45 52 54 20 6f 72 0a 2a 2a 20 52 42 55 5f 49  SERT or.** RBU_I
14dd0 44 58 5f 44 45 4c 45 54 45 2e 20 54 68 69 73 20  DX_DELETE. This 
14de0 66 75 6e 63 74 69 6f 6e 20 70 65 72 66 6f 72 6d  function perform
14df0 73 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 61 20  s the work of a 
14e00 73 69 6e 67 6c 65 0a 2a 2a 20 73 71 6c 69 74 65  single.** sqlite
14e10 33 72 62 75 5f 73 74 65 70 28 29 20 63 61 6c 6c  3rbu_step() call
14e20 20 66 6f 72 20 74 68 65 20 74 79 70 65 20 6f 66   for the type of
14e30 20 6f 70 65 72 61 74 69 6f 6e 20 73 70 65 63 69   operation speci
14e40 66 69 65 64 20 62 79 20 65 54 79 70 65 2e 0a 2a  fied by eType..*
14e50 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62  /.static void rb
14e60 75 53 74 65 70 4f 6e 65 4f 70 28 73 71 6c 69 74  uStepOneOp(sqlit
14e70 65 33 72 62 75 20 2a 70 2c 20 69 6e 74 20 65 54  e3rbu *p, int eT
14e80 79 70 65 29 7b 0a 20 20 52 62 75 4f 62 6a 49 74  ype){.  RbuObjIt
14e90 65 72 20 2a 70 49 74 65 72 20 3d 20 26 70 2d 3e  er *pIter = &p->
14ea0 6f 62 6a 69 74 65 72 3b 0a 20 20 73 71 6c 69 74  objiter;.  sqlit
14eb0 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a  e3_value *pVal;.
14ec0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
14ed0 70 57 72 69 74 65 72 3b 0a 20 20 69 6e 74 20 69  pWriter;.  int i
14ee0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ;..  assert( p->
14ef0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
14f00 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65  .  assert( eType
14f10 21 3d 52 42 55 5f 44 45 4c 45 54 45 20 7c 7c 20  !=RBU_DELETE || 
14f20 70 49 74 65 72 2d 3e 7a 49 64 78 3d 3d 30 20 29  pIter->zIdx==0 )
14f30 3b 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70  ;.  assert( eTyp
14f40 65 3d 3d 52 42 55 5f 44 45 4c 45 54 45 20 7c 7c  e==RBU_DELETE ||
14f50 20 65 54 79 70 65 3d 3d 52 42 55 5f 49 44 58 5f   eType==RBU_IDX_
14f60 44 45 4c 45 54 45 0a 20 20 20 20 20 20 20 7c 7c  DELETE.       ||
14f70 20 65 54 79 70 65 3d 3d 52 42 55 5f 49 4e 53 45   eType==RBU_INSE
14f80 52 54 20 7c 7c 20 65 54 79 70 65 3d 3d 52 42 55  RT || eType==RBU
14f90 5f 49 44 58 5f 49 4e 53 45 52 54 0a 20 20 29 3b  _IDX_INSERT.  );
14fa0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
14fb0 73 20 61 20 64 65 6c 65 74 65 2c 20 64 65 63 72  s a delete, decr
14fc0 65 6d 65 6e 74 20 6e 50 68 61 73 65 4f 6e 65 53  ement nPhaseOneS
14fd0 74 65 70 20 62 79 20 6e 49 6e 64 65 78 2e 20 49  tep by nIndex. I
14fe0 66 20 74 68 65 20 44 45 4c 45 54 45 0a 20 20 2a  f the DELETE.  *
14ff0 2a 20 73 74 61 74 65 6d 65 6e 74 20 62 65 6c 6f  * statement belo
15000 77 20 64 6f 65 73 20 61 63 74 75 61 6c 6c 79 20  w does actually 
15010 64 65 6c 65 74 65 20 61 20 72 6f 77 2c 20 6e 50  delete a row, nP
15020 68 61 73 65 4f 6e 65 53 74 65 70 20 77 69 6c 6c  haseOneStep will
15030 20 62 65 0a 20 20 2a 2a 20 69 6e 63 72 65 6d 65   be.  ** increme
15040 6e 74 65 64 20 62 79 20 74 68 65 20 73 61 6d 65  nted by the same
15050 20 61 6d 6f 75 6e 74 20 77 68 65 6e 20 53 51 4c   amount when SQL
15060 20 66 75 6e 63 74 69 6f 6e 20 72 62 75 5f 74 6d   function rbu_tm
15070 70 5f 69 6e 73 65 72 74 28 29 0a 20 20 2a 2a 20  p_insert().  ** 
15080 69 73 20 69 6e 76 6f 6b 65 64 20 62 79 20 74 68  is invoked by th
15090 65 20 74 72 69 67 67 65 72 2e 20 20 2a 2f 0a 20  e trigger.  */. 
150a0 20 69 66 28 20 65 54 79 70 65 3d 3d 52 42 55 5f   if( eType==RBU_
150b0 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 70 2d  DELETE ){.    p-
150c0 3e 6e 50 68 61 73 65 4f 6e 65 53 74 65 70 20 2d  >nPhaseOneStep -
150d0 3d 20 70 2d 3e 6f 62 6a 69 74 65 72 2e 6e 49 6e  = p->objiter.nIn
150e0 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  dex;.  }..  if( 
150f0 65 54 79 70 65 3d 3d 52 42 55 5f 49 44 58 5f 44  eType==RBU_IDX_D
15100 45 4c 45 54 45 20 7c 7c 20 65 54 79 70 65 3d 3d  ELETE || eType==
15110 52 42 55 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20  RBU_DELETE ){.  
15120 20 20 70 57 72 69 74 65 72 20 3d 20 70 49 74 65    pWriter = pIte
15130 72 2d 3e 70 44 65 6c 65 74 65 3b 0a 20 20 7d 65  r->pDelete;.  }e
15140 6c 73 65 7b 0a 20 20 20 20 70 57 72 69 74 65 72  lse{.    pWriter
15150 20 3d 20 70 49 74 65 72 2d 3e 70 49 6e 73 65 72   = pIter->pInser
15160 74 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 3d  t;.  }..  for(i=
15170 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 43 6f 6c  0; i<pIter->nCol
15180 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 49  ; i++){.    /* I
15190 66 20 74 68 69 73 20 69 73 20 61 6e 20 49 4e 53  f this is an INS
151a0 45 52 54 20 69 6e 74 6f 20 61 20 74 61 62 6c 65  ERT into a table
151b0 20 62 2d 74 72 65 65 20 61 6e 64 20 74 68 65 20   b-tree and the 
151c0 74 61 62 6c 65 20 68 61 73 20 61 6e 0a 20 20 20  table has an.   
151d0 20 2a 2a 20 65 78 70 6c 69 63 69 74 20 49 4e 54   ** explicit INT
151e0 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
151f0 2c 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 69  , check that thi
15200 73 20 69 73 20 6e 6f 74 20 61 6e 20 61 74 74 65  s is not an atte
15210 6d 70 74 0a 20 20 20 20 2a 2a 20 74 6f 20 77 72  mpt.    ** to wr
15220 69 74 65 20 61 20 4e 55 4c 4c 20 69 6e 74 6f 20  ite a NULL into 
15230 74 68 65 20 49 50 4b 20 63 6f 6c 75 6d 6e 2e 20  the IPK column. 
15240 54 68 61 74 20 69 73 20 6e 6f 74 20 70 65 72 6d  That is not perm
15250 69 74 74 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69  itted.  */.    i
15260 66 28 20 65 54 79 70 65 3d 3d 52 42 55 5f 49 4e  f( eType==RBU_IN
15270 53 45 52 54 20 0a 20 20 20 20 20 26 26 20 70 49  SERT .     && pI
15280 74 65 72 2d 3e 7a 49 64 78 3d 3d 30 20 26 26 20  ter->zIdx==0 && 
15290 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42  pIter->eType==RB
152a0 55 5f 50 4b 5f 49 50 4b 20 26 26 20 70 49 74 65  U_PK_IPK && pIte
152b0 72 2d 3e 61 62 54 62 6c 50 6b 5b 69 5d 20 0a 20  r->abTblPk[i] . 
152c0 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 5f 63      && sqlite3_c
152d0 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 49 74 65 72  olumn_type(pIter
152e0 2d 3e 70 53 65 6c 65 63 74 2c 20 69 29 3d 3d 53  ->pSelect, i)==S
152f0 51 4c 49 54 45 5f 4e 55 4c 4c 0a 20 20 20 20 29  QLITE_NULL.    )
15300 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20  {.      p->rc = 
15310 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48 3b  SQLITE_MISMATCH;
15320 0a 20 20 20 20 20 20 70 2d 3e 7a 45 72 72 6d 73  .      p->zErrms
15330 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  g = sqlite3_mpri
15340 6e 74 66 28 22 64 61 74 61 74 79 70 65 20 6d 69  ntf("datatype mi
15350 73 6d 61 74 63 68 22 29 3b 0a 20 20 20 20 20 20  smatch");.      
15360 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20  return;.    }.. 
15370 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 52 42     if( eType==RB
15380 55 5f 44 45 4c 45 54 45 20 26 26 20 70 49 74 65  U_DELETE && pIte
15390 72 2d 3e 61 62 54 62 6c 50 6b 5b 69 5d 3d 3d 30  r->abTblPk[i]==0
153a0 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e   ){.      contin
153b0 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  ue;.    }..    p
153c0 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  Val = sqlite3_co
153d0 6c 75 6d 6e 5f 76 61 6c 75 65 28 70 49 74 65 72  lumn_value(pIter
153e0 2d 3e 70 53 65 6c 65 63 74 2c 20 69 29 3b 0a 20  ->pSelect, i);. 
153f0 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74     p->rc = sqlit
15400 65 33 5f 62 69 6e 64 5f 76 61 6c 75 65 28 70 57  e3_bind_value(pW
15410 72 69 74 65 72 2c 20 69 2b 31 2c 20 70 56 61 6c  riter, i+1, pVal
15420 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  );.    if( p->rc
15430 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20   ) return;.  }. 
15440 20 69 66 28 20 70 49 74 65 72 2d 3e 7a 49 64 78   if( pIter->zIdx
15450 3d 3d 30 0a 20 20 20 26 26 20 28 70 49 74 65 72  ==0.   && (pIter
15460 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f  ->eType==RBU_PK_
15470 56 54 41 42 20 7c 7c 20 70 49 74 65 72 2d 3e 65  VTAB || pIter->e
15480 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 4e 4f 4e  Type==RBU_PK_NON
15490 45 29 20 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20  E) .  ){.    /* 
154a0 46 6f 72 20 61 20 76 69 72 74 75 61 6c 20 74 61  For a virtual ta
154b0 62 6c 65 2c 20 6f 72 20 61 20 74 61 62 6c 65 20  ble, or a table 
154c0 77 69 74 68 20 6e 6f 20 70 72 69 6d 61 72 79 20  with no primary 
154d0 6b 65 79 2c 20 74 68 65 20 0a 20 20 20 20 2a 2a  key, the .    **
154e0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
154f0 74 20 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  t is:.    **.   
15500 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 3c 63 6f   **   SELECT <co
15510 6c 73 3e 2c 20 72 62 75 5f 63 6f 6e 74 72 6f 6c  ls>, rbu_control
15520 2c 20 72 62 75 5f 72 6f 77 69 64 20 46 52 4f 4d  , rbu_rowid FROM
15530 20 2e 2e 2e 2e 0a 20 20 20 20 2a 2a 0a 20 20 20   .....    **.   
15540 20 2a 2a 20 48 65 6e 63 65 20 63 6f 6c 75 6d 6e   ** Hence column
15550 5f 76 61 6c 75 65 28 70 49 74 65 72 2d 3e 6e 43  _value(pIter->nC
15560 6f 6c 2b 31 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  ol+1)..    */.  
15570 20 20 61 73 73 65 72 74 43 6f 6c 75 6d 6e 4e 61    assertColumnNa
15580 6d 65 28 70 49 74 65 72 2d 3e 70 53 65 6c 65 63  me(pIter->pSelec
15590 74 2c 20 70 49 74 65 72 2d 3e 6e 43 6f 6c 2b 31  t, pIter->nCol+1
155a0 2c 20 22 72 62 75 5f 72 6f 77 69 64 22 29 3b 0a  , "rbu_rowid");.
155b0 20 20 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74      pVal = sqlit
155c0 65 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28  e3_column_value(
155d0 70 49 74 65 72 2d 3e 70 53 65 6c 65 63 74 2c 20  pIter->pSelect, 
155e0 70 49 74 65 72 2d 3e 6e 43 6f 6c 2b 31 29 3b 0a  pIter->nCol+1);.
155f0 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69      p->rc = sqli
15600 74 65 33 5f 62 69 6e 64 5f 76 61 6c 75 65 28 70  te3_bind_value(p
15610 57 72 69 74 65 72 2c 20 70 49 74 65 72 2d 3e 6e  Writer, pIter->n
15620 43 6f 6c 2b 31 2c 20 70 56 61 6c 29 3b 0a 20 20  Col+1, pVal);.  
15630 7d 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  }.  if( p->rc==S
15640 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
15650 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 57 72  sqlite3_step(pWr
15660 69 74 65 72 29 3b 0a 20 20 20 20 70 2d 3e 72 63  iter);.    p->rc
15670 20 3d 20 72 65 73 65 74 41 6e 64 43 6f 6c 6c 65   = resetAndColle
15680 63 74 45 72 72 6f 72 28 70 57 72 69 74 65 72 2c  ctError(pWriter,
15690 20 26 70 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a 20   &p->zErrmsg);. 
156a0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
156b0 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 74   function does t
156c0 68 65 20 77 6f 72 6b 20 66 6f 72 20 61 6e 20 73  he work for an s
156d0 71 6c 69 74 65 33 72 62 75 5f 73 74 65 70 28 29  qlite3rbu_step()
156e0 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   call..**.** The
156f0 20 6f 62 6a 65 63 74 2d 69 74 65 72 61 74 6f 72   object-iterator
15700 20 28 70 2d 3e 6f 62 6a 69 74 65 72 29 20 63 75   (p->objiter) cu
15710 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74  rrently points t
15720 6f 20 61 20 76 61 6c 69 64 20 6f 62 6a 65 63 74  o a valid object
15730 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20 69 6e 70  ,.** and the inp
15740 75 74 20 63 75 72 73 6f 72 20 28 70 2d 3e 6f 62  ut cursor (p->ob
15750 6a 69 74 65 72 2e 70 53 65 6c 65 63 74 29 20 63  jiter.pSelect) c
15760 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20  urrently points 
15770 74 6f 20 61 20 76 61 6c 69 64 0a 2a 2a 20 69 6e  to a valid.** in
15780 70 75 74 20 72 6f 77 2e 20 50 65 72 66 6f 72 6d  put row. Perform
15790 20 77 68 61 74 65 76 65 72 20 70 72 6f 63 65 73   whatever proces
157a0 73 69 6e 67 20 69 73 20 72 65 71 75 69 72 65 64  sing is required
157b0 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 2a 2a 0a   and return..**.
157c0 2a 2a 20 49 66 20 6e 6f 20 20 65 72 72 6f 72 20  ** If no  error 
157d0 6f 63 63 75 72 73 2c 20 53 51 4c 49 54 45 5f 4f  occurs, SQLITE_O
157e0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  K is returned. O
157f0 74 68 65 72 77 69 73 65 2c 20 61 6e 20 65 72 72  therwise, an err
15800 6f 72 20 63 6f 64 65 0a 2a 2a 20 61 6e 64 20 6d  or code.** and m
15810 65 73 73 61 67 65 20 69 73 20 6c 65 66 74 20 69  essage is left i
15820 6e 20 74 68 65 20 52 42 55 20 68 61 6e 64 6c 65  n the RBU handle
15830 20 61 6e 64 20 61 20 63 6f 70 79 20 6f 66 20 74   and a copy of t
15840 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a  he error code.**
15850 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
15860 61 74 69 63 20 69 6e 74 20 72 62 75 53 74 65 70  atic int rbuStep
15870 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 29 7b  (sqlite3rbu *p){
15880 0a 20 20 52 62 75 4f 62 6a 49 74 65 72 20 2a 70  .  RbuObjIter *p
15890 49 74 65 72 20 3d 20 26 70 2d 3e 6f 62 6a 69 74  Iter = &p->objit
158a0 65 72 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  er;.  const char
158b0 20 2a 7a 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 69   *zMask = 0;.  i
158c0 6e 74 20 65 54 79 70 65 20 3d 20 72 62 75 53 74  nt eType = rbuSt
158d0 65 70 54 79 70 65 28 70 2c 20 26 7a 4d 61 73 6b  epType(p, &zMask
158e0 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70 65 20  );..  if( eType 
158f0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 65  ){.    assert( e
15900 54 79 70 65 3d 3d 52 42 55 5f 49 4e 53 45 52 54  Type==RBU_INSERT
15910 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 52       || eType==R
15920 42 55 5f 44 45 4c 45 54 45 0a 20 20 20 20 20 20  BU_DELETE.      
15930 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 52 42 55     || eType==RBU
15940 5f 52 45 50 4c 41 43 45 20 20 20 20 7c 7c 20 65  _REPLACE    || e
15950 54 79 70 65 3d 3d 52 42 55 5f 49 44 58 5f 44 45  Type==RBU_IDX_DE
15960 4c 45 54 45 0a 20 20 20 20 20 20 20 20 20 7c 7c  LETE.         ||
15970 20 65 54 79 70 65 3d 3d 52 42 55 5f 49 44 58 5f   eType==RBU_IDX_
15980 49 4e 53 45 52 54 20 7c 7c 20 65 54 79 70 65 3d  INSERT || eType=
15990 3d 52 42 55 5f 55 50 44 41 54 45 0a 20 20 20 20  =RBU_UPDATE.    
159a0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 65  );.    assert( e
159b0 54 79 70 65 21 3d 52 42 55 5f 55 50 44 41 54 45  Type!=RBU_UPDATE
159c0 20 7c 7c 20 70 49 74 65 72 2d 3e 7a 49 64 78 3d   || pIter->zIdx=
159d0 3d 30 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70  =0 );..    if( p
159e0 49 74 65 72 2d 3e 7a 49 64 78 3d 3d 30 20 26 26  Iter->zIdx==0 &&
159f0 20 65 54 79 70 65 3d 3d 52 42 55 5f 49 44 58 5f   eType==RBU_IDX_
15a00 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 20 20  DELETE ){.      
15a10 72 62 75 42 61 64 43 6f 6e 74 72 6f 6c 45 72 72  rbuBadControlErr
15a20 6f 72 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20  or(p);.    }.   
15a30 20 65 6c 73 65 20 69 66 28 20 65 54 79 70 65 3d   else if( eType=
15a40 3d 52 42 55 5f 52 45 50 4c 41 43 45 20 29 7b 0a  =RBU_REPLACE ){.
15a50 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d        if( pIter-
15a60 3e 7a 49 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20  >zIdx==0 ){.    
15a70 20 20 20 20 70 2d 3e 6e 50 68 61 73 65 4f 6e 65      p->nPhaseOne
15a80 53 74 65 70 20 2b 3d 20 70 2d 3e 6f 62 6a 69 74  Step += p->objit
15a90 65 72 2e 6e 49 6e 64 65 78 3b 0a 20 20 20 20 20  er.nIndex;.     
15aa0 20 20 20 72 62 75 53 74 65 70 4f 6e 65 4f 70 28     rbuStepOneOp(
15ab0 70 2c 20 52 42 55 5f 44 45 4c 45 54 45 29 3b 0a  p, RBU_DELETE);.
15ac0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
15ad0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
15ae0 4f 4b 20 29 20 72 62 75 53 74 65 70 4f 6e 65 4f  OK ) rbuStepOneO
15af0 70 28 70 2c 20 52 42 55 5f 49 4e 53 45 52 54 29  p(p, RBU_INSERT)
15b00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65  ;.    }.    else
15b10 20 69 66 28 20 65 54 79 70 65 21 3d 52 42 55 5f   if( eType!=RBU_
15b20 55 50 44 41 54 45 20 29 7b 0a 20 20 20 20 20 20  UPDATE ){.      
15b30 72 62 75 53 74 65 70 4f 6e 65 4f 70 28 70 2c 20  rbuStepOneOp(p, 
15b40 65 54 79 70 65 29 3b 0a 20 20 20 20 7d 0a 20 20  eType);.    }.  
15b50 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71    else{.      sq
15b60 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61  lite3_value *pVa
15b70 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  l;.      sqlite3
15b80 5f 73 74 6d 74 20 2a 70 55 70 64 61 74 65 20 3d  _stmt *pUpdate =
15b90 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   0;.      assert
15ba0 28 20 65 54 79 70 65 3d 3d 52 42 55 5f 55 50 44  ( eType==RBU_UPD
15bb0 41 54 45 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e  ATE );.      p->
15bc0 6e 50 68 61 73 65 4f 6e 65 53 74 65 70 20 2d 3d  nPhaseOneStep -=
15bd0 20 70 2d 3e 6f 62 6a 69 74 65 72 2e 6e 49 6e 64   p->objiter.nInd
15be0 65 78 3b 0a 20 20 20 20 20 20 72 62 75 47 65 74  ex;.      rbuGet
15bf0 55 70 64 61 74 65 53 74 6d 74 28 70 2c 20 70 49  UpdateStmt(p, pI
15c00 74 65 72 2c 20 7a 4d 61 73 6b 2c 20 26 70 55 70  ter, zMask, &pUp
15c10 64 61 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28  date);.      if(
15c20 20 70 55 70 64 61 74 65 20 29 7b 0a 20 20 20 20   pUpdate ){.    
15c30 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
15c40 20 20 20 66 6f 72 28 69 3d 30 3b 20 70 2d 3e 72     for(i=0; p->r
15c50 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
15c60 69 3c 70 49 74 65 72 2d 3e 6e 43 6f 6c 3b 20 69  i<pIter->nCol; i
15c70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  ++){.          c
15c80 68 61 72 20 63 20 3d 20 7a 4d 61 73 6b 5b 70 49  har c = zMask[pI
15c90 74 65 72 2d 3e 61 69 53 72 63 4f 72 64 65 72 5b  ter->aiSrcOrder[
15ca0 69 5d 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 70  i]];.          p
15cb0 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  Val = sqlite3_co
15cc0 6c 75 6d 6e 5f 76 61 6c 75 65 28 70 49 74 65 72  lumn_value(pIter
15cd0 2d 3e 70 53 65 6c 65 63 74 2c 20 69 29 3b 0a 20  ->pSelect, i);. 
15ce0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74           if( pIt
15cf0 65 72 2d 3e 61 62 54 62 6c 50 6b 5b 69 5d 20 7c  er->abTblPk[i] |
15d00 7c 20 63 21 3d 27 2e 27 20 29 7b 0a 20 20 20 20  | c!='.' ){.    
15d10 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
15d20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 76 61 6c  sqlite3_bind_val
15d30 75 65 28 70 55 70 64 61 74 65 2c 20 69 2b 31 2c  ue(pUpdate, i+1,
15d40 20 70 56 61 6c 29 3b 0a 20 20 20 20 20 20 20 20   pVal);.        
15d50 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
15d60 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
15d70 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a 20 20 20 20  =SQLITE_OK .    
15d80 20 20 20 20 20 26 26 20 28 70 49 74 65 72 2d 3e       && (pIter->
15d90 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 56 54  eType==RBU_PK_VT
15da0 41 42 20 7c 7c 20 70 49 74 65 72 2d 3e 65 54 79  AB || pIter->eTy
15db0 70 65 3d 3d 52 42 55 5f 50 4b 5f 4e 4f 4e 45 29  pe==RBU_PK_NONE)
15dc0 20 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20   .        ){.   
15dd0 20 20 20 20 20 20 20 2f 2a 20 42 69 6e 64 20 74         /* Bind t
15de0 68 65 20 72 62 75 5f 72 6f 77 69 64 20 76 61 6c  he rbu_rowid val
15df0 75 65 20 74 6f 20 63 6f 6c 75 6d 6e 20 5f 72 6f  ue to column _ro
15e00 77 69 64 5f 20 2a 2f 0a 20 20 20 20 20 20 20 20  wid_ */.        
15e10 20 20 61 73 73 65 72 74 43 6f 6c 75 6d 6e 4e 61    assertColumnNa
15e20 6d 65 28 70 49 74 65 72 2d 3e 70 53 65 6c 65 63  me(pIter->pSelec
15e30 74 2c 20 70 49 74 65 72 2d 3e 6e 43 6f 6c 2b 31  t, pIter->nCol+1
15e40 2c 20 22 72 62 75 5f 72 6f 77 69 64 22 29 3b 0a  , "rbu_rowid");.
15e50 20 20 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d            pVal =
15e60 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
15e70 76 61 6c 75 65 28 70 49 74 65 72 2d 3e 70 53 65  value(pIter->pSe
15e80 6c 65 63 74 2c 20 70 49 74 65 72 2d 3e 6e 43 6f  lect, pIter->nCo
15e90 6c 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  l+1);.          
15ea0 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  p->rc = sqlite3_
15eb0 62 69 6e 64 5f 76 61 6c 75 65 28 70 55 70 64 61  bind_value(pUpda
15ec0 74 65 2c 20 70 49 74 65 72 2d 3e 6e 43 6f 6c 2b  te, pIter->nCol+
15ed0 31 2c 20 70 56 61 6c 29 3b 0a 20 20 20 20 20 20  1, pVal);.      
15ee0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
15ef0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
15f00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
15f10 6c 69 74 65 33 5f 73 74 65 70 28 70 55 70 64 61  lite3_step(pUpda
15f20 74 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  te);.          p
15f30 2d 3e 72 63 20 3d 20 72 65 73 65 74 41 6e 64 43  ->rc = resetAndC
15f40 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 55 70 64  ollectError(pUpd
15f50 61 74 65 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67  ate, &p->zErrmsg
15f60 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
15f70 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
15f80 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 3b 0a 7d   return p->rc;.}
15f90 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e  ../*.** Incremen
15fa0 74 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f  t the schema coo
15fb0 6b 69 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  kie of the main 
15fc0 64 61 74 61 62 61 73 65 20 6f 70 65 6e 65 64 20  database opened 
15fd0 62 79 20 70 2d 3e 64 62 4d 61 69 6e 2e 0a 2a 2f  by p->dbMain..*/
15fe0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75  .static void rbu
15ff0 49 6e 63 72 53 63 68 65 6d 61 43 6f 6f 6b 69 65  IncrSchemaCookie
16000 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 29 7b  (sqlite3rbu *p){
16010 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
16020 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
16030 6e 74 20 69 43 6f 6f 6b 69 65 20 3d 20 31 30 30  nt iCookie = 100
16040 30 30 30 30 3b 0a 20 20 20 20 73 71 6c 69 74 65  0000;.    sqlite
16050 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a  3_stmt *pStmt;..
16060 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70      p->rc = prep
16070 61 72 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72  areAndCollectErr
16080 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 70  or(p->dbMain, &p
16090 53 74 6d 74 2c 20 26 70 2d 3e 7a 45 72 72 6d 73  Stmt, &p->zErrms
160a0 67 2c 20 0a 20 20 20 20 20 20 20 20 22 50 52 41  g, .        "PRA
160b0 47 4d 41 20 73 63 68 65 6d 61 5f 76 65 72 73 69  GMA schema_versi
160c0 6f 6e 22 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  on".    );.    i
160d0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
160e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  _OK ){.      /* 
160f0 43 6f 76 65 72 61 67 65 3a 20 69 74 20 6d 61 79  Coverage: it may
16100 20 62 65 20 74 68 61 74 20 74 68 69 73 20 73 71   be that this sq
16110 6c 69 74 65 33 5f 73 74 65 70 28 29 20 63 61 6e  lite3_step() can
16120 6e 6f 74 20 66 61 69 6c 2e 20 54 68 65 72 65 0a  not fail. There.
16130 20 20 20 20 20 20 2a 2a 20 69 73 20 61 6c 72 65        ** is alre
16140 61 64 79 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ady a transactio
16150 6e 20 6f 70 65 6e 2c 20 73 6f 20 74 68 65 20 70  n open, so the p
16160 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
16170 74 20 63 61 6e 6e 6f 74 0a 20 20 20 20 20 20 2a  t cannot.      *
16180 2a 20 74 68 72 6f 77 20 61 6e 20 53 51 4c 49 54  * throw an SQLIT
16190 45 5f 53 43 48 45 4d 41 20 65 78 63 65 70 74 69  E_SCHEMA excepti
161a0 6f 6e 2e 20 54 68 65 20 6f 6e 6c 79 20 64 61 74  on. The only dat
161b0 61 62 61 73 65 20 70 61 67 65 20 74 68 65 0a 20  abase page the. 
161c0 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e       ** statemen
161d0 74 20 72 65 61 64 73 20 69 73 20 70 61 67 65 20  t reads is page 
161e0 31 2c 20 77 68 69 63 68 20 69 73 20 67 75 61 72  1, which is guar
161f0 61 6e 74 65 65 64 20 74 6f 20 62 65 20 69 6e 20  anteed to be in 
16200 74 68 65 20 63 61 63 68 65 2e 0a 20 20 20 20 20  the cache..     
16210 20 2a 2a 20 41 6e 64 20 6e 6f 20 6d 65 6d 6f 72   ** And no memor
16220 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 61 72  y allocations ar
16230 65 20 72 65 71 75 69 72 65 64 2e 20 20 2a 2f 0a  e required.  */.
16240 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45        if( SQLITE
16250 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74  _ROW==sqlite3_st
16260 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20  ep(pStmt) ){.   
16270 20 20 20 20 20 69 43 6f 6f 6b 69 65 20 3d 20 73       iCookie = s
16280 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
16290 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20  t(pStmt, 0);.   
162a0 20 20 20 7d 0a 20 20 20 20 20 20 72 62 75 46 69     }.      rbuFi
162b0 6e 61 6c 69 7a 65 28 70 2c 20 70 53 74 6d 74 29  nalize(p, pStmt)
162c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
162d0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
162e0 20 29 7b 0a 20 20 20 20 20 20 72 62 75 4d 50 72   ){.      rbuMPr
162f0 69 6e 74 66 45 78 65 63 28 70 2c 20 70 2d 3e 64  intfExec(p, p->d
16300 62 4d 61 69 6e 2c 20 22 50 52 41 47 4d 41 20 73  bMain, "PRAGMA s
16310 63 68 65 6d 61 5f 76 65 72 73 69 6f 6e 20 3d 20  chema_version = 
16320 25 64 22 2c 20 69 43 6f 6f 6b 69 65 2b 31 29 3b  %d", iCookie+1);
16330 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
16340 0a 2a 2a 20 55 70 64 61 74 65 20 74 68 65 20 63  .** Update the c
16350 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 72  ontents of the r
16360 62 75 5f 73 74 61 74 65 20 74 61 62 6c 65 20 77  bu_state table w
16370 69 74 68 69 6e 20 74 68 65 20 72 62 75 20 64 61  ithin the rbu da
16380 74 61 62 61 73 65 2e 20 54 68 65 0a 2a 2a 20 76  tabase. The.** v
16390 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 74  alue stored in t
163a0 68 65 20 52 42 55 5f 53 54 41 54 45 5f 53 54 41  he RBU_STATE_STA
163b0 47 45 20 63 6f 6c 75 6d 6e 20 69 73 20 65 53 74  GE column is eSt
163c0 61 67 65 2e 20 41 6c 6c 20 6f 74 68 65 72 20 76  age. All other v
163d0 61 6c 75 65 73 0a 2a 2a 20 61 72 65 20 64 65 74  alues.** are det
163e0 65 72 6d 69 6e 65 64 20 62 79 20 69 6e 73 70 65  ermined by inspe
163f0 63 74 69 6e 67 20 74 68 65 20 72 62 75 20 68 61  cting the rbu ha
16400 6e 64 6c 65 20 70 61 73 73 65 64 20 61 73 20 74  ndle passed as t
16410 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
16420 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
16430 64 20 72 62 75 53 61 76 65 53 74 61 74 65 28 73  d rbuSaveState(s
16440 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 69 6e  qlite3rbu *p, in
16450 74 20 65 53 74 61 67 65 29 7b 0a 20 20 69 66 28  t eStage){.  if(
16460 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
16470 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  K || p->rc==SQLI
16480 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 73  TE_DONE ){.    s
16490 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 49 6e  qlite3_stmt *pIn
164a0 73 65 72 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e  sert = 0;.    in
164b0 74 20 72 63 3b 0a 0a 20 20 20 20 61 73 73 65 72  t rc;..    asser
164c0 74 28 20 70 2d 3e 7a 45 72 72 6d 73 67 3d 3d 30  t( p->zErrmsg==0
164d0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 72 65   );.    rc = pre
164e0 70 61 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65  pareFreeAndColle
164f0 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 52 62 75  ctError(p->dbRbu
16500 2c 20 26 70 49 6e 73 65 72 74 2c 20 26 70 2d 3e  , &pInsert, &p->
16510 7a 45 72 72 6d 73 67 2c 20 0a 20 20 20 20 20 20  zErrmsg, .      
16520 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74    sqlite3_mprint
16530 66 28 0a 20 20 20 20 20 20 20 20 20 20 22 49 4e  f(.          "IN
16540 53 45 52 54 20 4f 52 20 52 45 50 4c 41 43 45 20  SERT OR REPLACE 
16550 49 4e 54 4f 20 25 73 2e 72 62 75 5f 73 74 61 74  INTO %s.rbu_stat
16560 65 28 6b 2c 20 76 29 20 56 41 4c 55 45 53 20 22  e(k, v) VALUES "
16570 0a 20 20 20 20 20 20 20 20 20 20 22 28 25 64 2c  .          "(%d,
16580 20 25 64 29 2c 20 22 0a 20 20 20 20 20 20 20 20   %d), ".        
16590 20 20 22 28 25 64 2c 20 25 51 29 2c 20 22 0a 20    "(%d, %Q), ". 
165a0 20 20 20 20 20 20 20 20 20 22 28 25 64 2c 20 25           "(%d, %
165b0 51 29 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20  Q), ".          
165c0 22 28 25 64 2c 20 25 64 29 2c 20 22 0a 20 20 20  "(%d, %d), ".   
165d0 20 20 20 20 20 20 20 22 28 25 64 2c 20 25 64 29         "(%d, %d)
165e0 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 22 28  , ".          "(
165f0 25 64 2c 20 25 6c 6c 64 29 2c 20 22 0a 20 20 20  %d, %lld), ".   
16600 20 20 20 20 20 20 20 22 28 25 64 2c 20 25 6c 6c         "(%d, %ll
16610 64 29 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20  d), ".          
16620 22 28 25 64 2c 20 25 6c 6c 64 29 2c 20 22 0a 20  "(%d, %lld), ". 
16630 20 20 20 20 20 20 20 20 20 22 28 25 64 2c 20 25           "(%d, %
16640 6c 6c 64 29 20 22 2c 0a 20 20 20 20 20 20 20 20  lld) ",.        
16650 20 20 70 2d 3e 7a 53 74 61 74 65 44 62 2c 0a 20    p->zStateDb,. 
16660 20 20 20 20 20 20 20 20 20 52 42 55 5f 53 54 41           RBU_STA
16670 54 45 5f 53 54 41 47 45 2c 20 65 53 74 61 67 65  TE_STAGE, eStage
16680 2c 0a 20 20 20 20 20 20 20 20 20 20 52 42 55 5f  ,.          RBU_
16690 53 54 41 54 45 5f 54 42 4c 2c 20 70 2d 3e 6f 62  STATE_TBL, p->ob
166a0 6a 69 74 65 72 2e 7a 54 62 6c 2c 20 0a 20 20 20  jiter.zTbl, .   
166b0 20 20 20 20 20 20 20 52 42 55 5f 53 54 41 54 45         RBU_STATE
166c0 5f 49 44 58 2c 20 70 2d 3e 6f 62 6a 69 74 65 72  _IDX, p->objiter
166d0 2e 7a 49 64 78 2c 20 0a 20 20 20 20 20 20 20 20  .zIdx, .        
166e0 20 20 52 42 55 5f 53 54 41 54 45 5f 52 4f 57 2c    RBU_STATE_ROW,
166f0 20 70 2d 3e 6e 53 74 65 70 2c 20 0a 20 20 20 20   p->nStep, .    
16700 20 20 20 20 20 20 52 42 55 5f 53 54 41 54 45 5f        RBU_STATE_
16710 50 52 4f 47 52 45 53 53 2c 20 70 2d 3e 6e 50 72  PROGRESS, p->nPr
16720 6f 67 72 65 73 73 2c 0a 20 20 20 20 20 20 20 20  ogress,.        
16730 20 20 52 42 55 5f 53 54 41 54 45 5f 43 4b 50 54    RBU_STATE_CKPT
16740 2c 20 70 2d 3e 69 57 61 6c 43 6b 73 75 6d 2c 0a  , p->iWalCksum,.
16750 20 20 20 20 20 20 20 20 20 20 52 42 55 5f 53 54            RBU_ST
16760 41 54 45 5f 43 4f 4f 4b 49 45 2c 20 28 69 36 34  ATE_COOKIE, (i64
16770 29 70 2d 3e 70 54 61 72 67 65 74 46 64 2d 3e 69  )p->pTargetFd->i
16780 43 6f 6f 6b 69 65 2c 0a 20 20 20 20 20 20 20 20  Cookie,.        
16790 20 20 52 42 55 5f 53 54 41 54 45 5f 4f 41 4c 53    RBU_STATE_OALS
167a0 5a 2c 20 70 2d 3e 69 4f 61 6c 53 7a 2c 0a 20 20  Z, p->iOalSz,.  
167b0 20 20 20 20 20 20 20 20 52 42 55 5f 53 54 41 54          RBU_STAT
167c0 45 5f 50 48 41 53 45 4f 4e 45 53 54 45 50 2c 20  E_PHASEONESTEP, 
167d0 70 2d 3e 6e 50 68 61 73 65 4f 6e 65 53 74 65 70  p->nPhaseOneStep
167e0 0a 20 20 20 20 20 20 29 0a 20 20 20 20 29 3b 0a  .      ).    );.
167f0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 73      assert( pIns
16800 65 72 74 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51  ert==0 || rc==SQ
16810 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20  LITE_OK );..    
16820 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
16830 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
16840 65 33 5f 73 74 65 70 28 70 49 6e 73 65 72 74 29  e3_step(pInsert)
16850 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
16860 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 49  ite3_finalize(pI
16870 6e 73 65 72 74 29 3b 0a 20 20 20 20 7d 0a 20 20  nsert);.    }.  
16880 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
16890 5f 4f 4b 20 29 20 70 2d 3e 72 63 20 3d 20 72 63  _OK ) p->rc = rc
168a0 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ;.  }.}.../*.** 
168b0 53 74 65 70 20 74 68 65 20 52 42 55 20 6f 62 6a  Step the RBU obj
168c0 65 63 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ect..*/.int sqli
168d0 74 65 33 72 62 75 5f 73 74 65 70 28 73 71 6c 69  te3rbu_step(sqli
168e0 74 65 33 72 62 75 20 2a 70 29 7b 0a 20 20 69 66  te3rbu *p){.  if
168f0 28 20 70 20 29 7b 0a 20 20 20 20 73 77 69 74 63  ( p ){.    switc
16900 68 28 20 70 2d 3e 65 53 74 61 67 65 20 29 7b 0a  h( p->eStage ){.
16910 20 20 20 20 20 20 63 61 73 65 20 52 42 55 5f 53        case RBU_S
16920 54 41 47 45 5f 4f 41 4c 3a 20 7b 0a 20 20 20 20  TAGE_OAL: {.    
16930 20 20 20 20 52 62 75 4f 62 6a 49 74 65 72 20 2a      RbuObjIter *
16940 70 49 74 65 72 20 3d 20 26 70 2d 3e 6f 62 6a 69  pIter = &p->obji
16950 74 65 72 3b 0a 20 20 20 20 20 20 20 20 77 68 69  ter;.        whi
16960 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  le( p->rc==SQLIT
16970 45 5f 4f 4b 20 26 26 20 70 49 74 65 72 2d 3e 7a  E_OK && pIter->z
16980 54 62 6c 20 29 7b 0a 0a 20 20 20 20 20 20 20 20  Tbl ){..        
16990 20 20 69 66 28 20 70 49 74 65 72 2d 3e 62 43 6c    if( pIter->bCl
169a0 65 61 6e 75 70 20 29 7b 0a 20 20 20 20 20 20 20  eanup ){.       
169b0 20 20 20 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70       /* Clean up
169c0 20 74 68 65 20 72 62 75 5f 74 6d 70 5f 78 78 78   the rbu_tmp_xxx
169d0 20 74 61 62 6c 65 20 66 6f 72 20 74 68 65 20 70   table for the p
169e0 72 65 76 69 6f 75 73 20 74 61 62 6c 65 2e 20 49  revious table. I
169f0 74 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  t .            *
16a00 2a 20 63 61 6e 6e 6f 74 20 62 65 20 64 72 6f 70  * cannot be drop
16a10 70 65 64 20 61 73 20 74 68 65 72 65 20 61 72 65  ped as there are
16a20 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76   currently activ
16a30 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73  e SQL statements
16a40 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  ..            **
16a50 20 42 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74   But the content
16a60 73 20 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64  s can be deleted
16a70 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  .  */.          
16a80 20 20 69 66 28 20 70 49 74 65 72 2d 3e 61 62 49    if( pIter->abI
16a90 6e 64 65 78 65 64 20 29 7b 0a 20 20 20 20 20 20  ndexed ){.      
16aa0 20 20 20 20 20 20 20 20 72 62 75 4d 50 72 69 6e          rbuMPrin
16ab0 74 66 45 78 65 63 28 70 2c 20 70 2d 3e 64 62 52  tfExec(p, p->dbR
16ac0 62 75 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  bu, .           
16ad0 20 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46         "DELETE F
16ae0 52 4f 4d 20 25 73 2e 27 72 62 75 5f 74 6d 70 5f  ROM %s.'rbu_tmp_
16af0 25 71 27 22 2c 20 70 2d 3e 7a 53 74 61 74 65 44  %q'", p->zStateD
16b00 62 2c 20 70 49 74 65 72 2d 3e 7a 44 61 74 61 54  b, pIter->zDataT
16b10 62 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  bl.             
16b20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
16b30 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  }.          }els
16b40 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  e{.            r
16b50 62 75 4f 62 6a 49 74 65 72 50 72 65 70 61 72 65  buObjIterPrepare
16b60 41 6c 6c 28 70 2c 20 70 49 74 65 72 2c 20 30 29  All(p, pIter, 0)
16b70 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;..            /
16b80 2a 20 41 64 76 61 6e 63 65 20 74 6f 20 74 68 65  * Advance to the
16b90 20 6e 65 78 74 20 72 6f 77 20 74 6f 20 70 72 6f   next row to pro
16ba0 63 65 73 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20  cess. */.       
16bb0 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
16bc0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16bd0 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72             int r
16be0 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70  c = sqlite3_step
16bf0 28 70 49 74 65 72 2d 3e 70 53 65 6c 65 63 74 29  (pIter->pSelect)
16c00 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
16c10 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 52  if( rc==SQLITE_R
16c20 4f 57 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OW ){.          
16c30 20 20 20 20 20 20 70 2d 3e 6e 50 72 6f 67 72 65        p->nProgre
16c40 73 73 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  ss++;.          
16c50 20 20 20 20 20 20 70 2d 3e 6e 53 74 65 70 2b 2b        p->nStep++
16c60 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
16c70 20 20 72 65 74 75 72 6e 20 72 62 75 53 74 65 70    return rbuStep
16c80 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (p);.           
16c90 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
16ca0 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74     p->rc = sqlit
16cb0 65 33 5f 72 65 73 65 74 28 70 49 74 65 72 2d 3e  e3_reset(pIter->
16cc0 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  pSelect);.      
16cd0 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 74 65 70          p->nStep
16ce0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
16cf0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
16d00 0a 20 20 20 20 20 20 20 20 20 20 72 62 75 4f 62  .          rbuOb
16d10 6a 49 74 65 72 4e 65 78 74 28 70 2c 20 70 49 74  jIterNext(p, pIt
16d20 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  er);.        }..
16d30 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72          if( p->r
16d40 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
16d50 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
16d60 28 20 70 49 74 65 72 2d 3e 7a 54 62 6c 3d 3d 30  ( pIter->zTbl==0
16d70 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 62   );.          rb
16d80 75 53 61 76 65 53 74 61 74 65 28 70 2c 20 52 42  uSaveState(p, RB
16d90 55 5f 53 54 41 47 45 5f 4d 4f 56 45 29 3b 0a 20  U_STAGE_MOVE);. 
16da0 20 20 20 20 20 20 20 20 20 72 62 75 49 6e 63 72           rbuIncr
16db0 53 63 68 65 6d 61 43 6f 6f 6b 69 65 28 70 29 3b  SchemaCookie(p);
16dc0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
16dd0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
16de0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
16df0 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65  ->rc = sqlite3_e
16e00 78 65 63 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 22  xec(p->dbMain, "
16e10 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 2c 20 26  COMMIT", 0, 0, &
16e20 70 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a 20 20 20  p->zErrmsg);.   
16e30 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
16e40 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
16e50 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
16e60 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73         p->rc = s
16e70 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
16e80 62 52 62 75 2c 20 22 43 4f 4d 4d 49 54 22 2c 20  bRbu, "COMMIT", 
16e90 30 2c 20 30 2c 20 26 70 2d 3e 7a 45 72 72 6d 73  0, 0, &p->zErrms
16ea0 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  g);.          }.
16eb0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74            p->eSt
16ec0 61 67 65 20 3d 20 52 42 55 5f 53 54 41 47 45 5f  age = RBU_STAGE_
16ed0 4d 4f 56 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a  MOVE;.        }.
16ee0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
16ef0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 63 61       }..      ca
16f00 73 65 20 52 42 55 5f 53 54 41 47 45 5f 4d 4f 56  se RBU_STAGE_MOV
16f10 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28  E: {.        if(
16f20 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
16f30 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
16f40 62 75 4d 6f 76 65 4f 61 6c 46 69 6c 65 28 70 29  buMoveOalFile(p)
16f50 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e  ;.          p->n
16f60 50 72 6f 67 72 65 73 73 2b 2b 3b 0a 20 20 20 20  Progress++;.    
16f70 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72      }.        br
16f80 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  eak;.      }..  
16f90 20 20 20 20 63 61 73 65 20 52 42 55 5f 53 54 41      case RBU_STA
16fa0 47 45 5f 43 4b 50 54 3a 20 7b 0a 20 20 20 20 20  GE_CKPT: {.     
16fb0 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
16fc0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
16fd0 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 74 65       if( p->nSte
16fe0 70 3e 3d 70 2d 3e 6e 46 72 61 6d 65 20 29 7b 0a  p>=p->nFrame ){.
16ff0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
17000 74 65 33 5f 66 69 6c 65 20 2a 70 44 62 20 3d 20  te3_file *pDb = 
17010 70 2d 3e 70 54 61 72 67 65 74 46 64 2d 3e 70 52  p->pTargetFd->pR
17020 65 61 6c 3b 0a 20 20 0a 20 20 20 20 20 20 20 20  eal;.  .        
17030 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20      /* Sync the 
17040 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 20  db file */.     
17050 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 70         p->rc = p
17060 44 62 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53  Db->pMethods->xS
17070 79 6e 63 28 70 44 62 2c 20 53 51 4c 49 54 45 5f  ync(pDb, SQLITE_
17080 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20  SYNC_NORMAL);.  
17090 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
170a0 55 70 64 61 74 65 20 6e 42 61 63 6b 66 69 6c 6c  Update nBackfill
170b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
170c0 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
170d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
170e0 20 20 20 20 20 20 76 6f 69 64 20 76 6f 6c 61 74        void volat
170f0 69 6c 65 20 2a 70 74 72 3b 0a 20 20 20 20 20 20  ile *ptr;.      
17100 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
17110 70 44 62 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78  pDb->pMethods->x
17120 53 68 6d 4d 61 70 28 70 44 62 2c 20 30 2c 20 33  ShmMap(pDb, 0, 3
17130 32 2a 31 30 32 34 2c 20 30 2c 20 26 70 74 72 29  2*1024, 0, &ptr)
17140 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
17150 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
17160 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
17170 20 20 20 20 20 20 20 20 28 28 75 33 32 20 76 6f          ((u32 vo
17180 6c 61 74 69 6c 65 2a 29 70 74 72 29 5b 32 34 5d  latile*)ptr)[24]
17190 20 3d 20 70 2d 3e 69 4d 61 78 46 72 61 6d 65 3b   = p->iMaxFrame;
171a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
171b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
171c0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66   .            if
171d0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
171e0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
171f0 20 20 20 20 70 2d 3e 65 53 74 61 67 65 20 3d 20      p->eStage = 
17200 52 42 55 5f 53 54 41 47 45 5f 44 4f 4e 45 3b 0a  RBU_STAGE_DONE;.
17210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
17220 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e  >rc = SQLITE_DON
17230 45 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  E;.            }
17240 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
17250 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 52 62  {.            Rb
17260 75 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 20 3d  uFrame *pFrame =
17270 20 26 70 2d 3e 61 46 72 61 6d 65 5b 70 2d 3e 6e   &p->aFrame[p->n
17280 53 74 65 70 5d 3b 0a 20 20 20 20 20 20 20 20 20  Step];.         
17290 20 20 20 72 62 75 43 68 65 63 6b 70 6f 69 6e 74     rbuCheckpoint
172a0 46 72 61 6d 65 28 70 2c 20 70 46 72 61 6d 65 29  Frame(p, pFrame)
172b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d  ;.            p-
172c0 3e 6e 53 74 65 70 2b 2b 3b 0a 20 20 20 20 20 20  >nStep++;.      
172d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
172e0 70 2d 3e 6e 50 72 6f 67 72 65 73 73 2b 2b 3b 0a  p->nProgress++;.
172f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
17300 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
17310 0a 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a  ..      default:
17320 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
17330 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
17340 20 70 2d 3e 72 63 3b 0a 20 20 7d 65 6c 73 65 7b   p->rc;.  }else{
17350 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
17360 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 7d 0a  TE_NOMEM;.  }.}.
17370 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 20 52  ./*.** Free an R
17380 62 75 53 74 61 74 65 20 6f 62 6a 65 63 74 20 61  buState object a
17390 6c 6c 6f 63 61 74 65 64 20 62 79 20 72 62 75 4c  llocated by rbuL
173a0 6f 61 64 53 74 61 74 65 28 29 2e 0a 2a 2f 0a 73  oadState()..*/.s
173b0 74 61 74 69 63 20 76 6f 69 64 20 72 62 75 46 72  tatic void rbuFr
173c0 65 65 53 74 61 74 65 28 52 62 75 53 74 61 74 65  eeState(RbuState
173d0 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b   *p){.  if( p ){
173e0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
173f0 65 28 70 2d 3e 7a 54 62 6c 29 3b 0a 20 20 20 20  e(p->zTbl);.    
17400 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
17410 7a 49 64 78 29 3b 0a 20 20 20 20 73 71 6c 69 74  zIdx);.    sqlit
17420 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a  e3_free(p);.  }.
17430 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
17440 65 20 61 6e 20 52 62 75 53 74 61 74 65 20 6f 62  e an RbuState ob
17450 6a 65 63 74 20 61 6e 64 20 6c 6f 61 64 20 74 68  ject and load th
17460 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
17470 65 20 72 62 75 5f 73 74 61 74 65 20 0a 2a 2a 20  e rbu_state .** 
17480 74 61 62 6c 65 20 69 6e 74 6f 20 69 74 2e 20 52  table into it. R
17490 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
174a0 74 6f 20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63  to the new objec
174b0 74 2e 20 49 74 20 69 73 20 74 68 65 20 0a 2a 2a  t. It is the .**
174c0 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
174d0 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  of the caller to
174e0 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65   eventually free
174f0 20 74 68 65 20 6f 62 6a 65 63 74 20 75 73 69 6e   the object usin
17500 67 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66 72 65  g.** sqlite3_fre
17510 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  e()..**.** If an
17520 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c   error occurs, l
17530 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 63 6f  eave an error co
17540 64 65 20 61 6e 64 20 6d 65 73 73 61 67 65 20 69  de and message i
17550 6e 20 74 68 65 20 72 62 75 20 68 61 6e 64 6c 65  n the rbu handle
17560 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e 20 4e  .** and return N
17570 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 52  ULL..*/.static R
17580 62 75 53 74 61 74 65 20 2a 72 62 75 4c 6f 61 64  buState *rbuLoad
17590 53 74 61 74 65 28 73 71 6c 69 74 65 33 72 62 75  State(sqlite3rbu
175a0 20 2a 70 29 7b 0a 20 20 52 62 75 53 74 61 74 65   *p){.  RbuState
175b0 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 73 71   *pRet = 0;.  sq
175c0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
175d0 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b  t = 0;.  int rc;
175e0 0a 20 20 69 6e 74 20 72 63 32 3b 0a 0a 20 20 70  .  int rc2;..  p
175f0 52 65 74 20 3d 20 28 52 62 75 53 74 61 74 65 2a  Ret = (RbuState*
17600 29 72 62 75 4d 61 6c 6c 6f 63 28 70 2c 20 73 69  )rbuMalloc(p, si
17610 7a 65 6f 66 28 52 62 75 53 74 61 74 65 29 29 3b  zeof(RbuState));
17620 0a 20 20 69 66 28 20 70 52 65 74 3d 3d 30 20 29  .  if( pRet==0 )
17630 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 72 63   return 0;..  rc
17640 20 3d 20 70 72 65 70 61 72 65 46 72 65 65 41 6e   = prepareFreeAn
17650 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d  dCollectError(p-
17660 3e 64 62 52 62 75 2c 20 26 70 53 74 6d 74 2c 20  >dbRbu, &pStmt, 
17670 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 20 0a 20 20  &p->zErrmsg, .  
17680 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69      sqlite3_mpri
17690 6e 74 66 28 22 53 45 4c 45 43 54 20 6b 2c 20 76  ntf("SELECT k, v
176a0 20 46 52 4f 4d 20 25 73 2e 72 62 75 5f 73 74 61   FROM %s.rbu_sta
176b0 74 65 22 2c 20 70 2d 3e 7a 53 74 61 74 65 44 62  te", p->zStateDb
176c0 29 0a 20 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  ).  );.  while( 
176d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
176e0 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
176f0 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
17700 20 29 7b 0a 20 20 20 20 73 77 69 74 63 68 28 20   ){.    switch( 
17710 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
17720 6e 74 28 70 53 74 6d 74 2c 20 30 29 20 29 7b 0a  nt(pStmt, 0) ){.
17730 20 20 20 20 20 20 63 61 73 65 20 52 42 55 5f 53        case RBU_S
17740 54 41 54 45 5f 53 54 41 47 45 3a 0a 20 20 20 20  TATE_STAGE:.    
17750 20 20 20 20 70 52 65 74 2d 3e 65 53 74 61 67 65      pRet->eStage
17760 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
17770 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 31 29 3b  n_int(pStmt, 1);
17780 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 52 65  .        if( pRe
17790 74 2d 3e 65 53 74 61 67 65 21 3d 52 42 55 5f 53  t->eStage!=RBU_S
177a0 54 41 47 45 5f 4f 41 4c 0a 20 20 20 20 20 20 20  TAGE_OAL.       
177b0 20 20 26 26 20 70 52 65 74 2d 3e 65 53 74 61 67    && pRet->eStag
177c0 65 21 3d 52 42 55 5f 53 54 41 47 45 5f 4d 4f 56  e!=RBU_STAGE_MOV
177d0 45 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 52  E.         && pR
177e0 65 74 2d 3e 65 53 74 61 67 65 21 3d 52 42 55 5f  et->eStage!=RBU_
177f0 53 54 41 47 45 5f 43 4b 50 54 0a 20 20 20 20 20  STAGE_CKPT.     
17800 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
17810 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 43  p->rc = SQLITE_C
17820 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20  ORRUPT;.        
17830 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  }.        break;
17840 0a 0a 20 20 20 20 20 20 63 61 73 65 20 52 42 55  ..      case RBU
17850 5f 53 54 41 54 45 5f 54 42 4c 3a 0a 20 20 20 20  _STATE_TBL:.    
17860 20 20 20 20 70 52 65 74 2d 3e 7a 54 62 6c 20 3d      pRet->zTbl =
17870 20 72 62 75 53 74 72 6e 64 75 70 28 28 63 68 61   rbuStrndup((cha
17880 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
17890 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31 29  n_text(pStmt, 1)
178a0 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20  , &rc);.        
178b0 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61  break;..      ca
178c0 73 65 20 52 42 55 5f 53 54 41 54 45 5f 49 44 58  se RBU_STATE_IDX
178d0 3a 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e  :.        pRet->
178e0 7a 49 64 78 20 3d 20 72 62 75 53 74 72 6e 64 75  zIdx = rbuStrndu
178f0 70 28 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  p((char*)sqlite3
17900 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74  _column_text(pSt
17910 6d 74 2c 20 31 29 2c 20 26 72 63 29 3b 0a 20 20  mt, 1), &rc);.  
17920 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
17930 20 20 20 20 63 61 73 65 20 52 42 55 5f 53 54 41      case RBU_STA
17940 54 45 5f 52 4f 57 3a 0a 20 20 20 20 20 20 20 20  TE_ROW:.        
17950 70 52 65 74 2d 3e 6e 52 6f 77 20 3d 20 73 71 6c  pRet->nRow = sql
17960 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
17970 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20 20  pStmt, 1);.     
17980 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20     break;..     
17990 20 63 61 73 65 20 52 42 55 5f 53 54 41 54 45 5f   case RBU_STATE_
179a0 50 52 4f 47 52 45 53 53 3a 0a 20 20 20 20 20 20  PROGRESS:.      
179b0 20 20 70 52 65 74 2d 3e 6e 50 72 6f 67 72 65 73    pRet->nProgres
179c0 73 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  s = sqlite3_colu
179d0 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20  mn_int64(pStmt, 
179e0 31 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  1);.        brea
179f0 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20 52  k;..      case R
17a00 42 55 5f 53 54 41 54 45 5f 43 4b 50 54 3a 0a 20  BU_STATE_CKPT:. 
17a10 20 20 20 20 20 20 20 70 52 65 74 2d 3e 69 57 61         pRet->iWa
17a20 6c 43 6b 73 75 6d 20 3d 20 73 71 6c 69 74 65 33  lCksum = sqlite3
17a30 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53  _column_int64(pS
17a40 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  tmt, 1);.       
17a50 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 63   break;..      c
17a60 61 73 65 20 52 42 55 5f 53 54 41 54 45 5f 43 4f  ase RBU_STATE_CO
17a70 4f 4b 49 45 3a 0a 20 20 20 20 20 20 20 20 70 52  OKIE:.        pR
17a80 65 74 2d 3e 69 43 6f 6f 6b 69 65 20 3d 20 28 75  et->iCookie = (u
17a90 33 32 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  32)sqlite3_colum
17aa0 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 31  n_int64(pStmt, 1
17ab0 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
17ac0 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20 52 42  ;..      case RB
17ad0 55 5f 53 54 41 54 45 5f 4f 41 4c 53 5a 3a 0a 20  U_STATE_OALSZ:. 
17ae0 20 20 20 20 20 20 20 70 52 65 74 2d 3e 69 4f 61         pRet->iOa
17af0 6c 53 7a 20 3d 20 28 75 33 32 29 73 71 6c 69 74  lSz = (u32)sqlit
17b00 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28  e3_column_int64(
17b10 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20 20  pStmt, 1);.     
17b20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20     break;..     
17b30 20 63 61 73 65 20 52 42 55 5f 53 54 41 54 45 5f   case RBU_STATE_
17b40 50 48 41 53 45 4f 4e 45 53 54 45 50 3a 0a 20 20  PHASEONESTEP:.  
17b50 20 20 20 20 20 20 70 52 65 74 2d 3e 6e 50 68 61        pRet->nPha
17b60 73 65 4f 6e 65 53 74 65 70 20 3d 20 28 75 33 32  seOneStep = (u32
17b70 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
17b80 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 31 29 3b  int64(pStmt, 1);
17b90 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
17ba0 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  .      default:.
17bb0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
17bc0 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  ITE_CORRUPT;.   
17bd0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
17be0 7d 0a 20 20 7d 0a 20 20 72 63 32 20 3d 20 73 71  }.  }.  rc2 = sq
17bf0 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
17c00 53 74 6d 74 29 3b 0a 20 20 69 66 28 20 72 63 3d  Stmt);.  if( rc=
17c10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20  =SQLITE_OK ) rc 
17c20 3d 20 72 63 32 3b 0a 0a 20 20 70 2d 3e 72 63 20  = rc2;..  p->rc 
17c30 3d 20 72 63 3b 0a 20 20 72 65 74 75 72 6e 20 70  = rc;.  return p
17c40 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  Ret;.}../*.** Co
17c50 6d 70 61 72 65 20 73 74 72 69 6e 67 73 20 7a 31  mpare strings z1
17c60 20 61 6e 64 20 7a 32 2c 20 72 65 74 75 72 6e 69   and z2, returni
17c70 6e 67 20 30 20 69 66 20 74 68 65 79 20 61 72 65  ng 0 if they are
17c80 20 69 64 65 6e 74 69 63 61 6c 2c 20 6f 72 20 6e   identical, or n
17c90 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 6f 74 68 65 72  on-zero.** other
17ca0 77 69 73 65 2e 20 45 69 74 68 65 72 20 6f 72 20  wise. Either or 
17cb0 62 6f 74 68 20 61 72 67 75 6d 65 6e 74 20 6d 61  both argument ma
17cc0 79 20 62 65 20 4e 55 4c 4c 2e 20 54 77 6f 20 4e  y be NULL. Two N
17cd0 55 4c 4c 20 76 61 6c 75 65 73 20 61 72 65 0a 2a  ULL values are.*
17ce0 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 65 71 75  * considered equ
17cf0 61 6c 2c 20 61 6e 64 20 4e 55 4c 4c 20 69 73 20  al, and NULL is 
17d00 63 6f 6e 73 69 64 65 72 65 64 20 64 69 73 74 69  considered disti
17d10 6e 63 74 20 66 72 6f 6d 20 61 6c 6c 20 6f 74 68  nct from all oth
17d20 65 72 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a 73 74  er values..*/.st
17d30 61 74 69 63 20 69 6e 74 20 72 62 75 53 74 72 43  atic int rbuStrC
17d40 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20 63 68 61  ompare(const cha
17d50 72 20 2a 7a 31 2c 20 63 6f 6e 73 74 20 63 68 61  r *z1, const cha
17d60 72 20 2a 7a 32 29 7b 0a 20 20 69 66 28 20 7a 31  r *z2){.  if( z1
17d70 3d 3d 30 20 26 26 20 7a 32 3d 3d 30 20 29 20 72  ==0 && z2==0 ) r
17d80 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 7a  eturn 0;.  if( z
17d90 31 3d 3d 30 20 7c 7c 20 7a 32 3d 3d 30 20 29 20  1==0 || z2==0 ) 
17da0 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75  return 1;.  retu
17db0 72 6e 20 28 73 71 6c 69 74 65 33 5f 73 74 72 69  rn (sqlite3_stri
17dc0 63 6d 70 28 7a 31 2c 20 7a 32 29 21 3d 30 29 3b  cmp(z1, z2)!=0);
17dd0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
17de0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
17df0 64 20 61 73 20 70 61 72 74 20 6f 66 20 73 71 6c  d as part of sql
17e00 69 74 65 33 72 62 75 5f 6f 70 65 6e 28 29 20 77  ite3rbu_open() w
17e10 68 65 6e 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67  hen initializing
17e20 0a 2a 2a 20 61 6e 20 72 62 75 20 68 61 6e 64 6c  .** an rbu handl
17e30 65 20 69 6e 20 4f 41 4c 20 73 74 61 67 65 2e 20  e in OAL stage. 
17e40 49 66 20 74 68 65 20 72 62 75 20 75 70 64 61 74  If the rbu updat
17e50 65 20 68 61 73 20 6e 6f 74 20 73 74 61 72 74 65  e has not starte
17e60 64 20 28 69 2e 65 2e 0a 2a 2a 20 74 68 65 20 72  d (i.e..** the r
17e70 62 75 5f 73 74 61 74 65 20 74 61 62 6c 65 20 77  bu_state table w
17e80 61 73 20 65 6d 70 74 79 29 20 69 74 20 69 73 20  as empty) it is 
17e90 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69  a no-op. Otherwi
17ea0 73 65 2c 20 69 74 20 61 72 72 61 6e 67 65 73 0a  se, it arranges.
17eb0 2a 2a 20 74 68 69 6e 67 73 20 73 6f 20 74 68 61  ** things so tha
17ec0 74 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20  t the next call 
17ed0 74 6f 20 73 71 6c 69 74 65 33 72 62 75 5f 73 74  to sqlite3rbu_st
17ee0 65 70 28 29 20 63 6f 6e 74 69 6e 75 65 73 20 6f  ep() continues o
17ef0 6e 20 66 72 6f 6d 0a 2a 2a 20 77 68 65 72 65 20  n from.** where 
17f00 74 68 65 20 70 72 65 76 69 6f 75 73 20 72 62 75  the previous rbu
17f10 20 68 61 6e 64 6c 65 20 6c 65 66 74 20 6f 66 66   handle left off
17f20 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
17f30 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65  ror occurs, an e
17f40 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 65 72  rror code and er
17f50 72 6f 72 20 6d 65 73 73 61 67 65 20 61 72 65 20  ror message are 
17f60 6c 65 66 74 20 69 6e 20 74 68 65 0a 2a 2a 20 72  left in the.** r
17f70 62 75 20 68 61 6e 64 6c 65 20 70 61 73 73 65 64  bu handle passed
17f80 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
17f90 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  gument..*/.stati
17fa0 63 20 76 6f 69 64 20 72 62 75 53 65 74 75 70 4f  c void rbuSetupO
17fb0 61 6c 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70  al(sqlite3rbu *p
17fc0 2c 20 52 62 75 53 74 61 74 65 20 2a 70 53 74 61  , RbuState *pSta
17fd0 74 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  te){.  assert( p
17fe0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
17ff0 29 3b 0a 20 20 69 66 28 20 70 53 74 61 74 65 2d  );.  if( pState-
18000 3e 7a 54 62 6c 20 29 7b 0a 20 20 20 20 52 62 75  >zTbl ){.    Rbu
18010 4f 62 6a 49 74 65 72 20 2a 70 49 74 65 72 20 3d  ObjIter *pIter =
18020 20 26 70 2d 3e 6f 62 6a 69 74 65 72 3b 0a 20 20   &p->objiter;.  
18030 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
18040 45 5f 4f 4b 3b 0a 0a 20 20 20 20 77 68 69 6c 65  E_OK;..    while
18050 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
18060 26 26 20 70 49 74 65 72 2d 3e 7a 54 62 6c 20 26  && pIter->zTbl &
18070 26 20 28 70 49 74 65 72 2d 3e 62 43 6c 65 61 6e  & (pIter->bClean
18080 75 70 20 0a 20 20 20 20 20 20 20 7c 7c 20 72 62  up .       || rb
18090 75 53 74 72 43 6f 6d 70 61 72 65 28 70 49 74 65  uStrCompare(pIte
180a0 72 2d 3e 7a 49 64 78 2c 20 70 53 74 61 74 65 2d  r->zIdx, pState-
180b0 3e 7a 49 64 78 29 0a 20 20 20 20 20 20 20 7c 7c  >zIdx).       ||
180c0 20 72 62 75 53 74 72 43 6f 6d 70 61 72 65 28 70   rbuStrCompare(p
180d0 49 74 65 72 2d 3e 7a 54 62 6c 2c 20 70 53 74 61  Iter->zTbl, pSta
180e0 74 65 2d 3e 7a 54 62 6c 29 20 0a 20 20 20 20 29  te->zTbl) .    )
180f0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 62  ){.      rc = rb
18100 75 4f 62 6a 49 74 65 72 4e 65 78 74 28 70 2c 20  uObjIterNext(p, 
18110 70 49 74 65 72 29 3b 0a 20 20 20 20 7d 0a 0a 20  pIter);.    }.. 
18120 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
18130 45 5f 4f 4b 20 26 26 20 21 70 49 74 65 72 2d 3e  E_OK && !pIter->
18140 7a 54 62 6c 20 29 7b 0a 20 20 20 20 20 20 72 63  zTbl ){.      rc
18150 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
18160 0a 20 20 20 20 20 20 70 2d 3e 7a 45 72 72 6d 73  .      p->zErrms
18170 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  g = sqlite3_mpri
18180 6e 74 66 28 22 72 62 75 5f 73 74 61 74 65 20 6d  ntf("rbu_state m
18190 69 73 6d 61 74 63 68 20 65 72 72 6f 72 22 29 3b  ismatch error");
181a0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
181b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
181c0 0a 20 20 20 20 20 20 70 2d 3e 6e 53 74 65 70 20  .      p->nStep 
181d0 3d 20 70 53 74 61 74 65 2d 3e 6e 52 6f 77 3b 0a  = pState->nRow;.
181e0 20 20 20 20 20 20 72 63 20 3d 20 72 62 75 4f 62        rc = rbuOb
181f0 6a 49 74 65 72 50 72 65 70 61 72 65 41 6c 6c 28  jIterPrepareAll(
18200 70 2c 20 26 70 2d 3e 6f 62 6a 69 74 65 72 2c 20  p, &p->objiter, 
18210 70 2d 3e 6e 53 74 65 70 29 3b 0a 20 20 20 20 7d  p->nStep);.    }
18220 0a 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63  ..    p->rc = rc
18230 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
18240 66 20 74 68 65 72 65 20 69 73 20 61 20 22 2a 2d  f there is a "*-
18250 6f 61 6c 22 20 66 69 6c 65 20 69 6e 20 74 68 65  oal" file in the
18260 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 63 6f 72   file-system cor
18270 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68  responding to th
18280 65 0a 2a 2a 20 74 61 72 67 65 74 20 64 61 74 61  e.** target data
18290 62 61 73 65 20 69 6e 20 74 68 65 20 66 69 6c 65  base in the file
182a0 2d 73 79 73 74 65 6d 2c 20 64 65 6c 65 74 65 20  -system, delete 
182b0 69 74 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  it. If an error 
182c0 6f 63 63 75 72 73 2c 0a 2a 2a 20 6c 65 61 76 65  occurs,.** leave
182d0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 61   an error code a
182e0 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  nd error message
182f0 20 69 6e 20 74 68 65 20 72 62 75 20 68 61 6e 64   in the rbu hand
18300 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  le..*/.static vo
18310 69 64 20 72 62 75 44 65 6c 65 74 65 4f 61 6c 46  id rbuDeleteOalF
18320 69 6c 65 28 73 71 6c 69 74 65 33 72 62 75 20 2a  ile(sqlite3rbu *
18330 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4f 61 6c  p){.  char *zOal
18340 20 3d 20 72 62 75 4d 50 72 69 6e 74 66 28 70 2c   = rbuMPrintf(p,
18350 20 22 25 73 2d 6f 61 6c 22 2c 20 70 2d 3e 7a 54   "%s-oal", p->zT
18360 61 72 67 65 74 29 3b 0a 20 20 69 66 28 20 7a 4f  arget);.  if( zO
18370 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  al ){.    sqlite
18380 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 73 71  3_vfs *pVfs = sq
18390 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30  lite3_vfs_find(0
183a0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
183b0 56 66 73 20 26 26 20 70 2d 3e 72 63 3d 3d 53 51  Vfs && p->rc==SQ
183c0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 7a 45  LITE_OK && p->zE
183d0 72 72 6d 73 67 3d 3d 30 20 29 3b 0a 20 20 20 20  rrmsg==0 );.    
183e0 70 56 66 73 2d 3e 78 44 65 6c 65 74 65 28 70 56  pVfs->xDelete(pV
183f0 66 73 2c 20 7a 4f 61 6c 2c 20 30 29 3b 0a 20 20  fs, zOal, 0);.  
18400 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
18410 4f 61 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  Oal);.  }.}../*.
18420 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 70 72  ** Allocate a pr
18430 69 76 61 74 65 20 72 62 75 20 56 46 53 20 66 6f  ivate rbu VFS fo
18440 72 20 74 68 65 20 72 62 75 20 68 61 6e 64 6c 65  r the rbu handle
18450 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 6f   passed as the o
18460 6e 6c 79 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e  nly.** argument.
18470 20 54 68 69 73 20 56 46 53 20 77 69 6c 6c 20 62   This VFS will b
18480 65 20 75 73 65 64 20 75 6e 6c 65 73 73 20 74 68  e used unless th
18490 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
184a0 33 72 62 75 5f 6f 70 65 6e 28 29 0a 2a 2a 20 73  3rbu_open().** s
184b0 70 65 63 69 66 69 65 64 20 61 20 55 52 49 20 77  pecified a URI w
184c0 69 74 68 20 61 20 76 66 73 3d 3f 20 6f 70 74 69  ith a vfs=? opti
184d0 6f 6e 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 61  on in place of a
184e0 20 74 61 72 67 65 74 20 64 61 74 61 62 61 73 65   target database
184f0 0a 2a 2a 20 66 69 6c 65 20 6e 61 6d 65 2e 0a 2a  .** file name..*
18500 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62  /.static void rb
18510 75 43 72 65 61 74 65 56 66 73 28 73 71 6c 69 74  uCreateVfs(sqlit
18520 65 33 72 62 75 20 2a 70 29 7b 0a 20 20 69 6e 74  e3rbu *p){.  int
18530 20 72 6e 64 3b 0a 20 20 63 68 61 72 20 7a 52 6e   rnd;.  char zRn
18540 64 5b 36 34 5d 3b 0a 0a 20 20 61 73 73 65 72 74  d[64];..  assert
18550 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
18560 4f 4b 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  OK );.  sqlite3_
18570 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f  randomness(sizeo
18580 66 28 69 6e 74 29 2c 20 28 76 6f 69 64 2a 29 26  f(int), (void*)&
18590 72 6e 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  rnd);.  sqlite3_
185a0 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
185b0 7a 52 6e 64 29 2c 20 7a 52 6e 64 2c 20 22 72 62  zRnd), zRnd, "rb
185c0 75 5f 76 66 73 5f 25 64 22 2c 20 72 6e 64 29 3b  u_vfs_%d", rnd);
185d0 0a 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74  .  p->rc = sqlit
185e0 65 33 72 62 75 5f 63 72 65 61 74 65 5f 76 66 73  e3rbu_create_vfs
185f0 28 7a 52 6e 64 2c 20 30 29 3b 0a 20 20 69 66 28  (zRnd, 0);.  if(
18600 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
18610 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
18620 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 73 71 6c  _vfs *pVfs = sql
18630 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 7a 52  ite3_vfs_find(zR
18640 6e 64 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  nd);.    assert(
18650 20 70 56 66 73 20 29 3b 0a 20 20 20 20 70 2d 3e   pVfs );.    p->
18660 7a 56 66 73 4e 61 6d 65 20 3d 20 70 56 66 73 2d  zVfsName = pVfs-
18670 3e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f  >zName;.  }.}../
18680 2a 0a 2a 2a 20 44 65 73 74 72 6f 79 20 74 68 65  *.** Destroy the
18690 20 70 72 69 76 61 74 65 20 56 46 53 20 63 72 65   private VFS cre
186a0 61 74 65 64 20 66 6f 72 20 74 68 65 20 72 62 75  ated for the rbu
186b0 20 68 61 6e 64 6c 65 20 70 61 73 73 65 64 20 61   handle passed a
186c0 73 20 74 68 65 20 6f 6e 6c 79 0a 2a 2a 20 61 72  s the only.** ar
186d0 67 75 6d 65 6e 74 20 62 79 20 61 6e 20 65 61 72  gument by an ear
186e0 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20 72 62 75  lier call to rbu
186f0 43 72 65 61 74 65 56 66 73 28 29 2e 0a 2a 2f 0a  CreateVfs()..*/.
18700 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75 44  static void rbuD
18710 65 6c 65 74 65 56 66 73 28 73 71 6c 69 74 65 33  eleteVfs(sqlite3
18720 72 62 75 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  rbu *p){.  if( p
18730 2d 3e 7a 56 66 73 4e 61 6d 65 20 29 7b 0a 20 20  ->zVfsName ){.  
18740 20 20 73 71 6c 69 74 65 33 72 62 75 5f 64 65 73    sqlite3rbu_des
18750 74 72 6f 79 5f 76 66 73 28 70 2d 3e 7a 56 66 73  troy_vfs(p->zVfs
18760 4e 61 6d 65 29 3b 0a 20 20 20 20 70 2d 3e 7a 56  Name);.    p->zV
18770 66 73 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a  fsName = 0;.  }.
18780 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74  }../*.**.*/.stat
18790 69 63 20 76 6f 69 64 20 72 62 75 49 6e 64 65 78  ic void rbuIndex
187a0 43 6e 74 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  CntFunc(.  sqlit
187b0 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78  e3_context *pCtx
187c0 2c 20 0a 20 20 69 6e 74 20 6e 56 61 6c 2c 0a 20  , .  int nVal,. 
187d0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
187e0 2a 61 70 56 61 6c 0a 29 7b 0a 20 20 73 71 6c 69  *apVal.){.  sqli
187f0 74 65 33 72 62 75 20 2a 70 20 3d 20 28 73 71 6c  te3rbu *p = (sql
18800 69 74 65 33 72 62 75 2a 29 73 71 6c 69 74 65 33  ite3rbu*)sqlite3
18810 5f 75 73 65 72 5f 64 61 74 61 28 70 43 74 78 29  _user_data(pCtx)
18820 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ;.  sqlite3_stmt
18830 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63   *pStmt = 0;.  c
18840 68 61 72 20 2a 7a 45 72 72 6d 73 67 20 3d 20 30  har *zErrmsg = 0
18850 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  ;.  int rc;..  a
18860 73 73 65 72 74 28 20 6e 56 61 6c 3d 3d 31 20 29  ssert( nVal==1 )
18870 3b 0a 20 20 0a 20 20 72 63 20 3d 20 70 72 65 70  ;.  .  rc = prep
18880 61 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63  areFreeAndCollec
18890 74 45 72 72 6f 72 28 70 2d 3e 64 62 4d 61 69 6e  tError(p->dbMain
188a0 2c 20 26 70 53 74 6d 74 2c 20 26 7a 45 72 72 6d  , &pStmt, &zErrm
188b0 73 67 2c 20 0a 20 20 20 20 20 20 73 71 6c 69 74  sg, .      sqlit
188c0 65 33 5f 6d 70 72 69 6e 74 66 28 22 50 52 41 47  e3_mprintf("PRAG
188d0 4d 41 20 69 6e 64 65 78 5f 6c 69 73 74 20 3d 20  MA index_list = 
188e0 25 51 22 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  %Q", sqlite3_val
188f0 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 30 5d  ue_text(apVal[0]
18900 29 29 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63  )).  );.  if( rc
18910 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
18920 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
18930 74 5f 65 72 72 6f 72 28 70 43 74 78 2c 20 7a 45  t_error(pCtx, zE
18940 72 72 6d 73 67 2c 20 2d 31 29 3b 0a 20 20 7d 65  rrmsg, -1);.  }e
18950 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 49 6e  lse{.    int nIn
18960 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 77 68 69  dex = 0;.    whi
18970 6c 65 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d  le( SQLITE_ROW==
18980 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
18990 6d 74 29 20 29 7b 0a 20 20 20 20 20 20 6e 49 6e  mt) ){.      nIn
189a0 64 65 78 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  dex++;.    }.   
189b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69   rc = sqlite3_fi
189c0 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
189d0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
189e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
189f0 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
18a00 28 70 43 74 78 2c 20 6e 49 6e 64 65 78 29 3b 0a  (pCtx, nIndex);.
18a10 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
18a20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
18a30 65 72 72 6f 72 28 70 43 74 78 2c 20 73 71 6c 69  error(pCtx, sqli
18a40 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62  te3_errmsg(p->db
18a50 4d 61 69 6e 29 2c 20 2d 31 29 3b 0a 20 20 20 20  Main), -1);.    
18a60 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  }.  }..  sqlite3
18a70 5f 66 72 65 65 28 7a 45 72 72 6d 73 67 29 3b 0a  _free(zErrmsg);.
18a80 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
18a90 52 42 55 20 64 61 74 61 62 61 73 65 20 63 6f 6e  RBU database con
18aa0 74 61 69 6e 73 20 74 68 65 20 72 62 75 5f 63 6f  tains the rbu_co
18ab0 75 6e 74 20 74 61 62 6c 65 2c 20 75 73 65 20 69  unt table, use i
18ac0 74 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 0a  t to initialize.
18ad0 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 72 62  ** the sqlite3rb
18ae0 75 2e 6e 50 68 61 73 65 4f 6e 65 53 74 65 70 20  u.nPhaseOneStep 
18af0 76 61 72 69 61 62 6c 65 2e 20 54 68 65 20 73 63  variable. The sc
18b00 68 65 6d 61 20 6f 66 20 74 68 65 20 72 62 75 5f  hema of the rbu_
18b10 63 6f 75 6e 74 20 74 61 62 6c 65 0a 2a 2a 20 69  count table.** i
18b20 73 20 61 73 73 75 6d 65 64 20 74 6f 20 63 6f 6e  s assumed to con
18b30 74 61 69 6e 20 74 68 65 20 73 61 6d 65 20 63 6f  tain the same co
18b40 6c 75 6d 6e 73 20 61 73 3a 0a 2a 2a 0a 2a 2a 20  lumns as:.**.** 
18b50 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 72    CREATE TABLE r
18b60 62 75 5f 63 6f 75 6e 74 28 74 62 6c 20 54 45 58  bu_count(tbl TEX
18b70 54 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 63  T PRIMARY KEY, c
18b80 6e 74 20 49 4e 54 45 47 45 52 29 20 57 49 54 48  nt INTEGER) WITH
18b90 4f 55 54 20 52 4f 57 49 44 3b 0a 2a 2a 0a 2a 2a  OUT ROWID;.**.**
18ba0 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65   There should be
18bb0 20 6f 6e 65 20 72 6f 77 20 69 6e 20 74 68 65 20   one row in the 
18bc0 74 61 62 6c 65 20 66 6f 72 20 65 61 63 68 20 64  table for each d
18bd0 61 74 61 5f 78 78 78 20 74 61 62 6c 65 20 69 6e  ata_xxx table in
18be0 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
18bf0 2e 20 54 68 65 20 27 74 62 6c 27 20 63 6f 6c 75  . The 'tbl' colu
18c00 6d 6e 20 73 68 6f 75 6c 64 20 63 6f 6e 74 61 69  mn should contai
18c10 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  n the name of a 
18c20 64 61 74 61 5f 78 78 78 20 74 61 62 6c 65 2c 0a  data_xxx table,.
18c30 2a 2a 20 61 6e 64 20 74 68 65 20 63 6e 74 20 63  ** and the cnt c
18c40 6f 6c 75 6d 6e 20 74 68 65 20 6e 75 6d 62 65 72  olumn the number
18c50 20 6f 66 20 72 6f 77 73 20 69 74 20 63 6f 6e 74   of rows it cont
18c60 61 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 73 71 6c 69  ains..**.** sqli
18c70 74 65 33 72 62 75 2e 6e 50 68 61 73 65 4f 6e 65  te3rbu.nPhaseOne
18c80 53 74 65 70 20 69 73 20 69 6e 69 74 69 61 6c 69  Step is initiali
18c90 7a 65 64 20 74 6f 20 74 68 65 20 73 75 6d 20 6f  zed to the sum o
18ca0 66 20 28 31 20 2b 20 6e 49 6e 64 65 78 29 20 2a  f (1 + nIndex) *
18cb0 20 63 6e 74 0a 2a 2a 20 66 6f 72 20 61 6c 6c 20   cnt.** for all 
18cc0 72 6f 77 73 20 69 6e 20 74 68 65 20 72 62 75 5f  rows in the rbu_
18cd0 63 6f 75 6e 74 20 74 61 62 6c 65 2c 20 77 68 65  count table, whe
18ce0 72 65 20 6e 49 6e 64 65 78 20 69 73 20 74 68 65  re nIndex is the
18cf0 20 6e 75 6d 62 65 72 20 6f 66 20 0a 2a 2a 20 69   number of .** i
18d00 6e 64 65 78 65 73 20 6f 6e 20 74 68 65 20 63 6f  ndexes on the co
18d10 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61 72 67  rresponding targ
18d20 65 74 20 64 61 74 61 62 61 73 65 20 74 61 62 6c  et database tabl
18d30 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
18d40 64 20 72 62 75 49 6e 69 74 50 68 61 73 65 4f 6e  d rbuInitPhaseOn
18d50 65 53 74 65 70 73 28 73 71 6c 69 74 65 33 72 62  eSteps(sqlite3rb
18d60 75 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  u *p){.  if( p->
18d70 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
18d80 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  .    sqlite3_stm
18d90 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  t *pStmt = 0;.  
18da0 20 20 69 6e 74 20 62 45 78 69 73 74 73 20 3d 20    int bExists = 
18db0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
18dc0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 62 75    /* True if rbu
18dd0 5f 63 6f 75 6e 74 20 65 78 69 73 74 73 20 2a 2f  _count exists */
18de0 0a 0a 20 20 20 20 70 2d 3e 6e 50 68 61 73 65 4f  ..    p->nPhaseO
18df0 6e 65 53 74 65 70 20 3d 20 2d 31 3b 0a 0a 20 20  neStep = -1;..  
18e00 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65    p->rc = sqlite
18e10 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
18e20 6e 28 70 2d 3e 64 62 52 62 75 2c 20 0a 20 20 20  n(p->dbRbu, .   
18e30 20 20 20 20 20 22 72 62 75 5f 69 6e 64 65 78 5f       "rbu_index_
18e40 63 6e 74 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f  cnt", 1, SQLITE_
18e50 55 54 46 38 2c 20 28 76 6f 69 64 2a 29 70 2c 20  UTF8, (void*)p, 
18e60 72 62 75 49 6e 64 65 78 43 6e 74 46 75 6e 63 2c  rbuIndexCntFunc,
18e70 20 30 2c 20 30 0a 20 20 20 20 29 3b 0a 20 20 0a   0, 0.    );.  .
18e80 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72      /* Check for
18e90 20 74 68 65 20 72 62 75 5f 63 6f 75 6e 74 20 74   the rbu_count t
18ea0 61 62 6c 65 2e 20 49 66 20 69 74 20 64 6f 65 73  able. If it does
18eb0 20 6e 6f 74 20 65 78 69 73 74 2c 20 6f 72 20 69   not exist, or i
18ec0 66 20 61 6e 20 65 72 72 6f 72 0a 20 20 20 20 2a  f an error.    *
18ed0 2a 20 6f 63 63 75 72 73 2c 20 6e 50 68 61 73 65  * occurs, nPhase
18ee0 4f 6e 65 53 74 65 70 20 77 69 6c 6c 20 62 65 20  OneStep will be 
18ef0 6c 65 66 74 20 73 65 74 20 74 6f 20 2d 31 2e 20  left set to -1. 
18f00 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  */.    if( p->rc
18f10 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
18f20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 72 65       p->rc = pre
18f30 70 61 72 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72  pareAndCollectEr
18f40 72 6f 72 28 70 2d 3e 64 62 52 62 75 2c 20 26 70  ror(p->dbRbu, &p
18f50 53 74 6d 74 2c 20 26 70 2d 3e 7a 45 72 72 6d 73  Stmt, &p->zErrms
18f60 67 2c 0a 20 20 20 20 20 20 20 20 20 20 22 53 45  g,.          "SE
18f70 4c 45 43 54 20 31 20 46 52 4f 4d 20 73 71 6c 69  LECT 1 FROM sqli
18f80 74 65 5f 6d 61 73 74 65 72 20 57 48 45 52 45 20  te_master WHERE 
18f90 74 62 6c 5f 6e 61 6d 65 20 3d 20 27 72 62 75 5f  tbl_name = 'rbu_
18fa0 63 6f 75 6e 74 27 22 0a 20 20 20 20 20 20 29 3b  count'".      );
18fb0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
18fc0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
18fd0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c  ){.      if( SQL
18fe0 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
18ff0 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a  _step(pStmt) ){.
19000 20 20 20 20 20 20 20 20 62 45 78 69 73 74 73 20          bExists 
19010 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
19020 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74     p->rc = sqlit
19030 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
19040 74 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  t);.    }.  .   
19050 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
19060 54 45 5f 4f 4b 20 26 26 20 62 45 78 69 73 74 73  TE_OK && bExists
19070 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20   ){.      p->rc 
19080 3d 20 70 72 65 70 61 72 65 41 6e 64 43 6f 6c 6c  = prepareAndColl
19090 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 52 62  ectError(p->dbRb
190a0 75 2c 20 26 70 53 74 6d 74 2c 20 26 70 2d 3e 7a  u, &pStmt, &p->z
190b0 45 72 72 6d 73 67 2c 0a 20 20 20 20 20 20 20 20  Errmsg,.        
190c0 20 20 22 53 45 4c 45 43 54 20 73 75 6d 28 63 6e    "SELECT sum(cn
190d0 74 20 2a 20 28 31 20 2b 20 72 62 75 5f 69 6e 64  t * (1 + rbu_ind
190e0 65 78 5f 63 6e 74 28 72 62 75 5f 74 61 72 67 65  ex_cnt(rbu_targe
190f0 74 5f 6e 61 6d 65 28 74 62 6c 29 29 29 29 22 0a  t_name(tbl))))".
19100 20 20 20 20 20 20 20 20 20 20 22 46 52 4f 4d 20            "FROM 
19110 72 62 75 5f 63 6f 75 6e 74 22 0a 20 20 20 20 20  rbu_count".     
19120 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   );.      if( p-
19130 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
19140 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 53 51  {.        if( SQ
19150 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65  LITE_ROW==sqlite
19160 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b  3_step(pStmt) ){
19170 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 50  .          p->nP
19180 68 61 73 65 4f 6e 65 53 74 65 70 20 3d 20 73 71  haseOneStep = sq
19190 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
191a0 36 34 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  64(pStmt, 0);.  
191b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
191c0 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  p->rc = sqlite3_
191d0 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
191e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
191f0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e   }.}../*.** Open
19200 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 6e 65   and return a ne
19210 77 20 52 42 55 20 68 61 6e 64 6c 65 2e 20 0a 2a  w RBU handle. .*
19220 2f 0a 73 71 6c 69 74 65 33 72 62 75 20 2a 73 71  /.sqlite3rbu *sq
19230 6c 69 74 65 33 72 62 75 5f 6f 70 65 6e 28 0a 20  lite3rbu_open(. 
19240 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
19250 72 67 65 74 2c 20 0a 20 20 63 6f 6e 73 74 20 63  rget, .  const c
19260 68 61 72 20 2a 7a 52 62 75 2c 0a 20 20 63 6f 6e  har *zRbu,.  con
19270 73 74 20 63 68 61 72 20 2a 7a 53 74 61 74 65 0a  st char *zState.
19280 29 7b 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20  ){.  sqlite3rbu 
19290 2a 70 3b 0a 20 20 73 69 7a 65 5f 74 20 6e 54 61  *p;.  size_t nTa
192a0 72 67 65 74 20 3d 20 73 74 72 6c 65 6e 28 7a 54  rget = strlen(zT
192b0 61 72 67 65 74 29 3b 0a 20 20 73 69 7a 65 5f 74  arget);.  size_t
192c0 20 6e 52 62 75 20 3d 20 73 74 72 6c 65 6e 28 7a   nRbu = strlen(z
192d0 52 62 75 29 3b 0a 20 20 73 69 7a 65 5f 74 20 6e  Rbu);.  size_t n
192e0 53 74 61 74 65 20 3d 20 7a 53 74 61 74 65 20 3f  State = zState ?
192f0 20 73 74 72 6c 65 6e 28 7a 53 74 61 74 65 29 20   strlen(zState) 
19300 3a 20 30 3b 0a 20 20 73 69 7a 65 5f 74 20 6e 42  : 0;.  size_t nB
19310 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 73 71 6c  yte = sizeof(sql
19320 69 74 65 33 72 62 75 29 20 2b 20 6e 54 61 72 67  ite3rbu) + nTarg
19330 65 74 2b 31 20 2b 20 6e 52 62 75 2b 31 2b 20 6e  et+1 + nRbu+1+ n
19340 53 74 61 74 65 2b 31 3b 0a 0a 20 20 70 20 3d 20  State+1;..  p = 
19350 28 73 71 6c 69 74 65 33 72 62 75 2a 29 73 71 6c  (sqlite3rbu*)sql
19360 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 42  ite3_malloc64(nB
19370 79 74 65 29 3b 0a 20 20 69 66 28 20 70 20 29 7b  yte);.  if( p ){
19380 0a 20 20 20 20 52 62 75 53 74 61 74 65 20 2a 70  .    RbuState *p
19390 53 74 61 74 65 20 3d 20 30 3b 0a 0a 20 20 20 20  State = 0;..    
193a0 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 63 75  /* Create the cu
193b0 73 74 6f 6d 20 56 46 53 2e 20 2a 2f 0a 20 20 20  stom VFS. */.   
193c0 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69   memset(p, 0, si
193d0 7a 65 6f 66 28 73 71 6c 69 74 65 33 72 62 75 29  zeof(sqlite3rbu)
193e0 29 3b 0a 20 20 20 20 72 62 75 43 72 65 61 74 65  );.    rbuCreate
193f0 56 66 73 28 70 29 3b 0a 0a 20 20 20 20 2f 2a 20  Vfs(p);..    /* 
19400 4f 70 65 6e 20 74 68 65 20 74 61 72 67 65 74 20  Open the target 
19410 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20  database */.    
19420 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
19430 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d  E_OK ){.      p-
19440 3e 7a 54 61 72 67 65 74 20 3d 20 28 63 68 61 72  >zTarget = (char
19450 2a 29 26 70 5b 31 5d 3b 0a 20 20 20 20 20 20 6d  *)&p[1];.      m
19460 65 6d 63 70 79 28 70 2d 3e 7a 54 61 72 67 65 74  emcpy(p->zTarget
19470 2c 20 7a 54 61 72 67 65 74 2c 20 6e 54 61 72 67  , zTarget, nTarg
19480 65 74 2b 31 29 3b 0a 20 20 20 20 20 20 70 2d 3e  et+1);.      p->
19490 7a 52 62 75 20 3d 20 26 70 2d 3e 7a 54 61 72 67  zRbu = &p->zTarg
194a0 65 74 5b 6e 54 61 72 67 65 74 2b 31 5d 3b 0a 20  et[nTarget+1];. 
194b0 20 20 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e 7a       memcpy(p->z
194c0 52 62 75 2c 20 7a 52 62 75 2c 20 6e 52 62 75 2b  Rbu, zRbu, nRbu+
194d0 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 53  1);.      if( zS
194e0 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  tate ){.        
194f0 70 2d 3e 7a 53 74 61 74 65 20 3d 20 26 70 2d 3e  p->zState = &p->
19500 7a 52 62 75 5b 6e 52 62 75 2b 31 5d 3b 0a 20 20  zRbu[nRbu+1];.  
19510 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e        memcpy(p->
19520 7a 53 74 61 74 65 2c 20 7a 53 74 61 74 65 2c 20  zState, zState, 
19530 6e 53 74 61 74 65 2b 31 29 3b 0a 20 20 20 20 20  nState+1);.     
19540 20 7d 0a 20 20 20 20 20 20 72 62 75 4f 70 65 6e   }.      rbuOpen
19550 44 61 74 61 62 61 73 65 28 70 29 3b 0a 20 20 20  Database(p);.   
19560 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 69 74   }..    /* If it
19570 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79   has not already
19580 20 62 65 65 6e 20 63 72 65 61 74 65 64 2c 20 63   been created, c
19590 72 65 61 74 65 20 74 68 65 20 72 62 75 5f 73 74  reate the rbu_st
195a0 61 74 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  ate table */.   
195b0 20 72 62 75 4d 50 72 69 6e 74 66 45 78 65 63 28   rbuMPrintfExec(
195c0 70 2c 20 70 2d 3e 64 62 52 62 75 2c 20 52 42 55  p, p->dbRbu, RBU
195d0 5f 43 52 45 41 54 45 5f 53 54 41 54 45 2c 20 70  _CREATE_STATE, p
195e0 2d 3e 7a 53 74 61 74 65 44 62 29 3b 0a 0a 20 20  ->zStateDb);..  
195f0 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
19600 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
19610 70 53 74 61 74 65 20 3d 20 72 62 75 4c 6f 61 64  pState = rbuLoad
19620 53 74 61 74 65 28 70 29 3b 0a 20 20 20 20 20 20  State(p);.      
19630 61 73 73 65 72 74 28 20 70 53 74 61 74 65 20 7c  assert( pState |
19640 7c 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f  | p->rc!=SQLITE_
19650 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OK );.      if( 
19660 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
19670 20 29 7b 0a 0a 20 20 20 20 20 20 20 20 69 66 28   ){..        if(
19680 20 70 53 74 61 74 65 2d 3e 65 53 74 61 67 65 3d   pState->eStage=
19690 3d 30 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20  =0 ){ .         
196a0 20 72 62 75 44 65 6c 65 74 65 4f 61 6c 46 69 6c   rbuDeleteOalFil
196b0 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(p);.          
196c0 72 62 75 49 6e 69 74 50 68 61 73 65 4f 6e 65 53  rbuInitPhaseOneS
196d0 74 65 70 73 28 70 29 3b 0a 20 20 20 20 20 20 20  teps(p);.       
196e0 20 20 20 70 2d 3e 65 53 74 61 67 65 20 3d 20 52     p->eStage = R
196f0 42 55 5f 53 54 41 47 45 5f 4f 41 4c 3b 0a 20 20  BU_STAGE_OAL;.  
19700 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
19710 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 67 65         p->eStage
19720 20 3d 20 70 53 74 61 74 65 2d 3e 65 53 74 61 67   = pState->eStag
19730 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
19740 20 20 20 20 20 70 2d 3e 6e 50 72 6f 67 72 65 73       p->nProgres
19750 73 20 3d 20 70 53 74 61 74 65 2d 3e 6e 50 72 6f  s = pState->nPro
19760 67 72 65 73 73 3b 0a 20 20 20 20 20 20 20 20 70  gress;.        p
19770 2d 3e 69 4f 61 6c 53 7a 20 3d 20 70 53 74 61 74  ->iOalSz = pStat
19780 65 2d 3e 69 4f 61 6c 53 7a 3b 0a 20 20 20 20 20  e->iOalSz;.     
19790 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73   }.    }.    ass
197a0 65 72 74 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49  ert( p->rc!=SQLI
197b0 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 65 53 74 61  TE_OK || p->eSta
197c0 67 65 21 3d 30 20 29 3b 0a 0a 20 20 20 20 69 66  ge!=0 );..    if
197d0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
197e0 4f 4b 20 26 26 20 70 2d 3e 70 54 61 72 67 65 74  OK && p->pTarget
197f0 46 64 2d 3e 70 57 61 6c 46 64 20 29 7b 0a 20 20  Fd->pWalFd ){.  
19800 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74 61 67      if( p->eStag
19810 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c  e==RBU_STAGE_OAL
19820 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72   ){.        p->r
19830 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
19840 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 7a 45 72  ;.        p->zEr
19850 72 6d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  rmsg = sqlite3_m
19860 70 72 69 6e 74 66 28 22 63 61 6e 6e 6f 74 20 75  printf("cannot u
19870 70 64 61 74 65 20 77 61 6c 20 6d 6f 64 65 20 64  pdate wal mode d
19880 61 74 61 62 61 73 65 22 29 3b 0a 20 20 20 20 20  atabase");.     
19890 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 65 53   }else if( p->eS
198a0 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f  tage==RBU_STAGE_
198b0 4d 4f 56 45 20 29 7b 0a 20 20 20 20 20 20 20 20  MOVE ){.        
198c0 70 2d 3e 65 53 74 61 67 65 20 3d 20 52 42 55 5f  p->eStage = RBU_
198d0 53 54 41 47 45 5f 43 4b 50 54 3b 0a 20 20 20 20  STAGE_CKPT;.    
198e0 20 20 20 20 70 2d 3e 6e 53 74 65 70 20 3d 20 30      p->nStep = 0
198f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
19900 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  .    if( p->rc==
19910 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20 26  SQLITE_OK.     &
19920 26 20 28 70 2d 3e 65 53 74 61 67 65 3d 3d 52 42  & (p->eStage==RB
19930 55 5f 53 54 41 47 45 5f 4f 41 4c 20 7c 7c 20 70  U_STAGE_OAL || p
19940 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54  ->eStage==RBU_ST
19950 41 47 45 5f 4d 4f 56 45 29 0a 20 20 20 20 20 26  AGE_MOVE).     &
19960 26 20 70 53 74 61 74 65 2d 3e 65 53 74 61 67 65  & pState->eStage
19970 21 3d 30 20 26 26 20 70 2d 3e 70 54 61 72 67 65  !=0 && p->pTarge
19980 74 46 64 2d 3e 69 43 6f 6f 6b 69 65 21 3d 70 53  tFd->iCookie!=pS
19990 74 61 74 65 2d 3e 69 43 6f 6f 6b 69 65 0a 20 20  tate->iCookie.  
199a0 20 20 29 7b 20 20 20 0a 20 20 20 20 20 20 2f 2a    ){   .      /*
199b0 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 28   At this point (
199c0 70 54 61 72 67 65 74 46 64 2d 3e 69 43 6f 6f 6b  pTargetFd->iCook
199d0 69 65 29 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ie) contains the
199e0 20 76 61 6c 75 65 20 6f 66 20 74 68 65 0a 20 20   value of the.  
199f0 20 20 20 20 2a 2a 20 63 68 61 6e 67 65 2d 63 6f      ** change-co
19a00 75 6e 74 65 72 20 63 6f 6f 6b 69 65 20 28 74 68  unter cookie (th
19a10 65 20 74 68 69 6e 67 20 74 68 61 74 20 67 65 74  e thing that get
19a20 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 68  s incremented wh
19a30 65 6e 20 61 20 0a 20 20 20 20 20 20 2a 2a 20 74  en a .      ** t
19a40 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f  ransaction is co
19a50 6d 6d 69 74 74 65 64 20 69 6e 20 72 6f 6c 6c 62  mmitted in rollb
19a60 61 63 6b 20 6d 6f 64 65 29 20 63 75 72 72 65 6e  ack mode) curren
19a70 74 6c 79 20 73 74 6f 72 65 64 20 6f 6e 20 0a 20  tly stored on . 
19a80 20 20 20 20 20 2a 2a 20 70 61 67 65 20 31 20 6f       ** page 1 o
19a90 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
19aa0 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 70 2d  ile. */.      p-
19ab0 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53  >rc = SQLITE_BUS
19ac0 59 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 45 72 72  Y;.      p->zErr
19ad0 6d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  msg = sqlite3_mp
19ae0 72 69 6e 74 66 28 22 64 61 74 61 62 61 73 65 20  rintf("database 
19af0 6d 6f 64 69 66 69 65 64 20 64 75 72 69 6e 67 20  modified during 
19b00 72 62 75 20 75 70 64 61 74 65 22 29 3b 0a 20 20  rbu update");.  
19b10 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e    }..    if( p->
19b20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
19b30 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65 53  .      if( p->eS
19b40 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f  tage==RBU_STAGE_
19b50 4f 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 73  OAL ){.        s
19b60 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
19b70 64 62 4d 61 69 6e 3b 0a 0a 20 20 20 20 20 20 20  dbMain;..       
19b80 20 2f 2a 20 4f 70 65 6e 20 74 72 61 6e 73 61 63   /* Open transac
19b90 74 69 6f 6e 73 20 62 6f 74 68 20 64 61 74 61 62  tions both datab
19ba0 61 73 65 73 2e 20 54 68 65 20 2a 2d 6f 61 6c 20  ases. The *-oal 
19bb0 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 6f  file is opened o
19bc0 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 72 65  r.        ** cre
19bd0 61 74 65 64 20 61 74 20 74 68 69 73 20 70 6f 69  ated at this poi
19be0 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  nt. */.        p
19bf0 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65  ->rc = sqlite3_e
19c00 78 65 63 28 64 62 2c 20 22 42 45 47 49 4e 20 49  xec(db, "BEGIN I
19c10 4d 4d 45 44 49 41 54 45 22 2c 20 30 2c 20 30 2c  MMEDIATE", 0, 0,
19c20 20 26 70 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a 20   &p->zErrmsg);. 
19c30 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63         if( p->rc
19c40 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
19c50 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d           p->rc =
19c60 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d   sqlite3_exec(p-
19c70 3e 64 62 52 62 75 2c 20 22 42 45 47 49 4e 20 49  >dbRbu, "BEGIN I
19c80 4d 4d 45 44 49 41 54 45 22 2c 20 30 2c 20 30 2c  MMEDIATE", 0, 0,
19c90 20 26 70 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a 20   &p->zErrmsg);. 
19ca0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
19cb0 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68    /* Check if th
19cc0 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
19cd0 69 73 20 61 20 7a 69 70 76 66 73 20 64 62 2e 20  is a zipvfs db. 
19ce0 49 66 20 69 74 20 69 73 2c 20 73 65 74 20 74 68  If it is, set th
19cf0 65 20 75 70 70 65 72 0a 20 20 20 20 20 20 20 20  e upper.        
19d00 2a 2a 20 6c 65 76 65 6c 20 70 61 67 65 72 20 74  ** level pager t
19d10 6f 20 75 73 65 20 22 6a 6f 75 72 6e 61 6c 5f 6d  o use "journal_m
19d20 6f 64 65 3d 6f 66 66 22 2e 20 54 68 69 73 20 70  ode=off". This p
19d30 72 65 76 65 6e 74 73 20 69 74 20 66 72 6f 6d 20  revents it from 
19d40 0a 20 20 20 20 20 20 20 20 2a 2a 20 67 65 6e 65  .        ** gene
19d50 72 61 74 69 6e 67 20 61 20 6c 61 72 67 65 20 6a  rating a large j
19d60 6f 75 72 6e 61 6c 20 75 73 69 6e 67 20 61 20 74  ournal using a t
19d70 65 6d 70 20 66 69 6c 65 2e 20 20 2a 2f 0a 20 20  emp file.  */.  
19d80 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
19d90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
19da0 20 20 20 20 20 20 20 20 69 6e 74 20 66 72 63 20          int frc 
19db0 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63  = sqlite3_file_c
19dc0 6f 6e 74 72 6f 6c 28 64 62 2c 20 22 6d 61 69 6e  ontrol(db, "main
19dd0 22 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  ", SQLITE_FCNTL_
19de0 5a 49 50 56 46 53 2c 20 30 29 3b 0a 20 20 20 20  ZIPVFS, 0);.    
19df0 20 20 20 20 20 20 69 66 28 20 66 72 63 3d 3d 53        if( frc==S
19e00 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19e10 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
19e20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c  sqlite3_exec(db,
19e30 20 22 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c   "PRAGMA journal
19e40 5f 6d 6f 64 65 3d 6f 66 66 22 2c 30 2c 30 2c 26  _mode=off",0,0,&
19e50 70 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a 20 20 20  p->zErrmsg);.   
19e60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
19e70 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 50   }..        /* P
19e80 6f 69 6e 74 20 74 68 65 20 6f 62 6a 65 63 74 20  oint the object 
19e90 69 74 65 72 61 74 6f 72 20 61 74 20 74 68 65 20  iterator at the 
19ea0 66 69 72 73 74 20 6f 62 6a 65 63 74 20 2a 2f 0a  first object */.
19eb0 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72          if( p->r
19ec0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
19ed0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20            p->rc 
19ee0 3d 20 72 62 75 4f 62 6a 49 74 65 72 46 69 72 73  = rbuObjIterFirs
19ef0 74 28 70 2c 20 26 70 2d 3e 6f 62 6a 69 74 65 72  t(p, &p->objiter
19f00 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  );.        }..  
19f10 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
19f20 52 42 55 20 64 61 74 61 62 61 73 65 20 63 6f 6e  RBU database con
19f30 74 61 69 6e 73 20 6e 6f 20 64 61 74 61 5f 78 78  tains no data_xx
19f40 78 20 74 61 62 6c 65 73 2c 20 64 65 63 6c 61 72  x tables, declar
19f50 65 20 74 68 65 20 52 42 55 0a 20 20 20 20 20 20  e the RBU.      
19f60 20 20 2a 2a 20 75 70 64 61 74 65 20 66 69 6e 69    ** update fini
19f70 73 68 65 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20  shed.  */.      
19f80 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
19f90 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 6f 62 6a  ITE_OK && p->obj
19fa0 69 74 65 72 2e 7a 54 62 6c 3d 3d 30 20 29 7b 0a  iter.zTbl==0 ){.
19fb0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20            p->rc 
19fc0 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  = SQLITE_DONE;. 
19fd0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
19fe0 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
19ff0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1a000 20 20 20 20 72 62 75 53 65 74 75 70 4f 61 6c 28      rbuSetupOal(
1a010 70 2c 20 70 53 74 61 74 65 29 3b 0a 20 20 20 20  p, pState);.    
1a020 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 7d 65 6c      }..      }el
1a030 73 65 20 69 66 28 20 70 2d 3e 65 53 74 61 67 65  se if( p->eStage
1a040 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4d 4f 56 45  ==RBU_STAGE_MOVE
1a050 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6e   ){.        /* n
1a060 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20 20 7d 65  o-op */.      }e
1a070 6c 73 65 20 69 66 28 20 70 2d 3e 65 53 74 61 67  lse if( p->eStag
1a080 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 43 4b 50  e==RBU_STAGE_CKP
1a090 54 20 29 7b 0a 20 20 20 20 20 20 20 20 72 62 75  T ){.        rbu
1a0a0 53 65 74 75 70 43 68 65 63 6b 70 6f 69 6e 74 28  SetupCheckpoint(
1a0b0 70 2c 20 70 53 74 61 74 65 29 3b 0a 20 20 20 20  p, pState);.    
1a0c0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 65    }else if( p->e
1a0d0 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45  Stage==RBU_STAGE
1a0e0 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20  _DONE ){.       
1a0f0 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
1a100 44 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73  DONE;.      }els
1a110 65 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63  e{.        p->rc
1a120 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
1a130 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  T;.      }.    }
1a140 0a 0a 20 20 20 20 72 62 75 46 72 65 65 53 74 61  ..    rbuFreeSta
1a150 74 65 28 70 53 74 61 74 65 29 3b 0a 20 20 7d 0a  te(pState);.  }.
1a160 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
1a170 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
1a180 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
1a190 65 20 75 73 65 64 20 62 79 20 70 52 62 75 2e 0a  e used by pRbu..
1a1a0 2a 2f 0a 73 71 6c 69 74 65 33 20 2a 73 71 6c 69  */.sqlite3 *sqli
1a1b0 74 65 33 72 62 75 5f 64 62 28 73 71 6c 69 74 65  te3rbu_db(sqlite
1a1c0 33 72 62 75 20 2a 70 52 62 75 2c 20 69 6e 74 20  3rbu *pRbu, int 
1a1d0 62 52 62 75 29 7b 0a 20 20 73 71 6c 69 74 65 33  bRbu){.  sqlite3
1a1e0 20 2a 64 62 20 3d 20 30 3b 0a 20 20 69 66 28 20   *db = 0;.  if( 
1a1f0 70 52 62 75 20 29 7b 0a 20 20 20 20 64 62 20 3d  pRbu ){.    db =
1a200 20 28 62 52 62 75 20 3f 20 70 52 62 75 2d 3e 64   (bRbu ? pRbu->d
1a210 62 52 62 75 20 3a 20 70 52 62 75 2d 3e 64 62 4d  bRbu : pRbu->dbM
1a220 61 69 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ain);.  }.  retu
1a230 72 6e 20 64 62 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn db;.}.../*.**
1a240 20 49 66 20 74 68 65 20 65 72 72 6f 72 20 63 6f   If the error co
1a250 64 65 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f  de currently sto
1a260 72 65 64 20 69 6e 20 74 68 65 20 52 42 55 20 68  red in the RBU h
1a270 61 6e 64 6c 65 20 69 73 20 53 51 4c 49 54 45 5f  andle is SQLITE_
1a280 43 4f 4e 53 54 52 41 49 4e 54 2c 0a 2a 2a 20 74  CONSTRAINT,.** t
1a290 68 65 6e 20 65 64 69 74 20 61 6e 79 20 65 72 72  hen edit any err
1a2a0 6f 72 20 6d 65 73 73 61 67 65 20 73 74 72 69 6e  or message strin
1a2b0 67 20 73 6f 20 61 73 20 74 6f 20 72 65 6d 6f 76  g so as to remov
1a2c0 65 20 61 6c 6c 20 6f 63 63 75 72 72 65 6e 63 65  e all occurrence
1a2d0 73 20 6f 66 0a 2a 2a 20 74 68 65 20 70 61 74 74  s of.** the patt
1a2e0 65 72 6e 20 22 72 62 75 5f 69 6d 70 5f 5b 30 2d  ern "rbu_imp_[0-
1a2f0 39 5d 2a 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  9]*"..*/.static 
1a300 76 6f 69 64 20 72 62 75 45 64 69 74 45 72 72 6d  void rbuEditErrm
1a310 73 67 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70  sg(sqlite3rbu *p
1a320 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  ){.  if( p->rc==
1a330 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
1a340 54 20 26 26 20 70 2d 3e 7a 45 72 72 6d 73 67 20  T && p->zErrmsg 
1a350 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
1a360 20 20 73 69 7a 65 5f 74 20 6e 45 72 72 6d 73 67    size_t nErrmsg
1a370 20 3d 20 73 74 72 6c 65 6e 28 70 2d 3e 7a 45 72   = strlen(p->zEr
1a380 72 6d 73 67 29 3b 0a 20 20 20 20 66 6f 72 28 69  rmsg);.    for(i
1a390 3d 30 3b 20 69 3c 28 6e 45 72 72 6d 73 67 2d 38  =0; i<(nErrmsg-8
1a3a0 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ); i++){.      i
1a3b0 66 28 20 6d 65 6d 63 6d 70 28 26 70 2d 3e 7a 45  f( memcmp(&p->zE
1a3c0 72 72 6d 73 67 5b 69 5d 2c 20 22 72 62 75 5f 69  rrmsg[i], "rbu_i
1a3d0 6d 70 5f 22 2c 20 38 29 3d 3d 30 20 29 7b 0a 20  mp_", 8)==0 ){. 
1a3e0 20 20 20 20 20 20 20 69 6e 74 20 6e 44 65 6c 20         int nDel 
1a3f0 3d 20 38 3b 0a 20 20 20 20 20 20 20 20 77 68 69  = 8;.        whi
1a400 6c 65 28 20 70 2d 3e 7a 45 72 72 6d 73 67 5b 69  le( p->zErrmsg[i
1a410 2b 6e 44 65 6c 5d 3e 3d 27 30 27 20 26 26 20 70  +nDel]>='0' && p
1a420 2d 3e 7a 45 72 72 6d 73 67 5b 69 2b 6e 44 65 6c  ->zErrmsg[i+nDel
1a430 5d 3c 3d 27 39 27 20 29 20 6e 44 65 6c 2b 2b 3b  ]<='9' ) nDel++;
1a440 0a 20 20 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65  .        memmove
1a450 28 26 70 2d 3e 7a 45 72 72 6d 73 67 5b 69 5d 2c  (&p->zErrmsg[i],
1a460 20 26 70 2d 3e 7a 45 72 72 6d 73 67 5b 69 2b 6e   &p->zErrmsg[i+n
1a470 44 65 6c 5d 2c 20 6e 45 72 72 6d 73 67 20 2b 20  Del], nErrmsg + 
1a480 31 20 2d 20 69 20 2d 20 6e 44 65 6c 29 3b 0a 20  1 - i - nDel);. 
1a490 20 20 20 20 20 20 20 6e 45 72 72 6d 73 67 20 2d         nErrmsg -
1a4a0 3d 20 6e 44 65 6c 3b 0a 20 20 20 20 20 20 7d 0a  = nDel;.      }.
1a4b0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
1a4c0 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 52 42 55  ** Close the RBU
1a4d0 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20   handle..*/.int 
1a4e0 73 71 6c 69 74 65 33 72 62 75 5f 63 6c 6f 73 65  sqlite3rbu_close
1a4f0 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20  (sqlite3rbu *p, 
1a500 63 68 61 72 20 2a 2a 70 7a 45 72 72 6d 73 67 29  char **pzErrmsg)
1a510 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66  {.  int rc;.  if
1a520 28 20 70 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 43  ( p ){..    /* C
1a530 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61  ommit the transa
1a540 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 2a 2d 6f  ction to the *-o
1a550 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  al file. */.    
1a560 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
1a570 45 5f 4f 4b 20 26 26 20 70 2d 3e 65 53 74 61 67  E_OK && p->eStag
1a580 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c  e==RBU_STAGE_OAL
1a590 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20   ){.      p->rc 
1a5a0 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70  = sqlite3_exec(p
1a5b0 2d 3e 64 62 4d 61 69 6e 2c 20 22 43 4f 4d 4d 49  ->dbMain, "COMMI
1a5c0 54 22 2c 20 30 2c 20 30 2c 20 26 70 2d 3e 7a 45  T", 0, 0, &p->zE
1a5d0 72 72 6d 73 67 29 3b 0a 20 20 20 20 7d 0a 0a 20  rrmsg);.    }.. 
1a5e0 20 20 20 72 62 75 53 61 76 65 53 74 61 74 65 28     rbuSaveState(
1a5f0 70 2c 20 70 2d 3e 65 53 74 61 67 65 29 3b 0a 0a  p, p->eStage);..
1a600 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
1a610 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 65  QLITE_OK && p->e
1a620 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45  Stage==RBU_STAGE
1a630 5f 4f 41 4c 20 29 7b 0a 20 20 20 20 20 20 70 2d  _OAL ){.      p-
1a640 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78  >rc = sqlite3_ex
1a650 65 63 28 70 2d 3e 64 62 52 62 75 2c 20 22 43 4f  ec(p->dbRbu, "CO
1a660 4d 4d 49 54 22 2c 20 30 2c 20 30 2c 20 26 70 2d  MMIT", 0, 0, &p-
1a670 3e 7a 45 72 72 6d 73 67 29 3b 0a 20 20 20 20 7d  >zErrmsg);.    }
1a680 0a 0a 20 20 20 20 2f 2a 20 43 6c 6f 73 65 20 61  ..    /* Close a
1a690 6e 79 20 6f 70 65 6e 20 73 74 61 74 65 6d 65 6e  ny open statemen
1a6a0 74 20 68 61 6e 64 6c 65 73 2e 20 2a 2f 0a 20 20  t handles. */.  
1a6b0 20 20 72 62 75 4f 62 6a 49 74 65 72 46 69 6e 61    rbuObjIterFina
1a6c0 6c 69 7a 65 28 26 70 2d 3e 6f 62 6a 69 74 65 72  lize(&p->objiter
1a6d0 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6c 6f 73 65  );..    /* Close
1a6e0 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61   the open databa
1a6f0 73 65 20 68 61 6e 64 6c 65 20 61 6e 64 20 56 46  se handle and VF
1a700 53 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 20  S object. */.   
1a710 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70   sqlite3_close(p
1a720 2d 3e 64 62 4d 61 69 6e 29 3b 0a 20 20 20 20 73  ->dbMain);.    s
1a730 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 2d 3e  qlite3_close(p->
1a740 64 62 52 62 75 29 3b 0a 20 20 20 20 72 62 75 44  dbRbu);.    rbuD
1a750 65 6c 65 74 65 56 66 73 28 70 29 3b 0a 20 20 20  eleteVfs(p);.   
1a760 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
1a770 3e 61 42 75 66 29 3b 0a 20 20 20 20 73 71 6c 69  >aBuf);.    sqli
1a780 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 46 72 61  te3_free(p->aFra
1a790 6d 65 29 3b 0a 0a 20 20 20 20 72 62 75 45 64 69  me);..    rbuEdi
1a7a0 74 45 72 72 6d 73 67 28 70 29 3b 0a 20 20 20 20  tErrmsg(p);.    
1a7b0 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 20 20  rc = p->rc;.    
1a7c0 2a 70 7a 45 72 72 6d 73 67 20 3d 20 70 2d 3e 7a  *pzErrmsg = p->z
1a7d0 45 72 72 6d 73 67 3b 0a 20 20 20 20 73 71 6c 69  Errmsg;.    sqli
1a7e0 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d  te3_free(p);.  }
1a7f0 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53  else{.    rc = S
1a800 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
1a810 20 2a 70 7a 45 72 72 6d 73 67 20 3d 20 30 3b 0a   *pzErrmsg = 0;.
1a820 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1a830 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1a840 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
1a850 72 20 6f 66 20 6b 65 79 2d 76 61 6c 75 65 20 6f  r of key-value o
1a860 70 65 72 61 74 69 6f 6e 73 20 28 69 6e 73 65 72  perations (inser
1a870 74 73 2c 20 64 65 6c 65 74 65 73 20 6f 72 20 0a  ts, deletes or .
1a880 2a 2a 20 75 70 64 61 74 65 73 29 20 74 68 61 74  ** updates) that
1a890 20 68 61 76 65 20 62 65 65 6e 20 70 65 72 66 6f   have been perfo
1a8a0 72 6d 65 64 20 6f 6e 20 74 68 65 20 74 61 72 67  rmed on the targ
1a8b0 65 74 20 64 61 74 61 62 61 73 65 20 73 69 6e 63  et database sinc
1a8c0 65 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74  e the.** current
1a8d0 20 52 42 55 20 75 70 64 61 74 65 20 77 61 73 20   RBU update was 
1a8e0 73 74 61 72 74 65 64 2e 0a 2a 2f 0a 73 71 6c 69  started..*/.sqli
1a8f0 74 65 33 5f 69 6e 74 36 34 20 73 71 6c 69 74 65  te3_int64 sqlite
1a900 33 72 62 75 5f 70 72 6f 67 72 65 73 73 28 73 71  3rbu_progress(sq
1a910 6c 69 74 65 33 72 62 75 20 2a 70 52 62 75 29 7b  lite3rbu *pRbu){
1a920 0a 20 20 72 65 74 75 72 6e 20 70 52 62 75 2d 3e  .  return pRbu->
1a930 6e 50 72 6f 67 72 65 73 73 3b 0a 7d 0a 0a 76 6f  nProgress;.}..vo
1a940 69 64 20 73 71 6c 69 74 65 33 72 62 75 5f 73 74  id sqlite3rbu_st
1a950 61 67 65 5f 70 72 6f 67 72 65 73 73 28 73 71 6c  age_progress(sql
1a960 69 74 65 33 72 62 75 20 2a 70 2c 20 69 6e 74 20  ite3rbu *p, int 
1a970 2a 70 6e 4f 6e 65 2c 20 69 6e 74 20 2a 70 6e 54  *pnOne, int *pnT
1a980 77 6f 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74  wo){.  const int
1a990 20 4d 41 58 5f 50 52 4f 47 52 45 53 53 20 3d 20   MAX_PROGRESS = 
1a9a0 31 30 30 30 30 3b 0a 20 20 73 77 69 74 63 68 28  10000;.  switch(
1a9b0 20 70 2d 3e 65 53 74 61 67 65 20 29 7b 0a 20 20   p->eStage ){.  
1a9c0 20 20 63 61 73 65 20 52 42 55 5f 53 54 41 47 45    case RBU_STAGE
1a9d0 5f 4f 41 4c 3a 0a 20 20 20 20 20 20 69 66 28 20  _OAL:.      if( 
1a9e0 70 2d 3e 6e 50 68 61 73 65 4f 6e 65 53 74 65 70  p->nPhaseOneStep
1a9f0 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  >0 ){.        *p
1aa00 6e 4f 6e 65 20 3d 20 28 69 6e 74 29 28 4d 41 58  nOne = (int)(MAX
1aa10 5f 50 52 4f 47 52 45 53 53 20 2a 20 28 69 36 34  _PROGRESS * (i64
1aa20 29 70 2d 3e 6e 50 72 6f 67 72 65 73 73 2f 28 69  )p->nProgress/(i
1aa30 36 34 29 70 2d 3e 6e 50 68 61 73 65 4f 6e 65 53  64)p->nPhaseOneS
1aa40 74 65 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  tep);.      }els
1aa50 65 7b 0a 20 20 20 20 20 20 20 20 2a 70 6e 4f 6e  e{.        *pnOn
1aa60 65 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a  e = -1;.      }.
1aa70 20 20 20 20 20 20 2a 70 6e 54 77 6f 20 3d 20 30        *pnTwo = 0
1aa80 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a  ;.      break;..
1aa90 20 20 20 20 63 61 73 65 20 52 42 55 5f 53 54 41      case RBU_STA
1aaa0 47 45 5f 4d 4f 56 45 3a 0a 20 20 20 20 20 20 2a  GE_MOVE:.      *
1aab0 70 6e 4f 6e 65 20 3d 20 4d 41 58 5f 50 52 4f 47  pnOne = MAX_PROG
1aac0 52 45 53 53 3b 0a 20 20 20 20 20 20 2a 70 6e 54  RESS;.      *pnT
1aad0 77 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72  wo = 0;.      br
1aae0 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 52  eak;..    case R
1aaf0 42 55 5f 53 54 41 47 45 5f 43 4b 50 54 3a 0a 20  BU_STAGE_CKPT:. 
1ab00 20 20 20 20 20 2a 70 6e 4f 6e 65 20 3d 20 4d 41       *pnOne = MA
1ab10 58 5f 50 52 4f 47 52 45 53 53 3b 0a 20 20 20 20  X_PROGRESS;.    
1ab20 20 20 2a 70 6e 54 77 6f 20 3d 20 28 69 6e 74 29    *pnTwo = (int)
1ab30 28 4d 41 58 5f 50 52 4f 47 52 45 53 53 20 2a 20  (MAX_PROGRESS * 
1ab40 28 69 36 34 29 70 2d 3e 6e 53 74 65 70 20 2f 20  (i64)p->nStep / 
1ab50 28 69 36 34 29 70 2d 3e 6e 46 72 61 6d 65 29 3b  (i64)p->nFrame);
1ab60 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20  .      break;.. 
1ab70 20 20 20 63 61 73 65 20 52 42 55 5f 53 54 41 47     case RBU_STAG
1ab80 45 5f 44 4f 4e 45 3a 0a 20 20 20 20 20 20 2a 70  E_DONE:.      *p
1ab90 6e 4f 6e 65 20 3d 20 4d 41 58 5f 50 52 4f 47 52  nOne = MAX_PROGR
1aba0 45 53 53 3b 0a 20 20 20 20 20 20 2a 70 6e 54 77  ESS;.      *pnTw
1abb0 6f 20 3d 20 4d 41 58 5f 50 52 4f 47 52 45 53 53  o = MAX_PROGRESS
1abc0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a  ;.      break;..
1abd0 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
1abe0 20 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a     assert( 0 );.
1abf0 20 20 7d 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74    }.}..int sqlit
1ac00 65 33 72 62 75 5f 73 61 76 65 73 74 61 74 65 28  e3rbu_savestate(
1ac10 73 71 6c 69 74 65 33 72 62 75 20 2a 70 29 7b 0a  sqlite3rbu *p){.
1ac20 20 20 69 6e 74 20 72 63 20 3d 20 70 2d 3e 72 63    int rc = p->rc
1ac30 3b 0a 20 20 0a 20 20 69 66 28 20 72 63 3d 3d 53  ;.  .  if( rc==S
1ac40 51 4c 49 54 45 5f 44 4f 4e 45 20 29 20 72 65 74  QLITE_DONE ) ret
1ac50 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
1ac60 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 53 74    assert( p->eSt
1ac70 61 67 65 3e 3d 52 42 55 5f 53 54 41 47 45 5f 4f  age>=RBU_STAGE_O
1ac80 41 4c 20 26 26 20 70 2d 3e 65 53 74 61 67 65 3c  AL && p->eStage<
1ac90 3d 52 42 55 5f 53 54 41 47 45 5f 44 4f 4e 45 20  =RBU_STAGE_DONE 
1aca0 29 3b 0a 20 20 69 66 28 20 70 2d 3e 65 53 74 61  );.  if( p->eSta
1acb0 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4f 41  ge==RBU_STAGE_OA
1acc0 4c 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  L ){.    assert(
1acd0 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
1ace0 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   );.    if( rc==
1acf0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d  SQLITE_OK ) rc =
1ad00 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d   sqlite3_exec(p-
1ad10 3e 64 62 4d 61 69 6e 2c 20 22 43 4f 4d 4d 49 54  >dbMain, "COMMIT
1ad20 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  ", 0, 0, 0);.  }
1ad30 0a 0a 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a  ..  p->rc = rc;.
1ad40 20 20 72 62 75 53 61 76 65 53 74 61 74 65 28 70    rbuSaveState(p
1ad50 2c 20 70 2d 3e 65 53 74 61 67 65 29 3b 0a 20 20  , p->eStage);.  
1ad60 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 0a 20 20 69  rc = p->rc;..  i
1ad70 66 28 20 70 2d 3e 65 53 74 61 67 65 3d 3d 52 42  f( p->eStage==RB
1ad80 55 5f 53 54 41 47 45 5f 4f 41 4c 20 29 7b 0a 20  U_STAGE_OAL ){. 
1ad90 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
1ada0 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20  QLITE_DONE );.  
1adb0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1adc0 5f 4f 4b 20 29 20 72 63 20 3d 20 73 71 6c 69 74  _OK ) rc = sqlit
1add0 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 52 62 75  e3_exec(p->dbRbu
1ade0 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30  , "COMMIT", 0, 0
1adf0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
1ae00 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63  ==SQLITE_OK ) rc
1ae10 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28   = sqlite3_exec(
1ae20 70 2d 3e 64 62 52 62 75 2c 20 22 42 45 47 49 4e  p->dbRbu, "BEGIN
1ae30 20 49 4d 4d 45 44 49 41 54 45 22 2c 20 30 2c 20   IMMEDIATE", 0, 
1ae40 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  0, 0);.    if( r
1ae50 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c==SQLITE_OK ) r
1ae60 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  c = sqlite3_exec
1ae70 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 42 45 47  (p->dbMain, "BEG
1ae80 49 4e 20 49 4d 4d 45 44 49 41 54 45 22 2c 20 30  IN IMMEDIATE", 0
1ae90 2c 20 30 2c 30 29 3b 0a 20 20 7d 0a 0a 20 20 70  , 0,0);.  }..  p
1aea0 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 72 65 74  ->rc = rc;.  ret
1aeb0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a  urn rc;.}../****
1aec0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1aed0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1aee0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1aef0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1af00 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 42 65 67 69 6e 6e  ******.** Beginn
1af10 69 6e 67 20 6f 66 20 52 42 55 20 56 46 53 20 73  ing of RBU VFS s
1af20 68 69 6d 20 6d 65 74 68 6f 64 73 2e 20 54 68 65  him methods. The
1af30 20 56 46 53 20 73 68 69 6d 20 6d 6f 64 69 66 69   VFS shim modifi
1af40 65 73 20 74 68 65 20 62 65 68 61 76 69 6f 75 72  es the behaviour
1af50 0a 2a 2a 20 6f 66 20 61 20 73 74 61 6e 64 61 72  .** of a standar
1af60 64 20 56 46 53 20 69 6e 20 74 68 65 20 66 6f 6c  d VFS in the fol
1af70 6c 6f 77 69 6e 67 20 77 61 79 73 3a 0a 2a 2a 0a  lowing ways:.**.
1af80 2a 2a 20 31 2e 20 57 68 65 6e 65 76 65 72 20 74  ** 1. Whenever t
1af90 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
1afa0 20 61 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65   a main database
1afb0 20 66 69 6c 65 20 69 73 20 72 65 61 64 20 6f 72   file is read or
1afc0 20 0a 2a 2a 20 20 20 20 77 72 69 74 74 65 6e 2c   .**    written,
1afd0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
1afe0 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
1aff0 20 63 6f 6f 6b 69 65 20 69 73 20 73 74 6f 72 65   cookie is store
1b000 64 20 69 6e 0a 2a 2a 20 20 20 20 72 62 75 5f 66  d in.**    rbu_f
1b010 69 6c 65 2e 69 43 6f 6f 6b 69 65 2e 20 53 69 6d  ile.iCookie. Sim
1b020 69 6c 61 72 6c 79 2c 20 74 68 65 20 76 61 6c 75  ilarly, the valu
1b030 65 20 6f 66 20 74 68 65 20 22 77 72 69 74 65 2d  e of the "write-
1b040 76 65 72 73 69 6f 6e 22 0a 2a 2a 20 20 20 20 64  version".**    d
1b050 61 74 61 62 61 73 65 20 68 65 61 64 65 72 20 66  atabase header f
1b060 69 65 6c 64 20 69 73 20 73 74 6f 72 65 64 20 69  ield is stored i
1b070 6e 20 72 62 75 5f 66 69 6c 65 2e 69 57 72 69 74  n rbu_file.iWrit
1b080 65 56 65 72 2e 20 54 68 69 73 20 65 6e 73 75 72  eVer. This ensur
1b090 65 73 0a 2a 2a 20 20 20 20 74 68 61 74 20 74 68  es.**    that th
1b0a0 65 20 76 61 6c 75 65 73 20 61 72 65 20 61 6c 77  e values are alw
1b0b0 61 79 73 20 74 72 75 73 74 77 6f 72 74 68 79 20  ays trustworthy 
1b0c0 77 69 74 68 69 6e 20 61 6e 20 6f 70 65 6e 20 74  within an open t
1b0d0 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ransaction..**.*
1b0e0 2a 20 32 2e 20 57 68 65 6e 65 76 65 72 20 61 6e  * 2. Whenever an
1b0f0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c   SQLITE_OPEN_WAL
1b100 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 2c   file is opened,
1b110 20 74 68 65 20 28 72 62 75 5f 66 69 6c 65 2e 70   the (rbu_file.p
1b120 57 61 6c 46 64 29 0a 2a 2a 20 20 20 20 6d 65 6d  WalFd).**    mem
1b130 62 65 72 20 76 61 72 69 61 62 6c 65 20 6f 66 20  ber variable of 
1b140 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 64  the associated d
1b150 61 74 61 62 61 73 65 20 66 69 6c 65 20 64 65 73  atabase file des
1b160 63 72 69 70 74 6f 72 20 69 73 20 73 65 74 0a 2a  criptor is set.*
1b170 2a 20 20 20 20 74 6f 20 70 6f 69 6e 74 20 74 6f  *    to point to
1b180 20 74 68 65 20 6e 65 77 20 66 69 6c 65 2e 20 41   the new file. A
1b190 20 6d 75 74 65 78 20 70 72 6f 74 65 63 74 65 64   mutex protected
1b1a0 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   linked list of 
1b1b0 61 6c 6c 20 6d 61 69 6e 20 0a 2a 2a 20 20 20 20  all main .**    
1b1c0 64 62 20 66 64 73 20 6f 70 65 6e 65 64 20 75 73  db fds opened us
1b1d0 69 6e 67 20 61 20 70 61 72 74 69 63 75 6c 61 72  ing a particular
1b1e0 20 52 42 55 20 56 46 53 20 69 73 20 6d 61 69 6e   RBU VFS is main
1b1f0 74 61 69 6e 65 64 20 61 74 20 0a 2a 2a 20 20 20  tained at .**   
1b200 20 72 62 75 5f 76 66 73 2e 70 4d 61 69 6e 20 74   rbu_vfs.pMain t
1b210 6f 20 66 61 63 69 6c 69 74 61 74 65 20 74 68 69  o facilitate thi
1b220 73 2e 0a 2a 2a 0a 2a 2a 20 33 2e 20 55 73 69 6e  s..**.** 3. Usin
1b230 67 20 61 20 6e 65 77 20 66 69 6c 65 2d 63 6f 6e  g a new file-con
1b240 74 72 6f 6c 20 22 53 51 4c 49 54 45 5f 46 43 4e  trol "SQLITE_FCN
1b250 54 4c 5f 52 42 55 22 2c 20 61 20 6d 61 69 6e 20  TL_RBU", a main 
1b260 64 62 20 72 62 75 5f 66 69 6c 65 20 0a 2a 2a 20  db rbu_file .** 
1b270 20 20 20 6f 62 6a 65 63 74 20 63 61 6e 20 62 65     object can be
1b280 20 6d 61 72 6b 65 64 20 61 73 20 74 68 65 20 74   marked as the t
1b290 61 72 67 65 74 20 64 61 74 61 62 61 73 65 20 6f  arget database o
1b2a0 66 20 61 6e 20 52 42 55 20 75 70 64 61 74 65 2e  f an RBU update.
1b2b0 20 54 68 69 73 0a 2a 2a 20 20 20 20 74 75 72 6e   This.**    turn
1b2c0 73 20 6f 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  s on the followi
1b2d0 6e 67 20 65 78 74 72 61 20 73 70 65 63 69 61 6c  ng extra special
1b2e0 20 62 65 68 61 76 69 6f 75 72 3a 0a 2a 2a 0a 2a   behaviour:.**.*
1b2f0 2a 20 33 61 2e 20 49 66 20 78 41 63 63 65 73 73  * 3a. If xAccess
1b300 28 29 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  () is called to 
1b310 63 68 65 63 6b 20 69 66 20 74 68 65 72 65 20 65  check if there e
1b320 78 69 73 74 73 20 61 20 2a 2d 77 61 6c 20 66 69  xists a *-wal fi
1b330 6c 65 20 0a 2a 2a 20 20 20 20 20 61 73 73 6f 63  le .**     assoc
1b340 69 61 74 65 64 20 77 69 74 68 20 61 6e 20 52 42  iated with an RB
1b350 55 20 74 61 72 67 65 74 20 64 61 74 61 62 61 73  U target databas
1b360 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 52  e currently in R
1b370 42 55 5f 53 54 41 47 45 5f 4f 41 4c 0a 2a 2a 20  BU_STAGE_OAL.** 
1b380 20 20 20 20 73 74 61 67 65 20 28 70 72 65 70 61      stage (prepa
1b390 72 69 6e 67 20 74 68 65 20 2a 2d 6f 61 6c 20 66  ring the *-oal f
1b3a0 69 6c 65 29 2c 20 74 68 65 20 66 6f 6c 6c 6f 77  ile), the follow
1b3b0 69 6e 67 20 73 70 65 63 69 61 6c 20 68 61 6e 64  ing special hand
1b3c0 6c 69 6e 67 0a 2a 2a 20 20 20 20 20 61 70 70 6c  ling.**     appl
1b3d0 69 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ies:.**.**      
1b3e0 2a 20 69 66 20 74 68 65 20 2a 2d 77 61 6c 20 66  * if the *-wal f
1b3f0 69 6c 65 20 64 6f 65 73 20 65 78 69 73 74 2c 20  ile does exist, 
1b400 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41  return SQLITE_CA
1b410 4e 54 4f 50 45 4e 2e 20 41 6e 20 52 42 55 0a 2a  NTOPEN. An RBU.*
1b420 2a 20 20 20 20 20 20 20 20 74 61 72 67 65 74 20  *        target 
1b430 64 61 74 61 62 61 73 65 20 6d 61 79 20 6e 6f 74  database may not
1b440 20 62 65 20 69 6e 20 77 61 6c 20 6d 6f 64 65 20   be in wal mode 
1b450 61 6c 72 65 61 64 79 2e 0a 2a 2a 0a 2a 2a 20 20  already..**.**  
1b460 20 20 20 20 2a 20 69 66 20 74 68 65 20 2a 2d 77      * if the *-w
1b470 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  al file does not
1b480 20 65 78 69 73 74 2c 20 73 65 74 20 74 68 65 20   exist, set the 
1b490 6f 75 74 70 75 74 20 70 61 72 61 6d 65 74 65 72  output parameter
1b4a0 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20 6e 6f   to.**        no
1b4b0 6e 2d 7a 65 72 6f 20 28 74 6f 20 74 65 6c 6c 20  n-zero (to tell 
1b4c0 53 51 4c 69 74 65 20 74 68 61 74 20 69 74 20 64  SQLite that it d
1b4d0 6f 65 73 20 65 78 69 73 74 29 20 61 6e 79 77 61  oes exist) anywa
1b4e0 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 54 68 65  y..**.**     The
1b4f0 6e 2c 20 77 68 65 6e 20 78 4f 70 65 6e 28 29 20  n, when xOpen() 
1b500 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 70 65  is called to ope
1b510 6e 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65  n the *-wal file
1b520 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
1b530 0a 2a 2a 20 20 20 20 20 74 68 65 20 52 42 55 20  .**     the RBU 
1b540 74 61 72 67 65 74 20 69 6e 20 52 42 55 5f 53 54  target in RBU_ST
1b550 41 47 45 5f 4f 41 4c 20 73 74 61 67 65 2c 20 69  AGE_OAL stage, i
1b560 6e 73 74 65 61 64 20 6f 66 20 6f 70 65 6e 69 6e  nstead of openin
1b570 67 20 74 68 65 20 2a 2d 77 61 6c 0a 2a 2a 20 20  g the *-wal.**  
1b580 20 20 20 66 69 6c 65 2c 20 74 68 65 20 72 62 75     file, the rbu
1b590 20 76 66 73 20 6f 70 65 6e 73 20 74 68 65 20 63   vfs opens the c
1b5a0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 2a 2d 6f  orresponding *-o
1b5b0 61 6c 20 66 69 6c 65 20 69 6e 73 74 65 61 64 2e  al file instead.
1b5c0 20 0a 2a 2a 0a 2a 2a 20 33 62 2e 20 54 68 65 20   .**.** 3b. The 
1b5d0 2a 2d 73 68 6d 20 70 61 67 65 73 20 72 65 74 75  *-shm pages retu
1b5e0 72 6e 65 64 20 62 79 20 78 53 68 6d 4d 61 70 28  rned by xShmMap(
1b5f0 29 20 66 6f 72 20 61 20 74 61 72 67 65 74 20 64  ) for a target d
1b600 62 20 66 69 6c 65 20 69 6e 0a 2a 2a 20 20 20 20  b file in.**    
1b610 20 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20 6d   RBU_STAGE_OAL m
1b620 6f 64 65 20 61 72 65 20 61 63 74 75 61 6c 6c 79  ode are actually
1b630 20 73 74 6f 72 65 64 20 69 6e 20 68 65 61 70 20   stored in heap 
1b640 6d 65 6d 6f 72 79 2e 20 54 68 69 73 20 69 73 20  memory. This is 
1b650 74 6f 0a 2a 2a 20 20 20 20 20 61 76 6f 69 64 20  to.**     avoid 
1b660 63 72 65 61 74 69 6e 67 20 61 20 2a 2d 73 68 6d  creating a *-shm
1b670 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 41   file on disk. A
1b680 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 78 53 68  dditionally, xSh
1b690 6d 4c 6f 63 6b 28 29 20 63 61 6c 6c 73 0a 2a 2a  mLock() calls.**
1b6a0 20 20 20 20 20 61 72 65 20 6e 6f 2d 6f 70 73 20       are no-ops 
1b6b0 6f 6e 20 74 61 72 67 65 74 20 64 61 74 61 62 61  on target databa
1b6c0 73 65 20 66 69 6c 65 73 20 69 6e 20 52 42 55 5f  se files in RBU_
1b6d0 53 54 41 47 45 5f 4f 41 4c 20 6d 6f 64 65 2e 20  STAGE_OAL mode. 
1b6e0 54 68 69 73 20 69 73 0a 2a 2a 20 20 20 20 20 62  This is.**     b
1b6f0 65 63 61 75 73 65 20 61 73 73 65 72 74 28 29 20  ecause assert() 
1b700 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 73 6f  statements in so
1b710 6d 65 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74  me VFS implement
1b720 61 74 69 6f 6e 73 20 66 61 69 6c 20 69 66 20 0a  ations fail if .
1b730 2a 2a 20 20 20 20 20 78 53 68 6d 4c 6f 63 6b 28  **     xShmLock(
1b740 29 20 69 73 20 63 61 6c 6c 65 64 20 62 65 66 6f  ) is called befo
1b750 72 65 20 78 53 68 6d 4d 61 70 28 29 2e 0a 2a 2a  re xShmMap()..**
1b760 0a 2a 2a 20 33 63 2e 20 49 66 20 61 6e 20 45 58  .** 3c. If an EX
1b770 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20  CLUSIVE lock is 
1b780 61 74 74 65 6d 70 74 65 64 20 6f 6e 20 61 20 74  attempted on a t
1b790 61 72 67 65 74 20 64 61 74 61 62 61 73 65 20 66  arget database f
1b7a0 69 6c 65 20 69 6e 20 61 6e 79 0a 2a 2a 20 20 20  ile in any.**   
1b7b0 20 20 6d 6f 64 65 20 65 78 63 65 70 74 20 52 42    mode except RB
1b7c0 55 5f 53 54 41 47 45 5f 44 4f 4e 45 20 28 61 6c  U_STAGE_DONE (al
1b7d0 6c 20 77 6f 72 6b 20 63 6f 6d 70 6c 65 74 65 64  l work completed
1b7e0 20 61 6e 64 20 63 68 65 63 6b 70 6f 69 6e 74 65   and checkpointe
1b7f0 64 29 2c 20 69 74 20 0a 2a 2a 20 20 20 20 20 66  d), it .**     f
1b800 61 69 6c 73 20 77 69 74 68 20 61 6e 20 53 51 4c  ails with an SQL
1b810 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72 2e 20  ITE_BUSY error. 
1b820 54 68 69 73 20 69 73 20 74 6f 20 73 74 6f 70 20  This is to stop 
1b830 52 42 55 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a  RBU connections.
1b840 2a 2a 20 20 20 20 20 66 72 6f 6d 20 61 75 74 6f  **     from auto
1b850 6d 61 74 69 63 61 6c 6c 79 20 63 68 65 63 6b 70  matically checkp
1b860 6f 69 6e 74 69 6e 67 20 61 20 2a 2d 77 61 6c 20  ointing a *-wal 
1b870 28 6f 72 20 2a 2d 6f 61 6c 29 20 66 69 6c 65 20  (or *-oal) file 
1b880 66 72 6f 6d 20 77 69 74 68 69 6e 0a 2a 2a 20 20  from within.**  
1b890 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65     sqlite3_close
1b8a0 28 29 2e 0a 2a 2a 0a 2a 2a 20 33 64 2e 20 49 6e  ()..**.** 3d. In
1b8b0 20 52 42 55 5f 53 54 41 47 45 5f 43 41 50 54 55   RBU_STAGE_CAPTU
1b8c0 52 45 20 6d 6f 64 65 2c 20 61 6c 6c 20 78 52 65  RE mode, all xRe
1b8d0 61 64 28 29 20 63 61 6c 6c 73 20 6f 6e 20 74 68  ad() calls on th
1b8e0 65 20 77 61 6c 20 66 69 6c 65 2c 20 61 6e 64 0a  e wal file, and.
1b8f0 2a 2a 20 20 20 20 20 61 6c 6c 20 78 57 72 69 74  **     all xWrit
1b900 65 28 29 20 63 61 6c 6c 73 20 6f 6e 20 74 68 65  e() calls on the
1b910 20 74 61 72 67 65 74 20 64 61 74 61 62 61 73 65   target database
1b920 20 66 69 6c 65 20 70 65 72 66 6f 72 6d 20 6e 6f   file perform no
1b930 20 49 4f 2e 20 0a 2a 2a 20 20 20 20 20 49 6e 73   IO. .**     Ins
1b940 74 65 61 64 20 74 68 65 20 66 72 61 6d 65 20 61  tead the frame a
1b950 6e 64 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20  nd page numbers 
1b960 74 68 61 74 20 77 6f 75 6c 64 20 62 65 20 72 65  that would be re
1b970 61 64 20 61 6e 64 20 77 72 69 74 74 65 6e 0a 2a  ad and written.*
1b980 2a 20 20 20 20 20 61 72 65 20 72 65 63 6f 72 64  *     are record
1b990 65 64 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79  ed. Additionally
1b9a0 2c 20 73 75 63 63 65 73 73 66 75 6c 20 61 74 74  , successful att
1b9b0 65 6d 70 74 73 20 74 6f 20 6f 62 74 61 69 6e 20  empts to obtain 
1b9c0 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 20 20 20  exclusive.**    
1b9d0 20 78 53 68 6d 4c 6f 63 6b 28 29 20 57 52 49 54   xShmLock() WRIT
1b9e0 45 52 2c 20 43 48 45 43 4b 50 4f 49 4e 54 45 52  ER, CHECKPOINTER
1b9f0 20 61 6e 64 20 52 45 41 44 30 20 6c 6f 63 6b 73   and READ0 locks
1ba00 20 6f 6e 20 74 68 65 20 74 61 72 67 65 74 20 0a   on the target .
1ba10 2a 2a 20 20 20 20 20 64 61 74 61 62 61 73 65 20  **     database 
1ba20 66 69 6c 65 20 61 72 65 20 72 65 63 6f 72 64 65  file are recorde
1ba30 64 2e 20 78 53 68 6d 4c 6f 63 6b 28 29 20 63 61  d. xShmLock() ca
1ba40 6c 6c 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68  lls to unlock th
1ba50 65 20 73 61 6d 65 0a 2a 2a 20 20 20 20 20 6c 6f  e same.**     lo
1ba60 63 6b 73 20 61 72 65 20 6e 6f 2d 6f 70 73 20 28  cks are no-ops (
1ba70 73 6f 20 74 68 61 74 20 6f 6e 63 65 20 6f 62 74  so that once obt
1ba80 61 69 6e 65 64 2c 20 74 68 65 73 65 20 6c 6f 63  ained, these loc
1ba90 6b 73 20 61 72 65 20 6e 65 76 65 72 0a 2a 2a 20  ks are never.** 
1baa0 20 20 20 20 72 65 6c 69 6e 71 75 69 73 68 65 64      relinquished
1bab0 29 2e 20 46 69 6e 61 6c 6c 79 2c 20 63 61 6c 6c  ). Finally, call
1bac0 73 20 74 6f 20 78 53 79 6e 63 28 29 20 6f 6e 20  s to xSync() on 
1bad0 74 68 65 20 74 61 72 67 65 74 20 64 61 74 61 62  the target datab
1bae0 61 73 65 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20  ase.**     file 
1baf0 66 61 69 6c 20 77 69 74 68 20 53 51 4c 49 54 45  fail with SQLITE
1bb00 5f 49 4e 54 45 52 4e 41 4c 20 65 72 72 6f 72 73  _INTERNAL errors
1bb10 2e 0a 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69  ..*/..static voi
1bb20 64 20 72 62 75 55 6e 6c 6f 63 6b 53 68 6d 28 72  d rbuUnlockShm(r
1bb30 62 75 5f 66 69 6c 65 20 2a 70 29 7b 0a 20 20 69  bu_file *p){.  i
1bb40 66 28 20 70 2d 3e 70 52 62 75 20 29 7b 0a 20 20  f( p->pRbu ){.  
1bb50 20 20 69 6e 74 20 28 2a 78 53 68 6d 4c 6f 63 6b    int (*xShmLock
1bb60 29 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c  )(sqlite3_file*,
1bb70 69 6e 74 2c 69 6e 74 2c 69 6e 74 29 20 3d 20 70  int,int,int) = p
1bb80 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64  ->pReal->pMethod
1bb90 73 2d 3e 78 53 68 6d 4c 6f 63 6b 3b 0a 20 20 20  s->xShmLock;.   
1bba0 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
1bbb0 69 3d 30 3b 20 69 3c 53 51 4c 49 54 45 5f 53 48  i=0; i<SQLITE_SH
1bbc0 4d 5f 4e 4c 4f 43 4b 3b 69 2b 2b 29 7b 0a 20 20  M_NLOCK;i++){.  
1bbd0 20 20 20 20 69 66 28 20 28 31 3c 3c 69 29 20 26      if( (1<<i) &
1bbe0 20 70 2d 3e 70 52 62 75 2d 3e 6d 4c 6f 63 6b 20   p->pRbu->mLock 
1bbf0 29 7b 0a 20 20 20 20 20 20 20 20 78 53 68 6d 4c  ){.        xShmL
1bc00 6f 63 6b 28 70 2d 3e 70 52 65 61 6c 2c 20 69 2c  ock(p->pReal, i,
1bc10 20 31 2c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 55   1, SQLITE_SHM_U
1bc20 4e 4c 4f 43 4b 7c 53 51 4c 49 54 45 5f 53 48 4d  NLOCK|SQLITE_SHM
1bc30 5f 45 58 43 4c 55 53 49 56 45 29 3b 0a 20 20 20  _EXCLUSIVE);.   
1bc40 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
1bc50 2d 3e 70 52 62 75 2d 3e 6d 4c 6f 63 6b 20 3d 20  ->pRbu->mLock = 
1bc60 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
1bc70 43 6c 6f 73 65 20 61 6e 20 72 62 75 20 66 69 6c  Close an rbu fil
1bc80 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1bc90 20 72 62 75 56 66 73 43 6c 6f 73 65 28 73 71 6c   rbuVfsClose(sql
1bca0 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65  ite3_file *pFile
1bcb0 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a 70  ){.  rbu_file *p
1bcc0 20 3d 20 28 72 62 75 5f 66 69 6c 65 2a 29 70 46   = (rbu_file*)pF
1bcd0 69 6c 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ile;.  int rc;. 
1bce0 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 46 72   int i;..  /* Fr
1bcf0 65 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ee the contents 
1bd00 6f 66 20 74 68 65 20 61 70 53 68 6d 5b 5d 20 61  of the apShm[] a
1bd10 72 72 61 79 2e 20 41 6e 64 20 74 68 65 20 61 72  rray. And the ar
1bd20 72 61 79 20 69 74 73 65 6c 66 2e 20 2a 2f 0a 20  ray itself. */. 
1bd30 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
1bd40 53 68 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  Shm; i++){.    s
1bd50 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61  qlite3_free(p->a
1bd60 70 53 68 6d 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20  pShm[i]);.  }.  
1bd70 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
1bd80 61 70 53 68 6d 29 3b 0a 20 20 70 2d 3e 61 70 53  apShm);.  p->apS
1bd90 68 6d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  hm = 0;.  sqlite
1bda0 33 5f 66 72 65 65 28 70 2d 3e 7a 44 65 6c 29 3b  3_free(p->zDel);
1bdb0 0a 0a 20 20 69 66 28 20 70 2d 3e 6f 70 65 6e 46  ..  if( p->openF
1bdc0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
1bdd0 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 7b 0a 20 20  EN_MAIN_DB ){.  
1bde0 20 20 72 62 75 5f 66 69 6c 65 20 2a 2a 70 70 3b    rbu_file **pp;
1bdf0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
1be00 65 78 5f 65 6e 74 65 72 28 70 2d 3e 70 52 62 75  ex_enter(p->pRbu
1be10 56 66 73 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20  Vfs->mutex);.   
1be20 20 66 6f 72 28 70 70 3d 26 70 2d 3e 70 52 62 75   for(pp=&p->pRbu
1be30 56 66 73 2d 3e 70 4d 61 69 6e 3b 20 2a 70 70 21  Vfs->pMain; *pp!
1be40 3d 70 3b 20 70 70 3d 26 28 28 2a 70 70 29 2d 3e  =p; pp=&((*pp)->
1be50 70 4d 61 69 6e 4e 65 78 74 29 29 3b 0a 20 20 20  pMainNext));.   
1be60 20 2a 70 70 20 3d 20 70 2d 3e 70 4d 61 69 6e 4e   *pp = p->pMainN
1be70 65 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ext;.    sqlite3
1be80 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 2d 3e  _mutex_leave(p->
1be90 70 52 62 75 56 66 73 2d 3e 6d 75 74 65 78 29 3b  pRbuVfs->mutex);
1bea0 0a 20 20 20 20 72 62 75 55 6e 6c 6f 63 6b 53 68  .    rbuUnlockSh
1beb0 6d 28 70 29 3b 0a 20 20 20 20 70 2d 3e 70 52 65  m(p);.    p->pRe
1bec0 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53  al->pMethods->xS
1bed0 68 6d 55 6e 6d 61 70 28 70 2d 3e 70 52 65 61 6c  hmUnmap(p->pReal
1bee0 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  , 0);.  }..  /* 
1bef0 43 6c 6f 73 65 20 74 68 65 20 75 6e 64 65 72 6c  Close the underl
1bf00 79 69 6e 67 20 66 69 6c 65 20 68 61 6e 64 6c 65  ying file handle
1bf10 20 2a 2f 0a 20 20 72 63 20 3d 20 70 2d 3e 70 52   */.  rc = p->pR
1bf20 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78  eal->pMethods->x
1bf30 43 6c 6f 73 65 28 70 2d 3e 70 52 65 61 6c 29 3b  Close(p->pReal);
1bf40 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1bf50 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 64  ../*.** Read and
1bf60 20 72 65 74 75 72 6e 20 61 6e 20 75 6e 73 69 67   return an unsig
1bf70 6e 65 64 20 33 32 2d 62 69 74 20 62 69 67 2d 65  ned 32-bit big-e
1bf80 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72  ndian integer fr
1bf90 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20 0a 2a  om the buffer .*
1bfa0 2a 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  * passed as the 
1bfb0 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  only argument..*
1bfc0 2f 0a 73 74 61 74 69 63 20 75 33 32 20 72 62 75  /.static u32 rbu
1bfd0 47 65 74 55 33 32 28 75 38 20 2a 61 42 75 66 29  GetU32(u8 *aBuf)
1bfe0 7b 0a 20 20 72 65 74 75 72 6e 20 28 28 75 33 32  {.  return ((u32
1bff0 29 61 42 75 66 5b 30 5d 20 3c 3c 20 32 34 29 0a  )aBuf[0] << 24).
1c000 20 20 20 20 20 20 20 2b 20 28 28 75 33 32 29 61         + ((u32)a
1c010 42 75 66 5b 31 5d 20 3c 3c 20 31 36 29 0a 20 20  Buf[1] << 16).  
1c020 20 20 20 20 20 2b 20 28 28 75 33 32 29 61 42 75       + ((u32)aBu
1c030 66 5b 32 5d 20 3c 3c 20 20 38 29 0a 20 20 20 20  f[2] <<  8).    
1c040 20 20 20 2b 20 28 28 75 33 32 29 61 42 75 66 5b     + ((u32)aBuf[
1c050 33 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  3]);.}../*.** Re
1c060 61 64 20 64 61 74 61 20 66 72 6f 6d 20 61 6e 20  ad data from an 
1c070 72 62 75 56 66 73 2d 66 69 6c 65 2e 0a 2a 2f 0a  rbuVfs-file..*/.
1c080 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 56 66  static int rbuVf
1c090 73 52 65 61 64 28 0a 20 20 73 71 6c 69 74 65 33  sRead(.  sqlite3
1c0a0 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 0a 20  _file *pFile, . 
1c0b0 20 76 6f 69 64 20 2a 7a 42 75 66 2c 20 0a 20 20   void *zBuf, .  
1c0c0 69 6e 74 20 69 41 6d 74 2c 20 0a 20 20 73 71 6c  int iAmt, .  sql
1c0d0 69 74 65 5f 69 6e 74 36 34 20 69 4f 66 73 74 0a  ite_int64 iOfst.
1c0e0 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a 70  ){.  rbu_file *p
1c0f0 20 3d 20 28 72 62 75 5f 66 69 6c 65 2a 29 70 46   = (rbu_file*)pF
1c100 69 6c 65 3b 0a 20 20 73 71 6c 69 74 65 33 72 62  ile;.  sqlite3rb
1c110 75 20 2a 70 52 62 75 20 3d 20 70 2d 3e 70 52 62  u *pRbu = p->pRb
1c120 75 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  u;.  int rc;..  
1c130 69 66 28 20 70 52 62 75 20 26 26 20 70 52 62 75  if( pRbu && pRbu
1c140 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54  ->eStage==RBU_ST
1c150 41 47 45 5f 43 41 50 54 55 52 45 20 29 7b 0a 20  AGE_CAPTURE ){. 
1c160 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70     assert( p->op
1c170 65 6e 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  enFlags & SQLITE
1c180 5f 4f 50 45 4e 5f 57 41 4c 20 29 3b 0a 20 20 20  _OPEN_WAL );.   
1c190 20 72 63 20 3d 20 72 62 75 43 61 70 74 75 72 65   rc = rbuCapture
1c1a0 57 61 6c 52 65 61 64 28 70 2d 3e 70 52 62 75 2c  WalRead(p->pRbu,
1c1b0 20 69 4f 66 73 74 2c 20 69 41 6d 74 29 3b 0a 20   iOfst, iAmt);. 
1c1c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
1c1d0 70 52 62 75 20 26 26 20 70 52 62 75 2d 3e 65 53  pRbu && pRbu->eS
1c1e0 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f  tage==RBU_STAGE_
1c1f0 4f 41 4c 20 0a 20 20 20 20 20 26 26 20 28 70 2d  OAL .     && (p-
1c200 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20 53 51 4c  >openFlags & SQL
1c210 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 29 20 0a 20  ITE_OPEN_WAL) . 
1c220 20 20 20 20 26 26 20 69 4f 66 73 74 3e 3d 70 52      && iOfst>=pR
1c230 62 75 2d 3e 69 4f 61 6c 53 7a 20 0a 20 20 20 20  bu->iOalSz .    
1c240 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
1c250 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 6d  LITE_OK;.      m
1c260 65 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c 20 69  emset(zBuf, 0, i
1c270 41 6d 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Amt);.    }else{
1c280 0a 20 20 20 20 20 20 72 63 20 3d 20 70 2d 3e 70  .      rc = p->p
1c290 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e  Real->pMethods->
1c2a0 78 52 65 61 64 28 70 2d 3e 70 52 65 61 6c 2c 20  xRead(p->pReal, 
1c2b0 7a 42 75 66 2c 20 69 41 6d 74 2c 20 69 4f 66 73  zBuf, iAmt, iOfs
1c2c0 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  t);.    }.    if
1c2d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1c2e0 26 26 20 69 4f 66 73 74 3d 3d 30 20 26 26 20 28  && iOfst==0 && (
1c2f0 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20 53  p->openFlags & S
1c300 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
1c310 44 42 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  DB) ){.      /* 
1c320 54 68 65 73 65 20 6c 6f 6f 6b 20 6c 69 6b 65 20  These look like 
1c330 6d 61 67 69 63 20 6e 75 6d 62 65 72 73 2e 20 42  magic numbers. B
1c340 75 74 20 74 68 65 79 20 61 72 65 20 73 74 61 62  ut they are stab
1c350 6c 65 2c 20 61 73 20 74 68 65 79 20 61 72 65 20  le, as they are 
1c360 70 61 72 74 0a 20 20 20 20 20 20 20 2a 2a 20 6f  part.       ** o
1c370 66 20 74 68 65 20 64 65 66 69 6e 69 74 69 6f 6e  f the definition
1c380 20 6f 66 20 74 68 65 20 53 51 4c 69 74 65 20 66   of the SQLite f
1c390 69 6c 65 20 66 6f 72 6d 61 74 2c 20 77 68 69 63  ile format, whic
1c3a0 68 20 6d 61 79 20 6e 6f 74 20 63 68 61 6e 67 65  h may not change
1c3b0 2e 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 2a 70  . */.      u8 *p
1c3c0 42 75 66 20 3d 20 28 75 38 2a 29 7a 42 75 66 3b  Buf = (u8*)zBuf;
1c3d0 0a 20 20 20 20 20 20 70 2d 3e 69 43 6f 6f 6b 69  .      p->iCooki
1c3e0 65 20 3d 20 72 62 75 47 65 74 55 33 32 28 26 70  e = rbuGetU32(&p
1c3f0 42 75 66 5b 32 34 5d 29 3b 0a 20 20 20 20 20 20  Buf[24]);.      
1c400 70 2d 3e 69 57 72 69 74 65 56 65 72 20 3d 20 70  p->iWriteVer = p
1c410 42 75 66 5b 31 39 5d 3b 0a 20 20 20 20 7d 0a 20  Buf[19];.    }. 
1c420 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1c430 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64  }../*.** Write d
1c440 61 74 61 20 74 6f 20 61 6e 20 72 62 75 56 66 73  ata to an rbuVfs
1c450 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  -file..*/.static
1c460 20 69 6e 74 20 72 62 75 56 66 73 57 72 69 74 65   int rbuVfsWrite
1c470 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
1c480 20 2a 70 46 69 6c 65 2c 20 0a 20 20 63 6f 6e 73   *pFile, .  cons
1c490 74 20 76 6f 69 64 20 2a 7a 42 75 66 2c 20 0a 20  t void *zBuf, . 
1c4a0 20 69 6e 74 20 69 41 6d 74 2c 20 0a 20 20 73 71   int iAmt, .  sq
1c4b0 6c 69 74 65 5f 69 6e 74 36 34 20 69 4f 66 73 74  lite_int64 iOfst
1c4c0 0a 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a  .){.  rbu_file *
1c4d0 70 20 3d 20 28 72 62 75 5f 66 69 6c 65 2a 29 70  p = (rbu_file*)p
1c4e0 46 69 6c 65 3b 0a 20 20 73 71 6c 69 74 65 33 72  File;.  sqlite3r
1c4f0 62 75 20 2a 70 52 62 75 20 3d 20 70 2d 3e 70 52  bu *pRbu = p->pR
1c500 62 75 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  bu;.  int rc;.. 
1c510 20 69 66 28 20 70 52 62 75 20 26 26 20 70 52 62   if( pRbu && pRb
1c520 75 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53  u->eStage==RBU_S
1c530 54 41 47 45 5f 43 41 50 54 55 52 45 20 29 7b 0a  TAGE_CAPTURE ){.
1c540 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f      assert( p->o
1c550 70 65 6e 46 6c 61 67 73 20 26 20 53 51 4c 49 54  penFlags & SQLIT
1c560 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29  E_OPEN_MAIN_DB )
1c570 3b 0a 20 20 20 20 72 63 20 3d 20 72 62 75 43 61  ;.    rc = rbuCa
1c580 70 74 75 72 65 44 62 57 72 69 74 65 28 70 2d 3e  ptureDbWrite(p->
1c590 70 52 62 75 2c 20 69 4f 66 73 74 29 3b 0a 20 20  pRbu, iOfst);.  
1c5a0 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70  }else{.    if( p
1c5b0 52 62 75 20 26 26 20 70 52 62 75 2d 3e 65 53 74  Rbu && pRbu->eSt
1c5c0 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4f  age==RBU_STAGE_O
1c5d0 41 4c 20 0a 20 20 20 20 20 26 26 20 28 70 2d 3e  AL .     && (p->
1c5e0 6f 70 65 6e 46 6c 61 67 73 20 26 20 53 51 4c 49  openFlags & SQLI
1c5f0 54 45 5f 4f 50 45 4e 5f 57 41 4c 29 20 0a 20 20  TE_OPEN_WAL) .  
1c600 20 20 20 26 26 20 69 4f 66 73 74 3e 3d 70 52 62     && iOfst>=pRb
1c610 75 2d 3e 69 4f 61 6c 53 7a 0a 20 20 20 20 29 7b  u->iOalSz.    ){
1c620 0a 20 20 20 20 20 20 70 52 62 75 2d 3e 69 4f 61  .      pRbu->iOa
1c630 6c 53 7a 20 3d 20 69 41 6d 74 20 2b 20 69 4f 66  lSz = iAmt + iOf
1c640 73 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  st;.    }.    rc
1c650 20 3d 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65   = p->pReal->pMe
1c660 74 68 6f 64 73 2d 3e 78 57 72 69 74 65 28 70 2d  thods->xWrite(p-
1c670 3e 70 52 65 61 6c 2c 20 7a 42 75 66 2c 20 69 41  >pReal, zBuf, iA
1c680 6d 74 2c 20 69 4f 66 73 74 29 3b 0a 20 20 20 20  mt, iOfst);.    
1c690 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1c6a0 4b 20 26 26 20 69 4f 66 73 74 3d 3d 30 20 26 26  K && iOfst==0 &&
1c6b0 20 28 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26   (p->openFlags &
1c6c0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49   SQLITE_OPEN_MAI
1c6d0 4e 5f 44 42 29 20 29 7b 0a 20 20 20 20 20 20 2f  N_DB) ){.      /
1c6e0 2a 20 54 68 65 73 65 20 6c 6f 6f 6b 20 6c 69 6b  * These look lik
1c6f0 65 20 6d 61 67 69 63 20 6e 75 6d 62 65 72 73 2e  e magic numbers.
1c700 20 42 75 74 20 74 68 65 79 20 61 72 65 20 73 74   But they are st
1c710 61 62 6c 65 2c 20 61 73 20 74 68 65 79 20 61 72  able, as they ar
1c720 65 20 70 61 72 74 0a 20 20 20 20 20 20 2a 2a 20  e part.      ** 
1c730 6f 66 20 74 68 65 20 64 65 66 69 6e 69 74 69 6f  of the definitio
1c740 6e 20 6f 66 20 74 68 65 20 53 51 4c 69 74 65 20  n of the SQLite 
1c750 66 69 6c 65 20 66 6f 72 6d 61 74 2c 20 77 68 69  file format, whi
1c760 63 68 20 6d 61 79 20 6e 6f 74 20 63 68 61 6e 67  ch may not chang
1c770 65 2e 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 2a  e. */.      u8 *
1c780 70 42 75 66 20 3d 20 28 75 38 2a 29 7a 42 75 66  pBuf = (u8*)zBuf
1c790 3b 0a 20 20 20 20 20 20 70 2d 3e 69 43 6f 6f 6b  ;.      p->iCook
1c7a0 69 65 20 3d 20 72 62 75 47 65 74 55 33 32 28 26  ie = rbuGetU32(&
1c7b0 70 42 75 66 5b 32 34 5d 29 3b 0a 20 20 20 20 20  pBuf[24]);.     
1c7c0 20 70 2d 3e 69 57 72 69 74 65 56 65 72 20 3d 20   p->iWriteVer = 
1c7d0 70 42 75 66 5b 31 39 5d 3b 0a 20 20 20 20 7d 0a  pBuf[19];.    }.
1c7e0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1c7f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61  .}../*.** Trunca
1c800 74 65 20 61 6e 20 72 62 75 56 66 73 2d 66 69 6c  te an rbuVfs-fil
1c810 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1c820 20 72 62 75 56 66 73 54 72 75 6e 63 61 74 65 28   rbuVfsTruncate(
1c830 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
1c840 69 6c 65 2c 20 73 71 6c 69 74 65 5f 69 6e 74 36  ile, sqlite_int6
1c850 34 20 73 69 7a 65 29 7b 0a 20 20 72 62 75 5f 66  4 size){.  rbu_f
1c860 69 6c 65 20 2a 70 20 3d 20 28 72 62 75 5f 66 69  ile *p = (rbu_fi
1c870 6c 65 2a 29 70 46 69 6c 65 3b 0a 20 20 72 65 74  le*)pFile;.  ret
1c880 75 72 6e 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d  urn p->pReal->pM
1c890 65 74 68 6f 64 73 2d 3e 78 54 72 75 6e 63 61 74  ethods->xTruncat
1c8a0 65 28 70 2d 3e 70 52 65 61 6c 2c 20 73 69 7a 65  e(p->pReal, size
1c8b0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63  );.}../*.** Sync
1c8c0 20 61 6e 20 72 62 75 56 66 73 2d 66 69 6c 65 2e   an rbuVfs-file.
1c8d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
1c8e0 62 75 56 66 73 53 79 6e 63 28 73 71 6c 69 74 65  buVfsSync(sqlite
1c8f0 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69  3_file *pFile, i
1c900 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 72 62 75  nt flags){.  rbu
1c910 5f 66 69 6c 65 20 2a 70 20 3d 20 28 72 62 75 5f  _file *p = (rbu_
1c920 66 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20  file *)pFile;.  
1c930 69 66 28 20 70 2d 3e 70 52 62 75 20 26 26 20 70  if( p->pRbu && p
1c940 2d 3e 70 52 62 75 2d 3e 65 53 74 61 67 65 3d 3d  ->pRbu->eStage==
1c950 52 42 55 5f 53 54 41 47 45 5f 43 41 50 54 55 52  RBU_STAGE_CAPTUR
1c960 45 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  E ){.    if( p->
1c970 6f 70 65 6e 46 6c 61 67 73 20 26 20 53 51 4c 49  openFlags & SQLI
1c980 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20  TE_OPEN_MAIN_DB 
1c990 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1c9a0 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c 3b  SQLITE_INTERNAL;
1c9b0 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
1c9c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
1c9d0 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 52 65  .  return p->pRe
1c9e0 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53  al->pMethods->xS
1c9f0 79 6e 63 28 70 2d 3e 70 52 65 61 6c 2c 20 66 6c  ync(p->pReal, fl
1ca00 61 67 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ags);.}../*.** R
1ca10 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e  eturn the curren
1ca20 74 20 66 69 6c 65 2d 73 69 7a 65 20 6f 66 20 61  t file-size of a
1ca30 6e 20 72 62 75 56 66 73 2d 66 69 6c 65 2e 0a 2a  n rbuVfs-file..*
1ca40 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62 75  /.static int rbu
1ca50 56 66 73 46 69 6c 65 53 69 7a 65 28 73 71 6c 69  VfsFileSize(sqli
1ca60 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c  te3_file *pFile,
1ca70 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 2a 70   sqlite_int64 *p
1ca80 53 69 7a 65 29 7b 0a 20 20 72 62 75 5f 66 69 6c  Size){.  rbu_fil
1ca90 65 20 2a 70 20 3d 20 28 72 62 75 5f 66 69 6c 65  e *p = (rbu_file
1caa0 20 2a 29 70 46 69 6c 65 3b 0a 20 20 72 65 74 75   *)pFile;.  retu
1cab0 72 6e 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65  rn p->pReal->pMe
1cac0 74 68 6f 64 73 2d 3e 78 46 69 6c 65 53 69 7a 65  thods->xFileSize
1cad0 28 70 2d 3e 70 52 65 61 6c 2c 20 70 53 69 7a 65  (p->pReal, pSize
1cae0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  );.}../*.** Lock
1caf0 20 61 6e 20 72 62 75 56 66 73 2d 66 69 6c 65 2e   an rbuVfs-file.
1cb00 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
1cb10 62 75 56 66 73 4c 6f 63 6b 28 73 71 6c 69 74 65  buVfsLock(sqlite
1cb20 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69  3_file *pFile, i
1cb30 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 72 62 75  nt eLock){.  rbu
1cb40 5f 66 69 6c 65 20 2a 70 20 3d 20 28 72 62 75 5f  _file *p = (rbu_
1cb50 66 69 6c 65 2a 29 70 46 69 6c 65 3b 0a 20 20 73  file*)pFile;.  s
1cb60 71 6c 69 74 65 33 72 62 75 20 2a 70 52 62 75 20  qlite3rbu *pRbu 
1cb70 3d 20 70 2d 3e 70 52 62 75 3b 0a 20 20 69 6e 74  = p->pRbu;.  int
1cb80 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1cb90 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f  ..  assert( p->o
1cba0 70 65 6e 46 6c 61 67 73 20 26 20 28 53 51 4c 49  penFlags & (SQLI
1cbb0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 7c  TE_OPEN_MAIN_DB|
1cbc0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
1cbd0 5f 44 42 29 20 29 3b 0a 20 20 69 66 28 20 70 52  _DB) );.  if( pR
1cbe0 62 75 20 26 26 20 65 4c 6f 63 6b 3d 3d 53 51 4c  bu && eLock==SQL
1cbf0 49 54 45 5f 4c 4f 43 4b 5f 45 58 43 4c 55 53 49  ITE_LOCK_EXCLUSI
1cc00 56 45 20 26 26 20 70 52 62 75 2d 3e 65 53 74 61  VE && pRbu->eSta
1cc10 67 65 21 3d 52 42 55 5f 53 54 41 47 45 5f 44 4f  ge!=RBU_STAGE_DO
1cc20 4e 45 20 29 7b 0a 20 20 20 20 2f 2a 20 44 6f 20  NE ){.    /* Do 
1cc30 6e 6f 74 20 61 6c 6c 6f 77 20 45 58 43 4c 55 53  not allow EXCLUS
1cc40 49 56 45 20 6c 6f 63 6b 73 2e 20 50 72 65 76 65  IVE locks. Preve
1cc50 6e 74 69 6e 67 20 53 51 4c 69 74 65 20 66 72 6f  nting SQLite fro
1cc60 6d 20 74 61 6b 69 6e 67 20 74 68 69 73 20 0a 20  m taking this . 
1cc70 20 20 20 2a 2a 20 70 72 65 76 65 6e 74 73 20 69     ** prevents i
1cc80 74 20 66 72 6f 6d 20 63 68 65 63 6b 70 6f 69 6e  t from checkpoin
1cc90 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ting the databas
1cca0 65 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 63  e from sqlite3_c
1ccb0 6c 6f 73 65 28 29 2e 20 2a 2f 0a 20 20 20 20 72  lose(). */.    r
1ccc0 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
1ccd0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
1cce0 20 3d 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65   = p->pReal->pMe
1ccf0 74 68 6f 64 73 2d 3e 78 4c 6f 63 6b 28 70 2d 3e  thods->xLock(p->
1cd00 70 52 65 61 6c 2c 20 65 4c 6f 63 6b 29 3b 0a 20  pReal, eLock);. 
1cd10 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
1cd20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b  .}../*.** Unlock
1cd30 20 61 6e 20 72 62 75 56 66 73 2d 66 69 6c 65 2e   an rbuVfs-file.
1cd40 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
1cd50 62 75 56 66 73 55 6e 6c 6f 63 6b 28 73 71 6c 69  buVfsUnlock(sqli
1cd60 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c  te3_file *pFile,
1cd70 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 72   int eLock){.  r
1cd80 62 75 5f 66 69 6c 65 20 2a 70 20 3d 20 28 72 62  bu_file *p = (rb
1cd90 75 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a  u_file *)pFile;.
1cda0 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 52 65 61    return p->pRea
1cdb0 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 55 6e  l->pMethods->xUn
1cdc0 6c 6f 63 6b 28 70 2d 3e 70 52 65 61 6c 2c 20 65  lock(p->pReal, e
1cdd0 4c 6f 63 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Lock);.}../*.** 
1cde0 43 68 65 63 6b 20 69 66 20 61 6e 6f 74 68 65 72  Check if another
1cdf0 20 66 69 6c 65 2d 68 61 6e 64 6c 65 20 68 6f 6c   file-handle hol
1ce00 64 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  ds a RESERVED lo
1ce10 63 6b 20 6f 6e 20 61 6e 20 72 62 75 56 66 73 2d  ck on an rbuVfs-
1ce20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
1ce30 69 6e 74 20 72 62 75 56 66 73 43 68 65 63 6b 52  int rbuVfsCheckR
1ce40 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69  eservedLock(sqli
1ce50 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c  te3_file *pFile,
1ce60 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a   int *pResOut){.
1ce70 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 20 3d 20    rbu_file *p = 
1ce80 28 72 62 75 5f 66 69 6c 65 20 2a 29 70 46 69 6c  (rbu_file *)pFil
1ce90 65 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70  e;.  return p->p
1cea0 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e  Real->pMethods->
1ceb0 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
1cec0 63 6b 28 70 2d 3e 70 52 65 61 6c 2c 20 70 52 65  ck(p->pReal, pRe
1ced0 73 4f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  sOut);.}../*.** 
1cee0 46 69 6c 65 20 63 6f 6e 74 72 6f 6c 20 6d 65 74  File control met
1cef0 68 6f 64 2e 20 46 6f 72 20 63 75 73 74 6f 6d 20  hod. For custom 
1cf00 6f 70 65 72 61 74 69 6f 6e 73 20 6f 6e 20 61 6e  operations on an
1cf10 20 72 62 75 56 66 73 2d 66 69 6c 65 2e 0a 2a 2f   rbuVfs-file..*/
1cf20 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 56  .static int rbuV
1cf30 66 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71  fsFileControl(sq
1cf40 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
1cf50 65 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20  e, int op, void 
1cf60 2a 70 41 72 67 29 7b 0a 20 20 72 62 75 5f 66 69  *pArg){.  rbu_fi
1cf70 6c 65 20 2a 70 20 3d 20 28 72 62 75 5f 66 69 6c  le *p = (rbu_fil
1cf80 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 69 6e 74  e *)pFile;.  int
1cf90 20 28 2a 78 43 6f 6e 74 72 6f 6c 29 28 73 71 6c   (*xControl)(sql
1cfa0 69 74 65 33 5f 66 69 6c 65 2a 2c 69 6e 74 2c 76  ite3_file*,int,v
1cfb0 6f 69 64 2a 29 20 3d 20 70 2d 3e 70 52 65 61 6c  oid*) = p->pReal
1cfc0 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 46 69 6c  ->pMethods->xFil
1cfd0 65 43 6f 6e 74 72 6f 6c 3b 0a 20 20 69 6e 74 20  eControl;.  int 
1cfe0 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  rc;..  assert( p
1cff0 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20 28 53  ->openFlags & (S
1d000 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
1d010 44 42 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54  DB|SQLITE_OPEN_T
1d020 45 4d 50 5f 44 42 29 0a 20 20 20 20 20 20 20 7c  EMP_DB).       |
1d030 7c 20 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26  | p->openFlags &
1d040 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52   (SQLITE_OPEN_TR
1d050 41 4e 53 49 45 4e 54 5f 44 42 7c 53 51 4c 49 54  ANSIENT_DB|SQLIT
1d060 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52  E_OPEN_TEMP_JOUR
1d070 4e 41 4c 29 0a 20 20 29 3b 0a 20 20 69 66 28 20  NAL).  );.  if( 
1d080 6f 70 3d 3d 53 51 4c 49 54 45 5f 46 43 4e 54 4c  op==SQLITE_FCNTL
1d090 5f 52 42 55 20 29 7b 0a 20 20 20 20 73 71 6c 69  _RBU ){.    sqli
1d0a0 74 65 33 72 62 75 20 2a 70 52 62 75 20 3d 20 28  te3rbu *pRbu = (
1d0b0 73 71 6c 69 74 65 33 72 62 75 2a 29 70 41 72 67  sqlite3rbu*)pArg
1d0c0 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 72 73 74 20  ;..    /* First 
1d0d0 74 72 79 20 74 6f 20 66 69 6e 64 20 61 6e 6f 74  try to find anot
1d0e0 68 65 72 20 52 42 55 20 76 66 73 20 6c 6f 77 65  her RBU vfs lowe
1d0f0 72 20 64 6f 77 6e 20 69 6e 20 74 68 65 20 76 66  r down in the vf
1d100 73 20 73 74 61 63 6b 2e 20 49 66 0a 20 20 20 20  s stack. If.    
1d110 2a 2a 20 6f 6e 65 20 69 73 20 66 6f 75 6e 64 2c  ** one is found,
1d120 20 74 68 69 73 20 76 66 73 20 77 69 6c 6c 20 6f   this vfs will o
1d130 70 65 72 61 74 65 20 69 6e 20 70 61 73 73 2d 74  perate in pass-t
1d140 68 72 6f 75 67 68 20 6d 6f 64 65 2e 20 54 68 65  hrough mode. The
1d150 20 6c 6f 77 65 72 0a 20 20 20 20 2a 2a 20 6c 65   lower.    ** le
1d160 76 65 6c 20 76 66 73 20 77 69 6c 6c 20 64 6f 20  vel vfs will do 
1d170 74 68 65 20 73 70 65 63 69 61 6c 20 52 42 55 20  the special RBU 
1d180 68 61 6e 64 6c 69 6e 67 2e 20 20 2a 2f 0a 20 20  handling.  */.  
1d190 20 20 72 63 20 3d 20 78 43 6f 6e 74 72 6f 6c 28    rc = xControl(
1d1a0 70 2d 3e 70 52 65 61 6c 2c 20 6f 70 2c 20 70 41  p->pReal, op, pA
1d1b0 72 67 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63  rg);..    if( rc
1d1c0 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  ==SQLITE_NOTFOUN
1d1d0 44 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f  D ){.      /* No
1d1e0 77 20 73 65 61 72 63 68 20 66 6f 72 20 61 20 7a  w search for a z
1d1f0 69 70 76 66 73 20 69 6e 73 74 61 6e 63 65 20 6c  ipvfs instance l
1d200 6f 77 65 72 20 64 6f 77 6e 20 69 6e 20 74 68 65  ower down in the
1d210 20 56 46 53 20 73 74 61 63 6b 2e 20 49 66 0a 20   VFS stack. If. 
1d220 20 20 20 20 20 2a 2a 20 6f 6e 65 20 69 73 20 66       ** one is f
1d230 6f 75 6e 64 2c 20 74 68 69 73 20 69 73 20 61 6e  ound, this is an
1d240 20 65 72 72 6f 72 2e 20 20 2a 2f 0a 20 20 20 20   error.  */.    
1d250 20 20 76 6f 69 64 20 2a 64 75 6d 6d 79 20 3d 20    void *dummy = 
1d260 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 78 43  0;.      rc = xC
1d270 6f 6e 74 72 6f 6c 28 70 2d 3e 70 52 65 61 6c 2c  ontrol(p->pReal,
1d280 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 5a 49   SQLITE_FCNTL_ZI
1d290 50 56 46 53 2c 20 26 64 75 6d 6d 79 29 3b 0a 20  PVFS, &dummy);. 
1d2a0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1d2b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1d2c0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
1d2d0 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 70 52 62  ROR;.        pRb
1d2e0 75 2d 3e 7a 45 72 72 6d 73 67 20 3d 20 73 71 6c  u->zErrmsg = sql
1d2f0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 72 62  ite3_mprintf("rb
1d300 75 2f 7a 69 70 76 66 73 20 73 65 74 75 70 20 65  u/zipvfs setup e
1d310 72 72 6f 72 22 29 3b 0a 20 20 20 20 20 20 7d 65  rror");.      }e
1d320 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  lse if( rc==SQLI
1d330 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 7b 0a 20  TE_NOTFOUND ){. 
1d340 20 20 20 20 20 20 20 70 52 62 75 2d 3e 70 54 61         pRbu->pTa
1d350 72 67 65 74 46 64 20 3d 20 70 3b 0a 20 20 20 20  rgetFd = p;.    
1d360 20 20 20 20 70 2d 3e 70 52 62 75 20 3d 20 70 52      p->pRbu = pR
1d370 62 75 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  bu;.        if( 
1d380 70 2d 3e 70 57 61 6c 46 64 20 29 20 70 2d 3e 70  p->pWalFd ) p->p
1d390 57 61 6c 46 64 2d 3e 70 52 62 75 20 3d 20 70 52  WalFd->pRbu = pR
1d3a0 62 75 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  bu;.        rc =
1d3b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1d3c0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65    }.    }.    re
1d3d0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
1d3e0 72 63 20 3d 20 78 43 6f 6e 74 72 6f 6c 28 70 2d  rc = xControl(p-
1d3f0 3e 70 52 65 61 6c 2c 20 6f 70 2c 20 70 41 72 67  >pReal, op, pArg
1d400 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
1d410 49 54 45 5f 4f 4b 20 26 26 20 6f 70 3d 3d 53 51  ITE_OK && op==SQ
1d420 4c 49 54 45 5f 46 43 4e 54 4c 5f 56 46 53 4e 41  LITE_FCNTL_VFSNA
1d430 4d 45 20 29 7b 0a 20 20 20 20 72 62 75 5f 76 66  ME ){.    rbu_vf
1d440 73 20 2a 70 52 62 75 56 66 73 20 3d 20 70 2d 3e  s *pRbuVfs = p->
1d450 70 52 62 75 56 66 73 3b 0a 20 20 20 20 63 68 61  pRbuVfs;.    cha
1d460 72 20 2a 7a 49 6e 20 3d 20 2a 28 63 68 61 72 2a  r *zIn = *(char*
1d470 2a 29 70 41 72 67 3b 0a 20 20 20 20 63 68 61 72  *)pArg;.    char
1d480 20 2a 7a 4f 75 74 20 3d 20 73 71 6c 69 74 65 33   *zOut = sqlite3
1d490 5f 6d 70 72 69 6e 74 66 28 22 72 62 75 28 25 73  _mprintf("rbu(%s
1d4a0 29 2f 25 7a 22 2c 20 70 52 62 75 56 66 73 2d 3e  )/%z", pRbuVfs->
1d4b0 62 61 73 65 2e 7a 4e 61 6d 65 2c 20 7a 49 6e 29  base.zName, zIn)
1d4c0 3b 0a 20 20 20 20 2a 28 63 68 61 72 2a 2a 29 70  ;.    *(char**)p
1d4d0 41 72 67 20 3d 20 7a 4f 75 74 3b 0a 20 20 20 20  Arg = zOut;.    
1d4e0 69 66 28 20 7a 4f 75 74 3d 3d 30 20 29 20 72 63  if( zOut==0 ) rc
1d4f0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
1d500 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
1d510 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
1d520 72 6e 20 74 68 65 20 73 65 63 74 6f 72 2d 73 69  rn the sector-si
1d530 7a 65 20 69 6e 20 62 79 74 65 73 20 66 6f 72 20  ze in bytes for 
1d540 61 6e 20 72 62 75 56 66 73 2d 66 69 6c 65 2e 0a  an rbuVfs-file..
1d550 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62  */.static int rb
1d560 75 56 66 73 53 65 63 74 6f 72 53 69 7a 65 28 73  uVfsSectorSize(s
1d570 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
1d580 6c 65 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20  le){.  rbu_file 
1d590 2a 70 20 3d 20 28 72 62 75 5f 66 69 6c 65 20 2a  *p = (rbu_file *
1d5a0 29 70 46 69 6c 65 3b 0a 20 20 72 65 74 75 72 6e  )pFile;.  return
1d5b0 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68   p->pReal->pMeth
1d5c0 6f 64 73 2d 3e 78 53 65 63 74 6f 72 53 69 7a 65  ods->xSectorSize
1d5d0 28 70 2d 3e 70 52 65 61 6c 29 3b 0a 7d 0a 0a 2f  (p->pReal);.}../
1d5e0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1d5f0 64 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72  device character
1d600 69 73 74 69 63 20 66 6c 61 67 73 20 73 75 70 70  istic flags supp
1d610 6f 72 74 65 64 20 62 79 20 61 6e 20 72 62 75 56  orted by an rbuV
1d620 66 73 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  fs-file..*/.stat
1d630 69 63 20 69 6e 74 20 72 62 75 56 66 73 44 65 76  ic int rbuVfsDev
1d640 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
1d650 63 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  cs(sqlite3_file 
1d660 2a 70 46 69 6c 65 29 7b 0a 20 20 72 62 75 5f 66  *pFile){.  rbu_f
1d670 69 6c 65 20 2a 70 20 3d 20 28 72 62 75 5f 66 69  ile *p = (rbu_fi
1d680 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 72 65  le *)pFile;.  re
1d690 74 75 72 6e 20 70 2d 3e 70 52 65 61 6c 2d 3e 70  turn p->pReal->p
1d6a0 4d 65 74 68 6f 64 73 2d 3e 78 44 65 76 69 63 65  Methods->xDevice
1d6b0 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
1d6c0 70 2d 3e 70 52 65 61 6c 29 3b 0a 7d 0a 0a 2f 2a  p->pReal);.}../*
1d6d0 0a 2a 2a 20 54 61 6b 65 20 6f 72 20 72 65 6c 65  .** Take or rele
1d6e0 61 73 65 20 61 20 73 68 61 72 65 64 2d 6d 65 6d  ase a shared-mem
1d6f0 6f 72 79 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61  ory lock..*/.sta
1d700 74 69 63 20 69 6e 74 20 72 62 75 56 66 73 53 68  tic int rbuVfsSh
1d710 6d 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  mLock(sqlite3_fi
1d720 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20 6f  le *pFile, int o
1d730 66 73 74 2c 20 69 6e 74 20 6e 2c 20 69 6e 74 20  fst, int n, int 
1d740 66 6c 61 67 73 29 7b 0a 20 20 72 62 75 5f 66 69  flags){.  rbu_fi
1d750 6c 65 20 2a 70 20 3d 20 28 72 62 75 5f 66 69 6c  le *p = (rbu_fil
1d760 65 2a 29 70 46 69 6c 65 3b 0a 20 20 73 71 6c 69  e*)pFile;.  sqli
1d770 74 65 33 72 62 75 20 2a 70 52 62 75 20 3d 20 70  te3rbu *pRbu = p
1d780 2d 3e 70 52 62 75 3b 0a 20 20 69 6e 74 20 72 63  ->pRbu;.  int rc
1d790 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 23   = SQLITE_OK;..#
1d7a0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 41 4d 41  ifdef SQLITE_AMA
1d7b0 4c 47 41 4d 41 54 49 4f 4e 0a 20 20 20 20 61 73  LGAMATION.    as
1d7c0 73 65 72 74 28 20 57 41 4c 5f 43 4b 50 54 5f 4c  sert( WAL_CKPT_L
1d7d0 4f 43 4b 3d 3d 31 20 29 3b 0a 23 65 6e 64 69 66  OCK==1 );.#endif
1d7e0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f  ..  assert( p->o
1d7f0 70 65 6e 46 6c 61 67 73 20 26 20 28 53 51 4c 49  penFlags & (SQLI
1d800 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 7c  TE_OPEN_MAIN_DB|
1d810 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
1d820 5f 44 42 29 20 29 3b 0a 20 20 69 66 28 20 70 52  _DB) );.  if( pR
1d830 62 75 20 26 26 20 28 70 52 62 75 2d 3e 65 53 74  bu && (pRbu->eSt
1d840 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4f  age==RBU_STAGE_O
1d850 41 4c 20 7c 7c 20 70 52 62 75 2d 3e 65 53 74 61  AL || pRbu->eSta
1d860 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4d 4f  ge==RBU_STAGE_MO
1d870 56 45 29 20 29 7b 0a 20 20 20 20 2f 2a 20 4d 61  VE) ){.    /* Ma
1d880 67 69 63 20 6e 75 6d 62 65 72 20 31 20 69 73 20  gic number 1 is 
1d890 74 68 65 20 57 41 4c 5f 43 4b 50 54 5f 4c 4f 43  the WAL_CKPT_LOC
1d8a0 4b 20 6c 6f 63 6b 2e 20 50 72 65 76 65 6e 74 69  K lock. Preventi
1d8b0 6e 67 20 53 51 4c 69 74 65 20 66 72 6f 6d 0a 20  ng SQLite from. 
1d8c0 20 20 20 2a 2a 20 74 61 6b 69 6e 67 20 74 68 69     ** taking thi
1d8d0 73 20 6c 6f 63 6b 20 61 6c 73 6f 20 70 72 65 76  s lock also prev
1d8e0 65 6e 74 73 20 61 6e 79 20 63 68 65 63 6b 70 6f  ents any checkpo
1d8f0 69 6e 74 73 20 66 72 6f 6d 20 6f 63 63 75 72 72  ints from occurr
1d900 69 6e 67 2e 20 0a 20 20 20 20 2a 2a 20 74 6f 64  ing. .    ** tod
1d910 6f 3a 20 72 65 61 6c 6c 79 2c 20 69 74 27 73 20  o: really, it's 
1d920 6e 6f 74 20 63 6c 65 61 72 20 77 68 79 20 74 68  not clear why th
1d930 69 73 20 6d 69 67 68 74 20 6f 63 63 75 72 2c 20  is might occur, 
1d940 61 73 20 0a 20 20 20 20 2a 2a 20 77 61 6c 5f 61  as .    ** wal_a
1d950 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 20 6f 75  utocheckpoint ou
1d960 67 68 74 20 74 6f 20 62 65 20 74 75 72 6e 65 64  ght to be turned
1d970 20 6f 66 66 2e 20 20 2a 2f 0a 20 20 20 20 69 66   off.  */.    if
1d980 28 20 6f 66 73 74 3d 3d 57 41 4c 5f 4c 4f 43 4b  ( ofst==WAL_LOCK
1d990 5f 43 4b 50 54 20 26 26 20 6e 3d 3d 31 20 29 20  _CKPT && n==1 ) 
1d9a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
1d9b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
1d9c0 6e 74 20 62 43 61 70 74 75 72 65 20 3d 20 30 3b  nt bCapture = 0;
1d9d0 0a 20 20 20 20 69 66 28 20 6e 3d 3d 31 20 26 26  .    if( n==1 &&
1d9e0 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
1d9f0 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 0a  _SHM_EXCLUSIVE).
1da00 20 20 20 20 20 26 26 20 70 52 62 75 20 26 26 20       && pRbu && 
1da10 70 52 62 75 2d 3e 65 53 74 61 67 65 3d 3d 52 42  pRbu->eStage==RB
1da20 55 5f 53 54 41 47 45 5f 43 41 50 54 55 52 45 0a  U_STAGE_CAPTURE.
1da30 20 20 20 20 20 26 26 20 28 6f 66 73 74 3d 3d 57       && (ofst==W
1da40 41 4c 5f 4c 4f 43 4b 5f 57 52 49 54 45 20 7c 7c  AL_LOCK_WRITE ||
1da50 20 6f 66 73 74 3d 3d 57 41 4c 5f 4c 4f 43 4b 5f   ofst==WAL_LOCK_
1da60 43 4b 50 54 20 7c 7c 20 6f 66 73 74 3d 3d 57 41  CKPT || ofst==WA
1da70 4c 5f 4c 4f 43 4b 5f 52 45 41 44 30 29 0a 20 20  L_LOCK_READ0).  
1da80 20 20 29 7b 0a 20 20 20 20 20 20 62 43 61 70 74    ){.      bCapt
1da90 75 72 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a  ure = 1;.    }..
1daa0 20 20 20 20 69 66 28 20 62 43 61 70 74 75 72 65      if( bCapture
1dab0 3d 3d 30 20 7c 7c 20 30 3d 3d 28 66 6c 61 67 73  ==0 || 0==(flags
1dac0 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e   & SQLITE_SHM_UN
1dad0 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 20 20 72  LOCK) ){.      r
1dae0 63 20 3d 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d  c = p->pReal->pM
1daf0 65 74 68 6f 64 73 2d 3e 78 53 68 6d 4c 6f 63 6b  ethods->xShmLock
1db00 28 70 2d 3e 70 52 65 61 6c 2c 20 6f 66 73 74 2c  (p->pReal, ofst,
1db10 20 6e 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20   n, flags);.    
1db20 20 20 69 66 28 20 62 43 61 70 74 75 72 65 20 26    if( bCapture &
1db30 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
1db40 29 7b 0a 20 20 20 20 20 20 20 20 70 52 62 75 2d  ){.        pRbu-
1db50 3e 6d 4c 6f 63 6b 20 7c 3d 20 28 31 20 3c 3c 20  >mLock |= (1 << 
1db60 6f 66 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ofst);.      }. 
1db70 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
1db80 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1db90 4f 62 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72  Obtain a pointer
1dba0 20 74 6f 20 61 20 6d 61 70 70 69 6e 67 20 6f 66   to a mapping of
1dbb0 20 61 20 73 69 6e 67 6c 65 20 33 32 4b 69 42 20   a single 32KiB 
1dbc0 70 61 67 65 20 6f 66 20 74 68 65 20 2a 2d 73 68  page of the *-sh
1dbd0 6d 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  m file..*/.stati
1dbe0 63 20 69 6e 74 20 72 62 75 56 66 73 53 68 6d 4d  c int rbuVfsShmM
1dbf0 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  ap(.  sqlite3_fi
1dc00 6c 65 20 2a 70 46 69 6c 65 2c 20 0a 20 20 69 6e  le *pFile, .  in
1dc10 74 20 69 52 65 67 69 6f 6e 2c 20 0a 20 20 69 6e  t iRegion, .  in
1dc20 74 20 73 7a 52 65 67 69 6f 6e 2c 20 0a 20 20 69  t szRegion, .  i
1dc30 6e 74 20 69 73 57 72 69 74 65 2c 20 0a 20 20 76  nt isWrite, .  v
1dc40 6f 69 64 20 76 6f 6c 61 74 69 6c 65 20 2a 2a 70  oid volatile **p
1dc50 70 0a 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20  p.){.  rbu_file 
1dc60 2a 70 20 3d 20 28 72 62 75 5f 66 69 6c 65 2a 29  *p = (rbu_file*)
1dc70 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20 72 63 20  pFile;.  int rc 
1dc80 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
1dc90 6e 74 20 65 53 74 61 67 65 20 3d 20 28 70 2d 3e  nt eStage = (p->
1dca0 70 52 62 75 20 3f 20 70 2d 3e 70 52 62 75 2d 3e  pRbu ? p->pRbu->
1dcb0 65 53 74 61 67 65 20 3a 20 30 29 3b 0a 0a 20 20  eStage : 0);..  
1dcc0 2f 2a 20 49 66 20 6e 6f 74 20 69 6e 20 52 42 55  /* If not in RBU
1dcd0 5f 53 54 41 47 45 5f 4f 41 4c 2c 20 61 6c 6c 6f  _STAGE_OAL, allo
1dce0 77 20 74 68 69 73 20 63 61 6c 6c 20 74 6f 20 70  w this call to p
1dcf0 61 73 73 20 74 68 72 6f 75 67 68 2e 20 4f 72 2c  ass through. Or,
1dd00 20 69 66 20 74 68 69 73 0a 20 20 2a 2a 20 72 62   if this.  ** rb
1dd10 75 20 69 73 20 69 6e 20 74 68 65 20 52 42 55 5f  u is in the RBU_
1dd20 53 54 41 47 45 5f 4f 41 4c 20 73 74 61 74 65 2c  STAGE_OAL state,
1dd30 20 75 73 65 20 68 65 61 70 20 6d 65 6d 6f 72 79   use heap memory
1dd40 20 66 6f 72 20 2a 2d 73 68 6d 20 73 70 61 63 65   for *-shm space
1dd50 20 0a 20 20 2a 2a 20 69 6e 73 74 65 61 64 20 6f   .  ** instead o
1dd60 66 20 61 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  f a file on disk
1dd70 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
1dd80 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20 28  p->openFlags & (
1dd90 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
1dda0 5f 44 42 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  _DB|SQLITE_OPEN_
1ddb0 54 45 4d 50 5f 44 42 29 20 29 3b 0a 20 20 69 66  TEMP_DB) );.  if
1ddc0 28 20 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54  ( eStage==RBU_ST
1ddd0 41 47 45 5f 4f 41 4c 20 7c 7c 20 65 53 74 61 67  AGE_OAL || eStag
1dde0 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4d 4f 56  e==RBU_STAGE_MOV
1ddf0 45 20 29 7b 0a 20 20 20 20 69 66 28 20 69 52 65  E ){.    if( iRe
1de00 67 69 6f 6e 3c 3d 70 2d 3e 6e 53 68 6d 20 29 7b  gion<=p->nShm ){
1de10 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65  .      int nByte
1de20 20 3d 20 28 69 52 65 67 69 6f 6e 2b 31 29 20 2a   = (iRegion+1) *
1de30 20 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 3b 0a   sizeof(char*);.
1de40 20 20 20 20 20 20 63 68 61 72 20 2a 2a 61 70 4e        char **apN
1de50 65 77 20 3d 20 28 63 68 61 72 2a 2a 29 73 71 6c  ew = (char**)sql
1de60 69 74 65 33 5f 72 65 61 6c 6c 6f 63 36 34 28 70  ite3_realloc64(p
1de70 2d 3e 61 70 53 68 6d 2c 20 6e 42 79 74 65 29 3b  ->apShm, nByte);
1de80 0a 20 20 20 20 20 20 69 66 28 20 61 70 4e 65 77  .      if( apNew
1de90 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
1dea0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
1deb0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1dec0 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 61         memset(&a
1ded0 70 4e 65 77 5b 70 2d 3e 6e 53 68 6d 5d 2c 20 30  pNew[p->nShm], 0
1dee0 2c 20 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 20  , sizeof(char*) 
1def0 2a 20 28 31 20 2b 20 69 52 65 67 69 6f 6e 20 2d  * (1 + iRegion -
1df00 20 70 2d 3e 6e 53 68 6d 29 29 3b 0a 20 20 20 20   p->nShm));.    
1df10 20 20 20 20 70 2d 3e 61 70 53 68 6d 20 3d 20 61      p->apShm = a
1df20 70 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 70 2d  pNew;.        p-
1df30 3e 6e 53 68 6d 20 3d 20 69 52 65 67 69 6f 6e 2b  >nShm = iRegion+
1df40 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
1df50 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ..    if( rc==SQ
1df60 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 61 70  LITE_OK && p->ap
1df70 53 68 6d 5b 69 52 65 67 69 6f 6e 5d 3d 3d 30 20  Shm[iRegion]==0 
1df80 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70  ){.      char *p
1df90 4e 65 77 20 3d 20 28 63 68 61 72 2a 29 73 71 6c  New = (char*)sql
1dfa0 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 73 7a  ite3_malloc64(sz
1dfb0 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 69  Region);.      i
1dfc0 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
1dfd0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1dfe0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d  E_NOMEM;.      }
1dff0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65  else{.        me
1e000 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 7a  mset(pNew, 0, sz
1e010 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20  Region);.       
1e020 20 70 2d 3e 61 70 53 68 6d 5b 69 52 65 67 69 6f   p->apShm[iRegio
1e030 6e 5d 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20  n] = pNew;.     
1e040 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66   }.    }..    if
1e050 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1e060 29 7b 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 70  ){.      *pp = p
1e070 2d 3e 61 70 53 68 6d 5b 69 52 65 67 69 6f 6e 5d  ->apShm[iRegion]
1e080 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1e090 20 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20 20 20     *pp = 0;.    
1e0a0 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  }.  }else{.    a
1e0b0 73 73 65 72 74 28 20 70 2d 3e 61 70 53 68 6d 3d  ssert( p->apShm=
1e0c0 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70  =0 );.    rc = p
1e0d0 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64  ->pReal->pMethod
1e0e0 73 2d 3e 78 53 68 6d 4d 61 70 28 70 2d 3e 70 52  s->xShmMap(p->pR
1e0f0 65 61 6c 2c 20 69 52 65 67 69 6f 6e 2c 20 73 7a  eal, iRegion, sz
1e100 52 65 67 69 6f 6e 2c 20 69 73 57 72 69 74 65 2c  Region, isWrite,
1e110 20 70 70 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74   pp);.  }..  ret
1e120 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1e130 20 4d 65 6d 6f 72 79 20 62 61 72 72 69 65 72 2e   Memory barrier.
1e140 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1e150 72 62 75 56 66 73 53 68 6d 42 61 72 72 69 65 72  rbuVfsShmBarrier
1e160 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70  (sqlite3_file *p
1e170 46 69 6c 65 29 7b 0a 20 20 72 62 75 5f 66 69 6c  File){.  rbu_fil
1e180 65 20 2a 70 20 3d 20 28 72 62 75 5f 66 69 6c 65  e *p = (rbu_file
1e190 20 2a 29 70 46 69 6c 65 3b 0a 20 20 70 2d 3e 70   *)pFile;.  p->p
1e1a0 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e  Real->pMethods->
1e1b0 78 53 68 6d 42 61 72 72 69 65 72 28 70 2d 3e 70  xShmBarrier(p->p
1e1c0 52 65 61 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Real);.}../*.** 
1e1d0 54 68 65 20 78 53 68 6d 55 6e 6d 61 70 20 6d 65  The xShmUnmap me
1e1e0 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  thod..*/.static 
1e1f0 69 6e 74 20 72 62 75 56 66 73 53 68 6d 55 6e 6d  int rbuVfsShmUnm
1e200 61 70 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ap(sqlite3_file 
1e210 2a 70 46 69 6c 65 2c 20 69 6e 74 20 64 65 6c 46  *pFile, int delF
1e220 6c 61 67 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65  lag){.  rbu_file
1e230 20 2a 70 20 3d 20 28 72 62 75 5f 66 69 6c 65 2a   *p = (rbu_file*
1e240 29 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20 72 63  )pFile;.  int rc
1e250 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1e260 69 6e 74 20 65 53 74 61 67 65 20 3d 20 28 70 2d  int eStage = (p-
1e270 3e 70 52 62 75 20 3f 20 70 2d 3e 70 52 62 75 2d  >pRbu ? p->pRbu-
1e280 3e 65 53 74 61 67 65 20 3a 20 30 29 3b 0a 0a 20  >eStage : 0);.. 
1e290 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 65 6e   assert( p->open
1e2a0 46 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f  Flags & (SQLITE_
1e2b0 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 7c 53 51 4c  OPEN_MAIN_DB|SQL
1e2c0 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42  ITE_OPEN_TEMP_DB
1e2d0 29 20 29 3b 0a 20 20 69 66 28 20 65 53 74 61 67  ) );.  if( eStag
1e2e0 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c  e==RBU_STAGE_OAL
1e2f0 20 7c 7c 20 65 53 74 61 67 65 3d 3d 52 42 55 5f   || eStage==RBU_
1e300 53 54 41 47 45 5f 4d 4f 56 45 20 29 7b 0a 20 20  STAGE_MOVE ){.  
1e310 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20    /* no-op */.  
1e320 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 52 65  }else{.    /* Re
1e330 6c 65 61 73 65 20 74 68 65 20 63 68 65 63 6b 70  lease the checkp
1e340 6f 69 6e 74 65 72 20 61 6e 64 20 77 72 69 74 65  ointer and write
1e350 72 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 72  r locks */.    r
1e360 62 75 55 6e 6c 6f 63 6b 53 68 6d 28 70 29 3b 0a  buUnlockShm(p);.
1e370 20 20 20 20 72 63 20 3d 20 70 2d 3e 70 52 65 61      rc = p->pRea
1e380 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53 68  l->pMethods->xSh
1e390 6d 55 6e 6d 61 70 28 70 2d 3e 70 52 65 61 6c 2c  mUnmap(p->pReal,
1e3a0 20 64 65 6c 46 6c 61 67 29 3b 0a 20 20 7d 0a 20   delFlag);.  }. 
1e3b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1e3c0 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 61 74 20  *.** Given that 
1e3d0 7a 57 61 6c 20 70 6f 69 6e 74 73 20 74 6f 20 61  zWal points to a
1e3e0 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
1e3f0 6e 67 20 61 20 77 61 6c 20 66 69 6c 65 20 6e 61  ng a wal file na
1e400 6d 65 20 70 61 73 73 65 64 20 74 6f 20 0a 2a 2a  me passed to .**
1e410 20 65 69 74 68 65 72 20 74 68 65 20 78 4f 70 65   either the xOpe
1e420 6e 28 29 20 6f 72 20 78 41 63 63 65 73 73 28 29  n() or xAccess()
1e430 20 56 46 53 20 6d 65 74 68 6f 64 2c 20 72 65 74   VFS method, ret
1e440 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
1e450 20 74 68 65 0a 2a 2a 20 66 69 6c 65 2d 68 61 6e   the.** file-han
1e460 64 6c 65 20 6f 70 65 6e 65 64 20 62 79 20 74 68  dle opened by th
1e470 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20  e same database 
1e480 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 6e 20 74 68  connection on th
1e490 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a  e corresponding.
1e4a0 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
1e4b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 72 62 75 5f  ..*/.static rbu_
1e4c0 66 69 6c 65 20 2a 72 62 75 46 69 6e 64 4d 61 69  file *rbuFindMai
1e4d0 6e 64 62 28 72 62 75 5f 76 66 73 20 2a 70 52 62  ndb(rbu_vfs *pRb
1e4e0 75 56 66 73 2c 20 63 6f 6e 73 74 20 63 68 61 72  uVfs, const char
1e4f0 20 2a 7a 57 61 6c 29 7b 0a 20 20 72 62 75 5f 66   *zWal){.  rbu_f
1e500 69 6c 65 20 2a 70 44 62 3b 0a 20 20 73 71 6c 69  ile *pDb;.  sqli
1e510 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
1e520 70 52 62 75 56 66 73 2d 3e 6d 75 74 65 78 29 3b  pRbuVfs->mutex);
1e530 0a 20 20 66 6f 72 28 70 44 62 3d 70 52 62 75 56  .  for(pDb=pRbuV
1e540 66 73 2d 3e 70 4d 61 69 6e 3b 20 70 44 62 20 26  fs->pMain; pDb &
1e550 26 20 70 44 62 2d 3e 7a 57 61 6c 21 3d 7a 57 61  & pDb->zWal!=zWa
1e560 6c 3b 20 70 44 62 3d 70 44 62 2d 3e 70 4d 61 69  l; pDb=pDb->pMai
1e570 6e 4e 65 78 74 29 7b 7d 0a 20 20 73 71 6c 69 74  nNext){}.  sqlit
1e580 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
1e590 52 62 75 56 66 73 2d 3e 6d 75 74 65 78 29 3b 0a  RbuVfs->mutex);.
1e5a0 20 20 72 65 74 75 72 6e 20 70 44 62 3b 0a 7d 0a    return pDb;.}.
1e5b0 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 6e 20 72  ./*.** Open an r
1e5c0 62 75 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a  bu file handle..
1e5d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62  */.static int rb
1e5e0 75 56 66 73 4f 70 65 6e 28 0a 20 20 73 71 6c 69  uVfsOpen(.  sqli
1e5f0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 0a 20  te3_vfs *pVfs,. 
1e600 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
1e610 6d 65 2c 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  me,.  sqlite3_fi
1e620 6c 65 20 2a 70 46 69 6c 65 2c 0a 20 20 69 6e 74  le *pFile,.  int
1e630 20 66 6c 61 67 73 2c 0a 20 20 69 6e 74 20 2a 70   flags,.  int *p
1e640 4f 75 74 46 6c 61 67 73 0a 29 7b 0a 20 20 73 74  OutFlags.){.  st
1e650 61 74 69 63 20 73 71 6c 69 74 65 33 5f 69 6f 5f  atic sqlite3_io_
1e660 6d 65 74 68 6f 64 73 20 72 62 75 76 66 73 5f 69  methods rbuvfs_i
1e670 6f 5f 6d 65 74 68 6f 64 73 20 3d 20 7b 0a 20 20  o_methods = {.  
1e680 20 20 32 2c 20 20 20 20 20 20 20 20 20 20 20 20    2,            
1e690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e6a0 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20  /* iVersion */. 
1e6b0 20 20 20 72 62 75 56 66 73 43 6c 6f 73 65 2c 20     rbuVfsClose, 
1e6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e6d0 20 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f 0a 20 20   /* xClose */.  
1e6e0 20 20 72 62 75 56 66 73 52 65 61 64 2c 20 20 20    rbuVfsRead,   
1e6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e700 2f 2a 20 78 52 65 61 64 20 2a 2f 0a 20 20 20 20  /* xRead */.    
1e710 72 62 75 56 66 73 57 72 69 74 65 2c 20 20 20 20  rbuVfsWrite,    
1e720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e730 20 78 57 72 69 74 65 20 2a 2f 0a 20 20 20 20 72   xWrite */.    r
1e740 62 75 56 66 73 54 72 75 6e 63 61 74 65 2c 20 20  buVfsTruncate,  
1e750 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e760 78 54 72 75 6e 63 61 74 65 20 2a 2f 0a 20 20 20  xTruncate */.   
1e770 20 72 62 75 56 66 73 53 79 6e 63 2c 20 20 20 20   rbuVfsSync,    
1e780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e790 2a 20 78 53 79 6e 63 20 2a 2f 0a 20 20 20 20 72  * xSync */.    r
1e7a0 62 75 56 66 73 46 69 6c 65 53 69 7a 65 2c 20 20  buVfsFileSize,  
1e7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e7c0 78 46 69 6c 65 53 69 7a 65 20 2a 2f 0a 20 20 20  xFileSize */.   
1e7d0 20 72 62 75 56 66 73 4c 6f 63 6b 2c 20 20 20 20   rbuVfsLock,    
1e7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e7f0 2a 20 78 4c 6f 63 6b 20 2a 2f 0a 20 20 20 20 72  * xLock */.    r
1e800 62 75 56 66 73 55 6e 6c 6f 63 6b 2c 20 20 20 20  buVfsUnlock,    
1e810 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e820 78 55 6e 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 72  xUnlock */.    r
1e830 62 75 56 66 73 43 68 65 63 6b 52 65 73 65 72 76  buVfsCheckReserv
1e840 65 64 4c 6f 63 6b 2c 20 20 20 20 20 20 2f 2a 20  edLock,      /* 
1e850 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
1e860 63 6b 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73  ck */.    rbuVfs
1e870 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20 20 20 20  FileControl,    
1e880 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65          /* xFile
1e890 43 6f 6e 74 72 6f 6c 20 2a 2f 0a 20 20 20 20 72  Control */.    r
1e8a0 62 75 56 66 73 53 65 63 74 6f 72 53 69 7a 65 2c  buVfsSectorSize,
1e8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e8c0 78 53 65 63 74 6f 72 53 69 7a 65 20 2a 2f 0a 20  xSectorSize */. 
1e8d0 20 20 20 72 62 75 56 66 73 44 65 76 69 63 65 43     rbuVfsDeviceC
1e8e0 68 61 72 61 63 74 65 72 69 73 74 69 63 73 2c 20  haracteristics, 
1e8f0 20 2f 2a 20 78 44 65 76 69 63 65 43 68 61 72 61   /* xDeviceChara
1e900 63 74 65 72 69 73 74 69 63 73 20 2a 2f 0a 20 20  cteristics */.  
1e910 20 20 72 62 75 56 66 73 53 68 6d 4d 61 70 2c 20    rbuVfsShmMap, 
1e920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e930 2f 2a 20 78 53 68 6d 4d 61 70 20 2a 2f 0a 20 20  /* xShmMap */.  
1e940 20 20 72 62 75 56 66 73 53 68 6d 4c 6f 63 6b 2c    rbuVfsShmLock,
1e950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e960 2f 2a 20 78 53 68 6d 4c 6f 63 6b 20 2a 2f 0a 20  /* xShmLock */. 
1e970 20 20 20 72 62 75 56 66 73 53 68 6d 42 61 72 72     rbuVfsShmBarr
1e980 69 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ier,            
1e990 20 2f 2a 20 78 53 68 6d 42 61 72 72 69 65 72 20   /* xShmBarrier 
1e9a0 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 53 68 6d  */.    rbuVfsShm
1e9b0 55 6e 6d 61 70 2c 20 20 20 20 20 20 20 20 20 20  Unmap,          
1e9c0 20 20 20 20 20 2f 2a 20 78 53 68 6d 55 6e 6d 61       /* xShmUnma
1e9d0 70 20 2a 2f 0a 20 20 20 20 30 2c 20 30 20 20 20  p */.    0, 0   
1e9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e9f0 20 20 20 20 20 20 20 2f 2a 20 78 46 65 74 63 68         /* xFetch
1ea00 2c 20 78 55 6e 66 65 74 63 68 20 2a 2f 0a 20 20  , xUnfetch */.  
1ea10 7d 3b 0a 20 20 72 62 75 5f 76 66 73 20 2a 70 52  };.  rbu_vfs *pR
1ea20 62 75 56 66 73 20 3d 20 28 72 62 75 5f 76 66 73  buVfs = (rbu_vfs
1ea30 2a 29 70 56 66 73 3b 0a 20 20 73 71 6c 69 74 65  *)pVfs;.  sqlite
1ea40 33 5f 76 66 73 20 2a 70 52 65 61 6c 56 66 73 20  3_vfs *pRealVfs 
1ea50 3d 20 70 52 62 75 56 66 73 2d 3e 70 52 65 61 6c  = pRbuVfs->pReal
1ea60 56 66 73 3b 0a 20 20 72 62 75 5f 66 69 6c 65 20  Vfs;.  rbu_file 
1ea70 2a 70 46 64 20 3d 20 28 72 62 75 5f 66 69 6c 65  *pFd = (rbu_file
1ea80 20 2a 29 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20   *)pFile;.  int 
1ea90 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1eaa0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f    const char *zO
1eab0 70 65 6e 20 3d 20 7a 4e 61 6d 65 3b 0a 0a 20 20  pen = zName;..  
1eac0 6d 65 6d 73 65 74 28 70 46 64 2c 20 30 2c 20 73  memset(pFd, 0, s
1ead0 69 7a 65 6f 66 28 72 62 75 5f 66 69 6c 65 29 29  izeof(rbu_file))
1eae0 3b 0a 20 20 70 46 64 2d 3e 70 52 65 61 6c 20 3d  ;.  pFd->pReal =
1eaf0 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29   (sqlite3_file*)
1eb00 26 70 46 64 5b 31 5d 3b 0a 20 20 70 46 64 2d 3e  &pFd[1];.  pFd->
1eb10 70 52 62 75 56 66 73 20 3d 20 70 52 62 75 56 66  pRbuVfs = pRbuVf
1eb20 73 3b 0a 20 20 70 46 64 2d 3e 6f 70 65 6e 46 6c  s;.  pFd->openFl
1eb30 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 69  ags = flags;.  i
1eb40 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  f( zName ){.    
1eb50 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49  if( flags & SQLI
1eb60 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20  TE_OPEN_MAIN_DB 
1eb70 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 6d 61  ){.      /* A ma
1eb80 69 6e 20 64 61 74 61 62 61 73 65 20 68 61 73 20  in database has 
1eb90 6a 75 73 74 20 62 65 65 6e 20 6f 70 65 6e 65 64  just been opened
1eba0 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  . The following 
1ebb0 62 6c 6f 63 6b 20 73 65 74 73 0a 20 20 20 20 20  block sets.     
1ebc0 20 2a 2a 20 28 70 46 64 2d 3e 7a 57 61 6c 29 20   ** (pFd->zWal) 
1ebd0 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75  to point to a bu
1ebe0 66 66 65 72 20 6f 77 6e 65 64 20 62 79 20 53 51  ffer owned by SQ
1ebf0 4c 69 74 65 20 74 68 61 74 20 63 6f 6e 74 61 69  Lite that contai
1ec00 6e 73 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  ns.      ** the 
1ec10 6e 61 6d 65 20 6f 66 20 74 68 65 20 2a 2d 77 61  name of the *-wa
1ec20 6c 20 66 69 6c 65 20 74 68 69 73 20 64 62 20 63  l file this db c
1ec30 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 6c 6c 20 75  onnection will u
1ec40 73 65 2e 20 53 51 4c 69 74 65 0a 20 20 20 20 20  se. SQLite.     
1ec50 20 2a 2a 20 68 61 70 70 65 6e 73 20 74 6f 20 70   ** happens to p
1ec60 61 73 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ass a pointer to
1ec70 20 74 68 69 73 20 62 75 66 66 65 72 20 77 68 65   this buffer whe
1ec80 6e 20 75 73 69 6e 67 20 78 41 63 63 65 73 73 28  n using xAccess(
1ec90 29 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 78 4f  ).      ** or xO
1eca0 70 65 6e 28 29 20 74 6f 20 6f 70 65 72 61 74 65  pen() to operate
1ecb0 20 6f 6e 20 74 68 65 20 2a 2d 77 61 6c 20 66 69   on the *-wal fi
1ecc0 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e  le.  */.      in
1ecd0 74 20 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65  t n = (int)strle
1ece0 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  n(zName);.      
1ecf0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
1ed00 26 7a 4e 61 6d 65 5b 6e 5d 3b 0a 20 20 20 20 20  &zName[n];.     
1ed10 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c   if( flags & SQL
1ed20 49 54 45 5f 4f 50 45 4e 5f 55 52 49 20 29 7b 0a  ITE_OPEN_URI ){.
1ed30 20 20 20 20 20 20 20 20 69 6e 74 20 6f 64 64 20          int odd 
1ed40 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 77 68 69  = 0;.        whi
1ed50 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 20 20 20  le( 1 ){.       
1ed60 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 30 20 29     if( z[0]==0 )
1ed70 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 64  {.            od
1ed80 64 20 3d 20 31 20 2d 20 6f 64 64 3b 0a 20 20 20  d = 1 - odd;.   
1ed90 20 20 20 20 20 20 20 20 20 69 66 28 20 6f 64 64           if( odd
1eda0 20 26 26 20 7a 5b 31 5d 3d 3d 30 20 29 20 62 72   && z[1]==0 ) br
1edb0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
1edc0 0a 20 20 20 20 20 20 20 20 20 20 7a 2b 2b 3b 0a  .          z++;.
1edd0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1ede0 20 20 7a 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20    z += 2;.      
1edf0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 77  }else{.        w
1ee00 68 69 6c 65 28 20 2a 7a 3d 3d 30 20 29 20 7a 2b  hile( *z==0 ) z+
1ee10 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  +;.      }.     
1ee20 20 7a 20 2b 3d 20 28 6e 20 2b 20 38 20 2b 20 31   z += (n + 8 + 1
1ee30 29 3b 0a 20 20 20 20 20 20 70 46 64 2d 3e 7a 57  );.      pFd->zW
1ee40 61 6c 20 3d 20 7a 3b 0a 20 20 20 20 7d 0a 20 20  al = z;.    }.  
1ee50 20 20 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73    else if( flags
1ee60 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57   & SQLITE_OPEN_W
1ee70 41 4c 20 29 7b 0a 20 20 20 20 20 20 72 62 75 5f  AL ){.      rbu_
1ee80 66 69 6c 65 20 2a 70 44 62 20 3d 20 72 62 75 46  file *pDb = rbuF
1ee90 69 6e 64 4d 61 69 6e 64 62 28 70 52 62 75 56 66  indMaindb(pRbuVf
1eea0 73 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  s, zName);.     
1eeb0 20 69 66 28 20 70 44 62 20 29 7b 0a 20 20 20 20   if( pDb ){.    
1eec0 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 52 62      if( pDb->pRb
1eed0 75 20 26 26 20 70 44 62 2d 3e 70 52 62 75 2d 3e  u && pDb->pRbu->
1eee0 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47  eStage==RBU_STAG
1eef0 45 5f 4f 41 4c 20 29 7b 0a 20 20 20 20 20 20 20  E_OAL ){.       
1ef00 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20     /* This call 
1ef10 69 73 20 74 6f 20 6f 70 65 6e 20 61 20 2a 2d 77  is to open a *-w
1ef20 61 6c 20 66 69 6c 65 2e 20 49 6e 74 65 61 64 2c  al file. Intead,
1ef30 20 6f 70 65 6e 20 74 68 65 20 2a 2d 6f 61 6c 2e   open the *-oal.
1ef40 20 54 68 69 73 0a 20 20 20 20 20 20 20 20 20 20   This.          
1ef50 2a 2a 20 63 6f 64 65 20 65 6e 73 75 72 65 73 20  ** code ensures 
1ef60 74 68 61 74 20 74 68 65 20 73 74 72 69 6e 67 20  that the string 
1ef70 70 61 73 73 65 64 20 74 6f 20 78 4f 70 65 6e 28  passed to xOpen(
1ef80 29 20 69 73 20 74 65 72 6d 69 6e 61 74 65 64 20  ) is terminated 
1ef90 62 79 20 61 0a 20 20 20 20 20 20 20 20 20 20 2a  by a.          *
1efa0 2a 20 70 61 69 72 20 6f 66 20 27 5c 30 27 20 62  * pair of '\0' b
1efb0 79 74 65 73 20 69 6e 20 63 61 73 65 20 74 68 65  ytes in case the
1efc0 20 56 46 53 20 61 74 74 65 6d 70 74 73 20 74 6f   VFS attempts to
1efd0 20 65 78 74 72 61 63 74 20 61 20 55 52 49 20 0a   extract a URI .
1efe0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61 72            ** par
1eff0 61 6d 65 74 65 72 20 66 72 6f 6d 20 69 74 2e 20  ameter from it. 
1f000 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 69   */.          si
1f010 7a 65 5f 74 20 6e 43 6f 70 79 20 3d 20 73 74 72  ze_t nCopy = str
1f020 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  len(zName);.    
1f030 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 70        char *zCop
1f040 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  y = sqlite3_mall
1f050 6f 63 36 34 28 6e 43 6f 70 79 2b 32 29 3b 0a 20  oc64(nCopy+2);. 
1f060 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 43 6f           if( zCo
1f070 70 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  py ){.          
1f080 20 20 6d 65 6d 63 70 79 28 7a 43 6f 70 79 2c 20    memcpy(zCopy, 
1f090 7a 4e 61 6d 65 2c 20 6e 43 6f 70 79 29 3b 0a 20  zName, nCopy);. 
1f0a0 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f 70 79             zCopy
1f0b0 5b 6e 43 6f 70 79 2d 33 5d 20 3d 20 27 6f 27 3b  [nCopy-3] = 'o';
1f0c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f  .            zCo
1f0d0 70 79 5b 6e 43 6f 70 79 5d 20 3d 20 27 5c 30 27  py[nCopy] = '\0'
1f0e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 43  ;.            zC
1f0f0 6f 70 79 5b 6e 43 6f 70 79 2b 31 5d 20 3d 20 27  opy[nCopy+1] = '
1f100 5c 30 27 3b 0a 20 20 20 20 20 20 20 20 20 20 20  \0';.           
1f110 20 7a 4f 70 65 6e 20 3d 20 28 63 6f 6e 73 74 20   zOpen = (const 
1f120 63 68 61 72 2a 29 28 70 46 64 2d 3e 7a 44 65 6c  char*)(pFd->zDel
1f130 20 3d 20 7a 43 6f 70 79 29 3b 0a 20 20 20 20 20   = zCopy);.     
1f140 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1f150 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1f160 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
1f170 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1f180 20 70 46 64 2d 3e 70 52 62 75 20 3d 20 70 44 62   pFd->pRbu = pDb
1f190 2d 3e 70 52 62 75 3b 0a 20 20 20 20 20 20 20 20  ->pRbu;.        
1f1a0 7d 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 70  }.        pDb->p
1f1b0 57 61 6c 46 64 20 3d 20 70 46 64 3b 0a 20 20 20  WalFd = pFd;.   
1f1c0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
1f1d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1f1e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
1f1f0 70 52 65 61 6c 56 66 73 2d 3e 78 4f 70 65 6e 28  pRealVfs->xOpen(
1f200 70 52 65 61 6c 56 66 73 2c 20 7a 4f 70 65 6e 2c  pRealVfs, zOpen,
1f210 20 70 46 64 2d 3e 70 52 65 61 6c 2c 20 66 6c 61   pFd->pReal, fla
1f220 67 73 2c 20 70 4f 75 74 46 6c 61 67 73 29 3b 0a  gs, pOutFlags);.
1f230 20 20 7d 0a 20 20 69 66 28 20 70 46 64 2d 3e 70    }.  if( pFd->p
1f240 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 20 29  Real->pMethods )
1f250 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 78 4f 70  {.    /* The xOp
1f260 65 6e 28 29 20 6f 70 65 72 61 74 69 6f 6e 20 68  en() operation h
1f270 61 73 20 73 75 63 63 65 65 64 65 64 2e 20 53 65  as succeeded. Se
1f280 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69  t the sqlite3_fi
1f290 6c 65 2e 70 4d 65 74 68 6f 64 73 0a 20 20 20 20  le.pMethods.    
1f2a0 2a 2a 20 70 6f 69 6e 74 65 72 20 61 6e 64 2c 20  ** pointer and, 
1f2b0 69 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 61  if the file is a
1f2c0 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66   main database f
1f2d0 69 6c 65 2c 20 6c 69 6e 6b 20 69 74 20 69 6e 74  ile, link it int
1f2e0 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 6d 75 74  o the.    ** mut
1f2f0 65 78 20 70 72 6f 74 65 63 74 65 64 20 6c 69 6e  ex protected lin
1f300 6b 65 64 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  ked list of all 
1f310 73 75 63 68 20 66 69 6c 65 73 2e 20 20 2a 2f 0a  such files.  */.
1f320 20 20 20 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68      pFile->pMeth
1f330 6f 64 73 20 3d 20 26 72 62 75 76 66 73 5f 69 6f  ods = &rbuvfs_io
1f340 5f 6d 65 74 68 6f 64 73 3b 0a 20 20 20 20 69 66  _methods;.    if
1f350 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ( flags & SQLITE
1f360 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 7b  _OPEN_MAIN_DB ){
1f370 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
1f380 75 74 65 78 5f 65 6e 74 65 72 28 70 52 62 75 56  utex_enter(pRbuV
1f390 66 73 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20  fs->mutex);.    
1f3a0 20 20 70 46 64 2d 3e 70 4d 61 69 6e 4e 65 78 74    pFd->pMainNext
1f3b0 20 3d 20 70 52 62 75 56 66 73 2d 3e 70 4d 61 69   = pRbuVfs->pMai
1f3c0 6e 3b 0a 20 20 20 20 20 20 70 52 62 75 56 66 73  n;.      pRbuVfs
1f3d0 2d 3e 70 4d 61 69 6e 20 3d 20 70 46 64 3b 0a 20  ->pMain = pFd;. 
1f3e0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
1f3f0 65 78 5f 6c 65 61 76 65 28 70 52 62 75 56 66 73  ex_leave(pRbuVfs
1f400 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a  ->mutex);.    }.
1f410 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
1f420 69 74 65 33 5f 66 72 65 65 28 70 46 64 2d 3e 7a  ite3_free(pFd->z
1f430 44 65 6c 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  Del);.  }..  ret
1f440 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1f450 20 44 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65   Delete the file
1f460 20 6c 6f 63 61 74 65 64 20 61 74 20 7a 50 61 74   located at zPat
1f470 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  h..*/.static int
1f480 20 72 62 75 56 66 73 44 65 6c 65 74 65 28 73 71   rbuVfsDelete(sq
1f490 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
1f4a0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
1f4b0 74 68 2c 20 69 6e 74 20 64 69 72 53 79 6e 63 29  th, int dirSync)
1f4c0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  {.  sqlite3_vfs 
1f4d0 2a 70 52 65 61 6c 56 66 73 20 3d 20 28 28 72 62  *pRealVfs = ((rb
1f4e0 75 5f 76 66 73 2a 29 70 56 66 73 29 2d 3e 70 52  u_vfs*)pVfs)->pR
1f4f0 65 61 6c 56 66 73 3b 0a 20 20 72 65 74 75 72 6e  ealVfs;.  return
1f500 20 70 52 65 61 6c 56 66 73 2d 3e 78 44 65 6c 65   pRealVfs->xDele
1f510 74 65 28 70 52 65 61 6c 56 66 73 2c 20 7a 50 61  te(pRealVfs, zPa
1f520 74 68 2c 20 64 69 72 53 79 6e 63 29 3b 0a 7d 0a  th, dirSync);.}.
1f530 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 66 6f 72 20  ./*.** Test for 
1f540 61 63 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f  access permissio
1f550 6e 73 2e 20 52 65 74 75 72 6e 20 74 72 75 65 20  ns. Return true 
1f560 69 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  if the requested
1f570 20 70 65 72 6d 69 73 73 69 6f 6e 0a 2a 2a 20 69   permission.** i
1f580 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72 20  s available, or 
1f590 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e  false otherwise.
1f5a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
1f5b0 62 75 56 66 73 41 63 63 65 73 73 28 0a 20 20 73  buVfsAccess(.  s
1f5c0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
1f5d0 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  , .  const char 
1f5e0 2a 7a 50 61 74 68 2c 20 0a 20 20 69 6e 74 20 66  *zPath, .  int f
1f5f0 6c 61 67 73 2c 20 0a 20 20 69 6e 74 20 2a 70 52  lags, .  int *pR
1f600 65 73 4f 75 74 0a 29 7b 0a 20 20 72 62 75 5f 76  esOut.){.  rbu_v
1f610 66 73 20 2a 70 52 62 75 56 66 73 20 3d 20 28 72  fs *pRbuVfs = (r
1f620 62 75 5f 76 66 73 2a 29 70 56 66 73 3b 0a 20 20  bu_vfs*)pVfs;.  
1f630 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 52 65  sqlite3_vfs *pRe
1f640 61 6c 56 66 73 20 3d 20 70 52 62 75 56 66 73 2d  alVfs = pRbuVfs-
1f650 3e 70 52 65 61 6c 56 66 73 3b 0a 20 20 69 6e 74  >pRealVfs;.  int
1f660 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 70 52 65   rc;..  rc = pRe
1f670 61 6c 56 66 73 2d 3e 78 41 63 63 65 73 73 28 70  alVfs->xAccess(p
1f680 52 65 61 6c 56 66 73 2c 20 7a 50 61 74 68 2c 20  RealVfs, zPath, 
1f690 66 6c 61 67 73 2c 20 70 52 65 73 4f 75 74 29 3b  flags, pResOut);
1f6a0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 63  ..  /* If this c
1f6b0 61 6c 6c 20 69 73 20 74 6f 20 63 68 65 63 6b 20  all is to check 
1f6c0 69 66 20 61 20 2a 2d 77 61 6c 20 66 69 6c 65 20  if a *-wal file 
1f6d0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1f6e0 61 6e 20 52 42 55 20 74 61 72 67 65 74 0a 20 20  an RBU target.  
1f6f0 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  ** database conn
1f700 65 63 74 69 6f 6e 20 65 78 69 73 74 73 2c 20 61  ection exists, a
1f710 6e 64 20 74 68 65 20 52 42 55 20 75 70 64 61 74  nd the RBU updat
1f720 65 20 69 73 20 69 6e 20 52 42 55 5f 53 54 41 47  e is in RBU_STAG
1f730 45 5f 4f 41 4c 2c 0a 20 20 2a 2a 20 74 68 65 20  E_OAL,.  ** the 
1f740 66 6f 6c 6c 6f 77 69 6e 67 20 73 70 65 63 69 61  following specia
1f750 6c 20 68 61 6e 64 6c 69 6e 67 20 69 73 20 61 63  l handling is ac
1f760 74 69 76 61 74 65 64 3a 0a 20 20 2a 2a 0a 20 20  tivated:.  **.  
1f770 2a 2a 20 20 20 61 29 20 69 66 20 74 68 65 20 2a  **   a) if the *
1f780 2d 77 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 65  -wal file does e
1f790 78 69 73 74 2c 20 72 65 74 75 72 6e 20 53 51 4c  xist, return SQL
1f7a0 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2e 20 54 68  ITE_CANTOPEN. Th
1f7b0 69 73 0a 20 20 2a 2a 20 20 20 20 20 20 65 6e 73  is.  **      ens
1f7c0 75 72 65 73 20 74 68 61 74 20 74 68 65 20 52 42  ures that the RB
1f7d0 55 20 65 78 74 65 6e 73 69 6f 6e 20 6e 65 76 65  U extension neve
1f7e0 72 20 74 72 69 65 73 20 74 6f 20 75 70 64 61 74  r tries to updat
1f7f0 65 20 61 20 64 61 74 61 62 61 73 65 0a 20 20 2a  e a database.  *
1f800 2a 20 20 20 20 20 20 69 6e 20 77 61 6c 20 6d 6f  *      in wal mo
1f810 64 65 2c 20 65 76 65 6e 20 69 66 20 74 68 65 20  de, even if the 
1f820 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  first page of th
1f830 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1f840 68 61 73 0a 20 20 2a 2a 20 20 20 20 20 20 62 65  has.  **      be
1f850 65 6e 20 64 61 6d 61 67 65 64 2e 20 0a 20 20 2a  en damaged. .  *
1f860 2a 0a 20 20 2a 2a 20 20 20 62 29 20 69 66 20 74  *.  **   b) if t
1f870 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 64 6f  he *-wal file do
1f880 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 63 6c  es not exist, cl
1f890 61 69 6d 20 74 68 61 74 20 69 74 20 64 6f 65 73  aim that it does
1f8a0 20 61 6e 79 77 61 79 2c 0a 20 20 2a 2a 20 20 20   anyway,.  **   
1f8b0 20 20 20 63 61 75 73 69 6e 67 20 53 51 4c 69 74     causing SQLit
1f8c0 65 20 74 6f 20 63 61 6c 6c 20 78 4f 70 65 6e 28  e to call xOpen(
1f8d0 29 20 74 6f 20 6f 70 65 6e 20 69 74 2e 20 54 68  ) to open it. Th
1f8e0 69 73 20 63 61 6c 6c 20 77 69 6c 6c 20 61 6c 73  is call will als
1f8f0 6f 0a 20 20 2a 2a 20 20 20 20 20 20 62 65 20 69  o.  **      be i
1f900 6e 74 65 72 63 65 70 74 65 64 20 28 73 65 65 20  ntercepted (see 
1f910 74 68 65 20 72 62 75 56 66 73 4f 70 65 6e 28 29  the rbuVfsOpen()
1f920 20 66 75 6e 63 74 69 6f 6e 29 20 61 6e 64 20 74   function) and t
1f930 68 65 20 2a 2d 6f 61 6c 0a 20 20 2a 2a 20 20 20  he *-oal.  **   
1f940 20 20 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 69     file opened i
1f950 6e 73 74 65 61 64 2e 0a 20 20 2a 2f 0a 20 20 69  nstead..  */.  i
1f960 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1f970 20 26 26 20 66 6c 61 67 73 3d 3d 53 51 4c 49 54   && flags==SQLIT
1f980 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 20  E_ACCESS_EXISTS 
1f990 29 7b 0a 20 20 20 20 72 62 75 5f 66 69 6c 65 20  ){.    rbu_file 
1f9a0 2a 70 44 62 20 3d 20 72 62 75 46 69 6e 64 4d 61  *pDb = rbuFindMa
1f9b0 69 6e 64 62 28 70 52 62 75 56 66 73 2c 20 7a 50  indb(pRbuVfs, zP
1f9c0 61 74 68 29 3b 0a 20 20 20 20 69 66 28 20 70 44  ath);.    if( pD
1f9d0 62 20 26 26 20 70 44 62 2d 3e 70 52 62 75 20 26  b && pDb->pRbu &
1f9e0 26 20 70 44 62 2d 3e 70 52 62 75 2d 3e 65 53 74  & pDb->pRbu->eSt
1f9f0 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4f  age==RBU_STAGE_O
1fa00 41 4c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  AL ){.      if( 
1fa10 2a 70 52 65 73 4f 75 74 20 29 7b 0a 20 20 20 20  *pResOut ){.    
1fa20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1fa30 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 20 20 20  CANTOPEN;.      
1fa40 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2a  }else{.        *
1fa50 70 52 65 73 4f 75 74 20 3d 20 31 3b 0a 20 20 20  pResOut = 1;.   
1fa60 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
1fa70 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1fa80 2f 2a 0a 2a 2a 20 50 6f 70 75 6c 61 74 65 20 62  /*.** Populate b
1fa90 75 66 66 65 72 20 7a 4f 75 74 20 77 69 74 68 20  uffer zOut with 
1faa0 74 68 65 20 66 75 6c 6c 20 63 61 6e 6f 6e 69 63  the full canonic
1fab0 61 6c 20 70 61 74 68 6e 61 6d 65 20 63 6f 72 72  al pathname corr
1fac0 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20  esponding.** to 
1fad0 74 68 65 20 70 61 74 68 6e 61 6d 65 20 69 6e 20  the pathname in 
1fae0 7a 50 61 74 68 2e 20 7a 4f 75 74 20 69 73 20 67  zPath. zOut is g
1faf0 75 61 72 61 6e 74 65 65 64 20 74 6f 20 70 6f 69  uaranteed to poi
1fb00 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 0a 2a  nt to a buffer.*
1fb10 2a 20 6f 66 20 61 74 20 6c 65 61 73 74 20 28 44  * of at least (D
1fb20 45 56 53 59 4d 5f 4d 41 58 5f 50 41 54 48 4e 41  EVSYM_MAX_PATHNA
1fb30 4d 45 2b 31 29 20 62 79 74 65 73 2e 0a 2a 2f 0a  ME+1) bytes..*/.
1fb40 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 56 66  static int rbuVf
1fb50 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 0a 20  sFullPathname(. 
1fb60 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
1fb70 66 73 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61  fs, .  const cha
1fb80 72 20 2a 7a 50 61 74 68 2c 20 0a 20 20 69 6e 74  r *zPath, .  int
1fb90 20 6e 4f 75 74 2c 20 0a 20 20 63 68 61 72 20 2a   nOut, .  char *
1fba0 7a 4f 75 74 0a 29 7b 0a 20 20 73 71 6c 69 74 65  zOut.){.  sqlite
1fbb0 33 5f 76 66 73 20 2a 70 52 65 61 6c 56 66 73 20  3_vfs *pRealVfs 
1fbc0 3d 20 28 28 72 62 75 5f 76 66 73 2a 29 70 56 66  = ((rbu_vfs*)pVf
1fbd0 73 29 2d 3e 70 52 65 61 6c 56 66 73 3b 0a 20 20  s)->pRealVfs;.  
1fbe0 72 65 74 75 72 6e 20 70 52 65 61 6c 56 66 73 2d  return pRealVfs-
1fbf0 3e 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70  >xFullPathname(p
1fc00 52 65 61 6c 56 66 73 2c 20 7a 50 61 74 68 2c 20  RealVfs, zPath, 
1fc10 6e 4f 75 74 2c 20 7a 4f 75 74 29 3b 0a 7d 0a 0a  nOut, zOut);.}..
1fc20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1fc30 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49  MIT_LOAD_EXTENSI
1fc40 4f 4e 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68  ON./*.** Open th
1fc50 65 20 64 79 6e 61 6d 69 63 20 6c 69 62 72 61 72  e dynamic librar
1fc60 79 20 6c 6f 63 61 74 65 64 20 61 74 20 7a 50 61  y located at zPa
1fc70 74 68 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  th and return a 
1fc80 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  handle..*/.stati
1fc90 63 20 76 6f 69 64 20 2a 72 62 75 56 66 73 44 6c  c void *rbuVfsDl
1fca0 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73  Open(sqlite3_vfs
1fcb0 20 2a 70 56 66 73 2c 20 63 6f 6e 73 74 20 63 68   *pVfs, const ch
1fcc0 61 72 20 2a 7a 50 61 74 68 29 7b 0a 20 20 73 71  ar *zPath){.  sq
1fcd0 6c 69 74 65 33 5f 76 66 73 20 2a 70 52 65 61 6c  lite3_vfs *pReal
1fce0 56 66 73 20 3d 20 28 28 72 62 75 5f 76 66 73 2a  Vfs = ((rbu_vfs*
1fcf0 29 70 56 66 73 29 2d 3e 70 52 65 61 6c 56 66 73  )pVfs)->pRealVfs
1fd00 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65 61 6c  ;.  return pReal
1fd10 56 66 73 2d 3e 78 44 6c 4f 70 65 6e 28 70 52 65  Vfs->xDlOpen(pRe
1fd20 61 6c 56 66 73 2c 20 7a 50 61 74 68 29 3b 0a 7d  alVfs, zPath);.}
1fd30 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 75 6c 61 74 65  ../*.** Populate
1fd40 20 74 68 65 20 62 75 66 66 65 72 20 7a 45 72 72   the buffer zErr
1fd50 4d 73 67 20 28 73 69 7a 65 20 6e 42 79 74 65 20  Msg (size nByte 
1fd60 62 79 74 65 73 29 20 77 69 74 68 20 61 20 68 75  bytes) with a hu
1fd70 6d 61 6e 20 72 65 61 64 61 62 6c 65 0a 2a 2a 20  man readable.** 
1fd80 75 74 66 2d 38 20 73 74 72 69 6e 67 20 64 65 73  utf-8 string des
1fd90 63 72 69 62 69 6e 67 20 74 68 65 20 6d 6f 73 74  cribing the most
1fda0 20 72 65 63 65 6e 74 20 65 72 72 6f 72 20 65 6e   recent error en
1fdb0 63 6f 75 6e 74 65 72 65 64 20 61 73 73 6f 63 69  countered associ
1fdc0 61 74 65 64 20 0a 2a 2a 20 77 69 74 68 20 64 79  ated .** with dy
1fdd0 6e 61 6d 69 63 20 6c 69 62 72 61 72 69 65 73 2e  namic libraries.
1fde0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1fdf0 72 62 75 56 66 73 44 6c 45 72 72 6f 72 28 73 71  rbuVfsDlError(sq
1fe00 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
1fe10 20 69 6e 74 20 6e 42 79 74 65 2c 20 63 68 61 72   int nByte, char
1fe20 20 2a 7a 45 72 72 4d 73 67 29 7b 0a 20 20 73 71   *zErrMsg){.  sq
1fe30 6c 69 74 65 33 5f 76 66 73 20 2a 70 52 65 61 6c  lite3_vfs *pReal
1fe40 56 66 73 20 3d 20 28 28 72 62 75 5f 76 66 73 2a  Vfs = ((rbu_vfs*
1fe50 29 70 56 66 73 29 2d 3e 70 52 65 61 6c 56 66 73  )pVfs)->pRealVfs
1fe60 3b 0a 20 20 70 52 65 61 6c 56 66 73 2d 3e 78 44  ;.  pRealVfs->xD
1fe70 6c 45 72 72 6f 72 28 70 52 65 61 6c 56 66 73 2c  lError(pRealVfs,
1fe80 20 6e 42 79 74 65 2c 20 7a 45 72 72 4d 73 67 29   nByte, zErrMsg)
1fe90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1fea0 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
1feb0 68 65 20 73 79 6d 62 6f 6c 20 7a 53 79 6d 62 6f  he symbol zSymbo
1fec0 6c 20 69 6e 20 74 68 65 20 64 79 6e 61 6d 69 63  l in the dynamic
1fed0 20 6c 69 62 72 61 72 79 20 70 48 61 6e 64 6c 65   library pHandle
1fee0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1fef0 20 28 2a 72 62 75 56 66 73 44 6c 53 79 6d 28 0a   (*rbuVfsDlSym(.
1ff00 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
1ff10 56 66 73 2c 20 0a 20 20 76 6f 69 64 20 2a 70 41  Vfs, .  void *pA
1ff20 72 67 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61  rg, .  const cha
1ff30 72 20 2a 7a 53 79 6d 0a 29 29 28 76 6f 69 64 29  r *zSym.))(void)
1ff40 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  {.  sqlite3_vfs 
1ff50 2a 70 52 65 61 6c 56 66 73 20 3d 20 28 28 72 62  *pRealVfs = ((rb
1ff60 75 5f 76 66 73 2a 29 70 56 66 73 29 2d 3e 70 52  u_vfs*)pVfs)->pR
1ff70 65 61 6c 56 66 73 3b 0a 20 20 72 65 74 75 72 6e  ealVfs;.  return
1ff80 20 70 52 65 61 6c 56 66 73 2d 3e 78 44 6c 53 79   pRealVfs->xDlSy
1ff90 6d 28 70 52 65 61 6c 56 66 73 2c 20 70 41 72 67  m(pRealVfs, pArg
1ffa0 2c 20 7a 53 79 6d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  , zSym);.}../*.*
1ffb0 2a 20 43 6c 6f 73 65 20 74 68 65 20 64 79 6e 61  * Close the dyna
1ffc0 6d 69 63 20 6c 69 62 72 61 72 79 20 68 61 6e 64  mic library hand
1ffd0 6c 65 20 70 48 61 6e 64 6c 65 2e 0a 2a 2f 0a 73  le pHandle..*/.s
1ffe0 74 61 74 69 63 20 76 6f 69 64 20 72 62 75 56 66  tatic void rbuVf
1fff0 73 44 6c 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  sDlClose(sqlite3
20000 5f 76 66 73 20 2a 70 56 66 73 2c 20 76 6f 69 64  _vfs *pVfs, void
20010 20 2a 70 48 61 6e 64 6c 65 29 7b 0a 20 20 73 71   *pHandle){.  sq
20020 6c 69 74 65 33 5f 76 66 73 20 2a 70 52 65 61 6c  lite3_vfs *pReal
20030 56 66 73 20 3d 20 28 28 72 62 75 5f 76 66 73 2a  Vfs = ((rbu_vfs*
20040 29 70 56 66 73 29 2d 3e 70 52 65 61 6c 56 66 73  )pVfs)->pRealVfs
20050 3b 0a 20 20 70 52 65 61 6c 56 66 73 2d 3e 78 44  ;.  pRealVfs->xD
20060 6c 43 6c 6f 73 65 28 70 52 65 61 6c 56 66 73 2c  lClose(pRealVfs,
20070 20 70 48 61 6e 64 6c 65 29 3b 0a 7d 0a 23 65 6e   pHandle);.}.#en
20080 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
20090 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f  IT_LOAD_EXTENSIO
200a0 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 75  N */../*.** Popu
200b0 6c 61 74 65 20 74 68 65 20 62 75 66 66 65 72 20  late the buffer 
200c0 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 42  pointed to by zB
200d0 75 66 4f 75 74 20 77 69 74 68 20 6e 42 79 74 65  ufOut with nByte
200e0 20 62 79 74 65 73 20 6f 66 20 0a 2a 2a 20 72 61   bytes of .** ra
200f0 6e 64 6f 6d 20 64 61 74 61 2e 0a 2a 2f 0a 73 74  ndom data..*/.st
20100 61 74 69 63 20 69 6e 74 20 72 62 75 56 66 73 52  atic int rbuVfsR
20110 61 6e 64 6f 6d 6e 65 73 73 28 73 71 6c 69 74 65  andomness(sqlite
20120 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74  3_vfs *pVfs, int
20130 20 6e 42 79 74 65 2c 20 63 68 61 72 20 2a 7a 42   nByte, char *zB
20140 75 66 4f 75 74 29 7b 0a 20 20 73 71 6c 69 74 65  ufOut){.  sqlite
20150 33 5f 76 66 73 20 2a 70 52 65 61 6c 56 66 73 20  3_vfs *pRealVfs 
20160 3d 20 28 28 72 62 75 5f 76 66 73 2a 29 70 56 66  = ((rbu_vfs*)pVf
20170 73 29 2d 3e 70 52 65 61 6c 56 66 73 3b 0a 20 20  s)->pRealVfs;.  
20180 72 65 74 75 72 6e 20 70 52 65 61 6c 56 66 73 2d  return pRealVfs-
20190 3e 78 52 61 6e 64 6f 6d 6e 65 73 73 28 70 52 65  >xRandomness(pRe
201a0 61 6c 56 66 73 2c 20 6e 42 79 74 65 2c 20 7a 42  alVfs, nByte, zB
201b0 75 66 4f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ufOut);.}../*.**
201c0 20 53 6c 65 65 70 20 66 6f 72 20 6e 4d 69 63 72   Sleep for nMicr
201d0 6f 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 2e 20  o microseconds. 
201e0 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
201f0 72 20 6f 66 20 6d 69 63 72 6f 73 65 63 6f 6e 64  r of microsecond
20200 73 20 0a 2a 2a 20 61 63 74 75 61 6c 6c 79 20 73  s .** actually s
20210 6c 65 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lept..*/.static 
20220 69 6e 74 20 72 62 75 56 66 73 53 6c 65 65 70 28  int rbuVfsSleep(
20230 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
20240 73 2c 20 69 6e 74 20 6e 4d 69 63 72 6f 29 7b 0a  s, int nMicro){.
20250 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
20260 52 65 61 6c 56 66 73 20 3d 20 28 28 72 62 75 5f  RealVfs = ((rbu_
20270 76 66 73 2a 29 70 56 66 73 29 2d 3e 70 52 65 61  vfs*)pVfs)->pRea
20280 6c 56 66 73 3b 0a 20 20 72 65 74 75 72 6e 20 70  lVfs;.  return p
20290 52 65 61 6c 56 66 73 2d 3e 78 53 6c 65 65 70 28  RealVfs->xSleep(
202a0 70 52 65 61 6c 56 66 73 2c 20 6e 4d 69 63 72 6f  pRealVfs, nMicro
202b0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
202c0 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  rn the current t
202d0 69 6d 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20  ime as a Julian 
202e0 44 61 79 20 6e 75 6d 62 65 72 20 69 6e 20 2a 70  Day number in *p
202f0 54 69 6d 65 4f 75 74 2e 0a 2a 2f 0a 73 74 61 74  TimeOut..*/.stat
20300 69 63 20 69 6e 74 20 72 62 75 56 66 73 43 75 72  ic int rbuVfsCur
20310 72 65 6e 74 54 69 6d 65 28 73 71 6c 69 74 65 33  rentTime(sqlite3
20320 5f 76 66 73 20 2a 70 56 66 73 2c 20 64 6f 75 62  _vfs *pVfs, doub
20330 6c 65 20 2a 70 54 69 6d 65 4f 75 74 29 7b 0a 20  le *pTimeOut){. 
20340 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 52   sqlite3_vfs *pR
20350 65 61 6c 56 66 73 20 3d 20 28 28 72 62 75 5f 76  ealVfs = ((rbu_v
20360 66 73 2a 29 70 56 66 73 29 2d 3e 70 52 65 61 6c  fs*)pVfs)->pReal
20370 56 66 73 3b 0a 20 20 72 65 74 75 72 6e 20 70 52  Vfs;.  return pR
20380 65 61 6c 56 66 73 2d 3e 78 43 75 72 72 65 6e 74  ealVfs->xCurrent
20390 54 69 6d 65 28 70 52 65 61 6c 56 66 73 2c 20 70  Time(pRealVfs, p
203a0 54 69 6d 65 4f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a  TimeOut);.}../*.
203b0 2a 2a 20 4e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61  ** No-op..*/.sta
203c0 74 69 63 20 69 6e 74 20 72 62 75 56 66 73 47 65  tic int rbuVfsGe
203d0 74 4c 61 73 74 45 72 72 6f 72 28 73 71 6c 69 74  tLastError(sqlit
203e0 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e  e3_vfs *pVfs, in
203f0 74 20 61 2c 20 63 68 61 72 20 2a 62 29 7b 0a 20  t a, char *b){. 
20400 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
20410 0a 2a 2a 20 44 65 72 65 67 69 73 74 65 72 20 61  .** Deregister a
20420 6e 64 20 64 65 73 74 72 6f 79 20 61 6e 20 52 42  nd destroy an RB
20430 55 20 76 66 73 20 63 72 65 61 74 65 64 20 62 79  U vfs created by
20440 20 61 6e 20 65 61 72 6c 69 65 72 20 63 61 6c 6c   an earlier call
20450 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 72 62   to.** sqlite3rb
20460 75 5f 63 72 65 61 74 65 5f 76 66 73 28 29 2e 0a  u_create_vfs()..
20470 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 72  */.void sqlite3r
20480 62 75 5f 64 65 73 74 72 6f 79 5f 76 66 73 28 63  bu_destroy_vfs(c
20490 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
204a0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
204b0 20 2a 70 56 66 73 20 3d 20 73 71 6c 69 74 65 33   *pVfs = sqlite3
204c0 5f 76 66 73 5f 66 69 6e 64 28 7a 4e 61 6d 65 29  _vfs_find(zName)
204d0 3b 0a 20 20 69 66 28 20 70 56 66 73 20 26 26 20  ;.  if( pVfs && 
204e0 70 56 66 73 2d 3e 78 4f 70 65 6e 3d 3d 72 62 75  pVfs->xOpen==rbu
204f0 56 66 73 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73  VfsOpen ){.    s
20500 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65  qlite3_mutex_fre
20510 65 28 28 28 72 62 75 5f 76 66 73 2a 29 70 56 66  e(((rbu_vfs*)pVf
20520 73 29 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20  s)->mutex);.    
20530 73 71 6c 69 74 65 33 5f 76 66 73 5f 75 6e 72 65  sqlite3_vfs_unre
20540 67 69 73 74 65 72 28 70 56 66 73 29 3b 0a 20 20  gister(pVfs);.  
20550 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
20560 56 66 73 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  Vfs);.  }.}../*.
20570 2a 2a 20 43 72 65 61 74 65 20 61 6e 20 52 42 55  ** Create an RBU
20580 20 56 46 53 20 6e 61 6d 65 64 20 7a 4e 61 6d 65   VFS named zName
20590 20 74 68 61 74 20 61 63 63 65 73 73 65 73 20 74   that accesses t
205a0 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 66 69  he underlying fi
205b0 6c 65 2d 73 79 73 74 65 6d 0a 2a 2a 20 76 69 61  le-system.** via
205c0 20 65 78 69 73 74 69 6e 67 20 56 46 53 20 7a 50   existing VFS zP
205d0 61 72 65 6e 74 2e 20 54 68 65 20 6e 65 77 20 6f  arent. The new o
205e0 62 6a 65 63 74 20 69 73 20 72 65 67 69 73 74 65  bject is registe
205f0 72 65 64 20 61 73 20 61 20 6e 6f 6e 2d 64 65 66  red as a non-def
20600 61 75 6c 74 0a 2a 2a 20 56 46 53 20 77 69 74 68  ault.** VFS with
20610 20 53 51 4c 69 74 65 20 62 65 66 6f 72 65 20 72   SQLite before r
20620 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74  eturning..*/.int
20630 20 73 71 6c 69 74 65 33 72 62 75 5f 63 72 65 61   sqlite3rbu_crea
20640 74 65 5f 76 66 73 28 63 6f 6e 73 74 20 63 68 61  te_vfs(const cha
20650 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20  r *zName, const 
20660 63 68 61 72 20 2a 7a 50 61 72 65 6e 74 29 7b 0a  char *zParent){.
20670 0a 20 20 2f 2a 20 54 65 6d 70 6c 61 74 65 20 66  .  /* Template f
20680 6f 72 20 56 46 53 20 2a 2f 0a 20 20 73 74 61 74  or VFS */.  stat
20690 69 63 20 73 71 6c 69 74 65 33 5f 76 66 73 20 76  ic sqlite3_vfs v
206a0 66 73 5f 74 65 6d 70 6c 61 74 65 20 3d 20 7b 0a  fs_template = {.
206b0 20 20 20 20 31 2c 20 20 20 20 20 20 20 20 20 20      1,          
206c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
206d0 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f    /* iVersion */
206e0 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20  .    0,         
206f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20700 20 20 20 2f 2a 20 73 7a 4f 73 46 69 6c 65 20 2a     /* szOsFile *
20710 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20  /.    0,        
20720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20730 20 20 20 20 2f 2a 20 6d 78 50 61 74 68 6e 61 6d      /* mxPathnam
20740 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20  e */.    0,     
20750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20760 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 78 74 20         /* pNext 
20770 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20  */.    0,       
20780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20790 20 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f       /* zName */
207a0 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20  .    0,         
207b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
207c0 20 20 20 2f 2a 20 70 41 70 70 44 61 74 61 20 2a     /* pAppData *
207d0 2f 0a 20 20 20 20 72 62 75 56 66 73 4f 70 65 6e  /.    rbuVfsOpen
207e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
207f0 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f 0a      /* xOpen */.
20800 20 20 20 20 72 62 75 56 66 73 44 65 6c 65 74 65      rbuVfsDelete
20810 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
20820 20 20 2f 2a 20 78 44 65 6c 65 74 65 20 2a 2f 0a    /* xDelete */.
20830 20 20 20 20 72 62 75 56 66 73 41 63 63 65 73 73      rbuVfsAccess
20840 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
20850 20 20 2f 2a 20 78 41 63 63 65 73 73 20 2a 2f 0a    /* xAccess */.
20860 20 20 20 20 72 62 75 56 66 73 46 75 6c 6c 50 61      rbuVfsFullPa
20870 74 68 6e 61 6d 65 2c 20 20 20 20 20 20 20 20 20  thname,         
20880 20 20 2f 2a 20 78 46 75 6c 6c 50 61 74 68 6e 61    /* xFullPathna
20890 6d 65 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  me */..#ifndef S
208a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
208b0 45 58 54 45 4e 53 49 4f 4e 0a 20 20 20 20 72 62  EXTENSION.    rb
208c0 75 56 66 73 44 6c 4f 70 65 6e 2c 20 20 20 20 20  uVfsDlOpen,     
208d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
208e0 44 6c 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 72 62  DlOpen */.    rb
208f0 75 56 66 73 44 6c 45 72 72 6f 72 2c 20 20 20 20  uVfsDlError,    
20900 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
20910 44 6c 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20 72  DlError */.    r
20920 62 75 56 66 73 44 6c 53 79 6d 2c 20 20 20 20 20  buVfsDlSym,     
20930 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20940 78 44 6c 53 79 6d 20 2a 2f 0a 20 20 20 20 72 62  xDlSym */.    rb
20950 75 56 66 73 44 6c 43 6c 6f 73 65 2c 20 20 20 20  uVfsDlClose,    
20960 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
20970 44 6c 43 6c 6f 73 65 20 2a 2f 0a 23 65 6c 73 65  DlClose */.#else
20980 0a 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c  .    0, 0, 0, 0,
20990 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 72 62 75  .#endif..    rbu
209a0 56 66 73 52 61 6e 64 6f 6d 6e 65 73 73 2c 20 20  VfsRandomness,  
209b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52             /* xR
209c0 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f 0a 20 20 20  andomness */.   
209d0 20 72 62 75 56 66 73 53 6c 65 65 70 2c 20 20 20   rbuVfsSleep,   
209e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
209f0 2a 20 78 53 6c 65 65 70 20 2a 2f 0a 20 20 20 20  * xSleep */.    
20a00 72 62 75 56 66 73 43 75 72 72 65 6e 74 54 69 6d  rbuVfsCurrentTim
20a10 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e,            /*
20a20 20 78 43 75 72 72 65 6e 74 54 69 6d 65 20 2a 2f   xCurrentTime */
20a30 0a 20 20 20 20 72 62 75 56 66 73 47 65 74 4c 61  .    rbuVfsGetLa
20a40 73 74 45 72 72 6f 72 2c 20 20 20 20 20 20 20 20  stError,        
20a50 20 20 20 2f 2a 20 78 47 65 74 4c 61 73 74 45 72     /* xGetLastEr
20a60 72 6f 72 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20  ror */.    0,   
20a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a80 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 75 72           /* xCur
20a90 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 20 28 76  rentTimeInt64 (v
20aa0 65 72 73 69 6f 6e 20 32 29 20 2a 2f 0a 20 20 20  ersion 2) */.   
20ab0 20 30 2c 20 30 2c 20 30 20 20 20 20 20 20 20 20   0, 0, 0        
20ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20ad0 2a 20 55 6e 69 6d 70 6c 65 6d 65 6e 74 65 64 20  * Unimplemented 
20ae0 76 65 72 73 69 6f 6e 20 33 20 6d 65 74 68 6f 64  version 3 method
20af0 73 20 2a 2f 0a 20 20 7d 3b 0a 0a 20 20 72 62 75  s */.  };..  rbu
20b00 5f 76 66 73 20 2a 70 4e 65 77 20 3d 20 30 3b 20  _vfs *pNew = 0; 
20b10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20b20 4e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  Newly allocated 
20b30 56 46 53 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  VFS */.  int rc 
20b40 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73  = SQLITE_OK;.  s
20b50 69 7a 65 5f 74 20 6e 4e 61 6d 65 3b 0a 20 20 73  ize_t nName;.  s
20b60 69 7a 65 5f 74 20 6e 42 79 74 65 3b 0a 0a 20 20  ize_t nByte;..  
20b70 6e 4e 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a  nName = strlen(z
20b80 4e 61 6d 65 29 3b 0a 20 20 6e 42 79 74 65 20 3d  Name);.  nByte =
20b90 20 73 69 7a 65 6f 66 28 72 62 75 5f 76 66 73 29   sizeof(rbu_vfs)
20ba0 20 2b 20 6e 4e 61 6d 65 20 2b 20 31 3b 0a 20 20   + nName + 1;.  
20bb0 70 4e 65 77 20 3d 20 28 72 62 75 5f 76 66 73 2a  pNew = (rbu_vfs*
20bc0 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36  )sqlite3_malloc6
20bd0 34 28 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20  4(nByte);.  if( 
20be0 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 72  pNew==0 ){.    r
20bf0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
20c00 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
20c10 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 50 61 72  qlite3_vfs *pPar
20c20 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ent;           /
20c30 2a 20 50 61 72 65 6e 74 20 56 46 53 20 2a 2f 0a  * Parent VFS */.
20c40 20 20 20 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c      memset(pNew,
20c50 20 30 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20   0, nByte);.    
20c60 70 50 61 72 65 6e 74 20 3d 20 73 71 6c 69 74 65  pParent = sqlite
20c70 33 5f 76 66 73 5f 66 69 6e 64 28 7a 50 61 72 65  3_vfs_find(zPare
20c80 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  nt);.    if( pPa
20c90 72 65 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  rent==0 ){.     
20ca0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54   rc = SQLITE_NOT
20cb0 46 4f 55 4e 44 3b 0a 20 20 20 20 7d 65 6c 73 65  FOUND;.    }else
20cc0 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 53  {.      char *zS
20cd0 70 61 63 65 3b 0a 20 20 20 20 20 20 6d 65 6d 63  pace;.      memc
20ce0 70 79 28 26 70 4e 65 77 2d 3e 62 61 73 65 2c 20  py(&pNew->base, 
20cf0 26 76 66 73 5f 74 65 6d 70 6c 61 74 65 2c 20 73  &vfs_template, s
20d00 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f 76 66  izeof(sqlite3_vf
20d10 73 29 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  s));.      pNew-
20d20 3e 62 61 73 65 2e 6d 78 50 61 74 68 6e 61 6d 65  >base.mxPathname
20d30 20 3d 20 70 50 61 72 65 6e 74 2d 3e 6d 78 50 61   = pParent->mxPa
20d40 74 68 6e 61 6d 65 3b 0a 20 20 20 20 20 20 70 4e  thname;.      pN
20d50 65 77 2d 3e 62 61 73 65 2e 73 7a 4f 73 46 69 6c  ew->base.szOsFil
20d60 65 20 3d 20 73 69 7a 65 6f 66 28 72 62 75 5f 66  e = sizeof(rbu_f
20d70 69 6c 65 29 20 2b 20 70 50 61 72 65 6e 74 2d 3e  ile) + pParent->
20d80 73 7a 4f 73 46 69 6c 65 3b 0a 20 20 20 20 20 20  szOsFile;.      
20d90 70 4e 65 77 2d 3e 70 52 65 61 6c 56 66 73 20 3d  pNew->pRealVfs =
20da0 20 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 20 20   pParent;.      
20db0 70 4e 65 77 2d 3e 62 61 73 65 2e 7a 4e 61 6d 65  pNew->base.zName
20dc0 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
20dd0 28 7a 53 70 61 63 65 20 3d 20 28 63 68 61 72 2a  (zSpace = (char*
20de0 29 26 70 4e 65 77 5b 31 5d 29 3b 0a 20 20 20 20  )&pNew[1]);.    
20df0 20 20 6d 65 6d 63 70 79 28 7a 53 70 61 63 65 2c    memcpy(zSpace,
20e00 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a   zName, nName);.
20e10 0a 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61  .      /* Alloca
20e20 74 65 20 74 68 65 20 6d 75 74 65 78 20 61 6e 64  te the mutex and
20e30 20 72 65 67 69 73 74 65 72 20 74 68 65 20 6e 65   register the ne
20e40 77 20 56 46 53 20 28 6e 6f 74 20 61 73 20 74 68  w VFS (not as th
20e50 65 20 64 65 66 61 75 6c 74 29 20 2a 2f 0a 20 20  e default) */.  
20e60 20 20 20 20 70 4e 65 77 2d 3e 6d 75 74 65 78 20      pNew->mutex 
20e70 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  = sqlite3_mutex_
20e80 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  alloc(SQLITE_MUT
20e90 45 58 5f 52 45 43 55 52 53 49 56 45 29 3b 0a 20  EX_RECURSIVE);. 
20ea0 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 6d       if( pNew->m
20eb0 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  utex==0 ){.     
20ec0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
20ed0 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73  OMEM;.      }els
20ee0 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
20ef0 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69  sqlite3_vfs_regi
20f00 73 74 65 72 28 26 70 4e 65 77 2d 3e 62 61 73 65  ster(&pNew->base
20f10 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
20f20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 21    }..    if( rc!
20f30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
20f40 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
20f50 78 5f 66 72 65 65 28 70 4e 65 77 2d 3e 6d 75 74  x_free(pNew->mut
20f60 65 78 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ex);.      sqlit
20f70 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20  e3_free(pNew);. 
20f80 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
20f90 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a  rn rc;.}.../****
20fa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20fb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20fc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20fd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20fe0 2a 2a 2a 2a 2a 2a 2f 0a 0a 23 65 6e 64 69 66 20  ******/..#endif 
20ff0 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
21000 54 45 5f 43 4f 52 45 29 20 7c 7c 20 64 65 66 69  TE_CORE) || defi
21010 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
21020 45 5f 52 42 55 29 20 2a 2f 0a                    E_RBU) */.