/ Hex Artifact Content
Login

Artifact 07cef1986347694306b82cb61de27e00fde6ce23:


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 66 20   <stdio.h>..#if 
0f60: 21 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29  !defined(_WIN32)
0f70: 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 75 6e 69  .#  include <uni
0f80: 73 74 64 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 23  std.h>.#endif..#
0f90: 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 33  include "sqlite3
0fa0: 2e 68 22 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  .h"..#if !define
0fb0: 64 28 53 51 4c 49 54 45 5f 43 4f 52 45 29 20 7c  d(SQLITE_CORE) |
0fc0: 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
0fd0: 5f 45 4e 41 42 4c 45 5f 52 42 55 29 0a 23 69 6e  _ENABLE_RBU).#in
0fe0: 63 6c 75 64 65 20 22 73 71 6c 69 74 65 33 72 62  clude "sqlite3rb
0ff0: 75 2e 68 22 0a 0a 2f 2a 20 4d 61 78 69 6d 75 6d  u.h"../* Maximum
1000: 20 6e 75 6d 62 65 72 20 6f 66 20 70 72 65 70 61   number of prepa
1010: 72 65 64 20 55 50 44 41 54 45 20 73 74 61 74 65  red UPDATE state
1020: 6d 65 6e 74 73 20 68 65 6c 64 20 62 79 20 74 68  ments held by th
1030: 69 73 20 6d 6f 64 75 6c 65 20 2a 2f 0a 23 64 65  is module */.#de
1040: 66 69 6e 65 20 53 51 4c 49 54 45 5f 52 42 55 5f  fine SQLITE_RBU_
1050: 55 50 44 41 54 45 5f 43 41 43 48 45 53 49 5a 45  UPDATE_CACHESIZE
1060: 20 31 36 0a 0a 2f 2a 0a 2a 2a 20 53 77 61 70 20   16../*.** Swap 
1070: 74 77 6f 20 6f 62 6a 65 63 74 73 20 6f 66 20 74  two objects of t
1080: 79 70 65 20 54 59 50 45 2e 0a 2a 2f 0a 23 69 66  ype TYPE..*/.#if
1090: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
10a0: 5f 41 4d 41 4c 47 41 4d 41 54 49 4f 4e 29 0a 23  _AMALGAMATION).#
10b0: 20 64 65 66 69 6e 65 20 53 57 41 50 28 54 59 50   define SWAP(TYP
10c0: 45 2c 41 2c 42 29 20 7b 54 59 50 45 20 74 3d 41  E,A,B) {TYPE t=A
10d0: 3b 20 41 3d 42 3b 20 42 3d 74 3b 7d 0a 23 65 6e  ; A=B; B=t;}.#en
10e0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 72  dif../*.** The r
10f0: 62 75 5f 73 74 61 74 65 20 74 61 62 6c 65 20 69  bu_state table i
1100: 73 20 75 73 65 64 20 74 6f 20 73 61 76 65 20 74  s used to save t
1110: 68 65 20 73 74 61 74 65 20 6f 66 20 61 20 70 61  he state of a pa
1120: 72 74 69 61 6c 6c 79 20 61 70 70 6c 69 65 64 0a  rtially applied.
1130: 2a 2a 20 75 70 64 61 74 65 20 73 6f 20 74 68 61  ** update so tha
1140: 74 20 69 74 20 63 61 6e 20 62 65 20 72 65 73 75  t it can be resu
1150: 6d 65 64 20 6c 61 74 65 72 2e 20 54 68 65 20 74  med later. The t
1160: 61 62 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f 66  able consists of
1170: 20 69 6e 74 65 67 65 72 0a 2a 2a 20 6b 65 79 73   integer.** keys
1180: 20 6d 61 70 70 65 64 20 74 6f 20 76 61 6c 75 65   mapped to value
1190: 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  s as follows:.**
11a0: 0a 2a 2a 20 52 42 55 5f 53 54 41 54 45 5f 53 54  .** RBU_STATE_ST
11b0: 41 47 45 3a 0a 2a 2a 20 20 20 4d 61 79 20 62 65  AGE:.**   May be
11c0: 20 73 65 74 20 74 6f 20 69 6e 74 65 67 65 72 20   set to integer 
11d0: 76 61 6c 75 65 73 20 31 2c 20 32 2c 20 34 20 6f  values 1, 2, 4 o
11e0: 72 20 35 2e 20 41 73 20 66 6f 6c 6c 6f 77 73 3a  r 5. As follows:
11f0: 0a 2a 2a 20 20 20 20 20 20 20 31 3a 20 74 68 65  .**       1: the
1200: 20 2a 2d 72 62 75 20 66 69 6c 65 20 69 73 20 63   *-rbu file is c
1210: 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
1220: 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20  onstruction..** 
1230: 20 20 20 20 20 20 32 3a 20 74 68 65 20 2a 2d 72        2: the *-r
1240: 62 75 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e  bu file has been
1250: 20 63 6f 6e 73 74 72 75 63 74 65 64 2c 20 62 75   constructed, bu
1260: 74 20 6e 6f 74 20 79 65 74 20 6d 6f 76 65 64 20  t not yet moved 
1270: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 74 6f 20  .**          to 
1280: 74 68 65 20 2a 2d 77 61 6c 20 70 61 74 68 2e 0a  the *-wal path..
1290: 2a 2a 20 20 20 20 20 20 20 34 3a 20 74 68 65 20  **       4: the 
12a0: 63 68 65 63 6b 70 6f 69 6e 74 20 69 73 20 75 6e  checkpoint is un
12b0: 64 65 72 77 61 79 2e 0a 2a 2a 20 20 20 20 20 20  derway..**      
12c0: 20 35 3a 20 74 68 65 20 72 62 75 20 75 70 64 61   5: the rbu upda
12d0: 74 65 20 68 61 73 20 62 65 65 6e 20 63 68 65 63  te has been chec
12e0: 6b 70 6f 69 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  kpointed..**.** 
12f0: 52 42 55 5f 53 54 41 54 45 5f 54 42 4c 3a 0a 2a  RBU_STATE_TBL:.*
1300: 2a 20 20 20 4f 6e 6c 79 20 76 61 6c 69 64 20 69  *   Only valid i
1310: 66 20 53 54 41 47 45 3d 3d 31 2e 20 54 68 65 20  f STAGE==1. The 
1320: 74 61 72 67 65 74 20 64 61 74 61 62 61 73 65 20  target database 
1330: 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
1340: 65 20 0a 2a 2a 20 20 20 63 75 72 72 65 6e 74 6c  e .**   currentl
1350: 79 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2e  y being written.
1360: 0a 2a 2a 0a 2a 2a 20 52 42 55 5f 53 54 41 54 45  .**.** RBU_STATE
1370: 5f 49 44 58 3a 0a 2a 2a 20 20 20 4f 6e 6c 79 20  _IDX:.**   Only 
1380: 76 61 6c 69 64 20 69 66 20 53 54 41 47 45 3d 3d  valid if STAGE==
1390: 31 2e 20 54 68 65 20 74 61 72 67 65 74 20 64 61  1. The target da
13a0: 74 61 62 61 73 65 20 6e 61 6d 65 20 6f 66 20 74  tabase name of t
13b0: 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20 20 20 63  he index .**   c
13c0: 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 77  urrently being w
13d0: 72 69 74 74 65 6e 2c 20 6f 72 20 4e 55 4c 4c 20  ritten, or NULL 
13e0: 69 66 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c  if the main tabl
13f0: 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 62  e is currently b
1400: 65 69 6e 67 0a 2a 2a 20 20 20 75 70 64 61 74 65  eing.**   update
1410: 64 2e 0a 2a 2a 0a 2a 2a 20 52 42 55 5f 53 54 41  d..**.** RBU_STA
1420: 54 45 5f 52 4f 57 3a 0a 2a 2a 20 20 20 4f 6e 6c  TE_ROW:.**   Onl
1430: 79 20 76 61 6c 69 64 20 69 66 20 53 54 41 47 45  y valid if STAGE
1440: 3d 3d 31 2e 20 4e 75 6d 62 65 72 20 6f 66 20 72  ==1. Number of r
1450: 6f 77 73 20 61 6c 72 65 61 64 79 20 70 72 6f 63  ows already proc
1460: 65 73 73 65 64 20 66 6f 72 20 74 68 65 20 63 75  essed for the cu
1470: 72 72 65 6e 74 0a 2a 2a 20 20 20 74 61 62 6c 65  rrent.**   table
1480: 2f 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 52 42  /index..**.** RB
1490: 55 5f 53 54 41 54 45 5f 50 52 4f 47 52 45 53 53  U_STATE_PROGRESS
14a0: 3a 0a 2a 2a 20 20 20 54 72 62 75 6c 20 6e 75 6d  :.**   Trbul num
14b0: 62 65 72 20 6f 66 20 73 71 6c 69 74 65 33 72 62  ber of sqlite3rb
14c0: 75 5f 73 74 65 70 28 29 20 63 61 6c 6c 73 20 6d  u_step() calls m
14d0: 61 64 65 20 73 6f 20 66 61 72 20 61 73 20 70 61  ade so far as pa
14e0: 72 74 20 6f 66 20 74 68 69 73 0a 2a 2a 20 20 20  rt of this.**   
14f0: 72 62 75 20 75 70 64 61 74 65 2e 0a 2a 2a 0a 2a  rbu update..**.*
1500: 2a 20 52 42 55 5f 53 54 41 54 45 5f 43 4b 50 54  * RBU_STATE_CKPT
1510: 3a 0a 2a 2a 20 20 20 56 61 6c 69 64 20 69 66 20  :.**   Valid if 
1520: 53 54 41 47 45 3d 3d 34 2e 20 54 68 65 20 36 34  STAGE==4. The 64
1530: 2d 62 69 74 20 63 68 65 63 6b 73 75 6d 20 61 73  -bit checksum as
1540: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
1550: 65 20 77 61 6c 2d 69 6e 64 65 78 0a 2a 2a 20 20  e wal-index.**  
1560: 20 68 65 61 64 65 72 20 63 72 65 61 74 65 64 20   header created 
1570: 62 79 20 72 65 63 6f 76 65 72 69 6e 67 20 74 68  by recovering th
1580: 65 20 2a 2d 77 61 6c 20 66 69 6c 65 2e 20 54 68  e *-wal file. Th
1590: 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 64 65  is is used to de
15a0: 74 65 63 74 0a 2a 2a 20 20 20 63 61 73 65 73 20  tect.**   cases 
15b0: 77 68 65 6e 20 61 6e 6f 74 68 65 72 20 63 6c 69  when another cli
15c0: 65 6e 74 20 61 70 70 65 6e 64 73 20 66 72 61 6d  ent appends fram
15d0: 65 73 20 74 6f 20 74 68 65 20 2a 2d 77 61 6c 20  es to the *-wal 
15e0: 66 69 6c 65 20 69 6e 20 74 68 65 0a 2a 2a 20 20  file in the.**  
15f0: 20 6d 69 64 64 6c 65 20 6f 66 20 61 6e 20 69 6e   middle of an in
1600: 63 72 65 6d 65 6e 74 61 6c 20 63 68 65 63 6b 70  cremental checkp
1610: 6f 69 6e 74 20 28 61 6e 20 69 6e 63 72 65 6d 65  oint (an increme
1620: 6e 74 61 6c 20 63 68 65 63 6b 70 6f 69 6e 74 20  ntal checkpoint 
1630: 63 61 6e 6e 6f 74 0a 2a 2a 20 20 20 62 65 20 63  cannot.**   be c
1640: 6f 6e 74 69 6e 75 65 64 20 69 66 20 74 68 69 73  ontinued if this
1650: 20 68 61 70 70 65 6e 73 29 2e 0a 2a 2a 0a 2a 2a   happens)..**.**
1660: 20 52 42 55 5f 53 54 41 54 45 5f 43 4f 4f 4b 49   RBU_STATE_COOKI
1670: 45 3a 0a 2a 2a 20 20 20 56 61 6c 69 64 20 69 66  E:.**   Valid if
1680: 20 53 54 41 47 45 3d 3d 31 2e 20 54 68 65 20 63   STAGE==1. The c
1690: 75 72 72 65 6e 74 20 63 68 61 6e 67 65 2d 63 6f  urrent change-co
16a0: 75 6e 74 65 72 20 63 6f 6f 6b 69 65 20 76 61 6c  unter cookie val
16b0: 75 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 20 20  ue in the .**   
16c0: 74 61 72 67 65 74 20 64 62 20 66 69 6c 65 2e 0a  target db file..
16d0: 2a 2a 0a 2a 2a 20 52 42 55 5f 53 54 41 54 45 5f  **.** RBU_STATE_
16e0: 4f 41 4c 53 5a 3a 0a 2a 2a 20 20 20 56 61 6c 69  OALSZ:.**   Vali
16f0: 64 20 69 66 20 53 54 41 47 45 3d 3d 31 2e 20 54  d if STAGE==1. T
1700: 68 65 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73  he size in bytes
1710: 20 6f 66 20 74 68 65 20 2a 2d 6f 61 6c 20 66 69   of the *-oal fi
1720: 6c 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 52  le..*/.#define R
1730: 42 55 5f 53 54 41 54 45 5f 53 54 41 47 45 20 20  BU_STATE_STAGE  
1740: 20 20 20 20 20 31 0a 23 64 65 66 69 6e 65 20 52       1.#define R
1750: 42 55 5f 53 54 41 54 45 5f 54 42 4c 20 20 20 20  BU_STATE_TBL    
1760: 20 20 20 20 20 32 0a 23 64 65 66 69 6e 65 20 52       2.#define R
1770: 42 55 5f 53 54 41 54 45 5f 49 44 58 20 20 20 20  BU_STATE_IDX    
1780: 20 20 20 20 20 33 0a 23 64 65 66 69 6e 65 20 52       3.#define R
1790: 42 55 5f 53 54 41 54 45 5f 52 4f 57 20 20 20 20  BU_STATE_ROW    
17a0: 20 20 20 20 20 34 0a 23 64 65 66 69 6e 65 20 52       4.#define R
17b0: 42 55 5f 53 54 41 54 45 5f 50 52 4f 47 52 45 53  BU_STATE_PROGRES
17c0: 53 20 20 20 20 35 0a 23 64 65 66 69 6e 65 20 52  S    5.#define R
17d0: 42 55 5f 53 54 41 54 45 5f 43 4b 50 54 20 20 20  BU_STATE_CKPT   
17e0: 20 20 20 20 20 36 0a 23 64 65 66 69 6e 65 20 52       6.#define R
17f0: 42 55 5f 53 54 41 54 45 5f 43 4f 4f 4b 49 45 20  BU_STATE_COOKIE 
1800: 20 20 20 20 20 37 0a 23 64 65 66 69 6e 65 20 52       7.#define R
1810: 42 55 5f 53 54 41 54 45 5f 4f 41 4c 53 5a 20 20  BU_STATE_OALSZ  
1820: 20 20 20 20 20 38 0a 0a 23 64 65 66 69 6e 65 20       8..#define 
1830: 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20 20 20  RBU_STAGE_OAL   
1840: 20 20 20 20 20 20 31 0a 23 64 65 66 69 6e 65 20        1.#define 
1850: 52 42 55 5f 53 54 41 47 45 5f 4d 4f 56 45 20 20  RBU_STAGE_MOVE  
1860: 20 20 20 20 20 20 32 0a 23 64 65 66 69 6e 65 20        2.#define 
1870: 52 42 55 5f 53 54 41 47 45 5f 43 41 50 54 55 52  RBU_STAGE_CAPTUR
1880: 45 20 20 20 20 20 33 0a 23 64 65 66 69 6e 65 20  E     3.#define 
1890: 52 42 55 5f 53 54 41 47 45 5f 43 4b 50 54 20 20  RBU_STAGE_CKPT  
18a0: 20 20 20 20 20 20 34 0a 23 64 65 66 69 6e 65 20        4.#define 
18b0: 52 42 55 5f 53 54 41 47 45 5f 44 4f 4e 45 20 20  RBU_STAGE_DONE  
18c0: 20 20 20 20 20 20 35 0a 0a 0a 23 64 65 66 69 6e        5...#defin
18d0: 65 20 52 42 55 5f 43 52 45 41 54 45 5f 53 54 41  e RBU_CREATE_STA
18e0: 54 45 20 5c 0a 20 20 22 43 52 45 41 54 45 20 54  TE \.  "CREATE T
18f0: 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53  ABLE IF NOT EXIS
1900: 54 53 20 25 73 2e 72 62 75 5f 73 74 61 74 65 28  TS %s.rbu_state(
1910: 6b 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  k INTEGER PRIMAR
1920: 59 20 4b 45 59 2c 20 76 29 22 0a 0a 74 79 70 65  Y KEY, v)"..type
1930: 64 65 66 20 73 74 72 75 63 74 20 52 62 75 46 72  def struct RbuFr
1940: 61 6d 65 20 52 62 75 46 72 61 6d 65 3b 0a 74 79  ame RbuFrame;.ty
1950: 70 65 64 65 66 20 73 74 72 75 63 74 20 52 62 75  pedef struct Rbu
1960: 4f 62 6a 49 74 65 72 20 52 62 75 4f 62 6a 49 74  ObjIter RbuObjIt
1970: 65 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  er;.typedef stru
1980: 63 74 20 52 62 75 53 74 61 74 65 20 52 62 75 53  ct RbuState RbuS
1990: 74 61 74 65 3b 0a 74 79 70 65 64 65 66 20 73 74  tate;.typedef st
19a0: 72 75 63 74 20 72 62 75 5f 76 66 73 20 72 62 75  ruct rbu_vfs rbu
19b0: 5f 76 66 73 3b 0a 74 79 70 65 64 65 66 20 73 74  _vfs;.typedef st
19c0: 72 75 63 74 20 72 62 75 5f 66 69 6c 65 20 72 62  ruct rbu_file rb
19d0: 75 5f 66 69 6c 65 3b 0a 74 79 70 65 64 65 66 20  u_file;.typedef 
19e0: 73 74 72 75 63 74 20 52 62 75 55 70 64 61 74 65  struct RbuUpdate
19f0: 53 74 6d 74 20 52 62 75 55 70 64 61 74 65 53 74  Stmt RbuUpdateSt
1a00: 6d 74 3b 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  mt;..#if !define
1a10: 64 28 53 51 4c 49 54 45 5f 41 4d 41 4c 47 41 4d  d(SQLITE_AMALGAM
1a20: 41 54 49 4f 4e 29 0a 74 79 70 65 64 65 66 20 75  ATION).typedef u
1a30: 6e 73 69 67 6e 65 64 20 69 6e 74 20 75 33 32 3b  nsigned int u32;
1a40: 0a 74 79 70 65 64 65 66 20 75 6e 73 69 67 6e 65  .typedef unsigne
1a50: 64 20 63 68 61 72 20 75 38 3b 0a 74 79 70 65 64  d char u8;.typed
1a60: 65 66 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  ef sqlite3_int64
1a70: 20 69 36 34 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a   i64;.#endif../*
1a80: 0a 2a 2a 20 54 68 65 73 65 20 76 61 6c 75 65 73  .** These values
1a90: 20 6d 75 73 74 20 6d 61 74 63 68 20 74 68 65 20   must match the 
1aa0: 76 61 6c 75 65 73 20 64 65 66 69 6e 65 64 20 69  values defined i
1ab0: 6e 20 77 61 6c 2e 63 20 66 6f 72 20 74 68 65 20  n wal.c for the 
1ac0: 65 71 75 69 76 61 6c 65 6e 74 0a 2a 2a 20 6c 6f  equivalent.** lo
1ad0: 63 6b 73 2e 20 54 68 65 73 65 20 61 72 65 20 6e  cks. These are n
1ae0: 6f 74 20 6d 61 67 69 63 20 6e 75 6d 62 65 72 73  ot magic numbers
1af0: 20 61 73 20 74 68 65 79 20 61 72 65 20 70 61 72   as they are par
1b00: 74 20 6f 66 20 74 68 65 20 53 51 4c 69 74 65 20  t of the SQLite 
1b10: 66 69 6c 65 0a 2a 2a 20 66 6f 72 6d 61 74 2e 0a  file.** format..
1b20: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 41 4c 5f 4c  */.#define WAL_L
1b30: 4f 43 4b 5f 57 52 49 54 45 20 20 30 0a 23 64 65  OCK_WRITE  0.#de
1b40: 66 69 6e 65 20 57 41 4c 5f 4c 4f 43 4b 5f 43 4b  fine WAL_LOCK_CK
1b50: 50 54 20 20 20 31 0a 23 64 65 66 69 6e 65 20 57  PT   1.#define W
1b60: 41 4c 5f 4c 4f 43 4b 5f 52 45 41 44 30 20 20 33  AL_LOCK_READ0  3
1b70: 0a 0a 2f 2a 0a 2a 2a 20 41 20 73 74 72 75 63 74  ../*.** A struct
1b80: 75 72 65 20 74 6f 20 73 74 6f 72 65 20 76 61 6c  ure to store val
1b90: 75 65 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68  ues read from th
1ba0: 65 20 72 62 75 5f 73 74 61 74 65 20 74 61 62 6c  e rbu_state tabl
1bb0: 65 20 69 6e 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a  e in memory..*/.
1bc0: 73 74 72 75 63 74 20 52 62 75 53 74 61 74 65 20  struct RbuState 
1bd0: 7b 0a 20 20 69 6e 74 20 65 53 74 61 67 65 3b 0a  {.  int eStage;.
1be0: 20 20 63 68 61 72 20 2a 7a 54 62 6c 3b 0a 20 20    char *zTbl;.  
1bf0: 63 68 61 72 20 2a 7a 49 64 78 3b 0a 20 20 69 36  char *zIdx;.  i6
1c00: 34 20 69 57 61 6c 43 6b 73 75 6d 3b 0a 20 20 69  4 iWalCksum;.  i
1c10: 6e 74 20 6e 52 6f 77 3b 0a 20 20 69 36 34 20 6e  nt nRow;.  i64 n
1c20: 50 72 6f 67 72 65 73 73 3b 0a 20 20 75 33 32 20  Progress;.  u32 
1c30: 69 43 6f 6f 6b 69 65 3b 0a 20 20 69 36 34 20 69  iCookie;.  i64 i
1c40: 4f 61 6c 53 7a 3b 0a 7d 3b 0a 0a 73 74 72 75 63  OalSz;.};..struc
1c50: 74 20 52 62 75 55 70 64 61 74 65 53 74 6d 74 20  t RbuUpdateStmt 
1c60: 7b 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 6b 3b  {.  char *zMask;
1c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c80: 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 75      /* Copy of u
1c90: 70 64 61 74 65 20 6d 61 73 6b 20 75 73 65 64 20  pdate mask used 
1ca0: 77 69 74 68 20 70 55 70 64 61 74 65 20 2a 2f 0a  with pUpdate */.
1cb0: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
1cc0: 70 55 70 64 61 74 65 3b 20 20 20 20 20 20 20 20  pUpdate;        
1cd0: 20 20 2f 2a 20 4c 61 73 74 20 75 70 64 61 74 65    /* Last update
1ce0: 20 73 74 61 74 65 6d 65 6e 74 20 28 6f 72 20 4e   statement (or N
1cf0: 55 4c 4c 29 20 2a 2f 0a 20 20 52 62 75 55 70 64  ULL) */.  RbuUpd
1d00: 61 74 65 53 74 6d 74 20 2a 70 4e 65 78 74 3b 0a  ateStmt *pNext;.
1d10: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 74 65  };../*.** An ite
1d20: 72 61 74 6f 72 20 6f 66 20 74 68 69 73 20 74 79  rator of this ty
1d30: 70 65 20 69 73 20 75 73 65 64 20 74 6f 20 69 74  pe is used to it
1d40: 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 61 6c  erate through al
1d50: 6c 20 6f 62 6a 65 63 74 73 20 69 6e 0a 2a 2a 20  l objects in.** 
1d60: 74 68 65 20 74 61 72 67 65 74 20 64 61 74 61 62  the target datab
1d70: 61 73 65 20 74 68 61 74 20 72 65 71 75 69 72 65  ase that require
1d80: 20 75 70 64 61 74 69 6e 67 2e 20 46 6f 72 20 65   updating. For e
1d90: 61 63 68 20 73 75 63 68 20 74 61 62 6c 65 2c 20  ach such table, 
1da0: 74 68 65 0a 2a 2a 20 69 74 65 72 61 74 6f 72 20  the.** iterator 
1db0: 76 69 73 69 74 73 2c 20 69 6e 20 6f 72 64 65 72  visits, in order
1dc0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 74 68  :.**.**     * th
1dd0: 65 20 74 61 62 6c 65 20 69 74 73 65 6c 66 2c 20  e table itself, 
1de0: 0a 2a 2a 20 20 20 20 20 2a 20 65 61 63 68 20 69  .**     * each i
1df0: 6e 64 65 78 20 6f 66 20 74 68 65 20 74 61 62 6c  ndex of the tabl
1e00: 65 20 28 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20  e (zero or more 
1e10: 70 6f 69 6e 74 73 20 74 6f 20 76 69 73 69 74 29  points to visit)
1e20: 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 2a 20 61  , and.**     * a
1e30: 20 73 70 65 63 69 61 6c 20 22 63 6c 65 61 6e 75   special "cleanu
1e40: 70 20 74 61 62 6c 65 22 20 73 74 61 74 65 2e 0a  p table" state..
1e50: 2a 2a 0a 2a 2a 20 61 62 49 6e 64 65 78 65 64 3a  **.** abIndexed:
1e60: 0a 2a 2a 20 20 20 49 66 20 74 68 65 20 74 61 62  .**   If the tab
1e70: 6c 65 20 68 61 73 20 6e 6f 20 69 6e 64 65 78 65  le has no indexe
1e80: 73 20 6f 6e 20 69 74 2c 20 61 62 49 6e 64 65 78  s on it, abIndex
1e90: 65 64 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  ed is set to NUL
1ea0: 4c 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a  L. Otherwise,.**
1eb0: 20 20 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20     it points to 
1ec0: 61 6e 20 61 72 72 61 79 20 6f 66 20 66 6c 61 67  an array of flag
1ed0: 73 20 6e 54 62 6c 43 6f 6c 20 65 6c 65 6d 65 6e  s nTblCol elemen
1ee0: 74 73 20 69 6e 20 73 69 7a 65 2e 20 54 68 65 20  ts in size. The 
1ef0: 66 6c 61 67 20 69 73 0a 2a 2a 20 20 20 73 65 74  flag is.**   set
1f00: 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e   for each column
1f10: 20 74 68 61 74 20 69 73 20 65 69 74 68 65 72 20   that is either 
1f20: 61 20 70 61 72 74 20 6f 66 20 74 68 65 20 50 4b  a part of the PK
1f30: 20 6f 72 20 61 20 70 61 72 74 20 6f 66 20 61 6e   or a part of an
1f40: 0a 2a 2a 20 20 20 69 6e 64 65 78 2e 20 4f 72 20  .**   index. Or 
1f50: 63 6c 65 61 72 20 6f 74 68 65 72 77 69 73 65 2e  clear otherwise.
1f60: 0a 2a 2a 20 20 20 0a 2a 2f 0a 73 74 72 75 63 74  .**   .*/.struct
1f70: 20 52 62 75 4f 62 6a 49 74 65 72 20 7b 0a 20 20   RbuObjIter {.  
1f80: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 54  sqlite3_stmt *pT
1f90: 62 6c 49 74 65 72 3b 20 20 20 20 20 20 20 20 20  blIter;         
1fa0: 2f 2a 20 49 74 65 72 61 74 65 20 74 68 72 6f 75  /* Iterate throu
1fb0: 67 68 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 73  gh tables */.  s
1fc0: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 49 64  qlite3_stmt *pId
1fd0: 78 49 74 65 72 3b 20 20 20 20 20 20 20 20 20 2f  xIter;         /
1fe0: 2a 20 49 6e 64 65 78 20 69 74 65 72 61 74 6f 72  * Index iterator
1ff0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 62 6c 43 6f   */.  int nTblCo
2000: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
2010: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
2020: 20 61 7a 54 62 6c 43 6f 6c 5b 5d 20 61 72 72 61   azTblCol[] arra
2030: 79 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a  y */.  char **az
2040: 54 62 6c 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  TblCol;         
2050: 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
2060: 6f 66 20 75 6e 71 75 6f 74 65 64 20 74 61 72 67  of unquoted targ
2070: 65 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  et column names 
2080: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a 54 62  */.  char **azTb
2090: 6c 54 79 70 65 3b 20 20 20 20 20 20 20 20 20 20  lType;          
20a0: 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
20b0: 20 74 61 72 67 65 74 20 63 6f 6c 75 6d 6e 20 74   target column t
20c0: 79 70 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 61  ypes */.  int *a
20d0: 69 53 72 63 4f 72 64 65 72 3b 20 20 20 20 20 20  iSrcOrder;      
20e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 72 63            /* src
20f0: 20 74 61 62 6c 65 20 63 6f 6c 20 2d 3e 20 74 61   table col -> ta
2100: 72 67 65 74 20 74 61 62 6c 65 20 63 6f 6c 20 2a  rget table col *
2110: 2f 0a 20 20 75 38 20 2a 61 62 54 62 6c 50 6b 3b  /.  u8 *abTblPk;
2120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2130: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
2140: 66 6c 61 67 73 2c 20 73 65 74 20 6f 6e 20 74 61  flags, set on ta
2150: 72 67 65 74 20 50 4b 20 63 6f 6c 75 6d 6e 73 20  rget PK columns 
2160: 2a 2f 0a 20 20 75 38 20 2a 61 62 4e 6f 74 4e 75  */.  u8 *abNotNu
2170: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
2180: 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
2190: 20 66 6c 61 67 73 2c 20 73 65 74 20 6f 6e 20 4e   flags, set on N
21a0: 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73 20  OT NULL columns 
21b0: 2a 2f 0a 20 20 75 38 20 2a 61 62 49 6e 64 65 78  */.  u8 *abIndex
21c0: 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ed;             
21d0: 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
21e0: 20 66 6c 61 67 73 2c 20 73 65 74 20 6f 6e 20 69   flags, set on i
21f0: 6e 64 65 78 65 64 20 26 20 50 4b 20 63 6f 6c 73  ndexed & PK cols
2200: 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 3b   */.  int eType;
2210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2220: 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74        /* Table t
2230: 79 70 65 20 2d 20 61 6e 20 52 42 55 5f 50 4b 5f  ype - an RBU_PK_
2240: 58 58 58 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20  XXX value */..  
2250: 2f 2a 20 4f 75 74 70 75 74 20 76 61 72 69 61 62  /* Output variab
2260: 6c 65 73 2e 20 7a 54 62 6c 3d 3d 30 20 69 6d 70  les. zTbl==0 imp
2270: 6c 69 65 73 20 45 4f 46 2e 20 2a 2f 0a 20 20 69  lies EOF. */.  i
2280: 6e 74 20 62 43 6c 65 61 6e 75 70 3b 20 20 20 20  nt bCleanup;    
2290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22a0: 2a 20 54 72 75 65 20 69 6e 20 22 63 6c 65 61 6e  * True in "clean
22b0: 75 70 22 20 73 74 61 74 65 20 2a 2f 0a 20 20 63  up" state */.  c
22c0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 62 6c 3b  onst char *zTbl;
22d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22e0: 2a 20 4e 61 6d 65 20 6f 66 20 74 61 72 67 65 74  * Name of target
22f0: 20 64 62 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63   db table */.  c
2300: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61 74 61  onst char *zData
2310: 54 62 6c 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Tbl;           /
2320: 2a 20 4e 61 6d 65 20 6f 66 20 72 62 75 20 64 62  * Name of rbu db
2330: 20 74 61 62 6c 65 20 28 6f 72 20 6e 75 6c 6c 29   table (or null)
2340: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
2350: 20 2a 7a 49 64 78 3b 20 20 20 20 20 20 20 20 20   *zIdx;         
2360: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
2370: 20 74 61 72 67 65 74 20 64 62 20 69 6e 64 65 78   target db index
2380: 20 28 6f 72 20 6e 75 6c 6c 29 20 2a 2f 0a 20 20   (or null) */.  
2390: 69 6e 74 20 69 54 6e 75 6d 3b 20 20 20 20 20 20  int iTnum;      
23a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b0: 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20  /* Root page of 
23c0: 63 75 72 72 65 6e 74 20 6f 62 6a 65 63 74 20 2a  current object *
23d0: 2f 0a 20 20 69 6e 74 20 69 50 6b 54 6e 75 6d 3b  /.  int iPkTnum;
23e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f0: 20 20 20 20 2f 2a 20 49 66 20 65 54 79 70 65 3d      /* If eType=
2400: 3d 45 58 54 45 52 4e 41 4c 2c 20 72 6f 6f 74 20  =EXTERNAL, root 
2410: 6f 66 20 50 4b 20 69 6e 64 65 78 20 2a 2f 0a 20  of PK index */. 
2420: 20 69 6e 74 20 62 55 6e 69 71 75 65 3b 20 20 20   int bUnique;   
2430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2440: 20 2f 2a 20 43 75 72 72 65 6e 74 20 69 6e 64 65   /* Current inde
2450: 78 20 69 73 20 75 6e 69 71 75 65 20 2a 2f 0a 0a  x is unique */..
2460: 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 73 20    /* Statements 
2470: 63 72 65 61 74 65 64 20 62 79 20 72 62 75 4f 62  created by rbuOb
2480: 6a 49 74 65 72 50 72 65 70 61 72 65 41 6c 6c 28  jIterPrepareAll(
2490: 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b  ) */.  int nCol;
24a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
24c0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 63   of columns in c
24d0: 75 72 72 65 6e 74 20 6f 62 6a 65 63 74 20 2a 2f  urrent object */
24e0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
24f0: 2a 70 53 65 6c 65 63 74 3b 20 20 20 20 20 20 20  *pSelect;       
2500: 20 20 20 2f 2a 20 53 6f 75 72 63 65 20 64 61 74     /* Source dat
2510: 61 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73  a */.  sqlite3_s
2520: 74 6d 74 20 2a 70 49 6e 73 65 72 74 3b 20 20 20  tmt *pInsert;   
2530: 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 65 6d         /* Statem
2540: 65 6e 74 20 66 6f 72 20 49 4e 53 45 52 54 20 6f  ent for INSERT o
2550: 70 65 72 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 73  perations */.  s
2560: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 44 65  qlite3_stmt *pDe
2570: 6c 65 74 65 3b 20 20 20 20 20 20 20 20 20 20 2f  lete;          /
2580: 2a 20 53 74 61 74 65 6d 65 6e 74 20 66 6f 72 20  * Statement for 
2590: 44 45 4c 45 54 45 20 6f 70 73 20 2a 2f 0a 20 20  DELETE ops */.  
25a0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 54  sqlite3_stmt *pT
25b0: 6d 70 49 6e 73 65 72 74 3b 20 20 20 20 20 20 20  mpInsert;       
25c0: 2f 2a 20 49 6e 73 65 72 74 20 69 6e 74 6f 20 72  /* Insert into r
25d0: 62 75 5f 74 6d 70 5f 24 7a 44 61 74 61 54 62 6c  bu_tmp_$zDataTbl
25e0: 20 2a 2f 0a 0a 20 20 2f 2a 20 4c 61 73 74 20 55   */..  /* Last U
25f0: 50 44 41 54 45 20 75 73 65 64 20 28 66 6f 72 20  PDATE used (for 
2600: 50 4b 20 62 2d 74 72 65 65 20 75 70 64 61 74 65  PK b-tree update
2610: 73 20 6f 6e 6c 79 29 2c 20 6f 72 20 4e 55 4c 4c  s only), or NULL
2620: 2e 20 2a 2f 0a 20 20 52 62 75 55 70 64 61 74 65  . */.  RbuUpdate
2630: 53 74 6d 74 20 2a 70 52 62 75 55 70 64 61 74 65  Stmt *pRbuUpdate
2640: 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c 75  ;.};../*.** Valu
2650: 65 73 20 66 6f 72 20 52 62 75 4f 62 6a 49 74 65  es for RbuObjIte
2660: 72 2e 65 54 79 70 65 0a 2a 2a 0a 2a 2a 20 20 20  r.eType.**.**   
2670: 20 20 30 3a 20 54 61 62 6c 65 20 64 6f 65 73 20    0: Table does 
2680: 6e 6f 74 20 65 78 69 73 74 20 28 65 72 72 6f 72  not exist (error
2690: 29 0a 2a 2a 20 20 20 20 20 31 3a 20 54 61 62 6c  ).**     1: Tabl
26a0: 65 20 68 61 73 20 61 6e 20 69 6d 70 6c 69 63 69  e has an implici
26b0: 74 20 72 6f 77 69 64 2e 0a 2a 2a 20 20 20 20 20  t rowid..**     
26c0: 32 3a 20 54 61 62 6c 65 20 68 61 73 20 61 6e 20  2: Table has an 
26d0: 65 78 70 6c 69 63 69 74 20 49 50 4b 20 63 6f 6c  explicit IPK col
26e0: 75 6d 6e 2e 0a 2a 2a 20 20 20 20 20 33 3a 20 54  umn..**     3: T
26f0: 61 62 6c 65 20 68 61 73 20 61 6e 20 65 78 74 65  able has an exte
2700: 72 6e 61 6c 20 50 4b 20 69 6e 64 65 78 2e 0a 2a  rnal PK index..*
2710: 2a 20 20 20 20 20 34 3a 20 54 61 62 6c 65 20 69  *     4: Table i
2720: 73 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 2e  s WITHOUT ROWID.
2730: 0a 2a 2a 20 20 20 20 20 35 3a 20 54 61 62 6c 65  .**     5: Table
2740: 20 69 73 20 61 20 76 69 72 74 75 61 6c 20 74 61   is a virtual ta
2750: 62 6c 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ble..*/.#define 
2760: 52 42 55 5f 50 4b 5f 4e 4f 54 41 42 4c 45 20 20  RBU_PK_NOTABLE  
2770: 20 20 20 20 20 20 30 0a 23 64 65 66 69 6e 65 20        0.#define 
2780: 52 42 55 5f 50 4b 5f 4e 4f 4e 45 20 20 20 20 20  RBU_PK_NONE     
2790: 20 20 20 20 20 20 31 0a 23 64 65 66 69 6e 65 20        1.#define 
27a0: 52 42 55 5f 50 4b 5f 49 50 4b 20 20 20 20 20 20  RBU_PK_IPK      
27b0: 20 20 20 20 20 20 32 0a 23 64 65 66 69 6e 65 20        2.#define 
27c0: 52 42 55 5f 50 4b 5f 45 58 54 45 52 4e 41 4c 20  RBU_PK_EXTERNAL 
27d0: 20 20 20 20 20 20 33 0a 23 64 65 66 69 6e 65 20        3.#define 
27e0: 52 42 55 5f 50 4b 5f 57 49 54 48 4f 55 54 5f 52  RBU_PK_WITHOUT_R
27f0: 4f 57 49 44 20 20 34 0a 23 64 65 66 69 6e 65 20  OWID  4.#define 
2800: 52 42 55 5f 50 4b 5f 56 54 41 42 20 20 20 20 20  RBU_PK_VTAB     
2810: 20 20 20 20 20 20 35 0a 0a 0a 2f 2a 0a 2a 2a 20        5.../*.** 
2820: 57 69 74 68 69 6e 20 74 68 65 20 52 42 55 5f 53  Within the RBU_S
2830: 54 41 47 45 5f 4f 41 4c 20 73 74 61 67 65 2c 20  TAGE_OAL stage, 
2840: 65 61 63 68 20 63 61 6c 6c 20 74 6f 20 73 71 6c  each call to sql
2850: 69 74 65 33 72 62 75 5f 73 74 65 70 28 29 20 70  ite3rbu_step() p
2860: 65 72 66 6f 72 6d 73 0a 2a 2a 20 6f 6e 65 20 6f  erforms.** one o
2870: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
2880: 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 23  operations..*/.#
2890: 64 65 66 69 6e 65 20 52 42 55 5f 49 4e 53 45 52  define RBU_INSER
28a0: 54 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20  T     1         
28b0: 20 2f 2a 20 49 6e 73 65 72 74 20 6f 6e 20 61 20   /* Insert on a 
28c0: 6d 61 69 6e 20 74 61 62 6c 65 20 62 2d 74 72 65  main table b-tre
28d0: 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 52 42 55  e */.#define RBU
28e0: 5f 44 45 4c 45 54 45 20 20 20 20 20 32 20 20 20  _DELETE     2   
28f0: 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65         /* Delete
2900: 20 61 20 72 6f 77 20 66 72 6f 6d 20 61 20 6d 61   a row from a ma
2910: 69 6e 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20  in table b-tree 
2920: 2a 2f 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 49  */.#define RBU_I
2930: 44 58 5f 44 45 4c 45 54 45 20 33 20 20 20 20 20  DX_DELETE 3     
2940: 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 61       /* Delete a
2950: 20 72 6f 77 20 66 72 6f 6d 20 61 6e 20 61 75 78   row from an aux
2960: 2e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20 2a  . index b-tree *
2970: 2f 0a 23 64 65 66 69 6e 65 20 52 42 55 5f 49 44  /.#define RBU_ID
2980: 58 5f 49 4e 53 45 52 54 20 34 20 20 20 20 20 20  X_INSERT 4      
2990: 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 6f 6e      /* Insert on
29a0: 20 61 6e 20 61 75 78 2e 20 69 6e 64 65 78 20 62   an aux. index b
29b0: 2d 74 72 65 65 20 2a 2f 0a 23 64 65 66 69 6e 65  -tree */.#define
29c0: 20 52 42 55 5f 55 50 44 41 54 45 20 20 20 20 20   RBU_UPDATE     
29d0: 35 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 70  5          /* Up
29e0: 64 61 74 65 20 61 20 72 6f 77 20 69 6e 20 61 20  date a row in a 
29f0: 6d 61 69 6e 20 74 61 62 6c 65 20 62 2d 74 72 65  main table b-tre
2a00: 65 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 41 20 73  e */.../*.** A s
2a10: 69 6e 67 6c 65 20 73 74 65 70 20 6f 66 20 61 6e  ingle step of an
2a20: 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 63 68 65   incremental che
2a30: 63 6b 70 6f 69 6e 74 20 2d 20 66 72 61 6d 65 20  ckpoint - frame 
2a40: 69 57 61 6c 46 72 61 6d 65 20 6f 66 20 74 68 65  iWalFrame of the
2a50: 20 77 61 6c 0a 2a 2a 20 66 69 6c 65 20 73 68 6f   wal.** file sho
2a60: 75 6c 64 20 62 65 20 63 6f 70 69 65 64 20 74 6f  uld be copied to
2a70: 20 70 61 67 65 20 69 44 62 50 61 67 65 20 6f 66   page iDbPage of
2a80: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2a90: 6c 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 52 62  le..*/.struct Rb
2aa0: 75 46 72 61 6d 65 20 7b 0a 20 20 75 33 32 20 69  uFrame {.  u32 i
2ab0: 44 62 50 61 67 65 3b 0a 20 20 75 33 32 20 69 57  DbPage;.  u32 iW
2ac0: 61 6c 46 72 61 6d 65 3b 0a 7d 3b 0a 0a 2f 2a 0a  alFrame;.};../*.
2ad0: 2a 2a 20 52 42 55 20 68 61 6e 64 6c 65 2e 0a 2a  ** RBU handle..*
2ae0: 2f 0a 73 74 72 75 63 74 20 73 71 6c 69 74 65 33  /.struct sqlite3
2af0: 72 62 75 20 7b 0a 20 20 69 6e 74 20 65 53 74 61  rbu {.  int eSta
2b00: 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
2b10: 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
2b20: 20 6f 66 20 52 42 55 5f 53 54 41 54 45 5f 53 54   of RBU_STATE_ST
2b30: 41 47 45 20 66 69 65 6c 64 20 2a 2f 0a 20 20 73  AGE field */.  s
2b40: 71 6c 69 74 65 33 20 2a 64 62 4d 61 69 6e 3b 20  qlite3 *dbMain; 
2b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b60: 2a 20 74 61 72 67 65 74 20 64 61 74 61 62 61 73  * target databas
2b70: 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 73 71  e handle */.  sq
2b80: 6c 69 74 65 33 20 2a 64 62 52 62 75 3b 20 20 20  lite3 *dbRbu;   
2b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ba0: 20 72 62 75 20 64 61 74 61 62 61 73 65 20 68 61   rbu database ha
2bb0: 6e 64 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ndle */.  char *
2bc0: 7a 54 61 72 67 65 74 3b 20 20 20 20 20 20 20 20  zTarget;        
2bd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 74            /* Pat
2be0: 68 20 74 6f 20 74 61 72 67 65 74 20 64 62 20 2a  h to target db *
2bf0: 2f 0a 20 20 63 68 61 72 20 2a 7a 52 62 75 3b 20  /.  char *zRbu; 
2c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c10: 20 20 20 20 2f 2a 20 50 61 74 68 20 74 6f 20 72      /* Path to r
2c20: 62 75 20 64 62 20 2a 2f 0a 20 20 63 68 61 72 20  bu db */.  char 
2c30: 2a 7a 53 74 61 74 65 3b 20 20 20 20 20 20 20 20  *zState;        
2c40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
2c50: 74 68 20 74 6f 20 73 74 61 74 65 20 64 62 20 28  th to state db (
2c60: 6f 72 20 4e 55 4c 4c 20 69 66 20 7a 52 62 75 29  or NULL if zRbu)
2c70: 20 2a 2f 0a 20 20 63 68 61 72 20 7a 53 74 61 74   */.  char zStat
2c80: 65 44 62 5b 35 5d 3b 20 20 20 20 20 20 20 20 20  eDb[5];         
2c90: 20 20 20 20 20 20 2f 2a 20 44 62 20 6e 61 6d 65        /* Db name
2ca0: 20 66 6f 72 20 73 74 61 74 65 20 28 22 73 74 61   for state ("sta
2cb0: 74 22 20 6f 72 20 22 6d 61 69 6e 22 29 20 2a 2f  t" or "main") */
2cc0: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
2cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ce0: 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75     /* Value retu
2cf0: 72 6e 65 64 20 62 79 20 6c 61 73 74 20 72 62 75  rned by last rbu
2d00: 5f 73 74 65 70 28 29 20 63 61 6c 6c 20 2a 2f 0a  _step() call */.
2d10: 20 20 63 68 61 72 20 2a 7a 45 72 72 6d 73 67 3b    char *zErrmsg;
2d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d30: 20 20 2f 2a 20 45 72 72 6f 72 20 6d 65 73 73 61    /* Error messa
2d40: 67 65 20 69 66 20 72 63 21 3d 53 51 4c 49 54 45  ge if rc!=SQLITE
2d50: 5f 4f 4b 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 74  _OK */.  int nSt
2d60: 65 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ep;             
2d70: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 73           /* Rows
2d80: 20 70 72 6f 63 65 73 73 65 64 20 66 6f 72 20 63   processed for c
2d90: 75 72 72 65 6e 74 20 6f 62 6a 65 63 74 20 2a 2f  urrent object */
2da0: 0a 20 20 69 6e 74 20 6e 50 72 6f 67 72 65 73 73  .  int nProgress
2db0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2dc0: 20 20 20 2f 2a 20 52 6f 77 73 20 70 72 6f 63 65     /* Rows proce
2dd0: 73 73 65 64 20 66 6f 72 20 61 6c 6c 20 6f 62 6a  ssed for all obj
2de0: 65 63 74 73 20 2a 2f 0a 20 20 52 62 75 4f 62 6a  ects */.  RbuObj
2df0: 49 74 65 72 20 6f 62 6a 69 74 65 72 3b 20 20 20  Iter objiter;   
2e00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
2e10: 72 61 74 6f 72 20 66 6f 72 20 73 6b 69 70 70 69  rator for skippi
2e20: 6e 67 20 74 68 72 6f 75 67 68 20 74 62 6c 2f 69  ng through tbl/i
2e30: 64 78 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  dx */.  const ch
2e40: 61 72 20 2a 7a 56 66 73 4e 61 6d 65 3b 20 20 20  ar *zVfsName;   
2e50: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
2e60: 6f 66 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  of automatically
2e70: 20 63 72 65 61 74 65 64 20 72 62 75 20 76 66 73   created rbu vfs
2e80: 20 2a 2f 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a   */.  rbu_file *
2e90: 70 54 61 72 67 65 74 46 64 3b 20 20 20 20 20 20  pTargetFd;      
2ea0: 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 68 61        /* File ha
2eb0: 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e 20 74 61 72  ndle open on tar
2ec0: 67 65 74 20 64 62 20 2a 2f 0a 20 20 69 36 34 20  get db */.  i64 
2ed0: 69 4f 61 6c 53 7a 3b 0a 0a 20 20 2f 2a 20 54 68  iOalSz;..  /* Th
2ee0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 61 74  e following stat
2ef0: 65 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20  e variables are 
2f00: 75 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  used as part of 
2f10: 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 0a  the incremental.
2f20: 20 20 2a 2a 20 63 68 65 63 6b 70 6f 69 6e 74 20    ** checkpoint 
2f30: 73 74 61 67 65 20 28 65 53 74 61 67 65 3d 3d 52  stage (eStage==R
2f40: 42 55 5f 53 54 41 47 45 5f 43 4b 50 54 29 2e 20  BU_STAGE_CKPT). 
2f50: 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 73 75 72  See comments sur
2f60: 72 6f 75 6e 64 69 6e 67 0a 20 20 2a 2a 20 66 75  rounding.  ** fu
2f70: 6e 63 74 69 6f 6e 20 72 62 75 53 65 74 75 70 43  nction rbuSetupC
2f80: 68 65 63 6b 70 6f 69 6e 74 28 29 20 66 6f 72 20  heckpoint() for 
2f90: 64 65 74 61 69 6c 73 2e 20 20 2a 2f 0a 20 20 75  details.  */.  u
2fa0: 33 32 20 69 4d 61 78 46 72 61 6d 65 3b 20 20 20  32 iMaxFrame;   
2fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2fc0: 2a 20 4c 61 72 67 65 73 74 20 69 57 61 6c 46 72  * Largest iWalFr
2fd0: 61 6d 65 20 76 61 6c 75 65 20 69 6e 20 61 46 72  ame value in aFr
2fe0: 61 6d 65 5b 5d 20 2a 2f 0a 20 20 75 33 32 20 6d  ame[] */.  u32 m
2ff0: 4c 6f 63 6b 3b 0a 20 20 69 6e 74 20 6e 46 72 61  Lock;.  int nFra
3000: 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  me;             
3010: 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 74 72 69          /* Entri
3020: 65 73 20 69 6e 20 61 46 72 61 6d 65 5b 5d 20 61  es in aFrame[] a
3030: 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 46  rray */.  int nF
3040: 72 61 6d 65 41 6c 6c 6f 63 3b 20 20 20 20 20 20  rameAlloc;      
3050: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
3060: 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20 61  ocated size of a
3070: 46 72 61 6d 65 5b 5d 20 61 72 72 61 79 20 2a 2f  Frame[] array */
3080: 0a 20 20 52 62 75 46 72 61 6d 65 20 2a 61 46 72  .  RbuFrame *aFr
3090: 61 6d 65 3b 0a 20 20 69 6e 74 20 70 67 73 7a 3b  ame;.  int pgsz;
30a0: 0a 20 20 75 38 20 2a 61 42 75 66 3b 0a 20 20 69  .  u8 *aBuf;.  i
30b0: 36 34 20 69 57 61 6c 43 6b 73 75 6d 3b 0a 7d 3b  64 iWalCksum;.};
30c0: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 72 62 75 20 56  ../*.** An rbu V
30d0: 46 53 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  FS is implemente
30e0: 64 20 75 73 69 6e 67 20 61 6e 20 69 6e 73 74 61  d using an insta
30f0: 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 75  nce of this stru
3100: 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72 75 63 74  cture..*/.struct
3110: 20 72 62 75 5f 76 66 73 20 7b 0a 20 20 73 71 6c   rbu_vfs {.  sql
3120: 69 74 65 33 5f 76 66 73 20 62 61 73 65 3b 20 20  ite3_vfs base;  
3130: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3140: 72 62 75 20 56 46 53 20 73 68 69 6d 20 6d 65 74  rbu VFS shim met
3150: 68 6f 64 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  hods */.  sqlite
3160: 33 5f 76 66 73 20 2a 70 52 65 61 6c 56 66 73 3b  3_vfs *pRealVfs;
3170: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 64            /* Und
3180: 65 72 6c 79 69 6e 67 20 56 46 53 20 2a 2f 0a 20  erlying VFS */. 
3190: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
31a0: 6d 75 74 65 78 3b 20 20 20 20 20 20 20 20 20 20  mutex;          
31b0: 20 2f 2a 20 4d 75 74 65 78 20 74 6f 20 70 72 6f   /* Mutex to pro
31c0: 74 65 63 74 20 70 4d 61 69 6e 20 2a 2f 0a 20 20  tect pMain */.  
31d0: 72 62 75 5f 66 69 6c 65 20 2a 70 4d 61 69 6e 3b  rbu_file *pMain;
31e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31f0: 2f 2a 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20 6f  /* Linked list o
3200: 66 20 6d 61 69 6e 20 64 62 20 66 69 6c 65 73 20  f main db files 
3210: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 45 61 63  */.};../*.** Eac
3220: 68 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 62 79  h file opened by
3230: 20 61 6e 20 72 62 75 20 56 46 53 20 69 73 20 72   an rbu VFS is r
3240: 65 70 72 65 73 65 6e 74 65 64 20 62 79 20 61 6e  epresented by an
3250: 20 69 6e 73 74 61 6e 63 65 20 6f 66 0a 2a 2a 20   instance of.** 
3260: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
3270: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72 75  ructure..*/.stru
3280: 63 74 20 72 62 75 5f 66 69 6c 65 20 7b 0a 20 20  ct rbu_file {.  
3290: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 62 61 73  sqlite3_file bas
32a0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
32b0: 2f 2a 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  /* sqlite3_file 
32c0: 6d 65 74 68 6f 64 73 20 2a 2f 0a 20 20 73 71 6c  methods */.  sql
32d0: 69 74 65 33 5f 66 69 6c 65 20 2a 70 52 65 61 6c  ite3_file *pReal
32e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
32f0: 55 6e 64 65 72 6c 79 69 6e 67 20 66 69 6c 65 20  Underlying file 
3300: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 72 62 75 5f  handle */.  rbu_
3310: 76 66 73 20 2a 70 52 62 75 56 66 73 3b 20 20 20  vfs *pRbuVfs;   
3320: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
3330: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 72 62  ointer to the rb
3340: 75 5f 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a  u_vfs object */.
3350: 20 20 73 71 6c 69 74 65 33 72 62 75 20 2a 70 52    sqlite3rbu *pR
3360: 62 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  bu;             
3370: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
3380: 72 62 75 20 6f 62 6a 65 63 74 20 28 72 62 75 20  rbu object (rbu 
3390: 74 61 72 67 65 74 20 6f 6e 6c 79 29 20 2a 2f 0a  target only) */.
33a0: 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73  .  int openFlags
33b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
33c0: 20 20 20 2f 2a 20 46 6c 61 67 73 20 74 68 69 73     /* Flags this
33d0: 20 66 69 6c 65 20 77 61 73 20 6f 70 65 6e 65 64   file was opened
33e0: 20 77 69 74 68 20 2a 2f 0a 20 20 75 33 32 20 69   with */.  u32 i
33f0: 43 6f 6f 6b 69 65 3b 20 20 20 20 20 20 20 20 20  Cookie;         
3400: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
3410: 6f 6b 69 65 20 76 61 6c 75 65 20 66 6f 72 20 6d  okie value for m
3420: 61 69 6e 20 64 62 20 66 69 6c 65 73 20 2a 2f 0a  ain db files */.
3430: 20 20 75 38 20 69 57 72 69 74 65 56 65 72 3b 20    u8 iWriteVer; 
3440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3450: 20 20 2f 2a 20 22 77 72 69 74 65 2d 76 65 72 73    /* "write-vers
3460: 69 6f 6e 22 20 76 61 6c 75 65 20 66 6f 72 20 6d  ion" value for m
3470: 61 69 6e 20 64 62 20 66 69 6c 65 73 20 2a 2f 0a  ain db files */.
3480: 0a 20 20 69 6e 74 20 6e 53 68 6d 3b 20 20 20 20  .  int nShm;    
3490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34a0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
34b0: 65 6e 74 72 69 65 73 20 69 6e 20 61 70 53 68 6d  entries in apShm
34c0: 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 63 68  [] array */.  ch
34d0: 61 72 20 2a 2a 61 70 53 68 6d 3b 20 20 20 20 20  ar **apShm;     
34e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
34f0: 20 41 72 72 61 79 20 6f 66 20 6d 6d 61 70 27 64   Array of mmap'd
3500: 20 2a 2d 73 68 6d 20 72 65 67 69 6f 6e 73 20 2a   *-shm regions *
3510: 2f 0a 20 20 63 68 61 72 20 2a 7a 44 65 6c 3b 20  /.  char *zDel; 
3520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3530: 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68      /* Delete th
3540: 69 73 20 77 68 65 6e 20 63 6c 6f 73 69 6e 67 20  is when closing 
3550: 66 69 6c 65 20 2a 2f 0a 0a 20 20 63 6f 6e 73 74  file */..  const
3560: 20 63 68 61 72 20 2a 7a 57 61 6c 3b 20 20 20 20   char *zWal;    
3570: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 61             /* Wa
3580: 6c 20 66 69 6c 65 6e 61 6d 65 20 66 6f 72 20 74  l filename for t
3590: 68 69 73 20 6d 61 69 6e 20 64 62 20 66 69 6c 65  his main db file
35a0: 20 2a 2f 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a   */.  rbu_file *
35b0: 70 57 61 6c 46 64 3b 20 20 20 20 20 20 20 20 20  pWalFd;         
35c0: 20 20 20 20 20 20 2f 2a 20 57 61 6c 20 66 69 6c        /* Wal fil
35d0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
35e0: 20 74 68 69 73 20 6d 61 69 6e 20 64 62 20 2a 2f   this main db */
35f0: 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 4d 61  .  rbu_file *pMa
3600: 69 6e 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20  inNext;         
3610: 20 20 20 2f 2a 20 4e 65 78 74 20 4d 41 49 4e 5f     /* Next MAIN_
3620: 44 42 20 66 69 6c 65 20 2a 2f 0a 7d 3b 0a 0a 0a  DB file */.};...
3630: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
3640: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3650: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3660: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3670: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68  **********.** Th
3680: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 72 65  e following thre
3690: 65 20 66 75 6e 63 74 69 6f 6e 73 2c 20 66 6f 75  e functions, fou
36a0: 6e 64 20 62 65 6c 6f 77 3a 0a 2a 2a 0a 2a 2a 20  nd below:.**.** 
36b0: 20 20 72 62 75 44 65 6c 74 61 47 65 74 49 6e 74    rbuDeltaGetInt
36c0: 28 29 0a 2a 2a 20 20 20 72 62 75 44 65 6c 74 61  ().**   rbuDelta
36d0: 43 68 65 63 6b 73 75 6d 28 29 0a 2a 2a 20 20 20  Checksum().**   
36e0: 72 62 75 44 65 6c 74 61 41 70 70 6c 79 28 29 0a  rbuDeltaApply().
36f0: 2a 2a 0a 2a 2a 20 61 72 65 20 6c 69 66 74 65 64  **.** are lifted
3700: 20 66 72 6f 6d 20 74 68 65 20 66 6f 73 73 69 6c   from the fossil
3710: 20 73 6f 75 72 63 65 20 63 6f 64 65 20 28 68 74   source code (ht
3720: 74 70 3a 2f 2f 66 6f 73 73 69 6c 2d 73 63 6d 2e  tp://fossil-scm.
3730: 6f 72 67 29 2e 20 54 68 65 79 0a 2a 2a 20 61 72  org). They.** ar
3740: 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  e used to implem
3750: 65 6e 74 20 74 68 65 20 73 63 61 6c 61 72 20 53  ent the scalar S
3760: 51 4c 20 66 75 6e 63 74 69 6f 6e 20 72 62 75 5f  QL function rbu_
3770: 66 6f 73 73 69 6c 5f 64 65 6c 74 61 28 29 2e 0a  fossil_delta()..
3780: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 62  */../*.** Read b
3790: 79 74 65 73 20 66 72 6f 6d 20 2a 70 7a 20 61 6e  ytes from *pz an
37a0: 64 20 63 6f 6e 76 65 72 74 20 74 68 65 6d 20 69  d convert them i
37b0: 6e 74 6f 20 61 20 70 6f 73 69 74 69 76 65 20 69  nto a positive i
37c0: 6e 74 65 67 65 72 2e 20 20 57 68 65 6e 0a 2a 2a  nteger.  When.**
37d0: 20 66 69 6e 69 73 68 65 64 2c 20 6c 65 61 76 65   finished, leave
37e0: 20 2a 70 7a 20 70 6f 69 6e 74 69 6e 67 20 74 6f   *pz pointing to
37f0: 20 74 68 65 20 66 69 72 73 74 20 63 68 61 72 61   the first chara
3800: 63 74 65 72 20 70 61 73 74 20 74 68 65 20 65 6e  cter past the en
3810: 64 20 6f 66 0a 2a 2a 20 74 68 65 20 69 6e 74 65  d of.** the inte
3820: 67 65 72 2e 20 20 54 68 65 20 2a 70 4c 65 6e 20  ger.  The *pLen 
3830: 70 61 72 61 6d 65 74 65 72 20 68 6f 6c 64 73 20  parameter holds 
3840: 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68  the length of th
3850: 65 20 73 74 72 69 6e 67 0a 2a 2a 20 69 6e 20 2a  e string.** in *
3860: 70 7a 20 61 6e 64 20 69 73 20 64 65 63 72 65 6d  pz and is decrem
3870: 65 6e 74 65 64 20 6f 6e 63 65 20 66 6f 72 20 65  ented once for e
3880: 61 63 68 20 63 68 61 72 61 63 74 65 72 20 69 6e  ach character in
3890: 20 74 68 65 20 69 6e 74 65 67 65 72 2e 0a 2a 2f   the integer..*/
38a0: 0a 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64  .static unsigned
38b0: 20 69 6e 74 20 72 62 75 44 65 6c 74 61 47 65 74   int rbuDeltaGet
38c0: 49 6e 74 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  Int(const char *
38d0: 2a 70 7a 2c 20 69 6e 74 20 2a 70 4c 65 6e 29 7b  *pz, int *pLen){
38e0: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
38f0: 73 69 67 6e 65 64 20 63 68 61 72 20 7a 56 61 6c  signed char zVal
3900: 75 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 2d 31 2c  ue[] = {.    -1,
3910: 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c   -1, -1, -1, -1,
3920: 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 20 20 2d   -1, -1, -1,   -
3930: 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d  1, -1, -1, -1, -
3940: 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 0a 20  1, -1, -1, -1,. 
3950: 20 20 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d     -1, -1, -1, -
3960: 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d  1, -1, -1, -1, -
3970: 31 2c 20 20 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c  1,   -1, -1, -1,
3980: 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c   -1, -1, -1, -1,
3990: 20 2d 31 2c 0a 20 20 20 20 2d 31 2c 20 2d 31 2c   -1,.    -1, -1,
39a0: 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c   -1, -1, -1, -1,
39b0: 20 2d 31 2c 20 2d 31 2c 20 20 20 2d 31 2c 20 2d   -1, -1,   -1, -
39c0: 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d  1, -1, -1, -1, -
39d0: 31 2c 20 2d 31 2c 20 2d 31 2c 0a 20 20 20 20 20  1, -1, -1,.     
39e0: 30 2c 20 20 31 2c 20 20 32 2c 20 20 33 2c 20 20  0,  1,  2,  3,  
39f0: 34 2c 20 20 35 2c 20 20 36 2c 20 20 37 2c 20 20  4,  5,  6,  7,  
3a00: 20 20 38 2c 20 20 39 2c 20 2d 31 2c 20 2d 31 2c    8,  9, -1, -1,
3a10: 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c   -1, -1, -1, -1,
3a20: 0a 20 20 20 20 2d 31 2c 20 31 30 2c 20 31 31 2c  .    -1, 10, 11,
3a30: 20 31 32 2c 20 31 33 2c 20 31 34 2c 20 31 35 2c   12, 13, 14, 15,
3a40: 20 31 36 2c 20 20 20 31 37 2c 20 31 38 2c 20 31   16,   17, 18, 1
3a50: 39 2c 20 32 30 2c 20 32 31 2c 20 32 32 2c 20 32  9, 20, 21, 22, 2
3a60: 33 2c 20 32 34 2c 0a 20 20 20 20 32 35 2c 20 32  3, 24,.    25, 2
3a70: 36 2c 20 32 37 2c 20 32 38 2c 20 32 39 2c 20 33  6, 27, 28, 29, 3
3a80: 30 2c 20 33 31 2c 20 33 32 2c 20 20 20 33 33 2c  0, 31, 32,   33,
3a90: 20 33 34 2c 20 33 35 2c 20 2d 31 2c 20 2d 31 2c   34, 35, -1, -1,
3aa0: 20 2d 31 2c 20 2d 31 2c 20 33 36 2c 0a 20 20 20   -1, -1, 36,.   
3ab0: 20 2d 31 2c 20 33 37 2c 20 33 38 2c 20 33 39 2c   -1, 37, 38, 39,
3ac0: 20 34 30 2c 20 34 31 2c 20 34 32 2c 20 34 33 2c   40, 41, 42, 43,
3ad0: 20 20 20 34 34 2c 20 34 35 2c 20 34 36 2c 20 34     44, 45, 46, 4
3ae0: 37 2c 20 34 38 2c 20 34 39 2c 20 35 30 2c 20 35  7, 48, 49, 50, 5
3af0: 31 2c 0a 20 20 20 20 35 32 2c 20 35 33 2c 20 35  1,.    52, 53, 5
3b00: 34 2c 20 35 35 2c 20 35 36 2c 20 35 37 2c 20 35  4, 55, 56, 57, 5
3b10: 38 2c 20 35 39 2c 20 20 20 36 30 2c 20 36 31 2c  8, 59,   60, 61,
3b20: 20 36 32 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c   62, -1, -1, -1,
3b30: 20 36 33 2c 20 2d 31 2c 0a 20 20 7d 3b 0a 20 20   63, -1,.  };.  
3b40: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 76 20 3d  unsigned int v =
3b50: 20 30 3b 0a 20 20 69 6e 74 20 63 3b 0a 20 20 75   0;.  int c;.  u
3b60: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 20  nsigned char *z 
3b70: 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  = (unsigned char
3b80: 2a 29 2a 70 7a 3b 0a 20 20 75 6e 73 69 67 6e 65  *)*pz;.  unsigne
3b90: 64 20 63 68 61 72 20 2a 7a 53 74 61 72 74 20 3d  d char *zStart =
3ba0: 20 7a 3b 0a 20 20 77 68 69 6c 65 28 20 28 63 20   z;.  while( (c 
3bb0: 3d 20 7a 56 61 6c 75 65 5b 30 78 37 66 26 2a 28  = zValue[0x7f&*(
3bc0: 7a 2b 2b 29 5d 29 3e 3d 30 20 29 7b 0a 20 20 20  z++)])>=0 ){.   
3bd0: 20 20 76 20 3d 20 28 76 3c 3c 36 29 20 2b 20 63    v = (v<<6) + c
3be0: 3b 0a 20 20 7d 0a 20 20 7a 2d 2d 3b 0a 20 20 2a  ;.  }.  z--;.  *
3bf0: 70 4c 65 6e 20 2d 3d 20 7a 20 2d 20 7a 53 74 61  pLen -= z - zSta
3c00: 72 74 3b 0a 20 20 2a 70 7a 20 3d 20 28 63 68 61  rt;.  *pz = (cha
3c10: 72 2a 29 7a 3b 0a 20 20 72 65 74 75 72 6e 20 76  r*)z;.  return v
3c20: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  ;.}../*.** Compu
3c30: 74 65 20 61 20 33 32 2d 62 69 74 20 63 68 65 63  te a 32-bit chec
3c40: 6b 73 75 6d 20 6f 6e 20 74 68 65 20 4e 2d 62 79  ksum on the N-by
3c50: 74 65 20 62 75 66 66 65 72 2e 20 20 52 65 74 75  te buffer.  Retu
3c60: 72 6e 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a  rn the result..*
3c70: 2f 0a 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65  /.static unsigne
3c80: 64 20 69 6e 74 20 72 62 75 44 65 6c 74 61 43 68  d int rbuDeltaCh
3c90: 65 63 6b 73 75 6d 28 63 6f 6e 73 74 20 63 68 61  ecksum(const cha
3ca0: 72 20 2a 7a 49 6e 2c 20 73 69 7a 65 5f 74 20 4e  r *zIn, size_t N
3cb0: 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  ){.  const unsig
3cc0: 6e 65 64 20 63 68 61 72 20 2a 7a 20 3d 20 28 63  ned char *z = (c
3cd0: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
3ce0: 61 72 20 2a 29 7a 49 6e 3b 0a 20 20 75 6e 73 69  ar *)zIn;.  unsi
3cf0: 67 6e 65 64 20 73 75 6d 30 20 3d 20 30 3b 0a 20  gned sum0 = 0;. 
3d00: 20 75 6e 73 69 67 6e 65 64 20 73 75 6d 31 20 3d   unsigned sum1 =
3d10: 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 73   0;.  unsigned s
3d20: 75 6d 32 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67  um2 = 0;.  unsig
3d30: 6e 65 64 20 73 75 6d 33 20 3d 20 30 3b 0a 20 20  ned sum3 = 0;.  
3d40: 77 68 69 6c 65 28 4e 20 3e 3d 20 31 36 29 7b 0a  while(N >= 16){.
3d50: 20 20 20 20 73 75 6d 30 20 2b 3d 20 28 28 75 6e      sum0 += ((un
3d60: 73 69 67 6e 65 64 29 7a 5b 30 5d 20 2b 20 7a 5b  signed)z[0] + z[
3d70: 34 5d 20 2b 20 7a 5b 38 5d 20 2b 20 7a 5b 31 32  4] + z[8] + z[12
3d80: 5d 29 3b 0a 20 20 20 20 73 75 6d 31 20 2b 3d 20  ]);.    sum1 += 
3d90: 28 28 75 6e 73 69 67 6e 65 64 29 7a 5b 31 5d 20  ((unsigned)z[1] 
3da0: 2b 20 7a 5b 35 5d 20 2b 20 7a 5b 39 5d 20 2b 20  + z[5] + z[9] + 
3db0: 7a 5b 31 33 5d 29 3b 0a 20 20 20 20 73 75 6d 32  z[13]);.    sum2
3dc0: 20 2b 3d 20 28 28 75 6e 73 69 67 6e 65 64 29 7a   += ((unsigned)z
3dd0: 5b 32 5d 20 2b 20 7a 5b 36 5d 20 2b 20 7a 5b 31  [2] + z[6] + z[1
3de0: 30 5d 2b 20 7a 5b 31 34 5d 29 3b 0a 20 20 20 20  0]+ z[14]);.    
3df0: 73 75 6d 33 20 2b 3d 20 28 28 75 6e 73 69 67 6e  sum3 += ((unsign
3e00: 65 64 29 7a 5b 33 5d 20 2b 20 7a 5b 37 5d 20 2b  ed)z[3] + z[7] +
3e10: 20 7a 5b 31 31 5d 2b 20 7a 5b 31 35 5d 29 3b 0a   z[11]+ z[15]);.
3e20: 20 20 20 20 7a 20 2b 3d 20 31 36 3b 0a 20 20 20      z += 16;.   
3e30: 20 4e 20 2d 3d 20 31 36 3b 0a 20 20 7d 0a 20 20   N -= 16;.  }.  
3e40: 77 68 69 6c 65 28 4e 20 3e 3d 20 34 29 7b 0a 20  while(N >= 4){. 
3e50: 20 20 20 73 75 6d 30 20 2b 3d 20 7a 5b 30 5d 3b     sum0 += z[0];
3e60: 0a 20 20 20 20 73 75 6d 31 20 2b 3d 20 7a 5b 31  .    sum1 += z[1
3e70: 5d 3b 0a 20 20 20 20 73 75 6d 32 20 2b 3d 20 7a  ];.    sum2 += z
3e80: 5b 32 5d 3b 0a 20 20 20 20 73 75 6d 33 20 2b 3d  [2];.    sum3 +=
3e90: 20 7a 5b 33 5d 3b 0a 20 20 20 20 7a 20 2b 3d 20   z[3];.    z += 
3ea0: 34 3b 0a 20 20 20 20 4e 20 2d 3d 20 34 3b 0a 20  4;.    N -= 4;. 
3eb0: 20 7d 0a 20 20 73 75 6d 33 20 2b 3d 20 28 73 75   }.  sum3 += (su
3ec0: 6d 32 20 3c 3c 20 38 29 20 2b 20 28 73 75 6d 31  m2 << 8) + (sum1
3ed0: 20 3c 3c 20 31 36 29 20 2b 20 28 73 75 6d 30 20   << 16) + (sum0 
3ee0: 3c 3c 20 32 34 29 3b 0a 20 20 73 77 69 74 63 68  << 24);.  switch
3ef0: 28 4e 29 7b 0a 20 20 20 20 63 61 73 65 20 33 3a  (N){.    case 3:
3f00: 20 20 20 73 75 6d 33 20 2b 3d 20 28 7a 5b 32 5d     sum3 += (z[2]
3f10: 20 3c 3c 20 38 29 3b 0a 20 20 20 20 63 61 73 65   << 8);.    case
3f20: 20 32 3a 20 20 20 73 75 6d 33 20 2b 3d 20 28 7a   2:   sum3 += (z
3f30: 5b 31 5d 20 3c 3c 20 31 36 29 3b 0a 20 20 20 20  [1] << 16);.    
3f40: 63 61 73 65 20 31 3a 20 20 20 73 75 6d 33 20 2b  case 1:   sum3 +
3f50: 3d 20 28 7a 5b 30 5d 20 3c 3c 20 32 34 29 3b 0a  = (z[0] << 24);.
3f60: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20 3b 0a      default:  ;.
3f70: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 75 6d    }.  return sum
3f80: 33 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 6c  3;.}../*.** Appl
3f90: 79 20 61 20 64 65 6c 74 61 2e 0a 2a 2a 0a 2a 2a  y a delta..**.**
3fa0: 20 54 68 65 20 6f 75 74 70 75 74 20 62 75 66 66   The output buff
3fb0: 65 72 20 73 68 6f 75 6c 64 20 62 65 20 62 69 67  er should be big
3fc0: 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20   enough to hold 
3fd0: 74 68 65 20 77 68 6f 6c 65 20 6f 75 74 70 75 74  the whole output
3fe0: 0a 2a 2a 20 66 69 6c 65 20 61 6e 64 20 61 20 4e  .** file and a N
3ff0: 55 4c 20 74 65 72 6d 69 6e 61 74 6f 72 20 61 74  UL terminator at
4000: 20 74 68 65 20 65 6e 64 2e 20 20 54 68 65 20 64   the end.  The d
4010: 65 6c 74 61 5f 6f 75 74 70 75 74 5f 73 69 7a 65  elta_output_size
4020: 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69  ().** routine wi
4030: 6c 6c 20 64 65 74 65 72 6d 69 6e 65 20 74 68 69  ll determine thi
4040: 73 20 73 69 7a 65 20 66 6f 72 20 79 6f 75 2e 0a  s size for you..
4050: 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 6c 74 61 20  **.** The delta 
4060: 73 74 72 69 6e 67 20 73 68 6f 75 6c 64 20 62 65  string should be
4070: 20 6e 75 6c 6c 2d 74 65 72 6d 69 6e 61 74 65 64   null-terminated
4080: 2e 20 20 42 75 74 20 74 68 65 20 64 65 6c 74 61  .  But the delta
4090: 20 73 74 72 69 6e 67 0a 2a 2a 20 6d 61 79 20 63   string.** may c
40a0: 6f 6e 74 61 69 6e 20 65 6d 62 65 64 64 65 64 20  ontain embedded 
40b0: 4e 55 4c 20 63 68 61 72 61 63 74 65 72 73 20 28  NUL characters (
40c0: 69 66 20 74 68 65 20 69 6e 70 75 74 20 61 6e 64  if the input and
40d0: 20 6f 75 74 70 75 74 20 61 72 65 0a 2a 2a 20 62   output are.** b
40e0: 69 6e 61 72 79 20 66 69 6c 65 73 29 20 73 6f 20  inary files) so 
40f0: 77 65 20 61 6c 73 6f 20 68 61 76 65 20 74 6f 20  we also have to 
4100: 70 61 73 73 20 69 6e 20 74 68 65 20 6c 65 6e 67  pass in the leng
4110: 74 68 20 6f 66 20 74 68 65 20 64 65 6c 74 61 20  th of the delta 
4120: 69 6e 0a 2a 2a 20 74 68 65 20 6c 65 6e 44 65 6c  in.** the lenDel
4130: 74 61 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a  ta parameter..**
4140: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
4150: 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 73 69  n returns the si
4160: 7a 65 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74  ze of the output
4170: 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 28   file in bytes (
4180: 65 78 63 6c 75 64 69 6e 67 0a 2a 2a 20 74 68 65  excluding.** the
4190: 20 66 69 6e 61 6c 20 4e 55 4c 20 74 65 72 6d 69   final NUL termi
41a0: 6e 61 74 6f 72 20 63 68 61 72 61 63 74 65 72 29  nator character)
41b0: 2e 20 20 45 78 63 65 70 74 2c 20 69 66 20 74 68  .  Except, if th
41c0: 65 20 64 65 6c 74 61 20 73 74 72 69 6e 67 20 69  e delta string i
41d0: 73 0a 2a 2a 20 6d 61 6c 66 6f 72 6d 65 64 20 6f  s.** malformed o
41e0: 72 20 69 6e 74 65 6e 64 65 64 20 66 6f 72 20 75  r intended for u
41f0: 73 65 20 77 69 74 68 20 61 20 73 6f 75 72 63 65  se with a source
4200: 20 66 69 6c 65 20 6f 74 68 65 72 20 74 68 61 6e   file other than
4210: 20 7a 53 72 63 2c 0a 2a 2a 20 74 68 65 6e 20 74   zSrc,.** then t
4220: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
4230: 72 6e 73 20 2d 31 2e 0a 2a 2a 0a 2a 2a 20 52 65  rns -1..**.** Re
4240: 66 65 72 20 74 6f 20 74 68 65 20 64 65 6c 74 61  fer to the delta
4250: 5f 63 72 65 61 74 65 28 29 20 64 6f 63 75 6d 65  _create() docume
4260: 6e 74 61 74 69 6f 6e 20 61 62 6f 76 65 20 66 6f  ntation above fo
4270: 72 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e 0a  r a description.
4280: 2a 2a 20 6f 66 20 74 68 65 20 64 65 6c 74 61 20  ** of the delta 
4290: 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 2a 2f 0a  file format..*/.
42a0: 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 44 65  static int rbuDe
42b0: 6c 74 61 41 70 70 6c 79 28 0a 20 20 63 6f 6e 73  ltaApply(.  cons
42c0: 74 20 63 68 61 72 20 2a 7a 53 72 63 2c 20 20 20  t char *zSrc,   
42d0: 20 20 20 2f 2a 20 54 68 65 20 73 6f 75 72 63 65     /* The source
42e0: 20 6f 72 20 70 61 74 74 65 72 6e 20 66 69 6c 65   or pattern file
42f0: 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 6e 53 72 63   */.  int lenSrc
4300: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
4310: 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 73 6f  Length of the so
4320: 75 72 63 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63  urce file */.  c
4330: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 65 6c 74  onst char *zDelt
4340: 61 2c 20 20 20 20 2f 2a 20 44 65 6c 74 61 20 74  a,    /* Delta t
4350: 6f 20 61 70 70 6c 79 20 74 6f 20 74 68 65 20 70  o apply to the p
4360: 61 74 74 65 72 6e 20 2a 2f 0a 20 20 69 6e 74 20  attern */.  int 
4370: 6c 65 6e 44 65 6c 74 61 2c 20 20 20 20 20 20 20  lenDelta,       
4380: 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20     /* Length of 
4390: 74 68 65 20 64 65 6c 74 61 20 2a 2f 0a 20 20 63  the delta */.  c
43a0: 68 61 72 20 2a 7a 4f 75 74 20 20 20 20 20 20 20  har *zOut       
43b0: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
43c0: 68 65 20 6f 75 74 70 75 74 20 69 6e 74 6f 20 74  he output into t
43d0: 68 69 73 20 70 72 65 61 6c 6c 6f 63 61 74 65 64  his preallocated
43e0: 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b 0a 20 20   buffer */.){.  
43f0: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6c 69 6d  unsigned int lim
4400: 69 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69  it;.  unsigned i
4410: 6e 74 20 74 6f 74 61 6c 20 3d 20 30 3b 0a 23 69  nt total = 0;.#i
4420: 66 6e 64 65 66 20 46 4f 53 53 49 4c 5f 4f 4d 49  fndef FOSSIL_OMI
4430: 54 5f 44 45 4c 54 41 5f 43 4b 53 55 4d 5f 54 45  T_DELTA_CKSUM_TE
4440: 53 54 0a 20 20 63 68 61 72 20 2a 7a 4f 72 69 67  ST.  char *zOrig
4450: 4f 75 74 20 3d 20 7a 4f 75 74 3b 0a 23 65 6e 64  Out = zOut;.#end
4460: 69 66 0a 0a 20 20 6c 69 6d 69 74 20 3d 20 72 62  if..  limit = rb
4470: 75 44 65 6c 74 61 47 65 74 49 6e 74 28 26 7a 44  uDeltaGetInt(&zD
4480: 65 6c 74 61 2c 20 26 6c 65 6e 44 65 6c 74 61 29  elta, &lenDelta)
4490: 3b 0a 20 20 69 66 28 20 2a 7a 44 65 6c 74 61 21  ;.  if( *zDelta!
44a0: 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 2f 2a 20  ='\n' ){.    /* 
44b0: 45 52 52 4f 52 3a 20 73 69 7a 65 20 69 6e 74 65  ERROR: size inte
44c0: 67 65 72 20 6e 6f 74 20 74 65 72 6d 69 6e 61 74  ger not terminat
44d0: 65 64 20 62 79 20 22 5c 6e 22 20 2a 2f 0a 20 20  ed by "\n" */.  
44e0: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d    return -1;.  }
44f0: 0a 20 20 7a 44 65 6c 74 61 2b 2b 3b 20 6c 65 6e  .  zDelta++; len
4500: 44 65 6c 74 61 2d 2d 3b 0a 20 20 77 68 69 6c 65  Delta--;.  while
4510: 28 20 2a 7a 44 65 6c 74 61 20 26 26 20 6c 65 6e  ( *zDelta && len
4520: 44 65 6c 74 61 3e 30 20 29 7b 0a 20 20 20 20 75  Delta>0 ){.    u
4530: 6e 73 69 67 6e 65 64 20 69 6e 74 20 63 6e 74 2c  nsigned int cnt,
4540: 20 6f 66 73 74 3b 0a 20 20 20 20 63 6e 74 20 3d   ofst;.    cnt =
4550: 20 72 62 75 44 65 6c 74 61 47 65 74 49 6e 74 28   rbuDeltaGetInt(
4560: 26 7a 44 65 6c 74 61 2c 20 26 6c 65 6e 44 65 6c  &zDelta, &lenDel
4570: 74 61 29 3b 0a 20 20 20 20 73 77 69 74 63 68 28  ta);.    switch(
4580: 20 7a 44 65 6c 74 61 5b 30 5d 20 29 7b 0a 20 20   zDelta[0] ){.  
4590: 20 20 20 20 63 61 73 65 20 27 40 27 3a 20 7b 0a      case '@': {.
45a0: 20 20 20 20 20 20 20 20 7a 44 65 6c 74 61 2b 2b          zDelta++
45b0: 3b 20 6c 65 6e 44 65 6c 74 61 2d 2d 3b 0a 20 20  ; lenDelta--;.  
45c0: 20 20 20 20 20 20 6f 66 73 74 20 3d 20 72 62 75        ofst = rbu
45d0: 44 65 6c 74 61 47 65 74 49 6e 74 28 26 7a 44 65  DeltaGetInt(&zDe
45e0: 6c 74 61 2c 20 26 6c 65 6e 44 65 6c 74 61 29 3b  lta, &lenDelta);
45f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 65 6e  .        if( len
4600: 44 65 6c 74 61 3e 30 20 26 26 20 7a 44 65 6c 74  Delta>0 && zDelt
4610: 61 5b 30 5d 21 3d 27 2c 27 20 29 7b 0a 20 20 20  a[0]!=',' ){.   
4620: 20 20 20 20 20 20 20 2f 2a 20 45 52 52 4f 52 3a         /* ERROR:
4630: 20 63 6f 70 79 20 63 6f 6d 6d 61 6e 64 20 6e 6f   copy command no
4640: 74 20 74 65 72 6d 69 6e 61 74 65 64 20 62 79 20  t terminated by 
4650: 27 2c 27 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ',' */.         
4660: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
4670: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 44      }.        zD
4680: 65 6c 74 61 2b 2b 3b 20 6c 65 6e 44 65 6c 74 61  elta++; lenDelta
4690: 2d 2d 3b 0a 20 20 20 20 20 20 20 20 74 6f 74 61  --;.        tota
46a0: 6c 20 2b 3d 20 63 6e 74 3b 0a 20 20 20 20 20 20  l += cnt;.      
46b0: 20 20 69 66 28 20 74 6f 74 61 6c 3e 6c 69 6d 69    if( total>limi
46c0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  t ){.          /
46d0: 2a 20 45 52 52 4f 52 3a 20 63 6f 70 79 20 65 78  * ERROR: copy ex
46e0: 63 65 65 64 73 20 6f 75 74 70 75 74 20 66 69 6c  ceeds output fil
46f0: 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 20 20  e size */.      
4700: 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
4710: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
4720: 20 69 66 28 20 6f 66 73 74 2b 63 6e 74 20 3e 20   if( ofst+cnt > 
4730: 6c 65 6e 53 72 63 20 29 7b 0a 20 20 20 20 20 20  lenSrc ){.      
4740: 20 20 20 20 2f 2a 20 45 52 52 4f 52 3a 20 63 6f      /* ERROR: co
4750: 70 79 20 65 78 74 65 6e 64 73 20 70 61 73 74 20  py extends past 
4760: 65 6e 64 20 6f 66 20 69 6e 70 75 74 20 2a 2f 0a  end of input */.
4770: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
4780: 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   -1;.        }. 
4790: 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 4f         memcpy(zO
47a0: 75 74 2c 20 26 7a 53 72 63 5b 6f 66 73 74 5d 2c  ut, &zSrc[ofst],
47b0: 20 63 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 7a   cnt);.        z
47c0: 4f 75 74 20 2b 3d 20 63 6e 74 3b 0a 20 20 20 20  Out += cnt;.    
47d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
47e0: 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 27 3a   }.      case ':
47f0: 27 3a 20 7b 0a 20 20 20 20 20 20 20 20 7a 44 65  ': {.        zDe
4800: 6c 74 61 2b 2b 3b 20 6c 65 6e 44 65 6c 74 61 2d  lta++; lenDelta-
4810: 2d 3b 0a 20 20 20 20 20 20 20 20 74 6f 74 61 6c  -;.        total
4820: 20 2b 3d 20 63 6e 74 3b 0a 20 20 20 20 20 20 20   += cnt;.       
4830: 20 69 66 28 20 74 6f 74 61 6c 3e 6c 69 6d 69 74   if( total>limit
4840: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
4850: 20 45 52 52 4f 52 3a 20 20 69 6e 73 65 72 74 20   ERROR:  insert 
4860: 63 6f 6d 6d 61 6e 64 20 67 69 76 65 73 20 61 6e  command gives an
4870: 20 6f 75 74 70 75 74 20 6c 61 72 67 65 72 20 74   output larger t
4880: 68 61 6e 20 70 72 65 64 69 63 74 65 64 20 2a 2f  han predicted */
4890: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
48a0: 6e 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n -1;.        }.
48b0: 20 20 20 20 20 20 20 20 69 66 28 20 63 6e 74 3e          if( cnt>
48c0: 6c 65 6e 44 65 6c 74 61 20 29 7b 0a 20 20 20 20  lenDelta ){.    
48d0: 20 20 20 20 20 20 2f 2a 20 45 52 52 4f 52 3a 20        /* ERROR: 
48e0: 69 6e 73 65 72 74 20 63 6f 75 6e 74 20 65 78 63  insert count exc
48f0: 65 65 64 73 20 73 69 7a 65 20 6f 66 20 64 65 6c  eeds size of del
4900: 74 61 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ta */.          
4910: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20  return -1;.     
4920: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6d 65 6d     }.        mem
4930: 63 70 79 28 7a 4f 75 74 2c 20 7a 44 65 6c 74 61  cpy(zOut, zDelta
4940: 2c 20 63 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  , cnt);.        
4950: 7a 4f 75 74 20 2b 3d 20 63 6e 74 3b 0a 20 20 20  zOut += cnt;.   
4960: 20 20 20 20 20 7a 44 65 6c 74 61 20 2b 3d 20 63       zDelta += c
4970: 6e 74 3b 0a 20 20 20 20 20 20 20 20 6c 65 6e 44  nt;.        lenD
4980: 65 6c 74 61 20 2d 3d 20 63 6e 74 3b 0a 20 20 20  elta -= cnt;.   
4990: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
49a0: 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 27    }.      case '
49b0: 3b 27 3a 20 7b 0a 20 20 20 20 20 20 20 20 7a 44  ;': {.        zD
49c0: 65 6c 74 61 2b 2b 3b 20 6c 65 6e 44 65 6c 74 61  elta++; lenDelta
49d0: 2d 2d 3b 0a 20 20 20 20 20 20 20 20 7a 4f 75 74  --;.        zOut
49e0: 5b 30 5d 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66  [0] = 0;.#ifndef
49f0: 20 46 4f 53 53 49 4c 5f 4f 4d 49 54 5f 44 45 4c   FOSSIL_OMIT_DEL
4a00: 54 41 5f 43 4b 53 55 4d 5f 54 45 53 54 0a 20 20  TA_CKSUM_TEST.  
4a10: 20 20 20 20 20 20 69 66 28 20 63 6e 74 21 3d 72        if( cnt!=r
4a20: 62 75 44 65 6c 74 61 43 68 65 63 6b 73 75 6d 28  buDeltaChecksum(
4a30: 7a 4f 72 69 67 4f 75 74 2c 20 74 6f 74 61 6c 29  zOrigOut, total)
4a40: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
4a50: 20 45 52 52 4f 52 3a 20 20 62 61 64 20 63 68 65   ERROR:  bad che
4a60: 63 6b 73 75 6d 20 2a 2f 0a 20 20 20 20 20 20 20  cksum */.       
4a70: 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
4a80: 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
4a90: 20 20 20 20 20 20 20 69 66 28 20 74 6f 74 61 6c         if( total
4aa0: 21 3d 6c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20  !=limit ){.     
4ab0: 20 20 20 20 20 2f 2a 20 45 52 52 4f 52 3a 20 67       /* ERROR: g
4ac0: 65 6e 65 72 61 74 65 64 20 73 69 7a 65 20 64 6f  enerated size do
4ad0: 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 70 72 65  es not match pre
4ae0: 64 69 63 74 65 64 20 73 69 7a 65 20 2a 2f 0a 20  dicted size */. 
4af0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
4b00: 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  -1;.        }.  
4b10: 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 6f 74        return tot
4b20: 61 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  al;.      }.    
4b30: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
4b40: 20 20 20 20 20 2f 2a 20 45 52 52 4f 52 3a 20 75       /* ERROR: u
4b50: 6e 6b 6e 6f 77 6e 20 64 65 6c 74 61 20 6f 70 65  nknown delta ope
4b60: 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20  rator */.       
4b70: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
4b80: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
4b90: 2f 2a 20 45 52 52 4f 52 3a 20 75 6e 74 65 72 6d  /* ERROR: unterm
4ba0: 69 6e 61 74 65 64 20 64 65 6c 74 61 20 2a 2f 0a  inated delta */.
4bb0: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a    return -1;.}..
4bc0: 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 44 65  static int rbuDe
4bd0: 6c 74 61 4f 75 74 70 75 74 53 69 7a 65 28 63 6f  ltaOutputSize(co
4be0: 6e 73 74 20 63 68 61 72 20 2a 7a 44 65 6c 74 61  nst char *zDelta
4bf0: 2c 20 69 6e 74 20 6c 65 6e 44 65 6c 74 61 29 7b  , int lenDelta){
4c00: 0a 20 20 69 6e 74 20 73 69 7a 65 3b 0a 20 20 73  .  int size;.  s
4c10: 69 7a 65 20 3d 20 72 62 75 44 65 6c 74 61 47 65  ize = rbuDeltaGe
4c20: 74 49 6e 74 28 26 7a 44 65 6c 74 61 2c 20 26 6c  tInt(&zDelta, &l
4c30: 65 6e 44 65 6c 74 61 29 3b 0a 20 20 69 66 28 20  enDelta);.  if( 
4c40: 2a 7a 44 65 6c 74 61 21 3d 27 5c 6e 27 20 29 7b  *zDelta!='\n' ){
4c50: 0a 20 20 20 20 2f 2a 20 45 52 52 4f 52 3a 20 73  .    /* ERROR: s
4c60: 69 7a 65 20 69 6e 74 65 67 65 72 20 6e 6f 74 20  ize integer not 
4c70: 74 65 72 6d 69 6e 61 74 65 64 20 62 79 20 22 5c  terminated by "\
4c80: 6e 22 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  n" */.    return
4c90: 20 2d 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   -1;.  }.  retur
4ca0: 6e 20 73 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n size;.}../*.**
4cb0: 20 45 6e 64 20 6f 66 20 63 6f 64 65 20 74 61 6b   End of code tak
4cc0: 65 6e 20 66 72 6f 6d 20 66 6f 73 73 69 6c 2e 0a  en from fossil..
4cd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4ce0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4cf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4d00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4d10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a  *********/../*.*
4d20: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
4d30: 20 6f 66 20 53 51 4c 20 73 63 61 6c 61 72 20 66   of SQL scalar f
4d40: 75 6e 63 74 69 6f 6e 20 72 62 75 5f 66 6f 73 73  unction rbu_foss
4d50: 69 6c 5f 64 65 6c 74 61 28 29 2e 0a 2a 2a 0a 2a  il_delta()..**.*
4d60: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
4d70: 61 70 70 6c 69 65 73 20 61 20 66 6f 73 73 69 6c  applies a fossil
4d80: 20 64 65 6c 74 61 20 70 61 74 63 68 20 74 6f 20   delta patch to 
4d90: 61 20 62 6c 6f 62 2e 20 45 78 61 63 74 6c 79 20  a blob. Exactly 
4da0: 74 77 6f 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73  two.** arguments
4db0: 20 6d 75 73 74 20 62 65 20 70 61 73 73 65 64 20   must be passed 
4dc0: 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
4dd0: 2e 20 54 68 65 20 66 69 72 73 74 20 69 73 20 74  . The first is t
4de0: 68 65 20 62 6c 6f 62 20 74 6f 0a 2a 2a 20 70 61  he blob to.** pa
4df0: 74 63 68 20 61 6e 64 20 74 68 65 20 73 65 63 6f  tch and the seco
4e00: 6e 64 20 74 68 65 20 70 61 74 63 68 20 74 6f 20  nd the patch to 
4e10: 61 70 70 6c 79 2e 20 49 66 20 6e 6f 20 65 72 72  apply. If no err
4e20: 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 69 73 0a  or occurs, this.
4e30: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  ** function retu
4e40: 72 6e 73 20 74 68 65 20 70 61 74 63 68 65 64 20  rns the patched 
4e50: 62 6c 6f 62 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  blob..*/.static 
4e60: 76 6f 69 64 20 72 62 75 46 6f 73 73 69 6c 44 65  void rbuFossilDe
4e70: 6c 74 61 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  ltaFunc(.  sqlit
4e80: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
4e90: 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  ext,.  int argc,
4ea0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
4eb0: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63 6f 6e   **argv.){.  con
4ec0: 73 74 20 63 68 61 72 20 2a 61 44 65 6c 74 61 3b  st char *aDelta;
4ed0: 0a 20 20 69 6e 74 20 6e 44 65 6c 74 61 3b 0a 20  .  int nDelta;. 
4ee0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 4f 72   const char *aOr
4ef0: 69 67 3b 0a 20 20 69 6e 74 20 6e 4f 72 69 67 3b  ig;.  int nOrig;
4f00: 0a 0a 20 20 69 6e 74 20 6e 4f 75 74 3b 0a 20 20  ..  int nOut;.  
4f10: 69 6e 74 20 6e 4f 75 74 32 3b 0a 20 20 63 68 61  int nOut2;.  cha
4f20: 72 20 2a 61 4f 75 74 3b 0a 0a 20 20 61 73 73 65  r *aOut;..  asse
4f30: 72 74 28 20 61 72 67 63 3d 3d 32 20 29 3b 0a 0a  rt( argc==2 );..
4f40: 20 20 6e 4f 72 69 67 20 3d 20 73 71 6c 69 74 65    nOrig = sqlite
4f50: 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72  3_value_bytes(ar
4f60: 67 76 5b 30 5d 29 3b 0a 20 20 61 4f 72 69 67 20  gv[0]);.  aOrig 
4f70: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
4f80: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f  qlite3_value_blo
4f90: 62 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 6e 44  b(argv[0]);.  nD
4fa0: 65 6c 74 61 20 3d 20 73 71 6c 69 74 65 33 5f 76  elta = sqlite3_v
4fb0: 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b  alue_bytes(argv[
4fc0: 31 5d 29 3b 0a 20 20 61 44 65 6c 74 61 20 3d 20  1]);.  aDelta = 
4fd0: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
4fe0: 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28  ite3_value_blob(
4ff0: 61 72 67 76 5b 31 5d 29 3b 0a 0a 20 20 2f 2a 20  argv[1]);..  /* 
5000: 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 73  Figure out the s
5010: 69 7a 65 20 6f 66 20 74 68 65 20 6f 75 74 70 75  ize of the outpu
5020: 74 20 2a 2f 0a 20 20 6e 4f 75 74 20 3d 20 72 62  t */.  nOut = rb
5030: 75 44 65 6c 74 61 4f 75 74 70 75 74 53 69 7a 65  uDeltaOutputSize
5040: 28 61 44 65 6c 74 61 2c 20 6e 44 65 6c 74 61 29  (aDelta, nDelta)
5050: 3b 0a 20 20 69 66 28 20 6e 4f 75 74 3c 30 20 29  ;.  if( nOut<0 )
5060: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
5070: 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65  sult_error(conte
5080: 78 74 2c 20 22 63 6f 72 72 75 70 74 20 66 6f 73  xt, "corrupt fos
5090: 73 69 6c 20 64 65 6c 74 61 22 2c 20 2d 31 29 3b  sil delta", -1);
50a0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
50b0: 0a 0a 20 20 61 4f 75 74 20 3d 20 73 71 6c 69 74  ..  aOut = sqlit
50c0: 65 33 5f 6d 61 6c 6c 6f 63 28 6e 4f 75 74 2b 31  e3_malloc(nOut+1
50d0: 29 3b 0a 20 20 69 66 28 20 61 4f 75 74 3d 3d 30  );.  if( aOut==0
50e0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
50f0: 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d  result_error_nom
5100: 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 7d  em(context);.  }
5110: 65 6c 73 65 7b 0a 20 20 20 20 6e 4f 75 74 32 20  else{.    nOut2 
5120: 3d 20 72 62 75 44 65 6c 74 61 41 70 70 6c 79 28  = rbuDeltaApply(
5130: 61 4f 72 69 67 2c 20 6e 4f 72 69 67 2c 20 61 44  aOrig, nOrig, aD
5140: 65 6c 74 61 2c 20 6e 44 65 6c 74 61 2c 20 61 4f  elta, nDelta, aO
5150: 75 74 29 3b 0a 20 20 20 20 69 66 28 20 6e 4f 75  ut);.    if( nOu
5160: 74 32 21 3d 6e 4f 75 74 20 29 7b 0a 20 20 20 20  t2!=nOut ){.    
5170: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
5180: 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20  _error(context, 
5190: 22 63 6f 72 72 75 70 74 20 66 6f 73 73 69 6c 20  "corrupt fossil 
51a0: 64 65 6c 74 61 22 2c 20 2d 31 29 3b 0a 20 20 20  delta", -1);.   
51b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
51c0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f  lite3_result_blo
51d0: 62 28 63 6f 6e 74 65 78 74 2c 20 61 4f 75 74 2c  b(context, aOut,
51e0: 20 6e 4f 75 74 2c 20 73 71 6c 69 74 65 33 5f 66   nOut, sqlite3_f
51f0: 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ree);.    }.  }.
5200: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72  }.../*.** Prepar
5210: 65 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  e the SQL statem
5220: 65 6e 74 20 69 6e 20 62 75 66 66 65 72 20 7a 53  ent in buffer zS
5230: 71 6c 20 61 67 61 69 6e 73 74 20 64 61 74 61 62  ql against datab
5240: 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a  ase handle db..*
5250: 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
5260: 20 73 65 74 20 2a 70 70 53 74 6d 74 20 74 6f 20   set *ppStmt to 
5270: 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77  point to the new
5280: 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 72   statement and r
5290: 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f  eturn.** SQLITE_
52a0: 4f 4b 2e 20 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  OK. .**.** Other
52b0: 77 69 73 65 2c 20 69 66 20 61 6e 20 65 72 72 6f  wise, if an erro
52c0: 72 20 64 6f 65 73 20 6f 63 63 75 72 2c 20 73 65  r does occur, se
52d0: 74 20 2a 70 70 53 74 6d 74 20 74 6f 20 4e 55 4c  t *ppStmt to NUL
52e0: 4c 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20  L and return.** 
52f0: 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
5300: 63 6f 64 65 2e 20 41 64 64 69 74 69 6f 6e 61 6c  code. Additional
5310: 6c 79 2c 20 73 65 74 20 6f 75 74 70 75 74 20 76  ly, set output v
5320: 61 72 69 61 62 6c 65 20 2a 70 7a 45 72 72 6d 73  ariable *pzErrms
5330: 67 20 74 6f 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f  g to.** point to
5340: 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69   a buffer contai
5350: 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 6d 65  ning an error me
5360: 73 73 61 67 65 2e 20 49 74 20 69 73 20 74 68 65  ssage. It is the
5370: 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 0a   responsibility.
5380: 2a 2a 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72  ** of the caller
5390: 20 74 6f 20 28 65 76 65 6e 74 75 61 6c 6c 79 29   to (eventually)
53a0: 20 66 72 65 65 20 74 68 69 73 20 62 75 66 66 65   free this buffe
53b0: 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f  r using sqlite3_
53c0: 66 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  free()..*/.stati
53d0: 63 20 69 6e 74 20 70 72 65 70 61 72 65 41 6e 64  c int prepareAnd
53e0: 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 0a 20 20  CollectError(.  
53f0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20  sqlite3 *db, .  
5400: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70  sqlite3_stmt **p
5410: 70 53 74 6d 74 2c 0a 20 20 63 68 61 72 20 2a 2a  pStmt,.  char **
5420: 70 7a 45 72 72 6d 73 67 2c 0a 20 20 63 6f 6e 73  pzErrmsg,.  cons
5430: 74 20 63 68 61 72 20 2a 7a 53 71 6c 0a 29 7b 0a  t char *zSql.){.
5440: 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
5450: 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62  e3_prepare_v2(db
5460: 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 70 70 53 74  , zSql, -1, ppSt
5470: 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  mt, 0);.  if( rc
5480: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
5490: 20 20 20 2a 70 7a 45 72 72 6d 73 67 20 3d 20 73     *pzErrmsg = s
54a0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
54b0: 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  %s", sqlite3_err
54c0: 6d 73 67 28 64 62 29 29 3b 0a 20 20 20 20 2a 70  msg(db));.    *p
54d0: 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20  pStmt = 0;.  }. 
54e0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
54f0: 2a 0a 2a 2a 20 52 65 73 65 74 20 74 68 65 20 53  *.** Reset the S
5500: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73  QL statement pas
5510: 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
5520: 20 61 72 67 75 6d 65 6e 74 2e 20 52 65 74 75 72   argument. Retur
5530: 6e 20 61 20 63 6f 70 79 0a 2a 2a 20 6f 66 20 74  n a copy.** of t
5540: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
5550: 64 20 62 79 20 73 71 6c 69 74 65 33 5f 72 65 73  d by sqlite3_res
5560: 65 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  et()..**.** If a
5570: 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75  n error has occu
5580: 72 72 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a  rred, then set *
5590: 70 7a 45 72 72 6d 73 67 20 74 6f 20 70 6f 69 6e  pzErrmsg to poin
55a0: 74 20 74 6f 20 61 20 62 75 66 66 65 72 0a 2a 2a  t to a buffer.**
55b0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6e 20 65   containing an e
55c0: 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 20 49 74  rror message. It
55d0: 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
55e0: 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
55f0: 6c 6c 65 72 0a 2a 2a 20 74 6f 20 65 76 65 6e 74  ller.** to event
5600: 75 61 6c 6c 79 20 66 72 65 65 20 74 68 69 73 20  ually free this 
5610: 62 75 66 66 65 72 20 75 73 69 6e 67 20 73 71 6c  buffer using sql
5620: 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a  ite3_free()..*/.
5630: 73 74 61 74 69 63 20 69 6e 74 20 72 65 73 65 74  static int reset
5640: 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28  AndCollectError(
5650: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
5660: 74 6d 74 2c 20 63 68 61 72 20 2a 2a 70 7a 45 72  tmt, char **pzEr
5670: 72 6d 73 67 29 7b 0a 20 20 69 6e 74 20 72 63 20  rmsg){.  int rc 
5680: 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
5690: 70 53 74 6d 74 29 3b 0a 20 20 69 66 28 20 72 63  pStmt);.  if( rc
56a0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
56b0: 20 20 20 2a 70 7a 45 72 72 6d 73 67 20 3d 20 73     *pzErrmsg = s
56c0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
56d0: 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  %s", sqlite3_err
56e0: 6d 73 67 28 73 71 6c 69 74 65 33 5f 64 62 5f 68  msg(sqlite3_db_h
56f0: 61 6e 64 6c 65 28 70 53 74 6d 74 29 29 29 3b 0a  andle(pStmt)));.
5700: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
5710: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73  .}../*.** Unless
5720: 20 69 74 20 69 73 20 4e 55 4c 4c 2c 20 61 72 67   it is NULL, arg
5730: 75 6d 65 6e 74 20 7a 53 71 6c 20 70 6f 69 6e 74  ument zSql point
5740: 73 20 74 6f 20 61 20 62 75 66 66 65 72 20 61 6c  s to a buffer al
5750: 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 0a 2a 2a  located using.**
5760: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 20   sqlite3_malloc 
5770: 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6e 20 53 51  containing an SQ
5780: 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69  L statement. Thi
5790: 73 20 66 75 6e 63 74 69 6f 6e 20 70 72 65 70 61  s function prepa
57a0: 72 65 73 20 74 68 65 20 53 51 4c 0a 2a 2a 20 73  res the SQL.** s
57b0: 74 61 74 65 6d 65 6e 74 20 61 67 61 69 6e 73 74  tatement against
57c0: 20 64 61 74 61 62 61 73 65 20 64 62 20 61 6e 64   database db and
57d0: 20 66 72 65 65 73 20 74 68 65 20 62 75 66 66 65   frees the buffe
57e0: 72 2e 20 49 66 20 73 74 61 74 65 6d 65 6e 74 20  r. If statement 
57f0: 0a 2a 2a 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 20  .** compilation 
5800: 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 2a  is successful, *
5810: 70 70 53 74 6d 74 20 69 73 20 73 65 74 20 74 6f  ppStmt is set to
5820: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65   point to the ne
5830: 77 20 73 74 61 74 65 6d 65 6e 74 20 0a 2a 2a 20  w statement .** 
5840: 68 61 6e 64 6c 65 20 61 6e 64 20 53 51 4c 49 54  handle and SQLIT
5850: 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
5860: 2e 20 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  . .**.** Otherwi
5870: 73 65 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20  se, if an error 
5880: 6f 63 63 75 72 73 2c 20 2a 70 70 53 74 6d 74 20  occurs, *ppStmt 
5890: 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61  is set to NULL a
58a0: 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  nd an error code
58b0: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20 49 6e  .** returned. In
58c0: 20 74 68 69 73 20 63 61 73 65 2c 20 2a 70 7a 45   this case, *pzE
58d0: 72 72 6d 73 67 20 6d 61 79 20 61 6c 73 6f 20 62  rrmsg may also b
58e0: 65 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  e set to point t
58f0: 6f 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 6d 65  o an error.** me
5900: 73 73 61 67 65 2e 20 49 74 20 69 73 20 74 68 65  ssage. It is the
5910: 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
5920: 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  of the caller to
5930: 20 66 72 65 65 20 74 68 69 73 20 65 72 72 6f 72   free this error
5940: 20 6d 65 73 73 61 67 65 0a 2a 2a 20 62 75 66 66   message.** buff
5950: 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  er using sqlite3
5960: 5f 66 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49  _free()..**.** I
5970: 66 20 61 72 67 75 6d 65 6e 74 20 7a 53 71 6c 20  f argument zSql 
5980: 69 73 20 4e 55 4c 4c 2c 20 74 68 69 73 20 66 75  is NULL, this fu
5990: 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74  nction assumes t
59a0: 68 61 74 20 61 6e 20 4f 4f 4d 20 68 61 73 20 6f  hat an OOM has o
59b0: 63 63 75 72 72 65 64 2e 0a 2a 2a 20 49 6e 20 74  ccurred..** In t
59c0: 68 69 73 20 63 61 73 65 20 53 51 4c 49 54 45 5f  his case SQLITE_
59d0: 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65  NOMEM is returne
59e0: 64 20 61 6e 64 20 2a 70 70 53 74 6d 74 20 73 65  d and *ppStmt se
59f0: 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74  t to NULL..*/.st
5a00: 61 74 69 63 20 69 6e 74 20 70 72 65 70 61 72 65  atic int prepare
5a10: 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72  FreeAndCollectEr
5a20: 72 6f 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ror(.  sqlite3 *
5a30: 64 62 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 73  db, .  sqlite3_s
5a40: 74 6d 74 20 2a 2a 70 70 53 74 6d 74 2c 0a 20 20  tmt **ppStmt,.  
5a50: 63 68 61 72 20 2a 2a 70 7a 45 72 72 6d 73 67 2c  char **pzErrmsg,
5a60: 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 0a 29 7b  .  char *zSql.){
5a70: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73  .  int rc;.  ass
5a80: 65 72 74 28 20 2a 70 7a 45 72 72 6d 73 67 3d 3d  ert( *pzErrmsg==
5a90: 30 20 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d  0 );.  if( zSql=
5aa0: 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  =0 ){.    rc = S
5ab0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
5ac0: 20 2a 70 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20   *ppStmt = 0;.  
5ad0: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
5ae0: 70 72 65 70 61 72 65 41 6e 64 43 6f 6c 6c 65 63  prepareAndCollec
5af0: 74 45 72 72 6f 72 28 64 62 2c 20 70 70 53 74 6d  tError(db, ppStm
5b00: 74 2c 20 70 7a 45 72 72 6d 73 67 2c 20 7a 53 71  t, pzErrmsg, zSq
5b10: 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  l);.    sqlite3_
5b20: 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 7d 0a  free(zSql);.  }.
5b30: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
5b40: 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 52  /*.** Free the R
5b50: 62 75 4f 62 6a 49 74 65 72 2e 61 7a 54 62 6c 43  buObjIter.azTblC
5b60: 6f 6c 5b 5d 20 61 6e 64 20 52 62 75 4f 62 6a 49  ol[] and RbuObjI
5b70: 74 65 72 2e 61 62 54 62 6c 50 6b 5b 5d 20 61 72  ter.abTblPk[] ar
5b80: 72 61 79 73 20 61 6c 6c 6f 63 61 74 65 64 0a 2a  rays allocated.*
5b90: 2a 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20  * by an earlier 
5ba0: 63 61 6c 6c 20 74 6f 20 72 62 75 4f 62 6a 49 74  call to rbuObjIt
5bb0: 65 72 43 61 63 68 65 54 61 62 6c 65 49 6e 66 6f  erCacheTableInfo
5bc0: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ()..*/.static vo
5bd0: 69 64 20 72 62 75 4f 62 6a 49 74 65 72 46 72 65  id rbuObjIterFre
5be0: 65 43 6f 6c 73 28 52 62 75 4f 62 6a 49 74 65 72  eCols(RbuObjIter
5bf0: 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e 74 20   *pIter){.  int 
5c00: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
5c10: 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 3b 20  pIter->nTblCol; 
5c20: 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
5c30: 33 5f 66 72 65 65 28 70 49 74 65 72 2d 3e 61 7a  3_free(pIter->az
5c40: 54 62 6c 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20  TblCol[i]);.    
5c50: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 74  sqlite3_free(pIt
5c60: 65 72 2d 3e 61 7a 54 62 6c 54 79 70 65 5b 69 5d  er->azTblType[i]
5c70: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
5c80: 5f 66 72 65 65 28 70 49 74 65 72 2d 3e 61 7a 54  _free(pIter->azT
5c90: 62 6c 43 6f 6c 29 3b 0a 20 20 70 49 74 65 72 2d  blCol);.  pIter-
5ca0: 3e 61 7a 54 62 6c 43 6f 6c 20 3d 20 30 3b 0a 20  >azTblCol = 0;. 
5cb0: 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 54 79 70   pIter->azTblTyp
5cc0: 65 20 3d 20 30 3b 0a 20 20 70 49 74 65 72 2d 3e  e = 0;.  pIter->
5cd0: 61 69 53 72 63 4f 72 64 65 72 20 3d 20 30 3b 0a  aiSrcOrder = 0;.
5ce0: 20 20 70 49 74 65 72 2d 3e 61 62 54 62 6c 50 6b    pIter->abTblPk
5cf0: 20 3d 20 30 3b 0a 20 20 70 49 74 65 72 2d 3e 61   = 0;.  pIter->a
5d00: 62 4e 6f 74 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20  bNotNull = 0;.  
5d10: 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 20 3d  pIter->nTblCol =
5d20: 20 30 3b 0a 20 20 70 49 74 65 72 2d 3e 65 54 79   0;.  pIter->eTy
5d30: 70 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  pe = 0;         
5d40: 20 20 20 20 20 20 2f 2a 20 49 6e 76 61 6c 69 64        /* Invalid
5d50: 20 76 61 6c 75 65 20 2a 2f 0a 7d 0a 0a 2f 2a 0a   value */.}../*.
5d60: 2a 2a 20 46 69 6e 61 6c 69 7a 65 20 61 6c 6c 20  ** Finalize all 
5d70: 73 74 61 74 65 6d 65 6e 74 73 20 61 6e 64 20 66  statements and f
5d80: 72 65 65 20 61 6c 6c 20 61 6c 6c 6f 63 61 74 69  ree all allocati
5d90: 6f 6e 73 20 74 68 61 74 20 61 72 65 20 73 70 65  ons that are spe
5da0: 63 69 66 69 63 20 74 6f 0a 2a 2a 20 74 68 65 20  cific to.** the 
5db0: 63 75 72 72 65 6e 74 20 6f 62 6a 65 63 74 20 28  current object (
5dc0: 74 61 62 6c 65 2f 69 6e 64 65 78 20 70 61 69 72  table/index pair
5dd0: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
5de0: 64 20 72 62 75 4f 62 6a 49 74 65 72 43 6c 65 61  d rbuObjIterClea
5df0: 72 53 74 61 74 65 6d 65 6e 74 73 28 52 62 75 4f  rStatements(RbuO
5e00: 62 6a 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  bjIter *pIter){.
5e10: 20 20 52 62 75 55 70 64 61 74 65 53 74 6d 74 20    RbuUpdateStmt 
5e20: 2a 70 55 70 3b 0a 0a 20 20 73 71 6c 69 74 65 33  *pUp;..  sqlite3
5e30: 5f 66 69 6e 61 6c 69 7a 65 28 70 49 74 65 72 2d  _finalize(pIter-
5e40: 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c  >pSelect);.  sql
5e50: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 49  ite3_finalize(pI
5e60: 74 65 72 2d 3e 70 49 6e 73 65 72 74 29 3b 0a 20  ter->pInsert);. 
5e70: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
5e80: 65 28 70 49 74 65 72 2d 3e 70 44 65 6c 65 74 65  e(pIter->pDelete
5e90: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  );.  sqlite3_fin
5ea0: 61 6c 69 7a 65 28 70 49 74 65 72 2d 3e 70 54 6d  alize(pIter->pTm
5eb0: 70 49 6e 73 65 72 74 29 3b 0a 20 20 70 55 70 20  pInsert);.  pUp 
5ec0: 3d 20 70 49 74 65 72 2d 3e 70 52 62 75 55 70 64  = pIter->pRbuUpd
5ed0: 61 74 65 3b 0a 20 20 77 68 69 6c 65 28 20 70 55  ate;.  while( pU
5ee0: 70 20 29 7b 0a 20 20 20 20 52 62 75 55 70 64 61  p ){.    RbuUpda
5ef0: 74 65 53 74 6d 74 20 2a 70 54 6d 70 20 3d 20 70  teStmt *pTmp = p
5f00: 55 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 73  Up->pNext;.    s
5f10: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
5f20: 70 55 70 2d 3e 70 55 70 64 61 74 65 29 3b 0a 20  pUp->pUpdate);. 
5f30: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
5f40: 70 55 70 29 3b 0a 20 20 20 20 70 55 70 20 3d 20  pUp);.    pUp = 
5f50: 70 54 6d 70 3b 0a 20 20 7d 0a 20 20 0a 20 20 70  pTmp;.  }.  .  p
5f60: 49 74 65 72 2d 3e 70 53 65 6c 65 63 74 20 3d 20  Iter->pSelect = 
5f70: 30 3b 0a 20 20 70 49 74 65 72 2d 3e 70 49 6e 73  0;.  pIter->pIns
5f80: 65 72 74 20 3d 20 30 3b 0a 20 20 70 49 74 65 72  ert = 0;.  pIter
5f90: 2d 3e 70 44 65 6c 65 74 65 20 3d 20 30 3b 0a 20  ->pDelete = 0;. 
5fa0: 20 70 49 74 65 72 2d 3e 70 52 62 75 55 70 64 61   pIter->pRbuUpda
5fb0: 74 65 20 3d 20 30 3b 0a 20 20 70 49 74 65 72 2d  te = 0;.  pIter-
5fc0: 3e 70 54 6d 70 49 6e 73 65 72 74 20 3d 20 30 3b  >pTmpInsert = 0;
5fd0: 0a 20 20 70 49 74 65 72 2d 3e 6e 43 6f 6c 20 3d  .  pIter->nCol =
5fe0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65   0;.}../*.** Cle
5ff0: 61 6e 20 75 70 20 61 6e 79 20 72 65 73 6f 75 72  an up any resour
6000: 63 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 73  ces allocated as
6010: 20 70 61 72 74 20 6f 66 20 74 68 65 20 69 74 65   part of the ite
6020: 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 70 61 73  rator object pas
6030: 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 6f 6e  sed.** as the on
6040: 6c 79 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  ly argument..*/.
6050: 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75 4f  static void rbuO
6060: 62 6a 49 74 65 72 46 69 6e 61 6c 69 7a 65 28 52  bjIterFinalize(R
6070: 62 75 4f 62 6a 49 74 65 72 20 2a 70 49 74 65 72  buObjIter *pIter
6080: 29 7b 0a 20 20 72 62 75 4f 62 6a 49 74 65 72 43  ){.  rbuObjIterC
6090: 6c 65 61 72 53 74 61 74 65 6d 65 6e 74 73 28 70  learStatements(p
60a0: 49 74 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  Iter);.  sqlite3
60b0: 5f 66 69 6e 61 6c 69 7a 65 28 70 49 74 65 72 2d  _finalize(pIter-
60c0: 3e 70 54 62 6c 49 74 65 72 29 3b 0a 20 20 73 71  >pTblIter);.  sq
60d0: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
60e0: 49 74 65 72 2d 3e 70 49 64 78 49 74 65 72 29 3b  Iter->pIdxIter);
60f0: 0a 20 20 72 62 75 4f 62 6a 49 74 65 72 46 72 65  .  rbuObjIterFre
6100: 65 43 6f 6c 73 28 70 49 74 65 72 29 3b 0a 20 20  eCols(pIter);.  
6110: 6d 65 6d 73 65 74 28 70 49 74 65 72 2c 20 30 2c  memset(pIter, 0,
6120: 20 73 69 7a 65 6f 66 28 52 62 75 4f 62 6a 49 74   sizeof(RbuObjIt
6130: 65 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  er));.}../*.** A
6140: 64 76 61 6e 63 65 20 74 68 65 20 69 74 65 72 61  dvance the itera
6150: 74 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20  tor to the next 
6160: 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  position..**.** 
6170: 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  If no error occu
6180: 72 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  rs, SQLITE_OK is
6190: 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68   returned and th
61a0: 65 20 69 74 65 72 61 74 6f 72 20 69 73 20 6c 65  e iterator is le
61b0: 66 74 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20  ft .** pointing 
61c0: 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72  to the next entr
61d0: 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e  y. Otherwise, an
61e0: 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20   error code and 
61f0: 6d 65 73 73 61 67 65 20 69 73 20 0a 2a 2a 20 6c  message is .** l
6200: 65 66 74 20 69 6e 20 74 68 65 20 52 42 55 20 68  eft in the RBU h
6210: 61 6e 64 6c 65 20 70 61 73 73 65 64 20 61 73 20  andle passed as 
6220: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
6230: 6e 74 2e 20 41 20 63 6f 70 79 20 6f 66 20 74 68  nt. A copy of th
6240: 65 20 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65  e .** error code
6250: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
6260: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 4f  .static int rbuO
6270: 62 6a 49 74 65 72 4e 65 78 74 28 73 71 6c 69 74  bjIterNext(sqlit
6280: 65 33 72 62 75 20 2a 70 2c 20 52 62 75 4f 62 6a  e3rbu *p, RbuObj
6290: 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
62a0: 69 6e 74 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a  int rc = p->rc;.
62b0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
62c0: 5f 4f 4b 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 46  _OK ){..    /* F
62d0: 72 65 65 20 61 6e 79 20 53 51 4c 69 74 65 20 73  ree any SQLite s
62e0: 74 61 74 65 6d 65 6e 74 73 20 75 73 65 64 20 77  tatements used w
62f0: 68 69 6c 65 20 70 72 6f 63 65 73 73 69 6e 67 20  hile processing 
6300: 74 68 65 20 70 72 65 76 69 6f 75 73 20 6f 62 6a  the previous obj
6310: 65 63 74 20 2a 2f 20 0a 20 20 20 20 72 62 75 4f  ect */ .    rbuO
6320: 62 6a 49 74 65 72 43 6c 65 61 72 53 74 61 74 65  bjIterClearState
6330: 6d 65 6e 74 73 28 70 49 74 65 72 29 3b 0a 20 20  ments(pIter);.  
6340: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 7a 49 64    if( pIter->zId
6350: 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  x==0 ){.      rc
6360: 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28   = sqlite3_exec(
6370: 70 2d 3e 64 62 4d 61 69 6e 2c 0a 20 20 20 20 20  p->dbMain,.     
6380: 20 20 20 20 20 22 44 52 4f 50 20 54 52 49 47 47       "DROP TRIGG
6390: 45 52 20 49 46 20 45 58 49 53 54 53 20 74 65 6d  ER IF EXISTS tem
63a0: 70 2e 72 62 75 5f 69 6e 73 65 72 74 5f 74 72 3b  p.rbu_insert_tr;
63b0: 22 0a 20 20 20 20 20 20 20 20 20 20 22 44 52 4f  ".          "DRO
63c0: 50 20 54 52 49 47 47 45 52 20 49 46 20 45 58 49  P TRIGGER IF EXI
63d0: 53 54 53 20 74 65 6d 70 2e 72 62 75 5f 75 70 64  STS temp.rbu_upd
63e0: 61 74 65 31 5f 74 72 3b 22 0a 20 20 20 20 20 20  ate1_tr;".      
63f0: 20 20 20 20 22 44 52 4f 50 20 54 52 49 47 47 45      "DROP TRIGGE
6400: 52 20 49 46 20 45 58 49 53 54 53 20 74 65 6d 70  R IF EXISTS temp
6410: 2e 72 62 75 5f 75 70 64 61 74 65 32 5f 74 72 3b  .rbu_update2_tr;
6420: 22 0a 20 20 20 20 20 20 20 20 20 20 22 44 52 4f  ".          "DRO
6430: 50 20 54 52 49 47 47 45 52 20 49 46 20 45 58 49  P TRIGGER IF EXI
6440: 53 54 53 20 74 65 6d 70 2e 72 62 75 5f 64 65 6c  STS temp.rbu_del
6450: 65 74 65 5f 74 72 3b 22 0a 20 20 20 20 20 20 20  ete_tr;".       
6460: 20 20 20 2c 20 30 2c 20 30 2c 20 26 70 2d 3e 7a     , 0, 0, &p->z
6470: 45 72 72 6d 73 67 0a 20 20 20 20 20 20 29 3b 0a  Errmsg.      );.
6480: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72      }..    if( r
6490: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
64a0: 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d        if( pIter-
64b0: 3e 62 43 6c 65 61 6e 75 70 20 29 7b 0a 20 20 20  >bCleanup ){.   
64c0: 20 20 20 20 20 72 62 75 4f 62 6a 49 74 65 72 46       rbuObjIterF
64d0: 72 65 65 43 6f 6c 73 28 70 49 74 65 72 29 3b 0a  reeCols(pIter);.
64e0: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 62          pIter->b
64f0: 43 6c 65 61 6e 75 70 20 3d 20 30 3b 0a 20 20 20  Cleanup = 0;.   
6500: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
6510: 33 5f 73 74 65 70 28 70 49 74 65 72 2d 3e 70 54  3_step(pIter->pT
6520: 62 6c 49 74 65 72 29 3b 0a 20 20 20 20 20 20 20  blIter);.       
6530: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
6540: 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ROW ){.         
6550: 20 72 63 20 3d 20 72 65 73 65 74 41 6e 64 43 6f   rc = resetAndCo
6560: 6c 6c 65 63 74 45 72 72 6f 72 28 70 49 74 65 72  llectError(pIter
6570: 2d 3e 70 54 62 6c 49 74 65 72 2c 20 26 70 2d 3e  ->pTblIter, &p->
6580: 7a 45 72 72 6d 73 67 29 3b 0a 20 20 20 20 20 20  zErrmsg);.      
6590: 20 20 20 20 70 49 74 65 72 2d 3e 7a 54 62 6c 20      pIter->zTbl 
65a0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 0;.        }el
65b0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49  se{.          pI
65c0: 74 65 72 2d 3e 7a 54 62 6c 20 3d 20 28 63 6f 6e  ter->zTbl = (con
65d0: 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
65e0: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 49 74  _column_text(pIt
65f0: 65 72 2d 3e 70 54 62 6c 49 74 65 72 2c 20 30 29  er->pTblIter, 0)
6600: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65  ;.          pIte
6610: 72 2d 3e 7a 44 61 74 61 54 62 6c 20 3d 20 28 63  r->zDataTbl = (c
6620: 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
6630: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
6640: 49 74 65 72 2d 3e 70 54 62 6c 49 74 65 72 2c 31  Iter->pTblIter,1
6650: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
6660: 3d 20 28 70 49 74 65 72 2d 3e 7a 44 61 74 61 54  = (pIter->zDataT
6670: 62 6c 20 26 26 20 70 49 74 65 72 2d 3e 7a 54 62  bl && pIter->zTb
6680: 6c 29 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a  l) ? SQLITE_OK :
6690: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
66a0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
66b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66  else{.        if
66c0: 28 20 70 49 74 65 72 2d 3e 7a 49 64 78 3d 3d 30  ( pIter->zIdx==0
66d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
66e0: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 49 64 78  lite3_stmt *pIdx
66f0: 20 3d 20 70 49 74 65 72 2d 3e 70 49 64 78 49 74   = pIter->pIdxIt
6700: 65 72 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  er;.          rc
6710: 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f   = sqlite3_bind_
6720: 74 65 78 74 28 70 49 64 78 2c 20 31 2c 20 70 49  text(pIdx, 1, pI
6730: 74 65 72 2d 3e 7a 54 62 6c 2c 20 2d 31 2c 20 53  ter->zTbl, -1, S
6740: 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
6750: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
6760: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
6770: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
6780: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65  rc = sqlite3_ste
6790: 70 28 70 49 74 65 72 2d 3e 70 49 64 78 49 74 65  p(pIter->pIdxIte
67a0: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  r);.          if
67b0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 52 4f 57  ( rc!=SQLITE_ROW
67c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
67d0: 72 63 20 3d 20 72 65 73 65 74 41 6e 64 43 6f 6c  rc = resetAndCol
67e0: 6c 65 63 74 45 72 72 6f 72 28 70 49 74 65 72 2d  lectError(pIter-
67f0: 3e 70 49 64 78 49 74 65 72 2c 20 26 70 2d 3e 7a  >pIdxIter, &p->z
6800: 45 72 72 6d 73 67 29 3b 0a 20 20 20 20 20 20 20  Errmsg);.       
6810: 20 20 20 20 20 70 49 74 65 72 2d 3e 62 43 6c 65       pIter->bCle
6820: 61 6e 75 70 20 3d 20 31 3b 0a 20 20 20 20 20 20  anup = 1;.      
6830: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 7a 49 64        pIter->zId
6840: 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  x = 0;.         
6850: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6860: 20 20 20 20 70 49 74 65 72 2d 3e 7a 49 64 78 20      pIter->zIdx 
6870: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
6880: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
6890: 78 74 28 70 49 74 65 72 2d 3e 70 49 64 78 49 74  xt(pIter->pIdxIt
68a0: 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  er, 0);.        
68b0: 20 20 20 20 70 49 74 65 72 2d 3e 69 54 6e 75 6d      pIter->iTnum
68c0: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
68d0: 6e 5f 69 6e 74 28 70 49 74 65 72 2d 3e 70 49 64  n_int(pIter->pId
68e0: 78 49 74 65 72 2c 20 31 29 3b 0a 20 20 20 20 20  xIter, 1);.     
68f0: 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 62 55         pIter->bU
6900: 6e 69 71 75 65 20 3d 20 73 71 6c 69 74 65 33 5f  nique = sqlite3_
6910: 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 49 74 65 72  column_int(pIter
6920: 2d 3e 70 49 64 78 49 74 65 72 2c 20 32 29 3b 0a  ->pIdxIter, 2);.
6930: 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
6940: 20 70 49 74 65 72 2d 3e 7a 49 64 78 20 3f 20 53   pIter->zIdx ? S
6950: 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49 54  QLITE_OK : SQLIT
6960: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
6970: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
6980: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
6990: 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ..  if( rc!=SQLI
69a0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 62 75  TE_OK ){.    rbu
69b0: 4f 62 6a 49 74 65 72 46 69 6e 61 6c 69 7a 65 28  ObjIterFinalize(
69c0: 70 49 74 65 72 29 3b 0a 20 20 20 20 70 2d 3e 72  pIter);.    p->r
69d0: 63 20 3d 20 72 63 3b 0a 20 20 7d 0a 20 20 72 65  c = rc;.  }.  re
69e0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
69f0: 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74  ** The implement
6a00: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 72 62 75  ation of the rbu
6a10: 5f 74 61 72 67 65 74 5f 6e 61 6d 65 28 29 20 53  _target_name() S
6a20: 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 69  QL function. Thi
6a30: 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 63  s function.** ac
6a40: 63 65 70 74 73 20 6f 6e 65 20 61 72 67 75 6d 65  cepts one argume
6a50: 6e 74 20 2d 20 74 68 65 20 6e 61 6d 65 20 6f 66  nt - the name of
6a60: 20 61 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20   a table in the 
6a70: 52 42 55 20 64 61 74 61 62 61 73 65 2e 20 49 66  RBU database. If
6a80: 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 6e 61   the.** table na
6a90: 6d 65 20 6d 61 74 63 68 65 73 20 74 68 65 20 70  me matches the p
6aa0: 61 74 74 65 72 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20  attern:.**.**   
6ab0: 20 20 64 61 74 61 5b 30 2d 39 5d 5f 3c 6e 61 6d    data[0-9]_<nam
6ac0: 65 3e 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 3c  e>.**.** where <
6ad0: 6e 61 6d 65 3e 20 69 73 20 61 6e 79 20 73 65 71  name> is any seq
6ae0: 75 65 6e 63 65 20 6f 66 20 31 20 6f 72 20 6d 6f  uence of 1 or mo
6af0: 72 65 20 63 68 61 72 61 63 74 65 72 73 2c 20 3c  re characters, <
6b00: 6e 61 6d 65 3e 20 69 73 20 72 65 74 75 72 6e 65  name> is returne
6b10: 64 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  d..** Otherwise,
6b20: 20 69 66 20 74 68 65 20 6f 6e 6c 79 20 61 72 67   if the only arg
6b30: 75 6d 65 6e 74 20 64 6f 65 73 20 6e 6f 74 20 6d  ument does not m
6b40: 61 74 63 68 20 74 68 65 20 61 62 6f 76 65 20 70  atch the above p
6b50: 61 74 74 65 72 6e 2c 20 61 6e 20 53 51 4c 0a 2a  attern, an SQL.*
6b60: 2a 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  * NULL is return
6b70: 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 22 64  ed..**.**     "d
6b80: 61 74 61 5f 74 31 22 20 20 20 20 20 2d 3e 20 22  ata_t1"     -> "
6b90: 74 31 22 0a 2a 2a 20 20 20 20 20 22 64 61 74 61  t1".**     "data
6ba0: 30 31 32 33 5f 74 32 22 20 2d 3e 20 22 74 32 22  0123_t2" -> "t2"
6bb0: 0a 2a 2a 20 20 20 20 20 22 64 61 74 61 41 42 5f  .**     "dataAB_
6bc0: 74 33 22 20 20 20 2d 3e 20 4e 55 4c 4c 0a 2a 2f  t3"   -> NULL.*/
6bd0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75  .static void rbu
6be0: 54 61 72 67 65 74 4e 61 6d 65 46 75 6e 63 28 0a  TargetNameFunc(.
6bf0: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
6c00: 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e  t *context,.  in
6c10: 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65  t argc,.  sqlite
6c20: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
6c30: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
6c40: 7a 49 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 61  zIn;.  assert( a
6c50: 72 67 63 3d 3d 31 20 29 3b 0a 0a 20 20 7a 49 6e  rgc==1 );..  zIn
6c60: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
6c70: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
6c80: 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69  xt(argv[0]);.  i
6c90: 66 28 20 7a 49 6e 20 26 26 20 73 74 72 6c 65 6e  f( zIn && strlen
6ca0: 28 7a 49 6e 29 3e 34 20 26 26 20 6d 65 6d 63 6d  (zIn)>4 && memcm
6cb0: 70 28 22 64 61 74 61 22 2c 20 7a 49 6e 2c 20 34  p("data", zIn, 4
6cc0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  )==0 ){.    int 
6cd0: 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 34 3b 20  i;.    for(i=4; 
6ce0: 7a 49 6e 5b 69 5d 3e 3d 27 30 27 20 26 26 20 7a  zIn[i]>='0' && z
6cf0: 49 6e 5b 69 5d 3c 3d 27 39 27 3b 20 69 2b 2b 29  In[i]<='9'; i++)
6d00: 3b 0a 20 20 20 20 69 66 28 20 7a 49 6e 5b 69 5d  ;.    if( zIn[i]
6d10: 3d 3d 27 5f 27 20 26 26 20 7a 49 6e 5b 69 2b 31  =='_' && zIn[i+1
6d20: 5d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ] ){.      sqlit
6d30: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63  e3_result_text(c
6d40: 6f 6e 74 65 78 74 2c 20 26 7a 49 6e 5b 69 2b 31  ontext, &zIn[i+1
6d50: 5d 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54  ], -1, SQLITE_ST
6d60: 41 54 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ATIC);.    }.  }
6d70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  .}../*.** Initia
6d80: 6c 69 7a 65 20 74 68 65 20 69 74 65 72 61 74 6f  lize the iterato
6d90: 72 20 73 74 72 75 63 74 75 72 65 20 70 61 73 73  r structure pass
6da0: 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
6db0: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a   argument..**.**
6dc0: 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63   If no error occ
6dd0: 75 72 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  urs, SQLITE_OK i
6de0: 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74  s returned and t
6df0: 68 65 20 69 74 65 72 61 74 6f 72 20 69 73 20 6c  he iterator is l
6e00: 65 66 74 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67  eft .** pointing
6e10: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e   to the first en
6e20: 74 72 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  try. Otherwise, 
6e30: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e  an error code an
6e40: 64 20 6d 65 73 73 61 67 65 20 69 73 20 0a 2a 2a  d message is .**
6e50: 20 6c 65 66 74 20 69 6e 20 74 68 65 20 52 42 55   left in the RBU
6e60: 20 68 61 6e 64 6c 65 20 70 61 73 73 65 64 20 61   handle passed a
6e70: 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
6e80: 6d 65 6e 74 2e 20 41 20 63 6f 70 79 20 6f 66 20  ment. A copy of 
6e90: 74 68 65 20 0a 2a 2a 20 65 72 72 6f 72 20 63 6f  the .** error co
6ea0: 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  de is returned..
6eb0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62  */.static int rb
6ec0: 75 4f 62 6a 49 74 65 72 46 69 72 73 74 28 73 71  uObjIterFirst(sq
6ed0: 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 52 62 75  lite3rbu *p, Rbu
6ee0: 4f 62 6a 49 74 65 72 20 2a 70 49 74 65 72 29 7b  ObjIter *pIter){
6ef0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 6d 65 6d  .  int rc;.  mem
6f00: 73 65 74 28 70 49 74 65 72 2c 20 30 2c 20 73 69  set(pIter, 0, si
6f10: 7a 65 6f 66 28 52 62 75 4f 62 6a 49 74 65 72 29  zeof(RbuObjIter)
6f20: 29 3b 0a 0a 20 20 72 63 20 3d 20 70 72 65 70 61  );..  rc = prepa
6f30: 72 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f  reAndCollectErro
6f40: 72 28 70 2d 3e 64 62 52 62 75 2c 20 26 70 49 74  r(p->dbRbu, &pIt
6f50: 65 72 2d 3e 70 54 62 6c 49 74 65 72 2c 20 26 70  er->pTblIter, &p
6f60: 2d 3e 7a 45 72 72 6d 73 67 2c 20 0a 20 20 20 20  ->zErrmsg, .    
6f70: 20 20 22 53 45 4c 45 43 54 20 72 62 75 5f 74 61    "SELECT rbu_ta
6f80: 72 67 65 74 5f 6e 61 6d 65 28 6e 61 6d 65 29 20  rget_name(name) 
6f90: 41 53 20 74 61 72 67 65 74 2c 20 6e 61 6d 65 20  AS target, name 
6fa0: 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
6fb0: 65 72 20 22 0a 20 20 20 20 20 20 22 57 48 45 52  er ".      "WHER
6fc0: 45 20 74 79 70 65 20 49 4e 20 28 27 74 61 62 6c  E type IN ('tabl
6fd0: 65 27 2c 20 27 76 69 65 77 27 29 20 41 4e 44 20  e', 'view') AND 
6fe0: 74 61 72 67 65 74 20 49 53 20 4e 4f 54 20 4e 55  target IS NOT NU
6ff0: 4c 4c 20 22 0a 20 20 20 20 20 20 22 4f 52 44 45  LL ".      "ORDE
7000: 52 20 42 59 20 6e 61 6d 65 22 0a 20 20 29 3b 0a  R BY name".  );.
7010: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
7020: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
7030: 20 70 72 65 70 61 72 65 41 6e 64 43 6f 6c 6c 65   prepareAndColle
7040: 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 4d 61 69  ctError(p->dbMai
7050: 6e 2c 20 26 70 49 74 65 72 2d 3e 70 49 64 78 49  n, &pIter->pIdxI
7060: 74 65 72 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67  ter, &p->zErrmsg
7070: 2c 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45 43  ,.        "SELEC
7080: 54 20 6e 61 6d 65 2c 20 72 6f 6f 74 70 61 67 65  T name, rootpage
7090: 2c 20 73 71 6c 20 49 53 20 4e 55 4c 4c 20 4f 52  , sql IS NULL OR
70a0: 20 73 75 62 73 74 72 28 38 2c 20 36 29 3d 3d 27   substr(8, 6)=='
70b0: 55 4e 49 51 55 45 27 20 22 0a 20 20 20 20 20 20  UNIQUE' ".      
70c0: 20 20 22 20 20 46 52 4f 4d 20 6d 61 69 6e 2e 73    "  FROM main.s
70d0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 22 0a 20  qlite_master ". 
70e0: 20 20 20 20 20 20 20 22 20 20 57 48 45 52 45 20         "  WHERE 
70f0: 74 79 70 65 3d 27 69 6e 64 65 78 27 20 41 4e 44  type='index' AND
7100: 20 74 62 6c 5f 6e 61 6d 65 20 3d 20 3f 22 0a 20   tbl_name = ?". 
7110: 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 70 49 74     );.  }..  pIt
7120: 65 72 2d 3e 62 43 6c 65 61 6e 75 70 20 3d 20 31  er->bCleanup = 1
7130: 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a  ;.  p->rc = rc;.
7140: 20 20 72 65 74 75 72 6e 20 72 62 75 4f 62 6a 49    return rbuObjI
7150: 74 65 72 4e 65 78 74 28 70 2c 20 70 49 74 65 72  terNext(p, pIter
7160: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
7170: 20 69 73 20 61 20 77 72 61 70 70 65 72 20 61 72   is a wrapper ar
7180: 6f 75 6e 64 20 22 73 71 6c 69 74 65 33 5f 6d 70  ound "sqlite3_mp
7190: 72 69 6e 74 66 28 7a 46 6d 74 2c 20 2e 2e 2e 29  rintf(zFmt, ...)
71a0: 22 2e 20 49 66 20 61 6e 20 4f 4f 4d 20 6f 63 63  ". If an OOM occ
71b0: 75 72 73 2c 0a 2a 2a 20 61 6e 20 65 72 72 6f 72  urs,.** an error
71c0: 20 63 6f 64 65 20 69 73 20 73 74 6f 72 65 64 20   code is stored 
71d0: 69 6e 20 74 68 65 20 52 42 55 20 68 61 6e 64 6c  in the RBU handl
71e0: 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
71f0: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a  first argument..
7200: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
7210: 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63  r has already oc
7220: 63 75 72 72 65 64 20 28 70 2d 3e 72 63 20 69 73  curred (p->rc is
7230: 20 61 6c 72 65 61 64 79 20 73 65 74 20 74 6f 20   already set to 
7240: 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 0a  something other.
7250: 2a 2a 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f  ** than SQLITE_O
7260: 4b 29 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75  K), then this fu
7270: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 4e  nction returns N
7280: 55 4c 4c 20 77 69 74 68 6f 75 74 20 6d 6f 64 69  ULL without modi
7290: 66 79 69 6e 67 20 74 68 65 0a 2a 2a 20 73 74 6f  fying the.** sto
72a0: 72 65 64 20 65 72 72 6f 72 20 63 6f 64 65 2e 20  red error code. 
72b0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 20  In this case it 
72c0: 73 74 69 6c 6c 20 63 61 6c 6c 73 20 73 71 6c 69  still calls sqli
72d0: 74 65 33 5f 66 72 65 65 28 29 20 6f 6e 20 61 6e  te3_free() on an
72e0: 79 20 0a 2a 2a 20 70 72 69 6e 74 66 28 29 20 70  y .** printf() p
72f0: 61 72 61 6d 65 74 65 72 73 20 61 73 73 6f 63 69  arameters associ
7300: 61 74 65 64 20 77 69 74 68 20 25 7a 20 63 6f 6e  ated with %z con
7310: 76 65 72 73 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61  versions..*/.sta
7320: 74 69 63 20 63 68 61 72 20 2a 72 62 75 4d 50 72  tic char *rbuMPr
7330: 69 6e 74 66 28 73 71 6c 69 74 65 33 72 62 75 20  intf(sqlite3rbu 
7340: 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
7350: 7a 46 6d 74 2c 20 2e 2e 2e 29 7b 0a 20 20 63 68  zFmt, ...){.  ch
7360: 61 72 20 2a 7a 53 71 6c 20 3d 20 30 3b 0a 20 20  ar *zSql = 0;.  
7370: 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 76 61  va_list ap;.  va
7380: 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6d 74 29  _start(ap, zFmt)
7390: 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74  ;.  zSql = sqlit
73a0: 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6d 74  e3_vmprintf(zFmt
73b0: 2c 20 61 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e  , ap);.  if( p->
73c0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
73d0: 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30  .    if( zSql==0
73e0: 20 29 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54   ) p->rc = SQLIT
73f0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65  E_NOMEM;.  }else
7400: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
7410: 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 7a 53  ee(zSql);.    zS
7420: 71 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 76 61  ql = 0;.  }.  va
7430: 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72 65 74 75  _end(ap);.  retu
7440: 72 6e 20 7a 53 71 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn zSql;.}../*.*
7450: 2a 20 41 72 67 75 6d 65 6e 74 20 7a 46 6d 74 20  * Argument zFmt 
7460: 69 73 20 61 20 73 71 6c 69 74 65 33 5f 6d 70 72  is a sqlite3_mpr
7470: 69 6e 74 66 28 29 20 73 74 79 6c 65 20 66 6f 72  intf() style for
7480: 6d 61 74 20 73 74 72 69 6e 67 2e 20 54 68 65 20  mat string. The 
7490: 74 72 61 69 6c 69 6e 67 0a 2a 2a 20 61 72 67 75  trailing.** argu
74a0: 6d 65 6e 74 73 20 61 72 65 20 74 68 65 20 75 73  ments are the us
74b0: 75 61 6c 20 73 75 62 73 69 74 75 74 69 6f 6e 20  ual subsitution 
74c0: 76 61 6c 75 65 73 2e 20 54 68 69 73 20 66 75 6e  values. This fun
74d0: 63 74 69 6f 6e 20 70 65 72 66 6f 72 6d 73 0a 2a  ction performs.*
74e0: 2a 20 74 68 65 20 70 72 69 6e 74 66 28 29 20 73  * the printf() s
74f0: 74 79 6c 65 20 73 75 62 73 74 69 74 75 74 69 6f  tyle substitutio
7500: 6e 73 20 61 6e 64 20 65 78 65 63 75 74 65 73 20  ns and executes 
7510: 74 68 65 20 72 65 73 75 6c 74 20 61 73 20 61 6e  the result as an
7520: 20 53 51 4c 0a 2a 2a 20 73 74 61 74 65 6d 65 6e   SQL.** statemen
7530: 74 20 6f 6e 20 74 68 65 20 52 42 55 20 68 61 6e  t on the RBU han
7540: 64 6c 65 73 20 64 61 74 61 62 61 73 65 2e 0a 2a  dles database..*
7550: 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
7560: 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f   occurs, an erro
7570: 72 20 63 6f 64 65 20 61 6e 64 20 65 72 72 6f 72  r code and error
7580: 20 6d 65 73 73 61 67 65 20 69 73 20 73 74 6f 72   message is stor
7590: 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 52 42 55  ed in the.** RBU
75a0: 20 68 61 6e 64 6c 65 2e 20 49 66 20 61 6e 20 65   handle. If an e
75b0: 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79  rror has already
75c0: 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e 20 74   occurred when t
75d0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a  his function is.
75e0: 2a 2a 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73  ** called, it is
75f0: 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
7600: 74 69 63 20 69 6e 74 20 72 62 75 4d 50 72 69 6e  tic int rbuMPrin
7610: 74 66 45 78 65 63 28 73 71 6c 69 74 65 33 72 62  tfExec(sqlite3rb
7620: 75 20 2a 70 2c 20 73 71 6c 69 74 65 33 20 2a 64  u *p, sqlite3 *d
7630: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
7640: 46 6d 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f  Fmt, ...){.  va_
7650: 6c 69 73 74 20 61 70 3b 0a 20 20 63 68 61 72 20  list ap;.  char 
7660: 2a 7a 53 71 6c 3b 0a 20 20 76 61 5f 73 74 61 72  *zSql;.  va_star
7670: 74 28 61 70 2c 20 7a 46 6d 74 29 3b 0a 20 20 7a  t(ap, zFmt);.  z
7680: 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 6d  Sql = sqlite3_vm
7690: 70 72 69 6e 74 66 28 7a 46 6d 74 2c 20 61 70 29  printf(zFmt, ap)
76a0: 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ;.  if( p->rc==S
76b0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
76c0: 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20  if( zSql==0 ){. 
76d0: 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c       p->rc = SQL
76e0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
76f0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 72  else{.      p->r
7700: 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  c = sqlite3_exec
7710: 28 64 62 2c 20 7a 53 71 6c 2c 20 30 2c 20 30 2c  (db, zSql, 0, 0,
7720: 20 26 70 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a 20   &p->zErrmsg);. 
7730: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
7740: 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20  e3_free(zSql);. 
7750: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72   va_end(ap);.  r
7760: 65 74 75 72 6e 20 70 2d 3e 72 63 3b 0a 7d 0a 0a  eturn p->rc;.}..
7770: 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f  /*.** Attempt to
7780: 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72 65   allocate and re
7790: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
77a0: 6f 20 61 20 7a 65 72 6f 65 64 20 62 6c 6f 63 6b  o a zeroed block
77b0: 20 6f 66 20 6e 42 79 74 65 20 0a 2a 2a 20 62 79   of nByte .** by
77c0: 74 65 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61  tes. .**.** If a
77d0: 6e 20 65 72 72 6f 72 20 28 69 2e 65 2e 20 61 6e  n error (i.e. an
77e0: 20 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e 29 20   OOM condition) 
77f0: 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 4e  occurs, return N
7800: 55 4c 4c 20 61 6e 64 20 6c 65 61 76 65 20 61 6e  ULL and leave an
7810: 20 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20   .** error code 
7820: 69 6e 20 74 68 65 20 72 62 75 20 68 61 6e 64 6c  in the rbu handl
7830: 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
7840: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20  first argument. 
7850: 4f 72 2c 20 69 66 20 61 6e 20 0a 2a 2a 20 65 72  Or, if an .** er
7860: 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79 20  ror has already 
7870: 6f 63 63 75 72 72 65 64 20 77 68 65 6e 20 74 68  occurred when th
7880: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
7890: 61 6c 6c 65 64 2c 20 72 65 74 75 72 6e 20 4e 55  alled, return NU
78a0: 4c 4c 20 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65  LL .** immediate
78b0: 6c 79 20 77 69 74 68 6f 75 74 20 61 74 74 65 6d  ly without attem
78c0: 70 74 69 6e 67 20 74 68 65 20 61 6c 6c 6f 63 61  pting the alloca
78d0: 74 69 6f 6e 20 6f 72 20 6d 6f 64 69 66 79 69 6e  tion or modifyin
78e0: 67 20 74 68 65 20 73 74 6f 72 65 64 0a 2a 2a 20  g the stored.** 
78f0: 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73  error code..*/.s
7900: 74 61 74 69 63 20 76 6f 69 64 20 2a 72 62 75 4d  tatic void *rbuM
7910: 61 6c 6c 6f 63 28 73 71 6c 69 74 65 33 72 62 75  alloc(sqlite3rbu
7920: 20 2a 70 2c 20 69 6e 74 20 6e 42 79 74 65 29 7b   *p, int nByte){
7930: 0a 20 20 76 6f 69 64 20 2a 70 52 65 74 20 3d 20  .  void *pRet = 
7940: 30 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  0;.  if( p->rc==
7950: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
7960: 20 61 73 73 65 72 74 28 20 6e 42 79 74 65 3e 30   assert( nByte>0
7970: 20 29 3b 0a 20 20 20 20 70 52 65 74 20 3d 20 73   );.    pRet = s
7980: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 42  qlite3_malloc(nB
7990: 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70 52  yte);.    if( pR
79a0: 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  et==0 ){.      p
79b0: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ->rc = SQLITE_NO
79c0: 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  MEM;.    }else{.
79d0: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 52 65        memset(pRe
79e0: 74 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a 20 20  t, 0, nByte);.  
79f0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
7a00: 20 70 52 65 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a   pRet;.}.../*.**
7a10: 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 7a 65   Allocate and ze
7a20: 72 6f 20 74 68 65 20 70 49 74 65 72 2d 3e 61 7a  ro the pIter->az
7a30: 54 62 6c 43 6f 6c 5b 5d 20 61 6e 64 20 61 62 54  TblCol[] and abT
7a40: 62 6c 50 6b 5b 5d 20 61 72 72 61 79 73 20 73 6f  blPk[] arrays so
7a50: 20 74 68 61 74 0a 2a 2a 20 74 68 65 72 65 20 69   that.** there i
7a60: 73 20 72 6f 6f 6d 20 66 6f 72 20 61 74 20 6c 65  s room for at le
7a70: 61 73 74 20 6e 43 6f 6c 20 65 6c 65 6d 65 6e 74  ast nCol element
7a80: 73 2e 20 49 66 20 61 6e 20 4f 4f 4d 20 6f 63 63  s. If an OOM occ
7a90: 75 72 73 2c 20 73 74 6f 72 65 20 61 6e 0a 2a 2a  urs, store an.**
7aa0: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 6e 20 74   error code in t
7ab0: 68 65 20 52 42 55 20 68 61 6e 64 6c 65 20 70 61  he RBU handle pa
7ac0: 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
7ad0: 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73  t argument..*/.s
7ae0: 74 61 74 69 63 20 76 6f 69 64 20 72 62 75 41 6c  tatic void rbuAl
7af0: 6c 6f 63 61 74 65 49 74 65 72 41 72 72 61 79 73  locateIterArrays
7b00: 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20  (sqlite3rbu *p, 
7b10: 52 62 75 4f 62 6a 49 74 65 72 20 2a 70 49 74 65  RbuObjIter *pIte
7b20: 72 2c 20 69 6e 74 20 6e 43 6f 6c 29 7b 0a 20 20  r, int nCol){.  
7b30: 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 32 2a 73  int nByte = (2*s
7b40: 69 7a 65 6f 66 28 63 68 61 72 2a 29 20 2b 20 73  izeof(char*) + s
7b50: 69 7a 65 6f 66 28 69 6e 74 29 20 2b 20 33 2a 73  izeof(int) + 3*s
7b60: 69 7a 65 6f 66 28 75 38 29 29 20 2a 20 6e 43 6f  izeof(u8)) * nCo
7b70: 6c 3b 0a 20 20 63 68 61 72 20 2a 2a 61 7a 4e 65  l;.  char **azNe
7b80: 77 3b 0a 0a 20 20 61 7a 4e 65 77 20 3d 20 28 63  w;..  azNew = (c
7b90: 68 61 72 2a 2a 29 72 62 75 4d 61 6c 6c 6f 63 28  har**)rbuMalloc(
7ba0: 70 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28  p, nByte);.  if(
7bb0: 20 61 7a 4e 65 77 20 29 7b 0a 20 20 20 20 70 49   azNew ){.    pI
7bc0: 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 20 3d 20  ter->azTblCol = 
7bd0: 61 7a 4e 65 77 3b 0a 20 20 20 20 70 49 74 65 72  azNew;.    pIter
7be0: 2d 3e 61 7a 54 62 6c 54 79 70 65 20 3d 20 26 61  ->azTblType = &a
7bf0: 7a 4e 65 77 5b 6e 43 6f 6c 5d 3b 0a 20 20 20 20  zNew[nCol];.    
7c00: 70 49 74 65 72 2d 3e 61 69 53 72 63 4f 72 64 65  pIter->aiSrcOrde
7c10: 72 20 3d 20 28 69 6e 74 2a 29 26 70 49 74 65 72  r = (int*)&pIter
7c20: 2d 3e 61 7a 54 62 6c 54 79 70 65 5b 6e 43 6f 6c  ->azTblType[nCol
7c30: 5d 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 61 62  ];.    pIter->ab
7c40: 54 62 6c 50 6b 20 3d 20 28 75 38 2a 29 26 70 49  TblPk = (u8*)&pI
7c50: 74 65 72 2d 3e 61 69 53 72 63 4f 72 64 65 72 5b  ter->aiSrcOrder[
7c60: 6e 43 6f 6c 5d 3b 0a 20 20 20 20 70 49 74 65 72  nCol];.    pIter
7c70: 2d 3e 61 62 4e 6f 74 4e 75 6c 6c 20 3d 20 28 75  ->abNotNull = (u
7c80: 38 2a 29 26 70 49 74 65 72 2d 3e 61 62 54 62 6c  8*)&pIter->abTbl
7c90: 50 6b 5b 6e 43 6f 6c 5d 3b 0a 20 20 20 20 70 49  Pk[nCol];.    pI
7ca0: 74 65 72 2d 3e 61 62 49 6e 64 65 78 65 64 20 3d  ter->abIndexed =
7cb0: 20 28 75 38 2a 29 26 70 49 74 65 72 2d 3e 61 62   (u8*)&pIter->ab
7cc0: 4e 6f 74 4e 75 6c 6c 5b 6e 43 6f 6c 5d 3b 0a 20  NotNull[nCol];. 
7cd0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20   }.}../*.** The 
7ce0: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 6d  first argument m
7cf0: 75 73 74 20 62 65 20 61 20 6e 75 6c 2d 74 65 72  ust be a nul-ter
7d00: 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 2e 20  minated string. 
7d10: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  This function.**
7d20: 20 72 65 74 75 72 6e 73 20 61 20 63 6f 70 79 20   returns a copy 
7d30: 6f 66 20 74 68 65 20 73 74 72 69 6e 67 20 69 6e  of the string in
7d40: 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64   memory obtained
7d50: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
7d60: 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 49 74 20 69 73  lloc()..** It is
7d70: 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
7d80: 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  ity of the calle
7d90: 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20  r to eventually 
7da0: 66 72 65 65 20 74 68 69 73 20 6d 65 6d 6f 72 79  free this memory
7db0: 0a 2a 2a 20 75 73 69 6e 67 20 73 71 6c 69 74 65  .** using sqlite
7dc0: 33 5f 66 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  3_free()..**.** 
7dd0: 49 66 20 61 6e 20 4f 4f 4d 20 63 6f 6e 64 69 74  If an OOM condit
7de0: 69 6f 6e 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ion is encounter
7df0: 65 64 20 77 68 65 6e 20 61 74 74 65 6d 70 74 69  ed when attempti
7e00: 6e 67 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d  ng to allocate m
7e10: 65 6d 6f 72 79 2c 0a 2a 2a 20 6f 75 74 70 75 74  emory,.** output
7e20: 20 76 61 72 69 61 62 6c 65 20 28 2a 70 52 63 29   variable (*pRc)
7e30: 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54   is set to SQLIT
7e40: 45 5f 4e 4f 4d 45 4d 20 62 65 66 6f 72 65 20 72  E_NOMEM before r
7e50: 65 74 75 72 6e 69 6e 67 2e 20 4f 74 68 65 72 77  eturning. Otherw
7e60: 69 73 65 2c 0a 2a 2a 20 69 66 20 74 68 65 20 61  ise,.** if the a
7e70: 6c 6c 6f 63 61 74 69 6f 6e 20 73 75 63 63 65 65  llocation succee
7e80: 64 73 2c 20 28 2a 70 52 63 29 20 69 73 20 6c 65  ds, (*pRc) is le
7e90: 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f  ft unchanged..*/
7ea0: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 72 62  .static char *rb
7eb0: 75 53 74 72 6e 64 75 70 28 63 6f 6e 73 74 20 63  uStrndup(const c
7ec0: 68 61 72 20 2a 7a 53 74 72 2c 20 69 6e 74 20 2a  har *zStr, int *
7ed0: 70 52 63 29 7b 0a 20 20 63 68 61 72 20 2a 7a 52  pRc){.  char *zR
7ee0: 65 74 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  et = 0;..  asser
7ef0: 74 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f  t( *pRc==SQLITE_
7f00: 4f 4b 20 29 3b 0a 20 20 69 66 28 20 7a 53 74 72  OK );.  if( zStr
7f10: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 43 6f 70   ){.    int nCop
7f20: 79 20 3d 20 73 74 72 6c 65 6e 28 7a 53 74 72 29  y = strlen(zStr)
7f30: 20 2b 20 31 3b 0a 20 20 20 20 7a 52 65 74 20 3d   + 1;.    zRet =
7f40: 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f   (char*)sqlite3_
7f50: 6d 61 6c 6c 6f 63 28 6e 43 6f 70 79 29 3b 0a 20  malloc(nCopy);. 
7f60: 20 20 20 69 66 28 20 7a 52 65 74 20 29 7b 0a 20     if( zRet ){. 
7f70: 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 52 65 74       memcpy(zRet
7f80: 2c 20 7a 53 74 72 2c 20 6e 43 6f 70 79 29 3b 0a  , zStr, nCopy);.
7f90: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7fa0: 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e   *pRc = SQLITE_N
7fb0: 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  OMEM;.    }.  }.
7fc0: 0a 20 20 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a  .  return zRet;.
7fd0: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 61 6c 69 7a  }../*.** Finaliz
7fe0: 65 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  e the statement 
7ff0: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
8000: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  cond argument..*
8010: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 71 6c 69  *.** If the sqli
8020: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 29 20 63  te3_finalize() c
8030: 61 6c 6c 20 69 6e 64 69 63 61 74 65 73 20 74 68  all indicates th
8040: 61 74 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  at an error occu
8050: 72 73 2c 20 61 6e 64 20 74 68 65 0a 2a 2a 20 72  rs, and the.** r
8060: 62 75 20 68 61 6e 64 6c 65 20 65 72 72 6f 72 20  bu handle error 
8070: 63 6f 64 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  code is not alre
8080: 61 64 79 20 73 65 74 2c 20 73 65 74 20 74 68 65  ady set, set the
8090: 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20   error code and 
80a0: 65 72 72 6f 72 0a 2a 2a 20 6d 65 73 73 61 67 65  error.** message
80b0: 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f   accordingly..*/
80c0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75  .static void rbu
80d0: 46 69 6e 61 6c 69 7a 65 28 73 71 6c 69 74 65 33  Finalize(sqlite3
80e0: 72 62 75 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f  rbu *p, sqlite3_
80f0: 73 74 6d 74 20 2a 70 53 74 6d 74 29 7b 0a 20 20  stmt *pStmt){.  
8100: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73 71  sqlite3 *db = sq
8110: 6c 69 74 65 33 5f 64 62 5f 68 61 6e 64 6c 65 28  lite3_db_handle(
8120: 70 53 74 6d 74 29 3b 0a 20 20 69 6e 74 20 72 63  pStmt);.  int rc
8130: 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c   = sqlite3_final
8140: 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 69 66  ize(pStmt);.  if
8150: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
8160: 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45  OK && rc!=SQLITE
8170: 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63  _OK ){.    p->rc
8180: 20 3d 20 72 63 3b 0a 20 20 20 20 70 2d 3e 7a 45   = rc;.    p->zE
8190: 72 72 6d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f  rrmsg = sqlite3_
81a0: 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 73 71  mprintf("%s", sq
81b0: 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29  lite3_errmsg(db)
81c0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 44 65 74  );.  }.}../* Det
81d0: 65 72 6d 69 6e 65 20 74 68 65 20 74 79 70 65 20  ermine the type 
81e0: 6f 66 20 61 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a  of a table..**.*
81f0: 2a 20 20 20 70 65 54 79 70 65 20 69 73 20 6f 66  *   peType is of
8200: 20 74 79 70 65 20 28 69 6e 74 2a 29 2c 20 61 20   type (int*), a 
8210: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 75  pointer to an ou
8220: 74 70 75 74 20 70 61 72 61 6d 65 74 65 72 20 6f  tput parameter o
8230: 66 20 74 79 70 65 0a 2a 2a 20 20 20 28 69 6e 74  f type.**   (int
8240: 29 2e 20 54 68 69 73 20 63 61 6c 6c 20 73 65 74  ). This call set
8250: 73 20 74 68 65 20 6f 75 74 70 75 74 20 70 61 72  s the output par
8260: 61 6d 65 74 65 72 20 61 73 20 66 6f 6c 6c 6f 77  ameter as follow
8270: 73 2c 20 64 65 70 65 6e 64 69 6e 67 0a 2a 2a 20  s, depending.** 
8280: 20 20 6f 6e 20 74 68 65 20 74 79 70 65 20 6f 66    on the type of
8290: 20 74 68 65 20 74 61 62 6c 65 20 73 70 65 63 69   the table speci
82a0: 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65  fied by paramete
82b0: 72 73 20 64 62 4e 61 6d 65 20 61 6e 64 20 7a 54  rs dbName and zT
82c0: 62 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52 42  bl..**.**     RB
82d0: 55 5f 50 4b 5f 4e 4f 54 41 42 4c 45 3a 20 20 20  U_PK_NOTABLE:   
82e0: 20 20 20 20 4e 6f 20 73 75 63 68 20 74 61 62 6c      No such tabl
82f0: 65 2e 0a 2a 2a 20 20 20 20 20 52 42 55 5f 50 4b  e..**     RBU_PK
8300: 5f 4e 4f 4e 45 3a 20 20 20 20 20 20 20 20 20 20  _NONE:          
8310: 54 61 62 6c 65 20 68 61 73 20 61 6e 20 69 6d 70  Table has an imp
8320: 6c 69 63 69 74 20 72 6f 77 69 64 2e 0a 2a 2a 20  licit rowid..** 
8330: 20 20 20 20 52 42 55 5f 50 4b 5f 49 50 4b 3a 20      RBU_PK_IPK: 
8340: 20 20 20 20 20 20 20 20 20 20 54 61 62 6c 65 20            Table 
8350: 68 61 73 20 61 6e 20 65 78 70 6c 69 63 69 74 20  has an explicit 
8360: 49 50 4b 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 20 20  IPK column..**  
8370: 20 20 20 52 42 55 5f 50 4b 5f 45 58 54 45 52 4e     RBU_PK_EXTERN
8380: 41 4c 3a 20 20 20 20 20 20 54 61 62 6c 65 20 68  AL:      Table h
8390: 61 73 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 50  as an external P
83a0: 4b 20 69 6e 64 65 78 2e 0a 2a 2a 20 20 20 20 20  K index..**     
83b0: 52 42 55 5f 50 4b 5f 57 49 54 48 4f 55 54 5f 52  RBU_PK_WITHOUT_R
83c0: 4f 57 49 44 3a 20 54 61 62 6c 65 20 69 73 20 57  OWID: Table is W
83d0: 49 54 48 4f 55 54 20 52 4f 57 49 44 2e 0a 2a 2a  ITHOUT ROWID..**
83e0: 20 20 20 20 20 52 42 55 5f 50 4b 5f 56 54 41 42       RBU_PK_VTAB
83f0: 3a 20 20 20 20 20 20 20 20 20 20 54 61 62 6c 65  :          Table
8400: 20 69 73 20 61 20 76 69 72 74 75 61 6c 20 74 61   is a virtual ta
8410: 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 41 72 67  ble..**.**   Arg
8420: 75 6d 65 6e 74 20 2a 70 69 50 6b 20 69 73 20 61  ument *piPk is a
8430: 6c 73 6f 20 6f 66 20 74 79 70 65 20 28 69 6e 74  lso of type (int
8440: 2a 29 2c 20 61 6e 64 20 61 6c 73 6f 20 70 6f 69  *), and also poi
8450: 6e 74 73 20 74 6f 20 61 6e 20 6f 75 74 70 75 74  nts to an output
8460: 0a 2a 2a 20 20 20 70 61 72 61 6d 65 74 65 72 2e  .**   parameter.
8470: 20 55 6e 6c 65 73 73 20 74 68 65 20 74 61 62 6c   Unless the tabl
8480: 65 20 68 61 73 20 61 6e 20 65 78 74 65 72 6e 61  e has an externa
8490: 6c 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e  l primary key in
84a0: 64 65 78 20 0a 2a 2a 20 20 20 28 69 2e 65 2e 20  dex .**   (i.e. 
84b0: 75 6e 6c 65 73 73 20 2a 70 65 54 79 70 65 20 69  unless *peType i
84c0: 73 20 73 65 74 20 74 6f 20 33 29 2c 20 74 68 65  s set to 3), the
84d0: 6e 20 2a 70 69 50 6b 20 69 73 20 73 65 74 20 74  n *piPk is set t
84e0: 6f 20 7a 65 72 6f 2e 20 4f 72 2c 0a 2a 2a 20 20  o zero. Or,.**  
84f0: 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 64 6f   if the table do
8500: 65 73 20 68 61 76 65 20 61 6e 20 65 78 74 65 72  es have an exter
8510: 6e 61 6c 20 70 72 69 6d 61 72 79 20 6b 65 79 20  nal primary key 
8520: 69 6e 64 65 78 2c 20 74 68 65 6e 20 2a 70 69 50  index, then *piP
8530: 6b 0a 2a 2a 20 20 20 69 73 20 73 65 74 20 74 6f  k.**   is set to
8540: 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e   the root page n
8550: 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 72 69  umber of the pri
8560: 6d 61 72 79 20 6b 65 79 20 69 6e 64 65 78 20 62  mary key index b
8570: 65 66 6f 72 65 0a 2a 2a 20 20 20 72 65 74 75 72  efore.**   retur
8580: 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 4c 47 4f  ning..**.** ALGO
8590: 52 49 54 48 4d 3a 0a 2a 2a 0a 2a 2a 20 20 20 69  RITHM:.**.**   i
85a0: 66 28 20 6e 6f 20 65 6e 74 72 79 20 65 78 69 73  f( no entry exis
85b0: 74 73 20 69 6e 20 73 71 6c 69 74 65 5f 6d 61 73  ts in sqlite_mas
85c0: 74 65 72 20 29 7b 0a 2a 2a 20 20 20 20 20 72 65  ter ){.**     re
85d0: 74 75 72 6e 20 52 42 55 5f 50 4b 5f 4e 4f 54 41  turn RBU_PK_NOTA
85e0: 42 4c 45 0a 2a 2a 20 20 20 7d 65 6c 73 65 20 69  BLE.**   }else i
85f0: 66 28 20 73 71 6c 20 66 6f 72 20 74 68 65 20 65  f( sql for the e
8600: 6e 74 72 79 20 73 74 61 72 74 73 20 77 69 74 68  ntry starts with
8610: 20 22 43 52 45 41 54 45 20 56 49 52 54 55 41 4c   "CREATE VIRTUAL
8620: 22 20 29 7b 0a 2a 2a 20 20 20 20 20 72 65 74 75  " ){.**     retu
8630: 72 6e 20 52 42 55 5f 50 4b 5f 56 54 41 42 0a 2a  rn RBU_PK_VTAB.*
8640: 2a 20 20 20 7d 65 6c 73 65 20 69 66 28 20 22 50  *   }else if( "P
8650: 52 41 47 4d 41 20 69 6e 64 65 78 5f 6c 69 73 74  RAGMA index_list
8660: 28 29 22 20 66 6f 72 20 74 68 65 20 74 61 62 6c  ()" for the tabl
8670: 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 22 70 6b  e contains a "pk
8680: 22 20 69 6e 64 65 78 20 29 7b 0a 2a 2a 20 20 20  " index ){.**   
8690: 20 20 69 66 28 20 74 68 65 20 69 6e 64 65 78 20    if( the index 
86a0: 74 68 61 74 20 69 73 20 74 68 65 20 70 6b 20 65  that is the pk e
86b0: 78 69 73 74 73 20 69 6e 20 73 71 6c 69 74 65 5f  xists in sqlite_
86c0: 6d 61 73 74 65 72 20 29 7b 0a 2a 2a 20 20 20 20  master ){.**    
86d0: 20 20 20 2a 70 69 50 4b 20 3d 20 72 6f 6f 74 70     *piPK = rootp
86e0: 61 67 65 20 6f 66 20 74 68 61 74 20 69 6e 64 65  age of that inde
86f0: 78 2e 0a 2a 2a 20 20 20 20 20 20 20 72 65 74 75  x..**       retu
8700: 72 6e 20 52 42 55 5f 50 4b 5f 45 58 54 45 52 4e  rn RBU_PK_EXTERN
8710: 41 4c 0a 2a 2a 20 20 20 20 20 7d 65 6c 73 65 7b  AL.**     }else{
8720: 0a 2a 2a 20 20 20 20 20 20 20 72 65 74 75 72 6e  .**       return
8730: 20 52 42 55 5f 50 4b 5f 57 49 54 48 4f 55 54 5f   RBU_PK_WITHOUT_
8740: 52 4f 57 49 44 0a 2a 2a 20 20 20 20 20 7d 0a 2a  ROWID.**     }.*
8750: 2a 20 20 20 7d 65 6c 73 65 20 69 66 28 20 22 50  *   }else if( "P
8760: 52 41 47 4d 41 20 74 61 62 6c 65 5f 69 6e 66 6f  RAGMA table_info
8770: 28 29 22 20 6c 69 73 74 73 20 6f 6e 65 20 6f 72  ()" lists one or
8780: 20 6d 6f 72 65 20 22 70 6b 22 20 63 6f 6c 75 6d   more "pk" colum
8790: 6e 73 20 29 7b 0a 2a 2a 20 20 20 20 20 72 65 74  ns ){.**     ret
87a0: 75 72 6e 20 52 42 55 5f 50 4b 5f 49 50 4b 0a 2a  urn RBU_PK_IPK.*
87b0: 2a 20 20 20 7d 65 6c 73 65 7b 0a 2a 2a 20 20 20  *   }else{.**   
87c0: 20 20 72 65 74 75 72 6e 20 52 42 55 5f 50 4b 5f    return RBU_PK_
87d0: 4e 4f 4e 45 0a 2a 2a 20 20 20 7d 0a 2a 2f 0a 73  NONE.**   }.*/.s
87e0: 74 61 74 69 63 20 76 6f 69 64 20 72 62 75 54 61  tatic void rbuTa
87f0: 62 6c 65 54 79 70 65 28 0a 20 20 73 71 6c 69 74  bleType(.  sqlit
8800: 65 33 72 62 75 20 2a 70 2c 0a 20 20 63 6f 6e 73  e3rbu *p,.  cons
8810: 74 20 63 68 61 72 20 2a 7a 54 61 62 2c 0a 20 20  t char *zTab,.  
8820: 69 6e 74 20 2a 70 65 54 79 70 65 2c 0a 20 20 69  int *peType,.  i
8830: 6e 74 20 2a 70 69 54 6e 75 6d 2c 0a 20 20 69 6e  nt *piTnum,.  in
8840: 74 20 2a 70 69 50 6b 0a 29 7b 0a 20 20 2f 2a 0a  t *piPk.){.  /*.
8850: 20 20 2a 2a 20 30 29 20 53 45 4c 45 43 54 20 63    ** 0) SELECT c
8860: 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 73 71 6c  ount(*) FROM sql
8870: 69 74 65 5f 6d 61 73 74 65 72 20 77 68 65 72 65  ite_master where
8880: 20 6e 61 6d 65 3d 25 51 20 41 4e 44 20 49 73 56   name=%Q AND IsV
8890: 69 72 74 75 61 6c 28 25 51 29 0a 20 20 2a 2a 20  irtual(%Q).  ** 
88a0: 31 29 20 50 52 41 47 4d 41 20 69 6e 64 65 78 5f  1) PRAGMA index_
88b0: 6c 69 73 74 20 3d 20 3f 0a 20 20 2a 2a 20 32 29  list = ?.  ** 2)
88c0: 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
88d0: 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73   FROM sqlite_mas
88e0: 74 65 72 20 77 68 65 72 65 20 6e 61 6d 65 3d 25  ter where name=%
88f0: 51 20 0a 20 20 2a 2a 20 33 29 20 50 52 41 47 4d  Q .  ** 3) PRAGM
8900: 41 20 74 61 62 6c 65 5f 69 6e 66 6f 20 3d 20 3f  A table_info = ?
8910: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  .  */.  sqlite3_
8920: 73 74 6d 74 20 2a 61 53 74 6d 74 5b 34 5d 20 3d  stmt *aStmt[4] =
8930: 20 7b 30 2c 20 30 2c 20 30 2c 20 30 7d 3b 0a 0a   {0, 0, 0, 0};..
8940: 20 20 2a 70 65 54 79 70 65 20 3d 20 52 42 55 5f    *peType = RBU_
8950: 50 4b 5f 4e 4f 54 41 42 4c 45 3b 0a 20 20 2a 70  PK_NOTABLE;.  *p
8960: 69 50 6b 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  iPk = 0;..  asse
8970: 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rt( p->rc==SQLIT
8980: 45 5f 4f 4b 20 29 3b 0a 20 20 70 2d 3e 72 63 20  E_OK );.  p->rc 
8990: 3d 20 70 72 65 70 61 72 65 46 72 65 65 41 6e 64  = prepareFreeAnd
89a0: 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e  CollectError(p->
89b0: 64 62 4d 61 69 6e 2c 20 26 61 53 74 6d 74 5b 30  dbMain, &aStmt[0
89c0: 5d 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 20  ], &p->zErrmsg, 
89d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72  .    sqlite3_mpr
89e0: 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20  intf(.          
89f0: 22 53 45 4c 45 43 54 20 28 73 71 6c 20 4c 49 4b  "SELECT (sql LIK
8a00: 45 20 27 63 72 65 61 74 65 20 76 69 72 74 75 61  E 'create virtua
8a10: 6c 25 25 27 29 2c 20 72 6f 6f 74 70 61 67 65 22  l%%'), rootpage"
8a20: 0a 20 20 20 20 20 20 20 20 20 20 22 20 20 46 52  .          "  FR
8a30: 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  OM sqlite_master
8a40: 22 0a 20 20 20 20 20 20 20 20 20 20 22 20 57 48  ".          " WH
8a50: 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c 20 7a 54  ERE name=%Q", zT
8a60: 61 62 0a 20 20 29 29 3b 0a 20 20 69 66 28 20 70  ab.  ));.  if( p
8a70: 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc!=SQLITE_OK 
8a80: 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  || sqlite3_step(
8a90: 61 53 74 6d 74 5b 30 5d 29 21 3d 53 51 4c 49 54  aStmt[0])!=SQLIT
8aa0: 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 2f 2a 20  E_ROW ){.    /* 
8ab0: 45 69 74 68 65 72 20 61 6e 20 65 72 72 6f 72 2c  Either an error,
8ac0: 20 6f 72 20 6e 6f 20 73 75 63 68 20 74 61 62 6c   or no such tabl
8ad0: 65 2e 20 2a 2f 0a 20 20 20 20 67 6f 74 6f 20 72  e. */.    goto r
8ae0: 62 75 54 61 62 6c 65 54 79 70 65 5f 65 6e 64 3b  buTableType_end;
8af0: 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
8b00: 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 61 53  e3_column_int(aS
8b10: 74 6d 74 5b 30 5d 2c 20 30 29 20 29 7b 0a 20 20  tmt[0], 0) ){.  
8b20: 20 20 2a 70 65 54 79 70 65 20 3d 20 52 42 55 5f    *peType = RBU_
8b30: 50 4b 5f 56 54 41 42 3b 20 20 20 20 20 20 20 20  PK_VTAB;        
8b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8b50: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f  virtual table */
8b60: 0a 20 20 20 20 67 6f 74 6f 20 72 62 75 54 61 62  .    goto rbuTab
8b70: 6c 65 54 79 70 65 5f 65 6e 64 3b 0a 20 20 7d 0a  leType_end;.  }.
8b80: 20 20 2a 70 69 54 6e 75 6d 20 3d 20 73 71 6c 69    *piTnum = sqli
8b90: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 61  te3_column_int(a
8ba0: 53 74 6d 74 5b 30 5d 2c 20 31 29 3b 0a 0a 20 20  Stmt[0], 1);..  
8bb0: 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65 46  p->rc = prepareF
8bc0: 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72  reeAndCollectErr
8bd0: 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 61  or(p->dbMain, &a
8be0: 53 74 6d 74 5b 31 5d 2c 20 26 70 2d 3e 7a 45 72  Stmt[1], &p->zEr
8bf0: 72 6d 73 67 2c 20 0a 20 20 20 20 73 71 6c 69 74  rmsg, .    sqlit
8c00: 65 33 5f 6d 70 72 69 6e 74 66 28 22 50 52 41 47  e3_mprintf("PRAG
8c10: 4d 41 20 69 6e 64 65 78 5f 6c 69 73 74 3d 25 51  MA index_list=%Q
8c20: 22 2c 7a 54 61 62 29 0a 20 20 29 3b 0a 20 20 69  ",zTab).  );.  i
8c30: 66 28 20 70 2d 3e 72 63 20 29 20 67 6f 74 6f 20  f( p->rc ) goto 
8c40: 72 62 75 54 61 62 6c 65 54 79 70 65 5f 65 6e 64  rbuTableType_end
8c50: 3b 0a 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74  ;.  while( sqlit
8c60: 65 33 5f 73 74 65 70 28 61 53 74 6d 74 5b 31 5d  e3_step(aStmt[1]
8c70: 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  )==SQLITE_ROW ){
8c80: 0a 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 7a  .    const u8 *z
8c90: 4f 72 69 67 20 3d 20 73 71 6c 69 74 65 33 5f 63  Orig = sqlite3_c
8ca0: 6f 6c 75 6d 6e 5f 74 65 78 74 28 61 53 74 6d 74  olumn_text(aStmt
8cb0: 5b 31 5d 2c 20 33 29 3b 0a 20 20 20 20 63 6f 6e  [1], 3);.    con
8cc0: 73 74 20 75 38 20 2a 7a 49 64 78 20 3d 20 73 71  st u8 *zIdx = sq
8cd0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
8ce0: 74 28 61 53 74 6d 74 5b 31 5d 2c 20 31 29 3b 0a  t(aStmt[1], 1);.
8cf0: 20 20 20 20 69 66 28 20 7a 4f 72 69 67 20 26 26      if( zOrig &&
8d00: 20 7a 49 64 78 20 26 26 20 7a 4f 72 69 67 5b 30   zIdx && zOrig[0
8d10: 5d 3d 3d 27 70 27 20 29 7b 0a 20 20 20 20 20 20  ]=='p' ){.      
8d20: 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65 46  p->rc = prepareF
8d30: 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72  reeAndCollectErr
8d40: 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 61  or(p->dbMain, &a
8d50: 53 74 6d 74 5b 32 5d 2c 20 26 70 2d 3e 7a 45 72  Stmt[2], &p->zEr
8d60: 72 6d 73 67 2c 20 0a 20 20 20 20 20 20 20 20 20  rmsg, .         
8d70: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
8d80: 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 53  (.            "S
8d90: 45 4c 45 43 54 20 72 6f 6f 74 70 61 67 65 20 46  ELECT rootpage F
8da0: 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
8db0: 72 20 57 48 45 52 45 20 6e 61 6d 65 20 3d 20 25  r WHERE name = %
8dc0: 51 22 2c 20 7a 49 64 78 0a 20 20 20 20 20 20 29  Q", zIdx.      )
8dd0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  );.      if( p->
8de0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
8df0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
8e00: 69 74 65 33 5f 73 74 65 70 28 61 53 74 6d 74 5b  ite3_step(aStmt[
8e10: 32 5d 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20  2])==SQLITE_ROW 
8e20: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 69  ){.          *pi
8e30: 50 6b 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  Pk = sqlite3_col
8e40: 75 6d 6e 5f 69 6e 74 28 61 53 74 6d 74 5b 32 5d  umn_int(aStmt[2]
8e50: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
8e60: 2a 70 65 54 79 70 65 20 3d 20 52 42 55 5f 50 4b  *peType = RBU_PK
8e70: 5f 45 58 54 45 52 4e 41 4c 3b 0a 20 20 20 20 20  _EXTERNAL;.     
8e80: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8e90: 20 20 20 20 2a 70 65 54 79 70 65 20 3d 20 52 42      *peType = RB
8ea0: 55 5f 50 4b 5f 57 49 54 48 4f 55 54 5f 52 4f 57  U_PK_WITHOUT_ROW
8eb0: 49 44 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ID;.        }.  
8ec0: 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f      }.      goto
8ed0: 20 72 62 75 54 61 62 6c 65 54 79 70 65 5f 65 6e   rbuTableType_en
8ee0: 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  d;.    }.  }..  
8ef0: 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65 46  p->rc = prepareF
8f00: 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72  reeAndCollectErr
8f10: 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 61  or(p->dbMain, &a
8f20: 53 74 6d 74 5b 33 5d 2c 20 26 70 2d 3e 7a 45 72  Stmt[3], &p->zEr
8f30: 72 6d 73 67 2c 20 0a 20 20 20 20 73 71 6c 69 74  rmsg, .    sqlit
8f40: 65 33 5f 6d 70 72 69 6e 74 66 28 22 50 52 41 47  e3_mprintf("PRAG
8f50: 4d 41 20 74 61 62 6c 65 5f 69 6e 66 6f 3d 25 51  MA table_info=%Q
8f60: 22 2c 7a 54 61 62 29 0a 20 20 29 3b 0a 20 20 69  ",zTab).  );.  i
8f70: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
8f80: 5f 4f 4b 20 29 7b 0a 20 20 20 20 77 68 69 6c 65  _OK ){.    while
8f90: 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 61  ( sqlite3_step(a
8fa0: 53 74 6d 74 5b 33 5d 29 3d 3d 53 51 4c 49 54 45  Stmt[3])==SQLITE
8fb0: 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 69 66  _ROW ){.      if
8fc0: 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  ( sqlite3_column
8fd0: 5f 69 6e 74 28 61 53 74 6d 74 5b 33 5d 2c 35 29  _int(aStmt[3],5)
8fe0: 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  >0 ){.        *p
8ff0: 65 54 79 70 65 20 3d 20 52 42 55 5f 50 4b 5f 49  eType = RBU_PK_I
9000: 50 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  PK;             
9010: 20 20 20 2f 2a 20 65 78 70 6c 69 63 69 74 20 49     /* explicit I
9020: 50 4b 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 20  PK column */.   
9030: 20 20 20 20 20 67 6f 74 6f 20 72 62 75 54 61 62       goto rbuTab
9040: 6c 65 54 79 70 65 5f 65 6e 64 3b 0a 20 20 20 20  leType_end;.    
9050: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70    }.    }.    *p
9060: 65 54 79 70 65 20 3d 20 52 42 55 5f 50 4b 5f 4e  eType = RBU_PK_N
9070: 4f 4e 45 3b 0a 20 20 7d 0a 0a 72 62 75 54 61 62  ONE;.  }..rbuTab
9080: 6c 65 54 79 70 65 5f 65 6e 64 3a 20 7b 0a 20 20  leType_end: {.  
9090: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
90a0: 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61  (i=0; i<sizeof(a
90b0: 53 74 6d 74 29 2f 73 69 7a 65 6f 66 28 61 53 74  Stmt)/sizeof(aSt
90c0: 6d 74 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20  mt[0]); i++){.  
90d0: 20 20 20 20 72 62 75 46 69 6e 61 6c 69 7a 65 28      rbuFinalize(
90e0: 70 2c 20 61 53 74 6d 74 5b 69 5d 29 3b 0a 20 20  p, aStmt[i]);.  
90f0: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
9100: 20 54 68 69 73 20 69 73 20 61 20 68 65 6c 70 65   This is a helpe
9110: 72 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 72  r function for r
9120: 62 75 4f 62 6a 49 74 65 72 43 61 63 68 65 54 61  buObjIterCacheTa
9130: 62 6c 65 49 6e 66 6f 28 29 2e 20 49 74 20 70 6f  bleInfo(). It po
9140: 70 75 6c 61 74 65 73 0a 2a 2a 20 74 68 65 20 70  pulates.** the p
9150: 49 74 65 72 2d 3e 61 62 49 6e 64 65 78 65 64 5b  Iter->abIndexed[
9160: 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74  ] array..*/.stat
9170: 69 63 20 76 6f 69 64 20 72 62 75 4f 62 6a 49 74  ic void rbuObjIt
9180: 65 72 43 61 63 68 65 49 6e 64 65 78 65 64 43 6f  erCacheIndexedCo
9190: 6c 73 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70  ls(sqlite3rbu *p
91a0: 2c 20 52 62 75 4f 62 6a 49 74 65 72 20 2a 70 49  , RbuObjIter *pI
91b0: 74 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  ter){.  sqlite3_
91c0: 73 74 6d 74 20 2a 70 4c 69 73 74 20 3d 20 30 3b  stmt *pList = 0;
91d0: 0a 20 20 69 6e 74 20 62 49 6e 64 65 78 20 3d 20  .  int bIndex = 
91e0: 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  0;..  if( p->rc=
91f0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
9200: 20 20 6d 65 6d 63 70 79 28 70 49 74 65 72 2d 3e    memcpy(pIter->
9210: 61 62 49 6e 64 65 78 65 64 2c 20 70 49 74 65 72  abIndexed, pIter
9220: 2d 3e 61 62 54 62 6c 50 6b 2c 20 73 69 7a 65 6f  ->abTblPk, sizeo
9230: 66 28 75 38 29 2a 70 49 74 65 72 2d 3e 6e 54 62  f(u8)*pIter->nTb
9240: 6c 43 6f 6c 29 3b 0a 20 20 20 20 70 2d 3e 72 63  lCol);.    p->rc
9250: 20 3d 20 70 72 65 70 61 72 65 46 72 65 65 41 6e   = prepareFreeAn
9260: 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d  dCollectError(p-
9270: 3e 64 62 4d 61 69 6e 2c 20 26 70 4c 69 73 74 2c  >dbMain, &pList,
9280: 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 0a 20 20   &p->zErrmsg,.  
9290: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70        sqlite3_mp
92a0: 72 69 6e 74 66 28 22 50 52 41 47 4d 41 20 6d 61  rintf("PRAGMA ma
92b0: 69 6e 2e 69 6e 64 65 78 5f 6c 69 73 74 20 3d 20  in.index_list = 
92c0: 25 51 22 2c 20 70 49 74 65 72 2d 3e 7a 54 62 6c  %Q", pIter->zTbl
92d0: 29 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20  ).    );.  }..  
92e0: 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51  while( p->rc==SQ
92f0: 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54  LITE_OK && SQLIT
9300: 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73  E_ROW==sqlite3_s
9310: 74 65 70 28 70 4c 69 73 74 29 20 29 7b 0a 20 20  tep(pList) ){.  
9320: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49    const char *zI
9330: 64 78 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  dx = (const char
9340: 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
9350: 5f 74 65 78 74 28 70 4c 69 73 74 2c 20 31 29 3b  _text(pList, 1);
9360: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  .    sqlite3_stm
9370: 74 20 2a 70 58 49 6e 66 6f 20 3d 20 30 3b 0a 20  t *pXInfo = 0;. 
9380: 20 20 20 69 66 28 20 7a 49 64 78 3d 3d 30 20 29     if( zIdx==0 )
9390: 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 2d 3e 72   break;.    p->r
93a0: 63 20 3d 20 70 72 65 70 61 72 65 46 72 65 65 41  c = prepareFreeA
93b0: 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70  ndCollectError(p
93c0: 2d 3e 64 62 4d 61 69 6e 2c 20 26 70 58 49 6e 66  ->dbMain, &pXInf
93d0: 6f 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 0a  o, &p->zErrmsg,.
93e0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
93f0: 6d 70 72 69 6e 74 66 28 22 50 52 41 47 4d 41 20  mprintf("PRAGMA 
9400: 6d 61 69 6e 2e 69 6e 64 65 78 5f 78 69 6e 66 6f  main.index_xinfo
9410: 20 3d 20 25 51 22 2c 20 7a 49 64 78 29 0a 20 20   = %Q", zIdx).  
9420: 20 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20    );.    while( 
9430: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
9440: 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d   && SQLITE_ROW==
9450: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 58 49  sqlite3_step(pXI
9460: 6e 66 6f 29 20 29 7b 0a 20 20 20 20 20 20 69 6e  nfo) ){.      in
9470: 74 20 69 43 69 64 20 3d 20 73 71 6c 69 74 65 33  t iCid = sqlite3
9480: 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 58 49 6e  _column_int(pXIn
9490: 66 6f 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66  fo, 1);.      if
94a0: 28 20 69 43 69 64 3e 3d 30 20 29 20 70 49 74 65  ( iCid>=0 ) pIte
94b0: 72 2d 3e 61 62 49 6e 64 65 78 65 64 5b 69 43 69  r->abIndexed[iCi
94c0: 64 5d 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  d] = 1;.    }.  
94d0: 20 20 72 62 75 46 69 6e 61 6c 69 7a 65 28 70 2c    rbuFinalize(p,
94e0: 20 70 58 49 6e 66 6f 29 3b 0a 20 20 20 20 62 49   pXInfo);.    bI
94f0: 6e 64 65 78 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20  ndex = 1;.  }.. 
9500: 20 72 62 75 46 69 6e 61 6c 69 7a 65 28 70 2c 20   rbuFinalize(p, 
9510: 70 4c 69 73 74 29 3b 0a 20 20 69 66 28 20 62 49  pList);.  if( bI
9520: 6e 64 65 78 3d 3d 30 20 29 20 70 49 74 65 72 2d  ndex==0 ) pIter-
9530: 3e 61 62 49 6e 64 65 78 65 64 20 3d 20 30 3b 0a  >abIndexed = 0;.
9540: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  }.../*.** If the
9550: 79 20 61 72 65 20 6e 6f 74 20 61 6c 72 65 61 64  y are not alread
9560: 79 20 70 6f 70 75 6c 61 74 65 64 2c 20 70 6f 70  y populated, pop
9570: 75 6c 61 74 65 20 74 68 65 20 70 49 74 65 72 2d  ulate the pIter-
9580: 3e 61 7a 54 62 6c 43 6f 6c 5b 5d 2c 0a 2a 2a 20  >azTblCol[],.** 
9590: 70 49 74 65 72 2d 3e 61 62 54 62 6c 50 6b 5b 5d  pIter->abTblPk[]
95a0: 2c 20 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c  , pIter->nTblCol
95b0: 20 61 6e 64 20 70 49 74 65 72 2d 3e 62 52 6f 77   and pIter->bRow
95c0: 69 64 20 76 61 72 69 61 62 6c 65 73 20 61 63 63  id variables acc
95d0: 6f 72 64 69 6e 67 20 74 6f 0a 2a 2a 20 74 68 65  ording to.** the
95e0: 20 74 61 62 6c 65 20 28 6e 6f 74 20 69 6e 64 65   table (not inde
95f0: 78 29 20 74 68 61 74 20 74 68 65 20 69 74 65 72  x) that the iter
9600: 61 74 6f 72 20 63 75 72 72 65 6e 74 6c 79 20 70  ator currently p
9610: 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20  oints to..**.** 
9620: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
9630: 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   if successful, 
9640: 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  or an SQLite err
9650: 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73  or code otherwis
9660: 65 2e 20 49 66 0a 2a 2a 20 61 6e 20 65 72 72 6f  e. If.** an erro
9670: 72 20 64 6f 65 73 20 6f 63 63 75 72 2c 20 61 6e  r does occur, an
9680: 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20   error code and 
9690: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 61 72  error message ar
96a0: 65 20 61 6c 73 6f 20 6c 65 66 74 20 69 6e 20 0a  e also left in .
96b0: 2a 2a 20 74 68 65 20 52 42 55 20 68 61 6e 64 6c  ** the RBU handl
96c0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
96d0: 20 72 62 75 4f 62 6a 49 74 65 72 43 61 63 68 65   rbuObjIterCache
96e0: 54 61 62 6c 65 49 6e 66 6f 28 73 71 6c 69 74 65  TableInfo(sqlite
96f0: 33 72 62 75 20 2a 70 2c 20 52 62 75 4f 62 6a 49  3rbu *p, RbuObjI
9700: 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69  ter *pIter){.  i
9710: 66 28 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43  f( pIter->azTblC
9720: 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ol==0 ){.    sql
9730: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
9740: 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 43   = 0;.    int nC
9750: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  ol = 0;.    int 
9760: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
9770: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6f 72            /* for
9780: 28 29 20 6c 6f 6f 70 20 69 74 65 72 61 74 6f 72  () loop iterator
9790: 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20   variable */.   
97a0: 20 69 6e 74 20 62 52 62 75 52 6f 77 69 64 20 3d   int bRbuRowid =
97b0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   0;            /
97c0: 2a 20 49 66 20 69 6e 70 75 74 20 74 61 62 6c 65  * If input table
97d0: 20 68 61 73 20 63 6f 6c 75 6d 6e 20 22 72 62 75   has column "rbu
97e0: 5f 72 6f 77 69 64 22 20 2a 2f 0a 20 20 20 20 69  _rowid" */.    i
97f0: 6e 74 20 69 4f 72 64 65 72 20 3d 20 30 3b 0a 20  nt iOrder = 0;. 
9800: 20 20 20 69 6e 74 20 69 54 6e 75 6d 20 3d 20 30     int iTnum = 0
9810: 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65  ;..    /* Figure
9820: 20 6f 75 74 20 74 68 65 20 74 79 70 65 20 6f 66   out the type of
9830: 20 74 61 62 6c 65 20 74 68 69 73 20 73 74 65 70   table this step
9840: 20 77 69 6c 6c 20 64 65 61 6c 20 77 69 74 68 2e   will deal with.
9850: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
9860: 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 30 20  pIter->eType==0 
9870: 29 3b 0a 20 20 20 20 72 62 75 54 61 62 6c 65 54  );.    rbuTableT
9880: 79 70 65 28 70 2c 20 70 49 74 65 72 2d 3e 7a 54  ype(p, pIter->zT
9890: 62 6c 2c 20 26 70 49 74 65 72 2d 3e 65 54 79 70  bl, &pIter->eTyp
98a0: 65 2c 20 26 69 54 6e 75 6d 2c 20 26 70 49 74 65  e, &iTnum, &pIte
98b0: 72 2d 3e 69 50 6b 54 6e 75 6d 29 3b 0a 20 20 20  r->iPkTnum);.   
98c0: 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
98d0: 54 45 5f 4f 4b 20 26 26 20 70 49 74 65 72 2d 3e  TE_OK && pIter->
98e0: 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 4e 4f  eType==RBU_PK_NO
98f0: 54 41 42 4c 45 20 29 7b 0a 20 20 20 20 20 20 70  TABLE ){.      p
9900: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52  ->rc = SQLITE_ER
9910: 52 4f 52 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 45  ROR;.      p->zE
9920: 72 72 6d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f  rrmsg = sqlite3_
9930: 6d 70 72 69 6e 74 66 28 22 6e 6f 20 73 75 63 68  mprintf("no such
9940: 20 74 61 62 6c 65 3a 20 25 73 22 2c 20 70 49 74   table: %s", pIt
9950: 65 72 2d 3e 7a 54 62 6c 29 3b 0a 20 20 20 20 7d  er->zTbl);.    }
9960: 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 20 29  .    if( p->rc )
9970: 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 3b 0a 20   return p->rc;. 
9980: 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 7a 49     if( pIter->zI
9990: 64 78 3d 3d 30 20 29 20 70 49 74 65 72 2d 3e 69  dx==0 ) pIter->i
99a0: 54 6e 75 6d 20 3d 20 69 54 6e 75 6d 3b 0a 0a 20  Tnum = iTnum;.. 
99b0: 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72     assert( pIter
99c0: 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f  ->eType==RBU_PK_
99d0: 4e 4f 4e 45 20 7c 7c 20 70 49 74 65 72 2d 3e 65  NONE || pIter->e
99e0: 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 49 50 4b  Type==RBU_PK_IPK
99f0: 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 49   .         || pI
9a00: 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f  ter->eType==RBU_
9a10: 50 4b 5f 45 58 54 45 52 4e 41 4c 20 7c 7c 20 70  PK_EXTERNAL || p
9a20: 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55  Iter->eType==RBU
9a30: 5f 50 4b 5f 57 49 54 48 4f 55 54 5f 52 4f 57 49  _PK_WITHOUT_ROWI
9a40: 44 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 49  D.         || pI
9a50: 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f  ter->eType==RBU_
9a60: 50 4b 5f 56 54 41 42 0a 20 20 20 20 29 3b 0a 0a  PK_VTAB.    );..
9a70: 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20      /* Populate 
9a80: 74 68 65 20 61 7a 54 62 6c 43 6f 6c 5b 5d 20 61  the azTblCol[] a
9a90: 6e 64 20 6e 54 62 6c 43 6f 6c 20 76 61 72 69 61  nd nTblCol varia
9aa0: 62 6c 65 73 20 62 61 73 65 64 20 6f 6e 20 74 68  bles based on th
9ab0: 65 20 63 6f 6c 75 6d 6e 73 0a 20 20 20 20 2a 2a  e columns.    **
9ac0: 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 74 61   of the input ta
9ad0: 62 6c 65 2e 20 49 67 6e 6f 72 65 20 61 6e 79 20  ble. Ignore any 
9ae0: 69 6e 70 75 74 20 74 61 62 6c 65 20 63 6f 6c 75  input table colu
9af0: 6d 6e 73 20 74 68 61 74 20 62 65 67 69 6e 20 77  mns that begin w
9b00: 69 74 68 0a 20 20 20 20 2a 2a 20 22 72 62 75 5f  ith.    ** "rbu_
9b10: 22 2e 20 20 2a 2f 0a 20 20 20 20 70 2d 3e 72 63  ".  */.    p->rc
9b20: 20 3d 20 70 72 65 70 61 72 65 46 72 65 65 41 6e   = prepareFreeAn
9b30: 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d  dCollectError(p-
9b40: 3e 64 62 52 62 75 2c 20 26 70 53 74 6d 74 2c 20  >dbRbu, &pStmt, 
9b50: 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 20 0a 20 20  &p->zErrmsg, .  
9b60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70        sqlite3_mp
9b70: 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20 2a 20  rintf("SELECT * 
9b80: 46 52 4f 4d 20 27 25 71 27 22 2c 20 70 49 74 65  FROM '%q'", pIte
9b90: 72 2d 3e 7a 44 61 74 61 54 62 6c 29 0a 20 20 20  r->zDataTbl).   
9ba0: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72   );.    if( p->r
9bb0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
9bc0: 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 73 71 6c        nCol = sql
9bd0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e  ite3_column_coun
9be0: 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  t(pStmt);.      
9bf0: 72 62 75 41 6c 6c 6f 63 61 74 65 49 74 65 72 41  rbuAllocateIterA
9c00: 72 72 61 79 73 28 70 2c 20 70 49 74 65 72 2c 20  rrays(p, pIter, 
9c10: 6e 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  nCol);.    }.   
9c20: 20 66 6f 72 28 69 3d 30 3b 20 70 2d 3e 72 63 3d   for(i=0; p->rc=
9c30: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
9c40: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
9c50: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
9c60: 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ame = (const cha
9c70: 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
9c80: 6e 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 20 69 29  n_name(pStmt, i)
9c90: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
9ca0: 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 22 72 62  te3_strnicmp("rb
9cb0: 75 5f 22 2c 20 7a 4e 61 6d 65 2c 20 34 29 20 29  u_", zName, 4) )
9cc0: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
9cd0: 7a 43 6f 70 79 20 3d 20 72 62 75 53 74 72 6e 64  zCopy = rbuStrnd
9ce0: 75 70 28 7a 4e 61 6d 65 2c 20 26 70 2d 3e 72 63  up(zName, &p->rc
9cf0: 29 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65 72  );.        pIter
9d00: 2d 3e 61 69 53 72 63 4f 72 64 65 72 5b 70 49 74  ->aiSrcOrder[pIt
9d10: 65 72 2d 3e 6e 54 62 6c 43 6f 6c 5d 20 3d 20 70  er->nTblCol] = p
9d20: 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 3b 0a 20  Iter->nTblCol;. 
9d30: 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 61 7a         pIter->az
9d40: 54 62 6c 43 6f 6c 5b 70 49 74 65 72 2d 3e 6e 54  TblCol[pIter->nT
9d50: 62 6c 43 6f 6c 2b 2b 5d 20 3d 20 7a 43 6f 70 79  blCol++] = zCopy
9d60: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9d70: 65 6c 73 65 20 69 66 28 20 30 3d 3d 73 71 6c 69  else if( 0==sqli
9d80: 74 65 33 5f 73 74 72 69 63 6d 70 28 22 72 62 75  te3_stricmp("rbu
9d90: 5f 72 6f 77 69 64 22 2c 20 7a 4e 61 6d 65 29 20  _rowid", zName) 
9da0: 29 7b 0a 20 20 20 20 20 20 20 20 62 52 62 75 52  ){.        bRbuR
9db0: 6f 77 69 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  owid = 1;.      
9dc0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
9dd0: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
9de0: 6d 74 29 3b 0a 20 20 20 20 70 53 74 6d 74 20 3d  mt);.    pStmt =
9df0: 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e   0;..    if( p->
9e00: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  rc==SQLITE_OK.  
9e10: 20 20 20 26 26 20 62 52 62 75 52 6f 77 69 64 21     && bRbuRowid!
9e20: 3d 28 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d  =(pIter->eType==
9e30: 52 42 55 5f 50 4b 5f 56 54 41 42 20 7c 7c 20 70  RBU_PK_VTAB || p
9e40: 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55  Iter->eType==RBU
9e50: 5f 50 4b 5f 4e 4f 4e 45 29 0a 20 20 20 20 29 7b  _PK_NONE).    ){
9e60: 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  .      p->rc = S
9e70: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
9e80: 20 20 20 70 2d 3e 7a 45 72 72 6d 73 67 20 3d 20     p->zErrmsg = 
9e90: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
9ea0: 0a 20 20 20 20 20 20 20 20 20 20 22 74 61 62 6c  .          "tabl
9eb0: 65 20 25 71 20 25 73 20 72 62 75 5f 72 6f 77 69  e %q %s rbu_rowi
9ec0: 64 20 63 6f 6c 75 6d 6e 22 2c 20 70 49 74 65 72  d column", pIter
9ed0: 2d 3e 7a 44 61 74 61 54 62 6c 2c 0a 20 20 20 20  ->zDataTbl,.    
9ee0: 20 20 20 20 20 20 28 62 52 62 75 52 6f 77 69 64        (bRbuRowid
9ef0: 20 3f 20 22 6d 61 79 20 6e 6f 74 20 68 61 76 65   ? "may not have
9f00: 22 20 3a 20 22 72 65 71 75 69 72 65 73 22 29 0a  " : "requires").
9f10: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a        );.    }..
9f20: 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61      /* Check tha
9f30: 74 20 61 6c 6c 20 6e 6f 6e 2d 48 49 44 44 45 4e  t all non-HIDDEN
9f40: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
9f50: 64 65 73 74 69 6e 61 74 69 6f 6e 20 74 61 62 6c  destination tabl
9f60: 65 20 61 72 65 20 61 6c 73 6f 0a 20 20 20 20 2a  e are also.    *
9f70: 2a 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65  * present in the
9f80: 20 69 6e 70 75 74 20 74 61 62 6c 65 2e 20 50 6f   input table. Po
9f90: 70 75 6c 61 74 65 20 74 68 65 20 61 62 54 62 6c  pulate the abTbl
9fa0: 50 6b 5b 5d 2c 20 61 7a 54 62 6c 54 79 70 65 5b  Pk[], azTblType[
9fb0: 5d 20 61 6e 64 0a 20 20 20 20 2a 2a 20 61 69 54  ] and.    ** aiT
9fc0: 62 6c 4f 72 64 65 72 5b 5d 20 61 72 72 61 79 73  blOrder[] arrays
9fd0: 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d   at the same tim
9fe0: 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  e.  */.    if( p
9ff0: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
a000: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  ){.      p->rc =
a010: 20 70 72 65 70 61 72 65 46 72 65 65 41 6e 64 43   prepareFreeAndC
a020: 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64  ollectError(p->d
a030: 62 4d 61 69 6e 2c 20 26 70 53 74 6d 74 2c 20 26  bMain, &pStmt, &
a040: 70 2d 3e 7a 45 72 72 6d 73 67 2c 20 0a 20 20 20  p->zErrmsg, .   
a050: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d         sqlite3_m
a060: 70 72 69 6e 74 66 28 22 50 52 41 47 4d 41 20 74  printf("PRAGMA t
a070: 61 62 6c 65 5f 69 6e 66 6f 28 25 51 29 22 2c 20  able_info(%Q)", 
a080: 70 49 74 65 72 2d 3e 7a 54 62 6c 29 0a 20 20 20  pIter->zTbl).   
a090: 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20     );.    }.    
a0a0: 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51  while( p->rc==SQ
a0b0: 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54  LITE_OK && SQLIT
a0c0: 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73  E_ROW==sqlite3_s
a0d0: 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20  tep(pStmt) ){.  
a0e0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
a0f0: 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63  zName = (const c
a100: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
a110: 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  umn_text(pStmt, 
a120: 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 4e  1);.      if( zN
a130: 61 6d 65 3d 3d 30 20 29 20 62 72 65 61 6b 3b 20  ame==0 ) break; 
a140: 20 2f 2a 20 41 6e 20 4f 4f 4d 20 2d 20 66 69 6e   /* An OOM - fin
a150: 61 6c 69 7a 65 28 29 20 62 65 6c 6f 77 20 72 65  alize() below re
a160: 74 75 72 6e 73 20 53 5f 4e 4f 4d 45 4d 20 2a 2f  turns S_NOMEM */
a170: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 69 4f 72  .      for(i=iOr
a180: 64 65 72 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 54  der; i<pIter->nT
a190: 62 6c 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  blCol; i++){.   
a1a0: 20 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63       if( 0==strc
a1b0: 6d 70 28 7a 4e 61 6d 65 2c 20 70 49 74 65 72 2d  mp(zName, pIter-
a1c0: 3e 61 7a 54 62 6c 43 6f 6c 5b 69 5d 29 20 29 20  >azTblCol[i]) ) 
a1d0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
a1e0: 20 20 20 20 20 69 66 28 20 69 3d 3d 70 49 74 65       if( i==pIte
a1f0: 72 2d 3e 6e 54 62 6c 43 6f 6c 20 29 7b 0a 20 20  r->nTblCol ){.  
a200: 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51        p->rc = SQ
a210: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
a220: 20 20 20 20 70 2d 3e 7a 45 72 72 6d 73 67 20 3d      p->zErrmsg =
a230: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
a240: 28 22 63 6f 6c 75 6d 6e 20 6d 69 73 73 69 6e 67  ("column missing
a250: 20 66 72 6f 6d 20 25 71 3a 20 25 73 22 2c 0a 20   from %q: %s",. 
a260: 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72             pIter
a270: 2d 3e 7a 44 61 74 61 54 62 6c 2c 20 7a 4e 61 6d  ->zDataTbl, zNam
a280: 65 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  e.        );.   
a290: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a2a0: 20 20 69 6e 74 20 69 50 6b 20 3d 20 73 71 6c 69    int iPk = sqli
a2b0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
a2c0: 53 74 6d 74 2c 20 35 29 3b 0a 20 20 20 20 20 20  Stmt, 5);.      
a2d0: 20 20 69 6e 74 20 62 4e 6f 74 4e 75 6c 6c 20 3d    int bNotNull =
a2e0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
a2f0: 69 6e 74 28 70 53 74 6d 74 2c 20 33 29 3b 0a 20  int(pStmt, 3);. 
a300: 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
a310: 72 20 2a 7a 54 79 70 65 20 3d 20 28 63 6f 6e 73  r *zType = (cons
a320: 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
a330: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d  column_text(pStm
a340: 74 2c 20 32 29 3b 0a 0a 20 20 20 20 20 20 20 20  t, 2);..        
a350: 69 66 28 20 69 21 3d 69 4f 72 64 65 72 20 29 7b  if( i!=iOrder ){
a360: 0a 20 20 20 20 20 20 20 20 20 20 53 57 41 50 28  .          SWAP(
a370: 69 6e 74 2c 20 70 49 74 65 72 2d 3e 61 69 53 72  int, pIter->aiSr
a380: 63 4f 72 64 65 72 5b 69 5d 2c 20 70 49 74 65 72  cOrder[i], pIter
a390: 2d 3e 61 69 53 72 63 4f 72 64 65 72 5b 69 4f 72  ->aiSrcOrder[iOr
a3a0: 64 65 72 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  der]);.         
a3b0: 20 53 57 41 50 28 63 68 61 72 2a 2c 20 70 49 74   SWAP(char*, pIt
a3c0: 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69 5d 2c  er->azTblCol[i],
a3d0: 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c   pIter->azTblCol
a3e0: 5b 69 4f 72 64 65 72 5d 29 3b 0a 20 20 20 20 20  [iOrder]);.     
a3f0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 70 49     }..        pI
a400: 74 65 72 2d 3e 61 7a 54 62 6c 54 79 70 65 5b 69  ter->azTblType[i
a410: 4f 72 64 65 72 5d 20 3d 20 72 62 75 53 74 72 6e  Order] = rbuStrn
a420: 64 75 70 28 7a 54 79 70 65 2c 20 26 70 2d 3e 72  dup(zType, &p->r
a430: 63 29 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65  c);.        pIte
a440: 72 2d 3e 61 62 54 62 6c 50 6b 5b 69 4f 72 64 65  r->abTblPk[iOrde
a450: 72 5d 20 3d 20 28 69 50 6b 21 3d 30 29 3b 0a 20  r] = (iPk!=0);. 
a460: 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 61 62         pIter->ab
a470: 4e 6f 74 4e 75 6c 6c 5b 69 4f 72 64 65 72 5d 20  NotNull[iOrder] 
a480: 3d 20 28 75 38 29 62 4e 6f 74 4e 75 6c 6c 20 7c  = (u8)bNotNull |
a490: 7c 20 28 69 50 6b 21 3d 30 29 3b 0a 20 20 20 20  | (iPk!=0);.    
a4a0: 20 20 20 20 69 4f 72 64 65 72 2b 2b 3b 0a 20 20      iOrder++;.  
a4b0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
a4c0: 20 72 62 75 46 69 6e 61 6c 69 7a 65 28 70 2c 20   rbuFinalize(p, 
a4d0: 70 53 74 6d 74 29 3b 0a 20 20 20 20 72 62 75 4f  pStmt);.    rbuO
a4e0: 62 6a 49 74 65 72 43 61 63 68 65 49 6e 64 65 78  bjIterCacheIndex
a4f0: 65 64 43 6f 6c 73 28 70 2c 20 70 49 74 65 72 29  edCols(p, pIter)
a500: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
a510: 74 65 72 2d 3e 65 54 79 70 65 21 3d 52 42 55 5f  ter->eType!=RBU_
a520: 50 4b 5f 56 54 41 42 20 7c 7c 20 70 49 74 65 72  PK_VTAB || pIter
a530: 2d 3e 61 62 49 6e 64 65 78 65 64 3d 3d 30 20 29  ->abIndexed==0 )
a540: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
a550: 70 2d 3e 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  p->rc;.}../*.** 
a560: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f  This function co
a570: 6e 73 74 72 75 63 74 73 20 61 6e 64 20 72 65 74  nstructs and ret
a580: 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  urns a pointer t
a590: 6f 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  o a nul-terminat
a5a0: 65 64 20 0a 2a 2a 20 73 74 72 69 6e 67 20 63 6f  ed .** string co
a5b0: 6e 74 61 69 6e 69 6e 67 20 73 6f 6d 65 20 53 51  ntaining some SQ
a5c0: 4c 20 63 6c 61 75 73 65 20 6f 72 20 6c 69 73 74  L clause or list
a5d0: 20 62 61 73 65 64 20 6f 6e 20 6f 6e 65 20 6f 72   based on one or
a5e0: 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 0a 2a 2a   more of the .**
a5f0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 63 75   column names cu
a600: 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69  rrently stored i
a610: 6e 20 74 68 65 20 70 49 74 65 72 2d 3e 61 7a 54  n the pIter->azT
a620: 62 6c 43 6f 6c 5b 5d 20 61 72 72 61 79 2e 0a 2a  blCol[] array..*
a630: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 72  /.static char *r
a640: 62 75 4f 62 6a 49 74 65 72 47 65 74 43 6f 6c 6c  buObjIterGetColl
a650: 69 73 74 28 0a 20 20 73 71 6c 69 74 65 33 72 62  ist(.  sqlite3rb
a660: 75 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  u *p,           
a670: 20 20 20 20 20 20 20 2f 2a 20 52 42 55 20 6f 62         /* RBU ob
a680: 6a 65 63 74 20 2a 2f 0a 20 20 52 62 75 4f 62 6a  ject */.  RbuObj
a690: 49 74 65 72 20 2a 70 49 74 65 72 20 20 20 20 20  Iter *pIter     
a6a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a            /* Obj
a6b0: 65 63 74 20 69 74 65 72 61 74 6f 72 20 66 6f 72  ect iterator for
a6c0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f   column names */
a6d0: 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4c 69 73  .){.  char *zLis
a6e0: 74 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 63  t = 0;.  const c
a6f0: 68 61 72 20 2a 7a 53 65 70 20 3d 20 22 22 3b 0a  har *zSep = "";.
a700: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
a710: 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 54 62  =0; i<pIter->nTb
a720: 6c 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lCol; i++){.    
a730: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
a740: 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b  pIter->azTblCol[
a750: 69 5d 3b 0a 20 20 20 20 7a 4c 69 73 74 20 3d 20  i];.    zList = 
a760: 72 62 75 4d 50 72 69 6e 74 66 28 70 2c 20 22 25  rbuMPrintf(p, "%
a770: 7a 25 73 5c 22 25 77 5c 22 22 2c 20 7a 4c 69 73  z%s\"%w\"", zLis
a780: 74 2c 20 7a 53 65 70 2c 20 7a 29 3b 0a 20 20 20  t, zSep, z);.   
a790: 20 7a 53 65 70 20 3d 20 22 2c 20 22 3b 0a 20 20   zSep = ", ";.  
a7a0: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4c 69 73 74  }.  return zList
a7b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
a7c0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
a7d0: 20 74 6f 20 63 72 65 61 74 65 20 61 20 53 45 4c   to create a SEL
a7e0: 45 43 54 20 6c 69 73 74 20 28 74 68 65 20 6c 69  ECT list (the li
a7f0: 73 74 20 6f 66 20 53 51 4c 20 0a 2a 2a 20 65 78  st of SQL .** ex
a800: 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 66  pressions that f
a810: 6f 6c 6c 6f 77 73 20 61 20 53 45 4c 45 43 54 20  ollows a SELECT 
a820: 6b 65 79 77 6f 72 64 29 20 66 6f 72 20 61 20 53  keyword) for a S
a830: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
a840: 0a 2a 2a 20 75 73 65 64 20 74 6f 20 72 65 61 64  .** used to read
a850: 20 66 72 6f 6d 20 61 6e 20 64 61 74 61 5f 78 78   from an data_xx
a860: 78 20 6f 72 20 72 62 75 5f 74 6d 70 5f 78 78 78  x or rbu_tmp_xxx
a870: 20 74 61 62 6c 65 20 77 68 69 6c 65 20 75 70 64   table while upd
a880: 61 74 69 6e 67 20 74 68 65 20 0a 2a 2a 20 69 6e  ating the .** in
a890: 64 65 78 20 6f 62 6a 65 63 74 20 63 75 72 72 65  dex object curre
a8a0: 6e 74 6c 79 20 69 6e 64 69 63 61 74 65 64 20 62  ntly indicated b
a8b0: 79 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 6f  y the iterator o
a8c0: 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20  bject passed as 
a8d0: 74 68 65 20 0a 2a 2a 20 73 65 63 6f 6e 64 20 61  the .** second a
a8e0: 72 67 75 6d 65 6e 74 2e 20 41 20 22 50 52 41 47  rgument. A "PRAG
a8f0: 4d 41 20 69 6e 64 65 78 5f 78 69 6e 66 6f 20 3d  MA index_xinfo =
a900: 20 3c 69 64 78 6e 61 6d 65 3e 22 20 73 74 61 74   <idxname>" stat
a910: 65 6d 65 6e 74 20 69 73 20 75 73 65 64 20 0a 2a  ement is used .*
a920: 2a 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20  * to obtain the 
a930: 72 65 71 75 69 72 65 64 20 69 6e 66 6f 72 6d 61  required informa
a940: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  tion..**.** If t
a950: 68 65 20 69 6e 64 65 78 20 69 73 20 6f 66 20 74  he index is of t
a960: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72  he following for
a970: 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54  m:.**.**   CREAT
a980: 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31  E INDEX i1 ON t1
a990: 28 63 2c 20 62 20 43 4f 4c 4c 41 54 45 20 6e 6f  (c, b COLLATE no
a9a0: 63 61 73 65 29 3b 0a 2a 2a 0a 2a 2a 20 61 6e 64  case);.**.** and
a9b0: 20 22 74 31 22 20 69 73 20 61 20 74 61 62 6c 65   "t1" is a table
a9c0: 20 77 69 74 68 20 61 6e 20 65 78 70 6c 69 63 69   with an explici
a9d0: 74 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  t INTEGER PRIMAR
a9e0: 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 0a 2a 2a  Y KEY column .**
a9f0: 20 22 69 70 6b 22 2c 20 74 68 65 20 72 65 74 75   "ipk", the retu
aa00: 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73 3a 0a  rned string is:.
aa10: 2a 2a 0a 2a 2a 20 20 20 22 60 63 60 20 43 4f 4c  **.**   "`c` COL
aa20: 4c 41 54 45 20 27 42 49 4e 41 52 59 27 2c 20 60  LATE 'BINARY', `
aa30: 62 60 20 43 4f 4c 4c 41 54 45 20 27 4e 4f 43 41  b` COLLATE 'NOCA
aa40: 53 45 27 2c 20 60 69 70 6b 60 20 43 4f 4c 4c 41  SE', `ipk` COLLA
aa50: 54 45 20 27 42 49 4e 41 52 59 27 22 0a 2a 2a 0a  TE 'BINARY'".**.
aa60: 2a 2a 20 41 73 20 77 65 6c 6c 20 61 73 20 74 68  ** As well as th
aa70: 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e  e returned strin
aa80: 67 2c 20 74 68 72 65 65 20 6f 74 68 65 72 20 6d  g, three other m
aa90: 61 6c 6c 6f 63 27 64 20 73 74 72 69 6e 67 73 20  alloc'd strings 
aaa0: 61 72 65 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64  are .** returned
aab0: 20 76 69 61 20 6f 75 74 70 75 74 20 70 61 72 61   via output para
aac0: 6d 65 74 65 72 73 2e 20 41 73 20 66 6f 6c 6c 6f  meters. As follo
aad0: 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 70 7a 49 6d  ws:.**.**   pzIm
aae0: 70 6f 73 74 65 72 43 6f 6c 73 3a 20 2e 2e 2e 0a  posterCols: ....
aaf0: 2a 2a 20 20 20 70 7a 49 6d 70 6f 73 74 65 72 50  **   pzImposterP
ab00: 6b 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 70 7a 57 68  k: ....**   pzWh
ab10: 65 72 65 3a 20 2e 2e 2e 0a 2a 2f 0a 73 74 61 74  ere: ....*/.stat
ab20: 69 63 20 63 68 61 72 20 2a 72 62 75 4f 62 6a 49  ic char *rbuObjI
ab30: 74 65 72 47 65 74 49 6e 64 65 78 43 6f 6c 73 28  terGetIndexCols(
ab40: 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20 2a 70  .  sqlite3rbu *p
ab50: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
ab60: 20 20 20 2f 2a 20 52 42 55 20 6f 62 6a 65 63 74     /* RBU object
ab70: 20 2a 2f 0a 20 20 52 62 75 4f 62 6a 49 74 65 72   */.  RbuObjIter
ab80: 20 2a 70 49 74 65 72 2c 20 20 20 20 20 20 20 20   *pIter,        
ab90: 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20        /* Object 
aba0: 69 74 65 72 61 74 6f 72 20 66 6f 72 20 63 6f 6c  iterator for col
abb0: 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 63  umn names */.  c
abc0: 68 61 72 20 2a 2a 70 7a 49 6d 70 6f 73 74 65 72  har **pzImposter
abd0: 43 6f 6c 73 2c 20 20 20 20 20 20 20 20 20 20 2f  Cols,          /
abe0: 2a 20 4f 55 54 3a 20 43 6f 6c 75 6d 6e 73 20 66  * OUT: Columns f
abf0: 6f 72 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c  or imposter tabl
ac00: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a  e */.  char **pz
ac10: 49 6d 70 6f 73 74 65 72 50 6b 2c 20 20 20 20 20  ImposterPk,     
ac20: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 49         /* OUT: I
ac30: 6d 70 6f 73 74 65 72 20 50 4b 20 63 6c 61 75 73  mposter PK claus
ac40: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a  e */.  char **pz
ac50: 57 68 65 72 65 2c 20 20 20 20 20 20 20 20 20 20  Where,          
ac60: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 57         /* OUT: W
ac70: 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
ac80: 20 69 6e 74 20 2a 70 6e 42 69 6e 64 20 20 20 20   int *pnBind    
ac90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aca0: 20 2f 2a 20 4f 55 54 3a 20 54 72 62 75 6c 20 6e   /* OUT: Trbul n
acb0: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
acc0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
acd0: 3d 20 70 2d 3e 72 63 3b 20 20 20 20 20 20 20 20  = p->rc;        
ace0: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f           /* Erro
acf0: 72 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  r code */.  int 
ad00: 72 63 32 3b 20 20 20 20 20 20 20 20 20 20 20 20  rc2;            
ad10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
ad20: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
ad30: 29 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  ) return code */
ad40: 0a 20 20 63 68 61 72 20 2a 7a 52 65 74 20 3d 20  .  char *zRet = 
ad50: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
ad60: 20 20 20 2f 2a 20 53 74 72 69 6e 67 20 74 6f 20     /* String to 
ad70: 72 65 74 75 72 6e 20 2a 2f 0a 20 20 63 68 61 72  return */.  char
ad80: 20 2a 7a 49 6d 70 43 6f 6c 73 20 3d 20 30 3b 20   *zImpCols = 0; 
ad90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
ada0: 74 72 69 6e 67 20 74 6f 20 72 65 74 75 72 6e 20  tring to return 
adb0: 76 69 61 20 2a 70 7a 49 6d 70 6f 73 74 65 72 43  via *pzImposterC
adc0: 6f 6c 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ols */.  char *z
add0: 49 6d 70 50 4b 20 3d 20 30 3b 20 20 20 20 20 20  ImpPK = 0;      
ade0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 72 69           /* Stri
adf0: 6e 67 20 74 6f 20 72 65 74 75 72 6e 20 76 69 61  ng to return via
ae00: 20 2a 70 7a 49 6d 70 6f 73 74 65 72 50 4b 20 2a   *pzImposterPK *
ae10: 2f 0a 20 20 63 68 61 72 20 2a 7a 57 68 65 72 65  /.  char *zWhere
ae20: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
ae30: 20 20 20 20 2f 2a 20 53 74 72 69 6e 67 20 74 6f      /* String to
ae40: 20 72 65 74 75 72 6e 20 76 69 61 20 2a 70 7a 57   return via *pzW
ae50: 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  here */.  int nB
ae60: 69 6e 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ind = 0;        
ae70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
ae80: 75 65 20 74 6f 20 72 65 74 75 72 6e 20 76 69 61  ue to return via
ae90: 20 2a 70 6e 42 69 6e 64 20 2a 2f 0a 20 20 63 6f   *pnBind */.  co
aea0: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6d 20 3d  nst char *zCom =
aeb0: 20 22 22 3b 20 20 20 20 20 20 20 20 20 20 2f 2a   "";          /*
aec0: 20 53 65 74 20 74 6f 20 22 2c 20 22 20 6c 61 74   Set to ", " lat
aed0: 65 72 20 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74  er on */.  const
aee0: 20 63 68 61 72 20 2a 7a 41 6e 64 20 3d 20 22 22   char *zAnd = ""
aef0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65  ;          /* Se
af00: 74 20 74 6f 20 22 20 41 4e 44 20 22 20 6c 61 74  t to " AND " lat
af10: 65 72 20 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74  er on */.  sqlit
af20: 65 33 5f 73 74 6d 74 20 2a 70 58 49 6e 66 6f 20  e3_stmt *pXInfo 
af30: 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 50 52  = 0;       /* PR
af40: 41 47 4d 41 20 69 6e 64 65 78 5f 78 69 6e 66 6f  AGMA index_xinfo
af50: 20 3d 20 3f 20 2a 2f 0a 0a 20 20 69 66 28 20 72   = ? */..  if( r
af60: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
af70: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 7a      assert( p->z
af80: 45 72 72 6d 73 67 3d 3d 30 20 29 3b 0a 20 20 20  Errmsg==0 );.   
af90: 20 72 63 20 3d 20 70 72 65 70 61 72 65 46 72 65   rc = prepareFre
afa0: 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72  eAndCollectError
afb0: 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 70 58 49  (p->dbMain, &pXI
afc0: 6e 66 6f 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67  nfo, &p->zErrmsg
afd0: 2c 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ,.        sqlite
afe0: 33 5f 6d 70 72 69 6e 74 66 28 22 50 52 41 47 4d  3_mprintf("PRAGM
aff0: 41 20 6d 61 69 6e 2e 69 6e 64 65 78 5f 78 69 6e  A main.index_xin
b000: 66 6f 20 3d 20 25 51 22 2c 20 70 49 74 65 72 2d  fo = %Q", pIter-
b010: 3e 7a 49 64 78 29 0a 20 20 20 20 29 3b 0a 20 20  >zIdx).    );.  
b020: 7d 0a 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  }..  while( rc==
b030: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c  SQLITE_OK && SQL
b040: 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
b050: 5f 73 74 65 70 28 70 58 49 6e 66 6f 29 20 29 7b  _step(pXInfo) ){
b060: 0a 20 20 20 20 69 6e 74 20 69 43 69 64 20 3d 20  .    int iCid = 
b070: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
b080: 6e 74 28 70 58 49 6e 66 6f 2c 20 31 29 3b 0a 20  nt(pXInfo, 1);. 
b090: 20 20 20 69 6e 74 20 62 44 65 73 63 20 3d 20 73     int bDesc = s
b0a0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
b0b0: 74 28 70 58 49 6e 66 6f 2c 20 33 29 3b 0a 20 20  t(pXInfo, 3);.  
b0c0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
b0d0: 6f 6c 6c 61 74 65 20 3d 20 28 63 6f 6e 73 74 20  ollate = (const 
b0e0: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
b0f0: 6c 75 6d 6e 5f 74 65 78 74 28 70 58 49 6e 66 6f  lumn_text(pXInfo
b100: 2c 20 34 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20  , 4);.    const 
b110: 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20  char *zCol;.    
b120: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70  const char *zTyp
b130: 65 3b 0a 0a 20 20 20 20 69 66 28 20 69 43 69 64  e;..    if( iCid
b140: 3c 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  <0 ){.      /* A
b150: 6e 20 69 6e 74 65 67 65 72 20 70 72 69 6d 61 72  n integer primar
b160: 79 20 6b 65 79 2e 20 49 66 20 74 68 65 20 74 61  y key. If the ta
b170: 62 6c 65 20 68 61 73 20 61 6e 20 65 78 70 6c 69  ble has an expli
b180: 63 69 74 20 49 50 4b 2c 20 75 73 65 0a 20 20 20  cit IPK, use.   
b190: 20 20 20 2a 2a 20 69 74 73 20 6e 61 6d 65 2e 20     ** its name. 
b1a0: 4f 74 68 65 72 77 69 73 65 2c 20 75 73 65 20 22  Otherwise, use "
b1b0: 72 62 75 5f 72 6f 77 69 64 22 2e 20 20 2a 2f 0a  rbu_rowid".  */.
b1c0: 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d        if( pIter-
b1d0: 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 49  >eType==RBU_PK_I
b1e0: 50 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  PK ){.        in
b1f0: 74 20 69 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  t i;.        for
b200: 28 69 3d 30 3b 20 70 49 74 65 72 2d 3e 61 62 54  (i=0; pIter->abT
b210: 62 6c 50 6b 5b 69 5d 3d 3d 30 3b 20 69 2b 2b 29  blPk[i]==0; i++)
b220: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
b230: 28 20 69 3c 70 49 74 65 72 2d 3e 6e 54 62 6c 43  ( i<pIter->nTblC
b240: 6f 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 7a 43  ol );.        zC
b250: 6f 6c 20 3d 20 70 49 74 65 72 2d 3e 61 7a 54 62  ol = pIter->azTb
b260: 6c 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 7d  lCol[i];.      }
b270: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 43  else{.        zC
b280: 6f 6c 20 3d 20 22 72 62 75 5f 72 6f 77 69 64 22  ol = "rbu_rowid"
b290: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
b2a0: 7a 54 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52  zType = "INTEGER
b2b0: 22 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  ";.    }else{.  
b2c0: 20 20 20 20 7a 43 6f 6c 20 3d 20 70 49 74 65 72      zCol = pIter
b2d0: 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69 43 69 64 5d  ->azTblCol[iCid]
b2e0: 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20  ;.      zType = 
b2f0: 70 49 74 65 72 2d 3e 61 7a 54 62 6c 54 79 70 65  pIter->azTblType
b300: 5b 69 43 69 64 5d 3b 0a 20 20 20 20 7d 0a 0a 20  [iCid];.    }.. 
b310: 20 20 20 7a 52 65 74 20 3d 20 73 71 6c 69 74 65     zRet = sqlite
b320: 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a 25 73 5c  3_mprintf("%z%s\
b330: 22 25 77 5c 22 20 43 4f 4c 4c 41 54 45 20 25 51  "%w\" COLLATE %Q
b340: 22 2c 20 7a 52 65 74 2c 20 7a 43 6f 6d 2c 20 7a  ", zRet, zCom, z
b350: 43 6f 6c 2c 20 7a 43 6f 6c 6c 61 74 65 29 3b 0a  Col, zCollate);.
b360: 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 62      if( pIter->b
b370: 55 6e 69 71 75 65 3d 3d 30 20 7c 7c 20 73 71 6c  Unique==0 || sql
b380: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
b390: 70 58 49 6e 66 6f 2c 20 35 29 20 29 7b 0a 20 20  pXInfo, 5) ){.  
b3a0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
b3b0: 7a 4f 72 64 65 72 20 3d 20 28 62 44 65 73 63 20  zOrder = (bDesc 
b3c0: 3f 20 22 20 44 45 53 43 22 20 3a 20 22 22 29 3b  ? " DESC" : "");
b3d0: 0a 20 20 20 20 20 20 7a 49 6d 70 50 4b 20 3d 20  .      zImpPK = 
b3e0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
b3f0: 22 25 7a 25 73 5c 22 72 62 75 5f 69 6d 70 5f 25  "%z%s\"rbu_imp_%
b400: 64 25 77 5c 22 25 73 22 2c 20 0a 20 20 20 20 20  d%w\"%s", .     
b410: 20 20 20 20 20 7a 49 6d 70 50 4b 2c 20 7a 43 6f       zImpPK, zCo
b420: 6d 2c 20 6e 42 69 6e 64 2c 20 7a 43 6f 6c 2c 20  m, nBind, zCol, 
b430: 7a 4f 72 64 65 72 0a 20 20 20 20 20 20 29 3b 0a  zOrder.      );.
b440: 20 20 20 20 7d 0a 20 20 20 20 7a 49 6d 70 43 6f      }.    zImpCo
b450: 6c 73 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ls = sqlite3_mpr
b460: 69 6e 74 66 28 22 25 7a 25 73 5c 22 72 62 75 5f  intf("%z%s\"rbu_
b470: 69 6d 70 5f 25 64 25 77 5c 22 20 25 73 20 43 4f  imp_%d%w\" %s CO
b480: 4c 4c 41 54 45 20 25 51 22 2c 20 0a 20 20 20 20  LLATE %Q", .    
b490: 20 20 20 20 7a 49 6d 70 43 6f 6c 73 2c 20 7a 43      zImpCols, zC
b4a0: 6f 6d 2c 20 6e 42 69 6e 64 2c 20 7a 43 6f 6c 2c  om, nBind, zCol,
b4b0: 20 7a 54 79 70 65 2c 20 7a 43 6f 6c 6c 61 74 65   zType, zCollate
b4c0: 0a 20 20 20 20 29 3b 0a 20 20 20 20 7a 57 68 65  .    );.    zWhe
b4d0: 72 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  re = sqlite3_mpr
b4e0: 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 22 25  intf(.        "%
b4f0: 7a 25 73 5c 22 72 62 75 5f 69 6d 70 5f 25 64 25  z%s\"rbu_imp_%d%
b500: 77 5c 22 20 49 53 20 3f 22 2c 20 7a 57 68 65 72  w\" IS ?", zWher
b510: 65 2c 20 7a 41 6e 64 2c 20 6e 42 69 6e 64 2c 20  e, zAnd, nBind, 
b520: 7a 43 6f 6c 0a 20 20 20 20 29 3b 0a 20 20 20 20  zCol.    );.    
b530: 69 66 28 20 7a 52 65 74 3d 3d 30 20 7c 7c 20 7a  if( zRet==0 || z
b540: 49 6d 70 50 4b 3d 3d 30 20 7c 7c 20 7a 49 6d 70  ImpPK==0 || zImp
b550: 43 6f 6c 73 3d 3d 30 20 7c 7c 20 7a 57 68 65 72  Cols==0 || zWher
b560: 65 3d 3d 30 20 29 20 72 63 20 3d 20 53 51 4c 49  e==0 ) rc = SQLI
b570: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7a 43  TE_NOMEM;.    zC
b580: 6f 6d 20 3d 20 22 2c 20 22 3b 0a 20 20 20 20 7a  om = ", ";.    z
b590: 41 6e 64 20 3d 20 22 20 41 4e 44 20 22 3b 0a 20  And = " AND ";. 
b5a0: 20 20 20 6e 42 69 6e 64 2b 2b 3b 0a 20 20 7d 0a     nBind++;.  }.
b5b0: 0a 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33  .  rc2 = sqlite3
b5c0: 5f 66 69 6e 61 6c 69 7a 65 28 70 58 49 6e 66 6f  _finalize(pXInfo
b5d0: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
b5e0: 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63  ITE_OK ) rc = rc
b5f0: 32 3b 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51  2;..  if( rc!=SQ
b600: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
b610: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 52 65 74  qlite3_free(zRet
b620: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
b630: 72 65 65 28 7a 49 6d 70 43 6f 6c 73 29 3b 0a 20  ree(zImpCols);. 
b640: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
b650: 7a 49 6d 70 50 4b 29 3b 0a 20 20 20 20 73 71 6c  zImpPK);.    sql
b660: 69 74 65 33 5f 66 72 65 65 28 7a 57 68 65 72 65  ite3_free(zWhere
b670: 29 3b 0a 20 20 20 20 7a 52 65 74 20 3d 20 30 3b  );.    zRet = 0;
b680: 0a 20 20 20 20 7a 49 6d 70 43 6f 6c 73 20 3d 20  .    zImpCols = 
b690: 30 3b 0a 20 20 20 20 7a 49 6d 70 50 4b 20 3d 20  0;.    zImpPK = 
b6a0: 30 3b 0a 20 20 20 20 7a 57 68 65 72 65 20 3d 20  0;.    zWhere = 
b6b0: 30 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 72  0;.    p->rc = r
b6c0: 63 3b 0a 20 20 7d 0a 0a 20 20 2a 70 7a 49 6d 70  c;.  }..  *pzImp
b6d0: 6f 73 74 65 72 43 6f 6c 73 20 3d 20 7a 49 6d 70  osterCols = zImp
b6e0: 43 6f 6c 73 3b 0a 20 20 2a 70 7a 49 6d 70 6f 73  Cols;.  *pzImpos
b6f0: 74 65 72 50 6b 20 3d 20 7a 49 6d 70 50 4b 3b 0a  terPk = zImpPK;.
b700: 20 20 2a 70 7a 57 68 65 72 65 20 3d 20 7a 57 68    *pzWhere = zWh
b710: 65 72 65 3b 0a 20 20 2a 70 6e 42 69 6e 64 20 3d  ere;.  *pnBind =
b720: 20 6e 42 69 6e 64 3b 0a 20 20 72 65 74 75 72 6e   nBind;.  return
b730: 20 7a 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   zRet;.}../*.** 
b740: 41 73 73 75 6d 69 6e 67 20 74 68 65 20 63 75 72  Assuming the cur
b750: 72 65 6e 74 20 74 61 62 6c 65 20 63 6f 6c 75 6d  rent table colum
b760: 6e 73 20 61 72 65 20 22 61 22 2c 20 22 62 22 20  ns are "a", "b" 
b770: 61 6e 64 20 22 63 22 2c 20 61 6e 64 20 74 68 65  and "c", and the
b780: 20 7a 4f 62 6a 0a 2a 2a 20 70 61 72 61 6d 74 65   zObj.** paramte
b790: 72 20 69 73 20 70 61 73 73 65 64 20 22 6f 6c 64  r is passed "old
b7a0: 22 2c 20 72 65 74 75 72 6e 20 61 20 73 74 72 69  ", return a stri
b7b0: 6e 67 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  ng of the form:.
b7c0: 2a 2a 0a 2a 2a 20 20 20 20 20 22 6f 6c 64 2e 61  **.**     "old.a
b7d0: 2c 20 6f 6c 64 2e 62 2c 20 6f 6c 64 2e 62 22 0a  , old.b, old.b".
b7e0: 2a 2a 0a 2a 2a 20 57 69 74 68 20 74 68 65 20 63  **.** With the c
b7f0: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 65 73 63 61  olumn names esca
b800: 70 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74  ped..**.** For t
b810: 61 62 6c 65 73 20 77 69 74 68 20 69 6d 70 6c 69  ables with impli
b820: 63 69 74 20 72 6f 77 69 64 73 20 2d 20 52 42 55  cit rowids - RBU
b830: 5f 50 4b 5f 45 58 54 45 52 4e 41 4c 20 61 6e 64  _PK_EXTERNAL and
b840: 20 52 42 55 5f 50 4b 5f 4e 4f 4e 45 2c 20 61 70   RBU_PK_NONE, ap
b850: 70 65 6e 64 0a 2a 2a 20 74 68 65 20 74 65 78 74  pend.** the text
b860: 20 22 2c 20 6f 6c 64 2e 5f 72 6f 77 69 64 5f 22   ", old._rowid_"
b870: 20 74 6f 20 74 68 65 20 72 65 74 75 72 6e 65 64   to the returned
b880: 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69   value..*/.stati
b890: 63 20 63 68 61 72 20 2a 72 62 75 4f 62 6a 49 74  c char *rbuObjIt
b8a0: 65 72 47 65 74 4f 6c 64 6c 69 73 74 28 0a 20 20  erGetOldlist(.  
b8b0: 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 0a  sqlite3rbu *p, .
b8c0: 20 20 52 62 75 4f 62 6a 49 74 65 72 20 2a 70 49    RbuObjIter *pI
b8d0: 74 65 72 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  ter,.  const cha
b8e0: 72 20 2a 7a 4f 62 6a 0a 29 7b 0a 20 20 63 68 61  r *zObj.){.  cha
b8f0: 72 20 2a 7a 4c 69 73 74 20 3d 20 30 3b 0a 20 20  r *zList = 0;.  
b900: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
b910: 45 5f 4f 4b 20 26 26 20 70 49 74 65 72 2d 3e 61  E_OK && pIter->a
b920: 62 49 6e 64 65 78 65 64 20 29 7b 0a 20 20 20 20  bIndexed ){.    
b930: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 20 3d  const char *zS =
b940: 20 22 22 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a   "";.    int i;.
b950: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
b960: 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 3b 20 69  Iter->nTblCol; i
b970: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
b980: 49 74 65 72 2d 3e 61 62 49 6e 64 65 78 65 64 5b  Iter->abIndexed[
b990: 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  i] ){.        co
b9a0: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 20 3d  nst char *zCol =
b9b0: 20 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c   pIter->azTblCol
b9c0: 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 7a 4c 69  [i];.        zLi
b9d0: 73 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  st = sqlite3_mpr
b9e0: 69 6e 74 66 28 22 25 7a 25 73 25 73 2e 5c 22 25  intf("%z%s%s.\"%
b9f0: 77 5c 22 22 2c 20 7a 4c 69 73 74 2c 20 7a 53 2c  w\"", zList, zS,
ba00: 20 7a 4f 62 6a 2c 20 7a 43 6f 6c 29 3b 0a 20 20   zObj, zCol);.  
ba10: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ba20: 20 20 20 7a 4c 69 73 74 20 3d 20 73 71 6c 69 74     zList = sqlit
ba30: 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a 25 73  e3_mprintf("%z%s
ba40: 4e 55 4c 4c 22 2c 20 7a 4c 69 73 74 2c 20 7a 53  NULL", zList, zS
ba50: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
ba60: 20 7a 53 20 3d 20 22 2c 20 22 3b 0a 20 20 20 20   zS = ", ";.    
ba70: 20 20 69 66 28 20 7a 4c 69 73 74 3d 3d 30 20 29    if( zList==0 )
ba80: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20  {.        p->rc 
ba90: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
baa0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
bab0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
bac0: 20 20 2f 2a 20 46 6f 72 20 61 20 74 61 62 6c 65    /* For a table
bad0: 20 77 69 74 68 20 69 6d 70 6c 69 63 69 74 20 72   with implicit r
bae0: 6f 77 69 64 73 2c 20 61 70 70 65 6e 64 20 22 6f  owids, append "o
baf0: 6c 64 2e 5f 72 6f 77 69 64 5f 22 20 74 6f 20 74  ld._rowid_" to t
bb00: 68 65 20 6c 69 73 74 2e 20 2a 2f 0a 20 20 20 20  he list. */.    
bb10: 69 66 28 20 70 49 74 65 72 2d 3e 65 54 79 70 65  if( pIter->eType
bb20: 3d 3d 52 42 55 5f 50 4b 5f 45 58 54 45 52 4e 41  ==RBU_PK_EXTERNA
bb30: 4c 20 7c 7c 20 70 49 74 65 72 2d 3e 65 54 79 70  L || pIter->eTyp
bb40: 65 3d 3d 52 42 55 5f 50 4b 5f 4e 4f 4e 45 20 29  e==RBU_PK_NONE )
bb50: 7b 0a 20 20 20 20 20 20 7a 4c 69 73 74 20 3d 20  {.      zList = 
bb60: 72 62 75 4d 50 72 69 6e 74 66 28 70 2c 20 22 25  rbuMPrintf(p, "%
bb70: 7a 2c 20 25 73 2e 5f 72 6f 77 69 64 5f 22 2c 20  z, %s._rowid_", 
bb80: 7a 4c 69 73 74 2c 20 7a 4f 62 6a 29 3b 0a 20 20  zList, zObj);.  
bb90: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
bba0: 20 7a 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   zList;.}../*.**
bbb0: 20 52 65 74 75 72 6e 20 61 6e 20 65 78 70 72 65   Return an expre
bbc0: 73 73 69 6f 6e 20 74 68 61 74 20 63 61 6e 20 62  ssion that can b
bbd0: 65 20 75 73 65 64 20 69 6e 20 61 20 57 48 45 52  e used in a WHER
bbe0: 45 20 63 6c 61 75 73 65 20 74 6f 20 6d 61 74 63  E clause to matc
bbf0: 68 20 74 68 65 0a 2a 2a 20 70 72 69 6d 61 72 79  h the.** primary
bc00: 20 6b 65 79 20 6f 66 20 74 68 65 20 63 75 72 72   key of the curr
bc10: 65 6e 74 20 74 61 62 6c 65 2e 20 46 6f 72 20 65  ent table. For e
bc20: 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 74  xample, if the t
bc30: 61 62 6c 65 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  able is:.**.**  
bc40: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
bc50: 28 61 2c 20 62 2c 20 63 2c 20 50 52 49 4d 41 52  (a, b, c, PRIMAR
bc60: 59 20 4b 45 59 28 62 2c 20 63 29 29 3b 0a 2a 2a  Y KEY(b, c));.**
bc70: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
bc80: 74 72 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 22  tring:.**.**   "
bc90: 62 20 3d 20 3f 31 20 41 4e 44 20 63 20 3d 20 3f  b = ?1 AND c = ?
bca0: 32 22 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  2".*/.static cha
bcb0: 72 20 2a 72 62 75 4f 62 6a 49 74 65 72 47 65 74  r *rbuObjIterGet
bcc0: 57 68 65 72 65 28 0a 20 20 73 71 6c 69 74 65 33  Where(.  sqlite3
bcd0: 72 62 75 20 2a 70 2c 20 0a 20 20 52 62 75 4f 62  rbu *p, .  RbuOb
bce0: 6a 49 74 65 72 20 2a 70 49 74 65 72 0a 29 7b 0a  jIter *pIter.){.
bcf0: 20 20 63 68 61 72 20 2a 7a 4c 69 73 74 20 3d 20    char *zList = 
bd00: 30 3b 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e  0;.  if( pIter->
bd10: 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 56 54  eType==RBU_PK_VT
bd20: 41 42 20 7c 7c 20 70 49 74 65 72 2d 3e 65 54 79  AB || pIter->eTy
bd30: 70 65 3d 3d 52 42 55 5f 50 4b 5f 4e 4f 4e 45 20  pe==RBU_PK_NONE 
bd40: 29 7b 0a 20 20 20 20 7a 4c 69 73 74 20 3d 20 72  ){.    zList = r
bd50: 62 75 4d 50 72 69 6e 74 66 28 70 2c 20 22 5f 72  buMPrintf(p, "_r
bd60: 6f 77 69 64 5f 20 3d 20 3f 25 64 22 2c 20 70 49  owid_ = ?%d", pI
bd70: 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 2b 31 29 3b  ter->nTblCol+1);
bd80: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 49 74  .  }else if( pIt
bd90: 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50  er->eType==RBU_P
bda0: 4b 5f 45 58 54 45 52 4e 41 4c 20 29 7b 0a 20 20  K_EXTERNAL ){.  
bdb0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
bdc0: 65 70 20 3d 20 22 22 3b 0a 20 20 20 20 69 6e 74  ep = "";.    int
bdd0: 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
bde0: 20 69 3c 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f   i<pIter->nTblCo
bdf0: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  l; i++){.      i
be00: 66 28 20 70 49 74 65 72 2d 3e 61 62 54 62 6c 50  f( pIter->abTblP
be10: 6b 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  k[i] ){.        
be20: 7a 4c 69 73 74 20 3d 20 72 62 75 4d 50 72 69 6e  zList = rbuMPrin
be30: 74 66 28 70 2c 20 22 25 7a 25 73 63 25 64 3d 3f  tf(p, "%z%sc%d=?
be40: 25 64 22 2c 20 7a 4c 69 73 74 2c 20 7a 53 65 70  %d", zList, zSep
be50: 2c 20 69 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20  , i, i+1);.     
be60: 20 20 20 7a 53 65 70 20 3d 20 22 20 41 4e 44 20     zSep = " AND 
be70: 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ";.      }.    }
be80: 0a 20 20 20 20 7a 4c 69 73 74 20 3d 20 72 62 75  .    zList = rbu
be90: 4d 50 72 69 6e 74 66 28 70 2c 20 0a 20 20 20 20  MPrintf(p, .    
bea0: 20 20 20 20 22 5f 72 6f 77 69 64 5f 20 3d 20 28      "_rowid_ = (
beb0: 53 45 4c 45 43 54 20 69 64 20 46 52 4f 4d 20 72  SELECT id FROM r
bec0: 62 75 5f 69 6d 70 6f 73 74 65 72 32 20 57 48 45  bu_imposter2 WHE
bed0: 52 45 20 25 7a 29 22 2c 20 7a 4c 69 73 74 0a 20  RE %z)", zList. 
bee0: 20 20 20 29 3b 0a 0a 20 20 7d 65 6c 73 65 7b 0a     );..  }else{.
bef0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
bf00: 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20 20 20 69  zSep = "";.    i
bf10: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
bf20: 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 54 62 6c  0; i<pIter->nTbl
bf30: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
bf40: 20 69 66 28 20 70 49 74 65 72 2d 3e 61 62 54 62   if( pIter->abTb
bf50: 6c 50 6b 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20  lPk[i] ){.      
bf60: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
bf70: 6f 6c 20 3d 20 70 49 74 65 72 2d 3e 61 7a 54 62  ol = pIter->azTb
bf80: 6c 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20  lCol[i];.       
bf90: 20 7a 4c 69 73 74 20 3d 20 72 62 75 4d 50 72 69   zList = rbuMPri
bfa0: 6e 74 66 28 70 2c 20 22 25 7a 25 73 5c 22 25 77  ntf(p, "%z%s\"%w
bfb0: 5c 22 3d 3f 25 64 22 2c 20 7a 4c 69 73 74 2c 20  \"=?%d", zList, 
bfc0: 7a 53 65 70 2c 20 7a 43 6f 6c 2c 20 69 2b 31 29  zSep, zCol, i+1)
bfd0: 3b 0a 20 20 20 20 20 20 20 20 7a 53 65 70 20 3d  ;.        zSep =
bfe0: 20 22 20 41 4e 44 20 22 3b 0a 20 20 20 20 20 20   " AND ";.      
bff0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
c000: 74 75 72 6e 20 7a 4c 69 73 74 3b 0a 7d 0a 0a 2f  turn zList;.}../
c010: 2a 0a 2a 2a 20 54 68 65 20 53 45 4c 45 43 54 20  *.** The SELECT 
c020: 73 74 61 74 65 6d 65 6e 74 20 69 74 65 72 61 74  statement iterat
c030: 69 6e 67 20 74 68 72 6f 75 67 68 20 74 68 65 20  ing through the 
c040: 6b 65 79 73 20 66 6f 72 20 74 68 65 20 63 75 72  keys for the cur
c050: 72 65 6e 74 20 6f 62 6a 65 63 74 0a 2a 2a 20 28  rent object.** (
c060: 70 2d 3e 6f 62 6a 69 74 65 72 2e 70 53 65 6c 65  p->objiter.pSele
c070: 63 74 29 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  ct) currently po
c080: 69 6e 74 73 20 74 6f 20 61 20 76 61 6c 69 64 20  ints to a valid 
c090: 72 6f 77 2e 20 48 6f 77 65 76 65 72 2c 20 74 68  row. However, th
c0a0: 65 72 65 0a 2a 2a 20 69 73 20 73 6f 6d 65 74 68  ere.** is someth
c0b0: 69 6e 67 20 77 72 6f 6e 67 20 77 69 74 68 20 74  ing wrong with t
c0c0: 68 65 20 72 62 75 5f 63 6f 6e 74 72 6f 6c 20 76  he rbu_control v
c0d0: 61 6c 75 65 20 69 6e 20 74 68 65 20 72 62 75 5f  alue in the rbu_
c0e0: 63 6f 6e 74 72 6f 6c 20 76 61 6c 75 65 0a 2a 2a  control value.**
c0f0: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 28   stored in the (
c100: 70 2d 3e 6e 43 6f 6c 2b 31 29 27 74 68 20 63 6f  p->nCol+1)'th co
c110: 6c 75 6d 6e 2e 20 53 65 74 20 74 68 65 20 65 72  lumn. Set the er
c120: 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 65 72 72  ror code and err
c130: 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 6f 66  or message.** of
c140: 20 74 68 65 20 52 42 55 20 68 61 6e 64 6c 65 20   the RBU handle 
c150: 74 6f 20 73 6f 6d 65 74 68 69 6e 67 20 72 65 66  to something ref
c160: 6c 65 63 74 69 6e 67 20 74 68 69 73 2e 0a 2a 2f  lecting this..*/
c170: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75  .static void rbu
c180: 42 61 64 43 6f 6e 74 72 6f 6c 45 72 72 6f 72 28  BadControlError(
c190: 73 71 6c 69 74 65 33 72 62 75 20 2a 70 29 7b 0a  sqlite3rbu *p){.
c1a0: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
c1b0: 5f 45 52 52 4f 52 3b 0a 20 20 70 2d 3e 7a 45 72  _ERROR;.  p->zEr
c1c0: 72 6d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  rmsg = sqlite3_m
c1d0: 70 72 69 6e 74 66 28 22 69 6e 76 61 6c 69 64 20  printf("invalid 
c1e0: 72 62 75 5f 63 6f 6e 74 72 6f 6c 20 76 61 6c 75  rbu_control valu
c1f0: 65 22 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52  e");.}.../*.** R
c200: 65 74 75 72 6e 20 61 20 6e 75 6c 2d 74 65 72 6d  eturn a nul-term
c210: 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20 63 6f  inated string co
c220: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 6f 6d  ntaining the com
c230: 6d 61 20 73 65 70 61 72 61 74 65 64 20 6c 69 73  ma separated lis
c240: 74 20 6f 66 0a 2a 2a 20 61 73 73 69 67 6e 6d 65  t of.** assignme
c250: 6e 74 73 20 74 68 61 74 20 73 68 6f 75 6c 64 20  nts that should 
c260: 62 65 20 69 6e 63 6c 75 64 65 64 20 66 6f 6c 6c  be included foll
c270: 6f 77 69 6e 67 20 74 68 65 20 22 53 45 54 22 20  owing the "SET" 
c280: 6b 65 79 77 6f 72 64 20 6f 66 0a 2a 2a 20 61 6e  keyword of.** an
c290: 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e   UPDATE statemen
c2a0: 74 20 75 73 65 64 20 74 6f 20 75 70 64 61 74 65  t used to update
c2b0: 20 74 68 65 20 74 61 62 6c 65 20 6f 62 6a 65 63   the table objec
c2c0: 74 20 74 68 61 74 20 74 68 65 20 69 74 65 72 61  t that the itera
c2d0: 74 6f 72 0a 2a 2a 20 70 61 73 73 65 64 20 61 73  tor.** passed as
c2e0: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
c2f0: 6d 65 6e 74 20 63 75 72 72 65 6e 74 6c 79 20 70  ment currently p
c300: 6f 69 6e 74 73 20 74 6f 20 69 66 20 74 68 65 20  oints to if the 
c310: 72 62 75 5f 63 6f 6e 74 72 6f 6c 0a 2a 2a 20 63  rbu_control.** c
c320: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 64 61 74  olumn of the dat
c330: 61 5f 78 78 78 20 74 61 62 6c 65 20 65 6e 74 72  a_xxx table entr
c340: 79 20 69 73 20 73 65 74 20 74 6f 20 7a 4d 61 73  y is set to zMas
c350: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 65 6d  k..**.** The mem
c360: 6f 72 79 20 66 6f 72 20 74 68 65 20 72 65 74 75  ory for the retu
c370: 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f  rned string is o
c380: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
c390: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a  ite3_malloc()..*
c3a0: 2a 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70  * It is the resp
c3b0: 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
c3c0: 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e  e caller to even
c3d0: 74 75 61 6c 6c 79 20 66 72 65 65 20 69 74 20 75  tually free it u
c3e0: 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  sing.** sqlite3_
c3f0: 66 72 65 65 28 29 2e 20 0a 2a 2a 0a 2a 2a 20 49  free(). .**.** I
c400: 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 69  f an OOM error i
c410: 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 77 68  s encountered wh
c420: 65 6e 20 61 6c 6c 6f 63 61 74 69 6e 67 20 73 70  en allocating sp
c430: 61 63 65 20 66 6f 72 20 74 68 65 20 6e 65 77 0a  ace for the new.
c440: 2a 2a 20 73 74 72 69 6e 67 2c 20 61 6e 20 65 72  ** string, an er
c450: 72 6f 72 20 63 6f 64 65 20 69 73 20 6c 65 66 74  ror code is left
c460: 20 69 6e 20 74 68 65 20 72 62 75 20 68 61 6e 64   in the rbu hand
c470: 6c 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  le passed as the
c480: 20 66 69 72 73 74 0a 2a 2a 20 61 72 67 75 6d 65   first.** argume
c490: 6e 74 20 61 6e 64 20 4e 55 4c 4c 20 69 73 20 72  nt and NULL is r
c4a0: 65 74 75 72 6e 65 64 2e 20 4f 72 2c 20 69 66 20  eturned. Or, if 
c4b0: 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72  an error has alr
c4c0: 65 61 64 79 20 6f 63 63 75 72 72 65 64 0a 2a 2a  eady occurred.**
c4d0: 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
c4e0: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 4e  ion is called, N
c4f0: 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20  ULL is returned 
c500: 69 6d 6d 65 64 69 61 74 65 6c 79 2c 20 77 69 74  immediately, wit
c510: 68 6f 75 74 0a 2a 2a 20 61 74 74 65 6d 70 74 69  hout.** attempti
c520: 6e 67 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f  ng the allocatio
c530: 6e 20 6f 72 20 6d 6f 64 69 66 79 69 6e 67 20 74  n or modifying t
c540: 68 65 20 73 74 6f 72 65 64 20 65 72 72 6f 72 20  he stored error 
c550: 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  code..*/.static 
c560: 63 68 61 72 20 2a 72 62 75 4f 62 6a 49 74 65 72  char *rbuObjIter
c570: 47 65 74 53 65 74 6c 69 73 74 28 0a 20 20 73 71  GetSetlist(.  sq
c580: 6c 69 74 65 33 72 62 75 20 2a 70 2c 0a 20 20 52  lite3rbu *p,.  R
c590: 62 75 4f 62 6a 49 74 65 72 20 2a 70 49 74 65 72  buObjIter *pIter
c5a0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
c5b0: 7a 4d 61 73 6b 0a 29 7b 0a 20 20 63 68 61 72 20  zMask.){.  char 
c5c0: 2a 7a 4c 69 73 74 20 3d 20 30 3b 0a 20 20 69 66  *zList = 0;.  if
c5d0: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
c5e0: 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  OK ){.    int i;
c5f0: 0a 0a 20 20 20 20 69 66 28 20 73 74 72 6c 65 6e  ..    if( strlen
c600: 28 7a 4d 61 73 6b 29 21 3d 70 49 74 65 72 2d 3e  (zMask)!=pIter->
c610: 6e 54 62 6c 43 6f 6c 20 29 7b 0a 20 20 20 20 20  nTblCol ){.     
c620: 20 72 62 75 42 61 64 43 6f 6e 74 72 6f 6c 45 72   rbuBadControlEr
c630: 72 6f 72 28 70 29 3b 0a 20 20 20 20 7d 65 6c 73  ror(p);.    }els
c640: 65 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  e{.      const c
c650: 68 61 72 20 2a 7a 53 65 70 20 3d 20 22 22 3b 0a  har *zSep = "";.
c660: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
c670: 3c 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c 3b  <pIter->nTblCol;
c680: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63   i++){.        c
c690: 68 61 72 20 63 20 3d 20 7a 4d 61 73 6b 5b 70 49  har c = zMask[pI
c6a0: 74 65 72 2d 3e 61 69 53 72 63 4f 72 64 65 72 5b  ter->aiSrcOrder[
c6b0: 69 5d 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  i]];.        if(
c6c0: 20 63 3d 3d 27 78 27 20 29 7b 0a 20 20 20 20 20   c=='x' ){.     
c6d0: 20 20 20 20 20 7a 4c 69 73 74 20 3d 20 72 62 75       zList = rbu
c6e0: 4d 50 72 69 6e 74 66 28 70 2c 20 22 25 7a 25 73  MPrintf(p, "%z%s
c6f0: 5c 22 25 77 5c 22 3d 3f 25 64 22 2c 20 0a 20 20  \"%w\"=?%d", .  
c700: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4c 69 73              zLis
c710: 74 2c 20 7a 53 65 70 2c 20 70 49 74 65 72 2d 3e  t, zSep, pIter->
c720: 61 7a 54 62 6c 43 6f 6c 5b 69 5d 2c 20 69 2b 31  azTblCol[i], i+1
c730: 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20  .          );.  
c740: 20 20 20 20 20 20 20 20 7a 53 65 70 20 3d 20 22          zSep = "
c750: 2c 20 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  , ";.        }. 
c760: 20 20 20 20 20 20 20 65 6c 73 65 20 69 66 28 20         else if( 
c770: 63 3d 3d 27 64 27 20 29 7b 0a 20 20 20 20 20 20  c=='d' ){.      
c780: 20 20 20 20 7a 4c 69 73 74 20 3d 20 72 62 75 4d      zList = rbuM
c790: 50 72 69 6e 74 66 28 70 2c 20 22 25 7a 25 73 5c  Printf(p, "%z%s\
c7a0: 22 25 77 5c 22 3d 72 62 75 5f 64 65 6c 74 61 28  "%w\"=rbu_delta(
c7b0: 5c 22 25 77 5c 22 2c 20 3f 25 64 29 22 2c 20 0a  \"%w\", ?%d)", .
c7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4c                zL
c7d0: 69 73 74 2c 20 7a 53 65 70 2c 20 70 49 74 65 72  ist, zSep, pIter
c7e0: 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69 5d 2c 20 70  ->azTblCol[i], p
c7f0: 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69  Iter->azTblCol[i
c800: 5d 2c 20 69 2b 31 0a 20 20 20 20 20 20 20 20 20  ], i+1.         
c810: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 53   );.          zS
c820: 65 70 20 3d 20 22 2c 20 22 3b 0a 20 20 20 20 20  ep = ", ";.     
c830: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 65 6c 73     }.        els
c840: 65 20 69 66 28 20 63 3d 3d 27 66 27 20 29 7b 0a  e if( c=='f' ){.
c850: 20 20 20 20 20 20 20 20 20 20 7a 4c 69 73 74 20            zList 
c860: 3d 20 72 62 75 4d 50 72 69 6e 74 66 28 70 2c 20  = rbuMPrintf(p, 
c870: 22 25 7a 25 73 5c 22 25 77 5c 22 3d 72 62 75 5f  "%z%s\"%w\"=rbu_
c880: 66 6f 73 73 69 6c 5f 64 65 6c 74 61 28 5c 22 25  fossil_delta(\"%
c890: 77 5c 22 2c 20 3f 25 64 29 22 2c 20 0a 20 20 20  w\", ?%d)", .   
c8a0: 20 20 20 20 20 20 20 20 20 20 20 7a 4c 69 73 74             zList
c8b0: 2c 20 7a 53 65 70 2c 20 70 49 74 65 72 2d 3e 61  , zSep, pIter->a
c8c0: 7a 54 62 6c 43 6f 6c 5b 69 5d 2c 20 70 49 74 65  zTblCol[i], pIte
c8d0: 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b 69 5d 2c 20  r->azTblCol[i], 
c8e0: 69 2b 31 0a 20 20 20 20 20 20 20 20 20 20 29 3b  i+1.          );
c8f0: 0a 20 20 20 20 20 20 20 20 20 20 7a 53 65 70 20  .          zSep 
c900: 3d 20 22 2c 20 22 3b 0a 20 20 20 20 20 20 20 20  = ", ";.        
c910: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
c920: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4c 69    }.  return zLi
c930: 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  st;.}../*.** Ret
c940: 75 72 6e 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e  urn a nul-termin
c950: 61 74 65 64 20 73 74 72 69 6e 67 20 63 6f 6e 73  ated string cons
c960: 69 73 74 69 6e 67 20 6f 66 20 6e 42 79 74 65 20  isting of nByte 
c970: 63 6f 6d 6d 61 20 73 65 70 61 72 61 74 65 64 0a  comma separated.
c980: 2a 2a 20 22 3f 22 20 65 78 70 72 65 73 73 69 6f  ** "?" expressio
c990: 6e 73 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  ns. For example,
c9a0: 20 69 66 20 6e 42 79 74 65 20 69 73 20 33 2c 20   if nByte is 3, 
c9b0: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
c9c0: 20 74 6f 0a 2a 2a 20 61 20 62 75 66 66 65 72 20   to.** a buffer 
c9d0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73  containing the s
c9e0: 74 72 69 6e 67 20 22 3f 2c 3f 2c 3f 22 2e 0a 2a  tring "?,?,?"..*
c9f0: 2a 0a 2a 2a 20 54 68 65 20 6d 65 6d 6f 72 79 20  *.** The memory 
ca00: 66 6f 72 20 74 68 65 20 72 65 74 75 72 6e 65 64  for the returned
ca10: 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69   string is obtai
ca20: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
ca30: 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 49 74  _malloc()..** It
ca40: 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
ca50: 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
ca60: 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c  ller to eventual
ca70: 6c 79 20 66 72 65 65 20 69 74 20 75 73 69 6e 67  ly free it using
ca80: 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66 72 65 65  .** sqlite3_free
ca90: 28 29 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  (). .**.** If an
caa0: 20 4f 4f 4d 20 65 72 72 6f 72 20 69 73 20 65 6e   OOM error is en
cab0: 63 6f 75 6e 74 65 72 65 64 20 77 68 65 6e 20 61  countered when a
cac0: 6c 6c 6f 63 61 74 69 6e 67 20 73 70 61 63 65 20  llocating space 
cad0: 66 6f 72 20 74 68 65 20 6e 65 77 0a 2a 2a 20 73  for the new.** s
cae0: 74 72 69 6e 67 2c 20 61 6e 20 65 72 72 6f 72 20  tring, an error 
caf0: 63 6f 64 65 20 69 73 20 6c 65 66 74 20 69 6e 20  code is left in 
cb00: 74 68 65 20 72 62 75 20 68 61 6e 64 6c 65 20 70  the rbu handle p
cb10: 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
cb20: 73 74 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 61  st.** argument a
cb30: 6e 64 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  nd NULL is retur
cb40: 6e 65 64 2e 20 4f 72 2c 20 69 66 20 61 6e 20 65  ned. Or, if an e
cb50: 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79  rror has already
cb60: 20 6f 63 63 75 72 72 65 64 0a 2a 2a 20 77 68 65   occurred.** whe
cb70: 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
cb80: 69 73 20 63 61 6c 6c 65 64 2c 20 4e 55 4c 4c 20  is called, NULL 
cb90: 69 73 20 72 65 74 75 72 6e 65 64 20 69 6d 6d 65  is returned imme
cba0: 64 69 61 74 65 6c 79 2c 20 77 69 74 68 6f 75 74  diately, without
cbb0: 0a 2a 2a 20 61 74 74 65 6d 70 74 69 6e 67 20 74  .** attempting t
cbc0: 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 72  he allocation or
cbd0: 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 73   modifying the s
cbe0: 74 6f 72 65 64 20 65 72 72 6f 72 20 63 6f 64 65  tored error code
cbf0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
cc00: 20 2a 72 62 75 4f 62 6a 49 74 65 72 47 65 74 42   *rbuObjIterGetB
cc10: 69 6e 64 6c 69 73 74 28 73 71 6c 69 74 65 33 72  indlist(sqlite3r
cc20: 62 75 20 2a 70 2c 20 69 6e 74 20 6e 42 69 6e 64  bu *p, int nBind
cc30: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 52 65 74 20  ){.  char *zRet 
cc40: 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65  = 0;.  int nByte
cc50: 20 3d 20 6e 42 69 6e 64 2a 32 20 2b 20 31 3b 0a   = nBind*2 + 1;.
cc60: 0a 20 20 7a 52 65 74 20 3d 20 28 63 68 61 72 2a  .  zRet = (char*
cc70: 29 72 62 75 4d 61 6c 6c 6f 63 28 70 2c 20 6e 42  )rbuMalloc(p, nB
cc80: 79 74 65 29 3b 0a 20 20 69 66 28 20 7a 52 65 74  yte);.  if( zRet
cc90: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
cca0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42     for(i=0; i<nB
ccb0: 69 6e 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ind; i++){.     
ccc0: 20 7a 52 65 74 5b 69 2a 32 5d 20 3d 20 27 3f 27   zRet[i*2] = '?'
ccd0: 3b 0a 20 20 20 20 20 20 7a 52 65 74 5b 69 2a 32  ;.      zRet[i*2
cce0: 2b 31 5d 20 3d 20 28 69 2b 31 3d 3d 6e 42 69 6e  +1] = (i+1==nBin
ccf0: 64 29 20 3f 20 27 5c 30 27 20 3a 20 27 2c 27 3b  d) ? '\0' : ',';
cd00: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
cd10: 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a  urn zRet;.}../*.
cd20: 2a 2a 20 54 68 65 20 69 74 65 72 61 74 6f 72 20  ** The iterator 
cd30: 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73  currently points
cd40: 20 74 6f 20 61 20 74 61 62 6c 65 20 28 6e 6f 74   to a table (not
cd50: 20 69 6e 64 65 78 29 20 6f 66 20 74 79 70 65 20   index) of type 
cd60: 0a 2a 2a 20 52 42 55 5f 50 4b 5f 57 49 54 48 4f  .** RBU_PK_WITHO
cd70: 55 54 5f 52 4f 57 49 44 2e 20 54 68 69 73 20 66  UT_ROWID. This f
cd80: 75 6e 63 74 69 6f 6e 20 63 72 65 61 74 65 73 20  unction creates 
cd90: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
cda0: 0a 2a 2a 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  .** declaration 
cdb0: 66 6f 72 20 74 68 65 20 63 6f 72 72 65 73 70 6f  for the correspo
cdc0: 6e 64 69 6e 67 20 69 6d 70 6f 73 74 65 72 20 74  nding imposter t
cdd0: 61 62 6c 65 2e 20 46 6f 72 20 65 78 61 6d 70 6c  able. For exampl
cde0: 65 2c 0a 2a 2a 20 69 66 20 74 68 65 20 69 74 65  e,.** if the ite
cdf0: 72 61 74 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20  rator points to 
ce00: 61 20 74 61 62 6c 65 20 63 72 65 61 74 65 64 20  a table created 
ce10: 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41  as:.**.**   CREA
ce20: 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62  TE TABLE t1(a, b
ce30: 2c 20 63 2c 20 50 52 49 4d 41 52 59 20 4b 45 59  , c, PRIMARY KEY
ce40: 28 62 2c 20 61 20 44 45 53 43 29 29 20 57 49 54  (b, a DESC)) WIT
ce50: 48 4f 55 54 20 52 4f 57 49 44 0a 2a 2a 0a 2a 2a  HOUT ROWID.**.**
ce60: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
ce70: 65 74 75 72 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  eturns:.**.**   
ce80: 50 52 49 4d 41 52 59 20 4b 45 59 28 22 62 22 2c  PRIMARY KEY("b",
ce90: 20 22 61 22 20 44 45 53 43 29 0a 2a 2f 0a 73 74   "a" DESC).*/.st
cea0: 61 74 69 63 20 63 68 61 72 20 2a 72 62 75 57 69  atic char *rbuWi
ceb0: 74 68 6f 75 74 52 6f 77 69 64 50 4b 28 73 71 6c  thoutRowidPK(sql
cec0: 69 74 65 33 72 62 75 20 2a 70 2c 20 52 62 75 4f  ite3rbu *p, RbuO
ced0: 62 6a 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  bjIter *pIter){.
cee0: 20 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20    char *z = 0;. 
cef0: 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
cf00: 7a 49 64 78 3d 3d 30 20 29 3b 0a 20 20 69 66 28  zIdx==0 );.  if(
cf10: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
cf20: 4b 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  K ){.    const c
cf30: 68 61 72 20 2a 7a 53 65 70 20 3d 20 22 50 52 49  har *zSep = "PRI
cf40: 4d 41 52 59 20 4b 45 59 28 22 3b 0a 20 20 20 20  MARY KEY(";.    
cf50: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 58  sqlite3_stmt *pX
cf60: 4c 69 73 74 20 3d 20 30 3b 20 20 20 20 20 2f 2a  List = 0;     /*
cf70: 20 50 52 41 47 4d 41 20 69 6e 64 65 78 5f 6c 69   PRAGMA index_li
cf80: 73 74 20 3d 20 28 70 49 74 65 72 2d 3e 7a 54 62  st = (pIter->zTb
cf90: 6c 29 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  l) */.    sqlite
cfa0: 33 5f 73 74 6d 74 20 2a 70 58 49 6e 66 6f 20 3d  3_stmt *pXInfo =
cfb0: 20 30 3b 20 20 20 20 20 2f 2a 20 50 52 41 47 4d   0;     /* PRAGM
cfc0: 41 20 69 6e 64 65 78 5f 78 69 6e 66 6f 20 3d 20  A index_xinfo = 
cfd0: 3c 70 6b 2d 69 6e 64 65 78 3e 20 2a 2f 0a 20 20  <pk-index> */.  
cfe0: 20 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 72   .    p->rc = pr
cff0: 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c  epareFreeAndColl
d000: 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 4d 61  ectError(p->dbMa
d010: 69 6e 2c 20 26 70 58 4c 69 73 74 2c 20 26 70 2d  in, &pXList, &p-
d020: 3e 7a 45 72 72 6d 73 67 2c 0a 20 20 20 20 20 20  >zErrmsg,.      
d030: 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74    sqlite3_mprint
d040: 66 28 22 50 52 41 47 4d 41 20 6d 61 69 6e 2e 69  f("PRAGMA main.i
d050: 6e 64 65 78 5f 6c 69 73 74 20 3d 20 25 51 22 2c  ndex_list = %Q",
d060: 20 70 49 74 65 72 2d 3e 7a 54 62 6c 29 0a 20 20   pIter->zTbl).  
d070: 20 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20    );.    while( 
d080: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
d090: 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d   && SQLITE_ROW==
d0a0: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 58 4c  sqlite3_step(pXL
d0b0: 69 73 74 29 20 29 7b 0a 20 20 20 20 20 20 63 6f  ist) ){.      co
d0c0: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 20  nst char *zOrig 
d0d0: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
d0e0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
d0f0: 78 74 28 70 58 4c 69 73 74 2c 33 29 3b 0a 20 20  xt(pXList,3);.  
d100: 20 20 20 20 69 66 28 20 7a 4f 72 69 67 20 26 26      if( zOrig &&
d110: 20 73 74 72 63 6d 70 28 7a 4f 72 69 67 2c 20 22   strcmp(zOrig, "
d120: 70 6b 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pk")==0 ){.     
d130: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
d140: 49 64 78 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  Idx = (const cha
d150: 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
d160: 6e 5f 74 65 78 74 28 70 58 4c 69 73 74 2c 31 29  n_text(pXList,1)
d170: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 49  ;.        if( zI
d180: 64 78 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  dx ){.          
d190: 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72 65 46  p->rc = prepareF
d1a0: 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72  reeAndCollectErr
d1b0: 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 70  or(p->dbMain, &p
d1c0: 58 49 6e 66 6f 2c 20 26 70 2d 3e 7a 45 72 72 6d  XInfo, &p->zErrm
d1d0: 73 67 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  sg,.            
d1e0: 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74    sqlite3_mprint
d1f0: 66 28 22 50 52 41 47 4d 41 20 6d 61 69 6e 2e 69  f("PRAGMA main.i
d200: 6e 64 65 78 5f 78 69 6e 66 6f 20 3d 20 25 51 22  ndex_xinfo = %Q"
d210: 2c 20 7a 49 64 78 29 0a 20 20 20 20 20 20 20 20  , zIdx).        
d220: 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20    );.        }. 
d230: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
d240: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
d250: 72 62 75 46 69 6e 61 6c 69 7a 65 28 70 2c 20 70  rbuFinalize(p, p
d260: 58 4c 69 73 74 29 3b 0a 0a 20 20 20 20 77 68 69  XList);..    whi
d270: 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  le( p->rc==SQLIT
d280: 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52  E_OK && SQLITE_R
d290: 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
d2a0: 28 70 58 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20  (pXInfo) ){.    
d2b0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 6f    if( sqlite3_co
d2c0: 6c 75 6d 6e 5f 69 6e 74 28 70 58 49 6e 66 6f 2c  lumn_int(pXInfo,
d2d0: 20 35 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f   5) ){.        /
d2e0: 2a 20 69 6e 74 20 69 43 69 64 20 3d 20 73 71 6c  * int iCid = sql
d2f0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
d300: 70 58 49 6e 66 6f 2c 20 30 29 3b 20 2a 2f 0a 20  pXInfo, 0); */. 
d310: 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
d320: 72 20 2a 7a 43 6f 6c 20 3d 20 28 63 6f 6e 73 74  r *zCol = (const
d330: 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63   char*)sqlite3_c
d340: 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 58 49 6e 66  olumn_text(pXInf
d350: 6f 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20 63  o, 2);.        c
d360: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 65 73 63  onst char *zDesc
d370: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
d380: 6e 5f 69 6e 74 28 70 58 49 6e 66 6f 2c 20 33 29  n_int(pXInfo, 3)
d390: 20 3f 20 22 20 44 45 53 43 22 20 3a 20 22 22 3b   ? " DESC" : "";
d3a0: 0a 20 20 20 20 20 20 20 20 7a 20 3d 20 72 62 75  .        z = rbu
d3b0: 4d 50 72 69 6e 74 66 28 70 2c 20 22 25 7a 25 73  MPrintf(p, "%z%s
d3c0: 5c 22 25 77 5c 22 25 73 22 2c 20 7a 2c 20 7a 53  \"%w\"%s", z, zS
d3d0: 65 70 2c 20 7a 43 6f 6c 2c 20 7a 44 65 73 63 29  ep, zCol, zDesc)
d3e0: 3b 0a 20 20 20 20 20 20 20 20 7a 53 65 70 20 3d  ;.        zSep =
d3f0: 20 22 2c 20 22 3b 0a 20 20 20 20 20 20 7d 0a 20   ", ";.      }. 
d400: 20 20 20 7d 0a 20 20 20 20 7a 20 3d 20 72 62 75     }.    z = rbu
d410: 4d 50 72 69 6e 74 66 28 70 2c 20 22 25 7a 29 22  MPrintf(p, "%z)"
d420: 2c 20 7a 29 3b 0a 20 20 20 20 72 62 75 46 69 6e  , z);.    rbuFin
d430: 61 6c 69 7a 65 28 70 2c 20 70 58 49 6e 66 6f 29  alize(p, pXInfo)
d440: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
d450: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
d460: 66 75 6e 63 74 69 6f 6e 20 63 72 65 61 74 65 73  function creates
d470: 20 74 68 65 20 73 65 63 6f 6e 64 20 69 6d 70 6f   the second impo
d480: 73 74 65 72 20 74 61 62 6c 65 20 75 73 65 64 20  ster table used 
d490: 77 68 65 6e 20 77 72 69 74 69 6e 67 20 74 6f 0a  when writing to.
d4a0: 2a 2a 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65  ** a table b-tre
d4b0: 65 20 77 68 65 72 65 20 74 68 65 20 74 61 62 6c  e where the tabl
d4c0: 65 20 68 61 73 20 61 6e 20 65 78 74 65 72 6e 61  e has an externa
d4d0: 6c 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 49  l primary key. I
d4e0: 66 20 74 68 65 0a 2a 2a 20 69 74 65 72 61 74 6f  f the.** iterato
d4f0: 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  r passed as the 
d500: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
d510: 64 6f 65 73 20 6e 6f 74 20 63 75 72 72 65 6e 74  does not current
d520: 6c 79 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 61  ly point to.** a
d530: 20 74 61 62 6c 65 20 28 6e 6f 74 20 69 6e 64 65   table (not inde
d540: 78 29 20 77 69 74 68 20 61 6e 20 65 78 74 65 72  x) with an exter
d550: 6e 61 6c 20 70 72 69 6d 61 72 79 20 6b 65 79 2c  nal primary key,
d560: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
d570: 73 20 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20 0a 2a  s a.** no-op. .*
d580: 2a 0a 2a 2a 20 41 73 73 75 6d 69 6e 67 20 74 68  *.** Assuming th
d590: 65 20 69 74 65 72 61 74 6f 72 20 64 6f 65 73 20  e iterator does 
d5a0: 70 6f 69 6e 74 20 74 6f 20 61 20 74 61 62 6c 65  point to a table
d5b0: 20 77 69 74 68 20 61 6e 20 65 78 74 65 72 6e 61   with an externa
d5c0: 6c 20 50 4b 2c 20 74 68 69 73 0a 2a 2a 20 66 75  l PK, this.** fu
d5d0: 6e 63 74 69 6f 6e 20 63 72 65 61 74 65 73 20 61  nction creates a
d5e0: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 69   WITHOUT ROWID i
d5f0: 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 20 6e 61  mposter table na
d600: 6d 65 64 20 22 72 62 75 5f 69 6d 70 6f 73 74 65  med "rbu_imposte
d610: 72 32 22 0a 2a 2a 20 75 73 65 64 20 74 6f 20 61  r2".** used to a
d620: 63 63 65 73 73 20 74 68 61 74 20 50 4b 20 69 6e  ccess that PK in
d630: 64 65 78 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  dex. For example
d640: 2c 20 69 66 20 74 68 65 20 74 61 72 67 65 74 20  , if the target 
d650: 74 61 62 6c 65 20 69 73 0a 2a 2a 20 64 65 63 6c  table is.** decl
d660: 61 72 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  ared as follows:
d670: 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45 20  .**.**   CREATE 
d680: 54 41 42 4c 45 20 74 31 28 61 2c 20 62 20 54 45  TABLE t1(a, b TE
d690: 58 54 2c 20 63 20 52 45 41 4c 2c 20 50 52 49 4d  XT, c REAL, PRIM
d6a0: 41 52 59 20 4b 45 59 28 62 2c 20 63 29 29 3b 0a  ARY KEY(b, c));.
d6b0: 2a 2a 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 69  **.** then the i
d6c0: 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 20 73 63  mposter table sc
d6d0: 68 65 6d 61 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  hema is:.**.**  
d6e0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 72 62   CREATE TABLE rb
d6f0: 75 5f 69 6d 70 6f 73 74 65 72 32 28 63 31 20 54  u_imposter2(c1 T
d700: 45 58 54 2c 20 63 32 20 52 45 41 4c 2c 20 69 64  EXT, c2 REAL, id
d710: 20 49 4e 54 45 47 45 52 29 20 57 49 54 48 4f 55   INTEGER) WITHOU
d720: 54 20 52 4f 57 49 44 3b 0a 2a 2a 0a 2a 2f 0a 73  T ROWID;.**.*/.s
d730: 74 61 74 69 63 20 76 6f 69 64 20 72 62 75 43 72  tatic void rbuCr
d740: 65 61 74 65 49 6d 70 6f 73 74 65 72 54 61 62 6c  eateImposterTabl
d750: 65 32 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70  e2(sqlite3rbu *p
d760: 2c 20 52 62 75 4f 62 6a 49 74 65 72 20 2a 70 49  , RbuObjIter *pI
d770: 74 65 72 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72  ter){.  if( p->r
d780: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
d790: 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42  pIter->eType==RB
d7a0: 55 5f 50 4b 5f 45 58 54 45 52 4e 41 4c 20 29 7b  U_PK_EXTERNAL ){
d7b0: 0a 20 20 20 20 69 6e 74 20 74 6e 75 6d 20 3d 20  .    int tnum = 
d7c0: 70 49 74 65 72 2d 3e 69 50 6b 54 6e 75 6d 3b 20  pIter->iPkTnum; 
d7d0: 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20     /* Root page 
d7e0: 6f 66 20 50 4b 20 69 6e 64 65 78 20 2a 2f 0a 20  of PK index */. 
d7f0: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20     sqlite3_stmt 
d800: 2a 70 51 75 65 72 79 20 3d 20 30 3b 20 20 20 20  *pQuery = 0;    
d810: 20 2f 2a 20 53 45 4c 45 43 54 20 6e 61 6d 65 20   /* SELECT name 
d820: 2e 2e 2e 20 57 48 45 52 45 20 72 6f 6f 74 70 61  ... WHERE rootpa
d830: 67 65 20 3d 20 24 74 6e 75 6d 20 2a 2f 0a 20 20  ge = $tnum */.  
d840: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49    const char *zI
d850: 64 78 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  dx = 0;         
d860: 2f 2a 20 4e 61 6d 65 20 6f 66 20 50 4b 20 69 6e  /* Name of PK in
d870: 64 65 78 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  dex */.    sqlit
d880: 65 33 5f 73 74 6d 74 20 2a 70 58 49 6e 66 6f 20  e3_stmt *pXInfo 
d890: 3d 20 30 3b 20 20 20 20 20 2f 2a 20 50 52 41 47  = 0;     /* PRAG
d8a0: 4d 41 20 6d 61 69 6e 2e 69 6e 64 65 78 5f 78 69  MA main.index_xi
d8b0: 6e 66 6f 20 3d 20 24 7a 49 64 78 20 2a 2f 0a 20  nfo = $zIdx */. 
d8c0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
d8d0: 43 6f 6d 6d 61 20 3d 20 22 22 3b 0a 20 20 20 20  Comma = "";.    
d8e0: 63 68 61 72 20 2a 7a 43 6f 6c 73 20 3d 20 30 3b  char *zCols = 0;
d8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d900: 20 55 73 65 64 20 74 6f 20 62 75 69 6c 64 20 75   Used to build u
d910: 70 20 6c 69 73 74 20 6f 66 20 74 61 62 6c 65 20  p list of table 
d920: 63 6f 6c 73 20 2a 2f 0a 20 20 20 20 63 68 61 72  cols */.    char
d930: 20 2a 7a 50 6b 20 3d 20 30 3b 20 20 20 20 20 20   *zPk = 0;      
d940: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
d950: 64 20 74 6f 20 62 75 69 6c 64 20 75 70 20 74 61  d to build up ta
d960: 62 6c 65 20 50 4b 20 64 65 63 6c 61 72 61 74 69  ble PK declarati
d970: 6f 6e 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46 69  on */..    /* Fi
d980: 67 75 72 65 20 6f 75 74 20 74 68 65 20 6e 61 6d  gure out the nam
d990: 65 20 6f 66 20 74 68 65 20 70 72 69 6d 61 72 79  e of the primary
d9a0: 20 6b 65 79 20 69 6e 64 65 78 20 66 6f 72 20 74   key index for t
d9b0: 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65  he current table
d9c0: 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73  ..    ** This is
d9d0: 20 6e 65 65 64 65 64 20 66 6f 72 20 74 68 65 20   needed for the 
d9e0: 61 72 67 75 6d 65 6e 74 20 74 6f 20 22 50 52 41  argument to "PRA
d9f0: 47 4d 41 20 69 6e 64 65 78 5f 78 69 6e 66 6f 22  GMA index_xinfo"
da00: 2e 20 53 65 74 0a 20 20 20 20 2a 2a 20 7a 49 64  . Set.    ** zId
da10: 78 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20  x to point to a 
da20: 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73  nul-terminated s
da30: 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67  tring containing
da40: 20 74 68 69 73 20 6e 61 6d 65 2e 20 2a 2f 0a 20   this name. */. 
da50: 20 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61     p->rc = prepa
da60: 72 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f  reAndCollectErro
da70: 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 70 51  r(p->dbMain, &pQ
da80: 75 65 72 79 2c 20 26 70 2d 3e 7a 45 72 72 6d 73  uery, &p->zErrms
da90: 67 2c 20 0a 20 20 20 20 20 20 20 20 22 53 45 4c  g, .        "SEL
daa0: 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71  ECT name FROM sq
dab0: 6c 69 74 65 5f 6d 61 73 74 65 72 20 57 48 45 52  lite_master WHER
dac0: 45 20 72 6f 6f 74 70 61 67 65 20 3d 20 3f 22 0a  E rootpage = ?".
dad0: 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 70      );.    if( p
dae0: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
daf0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
db00: 5f 62 69 6e 64 5f 69 6e 74 28 70 51 75 65 72 79  _bind_int(pQuery
db10: 2c 20 31 2c 20 74 6e 75 6d 29 3b 0a 20 20 20 20  , 1, tnum);.    
db20: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57    if( SQLITE_ROW
db30: 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ==sqlite3_step(p
db40: 51 75 65 72 79 29 20 29 7b 0a 20 20 20 20 20 20  Query) ){.      
db50: 20 20 7a 49 64 78 20 3d 20 28 63 6f 6e 73 74 20    zIdx = (const 
db60: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
db70: 6c 75 6d 6e 5f 74 65 78 74 28 70 51 75 65 72 79  lumn_text(pQuery
db80: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
db90: 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 49 64 78    }.    if( zIdx
dba0: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20   ){.      p->rc 
dbb0: 3d 20 70 72 65 70 61 72 65 46 72 65 65 41 6e 64  = prepareFreeAnd
dbc0: 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e  CollectError(p->
dbd0: 64 62 4d 61 69 6e 2c 20 26 70 58 49 6e 66 6f 2c  dbMain, &pXInfo,
dbe0: 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c 0a 20 20   &p->zErrmsg,.  
dbf0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
dc00: 6d 70 72 69 6e 74 66 28 22 50 52 41 47 4d 41 20  mprintf("PRAGMA 
dc10: 6d 61 69 6e 2e 69 6e 64 65 78 5f 78 69 6e 66 6f  main.index_xinfo
dc20: 20 3d 20 25 51 22 2c 20 7a 49 64 78 29 0a 20 20   = %Q", zIdx).  
dc30: 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20      );.    }.   
dc40: 20 72 62 75 46 69 6e 61 6c 69 7a 65 28 70 2c 20   rbuFinalize(p, 
dc50: 70 51 75 65 72 79 29 3b 0a 0a 20 20 20 20 77 68  pQuery);..    wh
dc60: 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ile( p->rc==SQLI
dc70: 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f  TE_OK && SQLITE_
dc80: 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW==sqlite3_ste
dc90: 70 28 70 58 49 6e 66 6f 29 20 29 7b 0a 20 20 20  p(pXInfo) ){.   
dca0: 20 20 20 69 6e 74 20 62 4b 65 79 20 3d 20 73 71     int bKey = sq
dcb0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
dcc0: 28 70 58 49 6e 66 6f 2c 20 35 29 3b 0a 20 20 20  (pXInfo, 5);.   
dcd0: 20 20 20 69 66 28 20 62 4b 65 79 20 29 7b 0a 20     if( bKey ){. 
dce0: 20 20 20 20 20 20 20 69 6e 74 20 69 43 69 64 20         int iCid 
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 31 29 3b  _int(pXInfo, 1);
dd10: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 62 44 65  .        int bDe
dd20: 73 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  sc = sqlite3_col
dd30: 75 6d 6e 5f 69 6e 74 28 70 58 49 6e 66 6f 2c 20  umn_int(pXInfo, 
dd40: 33 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  3);.        cons
dd50: 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 61 74 65  t char *zCollate
dd60: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
dd70: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
dd80: 65 78 74 28 70 58 49 6e 66 6f 2c 20 34 29 3b 0a  ext(pXInfo, 4);.
dd90: 20 20 20 20 20 20 20 20 7a 43 6f 6c 73 20 3d 20          zCols = 
dda0: 72 62 75 4d 50 72 69 6e 74 66 28 70 2c 20 22 25  rbuMPrintf(p, "%
ddb0: 7a 25 73 63 25 64 20 25 73 20 43 4f 4c 4c 41 54  z%sc%d %s COLLAT
ddc0: 45 20 25 73 22 2c 20 7a 43 6f 6c 73 2c 20 7a 43  E %s", zCols, zC
ddd0: 6f 6d 6d 61 2c 20 0a 20 20 20 20 20 20 20 20 20  omma, .         
dde0: 20 20 20 69 43 69 64 2c 20 70 49 74 65 72 2d 3e     iCid, pIter->
ddf0: 61 7a 54 62 6c 54 79 70 65 5b 69 43 69 64 5d 2c  azTblType[iCid],
de00: 20 7a 43 6f 6c 6c 61 74 65 0a 20 20 20 20 20 20   zCollate.      
de10: 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7a 50 6b    );.        zPk
de20: 20 3d 20 72 62 75 4d 50 72 69 6e 74 66 28 70 2c   = rbuMPrintf(p,
de30: 20 22 25 7a 25 73 63 25 64 25 73 22 2c 20 7a 50   "%z%sc%d%s", zP
de40: 6b 2c 20 7a 43 6f 6d 6d 61 2c 20 69 43 69 64 2c  k, zComma, iCid,
de50: 20 62 44 65 73 63 3f 22 20 44 45 53 43 22 3a 22   bDesc?" DESC":"
de60: 22 29 3b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6d  ");.        zCom
de70: 6d 61 20 3d 20 22 2c 20 22 3b 0a 20 20 20 20 20  ma = ", ";.     
de80: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 43 6f   }.    }.    zCo
de90: 6c 73 20 3d 20 72 62 75 4d 50 72 69 6e 74 66 28  ls = rbuMPrintf(
dea0: 70 2c 20 22 25 7a 2c 20 69 64 20 49 4e 54 45 47  p, "%z, id INTEG
deb0: 45 52 22 2c 20 7a 43 6f 6c 73 29 3b 0a 20 20 20  ER", zCols);.   
dec0: 20 72 62 75 46 69 6e 61 6c 69 7a 65 28 70 2c 20   rbuFinalize(p, 
ded0: 70 58 49 6e 66 6f 29 3b 0a 0a 20 20 20 20 73 71  pXInfo);..    sq
dee0: 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
def0: 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
df00: 52 4c 5f 49 4d 50 4f 53 54 45 52 2c 20 70 2d 3e  RL_IMPOSTER, p->
df10: 64 62 4d 61 69 6e 2c 20 22 6d 61 69 6e 22 2c 20  dbMain, "main", 
df20: 31 2c 20 74 6e 75 6d 29 3b 0a 20 20 20 20 72 62  1, tnum);.    rb
df30: 75 4d 50 72 69 6e 74 66 45 78 65 63 28 70 2c 20  uMPrintfExec(p, 
df40: 70 2d 3e 64 62 4d 61 69 6e 2c 0a 20 20 20 20 20  p->dbMain,.     
df50: 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45     "CREATE TABLE
df60: 20 72 62 75 5f 69 6d 70 6f 73 74 65 72 32 28 25   rbu_imposter2(%
df70: 7a 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28 25  z, PRIMARY KEY(%
df80: 7a 29 29 20 57 49 54 48 4f 55 54 20 52 4f 57 49  z)) WITHOUT ROWI
df90: 44 22 2c 20 0a 20 20 20 20 20 20 20 20 7a 43 6f  D", .        zCo
dfa0: 6c 73 2c 20 7a 50 6b 0a 20 20 20 20 29 3b 0a 20  ls, zPk.    );. 
dfb0: 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f     sqlite3_test_
dfc0: 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
dfd0: 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52  ESTCTRL_IMPOSTER
dfe0: 2c 20 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 6d 61  , p->dbMain, "ma
dff0: 69 6e 22 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  in", 0, 0);.  }.
e000: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  }../*.** If an e
e010: 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79  rror has already
e020: 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e 20 74   occurred when t
e030: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
e040: 63 61 6c 6c 65 64 2c 20 69 74 20 0a 2a 2a 20 69  called, it .** i
e050: 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 74 75 72  mmediately retur
e060: 6e 73 20 7a 65 72 6f 20 28 77 69 74 68 6f 75 74  ns zero (without
e070: 20 64 6f 69 6e 67 20 61 6e 79 20 77 6f 72 6b 29   doing any work)
e080: 2e 20 4f 72 2c 20 69 66 20 61 6e 20 65 72 72 6f  . Or, if an erro
e090: 72 0a 2a 2a 20 6f 63 63 75 72 73 20 64 75 72 69  r.** occurs duri
e0a0: 6e 67 20 74 68 65 20 65 78 65 63 75 74 69 6f 6e  ng the execution
e0b0: 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
e0c0: 6e 2c 20 69 74 20 73 65 74 73 20 74 68 65 20 65  n, it sets the e
e0d0: 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 69 6e 20  rror code.** in 
e0e0: 74 68 65 20 73 71 6c 69 74 65 33 72 62 75 20 6f  the sqlite3rbu o
e0f0: 62 6a 65 63 74 20 69 6e 64 69 63 61 74 65 64 20  bject indicated 
e100: 62 79 20 74 68 65 20 66 69 72 73 74 20 61 72 67  by the first arg
e110: 75 6d 65 6e 74 20 61 6e 64 20 72 65 74 75 72 6e  ument and return
e120: 73 0a 2a 2a 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a  s.** zero..**.**
e130: 20 54 68 65 20 69 74 65 72 61 74 6f 72 20 70 61   The iterator pa
e140: 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
e150: 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 67  nd argument is g
e160: 75 61 72 61 6e 74 65 65 64 20 74 6f 20 70 6f 69  uaranteed to poi
e170: 6e 74 20 74 6f 0a 2a 2a 20 61 20 74 61 62 6c 65  nt to.** a table
e180: 20 28 6e 6f 74 20 61 6e 20 69 6e 64 65 78 29 20   (not an index) 
e190: 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
e1a0: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 20 54 68  on is called. Th
e1b0: 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61  is function.** a
e1c0: 74 74 65 6d 70 74 73 20 74 6f 20 63 72 65 61 74  ttempts to creat
e1d0: 65 20 61 6e 79 20 69 6d 70 6f 73 74 65 72 20 74  e any imposter t
e1e0: 61 62 6c 65 20 72 65 71 75 69 72 65 64 20 74 6f  able required to
e1f0: 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6d 61   write to the ma
e200: 69 6e 0a 2a 2a 20 74 61 62 6c 65 20 62 2d 74 72  in.** table b-tr
e210: 65 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ee of the table 
e220: 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
e230: 2e 20 4e 6f 6e 2d 7a 65 72 6f 20 69 73 20 72 65  . Non-zero is re
e240: 74 75 72 6e 65 64 20 69 66 0a 2a 2a 20 61 6e 20  turned if.** an 
e250: 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 20 61  imposter table a
e260: 72 65 20 63 72 65 61 74 65 64 2c 20 6f 72 20 7a  re created, or z
e270: 65 72 6f 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  ero otherwise..*
e280: 2a 0a 2a 2a 20 41 6e 20 69 6d 70 6f 73 74 65 72  *.** An imposter
e290: 20 74 61 62 6c 65 20 69 73 20 72 65 71 75 69 72   table is requir
e2a0: 65 64 20 69 6e 20 61 6c 6c 20 63 61 73 65 73 20  ed in all cases 
e2b0: 65 78 63 65 70 74 20 52 42 55 5f 50 4b 5f 56 54  except RBU_PK_VT
e2c0: 41 42 2e 20 4f 6e 6c 79 0a 2a 2a 20 76 69 72 74  AB. Only.** virt
e2d0: 75 61 6c 20 74 61 62 6c 65 73 20 61 72 65 20 77  ual tables are w
e2e0: 72 69 74 74 65 6e 20 74 6f 20 64 69 72 65 63 74  ritten to direct
e2f0: 6c 79 2e 20 54 68 65 20 69 6d 70 6f 73 74 65 72  ly. The imposter
e300: 20 74 61 62 6c 65 20 68 61 73 20 74 68 65 20 0a   table has the .
e310: 2a 2a 20 73 61 6d 65 20 73 63 68 65 6d 61 20 61  ** same schema a
e320: 73 20 74 68 65 20 61 63 74 75 61 6c 20 74 61 72  s the actual tar
e330: 67 65 74 20 74 61 62 6c 65 20 28 6c 65 73 73 20  get table (less 
e340: 61 6e 79 20 55 4e 49 51 55 45 20 63 6f 6e 73 74  any UNIQUE const
e350: 72 61 69 6e 74 73 29 2e 20 0a 2a 2a 20 4d 6f 72  raints). .** Mor
e360: 65 20 70 72 65 63 69 73 65 6c 79 2c 20 74 68 65  e precisely, the
e370: 20 22 73 61 6d 65 20 73 63 68 65 6d 61 22 20 6d   "same schema" m
e380: 65 61 6e 73 20 74 68 65 20 73 61 6d 65 20 63 6f  eans the same co
e390: 6c 75 6d 6e 73 2c 20 74 79 70 65 73 2c 20 0a 2a  lumns, types, .*
e3a0: 2a 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  * collation sequ
e3b0: 65 6e 63 65 73 2e 20 46 6f 72 20 74 61 62 6c 65  ences. For table
e3c0: 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 68 61  s that do not ha
e3d0: 76 65 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 50  ve an external P
e3e0: 52 49 4d 41 52 59 0a 2a 2a 20 4b 45 59 2c 20 69  RIMARY.** KEY, i
e3f0: 74 20 61 6c 73 6f 20 6d 65 61 6e 73 20 74 68 65  t also means the
e400: 20 73 61 6d 65 20 50 52 49 4d 41 52 59 20 4b 45   same PRIMARY KE
e410: 59 20 64 65 63 6c 61 72 61 74 69 6f 6e 2e 0a 2a  Y declaration..*
e420: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62  /.static void rb
e430: 75 43 72 65 61 74 65 49 6d 70 6f 73 74 65 72 54  uCreateImposterT
e440: 61 62 6c 65 28 73 71 6c 69 74 65 33 72 62 75 20  able(sqlite3rbu 
e450: 2a 70 2c 20 52 62 75 4f 62 6a 49 74 65 72 20 2a  *p, RbuObjIter *
e460: 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70 2d  pIter){.  if( p-
e470: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
e480: 26 20 70 49 74 65 72 2d 3e 65 54 79 70 65 21 3d  & pIter->eType!=
e490: 52 42 55 5f 50 4b 5f 56 54 41 42 20 29 7b 0a 20  RBU_PK_VTAB ){. 
e4a0: 20 20 20 69 6e 74 20 74 6e 75 6d 20 3d 20 70 49     int tnum = pI
e4b0: 74 65 72 2d 3e 69 54 6e 75 6d 3b 0a 20 20 20 20  ter->iTnum;.    
e4c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6d  const char *zCom
e4d0: 6d 61 20 3d 20 22 22 3b 0a 20 20 20 20 63 68 61  ma = "";.    cha
e4e0: 72 20 2a 7a 53 71 6c 20 3d 20 30 3b 0a 20 20 20  r *zSql = 0;.   
e4f0: 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20 73   int iCol;.    s
e500: 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
e510: 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
e520: 54 52 4c 5f 49 4d 50 4f 53 54 45 52 2c 20 70 2d  TRL_IMPOSTER, p-
e530: 3e 64 62 4d 61 69 6e 2c 20 22 6d 61 69 6e 22 2c  >dbMain, "main",
e540: 20 30 2c 20 31 29 3b 0a 0a 20 20 20 20 66 6f 72   0, 1);..    for
e550: 28 69 43 6f 6c 3d 30 3b 20 70 2d 3e 72 63 3d 3d  (iCol=0; p->rc==
e560: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 43 6f  SQLITE_OK && iCo
e570: 6c 3c 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c  l<pIter->nTblCol
e580: 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20  ; iCol++){.     
e590: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 6b   const char *zPk
e5a0: 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 63 6f 6e   = "";.      con
e5b0: 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 20 3d 20  st char *zCol = 
e5c0: 70 49 74 65 72 2d 3e 61 7a 54 62 6c 43 6f 6c 5b  pIter->azTblCol[
e5d0: 69 43 6f 6c 5d 3b 0a 20 20 20 20 20 20 63 6f 6e  iCol];.      con
e5e0: 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d  st char *zColl =
e5f0: 20 30 3b 0a 0a 20 20 20 20 20 20 70 2d 3e 72 63   0;..      p->rc
e600: 20 3d 20 73 71 6c 69 74 65 33 5f 74 61 62 6c 65   = sqlite3_table
e610: 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61  _column_metadata
e620: 28 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 64  (.          p->d
e630: 62 4d 61 69 6e 2c 20 22 6d 61 69 6e 22 2c 20 70  bMain, "main", p
e640: 49 74 65 72 2d 3e 7a 54 62 6c 2c 20 7a 43 6f 6c  Iter->zTbl, zCol
e650: 2c 20 30 2c 20 26 7a 43 6f 6c 6c 2c 20 30 2c 20  , 0, &zColl, 0, 
e660: 30 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a 0a 20  0, 0.      );.. 
e670: 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e       if( pIter->
e680: 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 49 50  eType==RBU_PK_IP
e690: 4b 20 26 26 20 70 49 74 65 72 2d 3e 61 62 54 62  K && pIter->abTb
e6a0: 6c 50 6b 5b 69 43 6f 6c 5d 20 29 7b 0a 20 20 20  lPk[iCol] ){.   
e6b0: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 74       /* If the t
e6c0: 61 72 67 65 74 20 74 61 62 6c 65 20 63 6f 6c 75  arget table colu
e6d0: 6d 6e 20 69 73 20 61 6e 20 22 49 4e 54 45 47 45  mn is an "INTEGE
e6e0: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 22 2c 20  R PRIMARY KEY", 
e6f0: 61 64 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 22  add.        ** "
e700: 50 52 49 4d 41 52 59 20 4b 45 59 22 20 74 6f 20  PRIMARY KEY" to 
e710: 74 68 65 20 69 6d 70 6f 73 74 65 72 20 74 61 62  the imposter tab
e720: 6c 65 20 63 6f 6c 75 6d 6e 20 64 65 63 6c 61 72  le column declar
e730: 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20  ation. */.      
e740: 20 20 7a 50 6b 20 3d 20 22 50 52 49 4d 41 52 59    zPk = "PRIMARY
e750: 20 4b 45 59 20 22 3b 0a 20 20 20 20 20 20 7d 0a   KEY ";.      }.
e760: 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 72 62 75        zSql = rbu
e770: 4d 50 72 69 6e 74 66 28 70 2c 20 22 25 7a 25 73  MPrintf(p, "%z%s
e780: 5c 22 25 77 5c 22 20 25 73 20 25 73 43 4f 4c 4c  \"%w\" %s %sCOLL
e790: 41 54 45 20 25 73 25 73 22 2c 20 0a 20 20 20 20  ATE %s%s", .    
e7a0: 20 20 20 20 20 20 7a 53 71 6c 2c 20 7a 43 6f 6d        zSql, zCom
e7b0: 6d 61 2c 20 7a 43 6f 6c 2c 20 70 49 74 65 72 2d  ma, zCol, pIter-
e7c0: 3e 61 7a 54 62 6c 54 79 70 65 5b 69 43 6f 6c 5d  >azTblType[iCol]
e7d0: 2c 20 7a 50 6b 2c 20 7a 43 6f 6c 6c 2c 0a 20 20  , zPk, zColl,.  
e7e0: 20 20 20 20 20 20 20 20 28 70 49 74 65 72 2d 3e          (pIter->
e7f0: 61 62 4e 6f 74 4e 75 6c 6c 5b 69 43 6f 6c 5d 20  abNotNull[iCol] 
e800: 3f 20 22 20 4e 4f 54 20 4e 55 4c 4c 22 20 3a 20  ? " NOT NULL" : 
e810: 22 22 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  "").      );.   
e820: 20 20 20 7a 43 6f 6d 6d 61 20 3d 20 22 2c 20 22     zComma = ", "
e830: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
e840: 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52   pIter->eType==R
e850: 42 55 5f 50 4b 5f 57 49 54 48 4f 55 54 5f 52 4f  BU_PK_WITHOUT_RO
e860: 57 49 44 20 29 7b 0a 20 20 20 20 20 20 63 68 61  WID ){.      cha
e870: 72 20 2a 7a 50 6b 20 3d 20 72 62 75 57 69 74 68  r *zPk = rbuWith
e880: 6f 75 74 52 6f 77 69 64 50 4b 28 70 2c 20 70 49  outRowidPK(p, pI
e890: 74 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ter);.      if( 
e8a0: 7a 50 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  zPk ){.        z
e8b0: 53 71 6c 20 3d 20 72 62 75 4d 50 72 69 6e 74 66  Sql = rbuMPrintf
e8c0: 28 70 2c 20 22 25 7a 2c 20 25 7a 22 2c 20 7a 53  (p, "%z, %z", zS
e8d0: 71 6c 2c 20 7a 50 6b 29 3b 0a 20 20 20 20 20 20  ql, zPk);.      
e8e0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c  }.    }..    sql
e8f0: 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
e900: 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
e910: 4c 5f 49 4d 50 4f 53 54 45 52 2c 20 70 2d 3e 64  L_IMPOSTER, p->d
e920: 62 4d 61 69 6e 2c 20 22 6d 61 69 6e 22 2c 20 31  bMain, "main", 1
e930: 2c 20 74 6e 75 6d 29 3b 0a 20 20 20 20 72 62 75  , tnum);.    rbu
e940: 4d 50 72 69 6e 74 66 45 78 65 63 28 70 2c 20 70  MPrintfExec(p, p
e950: 2d 3e 64 62 4d 61 69 6e 2c 20 22 43 52 45 41 54  ->dbMain, "CREAT
e960: 45 20 54 41 42 4c 45 20 5c 22 72 62 75 5f 69 6d  E TABLE \"rbu_im
e970: 70 5f 25 77 5c 22 28 25 7a 29 25 73 22 2c 20 0a  p_%w\"(%z)%s", .
e980: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 7a          pIter->z
e990: 54 62 6c 2c 20 7a 53 71 6c 2c 20 0a 20 20 20 20  Tbl, zSql, .    
e9a0: 20 20 20 20 28 70 49 74 65 72 2d 3e 65 54 79 70      (pIter->eTyp
e9b0: 65 3d 3d 52 42 55 5f 50 4b 5f 57 49 54 48 4f 55  e==RBU_PK_WITHOU
e9c0: 54 5f 52 4f 57 49 44 20 3f 20 22 20 57 49 54 48  T_ROWID ? " WITH
e9d0: 4f 55 54 20 52 4f 57 49 44 22 20 3a 20 22 22 29  OUT ROWID" : "")
e9e0: 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69  .    );.    sqli
e9f0: 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
ea00: 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
ea10: 5f 49 4d 50 4f 53 54 45 52 2c 20 70 2d 3e 64 62  _IMPOSTER, p->db
ea20: 4d 61 69 6e 2c 20 22 6d 61 69 6e 22 2c 20 30 2c  Main, "main", 0,
ea30: 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   0);.  }.}../*.*
ea40: 2a 20 50 72 65 70 61 72 65 20 61 20 73 74 61 74  * Prepare a stat
ea50: 65 6d 65 6e 74 20 75 73 65 64 20 74 6f 20 69 6e  ement used to in
ea60: 73 65 72 74 20 72 6f 77 73 20 69 6e 74 6f 20 74  sert rows into t
ea70: 68 65 20 22 72 62 75 5f 74 6d 70 5f 78 78 78 22  he "rbu_tmp_xxx"
ea80: 20 74 61 62 6c 65 2e 0a 2a 2a 20 53 70 65 63 69   table..** Speci
ea90: 66 69 63 61 6c 6c 79 20 61 20 73 74 61 74 65 6d  fically a statem
eaa0: 65 6e 74 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a  ent of the form:
eab0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 49 4e 53 45 52  .**.**     INSER
eac0: 54 20 49 4e 54 4f 20 72 62 75 5f 74 6d 70 5f 78  T INTO rbu_tmp_x
ead0: 78 78 20 56 41 4c 55 45 53 28 3f 2c 20 3f 2c 20  xx VALUES(?, ?, 
eae0: 3f 20 2e 2e 2e 29 3b 0a 2a 2a 0a 2a 2a 20 54 68  ? ...);.**.** Th
eaf0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 6f 75 6e  e number of boun
eb00: 64 20 76 61 72 69 61 62 6c 65 73 20 69 73 20 65  d variables is e
eb10: 71 75 61 6c 20 74 6f 20 74 68 65 20 6e 75 6d 62  qual to the numb
eb20: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
eb30: 0a 2a 2a 20 74 68 65 20 74 61 72 67 65 74 20 74  .** the target t
eb40: 61 62 6c 65 2c 20 70 6c 75 73 20 6f 6e 65 20 28  able, plus one (
eb50: 66 6f 72 20 74 68 65 20 72 62 75 5f 63 6f 6e 74  for the rbu_cont
eb60: 72 6f 6c 20 63 6f 6c 75 6d 6e 29 2c 20 70 6c 75  rol column), plu
eb70: 73 20 6f 6e 65 20 6d 6f 72 65 20 0a 2a 2a 20 28  s one more .** (
eb80: 66 6f 72 20 74 68 65 20 72 62 75 5f 72 6f 77 69  for the rbu_rowi
eb90: 64 20 63 6f 6c 75 6d 6e 29 20 69 66 20 74 68 65  d column) if the
eba0: 20 74 61 72 67 65 74 20 74 61 62 6c 65 20 69 73   target table is
ebb0: 20 61 6e 20 69 6d 70 6c 69 63 69 74 20 49 50 4b   an implicit IPK
ebc0: 20 6f 72 20 0a 2a 2a 20 76 69 72 74 75 61 6c 20   or .** virtual 
ebd0: 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  table..*/.static
ebe0: 20 76 6f 69 64 20 72 62 75 4f 62 6a 49 74 65 72   void rbuObjIter
ebf0: 50 72 65 70 61 72 65 54 6d 70 49 6e 73 65 72 74  PrepareTmpInsert
ec00: 28 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20 2a  (.  sqlite3rbu *
ec10: 70 2c 20 0a 20 20 52 62 75 4f 62 6a 49 74 65 72  p, .  RbuObjIter
ec20: 20 2a 70 49 74 65 72 2c 0a 20 20 63 6f 6e 73 74   *pIter,.  const
ec30: 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 69 73 74 2c   char *zCollist,
ec40: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
ec50: 52 62 75 52 6f 77 69 64 0a 29 7b 0a 20 20 69 6e  RbuRowid.){.  in
ec60: 74 20 62 52 62 75 52 6f 77 69 64 20 3d 20 28 70  t bRbuRowid = (p
ec70: 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55  Iter->eType==RBU
ec80: 5f 50 4b 5f 45 58 54 45 52 4e 41 4c 20 7c 7c 20  _PK_EXTERNAL || 
ec90: 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42  pIter->eType==RB
eca0: 55 5f 50 4b 5f 4e 4f 4e 45 29 3b 0a 20 20 63 68  U_PK_NONE);.  ch
ecb0: 61 72 20 2a 7a 42 69 6e 64 20 3d 20 72 62 75 4f  ar *zBind = rbuO
ecc0: 62 6a 49 74 65 72 47 65 74 42 69 6e 64 6c 69 73  bjIterGetBindlis
ecd0: 74 28 70 2c 20 70 49 74 65 72 2d 3e 6e 54 62 6c  t(p, pIter->nTbl
ece0: 43 6f 6c 20 2b 20 31 20 2b 20 62 52 62 75 52 6f  Col + 1 + bRbuRo
ecf0: 77 69 64 29 3b 0a 20 20 69 66 28 20 7a 42 69 6e  wid);.  if( zBin
ed00: 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  d ){.    assert(
ed10: 20 70 49 74 65 72 2d 3e 70 54 6d 70 49 6e 73 65   pIter->pTmpInse
ed20: 72 74 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e  rt==0 );.    p->
ed30: 72 63 20 3d 20 70 72 65 70 61 72 65 46 72 65 65  rc = prepareFree
ed40: 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28  AndCollectError(
ed50: 0a 20 20 20 20 20 20 20 20 70 2d 3e 64 62 52 62  .        p->dbRb
ed60: 75 2c 20 26 70 49 74 65 72 2d 3e 70 54 6d 70 49  u, &pIter->pTmpI
ed70: 6e 73 65 72 74 2c 20 26 70 2d 3e 7a 45 72 72 6d  nsert, &p->zErrm
ed80: 73 67 2c 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  sg, sqlite3_mpri
ed90: 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 22  ntf(.          "
eda0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 25 73 2e 27  INSERT INTO %s.'
edb0: 72 62 75 5f 74 6d 70 5f 25 71 27 28 72 62 75 5f  rbu_tmp_%q'(rbu_
edc0: 63 6f 6e 74 72 6f 6c 2c 25 73 25 73 29 20 56 41  control,%s%s) VA
edd0: 4c 55 45 53 28 25 7a 29 22 2c 20 0a 20 20 20 20  LUES(%z)", .    
ede0: 20 20 20 20 20 20 70 2d 3e 7a 53 74 61 74 65 44        p->zStateD
edf0: 62 2c 20 70 49 74 65 72 2d 3e 7a 44 61 74 61 54  b, pIter->zDataT
ee00: 62 6c 2c 20 7a 43 6f 6c 6c 69 73 74 2c 20 7a 52  bl, zCollist, zR
ee10: 62 75 52 6f 77 69 64 2c 20 7a 42 69 6e 64 0a 20  buRowid, zBind. 
ee20: 20 20 20 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74     ));.  }.}..st
ee30: 61 74 69 63 20 76 6f 69 64 20 72 62 75 54 6d 70  atic void rbuTmp
ee40: 49 6e 73 65 72 74 46 75 6e 63 28 0a 20 20 73 71  InsertFunc(.  sq
ee50: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70  lite3_context *p
ee60: 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 56 61 6c  Ctx, .  int nVal
ee70: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
ee80: 65 20 2a 2a 61 70 56 61 6c 0a 29 7b 0a 20 20 73  e **apVal.){.  s
ee90: 71 6c 69 74 65 33 72 62 75 20 2a 70 20 3d 20 73  qlite3rbu *p = s
eea0: 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61  qlite3_user_data
eeb0: 28 70 43 74 78 29 3b 0a 20 20 69 6e 74 20 72 63  (pCtx);.  int rc
eec0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
eed0: 69 6e 74 20 69 3b 0a 0a 20 20 66 6f 72 28 69 3d  int i;..  for(i=
eee0: 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
eef0: 20 26 26 20 69 3c 6e 56 61 6c 3b 20 69 2b 2b 29   && i<nVal; i++)
ef00: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
ef10: 65 33 5f 62 69 6e 64 5f 76 61 6c 75 65 28 70 2d  e3_bind_value(p-
ef20: 3e 6f 62 6a 69 74 65 72 2e 70 54 6d 70 49 6e 73  >objiter.pTmpIns
ef30: 65 72 74 2c 20 69 2b 31 2c 20 61 70 56 61 6c 5b  ert, i+1, apVal[
ef40: 69 5d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  i]);.  }.  if( r
ef50: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
ef60: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70      sqlite3_step
ef70: 28 70 2d 3e 6f 62 6a 69 74 65 72 2e 70 54 6d 70  (p->objiter.pTmp
ef80: 49 6e 73 65 72 74 29 3b 0a 20 20 20 20 72 63 20  Insert);.    rc 
ef90: 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
efa0: 70 2d 3e 6f 62 6a 69 74 65 72 2e 70 54 6d 70 49  p->objiter.pTmpI
efb0: 6e 73 65 72 74 29 3b 0a 20 20 7d 0a 0a 20 20 69  nsert);.  }..  i
efc0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
efd0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
efe0: 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 63 6f 64  result_error_cod
eff0: 65 28 70 43 74 78 2c 20 72 63 29 3b 0a 20 20 7d  e(pCtx, rc);.  }
f000: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 73 75 72 65  .}../*.** Ensure
f010: 20 74 68 61 74 20 74 68 65 20 53 51 4c 69 74 65   that the SQLite
f020: 20 73 74 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c   statement handl
f030: 65 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 75  es required to u
f040: 70 64 61 74 65 20 74 68 65 20 0a 2a 2a 20 74 61  pdate the .** ta
f050: 72 67 65 74 20 64 61 74 61 62 61 73 65 20 6f 62  rget database ob
f060: 6a 65 63 74 20 63 75 72 72 65 6e 74 6c 79 20 69  ject currently i
f070: 6e 64 69 63 61 74 65 64 20 62 79 20 74 68 65 20  ndicated by the 
f080: 69 74 65 72 61 74 6f 72 20 70 61 73 73 65 64 20  iterator passed 
f090: 0a 2a 2a 20 61 73 20 74 68 65 20 73 65 63 6f 6e  .** as the secon
f0a0: 64 20 61 72 67 75 6d 65 6e 74 20 61 72 65 20 61  d argument are a
f0b0: 76 61 69 6c 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  vailable..*/.sta
f0c0: 74 69 63 20 69 6e 74 20 72 62 75 4f 62 6a 49 74  tic int rbuObjIt
f0d0: 65 72 50 72 65 70 61 72 65 41 6c 6c 28 0a 20 20  erPrepareAll(.  
f0e0: 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20 0a  sqlite3rbu *p, .
f0f0: 20 20 52 62 75 4f 62 6a 49 74 65 72 20 2a 70 49    RbuObjIter *pI
f100: 74 65 72 2c 0a 20 20 69 6e 74 20 6e 4f 66 66 73  ter,.  int nOffs
f110: 65 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  et              
f120: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 22 4c         /* Add "L
f130: 49 4d 49 54 20 2d 31 20 4f 46 46 53 45 54 20 24  IMIT -1 OFFSET $
f140: 6e 4f 66 66 73 65 74 22 20 74 6f 20 53 45 4c 45  nOffset" to SELE
f150: 43 54 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72  CT */.){.  asser
f160: 74 28 20 70 49 74 65 72 2d 3e 62 43 6c 65 61 6e  t( pIter->bClean
f170: 75 70 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  up==0 );.  if( p
f180: 49 74 65 72 2d 3e 70 53 65 6c 65 63 74 3d 3d 30  Iter->pSelect==0
f190: 20 26 26 20 72 62 75 4f 62 6a 49 74 65 72 43 61   && rbuObjIterCa
f1a0: 63 68 65 54 61 62 6c 65 49 6e 66 6f 28 70 2c 20  cheTableInfo(p, 
f1b0: 70 49 74 65 72 29 3d 3d 53 51 4c 49 54 45 5f 4f  pIter)==SQLITE_O
f1c0: 4b 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69  K ){.    const i
f1d0: 6e 74 20 74 6e 75 6d 20 3d 20 70 49 74 65 72 2d  nt tnum = pIter-
f1e0: 3e 69 54 6e 75 6d 3b 0a 20 20 20 20 63 68 61 72  >iTnum;.    char
f1f0: 20 2a 7a 43 6f 6c 6c 69 73 74 20 3d 20 30 3b 20   *zCollist = 0; 
f200: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
f210: 74 20 6f 66 20 69 6e 64 65 78 65 64 20 63 6f 6c  t of indexed col
f220: 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 63 68 61 72  umns */.    char
f230: 20 2a 2a 70 7a 20 3d 20 26 70 2d 3e 7a 45 72 72   **pz = &p->zErr
f240: 6d 73 67 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  msg;.    const c
f250: 68 61 72 20 2a 7a 49 64 78 20 3d 20 70 49 74 65  har *zIdx = pIte
f260: 72 2d 3e 7a 49 64 78 3b 0a 20 20 20 20 63 68 61  r->zIdx;.    cha
f270: 72 20 2a 7a 4c 69 6d 69 74 20 3d 20 30 3b 0a 0a  r *zLimit = 0;..
f280: 20 20 20 20 69 66 28 20 6e 4f 66 66 73 65 74 20      if( nOffset 
f290: 29 7b 0a 20 20 20 20 20 20 7a 4c 69 6d 69 74 20  ){.      zLimit 
f2a0: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
f2b0: 66 28 22 20 4c 49 4d 49 54 20 2d 31 20 4f 46 46  f(" LIMIT -1 OFF
f2c0: 53 45 54 20 25 64 22 2c 20 6e 4f 66 66 73 65 74  SET %d", nOffset
f2d0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 4c  );.      if( !zL
f2e0: 69 6d 69 74 20 29 20 70 2d 3e 72 63 20 3d 20 53  imit ) p->rc = S
f2f0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
f300: 20 7d 0a 0a 20 20 20 20 69 66 28 20 7a 49 64 78   }..    if( zIdx
f310: 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   ){.      const 
f320: 63 68 61 72 20 2a 7a 54 62 6c 20 3d 20 70 49 74  char *zTbl = pIt
f330: 65 72 2d 3e 7a 54 62 6c 3b 0a 20 20 20 20 20 20  er->zTbl;.      
f340: 63 68 61 72 20 2a 7a 49 6d 70 6f 73 74 65 72 43  char *zImposterC
f350: 6f 6c 73 20 3d 20 30 3b 20 20 20 20 2f 2a 20 43  ols = 0;    /* C
f360: 6f 6c 75 6d 6e 73 20 66 6f 72 20 69 6d 70 6f 73  olumns for impos
f370: 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  ter table */.   
f380: 20 20 20 63 68 61 72 20 2a 7a 49 6d 70 6f 73 74     char *zImpost
f390: 65 72 50 4b 20 3d 20 30 3b 20 20 20 20 20 20 2f  erPK = 0;      /
f3a0: 2a 20 50 72 69 6d 61 72 79 20 6b 65 79 20 64 65  * Primary key de
f3b0: 63 6c 61 72 61 74 69 6f 6e 20 66 6f 72 20 69 6d  claration for im
f3c0: 70 6f 73 74 65 72 20 2a 2f 0a 20 20 20 20 20 20  poster */.      
f3d0: 63 68 61 72 20 2a 7a 57 68 65 72 65 20 3d 20 30  char *zWhere = 0
f3e0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  ;           /* W
f3f0: 48 45 52 45 20 63 6c 61 75 73 65 20 6f 6e 20 50  HERE clause on P
f400: 4b 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20  K columns */.   
f410: 20 20 20 63 68 61 72 20 2a 7a 42 69 6e 64 20 3d     char *zBind =
f420: 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42   0;.      int nB
f430: 69 6e 64 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20  ind = 0;..      
f440: 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 65  assert( pIter->e
f450: 54 79 70 65 21 3d 52 42 55 5f 50 4b 5f 56 54 41  Type!=RBU_PK_VTA
f460: 42 20 29 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c  B );.      zColl
f470: 69 73 74 20 3d 20 72 62 75 4f 62 6a 49 74 65 72  ist = rbuObjIter
f480: 47 65 74 49 6e 64 65 78 43 6f 6c 73 28 0a 20 20  GetIndexCols(.  
f490: 20 20 20 20 20 20 20 20 70 2c 20 70 49 74 65 72          p, pIter
f4a0: 2c 20 26 7a 49 6d 70 6f 73 74 65 72 43 6f 6c 73  , &zImposterCols
f4b0: 2c 20 26 7a 49 6d 70 6f 73 74 65 72 50 4b 2c 20  , &zImposterPK, 
f4c0: 26 7a 57 68 65 72 65 2c 20 26 6e 42 69 6e 64 0a  &zWhere, &nBind.
f4d0: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7a        );.      z
f4e0: 42 69 6e 64 20 3d 20 72 62 75 4f 62 6a 49 74 65  Bind = rbuObjIte
f4f0: 72 47 65 74 42 69 6e 64 6c 69 73 74 28 70 2c 20  rGetBindlist(p, 
f500: 6e 42 69 6e 64 29 3b 0a 0a 20 20 20 20 20 20 2f  nBind);..      /
f510: 2a 20 43 72 65 61 74 65 20 74 68 65 20 69 6d 70  * Create the imp
f520: 6f 73 74 65 72 20 74 61 62 6c 65 20 75 73 65 64  oster table used
f530: 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 69   to write to thi
f540: 73 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20 20 20  s index. */.    
f550: 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
f560: 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
f570: 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52 2c  STCTRL_IMPOSTER,
f580: 20 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 6d 61 69   p->dbMain, "mai
f590: 6e 22 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20 20  n", 0, 1);.     
f5a0: 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
f5b0: 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
f5c0: 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52 2c 20  TCTRL_IMPOSTER, 
f5d0: 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 6d 61 69 6e  p->dbMain, "main
f5e0: 22 2c 20 31 2c 74 6e 75 6d 29 3b 0a 20 20 20 20  ", 1,tnum);.    
f5f0: 20 20 72 62 75 4d 50 72 69 6e 74 66 45 78 65 63    rbuMPrintfExec
f600: 28 70 2c 20 70 2d 3e 64 62 4d 61 69 6e 2c 0a 20  (p, p->dbMain,. 
f610: 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45           "CREATE
f620: 20 54 41 42 4c 45 20 5c 22 72 62 75 5f 69 6d 70   TABLE \"rbu_imp
f630: 5f 25 77 5c 22 28 20 25 73 2c 20 50 52 49 4d 41  _%w\"( %s, PRIMA
f640: 52 59 20 4b 45 59 28 20 25 73 20 29 20 29 20 57  RY KEY( %s ) ) W
f650: 49 54 48 4f 55 54 20 52 4f 57 49 44 22 2c 0a 20  ITHOUT ROWID",. 
f660: 20 20 20 20 20 20 20 20 20 7a 54 62 6c 2c 20 7a           zTbl, z
f670: 49 6d 70 6f 73 74 65 72 43 6f 6c 73 2c 20 7a 49  ImposterCols, zI
f680: 6d 70 6f 73 74 65 72 50 4b 0a 20 20 20 20 20 20  mposterPK.      
f690: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
f6a0: 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
f6b0: 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d  LITE_TESTCTRL_IM
f6c0: 50 4f 53 54 45 52 2c 20 70 2d 3e 64 62 4d 61 69  POSTER, p->dbMai
f6d0: 6e 2c 20 22 6d 61 69 6e 22 2c 20 30 2c 20 30 29  n, "main", 0, 0)
f6e0: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 72 65 61  ;..      /* Crea
f6f0: 74 65 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  te the statement
f700: 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 64 65 78   to insert index
f710: 20 65 6e 74 72 69 65 73 20 2a 2f 0a 20 20 20 20   entries */.    
f720: 20 20 70 49 74 65 72 2d 3e 6e 43 6f 6c 20 3d 20    pIter->nCol = 
f730: 6e 42 69 6e 64 3b 0a 20 20 20 20 20 20 69 66 28  nBind;.      if(
f740: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
f750: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  K ){.        p->
f760: 72 63 20 3d 20 70 72 65 70 61 72 65 46 72 65 65  rc = prepareFree
f770: 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28  AndCollectError(
f780: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  .            p->
f790: 64 62 4d 61 69 6e 2c 20 26 70 49 74 65 72 2d 3e  dbMain, &pIter->
f7a0: 70 49 6e 73 65 72 74 2c 20 26 70 2d 3e 7a 45 72  pInsert, &p->zEr
f7b0: 72 6d 73 67 2c 0a 20 20 20 20 20 20 20 20 20 20  rmsg,.          
f7c0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
f7d0: 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 5c 22 72  "INSERT INTO \"r
f7e0: 62 75 5f 69 6d 70 5f 25 77 5c 22 20 56 41 4c 55  bu_imp_%w\" VALU
f7f0: 45 53 28 25 73 29 22 2c 20 7a 54 62 6c 2c 20 7a  ES(%s)", zTbl, z
f800: 42 69 6e 64 29 0a 20 20 20 20 20 20 20 20 29 3b  Bind).        );
f810: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
f820: 2f 2a 20 41 6e 64 20 74 6f 20 64 65 6c 65 74 65  /* And to delete
f830: 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20 2a   index entries *
f840: 2f 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72  /.      if( p->r
f850: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
f860: 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
f870: 70 72 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f  prepareFreeAndCo
f880: 6c 6c 65 63 74 45 72 72 6f 72 28 0a 20 20 20 20  llectError(.    
f890: 20 20 20 20 20 20 20 20 70 2d 3e 64 62 4d 61 69          p->dbMai
f8a0: 6e 2c 20 26 70 49 74 65 72 2d 3e 70 44 65 6c 65  n, &pIter->pDele
f8b0: 74 65 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 2c  te, &p->zErrmsg,
f8c0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
f8d0: 65 33 5f 6d 70 72 69 6e 74 66 28 22 44 45 4c 45  e3_mprintf("DELE
f8e0: 54 45 20 46 52 4f 4d 20 5c 22 72 62 75 5f 69 6d  TE FROM \"rbu_im
f8f0: 70 5f 25 77 5c 22 20 57 48 45 52 45 20 25 73 22  p_%w\" WHERE %s"
f900: 2c 20 7a 54 62 6c 2c 20 7a 57 68 65 72 65 29 0a  , zTbl, zWhere).
f910: 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
f920: 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 72 65   }..      /* Cre
f930: 61 74 65 20 74 68 65 20 53 45 4c 45 43 54 20 73  ate the SELECT s
f940: 74 61 74 65 6d 65 6e 74 20 74 6f 20 72 65 61 64  tatement to read
f950: 20 6b 65 79 73 20 69 6e 20 73 6f 72 74 65 64 20   keys in sorted 
f960: 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 20 20 69  order */.      i
f970: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
f980: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 63  _OK ){.        c
f990: 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 20 20 20  har *zSql;.     
f9a0: 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 65 54     if( pIter->eT
f9b0: 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 45 58 54 45  ype==RBU_PK_EXTE
f9c0: 52 4e 41 4c 20 7c 7c 20 70 49 74 65 72 2d 3e 65  RNAL || pIter->e
f9d0: 54 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 4e 4f 4e  Type==RBU_PK_NON
f9e0: 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  E ){.          z
f9f0: 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Sql = sqlite3_mp
fa00: 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20  rintf(.         
fa10: 20 20 20 20 20 22 53 45 4c 45 43 54 20 25 73 2c       "SELECT %s,
fa20: 20 72 62 75 5f 63 6f 6e 74 72 6f 6c 20 46 52 4f   rbu_control FRO
fa30: 4d 20 25 73 2e 27 72 62 75 5f 74 6d 70 5f 25 71  M %s.'rbu_tmp_%q
fa40: 27 20 4f 52 44 45 52 20 42 59 20 25 73 25 73 22  ' ORDER BY %s%s"
fa50: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
fa60: 7a 43 6f 6c 6c 69 73 74 2c 20 70 2d 3e 7a 53 74  zCollist, p->zSt
fa70: 61 74 65 44 62 2c 20 70 49 74 65 72 2d 3e 7a 44  ateDb, pIter->zD
fa80: 61 74 61 54 62 6c 2c 0a 20 20 20 20 20 20 20 20  ataTbl,.        
fa90: 20 20 20 20 20 20 7a 43 6f 6c 6c 69 73 74 2c 20        zCollist, 
faa0: 7a 4c 69 6d 69 74 0a 20 20 20 20 20 20 20 20 20  zLimit.         
fab0: 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   );.        }els
fac0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 53 71  e{.          zSq
fad0: 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  l = sqlite3_mpri
fae0: 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 20  ntf(.           
faf0: 20 20 20 22 53 45 4c 45 43 54 20 25 73 2c 20 72     "SELECT %s, r
fb00: 62 75 5f 63 6f 6e 74 72 6f 6c 20 46 52 4f 4d 20  bu_control FROM 
fb10: 27 25 71 27 20 22 0a 20 20 20 20 20 20 20 20 20  '%q' ".         
fb20: 20 20 20 20 20 22 57 48 45 52 45 20 74 79 70 65       "WHERE type
fb30: 6f 66 28 72 62 75 5f 63 6f 6e 74 72 6f 6c 29 3d  of(rbu_control)=
fb40: 27 69 6e 74 65 67 65 72 27 20 41 4e 44 20 72 62  'integer' AND rb
fb50: 75 5f 63 6f 6e 74 72 6f 6c 21 3d 31 20 22 0a 20  u_control!=1 ". 
fb60: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 55 4e               "UN
fb70: 49 4f 4e 20 41 4c 4c 20 22 0a 20 20 20 20 20 20  ION ALL ".      
fb80: 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
fb90: 25 73 2c 20 72 62 75 5f 63 6f 6e 74 72 6f 6c 20  %s, rbu_control 
fba0: 46 52 4f 4d 20 25 73 2e 27 72 62 75 5f 74 6d 70  FROM %s.'rbu_tmp
fbb0: 5f 25 71 27 20 22 0a 20 20 20 20 20 20 20 20 20  _%q' ".         
fbc0: 20 20 20 20 20 22 4f 52 44 45 52 20 42 59 20 25       "ORDER BY %
fbd0: 73 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s%s",.          
fbe0: 20 20 20 20 7a 43 6f 6c 6c 69 73 74 2c 20 70 49      zCollist, pI
fbf0: 74 65 72 2d 3e 7a 44 61 74 61 54 62 6c 2c 20 0a  ter->zDataTbl, .
fc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 43                zC
fc10: 6f 6c 6c 69 73 74 2c 20 70 2d 3e 7a 53 74 61 74  ollist, p->zStat
fc20: 65 44 62 2c 20 70 49 74 65 72 2d 3e 7a 44 61 74  eDb, pIter->zDat
fc30: 61 54 62 6c 2c 20 0a 20 20 20 20 20 20 20 20 20  aTbl, .         
fc40: 20 20 20 20 20 7a 43 6f 6c 6c 69 73 74 2c 20 7a       zCollist, z
fc50: 4c 69 6d 69 74 0a 20 20 20 20 20 20 20 20 20 20  Limit.          
fc60: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
fc70: 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 72 65       p->rc = pre
fc80: 70 61 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65  pareFreeAndColle
fc90: 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 52 62 75  ctError(p->dbRbu
fca0: 2c 20 26 70 49 74 65 72 2d 3e 70 53 65 6c 65 63  , &pIter->pSelec
fcb0: 74 2c 20 70 7a 2c 20 7a 53 71 6c 29 3b 0a 20 20  t, pz, zSql);.  
fcc0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 73 71 6c      }..      sql
fcd0: 69 74 65 33 5f 66 72 65 65 28 7a 49 6d 70 6f 73  ite3_free(zImpos
fce0: 74 65 72 43 6f 6c 73 29 3b 0a 20 20 20 20 20 20  terCols);.      
fcf0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 49 6d  sqlite3_free(zIm
fd00: 70 6f 73 74 65 72 50 4b 29 3b 0a 20 20 20 20 20  posterPK);.     
fd10: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 57   sqlite3_free(zW
fd20: 68 65 72 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  here);.      sql
fd30: 69 74 65 33 5f 66 72 65 65 28 7a 42 69 6e 64 29  ite3_free(zBind)
fd40: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
fd50: 20 20 20 69 6e 74 20 62 52 62 75 52 6f 77 69 64     int bRbuRowid
fd60: 20 3d 20 28 70 49 74 65 72 2d 3e 65 54 79 70 65   = (pIter->eType
fd70: 3d 3d 52 42 55 5f 50 4b 5f 56 54 41 42 20 7c 7c  ==RBU_PK_VTAB ||
fd80: 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52   pIter->eType==R
fd90: 42 55 5f 50 4b 5f 4e 4f 4e 45 29 3b 0a 20 20 20  BU_PK_NONE);.   
fda0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
fdb0: 54 62 6c 20 3d 20 70 49 74 65 72 2d 3e 7a 54 62  Tbl = pIter->zTb
fdc0: 6c 3b 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c  l;       /* Tabl
fdd0: 65 20 74 68 69 73 20 73 74 65 70 20 61 70 70 6c  e this step appl
fde0: 69 65 73 20 74 6f 20 2a 2f 0a 20 20 20 20 20 20  ies to */.      
fdf0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 57 72 69  const char *zWri
fe00: 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
fe10: 20 20 20 20 20 20 2f 2a 20 49 6d 70 6f 73 74 65        /* Imposte
fe20: 72 20 74 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a  r table name */.
fe30: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 42 69  .      char *zBi
fe40: 6e 64 69 6e 67 73 20 3d 20 72 62 75 4f 62 6a 49  ndings = rbuObjI
fe50: 74 65 72 47 65 74 42 69 6e 64 6c 69 73 74 28 70  terGetBindlist(p
fe60: 2c 20 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c  , pIter->nTblCol
fe70: 20 2b 20 62 52 62 75 52 6f 77 69 64 29 3b 0a 20   + bRbuRowid);. 
fe80: 20 20 20 20 20 63 68 61 72 20 2a 7a 57 68 65 72       char *zWher
fe90: 65 20 3d 20 72 62 75 4f 62 6a 49 74 65 72 47 65  e = rbuObjIterGe
fea0: 74 57 68 65 72 65 28 70 2c 20 70 49 74 65 72 29  tWhere(p, pIter)
feb0: 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4f  ;.      char *zO
fec0: 6c 64 6c 69 73 74 20 3d 20 72 62 75 4f 62 6a 49  ldlist = rbuObjI
fed0: 74 65 72 47 65 74 4f 6c 64 6c 69 73 74 28 70 2c  terGetOldlist(p,
fee0: 20 70 49 74 65 72 2c 20 22 6f 6c 64 22 29 3b 0a   pIter, "old");.
fef0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 65 77        char *zNew
ff00: 6c 69 73 74 20 3d 20 72 62 75 4f 62 6a 49 74 65  list = rbuObjIte
ff10: 72 47 65 74 4f 6c 64 6c 69 73 74 28 70 2c 20 70  rGetOldlist(p, p
ff20: 49 74 65 72 2c 20 22 6e 65 77 22 29 3b 0a 0a 20  Iter, "new");.. 
ff30: 20 20 20 20 20 7a 43 6f 6c 6c 69 73 74 20 3d 20       zCollist = 
ff40: 72 62 75 4f 62 6a 49 74 65 72 47 65 74 43 6f 6c  rbuObjIterGetCol
ff50: 6c 69 73 74 28 70 2c 20 70 49 74 65 72 29 3b 0a  list(p, pIter);.
ff60: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 6e 43 6f        pIter->nCo
ff70: 6c 20 3d 20 70 49 74 65 72 2d 3e 6e 54 62 6c 43  l = pIter->nTblC
ff80: 6f 6c 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 72  ol;..      /* Cr
ff90: 65 61 74 65 20 74 68 65 20 69 6d 70 6f 73 74 65  eate the imposte
ffa0: 72 20 74 61 62 6c 65 20 6f 72 20 74 61 62 6c 65  r table or table
ffb0: 73 20 28 69 66 20 72 65 71 75 69 72 65 64 29 2e  s (if required).
ffc0: 20 2a 2f 0a 20 20 20 20 20 20 72 62 75 43 72 65   */.      rbuCre
ffd0: 61 74 65 49 6d 70 6f 73 74 65 72 54 61 62 6c 65  ateImposterTable
ffe0: 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  (p, pIter);.    
fff0: 20 20 72 62 75 43 72 65 61 74 65 49 6d 70 6f 73    rbuCreateImpos
10000 74 65 72 54 61 62 6c 65 32 28 70 2c 20 70 49 74  terTable2(p, pIt
10010 65 72 29 3b 0a 20 20 20 20 20 20 7a 57 72 69 74  er);.      zWrit
10020 65 20 3d 20 28 70 49 74 65 72 2d 3e 65 54 79 70  e = (pIter->eTyp
10030 65 3d 3d 52 42 55 5f 50 4b 5f 56 54 41 42 20 3f  e==RBU_PK_VTAB ?
10040 20 22 22 20 3a 20 22 72 62 75 5f 69 6d 70 5f 22   "" : "rbu_imp_"
10050 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 72 65  );..      /* Cre
10060 61 74 65 20 74 68 65 20 49 4e 53 45 52 54 20 73  ate the INSERT s
10070 74 61 74 65 6d 65 6e 74 20 74 6f 20 77 72 69 74  tatement to writ
10080 65 20 74 6f 20 74 68 65 20 74 61 72 67 65 74 20  e to the target 
10090 50 4b 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 20  PK b-tree */.   
100a0 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
100b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
100c0 20 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61     p->rc = prepa
100d0 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74  reFreeAndCollect
100e0 45 72 72 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c  Error(p->dbMain,
100f0 20 26 70 49 74 65 72 2d 3e 70 49 6e 73 65 72 74   &pIter->pInsert
10100 2c 20 70 7a 2c 0a 20 20 20 20 20 20 20 20 20 20  , pz,.          
10110 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74    sqlite3_mprint
10120 66 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  f(.             
10130 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 5c 22   "INSERT INTO \"
10140 25 73 25 77 5c 22 28 25 73 25 73 29 20 56 41 4c  %s%w\"(%s%s) VAL
10150 55 45 53 28 25 73 29 22 2c 20 0a 20 20 20 20 20  UES(%s)", .     
10160 20 20 20 20 20 20 20 20 20 7a 57 72 69 74 65 2c           zWrite,
10170 20 7a 54 62 6c 2c 20 7a 43 6f 6c 6c 69 73 74 2c   zTbl, zCollist,
10180 20 28 62 52 62 75 52 6f 77 69 64 20 3f 20 22 2c   (bRbuRowid ? ",
10190 20 5f 72 6f 77 69 64 5f 22 20 3a 20 22 22 29 2c   _rowid_" : ""),
101a0 20 7a 42 69 6e 64 69 6e 67 73 0a 20 20 20 20 20   zBindings.     
101b0 20 20 20 20 20 20 20 29 0a 20 20 20 20 20 20 20         ).       
101c0 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20   );.      }..   
101d0 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65     /* Create the
101e0 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e   DELETE statemen
101f0 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68  t to write to th
10200 65 20 74 61 72 67 65 74 20 50 4b 20 62 2d 74 72  e target PK b-tr
10210 65 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ee */.      if( 
10220 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
10230 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72   ){.        p->r
10240 63 20 3d 20 70 72 65 70 61 72 65 46 72 65 65 41  c = prepareFreeA
10250 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28 70  ndCollectError(p
10260 2d 3e 64 62 4d 61 69 6e 2c 20 26 70 49 74 65 72  ->dbMain, &pIter
10270 2d 3e 70 44 65 6c 65 74 65 2c 20 70 7a 2c 0a 20  ->pDelete, pz,. 
10280 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
10290 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20  e3_mprintf(.    
102a0 20 20 20 20 20 20 20 20 20 20 22 44 45 4c 45 54            "DELET
102b0 45 20 46 52 4f 4d 20 5c 22 25 73 25 77 5c 22 20  E FROM \"%s%w\" 
102c0 57 48 45 52 45 20 25 73 22 2c 20 7a 57 72 69 74  WHERE %s", zWrit
102d0 65 2c 20 7a 54 62 6c 2c 20 7a 57 68 65 72 65 0a  e, zTbl, zWhere.
102e0 20 20 20 20 20 20 20 20 20 20 20 20 29 0a 20 20              ).  
102f0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d        );.      }
10300 0a 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  ..      if( pIte
10310 72 2d 3e 61 62 49 6e 64 65 78 65 64 20 29 7b 0a  r->abIndexed ){.
10320 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
10330 61 72 20 2a 7a 52 62 75 52 6f 77 69 64 20 3d 20  ar *zRbuRowid = 
10340 22 22 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  "";.        if( 
10350 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42  pIter->eType==RB
10360 55 5f 50 4b 5f 45 58 54 45 52 4e 41 4c 20 7c 7c  U_PK_EXTERNAL ||
10370 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52   pIter->eType==R
10380 42 55 5f 50 4b 5f 4e 4f 4e 45 20 29 7b 0a 20 20  BU_PK_NONE ){.  
10390 20 20 20 20 20 20 20 20 7a 52 62 75 52 6f 77 69          zRbuRowi
103a0 64 20 3d 20 22 2c 20 72 62 75 5f 72 6f 77 69 64  d = ", rbu_rowid
103b0 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  ";.        }..  
103c0 20 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20        /* Create 
103d0 74 68 65 20 72 62 75 5f 74 6d 70 5f 78 78 78 20  the rbu_tmp_xxx 
103e0 74 61 62 6c 65 20 61 6e 64 20 74 68 65 20 74 72  table and the tr
103f0 69 67 67 65 72 73 20 74 6f 20 70 6f 70 75 6c 61  iggers to popula
10400 74 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20 20 20  te it. */.      
10410 20 20 72 62 75 4d 50 72 69 6e 74 66 45 78 65 63    rbuMPrintfExec
10420 28 70 2c 20 70 2d 3e 64 62 52 62 75 2c 0a 20 20  (p, p->dbRbu,.  
10430 20 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54            "CREAT
10440 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45  E TABLE IF NOT E
10450 58 49 53 54 53 20 25 73 2e 27 72 62 75 5f 74 6d  XISTS %s.'rbu_tm
10460 70 5f 25 71 27 20 41 53 20 22 0a 20 20 20 20 20  p_%q' AS ".     
10470 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 2a         "SELECT *
10480 25 73 20 46 52 4f 4d 20 27 25 71 27 20 57 48 45  %s FROM '%q' WHE
10490 52 45 20 30 3b 22 0a 20 20 20 20 20 20 20 20 20  RE 0;".         
104a0 20 20 20 2c 20 70 2d 3e 7a 53 74 61 74 65 44 62     , p->zStateDb
104b0 2c 20 70 49 74 65 72 2d 3e 7a 44 61 74 61 54 62  , pIter->zDataTb
104c0 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20 2c 20  l.            , 
104d0 28 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52  (pIter->eType==R
104e0 42 55 5f 50 4b 5f 45 58 54 45 52 4e 41 4c 20 3f  BU_PK_EXTERNAL ?
104f0 20 22 2c 20 30 20 41 53 20 72 62 75 5f 72 6f 77   ", 0 AS rbu_row
10500 69 64 22 20 3a 20 22 22 29 0a 20 20 20 20 20 20  id" : "").      
10510 20 20 20 20 20 20 2c 20 70 49 74 65 72 2d 3e 7a        , pIter->z
10520 44 61 74 61 54 62 6c 0a 20 20 20 20 20 20 20 20  DataTbl.        
10530 29 3b 0a 0a 20 20 20 20 20 20 20 20 72 62 75 4d  );..        rbuM
10540 50 72 69 6e 74 66 45 78 65 63 28 70 2c 20 70 2d  PrintfExec(p, p-
10550 3e 64 62 4d 61 69 6e 2c 0a 20 20 20 20 20 20 20  >dbMain,.       
10560 20 20 20 20 20 22 43 52 45 41 54 45 20 54 45 4d       "CREATE TEM
10570 50 20 54 52 49 47 47 45 52 20 72 62 75 5f 64 65  P TRIGGER rbu_de
10580 6c 65 74 65 5f 74 72 20 42 45 46 4f 52 45 20 44  lete_tr BEFORE D
10590 45 4c 45 54 45 20 4f 4e 20 5c 22 25 73 25 77 5c  ELETE ON \"%s%w\
105a0 22 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  " ".            
105b0 22 42 45 47 49 4e 20 22 0a 20 20 20 20 20 20 20  "BEGIN ".       
105c0 20 20 20 20 20 22 20 20 53 45 4c 45 43 54 20 72       "  SELECT r
105d0 62 75 5f 74 6d 70 5f 69 6e 73 65 72 74 28 32 2c  bu_tmp_insert(2,
105e0 20 25 73 29 3b 22 0a 20 20 20 20 20 20 20 20 20   %s);".         
105f0 20 20 20 22 45 4e 44 3b 22 0a 0a 20 20 20 20 20     "END;"..     
10600 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20 54         "CREATE T
10610 45 4d 50 20 54 52 49 47 47 45 52 20 72 62 75 5f  EMP TRIGGER rbu_
10620 75 70 64 61 74 65 31 5f 74 72 20 42 45 46 4f 52  update1_tr BEFOR
10630 45 20 55 50 44 41 54 45 20 4f 4e 20 5c 22 25 73  E UPDATE ON \"%s
10640 25 77 5c 22 20 22 0a 20 20 20 20 20 20 20 20 20  %w\" ".         
10650 20 20 20 22 42 45 47 49 4e 20 22 0a 20 20 20 20     "BEGIN ".    
10660 20 20 20 20 20 20 20 20 22 20 20 53 45 4c 45 43          "  SELEC
10670 54 20 72 62 75 5f 74 6d 70 5f 69 6e 73 65 72 74  T rbu_tmp_insert
10680 28 32 2c 20 25 73 29 3b 22 0a 20 20 20 20 20 20  (2, %s);".      
10690 20 20 20 20 20 20 22 45 4e 44 3b 22 0a 0a 20 20        "END;"..  
106a0 20 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54            "CREAT
106b0 45 20 54 45 4d 50 20 54 52 49 47 47 45 52 20 72  E TEMP TRIGGER r
106c0 62 75 5f 75 70 64 61 74 65 32 5f 74 72 20 41 46  bu_update2_tr AF
106d0 54 45 52 20 55 50 44 41 54 45 20 4f 4e 20 5c 22  TER UPDATE ON \"
106e0 25 73 25 77 5c 22 20 22 0a 20 20 20 20 20 20 20  %s%w\" ".       
106f0 20 20 20 20 20 22 42 45 47 49 4e 20 22 0a 20 20       "BEGIN ".  
10700 20 20 20 20 20 20 20 20 20 20 22 20 20 53 45 4c            "  SEL
10710 45 43 54 20 72 62 75 5f 74 6d 70 5f 69 6e 73 65  ECT rbu_tmp_inse
10720 72 74 28 33 2c 20 25 73 29 3b 22 0a 20 20 20 20  rt(3, %s);".    
10730 20 20 20 20 20 20 20 20 22 45 4e 44 3b 22 2c 0a          "END;",.
10740 20 20 20 20 20 20 20 20 20 20 20 20 7a 57 72 69              zWri
10750 74 65 2c 20 7a 54 62 6c 2c 20 7a 4f 6c 64 6c 69  te, zTbl, zOldli
10760 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  st,.            
10770 7a 57 72 69 74 65 2c 20 7a 54 62 6c 2c 20 7a 4f  zWrite, zTbl, zO
10780 6c 64 6c 69 73 74 2c 0a 20 20 20 20 20 20 20 20  ldlist,.        
10790 20 20 20 20 7a 57 72 69 74 65 2c 20 7a 54 62 6c      zWrite, zTbl
107a0 2c 20 7a 4e 65 77 6c 69 73 74 0a 20 20 20 20 20  , zNewlist.     
107b0 20 20 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 69     );..        i
107c0 66 28 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d  f( pIter->eType=
107d0 3d 52 42 55 5f 50 4b 5f 45 58 54 45 52 4e 41 4c  =RBU_PK_EXTERNAL
107e0 20 7c 7c 20 70 49 74 65 72 2d 3e 65 54 79 70 65   || pIter->eType
107f0 3d 3d 52 42 55 5f 50 4b 5f 4e 4f 4e 45 20 29 7b  ==RBU_PK_NONE ){
10800 0a 20 20 20 20 20 20 20 20 20 20 72 62 75 4d 50  .          rbuMP
10810 72 69 6e 74 66 45 78 65 63 28 70 2c 20 70 2d 3e  rintfExec(p, p->
10820 64 62 4d 61 69 6e 2c 0a 20 20 20 20 20 20 20 20  dbMain,.        
10830 20 20 20 20 20 20 22 43 52 45 41 54 45 20 54 45        "CREATE TE
10840 4d 50 20 54 52 49 47 47 45 52 20 72 62 75 5f 69  MP TRIGGER rbu_i
10850 6e 73 65 72 74 5f 74 72 20 41 46 54 45 52 20 49  nsert_tr AFTER I
10860 4e 53 45 52 54 20 4f 4e 20 5c 22 25 73 25 77 5c  NSERT ON \"%s%w\
10870 22 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  " ".            
10880 20 20 22 42 45 47 49 4e 20 22 0a 20 20 20 20 20    "BEGIN ".     
10890 20 20 20 20 20 20 20 20 20 22 20 20 53 45 4c 45           "  SELE
108a0 43 54 20 72 62 75 5f 74 6d 70 5f 69 6e 73 65 72  CT rbu_tmp_inser
108b0 74 28 30 2c 20 25 73 29 3b 22 0a 20 20 20 20 20  t(0, %s);".     
108c0 20 20 20 20 20 20 20 20 20 22 45 4e 44 3b 22 2c           "END;",
108d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  .              z
108e0 57 72 69 74 65 2c 20 7a 54 62 6c 2c 20 7a 4e 65  Write, zTbl, zNe
108f0 77 6c 69 73 74 0a 20 20 20 20 20 20 20 20 20 20  wlist.          
10900 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  );.        }..  
10910 20 20 20 20 20 20 72 62 75 4f 62 6a 49 74 65 72        rbuObjIter
10920 50 72 65 70 61 72 65 54 6d 70 49 6e 73 65 72 74  PrepareTmpInsert
10930 28 70 2c 20 70 49 74 65 72 2c 20 7a 43 6f 6c 6c  (p, pIter, zColl
10940 69 73 74 2c 20 7a 52 62 75 52 6f 77 69 64 29 3b  ist, zRbuRowid);
10950 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
10960 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 53 45  /* Create the SE
10970 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74  LECT statement t
10980 6f 20 72 65 61 64 20 6b 65 79 73 20 66 72 6f 6d  o read keys from
10990 20 64 61 74 61 5f 78 78 78 20 2a 2f 0a 20 20 20   data_xxx */.   
109a0 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
109b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
109c0 20 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61     p->rc = prepa
109d0 72 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74  reFreeAndCollect
109e0 45 72 72 6f 72 28 70 2d 3e 64 62 52 62 75 2c 20  Error(p->dbRbu, 
109f0 26 70 49 74 65 72 2d 3e 70 53 65 6c 65 63 74 2c  &pIter->pSelect,
10a00 20 70 7a 2c 0a 20 20 20 20 20 20 20 20 20 20 20   pz,.           
10a10 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
10a20 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  (.              
10a30 22 53 45 4c 45 43 54 20 25 73 2c 20 72 62 75 5f  "SELECT %s, rbu_
10a40 63 6f 6e 74 72 6f 6c 25 73 20 46 52 4f 4d 20 27  control%s FROM '
10a50 25 71 27 25 73 22 2c 20 0a 20 20 20 20 20 20 20  %q'%s", .       
10a60 20 20 20 20 20 20 20 7a 43 6f 6c 6c 69 73 74 2c         zCollist,
10a70 20 28 62 52 62 75 52 6f 77 69 64 20 3f 20 22 2c   (bRbuRowid ? ",
10a80 20 72 62 75 5f 72 6f 77 69 64 22 20 3a 20 22 22   rbu_rowid" : ""
10a90 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ), .            
10aa0 20 20 70 49 74 65 72 2d 3e 7a 44 61 74 61 54 62    pIter->zDataTb
10ab0 6c 2c 20 7a 4c 69 6d 69 74 0a 20 20 20 20 20 20  l, zLimit.      
10ac0 20 20 20 20 20 20 29 0a 20 20 20 20 20 20 20 20        ).        
10ad0 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
10ae0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
10af0 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20 73 71  Where);.      sq
10b00 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 6c 64 6c  lite3_free(zOldl
10b10 69 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ist);.      sqli
10b20 74 65 33 5f 66 72 65 65 28 7a 4e 65 77 6c 69 73  te3_free(zNewlis
10b30 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
10b40 33 5f 66 72 65 65 28 7a 42 69 6e 64 69 6e 67 73  3_free(zBindings
10b50 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
10b60 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6c 6c 69  ite3_free(zColli
10b70 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  st);.    sqlite3
10b80 5f 66 72 65 65 28 7a 4c 69 6d 69 74 29 3b 0a 20  _free(zLimit);. 
10b90 20 7d 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 70   }.  .  return p
10ba0 2d 3e 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  ->rc;.}../*.** S
10bb0 65 74 20 6f 75 74 70 75 74 20 76 61 72 69 61 62  et output variab
10bc0 6c 65 20 2a 70 70 53 74 6d 74 20 74 6f 20 70 6f  le *ppStmt to po
10bd0 69 6e 74 20 74 6f 20 61 6e 20 55 50 44 41 54 45  int to an UPDATE
10be0 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
10bf0 6d 61 79 0a 2a 2a 20 62 65 20 75 73 65 64 20 74  may.** be used t
10c00 6f 20 75 70 64 61 74 65 20 74 68 65 20 69 6d 70  o update the imp
10c10 6f 73 74 65 72 20 74 61 62 6c 65 20 66 6f 72 20  oster table for 
10c20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 20 62  the main table b
10c30 2d 74 72 65 65 20 6f 66 20 74 68 65 0a 2a 2a 20  -tree of the.** 
10c40 74 61 62 6c 65 20 6f 62 6a 65 63 74 20 74 68 61  table object tha
10c50 74 20 70 49 74 65 72 20 63 75 72 72 65 6e 74 6c  t pIter currentl
10c60 79 20 70 6f 69 6e 74 73 20 74 6f 2c 20 61 73 73  y points to, ass
10c70 75 6d 69 6e 67 20 74 68 61 74 20 74 68 65 20 0a  uming that the .
10c80 2a 2a 20 72 62 75 5f 63 6f 6e 74 72 6f 6c 20 63  ** rbu_control c
10c90 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 64 61 74  olumn of the dat
10ca0 61 5f 78 79 7a 20 74 61 62 6c 65 20 63 6f 6e 74  a_xyz table cont
10cb0 61 69 6e 73 20 7a 4d 61 73 6b 2e 0a 2a 2a 20 0a  ains zMask..** .
10cc0 2a 2a 20 49 66 20 74 68 65 20 7a 4d 61 73 6b 20  ** If the zMask 
10cd0 73 74 72 69 6e 67 20 64 6f 65 73 20 6e 6f 74 20  string does not 
10ce0 73 70 65 63 69 66 79 20 61 6e 79 20 63 6f 6c 75  specify any colu
10cf0 6d 6e 73 20 74 6f 20 75 70 64 61 74 65 2c 20 74  mns to update, t
10d00 68 65 6e 20 74 68 69 73 0a 2a 2a 20 69 73 20 6e  hen this.** is n
10d10 6f 74 20 61 6e 20 65 72 72 6f 72 2e 20 4f 75 74  ot an error. Out
10d20 70 75 74 20 76 61 72 69 61 62 6c 65 20 2a 70 70  put variable *pp
10d30 53 74 6d 74 20 69 73 20 73 65 74 20 74 6f 20 4e  Stmt is set to N
10d40 55 4c 4c 20 69 6e 20 74 68 69 73 20 63 61 73 65  ULL in this case
10d50 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
10d60 72 62 75 47 65 74 55 70 64 61 74 65 53 74 6d 74  rbuGetUpdateStmt
10d70 28 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20 2a  (.  sqlite3rbu *
10d80 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
10d90 20 20 20 20 2f 2a 20 52 42 55 20 68 61 6e 64 6c      /* RBU handl
10da0 65 20 2a 2f 0a 20 20 52 62 75 4f 62 6a 49 74 65  e */.  RbuObjIte
10db0 72 20 2a 70 49 74 65 72 2c 20 20 20 20 20 20 20  r *pIter,       
10dc0 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74         /* Object
10dd0 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20 63   iterator */.  c
10de0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 6b  onst char *zMask
10df0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
10e00 2a 20 72 62 75 5f 63 6f 6e 74 72 6f 6c 20 76 61  * rbu_control va
10e10 6c 75 65 20 28 27 78 2e 78 2e 27 29 20 2a 2f 0a  lue ('x.x.') */.
10e20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
10e30 2a 70 70 53 74 6d 74 20 20 20 20 20 20 20 20 20  *ppStmt         
10e40 20 20 2f 2a 20 4f 55 54 3a 20 55 50 44 41 54 45    /* OUT: UPDATE
10e50 20 73 74 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c   statement handl
10e60 65 20 2a 2f 0a 29 7b 0a 20 20 52 62 75 55 70 64  e */.){.  RbuUpd
10e70 61 74 65 53 74 6d 74 20 2a 2a 70 70 3b 0a 20 20  ateStmt **pp;.  
10e80 52 62 75 55 70 64 61 74 65 53 74 6d 74 20 2a 70  RbuUpdateStmt *p
10e90 55 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 55  Up = 0;.  int nU
10ea0 70 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 6e 20  p = 0;..  /* In 
10eb0 63 61 73 65 20 61 6e 20 65 72 72 6f 72 20 6f 63  case an error oc
10ec0 63 75 72 73 20 2a 2f 0a 20 20 2a 70 70 53 74 6d  curs */.  *ppStm
10ed0 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 53 65 61  t = 0;..  /* Sea
10ee0 72 63 68 20 66 6f 72 20 61 6e 20 65 78 69 73 74  rch for an exist
10ef0 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 2e 20 49  ing statement. I
10f00 66 20 6f 6e 65 20 69 73 20 66 6f 75 6e 64 2c 20  f one is found, 
10f10 73 68 69 66 74 20 69 74 20 74 6f 20 74 68 65 20  shift it to the 
10f20 66 72 6f 6e 74 0a 20 20 2a 2a 20 6f 66 20 74 68  front.  ** of th
10f30 65 20 4c 52 55 20 71 75 65 75 65 20 61 6e 64 20  e LRU queue and 
10f40 72 65 74 75 72 6e 20 69 6d 6d 65 64 69 61 74 65  return immediate
10f50 6c 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 6c  ly. Otherwise, l
10f60 65 61 76 65 20 6e 55 70 20 70 6f 69 6e 74 69 6e  eave nUp pointin
10f70 67 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 6e 75  g.  ** to the nu
10f80 6d 62 65 72 20 6f 66 20 73 74 61 74 65 6d 65 6e  mber of statemen
10f90 74 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  ts currently in 
10fa0 74 68 65 20 63 61 63 68 65 20 61 6e 64 20 70 55  the cache and pU
10fb0 70 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6c 61  p to the.  ** la
10fc0 73 74 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65  st object in the
10fd0 20 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 66 6f 72   list.  */.  for
10fe0 28 70 70 3d 26 70 49 74 65 72 2d 3e 70 52 62 75  (pp=&pIter->pRbu
10ff0 55 70 64 61 74 65 3b 20 2a 70 70 3b 20 70 70 3d  Update; *pp; pp=
11000 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 29  &((*pp)->pNext))
11010 7b 0a 20 20 20 20 70 55 70 20 3d 20 2a 70 70 3b  {.    pUp = *pp;
11020 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
11030 70 55 70 2d 3e 7a 4d 61 73 6b 2c 20 7a 4d 61 73  pUp->zMask, zMas
11040 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a  k)==0 ){.      *
11050 70 70 20 3d 20 70 55 70 2d 3e 70 4e 65 78 74 3b  pp = pUp->pNext;
11060 0a 20 20 20 20 20 20 70 55 70 2d 3e 70 4e 65 78  .      pUp->pNex
11070 74 20 3d 20 70 49 74 65 72 2d 3e 70 52 62 75 55  t = pIter->pRbuU
11080 70 64 61 74 65 3b 0a 20 20 20 20 20 20 70 49 74  pdate;.      pIt
11090 65 72 2d 3e 70 52 62 75 55 70 64 61 74 65 20 3d  er->pRbuUpdate =
110a0 20 70 55 70 3b 0a 20 20 20 20 20 20 2a 70 70 53   pUp;.      *ppS
110b0 74 6d 74 20 3d 20 70 55 70 2d 3e 70 55 70 64 61  tmt = pUp->pUpda
110c0 74 65 3b 20 0a 20 20 20 20 20 20 72 65 74 75 72  te; .      retur
110d0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
110e0 20 7d 0a 20 20 20 20 6e 55 70 2b 2b 3b 0a 20 20   }.    nUp++;.  
110f0 7d 0a 20 20 61 73 73 65 72 74 28 20 70 55 70 3d  }.  assert( pUp=
11100 3d 30 20 7c 7c 20 70 55 70 2d 3e 70 4e 65 78 74  =0 || pUp->pNext
11110 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 6e 55  ==0 );..  if( nU
11120 70 3e 3d 53 51 4c 49 54 45 5f 52 42 55 5f 55 50  p>=SQLITE_RBU_UP
11130 44 41 54 45 5f 43 41 43 48 45 53 49 5a 45 20 29  DATE_CACHESIZE )
11140 7b 0a 20 20 20 20 66 6f 72 28 70 70 3d 26 70 49  {.    for(pp=&pI
11150 74 65 72 2d 3e 70 52 62 75 55 70 64 61 74 65 3b  ter->pRbuUpdate;
11160 20 2a 70 70 21 3d 70 55 70 3b 20 70 70 3d 26 28   *pp!=pUp; pp=&(
11170 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 29 3b 0a  (*pp)->pNext));.
11180 20 20 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20 20      *pp = 0;.   
11190 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
111a0 65 28 70 55 70 2d 3e 70 55 70 64 61 74 65 29 3b  e(pUp->pUpdate);
111b0 0a 20 20 20 20 70 55 70 2d 3e 70 55 70 64 61 74  .    pUp->pUpdat
111c0 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = 0;.  }else{.
111d0 20 20 20 20 70 55 70 20 3d 20 28 52 62 75 55 70      pUp = (RbuUp
111e0 64 61 74 65 53 74 6d 74 2a 29 72 62 75 4d 61 6c  dateStmt*)rbuMal
111f0 6c 6f 63 28 70 2c 20 73 69 7a 65 6f 66 28 52 62  loc(p, sizeof(Rb
11200 75 55 70 64 61 74 65 53 74 6d 74 29 2b 70 49 74  uUpdateStmt)+pIt
11210 65 72 2d 3e 6e 54 62 6c 43 6f 6c 2b 31 29 3b 0a  er->nTblCol+1);.
11220 20 20 7d 0a 0a 20 20 69 66 28 20 70 55 70 20 29    }..  if( pUp )
11230 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 57 68 65  {.    char *zWhe
11240 72 65 20 3d 20 72 62 75 4f 62 6a 49 74 65 72 47  re = rbuObjIterG
11250 65 74 57 68 65 72 65 28 70 2c 20 70 49 74 65 72  etWhere(p, pIter
11260 29 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 65  );.    char *zSe
11270 74 20 3d 20 72 62 75 4f 62 6a 49 74 65 72 47 65  t = rbuObjIterGe
11280 74 53 65 74 6c 69 73 74 28 70 2c 20 70 49 74 65  tSetlist(p, pIte
11290 72 2c 20 7a 4d 61 73 6b 29 3b 0a 20 20 20 20 63  r, zMask);.    c
112a0 68 61 72 20 2a 7a 55 70 64 61 74 65 20 3d 20 30  har *zUpdate = 0
112b0 3b 0a 0a 20 20 20 20 70 55 70 2d 3e 7a 4d 61 73  ;..    pUp->zMas
112c0 6b 20 3d 20 28 63 68 61 72 2a 29 26 70 55 70 5b  k = (char*)&pUp[
112d0 31 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  1];.    memcpy(p
112e0 55 70 2d 3e 7a 4d 61 73 6b 2c 20 7a 4d 61 73 6b  Up->zMask, zMask
112f0 2c 20 70 49 74 65 72 2d 3e 6e 54 62 6c 43 6f 6c  , pIter->nTblCol
11300 29 3b 0a 20 20 20 20 70 55 70 2d 3e 70 4e 65 78  );.    pUp->pNex
11310 74 20 3d 20 70 49 74 65 72 2d 3e 70 52 62 75 55  t = pIter->pRbuU
11320 70 64 61 74 65 3b 0a 20 20 20 20 70 49 74 65 72  pdate;.    pIter
11330 2d 3e 70 52 62 75 55 70 64 61 74 65 20 3d 20 70  ->pRbuUpdate = p
11340 55 70 3b 0a 0a 20 20 20 20 69 66 28 20 7a 53 65  Up;..    if( zSe
11350 74 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  t ){.      const
11360 20 63 68 61 72 20 2a 7a 50 72 65 66 69 78 20 3d   char *zPrefix =
11370 20 22 22 3b 0a 0a 20 20 20 20 20 20 69 66 28 20   "";..      if( 
11380 70 49 74 65 72 2d 3e 65 54 79 70 65 21 3d 52 42  pIter->eType!=RB
11390 55 5f 50 4b 5f 56 54 41 42 20 29 20 7a 50 72 65  U_PK_VTAB ) zPre
113a0 66 69 78 20 3d 20 22 72 62 75 5f 69 6d 70 5f 22  fix = "rbu_imp_"
113b0 3b 0a 20 20 20 20 20 20 7a 55 70 64 61 74 65 20  ;.      zUpdate 
113c0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
113d0 66 28 22 55 50 44 41 54 45 20 5c 22 25 73 25 77  f("UPDATE \"%s%w
113e0 5c 22 20 53 45 54 20 25 73 20 57 48 45 52 45 20  \" SET %s WHERE 
113f0 25 73 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  %s", .          
11400 7a 50 72 65 66 69 78 2c 20 70 49 74 65 72 2d 3e  zPrefix, pIter->
11410 7a 54 62 6c 2c 20 7a 53 65 74 2c 20 7a 57 68 65  zTbl, zSet, zWhe
11420 72 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  re.      );.    
11430 20 20 70 2d 3e 72 63 20 3d 20 70 72 65 70 61 72    p->rc = prepar
11440 65 46 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45  eFreeAndCollectE
11450 72 72 6f 72 28 0a 20 20 20 20 20 20 20 20 20 20  rror(.          
11460 70 2d 3e 64 62 4d 61 69 6e 2c 20 26 70 55 70 2d  p->dbMain, &pUp-
11470 3e 70 55 70 64 61 74 65 2c 20 26 70 2d 3e 7a 45  >pUpdate, &p->zE
11480 72 72 6d 73 67 2c 20 7a 55 70 64 61 74 65 0a 20  rrmsg, zUpdate. 
11490 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 2a 70       );.      *p
114a0 70 53 74 6d 74 20 3d 20 70 55 70 2d 3e 70 55 70  pStmt = pUp->pUp
114b0 64 61 74 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  date;.    }.    
114c0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 57 68  sqlite3_free(zWh
114d0 65 72 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ere);.    sqlite
114e0 33 5f 66 72 65 65 28 7a 53 65 74 29 3b 0a 20 20  3_free(zSet);.  
114f0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72  }..  return p->r
11500 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 73 71 6c  c;.}..static sql
11510 69 74 65 33 20 2a 72 62 75 4f 70 65 6e 44 62 68  ite3 *rbuOpenDbh
11520 61 6e 64 6c 65 28 73 71 6c 69 74 65 33 72 62 75  andle(sqlite3rbu
11530 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
11540 2a 7a 4e 61 6d 65 29 7b 0a 20 20 73 71 6c 69 74  *zName){.  sqlit
11550 65 33 20 2a 64 62 20 3d 20 30 3b 0a 20 20 69 66  e3 *db = 0;.  if
11560 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
11570 4f 4b 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  OK ){.    const 
11580 69 6e 74 20 66 6c 61 67 73 20 3d 20 53 51 4c 49  int flags = SQLI
11590 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
115a0 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  E|SQLITE_OPEN_CR
115b0 45 41 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  EATE|SQLITE_OPEN
115c0 5f 55 52 49 3b 0a 20 20 20 20 70 2d 3e 72 63 20  _URI;.    p->rc 
115d0 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76  = sqlite3_open_v
115e0 32 28 7a 4e 61 6d 65 2c 20 26 64 62 2c 20 66 6c  2(zName, &db, fl
115f0 61 67 73 2c 20 70 2d 3e 7a 56 66 73 4e 61 6d 65  ags, p->zVfsName
11600 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  );.    if( p->rc
11610 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 7a 45 72   ){.      p->zEr
11620 72 6d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  rmsg = sqlite3_m
11630 70 72 69 6e 74 66 28 22 25 73 22 2c 20 73 71 6c  printf("%s", sql
11640 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29  ite3_errmsg(db))
11650 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
11660 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20 20 20 20  close(db);.     
11670 20 64 62 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20   db = 0;.    }. 
11680 20 7d 0a 20 20 72 65 74 75 72 6e 20 64 62 3b 0a   }.  return db;.
11690 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68  }../*.** Open th
116a0 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
116b0 65 20 61 6e 64 20 61 74 74 61 63 68 20 74 68 65  e and attach the
116c0 20 52 42 55 20 64 61 74 61 62 61 73 65 20 61 73   RBU database as
116d0 20 22 72 62 75 22 2e 20 49 66 20 61 6e 0a 2a 2a   "rbu". If an.**
116e0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c   error occurs, l
116f0 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 63 6f  eave an error co
11700 64 65 20 61 6e 64 20 6d 65 73 73 61 67 65 20 69  de and message i
11710 6e 20 74 68 65 20 52 42 55 20 68 61 6e 64 6c 65  n the RBU handle
11720 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
11730 20 72 62 75 4f 70 65 6e 44 61 74 61 62 61 73 65   rbuOpenDatabase
11740 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 29 7b  (sqlite3rbu *p){
11750 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63  .  assert( p->rc
11760 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
11770 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 4d 61   assert( p->dbMa
11780 69 6e 3d 3d 30 20 26 26 20 70 2d 3e 64 62 52 62  in==0 && p->dbRb
11790 75 3d 3d 30 20 29 3b 0a 0a 20 20 70 2d 3e 65 53  u==0 );..  p->eS
117a0 74 61 67 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 64  tage = 0;.  p->d
117b0 62 4d 61 69 6e 20 3d 20 72 62 75 4f 70 65 6e 44  bMain = rbuOpenD
117c0 62 68 61 6e 64 6c 65 28 70 2c 20 70 2d 3e 7a 54  bhandle(p, p->zT
117d0 61 72 67 65 74 29 3b 0a 20 20 70 2d 3e 64 62 52  arget);.  p->dbR
117e0 62 75 20 3d 20 72 62 75 4f 70 65 6e 44 62 68 61  bu = rbuOpenDbha
117f0 6e 64 6c 65 28 70 2c 20 70 2d 3e 7a 52 62 75 29  ndle(p, p->zRbu)
11800 3b 0a 0a 20 20 2f 2a 20 49 66 20 75 73 69 6e 67  ;..  /* If using
11810 20 73 65 70 61 72 61 74 65 20 52 42 55 20 61 6e   separate RBU an
11820 64 20 73 74 61 74 65 20 64 61 74 61 62 61 73 65  d state database
11830 73 2c 20 61 74 74 61 63 68 20 74 68 65 20 73 74  s, attach the st
11840 61 74 65 20 64 61 74 61 62 61 73 65 20 74 6f 0a  ate database to.
11850 20 20 2a 2a 20 74 68 65 20 52 42 55 20 64 62 20    ** the RBU db 
11860 68 61 6e 64 6c 65 20 6e 6f 77 2e 20 20 2a 2f 0a  handle now.  */.
11870 20 20 69 66 28 20 70 2d 3e 7a 53 74 61 74 65 20    if( p->zState 
11880 29 7b 0a 20 20 20 20 72 62 75 4d 50 72 69 6e 74  ){.    rbuMPrint
11890 66 45 78 65 63 28 70 2c 20 70 2d 3e 64 62 52 62  fExec(p, p->dbRb
118a0 75 2c 20 22 41 54 54 41 43 48 20 25 51 20 41 53  u, "ATTACH %Q AS
118b0 20 73 74 61 74 22 2c 20 70 2d 3e 7a 53 74 61 74   stat", p->zStat
118c0 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  e);.    memcpy(p
118d0 2d 3e 7a 53 74 61 74 65 44 62 2c 20 22 73 74 61  ->zStateDb, "sta
118e0 74 22 2c 20 34 29 3b 0a 20 20 7d 65 6c 73 65 7b  t", 4);.  }else{
118f0 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e 7a  .    memcpy(p->z
11900 53 74 61 74 65 44 62 2c 20 22 6d 61 69 6e 22 2c  StateDb, "main",
11910 20 34 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20   4);.  }..  if( 
11920 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
11930 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
11940 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
11950 75 6e 63 74 69 6f 6e 28 70 2d 3e 64 62 4d 61 69  unction(p->dbMai
11960 6e 2c 20 0a 20 20 20 20 20 20 20 20 22 72 62 75  n, .        "rbu
11970 5f 74 6d 70 5f 69 6e 73 65 72 74 22 2c 20 2d 31  _tmp_insert", -1
11980 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 28  , SQLITE_UTF8, (
11990 76 6f 69 64 2a 29 70 2c 20 72 62 75 54 6d 70 49  void*)p, rbuTmpI
119a0 6e 73 65 72 74 46 75 6e 63 2c 20 30 2c 20 30 0a  nsertFunc, 0, 0.
119b0 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 69 66      );.  }..  if
119c0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
119d0 4f 4b 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  OK ){.    p->rc 
119e0 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
119f0 5f 66 75 6e 63 74 69 6f 6e 28 70 2d 3e 64 62 4d  _function(p->dbM
11a00 61 69 6e 2c 20 0a 20 20 20 20 20 20 20 20 22 72  ain, .        "r
11a10 62 75 5f 66 6f 73 73 69 6c 5f 64 65 6c 74 61 22  bu_fossil_delta"
11a20 2c 20 32 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  , 2, SQLITE_UTF8
11a30 2c 20 30 2c 20 72 62 75 46 6f 73 73 69 6c 44 65  , 0, rbuFossilDe
11a40 6c 74 61 46 75 6e 63 2c 20 30 2c 20 30 0a 20 20  ltaFunc, 0, 0.  
11a50 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20    );.  }..  if( 
11a60 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
11a70 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
11a80 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
11a90 75 6e 63 74 69 6f 6e 28 70 2d 3e 64 62 52 62 75  unction(p->dbRbu
11aa0 2c 20 0a 20 20 20 20 20 20 20 20 22 72 62 75 5f  , .        "rbu_
11ab0 74 61 72 67 65 74 5f 6e 61 6d 65 22 2c 20 31 2c  target_name", 1,
11ac0 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 28 76   SQLITE_UTF8, (v
11ad0 6f 69 64 2a 29 70 2c 20 72 62 75 54 61 72 67 65  oid*)p, rbuTarge
11ae0 74 4e 61 6d 65 46 75 6e 63 2c 20 30 2c 20 30 0a  tNameFunc, 0, 0.
11af0 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 69 66      );.  }..  if
11b00 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
11b10 4f 4b 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  OK ){.    p->rc 
11b20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63  = sqlite3_file_c
11b30 6f 6e 74 72 6f 6c 28 70 2d 3e 64 62 4d 61 69 6e  ontrol(p->dbMain
11b40 2c 20 22 6d 61 69 6e 22 2c 20 53 51 4c 49 54 45  , "main", SQLITE
11b50 5f 46 43 4e 54 4c 5f 52 42 55 2c 20 28 76 6f 69  _FCNTL_RBU, (voi
11b60 64 2a 29 70 29 3b 0a 20 20 7d 0a 20 20 72 62 75  d*)p);.  }.  rbu
11b70 4d 50 72 69 6e 74 66 45 78 65 63 28 70 2c 20 70  MPrintfExec(p, p
11b80 2d 3e 64 62 4d 61 69 6e 2c 20 22 53 45 4c 45 43  ->dbMain, "SELEC
11b90 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  T * FROM sqlite_
11ba0 6d 61 73 74 65 72 22 29 3b 0a 0a 20 20 2f 2a 20  master");..  /* 
11bb0 4d 61 72 6b 20 74 68 65 20 64 61 74 61 62 61 73  Mark the databas
11bc0 65 20 66 69 6c 65 20 6a 75 73 74 20 6f 70 65 6e  e file just open
11bd0 65 64 20 61 73 20 61 6e 20 52 42 55 20 74 61 72  ed as an RBU tar
11be0 67 65 74 20 64 61 74 61 62 61 73 65 2e 20 49 66  get database. If
11bf0 20 0a 20 20 2a 2a 20 74 68 69 73 20 63 61 6c 6c   .  ** this call
11c00 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
11c10 4e 4f 54 46 4f 55 4e 44 2c 20 74 68 65 6e 20 74  NOTFOUND, then t
11c20 68 65 20 52 42 55 20 76 66 73 20 69 73 20 6e 6f  he RBU vfs is no
11c30 74 20 69 6e 20 75 73 65 2e 0a 20 20 2a 2a 20 54  t in use..  ** T
11c40 68 69 73 20 69 73 20 61 6e 20 65 72 72 6f 72 2e  his is an error.
11c50 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 72 63    */.  if( p->rc
11c60 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
11c70 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74     p->rc = sqlit
11c80 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28  e3_file_control(
11c90 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 6d 61 69 6e  p->dbMain, "main
11ca0 22 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  ", SQLITE_FCNTL_
11cb0 52 42 55 2c 20 28 76 6f 69 64 2a 29 70 29 3b 0a  RBU, (void*)p);.
11cc0 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63    }..  if( p->rc
11cd0 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  ==SQLITE_NOTFOUN
11ce0 44 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  D ){.    p->rc =
11cf0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
11d00 20 20 20 70 2d 3e 7a 45 72 72 6d 73 67 20 3d 20     p->zErrmsg = 
11d10 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
11d20 22 72 62 75 20 76 66 73 20 6e 6f 74 20 66 6f 75  "rbu vfs not fou
11d30 6e 64 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  nd");.  }.}../*.
11d40 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
11d50 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  is a copy of the
11d60 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66   sqlite3FileSuff
11d70 69 78 33 28 29 20 72 6f 75 74 69 6e 65 20 66 72  ix3() routine fr
11d80 6f 6d 20 74 68 65 20 63 6f 72 65 2e 0a 2a 2a 20  om the core..** 
11d90 49 74 20 69 73 20 61 20 6e 6f 2d 6f 70 20 75 6e  It is a no-op un
11da0 6c 65 73 73 20 53 51 4c 49 54 45 5f 45 4e 41 42  less SQLITE_ENAB
11db0 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53 20 69 73 20  LE_8_3_NAMES is 
11dc0 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  defined..**.** I
11dd0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
11de0 38 5f 33 5f 4e 41 4d 45 53 20 69 73 20 73 65 74  8_3_NAMES is set
11df0 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
11e00 20 61 6e 64 20 69 66 20 74 68 65 20 64 61 74 61   and if the data
11e10 62 61 73 65 0a 2a 2a 20 66 69 6c 65 6e 61 6d 65  base.** filename
11e20 20 69 6e 20 7a 42 61 73 65 46 69 6c 65 6e 61 6d   in zBaseFilenam
11e30 65 20 69 73 20 61 20 55 52 49 20 77 69 74 68 20  e is a URI with 
11e40 74 68 65 20 22 38 5f 33 5f 6e 61 6d 65 73 3d 31  the "8_3_names=1
11e50 22 20 70 61 72 61 6d 65 74 65 72 20 61 6e 64 0a  " parameter and.
11e60 2a 2a 20 69 66 20 66 69 6c 65 6e 61 6d 65 20 69  ** if filename i
11e70 6e 20 7a 5b 5d 20 68 61 73 20 61 20 73 75 66 66  n z[] has a suff
11e80 69 78 20 28 61 2e 6b 2e 61 2e 20 22 65 78 74 65  ix (a.k.a. "exte
11e90 6e 73 69 6f 6e 22 29 20 74 68 61 74 20 69 73 20  nsion") that is 
11ea0 6c 6f 6e 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74  longer than.** t
11eb0 68 72 65 65 20 63 68 61 72 61 63 74 65 72 73 2c  hree characters,
11ec0 20 74 68 65 6e 20 73 68 6f 72 74 65 6e 20 74 68   then shorten th
11ed0 65 20 73 75 66 66 69 78 20 6f 6e 20 7a 5b 5d 20  e suffix on z[] 
11ee0 74 6f 20 62 65 20 74 68 65 20 6c 61 73 74 20 74  to be the last t
11ef0 68 72 65 65 0a 2a 2a 20 63 68 61 72 61 63 74 65  hree.** characte
11f00 72 73 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e  rs of the origin
11f10 61 6c 20 73 75 66 66 69 78 2e 0a 2a 2a 0a 2a 2a  al suffix..**.**
11f20 20 49 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   If SQLITE_ENABL
11f30 45 5f 38 5f 33 5f 4e 41 4d 45 53 20 69 73 20 73  E_8_3_NAMES is s
11f40 65 74 20 74 6f 20 32 20 61 74 20 63 6f 6d 70 69  et to 2 at compi
11f50 6c 65 2d 74 69 6d 65 2c 20 74 68 65 6e 20 61 6c  le-time, then al
11f60 77 61 79 73 0a 2a 2a 20 64 6f 20 74 68 65 20 73  ways.** do the s
11f70 75 66 66 69 78 20 73 68 6f 72 74 65 6e 69 6e 67  uffix shortening
11f80 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 55   regardless of U
11f90 52 49 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a  RI parameter..**
11fa0 0a 2a 2a 20 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a  .** Examples:.**
11fb0 0a 2a 2a 20 20 20 20 20 74 65 73 74 2e 64 62 2d  .**     test.db-
11fc0 6a 6f 75 72 6e 61 6c 20 20 20 20 3d 3e 20 20 20  journal    =>   
11fd0 74 65 73 74 2e 6e 61 6c 0a 2a 2a 20 20 20 20 20  test.nal.**     
11fe0 74 65 73 74 2e 64 62 2d 77 61 6c 20 20 20 20 20  test.db-wal     
11ff0 20 20 20 3d 3e 20 20 20 74 65 73 74 2e 77 61 6c     =>   test.wal
12000 0a 2a 2a 20 20 20 20 20 74 65 73 74 2e 64 62 2d  .**     test.db-
12010 73 68 6d 20 20 20 20 20 20 20 20 3d 3e 20 20 20  shm        =>   
12020 74 65 73 74 2e 73 68 6d 0a 2a 2a 20 20 20 20 20  test.shm.**     
12030 74 65 73 74 2e 64 62 2d 6d 6a 37 66 33 33 31 39  test.db-mj7f3319
12040 66 61 20 3d 3e 20 20 20 74 65 73 74 2e 39 66 61  fa =>   test.9fa
12050 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
12060 72 62 75 46 69 6c 65 53 75 66 66 69 78 33 28 63  rbuFileSuffix3(c
12070 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 61 73 65  onst char *zBase
12080 2c 20 63 68 61 72 20 2a 7a 29 7b 0a 23 69 66 64  , char *z){.#ifd
12090 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
120a0 5f 38 5f 33 5f 4e 41 4d 45 53 0a 23 69 66 20 53  _8_3_NAMES.#if S
120b0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 38 5f 33  QLITE_ENABLE_8_3
120c0 5f 4e 41 4d 45 53 3c 32 0a 20 20 69 66 28 20 73  _NAMES<2.  if( s
120d0 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65  qlite3_uri_boole
120e0 61 6e 28 7a 42 61 73 65 2c 20 22 38 5f 33 5f 6e  an(zBase, "8_3_n
120f0 61 6d 65 73 22 2c 20 30 29 20 29 0a 23 65 6e 64  ames", 0) ).#end
12100 69 66 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 69  if.  {.    int i
12110 2c 20 73 7a 3b 0a 20 20 20 20 73 7a 20 3d 20 73  , sz;.    sz = s
12120 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
12130 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 73 7a 2d  );.    for(i=sz-
12140 31 3b 20 69 3e 30 20 26 26 20 7a 5b 69 5d 21 3d  1; i>0 && z[i]!=
12150 27 2f 27 20 26 26 20 7a 5b 69 5d 21 3d 27 2e 27  '/' && z[i]!='.'
12160 3b 20 69 2d 2d 29 7b 7d 0a 20 20 20 20 69 66 28  ; i--){}.    if(
12170 20 7a 5b 69 5d 3d 3d 27 2e 27 20 26 26 20 41 4c   z[i]=='.' && AL
12180 57 41 59 53 28 73 7a 3e 69 2b 34 29 20 29 20 6d  WAYS(sz>i+4) ) m
12190 65 6d 6d 6f 76 65 28 26 7a 5b 69 2b 31 5d 2c 20  emmove(&z[i+1], 
121a0 26 7a 5b 73 7a 2d 33 5d 2c 20 34 29 3b 0a 20 20  &z[sz-3], 4);.  
121b0 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  }.#endif.}../*.*
121c0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72  * Return the cur
121d0 72 65 6e 74 20 77 61 6c 2d 69 6e 64 65 78 20 68  rent wal-index h
121e0 65 61 64 65 72 20 63 68 65 63 6b 73 75 6d 20 66  eader checksum f
121f0 6f 72 20 74 68 65 20 74 61 72 67 65 74 20 64 61  or the target da
12200 74 61 62 61 73 65 20 0a 2a 2a 20 61 73 20 61 20  tabase .** as a 
12210 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 2e 0a  64-bit integer..
12220 2a 2a 0a 2a 2a 20 54 68 65 20 63 68 65 63 6b 73  **.** The checks
12230 75 6d 20 69 73 20 73 74 6f 72 65 20 69 6e 20 74  um is store in t
12240 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
12250 20 78 53 68 6d 4d 61 70 20 6d 65 6d 6f 72 79 20   xShmMap memory 
12260 61 73 20 61 6e 20 38 2d 62 79 74 65 20 0a 2a 2a  as an 8-byte .**
12270 20 62 6c 6f 62 20 73 74 61 72 74 69 6e 67 20 61   blob starting a
12280 74 20 62 79 74 65 20 6f 66 66 73 65 74 20 34 30  t byte offset 40
12290 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36 34 20  ..*/.static i64 
122a0 72 62 75 53 68 6d 43 68 65 63 6b 73 75 6d 28 73  rbuShmChecksum(s
122b0 71 6c 69 74 65 33 72 62 75 20 2a 70 29 7b 0a 20  qlite3rbu *p){. 
122c0 20 69 36 34 20 69 52 65 74 20 3d 20 30 3b 0a 20   i64 iRet = 0;. 
122d0 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
122e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
122f0 69 74 65 33 5f 66 69 6c 65 20 2a 70 44 62 20 3d  ite3_file *pDb =
12300 20 70 2d 3e 70 54 61 72 67 65 74 46 64 2d 3e 70   p->pTargetFd->p
12310 52 65 61 6c 3b 0a 20 20 20 20 75 33 32 20 76 6f  Real;.    u32 vo
12320 6c 61 74 69 6c 65 20 2a 70 74 72 3b 0a 20 20 20  latile *ptr;.   
12330 20 70 2d 3e 72 63 20 3d 20 70 44 62 2d 3e 70 4d   p->rc = pDb->pM
12340 65 74 68 6f 64 73 2d 3e 78 53 68 6d 4d 61 70 28  ethods->xShmMap(
12350 70 44 62 2c 20 30 2c 20 33 32 2a 31 30 32 34 2c  pDb, 0, 32*1024,
12360 20 30 2c 20 28 76 6f 69 64 20 76 6f 6c 61 74 69   0, (void volati
12370 6c 65 2a 2a 29 26 70 74 72 29 3b 0a 20 20 20 20  le**)&ptr);.    
12380 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
12390 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 52  E_OK ){.      iR
123a0 65 74 20 3d 20 28 28 69 36 34 29 70 74 72 5b 31  et = ((i64)ptr[1
123b0 30 5d 20 3c 3c 20 33 32 29 20 2b 20 70 74 72 5b  0] << 32) + ptr[
123c0 31 31 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  11];.    }.  }. 
123d0 20 72 65 74 75 72 6e 20 69 52 65 74 3b 0a 7d 0a   return iRet;.}.
123e0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
123f0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61  tion is called a
12400 73 20 70 61 72 74 20 6f 66 20 69 6e 69 74 69 61  s part of initia
12410 6c 69 7a 69 6e 67 20 6f 72 20 72 65 69 6e 69 74  lizing or reinit
12420 69 61 6c 69 7a 69 6e 67 20 61 6e 0a 2a 2a 20 69  ializing an.** i
12430 6e 63 72 65 6d 65 6e 74 61 6c 20 63 68 65 63 6b  ncremental check
12440 70 6f 69 6e 74 2e 20 0a 2a 2a 0a 2a 2a 20 49 74  point. .**.** It
12450 20 70 6f 70 75 6c 61 74 65 73 20 74 68 65 20 73   populates the s
12460 71 6c 69 74 65 33 72 62 75 2e 61 46 72 61 6d 65  qlite3rbu.aFrame
12470 5b 5d 20 61 72 72 61 79 20 77 69 74 68 20 74 68  [] array with th
12480 65 20 73 65 74 20 6f 66 20 0a 2a 2a 20 28 77 61  e set of .** (wa
12490 6c 20 66 72 61 6d 65 20 2d 3e 20 64 62 20 70 61  l frame -> db pa
124a0 67 65 29 20 63 6f 70 79 20 6f 70 65 72 61 74 69  ge) copy operati
124b0 6f 6e 73 20 72 65 71 75 69 72 65 64 20 74 6f 20  ons required to 
124c0 63 68 65 63 6b 70 6f 69 6e 74 20 74 68 65 20 0a  checkpoint the .
124d0 2a 2a 20 63 75 72 72 65 6e 74 20 77 61 6c 20 66  ** current wal f
124e0 69 6c 65 2c 20 61 6e 64 20 6f 62 74 61 69 6e 73  ile, and obtains
124f0 20 74 68 65 20 73 65 74 20 6f 66 20 73 68 6d 20   the set of shm 
12500 6c 6f 63 6b 73 20 72 65 71 75 69 72 65 64 20 74  locks required t
12510 6f 20 73 61 66 65 6c 79 20 0a 2a 2a 20 70 65 72  o safely .** per
12520 66 6f 72 6d 20 74 68 65 20 63 6f 70 79 20 6f 70  form the copy op
12530 65 72 61 74 69 6f 6e 73 20 64 69 72 65 63 74 6c  erations directl
12540 79 20 6f 6e 20 74 68 65 20 66 69 6c 65 2d 73 79  y on the file-sy
12550 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  stem..**.** If a
12560 72 67 75 6d 65 6e 74 20 70 53 74 61 74 65 20 69  rgument pState i
12570 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e  s not NULL, then
12580 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c   the incremental
12590 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 73 0a 2a   checkpoint is.*
125a0 2a 20 62 65 69 6e 67 20 72 65 73 75 6d 65 64 2e  * being resumed.
125b0 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 69   In this case, i
125c0 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6f  f the checksum o
125d0 66 20 74 68 65 20 77 61 6c 2d 69 6e 64 65 78 2d  f the wal-index-
125e0 68 65 61 64 65 72 0a 2a 2a 20 66 6f 6c 6c 6f 77  header.** follow
125f0 69 6e 67 20 72 65 63 6f 76 65 72 79 20 69 73 20  ing recovery is 
12600 6e 6f 74 20 74 68 65 20 73 61 6d 65 20 61 73 20  not the same as 
12610 74 68 65 20 63 68 65 63 6b 73 75 6d 20 73 61 76  the checksum sav
12620 65 64 20 69 6e 20 74 68 65 20 52 62 75 53 74 61  ed in the RbuSta
12630 74 65 0a 2a 2a 20 6f 62 6a 65 63 74 2c 20 74 68  te.** object, th
12640 65 6e 20 74 68 65 20 72 62 75 20 68 61 6e 64 6c  en the rbu handl
12650 65 20 69 73 20 73 65 74 20 74 6f 20 44 4f 4e 45  e is set to DONE
12660 20 73 74 61 74 65 2e 20 54 68 69 73 20 6f 63 63   state. This occ
12670 75 72 73 20 69 66 20 73 6f 6d 65 0a 2a 2a 20 6f  urs if some.** o
12680 74 68 65 72 20 63 6c 69 65 6e 74 20 61 70 70 65  ther client appe
12690 6e 64 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f  nds a transactio
126a0 6e 20 74 6f 20 74 68 65 20 77 61 6c 20 66 69 6c  n to the wal fil
126b0 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20  e in the middle 
126c0 6f 66 0a 2a 2a 20 61 6e 20 69 6e 63 72 65 6d 65  of.** an increme
126d0 6e 74 61 6c 20 63 68 65 63 6b 70 6f 69 6e 74 2e  ntal checkpoint.
126e0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
126f0 72 62 75 53 65 74 75 70 43 68 65 63 6b 70 6f 69  rbuSetupCheckpoi
12700 6e 74 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70  nt(sqlite3rbu *p
12710 2c 20 52 62 75 53 74 61 74 65 20 2a 70 53 74 61  , RbuState *pSta
12720 74 65 29 7b 0a 0a 20 20 2f 2a 20 49 66 20 70 53  te){..  /* If pS
12730 74 61 74 65 20 69 73 20 4e 55 4c 4c 2c 20 74 68  tate is NULL, th
12740 65 6e 20 74 68 65 20 77 61 6c 20 66 69 6c 65 20  en the wal file 
12750 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 62 65 65  may not have bee
12760 6e 20 6f 70 65 6e 65 64 20 61 6e 64 0a 20 20 2a  n opened and.  *
12770 2a 20 72 65 63 6f 76 65 72 65 64 2e 20 52 75 6e  * recovered. Run
12780 6e 69 6e 67 20 61 20 72 65 61 64 2d 73 74 61 74  ning a read-stat
12790 65 6d 65 6e 74 20 68 65 72 65 20 74 6f 20 65 6e  ement here to en
127a0 73 75 72 65 20 74 68 61 74 20 64 6f 69 6e 67 20  sure that doing 
127b0 73 6f 0a 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74  so.  ** does not
127c0 20 69 6e 74 65 72 66 65 72 65 20 77 69 74 68 20   interfere with 
127d0 74 68 65 20 22 63 61 70 74 75 72 65 22 20 70 72  the "capture" pr
127e0 6f 63 65 73 73 20 62 65 6c 6f 77 2e 20 20 2a 2f  ocess below.  */
127f0 0a 20 20 69 66 28 20 70 53 74 61 74 65 3d 3d 30  .  if( pState==0
12800 20 29 7b 0a 20 20 20 20 70 2d 3e 65 53 74 61 67   ){.    p->eStag
12810 65 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70  e = 0;.    if( p
12820 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
12830 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  ){.      p->rc =
12840 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d   sqlite3_exec(p-
12850 3e 64 62 4d 61 69 6e 2c 20 22 53 45 4c 45 43 54  >dbMain, "SELECT
12860 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d   * FROM sqlite_m
12870 61 73 74 65 72 22 2c 20 30 2c 20 30 2c 20 30 29  aster", 0, 0, 0)
12880 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
12890 2a 20 41 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72  * Assuming no er
128a0 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64  ror has occurred
128b0 2c 20 72 75 6e 20 61 20 22 72 65 73 74 61 72 74  , run a "restart
128c0 22 20 63 68 65 63 6b 70 6f 69 6e 74 20 77 69 74  " checkpoint wit
128d0 68 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74  h the.  ** sqlit
128e0 65 33 72 62 75 2e 65 53 74 61 67 65 20 76 61 72  e3rbu.eStage var
128f0 69 61 62 6c 65 20 73 65 74 20 74 6f 20 43 41 50  iable set to CAP
12900 54 55 52 45 2e 20 54 68 69 73 20 74 75 72 6e 73  TURE. This turns
12910 20 6f 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   on the followin
12920 67 0a 20 20 2a 2a 20 73 70 65 63 69 61 6c 20 62  g.  ** special b
12930 65 68 61 76 69 6f 75 72 20 69 6e 20 74 68 65 20  ehaviour in the 
12940 72 62 75 20 56 46 53 3a 0a 20 20 2a 2a 0a 20 20  rbu VFS:.  **.  
12950 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 65 78  **   * If the ex
12960 63 6c 75 73 69 76 65 20 73 68 6d 20 57 52 49 54  clusive shm WRIT
12970 45 52 20 6f 72 20 52 45 41 44 30 20 6c 6f 63 6b  ER or READ0 lock
12980 20 63 61 6e 6e 6f 74 20 62 65 20 6f 62 74 61 69   cannot be obtai
12990 6e 65 64 2c 0a 20 20 2a 2a 20 20 20 20 20 74 68  ned,.  **     th
129a0 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 66 61 69  e checkpoint fai
129b0 6c 73 20 77 69 74 68 20 53 51 4c 49 54 45 5f 42  ls with SQLITE_B
129c0 55 53 59 20 28 6e 6f 72 6d 61 6c 6c 79 20 53 51  USY (normally SQ
129d0 4c 69 74 65 20 77 6f 75 6c 64 0a 20 20 2a 2a 20  Lite would.  ** 
129e0 20 20 20 20 70 72 6f 63 65 65 64 20 77 69 74 68      proceed with
129f0 20 72 75 6e 6e 69 6e 67 20 61 20 70 61 73 73 69   running a passi
12a00 76 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 6e  ve checkpoint in
12a10 73 74 65 61 64 20 6f 66 20 66 61 69 6c 69 6e 67  stead of failing
12a20 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a  )..  **.  **   *
12a30 20 41 74 74 65 6d 70 74 73 20 74 6f 20 72 65 61   Attempts to rea
12a40 64 20 66 72 6f 6d 20 74 68 65 20 2a 2d 77 61 6c  d from the *-wal
12a50 20 66 69 6c 65 20 6f 72 20 77 72 69 74 65 20 74   file or write t
12a60 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
12a70 69 6c 65 0a 20 20 2a 2a 20 20 20 20 20 64 6f 20  ile.  **     do 
12a80 6e 6f 74 20 70 65 72 66 6f 72 6d 20 61 6e 79 20  not perform any 
12a90 49 4f 2e 20 49 6e 73 74 65 61 64 2c 20 74 68 65  IO. Instead, the
12aa0 20 66 72 61 6d 65 2f 70 61 67 65 20 63 6f 6d 62   frame/page comb
12ab0 69 6e 61 74 69 6f 6e 73 20 74 68 61 74 0a 20 20  inations that.  
12ac0 2a 2a 20 20 20 20 20 77 6f 75 6c 64 20 62 65 20  **     would be 
12ad0 72 65 61 64 2f 77 72 69 74 74 65 6e 20 61 72 65  read/written are
12ae0 20 72 65 63 6f 72 64 65 64 20 69 6e 20 74 68 65   recorded in the
12af0 20 73 71 6c 69 74 65 33 72 62 75 2e 61 46 72 61   sqlite3rbu.aFra
12b00 6d 65 5b 5d 0a 20 20 2a 2a 20 20 20 20 20 61 72  me[].  **     ar
12b10 72 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ray..  **.  **  
12b20 20 2a 20 43 61 6c 6c 73 20 74 6f 20 78 53 68 6d   * Calls to xShm
12b30 4c 6f 63 6b 28 55 4e 4c 4f 43 4b 29 20 74 6f 20  Lock(UNLOCK) to 
12b40 72 65 6c 65 61 73 65 20 74 68 65 20 65 78 63 6c  release the excl
12b50 75 73 69 76 65 20 73 68 6d 20 57 52 49 54 45 52  usive shm WRITER
12b60 2c 20 0a 20 20 2a 2a 20 20 20 20 20 52 45 41 44  , .  **     READ
12b70 30 20 61 6e 64 20 43 48 45 43 4b 50 4f 49 4e 54  0 and CHECKPOINT
12b80 20 6c 6f 63 6b 73 20 74 61 6b 65 6e 20 61 73 20   locks taken as 
12b90 70 61 72 74 20 6f 66 20 74 68 65 20 63 68 65 63  part of the chec
12ba0 6b 70 6f 69 6e 74 20 61 72 65 0a 20 20 2a 2a 20  kpoint are.  ** 
12bb0 20 20 20 20 6e 6f 2d 6f 70 73 2e 20 54 68 65 73      no-ops. Thes
12bc0 65 20 6c 6f 63 6b 73 20 77 69 6c 6c 20 6e 6f 74  e locks will not
12bd0 20 62 65 20 72 65 6c 65 61 73 65 64 20 75 6e 74   be released unt
12be0 69 6c 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  il the connectio
12bf0 6e 0a 20 20 2a 2a 20 20 20 20 20 69 73 20 63 6c  n.  **     is cl
12c00 6f 73 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  osed..  **.  ** 
12c10 20 20 2a 20 41 74 74 65 6d 70 74 69 6e 67 20 74    * Attempting t
12c20 6f 20 78 53 79 6e 63 28 29 20 74 68 65 20 64 61  o xSync() the da
12c30 74 61 62 61 73 65 20 66 69 6c 65 20 63 61 75 73  tabase file caus
12c40 65 73 20 61 6e 20 53 51 4c 49 54 45 5f 49 4e 54  es an SQLITE_INT
12c50 45 52 4e 41 4c 20 0a 20 20 2a 2a 20 20 20 20 20  ERNAL .  **     
12c60 65 72 72 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  error..  **.  **
12c70 20 41 73 20 61 20 72 65 73 75 6c 74 2c 20 75 6e   As a result, un
12c80 6c 65 73 73 20 61 6e 20 65 72 72 6f 72 20 28 69  less an error (i
12c90 2e 65 2e 20 4f 4f 4d 20 6f 72 20 53 51 4c 49 54  .e. OOM or SQLIT
12ca0 45 5f 42 55 53 59 29 20 6f 63 63 75 72 73 2c 20  E_BUSY) occurs, 
12cb0 74 68 65 0a 20 20 2a 2a 20 63 68 65 63 6b 70 6f  the.  ** checkpo
12cc0 69 6e 74 20 62 65 6c 6f 77 20 66 61 69 6c 73 20  int below fails 
12cd0 77 69 74 68 20 53 51 4c 49 54 45 5f 49 4e 54 45  with SQLITE_INTE
12ce0 52 4e 41 4c 2c 20 61 6e 64 20 6c 65 61 76 65 73  RNAL, and leaves
12cf0 20 74 68 65 20 61 46 72 61 6d 65 5b 5d 0a 20 20   the aFrame[].  
12d00 2a 2a 20 61 72 72 61 79 20 70 6f 70 75 6c 61 74  ** array populat
12d10 65 64 20 77 69 74 68 20 61 20 73 65 74 20 6f 66  ed with a set of
12d20 20 28 66 72 61 6d 65 20 2d 3e 20 70 61 67 65 29   (frame -> page)
12d30 20 6d 61 70 70 69 6e 67 73 2e 20 42 65 63 61 75   mappings. Becau
12d40 73 65 20 74 68 65 20 0a 20 20 2a 2a 20 57 52 49  se the .  ** WRI
12d50 54 45 52 2c 20 43 48 45 43 4b 50 4f 49 4e 54 20  TER, CHECKPOINT 
12d60 61 6e 64 20 52 45 41 44 30 20 6c 6f 63 6b 73 20  and READ0 locks 
12d70 61 72 65 20 73 74 69 6c 6c 20 68 65 6c 64 2c 20  are still held, 
12d80 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 63 6f  it is safe to co
12d90 70 79 20 0a 20 20 2a 2a 20 64 61 74 61 20 66 72  py .  ** data fr
12da0 6f 6d 20 74 68 65 20 77 61 6c 20 66 69 6c 65 20  om the wal file 
12db0 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
12dc0 65 20 66 69 6c 65 20 61 63 63 6f 72 64 69 6e 67  e file according
12dd0 20 74 6f 20 74 68 65 20 0a 20 20 2a 2a 20 63 6f   to the .  ** co
12de0 6e 74 65 6e 74 73 20 6f 66 20 61 46 72 61 6d 65  ntents of aFrame
12df0 5b 5d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  []..  */.  if( p
12e00 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
12e10 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a  ){.    int rc2;.
12e20 20 20 20 20 70 2d 3e 65 53 74 61 67 65 20 3d 20      p->eStage = 
12e30 52 42 55 5f 53 54 41 47 45 5f 43 41 50 54 55 52  RBU_STAGE_CAPTUR
12e40 45 3b 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c  E;.    rc2 = sql
12e50 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 4d  ite3_exec(p->dbM
12e60 61 69 6e 2c 20 22 50 52 41 47 4d 41 20 6d 61 69  ain, "PRAGMA mai
12e70 6e 2e 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  n.wal_checkpoint
12e80 3d 72 65 73 74 61 72 74 22 2c 20 30 2c 20 30 2c  =restart", 0, 0,
12e90 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 32 21  0);.    if( rc2!
12ea0 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c  =SQLITE_INTERNAL
12eb0 20 29 20 70 2d 3e 72 63 20 3d 20 72 63 32 3b 0a   ) p->rc = rc2;.
12ec0 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63    }..  if( p->rc
12ed0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
12ee0 20 20 20 70 2d 3e 65 53 74 61 67 65 20 3d 20 52     p->eStage = R
12ef0 42 55 5f 53 54 41 47 45 5f 43 4b 50 54 3b 0a 20  BU_STAGE_CKPT;. 
12f00 20 20 20 70 2d 3e 6e 53 74 65 70 20 3d 20 28 70     p->nStep = (p
12f10 53 74 61 74 65 20 3f 20 70 53 74 61 74 65 2d 3e  State ? pState->
12f20 6e 52 6f 77 20 3a 20 30 29 3b 0a 20 20 20 20 70  nRow : 0);.    p
12f30 2d 3e 61 42 75 66 20 3d 20 72 62 75 4d 61 6c 6c  ->aBuf = rbuMall
12f40 6f 63 28 70 2c 20 70 2d 3e 70 67 73 7a 29 3b 0a  oc(p, p->pgsz);.
12f50 20 20 20 20 70 2d 3e 69 57 61 6c 43 6b 73 75 6d      p->iWalCksum
12f60 20 3d 20 72 62 75 53 68 6d 43 68 65 63 6b 73 75   = rbuShmChecksu
12f70 6d 28 70 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  m(p);.  }..  if(
12f80 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
12f90 4b 20 26 26 20 70 53 74 61 74 65 20 26 26 20 70  K && pState && p
12fa0 53 74 61 74 65 2d 3e 69 57 61 6c 43 6b 73 75 6d  State->iWalCksum
12fb0 21 3d 70 2d 3e 69 57 61 6c 43 6b 73 75 6d 20 29  !=p->iWalCksum )
12fc0 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51  {.    p->rc = SQ
12fd0 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 70  LITE_DONE;.    p
12fe0 2d 3e 65 53 74 61 67 65 20 3d 20 52 42 55 5f 53  ->eStage = RBU_S
12ff0 54 41 47 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 7d  TAGE_DONE;.  }.}
13000 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 65 64 20 77  ../*.** Called w
13010 68 65 6e 20 69 41 6d 74 20 62 79 74 65 73 20 61  hen iAmt bytes a
13020 72 65 20 72 65 61 64 20 66 72 6f 6d 20 6f 66 66  re read from off
13030 73 65 74 20 69 4f 66 66 20 6f 66 20 74 68 65 20  set iOff of the 
13040 77 61 6c 20 66 69 6c 65 20 77 68 69 6c 65 0a 2a  wal file while.*
13050 2a 20 74 68 65 20 72 62 75 20 6f 62 6a 65 63 74  * the rbu object
13060 20 69 73 20 69 6e 20 63 61 70 74 75 72 65 20 6d   is in capture m
13070 6f 64 65 2e 20 52 65 63 6f 72 64 20 74 68 65 20  ode. Record the 
13080 66 72 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20  frame number of 
13090 74 68 65 20 66 72 61 6d 65 0a 2a 2a 20 62 65 69  the frame.** bei
130a0 6e 67 20 72 65 61 64 20 69 6e 20 74 68 65 20 61  ng read in the a
130b0 46 72 61 6d 65 5b 5d 20 61 72 72 61 79 2e 0a 2a  Frame[] array..*
130c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62 75  /.static int rbu
130d0 43 61 70 74 75 72 65 57 61 6c 52 65 61 64 28 73  CaptureWalRead(s
130e0 71 6c 69 74 65 33 72 62 75 20 2a 70 52 62 75 2c  qlite3rbu *pRbu,
130f0 20 69 36 34 20 69 4f 66 66 2c 20 69 6e 74 20 69   i64 iOff, int i
13100 41 6d 74 29 7b 0a 20 20 63 6f 6e 73 74 20 75 33  Amt){.  const u3
13110 32 20 6d 52 65 71 20 3d 20 28 31 3c 3c 57 41 4c  2 mReq = (1<<WAL
13120 5f 4c 4f 43 4b 5f 57 52 49 54 45 29 7c 28 31 3c  _LOCK_WRITE)|(1<
13130 3c 57 41 4c 5f 4c 4f 43 4b 5f 43 4b 50 54 29 7c  <WAL_LOCK_CKPT)|
13140 28 31 3c 3c 57 41 4c 5f 4c 4f 43 4b 5f 52 45 41  (1<<WAL_LOCK_REA
13150 44 30 29 3b 0a 20 20 75 33 32 20 69 46 72 61 6d  D0);.  u32 iFram
13160 65 3b 0a 0a 20 20 69 66 28 20 70 52 62 75 2d 3e  e;..  if( pRbu->
13170 6d 4c 6f 63 6b 21 3d 6d 52 65 71 20 29 7b 0a 20  mLock!=mReq ){. 
13180 20 20 20 70 52 62 75 2d 3e 72 63 20 3d 20 53 51     pRbu->rc = SQ
13190 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 72  LITE_BUSY;.    r
131a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4e 54  eturn SQLITE_INT
131b0 45 52 4e 41 4c 3b 0a 20 20 7d 0a 0a 20 20 70 52  ERNAL;.  }..  pR
131c0 62 75 2d 3e 70 67 73 7a 20 3d 20 69 41 6d 74 3b  bu->pgsz = iAmt;
131d0 0a 20 20 69 66 28 20 70 52 62 75 2d 3e 6e 46 72  .  if( pRbu->nFr
131e0 61 6d 65 3d 3d 70 52 62 75 2d 3e 6e 46 72 61 6d  ame==pRbu->nFram
131f0 65 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 69 6e  eAlloc ){.    in
13200 74 20 6e 4e 65 77 20 3d 20 28 70 52 62 75 2d 3e  t nNew = (pRbu->
13210 6e 46 72 61 6d 65 41 6c 6c 6f 63 20 3f 20 70 52  nFrameAlloc ? pR
13220 62 75 2d 3e 6e 46 72 61 6d 65 41 6c 6c 6f 63 20  bu->nFrameAlloc 
13230 3a 20 36 34 29 20 2a 20 32 3b 0a 20 20 20 20 52  : 64) * 2;.    R
13240 62 75 46 72 61 6d 65 20 2a 61 4e 65 77 3b 0a 20  buFrame *aNew;. 
13250 20 20 20 61 4e 65 77 20 3d 20 28 52 62 75 46 72     aNew = (RbuFr
13260 61 6d 65 2a 29 73 71 6c 69 74 65 33 5f 72 65 61  ame*)sqlite3_rea
13270 6c 6c 6f 63 28 70 52 62 75 2d 3e 61 46 72 61 6d  lloc(pRbu->aFram
13280 65 2c 20 6e 4e 65 77 20 2a 20 73 69 7a 65 6f 66  e, nNew * sizeof
13290 28 52 62 75 46 72 61 6d 65 29 29 3b 0a 20 20 20  (RbuFrame));.   
132a0 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 20 72   if( aNew==0 ) r
132b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
132c0 45 4d 3b 0a 20 20 20 20 70 52 62 75 2d 3e 61 46  EM;.    pRbu->aF
132d0 72 61 6d 65 20 3d 20 61 4e 65 77 3b 0a 20 20 20  rame = aNew;.   
132e0 20 70 52 62 75 2d 3e 6e 46 72 61 6d 65 41 6c 6c   pRbu->nFrameAll
132f0 6f 63 20 3d 20 6e 4e 65 77 3b 0a 20 20 7d 0a 0a  oc = nNew;.  }..
13300 20 20 69 46 72 61 6d 65 20 3d 20 28 75 33 32 29    iFrame = (u32)
13310 28 28 69 4f 66 66 2d 33 32 29 20 2f 20 28 69 36  ((iOff-32) / (i6
13320 34 29 28 69 41 6d 74 2b 32 34 29 29 20 2b 20 31  4)(iAmt+24)) + 1
13330 3b 0a 20 20 69 66 28 20 70 52 62 75 2d 3e 69 4d  ;.  if( pRbu->iM
13340 61 78 46 72 61 6d 65 3c 69 46 72 61 6d 65 20 29  axFrame<iFrame )
13350 20 70 52 62 75 2d 3e 69 4d 61 78 46 72 61 6d 65   pRbu->iMaxFrame
13360 20 3d 20 69 46 72 61 6d 65 3b 0a 20 20 70 52 62   = iFrame;.  pRb
13370 75 2d 3e 61 46 72 61 6d 65 5b 70 52 62 75 2d 3e  u->aFrame[pRbu->
13380 6e 46 72 61 6d 65 5d 2e 69 57 61 6c 46 72 61 6d  nFrame].iWalFram
13390 65 20 3d 20 69 46 72 61 6d 65 3b 0a 20 20 70 52  e = iFrame;.  pR
133a0 62 75 2d 3e 61 46 72 61 6d 65 5b 70 52 62 75 2d  bu->aFrame[pRbu-
133b0 3e 6e 46 72 61 6d 65 5d 2e 69 44 62 50 61 67 65  >nFrame].iDbPage
133c0 20 3d 20 30 3b 0a 20 20 70 52 62 75 2d 3e 6e 46   = 0;.  pRbu->nF
133d0 72 61 6d 65 2b 2b 3b 0a 20 20 72 65 74 75 72 6e  rame++;.  return
133e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
133f0 2a 0a 2a 2a 20 43 61 6c 6c 65 64 20 77 68 65 6e  *.** Called when
13400 20 61 20 70 61 67 65 20 6f 66 20 64 61 74 61 20   a page of data 
13410 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 6f 66  is written to of
13420 66 73 65 74 20 69 4f 66 66 20 6f 66 20 74 68 65  fset iOff of the
13430 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c   database.** fil
13440 65 20 77 68 69 6c 65 20 74 68 65 20 72 62 75 20  e while the rbu 
13450 68 61 6e 64 6c 65 20 69 73 20 69 6e 20 63 61 70  handle is in cap
13460 74 75 72 65 20 6d 6f 64 65 2e 20 52 65 63 6f 72  ture mode. Recor
13470 64 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  d the page numbe
13480 72 20 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67  r .** of the pag
13490 65 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20  e being written 
134a0 69 6e 20 74 68 65 20 61 46 72 61 6d 65 5b 5d 20  in the aFrame[] 
134b0 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  array..*/.static
134c0 20 69 6e 74 20 72 62 75 43 61 70 74 75 72 65 44   int rbuCaptureD
134d0 62 57 72 69 74 65 28 73 71 6c 69 74 65 33 72 62  bWrite(sqlite3rb
134e0 75 20 2a 70 52 62 75 2c 20 69 36 34 20 69 4f 66  u *pRbu, i64 iOf
134f0 66 29 7b 0a 20 20 70 52 62 75 2d 3e 61 46 72 61  f){.  pRbu->aFra
13500 6d 65 5b 70 52 62 75 2d 3e 6e 46 72 61 6d 65 2d  me[pRbu->nFrame-
13510 31 5d 2e 69 44 62 50 61 67 65 20 3d 20 28 75 33  1].iDbPage = (u3
13520 32 29 28 69 4f 66 66 20 2f 20 70 52 62 75 2d 3e  2)(iOff / pRbu->
13530 70 67 73 7a 29 20 2b 20 31 3b 0a 20 20 72 65 74  pgsz) + 1;.  ret
13540 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
13550 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
13560 63 61 6c 6c 65 64 20 61 73 20 70 61 72 74 20 6f  called as part o
13570 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  f an incremental
13580 20 63 68 65 63 6b 70 6f 69 6e 74 20 6f 70 65 72   checkpoint oper
13590 61 74 69 6f 6e 2e 20 43 6f 70 79 0a 2a 2a 20 61  ation. Copy.** a
135a0 20 73 69 6e 67 6c 65 20 66 72 61 6d 65 20 6f 66   single frame of
135b0 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 77   data from the w
135c0 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 74 68 65  al file into the
135d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
135e0 61 73 0a 2a 2a 20 69 6e 64 69 63 61 74 65 64 20  as.** indicated 
135f0 62 79 20 74 68 65 20 52 62 75 46 72 61 6d 65 20  by the RbuFrame 
13600 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69  object..*/.stati
13610 63 20 76 6f 69 64 20 72 62 75 43 68 65 63 6b 70  c void rbuCheckp
13620 6f 69 6e 74 46 72 61 6d 65 28 73 71 6c 69 74 65  ointFrame(sqlite
13630 33 72 62 75 20 2a 70 2c 20 52 62 75 46 72 61 6d  3rbu *p, RbuFram
13640 65 20 2a 70 46 72 61 6d 65 29 7b 0a 20 20 73 71  e *pFrame){.  sq
13650 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 57 61 6c  lite3_file *pWal
13660 20 3d 20 70 2d 3e 70 54 61 72 67 65 74 46 64 2d   = p->pTargetFd-
13670 3e 70 57 61 6c 46 64 2d 3e 70 52 65 61 6c 3b 0a  >pWalFd->pReal;.
13680 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
13690 70 44 62 20 3d 20 70 2d 3e 70 54 61 72 67 65 74  pDb = p->pTarget
136a0 46 64 2d 3e 70 52 65 61 6c 3b 0a 20 20 69 36 34  Fd->pReal;.  i64
136b0 20 69 4f 66 66 3b 0a 0a 20 20 61 73 73 65 72 74   iOff;..  assert
136c0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
136d0 4f 4b 20 29 3b 0a 20 20 69 4f 66 66 20 3d 20 28  OK );.  iOff = (
136e0 69 36 34 29 28 70 46 72 61 6d 65 2d 3e 69 57 61  i64)(pFrame->iWa
136f0 6c 46 72 61 6d 65 2d 31 29 20 2a 20 28 70 2d 3e  lFrame-1) * (p->
13700 70 67 73 7a 20 2b 20 32 34 29 20 2b 20 33 32 20  pgsz + 24) + 32 
13710 2b 20 32 34 3b 0a 20 20 70 2d 3e 72 63 20 3d 20  + 24;.  p->rc = 
13720 70 57 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e  pWal->pMethods->
13730 78 52 65 61 64 28 70 57 61 6c 2c 20 70 2d 3e 61  xRead(pWal, p->a
13740 42 75 66 2c 20 70 2d 3e 70 67 73 7a 2c 20 69 4f  Buf, p->pgsz, iO
13750 66 66 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63  ff);.  if( p->rc
13760 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 4f   ) return;..  iO
13770 66 66 20 3d 20 28 69 36 34 29 28 70 46 72 61 6d  ff = (i64)(pFram
13780 65 2d 3e 69 44 62 50 61 67 65 2d 31 29 20 2a 20  e->iDbPage-1) * 
13790 70 2d 3e 70 67 73 7a 3b 0a 20 20 70 2d 3e 72 63  p->pgsz;.  p->rc
137a0 20 3d 20 70 44 62 2d 3e 70 4d 65 74 68 6f 64 73   = pDb->pMethods
137b0 2d 3e 78 57 72 69 74 65 28 70 44 62 2c 20 70 2d  ->xWrite(pDb, p-
137c0 3e 61 42 75 66 2c 20 70 2d 3e 70 67 73 7a 2c 20  >aBuf, p->pgsz, 
137d0 69 4f 66 66 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  iOff);.}.../*.**
137e0 20 54 61 6b 65 20 61 6e 20 45 58 43 4c 55 53 49   Take an EXCLUSI
137f0 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  VE lock on the d
13800 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f  atabase file..*/
13810 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75  .static void rbu
13820 4c 6f 63 6b 44 61 74 61 62 61 73 65 28 73 71 6c  LockDatabase(sql
13830 69 74 65 33 72 62 75 20 2a 70 29 7b 0a 20 20 73  ite3rbu *p){.  s
13840 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 52 65  qlite3_file *pRe
13850 61 6c 20 3d 20 70 2d 3e 70 54 61 72 67 65 74 46  al = p->pTargetF
13860 64 2d 3e 70 52 65 61 6c 3b 0a 20 20 61 73 73 65  d->pReal;.  asse
13870 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rt( p->rc==SQLIT
13880 45 5f 4f 4b 20 29 3b 0a 20 20 70 2d 3e 72 63 20  E_OK );.  p->rc 
13890 3d 20 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64  = pReal->pMethod
138a0 73 2d 3e 78 4c 6f 63 6b 28 70 52 65 61 6c 2c 20  s->xLock(pReal, 
138b0 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 53 48 41 52  SQLITE_LOCK_SHAR
138c0 45 44 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63  ED);.  if( p->rc
138d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
138e0 20 20 20 70 2d 3e 72 63 20 3d 20 70 52 65 61 6c     p->rc = pReal
138f0 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 4c 6f 63  ->pMethods->xLoc
13900 6b 28 70 52 65 61 6c 2c 20 53 51 4c 49 54 45 5f  k(pReal, SQLITE_
13910 4c 4f 43 4b 5f 45 58 43 4c 55 53 49 56 45 29 3b  LOCK_EXCLUSIVE);
13920 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
13930 65 20 52 42 55 20 68 61 6e 64 6c 65 20 69 73 20  e RBU handle is 
13940 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 52 42 55  currently in RBU
13950 5f 53 54 41 47 45 5f 4f 41 4c 20 73 74 61 74 65  _STAGE_OAL state
13960 2c 20 77 69 74 68 20 61 20 53 48 41 52 45 44 20  , with a SHARED 
13970 6c 6f 63 6b 0a 2a 2a 20 6f 6e 20 74 68 65 20 64  lock.** on the d
13980 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68  atabase file. Th
13990 69 73 20 70 72 6f 63 20 6d 6f 76 65 73 20 74 68  is proc moves th
139a0 65 20 2a 2d 6f 61 6c 20 66 69 6c 65 20 74 6f 20  e *-oal file to 
139b0 74 68 65 20 2a 2d 77 61 6c 20 70 61 74 68 2c 0a  the *-wal path,.
139c0 2a 2a 20 74 68 65 6e 20 72 65 6f 70 65 6e 73 20  ** then reopens 
139d0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
139e0 65 20 28 74 68 69 73 20 74 69 6d 65 20 69 6e 20  e (this time in 
139f0 76 61 6e 69 6c 6c 61 2c 20 6e 6f 6e 2d 6f 61 6c  vanilla, non-oal
13a00 2c 20 57 41 4c 20 6d 6f 64 65 29 2e 0a 2a 2a 20  , WAL mode)..** 
13a10 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
13a20 72 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72  rs, leave an err
13a30 6f 72 20 63 6f 64 65 20 61 6e 64 20 65 72 72 6f  or code and erro
13a40 72 20 6d 65 73 73 61 67 65 20 69 6e 20 74 68 65  r message in the
13a50 20 72 62 75 20 0a 2a 2a 20 68 61 6e 64 6c 65 2e   rbu .** handle.
13a60 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
13a70 72 62 75 4d 6f 76 65 4f 61 6c 46 69 6c 65 28 73  rbuMoveOalFile(s
13a80 71 6c 69 74 65 33 72 62 75 20 2a 70 29 7b 0a 20  qlite3rbu *p){. 
13a90 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 61   const char *zBa
13aa0 73 65 20 3d 20 73 71 6c 69 74 65 33 5f 64 62 5f  se = sqlite3_db_
13ab0 66 69 6c 65 6e 61 6d 65 28 70 2d 3e 64 62 4d 61  filename(p->dbMa
13ac0 69 6e 2c 20 22 6d 61 69 6e 22 29 3b 0a 0a 20 20  in, "main");..  
13ad0 63 68 61 72 20 2a 7a 57 61 6c 20 3d 20 73 71 6c  char *zWal = sql
13ae0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
13af0 2d 77 61 6c 22 2c 20 7a 42 61 73 65 29 3b 0a 20  -wal", zBase);. 
13b00 20 63 68 61 72 20 2a 7a 4f 61 6c 20 3d 20 73 71   char *zOal = sq
13b10 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
13b20 73 2d 6f 61 6c 22 2c 20 7a 42 61 73 65 29 3b 0a  s-oal", zBase);.
13b30 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 53  .  assert( p->eS
13b40 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f  tage==RBU_STAGE_
13b50 4d 4f 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74  MOVE );.  assert
13b60 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
13b70 4f 4b 20 26 26 20 70 2d 3e 7a 45 72 72 6d 73 67  OK && p->zErrmsg
13b80 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 7a 57 61  ==0 );.  if( zWa
13b90 6c 3d 3d 30 20 7c 7c 20 7a 4f 61 6c 3d 3d 30 20  l==0 || zOal==0 
13ba0 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  ){.    p->rc = S
13bb0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
13bc0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4d 6f 76  else{.    /* Mov
13bd0 65 20 74 68 65 20 2a 2d 6f 61 6c 20 66 69 6c 65  e the *-oal file
13be0 20 74 6f 20 2a 2d 77 61 6c 2e 20 41 74 20 74 68   to *-wal. At th
13bf0 69 73 20 70 6f 69 6e 74 20 63 6f 6e 6e 65 63 74  is point connect
13c00 69 6f 6e 20 70 2d 3e 64 62 20 69 73 0a 20 20 20  ion p->db is.   
13c10 20 2a 2a 20 68 6f 6c 64 69 6e 67 20 61 20 53 48   ** holding a SH
13c20 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ARED lock on the
13c30 20 74 61 72 67 65 74 20 64 61 74 61 62 61 73 65   target database
13c40 20 66 69 6c 65 20 28 62 65 63 61 75 73 65 20 69   file (because i
13c50 74 20 69 73 0a 20 20 20 20 2a 2a 20 69 6e 20 57  t is.    ** in W
13c60 41 4c 20 6d 6f 64 65 29 2e 20 53 6f 20 6e 6f 20  AL mode). So no 
13c70 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
13c80 20 6d 61 79 20 62 65 20 77 72 69 74 69 6e 67 20   may be writing 
13c90 74 68 65 20 64 62 2e 20 0a 20 20 20 20 2a 2a 0a  the db. .    **.
13ca0 20 20 20 20 2a 2a 20 49 6e 20 6f 72 64 65 72 20      ** In order 
13cb0 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  to ensure that t
13cc0 68 65 72 65 20 61 72 65 20 6e 6f 20 64 61 74 61  here are no data
13cd0 62 61 73 65 20 72 65 61 64 65 72 73 2c 20 61 6e  base readers, an
13ce0 20 45 58 43 4c 55 53 49 56 45 0a 20 20 20 20 2a   EXCLUSIVE.    *
13cf0 2a 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e  * lock is obtain
13d00 65 64 20 68 65 72 65 20 62 65 66 6f 72 65 20 74  ed here before t
13d10 68 65 20 2a 2d 6f 61 6c 20 69 73 20 6d 6f 76 65  he *-oal is move
13d20 64 20 74 6f 20 2a 2d 77 61 6c 2e 0a 20 20 20 20  d to *-wal..    
13d30 2a 2f 0a 20 20 20 20 72 62 75 4c 6f 63 6b 44 61  */.    rbuLockDa
13d40 74 61 62 61 73 65 28 70 29 3b 0a 20 20 20 20 69  tabase(p);.    i
13d50 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
13d60 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 62 75  _OK ){.      rbu
13d70 46 69 6c 65 53 75 66 66 69 78 33 28 7a 42 61 73  FileSuffix3(zBas
13d80 65 2c 20 7a 57 61 6c 29 3b 0a 20 20 20 20 20 20  e, zWal);.      
13d90 72 62 75 46 69 6c 65 53 75 66 66 69 78 33 28 7a  rbuFileSuffix3(z
13da0 42 61 73 65 2c 20 7a 4f 61 6c 29 3b 0a 0a 20 20  Base, zOal);..  
13db0 20 20 20 20 2f 2a 20 52 65 2d 6f 70 65 6e 20 74      /* Re-open t
13dc0 68 65 20 64 61 74 61 62 61 73 65 73 2e 20 2a 2f  he databases. */
13dd0 0a 20 20 20 20 20 20 72 62 75 4f 62 6a 49 74 65  .      rbuObjIte
13de0 72 46 69 6e 61 6c 69 7a 65 28 26 70 2d 3e 6f 62  rFinalize(&p->ob
13df0 6a 69 74 65 72 29 3b 0a 20 20 20 20 20 20 73 71  jiter);.      sq
13e00 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 2d 3e 64  lite3_close(p->d
13e10 62 4d 61 69 6e 29 3b 0a 20 20 20 20 20 20 73 71  bMain);.      sq
13e20 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 2d 3e 64  lite3_close(p->d
13e30 62 52 62 75 29 3b 0a 20 20 20 20 20 20 70 2d 3e  bRbu);.      p->
13e40 72 63 20 3d 20 72 65 6e 61 6d 65 28 7a 4f 61 6c  rc = rename(zOal
13e50 2c 20 7a 57 61 6c 29 20 3f 20 53 51 4c 49 54 45  , zWal) ? SQLITE
13e60 5f 49 4f 45 52 52 20 3a 20 53 51 4c 49 54 45 5f  _IOERR : SQLITE_
13e70 4f 4b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  OK;.      if( p-
13e80 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
13e90 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 64 62 4d  {.        p->dbM
13ea0 61 69 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ain = 0;.       
13eb0 20 70 2d 3e 64 62 52 62 75 20 3d 20 30 3b 0a 20   p->dbRbu = 0;. 
13ec0 20 20 20 20 20 20 20 72 62 75 4f 70 65 6e 44 61         rbuOpenDa
13ed0 74 61 62 61 73 65 28 70 29 3b 0a 20 20 20 20 20  tabase(p);.     
13ee0 20 20 20 72 62 75 53 65 74 75 70 43 68 65 63 6b     rbuSetupCheck
13ef0 70 6f 69 6e 74 28 70 2c 20 30 29 3b 0a 20 20 20  point(p, 0);.   
13f00 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
13f10 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
13f20 57 61 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Wal);.  sqlite3_
13f30 66 72 65 65 28 7a 4f 61 6c 29 3b 0a 7d 0a 0a 2f  free(zOal);.}../
13f40 2a 0a 2a 2a 20 54 68 65 20 53 45 4c 45 43 54 20  *.** The SELECT 
13f50 73 74 61 74 65 6d 65 6e 74 20 69 74 65 72 61 74  statement iterat
13f60 69 6e 67 20 74 68 72 6f 75 67 68 20 74 68 65 20  ing through the 
13f70 6b 65 79 73 20 66 6f 72 20 74 68 65 20 63 75 72  keys for the cur
13f80 72 65 6e 74 20 6f 62 6a 65 63 74 0a 2a 2a 20 28  rent object.** (
13f90 70 2d 3e 6f 62 6a 69 74 65 72 2e 70 53 65 6c 65  p->objiter.pSele
13fa0 63 74 29 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  ct) currently po
13fb0 69 6e 74 73 20 74 6f 20 61 20 76 61 6c 69 64 20  ints to a valid 
13fc0 72 6f 77 2e 20 54 68 69 73 20 66 75 6e 63 74 69  row. This functi
13fd0 6f 6e 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 73  on.** determines
13fe0 20 74 68 65 20 74 79 70 65 20 6f 66 20 6f 70 65   the type of ope
13ff0 72 61 74 69 6f 6e 20 72 65 71 75 65 73 74 65 64  ration requested
14000 20 62 79 20 74 68 69 73 20 72 6f 77 20 61 6e 64   by this row and
14010 20 72 65 74 75 72 6e 73 0a 2a 2a 20 6f 6e 65 20   returns.** one 
14020 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
14030 20 76 61 6c 75 65 73 20 74 6f 20 69 6e 64 69 63   values to indic
14040 61 74 65 20 74 68 65 20 72 65 73 75 6c 74 3a 0a  ate the result:.
14050 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 52 42 55 5f  **.**     * RBU_
14060 49 4e 53 45 52 54 0a 2a 2a 20 20 20 20 20 2a 20  INSERT.**     * 
14070 52 42 55 5f 44 45 4c 45 54 45 0a 2a 2a 20 20 20  RBU_DELETE.**   
14080 20 20 2a 20 52 42 55 5f 49 44 58 5f 44 45 4c 45    * RBU_IDX_DELE
14090 54 45 0a 2a 2a 20 20 20 20 20 2a 20 52 42 55 5f  TE.**     * RBU_
140a0 55 50 44 41 54 45 0a 2a 2a 0a 2a 2a 20 49 66 20  UPDATE.**.** If 
140b0 52 42 55 5f 55 50 44 41 54 45 20 69 73 20 72 65  RBU_UPDATE is re
140c0 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 6f 75 74  turned, then out
140d0 70 75 74 20 76 61 72 69 61 62 6c 65 20 2a 70 7a  put variable *pz
140e0 4d 61 73 6b 20 69 73 20 73 65 74 20 74 6f 0a 2a  Mask is set to.*
140f0 2a 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 74  * point to the t
14100 65 78 74 20 76 61 6c 75 65 20 69 6e 64 69 63 61  ext value indica
14110 74 69 6e 67 20 74 68 65 20 63 6f 6c 75 6d 6e 73  ting the columns
14120 20 74 6f 20 75 70 64 61 74 65 2e 0a 2a 2a 0a 2a   to update..**.*
14130 2a 20 49 66 20 74 68 65 20 72 62 75 5f 63 6f 6e  * If the rbu_con
14140 74 72 6f 6c 20 66 69 65 6c 64 20 63 6f 6e 74 61  trol field conta
14150 69 6e 73 20 61 6e 20 69 6e 76 61 6c 69 64 20 76  ins an invalid v
14160 61 6c 75 65 2c 20 61 6e 20 65 72 72 6f 72 20 63  alue, an error c
14170 6f 64 65 20 61 6e 64 0a 2a 2a 20 6d 65 73 73 61  ode and.** messa
14180 67 65 20 61 72 65 20 6c 65 66 74 20 69 6e 20 74  ge are left in t
14190 68 65 20 52 42 55 20 68 61 6e 64 6c 65 20 61 6e  he RBU handle an
141a0 64 20 7a 65 72 6f 20 72 65 74 75 72 6e 65 64 2e  d zero returned.
141b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
141c0 62 75 53 74 65 70 54 79 70 65 28 73 71 6c 69 74  buStepType(sqlit
141d0 65 33 72 62 75 20 2a 70 2c 20 63 6f 6e 73 74 20  e3rbu *p, const 
141e0 63 68 61 72 20 2a 2a 70 7a 4d 61 73 6b 29 7b 0a  char **pzMask){.
141f0 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e    int iCol = p->
14200 6f 62 6a 69 74 65 72 2e 6e 43 6f 6c 3b 20 20 20  objiter.nCol;   
14210 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72 62    /* Index of rb
14220 75 5f 63 6f 6e 74 72 6f 6c 20 63 6f 6c 75 6d 6e  u_control column
14230 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d 20   */.  int res = 
14240 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
14250 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
14260 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 73 77 69 74  value */..  swit
14270 63 68 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ch( sqlite3_colu
14280 6d 6e 5f 74 79 70 65 28 70 2d 3e 6f 62 6a 69 74  mn_type(p->objit
14290 65 72 2e 70 53 65 6c 65 63 74 2c 20 69 43 6f 6c  er.pSelect, iCol
142a0 29 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51  ) ){.    case SQ
142b0 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a 20 7b 0a  LITE_INTEGER: {.
142c0 20 20 20 20 20 20 69 6e 74 20 69 56 61 6c 20 3d        int iVal =
142d0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
142e0 69 6e 74 28 70 2d 3e 6f 62 6a 69 74 65 72 2e 70  int(p->objiter.p
142f0 53 65 6c 65 63 74 2c 20 69 43 6f 6c 29 3b 0a 20  Select, iCol);. 
14300 20 20 20 20 20 69 66 28 20 69 56 61 6c 3d 3d 30       if( iVal==0
14310 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 73 20   ){.        res 
14320 3d 20 52 42 55 5f 49 4e 53 45 52 54 3b 0a 20 20  = RBU_INSERT;.  
14330 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 56      }else if( iV
14340 61 6c 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  al==1 ){.       
14350 20 72 65 73 20 3d 20 52 42 55 5f 44 45 4c 45 54   res = RBU_DELET
14360 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  E;.      }else i
14370 66 28 20 69 56 61 6c 3d 3d 32 20 29 7b 0a 20 20  f( iVal==2 ){.  
14380 20 20 20 20 20 20 72 65 73 20 3d 20 52 42 55 5f        res = RBU_
14390 49 44 58 5f 44 45 4c 45 54 45 3b 0a 20 20 20 20  IDX_DELETE;.    
143a0 20 20 7d 65 6c 73 65 20 69 66 28 20 69 56 61 6c    }else if( iVal
143b0 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==3 ){.        r
143c0 65 73 20 3d 20 52 42 55 5f 49 44 58 5f 49 4e 53  es = RBU_IDX_INS
143d0 45 52 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ERT;.      }.   
143e0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
143f0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
14400 5f 54 45 58 54 3a 20 7b 0a 20 20 20 20 20 20 63  _TEXT: {.      c
14410 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
14420 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f  ar *z = sqlite3_
14430 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 2d 3e 6f  column_text(p->o
14440 62 6a 69 74 65 72 2e 70 53 65 6c 65 63 74 2c 20  bjiter.pSelect, 
14450 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 69 66 28  iCol);.      if(
14460 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   z==0 ){.       
14470 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
14480 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c  NOMEM;.      }el
14490 73 65 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a 4d  se{.        *pzM
144a0 61 73 6b 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ask = (const cha
144b0 72 2a 29 7a 3b 0a 20 20 20 20 20 20 7d 0a 20 20  r*)z;.      }.  
144c0 20 20 20 20 72 65 73 20 3d 20 52 42 55 5f 55 50      res = RBU_UP
144d0 44 41 54 45 3b 0a 0a 20 20 20 20 20 20 62 72 65  DATE;..      bre
144e0 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64  ak;.    }..    d
144f0 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 62 72  efault:.      br
14500 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  eak;.  }..  if( 
14510 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 72 62  res==0 ){.    rb
14520 75 42 61 64 43 6f 6e 74 72 6f 6c 45 72 72 6f 72  uBadControlError
14530 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  (p);.  }.  retur
14540 6e 20 72 65 73 3b 0a 7d 0a 0a 23 69 66 64 65 66  n res;.}..#ifdef
14550 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
14560 0a 2a 2a 20 41 73 73 65 72 74 20 74 68 61 74 20  .** Assert that 
14570 63 6f 6c 75 6d 6e 20 69 43 6f 6c 20 6f 66 20 73  column iCol of s
14580 74 61 74 65 6d 65 6e 74 20 70 53 74 6d 74 20 69  tatement pStmt i
14590 73 20 6e 61 6d 65 64 20 7a 4e 61 6d 65 2e 0a 2a  s named zName..*
145a0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 73  /.static void as
145b0 73 65 72 74 43 6f 6c 75 6d 6e 4e 61 6d 65 28 73  sertColumnName(s
145c0 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
145d0 6d 74 2c 20 69 6e 74 20 69 43 6f 6c 2c 20 63 6f  mt, int iCol, co
145e0 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
145f0 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
14600 7a 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63  zCol = sqlite3_c
14610 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53 74 6d 74  olumn_name(pStmt
14620 2c 20 69 43 6f 6c 29 3b 0a 20 20 61 73 73 65 72  , iCol);.  asser
14630 74 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74  t( 0==sqlite3_st
14640 72 69 63 6d 70 28 7a 4e 61 6d 65 2c 20 7a 43 6f  ricmp(zName, zCo
14650 6c 29 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20  l) );.}.#else.# 
14660 64 65 66 69 6e 65 20 61 73 73 65 72 74 43 6f 6c  define assertCol
14670 75 6d 6e 4e 61 6d 65 28 78 2c 79 2c 7a 29 0a 23  umnName(x,y,z).#
14680 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
14690 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  s function does 
146a0 74 68 65 20 77 6f 72 6b 20 66 6f 72 20 61 6e 20  the work for an 
146b0 73 71 6c 69 74 65 33 72 62 75 5f 73 74 65 70 28  sqlite3rbu_step(
146c0 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68  ) call..**.** Th
146d0 65 20 6f 62 6a 65 63 74 2d 69 74 65 72 61 74 6f  e object-iterato
146e0 72 20 28 70 2d 3e 6f 62 6a 69 74 65 72 29 20 63  r (p->objiter) c
146f0 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20  urrently points 
14700 74 6f 20 61 20 76 61 6c 69 64 20 6f 62 6a 65 63  to a valid objec
14710 74 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20 69 6e  t,.** and the in
14720 70 75 74 20 63 75 72 73 6f 72 20 28 70 2d 3e 6f  put cursor (p->o
14730 62 6a 69 74 65 72 2e 70 53 65 6c 65 63 74 29 20  bjiter.pSelect) 
14740 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73  currently points
14750 20 74 6f 20 61 20 76 61 6c 69 64 0a 2a 2a 20 69   to a valid.** i
14760 6e 70 75 74 20 72 6f 77 2e 20 50 65 72 66 6f 72  nput row. Perfor
14770 6d 20 77 68 61 74 65 76 65 72 20 70 72 6f 63 65  m whatever proce
14780 73 73 69 6e 67 20 69 73 20 72 65 71 75 69 72 65  ssing is require
14790 64 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 2a 2a  d and return..**
147a0 0a 2a 2a 20 49 66 20 6e 6f 20 20 65 72 72 6f 72  .** If no  error
147b0 20 6f 63 63 75 72 73 2c 20 53 51 4c 49 54 45 5f   occurs, SQLITE_
147c0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
147d0 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20 65 72  Otherwise, an er
147e0 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 61 6e 64 20  ror code.** and 
147f0 6d 65 73 73 61 67 65 20 69 73 20 6c 65 66 74 20  message is left 
14800 69 6e 20 74 68 65 20 52 42 55 20 68 61 6e 64 6c  in the RBU handl
14810 65 20 61 6e 64 20 61 20 63 6f 70 79 20 6f 66 20  e and a copy of 
14820 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a  the error code.*
14830 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  * returned..*/.s
14840 74 61 74 69 63 20 69 6e 74 20 72 62 75 53 74 65  tatic int rbuSte
14850 70 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 29  p(sqlite3rbu *p)
14860 7b 0a 20 20 52 62 75 4f 62 6a 49 74 65 72 20 2a  {.  RbuObjIter *
14870 70 49 74 65 72 20 3d 20 26 70 2d 3e 6f 62 6a 69  pIter = &p->obji
14880 74 65 72 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ter;.  const cha
14890 72 20 2a 7a 4d 61 73 6b 20 3d 20 30 3b 0a 20 20  r *zMask = 0;.  
148a0 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 65 54 79  int i;.  int eTy
148b0 70 65 20 3d 20 72 62 75 53 74 65 70 54 79 70 65  pe = rbuStepType
148c0 28 70 2c 20 26 7a 4d 61 73 6b 29 3b 0a 0a 20 20  (p, &zMask);..  
148d0 69 66 28 20 65 54 79 70 65 20 29 7b 0a 20 20 20  if( eType ){.   
148e0 20 61 73 73 65 72 74 28 20 65 54 79 70 65 21 3d   assert( eType!=
148f0 52 42 55 5f 55 50 44 41 54 45 20 7c 7c 20 70 49  RBU_UPDATE || pI
14900 74 65 72 2d 3e 7a 49 64 78 3d 3d 30 20 29 3b 0a  ter->zIdx==0 );.
14910 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e  .    if( pIter->
14920 7a 49 64 78 3d 3d 30 20 26 26 20 65 54 79 70 65  zIdx==0 && eType
14930 3d 3d 52 42 55 5f 49 44 58 5f 44 45 4c 45 54 45  ==RBU_IDX_DELETE
14940 20 29 7b 0a 20 20 20 20 20 20 72 62 75 42 61 64   ){.      rbuBad
14950 43 6f 6e 74 72 6f 6c 45 72 72 6f 72 28 70 29 3b  ControlError(p);
14960 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20  .    }.    else 
14970 69 66 28 20 0a 20 20 20 20 20 20 20 20 65 54 79  if( .        eTy
14980 70 65 3d 3d 52 42 55 5f 49 4e 53 45 52 54 20 0a  pe==RBU_INSERT .
14990 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 52       || eType==R
149a0 42 55 5f 44 45 4c 45 54 45 0a 20 20 20 20 20 7c  BU_DELETE.     |
149b0 7c 20 65 54 79 70 65 3d 3d 52 42 55 5f 49 44 58  | eType==RBU_IDX
149c0 5f 44 45 4c 45 54 45 20 0a 20 20 20 20 20 7c 7c  _DELETE .     ||
149d0 20 65 54 79 70 65 3d 3d 52 42 55 5f 49 44 58 5f   eType==RBU_IDX_
149e0 49 4e 53 45 52 54 0a 20 20 20 20 29 7b 0a 20 20  INSERT.    ){.  
149f0 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75      sqlite3_valu
14a00 65 20 2a 70 56 61 6c 3b 0a 20 20 20 20 20 20 73  e *pVal;.      s
14a10 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 57 72  qlite3_stmt *pWr
14a20 69 74 65 72 3b 0a 0a 20 20 20 20 20 20 61 73 73  iter;..      ass
14a30 65 72 74 28 20 65 54 79 70 65 21 3d 52 42 55 5f  ert( eType!=RBU_
14a40 55 50 44 41 54 45 20 29 3b 0a 20 20 20 20 20 20  UPDATE );.      
14a50 61 73 73 65 72 74 28 20 65 54 79 70 65 21 3d 52  assert( eType!=R
14a60 42 55 5f 44 45 4c 45 54 45 20 7c 7c 20 70 49 74  BU_DELETE || pIt
14a70 65 72 2d 3e 7a 49 64 78 3d 3d 30 20 29 3b 0a 0a  er->zIdx==0 );..
14a80 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d        if( eType=
14a90 3d 52 42 55 5f 49 44 58 5f 44 45 4c 45 54 45 20  =RBU_IDX_DELETE 
14aa0 7c 7c 20 65 54 79 70 65 3d 3d 52 42 55 5f 44 45  || eType==RBU_DE
14ab0 4c 45 54 45 20 29 7b 0a 20 20 20 20 20 20 20 20  LETE ){.        
14ac0 70 57 72 69 74 65 72 20 3d 20 70 49 74 65 72 2d  pWriter = pIter-
14ad0 3e 70 44 65 6c 65 74 65 3b 0a 20 20 20 20 20 20  >pDelete;.      
14ae0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
14af0 57 72 69 74 65 72 20 3d 20 70 49 74 65 72 2d 3e  Writer = pIter->
14b00 70 49 6e 73 65 72 74 3b 0a 20 20 20 20 20 20 7d  pInsert;.      }
14b10 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ..      for(i=0;
14b20 20 69 3c 70 49 74 65 72 2d 3e 6e 43 6f 6c 3b 20   i<pIter->nCol; 
14b30 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  i++){.        /*
14b40 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 49   If this is an I
14b50 4e 53 45 52 54 20 69 6e 74 6f 20 61 20 74 61 62  NSERT into a tab
14b60 6c 65 20 62 2d 74 72 65 65 20 61 6e 64 20 74 68  le b-tree and th
14b70 65 20 74 61 62 6c 65 20 68 61 73 20 61 6e 0a 20  e table has an. 
14b80 20 20 20 20 20 20 20 2a 2a 20 65 78 70 6c 69 63         ** explic
14b90 69 74 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  it INTEGER PRIMA
14ba0 52 59 20 4b 45 59 2c 20 63 68 65 63 6b 20 74 68  RY KEY, check th
14bb0 61 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61  at this is not a
14bc0 6e 20 61 74 74 65 6d 70 74 0a 20 20 20 20 20 20  n attempt.      
14bd0 20 20 2a 2a 20 74 6f 20 77 72 69 74 65 20 61 20    ** to write a 
14be0 4e 55 4c 4c 20 69 6e 74 6f 20 74 68 65 20 49 50  NULL into the IP
14bf0 4b 20 63 6f 6c 75 6d 6e 2e 20 54 68 61 74 20 69  K column. That i
14c00 73 20 6e 6f 74 20 70 65 72 6d 69 74 74 65 64 2e  s not permitted.
14c10 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
14c20 20 65 54 79 70 65 3d 3d 52 42 55 5f 49 4e 53 45   eType==RBU_INSE
14c30 52 54 20 0a 20 20 20 20 20 20 20 20 20 26 26 20  RT .         && 
14c40 70 49 74 65 72 2d 3e 7a 49 64 78 3d 3d 30 20 26  pIter->zIdx==0 &
14c50 26 20 70 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d  & pIter->eType==
14c60 52 42 55 5f 50 4b 5f 49 50 4b 20 26 26 20 70 49  RBU_PK_IPK && pI
14c70 74 65 72 2d 3e 61 62 54 62 6c 50 6b 5b 69 5d 20  ter->abTblPk[i] 
14c80 0a 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c  .         && sql
14c90 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65  ite3_column_type
14ca0 28 70 49 74 65 72 2d 3e 70 53 65 6c 65 63 74 2c  (pIter->pSelect,
14cb0 20 69 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c   i)==SQLITE_NULL
14cc0 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
14cd0 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51        p->rc = SQ
14ce0 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48 3b 0a 20  LITE_MISMATCH;. 
14cf0 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 45 72 72           p->zErr
14d00 6d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  msg = sqlite3_mp
14d10 72 69 6e 74 66 28 22 64 61 74 61 74 79 70 65 20  rintf("datatype 
14d20 6d 69 73 6d 61 74 63 68 22 29 3b 0a 20 20 20 20  mismatch");.    
14d30 20 20 20 20 20 20 67 6f 74 6f 20 73 74 65 70 5f        goto step_
14d40 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  out;.        }..
14d50 20 20 20 20 20 20 20 20 69 66 28 20 65 54 79 70          if( eTyp
14d60 65 3d 3d 52 42 55 5f 44 45 4c 45 54 45 20 26 26  e==RBU_DELETE &&
14d70 20 70 49 74 65 72 2d 3e 61 62 54 62 6c 50 6b 5b   pIter->abTblPk[
14d80 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  i]==0 ){.       
14d90 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
14da0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
14db0 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63  pVal = sqlite3_c
14dc0 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28 70 49 74 65  olumn_value(pIte
14dd0 72 2d 3e 70 53 65 6c 65 63 74 2c 20 69 29 3b 0a  r->pSelect, i);.
14de0 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
14df0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 76 61 6c  sqlite3_bind_val
14e00 75 65 28 70 57 72 69 74 65 72 2c 20 69 2b 31 2c  ue(pWriter, i+1,
14e10 20 70 56 61 6c 29 3b 0a 20 20 20 20 20 20 20 20   pVal);.        
14e20 69 66 28 20 70 2d 3e 72 63 20 29 20 67 6f 74 6f  if( p->rc ) goto
14e30 20 73 74 65 70 5f 6f 75 74 3b 0a 20 20 20 20 20   step_out;.     
14e40 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49 74   }.      if( pIt
14e50 65 72 2d 3e 7a 49 64 78 3d 3d 30 0a 20 20 20 20  er->zIdx==0.    
14e60 20 20 20 26 26 20 28 70 49 74 65 72 2d 3e 65 54     && (pIter->eT
14e70 79 70 65 3d 3d 52 42 55 5f 50 4b 5f 56 54 41 42  ype==RBU_PK_VTAB
14e80 20 7c 7c 20 70 49 74 65 72 2d 3e 65 54 79 70 65   || pIter->eType
14e90 3d 3d 52 42 55 5f 50 4b 5f 4e 4f 4e 45 29 20 0a  ==RBU_PK_NONE) .
14ea0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
14eb0 20 2f 2a 20 46 6f 72 20 61 20 76 69 72 74 75 61   /* For a virtua
14ec0 6c 20 74 61 62 6c 65 2c 20 6f 72 20 61 20 74 61  l table, or a ta
14ed0 62 6c 65 20 77 69 74 68 20 6e 6f 20 70 72 69 6d  ble with no prim
14ee0 61 72 79 20 6b 65 79 2c 20 74 68 65 20 0a 20 20  ary key, the .  
14ef0 20 20 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20        ** SELECT 
14f00 73 74 61 74 65 6d 65 6e 74 20 69 73 3a 0a 20 20  statement is:.  
14f10 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
14f20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 3c 63 6f   **   SELECT <co
14f30 6c 73 3e 2c 20 72 62 75 5f 63 6f 6e 74 72 6f 6c  ls>, rbu_control
14f40 2c 20 72 62 75 5f 72 6f 77 69 64 20 46 52 4f 4d  , rbu_rowid FROM
14f50 20 2e 2e 2e 2e 0a 20 20 20 20 20 20 20 20 2a 2a   .....        **
14f60 0a 20 20 20 20 20 20 20 20 2a 2a 20 48 65 6e 63  .        ** Henc
14f70 65 20 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28 70  e column_value(p
14f80 49 74 65 72 2d 3e 6e 43 6f 6c 2b 31 29 2e 0a 20  Iter->nCol+1).. 
14f90 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
14fa0 20 20 61 73 73 65 72 74 43 6f 6c 75 6d 6e 4e 61    assertColumnNa
14fb0 6d 65 28 70 49 74 65 72 2d 3e 70 53 65 6c 65 63  me(pIter->pSelec
14fc0 74 2c 20 70 49 74 65 72 2d 3e 6e 43 6f 6c 2b 31  t, pIter->nCol+1
14fd0 2c 20 22 72 62 75 5f 72 6f 77 69 64 22 29 3b 0a  , "rbu_rowid");.
14fe0 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20 73          pVal = s
14ff0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 76 61  qlite3_column_va
15000 6c 75 65 28 70 49 74 65 72 2d 3e 70 53 65 6c 65  lue(pIter->pSele
15010 63 74 2c 20 70 49 74 65 72 2d 3e 6e 43 6f 6c 2b  ct, pIter->nCol+
15020 31 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72  1);.        p->r
15030 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  c = sqlite3_bind
15040 5f 76 61 6c 75 65 28 70 57 72 69 74 65 72 2c 20  _value(pWriter, 
15050 70 49 74 65 72 2d 3e 6e 43 6f 6c 2b 31 2c 20 70  pIter->nCol+1, p
15060 56 61 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Val);.      }.  
15070 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
15080 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
15090 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70      sqlite3_step
150a0 28 70 57 72 69 74 65 72 29 3b 0a 20 20 20 20 20  (pWriter);.     
150b0 20 20 20 70 2d 3e 72 63 20 3d 20 72 65 73 65 74     p->rc = reset
150c0 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f 72 28  AndCollectError(
150d0 70 57 72 69 74 65 72 2c 20 26 70 2d 3e 7a 45 72  pWriter, &p->zEr
150e0 72 6d 73 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  rmsg);.      }. 
150f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15100 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
15110 56 61 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Val;.      sqlit
15120 65 33 5f 73 74 6d 74 20 2a 70 55 70 64 61 74 65  e3_stmt *pUpdate
15130 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65   = 0;.      asse
15140 72 74 28 20 65 54 79 70 65 3d 3d 52 42 55 5f 55  rt( eType==RBU_U
15150 50 44 41 54 45 20 29 3b 0a 20 20 20 20 20 20 72  PDATE );.      r
15160 62 75 47 65 74 55 70 64 61 74 65 53 74 6d 74 28  buGetUpdateStmt(
15170 70 2c 20 70 49 74 65 72 2c 20 7a 4d 61 73 6b 2c  p, pIter, zMask,
15180 20 26 70 55 70 64 61 74 65 29 3b 0a 20 20 20 20   &pUpdate);.    
15190 20 20 69 66 28 20 70 55 70 64 61 74 65 20 29 7b    if( pUpdate ){
151a0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
151b0 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ; p->rc==SQLITE_
151c0 4f 4b 20 26 26 20 69 3c 70 49 74 65 72 2d 3e 6e  OK && i<pIter->n
151d0 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
151e0 20 20 20 20 20 63 68 61 72 20 63 20 3d 20 7a 4d       char c = zM
151f0 61 73 6b 5b 70 49 74 65 72 2d 3e 61 69 53 72 63  ask[pIter->aiSrc
15200 4f 72 64 65 72 5b 69 5d 5d 3b 0a 20 20 20 20 20  Order[i]];.     
15210 20 20 20 20 20 70 56 61 6c 20 3d 20 73 71 6c 69       pVal = sqli
15220 74 65 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65  te3_column_value
15230 28 70 49 74 65 72 2d 3e 70 53 65 6c 65 63 74 2c  (pIter->pSelect,
15240 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69   i);.          i
15250 66 28 20 70 49 74 65 72 2d 3e 61 62 54 62 6c 50  f( pIter->abTblP
15260 6b 5b 69 5d 20 7c 7c 20 63 21 3d 27 2e 27 20 29  k[i] || c!='.' )
15270 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d  {.            p-
15280 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69  >rc = sqlite3_bi
15290 6e 64 5f 76 61 6c 75 65 28 70 55 70 64 61 74 65  nd_value(pUpdate
152a0 2c 20 69 2b 31 2c 20 70 56 61 6c 29 3b 0a 20 20  , i+1, pVal);.  
152b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
152c0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
152d0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
152e0 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70   .         && (p
152f0 49 74 65 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55  Iter->eType==RBU
15300 5f 50 4b 5f 56 54 41 42 20 7c 7c 20 70 49 74 65  _PK_VTAB || pIte
15310 72 2d 3e 65 54 79 70 65 3d 3d 52 42 55 5f 50 4b  r->eType==RBU_PK
15320 5f 4e 4f 4e 45 29 20 0a 20 20 20 20 20 20 20 20  _NONE) .        
15330 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
15340 42 69 6e 64 20 74 68 65 20 72 62 75 5f 72 6f 77  Bind the rbu_row
15350 69 64 20 76 61 6c 75 65 20 74 6f 20 63 6f 6c 75  id value to colu
15360 6d 6e 20 5f 72 6f 77 69 64 5f 20 2a 2f 0a 20 20  mn _rowid_ */.  
15370 20 20 20 20 20 20 20 20 61 73 73 65 72 74 43 6f          assertCo
15380 6c 75 6d 6e 4e 61 6d 65 28 70 49 74 65 72 2d 3e  lumnName(pIter->
15390 70 53 65 6c 65 63 74 2c 20 70 49 74 65 72 2d 3e  pSelect, pIter->
153a0 6e 43 6f 6c 2b 31 2c 20 22 72 62 75 5f 72 6f 77  nCol+1, "rbu_row
153b0 69 64 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  id");.          
153c0 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63  pVal = sqlite3_c
153d0 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28 70 49 74 65  olumn_value(pIte
153e0 72 2d 3e 70 53 65 6c 65 63 74 2c 20 70 49 74 65  r->pSelect, pIte
153f0 72 2d 3e 6e 43 6f 6c 2b 31 29 3b 0a 20 20 20 20  r->nCol+1);.    
15400 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71        p->rc = sq
15410 6c 69 74 65 33 5f 62 69 6e 64 5f 76 61 6c 75 65  lite3_bind_value
15420 28 70 55 70 64 61 74 65 2c 20 70 49 74 65 72 2d  (pUpdate, pIter-
15430 3e 6e 43 6f 6c 2b 31 2c 20 70 56 61 6c 29 3b 0a  >nCol+1, pVal);.
15440 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
15450 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
15460 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
15470 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70      sqlite3_step
15480 28 70 55 70 64 61 74 65 29 3b 0a 20 20 20 20 20  (pUpdate);.     
15490 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 65 73       p->rc = res
154a0 65 74 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72 6f  etAndCollectErro
154b0 72 28 70 55 70 64 61 74 65 2c 20 26 70 2d 3e 7a  r(pUpdate, &p->z
154c0 45 72 72 6d 73 67 29 3b 0a 20 20 20 20 20 20 20  Errmsg);.       
154d0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
154e0 0a 20 20 7d 0a 0a 20 73 74 65 70 5f 6f 75 74 3a  .  }.. step_out:
154f0 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 3b  .  return p->rc;
15500 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d  .}../*.** Increm
15510 65 6e 74 20 74 68 65 20 73 63 68 65 6d 61 20 63  ent the schema c
15520 6f 6f 6b 69 65 20 6f 66 20 74 68 65 20 6d 61 69  ookie of the mai
15530 6e 20 64 61 74 61 62 61 73 65 20 6f 70 65 6e 65  n database opene
15540 64 20 62 79 20 70 2d 3e 64 62 4d 61 69 6e 2e 0a  d by p->dbMain..
15550 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
15560 62 75 49 6e 63 72 53 63 68 65 6d 61 43 6f 6f 6b  buIncrSchemaCook
15570 69 65 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70  ie(sqlite3rbu *p
15580 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  ){.  if( p->rc==
15590 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
155a0 20 69 6e 74 20 69 43 6f 6f 6b 69 65 20 3d 20 31   int iCookie = 1
155b0 30 30 30 30 30 30 3b 0a 20 20 20 20 73 71 6c 69  000000;.    sqli
155c0 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
155d0 0a 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 70 72  ..    p->rc = pr
155e0 65 70 61 72 65 41 6e 64 43 6f 6c 6c 65 63 74 45  epareAndCollectE
155f0 72 72 6f 72 28 70 2d 3e 64 62 4d 61 69 6e 2c 20  rror(p->dbMain, 
15600 26 70 53 74 6d 74 2c 20 26 70 2d 3e 7a 45 72 72  &pStmt, &p->zErr
15610 6d 73 67 2c 20 0a 20 20 20 20 20 20 20 20 22 50  msg, .        "P
15620 52 41 47 4d 41 20 73 63 68 65 6d 61 5f 76 65 72  RAGMA schema_ver
15630 73 69 6f 6e 22 0a 20 20 20 20 29 3b 0a 20 20 20  sion".    );.   
15640 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
15650 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f  TE_OK ){.      /
15660 2a 20 43 6f 76 65 72 61 67 65 3a 20 69 74 20 6d  * Coverage: it m
15670 61 79 20 62 65 20 74 68 61 74 20 74 68 69 73 20  ay be that this 
15680 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 63  sqlite3_step() c
15690 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 54 68 65 72  annot fail. Ther
156a0 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 61 6c  e.      ** is al
156b0 72 65 61 64 79 20 61 20 74 72 61 6e 73 61 63 74  ready a transact
156c0 69 6f 6e 20 6f 70 65 6e 2c 20 73 6f 20 74 68 65  ion open, so the
156d0 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
156e0 65 6e 74 20 63 61 6e 6e 6f 74 0a 20 20 20 20 20  ent cannot.     
156f0 20 2a 2a 20 74 68 72 6f 77 20 61 6e 20 53 51 4c   ** throw an SQL
15700 49 54 45 5f 53 43 48 45 4d 41 20 65 78 63 65 70  ITE_SCHEMA excep
15710 74 69 6f 6e 2e 20 54 68 65 20 6f 6e 6c 79 20 64  tion. The only d
15720 61 74 61 62 61 73 65 20 70 61 67 65 20 74 68 65  atabase page the
15730 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d  .      ** statem
15740 65 6e 74 20 72 65 61 64 73 20 69 73 20 70 61 67  ent reads is pag
15750 65 20 31 2c 20 77 68 69 63 68 20 69 73 20 67 75  e 1, which is gu
15760 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 69  aranteed to be i
15770 6e 20 74 68 65 20 63 61 63 68 65 2e 0a 20 20 20  n the cache..   
15780 20 20 20 2a 2a 20 41 6e 64 20 6e 6f 20 6d 65 6d     ** And no mem
15790 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20  ory allocations 
157a0 61 72 65 20 72 65 71 75 69 72 65 64 2e 20 20 2a  are required.  *
157b0 2f 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49  /.      if( SQLI
157c0 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
157d0 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20  step(pStmt) ){. 
157e0 20 20 20 20 20 20 20 69 43 6f 6f 6b 69 65 20 3d         iCookie =
157f0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
15800 69 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20  int(pStmt, 0);. 
15810 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 62 75       }.      rbu
15820 46 69 6e 61 6c 69 7a 65 28 70 2c 20 70 53 74 6d  Finalize(p, pStm
15830 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  t);.    }.    if
15840 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
15850 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 62 75 4d  OK ){.      rbuM
15860 50 72 69 6e 74 66 45 78 65 63 28 70 2c 20 70 2d  PrintfExec(p, p-
15870 3e 64 62 4d 61 69 6e 2c 20 22 50 52 41 47 4d 41  >dbMain, "PRAGMA
15880 20 73 63 68 65 6d 61 5f 76 65 72 73 69 6f 6e 20   schema_version 
15890 3d 20 25 64 22 2c 20 69 43 6f 6f 6b 69 65 2b 31  = %d", iCookie+1
158a0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
158b0 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74 68 65  /*.** Update the
158c0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
158d0 20 72 62 75 5f 73 74 61 74 65 20 74 61 62 6c 65   rbu_state table
158e0 20 77 69 74 68 69 6e 20 74 68 65 20 72 62 75 20   within the rbu 
158f0 64 61 74 61 62 61 73 65 2e 20 54 68 65 0a 2a 2a  database. The.**
15900 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e   value stored in
15910 20 74 68 65 20 52 42 55 5f 53 54 41 54 45 5f 53   the RBU_STATE_S
15920 54 41 47 45 20 63 6f 6c 75 6d 6e 20 69 73 20 65  TAGE column is e
15930 53 74 61 67 65 2e 20 41 6c 6c 20 6f 74 68 65 72  Stage. All other
15940 20 76 61 6c 75 65 73 0a 2a 2a 20 61 72 65 20 64   values.** are d
15950 65 74 65 72 6d 69 6e 65 64 20 62 79 20 69 6e 73  etermined by ins
15960 70 65 63 74 69 6e 67 20 74 68 65 20 72 62 75 20  pecting the rbu 
15970 68 61 6e 64 6c 65 20 70 61 73 73 65 64 20 61 73  handle passed as
15980 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
15990 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ent..*/.static v
159a0 6f 69 64 20 72 62 75 53 61 76 65 53 74 61 74 65  oid rbuSaveState
159b0 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c 20  (sqlite3rbu *p, 
159c0 69 6e 74 20 65 53 74 61 67 65 29 7b 0a 20 20 69  int eStage){.  i
159d0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
159e0 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51  _OK || p->rc==SQ
159f0 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20  LITE_DONE ){.   
15a00 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
15a10 49 6e 73 65 72 74 20 3d 20 30 3b 0a 20 20 20 20  Insert = 0;.    
15a20 69 6e 74 20 72 63 3b 0a 0a 20 20 20 20 61 73 73  int rc;..    ass
15a30 65 72 74 28 20 70 2d 3e 7a 45 72 72 6d 73 67 3d  ert( p->zErrmsg=
15a40 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70  =0 );.    rc = p
15a50 72 65 70 61 72 65 46 72 65 65 41 6e 64 43 6f 6c  repareFreeAndCol
15a60 6c 65 63 74 45 72 72 6f 72 28 70 2d 3e 64 62 52  lectError(p->dbR
15a70 62 75 2c 20 26 70 49 6e 73 65 72 74 2c 20 26 70  bu, &pInsert, &p
15a80 2d 3e 7a 45 72 72 6d 73 67 2c 20 0a 20 20 20 20  ->zErrmsg, .    
15a90 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69      sqlite3_mpri
15aa0 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 22  ntf(.          "
15ab0 49 4e 53 45 52 54 20 4f 52 20 52 45 50 4c 41 43  INSERT OR REPLAC
15ac0 45 20 49 4e 54 4f 20 25 73 2e 72 62 75 5f 73 74  E INTO %s.rbu_st
15ad0 61 74 65 28 6b 2c 20 76 29 20 56 41 4c 55 45 53  ate(k, v) VALUES
15ae0 20 22 0a 20 20 20 20 20 20 20 20 20 20 22 28 25   ".          "(%
15af0 64 2c 20 25 64 29 2c 20 22 0a 20 20 20 20 20 20  d, %d), ".      
15b00 20 20 20 20 22 28 25 64 2c 20 25 51 29 2c 20 22      "(%d, %Q), "
15b10 0a 20 20 20 20 20 20 20 20 20 20 22 28 25 64 2c  .          "(%d,
15b20 20 25 51 29 2c 20 22 0a 20 20 20 20 20 20 20 20   %Q), ".        
15b30 20 20 22 28 25 64 2c 20 25 64 29 2c 20 22 0a 20    "(%d, %d), ". 
15b40 20 20 20 20 20 20 20 20 20 22 28 25 64 2c 20 25           "(%d, %
15b50 64 29 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20  d), ".          
15b60 22 28 25 64 2c 20 25 6c 6c 64 29 2c 20 22 0a 20  "(%d, %lld), ". 
15b70 20 20 20 20 20 20 20 20 20 22 28 25 64 2c 20 25           "(%d, %
15b80 6c 6c 64 29 2c 20 22 0a 20 20 20 20 20 20 20 20  lld), ".        
15b90 20 20 22 28 25 64 2c 20 25 6c 6c 64 29 20 22 2c    "(%d, %lld) ",
15ba0 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 53  .          p->zS
15bb0 74 61 74 65 44 62 2c 0a 20 20 20 20 20 20 20 20  tateDb,.        
15bc0 20 20 52 42 55 5f 53 54 41 54 45 5f 53 54 41 47    RBU_STATE_STAG
15bd0 45 2c 20 65 53 74 61 67 65 2c 0a 20 20 20 20 20  E, eStage,.     
15be0 20 20 20 20 20 52 42 55 5f 53 54 41 54 45 5f 54       RBU_STATE_T
15bf0 42 4c 2c 20 70 2d 3e 6f 62 6a 69 74 65 72 2e 7a  BL, p->objiter.z
15c00 54 62 6c 2c 20 0a 20 20 20 20 20 20 20 20 20 20  Tbl, .          
15c10 52 42 55 5f 53 54 41 54 45 5f 49 44 58 2c 20 70  RBU_STATE_IDX, p
15c20 2d 3e 6f 62 6a 69 74 65 72 2e 7a 49 64 78 2c 20  ->objiter.zIdx, 
15c30 0a 20 20 20 20 20 20 20 20 20 20 52 42 55 5f 53  .          RBU_S
15c40 54 41 54 45 5f 52 4f 57 2c 20 70 2d 3e 6e 53 74  TATE_ROW, p->nSt
15c50 65 70 2c 20 0a 20 20 20 20 20 20 20 20 20 20 52  ep, .          R
15c60 42 55 5f 53 54 41 54 45 5f 50 52 4f 47 52 45 53  BU_STATE_PROGRES
15c70 53 2c 20 70 2d 3e 6e 50 72 6f 67 72 65 73 73 2c  S, p->nProgress,
15c80 0a 20 20 20 20 20 20 20 20 20 20 52 42 55 5f 53  .          RBU_S
15c90 54 41 54 45 5f 43 4b 50 54 2c 20 70 2d 3e 69 57  TATE_CKPT, p->iW
15ca0 61 6c 43 6b 73 75 6d 2c 0a 20 20 20 20 20 20 20  alCksum,.       
15cb0 20 20 20 52 42 55 5f 53 54 41 54 45 5f 43 4f 4f     RBU_STATE_COO
15cc0 4b 49 45 2c 20 28 69 36 34 29 70 2d 3e 70 54 61  KIE, (i64)p->pTa
15cd0 72 67 65 74 46 64 2d 3e 69 43 6f 6f 6b 69 65 2c  rgetFd->iCookie,
15ce0 0a 20 20 20 20 20 20 20 20 20 20 52 42 55 5f 53  .          RBU_S
15cf0 54 41 54 45 5f 4f 41 4c 53 5a 2c 20 70 2d 3e 69  TATE_OALSZ, p->i
15d00 4f 61 6c 53 7a 0a 20 20 20 20 20 20 29 0a 20 20  OalSz.      ).  
15d10 20 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28    );.    assert(
15d20 20 70 49 6e 73 65 72 74 3d 3d 30 20 7c 7c 20 72   pInsert==0 || r
15d30 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
15d40 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
15d50 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
15d60 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 49 6e  sqlite3_step(pIn
15d70 73 65 72 74 29 3b 0a 20 20 20 20 20 20 72 63 20  sert);.      rc 
15d80 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69  = sqlite3_finali
15d90 7a 65 28 70 49 6e 73 65 72 74 29 3b 0a 20 20 20  ze(pInsert);.   
15da0 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
15db0 51 4c 49 54 45 5f 4f 4b 20 29 20 70 2d 3e 72 63  QLITE_OK ) p->rc
15dc0 20 3d 20 72 63 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f   = rc;.  }.}.../
15dd0 2a 0a 2a 2a 20 53 74 65 70 20 74 68 65 20 52 42  *.** Step the RB
15de0 55 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 69 6e 74  U object..*/.int
15df0 20 73 71 6c 69 74 65 33 72 62 75 5f 73 74 65 70   sqlite3rbu_step
15e00 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 29 7b  (sqlite3rbu *p){
15e10 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
15e20 73 77 69 74 63 68 28 20 70 2d 3e 65 53 74 61 67  switch( p->eStag
15e30 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20  e ){.      case 
15e40 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 3a 20 7b  RBU_STAGE_OAL: {
15e50 0a 20 20 20 20 20 20 20 20 52 62 75 4f 62 6a 49  .        RbuObjI
15e60 74 65 72 20 2a 70 49 74 65 72 20 3d 20 26 70 2d  ter *pIter = &p-
15e70 3e 6f 62 6a 69 74 65 72 3b 0a 20 20 20 20 20 20  >objiter;.      
15e80 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d    while( p->rc==
15e90 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 49 74  SQLITE_OK && pIt
15ea0 65 72 2d 3e 7a 54 62 6c 20 29 7b 0a 0a 20 20 20  er->zTbl ){..   
15eb0 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72         if( pIter
15ec0 2d 3e 62 43 6c 65 61 6e 75 70 20 29 7b 0a 20 20  ->bCleanup ){.  
15ed0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6c 65            /* Cle
15ee0 61 6e 20 75 70 20 74 68 65 20 72 62 75 5f 74 6d  an up the rbu_tm
15ef0 70 5f 78 78 78 20 74 61 62 6c 65 20 66 6f 72 20  p_xxx table for 
15f00 74 68 65 20 70 72 65 76 69 6f 75 73 20 74 61 62  the previous tab
15f10 6c 65 2e 20 49 74 20 0a 20 20 20 20 20 20 20 20  le. It .        
15f20 20 20 20 20 2a 2a 20 63 61 6e 6e 6f 74 20 62 65      ** cannot be
15f30 20 64 72 6f 70 70 65 64 20 61 73 20 74 68 65 72   dropped as ther
15f40 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20  e are currently 
15f50 61 63 74 69 76 65 20 53 51 4c 20 73 74 61 74 65  active SQL state
15f60 6d 65 6e 74 73 2e 0a 20 20 20 20 20 20 20 20 20  ments..         
15f70 20 20 20 2a 2a 20 42 75 74 20 74 68 65 20 63 6f     ** But the co
15f80 6e 74 65 6e 74 73 20 63 61 6e 20 62 65 20 64 65  ntents can be de
15f90 6c 65 74 65 64 2e 20 20 2a 2f 0a 20 20 20 20 20  leted.  */.     
15fa0 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72         if( pIter
15fb0 2d 3e 61 62 49 6e 64 65 78 65 64 20 29 7b 0a 20  ->abIndexed ){. 
15fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 62 75               rbu
15fd0 4d 50 72 69 6e 74 66 45 78 65 63 28 70 2c 20 70  MPrintfExec(p, p
15fe0 2d 3e 64 62 52 62 75 2c 20 0a 20 20 20 20 20 20  ->dbRbu, .      
15ff0 20 20 20 20 20 20 20 20 20 20 20 20 22 44 45 4c              "DEL
16000 45 54 45 20 46 52 4f 4d 20 25 73 2e 27 72 62 75  ETE FROM %s.'rbu
16010 5f 74 6d 70 5f 25 71 27 22 2c 20 70 2d 3e 7a 53  _tmp_%q'", p->zS
16020 74 61 74 65 44 62 2c 20 70 49 74 65 72 2d 3e 7a  tateDb, pIter->z
16030 44 61 74 61 54 62 6c 0a 20 20 20 20 20 20 20 20  DataTbl.        
16040 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
16050 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
16060 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
16070 20 20 20 20 72 62 75 4f 62 6a 49 74 65 72 50 72      rbuObjIterPr
16080 65 70 61 72 65 41 6c 6c 28 70 2c 20 70 49 74 65  epareAll(p, pIte
16090 72 2c 20 30 29 3b 0a 0a 20 20 20 20 20 20 20 20  r, 0);..        
160a0 20 20 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 74      /* Advance t
160b0 6f 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 74  o the next row t
160c0 6f 20 70 72 6f 63 65 73 73 2e 20 2a 2f 0a 20 20  o process. */.  
160d0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d            if( p-
160e0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
160f0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
16100 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
16110 5f 73 74 65 70 28 70 49 74 65 72 2d 3e 70 53 65  _step(pIter->pSe
16120 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20 20  lect);.         
16130 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
16140 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20  ITE_ROW ){.     
16150 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 50             p->nP
16160 72 6f 67 72 65 73 73 2b 2b 3b 0a 20 20 20 20 20  rogress++;.     
16170 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 53             p->nS
16180 74 65 70 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  tep++;.         
16190 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 62         return rb
161a0 75 53 74 65 70 28 70 29 3b 0a 20 20 20 20 20 20  uStep(p);.      
161b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
161c0 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
161d0 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 49  sqlite3_reset(pI
161e0 74 65 72 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20  ter->pSelect);. 
161f0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
16200 6e 53 74 65 70 20 3d 20 30 3b 0a 20 20 20 20 20  nStep = 0;.     
16210 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
16220 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20     }..          
16230 72 62 75 4f 62 6a 49 74 65 72 4e 65 78 74 28 70  rbuObjIterNext(p
16240 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20  , pIter);.      
16250 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28    }..        if(
16260 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
16270 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  K ){.          a
16280 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 7a 54  ssert( pIter->zT
16290 62 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  bl==0 );.       
162a0 20 20 20 72 62 75 53 61 76 65 53 74 61 74 65 28     rbuSaveState(
162b0 70 2c 20 52 42 55 5f 53 54 41 47 45 5f 4d 4f 56  p, RBU_STAGE_MOV
162c0 45 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 62  E);.          rb
162d0 75 49 6e 63 72 53 63 68 65 6d 61 43 6f 6f 6b 69  uIncrSchemaCooki
162e0 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(p);.          
162f0 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
16300 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
16310 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69      p->rc = sqli
16320 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 4d 61  te3_exec(p->dbMa
16330 69 6e 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c  in, "COMMIT", 0,
16340 20 30 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 29   0, &p->zErrmsg)
16350 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
16360 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72          if( p->r
16370 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
16380 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72              p->r
16390 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  c = sqlite3_exec
163a0 28 70 2d 3e 64 62 52 62 75 2c 20 22 43 4f 4d 4d  (p->dbRbu, "COMM
163b0 49 54 22 2c 20 30 2c 20 30 2c 20 26 70 2d 3e 7a  IT", 0, 0, &p->z
163c0 45 72 72 6d 73 67 29 3b 0a 20 20 20 20 20 20 20  Errmsg);.       
163d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
163e0 2d 3e 65 53 74 61 67 65 20 3d 20 52 42 55 5f 53  ->eStage = RBU_S
163f0 54 41 47 45 5f 4d 4f 56 45 3b 0a 20 20 20 20 20  TAGE_MOVE;.     
16400 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65     }.        bre
16410 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ak;.      }..   
16420 20 20 20 63 61 73 65 20 52 42 55 5f 53 54 41 47     case RBU_STAG
16430 45 5f 4d 4f 56 45 3a 20 7b 0a 20 20 20 20 20 20  E_MOVE: {.      
16440 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
16450 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
16460 20 20 20 20 72 62 75 4d 6f 76 65 4f 61 6c 46 69      rbuMoveOalFi
16470 6c 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20  le(p);.         
16480 20 70 2d 3e 6e 50 72 6f 67 72 65 73 73 2b 2b 3b   p->nProgress++;
16490 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
164a0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
164b0 7d 0a 0a 20 20 20 20 20 20 63 61 73 65 20 52 42  }..      case RB
164c0 55 5f 53 54 41 47 45 5f 43 4b 50 54 3a 20 7b 0a  U_STAGE_CKPT: {.
164d0 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72          if( p->r
164e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
164f0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d            if( p-
16500 3e 6e 53 74 65 70 3e 3d 70 2d 3e 6e 46 72 61 6d  >nStep>=p->nFram
16510 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
16520 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
16530 44 62 20 3d 20 70 2d 3e 70 54 61 72 67 65 74 46  Db = p->pTargetF
16540 64 2d 3e 70 52 65 61 6c 3b 0a 20 20 0a 20 20 20  d->pReal;.  .   
16550 20 20 20 20 20 20 20 20 20 2f 2a 20 53 79 6e 63           /* Sync
16560 20 74 68 65 20 64 62 20 66 69 6c 65 20 2a 2f 0a   the db file */.
16570 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72              p->r
16580 63 20 3d 20 70 44 62 2d 3e 70 4d 65 74 68 6f 64  c = pDb->pMethod
16590 73 2d 3e 78 53 79 6e 63 28 70 44 62 2c 20 53 51  s->xSync(pDb, SQ
165a0 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
165b0 29 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20  );.  .          
165c0 20 20 2f 2a 20 55 70 64 61 74 65 20 6e 42 61 63    /* Update nBac
165d0 6b 66 69 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 20  kfill */.       
165e0 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
165f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16600 20 20 20 20 20 20 20 20 20 20 20 76 6f 69 64 20             void 
16610 76 6f 6c 61 74 69 6c 65 20 2a 70 74 72 3b 0a 20  volatile *ptr;. 
16620 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
16630 72 63 20 3d 20 70 44 62 2d 3e 70 4d 65 74 68 6f  rc = pDb->pMetho
16640 64 73 2d 3e 78 53 68 6d 4d 61 70 28 70 44 62 2c  ds->xShmMap(pDb,
16650 20 30 2c 20 33 32 2a 31 30 32 34 2c 20 30 2c 20   0, 32*1024, 0, 
16660 26 70 74 72 29 3b 0a 20 20 20 20 20 20 20 20 20  &ptr);.         
16670 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
16680 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16690 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28 75               ((u
166a0 33 32 20 76 6f 6c 61 74 69 6c 65 2a 29 70 74 72  32 volatile*)ptr
166b0 29 5b 32 34 5d 20 3d 20 70 2d 3e 69 4d 61 78 46  )[24] = p->iMaxF
166c0 72 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20  rame;.          
166d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
166e0 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 20    }.  .         
166f0 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
16700 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
16710 20 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61           p->eSta
16720 67 65 20 3d 20 52 42 55 5f 53 54 41 47 45 5f 44  ge = RBU_STAGE_D
16730 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ONE;.           
16740 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
16750 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20  E_DONE;.        
16760 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
16770 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
16780 20 20 20 52 62 75 46 72 61 6d 65 20 2a 70 46 72     RbuFrame *pFr
16790 61 6d 65 20 3d 20 26 70 2d 3e 61 46 72 61 6d 65  ame = &p->aFrame
167a0 5b 70 2d 3e 6e 53 74 65 70 5d 3b 0a 20 20 20 20  [p->nStep];.    
167b0 20 20 20 20 20 20 20 20 72 62 75 43 68 65 63 6b          rbuCheck
167c0 70 6f 69 6e 74 46 72 61 6d 65 28 70 2c 20 70 46  pointFrame(p, pF
167d0 72 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  rame);.         
167e0 20 20 20 70 2d 3e 6e 53 74 65 70 2b 2b 3b 0a 20     p->nStep++;. 
167f0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
16800 20 20 20 20 20 70 2d 3e 6e 50 72 6f 67 72 65 73       p->nProgres
16810 73 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  s++;.        }. 
16820 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
16830 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 64 65 66      }..      def
16840 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 62 72  ault:.        br
16850 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  eak;.    }.    r
16860 65 74 75 72 6e 20 70 2d 3e 72 63 3b 0a 20 20 7d  eturn p->rc;.  }
16870 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
16880 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
16890 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65   }.}../*.** Free
168a0 20 61 6e 20 52 62 75 53 74 61 74 65 20 6f 62 6a   an RbuState obj
168b0 65 63 74 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  ect allocated by
168c0 20 72 62 75 4c 6f 61 64 53 74 61 74 65 28 29 2e   rbuLoadState().
168d0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
168e0 72 62 75 46 72 65 65 53 74 61 74 65 28 52 62 75  rbuFreeState(Rbu
168f0 53 74 61 74 65 20 2a 70 29 7b 0a 20 20 69 66 28  State *p){.  if(
16900 20 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   p ){.    sqlite
16910 33 5f 66 72 65 65 28 70 2d 3e 7a 54 62 6c 29 3b  3_free(p->zTbl);
16920 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
16930 65 28 70 2d 3e 7a 49 64 78 29 3b 0a 20 20 20 20  e(p->zIdx);.    
16940 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
16950 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  .  }.}../*.** Al
16960 6c 6f 63 61 74 65 20 61 6e 20 52 62 75 53 74 61  locate an RbuSta
16970 74 65 20 6f 62 6a 65 63 74 20 61 6e 64 20 6c 6f  te object and lo
16980 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ad the contents 
16990 6f 66 20 74 68 65 20 72 62 75 5f 73 74 61 74 65  of the rbu_state
169a0 20 0a 2a 2a 20 74 61 62 6c 65 20 69 6e 74 6f 20   .** table into 
169b0 69 74 2e 20 52 65 74 75 72 6e 20 61 20 70 6f 69  it. Return a poi
169c0 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 65 77 20  nter to the new 
169d0 6f 62 6a 65 63 74 2e 20 49 74 20 69 73 20 74 68  object. It is th
169e0 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62 69  e .** responsibi
169f0 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c  lity of the call
16a00 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79  er to eventually
16a10 20 66 72 65 65 20 74 68 65 20 6f 62 6a 65 63 74   free the object
16a20 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65   using.** sqlite
16a30 33 5f 66 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  3_free()..**.** 
16a40 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
16a50 72 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72  rs, leave an err
16a60 6f 72 20 63 6f 64 65 20 61 6e 64 20 6d 65 73 73  or code and mess
16a70 61 67 65 20 69 6e 20 74 68 65 20 72 62 75 20 68  age in the rbu h
16a80 61 6e 64 6c 65 0a 2a 2a 20 61 6e 64 20 72 65 74  andle.** and ret
16a90 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61  urn NULL..*/.sta
16aa0 74 69 63 20 52 62 75 53 74 61 74 65 20 2a 72 62  tic RbuState *rb
16ab0 75 4c 6f 61 64 53 74 61 74 65 28 73 71 6c 69 74  uLoadState(sqlit
16ac0 65 33 72 62 75 20 2a 70 29 7b 0a 20 20 52 62 75  e3rbu *p){.  Rbu
16ad0 53 74 61 74 65 20 2a 70 52 65 74 20 3d 20 30 3b  State *pRet = 0;
16ae0 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
16af0 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 69 6e  *pStmt = 0;.  in
16b00 74 20 72 63 3b 0a 20 20 69 6e 74 20 72 63 32 3b  t rc;.  int rc2;
16b10 0a 0a 20 20 70 52 65 74 20 3d 20 28 52 62 75 53  ..  pRet = (RbuS
16b20 74 61 74 65 2a 29 72 62 75 4d 61 6c 6c 6f 63 28  tate*)rbuMalloc(
16b30 70 2c 20 73 69 7a 65 6f 66 28 52 62 75 53 74 61  p, sizeof(RbuSta
16b40 74 65 29 29 3b 0a 20 20 69 66 28 20 70 52 65 74  te));.  if( pRet
16b50 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
16b60 0a 20 20 72 63 20 3d 20 70 72 65 70 61 72 65 46  .  rc = prepareF
16b70 72 65 65 41 6e 64 43 6f 6c 6c 65 63 74 45 72 72  reeAndCollectErr
16b80 6f 72 28 70 2d 3e 64 62 52 62 75 2c 20 26 70 53  or(p->dbRbu, &pS
16b90 74 6d 74 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67  tmt, &p->zErrmsg
16ba0 2c 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  , .      sqlite3
16bb0 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54  _mprintf("SELECT
16bc0 20 6b 2c 20 76 20 46 52 4f 4d 20 25 73 2e 72 62   k, v FROM %s.rb
16bd0 75 5f 73 74 61 74 65 22 2c 20 70 2d 3e 7a 53 74  u_state", p->zSt
16be0 61 74 65 44 62 29 0a 20 20 29 3b 0a 20 20 77 68  ateDb).  );.  wh
16bf0 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
16c00 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57  OK && SQLITE_ROW
16c10 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ==sqlite3_step(p
16c20 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 73 77 69  Stmt) ){.    swi
16c30 74 63 68 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c  tch( sqlite3_col
16c40 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30  umn_int(pStmt, 0
16c50 29 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20  ) ){.      case 
16c60 52 42 55 5f 53 54 41 54 45 5f 53 54 41 47 45 3a  RBU_STATE_STAGE:
16c70 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e 65  .        pRet->e
16c80 53 74 61 67 65 20 3d 20 73 71 6c 69 74 65 33 5f  Stage = sqlite3_
16c90 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74  column_int(pStmt
16ca0 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 1);.        if
16cb0 28 20 70 52 65 74 2d 3e 65 53 74 61 67 65 21 3d  ( pRet->eStage!=
16cc0 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 0a 20 20  RBU_STAGE_OAL.  
16cd0 20 20 20 20 20 20 20 26 26 20 70 52 65 74 2d 3e         && pRet->
16ce0 65 53 74 61 67 65 21 3d 52 42 55 5f 53 54 41 47  eStage!=RBU_STAG
16cf0 45 5f 4d 4f 56 45 0a 20 20 20 20 20 20 20 20 20  E_MOVE.         
16d00 26 26 20 70 52 65 74 2d 3e 65 53 74 61 67 65 21  && pRet->eStage!
16d10 3d 52 42 55 5f 53 54 41 47 45 5f 43 4b 50 54 0a  =RBU_STAGE_CKPT.
16d20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
16d30 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c       p->rc = SQL
16d40 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  ITE_CORRUPT;.   
16d50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62       }.        b
16d60 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73  reak;..      cas
16d70 65 20 52 42 55 5f 53 54 41 54 45 5f 54 42 4c 3a  e RBU_STATE_TBL:
16d80 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e 7a  .        pRet->z
16d90 54 62 6c 20 3d 20 72 62 75 53 74 72 6e 64 75 70  Tbl = rbuStrndup
16da0 28 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  ((char*)sqlite3_
16db0 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d  column_text(pStm
16dc0 74 2c 20 31 29 2c 20 26 72 63 29 3b 0a 20 20 20  t, 1), &rc);.   
16dd0 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
16de0 20 20 20 63 61 73 65 20 52 42 55 5f 53 54 41 54     case RBU_STAT
16df0 45 5f 49 44 58 3a 0a 20 20 20 20 20 20 20 20 70  E_IDX:.        p
16e00 52 65 74 2d 3e 7a 49 64 78 20 3d 20 72 62 75 53  Ret->zIdx = rbuS
16e10 74 72 6e 64 75 70 28 28 63 68 61 72 2a 29 73 71  trndup((char*)sq
16e20 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
16e30 74 28 70 53 74 6d 74 2c 20 31 29 2c 20 26 72 63  t(pStmt, 1), &rc
16e40 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
16e50 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20 52 42  ;..      case RB
16e60 55 5f 53 54 41 54 45 5f 52 4f 57 3a 0a 20 20 20  U_STATE_ROW:.   
16e70 20 20 20 20 20 70 52 65 74 2d 3e 6e 52 6f 77 20       pRet->nRow 
16e80 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
16e90 5f 69 6e 74 28 70 53 74 6d 74 2c 20 31 29 3b 0a  _int(pStmt, 1);.
16ea0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a          break;..
16eb0 20 20 20 20 20 20 63 61 73 65 20 52 42 55 5f 53        case RBU_S
16ec0 54 41 54 45 5f 50 52 4f 47 52 45 53 53 3a 0a 20  TATE_PROGRESS:. 
16ed0 20 20 20 20 20 20 20 70 52 65 74 2d 3e 6e 50 72         pRet->nPr
16ee0 6f 67 72 65 73 73 20 3d 20 73 71 6c 69 74 65 33  ogress = sqlite3
16ef0 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53  _column_int64(pS
16f00 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  tmt, 1);.       
16f10 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 63   break;..      c
16f20 61 73 65 20 52 42 55 5f 53 54 41 54 45 5f 43 4b  ase RBU_STATE_CK
16f30 50 54 3a 0a 20 20 20 20 20 20 20 20 70 52 65 74  PT:.        pRet
16f40 2d 3e 69 57 61 6c 43 6b 73 75 6d 20 3d 20 73 71  ->iWalCksum = sq
16f50 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
16f60 36 34 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20  64(pStmt, 1);.  
16f70 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
16f80 20 20 20 20 63 61 73 65 20 52 42 55 5f 53 54 41      case RBU_STA
16f90 54 45 5f 43 4f 4f 4b 49 45 3a 0a 20 20 20 20 20  TE_COOKIE:.     
16fa0 20 20 20 70 52 65 74 2d 3e 69 43 6f 6f 6b 69 65     pRet->iCookie
16fb0 20 3d 20 28 75 33 32 29 73 71 6c 69 74 65 33 5f   = (u32)sqlite3_
16fc0 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74  column_int64(pSt
16fd0 6d 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  mt, 1);.        
16fe0 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61  break;..      ca
16ff0 73 65 20 52 42 55 5f 53 54 41 54 45 5f 4f 41 4c  se RBU_STATE_OAL
17000 53 5a 3a 0a 20 20 20 20 20 20 20 20 70 52 65 74  SZ:.        pRet
17010 2d 3e 69 4f 61 6c 53 7a 20 3d 20 28 75 33 32 29  ->iOalSz = (u32)
17020 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
17030 6e 74 36 34 28 70 53 74 6d 74 2c 20 31 29 3b 0a  nt64(pStmt, 1);.
17040 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a          break;..
17050 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20        default:. 
17060 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
17070 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  TE_CORRUPT;.    
17080 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
17090 0a 20 20 7d 0a 20 20 72 63 32 20 3d 20 73 71 6c  .  }.  rc2 = sql
170a0 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
170b0 74 6d 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  tmt);.  if( rc==
170c0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d  SQLITE_OK ) rc =
170d0 20 72 63 32 3b 0a 0a 20 20 70 2d 3e 72 63 20 3d   rc2;..  p->rc =
170e0 20 72 63 3b 0a 20 20 72 65 74 75 72 6e 20 70 52   rc;.  return pR
170f0 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  et;.}../*.** Com
17100 70 61 72 65 20 73 74 72 69 6e 67 73 20 7a 31 20  pare strings z1 
17110 61 6e 64 20 7a 32 2c 20 72 65 74 75 72 6e 69 6e  and z2, returnin
17120 67 20 30 20 69 66 20 74 68 65 79 20 61 72 65 20  g 0 if they are 
17130 69 64 65 6e 74 69 63 61 6c 2c 20 6f 72 20 6e 6f  identical, or no
17140 6e 2d 7a 65 72 6f 0a 2a 2a 20 6f 74 68 65 72 77  n-zero.** otherw
17150 69 73 65 2e 20 45 69 74 68 65 72 20 6f 72 20 62  ise. Either or b
17160 6f 74 68 20 61 72 67 75 6d 65 6e 74 20 6d 61 79  oth argument may
17170 20 62 65 20 4e 55 4c 4c 2e 20 54 77 6f 20 4e 55   be NULL. Two NU
17180 4c 4c 20 76 61 6c 75 65 73 20 61 72 65 0a 2a 2a  LL values are.**
17190 20 63 6f 6e 73 69 64 65 72 65 64 20 65 71 75 61   considered equa
171a0 6c 2c 20 61 6e 64 20 4e 55 4c 4c 20 69 73 20 63  l, and NULL is c
171b0 6f 6e 73 69 64 65 72 65 64 20 64 69 73 74 69 6e  onsidered distin
171c0 63 74 20 66 72 6f 6d 20 61 6c 6c 20 6f 74 68 65  ct from all othe
171d0 72 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a 73 74 61  r values..*/.sta
171e0 74 69 63 20 69 6e 74 20 72 62 75 53 74 72 43 6f  tic int rbuStrCo
171f0 6d 70 61 72 65 28 63 6f 6e 73 74 20 63 68 61 72  mpare(const char
17200 20 2a 7a 31 2c 20 63 6f 6e 73 74 20 63 68 61 72   *z1, const char
17210 20 2a 7a 32 29 7b 0a 20 20 69 66 28 20 7a 31 3d   *z2){.  if( z1=
17220 3d 30 20 26 26 20 7a 32 3d 3d 30 20 29 20 72 65  =0 && z2==0 ) re
17230 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 7a 31  turn 0;.  if( z1
17240 3d 3d 30 20 7c 7c 20 7a 32 3d 3d 30 20 29 20 72  ==0 || z2==0 ) r
17250 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72  eturn 1;.  retur
17260 6e 20 28 73 71 6c 69 74 65 33 5f 73 74 72 69 63  n (sqlite3_stric
17270 6d 70 28 7a 31 2c 20 7a 32 29 21 3d 30 29 3b 0a  mp(z1, z2)!=0);.
17280 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
17290 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
172a0 20 61 73 20 70 61 72 74 20 6f 66 20 73 71 6c 69   as part of sqli
172b0 74 65 33 72 62 75 5f 6f 70 65 6e 28 29 20 77 68  te3rbu_open() wh
172c0 65 6e 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 0a  en initializing.
172d0 2a 2a 20 61 6e 20 72 62 75 20 68 61 6e 64 6c 65  ** an rbu handle
172e0 20 69 6e 20 4f 41 4c 20 73 74 61 67 65 2e 20 49   in OAL stage. I
172f0 66 20 74 68 65 20 72 62 75 20 75 70 64 61 74 65  f the rbu update
17300 20 68 61 73 20 6e 6f 74 20 73 74 61 72 74 65 64   has not started
17310 20 28 69 2e 65 2e 0a 2a 2a 20 74 68 65 20 72 62   (i.e..** the rb
17320 75 5f 73 74 61 74 65 20 74 61 62 6c 65 20 77 61  u_state table wa
17330 73 20 65 6d 70 74 79 29 20 69 74 20 69 73 20 61  s empty) it is a
17340 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73   no-op. Otherwis
17350 65 2c 20 69 74 20 61 72 72 61 6e 67 65 73 0a 2a  e, it arranges.*
17360 2a 20 74 68 69 6e 67 73 20 73 6f 20 74 68 61 74  * things so that
17370 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74   the next call t
17380 6f 20 73 71 6c 69 74 65 33 72 62 75 5f 73 74 65  o sqlite3rbu_ste
17390 70 28 29 20 63 6f 6e 74 69 6e 75 65 73 20 6f 6e  p() continues on
173a0 20 66 72 6f 6d 0a 2a 2a 20 77 68 65 72 65 20 74   from.** where t
173b0 68 65 20 70 72 65 76 69 6f 75 73 20 72 62 75 20  he previous rbu 
173c0 68 61 6e 64 6c 65 20 6c 65 66 74 20 6f 66 66 2e  handle left off.
173d0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
173e0 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72  or occurs, an er
173f0 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 65 72 72  ror code and err
17400 6f 72 20 6d 65 73 73 61 67 65 20 61 72 65 20 6c  or message are l
17410 65 66 74 20 69 6e 20 74 68 65 0a 2a 2a 20 72 62  eft in the.** rb
17420 75 20 68 61 6e 64 6c 65 20 70 61 73 73 65 64 20  u handle passed 
17430 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
17440 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ument..*/.static
17450 20 76 6f 69 64 20 72 62 75 53 65 74 75 70 4f 61   void rbuSetupOa
17460 6c 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c  l(sqlite3rbu *p,
17470 20 52 62 75 53 74 61 74 65 20 2a 70 53 74 61 74   RbuState *pStat
17480 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  e){.  assert( p-
17490 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
174a0 3b 0a 20 20 69 66 28 20 70 53 74 61 74 65 2d 3e  ;.  if( pState->
174b0 7a 54 62 6c 20 29 7b 0a 20 20 20 20 52 62 75 4f  zTbl ){.    RbuO
174c0 62 6a 49 74 65 72 20 2a 70 49 74 65 72 20 3d 20  bjIter *pIter = 
174d0 26 70 2d 3e 6f 62 6a 69 74 65 72 3b 0a 20 20 20  &p->objiter;.   
174e0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
174f0 5f 4f 4b 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28  _OK;..    while(
17500 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
17510 26 20 70 49 74 65 72 2d 3e 7a 54 62 6c 20 26 26  & pIter->zTbl &&
17520 20 28 70 49 74 65 72 2d 3e 62 43 6c 65 61 6e 75   (pIter->bCleanu
17530 70 20 0a 20 20 20 20 20 20 20 7c 7c 20 72 62 75  p .       || rbu
17540 53 74 72 43 6f 6d 70 61 72 65 28 70 49 74 65 72  StrCompare(pIter
17550 2d 3e 7a 49 64 78 2c 20 70 53 74 61 74 65 2d 3e  ->zIdx, pState->
17560 7a 49 64 78 29 0a 20 20 20 20 20 20 20 7c 7c 20  zIdx).       || 
17570 72 62 75 53 74 72 43 6f 6d 70 61 72 65 28 70 49  rbuStrCompare(pI
17580 74 65 72 2d 3e 7a 54 62 6c 2c 20 70 53 74 61 74  ter->zTbl, pStat
17590 65 2d 3e 7a 54 62 6c 29 20 0a 20 20 20 20 29 29  e->zTbl) .    ))
175a0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 62 75  {.      rc = rbu
175b0 4f 62 6a 49 74 65 72 4e 65 78 74 28 70 2c 20 70  ObjIterNext(p, p
175c0 49 74 65 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  Iter);.    }..  
175d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
175e0 5f 4f 4b 20 26 26 20 21 70 49 74 65 72 2d 3e 7a  _OK && !pIter->z
175f0 54 62 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Tbl ){.      rc 
17600 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
17610 20 20 20 20 20 20 70 2d 3e 7a 45 72 72 6d 73 67        p->zErrmsg
17620 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
17630 74 66 28 22 72 62 75 5f 73 74 61 74 65 20 6d 69  tf("rbu_state mi
17640 73 6d 61 74 63 68 20 65 72 72 6f 72 22 29 3b 0a  smatch error");.
17650 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72      }..    if( r
17660 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
17670 20 20 20 20 20 20 70 2d 3e 6e 53 74 65 70 20 3d        p->nStep =
17680 20 70 53 74 61 74 65 2d 3e 6e 52 6f 77 3b 0a 20   pState->nRow;. 
17690 20 20 20 20 20 72 63 20 3d 20 72 62 75 4f 62 6a       rc = rbuObj
176a0 49 74 65 72 50 72 65 70 61 72 65 41 6c 6c 28 70  IterPrepareAll(p
176b0 2c 20 26 70 2d 3e 6f 62 6a 69 74 65 72 2c 20 70  , &p->objiter, p
176c0 2d 3e 6e 53 74 65 70 29 3b 0a 20 20 20 20 7d 0a  ->nStep);.    }.
176d0 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b  .    p->rc = rc;
176e0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  .  }.}../*.** If
176f0 20 74 68 65 72 65 20 69 73 20 61 20 22 2a 2d 6f   there is a "*-o
17700 61 6c 22 20 66 69 6c 65 20 69 6e 20 74 68 65 20  al" file in the 
17710 66 69 6c 65 2d 73 79 73 74 65 6d 20 63 6f 72 72  file-system corr
17720 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65  esponding to the
17730 0a 2a 2a 20 74 61 72 67 65 74 20 64 61 74 61 62  .** target datab
17740 61 73 65 20 69 6e 20 74 68 65 20 66 69 6c 65 2d  ase in the file-
17750 73 79 73 74 65 6d 2c 20 64 65 6c 65 74 65 20 69  system, delete i
17760 74 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  t. If an error o
17770 63 63 75 72 73 2c 0a 2a 2a 20 6c 65 61 76 65 20  ccurs,.** leave 
17780 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e  an error code an
17790 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  d error message 
177a0 69 6e 20 74 68 65 20 72 62 75 20 68 61 6e 64 6c  in the rbu handl
177b0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
177c0 64 20 72 62 75 44 65 6c 65 74 65 4f 61 6c 46 69  d rbuDeleteOalFi
177d0 6c 65 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70  le(sqlite3rbu *p
177e0 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4f 61 6c 20  ){.  char *zOal 
177f0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
17800 66 28 22 25 73 2d 6f 61 6c 22 2c 20 70 2d 3e 7a  f("%s-oal", p->z
17810 54 61 72 67 65 74 29 3b 0a 20 20 61 73 73 65 72  Target);.  asser
17820 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  t( p->rc==SQLITE
17830 5f 4f 4b 20 26 26 20 70 2d 3e 7a 45 72 72 6d 73  _OK && p->zErrms
17840 67 3d 3d 30 20 29 3b 0a 20 20 75 6e 6c 69 6e 6b  g==0 );.  unlink
17850 28 7a 4f 61 6c 29 3b 0a 20 20 73 71 6c 69 74 65  (zOal);.  sqlite
17860 33 5f 66 72 65 65 28 7a 4f 61 6c 29 3b 0a 7d 0a  3_free(zOal);.}.
17870 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
17880 61 20 70 72 69 76 61 74 65 20 72 62 75 20 56 46  a private rbu VF
17890 53 20 66 6f 72 20 74 68 65 20 72 62 75 20 68 61  S for the rbu ha
178a0 6e 64 6c 65 20 70 61 73 73 65 64 20 61 73 20 74  ndle passed as t
178b0 68 65 20 6f 6e 6c 79 0a 2a 2a 20 61 72 67 75 6d  he only.** argum
178c0 65 6e 74 2e 20 54 68 69 73 20 56 46 53 20 77 69  ent. This VFS wi
178d0 6c 6c 20 62 65 20 75 73 65 64 20 75 6e 6c 65 73  ll be used unles
178e0 73 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71  s the call to sq
178f0 6c 69 74 65 33 72 62 75 5f 6f 70 65 6e 28 29 0a  lite3rbu_open().
17900 2a 2a 20 73 70 65 63 69 66 69 65 64 20 61 20 55  ** specified a U
17910 52 49 20 77 69 74 68 20 61 20 76 66 73 3d 3f 20  RI with a vfs=? 
17920 6f 70 74 69 6f 6e 20 69 6e 20 70 6c 61 63 65 20  option in place 
17930 6f 66 20 61 20 74 61 72 67 65 74 20 64 61 74 61  of a target data
17940 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 6e 61 6d  base.** file nam
17950 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
17960 64 20 72 62 75 43 72 65 61 74 65 56 66 73 28 73  d rbuCreateVfs(s
17970 71 6c 69 74 65 33 72 62 75 20 2a 70 29 7b 0a 20  qlite3rbu *p){. 
17980 20 69 6e 74 20 72 6e 64 3b 0a 20 20 63 68 61 72   int rnd;.  char
17990 20 7a 52 6e 64 5b 36 34 5d 3b 0a 0a 20 20 61 73   zRnd[64];..  as
179a0 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  sert( p->rc==SQL
179b0 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 73 71 6c 69  ITE_OK );.  sqli
179c0 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73  te3_randomness(s
179d0 69 7a 65 6f 66 28 69 6e 74 29 2c 20 28 76 6f 69  izeof(int), (voi
179e0 64 2a 29 26 72 6e 64 29 3b 0a 20 20 73 71 6c 69  d*)&rnd);.  sqli
179f0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
17a00 65 6f 66 28 7a 52 6e 64 29 2c 20 7a 52 6e 64 2c  eof(zRnd), zRnd,
17a10 20 22 72 62 75 5f 76 66 73 5f 25 64 22 2c 20 72   "rbu_vfs_%d", r
17a20 6e 64 29 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 73  nd);.  p->rc = s
17a30 71 6c 69 74 65 33 72 62 75 5f 63 72 65 61 74 65  qlite3rbu_create
17a40 5f 76 66 73 28 7a 52 6e 64 2c 20 30 29 3b 0a 20  _vfs(zRnd, 0);. 
17a50 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
17a60 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
17a70 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d  ite3_vfs *pVfs =
17a80 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e   sqlite3_vfs_fin
17a90 64 28 7a 52 6e 64 29 3b 0a 20 20 20 20 61 73 73  d(zRnd);.    ass
17aa0 65 72 74 28 20 70 56 66 73 20 29 3b 0a 20 20 20  ert( pVfs );.   
17ab0 20 70 2d 3e 7a 56 66 73 4e 61 6d 65 20 3d 20 70   p->zVfsName = p
17ac0 56 66 73 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a  Vfs->zName;.  }.
17ad0 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 74 72 6f 79  }../*.** Destroy
17ae0 20 74 68 65 20 70 72 69 76 61 74 65 20 56 46 53   the private VFS
17af0 20 63 72 65 61 74 65 64 20 66 6f 72 20 74 68 65   created for the
17b00 20 72 62 75 20 68 61 6e 64 6c 65 20 70 61 73 73   rbu handle pass
17b10 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 0a 2a  ed as the only.*
17b20 2a 20 61 72 67 75 6d 65 6e 74 20 62 79 20 61 6e  * argument by an
17b30 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f   earlier call to
17b40 20 72 62 75 43 72 65 61 74 65 56 66 73 28 29 2e   rbuCreateVfs().
17b50 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
17b60 72 62 75 44 65 6c 65 74 65 56 66 73 28 73 71 6c  rbuDeleteVfs(sql
17b70 69 74 65 33 72 62 75 20 2a 70 29 7b 0a 20 20 69  ite3rbu *p){.  i
17b80 66 28 20 70 2d 3e 7a 56 66 73 4e 61 6d 65 20 29  f( p->zVfsName )
17b90 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 72 62 75  {.    sqlite3rbu
17ba0 5f 64 65 73 74 72 6f 79 5f 76 66 73 28 70 2d 3e  _destroy_vfs(p->
17bb0 7a 56 66 73 4e 61 6d 65 29 3b 0a 20 20 20 20 70  zVfsName);.    p
17bc0 2d 3e 7a 56 66 73 4e 61 6d 65 20 3d 20 30 3b 0a  ->zVfsName = 0;.
17bd0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65    }.}../*.** Ope
17be0 6e 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 6e  n and return a n
17bf0 65 77 20 52 42 55 20 68 61 6e 64 6c 65 2e 20 0a  ew RBU handle. .
17c00 2a 2f 0a 73 71 6c 69 74 65 33 72 62 75 20 2a 73  */.sqlite3rbu *s
17c10 71 6c 69 74 65 33 72 62 75 5f 6f 70 65 6e 28 0a  qlite3rbu_open(.
17c20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
17c30 61 72 67 65 74 2c 20 0a 20 20 63 6f 6e 73 74 20  arget, .  const 
17c40 63 68 61 72 20 2a 7a 52 62 75 2c 0a 20 20 63 6f  char *zRbu,.  co
17c50 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 61 74 65  nst char *zState
17c60 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 72 62 75  .){.  sqlite3rbu
17c70 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 54 61 72 67   *p;.  int nTarg
17c80 65 74 20 3d 20 73 74 72 6c 65 6e 28 7a 54 61 72  et = strlen(zTar
17c90 67 65 74 29 3b 0a 20 20 69 6e 74 20 6e 52 62 75  get);.  int nRbu
17ca0 20 3d 20 73 74 72 6c 65 6e 28 7a 52 62 75 29 3b   = strlen(zRbu);
17cb0 0a 20 20 69 6e 74 20 6e 53 74 61 74 65 20 3d 20  .  int nState = 
17cc0 7a 53 74 61 74 65 20 3f 20 73 74 72 6c 65 6e 28  zState ? strlen(
17cd0 7a 53 74 61 74 65 29 20 3a 20 30 3b 0a 0a 20 20  zState) : 0;..  
17ce0 70 20 3d 20 28 73 71 6c 69 74 65 33 72 62 75 2a  p = (sqlite3rbu*
17cf0 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28  )sqlite3_malloc(
17d00 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 72 62  sizeof(sqlite3rb
17d10 75 29 2b 6e 54 61 72 67 65 74 2b 31 2b 6e 52 62  u)+nTarget+1+nRb
17d20 75 2b 31 2b 6e 53 74 61 74 65 2b 31 29 3b 0a 20  u+1+nState+1);. 
17d30 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 52 62   if( p ){.    Rb
17d40 75 53 74 61 74 65 20 2a 70 53 74 61 74 65 20 3d  uState *pState =
17d50 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61   0;..    /* Crea
17d60 74 65 20 74 68 65 20 63 75 73 74 6f 6d 20 56 46  te the custom VF
17d70 53 2e 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74  S. */.    memset
17d80 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 71  (p, 0, sizeof(sq
17d90 6c 69 74 65 33 72 62 75 29 29 3b 0a 20 20 20 20  lite3rbu));.    
17da0 72 62 75 43 72 65 61 74 65 56 66 73 28 70 29 3b  rbuCreateVfs(p);
17db0 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68  ..    /* Open th
17dc0 65 20 74 61 72 67 65 74 20 64 61 74 61 62 61 73  e target databas
17dd0 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e  e */.    if( p->
17de0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
17df0 0a 20 20 20 20 20 20 70 2d 3e 7a 54 61 72 67 65  .      p->zTarge
17e00 74 20 3d 20 28 63 68 61 72 2a 29 26 70 5b 31 5d  t = (char*)&p[1]
17e10 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  ;.      memcpy(p
17e20 2d 3e 7a 54 61 72 67 65 74 2c 20 7a 54 61 72 67  ->zTarget, zTarg
17e30 65 74 2c 20 6e 54 61 72 67 65 74 2b 31 29 3b 0a  et, nTarget+1);.
17e40 20 20 20 20 20 20 70 2d 3e 7a 52 62 75 20 3d 20        p->zRbu = 
17e50 26 70 2d 3e 7a 54 61 72 67 65 74 5b 6e 54 61 72  &p->zTarget[nTar
17e60 67 65 74 2b 31 5d 3b 0a 20 20 20 20 20 20 6d 65  get+1];.      me
17e70 6d 63 70 79 28 70 2d 3e 7a 52 62 75 2c 20 7a 52  mcpy(p->zRbu, zR
17e80 62 75 2c 20 6e 52 62 75 2b 31 29 3b 0a 20 20 20  bu, nRbu+1);.   
17e90 20 20 20 69 66 28 20 7a 53 74 61 74 65 20 29 7b     if( zState ){
17ea0 0a 20 20 20 20 20 20 20 20 70 2d 3e 7a 53 74 61  .        p->zSta
17eb0 74 65 20 3d 20 26 70 2d 3e 7a 52 62 75 5b 6e 52  te = &p->zRbu[nR
17ec0 62 75 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 6d  bu+1];.        m
17ed0 65 6d 63 70 79 28 70 2d 3e 7a 53 74 61 74 65 2c  emcpy(p->zState,
17ee0 20 7a 53 74 61 74 65 2c 20 6e 53 74 61 74 65 2b   zState, nState+
17ef0 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1);.      }.    
17f00 20 20 72 62 75 4f 70 65 6e 44 61 74 61 62 61 73    rbuOpenDatabas
17f10 65 28 70 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  e(p);.    }..   
17f20 20 2f 2a 20 49 66 20 69 74 20 68 61 73 20 6e 6f   /* If it has no
17f30 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63  t already been c
17f40 72 65 61 74 65 64 2c 20 63 72 65 61 74 65 20 74  reated, create t
17f50 68 65 20 72 62 75 5f 73 74 61 74 65 20 74 61 62  he rbu_state tab
17f60 6c 65 20 2a 2f 0a 20 20 20 20 72 62 75 4d 50 72  le */.    rbuMPr
17f70 69 6e 74 66 45 78 65 63 28 70 2c 20 70 2d 3e 64  intfExec(p, p->d
17f80 62 52 62 75 2c 20 52 42 55 5f 43 52 45 41 54 45  bRbu, RBU_CREATE
17f90 5f 53 54 41 54 45 2c 20 70 2d 3e 7a 53 74 61 74  _STATE, p->zStat
17fa0 65 44 62 29 3b 0a 0a 20 20 20 20 69 66 28 20 70  eDb);..    if( p
17fb0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
17fc0 29 7b 0a 20 20 20 20 20 20 70 53 74 61 74 65 20  ){.      pState 
17fd0 3d 20 72 62 75 4c 6f 61 64 53 74 61 74 65 28 70  = rbuLoadState(p
17fe0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
17ff0 20 70 53 74 61 74 65 20 7c 7c 20 70 2d 3e 72 63   pState || p->rc
18000 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
18010 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
18020 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 0a 20 20  SQLITE_OK ){..  
18030 20 20 20 20 20 20 69 66 28 20 70 53 74 61 74 65        if( pState
18040 2d 3e 65 53 74 61 67 65 3d 3d 30 20 29 7b 20 0a  ->eStage==0 ){ .
18050 20 20 20 20 20 20 20 20 20 20 72 62 75 44 65 6c            rbuDel
18060 65 74 65 4f 61 6c 46 69 6c 65 28 70 29 3b 0a 20  eteOalFile(p);. 
18070 20 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61           p->eSta
18080 67 65 20 3d 20 52 42 55 5f 53 54 41 47 45 5f 4f  ge = RBU_STAGE_O
18090 41 4c 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  AL;.        }els
180a0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  e{.          p->
180b0 65 53 74 61 67 65 20 3d 20 70 53 74 61 74 65 2d  eStage = pState-
180c0 3e 65 53 74 61 67 65 3b 0a 20 20 20 20 20 20 20  >eStage;.       
180d0 20 7d 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 50   }.        p->nP
180e0 72 6f 67 72 65 73 73 20 3d 20 70 53 74 61 74 65  rogress = pState
180f0 2d 3e 6e 50 72 6f 67 72 65 73 73 3b 0a 20 20 20  ->nProgress;.   
18100 20 20 20 20 20 70 2d 3e 69 4f 61 6c 53 7a 20 3d       p->iOalSz =
18110 20 70 53 74 61 74 65 2d 3e 69 4f 61 6c 53 7a 3b   pState->iOalSz;
18120 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
18130 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63     assert( p->rc
18140 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  !=SQLITE_OK || p
18150 2d 3e 65 53 74 61 67 65 21 3d 30 20 29 3b 0a 0a  ->eStage!=0 );..
18160 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
18170 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 70  QLITE_OK && p->p
18180 54 61 72 67 65 74 46 64 2d 3e 70 57 61 6c 46 64  TargetFd->pWalFd
18190 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   ){.      if( p-
181a0 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41  >eStage==RBU_STA
181b0 47 45 5f 4f 41 4c 20 29 7b 0a 20 20 20 20 20 20  GE_OAL ){.      
181c0 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
181d0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
181e0 70 2d 3e 7a 45 72 72 6d 73 67 20 3d 20 73 71 6c  p->zErrmsg = sql
181f0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 63 61  ite3_mprintf("ca
18200 6e 6e 6f 74 20 75 70 64 61 74 65 20 77 61 6c 20  nnot update wal 
18210 6d 6f 64 65 20 64 61 74 61 62 61 73 65 22 29 3b  mode database");
18220 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
18230 20 70 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f   p->eStage==RBU_
18240 53 54 41 47 45 5f 4d 4f 56 45 20 29 7b 0a 20 20  STAGE_MOVE ){.  
18250 20 20 20 20 20 20 70 2d 3e 65 53 74 61 67 65 20        p->eStage 
18260 3d 20 52 42 55 5f 53 54 41 47 45 5f 43 4b 50 54  = RBU_STAGE_CKPT
18270 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 74  ;.        p->nSt
18280 65 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ep = 0;.      }.
18290 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70      }..    if( p
182a0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a  ->rc==SQLITE_OK.
182b0 20 20 20 20 20 26 26 20 28 70 2d 3e 65 53 74 61       && (p->eSta
182c0 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4f 41  ge==RBU_STAGE_OA
182d0 4c 20 7c 7c 20 70 2d 3e 65 53 74 61 67 65 3d 3d  L || p->eStage==
182e0 52 42 55 5f 53 54 41 47 45 5f 4d 4f 56 45 29 0a  RBU_STAGE_MOVE).
182f0 20 20 20 20 20 26 26 20 70 53 74 61 74 65 2d 3e       && pState->
18300 65 53 74 61 67 65 21 3d 30 20 26 26 20 70 2d 3e  eStage!=0 && p->
18310 70 54 61 72 67 65 74 46 64 2d 3e 69 43 6f 6f 6b  pTargetFd->iCook
18320 69 65 21 3d 70 53 74 61 74 65 2d 3e 69 43 6f 6f  ie!=pState->iCoo
18330 6b 69 65 0a 20 20 20 20 29 7b 20 20 20 0a 20 20  kie.    ){   .  
18340 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
18350 6f 69 6e 74 20 28 70 54 61 72 67 65 74 46 64 2d  oint (pTargetFd-
18360 3e 69 43 6f 6f 6b 69 65 29 20 63 6f 6e 74 61 69  >iCookie) contai
18370 6e 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ns the value of 
18380 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 68 61  the.      ** cha
18390 6e 67 65 2d 63 6f 75 6e 74 65 72 20 63 6f 6f 6b  nge-counter cook
183a0 69 65 20 28 74 68 65 20 74 68 69 6e 67 20 74 68  ie (the thing th
183b0 61 74 20 67 65 74 73 20 69 6e 63 72 65 6d 65 6e  at gets incremen
183c0 74 65 64 20 77 68 65 6e 20 61 20 0a 20 20 20 20  ted when a .    
183d0 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
183e0 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 20 69 6e   is committed in
183f0 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 29 20   rollback mode) 
18400 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64  currently stored
18410 20 6f 6e 20 0a 20 20 20 20 20 20 2a 2a 20 70 61   on .      ** pa
18420 67 65 20 31 20 6f 66 20 74 68 65 20 64 61 74 61  ge 1 of the data
18430 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  base file. */.  
18440 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
18450 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 70  TE_BUSY;.      p
18460 2d 3e 7a 45 72 72 6d 73 67 20 3d 20 73 71 6c 69  ->zErrmsg = sqli
18470 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 64 61 74  te3_mprintf("dat
18480 61 62 61 73 65 20 6d 6f 64 69 66 69 65 64 20 64  abase modified d
18490 75 72 69 6e 67 20 72 62 75 20 75 70 64 61 74 65  uring rbu update
184a0 22 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  ");.    }..    i
184b0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
184c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  _OK ){.      if(
184d0 20 70 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f   p->eStage==RBU_
184e0 53 54 41 47 45 5f 4f 41 4c 20 29 7b 0a 0a 20 20  STAGE_OAL ){..  
184f0 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 72        /* Open tr
18500 61 6e 73 61 63 74 69 6f 6e 73 20 62 6f 74 68 20  ansactions both 
18510 64 61 74 61 62 61 73 65 73 2e 20 54 68 65 20 2a  databases. The *
18520 2d 6f 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  -oal file is ope
18530 6e 65 64 20 6f 72 0a 20 20 20 20 20 20 20 20 2a  ned or.        *
18540 2a 20 63 72 65 61 74 65 64 20 61 74 20 74 68 69  * created at thi
18550 73 20 70 6f 69 6e 74 2e 20 2a 2f 0a 20 20 20 20  s point. */.    
18560 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69      p->rc = sqli
18570 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 4d 61  te3_exec(p->dbMa
18580 69 6e 2c 20 22 42 45 47 49 4e 20 49 4d 4d 45 44  in, "BEGIN IMMED
18590 49 41 54 45 22 2c 20 30 2c 20 30 2c 20 26 70 2d  IATE", 0, 0, &p-
185a0 3e 7a 45 72 72 6d 73 67 29 3b 0a 20 20 20 20 20  >zErrmsg);.     
185b0 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
185c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
185d0 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c       p->rc = sql
185e0 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 52  ite3_exec(p->dbR
185f0 62 75 2c 20 22 42 45 47 49 4e 20 49 4d 4d 45 44  bu, "BEGIN IMMED
18600 49 41 54 45 22 2c 20 30 2c 20 30 2c 20 26 70 2d  IATE", 0, 0, &p-
18610 3e 7a 45 72 72 6d 73 67 29 3b 0a 20 20 20 20 20  >zErrmsg);.     
18620 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20     }.  .        
18630 2f 2a 20 50 6f 69 6e 74 20 74 68 65 20 6f 62 6a  /* Point the obj
18640 65 63 74 20 69 74 65 72 61 74 6f 72 20 61 74 20  ect iterator at 
18650 74 68 65 20 66 69 72 73 74 20 6f 62 6a 65 63 74  the first object
18660 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
18670 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
18680 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   ){.          p-
18690 3e 72 63 20 3d 20 72 62 75 4f 62 6a 49 74 65 72  >rc = rbuObjIter
186a0 46 69 72 73 74 28 70 2c 20 26 70 2d 3e 6f 62 6a  First(p, &p->obj
186b0 69 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  iter);.        }
186c0 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  ..        /* If 
186d0 74 68 65 20 52 42 55 20 64 61 74 61 62 61 73 65  the RBU database
186e0 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74   contains no dat
186f0 61 5f 78 78 78 20 74 61 62 6c 65 73 2c 20 64 65  a_xxx tables, de
18700 63 6c 61 72 65 20 74 68 65 20 52 42 55 0a 20 20  clare the RBU.  
18710 20 20 20 20 20 20 2a 2a 20 75 70 64 61 74 65 20        ** update 
18720 66 69 6e 69 73 68 65 64 2e 20 20 2a 2f 0a 20 20  finished.  */.  
18730 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
18740 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d  =SQLITE_OK && p-
18750 3e 6f 62 6a 69 74 65 72 2e 7a 54 62 6c 3d 3d 30  >objiter.zTbl==0
18760 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   ){.          p-
18770 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e  >rc = SQLITE_DON
18780 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  E;.        }..  
18790 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
187a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
187b0 20 20 20 20 20 20 20 20 72 62 75 53 65 74 75 70          rbuSetup
187c0 4f 61 6c 28 70 2c 20 70 53 74 61 74 65 29 3b 0a  Oal(p, pState);.
187d0 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
187e0 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 65 53   }else if( p->eS
187f0 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f  tage==RBU_STAGE_
18800 4d 4f 56 45 20 29 7b 0a 20 20 20 20 20 20 20 20  MOVE ){.        
18810 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20  /* no-op */.    
18820 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 65    }else if( p->e
18830 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45  Stage==RBU_STAGE
18840 5f 43 4b 50 54 20 29 7b 0a 20 20 20 20 20 20 20  _CKPT ){.       
18850 20 72 62 75 53 65 74 75 70 43 68 65 63 6b 70 6f   rbuSetupCheckpo
18860 69 6e 74 28 70 2c 20 70 53 74 61 74 65 29 3b 0a  int(p, pState);.
18870 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
18880 70 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53  p->eStage==RBU_S
18890 54 41 47 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20  TAGE_DONE ){.   
188a0 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c       p->rc = SQL
188b0 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20  ITE_DONE;.      
188c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
188d0 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f  ->rc = SQLITE_CO
188e0 52 52 55 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20  RRUPT;.      }. 
188f0 20 20 20 7d 0a 0a 20 20 20 20 72 62 75 46 72 65     }..    rbuFre
18900 65 53 74 61 74 65 28 70 53 74 61 74 65 29 3b 0a  eState(pState);.
18910 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 3b    }..  return p;
18920 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  .}.../*.** Retur
18930 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  n the database h
18940 61 6e 64 6c 65 20 75 73 65 64 20 62 79 20 70 52  andle used by pR
18950 62 75 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20 2a  bu..*/.sqlite3 *
18960 73 71 6c 69 74 65 33 72 62 75 5f 64 62 28 73 71  sqlite3rbu_db(sq
18970 6c 69 74 65 33 72 62 75 20 2a 70 52 62 75 2c 20  lite3rbu *pRbu, 
18980 69 6e 74 20 62 52 62 75 29 7b 0a 20 20 73 71 6c  int bRbu){.  sql
18990 69 74 65 33 20 2a 64 62 20 3d 20 30 3b 0a 20 20  ite3 *db = 0;.  
189a0 69 66 28 20 70 52 62 75 20 29 7b 0a 20 20 20 20  if( pRbu ){.    
189b0 64 62 20 3d 20 28 62 52 62 75 20 3f 20 70 52 62  db = (bRbu ? pRb
189c0 75 2d 3e 64 62 52 62 75 20 3a 20 70 52 62 75 2d  u->dbRbu : pRbu-
189d0 3e 64 62 4d 61 69 6e 29 3b 0a 20 20 7d 0a 20 20  >dbMain);.  }.  
189e0 72 65 74 75 72 6e 20 64 62 3b 0a 7d 0a 0a 0a 2f  return db;.}.../
189f0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 72 72 6f  *.** If the erro
18a00 72 20 63 6f 64 65 20 63 75 72 72 65 6e 74 6c 79  r code currently
18a10 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 52   stored in the R
18a20 42 55 20 68 61 6e 64 6c 65 20 69 73 20 53 51 4c  BU handle is SQL
18a30 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 0a  ITE_CONSTRAINT,.
18a40 2a 2a 20 74 68 65 6e 20 65 64 69 74 20 61 6e 79  ** then edit any
18a50 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 73   error message s
18a60 74 72 69 6e 67 20 73 6f 20 61 73 20 74 6f 20 72  tring so as to r
18a70 65 6d 6f 76 65 20 61 6c 6c 20 6f 63 63 75 72 72  emove all occurr
18a80 65 6e 63 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20  ences of.** the 
18a90 70 61 74 74 65 72 6e 20 22 72 62 75 5f 69 6d 70  pattern "rbu_imp
18aa0 5f 5b 30 2d 39 5d 2a 22 2e 0a 2a 2f 0a 73 74 61  _[0-9]*"..*/.sta
18ab0 74 69 63 20 76 6f 69 64 20 72 62 75 45 64 69 74  tic void rbuEdit
18ac0 45 72 72 6d 73 67 28 73 71 6c 69 74 65 33 72 62  Errmsg(sqlite3rb
18ad0 75 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  u *p){.  if( p->
18ae0 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54  rc==SQLITE_CONST
18af0 52 41 49 4e 54 20 26 26 20 70 2d 3e 7a 45 72 72  RAINT && p->zErr
18b00 6d 73 67 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  msg ){.    int i
18b10 3b 0a 20 20 20 20 69 6e 74 20 6e 45 72 72 6d 73  ;.    int nErrms
18b20 67 20 3d 20 73 74 72 6c 65 6e 28 70 2d 3e 7a 45  g = strlen(p->zE
18b30 72 72 6d 73 67 29 3b 0a 20 20 20 20 66 6f 72 28  rrmsg);.    for(
18b40 69 3d 30 3b 20 69 3c 28 6e 45 72 72 6d 73 67 2d  i=0; i<(nErrmsg-
18b50 38 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  8); i++){.      
18b60 69 66 28 20 6d 65 6d 63 6d 70 28 26 70 2d 3e 7a  if( memcmp(&p->z
18b70 45 72 72 6d 73 67 5b 69 5d 2c 20 22 72 62 75 5f  Errmsg[i], "rbu_
18b80 69 6d 70 5f 22 2c 20 38 29 3d 3d 30 20 29 7b 0a  imp_", 8)==0 ){.
18b90 20 20 20 20 20 20 20 20 69 6e 74 20 6e 44 65 6c          int nDel
18ba0 20 3d 20 38 3b 0a 20 20 20 20 20 20 20 20 77 68   = 8;.        wh
18bb0 69 6c 65 28 20 70 2d 3e 7a 45 72 72 6d 73 67 5b  ile( p->zErrmsg[
18bc0 69 2b 6e 44 65 6c 5d 3e 3d 27 30 27 20 26 26 20  i+nDel]>='0' && 
18bd0 70 2d 3e 7a 45 72 72 6d 73 67 5b 69 2b 6e 44 65  p->zErrmsg[i+nDe
18be0 6c 5d 3c 3d 27 39 27 20 29 20 6e 44 65 6c 2b 2b  l]<='9' ) nDel++
18bf0 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 6d 6f 76  ;.        memmov
18c00 65 28 26 70 2d 3e 7a 45 72 72 6d 73 67 5b 69 5d  e(&p->zErrmsg[i]
18c10 2c 20 26 70 2d 3e 7a 45 72 72 6d 73 67 5b 69 2b  , &p->zErrmsg[i+
18c20 6e 44 65 6c 5d 2c 20 6e 45 72 72 6d 73 67 20 2b  nDel], nErrmsg +
18c30 20 31 20 2d 20 69 20 2d 20 6e 44 65 6c 29 3b 0a   1 - i - nDel);.
18c40 20 20 20 20 20 20 20 20 6e 45 72 72 6d 73 67 20          nErrmsg 
18c50 2d 3d 20 6e 44 65 6c 3b 0a 20 20 20 20 20 20 7d  -= nDel;.      }
18c60 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
18c70 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 52 42  .** Close the RB
18c80 55 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74  U handle..*/.int
18c90 20 73 71 6c 69 74 65 33 72 62 75 5f 63 6c 6f 73   sqlite3rbu_clos
18ca0 65 28 73 71 6c 69 74 65 33 72 62 75 20 2a 70 2c  e(sqlite3rbu *p,
18cb0 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 6d 73 67   char **pzErrmsg
18cc0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
18cd0 66 28 20 70 20 29 7b 0a 0a 20 20 20 20 2f 2a 20  f( p ){..    /* 
18ce0 43 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73  Commit the trans
18cf0 61 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 2a 2d  action to the *-
18d00 6f 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  oal file. */.   
18d10 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
18d20 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 65 53 74 61  TE_OK && p->eSta
18d30 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4f 41  ge==RBU_STAGE_OA
18d40 4c 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63  L ){.      p->rc
18d50 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28   = sqlite3_exec(
18d60 70 2d 3e 64 62 4d 61 69 6e 2c 20 22 43 4f 4d 4d  p->dbMain, "COMM
18d70 49 54 22 2c 20 30 2c 20 30 2c 20 26 70 2d 3e 7a  IT", 0, 0, &p->z
18d80 45 72 72 6d 73 67 29 3b 0a 20 20 20 20 7d 0a 0a  Errmsg);.    }..
18d90 20 20 20 20 72 62 75 53 61 76 65 53 74 61 74 65      rbuSaveState
18da0 28 70 2c 20 70 2d 3e 65 53 74 61 67 65 29 3b 0a  (p, p->eStage);.
18db0 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  .    if( p->rc==
18dc0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e  SQLITE_OK && p->
18dd0 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47  eStage==RBU_STAG
18de0 45 5f 4f 41 4c 20 29 7b 0a 20 20 20 20 20 20 70  E_OAL ){.      p
18df0 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65  ->rc = sqlite3_e
18e00 78 65 63 28 70 2d 3e 64 62 52 62 75 2c 20 22 43  xec(p->dbRbu, "C
18e10 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 2c 20 26 70  OMMIT", 0, 0, &p
18e20 2d 3e 7a 45 72 72 6d 73 67 29 3b 0a 20 20 20 20  ->zErrmsg);.    
18e30 7d 0a 0a 20 20 20 20 2f 2a 20 43 6c 6f 73 65 20  }..    /* Close 
18e40 61 6e 79 20 6f 70 65 6e 20 73 74 61 74 65 6d 65  any open stateme
18e50 6e 74 20 68 61 6e 64 6c 65 73 2e 20 2a 2f 0a 20  nt handles. */. 
18e60 20 20 20 72 62 75 4f 62 6a 49 74 65 72 46 69 6e     rbuObjIterFin
18e70 61 6c 69 7a 65 28 26 70 2d 3e 6f 62 6a 69 74 65  alize(&p->objite
18e80 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6c 6f 73  r);..    /* Clos
18e90 65 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62  e the open datab
18ea0 61 73 65 20 68 61 6e 64 6c 65 20 61 6e 64 20 56  ase handle and V
18eb0 46 53 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20  FS object. */.  
18ec0 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28    sqlite3_close(
18ed0 70 2d 3e 64 62 4d 61 69 6e 29 3b 0a 20 20 20 20  p->dbMain);.    
18ee0 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 2d  sqlite3_close(p-
18ef0 3e 64 62 52 62 75 29 3b 0a 20 20 20 20 72 62 75  >dbRbu);.    rbu
18f00 44 65 6c 65 74 65 56 66 73 28 70 29 3b 0a 20 20  DeleteVfs(p);.  
18f10 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
18f20 2d 3e 61 42 75 66 29 3b 0a 20 20 20 20 73 71 6c  ->aBuf);.    sql
18f30 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 46 72  ite3_free(p->aFr
18f40 61 6d 65 29 3b 0a 0a 20 20 20 20 72 62 75 45 64  ame);..    rbuEd
18f50 69 74 45 72 72 6d 73 67 28 70 29 3b 0a 20 20 20  itErrmsg(p);.   
18f60 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 20   rc = p->rc;.   
18f70 20 2a 70 7a 45 72 72 6d 73 67 20 3d 20 70 2d 3e   *pzErrmsg = p->
18f80 7a 45 72 72 6d 73 67 3b 0a 20 20 20 20 73 71 6c  zErrmsg;.    sql
18f90 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
18fa0 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
18fb0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
18fc0 20 20 2a 70 7a 45 72 72 6d 73 67 20 3d 20 30 3b    *pzErrmsg = 0;
18fd0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
18fe0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
18ff0 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  n the total numb
19000 65 72 20 6f 66 20 6b 65 79 2d 76 61 6c 75 65 20  er of key-value 
19010 6f 70 65 72 61 74 69 6f 6e 73 20 28 69 6e 73 65  operations (inse
19020 72 74 73 2c 20 64 65 6c 65 74 65 73 20 6f 72 20  rts, deletes or 
19030 0a 2a 2a 20 75 70 64 61 74 65 73 29 20 74 68 61  .** updates) tha
19040 74 20 68 61 76 65 20 62 65 65 6e 20 70 65 72 66  t have been perf
19050 6f 72 6d 65 64 20 6f 6e 20 74 68 65 20 74 61 72  ormed on the tar
19060 67 65 74 20 64 61 74 61 62 61 73 65 20 73 69 6e  get database sin
19070 63 65 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e  ce the.** curren
19080 74 20 52 42 55 20 75 70 64 61 74 65 20 77 61 73  t RBU update was
19090 20 73 74 61 72 74 65 64 2e 0a 2a 2f 0a 73 71 6c   started..*/.sql
190a0 69 74 65 33 5f 69 6e 74 36 34 20 73 71 6c 69 74  ite3_int64 sqlit
190b0 65 33 72 62 75 5f 70 72 6f 67 72 65 73 73 28 73  e3rbu_progress(s
190c0 71 6c 69 74 65 33 72 62 75 20 2a 70 52 62 75 29  qlite3rbu *pRbu)
190d0 7b 0a 20 20 72 65 74 75 72 6e 20 70 52 62 75 2d  {.  return pRbu-
190e0 3e 6e 50 72 6f 67 72 65 73 73 3b 0a 7d 0a 0a 2f  >nProgress;.}../
190f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19100 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19110 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
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 0a 2a 2a 20 42 65  **********.** Be
19140 67 69 6e 6e 69 6e 67 20 6f 66 20 52 42 55 20 56  ginning of RBU V
19150 46 53 20 73 68 69 6d 20 6d 65 74 68 6f 64 73 2e  FS shim methods.
19160 20 54 68 65 20 56 46 53 20 73 68 69 6d 20 6d 6f   The VFS shim mo
19170 64 69 66 69 65 73 20 74 68 65 20 62 65 68 61 76  difies the behav
19180 69 6f 75 72 0a 2a 2a 20 6f 66 20 61 20 73 74 61  iour.** of a sta
19190 6e 64 61 72 64 20 56 46 53 20 69 6e 20 74 68 65  ndard VFS in the
191a0 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 61 79 73 3a   following ways:
191b0 0a 2a 2a 0a 2a 2a 20 31 2e 20 57 68 65 6e 65 76  .**.** 1. Whenev
191c0 65 72 20 74 68 65 20 66 69 72 73 74 20 70 61 67  er the first pag
191d0 65 20 6f 66 20 61 20 6d 61 69 6e 20 64 61 74 61  e of a main data
191e0 62 61 73 65 20 66 69 6c 65 20 69 73 20 72 65 61  base file is rea
191f0 64 20 6f 72 20 0a 2a 2a 20 20 20 20 77 72 69 74  d or .**    writ
19200 74 65 6e 2c 20 74 68 65 20 76 61 6c 75 65 20 6f  ten, the value o
19210 66 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  f the change-cou
19220 6e 74 65 72 20 63 6f 6f 6b 69 65 20 69 73 20 73  nter cookie is s
19230 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 20 20 20 72  tored in.**    r
19240 62 75 5f 66 69 6c 65 2e 69 43 6f 6f 6b 69 65 2e  bu_file.iCookie.
19250 20 53 69 6d 69 6c 61 72 6c 79 2c 20 74 68 65 20   Similarly, the 
19260 76 61 6c 75 65 20 6f 66 20 74 68 65 20 22 77 72  value of the "wr
19270 69 74 65 2d 76 65 72 73 69 6f 6e 22 0a 2a 2a 20  ite-version".** 
19280 20 20 20 64 61 74 61 62 61 73 65 20 68 65 61 64     database head
19290 65 72 20 66 69 65 6c 64 20 69 73 20 73 74 6f 72  er field is stor
192a0 65 64 20 69 6e 20 72 62 75 5f 66 69 6c 65 2e 69  ed in rbu_file.i
192b0 57 72 69 74 65 56 65 72 2e 20 54 68 69 73 20 65  WriteVer. This e
192c0 6e 73 75 72 65 73 0a 2a 2a 20 20 20 20 74 68 61  nsures.**    tha
192d0 74 20 74 68 65 20 76 61 6c 75 65 73 20 61 72 65  t the values are
192e0 20 61 6c 77 61 79 73 20 74 72 75 73 74 77 6f 72   always trustwor
192f0 74 68 79 20 77 69 74 68 69 6e 20 61 6e 20 6f 70  thy within an op
19300 65 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  en transaction..
19310 2a 2a 0a 2a 2a 20 32 2e 20 57 68 65 6e 65 76 65  **.** 2. Wheneve
19320 72 20 61 6e 20 53 51 4c 49 54 45 5f 4f 50 45 4e  r an SQLITE_OPEN
19330 5f 57 41 4c 20 66 69 6c 65 20 69 73 20 6f 70 65  _WAL file is ope
19340 6e 65 64 2c 20 74 68 65 20 28 72 62 75 5f 66 69  ned, the (rbu_fi
19350 6c 65 2e 70 57 61 6c 46 64 29 0a 2a 2a 20 20 20  le.pWalFd).**   
19360 20 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c 65   member variable
19370 20 6f 66 20 74 68 65 20 61 73 73 6f 63 69 61 74   of the associat
19380 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ed database file
19390 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 73   descriptor is s
193a0 65 74 0a 2a 2a 20 20 20 20 74 6f 20 70 6f 69 6e  et.**    to poin
193b0 74 20 74 6f 20 74 68 65 20 6e 65 77 20 66 69 6c  t to the new fil
193c0 65 2e 20 41 20 6d 75 74 65 78 20 70 72 6f 74 65  e. A mutex prote
193d0 63 74 65 64 20 6c 69 6e 6b 65 64 20 6c 69 73 74  cted linked list
193e0 20 6f 66 20 61 6c 6c 20 6d 61 69 6e 20 0a 2a 2a   of all main .**
193f0 20 20 20 20 64 62 20 66 64 73 20 6f 70 65 6e 65      db fds opene
19400 64 20 75 73 69 6e 67 20 61 20 70 61 72 74 69 63  d using a partic
19410 75 6c 61 72 20 52 42 55 20 56 46 53 20 69 73 20  ular RBU VFS is 
19420 6d 61 69 6e 74 61 69 6e 65 64 20 61 74 20 0a 2a  maintained at .*
19430 2a 20 20 20 20 72 62 75 5f 76 66 73 2e 70 4d 61  *    rbu_vfs.pMa
19440 69 6e 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65  in to facilitate
19450 20 74 68 69 73 2e 0a 2a 2a 0a 2a 2a 20 33 2e 20   this..**.** 3. 
19460 55 73 69 6e 67 20 61 20 6e 65 77 20 66 69 6c 65  Using a new file
19470 2d 63 6f 6e 74 72 6f 6c 20 22 53 51 4c 49 54 45  -control "SQLITE
19480 5f 46 43 4e 54 4c 5f 52 42 55 22 2c 20 61 20 6d  _FCNTL_RBU", a m
19490 61 69 6e 20 64 62 20 72 62 75 5f 66 69 6c 65 20  ain db rbu_file 
194a0 0a 2a 2a 20 20 20 20 6f 62 6a 65 63 74 20 63 61  .**    object ca
194b0 6e 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20 74  n be marked as t
194c0 68 65 20 74 61 72 67 65 74 20 64 61 74 61 62 61  he target databa
194d0 73 65 20 6f 66 20 61 6e 20 52 42 55 20 75 70 64  se of an RBU upd
194e0 61 74 65 2e 20 54 68 69 73 0a 2a 2a 20 20 20 20  ate. This.**    
194f0 74 75 72 6e 73 20 6f 6e 20 74 68 65 20 66 6f 6c  turns on the fol
19500 6c 6f 77 69 6e 67 20 65 78 74 72 61 20 73 70 65  lowing extra spe
19510 63 69 61 6c 20 62 65 68 61 76 69 6f 75 72 3a 0a  cial behaviour:.
19520 2a 2a 0a 2a 2a 20 33 61 2e 20 49 66 20 78 41 63  **.** 3a. If xAc
19530 63 65 73 73 28 29 20 69 73 20 63 61 6c 6c 65 64  cess() is called
19540 20 74 6f 20 63 68 65 63 6b 20 69 66 20 74 68 65   to check if the
19550 72 65 20 65 78 69 73 74 73 20 61 20 2a 2d 77 61  re exists a *-wa
19560 6c 20 66 69 6c 65 20 0a 2a 2a 20 20 20 20 20 61  l file .**     a
19570 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61  ssociated with a
19580 6e 20 52 42 55 20 74 61 72 67 65 74 20 64 61 74  n RBU target dat
19590 61 62 61 73 65 20 63 75 72 72 65 6e 74 6c 79 20  abase currently 
195a0 69 6e 20 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c  in RBU_STAGE_OAL
195b0 0a 2a 2a 20 20 20 20 20 73 74 61 67 65 20 28 70  .**     stage (p
195c0 72 65 70 61 72 69 6e 67 20 74 68 65 20 2a 2d 6f  reparing the *-o
195d0 61 6c 20 66 69 6c 65 29 2c 20 74 68 65 20 66 6f  al file), the fo
195e0 6c 6c 6f 77 69 6e 67 20 73 70 65 63 69 61 6c 20  llowing special 
195f0 68 61 6e 64 6c 69 6e 67 0a 2a 2a 20 20 20 20 20  handling.**     
19600 61 70 70 6c 69 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  applies:.**.**  
19610 20 20 20 20 2a 20 69 66 20 74 68 65 20 2a 2d 77      * if the *-w
19620 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 65 78 69  al file does exi
19630 73 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  st, return SQLIT
19640 45 5f 43 41 4e 54 4f 50 45 4e 2e 20 41 6e 20 52  E_CANTOPEN. An R
19650 42 55 0a 2a 2a 20 20 20 20 20 20 20 20 74 61 72  BU.**        tar
19660 67 65 74 20 64 61 74 61 62 61 73 65 20 6d 61 79  get database may
19670 20 6e 6f 74 20 62 65 20 69 6e 20 77 61 6c 20 6d   not be in wal m
19680 6f 64 65 20 61 6c 72 65 61 64 79 2e 0a 2a 2a 0a  ode already..**.
19690 2a 2a 20 20 20 20 20 20 2a 20 69 66 20 74 68 65  **      * if the
196a0 20 2a 2d 77 61 6c 20 66 69 6c 65 20 64 6f 65 73   *-wal file does
196b0 20 6e 6f 74 20 65 78 69 73 74 2c 20 73 65 74 20   not exist, set 
196c0 74 68 65 20 6f 75 74 70 75 74 20 70 61 72 61 6d  the output param
196d0 65 74 65 72 20 74 6f 0a 2a 2a 20 20 20 20 20 20  eter to.**      
196e0 20 20 6e 6f 6e 2d 7a 65 72 6f 20 28 74 6f 20 74    non-zero (to t
196f0 65 6c 6c 20 53 51 4c 69 74 65 20 74 68 61 74 20  ell SQLite that 
19700 69 74 20 64 6f 65 73 20 65 78 69 73 74 29 20 61  it does exist) a
19710 6e 79 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  nyway..**.**    
19720 20 54 68 65 6e 2c 20 77 68 65 6e 20 78 4f 70 65   Then, when xOpe
19730 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  n() is called to
19740 20 6f 70 65 6e 20 74 68 65 20 2a 2d 77 61 6c 20   open the *-wal 
19750 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20  file associated 
19760 77 69 74 68 0a 2a 2a 20 20 20 20 20 74 68 65 20  with.**     the 
19770 52 42 55 20 74 61 72 67 65 74 20 69 6e 20 52 42  RBU target in RB
19780 55 5f 53 54 41 47 45 5f 4f 41 4c 20 73 74 61 67  U_STAGE_OAL stag
19790 65 2c 20 69 6e 73 74 65 61 64 20 6f 66 20 6f 70  e, instead of op
197a0 65 6e 69 6e 67 20 74 68 65 20 2a 2d 77 61 6c 0a  ening the *-wal.
197b0 2a 2a 20 20 20 20 20 66 69 6c 65 2c 20 74 68 65  **     file, the
197c0 20 72 62 75 20 76 66 73 20 6f 70 65 6e 73 20 74   rbu vfs opens t
197d0 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
197e0 20 2a 2d 6f 61 6c 20 66 69 6c 65 20 69 6e 73 74   *-oal file inst
197f0 65 61 64 2e 20 0a 2a 2a 0a 2a 2a 20 33 62 2e 20  ead. .**.** 3b. 
19800 54 68 65 20 2a 2d 73 68 6d 20 70 61 67 65 73 20  The *-shm pages 
19810 72 65 74 75 72 6e 65 64 20 62 79 20 78 53 68 6d  returned by xShm
19820 4d 61 70 28 29 20 66 6f 72 20 61 20 74 61 72 67  Map() for a targ
19830 65 74 20 64 62 20 66 69 6c 65 20 69 6e 0a 2a 2a  et db file in.**
19840 20 20 20 20 20 52 42 55 5f 53 54 41 47 45 5f 4f       RBU_STAGE_O
19850 41 4c 20 6d 6f 64 65 20 61 72 65 20 61 63 74 75  AL mode are actu
19860 61 6c 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 68  ally stored in h
19870 65 61 70 20 6d 65 6d 6f 72 79 2e 20 54 68 69 73  eap memory. This
19880 20 69 73 20 74 6f 0a 2a 2a 20 20 20 20 20 61 76   is to.**     av
19890 6f 69 64 20 63 72 65 61 74 69 6e 67 20 61 20 2a  oid creating a *
198a0 2d 73 68 6d 20 66 69 6c 65 20 6f 6e 20 64 69 73  -shm file on dis
198b0 6b 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c  k. Additionally,
198c0 20 78 53 68 6d 4c 6f 63 6b 28 29 20 63 61 6c 6c   xShmLock() call
198d0 73 0a 2a 2a 20 20 20 20 20 61 72 65 20 6e 6f 2d  s.**     are no-
198e0 6f 70 73 20 6f 6e 20 74 61 72 67 65 74 20 64 61  ops on target da
198f0 74 61 62 61 73 65 20 66 69 6c 65 73 20 69 6e 20  tabase files in 
19900 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20 6d 6f  RBU_STAGE_OAL mo
19910 64 65 2e 20 54 68 69 73 20 69 73 0a 2a 2a 20 20  de. This is.**  
19920 20 20 20 62 65 63 61 75 73 65 20 61 73 73 65 72     because asser
19930 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 69  t() statements i
19940 6e 20 73 6f 6d 65 20 56 46 53 20 69 6d 70 6c 65  n some VFS imple
19950 6d 65 6e 74 61 74 69 6f 6e 73 20 66 61 69 6c 20  mentations fail 
19960 69 66 20 0a 2a 2a 20 20 20 20 20 78 53 68 6d 4c  if .**     xShmL
19970 6f 63 6b 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ock() is called 
19980 62 65 66 6f 72 65 20 78 53 68 6d 4d 61 70 28 29  before xShmMap()
19990 2e 0a 2a 2a 0a 2a 2a 20 33 63 2e 20 49 66 20 61  ..**.** 3c. If a
199a0 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
199b0 20 69 73 20 61 74 74 65 6d 70 74 65 64 20 6f 6e   is attempted on
199c0 20 61 20 74 61 72 67 65 74 20 64 61 74 61 62 61   a target databa
199d0 73 65 20 66 69 6c 65 20 69 6e 20 61 6e 79 0a 2a  se file in any.*
199e0 2a 20 20 20 20 20 6d 6f 64 65 20 65 78 63 65 70  *     mode excep
199f0 74 20 52 42 55 5f 53 54 41 47 45 5f 44 4f 4e 45  t RBU_STAGE_DONE
19a00 20 28 61 6c 6c 20 77 6f 72 6b 20 63 6f 6d 70 6c   (all work compl
19a10 65 74 65 64 20 61 6e 64 20 63 68 65 63 6b 70 6f  eted and checkpo
19a20 69 6e 74 65 64 29 2c 20 69 74 20 0a 2a 2a 20 20  inted), it .**  
19a30 20 20 20 66 61 69 6c 73 20 77 69 74 68 20 61 6e     fails with an
19a40 20 53 51 4c 49 54 45 5f 42 55 53 59 20 65 72 72   SQLITE_BUSY err
19a50 6f 72 2e 20 54 68 69 73 20 69 73 20 74 6f 20 73  or. This is to s
19a60 74 6f 70 20 52 42 55 20 63 6f 6e 6e 65 63 74 69  top RBU connecti
19a70 6f 6e 73 0a 2a 2a 20 20 20 20 20 66 72 6f 6d 20  ons.**     from 
19a80 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 68  automatically ch
19a90 65 63 6b 70 6f 69 6e 74 69 6e 67 20 61 20 2a 2d  eckpointing a *-
19aa0 77 61 6c 20 28 6f 72 20 2a 2d 6f 61 6c 29 20 66  wal (or *-oal) f
19ab0 69 6c 65 20 66 72 6f 6d 20 77 69 74 68 69 6e 0a  ile from within.
19ac0 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63  **     sqlite3_c
19ad0 6c 6f 73 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 33 64  lose()..**.** 3d
19ae0 2e 20 49 6e 20 52 42 55 5f 53 54 41 47 45 5f 43  . In RBU_STAGE_C
19af0 41 50 54 55 52 45 20 6d 6f 64 65 2c 20 61 6c 6c  APTURE mode, all
19b00 20 78 52 65 61 64 28 29 20 63 61 6c 6c 73 20 6f   xRead() calls o
19b10 6e 20 74 68 65 20 77 61 6c 20 66 69 6c 65 2c 20  n the wal file, 
19b20 61 6e 64 0a 2a 2a 20 20 20 20 20 61 6c 6c 20 78  and.**     all x
19b30 57 72 69 74 65 28 29 20 63 61 6c 6c 73 20 6f 6e  Write() calls on
19b40 20 74 68 65 20 74 61 72 67 65 74 20 64 61 74 61   the target data
19b50 62 61 73 65 20 66 69 6c 65 20 70 65 72 66 6f 72  base file perfor
19b60 6d 20 6e 6f 20 49 4f 2e 20 0a 2a 2a 20 20 20 20  m no IO. .**    
19b70 20 49 6e 73 74 65 61 64 20 74 68 65 20 66 72 61   Instead the fra
19b80 6d 65 20 61 6e 64 20 70 61 67 65 20 6e 75 6d 62  me and page numb
19b90 65 72 73 20 74 68 61 74 20 77 6f 75 6c 64 20 62  ers that would b
19ba0 65 20 72 65 61 64 20 61 6e 64 20 77 72 69 74 74  e read and writt
19bb0 65 6e 0a 2a 2a 20 20 20 20 20 61 72 65 20 72 65  en.**     are re
19bc0 63 6f 72 64 65 64 2e 20 41 64 64 69 74 69 6f 6e  corded. Addition
19bd0 61 6c 6c 79 2c 20 73 75 63 63 65 73 73 66 75 6c  ally, successful
19be0 20 61 74 74 65 6d 70 74 73 20 74 6f 20 6f 62 74   attempts to obt
19bf0 61 69 6e 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a  ain exclusive.**
19c00 20 20 20 20 20 78 53 68 6d 4c 6f 63 6b 28 29 20       xShmLock() 
19c10 57 52 49 54 45 52 2c 20 43 48 45 43 4b 50 4f 49  WRITER, CHECKPOI
19c20 4e 54 45 52 20 61 6e 64 20 52 45 41 44 30 20 6c  NTER and READ0 l
19c30 6f 63 6b 73 20 6f 6e 20 74 68 65 20 74 61 72 67  ocks on the targ
19c40 65 74 20 0a 2a 2a 20 20 20 20 20 64 61 74 61 62  et .**     datab
19c50 61 73 65 20 66 69 6c 65 20 61 72 65 20 72 65 63  ase file are rec
19c60 6f 72 64 65 64 2e 20 78 53 68 6d 4c 6f 63 6b 28  orded. xShmLock(
19c70 29 20 63 61 6c 6c 73 20 74 6f 20 75 6e 6c 6f 63  ) calls to unloc
19c80 6b 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 20 20  k the same.**   
19c90 20 20 6c 6f 63 6b 73 20 61 72 65 20 6e 6f 2d 6f    locks are no-o
19ca0 70 73 20 28 73 6f 20 74 68 61 74 20 6f 6e 63 65  ps (so that once
19cb0 20 6f 62 74 61 69 6e 65 64 2c 20 74 68 65 73 65   obtained, these
19cc0 20 6c 6f 63 6b 73 20 61 72 65 20 6e 65 76 65 72   locks are never
19cd0 0a 2a 2a 20 20 20 20 20 72 65 6c 69 6e 71 75 69  .**     relinqui
19ce0 73 68 65 64 29 2e 20 46 69 6e 61 6c 6c 79 2c 20  shed). Finally, 
19cf0 63 61 6c 6c 73 20 74 6f 20 78 53 79 6e 63 28 29  calls to xSync()
19d00 20 6f 6e 20 74 68 65 20 74 61 72 67 65 74 20 64   on the target d
19d10 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 66  atabase.**     f
19d20 69 6c 65 20 66 61 69 6c 20 77 69 74 68 20 53 51  ile fail with SQ
19d30 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c 20 65 72  LITE_INTERNAL er
19d40 72 6f 72 73 2e 0a 2a 2f 0a 0a 73 74 61 74 69 63  rors..*/..static
19d50 20 76 6f 69 64 20 72 62 75 55 6e 6c 6f 63 6b 53   void rbuUnlockS
19d60 68 6d 28 72 62 75 5f 66 69 6c 65 20 2a 70 29 7b  hm(rbu_file *p){
19d70 0a 20 20 69 66 28 20 70 2d 3e 70 52 62 75 20 29  .  if( p->pRbu )
19d80 7b 0a 20 20 20 20 69 6e 74 20 28 2a 78 53 68 6d  {.    int (*xShm
19d90 4c 6f 63 6b 29 28 73 71 6c 69 74 65 33 5f 66 69  Lock)(sqlite3_fi
19da0 6c 65 2a 2c 69 6e 74 2c 69 6e 74 2c 69 6e 74 29  le*,int,int,int)
19db0 20 3d 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65   = p->pReal->pMe
19dc0 74 68 6f 64 73 2d 3e 78 53 68 6d 4c 6f 63 6b 3b  thods->xShmLock;
19dd0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
19de0 66 6f 72 28 69 3d 30 3b 20 69 3c 53 51 4c 49 54  for(i=0; i<SQLIT
19df0 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 3b 69 2b 2b 29  E_SHM_NLOCK;i++)
19e00 7b 0a 20 20 20 20 20 20 69 66 28 20 28 31 3c 3c  {.      if( (1<<
19e10 69 29 20 26 20 70 2d 3e 70 52 62 75 2d 3e 6d 4c  i) & p->pRbu->mL
19e20 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 78  ock ){.        x
19e30 53 68 6d 4c 6f 63 6b 28 70 2d 3e 70 52 65 61 6c  ShmLock(p->pReal
19e40 2c 20 69 2c 20 31 2c 20 53 51 4c 49 54 45 5f 53  , i, 1, SQLITE_S
19e50 48 4d 5f 55 4e 4c 4f 43 4b 7c 53 51 4c 49 54 45  HM_UNLOCK|SQLITE
19e60 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 3b  _SHM_EXCLUSIVE);
19e70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
19e80 20 20 20 70 2d 3e 70 52 62 75 2d 3e 6d 4c 6f 63     p->pRbu->mLoc
19e90 6b 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  k = 0;.  }.}../*
19ea0 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 72 62 75  .** Close an rbu
19eb0 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
19ec0 20 69 6e 74 20 72 62 75 56 66 73 43 6c 6f 73 65   int rbuVfsClose
19ed0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70  (sqlite3_file *p
19ee0 46 69 6c 65 29 7b 0a 20 20 72 62 75 5f 66 69 6c  File){.  rbu_fil
19ef0 65 20 2a 70 20 3d 20 28 72 62 75 5f 66 69 6c 65  e *p = (rbu_file
19f00 2a 29 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20 72  *)pFile;.  int r
19f10 63 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f  c;.  int i;..  /
19f20 2a 20 46 72 65 65 20 74 68 65 20 63 6f 6e 74 65  * Free the conte
19f30 6e 74 73 20 6f 66 20 74 68 65 20 61 70 53 68 6d  nts of the apShm
19f40 5b 5d 20 61 72 72 61 79 2e 20 41 6e 64 20 74 68  [] array. And th
19f50 65 20 61 72 72 61 79 20 69 74 73 65 6c 66 2e 20  e array itself. 
19f60 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
19f70 70 2d 3e 6e 53 68 6d 3b 20 69 2b 2b 29 7b 0a 20  p->nShm; i++){. 
19f80 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
19f90 70 2d 3e 61 70 53 68 6d 5b 69 5d 29 3b 0a 20 20  p->apShm[i]);.  
19fa0 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
19fb0 28 70 2d 3e 61 70 53 68 6d 29 3b 0a 20 20 70 2d  (p->apShm);.  p-
19fc0 3e 61 70 53 68 6d 20 3d 20 30 3b 0a 20 20 73 71  >apShm = 0;.  sq
19fd0 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 44  lite3_free(p->zD
19fe0 65 6c 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 6f  el);..  if( p->o
19ff0 70 65 6e 46 6c 61 67 73 20 26 20 53 51 4c 49 54  penFlags & SQLIT
1a000 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29  E_OPEN_MAIN_DB )
1a010 7b 0a 20 20 20 20 72 62 75 5f 66 69 6c 65 20 2a  {.    rbu_file *
1a020 2a 70 70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  *pp;.    sqlite3
1a030 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 2d 3e  _mutex_enter(p->
1a040 70 52 62 75 56 66 73 2d 3e 6d 75 74 65 78 29 3b  pRbuVfs->mutex);
1a050 0a 20 20 20 20 66 6f 72 28 70 70 3d 26 70 2d 3e  .    for(pp=&p->
1a060 70 52 62 75 56 66 73 2d 3e 70 4d 61 69 6e 3b 20  pRbuVfs->pMain; 
1a070 2a 70 70 21 3d 70 3b 20 70 70 3d 26 28 28 2a 70  *pp!=p; pp=&((*p
1a080 70 29 2d 3e 70 4d 61 69 6e 4e 65 78 74 29 29 3b  p)->pMainNext));
1a090 0a 20 20 20 20 2a 70 70 20 3d 20 70 2d 3e 70 4d  .    *pp = p->pM
1a0a0 61 69 6e 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c  ainNext;.    sql
1a0b0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
1a0c0 28 70 2d 3e 70 52 62 75 56 66 73 2d 3e 6d 75 74  (p->pRbuVfs->mut
1a0d0 65 78 29 3b 0a 20 20 20 20 72 62 75 55 6e 6c 6f  ex);.    rbuUnlo
1a0e0 63 6b 53 68 6d 28 70 29 3b 0a 20 20 20 20 70 2d  ckShm(p);.    p-
1a0f0 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73  >pReal->pMethods
1a100 2d 3e 78 53 68 6d 55 6e 6d 61 70 28 70 2d 3e 70  ->xShmUnmap(p->p
1a110 52 65 61 6c 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20  Real, 0);.  }.. 
1a120 20 2f 2a 20 43 6c 6f 73 65 20 74 68 65 20 75 6e   /* Close the un
1a130 64 65 72 6c 79 69 6e 67 20 66 69 6c 65 20 68 61  derlying file ha
1a140 6e 64 6c 65 20 2a 2f 0a 20 20 72 63 20 3d 20 70  ndle */.  rc = p
1a150 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64  ->pReal->pMethod
1a160 73 2d 3e 78 43 6c 6f 73 65 28 70 2d 3e 70 52 65  s->xClose(p->pRe
1a170 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  al);.  return rc
1a180 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  ;.}.../*.** Read
1a190 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 75   and return an u
1a1a0 6e 73 69 67 6e 65 64 20 33 32 2d 62 69 74 20 62  nsigned 32-bit b
1a1b0 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
1a1c0 72 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65  r from the buffe
1a1d0 72 20 0a 2a 2a 20 70 61 73 73 65 64 20 61 73 20  r .** passed as 
1a1e0 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e  the only argumen
1a1f0 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32  t..*/.static u32
1a200 20 72 62 75 47 65 74 55 33 32 28 75 38 20 2a 61   rbuGetU32(u8 *a
1a210 42 75 66 29 7b 0a 20 20 72 65 74 75 72 6e 20 28  Buf){.  return (
1a220 28 75 33 32 29 61 42 75 66 5b 30 5d 20 3c 3c 20  (u32)aBuf[0] << 
1a230 32 34 29 0a 20 20 20 20 20 20 20 2b 20 28 28 75  24).       + ((u
1a240 33 32 29 61 42 75 66 5b 31 5d 20 3c 3c 20 31 36  32)aBuf[1] << 16
1a250 29 0a 20 20 20 20 20 20 20 2b 20 28 28 75 33 32  ).       + ((u32
1a260 29 61 42 75 66 5b 32 5d 20 3c 3c 20 20 38 29 0a  )aBuf[2] <<  8).
1a270 20 20 20 20 20 20 20 2b 20 28 28 75 33 32 29 61         + ((u32)a
1a280 42 75 66 5b 33 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Buf[3]);.}../*.*
1a290 2a 20 52 65 61 64 20 64 61 74 61 20 66 72 6f 6d  * Read data from
1a2a0 20 61 6e 20 72 62 75 56 66 73 2d 66 69 6c 65 2e   an rbuVfs-file.
1a2b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
1a2c0 62 75 56 66 73 52 65 61 64 28 0a 20 20 73 71 6c  buVfsRead(.  sql
1a2d0 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65  ite3_file *pFile
1a2e0 2c 20 0a 20 20 76 6f 69 64 20 2a 7a 42 75 66 2c  , .  void *zBuf,
1a2f0 20 0a 20 20 69 6e 74 20 69 41 6d 74 2c 20 0a 20   .  int iAmt, . 
1a300 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 69 4f   sqlite_int64 iO
1a310 66 73 74 0a 29 7b 0a 20 20 72 62 75 5f 66 69 6c  fst.){.  rbu_fil
1a320 65 20 2a 70 20 3d 20 28 72 62 75 5f 66 69 6c 65  e *p = (rbu_file
1a330 2a 29 70 46 69 6c 65 3b 0a 20 20 73 71 6c 69 74  *)pFile;.  sqlit
1a340 65 33 72 62 75 20 2a 70 52 62 75 20 3d 20 70 2d  e3rbu *pRbu = p-
1a350 3e 70 52 62 75 3b 0a 20 20 69 6e 74 20 72 63 3b  >pRbu;.  int rc;
1a360 0a 0a 20 20 69 66 28 20 70 52 62 75 20 26 26 20  ..  if( pRbu && 
1a370 70 52 62 75 2d 3e 65 53 74 61 67 65 3d 3d 52 42  pRbu->eStage==RB
1a380 55 5f 53 54 41 47 45 5f 43 41 50 54 55 52 45 20  U_STAGE_CAPTURE 
1a390 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1a3a0 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20 53 51  ->openFlags & SQ
1a3b0 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 29 3b  LITE_OPEN_WAL );
1a3c0 0a 20 20 20 20 72 63 20 3d 20 72 62 75 43 61 70  .    rc = rbuCap
1a3d0 74 75 72 65 57 61 6c 52 65 61 64 28 70 2d 3e 70  tureWalRead(p->p
1a3e0 52 62 75 2c 20 69 4f 66 73 74 2c 20 69 41 6d 74  Rbu, iOfst, iAmt
1a3f0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1a400 69 66 28 20 70 52 62 75 20 26 26 20 70 52 62 75  if( pRbu && pRbu
1a410 2d 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54  ->eStage==RBU_ST
1a420 41 47 45 5f 4f 41 4c 20 0a 20 20 20 20 20 26 26  AGE_OAL .     &&
1a430 20 28 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26   (p->openFlags &
1a440 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c   SQLITE_OPEN_WAL
1a450 29 20 0a 20 20 20 20 20 26 26 20 69 4f 66 73 74  ) .     && iOfst
1a460 3e 3d 70 52 62 75 2d 3e 69 4f 61 6c 53 7a 20 0a  >=pRbu->iOalSz .
1a470 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63 20      ){.      rc 
1a480 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
1a490 20 20 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20     memset(zBuf, 
1a4a0 30 2c 20 69 41 6d 74 29 3b 0a 20 20 20 20 7d 65  0, iAmt);.    }e
1a4b0 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
1a4c0 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f  p->pReal->pMetho
1a4d0 64 73 2d 3e 78 52 65 61 64 28 70 2d 3e 70 52 65  ds->xRead(p->pRe
1a4e0 61 6c 2c 20 7a 42 75 66 2c 20 69 41 6d 74 2c 20  al, zBuf, iAmt, 
1a4f0 69 4f 66 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20  iOfst);.    }.  
1a500 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1a510 5f 4f 4b 20 26 26 20 69 4f 66 73 74 3d 3d 30 20  _OK && iOfst==0 
1a520 26 26 20 28 70 2d 3e 6f 70 65 6e 46 6c 61 67 73  && (p->openFlags
1a530 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d   & SQLITE_OPEN_M
1a540 41 49 4e 5f 44 42 29 20 29 7b 0a 20 20 20 20 20  AIN_DB) ){.     
1a550 20 2f 2a 20 54 68 65 73 65 20 6c 6f 6f 6b 20 6c   /* These look l
1a560 69 6b 65 20 6d 61 67 69 63 20 6e 75 6d 62 65 72  ike magic number
1a570 73 2e 20 42 75 74 20 74 68 65 79 20 61 72 65 20  s. But they are 
1a580 73 74 61 62 6c 65 2c 20 61 73 20 74 68 65 79 20  stable, as they 
1a590 61 72 65 20 70 61 72 74 0a 20 20 20 20 20 20 20  are part.       
1a5a0 2a 2a 20 6f 66 20 74 68 65 20 64 65 66 69 6e 69  ** of the defini
1a5b0 74 69 6f 6e 20 6f 66 20 74 68 65 20 53 51 4c 69  tion of the SQLi
1a5c0 74 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2c 20  te file format, 
1a5d0 77 68 69 63 68 20 6d 61 79 20 6e 6f 74 20 63 68  which may not ch
1a5e0 61 6e 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 75  ange. */.      u
1a5f0 38 20 2a 70 42 75 66 20 3d 20 28 75 38 2a 29 7a  8 *pBuf = (u8*)z
1a600 42 75 66 3b 0a 20 20 20 20 20 20 70 2d 3e 69 43  Buf;.      p->iC
1a610 6f 6f 6b 69 65 20 3d 20 72 62 75 47 65 74 55 33  ookie = rbuGetU3
1a620 32 28 26 70 42 75 66 5b 32 34 5d 29 3b 0a 20 20  2(&pBuf[24]);.  
1a630 20 20 20 20 70 2d 3e 69 57 72 69 74 65 56 65 72      p->iWriteVer
1a640 20 3d 20 70 42 75 66 5b 31 39 5d 3b 0a 20 20 20   = pBuf[19];.   
1a650 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1a660 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  rc;.}../*.** Wri
1a670 74 65 20 64 61 74 61 20 74 6f 20 61 6e 20 72 62  te data to an rb
1a680 75 56 66 73 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74  uVfs-file..*/.st
1a690 61 74 69 63 20 69 6e 74 20 72 62 75 56 66 73 57  atic int rbuVfsW
1a6a0 72 69 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f  rite(.  sqlite3_
1a6b0 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 0a 20 20  file *pFile, .  
1a6c0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 42 75 66  const void *zBuf
1a6d0 2c 20 0a 20 20 69 6e 74 20 69 41 6d 74 2c 20 0a  , .  int iAmt, .
1a6e0 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 69    sqlite_int64 i
1a6f0 4f 66 73 74 0a 29 7b 0a 20 20 72 62 75 5f 66 69  Ofst.){.  rbu_fi
1a700 6c 65 20 2a 70 20 3d 20 28 72 62 75 5f 66 69 6c  le *p = (rbu_fil
1a710 65 2a 29 70 46 69 6c 65 3b 0a 20 20 73 71 6c 69  e*)pFile;.  sqli
1a720 74 65 33 72 62 75 20 2a 70 52 62 75 20 3d 20 70  te3rbu *pRbu = p
1a730 2d 3e 70 52 62 75 3b 0a 20 20 69 6e 74 20 72 63  ->pRbu;.  int rc
1a740 3b 0a 0a 20 20 69 66 28 20 70 52 62 75 20 26 26  ;..  if( pRbu &&
1a750 20 70 52 62 75 2d 3e 65 53 74 61 67 65 3d 3d 52   pRbu->eStage==R
1a760 42 55 5f 53 54 41 47 45 5f 43 41 50 54 55 52 45  BU_STAGE_CAPTURE
1a770 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1a780 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20 53  p->openFlags & S
1a790 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
1a7a0 44 42 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 72  DB );.    rc = r
1a7b0 62 75 43 61 70 74 75 72 65 44 62 57 72 69 74 65  buCaptureDbWrite
1a7c0 28 70 2d 3e 70 52 62 75 2c 20 69 4f 66 73 74 29  (p->pRbu, iOfst)
1a7d0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
1a7e0 66 28 20 70 52 62 75 20 26 26 20 70 52 62 75 2d  f( pRbu && pRbu-
1a7f0 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41  >eStage==RBU_STA
1a800 47 45 5f 4f 41 4c 20 0a 20 20 20 20 20 26 26 20  GE_OAL .     && 
1a810 28 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20  (p->openFlags & 
1a820 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 29  SQLITE_OPEN_WAL)
1a830 20 0a 20 20 20 20 20 26 26 20 69 4f 66 73 74 3e   .     && iOfst>
1a840 3d 70 52 62 75 2d 3e 69 4f 61 6c 53 7a 0a 20 20  =pRbu->iOalSz.  
1a850 20 20 29 7b 0a 20 20 20 20 20 20 70 52 62 75 2d    ){.      pRbu-
1a860 3e 69 4f 61 6c 53 7a 20 3d 20 69 41 6d 74 20 2b  >iOalSz = iAmt +
1a870 20 69 4f 66 73 74 3b 0a 20 20 20 20 7d 0a 20 20   iOfst;.    }.  
1a880 20 20 72 63 20 3d 20 70 2d 3e 70 52 65 61 6c 2d    rc = p->pReal-
1a890 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 57 72 69 74  >pMethods->xWrit
1a8a0 65 28 70 2d 3e 70 52 65 61 6c 2c 20 7a 42 75 66  e(p->pReal, zBuf
1a8b0 2c 20 69 41 6d 74 2c 20 69 4f 66 73 74 29 3b 0a  , iAmt, iOfst);.
1a8c0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1a8d0 54 45 5f 4f 4b 20 26 26 20 69 4f 66 73 74 3d 3d  TE_OK && iOfst==
1a8e0 30 20 26 26 20 28 70 2d 3e 6f 70 65 6e 46 6c 61  0 && (p->openFla
1a8f0 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
1a900 5f 4d 41 49 4e 5f 44 42 29 20 29 7b 0a 20 20 20  _MAIN_DB) ){.   
1a910 20 20 20 2f 2a 20 54 68 65 73 65 20 6c 6f 6f 6b     /* These look
1a920 20 6c 69 6b 65 20 6d 61 67 69 63 20 6e 75 6d 62   like magic numb
1a930 65 72 73 2e 20 42 75 74 20 74 68 65 79 20 61 72  ers. But they ar
1a940 65 20 73 74 61 62 6c 65 2c 20 61 73 20 74 68 65  e stable, as the
1a950 79 20 61 72 65 20 70 61 72 74 0a 20 20 20 20 20  y are part.     
1a960 20 2a 2a 20 6f 66 20 74 68 65 20 64 65 66 69 6e   ** of the defin
1a970 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 53 51 4c  ition of the SQL
1a980 69 74 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2c  ite file format,
1a990 20 77 68 69 63 68 20 6d 61 79 20 6e 6f 74 20 63   which may not c
1a9a0 68 61 6e 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20  hange. */.      
1a9b0 75 38 20 2a 70 42 75 66 20 3d 20 28 75 38 2a 29  u8 *pBuf = (u8*)
1a9c0 7a 42 75 66 3b 0a 20 20 20 20 20 20 70 2d 3e 69  zBuf;.      p->i
1a9d0 43 6f 6f 6b 69 65 20 3d 20 72 62 75 47 65 74 55  Cookie = rbuGetU
1a9e0 33 32 28 26 70 42 75 66 5b 32 34 5d 29 3b 0a 20  32(&pBuf[24]);. 
1a9f0 20 20 20 20 20 70 2d 3e 69 57 72 69 74 65 56 65       p->iWriteVe
1aa00 72 20 3d 20 70 42 75 66 5b 31 39 5d 3b 0a 20 20  r = pBuf[19];.  
1aa10 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1aa20 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72   rc;.}../*.** Tr
1aa30 75 6e 63 61 74 65 20 61 6e 20 72 62 75 56 66 73  uncate an rbuVfs
1aa40 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  -file..*/.static
1aa50 20 69 6e 74 20 72 62 75 56 66 73 54 72 75 6e 63   int rbuVfsTrunc
1aa60 61 74 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ate(sqlite3_file
1aa70 20 2a 70 46 69 6c 65 2c 20 73 71 6c 69 74 65 5f   *pFile, sqlite_
1aa80 69 6e 74 36 34 20 73 69 7a 65 29 7b 0a 20 20 72  int64 size){.  r
1aa90 62 75 5f 66 69 6c 65 20 2a 70 20 3d 20 28 72 62  bu_file *p = (rb
1aaa0 75 5f 66 69 6c 65 2a 29 70 46 69 6c 65 3b 0a 20  u_file*)pFile;. 
1aab0 20 72 65 74 75 72 6e 20 70 2d 3e 70 52 65 61 6c   return p->pReal
1aac0 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 54 72 75  ->pMethods->xTru
1aad0 6e 63 61 74 65 28 70 2d 3e 70 52 65 61 6c 2c 20  ncate(p->pReal, 
1aae0 73 69 7a 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  size);.}../*.** 
1aaf0 53 79 6e 63 20 61 6e 20 72 62 75 56 66 73 2d 66  Sync an rbuVfs-f
1ab00 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
1ab10 6e 74 20 72 62 75 56 66 73 53 79 6e 63 28 73 71  nt rbuVfsSync(sq
1ab20 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
1ab30 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  e, int flags){. 
1ab40 20 72 62 75 5f 66 69 6c 65 20 2a 70 20 3d 20 28   rbu_file *p = (
1ab50 72 62 75 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65  rbu_file *)pFile
1ab60 3b 0a 20 20 69 66 28 20 70 2d 3e 70 52 62 75 20  ;.  if( p->pRbu 
1ab70 26 26 20 70 2d 3e 70 52 62 75 2d 3e 65 53 74 61  && p->pRbu->eSta
1ab80 67 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 43 41  ge==RBU_STAGE_CA
1ab90 50 54 55 52 45 20 29 7b 0a 20 20 20 20 69 66 28  PTURE ){.    if(
1aba0 20 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20   p->openFlags & 
1abb0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
1abc0 5f 44 42 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _DB ){.      ret
1abd0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4e 54 45 52  urn SQLITE_INTER
1abe0 4e 41 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  NAL;.    }.    r
1abf0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1ac00 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 2d  .  }.  return p-
1ac10 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73  >pReal->pMethods
1ac20 2d 3e 78 53 79 6e 63 28 70 2d 3e 70 52 65 61 6c  ->xSync(p->pReal
1ac30 2c 20 66 6c 61 67 73 29 3b 0a 7d 0a 0a 2f 2a 0a  , flags);.}../*.
1ac40 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75  ** Return the cu
1ac50 72 72 65 6e 74 20 66 69 6c 65 2d 73 69 7a 65 20  rrent file-size 
1ac60 6f 66 20 61 6e 20 72 62 75 56 66 73 2d 66 69 6c  of an rbuVfs-fil
1ac70 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1ac80 20 72 62 75 56 66 73 46 69 6c 65 53 69 7a 65 28   rbuVfsFileSize(
1ac90 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
1aca0 69 6c 65 2c 20 73 71 6c 69 74 65 5f 69 6e 74 36  ile, sqlite_int6
1acb0 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 72 62 75  4 *pSize){.  rbu
1acc0 5f 66 69 6c 65 20 2a 70 20 3d 20 28 72 62 75 5f  _file *p = (rbu_
1acd0 66 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20  file *)pFile;.  
1ace0 72 65 74 75 72 6e 20 70 2d 3e 70 52 65 61 6c 2d  return p->pReal-
1acf0 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 46 69 6c 65  >pMethods->xFile
1ad00 53 69 7a 65 28 70 2d 3e 70 52 65 61 6c 2c 20 70  Size(p->pReal, p
1ad10 53 69 7a 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Size);.}../*.** 
1ad20 4c 6f 63 6b 20 61 6e 20 72 62 75 56 66 73 2d 66  Lock an rbuVfs-f
1ad30 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
1ad40 6e 74 20 72 62 75 56 66 73 4c 6f 63 6b 28 73 71  nt rbuVfsLock(sq
1ad50 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
1ad60 65 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20  e, int eLock){. 
1ad70 20 72 62 75 5f 66 69 6c 65 20 2a 70 20 3d 20 28   rbu_file *p = (
1ad80 72 62 75 5f 66 69 6c 65 2a 29 70 46 69 6c 65 3b  rbu_file*)pFile;
1ad90 0a 20 20 73 71 6c 69 74 65 33 72 62 75 20 2a 70  .  sqlite3rbu *p
1ada0 52 62 75 20 3d 20 70 2d 3e 70 52 62 75 3b 0a 20  Rbu = p->pRbu;. 
1adb0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1adc0 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  _OK;..  assert( 
1add0 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20 28  p->openFlags & (
1ade0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
1adf0 5f 44 42 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  _DB|SQLITE_OPEN_
1ae00 54 45 4d 50 5f 44 42 29 20 29 3b 0a 20 20 69 66  TEMP_DB) );.  if
1ae10 28 20 70 52 62 75 20 26 26 20 65 4c 6f 63 6b 3d  ( pRbu && eLock=
1ae20 3d 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 45 58 43  =SQLITE_LOCK_EXC
1ae30 4c 55 53 49 56 45 20 26 26 20 70 52 62 75 2d 3e  LUSIVE && pRbu->
1ae40 65 53 74 61 67 65 21 3d 52 42 55 5f 53 54 41 47  eStage!=RBU_STAG
1ae50 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 2f 2a  E_DONE ){.    /*
1ae60 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 45 58   Do not allow EX
1ae70 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 2e 20 50  CLUSIVE locks. P
1ae80 72 65 76 65 6e 74 69 6e 67 20 53 51 4c 69 74 65  reventing SQLite
1ae90 20 66 72 6f 6d 20 74 61 6b 69 6e 67 20 74 68 69   from taking thi
1aea0 73 20 0a 20 20 20 20 2a 2a 20 70 72 65 76 65 6e  s .    ** preven
1aeb0 74 73 20 69 74 20 66 72 6f 6d 20 63 68 65 63 6b  ts it from check
1aec0 70 6f 69 6e 74 69 6e 67 20 74 68 65 20 64 61 74  pointing the dat
1aed0 61 62 61 73 65 20 66 72 6f 6d 20 73 71 6c 69 74  abase from sqlit
1aee0 65 33 5f 63 6c 6f 73 65 28 29 2e 20 2a 2f 0a 20  e3_close(). */. 
1aef0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
1af00 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  USY;.  }else{.  
1af10 20 20 72 63 20 3d 20 70 2d 3e 70 52 65 61 6c 2d    rc = p->pReal-
1af20 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 4c 6f 63 6b  >pMethods->xLock
1af30 28 70 2d 3e 70 52 65 61 6c 2c 20 65 4c 6f 63 6b  (p->pReal, eLock
1af40 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
1af50 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e   rc;.}../*.** Un
1af60 6c 6f 63 6b 20 61 6e 20 72 62 75 56 66 73 2d 66  lock an rbuVfs-f
1af70 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
1af80 6e 74 20 72 62 75 56 66 73 55 6e 6c 6f 63 6b 28  nt rbuVfsUnlock(
1af90 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
1afa0 69 6c 65 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b  ile, int eLock){
1afb0 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 20 3d  .  rbu_file *p =
1afc0 20 28 72 62 75 5f 66 69 6c 65 20 2a 29 70 46 69   (rbu_file *)pFi
1afd0 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e  le;.  return p->
1afe0 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d  pReal->pMethods-
1aff0 3e 78 55 6e 6c 6f 63 6b 28 70 2d 3e 70 52 65 61  >xUnlock(p->pRea
1b000 6c 2c 20 65 4c 6f 63 6b 29 3b 0a 7d 0a 0a 2f 2a  l, eLock);.}../*
1b010 0a 2a 2a 20 43 68 65 63 6b 20 69 66 20 61 6e 6f  .** Check if ano
1b020 74 68 65 72 20 66 69 6c 65 2d 68 61 6e 64 6c 65  ther file-handle
1b030 20 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56 45   holds a RESERVE
1b040 44 20 6c 6f 63 6b 20 6f 6e 20 61 6e 20 72 62 75  D lock on an rbu
1b050 56 66 73 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  Vfs-file..*/.sta
1b060 74 69 63 20 69 6e 74 20 72 62 75 56 66 73 43 68  tic int rbuVfsCh
1b070 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
1b080 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
1b090 69 6c 65 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75  ile, int *pResOu
1b0a0 74 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65 20 2a  t){.  rbu_file *
1b0b0 70 20 3d 20 28 72 62 75 5f 66 69 6c 65 20 2a 29  p = (rbu_file *)
1b0c0 70 46 69 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20  pFile;.  return 
1b0d0 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f  p->pReal->pMetho
1b0e0 64 73 2d 3e 78 43 68 65 63 6b 52 65 73 65 72 76  ds->xCheckReserv
1b0f0 65 64 4c 6f 63 6b 28 70 2d 3e 70 52 65 61 6c 2c  edLock(p->pReal,
1b100 20 70 52 65 73 4f 75 74 29 3b 0a 7d 0a 0a 2f 2a   pResOut);.}../*
1b110 0a 2a 2a 20 46 69 6c 65 20 63 6f 6e 74 72 6f 6c  .** File control
1b120 20 6d 65 74 68 6f 64 2e 20 46 6f 72 20 63 75 73   method. For cus
1b130 74 6f 6d 20 6f 70 65 72 61 74 69 6f 6e 73 20 6f  tom operations o
1b140 6e 20 61 6e 20 72 62 75 56 66 73 2d 66 69 6c 65  n an rbuVfs-file
1b150 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1b160 72 62 75 56 66 73 46 69 6c 65 43 6f 6e 74 72 6f  rbuVfsFileContro
1b170 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  l(sqlite3_file *
1b180 70 46 69 6c 65 2c 20 69 6e 74 20 6f 70 2c 20 76  pFile, int op, v
1b190 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 72 62  oid *pArg){.  rb
1b1a0 75 5f 66 69 6c 65 20 2a 70 20 3d 20 28 72 62 75  u_file *p = (rbu
1b1b0 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20  _file *)pFile;. 
1b1c0 20 69 6e 74 20 28 2a 78 43 6f 6e 74 72 6f 6c 29   int (*xControl)
1b1d0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 69  (sqlite3_file*,i
1b1e0 6e 74 2c 76 6f 69 64 2a 29 20 3d 20 70 2d 3e 70  nt,void*) = p->p
1b1f0 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e  Real->pMethods->
1b200 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 3b 0a 20 20  xFileControl;.  
1b210 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
1b220 74 28 20 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20  t( p->openFlags 
1b230 26 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  & (SQLITE_OPEN_M
1b240 41 49 4e 5f 44 42 7c 53 51 4c 49 54 45 5f 4f 50  AIN_DB|SQLITE_OP
1b250 45 4e 5f 54 45 4d 50 5f 44 42 29 0a 20 20 20 20  EN_TEMP_DB).    
1b260 20 20 20 7c 7c 20 70 2d 3e 6f 70 65 6e 46 6c 61     || p->openFla
1b270 67 73 20 26 20 28 53 51 4c 49 54 45 5f 4f 50 45  gs & (SQLITE_OPE
1b280 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 7c 53  N_TRANSIENT_DB|S
1b290 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
1b2a0 4a 4f 55 52 4e 41 4c 29 0a 20 20 29 3b 0a 20 20  JOURNAL).  );.  
1b2b0 69 66 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 46  if( op==SQLITE_F
1b2c0 43 4e 54 4c 5f 52 42 55 20 29 7b 0a 20 20 20 20  CNTL_RBU ){.    
1b2d0 73 71 6c 69 74 65 33 72 62 75 20 2a 70 52 62 75  sqlite3rbu *pRbu
1b2e0 20 3d 20 28 73 71 6c 69 74 65 33 72 62 75 2a 29   = (sqlite3rbu*)
1b2f0 70 41 72 67 3b 0a 0a 20 20 20 20 2f 2a 20 46 69  pArg;..    /* Fi
1b300 72 73 74 20 74 72 79 20 74 6f 20 66 69 6e 64 20  rst try to find 
1b310 61 6e 6f 74 68 65 72 20 52 42 55 20 76 66 73 20  another RBU vfs 
1b320 6c 6f 77 65 72 20 64 6f 77 6e 20 69 6e 20 74 68  lower down in th
1b330 65 20 76 66 73 20 73 74 61 63 6b 2e 20 49 66 0a  e vfs stack. If.
1b340 20 20 20 20 2a 2a 20 6f 6e 65 20 69 73 20 66 6f      ** one is fo
1b350 75 6e 64 2c 20 74 68 69 73 20 76 66 73 20 77 69  und, this vfs wi
1b360 6c 6c 20 6f 70 65 72 61 74 65 20 69 6e 20 70 61  ll operate in pa
1b370 73 73 2d 74 68 72 6f 75 67 68 20 6d 6f 64 65 2e  ss-through mode.
1b380 20 54 68 65 20 6c 6f 77 65 72 0a 20 20 20 20 2a   The lower.    *
1b390 2a 20 6c 65 76 65 6c 20 76 66 73 20 77 69 6c 6c  * level vfs will
1b3a0 20 64 6f 20 74 68 65 20 73 70 65 63 69 61 6c 20   do the special 
1b3b0 52 42 55 20 68 61 6e 64 6c 69 6e 67 2e 20 20 2a  RBU handling.  *
1b3c0 2f 0a 20 20 20 20 72 63 20 3d 20 78 43 6f 6e 74  /.    rc = xCont
1b3d0 72 6f 6c 28 70 2d 3e 70 52 65 61 6c 2c 20 6f 70  rol(p->pReal, op
1b3e0 2c 20 70 41 72 67 29 3b 0a 0a 20 20 20 20 69 66  , pArg);..    if
1b3f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54  ( rc==SQLITE_NOT
1b400 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20 20 2f  FOUND ){.      /
1b410 2a 20 4e 6f 77 20 73 65 61 72 63 68 20 66 6f 72  * Now search for
1b420 20 61 20 7a 69 70 76 66 73 20 69 6e 73 74 61 6e   a zipvfs instan
1b430 63 65 20 6c 6f 77 65 72 20 64 6f 77 6e 20 69 6e  ce lower down in
1b440 20 74 68 65 20 56 46 53 20 73 74 61 63 6b 2e 20   the VFS stack. 
1b450 49 66 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 65 20  If.      ** one 
1b460 69 73 20 66 6f 75 6e 64 2c 20 74 68 69 73 20 69  is found, this i
1b470 73 20 61 6e 20 65 72 72 6f 72 2e 20 20 2a 2f 0a  s an error.  */.
1b480 20 20 20 20 20 20 76 6f 69 64 20 2a 64 75 6d 6d        void *dumm
1b490 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  y = 0;.      rc 
1b4a0 3d 20 78 43 6f 6e 74 72 6f 6c 28 70 2d 3e 70 52  = xControl(p->pR
1b4b0 65 61 6c 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54  eal, SQLITE_FCNT
1b4c0 4c 5f 5a 49 50 56 46 53 2c 20 26 64 75 6d 6d 79  L_ZIPVFS, &dummy
1b4d0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
1b4e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1b4f0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1b500 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  E_ERROR;.       
1b510 20 70 52 62 75 2d 3e 7a 45 72 72 6d 73 67 20 3d   pRbu->zErrmsg =
1b520 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
1b530 28 22 72 62 75 2f 7a 69 70 76 66 73 20 73 65 74  ("rbu/zipvfs set
1b540 75 70 20 65 72 72 6f 72 22 29 3b 0a 20 20 20 20  up error");.    
1b550 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d    }else if( rc==
1b560 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20  SQLITE_NOTFOUND 
1b570 29 7b 0a 20 20 20 20 20 20 20 20 70 52 62 75 2d  ){.        pRbu-
1b580 3e 70 54 61 72 67 65 74 46 64 20 3d 20 70 3b 0a  >pTargetFd = p;.
1b590 20 20 20 20 20 20 20 20 70 2d 3e 70 52 62 75 20          p->pRbu 
1b5a0 3d 20 70 52 62 75 3b 0a 20 20 20 20 20 20 20 20  = pRbu;.        
1b5b0 69 66 28 20 70 2d 3e 70 57 61 6c 46 64 20 29 20  if( p->pWalFd ) 
1b5c0 70 2d 3e 70 57 61 6c 46 64 2d 3e 70 52 62 75 20  p->pWalFd->pRbu 
1b5d0 3d 20 70 52 62 75 3b 0a 20 20 20 20 20 20 20 20  = pRbu;.        
1b5e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1b5f0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1b600 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
1b610 0a 0a 20 20 72 63 20 3d 20 78 43 6f 6e 74 72 6f  ..  rc = xContro
1b620 6c 28 70 2d 3e 70 52 65 61 6c 2c 20 6f 70 2c 20  l(p->pReal, op, 
1b630 70 41 72 67 29 3b 0a 20 20 69 66 28 20 72 63 3d  pArg);.  if( rc=
1b640 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6f 70  =SQLITE_OK && op
1b650 3d 3d 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 56  ==SQLITE_FCNTL_V
1b660 46 53 4e 41 4d 45 20 29 7b 0a 20 20 20 20 72 62  FSNAME ){.    rb
1b670 75 5f 76 66 73 20 2a 70 52 62 75 56 66 73 20 3d  u_vfs *pRbuVfs =
1b680 20 70 2d 3e 70 52 62 75 56 66 73 3b 0a 20 20 20   p->pRbuVfs;.   
1b690 20 63 68 61 72 20 2a 7a 49 6e 20 3d 20 2a 28 63   char *zIn = *(c
1b6a0 68 61 72 2a 2a 29 70 41 72 67 3b 0a 20 20 20 20  har**)pArg;.    
1b6b0 63 68 61 72 20 2a 7a 4f 75 74 20 3d 20 73 71 6c  char *zOut = sql
1b6c0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 72 62  ite3_mprintf("rb
1b6d0 75 28 25 73 29 2f 25 7a 22 2c 20 70 52 62 75 56  u(%s)/%z", pRbuV
1b6e0 66 73 2d 3e 62 61 73 65 2e 7a 4e 61 6d 65 2c 20  fs->base.zName, 
1b6f0 7a 49 6e 29 3b 0a 20 20 20 20 2a 28 63 68 61 72  zIn);.    *(char
1b700 2a 2a 29 70 41 72 67 20 3d 20 7a 4f 75 74 3b 0a  **)pArg = zOut;.
1b710 20 20 20 20 69 66 28 20 7a 4f 75 74 3d 3d 30 20      if( zOut==0 
1b720 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ) rc = SQLITE_NO
1b730 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  MEM;.  }..  retu
1b740 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1b750 52 65 74 75 72 6e 20 74 68 65 20 73 65 63 74 6f  Return the secto
1b760 72 2d 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20  r-size in bytes 
1b770 66 6f 72 20 61 6e 20 72 62 75 56 66 73 2d 66 69  for an rbuVfs-fi
1b780 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
1b790 74 20 72 62 75 56 66 73 53 65 63 74 6f 72 53 69  t rbuVfsSectorSi
1b7a0 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ze(sqlite3_file 
1b7b0 2a 70 46 69 6c 65 29 7b 0a 20 20 72 62 75 5f 66  *pFile){.  rbu_f
1b7c0 69 6c 65 20 2a 70 20 3d 20 28 72 62 75 5f 66 69  ile *p = (rbu_fi
1b7d0 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 72 65  le *)pFile;.  re
1b7e0 74 75 72 6e 20 70 2d 3e 70 52 65 61 6c 2d 3e 70  turn p->pReal->p
1b7f0 4d 65 74 68 6f 64 73 2d 3e 78 53 65 63 74 6f 72  Methods->xSector
1b800 53 69 7a 65 28 70 2d 3e 70 52 65 61 6c 29 3b 0a  Size(p->pReal);.
1b810 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1b820 74 68 65 20 64 65 76 69 63 65 20 63 68 61 72 61  the device chara
1b830 63 74 65 72 69 73 74 69 63 20 66 6c 61 67 73 20  cteristic flags 
1b840 73 75 70 70 6f 72 74 65 64 20 62 79 20 61 6e 20  supported by an 
1b850 72 62 75 56 66 73 2d 66 69 6c 65 2e 0a 2a 2f 0a  rbuVfs-file..*/.
1b860 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 56 66  static int rbuVf
1b870 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
1b880 69 73 74 69 63 73 28 73 71 6c 69 74 65 33 5f 66  istics(sqlite3_f
1b890 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 72  ile *pFile){.  r
1b8a0 62 75 5f 66 69 6c 65 20 2a 70 20 3d 20 28 72 62  bu_file *p = (rb
1b8b0 75 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a  u_file *)pFile;.
1b8c0 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 52 65 61    return p->pRea
1b8d0 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 44 65  l->pMethods->xDe
1b8e0 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
1b8f0 69 63 73 28 70 2d 3e 70 52 65 61 6c 29 3b 0a 7d  ics(p->pReal);.}
1b900 0a 0a 2f 2a 0a 2a 2a 20 54 61 6b 65 20 6f 72 20  ../*.** Take or 
1b910 72 65 6c 65 61 73 65 20 61 20 73 68 61 72 65 64  release a shared
1b920 2d 6d 65 6d 6f 72 79 20 6c 6f 63 6b 2e 0a 2a 2f  -memory lock..*/
1b930 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 56  .static int rbuV
1b940 66 73 53 68 6d 4c 6f 63 6b 28 73 71 6c 69 74 65  fsShmLock(sqlite
1b950 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69  3_file *pFile, i
1b960 6e 74 20 6f 66 73 74 2c 20 69 6e 74 20 6e 2c 20  nt ofst, int n, 
1b970 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 72 62  int flags){.  rb
1b980 75 5f 66 69 6c 65 20 2a 70 20 3d 20 28 72 62 75  u_file *p = (rbu
1b990 5f 66 69 6c 65 2a 29 70 46 69 6c 65 3b 0a 20 20  _file*)pFile;.  
1b9a0 73 71 6c 69 74 65 33 72 62 75 20 2a 70 52 62 75  sqlite3rbu *pRbu
1b9b0 20 3d 20 70 2d 3e 70 52 62 75 3b 0a 20 20 69 6e   = p->pRbu;.  in
1b9c0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1b9d0 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
1b9e0 5f 41 4d 41 4c 47 41 4d 41 54 49 4f 4e 0a 20 20  _AMALGAMATION.  
1b9f0 20 20 61 73 73 65 72 74 28 20 57 41 4c 5f 43 4b    assert( WAL_CK
1ba00 50 54 5f 4c 4f 43 4b 3d 3d 31 20 29 3b 0a 23 65  PT_LOCK==1 );.#e
1ba10 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
1ba20 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 26 20 28  p->openFlags & (
1ba30 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
1ba40 5f 44 42 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  _DB|SQLITE_OPEN_
1ba50 54 45 4d 50 5f 44 42 29 20 29 3b 0a 20 20 69 66  TEMP_DB) );.  if
1ba60 28 20 70 52 62 75 20 26 26 20 28 70 52 62 75 2d  ( pRbu && (pRbu-
1ba70 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41  >eStage==RBU_STA
1ba80 47 45 5f 4f 41 4c 20 7c 7c 20 70 52 62 75 2d 3e  GE_OAL || pRbu->
1ba90 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47  eStage==RBU_STAG
1baa0 45 5f 4d 4f 56 45 29 20 29 7b 0a 20 20 20 20 2f  E_MOVE) ){.    /
1bab0 2a 20 4d 61 67 69 63 20 6e 75 6d 62 65 72 20 31  * Magic number 1
1bac0 20 69 73 20 74 68 65 20 57 41 4c 5f 43 4b 50 54   is the WAL_CKPT
1bad0 5f 4c 4f 43 4b 20 6c 6f 63 6b 2e 20 50 72 65 76  _LOCK lock. Prev
1bae0 65 6e 74 69 6e 67 20 53 51 4c 69 74 65 20 66 72  enting SQLite fr
1baf0 6f 6d 0a 20 20 20 20 2a 2a 20 74 61 6b 69 6e 67  om.    ** taking
1bb00 20 74 68 69 73 20 6c 6f 63 6b 20 61 6c 73 6f 20   this lock also 
1bb10 70 72 65 76 65 6e 74 73 20 61 6e 79 20 63 68 65  prevents any che
1bb20 63 6b 70 6f 69 6e 74 73 20 66 72 6f 6d 20 6f 63  ckpoints from oc
1bb30 63 75 72 72 69 6e 67 2e 20 0a 20 20 20 20 2a 2a  curring. .    **
1bb40 20 74 6f 64 6f 3a 20 72 65 61 6c 6c 79 2c 20 69   todo: really, i
1bb50 74 27 73 20 6e 6f 74 20 63 6c 65 61 72 20 77 68  t's not clear wh
1bb60 79 20 74 68 69 73 20 6d 69 67 68 74 20 6f 63 63  y this might occ
1bb70 75 72 2c 20 61 73 20 0a 20 20 20 20 2a 2a 20 77  ur, as .    ** w
1bb80 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e  al_autocheckpoin
1bb90 74 20 6f 75 67 68 74 20 74 6f 20 62 65 20 74 75  t ought to be tu
1bba0 72 6e 65 64 20 6f 66 66 2e 20 20 2a 2f 0a 20 20  rned off.  */.  
1bbb0 20 20 69 66 28 20 6f 66 73 74 3d 3d 57 41 4c 5f    if( ofst==WAL_
1bbc0 4c 4f 43 4b 5f 43 4b 50 54 20 26 26 20 6e 3d 3d  LOCK_CKPT && n==
1bbd0 31 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  1 ) rc = SQLITE_
1bbe0 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  BUSY;.  }else{. 
1bbf0 20 20 20 69 6e 74 20 62 43 61 70 74 75 72 65 20     int bCapture 
1bc00 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6e 3d 3d  = 0;.    if( n==
1bc10 31 20 26 26 20 28 66 6c 61 67 73 20 26 20 53 51  1 && (flags & SQ
1bc20 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49  LITE_SHM_EXCLUSI
1bc30 56 45 29 0a 20 20 20 20 20 26 26 20 70 52 62 75  VE).     && pRbu
1bc40 20 26 26 20 70 52 62 75 2d 3e 65 53 74 61 67 65   && pRbu->eStage
1bc50 3d 3d 52 42 55 5f 53 54 41 47 45 5f 43 41 50 54  ==RBU_STAGE_CAPT
1bc60 55 52 45 0a 20 20 20 20 20 26 26 20 28 6f 66 73  URE.     && (ofs
1bc70 74 3d 3d 57 41 4c 5f 4c 4f 43 4b 5f 57 52 49 54  t==WAL_LOCK_WRIT
1bc80 45 20 7c 7c 20 6f 66 73 74 3d 3d 57 41 4c 5f 4c  E || ofst==WAL_L
1bc90 4f 43 4b 5f 43 4b 50 54 20 7c 7c 20 6f 66 73 74  OCK_CKPT || ofst
1bca0 3d 3d 57 41 4c 5f 4c 4f 43 4b 5f 52 45 41 44 30  ==WAL_LOCK_READ0
1bcb0 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 62  ).    ){.      b
1bcc0 43 61 70 74 75 72 65 20 3d 20 31 3b 0a 20 20 20  Capture = 1;.   
1bcd0 20 7d 0a 0a 20 20 20 20 69 66 28 20 62 43 61 70   }..    if( bCap
1bce0 74 75 72 65 3d 3d 30 20 7c 7c 20 30 3d 3d 28 66  ture==0 || 0==(f
1bcf0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48  lags & SQLITE_SH
1bd00 4d 5f 55 4e 4c 4f 43 4b 29 20 29 7b 0a 20 20 20  M_UNLOCK) ){.   
1bd10 20 20 20 72 63 20 3d 20 70 2d 3e 70 52 65 61 6c     rc = p->pReal
1bd20 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53 68 6d  ->pMethods->xShm
1bd30 4c 6f 63 6b 28 70 2d 3e 70 52 65 61 6c 2c 20 6f  Lock(p->pReal, o
1bd40 66 73 74 2c 20 6e 2c 20 66 6c 61 67 73 29 3b 0a  fst, n, flags);.
1bd50 20 20 20 20 20 20 69 66 28 20 62 43 61 70 74 75        if( bCaptu
1bd60 72 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  re && rc==SQLITE
1bd70 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
1bd80 52 62 75 2d 3e 6d 4c 6f 63 6b 20 7c 3d 20 28 31  Rbu->mLock |= (1
1bd90 20 3c 3c 20 6f 66 73 74 29 3b 0a 20 20 20 20 20   << ofst);.     
1bda0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
1bdb0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1bdc0 0a 2a 2a 20 4f 62 74 61 69 6e 20 61 20 70 6f 69  .** Obtain a poi
1bdd0 6e 74 65 72 20 74 6f 20 61 20 6d 61 70 70 69 6e  nter to a mappin
1bde0 67 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 33 32  g of a single 32
1bdf0 4b 69 42 20 70 61 67 65 20 6f 66 20 74 68 65 20  KiB page of the 
1be00 2a 2d 73 68 6d 20 66 69 6c 65 2e 0a 2a 2f 0a 73  *-shm file..*/.s
1be10 74 61 74 69 63 20 69 6e 74 20 72 62 75 56 66 73  tatic int rbuVfs
1be20 53 68 6d 4d 61 70 28 0a 20 20 73 71 6c 69 74 65  ShmMap(.  sqlite
1be30 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 0a  3_file *pFile, .
1be40 20 20 69 6e 74 20 69 52 65 67 69 6f 6e 2c 20 0a    int iRegion, .
1be50 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e 2c 20    int szRegion, 
1be60 0a 20 20 69 6e 74 20 69 73 57 72 69 74 65 2c 20  .  int isWrite, 
1be70 0a 20 20 76 6f 69 64 20 76 6f 6c 61 74 69 6c 65  .  void volatile
1be80 20 2a 2a 70 70 0a 29 7b 0a 20 20 72 62 75 5f 66   **pp.){.  rbu_f
1be90 69 6c 65 20 2a 70 20 3d 20 28 72 62 75 5f 66 69  ile *p = (rbu_fi
1bea0 6c 65 2a 29 70 46 69 6c 65 3b 0a 20 20 69 6e 74  le*)pFile;.  int
1beb0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1bec0 0a 20 20 69 6e 74 20 65 53 74 61 67 65 20 3d 20  .  int eStage = 
1bed0 28 70 2d 3e 70 52 62 75 20 3f 20 70 2d 3e 70 52  (p->pRbu ? p->pR
1bee0 62 75 2d 3e 65 53 74 61 67 65 20 3a 20 30 29 3b  bu->eStage : 0);
1bef0 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 20 69 6e  ..  /* If not in
1bf00 20 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 2c 20   RBU_STAGE_OAL, 
1bf10 61 6c 6c 6f 77 20 74 68 69 73 20 63 61 6c 6c 20  allow this call 
1bf20 74 6f 20 70 61 73 73 20 74 68 72 6f 75 67 68 2e  to pass through.
1bf30 20 4f 72 2c 20 69 66 20 74 68 69 73 0a 20 20 2a   Or, if this.  *
1bf40 2a 20 72 62 75 20 69 73 20 69 6e 20 74 68 65 20  * rbu is in the 
1bf50 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20 73 74  RBU_STAGE_OAL st
1bf60 61 74 65 2c 20 75 73 65 20 68 65 61 70 20 6d 65  ate, use heap me
1bf70 6d 6f 72 79 20 66 6f 72 20 2a 2d 73 68 6d 20 73  mory for *-shm s
1bf80 70 61 63 65 20 0a 20 20 2a 2a 20 69 6e 73 74 65  pace .  ** inste
1bf90 61 64 20 6f 66 20 61 20 66 69 6c 65 20 6f 6e 20  ad of a file on 
1bfa0 64 69 73 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65  disk.  */.  asse
1bfb0 72 74 28 20 70 2d 3e 6f 70 65 6e 46 6c 61 67 73  rt( p->openFlags
1bfc0 20 26 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   & (SQLITE_OPEN_
1bfd0 4d 41 49 4e 5f 44 42 7c 53 51 4c 49 54 45 5f 4f  MAIN_DB|SQLITE_O
1bfe0 50 45 4e 5f 54 45 4d 50 5f 44 42 29 20 29 3b 0a  PEN_TEMP_DB) );.
1bff0 20 20 69 66 28 20 65 53 74 61 67 65 3d 3d 52 42    if( eStage==RB
1c000 55 5f 53 54 41 47 45 5f 4f 41 4c 20 7c 7c 20 65  U_STAGE_OAL || e
1c010 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41 47 45  Stage==RBU_STAGE
1c020 5f 4d 4f 56 45 20 29 7b 0a 20 20 20 20 69 66 28  _MOVE ){.    if(
1c030 20 69 52 65 67 69 6f 6e 3c 3d 70 2d 3e 6e 53 68   iRegion<=p->nSh
1c040 6d 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  m ){.      int n
1c050 42 79 74 65 20 3d 20 28 69 52 65 67 69 6f 6e 2b  Byte = (iRegion+
1c060 31 29 20 2a 20 73 69 7a 65 6f 66 28 63 68 61 72  1) * sizeof(char
1c070 2a 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  *);.      char *
1c080 2a 61 70 4e 65 77 20 3d 20 28 63 68 61 72 2a 2a  *apNew = (char**
1c090 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63  )sqlite3_realloc
1c0a0 28 70 2d 3e 61 70 53 68 6d 2c 20 6e 42 79 74 65  (p->apShm, nByte
1c0b0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 70 4e  );.      if( apN
1c0c0 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ew==0 ){.       
1c0d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
1c0e0 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  EM;.      }else{
1c0f0 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28  .        memset(
1c100 26 61 70 4e 65 77 5b 70 2d 3e 6e 53 68 6d 5d 2c  &apNew[p->nShm],
1c110 20 30 2c 20 73 69 7a 65 6f 66 28 63 68 61 72 2a   0, sizeof(char*
1c120 29 20 2a 20 28 31 20 2b 20 69 52 65 67 69 6f 6e  ) * (1 + iRegion
1c130 20 2d 20 70 2d 3e 6e 53 68 6d 29 29 3b 0a 20 20   - p->nShm));.  
1c140 20 20 20 20 20 20 70 2d 3e 61 70 53 68 6d 20 3d        p->apShm =
1c150 20 61 70 4e 65 77 3b 0a 20 20 20 20 20 20 20 20   apNew;.        
1c160 70 2d 3e 6e 53 68 6d 20 3d 20 69 52 65 67 69 6f  p->nShm = iRegio
1c170 6e 2b 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n+1;.      }.   
1c180 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   }..    if( rc==
1c190 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e  SQLITE_OK && p->
1c1a0 61 70 53 68 6d 5b 69 52 65 67 69 6f 6e 5d 3d 3d  apShm[iRegion]==
1c1b0 30 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  0 ){.      char 
1c1c0 2a 70 4e 65 77 20 3d 20 28 63 68 61 72 2a 29 73  *pNew = (char*)s
1c1d0 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 7a  qlite3_malloc(sz
1c1e0 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 69  Region);.      i
1c1f0 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
1c200 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1c210 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d  E_NOMEM;.      }
1c220 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65  else{.        me
1c230 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 7a  mset(pNew, 0, sz
1c240 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20  Region);.       
1c250 20 70 2d 3e 61 70 53 68 6d 5b 69 52 65 67 69 6f   p->apShm[iRegio
1c260 6e 5d 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20  n] = pNew;.     
1c270 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66   }.    }..    if
1c280 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1c290 29 7b 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 70  ){.      *pp = p
1c2a0 2d 3e 61 70 53 68 6d 5b 69 52 65 67 69 6f 6e 5d  ->apShm[iRegion]
1c2b0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1c2c0 20 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20 20 20     *pp = 0;.    
1c2d0 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  }.  }else{.    a
1c2e0 73 73 65 72 74 28 20 70 2d 3e 61 70 53 68 6d 3d  ssert( p->apShm=
1c2f0 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70  =0 );.    rc = p
1c300 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64  ->pReal->pMethod
1c310 73 2d 3e 78 53 68 6d 4d 61 70 28 70 2d 3e 70 52  s->xShmMap(p->pR
1c320 65 61 6c 2c 20 69 52 65 67 69 6f 6e 2c 20 73 7a  eal, iRegion, sz
1c330 52 65 67 69 6f 6e 2c 20 69 73 57 72 69 74 65 2c  Region, isWrite,
1c340 20 70 70 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74   pp);.  }..  ret
1c350 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1c360 20 4d 65 6d 6f 72 79 20 62 61 72 72 69 65 72 2e   Memory barrier.
1c370 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1c380 72 62 75 56 66 73 53 68 6d 42 61 72 72 69 65 72  rbuVfsShmBarrier
1c390 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70  (sqlite3_file *p
1c3a0 46 69 6c 65 29 7b 0a 20 20 72 62 75 5f 66 69 6c  File){.  rbu_fil
1c3b0 65 20 2a 70 20 3d 20 28 72 62 75 5f 66 69 6c 65  e *p = (rbu_file
1c3c0 20 2a 29 70 46 69 6c 65 3b 0a 20 20 70 2d 3e 70   *)pFile;.  p->p
1c3d0 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e  Real->pMethods->
1c3e0 78 53 68 6d 42 61 72 72 69 65 72 28 70 2d 3e 70  xShmBarrier(p->p
1c3f0 52 65 61 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Real);.}../*.** 
1c400 54 68 65 20 78 53 68 6d 55 6e 6d 61 70 20 6d 65  The xShmUnmap me
1c410 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  thod..*/.static 
1c420 69 6e 74 20 72 62 75 56 66 73 53 68 6d 55 6e 6d  int rbuVfsShmUnm
1c430 61 70 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ap(sqlite3_file 
1c440 2a 70 46 69 6c 65 2c 20 69 6e 74 20 64 65 6c 46  *pFile, int delF
1c450 6c 61 67 29 7b 0a 20 20 72 62 75 5f 66 69 6c 65  lag){.  rbu_file
1c460 20 2a 70 20 3d 20 28 72 62 75 5f 66 69 6c 65 2a   *p = (rbu_file*
1c470 29 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20 72 63  )pFile;.  int rc
1c480 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1c490 69 6e 74 20 65 53 74 61 67 65 20 3d 20 28 70 2d  int eStage = (p-
1c4a0 3e 70 52 62 75 20 3f 20 70 2d 3e 70 52 62 75 2d  >pRbu ? p->pRbu-
1c4b0 3e 65 53 74 61 67 65 20 3a 20 30 29 3b 0a 0a 20  >eStage : 0);.. 
1c4c0 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 65 6e   assert( p->open
1c4d0 46 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f  Flags & (SQLITE_
1c4e0 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 7c 53 51 4c  OPEN_MAIN_DB|SQL
1c4f0 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42  ITE_OPEN_TEMP_DB
1c500 29 20 29 3b 0a 20 20 69 66 28 20 65 53 74 61 67  ) );.  if( eStag
1c510 65 3d 3d 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c  e==RBU_STAGE_OAL
1c520 20 7c 7c 20 65 53 74 61 67 65 3d 3d 52 42 55 5f   || eStage==RBU_
1c530 53 54 41 47 45 5f 4d 4f 56 45 20 29 7b 0a 20 20  STAGE_MOVE ){.  
1c540 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20    /* no-op */.  
1c550 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 52 65  }else{.    /* Re
1c560 6c 65 61 73 65 20 74 68 65 20 63 68 65 63 6b 70  lease the checkp
1c570 6f 69 6e 74 65 72 20 61 6e 64 20 77 72 69 74 65  ointer and write
1c580 72 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 72  r locks */.    r
1c590 62 75 55 6e 6c 6f 63 6b 53 68 6d 28 70 29 3b 0a  buUnlockShm(p);.
1c5a0 20 20 20 20 72 63 20 3d 20 70 2d 3e 70 52 65 61      rc = p->pRea
1c5b0 6c 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53 68  l->pMethods->xSh
1c5c0 6d 55 6e 6d 61 70 28 70 2d 3e 70 52 65 61 6c 2c  mUnmap(p->pReal,
1c5d0 20 64 65 6c 46 6c 61 67 29 3b 0a 20 20 7d 0a 20   delFlag);.  }. 
1c5e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1c5f0 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 61 74 20  *.** Given that 
1c600 7a 57 61 6c 20 70 6f 69 6e 74 73 20 74 6f 20 61  zWal points to a
1c610 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
1c620 6e 67 20 61 20 77 61 6c 20 66 69 6c 65 20 6e 61  ng a wal file na
1c630 6d 65 20 70 61 73 73 65 64 20 74 6f 20 0a 2a 2a  me passed to .**
1c640 20 65 69 74 68 65 72 20 74 68 65 20 78 4f 70 65   either the xOpe
1c650 6e 28 29 20 6f 72 20 78 41 63 63 65 73 73 28 29  n() or xAccess()
1c660 20 56 46 53 20 6d 65 74 68 6f 64 2c 20 72 65 74   VFS method, ret
1c670 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
1c680 20 74 68 65 0a 2a 2a 20 66 69 6c 65 2d 68 61 6e   the.** file-han
1c690 64 6c 65 20 6f 70 65 6e 65 64 20 62 79 20 74 68  dle opened by th
1c6a0 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20  e same database 
1c6b0 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 6e 20 74 68  connection on th
1c6c0 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a  e corresponding.
1c6d0 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
1c6e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 72 62 75 5f  ..*/.static rbu_
1c6f0 66 69 6c 65 20 2a 72 62 75 46 69 6e 64 4d 61 69  file *rbuFindMai
1c700 6e 64 62 28 72 62 75 5f 76 66 73 20 2a 70 52 62  ndb(rbu_vfs *pRb
1c710 75 56 66 73 2c 20 63 6f 6e 73 74 20 63 68 61 72  uVfs, const char
1c720 20 2a 7a 57 61 6c 29 7b 0a 20 20 72 62 75 5f 66   *zWal){.  rbu_f
1c730 69 6c 65 20 2a 70 44 62 3b 0a 20 20 73 71 6c 69  ile *pDb;.  sqli
1c740 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
1c750 70 52 62 75 56 66 73 2d 3e 6d 75 74 65 78 29 3b  pRbuVfs->mutex);
1c760 0a 20 20 66 6f 72 28 70 44 62 3d 70 52 62 75 56  .  for(pDb=pRbuV
1c770 66 73 2d 3e 70 4d 61 69 6e 3b 20 70 44 62 20 26  fs->pMain; pDb &
1c780 26 20 70 44 62 2d 3e 7a 57 61 6c 21 3d 7a 57 61  & pDb->zWal!=zWa
1c790 6c 3b 20 70 44 62 3d 70 44 62 2d 3e 70 4d 61 69  l; pDb=pDb->pMai
1c7a0 6e 4e 65 78 74 29 3b 0a 20 20 73 71 6c 69 74 65  nNext);.  sqlite
1c7b0 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 52  3_mutex_leave(pR
1c7c0 62 75 56 66 73 2d 3e 6d 75 74 65 78 29 3b 0a 20  buVfs->mutex);. 
1c7d0 20 72 65 74 75 72 6e 20 70 44 62 3b 0a 7d 0a 0a   return pDb;.}..
1c7e0 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 6e 20 72 62  /*.** Open an rb
1c7f0 75 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a  u file handle..*
1c800 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62 75  /.static int rbu
1c810 56 66 73 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74  VfsOpen(.  sqlit
1c820 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 0a 20 20  e3_vfs *pVfs,.  
1c830 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
1c840 65 2c 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  e,.  sqlite3_fil
1c850 65 20 2a 70 46 69 6c 65 2c 0a 20 20 69 6e 74 20  e *pFile,.  int 
1c860 66 6c 61 67 73 2c 0a 20 20 69 6e 74 20 2a 70 4f  flags,.  int *pO
1c870 75 74 46 6c 61 67 73 0a 29 7b 0a 20 20 73 74 61  utFlags.){.  sta
1c880 74 69 63 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  tic sqlite3_io_m
1c890 65 74 68 6f 64 73 20 72 62 75 76 66 73 5f 69 6f  ethods rbuvfs_io
1c8a0 5f 6d 65 74 68 6f 64 73 20 3d 20 7b 0a 20 20 20  _methods = {.   
1c8b0 20 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   2,             
1c8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c8d0 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20  * iVersion */.  
1c8e0 20 20 72 62 75 56 66 73 43 6c 6f 73 65 2c 20 20    rbuVfsClose,  
1c8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c900 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f 0a 20 20 20  /* xClose */.   
1c910 20 72 62 75 56 66 73 52 65 61 64 2c 20 20 20 20   rbuVfsRead,    
1c920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c930 2a 20 78 52 65 61 64 20 2a 2f 0a 20 20 20 20 72  * xRead */.    r
1c940 62 75 56 66 73 57 72 69 74 65 2c 20 20 20 20 20  buVfsWrite,     
1c950 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c960 78 57 72 69 74 65 20 2a 2f 0a 20 20 20 20 72 62  xWrite */.    rb
1c970 75 56 66 73 54 72 75 6e 63 61 74 65 2c 20 20 20  uVfsTruncate,   
1c980 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1c990 54 72 75 6e 63 61 74 65 20 2a 2f 0a 20 20 20 20  Truncate */.    
1c9a0 72 62 75 56 66 73 53 79 6e 63 2c 20 20 20 20 20  rbuVfsSync,     
1c9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c9c0 20 78 53 79 6e 63 20 2a 2f 0a 20 20 20 20 72 62   xSync */.    rb
1c9d0 75 56 66 73 46 69 6c 65 53 69 7a 65 2c 20 20 20  uVfsFileSize,   
1c9e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1c9f0 46 69 6c 65 53 69 7a 65 20 2a 2f 0a 20 20 20 20  FileSize */.    
1ca00 72 62 75 56 66 73 4c 6f 63 6b 2c 20 20 20 20 20  rbuVfsLock,     
1ca10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ca20 20 78 4c 6f 63 6b 20 2a 2f 0a 20 20 20 20 72 62   xLock */.    rb
1ca30 75 56 66 73 55 6e 6c 6f 63 6b 2c 20 20 20 20 20  uVfsUnlock,     
1ca40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1ca50 55 6e 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 72 62  Unlock */.    rb
1ca60 75 56 66 73 43 68 65 63 6b 52 65 73 65 72 76 65  uVfsCheckReserve
1ca70 64 4c 6f 63 6b 2c 20 20 20 20 20 20 2f 2a 20 78  dLock,      /* x
1ca80 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
1ca90 6b 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73 46  k */.    rbuVfsF
1caa0 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20 20 20 20 20  ileControl,     
1cab0 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 43         /* xFileC
1cac0 6f 6e 74 72 6f 6c 20 2a 2f 0a 20 20 20 20 72 62  ontrol */.    rb
1cad0 75 56 66 73 53 65 63 74 6f 72 53 69 7a 65 2c 20  uVfsSectorSize, 
1cae0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1caf0 53 65 63 74 6f 72 53 69 7a 65 20 2a 2f 0a 20 20  SectorSize */.  
1cb00 20 20 72 62 75 56 66 73 44 65 76 69 63 65 43 68    rbuVfsDeviceCh
1cb10 61 72 61 63 74 65 72 69 73 74 69 63 73 2c 20 20  aracteristics,  
1cb20 2f 2a 20 78 44 65 76 69 63 65 43 68 61 72 61 63  /* xDeviceCharac
1cb30 74 65 72 69 73 74 69 63 73 20 2a 2f 0a 20 20 20  teristics */.   
1cb40 20 72 62 75 56 66 73 53 68 6d 4d 61 70 2c 20 20   rbuVfsShmMap,  
1cb50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1cb60 2a 20 78 53 68 6d 4d 61 70 20 2a 2f 0a 20 20 20  * xShmMap */.   
1cb70 20 72 62 75 56 66 73 53 68 6d 4c 6f 63 6b 2c 20   rbuVfsShmLock, 
1cb80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1cb90 2a 20 78 53 68 6d 4c 6f 63 6b 20 2a 2f 0a 20 20  * xShmLock */.  
1cba0 20 20 72 62 75 56 66 73 53 68 6d 42 61 72 72 69    rbuVfsShmBarri
1cbb0 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
1cbc0 2f 2a 20 78 53 68 6d 42 61 72 72 69 65 72 20 2a  /* xShmBarrier *
1cbd0 2f 0a 20 20 20 20 72 62 75 56 66 73 53 68 6d 55  /.    rbuVfsShmU
1cbe0 6e 6d 61 70 20 20 20 20 20 20 20 20 20 20 20 20  nmap            
1cbf0 20 20 20 20 2f 2a 20 78 53 68 6d 55 6e 6d 61 70      /* xShmUnmap
1cc00 20 2a 2f 0a 20 20 7d 3b 0a 20 20 72 62 75 5f 76   */.  };.  rbu_v
1cc10 66 73 20 2a 70 52 62 75 56 66 73 20 3d 20 28 72  fs *pRbuVfs = (r
1cc20 62 75 5f 76 66 73 2a 29 70 56 66 73 3b 0a 20 20  bu_vfs*)pVfs;.  
1cc30 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 52 65  sqlite3_vfs *pRe
1cc40 61 6c 56 66 73 20 3d 20 70 52 62 75 56 66 73 2d  alVfs = pRbuVfs-
1cc50 3e 70 52 65 61 6c 56 66 73 3b 0a 20 20 72 62 75  >pRealVfs;.  rbu
1cc60 5f 66 69 6c 65 20 2a 70 46 64 20 3d 20 28 72 62  _file *pFd = (rb
1cc70 75 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a  u_file *)pFile;.
1cc80 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1cc90 45 5f 4f 4b 3b 0a 20 20 63 6f 6e 73 74 20 63 68  E_OK;.  const ch
1cca0 61 72 20 2a 7a 4f 70 65 6e 20 3d 20 7a 4e 61 6d  ar *zOpen = zNam
1ccb0 65 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 70 46 64  e;..  memset(pFd
1ccc0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 72 62 75 5f  , 0, sizeof(rbu_
1ccd0 66 69 6c 65 29 29 3b 0a 20 20 70 46 64 2d 3e 70  file));.  pFd->p
1cce0 52 65 61 6c 20 3d 20 28 73 71 6c 69 74 65 33 5f  Real = (sqlite3_
1ccf0 66 69 6c 65 2a 29 26 70 46 64 5b 31 5d 3b 0a 20  file*)&pFd[1];. 
1cd00 20 70 46 64 2d 3e 70 52 62 75 56 66 73 20 3d 20   pFd->pRbuVfs = 
1cd10 70 52 62 75 56 66 73 3b 0a 20 20 70 46 64 2d 3e  pRbuVfs;.  pFd->
1cd20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 66 6c 61 67  openFlags = flag
1cd30 73 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 29  s;.  if( zName )
1cd40 7b 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73 20  {.    if( flags 
1cd50 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  & SQLITE_OPEN_MA
1cd60 49 4e 5f 44 42 20 29 7b 0a 20 20 20 20 20 20 2f  IN_DB ){.      /
1cd70 2a 20 41 20 6d 61 69 6e 20 64 61 74 61 62 61 73  * A main databas
1cd80 65 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  e has just been 
1cd90 6f 70 65 6e 65 64 2e 20 54 68 65 20 66 6f 6c 6c  opened. The foll
1cda0 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 73 65 74 73  owing block sets
1cdb0 0a 20 20 20 20 20 20 2a 2a 20 28 70 46 64 2d 3e  .      ** (pFd->
1cdc0 7a 57 61 6c 29 20 74 6f 20 70 6f 69 6e 74 20 74  zWal) to point t
1cdd0 6f 20 61 20 62 75 66 66 65 72 20 6f 77 6e 65 64  o a buffer owned
1cde0 20 62 79 20 53 51 4c 69 74 65 20 74 68 61 74 20   by SQLite that 
1cdf0 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20 20 2a  contains.      *
1ce00 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  * the name of th
1ce10 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 74 68 69  e *-wal file thi
1ce20 73 20 64 62 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  s db connection 
1ce30 77 69 6c 6c 20 75 73 65 2e 20 53 51 4c 69 74 65  will use. SQLite
1ce40 0a 20 20 20 20 20 20 2a 2a 20 68 61 70 70 65 6e  .      ** happen
1ce50 73 20 74 6f 20 70 61 73 73 20 61 20 70 6f 69 6e  s to pass a poin
1ce60 74 65 72 20 74 6f 20 74 68 69 73 20 62 75 66 66  ter to this buff
1ce70 65 72 20 77 68 65 6e 20 75 73 69 6e 67 20 78 41  er when using xA
1ce80 63 63 65 73 73 28 29 0a 20 20 20 20 20 20 2a 2a  ccess().      **
1ce90 20 6f 72 20 78 4f 70 65 6e 28 29 20 74 6f 20 6f   or xOpen() to o
1cea0 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 2a 2d  perate on the *-
1ceb0 77 61 6c 20 66 69 6c 65 2e 20 20 2a 2f 0a 20 20  wal file.  */.  
1cec0 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c      int n = strl
1ced0 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  en(zName);.     
1cee0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
1cef0 20 26 7a 4e 61 6d 65 5b 6e 5d 3b 0a 20 20 20 20   &zName[n];.    
1cf00 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51    if( flags & SQ
1cf10 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 20 29 7b  LITE_OPEN_URI ){
1cf20 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6f 64 64  .        int odd
1cf30 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 77 68   = 0;.        wh
1cf40 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 20 20  ile( 1 ){.      
1cf50 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 30 20      if( z[0]==0 
1cf60 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f  ){.            o
1cf70 64 64 20 3d 20 31 20 2d 20 6f 64 64 3b 0a 20 20  dd = 1 - odd;.  
1cf80 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6f 64            if( od
1cf90 64 20 26 26 20 7a 5b 31 5d 3d 3d 30 20 29 20 62  d && z[1]==0 ) b
1cfa0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
1cfb0 7d 0a 20 20 20 20 20 20 20 20 20 20 7a 2b 2b 3b  }.          z++;
1cfc0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1cfd0 20 20 20 7a 20 2b 3d 20 32 3b 0a 20 20 20 20 20     z += 2;.     
1cfe0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1cff0 77 68 69 6c 65 28 20 2a 7a 3d 3d 30 20 29 20 7a  while( *z==0 ) z
1d000 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
1d010 20 20 7a 20 2b 3d 20 28 6e 20 2b 20 38 20 2b 20    z += (n + 8 + 
1d020 31 29 3b 0a 20 20 20 20 20 20 70 46 64 2d 3e 7a  1);.      pFd->z
1d030 57 61 6c 20 3d 20 7a 3b 0a 20 20 20 20 7d 0a 20  Wal = z;.    }. 
1d040 20 20 20 65 6c 73 65 20 69 66 28 20 66 6c 61 67     else if( flag
1d050 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
1d060 57 41 4c 20 29 7b 0a 20 20 20 20 20 20 72 62 75  WAL ){.      rbu
1d070 5f 66 69 6c 65 20 2a 70 44 62 20 3d 20 72 62 75  _file *pDb = rbu
1d080 46 69 6e 64 4d 61 69 6e 64 62 28 70 52 62 75 56  FindMaindb(pRbuV
1d090 66 73 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  fs, zName);.    
1d0a0 20 20 69 66 28 20 70 44 62 20 29 7b 0a 20 20 20    if( pDb ){.   
1d0b0 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 52       if( pDb->pR
1d0c0 62 75 20 26 26 20 70 44 62 2d 3e 70 52 62 75 2d  bu && pDb->pRbu-
1d0d0 3e 65 53 74 61 67 65 3d 3d 52 42 55 5f 53 54 41  >eStage==RBU_STA
1d0e0 47 45 5f 4f 41 4c 20 29 7b 0a 20 20 20 20 20 20  GE_OAL ){.      
1d0f0 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c      /* This call
1d100 20 69 73 20 74 6f 20 6f 70 65 6e 20 61 20 2a 2d   is to open a *-
1d110 77 61 6c 20 66 69 6c 65 2e 20 49 6e 74 65 61 64  wal file. Intead
1d120 2c 20 6f 70 65 6e 20 74 68 65 20 2a 2d 6f 61 6c  , open the *-oal
1d130 2e 20 54 68 69 73 0a 20 20 20 20 20 20 20 20 20  . This.         
1d140 20 2a 2a 20 63 6f 64 65 20 65 6e 73 75 72 65 73   ** code ensures
1d150 20 74 68 61 74 20 74 68 65 20 73 74 72 69 6e 67   that the string
1d160 20 70 61 73 73 65 64 20 74 6f 20 78 4f 70 65 6e   passed to xOpen
1d170 28 29 20 69 73 20 74 65 72 6d 69 6e 61 74 65 64  () is terminated
1d180 20 62 79 20 61 0a 20 20 20 20 20 20 20 20 20 20   by a.          
1d190 2a 2a 20 70 61 69 72 20 6f 66 20 27 5c 30 27 20  ** pair of '\0' 
1d1a0 62 79 74 65 73 20 69 6e 20 63 61 73 65 20 74 68  bytes in case th
1d1b0 65 20 56 46 53 20 61 74 74 65 6d 70 74 73 20 74  e VFS attempts t
1d1c0 6f 20 65 78 74 72 61 63 74 20 61 20 55 52 49 20  o extract a URI 
1d1d0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61  .          ** pa
1d1e0 72 61 6d 65 74 65 72 20 66 72 6f 6d 20 69 74 2e  rameter from it.
1d1f0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69    */.          i
1d200 6e 74 20 6e 43 6f 70 79 20 3d 20 73 74 72 6c 65  nt nCopy = strle
1d210 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  n(zName);.      
1d220 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 70 79 20      char *zCopy 
1d230 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
1d240 28 6e 43 6f 70 79 2b 32 29 3b 0a 20 20 20 20 20  (nCopy+2);.     
1d250 20 20 20 20 20 69 66 28 20 7a 43 6f 70 79 20 29       if( zCopy )
1d260 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  {.            me
1d270 6d 63 70 79 28 7a 43 6f 70 79 2c 20 7a 4e 61 6d  mcpy(zCopy, zNam
1d280 65 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20  e, nCopy);.     
1d290 20 20 20 20 20 20 20 7a 43 6f 70 79 5b 6e 43 6f         zCopy[nCo
1d2a0 70 79 2d 33 5d 20 3d 20 27 6f 27 3b 0a 20 20 20  py-3] = 'o';.   
1d2b0 20 20 20 20 20 20 20 20 20 7a 43 6f 70 79 5b 6e           zCopy[n
1d2c0 43 6f 70 79 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  Copy] = '\0';.  
1d2d0 20 20 20 20 20 20 20 20 20 20 7a 43 6f 70 79 5b            zCopy[
1d2e0 6e 43 6f 70 79 2b 31 5d 20 3d 20 27 5c 30 27 3b  nCopy+1] = '\0';
1d2f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 4f 70  .            zOp
1d300 65 6e 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  en = (const char
1d310 2a 29 28 70 46 64 2d 3e 7a 44 65 6c 20 3d 20 7a  *)(pFd->zDel = z
1d320 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 20 20 20  Copy);.         
1d330 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1d340 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1d350 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20  NOMEM;.         
1d360 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 46 64   }.          pFd
1d370 2d 3e 70 52 62 75 20 3d 20 70 44 62 2d 3e 70 52  ->pRbu = pDb->pR
1d380 62 75 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  bu;.        }.  
1d390 20 20 20 20 20 20 70 44 62 2d 3e 70 57 61 6c 46        pDb->pWalF
1d3a0 64 20 3d 20 70 46 64 3b 0a 20 20 20 20 20 20 7d  d = pFd;.      }
1d3b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
1d3c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1d3d0 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 52 65 61  ){.    rc = pRea
1d3e0 6c 56 66 73 2d 3e 78 4f 70 65 6e 28 70 52 65 61  lVfs->xOpen(pRea
1d3f0 6c 56 66 73 2c 20 7a 4f 70 65 6e 2c 20 70 46 64  lVfs, zOpen, pFd
1d400 2d 3e 70 52 65 61 6c 2c 20 66 6c 61 67 73 2c 20  ->pReal, flags, 
1d410 70 4f 75 74 46 6c 61 67 73 29 3b 0a 20 20 7d 0a  pOutFlags);.  }.
1d420 20 20 69 66 28 20 70 46 64 2d 3e 70 52 65 61 6c    if( pFd->pReal
1d430 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  ->pMethods ){.  
1d440 20 20 2f 2a 20 54 68 65 20 78 4f 70 65 6e 28 29    /* The xOpen()
1d450 20 6f 70 65 72 61 74 69 6f 6e 20 68 61 73 20 73   operation has s
1d460 75 63 63 65 65 64 65 64 2e 20 53 65 74 20 74 68  ucceeded. Set th
1d470 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 2e 70  e sqlite3_file.p
1d480 4d 65 74 68 6f 64 73 0a 20 20 20 20 2a 2a 20 70  Methods.    ** p
1d490 6f 69 6e 74 65 72 20 61 6e 64 2c 20 69 66 20 74  ointer and, if t
1d4a0 68 65 20 66 69 6c 65 20 69 73 20 61 20 6d 61 69  he file is a mai
1d4b0 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  n database file,
1d4c0 20 6c 69 6e 6b 20 69 74 20 69 6e 74 6f 20 74 68   link it into th
1d4d0 65 0a 20 20 20 20 2a 2a 20 6d 75 74 65 78 20 70  e.    ** mutex p
1d4e0 72 6f 74 65 63 74 65 64 20 6c 69 6e 6b 65 64 20  rotected linked 
1d4f0 6c 69 73 74 20 6f 66 20 61 6c 6c 20 73 75 63 68  list of all such
1d500 20 66 69 6c 65 73 2e 20 20 2a 2f 0a 20 20 20 20   files.  */.    
1d510 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 20  pFile->pMethods 
1d520 3d 20 26 72 62 75 76 66 73 5f 69 6f 5f 6d 65 74  = &rbuvfs_io_met
1d530 68 6f 64 73 3b 0a 20 20 20 20 69 66 28 20 66 6c  hods;.    if( fl
1d540 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
1d550 4e 5f 4d 41 49 4e 5f 44 42 20 29 7b 0a 20 20 20  N_MAIN_DB ){.   
1d560 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
1d570 5f 65 6e 74 65 72 28 70 52 62 75 56 66 73 2d 3e  _enter(pRbuVfs->
1d580 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 70 46  mutex);.      pF
1d590 64 2d 3e 70 4d 61 69 6e 4e 65 78 74 20 3d 20 70  d->pMainNext = p
1d5a0 52 62 75 56 66 73 2d 3e 70 4d 61 69 6e 3b 0a 20  RbuVfs->pMain;. 
1d5b0 20 20 20 20 20 70 52 62 75 56 66 73 2d 3e 70 4d       pRbuVfs->pM
1d5c0 61 69 6e 20 3d 20 70 46 64 3b 0a 20 20 20 20 20  ain = pFd;.     
1d5d0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
1d5e0 65 61 76 65 28 70 52 62 75 56 66 73 2d 3e 6d 75  eave(pRbuVfs->mu
1d5f0 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  tex);.    }.  }e
1d600 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
1d610 5f 66 72 65 65 28 70 46 64 2d 3e 7a 44 65 6c 29  _free(pFd->zDel)
1d620 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
1d630 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  rc;.}../*.** Del
1d640 65 74 65 20 74 68 65 20 66 69 6c 65 20 6c 6f 63  ete the file loc
1d650 61 74 65 64 20 61 74 20 7a 50 61 74 68 2e 0a 2a  ated at zPath..*
1d660 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 62 75  /.static int rbu
1d670 56 66 73 44 65 6c 65 74 65 28 73 71 6c 69 74 65  VfsDelete(sqlite
1d680 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 63 6f 6e  3_vfs *pVfs, con
1d690 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20  st char *zPath, 
1d6a0 69 6e 74 20 64 69 72 53 79 6e 63 29 7b 0a 20 20  int dirSync){.  
1d6b0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 52 65  sqlite3_vfs *pRe
1d6c0 61 6c 56 66 73 20 3d 20 28 28 72 62 75 5f 76 66  alVfs = ((rbu_vf
1d6d0 73 2a 29 70 56 66 73 29 2d 3e 70 52 65 61 6c 56  s*)pVfs)->pRealV
1d6e0 66 73 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65  fs;.  return pRe
1d6f0 61 6c 56 66 73 2d 3e 78 44 65 6c 65 74 65 28 70  alVfs->xDelete(p
1d700 52 65 61 6c 56 66 73 2c 20 7a 50 61 74 68 2c 20  RealVfs, zPath, 
1d710 64 69 72 53 79 6e 63 29 3b 0a 7d 0a 0a 2f 2a 0a  dirSync);.}../*.
1d720 2a 2a 20 54 65 73 74 20 66 6f 72 20 61 63 63 65  ** Test for acce
1d730 73 73 20 70 65 72 6d 69 73 73 69 6f 6e 73 2e 20  ss permissions. 
1d740 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
1d750 68 65 20 72 65 71 75 65 73 74 65 64 20 70 65 72  he requested per
1d760 6d 69 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 61 76  mission.** is av
1d770 61 69 6c 61 62 6c 65 2c 20 6f 72 20 66 61 6c 73  ailable, or fals
1d780 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  e otherwise..*/.
1d790 73 74 61 74 69 63 20 69 6e 74 20 72 62 75 56 66  static int rbuVf
1d7a0 73 41 63 63 65 73 73 28 0a 20 20 73 71 6c 69 74  sAccess(.  sqlit
1d7b0 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 0a 20  e3_vfs *pVfs, . 
1d7c0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
1d7d0 74 68 2c 20 0a 20 20 69 6e 74 20 66 6c 61 67 73  th, .  int flags
1d7e0 2c 20 0a 20 20 69 6e 74 20 2a 70 52 65 73 4f 75  , .  int *pResOu
1d7f0 74 0a 29 7b 0a 20 20 72 62 75 5f 76 66 73 20 2a  t.){.  rbu_vfs *
1d800 70 52 62 75 56 66 73 20 3d 20 28 72 62 75 5f 76  pRbuVfs = (rbu_v
1d810 66 73 2a 29 70 56 66 73 3b 0a 20 20 73 71 6c 69  fs*)pVfs;.  sqli
1d820 74 65 33 5f 76 66 73 20 2a 70 52 65 61 6c 56 66  te3_vfs *pRealVf
1d830 73 20 3d 20 70 52 62 75 56 66 73 2d 3e 70 52 65  s = pRbuVfs->pRe
1d840 61 6c 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b  alVfs;.  int rc;
1d850 0a 0a 20 20 72 63 20 3d 20 70 52 65 61 6c 56 66  ..  rc = pRealVf
1d860 73 2d 3e 78 41 63 63 65 73 73 28 70 52 65 61 6c  s->xAccess(pReal
1d870 56 66 73 2c 20 7a 50 61 74 68 2c 20 66 6c 61 67  Vfs, zPath, flag
1d880 73 2c 20 70 52 65 73 4f 75 74 29 3b 0a 0a 20 20  s, pResOut);..  
1d890 2f 2a 20 49 66 20 74 68 69 73 20 63 61 6c 6c 20  /* If this call 
1d8a0 69 73 20 74 6f 20 63 68 65 63 6b 20 69 66 20 61  is to check if a
1d8b0 20 2a 2d 77 61 6c 20 66 69 6c 65 20 61 73 73 6f   *-wal file asso
1d8c0 63 69 61 74 65 64 20 77 69 74 68 20 61 6e 20 52  ciated with an R
1d8d0 42 55 20 74 61 72 67 65 74 0a 20 20 2a 2a 20 64  BU target.  ** d
1d8e0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1d8f0 6f 6e 20 65 78 69 73 74 73 2c 20 61 6e 64 20 74  on exists, and t
1d900 68 65 20 52 42 55 20 75 70 64 61 74 65 20 69 73  he RBU update is
1d910 20 69 6e 20 52 42 55 5f 53 54 41 47 45 5f 4f 41   in RBU_STAGE_OA
1d920 4c 2c 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c  L,.  ** the foll
1d930 6f 77 69 6e 67 20 73 70 65 63 69 61 6c 20 68 61  owing special ha
1d940 6e 64 6c 69 6e 67 20 69 73 20 61 63 74 69 76 61  ndling is activa
1d950 74 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ted:.  **.  **  
1d960 20 61 29 20 69 66 20 74 68 65 20 2a 2d 77 61 6c   a) if the *-wal
1d970 20 66 69 6c 65 20 64 6f 65 73 20 65 78 69 73 74   file does exist
1d980 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
1d990 43 41 4e 54 4f 50 45 4e 2e 20 54 68 69 73 0a 20  CANTOPEN. This. 
1d9a0 20 2a 2a 20 20 20 20 20 20 65 6e 73 75 72 65 73   **      ensures
1d9b0 20 74 68 61 74 20 74 68 65 20 52 42 55 20 65 78   that the RBU ex
1d9c0 74 65 6e 73 69 6f 6e 20 6e 65 76 65 72 20 74 72  tension never tr
1d9d0 69 65 73 20 74 6f 20 75 70 64 61 74 65 20 61 20  ies to update a 
1d9e0 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 20 20  database.  **   
1d9f0 20 20 20 69 6e 20 77 61 6c 20 6d 6f 64 65 2c 20     in wal mode, 
1da00 65 76 65 6e 20 69 66 20 74 68 65 20 66 69 72 73  even if the firs
1da10 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61  t page of the da
1da20 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 0a  tabase file has.
1da30 20 20 2a 2a 20 20 20 20 20 20 62 65 65 6e 20 64    **      been d
1da40 61 6d 61 67 65 64 2e 20 0a 20 20 2a 2a 0a 20 20  amaged. .  **.  
1da50 2a 2a 20 20 20 62 29 20 69 66 20 74 68 65 20 2a  **   b) if the *
1da60 2d 77 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e  -wal file does n
1da70 6f 74 20 65 78 69 73 74 2c 20 63 6c 61 69 6d 20  ot exist, claim 
1da80 74 68 61 74 20 69 74 20 64 6f 65 73 20 61 6e 79  that it does any
1da90 77 61 79 2c 0a 20 20 2a 2a 20 20 20 20 20 20 63  way,.  **      c
1daa0 61 75 73 69 6e 67 20 53 51 4c 69 74 65 20 74 6f  ausing SQLite to
1dab0 20 63 61 6c 6c 20 78 4f 70 65 6e 28 29 20 74 6f   call xOpen() to
1dac0 20 6f 70 65 6e 20 69 74 2e 20 54 68 69 73 20 63   open it. This c
1dad0 61 6c 6c 20 77 69 6c 6c 20 61 6c 73 6f 0a 20 20  all will also.  
1dae0 2a 2a 20 20 20 20 20 20 62 65 20 69 6e 74 65 72  **      be inter
1daf0 63 65 70 74 65 64 20 28 73 65 65 20 74 68 65 20  cepted (see the 
1db00 72 62 75 56 66 73 4f 70 65 6e 28 29 20 66 75 6e  rbuVfsOpen() fun
1db10 63 74 69 6f 6e 29 20 61 6e 64 20 74 68 65 20 2a  ction) and the *
1db20 2d 6f 61 6c 0a 20 20 2a 2a 20 20 20 20 20 20 66  -oal.  **      f
1db30 69 6c 65 20 6f 70 65 6e 65 64 20 69 6e 73 74 65  ile opened inste
1db40 61 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  ad..  */.  if( r
1db50 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1db60 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 41 43  flags==SQLITE_AC
1db70 43 45 53 53 5f 45 58 49 53 54 53 20 29 7b 0a 20  CESS_EXISTS ){. 
1db80 20 20 20 72 62 75 5f 66 69 6c 65 20 2a 70 44 62     rbu_file *pDb
1db90 20 3d 20 72 62 75 46 69 6e 64 4d 61 69 6e 64 62   = rbuFindMaindb
1dba0 28 70 52 62 75 56 66 73 2c 20 7a 50 61 74 68 29  (pRbuVfs, zPath)
1dbb0 3b 0a 20 20 20 20 69 66 28 20 70 44 62 20 26 26  ;.    if( pDb &&
1dbc0 20 70 44 62 2d 3e 70 52 62 75 20 26 26 20 70 44   pDb->pRbu && pD
1dbd0 62 2d 3e 70 52 62 75 2d 3e 65 53 74 61 67 65 3d  b->pRbu->eStage=
1dbe0 3d 52 42 55 5f 53 54 41 47 45 5f 4f 41 4c 20 29  =RBU_STAGE_OAL )
1dbf0 7b 0a 20 20 20 20 20 20 69 66 28 20 2a 70 52 65  {.      if( *pRe
1dc00 73 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20  sOut ){.        
1dc10 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54  rc = SQLITE_CANT
1dc20 4f 50 45 4e 3b 0a 20 20 20 20 20 20 7d 65 6c 73  OPEN;.      }els
1dc30 65 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73  e{.        *pRes
1dc40 4f 75 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  Out = 1;.      }
1dc50 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
1dc60 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1dc70 2a 20 50 6f 70 75 6c 61 74 65 20 62 75 66 66 65  * Populate buffe
1dc80 72 20 7a 4f 75 74 20 77 69 74 68 20 74 68 65 20  r zOut with the 
1dc90 66 75 6c 6c 20 63 61 6e 6f 6e 69 63 61 6c 20 70  full canonical p
1dca0 61 74 68 6e 61 6d 65 20 63 6f 72 72 65 73 70 6f  athname correspo
1dcb0 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 74 68 65 20  nding.** to the 
1dcc0 70 61 74 68 6e 61 6d 65 20 69 6e 20 7a 50 61 74  pathname in zPat
1dcd0 68 2e 20 7a 4f 75 74 20 69 73 20 67 75 61 72 61  h. zOut is guara
1dce0 6e 74 65 65 64 20 74 6f 20 70 6f 69 6e 74 20 74  nteed to point t
1dcf0 6f 20 61 20 62 75 66 66 65 72 0a 2a 2a 20 6f 66  o a buffer.** of
1dd00 20 61 74 20 6c 65 61 73 74 20 28 44 45 56 53 59   at least (DEVSY
1dd10 4d 5f 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31  M_MAX_PATHNAME+1
1dd20 29 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74  ) bytes..*/.stat
1dd30 69 63 20 69 6e 74 20 72 62 75 56 66 73 46 75 6c  ic int rbuVfsFul
1dd40 6c 50 61 74 68 6e 61 6d 65 28 0a 20 20 73 71 6c  lPathname(.  sql
1dd50 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
1dd60 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1dd70 50 61 74 68 2c 20 0a 20 20 69 6e 74 20 6e 4f 75  Path, .  int nOu
1dd80 74 2c 20 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74  t, .  char *zOut
1dd90 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  .){.  sqlite3_vf
1dda0 73 20 2a 70 52 65 61 6c 56 66 73 20 3d 20 28 28  s *pRealVfs = ((
1ddb0 72 62 75 5f 76 66 73 2a 29 70 56 66 73 29 2d 3e  rbu_vfs*)pVfs)->
1ddc0 70 52 65 61 6c 56 66 73 3b 0a 20 20 72 65 74 75  pRealVfs;.  retu
1ddd0 72 6e 20 70 52 65 61 6c 56 66 73 2d 3e 78 46 75  rn pRealVfs->xFu
1dde0 6c 6c 50 61 74 68 6e 61 6d 65 28 70 52 65 61 6c  llPathname(pReal
1ddf0 56 66 73 2c 20 7a 50 61 74 68 2c 20 6e 4f 75 74  Vfs, zPath, nOut
1de00 2c 20 7a 4f 75 74 29 3b 0a 7d 0a 0a 23 69 66 6e  , zOut);.}..#ifn
1de10 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1de20 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 2f  LOAD_EXTENSION./
1de30 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 64 79  *.** Open the dy
1de40 6e 61 6d 69 63 20 6c 69 62 72 61 72 79 20 6c 6f  namic library lo
1de50 63 61 74 65 64 20 61 74 20 7a 50 61 74 68 20 61  cated at zPath a
1de60 6e 64 20 72 65 74 75 72 6e 20 61 20 68 61 6e 64  nd return a hand
1de70 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  le..*/.static vo
1de80 69 64 20 2a 72 62 75 56 66 73 44 6c 4f 70 65 6e  id *rbuVfsDlOpen
1de90 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
1dea0 66 73 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  fs, const char *
1deb0 7a 50 61 74 68 29 7b 0a 20 20 73 71 6c 69 74 65  zPath){.  sqlite
1dec0 33 5f 76 66 73 20 2a 70 52 65 61 6c 56 66 73 20  3_vfs *pRealVfs 
1ded0 3d 20 28 28 72 62 75 5f 76 66 73 2a 29 70 56 66  = ((rbu_vfs*)pVf
1dee0 73 29 2d 3e 70 52 65 61 6c 56 66 73 3b 0a 20 20  s)->pRealVfs;.  
1def0 72 65 74 75 72 6e 20 70 52 65 61 6c 56 66 73 2d  return pRealVfs-
1df00 3e 78 44 6c 4f 70 65 6e 28 70 52 65 61 6c 56 66  >xDlOpen(pRealVf
1df10 73 2c 20 7a 50 61 74 68 29 3b 0a 7d 0a 0a 2f 2a  s, zPath);.}../*
1df20 0a 2a 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65  .** Populate the
1df30 20 62 75 66 66 65 72 20 7a 45 72 72 4d 73 67 20   buffer zErrMsg 
1df40 28 73 69 7a 65 20 6e 42 79 74 65 20 62 79 74 65  (size nByte byte
1df50 73 29 20 77 69 74 68 20 61 20 68 75 6d 61 6e 20  s) with a human 
1df60 72 65 61 64 61 62 6c 65 0a 2a 2a 20 75 74 66 2d  readable.** utf-
1df70 38 20 73 74 72 69 6e 67 20 64 65 73 63 72 69 62  8 string describ
1df80 69 6e 67 20 74 68 65 20 6d 6f 73 74 20 72 65 63  ing the most rec
1df90 65 6e 74 20 65 72 72 6f 72 20 65 6e 63 6f 75 6e  ent error encoun
1dfa0 74 65 72 65 64 20 61 73 73 6f 63 69 61 74 65 64  tered associated
1dfb0 20 0a 2a 2a 20 77 69 74 68 20 64 79 6e 61 6d 69   .** with dynami
1dfc0 63 20 6c 69 62 72 61 72 69 65 73 2e 0a 2a 2f 0a  c libraries..*/.
1dfd0 73 74 61 74 69 63 20 76 6f 69 64 20 72 62 75 56  static void rbuV
1dfe0 66 73 44 6c 45 72 72 6f 72 28 73 71 6c 69 74 65  fsDlError(sqlite
1dff0 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74  3_vfs *pVfs, int
1e000 20 6e 42 79 74 65 2c 20 63 68 61 72 20 2a 7a 45   nByte, char *zE
1e010 72 72 4d 73 67 29 7b 0a 20 20 73 71 6c 69 74 65  rrMsg){.  sqlite
1e020 33 5f 76 66 73 20 2a 70 52 65 61 6c 56 66 73 20  3_vfs *pRealVfs 
1e030 3d 20 28 28 72 62 75 5f 76 66 73 2a 29 70 56 66  = ((rbu_vfs*)pVf
1e040 73 29 2d 3e 70 52 65 61 6c 56 66 73 3b 0a 20 20  s)->pRealVfs;.  
1e050 70 52 65 61 6c 56 66 73 2d 3e 78 44 6c 45 72 72  pRealVfs->xDlErr
1e060 6f 72 28 70 52 65 61 6c 56 66 73 2c 20 6e 42 79  or(pRealVfs, nBy
1e070 74 65 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 7d 0a  te, zErrMsg);.}.
1e080 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
1e090 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73  pointer to the s
1e0a0 79 6d 62 6f 6c 20 7a 53 79 6d 62 6f 6c 20 69 6e  ymbol zSymbol in
1e0b0 20 74 68 65 20 64 79 6e 61 6d 69 63 20 6c 69 62   the dynamic lib
1e0c0 72 61 72 79 20 70 48 61 6e 64 6c 65 2e 0a 2a 2f  rary pHandle..*/
1e0d0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 28 2a 72  .static void (*r
1e0e0 62 75 56 66 73 44 6c 53 79 6d 28 0a 20 20 73 71  buVfsDlSym(.  sq
1e0f0 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
1e100 20 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 2c 20   .  void *pArg, 
1e110 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1e120 53 79 6d 0a 29 29 28 76 6f 69 64 29 7b 0a 20 20  Sym.))(void){.  
1e130 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 52 65  sqlite3_vfs *pRe
1e140 61 6c 56 66 73 20 3d 20 28 28 72 62 75 5f 76 66  alVfs = ((rbu_vf
1e150 73 2a 29 70 56 66 73 29 2d 3e 70 52 65 61 6c 56  s*)pVfs)->pRealV
1e160 66 73 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65  fs;.  return pRe
1e170 61 6c 56 66 73 2d 3e 78 44 6c 53 79 6d 28 70 52  alVfs->xDlSym(pR
1e180 65 61 6c 56 66 73 2c 20 70 41 72 67 2c 20 7a 53  ealVfs, pArg, zS
1e190 79 6d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  ym);.}../*.** Cl
1e1a0 6f 73 65 20 74 68 65 20 64 79 6e 61 6d 69 63 20  ose the dynamic 
1e1b0 6c 69 62 72 61 72 79 20 68 61 6e 64 6c 65 20 70  library handle p
1e1c0 48 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  Handle..*/.stati
1e1d0 63 20 76 6f 69 64 20 72 62 75 56 66 73 44 6c 43  c void rbuVfsDlC
1e1e0 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 76 66 73  lose(sqlite3_vfs
1e1f0 20 2a 70 56 66 73 2c 20 76 6f 69 64 20 2a 70 48   *pVfs, void *pH
1e200 61 6e 64 6c 65 29 7b 0a 20 20 73 71 6c 69 74 65  andle){.  sqlite
1e210 33 5f 76 66 73 20 2a 70 52 65 61 6c 56 66 73 20  3_vfs *pRealVfs 
1e220 3d 20 28 28 72 62 75 5f 76 66 73 2a 29 70 56 66  = ((rbu_vfs*)pVf
1e230 73 29 2d 3e 70 52 65 61 6c 56 66 73 3b 0a 20 20  s)->pRealVfs;.  
1e240 70 52 65 61 6c 56 66 73 2d 3e 78 44 6c 43 6c 6f  pRealVfs->xDlClo
1e250 73 65 28 70 52 65 61 6c 56 66 73 2c 20 70 48 61  se(pRealVfs, pHa
1e260 6e 64 6c 65 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  ndle);.}.#endif 
1e270 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  /* SQLITE_OMIT_L
1e280 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 20 2a 2f  OAD_EXTENSION */
1e290 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 75 6c 61 74 65  ../*.** Populate
1e2a0 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e   the buffer poin
1e2b0 74 65 64 20 74 6f 20 62 79 20 7a 42 75 66 4f 75  ted to by zBufOu
1e2c0 74 20 77 69 74 68 20 6e 42 79 74 65 20 62 79 74  t with nByte byt
1e2d0 65 73 20 6f 66 20 0a 2a 2a 20 72 61 6e 64 6f 6d  es of .** random
1e2e0 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63   data..*/.static
1e2f0 20 69 6e 74 20 72 62 75 56 66 73 52 61 6e 64 6f   int rbuVfsRando
1e300 6d 6e 65 73 73 28 73 71 6c 69 74 65 33 5f 76 66  mness(sqlite3_vf
1e310 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 79  s *pVfs, int nBy
1e320 74 65 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f 75  te, char *zBufOu
1e330 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  t){.  sqlite3_vf
1e340 73 20 2a 70 52 65 61 6c 56 66 73 20 3d 20 28 28  s *pRealVfs = ((
1e350 72 62 75 5f 76 66 73 2a 29 70 56 66 73 29 2d 3e  rbu_vfs*)pVfs)->
1e360 70 52 65 61 6c 56 66 73 3b 0a 20 20 72 65 74 75  pRealVfs;.  retu
1e370 72 6e 20 70 52 65 61 6c 56 66 73 2d 3e 78 52 61  rn pRealVfs->xRa
1e380 6e 64 6f 6d 6e 65 73 73 28 70 52 65 61 6c 56 66  ndomness(pRealVf
1e390 73 2c 20 6e 42 79 74 65 2c 20 7a 42 75 66 4f 75  s, nByte, zBufOu
1e3a0 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65  t);.}../*.** Sle
1e3b0 65 70 20 66 6f 72 20 6e 4d 69 63 72 6f 20 6d 69  ep for nMicro mi
1e3c0 63 72 6f 73 65 63 6f 6e 64 73 2e 20 52 65 74 75  croseconds. Retu
1e3d0 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
1e3e0 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 0a 2a   microseconds .*
1e3f0 2a 20 61 63 74 75 61 6c 6c 79 20 73 6c 65 70 74  * actually slept
1e400 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1e410 72 62 75 56 66 73 53 6c 65 65 70 28 73 71 6c 69  rbuVfsSleep(sqli
1e420 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69  te3_vfs *pVfs, i
1e430 6e 74 20 6e 4d 69 63 72 6f 29 7b 0a 20 20 73 71  nt nMicro){.  sq
1e440 6c 69 74 65 33 5f 76 66 73 20 2a 70 52 65 61 6c  lite3_vfs *pReal
1e450 56 66 73 20 3d 20 28 28 72 62 75 5f 76 66 73 2a  Vfs = ((rbu_vfs*
1e460 29 70 56 66 73 29 2d 3e 70 52 65 61 6c 56 66 73  )pVfs)->pRealVfs
1e470 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65 61 6c  ;.  return pReal
1e480 56 66 73 2d 3e 78 53 6c 65 65 70 28 70 52 65 61  Vfs->xSleep(pRea
1e490 6c 56 66 73 2c 20 6e 4d 69 63 72 6f 29 3b 0a 7d  lVfs, nMicro);.}
1e4a0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1e4b0 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20  he current time 
1e4c0 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20  as a Julian Day 
1e4d0 6e 75 6d 62 65 72 20 69 6e 20 2a 70 54 69 6d 65  number in *pTime
1e4e0 4f 75 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  Out..*/.static i
1e4f0 6e 74 20 72 62 75 56 66 73 43 75 72 72 65 6e 74  nt rbuVfsCurrent
1e500 54 69 6d 65 28 73 71 6c 69 74 65 33 5f 76 66 73  Time(sqlite3_vfs
1e510 20 2a 70 56 66 73 2c 20 64 6f 75 62 6c 65 20 2a   *pVfs, double *
1e520 70 54 69 6d 65 4f 75 74 29 7b 0a 20 20 73 71 6c  pTimeOut){.  sql
1e530 69 74 65 33 5f 76 66 73 20 2a 70 52 65 61 6c 56  ite3_vfs *pRealV
1e540 66 73 20 3d 20 28 28 72 62 75 5f 76 66 73 2a 29  fs = ((rbu_vfs*)
1e550 70 56 66 73 29 2d 3e 70 52 65 61 6c 56 66 73 3b  pVfs)->pRealVfs;
1e560 0a 20 20 72 65 74 75 72 6e 20 70 52 65 61 6c 56  .  return pRealV
1e570 66 73 2d 3e 78 43 75 72 72 65 6e 74 54 69 6d 65  fs->xCurrentTime
1e580 28 70 52 65 61 6c 56 66 73 2c 20 70 54 69 6d 65  (pRealVfs, pTime
1e590 4f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e  Out);.}../*.** N
1e5a0 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
1e5b0 69 6e 74 20 72 62 75 56 66 73 47 65 74 4c 61 73  int rbuVfsGetLas
1e5c0 74 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76  tError(sqlite3_v
1e5d0 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 61 2c  fs *pVfs, int a,
1e5e0 20 63 68 61 72 20 2a 62 29 7b 0a 20 20 72 65 74   char *b){.  ret
1e5f0 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
1e600 44 65 72 65 67 69 73 74 65 72 20 61 6e 64 20 64  Deregister and d
1e610 65 73 74 72 6f 79 20 61 6e 20 52 42 55 20 76 66  estroy an RBU vf
1e620 73 20 63 72 65 61 74 65 64 20 62 79 20 61 6e 20  s created by an 
1e630 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 0a  earlier call to.
1e640 2a 2a 20 73 71 6c 69 74 65 33 72 62 75 5f 63 72  ** sqlite3rbu_cr
1e650 65 61 74 65 5f 76 66 73 28 29 2e 0a 2a 2f 0a 76  eate_vfs()..*/.v
1e660 6f 69 64 20 73 71 6c 69 74 65 33 72 62 75 5f 64  oid sqlite3rbu_d
1e670 65 73 74 72 6f 79 5f 76 66 73 28 63 6f 6e 73 74  estroy_vfs(const
1e680 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20   char *zName){. 
1e690 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
1e6a0 66 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73  fs = sqlite3_vfs
1e6b0 5f 66 69 6e 64 28 7a 4e 61 6d 65 29 3b 0a 20 20  _find(zName);.  
1e6c0 69 66 28 20 70 56 66 73 20 26 26 20 70 56 66 73  if( pVfs && pVfs
1e6d0 2d 3e 78 4f 70 65 6e 3d 3d 72 62 75 56 66 73 4f  ->xOpen==rbuVfsO
1e6e0 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  pen ){.    sqlit
1e6f0 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 28 28  e3_mutex_free(((
1e700 72 62 75 5f 76 66 73 2a 29 70 56 66 73 29 2d 3e  rbu_vfs*)pVfs)->
1e710 6d 75 74 65 78 29 3b 0a 20 20 20 20 73 71 6c 69  mutex);.    sqli
1e720 74 65 33 5f 76 66 73 5f 75 6e 72 65 67 69 73 74  te3_vfs_unregist
1e730 65 72 28 70 56 66 73 29 3b 0a 20 20 20 20 73 71  er(pVfs);.    sq
1e740 6c 69 74 65 33 5f 66 72 65 65 28 70 56 66 73 29  lite3_free(pVfs)
1e750 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
1e760 72 65 61 74 65 20 61 6e 20 52 42 55 20 56 46 53  reate an RBU VFS
1e770 20 6e 61 6d 65 64 20 7a 4e 61 6d 65 20 74 68 61   named zName tha
1e780 74 20 61 63 63 65 73 73 65 73 20 74 68 65 20 75  t accesses the u
1e790 6e 64 65 72 6c 79 69 6e 67 20 66 69 6c 65 2d 73  nderlying file-s
1e7a0 79 73 74 65 6d 0a 2a 2a 20 76 69 61 20 65 78 69  ystem.** via exi
1e7b0 73 74 69 6e 67 20 56 46 53 20 7a 50 61 72 65 6e  sting VFS zParen
1e7c0 74 2e 20 54 68 65 20 6e 65 77 20 6f 62 6a 65 63  t. The new objec
1e7d0 74 20 69 73 20 72 65 67 69 73 74 65 72 65 64 20  t is registered 
1e7e0 61 73 20 61 20 6e 6f 6e 2d 64 65 66 61 75 6c 74  as a non-default
1e7f0 0a 2a 2a 20 56 46 53 20 77 69 74 68 20 53 51 4c  .** VFS with SQL
1e800 69 74 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  ite before retur
1e810 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ning..*/.int sql
1e820 69 74 65 33 72 62 75 5f 63 72 65 61 74 65 5f 76  ite3rbu_create_v
1e830 66 73 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  fs(const char *z
1e840 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  Name, const char
1e850 20 2a 7a 50 61 72 65 6e 74 29 7b 0a 0a 20 20 2f   *zParent){..  /
1e860 2a 20 54 65 6d 70 6c 61 74 65 20 66 6f 72 20 56  * Template for V
1e870 46 53 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 73  FS */.  static s
1e880 71 6c 69 74 65 33 5f 76 66 73 20 76 66 73 5f 74  qlite3_vfs vfs_t
1e890 65 6d 70 6c 61 74 65 20 3d 20 7b 0a 20 20 20 20  emplate = {.    
1e8a0 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1,              
1e8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e8c0 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 20   iVersion */.   
1e8d0 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
1e8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e8f0 2a 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 0a 20 20  * szOsFile */.  
1e900 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
1e910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e920 2f 2a 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a 2f  /* mxPathname */
1e930 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20  .    0,         
1e940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e950 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a 20     /* pNext */. 
1e960 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20     0,           
1e970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e980 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 20   /* zName */.   
1e990 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
1e9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e9b0 2a 20 70 41 70 70 44 61 74 61 20 2a 2f 0a 20 20  * pAppData */.  
1e9c0 20 20 72 62 75 56 66 73 4f 70 65 6e 2c 20 20 20    rbuVfsOpen,   
1e9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e9e0 2f 2a 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 20 20  /* xOpen */.    
1e9f0 72 62 75 56 66 73 44 65 6c 65 74 65 2c 20 20 20  rbuVfsDelete,   
1ea00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ea10 20 78 44 65 6c 65 74 65 20 2a 2f 0a 20 20 20 20   xDelete */.    
1ea20 72 62 75 56 66 73 41 63 63 65 73 73 2c 20 20 20  rbuVfsAccess,   
1ea30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ea40 20 78 41 63 63 65 73 73 20 2a 2f 0a 20 20 20 20   xAccess */.    
1ea50 72 62 75 56 66 73 46 75 6c 6c 50 61 74 68 6e 61  rbuVfsFullPathna
1ea60 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  me,           /*
1ea70 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 2a   xFullPathname *
1ea80 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
1ea90 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45  E_OMIT_LOAD_EXTE
1eaa0 4e 53 49 4f 4e 0a 20 20 20 20 72 62 75 56 66 73  NSION.    rbuVfs
1eab0 44 6c 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20  DlOpen,         
1eac0 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 4f 70          /* xDlOp
1ead0 65 6e 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73  en */.    rbuVfs
1eae0 44 6c 45 72 72 6f 72 2c 20 20 20 20 20 20 20 20  DlError,        
1eaf0 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 45 72          /* xDlEr
1eb00 72 6f 72 20 2a 2f 0a 20 20 20 20 72 62 75 56 66  ror */.    rbuVf
1eb10 73 44 6c 53 79 6d 2c 20 20 20 20 20 20 20 20 20  sDlSym,         
1eb20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 53           /* xDlS
1eb30 79 6d 20 2a 2f 0a 20 20 20 20 72 62 75 56 66 73  ym */.    rbuVfs
1eb40 44 6c 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  DlClose,        
1eb50 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c          /* xDlCl
1eb60 6f 73 65 20 2a 2f 0a 23 65 6c 73 65 0a 20 20 20  ose */.#else.   
1eb70 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 23 65 6e   0, 0, 0, 0,.#en
1eb80 64 69 66 0a 0a 20 20 20 20 72 62 75 56 66 73 52  dif..    rbuVfsR
1eb90 61 6e 64 6f 6d 6e 65 73 73 2c 20 20 20 20 20 20  andomness,      
1eba0 20 20 20 20 20 20 20 2f 2a 20 78 52 61 6e 64 6f         /* xRando
1ebb0 6d 6e 65 73 73 20 2a 2f 0a 20 20 20 20 72 62 75  mness */.    rbu
1ebc0 56 66 73 53 6c 65 65 70 2c 20 20 20 20 20 20 20  VfsSleep,       
1ebd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
1ebe0 6c 65 65 70 20 2a 2f 0a 20 20 20 20 72 62 75 56  leep */.    rbuV
1ebf0 66 73 43 75 72 72 65 6e 74 54 69 6d 65 2c 20 20  fsCurrentTime,  
1ec00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 75            /* xCu
1ec10 72 72 65 6e 74 54 69 6d 65 20 2a 2f 0a 20 20 20  rrentTime */.   
1ec20 20 72 62 75 56 66 73 47 65 74 4c 61 73 74 45 72   rbuVfsGetLastEr
1ec30 72 6f 72 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ror,           /
1ec40 2a 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 20  * xGetLastError 
1ec50 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20  */.    0,       
1ec60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec70 20 20 20 20 20 2f 2a 20 78 43 75 72 72 65 6e 74       /* xCurrent
1ec80 54 69 6d 65 49 6e 74 36 34 20 28 76 65 72 73 69  TimeInt64 (versi
1ec90 6f 6e 20 32 29 20 2a 2f 0a 20 20 20 20 30 2c 20  on 2) */.    0, 
1eca0 30 2c 20 30 20 20 20 20 20 20 20 20 20 20 20 20  0, 0            
1ecb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e             /* Un
1ecc0 69 6d 70 6c 65 6d 65 6e 74 65 64 20 76 65 72 73  implemented vers
1ecd0 69 6f 6e 20 33 20 6d 65 74 68 6f 64 73 20 2a 2f  ion 3 methods */
1ece0 0a 20 20 7d 3b 0a 0a 20 20 72 62 75 5f 76 66 73  .  };..  rbu_vfs
1ecf0 20 2a 70 4e 65 77 20 3d 20 30 3b 20 20 20 20 20   *pNew = 0;     
1ed00 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 6c           /* Newl
1ed10 79 20 61 6c 6c 6f 63 61 74 65 64 20 56 46 53 20  y allocated VFS 
1ed20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a  */.  int nName;.
1ed30 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1ed40 45 5f 4f 4b 3b 0a 0a 20 20 69 6e 74 20 6e 42 79  E_OK;..  int nBy
1ed50 74 65 3b 0a 20 20 6e 4e 61 6d 65 20 3d 20 73 74  te;.  nName = st
1ed60 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 6e  rlen(zName);.  n
1ed70 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 72 62  Byte = sizeof(rb
1ed80 75 5f 76 66 73 29 20 2b 20 6e 4e 61 6d 65 20 2b  u_vfs) + nName +
1ed90 20 31 3b 0a 20 20 70 4e 65 77 20 3d 20 28 72 62   1;.  pNew = (rb
1eda0 75 5f 76 66 73 2a 29 73 71 6c 69 74 65 33 5f 6d  u_vfs*)sqlite3_m
1edb0 61 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a 20 20  alloc(nByte);.  
1edc0 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
1edd0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
1ede0 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  OMEM;.  }else{. 
1edf0 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a     sqlite3_vfs *
1ee00 70 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20  pParent;        
1ee10 20 20 20 2f 2a 20 50 61 72 65 6e 74 20 56 46 53     /* Parent VFS
1ee20 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 70   */.    memset(p
1ee30 4e 65 77 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a  New, 0, nByte);.
1ee40 20 20 20 20 70 50 61 72 65 6e 74 20 3d 20 73 71      pParent = sq
1ee50 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 7a  lite3_vfs_find(z
1ee60 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 69 66 28  Parent);.    if(
1ee70 20 70 50 61 72 65 6e 74 3d 3d 30 20 29 7b 0a 20   pParent==0 ){. 
1ee80 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1ee90 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20 20 20 7d  _NOTFOUND;.    }
1eea0 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72  else{.      char
1eeb0 20 2a 7a 53 70 61 63 65 3b 0a 20 20 20 20 20 20   *zSpace;.      
1eec0 6d 65 6d 63 70 79 28 26 70 4e 65 77 2d 3e 62 61  memcpy(&pNew->ba
1eed0 73 65 2c 20 26 76 66 73 5f 74 65 6d 70 6c 61 74  se, &vfs_templat
1eee0 65 2c 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65  e, sizeof(sqlite
1eef0 33 5f 76 66 73 29 29 3b 0a 20 20 20 20 20 20 70  3_vfs));.      p
1ef00 4e 65 77 2d 3e 62 61 73 65 2e 6d 78 50 61 74 68  New->base.mxPath
1ef10 6e 61 6d 65 20 3d 20 70 50 61 72 65 6e 74 2d 3e  name = pParent->
1ef20 6d 78 50 61 74 68 6e 61 6d 65 3b 0a 20 20 20 20  mxPathname;.    
1ef30 20 20 70 4e 65 77 2d 3e 62 61 73 65 2e 73 7a 4f    pNew->base.szO
1ef40 73 46 69 6c 65 20 3d 20 73 69 7a 65 6f 66 28 72  sFile = sizeof(r
1ef50 62 75 5f 66 69 6c 65 29 20 2b 20 70 50 61 72 65  bu_file) + pPare
1ef60 6e 74 2d 3e 73 7a 4f 73 46 69 6c 65 3b 0a 20 20  nt->szOsFile;.  
1ef70 20 20 20 20 70 4e 65 77 2d 3e 70 52 65 61 6c 56      pNew->pRealV
1ef80 66 73 20 3d 20 70 50 61 72 65 6e 74 3b 0a 20 20  fs = pParent;.  
1ef90 20 20 20 20 70 4e 65 77 2d 3e 62 61 73 65 2e 7a      pNew->base.z
1efa0 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68  Name = (const ch
1efb0 61 72 2a 29 28 7a 53 70 61 63 65 20 3d 20 28 63  ar*)(zSpace = (c
1efc0 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 29 3b 0a  har*)&pNew[1]);.
1efd0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 53 70        memcpy(zSp
1efe0 61 63 65 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d  ace, zName, nNam
1eff0 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 41 6c  e);..      /* Al
1f000 6c 6f 63 61 74 65 20 74 68 65 20 6d 75 74 65 78  locate the mutex
1f010 20 61 6e 64 20 72 65 67 69 73 74 65 72 20 74 68   and register th
1f020 65 20 6e 65 77 20 56 46 53 20 28 6e 6f 74 20 61  e new VFS (not a
1f030 73 20 74 68 65 20 64 65 66 61 75 6c 74 29 20 2a  s the default) *
1f040 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6d 75  /.      pNew->mu
1f050 74 65 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75  tex = sqlite3_mu
1f060 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45  tex_alloc(SQLITE
1f070 5f 4d 55 54 45 58 5f 52 45 43 55 52 53 49 56 45  _MUTEX_RECURSIVE
1f080 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65  );.      if( pNe
1f090 77 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20  w->mutex==0 ){. 
1f0a0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1f0b0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
1f0c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
1f0d0 63 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  c = sqlite3_vfs_
1f0e0 72 65 67 69 73 74 65 72 28 26 70 4e 65 77 2d 3e  register(&pNew->
1f0f0 62 61 73 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  base, 0);.      
1f100 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  }.    }..    if(
1f110 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1f120 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
1f130 6d 75 74 65 78 5f 66 72 65 65 28 70 4e 65 77 2d  mutex_free(pNew-
1f140 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 73  >mutex);.      s
1f150 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77  qlite3_free(pNew
1f160 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
1f170 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
1f180 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f190 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f1a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
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 2f 0a 0a 23 65 6e  **********/..#en
1f1d0 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
1f1e0 53 51 4c 49 54 45 5f 43 4f 52 45 29 20 7c 7c 20  SQLITE_CORE) || 
1f1f0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
1f200 4e 41 42 4c 45 5f 52 42 55 29 20 2a 2f 0a        NABLE_RBU) */.