/ Hex Artifact Content
Login

Artifact e2ebcebfd0c363b8f90aba5a91cba0b3e93044ea:


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 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75  "../* Maximum nu
0fd0: 6d 62 65 72 20 6f 66 20 70 72 65 70 61 72 65 64  mber of prepared
0fe0: 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e   UPDATE statemen
0ff0: 74 73 20 68 65 6c 64 20 62 79 20 74 68 69 73 20  ts held by this 
1000: 6d 6f 64 75 6c 65 20 2a 2f 0a 23 64 65 66 69 6e  module */.#defin
1010: 65 20 53 51 4c 49 54 45 5f 52 42 55 5f 55 50 44  e SQLITE_RBU_UPD
1020: 41 54 45 5f 43 41 43 48 45 53 49 5a 45 20 31 36  ATE_CACHESIZE 16
1030: 0a 0a 2f 2a 0a 2a 2a 20 53 77 61 70 20 74 77 6f  ../*.** Swap two
1040: 20 6f 62 6a 65 63 74 73 20 6f 66 20 74 79 70 65   objects of type
1050: 20 54 59 50 45 2e 0a 2a 2f 0a 23 69 66 20 21 64   TYPE..*/.#if !d
1060: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 41 4d  efined(SQLITE_AM
1070: 41 4c 47 41 4d 41 54 49 4f 4e 29 0a 23 20 64 65  ALGAMATION).# de
1080: 66 69 6e 65 20 53 57 41 50 28 54 59 50 45 2c 41  fine SWAP(TYPE,A
1090: 2c 42 29 20 7b 54 59 50 45 20 74 3d 41 3b 20 41  ,B) {TYPE t=A; A
10a0: 3d 42 3b 20 42 3d 74 3b 7d 0a 23 65 6e 64 69 66  =B; B=t;}.#endif
10b0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 72 62 75 5f  ../*.** The rbu_
10c0: 73 74 61 74 65 20 74 61 62 6c 65 20 69 73 20 75  state table is u
10d0: 73 65 64 20 74 6f 20 73 61 76 65 20 74 68 65 20  sed to save the 
10e0: 73 74 61 74 65 20 6f 66 20 61 20 70 61 72 74 69  state of a parti
10f0: 61 6c 6c 79 20 61 70 70 6c 69 65 64 0a 2a 2a 20  ally applied.** 
1100: 75 70 64 61 74 65 20 73 6f 20 74 68 61 74 20 69  update so that i
1110: 74 20 63 61 6e 20 62 65 20 72 65 73 75 6d 65 64  t can be resumed
1120: 20 6c 61 74 65 72 2e 20 54 68 65 20 74 61 62 6c   later. The tabl
1130: 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 69 6e  e consists of in
1140: 74 65 67 65 72 0a 2a 2a 20 6b 65 79 73 20 6d 61  teger.** keys ma
1150: 70 70 65 64 20 74 6f 20 76 61 6c 75 65 73 20 61  pped to values a
1160: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
1170: 20 52 42 55 5f 53 54 41 54 45 5f 53 54 41 47 45   RBU_STATE_STAGE
1180: 3a 0a 2a 2a 20 20 20 4d 61 79 20 62 65 20 73 65  :.**   May be se
1190: 74 20 74 6f 20 69 6e 74 65 67 65 72 20 76 61 6c  t to integer val
11a0: 75 65 73 20 31 2c 20 32 2c 20 34 20 6f 72 20 35  ues 1, 2, 4 or 5
11b0: 2e 20 41 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  . As follows:.**
11c0: 20 20 20 20 20 20 20 31 3a 20 74 68 65 20 2a 2d         1: the *-
11d0: 72 62 75 20 66 69 6c 65 20 69 73 20 63 75 72 72  rbu file is curr
11e0: 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
11f0: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 20 20 20  truction..**    
1200: 20 20 20 32 3a 20 74 68 65 20 2a 2d 72 62 75 20     2: the *-rbu 
1210: 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 63 6f  file has been co
1220: 6e 73 74 72 75 63 74 65 64 2c 20 62 75 74 20 6e  nstructed, but n
1230: 6f 74 20 79 65 74 20 6d 6f 76 65 64 20 0a 2a 2a  ot yet moved .**
1240: 20 20 20 20 20 20 20 20 20 20 74 6f 20 74 68 65            to the
1250: 20 2a 2d 77 61 6c 20 70 61 74 68 2e 0a 2a 2a 20   *-wal path..** 
1260: 20 20 20 20 20 20 34 3a 20 74 68 65 20 63 68 65        4: the che
1270: 63 6b 70 6f 69 6e 74 20 69 73 20 75 6e 64 65 72  ckpoint is under
1280: 77 61 79 2e 0a 2a 2a 20 20 20 20 20 20 20 35 3a  way..**       5:
1290: 20 74 68 65 20 72 62 75 20 75 70 64 61 74 65 20   the rbu update 
12a0: 68 61 73 20 62 65 65 6e 20 63 68 65 63 6b 70 6f  has been checkpo
12b0: 69 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 42 55  inted..**.** RBU
12c0: 5f 53 54 41 54 45 5f 54 42 4c 3a 0a 2a 2a 20 20  _STATE_TBL:.**  
12d0: 20 4f 6e 6c 79 20 76 61 6c 69 64 20 69 66 20 53   Only valid if S
12e0: 54 41 47 45 3d 3d 31 2e 20 54 68 65 20 74 61 72  TAGE==1. The tar
12f0: 67 65 74 20 64 61 74 61 62 61 73 65 20 6e 61 6d  get database nam
1300: 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 0a  e of the table .
1310: 2a 2a 20 20 20 63 75 72 72 65 6e 74 6c 79 20 62  **   currently b
1320: 65 69 6e 67 20 77 72 69 74 74 65 6e 2e 0a 2a 2a  eing written..**
1330: 0a 2a 2a 20 52 42 55 5f 53 54 41 54 45 5f 49 44  .** RBU_STATE_ID
1340: 58 3a 0a 2a 2a 20 20 20 4f 6e 6c 79 20 76 61 6c  X:.**   Only val
1350: 69 64 20 69 66 20 53 54 41 47 45 3d 3d 31 2e 20  id if STAGE==1. 
1360: 54 68 65 20 74 61 72 67 65 74 20 64 61 74 61 62  The target datab
1370: 61 73 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  ase name of the 
1380: 69 6e 64 65 78 20 0a 2a 2a 20 20 20 63 75 72 72  index .**   curr
1390: 65 6e 74 6c 79 20 62 65 69 6e 67 20 77 72 69 74  ently being writ
13a0: 74 65 6e 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20  ten, or NULL if 
13b0: 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 20 69  the main table i
13c0: 73 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e  s currently bein
13d0: 67 0a 2a 2a 20 20 20 75 70 64 61 74 65 64 2e 0a  g.**   updated..
13e0: 2a 2a 0a 2a 2a 20 52 42 55 5f 53 54 41 54 45 5f  **.** RBU_STATE_
13f0: 52 4f 57 3a 0a 2a 2a 20 20 20 4f 6e 6c 79 20 76  ROW:.**   Only v
1400: 61 6c 69 64 20 69 66 20 53 54 41 47 45 3d 3d 31  alid if STAGE==1
1410: 2e 20 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  . Number of rows
1420: 20 61 6c 72 65 61 64 79 20 70 72 6f 63 65 73 73   already process
1430: 65 64 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  ed for the curre
1440: 6e 74 0a 2a 2a 20 20 20 74 61 62 6c 65 2f 69 6e  nt.**   table/in
1450: 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 52 42 55 5f 53  dex..**.** RBU_S
1460: 54 41 54 45 5f 50 52 4f 47 52 45 53 53 3a 0a 2a  TATE_PROGRESS:.*
1470: 2a 20 20 20 54 72 62 75 6c 20 6e 75 6d 62 65 72  *   Trbul number
1480: 20 6f 66 20 73 71 6c 69 74 65 33 72 62 75 5f 73   of sqlite3rbu_s
1490: 74 65 70 28 29 20 63 61 6c 6c 73 20 6d 61 64 65  tep() calls made
14a0: 20 73 6f 20 66 61 72 20 61 73 20 70 61 72 74 20   so far as part 
14b0: 6f 66 20 74 68 69 73 0a 2a 2a 20 20 20 72 62 75  of this.**   rbu
14c0: 20 75 70 64 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52   update..**.** R
14d0: 42 55 5f 53 54 41 54 45 5f 43 4b 50 54 3a 0a 2a  BU_STATE_CKPT:.*
14e0: 2a 20 20 20 56 61 6c 69 64 20 69 66 20 53 54 41  *   Valid if STA
14f0: 47 45 3d 3d 34 2e 20 54 68 65 20 36 34 2d 62 69  GE==4. The 64-bi
1500: 74 20 63 68 65 63 6b 73 75 6d 20 61 73 73 6f 63  t checksum assoc
1510: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 77  iated with the w
1520: 61 6c 2d 69 6e 64 65 78 0a 2a 2a 20 20 20 68 65  al-index.**   he
1530: 61 64 65 72 20 63 72 65 61 74 65 64 20 62 79 20  ader created by 
1540: 72 65 63 6f 76 65 72 69 6e 67 20 74 68 65 20 2a  recovering the *
1550: 2d 77 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20  -wal file. This 
1560: 69 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 63  is used to detec
1570: 74 0a 2a 2a 20 20 20 63 61 73 65 73 20 77 68 65  t.**   cases whe
1580: 6e 20 61 6e 6f 74 68 65 72 20 63 6c 69 65 6e 74  n another client
1590: 20 61 70 70 65 6e 64 73 20 66 72 61 6d 65 73 20   appends frames 
15a0: 74 6f 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c  to the *-wal fil
15b0: 65 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20 6d 69  e in the.**   mi
15c0: 64 64 6c 65 20 6f 66 20 61 6e 20 69 6e 63 72 65  ddle of an incre
15d0: 6d 65 6e 74 61 6c 20 63 68 65 63 6b 70 6f 69 6e  mental checkpoin
15e0: 74 20 28 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61  t (an incrementa
15f0: 6c 20 63 68 65 63 6b 70 6f 69 6e 74 20 63 61 6e  l checkpoint can
1600: 6e 6f 74 0a 2a 2a 20 20 20 62 65 20 63 6f 6e 74  not.**   be cont
1610: 69 6e 75 65 64 20 69 66 20 74 68 69 73 20 68 61  inued if this ha
1620: 70 70 65 6e 73 29 2e 0a 2a 2a 0a 2a 2a 20 52 42  ppens)..**.** RB
1630: 55 5f 53 54 41 54 45 5f 43 4f 4f 4b 49 45 3a 0a  U_STATE_COOKIE:.
1640: 2a 2a 20 20 20 56 61 6c 69 64 20 69 66 20 53 54  **   Valid if ST
1650: 41 47 45 3d 3d 31 2e 20 54 68 65 20 63 75 72 72  AGE==1. The curr
1660: 65 6e 74 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  ent change-count
1670: 65 72 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20  er cookie value 
1680: 69 6e 20 74 68 65 20 0a 2a 2a 20 20 20 74 61 72  in the .**   tar
1690: 67 65 74 20 64 62 20 66 69 6c 65 2e 0a 2a 2a 0a  get db file..**.
16a0: 2a 2a 20 52 42 55 5f 53 54 41 54 45 5f 4f 41 4c  ** RBU_STATE_OAL
16b0: 53 5a 3a 0a 2a 2a 20 20 20 56 61 6c 69 64 20 69  SZ:.**   Valid i
16c0: 66 20 53 54 41 47 45 3d 3d 31 2e 20 54 68 65 20  f STAGE==1. The 
16d0: 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66  size in bytes of
16e0: 20 74 68 65 20 2a 2d 6f 61 6c 20 66 69 6c 65 2e   the *-oal file.
16f0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 52 42 55 5f  .*/.#define RBU_
1700: 53 54 41 54 45 5f 53 54 41 47 45 20 20 20 20 20  STATE_STAGE     
1710: 20 20 31 0a 23 64 65 66 69 6e 65 20 52 42 55 5f    1.#define RBU_
1720: 53 54 41 54 45 5f 54 42 4c 20 20 20 20 20 20 20  STATE_TBL       
1730: 20 20 32 0a 23 64 65 66 69 6e 65 20 52 42 55 5f    2.#define RBU_
1740: 53 54 41 54 45 5f 49 44 58 20 20 20 20 20 20 20  STATE_IDX       
1750: 20 20 33 0a 23 64 65 66 69 6e 65 20 52 42 55 5f    3.#define RBU_
1760: 53 54 41 54 45 5f 52 4f 57 20 20 20 20 20 20 20  STATE_ROW       
1770: 20 20 34 0a 23 64 65 66 69 6e 65 20 52 42 55 5f    4.#define RBU_
1780: 53 54 41 54 45 5f 50 52 4f 47 52 45 53 53 20 20  STATE_PROGRESS  
1790: 20 20 35 0a 23 64 65 66 69 6e 65 20 52 42 55 5f    5.#define RBU_
17a0: 53 54 41 54 45 5f 43 4b 50 54 20 20 20 20 20 20  STATE_CKPT      
17b0: 20 20 36 0a 23 64 65 66 69 6e 65 20 52 42 55 5f    6.#define RBU_
17c0: 53 54 41 54 45 5f 43 4f 4f 4b 49 45 20 20 20 20  STATE_COOKIE    
17d0: 20 20 37 0a 23 64 65 66 69 6e 65 20 52 42 55 5f    7.#define RBU_
17e0: 53 54 41 54 45 5f 4f 41 4c 53 5a 20 20 20 20 20  STATE_OALSZ     
17f0: 20 20 38 0a 0a 23 64 65 66 69 6e 65 20 52 42 55    8..#define RBU
1800: 5f 53 54 41 47 45 5f 4f 41 4c 20 20 20 20 20 20  _STAGE_OAL      
1810: 20 20 20 31 0a 23 64 65 66 69 6e 65 20 52 42 55     1.#define RBU
1820: 5f 53 54 41 47 45 5f 4d 4f 56 45 20 20 20 20 20  _STAGE_MOVE     
1830: 20 20 20 32 0a 23 64 65 66 69 6e 65 20 52 42 55     2.#define RBU
1840: 5f 53 54 41 47 45 5f 43 41 50 54 55 52 45 20 20  _STAGE_CAPTURE  
1850: 20 20 20 33 0a 23 64 65 66 69 6e 65 20 52 42 55     3.#define RBU
1860: 5f 53 54 41 47 45 5f 43 4b 50 54 20 20 20 20 20  _STAGE_CKPT     
1870: 20 20 20 34 0a 23 64 65 66 69 6e 65 20 52 42 55     4.#define RBU
1880: 5f 53 54 41 47 45 5f 44 4f 4e 45 20 20 20 20 20  _STAGE_DONE     
1890: 20 20 20 35 0a 0a 0a 23 64 65 66 69 6e 65 20 52     5...#define R
18a0: 42 55 5f 43 52 45 41 54 45 5f 53 54 41 54 45 20  BU_CREATE_STATE 
18b0: 5c 0a 20 20 22 43 52 45 41 54 45 20 54 41 42 4c  \.  "CREATE TABL
18c0: 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20  E IF NOT EXISTS 
18d0: 25 73 2e 72 62 75 5f 73 74 61 74 65 28 6b 20 49  %s.rbu_state(k I
18e0: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
18f0: 45 59 2c 20 76 29 22 0a 0a 74 79 70 65 64 65 66  EY, v)"..typedef
1900: 20 73 74 72 75 63 74 20 52 62 75 46 72 61 6d 65   struct RbuFrame
1910: 20 52 62 75 46 72 61 6d 65 3b 0a 74 79 70 65 64   RbuFrame;.typed
1920: 65 66 20 73 74 72 75 63 74 20 52 62 75 4f 62 6a  ef struct RbuObj
1930: 49 74 65 72 20 52 62 75 4f 62 6a 49 74 65 72 3b  Iter RbuObjIter;
1940: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
1950: 52 62 75 53 74 61 74 65 20 52 62 75 53 74 61 74  RbuState RbuStat
1960: 65 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  e;.typedef struc
1970: 74 20 72 62 75 5f 76 66 73 20 72 62 75 5f 76 66  t rbu_vfs rbu_vf
1980: 73 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  s;.typedef struc
1990: 74 20 72 62 75 5f 66 69 6c 65 20 72 62 75 5f 66  t rbu_file rbu_f
19a0: 69 6c 65 3b 0a 74 79 70 65 64 65 66 20 73 74 72  ile;.typedef str
19b0: 75 63 74 20 52 62 75 55 70 64 61 74 65 53 74 6d  uct RbuUpdateStm
19c0: 74 20 52 62 75 55 70 64 61 74 65 53 74 6d 74 3b  t RbuUpdateStmt;
19d0: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
19e0: 51 4c 49 54 45 5f 41 4d 41 4c 47 41 4d 41 54 49  QLITE_AMALGAMATI
19f0: 4f 4e 29 0a 74 79 70 65 64 65 66 20 75 6e 73 69  ON).typedef unsi
1a00: 67 6e 65 64 20 69 6e 74 20 75 33 32 3b 0a 74 79  gned int u32;.ty
1a10: 70 65 64 65 66 20 75 6e 73 69 67 6e 65 64 20 63  pedef unsigned c
1a20: 68 61 72 20 75 38 3b 0a 74 79 70 65 64 65 66 20  har u8;.typedef 
1a30: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 36  sqlite3_int64 i6
1a40: 34 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  4;.#endif../*.**
1a50: 20 54 68 65 73 65 20 76 61 6c 75 65 73 20 6d 75   These values mu
1a60: 73 74 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c  st match the val
1a70: 75 65 73 20 64 65 66 69 6e 65 64 20 69 6e 20 77  ues defined in w
1a80: 61 6c 2e 63 20 66 6f 72 20 74 68 65 20 65 71 75  al.c for the equ
1a90: 69 76 61 6c 65 6e 74 0a 2a 2a 20 6c 6f 63 6b 73  ivalent.** locks
1aa0: 2e 20 54 68 65 73 65 20 61 72 65 20 6e 6f 74 20  . These are not 
1ab0: 6d 61 67 69 63 20 6e 75 6d 62 65 72 73 20 61 73  magic numbers as
1ac0: 20 74 68 65 79 20 61 72 65 20 70 61 72 74 20 6f   they are part o
1ad0: 66 20 74 68 65 20 53 51 4c 69 74 65 20 66 69 6c  f the SQLite fil
1ae0: 65 0a 2a 2a 20 66 6f 72 6d 61 74 2e 0a 2a 2f 0a  e.** format..*/.
1af0: 23 64 65 66 69 6e 65 20 57 41 4c 5f 4c 4f 43 4b  #define WAL_LOCK
1b00: 5f 57 52 49 54 45 20 20 30 0a 23 64 65 66 69 6e  _WRITE  0.#defin
1b10: 65 20 57 41 4c 5f 4c 4f 43 4b 5f 43 4b 50 54 20  e WAL_LOCK_CKPT 
1b20: 20 20 31 0a 23 64 65 66 69 6e 65 20 57 41 4c 5f    1.#define WAL_
1b30: 4c 4f 43 4b 5f 52 45 41 44 30 20 20 33 0a 0a 2f  LOCK_READ0  3../
1b40: 2a 0a 2a 2a 20 41 20 73 74 72 75 63 74 75 72 65  *.** A structure
1b50: 20 74 6f 20 73 74 6f 72 65 20 76 61 6c 75 65 73   to store values
1b60: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 72   read from the r
1b70: 62 75 5f 73 74 61 74 65 20 74 61 62 6c 65 20 69  bu_state table i
1b80: 6e 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 72  n memory..*/.str
1b90: 75 63 74 20 52 62 75 53 74 61 74 65 20 7b 0a 20  uct RbuState {. 
1ba0: 20 69 6e 74 20 65 53 74 61 67 65 3b 0a 20 20 63   int eStage;.  c
1bb0: 68 61 72 20 2a 7a 54 62 6c 3b 0a 20 20 63 68 61  har *zTbl;.  cha
1bc0: 72 20 2a 7a 49 64 78 3b 0a 20 20 69 36 34 20 69  r *zIdx;.  i64 i
1bd0: 57 61 6c 43 6b 73 75 6d 3b 0a 20 20 69 6e 74 20  WalCksum;.  int 
1be0: 6e 52 6f 77 3b 0a 20 20 69 36 34 20 6e 50 72 6f  nRow;.  i64 nPro
1bf0: 67 72 65 73 73 3b 0a 20 20 75 33 32 20 69 43 6f  gress;.  u32 iCo
1c00: 6f 6b 69 65 3b 0a 20 20 69 36 34 20 69 4f 61 6c  okie;.  i64 iOal
1c10: 53 7a 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 52  Sz;.};..struct R
1c20: 62 75 55 70 64 61 74 65 53 74 6d 74 20 7b 0a 20  buUpdateStmt {. 
1c30: 20 63 68 61 72 20 2a 7a 4d 61 73 6b 3b 20 20 20   char *zMask;   
1c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c50: 20 2f 2a 20 43 6f 70 79 20 6f 66 20 75 70 64 61   /* Copy of upda
1c60: 74 65 20 6d 61 73 6b 20 75 73 65 64 20 77 69 74  te mask used wit
1c70: 68 20 70 55 70 64 61 74 65 20 2a 2f 0a 20 20 73  h pUpdate */.  s
1c80: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 55 70  qlite3_stmt *pUp
1c90: 64 61 74 65 3b 20 20 20 20 20 20 20 20 20 20 2f  date;          /
1ca0: 2a 20 4c 61 73 74 20 75 70 64 61 74 65 20 73 74  * Last update st
1cb0: 61 74 65 6d 65 6e 74 20 28 6f 72 20 4e 55 4c 4c  atement (or NULL
1cc0: 29 20 2a 2f 0a 20 20 52 62 75 55 70 64 61 74 65  ) */.  RbuUpdate
1cd0: 53 74 6d 74 20 2a 70 4e 65 78 74 3b 0a 7d 3b 0a  Stmt *pNext;.};.
1ce0: 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 74 65 72 61 74  ./*.** An iterat
1cf0: 6f 72 20 6f 66 20 74 68 69 73 20 74 79 70 65 20  or of this type 
1d00: 69 73 20 75 73 65 64 20 74 6f 20 69 74 65 72 61  is used to itera
1d10: 74 65 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 6f  te through all o
1d20: 62 6a 65 63 74 73 20 69 6e 0a 2a 2a 20 74 68 65  bjects in.** the
1d30: 20 74 61 72 67 65 74 20 64 61 74 61 62 61 73 65   target database
1d40: 20 74 68 61 74 20 72 65 71 75 69 72 65 20 75 70   that require up
1d50: 64 61 74 69 6e 67 2e 20 46 6f 72 20 65 61 63 68  dating. For each
1d60: 20 73 75 63 68 20 74 61 62 6c 65 2c 20 74 68 65   such table, the
1d70: 0a 2a 2a 20 69 74 65 72 61 74 6f 72 20 76 69 73  .** iterator vis
1d80: 69 74 73 2c 20 69 6e 20 6f 72 64 65 72 3a 0a 2a  its, in order:.*
1d90: 2a 0a 2a 2a 20 20 20 20 20 2a 20 74 68 65 20 74  *.**     * the t
1da0: 61 62 6c 65 20 69 74 73 65 6c 66 2c 20 0a 2a 2a  able itself, .**
1db0: 20 20 20 20 20 2a 20 65 61 63 68 20 69 6e 64 65       * each inde
1dc0: 78 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 28  x of the table (
1dd0: 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70 6f 69  zero or more poi
1de0: 6e 74 73 20 74 6f 20 76 69 73 69 74 29 2c 20 61  nts to visit), a
1df0: 6e 64 0a 2a 2a 20 20 20 20 20 2a 20 61 20 73 70  nd.**     * a sp
1e00: 65 63 69 61 6c 20 22 63 6c 65 61 6e 75 70 20 74  ecial "cleanup t
1e10: 61 62 6c 65 22 20 73 74 61 74 65 2e 0a 2a 2a 0a  able" state..**.
1e20: 2a 2a 20 61 62 49 6e 64 65 78 65 64 3a 0a 2a 2a  ** abIndexed:.**
1e30: 20 20 20 49 66 20 74 68 65 20 74 61 62 6c 65 20     If the table 
1e40: 68 61 73 20 6e 6f 20 69 6e 64 65 78 65 73 20 6f  has no indexes o
1e50: 6e 20 69 74 2c 20 61 62 49 6e 64 65 78 65 64 20  n it, abIndexed 
1e60: 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 20  is set to NULL. 
1e70: 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 20 20  Otherwise,.**   
1e80: 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20  it points to an 
1e90: 61 72 72 61 79 20 6f 66 20 66 6c 61 67 73 20 6e  array of flags n
1ea0: 54 62 6c 43 6f 6c 20 65 6c 65 6d 65 6e 74 73 20  TblCol elements 
1eb0: 69 6e 20 73 69 7a 65 2e 20 54 68 65 20 66 6c 61  in size. The fla
1ec0: 67 20 69 73 0a 2a 2a 20 20 20 73 65 74 20 66 6f  g is.**   set fo
1ed0: 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 74 68  r each column th
1ee0: 61 74 20 69 73 20 65 69 74 68 65 72 20 61 20 70  at is either a p
1ef0: 61 72 74 20 6f 66 20 74 68 65 20 50 4b 20 6f 72  art of the PK or
1f00: 20 61 20 70 61 72 74 20 6f 66 20 61 6e 0a 2a 2a   a part of an.**
1f10: 20 20 20 69 6e 64 65 78 2e 20 4f 72 20 63 6c 65     index. Or cle
1f20: 61 72 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a  ar otherwise..**
1f30: 20 20 20 0a 2a 2f 0a 73 74 72 75 63 74 20 52 62     .*/.struct Rb
1f40: 75 4f 62 6a 49 74 65 72 20 7b 0a 20 20 73 71 6c  uObjIter {.  sql
1f50: 69 74 65 33 5f 73 74 6d 74 20 2a 70 54 62 6c 49  ite3_stmt *pTblI
1f60: 74 65 72 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ter;         /* 
1f70: 49 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  Iterate through 
1f80: 74 61 62 6c 65 73 20 2a 2f 0a 20 20 73 71 6c 69  tables */.  sqli
1f90: 74 65 33 5f 73 74 6d 74 20 2a 70 49 64 78 49 74  te3_stmt *pIdxIt
1fa0: 65 72 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49  er;         /* I
1fb0: 6e 64 65 78 20 69 74 65 72 61 74 6f 72 20 2a 2f  ndex iterator */
1fc0: 0a 20 20 69 6e 74 20 6e 54 62 6c 43 6f 6c 3b 20  .  int nTblCol; 
1fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe0: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 7a     /* Size of az
1ff0: 54 62 6c 43 6f 6c 5b 5d 20 61 72 72 61 79 20 2a  TblCol[] array *
2000: 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a 54 62 6c  /.  char **azTbl
2010: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
2020: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
2030: 75 6e 71 75 6f 74 65 64 20 74 61 72 67 65 74 20  unquoted target 
2040: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a  column names */.
2050: 20 20 63 68 61 72 20 2a 2a 61 7a 54 62 6c 54 79    char **azTblTy
2060: 70 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pe;             
2070: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 74 61    /* Array of ta
2080: 72 67 65 74 20 63 6f 6c 75 6d 6e 20 74 79 70 65  rget column type
2090: 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 69 53 72  s */.  int *aiSr
20a0: 63 4f 72 64 65 72 3b 20 20 20 20 20 20 20 20 20  cOrder;         
20b0: 20 20 20 20 20 20 20 2f 2a 20 73 72 63 20 74 61         /* src ta
20c0: 62 6c 65 20 63 6f 6c 20 2d 3e 20 74 61 72 67 65  ble col -> targe
20d0: 74 20 74 61 62 6c 65 20 63 6f 6c 20 2a 2f 0a 20  t table col */. 
20e0: 20 75 38 20 2a 61 62 54 62 6c 50 6b 3b 20 20 20   u8 *abTblPk;   
20f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2100: 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 66 6c 61   /* Array of fla
2110: 67 73 2c 20 73 65 74 20 6f 6e 20 74 61 72 67 65  gs, set on targe
2120: 74 20 50 4b 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  t PK columns */.
2130: 20 20 75 38 20 2a 61 62 4e 6f 74 4e 75 6c 6c 3b    u8 *abNotNull;
2140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2150: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 66 6c    /* Array of fl
2160: 61 67 73 2c 20 73 65 74 20 6f 6e 20 4e 4f 54 20  ags, set on NOT 
2170: 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  NULL columns */.
2180: 20 20 75 38 20 2a 61 62 49 6e 64 65 78 65 64 3b    u8 *abIndexed;
2190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a0: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 66 6c    /* Array of fl
21b0: 61 67 73 2c 20 73 65 74 20 6f 6e 20 69 6e 64 65  ags, set on inde
21c0: 78 65 64 20 26 20 50 4b 20 63 6f 6c 73 20 2a 2f  xed & PK cols */
21d0: 0a 20 20 69 6e 74 20 65 54 79 70 65 3b 20 20 20  .  int eType;   
21e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f0: 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 79 70 65     /* Table type
2200: 20 2d 20 61 6e 20 52 42 55 5f 50 4b 5f 58 58 58   - an RBU_PK_XXX
2210: 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 2f 2a 20   value */..  /* 
2220: 4f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 73  Output variables
2230: 2e 20 7a 54 62 6c 3d 3d 30 20 69 6d 70 6c 69 65  . zTbl==0 implie
2240: 73 20 45 4f 46 2e 20 2a 2f 0a 20 20 69 6e 74 20  s EOF. */.  int 
2250: 62 43 6c 65 61 6e 75 70 3b 20 20 20 20 20 20 20  bCleanup;       
2260: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2270: 72 75 65 20 69 6e 20 22 63 6c 65 61 6e 75 70 22  rue in "cleanup"
2280: 20 73 74 61 74 65 20 2a 2f 0a 20 20 63 6f 6e 73   state */.  cons
2290: 74 20 63 68 61 72 20 2a 7a 54 62 6c 3b 20 20 20  t char *zTbl;   
22a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
22b0: 61 6d 65 20 6f 66 20 74 61 72 67 65 74 20 64 62  ame of target db
22c0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73   table */.  cons
22d0: 74 20 63 68 61 72 20 2a 7a 44 61 74 61 54 62 6c  t char *zDataTbl
22e0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
22f0: 61 6d 65 20 6f 66 20 72 62 75 20 64 62 20 74 61  ame of rbu db ta
2300: 62 6c 65 20 28 6f 72 20 6e 75 6c 6c 29 20 2a 2f  ble (or null) */
2310: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2320: 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Idx;            
2330: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 61     /* Name of ta
2340: 72 67 65 74 20 64 62 20 69 6e 64 65 78 20 28 6f  rget db index (o
2350: 72 20 6e 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74  r null) */.  int
2360: 20 69 54 6e 75 6d 3b 20 20 20 20 20 20 20 20 20   iTnum;         
2370: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2380: 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 63 75 72  Root page of cur
2390: 72 65 6e 74 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  rent object */. 
23a0: 20 69 6e 74 20 69 50 6b 54 6e 75 6d 3b 20 20 20   int iPkTnum;   
23b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c0: 20 2f 2a 20 49 66 20 65 54 79 70 65 3d 3d 45 58   /* If eType==EX
23d0: 54 45 52 4e 41 4c 2c 20 72 6f 6f 74 20 6f 66 20  TERNAL, root of 
23e0: 50 4b 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  PK index */.  in
23f0: 74 20 62 55 6e 69 71 75 65 3b 20 20 20 20 20 20  t bUnique;      
2400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2410: 20 43 75 72 72 65 6e 74 20 69 6e 64 65 78 20 69   Current index i
2420: 73 20 75 6e 69 71 75 65 20 2a 2f 0a 0a 20 20 2f  s unique */..  /
2430: 2a 20 53 74 61 74 65 6d 65 6e 74 73 20 63 72 65  * Statements cre
2440: 61 74 65 64 20 62 79 20 72 62 75 4f 62 6a 49 74  ated by rbuObjIt
2450: 65 72 50 72 65 70 61 72 65 41 6c 6c 28 29 20 2a  erPrepareAll() *
2460: 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20  /.  int nCol;   
2470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2480: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2490: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 63 75 72 72   columns in curr
24a0: 65 6e 74 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ent object */.  
24b0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
24c0: 65 6c 65 63 74 3b 20 20 20 20 20 20 20 20 20 20  elect;          
24d0: 2f 2a 20 53 6f 75 72 63 65 20 64 61 74 61 20 2a  /* Source data *
24e0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  /.  sqlite3_stmt
24f0: 20 2a 70 49 6e 73 65 72 74 3b 20 20 20 20 20 20   *pInsert;      
2500: 20 20 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74      /* Statement
2510: 20 66 6f 72 20 49 4e 53 45 52 54 20 6f 70 65 72   for INSERT oper
2520: 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 73 71 6c 69  ations */.  sqli
2530: 74 65 33 5f 73 74 6d 74 20 2a 70 44 65 6c 65 74  te3_stmt *pDelet
2540: 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  e;          /* S
2550: 74 61 74 65 6d 65 6e 74 20 66 6f 72 20 44 45 4c  tatement for DEL
2560: 45 54 45 20 6f 70 73 20 2a 2f 0a 20 20 73 71 6c  ETE ops */.  sql
2570: 69 74 65 33 5f 73 74 6d 74 20 2a 70 54 6d 70 49  ite3_stmt *pTmpI
2580: 6e 73 65 72 74 3b 20 20 20 20 20 20 20 2f 2a 20  nsert;       /* 
2590: 49 6e 73 65 72 74 20 69 6e 74 6f 20 72 62 75 5f  Insert into rbu_
25a0: 74 6d 70 5f 24 7a 44 61 74 61 54 62 6c 20 2a 2f  tmp_$zDataTbl */
25b0: 0a 0a 20 20 2f 2a 20 4c 61 73 74 20 55 50 44 41  ..  /* Last UPDA
25c0: 54 45 20 75 73 65 64 20 28 66 6f 72 20 50 4b 20  TE used (for PK 
25d0: 62 2d 74 72 65 65 20 75 70 64 61 74 65 73 20 6f  b-tree updates o
25e0: 6e 6c 79 29 2c 20 6f 72 20 4e 55 4c 4c 2e 20 2a  nly), or NULL. *
25f0: 2f 0a 20 20 52 62 75 55 70 64 61 74 65 53 74 6d  /.  RbuUpdateStm
2600: 74 20 2a 70 52 62 75 55 70 64 61 74 65 3b 0a 7d  t *pRbuUpdate;.}
2610: 3b 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c 75 65 73 20  ;../*.** Values 
2620: 66 6f 72 20 52 62 75 4f 62 6a 49 74 65 72 2e 65  for RbuObjIter.e
2630: 54 79 70 65 0a 2a 2a 0a 2a 2a 20 20 20 20 20 30  Type.**.**     0
2640: 3a 20 54 61 62 6c 65 20 64 6f 65 73 20 6e 6f 74  : Table does not
2650: 20 65 78 69 73 74 20 28 65 72 72 6f 72 29 0a 2a   exist (error).*
2660: 2a 20 20 20 20 20 31 3a 20 54 61 62 6c 65 20 68  *     1: Table h
2670: 61 73 20 61 6e 20 69 6d 70 6c 69 63 69 74 20 72  as an implicit r
2680: 6f 77 69 64 2e 0a 2a 2a 20 20 20 20 20 32 3a 20  owid..**     2: 
2690: 54 61 62 6c 65 20 68 61 73 20 61 6e 20 65 78 70  Table has an exp
26a0: 6c 69 63 69 74 20 49 50 4b 20 63 6f 6c 75 6d 6e  licit IPK column
26b0: 2e 0a 2a 2a 20 20 20 20 20 33 3a 20 54 61 62 6c  ..**     3: Tabl
26c0: 65 20 68 61 73 20 61 6e 20 65 78 74 65 72 6e 61  e has an externa
26d0: 6c 20 50 4b 20 69 6e 64 65 78 2e 0a 2a 2a 20 20  l PK index..**  
26e0: 20 20 20 34 3a 20 54 61 62 6c 65 20 69 73 20 57     4: Table is W
26f0: 49 54 48 4f 55 54 20 52 4f 57 49 44 2e 0a 2a 2a  ITHOUT ROWID..**
2700: 20 20 20 20 20 35 3a 20 54 61 62 6c 65 20 69 73       5: Table is
2710: 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
2720: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 52 42 55  ..*/.#define RBU
2730: 5f 50 4b 5f 4e 4f 54 41 42 4c 45 20 20 20 20 20  _PK_NOTABLE     
2740: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 52 42 55     0.#define RBU
2750: 5f 50 4b 5f 4e 4f 4e 45 20 20 20 20 20 20 20 20  _PK_NONE        
2760: 20 20 20 31 0a 23 64 65 66 69 6e 65 20 52 42 55     1.#define RBU
2770: 5f 50 4b 5f 49 50 4b 20 20 20 20 20 20 20 20 20  _PK_IPK         
2780: 20 20 20 32 0a 23 64 65 66 69 6e 65 20 52 42 55     2.#define RBU
2790: 5f 50 4b 5f 45 58 54 45 52 4e 41 4c 20 20 20 20  _PK_EXTERNAL    
27a0: 20 20 20 33 0a 23 64 65 66 69 6e 65 20 52 42 55     3.#define RBU
27b0: 5f 50 4b 5f 57 49 54 48 4f 55 54 5f 52 4f 57 49  _PK_WITHOUT_ROWI
27c0: 44 20 20 34 0a 23 64 65 66 69 6e 65 20 52 42 55  D  4.#define RBU
27d0: 5f 50 4b 5f 56 54 41 42 20 20 20 20 20 20 20 20  _PK_VTAB        
27e0: 20 20 20 35 0a 0a 0a 2f 2a 0a 2a 2a 20 57 69 74     5.../*.** Wit
27f0: 68 69 6e 20 74 68 65 20 52 42 55 5f 53 54 41 47  hin the RBU_STAG
2800: 45 5f 4f 41 4c 20 73 74 61 67 65 2c 20 65 61 63  E_OAL stage, eac
2810: 68 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  h call to sqlite
2820: 33 72 62 75 5f 73 74 65 70 28 29 20 70 65 72 66  3rbu_step() perf
2830: 6f 72 6d 73 0a 2a 2a 20 6f 6e 65 20 6f 66 20 74  orms.** one of t
2840: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70 65  he following ope
2850: 72 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 23 64 65 66  rations..*/.#def
2860: 69 6e 65 20 52 42 55 5f 49 4e 53 45 52 54 20 20  ine RBU_INSERT  
2870: 20 20 20 31 20 20 20 20 20 20 20 20 20 20 2f 2a     1          /*
2880: 20 49 6e 73 65 72 74 20 6f 6e 20 61 20 6d 61 69   Insert on a mai
2890: 6e 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20 2a  n table b-tree *
28a0: 2f 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 44 45  /.#define RBU_DE
28b0: 4c 45 54 45 20 20 20 20 20 32 20 20 20 20 20 20  LETE     2      
28c0: 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 20      /* Delete a 
28d0: 72 6f 77 20 66 72 6f 6d 20 61 20 6d 61 69 6e 20  row from a main 
28e0: 74 61 62 6c 65 20 62 2d 74 72 65 65 20 2a 2f 0a  table b-tree */.
28f0: 23 64 65 66 69 6e 65 20 52 42 55 5f 49 44 58 5f  #define RBU_IDX_
2900: 44 45 4c 45 54 45 20 33 20 20 20 20 20 20 20 20  DELETE 3        
2910: 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 20 72 6f    /* Delete a ro
2920: 77 20 66 72 6f 6d 20 61 6e 20 61 75 78 2e 20 69  w from an aux. i
2930: 6e 64 65 78 20 62 2d 74 72 65 65 20 2a 2f 0a 23  ndex b-tree */.#
2940: 64 65 66 69 6e 65 20 52 42 55 5f 49 44 58 5f 49  define RBU_IDX_I
2950: 4e 53 45 52 54 20 34 20 20 20 20 20 20 20 20 20  NSERT 4         
2960: 20 2f 2a 20 49 6e 73 65 72 74 20 6f 6e 20 61 6e   /* Insert on an
2970: 20 61 75 78 2e 20 69 6e 64 65 78 20 62 2d 74 72   aux. index b-tr
2980: 65 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 52 42  ee */.#define RB
2990: 55 5f 55 50 44 41 54 45 20 20 20 20 20 35 20 20  U_UPDATE     5  
29a0: 20 20 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74          /* Updat
29b0: 65 20 61 20 72 6f 77 20 69 6e 20 61 20 6d 61 69  e a row in a mai
29c0: 6e 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20 2a  n table b-tree *
29d0: 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 41 20 73 69 6e 67  /.../*.** A sing
29e0: 6c 65 20 73 74 65 70 20 6f 66 20 61 6e 20 69 6e  le step of an in
29f0: 63 72 65 6d 65 6e 74 61 6c 20 63 68 65 63 6b 70  cremental checkp
2a00: 6f 69 6e 74 20 2d 20 66 72 61 6d 65 20 69 57 61  oint - frame iWa
2a10: 6c 46 72 61 6d 65 20 6f 66 20 74 68 65 20 77 61  lFrame of the wa
2a20: 6c 0a 2a 2a 20 66 69 6c 65 20 73 68 6f 75 6c 64  l.** file should
2a30: 20 62 65 20 63 6f 70 69 65 64 20 74 6f 20 70 61   be copied to pa
2a40: 67 65 20 69 44 62 50 61 67 65 20 6f 66 20 74 68  ge iDbPage of th
2a50: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2a60: 0a 2a 2f 0a 73 74 72 75 63 74 20 52 62 75 46 72  .*/.struct RbuFr
2a70: 61 6d 65 20 7b 0a 20 20 75 33 32 20 69 44 62 50  ame {.  u32 iDbP
2a80: 61 67 65 3b 0a 20 20 75 33 32 20 69 57 61 6c 46  age;.  u32 iWalF
2a90: 72 61 6d 65 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  rame;.};../*.** 
2aa0: 52 42 55 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73  RBU handle..*/.s
2ab0: 74 72 75 63 74 20 73 71 6c 69 74 65 33 72 62 75  truct sqlite3rbu
2ac0: 20 7b 0a 20 20 69 6e 74 20 65 53 74 61 67 65 3b   {.  int eStage;
2ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ae0: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66       /* Value of
2af0: 20 52 42 55 5f 53 54 41 54 45 5f 53 54 41 47 45   RBU_STATE_STAGE
2b00: 20 66 69 65 6c 64 20 2a 2f 0a 20 20 73 71 6c 69   field */.  sqli
2b10: 74 65 33 20 2a 64 62 4d 61 69 6e 3b 20 20 20 20  te3 *dbMain;    
2b20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74              /* t
2b30: 61 72 67 65 74 20 64 61 74 61 62 61 73 65 20 68  arget database h
2b40: 61 6e 64 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74  andle */.  sqlit
2b50: 65 33 20 2a 64 62 52 62 75 3b 20 20 20 20 20 20  e3 *dbRbu;      
2b60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72 62             /* rb
2b70: 75 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  u database handl
2b80: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 61  e */.  char *zTa
2b90: 72 67 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  rget;           
2ba0: 20 20 20 20 20 20 20 2f 2a 20 50 61 74 68 20 74         /* Path t
2bb0: 6f 20 74 61 72 67 65 74 20 64 62 20 2a 2f 0a 20  o target db */. 
2bc0: 20 63 68 61 72 20 2a 7a 52 62 75 3b 20 20 20 20   char *zRbu;    
2bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2be0: 20 2f 2a 20 50 61 74 68 20 74 6f 20 72 62 75 20   /* Path to rbu 
2bf0: 64 62 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53  db */.  char *zS
2c00: 74 61 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  tate;           
2c10: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 74 68 20          /* Path 
2c20: 74 6f 20 73 74 61 74 65 20 64 62 20 28 6f 72 20  to state db (or 
2c30: 4e 55 4c 4c 20 69 66 20 7a 52 62 75 29 20 2a 2f  NULL if zRbu) */
2c40: 0a 20 20 63 68 61 72 20 7a 53 74 61 74 65 44 62  .  char zStateDb
2c50: 5b 35 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  [5];            
2c60: 20 20 20 2f 2a 20 44 62 20 6e 61 6d 65 20 66 6f     /* Db name fo
2c70: 72 20 73 74 61 74 65 20 28 22 73 74 61 74 22 20  r state ("stat" 
2c80: 6f 72 20 22 6d 61 69 6e 22 29 20 2a 2f 0a 20 20  or "main") */.  
2c90: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
2ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cb0: 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65  /* Value returne
2cc0: 64 20 62 79 20 6c 61 73 74 20 72 62 75 5f 73 74  d by last rbu_st
2cd0: 65 70 28 29 20 63 61 6c 6c 20 2a 2f 0a 20 20 63  ep() call */.  c
2ce0: 68 61 72 20 2a 7a 45 72 72 6d 73 67 3b 20 20 20  har *zErrmsg;   
2cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2d00: 2a 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20  * Error message 
2d10: 69 66 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  if rc!=SQLITE_OK
2d20: 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 74 65 70 3b   */.  int nStep;
2d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d40: 20 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 70 72        /* Rows pr
2d50: 6f 63 65 73 73 65 64 20 66 6f 72 20 63 75 72 72  ocessed for curr
2d60: 65 6e 74 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ent object */.  
2d70: 69 6e 74 20 6e 50 72 6f 67 72 65 73 73 3b 20 20  int nProgress;  
2d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d90: 2f 2a 20 52 6f 77 73 20 70 72 6f 63 65 73 73 65  /* Rows processe
2da0: 64 20 66 6f 72 20 61 6c 6c 20 6f 62 6a 65 63 74  d for all object
2db0: 73 20 2a 2f 0a 20 20 52 62 75 4f 62 6a 49 74 65  s */.  RbuObjIte
2dc0: 72 20 6f 62 6a 69 74 65 72 3b 20 20 20 20 20 20  r objiter;      
2dd0: 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
2de0: 6f 72 20 66 6f 72 20 73 6b 69 70 70 69 6e 67 20  or for skipping 
2df0: 74 68 72 6f 75 67 68 20 74 62 6c 2f 69 64 78 20  through tbl/idx 
2e00: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
2e10: 2a 7a 56 66 73 4e 61 6d 65 3b 20 20 20 20 20 20  *zVfsName;      
2e20: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
2e30: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 72  automatically cr
2e40: 65 61 74 65 64 20 72 62 75 20 76 66 73 20 2a 2f  eated rbu vfs */
2e50: 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 54 61  .  rbu_file *pTa
2e60: 72 67 65 74 46 64 3b 20 20 20 20 20 20 20 20 20  rgetFd;         
2e70: 20 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c     /* File handl
2e80: 65 20 6f 70 65 6e 20 6f 6e 20 74 61 72 67 65 74  e open on target
2e90: 20 64 62 20 2a 2f 0a 20 20 69 36 34 20 69 4f 61   db */.  i64 iOa
2ea0: 6c 53 7a 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66  lSz;..  /* The f
2eb0: 6f 6c 6c 6f 77 69 6e 67 20 73 74 61 74 65 20 76  ollowing state v
2ec0: 61 72 69 61 62 6c 65 73 20 61 72 65 20 75 73 65  ariables are use
2ed0: 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  d as part of the
2ee0: 20 69 6e 63 72 65 6d 65 6e 74 61 6c 0a 20 20 2a   incremental.  *
2ef0: 2a 20 63 68 65 63 6b 70 6f 69 6e 74 20 73 74 61  * checkpoint sta
2f00: 67 65 20 28 65 53 74 61 67 65 3d 3d 52 42 55 5f  ge (eStage==RBU_
2f10: 53 54 41 47 45 5f 43 4b 50 54 29 2e 20 53 65 65  STAGE_CKPT). See
2f20: 20 63 6f 6d 6d 65 6e 74 73 20 73 75 72 72 6f 75   comments surrou
2f30: 6e 64 69 6e 67 0a 20 20 2a 2a 20 66 75 6e 63 74  nding.  ** funct
2f40: 69 6f 6e 20 72 62 75 53 65 74 75 70 43 68 65 63  ion rbuSetupChec
2f50: 6b 70 6f 69 6e 74 28 29 20 66 6f 72 20 64 65 74  kpoint() for det
2f60: 61 69 6c 73 2e 20 20 2a 2f 0a 20 20 75 33 32 20  ails.  */.  u32 
2f70: 69 4d 61 78 46 72 61 6d 65 3b 20 20 20 20 20 20  iMaxFrame;      
2f80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
2f90: 61 72 67 65 73 74 20 69 57 61 6c 46 72 61 6d 65  argest iWalFrame
2fa0: 20 76 61 6c 75 65 20 69 6e 20 61 46 72 61 6d 65   value in aFrame
2fb0: 5b 5d 20 2a 2f 0a 20 20 75 33 32 20 6d 4c 6f 63  [] */.  u32 mLoc
2fc0: 6b 3b 0a 20 20 69 6e 74 20 6e 46 72 61 6d 65 3b  k;.  int nFrame;
2fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fe0: 20 20 20 20 20 2f 2a 20 45 6e 74 72 69 65 73 20       /* Entries 
2ff0: 69 6e 20 61 46 72 61 6d 65 5b 5d 20 61 72 72 61  in aFrame[] arra
3000: 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 61 6d  y */.  int nFram
3010: 65 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20 20  eAlloc;         
3020: 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61         /* Alloca
3030: 74 65 64 20 73 69 7a 65 20 6f 66 20 61 46 72 61  ted size of aFra
3040: 6d 65 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20  me[] array */.  
3050: 52 62 75 46 72 61 6d 65 20 2a 61 46 72 61 6d 65  RbuFrame *aFrame
3060: 3b 0a 20 20 69 6e 74 20 70 67 73 7a 3b 0a 20 20  ;.  int pgsz;.  
3070: 75 38 20 2a 61 42 75 66 3b 0a 20 20 69 36 34 20  u8 *aBuf;.  i64 
3080: 69 57 61 6c 43 6b 73 75 6d 3b 0a 7d 3b 0a 0a 2f  iWalCksum;.};../
3090: 2a 0a 2a 2a 20 41 6e 20 72 62 75 20 56 46 53 20  *.** An rbu VFS 
30a0: 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75  is implemented u
30b0: 73 69 6e 67 20 61 6e 20 69 6e 73 74 61 6e 63 65  sing an instance
30c0: 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75   of this structu
30d0: 72 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 72 62  re..*/.struct rb
30e0: 75 5f 76 66 73 20 7b 0a 20 20 73 71 6c 69 74 65  u_vfs {.  sqlite
30f0: 33 5f 76 66 73 20 62 61 73 65 3b 20 20 20 20 20  3_vfs base;     
3100: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72 62 75            /* rbu
3110: 20 56 46 53 20 73 68 69 6d 20 6d 65 74 68 6f 64   VFS shim method
3120: 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  s */.  sqlite3_v
3130: 66 73 20 2a 70 52 65 61 6c 56 66 73 3b 20 20 20  fs *pRealVfs;   
3140: 20 20 20 20 20 20 20 2f 2a 20 55 6e 64 65 72 6c         /* Underl
3150: 79 69 6e 67 20 56 46 53 20 2a 2f 0a 20 20 73 71  ying VFS */.  sq
3160: 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
3170: 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ex;           /*
3180: 20 4d 75 74 65 78 20 74 6f 20 70 72 6f 74 65 63   Mutex to protec
3190: 74 20 70 4d 61 69 6e 20 2a 2f 0a 20 20 72 62 75  t pMain */.  rbu
31a0: 5f 66 69 6c 65 20 2a 70 4d 61 69 6e 3b 20 20 20  _file *pMain;   
31b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31c0: 4c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 6d  Linked list of m
31d0: 61 69 6e 20 64 62 20 66 69 6c 65 73 20 2a 2f 0a  ain db files */.
31e0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 66  };../*.** Each f
31f0: 69 6c 65 20 6f 70 65 6e 65 64 20 62 79 20 61 6e  ile opened by an
3200: 20 72 62 75 20 56 46 53 20 69 73 20 72 65 70 72   rbu VFS is repr
3210: 65 73 65 6e 74 65 64 20 62 79 20 61 6e 20 69 6e  esented by an in
3220: 73 74 61 6e 63 65 20 6f 66 0a 2a 2a 20 74 68 65  stance of.** the
3230: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
3240: 74 75 72 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  ture..*/.struct 
3250: 72 62 75 5f 66 69 6c 65 20 7b 0a 20 20 73 71 6c  rbu_file {.  sql
3260: 69 74 65 33 5f 66 69 6c 65 20 62 61 73 65 3b 20  ite3_file base; 
3270: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3280: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65 74  sqlite3_file met
3290: 68 6f 64 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  hods */.  sqlite
32a0: 33 5f 66 69 6c 65 20 2a 70 52 65 61 6c 3b 20 20  3_file *pReal;  
32b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 64            /* Und
32c0: 65 72 6c 79 69 6e 67 20 66 69 6c 65 20 68 61 6e  erlying file han
32d0: 64 6c 65 20 2a 2f 0a 20 20 72 62 75 5f 76 66 73  dle */.  rbu_vfs
32e0: 20 2a 70 52 62 75 56 66 73 3b 20 20 20 20 20 20   *pRbuVfs;      
32f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
3300: 74 65 72 20 74 6f 20 74 68 65 20 72 62 75 5f 76  ter to the rbu_v
3310: 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73  fs object */.  s
3320: 71 6c 69 74 65 33 72 62 75 20 2a 70 52 62 75 3b  qlite3rbu *pRbu;
3330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3340: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 72 62 75  * Pointer to rbu
3350: 20 6f 62 6a 65 63 74 20 28 72 62 75 20 74 61 72   object (rbu tar
3360: 67 65 74 20 6f 6e 6c 79 29 20 2a 2f 0a 0a 20 20  get only) */..  
3370: 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 3b 20 20  int openFlags;  
3380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3390: 2f 2a 20 46 6c 61 67 73 20 74 68 69 73 20 66 69  /* Flags this fi
33a0: 6c 65 20 77 61 73 20 6f 70 65 6e 65 64 20 77 69  le was opened wi
33b0: 74 68 20 2a 2f 0a 20 20 75 33 32 20 69 43 6f 6f  th */.  u32 iCoo
33c0: 6b 69 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  kie;            
33d0: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6f 6b 69          /* Cooki
33e0: 65 20 76 61 6c 75 65 20 66 6f 72 20 6d 61 69 6e  e value for main
33f0: 20 64 62 20 66 69 6c 65 73 20 2a 2f 0a 20 20 75   db files */.  u
3400: 38 20 69 57 72 69 74 65 56 65 72 3b 20 20 20 20  8 iWriteVer;    
3410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3420: 2a 20 22 77 72 69 74 65 2d 76 65 72 73 69 6f 6e  * "write-version
3430: 22 20 76 61 6c 75 65 20 66 6f 72 20 6d 61 69 6e  " value for main
3440: 20 64 62 20 66 69 6c 65 73 20 2a 2f 0a 0a 20 20   db files */..  
3450: 69 6e 74 20 6e 53 68 6d 3b 20 20 20 20 20 20 20  int nShm;       
3460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3470: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74  /* Number of ent
3480: 72 69 65 73 20 69 6e 20 61 70 53 68 6d 5b 5d 20  ries in apShm[] 
3490: 61 72 72 61 79 20 2a 2f 0a 20 20 63 68 61 72 20  array */.  char 
34a0: 2a 2a 61 70 53 68 6d 3b 20 20 20 20 20 20 20 20  **apShm;        
34b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
34c0: 72 61 79 20 6f 66 20 6d 6d 61 70 27 64 20 2a 2d  ray of mmap'd *-
34d0: 73 68 6d 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20  shm regions */. 
34e0: 20 63 68 61 72 20 2a 7a 44 65 6c 3b 20 20 20 20   char *zDel;    
34f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3500: 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 69 73 20   /* Delete this 
3510: 77 68 65 6e 20 63 6c 6f 73 69 6e 67 20 66 69 6c  when closing fil
3520: 65 20 2a 2f 0a 0a 20 20 63 6f 6e 73 74 20 63 68  e */..  const ch
3530: 61 72 20 2a 7a 57 61 6c 3b 20 20 20 20 20 20 20  ar *zWal;       
3540: 20 20 20 20 20 20 20 20 2f 2a 20 57 61 6c 20 66          /* Wal f
3550: 69 6c 65 6e 61 6d 65 20 66 6f 72 20 74 68 69 73  ilename for this
3560: 20 6d 61 69 6e 20 64 62 20 66 69 6c 65 20 2a 2f   main db file */
3570: 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 57 61  .  rbu_file *pWa
3580: 6c 46 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  lFd;            
3590: 20 20 20 2f 2a 20 57 61 6c 20 66 69 6c 65 20 64     /* Wal file d
35a0: 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68  escriptor for th
35b0: 69 73 20 6d 61 69 6e 20 64 62 20 2a 2f 0a 20 20  is main db */.  
35c0: 72 62 75 5f 66 69 6c 65 20 2a 70 4d 61 69 6e 4e  rbu_file *pMainN
35d0: 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ext;            
35e0: 2f 2a 20 4e 65 78 74 20 4d 41 49 4e 5f 44 42 20  /* Next MAIN_DB 
35f0: 66 69 6c 65 20 2a 2f 0a 7d 3b 0a 0a 0a 2f 2a 2a  file */.};.../**
3600: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3610: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3620: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3630: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3640: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 66  *******.** The f
3650: 6f 6c 6c 6f 77 69 6e 67 20 74 68 72 65 65 20 66  ollowing three f
3660: 75 6e 63 74 69 6f 6e 73 2c 20 66 6f 75 6e 64 20  unctions, found 
3670: 62 65 6c 6f 77 3a 0a 2a 2a 0a 2a 2a 20 20 20 72  below:.**.**   r
3680: 62 75 44 65 6c 74 61 47 65 74 49 6e 74 28 29 0a  buDeltaGetInt().
3690: 2a 2a 20 20 20 72 62 75 44 65 6c 74 61 43 68 65  **   rbuDeltaChe
36a0: 63 6b 73 75 6d 28 29 0a 2a 2a 20 20 20 72 62 75  cksum().**   rbu
36b0: 44 65 6c 74 61 41 70 70 6c 79 28 29 0a 2a 2a 0a  DeltaApply().**.
36c0: 2a 2a 20 61 72 65 20 6c 69 66 74 65 64 20 66 72  ** are lifted fr
36d0: 6f 6d 20 74 68 65 20 66 6f 73 73 69 6c 20 73 6f  om the fossil so
36e0: 75 72 63 65 20 63 6f 64 65 20 28 68 74 74 70 3a  urce code (http:
36f0: 2f 2f 66 6f 73 73 69 6c 2d 73 63 6d 2e 6f 72 67  //fossil-scm.org
3700: 29 2e 20 54 68 65 79 0a 2a 2a 20 61 72 65 20 75  ). They.** are u
3710: 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
3720: 20 74 68 65 20 73 63 61 6c 61 72 20 53 51 4c 20   the scalar SQL 
3730: 66 75 6e 63 74 69 6f 6e 20 72 62 75 5f 66 6f 73  function rbu_fos
3740: 73 69 6c 5f 64 65 6c 74 61 28 29 2e 0a 2a 2f 0a  sil_delta()..*/.
3750: 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 62 79 74 65  ./*.** Read byte
3760: 73 20 66 72 6f 6d 20 2a 70 7a 20 61 6e 64 20 63  s from *pz and c
3770: 6f 6e 76 65 72 74 20 74 68 65 6d 20 69 6e 74 6f  onvert them into
3780: 20 61 20 70 6f 73 69 74 69 76 65 20 69 6e 74 65   a positive inte
3790: 67 65 72 2e 20 20 57 68 65 6e 0a 2a 2a 20 66 69  ger.  When.** fi
37a0: 6e 69 73 68 65 64 2c 20 6c 65 61 76 65 20 2a 70  nished, leave *p
37b0: 7a 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  z pointing to th
37c0: 65 20 66 69 72 73 74 20 63 68 61 72 61 63 74 65  e first characte
37d0: 72 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  r past the end o
37e0: 66 0a 2a 2a 20 74 68 65 20 69 6e 74 65 67 65 72  f.** the integer
37f0: 2e 20 20 54 68 65 20 2a 70 4c 65 6e 20 70 61 72  .  The *pLen par
3800: 61 6d 65 74 65 72 20 68 6f 6c 64 73 20 74 68 65  ameter holds the
3810: 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 73   length of the s
3820: 74 72 69 6e 67 0a 2a 2a 20 69 6e 20 2a 70 7a 20  tring.** in *pz 
3830: 61 6e 64 20 69 73 20 64 65 63 72 65 6d 65 6e 74  and is decrement
3840: 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ed once for each
3850: 20 63 68 61 72 61 63 74 65 72 20 69 6e 20 74 68   character in th
3860: 65 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 73 74  e integer..*/.st
3870: 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20 69 6e  atic unsigned in
3880: 74 20 72 62 75 44 65 6c 74 61 47 65 74 49 6e 74  t rbuDeltaGetInt
3890: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a  (const char **pz
38a0: 2c 20 69 6e 74 20 2a 70 4c 65 6e 29 7b 0a 20 20  , int *pLen){.  
38b0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 69 67  static const sig
38c0: 6e 65 64 20 63 68 61 72 20 7a 56 61 6c 75 65 5b  ned char zValue[
38d0: 5d 20 3d 20 7b 0a 20 20 20 20 2d 31 2c 20 2d 31  ] = {.    -1, -1
38e0: 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31  , -1, -1, -1, -1
38f0: 2c 20 2d 31 2c 20 2d 31 2c 20 20 20 2d 31 2c 20  , -1, -1,   -1, 
3900: 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20  -1, -1, -1, -1, 
3910: 2d 31 2c 20 2d 31 2c 20 2d 31 2c 0a 20 20 20 20  -1, -1, -1,.    
3920: 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20  -1, -1, -1, -1, 
3930: 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20  -1, -1, -1, -1, 
3940: 20 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31    -1, -1, -1, -1
3950: 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31  , -1, -1, -1, -1
3960: 2c 0a 20 20 20 20 2d 31 2c 20 2d 31 2c 20 2d 31  ,.    -1, -1, -1
3970: 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31  , -1, -1, -1, -1
3980: 2c 20 2d 31 2c 20 20 20 2d 31 2c 20 2d 31 2c 20  , -1,   -1, -1, 
3990: 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20  -1, -1, -1, -1, 
39a0: 2d 31 2c 20 2d 31 2c 0a 20 20 20 20 20 30 2c 20  -1, -1,.     0, 
39b0: 20 31 2c 20 20 32 2c 20 20 33 2c 20 20 34 2c 20   1,  2,  3,  4, 
39c0: 20 35 2c 20 20 36 2c 20 20 37 2c 20 20 20 20 38   5,  6,  7,    8
39d0: 2c 20 20 39 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31  ,  9, -1, -1, -1
39e0: 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 0a 20 20  , -1, -1, -1,.  
39f0: 20 20 2d 31 2c 20 31 30 2c 20 31 31 2c 20 31 32    -1, 10, 11, 12
3a00: 2c 20 31 33 2c 20 31 34 2c 20 31 35 2c 20 31 36  , 13, 14, 15, 16
3a10: 2c 20 20 20 31 37 2c 20 31 38 2c 20 31 39 2c 20  ,   17, 18, 19, 
3a20: 32 30 2c 20 32 31 2c 20 32 32 2c 20 32 33 2c 20  20, 21, 22, 23, 
3a30: 32 34 2c 0a 20 20 20 20 32 35 2c 20 32 36 2c 20  24,.    25, 26, 
3a40: 32 37 2c 20 32 38 2c 20 32 39 2c 20 33 30 2c 20  27, 28, 29, 30, 
3a50: 33 31 2c 20 33 32 2c 20 20 20 33 33 2c 20 33 34  31, 32,   33, 34
3a60: 2c 20 33 35 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31  , 35, -1, -1, -1
3a70: 2c 20 2d 31 2c 20 33 36 2c 0a 20 20 20 20 2d 31  , -1, 36,.    -1
3a80: 2c 20 33 37 2c 20 33 38 2c 20 33 39 2c 20 34 30  , 37, 38, 39, 40
3a90: 2c 20 34 31 2c 20 34 32 2c 20 34 33 2c 20 20 20  , 41, 42, 43,   
3aa0: 34 34 2c 20 34 35 2c 20 34 36 2c 20 34 37 2c 20  44, 45, 46, 47, 
3ab0: 34 38 2c 20 34 39 2c 20 35 30 2c 20 35 31 2c 0a  48, 49, 50, 51,.
3ac0: 20 20 20 20 35 32 2c 20 35 33 2c 20 35 34 2c 20      52, 53, 54, 
3ad0: 35 35 2c 20 35 36 2c 20 35 37 2c 20 35 38 2c 20  55, 56, 57, 58, 
3ae0: 35 39 2c 20 20 20 36 30 2c 20 36 31 2c 20 36 32  59,   60, 61, 62
3af0: 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 36 33  , -1, -1, -1, 63
3b00: 2c 20 2d 31 2c 0a 20 20 7d 3b 0a 20 20 75 6e 73  , -1,.  };.  uns
3b10: 69 67 6e 65 64 20 69 6e 74 20 76 20 3d 20 30 3b  igned int v = 0;
3b20: 0a 20 20 69 6e 74 20 63 3b 0a 20 20 75 6e 73 69  .  int c;.  unsi
3b30: 67 6e 65 64 20 63 68 61 72 20 2a 7a 20 3d 20 28  gned char *z = (
3b40: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 2a  unsigned char*)*
3b50: 70 7a 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  pz;.  unsigned c
3b60: 68 61 72 20 2a 7a 53 74 61 72 74 20 3d 20 7a 3b  har *zStart = z;
3b70: 0a 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20 7a  .  while( (c = z
3b80: 56 61 6c 75 65 5b 30 78 37 66 26 2a 28 7a 2b 2b  Value[0x7f&*(z++
3b90: 29 5d 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 76  )])>=0 ){.     v
3ba0: 20 3d 20 28 76 3c 3c 36 29 20 2b 20 63 3b 0a 20   = (v<<6) + c;. 
3bb0: 20 7d 0a 20 20 7a 2d 2d 3b 0a 20 20 2a 70 4c 65   }.  z--;.  *pLe
3bc0: 6e 20 2d 3d 20 7a 20 2d 20 7a 53 74 61 72 74 3b  n -= z - zStart;
3bd0: 0a 20 20 2a 70 7a 20 3d 20 28 63 68 61 72 2a 29  .  *pz = (char*)
3be0: 7a 3b 0a 20 20 72 65 74 75 72 6e 20 76 3b 0a 7d  z;.  return v;.}
3bf0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20  ../*.** Compute 
3c00: 61 20 33 32 2d 62 69 74 20 63 68 65 63 6b 73 75  a 32-bit checksu
3c10: 6d 20 6f 6e 20 74 68 65 20 4e 2d 62 79 74 65 20  m on the N-byte 
3c20: 62 75 66 66 65 72 2e 20 20 52 65 74 75 72 6e 20  buffer.  Return 
3c30: 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73  the result..*/.s
3c40: 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20 69  tatic unsigned i
3c50: 6e 74 20 72 62 75 44 65 6c 74 61 43 68 65 63 6b  nt rbuDeltaCheck
3c60: 73 75 6d 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  sum(const char *
3c70: 7a 49 6e 2c 20 73 69 7a 65 5f 74 20 4e 29 7b 0a  zIn, size_t N){.
3c80: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
3c90: 20 63 68 61 72 20 2a 7a 20 3d 20 28 63 6f 6e 73   char *z = (cons
3ca0: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
3cb0: 2a 29 7a 49 6e 3b 0a 20 20 75 6e 73 69 67 6e 65  *)zIn;.  unsigne
3cc0: 64 20 73 75 6d 30 20 3d 20 30 3b 0a 20 20 75 6e  d sum0 = 0;.  un
3cd0: 73 69 67 6e 65 64 20 73 75 6d 31 20 3d 20 30 3b  signed sum1 = 0;
3ce0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 73 75 6d 32  .  unsigned sum2
3cf0: 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64   = 0;.  unsigned
3d00: 20 73 75 6d 33 20 3d 20 30 3b 0a 20 20 77 68 69   sum3 = 0;.  whi
3d10: 6c 65 28 4e 20 3e 3d 20 31 36 29 7b 0a 20 20 20  le(N >= 16){.   
3d20: 20 73 75 6d 30 20 2b 3d 20 28 28 75 6e 73 69 67   sum0 += ((unsig
3d30: 6e 65 64 29 7a 5b 30 5d 20 2b 20 7a 5b 34 5d 20  ned)z[0] + z[4] 
3d40: 2b 20 7a 5b 38 5d 20 2b 20 7a 5b 31 32 5d 29 3b  + z[8] + z[12]);
3d50: 0a 20 20 20 20 73 75 6d 31 20 2b 3d 20 28 28 75  .    sum1 += ((u
3d60: 6e 73 69 67 6e 65 64 29 7a 5b 31 5d 20 2b 20 7a  nsigned)z[1] + z
3d70: 5b 35 5d 20 2b 20 7a 5b 39 5d 20 2b 20 7a 5b 31  [5] + z[9] + z[1
3d80: 33 5d 29 3b 0a 20 20 20 20 73 75 6d 32 20 2b 3d  3]);.    sum2 +=
3d90: 20 28 28 75 6e 73 69 67 6e 65 64 29 7a 5b 32 5d   ((unsigned)z[2]
3da0: 20 2b 20 7a 5b 36 5d 20 2b 20 7a 5b 31 30 5d 2b   + z[6] + z[10]+
3db0: 20 7a 5b 31 34 5d 29 3b 0a 20 20 20 20 73 75 6d   z[14]);.    sum
3dc0: 33 20 2b 3d 20 28 28 75 6e 73 69 67 6e 65 64 29  3 += ((unsigned)
3dd0: 7a 5b 33 5d 20 2b 20 7a 5b 37 5d 20 2b 20 7a 5b  z[3] + z[7] + z[
3de0: 31 31 5d 2b 20 7a 5b 31 35 5d 29 3b 0a 20 20 20  11]+ z[15]);.   
3df0: 20 7a 20 2b 3d 20 31 36 3b 0a 20 20 20 20 4e 20   z += 16;.    N 
3e00: 2d 3d 20 31 36 3b 0a 20 20 7d 0a 20 20 77 68 69  -= 16;.  }.  whi
3e10: 6c 65 28 4e 20 3e 3d 20 34 29 7b 0a 20 20 20 20  le(N >= 4){.    
3e20: 73 75 6d 30 20 2b 3d 20 7a 5b 30 5d 3b 0a 20 20  sum0 += z[0];.  
3e30: 20 20 73 75 6d 31 20 2b 3d 20 7a 5b 31 5d 3b 0a    sum1 += z[1];.
3e40: 20 20 20 20 73 75 6d 32 20 2b 3d 20 7a 5b 32 5d      sum2 += z[2]
3e50: 3b 0a 20 20 20 20 73 75 6d 33 20 2b 3d 20 7a 5b  ;.    sum3 += z[
3e60: 33 5d 3b 0a 20 20 20 20 7a 20 2b 3d 20 34 3b 0a  3];.    z += 4;.
3e70: 20 20 20 20 4e 20 2d 3d 20 34 3b 0a 20 20 7d 0a      N -= 4;.  }.
3e80: 20 20 73 75 6d 33 20 2b 3d 20 28 73 75 6d 32 20    sum3 += (sum2 
3e90: 3c 3c 20 38 29 20 2b 20 28 73 75 6d 31 20 3c 3c  << 8) + (sum1 <<
3ea0: 20 31 36 29 20 2b 20 28 73 75 6d 30 20 3c 3c 20   16) + (sum0 << 
3eb0: 32 34 29 3b 0a 20 20 73 77 69 74 63 68 28 4e 29  24);.  switch(N)
3ec0: 7b 0a 20 20 20 20 63 61 73 65 20 33 3a 20 20 20  {.    case 3:   
3ed0: 73 75 6d 33 20 2b 3d 20 28 7a 5b 32 5d 20 3c 3c  sum3 += (z[2] <<
3ee0: 20 38 29 3b 0a 20 20 20 20 63 61 73 65 20 32 3a   8);.    case 2:
3ef0: 20 20 20 73 75 6d 33 20 2b 3d 20 28 7a 5b 31 5d     sum3 += (z[1]
3f00: 20 3c 3c 20 31 36 29 3b 0a 20 20 20 20 63 61 73   << 16);.    cas
3f10: 65 20 31 3a 20 20 20 73 75 6d 33 20 2b 3d 20 28  e 1:   sum3 += (
3f20: 7a 5b 30 5d 20 3c 3c 20 32 34 29 3b 0a 20 20 20  z[0] << 24);.   
3f30: 20 64 65 66 61 75 6c 74 3a 20 20 3b 0a 20 20 7d   default:  ;.  }
3f40: 0a 20 20 72 65 74 75 72 6e 20 73 75 6d 33 3b 0a  .  return sum3;.
3f50: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 6c 79 20 61  }../*.** Apply a
3f60: 20 64 65 6c 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68   delta..**.** Th
3f70: 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20  e output buffer 
3f80: 73 68 6f 75 6c 64 20 62 65 20 62 69 67 20 65 6e  should be big en
3f90: 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65  ough to hold the
3fa0: 20 77 68 6f 6c 65 20 6f 75 74 70 75 74 0a 2a 2a   whole output.**
3fb0: 20 66 69 6c 65 20 61 6e 64 20 61 20 4e 55 4c 20   file and a NUL 
3fc0: 74 65 72 6d 69 6e 61 74 6f 72 20 61 74 20 74 68  terminator at th
3fd0: 65 20 65 6e 64 2e 20 20 54 68 65 20 64 65 6c 74  e end.  The delt
3fe0: 61 5f 6f 75 74 70 75 74 5f 73 69 7a 65 28 29 0a  a_output_size().
3ff0: 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  ** routine will 
4000: 64 65 74 65 72 6d 69 6e 65 20 74 68 69 73 20 73  determine this s
4010: 69 7a 65 20 66 6f 72 20 79 6f 75 2e 0a 2a 2a 0a  ize for you..**.
4020: 2a 2a 20 54 68 65 20 64 65 6c 74 61 20 73 74 72  ** The delta str
4030: 69 6e 67 20 73 68 6f 75 6c 64 20 62 65 20 6e 75  ing should be nu
4040: 6c 6c 2d 74 65 72 6d 69 6e 61 74 65 64 2e 20 20  ll-terminated.  
4050: 42 75 74 20 74 68 65 20 64 65 6c 74 61 20 73 74  But the delta st
4060: 72 69 6e 67 0a 2a 2a 20 6d 61 79 20 63 6f 6e 74  ring.** may cont
4070: 61 69 6e 20 65 6d 62 65 64 64 65 64 20 4e 55 4c  ain embedded NUL
4080: 20 63 68 61 72 61 63 74 65 72 73 20 28 69 66 20   characters (if 
4090: 74 68 65 20 69 6e 70 75 74 20 61 6e 64 20 6f 75  the input and ou
40a0: 74 70 75 74 20 61 72 65 0a 2a 2a 20 62 69 6e 61  tput are.** bina
40b0: 72 79 20 66 69 6c 65 73 29 20 73 6f 20 77 65 20  ry files) so we 
40c0: 61 6c 73 6f 20 68 61 76 65 20 74 6f 20 70 61 73  also have to pas
40d0: 73 20 69 6e 20 74 68 65 20 6c 65 6e 67 74 68 20  s in the length 
40e0: 6f 66 20 74 68 65 20 64 65 6c 74 61 20 69 6e 0a  of the delta in.
40f0: 2a 2a 20 74 68 65 20 6c 65 6e 44 65 6c 74 61 20  ** the lenDelta 
4100: 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a  parameter..**.**
4110: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
4120: 65 74 75 72 6e 73 20 74 68 65 20 73 69 7a 65 20  eturns the size 
4130: 6f 66 20 74 68 65 20 6f 75 74 70 75 74 20 66 69  of the output fi
4140: 6c 65 20 69 6e 20 62 79 74 65 73 20 28 65 78 63  le in bytes (exc
4150: 6c 75 64 69 6e 67 0a 2a 2a 20 74 68 65 20 66 69  luding.** the fi
4160: 6e 61 6c 20 4e 55 4c 20 74 65 72 6d 69 6e 61 74  nal NUL terminat
4170: 6f 72 20 63 68 61 72 61 63 74 65 72 29 2e 20 20  or character).  
4180: 45 78 63 65 70 74 2c 20 69 66 20 74 68 65 20 64  Except, if the d
4190: 65 6c 74 61 20 73 74 72 69 6e 67 20 69 73 0a 2a  elta string is.*
41a0: 2a 20 6d 61 6c 66 6f 72 6d 65 64 20 6f 72 20 69  * malformed or i
41b0: 6e 74 65 6e 64 65 64 20 66 6f 72 20 75 73 65 20  ntended for use 
41c0: 77 69 74 68 20 61 20 73 6f 75 72 63 65 20 66 69  with a source fi
41d0: 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20 7a 53  le other than zS
41e0: 72 63 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73  rc,.** then this
41f0: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
4200: 20 2d 31 2e 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72   -1..**.** Refer
4210: 20 74 6f 20 74 68 65 20 64 65 6c 74 61 5f 63 72   to the delta_cr
4220: 65 61 74 65 28 29 20 64 6f 63 75 6d 65 6e 74 61  eate() documenta
4230: 74 69 6f 6e 20 61 62 6f 76 65 20 66 6f 72 20 61  tion above for a
4240: 20 64 65 73 63 72 69 70 74 69 6f 6e 0a 2a 2a 20   description.** 
4250: 6f 66 20 74 68 65 20 64 65 6c 74 61 20 66 69 6c  of the delta fil
4260: 65 20 66 6f 72 6d 61 74 2e 0a 2a 2f 0a 73 74 61  e format..*/.sta
4270: 74 69 63 20 69 6e 74 20 72 62 75 44 65 6c 74 61  tic int rbuDelta
4280: 41 70 70 6c 79 28 0a 20 20 63 6f 6e 73 74 20 63  Apply(.  const c
4290: 68 61 72 20 2a 7a 53 72 63 2c 20 20 20 20 20 20  har *zSrc,      
42a0: 2f 2a 20 54 68 65 20 73 6f 75 72 63 65 20 6f 72  /* The source or
42b0: 20 70 61 74 74 65 72 6e 20 66 69 6c 65 20 2a 2f   pattern file */
42c0: 0a 20 20 69 6e 74 20 6c 65 6e 53 72 63 2c 20 20  .  int lenSrc,  
42d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e            /* Len
42e0: 67 74 68 20 6f 66 20 74 68 65 20 73 6f 75 72 63  gth of the sourc
42f0: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73  e file */.  cons
4300: 74 20 63 68 61 72 20 2a 7a 44 65 6c 74 61 2c 20  t char *zDelta, 
4310: 20 20 20 2f 2a 20 44 65 6c 74 61 20 74 6f 20 61     /* Delta to a
4320: 70 70 6c 79 20 74 6f 20 74 68 65 20 70 61 74 74  pply to the patt
4330: 65 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 6e  ern */.  int len
4340: 44 65 6c 74 61 2c 20 20 20 20 20 20 20 20 20 20  Delta,          
4350: 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74 68 65  /* Length of the
4360: 20 64 65 6c 74 61 20 2a 2f 0a 20 20 63 68 61 72   delta */.  char
4370: 20 2a 7a 4f 75 74 20 20 20 20 20 20 20 20 20 20   *zOut          
4380: 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
4390: 6f 75 74 70 75 74 20 69 6e 74 6f 20 74 68 69 73  output into this
43a0: 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 62 75   preallocated bu
43b0: 66 66 65 72 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73  ffer */.){.  uns
43c0: 69 67 6e 65 64 20 69 6e 74 20 6c 69 6d 69 74 3b  igned int limit;
43d0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  .  unsigned int 
43e0: 74 6f 74 61 6c 20 3d 20 30 3b 0a 23 69 66 6e 64  total = 0;.#ifnd
43f0: 65 66 20 46 4f 53 53 49 4c 5f 4f 4d 49 54 5f 44  ef FOSSIL_OMIT_D
4400: 45 4c 54 41 5f 43 4b 53 55 4d 5f 54 45 53 54 0a  ELTA_CKSUM_TEST.
4410: 20 20 63 68 61 72 20 2a 7a 4f 72 69 67 4f 75 74    char *zOrigOut
4420: 20 3d 20 7a 4f 75 74 3b 0a 23 65 6e 64 69 66 0a   = zOut;.#endif.
4430: 0a 20 20 6c 69 6d 69 74 20 3d 20 72 62 75 44 65  .  limit = rbuDe
4440: 6c 74 61 47 65 74 49 6e 74 28 26 7a 44 65 6c 74  ltaGetInt(&zDelt
4450: 61 2c 20 26 6c 65 6e 44 65 6c 74 61 29 3b 0a 20  a, &lenDelta);. 
4460: 20 69 66 28 20 2a 7a 44 65 6c 74 61 21 3d 27 5c   if( *zDelta!='\
4470: 6e 27 20 29 7b 0a 20 20 20 20 2f 2a 20 45 52 52  n' ){.    /* ERR
4480: 4f 52 3a 20 73 69 7a 65 20 69 6e 74 65 67 65 72  OR: size integer
4490: 20 6e 6f 74 20 74 65 72 6d 69 6e 61 74 65 64 20   not terminated 
44a0: 62 79 20 22 5c 6e 22 20 2a 2f 0a 20 20 20 20 72  by "\n" */.    r
44b0: 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20  eturn -1;.  }.  
44c0: 7a 44 65 6c 74 61 2b 2b 3b 20 6c 65 6e 44 65 6c  zDelta++; lenDel
44d0: 74 61 2d 2d 3b 0a 20 20 77 68 69 6c 65 28 20 2a  ta--;.  while( *
44e0: 7a 44 65 6c 74 61 20 26 26 20 6c 65 6e 44 65 6c  zDelta && lenDel
44f0: 74 61 3e 30 20 29 7b 0a 20 20 20 20 75 6e 73 69  ta>0 ){.    unsi
4500: 67 6e 65 64 20 69 6e 74 20 63 6e 74 2c 20 6f 66  gned int cnt, of
4510: 73 74 3b 0a 20 20 20 20 63 6e 74 20 3d 20 72 62  st;.    cnt = rb
4520: 75 44 65 6c 74 61 47 65 74 49 6e 74 28 26 7a 44  uDeltaGetInt(&zD
4530: 65 6c 74 61 2c 20 26 6c 65 6e 44 65 6c 74 61 29  elta, &lenDelta)
4540: 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20 7a 44  ;.    switch( zD
4550: 65 6c 74 61 5b 30 5d 20 29 7b 0a 20 20 20 20 20  elta[0] ){.     
4560: 20 63 61 73 65 20 27 40 27 3a 20 7b 0a 20 20 20   case '@': {.   
4570: 20 20 20 20 20 7a 44 65 6c 74 61 2b 2b 3b 20 6c       zDelta++; l
4580: 65 6e 44 65 6c 74 61 2d 2d 3b 0a 20 20 20 20 20  enDelta--;.     
4590: 20 20 20 6f 66 73 74 20 3d 20 72 62 75 44 65 6c     ofst = rbuDel
45a0: 74 61 47 65 74 49 6e 74 28 26 7a 44 65 6c 74 61  taGetInt(&zDelta
45b0: 2c 20 26 6c 65 6e 44 65 6c 74 61 29 3b 0a 20 20  , &lenDelta);.  
45c0: 20 20 20 20 20 20 69 66 28 20 6c 65 6e 44 65 6c        if( lenDel
45d0: 74 61 3e 30 20 26 26 20 7a 44 65 6c 74 61 5b 30  ta>0 && zDelta[0
45e0: 5d 21 3d 27 2c 27 20 29 7b 0a 20 20 20 20 20 20  ]!=',' ){.      
45f0: 20 20 20 20 2f 2a 20 45 52 52 4f 52 3a 20 63 6f      /* ERROR: co
4600: 70 79 20 63 6f 6d 6d 61 6e 64 20 6e 6f 74 20 74  py command not t
4610: 65 72 6d 69 6e 61 74 65 64 20 62 79 20 27 2c 27  erminated by ','
4620: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 65   */.          re
4630: 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 20  turn -1;.       
4640: 20 7d 0a 20 20 20 20 20 20 20 20 7a 44 65 6c 74   }.        zDelt
4650: 61 2b 2b 3b 20 6c 65 6e 44 65 6c 74 61 2d 2d 3b  a++; lenDelta--;
4660: 0a 20 20 20 20 20 20 20 20 74 6f 74 61 6c 20 2b  .        total +
4670: 3d 20 63 6e 74 3b 0a 20 20 20 20 20 20 20 20 69  = cnt;.        i
4680: 66 28 20 74 6f 74 61 6c 3e 6c 69 6d 69 74 20 29  f( total>limit )
4690: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45  {.          /* E
46a0: 52 52 4f 52 3a 20 63 6f 70 79 20 65 78 63 65 65  RROR: copy excee
46b0: 64 73 20 6f 75 74 70 75 74 20 66 69 6c 65 20 73  ds output file s
46c0: 69 7a 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ize */.         
46d0: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
46e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
46f0: 28 20 6f 66 73 74 2b 63 6e 74 20 3e 20 6c 65 6e  ( ofst+cnt > len
4700: 53 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Src ){.         
4710: 20 2f 2a 20 45 52 52 4f 52 3a 20 63 6f 70 79 20   /* ERROR: copy 
4720: 65 78 74 65 6e 64 73 20 70 61 73 74 20 65 6e 64  extends past end
4730: 20 6f 66 20 69 6e 70 75 74 20 2a 2f 0a 20 20 20   of input */.   
4740: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31         return -1
4750: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
4760: 20 20 20 20 6d 65 6d 63 70 79 28 7a 4f 75 74 2c      memcpy(zOut,
4770: 20 26 7a 53 72 63 5b 6f 66 73 74 5d 2c 20 63 6e   &zSrc[ofst], cn
4780: 74 29 3b 0a 20 20 20 20 20 20 20 20 7a 4f 75 74  t);.        zOut
4790: 20 2b 3d 20 63 6e 74 3b 0a 20 20 20 20 20 20 20   += cnt;.       
47a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
47b0: 20 20 20 20 20 20 63 61 73 65 20 27 3a 27 3a 20        case ':': 
47c0: 7b 0a 20 20 20 20 20 20 20 20 7a 44 65 6c 74 61  {.        zDelta
47d0: 2b 2b 3b 20 6c 65 6e 44 65 6c 74 61 2d 2d 3b 0a  ++; lenDelta--;.
47e0: 20 20 20 20 20 20 20 20 74 6f 74 61 6c 20 2b 3d          total +=
47f0: 20 63 6e 74 3b 0a 20 20 20 20 20 20 20 20 69 66   cnt;.        if
4800: 28 20 74 6f 74 61 6c 3e 6c 69 6d 69 74 20 29 7b  ( total>limit ){
4810: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 52  .          /* ER
4820: 52 4f 52 3a 20 20 69 6e 73 65 72 74 20 63 6f 6d  ROR:  insert com
4830: 6d 61 6e 64 20 67 69 76 65 73 20 61 6e 20 6f 75  mand gives an ou
4840: 74 70 75 74 20 6c 61 72 67 65 72 20 74 68 61 6e  tput larger than
4850: 20 70 72 65 64 69 63 74 65 64 20 2a 2f 0a 20 20   predicted */.  
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 69 66 28 20 63 6e 74 3e 6c 65 6e       if( cnt>len
4890: 44 65 6c 74 61 20 29 7b 0a 20 20 20 20 20 20 20  Delta ){.       
48a0: 20 20 20 2f 2a 20 45 52 52 4f 52 3a 20 69 6e 73     /* ERROR: ins
48b0: 65 72 74 20 63 6f 75 6e 74 20 65 78 63 65 65 64  ert count exceed
48c0: 73 20 73 69 7a 65 20 6f 66 20 64 65 6c 74 61 20  s size of delta 
48d0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  */.          ret
48e0: 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  urn -1;.        
48f0: 7d 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  }.        memcpy
4900: 28 7a 4f 75 74 2c 20 7a 44 65 6c 74 61 2c 20 63  (zOut, zDelta, c
4910: 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 7a 4f 75  nt);.        zOu
4920: 74 20 2b 3d 20 63 6e 74 3b 0a 20 20 20 20 20 20  t += cnt;.      
4930: 20 20 7a 44 65 6c 74 61 20 2b 3d 20 63 6e 74 3b    zDelta += cnt;
4940: 0a 20 20 20 20 20 20 20 20 6c 65 6e 44 65 6c 74  .        lenDelt
4950: 61 20 2d 3d 20 63 6e 74 3b 0a 20 20 20 20 20 20  a -= cnt;.      
4960: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
4970: 0a 20 20 20 20 20 20 63 61 73 65 20 27 3b 27 3a  .      case ';':
4980: 20 7b 0a 20 20 20 20 20 20 20 20 7a 44 65 6c 74   {.        zDelt
4990: 61 2b 2b 3b 20 6c 65 6e 44 65 6c 74 61 2d 2d 3b  a++; lenDelta--;
49a0: 0a 20 20 20 20 20 20 20 20 7a 4f 75 74 5b 30 5d  .        zOut[0]
49b0: 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 46 4f   = 0;.#ifndef FO
49c0: 53 53 49 4c 5f 4f 4d 49 54 5f 44 45 4c 54 41 5f  SSIL_OMIT_DELTA_
49d0: 43 4b 53 55 4d 5f 54 45 53 54 0a 20 20 20 20 20  CKSUM_TEST.     
49e0: 20 20 20 69 66 28 20 63 6e 74 21 3d 72 62 75 44     if( cnt!=rbuD
49f0: 65 6c 74 61 43 68 65 63 6b 73 75 6d 28 7a 4f 72  eltaChecksum(zOr
4a00: 69 67 4f 75 74 2c 20 74 6f 74 61 6c 29 20 29 7b  igOut, total) ){
4a10: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 52  .          /* ER
4a20: 52 4f 52 3a 20 20 62 61 64 20 63 68 65 63 6b 73  ROR:  bad checks
4a30: 75 6d 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  um */.          
4a40: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20  return -1;.     
4a50: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
4a60: 20 20 20 20 69 66 28 20 74 6f 74 61 6c 21 3d 6c      if( total!=l
4a70: 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20  imit ){.        
4a80: 20 20 2f 2a 20 45 52 52 4f 52 3a 20 67 65 6e 65    /* ERROR: gene
4a90: 72 61 74 65 64 20 73 69 7a 65 20 64 6f 65 73 20  rated size does 
4aa0: 6e 6f 74 20 6d 61 74 63 68 20 70 72 65 64 69 63  not match predic
4ab0: 74 65 64 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20  ted size */.    
4ac0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b        return -1;
4ad0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
4ae0: 20 20 20 72 65 74 75 72 6e 20 74 6f 74 61 6c 3b     return total;
4af0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64  .      }.      d
4b00: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
4b10: 20 20 2f 2a 20 45 52 52 4f 52 3a 20 75 6e 6b 6e    /* ERROR: unkn
4b20: 6f 77 6e 20 64 65 6c 74 61 20 6f 70 65 72 61 74  own delta operat
4b30: 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65  or */.        re
4b40: 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 7d  turn -1;.      }
4b50: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20  .    }.  }.  /* 
4b60: 45 52 52 4f 52 3a 20 75 6e 74 65 72 6d 69 6e 61  ERROR: untermina
4b70: 74 65 64 20 64 65 6c 74 61 20 2a 2f 0a 20 20 72  ted delta */.  r
4b80: 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 73 74 61  eturn -1;.}..sta
4b90: 74 69 63 20 69 6e 74 20 72 62 75 44 65 6c 74 61  tic int rbuDelta
4ba0: 4f 75 74 70 75 74 53 69 7a 65 28 63 6f 6e 73 74  OutputSize(const
4bb0: 20 63 68 61 72 20 2a 7a 44 65 6c 74 61 2c 20 69   char *zDelta, i
4bc0: 6e 74 20 6c 65 6e 44 65 6c 74 61 29 7b 0a 20 20  nt lenDelta){.  
4bd0: 69 6e 74 20 73 69 7a 65 3b 0a 20 20 73 69 7a 65  int size;.  size
4be0: 20 3d 20 72 62 75 44 65 6c 74 61 47 65 74 49 6e   = rbuDeltaGetIn
4bf0: 74 28 26 7a 44 65 6c 74 61 2c 20 26 6c 65 6e 44  t(&zDelta, &lenD
4c00: 65 6c 74 61 29 3b 0a 20 20 69 66 28 20 2a 7a 44  elta);.  if( *zD
4c10: 65 6c 74 61 21 3d 27 5c 6e 27 20 29 7b 0a 20 20  elta!='\n' ){.  
4c20: 20 20 2f 2a 20 45 52 52 4f 52 3a 20 73 69 7a 65    /* ERROR: size
4c30: 20 69 6e 74 65 67 65 72 20 6e 6f 74 20 74 65 72   integer not ter
4c40: 6d 69 6e 61 74 65 64 20 62 79 20 22 5c 6e 22 20  minated by "\n" 
4c50: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31  */.    return -1
4c60: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73  ;.  }.  return s
4c70: 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e  ize;.}../*.** En
4c80: 64 20 6f 66 20 63 6f 64 65 20 74 61 6b 65 6e 20  d of code taken 
4c90: 66 72 6f 6d 20 66 6f 73 73 69 6c 2e 0a 2a 2a 2a  from fossil..***
4ca0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4cb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4cc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4cd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4ce0: 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49  ******/../*.** I
4cf0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
4d00: 20 53 51 4c 20 73 63 61 6c 61 72 20 66 75 6e 63   SQL scalar func
4d10: 74 69 6f 6e 20 72 62 75 5f 66 6f 73 73 69 6c 5f  tion rbu_fossil_
4d20: 64 65 6c 74 61 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  delta()..**.** T
4d30: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 70 70  his function app
4d40: 6c 69 65 73 20 61 20 66 6f 73 73 69 6c 20 64 65  lies a fossil de
4d50: 6c 74 61 20 70 61 74 63 68 20 74 6f 20 61 20 62  lta patch to a b
4d60: 6c 6f 62 2e 20 45 78 61 63 74 6c 79 20 74 77 6f  lob. Exactly two
4d70: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20 6d 75  .** arguments mu
4d80: 73 74 20 62 65 20 70 61 73 73 65 64 20 74 6f 20  st be passed to 
4d90: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 54  this function. T
4da0: 68 65 20 66 69 72 73 74 20 69 73 20 74 68 65 20  he first is the 
4db0: 62 6c 6f 62 20 74 6f 0a 2a 2a 20 70 61 74 63 68  blob to.** patch
4dc0: 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20   and the second 
4dd0: 74 68 65 20 70 61 74 63 68 20 74 6f 20 61 70 70  the patch to app
4de0: 6c 79 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72 20  ly. If no error 
4df0: 6f 63 63 75 72 73 2c 20 74 68 69 73 0a 2a 2a 20  occurs, this.** 
4e00: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
4e10: 20 74 68 65 20 70 61 74 63 68 65 64 20 62 6c 6f   the patched blo
4e20: 62 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  b..*/.static voi
4e30: 64 20 72 62 75 46 6f 73 73 69 6c 44 65 6c 74 61  d rbuFossilDelta
4e40: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
4e50: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
4e60: 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
4e70: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
4e80: 61 72 67 76 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  argv.){.  const 
4e90: 63 68 61 72 20 2a 61 44 65 6c 74 61 3b 0a 20 20  char *aDelta;.  
4ea0: 69 6e 74 20 6e 44 65 6c 74 61 3b 0a 20 20 63 6f  int nDelta;.  co
4eb0: 6e 73 74 20 63 68 61 72 20 2a 61 4f 72 69 67 3b  nst char *aOrig;
4ec0: 0a 20 20 69 6e 74 20 6e 4f 72 69 67 3b 0a 0a 20  .  int nOrig;.. 
4ed0: 20 69 6e 74 20 6e 4f 75 74 3b 0a 20 20 69 6e 74   int nOut;.  int
4ee0: 20 6e 4f 75 74 32 3b 0a 20 20 63 68 61 72 20 2a   nOut2;.  char *
4ef0: 61 4f 75 74 3b 0a 0a 20 20 61 73 73 65 72 74 28  aOut;..  assert(
4f00: 20 61 72 67 63 3d 3d 32 20 29 3b 0a 0a 20 20 6e   argc==2 );..  n
4f10: 4f 72 69 67 20 3d 20 73 71 6c 69 74 65 33 5f 76  Orig = sqlite3_v
4f20: 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b  alue_bytes(argv[
4f30: 30 5d 29 3b 0a 20 20 61 4f 72 69 67 20 3d 20 28  0]);.  aOrig = (
4f40: 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
4f50: 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61  te3_value_blob(a
4f60: 72 67 76 5b 30 5d 29 3b 0a 20 20 6e 44 65 6c 74  rgv[0]);.  nDelt
4f70: 61 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  a = sqlite3_valu
4f80: 65 5f 62 79 74 65 73 28 61 72 67 76 5b 31 5d 29  e_bytes(argv[1])
4f90: 3b 0a 20 20 61 44 65 6c 74 61 20 3d 20 28 63 6f  ;.  aDelta = (co
4fa0: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
4fb0: 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67  3_value_blob(arg
4fc0: 76 5b 31 5d 29 3b 0a 0a 20 20 2f 2a 20 46 69 67  v[1]);..  /* Fig
4fd0: 75 72 65 20 6f 75 74 20 74 68 65 20 73 69 7a 65  ure out the size
4fe0: 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74 20 2a   of the output *
4ff0: 2f 0a 20 20 6e 4f 75 74 20 3d 20 72 62 75 44 65  /.  nOut = rbuDe
5000: 6c 74 61 4f 75 74 70 75 74 53 69 7a 65 28 61 44  ltaOutputSize(aD
5010: 65 6c 74 61 2c 20 6e 44 65 6c 74 61 29 3b 0a 20  elta, nDelta);. 
5020: 20 69 66 28 20 6e 4f 75 74 3c 30 20 29 7b 0a 20   if( nOut<0 ){. 
5030: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
5040: 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c  t_error(context,
5050: 20 22 63 6f 72 72 75 70 74 20 66 6f 73 73 69 6c   "corrupt fossil
5060: 20 64 65 6c 74 61 22 2c 20 2d 31 29 3b 0a 20 20   delta", -1);.  
5070: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20    return;.  }.. 
5080: 20 61 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 5f   aOut = sqlite3_
5090: 6d 61 6c 6c 6f 63 28 6e 4f 75 74 2b 31 29 3b 0a  malloc(nOut+1);.
50a0: 20 20 69 66 28 20 61 4f 75 74 3d 3d 30 20 29 7b    if( aOut==0 ){
50b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
50c0: 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28  ult_error_nomem(
50d0: 63 6f 6e 74 65 78 74 29 3b 0a 20 20 7d 65 6c 73  context);.  }els
50e0: 65 7b 0a 20 20 20 20 6e 4f 75 74 32 20 3d 20 72  e{.    nOut2 = r
50f0: 62 75 44 65 6c 74 61 41 70 70 6c 79 28 61 4f 72  buDeltaApply(aOr
5100: 69 67 2c 20 6e 4f 72 69 67 2c 20 61 44 65 6c 74  ig, nOrig, aDelt
5110: 61 2c 20 6e 44 65 6c 74 61 2c 20 61 4f 75 74 29  a, nDelta, aOut)
5120: 3b 0a 20 20 20 20 69 66 28 20 6e 4f 75 74 32 21  ;.    if( nOut2!
5130: 3d 6e 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 73  =nOut ){.      s
5140: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
5150: 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 22 63 6f  ror(context, "co
5160: 72 72 75 70 74 20 66 6f 73 73 69 6c 20 64 65 6c  rrupt fossil del
5170: 74 61 22 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 65  ta", -1);.    }e
5180: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
5190: 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 28 63  e3_result_blob(c
51a0: 6f 6e 74 65 78 74 2c 20 61 4f 75 74 2c 20 6e 4f  ontext, aOut, nO
51b0: 75 74 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ut, sqlite3_free
51c0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
51d0: 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20 74  ./*.** Prepare t
51e0: 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
51f0: 20 69 6e 20 62 75 66 66 65 72 20 7a 53 71 6c 20   in buffer zSql 
5200: 61 67 61 69 6e 73 74 20 64 61 74 61 62 61 73 65  against database
5210: 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2a 20 49   handle db..** I
5220: 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65  f successful, se
5230: 74 20 2a 70 70 53 74 6d 74 20 74 6f 20 70 6f 69  t *ppStmt to poi
5240: 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20 73 74  nt to the new st
5250: 61 74 65 6d 65 6e 74 20 61 6e 64 20 72 65 74 75  atement and retu
5260: 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e  rn.** SQLITE_OK.
5270: 20 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73   .**.** Otherwis
5280: 65 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 64  e, if an error d
5290: 6f 65 73 20 6f 63 63 75 72 2c 20 73 65 74 20 2a  oes occur, set *
52a0: 70 70 53 74 6d 74 20 74 6f 20 4e 55 4c 4c 20 61  ppStmt to NULL a
52b0: 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 61 6e 20  nd return.** an 
52c0: 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
52d0: 65 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c  e. Additionally,
52e0: 20 73 65 74 20 6f 75 74 70 75 74 20 76 61 72 69   set output vari
52f0: 61 62 6c 65 20 2a 70 7a 45 72 72 6d 73 67 20 74  able *pzErrmsg t
5300: 6f 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 61 20  o.** point to a 
5310: 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
5320: 67 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  g an error messa
5330: 67 65 2e 20 49 74 20 69 73 20 74 68 65 20 72 65  ge. It is the re
5340: 73 70 6f 6e 73 69 62 69 6c 69 74 79 0a 2a 2a 20  sponsibility.** 
5350: 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  of the caller to
5360: 20 28 65 76 65 6e 74 75 61 6c 6c 79 29 20 66 72   (eventually) fr
5370: 65 65 20 74 68 69 73 20 62 75 66 66 65 72 20 75  ee this buffer u
5380: 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 72 65  sing sqlite3_fre
5390: 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  e()..*/.static i
53a0: 6e 74 20 70 72 65 70 61 72 65 41 6e 64 43 6f 6c  nt prepareAndCol
53b0: 6c 65 63 74 45 72 72 6f 72 28 0a 20 20 73 71 6c  lectError(.  sql
53c0: 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 73 71 6c  ite3 *db, .  sql
53d0: 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74  ite3_stmt **ppSt
53e0: 6d 74 2c 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45  mt,.  char **pzE
53f0: 72 72 6d 73 67 2c 0a 20 20 63 6f 6e 73 74 20 63  rrmsg,.  const c
5400: 68 61 72 20 2a 7a 53 71 6c 0a 29 7b 0a 20 20 69  har *zSql.){.  i
5410: 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  nt rc = sqlite3_
5420: 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a  prepare_v2(db, z
5430: 53 71 6c 2c 20 2d 31 2c 20 70 70 53 74 6d 74 2c  Sql, -1, ppStmt,
5440: 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53   0);.  if( rc!=S
5450: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
5460: 2a 70 7a 45 72 72 6d 73 67 20 3d 20 73 71 6c 69  *pzErrmsg = sqli
5470: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22  te3_mprintf("%s"
5480: 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
5490: 28 64 62 29 29 3b 0a 20 20 20 20 2a 70 70 53 74  (db));.    *ppSt
54a0: 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  mt = 0;.  }.  re
54b0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
54c0: 2a 20 52 65 73 65 74 20 74 68 65 20 53 51 4c 20  * Reset the SQL 
54d0: 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64  statement passed
54e0: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
54f0: 67 75 6d 65 6e 74 2e 20 52 65 74 75 72 6e 20 61  gument. Return a
5500: 20 63 6f 70 79 0a 2a 2a 20 6f 66 20 74 68 65 20   copy.** of the 
5510: 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
5520: 79 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  y sqlite3_reset(
5530: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  )..**.** If an e
5540: 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65  rror has occurre
5550: 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 7a 45  d, then set *pzE
5560: 72 72 6d 73 67 20 74 6f 20 70 6f 69 6e 74 20 74  rrmsg to point t
5570: 6f 20 61 20 62 75 66 66 65 72 0a 2a 2a 20 63 6f  o a buffer.** co
5580: 6e 74 61 69 6e 69 6e 67 20 61 6e 20 65 72 72 6f  ntaining an erro
5590: 72 20 6d 65 73 73 61 67 65 2e 20 49 74 20 69 73  r message. It is
55a0: 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
55b0: 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  ity of the calle
55c0: 72 0a 2a 2a 20 74 6f 20 65 76 65 6e 74 75 61 6c  r.** to eventual
55d0: 6c 79 20 66 72 65 65 20 74 68 69 73 20 62 75 66  ly free this buf
55e0: 66 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65  fer using sqlite
55f0: 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61  3_free()..*/.sta
5600: 74 69 63 20 69 6e 74 20 72 65 73 65 74 41 6e 64  tic int resetAnd
5610: 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 73 71 6c  CollectError(sql
5620: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
5630: 2c 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 6d 73  , char **pzErrms
5640: 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73  g){.  int rc = s
5650: 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74  qlite3_reset(pSt
5660: 6d 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  mt);.  if( rc!=S
5670: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
5680: 2a 70 7a 45 72 72 6d 73 67 20 3d 20 73 71 6c 69  *pzErrmsg = sqli
5690: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22  te3_mprintf("%s"
56a0: 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
56b0: 28 73 71 6c 69 74 65 33 5f 64 62 5f 68 61 6e 64  (sqlite3_db_hand
56c0: 6c 65 28 70 53 74 6d 74 29 29 29 3b 0a 20 20 7d  le(pStmt)));.  }
56d0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
56e0: 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 69 74  ./*.** Unless it
56f0: 20 69 73 20 4e 55 4c 4c 2c 20 61 72 67 75 6d 65   is NULL, argume
5700: 6e 74 20 7a 53 71 6c 20 70 6f 69 6e 74 73 20 74  nt zSql points t
5710: 6f 20 61 20 62 75 66 66 65 72 20 61 6c 6c 6f 63  o a buffer alloc
5720: 61 74 65 64 20 75 73 69 6e 67 0a 2a 2a 20 73 71  ated using.** sq
5730: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 20 63 6f 6e  lite3_malloc con
5740: 74 61 69 6e 69 6e 67 20 61 6e 20 53 51 4c 20 73  taining an SQL s
5750: 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 66  tatement. This f
5760: 75 6e 63 74 69 6f 6e 20 70 72 65 70 61 72 65 73  unction prepares
5770: 20 74 68 65 20 53 51 4c 0a 2a 2a 20 73 74 61 74   the SQL.** stat
5780: 65 6d 65 6e 74 20 61 67 61 69 6e 73 74 20 64 61  ement against da
5790: 74 61 62 61 73 65 20 64 62 20 61 6e 64 20 66 72  tabase db and fr
57a0: 65 65 73 20 74 68 65 20 62 75 66 66 65 72 2e 20  ees the buffer. 
57b0: 49 66 20 73 74 61 74 65 6d 65 6e 74 20 0a 2a 2a  If statement .**
57c0: 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 69 73 20   compilation is 
57d0: 73 75 63 63 65 73 73 66 75 6c 2c 20 2a 70 70 53  successful, *ppS
57e0: 74 6d 74 20 69 73 20 73 65 74 20 74 6f 20 70 6f  tmt is set to po
57f0: 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20 73  int to the new s
5800: 74 61 74 65 6d 65 6e 74 20 0a 2a 2a 20 68 61 6e  tatement .** han
5810: 64 6c 65 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  dle and SQLITE_O
5820: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 0a  K is returned. .
5830: 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
5840: 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
5850: 75 72 73 2c 20 2a 70 70 53 74 6d 74 20 69 73 20  urs, *ppStmt is 
5860: 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20  set to NULL and 
5870: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a  an error code.**
5880: 20 72 65 74 75 72 6e 65 64 2e 20 49 6e 20 74 68   returned. In th
5890: 69 73 20 63 61 73 65 2c 20 2a 70 7a 45 72 72 6d  is case, *pzErrm
58a0: 73 67 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 73  sg may also be s
58b0: 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61  et to point to a
58c0: 6e 20 65 72 72 6f 72 0a 2a 2a 20 6d 65 73 73 61  n error.** messa
58d0: 67 65 2e 20 49 74 20 69 73 20 74 68 65 20 72 65  ge. It is the re
58e0: 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
58f0: 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 66 72  the caller to fr
5900: 65 65 20 74 68 69 73 20 65 72 72 6f 72 20 6d 65  ee this error me
5910: 73 73 61 67 65 0a 2a 2a 20 62 75 66 66 65 72 20  ssage.** buffer 
5920: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 72  using sqlite3_fr
5930: 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ee()..**.** If a
5940: 72 67 75 6d 65 6e 74 20 7a 53 71 6c 20 69 73 20  rgument zSql is 
5950: 4e 55 4c 4c 2c 20 74 68 69 73 20 66 75 6e 63 74  NULL, this funct
5960: 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74  ion assumes that
5970: 20 61 6e 20 4f 4f 4d 20 68 61 73 20 6f 63 63 75   an OOM has occu
5980: 72 72 65 64 2e 0a 2a 2a 20 49 6e 20 74 68 69 73  rred..** In this
5990: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 4d   case SQLITE_NOM
59a0: 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  EM is returned a
59b0: 6e 64 20 2a 70 70 53 74 6d 74 20 73 65 74 20 74  nd *ppStmt set t
59c0: 6f 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69  o NULL..*/.stati
59d0: 63 20 69 6e 74 20 70 72 65 70 61 72 65 46 72 65  c int prepareFre
59e0: 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72  eAndCollectError
59f0: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
5a00: 20 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74   .  sqlite3_stmt
5a10: 20 2a 2a 70 70 53 74 6d 74 2c 0a 20 20 63 68 61   **ppStmt,.  cha
5a20: 72 20 2a 2a 70 7a 45 72 72 6d 73 67 2c 0a 20 20  r **pzErrmsg,.  
5a30: 63 68 61 72 20 2a 7a 53 71 6c 0a 29 7b 0a 20 20  char *zSql.){.  
5a40: 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74  int rc;.  assert
5a50: 28 20 2a 70 7a 45 72 72 6d 73 67 3d 3d 30 20 29  ( *pzErrmsg==0 )
5a60: 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20  ;.  if( zSql==0 
5a70: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
5a80: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 2a 70  TE_NOMEM;.    *p
5a90: 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 65 6c  pStmt = 0;.  }el
5aa0: 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 70 72 65  se{.    rc = pre
5ab0: 70 61 72 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72  pareAndCollectEr
5ac0: 72 6f 72 28 64 62 2c 20 70 70 53 74 6d 74 2c 20  ror(db, ppStmt, 
5ad0: 70 7a 45 72 72 6d 73 67 2c 20 7a 53 71 6c 29 3b  pzErrmsg, zSql);
5ae0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
5af0: 65 28 7a 53 71 6c 29 3b 0a 20 20 7d 0a 20 20 72  e(zSql);.  }.  r
5b00: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
5b10: 2a 2a 20 46 72 65 65 20 74 68 65 20 52 62 75 4f  ** Free the RbuO
5b20: 62 6a 49 74 65 72 2e 61 7a 54 62 6c 43 6f 6c 5b  bjIter.azTblCol[
5b30: 5d 20 61 6e 64 20 52 62 75 4f 62 6a 49 74 65 72  ] and RbuObjIter
5b40: 2e 61 62 54 62 6c 50 6b 5b 5d 20 61 72 72 61 79  .abTblPk[] array
5b50: 73 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 62  s allocated.** b
5b60: 79 20 61 6e 20 65 61 72 6c 69 65 72 20 63 61 6c  y an earlier cal
5b70: 6c 20 74 6f 20 72 62 75 4f 62 6a 49 74 65 72 43  l to rbuObjIterC
5b80: 61 63 68 65 54 61 62 6c 65 49 6e 66 6f 28 29 2e  acheTableInfo().
5b90: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5ba0: 72 62 75 4f 62 6a 49 74 65 72 46 72 65 65 43 6f  rbuObjIterFreeCo
5bb0: 6c 73 28 52 62 75 4f 62 6a 49 74 65 72 20 2a 70  ls(RbuObjIter *p
5bc0: 49 74 65 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Iter){.  int i;.
5bd0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74    for(i=0; i<pIt
5be0: 65 72 2d 3e 6e 54 62 6c 43 6f 6c 3b 20 69 2b 2b  er->nTblCol; i++
5bf0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
5c00: 72 65 65 28 70 49 74 65 72 2d 3e 61 7a 54 62 6c  ree(pIter->azTbl
5c10: 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20 73 71 6c  Col[i]);.    sql
5c20: 69 74 65 33 5f 66 72 65 65 28 70 49 74 65 72 2d  ite3_free(pIter-
5c30: 3e 61 7a 54 62 6c 54 79 70 65 5b 69 5d 29 3b 0a  >azTblType[i]);.
5c40: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
5c50: 65 65 28 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43  ee(pIter->azTblC
5c60: 6f 6c 29 3b 0a 20 20 70 49 74 65 72 2d 3e 61 7a  ol);.  pIter->az
5c70: 54 62 6c 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 49  TblCol = 0;.  pI
5c80: 74 65 72 2d 3e 61 7a 54 62 6c 54 79 70 65 20 3d  ter->azTblType =
5c90: 20 30 3b 0a 20 20 70 49 74 65 72 2d 3e 61 69 53   0;.  pIter->aiS
5ca0: 72 63 4f 72 64 65 72 20 3d 20 30 3b 0a 20 20 70  rcOrder = 0;.  p
5cb0: 49 74 65 72 2d 3e 61 62 54 62 6c 50 6b 20 3d 20  Iter->abTblPk = 
5cc0: 30 3b 0a 20 20 70 49 74 65 72 2d 3e 61 62 4e 6f  0;.  pIter->abNo
5cd0: 74 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 70 49 74  tNull = 0;.  pIt
5ce0: 65 72 2d 3e 6e 54 62 6c 43 6f 6c 20 3d 20 30 3b  er->nTblCol = 0;
5cf0: 0a 20 20 70 49 74 65 72 2d 3e 65 54 79 70 65 20  .  pIter->eType 
5d00: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
5d10: 20 20 20 2f 2a 20 49 6e 76 61 6c 69 64 20 76 61     /* Invalid va
5d20: 6c 75 65 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  lue */.}../*.** 
5d30: 46 69 6e 61 6c 69 7a 65 20 61 6c 6c 20 73 74 61  Finalize all sta
5d40: 74 65 6d 65 6e 74 73 20 61 6e 64 20 66 72 65 65  tements and free
5d50: 20 61 6c 6c 20 61 6c 6c 6f 63 61 74 69 6f 6e 73   all allocations
5d60: 20 74 68 61 74 20 61 72 65 20 73 70 65 63 69 66   that are specif
5d70: 69 63 20 74 6f 0a 2a 2a 20 74 68 65 20 63 75 72  ic to.** the cur
5d80: 72 65 6e 74 20 6f 62 6a 65 63 74 20 28 74 61 62  rent object (tab
5d90: 6c 65 2f 69 6e 64 65 78 20 70 61 69 72 29 2e 0a  le/index pair)..
5da0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
5db0: 62 75 4f 62 6a 49 74 65 72 43 6c 65 61 72 53 74  buObjIterClearSt
5dc0: 61 74 65 6d 65 6e 74 73 28 52 62 75 4f 62 6a 49  atements(RbuObjI
5dd0: 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 52  ter *pIter){.  R
5de0: 62 75 55 70 64 61 74 65 53 74 6d 74 20 2a 70 55  buUpdateStmt *pU
5df0: 70 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  p;..  sqlite3_fi
5e00: 6e 61 6c 69 7a 65 28 70 49 74 65 72 2d 3e 70 53  nalize(pIter->pS
5e10: 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69 74 65  elect);.  sqlite
5e20: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 49 74 65 72  3_finalize(pIter
5e30: 2d 3e 70 49 6e 73 65 72 74 29 3b 0a 20 20 73 71  ->pInsert);.  sq
5e40: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
5e50: 49 74 65 72 2d 3e 70 44 65 6c 65 74 65 29 3b 0a  Iter->pDelete);.
5e60: 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
5e70: 7a 65 28 70 49 74 65 72 2d 3e 70 54 6d 70 49 6e  ze(pIter->pTmpIn
5e80: 73 65 72 74 29 3b 0a 20 20 70 55 70 20 3d 20 70  sert);.  pUp = p
5e90: 49 74 65 72 2d 3e 70 52 62 75 55 70 64 61 74 65  Iter->pRbuUpdate
5ea0: 3b 0a 20 20 77 68 69 6c 65 28 20 70 55 70 20 29  ;.  while( pUp )
5eb0: 7b 0a 20 20 20 20 52 62 75 55 70 64 61 74 65 53  {.    RbuUpdateS
5ec0: 74 6d 74 20 2a 70 54 6d 70 20 3d 20 70 55 70 2d  tmt *pTmp = pUp-
5ed0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c 69  >pNext;.    sqli
5ee0: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 55 70  te3_finalize(pUp
5ef0: 2d 3e 70 55 70 64 61 74 65 29 3b 0a 20 20 20 20  ->pUpdate);.    
5f00: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 55 70  sqlite3_free(pUp
5f10: 29 3b 0a 20 20 20 20 70 55 70 20 3d 20 70 54 6d  );.    pUp = pTm
5f20: 70 3b 0a 20 20 7d 0a 20 20 0a 20 20 70 49 74 65  p;.  }.  .  pIte
5f30: 72 2d 3e 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a  r->pSelect = 0;.
5f40: 20 20 70 49 74 65 72 2d 3e 70 49 6e 73 65 72 74    pIter->pInsert
5f50: 20 3d 20 30 3b 0a 20 20 70 49 74 65 72 2d 3e 70   = 0;.  pIter->p
5f60: 44 65 6c 65 74 65 20 3d 20 30 3b 0a 20 20 70 49  Delete = 0;.  pI
5f70: 74 65 72 2d 3e 70 52 62 75 55 70 64 61 74 65 20  ter->pRbuUpdate 
5f80: 3d 20 30 3b 0a 20 20 70 49 74 65 72 2d 3e 70 54  = 0;.  pIter->pT
5f90: 6d 70 49 6e 73 65 72 74 20 3d 20 30 3b 0a 20 20  mpInsert = 0;.  
5fa0: 70 49 74 65 72 2d 3e 6e 43 6f 6c 20 3d 20 30 3b  pIter->nCol = 0;
5fb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20  .}../*.** Clean 
5fc0: 75 70 20 61 6e 79 20 72 65 73 6f 75 72 63 65 73  up any resources
5fd0: 20 61 6c 6c 6f 63 61 74 65 64 20 61 73 20 70 61   allocated as pa
5fe0: 72 74 20 6f 66 20 74 68 65 20 69 74 65 72 61 74  rt of the iterat
5ff0: 6f 72 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64  or object passed
6000: 0a 2a 2a 20 61 73 20 74 68 65 20 6f 6e 6c 79 20  .** as the only 
6010: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61  argument..*/.sta
6020: 74 69 63 20 76 6f 69 64 20 72 62 75 4f 62 6a 49  tic void rbuObjI
6030: 74 65 72 46 69 6e 61 6c 69 7a 65 28 52 62 75 4f  terFinalize(RbuO
6040: 62 6a 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  bjIter *pIter){.
6050: 20 20 72 62 75 4f 62 6a 49 74 65 72 43 6c 65 61    rbuObjIterClea
6060: 72 53 74 61 74 65 6d 65 6e 74 73 28 70 49 74 65  rStatements(pIte
6070: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  r);.  sqlite3_fi
6080: 6e 61 6c 69 7a 65 28 70 49 74 65 72 2d 3e 70 54  nalize(pIter->pT
6090: 62 6c 49 74 65 72 29 3b 0a 20 20 73 71 6c 69 74  blIter);.  sqlit
60a0: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 49 74 65  e3_finalize(pIte
60b0: 72 2d 3e 70 49 64 78 49 74 65 72 29 3b 0a 20 20  r->pIdxIter);.  
60c0: 72 62 75 4f 62 6a 49 74 65 72 46 72 65 65 43 6f  rbuObjIterFreeCo
60d0: 6c 73 28 70 49 74 65 72 29 3b 0a 20 20 6d 65 6d  ls(pIter);.  mem
60e0: 73 65 74 28 70 49 74 65 72 2c 20 30 2c 20 73 69  set(pIter, 0, si
60f0: 7a 65 6f 66 28 52 62 75 4f 62 6a 49 74 65 72 29  zeof(RbuObjIter)
6100: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61  );.}../*.** Adva
6110: 6e 63 65 20 74 68 65 20 69 74 65 72 61 74 6f 72  nce the iterator
6120: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 70 6f 73   to the next pos
6130: 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ition..**.** If 
6140: 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  no error occurs,
6150: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
6160: 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 69  turned and the i
6170: 74 65 72 61 74 6f 72 20 69 73 20 6c 65 66 74 20  terator is left 
6180: 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  .** pointing to 
6190: 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 2e 20  the next entry. 
61a0: 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20 65 72  Otherwise, an er
61b0: 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 6d 65 73  ror code and mes
61c0: 73 61 67 65 20 69 73 20 0a 2a 2a 20 6c 65 66 74  sage is .** left
61d0: 20 69 6e 20 74 68 65 20 52 42 55 20 68 61 6e 64   in the RBU hand
61e0: 6c 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  le passed as the
61f0: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
6200: 20 41 20 63 6f 70 79 20 6f 66 20 74 68 65 20 0a   A copy of the .
6210: 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  ** error code is
6220: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
6230: 61 74 69 63 20 69 6e 74 20 72 62 75 4f 62 6a 49  atic int rbuObjI
6240: 74 65 72 4e 65 78 74 28 73 71 6c 69 74 65 33 72  terNext(sqlite3r
6250: 62 75 20 2a 70 2c 20 52 62 75 4f 62 6a 49 74 65  bu *p, RbuObjIte
6260: 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e 74  r *pIter){.  int
6270: 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 69   rc = p->rc;.  i
6280: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
6290: 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 46 72 65 65   ){..    /* Free
62a0: 20 61 6e 79 20 53 51 4c 69 74 65 20 73 74 61 74   any SQLite stat
62b0: 65 6d 65 6e 74 73 20 75 73 65 64 20 77 68 69 6c  ements used whil
62c0: 65 20 70 72 6f 63 65 73 73 69 6e 67 20 74 68 65  e processing the
62d0: 20 70 72 65 76 69 6f 75 73 20 6f 62 6a 65 63 74   previous object
62e0: 20 2a 2f 20 0a 20 20 20 20 72 62 75 4f 62 6a 49   */ .    rbuObjI
62f0: 74 65 72 43 6c 65 61 72 53 74 61 74 65 6d 65 6e  terClearStatemen
6300: 74 73 28 70 49 74 65 72 29 3b 0a 20 20 20 20 69  ts(pIter);.    i
6310: 66 28 20 70 49 74 65 72 2d 3e 7a 49 64 78 3d 3d  f( pIter->zIdx==
6320: 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
6330: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e  sqlite3_exec(p->
6340: 64 62 4d 61 69 6e 2c 0a 20 20 20 20 20 20 20 20  dbMain,.        
6350: 20 20 22 44 52 4f 50 20 54 52 49 47 47 45 52 20    "DROP TRIGGER 
6360: 49 46 20 45 58 49 53 54 53 20 74 65 6d 70 2e 72  IF EXISTS temp.r
6370: 62 75 5f 69 6e 73 65 72 74 5f 74 72 3b 22 0a 20  bu_insert_tr;". 
6380: 20 20 20 20 20 20 20 20 20 22 44 52 4f 50 20 54           "DROP T
6390: 52 49 47 47 45 52 20 49 46 20 45 58 49 53 54 53  RIGGER IF EXISTS
63a0: 20 74 65 6d 70 2e 72 62 75 5f 75 70 64 61 74 65   temp.rbu_update
63b0: 31 5f 74 72 3b 22 0a 20 20 20 20 20 20 20 20 20  1_tr;".         
63c0: 20 22 44 52 4f 50 20 54 52 49 47 47 45 52 20 49   "DROP TRIGGER I
63d0: 46 20 45 58 49 53 54 53 20 74 65 6d 70 2e 72 62  F EXISTS temp.rb
63e0: 75 5f 75 70 64 61 74 65 32 5f 74 72 3b 22 0a 20  u_update2_tr;". 
63f0: 20 20 20 20 20 20 20 20 20 22 44 52 4f 50 20 54           "DROP T
6400: 52 49 47 47 45 52 20 49 46 20 45 58 49 53 54 53  RIGGER IF EXISTS
6410: 20 74 65 6d 70 2e 72 62 75 5f 64 65 6c 65 74 65   temp.rbu_delete
6420: 5f 74 72 3b 22 0a 20 20 20 20 20 20 20 20 20 20  _tr;".          
6430: 2c 20 30 2c 20 30 2c 20 26 70 2d 3e 7a 45 72 72  , 0, 0, &p->zErr
6440: 6d 73 67 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  msg.      );.   
6450: 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   }..    if( rc==
6460: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
6470: 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 62 43     if( pIter->bC
6480: 6c 65 61 6e 75 70 20 29 7b 0a 20 20 20 20 20 20  leanup ){.      
6490: 20 20 72 62 75 4f 62 6a 49 74 65 72 46 72 65 65    rbuObjIterFree
64a0: 43 6f 6c 73 28 70 49 74 65 72 29 3b 0a 20 20 20  Cols(pIter);.   
64b0: 20 20 20 20 20 70 49 74 65 72 2d 3e 62 43 6c 65       pIter->bCle
64c0: 61 6e 75 70 20 3d 20 30 3b 0a 20 20 20 20 20 20  anup = 0;.      
64d0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73    rc = sqlite3_s
64e0: 74 65 70 28 70 49 74 65 72 2d 3e 70 54 62 6c 49  tep(pIter->pTblI
64f0: 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ter);.        if
6500: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 52 4f 57  ( rc!=SQLITE_ROW
6510: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
6520: 20 3d 20 72 65 73 65 74 41 6e 64 43 6f 6c 6c 65   = resetAndColle
6530: 63 74 45 72 72 6f 72 28 70 49 74 65 72 2d 3e 70  ctError(pIter->p
6540: 54 62 6c 49 74 65 72 2c 20 26 70 2d 3e 7a 45 72  TblIter, &p->zEr
6550: 72 6d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20  rmsg);.         
6560: 20 70 49 74 65 72 2d 3e 7a 54 62 6c 20 3d 20 30   pIter->zTbl = 0
6570: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
6580: 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72  .          pIter
6590: 2d 3e 7a 54 62 6c 20 3d 20 28 63 6f 6e 73 74 20  ->zTbl = (const 
65a0: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
65b0: 6c 75 6d 6e 5f 74 65 78 74 28 70 49 74 65 72 2d  lumn_text(pIter-
65c0: 3e 70 54 62 6c 49 74 65 72 2c 20 30 29 3b 0a 20  >pTblIter, 0);. 
65d0: 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e           pIter->
65e0: 7a 44 61 74 61 54 62 6c 20 3d 20 28 63 6f 6e 73  zDataTbl = (cons
65f0: 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
6600: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 49 74 65  column_text(pIte
6610: 72 2d 3e 70 54 62 6c 49 74 65 72 2c 31 29 3b 0a  r->pTblIter,1);.
6620: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 28            rc = (
6630: 70 49 74 65 72 2d 3e 7a 44 61 74 61 54 62 6c 20  pIter->zDataTbl 
6640: 26 26 20 70 49 74 65 72 2d 3e 7a 54 62 6c 29 20  && pIter->zTbl) 
6650: 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51  ? SQLITE_OK : SQ
6660: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
6670: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
6680: 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  e{.        if( p
6690: 49 74 65 72 2d 3e 7a 49 64 78 3d 3d 30 20 29 7b  Iter->zIdx==0 ){
66a0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
66b0: 65 33 5f 73 74 6d 74 20 2a 70 49 64 78 20 3d 20  e3_stmt *pIdx = 
66c0: 70 49 74 65 72 2d 3e 70 49 64 78 49 74 65 72 3b  pIter->pIdxIter;
66d0: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
66e0: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
66f0: 74 28 70 49 64 78 2c 20 31 2c 20 70 49 74 65 72  t(pIdx, 1, pIter
6700: 2d 3e 7a 54 62 6c 2c 20 2d 31 2c 20 53 51 4c 49  ->zTbl, -1, SQLI
6710: 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
6720: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
6730: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
6740: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
6750: 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  = sqlite3_step(p
6760: 49 74 65 72 2d 3e 70 49 64 78 49 74 65 72 29 3b  Iter->pIdxIter);
6770: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
6780: 63 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  c!=SQLITE_ROW ){
6790: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
67a0: 3d 20 72 65 73 65 74 41 6e 64 43 6f 6c 6c 65 63  = resetAndCollec
67b0: 74 45 72 72 6f 72 28 70 49 74 65 72 2d 3e 70 49  tError(pIter->pI
67c0: 64 78 49 74 65 72 2c 20 26 70 2d 3e 7a 45 72 72  dxIter, &p->zErr
67d0: 6d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  msg);.          
67e0: 20 20 70 49 74 65 72 2d 3e 62 43 6c 65 61 6e 75    pIter->bCleanu
67f0: 70 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  p = 1;.         
6800: 20 20 20 70 49 74 65 72 2d 3e 7a 49 64 78 20 3d     pIter->zIdx =
6810: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65   0;.          }e
6820: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
6830: 20 70 49 74 65 72 2d 3e 7a 49 64 78 20 3d 20 28   pIter->zIdx = (
6840: 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
6850: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
6860: 70 49 74 65 72 2d 3e 70 49 64 78 49 74 65 72 2c  pIter->pIdxIter,
6870: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
6880: 20 70 49 74 65 72 2d 3e 69 54 6e 75 6d 20 3d 20   pIter->iTnum = 
6890: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
68a0: 6e 74 28 70 49 74 65 72 2d 3e 70 49 64 78 49 74  nt(pIter->pIdxIt
68b0: 65 72 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  er, 1);.        
68c0: 20 20 20 20 70 49 74 65 72 2d 3e 62 55 6e 69 71      pIter->bUniq
68d0: 75 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ue = sqlite3_col
68e0: 75 6d 6e 5f 69 6e 74 28 70 49 74 65 72 2d 3e 70  umn_int(pIter->p
68f0: 49 64 78 49 74 65 72 2c 20 32 29 3b 0a 20 20 20  IdxIter, 2);.   
6900: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 49           rc = pI
6910: 74 65 72 2d 3e 7a 49 64 78 20 3f 20 53 51 4c 49  ter->zIdx ? SQLI
6920: 54 45 5f 4f 4b 20 3a 20 53 51 4c 49 54 45 5f 4e  TE_OK : SQLITE_N
6930: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20  OMEM;.          
6940: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
6950: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
6960: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
6970: 4f 4b 20 29 7b 0a 20 20 20 20 72 62 75 4f 62 6a  OK ){.    rbuObj
6980: 49 74 65 72 46 69 6e 61 6c 69 7a 65 28 70 49 74  IterFinalize(pIt
6990: 65 72 29 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  er);.    p->rc =
69a0: 20 72 63 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   rc;.  }.  retur
69b0: 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
69c0: 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  The implementati
69d0: 6f 6e 20 6f 66 20 74 68 65 20 72 62 75 5f 74 61  on of the rbu_ta
69e0: 72 67 65 74 5f 6e 61 6d 65 28 29 20 53 51 4c 20  rget_name() SQL 
69f0: 66 75 6e 63 74 69 6f 6e 2e 20 54 68 69 73 20 66  function. This f
6a00: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 63 63 65 70  unction.** accep
6a10: 74 73 20 6f 6e 65 20 61 72 67 75 6d 65 6e 74 20  ts one argument 
6a20: 2d 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  - the name of a 
6a30: 74 61 62 6c 65 20 69 6e 20 74 68 65 20 52 42 55  table in the RBU
6a40: 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 74 68   database. If th
6a50: 65 0a 2a 2a 20 74 61 62 6c 65 20 6e 61 6d 65 20  e.** table name 
6a60: 6d 61 74 63 68 65 73 20 74 68 65 20 70 61 74 74  matches the patt
6a70: 65 72 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 64  ern:.**.**     d
6a80: 61 74 61 5b 30 2d 39 5d 5f 3c 6e 61 6d 65 3e 0a  ata[0-9]_<name>.
6a90: 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 3c 6e 61 6d  **.** where <nam
6aa0: 65 3e 20 69 73 20 61 6e 79 20 73 65 71 75 65 6e  e> is any sequen
6ab0: 63 65 20 6f 66 20 31 20 6f 72 20 6d 6f 72 65 20  ce of 1 or more 
6ac0: 63 68 61 72 61 63 74 65 72 73 2c 20 3c 6e 61 6d  characters, <nam
6ad0: 65 3e 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  e> is returned..
6ae0: 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
6af0: 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65   the only argume
6b00: 6e 74 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63  nt does not matc
6b10: 68 20 74 68 65 20 61 62 6f 76 65 20 70 61 74 74  h the above patt
6b20: 65 72 6e 2c 20 61 6e 20 53 51 4c 0a 2a 2a 20 4e  ern, an SQL.** N
6b30: 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ULL is returned.
6b40: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 22 64 61 74 61  .**.**     "data
6b50: 5f 74 31 22 20 20 20 20 20 2d 3e 20 22 74 31 22  _t1"     -> "t1"
6b60: 0a 2a 2a 20 20 20 20 20 22 64 61 74 61 30 31 32  .**     "data012
6b70: 33 5f 74 32 22 20 2d 3e 20 22 74 32 22 0a 2a 2a  3_t2" -> "t2".**
6b80: 20 20 20 20 20 22 64 61 74 61 41 42 5f 74 33 22       "dataAB_t3"
6b90: 20 20 20 2d 3e 20 4e 55 4c 4c 0a 2a 2f 0a 73 74     -> NULL.*/.st
6ba0: 61 74 69 63 20 76 6f 69 64 20 72 62 75 54 61 72  atic void rbuTar
6bb0: 67 65 74 4e 61 6d 65 46 75 6e 63 28 0a 20 20 73  getNameFunc(.  s
6bc0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
6bd0: 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61  context,.  int a
6be0: 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  rgc,.  sqlite3_v
6bf0: 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
6c00: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e   const char *zIn
6c10: 3b 0a 20 20 61 73 73 65 72 74 28 20 61 72 67 63  ;.  assert( argc
6c20: 3d 3d 31 20 29 3b 0a 0a 20 20 7a 49 6e 20 3d 20  ==1 );..  zIn = 
6c30: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
6c40: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
6c50: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28 20  argv[0]);.  if( 
6c60: 7a 49 6e 20 26 26 20 73 74 72 6c 65 6e 28 7a 49  zIn && strlen(zI
6c70: 6e 29 3e 34 20 26 26 20 6d 65 6d 63 6d 70 28 22  n)>4 && memcmp("
6c80: 64 61 74 61 22 2c 20 7a 49 6e 2c 20 34 29 3d 3d  data", zIn, 4)==
6c90: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  0 ){.    int i;.
6ca0: 20 20 20 20 66 6f 72 28 69 3d 34 3b 20 7a 49 6e      for(i=4; zIn
6cb0: 5b 69 5d 3e 3d 27 30 27 20 26 26 20 7a 49 6e 5b  [i]>='0' && zIn[
6cc0: 69 5d 3c 3d 27 39 27 3b 20 69 2b 2b 29 3b 0a 20  i]<='9'; i++);. 
6cd0: 20 20 20 69 66 28 20 7a 49 6e 5b 69 5d 3d 3d 27     if( zIn[i]=='
6ce0: 5f 27 20 26 26 20 7a 49 6e 5b 69 2b 31 5d 20 29  _' && zIn[i+1] )
6cf0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
6d00: 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74  result_text(cont
6d10: 65 78 74 2c 20 26 7a 49 6e 5b 69 2b 31 5d 2c 20  ext, &zIn[i+1], 
6d20: 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  -1, SQLITE_STATI
6d30: 43 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  C);.    }.  }.}.
6d40: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
6d50: 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 73  e the iterator s
6d60: 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20  tructure passed 
6d70: 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
6d80: 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  gument..**.** If
6d90: 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
6da0: 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
6db0: 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20  eturned and the 
6dc0: 69 74 65 72 61 74 6f 72 20 69 73 20 6c 65 66 74  iterator is left
6dd0: 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74 6f   .** pointing to
6de0: 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
6df0: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20  . Otherwise, an 
6e00: 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 6d  error code and m
6e10: 65 73 73 61 67 65 20 69 73 20 0a 2a 2a 20 6c 65  essage is .** le
6e20: 66 74 20 69 6e 20 74 68 65 20 52 42 55 20 68 61  ft in the RBU ha
6e30: 6e 64 6c 65 20 70 61 73 73 65 64 20 61 73 20 74  ndle passed as t
6e40: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
6e50: 74 2e 20 41 20 63 6f 70 79 20 6f 66 20 74 68 65  t. A copy of the
6e60: 20 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20   .** error code 
6e70: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
6e80: 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 4f 62  static int rbuOb
6e90: 6a 49 74 65 72 46 69 72 73 74 28 73 71 6c 69 74  jIterFirst(sqlit
6ea0: 65 33 72 62 75 20 2a 70 2c 20 52 62 75 4f 62 6a  e3rbu *p, RbuObj
6eb0: 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
6ec0: 69 6e 74 20 72 63 3b 0a 20 20 6d 65 6d 73 65 74  int rc;.  memset
6ed0: 28 70 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f  (pIter, 0, sizeo
6ee0: 66 28 52 62 75 4f 62 6a 49 74 65 72 29 29 3b 0a  f(RbuObjIter));.
6ef0: 0a 20 20 72 63 20 3d 20 70 72 65 70 61 72 65 41  .  rc = prepareA
6f00: 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70  ndCollectError(p
6f10: 2d 3e 64 62 52 62 75 2c 20 26 70 49 74 65 72 2d  ->dbRbu, &pIter-
6f20: 3e 70 54 62 6c 49 74 65 72 2c 20 26 70 2d 3e 7a  >pTblIter, &p->z
6f30: 45 72 72 6d 73 67 2c 20 0a 20 20 20 20 20 20 22  Errmsg, .      "
6f40: 53 45 4c 45 43 54 20 72 62 75 5f 74 61 72 67 65  SELECT rbu_targe
6f50: 74 5f 6e 61 6d 65 28 6e 61 6d 65 29 20 41 53 20  t_name(name) AS 
6f60: 74 61 72 67 65 74 2c 20 6e 61 6d 65 20 46 52 4f  target, name FRO
6f70: 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  M sqlite_master 
6f80: 22 0a 20 20 20 20 20 20 22 57 48 45 52 45 20 74  ".      "WHERE t
6f90: 79 70 65 20 49 4e 20 28 27 74 61 62 6c 65 27 2c  ype IN ('table',
6fa0: 20 27 76 69 65 77 27 29 20 41 4e 44 20 74 61 72   'view') AND tar
6fb0: 67 65 74 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20  get IS NOT NULL 
6fc0: 22 0a 20 20 20 20 20 20 22 4f 52 44 45 52 20 42  ".      "ORDER B
6fd0: 59 20 6e 61 6d 65 22 0a 20 20 29 3b 0a 0a 20 20  Y name".  );..  
6fe0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
6ff0: 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 72  K ){.    rc = pr
7000: 65 70 61 72 65 41 6e 64 43 6f 6c 6c 65 63 74 45  epareAndCollectE
7010: 72 72 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20  rror(p->dbMain, 
7020: 26 70 49 74 65 72 2d 3e 70 49 64 78 49 74 65 72  &pIter->pIdxIter
7030: 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 0a 20  , &p->zErrmsg,. 
7040: 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 6e         "SELECT n
7050: 61 6d 65 2c 20 72 6f 6f 74 70 61 67 65 2c 20 73  ame, rootpage, s
7060: 71 6c 20 49 53 20 4e 55 4c 4c 20 4f 52 20 73 75  ql IS NULL OR su
7070: 62 73 74 72 28 38 2c 20 36 29 3d 3d 27 55 4e 49  bstr(8, 6)=='UNI
7080: 51 55 45 27 20 22 0a 20 20 20 20 20 20 20 20 22  QUE' ".        "
7090: 20 20 46 52 4f 4d 20 6d 61 69 6e 2e 73 71 6c 69    FROM main.sqli
70a0: 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20  te_master ".    
70b0: 20 20 20 20 22 20 20 57 48 45 52 45 20 74 79 70      "  WHERE typ
70c0: 65 3d 27 69 6e 64 65 78 27 20 41 4e 44 20 74 62  e='index' AND tb
70d0: 6c 5f 6e 61 6d 65 20 3d 20 3f 22 0a 20 20 20 20  l_name = ?".    
70e0: 29 3b 0a 20 20 7d 0a 0a 20 20 70 49 74 65 72 2d  );.  }..  pIter-
70f0: 3e 62 43 6c 65 61 6e 75 70 20 3d 20 31 3b 0a 20  >bCleanup = 1;. 
7100: 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 72   p->rc = rc;.  r
7110: 65 74 75 72 6e 20 72 62 75 4f 62 6a 49 74 65 72  eturn rbuObjIter
7120: 4e 65 78 74 28 70 2c 20 70 49 74 65 72 29 3b 0a  Next(p, pIter);.
7130: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  }../*.** This is
7140: 20 61 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e   a wrapper aroun
7150: 64 20 22 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  d "sqlite3_mprin
7160: 74 66 28 7a 46 6d 74 2c 20 2e 2e 2e 29 22 2e 20  tf(zFmt, ...)". 
7170: 49 66 20 61 6e 20 4f 4f 4d 20 6f 63 63 75 72 73  If an OOM occurs
7180: 2c 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 63 6f  ,.** an error co
7190: 64 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  de is stored in 
71a0: 74 68 65 20 52 42 55 20 68 61 6e 64 6c 65 20 70  the RBU handle p
71b0: 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
71c0: 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a  st argument..**.
71d0: 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68  ** If an error h
71e0: 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72  as already occur
71f0: 72 65 64 20 28 70 2d 3e 72 63 20 69 73 20 61 6c  red (p->rc is al
7200: 72 65 61 64 79 20 73 65 74 20 74 6f 20 73 6f 6d  ready set to som
7210: 65 74 68 69 6e 67 20 6f 74 68 65 72 0a 2a 2a 20  ething other.** 
7220: 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 29 2c  than SQLITE_OK),
7230: 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   then this funct
7240: 69 6f 6e 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c  ion returns NULL
7250: 20 77 69 74 68 6f 75 74 20 6d 6f 64 69 66 79 69   without modifyi
7260: 6e 67 20 74 68 65 0a 2a 2a 20 73 74 6f 72 65 64  ng the.** stored
7270: 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 6e 20   error code. In 
7280: 74 68 69 73 20 63 61 73 65 20 69 74 20 73 74 69  this case it sti
7290: 6c 6c 20 63 61 6c 6c 73 20 73 71 6c 69 74 65 33  ll calls sqlite3
72a0: 5f 66 72 65 65 28 29 20 6f 6e 20 61 6e 79 20 0a  _free() on any .
72b0: 2a 2a 20 70 72 69 6e 74 66 28 29 20 70 61 72 61  ** printf() para
72c0: 6d 65 74 65 72 73 20 61 73 73 6f 63 69 61 74 65  meters associate
72d0: 64 20 77 69 74 68 20 25 7a 20 63 6f 6e 76 65 72  d with %z conver
72e0: 73 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  sions..*/.static
72f0: 20 63 68 61 72 20 2a 72 62 75 4d 50 72 69 6e 74   char *rbuMPrint
7300: 66 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c  f(sqlite3rbu *p,
7310: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d   const char *zFm
7320: 74 2c 20 2e 2e 2e 29 7b 0a 20 20 63 68 61 72 20  t, ...){.  char 
7330: 2a 7a 53 71 6c 20 3d 20 30 3b 0a 20 20 76 61 5f  *zSql = 0;.  va_
7340: 6c 69 73 74 20 61 70 3b 0a 20 20 76 61 5f 73 74  list ap;.  va_st
7350: 61 72 74 28 61 70 2c 20 7a 46 6d 74 29 3b 0a 20  art(ap, zFmt);. 
7360: 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
7370: 76 6d 70 72 69 6e 74 66 28 7a 46 6d 74 2c 20 61  vmprintf(zFmt, a
7380: 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  p);.  if( p->rc=
7390: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
73a0: 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 20    if( zSql==0 ) 
73b0: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  p->rc = SQLITE_N
73c0: 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  OMEM;.  }else{. 
73d0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
73e0: 7a 53 71 6c 29 3b 0a 20 20 20 20 7a 53 71 6c 20  zSql);.    zSql 
73f0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 76 61 5f 65 6e  = 0;.  }.  va_en
7400: 64 28 61 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  d(ap);.  return 
7410: 7a 53 71 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  zSql;.}../*.** A
7420: 72 67 75 6d 65 6e 74 20 7a 46 6d 74 20 69 73 20  rgument zFmt is 
7430: 61 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  a sqlite3_mprint
7440: 66 28 29 20 73 74 79 6c 65 20 66 6f 72 6d 61 74  f() style format
7450: 20 73 74 72 69 6e 67 2e 20 54 68 65 20 74 72 61   string. The tra
7460: 69 6c 69 6e 67 0a 2a 2a 20 61 72 67 75 6d 65 6e  iling.** argumen
7470: 74 73 20 61 72 65 20 74 68 65 20 75 73 75 61 6c  ts are the usual
7480: 20 73 75 62 73 69 74 75 74 69 6f 6e 20 76 61 6c   subsitution val
7490: 75 65 73 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ues. This functi
74a0: 6f 6e 20 70 65 72 66 6f 72 6d 73 0a 2a 2a 20 74  on performs.** t
74b0: 68 65 20 70 72 69 6e 74 66 28 29 20 73 74 79 6c  he printf() styl
74c0: 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e 73 20  e substitutions 
74d0: 61 6e 64 20 65 78 65 63 75 74 65 73 20 74 68 65  and executes the
74e0: 20 72 65 73 75 6c 74 20 61 73 20 61 6e 20 53 51   result as an SQ
74f0: 4c 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 6f  L.** statement o
7500: 6e 20 74 68 65 20 52 42 55 20 68 61 6e 64 6c 65  n the RBU handle
7510: 73 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  s database..**.*
7520: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
7530: 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63  curs, an error c
7540: 6f 64 65 20 61 6e 64 20 65 72 72 6f 72 20 6d 65  ode and error me
7550: 73 73 61 67 65 20 69 73 20 73 74 6f 72 65 64 20  ssage is stored 
7560: 69 6e 20 74 68 65 0a 2a 2a 20 52 42 55 20 68 61  in the.** RBU ha
7570: 6e 64 6c 65 2e 20 49 66 20 61 6e 20 65 72 72 6f  ndle. If an erro
7580: 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63  r has already oc
7590: 63 75 72 72 65 64 20 77 68 65 6e 20 74 68 69 73  curred when this
75a0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20   function is.** 
75b0: 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20  called, it is a 
75c0: 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
75d0: 20 69 6e 74 20 72 62 75 4d 50 72 69 6e 74 66 45   int rbuMPrintfE
75e0: 78 65 63 28 73 71 6c 69 74 65 33 72 62 75 20 2a  xec(sqlite3rbu *
75f0: 70 2c 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  p, sqlite3 *db, 
7600: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d 74  const char *zFmt
7610: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
7620: 74 20 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 53  t ap;.  char *zS
7630: 71 6c 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61  ql;.  va_start(a
7640: 70 2c 20 7a 46 6d 74 29 3b 0a 20 20 7a 53 71 6c  p, zFmt);.  zSql
7650: 20 3d 20 73 71 6c 69 74 65 33 5f 76 6d 70 72 69   = sqlite3_vmpri
7660: 6e 74 66 28 7a 46 6d 74 2c 20 61 70 29 3b 0a 20  ntf(zFmt, ap);. 
7670: 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
7680: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
7690: 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20   zSql==0 ){.    
76a0: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
76b0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73  _NOMEM;.    }els
76c0: 65 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  e{.      p->rc =
76d0: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62   sqlite3_exec(db
76e0: 2c 20 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 26 70  , zSql, 0, 0, &p
76f0: 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a 20 20 20 20  ->zErrmsg);.    
7700: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  }.  }.  sqlite3_
7710: 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 76 61  free(zSql);.  va
7720: 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72 65 74 75  _end(ap);.  retu
7730: 72 6e 20 70 2d 3e 72 63 3b 0a 7d 0a 0a 2f 2a 0a  rn p->rc;.}../*.
7740: 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 61 6c  ** Attempt to al
7750: 6c 6f 63 61 74 65 20 61 6e 64 20 72 65 74 75 72  locate and retur
7760: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
7770: 20 7a 65 72 6f 65 64 20 62 6c 6f 63 6b 20 6f 66   zeroed block of
7780: 20 6e 42 79 74 65 20 0a 2a 2a 20 62 79 74 65 73   nByte .** bytes
7790: 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  . .**.** If an e
77a0: 72 72 6f 72 20 28 69 2e 65 2e 20 61 6e 20 4f 4f  rror (i.e. an OO
77b0: 4d 20 63 6f 6e 64 69 74 69 6f 6e 29 20 6f 63 63  M condition) occ
77c0: 75 72 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c  urs, return NULL
77d0: 20 61 6e 64 20 6c 65 61 76 65 20 61 6e 20 0a 2a   and leave an .*
77e0: 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 6e 20  * error code in 
77f0: 74 68 65 20 72 62 75 20 68 61 6e 64 6c 65 20 70  the rbu handle p
7800: 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
7810: 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 4f 72 2c  st argument. Or,
7820: 20 69 66 20 61 6e 20 0a 2a 2a 20 65 72 72 6f 72   if an .** error
7830: 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63   has already occ
7840: 75 72 72 65 64 20 77 68 65 6e 20 74 68 69 73 20  urred when this 
7850: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
7860: 65 64 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20  ed, return NULL 
7870: 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  .** immediately 
7880: 77 69 74 68 6f 75 74 20 61 74 74 65 6d 70 74 69  without attempti
7890: 6e 67 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f  ng the allocatio
78a0: 6e 20 6f 72 20 6d 6f 64 69 66 79 69 6e 67 20 74  n or modifying t
78b0: 68 65 20 73 74 6f 72 65 64 0a 2a 2a 20 65 72 72  he stored.** err
78c0: 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  or code..*/.stat
78d0: 69 63 20 76 6f 69 64 20 2a 72 62 75 4d 61 6c 6c  ic void *rbuMall
78e0: 6f 63 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70  oc(sqlite3rbu *p
78f0: 2c 20 69 6e 74 20 6e 42 79 74 65 29 7b 0a 20 20  , int nByte){.  
7900: 76 6f 69 64 20 2a 70 52 65 74 20 3d 20 30 3b 0a  void *pRet = 0;.
7910: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
7920: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73  ITE_OK ){.    as
7930: 73 65 72 74 28 20 6e 42 79 74 65 3e 30 20 29 3b  sert( nByte>0 );
7940: 0a 20 20 20 20 70 52 65 74 20 3d 20 73 71 6c 69  .    pRet = sqli
7950: 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 42 79 74 65  te3_malloc(nByte
7960: 29 3b 0a 20 20 20 20 69 66 28 20 70 52 65 74 3d  );.    if( pRet=
7970: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72  =0 ){.      p->r
7980: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
7990: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
79a0: 20 20 20 6d 65 6d 73 65 74 28 70 52 65 74 2c 20     memset(pRet, 
79b0: 30 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 7d  0, nByte);.    }
79c0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52  .  }.  return pR
79d0: 65 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c  et;.}.../*.** Al
79e0: 6c 6f 63 61 74 65 20 61 6e 64 20 7a 65 72 6f 20  locate and zero 
79f0: 74 68 65 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c  the pIter->azTbl
7a00: 43 6f 6c 5b 5d 20 61 6e 64 20 61 62 54 62 6c 50  Col[] and abTblP
7a10: 6b 5b 5d 20 61 72 72 61 79 73 20 73 6f 20 74 68  k[] arrays so th
7a20: 61 74 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 72  at.** there is r
7a30: 6f 6f 6d 20 66 6f 72 20 61 74 20 6c 65 61 73 74  oom for at least
7a40: 20 6e 43 6f 6c 20 65 6c 65 6d 65 6e 74 73 2e 20   nCol elements. 
7a50: 49 66 20 61 6e 20 4f 4f 4d 20 6f 63 63 75 72 73  If an OOM occurs
7a60: 2c 20 73 74 6f 72 65 20 61 6e 0a 2a 2a 20 65 72  , store an.** er
7a70: 72 6f 72 20 63 6f 64 65 20 69 6e 20 74 68 65 20  ror code in the 
7a80: 52 42 55 20 68 61 6e 64 6c 65 20 70 61 73 73 65  RBU handle passe
7a90: 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  d as the first a
7aa0: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  rgument..*/.stat
7ab0: 69 63 20 76 6f 69 64 20 72 62 75 41 6c 6c 6f 63  ic void rbuAlloc
7ac0: 61 74 65 49 74 65 72 41 72 72 61 79 73 28 73 71  ateIterArrays(sq
7ad0: 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 52 62 75  lite3rbu *p, Rbu
7ae0: 4f 62 6a 49 74 65 72 20 2a 70 49 74 65 72 2c 20  ObjIter *pIter, 
7af0: 69 6e 74 20 6e 43 6f 6c 29 7b 0a 20 20 69 6e 74  int nCol){.  int
7b00: 20 6e 42 79 74 65 20 3d 20 28 32 2a 73 69 7a 65   nByte = (2*size
7b10: 6f 66 28 63 68 61 72 2a 29 20 2b 20 73 69 7a 65  of(char*) + size
7b20: 6f 66 28 69 6e 74 29 20 2b 20 33 2a 73 69 7a 65  of(int) + 3*size
7b30: 6f 66 28 75 38 29 29 20 2a 20 6e 43 6f 6c 3b 0a  of(u8)) * nCol;.
7b40: 20 20 63 68 61 72 20 2a 2a 61 7a 4e 65 77 3b 0a    char **azNew;.
7b50: 0a 20 20 61 7a 4e 65 77 20 3d 20 28 63 68 61 72  .  azNew = (char
7b60: 2a 2a 29 72 62 75 4d 61 6c 6c 6f 63 28 70 2c 20  **)rbuMalloc(p, 
7b70: 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 61 7a  nByte);.  if( az
7b80: 4e 65 77 20 29 7b 0a 20 20 20 20 70 49 74 65 72  New ){.    pIter
7b90: 2d 3e 61 7a 54 62 6c 43 6f 6c 20 3d 20 61 7a 4e  ->azTblCol = azN
7ba0: 65 77 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 61  ew;.    pIter->a
7bb0: 7a 54 62 6c 54 79 70 65 20 3d 20 26 61 7a 4e 65  zTblType = &azNe
7bc0: 77 5b 6e 43 6f 6c 5d 3b 0a 20 20 20 20 70 49 74  w[nCol];.    pIt
7bd0: 65 72 2d 3e 61 69 53 72 63 4f 72 64 65 72 20 3d  er->aiSrcOrder =
7be0: 20 28 69 6e 74 2a 29 26 70 49 74 65 72 2d 3e 61   (int*)&pIter->a
7bf0: 7a 54 62 6c 54 79 70 65 5b 6e 43 6f 6c 5d 3b 0a  zTblType[nCol];.
7c00: 20 20 20 20 70 49 74 65 72 2d 3e 61 62 54 62 6c      pIter->abTbl
7c10: 50 6b 20 3d 20 28 75 38 2a 29 26 70 49 74 65 72  Pk = (u8*)&pIter
7c20: 2d 3e 61 69 53 72 63 4f 72 64 65 72 5b 6e 43 6f  ->aiSrcOrder[nCo
7c30: 6c 5d 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 61  l];.    pIter->a
7c40: 62 4e 6f 74 4e 75 6c 6c 20 3d 20 28 75 38 2a 29  bNotNull = (u8*)
7c50: 26 70 49 74 65 72 2d 3e 61 62 54 62 6c 50 6b 5b  &pIter->abTblPk[
7c60: 6e 43 6f 6c 5d 3b 0a 20 20 20 20 70 49 74 65 72  nCol];.    pIter
7c70: 2d 3e 61 62 49 6e 64 65 78 65 64 20 3d 20 28 75  ->abIndexed = (u
7c80: 38 2a 29 26 70 49 74 65 72 2d 3e 61 62 4e 6f 74  8*)&pIter->abNot
7c90: 4e 75 6c 6c 5b 6e 43 6f 6c 5d 3b 0a 20 20 7d 0a  Null[nCol];.  }.
7ca0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72  }../*.** The fir
7cb0: 73 74 20 61 72 67 75 6d 65 6e 74 20 6d 75 73 74  st argument must
7cc0: 20 62 65 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e   be a nul-termin
7cd0: 61 74 65 64 20 73 74 72 69 6e 67 2e 20 54 68 69  ated string. Thi
7ce0: 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 72 65  s function.** re
7cf0: 74 75 72 6e 73 20 61 20 63 6f 70 79 20 6f 66 20  turns a copy of 
7d00: 74 68 65 20 73 74 72 69 6e 67 20 69 6e 20 6d 65  the string in me
7d10: 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72  mory obtained fr
7d20: 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
7d30: 63 28 29 2e 0a 2a 2a 20 49 74 20 69 73 20 74 68  c()..** It is th
7d40: 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
7d50: 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74   of the caller t
7d60: 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65  o eventually fre
7d70: 65 20 74 68 69 73 20 6d 65 6d 6f 72 79 0a 2a 2a  e this memory.**
7d80: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 66   using sqlite3_f
7d90: 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ree()..**.** If 
7da0: 61 6e 20 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e  an OOM condition
7db0: 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   is encountered 
7dc0: 77 68 65 6e 20 61 74 74 65 6d 70 74 69 6e 67 20  when attempting 
7dd0: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f  to allocate memo
7de0: 72 79 2c 0a 2a 2a 20 6f 75 74 70 75 74 20 76 61  ry,.** output va
7df0: 72 69 61 62 6c 65 20 28 2a 70 52 63 29 20 69 73  riable (*pRc) is
7e00: 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4e   set to SQLITE_N
7e10: 4f 4d 45 4d 20 62 65 66 6f 72 65 20 72 65 74 75  OMEM before retu
7e20: 72 6e 69 6e 67 2e 20 4f 74 68 65 72 77 69 73 65  rning. Otherwise
7e30: 2c 0a 2a 2a 20 69 66 20 74 68 65 20 61 6c 6c 6f  ,.** if the allo
7e40: 63 61 74 69 6f 6e 20 73 75 63 63 65 65 64 73 2c  cation succeeds,
7e50: 20 28 2a 70 52 63 29 20 69 73 20 6c 65 66 74 20   (*pRc) is left 
7e60: 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 73 74  unchanged..*/.st
7e70: 61 74 69 63 20 63 68 61 72 20 2a 72 62 75 53 74  atic char *rbuSt
7e80: 72 6e 64 75 70 28 63 6f 6e 73 74 20 63 68 61 72  rndup(const char
7e90: 20 2a 7a 53 74 72 2c 20 69 6e 74 20 2a 70 52 63   *zStr, int *pRc
7ea0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 52 65 74 20  ){.  char *zRet 
7eb0: 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
7ec0: 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  *pRc==SQLITE_OK 
7ed0: 29 3b 0a 20 20 69 66 28 20 7a 53 74 72 20 29 7b  );.  if( zStr ){
7ee0: 0a 20 20 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d  .    int nCopy =
7ef0: 20 73 74 72 6c 65 6e 28 7a 53 74 72 29 20 2b 20   strlen(zStr) + 
7f00: 31 3b 0a 20 20 20 20 7a 52 65 74 20 3d 20 28 63  1;.    zRet = (c
7f10: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c  har*)sqlite3_mal
7f20: 6c 6f 63 28 6e 43 6f 70 79 29 3b 0a 20 20 20 20  loc(nCopy);.    
7f30: 69 66 28 20 7a 52 65 74 20 29 7b 0a 20 20 20 20  if( zRet ){.    
7f40: 20 20 6d 65 6d 63 70 79 28 7a 52 65 74 2c 20 7a    memcpy(zRet, z
7f50: 53 74 72 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20  Str, nCopy);.   
7f60: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70   }else{.      *p
7f70: 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  Rc = SQLITE_NOME
7f80: 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  M;.    }.  }..  
7f90: 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 0a  return zRet;.}..
7fa0: 2f 2a 0a 2a 2a 20 46 69 6e 61 6c 69 7a 65 20 74  /*.** Finalize t
7fb0: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73  he statement pas
7fc0: 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
7fd0: 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a  d argument..**.*
7fe0: 2a 20 49 66 20 74 68 65 20 73 71 6c 69 74 65 33  * If the sqlite3
7ff0: 5f 66 69 6e 61 6c 69 7a 65 28 29 20 63 61 6c 6c  _finalize() call
8000: 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
8010: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
8020: 20 61 6e 64 20 74 68 65 0a 2a 2a 20 72 62 75 20   and the.** rbu 
8030: 68 61 6e 64 6c 65 20 65 72 72 6f 72 20 63 6f 64  handle error cod
8040: 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
8050: 20 73 65 74 2c 20 73 65 74 20 74 68 65 20 65 72   set, set the er
8060: 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 65 72 72  ror code and err
8070: 6f 72 0a 2a 2a 20 6d 65 73 73 61 67 65 20 61 63  or.** message ac
8080: 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 73 74  cordingly..*/.st
8090: 61 74 69 63 20 76 6f 69 64 20 72 62 75 46 69 6e  atic void rbuFin
80a0: 61 6c 69 7a 65 28 73 71 6c 69 74 65 33 72 62 75  alize(sqlite3rbu
80b0: 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 73 74 6d   *p, sqlite3_stm
80c0: 74 20 2a 70 53 74 6d 74 29 7b 0a 20 20 73 71 6c  t *pStmt){.  sql
80d0: 69 74 65 33 20 2a 64 62 20 3d 20 73 71 6c 69 74  ite3 *db = sqlit
80e0: 65 33 5f 64 62 5f 68 61 6e 64 6c 65 28 70 53 74  e3_db_handle(pSt
80f0: 6d 74 29 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  mt);.  int rc = 
8100: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
8110: 28 70 53 74 6d 74 29 3b 0a 20 20 69 66 28 20 70  (pStmt);.  if( p
8120: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
8130: 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  && rc!=SQLITE_OK
8140: 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
8150: 72 63 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72 6d  rc;.    p->zErrm
8160: 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  sg = sqlite3_mpr
8170: 69 6e 74 66 28 22 25 73 22 2c 20 73 71 6c 69 74  intf("%s", sqlit
8180: 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a  e3_errmsg(db));.
8190: 20 20 7d 0a 7d 0a 0a 2f 2a 20 44 65 74 65 72 6d    }.}../* Determ
81a0: 69 6e 65 20 74 68 65 20 74 79 70 65 20 6f 66 20  ine the type of 
81b0: 61 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20  a table..**.**  
81c0: 20 70 65 54 79 70 65 20 69 73 20 6f 66 20 74 79   peType is of ty
81d0: 70 65 20 28 69 6e 74 2a 29 2c 20 61 20 70 6f 69  pe (int*), a poi
81e0: 6e 74 65 72 20 74 6f 20 61 6e 20 6f 75 74 70 75  nter to an outpu
81f0: 74 20 70 61 72 61 6d 65 74 65 72 20 6f 66 20 74  t parameter of t
8200: 79 70 65 0a 2a 2a 20 20 20 28 69 6e 74 29 2e 20  ype.**   (int). 
8210: 54 68 69 73 20 63 61 6c 6c 20 73 65 74 73 20 74  This call sets t
8220: 68 65 20 6f 75 74 70 75 74 20 70 61 72 61 6d 65  he output parame
8230: 74 65 72 20 61 73 20 66 6f 6c 6c 6f 77 73 2c 20  ter as follows, 
8240: 64 65 70 65 6e 64 69 6e 67 0a 2a 2a 20 20 20 6f  depending.**   o
8250: 6e 20 74 68 65 20 74 79 70 65 20 6f 66 20 74 68  n the type of th
8260: 65 20 74 61 62 6c 65 20 73 70 65 63 69 66 69 65  e table specifie
8270: 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 73 20  d by parameters 
8280: 64 62 4e 61 6d 65 20 61 6e 64 20 7a 54 62 6c 2e  dbName and zTbl.
8290: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52 42 55 5f 50  .**.**     RBU_P
82a0: 4b 5f 4e 4f 54 41 42 4c 45 3a 20 20 20 20 20 20  K_NOTABLE:      
82b0: 20 4e 6f 20 73 75 63 68 20 74 61 62 6c 65 2e 0a   No such table..
82c0: 2a 2a 20 20 20 20 20 52 42 55 5f 50 4b 5f 4e 4f  **     RBU_PK_NO
82d0: 4e 45 3a 20 20 20 20 20 20 20 20 20 20 54 61 62  NE:          Tab
82e0: 6c 65 20 68 61 73 20 61 6e 20 69 6d 70 6c 69 63  le has an implic
82f0: 69 74 20 72 6f 77 69 64 2e 0a 2a 2a 20 20 20 20  it rowid..**    
8300: 20 52 42 55 5f 50 4b 5f 49 50 4b 3a 20 20 20 20   RBU_PK_IPK:    
8310: 20 20 20 20 20 20 20 54 61 62 6c 65 20 68 61 73         Table has
8320: 20 61 6e 20 65 78 70 6c 69 63 69 74 20 49 50 4b   an explicit IPK
8330: 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 20 20 20 20 20   column..**     
8340: 52 42 55 5f 50 4b 5f 45 58 54 45 52 4e 41 4c 3a  RBU_PK_EXTERNAL:
8350: 20 20 20 20 20 20 54 61 62 6c 65 20 68 61 73 20        Table has 
8360: 61 6e 20 65 78 74 65 72 6e 61 6c 20 50 4b 20 69  an external PK i
8370: 6e 64 65 78 2e 0a 2a 2a 20 20 20 20 20 52 42 55  ndex..**     RBU
8380: 5f 50 4b 5f 57 49 54 48 4f 55 54 5f 52 4f 57 49  _PK_WITHOUT_ROWI
8390: 44 3a 20 54 61 62 6c 65 20 69 73 20 57 49 54 48  D: Table is WITH
83a0: 4f 55 54 20 52 4f 57 49 44 2e 0a 2a 2a 20 20 20  OUT ROWID..**   
83b0: 20 20 52 42 55 5f 50 4b 5f 56 54 41 42 3a 20 20    RBU_PK_VTAB:  
83c0: 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 69 73          Table is
83d0: 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
83e0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 41 72 67 75 6d 65  ..**.**   Argume
83f0: 6e 74 20 2a 70 69 50 6b 20 69 73 20 61 6c 73 6f  nt *piPk is also
8400: 20 6f 66 20 74 79 70 65 20 28 69 6e 74 2a 29 2c   of type (int*),
8410: 20 61 6e 64 20 61 6c 73 6f 20 70 6f 69 6e 74 73   and also points
8420: 20 74 6f 20 61 6e 20 6f 75 74 70 75 74 0a 2a 2a   to an output.**
8430: 20 20 20 70 61 72 61 6d 65 74 65 72 2e 20 55 6e     parameter. Un
8440: 6c 65 73 73 20 74 68 65 20 74 61 62 6c 65 20 68  less the table h
8450: 61 73 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 70  as an external p
8460: 72 69 6d 61 72 79 20 6b 65 79 20 69 6e 64 65 78  rimary key index
8470: 20 0a 2a 2a 20 20 20 28 69 2e 65 2e 20 75 6e 6c   .**   (i.e. unl
8480: 65 73 73 20 2a 70 65 54 79 70 65 20 69 73 20 73  ess *peType is s
8490: 65 74 20 74 6f 20 33 29 2c 20 74 68 65 6e 20 2a  et to 3), then *
84a0: 70 69 50 6b 20 69 73 20 73 65 74 20 74 6f 20 7a  piPk is set to z
84b0: 65 72 6f 2e 20 4f 72 2c 0a 2a 2a 20 20 20 69 66  ero. Or,.**   if
84c0: 20 74 68 65 20 74 61 62 6c 65 20 64 6f 65 73 20   the table does 
84d0: 68 61 76 65 20 61 6e 20 65 78 74 65 72 6e 61 6c  have an external
84e0: 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e 64   primary key ind
84f0: 65 78 2c 20 74 68 65 6e 20 2a 70 69 50 6b 0a 2a  ex, then *piPk.*
8500: 2a 20 20 20 69 73 20 73 65 74 20 74 6f 20 74 68  *   is set to th
8510: 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62  e root page numb
8520: 65 72 20 6f 66 20 74 68 65 20 70 72 69 6d 61 72  er of the primar
8530: 79 20 6b 65 79 20 69 6e 64 65 78 20 62 65 66 6f  y key index befo
8540: 72 65 0a 2a 2a 20 20 20 72 65 74 75 72 6e 69 6e  re.**   returnin
8550: 67 2e 0a 2a 2a 0a 2a 2a 20 41 4c 47 4f 52 49 54  g..**.** ALGORIT
8560: 48 4d 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20  HM:.**.**   if( 
8570: 6e 6f 20 65 6e 74 72 79 20 65 78 69 73 74 73 20  no entry exists 
8580: 69 6e 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  in sqlite_master
8590: 20 29 7b 0a 2a 2a 20 20 20 20 20 72 65 74 75 72   ){.**     retur
85a0: 6e 20 52 42 55 5f 50 4b 5f 4e 4f 54 41 42 4c 45  n RBU_PK_NOTABLE
85b0: 0a 2a 2a 20 20 20 7d 65 6c 73 65 20 69 66 28 20  .**   }else if( 
85c0: 73 71 6c 20 66 6f 72 20 74 68 65 20 65 6e 74 72  sql for the entr
85d0: 79 20 73 74 61 72 74 73 20 77 69 74 68 20 22 43  y starts with "C
85e0: 52 45 41 54 45 20 56 49 52 54 55 41 4c 22 20 29  REATE VIRTUAL" )
85f0: 7b 0a 2a 2a 20 20 20 20 20 72 65 74 75 72 6e 20  {.**     return 
8600: 52 42 55 5f 50 4b 5f 56 54 41 42 0a 2a 2a 20 20  RBU_PK_VTAB.**  
8610: 20 7d 65 6c 73 65 20 69 66 28 20 22 50 52 41 47   }else if( "PRAG
8620: 4d 41 20 69 6e 64 65 78 5f 6c 69 73 74 28 29 22  MA index_list()"
8630: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 63   for the table c
8640: 6f 6e 74 61 69 6e 73 20 61 20 22 70 6b 22 20 69  ontains a "pk" i
8650: 6e 64 65 78 20 29 7b 0a 2a 2a 20 20 20 20 20 69  ndex ){.**     i
8660: 66 28 20 74 68 65 20 69 6e 64 65 78 20 74 68 61  f( the index tha
8670: 74 20 69 73 20 74 68 65 20 70 6b 20 65 78 69 73  t is the pk exis
8680: 74 73 20 69 6e 20 73 71 6c 69 74 65 5f 6d 61 73  ts in sqlite_mas
8690: 74 65 72 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  ter ){.**       
86a0: 2a 70 69 50 4b 20 3d 20 72 6f 6f 74 70 61 67 65  *piPK = rootpage
86b0: 20 6f 66 20 74 68 61 74 20 69 6e 64 65 78 2e 0a   of that index..
86c0: 2a 2a 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  **       return 
86d0: 52 42 55 5f 50 4b 5f 45 58 54 45 52 4e 41 4c 0a  RBU_PK_EXTERNAL.
86e0: 2a 2a 20 20 20 20 20 7d 65 6c 73 65 7b 0a 2a 2a  **     }else{.**
86f0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 52 42         return RB
8700: 55 5f 50 4b 5f 57 49 54 48 4f 55 54 5f 52 4f 57  U_PK_WITHOUT_ROW
8710: 49 44 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20  ID.**     }.**  
8720: 20 7d 65 6c 73 65 20 69 66 28 20 22 50 52 41 47   }else if( "PRAG
8730: 4d 41 20 74 61 62 6c 65 5f 69 6e 66 6f 28 29 22  MA table_info()"
8740: 20 6c 69 73 74 73 20 6f 6e 65 20 6f 72 20 6d 6f   lists one or mo
8750: 72 65 20 22 70 6b 22 20 63 6f 6c 75 6d 6e 73 20  re "pk" columns 
8760: 29 7b 0a 2a 2a 20 20 20 20 20 72 65 74 75 72 6e  ){.**     return
8770: 20 52 42 55 5f 50 4b 5f 49 50 4b 0a 2a 2a 20 20   RBU_PK_IPK.**  
8780: 20 7d 65 6c 73 65 7b 0a 2a 2a 20 20 20 20 20 72   }else{.**     r
8790: 65 74 75 72 6e 20 52 42 55 5f 50 4b 5f 4e 4f 4e  eturn RBU_PK_NON
87a0: 45 0a 2a 2a 20 20 20 7d 0a 2a 2f 0a 73 74 61 74  E.**   }.*/.stat
87b0: 69 63 20 76 6f 69 64 20 72 62 75 54 61 62 6c 65  ic void rbuTable
87c0: 54 79 70 65 28 0a 20 20 73 71 6c 69 74 65 33 72  Type(.  sqlite3r
87d0: 62 75 20 2a 70 2c 0a 20 20 63 6f 6e 73 74 20 63  bu *p,.  const c
87e0: 68 61 72 20 2a 7a 54 61 62 2c 0a 20 20 69 6e 74  har *zTab,.  int
87f0: 20 2a 70 65 54 79 70 65 2c 0a 20 20 69 6e 74 20   *peType,.  int 
8800: 2a 70 69 54 6e 75 6d 2c 0a 20 20 69 6e 74 20 2a  *piTnum,.  int *
8810: 70 69 50 6b 0a 29 7b 0a 20 20 2f 2a 0a 20 20 2a  piPk.){.  /*.  *
8820: 2a 20 30 29 20 53 45 4c 45 43 54 20 63 6f 75 6e  * 0) SELECT coun
8830: 74 28 2a 29 20 46 52 4f 4d 20 73 71 6c 69 74 65  t(*) FROM sqlite
8840: 5f 6d 61 73 74 65 72 20 77 68 65 72 65 20 6e 61  _master where na
8850: 6d 65 3d 25 51 20 41 4e 44 20 49 73 56 69 72 74  me=%Q AND IsVirt
8860: 75 61 6c 28 25 51 29 0a 20 20 2a 2a 20 31 29 20  ual(%Q).  ** 1) 
8870: 50 52 41 47 4d 41 20 69 6e 64 65 78 5f 6c 69 73  PRAGMA index_lis
8880: 74 20 3d 20 3f 0a 20 20 2a 2a 20 32 29 20 53 45  t = ?.  ** 2) SE
8890: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
88a0: 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  OM sqlite_master
88b0: 20 77 68 65 72 65 20 6e 61 6d 65 3d 25 51 20 0a   where name=%Q .
88c0: 20 20 2a 2a 20 33 29 20 50 52 41 47 4d 41 20 74    ** 3) PRAGMA t
88d0: 61 62 6c 65 5f 69 6e 66 6f 20 3d 20 3f 0a 20 20  able_info = ?.  
88e0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  */.  sqlite3_stm
88f0: 74 20 2a 61 53 74 6d 74 5b 34 5d 20 3d 20 7b 30  t *aStmt[4] = {0
8900: 2c 20 30 2c 20 30 2c 20 30 7d 3b 0a 0a 20 20 2a  , 0, 0, 0};..  *
8910: 70 65 54 79 70 65 20 3d 20 52 42 55 5f 50 4b 5f  peType = RBU_PK_
8920: 4e 4f 54 41 42 4c 45 3b 0a 20 20 2a 70 69 50 6b  NOTABLE;.  *piPk
8930: 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
8940: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
8950: 4b 20 29 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 70  K );.  p->rc = p
8960: 72 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f 6c  repareFreeAndCol
8970: 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 4d  lectError(p->dbM
8980: 61 69 6e 2c 20 26 61 53 74 6d 74 5b 30 5d 2c 20  ain, &aStmt[0], 
8990: 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 20 0a 20 20  &p->zErrmsg, .  
89a0: 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74    sqlite3_mprint
89b0: 66 28 0a 20 20 20 20 20 20 20 20 20 20 22 53 45  f(.          "SE
89c0: 4c 45 43 54 20 28 73 71 6c 20 4c 49 4b 45 20 27  LECT (sql LIKE '
89d0: 63 72 65 61 74 65 20 76 69 72 74 75 61 6c 25 25  create virtual%%
89e0: 27 29 2c 20 72 6f 6f 74 70 61 67 65 22 0a 20 20  '), rootpage".  
89f0: 20 20 20 20 20 20 20 20 22 20 20 46 52 4f 4d 20          "  FROM 
8a00: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 0a 20  sqlite_master". 
8a10: 20 20 20 20 20 20 20 20 20 22 20 57 48 45 52 45           " WHERE
8a20: 20 6e 61 6d 65 3d 25 51 22 2c 20 7a 54 61 62 0a   name=%Q", zTab.
8a30: 20 20 29 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72    ));.  if( p->r
8a40: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
8a50: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 61 53 74  sqlite3_step(aSt
8a60: 6d 74 5b 30 5d 29 21 3d 53 51 4c 49 54 45 5f 52  mt[0])!=SQLITE_R
8a70: 4f 57 20 29 7b 0a 20 20 20 20 2f 2a 20 45 69 74  OW ){.    /* Eit
8a80: 68 65 72 20 61 6e 20 65 72 72 6f 72 2c 20 6f 72  her an error, or
8a90: 20 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 2e 20   no such table. 
8aa0: 2a 2f 0a 20 20 20 20 67 6f 74 6f 20 72 62 75 54  */.    goto rbuT
8ab0: 61 62 6c 65 54 79 70 65 5f 65 6e 64 3b 0a 20 20  ableType_end;.  
8ac0: 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  }.  if( sqlite3_
8ad0: 63 6f 6c 75 6d 6e 5f 69 6e 74 28 61 53 74 6d 74  column_int(aStmt
8ae0: 5b 30 5d 2c 20 30 29 20 29 7b 0a 20 20 20 20 2a  [0], 0) ){.    *
8af0: 70 65 54 79 70 65 20 3d 20 52 42 55 5f 50 4b 5f  peType = RBU_PK_
8b00: 56 54 41 42 3b 20 20 20 20 20 20 20 20 20 20 20  VTAB;           
8b10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 76 69 72            /* vir
8b20: 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20  tual table */.  
8b30: 20 20 67 6f 74 6f 20 72 62 75 54 61 62 6c 65 54    goto rbuTableT
8b40: 79 70 65 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 2a  ype_end;.  }.  *
8b50: 70 69 54 6e 75 6d 20 3d 20 73 71 6c 69 74 65 33  piTnum = sqlite3
8b60: 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 61 53 74 6d  _column_int(aStm
8b70: 74 5b 30 5d 2c 20 31 29 3b 0a 0a 20 20 70 2d 3e  t[0], 1);..  p->
8b80: 72 63 20 3d 20 70 72 65 70 61 72 65 46 72 65 65  rc = prepareFree
8b90: 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28  AndCollectError(
8ba0: 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 61 53 74 6d  p->dbMain, &aStm
8bb0: 74 5b 31 5d 2c 20 26 70 2d 3e 7a 45 72 72 6d 73  t[1], &p->zErrms
8bc0: 67 2c 20 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  g, .    sqlite3_
8bd0: 6d 70 72 69 6e 74 66 28 22 50 52 41 47 4d 41 20  mprintf("PRAGMA 
8be0: 69 6e 64 65 78 5f 6c 69 73 74 3d 25 51 22 2c 7a  index_list=%Q",z
8bf0: 54 61 62 29 0a 20 20 29 3b 0a 20 20 69 66 28 20  Tab).  );.  if( 
8c00: 70 2d 3e 72 63 20 29 20 67 6f 74 6f 20 72 62 75  p->rc ) goto rbu
8c10: 54 61 62 6c 65 54 79 70 65 5f 65 6e 64 3b 0a 20  TableType_end;. 
8c20: 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33 5f   while( sqlite3_
8c30: 73 74 65 70 28 61 53 74 6d 74 5b 31 5d 29 3d 3d  step(aStmt[1])==
8c40: 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
8c50: 20 20 63 6f 6e 73 74 20 75 38 20 2a 7a 4f 72 69    const u8 *zOri
8c60: 67 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  g = sqlite3_colu
8c70: 6d 6e 5f 74 65 78 74 28 61 53 74 6d 74 5b 31 5d  mn_text(aStmt[1]
8c80: 2c 20 33 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20  , 3);.    const 
8c90: 75 38 20 2a 7a 49 64 78 20 3d 20 73 71 6c 69 74  u8 *zIdx = sqlit
8ca0: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 61  e3_column_text(a
8cb0: 53 74 6d 74 5b 31 5d 2c 20 31 29 3b 0a 20 20 20  Stmt[1], 1);.   
8cc0: 20 69 66 28 20 7a 4f 72 69 67 20 26 26 20 7a 49   if( zOrig && zI
8cd0: 64 78 20 26 26 20 7a 4f 72 69 67 5b 30 5d 3d 3d  dx && zOrig[0]==
8ce0: 27 70 27 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  'p' ){.      p->
8cf0: 72 63 20 3d 20 70 72 65 70 61 72 65 46 72 65 65  rc = prepareFree
8d00: 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28  AndCollectError(
8d10: 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 61 53 74 6d  p->dbMain, &aStm
8d20: 74 5b 32 5d 2c 20 26 70 2d 3e 7a 45 72 72 6d 73  t[2], &p->zErrms
8d30: 67 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73 71  g, .          sq
8d40: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20  lite3_mprintf(. 
8d50: 20 20 20 20 20 20 20 20 20 20 20 22 53 45 4c 45             "SELE
8d60: 43 54 20 72 6f 6f 74 70 61 67 65 20 46 52 4f 4d  CT rootpage FROM
8d70: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 57   sqlite_master W
8d80: 48 45 52 45 20 6e 61 6d 65 20 3d 20 25 51 22 2c  HERE name = %Q",
8d90: 20 7a 49 64 78 0a 20 20 20 20 20 20 29 29 3b 0a   zIdx.      ));.
8da0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
8db0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
8dc0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
8dd0: 33 5f 73 74 65 70 28 61 53 74 6d 74 5b 32 5d 29  3_step(aStmt[2])
8de0: 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
8df0: 20 20 20 20 20 20 20 20 20 20 2a 70 69 50 6b 20            *piPk 
8e00: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
8e10: 5f 69 6e 74 28 61 53 74 6d 74 5b 32 5d 2c 20 30  _int(aStmt[2], 0
8e20: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 65  );.          *pe
8e30: 54 79 70 65 20 3d 20 52 42 55 5f 50 4b 5f 45 58  Type = RBU_PK_EX
8e40: 54 45 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20  TERNAL;.        
8e50: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
8e60: 20 2a 70 65 54 79 70 65 20 3d 20 52 42 55 5f 50   *peType = RBU_P
8e70: 4b 5f 57 49 54 48 4f 55 54 5f 52 4f 57 49 44 3b  K_WITHOUT_ROWID;
8e80: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
8e90: 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 72 62   }.      goto rb
8ea0: 75 54 61 62 6c 65 54 79 70 65 5f 65 6e 64 3b 0a  uTableType_end;.
8eb0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 2d 3e      }.  }..  p->
8ec0: 72 63 20 3d 20 70 72 65 70 61 72 65 46 72 65 65  rc = prepareFree
8ed0: 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28  AndCollectError(
8ee0: 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 61 53 74 6d  p->dbMain, &aStm
8ef0: 74 5b 33 5d 2c 20 26 70 2d 3e 7a 45 72 72 6d 73  t[3], &p->zErrms
8f00: 67 2c 20 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  g, .    sqlite3_
8f10: 6d 70 72 69 6e 74 66 28 22 50 52 41 47 4d 41 20  mprintf("PRAGMA 
8f20: 74 61 62 6c 65 5f 69 6e 66 6f 3d 25 51 22 2c 7a  table_info=%Q",z
8f30: 54 61 62 29 0a 20 20 29 3b 0a 20 20 69 66 28 20  Tab).  );.  if( 
8f40: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
8f50: 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 73   ){.    while( s
8f60: 71 6c 69 74 65 33 5f 73 74 65 70 28 61 53 74 6d  qlite3_step(aStm
8f70: 74 5b 33 5d 29 3d 3d 53 51 4c 49 54 45 5f 52 4f  t[3])==SQLITE_RO
8f80: 57 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  W ){.      if( s
8f90: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
8fa0: 74 28 61 53 74 6d 74 5b 33 5d 2c 35 29 3e 30 20  t(aStmt[3],5)>0 
8fb0: 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 65 54 79  ){.        *peTy
8fc0: 70 65 20 3d 20 52 42 55 5f 50 4b 5f 49 50 4b 3b  pe = RBU_PK_IPK;
8fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8fe0: 2f 2a 20 65 78 70 6c 69 63 69 74 20 49 50 4b 20  /* explicit IPK 
8ff0: 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 20 20 20 20  column */.      
9000: 20 20 67 6f 74 6f 20 72 62 75 54 61 62 6c 65 54    goto rbuTableT
9010: 79 70 65 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ype_end;.      }
9020: 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 65 54 79  .    }.    *peTy
9030: 70 65 20 3d 20 52 42 55 5f 50 4b 5f 4e 4f 4e 45  pe = RBU_PK_NONE
9040: 3b 0a 20 20 7d 0a 0a 72 62 75 54 61 62 6c 65 54  ;.  }..rbuTableT
9050: 79 70 65 5f 65 6e 64 3a 20 7b 0a 20 20 20 20 69  ype_end: {.    i
9060: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
9070: 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 74 6d  0; i<sizeof(aStm
9080: 74 29 2f 73 69 7a 65 6f 66 28 61 53 74 6d 74 5b  t)/sizeof(aStmt[
9090: 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  0]); i++){.     
90a0: 20 72 62 75 46 69 6e 61 6c 69 7a 65 28 70 2c 20   rbuFinalize(p, 
90b0: 61 53 74 6d 74 5b 69 5d 29 3b 0a 20 20 20 20 7d  aStmt[i]);.    }
90c0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
90d0: 69 73 20 69 73 20 61 20 68 65 6c 70 65 72 20 66  is is a helper f
90e0: 75 6e 63 74 69 6f 6e 20 66 6f 72 20 72 62 75 4f  unction for rbuO
90f0: 62 6a 49 74 65 72 43 61 63 68 65 54 61 62 6c 65  bjIterCacheTable
9100: 49 6e 66 6f 28 29 2e 20 49 74 20 70 6f 70 75 6c  Info(). It popul
9110: 61 74 65 73 0a 2a 2a 20 74 68 65 20 70 49 74 65  ates.** the pIte
9120: 72 2d 3e 61 62 49 6e 64 65 78 65 64 5b 5d 20 61  r->abIndexed[] a
9130: 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rray..*/.static 
9140: 76 6f 69 64 20 72 62 75 4f 62 6a 49 74 65 72 43  void rbuObjIterC
9150: 61 63 68 65 49 6e 64 65 78 65 64 43 6f 6c 73 28  acheIndexedCols(
9160: 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 52  sqlite3rbu *p, R
9170: 62 75 4f 62 6a 49 74 65 72 20 2a 70 49 74 65 72  buObjIter *pIter
9180: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
9190: 74 20 2a 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20  t *pList = 0;.  
91a0: 69 6e 74 20 62 49 6e 64 65 78 20 3d 20 30 3b 0a  int bIndex = 0;.
91b0: 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
91c0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6d  LITE_OK ){.    m
91d0: 65 6d 63 70 79 28 70 49 74 65 72 2d 3e 61 62 49  emcpy(pIter->abI
91e0: 6e 64 65 78 65 64 2c 20 70 49 74 65 72 2d 3e 61  ndexed, pIter->a
91f0: 62 54 62 6c 50 6b 2c 20 73 69 7a 65 6f 66 28 75  bTblPk, sizeof(u
9200: 38 29 2a 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f  8)*pIter->nTblCo
9210: 6c 29 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20  l);.    p->rc = 
9220: 70 72 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f  prepareFreeAndCo
9230: 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62  llectError(p->db
9240: 4d 61 69 6e 2c 20 26 70 4c 69 73 74 2c 20 26 70  Main, &pList, &p
9250: 2d 3e 7a 45 72 72 6d 73 67 2c 0a 20 20 20 20 20  ->zErrmsg,.     
9260: 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e     sqlite3_mprin
9270: 74 66 28 22 50 52 41 47 4d 41 20 6d 61 69 6e 2e  tf("PRAGMA main.
9280: 69 6e 64 65 78 5f 6c 69 73 74 20 3d 20 25 51 22  index_list = %Q"
9290: 2c 20 70 49 74 65 72 2d 3e 7a 54 62 6c 29 0a 20  , pIter->zTbl). 
92a0: 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 77 68 69     );.  }..  whi
92b0: 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  le( p->rc==SQLIT
92c0: 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52  E_OK && SQLITE_R
92d0: 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
92e0: 28 70 4c 69 73 74 29 20 29 7b 0a 20 20 20 20 63  (pList) ){.    c
92f0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 78 20  onst char *zIdx 
9300: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
9310: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
9320: 78 74 28 70 4c 69 73 74 2c 20 31 29 3b 0a 20 20  xt(pList, 1);.  
9330: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
9340: 70 58 49 6e 66 6f 20 3d 20 30 3b 0a 20 20 20 20  pXInfo = 0;.    
9350: 69 66 28 20 7a 49 64 78 3d 3d 30 20 29 20 62 72  if( zIdx==0 ) br
9360: 65 61 6b 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  eak;.    p->rc =
9370: 20 70 72 65 70 61 72 65 46 72 65 65 41 6e 64 43   prepareFreeAndC
9380: 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64  ollectError(p->d
9390: 62 4d 61 69 6e 2c 20 26 70 58 49 6e 66 6f 2c 20  bMain, &pXInfo, 
93a0: 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 0a 20 20 20  &p->zErrmsg,.   
93b0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72       sqlite3_mpr
93c0: 69 6e 74 66 28 22 50 52 41 47 4d 41 20 6d 61 69  intf("PRAGMA mai
93d0: 6e 2e 69 6e 64 65 78 5f 78 69 6e 66 6f 20 3d 20  n.index_xinfo = 
93e0: 25 51 22 2c 20 7a 49 64 78 29 0a 20 20 20 20 29  %Q", zIdx).    )
93f0: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 2d 3e  ;.    while( p->
9400: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
9410: 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
9420: 69 74 65 33 5f 73 74 65 70 28 70 58 49 6e 66 6f  ite3_step(pXInfo
9430: 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ) ){.      int i
9440: 43 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  Cid = sqlite3_co
9450: 6c 75 6d 6e 5f 69 6e 74 28 70 58 49 6e 66 6f 2c  lumn_int(pXInfo,
9460: 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69   1);.      if( i
9470: 43 69 64 3e 3d 30 20 29 20 70 49 74 65 72 2d 3e  Cid>=0 ) pIter->
9480: 61 62 49 6e 64 65 78 65 64 5b 69 43 69 64 5d 20  abIndexed[iCid] 
9490: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  = 1;.    }.    r
94a0: 62 75 46 69 6e 61 6c 69 7a 65 28 70 2c 20 70 58  buFinalize(p, pX
94b0: 49 6e 66 6f 29 3b 0a 20 20 20 20 62 49 6e 64 65  Info);.    bInde
94c0: 78 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 72 62  x = 1;.  }..  rb
94d0: 75 46 69 6e 61 6c 69 7a 65 28 70 2c 20 70 4c 69  uFinalize(p, pLi
94e0: 73 74 29 3b 0a 20 20 69 66 28 20 62 49 6e 64 65  st);.  if( bInde
94f0: 78 3d 3d 30 20 29 20 70 49 74 65 72 2d 3e 61 62  x==0 ) pIter->ab
9500: 49 6e 64 65 78 65 64 20 3d 20 30 3b 0a 7d 0a 0a  Indexed = 0;.}..
9510: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 79 20 61  ./*.** If they a
9520: 72 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 70  re not already p
9530: 6f 70 75 6c 61 74 65 64 2c 20 70 6f 70 75 6c 61  opulated, popula
9540: 74 65 20 74 68 65 20 70 49 74 65 72 2d 3e 61 7a  te the pIter->az
9550: 54 62 6c 43 6f 6c 5b 5d 2c 0a 2a 2a 20 70 49 74  TblCol[],.** pIt
9560: 65 72 2d 3e 61 62 54 62 6c 50 6b 5b 5d 2c 20 70  er->abTblPk[], p
9570: 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 20 61 6e  Iter->nTblCol an
9580: 64 20 70 49 74 65 72 2d 3e 62 52 6f 77 69 64 20  d pIter->bRowid 
9590: 76 61 72 69 61 62 6c 65 73 20 61 63 63 6f 72 64  variables accord
95a0: 69 6e 67 20 74 6f 0a 2a 2a 20 74 68 65 20 74 61  ing to.** the ta
95b0: 62 6c 65 20 28 6e 6f 74 20 69 6e 64 65 78 29 20  ble (not index) 
95c0: 74 68 61 74 20 74 68 65 20 69 74 65 72 61 74 6f  that the iterato
95d0: 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  r currently poin
95e0: 74 73 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  ts to..**.** Ret
95f0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
9600: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20   successful, or 
9610: 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
9620: 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 20  code otherwise. 
9630: 49 66 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 64  If.** an error d
9640: 6f 65 73 20 6f 63 63 75 72 2c 20 61 6e 20 65 72  oes occur, an er
9650: 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 65 72 72  ror code and err
9660: 6f 72 20 6d 65 73 73 61 67 65 20 61 72 65 20 61  or message are a
9670: 6c 73 6f 20 6c 65 66 74 20 69 6e 20 0a 2a 2a 20  lso left in .** 
9680: 74 68 65 20 52 42 55 20 68 61 6e 64 6c 65 2e 0a  the RBU handle..
9690: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62  */.static int rb
96a0: 75 4f 62 6a 49 74 65 72 43 61 63 68 65 54 61 62  uObjIterCacheTab
96b0: 6c 65 49 6e 66 6f 28 73 71 6c 69 74 65 33 72 62  leInfo(sqlite3rb
96c0: 75 20 2a 70 2c 20 52 62 75 4f 62 6a 49 74 65 72  u *p, RbuObjIter
96d0: 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20   *pIter){.  if( 
96e0: 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 3d  pIter->azTblCol=
96f0: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
9700: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
9710: 30 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 20  0;.    int nCol 
9720: 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 3b 20  = 0;.    int i; 
9730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9740: 20 20 20 20 20 20 20 2f 2a 20 66 6f 72 28 29 20         /* for() 
9750: 6c 6f 6f 70 20 69 74 65 72 61 74 6f 72 20 76 61  loop iterator va
9760: 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e  riable */.    in
9770: 74 20 62 52 62 75 52 6f 77 69 64 20 3d 20 30 3b  t bRbuRowid = 0;
9780: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
9790: 66 20 69 6e 70 75 74 20 74 61 62 6c 65 20 68 61  f input table ha
97a0: 73 20 63 6f 6c 75 6d 6e 20 22 72 62 75 5f 72 6f  s column "rbu_ro
97b0: 77 69 64 22 20 2a 2f 0a 20 20 20 20 69 6e 74 20  wid" */.    int 
97c0: 69 4f 72 64 65 72 20 3d 20 30 3b 0a 20 20 20 20  iOrder = 0;.    
97d0: 69 6e 74 20 69 54 6e 75 6d 20 3d 20 30 3b 0a 0a  int iTnum = 0;..
97e0: 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75      /* Figure ou
97f0: 74 20 74 68 65 20 74 79 70 65 20 6f 66 20 74 61  t the type of ta
9800: 62 6c 65 20 74 68 69 73 20 73 74 65 70 20 77 69  ble this step wi
9810: 6c 6c 20 64 65 61 6c 20 77 69 74 68 2e 20 2a 2f  ll deal with. */
9820: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
9830: 65 72 2d 3e 65 54 79 70 65 3d 3d 30 20 29 3b 0a  er->eType==0 );.
9840: 20 20 20 20 72 62 75 54 61 62 6c 65 54 79 70 65      rbuTableType
9850: 28 70 2c 20 70 49 74 65 72 2d 3e 7a 54 62 6c 2c  (p, pIter->zTbl,
9860: 20 26 70 49 74 65 72 2d 3e 65 54 79 70 65 2c 20   &pIter->eType, 
9870: 26 69 54 6e 75 6d 2c 20 26 70 49 74 65 72 2d 3e  &iTnum, &pIter->
9880: 69 50 6b 54 6e 75 6d 29 3b 0a 20 20 20 20 69 66  iPkTnum);.    if
9890: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
98a0: 4f 4b 20 26 26 20 70 49 74 65 72 2d 3e 65 54 79  OK && pIter->eTy
98b0: 70 65 3d 3d 52 42 55 5f 50 4b 5f 4e 4f 54 41 42  pe==RBU_PK_NOTAB
98c0: 4c 45 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72  LE ){.      p->r
98d0: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
98e0: 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 45 72 72 6d  ;.      p->zErrm
98f0: 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  sg = sqlite3_mpr
9900: 69 6e 74 66 28 22 6e 6f 20 73 75 63 68 20 74 61  intf("no such ta
9910: 62 6c 65 3a 20 25 73 22 2c 20 70 49 74 65 72 2d  ble: %s", pIter-
9920: 3e 7a 54 62 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  >zTbl);.    }.  
9930: 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20 72 65    if( p->rc ) re
9940: 74 75 72 6e 20 70 2d 3e 72 63 3b 0a 20 20 20 20  turn p->rc;.    
9950: 69 66 28 20 70 49 74 65 72 2d 3e 7a 49 64 78 3d  if( pIter->zIdx=
9960: 3d 30 20 29 20 70 49 74 65 72 2d 3e 69 54 6e 75  =0 ) pIter->iTnu
9970: 6d 20 3d 20 69 54 6e 75 6d 3b 0a 0a 20 20 20 20  m = iTnum;..    
9980: 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 65  assert( pIter->e
9990: 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 4e 4f 4e  Type==RBU_PK_NON
99a0: 45 20 7c 7c 20 70 49 74 65 72 2d 3e 65 54 79 70  E || pIter->eTyp
99b0: 65 3d 3d 52 42 55 5f 50 4b 5f 49 50 4b 20 0a 20  e==RBU_PK_IPK . 
99c0: 20 20 20 20 20 20 20 20 7c 7c 20 70 49 74 65 72          || pIter
99d0: 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f  ->eType==RBU_PK_
99e0: 45 58 54 45 52 4e 41 4c 20 7c 7c 20 70 49 74 65  EXTERNAL || pIte
99f0: 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b  r->eType==RBU_PK
9a00: 5f 57 49 54 48 4f 55 54 5f 52 4f 57 49 44 0a 20  _WITHOUT_ROWID. 
9a10: 20 20 20 20 20 20 20 20 7c 7c 20 70 49 74 65 72          || pIter
9a20: 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f  ->eType==RBU_PK_
9a30: 56 54 41 42 0a 20 20 20 20 29 3b 0a 0a 20 20 20  VTAB.    );..   
9a40: 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65   /* Populate the
9a50: 20 61 7a 54 62 6c 43 6f 6c 5b 5d 20 61 6e 64 20   azTblCol[] and 
9a60: 6e 54 62 6c 43 6f 6c 20 76 61 72 69 61 62 6c 65  nTblCol variable
9a70: 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63  s based on the c
9a80: 6f 6c 75 6d 6e 73 0a 20 20 20 20 2a 2a 20 6f 66  olumns.    ** of
9a90: 20 74 68 65 20 69 6e 70 75 74 20 74 61 62 6c 65   the input table
9aa0: 2e 20 49 67 6e 6f 72 65 20 61 6e 79 20 69 6e 70  . Ignore any inp
9ab0: 75 74 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73  ut table columns
9ac0: 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74 68   that begin with
9ad0: 0a 20 20 20 20 2a 2a 20 22 72 62 75 5f 22 2e 20  .    ** "rbu_". 
9ae0: 20 2a 2f 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   */.    p->rc = 
9af0: 70 72 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f  prepareFreeAndCo
9b00: 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62  llectError(p->db
9b10: 52 62 75 2c 20 26 70 53 74 6d 74 2c 20 26 70 2d  Rbu, &pStmt, &p-
9b20: 3e 7a 45 72 72 6d 73 67 2c 20 0a 20 20 20 20 20  >zErrmsg, .     
9b30: 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e     sqlite3_mprin
9b40: 74 66 28 22 53 45 4c 45 43 54 20 2a 20 46 52 4f  tf("SELECT * FRO
9b50: 4d 20 27 25 71 27 22 2c 20 70 49 74 65 72 2d 3e  M '%q'", pIter->
9b60: 7a 44 61 74 61 54 62 6c 29 0a 20 20 20 20 29 3b  zDataTbl).    );
9b70: 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  .    if( p->rc==
9b80: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
9b90: 20 20 20 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65     nCol = sqlite
9ba0: 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70  3_column_count(p
9bb0: 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 72 62 75  Stmt);.      rbu
9bc0: 41 6c 6c 6f 63 61 74 65 49 74 65 72 41 72 72 61  AllocateIterArra
9bd0: 79 73 28 70 2c 20 70 49 74 65 72 2c 20 6e 43 6f  ys(p, pIter, nCo
9be0: 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  l);.    }.    fo
9bf0: 72 28 69 3d 30 3b 20 70 2d 3e 72 63 3d 3d 53 51  r(i=0; p->rc==SQ
9c00: 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 6e 43 6f  LITE_OK && i<nCo
9c10: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63  l; i++){.      c
9c20: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
9c30: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
9c40: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e  sqlite3_column_n
9c50: 61 6d 65 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20  ame(pStmt, i);. 
9c60: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
9c70: 5f 73 74 72 6e 69 63 6d 70 28 22 72 62 75 5f 22  _strnicmp("rbu_"
9c80: 2c 20 7a 4e 61 6d 65 2c 20 34 29 20 29 7b 0a 20  , zName, 4) ){. 
9c90: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f         char *zCo
9ca0: 70 79 20 3d 20 72 62 75 53 74 72 6e 64 75 70 28  py = rbuStrndup(
9cb0: 7a 4e 61 6d 65 2c 20 26 70 2d 3e 72 63 29 3b 0a  zName, &p->rc);.
9cc0: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 61          pIter->a
9cd0: 69 53 72 63 4f 72 64 65 72 5b 70 49 74 65 72 2d  iSrcOrder[pIter-
9ce0: 3e 6e 54 62 6c 43 6f 6c 5d 20 3d 20 70 49 74 65  >nTblCol] = pIte
9cf0: 72 2d 3e 6e 54 62 6c 43 6f 6c 3b 0a 20 20 20 20  r->nTblCol;.    
9d00: 20 20 20 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c      pIter->azTbl
9d10: 43 6f 6c 5b 70 49 74 65 72 2d 3e 6e 54 62 6c 43  Col[pIter->nTblC
9d20: 6f 6c 2b 2b 5d 20 3d 20 7a 43 6f 70 79 3b 0a 20  ol++] = zCopy;. 
9d30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65 6c 73       }.      els
9d40: 65 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33  e if( 0==sqlite3
9d50: 5f 73 74 72 69 63 6d 70 28 22 72 62 75 5f 72 6f  _stricmp("rbu_ro
9d60: 77 69 64 22 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a  wid", zName) ){.
9d70: 20 20 20 20 20 20 20 20 62 52 62 75 52 6f 77 69          bRbuRowi
9d80: 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  d = 1;.      }. 
9d90: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
9da0: 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
9db0: 3b 0a 20 20 20 20 70 53 74 6d 74 20 3d 20 30 3b  ;.    pStmt = 0;
9dc0: 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d  ..    if( p->rc=
9dd0: 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20  =SQLITE_OK.     
9de0: 26 26 20 62 52 62 75 52 6f 77 69 64 21 3d 28 70  && bRbuRowid!=(p
9df0: 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55  Iter->eType==RBU
9e00: 5f 50 4b 5f 56 54 41 42 20 7c 7c 20 70 49 74 65  _PK_VTAB || pIte
9e10: 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b  r->eType==RBU_PK
9e20: 5f 4e 4f 4e 45 29 0a 20 20 20 20 29 7b 0a 20 20  _NONE).    ){.  
9e30: 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
9e40: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
9e50: 70 2d 3e 7a 45 72 72 6d 73 67 20 3d 20 73 71 6c  p->zErrmsg = sql
9e60: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20  ite3_mprintf(.  
9e70: 20 20 20 20 20 20 20 20 22 74 61 62 6c 65 20 25          "table %
9e80: 71 20 25 73 20 72 62 75 5f 72 6f 77 69 64 20 63  q %s rbu_rowid c
9e90: 6f 6c 75 6d 6e 22 2c 20 70 49 74 65 72 2d 3e 7a  olumn", pIter->z
9ea0: 44 61 74 61 54 62 6c 2c 0a 20 20 20 20 20 20 20  DataTbl,.       
9eb0: 20 20 20 28 62 52 62 75 52 6f 77 69 64 20 3f 20     (bRbuRowid ? 
9ec0: 22 6d 61 79 20 6e 6f 74 20 68 61 76 65 22 20 3a  "may not have" :
9ed0: 20 22 72 65 71 75 69 72 65 73 22 29 0a 20 20 20   "requires").   
9ee0: 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20     );.    }..   
9ef0: 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 61   /* Check that a
9f00: 6c 6c 20 6e 6f 6e 2d 48 49 44 44 45 4e 20 63 6f  ll non-HIDDEN co
9f10: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 64 65 73  lumns in the des
9f20: 74 69 6e 61 74 69 6f 6e 20 74 61 62 6c 65 20 61  tination table a
9f30: 72 65 20 61 6c 73 6f 0a 20 20 20 20 2a 2a 20 70  re also.    ** p
9f40: 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 69 6e  resent in the in
9f50: 70 75 74 20 74 61 62 6c 65 2e 20 50 6f 70 75 6c  put table. Popul
9f60: 61 74 65 20 74 68 65 20 61 62 54 62 6c 50 6b 5b  ate the abTblPk[
9f70: 5d 2c 20 61 7a 54 62 6c 54 79 70 65 5b 5d 20 61  ], azTblType[] a
9f80: 6e 64 0a 20 20 20 20 2a 2a 20 61 69 54 62 6c 4f  nd.    ** aiTblO
9f90: 72 64 65 72 5b 5d 20 61 72 72 61 79 73 20 61 74  rder[] arrays at
9fa0: 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 20   the same time. 
9fb0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 72   */.    if( p->r
9fc0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
9fd0: 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 72        p->rc = pr
9fe0: 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c  epareFreeAndColl
9ff0: 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 4d 61  ectError(p->dbMa
a000: 69 6e 2c 20 26 70 53 74 6d 74 2c 20 26 70 2d 3e  in, &pStmt, &p->
a010: 7a 45 72 72 6d 73 67 2c 20 0a 20 20 20 20 20 20  zErrmsg, .      
a020: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69      sqlite3_mpri
a030: 6e 74 66 28 22 50 52 41 47 4d 41 20 74 61 62 6c  ntf("PRAGMA tabl
a040: 65 5f 69 6e 66 6f 28 25 51 29 22 2c 20 70 49 74  e_info(%Q)", pIt
a050: 65 72 2d 3e 7a 54 62 6c 29 0a 20 20 20 20 20 20  er->zTbl).      
a060: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69  );.    }.    whi
a070: 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  le( p->rc==SQLIT
a080: 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52  E_OK && SQLITE_R
a090: 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
a0a0: 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20  (pStmt) ){.     
a0b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
a0c0: 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  me = (const char
a0d0: 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
a0e0: 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31 29 3b  _text(pStmt, 1);
a0f0: 0a 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65  .      if( zName
a100: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 20 20 2f 2a  ==0 ) break;  /*
a110: 20 41 6e 20 4f 4f 4d 20 2d 20 66 69 6e 61 6c 69   An OOM - finali
a120: 7a 65 28 29 20 62 65 6c 6f 77 20 72 65 74 75 72  ze() below retur
a130: 6e 73 20 53 5f 4e 4f 4d 45 4d 20 2a 2f 0a 20 20  ns S_NOMEM */.  
a140: 20 20 20 20 66 6f 72 28 69 3d 69 4f 72 64 65 72      for(i=iOrder
a150: 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 54 62 6c 43  ; i<pIter->nTblC
a160: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
a170: 20 20 69 66 28 20 30 3d 3d 73 74 72 63 6d 70 28    if( 0==strcmp(
a180: 7a 4e 61 6d 65 2c 20 70 49 74 65 72 2d 3e 61 7a  zName, pIter->az
a190: 54 62 6c 43 6f 6c 5b 69 5d 29 20 29 20 62 72 65  TblCol[i]) ) bre
a1a0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
a1b0: 20 20 69 66 28 20 69 3d 3d 70 49 74 65 72 2d 3e    if( i==pIter->
a1c0: 6e 54 62 6c 43 6f 6c 20 29 7b 0a 20 20 20 20 20  nTblCol ){.     
a1d0: 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
a1e0: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  E_ERROR;.       
a1f0: 20 70 2d 3e 7a 45 72 72 6d 73 67 20 3d 20 73 71   p->zErrmsg = sq
a200: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 63  lite3_mprintf("c
a210: 6f 6c 75 6d 6e 20 6d 69 73 73 69 6e 67 20 66 72  olumn missing fr
a220: 6f 6d 20 25 71 3a 20 25 73 22 2c 0a 20 20 20 20  om %q: %s",.    
a230: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 7a          pIter->z
a240: 44 61 74 61 54 62 6c 2c 20 7a 4e 61 6d 65 0a 20  DataTbl, zName. 
a250: 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
a260: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
a270: 6e 74 20 69 50 6b 20 3d 20 73 71 6c 69 74 65 33  nt iPk = sqlite3
a280: 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d  _column_int(pStm
a290: 74 2c 20 35 29 3b 0a 20 20 20 20 20 20 20 20 69  t, 5);.        i
a2a0: 6e 74 20 62 4e 6f 74 4e 75 6c 6c 20 3d 20 73 71  nt bNotNull = sq
a2b0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
a2c0: 28 70 53 74 6d 74 2c 20 33 29 3b 0a 20 20 20 20  (pStmt, 3);.    
a2d0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
a2e0: 7a 54 79 70 65 20 3d 20 28 63 6f 6e 73 74 20 63  zType = (const c
a2f0: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
a300: 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  umn_text(pStmt, 
a310: 32 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28  2);..        if(
a320: 20 69 21 3d 69 4f 72 64 65 72 20 29 7b 0a 20 20   i!=iOrder ){.  
a330: 20 20 20 20 20 20 20 20 53 57 41 50 28 69 6e 74          SWAP(int
a340: 2c 20 70 49 74 65 72 2d 3e 61 69 53 72 63 4f 72  , pIter->aiSrcOr
a350: 64 65 72 5b 69 5d 2c 20 70 49 74 65 72 2d 3e 61  der[i], pIter->a
a360: 69 53 72 63 4f 72 64 65 72 5b 69 4f 72 64 65 72  iSrcOrder[iOrder
a370: 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 53 57  ]);.          SW
a380: 41 50 28 63 68 61 72 2a 2c 20 70 49 74 65 72 2d  AP(char*, pIter-
a390: 3e 61 7a 54 62 6c 43 6f 6c 5b 69 5d 2c 20 70 49  >azTblCol[i], pI
a3a0: 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69 4f  ter->azTblCol[iO
a3b0: 72 64 65 72 5d 29 3b 0a 20 20 20 20 20 20 20 20  rder]);.        
a3c0: 7d 0a 0a 20 20 20 20 20 20 20 20 70 49 74 65 72  }..        pIter
a3d0: 2d 3e 61 7a 54 62 6c 54 79 70 65 5b 69 4f 72 64  ->azTblType[iOrd
a3e0: 65 72 5d 20 3d 20 72 62 75 53 74 72 6e 64 75 70  er] = rbuStrndup
a3f0: 28 7a 54 79 70 65 2c 20 26 70 2d 3e 72 63 29 3b  (zType, &p->rc);
a400: 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e  .        pIter->
a410: 61 62 54 62 6c 50 6b 5b 69 4f 72 64 65 72 5d 20  abTblPk[iOrder] 
a420: 3d 20 28 69 50 6b 21 3d 30 29 3b 0a 20 20 20 20  = (iPk!=0);.    
a430: 20 20 20 20 70 49 74 65 72 2d 3e 61 62 4e 6f 74      pIter->abNot
a440: 4e 75 6c 6c 5b 69 4f 72 64 65 72 5d 20 3d 20 28  Null[iOrder] = (
a450: 75 38 29 62 4e 6f 74 4e 75 6c 6c 20 7c 7c 20 28  u8)bNotNull || (
a460: 69 50 6b 21 3d 30 29 3b 0a 20 20 20 20 20 20 20  iPk!=0);.       
a470: 20 69 4f 72 64 65 72 2b 2b 3b 0a 20 20 20 20 20   iOrder++;.     
a480: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 62   }.    }..    rb
a490: 75 46 69 6e 61 6c 69 7a 65 28 70 2c 20 70 53 74  uFinalize(p, pSt
a4a0: 6d 74 29 3b 0a 20 20 20 20 72 62 75 4f 62 6a 49  mt);.    rbuObjI
a4b0: 74 65 72 43 61 63 68 65 49 6e 64 65 78 65 64 43  terCacheIndexedC
a4c0: 6f 6c 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  ols(p, pIter);. 
a4d0: 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72     assert( pIter
a4e0: 2d 3e 65 54 79 70 65 21 3d 52 42 55 5f 50 4b 5f  ->eType!=RBU_PK_
a4f0: 56 54 41 42 20 7c 7c 20 70 49 74 65 72 2d 3e 61  VTAB || pIter->a
a500: 62 49 6e 64 65 78 65 64 3d 3d 30 20 29 3b 0a 20  bIndexed==0 );. 
a510: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e   }..  return p->
a520: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
a530: 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 73 74  s function const
a540: 72 75 63 74 73 20 61 6e 64 20 72 65 74 75 72 6e  ructs and return
a550: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
a560: 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20   nul-terminated 
a570: 0a 2a 2a 20 73 74 72 69 6e 67 20 63 6f 6e 74 61  .** string conta
a580: 69 6e 69 6e 67 20 73 6f 6d 65 20 53 51 4c 20 63  ining some SQL c
a590: 6c 61 75 73 65 20 6f 72 20 6c 69 73 74 20 62 61  lause or list ba
a5a0: 73 65 64 20 6f 6e 20 6f 6e 65 20 6f 72 20 6d 6f  sed on one or mo
a5b0: 72 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 63 6f  re of the .** co
a5c0: 6c 75 6d 6e 20 6e 61 6d 65 73 20 63 75 72 72 65  lumn names curre
a5d0: 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 74  ntly stored in t
a5e0: 68 65 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43  he pIter->azTblC
a5f0: 6f 6c 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73  ol[] array..*/.s
a600: 74 61 74 69 63 20 63 68 61 72 20 2a 72 62 75 4f  tatic char *rbuO
a610: 62 6a 49 74 65 72 47 65 74 43 6f 6c 6c 69 73 74  bjIterGetCollist
a620: 28 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20 2a  (.  sqlite3rbu *
a630: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
a640: 20 20 20 20 2f 2a 20 52 42 55 20 6f 62 6a 65 63      /* RBU objec
a650: 74 20 2a 2f 0a 20 20 52 62 75 4f 62 6a 49 74 65  t */.  RbuObjIte
a660: 72 20 2a 70 49 74 65 72 20 20 20 20 20 20 20 20  r *pIter        
a670: 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74         /* Object
a680: 20 69 74 65 72 61 74 6f 72 20 66 6f 72 20 63 6f   iterator for co
a690: 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 29 7b  lumn names */.){
a6a0: 0a 20 20 63 68 61 72 20 2a 7a 4c 69 73 74 20 3d  .  char *zList =
a6b0: 20 30 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   0;.  const char
a6c0: 20 2a 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20 69   *zSep = "";.  i
a6d0: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
a6e0: 20 69 3c 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f   i<pIter->nTblCo
a6f0: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e  l; i++){.    con
a700: 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 49 74  st char *z = pIt
a710: 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69 5d 3b  er->azTblCol[i];
a720: 0a 20 20 20 20 7a 4c 69 73 74 20 3d 20 72 62 75  .    zList = rbu
a730: 4d 50 72 69 6e 74 66 28 70 2c 20 22 25 7a 25 73  MPrintf(p, "%z%s
a740: 5c 22 25 77 5c 22 22 2c 20 7a 4c 69 73 74 2c 20  \"%w\"", zList, 
a750: 7a 53 65 70 2c 20 7a 29 3b 0a 20 20 20 20 7a 53  zSep, z);.    zS
a760: 65 70 20 3d 20 22 2c 20 22 3b 0a 20 20 7d 0a 20  ep = ", ";.  }. 
a770: 20 72 65 74 75 72 6e 20 7a 4c 69 73 74 3b 0a 7d   return zList;.}
a780: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
a790: 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
a7a0: 20 63 72 65 61 74 65 20 61 20 53 45 4c 45 43 54   create a SELECT
a7b0: 20 6c 69 73 74 20 28 74 68 65 20 6c 69 73 74 20   list (the list 
a7c0: 6f 66 20 53 51 4c 20 0a 2a 2a 20 65 78 70 72 65  of SQL .** expre
a7d0: 73 73 69 6f 6e 73 20 74 68 61 74 20 66 6f 6c 6c  ssions that foll
a7e0: 6f 77 73 20 61 20 53 45 4c 45 43 54 20 6b 65 79  ows a SELECT key
a7f0: 77 6f 72 64 29 20 66 6f 72 20 61 20 53 45 4c 45  word) for a SELE
a800: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 0a 2a 2a  CT statement .**
a810: 20 75 73 65 64 20 74 6f 20 72 65 61 64 20 66 72   used to read fr
a820: 6f 6d 20 61 6e 20 64 61 74 61 5f 78 78 78 20 6f  om an data_xxx o
a830: 72 20 72 62 75 5f 74 6d 70 5f 78 78 78 20 74 61  r rbu_tmp_xxx ta
a840: 62 6c 65 20 77 68 69 6c 65 20 75 70 64 61 74 69  ble while updati
a850: 6e 67 20 74 68 65 20 0a 2a 2a 20 69 6e 64 65 78  ng the .** index
a860: 20 6f 62 6a 65 63 74 20 63 75 72 72 65 6e 74 6c   object currentl
a870: 79 20 69 6e 64 69 63 61 74 65 64 20 62 79 20 74  y indicated by t
a880: 68 65 20 69 74 65 72 61 74 6f 72 20 6f 62 6a 65  he iterator obje
a890: 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ct passed as the
a8a0: 20 0a 2a 2a 20 73 65 63 6f 6e 64 20 61 72 67 75   .** second argu
a8b0: 6d 65 6e 74 2e 20 41 20 22 50 52 41 47 4d 41 20  ment. A "PRAGMA 
a8c0: 69 6e 64 65 78 5f 78 69 6e 66 6f 20 3d 20 3c 69  index_xinfo = <i
a8d0: 64 78 6e 61 6d 65 3e 22 20 73 74 61 74 65 6d 65  dxname>" stateme
a8e0: 6e 74 20 69 73 20 75 73 65 64 20 0a 2a 2a 20 74  nt is used .** t
a8f0: 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 72 65 71  o obtain the req
a900: 75 69 72 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f  uired informatio
a910: 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  n..**.** If the 
a920: 69 6e 64 65 78 20 69 73 20 6f 66 20 74 68 65 20  index is of the 
a930: 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 3a 0a  following form:.
a940: 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 49  **.**   CREATE I
a950: 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28 63 2c  NDEX i1 ON t1(c,
a960: 20 62 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73   b COLLATE nocas
a970: 65 29 3b 0a 2a 2a 0a 2a 2a 20 61 6e 64 20 22 74  e);.**.** and "t
a980: 31 22 20 69 73 20 61 20 74 61 62 6c 65 20 77 69  1" is a table wi
a990: 74 68 20 61 6e 20 65 78 70 6c 69 63 69 74 20 49  th an explicit I
a9a0: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
a9b0: 45 59 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 22 69  EY column .** "i
a9c0: 70 6b 22 2c 20 74 68 65 20 72 65 74 75 72 6e 65  pk", the returne
a9d0: 64 20 73 74 72 69 6e 67 20 69 73 3a 0a 2a 2a 0a  d string is:.**.
a9e0: 2a 2a 20 20 20 22 60 63 60 20 43 4f 4c 4c 41 54  **   "`c` COLLAT
a9f0: 45 20 27 42 49 4e 41 52 59 27 2c 20 60 62 60 20  E 'BINARY', `b` 
aa00: 43 4f 4c 4c 41 54 45 20 27 4e 4f 43 41 53 45 27  COLLATE 'NOCASE'
aa10: 2c 20 60 69 70 6b 60 20 43 4f 4c 4c 41 54 45 20  , `ipk` COLLATE 
aa20: 27 42 49 4e 41 52 59 27 22 0a 2a 2a 0a 2a 2a 20  'BINARY'".**.** 
aa30: 41 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20 72  As well as the r
aa40: 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 2c 20  eturned string, 
aa50: 74 68 72 65 65 20 6f 74 68 65 72 20 6d 61 6c 6c  three other mall
aa60: 6f 63 27 64 20 73 74 72 69 6e 67 73 20 61 72 65  oc'd strings are
aa70: 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 76 69   .** returned vi
aa80: 61 20 6f 75 74 70 75 74 20 70 61 72 61 6d 65 74  a output paramet
aa90: 65 72 73 2e 20 41 73 20 66 6f 6c 6c 6f 77 73 3a  ers. As follows:
aaa0: 0a 2a 2a 0a 2a 2a 20 20 20 70 7a 49 6d 70 6f 73  .**.**   pzImpos
aab0: 74 65 72 43 6f 6c 73 3a 20 2e 2e 2e 0a 2a 2a 20  terCols: ....** 
aac0: 20 20 70 7a 49 6d 70 6f 73 74 65 72 50 6b 3a 20    pzImposterPk: 
aad0: 2e 2e 2e 0a 2a 2a 20 20 20 70 7a 57 68 65 72 65  ....**   pzWhere
aae0: 3a 20 2e 2e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  : ....*/.static 
aaf0: 63 68 61 72 20 2a 72 62 75 4f 62 6a 49 74 65 72  char *rbuObjIter
ab00: 47 65 74 49 6e 64 65 78 43 6f 6c 73 28 0a 20 20  GetIndexCols(.  
ab10: 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 20  sqlite3rbu *p,  
ab20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab30: 2f 2a 20 52 42 55 20 6f 62 6a 65 63 74 20 2a 2f  /* RBU object */
ab40: 0a 20 20 52 62 75 4f 62 6a 49 74 65 72 20 2a 70  .  RbuObjIter *p
ab50: 49 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  Iter,           
ab60: 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 69 74 65     /* Object ite
ab70: 72 61 74 6f 72 20 66 6f 72 20 63 6f 6c 75 6d 6e  rator for column
ab80: 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 63 68 61 72   names */.  char
ab90: 20 2a 2a 70 7a 49 6d 70 6f 73 74 65 72 43 6f 6c   **pzImposterCol
aba0: 73 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  s,          /* O
abb0: 55 54 3a 20 43 6f 6c 75 6d 6e 73 20 66 6f 72 20  UT: Columns for 
abc0: 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 20 2a  imposter table *
abd0: 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 49 6d 70  /.  char **pzImp
abe0: 6f 73 74 65 72 50 6b 2c 20 20 20 20 20 20 20 20  osterPk,        
abf0: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 49 6d 70 6f      /* OUT: Impo
ac00: 73 74 65 72 20 50 4b 20 63 6c 61 75 73 65 20 2a  ster PK clause *
ac10: 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 57 68 65  /.  char **pzWhe
ac20: 72 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  re,             
ac30: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 57 48 45 52      /* OUT: WHER
ac40: 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  E clause */.  in
ac50: 74 20 2a 70 6e 42 69 6e 64 20 20 20 20 20 20 20  t *pnBind       
ac60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ac70: 20 4f 55 54 3a 20 54 72 62 75 6c 20 6e 75 6d 62   OUT: Trbul numb
ac80: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 2a 2f  er of columns */
ac90: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70  .){.  int rc = p
aca0: 2d 3e 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  ->rc;           
acb0: 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63        /* Error c
acc0: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 32  ode */.  int rc2
acd0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ace0: 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69           /* sqli
acf0: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 29 20 72  te3_finalize() r
ad00: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
ad10: 63 68 61 72 20 2a 7a 52 65 74 20 3d 20 30 3b 20  char *zRet = 0; 
ad20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ad30: 2f 2a 20 53 74 72 69 6e 67 20 74 6f 20 72 65 74  /* String to ret
ad40: 75 72 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  urn */.  char *z
ad50: 49 6d 70 43 6f 6c 73 20 3d 20 30 3b 20 20 20 20  ImpCols = 0;    
ad60: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 72 69           /* Stri
ad70: 6e 67 20 74 6f 20 72 65 74 75 72 6e 20 76 69 61  ng to return via
ad80: 20 2a 70 7a 49 6d 70 6f 73 74 65 72 43 6f 6c 73   *pzImposterCols
ad90: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 49 6d 70   */.  char *zImp
ada0: 50 4b 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  PK = 0;         
adb0: 20 20 20 20 20 20 2f 2a 20 53 74 72 69 6e 67 20        /* String 
adc0: 74 6f 20 72 65 74 75 72 6e 20 76 69 61 20 2a 70  to return via *p
add0: 7a 49 6d 70 6f 73 74 65 72 50 4b 20 2a 2f 0a 20  zImposterPK */. 
ade0: 20 63 68 61 72 20 2a 7a 57 68 65 72 65 20 3d 20   char *zWhere = 
adf0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
ae00: 20 2f 2a 20 53 74 72 69 6e 67 20 74 6f 20 72 65   /* String to re
ae10: 74 75 72 6e 20 76 69 61 20 2a 70 7a 57 68 65 72  turn via *pzWher
ae20: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 69 6e 64  e */.  int nBind
ae30: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
ae40: 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
ae50: 74 6f 20 72 65 74 75 72 6e 20 76 69 61 20 2a 70  to return via *p
ae60: 6e 42 69 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  nBind */.  const
ae70: 20 63 68 61 72 20 2a 7a 43 6f 6d 20 3d 20 22 22   char *zCom = ""
ae80: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65  ;          /* Se
ae90: 74 20 74 6f 20 22 2c 20 22 20 6c 61 74 65 72 20  t to ", " later 
aea0: 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  on */.  const ch
aeb0: 61 72 20 2a 7a 41 6e 64 20 3d 20 22 22 3b 20 20  ar *zAnd = "";  
aec0: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74          /* Set t
aed0: 6f 20 22 20 41 4e 44 20 22 20 6c 61 74 65 72 20  o " AND " later 
aee0: 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  on */.  sqlite3_
aef0: 73 74 6d 74 20 2a 70 58 49 6e 66 6f 20 3d 20 30  stmt *pXInfo = 0
af00: 3b 20 20 20 20 20 20 20 2f 2a 20 50 52 41 47 4d  ;       /* PRAGM
af10: 41 20 69 6e 64 65 78 5f 78 69 6e 66 6f 20 3d 20  A index_xinfo = 
af20: 3f 20 2a 2f 0a 0a 20 20 69 66 28 20 72 63 3d 3d  ? */..  if( rc==
af30: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
af40: 20 61 73 73 65 72 74 28 20 70 2d 3e 7a 45 72 72   assert( p->zErr
af50: 6d 73 67 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63  msg==0 );.    rc
af60: 20 3d 20 70 72 65 70 61 72 65 46 72 65 65 41 6e   = prepareFreeAn
af70: 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d  dCollectError(p-
af80: 3e 64 62 4d 61 69 6e 2c 20 26 70 58 49 6e 66 6f  >dbMain, &pXInfo
af90: 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 0a 20  , &p->zErrmsg,. 
afa0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d         sqlite3_m
afb0: 70 72 69 6e 74 66 28 22 50 52 41 47 4d 41 20 6d  printf("PRAGMA m
afc0: 61 69 6e 2e 69 6e 64 65 78 5f 78 69 6e 66 6f 20  ain.index_xinfo 
afd0: 3d 20 25 51 22 2c 20 70 49 74 65 72 2d 3e 7a 49  = %Q", pIter->zI
afe0: 64 78 29 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a  dx).    );.  }..
aff0: 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
b000: 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45  ITE_OK && SQLITE
b010: 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74  _ROW==sqlite3_st
b020: 65 70 28 70 58 49 6e 66 6f 29 20 29 7b 0a 20 20  ep(pXInfo) ){.  
b030: 20 20 69 6e 74 20 69 43 69 64 20 3d 20 73 71 6c    int iCid = sql
b040: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
b050: 70 58 49 6e 66 6f 2c 20 31 29 3b 0a 20 20 20 20  pXInfo, 1);.    
b060: 69 6e 74 20 62 44 65 73 63 20 3d 20 73 71 6c 69  int bDesc = sqli
b070: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
b080: 58 49 6e 66 6f 2c 20 33 29 3b 0a 20 20 20 20 63  XInfo, 3);.    c
b090: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  onst char *zColl
b0a0: 61 74 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ate = (const cha
b0b0: 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
b0c0: 6e 5f 74 65 78 74 28 70 58 49 6e 66 6f 2c 20 34  n_text(pXInfo, 4
b0d0: 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  );.    const cha
b0e0: 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 63 6f 6e  r *zCol;.    con
b0f0: 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a  st char *zType;.
b100: 0a 20 20 20 20 69 66 28 20 69 43 69 64 3c 30 20  .    if( iCid<0 
b110: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 69  ){.      /* An i
b120: 6e 74 65 67 65 72 20 70 72 69 6d 61 72 79 20 6b  nteger primary k
b130: 65 79 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65  ey. If the table
b140: 20 68 61 73 20 61 6e 20 65 78 70 6c 69 63 69 74   has an explicit
b150: 20 49 50 4b 2c 20 75 73 65 0a 20 20 20 20 20 20   IPK, use.      
b160: 2a 2a 20 69 74 73 20 6e 61 6d 65 2e 20 4f 74 68  ** its name. Oth
b170: 65 72 77 69 73 65 2c 20 75 73 65 20 22 72 62 75  erwise, use "rbu
b180: 5f 72 6f 77 69 64 22 2e 20 20 2a 2f 0a 20 20 20  _rowid".  */.   
b190: 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 65 54     if( pIter->eT
b1a0: 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 49 50 4b 20  ype==RBU_PK_IPK 
b1b0: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
b1c0: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
b1d0: 30 3b 20 70 49 74 65 72 2d 3e 61 62 54 62 6c 50  0; pIter->abTblP
b1e0: 6b 5b 69 5d 3d 3d 30 3b 20 69 2b 2b 29 3b 0a 20  k[i]==0; i++);. 
b1f0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
b200: 3c 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 20  <pIter->nTblCol 
b210: 29 3b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20  );.        zCol 
b220: 3d 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f  = pIter->azTblCo
b230: 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73  l[i];.      }els
b240: 65 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20  e{.        zCol 
b250: 3d 20 22 72 62 75 5f 72 6f 77 69 64 22 3b 0a 20  = "rbu_rowid";. 
b260: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 54 79       }.      zTy
b270: 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a  pe = "INTEGER";.
b280: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
b290: 20 7a 43 6f 6c 20 3d 20 70 49 74 65 72 2d 3e 61   zCol = pIter->a
b2a0: 7a 54 62 6c 43 6f 6c 5b 69 43 69 64 5d 3b 0a 20  zTblCol[iCid];. 
b2b0: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 70 49 74       zType = pIt
b2c0: 65 72 2d 3e 61 7a 54 62 6c 54 79 70 65 5b 69 43  er->azTblType[iC
b2d0: 69 64 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  id];.    }..    
b2e0: 7a 52 65 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zRet = sqlite3_m
b2f0: 70 72 69 6e 74 66 28 22 25 7a 25 73 5c 22 25 77  printf("%z%s\"%w
b300: 5c 22 20 43 4f 4c 4c 41 54 45 20 25 51 22 2c 20  \" COLLATE %Q", 
b310: 7a 52 65 74 2c 20 7a 43 6f 6d 2c 20 7a 43 6f 6c  zRet, zCom, zCol
b320: 2c 20 7a 43 6f 6c 6c 61 74 65 29 3b 0a 20 20 20  , zCollate);.   
b330: 20 69 66 28 20 70 49 74 65 72 2d 3e 62 55 6e 69   if( pIter->bUni
b340: 71 75 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  que==0 || sqlite
b350: 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 58 49  3_column_int(pXI
b360: 6e 66 6f 2c 20 35 29 20 29 7b 0a 20 20 20 20 20  nfo, 5) ){.     
b370: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72   const char *zOr
b380: 64 65 72 20 3d 20 28 62 44 65 73 63 20 3f 20 22  der = (bDesc ? "
b390: 20 44 45 53 43 22 20 3a 20 22 22 29 3b 0a 20 20   DESC" : "");.  
b3a0: 20 20 20 20 7a 49 6d 70 50 4b 20 3d 20 73 71 6c      zImpPK = sql
b3b0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a  ite3_mprintf("%z
b3c0: 25 73 5c 22 72 62 75 5f 69 6d 70 5f 25 64 25 77  %s\"rbu_imp_%d%w
b3d0: 5c 22 25 73 22 2c 20 0a 20 20 20 20 20 20 20 20  \"%s", .        
b3e0: 20 20 7a 49 6d 70 50 4b 2c 20 7a 43 6f 6d 2c 20    zImpPK, zCom, 
b3f0: 6e 42 69 6e 64 2c 20 7a 43 6f 6c 2c 20 7a 4f 72  nBind, zCol, zOr
b400: 64 65 72 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  der.      );.   
b410: 20 7d 0a 20 20 20 20 7a 49 6d 70 43 6f 6c 73 20   }.    zImpCols 
b420: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
b430: 66 28 22 25 7a 25 73 5c 22 72 62 75 5f 69 6d 70  f("%z%s\"rbu_imp
b440: 5f 25 64 25 77 5c 22 20 25 73 20 43 4f 4c 4c 41  _%d%w\" %s COLLA
b450: 54 45 20 25 51 22 2c 20 0a 20 20 20 20 20 20 20  TE %Q", .       
b460: 20 7a 49 6d 70 43 6f 6c 73 2c 20 7a 43 6f 6d 2c   zImpCols, zCom,
b470: 20 6e 42 69 6e 64 2c 20 7a 43 6f 6c 2c 20 7a 54   nBind, zCol, zT
b480: 79 70 65 2c 20 7a 43 6f 6c 6c 61 74 65 0a 20 20  ype, zCollate.  
b490: 20 20 29 3b 0a 20 20 20 20 7a 57 68 65 72 65 20    );.    zWhere 
b4a0: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
b4b0: 66 28 0a 20 20 20 20 20 20 20 20 22 25 7a 25 73  f(.        "%z%s
b4c0: 5c 22 72 62 75 5f 69 6d 70 5f 25 64 25 77 5c 22  \"rbu_imp_%d%w\"
b4d0: 20 49 53 20 3f 22 2c 20 7a 57 68 65 72 65 2c 20   IS ?", zWhere, 
b4e0: 7a 41 6e 64 2c 20 6e 42 69 6e 64 2c 20 7a 43 6f  zAnd, nBind, zCo
b4f0: 6c 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  l.    );.    if(
b500: 20 7a 52 65 74 3d 3d 30 20 7c 7c 20 7a 49 6d 70   zRet==0 || zImp
b510: 50 4b 3d 3d 30 20 7c 7c 20 7a 49 6d 70 43 6f 6c  PK==0 || zImpCol
b520: 73 3d 3d 30 20 7c 7c 20 7a 57 68 65 72 65 3d 3d  s==0 || zWhere==
b530: 30 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  0 ) rc = SQLITE_
b540: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7a 43 6f 6d 20  NOMEM;.    zCom 
b550: 3d 20 22 2c 20 22 3b 0a 20 20 20 20 7a 41 6e 64  = ", ";.    zAnd
b560: 20 3d 20 22 20 41 4e 44 20 22 3b 0a 20 20 20 20   = " AND ";.    
b570: 6e 42 69 6e 64 2b 2b 3b 0a 20 20 7d 0a 0a 20 20  nBind++;.  }..  
b580: 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 66 69  rc2 = sqlite3_fi
b590: 6e 61 6c 69 7a 65 28 70 58 49 6e 66 6f 29 3b 0a  nalize(pXInfo);.
b5a0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
b5b0: 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63 32 3b 0a  _OK ) rc = rc2;.
b5c0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
b5d0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
b5e0: 74 65 33 5f 66 72 65 65 28 7a 52 65 74 29 3b 0a  te3_free(zRet);.
b5f0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
b600: 28 7a 49 6d 70 43 6f 6c 73 29 3b 0a 20 20 20 20  (zImpCols);.    
b610: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 49 6d  sqlite3_free(zIm
b620: 70 50 4b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pPK);.    sqlite
b630: 33 5f 66 72 65 65 28 7a 57 68 65 72 65 29 3b 0a  3_free(zWhere);.
b640: 20 20 20 20 7a 52 65 74 20 3d 20 30 3b 0a 20 20      zRet = 0;.  
b650: 20 20 7a 49 6d 70 43 6f 6c 73 20 3d 20 30 3b 0a    zImpCols = 0;.
b660: 20 20 20 20 7a 49 6d 70 50 4b 20 3d 20 30 3b 0a      zImpPK = 0;.
b670: 20 20 20 20 7a 57 68 65 72 65 20 3d 20 30 3b 0a      zWhere = 0;.
b680: 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a      p->rc = rc;.
b690: 20 20 7d 0a 0a 20 20 2a 70 7a 49 6d 70 6f 73 74    }..  *pzImpost
b6a0: 65 72 43 6f 6c 73 20 3d 20 7a 49 6d 70 43 6f 6c  erCols = zImpCol
b6b0: 73 3b 0a 20 20 2a 70 7a 49 6d 70 6f 73 74 65 72  s;.  *pzImposter
b6c0: 50 6b 20 3d 20 7a 49 6d 70 50 4b 3b 0a 20 20 2a  Pk = zImpPK;.  *
b6d0: 70 7a 57 68 65 72 65 20 3d 20 7a 57 68 65 72 65  pzWhere = zWhere
b6e0: 3b 0a 20 20 2a 70 6e 42 69 6e 64 20 3d 20 6e 42  ;.  *pnBind = nB
b6f0: 69 6e 64 3b 0a 20 20 72 65 74 75 72 6e 20 7a 52  ind;.  return zR
b700: 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73  et;.}../*.** Ass
b710: 75 6d 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e  uming the curren
b720: 74 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20  t table columns 
b730: 61 72 65 20 22 61 22 2c 20 22 62 22 20 61 6e 64  are "a", "b" and
b740: 20 22 63 22 2c 20 61 6e 64 20 74 68 65 20 7a 4f   "c", and the zO
b750: 62 6a 0a 2a 2a 20 70 61 72 61 6d 74 65 72 20 69  bj.** paramter i
b760: 73 20 70 61 73 73 65 64 20 22 6f 6c 64 22 2c 20  s passed "old", 
b770: 72 65 74 75 72 6e 20 61 20 73 74 72 69 6e 67 20  return a string 
b780: 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a  of the form:.**.
b790: 2a 2a 20 20 20 20 20 22 6f 6c 64 2e 61 2c 20 6f  **     "old.a, o
b7a0: 6c 64 2e 62 2c 20 6f 6c 64 2e 62 22 0a 2a 2a 0a  ld.b, old.b".**.
b7b0: 2a 2a 20 57 69 74 68 20 74 68 65 20 63 6f 6c 75  ** With the colu
b7c0: 6d 6e 20 6e 61 6d 65 73 20 65 73 63 61 70 65 64  mn names escaped
b7d0: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 61 62 6c  ..**.** For tabl
b7e0: 65 73 20 77 69 74 68 20 69 6d 70 6c 69 63 69 74  es with implicit
b7f0: 20 72 6f 77 69 64 73 20 2d 20 52 42 55 5f 50 4b   rowids - RBU_PK
b800: 5f 45 58 54 45 52 4e 41 4c 20 61 6e 64 20 52 42  _EXTERNAL and RB
b810: 55 5f 50 4b 5f 4e 4f 4e 45 2c 20 61 70 70 65 6e  U_PK_NONE, appen
b820: 64 0a 2a 2a 20 74 68 65 20 74 65 78 74 20 22 2c  d.** the text ",
b830: 20 6f 6c 64 2e 5f 72 6f 77 69 64 5f 22 20 74 6f   old._rowid_" to
b840: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 76 61   the returned va
b850: 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  lue..*/.static c
b860: 68 61 72 20 2a 72 62 75 4f 62 6a 49 74 65 72 47  har *rbuObjIterG
b870: 65 74 4f 6c 64 6c 69 73 74 28 0a 20 20 73 71 6c  etOldlist(.  sql
b880: 69 74 65 33 72 62 75 20 2a 70 2c 20 0a 20 20 52  ite3rbu *p, .  R
b890: 62 75 4f 62 6a 49 74 65 72 20 2a 70 49 74 65 72  buObjIter *pIter
b8a0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
b8b0: 7a 4f 62 6a 0a 29 7b 0a 20 20 63 68 61 72 20 2a  zObj.){.  char *
b8c0: 7a 4c 69 73 74 20 3d 20 30 3b 0a 20 20 69 66 28  zList = 0;.  if(
b8d0: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
b8e0: 4b 20 26 26 20 70 49 74 65 72 2d 3e 61 62 49 6e  K && pIter->abIn
b8f0: 64 65 78 65 64 20 29 7b 0a 20 20 20 20 63 6f 6e  dexed ){.    con
b900: 73 74 20 63 68 61 72 20 2a 7a 53 20 3d 20 22 22  st char *zS = ""
b910: 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
b920: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65   for(i=0; i<pIte
b930: 72 2d 3e 6e 54 62 6c 43 6f 6c 3b 20 69 2b 2b 29  r->nTblCol; i++)
b940: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  {.      if( pIte
b950: 72 2d 3e 61 62 49 6e 64 65 78 65 64 5b 69 5d 20  r->abIndexed[i] 
b960: 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
b970: 20 63 68 61 72 20 2a 7a 43 6f 6c 20 3d 20 70 49   char *zCol = pI
b980: 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69 5d  ter->azTblCol[i]
b990: 3b 0a 20 20 20 20 20 20 20 20 7a 4c 69 73 74 20  ;.        zList 
b9a0: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
b9b0: 66 28 22 25 7a 25 73 25 73 2e 5c 22 25 77 5c 22  f("%z%s%s.\"%w\"
b9c0: 22 2c 20 7a 4c 69 73 74 2c 20 7a 53 2c 20 7a 4f  ", zList, zS, zO
b9d0: 62 6a 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 20  bj, zCol);.     
b9e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
b9f0: 7a 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 5f  zList = sqlite3_
ba00: 6d 70 72 69 6e 74 66 28 22 25 7a 25 73 4e 55 4c  mprintf("%z%sNUL
ba10: 4c 22 2c 20 7a 4c 69 73 74 2c 20 7a 53 29 3b 0a  L", zList, zS);.
ba20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 53        }.      zS
ba30: 20 3d 20 22 2c 20 22 3b 0a 20 20 20 20 20 20 69   = ", ";.      i
ba40: 66 28 20 7a 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( zList==0 ){. 
ba50: 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53         p->rc = S
ba60: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
ba70: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
ba80: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
ba90: 2a 20 46 6f 72 20 61 20 74 61 62 6c 65 20 77 69  * For a table wi
baa0: 74 68 20 69 6d 70 6c 69 63 69 74 20 72 6f 77 69  th implicit rowi
bab0: 64 73 2c 20 61 70 70 65 6e 64 20 22 6f 6c 64 2e  ds, append "old.
bac0: 5f 72 6f 77 69 64 5f 22 20 74 6f 20 74 68 65 20  _rowid_" to the 
bad0: 6c 69 73 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28  list. */.    if(
bae0: 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52   pIter->eType==R
baf0: 42 55 5f 50 4b 5f 45 58 54 45 52 4e 41 4c 20 7c  BU_PK_EXTERNAL |
bb00: 7c 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d  | pIter->eType==
bb10: 52 42 55 5f 50 4b 5f 4e 4f 4e 45 20 29 7b 0a 20  RBU_PK_NONE ){. 
bb20: 20 20 20 20 20 7a 4c 69 73 74 20 3d 20 72 62 75       zList = rbu
bb30: 4d 50 72 69 6e 74 66 28 70 2c 20 22 25 7a 2c 20  MPrintf(p, "%z, 
bb40: 25 73 2e 5f 72 6f 77 69 64 5f 22 2c 20 7a 4c 69  %s._rowid_", zLi
bb50: 73 74 2c 20 7a 4f 62 6a 29 3b 0a 20 20 20 20 7d  st, zObj);.    }
bb60: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4c  .  }.  return zL
bb70: 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ist;.}../*.** Re
bb80: 74 75 72 6e 20 61 6e 20 65 78 70 72 65 73 73 69  turn an expressi
bb90: 6f 6e 20 74 68 61 74 20 63 61 6e 20 62 65 20 75  on that can be u
bba0: 73 65 64 20 69 6e 20 61 20 57 48 45 52 45 20 63  sed in a WHERE c
bbb0: 6c 61 75 73 65 20 74 6f 20 6d 61 74 63 68 20 74  lause to match t
bbc0: 68 65 0a 2a 2a 20 70 72 69 6d 61 72 79 20 6b 65  he.** primary ke
bbd0: 79 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  y of the current
bbe0: 20 74 61 62 6c 65 2e 20 46 6f 72 20 65 78 61 6d   table. For exam
bbf0: 70 6c 65 2c 20 69 66 20 74 68 65 20 74 61 62 6c  ple, if the tabl
bc00: 65 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52  e is:.**.**   CR
bc10: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
bc20: 20 62 2c 20 63 2c 20 50 52 49 4d 41 52 59 20 4b   b, c, PRIMARY K
bc30: 45 59 28 62 2c 20 63 29 29 3b 0a 2a 2a 0a 2a 2a  EY(b, c));.**.**
bc40: 20 52 65 74 75 72 6e 20 74 68 65 20 73 74 72 69   Return the stri
bc50: 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 62 20 3d  ng:.**.**   "b =
bc60: 20 3f 31 20 41 4e 44 20 63 20 3d 20 3f 32 22 0a   ?1 AND c = ?2".
bc70: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
bc80: 72 62 75 4f 62 6a 49 74 65 72 47 65 74 57 68 65  rbuObjIterGetWhe
bc90: 72 65 28 0a 20 20 73 71 6c 69 74 65 33 72 62 75  re(.  sqlite3rbu
bca0: 20 2a 70 2c 20 0a 20 20 52 62 75 4f 62 6a 49 74   *p, .  RbuObjIt
bcb0: 65 72 20 2a 70 49 74 65 72 0a 29 7b 0a 20 20 63  er *pIter.){.  c
bcc0: 68 61 72 20 2a 7a 4c 69 73 74 20 3d 20 30 3b 0a  har *zList = 0;.
bcd0: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 65 54 79    if( pIter->eTy
bce0: 70 65 3d 3d 52 42 55 5f 50 4b 5f 56 54 41 42 20  pe==RBU_PK_VTAB 
bcf0: 7c 7c 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d  || pIter->eType=
bd00: 3d 52 42 55 5f 50 4b 5f 4e 4f 4e 45 20 29 7b 0a  =RBU_PK_NONE ){.
bd10: 20 20 20 20 7a 4c 69 73 74 20 3d 20 72 62 75 4d      zList = rbuM
bd20: 50 72 69 6e 74 66 28 70 2c 20 22 5f 72 6f 77 69  Printf(p, "_rowi
bd30: 64 5f 20 3d 20 3f 25 64 22 2c 20 70 49 74 65 72  d_ = ?%d", pIter
bd40: 2d 3e 6e 54 62 6c 43 6f 6c 2b 31 29 3b 0a 20 20  ->nTblCol+1);.  
bd50: 7d 65 6c 73 65 20 69 66 28 20 70 49 74 65 72 2d  }else if( pIter-
bd60: 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 45  >eType==RBU_PK_E
bd70: 58 54 45 52 4e 41 4c 20 29 7b 0a 20 20 20 20 63  XTERNAL ){.    c
bd80: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 65 70 20  onst char *zSep 
bd90: 3d 20 22 22 3b 0a 20 20 20 20 69 6e 74 20 69 3b  = "";.    int i;
bda0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
bdb0: 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 3b 20  pIter->nTblCol; 
bdc0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
bdd0: 70 49 74 65 72 2d 3e 61 62 54 62 6c 50 6b 5b 69  pIter->abTblPk[i
bde0: 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4c 69  ] ){.        zLi
bdf0: 73 74 20 3d 20 72 62 75 4d 50 72 69 6e 74 66 28  st = rbuMPrintf(
be00: 70 2c 20 22 25 7a 25 73 63 25 64 3d 3f 25 64 22  p, "%z%sc%d=?%d"
be10: 2c 20 7a 4c 69 73 74 2c 20 7a 53 65 70 2c 20 69  , zList, zSep, i
be20: 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  , i+1);.        
be30: 7a 53 65 70 20 3d 20 22 20 41 4e 44 20 22 3b 0a  zSep = " AND ";.
be40: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
be50: 20 20 7a 4c 69 73 74 20 3d 20 72 62 75 4d 50 72    zList = rbuMPr
be60: 69 6e 74 66 28 70 2c 20 0a 20 20 20 20 20 20 20  intf(p, .       
be70: 20 22 5f 72 6f 77 69 64 5f 20 3d 20 28 53 45 4c   "_rowid_ = (SEL
be80: 45 43 54 20 69 64 20 46 52 4f 4d 20 72 62 75 5f  ECT id FROM rbu_
be90: 69 6d 70 6f 73 74 65 72 32 20 57 48 45 52 45 20  imposter2 WHERE 
bea0: 25 7a 29 22 2c 20 7a 4c 69 73 74 0a 20 20 20 20  %z)", zList.    
beb0: 29 3b 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  );..  }else{.   
bec0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 65   const char *zSe
bed0: 70 20 3d 20 22 22 3b 0a 20 20 20 20 69 6e 74 20  p = "";.    int 
bee0: 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
bef0: 69 3c 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c  i<pIter->nTblCol
bf00: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
bf10: 28 20 70 49 74 65 72 2d 3e 61 62 54 62 6c 50 6b  ( pIter->abTblPk
bf20: 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 63  [i] ){.        c
bf30: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 20  onst char *zCol 
bf40: 3d 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f  = pIter->azTblCo
bf50: 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 7a 4c  l[i];.        zL
bf60: 69 73 74 20 3d 20 72 62 75 4d 50 72 69 6e 74 66  ist = rbuMPrintf
bf70: 28 70 2c 20 22 25 7a 25 73 5c 22 25 77 5c 22 3d  (p, "%z%s\"%w\"=
bf80: 3f 25 64 22 2c 20 7a 4c 69 73 74 2c 20 7a 53 65  ?%d", zList, zSe
bf90: 70 2c 20 7a 43 6f 6c 2c 20 69 2b 31 29 3b 0a 20  p, zCol, i+1);. 
bfa0: 20 20 20 20 20 20 20 7a 53 65 70 20 3d 20 22 20         zSep = " 
bfb0: 41 4e 44 20 22 3b 0a 20 20 20 20 20 20 7d 0a 20  AND ";.      }. 
bfc0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
bfd0: 6e 20 7a 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  n zList;.}../*.*
bfe0: 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61  * The SELECT sta
bff0: 74 65 6d 65 6e 74 20 69 74 65 72 61 74 69 6e 67  tement iterating
c000: 20 74 68 72 6f 75 67 68 20 74 68 65 20 6b 65 79   through the key
c010: 73 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  s for the curren
c020: 74 20 6f 62 6a 65 63 74 0a 2a 2a 20 28 70 2d 3e  t object.** (p->
c030: 6f 62 6a 69 74 65 72 2e 70 53 65 6c 65 63 74 29  objiter.pSelect)
c040: 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
c050: 73 20 74 6f 20 61 20 76 61 6c 69 64 20 72 6f 77  s to a valid row
c060: 2e 20 48 6f 77 65 76 65 72 2c 20 74 68 65 72 65  . However, there
c070: 0a 2a 2a 20 69 73 20 73 6f 6d 65 74 68 69 6e 67  .** is something
c080: 20 77 72 6f 6e 67 20 77 69 74 68 20 74 68 65 20   wrong with the 
c090: 72 62 75 5f 63 6f 6e 74 72 6f 6c 20 76 61 6c 75  rbu_control valu
c0a0: 65 20 69 6e 20 74 68 65 20 72 62 75 5f 63 6f 6e  e in the rbu_con
c0b0: 74 72 6f 6c 20 76 61 6c 75 65 0a 2a 2a 20 73 74  trol value.** st
c0c0: 6f 72 65 64 20 69 6e 20 74 68 65 20 28 70 2d 3e  ored in the (p->
c0d0: 6e 43 6f 6c 2b 31 29 27 74 68 20 63 6f 6c 75 6d  nCol+1)'th colum
c0e0: 6e 2e 20 53 65 74 20 74 68 65 20 65 72 72 6f 72  n. Set the error
c0f0: 20 63 6f 64 65 20 61 6e 64 20 65 72 72 6f 72 20   code and error 
c100: 6d 65 73 73 61 67 65 0a 2a 2a 20 6f 66 20 74 68  message.** of th
c110: 65 20 52 42 55 20 68 61 6e 64 6c 65 20 74 6f 20  e RBU handle to 
c120: 73 6f 6d 65 74 68 69 6e 67 20 72 65 66 6c 65 63  something reflec
c130: 74 69 6e 67 20 74 68 69 73 2e 0a 2a 2f 0a 73 74  ting this..*/.st
c140: 61 74 69 63 20 76 6f 69 64 20 72 62 75 42 61 64  atic void rbuBad
c150: 43 6f 6e 74 72 6f 6c 45 72 72 6f 72 28 73 71 6c  ControlError(sql
c160: 69 74 65 33 72 62 75 20 2a 70 29 7b 0a 20 20 70  ite3rbu *p){.  p
c170: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52  ->rc = SQLITE_ER
c180: 52 4f 52 3b 0a 20 20 70 2d 3e 7a 45 72 72 6d 73  ROR;.  p->zErrms
c190: 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  g = sqlite3_mpri
c1a0: 6e 74 66 28 22 69 6e 76 61 6c 69 64 20 72 62 75  ntf("invalid rbu
c1b0: 5f 63 6f 6e 74 72 6f 6c 20 76 61 6c 75 65 22 29  _control value")
c1c0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ;.}.../*.** Retu
c1d0: 72 6e 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  rn a nul-termina
c1e0: 74 65 64 20 73 74 72 69 6e 67 20 63 6f 6e 74 61  ted string conta
c1f0: 69 6e 69 6e 67 20 74 68 65 20 63 6f 6d 6d 61 20  ining the comma 
c200: 73 65 70 61 72 61 74 65 64 20 6c 69 73 74 20 6f  separated list o
c210: 66 0a 2a 2a 20 61 73 73 69 67 6e 6d 65 6e 74 73  f.** assignments
c220: 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
c230: 69 6e 63 6c 75 64 65 64 20 66 6f 6c 6c 6f 77 69  included followi
c240: 6e 67 20 74 68 65 20 22 53 45 54 22 20 6b 65 79  ng the "SET" key
c250: 77 6f 72 64 20 6f 66 0a 2a 2a 20 61 6e 20 55 50  word of.** an UP
c260: 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20 75  DATE statement u
c270: 73 65 64 20 74 6f 20 75 70 64 61 74 65 20 74 68  sed to update th
c280: 65 20 74 61 62 6c 65 20 6f 62 6a 65 63 74 20 74  e table object t
c290: 68 61 74 20 74 68 65 20 69 74 65 72 61 74 6f 72  hat the iterator
c2a0: 0a 2a 2a 20 70 61 73 73 65 64 20 61 73 20 74 68  .** passed as th
c2b0: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
c2c0: 74 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  t currently poin
c2d0: 74 73 20 74 6f 20 69 66 20 74 68 65 20 72 62 75  ts to if the rbu
c2e0: 5f 63 6f 6e 74 72 6f 6c 0a 2a 2a 20 63 6f 6c 75  _control.** colu
c2f0: 6d 6e 20 6f 66 20 74 68 65 20 64 61 74 61 5f 78  mn of the data_x
c300: 78 78 20 74 61 62 6c 65 20 65 6e 74 72 79 20 69  xx table entry i
c310: 73 20 73 65 74 20 74 6f 20 7a 4d 61 73 6b 2e 0a  s set to zMask..
c320: 2a 2a 0a 2a 2a 20 54 68 65 20 6d 65 6d 6f 72 79  **.** The memory
c330: 20 66 6f 72 20 74 68 65 20 72 65 74 75 72 6e 65   for the returne
c340: 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61  d string is obta
c350: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
c360: 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 49  3_malloc()..** I
c370: 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73  t is the respons
c380: 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
c390: 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61  aller to eventua
c3a0: 6c 6c 79 20 66 72 65 65 20 69 74 20 75 73 69 6e  lly free it usin
c3b0: 67 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66 72 65  g.** sqlite3_fre
c3c0: 65 28 29 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61  e(). .**.** If a
c3d0: 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 69 73 20 65  n OOM error is e
c3e0: 6e 63 6f 75 6e 74 65 72 65 64 20 77 68 65 6e 20  ncountered when 
c3f0: 61 6c 6c 6f 63 61 74 69 6e 67 20 73 70 61 63 65  allocating space
c400: 20 66 6f 72 20 74 68 65 20 6e 65 77 0a 2a 2a 20   for the new.** 
c410: 73 74 72 69 6e 67 2c 20 61 6e 20 65 72 72 6f 72  string, an error
c420: 20 63 6f 64 65 20 69 73 20 6c 65 66 74 20 69 6e   code is left in
c430: 20 74 68 65 20 72 62 75 20 68 61 6e 64 6c 65 20   the rbu handle 
c440: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
c450: 72 73 74 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20  rst.** argument 
c460: 61 6e 64 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  and NULL is retu
c470: 72 6e 65 64 2e 20 4f 72 2c 20 69 66 20 61 6e 20  rned. Or, if an 
c480: 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64  error has alread
c490: 79 20 6f 63 63 75 72 72 65 64 0a 2a 2a 20 77 68  y occurred.** wh
c4a0: 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
c4b0: 20 69 73 20 63 61 6c 6c 65 64 2c 20 4e 55 4c 4c   is called, NULL
c4c0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 6d 6d   is returned imm
c4d0: 65 64 69 61 74 65 6c 79 2c 20 77 69 74 68 6f 75  ediately, withou
c4e0: 74 0a 2a 2a 20 61 74 74 65 6d 70 74 69 6e 67 20  t.** attempting 
c4f0: 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f  the allocation o
c500: 72 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20  r modifying the 
c510: 73 74 6f 72 65 64 20 65 72 72 6f 72 20 63 6f 64  stored error cod
c520: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  e..*/.static cha
c530: 72 20 2a 72 62 75 4f 62 6a 49 74 65 72 47 65 74  r *rbuObjIterGet
c540: 53 65 74 6c 69 73 74 28 0a 20 20 73 71 6c 69 74  Setlist(.  sqlit
c550: 65 33 72 62 75 20 2a 70 2c 0a 20 20 52 62 75 4f  e3rbu *p,.  RbuO
c560: 62 6a 49 74 65 72 20 2a 70 49 74 65 72 2c 0a 20  bjIter *pIter,. 
c570: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61   const char *zMa
c580: 73 6b 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4c  sk.){.  char *zL
c590: 69 73 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  ist = 0;.  if( p
c5a0: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
c5b0: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20  ){.    int i;.. 
c5c0: 20 20 20 69 66 28 20 73 74 72 6c 65 6e 28 7a 4d     if( strlen(zM
c5d0: 61 73 6b 29 21 3d 70 49 74 65 72 2d 3e 6e 54 62  ask)!=pIter->nTb
c5e0: 6c 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 72 62  lCol ){.      rb
c5f0: 75 42 61 64 43 6f 6e 74 72 6f 6c 45 72 72 6f 72  uBadControlError
c600: 28 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  (p);.    }else{.
c610: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
c620: 20 2a 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20 20   *zSep = "";.   
c630: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49     for(i=0; i<pI
c640: 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 3b 20 69 2b  ter->nTblCol; i+
c650: 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72  +){.        char
c660: 20 63 20 3d 20 7a 4d 61 73 6b 5b 70 49 74 65 72   c = zMask[pIter
c670: 2d 3e 61 69 53 72 63 4f 72 64 65 72 5b 69 5d 5d  ->aiSrcOrder[i]]
c680: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3d  ;.        if( c=
c690: 3d 27 78 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='x' ){.        
c6a0: 20 20 7a 4c 69 73 74 20 3d 20 72 62 75 4d 50 72    zList = rbuMPr
c6b0: 69 6e 74 66 28 70 2c 20 22 25 7a 25 73 5c 22 25  intf(p, "%z%s\"%
c6c0: 77 5c 22 3d 3f 25 64 22 2c 20 0a 20 20 20 20 20  w\"=?%d", .     
c6d0: 20 20 20 20 20 20 20 20 20 7a 4c 69 73 74 2c 20           zList, 
c6e0: 7a 53 65 70 2c 20 70 49 74 65 72 2d 3e 61 7a 54  zSep, pIter->azT
c6f0: 62 6c 43 6f 6c 5b 69 5d 2c 20 69 2b 31 0a 20 20  blCol[i], i+1.  
c700: 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
c710: 20 20 20 20 20 7a 53 65 70 20 3d 20 22 2c 20 22       zSep = ", "
c720: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
c730: 20 20 20 20 65 6c 73 65 20 69 66 28 20 63 3d 3d      else if( c==
c740: 27 64 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20  'd' ){.         
c750: 20 7a 4c 69 73 74 20 3d 20 72 62 75 4d 50 72 69   zList = rbuMPri
c760: 6e 74 66 28 70 2c 20 22 25 7a 25 73 5c 22 25 77  ntf(p, "%z%s\"%w
c770: 5c 22 3d 72 62 75 5f 64 65 6c 74 61 28 5c 22 25  \"=rbu_delta(\"%
c780: 77 5c 22 2c 20 3f 25 64 29 22 2c 20 0a 20 20 20  w\", ?%d)", .   
c790: 20 20 20 20 20 20 20 20 20 20 20 7a 4c 69 73 74             zList
c7a0: 2c 20 7a 53 65 70 2c 20 70 49 74 65 72 2d 3e 61  , zSep, pIter->a
c7b0: 7a 54 62 6c 43 6f 6c 5b 69 5d 2c 20 70 49 74 65  zTblCol[i], pIte
c7c0: 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69 5d 2c 20  r->azTblCol[i], 
c7d0: 69 2b 31 0a 20 20 20 20 20 20 20 20 20 20 29 3b  i+1.          );
c7e0: 0a 20 20 20 20 20 20 20 20 20 20 7a 53 65 70 20  .          zSep 
c7f0: 3d 20 22 2c 20 22 3b 0a 20 20 20 20 20 20 20 20  = ", ";.        
c800: 7d 0a 20 20 20 20 20 20 20 20 65 6c 73 65 20 69  }.        else i
c810: 66 28 20 63 3d 3d 27 66 27 20 29 7b 0a 20 20 20  f( c=='f' ){.   
c820: 20 20 20 20 20 20 20 7a 4c 69 73 74 20 3d 20 72         zList = r
c830: 62 75 4d 50 72 69 6e 74 66 28 70 2c 20 22 25 7a  buMPrintf(p, "%z
c840: 25 73 5c 22 25 77 5c 22 3d 72 62 75 5f 66 6f 73  %s\"%w\"=rbu_fos
c850: 73 69 6c 5f 64 65 6c 74 61 28 5c 22 25 77 5c 22  sil_delta(\"%w\"
c860: 2c 20 3f 25 64 29 22 2c 20 0a 20 20 20 20 20 20  , ?%d)", .      
c870: 20 20 20 20 20 20 20 20 7a 4c 69 73 74 2c 20 7a          zList, z
c880: 53 65 70 2c 20 70 49 74 65 72 2d 3e 61 7a 54 62  Sep, pIter->azTb
c890: 6c 43 6f 6c 5b 69 5d 2c 20 70 49 74 65 72 2d 3e  lCol[i], pIter->
c8a0: 61 7a 54 62 6c 43 6f 6c 5b 69 5d 2c 20 69 2b 31  azTblCol[i], i+1
c8b0: 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20  .          );.  
c8c0: 20 20 20 20 20 20 20 20 7a 53 65 70 20 3d 20 22          zSep = "
c8d0: 2c 20 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  , ";.        }. 
c8e0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
c8f0: 0a 20 20 72 65 74 75 72 6e 20 7a 4c 69 73 74 3b  .  return zList;
c900: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
c910: 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65   a nul-terminate
c920: 64 20 73 74 72 69 6e 67 20 63 6f 6e 73 69 73 74  d string consist
c930: 69 6e 67 20 6f 66 20 6e 42 79 74 65 20 63 6f 6d  ing of nByte com
c940: 6d 61 20 73 65 70 61 72 61 74 65 64 0a 2a 2a 20  ma separated.** 
c950: 22 3f 22 20 65 78 70 72 65 73 73 69 6f 6e 73 2e  "?" expressions.
c960: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66   For example, if
c970: 20 6e 42 79 74 65 20 69 73 20 33 2c 20 72 65 74   nByte is 3, ret
c980: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
c990: 0a 2a 2a 20 61 20 62 75 66 66 65 72 20 63 6f 6e  .** a buffer con
c9a0: 74 61 69 6e 69 6e 67 20 74 68 65 20 73 74 72 69  taining the stri
c9b0: 6e 67 20 22 3f 2c 3f 2c 3f 22 2e 0a 2a 2a 0a 2a  ng "?,?,?"..**.*
c9c0: 2a 20 54 68 65 20 6d 65 6d 6f 72 79 20 66 6f 72  * The memory for
c9d0: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 74   the returned st
c9e0: 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64  ring is obtained
c9f0: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
ca00: 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 49 74 20 69 73  lloc()..** It is
ca10: 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
ca20: 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  ity of the calle
ca30: 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20  r to eventually 
ca40: 66 72 65 65 20 69 74 20 75 73 69 6e 67 0a 2a 2a  free it using.**
ca50: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e   sqlite3_free().
ca60: 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f   .**.** If an OO
ca70: 4d 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75  M error is encou
ca80: 6e 74 65 72 65 64 20 77 68 65 6e 20 61 6c 6c 6f  ntered when allo
ca90: 63 61 74 69 6e 67 20 73 70 61 63 65 20 66 6f 72  cating space for
caa0: 20 74 68 65 20 6e 65 77 0a 2a 2a 20 73 74 72 69   the new.** stri
cab0: 6e 67 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  ng, an error cod
cac0: 65 20 69 73 20 6c 65 66 74 20 69 6e 20 74 68 65  e is left in the
cad0: 20 72 62 75 20 68 61 6e 64 6c 65 20 70 61 73 73   rbu handle pass
cae0: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 0a  ed as the first.
caf0: 2a 2a 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20  ** argument and 
cb00: 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
cb10: 2e 20 4f 72 2c 20 69 66 20 61 6e 20 65 72 72 6f  . Or, if an erro
cb20: 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63  r has already oc
cb30: 63 75 72 72 65 64 0a 2a 2a 20 77 68 65 6e 20 74  curred.** when t
cb40: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
cb50: 63 61 6c 6c 65 64 2c 20 4e 55 4c 4c 20 69 73 20  called, NULL is 
cb60: 72 65 74 75 72 6e 65 64 20 69 6d 6d 65 64 69 61  returned immedia
cb70: 74 65 6c 79 2c 20 77 69 74 68 6f 75 74 0a 2a 2a  tely, without.**
cb80: 20 61 74 74 65 6d 70 74 69 6e 67 20 74 68 65 20   attempting the 
cb90: 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 72 20 6d 6f  allocation or mo
cba0: 64 69 66 79 69 6e 67 20 74 68 65 20 73 74 6f 72  difying the stor
cbb0: 65 64 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  ed error code..*
cbc0: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 72  /.static char *r
cbd0: 62 75 4f 62 6a 49 74 65 72 47 65 74 42 69 6e 64  buObjIterGetBind
cbe0: 6c 69 73 74 28 73 71 6c 69 74 65 33 72 62 75 20  list(sqlite3rbu 
cbf0: 2a 70 2c 20 69 6e 74 20 6e 42 69 6e 64 29 7b 0a  *p, int nBind){.
cc00: 20 20 63 68 61 72 20 2a 7a 52 65 74 20 3d 20 30    char *zRet = 0
cc10: 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20  ;.  int nByte = 
cc20: 6e 42 69 6e 64 2a 32 20 2b 20 31 3b 0a 0a 20 20  nBind*2 + 1;..  
cc30: 7a 52 65 74 20 3d 20 28 63 68 61 72 2a 29 72 62  zRet = (char*)rb
cc40: 75 4d 61 6c 6c 6f 63 28 70 2c 20 6e 42 79 74 65  uMalloc(p, nByte
cc50: 29 3b 0a 20 20 69 66 28 20 7a 52 65 74 20 29 7b  );.  if( zRet ){
cc60: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
cc70: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 69 6e 64  for(i=0; i<nBind
cc80: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 52  ; i++){.      zR
cc90: 65 74 5b 69 2a 32 5d 20 3d 20 27 3f 27 3b 0a 20  et[i*2] = '?';. 
cca0: 20 20 20 20 20 7a 52 65 74 5b 69 2a 32 2b 31 5d       zRet[i*2+1]
ccb0: 20 3d 20 28 69 2b 31 3d 3d 6e 42 69 6e 64 29 20   = (i+1==nBind) 
ccc0: 3f 20 27 5c 30 27 20 3a 20 27 2c 27 3b 0a 20 20  ? '\0' : ',';.  
ccd0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
cce0: 20 7a 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   zRet;.}../*.** 
ccf0: 54 68 65 20 69 74 65 72 61 74 6f 72 20 63 75 72  The iterator cur
cd00: 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f  rently points to
cd10: 20 61 20 74 61 62 6c 65 20 28 6e 6f 74 20 69 6e   a table (not in
cd20: 64 65 78 29 20 6f 66 20 74 79 70 65 20 0a 2a 2a  dex) of type .**
cd30: 20 52 42 55 5f 50 4b 5f 57 49 54 48 4f 55 54 5f   RBU_PK_WITHOUT_
cd40: 52 4f 57 49 44 2e 20 54 68 69 73 20 66 75 6e 63  ROWID. This func
cd50: 74 69 6f 6e 20 63 72 65 61 74 65 73 20 74 68 65  tion creates the
cd60: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 0a 2a 2a   PRIMARY KEY .**
cd70: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 66 6f 72   declaration for
cd80: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
cd90: 6e 67 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c  ng imposter tabl
cda0: 65 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 0a  e. For example,.
cdb0: 2a 2a 20 69 66 20 74 68 65 20 69 74 65 72 61 74  ** if the iterat
cdc0: 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 74  or points to a t
cdd0: 61 62 6c 65 20 63 72 65 61 74 65 64 20 61 73 3a  able created as:
cde0: 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45 20  .**.**   CREATE 
cdf0: 54 41 42 4c 45 20 74 31 28 61 2c 20 62 2c 20 63  TABLE t1(a, b, c
ce00: 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28 62 2c  , PRIMARY KEY(b,
ce10: 20 61 20 44 45 53 43 29 29 20 57 49 54 48 4f 55   a DESC)) WITHOU
ce20: 54 20 52 4f 57 49 44 0a 2a 2a 0a 2a 2a 20 74 68  T ROWID.**.** th
ce30: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
ce40: 72 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 52 49  rns:.**.**   PRI
ce50: 4d 41 52 59 20 4b 45 59 28 22 62 22 2c 20 22 61  MARY KEY("b", "a
ce60: 22 20 44 45 53 43 29 0a 2a 2f 0a 73 74 61 74 69  " DESC).*/.stati
ce70: 63 20 63 68 61 72 20 2a 72 62 75 57 69 74 68 6f  c char *rbuWitho
ce80: 75 74 52 6f 77 69 64 50 4b 28 73 71 6c 69 74 65  utRowidPK(sqlite
ce90: 33 72 62 75 20 2a 70 2c 20 52 62 75 4f 62 6a 49  3rbu *p, RbuObjI
cea0: 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 63  ter *pIter){.  c
ceb0: 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20 20 61 73  har *z = 0;.  as
cec0: 73 65 72 74 28 20 70 49 74 65 72 2d 3e 7a 49 64  sert( pIter->zId
ced0: 78 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d  x==0 );.  if( p-
cee0: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
cef0: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
cf00: 20 2a 7a 53 65 70 20 3d 20 22 50 52 49 4d 41 52   *zSep = "PRIMAR
cf10: 59 20 4b 45 59 28 22 3b 0a 20 20 20 20 73 71 6c  Y KEY(";.    sql
cf20: 69 74 65 33 5f 73 74 6d 74 20 2a 70 58 4c 69 73  ite3_stmt *pXLis
cf30: 74 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 50 52  t = 0;     /* PR
cf40: 41 47 4d 41 20 69 6e 64 65 78 5f 6c 69 73 74 20  AGMA index_list 
cf50: 3d 20 28 70 49 74 65 72 2d 3e 7a 54 62 6c 29 20  = (pIter->zTbl) 
cf60: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  */.    sqlite3_s
cf70: 74 6d 74 20 2a 70 58 49 6e 66 6f 20 3d 20 30 3b  tmt *pXInfo = 0;
cf80: 20 20 20 20 20 2f 2a 20 50 52 41 47 4d 41 20 69       /* PRAGMA i
cf90: 6e 64 65 78 5f 78 69 6e 66 6f 20 3d 20 3c 70 6b  ndex_xinfo = <pk
cfa0: 2d 69 6e 64 65 78 3e 20 2a 2f 0a 20 20 20 0a 20  -index> */.   . 
cfb0: 20 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61     p->rc = prepa
cfc0: 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74  reFreeAndCollect
cfd0: 45 72 72 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c  Error(p->dbMain,
cfe0: 20 26 70 58 4c 69 73 74 2c 20 26 70 2d 3e 7a 45   &pXList, &p->zE
cff0: 72 72 6d 73 67 2c 0a 20 20 20 20 20 20 20 20 73  rrmsg,.        s
d000: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
d010: 50 52 41 47 4d 41 20 6d 61 69 6e 2e 69 6e 64 65  PRAGMA main.inde
d020: 78 5f 6c 69 73 74 20 3d 20 25 51 22 2c 20 70 49  x_list = %Q", pI
d030: 74 65 72 2d 3e 7a 54 62 6c 29 0a 20 20 20 20 29  ter->zTbl).    )
d040: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 2d 3e  ;.    while( p->
d050: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
d060: 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
d070: 69 74 65 33 5f 73 74 65 70 28 70 58 4c 69 73 74  ite3_step(pXList
d080: 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  ) ){.      const
d090: 20 63 68 61 72 20 2a 7a 4f 72 69 67 20 3d 20 28   char *zOrig = (
d0a0: 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
d0b0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
d0c0: 70 58 4c 69 73 74 2c 33 29 3b 0a 20 20 20 20 20  pXList,3);.     
d0d0: 20 69 66 28 20 7a 4f 72 69 67 20 26 26 20 73 74   if( zOrig && st
d0e0: 72 63 6d 70 28 7a 4f 72 69 67 2c 20 22 70 6b 22  rcmp(zOrig, "pk"
d0f0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
d100: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 78  const char *zIdx
d110: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
d120: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
d130: 65 78 74 28 70 58 4c 69 73 74 2c 31 29 3b 0a 20  ext(pXList,1);. 
d140: 20 20 20 20 20 20 20 69 66 28 20 7a 49 64 78 20         if( zIdx 
d150: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ){.          p->
d160: 72 63 20 3d 20 70 72 65 70 61 72 65 46 72 65 65  rc = prepareFree
d170: 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28  AndCollectError(
d180: 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 70 58 49 6e  p->dbMain, &pXIn
d190: 66 6f 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c  fo, &p->zErrmsg,
d1a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
d1b0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
d1c0: 50 52 41 47 4d 41 20 6d 61 69 6e 2e 69 6e 64 65  PRAGMA main.inde
d1d0: 78 5f 78 69 6e 66 6f 20 3d 20 25 51 22 2c 20 7a  x_xinfo = %Q", z
d1e0: 49 64 78 29 0a 20 20 20 20 20 20 20 20 20 20 29  Idx).          )
d1f0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
d200: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
d210: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 62 75   }.    }.    rbu
d220: 46 69 6e 61 6c 69 7a 65 28 70 2c 20 70 58 4c 69  Finalize(p, pXLi
d230: 73 74 29 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28  st);..    while(
d240: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
d250: 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d  K && SQLITE_ROW=
d260: 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 58  =sqlite3_step(pX
d270: 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 20 20 69  Info) ){.      i
d280: 66 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  f( sqlite3_colum
d290: 6e 5f 69 6e 74 28 70 58 49 6e 66 6f 2c 20 35 29  n_int(pXInfo, 5)
d2a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 69   ){.        /* i
d2b0: 6e 74 20 69 43 69 64 20 3d 20 73 71 6c 69 74 65  nt iCid = sqlite
d2c0: 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 58 49  3_column_int(pXI
d2d0: 6e 66 6f 2c 20 30 29 3b 20 2a 2f 0a 20 20 20 20  nfo, 0); */.    
d2e0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
d2f0: 7a 43 6f 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68  zCol = (const ch
d300: 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
d310: 6d 6e 5f 74 65 78 74 28 70 58 49 6e 66 6f 2c 20  mn_text(pXInfo, 
d320: 32 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  2);.        cons
d330: 74 20 63 68 61 72 20 2a 7a 44 65 73 63 20 3d 20  t char *zDesc = 
d340: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
d350: 6e 74 28 70 58 49 6e 66 6f 2c 20 33 29 20 3f 20  nt(pXInfo, 3) ? 
d360: 22 20 44 45 53 43 22 20 3a 20 22 22 3b 0a 20 20  " DESC" : "";.  
d370: 20 20 20 20 20 20 7a 20 3d 20 72 62 75 4d 50 72        z = rbuMPr
d380: 69 6e 74 66 28 70 2c 20 22 25 7a 25 73 5c 22 25  intf(p, "%z%s\"%
d390: 77 5c 22 25 73 22 2c 20 7a 2c 20 7a 53 65 70 2c  w\"%s", z, zSep,
d3a0: 20 7a 43 6f 6c 2c 20 7a 44 65 73 63 29 3b 0a 20   zCol, zDesc);. 
d3b0: 20 20 20 20 20 20 20 7a 53 65 70 20 3d 20 22 2c         zSep = ",
d3c0: 20 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   ";.      }.    
d3d0: 7d 0a 20 20 20 20 7a 20 3d 20 72 62 75 4d 50 72  }.    z = rbuMPr
d3e0: 69 6e 74 66 28 70 2c 20 22 25 7a 29 22 2c 20 7a  intf(p, "%z)", z
d3f0: 29 3b 0a 20 20 20 20 72 62 75 46 69 6e 61 6c 69  );.    rbuFinali
d400: 7a 65 28 70 2c 20 70 58 49 6e 66 6f 29 3b 0a 20  ze(p, pXInfo);. 
d410: 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d   }.  return z;.}
d420: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
d430: 63 74 69 6f 6e 20 63 72 65 61 74 65 73 20 74 68  ction creates th
d440: 65 20 73 65 63 6f 6e 64 20 69 6d 70 6f 73 74 65  e second imposte
d450: 72 20 74 61 62 6c 65 20 75 73 65 64 20 77 68 65  r table used whe
d460: 6e 20 77 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20  n writing to.** 
d470: 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20 77  a table b-tree w
d480: 68 65 72 65 20 74 68 65 20 74 61 62 6c 65 20 68  here the table h
d490: 61 73 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 70  as an external p
d4a0: 72 69 6d 61 72 79 20 6b 65 79 2e 20 49 66 20 74  rimary key. If t
d4b0: 68 65 0a 2a 2a 20 69 74 65 72 61 74 6f 72 20 70  he.** iterator p
d4c0: 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
d4d0: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 64 6f 65  ond argument doe
d4e0: 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20  s not currently 
d4f0: 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 61 20 74 61  point to.** a ta
d500: 62 6c 65 20 28 6e 6f 74 20 69 6e 64 65 78 29 20  ble (not index) 
d510: 77 69 74 68 20 61 6e 20 65 78 74 65 72 6e 61 6c  with an external
d520: 20 70 72 69 6d 61 72 79 20 6b 65 79 2c 20 74 68   primary key, th
d530: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
d540: 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20 0a 2a 2a 0a 2a  .** no-op. .**.*
d550: 2a 20 41 73 73 75 6d 69 6e 67 20 74 68 65 20 69  * Assuming the i
d560: 74 65 72 61 74 6f 72 20 64 6f 65 73 20 70 6f 69  terator does poi
d570: 6e 74 20 74 6f 20 61 20 74 61 62 6c 65 20 77 69  nt to a table wi
d580: 74 68 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 50  th an external P
d590: 4b 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  K, this.** funct
d5a0: 69 6f 6e 20 63 72 65 61 74 65 73 20 61 20 57 49  ion creates a WI
d5b0: 54 48 4f 55 54 20 52 4f 57 49 44 20 69 6d 70 6f  THOUT ROWID impo
d5c0: 73 74 65 72 20 74 61 62 6c 65 20 6e 61 6d 65 64  ster table named
d5d0: 20 22 72 62 75 5f 69 6d 70 6f 73 74 65 72 32 22   "rbu_imposter2"
d5e0: 0a 2a 2a 20 75 73 65 64 20 74 6f 20 61 63 63 65  .** used to acce
d5f0: 73 73 20 74 68 61 74 20 50 4b 20 69 6e 64 65 78  ss that PK index
d600: 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69  . For example, i
d610: 66 20 74 68 65 20 74 61 72 67 65 74 20 74 61 62  f the target tab
d620: 6c 65 20 69 73 0a 2a 2a 20 64 65 63 6c 61 72 65  le is.** declare
d630: 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  d as follows:.**
d640: 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42  .**   CREATE TAB
d650: 4c 45 20 74 31 28 61 2c 20 62 20 54 45 58 54 2c  LE t1(a, b TEXT,
d660: 20 63 20 52 45 41 4c 2c 20 50 52 49 4d 41 52 59   c REAL, PRIMARY
d670: 20 4b 45 59 28 62 2c 20 63 29 29 3b 0a 2a 2a 0a   KEY(b, c));.**.
d680: 2a 2a 20 74 68 65 6e 20 74 68 65 20 69 6d 70 6f  ** then the impo
d690: 73 74 65 72 20 74 61 62 6c 65 20 73 63 68 65 6d  ster table schem
d6a0: 61 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52  a is:.**.**   CR
d6b0: 45 41 54 45 20 54 41 42 4c 45 20 72 62 75 5f 69  EATE TABLE rbu_i
d6c0: 6d 70 6f 73 74 65 72 32 28 63 31 20 54 45 58 54  mposter2(c1 TEXT
d6d0: 2c 20 63 32 20 52 45 41 4c 2c 20 69 64 20 49 4e  , c2 REAL, id IN
d6e0: 54 45 47 45 52 29 20 57 49 54 48 4f 55 54 20 52  TEGER) WITHOUT R
d6f0: 4f 57 49 44 3b 0a 2a 2a 0a 2a 2f 0a 73 74 61 74  OWID;.**.*/.stat
d700: 69 63 20 76 6f 69 64 20 72 62 75 43 72 65 61 74  ic void rbuCreat
d710: 65 49 6d 70 6f 73 74 65 72 54 61 62 6c 65 32 28  eImposterTable2(
d720: 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 52  sqlite3rbu *p, R
d730: 62 75 4f 62 6a 49 74 65 72 20 2a 70 49 74 65 72  buObjIter *pIter
d740: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  ){.  if( p->rc==
d750: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 49 74  SQLITE_OK && pIt
d760: 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50  er->eType==RBU_P
d770: 4b 5f 45 58 54 45 52 4e 41 4c 20 29 7b 0a 20 20  K_EXTERNAL ){.  
d780: 20 20 69 6e 74 20 74 6e 75 6d 20 3d 20 70 49 74    int tnum = pIt
d790: 65 72 2d 3e 69 50 6b 54 6e 75 6d 3b 20 20 20 20  er->iPkTnum;    
d7a0: 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20  /* Root page of 
d7b0: 50 4b 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  PK index */.    
d7c0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 51  sqlite3_stmt *pQ
d7d0: 75 65 72 79 20 3d 20 30 3b 20 20 20 20 20 2f 2a  uery = 0;     /*
d7e0: 20 53 45 4c 45 43 54 20 6e 61 6d 65 20 2e 2e 2e   SELECT name ...
d7f0: 20 57 48 45 52 45 20 72 6f 6f 74 70 61 67 65 20   WHERE rootpage 
d800: 3d 20 24 74 6e 75 6d 20 2a 2f 0a 20 20 20 20 63  = $tnum */.    c
d810: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 78 20  onst char *zIdx 
d820: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
d830: 4e 61 6d 65 20 6f 66 20 50 4b 20 69 6e 64 65 78  Name of PK index
d840: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   */.    sqlite3_
d850: 73 74 6d 74 20 2a 70 58 49 6e 66 6f 20 3d 20 30  stmt *pXInfo = 0
d860: 3b 20 20 20 20 20 2f 2a 20 50 52 41 47 4d 41 20  ;     /* PRAGMA 
d870: 6d 61 69 6e 2e 69 6e 64 65 78 5f 78 69 6e 66 6f  main.index_xinfo
d880: 20 3d 20 24 7a 49 64 78 20 2a 2f 0a 20 20 20 20   = $zIdx */.    
d890: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6d  const char *zCom
d8a0: 6d 61 20 3d 20 22 22 3b 0a 20 20 20 20 63 68 61  ma = "";.    cha
d8b0: 72 20 2a 7a 43 6f 6c 73 20 3d 20 30 3b 20 20 20  r *zCols = 0;   
d8c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
d8d0: 65 64 20 74 6f 20 62 75 69 6c 64 20 75 70 20 6c  ed to build up l
d8e0: 69 73 74 20 6f 66 20 74 61 62 6c 65 20 63 6f 6c  ist of table col
d8f0: 73 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a  s */.    char *z
d900: 50 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  Pk = 0;         
d910: 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
d920: 6f 20 62 75 69 6c 64 20 75 70 20 74 61 62 6c 65  o build up table
d930: 20 50 4b 20 64 65 63 6c 61 72 61 74 69 6f 6e 20   PK declaration 
d940: 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46 69 67 75 72  */..    /* Figur
d950: 65 20 6f 75 74 20 74 68 65 20 6e 61 6d 65 20 6f  e out the name o
d960: 66 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65  f the primary ke
d970: 79 20 69 6e 64 65 78 20 66 6f 72 20 74 68 65 20  y index for the 
d980: 63 75 72 72 65 6e 74 20 74 61 62 6c 65 2e 0a 20  current table.. 
d990: 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e 65     ** This is ne
d9a0: 65 64 65 64 20 66 6f 72 20 74 68 65 20 61 72 67  eded for the arg
d9b0: 75 6d 65 6e 74 20 74 6f 20 22 50 52 41 47 4d 41  ument to "PRAGMA
d9c0: 20 69 6e 64 65 78 5f 78 69 6e 66 6f 22 2e 20 53   index_xinfo". S
d9d0: 65 74 0a 20 20 20 20 2a 2a 20 7a 49 64 78 20 74  et.    ** zIdx t
d9e0: 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 6e 75 6c  o point to a nul
d9f0: 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69  -terminated stri
da00: 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ng containing th
da10: 69 73 20 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20  is name. */.    
da20: 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65 41  p->rc = prepareA
da30: 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70  ndCollectError(p
da40: 2d 3e 64 62 4d 61 69 6e 2c 20 26 70 51 75 65 72  ->dbMain, &pQuer
da50: 79 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 20  y, &p->zErrmsg, 
da60: 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54  .        "SELECT
da70: 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74   name FROM sqlit
da80: 65 5f 6d 61 73 74 65 72 20 57 48 45 52 45 20 72  e_master WHERE r
da90: 6f 6f 74 70 61 67 65 20 3d 20 3f 22 0a 20 20 20  ootpage = ?".   
daa0: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72   );.    if( p->r
dab0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
dac0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
dad0: 6e 64 5f 69 6e 74 28 70 51 75 65 72 79 2c 20 31  nd_int(pQuery, 1
dae0: 2c 20 74 6e 75 6d 29 3b 0a 20 20 20 20 20 20 69  , tnum);.      i
daf0: 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  f( SQLITE_ROW==s
db00: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 51 75 65  qlite3_step(pQue
db10: 72 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  ry) ){.        z
db20: 49 64 78 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  Idx = (const cha
db30: 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
db40: 6e 5f 74 65 78 74 28 70 51 75 65 72 79 2c 20 30  n_text(pQuery, 0
db50: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
db60: 0a 20 20 20 20 69 66 28 20 7a 49 64 78 20 29 7b  .    if( zIdx ){
db70: 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 70  .      p->rc = p
db80: 72 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f 6c  repareFreeAndCol
db90: 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 4d  lectError(p->dbM
dba0: 61 69 6e 2c 20 26 70 58 49 6e 66 6f 2c 20 26 70  ain, &pXInfo, &p
dbb0: 2d 3e 7a 45 72 72 6d 73 67 2c 0a 20 20 20 20 20  ->zErrmsg,.     
dbc0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72       sqlite3_mpr
dbd0: 69 6e 74 66 28 22 50 52 41 47 4d 41 20 6d 61 69  intf("PRAGMA mai
dbe0: 6e 2e 69 6e 64 65 78 5f 78 69 6e 66 6f 20 3d 20  n.index_xinfo = 
dbf0: 25 51 22 2c 20 7a 49 64 78 29 0a 20 20 20 20 20  %Q", zIdx).     
dc00: 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 62   );.    }.    rb
dc10: 75 46 69 6e 61 6c 69 7a 65 28 70 2c 20 70 51 75  uFinalize(p, pQu
dc20: 65 72 79 29 3b 0a 0a 20 20 20 20 77 68 69 6c 65  ery);..    while
dc30: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
dc40: 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57  OK && SQLITE_ROW
dc50: 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ==sqlite3_step(p
dc60: 58 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 20 20  XInfo) ){.      
dc70: 69 6e 74 20 62 4b 65 79 20 3d 20 73 71 6c 69 74  int bKey = sqlit
dc80: 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 58  e3_column_int(pX
dc90: 49 6e 66 6f 2c 20 35 29 3b 0a 20 20 20 20 20 20  Info, 5);.      
dca0: 69 66 28 20 62 4b 65 79 20 29 7b 0a 20 20 20 20  if( bKey ){.    
dcb0: 20 20 20 20 69 6e 74 20 69 43 69 64 20 3d 20 73      int iCid = s
dcc0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
dcd0: 74 28 70 58 49 6e 66 6f 2c 20 31 29 3b 0a 20 20  t(pXInfo, 1);.  
dce0: 20 20 20 20 20 20 69 6e 74 20 62 44 65 73 63 20        int bDesc 
dcf0: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
dd00: 5f 69 6e 74 28 70 58 49 6e 66 6f 2c 20 33 29 3b  _int(pXInfo, 3);
dd10: 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
dd20: 68 61 72 20 2a 7a 43 6f 6c 6c 61 74 65 20 3d 20  har *zCollate = 
dd30: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
dd40: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
dd50: 28 70 58 49 6e 66 6f 2c 20 34 29 3b 0a 20 20 20  (pXInfo, 4);.   
dd60: 20 20 20 20 20 7a 43 6f 6c 73 20 3d 20 72 62 75       zCols = rbu
dd70: 4d 50 72 69 6e 74 66 28 70 2c 20 22 25 7a 25 73  MPrintf(p, "%z%s
dd80: 63 25 64 20 25 73 20 43 4f 4c 4c 41 54 45 20 25  c%d %s COLLATE %
dd90: 73 22 2c 20 7a 43 6f 6c 73 2c 20 7a 43 6f 6d 6d  s", zCols, zComm
dda0: 61 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  a, .            
ddb0: 69 43 69 64 2c 20 70 49 74 65 72 2d 3e 61 7a 54  iCid, pIter->azT
ddc0: 62 6c 54 79 70 65 5b 69 43 69 64 5d 2c 20 7a 43  blType[iCid], zC
ddd0: 6f 6c 6c 61 74 65 0a 20 20 20 20 20 20 20 20 29  ollate.        )
dde0: 3b 0a 20 20 20 20 20 20 20 20 7a 50 6b 20 3d 20  ;.        zPk = 
ddf0: 72 62 75 4d 50 72 69 6e 74 66 28 70 2c 20 22 25  rbuMPrintf(p, "%
de00: 7a 25 73 63 25 64 25 73 22 2c 20 7a 50 6b 2c 20  z%sc%d%s", zPk, 
de10: 7a 43 6f 6d 6d 61 2c 20 69 43 69 64 2c 20 62 44  zComma, iCid, bD
de20: 65 73 63 3f 22 20 44 45 53 43 22 3a 22 22 29 3b  esc?" DESC":"");
de30: 0a 20 20 20 20 20 20 20 20 7a 43 6f 6d 6d 61 20  .        zComma 
de40: 3d 20 22 2c 20 22 3b 0a 20 20 20 20 20 20 7d 0a  = ", ";.      }.
de50: 20 20 20 20 7d 0a 20 20 20 20 7a 43 6f 6c 73 20      }.    zCols 
de60: 3d 20 72 62 75 4d 50 72 69 6e 74 66 28 70 2c 20  = rbuMPrintf(p, 
de70: 22 25 7a 2c 20 69 64 20 49 4e 54 45 47 45 52 22  "%z, id INTEGER"
de80: 2c 20 7a 43 6f 6c 73 29 3b 0a 20 20 20 20 72 62  , zCols);.    rb
de90: 75 46 69 6e 61 6c 69 7a 65 28 70 2c 20 70 58 49  uFinalize(p, pXI
dea0: 6e 66 6f 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74  nfo);..    sqlit
deb0: 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
dec0: 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
ded0: 49 4d 50 4f 53 54 45 52 2c 20 70 2d 3e 64 62 4d  IMPOSTER, p->dbM
dee0: 61 69 6e 2c 20 22 6d 61 69 6e 22 2c 20 31 2c 20  ain, "main", 1, 
def0: 74 6e 75 6d 29 3b 0a 20 20 20 20 72 62 75 4d 50  tnum);.    rbuMP
df00: 72 69 6e 74 66 45 78 65 63 28 70 2c 20 70 2d 3e  rintfExec(p, p->
df10: 64 62 4d 61 69 6e 2c 0a 20 20 20 20 20 20 20 20  dbMain,.        
df20: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 72 62  "CREATE TABLE rb
df30: 75 5f 69 6d 70 6f 73 74 65 72 32 28 25 7a 2c 20  u_imposter2(%z, 
df40: 50 52 49 4d 41 52 59 20 4b 45 59 28 25 7a 29 29  PRIMARY KEY(%z))
df50: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 22 2c   WITHOUT ROWID",
df60: 20 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 73 2c   .        zCols,
df70: 20 7a 50 6b 0a 20 20 20 20 29 3b 0a 20 20 20 20   zPk.    );.    
df80: 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
df90: 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
dfa0: 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52 2c 20 70  CTRL_IMPOSTER, p
dfb0: 2d 3e 64 62 4d 61 69 6e 2c 20 22 6d 61 69 6e 22  ->dbMain, "main"
dfc0: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a  , 0, 0);.  }.}..
dfd0: 2f 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  /*.** If an erro
dfe0: 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63  r has already oc
dff0: 63 75 72 72 65 64 20 77 68 65 6e 20 74 68 69 73  curred when this
e000: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
e010: 6c 65 64 2c 20 69 74 20 0a 2a 2a 20 69 6d 6d 65  led, it .** imme
e020: 64 69 61 74 65 6c 79 20 72 65 74 75 72 6e 73 20  diately returns 
e030: 7a 65 72 6f 20 28 77 69 74 68 6f 75 74 20 64 6f  zero (without do
e040: 69 6e 67 20 61 6e 79 20 77 6f 72 6b 29 2e 20 4f  ing any work). O
e050: 72 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 0a 2a  r, if an error.*
e060: 2a 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  * occurs during 
e070: 74 68 65 20 65 78 65 63 75 74 69 6f 6e 20 6f 66  the execution of
e080: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20   this function, 
e090: 69 74 20 73 65 74 73 20 74 68 65 20 65 72 72 6f  it sets the erro
e0a0: 72 20 63 6f 64 65 0a 2a 2a 20 69 6e 20 74 68 65  r code.** in the
e0b0: 20 73 71 6c 69 74 65 33 72 62 75 20 6f 62 6a 65   sqlite3rbu obje
e0c0: 63 74 20 69 6e 64 69 63 61 74 65 64 20 62 79 20  ct indicated by 
e0d0: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
e0e0: 6e 74 20 61 6e 64 20 72 65 74 75 72 6e 73 0a 2a  nt and returns.*
e0f0: 2a 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68  * zero..**.** Th
e100: 65 20 69 74 65 72 61 74 6f 72 20 70 61 73 73 65  e iterator passe
e110: 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
e120: 61 72 67 75 6d 65 6e 74 20 69 73 20 67 75 61 72  argument is guar
e130: 61 6e 74 65 65 64 20 74 6f 20 70 6f 69 6e 74 20  anteed to point 
e140: 74 6f 0a 2a 2a 20 61 20 74 61 62 6c 65 20 28 6e  to.** a table (n
e150: 6f 74 20 61 6e 20 69 6e 64 65 78 29 20 77 68 65  ot an index) whe
e160: 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
e170: 69 73 20 63 61 6c 6c 65 64 2e 20 54 68 69 73 20  is called. This 
e180: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 74 74 65  function.** atte
e190: 6d 70 74 73 20 74 6f 20 63 72 65 61 74 65 20 61  mpts to create a
e1a0: 6e 79 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c  ny imposter tabl
e1b0: 65 20 72 65 71 75 69 72 65 64 20 74 6f 20 77 72  e required to wr
e1c0: 69 74 65 20 74 6f 20 74 68 65 20 6d 61 69 6e 0a  ite to the main.
e1d0: 2a 2a 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20  ** table b-tree 
e1e0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 62 65 66  of the table bef
e1f0: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 4e  ore returning. N
e200: 6f 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74 75 72  on-zero is retur
e210: 6e 65 64 20 69 66 0a 2a 2a 20 61 6e 20 69 6d 70  ned if.** an imp
e220: 6f 73 74 65 72 20 74 61 62 6c 65 20 61 72 65 20  oster table are 
e230: 63 72 65 61 74 65 64 2c 20 6f 72 20 7a 65 72 6f  created, or zero
e240: 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a   otherwise..**.*
e250: 2a 20 41 6e 20 69 6d 70 6f 73 74 65 72 20 74 61  * An imposter ta
e260: 62 6c 65 20 69 73 20 72 65 71 75 69 72 65 64 20  ble is required 
e270: 69 6e 20 61 6c 6c 20 63 61 73 65 73 20 65 78 63  in all cases exc
e280: 65 70 74 20 52 42 55 5f 50 4b 5f 56 54 41 42 2e  ept RBU_PK_VTAB.
e290: 20 4f 6e 6c 79 0a 2a 2a 20 76 69 72 74 75 61 6c   Only.** virtual
e2a0: 20 74 61 62 6c 65 73 20 61 72 65 20 77 72 69 74   tables are writ
e2b0: 74 65 6e 20 74 6f 20 64 69 72 65 63 74 6c 79 2e  ten to directly.
e2c0: 20 54 68 65 20 69 6d 70 6f 73 74 65 72 20 74 61   The imposter ta
e2d0: 62 6c 65 20 68 61 73 20 74 68 65 20 0a 2a 2a 20  ble has the .** 
e2e0: 73 61 6d 65 20 73 63 68 65 6d 61 20 61 73 20 74  same schema as t
e2f0: 68 65 20 61 63 74 75 61 6c 20 74 61 72 67 65 74  he actual target
e300: 20 74 61 62 6c 65 20 28 6c 65 73 73 20 61 6e 79   table (less any
e310: 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69   UNIQUE constrai
e320: 6e 74 73 29 2e 20 0a 2a 2a 20 4d 6f 72 65 20 70  nts). .** More p
e330: 72 65 63 69 73 65 6c 79 2c 20 74 68 65 20 22 73  recisely, the "s
e340: 61 6d 65 20 73 63 68 65 6d 61 22 20 6d 65 61 6e  ame schema" mean
e350: 73 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 75 6d  s the same colum
e360: 6e 73 2c 20 74 79 70 65 73 2c 20 0a 2a 2a 20 63  ns, types, .** c
e370: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
e380: 65 73 2e 20 46 6f 72 20 74 61 62 6c 65 73 20 74  es. For tables t
e390: 68 61 74 20 64 6f 20 6e 6f 74 20 68 61 76 65 20  hat do not have 
e3a0: 61 6e 20 65 78 74 65 72 6e 61 6c 20 50 52 49 4d  an external PRIM
e3b0: 41 52 59 0a 2a 2a 20 4b 45 59 2c 20 69 74 20 61  ARY.** KEY, it a
e3c0: 6c 73 6f 20 6d 65 61 6e 73 20 74 68 65 20 73 61  lso means the sa
e3d0: 6d 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 64  me PRIMARY KEY d
e3e0: 65 63 6c 61 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73  eclaration..*/.s
e3f0: 74 61 74 69 63 20 76 6f 69 64 20 72 62 75 43 72  tatic void rbuCr
e400: 65 61 74 65 49 6d 70 6f 73 74 65 72 54 61 62 6c  eateImposterTabl
e410: 65 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c  e(sqlite3rbu *p,
e420: 20 52 62 75 4f 62 6a 49 74 65 72 20 2a 70 49 74   RbuObjIter *pIt
e430: 65 72 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63  er){.  if( p->rc
e440: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
e450: 49 74 65 72 2d 3e 65 54 79 70 65 21 3d 52 42 55  Iter->eType!=RBU
e460: 5f 50 4b 5f 56 54 41 42 20 29 7b 0a 20 20 20 20  _PK_VTAB ){.    
e470: 69 6e 74 20 74 6e 75 6d 20 3d 20 70 49 74 65 72  int tnum = pIter
e480: 2d 3e 69 54 6e 75 6d 3b 0a 20 20 20 20 63 6f 6e  ->iTnum;.    con
e490: 73 74 20 63 68 61 72 20 2a 7a 43 6f 6d 6d 61 20  st char *zComma 
e4a0: 3d 20 22 22 3b 0a 20 20 20 20 63 68 61 72 20 2a  = "";.    char *
e4b0: 7a 53 71 6c 20 3d 20 30 3b 0a 20 20 20 20 69 6e  zSql = 0;.    in
e4c0: 74 20 69 43 6f 6c 3b 0a 20 20 20 20 73 71 6c 69  t iCol;.    sqli
e4d0: 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
e4e0: 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
e4f0: 5f 49 4d 50 4f 53 54 45 52 2c 20 70 2d 3e 64 62  _IMPOSTER, p->db
e500: 4d 61 69 6e 2c 20 22 6d 61 69 6e 22 2c 20 30 2c  Main, "main", 0,
e510: 20 31 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 43   1);..    for(iC
e520: 6f 6c 3d 30 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c  ol=0; p->rc==SQL
e530: 49 54 45 5f 4f 4b 20 26 26 20 69 43 6f 6c 3c 70  ITE_OK && iCol<p
e540: 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 3b 20 69  Iter->nTblCol; i
e550: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 63 6f  Col++){.      co
e560: 6e 73 74 20 63 68 61 72 20 2a 7a 50 6b 20 3d 20  nst char *zPk = 
e570: 22 22 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  "";.      const 
e580: 63 68 61 72 20 2a 7a 43 6f 6c 20 3d 20 70 49 74  char *zCol = pIt
e590: 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69 43 6f  er->azTblCol[iCo
e5a0: 6c 5d 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  l];.      const 
e5b0: 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 30 3b  char *zColl = 0;
e5c0: 0a 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20  ..      p->rc = 
e5d0: 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f  sqlite3_table_co
e5e0: 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28 0a 20  lumn_metadata(. 
e5f0: 20 20 20 20 20 20 20 20 20 70 2d 3e 64 62 4d 61           p->dbMa
e600: 69 6e 2c 20 22 6d 61 69 6e 22 2c 20 70 49 74 65  in, "main", pIte
e610: 72 2d 3e 7a 54 62 6c 2c 20 7a 43 6f 6c 2c 20 30  r->zTbl, zCol, 0
e620: 2c 20 26 7a 43 6f 6c 6c 2c 20 30 2c 20 30 2c 20  , &zColl, 0, 0, 
e630: 30 0a 20 20 20 20 20 20 29 3b 0a 0a 20 20 20 20  0.      );..    
e640: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 65 54 79    if( pIter->eTy
e650: 70 65 3d 3d 52 42 55 5f 50 4b 5f 49 50 4b 20 26  pe==RBU_PK_IPK &
e660: 26 20 70 49 74 65 72 2d 3e 61 62 54 62 6c 50 6b  & pIter->abTblPk
e670: 5b 69 43 6f 6c 5d 20 29 7b 0a 20 20 20 20 20 20  [iCol] ){.      
e680: 20 20 2f 2a 20 49 66 20 74 68 65 20 74 61 72 67    /* If the targ
e690: 65 74 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20  et table column 
e6a0: 69 73 20 61 6e 20 22 49 4e 54 45 47 45 52 20 50  is an "INTEGER P
e6b0: 52 49 4d 41 52 59 20 4b 45 59 22 2c 20 61 64 64  RIMARY KEY", add
e6c0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 22 50 52 49  .        ** "PRI
e6d0: 4d 41 52 59 20 4b 45 59 22 20 74 6f 20 74 68 65  MARY KEY" to the
e6e0: 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 20   imposter table 
e6f0: 63 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74 69  column declarati
e700: 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 7a  on. */.        z
e710: 50 6b 20 3d 20 22 50 52 49 4d 41 52 59 20 4b 45  Pk = "PRIMARY KE
e720: 59 20 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Y ";.      }.   
e730: 20 20 20 7a 53 71 6c 20 3d 20 72 62 75 4d 50 72     zSql = rbuMPr
e740: 69 6e 74 66 28 70 2c 20 22 25 7a 25 73 5c 22 25  intf(p, "%z%s\"%
e750: 77 5c 22 20 25 73 20 25 73 43 4f 4c 4c 41 54 45  w\" %s %sCOLLATE
e760: 20 25 73 25 73 22 2c 20 0a 20 20 20 20 20 20 20   %s%s", .       
e770: 20 20 20 7a 53 71 6c 2c 20 7a 43 6f 6d 6d 61 2c     zSql, zComma,
e780: 20 7a 43 6f 6c 2c 20 70 49 74 65 72 2d 3e 61 7a   zCol, pIter->az
e790: 54 62 6c 54 79 70 65 5b 69 43 6f 6c 5d 2c 20 7a  TblType[iCol], z
e7a0: 50 6b 2c 20 7a 43 6f 6c 6c 2c 0a 20 20 20 20 20  Pk, zColl,.     
e7b0: 20 20 20 20 20 28 70 49 74 65 72 2d 3e 61 62 4e       (pIter->abN
e7c0: 6f 74 4e 75 6c 6c 5b 69 43 6f 6c 5d 20 3f 20 22  otNull[iCol] ? "
e7d0: 20 4e 4f 54 20 4e 55 4c 4c 22 20 3a 20 22 22 29   NOT NULL" : "")
e7e0: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
e7f0: 7a 43 6f 6d 6d 61 20 3d 20 22 2c 20 22 3b 0a 20  zComma = ", ";. 
e800: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 49     }..    if( pI
e810: 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f  ter->eType==RBU_
e820: 50 4b 5f 57 49 54 48 4f 55 54 5f 52 4f 57 49 44  PK_WITHOUT_ROWID
e830: 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
e840: 7a 50 6b 20 3d 20 72 62 75 57 69 74 68 6f 75 74  zPk = rbuWithout
e850: 52 6f 77 69 64 50 4b 28 70 2c 20 70 49 74 65 72  RowidPK(p, pIter
e860: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50 6b  );.      if( zPk
e870: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 53 71 6c   ){.        zSql
e880: 20 3d 20 72 62 75 4d 50 72 69 6e 74 66 28 70 2c   = rbuMPrintf(p,
e890: 20 22 25 7a 2c 20 25 7a 22 2c 20 7a 53 71 6c 2c   "%z, %z", zSql,
e8a0: 20 7a 50 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20   zPk);.      }. 
e8b0: 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65     }..    sqlite
e8c0: 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
e8d0: 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49  QLITE_TESTCTRL_I
e8e0: 4d 50 4f 53 54 45 52 2c 20 70 2d 3e 64 62 4d 61  MPOSTER, p->dbMa
e8f0: 69 6e 2c 20 22 6d 61 69 6e 22 2c 20 31 2c 20 74  in, "main", 1, t
e900: 6e 75 6d 29 3b 0a 20 20 20 20 72 62 75 4d 50 72  num);.    rbuMPr
e910: 69 6e 74 66 45 78 65 63 28 70 2c 20 70 2d 3e 64  intfExec(p, p->d
e920: 62 4d 61 69 6e 2c 20 22 43 52 45 41 54 45 20 54  bMain, "CREATE T
e930: 41 42 4c 45 20 5c 22 72 62 75 5f 69 6d 70 5f 25  ABLE \"rbu_imp_%
e940: 77 5c 22 28 25 7a 29 25 73 22 2c 20 0a 20 20 20  w\"(%z)%s", .   
e950: 20 20 20 20 20 70 49 74 65 72 2d 3e 7a 54 62 6c       pIter->zTbl
e960: 2c 20 7a 53 71 6c 2c 20 0a 20 20 20 20 20 20 20  , zSql, .       
e970: 20 28 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d   (pIter->eType==
e980: 52 42 55 5f 50 4b 5f 57 49 54 48 4f 55 54 5f 52  RBU_PK_WITHOUT_R
e990: 4f 57 49 44 20 3f 20 22 20 57 49 54 48 4f 55 54  OWID ? " WITHOUT
e9a0: 20 52 4f 57 49 44 22 20 3a 20 22 22 29 0a 20 20   ROWID" : "").  
e9b0: 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33    );.    sqlite3
e9c0: 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
e9d0: 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d  LITE_TESTCTRL_IM
e9e0: 50 4f 53 54 45 52 2c 20 70 2d 3e 64 62 4d 61 69  POSTER, p->dbMai
e9f0: 6e 2c 20 22 6d 61 69 6e 22 2c 20 30 2c 20 30 29  n, "main", 0, 0)
ea00: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  ;.  }.}../*.** P
ea10: 72 65 70 61 72 65 20 61 20 73 74 61 74 65 6d 65  repare a stateme
ea20: 6e 74 20 75 73 65 64 20 74 6f 20 69 6e 73 65 72  nt used to inser
ea30: 74 20 72 6f 77 73 20 69 6e 74 6f 20 74 68 65 20  t rows into the 
ea40: 22 72 62 75 5f 74 6d 70 5f 78 78 78 22 20 74 61  "rbu_tmp_xxx" ta
ea50: 62 6c 65 2e 0a 2a 2a 20 53 70 65 63 69 66 69 63  ble..** Specific
ea60: 61 6c 6c 79 20 61 20 73 74 61 74 65 6d 65 6e 74  ally a statement
ea70: 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a   of the form:.**
ea80: 0a 2a 2a 20 20 20 20 20 49 4e 53 45 52 54 20 49  .**     INSERT I
ea90: 4e 54 4f 20 72 62 75 5f 74 6d 70 5f 78 78 78 20  NTO rbu_tmp_xxx 
eaa0: 56 41 4c 55 45 53 28 3f 2c 20 3f 2c 20 3f 20 2e  VALUES(?, ?, ? .
eab0: 2e 2e 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e  ..);.**.** The n
eac0: 75 6d 62 65 72 20 6f 66 20 62 6f 75 6e 64 20 76  umber of bound v
ead0: 61 72 69 61 62 6c 65 73 20 69 73 20 65 71 75 61  ariables is equa
eae0: 6c 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  l to the number 
eaf0: 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 0a 2a 2a  of columns in.**
eb00: 20 74 68 65 20 74 61 72 67 65 74 20 74 61 62 6c   the target tabl
eb10: 65 2c 20 70 6c 75 73 20 6f 6e 65 20 28 66 6f 72  e, plus one (for
eb20: 20 74 68 65 20 72 62 75 5f 63 6f 6e 74 72 6f 6c   the rbu_control
eb30: 20 63 6f 6c 75 6d 6e 29 2c 20 70 6c 75 73 20 6f   column), plus o
eb40: 6e 65 20 6d 6f 72 65 20 0a 2a 2a 20 28 66 6f 72  ne more .** (for
eb50: 20 74 68 65 20 72 62 75 5f 72 6f 77 69 64 20 63   the rbu_rowid c
eb60: 6f 6c 75 6d 6e 29 20 69 66 20 74 68 65 20 74 61  olumn) if the ta
eb70: 72 67 65 74 20 74 61 62 6c 65 20 69 73 20 61 6e  rget table is an
eb80: 20 69 6d 70 6c 69 63 69 74 20 49 50 4b 20 6f 72   implicit IPK or
eb90: 20 0a 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62   .** virtual tab
eba0: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  le..*/.static vo
ebb0: 69 64 20 72 62 75 4f 62 6a 49 74 65 72 50 72 65  id rbuObjIterPre
ebc0: 70 61 72 65 54 6d 70 49 6e 73 65 72 74 28 0a 20  pareTmpInsert(. 
ebd0: 20 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20   sqlite3rbu *p, 
ebe0: 0a 20 20 52 62 75 4f 62 6a 49 74 65 72 20 2a 70  .  RbuObjIter *p
ebf0: 49 74 65 72 2c 0a 20 20 63 6f 6e 73 74 20 63 68  Iter,.  const ch
ec00: 61 72 20 2a 7a 43 6f 6c 6c 69 73 74 2c 0a 20 20  ar *zCollist,.  
ec10: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 62 75  const char *zRbu
ec20: 52 6f 77 69 64 0a 29 7b 0a 20 20 69 6e 74 20 62  Rowid.){.  int b
ec30: 52 62 75 52 6f 77 69 64 20 3d 20 28 70 49 74 65  RbuRowid = (pIte
ec40: 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b  r->eType==RBU_PK
ec50: 5f 45 58 54 45 52 4e 41 4c 20 7c 7c 20 70 49 74  _EXTERNAL || pIt
ec60: 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50  er->eType==RBU_P
ec70: 4b 5f 4e 4f 4e 45 29 3b 0a 20 20 63 68 61 72 20  K_NONE);.  char 
ec80: 2a 7a 42 69 6e 64 20 3d 20 72 62 75 4f 62 6a 49  *zBind = rbuObjI
ec90: 74 65 72 47 65 74 42 69 6e 64 6c 69 73 74 28 70  terGetBindlist(p
eca0: 2c 20 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c  , pIter->nTblCol
ecb0: 20 2b 20 31 20 2b 20 62 52 62 75 52 6f 77 69 64   + 1 + bRbuRowid
ecc0: 29 3b 0a 20 20 69 66 28 20 7a 42 69 6e 64 20 29  );.  if( zBind )
ecd0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  {.    assert( pI
ece0: 74 65 72 2d 3e 70 54 6d 70 49 6e 73 65 72 74 3d  ter->pTmpInsert=
ecf0: 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 72 63 20  =0 );.    p->rc 
ed00: 3d 20 70 72 65 70 61 72 65 46 72 65 65 41 6e 64  = prepareFreeAnd
ed10: 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 0a 20 20  CollectError(.  
ed20: 20 20 20 20 20 20 70 2d 3e 64 62 52 62 75 2c 20        p->dbRbu, 
ed30: 26 70 49 74 65 72 2d 3e 70 54 6d 70 49 6e 73 65  &pIter->pTmpInse
ed40: 72 74 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c  rt, &p->zErrmsg,
ed50: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
ed60: 28 0a 20 20 20 20 20 20 20 20 20 20 22 49 4e 53  (.          "INS
ed70: 45 52 54 20 49 4e 54 4f 20 25 73 2e 27 72 62 75  ERT INTO %s.'rbu
ed80: 5f 74 6d 70 5f 25 71 27 28 72 62 75 5f 63 6f 6e  _tmp_%q'(rbu_con
ed90: 74 72 6f 6c 2c 25 73 25 73 29 20 56 41 4c 55 45  trol,%s%s) VALUE
eda0: 53 28 25 7a 29 22 2c 20 0a 20 20 20 20 20 20 20  S(%z)", .       
edb0: 20 20 20 70 2d 3e 7a 53 74 61 74 65 44 62 2c 20     p->zStateDb, 
edc0: 70 49 74 65 72 2d 3e 7a 44 61 74 61 54 62 6c 2c  pIter->zDataTbl,
edd0: 20 7a 43 6f 6c 6c 69 73 74 2c 20 7a 52 62 75 52   zCollist, zRbuR
ede0: 6f 77 69 64 2c 20 7a 42 69 6e 64 0a 20 20 20 20  owid, zBind.    
edf0: 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69  ));.  }.}..stati
ee00: 63 20 76 6f 69 64 20 72 62 75 54 6d 70 49 6e 73  c void rbuTmpIns
ee10: 65 72 74 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  ertFunc(.  sqlit
ee20: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78  e3_context *pCtx
ee30: 2c 20 0a 20 20 69 6e 74 20 6e 56 61 6c 2c 0a 20  , .  int nVal,. 
ee40: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
ee50: 2a 61 70 56 61 6c 0a 29 7b 0a 20 20 73 71 6c 69  *apVal.){.  sqli
ee60: 74 65 33 72 62 75 20 2a 70 20 3d 20 73 71 6c 69  te3rbu *p = sqli
ee70: 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28 70 43  te3_user_data(pC
ee80: 74 78 29 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  tx);.  int rc = 
ee90: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
eea0: 20 69 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20   i;..  for(i=0; 
eeb0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
eec0: 20 69 3c 6e 56 61 6c 3b 20 69 2b 2b 29 7b 0a 20   i<nVal; i++){. 
eed0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
eee0: 62 69 6e 64 5f 76 61 6c 75 65 28 70 2d 3e 6f 62  bind_value(p->ob
eef0: 6a 69 74 65 72 2e 70 54 6d 70 49 6e 73 65 72 74  jiter.pTmpInsert
ef00: 2c 20 69 2b 31 2c 20 61 70 56 61 6c 5b 69 5d 29  , i+1, apVal[i])
ef10: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
ef20: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
ef30: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 2d   sqlite3_step(p-
ef40: 3e 6f 62 6a 69 74 65 72 2e 70 54 6d 70 49 6e 73  >objiter.pTmpIns
ef50: 65 72 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  ert);.    rc = s
ef60: 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 2d 3e  qlite3_reset(p->
ef70: 6f 62 6a 69 74 65 72 2e 70 54 6d 70 49 6e 73 65  objiter.pTmpInse
ef80: 72 74 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  rt);.  }..  if( 
ef90: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
efa0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
efb0: 75 6c 74 5f 65 72 72 6f 72 5f 63 6f 64 65 28 70  ult_error_code(p
efc0: 43 74 78 2c 20 72 63 29 3b 0a 20 20 7d 0a 7d 0a  Ctx, rc);.  }.}.
efd0: 0a 2f 2a 0a 2a 2a 20 45 6e 73 75 72 65 20 74 68  ./*.** Ensure th
efe0: 61 74 20 74 68 65 20 53 51 4c 69 74 65 20 73 74  at the SQLite st
eff0: 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65 73 20  atement handles 
f000: 72 65 71 75 69 72 65 64 20 74 6f 20 75 70 64 61  required to upda
f010: 74 65 20 74 68 65 20 0a 2a 2a 20 74 61 72 67 65  te the .** targe
f020: 74 20 64 61 74 61 62 61 73 65 20 6f 62 6a 65 63  t database objec
f030: 74 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 64 69  t currently indi
f040: 63 61 74 65 64 20 62 79 20 74 68 65 20 69 74 65  cated by the ite
f050: 72 61 74 6f 72 20 70 61 73 73 65 64 20 0a 2a 2a  rator passed .**
f060: 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
f070: 72 67 75 6d 65 6e 74 20 61 72 65 20 61 76 61 69  rgument are avai
f080: 6c 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  lable..*/.static
f090: 20 69 6e 74 20 72 62 75 4f 62 6a 49 74 65 72 50   int rbuObjIterP
f0a0: 72 65 70 61 72 65 41 6c 6c 28 0a 20 20 73 71 6c  repareAll(.  sql
f0b0: 69 74 65 33 72 62 75 20 2a 70 2c 20 0a 20 20 52  ite3rbu *p, .  R
f0c0: 62 75 4f 62 6a 49 74 65 72 20 2a 70 49 74 65 72  buObjIter *pIter
f0d0: 2c 0a 20 20 69 6e 74 20 6e 4f 66 66 73 65 74 20  ,.  int nOffset 
f0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f0f0: 20 20 20 20 2f 2a 20 41 64 64 20 22 4c 49 4d 49      /* Add "LIMI
f100: 54 20 2d 31 20 4f 46 46 53 45 54 20 24 6e 4f 66  T -1 OFFSET $nOf
f110: 66 73 65 74 22 20 74 6f 20 53 45 4c 45 43 54 20  fset" to SELECT 
f120: 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20  */.){.  assert( 
f130: 70 49 74 65 72 2d 3e 62 43 6c 65 61 6e 75 70 3d  pIter->bCleanup=
f140: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 49 74 65  =0 );.  if( pIte
f150: 72 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 26 26  r->pSelect==0 &&
f160: 20 72 62 75 4f 62 6a 49 74 65 72 43 61 63 68 65   rbuObjIterCache
f170: 54 61 62 6c 65 49 6e 66 6f 28 70 2c 20 70 49 74  TableInfo(p, pIt
f180: 65 72 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  er)==SQLITE_OK )
f190: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20  {.    const int 
f1a0: 74 6e 75 6d 20 3d 20 70 49 74 65 72 2d 3e 69 54  tnum = pIter->iT
f1b0: 6e 75 6d 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  num;.    char *z
f1c0: 43 6f 6c 6c 69 73 74 20 3d 20 30 3b 20 20 20 20  Collist = 0;    
f1d0: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
f1e0: 66 20 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e  f indexed column
f1f0: 73 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 2a  s */.    char **
f200: 70 7a 20 3d 20 26 70 2d 3e 7a 45 72 72 6d 73 67  pz = &p->zErrmsg
f210: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
f220: 20 2a 7a 49 64 78 20 3d 20 70 49 74 65 72 2d 3e   *zIdx = pIter->
f230: 7a 49 64 78 3b 0a 20 20 20 20 63 68 61 72 20 2a  zIdx;.    char *
f240: 7a 4c 69 6d 69 74 20 3d 20 30 3b 0a 0a 20 20 20  zLimit = 0;..   
f250: 20 69 66 28 20 6e 4f 66 66 73 65 74 20 29 7b 0a   if( nOffset ){.
f260: 20 20 20 20 20 20 7a 4c 69 6d 69 74 20 3d 20 73        zLimit = s
f270: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
f280: 20 4c 49 4d 49 54 20 2d 31 20 4f 46 46 53 45 54   LIMIT -1 OFFSET
f290: 20 25 64 22 2c 20 6e 4f 66 66 73 65 74 29 3b 0a   %d", nOffset);.
f2a0: 20 20 20 20 20 20 69 66 28 20 21 7a 4c 69 6d 69        if( !zLimi
f2b0: 74 20 29 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49  t ) p->rc = SQLI
f2c0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
f2d0: 0a 20 20 20 20 69 66 28 20 7a 49 64 78 20 29 7b  .    if( zIdx ){
f2e0: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
f2f0: 72 20 2a 7a 54 62 6c 20 3d 20 70 49 74 65 72 2d  r *zTbl = pIter-
f300: 3e 7a 54 62 6c 3b 0a 20 20 20 20 20 20 63 68 61  >zTbl;.      cha
f310: 72 20 2a 7a 49 6d 70 6f 73 74 65 72 43 6f 6c 73  r *zImposterCols
f320: 20 3d 20 30 3b 20 20 20 20 2f 2a 20 43 6f 6c 75   = 0;    /* Colu
f330: 6d 6e 73 20 66 6f 72 20 69 6d 70 6f 73 74 65 72  mns for imposter
f340: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20   table */.      
f350: 63 68 61 72 20 2a 7a 49 6d 70 6f 73 74 65 72 50  char *zImposterP
f360: 4b 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 50  K = 0;      /* P
f370: 72 69 6d 61 72 79 20 6b 65 79 20 64 65 63 6c 61  rimary key decla
f380: 72 61 74 69 6f 6e 20 66 6f 72 20 69 6d 70 6f 73  ration for impos
f390: 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 63 68 61  ter */.      cha
f3a0: 72 20 2a 7a 57 68 65 72 65 20 3d 20 30 3b 20 20  r *zWhere = 0;  
f3b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52           /* WHER
f3c0: 45 20 63 6c 61 75 73 65 20 6f 6e 20 50 4b 20 63  E clause on PK c
f3d0: 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 20 20  olumns */.      
f3e0: 63 68 61 72 20 2a 7a 42 69 6e 64 20 3d 20 30 3b  char *zBind = 0;
f3f0: 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 69 6e 64  .      int nBind
f400: 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 61 73 73   = 0;..      ass
f410: 65 72 74 28 20 70 49 74 65 72 2d 3e 65 54 79 70  ert( pIter->eTyp
f420: 65 21 3d 52 42 55 5f 50 4b 5f 56 54 41 42 20 29  e!=RBU_PK_VTAB )
f430: 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 69 73 74  ;.      zCollist
f440: 20 3d 20 72 62 75 4f 62 6a 49 74 65 72 47 65 74   = rbuObjIterGet
f450: 49 6e 64 65 78 43 6f 6c 73 28 0a 20 20 20 20 20  IndexCols(.     
f460: 20 20 20 20 20 70 2c 20 70 49 74 65 72 2c 20 26       p, pIter, &
f470: 7a 49 6d 70 6f 73 74 65 72 43 6f 6c 73 2c 20 26  zImposterCols, &
f480: 7a 49 6d 70 6f 73 74 65 72 50 4b 2c 20 26 7a 57  zImposterPK, &zW
f490: 68 65 72 65 2c 20 26 6e 42 69 6e 64 0a 20 20 20  here, &nBind.   
f4a0: 20 20 20 29 3b 0a 20 20 20 20 20 20 7a 42 69 6e     );.      zBin
f4b0: 64 20 3d 20 72 62 75 4f 62 6a 49 74 65 72 47 65  d = rbuObjIterGe
f4c0: 74 42 69 6e 64 6c 69 73 74 28 70 2c 20 6e 42 69  tBindlist(p, nBi
f4d0: 6e 64 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43  nd);..      /* C
f4e0: 72 65 61 74 65 20 74 68 65 20 69 6d 70 6f 73 74  reate the impost
f4f0: 65 72 20 74 61 62 6c 65 20 75 73 65 64 20 74 6f  er table used to
f500: 20 77 72 69 74 65 20 74 6f 20 74 68 69 73 20 69   write to this i
f510: 6e 64 65 78 2e 20 2a 2f 0a 20 20 20 20 20 20 73  ndex. */.      s
f520: 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
f530: 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
f540: 54 52 4c 5f 49 4d 50 4f 53 54 45 52 2c 20 70 2d  TRL_IMPOSTER, p-
f550: 3e 64 62 4d 61 69 6e 2c 20 22 6d 61 69 6e 22 2c  >dbMain, "main",
f560: 20 30 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71   0, 1);.      sq
f570: 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
f580: 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
f590: 52 4c 5f 49 4d 50 4f 53 54 45 52 2c 20 70 2d 3e  RL_IMPOSTER, p->
f5a0: 64 62 4d 61 69 6e 2c 20 22 6d 61 69 6e 22 2c 20  dbMain, "main", 
f5b0: 31 2c 74 6e 75 6d 29 3b 0a 20 20 20 20 20 20 72  1,tnum);.      r
f5c0: 62 75 4d 50 72 69 6e 74 66 45 78 65 63 28 70 2c  buMPrintfExec(p,
f5d0: 20 70 2d 3e 64 62 4d 61 69 6e 2c 0a 20 20 20 20   p->dbMain,.    
f5e0: 20 20 20 20 20 20 22 43 52 45 41 54 45 20 54 41        "CREATE TA
f5f0: 42 4c 45 20 5c 22 72 62 75 5f 69 6d 70 5f 25 77  BLE \"rbu_imp_%w
f600: 5c 22 28 20 25 73 2c 20 50 52 49 4d 41 52 59 20  \"( %s, PRIMARY 
f610: 4b 45 59 28 20 25 73 20 29 20 29 20 57 49 54 48  KEY( %s ) ) WITH
f620: 4f 55 54 20 52 4f 57 49 44 22 2c 0a 20 20 20 20  OUT ROWID",.    
f630: 20 20 20 20 20 20 7a 54 62 6c 2c 20 7a 49 6d 70        zTbl, zImp
f640: 6f 73 74 65 72 43 6f 6c 73 2c 20 7a 49 6d 70 6f  osterCols, zImpo
f650: 73 74 65 72 50 4b 0a 20 20 20 20 20 20 29 3b 0a  sterPK.      );.
f660: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74 65        sqlite3_te
f670: 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
f680: 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53  E_TESTCTRL_IMPOS
f690: 54 45 52 2c 20 70 2d 3e 64 62 4d 61 69 6e 2c 20  TER, p->dbMain, 
f6a0: 22 6d 61 69 6e 22 2c 20 30 2c 20 30 29 3b 0a 0a  "main", 0, 0);..
f6b0: 20 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20        /* Create 
f6c0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 6f  the statement to
f6d0: 20 69 6e 73 65 72 74 20 69 6e 64 65 78 20 65 6e   insert index en
f6e0: 74 72 69 65 73 20 2a 2f 0a 20 20 20 20 20 20 70  tries */.      p
f6f0: 49 74 65 72 2d 3e 6e 43 6f 6c 20 3d 20 6e 42 69  Iter->nCol = nBi
f700: 6e 64 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  nd;.      if( p-
f710: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
f720: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20  {.        p->rc 
f730: 3d 20 70 72 65 70 61 72 65 46 72 65 65 41 6e 64  = prepareFreeAnd
f740: 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 0a 20 20  CollectError(.  
f750: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 64 62 4d            p->dbM
f760: 61 69 6e 2c 20 26 70 49 74 65 72 2d 3e 70 49 6e  ain, &pIter->pIn
f770: 73 65 72 74 2c 20 26 70 2d 3e 7a 45 72 72 6d 73  sert, &p->zErrms
f780: 67 2c 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  g,.          sql
f790: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 49 4e  ite3_mprintf("IN
f7a0: 53 45 52 54 20 49 4e 54 4f 20 5c 22 72 62 75 5f  SERT INTO \"rbu_
f7b0: 69 6d 70 5f 25 77 5c 22 20 56 41 4c 55 45 53 28  imp_%w\" VALUES(
f7c0: 25 73 29 22 2c 20 7a 54 62 6c 2c 20 7a 42 69 6e  %s)", zTbl, zBin
f7d0: 64 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  d).        );.  
f7e0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
f7f0: 41 6e 64 20 74 6f 20 64 65 6c 65 74 65 20 69 6e  And to delete in
f800: 64 65 78 20 65 6e 74 72 69 65 73 20 2a 2f 0a 20  dex entries */. 
f810: 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
f820: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
f830: 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 72 65       p->rc = pre
f840: 70 61 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65  pareFreeAndColle
f850: 63 74 45 72 72 6f 72 28 0a 20 20 20 20 20 20 20  ctError(.       
f860: 20 20 20 20 20 70 2d 3e 64 62 4d 61 69 6e 2c 20       p->dbMain, 
f870: 26 70 49 74 65 72 2d 3e 70 44 65 6c 65 74 65 2c  &pIter->pDelete,
f880: 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 0a 20 20   &p->zErrmsg,.  
f890: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
f8a0: 6d 70 72 69 6e 74 66 28 22 44 45 4c 45 54 45 20  mprintf("DELETE 
f8b0: 46 52 4f 4d 20 5c 22 72 62 75 5f 69 6d 70 5f 25  FROM \"rbu_imp_%
f8c0: 77 5c 22 20 57 48 45 52 45 20 25 73 22 2c 20 7a  w\" WHERE %s", z
f8d0: 54 62 6c 2c 20 7a 57 68 65 72 65 29 0a 20 20 20  Tbl, zWhere).   
f8e0: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a       );.      }.
f8f0: 0a 20 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65  .      /* Create
f900: 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
f910: 65 6d 65 6e 74 20 74 6f 20 72 65 61 64 20 6b 65  ement to read ke
f920: 79 73 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64  ys in sorted ord
f930: 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  er */.      if( 
f940: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
f950: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
f960: 20 2a 7a 53 71 6c 3b 0a 20 20 20 20 20 20 20 20   *zSql;.        
f970: 69 66 28 20 70 49 74 65 72 2d 3e 65 54 79 70 65  if( pIter->eType
f980: 3d 3d 52 42 55 5f 50 4b 5f 45 58 54 45 52 4e 41  ==RBU_PK_EXTERNA
f990: 4c 20 7c 7c 20 70 49 74 65 72 2d 3e 65 54 79 70  L || pIter->eTyp
f9a0: 65 3d 3d 52 42 55 5f 50 4b 5f 4e 4f 4e 45 20 29  e==RBU_PK_NONE )
f9b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 53 71 6c  {.          zSql
f9c0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
f9d0: 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  tf(.            
f9e0: 20 20 22 53 45 4c 45 43 54 20 25 73 2c 20 72 62    "SELECT %s, rb
f9f0: 75 5f 63 6f 6e 74 72 6f 6c 20 46 52 4f 4d 20 25  u_control FROM %
fa00: 73 2e 27 72 62 75 5f 74 6d 70 5f 25 71 27 20 4f  s.'rbu_tmp_%q' O
fa10: 52 44 45 52 20 42 59 20 25 73 25 73 22 2c 0a 20  RDER BY %s%s",. 
fa20: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f               zCo
fa30: 6c 6c 69 73 74 2c 20 70 2d 3e 7a 53 74 61 74 65  llist, p->zState
fa40: 44 62 2c 20 70 49 74 65 72 2d 3e 7a 44 61 74 61  Db, pIter->zData
fa50: 54 62 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Tbl,.           
fa60: 20 20 20 7a 43 6f 6c 6c 69 73 74 2c 20 7a 4c 69     zCollist, zLi
fa70: 6d 69 74 0a 20 20 20 20 20 20 20 20 20 20 29 3b  mit.          );
fa80: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
fa90: 20 20 20 20 20 20 20 20 20 20 7a 53 71 6c 20 3d            zSql =
faa0: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
fab0: 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  (.              
fac0: 22 53 45 4c 45 43 54 20 25 73 2c 20 72 62 75 5f  "SELECT %s, rbu_
fad0: 63 6f 6e 74 72 6f 6c 20 46 52 4f 4d 20 27 25 71  control FROM '%q
fae0: 27 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  ' ".            
faf0: 20 20 22 57 48 45 52 45 20 74 79 70 65 6f 66 28    "WHERE typeof(
fb00: 72 62 75 5f 63 6f 6e 74 72 6f 6c 29 3d 27 69 6e  rbu_control)='in
fb10: 74 65 67 65 72 27 20 41 4e 44 20 72 62 75 5f 63  teger' AND rbu_c
fb20: 6f 6e 74 72 6f 6c 21 3d 31 20 22 0a 20 20 20 20  ontrol!=1 ".    
fb30: 20 20 20 20 20 20 20 20 20 20 22 55 4e 49 4f 4e            "UNION
fb40: 20 41 4c 4c 20 22 0a 20 20 20 20 20 20 20 20 20   ALL ".         
fb50: 20 20 20 20 20 22 53 45 4c 45 43 54 20 25 73 2c       "SELECT %s,
fb60: 20 72 62 75 5f 63 6f 6e 74 72 6f 6c 20 46 52 4f   rbu_control FRO
fb70: 4d 20 25 73 2e 27 72 62 75 5f 74 6d 70 5f 25 71  M %s.'rbu_tmp_%q
fb80: 27 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  ' ".            
fb90: 20 20 22 4f 52 44 45 52 20 42 59 20 25 73 25 73    "ORDER BY %s%s
fba0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
fbb0: 20 7a 43 6f 6c 6c 69 73 74 2c 20 70 49 74 65 72   zCollist, pIter
fbc0: 2d 3e 7a 44 61 74 61 54 62 6c 2c 20 0a 20 20 20  ->zDataTbl, .   
fbd0: 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 6c             zColl
fbe0: 69 73 74 2c 20 70 2d 3e 7a 53 74 61 74 65 44 62  ist, p->zStateDb
fbf0: 2c 20 70 49 74 65 72 2d 3e 7a 44 61 74 61 54 62  , pIter->zDataTb
fc00: 6c 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  l, .            
fc10: 20 20 7a 43 6f 6c 6c 69 73 74 2c 20 7a 4c 69 6d    zCollist, zLim
fc20: 69 74 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a  it.          );.
fc30: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
fc40: 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72    p->rc = prepar
fc50: 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45  eFreeAndCollectE
fc60: 72 72 6f 72 28 70 2d 3e 64 62 52 62 75 2c 20 26  rror(p->dbRbu, &
fc70: 70 49 74 65 72 2d 3e 70 53 65 6c 65 63 74 2c 20  pIter->pSelect, 
fc80: 70 7a 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20  pz, zSql);.     
fc90: 20 7d 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65   }..      sqlite
fca0: 33 5f 66 72 65 65 28 7a 49 6d 70 6f 73 74 65 72  3_free(zImposter
fcb0: 43 6f 6c 73 29 3b 0a 20 20 20 20 20 20 73 71 6c  Cols);.      sql
fcc0: 69 74 65 33 5f 66 72 65 65 28 7a 49 6d 70 6f 73  ite3_free(zImpos
fcd0: 74 65 72 50 4b 29 3b 0a 20 20 20 20 20 20 73 71  terPK);.      sq
fce0: 6c 69 74 65 33 5f 66 72 65 65 28 7a 57 68 65 72  lite3_free(zWher
fcf0: 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
fd00: 33 5f 66 72 65 65 28 7a 42 69 6e 64 29 3b 0a 20  3_free(zBind);. 
fd10: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
fd20: 69 6e 74 20 62 52 62 75 52 6f 77 69 64 20 3d 20  int bRbuRowid = 
fd30: 28 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52  (pIter->eType==R
fd40: 42 55 5f 50 4b 5f 56 54 41 42 20 7c 7c 20 70 49  BU_PK_VTAB || pI
fd50: 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f  ter->eType==RBU_
fd60: 50 4b 5f 4e 4f 4e 45 29 3b 0a 20 20 20 20 20 20  PK_NONE);.      
fd70: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 62 6c  const char *zTbl
fd80: 20 3d 20 70 49 74 65 72 2d 3e 7a 54 62 6c 3b 20   = pIter->zTbl; 
fd90: 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74        /* Table t
fda0: 68 69 73 20 73 74 65 70 20 61 70 70 6c 69 65 73  his step applies
fdb0: 20 74 6f 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e   to */.      con
fdc0: 73 74 20 63 68 61 72 20 2a 7a 57 72 69 74 65 3b  st char *zWrite;
fdd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fde0: 20 20 20 2f 2a 20 49 6d 70 6f 73 74 65 72 20 74     /* Imposter t
fdf0: 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 0a 20 20  able name */..  
fe00: 20 20 20 20 63 68 61 72 20 2a 7a 42 69 6e 64 69      char *zBindi
fe10: 6e 67 73 20 3d 20 72 62 75 4f 62 6a 49 74 65 72  ngs = rbuObjIter
fe20: 47 65 74 42 69 6e 64 6c 69 73 74 28 70 2c 20 70  GetBindlist(p, p
fe30: 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 20 2b 20  Iter->nTblCol + 
fe40: 62 52 62 75 52 6f 77 69 64 29 3b 0a 20 20 20 20  bRbuRowid);.    
fe50: 20 20 63 68 61 72 20 2a 7a 57 68 65 72 65 20 3d    char *zWhere =
fe60: 20 72 62 75 4f 62 6a 49 74 65 72 47 65 74 57 68   rbuObjIterGetWh
fe70: 65 72 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  ere(p, pIter);. 
fe80: 20 20 20 20 20 63 68 61 72 20 2a 7a 4f 6c 64 6c       char *zOldl
fe90: 69 73 74 20 3d 20 72 62 75 4f 62 6a 49 74 65 72  ist = rbuObjIter
fea0: 47 65 74 4f 6c 64 6c 69 73 74 28 70 2c 20 70 49  GetOldlist(p, pI
feb0: 74 65 72 2c 20 22 6f 6c 64 22 29 3b 0a 20 20 20  ter, "old");.   
fec0: 20 20 20 63 68 61 72 20 2a 7a 4e 65 77 6c 69 73     char *zNewlis
fed0: 74 20 3d 20 72 62 75 4f 62 6a 49 74 65 72 47 65  t = rbuObjIterGe
fee0: 74 4f 6c 64 6c 69 73 74 28 70 2c 20 70 49 74 65  tOldlist(p, pIte
fef0: 72 2c 20 22 6e 65 77 22 29 3b 0a 0a 20 20 20 20  r, "new");..    
ff00: 20 20 7a 43 6f 6c 6c 69 73 74 20 3d 20 72 62 75    zCollist = rbu
ff10: 4f 62 6a 49 74 65 72 47 65 74 43 6f 6c 6c 69 73  ObjIterGetCollis
ff20: 74 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20  t(p, pIter);.   
ff30: 20 20 20 70 49 74 65 72 2d 3e 6e 43 6f 6c 20 3d     pIter->nCol =
ff40: 20 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 3b   pIter->nTblCol;
ff50: 0a 0a 20 20 20 20 20 20 2f 2a 20 43 72 65 61 74  ..      /* Creat
ff60: 65 20 74 68 65 20 69 6d 70 6f 73 74 65 72 20 74  e the imposter t
ff70: 61 62 6c 65 20 6f 72 20 74 61 62 6c 65 73 20 28  able or tables (
ff80: 69 66 20 72 65 71 75 69 72 65 64 29 2e 20 2a 2f  if required). */
ff90: 0a 20 20 20 20 20 20 72 62 75 43 72 65 61 74 65  .      rbuCreate
ffa0: 49 6d 70 6f 73 74 65 72 54 61 62 6c 65 28 70 2c  ImposterTable(p,
ffb0: 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 72   pIter);.      r
ffc0: 62 75 43 72 65 61 74 65 49 6d 70 6f 73 74 65 72  buCreateImposter
ffd0: 54 61 62 6c 65 32 28 70 2c 20 70 49 74 65 72 29  Table2(p, pIter)
ffe0: 3b 0a 20 20 20 20 20 20 7a 57 72 69 74 65 20 3d  ;.      zWrite =
fff0: 20 28 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d   (pIter->eType==
10000 52 42 55 5f 50 4b 5f 56 54 41 42 20 3f 20 22 22  RBU_PK_VTAB ? ""
10010 20 3a 20 22 72 62 75 5f 69 6d 70 5f 22 29 3b 0a   : "rbu_imp_");.
10020 0a 20 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65  .      /* Create
10030 20 74 68 65 20 49 4e 53 45 52 54 20 73 74 61 74   the INSERT stat
10040 65 6d 65 6e 74 20 74 6f 20 77 72 69 74 65 20 74  ement to write t
10050 6f 20 74 68 65 20 74 61 72 67 65 74 20 50 4b 20  o the target PK 
10060 62 2d 74 72 65 65 20 2a 2f 0a 20 20 20 20 20 20  b-tree */.      
10070 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
10080 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
10090 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65 46  p->rc = prepareF
100a0 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72  reeAndCollectErr
100b0 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 70  or(p->dbMain, &p
100c0 49 74 65 72 2d 3e 70 49 6e 73 65 72 74 2c 20 70  Iter->pInsert, p
100d0 7a 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  z,.            s
100e0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a  qlite3_mprintf(.
100f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 49                "I
10100 4e 53 45 52 54 20 49 4e 54 4f 20 5c 22 25 73 25  NSERT INTO \"%s%
10110 77 5c 22 28 25 73 25 73 29 20 56 41 4c 55 45 53  w\"(%s%s) VALUES
10120 28 25 73 29 22 2c 20 0a 20 20 20 20 20 20 20 20  (%s)", .        
10130 20 20 20 20 20 20 7a 57 72 69 74 65 2c 20 7a 54        zWrite, zT
10140 62 6c 2c 20 7a 43 6f 6c 6c 69 73 74 2c 20 28 62  bl, zCollist, (b
10150 52 62 75 52 6f 77 69 64 20 3f 20 22 2c 20 5f 72  RbuRowid ? ", _r
10160 6f 77 69 64 5f 22 20 3a 20 22 22 29 2c 20 7a 42  owid_" : ""), zB
10170 69 6e 64 69 6e 67 73 0a 20 20 20 20 20 20 20 20  indings.        
10180 20 20 20 20 29 0a 20 20 20 20 20 20 20 20 29 3b      ).        );
10190 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
101a0 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 44 45  /* Create the DE
101b0 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 20 74  LETE statement t
101c0 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 74  o write to the t
101d0 61 72 67 65 74 20 50 4b 20 62 2d 74 72 65 65 20  arget PK b-tree 
101e0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  */.      if( p->
101f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
10200 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  .        p->rc =
10210 20 70 72 65 70 61 72 65 46 72 65 65 41 6e 64 43   prepareFreeAndC
10220 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64  ollectError(p->d
10230 62 4d 61 69 6e 2c 20 26 70 49 74 65 72 2d 3e 70  bMain, &pIter->p
10240 44 65 6c 65 74 65 2c 20 70 7a 2c 0a 20 20 20 20  Delete, pz,.    
10250 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
10260 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20  mprintf(.       
10270 20 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46         "DELETE F
10280 52 4f 4d 20 5c 22 25 73 25 77 5c 22 20 57 48 45  ROM \"%s%w\" WHE
10290 52 45 20 25 73 22 2c 20 7a 57 72 69 74 65 2c 20  RE %s", zWrite, 
102a0 7a 54 62 6c 2c 20 7a 57 68 65 72 65 0a 20 20 20  zTbl, zWhere.   
102b0 20 20 20 20 20 20 20 20 20 29 0a 20 20 20 20 20           ).     
102c0 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20     );.      }.. 
102d0 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e       if( pIter->
102e0 61 62 49 6e 64 65 78 65 64 20 29 7b 0a 20 20 20  abIndexed ){.   
102f0 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
10300 2a 7a 52 62 75 52 6f 77 69 64 20 3d 20 22 22 3b  *zRbuRowid = "";
10310 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74  .        if( pIt
10320 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50  er->eType==RBU_P
10330 4b 5f 45 58 54 45 52 4e 41 4c 20 7c 7c 20 70 49  K_EXTERNAL || pI
10340 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f  ter->eType==RBU_
10350 50 4b 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20  PK_NONE ){.     
10360 20 20 20 20 20 7a 52 62 75 52 6f 77 69 64 20 3d       zRbuRowid =
10370 20 22 2c 20 72 62 75 5f 72 6f 77 69 64 22 3b 0a   ", rbu_rowid";.
10380 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
10390 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65     /* Create the
103a0 20 72 62 75 5f 74 6d 70 5f 78 78 78 20 74 61 62   rbu_tmp_xxx tab
103b0 6c 65 20 61 6e 64 20 74 68 65 20 74 72 69 67 67  le and the trigg
103c0 65 72 73 20 74 6f 20 70 6f 70 75 6c 61 74 65 20  ers to populate 
103d0 69 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  it. */.        r
103e0 62 75 4d 50 72 69 6e 74 66 45 78 65 63 28 70 2c  buMPrintfExec(p,
103f0 20 70 2d 3e 64 62 52 62 75 2c 0a 20 20 20 20 20   p->dbRbu,.     
10400 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20 54         "CREATE T
10410 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53  ABLE IF NOT EXIS
10420 54 53 20 25 73 2e 27 72 62 75 5f 74 6d 70 5f 25  TS %s.'rbu_tmp_%
10430 71 27 20 41 53 20 22 0a 20 20 20 20 20 20 20 20  q' AS ".        
10440 20 20 20 20 22 53 45 4c 45 43 54 20 2a 25 73 20      "SELECT *%s 
10450 46 52 4f 4d 20 27 25 71 27 20 57 48 45 52 45 20  FROM '%q' WHERE 
10460 30 3b 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  0;".            
10470 2c 20 70 2d 3e 7a 53 74 61 74 65 44 62 2c 20 70  , p->zStateDb, p
10480 49 74 65 72 2d 3e 7a 44 61 74 61 54 62 6c 0a 20  Iter->zDataTbl. 
10490 20 20 20 20 20 20 20 20 20 20 20 2c 20 28 70 49             , (pI
104a0 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f  ter->eType==RBU_
104b0 50 4b 5f 45 58 54 45 52 4e 41 4c 20 3f 20 22 2c  PK_EXTERNAL ? ",
104c0 20 30 20 41 53 20 72 62 75 5f 72 6f 77 69 64 22   0 AS rbu_rowid"
104d0 20 3a 20 22 22 29 0a 20 20 20 20 20 20 20 20 20   : "").         
104e0 20 20 20 2c 20 70 49 74 65 72 2d 3e 7a 44 61 74     , pIter->zDat
104f0 61 54 62 6c 0a 20 20 20 20 20 20 20 20 29 3b 0a  aTbl.        );.
10500 0a 20 20 20 20 20 20 20 20 72 62 75 4d 50 72 69  .        rbuMPri
10510 6e 74 66 45 78 65 63 28 70 2c 20 70 2d 3e 64 62  ntfExec(p, p->db
10520 4d 61 69 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  Main,.          
10530 20 20 22 43 52 45 41 54 45 20 54 45 4d 50 20 54    "CREATE TEMP T
10540 52 49 47 47 45 52 20 72 62 75 5f 64 65 6c 65 74  RIGGER rbu_delet
10550 65 5f 74 72 20 42 45 46 4f 52 45 20 44 45 4c 45  e_tr BEFORE DELE
10560 54 45 20 4f 4e 20 5c 22 25 73 25 77 5c 22 20 22  TE ON \"%s%w\" "
10570 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 42 45  .            "BE
10580 47 49 4e 20 22 0a 20 20 20 20 20 20 20 20 20 20  GIN ".          
10590 20 20 22 20 20 53 45 4c 45 43 54 20 72 62 75 5f    "  SELECT rbu_
105a0 74 6d 70 5f 69 6e 73 65 72 74 28 32 2c 20 25 73  tmp_insert(2, %s
105b0 29 3b 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  );".            
105c0 22 45 4e 44 3b 22 0a 0a 20 20 20 20 20 20 20 20  "END;"..        
105d0 20 20 20 20 22 43 52 45 41 54 45 20 54 45 4d 50      "CREATE TEMP
105e0 20 54 52 49 47 47 45 52 20 72 62 75 5f 75 70 64   TRIGGER rbu_upd
105f0 61 74 65 31 5f 74 72 20 42 45 46 4f 52 45 20 55  ate1_tr BEFORE U
10600 50 44 41 54 45 20 4f 4e 20 5c 22 25 73 25 77 5c  PDATE ON \"%s%w\
10610 22 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  " ".            
10620 22 42 45 47 49 4e 20 22 0a 20 20 20 20 20 20 20  "BEGIN ".       
10630 20 20 20 20 20 22 20 20 53 45 4c 45 43 54 20 72       "  SELECT r
10640 62 75 5f 74 6d 70 5f 69 6e 73 65 72 74 28 32 2c  bu_tmp_insert(2,
10650 20 25 73 29 3b 22 0a 20 20 20 20 20 20 20 20 20   %s);".         
10660 20 20 20 22 45 4e 44 3b 22 0a 0a 20 20 20 20 20     "END;"..     
10670 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20 54         "CREATE T
10680 45 4d 50 20 54 52 49 47 47 45 52 20 72 62 75 5f  EMP TRIGGER rbu_
10690 75 70 64 61 74 65 32 5f 74 72 20 41 46 54 45 52  update2_tr AFTER
106a0 20 55 50 44 41 54 45 20 4f 4e 20 5c 22 25 73 25   UPDATE ON \"%s%
106b0 77 5c 22 20 22 0a 20 20 20 20 20 20 20 20 20 20  w\" ".          
106c0 20 20 22 42 45 47 49 4e 20 22 0a 20 20 20 20 20    "BEGIN ".     
106d0 20 20 20 20 20 20 20 22 20 20 53 45 4c 45 43 54         "  SELECT
106e0 20 72 62 75 5f 74 6d 70 5f 69 6e 73 65 72 74 28   rbu_tmp_insert(
106f0 33 2c 20 25 73 29 3b 22 0a 20 20 20 20 20 20 20  3, %s);".       
10700 20 20 20 20 20 22 45 4e 44 3b 22 2c 0a 20 20 20       "END;",.   
10710 20 20 20 20 20 20 20 20 20 7a 57 72 69 74 65 2c           zWrite,
10720 20 7a 54 62 6c 2c 20 7a 4f 6c 64 6c 69 73 74 2c   zTbl, zOldlist,
10730 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 57 72  .            zWr
10740 69 74 65 2c 20 7a 54 62 6c 2c 20 7a 4f 6c 64 6c  ite, zTbl, zOldl
10750 69 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ist,.           
10760 20 7a 57 72 69 74 65 2c 20 7a 54 62 6c 2c 20 7a   zWrite, zTbl, z
10770 4e 65 77 6c 69 73 74 0a 20 20 20 20 20 20 20 20  Newlist.        
10780 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20  );..        if( 
10790 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42  pIter->eType==RB
107a0 55 5f 50 4b 5f 45 58 54 45 52 4e 41 4c 20 7c 7c  U_PK_EXTERNAL ||
107b0 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52   pIter->eType==R
107c0 42 55 5f 50 4b 5f 4e 4f 4e 45 20 29 7b 0a 20 20  BU_PK_NONE ){.  
107d0 20 20 20 20 20 20 20 20 72 62 75 4d 50 72 69 6e          rbuMPrin
107e0 74 66 45 78 65 63 28 70 2c 20 70 2d 3e 64 62 4d  tfExec(p, p->dbM
107f0 61 69 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ain,.           
10800 20 20 20 22 43 52 45 41 54 45 20 54 45 4d 50 20     "CREATE TEMP 
10810 54 52 49 47 47 45 52 20 72 62 75 5f 69 6e 73 65  TRIGGER rbu_inse
10820 72 74 5f 74 72 20 41 46 54 45 52 20 49 4e 53 45  rt_tr AFTER INSE
10830 52 54 20 4f 4e 20 5c 22 25 73 25 77 5c 22 20 22  RT ON \"%s%w\" "
10840 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
10850 42 45 47 49 4e 20 22 0a 20 20 20 20 20 20 20 20  BEGIN ".        
10860 20 20 20 20 20 20 22 20 20 53 45 4c 45 43 54 20        "  SELECT 
10870 72 62 75 5f 74 6d 70 5f 69 6e 73 65 72 74 28 30  rbu_tmp_insert(0
10880 2c 20 25 73 29 3b 22 0a 20 20 20 20 20 20 20 20  , %s);".        
10890 20 20 20 20 20 20 22 45 4e 44 3b 22 2c 0a 20 20        "END;",.  
108a0 20 20 20 20 20 20 20 20 20 20 20 20 7a 57 72 69              zWri
108b0 74 65 2c 20 7a 54 62 6c 2c 20 7a 4e 65 77 6c 69  te, zTbl, zNewli
108c0 73 74 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a  st.          );.
108d0 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
108e0 20 20 20 72 62 75 4f 62 6a 49 74 65 72 50 72 65     rbuObjIterPre
108f0 70 61 72 65 54 6d 70 49 6e 73 65 72 74 28 70 2c  pareTmpInsert(p,
10900 20 70 49 74 65 72 2c 20 7a 43 6f 6c 6c 69 73 74   pIter, zCollist
10910 2c 20 7a 52 62 75 52 6f 77 69 64 29 3b 0a 20 20  , zRbuRowid);.  
10920 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
10930 43 72 65 61 74 65 20 74 68 65 20 53 45 4c 45 43  Create the SELEC
10940 54 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 72  T statement to r
10950 65 61 64 20 6b 65 79 73 20 66 72 6f 6d 20 64 61  ead keys from da
10960 74 61 5f 78 78 78 20 2a 2f 0a 20 20 20 20 20 20  ta_xxx */.      
10970 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
10980 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
10990 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65 46  p->rc = prepareF
109a0 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72  reeAndCollectErr
109b0 6f 72 28 70 2d 3e 64 62 52 62 75 2c 20 26 70 49  or(p->dbRbu, &pI
109c0 74 65 72 2d 3e 70 53 65 6c 65 63 74 2c 20 70 7a  ter->pSelect, pz
109d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ,.            sq
109e0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20  lite3_mprintf(. 
109f0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 53 45               "SE
10a00 4c 45 43 54 20 25 73 2c 20 72 62 75 5f 63 6f 6e  LECT %s, rbu_con
10a10 74 72 6f 6c 25 73 20 46 52 4f 4d 20 27 25 71 27  trol%s FROM '%q'
10a20 25 73 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  %s", .          
10a30 20 20 20 20 7a 43 6f 6c 6c 69 73 74 2c 20 28 62      zCollist, (b
10a40 52 62 75 52 6f 77 69 64 20 3f 20 22 2c 20 72 62  RbuRowid ? ", rb
10a50 75 5f 72 6f 77 69 64 22 20 3a 20 22 22 29 2c 20  u_rowid" : ""), 
10a60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
10a70 49 74 65 72 2d 3e 7a 44 61 74 61 54 62 6c 2c 20  Iter->zDataTbl, 
10a80 7a 4c 69 6d 69 74 0a 20 20 20 20 20 20 20 20 20  zLimit.         
10a90 20 20 20 29 0a 20 20 20 20 20 20 20 20 29 3b 0a     ).        );.
10aa0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 73        }..      s
10ab0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 57 68 65  qlite3_free(zWhe
10ac0 72 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  re);.      sqlit
10ad0 65 33 5f 66 72 65 65 28 7a 4f 6c 64 6c 69 73 74  e3_free(zOldlist
10ae0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10af0 5f 66 72 65 65 28 7a 4e 65 77 6c 69 73 74 29 3b  _free(zNewlist);
10b00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
10b10 72 65 65 28 7a 42 69 6e 64 69 6e 67 73 29 3b 0a  ree(zBindings);.
10b20 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
10b30 33 5f 66 72 65 65 28 7a 43 6f 6c 6c 69 73 74 29  3_free(zCollist)
10b40 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
10b50 65 65 28 7a 4c 69 6d 69 74 29 3b 0a 20 20 7d 0a  ee(zLimit);.  }.
10b60 20 20 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72    .  return p->r
10b70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  c;.}../*.** Set 
10b80 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 20  output variable 
10b90 2a 70 70 53 74 6d 74 20 74 6f 20 70 6f 69 6e 74  *ppStmt to point
10ba0 20 74 6f 20 61 6e 20 55 50 44 41 54 45 20 73 74   to an UPDATE st
10bb0 61 74 65 6d 65 6e 74 20 74 68 61 74 20 6d 61 79  atement that may
10bc0 0a 2a 2a 20 62 65 20 75 73 65 64 20 74 6f 20 75  .** be used to u
10bd0 70 64 61 74 65 20 74 68 65 20 69 6d 70 6f 73 74  pdate the impost
10be0 65 72 20 74 61 62 6c 65 20 66 6f 72 20 74 68 65  er table for the
10bf0 20 6d 61 69 6e 20 74 61 62 6c 65 20 62 2d 74 72   main table b-tr
10c00 65 65 20 6f 66 20 74 68 65 0a 2a 2a 20 74 61 62  ee of the.** tab
10c10 6c 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20 70  le object that p
10c20 49 74 65 72 20 63 75 72 72 65 6e 74 6c 79 20 70  Iter currently p
10c30 6f 69 6e 74 73 20 74 6f 2c 20 61 73 73 75 6d 69  oints to, assumi
10c40 6e 67 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20  ng that the .** 
10c50 72 62 75 5f 63 6f 6e 74 72 6f 6c 20 63 6f 6c 75  rbu_control colu
10c60 6d 6e 20 6f 66 20 74 68 65 20 64 61 74 61 5f 78  mn of the data_x
10c70 79 7a 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e  yz table contain
10c80 73 20 7a 4d 61 73 6b 2e 0a 2a 2a 20 0a 2a 2a 20  s zMask..** .** 
10c90 49 66 20 74 68 65 20 7a 4d 61 73 6b 20 73 74 72  If the zMask str
10ca0 69 6e 67 20 64 6f 65 73 20 6e 6f 74 20 73 70 65  ing does not spe
10cb0 63 69 66 79 20 61 6e 79 20 63 6f 6c 75 6d 6e 73  cify any columns
10cc0 20 74 6f 20 75 70 64 61 74 65 2c 20 74 68 65 6e   to update, then
10cd0 20 74 68 69 73 0a 2a 2a 20 69 73 20 6e 6f 74 20   this.** is not 
10ce0 61 6e 20 65 72 72 6f 72 2e 20 4f 75 74 70 75 74  an error. Output
10cf0 20 76 61 72 69 61 62 6c 65 20 2a 70 70 53 74 6d   variable *ppStm
10d00 74 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  t is set to NULL
10d10 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
10d20 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62 75  /.static int rbu
10d30 47 65 74 55 70 64 61 74 65 53 74 6d 74 28 0a 20  GetUpdateStmt(. 
10d40 20 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20   sqlite3rbu *p, 
10d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d60 20 2f 2a 20 52 42 55 20 68 61 6e 64 6c 65 20 2a   /* RBU handle *
10d70 2f 0a 20 20 52 62 75 4f 62 6a 49 74 65 72 20 2a  /.  RbuObjIter *
10d80 70 49 74 65 72 2c 20 20 20 20 20 20 20 20 20 20  pIter,          
10d90 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 69 74      /* Object it
10da0 65 72 61 74 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73  erator */.  cons
10db0 74 20 63 68 61 72 20 2a 7a 4d 61 73 6b 2c 20 20  t char *zMask,  
10dc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72              /* r
10dd0 62 75 5f 63 6f 6e 74 72 6f 6c 20 76 61 6c 75 65  bu_control value
10de0 20 28 27 78 2e 78 2e 27 29 20 2a 2f 0a 20 20 73   ('x.x.') */.  s
10df0 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70  qlite3_stmt **pp
10e00 53 74 6d 74 20 20 20 20 20 20 20 20 20 20 20 2f  Stmt           /
10e10 2a 20 4f 55 54 3a 20 55 50 44 41 54 45 20 73 74  * OUT: UPDATE st
10e20 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65 20 2a  atement handle *
10e30 2f 0a 29 7b 0a 20 20 52 62 75 55 70 64 61 74 65  /.){.  RbuUpdate
10e40 53 74 6d 74 20 2a 2a 70 70 3b 0a 20 20 52 62 75  Stmt **pp;.  Rbu
10e50 55 70 64 61 74 65 53 74 6d 74 20 2a 70 55 70 20  UpdateStmt *pUp 
10e60 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 55 70 20 3d  = 0;.  int nUp =
10e70 20 30 3b 0a 0a 20 20 2f 2a 20 49 6e 20 63 61 73   0;..  /* In cas
10e80 65 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  e an error occur
10e90 73 20 2a 2f 0a 20 20 2a 70 70 53 74 6d 74 20 3d  s */.  *ppStmt =
10ea0 20 30 3b 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68   0;..  /* Search
10eb0 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67   for an existing
10ec0 20 73 74 61 74 65 6d 65 6e 74 2e 20 49 66 20 6f   statement. If o
10ed0 6e 65 20 69 73 20 66 6f 75 6e 64 2c 20 73 68 69  ne is found, shi
10ee0 66 74 20 69 74 20 74 6f 20 74 68 65 20 66 72 6f  ft it to the fro
10ef0 6e 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 4c  nt.  ** of the L
10f00 52 55 20 71 75 65 75 65 20 61 6e 64 20 72 65 74  RU queue and ret
10f10 75 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e  urn immediately.
10f20 20 4f 74 68 65 72 77 69 73 65 2c 20 6c 65 61 76   Otherwise, leav
10f30 65 20 6e 55 70 20 70 6f 69 6e 74 69 6e 67 0a 20  e nUp pointing. 
10f40 20 2a 2a 20 74 6f 20 74 68 65 20 6e 75 6d 62 65   ** to the numbe
10f50 72 20 6f 66 20 73 74 61 74 65 6d 65 6e 74 73 20  r of statements 
10f60 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65  currently in the
10f70 20 63 61 63 68 65 20 61 6e 64 20 70 55 70 20 74   cache and pUp t
10f80 6f 20 74 68 65 0a 20 20 2a 2a 20 6c 61 73 74 20  o the.  ** last 
10f90 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 20 6c 69  object in the li
10fa0 73 74 2e 20 20 2a 2f 0a 20 20 66 6f 72 28 70 70  st.  */.  for(pp
10fb0 3d 26 70 49 74 65 72 2d 3e 70 52 62 75 55 70 64  =&pIter->pRbuUpd
10fc0 61 74 65 3b 20 2a 70 70 3b 20 70 70 3d 26 28 28  ate; *pp; pp=&((
10fd0 2a 70 70 29 2d 3e 70 4e 65 78 74 29 29 7b 0a 20  *pp)->pNext)){. 
10fe0 20 20 20 70 55 70 20 3d 20 2a 70 70 3b 0a 20 20     pUp = *pp;.  
10ff0 20 20 69 66 28 20 73 74 72 63 6d 70 28 70 55 70    if( strcmp(pUp
11000 2d 3e 7a 4d 61 73 6b 2c 20 7a 4d 61 73 6b 29 3d  ->zMask, zMask)=
11010 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 20  =0 ){.      *pp 
11020 3d 20 70 55 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  = pUp->pNext;.  
11030 20 20 20 20 70 55 70 2d 3e 70 4e 65 78 74 20 3d      pUp->pNext =
11040 20 70 49 74 65 72 2d 3e 70 52 62 75 55 70 64 61   pIter->pRbuUpda
11050 74 65 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d  te;.      pIter-
11060 3e 70 52 62 75 55 70 64 61 74 65 20 3d 20 70 55  >pRbuUpdate = pU
11070 70 3b 0a 20 20 20 20 20 20 2a 70 70 53 74 6d 74  p;.      *ppStmt
11080 20 3d 20 70 55 70 2d 3e 70 55 70 64 61 74 65 3b   = pUp->pUpdate;
11090 20 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53   .      return S
110a0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
110b0 20 20 20 20 6e 55 70 2b 2b 3b 0a 20 20 7d 0a 20      nUp++;.  }. 
110c0 20 61 73 73 65 72 74 28 20 70 55 70 3d 3d 30 20   assert( pUp==0 
110d0 7c 7c 20 70 55 70 2d 3e 70 4e 65 78 74 3d 3d 30  || pUp->pNext==0
110e0 20 29 3b 0a 0a 20 20 69 66 28 20 6e 55 70 3e 3d   );..  if( nUp>=
110f0 53 51 4c 49 54 45 5f 52 42 55 5f 55 50 44 41 54  SQLITE_RBU_UPDAT
11100 45 5f 43 41 43 48 45 53 49 5a 45 20 29 7b 0a 20  E_CACHESIZE ){. 
11110 20 20 20 66 6f 72 28 70 70 3d 26 70 49 74 65 72     for(pp=&pIter
11120 2d 3e 70 52 62 75 55 70 64 61 74 65 3b 20 2a 70  ->pRbuUpdate; *p
11130 70 21 3d 70 55 70 3b 20 70 70 3d 26 28 28 2a 70  p!=pUp; pp=&((*p
11140 70 29 2d 3e 70 4e 65 78 74 29 29 3b 0a 20 20 20  p)->pNext));.   
11150 20 2a 70 70 20 3d 20 30 3b 0a 20 20 20 20 73 71   *pp = 0;.    sq
11160 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
11170 55 70 2d 3e 70 55 70 64 61 74 65 29 3b 0a 20 20  Up->pUpdate);.  
11180 20 20 70 55 70 2d 3e 70 55 70 64 61 74 65 20 3d    pUp->pUpdate =
11190 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
111a0 20 70 55 70 20 3d 20 28 52 62 75 55 70 64 61 74   pUp = (RbuUpdat
111b0 65 53 74 6d 74 2a 29 72 62 75 4d 61 6c 6c 6f 63  eStmt*)rbuMalloc
111c0 28 70 2c 20 73 69 7a 65 6f 66 28 52 62 75 55 70  (p, sizeof(RbuUp
111d0 64 61 74 65 53 74 6d 74 29 2b 70 49 74 65 72 2d  dateStmt)+pIter-
111e0 3e 6e 54 62 6c 43 6f 6c 2b 31 29 3b 0a 20 20 7d  >nTblCol+1);.  }
111f0 0a 0a 20 20 69 66 28 20 70 55 70 20 29 7b 0a 20  ..  if( pUp ){. 
11200 20 20 20 63 68 61 72 20 2a 7a 57 68 65 72 65 20     char *zWhere 
11210 3d 20 72 62 75 4f 62 6a 49 74 65 72 47 65 74 57  = rbuObjIterGetW
11220 68 65 72 65 28 70 2c 20 70 49 74 65 72 29 3b 0a  here(p, pIter);.
11230 20 20 20 20 63 68 61 72 20 2a 7a 53 65 74 20 3d      char *zSet =
11240 20 72 62 75 4f 62 6a 49 74 65 72 47 65 74 53 65   rbuObjIterGetSe
11250 74 6c 69 73 74 28 70 2c 20 70 49 74 65 72 2c 20  tlist(p, pIter, 
11260 7a 4d 61 73 6b 29 3b 0a 20 20 20 20 63 68 61 72  zMask);.    char
11270 20 2a 7a 55 70 64 61 74 65 20 3d 20 30 3b 0a 0a   *zUpdate = 0;..
11280 20 20 20 20 70 55 70 2d 3e 7a 4d 61 73 6b 20 3d      pUp->zMask =
11290 20 28 63 68 61 72 2a 29 26 70 55 70 5b 31 5d 3b   (char*)&pUp[1];
112a0 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 55 70 2d  .    memcpy(pUp-
112b0 3e 7a 4d 61 73 6b 2c 20 7a 4d 61 73 6b 2c 20 70  >zMask, zMask, p
112c0 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 29 3b 0a  Iter->nTblCol);.
112d0 20 20 20 20 70 55 70 2d 3e 70 4e 65 78 74 20 3d      pUp->pNext =
112e0 20 70 49 74 65 72 2d 3e 70 52 62 75 55 70 64 61   pIter->pRbuUpda
112f0 74 65 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70  te;.    pIter->p
11300 52 62 75 55 70 64 61 74 65 20 3d 20 70 55 70 3b  RbuUpdate = pUp;
11310 0a 0a 20 20 20 20 69 66 28 20 7a 53 65 74 20 29  ..    if( zSet )
11320 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
11330 61 72 20 2a 7a 50 72 65 66 69 78 20 3d 20 22 22  ar *zPrefix = ""
11340 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  ;..      if( pIt
11350 65 72 2d 3e 65 54 79 70 65 21 3d 52 42 55 5f 50  er->eType!=RBU_P
11360 4b 5f 56 54 41 42 20 29 20 7a 50 72 65 66 69 78  K_VTAB ) zPrefix
11370 20 3d 20 22 72 62 75 5f 69 6d 70 5f 22 3b 0a 20   = "rbu_imp_";. 
11380 20 20 20 20 20 7a 55 70 64 61 74 65 20 3d 20 73       zUpdate = s
11390 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
113a0 55 50 44 41 54 45 20 5c 22 25 73 25 77 5c 22 20  UPDATE \"%s%w\" 
113b0 53 45 54 20 25 73 20 57 48 45 52 45 20 25 73 22  SET %s WHERE %s"
113c0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 7a 50 72  , .          zPr
113d0 65 66 69 78 2c 20 70 49 74 65 72 2d 3e 7a 54 62  efix, pIter->zTb
113e0 6c 2c 20 7a 53 65 74 2c 20 7a 57 68 65 72 65 0a  l, zSet, zWhere.
113f0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 70        );.      p
11400 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65 46 72  ->rc = prepareFr
11410 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f  eeAndCollectErro
11420 72 28 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  r(.          p->
11430 64 62 4d 61 69 6e 2c 20 26 70 55 70 2d 3e 70 55  dbMain, &pUp->pU
11440 70 64 61 74 65 2c 20 26 70 2d 3e 7a 45 72 72 6d  pdate, &p->zErrm
11450 73 67 2c 20 7a 55 70 64 61 74 65 0a 20 20 20 20  sg, zUpdate.    
11460 20 20 29 3b 0a 20 20 20 20 20 20 2a 70 70 53 74    );.      *ppSt
11470 6d 74 20 3d 20 70 55 70 2d 3e 70 55 70 64 61 74  mt = pUp->pUpdat
11480 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  e;.    }.    sql
11490 69 74 65 33 5f 66 72 65 65 28 7a 57 68 65 72 65  ite3_free(zWhere
114a0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
114b0 72 65 65 28 7a 53 65 74 29 3b 0a 20 20 7d 0a 0a  ree(zSet);.  }..
114c0 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 3b 0a    return p->rc;.
114d0 7d 0a 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65  }..static sqlite
114e0 33 20 2a 72 62 75 4f 70 65 6e 44 62 68 61 6e 64  3 *rbuOpenDbhand
114f0 6c 65 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70  le(sqlite3rbu *p
11500 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
11510 61 6d 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  ame){.  sqlite3 
11520 2a 64 62 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  *db = 0;.  if( p
11530 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
11540 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  ){.    const int
11550 20 66 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f   flags = SQLITE_
11560 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53  OPEN_READWRITE|S
11570 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
11580 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52  E|SQLITE_OPEN_UR
11590 49 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73  I;.    p->rc = s
115a0 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 7a  qlite3_open_v2(z
115b0 4e 61 6d 65 2c 20 26 64 62 2c 20 66 6c 61 67 73  Name, &db, flags
115c0 2c 20 70 2d 3e 7a 56 66 73 4e 61 6d 65 29 3b 0a  , p->zVfsName);.
115d0 20 20 20 20 69 66 28 20 70 2d 3e 72 63 20 29 7b      if( p->rc ){
115e0 0a 20 20 20 20 20 20 70 2d 3e 7a 45 72 72 6d 73  .      p->zErrms
115f0 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  g = sqlite3_mpri
11600 6e 74 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65  ntf("%s", sqlite
11610 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20  3_errmsg(db));. 
11620 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f       sqlite3_clo
11630 73 65 28 64 62 29 3b 0a 20 20 20 20 20 20 64 62  se(db);.      db
11640 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
11650 20 20 72 65 74 75 72 6e 20 64 62 3b 0a 7d 0a 0a    return db;.}..
11660 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 64  /*.** Open the d
11670 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 61  atabase handle a
11680 6e 64 20 61 74 74 61 63 68 20 74 68 65 20 52 42  nd attach the RB
11690 55 20 64 61 74 61 62 61 73 65 20 61 73 20 22 72  U database as "r
116a0 62 75 22 2e 20 49 66 20 61 6e 0a 2a 2a 20 65 72  bu". If an.** er
116b0 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65 61 76  ror occurs, leav
116c0 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  e an error code 
116d0 61 6e 64 20 6d 65 73 73 61 67 65 20 69 6e 20 74  and message in t
116e0 68 65 20 52 42 55 20 68 61 6e 64 6c 65 2e 0a 2a  he RBU handle..*
116f0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62  /.static void rb
11700 75 4f 70 65 6e 44 61 74 61 62 61 73 65 28 73 71  uOpenDatabase(sq
11710 6c 69 74 65 33 72 62 75 20 2a 70 29 7b 0a 20 20  lite3rbu *p){.  
11720 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53  assert( p->rc==S
11730 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 61 73  QLITE_OK );.  as
11740 73 65 72 74 28 20 70 2d 3e 64 62 4d 61 69 6e 3d  sert( p->dbMain=
11750 3d 30 20 26 26 20 70 2d 3e 64 62 52 62 75 3d 3d  =0 && p->dbRbu==
11760 30 20 29 3b 0a 0a 20 20 70 2d 3e 65 53 74 61 67  0 );..  p->eStag
11770 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 64 62 4d 61  e = 0;.  p->dbMa
11780 69 6e 20 3d 20 72 62 75 4f 70 65 6e 44 62 68 61  in = rbuOpenDbha
11790 6e 64 6c 65 28 70 2c 20 70 2d 3e 7a 54 61 72 67  ndle(p, p->zTarg
117a0 65 74 29 3b 0a 20 20 70 2d 3e 64 62 52 62 75 20  et);.  p->dbRbu 
117b0 3d 20 72 62 75 4f 70 65 6e 44 62 68 61 6e 64 6c  = rbuOpenDbhandl
117c0 65 28 70 2c 20 70 2d 3e 7a 52 62 75 29 3b 0a 0a  e(p, p->zRbu);..
117d0 20 20 2f 2a 20 49 66 20 75 73 69 6e 67 20 73 65    /* If using se
117e0 70 61 72 61 74 65 20 52 42 55 20 61 6e 64 20 73  parate RBU and s
117f0 74 61 74 65 20 64 61 74 61 62 61 73 65 73 2c 20  tate databases, 
11800 61 74 74 61 63 68 20 74 68 65 20 73 74 61 74 65  attach the state
11810 20 64 61 74 61 62 61 73 65 20 74 6f 0a 20 20 2a   database to.  *
11820 2a 20 74 68 65 20 52 42 55 20 64 62 20 68 61 6e  * the RBU db han
11830 64 6c 65 20 6e 6f 77 2e 20 20 2a 2f 0a 20 20 69  dle now.  */.  i
11840 66 28 20 70 2d 3e 7a 53 74 61 74 65 20 29 7b 0a  f( p->zState ){.
11850 20 20 20 20 72 62 75 4d 50 72 69 6e 74 66 45 78      rbuMPrintfEx
11860 65 63 28 70 2c 20 70 2d 3e 64 62 52 62 75 2c 20  ec(p, p->dbRbu, 
11870 22 41 54 54 41 43 48 20 25 51 20 41 53 20 73 74  "ATTACH %Q AS st
11880 61 74 22 2c 20 70 2d 3e 7a 53 74 61 74 65 29 3b  at", p->zState);
11890 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e 7a  .    memcpy(p->z
118a0 53 74 61 74 65 44 62 2c 20 22 73 74 61 74 22 2c  StateDb, "stat",
118b0 20 34 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   4);.  }else{.  
118c0 20 20 6d 65 6d 63 70 79 28 70 2d 3e 7a 53 74 61    memcpy(p->zSta
118d0 74 65 44 62 2c 20 22 6d 61 69 6e 22 2c 20 34 29  teDb, "main", 4)
118e0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e  ;.  }..  if( p->
118f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
11900 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c  .    p->rc = sql
11910 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
11920 74 69 6f 6e 28 70 2d 3e 64 62 4d 61 69 6e 2c 20  tion(p->dbMain, 
11930 0a 20 20 20 20 20 20 20 20 22 72 62 75 5f 74 6d  .        "rbu_tm
11940 70 5f 69 6e 73 65 72 74 22 2c 20 2d 31 2c 20 53  p_insert", -1, S
11950 51 4c 49 54 45 5f 55 54 46 38 2c 20 28 76 6f 69  QLITE_UTF8, (voi
11960 64 2a 29 70 2c 20 72 62 75 54 6d 70 49 6e 73 65  d*)p, rbuTmpInse
11970 72 74 46 75 6e 63 2c 20 30 2c 20 30 0a 20 20 20  rtFunc, 0, 0.   
11980 20 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70   );.  }..  if( p
11990 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
119a0 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73  ){.    p->rc = s
119b0 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
119c0 6e 63 74 69 6f 6e 28 70 2d 3e 64 62 4d 61 69 6e  nction(p->dbMain
119d0 2c 20 0a 20 20 20 20 20 20 20 20 22 72 62 75 5f  , .        "rbu_
119e0 66 6f 73 73 69 6c 5f 64 65 6c 74 61 22 2c 20 32  fossil_delta", 2
119f0 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
11a00 2c 20 72 62 75 46 6f 73 73 69 6c 44 65 6c 74 61  , rbuFossilDelta
11a10 46 75 6e 63 2c 20 30 2c 20 30 0a 20 20 20 20 29  Func, 0, 0.    )
11a20 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e  ;.  }..  if( p->
11a30 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
11a40 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c  .    p->rc = sql
11a50 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
11a60 74 69 6f 6e 28 70 2d 3e 64 62 52 62 75 2c 20 0a  tion(p->dbRbu, .
11a70 20 20 20 20 20 20 20 20 22 72 62 75 5f 74 61 72          "rbu_tar
11a80 67 65 74 5f 6e 61 6d 65 22 2c 20 31 2c 20 53 51  get_name", 1, SQ
11a90 4c 49 54 45 5f 55 54 46 38 2c 20 28 76 6f 69 64  LITE_UTF8, (void
11aa0 2a 29 70 2c 20 72 62 75 54 61 72 67 65 74 4e 61  *)p, rbuTargetNa
11ab0 6d 65 46 75 6e 63 2c 20 30 2c 20 30 0a 20 20 20  meFunc, 0, 0.   
11ac0 20 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70   );.  }..  if( p
11ad0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
11ae0 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73  ){.    p->rc = s
11af0 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
11b00 72 6f 6c 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 22  rol(p->dbMain, "
11b10 6d 61 69 6e 22 2c 20 53 51 4c 49 54 45 5f 46 43  main", SQLITE_FC
11b20 4e 54 4c 5f 52 42 55 2c 20 28 76 6f 69 64 2a 29  NTL_RBU, (void*)
11b30 70 29 3b 0a 20 20 7d 0a 20 20 72 62 75 4d 50 72  p);.  }.  rbuMPr
11b40 69 6e 74 66 45 78 65 63 28 70 2c 20 70 2d 3e 64  intfExec(p, p->d
11b50 62 4d 61 69 6e 2c 20 22 53 45 4c 45 43 54 20 2a  bMain, "SELECT *
11b60 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73   FROM sqlite_mas
11b70 74 65 72 22 29 3b 0a 0a 20 20 2f 2a 20 4d 61 72  ter");..  /* Mar
11b80 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  k the database f
11b90 69 6c 65 20 6a 75 73 74 20 6f 70 65 6e 65 64 20  ile just opened 
11ba0 61 73 20 61 6e 20 52 42 55 20 74 61 72 67 65 74  as an RBU target
11bb0 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 0a 20   database. If . 
11bc0 20 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 72 65   ** this call re
11bd0 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4e 4f 54  turns SQLITE_NOT
11be0 46 4f 55 4e 44 2c 20 74 68 65 6e 20 74 68 65 20  FOUND, then the 
11bf0 52 42 55 20 76 66 73 20 69 73 20 6e 6f 74 20 69  RBU vfs is not i
11c00 6e 20 75 73 65 2e 0a 20 20 2a 2a 20 54 68 69 73  n use..  ** This
11c10 20 69 73 20 61 6e 20 65 72 72 6f 72 2e 20 20 2a   is an error.  *
11c20 2f 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  /.  if( p->rc==S
11c30 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
11c40 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  p->rc = sqlite3_
11c50 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 70 2d 3e  file_control(p->
11c60 64 62 4d 61 69 6e 2c 20 22 6d 61 69 6e 22 2c 20  dbMain, "main", 
11c70 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 52 42 55  SQLITE_FCNTL_RBU
11c80 2c 20 28 76 6f 69 64 2a 29 70 29 3b 0a 20 20 7d  , (void*)p);.  }
11c90 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ..  if( p->rc==S
11ca0 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29  QLITE_NOTFOUND )
11cb0 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51  {.    p->rc = SQ
11cc0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
11cd0 70 2d 3e 7a 45 72 72 6d 73 67 20 3d 20 73 71 6c  p->zErrmsg = sql
11ce0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 72 62  ite3_mprintf("rb
11cf0 75 20 76 66 73 20 6e 6f 74 20 66 6f 75 6e 64 22  u vfs not found"
11d00 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
11d10 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
11d20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 71  a copy of the sq
11d30 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33  lite3FileSuffix3
11d40 28 29 20 72 6f 75 74 69 6e 65 20 66 72 6f 6d 20  () routine from 
11d50 74 68 65 20 63 6f 72 65 2e 0a 2a 2a 20 49 74 20  the core..** It 
11d60 69 73 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73  is a no-op unles
11d70 73 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  s SQLITE_ENABLE_
11d80 38 5f 33 5f 4e 41 4d 45 53 20 69 73 20 64 65 66  8_3_NAMES is def
11d90 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53  ined..**.** If S
11da0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 38 5f 33  QLITE_ENABLE_8_3
11db0 5f 4e 41 4d 45 53 20 69 73 20 73 65 74 20 61 74  _NAMES is set at
11dc0 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 61 6e   compile-time an
11dd0 64 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  d if the databas
11de0 65 0a 2a 2a 20 66 69 6c 65 6e 61 6d 65 20 69 6e  e.** filename in
11df0 20 7a 42 61 73 65 46 69 6c 65 6e 61 6d 65 20 69   zBaseFilename i
11e00 73 20 61 20 55 52 49 20 77 69 74 68 20 74 68 65  s a URI with the
11e10 20 22 38 5f 33 5f 6e 61 6d 65 73 3d 31 22 20 70   "8_3_names=1" p
11e20 61 72 61 6d 65 74 65 72 20 61 6e 64 0a 2a 2a 20  arameter and.** 
11e30 69 66 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 7a  if filename in z
11e40 5b 5d 20 68 61 73 20 61 20 73 75 66 66 69 78 20  [] has a suffix 
11e50 28 61 2e 6b 2e 61 2e 20 22 65 78 74 65 6e 73 69  (a.k.a. "extensi
11e60 6f 6e 22 29 20 74 68 61 74 20 69 73 20 6c 6f 6e  on") that is lon
11e70 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 72 65  ger than.** thre
11e80 65 20 63 68 61 72 61 63 74 65 72 73 2c 20 74 68  e characters, th
11e90 65 6e 20 73 68 6f 72 74 65 6e 20 74 68 65 20 73  en shorten the s
11ea0 75 66 66 69 78 20 6f 6e 20 7a 5b 5d 20 74 6f 20  uffix on z[] to 
11eb0 62 65 20 74 68 65 20 6c 61 73 74 20 74 68 72 65  be the last thre
11ec0 65 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 73 20  e.** characters 
11ed0 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  of the original 
11ee0 73 75 66 66 69 78 2e 0a 2a 2a 0a 2a 2a 20 49 66  suffix..**.** If
11ef0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 38   SQLITE_ENABLE_8
11f00 5f 33 5f 4e 41 4d 45 53 20 69 73 20 73 65 74 20  _3_NAMES is set 
11f10 74 6f 20 32 20 61 74 20 63 6f 6d 70 69 6c 65 2d  to 2 at compile-
11f20 74 69 6d 65 2c 20 74 68 65 6e 20 61 6c 77 61 79  time, then alway
11f30 73 0a 2a 2a 20 64 6f 20 74 68 65 20 73 75 66 66  s.** do the suff
11f40 69 78 20 73 68 6f 72 74 65 6e 69 6e 67 20 72 65  ix shortening re
11f50 67 61 72 64 6c 65 73 73 20 6f 66 20 55 52 49 20  gardless of URI 
11f60 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a  parameter..**.**
11f70 20 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a   Examples:.**.**
11f80 20 20 20 20 20 74 65 73 74 2e 64 62 2d 6a 6f 75       test.db-jou
11f90 72 6e 61 6c 20 20 20 20 3d 3e 20 20 20 74 65 73  rnal    =>   tes
11fa0 74 2e 6e 61 6c 0a 2a 2a 20 20 20 20 20 74 65 73  t.nal.**     tes
11fb0 74 2e 64 62 2d 77 61 6c 20 20 20 20 20 20 20 20  t.db-wal        
11fc0 3d 3e 20 20 20 74 65 73 74 2e 77 61 6c 0a 2a 2a  =>   test.wal.**
11fd0 20 20 20 20 20 74 65 73 74 2e 64 62 2d 73 68 6d       test.db-shm
11fe0 20 20 20 20 20 20 20 20 3d 3e 20 20 20 74 65 73          =>   tes
11ff0 74 2e 73 68 6d 0a 2a 2a 20 20 20 20 20 74 65 73  t.shm.**     tes
12000 74 2e 64 62 2d 6d 6a 37 66 33 33 31 39 66 61 20  t.db-mj7f3319fa 
12010 3d 3e 20 20 20 74 65 73 74 2e 39 66 61 0a 2a 2f  =>   test.9fa.*/
12020 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75  .static void rbu
12030 46 69 6c 65 53 75 66 66 69 78 33 28 63 6f 6e 73  FileSuffix3(cons
12040 74 20 63 68 61 72 20 2a 7a 42 61 73 65 2c 20 63  t char *zBase, c
12050 68 61 72 20 2a 7a 29 7b 0a 23 69 66 64 65 66 20  har *z){.#ifdef 
12060 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 38 5f  SQLITE_ENABLE_8_
12070 33 5f 4e 41 4d 45 53 0a 23 69 66 20 53 51 4c 49  3_NAMES.#if SQLI
12080 54 45 5f 45 4e 41 42 4c 45 5f 38 5f 33 5f 4e 41  TE_ENABLE_8_3_NA
12090 4d 45 53 3c 32 0a 20 20 69 66 28 20 73 71 6c 69  MES<2.  if( sqli
120a0 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28  te3_uri_boolean(
120b0 7a 42 61 73 65 2c 20 22 38 5f 33 5f 6e 61 6d 65  zBase, "8_3_name
120c0 73 22 2c 20 30 29 20 29 0a 23 65 6e 64 69 66 0a  s", 0) ).#endif.
120d0 20 20 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 73    {.    int i, s
120e0 7a 3b 0a 20 20 20 20 73 7a 20 3d 20 73 71 6c 69  z;.    sz = sqli
120f0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 3b 0a  te3Strlen30(z);.
12100 20 20 20 20 66 6f 72 28 69 3d 73 7a 2d 31 3b 20      for(i=sz-1; 
12110 69 3e 30 20 26 26 20 7a 5b 69 5d 21 3d 27 2f 27  i>0 && z[i]!='/'
12120 20 26 26 20 7a 5b 69 5d 21 3d 27 2e 27 3b 20 69   && z[i]!='.'; i
12130 2d 2d 29 7b 7d 0a 20 20 20 20 69 66 28 20 7a 5b  --){}.    if( z[
12140 69 5d 3d 3d 27 2e 27 20 26 26 20 41 4c 57 41 59  i]=='.' && ALWAY
12150 53 28 73 7a 3e 69 2b 34 29 20 29 20 6d 65 6d 6d  S(sz>i+4) ) memm
12160 6f 76 65 28 26 7a 5b 69 2b 31 5d 2c 20 26 7a 5b  ove(&z[i+1], &z[
12170 73 7a 2d 33 5d 2c 20 34 29 3b 0a 20 20 7d 0a 23  sz-3], 4);.  }.#
12180 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  endif.}../*.** R
12190 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e  eturn the curren
121a0 74 20 77 61 6c 2d 69 6e 64 65 78 20 68 65 61 64  t wal-index head
121b0 65 72 20 63 68 65 63 6b 73 75 6d 20 66 6f 72 20  er checksum for 
121c0 74 68 65 20 74 61 72 67 65 74 20 64 61 74 61 62  the target datab
121d0 61 73 65 20 0a 2a 2a 20 61 73 20 61 20 36 34 2d  ase .** as a 64-
121e0 62 69 74 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a  bit integer..**.
121f0 2a 2a 20 54 68 65 20 63 68 65 63 6b 73 75 6d 20  ** The checksum 
12200 69 73 20 73 74 6f 72 65 20 69 6e 20 74 68 65 20  is store in the 
12210 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 78 53  first page of xS
12220 68 6d 4d 61 70 20 6d 65 6d 6f 72 79 20 61 73 20  hmMap memory as 
12230 61 6e 20 38 2d 62 79 74 65 20 0a 2a 2a 20 62 6c  an 8-byte .** bl
12240 6f 62 20 73 74 61 72 74 69 6e 67 20 61 74 20 62  ob starting at b
12250 79 74 65 20 6f 66 66 73 65 74 20 34 30 2e 0a 2a  yte offset 40..*
12260 2f 0a 73 74 61 74 69 63 20 69 36 34 20 72 62 75  /.static i64 rbu
12270 53 68 6d 43 68 65 63 6b 73 75 6d 28 73 71 6c 69  ShmChecksum(sqli
12280 74 65 33 72 62 75 20 2a 70 29 7b 0a 20 20 69 36  te3rbu *p){.  i6
12290 34 20 69 52 65 74 20 3d 20 30 3b 0a 20 20 69 66  4 iRet = 0;.  if
122a0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
122b0 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
122c0 33 5f 66 69 6c 65 20 2a 70 44 62 20 3d 20 70 2d  3_file *pDb = p-
122d0 3e 70 54 61 72 67 65 74 46 64 2d 3e 70 52 65 61  >pTargetFd->pRea
122e0 6c 3b 0a 20 20 20 20 75 33 32 20 76 6f 6c 61 74  l;.    u32 volat
122f0 69 6c 65 20 2a 70 74 72 3b 0a 20 20 20 20 70 2d  ile *ptr;.    p-
12300 3e 72 63 20 3d 20 70 44 62 2d 3e 70 4d 65 74 68  >rc = pDb->pMeth
12310 6f 64 73 2d 3e 78 53 68 6d 4d 61 70 28 70 44 62  ods->xShmMap(pDb
12320 2c 20 30 2c 20 33 32 2a 31 30 32 34 2c 20 30 2c  , 0, 32*1024, 0,
12330 20 28 76 6f 69 64 20 76 6f 6c 61 74 69 6c 65 2a   (void volatile*
12340 2a 29 26 70 74 72 29 3b 0a 20 20 20 20 69 66 28  *)&ptr);.    if(
12350 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
12360 4b 20 29 7b 0a 20 20 20 20 20 20 69 52 65 74 20  K ){.      iRet 
12370 3d 20 28 28 69 36 34 29 70 74 72 5b 31 30 5d 20  = ((i64)ptr[10] 
12380 3c 3c 20 33 32 29 20 2b 20 70 74 72 5b 31 31 5d  << 32) + ptr[11]
12390 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
123a0 74 75 72 6e 20 69 52 65 74 3b 0a 7d 0a 0a 2f 2a  turn iRet;.}../*
123b0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
123c0 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 73 20 70  n is called as p
123d0 61 72 74 20 6f 66 20 69 6e 69 74 69 61 6c 69 7a  art of initializ
123e0 69 6e 67 20 6f 72 20 72 65 69 6e 69 74 69 61 6c  ing or reinitial
123f0 69 7a 69 6e 67 20 61 6e 0a 2a 2a 20 69 6e 63 72  izing an.** incr
12400 65 6d 65 6e 74 61 6c 20 63 68 65 63 6b 70 6f 69  emental checkpoi
12410 6e 74 2e 20 0a 2a 2a 0a 2a 2a 20 49 74 20 70 6f  nt. .**.** It po
12420 70 75 6c 61 74 65 73 20 74 68 65 20 73 71 6c 69  pulates the sqli
12430 74 65 33 72 62 75 2e 61 46 72 61 6d 65 5b 5d 20  te3rbu.aFrame[] 
12440 61 72 72 61 79 20 77 69 74 68 20 74 68 65 20 73  array with the s
12450 65 74 20 6f 66 20 0a 2a 2a 20 28 77 61 6c 20 66  et of .** (wal f
12460 72 61 6d 65 20 2d 3e 20 64 62 20 70 61 67 65 29  rame -> db page)
12470 20 63 6f 70 79 20 6f 70 65 72 61 74 69 6f 6e 73   copy operations
12480 20 72 65 71 75 69 72 65 64 20 74 6f 20 63 68 65   required to che
12490 63 6b 70 6f 69 6e 74 20 74 68 65 20 0a 2a 2a 20  ckpoint the .** 
124a0 63 75 72 72 65 6e 74 20 77 61 6c 20 66 69 6c 65  current wal file
124b0 2c 20 61 6e 64 20 6f 62 74 61 69 6e 73 20 74 68  , and obtains th
124c0 65 20 73 65 74 20 6f 66 20 73 68 6d 20 6c 6f 63  e set of shm loc
124d0 6b 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 73  ks required to s
124e0 61 66 65 6c 79 20 0a 2a 2a 20 70 65 72 66 6f 72  afely .** perfor
124f0 6d 20 74 68 65 20 63 6f 70 79 20 6f 70 65 72 61  m the copy opera
12500 74 69 6f 6e 73 20 64 69 72 65 63 74 6c 79 20 6f  tions directly o
12510 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  n the file-syste
12520 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75  m..**.** If argu
12530 6d 65 6e 74 20 70 53 74 61 74 65 20 69 73 20 6e  ment pState is n
12540 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  ot NULL, then th
12550 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 63 68  e incremental ch
12560 65 63 6b 70 6f 69 6e 74 20 69 73 0a 2a 2a 20 62  eckpoint is.** b
12570 65 69 6e 67 20 72 65 73 75 6d 65 64 2e 20 49 6e  eing resumed. In
12580 20 74 68 69 73 20 63 61 73 65 2c 20 69 66 20 74   this case, if t
12590 68 65 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 74  he checksum of t
125a0 68 65 20 77 61 6c 2d 69 6e 64 65 78 2d 68 65 61  he wal-index-hea
125b0 64 65 72 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67  der.** following
125c0 20 72 65 63 6f 76 65 72 79 20 69 73 20 6e 6f 74   recovery is not
125d0 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
125e0 20 63 68 65 63 6b 73 75 6d 20 73 61 76 65 64 20   checksum saved 
125f0 69 6e 20 74 68 65 20 52 62 75 53 74 61 74 65 0a  in the RbuState.
12600 2a 2a 20 6f 62 6a 65 63 74 2c 20 74 68 65 6e 20  ** object, then 
12610 74 68 65 20 72 62 75 20 68 61 6e 64 6c 65 20 69  the rbu handle i
12620 73 20 73 65 74 20 74 6f 20 44 4f 4e 45 20 73 74  s set to DONE st
12630 61 74 65 2e 20 54 68 69 73 20 6f 63 63 75 72 73  ate. This occurs
12640 20 69 66 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65   if some.** othe
12650 72 20 63 6c 69 65 6e 74 20 61 70 70 65 6e 64 73  r client appends
12660 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74   a transaction t
12670 6f 20 74 68 65 20 77 61 6c 20 66 69 6c 65 20 69  o the wal file i
12680 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a  n the middle of.
12690 2a 2a 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61  ** an incrementa
126a0 6c 20 63 68 65 63 6b 70 6f 69 6e 74 2e 0a 2a 2f  l checkpoint..*/
126b0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75  .static void rbu
126c0 53 65 74 75 70 43 68 65 63 6b 70 6f 69 6e 74 28  SetupCheckpoint(
126d0 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 52  sqlite3rbu *p, R
126e0 62 75 53 74 61 74 65 20 2a 70 53 74 61 74 65 29  buState *pState)
126f0 7b 0a 0a 20 20 2f 2a 20 49 66 20 70 53 74 61 74  {..  /* If pStat
12700 65 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  e is NULL, then 
12710 74 68 65 20 77 61 6c 20 66 69 6c 65 20 6d 61 79  the wal file may
12720 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20 6f   not have been o
12730 70 65 6e 65 64 20 61 6e 64 0a 20 20 2a 2a 20 72  pened and.  ** r
12740 65 63 6f 76 65 72 65 64 2e 20 52 75 6e 6e 69 6e  ecovered. Runnin
12750 67 20 61 20 72 65 61 64 2d 73 74 61 74 65 6d 65  g a read-stateme
12760 6e 74 20 68 65 72 65 20 74 6f 20 65 6e 73 75 72  nt here to ensur
12770 65 20 74 68 61 74 20 64 6f 69 6e 67 20 73 6f 0a  e that doing so.
12780 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 69 6e    ** does not in
12790 74 65 72 66 65 72 65 20 77 69 74 68 20 74 68 65  terfere with the
127a0 20 22 63 61 70 74 75 72 65 22 20 70 72 6f 63 65   "capture" proce
127b0 73 73 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20  ss below.  */.  
127c0 69 66 28 20 70 53 74 61 74 65 3d 3d 30 20 29 7b  if( pState==0 ){
127d0 0a 20 20 20 20 70 2d 3e 65 53 74 61 67 65 20 3d  .    p->eStage =
127e0 20 30 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72   0;.    if( p->r
127f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
12800 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71        p->rc = sq
12810 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62  lite3_exec(p->db
12820 4d 61 69 6e 2c 20 22 53 45 4c 45 43 54 20 2a 20  Main, "SELECT * 
12830 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
12840 65 72 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  er", 0, 0, 0);. 
12850 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41     }.  }..  /* A
12860 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72  ssuming no error
12870 20 68 61 73 20 6f 63 63 75 72 72 65 64 2c 20 72   has occurred, r
12880 75 6e 20 61 20 22 72 65 73 74 61 72 74 22 20 63  un a "restart" c
12890 68 65 63 6b 70 6f 69 6e 74 20 77 69 74 68 20 74  heckpoint with t
128a0 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 72  he.  ** sqlite3r
128b0 62 75 2e 65 53 74 61 67 65 20 76 61 72 69 61 62  bu.eStage variab
128c0 6c 65 20 73 65 74 20 74 6f 20 43 41 50 54 55 52  le set to CAPTUR
128d0 45 2e 20 54 68 69 73 20 74 75 72 6e 73 20 6f 6e  E. This turns on
128e0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20   the following. 
128f0 20 2a 2a 20 73 70 65 63 69 61 6c 20 62 65 68 61   ** special beha
12900 76 69 6f 75 72 20 69 6e 20 74 68 65 20 72 62 75  viour in the rbu
12910 20 56 46 53 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20   VFS:.  **.  ** 
12920 20 20 2a 20 49 66 20 74 68 65 20 65 78 63 6c 75    * If the exclu
12930 73 69 76 65 20 73 68 6d 20 57 52 49 54 45 52 20  sive shm WRITER 
12940 6f 72 20 52 45 41 44 30 20 6c 6f 63 6b 20 63 61  or READ0 lock ca
12950 6e 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64  nnot be obtained
12960 2c 0a 20 20 2a 2a 20 20 20 20 20 74 68 65 20 63  ,.  **     the c
12970 68 65 63 6b 70 6f 69 6e 74 20 66 61 69 6c 73 20  heckpoint fails 
12980 77 69 74 68 20 53 51 4c 49 54 45 5f 42 55 53 59  with SQLITE_BUSY
12990 20 28 6e 6f 72 6d 61 6c 6c 79 20 53 51 4c 69 74   (normally SQLit
129a0 65 20 77 6f 75 6c 64 0a 20 20 2a 2a 20 20 20 20  e would.  **    
129b0 20 70 72 6f 63 65 65 64 20 77 69 74 68 20 72 75   proceed with ru
129c0 6e 6e 69 6e 67 20 61 20 70 61 73 73 69 76 65 20  nning a passive 
129d0 63 68 65 63 6b 70 6f 69 6e 74 20 69 6e 73 74 65  checkpoint inste
129e0 61 64 20 6f 66 20 66 61 69 6c 69 6e 67 29 2e 0a  ad of failing)..
129f0 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 41 74    **.  **   * At
12a00 74 65 6d 70 74 73 20 74 6f 20 72 65 61 64 20 66  tempts to read f
12a10 72 6f 6d 20 74 68 65 20 2a 2d 77 61 6c 20 66 69  rom the *-wal fi
12a20 6c 65 20 6f 72 20 77 72 69 74 65 20 74 6f 20 74  le or write to t
12a30 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
12a40 0a 20 20 2a 2a 20 20 20 20 20 64 6f 20 6e 6f 74  .  **     do not
12a50 20 70 65 72 66 6f 72 6d 20 61 6e 79 20 49 4f 2e   perform any IO.
12a60 20 49 6e 73 74 65 61 64 2c 20 74 68 65 20 66 72   Instead, the fr
12a70 61 6d 65 2f 70 61 67 65 20 63 6f 6d 62 69 6e 61  ame/page combina
12a80 74 69 6f 6e 73 20 74 68 61 74 0a 20 20 2a 2a 20  tions that.  ** 
12a90 20 20 20 20 77 6f 75 6c 64 20 62 65 20 72 65 61      would be rea
12aa0 64 2f 77 72 69 74 74 65 6e 20 61 72 65 20 72 65  d/written are re
12ab0 63 6f 72 64 65 64 20 69 6e 20 74 68 65 20 73 71  corded in the sq
12ac0 6c 69 74 65 33 72 62 75 2e 61 46 72 61 6d 65 5b  lite3rbu.aFrame[
12ad0 5d 0a 20 20 2a 2a 20 20 20 20 20 61 72 72 61 79  ].  **     array
12ae0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20  ..  **.  **   * 
12af0 43 61 6c 6c 73 20 74 6f 20 78 53 68 6d 4c 6f 63  Calls to xShmLoc
12b00 6b 28 55 4e 4c 4f 43 4b 29 20 74 6f 20 72 65 6c  k(UNLOCK) to rel
12b10 65 61 73 65 20 74 68 65 20 65 78 63 6c 75 73 69  ease the exclusi
12b20 76 65 20 73 68 6d 20 57 52 49 54 45 52 2c 20 0a  ve shm WRITER, .
12b30 20 20 2a 2a 20 20 20 20 20 52 45 41 44 30 20 61    **     READ0 a
12b40 6e 64 20 43 48 45 43 4b 50 4f 49 4e 54 20 6c 6f  nd CHECKPOINT lo
12b50 63 6b 73 20 74 61 6b 65 6e 20 61 73 20 70 61 72  cks taken as par
12b60 74 20 6f 66 20 74 68 65 20 63 68 65 63 6b 70 6f  t of the checkpo
12b70 69 6e 74 20 61 72 65 0a 20 20 2a 2a 20 20 20 20  int are.  **    
12b80 20 6e 6f 2d 6f 70 73 2e 20 54 68 65 73 65 20 6c   no-ops. These l
12b90 6f 63 6b 73 20 77 69 6c 6c 20 6e 6f 74 20 62 65  ocks will not be
12ba0 20 72 65 6c 65 61 73 65 64 20 75 6e 74 69 6c 20   released until 
12bb0 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20  the connection. 
12bc0 20 2a 2a 20 20 20 20 20 69 73 20 63 6c 6f 73 65   **     is close
12bd0 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a  d..  **.  **   *
12be0 20 41 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 78   Attempting to x
12bf0 53 79 6e 63 28 29 20 74 68 65 20 64 61 74 61 62  Sync() the datab
12c00 61 73 65 20 66 69 6c 65 20 63 61 75 73 65 73 20  ase file causes 
12c10 61 6e 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e  an SQLITE_INTERN
12c20 41 4c 20 0a 20 20 2a 2a 20 20 20 20 20 65 72 72  AL .  **     err
12c30 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 73  or..  **.  ** As
12c40 20 61 20 72 65 73 75 6c 74 2c 20 75 6e 6c 65 73   a result, unles
12c50 73 20 61 6e 20 65 72 72 6f 72 20 28 69 2e 65 2e  s an error (i.e.
12c60 20 4f 4f 4d 20 6f 72 20 53 51 4c 49 54 45 5f 42   OOM or SQLITE_B
12c70 55 53 59 29 20 6f 63 63 75 72 73 2c 20 74 68 65  USY) occurs, the
12c80 0a 20 20 2a 2a 20 63 68 65 63 6b 70 6f 69 6e 74  .  ** checkpoint
12c90 20 62 65 6c 6f 77 20 66 61 69 6c 73 20 77 69 74   below fails wit
12ca0 68 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41  h SQLITE_INTERNA
12cb0 4c 2c 20 61 6e 64 20 6c 65 61 76 65 73 20 74 68  L, and leaves th
12cc0 65 20 61 46 72 61 6d 65 5b 5d 0a 20 20 2a 2a 20  e aFrame[].  ** 
12cd0 61 72 72 61 79 20 70 6f 70 75 6c 61 74 65 64 20  array populated 
12ce0 77 69 74 68 20 61 20 73 65 74 20 6f 66 20 28 66  with a set of (f
12cf0 72 61 6d 65 20 2d 3e 20 70 61 67 65 29 20 6d 61  rame -> page) ma
12d00 70 70 69 6e 67 73 2e 20 42 65 63 61 75 73 65 20  ppings. Because 
12d10 74 68 65 20 0a 20 20 2a 2a 20 57 52 49 54 45 52  the .  ** WRITER
12d20 2c 20 43 48 45 43 4b 50 4f 49 4e 54 20 61 6e 64  , CHECKPOINT and
12d30 20 52 45 41 44 30 20 6c 6f 63 6b 73 20 61 72 65   READ0 locks are
12d40 20 73 74 69 6c 6c 20 68 65 6c 64 2c 20 69 74 20   still held, it 
12d50 69 73 20 73 61 66 65 20 74 6f 20 63 6f 70 79 20  is safe to copy 
12d60 0a 20 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20  .  ** data from 
12d70 74 68 65 20 77 61 6c 20 66 69 6c 65 20 69 6e 74  the wal file int
12d80 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
12d90 69 6c 65 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  ile according to
12da0 20 74 68 65 20 0a 20 20 2a 2a 20 63 6f 6e 74 65   the .  ** conte
12db0 6e 74 73 20 6f 66 20 61 46 72 61 6d 65 5b 5d 2e  nts of aFrame[].
12dc0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 72  .  */.  if( p->r
12dd0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
12de0 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 20      int rc2;.   
12df0 20 70 2d 3e 65 53 74 61 67 65 20 3d 20 52 42 55   p->eStage = RBU
12e00 5f 53 54 41 47 45 5f 43 41 50 54 55 52 45 3b 0a  _STAGE_CAPTURE;.
12e10 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65      rc2 = sqlite
12e20 33 5f 65 78 65 63 28 70 2d 3e 64 62 4d 61 69 6e  3_exec(p->dbMain
12e30 2c 20 22 50 52 41 47 4d 41 20 6d 61 69 6e 2e 77  , "PRAGMA main.w
12e40 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 3d 72 65  al_checkpoint=re
12e50 73 74 61 72 74 22 2c 20 30 2c 20 30 2c 30 29 3b  start", 0, 0,0);
12e60 0a 20 20 20 20 69 66 28 20 72 63 32 21 3d 53 51  .    if( rc2!=SQ
12e70 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c 20 29 20  LITE_INTERNAL ) 
12e80 70 2d 3e 72 63 20 3d 20 72 63 32 3b 0a 20 20 7d  p->rc = rc2;.  }
12e90 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ..  if( p->rc==S
12ea0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
12eb0 70 2d 3e 65 53 74 61 67 65 20 3d 20 52 42 55 5f  p->eStage = RBU_
12ec0 53 54 41 47 45 5f 43 4b 50 54 3b 0a 20 20 20 20  STAGE_CKPT;.    
12ed0 70 2d 3e 6e 53 74 65 70 20 3d 20 28 70 53 74 61  p->nStep = (pSta
12ee0 74 65 20 3f 20 70 53 74 61 74 65 2d 3e 6e 52 6f  te ? pState->nRo
12ef0 77 20 3a 20 30 29 3b 0a 20 20 20 20 70 2d 3e 61  w : 0);.    p->a
12f00 42 75 66 20 3d 20 72 62 75 4d 61 6c 6c 6f 63 28  Buf = rbuMalloc(
12f10 70 2c 20 70 2d 3e 70 67 73 7a 29 3b 0a 20 20 20  p, p->pgsz);.   
12f20 20 70 2d 3e 69 57 61 6c 43 6b 73 75 6d 20 3d 20   p->iWalCksum = 
12f30 72 62 75 53 68 6d 43 68 65 63 6b 73 75 6d 28 70  rbuShmChecksum(p
12f40 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d  );.  }..  if( p-
12f50 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
12f60 26 20 70 53 74 61 74 65 20 26 26 20 70 53 74 61  & pState && pSta
12f70 74 65 2d 3e 69 57 61 6c 43 6b 73 75 6d 21 3d 70  te->iWalCksum!=p
12f80 2d 3e 69 57 61 6c 43 6b 73 75 6d 20 29 7b 0a 20  ->iWalCksum ){. 
12f90 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
12fa0 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 70 2d 3e 65  E_DONE;.    p->e
12fb0 53 74 61 67 65 20 3d 20 52 42 55 5f 53 54 41 47  Stage = RBU_STAG
12fc0 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 7d 0a 0a 2f  E_DONE;.  }.}../
12fd0 2a 0a 2a 2a 20 43 61 6c 6c 65 64 20 77 68 65 6e  *.** Called when
12fe0 20 69 41 6d 74 20 62 79 74 65 73 20 61 72 65 20   iAmt bytes are 
12ff0 72 65 61 64 20 66 72 6f 6d 20 6f 66 66 73 65 74  read from offset
13000 20 69 4f 66 66 20 6f 66 20 74 68 65 20 77 61 6c   iOff of the wal
13010 20 66 69 6c 65 20 77 68 69 6c 65 0a 2a 2a 20 74   file while.** t
13020 68 65 20 72 62 75 20 6f 62 6a 65 63 74 20 69 73  he rbu object is
13030 20 69 6e 20 63 61 70 74 75 72 65 20 6d 6f 64 65   in capture mode
13040 2e 20 52 65 63 6f 72 64 20 74 68 65 20 66 72 61  . Record the fra
13050 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  me number of the
13060 20 66 72 61 6d 65 0a 2a 2a 20 62 65 69 6e 67 20   frame.** being 
13070 72 65 61 64 20 69 6e 20 74 68 65 20 61 46 72 61  read in the aFra
13080 6d 65 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73  me[] array..*/.s
13090 74 61 74 69 63 20 69 6e 74 20 72 62 75 43 61 70  tatic int rbuCap
130a0 74 75 72 65 57 61 6c 52 65 61 64 28 73 71 6c 69  tureWalRead(sqli
130b0 74 65 33 72 62 75 20 2a 70 52 62 75 2c 20 69 36  te3rbu *pRbu, i6
130c0 34 20 69 4f 66 66 2c 20 69 6e 74 20 69 41 6d 74  4 iOff, int iAmt
130d0 29 7b 0a 20 20 63 6f 6e 73 74 20 75 33 32 20 6d  ){.  const u32 m
130e0 52 65 71 20 3d 20 28 31 3c 3c 57 41 4c 5f 4c 4f  Req = (1<<WAL_LO
130f0 43 4b 5f 57 52 49 54 45 29 7c 28 31 3c 3c 57 41  CK_WRITE)|(1<<WA
13100 4c 5f 4c 4f 43 4b 5f 43 4b 50 54 29 7c 28 31 3c  L_LOCK_CKPT)|(1<
13110 3c 57 41 4c 5f 4c 4f 43 4b 5f 52 45 41 44 30 29  <WAL_LOCK_READ0)
13120 3b 0a 20 20 75 33 32 20 69 46 72 61 6d 65 3b 0a  ;.  u32 iFrame;.
13130 0a 20 20 69 66 28 20 70 52 62 75 2d 3e 6d 4c 6f  .  if( pRbu->mLo
13140 63 6b 21 3d 6d 52 65 71 20 29 7b 0a 20 20 20 20  ck!=mReq ){.    
13150 70 52 62 75 2d 3e 72 63 20 3d 20 53 51 4c 49 54  pRbu->rc = SQLIT
13160 45 5f 42 55 53 59 3b 0a 20 20 20 20 72 65 74 75  E_BUSY;.    retu
13170 72 6e 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e  rn SQLITE_INTERN
13180 41 4c 3b 0a 20 20 7d 0a 0a 20 20 70 52 62 75 2d  AL;.  }..  pRbu-
13190 3e 70 67 73 7a 20 3d 20 69 41 6d 74 3b 0a 20 20  >pgsz = iAmt;.  
131a0 69 66 28 20 70 52 62 75 2d 3e 6e 46 72 61 6d 65  if( pRbu->nFrame
131b0 3d 3d 70 52 62 75 2d 3e 6e 46 72 61 6d 65 41 6c  ==pRbu->nFrameAl
131c0 6c 6f 63 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  loc ){.    int n
131d0 4e 65 77 20 3d 20 28 70 52 62 75 2d 3e 6e 46 72  New = (pRbu->nFr
131e0 61 6d 65 41 6c 6c 6f 63 20 3f 20 70 52 62 75 2d  ameAlloc ? pRbu-
131f0 3e 6e 46 72 61 6d 65 41 6c 6c 6f 63 20 3a 20 36  >nFrameAlloc : 6
13200 34 29 20 2a 20 32 3b 0a 20 20 20 20 52 62 75 46  4) * 2;.    RbuF
13210 72 61 6d 65 20 2a 61 4e 65 77 3b 0a 20 20 20 20  rame *aNew;.    
13220 61 4e 65 77 20 3d 20 28 52 62 75 46 72 61 6d 65  aNew = (RbuFrame
13230 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f  *)sqlite3_reallo
13240 63 28 70 52 62 75 2d 3e 61 46 72 61 6d 65 2c 20  c(pRbu->aFrame, 
13250 6e 4e 65 77 20 2a 20 73 69 7a 65 6f 66 28 52 62  nNew * sizeof(Rb
13260 75 46 72 61 6d 65 29 29 3b 0a 20 20 20 20 69 66  uFrame));.    if
13270 28 20 61 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( aNew==0 ) retu
13280 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
13290 0a 20 20 20 20 70 52 62 75 2d 3e 61 46 72 61 6d  .    pRbu->aFram
132a0 65 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 70 52  e = aNew;.    pR
132b0 62 75 2d 3e 6e 46 72 61 6d 65 41 6c 6c 6f 63 20  bu->nFrameAlloc 
132c0 3d 20 6e 4e 65 77 3b 0a 20 20 7d 0a 0a 20 20 69  = nNew;.  }..  i
132d0 46 72 61 6d 65 20 3d 20 28 75 33 32 29 28 28 69  Frame = (u32)((i
132e0 4f 66 66 2d 33 32 29 20 2f 20 28 69 36 34 29 28  Off-32) / (i64)(
132f0 69 41 6d 74 2b 32 34 29 29 20 2b 20 31 3b 0a 20  iAmt+24)) + 1;. 
13300 20 69 66 28 20 70 52 62 75 2d 3e 69 4d 61 78 46   if( pRbu->iMaxF
13310 72 61 6d 65 3c 69 46 72 61 6d 65 20 29 20 70 52  rame<iFrame ) pR
13320 62 75 2d 3e 69 4d 61 78 46 72 61 6d 65 20 3d 20  bu->iMaxFrame = 
13330 69 46 72 61 6d 65 3b 0a 20 20 70 52 62 75 2d 3e  iFrame;.  pRbu->
13340 61 46 72 61 6d 65 5b 70 52 62 75 2d 3e 6e 46 72  aFrame[pRbu->nFr
13350 61 6d 65 5d 2e 69 57 61 6c 46 72 61 6d 65 20 3d  ame].iWalFrame =
13360 20 69 46 72 61 6d 65 3b 0a 20 20 70 52 62 75 2d   iFrame;.  pRbu-
13370 3e 61 46 72 61 6d 65 5b 70 52 62 75 2d 3e 6e 46  >aFrame[pRbu->nF
13380 72 61 6d 65 5d 2e 69 44 62 50 61 67 65 20 3d 20  rame].iDbPage = 
13390 30 3b 0a 20 20 70 52 62 75 2d 3e 6e 46 72 61 6d  0;.  pRbu->nFram
133a0 65 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  e++;.  return SQ
133b0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
133c0 2a 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 61 20  * Called when a 
133d0 70 61 67 65 20 6f 66 20 64 61 74 61 20 69 73 20  page of data is 
133e0 77 72 69 74 74 65 6e 20 74 6f 20 6f 66 66 73 65  written to offse
133f0 74 20 69 4f 66 66 20 6f 66 20 74 68 65 20 64 61  t iOff of the da
13400 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 77  tabase.** file w
13410 68 69 6c 65 20 74 68 65 20 72 62 75 20 68 61 6e  hile the rbu han
13420 64 6c 65 20 69 73 20 69 6e 20 63 61 70 74 75 72  dle is in captur
13430 65 20 6d 6f 64 65 2e 20 52 65 63 6f 72 64 20 74  e mode. Record t
13440 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 0a  he page number .
13450 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20 62  ** of the page b
13460 65 69 6e 67 20 77 72 69 74 74 65 6e 20 69 6e 20  eing written in 
13470 74 68 65 20 61 46 72 61 6d 65 5b 5d 20 61 72 72  the aFrame[] arr
13480 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ay..*/.static in
13490 74 20 72 62 75 43 61 70 74 75 72 65 44 62 57 72  t rbuCaptureDbWr
134a0 69 74 65 28 73 71 6c 69 74 65 33 72 62 75 20 2a  ite(sqlite3rbu *
134b0 70 52 62 75 2c 20 69 36 34 20 69 4f 66 66 29 7b  pRbu, i64 iOff){
134c0 0a 20 20 70 52 62 75 2d 3e 61 46 72 61 6d 65 5b  .  pRbu->aFrame[
134d0 70 52 62 75 2d 3e 6e 46 72 61 6d 65 2d 31 5d 2e  pRbu->nFrame-1].
134e0 69 44 62 50 61 67 65 20 3d 20 28 75 33 32 29 28  iDbPage = (u32)(
134f0 69 4f 66 66 20 2f 20 70 52 62 75 2d 3e 70 67 73  iOff / pRbu->pgs
13500 7a 29 20 2b 20 31 3b 0a 20 20 72 65 74 75 72 6e  z) + 1;.  return
13510 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
13520 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 61 6c  *.** This is cal
13530 6c 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 61  led as part of a
13540 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 63 68  n incremental ch
13550 65 63 6b 70 6f 69 6e 74 20 6f 70 65 72 61 74 69  eckpoint operati
13560 6f 6e 2e 20 43 6f 70 79 0a 2a 2a 20 61 20 73 69  on. Copy.** a si
13570 6e 67 6c 65 20 66 72 61 6d 65 20 6f 66 20 64 61  ngle frame of da
13580 74 61 20 66 72 6f 6d 20 74 68 65 20 77 61 6c 20  ta from the wal 
13590 66 69 6c 65 20 69 6e 74 6f 20 74 68 65 20 64 61  file into the da
135a0 74 61 62 61 73 65 20 66 69 6c 65 2c 20 61 73 0a  tabase file, as.
135b0 2a 2a 20 69 6e 64 69 63 61 74 65 64 20 62 79 20  ** indicated by 
135c0 74 68 65 20 52 62 75 46 72 61 6d 65 20 6f 62 6a  the RbuFrame obj
135d0 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ect..*/.static v
135e0 6f 69 64 20 72 62 75 43 68 65 63 6b 70 6f 69 6e  oid rbuCheckpoin
135f0 74 46 72 61 6d 65 28 73 71 6c 69 74 65 33 72 62  tFrame(sqlite3rb
13600 75 20 2a 70 2c 20 52 62 75 46 72 61 6d 65 20 2a  u *p, RbuFrame *
13610 70 46 72 61 6d 65 29 7b 0a 20 20 73 71 6c 69 74  pFrame){.  sqlit
13620 65 33 5f 66 69 6c 65 20 2a 70 57 61 6c 20 3d 20  e3_file *pWal = 
13630 70 2d 3e 70 54 61 72 67 65 74 46 64 2d 3e 70 57  p->pTargetFd->pW
13640 61 6c 46 64 2d 3e 70 52 65 61 6c 3b 0a 20 20 73  alFd->pReal;.  s
13650 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 44 62  qlite3_file *pDb
13660 20 3d 20 70 2d 3e 70 54 61 72 67 65 74 46 64 2d   = p->pTargetFd-
13670 3e 70 52 65 61 6c 3b 0a 20 20 69 36 34 20 69 4f  >pReal;.  i64 iO
13680 66 66 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  ff;..  assert( p
13690 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
136a0 29 3b 0a 20 20 69 4f 66 66 20 3d 20 28 69 36 34  );.  iOff = (i64
136b0 29 28 70 46 72 61 6d 65 2d 3e 69 57 61 6c 46 72  )(pFrame->iWalFr
136c0 61 6d 65 2d 31 29 20 2a 20 28 70 2d 3e 70 67 73  ame-1) * (p->pgs
136d0 7a 20 2b 20 32 34 29 20 2b 20 33 32 20 2b 20 32  z + 24) + 32 + 2
136e0 34 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 70 57 61  4;.  p->rc = pWa
136f0 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 52 65  l->pMethods->xRe
13700 61 64 28 70 57 61 6c 2c 20 70 2d 3e 61 42 75 66  ad(pWal, p->aBuf
13710 2c 20 70 2d 3e 70 67 73 7a 2c 20 69 4f 66 66 29  , p->pgsz, iOff)
13720 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20  ;.  if( p->rc ) 
13730 72 65 74 75 72 6e 3b 0a 0a 20 20 69 4f 66 66 20  return;..  iOff 
13740 3d 20 28 69 36 34 29 28 70 46 72 61 6d 65 2d 3e  = (i64)(pFrame->
13750 69 44 62 50 61 67 65 2d 31 29 20 2a 20 70 2d 3e  iDbPage-1) * p->
13760 70 67 73 7a 3b 0a 20 20 70 2d 3e 72 63 20 3d 20  pgsz;.  p->rc = 
13770 70 44 62 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78  pDb->pMethods->x
13780 57 72 69 74 65 28 70 44 62 2c 20 70 2d 3e 61 42  Write(pDb, p->aB
13790 75 66 2c 20 70 2d 3e 70 67 73 7a 2c 20 69 4f 66  uf, p->pgsz, iOf
137a0 66 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 61  f);.}.../*.** Ta
137b0 6b 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  ke an EXCLUSIVE 
137c0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
137d0 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  base file..*/.st
137e0 61 74 69 63 20 76 6f 69 64 20 72 62 75 4c 6f 63  atic void rbuLoc
137f0 6b 44 61 74 61 62 61 73 65 28 73 71 6c 69 74 65  kDatabase(sqlite
13800 33 72 62 75 20 2a 70 29 7b 0a 20 20 73 71 6c 69  3rbu *p){.  sqli
13810 74 65 33 5f 66 69 6c 65 20 2a 70 52 65 61 6c 20  te3_file *pReal 
13820 3d 20 70 2d 3e 70 54 61 72 67 65 74 46 64 2d 3e  = p->pTargetFd->
13830 70 52 65 61 6c 3b 0a 20 20 61 73 73 65 72 74 28  pReal;.  assert(
13840 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
13850 4b 20 29 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 70  K );.  p->rc = p
13860 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e  Real->pMethods->
13870 78 4c 6f 63 6b 28 70 52 65 61 6c 2c 20 53 51 4c  xLock(pReal, SQL
13880 49 54 45 5f 4c 4f 43 4b 5f 53 48 41 52 45 44 29  ITE_LOCK_SHARED)
13890 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ;.  if( p->rc==S
138a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
138b0 70 2d 3e 72 63 20 3d 20 70 52 65 61 6c 2d 3e 70  p->rc = pReal->p
138c0 4d 65 74 68 6f 64 73 2d 3e 78 4c 6f 63 6b 28 70  Methods->xLock(p
138d0 52 65 61 6c 2c 20 53 51 4c 49 54 45 5f 4c 4f 43  Real, SQLITE_LOC
138e0 4b 5f 45 58 43 4c 55 53 49 56 45 29 3b 0a 20 20  K_EXCLUSIVE);.  
138f0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 52  }.}../*.** The R
13900 42 55 20 68 61 6e 64 6c 65 20 69 73 20 63 75 72  BU handle is cur
13910 72 65 6e 74 6c 79 20 69 6e 20 52 42 55 5f 53 54  rently in RBU_ST
13920 41 47 45 5f 4f 41 4c 20 73 74 61 74 65 2c 20 77  AGE_OAL state, w
13930 69 74 68 20 61 20 53 48 41 52 45 44 20 6c 6f 63  ith a SHARED loc
13940 6b 0a 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61  k.** on the data
13950 62 61 73 65 20 66 69 6c 65 2e 20 54 68 69 73 20  base file. This 
13960 70 72 6f 63 20 6d 6f 76 65 73 20 74 68 65 20 2a  proc moves the *
13970 2d 6f 61 6c 20 66 69 6c 65 20 74 6f 20 74 68 65  -oal file to the
13980 20 2a 2d 77 61 6c 20 70 61 74 68 2c 0a 2a 2a 20   *-wal path,.** 
13990 74 68 65 6e 20 72 65 6f 70 65 6e 73 20 74 68 65  then reopens the
139a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
139b0 74 68 69 73 20 74 69 6d 65 20 69 6e 20 76 61 6e  this time in van
139c0 69 6c 6c 61 2c 20 6e 6f 6e 2d 6f 61 6c 2c 20 57  illa, non-oal, W
139d0 41 4c 20 6d 6f 64 65 29 2e 0a 2a 2a 20 49 66 20  AL mode)..** If 
139e0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
139f0 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
13a00 63 6f 64 65 20 61 6e 64 20 65 72 72 6f 72 20 6d  code and error m
13a10 65 73 73 61 67 65 20 69 6e 20 74 68 65 20 72 62  essage in the rb
13a20 75 20 0a 2a 2a 20 68 61 6e 64 6c 65 2e 0a 2a 2f  u .** handle..*/
13a30 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75  .static void rbu
13a40 4d 6f 76 65 4f 61 6c 46 69 6c 65 28 73 71 6c 69  MoveOalFile(sqli
13a50 74 65 33 72 62 75 20 2a 70 29 7b 0a 20 20 63 6f  te3rbu *p){.  co
13a60 6e 73 74 20 63 68 61 72 20 2a 7a 42 61 73 65 20  nst char *zBase 
13a70 3d 20 73 71 6c 69 74 65 33 5f 64 62 5f 66 69 6c  = sqlite3_db_fil
13a80 65 6e 61 6d 65 28 70 2d 3e 64 62 4d 61 69 6e 2c  ename(p->dbMain,
13a90 20 22 6d 61 69 6e 22 29 3b 0a 0a 20 20 63 68 61   "main");..  cha
13aa0 72 20 2a 7a 57 61 6c 20 3d 20 73 71 6c 69 74 65  r *zWal = sqlite
13ab0 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 2d 77 61  3_mprintf("%s-wa
13ac0 6c 22 2c 20 7a 42 61 73 65 29 3b 0a 20 20 63 68  l", zBase);.  ch
13ad0 61 72 20 2a 7a 4f 61 6c 20 3d 20 73 71 6c 69 74  ar *zOal = sqlit
13ae0 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 2d 6f  e3_mprintf("%s-o
13af0 61 6c 22 2c 20 7a 42 61 73 65 29 3b 0a 0a 20 20  al", zBase);..  
13b00 61 73 73 65 72 74 28 20 70 2d 3e 65 53 74 61 67  assert( p->eStag
13b10 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4d 4f 56  e==RBU_STAGE_MOV
13b20 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  E );.  assert( p
13b30 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
13b40 26 26 20 70 2d 3e 7a 45 72 72 6d 73 67 3d 3d 30  && p->zErrmsg==0
13b50 20 29 3b 0a 20 20 69 66 28 20 7a 57 61 6c 3d 3d   );.  if( zWal==
13b60 30 20 7c 7c 20 7a 4f 61 6c 3d 3d 30 20 29 7b 0a  0 || zOal==0 ){.
13b70 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
13b80 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73  TE_NOMEM;.  }els
13b90 65 7b 0a 20 20 20 20 2f 2a 20 4d 6f 76 65 20 74  e{.    /* Move t
13ba0 68 65 20 2a 2d 6f 61 6c 20 66 69 6c 65 20 74 6f  he *-oal file to
13bb0 20 2a 2d 77 61 6c 2e 20 41 74 20 74 68 69 73 20   *-wal. At this 
13bc0 70 6f 69 6e 74 20 63 6f 6e 6e 65 63 74 69 6f 6e  point connection
13bd0 20 70 2d 3e 64 62 20 69 73 0a 20 20 20 20 2a 2a   p->db is.    **
13be0 20 68 6f 6c 64 69 6e 67 20 61 20 53 48 41 52 45   holding a SHARE
13bf0 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61  D lock on the ta
13c00 72 67 65 74 20 64 61 74 61 62 61 73 65 20 66 69  rget database fi
13c10 6c 65 20 28 62 65 63 61 75 73 65 20 69 74 20 69  le (because it i
13c20 73 0a 20 20 20 20 2a 2a 20 69 6e 20 57 41 4c 20  s.    ** in WAL 
13c30 6d 6f 64 65 29 2e 20 53 6f 20 6e 6f 20 6f 74 68  mode). So no oth
13c40 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61  er connection ma
13c50 79 20 62 65 20 77 72 69 74 69 6e 67 20 74 68 65  y be writing the
13c60 20 64 62 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20   db. .    **.   
13c70 20 2a 2a 20 49 6e 20 6f 72 64 65 72 20 74 6f 20   ** In order to 
13c80 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 72  ensure that ther
13c90 65 20 61 72 65 20 6e 6f 20 64 61 74 61 62 61 73  e are no databas
13ca0 65 20 72 65 61 64 65 72 73 2c 20 61 6e 20 45 58  e readers, an EX
13cb0 43 4c 55 53 49 56 45 0a 20 20 20 20 2a 2a 20 6c  CLUSIVE.    ** l
13cc0 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ock is obtained 
13cd0 68 65 72 65 20 62 65 66 6f 72 65 20 74 68 65 20  here before the 
13ce0 2a 2d 6f 61 6c 20 69 73 20 6d 6f 76 65 64 20 74  *-oal is moved t
13cf0 6f 20 2a 2d 77 61 6c 2e 0a 20 20 20 20 2a 2f 0a  o *-wal..    */.
13d00 20 20 20 20 72 62 75 4c 6f 63 6b 44 61 74 61 62      rbuLockDatab
13d10 61 73 65 28 70 29 3b 0a 20 20 20 20 69 66 28 20  ase(p);.    if( 
13d20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
13d30 20 29 7b 0a 20 20 20 20 20 20 72 62 75 46 69 6c   ){.      rbuFil
13d40 65 53 75 66 66 69 78 33 28 7a 42 61 73 65 2c 20  eSuffix3(zBase, 
13d50 7a 57 61 6c 29 3b 0a 20 20 20 20 20 20 72 62 75  zWal);.      rbu
13d60 46 69 6c 65 53 75 66 66 69 78 33 28 7a 42 61 73  FileSuffix3(zBas
13d70 65 2c 20 7a 4f 61 6c 29 3b 0a 0a 20 20 20 20 20  e, zOal);..     
13d80 20 2f 2a 20 52 65 2d 6f 70 65 6e 20 74 68 65 20   /* Re-open the 
13d90 64 61 74 61 62 61 73 65 73 2e 20 2a 2f 0a 20 20  databases. */.  
13da0 20 20 20 20 72 62 75 4f 62 6a 49 74 65 72 46 69      rbuObjIterFi
13db0 6e 61 6c 69 7a 65 28 26 70 2d 3e 6f 62 6a 69 74  nalize(&p->objit
13dc0 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  er);.      sqlit
13dd0 65 33 5f 63 6c 6f 73 65 28 70 2d 3e 64 62 4d 61  e3_close(p->dbMa
13de0 69 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  in);.      sqlit
13df0 65 33 5f 63 6c 6f 73 65 28 70 2d 3e 64 62 52 62  e3_close(p->dbRb
13e00 75 29 3b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20  u);.      p->rc 
13e10 3d 20 72 65 6e 61 6d 65 28 7a 4f 61 6c 2c 20 7a  = rename(zOal, z
13e20 57 61 6c 29 20 3f 20 53 51 4c 49 54 45 5f 49 4f  Wal) ? SQLITE_IO
13e30 45 52 52 20 3a 20 53 51 4c 49 54 45 5f 4f 4b 3b  ERR : SQLITE_OK;
13e40 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63  .      if( p->rc
13e50 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
13e60 20 20 20 20 20 20 20 70 2d 3e 64 62 4d 61 69 6e         p->dbMain
13e70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 2d   = 0;.        p-
13e80 3e 64 62 52 62 75 20 3d 20 30 3b 0a 20 20 20 20  >dbRbu = 0;.    
13e90 20 20 20 20 72 62 75 4f 70 65 6e 44 61 74 61 62      rbuOpenDatab
13ea0 61 73 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ase(p);.        
13eb0 72 62 75 53 65 74 75 70 43 68 65 63 6b 70 6f 69  rbuSetupCheckpoi
13ec0 6e 74 28 70 2c 20 30 29 3b 0a 20 20 20 20 20 20  nt(p, 0);.      
13ed0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73  }.    }.  }..  s
13ee0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 57 61 6c  qlite3_free(zWal
13ef0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
13f00 65 28 7a 4f 61 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  e(zOal);.}../*.*
13f10 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61  * The SELECT sta
13f20 74 65 6d 65 6e 74 20 69 74 65 72 61 74 69 6e 67  tement iterating
13f30 20 74 68 72 6f 75 67 68 20 74 68 65 20 6b 65 79   through the key
13f40 73 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  s for the curren
13f50 74 20 6f 62 6a 65 63 74 0a 2a 2a 20 28 70 2d 3e  t object.** (p->
13f60 6f 62 6a 69 74 65 72 2e 70 53 65 6c 65 63 74 29  objiter.pSelect)
13f70 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
13f80 73 20 74 6f 20 61 20 76 61 6c 69 64 20 72 6f 77  s to a valid row
13f90 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  . This function.
13fa0 2a 2a 20 64 65 74 65 72 6d 69 6e 65 73 20 74 68  ** determines th
13fb0 65 20 74 79 70 65 20 6f 66 20 6f 70 65 72 61 74  e type of operat
13fc0 69 6f 6e 20 72 65 71 75 65 73 74 65 64 20 62 79  ion requested by
13fd0 20 74 68 69 73 20 72 6f 77 20 61 6e 64 20 72 65   this row and re
13fe0 74 75 72 6e 73 0a 2a 2a 20 6f 6e 65 20 6f 66 20  turns.** one of 
13ff0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61  the following va
14000 6c 75 65 73 20 74 6f 20 69 6e 64 69 63 61 74 65  lues to indicate
14010 20 74 68 65 20 72 65 73 75 6c 74 3a 0a 2a 2a 0a   the result:.**.
14020 2a 2a 20 20 20 20 20 2a 20 52 42 55 5f 49 4e 53  **     * RBU_INS
14030 45 52 54 0a 2a 2a 20 20 20 20 20 2a 20 52 42 55  ERT.**     * RBU
14040 5f 44 45 4c 45 54 45 0a 2a 2a 20 20 20 20 20 2a  _DELETE.**     *
14050 20 52 42 55 5f 49 44 58 5f 44 45 4c 45 54 45 0a   RBU_IDX_DELETE.
14060 2a 2a 20 20 20 20 20 2a 20 52 42 55 5f 55 50 44  **     * RBU_UPD
14070 41 54 45 0a 2a 2a 0a 2a 2a 20 49 66 20 52 42 55  ATE.**.** If RBU
14080 5f 55 50 44 41 54 45 20 69 73 20 72 65 74 75 72  _UPDATE is retur
14090 6e 65 64 2c 20 74 68 65 6e 20 6f 75 74 70 75 74  ned, then output
140a0 20 76 61 72 69 61 62 6c 65 20 2a 70 7a 4d 61 73   variable *pzMas
140b0 6b 20 69 73 20 73 65 74 20 74 6f 0a 2a 2a 20 70  k is set to.** p
140c0 6f 69 6e 74 20 74 6f 20 74 68 65 20 74 65 78 74  oint to the text
140d0 20 76 61 6c 75 65 20 69 6e 64 69 63 61 74 69 6e   value indicatin
140e0 67 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 74 6f  g the columns to
140f0 20 75 70 64 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49   update..**.** I
14100 66 20 74 68 65 20 72 62 75 5f 63 6f 6e 74 72 6f  f the rbu_contro
14110 6c 20 66 69 65 6c 64 20 63 6f 6e 74 61 69 6e 73  l field contains
14120 20 61 6e 20 69 6e 76 61 6c 69 64 20 76 61 6c 75   an invalid valu
14130 65 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  e, an error code
14140 20 61 6e 64 0a 2a 2a 20 6d 65 73 73 61 67 65 20   and.** message 
14150 61 72 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20  are left in the 
14160 52 42 55 20 68 61 6e 64 6c 65 20 61 6e 64 20 7a  RBU handle and z
14170 65 72 6f 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f  ero returned..*/
14180 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 53  .static int rbuS
14190 74 65 70 54 79 70 65 28 73 71 6c 69 74 65 33 72  tepType(sqlite3r
141a0 62 75 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  bu *p, const cha
141b0 72 20 2a 2a 70 7a 4d 61 73 6b 29 7b 0a 20 20 69  r **pzMask){.  i
141c0 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 6f 62 6a  nt iCol = p->obj
141d0 69 74 65 72 2e 6e 43 6f 6c 3b 20 20 20 20 20 2f  iter.nCol;     /
141e0 2a 20 49 6e 64 65 78 20 6f 66 20 72 62 75 5f 63  * Index of rbu_c
141f0 6f 6e 74 72 6f 6c 20 63 6f 6c 75 6d 6e 20 2a 2f  ontrol column */
14200 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 30 3b 20  .  int res = 0; 
14210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14220 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c     /* Return val
14230 75 65 20 2a 2f 0a 0a 20 20 73 77 69 74 63 68 28  ue */..  switch(
14240 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
14250 74 79 70 65 28 70 2d 3e 6f 62 6a 69 74 65 72 2e  type(p->objiter.
14260 70 53 65 6c 65 63 74 2c 20 69 43 6f 6c 29 20 29  pSelect, iCol) )
14270 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  {.    case SQLIT
14280 45 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20  E_INTEGER: {.   
14290 20 20 20 69 6e 74 20 69 56 61 6c 20 3d 20 73 71     int iVal = sq
142a0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
142b0 28 70 2d 3e 6f 62 6a 69 74 65 72 2e 70 53 65 6c  (p->objiter.pSel
142c0 65 63 74 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20  ect, iCol);.    
142d0 20 20 69 66 28 20 69 56 61 6c 3d 3d 30 20 29 7b    if( iVal==0 ){
142e0 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 52  .        res = R
142f0 42 55 5f 49 4e 53 45 52 54 3b 0a 20 20 20 20 20  BU_INSERT;.     
14300 20 7d 65 6c 73 65 20 69 66 28 20 69 56 61 6c 3d   }else if( iVal=
14310 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  =1 ){.        re
14320 73 20 3d 20 52 42 55 5f 44 45 4c 45 54 45 3b 0a  s = RBU_DELETE;.
14330 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
14340 69 56 61 6c 3d 3d 32 20 29 7b 0a 20 20 20 20 20  iVal==2 ){.     
14350 20 20 20 72 65 73 20 3d 20 52 42 55 5f 49 44 58     res = RBU_IDX
14360 5f 44 45 4c 45 54 45 3b 0a 20 20 20 20 20 20 7d  _DELETE;.      }
14370 65 6c 73 65 20 69 66 28 20 69 56 61 6c 3d 3d 33  else if( iVal==3
14380 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 73 20   ){.        res 
14390 3d 20 52 42 55 5f 49 44 58 5f 49 4e 53 45 52 54  = RBU_IDX_INSERT
143a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
143b0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
143c0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
143d0 58 54 3a 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73  XT: {.      cons
143e0 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
143f0 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  *z = sqlite3_col
14400 75 6d 6e 5f 74 65 78 74 28 70 2d 3e 6f 62 6a 69  umn_text(p->obji
14410 74 65 72 2e 70 53 65 6c 65 63 74 2c 20 69 43 6f  ter.pSelect, iCo
14420 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 3d  l);.      if( z=
14430 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  =0 ){.        p-
14440 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  >rc = SQLITE_NOM
14450 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  EM;.      }else{
14460 0a 20 20 20 20 20 20 20 20 2a 70 7a 4d 61 73 6b  .        *pzMask
14470 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
14480 7a 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  z;.      }.     
14490 20 72 65 73 20 3d 20 52 42 55 5f 55 50 44 41 54   res = RBU_UPDAT
144a0 45 3b 0a 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  E;..      break;
144b0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 65 66 61  .    }..    defa
144c0 75 6c 74 3a 0a 20 20 20 20 20 20 62 72 65 61 6b  ult:.      break
144d0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 65 73  ;.  }..  if( res
144e0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 62 75 42 61  ==0 ){.    rbuBa
144f0 64 43 6f 6e 74 72 6f 6c 45 72 72 6f 72 28 70 29  dControlError(p)
14500 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
14510 65 73 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  es;.}..#ifdef SQ
14520 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a  LITE_DEBUG./*.**
14530 20 41 73 73 65 72 74 20 74 68 61 74 20 63 6f 6c   Assert that col
14540 75 6d 6e 20 69 43 6f 6c 20 6f 66 20 73 74 61 74  umn iCol of stat
14550 65 6d 65 6e 74 20 70 53 74 6d 74 20 69 73 20 6e  ement pStmt is n
14560 61 6d 65 64 20 7a 4e 61 6d 65 2e 0a 2a 2f 0a 73  amed zName..*/.s
14570 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72  tatic void asser
14580 74 43 6f 6c 75 6d 6e 4e 61 6d 65 28 73 71 6c 69  tColumnName(sqli
14590 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 2c  te3_stmt *pStmt,
145a0 20 69 6e 74 20 69 43 6f 6c 2c 20 63 6f 6e 73 74   int iCol, const
145b0 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20   char *zName){. 
145c0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
145d0 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  l = sqlite3_colu
145e0 6d 6e 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 20 69  mn_name(pStmt, i
145f0 43 6f 6c 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Col);.  assert( 
14600 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 69 63  0==sqlite3_stric
14610 6d 70 28 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 20  mp(zName, zCol) 
14620 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  );.}.#else.# def
14630 69 6e 65 20 61 73 73 65 72 74 43 6f 6c 75 6d 6e  ine assertColumn
14640 4e 61 6d 65 28 78 2c 79 2c 7a 29 0a 23 65 6e 64  Name(x,y,z).#end
14650 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  if../*.** This f
14660 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 74 68 65  unction does the
14670 20 77 6f 72 6b 20 66 6f 72 20 61 6e 20 73 71 6c   work for an sql
14680 69 74 65 33 72 62 75 5f 73 74 65 70 28 29 20 63  ite3rbu_step() c
14690 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f  all..**.** The o
146a0 62 6a 65 63 74 2d 69 74 65 72 61 74 6f 72 20 28  bject-iterator (
146b0 70 2d 3e 6f 62 6a 69 74 65 72 29 20 63 75 72 72  p->objiter) curr
146c0 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20  ently points to 
146d0 61 20 76 61 6c 69 64 20 6f 62 6a 65 63 74 2c 0a  a valid object,.
146e0 2a 2a 20 61 6e 64 20 74 68 65 20 69 6e 70 75 74  ** and the input
146f0 20 63 75 72 73 6f 72 20 28 70 2d 3e 6f 62 6a 69   cursor (p->obji
14700 74 65 72 2e 70 53 65 6c 65 63 74 29 20 63 75 72  ter.pSelect) cur
14710 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f  rently points to
14720 20 61 20 76 61 6c 69 64 0a 2a 2a 20 69 6e 70 75   a valid.** inpu
14730 74 20 72 6f 77 2e 20 50 65 72 66 6f 72 6d 20 77  t row. Perform w
14740 68 61 74 65 76 65 72 20 70 72 6f 63 65 73 73 69  hatever processi
14750 6e 67 20 69 73 20 72 65 71 75 69 72 65 64 20 61  ng is required a
14760 6e 64 20 72 65 74 75 72 6e 2e 0a 2a 2a 0a 2a 2a  nd return..**.**
14770 20 49 66 20 6e 6f 20 20 65 72 72 6f 72 20 6f 63   If no  error oc
14780 63 75 72 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  curs, SQLITE_OK 
14790 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
147a0 65 72 77 69 73 65 2c 20 61 6e 20 65 72 72 6f 72  erwise, an error
147b0 20 63 6f 64 65 0a 2a 2a 20 61 6e 64 20 6d 65 73   code.** and mes
147c0 73 61 67 65 20 69 73 20 6c 65 66 74 20 69 6e 20  sage is left in 
147d0 74 68 65 20 52 42 55 20 68 61 6e 64 6c 65 20 61  the RBU handle a
147e0 6e 64 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  nd a copy of the
147f0 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 72   error code.** r
14800 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
14810 69 63 20 69 6e 74 20 72 62 75 53 74 65 70 28 73  ic int rbuStep(s
14820 71 6c 69 74 65 33 72 62 75 20 2a 70 29 7b 0a 20  qlite3rbu *p){. 
14830 20 52 62 75 4f 62 6a 49 74 65 72 20 2a 70 49 74   RbuObjIter *pIt
14840 65 72 20 3d 20 26 70 2d 3e 6f 62 6a 69 74 65 72  er = &p->objiter
14850 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
14860 7a 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 69 6e 74  zMask = 0;.  int
14870 20 69 3b 0a 20 20 69 6e 74 20 65 54 79 70 65 20   i;.  int eType 
14880 3d 20 72 62 75 53 74 65 70 54 79 70 65 28 70 2c  = rbuStepType(p,
14890 20 26 7a 4d 61 73 6b 29 3b 0a 0a 20 20 69 66 28   &zMask);..  if(
148a0 20 65 54 79 70 65 20 29 7b 0a 20 20 20 20 61 73   eType ){.    as
148b0 73 65 72 74 28 20 65 54 79 70 65 21 3d 52 42 55  sert( eType!=RBU
148c0 5f 55 50 44 41 54 45 20 7c 7c 20 70 49 74 65 72  _UPDATE || pIter
148d0 2d 3e 7a 49 64 78 3d 3d 30 20 29 3b 0a 0a 20 20  ->zIdx==0 );..  
148e0 20 20 69 66 28 20 70 49 74 65 72 2d 3e 7a 49 64    if( pIter->zId
148f0 78 3d 3d 30 20 26 26 20 65 54 79 70 65 3d 3d 52  x==0 && eType==R
14900 42 55 5f 49 44 58 5f 44 45 4c 45 54 45 20 29 7b  BU_IDX_DELETE ){
14910 0a 20 20 20 20 20 20 72 62 75 42 61 64 43 6f 6e  .      rbuBadCon
14920 74 72 6f 6c 45 72 72 6f 72 28 70 29 3b 0a 20 20  trolError(p);.  
14930 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69 66 28    }.    else if(
14940 20 0a 20 20 20 20 20 20 20 20 65 54 79 70 65 3d   .        eType=
14950 3d 52 42 55 5f 49 4e 53 45 52 54 20 0a 20 20 20  =RBU_INSERT .   
14960 20 20 7c 7c 20 65 54 79 70 65 3d 3d 52 42 55 5f    || eType==RBU_
14970 44 45 4c 45 54 45 0a 20 20 20 20 20 7c 7c 20 65  DELETE.     || e
14980 54 79 70 65 3d 3d 52 42 55 5f 49 44 58 5f 44 45  Type==RBU_IDX_DE
14990 4c 45 54 45 20 0a 20 20 20 20 20 7c 7c 20 65 54  LETE .     || eT
149a0 79 70 65 3d 3d 52 42 55 5f 49 44 58 5f 49 4e 53  ype==RBU_IDX_INS
149b0 45 52 54 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ERT.    ){.     
149c0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
149d0 70 56 61 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69  pVal;.      sqli
149e0 74 65 33 5f 73 74 6d 74 20 2a 70 57 72 69 74 65  te3_stmt *pWrite
149f0 72 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74  r;..      assert
14a00 28 20 65 54 79 70 65 21 3d 52 42 55 5f 55 50 44  ( eType!=RBU_UPD
14a10 41 54 45 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ATE );.      ass
14a20 65 72 74 28 20 65 54 79 70 65 21 3d 52 42 55 5f  ert( eType!=RBU_
14a30 44 45 4c 45 54 45 20 7c 7c 20 70 49 74 65 72 2d  DELETE || pIter-
14a40 3e 7a 49 64 78 3d 3d 30 20 29 3b 0a 0a 20 20 20  >zIdx==0 );..   
14a50 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 52 42     if( eType==RB
14a60 55 5f 49 44 58 5f 44 45 4c 45 54 45 20 7c 7c 20  U_IDX_DELETE || 
14a70 65 54 79 70 65 3d 3d 52 42 55 5f 44 45 4c 45 54  eType==RBU_DELET
14a80 45 20 29 7b 0a 20 20 20 20 20 20 20 20 70 57 72  E ){.        pWr
14a90 69 74 65 72 20 3d 20 70 49 74 65 72 2d 3e 70 44  iter = pIter->pD
14aa0 65 6c 65 74 65 3b 0a 20 20 20 20 20 20 7d 65 6c  elete;.      }el
14ab0 73 65 7b 0a 20 20 20 20 20 20 20 20 70 57 72 69  se{.        pWri
14ac0 74 65 72 20 3d 20 70 49 74 65 72 2d 3e 70 49 6e  ter = pIter->pIn
14ad0 73 65 72 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  sert;.      }.. 
14ae0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
14af0 70 49 74 65 72 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  pIter->nCol; i++
14b00 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ){.        /* If
14b10 20 74 68 69 73 20 69 73 20 61 6e 20 49 4e 53 45   this is an INSE
14b20 52 54 20 69 6e 74 6f 20 61 20 74 61 62 6c 65 20  RT into a table 
14b30 62 2d 74 72 65 65 20 61 6e 64 20 74 68 65 20 74  b-tree and the t
14b40 61 62 6c 65 20 68 61 73 20 61 6e 0a 20 20 20 20  able has an.    
14b50 20 20 20 20 2a 2a 20 65 78 70 6c 69 63 69 74 20      ** explicit 
14b60 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
14b70 4b 45 59 2c 20 63 68 65 63 6b 20 74 68 61 74 20  KEY, check that 
14b80 74 68 69 73 20 69 73 20 6e 6f 74 20 61 6e 20 61  this is not an a
14b90 74 74 65 6d 70 74 0a 20 20 20 20 20 20 20 20 2a  ttempt.        *
14ba0 2a 20 74 6f 20 77 72 69 74 65 20 61 20 4e 55 4c  * to write a NUL
14bb0 4c 20 69 6e 74 6f 20 74 68 65 20 49 50 4b 20 63  L into the IPK c
14bc0 6f 6c 75 6d 6e 2e 20 54 68 61 74 20 69 73 20 6e  olumn. That is n
14bd0 6f 74 20 70 65 72 6d 69 74 74 65 64 2e 20 20 2a  ot permitted.  *
14be0 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 54  /.        if( eT
14bf0 79 70 65 3d 3d 52 42 55 5f 49 4e 53 45 52 54 20  ype==RBU_INSERT 
14c00 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 49 74  .         && pIt
14c10 65 72 2d 3e 7a 49 64 78 3d 3d 30 20 26 26 20 70  er->zIdx==0 && p
14c20 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55  Iter->eType==RBU
14c30 5f 50 4b 5f 49 50 4b 20 26 26 20 70 49 74 65 72  _PK_IPK && pIter
14c40 2d 3e 61 62 54 62 6c 50 6b 5b 69 5d 20 0a 20 20  ->abTblPk[i] .  
14c50 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
14c60 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 49  3_column_type(pI
14c70 74 65 72 2d 3e 70 53 65 6c 65 63 74 2c 20 69 29  ter->pSelect, i)
14c80 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 0a 20 20  ==SQLITE_NULL.  
14c90 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
14ca0 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
14cb0 45 5f 4d 49 53 4d 41 54 43 48 3b 0a 20 20 20 20  E_MISMATCH;.    
14cc0 20 20 20 20 20 20 70 2d 3e 7a 45 72 72 6d 73 67        p->zErrmsg
14cd0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
14ce0 74 66 28 22 64 61 74 61 74 79 70 65 20 6d 69 73  tf("datatype mis
14cf0 6d 61 74 63 68 22 29 3b 0a 20 20 20 20 20 20 20  match");.       
14d00 20 20 20 67 6f 74 6f 20 73 74 65 70 5f 6f 75 74     goto step_out
14d10 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
14d20 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d       if( eType==
14d30 52 42 55 5f 44 45 4c 45 54 45 20 26 26 20 70 49  RBU_DELETE && pI
14d40 74 65 72 2d 3e 61 62 54 62 6c 50 6b 5b 69 5d 3d  ter->abTblPk[i]=
14d50 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
14d60 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
14d70 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 70 56 61    }..        pVa
14d80 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  l = sqlite3_colu
14d90 6d 6e 5f 76 61 6c 75 65 28 70 49 74 65 72 2d 3e  mn_value(pIter->
14da0 70 53 65 6c 65 63 74 2c 20 69 29 3b 0a 20 20 20  pSelect, i);.   
14db0 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c       p->rc = sql
14dc0 69 74 65 33 5f 62 69 6e 64 5f 76 61 6c 75 65 28  ite3_bind_value(
14dd0 70 57 72 69 74 65 72 2c 20 69 2b 31 2c 20 70 56  pWriter, i+1, pV
14de0 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  al);.        if(
14df0 20 70 2d 3e 72 63 20 29 20 67 6f 74 6f 20 73 74   p->rc ) goto st
14e00 65 70 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  ep_out;.      }.
14e10 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d        if( pIter-
14e20 3e 7a 49 64 78 3d 3d 30 0a 20 20 20 20 20 20 20  >zIdx==0.       
14e30 26 26 20 28 70 49 74 65 72 2d 3e 65 54 79 70 65  && (pIter->eType
14e40 3d 3d 52 42 55 5f 50 4b 5f 56 54 41 42 20 7c 7c  ==RBU_PK_VTAB ||
14e50 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52   pIter->eType==R
14e60 42 55 5f 50 4b 5f 4e 4f 4e 45 29 20 0a 20 20 20  BU_PK_NONE) .   
14e70 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a     ){.        /*
14e80 20 46 6f 72 20 61 20 76 69 72 74 75 61 6c 20 74   For a virtual t
14e90 61 62 6c 65 2c 20 6f 72 20 61 20 74 61 62 6c 65  able, or a table
14ea0 20 77 69 74 68 20 6e 6f 20 70 72 69 6d 61 72 79   with no primary
14eb0 20 6b 65 79 2c 20 74 68 65 20 0a 20 20 20 20 20   key, the .     
14ec0 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61     ** SELECT sta
14ed0 74 65 6d 65 6e 74 20 69 73 3a 0a 20 20 20 20 20  tement is:.     
14ee0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
14ef0 20 20 20 53 45 4c 45 43 54 20 3c 63 6f 6c 73 3e     SELECT <cols>
14f00 2c 20 72 62 75 5f 63 6f 6e 74 72 6f 6c 2c 20 72  , rbu_control, r
14f10 62 75 5f 72 6f 77 69 64 20 46 52 4f 4d 20 2e 2e  bu_rowid FROM ..
14f20 2e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  ...        **.  
14f30 20 20 20 20 20 20 2a 2a 20 48 65 6e 63 65 20 63        ** Hence c
14f40 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28 70 49 74 65  olumn_value(pIte
14f50 72 2d 3e 6e 43 6f 6c 2b 31 29 2e 0a 20 20 20 20  r->nCol+1)..    
14f60 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61      */.        a
14f70 73 73 65 72 74 43 6f 6c 75 6d 6e 4e 61 6d 65 28  ssertColumnName(
14f80 70 49 74 65 72 2d 3e 70 53 65 6c 65 63 74 2c 20  pIter->pSelect, 
14f90 70 49 74 65 72 2d 3e 6e 43 6f 6c 2b 31 2c 20 22  pIter->nCol+1, "
14fa0 72 62 75 5f 72 6f 77 69 64 22 29 3b 0a 20 20 20  rbu_rowid");.   
14fb0 20 20 20 20 20 70 56 61 6c 20 3d 20 73 71 6c 69       pVal = sqli
14fc0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65  te3_column_value
14fd0 28 70 49 74 65 72 2d 3e 70 53 65 6c 65 63 74 2c  (pIter->pSelect,
14fe0 20 70 49 74 65 72 2d 3e 6e 43 6f 6c 2b 31 29 3b   pIter->nCol+1);
14ff0 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  .        p->rc =
15000 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 76 61   sqlite3_bind_va
15010 6c 75 65 28 70 57 72 69 74 65 72 2c 20 70 49 74  lue(pWriter, pIt
15020 65 72 2d 3e 6e 43 6f 6c 2b 31 2c 20 70 56 61 6c  er->nCol+1, pVal
15030 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
15040 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
15050 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
15060 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 57   sqlite3_step(pW
15070 72 69 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20  riter);.        
15080 70 2d 3e 72 63 20 3d 20 72 65 73 65 74 41 6e 64  p->rc = resetAnd
15090 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 57 72  CollectError(pWr
150a0 69 74 65 72 2c 20 26 70 2d 3e 7a 45 72 72 6d 73  iter, &p->zErrms
150b0 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
150c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
150d0 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c  ite3_value *pVal
150e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
150f0 73 74 6d 74 20 2a 70 55 70 64 61 74 65 20 3d 20  stmt *pUpdate = 
15100 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  0;.      assert(
15110 20 65 54 79 70 65 3d 3d 52 42 55 5f 55 50 44 41   eType==RBU_UPDA
15120 54 45 20 29 3b 0a 20 20 20 20 20 20 72 62 75 47  TE );.      rbuG
15130 65 74 55 70 64 61 74 65 53 74 6d 74 28 70 2c 20  etUpdateStmt(p, 
15140 70 49 74 65 72 2c 20 7a 4d 61 73 6b 2c 20 26 70  pIter, zMask, &p
15150 55 70 64 61 74 65 29 3b 0a 20 20 20 20 20 20 69  Update);.      i
15160 66 28 20 70 55 70 64 61 74 65 20 29 7b 0a 20 20  f( pUpdate ){.  
15170 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 70        for(i=0; p
15180 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
15190 26 26 20 69 3c 70 49 74 65 72 2d 3e 6e 43 6f 6c  && i<pIter->nCol
151a0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
151b0 20 20 63 68 61 72 20 63 20 3d 20 7a 4d 61 73 6b    char c = zMask
151c0 5b 70 49 74 65 72 2d 3e 61 69 53 72 63 4f 72 64  [pIter->aiSrcOrd
151d0 65 72 5b 69 5d 5d 3b 0a 20 20 20 20 20 20 20 20  er[i]];.        
151e0 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33    pVal = sqlite3
151f0 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28 70 49  _column_value(pI
15200 74 65 72 2d 3e 70 53 65 6c 65 63 74 2c 20 69 29  ter->pSelect, i)
15210 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
15220 70 49 74 65 72 2d 3e 61 62 54 62 6c 50 6b 5b 69  pIter->abTblPk[i
15230 5d 20 7c 7c 20 63 21 3d 27 2e 27 20 29 7b 0a 20  ] || c!='.' ){. 
15240 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63             p->rc
15250 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f   = sqlite3_bind_
15260 76 61 6c 75 65 28 70 55 70 64 61 74 65 2c 20 69  value(pUpdate, i
15270 2b 31 2c 20 70 56 61 6c 29 3b 0a 20 20 20 20 20  +1, pVal);.     
15280 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
15290 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
152a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a 20  rc==SQLITE_OK . 
152b0 20 20 20 20 20 20 20 20 26 26 20 28 70 49 74 65          && (pIte
152c0 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b  r->eType==RBU_PK
152d0 5f 56 54 41 42 20 7c 7c 20 70 49 74 65 72 2d 3e  _VTAB || pIter->
152e0 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 4e 4f  eType==RBU_PK_NO
152f0 4e 45 29 20 0a 20 20 20 20 20 20 20 20 29 7b 0a  NE) .        ){.
15300 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 6e            /* Bin
15310 64 20 74 68 65 20 72 62 75 5f 72 6f 77 69 64 20  d the rbu_rowid 
15320 76 61 6c 75 65 20 74 6f 20 63 6f 6c 75 6d 6e 20  value to column 
15330 5f 72 6f 77 69 64 5f 20 2a 2f 0a 20 20 20 20 20  _rowid_ */.     
15340 20 20 20 20 20 61 73 73 65 72 74 43 6f 6c 75 6d       assertColum
15350 6e 4e 61 6d 65 28 70 49 74 65 72 2d 3e 70 53 65  nName(pIter->pSe
15360 6c 65 63 74 2c 20 70 49 74 65 72 2d 3e 6e 43 6f  lect, pIter->nCo
15370 6c 2b 31 2c 20 22 72 62 75 5f 72 6f 77 69 64 22  l+1, "rbu_rowid"
15380 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 56 61  );.          pVa
15390 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  l = sqlite3_colu
153a0 6d 6e 5f 76 61 6c 75 65 28 70 49 74 65 72 2d 3e  mn_value(pIter->
153b0 70 53 65 6c 65 63 74 2c 20 70 49 74 65 72 2d 3e  pSelect, pIter->
153c0 6e 43 6f 6c 2b 31 29 3b 0a 20 20 20 20 20 20 20  nCol+1);.       
153d0 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74     p->rc = sqlit
153e0 65 33 5f 62 69 6e 64 5f 76 61 6c 75 65 28 70 55  e3_bind_value(pU
153f0 70 64 61 74 65 2c 20 70 49 74 65 72 2d 3e 6e 43  pdate, pIter->nC
15400 6f 6c 2b 31 2c 20 70 56 61 6c 29 3b 0a 20 20 20  ol+1, pVal);.   
15410 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
15420 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
15430 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
15440 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 55   sqlite3_step(pU
15450 70 64 61 74 65 29 3b 0a 20 20 20 20 20 20 20 20  pdate);.        
15460 20 20 70 2d 3e 72 63 20 3d 20 72 65 73 65 74 41    p->rc = resetA
15470 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70  ndCollectError(p
15480 55 70 64 61 74 65 2c 20 26 70 2d 3e 7a 45 72 72  Update, &p->zErr
15490 6d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  msg);.        }.
154a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
154b0 7d 0a 0a 20 73 74 65 70 5f 6f 75 74 3a 0a 20 20  }.. step_out:.  
154c0 72 65 74 75 72 6e 20 70 2d 3e 72 63 3b 0a 7d 0a  return p->rc;.}.
154d0 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74  ./*.** Increment
154e0 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b   the schema cook
154f0 69 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 64  ie of the main d
15500 61 74 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62  atabase opened b
15510 79 20 70 2d 3e 64 62 4d 61 69 6e 2e 0a 2a 2f 0a  y p->dbMain..*/.
15520 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75 49  static void rbuI
15530 6e 63 72 53 63 68 65 6d 61 43 6f 6f 6b 69 65 28  ncrSchemaCookie(
15540 73 71 6c 69 74 65 33 72 62 75 20 2a 70 29 7b 0a  sqlite3rbu *p){.
15550 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
15560 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e  ITE_OK ){.    in
15570 74 20 69 43 6f 6f 6b 69 65 20 3d 20 31 30 30 30  t iCookie = 1000
15580 30 30 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  000;.    sqlite3
15590 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20  _stmt *pStmt;.. 
155a0 20 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61     p->rc = prepa
155b0 72 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f  reAndCollectErro
155c0 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 70 53  r(p->dbMain, &pS
155d0 74 6d 74 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67  tmt, &p->zErrmsg
155e0 2c 20 0a 20 20 20 20 20 20 20 20 22 50 52 41 47  , .        "PRAG
155f0 4d 41 20 73 63 68 65 6d 61 5f 76 65 72 73 69 6f  MA schema_versio
15600 6e 22 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  n".    );.    if
15610 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
15620 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43  OK ){.      /* C
15630 6f 76 65 72 61 67 65 3a 20 69 74 20 6d 61 79 20  overage: it may 
15640 62 65 20 74 68 61 74 20 74 68 69 73 20 73 71 6c  be that this sql
15650 69 74 65 33 5f 73 74 65 70 28 29 20 63 61 6e 6e  ite3_step() cann
15660 6f 74 20 66 61 69 6c 2e 20 54 68 65 72 65 0a 20  ot fail. There. 
15670 20 20 20 20 20 2a 2a 20 69 73 20 61 6c 72 65 61       ** is alrea
15680 64 79 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  dy a transaction
15690 20 6f 70 65 6e 2c 20 73 6f 20 74 68 65 20 70 72   open, so the pr
156a0 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
156b0 20 63 61 6e 6e 6f 74 0a 20 20 20 20 20 20 2a 2a   cannot.      **
156c0 20 74 68 72 6f 77 20 61 6e 20 53 51 4c 49 54 45   throw an SQLITE
156d0 5f 53 43 48 45 4d 41 20 65 78 63 65 70 74 69 6f  _SCHEMA exceptio
156e0 6e 2e 20 54 68 65 20 6f 6e 6c 79 20 64 61 74 61  n. The only data
156f0 62 61 73 65 20 70 61 67 65 20 74 68 65 0a 20 20  base page the.  
15700 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
15710 20 72 65 61 64 73 20 69 73 20 70 61 67 65 20 31   reads is page 1
15720 2c 20 77 68 69 63 68 20 69 73 20 67 75 61 72 61  , which is guara
15730 6e 74 65 65 64 20 74 6f 20 62 65 20 69 6e 20 74  nteed to be in t
15740 68 65 20 63 61 63 68 65 2e 0a 20 20 20 20 20 20  he cache..      
15750 2a 2a 20 41 6e 64 20 6e 6f 20 6d 65 6d 6f 72 79  ** And no memory
15760 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 61 72 65   allocations are
15770 20 72 65 71 75 69 72 65 64 2e 20 20 2a 2f 0a 20   required.  */. 
15780 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f       if( SQLITE_
15790 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW==sqlite3_ste
157a0 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20  p(pStmt) ){.    
157b0 20 20 20 20 69 43 6f 6f 6b 69 65 20 3d 20 73 71      iCookie = sq
157c0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
157d0 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  (pStmt, 0);.    
157e0 20 20 7d 0a 20 20 20 20 20 20 72 62 75 46 69 6e    }.      rbuFin
157f0 61 6c 69 7a 65 28 70 2c 20 70 53 74 6d 74 29 3b  alize(p, pStmt);
15800 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
15810 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
15820 29 7b 0a 20 20 20 20 20 20 72 62 75 4d 50 72 69  ){.      rbuMPri
15830 6e 74 66 45 78 65 63 28 70 2c 20 70 2d 3e 64 62  ntfExec(p, p->db
15840 4d 61 69 6e 2c 20 22 50 52 41 47 4d 41 20 73 63  Main, "PRAGMA sc
15850 68 65 6d 61 5f 76 65 72 73 69 6f 6e 20 3d 20 25  hema_version = %
15860 64 22 2c 20 69 43 6f 6f 6b 69 65 2b 31 29 3b 0a  d", iCookie+1);.
15870 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
15880 2a 2a 20 55 70 64 61 74 65 20 74 68 65 20 63 6f  ** Update the co
15890 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 72 62  ntents of the rb
158a0 75 5f 73 74 61 74 65 20 74 61 62 6c 65 20 77 69  u_state table wi
158b0 74 68 69 6e 20 74 68 65 20 72 62 75 20 64 61 74  thin the rbu dat
158c0 61 62 61 73 65 2e 20 54 68 65 0a 2a 2a 20 76 61  abase. The.** va
158d0 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68  lue stored in th
158e0 65 20 52 42 55 5f 53 54 41 54 45 5f 53 54 41 47  e RBU_STATE_STAG
158f0 45 20 63 6f 6c 75 6d 6e 20 69 73 20 65 53 74 61  E column is eSta
15900 67 65 2e 20 41 6c 6c 20 6f 74 68 65 72 20 76 61  ge. All other va
15910 6c 75 65 73 0a 2a 2a 20 61 72 65 20 64 65 74 65  lues.** are dete
15920 72 6d 69 6e 65 64 20 62 79 20 69 6e 73 70 65 63  rmined by inspec
15930 74 69 6e 67 20 74 68 65 20 72 62 75 20 68 61 6e  ting the rbu han
15940 64 6c 65 20 70 61 73 73 65 64 20 61 73 20 74 68  dle passed as th
15950 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
15960 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
15970 20 72 62 75 53 61 76 65 53 74 61 74 65 28 73 71   rbuSaveState(sq
15980 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 69 6e 74  lite3rbu *p, int
15990 20 65 53 74 61 67 65 29 7b 0a 20 20 69 66 28 20   eStage){.  if( 
159a0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
159b0 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54   || p->rc==SQLIT
159c0 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 73 71  E_DONE ){.    sq
159d0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 49 6e 73  lite3_stmt *pIns
159e0 65 72 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  ert = 0;.    int
159f0 20 72 63 3b 0a 0a 20 20 20 20 61 73 73 65 72 74   rc;..    assert
15a00 28 20 70 2d 3e 7a 45 72 72 6d 73 67 3d 3d 30 20  ( p->zErrmsg==0 
15a10 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 72 65 70  );.    rc = prep
15a20 61 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63  areFreeAndCollec
15a30 74 45 72 72 6f 72 28 70 2d 3e 64 62 52 62 75 2c  tError(p->dbRbu,
15a40 20 26 70 49 6e 73 65 72 74 2c 20 26 70 2d 3e 7a   &pInsert, &p->z
15a50 45 72 72 6d 73 67 2c 20 0a 20 20 20 20 20 20 20  Errmsg, .       
15a60 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
15a70 28 0a 20 20 20 20 20 20 20 20 20 20 22 49 4e 53  (.          "INS
15a80 45 52 54 20 4f 52 20 52 45 50 4c 41 43 45 20 49  ERT OR REPLACE I
15a90 4e 54 4f 20 25 73 2e 72 62 75 5f 73 74 61 74 65  NTO %s.rbu_state
15aa0 28 6b 2c 20 76 29 20 56 41 4c 55 45 53 20 22 0a  (k, v) VALUES ".
15ab0 20 20 20 20 20 20 20 20 20 20 22 28 25 64 2c 20            "(%d, 
15ac0 25 64 29 2c 20 22 0a 20 20 20 20 20 20 20 20 20  %d), ".         
15ad0 20 22 28 25 64 2c 20 25 51 29 2c 20 22 0a 20 20   "(%d, %Q), ".  
15ae0 20 20 20 20 20 20 20 20 22 28 25 64 2c 20 25 51          "(%d, %Q
15af0 29 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 22  ), ".          "
15b00 28 25 64 2c 20 25 64 29 2c 20 22 0a 20 20 20 20  (%d, %d), ".    
15b10 20 20 20 20 20 20 22 28 25 64 2c 20 25 64 29 2c        "(%d, %d),
15b20 20 22 0a 20 20 20 20 20 20 20 20 20 20 22 28 25   ".          "(%
15b30 64 2c 20 25 6c 6c 64 29 2c 20 22 0a 20 20 20 20  d, %lld), ".    
15b40 20 20 20 20 20 20 22 28 25 64 2c 20 25 6c 6c 64        "(%d, %lld
15b50 29 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 22  ), ".          "
15b60 28 25 64 2c 20 25 6c 6c 64 29 20 22 2c 0a 20 20  (%d, %lld) ",.  
15b70 20 20 20 20 20 20 20 20 70 2d 3e 7a 53 74 61 74          p->zStat
15b80 65 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 52  eDb,.          R
15b90 42 55 5f 53 54 41 54 45 5f 53 54 41 47 45 2c 20  BU_STATE_STAGE, 
15ba0 65 53 74 61 67 65 2c 0a 20 20 20 20 20 20 20 20  eStage,.        
15bb0 20 20 52 42 55 5f 53 54 41 54 45 5f 54 42 4c 2c    RBU_STATE_TBL,
15bc0 20 70 2d 3e 6f 62 6a 69 74 65 72 2e 7a 54 62 6c   p->objiter.zTbl
15bd0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 52 42 55  , .          RBU
15be0 5f 53 54 41 54 45 5f 49 44 58 2c 20 70 2d 3e 6f  _STATE_IDX, p->o
15bf0 62 6a 69 74 65 72 2e 7a 49 64 78 2c 20 0a 20 20  bjiter.zIdx, .  
15c00 20 20 20 20 20 20 20 20 52 42 55 5f 53 54 41 54          RBU_STAT
15c10 45 5f 52 4f 57 2c 20 70 2d 3e 6e 53 74 65 70 2c  E_ROW, p->nStep,
15c20 20 0a 20 20 20 20 20 20 20 20 20 20 52 42 55 5f   .          RBU_
15c30 53 54 41 54 45 5f 50 52 4f 47 52 45 53 53 2c 20  STATE_PROGRESS, 
15c40 70 2d 3e 6e 50 72 6f 67 72 65 73 73 2c 0a 20 20  p->nProgress,.  
15c50 20 20 20 20 20 20 20 20 52 42 55 5f 53 54 41 54          RBU_STAT
15c60 45 5f 43 4b 50 54 2c 20 70 2d 3e 69 57 61 6c 43  E_CKPT, p->iWalC
15c70 6b 73 75 6d 2c 0a 20 20 20 20 20 20 20 20 20 20  ksum,.          
15c80 52 42 55 5f 53 54 41 54 45 5f 43 4f 4f 4b 49 45  RBU_STATE_COOKIE
15c90 2c 20 28 69 36 34 29 70 2d 3e 70 54 61 72 67 65  , (i64)p->pTarge
15ca0 74 46 64 2d 3e 69 43 6f 6f 6b 69 65 2c 0a 20 20  tFd->iCookie,.  
15cb0 20 20 20 20 20 20 20 20 52 42 55 5f 53 54 41 54          RBU_STAT
15cc0 45 5f 4f 41 4c 53 5a 2c 20 70 2d 3e 69 4f 61 6c  E_OALSZ, p->iOal
15cd0 53 7a 0a 20 20 20 20 20 20 29 0a 20 20 20 20 29  Sz.      ).    )
15ce0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
15cf0 6e 73 65 72 74 3d 3d 30 20 7c 7c 20 72 63 3d 3d  nsert==0 || rc==
15d00 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20  SQLITE_OK );..  
15d10 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
15d20 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
15d30 69 74 65 33 5f 73 74 65 70 28 70 49 6e 73 65 72  ite3_step(pInser
15d40 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  t);.      rc = s
15d50 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
15d60 70 49 6e 73 65 72 74 29 3b 0a 20 20 20 20 7d 0a  pInsert);.    }.
15d70 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
15d80 54 45 5f 4f 4b 20 29 20 70 2d 3e 72 63 20 3d 20  TE_OK ) p->rc = 
15d90 72 63 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a  rc;.  }.}.../*.*
15da0 2a 20 53 74 65 70 20 74 68 65 20 52 42 55 20 6f  * Step the RBU o
15db0 62 6a 65 63 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  bject..*/.int sq
15dc0 6c 69 74 65 33 72 62 75 5f 73 74 65 70 28 73 71  lite3rbu_step(sq
15dd0 6c 69 74 65 33 72 62 75 20 2a 70 29 7b 0a 20 20  lite3rbu *p){.  
15de0 69 66 28 20 70 20 29 7b 0a 20 20 20 20 73 77 69  if( p ){.    swi
15df0 74 63 68 28 20 70 2d 3e 65 53 74 61 67 65 20 29  tch( p->eStage )
15e00 7b 0a 20 20 20 20 20 20 63 61 73 65 20 52 42 55  {.      case RBU
15e10 5f 53 54 41 47 45 5f 4f 41 4c 3a 20 7b 0a 20 20  _STAGE_OAL: {.  
15e20 20 20 20 20 20 20 52 62 75 4f 62 6a 49 74 65 72        RbuObjIter
15e30 20 2a 70 49 74 65 72 20 3d 20 26 70 2d 3e 6f 62   *pIter = &p->ob
15e40 6a 69 74 65 72 3b 0a 20 20 20 20 20 20 20 20 77  jiter;.        w
15e50 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  hile( p->rc==SQL
15e60 49 54 45 5f 4f 4b 20 26 26 20 70 49 74 65 72 2d  ITE_OK && pIter-
15e70 3e 7a 54 62 6c 20 29 7b 0a 0a 20 20 20 20 20 20  >zTbl ){..      
15e80 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 62      if( pIter->b
15e90 43 6c 65 61 6e 75 70 20 29 7b 0a 20 20 20 20 20  Cleanup ){.     
15ea0 20 20 20 20 20 20 20 2f 2a 20 43 6c 65 61 6e 20         /* Clean 
15eb0 75 70 20 74 68 65 20 72 62 75 5f 74 6d 70 5f 78  up the rbu_tmp_x
15ec0 78 78 20 74 61 62 6c 65 20 66 6f 72 20 74 68 65  xx table for the
15ed0 20 70 72 65 76 69 6f 75 73 20 74 61 62 6c 65 2e   previous table.
15ee0 20 49 74 20 0a 20 20 20 20 20 20 20 20 20 20 20   It .           
15ef0 20 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 64 72   ** cannot be dr
15f00 6f 70 70 65 64 20 61 73 20 74 68 65 72 65 20 61  opped as there a
15f10 72 65 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74  re currently act
15f20 69 76 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  ive SQL statemen
15f30 74 73 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ts..            
15f40 2a 2a 20 42 75 74 20 74 68 65 20 63 6f 6e 74 65  ** But the conte
15f50 6e 74 73 20 63 61 6e 20 62 65 20 64 65 6c 65 74  nts can be delet
15f60 65 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ed.  */.        
15f70 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 61      if( pIter->a
15f80 62 49 6e 64 65 78 65 64 20 29 7b 0a 20 20 20 20  bIndexed ){.    
15f90 20 20 20 20 20 20 20 20 20 20 72 62 75 4d 50 72            rbuMPr
15fa0 69 6e 74 66 45 78 65 63 28 70 2c 20 70 2d 3e 64  intfExec(p, p->d
15fb0 62 52 62 75 2c 20 0a 20 20 20 20 20 20 20 20 20  bRbu, .         
15fc0 20 20 20 20 20 20 20 20 20 22 44 45 4c 45 54 45           "DELETE
15fd0 20 46 52 4f 4d 20 25 73 2e 27 72 62 75 5f 74 6d   FROM %s.'rbu_tm
15fe0 70 5f 25 71 27 22 2c 20 70 2d 3e 7a 53 74 61 74  p_%q'", p->zStat
15ff0 65 44 62 2c 20 70 49 74 65 72 2d 3e 7a 44 61 74  eDb, pIter->zDat
16000 61 54 62 6c 0a 20 20 20 20 20 20 20 20 20 20 20  aTbl.           
16010 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20     );.          
16020 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65    }.          }e
16030 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
16040 20 72 62 75 4f 62 6a 49 74 65 72 50 72 65 70 61   rbuObjIterPrepa
16050 72 65 41 6c 6c 28 70 2c 20 70 49 74 65 72 2c 20  reAll(p, pIter, 
16060 30 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20  0);..           
16070 20 2f 2a 20 41 64 76 61 6e 63 65 20 74 6f 20 74   /* Advance to t
16080 68 65 20 6e 65 78 74 20 72 6f 77 20 74 6f 20 70  he next row to p
16090 72 6f 63 65 73 73 2e 20 2a 2f 0a 20 20 20 20 20  rocess. */.     
160a0 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63         if( p->rc
160b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
160c0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74               int
160d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74   rc = sqlite3_st
160e0 65 70 28 70 49 74 65 72 2d 3e 70 53 65 6c 65 63  ep(pIter->pSelec
160f0 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
16100 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
16110 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 20 20  _ROW ){.        
16120 20 20 20 20 20 20 20 20 70 2d 3e 6e 50 72 6f 67          p->nProg
16130 72 65 73 73 2b 2b 3b 0a 20 20 20 20 20 20 20 20  ress++;.        
16140 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 74 65 70          p->nStep
16150 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
16160 20 20 20 20 72 65 74 75 72 6e 20 72 62 75 53 74      return rbuSt
16170 65 70 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20  ep(p);.         
16180 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
16190 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c       p->rc = sql
161a0 69 74 65 33 5f 72 65 73 65 74 28 70 49 74 65 72  ite3_reset(pIter
161b0 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  ->pSelect);.    
161c0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 74            p->nSt
161d0 65 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ep = 0;.        
161e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
161f0 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 72 62 75  }..          rbu
16200 4f 62 6a 49 74 65 72 4e 65 78 74 28 70 2c 20 70  ObjIterNext(p, p
16210 49 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  Iter);.        }
16220 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  ..        if( p-
16230 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
16240 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
16250 72 74 28 20 70 49 74 65 72 2d 3e 7a 54 62 6c 3d  rt( pIter->zTbl=
16260 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
16270 72 62 75 53 61 76 65 53 74 61 74 65 28 70 2c 20  rbuSaveState(p, 
16280 52 42 55 5f 53 54 41 47 45 5f 4d 4f 56 45 29 3b  RBU_STAGE_MOVE);
16290 0a 20 20 20 20 20 20 20 20 20 20 72 62 75 49 6e  .          rbuIn
162a0 63 72 53 63 68 65 6d 61 43 6f 6f 6b 69 65 28 70  crSchemaCookie(p
162b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
162c0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
162d0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
162e0 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33   p->rc = sqlite3
162f0 5f 65 78 65 63 28 70 2d 3e 64 62 4d 61 69 6e 2c  _exec(p->dbMain,
16300 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 2c   "COMMIT", 0, 0,
16310 20 26 70 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a 20   &p->zErrmsg);. 
16320 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
16330 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
16340 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16350 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d           p->rc =
16360 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d   sqlite3_exec(p-
16370 3e 64 62 52 62 75 2c 20 22 43 4f 4d 4d 49 54 22  >dbRbu, "COMMIT"
16380 2c 20 30 2c 20 30 2c 20 26 70 2d 3e 7a 45 72 72  , 0, 0, &p->zErr
16390 6d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  msg);.          
163a0 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 65  }.          p->e
163b0 53 74 61 67 65 20 3d 20 52 42 55 5f 53 54 41 47  Stage = RBU_STAG
163c0 45 5f 4d 4f 56 45 3b 0a 20 20 20 20 20 20 20 20  E_MOVE;.        
163d0 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  }.        break;
163e0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
163f0 63 61 73 65 20 52 42 55 5f 53 54 41 47 45 5f 4d  case RBU_STAGE_M
16400 4f 56 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 69  OVE: {.        i
16410 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
16420 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
16430 20 72 62 75 4d 6f 76 65 4f 61 6c 46 69 6c 65 28   rbuMoveOalFile(
16440 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d  p);.          p-
16450 3e 6e 50 72 6f 67 72 65 73 73 2b 2b 3b 0a 20 20  >nProgress++;.  
16460 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
16470 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a  break;.      }..
16480 20 20 20 20 20 20 63 61 73 65 20 52 42 55 5f 53        case RBU_S
16490 54 41 47 45 5f 43 4b 50 54 3a 20 7b 0a 20 20 20  TAGE_CKPT: {.   
164a0 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
164b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
164c0 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 53         if( p->nS
164d0 74 65 70 3e 3d 70 2d 3e 6e 46 72 61 6d 65 20 29  tep>=p->nFrame )
164e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
164f0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 44 62 20  lite3_file *pDb 
16500 3d 20 70 2d 3e 70 54 61 72 67 65 74 46 64 2d 3e  = p->pTargetFd->
16510 70 52 65 61 6c 3b 0a 20 20 0a 20 20 20 20 20 20  pReal;.  .      
16520 20 20 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68        /* Sync th
16530 65 20 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20 20  e db file */.   
16540 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d           p->rc =
16550 20 70 44 62 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e   pDb->pMethods->
16560 78 53 79 6e 63 28 70 44 62 2c 20 53 51 4c 49 54  xSync(pDb, SQLIT
16570 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a  E_SYNC_NORMAL);.
16580 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f    .            /
16590 2a 20 55 70 64 61 74 65 20 6e 42 61 63 6b 66 69  * Update nBackfi
165a0 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ll */.          
165b0 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
165c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
165d0 20 20 20 20 20 20 20 20 76 6f 69 64 20 76 6f 6c          void vol
165e0 61 74 69 6c 65 20 2a 70 74 72 3b 0a 20 20 20 20  atile *ptr;.    
165f0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20            p->rc 
16600 3d 20 70 44 62 2d 3e 70 4d 65 74 68 6f 64 73 2d  = pDb->pMethods-
16610 3e 78 53 68 6d 4d 61 70 28 70 44 62 2c 20 30 2c  >xShmMap(pDb, 0,
16620 20 33 32 2a 31 30 32 34 2c 20 30 2c 20 26 70 74   32*1024, 0, &pt
16630 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  r);.            
16640 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
16650 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
16660 20 20 20 20 20 20 20 20 20 20 28 28 75 33 32 20            ((u32 
16670 76 6f 6c 61 74 69 6c 65 2a 29 70 74 72 29 5b 32  volatile*)ptr)[2
16680 34 5d 20 3d 20 70 2d 3e 69 4d 61 78 46 72 61 6d  4] = p->iMaxFram
16690 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
166a0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
166b0 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  .  .            
166c0 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
166d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
166e0 20 20 20 20 20 20 70 2d 3e 65 53 74 61 67 65 20        p->eStage 
166f0 3d 20 52 42 55 5f 53 54 41 47 45 5f 44 4f 4e 45  = RBU_STAGE_DONE
16700 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
16710 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 44  p->rc = SQLITE_D
16720 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ONE;.           
16730 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c   }.          }el
16740 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
16750 52 62 75 46 72 61 6d 65 20 2a 70 46 72 61 6d 65  RbuFrame *pFrame
16760 20 3d 20 26 70 2d 3e 61 46 72 61 6d 65 5b 70 2d   = &p->aFrame[p-
16770 3e 6e 53 74 65 70 5d 3b 0a 20 20 20 20 20 20 20  >nStep];.       
16780 20 20 20 20 20 72 62 75 43 68 65 63 6b 70 6f 69       rbuCheckpoi
16790 6e 74 46 72 61 6d 65 28 70 2c 20 70 46 72 61 6d  ntFrame(p, pFram
167a0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
167b0 70 2d 3e 6e 53 74 65 70 2b 2b 3b 0a 20 20 20 20  p->nStep++;.    
167c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
167d0 20 20 70 2d 3e 6e 50 72 6f 67 72 65 73 73 2b 2b    p->nProgress++
167e0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
167f0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
16800 20 7d 0a 0a 20 20 20 20 20 20 64 65 66 61 75 6c   }..      defaul
16810 74 3a 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  t:.        break
16820 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
16830 72 6e 20 70 2d 3e 72 63 3b 0a 20 20 7d 65 6c 73  rn p->rc;.  }els
16840 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  e{.    return SQ
16850 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
16860 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e  }../*.** Free an
16870 20 52 62 75 53 74 61 74 65 20 6f 62 6a 65 63 74   RbuState object
16880 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 72 62   allocated by rb
16890 75 4c 6f 61 64 53 74 61 74 65 28 29 2e 0a 2a 2f  uLoadState()..*/
168a0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75  .static void rbu
168b0 46 72 65 65 53 74 61 74 65 28 52 62 75 53 74 61  FreeState(RbuSta
168c0 74 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20  te *p){.  if( p 
168d0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
168e0 72 65 65 28 70 2d 3e 7a 54 62 6c 29 3b 0a 20 20  ree(p->zTbl);.  
168f0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
16900 2d 3e 7a 49 64 78 29 3b 0a 20 20 20 20 73 71 6c  ->zIdx);.    sql
16910 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
16920 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  }.}../*.** Alloc
16930 61 74 65 20 61 6e 20 52 62 75 53 74 61 74 65 20  ate an RbuState 
16940 6f 62 6a 65 63 74 20 61 6e 64 20 6c 6f 61 64 20  object and load 
16950 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
16960 74 68 65 20 72 62 75 5f 73 74 61 74 65 20 0a 2a  the rbu_state .*
16970 2a 20 74 61 62 6c 65 20 69 6e 74 6f 20 69 74 2e  * table into it.
16980 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
16990 72 20 74 6f 20 74 68 65 20 6e 65 77 20 6f 62 6a  r to the new obj
169a0 65 63 74 2e 20 49 74 20 69 73 20 74 68 65 20 0a  ect. It is the .
169b0 2a 2a 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  ** responsibilit
169c0 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20  y of the caller 
169d0 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72  to eventually fr
169e0 65 65 20 74 68 65 20 6f 62 6a 65 63 74 20 75 73  ee the object us
169f0 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66  ing.** sqlite3_f
16a00 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ree()..**.** If 
16a10 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
16a20 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
16a30 63 6f 64 65 20 61 6e 64 20 6d 65 73 73 61 67 65  code and message
16a40 20 69 6e 20 74 68 65 20 72 62 75 20 68 61 6e 64   in the rbu hand
16a50 6c 65 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e  le.** and return
16a60 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63   NULL..*/.static
16a70 20 52 62 75 53 74 61 74 65 20 2a 72 62 75 4c 6f   RbuState *rbuLo
16a80 61 64 53 74 61 74 65 28 73 71 6c 69 74 65 33 72  adState(sqlite3r
16a90 62 75 20 2a 70 29 7b 0a 20 20 52 62 75 53 74 61  bu *p){.  RbuSta
16aa0 74 65 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20  te *pRet = 0;.  
16ab0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
16ac0 74 6d 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  tmt = 0;.  int r
16ad0 63 3b 0a 20 20 69 6e 74 20 72 63 32 3b 0a 0a 20  c;.  int rc2;.. 
16ae0 20 70 52 65 74 20 3d 20 28 52 62 75 53 74 61 74   pRet = (RbuStat
16af0 65 2a 29 72 62 75 4d 61 6c 6c 6f 63 28 70 2c 20  e*)rbuMalloc(p, 
16b00 73 69 7a 65 6f 66 28 52 62 75 53 74 61 74 65 29  sizeof(RbuState)
16b10 29 3b 0a 20 20 69 66 28 20 70 52 65 74 3d 3d 30  );.  if( pRet==0
16b20 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
16b30 72 63 20 3d 20 70 72 65 70 61 72 65 46 72 65 65  rc = prepareFree
16b40 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28  AndCollectError(
16b50 70 2d 3e 64 62 52 62 75 2c 20 26 70 53 74 6d 74  p->dbRbu, &pStmt
16b60 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 20 0a  , &p->zErrmsg, .
16b70 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70        sqlite3_mp
16b80 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20 6b 2c  rintf("SELECT k,
16b90 20 76 20 46 52 4f 4d 20 25 73 2e 72 62 75 5f 73   v FROM %s.rbu_s
16ba0 74 61 74 65 22 2c 20 70 2d 3e 7a 53 74 61 74 65  tate", p->zState
16bb0 44 62 29 0a 20 20 29 3b 0a 20 20 77 68 69 6c 65  Db).  );.  while
16bc0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
16bd0 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  && SQLITE_ROW==s
16be0 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
16bf0 74 29 20 29 7b 0a 20 20 20 20 73 77 69 74 63 68  t) ){.    switch
16c00 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  ( sqlite3_column
16c10 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30 29 20 29  _int(pStmt, 0) )
16c20 7b 0a 20 20 20 20 20 20 63 61 73 65 20 52 42 55  {.      case RBU
16c30 5f 53 54 41 54 45 5f 53 54 41 47 45 3a 0a 20 20  _STATE_STAGE:.  
16c40 20 20 20 20 20 20 70 52 65 74 2d 3e 65 53 74 61        pRet->eSta
16c50 67 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ge = sqlite3_col
16c60 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 31  umn_int(pStmt, 1
16c70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
16c80 52 65 74 2d 3e 65 53 74 61 67 65 21 3d 52 42 55  Ret->eStage!=RBU
16c90 5f 53 54 41 47 45 5f 4f 41 4c 0a 20 20 20 20 20  _STAGE_OAL.     
16ca0 20 20 20 20 26 26 20 70 52 65 74 2d 3e 65 53 74      && pRet->eSt
16cb0 61 67 65 21 3d 52 42 55 5f 53 54 41 47 45 5f 4d  age!=RBU_STAGE_M
16cc0 4f 56 45 0a 20 20 20 20 20 20 20 20 20 26 26 20  OVE.         && 
16cd0 70 52 65 74 2d 3e 65 53 74 61 67 65 21 3d 52 42  pRet->eStage!=RB
16ce0 55 5f 53 54 41 47 45 5f 43 4b 50 54 0a 20 20 20  U_STAGE_CKPT.   
16cf0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
16d00 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
16d10 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20  _CORRUPT;.      
16d20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
16d30 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20 52  k;..      case R
16d40 42 55 5f 53 54 41 54 45 5f 54 42 4c 3a 0a 20 20  BU_STATE_TBL:.  
16d50 20 20 20 20 20 20 70 52 65 74 2d 3e 7a 54 62 6c        pRet->zTbl
16d60 20 3d 20 72 62 75 53 74 72 6e 64 75 70 28 28 63   = rbuStrndup((c
16d70 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
16d80 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  umn_text(pStmt, 
16d90 31 29 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20  1), &rc);.      
16da0 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20    break;..      
16db0 63 61 73 65 20 52 42 55 5f 53 54 41 54 45 5f 49  case RBU_STATE_I
16dc0 44 58 3a 0a 20 20 20 20 20 20 20 20 70 52 65 74  DX:.        pRet
16dd0 2d 3e 7a 49 64 78 20 3d 20 72 62 75 53 74 72 6e  ->zIdx = rbuStrn
16de0 64 75 70 28 28 63 68 61 72 2a 29 73 71 6c 69 74  dup((char*)sqlit
16df0 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
16e00 53 74 6d 74 2c 20 31 29 2c 20 26 72 63 29 3b 0a  Stmt, 1), &rc);.
16e10 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a          break;..
16e20 20 20 20 20 20 20 63 61 73 65 20 52 42 55 5f 53        case RBU_S
16e30 54 41 54 45 5f 52 4f 57 3a 0a 20 20 20 20 20 20  TATE_ROW:.      
16e40 20 20 70 52 65 74 2d 3e 6e 52 6f 77 20 3d 20 73    pRet->nRow = s
16e50 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
16e60 74 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20  t(pStmt, 1);.   
16e70 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
16e80 20 20 20 63 61 73 65 20 52 42 55 5f 53 54 41 54     case RBU_STAT
16e90 45 5f 50 52 4f 47 52 45 53 53 3a 0a 20 20 20 20  E_PROGRESS:.    
16ea0 20 20 20 20 70 52 65 74 2d 3e 6e 50 72 6f 67 72      pRet->nProgr
16eb0 65 73 73 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  ess = sqlite3_co
16ec0 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74  lumn_int64(pStmt
16ed0 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 62 72  , 1);.        br
16ee0 65 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73 65  eak;..      case
16ef0 20 52 42 55 5f 53 54 41 54 45 5f 43 4b 50 54 3a   RBU_STATE_CKPT:
16f00 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e 69  .        pRet->i
16f10 57 61 6c 43 6b 73 75 6d 20 3d 20 73 71 6c 69 74  WalCksum = sqlit
16f20 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28  e3_column_int64(
16f30 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20 20  pStmt, 1);.     
16f40 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20     break;..     
16f50 20 63 61 73 65 20 52 42 55 5f 53 54 41 54 45 5f   case RBU_STATE_
16f60 43 4f 4f 4b 49 45 3a 0a 20 20 20 20 20 20 20 20  COOKIE:.        
16f70 70 52 65 74 2d 3e 69 43 6f 6f 6b 69 65 20 3d 20  pRet->iCookie = 
16f80 28 75 33 32 29 73 71 6c 69 74 65 33 5f 63 6f 6c  (u32)sqlite3_col
16f90 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c  umn_int64(pStmt,
16fa0 20 31 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65   1);.        bre
16fb0 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20  ak;..      case 
16fc0 52 42 55 5f 53 54 41 54 45 5f 4f 41 4c 53 5a 3a  RBU_STATE_OALSZ:
16fd0 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e 69  .        pRet->i
16fe0 4f 61 6c 53 7a 20 3d 20 28 75 33 32 29 73 71 6c  OalSz = (u32)sql
16ff0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36  ite3_column_int6
17000 34 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20  4(pStmt, 1);.   
17010 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
17020 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
17030 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
17040 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20  CORRUPT;.       
17050 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
17060 7d 0a 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65  }.  rc2 = sqlite
17070 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
17080 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
17090 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63  ITE_OK ) rc = rc
170a0 32 3b 0a 0a 20 20 70 2d 3e 72 63 20 3d 20 72 63  2;..  p->rc = rc
170b0 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b  ;.  return pRet;
170c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72  .}../*.** Compar
170d0 65 20 73 74 72 69 6e 67 73 20 7a 31 20 61 6e 64  e strings z1 and
170e0 20 7a 32 2c 20 72 65 74 75 72 6e 69 6e 67 20 30   z2, returning 0
170f0 20 69 66 20 74 68 65 79 20 61 72 65 20 69 64 65   if they are ide
17100 6e 74 69 63 61 6c 2c 20 6f 72 20 6e 6f 6e 2d 7a  ntical, or non-z
17110 65 72 6f 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65  ero.** otherwise
17120 2e 20 45 69 74 68 65 72 20 6f 72 20 62 6f 74 68  . Either or both
17130 20 61 72 67 75 6d 65 6e 74 20 6d 61 79 20 62 65   argument may be
17140 20 4e 55 4c 4c 2e 20 54 77 6f 20 4e 55 4c 4c 20   NULL. Two NULL 
17150 76 61 6c 75 65 73 20 61 72 65 0a 2a 2a 20 63 6f  values are.** co
17160 6e 73 69 64 65 72 65 64 20 65 71 75 61 6c 2c 20  nsidered equal, 
17170 61 6e 64 20 4e 55 4c 4c 20 69 73 20 63 6f 6e 73  and NULL is cons
17180 69 64 65 72 65 64 20 64 69 73 74 69 6e 63 74 20  idered distinct 
17190 66 72 6f 6d 20 61 6c 6c 20 6f 74 68 65 72 20 76  from all other v
171a0 61 6c 75 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  alues..*/.static
171b0 20 69 6e 74 20 72 62 75 53 74 72 43 6f 6d 70 61   int rbuStrCompa
171c0 72 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  re(const char *z
171d0 31 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  1, const char *z
171e0 32 29 7b 0a 20 20 69 66 28 20 7a 31 3d 3d 30 20  2){.  if( z1==0 
171f0 26 26 20 7a 32 3d 3d 30 20 29 20 72 65 74 75 72  && z2==0 ) retur
17200 6e 20 30 3b 0a 20 20 69 66 28 20 7a 31 3d 3d 30  n 0;.  if( z1==0
17210 20 7c 7c 20 7a 32 3d 3d 30 20 29 20 72 65 74 75   || z2==0 ) retu
17220 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 28  rn 1;.  return (
17230 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
17240 7a 31 2c 20 7a 32 29 21 3d 30 29 3b 0a 7d 0a 0a  z1, z2)!=0);.}..
17250 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
17260 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 73  ion is called as
17270 20 70 61 72 74 20 6f 66 20 73 71 6c 69 74 65 33   part of sqlite3
17280 72 62 75 5f 6f 70 65 6e 28 29 20 77 68 65 6e 20  rbu_open() when 
17290 69 6e 69 74 69 61 6c 69 7a 69 6e 67 0a 2a 2a 20  initializing.** 
172a0 61 6e 20 72 62 75 20 68 61 6e 64 6c 65 20 69 6e  an rbu handle in
172b0 20 4f 41 4c 20 73 74 61 67 65 2e 20 49 66 20 74   OAL stage. If t
172c0 68 65 20 72 62 75 20 75 70 64 61 74 65 20 68 61  he rbu update ha
172d0 73 20 6e 6f 74 20 73 74 61 72 74 65 64 20 28 69  s not started (i
172e0 2e 65 2e 0a 2a 2a 20 74 68 65 20 72 62 75 5f 73  .e..** the rbu_s
172f0 74 61 74 65 20 74 61 62 6c 65 20 77 61 73 20 65  tate table was e
17300 6d 70 74 79 29 20 69 74 20 69 73 20 61 20 6e 6f  mpty) it is a no
17310 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  -op. Otherwise, 
17320 69 74 20 61 72 72 61 6e 67 65 73 0a 2a 2a 20 74  it arranges.** t
17330 68 69 6e 67 73 20 73 6f 20 74 68 61 74 20 74 68  hings so that th
17340 65 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20 73  e next call to s
17350 71 6c 69 74 65 33 72 62 75 5f 73 74 65 70 28 29  qlite3rbu_step()
17360 20 63 6f 6e 74 69 6e 75 65 73 20 6f 6e 20 66 72   continues on fr
17370 6f 6d 0a 2a 2a 20 77 68 65 72 65 20 74 68 65 20  om.** where the 
17380 70 72 65 76 69 6f 75 73 20 72 62 75 20 68 61 6e  previous rbu han
17390 64 6c 65 20 6c 65 66 74 20 6f 66 66 2e 0a 2a 2a  dle left off..**
173a0 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
173b0 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72  occurs, an error
173c0 20 63 6f 64 65 20 61 6e 64 20 65 72 72 6f 72 20   code and error 
173d0 6d 65 73 73 61 67 65 20 61 72 65 20 6c 65 66 74  message are left
173e0 20 69 6e 20 74 68 65 0a 2a 2a 20 72 62 75 20 68   in the.** rbu h
173f0 61 6e 64 6c 65 20 70 61 73 73 65 64 20 61 73 20  andle passed as 
17400 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
17410 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nt..*/.static vo
17420 69 64 20 72 62 75 53 65 74 75 70 4f 61 6c 28 73  id rbuSetupOal(s
17430 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 52 62  qlite3rbu *p, Rb
17440 75 53 74 61 74 65 20 2a 70 53 74 61 74 65 29 7b  uState *pState){
17450 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63  .  assert( p->rc
17460 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
17470 20 69 66 28 20 70 53 74 61 74 65 2d 3e 7a 54 62   if( pState->zTb
17480 6c 20 29 7b 0a 20 20 20 20 52 62 75 4f 62 6a 49  l ){.    RbuObjI
17490 74 65 72 20 2a 70 49 74 65 72 20 3d 20 26 70 2d  ter *pIter = &p-
174a0 3e 6f 62 6a 69 74 65 72 3b 0a 20 20 20 20 69 6e  >objiter;.    in
174b0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
174c0 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63  ;..    while( rc
174d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
174e0 49 74 65 72 2d 3e 7a 54 62 6c 20 26 26 20 28 70  Iter->zTbl && (p
174f0 49 74 65 72 2d 3e 62 43 6c 65 61 6e 75 70 20 0a  Iter->bCleanup .
17500 20 20 20 20 20 20 20 7c 7c 20 72 62 75 53 74 72         || rbuStr
17510 43 6f 6d 70 61 72 65 28 70 49 74 65 72 2d 3e 7a  Compare(pIter->z
17520 49 64 78 2c 20 70 53 74 61 74 65 2d 3e 7a 49 64  Idx, pState->zId
17530 78 29 0a 20 20 20 20 20 20 20 7c 7c 20 72 62 75  x).       || rbu
17540 53 74 72 43 6f 6d 70 61 72 65 28 70 49 74 65 72  StrCompare(pIter
17550 2d 3e 7a 54 62 6c 2c 20 70 53 74 61 74 65 2d 3e  ->zTbl, pState->
17560 7a 54 62 6c 29 20 0a 20 20 20 20 29 29 7b 0a 20  zTbl) .    )){. 
17570 20 20 20 20 20 72 63 20 3d 20 72 62 75 4f 62 6a       rc = rbuObj
17580 49 74 65 72 4e 65 78 74 28 70 2c 20 70 49 74 65  IterNext(p, pIte
17590 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  r);.    }..    i
175a0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
175b0 20 26 26 20 21 70 49 74 65 72 2d 3e 7a 54 62 6c   && !pIter->zTbl
175c0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
175d0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
175e0 20 20 20 70 2d 3e 7a 45 72 72 6d 73 67 20 3d 20     p->zErrmsg = 
175f0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
17600 22 72 62 75 5f 73 74 61 74 65 20 6d 69 73 6d 61  "rbu_state misma
17610 74 63 68 20 65 72 72 6f 72 22 29 3b 0a 20 20 20  tch error");.   
17620 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   }..    if( rc==
17630 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
17640 20 20 20 70 2d 3e 6e 53 74 65 70 20 3d 20 70 53     p->nStep = pS
17650 74 61 74 65 2d 3e 6e 52 6f 77 3b 0a 20 20 20 20  tate->nRow;.    
17660 20 20 72 63 20 3d 20 72 62 75 4f 62 6a 49 74 65    rc = rbuObjIte
17670 72 50 72 65 70 61 72 65 41 6c 6c 28 70 2c 20 26  rPrepareAll(p, &
17680 70 2d 3e 6f 62 6a 69 74 65 72 2c 20 70 2d 3e 6e  p->objiter, p->n
17690 53 74 65 70 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  Step);.    }..  
176a0 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20    p->rc = rc;.  
176b0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  }.}../*.** If th
176c0 65 72 65 20 69 73 20 61 20 22 2a 2d 6f 61 6c 22  ere is a "*-oal"
176d0 20 66 69 6c 65 20 69 6e 20 74 68 65 20 66 69 6c   file in the fil
176e0 65 2d 73 79 73 74 65 6d 20 63 6f 72 72 65 73 70  e-system corresp
176f0 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 0a 2a 2a  onding to the.**
17700 20 74 61 72 67 65 74 20 64 61 74 61 62 61 73 65   target database
17710 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73   in the file-sys
17720 74 65 6d 2c 20 64 65 6c 65 74 65 20 69 74 2e 20  tem, delete it. 
17730 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
17740 72 73 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20  rs,.** leave an 
17750 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 65  error code and e
17760 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20  rror message in 
17770 74 68 65 20 72 62 75 20 68 61 6e 64 6c 65 2e 0a  the rbu handle..
17780 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
17790 62 75 44 65 6c 65 74 65 4f 61 6c 46 69 6c 65 28  buDeleteOalFile(
177a0 73 71 6c 69 74 65 33 72 62 75 20 2a 70 29 7b 0a  sqlite3rbu *p){.
177b0 20 20 63 68 61 72 20 2a 7a 4f 61 6c 20 3d 20 72    char *zOal = r
177c0 62 75 4d 50 72 69 6e 74 66 28 70 2c 20 22 25 73  buMPrintf(p, "%s
177d0 2d 6f 61 6c 22 2c 20 70 2d 3e 7a 54 61 72 67 65  -oal", p->zTarge
177e0 74 29 3b 0a 20 20 69 66 28 20 7a 4f 61 6c 20 29  t);.  if( zOal )
177f0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66  {.    sqlite3_vf
17800 73 20 2a 70 56 66 73 20 3d 20 73 71 6c 69 74 65  s *pVfs = sqlite
17810 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20  3_vfs_find(0);. 
17820 20 20 20 61 73 73 65 72 74 28 20 70 56 66 73 20     assert( pVfs 
17830 26 26 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  && p->rc==SQLITE
17840 5f 4f 4b 20 26 26 20 70 2d 3e 7a 45 72 72 6d 73  _OK && p->zErrms
17850 67 3d 3d 30 20 29 3b 0a 20 20 20 20 70 56 66 73  g==0 );.    pVfs
17860 2d 3e 78 44 65 6c 65 74 65 28 70 56 66 73 2c 20  ->xDelete(pVfs, 
17870 7a 4f 61 6c 2c 20 30 29 3b 0a 20 20 20 20 73 71  zOal, 0);.    sq
17880 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 61 6c 29  lite3_free(zOal)
17890 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
178a0 6c 6c 6f 63 61 74 65 20 61 20 70 72 69 76 61 74  llocate a privat
178b0 65 20 72 62 75 20 56 46 53 20 66 6f 72 20 74 68  e rbu VFS for th
178c0 65 20 72 62 75 20 68 61 6e 64 6c 65 20 70 61 73  e rbu handle pas
178d0 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 0a  sed as the only.
178e0 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 69  ** argument. Thi
178f0 73 20 56 46 53 20 77 69 6c 6c 20 62 65 20 75 73  s VFS will be us
17900 65 64 20 75 6e 6c 65 73 73 20 74 68 65 20 63 61  ed unless the ca
17910 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 72 62 75  ll to sqlite3rbu
17920 5f 6f 70 65 6e 28 29 0a 2a 2a 20 73 70 65 63 69  _open().** speci
17930 66 69 65 64 20 61 20 55 52 49 20 77 69 74 68 20  fied a URI with 
17940 61 20 76 66 73 3d 3f 20 6f 70 74 69 6f 6e 20 69  a vfs=? option i
17950 6e 20 70 6c 61 63 65 20 6f 66 20 61 20 74 61 72  n place of a tar
17960 67 65 74 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  get database.** 
17970 66 69 6c 65 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74  file name..*/.st
17980 61 74 69 63 20 76 6f 69 64 20 72 62 75 43 72 65  atic void rbuCre
17990 61 74 65 56 66 73 28 73 71 6c 69 74 65 33 72 62  ateVfs(sqlite3rb
179a0 75 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 6e 64  u *p){.  int rnd
179b0 3b 0a 20 20 63 68 61 72 20 7a 52 6e 64 5b 36 34  ;.  char zRnd[64
179c0 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  ];..  assert( p-
179d0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
179e0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64  ;.  sqlite3_rand
179f0 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 69 6e  omness(sizeof(in
17a00 74 29 2c 20 28 76 6f 69 64 2a 29 26 72 6e 64 29  t), (void*)&rnd)
17a10 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  ;.  sqlite3_snpr
17a20 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 52 6e 64  intf(sizeof(zRnd
17a30 29 2c 20 7a 52 6e 64 2c 20 22 72 62 75 5f 76 66  ), zRnd, "rbu_vf
17a40 73 5f 25 64 22 2c 20 72 6e 64 29 3b 0a 20 20 70  s_%d", rnd);.  p
17a50 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 72 62  ->rc = sqlite3rb
17a60 75 5f 63 72 65 61 74 65 5f 76 66 73 28 7a 52 6e  u_create_vfs(zRn
17a70 64 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 2d 3e  d, 0);.  if( p->
17a80 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
17a90 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73  .    sqlite3_vfs
17aa0 20 2a 70 56 66 73 20 3d 20 73 71 6c 69 74 65 33   *pVfs = sqlite3
17ab0 5f 76 66 73 5f 66 69 6e 64 28 7a 52 6e 64 29 3b  _vfs_find(zRnd);
17ac0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 56 66  .    assert( pVf
17ad0 73 20 29 3b 0a 20 20 20 20 70 2d 3e 7a 56 66 73  s );.    p->zVfs
17ae0 4e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 7a 4e 61  Name = pVfs->zNa
17af0 6d 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  me;.  }.}../*.**
17b00 20 44 65 73 74 72 6f 79 20 74 68 65 20 70 72 69   Destroy the pri
17b10 76 61 74 65 20 56 46 53 20 63 72 65 61 74 65 64  vate VFS created
17b20 20 66 6f 72 20 74 68 65 20 72 62 75 20 68 61 6e   for the rbu han
17b30 64 6c 65 20 70 61 73 73 65 64 20 61 73 20 74 68  dle passed as th
17b40 65 20 6f 6e 6c 79 0a 2a 2a 20 61 72 67 75 6d 65  e only.** argume
17b50 6e 74 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72  nt by an earlier
17b60 20 63 61 6c 6c 20 74 6f 20 72 62 75 43 72 65 61   call to rbuCrea
17b70 74 65 56 66 73 28 29 2e 0a 2a 2f 0a 73 74 61 74  teVfs()..*/.stat
17b80 69 63 20 76 6f 69 64 20 72 62 75 44 65 6c 65 74  ic void rbuDelet
17b90 65 56 66 73 28 73 71 6c 69 74 65 33 72 62 75 20  eVfs(sqlite3rbu 
17ba0 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 7a 56  *p){.  if( p->zV
17bb0 66 73 4e 61 6d 65 20 29 7b 0a 20 20 20 20 73 71  fsName ){.    sq
17bc0 6c 69 74 65 33 72 62 75 5f 64 65 73 74 72 6f 79  lite3rbu_destroy
17bd0 5f 76 66 73 28 70 2d 3e 7a 56 66 73 4e 61 6d 65  _vfs(p->zVfsName
17be0 29 3b 0a 20 20 20 20 70 2d 3e 7a 56 66 73 4e 61  );.    p->zVfsNa
17bf0 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  me = 0;.  }.}../
17c00 2a 0a 2a 2a 20 4f 70 65 6e 20 61 6e 64 20 72 65  *.** Open and re
17c10 74 75 72 6e 20 61 20 6e 65 77 20 52 42 55 20 68  turn a new RBU h
17c20 61 6e 64 6c 65 2e 20 0a 2a 2f 0a 73 71 6c 69 74  andle. .*/.sqlit
17c30 65 33 72 62 75 20 2a 73 71 6c 69 74 65 33 72 62  e3rbu *sqlite3rb
17c40 75 5f 6f 70 65 6e 28 0a 20 20 63 6f 6e 73 74 20  u_open(.  const 
17c50 63 68 61 72 20 2a 7a 54 61 72 67 65 74 2c 20 0a  char *zTarget, .
17c60 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52    const char *zR
17c70 62 75 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  bu,.  const char
17c80 20 2a 7a 53 74 61 74 65 0a 29 7b 0a 20 20 73 71   *zState.){.  sq
17c90 6c 69 74 65 33 72 62 75 20 2a 70 3b 0a 20 20 69  lite3rbu *p;.  i
17ca0 6e 74 20 6e 54 61 72 67 65 74 20 3d 20 73 74 72  nt nTarget = str
17cb0 6c 65 6e 28 7a 54 61 72 67 65 74 29 3b 0a 20 20  len(zTarget);.  
17cc0 69 6e 74 20 6e 52 62 75 20 3d 20 73 74 72 6c 65  int nRbu = strle
17cd0 6e 28 7a 52 62 75 29 3b 0a 20 20 69 6e 74 20 6e  n(zRbu);.  int n
17ce0 53 74 61 74 65 20 3d 20 7a 53 74 61 74 65 20 3f  State = zState ?
17cf0 20 73 74 72 6c 65 6e 28 7a 53 74 61 74 65 29 20   strlen(zState) 
17d00 3a 20 30 3b 0a 0a 20 20 70 20 3d 20 28 73 71 6c  : 0;..  p = (sql
17d10 69 74 65 33 72 62 75 2a 29 73 71 6c 69 74 65 33  ite3rbu*)sqlite3
17d20 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 73  _malloc(sizeof(s
17d30 71 6c 69 74 65 33 72 62 75 29 2b 6e 54 61 72 67  qlite3rbu)+nTarg
17d40 65 74 2b 31 2b 6e 52 62 75 2b 31 2b 6e 53 74 61  et+1+nRbu+1+nSta
17d50 74 65 2b 31 29 3b 0a 20 20 69 66 28 20 70 20 29  te+1);.  if( p )
17d60 7b 0a 20 20 20 20 52 62 75 53 74 61 74 65 20 2a  {.    RbuState *
17d70 70 53 74 61 74 65 20 3d 20 30 3b 0a 0a 20 20 20  pState = 0;..   
17d80 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 63   /* Create the c
17d90 75 73 74 6f 6d 20 56 46 53 2e 20 2a 2f 0a 20 20  ustom VFS. */.  
17da0 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73    memset(p, 0, s
17db0 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 72 62 75  izeof(sqlite3rbu
17dc0 29 29 3b 0a 20 20 20 20 72 62 75 43 72 65 61 74  ));.    rbuCreat
17dd0 65 56 66 73 28 70 29 3b 0a 0a 20 20 20 20 2f 2a  eVfs(p);..    /*
17de0 20 4f 70 65 6e 20 74 68 65 20 74 61 72 67 65 74   Open the target
17df0 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20   database */.   
17e00 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
17e10 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
17e20 2d 3e 7a 54 61 72 67 65 74 20 3d 20 28 63 68 61  ->zTarget = (cha
17e30 72 2a 29 26 70 5b 31 5d 3b 0a 20 20 20 20 20 20  r*)&p[1];.      
17e40 6d 65 6d 63 70 79 28 70 2d 3e 7a 54 61 72 67 65  memcpy(p->zTarge
17e50 74 2c 20 7a 54 61 72 67 65 74 2c 20 6e 54 61 72  t, zTarget, nTar
17e60 67 65 74 2b 31 29 3b 0a 20 20 20 20 20 20 70 2d  get+1);.      p-
17e70 3e 7a 52 62 75 20 3d 20 26 70 2d 3e 7a 54 61 72  >zRbu = &p->zTar
17e80 67 65 74 5b 6e 54 61 72 67 65 74 2b 31 5d 3b 0a  get[nTarget+1];.
17e90 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e        memcpy(p->
17ea0 7a 52 62 75 2c 20 7a 52 62 75 2c 20 6e 52 62 75  zRbu, zRbu, nRbu
17eb0 2b 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  +1);.      if( z
17ec0 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20  State ){.       
17ed0 20 70 2d 3e 7a 53 74 61 74 65 20 3d 20 26 70 2d   p->zState = &p-
17ee0 3e 7a 52 62 75 5b 6e 52 62 75 2b 31 5d 3b 0a 20  >zRbu[nRbu+1];. 
17ef0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 2d         memcpy(p-
17f00 3e 7a 53 74 61 74 65 2c 20 7a 53 74 61 74 65 2c  >zState, zState,
17f10 20 6e 53 74 61 74 65 2b 31 29 3b 0a 20 20 20 20   nState+1);.    
17f20 20 20 7d 0a 20 20 20 20 20 20 72 62 75 4f 70 65    }.      rbuOpe
17f30 6e 44 61 74 61 62 61 73 65 28 70 29 3b 0a 20 20  nDatabase(p);.  
17f40 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 69    }..    /* If i
17f50 74 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64  t has not alread
17f60 79 20 62 65 65 6e 20 63 72 65 61 74 65 64 2c 20  y been created, 
17f70 63 72 65 61 74 65 20 74 68 65 20 72 62 75 5f 73  create the rbu_s
17f80 74 61 74 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20  tate table */.  
17f90 20 20 72 62 75 4d 50 72 69 6e 74 66 45 78 65 63    rbuMPrintfExec
17fa0 28 70 2c 20 70 2d 3e 64 62 52 62 75 2c 20 52 42  (p, p->dbRbu, RB
17fb0 55 5f 43 52 45 41 54 45 5f 53 54 41 54 45 2c 20  U_CREATE_STATE, 
17fc0 70 2d 3e 7a 53 74 61 74 65 44 62 29 3b 0a 0a 20  p->zStateDb);.. 
17fd0 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
17fe0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
17ff0 20 70 53 74 61 74 65 20 3d 20 72 62 75 4c 6f 61   pState = rbuLoa
18000 64 53 74 61 74 65 28 70 29 3b 0a 20 20 20 20 20  dState(p);.     
18010 20 61 73 73 65 72 74 28 20 70 53 74 61 74 65 20   assert( pState 
18020 7c 7c 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45  || p->rc!=SQLITE
18030 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69 66 28  _OK );.      if(
18040 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
18050 4b 20 29 7b 0a 0a 20 20 20 20 20 20 20 20 69 66  K ){..        if
18060 28 20 70 53 74 61 74 65 2d 3e 65 53 74 61 67 65  ( pState->eStage
18070 3d 3d 30 20 29 7b 20 0a 20 20 20 20 20 20 20 20  ==0 ){ .        
18080 20 20 72 62 75 44 65 6c 65 74 65 4f 61 6c 46 69    rbuDeleteOalFi
18090 6c 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20  le(p);.         
180a0 20 70 2d 3e 65 53 74 61 67 65 20 3d 20 52 42 55   p->eStage = RBU
180b0 5f 53 54 41 47 45 5f 4f 41 4c 3b 0a 20 20 20 20  _STAGE_OAL;.    
180c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
180d0 20 20 20 20 20 70 2d 3e 65 53 74 61 67 65 20 3d       p->eStage =
180e0 20 70 53 74 61 74 65 2d 3e 65 53 74 61 67 65 3b   pState->eStage;
180f0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
18100 20 20 20 70 2d 3e 6e 50 72 6f 67 72 65 73 73 20     p->nProgress 
18110 3d 20 70 53 74 61 74 65 2d 3e 6e 50 72 6f 67 72  = pState->nProgr
18120 65 73 73 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  ess;.        p->
18130 69 4f 61 6c 53 7a 20 3d 20 70 53 74 61 74 65 2d  iOalSz = pState-
18140 3e 69 4f 61 6c 53 7a 3b 0a 20 20 20 20 20 20 7d  >iOalSz;.      }
18150 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
18160 74 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45  t( p->rc!=SQLITE
18170 5f 4f 4b 20 7c 7c 20 70 2d 3e 65 53 74 61 67 65  _OK || p->eStage
18180 21 3d 30 20 29 3b 0a 0a 20 20 20 20 69 66 28 20  !=0 );..    if( 
18190 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
181a0 20 26 26 20 70 2d 3e 70 54 61 72 67 65 74 46 64   && p->pTargetFd
181b0 2d 3e 70 57 61 6c 46 64 20 29 7b 0a 20 20 20 20  ->pWalFd ){.    
181c0 20 20 69 66 28 20 70 2d 3e 65 53 74 61 67 65 3d    if( p->eStage=
181d0 3d 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20 29  =RBU_STAGE_OAL )
181e0 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20  {.        p->rc 
181f0 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
18200 20 20 20 20 20 20 20 20 70 2d 3e 7a 45 72 72 6d          p->zErrm
18210 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  sg = sqlite3_mpr
18220 69 6e 74 66 28 22 63 61 6e 6e 6f 74 20 75 70 64  intf("cannot upd
18230 61 74 65 20 77 61 6c 20 6d 6f 64 65 20 64 61 74  ate wal mode dat
18240 61 62 61 73 65 22 29 3b 0a 20 20 20 20 20 20 7d  abase");.      }
18250 65 6c 73 65 20 69 66 28 20 70 2d 3e 65 53 74 61  else if( p->eSta
18260 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4d 4f  ge==RBU_STAGE_MO
18270 56 45 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  VE ){.        p-
18280 3e 65 53 74 61 67 65 20 3d 20 52 42 55 5f 53 54  >eStage = RBU_ST
18290 41 47 45 5f 43 4b 50 54 3b 0a 20 20 20 20 20 20  AGE_CKPT;.      
182a0 20 20 70 2d 3e 6e 53 74 65 70 20 3d 20 30 3b 0a    p->nStep = 0;.
182b0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
182c0 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
182d0 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20 26 26 20  LITE_OK.     && 
182e0 28 70 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f  (p->eStage==RBU_
182f0 53 54 41 47 45 5f 4f 41 4c 20 7c 7c 20 70 2d 3e  STAGE_OAL || p->
18300 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47  eStage==RBU_STAG
18310 45 5f 4d 4f 56 45 29 0a 20 20 20 20 20 26 26 20  E_MOVE).     && 
18320 70 53 74 61 74 65 2d 3e 65 53 74 61 67 65 21 3d  pState->eStage!=
18330 30 20 26 26 20 70 2d 3e 70 54 61 72 67 65 74 46  0 && p->pTargetF
18340 64 2d 3e 69 43 6f 6f 6b 69 65 21 3d 70 53 74 61  d->iCookie!=pSta
18350 74 65 2d 3e 69 43 6f 6f 6b 69 65 0a 20 20 20 20  te->iCookie.    
18360 29 7b 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 41  ){   .      /* A
18370 74 20 74 68 69 73 20 70 6f 69 6e 74 20 28 70 54  t this point (pT
18380 61 72 67 65 74 46 64 2d 3e 69 43 6f 6f 6b 69 65  argetFd->iCookie
18390 29 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76  ) contains the v
183a0 61 6c 75 65 20 6f 66 20 74 68 65 0a 20 20 20 20  alue of the.    
183b0 20 20 2a 2a 20 63 68 61 6e 67 65 2d 63 6f 75 6e    ** change-coun
183c0 74 65 72 20 63 6f 6f 6b 69 65 20 28 74 68 65 20  ter cookie (the 
183d0 74 68 69 6e 67 20 74 68 61 74 20 67 65 74 73 20  thing that gets 
183e0 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 68 65 6e  incremented when
183f0 20 61 20 0a 20 20 20 20 20 20 2a 2a 20 74 72 61   a .      ** tra
18400 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
18410 69 74 74 65 64 20 69 6e 20 72 6f 6c 6c 62 61 63  itted in rollbac
18420 6b 20 6d 6f 64 65 29 20 63 75 72 72 65 6e 74 6c  k mode) currentl
18430 79 20 73 74 6f 72 65 64 20 6f 6e 20 0a 20 20 20  y stored on .   
18440 20 20 20 2a 2a 20 70 61 67 65 20 31 20 6f 66 20     ** page 1 of 
18450 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
18460 65 2e 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 72  e. */.      p->r
18470 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
18480 0a 20 20 20 20 20 20 70 2d 3e 7a 45 72 72 6d 73  .      p->zErrms
18490 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  g = sqlite3_mpri
184a0 6e 74 66 28 22 64 61 74 61 62 61 73 65 20 6d 6f  ntf("database mo
184b0 64 69 66 69 65 64 20 64 75 72 69 6e 67 20 72 62  dified during rb
184c0 75 20 75 70 64 61 74 65 22 29 3b 0a 20 20 20 20  u update");.    
184d0 7d 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  }..    if( p->rc
184e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
184f0 20 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74 61       if( p->eSta
18500 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4f 41  ge==RBU_STAGE_OA
18510 4c 20 29 7b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  L ){..        /*
18520 20 4f 70 65 6e 20 74 72 61 6e 73 61 63 74 69 6f   Open transactio
18530 6e 73 20 62 6f 74 68 20 64 61 74 61 62 61 73 65  ns both database
18540 73 2e 20 54 68 65 20 2a 2d 6f 61 6c 20 66 69 6c  s. The *-oal fil
18550 65 20 69 73 20 6f 70 65 6e 65 64 20 6f 72 0a 20  e is opened or. 
18560 20 20 20 20 20 20 20 2a 2a 20 63 72 65 61 74 65         ** create
18570 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2e  d at this point.
18580 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 2d 3e 72   */.        p->r
18590 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  c = sqlite3_exec
185a0 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 42 45 47  (p->dbMain, "BEG
185b0 49 4e 20 49 4d 4d 45 44 49 41 54 45 22 2c 20 30  IN IMMEDIATE", 0
185c0 2c 20 30 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67  , 0, &p->zErrmsg
185d0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
185e0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
185f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ){.          p->
18600 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65  rc = sqlite3_exe
18610 63 28 70 2d 3e 64 62 52 62 75 2c 20 22 42 45 47  c(p->dbRbu, "BEG
18620 49 4e 20 49 4d 4d 45 44 49 41 54 45 22 2c 20 30  IN IMMEDIATE", 0
18630 2c 20 30 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67  , 0, &p->zErrmsg
18640 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 0a  );.        }.  .
18650 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
18660 20 74 68 65 20 6f 62 6a 65 63 74 20 69 74 65 72   the object iter
18670 61 74 6f 72 20 61 74 20 74 68 65 20 66 69 72 73  ator at the firs
18680 74 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20  t object */.    
18690 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
186a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
186b0 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 62        p->rc = rb
186c0 75 4f 62 6a 49 74 65 72 46 69 72 73 74 28 70 2c  uObjIterFirst(p,
186d0 20 26 70 2d 3e 6f 62 6a 69 74 65 72 29 3b 0a 20   &p->objiter);. 
186e0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
186f0 20 20 2f 2a 20 49 66 20 74 68 65 20 52 42 55 20    /* If the RBU 
18700 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e  database contain
18710 73 20 6e 6f 20 64 61 74 61 5f 78 78 78 20 74 61  s no data_xxx ta
18720 62 6c 65 73 2c 20 64 65 63 6c 61 72 65 20 74 68  bles, declare th
18730 65 20 52 42 55 0a 20 20 20 20 20 20 20 20 2a 2a  e RBU.        **
18740 20 75 70 64 61 74 65 20 66 69 6e 69 73 68 65 64   update finished
18750 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  .  */.        if
18760 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
18770 4f 4b 20 26 26 20 70 2d 3e 6f 62 6a 69 74 65 72  OK && p->objiter
18780 2e 7a 54 62 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  .zTbl==0 ){.    
18790 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51        p->rc = SQ
187a0 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20  LITE_DONE;.     
187b0 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66     }..        if
187c0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
187d0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
187e0 72 62 75 53 65 74 75 70 4f 61 6c 28 70 2c 20 70  rbuSetupOal(p, p
187f0 53 74 61 74 65 29 3b 0a 20 20 20 20 20 20 20 20  State);.        
18800 7d 0a 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  }..      }else i
18810 66 28 20 70 2d 3e 65 53 74 61 67 65 3d 3d 52 42  f( p->eStage==RB
18820 55 5f 53 54 41 47 45 5f 4d 4f 56 45 20 29 7b 0a  U_STAGE_MOVE ){.
18830 20 20 20 20 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70          /* no-op
18840 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 20   */.      }else 
18850 69 66 28 20 70 2d 3e 65 53 74 61 67 65 3d 3d 52  if( p->eStage==R
18860 42 55 5f 53 54 41 47 45 5f 43 4b 50 54 20 29 7b  BU_STAGE_CKPT ){
18870 0a 20 20 20 20 20 20 20 20 72 62 75 53 65 74 75  .        rbuSetu
18880 70 43 68 65 63 6b 70 6f 69 6e 74 28 70 2c 20 70  pCheckpoint(p, p
18890 53 74 61 74 65 29 3b 0a 20 20 20 20 20 20 7d 65  State);.      }e
188a0 6c 73 65 20 69 66 28 20 70 2d 3e 65 53 74 61 67  lse if( p->eStag
188b0 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 44 4f 4e  e==RBU_STAGE_DON
188c0 45 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  E ){.        p->
188d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
188e0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
188f0 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53         p->rc = S
18900 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20  QLITE_CORRUPT;. 
18910 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
18920 20 20 72 62 75 46 72 65 65 53 74 61 74 65 28 70    rbuFreeState(p
18930 53 74 61 74 65 29 3b 0a 20 20 7d 0a 0a 20 20 72  State);.  }..  r
18940 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 0a 2f 2a 0a  eturn p;.}.../*.
18950 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 61  ** Return the da
18960 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 75 73  tabase handle us
18970 65 64 20 62 79 20 70 52 62 75 2e 0a 2a 2f 0a 73  ed by pRbu..*/.s
18980 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65 33 72  qlite3 *sqlite3r
18990 62 75 5f 64 62 28 73 71 6c 69 74 65 33 72 62 75  bu_db(sqlite3rbu
189a0 20 2a 70 52 62 75 2c 20 69 6e 74 20 62 52 62 75   *pRbu, int bRbu
189b0 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
189c0 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 52 62 75   = 0;.  if( pRbu
189d0 20 29 7b 0a 20 20 20 20 64 62 20 3d 20 28 62 52   ){.    db = (bR
189e0 62 75 20 3f 20 70 52 62 75 2d 3e 64 62 52 62 75  bu ? pRbu->dbRbu
189f0 20 3a 20 70 52 62 75 2d 3e 64 62 4d 61 69 6e 29   : pRbu->dbMain)
18a00 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 64  ;.  }.  return d
18a10 62 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  b;.}.../*.** If 
18a20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 63  the error code c
18a30 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20  urrently stored 
18a40 69 6e 20 74 68 65 20 52 42 55 20 68 61 6e 64 6c  in the RBU handl
18a50 65 20 69 73 20 53 51 4c 49 54 45 5f 43 4f 4e 53  e is SQLITE_CONS
18a60 54 52 41 49 4e 54 2c 0a 2a 2a 20 74 68 65 6e 20  TRAINT,.** then 
18a70 65 64 69 74 20 61 6e 79 20 65 72 72 6f 72 20 6d  edit any error m
18a80 65 73 73 61 67 65 20 73 74 72 69 6e 67 20 73 6f  essage string so
18a90 20 61 73 20 74 6f 20 72 65 6d 6f 76 65 20 61 6c   as to remove al
18aa0 6c 20 6f 63 63 75 72 72 65 6e 63 65 73 20 6f 66  l occurrences of
18ab0 0a 2a 2a 20 74 68 65 20 70 61 74 74 65 72 6e 20  .** the pattern 
18ac0 22 72 62 75 5f 69 6d 70 5f 5b 30 2d 39 5d 2a 22  "rbu_imp_[0-9]*"
18ad0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
18ae0 20 72 62 75 45 64 69 74 45 72 72 6d 73 67 28 73   rbuEditErrmsg(s
18af0 71 6c 69 74 65 33 72 62 75 20 2a 70 29 7b 0a 20  qlite3rbu *p){. 
18b00 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
18b10 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 26 26  TE_CONSTRAINT &&
18b20 20 70 2d 3e 7a 45 72 72 6d 73 67 20 29 7b 0a 20   p->zErrmsg ){. 
18b30 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e     int i;.    in
18b40 74 20 6e 45 72 72 6d 73 67 20 3d 20 73 74 72 6c  t nErrmsg = strl
18b50 65 6e 28 70 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a  en(p->zErrmsg);.
18b60 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 28      for(i=0; i<(
18b70 6e 45 72 72 6d 73 67 2d 38 29 3b 20 69 2b 2b 29  nErrmsg-8); i++)
18b80 7b 0a 20 20 20 20 20 20 69 66 28 20 6d 65 6d 63  {.      if( memc
18b90 6d 70 28 26 70 2d 3e 7a 45 72 72 6d 73 67 5b 69  mp(&p->zErrmsg[i
18ba0 5d 2c 20 22 72 62 75 5f 69 6d 70 5f 22 2c 20 38  ], "rbu_imp_", 8
18bb0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
18bc0 69 6e 74 20 6e 44 65 6c 20 3d 20 38 3b 0a 20 20  int nDel = 8;.  
18bd0 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 2d 3e        while( p->
18be0 7a 45 72 72 6d 73 67 5b 69 2b 6e 44 65 6c 5d 3e  zErrmsg[i+nDel]>
18bf0 3d 27 30 27 20 26 26 20 70 2d 3e 7a 45 72 72 6d  ='0' && p->zErrm
18c00 73 67 5b 69 2b 6e 44 65 6c 5d 3c 3d 27 39 27 20  sg[i+nDel]<='9' 
18c10 29 20 6e 44 65 6c 2b 2b 3b 0a 20 20 20 20 20 20  ) nDel++;.      
18c20 20 20 6d 65 6d 6d 6f 76 65 28 26 70 2d 3e 7a 45    memmove(&p->zE
18c30 72 72 6d 73 67 5b 69 5d 2c 20 26 70 2d 3e 7a 45  rrmsg[i], &p->zE
18c40 72 72 6d 73 67 5b 69 2b 6e 44 65 6c 5d 2c 20 6e  rrmsg[i+nDel], n
18c50 45 72 72 6d 73 67 20 2b 20 31 20 2d 20 69 20 2d  Errmsg + 1 - i -
18c60 20 6e 44 65 6c 29 3b 0a 20 20 20 20 20 20 20 20   nDel);.        
18c70 6e 45 72 72 6d 73 67 20 2d 3d 20 6e 44 65 6c 3b  nErrmsg -= nDel;
18c80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
18c90 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73   }.}../*.** Clos
18ca0 65 20 74 68 65 20 52 42 55 20 68 61 6e 64 6c 65  e the RBU handle
18cb0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
18cc0 72 62 75 5f 63 6c 6f 73 65 28 73 71 6c 69 74 65  rbu_close(sqlite
18cd0 33 72 62 75 20 2a 70 2c 20 63 68 61 72 20 2a 2a  3rbu *p, char **
18ce0 70 7a 45 72 72 6d 73 67 29 7b 0a 20 20 69 6e 74  pzErrmsg){.  int
18cf0 20 72 63 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a   rc;.  if( p ){.
18d00 0a 20 20 20 20 2f 2a 20 43 6f 6d 6d 69 74 20 74  .    /* Commit t
18d10 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  he transaction t
18d20 6f 20 74 68 65 20 2a 2d 6f 61 6c 20 66 69 6c 65  o the *-oal file
18d30 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e  . */.    if( p->
18d40 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
18d50 20 70 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f   p->eStage==RBU_
18d60 53 54 41 47 45 5f 4f 41 4c 20 29 7b 0a 20 20 20  STAGE_OAL ){.   
18d70 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74     p->rc = sqlit
18d80 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 4d 61 69  e3_exec(p->dbMai
18d90 6e 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20  n, "COMMIT", 0, 
18da0 30 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 29 3b  0, &p->zErrmsg);
18db0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 62 75 53  .    }..    rbuS
18dc0 61 76 65 53 74 61 74 65 28 70 2c 20 70 2d 3e 65  aveState(p, p->e
18dd0 53 74 61 67 65 29 3b 0a 0a 20 20 20 20 69 66 28  Stage);..    if(
18de0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
18df0 4b 20 26 26 20 70 2d 3e 65 53 74 61 67 65 3d 3d  K && p->eStage==
18e00 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20 29 7b  RBU_STAGE_OAL ){
18e10 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73  .      p->rc = s
18e20 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
18e30 62 52 62 75 2c 20 22 43 4f 4d 4d 49 54 22 2c 20  bRbu, "COMMIT", 
18e40 30 2c 20 30 2c 20 26 70 2d 3e 7a 45 72 72 6d 73  0, 0, &p->zErrms
18e50 67 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  g);.    }..    /
18e60 2a 20 43 6c 6f 73 65 20 61 6e 79 20 6f 70 65 6e  * Close any open
18e70 20 73 74 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c   statement handl
18e80 65 73 2e 20 2a 2f 0a 20 20 20 20 72 62 75 4f 62  es. */.    rbuOb
18e90 6a 49 74 65 72 46 69 6e 61 6c 69 7a 65 28 26 70  jIterFinalize(&p
18ea0 2d 3e 6f 62 6a 69 74 65 72 29 3b 0a 0a 20 20 20  ->objiter);..   
18eb0 20 2f 2a 20 43 6c 6f 73 65 20 74 68 65 20 6f 70   /* Close the op
18ec0 65 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  en database hand
18ed0 6c 65 20 61 6e 64 20 56 46 53 20 6f 62 6a 65 63  le and VFS objec
18ee0 74 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  t. */.    sqlite
18ef0 33 5f 63 6c 6f 73 65 28 70 2d 3e 64 62 4d 61 69  3_close(p->dbMai
18f00 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  n);.    sqlite3_
18f10 63 6c 6f 73 65 28 70 2d 3e 64 62 52 62 75 29 3b  close(p->dbRbu);
18f20 0a 20 20 20 20 72 62 75 44 65 6c 65 74 65 56 66  .    rbuDeleteVf
18f30 73 28 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  s(p);.    sqlite
18f40 33 5f 66 72 65 65 28 70 2d 3e 61 42 75 66 29 3b  3_free(p->aBuf);
18f50 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
18f60 65 28 70 2d 3e 61 46 72 61 6d 65 29 3b 0a 0a 20  e(p->aFrame);.. 
18f70 20 20 20 72 62 75 45 64 69 74 45 72 72 6d 73 67     rbuEditErrmsg
18f80 28 70 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 2d  (p);.    rc = p-
18f90 3e 72 63 3b 0a 20 20 20 20 2a 70 7a 45 72 72 6d  >rc;.    *pzErrm
18fa0 73 67 20 3d 20 70 2d 3e 7a 45 72 72 6d 73 67 3b  sg = p->zErrmsg;
18fb0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
18fc0 65 28 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  e(p);.  }else{. 
18fd0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
18fe0 4f 4d 45 4d 3b 0a 20 20 20 20 2a 70 7a 45 72 72  OMEM;.    *pzErr
18ff0 6d 73 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  msg = 0;.  }.  r
19000 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
19010 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74 6f  ** Return the to
19020 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6b 65  tal number of ke
19030 79 2d 76 61 6c 75 65 20 6f 70 65 72 61 74 69 6f  y-value operatio
19040 6e 73 20 28 69 6e 73 65 72 74 73 2c 20 64 65 6c  ns (inserts, del
19050 65 74 65 73 20 6f 72 20 0a 2a 2a 20 75 70 64 61  etes or .** upda
19060 74 65 73 29 20 74 68 61 74 20 68 61 76 65 20 62  tes) that have b
19070 65 65 6e 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e  een performed on
19080 20 74 68 65 20 74 61 72 67 65 74 20 64 61 74 61   the target data
19090 62 61 73 65 20 73 69 6e 63 65 20 74 68 65 0a 2a  base since the.*
190a0 2a 20 63 75 72 72 65 6e 74 20 52 42 55 20 75 70  * current RBU up
190b0 64 61 74 65 20 77 61 73 20 73 74 61 72 74 65 64  date was started
190c0 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 69 6e 74  ..*/.sqlite3_int
190d0 36 34 20 73 71 6c 69 74 65 33 72 62 75 5f 70 72  64 sqlite3rbu_pr
190e0 6f 67 72 65 73 73 28 73 71 6c 69 74 65 33 72 62  ogress(sqlite3rb
190f0 75 20 2a 70 52 62 75 29 7b 0a 20 20 72 65 74 75  u *pRbu){.  retu
19100 72 6e 20 70 52 62 75 2d 3e 6e 50 72 6f 67 72 65  rn pRbu->nProgre
19110 73 73 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ss;.}../********
19120 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19130 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19140 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19150 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19160 2a 2a 0a 2a 2a 20 42 65 67 69 6e 6e 69 6e 67 20  **.** Beginning 
19170 6f 66 20 52 42 55 20 56 46 53 20 73 68 69 6d 20  of RBU VFS shim 
19180 6d 65 74 68 6f 64 73 2e 20 54 68 65 20 56 46 53  methods. The VFS
19190 20 73 68 69 6d 20 6d 6f 64 69 66 69 65 73 20 74   shim modifies t
191a0 68 65 20 62 65 68 61 76 69 6f 75 72 0a 2a 2a 20  he behaviour.** 
191b0 6f 66 20 61 20 73 74 61 6e 64 61 72 64 20 56 46  of a standard VF
191c0 53 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  S in the followi
191d0 6e 67 20 77 61 79 73 3a 0a 2a 2a 0a 2a 2a 20 31  ng ways:.**.** 1
191e0 2e 20 57 68 65 6e 65 76 65 72 20 74 68 65 20 66  . Whenever the f
191f0 69 72 73 74 20 70 61 67 65 20 6f 66 20 61 20 6d  irst page of a m
19200 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
19210 65 20 69 73 20 72 65 61 64 20 6f 72 20 0a 2a 2a  e is read or .**
19220 20 20 20 20 77 72 69 74 74 65 6e 2c 20 74 68 65      written, the
19230 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 63 68   value of the ch
19240 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 63 6f 6f  ange-counter coo
19250 6b 69 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e  kie is stored in
19260 0a 2a 2a 20 20 20 20 72 62 75 5f 66 69 6c 65 2e  .**    rbu_file.
19270 69 43 6f 6f 6b 69 65 2e 20 53 69 6d 69 6c 61 72  iCookie. Similar
19280 6c 79 2c 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ly, the value of
19290 20 74 68 65 20 22 77 72 69 74 65 2d 76 65 72 73   the "write-vers
192a0 69 6f 6e 22 0a 2a 2a 20 20 20 20 64 61 74 61 62  ion".**    datab
192b0 61 73 65 20 68 65 61 64 65 72 20 66 69 65 6c 64  ase header field
192c0 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 72 62   is stored in rb
192d0 75 5f 66 69 6c 65 2e 69 57 72 69 74 65 56 65 72  u_file.iWriteVer
192e0 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73 0a 2a  . This ensures.*
192f0 2a 20 20 20 20 74 68 61 74 20 74 68 65 20 76 61  *    that the va
19300 6c 75 65 73 20 61 72 65 20 61 6c 77 61 79 73 20  lues are always 
19310 74 72 75 73 74 77 6f 72 74 68 79 20 77 69 74 68  trustworthy with
19320 69 6e 20 61 6e 20 6f 70 65 6e 20 74 72 61 6e 73  in an open trans
19330 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 32 2e  action..**.** 2.
19340 20 57 68 65 6e 65 76 65 72 20 61 6e 20 53 51 4c   Whenever an SQL
19350 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 66 69 6c  ITE_OPEN_WAL fil
19360 65 20 69 73 20 6f 70 65 6e 65 64 2c 20 74 68 65  e is opened, the
19370 20 28 72 62 75 5f 66 69 6c 65 2e 70 57 61 6c 46   (rbu_file.pWalF
19380 64 29 0a 2a 2a 20 20 20 20 6d 65 6d 62 65 72 20  d).**    member 
19390 76 61 72 69 61 62 6c 65 20 6f 66 20 74 68 65 20  variable of the 
193a0 61 73 73 6f 63 69 61 74 65 64 20 64 61 74 61 62  associated datab
193b0 61 73 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  ase file descrip
193c0 74 6f 72 20 69 73 20 73 65 74 0a 2a 2a 20 20 20  tor is set.**   
193d0 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
193e0 20 6e 65 77 20 66 69 6c 65 2e 20 41 20 6d 75 74   new file. A mut
193f0 65 78 20 70 72 6f 74 65 63 74 65 64 20 6c 69 6e  ex protected lin
19400 6b 65 64 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  ked list of all 
19410 6d 61 69 6e 20 0a 2a 2a 20 20 20 20 64 62 20 66  main .**    db f
19420 64 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20  ds opened using 
19430 61 20 70 61 72 74 69 63 75 6c 61 72 20 52 42 55  a particular RBU
19440 20 56 46 53 20 69 73 20 6d 61 69 6e 74 61 69 6e   VFS is maintain
19450 65 64 20 61 74 20 0a 2a 2a 20 20 20 20 72 62 75  ed at .**    rbu
19460 5f 76 66 73 2e 70 4d 61 69 6e 20 74 6f 20 66 61  _vfs.pMain to fa
19470 63 69 6c 69 74 61 74 65 20 74 68 69 73 2e 0a 2a  cilitate this..*
19480 2a 0a 2a 2a 20 33 2e 20 55 73 69 6e 67 20 61 20  *.** 3. Using a 
19490 6e 65 77 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c  new file-control
194a0 20 22 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 52   "SQLITE_FCNTL_R
194b0 42 55 22 2c 20 61 20 6d 61 69 6e 20 64 62 20 72  BU", a main db r
194c0 62 75 5f 66 69 6c 65 20 0a 2a 2a 20 20 20 20 6f  bu_file .**    o
194d0 62 6a 65 63 74 20 63 61 6e 20 62 65 20 6d 61 72  bject can be mar
194e0 6b 65 64 20 61 73 20 74 68 65 20 74 61 72 67 65  ked as the targe
194f0 74 20 64 61 74 61 62 61 73 65 20 6f 66 20 61 6e  t database of an
19500 20 52 42 55 20 75 70 64 61 74 65 2e 20 54 68 69   RBU update. Thi
19510 73 0a 2a 2a 20 20 20 20 74 75 72 6e 73 20 6f 6e  s.**    turns on
19520 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65   the following e
19530 78 74 72 61 20 73 70 65 63 69 61 6c 20 62 65 68  xtra special beh
19540 61 76 69 6f 75 72 3a 0a 2a 2a 0a 2a 2a 20 33 61  aviour:.**.** 3a
19550 2e 20 49 66 20 78 41 63 63 65 73 73 28 29 20 69  . If xAccess() i
19560 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 68 65 63  s called to chec
19570 6b 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74  k if there exist
19580 73 20 61 20 2a 2d 77 61 6c 20 66 69 6c 65 20 0a  s a *-wal file .
19590 2a 2a 20 20 20 20 20 61 73 73 6f 63 69 61 74 65  **     associate
195a0 64 20 77 69 74 68 20 61 6e 20 52 42 55 20 74 61  d with an RBU ta
195b0 72 67 65 74 20 64 61 74 61 62 61 73 65 20 63 75  rget database cu
195c0 72 72 65 6e 74 6c 79 20 69 6e 20 52 42 55 5f 53  rrently in RBU_S
195d0 54 41 47 45 5f 4f 41 4c 0a 2a 2a 20 20 20 20 20  TAGE_OAL.**     
195e0 73 74 61 67 65 20 28 70 72 65 70 61 72 69 6e 67  stage (preparing
195f0 20 74 68 65 20 2a 2d 6f 61 6c 20 66 69 6c 65 29   the *-oal file)
19600 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  , the following 
19610 73 70 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67  special handling
19620 0a 2a 2a 20 20 20 20 20 61 70 70 6c 69 65 73 3a  .**     applies:
19630 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 2a 20 69 66  .**.**      * if
19640 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20   the *-wal file 
19650 64 6f 65 73 20 65 78 69 73 74 2c 20 72 65 74 75  does exist, retu
19660 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rn SQLITE_CANTOP
19670 45 4e 2e 20 41 6e 20 52 42 55 0a 2a 2a 20 20 20  EN. An RBU.**   
19680 20 20 20 20 20 74 61 72 67 65 74 20 64 61 74 61       target data
19690 62 61 73 65 20 6d 61 79 20 6e 6f 74 20 62 65 20  base may not be 
196a0 69 6e 20 77 61 6c 20 6d 6f 64 65 20 61 6c 72 65  in wal mode alre
196b0 61 64 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ady..**.**      
196c0 2a 20 69 66 20 74 68 65 20 2a 2d 77 61 6c 20 66  * if the *-wal f
196d0 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  ile does not exi
196e0 73 74 2c 20 73 65 74 20 74 68 65 20 6f 75 74 70  st, set the outp
196f0 75 74 20 70 61 72 61 6d 65 74 65 72 20 74 6f 0a  ut parameter to.
19700 2a 2a 20 20 20 20 20 20 20 20 6e 6f 6e 2d 7a 65  **        non-ze
19710 72 6f 20 28 74 6f 20 74 65 6c 6c 20 53 51 4c 69  ro (to tell SQLi
19720 74 65 20 74 68 61 74 20 69 74 20 64 6f 65 73 20  te that it does 
19730 65 78 69 73 74 29 20 61 6e 79 77 61 79 2e 0a 2a  exist) anyway..*
19740 2a 0a 2a 2a 20 20 20 20 20 54 68 65 6e 2c 20 77  *.**     Then, w
19750 68 65 6e 20 78 4f 70 65 6e 28 29 20 69 73 20 63  hen xOpen() is c
19760 61 6c 6c 65 64 20 74 6f 20 6f 70 65 6e 20 74 68  alled to open th
19770 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 61 73 73  e *-wal file ass
19780 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20  ociated with.** 
19790 20 20 20 20 74 68 65 20 52 42 55 20 74 61 72 67      the RBU targ
197a0 65 74 20 69 6e 20 52 42 55 5f 53 54 41 47 45 5f  et in RBU_STAGE_
197b0 4f 41 4c 20 73 74 61 67 65 2c 20 69 6e 73 74 65  OAL stage, inste
197c0 61 64 20 6f 66 20 6f 70 65 6e 69 6e 67 20 74 68  ad of opening th
197d0 65 20 2a 2d 77 61 6c 0a 2a 2a 20 20 20 20 20 66  e *-wal.**     f
197e0 69 6c 65 2c 20 74 68 65 20 72 62 75 20 76 66 73  ile, the rbu vfs
197f0 20 6f 70 65 6e 73 20 74 68 65 20 63 6f 72 72 65   opens the corre
19800 73 70 6f 6e 64 69 6e 67 20 2a 2d 6f 61 6c 20 66  sponding *-oal f
19810 69 6c 65 20 69 6e 73 74 65 61 64 2e 20 0a 2a 2a  ile instead. .**
19820 0a 2a 2a 20 33 62 2e 20 54 68 65 20 2a 2d 73 68  .** 3b. The *-sh
19830 6d 20 70 61 67 65 73 20 72 65 74 75 72 6e 65 64  m pages returned
19840 20 62 79 20 78 53 68 6d 4d 61 70 28 29 20 66 6f   by xShmMap() fo
19850 72 20 61 20 74 61 72 67 65 74 20 64 62 20 66 69  r a target db fi
19860 6c 65 20 69 6e 0a 2a 2a 20 20 20 20 20 52 42 55  le in.**     RBU
19870 5f 53 54 41 47 45 5f 4f 41 4c 20 6d 6f 64 65 20  _STAGE_OAL mode 
19880 61 72 65 20 61 63 74 75 61 6c 6c 79 20 73 74 6f  are actually sto
19890 72 65 64 20 69 6e 20 68 65 61 70 20 6d 65 6d 6f  red in heap memo
198a0 72 79 2e 20 54 68 69 73 20 69 73 20 74 6f 0a 2a  ry. This is to.*
198b0 2a 20 20 20 20 20 61 76 6f 69 64 20 63 72 65 61  *     avoid crea
198c0 74 69 6e 67 20 61 20 2a 2d 73 68 6d 20 66 69 6c  ting a *-shm fil
198d0 65 20 6f 6e 20 64 69 73 6b 2e 20 41 64 64 69 74  e on disk. Addit
198e0 69 6f 6e 61 6c 6c 79 2c 20 78 53 68 6d 4c 6f 63  ionally, xShmLoc
198f0 6b 28 29 20 63 61 6c 6c 73 0a 2a 2a 20 20 20 20  k() calls.**    
19900 20 61 72 65 20 6e 6f 2d 6f 70 73 20 6f 6e 20 74   are no-ops on t
19910 61 72 67 65 74 20 64 61 74 61 62 61 73 65 20 66  arget database f
19920 69 6c 65 73 20 69 6e 20 52 42 55 5f 53 54 41 47  iles in RBU_STAG
19930 45 5f 4f 41 4c 20 6d 6f 64 65 2e 20 54 68 69 73  E_OAL mode. This
19940 20 69 73 0a 2a 2a 20 20 20 20 20 62 65 63 61 75   is.**     becau
19950 73 65 20 61 73 73 65 72 74 28 29 20 73 74 61 74  se assert() stat
19960 65 6d 65 6e 74 73 20 69 6e 20 73 6f 6d 65 20 56  ements in some V
19970 46 53 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  FS implementatio
19980 6e 73 20 66 61 69 6c 20 69 66 20 0a 2a 2a 20 20  ns fail if .**  
19990 20 20 20 78 53 68 6d 4c 6f 63 6b 28 29 20 69 73     xShmLock() is
199a0 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 78   called before x
199b0 53 68 6d 4d 61 70 28 29 2e 0a 2a 2a 0a 2a 2a 20  ShmMap()..**.** 
199c0 33 63 2e 20 49 66 20 61 6e 20 45 58 43 4c 55 53  3c. If an EXCLUS
199d0 49 56 45 20 6c 6f 63 6b 20 69 73 20 61 74 74 65  IVE lock is atte
199e0 6d 70 74 65 64 20 6f 6e 20 61 20 74 61 72 67 65  mpted on a targe
199f0 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  t database file 
19a00 69 6e 20 61 6e 79 0a 2a 2a 20 20 20 20 20 6d 6f  in any.**     mo
19a10 64 65 20 65 78 63 65 70 74 20 52 42 55 5f 53 54  de except RBU_ST
19a20 41 47 45 5f 44 4f 4e 45 20 28 61 6c 6c 20 77 6f  AGE_DONE (all wo
19a30 72 6b 20 63 6f 6d 70 6c 65 74 65 64 20 61 6e 64  rk completed and
19a40 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 29 2c 20   checkpointed), 
19a50 69 74 20 0a 2a 2a 20 20 20 20 20 66 61 69 6c 73  it .**     fails
19a60 20 77 69 74 68 20 61 6e 20 53 51 4c 49 54 45 5f   with an SQLITE_
19a70 42 55 53 59 20 65 72 72 6f 72 2e 20 54 68 69 73  BUSY error. This
19a80 20 69 73 20 74 6f 20 73 74 6f 70 20 52 42 55 20   is to stop RBU 
19a90 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20 20  connections.**  
19aa0 20 20 20 66 72 6f 6d 20 61 75 74 6f 6d 61 74 69     from automati
19ab0 63 61 6c 6c 79 20 63 68 65 63 6b 70 6f 69 6e 74  cally checkpoint
19ac0 69 6e 67 20 61 20 2a 2d 77 61 6c 20 28 6f 72 20  ing a *-wal (or 
19ad0 2a 2d 6f 61 6c 29 20 66 69 6c 65 20 66 72 6f 6d  *-oal) file from
19ae0 20 77 69 74 68 69 6e 0a 2a 2a 20 20 20 20 20 73   within.**     s
19af0 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 29 2e 0a  qlite3_close()..
19b00 2a 2a 0a 2a 2a 20 33 64 2e 20 49 6e 20 52 42 55  **.** 3d. In RBU
19b10 5f 53 54 41 47 45 5f 43 41 50 54 55 52 45 20 6d  _STAGE_CAPTURE m
19b20 6f 64 65 2c 20 61 6c 6c 20 78 52 65 61 64 28 29  ode, all xRead()
19b30 20 63 61 6c 6c 73 20 6f 6e 20 74 68 65 20 77 61   calls on the wa
19b40 6c 20 66 69 6c 65 2c 20 61 6e 64 0a 2a 2a 20 20  l file, and.**  
19b50 20 20 20 61 6c 6c 20 78 57 72 69 74 65 28 29 20     all xWrite() 
19b60 63 61 6c 6c 73 20 6f 6e 20 74 68 65 20 74 61 72  calls on the tar
19b70 67 65 74 20 64 61 74 61 62 61 73 65 20 66 69 6c  get database fil
19b80 65 20 70 65 72 66 6f 72 6d 20 6e 6f 20 49 4f 2e  e perform no IO.
19b90 20 0a 2a 2a 20 20 20 20 20 49 6e 73 74 65 61 64   .**     Instead
19ba0 20 74 68 65 20 66 72 61 6d 65 20 61 6e 64 20 70   the frame and p
19bb0 61 67 65 20 6e 75 6d 62 65 72 73 20 74 68 61 74  age numbers that
19bc0 20 77 6f 75 6c 64 20 62 65 20 72 65 61 64 20 61   would be read a
19bd0 6e 64 20 77 72 69 74 74 65 6e 0a 2a 2a 20 20 20  nd written.**   
19be0 20 20 61 72 65 20 72 65 63 6f 72 64 65 64 2e 20    are recorded. 
19bf0 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 73 75  Additionally, su
19c00 63 63 65 73 73 66 75 6c 20 61 74 74 65 6d 70 74  ccessful attempt
19c10 73 20 74 6f 20 6f 62 74 61 69 6e 20 65 78 63 6c  s to obtain excl
19c20 75 73 69 76 65 0a 2a 2a 20 20 20 20 20 78 53 68  usive.**     xSh
19c30 6d 4c 6f 63 6b 28 29 20 57 52 49 54 45 52 2c 20  mLock() WRITER, 
19c40 43 48 45 43 4b 50 4f 49 4e 54 45 52 20 61 6e 64  CHECKPOINTER and
19c50 20 52 45 41 44 30 20 6c 6f 63 6b 73 20 6f 6e 20   READ0 locks on 
19c60 74 68 65 20 74 61 72 67 65 74 20 0a 2a 2a 20 20  the target .**  
19c70 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65     database file
19c80 20 61 72 65 20 72 65 63 6f 72 64 65 64 2e 20 78   are recorded. x
19c90 53 68 6d 4c 6f 63 6b 28 29 20 63 61 6c 6c 73 20  ShmLock() calls 
19ca0 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 73 61  to unlock the sa
19cb0 6d 65 0a 2a 2a 20 20 20 20 20 6c 6f 63 6b 73 20  me.**     locks 
19cc0 61 72 65 20 6e 6f 2d 6f 70 73 20 28 73 6f 20 74  are no-ops (so t
19cd0 68 61 74 20 6f 6e 63 65 20 6f 62 74 61 69 6e 65  hat once obtaine
19ce0 64 2c 20 74 68 65 73 65 20 6c 6f 63 6b 73 20 61  d, these locks a
19cf0 72 65 20 6e 65 76 65 72 0a 2a 2a 20 20 20 20 20  re never.**     
19d00 72 65 6c 69 6e 71 75 69 73 68 65 64 29 2e 20 46  relinquished). F
19d10 69 6e 61 6c 6c 79 2c 20 63 61 6c 6c 73 20 74 6f  inally, calls to
19d20 20 78 53 79 6e 63 28 29 20 6f 6e 20 74 68 65 20   xSync() on the 
19d30 74 61 72 67 65 74 20 64 61 74 61 62 61 73 65 0a  target database.
19d40 2a 2a 20 20 20 20 20 66 69 6c 65 20 66 61 69 6c  **     file fail
19d50 20 77 69 74 68 20 53 51 4c 49 54 45 5f 49 4e 54   with SQLITE_INT
19d60 45 52 4e 41 4c 20 65 72 72 6f 72 73 2e 0a 2a 2f  ERNAL errors..*/
19d70 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62  ..static void rb
19d80 75 55 6e 6c 6f 63 6b 53 68 6d 28 72 62 75 5f 66  uUnlockShm(rbu_f
19d90 69 6c 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  ile *p){.  if( p
19da0 2d 3e 70 52 62 75 20 29 7b 0a 20 20 20 20 69 6e  ->pRbu ){.    in
19db0 74 20 28 2a 78 53 68 6d 4c 6f 63 6b 29 28 73 71  t (*xShmLock)(sq
19dc0 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 69 6e 74 2c  lite3_file*,int,
19dd0 69 6e 74 2c 69 6e 74 29 20 3d 20 70 2d 3e 70 52  int,int) = p->pR
19de0 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78  eal->pMethods->x
19df0 53 68 6d 4c 6f 63 6b 3b 0a 20 20 20 20 69 6e 74  ShmLock;.    int
19e00 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
19e10 20 69 3c 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c   i<SQLITE_SHM_NL
19e20 4f 43 4b 3b 69 2b 2b 29 7b 0a 20 20 20 20 20 20  OCK;i++){.      
19e30 69 66 28 20 28 31 3c 3c 69 29 20 26 20 70 2d 3e  if( (1<<i) & p->
19e40 70 52 62 75 2d 3e 6d 4c 6f 63 6b 20 29 7b 0a 20  pRbu->mLock ){. 
19e50 20 20 20 20 20 20 20 78 53 68 6d 4c 6f 63 6b 28         xShmLock(
19e60 70 2d 3e 70 52 65 61 6c 2c 20 69 2c 20 31 2c 20  p->pReal, i, 1, 
19e70 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43  SQLITE_SHM_UNLOC
19e80 4b 7c 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43  K|SQLITE_SHM_EXC
19e90 4c 55 53 49 56 45 29 3b 0a 20 20 20 20 20 20 7d  LUSIVE);.      }
19ea0 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70 52  .    }.    p->pR
19eb0 62 75 2d 3e 6d 4c 6f 63 6b 20 3d 20 30 3b 0a 20  bu->mLock = 0;. 
19ec0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73   }.}../*.** Clos
19ed0 65 20 61 6e 20 72 62 75 20 66 69 6c 65 2e 0a 2a  e an rbu file..*
19ee0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62 75  /.static int rbu
19ef0 56 66 73 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  VfsClose(sqlite3
19f00 5f 66 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  _file *pFile){. 
19f10 20 72 62 75 5f 66 69 6c 65 20 2a 70 20 3d 20 28   rbu_file *p = (
19f20 72 62 75 5f 66 69 6c 65 2a 29 70 46 69 6c 65 3b  rbu_file*)pFile;
19f30 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
19f40 20 69 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74   i;..  /* Free t
19f50 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
19f60 68 65 20 61 70 53 68 6d 5b 5d 20 61 72 72 61 79  he apShm[] array
19f70 2e 20 41 6e 64 20 74 68 65 20 61 72 72 61 79 20  . And the array 
19f80 69 74 73 65 6c 66 2e 20 2a 2f 0a 20 20 66 6f 72  itself. */.  for
19f90 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 68 6d 3b  (i=0; i<p->nShm;
19fa0 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
19fb0 65 33 5f 66 72 65 65 28 70 2d 3e 61 70 53 68 6d  e3_free(p->apShm
19fc0 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  [i]);.  }.  sqli
19fd0 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 70 53 68  te3_free(p->apSh
19fe0 6d 29 3b 0a 20 20 70 2d 3e 61 70 53 68 6d 20 3d  m);.  p->apShm =
19ff0 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   0;.  sqlite3_fr
1a000 65 65 28 70 2d 3e 7a 44 65 6c 29 3b 0a 0a 20 20  ee(p->zDel);..  
1a010 69 66 28 20 70 2d 3e 6f 70 65 6e 46 6c 61 67 73  if( p->openFlags
1a020 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d   & SQLITE_OPEN_M
1a030 41 49 4e 5f 44 42 20 29 7b 0a 20 20 20 20 72 62  AIN_DB ){.    rb
1a040 75 5f 66 69 6c 65 20 2a 2a 70 70 3b 0a 20 20 20  u_file **pp;.   
1a050 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
1a060 6e 74 65 72 28 70 2d 3e 70 52 62 75 56 66 73 2d  nter(p->pRbuVfs-
1a070 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 66 6f 72  >mutex);.    for
1a080 28 70 70 3d 26 70 2d 3e 70 52 62 75 56 66 73 2d  (pp=&p->pRbuVfs-
1a090 3e 70 4d 61 69 6e 3b 20 2a 70 70 21 3d 70 3b 20  >pMain; *pp!=p; 
1a0a0 70 70 3d 26 28 28 2a 70 70 29 2d 3e 70 4d 61 69  pp=&((*pp)->pMai
1a0b0 6e 4e 65 78 74 29 29 3b 0a 20 20 20 20 2a 70 70  nNext));.    *pp
1a0c0 20 3d 20 70 2d 3e 70 4d 61 69 6e 4e 65 78 74 3b   = p->pMainNext;
1a0d0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
1a0e0 65 78 5f 6c 65 61 76 65 28 70 2d 3e 70 52 62 75  ex_leave(p->pRbu
1a0f0 56 66 73 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20  Vfs->mutex);.   
1a100 20 72 62 75 55 6e 6c 6f 63 6b 53 68 6d 28 70 29   rbuUnlockShm(p)
1a110 3b 0a 20 20 20 20 70 2d 3e 70 52 65 61 6c 2d 3e  ;.    p->pReal->
1a120 70 4d 65 74 68 6f 64 73 2d 3e 78 53 68 6d 55 6e  pMethods->xShmUn
1a130 6d 61 70 28 70 2d 3e 70 52 65 61 6c 2c 20 30 29  map(p->pReal, 0)
1a140 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 6f 73  ;.  }..  /* Clos
1a150 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  e the underlying
1a160 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a   file handle */.
1a170 20 20 72 63 20 3d 20 70 2d 3e 70 52 65 61 6c 2d    rc = p->pReal-
1a180 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 43 6c 6f 73  >pMethods->xClos
1a190 65 28 70 2d 3e 70 52 65 61 6c 29 3b 0a 20 20 72  e(p->pReal);.  r
1a1a0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
1a1b0 0a 2a 2a 20 52 65 61 64 20 61 6e 64 20 72 65 74  .** Read and ret
1a1c0 75 72 6e 20 61 6e 20 75 6e 73 69 67 6e 65 64 20  urn an unsigned 
1a1d0 33 32 2d 62 69 74 20 62 69 67 2d 65 6e 64 69 61  32-bit big-endia
1a1e0 6e 20 69 6e 74 65 67 65 72 20 66 72 6f 6d 20 74  n integer from t
1a1f0 68 65 20 62 75 66 66 65 72 20 0a 2a 2a 20 70 61  he buffer .** pa
1a200 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79  ssed as the only
1a210 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   argument..*/.st
1a220 61 74 69 63 20 75 33 32 20 72 62 75 47 65 74 55  atic u32 rbuGetU
1a230 33 32 28 75 38 20 2a 61 42 75 66 29 7b 0a 20 20  32(u8 *aBuf){.  
1a240 72 65 74 75 72 6e 20 28 28 75 33 32 29 61 42 75  return ((u32)aBu
1a250 66 5b 30 5d 20 3c 3c 20 32 34 29 0a 20 20 20 20  f[0] << 24).    
1a260 20 20 20 2b 20 28 28 75 33 32 29 61 42 75 66 5b     + ((u32)aBuf[
1a270 31 5d 20 3c 3c 20 31 36 29 0a 20 20 20 20 20 20  1] << 16).      
1a280 20 2b 20 28 28 75 33 32 29 61 42 75 66 5b 32 5d   + ((u32)aBuf[2]
1a290 20 3c 3c 20 20 38 29 0a 20 20 20 20 20 20 20 2b   <<  8).       +
1a2a0 20 28 28 75 33 32 29 61 42 75 66 5b 33 5d 29 3b   ((u32)aBuf[3]);
1a2b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64  .}../*.** Read d
1a2c0 61 74 61 20 66 72 6f 6d 20 61 6e 20 72 62 75 56  ata from an rbuV
1a2d0 66 73 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  fs-file..*/.stat
1a2e0 69 63 20 69 6e 74 20 72 62 75 56 66 73 52 65 61  ic int rbuVfsRea
1a2f0 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  d(.  sqlite3_fil
1a300 65 20 2a 70 46 69 6c 65 2c 20 0a 20 20 76 6f 69  e *pFile, .  voi
1a310 64 20 2a 7a 42 75 66 2c 20 0a 20 20 69 6e 74 20  d *zBuf, .  int 
1a320 69 41 6d 74 2c 20 0a 20 20 73 71 6c 69 74 65 5f  iAmt, .  sqlite_
1a330 69 6e 74 36 34 20 69 4f 66 73 74 0a 29 7b 0a 20  int64 iOfst.){. 
1a340 20 72 62 75 5f 66 69 6c 65 20 2a 70 20 3d 20 28   rbu_file *p = (
1a350 72 62 75 5f 66 69 6c 65 2a 29 70 46 69 6c 65 3b  rbu_file*)pFile;
1a360 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20 2a 70  .  sqlite3rbu *p
1a370 52 62 75 20 3d 20 70 2d 3e 70 52 62 75 3b 0a 20  Rbu = p->pRbu;. 
1a380 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
1a390 70 52 62 75 20 26 26 20 70 52 62 75 2d 3e 65 53  pRbu && pRbu->eS
1a3a0 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f  tage==RBU_STAGE_
1a3b0 43 41 50 54 55 52 45 20 29 7b 0a 20 20 20 20 61  CAPTURE ){.    a
1a3c0 73 73 65 72 74 28 20 70 2d 3e 6f 70 65 6e 46 6c  ssert( p->openFl
1a3d0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
1a3e0 4e 5f 57 41 4c 20 29 3b 0a 20 20 20 20 72 63 20  N_WAL );.    rc 
1a3f0 3d 20 72 62 75 43 61 70 74 75 72 65 57 61 6c 52  = rbuCaptureWalR
1a400 65 61 64 28 70 2d 3e 70 52 62 75 2c 20 69 4f 66  ead(p->pRbu, iOf
1a410 73 74 2c 20 69 41 6d 74 29 3b 0a 20 20 7d 65 6c  st, iAmt);.  }el
1a420 73 65 7b 0a 20 20 20 20 69 66 28 20 70 52 62 75  se{.    if( pRbu
1a430 20 26 26 20 70 52 62 75 2d 3e 65 53 74 61 67 65   && pRbu->eStage
1a440 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20  ==RBU_STAGE_OAL 
1a450 0a 20 20 20 20 20 26 26 20 28 70 2d 3e 6f 70 65  .     && (p->ope
1a460 6e 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  nFlags & SQLITE_
1a470 4f 50 45 4e 5f 57 41 4c 29 20 0a 20 20 20 20 20  OPEN_WAL) .     
1a480 26 26 20 69 4f 66 73 74 3e 3d 70 52 62 75 2d 3e  && iOfst>=pRbu->
1a490 69 4f 61 6c 53 7a 20 0a 20 20 20 20 29 7b 0a 20  iOalSz .    ){. 
1a4a0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1a4b0 5f 4f 4b 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65  _OK;.      memse
1a4c0 74 28 7a 42 75 66 2c 20 30 2c 20 69 41 6d 74 29  t(zBuf, 0, iAmt)
1a4d0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1a4e0 20 20 20 72 63 20 3d 20 70 2d 3e 70 52 65 61 6c     rc = p->pReal
1a4f0 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 52 65 61  ->pMethods->xRea
1a500 64 28 70 2d 3e 70 52 65 61 6c 2c 20 7a 42 75 66  d(p->pReal, zBuf
1a510 2c 20 69 41 6d 74 2c 20 69 4f 66 73 74 29 3b 0a  , iAmt, iOfst);.
1a520 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
1a530 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
1a540 4f 66 73 74 3d 3d 30 20 26 26 20 28 70 2d 3e 6f  Ofst==0 && (p->o
1a550 70 65 6e 46 6c 61 67 73 20 26 20 53 51 4c 49 54  penFlags & SQLIT
1a560 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 20  E_OPEN_MAIN_DB) 
1a570 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 73  ){.      /* Thes
1a580 65 20 6c 6f 6f 6b 20 6c 69 6b 65 20 6d 61 67 69  e look like magi
1a590 63 20 6e 75 6d 62 65 72 73 2e 20 42 75 74 20 74  c numbers. But t
1a5a0 68 65 79 20 61 72 65 20 73 74 61 62 6c 65 2c 20  hey are stable, 
1a5b0 61 73 20 74 68 65 79 20 61 72 65 20 70 61 72 74  as they are part
1a5c0 0a 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68  .       ** of th
1a5d0 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66 20  e definition of 
1a5e0 74 68 65 20 53 51 4c 69 74 65 20 66 69 6c 65 20  the SQLite file 
1a5f0 66 6f 72 6d 61 74 2c 20 77 68 69 63 68 20 6d 61  format, which ma
1a600 79 20 6e 6f 74 20 63 68 61 6e 67 65 2e 20 2a 2f  y not change. */
1a610 0a 20 20 20 20 20 20 75 38 20 2a 70 42 75 66 20  .      u8 *pBuf 
1a620 3d 20 28 75 38 2a 29 7a 42 75 66 3b 0a 20 20 20  = (u8*)zBuf;.   
1a630 20 20 20 70 2d 3e 69 43 6f 6f 6b 69 65 20 3d 20     p->iCookie = 
1a640 72 62 75 47 65 74 55 33 32 28 26 70 42 75 66 5b  rbuGetU32(&pBuf[
1a650 32 34 5d 29 3b 0a 20 20 20 20 20 20 70 2d 3e 69  24]);.      p->i
1a660 57 72 69 74 65 56 65 72 20 3d 20 70 42 75 66 5b  WriteVer = pBuf[
1a670 31 39 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  19];.    }.  }. 
1a680 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1a690 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61 74 61 20  *.** Write data 
1a6a0 74 6f 20 61 6e 20 72 62 75 56 66 73 2d 66 69 6c  to an rbuVfs-fil
1a6b0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1a6c0 20 72 62 75 56 66 73 57 72 69 74 65 28 0a 20 20   rbuVfsWrite(.  
1a6d0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
1a6e0 69 6c 65 2c 20 0a 20 20 63 6f 6e 73 74 20 76 6f  ile, .  const vo
1a6f0 69 64 20 2a 7a 42 75 66 2c 20 0a 20 20 69 6e 74  id *zBuf, .  int
1a700 20 69 41 6d 74 2c 20 0a 20 20 73 71 6c 69 74 65   iAmt, .  sqlite
1a710 5f 69 6e 74 36 34 20 69 4f 66 73 74 0a 29 7b 0a  _int64 iOfst.){.
1a720 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 20 3d 20    rbu_file *p = 
1a730 28 72 62 75 5f 66 69 6c 65 2a 29 70 46 69 6c 65  (rbu_file*)pFile
1a740 3b 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20 2a  ;.  sqlite3rbu *
1a750 70 52 62 75 20 3d 20 70 2d 3e 70 52 62 75 3b 0a  pRbu = p->pRbu;.
1a760 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
1a770 20 70 52 62 75 20 26 26 20 70 52 62 75 2d 3e 65   pRbu && pRbu->e
1a780 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45  Stage==RBU_STAGE
1a790 5f 43 41 50 54 55 52 45 20 29 7b 0a 20 20 20 20  _CAPTURE ){.    
1a7a0 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 65 6e 46  assert( p->openF
1a7b0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
1a7c0 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 3b 0a 20 20  EN_MAIN_DB );.  
1a7d0 20 20 72 63 20 3d 20 72 62 75 43 61 70 74 75 72    rc = rbuCaptur
1a7e0 65 44 62 57 72 69 74 65 28 70 2d 3e 70 52 62 75  eDbWrite(p->pRbu
1a7f0 2c 20 69 4f 66 73 74 29 3b 0a 20 20 7d 65 6c 73  , iOfst);.  }els
1a800 65 7b 0a 20 20 20 20 69 66 28 20 70 52 62 75 20  e{.    if( pRbu 
1a810 26 26 20 70 52 62 75 2d 3e 65 53 74 61 67 65 3d  && pRbu->eStage=
1a820 3d 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20 0a  =RBU_STAGE_OAL .
1a830 20 20 20 20 20 26 26 20 28 70 2d 3e 6f 70 65 6e       && (p->open
1a840 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  Flags & SQLITE_O
1a850 50 45 4e 5f 57 41 4c 29 20 0a 20 20 20 20 20 26  PEN_WAL) .     &
1a860 26 20 69 4f 66 73 74 3e 3d 70 52 62 75 2d 3e 69  & iOfst>=pRbu->i
1a870 4f 61 6c 53 7a 0a 20 20 20 20 29 7b 0a 20 20 20  OalSz.    ){.   
1a880 20 20 20 70 52 62 75 2d 3e 69 4f 61 6c 53 7a 20     pRbu->iOalSz 
1a890 3d 20 69 41 6d 74 20 2b 20 69 4f 66 73 74 3b 0a  = iAmt + iOfst;.
1a8a0 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 70      }.    rc = p
1a8b0 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64  ->pReal->pMethod
1a8c0 73 2d 3e 78 57 72 69 74 65 28 70 2d 3e 70 52 65  s->xWrite(p->pRe
1a8d0 61 6c 2c 20 7a 42 75 66 2c 20 69 41 6d 74 2c 20  al, zBuf, iAmt, 
1a8e0 69 4f 66 73 74 29 3b 0a 20 20 20 20 69 66 28 20  iOfst);.    if( 
1a8f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1a900 20 69 4f 66 73 74 3d 3d 30 20 26 26 20 28 70 2d   iOfst==0 && (p-
1a910 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20 53 51 4c  >openFlags & SQL
1a920 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
1a930 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  ) ){.      /* Th
1a940 65 73 65 20 6c 6f 6f 6b 20 6c 69 6b 65 20 6d 61  ese look like ma
1a950 67 69 63 20 6e 75 6d 62 65 72 73 2e 20 42 75 74  gic numbers. But
1a960 20 74 68 65 79 20 61 72 65 20 73 74 61 62 6c 65   they are stable
1a970 2c 20 61 73 20 74 68 65 79 20 61 72 65 20 70 61  , as they are pa
1a980 72 74 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74  rt.      ** of t
1a990 68 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66  he definition of
1a9a0 20 74 68 65 20 53 51 4c 69 74 65 20 66 69 6c 65   the SQLite file
1a9b0 20 66 6f 72 6d 61 74 2c 20 77 68 69 63 68 20 6d   format, which m
1a9c0 61 79 20 6e 6f 74 20 63 68 61 6e 67 65 2e 20 2a  ay not change. *
1a9d0 2f 0a 20 20 20 20 20 20 75 38 20 2a 70 42 75 66  /.      u8 *pBuf
1a9e0 20 3d 20 28 75 38 2a 29 7a 42 75 66 3b 0a 20 20   = (u8*)zBuf;.  
1a9f0 20 20 20 20 70 2d 3e 69 43 6f 6f 6b 69 65 20 3d      p->iCookie =
1aa00 20 72 62 75 47 65 74 55 33 32 28 26 70 42 75 66   rbuGetU32(&pBuf
1aa10 5b 32 34 5d 29 3b 0a 20 20 20 20 20 20 70 2d 3e  [24]);.      p->
1aa20 69 57 72 69 74 65 56 65 72 20 3d 20 70 42 75 66  iWriteVer = pBuf
1aa30 5b 31 39 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  [19];.    }.  }.
1aa40 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1aa50 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 61  /*.** Truncate a
1aa60 6e 20 72 62 75 56 66 73 2d 66 69 6c 65 2e 0a 2a  n rbuVfs-file..*
1aa70 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62 75  /.static int rbu
1aa80 56 66 73 54 72 75 6e 63 61 74 65 28 73 71 6c 69  VfsTruncate(sqli
1aa90 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c  te3_file *pFile,
1aaa0 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 73 69   sqlite_int64 si
1aab0 7a 65 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20  ze){.  rbu_file 
1aac0 2a 70 20 3d 20 28 72 62 75 5f 66 69 6c 65 2a 29  *p = (rbu_file*)
1aad0 70 46 69 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20  pFile;.  return 
1aae0 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f  p->pReal->pMetho
1aaf0 64 73 2d 3e 78 54 72 75 6e 63 61 74 65 28 70 2d  ds->xTruncate(p-
1ab00 3e 70 52 65 61 6c 2c 20 73 69 7a 65 29 3b 0a 7d  >pReal, size);.}
1ab10 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 61 6e 20  ../*.** Sync an 
1ab20 72 62 75 56 66 73 2d 66 69 6c 65 2e 0a 2a 2f 0a  rbuVfs-file..*/.
1ab30 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 56 66  static int rbuVf
1ab40 73 53 79 6e 63 28 73 71 6c 69 74 65 33 5f 66 69  sSync(sqlite3_fi
1ab50 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20 66  le *pFile, int f
1ab60 6c 61 67 73 29 7b 0a 20 20 72 62 75 5f 66 69 6c  lags){.  rbu_fil
1ab70 65 20 2a 70 20 3d 20 28 72 62 75 5f 66 69 6c 65  e *p = (rbu_file
1ab80 20 2a 29 70 46 69 6c 65 3b 0a 20 20 69 66 28 20   *)pFile;.  if( 
1ab90 70 2d 3e 70 52 62 75 20 26 26 20 70 2d 3e 70 52  p->pRbu && p->pR
1aba0 62 75 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f  bu->eStage==RBU_
1abb0 53 54 41 47 45 5f 43 41 50 54 55 52 45 20 29 7b  STAGE_CAPTURE ){
1abc0 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 65 6e  .    if( p->open
1abd0 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  Flags & SQLITE_O
1abe0 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 7b 0a 20  PEN_MAIN_DB ){. 
1abf0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1ac00 54 45 5f 49 4e 54 45 52 4e 41 4c 3b 0a 20 20 20  TE_INTERNAL;.   
1ac10 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51   }.    return SQ
1ac20 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72  LITE_OK;.  }.  r
1ac30 65 74 75 72 6e 20 70 2d 3e 70 52 65 61 6c 2d 3e  eturn p->pReal->
1ac40 70 4d 65 74 68 6f 64 73 2d 3e 78 53 79 6e 63 28  pMethods->xSync(
1ac50 70 2d 3e 70 52 65 61 6c 2c 20 66 6c 61 67 73 29  p->pReal, flags)
1ac60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1ac70 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 66 69  n the current fi
1ac80 6c 65 2d 73 69 7a 65 20 6f 66 20 61 6e 20 72 62  le-size of an rb
1ac90 75 56 66 73 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74  uVfs-file..*/.st
1aca0 61 74 69 63 20 69 6e 74 20 72 62 75 56 66 73 46  atic int rbuVfsF
1acb0 69 6c 65 53 69 7a 65 28 73 71 6c 69 74 65 33 5f  ileSize(sqlite3_
1acc0 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 73 71 6c  file *pFile, sql
1acd0 69 74 65 5f 69 6e 74 36 34 20 2a 70 53 69 7a 65  ite_int64 *pSize
1ace0 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a 70  ){.  rbu_file *p
1acf0 20 3d 20 28 72 62 75 5f 66 69 6c 65 20 2a 29 70   = (rbu_file *)p
1ad00 46 69 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 70  File;.  return p
1ad10 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64  ->pReal->pMethod
1ad20 73 2d 3e 78 46 69 6c 65 53 69 7a 65 28 70 2d 3e  s->xFileSize(p->
1ad30 70 52 65 61 6c 2c 20 70 53 69 7a 65 29 3b 0a 7d  pReal, pSize);.}
1ad40 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 61 6e 20  ../*.** Lock an 
1ad50 72 62 75 56 66 73 2d 66 69 6c 65 2e 0a 2a 2f 0a  rbuVfs-file..*/.
1ad60 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 56 66  static int rbuVf
1ad70 73 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  sLock(sqlite3_fi
1ad80 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20 65  le *pFile, int e
1ad90 4c 6f 63 6b 29 7b 0a 20 20 72 62 75 5f 66 69 6c  Lock){.  rbu_fil
1ada0 65 20 2a 70 20 3d 20 28 72 62 75 5f 66 69 6c 65  e *p = (rbu_file
1adb0 2a 29 70 46 69 6c 65 3b 0a 20 20 73 71 6c 69 74  *)pFile;.  sqlit
1adc0 65 33 72 62 75 20 2a 70 52 62 75 20 3d 20 70 2d  e3rbu *pRbu = p-
1add0 3e 70 52 62 75 3b 0a 20 20 69 6e 74 20 72 63 20  >pRbu;.  int rc 
1ade0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
1adf0 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 65 6e 46  assert( p->openF
1ae00 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f 4f  lags & (SQLITE_O
1ae10 50 45 4e 5f 4d 41 49 4e 5f 44 42 7c 53 51 4c 49  PEN_MAIN_DB|SQLI
1ae20 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 29  TE_OPEN_TEMP_DB)
1ae30 20 29 3b 0a 20 20 69 66 28 20 70 52 62 75 20 26   );.  if( pRbu &
1ae40 26 20 65 4c 6f 63 6b 3d 3d 53 51 4c 49 54 45 5f  & eLock==SQLITE_
1ae50 4c 4f 43 4b 5f 45 58 43 4c 55 53 49 56 45 20 26  LOCK_EXCLUSIVE &
1ae60 26 20 70 52 62 75 2d 3e 65 53 74 61 67 65 21 3d  & pRbu->eStage!=
1ae70 52 42 55 5f 53 54 41 47 45 5f 44 4f 4e 45 20 29  RBU_STAGE_DONE )
1ae80 7b 0a 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20  {.    /* Do not 
1ae90 61 6c 6c 6f 77 20 45 58 43 4c 55 53 49 56 45 20  allow EXCLUSIVE 
1aea0 6c 6f 63 6b 73 2e 20 50 72 65 76 65 6e 74 69 6e  locks. Preventin
1aeb0 67 20 53 51 4c 69 74 65 20 66 72 6f 6d 20 74 61  g SQLite from ta
1aec0 6b 69 6e 67 20 74 68 69 73 20 0a 20 20 20 20 2a  king this .    *
1aed0 2a 20 70 72 65 76 65 6e 74 73 20 69 74 20 66 72  * prevents it fr
1aee0 6f 6d 20 63 68 65 63 6b 70 6f 69 6e 74 69 6e 67  om checkpointing
1aef0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 72   the database fr
1af00 6f 6d 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  om sqlite3_close
1af10 28 29 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  (). */.    rc = 
1af20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
1af30 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 70  else{.    rc = p
1af40 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64  ->pReal->pMethod
1af50 73 2d 3e 78 4c 6f 63 6b 28 70 2d 3e 70 52 65 61  s->xLock(p->pRea
1af60 6c 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20 7d 0a 0a  l, eLock);.  }..
1af70 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1af80 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 61 6e 20  /*.** Unlock an 
1af90 72 62 75 56 66 73 2d 66 69 6c 65 2e 0a 2a 2f 0a  rbuVfs-file..*/.
1afa0 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 56 66  static int rbuVf
1afb0 73 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  sUnlock(sqlite3_
1afc0 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74  file *pFile, int
1afd0 20 65 4c 6f 63 6b 29 7b 0a 20 20 72 62 75 5f 66   eLock){.  rbu_f
1afe0 69 6c 65 20 2a 70 20 3d 20 28 72 62 75 5f 66 69  ile *p = (rbu_fi
1aff0 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 72 65  le *)pFile;.  re
1b000 74 75 72 6e 20 70 2d 3e 70 52 65 61 6c 2d 3e 70  turn p->pReal->p
1b010 4d 65 74 68 6f 64 73 2d 3e 78 55 6e 6c 6f 63 6b  Methods->xUnlock
1b020 28 70 2d 3e 70 52 65 61 6c 2c 20 65 4c 6f 63 6b  (p->pReal, eLock
1b030 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  );.}../*.** Chec
1b040 6b 20 69 66 20 61 6e 6f 74 68 65 72 20 66 69 6c  k if another fil
1b050 65 2d 68 61 6e 64 6c 65 20 68 6f 6c 64 73 20 61  e-handle holds a
1b060 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f   RESERVED lock o
1b070 6e 20 61 6e 20 72 62 75 56 66 73 2d 66 69 6c 65  n an rbuVfs-file
1b080 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1b090 72 62 75 56 66 73 43 68 65 63 6b 52 65 73 65 72  rbuVfsCheckReser
1b0a0 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  vedLock(sqlite3_
1b0b0 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74  file *pFile, int
1b0c0 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 72 62   *pResOut){.  rb
1b0d0 75 5f 66 69 6c 65 20 2a 70 20 3d 20 28 72 62 75  u_file *p = (rbu
1b0e0 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20  _file *)pFile;. 
1b0f0 20 72 65 74 75 72 6e 20 70 2d 3e 70 52 65 61 6c   return p->pReal
1b100 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 43 68 65  ->pMethods->xChe
1b110 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 70  ckReservedLock(p
1b120 2d 3e 70 52 65 61 6c 2c 20 70 52 65 73 4f 75 74  ->pReal, pResOut
1b130 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c 65  );.}../*.** File
1b140 20 63 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64 2e   control method.
1b150 20 46 6f 72 20 63 75 73 74 6f 6d 20 6f 70 65 72   For custom oper
1b160 61 74 69 6f 6e 73 20 6f 6e 20 61 6e 20 72 62 75  ations on an rbu
1b170 56 66 73 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  Vfs-file..*/.sta
1b180 74 69 63 20 69 6e 74 20 72 62 75 56 66 73 46 69  tic int rbuVfsFi
1b190 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65  leControl(sqlite
1b1a0 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69  3_file *pFile, i
1b1b0 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72  nt op, void *pAr
1b1c0 67 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a  g){.  rbu_file *
1b1d0 70 20 3d 20 28 72 62 75 5f 66 69 6c 65 20 2a 29  p = (rbu_file *)
1b1e0 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20 28 2a 78  pFile;.  int (*x
1b1f0 43 6f 6e 74 72 6f 6c 29 28 73 71 6c 69 74 65 33  Control)(sqlite3
1b200 5f 66 69 6c 65 2a 2c 69 6e 74 2c 76 6f 69 64 2a  _file*,int,void*
1b210 29 20 3d 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d  ) = p->pReal->pM
1b220 65 74 68 6f 64 73 2d 3e 78 46 69 6c 65 43 6f 6e  ethods->xFileCon
1b230 74 72 6f 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  trol;.  int rc;.
1b240 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70  .  assert( p->op
1b250 65 6e 46 6c 61 67 73 20 26 20 28 53 51 4c 49 54  enFlags & (SQLIT
1b260 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 7c 53  E_OPEN_MAIN_DB|S
1b270 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
1b280 44 42 29 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d  DB).       || p-
1b290 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20 28 53 51  >openFlags & (SQ
1b2a0 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49  LITE_OPEN_TRANSI
1b2b0 45 4e 54 5f 44 42 7c 53 51 4c 49 54 45 5f 4f 50  ENT_DB|SQLITE_OP
1b2c0 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 29  EN_TEMP_JOURNAL)
1b2d0 0a 20 20 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  .  );.  if( op==
1b2e0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 52 42 55  SQLITE_FCNTL_RBU
1b2f0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 72   ){.    sqlite3r
1b300 62 75 20 2a 70 52 62 75 20 3d 20 28 73 71 6c 69  bu *pRbu = (sqli
1b310 74 65 33 72 62 75 2a 29 70 41 72 67 3b 0a 0a 20  te3rbu*)pArg;.. 
1b320 20 20 20 2f 2a 20 46 69 72 73 74 20 74 72 79 20     /* First try 
1b330 74 6f 20 66 69 6e 64 20 61 6e 6f 74 68 65 72 20  to find another 
1b340 52 42 55 20 76 66 73 20 6c 6f 77 65 72 20 64 6f  RBU vfs lower do
1b350 77 6e 20 69 6e 20 74 68 65 20 76 66 73 20 73 74  wn in the vfs st
1b360 61 63 6b 2e 20 49 66 0a 20 20 20 20 2a 2a 20 6f  ack. If.    ** o
1b370 6e 65 20 69 73 20 66 6f 75 6e 64 2c 20 74 68 69  ne is found, thi
1b380 73 20 76 66 73 20 77 69 6c 6c 20 6f 70 65 72 61  s vfs will opera
1b390 74 65 20 69 6e 20 70 61 73 73 2d 74 68 72 6f 75  te in pass-throu
1b3a0 67 68 20 6d 6f 64 65 2e 20 54 68 65 20 6c 6f 77  gh mode. The low
1b3b0 65 72 0a 20 20 20 20 2a 2a 20 6c 65 76 65 6c 20  er.    ** level 
1b3c0 76 66 73 20 77 69 6c 6c 20 64 6f 20 74 68 65 20  vfs will do the 
1b3d0 73 70 65 63 69 61 6c 20 52 42 55 20 68 61 6e 64  special RBU hand
1b3e0 6c 69 6e 67 2e 20 20 2a 2f 0a 20 20 20 20 72 63  ling.  */.    rc
1b3f0 20 3d 20 78 43 6f 6e 74 72 6f 6c 28 70 2d 3e 70   = xControl(p->p
1b400 52 65 61 6c 2c 20 6f 70 2c 20 70 41 72 67 29 3b  Real, op, pArg);
1b410 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ..    if( rc==SQ
1b420 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 7b  LITE_NOTFOUND ){
1b430 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 77 20 73 65  .      /* Now se
1b440 61 72 63 68 20 66 6f 72 20 61 20 7a 69 70 76 66  arch for a zipvf
1b450 73 20 69 6e 73 74 61 6e 63 65 20 6c 6f 77 65 72  s instance lower
1b460 20 64 6f 77 6e 20 69 6e 20 74 68 65 20 56 46 53   down in the VFS
1b470 20 73 74 61 63 6b 2e 20 49 66 0a 20 20 20 20 20   stack. If.     
1b480 20 2a 2a 20 6f 6e 65 20 69 73 20 66 6f 75 6e 64   ** one is found
1b490 2c 20 74 68 69 73 20 69 73 20 61 6e 20 65 72 72  , this is an err
1b4a0 6f 72 2e 20 20 2a 2f 0a 20 20 20 20 20 20 76 6f  or.  */.      vo
1b4b0 69 64 20 2a 64 75 6d 6d 79 20 3d 20 30 3b 0a 20  id *dummy = 0;. 
1b4c0 20 20 20 20 20 72 63 20 3d 20 78 43 6f 6e 74 72       rc = xContr
1b4d0 6f 6c 28 70 2d 3e 70 52 65 61 6c 2c 20 53 51 4c  ol(p->pReal, SQL
1b4e0 49 54 45 5f 46 43 4e 54 4c 5f 5a 49 50 56 46 53  ITE_FCNTL_ZIPVFS
1b4f0 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 20  , &dummy);.     
1b500 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1b510 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
1b520 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
1b530 0a 20 20 20 20 20 20 20 20 70 52 62 75 2d 3e 7a  .        pRbu->z
1b540 45 72 72 6d 73 67 20 3d 20 73 71 6c 69 74 65 33  Errmsg = sqlite3
1b550 5f 6d 70 72 69 6e 74 66 28 22 72 62 75 2f 7a 69  _mprintf("rbu/zi
1b560 70 76 66 73 20 73 65 74 75 70 20 65 72 72 6f 72  pvfs setup error
1b570 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ");.      }else 
1b580 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  if( rc==SQLITE_N
1b590 4f 54 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20  OTFOUND ){.     
1b5a0 20 20 20 70 52 62 75 2d 3e 70 54 61 72 67 65 74     pRbu->pTarget
1b5b0 46 64 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20  Fd = p;.        
1b5c0 70 2d 3e 70 52 62 75 20 3d 20 70 52 62 75 3b 0a  p->pRbu = pRbu;.
1b5d0 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70          if( p->p
1b5e0 57 61 6c 46 64 20 29 20 70 2d 3e 70 57 61 6c 46  WalFd ) p->pWalF
1b5f0 64 2d 3e 70 52 62 75 20 3d 20 70 52 62 75 3b 0a  d->pRbu = pRbu;.
1b600 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1b610 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
1b620 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
1b630 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d   rc;.  }..  rc =
1b640 20 78 43 6f 6e 74 72 6f 6c 28 70 2d 3e 70 52 65   xControl(p->pRe
1b650 61 6c 2c 20 6f 70 2c 20 70 41 72 67 29 3b 0a 20  al, op, pArg);. 
1b660 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1b670 4f 4b 20 26 26 20 6f 70 3d 3d 53 51 4c 49 54 45  OK && op==SQLITE
1b680 5f 46 43 4e 54 4c 5f 56 46 53 4e 41 4d 45 20 29  _FCNTL_VFSNAME )
1b690 7b 0a 20 20 20 20 72 62 75 5f 76 66 73 20 2a 70  {.    rbu_vfs *p
1b6a0 52 62 75 56 66 73 20 3d 20 70 2d 3e 70 52 62 75  RbuVfs = p->pRbu
1b6b0 56 66 73 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  Vfs;.    char *z
1b6c0 49 6e 20 3d 20 2a 28 63 68 61 72 2a 2a 29 70 41  In = *(char**)pA
1b6d0 72 67 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4f  rg;.    char *zO
1b6e0 75 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ut = sqlite3_mpr
1b6f0 69 6e 74 66 28 22 72 62 75 28 25 73 29 2f 25 7a  intf("rbu(%s)/%z
1b700 22 2c 20 70 52 62 75 56 66 73 2d 3e 62 61 73 65  ", pRbuVfs->base
1b710 2e 7a 4e 61 6d 65 2c 20 7a 49 6e 29 3b 0a 20 20  .zName, zIn);.  
1b720 20 20 2a 28 63 68 61 72 2a 2a 29 70 41 72 67 20    *(char**)pArg 
1b730 3d 20 7a 4f 75 74 3b 0a 20 20 20 20 69 66 28 20  = zOut;.    if( 
1b740 7a 4f 75 74 3d 3d 30 20 29 20 72 63 20 3d 20 53  zOut==0 ) rc = S
1b750 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
1b760 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
1b770 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1b780 68 65 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 69  he sector-size i
1b790 6e 20 62 79 74 65 73 20 66 6f 72 20 61 6e 20 72  n bytes for an r
1b7a0 62 75 56 66 73 2d 66 69 6c 65 2e 0a 2a 2f 0a 73  buVfs-file..*/.s
1b7b0 74 61 74 69 63 20 69 6e 74 20 72 62 75 56 66 73  tatic int rbuVfs
1b7c0 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69 74  SectorSize(sqlit
1b7d0 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 29 7b  e3_file *pFile){
1b7e0 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 20 3d  .  rbu_file *p =
1b7f0 20 28 72 62 75 5f 66 69 6c 65 20 2a 29 70 46 69   (rbu_file *)pFi
1b800 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e  le;.  return p->
1b810 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d  pReal->pMethods-
1b820 3e 78 53 65 63 74 6f 72 53 69 7a 65 28 70 2d 3e  >xSectorSize(p->
1b830 70 52 65 61 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pReal);.}../*.**
1b840 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 76 69   Return the devi
1b850 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69  ce characteristi
1b860 63 20 66 6c 61 67 73 20 73 75 70 70 6f 72 74 65  c flags supporte
1b870 64 20 62 79 20 61 6e 20 72 62 75 56 66 73 2d 66  d by an rbuVfs-f
1b880 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
1b890 6e 74 20 72 62 75 56 66 73 44 65 76 69 63 65 43  nt rbuVfsDeviceC
1b8a0 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 73  haracteristics(s
1b8b0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
1b8c0 6c 65 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20  le){.  rbu_file 
1b8d0 2a 70 20 3d 20 28 72 62 75 5f 66 69 6c 65 20 2a  *p = (rbu_file *
1b8e0 29 70 46 69 6c 65 3b 0a 20 20 72 65 74 75 72 6e  )pFile;.  return
1b8f0 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68   p->pReal->pMeth
1b900 6f 64 73 2d 3e 78 44 65 76 69 63 65 43 68 61 72  ods->xDeviceChar
1b910 61 63 74 65 72 69 73 74 69 63 73 28 70 2d 3e 70  acteristics(p->p
1b920 52 65 61 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Real);.}../*.** 
1b930 54 61 6b 65 20 6f 72 20 72 65 6c 65 61 73 65 20  Take or release 
1b940 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  a shared-memory 
1b950 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lock..*/.static 
1b960 69 6e 74 20 72 62 75 56 66 73 53 68 6d 4c 6f 63  int rbuVfsShmLoc
1b970 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
1b980 70 46 69 6c 65 2c 20 69 6e 74 20 6f 66 73 74 2c  pFile, int ofst,
1b990 20 69 6e 74 20 6e 2c 20 69 6e 74 20 66 6c 61 67   int n, int flag
1b9a0 73 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a  s){.  rbu_file *
1b9b0 70 20 3d 20 28 72 62 75 5f 66 69 6c 65 2a 29 70  p = (rbu_file*)p
1b9c0 46 69 6c 65 3b 0a 20 20 73 71 6c 69 74 65 33 72  File;.  sqlite3r
1b9d0 62 75 20 2a 70 52 62 75 20 3d 20 70 2d 3e 70 52  bu *pRbu = p->pR
1b9e0 62 75 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  bu;.  int rc = S
1b9f0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 23 69 66 64 65  QLITE_OK;..#ifde
1ba00 66 20 53 51 4c 49 54 45 5f 41 4d 41 4c 47 41 4d  f SQLITE_AMALGAM
1ba10 41 54 49 4f 4e 0a 20 20 20 20 61 73 73 65 72 74  ATION.    assert
1ba20 28 20 57 41 4c 5f 43 4b 50 54 5f 4c 4f 43 4b 3d  ( WAL_CKPT_LOCK=
1ba30 3d 31 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  =1 );.#endif..  
1ba40 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 65 6e 46  assert( p->openF
1ba50 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f 4f  lags & (SQLITE_O
1ba60 50 45 4e 5f 4d 41 49 4e 5f 44 42 7c 53 51 4c 49  PEN_MAIN_DB|SQLI
1ba70 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 29  TE_OPEN_TEMP_DB)
1ba80 20 29 3b 0a 20 20 69 66 28 20 70 52 62 75 20 26   );.  if( pRbu &
1ba90 26 20 28 70 52 62 75 2d 3e 65 53 74 61 67 65 3d  & (pRbu->eStage=
1baa0 3d 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20 7c  =RBU_STAGE_OAL |
1bab0 7c 20 70 52 62 75 2d 3e 65 53 74 61 67 65 3d 3d  | pRbu->eStage==
1bac0 52 42 55 5f 53 54 41 47 45 5f 4d 4f 56 45 29 20  RBU_STAGE_MOVE) 
1bad0 29 7b 0a 20 20 20 20 2f 2a 20 4d 61 67 69 63 20  ){.    /* Magic 
1bae0 6e 75 6d 62 65 72 20 31 20 69 73 20 74 68 65 20  number 1 is the 
1baf0 57 41 4c 5f 43 4b 50 54 5f 4c 4f 43 4b 20 6c 6f  WAL_CKPT_LOCK lo
1bb00 63 6b 2e 20 50 72 65 76 65 6e 74 69 6e 67 20 53  ck. Preventing S
1bb10 51 4c 69 74 65 20 66 72 6f 6d 0a 20 20 20 20 2a  QLite from.    *
1bb20 2a 20 74 61 6b 69 6e 67 20 74 68 69 73 20 6c 6f  * taking this lo
1bb30 63 6b 20 61 6c 73 6f 20 70 72 65 76 65 6e 74 73  ck also prevents
1bb40 20 61 6e 79 20 63 68 65 63 6b 70 6f 69 6e 74 73   any checkpoints
1bb50 20 66 72 6f 6d 20 6f 63 63 75 72 72 69 6e 67 2e   from occurring.
1bb60 20 0a 20 20 20 20 2a 2a 20 74 6f 64 6f 3a 20 72   .    ** todo: r
1bb70 65 61 6c 6c 79 2c 20 69 74 27 73 20 6e 6f 74 20  eally, it's not 
1bb80 63 6c 65 61 72 20 77 68 79 20 74 68 69 73 20 6d  clear why this m
1bb90 69 67 68 74 20 6f 63 63 75 72 2c 20 61 73 20 0a  ight occur, as .
1bba0 20 20 20 20 2a 2a 20 77 61 6c 5f 61 75 74 6f 63      ** wal_autoc
1bbb0 68 65 63 6b 70 6f 69 6e 74 20 6f 75 67 68 74 20  heckpoint ought 
1bbc0 74 6f 20 62 65 20 74 75 72 6e 65 64 20 6f 66 66  to be turned off
1bbd0 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 66  .  */.    if( of
1bbe0 73 74 3d 3d 57 41 4c 5f 4c 4f 43 4b 5f 43 4b 50  st==WAL_LOCK_CKP
1bbf0 54 20 26 26 20 6e 3d 3d 31 20 29 20 72 63 20 3d  T && n==1 ) rc =
1bc00 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
1bc10 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 62  }else{.    int b
1bc20 43 61 70 74 75 72 65 20 3d 20 30 3b 0a 20 20 20  Capture = 0;.   
1bc30 20 69 66 28 20 6e 3d 3d 31 20 26 26 20 28 66 6c   if( n==1 && (fl
1bc40 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d  ags & SQLITE_SHM
1bc50 5f 45 58 43 4c 55 53 49 56 45 29 0a 20 20 20 20  _EXCLUSIVE).    
1bc60 20 26 26 20 70 52 62 75 20 26 26 20 70 52 62 75   && pRbu && pRbu
1bc70 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54  ->eStage==RBU_ST
1bc80 41 47 45 5f 43 41 50 54 55 52 45 0a 20 20 20 20  AGE_CAPTURE.    
1bc90 20 26 26 20 28 6f 66 73 74 3d 3d 57 41 4c 5f 4c   && (ofst==WAL_L
1bca0 4f 43 4b 5f 57 52 49 54 45 20 7c 7c 20 6f 66 73  OCK_WRITE || ofs
1bcb0 74 3d 3d 57 41 4c 5f 4c 4f 43 4b 5f 43 4b 50 54  t==WAL_LOCK_CKPT
1bcc0 20 7c 7c 20 6f 66 73 74 3d 3d 57 41 4c 5f 4c 4f   || ofst==WAL_LO
1bcd0 43 4b 5f 52 45 41 44 30 29 0a 20 20 20 20 29 7b  CK_READ0).    ){
1bce0 0a 20 20 20 20 20 20 62 43 61 70 74 75 72 65 20  .      bCapture 
1bcf0 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 1;.    }..    
1bd00 69 66 28 20 62 43 61 70 74 75 72 65 3d 3d 30 20  if( bCapture==0 
1bd10 7c 7c 20 30 3d 3d 28 66 6c 61 67 73 20 26 20 53  || 0==(flags & S
1bd20 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b  QLITE_SHM_UNLOCK
1bd30 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
1bd40 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f  p->pReal->pMetho
1bd50 64 73 2d 3e 78 53 68 6d 4c 6f 63 6b 28 70 2d 3e  ds->xShmLock(p->
1bd60 70 52 65 61 6c 2c 20 6f 66 73 74 2c 20 6e 2c 20  pReal, ofst, n, 
1bd70 66 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 69 66  flags);.      if
1bd80 28 20 62 43 61 70 74 75 72 65 20 26 26 20 72 63  ( bCapture && rc
1bd90 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1bda0 20 20 20 20 20 20 20 70 52 62 75 2d 3e 6d 4c 6f         pRbu->mLo
1bdb0 63 6b 20 7c 3d 20 28 31 20 3c 3c 20 6f 66 73 74  ck |= (1 << ofst
1bdc0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1bdd0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
1bde0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 62 74 61  c;.}../*.** Obta
1bdf0 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  in a pointer to 
1be00 61 20 6d 61 70 70 69 6e 67 20 6f 66 20 61 20 73  a mapping of a s
1be10 69 6e 67 6c 65 20 33 32 4b 69 42 20 70 61 67 65  ingle 32KiB page
1be20 20 6f 66 20 74 68 65 20 2a 2d 73 68 6d 20 66 69   of the *-shm fi
1be30 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
1be40 74 20 72 62 75 56 66 73 53 68 6d 4d 61 70 28 0a  t rbuVfsShmMap(.
1be50 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
1be60 70 46 69 6c 65 2c 20 0a 20 20 69 6e 74 20 69 52  pFile, .  int iR
1be70 65 67 69 6f 6e 2c 20 0a 20 20 69 6e 74 20 73 7a  egion, .  int sz
1be80 52 65 67 69 6f 6e 2c 20 0a 20 20 69 6e 74 20 69  Region, .  int i
1be90 73 57 72 69 74 65 2c 20 0a 20 20 76 6f 69 64 20  sWrite, .  void 
1bea0 76 6f 6c 61 74 69 6c 65 20 2a 2a 70 70 0a 29 7b  volatile **pp.){
1beb0 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 20 3d  .  rbu_file *p =
1bec0 20 28 72 62 75 5f 66 69 6c 65 2a 29 70 46 69 6c   (rbu_file*)pFil
1bed0 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  e;.  int rc = SQ
1bee0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 65  LITE_OK;.  int e
1bef0 53 74 61 67 65 20 3d 20 28 70 2d 3e 70 52 62 75  Stage = (p->pRbu
1bf00 20 3f 20 70 2d 3e 70 52 62 75 2d 3e 65 53 74 61   ? p->pRbu->eSta
1bf10 67 65 20 3a 20 30 29 3b 0a 0a 20 20 2f 2a 20 49  ge : 0);..  /* I
1bf20 66 20 6e 6f 74 20 69 6e 20 52 42 55 5f 53 54 41  f not in RBU_STA
1bf30 47 45 5f 4f 41 4c 2c 20 61 6c 6c 6f 77 20 74 68  GE_OAL, allow th
1bf40 69 73 20 63 61 6c 6c 20 74 6f 20 70 61 73 73 20  is call to pass 
1bf50 74 68 72 6f 75 67 68 2e 20 4f 72 2c 20 69 66 20  through. Or, if 
1bf60 74 68 69 73 0a 20 20 2a 2a 20 72 62 75 20 69 73  this.  ** rbu is
1bf70 20 69 6e 20 74 68 65 20 52 42 55 5f 53 54 41 47   in the RBU_STAG
1bf80 45 5f 4f 41 4c 20 73 74 61 74 65 2c 20 75 73 65  E_OAL state, use
1bf90 20 68 65 61 70 20 6d 65 6d 6f 72 79 20 66 6f 72   heap memory for
1bfa0 20 2a 2d 73 68 6d 20 73 70 61 63 65 20 0a 20 20   *-shm space .  
1bfb0 2a 2a 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20  ** instead of a 
1bfc0 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 20 2a  file on disk.  *
1bfd0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f  /.  assert( p->o
1bfe0 70 65 6e 46 6c 61 67 73 20 26 20 28 53 51 4c 49  penFlags & (SQLI
1bff0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 7c  TE_OPEN_MAIN_DB|
1c000 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
1c010 5f 44 42 29 20 29 3b 0a 20 20 69 66 28 20 65 53  _DB) );.  if( eS
1c020 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f  tage==RBU_STAGE_
1c030 4f 41 4c 20 7c 7c 20 65 53 74 61 67 65 3d 3d 52  OAL || eStage==R
1c040 42 55 5f 53 54 41 47 45 5f 4d 4f 56 45 20 29 7b  BU_STAGE_MOVE ){
1c050 0a 20 20 20 20 69 66 28 20 69 52 65 67 69 6f 6e  .    if( iRegion
1c060 3c 3d 70 2d 3e 6e 53 68 6d 20 29 7b 0a 20 20 20  <=p->nShm ){.   
1c070 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28     int nByte = (
1c080 69 52 65 67 69 6f 6e 2b 31 29 20 2a 20 73 69 7a  iRegion+1) * siz
1c090 65 6f 66 28 63 68 61 72 2a 29 3b 0a 20 20 20 20  eof(char*);.    
1c0a0 20 20 63 68 61 72 20 2a 2a 61 70 4e 65 77 20 3d    char **apNew =
1c0b0 20 28 63 68 61 72 2a 2a 29 73 71 6c 69 74 65 33   (char**)sqlite3
1c0c0 5f 72 65 61 6c 6c 6f 63 28 70 2d 3e 61 70 53 68  _realloc(p->apSh
1c0d0 6d 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  m, nByte);.     
1c0e0 20 69 66 28 20 61 70 4e 65 77 3d 3d 30 20 29 7b   if( apNew==0 ){
1c0f0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
1c100 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
1c110 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1c120 20 6d 65 6d 73 65 74 28 26 61 70 4e 65 77 5b 70   memset(&apNew[p
1c130 2d 3e 6e 53 68 6d 5d 2c 20 30 2c 20 73 69 7a 65  ->nShm], 0, size
1c140 6f 66 28 63 68 61 72 2a 29 20 2a 20 28 31 20 2b  of(char*) * (1 +
1c150 20 69 52 65 67 69 6f 6e 20 2d 20 70 2d 3e 6e 53   iRegion - p->nS
1c160 68 6d 29 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  hm));.        p-
1c170 3e 61 70 53 68 6d 20 3d 20 61 70 4e 65 77 3b 0a  >apShm = apNew;.
1c180 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 68 6d 20          p->nShm 
1c190 3d 20 69 52 65 67 69 6f 6e 2b 31 3b 0a 20 20 20  = iRegion+1;.   
1c1a0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
1c1b0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1c1c0 4b 20 26 26 20 70 2d 3e 61 70 53 68 6d 5b 69 52  K && p->apShm[iR
1c1d0 65 67 69 6f 6e 5d 3d 3d 30 20 29 7b 0a 20 20 20  egion]==0 ){.   
1c1e0 20 20 20 63 68 61 72 20 2a 70 4e 65 77 20 3d 20     char *pNew = 
1c1f0 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 6d  (char*)sqlite3_m
1c200 61 6c 6c 6f 63 28 73 7a 52 65 67 69 6f 6e 29 3b  alloc(szRegion);
1c210 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 3d  .      if( pNew=
1c220 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
1c230 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
1c240 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1c250 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 4e 65        memset(pNe
1c260 77 2c 20 30 2c 20 73 7a 52 65 67 69 6f 6e 29 3b  w, 0, szRegion);
1c270 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 70 53 68  .        p->apSh
1c280 6d 5b 69 52 65 67 69 6f 6e 5d 20 3d 20 70 4e 65  m[iRegion] = pNe
1c290 77 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  w;.      }.    }
1c2a0 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ..    if( rc==SQ
1c2b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1c2c0 20 2a 70 70 20 3d 20 70 2d 3e 61 70 53 68 6d 5b   *pp = p->apShm[
1c2d0 69 52 65 67 69 6f 6e 5d 3b 0a 20 20 20 20 7d 65  iRegion];.    }e
1c2e0 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 70 20 3d  lse{.      *pp =
1c2f0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   0;.    }.  }els
1c300 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
1c310 2d 3e 61 70 53 68 6d 3d 3d 30 20 29 3b 0a 20 20  ->apShm==0 );.  
1c320 20 20 72 63 20 3d 20 70 2d 3e 70 52 65 61 6c 2d    rc = p->pReal-
1c330 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53 68 6d 4d  >pMethods->xShmM
1c340 61 70 28 70 2d 3e 70 52 65 61 6c 2c 20 69 52 65  ap(p->pReal, iRe
1c350 67 69 6f 6e 2c 20 73 7a 52 65 67 69 6f 6e 2c 20  gion, szRegion, 
1c360 69 73 57 72 69 74 65 2c 20 70 70 29 3b 0a 20 20  isWrite, pp);.  
1c370 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
1c380 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 6d 6f 72 79 20  }../*.** Memory 
1c390 62 61 72 72 69 65 72 2e 0a 2a 2f 0a 73 74 61 74  barrier..*/.stat
1c3a0 69 63 20 76 6f 69 64 20 72 62 75 56 66 73 53 68  ic void rbuVfsSh
1c3b0 6d 42 61 72 72 69 65 72 28 73 71 6c 69 74 65 33  mBarrier(sqlite3
1c3c0 5f 66 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  _file *pFile){. 
1c3d0 20 72 62 75 5f 66 69 6c 65 20 2a 70 20 3d 20 28   rbu_file *p = (
1c3e0 72 62 75 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65  rbu_file *)pFile
1c3f0 3b 0a 20 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d  ;.  p->pReal->pM
1c400 65 74 68 6f 64 73 2d 3e 78 53 68 6d 42 61 72 72  ethods->xShmBarr
1c410 69 65 72 28 70 2d 3e 70 52 65 61 6c 29 3b 0a 7d  ier(p->pReal);.}
1c420 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 78 53 68 6d  ../*.** The xShm
1c430 55 6e 6d 61 70 20 6d 65 74 68 6f 64 2e 0a 2a 2f  Unmap method..*/
1c440 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 56  .static int rbuV
1c450 66 73 53 68 6d 55 6e 6d 61 70 28 73 71 6c 69 74  fsShmUnmap(sqlit
1c460 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20  e3_file *pFile, 
1c470 69 6e 74 20 64 65 6c 46 6c 61 67 29 7b 0a 20 20  int delFlag){.  
1c480 72 62 75 5f 66 69 6c 65 20 2a 70 20 3d 20 28 72  rbu_file *p = (r
1c490 62 75 5f 66 69 6c 65 2a 29 70 46 69 6c 65 3b 0a  bu_file*)pFile;.
1c4a0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1c4b0 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 65 53 74 61  E_OK;.  int eSta
1c4c0 67 65 20 3d 20 28 70 2d 3e 70 52 62 75 20 3f 20  ge = (p->pRbu ? 
1c4d0 70 2d 3e 70 52 62 75 2d 3e 65 53 74 61 67 65 20  p->pRbu->eStage 
1c4e0 3a 20 30 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  : 0);..  assert(
1c4f0 20 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20   p->openFlags & 
1c500 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  (SQLITE_OPEN_MAI
1c510 4e 5f 44 42 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  N_DB|SQLITE_OPEN
1c520 5f 54 45 4d 50 5f 44 42 29 20 29 3b 0a 20 20 69  _TEMP_DB) );.  i
1c530 66 28 20 65 53 74 61 67 65 3d 3d 52 42 55 5f 53  f( eStage==RBU_S
1c540 54 41 47 45 5f 4f 41 4c 20 7c 7c 20 65 53 74 61  TAGE_OAL || eSta
1c550 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4d 4f  ge==RBU_STAGE_MO
1c560 56 45 20 29 7b 0a 20 20 20 20 2f 2a 20 6e 6f 2d  VE ){.    /* no-
1c570 6f 70 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20  op */.  }else{. 
1c580 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68     /* Release th
1c590 65 20 63 68 65 63 6b 70 6f 69 6e 74 65 72 20 61  e checkpointer a
1c5a0 6e 64 20 77 72 69 74 65 72 20 6c 6f 63 6b 73 20  nd writer locks 
1c5b0 2a 2f 0a 20 20 20 20 72 62 75 55 6e 6c 6f 63 6b  */.    rbuUnlock
1c5c0 53 68 6d 28 70 29 3b 0a 20 20 20 20 72 63 20 3d  Shm(p);.    rc =
1c5d0 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68   p->pReal->pMeth
1c5e0 6f 64 73 2d 3e 78 53 68 6d 55 6e 6d 61 70 28 70  ods->xShmUnmap(p
1c5f0 2d 3e 70 52 65 61 6c 2c 20 64 65 6c 46 6c 61 67  ->pReal, delFlag
1c600 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1c610 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  rc;.}../*.** Giv
1c620 65 6e 20 74 68 61 74 20 7a 57 61 6c 20 70 6f 69  en that zWal poi
1c630 6e 74 73 20 74 6f 20 61 20 62 75 66 66 65 72 20  nts to a buffer 
1c640 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20 77 61 6c  containing a wal
1c650 20 66 69 6c 65 20 6e 61 6d 65 20 70 61 73 73 65   file name passe
1c660 64 20 74 6f 20 0a 2a 2a 20 65 69 74 68 65 72 20  d to .** either 
1c670 74 68 65 20 78 4f 70 65 6e 28 29 20 6f 72 20 78  the xOpen() or x
1c680 41 63 63 65 73 73 28 29 20 56 46 53 20 6d 65 74  Access() VFS met
1c690 68 6f 64 2c 20 72 65 74 75 72 6e 20 61 20 70 6f  hod, return a po
1c6a0 69 6e 74 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20  inter to the.** 
1c6b0 66 69 6c 65 2d 68 61 6e 64 6c 65 20 6f 70 65 6e  file-handle open
1c6c0 65 64 20 62 79 20 74 68 65 20 73 61 6d 65 20 64  ed by the same d
1c6d0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1c6e0 6f 6e 20 6f 6e 20 74 68 65 20 63 6f 72 72 65 73  on on the corres
1c6f0 70 6f 6e 64 69 6e 67 0a 2a 2a 20 64 61 74 61 62  ponding.** datab
1c700 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  ase file..*/.sta
1c710 74 69 63 20 72 62 75 5f 66 69 6c 65 20 2a 72 62  tic rbu_file *rb
1c720 75 46 69 6e 64 4d 61 69 6e 64 62 28 72 62 75 5f  uFindMaindb(rbu_
1c730 76 66 73 20 2a 70 52 62 75 56 66 73 2c 20 63 6f  vfs *pRbuVfs, co
1c740 6e 73 74 20 63 68 61 72 20 2a 7a 57 61 6c 29 7b  nst char *zWal){
1c750 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 44 62  .  rbu_file *pDb
1c760 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
1c770 78 5f 65 6e 74 65 72 28 70 52 62 75 56 66 73 2d  x_enter(pRbuVfs-
1c780 3e 6d 75 74 65 78 29 3b 0a 20 20 66 6f 72 28 70  >mutex);.  for(p
1c790 44 62 3d 70 52 62 75 56 66 73 2d 3e 70 4d 61 69  Db=pRbuVfs->pMai
1c7a0 6e 3b 20 70 44 62 20 26 26 20 70 44 62 2d 3e 7a  n; pDb && pDb->z
1c7b0 57 61 6c 21 3d 7a 57 61 6c 3b 20 70 44 62 3d 70  Wal!=zWal; pDb=p
1c7c0 44 62 2d 3e 70 4d 61 69 6e 4e 65 78 74 29 3b 0a  Db->pMainNext);.
1c7d0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1c7e0 6c 65 61 76 65 28 70 52 62 75 56 66 73 2d 3e 6d  leave(pRbuVfs->m
1c7f0 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
1c800 70 44 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70  pDb;.}../*.** Op
1c810 65 6e 20 61 6e 20 72 62 75 20 66 69 6c 65 20 68  en an rbu file h
1c820 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  andle..*/.static
1c830 20 69 6e 74 20 72 62 75 56 66 73 4f 70 65 6e 28   int rbuVfsOpen(
1c840 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
1c850 70 56 66 73 2c 0a 20 20 63 6f 6e 73 74 20 63 68  pVfs,.  const ch
1c860 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20 73 71 6c  ar *zName,.  sql
1c870 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65  ite3_file *pFile
1c880 2c 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 0a 20  ,.  int flags,. 
1c890 20 69 6e 74 20 2a 70 4f 75 74 46 6c 61 67 73 0a   int *pOutFlags.
1c8a0 29 7b 0a 20 20 73 74 61 74 69 63 20 73 71 6c 69  ){.  static sqli
1c8b0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 72  te3_io_methods r
1c8c0 62 75 76 66 73 5f 69 6f 5f 6d 65 74 68 6f 64 73  buvfs_io_methods
1c8d0 20 3d 20 7b 0a 20 20 20 20 32 2c 20 20 20 20 20   = {.    2,     
1c8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c8f0 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69         /* iVersi
1c900 6f 6e 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73  on */.    rbuVfs
1c910 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
1c920 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
1c930 65 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 52  e */.    rbuVfsR
1c940 65 61 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  ead,            
1c950 20 20 20 20 20 20 20 2f 2a 20 78 52 65 61 64 20         /* xRead 
1c960 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 57 72 69  */.    rbuVfsWri
1c970 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
1c980 20 20 20 20 20 2f 2a 20 78 57 72 69 74 65 20 2a       /* xWrite *
1c990 2f 0a 20 20 20 20 72 62 75 56 66 73 54 72 75 6e  /.    rbuVfsTrun
1c9a0 63 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  cate,           
1c9b0 20 20 20 20 2f 2a 20 78 54 72 75 6e 63 61 74 65      /* xTruncate
1c9c0 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 53 79   */.    rbuVfsSy
1c9d0 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nc,             
1c9e0 20 20 20 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a        /* xSync *
1c9f0 2f 0a 20 20 20 20 72 62 75 56 66 73 46 69 6c 65  /.    rbuVfsFile
1ca00 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20  Size,           
1ca10 20 20 20 20 2f 2a 20 78 46 69 6c 65 53 69 7a 65      /* xFileSize
1ca20 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 4c 6f   */.    rbuVfsLo
1ca30 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
1ca40 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a        /* xLock *
1ca50 2f 0a 20 20 20 20 72 62 75 56 66 73 55 6e 6c 6f  /.    rbuVfsUnlo
1ca60 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
1ca70 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a      /* xUnlock *
1ca80 2f 0a 20 20 20 20 72 62 75 56 66 73 43 68 65 63  /.    rbuVfsChec
1ca90 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20  kReservedLock,  
1caa0 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73      /* xCheckRes
1cab0 65 72 76 65 64 4c 6f 63 6b 20 2a 2f 0a 20 20 20  ervedLock */.   
1cac0 20 72 62 75 56 66 73 46 69 6c 65 43 6f 6e 74 72   rbuVfsFileContr
1cad0 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ol,            /
1cae0 2a 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a  * xFileControl *
1caf0 2f 0a 20 20 20 20 72 62 75 56 66 73 53 65 63 74  /.    rbuVfsSect
1cb00 6f 72 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20  orSize,         
1cb10 20 20 20 20 2f 2a 20 78 53 65 63 74 6f 72 53 69      /* xSectorSi
1cb20 7a 65 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73  ze */.    rbuVfs
1cb30 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
1cb40 73 74 69 63 73 2c 20 20 2f 2a 20 78 44 65 76 69  stics,  /* xDevi
1cb50 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
1cb60 73 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 53  s */.    rbuVfsS
1cb70 68 6d 4d 61 70 2c 20 20 20 20 20 20 20 20 20 20  hmMap,          
1cb80 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61         /* xShmMa
1cb90 70 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 53  p */.    rbuVfsS
1cba0 68 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  hmLock,         
1cbb0 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4c 6f         /* xShmLo
1cbc0 63 6b 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73  ck */.    rbuVfs
1cbd0 53 68 6d 42 61 72 72 69 65 72 2c 20 20 20 20 20  ShmBarrier,     
1cbe0 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 42          /* xShmB
1cbf0 61 72 72 69 65 72 20 2a 2f 0a 20 20 20 20 72 62  arrier */.    rb
1cc00 75 56 66 73 53 68 6d 55 6e 6d 61 70 20 20 20 20  uVfsShmUnmap    
1cc10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1cc20 53 68 6d 55 6e 6d 61 70 20 2a 2f 0a 20 20 7d 3b  ShmUnmap */.  };
1cc30 0a 20 20 72 62 75 5f 76 66 73 20 2a 70 52 62 75  .  rbu_vfs *pRbu
1cc40 56 66 73 20 3d 20 28 72 62 75 5f 76 66 73 2a 29  Vfs = (rbu_vfs*)
1cc50 70 56 66 73 3b 0a 20 20 73 71 6c 69 74 65 33 5f  pVfs;.  sqlite3_
1cc60 76 66 73 20 2a 70 52 65 61 6c 56 66 73 20 3d 20  vfs *pRealVfs = 
1cc70 70 52 62 75 56 66 73 2d 3e 70 52 65 61 6c 56 66  pRbuVfs->pRealVf
1cc80 73 3b 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a 70  s;.  rbu_file *p
1cc90 46 64 20 3d 20 28 72 62 75 5f 66 69 6c 65 20 2a  Fd = (rbu_file *
1cca0 29 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20 72 63  )pFile;.  int rc
1ccb0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1ccc0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 65  const char *zOpe
1ccd0 6e 20 3d 20 7a 4e 61 6d 65 3b 0a 0a 20 20 6d 65  n = zName;..  me
1cce0 6d 73 65 74 28 70 46 64 2c 20 30 2c 20 73 69 7a  mset(pFd, 0, siz
1ccf0 65 6f 66 28 72 62 75 5f 66 69 6c 65 29 29 3b 0a  eof(rbu_file));.
1cd00 20 20 70 46 64 2d 3e 70 52 65 61 6c 20 3d 20 28    pFd->pReal = (
1cd10 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 26 70  sqlite3_file*)&p
1cd20 46 64 5b 31 5d 3b 0a 20 20 70 46 64 2d 3e 70 52  Fd[1];.  pFd->pR
1cd30 62 75 56 66 73 20 3d 20 70 52 62 75 56 66 73 3b  buVfs = pRbuVfs;
1cd40 0a 20 20 70 46 64 2d 3e 6f 70 65 6e 46 6c 61 67  .  pFd->openFlag
1cd50 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 69 66 28  s = flags;.  if(
1cd60 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 69 66   zName ){.    if
1cd70 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ( flags & SQLITE
1cd80 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 7b  _OPEN_MAIN_DB ){
1cd90 0a 20 20 20 20 20 20 2f 2a 20 41 20 6d 61 69 6e  .      /* A main
1cda0 20 64 61 74 61 62 61 73 65 20 68 61 73 20 6a 75   database has ju
1cdb0 73 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e 20  st been opened. 
1cdc0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c  The following bl
1cdd0 6f 63 6b 20 73 65 74 73 0a 20 20 20 20 20 20 2a  ock sets.      *
1cde0 2a 20 28 70 46 64 2d 3e 7a 57 61 6c 29 20 74 6f  * (pFd->zWal) to
1cdf0 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66   point to a buff
1ce00 65 72 20 6f 77 6e 65 64 20 62 79 20 53 51 4c 69  er owned by SQLi
1ce10 74 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  te that contains
1ce20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6e 61  .      ** the na
1ce30 6d 65 20 6f 66 20 74 68 65 20 2a 2d 77 61 6c 20  me of the *-wal 
1ce40 66 69 6c 65 20 74 68 69 73 20 64 62 20 63 6f 6e  file this db con
1ce50 6e 65 63 74 69 6f 6e 20 77 69 6c 6c 20 75 73 65  nection will use
1ce60 2e 20 53 51 4c 69 74 65 0a 20 20 20 20 20 20 2a  . SQLite.      *
1ce70 2a 20 68 61 70 70 65 6e 73 20 74 6f 20 70 61 73  * happens to pas
1ce80 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
1ce90 68 69 73 20 62 75 66 66 65 72 20 77 68 65 6e 20  his buffer when 
1cea0 75 73 69 6e 67 20 78 41 63 63 65 73 73 28 29 0a  using xAccess().
1ceb0 20 20 20 20 20 20 2a 2a 20 6f 72 20 78 4f 70 65        ** or xOpe
1cec0 6e 28 29 20 74 6f 20 6f 70 65 72 61 74 65 20 6f  n() to operate o
1ced0 6e 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65  n the *-wal file
1cee0 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  .  */.      int 
1cef0 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65  n = strlen(zName
1cf00 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  );.      const c
1cf10 68 61 72 20 2a 7a 20 3d 20 26 7a 4e 61 6d 65 5b  har *z = &zName[
1cf20 6e 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 66 6c  n];.      if( fl
1cf30 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
1cf40 4e 5f 55 52 49 20 29 7b 0a 20 20 20 20 20 20 20  N_URI ){.       
1cf50 20 69 6e 74 20 6f 64 64 20 3d 20 30 3b 0a 20 20   int odd = 0;.  
1cf60 20 20 20 20 20 20 77 68 69 6c 65 28 20 31 20 29        while( 1 )
1cf70 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
1cf80 7a 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  z[0]==0 ){.     
1cf90 20 20 20 20 20 20 20 6f 64 64 20 3d 20 31 20 2d         odd = 1 -
1cfa0 20 6f 64 64 3b 0a 20 20 20 20 20 20 20 20 20 20   odd;.          
1cfb0 20 20 69 66 28 20 6f 64 64 20 26 26 20 7a 5b 31    if( odd && z[1
1cfc0 5d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  ]==0 ) break;.  
1cfd0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1cfe0 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 20      z++;.       
1cff0 20 7d 0a 20 20 20 20 20 20 20 20 7a 20 2b 3d 20   }.        z += 
1d000 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  2;.      }else{.
1d010 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 2a          while( *
1d020 7a 3d 3d 30 20 29 20 7a 2b 2b 3b 0a 20 20 20 20  z==0 ) z++;.    
1d030 20 20 7d 0a 20 20 20 20 20 20 7a 20 2b 3d 20 28    }.      z += (
1d040 6e 20 2b 20 38 20 2b 20 31 29 3b 0a 20 20 20 20  n + 8 + 1);.    
1d050 20 20 70 46 64 2d 3e 7a 57 61 6c 20 3d 20 7a 3b    pFd->zWal = z;
1d060 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20  .    }.    else 
1d070 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49  if( flags & SQLI
1d080 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 29 7b 0a 20  TE_OPEN_WAL ){. 
1d090 20 20 20 20 20 72 62 75 5f 66 69 6c 65 20 2a 70       rbu_file *p
1d0a0 44 62 20 3d 20 72 62 75 46 69 6e 64 4d 61 69 6e  Db = rbuFindMain
1d0b0 64 62 28 70 52 62 75 56 66 73 2c 20 7a 4e 61 6d  db(pRbuVfs, zNam
1d0c0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44  e);.      if( pD
1d0d0 62 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  b ){.        if(
1d0e0 20 70 44 62 2d 3e 70 52 62 75 20 26 26 20 70 44   pDb->pRbu && pD
1d0f0 62 2d 3e 70 52 62 75 2d 3e 65 53 74 61 67 65 3d  b->pRbu->eStage=
1d100 3d 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20 29  =RBU_STAGE_OAL )
1d110 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
1d120 68 69 73 20 63 61 6c 6c 20 69 73 20 74 6f 20 6f  his call is to o
1d130 70 65 6e 20 61 20 2a 2d 77 61 6c 20 66 69 6c 65  pen a *-wal file
1d140 2e 20 49 6e 74 65 61 64 2c 20 6f 70 65 6e 20 74  . Intead, open t
1d150 68 65 20 2a 2d 6f 61 6c 2e 20 54 68 69 73 0a 20  he *-oal. This. 
1d160 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 64 65           ** code
1d170 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 74 68   ensures that th
1d180 65 20 73 74 72 69 6e 67 20 70 61 73 73 65 64 20  e string passed 
1d190 74 6f 20 78 4f 70 65 6e 28 29 20 69 73 20 74 65  to xOpen() is te
1d1a0 72 6d 69 6e 61 74 65 64 20 62 79 20 61 0a 20 20  rminated by a.  
1d1b0 20 20 20 20 20 20 20 20 2a 2a 20 70 61 69 72 20          ** pair 
1d1c0 6f 66 20 27 5c 30 27 20 62 79 74 65 73 20 69 6e  of '\0' bytes in
1d1d0 20 63 61 73 65 20 74 68 65 20 56 46 53 20 61 74   case the VFS at
1d1e0 74 65 6d 70 74 73 20 74 6f 20 65 78 74 72 61 63  tempts to extrac
1d1f0 74 20 61 20 55 52 49 20 0a 20 20 20 20 20 20 20  t a URI .       
1d200 20 20 20 2a 2a 20 70 61 72 61 6d 65 74 65 72 20     ** parameter 
1d210 66 72 6f 6d 20 69 74 2e 20 20 2a 2f 0a 20 20 20  from it.  */.   
1d220 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 70 79         int nCopy
1d230 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29   = strlen(zName)
1d240 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72  ;.          char
1d250 20 2a 7a 43 6f 70 79 20 3d 20 73 71 6c 69 74 65   *zCopy = sqlite
1d260 33 5f 6d 61 6c 6c 6f 63 28 6e 43 6f 70 79 2b 32  3_malloc(nCopy+2
1d270 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
1d280 20 7a 43 6f 70 79 20 29 7b 0a 20 20 20 20 20 20   zCopy ){.      
1d290 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 43 6f        memcpy(zCo
1d2a0 70 79 2c 20 7a 4e 61 6d 65 2c 20 6e 43 6f 70 79  py, zName, nCopy
1d2b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  );.            z
1d2c0 43 6f 70 79 5b 6e 43 6f 70 79 2d 33 5d 20 3d 20  Copy[nCopy-3] = 
1d2d0 27 6f 27 3b 0a 20 20 20 20 20 20 20 20 20 20 20  'o';.           
1d2e0 20 7a 43 6f 70 79 5b 6e 43 6f 70 79 5d 20 3d 20   zCopy[nCopy] = 
1d2f0 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20 20 20  '\0';.          
1d300 20 20 7a 43 6f 70 79 5b 6e 43 6f 70 79 2b 31 5d    zCopy[nCopy+1]
1d310 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 20   = '\0';.       
1d320 20 20 20 20 20 7a 4f 70 65 6e 20 3d 20 28 63 6f       zOpen = (co
1d330 6e 73 74 20 63 68 61 72 2a 29 28 70 46 64 2d 3e  nst char*)(pFd->
1d340 7a 44 65 6c 20 3d 20 7a 43 6f 70 79 29 3b 0a 20  zDel = zCopy);. 
1d350 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
1d360 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
1d370 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
1d380 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1d390 20 20 20 20 20 70 46 64 2d 3e 70 52 62 75 20 3d       pFd->pRbu =
1d3a0 20 70 44 62 2d 3e 70 52 62 75 3b 0a 20 20 20 20   pDb->pRbu;.    
1d3b0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 44      }.        pD
1d3c0 62 2d 3e 70 57 61 6c 46 64 20 3d 20 70 46 64 3b  b->pWalFd = pFd;
1d3d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1d3e0 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   }..  if( rc==SQ
1d3f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
1d400 63 20 3d 20 70 52 65 61 6c 56 66 73 2d 3e 78 4f  c = pRealVfs->xO
1d410 70 65 6e 28 70 52 65 61 6c 56 66 73 2c 20 7a 4f  pen(pRealVfs, zO
1d420 70 65 6e 2c 20 70 46 64 2d 3e 70 52 65 61 6c 2c  pen, pFd->pReal,
1d430 20 66 6c 61 67 73 2c 20 70 4f 75 74 46 6c 61 67   flags, pOutFlag
1d440 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 46  s);.  }.  if( pF
1d450 64 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f  d->pReal->pMetho
1d460 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  ds ){.    /* The
1d470 20 78 4f 70 65 6e 28 29 20 6f 70 65 72 61 74 69   xOpen() operati
1d480 6f 6e 20 68 61 73 20 73 75 63 63 65 65 64 65 64  on has succeeded
1d490 2e 20 53 65 74 20 74 68 65 20 73 71 6c 69 74 65  . Set the sqlite
1d4a0 33 5f 66 69 6c 65 2e 70 4d 65 74 68 6f 64 73 0a  3_file.pMethods.
1d4b0 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 61      ** pointer a
1d4c0 6e 64 2c 20 69 66 20 74 68 65 20 66 69 6c 65 20  nd, if the file 
1d4d0 69 73 20 61 20 6d 61 69 6e 20 64 61 74 61 62 61  is a main databa
1d4e0 73 65 20 66 69 6c 65 2c 20 6c 69 6e 6b 20 69 74  se file, link it
1d4f0 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a   into the.    **
1d500 20 6d 75 74 65 78 20 70 72 6f 74 65 63 74 65 64   mutex protected
1d510 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   linked list of 
1d520 61 6c 6c 20 73 75 63 68 20 66 69 6c 65 73 2e 20  all such files. 
1d530 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70   */.    pFile->p
1d540 4d 65 74 68 6f 64 73 20 3d 20 26 72 62 75 76 66  Methods = &rbuvf
1d550 73 5f 69 6f 5f 6d 65 74 68 6f 64 73 3b 0a 20 20  s_io_methods;.  
1d560 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51    if( flags & SQ
1d570 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
1d580 42 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  B ){.      sqlit
1d590 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
1d5a0 52 62 75 56 66 73 2d 3e 6d 75 74 65 78 29 3b 0a  RbuVfs->mutex);.
1d5b0 20 20 20 20 20 20 70 46 64 2d 3e 70 4d 61 69 6e        pFd->pMain
1d5c0 4e 65 78 74 20 3d 20 70 52 62 75 56 66 73 2d 3e  Next = pRbuVfs->
1d5d0 70 4d 61 69 6e 3b 0a 20 20 20 20 20 20 70 52 62  pMain;.      pRb
1d5e0 75 56 66 73 2d 3e 70 4d 61 69 6e 20 3d 20 70 46  uVfs->pMain = pF
1d5f0 64 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  d;.      sqlite3
1d600 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 52 62  _mutex_leave(pRb
1d610 75 56 66 73 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  uVfs->mutex);.  
1d620 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
1d630 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46   sqlite3_free(pF
1d640 64 2d 3e 7a 44 65 6c 29 3b 0a 20 20 7d 0a 0a 20  d->zDel);.  }.. 
1d650 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1d660 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20  *.** Delete the 
1d670 66 69 6c 65 20 6c 6f 63 61 74 65 64 20 61 74 20  file located at 
1d680 7a 50 61 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63  zPath..*/.static
1d690 20 69 6e 74 20 72 62 75 56 66 73 44 65 6c 65 74   int rbuVfsDelet
1d6a0 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  e(sqlite3_vfs *p
1d6b0 56 66 73 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  Vfs, const char 
1d6c0 2a 7a 50 61 74 68 2c 20 69 6e 74 20 64 69 72 53  *zPath, int dirS
1d6d0 79 6e 63 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  ync){.  sqlite3_
1d6e0 76 66 73 20 2a 70 52 65 61 6c 56 66 73 20 3d 20  vfs *pRealVfs = 
1d6f0 28 28 72 62 75 5f 76 66 73 2a 29 70 56 66 73 29  ((rbu_vfs*)pVfs)
1d700 2d 3e 70 52 65 61 6c 56 66 73 3b 0a 20 20 72 65  ->pRealVfs;.  re
1d710 74 75 72 6e 20 70 52 65 61 6c 56 66 73 2d 3e 78  turn pRealVfs->x
1d720 44 65 6c 65 74 65 28 70 52 65 61 6c 56 66 73 2c  Delete(pRealVfs,
1d730 20 7a 50 61 74 68 2c 20 64 69 72 53 79 6e 63 29   zPath, dirSync)
1d740 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20  ;.}../*.** Test 
1d750 66 6f 72 20 61 63 63 65 73 73 20 70 65 72 6d 69  for access permi
1d760 73 73 69 6f 6e 73 2e 20 52 65 74 75 72 6e 20 74  ssions. Return t
1d770 72 75 65 20 69 66 20 74 68 65 20 72 65 71 75 65  rue if the reque
1d780 73 74 65 64 20 70 65 72 6d 69 73 73 69 6f 6e 0a  sted permission.
1d790 2a 2a 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c  ** is available,
1d7a0 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77   or false otherw
1d7b0 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ise..*/.static i
1d7c0 6e 74 20 72 62 75 56 66 73 41 63 63 65 73 73 28  nt rbuVfsAccess(
1d7d0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
1d7e0 70 56 66 73 2c 20 0a 20 20 63 6f 6e 73 74 20 63  pVfs, .  const c
1d7f0 68 61 72 20 2a 7a 50 61 74 68 2c 20 0a 20 20 69  har *zPath, .  i
1d800 6e 74 20 66 6c 61 67 73 2c 20 0a 20 20 69 6e 74  nt flags, .  int
1d810 20 2a 70 52 65 73 4f 75 74 0a 29 7b 0a 20 20 72   *pResOut.){.  r
1d820 62 75 5f 76 66 73 20 2a 70 52 62 75 56 66 73 20  bu_vfs *pRbuVfs 
1d830 3d 20 28 72 62 75 5f 76 66 73 2a 29 70 56 66 73  = (rbu_vfs*)pVfs
1d840 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  ;.  sqlite3_vfs 
1d850 2a 70 52 65 61 6c 56 66 73 20 3d 20 70 52 62 75  *pRealVfs = pRbu
1d860 56 66 73 2d 3e 70 52 65 61 6c 56 66 73 3b 0a 20  Vfs->pRealVfs;. 
1d870 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d   int rc;..  rc =
1d880 20 70 52 65 61 6c 56 66 73 2d 3e 78 41 63 63 65   pRealVfs->xAcce
1d890 73 73 28 70 52 65 61 6c 56 66 73 2c 20 7a 50 61  ss(pRealVfs, zPa
1d8a0 74 68 2c 20 66 6c 61 67 73 2c 20 70 52 65 73 4f  th, flags, pResO
1d8b0 75 74 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ut);..  /* If th
1d8c0 69 73 20 63 61 6c 6c 20 69 73 20 74 6f 20 63 68  is call is to ch
1d8d0 65 63 6b 20 69 66 20 61 20 2a 2d 77 61 6c 20 66  eck if a *-wal f
1d8e0 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ile associated w
1d8f0 69 74 68 20 61 6e 20 52 42 55 20 74 61 72 67 65  ith an RBU targe
1d900 74 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20  t.  ** database 
1d910 63 6f 6e 6e 65 63 74 69 6f 6e 20 65 78 69 73 74  connection exist
1d920 73 2c 20 61 6e 64 20 74 68 65 20 52 42 55 20 75  s, and the RBU u
1d930 70 64 61 74 65 20 69 73 20 69 6e 20 52 42 55 5f  pdate is in RBU_
1d940 53 54 41 47 45 5f 4f 41 4c 2c 0a 20 20 2a 2a 20  STAGE_OAL,.  ** 
1d950 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 70  the following sp
1d960 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67 20 69  ecial handling i
1d970 73 20 61 63 74 69 76 61 74 65 64 3a 0a 20 20 2a  s activated:.  *
1d980 2a 0a 20 20 2a 2a 20 20 20 61 29 20 69 66 20 74  *.  **   a) if t
1d990 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 64 6f  he *-wal file do
1d9a0 65 73 20 65 78 69 73 74 2c 20 72 65 74 75 72 6e  es exist, return
1d9b0 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
1d9c0 2e 20 54 68 69 73 0a 20 20 2a 2a 20 20 20 20 20  . This.  **     
1d9d0 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 74 68   ensures that th
1d9e0 65 20 52 42 55 20 65 78 74 65 6e 73 69 6f 6e 20  e RBU extension 
1d9f0 6e 65 76 65 72 20 74 72 69 65 73 20 74 6f 20 75  never tries to u
1da00 70 64 61 74 65 20 61 20 64 61 74 61 62 61 73 65  pdate a database
1da10 0a 20 20 2a 2a 20 20 20 20 20 20 69 6e 20 77 61  .  **      in wa
1da20 6c 20 6d 6f 64 65 2c 20 65 76 65 6e 20 69 66 20  l mode, even if 
1da30 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
1da40 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
1da50 69 6c 65 20 68 61 73 0a 20 20 2a 2a 20 20 20 20  ile has.  **    
1da60 20 20 62 65 65 6e 20 64 61 6d 61 67 65 64 2e 20    been damaged. 
1da70 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 62 29 20  .  **.  **   b) 
1da80 69 66 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c  if the *-wal fil
1da90 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  e does not exist
1daa0 2c 20 63 6c 61 69 6d 20 74 68 61 74 20 69 74 20  , claim that it 
1dab0 64 6f 65 73 20 61 6e 79 77 61 79 2c 0a 20 20 2a  does anyway,.  *
1dac0 2a 20 20 20 20 20 20 63 61 75 73 69 6e 67 20 53  *      causing S
1dad0 51 4c 69 74 65 20 74 6f 20 63 61 6c 6c 20 78 4f  QLite to call xO
1dae0 70 65 6e 28 29 20 74 6f 20 6f 70 65 6e 20 69 74  pen() to open it
1daf0 2e 20 54 68 69 73 20 63 61 6c 6c 20 77 69 6c 6c  . This call will
1db00 20 61 6c 73 6f 0a 20 20 2a 2a 20 20 20 20 20 20   also.  **      
1db10 62 65 20 69 6e 74 65 72 63 65 70 74 65 64 20 28  be intercepted (
1db20 73 65 65 20 74 68 65 20 72 62 75 56 66 73 4f 70  see the rbuVfsOp
1db30 65 6e 28 29 20 66 75 6e 63 74 69 6f 6e 29 20 61  en() function) a
1db40 6e 64 20 74 68 65 20 2a 2d 6f 61 6c 0a 20 20 2a  nd the *-oal.  *
1db50 2a 20 20 20 20 20 20 66 69 6c 65 20 6f 70 65 6e  *      file open
1db60 65 64 20 69 6e 73 74 65 61 64 2e 0a 20 20 2a 2f  ed instead..  */
1db70 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1db80 45 5f 4f 4b 20 26 26 20 66 6c 61 67 73 3d 3d 53  E_OK && flags==S
1db90 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
1dba0 53 54 53 20 29 7b 0a 20 20 20 20 72 62 75 5f 66  STS ){.    rbu_f
1dbb0 69 6c 65 20 2a 70 44 62 20 3d 20 72 62 75 46 69  ile *pDb = rbuFi
1dbc0 6e 64 4d 61 69 6e 64 62 28 70 52 62 75 56 66 73  ndMaindb(pRbuVfs
1dbd0 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20 20 69 66  , zPath);.    if
1dbe0 28 20 70 44 62 20 26 26 20 70 44 62 2d 3e 70 52  ( pDb && pDb->pR
1dbf0 62 75 20 26 26 20 70 44 62 2d 3e 70 52 62 75 2d  bu && pDb->pRbu-
1dc00 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41  >eStage==RBU_STA
1dc10 47 45 5f 4f 41 4c 20 29 7b 0a 20 20 20 20 20 20  GE_OAL ){.      
1dc20 69 66 28 20 2a 70 52 65 73 4f 75 74 20 29 7b 0a  if( *pResOut ){.
1dc30 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1dc40 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20  ITE_CANTOPEN;.  
1dc50 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1dc60 20 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 31 3b     *pResOut = 1;
1dc70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1dc80 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
1dc90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 75 6c 61  .}../*.** Popula
1dca0 74 65 20 62 75 66 66 65 72 20 7a 4f 75 74 20 77  te buffer zOut w
1dcb0 69 74 68 20 74 68 65 20 66 75 6c 6c 20 63 61 6e  ith the full can
1dcc0 6f 6e 69 63 61 6c 20 70 61 74 68 6e 61 6d 65 20  onical pathname 
1dcd0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a  corresponding.**
1dce0 20 74 6f 20 74 68 65 20 70 61 74 68 6e 61 6d 65   to the pathname
1dcf0 20 69 6e 20 7a 50 61 74 68 2e 20 7a 4f 75 74 20   in zPath. zOut 
1dd00 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
1dd10 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66   point to a buff
1dd20 65 72 0a 2a 2a 20 6f 66 20 61 74 20 6c 65 61 73  er.** of at leas
1dd30 74 20 28 44 45 56 53 59 4d 5f 4d 41 58 5f 50 41  t (DEVSYM_MAX_PA
1dd40 54 48 4e 41 4d 45 2b 31 29 20 62 79 74 65 73 2e  THNAME+1) bytes.
1dd50 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
1dd60 62 75 56 66 73 46 75 6c 6c 50 61 74 68 6e 61 6d  buVfsFullPathnam
1dd70 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  e(.  sqlite3_vfs
1dd80 20 2a 70 56 66 73 2c 20 0a 20 20 63 6f 6e 73 74   *pVfs, .  const
1dd90 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 0a 20   char *zPath, . 
1dda0 20 69 6e 74 20 6e 4f 75 74 2c 20 0a 20 20 63 68   int nOut, .  ch
1ddb0 61 72 20 2a 7a 4f 75 74 0a 29 7b 0a 20 20 73 71  ar *zOut.){.  sq
1ddc0 6c 69 74 65 33 5f 76 66 73 20 2a 70 52 65 61 6c  lite3_vfs *pReal
1ddd0 56 66 73 20 3d 20 28 28 72 62 75 5f 76 66 73 2a  Vfs = ((rbu_vfs*
1dde0 29 70 56 66 73 29 2d 3e 70 52 65 61 6c 56 66 73  )pVfs)->pRealVfs
1ddf0 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65 61 6c  ;.  return pReal
1de00 56 66 73 2d 3e 78 46 75 6c 6c 50 61 74 68 6e 61  Vfs->xFullPathna
1de10 6d 65 28 70 52 65 61 6c 56 66 73 2c 20 7a 50 61  me(pRealVfs, zPa
1de20 74 68 2c 20 6e 4f 75 74 2c 20 7a 4f 75 74 29 3b  th, nOut, zOut);
1de30 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
1de40 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54  TE_OMIT_LOAD_EXT
1de50 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 4f 70 65  ENSION./*.** Ope
1de60 6e 20 74 68 65 20 64 79 6e 61 6d 69 63 20 6c 69  n the dynamic li
1de70 62 72 61 72 79 20 6c 6f 63 61 74 65 64 20 61 74  brary located at
1de80 20 7a 50 61 74 68 20 61 6e 64 20 72 65 74 75 72   zPath and retur
1de90 6e 20 61 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73  n a handle..*/.s
1dea0 74 61 74 69 63 20 76 6f 69 64 20 2a 72 62 75 56  tatic void *rbuV
1deb0 66 73 44 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33  fsDlOpen(sqlite3
1dec0 5f 76 66 73 20 2a 70 56 66 73 2c 20 63 6f 6e 73  _vfs *pVfs, cons
1ded0 74 20 63 68 61 72 20 2a 7a 50 61 74 68 29 7b 0a  t char *zPath){.
1dee0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
1def0 52 65 61 6c 56 66 73 20 3d 20 28 28 72 62 75 5f  RealVfs = ((rbu_
1df00 76 66 73 2a 29 70 56 66 73 29 2d 3e 70 52 65 61  vfs*)pVfs)->pRea
1df10 6c 56 66 73 3b 0a 20 20 72 65 74 75 72 6e 20 70  lVfs;.  return p
1df20 52 65 61 6c 56 66 73 2d 3e 78 44 6c 4f 70 65 6e  RealVfs->xDlOpen
1df30 28 70 52 65 61 6c 56 66 73 2c 20 7a 50 61 74 68  (pRealVfs, zPath
1df40 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 75  );.}../*.** Popu
1df50 6c 61 74 65 20 74 68 65 20 62 75 66 66 65 72 20  late the buffer 
1df60 7a 45 72 72 4d 73 67 20 28 73 69 7a 65 20 6e 42  zErrMsg (size nB
1df70 79 74 65 20 62 79 74 65 73 29 20 77 69 74 68 20  yte bytes) with 
1df80 61 20 68 75 6d 61 6e 20 72 65 61 64 61 62 6c 65  a human readable
1df90 0a 2a 2a 20 75 74 66 2d 38 20 73 74 72 69 6e 67  .** utf-8 string
1dfa0 20 64 65 73 63 72 69 62 69 6e 67 20 74 68 65 20   describing the 
1dfb0 6d 6f 73 74 20 72 65 63 65 6e 74 20 65 72 72 6f  most recent erro
1dfc0 72 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 73  r encountered as
1dfd0 73 6f 63 69 61 74 65 64 20 0a 2a 2a 20 77 69 74  sociated .** wit
1dfe0 68 20 64 79 6e 61 6d 69 63 20 6c 69 62 72 61 72  h dynamic librar
1dff0 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ies..*/.static v
1e000 6f 69 64 20 72 62 75 56 66 73 44 6c 45 72 72 6f  oid rbuVfsDlErro
1e010 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  r(sqlite3_vfs *p
1e020 56 66 73 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20  Vfs, int nByte, 
1e030 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 29 7b 0a  char *zErrMsg){.
1e040 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
1e050 52 65 61 6c 56 66 73 20 3d 20 28 28 72 62 75 5f  RealVfs = ((rbu_
1e060 76 66 73 2a 29 70 56 66 73 29 2d 3e 70 52 65 61  vfs*)pVfs)->pRea
1e070 6c 56 66 73 3b 0a 20 20 70 52 65 61 6c 56 66 73  lVfs;.  pRealVfs
1e080 2d 3e 78 44 6c 45 72 72 6f 72 28 70 52 65 61 6c  ->xDlError(pReal
1e090 56 66 73 2c 20 6e 42 79 74 65 2c 20 7a 45 72 72  Vfs, nByte, zErr
1e0a0 4d 73 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Msg);.}../*.** R
1e0b0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
1e0c0 74 6f 20 74 68 65 20 73 79 6d 62 6f 6c 20 7a 53  to the symbol zS
1e0d0 79 6d 62 6f 6c 20 69 6e 20 74 68 65 20 64 79 6e  ymbol in the dyn
1e0e0 61 6d 69 63 20 6c 69 62 72 61 72 79 20 70 48 61  amic library pHa
1e0f0 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndle..*/.static 
1e100 76 6f 69 64 20 28 2a 72 62 75 56 66 73 44 6c 53  void (*rbuVfsDlS
1e110 79 6d 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  ym(.  sqlite3_vf
1e120 73 20 2a 70 56 66 73 2c 20 0a 20 20 76 6f 69 64  s *pVfs, .  void
1e130 20 2a 70 41 72 67 2c 20 0a 20 20 63 6f 6e 73 74   *pArg, .  const
1e140 20 63 68 61 72 20 2a 7a 53 79 6d 0a 29 29 28 76   char *zSym.))(v
1e150 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  oid){.  sqlite3_
1e160 76 66 73 20 2a 70 52 65 61 6c 56 66 73 20 3d 20  vfs *pRealVfs = 
1e170 28 28 72 62 75 5f 76 66 73 2a 29 70 56 66 73 29  ((rbu_vfs*)pVfs)
1e180 2d 3e 70 52 65 61 6c 56 66 73 3b 0a 20 20 72 65  ->pRealVfs;.  re
1e190 74 75 72 6e 20 70 52 65 61 6c 56 66 73 2d 3e 78  turn pRealVfs->x
1e1a0 44 6c 53 79 6d 28 70 52 65 61 6c 56 66 73 2c 20  DlSym(pRealVfs, 
1e1b0 70 41 72 67 2c 20 7a 53 79 6d 29 3b 0a 7d 0a 0a  pArg, zSym);.}..
1e1c0 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20  /*.** Close the 
1e1d0 64 79 6e 61 6d 69 63 20 6c 69 62 72 61 72 79 20  dynamic library 
1e1e0 68 61 6e 64 6c 65 20 70 48 61 6e 64 6c 65 2e 0a  handle pHandle..
1e1f0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
1e200 62 75 56 66 73 44 6c 43 6c 6f 73 65 28 73 71 6c  buVfsDlClose(sql
1e210 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
1e220 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65 29 7b 0a  void *pHandle){.
1e230 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
1e240 52 65 61 6c 56 66 73 20 3d 20 28 28 72 62 75 5f  RealVfs = ((rbu_
1e250 76 66 73 2a 29 70 56 66 73 29 2d 3e 70 52 65 61  vfs*)pVfs)->pRea
1e260 6c 56 66 73 3b 0a 20 20 70 52 65 61 6c 56 66 73  lVfs;.  pRealVfs
1e270 2d 3e 78 44 6c 43 6c 6f 73 65 28 70 52 65 61 6c  ->xDlClose(pReal
1e280 56 66 73 2c 20 70 48 61 6e 64 6c 65 29 3b 0a 7d  Vfs, pHandle);.}
1e290 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1e2a0 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45  E_OMIT_LOAD_EXTE
1e2b0 4e 53 49 4f 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  NSION */../*.** 
1e2c0 50 6f 70 75 6c 61 74 65 20 74 68 65 20 62 75 66  Populate the buf
1e2d0 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  fer pointed to b
1e2e0 79 20 7a 42 75 66 4f 75 74 20 77 69 74 68 20 6e  y zBufOut with n
1e2f0 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 0a 2a  Byte bytes of .*
1e300 2a 20 72 61 6e 64 6f 6d 20 64 61 74 61 2e 0a 2a  * random data..*
1e310 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62 75  /.static int rbu
1e320 56 66 73 52 61 6e 64 6f 6d 6e 65 73 73 28 73 71  VfsRandomness(sq
1e330 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
1e340 20 69 6e 74 20 6e 42 79 74 65 2c 20 63 68 61 72   int nByte, char
1e350 20 2a 7a 42 75 66 4f 75 74 29 7b 0a 20 20 73 71   *zBufOut){.  sq
1e360 6c 69 74 65 33 5f 76 66 73 20 2a 70 52 65 61 6c  lite3_vfs *pReal
1e370 56 66 73 20 3d 20 28 28 72 62 75 5f 76 66 73 2a  Vfs = ((rbu_vfs*
1e380 29 70 56 66 73 29 2d 3e 70 52 65 61 6c 56 66 73  )pVfs)->pRealVfs
1e390 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65 61 6c  ;.  return pReal
1e3a0 56 66 73 2d 3e 78 52 61 6e 64 6f 6d 6e 65 73 73  Vfs->xRandomness
1e3b0 28 70 52 65 61 6c 56 66 73 2c 20 6e 42 79 74 65  (pRealVfs, nByte
1e3c0 2c 20 7a 42 75 66 4f 75 74 29 3b 0a 7d 0a 0a 2f  , zBufOut);.}../
1e3d0 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 6e  *.** Sleep for n
1e3e0 4d 69 63 72 6f 20 6d 69 63 72 6f 73 65 63 6f 6e  Micro microsecon
1e3f0 64 73 2e 20 52 65 74 75 72 6e 20 74 68 65 20 6e  ds. Return the n
1e400 75 6d 62 65 72 20 6f 66 20 6d 69 63 72 6f 73 65  umber of microse
1e410 63 6f 6e 64 73 20 0a 2a 2a 20 61 63 74 75 61 6c  conds .** actual
1e420 6c 79 20 73 6c 65 70 74 2e 0a 2a 2f 0a 73 74 61  ly slept..*/.sta
1e430 74 69 63 20 69 6e 74 20 72 62 75 56 66 73 53 6c  tic int rbuVfsSl
1e440 65 65 70 28 73 71 6c 69 74 65 33 5f 76 66 73 20  eep(sqlite3_vfs 
1e450 2a 70 56 66 73 2c 20 69 6e 74 20 6e 4d 69 63 72  *pVfs, int nMicr
1e460 6f 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  o){.  sqlite3_vf
1e470 73 20 2a 70 52 65 61 6c 56 66 73 20 3d 20 28 28  s *pRealVfs = ((
1e480 72 62 75 5f 76 66 73 2a 29 70 56 66 73 29 2d 3e  rbu_vfs*)pVfs)->
1e490 70 52 65 61 6c 56 66 73 3b 0a 20 20 72 65 74 75  pRealVfs;.  retu
1e4a0 72 6e 20 70 52 65 61 6c 56 66 73 2d 3e 78 53 6c  rn pRealVfs->xSl
1e4b0 65 65 70 28 70 52 65 61 6c 56 66 73 2c 20 6e 4d  eep(pRealVfs, nM
1e4c0 69 63 72 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  icro);.}../*.** 
1e4d0 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65  Return the curre
1e4e0 6e 74 20 74 69 6d 65 20 61 73 20 61 20 4a 75 6c  nt time as a Jul
1e4f0 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 69  ian Day number i
1e500 6e 20 2a 70 54 69 6d 65 4f 75 74 2e 0a 2a 2f 0a  n *pTimeOut..*/.
1e510 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 56 66  static int rbuVf
1e520 73 43 75 72 72 65 6e 74 54 69 6d 65 28 73 71 6c  sCurrentTime(sql
1e530 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
1e540 64 6f 75 62 6c 65 20 2a 70 54 69 6d 65 4f 75 74  double *pTimeOut
1e550 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
1e560 20 2a 70 52 65 61 6c 56 66 73 20 3d 20 28 28 72   *pRealVfs = ((r
1e570 62 75 5f 76 66 73 2a 29 70 56 66 73 29 2d 3e 70  bu_vfs*)pVfs)->p
1e580 52 65 61 6c 56 66 73 3b 0a 20 20 72 65 74 75 72  RealVfs;.  retur
1e590 6e 20 70 52 65 61 6c 56 66 73 2d 3e 78 43 75 72  n pRealVfs->xCur
1e5a0 72 65 6e 74 54 69 6d 65 28 70 52 65 61 6c 56 66  rentTime(pRealVf
1e5b0 73 2c 20 70 54 69 6d 65 4f 75 74 29 3b 0a 7d 0a  s, pTimeOut);.}.
1e5c0 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 2e 0a 2a 2f  ./*.** No-op..*/
1e5d0 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 56  .static int rbuV
1e5e0 66 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 73  fsGetLastError(s
1e5f0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
1e600 2c 20 69 6e 74 20 61 2c 20 63 68 61 72 20 2a 62  , int a, char *b
1e610 29 7b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  ){.  return 0;.}
1e620 0a 0a 2f 2a 0a 2a 2a 20 44 65 72 65 67 69 73 74  ../*.** Deregist
1e630 65 72 20 61 6e 64 20 64 65 73 74 72 6f 79 20 61  er and destroy a
1e640 6e 20 52 42 55 20 76 66 73 20 63 72 65 61 74 65  n RBU vfs create
1e650 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20  d by an earlier 
1e660 63 61 6c 6c 20 74 6f 0a 2a 2a 20 73 71 6c 69 74  call to.** sqlit
1e670 65 33 72 62 75 5f 63 72 65 61 74 65 5f 76 66 73  e3rbu_create_vfs
1e680 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
1e690 74 65 33 72 62 75 5f 64 65 73 74 72 6f 79 5f 76  te3rbu_destroy_v
1e6a0 66 73 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  fs(const char *z
1e6b0 4e 61 6d 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  Name){.  sqlite3
1e6c0 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 73 71 6c  _vfs *pVfs = sql
1e6d0 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 7a 4e  ite3_vfs_find(zN
1e6e0 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 56 66 73  ame);.  if( pVfs
1e6f0 20 26 26 20 70 56 66 73 2d 3e 78 4f 70 65 6e 3d   && pVfs->xOpen=
1e700 3d 72 62 75 56 66 73 4f 70 65 6e 20 29 7b 0a 20  =rbuVfsOpen ){. 
1e710 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
1e720 5f 66 72 65 65 28 28 28 72 62 75 5f 76 66 73 2a  _free(((rbu_vfs*
1e730 29 70 56 66 73 29 2d 3e 6d 75 74 65 78 29 3b 0a  )pVfs)->mutex);.
1e740 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f      sqlite3_vfs_
1e750 75 6e 72 65 67 69 73 74 65 72 28 70 56 66 73 29  unregister(pVfs)
1e760 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
1e770 65 65 28 70 56 66 73 29 3b 0a 20 20 7d 0a 7d 0a  ee(pVfs);.  }.}.
1e780 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 6e  ./*.** Create an
1e790 20 52 42 55 20 56 46 53 20 6e 61 6d 65 64 20 7a   RBU VFS named z
1e7a0 4e 61 6d 65 20 74 68 61 74 20 61 63 63 65 73 73  Name that access
1e7b0 65 73 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  es the underlyin
1e7c0 67 20 66 69 6c 65 2d 73 79 73 74 65 6d 0a 2a 2a  g file-system.**
1e7d0 20 76 69 61 20 65 78 69 73 74 69 6e 67 20 56 46   via existing VF
1e7e0 53 20 7a 50 61 72 65 6e 74 2e 20 54 68 65 20 6e  S zParent. The n
1e7f0 65 77 20 6f 62 6a 65 63 74 20 69 73 20 72 65 67  ew object is reg
1e800 69 73 74 65 72 65 64 20 61 73 20 61 20 6e 6f 6e  istered as a non
1e810 2d 64 65 66 61 75 6c 74 0a 2a 2a 20 56 46 53 20  -default.** VFS 
1e820 77 69 74 68 20 53 51 4c 69 74 65 20 62 65 66 6f  with SQLite befo
1e830 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f  re returning..*/
1e840 0a 69 6e 74 20 73 71 6c 69 74 65 33 72 62 75 5f  .int sqlite3rbu_
1e850 63 72 65 61 74 65 5f 76 66 73 28 63 6f 6e 73 74  create_vfs(const
1e860 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f   char *zName, co
1e870 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72 65 6e  nst char *zParen
1e880 74 29 7b 0a 0a 20 20 2f 2a 20 54 65 6d 70 6c 61  t){..  /* Templa
1e890 74 65 20 66 6f 72 20 56 46 53 20 2a 2f 0a 20 20  te for VFS */.  
1e8a0 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 76  static sqlite3_v
1e8b0 66 73 20 76 66 73 5f 74 65 6d 70 6c 61 74 65 20  fs vfs_template 
1e8c0 3d 20 7b 0a 20 20 20 20 31 2c 20 20 20 20 20 20  = {.    1,      
1e8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e8e0 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f        /* iVersio
1e8f0 6e 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20  n */.    0,     
1e900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e910 20 20 20 20 20 20 20 2f 2a 20 73 7a 4f 73 46 69         /* szOsFi
1e920 6c 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20  le */.    0,    
1e930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e940 20 20 20 20 20 20 20 20 2f 2a 20 6d 78 50 61 74          /* mxPat
1e950 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20  hname */.    0, 
1e960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e970 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e             /* pN
1e980 65 78 74 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20  ext */.    0,   
1e990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e9a0 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4e 61 6d           /* zNam
1e9b0 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20  e */.    0,     
1e9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e9d0 20 20 20 20 20 20 20 2f 2a 20 70 41 70 70 44 61         /* pAppDa
1e9e0 74 61 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73  ta */.    rbuVfs
1e9f0 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20  Open,           
1ea00 20 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e          /* xOpen
1ea10 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 44 65   */.    rbuVfsDe
1ea20 6c 65 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  lete,           
1ea30 20 20 20 20 20 20 2f 2a 20 78 44 65 6c 65 74 65        /* xDelete
1ea40 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 41 63   */.    rbuVfsAc
1ea50 63 65 73 73 2c 20 20 20 20 20 20 20 20 20 20 20  cess,           
1ea60 20 20 20 20 20 20 2f 2a 20 78 41 63 63 65 73 73        /* xAccess
1ea70 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 46 75   */.    rbuVfsFu
1ea80 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20 20 20 20  llPathname,     
1ea90 20 20 20 20 20 20 2f 2a 20 78 46 75 6c 6c 50 61        /* xFullPa
1eaa0 74 68 6e 61 6d 65 20 2a 2f 0a 0a 23 69 66 6e 64  thname */..#ifnd
1eab0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  ef SQLITE_OMIT_L
1eac0 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20  OAD_EXTENSION.  
1ead0 20 20 72 62 75 56 66 73 44 6c 4f 70 65 6e 2c 20    rbuVfsDlOpen, 
1eae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eaf0 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f 0a 20 20  /* xDlOpen */.  
1eb00 20 20 72 62 75 56 66 73 44 6c 45 72 72 6f 72 2c    rbuVfsDlError,
1eb10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb20 2f 2a 20 78 44 6c 45 72 72 6f 72 20 2a 2f 0a 20  /* xDlError */. 
1eb30 20 20 20 72 62 75 56 66 73 44 6c 53 79 6d 2c 20     rbuVfsDlSym, 
1eb40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb50 20 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f 0a 20 20   /* xDlSym */.  
1eb60 20 20 72 62 75 56 66 73 44 6c 43 6c 6f 73 65 2c    rbuVfsDlClose,
1eb70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb80 2f 2a 20 78 44 6c 43 6c 6f 73 65 20 2a 2f 0a 23  /* xDlClose */.#
1eb90 65 6c 73 65 0a 20 20 20 20 30 2c 20 30 2c 20 30  else.    0, 0, 0
1eba0 2c 20 30 2c 0a 23 65 6e 64 69 66 0a 0a 20 20 20  , 0,.#endif..   
1ebb0 20 72 62 75 56 66 73 52 61 6e 64 6f 6d 6e 65 73   rbuVfsRandomnes
1ebc0 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  s,             /
1ebd0 2a 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f  * xRandomness */
1ebe0 0a 20 20 20 20 72 62 75 56 66 73 53 6c 65 65 70  .    rbuVfsSleep
1ebf0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1ec00 20 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a 2f 0a     /* xSleep */.
1ec10 20 20 20 20 72 62 75 56 66 73 43 75 72 72 65 6e      rbuVfsCurren
1ec20 74 54 69 6d 65 2c 20 20 20 20 20 20 20 20 20 20  tTime,          
1ec30 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d    /* xCurrentTim
1ec40 65 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 47  e */.    rbuVfsG
1ec50 65 74 4c 61 73 74 45 72 72 6f 72 2c 20 20 20 20  etLastError,    
1ec60 20 20 20 20 20 20 20 2f 2a 20 78 47 65 74 4c 61         /* xGetLa
1ec70 73 74 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20 30  stError */.    0
1ec80 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1ec90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1eca0 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36  xCurrentTimeInt6
1ecb0 34 20 28 76 65 72 73 69 6f 6e 20 32 29 20 2a 2f  4 (version 2) */
1ecc0 0a 20 20 20 20 30 2c 20 30 2c 20 30 20 20 20 20  .    0, 0, 0    
1ecd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ece0 20 20 20 2f 2a 20 55 6e 69 6d 70 6c 65 6d 65 6e     /* Unimplemen
1ecf0 74 65 64 20 76 65 72 73 69 6f 6e 20 33 20 6d 65  ted version 3 me
1ed00 74 68 6f 64 73 20 2a 2f 0a 20 20 7d 3b 0a 0a 20  thods */.  };.. 
1ed10 20 72 62 75 5f 76 66 73 20 2a 70 4e 65 77 20 3d   rbu_vfs *pNew =
1ed20 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1ed30 20 2f 2a 20 4e 65 77 6c 79 20 61 6c 6c 6f 63 61   /* Newly alloca
1ed40 74 65 64 20 56 46 53 20 2a 2f 0a 20 20 69 6e 74  ted VFS */.  int
1ed50 20 6e 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 72 63   nName;.  int rc
1ed60 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
1ed70 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 6e 4e   int nByte;.  nN
1ed80 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61  ame = strlen(zNa
1ed90 6d 65 29 3b 0a 20 20 6e 42 79 74 65 20 3d 20 73  me);.  nByte = s
1eda0 69 7a 65 6f 66 28 72 62 75 5f 76 66 73 29 20 2b  izeof(rbu_vfs) +
1edb0 20 6e 4e 61 6d 65 20 2b 20 31 3b 0a 20 20 70 4e   nName + 1;.  pN
1edc0 65 77 20 3d 20 28 72 62 75 5f 76 66 73 2a 29 73  ew = (rbu_vfs*)s
1edd0 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 42  qlite3_malloc(nB
1ede0 79 74 65 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  yte);.  if( pNew
1edf0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
1ee00 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
1ee10 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
1ee20 65 33 5f 76 66 73 20 2a 70 50 61 72 65 6e 74 3b  e3_vfs *pParent;
1ee30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
1ee40 72 65 6e 74 20 56 46 53 20 2a 2f 0a 20 20 20 20  rent VFS */.    
1ee50 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20  memset(pNew, 0, 
1ee60 6e 42 79 74 65 29 3b 0a 20 20 20 20 70 50 61 72  nByte);.    pPar
1ee70 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f 76 66  ent = sqlite3_vf
1ee80 73 5f 66 69 6e 64 28 7a 50 61 72 65 6e 74 29 3b  s_find(zParent);
1ee90 0a 20 20 20 20 69 66 28 20 70 50 61 72 65 6e 74  .    if( pParent
1eea0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
1eeb0 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  = SQLITE_NOTFOUN
1eec0 44 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  D;.    }else{.  
1eed0 20 20 20 20 63 68 61 72 20 2a 7a 53 70 61 63 65      char *zSpace
1eee0 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  ;.      memcpy(&
1eef0 70 4e 65 77 2d 3e 62 61 73 65 2c 20 26 76 66 73  pNew->base, &vfs
1ef00 5f 74 65 6d 70 6c 61 74 65 2c 20 73 69 7a 65 6f  _template, sizeo
1ef10 66 28 73 71 6c 69 74 65 33 5f 76 66 73 29 29 3b  f(sqlite3_vfs));
1ef20 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 62 61 73  .      pNew->bas
1ef30 65 2e 6d 78 50 61 74 68 6e 61 6d 65 20 3d 20 70  e.mxPathname = p
1ef40 50 61 72 65 6e 74 2d 3e 6d 78 50 61 74 68 6e 61  Parent->mxPathna
1ef50 6d 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  me;.      pNew->
1ef60 62 61 73 65 2e 73 7a 4f 73 46 69 6c 65 20 3d 20  base.szOsFile = 
1ef70 73 69 7a 65 6f 66 28 72 62 75 5f 66 69 6c 65 29  sizeof(rbu_file)
1ef80 20 2b 20 70 50 61 72 65 6e 74 2d 3e 73 7a 4f 73   + pParent->szOs
1ef90 46 69 6c 65 3b 0a 20 20 20 20 20 20 70 4e 65 77  File;.      pNew
1efa0 2d 3e 70 52 65 61 6c 56 66 73 20 3d 20 70 50 61  ->pRealVfs = pPa
1efb0 72 65 6e 74 3b 0a 20 20 20 20 20 20 70 4e 65 77  rent;.      pNew
1efc0 2d 3e 62 61 73 65 2e 7a 4e 61 6d 65 20 3d 20 28  ->base.zName = (
1efd0 63 6f 6e 73 74 20 63 68 61 72 2a 29 28 7a 53 70  const char*)(zSp
1efe0 61 63 65 20 3d 20 28 63 68 61 72 2a 29 26 70 4e  ace = (char*)&pN
1eff0 65 77 5b 31 5d 29 3b 0a 20 20 20 20 20 20 6d 65  ew[1]);.      me
1f000 6d 63 70 79 28 7a 53 70 61 63 65 2c 20 7a 4e 61  mcpy(zSpace, zNa
1f010 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 0a 20 20 20  me, nName);..   
1f020 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74     /* Allocate t
1f030 68 65 20 6d 75 74 65 78 20 61 6e 64 20 72 65 67  he mutex and reg
1f040 69 73 74 65 72 20 74 68 65 20 6e 65 77 20 56 46  ister the new VF
1f050 53 20 28 6e 6f 74 20 61 73 20 74 68 65 20 64 65  S (not as the de
1f060 66 61 75 6c 74 29 20 2a 2f 0a 20 20 20 20 20 20  fault) */.      
1f070 70 4e 65 77 2d 3e 6d 75 74 65 78 20 3d 20 73 71  pNew->mutex = sq
1f080 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f  lite3_mutex_allo
1f090 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 52  c(SQLITE_MUTEX_R
1f0a0 45 43 55 52 53 49 56 45 29 3b 0a 20 20 20 20 20  ECURSIVE);.     
1f0b0 20 69 66 28 20 70 4e 65 77 2d 3e 6d 75 74 65 78   if( pNew->mutex
1f0c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
1f0d0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
1f0e0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1f0f0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1f100 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72  te3_vfs_register
1f110 28 26 70 4e 65 77 2d 3e 62 61 73 65 2c 20 30 29  (&pNew->base, 0)
1f120 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1f130 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1f140 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1f150 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72  sqlite3_mutex_fr
1f160 65 65 28 70 4e 65 77 2d 3e 6d 75 74 65 78 29 3b  ee(pNew->mutex);
1f170 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
1f180 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 7d  ree(pNew);.    }
1f190 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
1f1a0 63 3b 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  c;.}.../********
1f1b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f1c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f1d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f1e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f1f0 2a 2a 2f 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 21  **/..#endif /* !
1f200 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 43  defined(SQLITE_C
1f210 4f 52 45 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  ORE) || defined(
1f220 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 52 42  SQLITE_ENABLE_RB
1f230 55 29 20 2a 2f 0a                                U) */.